C424wAv9.js 660 KB

123456789
  1. var e;!function(e){e.LOAD="LOAD",e.EXEC="EXEC",e.WRITE_FILE="WRITE_FILE",e.READ_FILE="READ_FILE",e.DELETE_FILE="DELETE_FILE",e.RENAME="RENAME",e.CREATE_DIR="CREATE_DIR",e.LIST_DIR="LIST_DIR",e.DELETE_DIR="DELETE_DIR",e.ERROR="ERROR",e.DOWNLOAD="DOWNLOAD",e.PROGRESS="PROGRESS",e.LOG="LOG",e.MOUNT="MOUNT",e.UNMOUNT="UNMOUNT"}(e||(e={}));const t=(()=>{let e=0;return()=>e++})(),l=new Error("ffmpeg is not loaded, call `await ffmpeg.load()` first"),a=new Error("called FFmpeg.terminate()");var i="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{};function n(e,t,l){return e(l={path:t,exports:{},require:function(e,t){return function(){throw new Error("Dynamic requires are not currently supported by @rollup/plugin-commonjs")}(null==t&&l.path)}},l.exports),l.exports}var o=n(function(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.ERROR_INCOMPLETED_DOWNLOAD=t.ERROR_RESPONSE_BODY_READER=void 0,t.ERROR_RESPONSE_BODY_READER=new Error("failed to get response body reader"),t.ERROR_INCOMPLETED_DOWNLOAD=new Error("failed to complete download")}),c=n(function(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.HeaderContentLength=void 0,t.HeaderContentLength="Content-Length"}),d=n(function(e,t){var l=i&&i.__awaiter||function(e,t,l,a){return new(l||(l=Promise))(function(i,n){function o(e){try{d(a.next(e))}catch(e){n(e)}}function c(e){try{d(a.throw(e))}catch(e){n(e)}}function d(e){var t;e.done?i(e.value):(t=e.value,t instanceof l?t:new l(function(e){e(t)})).then(o,c)}d((a=a.apply(e,t||[])).next())})};Object.defineProperty(t,"__esModule",{value:!0}),t.toBlobURL=t.downloadWithProgress=t.importScript=t.fetchFile=void 0;t.fetchFile=e=>l(void 0,void 0,void 0,function*(){let t;if("string"==typeof e)t=/data:_data\/([a-zA-Z]*);base64,([^"]*)/.test(e)?atob(e.split(",")[1]).split("").map(e=>e.charCodeAt(0)):yield(yield fetch(e)).arrayBuffer();else if(e instanceof URL)t=yield(yield fetch(e)).arrayBuffer();else{if(!(e instanceof File||e instanceof Blob))return new Uint8Array;t=yield(l=e,new Promise((e,t)=>{const a=new FileReader;a.onload=()=>{const{result:t}=a;t instanceof ArrayBuffer?e(new Uint8Array(t)):e(new Uint8Array)},a.onerror=e=>{var l,a;t(Error(`File could not be read! Code=${(null===(a=null===(l=null==e?void 0:e.target)||void 0===l?void 0:l.error)||void 0===a?void 0:a.code)||-1}`))},a.readAsArrayBuffer(l)}))}var l;return new Uint8Array(t)});t.importScript=e=>l(void 0,void 0,void 0,function*(){return new Promise(t=>{const l=document.createElement("script"),a=()=>{l.removeEventListener("load",a),t()};l.src=e,l.type="text/javascript",l.addEventListener("load",a),document.getElementsByTagName("head")[0].appendChild(l)})});t.downloadWithProgress=(e,t)=>l(void 0,void 0,void 0,function*(){var l;const a=yield fetch(e);let i;try{const n=parseInt(a.headers.get(c.HeaderContentLength)||"-1"),d=null===(l=a.body)||void 0===l?void 0:l.getReader();if(!d)throw o.ERROR_RESPONSE_BODY_READER;const g=[];let s=0;for(;;){const{done:l,value:a}=yield d.read(),i=a?a.length:0;if(l){if(-1!=n&&n!==s)throw o.ERROR_INCOMPLETED_DOWNLOAD;t&&t({url:e,total:n,received:s,delta:i,done:l});break}g.push(a),s+=i,t&&t({url:e,total:n,received:s,delta:i,done:l})}const C=new Uint8Array(s);let m=0;for(const e of g)C.set(e,m),m+=e.length;i=C.buffer}catch(l){console.log("failed to send download progress event: ",l),i=yield a.arrayBuffer(),t&&t({url:e,total:i.byteLength,received:i.byteLength,delta:0,done:!0})}return i});t.toBlobURL=(e,a,i=!1,n)=>l(void 0,void 0,void 0,function*(){const l=i?yield(0,t.downloadWithProgress)(e,n):yield(yield fetch(e)).arrayBuffer(),o=new Blob([l],{type:a});return URL.createObjectURL(o)})});const g=globalThis.showSaveFilePicker;async function s(e={}){if(g&&!e._preferPolyfill)return g(e);e._name&&(console.warn("deprecated _name, spec now have `suggestedName`"),e.suggestedName=e._name);const{FileSystemFileHandle:t}=await Promise.resolve().then(function(){return k}),{FileHandle:l}=await import("./DvW5CyKG.js");return new t(new l(e.suggestedName))}globalThis.DataTransferItem&&!DataTransferItem.prototype.getAsFileSystemHandle&&(DataTransferItem.prototype.getAsFileSystemHandle=async function(){const e=this.webkitGetAsEntry(),[{FileHandle:t,FolderHandle:l},{FileSystemDirectoryHandle:a},{FileSystemFileHandle:i}]=await Promise.all([import("./BTDmh4oN.js"),Promise.resolve().then(function(){return p}),Promise.resolve().then(function(){return k})]);return e.isFile?new i(new t(e,!1)):new a(new l(e,!1))});const C={WritableStream:globalThis.WritableStream,TransformStream:globalThis.TransformStream,DOMException:globalThis.DOMException,Blob:globalThis.Blob},{WritableStream:m}=C;class h extends m{#e;constructor(e){super(e),this.#e=e,Object.setPrototypeOf(this,h.prototype),this._closed=!1}async close(){this._closed=!0;const e=this.getWriter(),t=e.close();return e.releaseLock(),t}seek(e){return this.write({type:"seek",position:e})}truncate(e){return this.write({type:"truncate",size:e})}write(e){if(this._closed)return Promise.reject(new TypeError("Cannot write to a CLOSED writable stream"));const t=this.getWriter(),l=t.write(e);return t.releaseLock(),l}}Object.defineProperty(h.prototype,Symbol.toStringTag,{value:"FileSystemWritableFileStream",writable:!1,enumerable:!1,configurable:!0}),Object.defineProperties(h.prototype,{close:{enumerable:!0},seek:{enumerable:!0},truncate:{enumerable:!0},write:{enumerable:!0}}),!globalThis.FileSystemFileHandle||globalThis.FileSystemFileHandle.prototype.createWritable||globalThis.FileSystemWritableFileStream||(globalThis.FileSystemWritableFileStream=h);const r=Symbol("adapter");class Z{[r];name;kind;constructor(e){this.kind=e.kind,this.name=e.name,this[r]=e}async queryPermission(e={}){const{mode:t="read"}=e,l=this[r];if(l.queryPermission)return l.queryPermission({mode:t});if("read"===t)return"granted";if("readwrite"===t)return l.writable?"granted":"denied";throw new TypeError(`Mode ${t} must be 'read' or 'readwrite'`)}async requestPermission({mode:e="read"}={}){const t=this[r];if(t.requestPermission)return t.requestPermission({mode:e});if("read"===e)return"granted";if("readwrite"===e)return t.writable?"granted":"denied";throw new TypeError(`Mode ${e} must be 'read' or 'readwrite'`)}async remove(e={}){await this[r].remove(e)}async isSameEntry(e){return this===e||!(!e||"object"!=typeof e||this.kind!==e.kind||!e[r])&&this[r].isSameEntry(e[r])}}Object.defineProperty(Z.prototype,Symbol.toStringTag,{value:"FileSystemHandle",writable:!1,enumerable:!1,configurable:!0}),globalThis.FileSystemHandle&&(globalThis.FileSystemHandle.prototype.queryPermission??=function(e){return"granted"});const I={INVALID:["seeking position failed.","InvalidStateError"],GONE:["A requested file or directory could not be found at the time an operation was processed.","NotFoundError"],MOD_ERR:["The object can not be modified in this way.","InvalidModificationError"],SYNTAX:e=>[`Failed to execute 'write' on 'UnderlyingSinkBase': Invalid params passed. ${e}`,"SyntaxError"],DISALLOWED:["The request is not allowed by the user agent or the platform in the current context.","NotAllowedError"]},{GONE:J,MOD_ERR:u}=I,b=Symbol("adapter");let G=class e extends Z{[b];constructor(e){super(e),this[b]=e}async getDirectoryHandle(t,l={}){if(""===t)throw new TypeError("Name can't be an empty string.");if("."===t||".."===t||t.includes("/"))throw new TypeError("Name contains invalid characters.");l.create=!!l.create;const a=await this[b].getDirectoryHandle(t,l);return new e(a)}async*entries(){const{FileSystemFileHandle:t}=await Promise.resolve().then(function(){return k});for await(const[l,a]of this[b].entries())yield[a.name,"file"===a.kind?new t(a):new e(a)]}async*getEntries(){const{FileSystemFileHandle:t}=await Promise.resolve().then(function(){return k});console.warn("deprecated, use .entries() instead");for await(let l of this[b].entries())yield"file"===l.kind?new t(l):new e(l)}async getFileHandle(e,t={}){const{FileSystemFileHandle:l}=await Promise.resolve().then(function(){return k});if(""===e)throw new TypeError("Name can't be an empty string.");if("."===e||".."===e||e.includes("/"))throw new TypeError("Name contains invalid characters.");t.create=!!t.create;return new l(await this[b].getFileHandle(e,t))}async removeEntry(e,t={}){if(""===e)throw new TypeError("Name can't be an empty string.");if("."===e||".."===e||e.includes("/"))throw new TypeError("Name contains invalid characters.");return t.recursive=!!t.recursive,this[b].removeEntry(e,t)}async resolve(e){if(await e.isSameEntry(this))return[];const t=[{handle:this,path:[]}];for(;t.length;){let{handle:l,path:a}=t.pop();for await(const i of l.values()){if(await i.isSameEntry(e))return[...a,i.name];"directory"===i.kind&&t.push({handle:i,path:[...a,i.name]})}}return null}async*keys(){for await(const[e]of this[b].entries())yield e}async*values(){for await(const[e,t]of this)yield t}[Symbol.asyncIterator](){return this.entries()}};if(Object.defineProperty(G.prototype,Symbol.toStringTag,{value:"FileSystemDirectoryHandle",writable:!1,enumerable:!1,configurable:!0}),Object.defineProperties(G.prototype,{getDirectoryHandle:{enumerable:!0},entries:{enumerable:!0},getFileHandle:{enumerable:!0},removeEntry:{enumerable:!0}}),globalThis.FileSystemDirectoryHandle){const E=globalThis.FileSystemDirectoryHandle.prototype;async function O(e){const t=await navigator.storage.getDirectory();if(null===await t.resolve(e))throw new DOMException(...J)}E.resolve=async function(e){if(await e.isSameEntry(this))return[];const t=[{handle:this,path:[]}];for(;t.length;){let{handle:l,path:a}=t.pop();for await(const i of l.values()){if(await i.isSameEntry(e))return[...a,i.name];"directory"===i.kind&&t.push({handle:i,path:[...a,i.name]})}}return null};const x=E.entries;E.entries=async function*(){await O(this),yield*x.call(this)},E[Symbol.asyncIterator]=async function*(){yield*this.entries()};const P=E.removeEntry;E.removeEntry=async function(e,t={}){return P.call(this,e,t).catch(async e=>{if(e instanceof DOMException&&"UnknownError"===e.name&&!t.recursive){if(!(await x.call(this).next()).done)throw new DOMException(...u)}throw e})}}var p=Object.freeze({__proto__:null,FileSystemDirectoryHandle:G,default:G});const{INVALID:y,SYNTAX:W,GONE:X}=I,V=Symbol("adapter");class R extends Z{[V];constructor(e){super(e),this[V]=e}async createWritable(e={}){return new h(await this[V].createWritable(e))}async getFile(){return this[V].getFile()}}if(Object.defineProperty(R.prototype,Symbol.toStringTag,{value:"FileSystemFileHandle",writable:!1,enumerable:!1,configurable:!0}),Object.defineProperties(R.prototype,{createWritable:{enumerable:!0},getFile:{enumerable:!0}}),globalThis.FileSystemFileHandle&&!globalThis.FileSystemFileHandle.prototype.createWritable){const j=new WeakMap;let q;const $=()=>{let e,t;onmessage=async l=>{const a=l.ports[0],i=l.data;switch(i.type){case"open":const l=i.name;let a=await navigator.storage.getDirectory();for(const e of i.path)a=await a.getDirectoryHandle(e);e=await a.getFileHandle(l),t=await e.createSyncAccessHandle();break;case"write":t.write(i.data,{at:i.position}),t.flush();break;case"truncate":t.truncate(i.size);break;case"abort":case"close":t.close()}a.postMessage(0)}};globalThis.FileSystemFileHandle.prototype.createWritable=async function(e){if(!q){const e=`(${$.toString()})()`,t=new Blob([e],{type:"text/javascript"});q=URL.createObjectURL(t)}const t=new Worker(q,{type:"module"});let l=0;const a=new TextEncoder;let i=await this.getFile().then(e=>e.size);const n=e=>new Promise((l,a)=>{const i=new MessageChannel;i.port1.onmessage=e=>{e.data instanceof Error?a(e.data):l(e.data),i.port1.close(),i.port2.close(),i.port1.onmessage=null},t.postMessage(e,[i.port2])}),o=await navigator.storage.getDirectory(),c=await j.get(this),d=await o.resolve(c);if(null===d)throw new DOMException(...X);await n({type:"open",path:d,name:this.name}),!1===e?.keepExistingData&&(await n({type:"truncate",size:0}),i=0);return new h({start:e=>{},async write(e){if("write"===(e=e?.constructor===Object?{...e}:{type:"write",data:e,position:l}).type){if(!("data"in e))throw await n({type:"close"}),new DOMException(...W("write requires a data argument"));if(e.position??=l,"string"==typeof e.data)e.data=a.encode(e.data);else if(e.data instanceof ArrayBuffer)e.data=new Uint8Array(e.data);else if(e.data instanceof Uint8Array||!ArrayBuffer.isView(e.data)){if(!(e.data instanceof Uint8Array)){const t=await new Response(e.data).arrayBuffer();e.data=new Uint8Array(t)}}else e.data=new Uint8Array(e.data.buffer,e.data.byteOffset,e.data.byteLength);Number.isInteger(e.position)&&e.position>=0&&(l=e.position),l+=e.data.byteLength,i+=e.data.byteLength}else{if("seek"===e.type){if(Number.isInteger(e.position)&&e.position>=0){if(i<e.position)throw new DOMException(...y);return console.log("seeking",e),void(l=e.position)}throw await n({type:"close"}),new DOMException(...W("seek requires a position argument"))}if("truncate"===e.type){if(!(Number.isInteger(e.size)&&e.size>=0))throw await n({type:"close"}),new DOMException(...W("truncate requires a size argument"));i=e.size,l>i&&(l=i)}}await n(e)},async close(){await n({type:"close"}),t.terminate()},async abort(e){await n({type:"abort",reason:e}),t.terminate()}})};const ee=FileSystemDirectoryHandle.prototype.getFileHandle;FileSystemDirectoryHandle.prototype.getFileHandle=async function(...e){const t=await ee.call(this,...e);return j.set(t,this),t}}var k=Object.freeze({__proto__:null,FileSystemFileHandle:R,default:R});function B(e){function t(e){return e<10?"0"+e:e}return`${e.getFullYear()}${t(e.getMonth()+1)}${t(e.getDate())}${t(e.getHours())}${t(e.getMinutes())}${t(e.getSeconds())}${e.getMilliseconds()}`}async function S(e,t){const l={suggestedName:t,types:[{"image/png":["png"]}]},a=await s(l),i=await a.createWritable();i.write(e),i.close()}function Y(e,t,l={}){let a,i,n=!1,o=0,c=0,d=1,g=0,s=0,C=0,m=0;t&&(t.style.transformOrigin="top left");const h=l.minScale||e.offsetWidth/t.offsetWidth,r=l.maxScale||3,Z=l.dragSpeed||.2,I=!1!==l.enableZoom,J=!1!==l.enableDrag;function u(){n=!1}function b(e,t){const l=t.getBoundingClientRect(),a=function(e){const t=window.getComputedStyle(e).transform;if("none"===t)return{scaleX:1,scaleY:1};const l=new DOMMatrix(t);return{scaleX:l.a,scaleY:l.d}}(t);return{x:(e.clientX-l.left)*a.scaleX,y:(e.clientY-l.top)*a.scaleY}}function G(){t.style.transform=`translate(${g}px, ${s}px) scale(${d})`}function p(){const l=t.getBoundingClientRect(),a=e.getBoundingClientRect(),i=e.offsetWidth/a.width,n=e.offsetHeight/a.height;let o=(l.left-a.left)*i,c=(l.top-a.top)*n;const d=l.width*i,C=l.height*n,m=e.offsetWidth,h=e.offsetHeight;d<m?o=(m-d)/2:(o>0&&(o=0),o+d<m&&(o=m-d)),C<h?c=(h-C)/2:(c>0&&(c=0),c+C<h&&(c=h-C)),g=o,s=c,G()}return I&&e.addEventListener("wheel",function(t){t.preventDefault();const l=b(t,e),a=-.1*Math.sign(t.deltaY),i=Math.min(Math.max(d+a,h),r),n=(l.x-g)*(i/d-1),o=(l.y-s)*(i/d-1);d=i,g-=n,s-=o,G(),p()}),J&&(t.addEventListener("mousedown",function(l){n=!0;const d=b(l,e);a=d.x,i=d.y;const g=t.style.transform.match(/translate\(([^)]+)\)/);[o,c]=g?g[1].split(",").map(parseFloat):[0,0]}),document.addEventListener("mousemove",function(t){if(n){const l=b(t,e),d=(l.x-a)*Z,h=(l.y-i)*Z;C=o+d,m=c+h,function(){if(!n)return;g=C,s=m,G(),p()}()}}),document.addEventListener("mouseleave",u),document.addEventListener("mouseup",u)),()=>{n=!1,a=0,i=0,o=0,c=0,d=1,g=0,s=0,C=0,m=0}}class A{constructor(e,t={}){this.options=Object.assign({streamName:"未命名流",fps:25,scale:.8,bitrate:2e6,containerFormat:"mp4"},t),this.videoElement=e,this.isRecording=!1,this.recordingStartTime=0,this.lastFrameTime=0,this.frameCount=0,this.droppedFrameCount=0,this.currentFps=this.options.fps,this.mediaRecorder=null,this.recordedChunks=[],this.canvas=null,this.ctx=null,this.animationFrameId=null,this.dataBuffer=[],this.forceKeyFrame=!0,this.minRecordingTime=2e3,this.log=e=>{(new Date).toLocaleTimeString(),function(e){const t=new Date,l=`[${t.getHours().toString().padStart(2,"0")}:${t.getMinutes().toString().padStart(2,"0")}:${t.getSeconds().toString().padStart(2,"0")}]`;console.info(l+e+"\n")}(`[${this.options.streamName}] ${e}`)},this._createCanvas(),this.log(`录像器初始化完成 (${this.options.fps}FPS, 缩放${this.options.scale})`)}_createCanvas(){this.canvas&&document.body.removeChild(this.canvas),this.canvas=document.createElement("canvas"),this.canvas.style.display="none",document.body.appendChild(this.canvas),this.canvas.width=this.videoElement.videoWidth*this.options.scale,this.canvas.height=this.videoElement.videoHeight*this.options.scale,this.ctx=this.canvas.getContext("2d"),this.log(`创建录制画布: ${this.canvas.width}x${this.canvas.height}`)}_getSupportedMimeType(){const e=["video/mp4;codecs=avc1.640028","video/webm;codecs=vp9","video/webm;codecs=vp8","video/webm"];"mp4"===this.options.containerFormat&&e.unshift("video/mp4;codecs=avc1.42E01E");for(let t of e)if(MediaRecorder.isTypeSupported(t))return this.log(`使用编码格式: ${t}`),t;return this.log("错误: 没有找到支持的编码格式","error"),null}_ensureKeyFrame(){if(this.mediaRecorder)try{this.ctx.drawImage(this.videoElement,0,0,this.canvas.width,this.canvas.height),this.mediaRecorder.pause(),this.mediaRecorder.resume(),this.forceKeyFrame=!1,this.log("已插入关键帧")}catch(e){this.log(`插入关键帧失败: ${e.message}`)}}startRecording(){if(this.isRecording)return this.log("录像已经在进行中"),!1;if(!this.videoElement.videoWidth)return this.log("错误: 视频未准备好"),!1;this.canvas.width===this.videoElement.videoWidth*this.options.scale&&this.canvas.height===this.videoElement.videoHeight*this.options.scale||this._createCanvas(),this.isRecording=!0,this.recordedChunks=[],this.dataBuffer=[],this.recordingStartTime=Date.now(),this.lastFrameTime=0,this.frameCount=0,this.droppedFrameCount=0,this.currentFps=this.options.fps,this.forceKeyFrame=!0;const e=this.canvas.captureStream(this.options.fps),t=this._getSupportedMimeType();if(!t)return!1;const l={mimeType:t,videoBitsPerSecond:this.options.bitrate};try{return this.mediaRecorder=new MediaRecorder(e,l),this.mediaRecorder.ondataavailable=e=>{e.data&&e.data.size>0&&(this.dataBuffer.push(e.data),this.log(`收到数据块: ${(e.data.size/1024).toFixed(1)}KB`),this._processDataBuffer())},this.mediaRecorder.onstop=()=>{const e=Date.now()-this.recordingStartTime;setTimeout(()=>{this._processDataBuffer(!0),this.isRecording=!1,this.log("录制已停止,准备下载"),this.downloadRecording(),e<3e3&&this._validateRecording()},e<3e3?1e3:500)},this.mediaRecorder.onerror=e=>{this.log(`录制错误: ${e}`,"error")},this.mediaRecorder.start(2e3),this._captureFrame(),this.log(`开始录制,目标帧率: ${this.options.fps}FPS`),!0}catch(e){return this.log(`创建MediaRecorder失败: ${e.message}`,"error"),!1}}_validateRecording(){if(0===this.recordedChunks.length)return void this.log("警告: 录制数据为空");const e=this.recordedChunks.reduce((e,t)=>e+t.size,0),t=Date.now()-this.recordingStartTime;e<1024&&this.log("警告: 录制文件过小,可能不完整"),t<1e3&&this.log("警告: 录制时间过短,视频可能无法播放")}_processDataBuffer(e=!1){this.dataBuffer.length>0&&(this.recordedChunks=this.recordedChunks.concat(this.dataBuffer),this.dataBuffer=[],this.log(`已处理缓冲数据,总数据块: ${this.recordedChunks.length}`)),e&&0===this.dataBuffer.length&&this.log("所有缓冲数据已处理完成")}_captureFrame(){if(!this.isRecording)return;const e=performance.now();this.lastFrameTime||(this.lastFrameTime=e);const t=e-this.lastFrameTime,l=1e3/this.currentFps;if(t>l)try{this.ctx.drawImage(this.videoElement,0,0,this.canvas.width,this.canvas.height),this.forceKeyFrame&&this._ensureKeyFrame(),t>1.5*l&&this.currentFps>15?(this.currentFps=Math.max(15,this.currentFps-2),this.log(`系统负载高,降低帧率至 ${this.currentFps} FPS`,"warning")):this.currentFps<this.options.fps&&t<.8*l&&(this.currentFps=Math.min(this.options.fps,this.currentFps+1),this.log(`系统性能良好,提高帧率至 ${this.currentFps} FPS`)),this.lastFrameTime=e,this.frameCount++}catch(e){this.log(`帧处理错误: ${e.message}`)}else this.droppedFrameCount++;this.animationFrameId=requestAnimationFrame(()=>this._captureFrame())}stopRecording(){if(this.mediaRecorder&&this.isRecording){const e=Date.now()-this.recordingStartTime;return e<this.minRecordingTime?(this.log(`录制时间不足${this.minRecordingTime}ms,延长至最短时间`),setTimeout(()=>{this.mediaRecorder.stop(),cancelAnimationFrame(this.animationFrameId),this.log("正在停止录制...")},this.minRecordingTime-e)):(this.mediaRecorder.stop(),cancelAnimationFrame(this.animationFrameId),this.log("正在停止录制...")),!0}return!1}_enhanceShortRecording(e){return e}downloadRecording(){if(0===this.recordedChunks.length)return this.log("错误: 没有录制内容"),!1;const e="mp4"===this.options.containerFormat?"mp4":"webm";try{const t=new Blob(this.recordedChunks,{type:"mp4"===this.options.containerFormat?"video/mp4":"video/webm"});return S(t,`${B(new Date)}.${e}`),{blob:t,type:e}}catch(e){return this.log(`获取失败: ${e.message}`,"error"),!1}}getStatus(){return{isRecording:this.isRecording,streamName:this.options.streamName,fps:this.currentFps,frameCount:this.frameCount,droppedFrames:this.droppedFrameCount,duration:this.isRecording?(Date.now()-this.recordingStartTime)/1e3:0}}}var Q=n(function(e,t){window,e.exports=function(e){var t={};function l(a){if(t[a])return t[a].exports;var i=t[a]={i:a,l:!1,exports:{}};return e[a].call(i.exports,i,i.exports,l),i.l=!0,i.exports}return l.m=e,l.c=t,l.d=function(e,t,a){l.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:a})},l.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},l.t=function(e,t){if(1&t&&(e=l(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var a=Object.create(null);if(l.r(a),Object.defineProperty(a,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var i in e)l.d(a,i,function(t){return e[t]}.bind(null,i));return a},l.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return l.d(t,"a",t),t},l.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},l.p="",l(l.s=20)}([function(e,t,l){var a=l(9),i=l.n(a),n=function(){function e(){}return e.e=function(t,l){t&&!e.FORCE_GLOBAL_TAG||(t=e.GLOBAL_TAG);var a="[".concat(t,"] > ").concat(l);e.ENABLE_CALLBACK&&e.emitter.emit("log","error",a),e.ENABLE_ERROR&&(console.error?console.error(a):console.warn?console.warn(a):console.log(a))},e.i=function(t,l){t&&!e.FORCE_GLOBAL_TAG||(t=e.GLOBAL_TAG);var a="[".concat(t,"] > ").concat(l);e.ENABLE_CALLBACK&&e.emitter.emit("log","info",a),e.ENABLE_INFO&&(console.info?console.info(a):console.log(a))},e.w=function(t,l){t&&!e.FORCE_GLOBAL_TAG||(t=e.GLOBAL_TAG);var a="[".concat(t,"] > ").concat(l);e.ENABLE_CALLBACK&&e.emitter.emit("log","warn",a),e.ENABLE_WARN&&(console.warn?console.warn(a):console.log(a))},e.d=function(t,l){t&&!e.FORCE_GLOBAL_TAG||(t=e.GLOBAL_TAG);var a="[".concat(t,"] > ").concat(l);e.ENABLE_CALLBACK&&e.emitter.emit("log","debug",a),e.ENABLE_DEBUG&&(console.debug?console.debug(a):console.log(a))},e.v=function(t,l){t&&!e.FORCE_GLOBAL_TAG||(t=e.GLOBAL_TAG);var a="[".concat(t,"] > ").concat(l);e.ENABLE_CALLBACK&&e.emitter.emit("log","verbose",a),e.ENABLE_VERBOSE&&console.log(a)},e}();n.GLOBAL_TAG="mpegts.js",n.FORCE_GLOBAL_TAG=!1,n.ENABLE_ERROR=!0,n.ENABLE_INFO=!0,n.ENABLE_WARN=!0,n.ENABLE_DEBUG=!0,n.ENABLE_VERBOSE=!0,n.ENABLE_CALLBACK=!1,n.emitter=new i.a,t.a=n},function(e,t,l){var a;!function(e){e.IO_ERROR="io_error",e.DEMUX_ERROR="demux_error",e.INIT_SEGMENT="init_segment",e.MEDIA_SEGMENT="media_segment",e.LOADING_COMPLETE="loading_complete",e.RECOVERED_EARLY_EOF="recovered_early_eof",e.MEDIA_INFO="media_info",e.METADATA_ARRIVED="metadata_arrived",e.SCRIPTDATA_ARRIVED="scriptdata_arrived",e.TIMED_ID3_METADATA_ARRIVED="timed_id3_metadata_arrived",e.SYNCHRONOUS_KLV_METADATA_ARRIVED="synchronous_klv_metadata_arrived",e.ASYNCHRONOUS_KLV_METADATA_ARRIVED="asynchronous_klv_metadata_arrived",e.SMPTE2038_METADATA_ARRIVED="smpte2038_metadata_arrived",e.SCTE35_METADATA_ARRIVED="scte35_metadata_arrived",e.PES_PRIVATE_DATA_DESCRIPTOR="pes_private_data_descriptor",e.PES_PRIVATE_DATA_ARRIVED="pes_private_data_arrived",e.STATISTICS_INFO="statistics_info",e.RECOMMEND_SEEKPOINT="recommend_seekpoint"}(a||(a={})),t.a=a},function(e,t,l){l.d(t,"c",function(){return i}),l.d(t,"b",function(){return n}),l.d(t,"a",function(){return o});var a=l(3),i={kIdle:0,kConnecting:1,kBuffering:2,kError:3,kComplete:4},n={OK:"OK",EXCEPTION:"Exception",HTTP_STATUS_CODE_INVALID:"HttpStatusCodeInvalid",CONNECTING_TIMEOUT:"ConnectingTimeout",EARLY_EOF:"EarlyEof",UNRECOVERABLE_EARLY_EOF:"UnrecoverableEarlyEof"},o=function(){function e(e){this._type=e||"undefined",this._status=i.kIdle,this._needStash=!1,this._onContentLengthKnown=null,this._onURLRedirect=null,this._onDataArrival=null,this._onError=null,this._onComplete=null}return e.prototype.destroy=function(){this._status=i.kIdle,this._onContentLengthKnown=null,this._onURLRedirect=null,this._onDataArrival=null,this._onError=null,this._onComplete=null},e.prototype.isWorking=function(){return this._status===i.kConnecting||this._status===i.kBuffering},Object.defineProperty(e.prototype,"type",{get:function(){return this._type},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"status",{get:function(){return this._status},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"needStashBuffer",{get:function(){return this._needStash},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"onContentLengthKnown",{get:function(){return this._onContentLengthKnown},set:function(e){this._onContentLengthKnown=e},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"onURLRedirect",{get:function(){return this._onURLRedirect},set:function(e){this._onURLRedirect=e},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"onDataArrival",{get:function(){return this._onDataArrival},set:function(e){this._onDataArrival=e},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"onError",{get:function(){return this._onError},set:function(e){this._onError=e},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"onComplete",{get:function(){return this._onComplete},set:function(e){this._onComplete=e},enumerable:!1,configurable:!0}),e.prototype.open=function(e,t){throw new a.c("Unimplemented abstract function!")},e.prototype.abort=function(){throw new a.c("Unimplemented abstract function!")},e}()},function(e,t,l){l.d(t,"d",function(){return n}),l.d(t,"a",function(){return o}),l.d(t,"b",function(){return c}),l.d(t,"c",function(){return d});var a,i=(a=function(e,t){return(a=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var l in t)Object.prototype.hasOwnProperty.call(t,l)&&(e[l]=t[l])})(e,t)},function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");function l(){this.constructor=e}a(e,t),e.prototype=null===t?Object.create(t):(l.prototype=t.prototype,new l)}),n=function(){function e(e){this._message=e}return Object.defineProperty(e.prototype,"name",{get:function(){return"RuntimeException"},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"message",{get:function(){return this._message},enumerable:!1,configurable:!0}),e.prototype.toString=function(){return this.name+": "+this.message},e}(),o=function(e){function t(t){return e.call(this,t)||this}return i(t,e),Object.defineProperty(t.prototype,"name",{get:function(){return"IllegalStateException"},enumerable:!1,configurable:!0}),t}(n),c=function(e){function t(t){return e.call(this,t)||this}return i(t,e),Object.defineProperty(t.prototype,"name",{get:function(){return"InvalidArgumentException"},enumerable:!1,configurable:!0}),t}(n),d=function(e){function t(t){return e.call(this,t)||this}return i(t,e),Object.defineProperty(t.prototype,"name",{get:function(){return"NotImplementedException"},enumerable:!1,configurable:!0}),t}(n)},function(e,t,l){var a;!function(e){e.ERROR="error",e.LOADING_COMPLETE="loading_complete",e.RECOVERED_EARLY_EOF="recovered_early_eof",e.MEDIA_INFO="media_info",e.METADATA_ARRIVED="metadata_arrived",e.SCRIPTDATA_ARRIVED="scriptdata_arrived",e.TIMED_ID3_METADATA_ARRIVED="timed_id3_metadata_arrived",e.SYNCHRONOUS_KLV_METADATA_ARRIVED="synchronous_klv_metadata_arrived",e.ASYNCHRONOUS_KLV_METADATA_ARRIVED="asynchronous_klv_metadata_arrived",e.SMPTE2038_METADATA_ARRIVED="smpte2038_metadata_arrived",e.SCTE35_METADATA_ARRIVED="scte35_metadata_arrived",e.PES_PRIVATE_DATA_DESCRIPTOR="pes_private_data_descriptor",e.PES_PRIVATE_DATA_ARRIVED="pes_private_data_arrived",e.STATISTICS_INFO="statistics_info",e.DESTROYING="destroying"}(a||(a={})),t.a=a},function(e,t,l){var a={};!function(){var e=self.navigator.userAgent.toLowerCase(),t=/(edge)\/([\w.]+)/.exec(e)||/(opr)[\/]([\w.]+)/.exec(e)||/(chrome)[ \/]([\w.]+)/.exec(e)||/(iemobile)[\/]([\w.]+)/.exec(e)||/(version)(applewebkit)[ \/]([\w.]+).*(safari)[ \/]([\w.]+)/.exec(e)||/(webkit)[ \/]([\w.]+).*(version)[ \/]([\w.]+).*(safari)[ \/]([\w.]+)/.exec(e)||/(webkit)[ \/]([\w.]+)/.exec(e)||/(opera)(?:.*version|)[ \/]([\w.]+)/.exec(e)||/(msie) ([\w.]+)/.exec(e)||e.indexOf("trident")>=0&&/(rv)(?::| )([\w.]+)/.exec(e)||e.indexOf("compatible")<0&&/(firefox)[ \/]([\w.]+)/.exec(e)||[],l=/(ipad)/.exec(e)||/(ipod)/.exec(e)||/(windows phone)/.exec(e)||/(iphone)/.exec(e)||/(kindle)/.exec(e)||/(android)/.exec(e)||/(windows)/.exec(e)||/(mac)/.exec(e)||/(linux)/.exec(e)||/(cros)/.exec(e)||[],i={browser:t[5]||t[3]||t[1]||"",version:t[2]||t[4]||"0",majorVersion:t[4]||t[2]||"0",platform:l[0]||""},n={};if(i.browser){n[i.browser]=!0;var o=i.majorVersion.split(".");n.version={major:parseInt(i.majorVersion,10),string:i.version},o.length>1&&(n.version.minor=parseInt(o[1],10)),o.length>2&&(n.version.build=parseInt(o[2],10))}for(var c in i.platform&&(n[i.platform]=!0),(n.chrome||n.opr||n.safari)&&(n.webkit=!0),(n.rv||n.iemobile)&&(n.rv&&delete n.rv,i.browser="msie",n.msie=!0),n.edge&&(delete n.edge,i.browser="msedge",n.msedge=!0),n.opr&&(i.browser="opera",n.opera=!0),n.safari&&n.android&&(i.browser="android",n.android=!0),n.name=i.browser,n.platform=i.platform,a)a.hasOwnProperty(c)&&delete a[c];Object.assign(a,n)}(),t.a=a},function(e,t,l){t.a={OK:"OK",FORMAT_ERROR:"FormatError",FORMAT_UNSUPPORTED:"FormatUnsupported",CODEC_UNSUPPORTED:"CodecUnsupported"}},function(e,t,l){var a;!function(e){e.ERROR="error",e.SOURCE_OPEN="source_open",e.UPDATE_END="update_end",e.BUFFER_FULL="buffer_full",e.START_STREAMING="start_streaming",e.END_STREAMING="end_streaming"}(a||(a={})),t.a=a},function(e,t,l){var a=l(9),i=l.n(a),n=l(0),o=function(){function e(){}return Object.defineProperty(e,"forceGlobalTag",{get:function(){return n.a.FORCE_GLOBAL_TAG},set:function(t){n.a.FORCE_GLOBAL_TAG=t,e._notifyChange()},enumerable:!1,configurable:!0}),Object.defineProperty(e,"globalTag",{get:function(){return n.a.GLOBAL_TAG},set:function(t){n.a.GLOBAL_TAG=t,e._notifyChange()},enumerable:!1,configurable:!0}),Object.defineProperty(e,"enableAll",{get:function(){return n.a.ENABLE_VERBOSE&&n.a.ENABLE_DEBUG&&n.a.ENABLE_INFO&&n.a.ENABLE_WARN&&n.a.ENABLE_ERROR},set:function(t){n.a.ENABLE_VERBOSE=t,n.a.ENABLE_DEBUG=t,n.a.ENABLE_INFO=t,n.a.ENABLE_WARN=t,n.a.ENABLE_ERROR=t,e._notifyChange()},enumerable:!1,configurable:!0}),Object.defineProperty(e,"enableDebug",{get:function(){return n.a.ENABLE_DEBUG},set:function(t){n.a.ENABLE_DEBUG=t,e._notifyChange()},enumerable:!1,configurable:!0}),Object.defineProperty(e,"enableVerbose",{get:function(){return n.a.ENABLE_VERBOSE},set:function(t){n.a.ENABLE_VERBOSE=t,e._notifyChange()},enumerable:!1,configurable:!0}),Object.defineProperty(e,"enableInfo",{get:function(){return n.a.ENABLE_INFO},set:function(t){n.a.ENABLE_INFO=t,e._notifyChange()},enumerable:!1,configurable:!0}),Object.defineProperty(e,"enableWarn",{get:function(){return n.a.ENABLE_WARN},set:function(t){n.a.ENABLE_WARN=t,e._notifyChange()},enumerable:!1,configurable:!0}),Object.defineProperty(e,"enableError",{get:function(){return n.a.ENABLE_ERROR},set:function(t){n.a.ENABLE_ERROR=t,e._notifyChange()},enumerable:!1,configurable:!0}),e.getConfig=function(){return{globalTag:n.a.GLOBAL_TAG,forceGlobalTag:n.a.FORCE_GLOBAL_TAG,enableVerbose:n.a.ENABLE_VERBOSE,enableDebug:n.a.ENABLE_DEBUG,enableInfo:n.a.ENABLE_INFO,enableWarn:n.a.ENABLE_WARN,enableError:n.a.ENABLE_ERROR,enableCallback:n.a.ENABLE_CALLBACK}},e.applyConfig=function(e){n.a.GLOBAL_TAG=e.globalTag,n.a.FORCE_GLOBAL_TAG=e.forceGlobalTag,n.a.ENABLE_VERBOSE=e.enableVerbose,n.a.ENABLE_DEBUG=e.enableDebug,n.a.ENABLE_INFO=e.enableInfo,n.a.ENABLE_WARN=e.enableWarn,n.a.ENABLE_ERROR=e.enableError,n.a.ENABLE_CALLBACK=e.enableCallback},e._notifyChange=function(){var t=e.emitter;if(t.listenerCount("change")>0){var l=e.getConfig();t.emit("change",l)}},e.registerListener=function(t){e.emitter.addListener("change",t)},e.removeListener=function(t){e.emitter.removeListener("change",t)},e.addLogListener=function(t){n.a.emitter.addListener("log",t),n.a.emitter.listenerCount("log")>0&&(n.a.ENABLE_CALLBACK=!0,e._notifyChange())},e.removeLogListener=function(t){n.a.emitter.removeListener("log",t),0===n.a.emitter.listenerCount("log")&&(n.a.ENABLE_CALLBACK=!1,e._notifyChange())},e}();o.emitter=new i.a,t.a=o},function(e,t,l){var a,i="object"==typeof Reflect?Reflect:null,n=i&&"function"==typeof i.apply?i.apply:function(e,t,l){return Function.prototype.apply.call(e,t,l)};a=i&&"function"==typeof i.ownKeys?i.ownKeys:Object.getOwnPropertySymbols?function(e){return Object.getOwnPropertyNames(e).concat(Object.getOwnPropertySymbols(e))}:function(e){return Object.getOwnPropertyNames(e)};var o=Number.isNaN||function(e){return e!=e};function c(){c.init.call(this)}e.exports=c,e.exports.once=function(e,t){return new Promise(function(l,a){function i(l){e.removeListener(t,n),a(l)}function n(){"function"==typeof e.removeListener&&e.removeListener("error",i),l([].slice.call(arguments))}J(e,t,n,{once:!0}),"error"!==t&&function(e,t,l){"function"==typeof e.on&&J(e,"error",t,l)}(e,i,{once:!0})})},c.EventEmitter=c,c.prototype._events=void 0,c.prototype._eventsCount=0,c.prototype._maxListeners=void 0;var d=10;function g(e){if("function"!=typeof e)throw new TypeError('The "listener" argument must be of type Function. Received type '+typeof e)}function s(e){return void 0===e._maxListeners?c.defaultMaxListeners:e._maxListeners}function C(e,t,l,a){var i,n,o,c;if(g(l),void 0===(n=e._events)?(n=e._events=Object.create(null),e._eventsCount=0):(void 0!==n.newListener&&(e.emit("newListener",t,l.listener?l.listener:l),n=e._events),o=n[t]),void 0===o)o=n[t]=l,++e._eventsCount;else if("function"==typeof o?o=n[t]=a?[l,o]:[o,l]:a?o.unshift(l):o.push(l),(i=s(e))>0&&o.length>i&&!o.warned){o.warned=!0;var d=new Error("Possible EventEmitter memory leak detected. "+o.length+" "+String(t)+" listeners added. Use emitter.setMaxListeners() to increase limit");d.name="MaxListenersExceededWarning",d.emitter=e,d.type=t,d.count=o.length,c=d,console&&console.warn&&console.warn(c)}return e}function m(){if(!this.fired)return this.target.removeListener(this.type,this.wrapFn),this.fired=!0,0===arguments.length?this.listener.call(this.target):this.listener.apply(this.target,arguments)}function h(e,t,l){var a={fired:!1,wrapFn:void 0,target:e,type:t,listener:l},i=m.bind(a);return i.listener=l,a.wrapFn=i,i}function r(e,t,l){var a=e._events;if(void 0===a)return[];var i=a[t];return void 0===i?[]:"function"==typeof i?l?[i.listener||i]:[i]:l?function(e){for(var t=new Array(e.length),l=0;l<t.length;++l)t[l]=e[l].listener||e[l];return t}(i):I(i,i.length)}function Z(e){var t=this._events;if(void 0!==t){var l=t[e];if("function"==typeof l)return 1;if(void 0!==l)return l.length}return 0}function I(e,t){for(var l=new Array(t),a=0;a<t;++a)l[a]=e[a];return l}function J(e,t,l,a){if("function"==typeof e.on)a.once?e.once(t,l):e.on(t,l);else{if("function"!=typeof e.addEventListener)throw new TypeError('The "emitter" argument must be of type EventEmitter. Received type '+typeof e);e.addEventListener(t,function i(n){a.once&&e.removeEventListener(t,i),l(n)})}}Object.defineProperty(c,"defaultMaxListeners",{enumerable:!0,get:function(){return d},set:function(e){if("number"!=typeof e||e<0||o(e))throw new RangeError('The value of "defaultMaxListeners" is out of range. It must be a non-negative number. Received '+e+".");d=e}}),c.init=function(){void 0!==this._events&&this._events!==Object.getPrototypeOf(this)._events||(this._events=Object.create(null),this._eventsCount=0),this._maxListeners=this._maxListeners||void 0},c.prototype.setMaxListeners=function(e){if("number"!=typeof e||e<0||o(e))throw new RangeError('The value of "n" is out of range. It must be a non-negative number. Received '+e+".");return this._maxListeners=e,this},c.prototype.getMaxListeners=function(){return s(this)},c.prototype.emit=function(e){for(var t=[],l=1;l<arguments.length;l++)t.push(arguments[l]);var a="error"===e,i=this._events;if(void 0!==i)a=a&&void 0===i.error;else if(!a)return!1;if(a){var o;if(t.length>0&&(o=t[0]),o instanceof Error)throw o;var c=new Error("Unhandled error."+(o?" ("+o.message+")":""));throw c.context=o,c}var d=i[e];if(void 0===d)return!1;if("function"==typeof d)n(d,this,t);else{var g=d.length,s=I(d,g);for(l=0;l<g;++l)n(s[l],this,t)}return!0},c.prototype.addListener=function(e,t){return C(this,e,t,!1)},c.prototype.on=c.prototype.addListener,c.prototype.prependListener=function(e,t){return C(this,e,t,!0)},c.prototype.once=function(e,t){return g(t),this.on(e,h(this,e,t)),this},c.prototype.prependOnceListener=function(e,t){return g(t),this.prependListener(e,h(this,e,t)),this},c.prototype.removeListener=function(e,t){var l,a,i,n,o;if(g(t),void 0===(a=this._events))return this;if(void 0===(l=a[e]))return this;if(l===t||l.listener===t)0==--this._eventsCount?this._events=Object.create(null):(delete a[e],a.removeListener&&this.emit("removeListener",e,l.listener||t));else if("function"!=typeof l){for(i=-1,n=l.length-1;n>=0;n--)if(l[n]===t||l[n].listener===t){o=l[n].listener,i=n;break}if(i<0)return this;0===i?l.shift():function(e,t){for(;t+1<e.length;t++)e[t]=e[t+1];e.pop()}(l,i),1===l.length&&(a[e]=l[0]),void 0!==a.removeListener&&this.emit("removeListener",e,o||t)}return this},c.prototype.off=c.prototype.removeListener,c.prototype.removeAllListeners=function(e){var t,l,a;if(void 0===(l=this._events))return this;if(void 0===l.removeListener)return 0===arguments.length?(this._events=Object.create(null),this._eventsCount=0):void 0!==l[e]&&(0==--this._eventsCount?this._events=Object.create(null):delete l[e]),this;if(0===arguments.length){var i,n=Object.keys(l);for(a=0;a<n.length;++a)"removeListener"!==(i=n[a])&&this.removeAllListeners(i);return this.removeAllListeners("removeListener"),this._events=Object.create(null),this._eventsCount=0,this}if("function"==typeof(t=l[e]))this.removeListener(e,t);else if(void 0!==t)for(a=t.length-1;a>=0;a--)this.removeListener(e,t[a]);return this},c.prototype.listeners=function(e){return r(this,e,!0)},c.prototype.rawListeners=function(e){return r(this,e,!1)},c.listenerCount=function(e,t){return"function"==typeof e.listenerCount?e.listenerCount(t):Z.call(e,t)},c.prototype.listenerCount=Z,c.prototype.eventNames=function(){return this._eventsCount>0?a(this._events):[]}},function(e,t,l){l.d(t,"b",function(){return n}),l.d(t,"a",function(){return o});var a=l(2),i=l(6),n={NETWORK_ERROR:"NetworkError",MEDIA_ERROR:"MediaError",OTHER_ERROR:"OtherError"},o={NETWORK_EXCEPTION:a.b.EXCEPTION,NETWORK_STATUS_CODE_INVALID:a.b.HTTP_STATUS_CODE_INVALID,NETWORK_TIMEOUT:a.b.CONNECTING_TIMEOUT,NETWORK_UNRECOVERABLE_EARLY_EOF:a.b.UNRECOVERABLE_EARLY_EOF,MEDIA_MSE_ERROR:"MediaMSEError",MEDIA_FORMAT_ERROR:i.a.FORMAT_ERROR,MEDIA_FORMAT_UNSUPPORTED:i.a.FORMAT_UNSUPPORTED,MEDIA_CODEC_UNSUPPORTED:i.a.CODEC_UNSUPPORTED}},function(e,t,l){l.d(t,"d",function(){return a}),l.d(t,"b",function(){return i}),l.d(t,"a",function(){return n}),l.d(t,"c",function(){return o});var a=function(e,t,l,a,i){this.dts=e,this.pts=t,this.duration=l,this.originalDts=a,this.isSyncPoint=i,this.fileposition=null},i=function(){function e(){this.beginDts=0,this.endDts=0,this.beginPts=0,this.endPts=0,this.originalBeginDts=0,this.originalEndDts=0,this.syncPoints=[],this.firstSample=null,this.lastSample=null}return e.prototype.appendSyncPoint=function(e){e.isSyncPoint=!0,this.syncPoints.push(e)},e}(),n=function(){function e(){this._list=[]}return e.prototype.clear=function(){this._list=[]},e.prototype.appendArray=function(e){var t=this._list;0!==e.length&&(t.length>0&&e[0].originalDts<t[t.length-1].originalDts&&this.clear(),Array.prototype.push.apply(t,e))},e.prototype.getLastSyncPointBeforeDts=function(e){if(0==this._list.length)return null;var t=this._list,l=0,a=t.length-1,i=0,n=0,o=a;for(e<t[0].dts&&(l=0,n=o+1);n<=o;){if((i=n+Math.floor((o-n)/2))===a||e>=t[i].dts&&e<t[i+1].dts){l=i;break}t[i].dts<e?n=i+1:o=i-1}return this._list[l]},e}(),o=function(){function e(e){this._type=e,this._list=[],this._lastAppendLocation=-1}return Object.defineProperty(e.prototype,"type",{get:function(){return this._type},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"length",{get:function(){return this._list.length},enumerable:!1,configurable:!0}),e.prototype.isEmpty=function(){return 0===this._list.length},e.prototype.clear=function(){this._list=[],this._lastAppendLocation=-1},e.prototype._searchNearestSegmentBefore=function(e){var t=this._list;if(0===t.length)return-2;var l=t.length-1,a=0,i=0,n=l,o=0;if(e<t[0].originalBeginDts)return-1;for(;i<=n;){if((a=i+Math.floor((n-i)/2))===l||e>t[a].lastSample.originalDts&&e<t[a+1].originalBeginDts){o=a;break}t[a].originalBeginDts<e?i=a+1:n=a-1}return o},e.prototype._searchNearestSegmentAfter=function(e){return this._searchNearestSegmentBefore(e)+1},e.prototype.append=function(e){var t=this._list,l=e,a=this._lastAppendLocation,i=0;-1!==a&&a<t.length&&l.originalBeginDts>=t[a].lastSample.originalDts&&(a===t.length-1||a<t.length-1&&l.originalBeginDts<t[a+1].originalBeginDts)?i=a+1:t.length>0&&(i=this._searchNearestSegmentBefore(l.originalBeginDts)+1),this._lastAppendLocation=i,this._list.splice(i,0,l)},e.prototype.getLastSegmentBefore=function(e){var t=this._searchNearestSegmentBefore(e);return t>=0?this._list[t]:null},e.prototype.getLastSampleBefore=function(e){var t=this.getLastSegmentBefore(e);return null!=t?t.lastSample:null},e.prototype.getLastSyncPointBefore=function(e){for(var t=this._searchNearestSegmentBefore(e),l=this._list[t].syncPoints;0===l.length&&t>0;)t--,l=this._list[t].syncPoints;return l.length>0?l[l.length-1]:null},e}()},function(e,t,l){var a=function(){function e(){this.mimeType=null,this.duration=null,this.hasAudio=null,this.hasVideo=null,this.audioCodec=null,this.videoCodec=null,this.audioDataRate=null,this.videoDataRate=null,this.audioSampleRate=null,this.audioChannelCount=null,this.width=null,this.height=null,this.fps=null,this.profile=null,this.level=null,this.refFrames=null,this.chromaFormat=null,this.sarNum=null,this.sarDen=null,this.metadata=null,this.segments=null,this.segmentCount=null,this.hasKeyframesIndex=null,this.keyframesIndex=null}return e.prototype.isComplete=function(){var e=!1===this.hasAudio||!0===this.hasAudio&&null!=this.audioCodec&&null!=this.audioSampleRate&&null!=this.audioChannelCount,t=!1===this.hasVideo||!0===this.hasVideo&&null!=this.videoCodec&&null!=this.width&&null!=this.height&&null!=this.fps&&null!=this.profile&&null!=this.level&&null!=this.refFrames&&null!=this.chromaFormat&&null!=this.sarNum&&null!=this.sarDen;return null!=this.mimeType&&e&&t},e.prototype.isSeekable=function(){return!0===this.hasKeyframesIndex},e.prototype.getNearestKeyframe=function(e){if(null==this.keyframesIndex)return null;var t=this.keyframesIndex,l=this._search(t.times,e);return{index:l,milliseconds:t.times[l],fileposition:t.filepositions[l]}},e.prototype._search=function(e,t){var l=0,a=e.length-1,i=0,n=0,o=a;for(t<e[0]&&(l=0,n=o+1);n<=o;){if((i=n+Math.floor((o-n)/2))===a||t>=e[i]&&t<e[i+1]){l=i;break}e[i]<t?n=i+1:o=i-1}return l},e}();t.a=a},function(e,t,l){var a=l(9),i=l.n(a),n=l(0),o=l(5),c=l(12);function d(e,t,l){var a=e;if(t+l<a.length){for(;l--;)if(128!=(192&a[++t]))return!1;return!0}return!1}var g,s=function(e){for(var t=[],l=e,a=0,i=e.length;a<i;)if(l[a]<128)t.push(String.fromCharCode(l[a])),++a;else{if(l[a]<192);else if(l[a]<224){if(d(l,a,1)&&(n=(31&l[a])<<6|63&l[a+1])>=128){t.push(String.fromCharCode(65535&n)),a+=2;continue}}else if(l[a]<240){if(d(l,a,2)&&(n=(15&l[a])<<12|(63&l[a+1])<<6|63&l[a+2])>=2048&&55296!=(63488&n)){t.push(String.fromCharCode(65535&n)),a+=3;continue}}else if(l[a]<248){var n;if(d(l,a,3)&&(n=(7&l[a])<<18|(63&l[a+1])<<12|(63&l[a+2])<<6|63&l[a+3])>65536&&n<1114112){n-=65536,t.push(String.fromCharCode(n>>>10|55296)),t.push(String.fromCharCode(1023&n|56320)),a+=4;continue}}t.push(String.fromCharCode(65533)),++a}return t.join("")},C=l(3),m=(g=new ArrayBuffer(2),new DataView(g).setInt16(0,256,!0),256===new Int16Array(g)[0]),h=function(){function e(){}return e.parseScriptData=function(t,l,a){var i={};try{var o=e.parseValue(t,l,a),c=e.parseValue(t,l+o.size,a-o.size);i[o.data]=c.data}catch(e){n.a.e("AMF",e.toString())}return i},e.parseObject=function(t,l,a){if(a<3)throw new C.a("Data not enough when parse ScriptDataObject");var i=e.parseString(t,l,a),n=e.parseValue(t,l+i.size,a-i.size),o=n.objectEnd;return{data:{name:i.data,value:n.data},size:i.size+n.size,objectEnd:o}},e.parseVariable=function(t,l,a){return e.parseObject(t,l,a)},e.parseString=function(e,t,l){if(l<2)throw new C.a("Data not enough when parse String");var a=new DataView(e,t,l).getUint16(0,!m);return{data:a>0?s(new Uint8Array(e,t+2,a)):"",size:2+a}},e.parseLongString=function(e,t,l){if(l<4)throw new C.a("Data not enough when parse LongString");var a=new DataView(e,t,l).getUint32(0,!m);return{data:a>0?s(new Uint8Array(e,t+4,a)):"",size:4+a}},e.parseDate=function(e,t,l){if(l<10)throw new C.a("Data size invalid when parse Date");var a=new DataView(e,t,l),i=a.getFloat64(0,!m),n=a.getInt16(8,!m);return{data:new Date(i+=60*n*1e3),size:10}},e.parseValue=function(t,l,a){if(a<1)throw new C.a("Data not enough when parse Value");var i,o=new DataView(t,l,a),c=1,d=o.getUint8(0),g=!1;try{switch(d){case 0:i=o.getFloat64(1,!m),c+=8;break;case 1:i=!!o.getUint8(1),c+=1;break;case 2:var s=e.parseString(t,l+1,a-1);i=s.data,c+=s.size;break;case 3:i={};var h=0;for(9==(16777215&o.getUint32(a-4,!m))&&(h=3);c<a-4;){var r=e.parseObject(t,l+c,a-c-h);if(r.objectEnd)break;i[r.data.name]=r.data.value,c+=r.size}c<=a-3&&9==(16777215&o.getUint32(c-1,!m))&&(c+=3);break;case 8:for(i={},c+=4,h=0,9==(16777215&o.getUint32(a-4,!m))&&(h=3);c<a-8;){var Z=e.parseVariable(t,l+c,a-c-h);if(Z.objectEnd)break;i[Z.data.name]=Z.data.value,c+=Z.size}c<=a-3&&9==(16777215&o.getUint32(c-1,!m))&&(c+=3);break;case 9:i=void 0,c=1,g=!0;break;case 10:i=[];var I=o.getUint32(1,!m);c+=4;for(var J=0;J<I;J++){var u=e.parseValue(t,l+c,a-c);i.push(u.data),c+=u.size}break;case 11:var b=e.parseDate(t,l+1,a-1);i=b.data,c+=b.size;break;case 12:var G=e.parseString(t,l+1,a-1);i=G.data,c+=G.size;break;default:c=a,n.a.w("AMF","Unsupported AMF value type "+d)}}catch(e){n.a.e("AMF",e.toString())}return{data:i,size:c,objectEnd:g}},e}(),r=function(){function e(e){this.TAG="ExpGolomb",this._buffer=e,this._buffer_index=0,this._total_bytes=e.byteLength,this._total_bits=8*e.byteLength,this._current_word=0,this._current_word_bits_left=0}return e.prototype.destroy=function(){this._buffer=null},e.prototype._fillCurrentWord=function(){var e=this._total_bytes-this._buffer_index;if(e<=0)throw new C.a("ExpGolomb: _fillCurrentWord() but no bytes available");var t=Math.min(4,e),l=new Uint8Array(4);l.set(this._buffer.subarray(this._buffer_index,this._buffer_index+t)),this._current_word=new DataView(l.buffer).getUint32(0,!1),this._buffer_index+=t,this._current_word_bits_left=8*t},e.prototype.readBits=function(e){if(e>32)throw new C.b("ExpGolomb: readBits() bits exceeded max 32bits!");if(e<=this._current_word_bits_left){var t=this._current_word>>>32-e;return this._current_word<<=e,this._current_word_bits_left-=e,t}var l=this._current_word_bits_left?this._current_word:0;l>>>=32-this._current_word_bits_left;var a=e-this._current_word_bits_left;this._fillCurrentWord();var i=Math.min(a,this._current_word_bits_left),n=this._current_word>>>32-i;return this._current_word<<=i,this._current_word_bits_left-=i,l<<i|n},e.prototype.readBool=function(){return 1===this.readBits(1)},e.prototype.readByte=function(){return this.readBits(8)},e.prototype._skipLeadingZero=function(){var e;for(e=0;e<this._current_word_bits_left;e++)if(this._current_word&2147483648>>>e)return this._current_word<<=e,this._current_word_bits_left-=e,e;return this._fillCurrentWord(),e+this._skipLeadingZero()},e.prototype.readUEG=function(){var e=this._skipLeadingZero();return this.readBits(e+1)-1},e.prototype.readSEG=function(){var e=this.readUEG();return 1&e?e+1>>>1:-1*(e>>>1)},e}(),Z=function(){function e(){}return e._ebsp2rbsp=function(e){for(var t=e,l=t.byteLength,a=new Uint8Array(l),i=0,n=0;n<l;n++)n>=2&&3===t[n]&&0===t[n-1]&&0===t[n-2]||(a[i]=t[n],i++);return new Uint8Array(a.buffer,0,i)},e.parseSPS=function(t){for(var l=t.subarray(1,4),a="avc1.",i=0;i<3;i++){var n=l[i].toString(16);n.length<2&&(n="0"+n),a+=n}var o=e._ebsp2rbsp(t),c=new r(o);c.readByte();var d=c.readByte();c.readByte();var g=c.readByte();c.readUEG();var s=e.getProfileString(d),C=e.getLevelString(g),m=1,h=420,Z=8,I=8;if((100===d||110===d||122===d||244===d||44===d||83===d||86===d||118===d||128===d||138===d||144===d)&&(3===(m=c.readUEG())&&c.readBits(1),m<=3&&(h=[0,420,422,444][m]),Z=c.readUEG()+8,I=c.readUEG()+8,c.readBits(1),c.readBool()))for(var J=3!==m?8:12,u=0;u<J;u++)c.readBool()&&(u<6?e._skipScalingList(c,16):e._skipScalingList(c,64));c.readUEG();var b=c.readUEG();if(0===b)c.readUEG();else if(1===b){c.readBits(1),c.readSEG(),c.readSEG();var G=c.readUEG();for(u=0;u<G;u++)c.readSEG()}var p=c.readUEG();c.readBits(1);var y=c.readUEG(),W=c.readUEG(),X=c.readBits(1);0===X&&c.readBits(1),c.readBits(1);var V=0,R=0,k=0,B=0;c.readBool()&&(V=c.readUEG(),R=c.readUEG(),k=c.readUEG(),B=c.readUEG());var S=1,Y=1,A=0,Q=!0,K=0,F=0;if(c.readBool()){if(c.readBool()){var _=c.readByte();_>0&&_<16?(S=[1,12,10,16,40,24,20,32,80,18,15,64,160,4,3,2][_-1],Y=[1,11,11,11,33,11,11,11,33,11,11,33,99,3,2,1][_-1]):255===_&&(S=c.readByte()<<8|c.readByte(),Y=c.readByte()<<8|c.readByte())}if(c.readBool()&&c.readBool(),c.readBool()&&(c.readBits(4),c.readBool()&&c.readBits(24)),c.readBool()&&(c.readUEG(),c.readUEG()),c.readBool()){var f=c.readBits(32),w=c.readBits(32);Q=c.readBool(),A=(K=w)/(F=2*f)}}var H=1;1===S&&1===Y||(H=S/Y);var v=0,N=0;0===m?(v=1,N=2-X):(v=3===m?1:2,N=(1===m?2:1)*(2-X));var z=16*(y+1),L=16*(W+1)*(2-X);z-=(V+R)*v,L-=(k+B)*N;var U=Math.ceil(z*H);return c.destroy(),c=null,{codec_mimetype:a,profile_idc:d,level_idc:g,profile_string:s,level_string:C,chroma_format_idc:m,bit_depth:Z,bit_depth_luma:Z,bit_depth_chroma:I,ref_frames:p,chroma_format:h,chroma_format_string:e.getChromaFormatString(h),frame_rate:{fixed:Q,fps:A,fps_den:F,fps_num:K},sar_ratio:{width:S,height:Y},codec_size:{width:z,height:L},present_size:{width:U,height:L}}},e._skipScalingList=function(e,t){for(var l=8,a=8,i=0;i<t;i++)0!==a&&(a=(l+e.readSEG()+256)%256),l=0===a?l:a},e.getProfileString=function(e){switch(e){case 66:return"Baseline";case 77:return"Main";case 88:return"Extended";case 100:return"High";case 110:return"High10";case 122:return"High422";case 244:return"High444";default:return"Unknown"}},e.getLevelString=function(e){return(e/10).toFixed(1)},e.getChromaFormatString=function(e){switch(e){case 420:return"4:2:0";case 422:return"4:2:2";case 444:return"4:4:4";default:return"Unknown"}},e}(),I=l(6),J=function(){function e(){}return e._ebsp2rbsp=function(e){for(var t=e,l=t.byteLength,a=new Uint8Array(l),i=0,n=0;n<l;n++)n>=2&&3===t[n]&&0===t[n-1]&&0===t[n-2]||(a[i]=t[n],i++);return new Uint8Array(a.buffer,0,i)},e.parseVPS=function(t){var l=e._ebsp2rbsp(t),a=new r(l);return a.readByte(),a.readByte(),a.readBits(4),a.readBits(2),a.readBits(6),{num_temporal_layers:a.readBits(3)+1,temporal_id_nested:a.readBool()}},e.parseSPS=function(t){var l=e._ebsp2rbsp(t),a=new r(l);a.readByte(),a.readByte();for(var i=0,n=0,o=0,c=0,d=(a.readBits(4),a.readBits(3)),g=(a.readBool(),a.readBits(2)),s=a.readBool(),C=a.readBits(5),m=a.readByte(),h=a.readByte(),Z=a.readByte(),I=a.readByte(),J=a.readByte(),u=a.readByte(),b=a.readByte(),G=a.readByte(),p=a.readByte(),y=a.readByte(),W=a.readByte(),X=[],V=[],R=0;R<d;R++)X.push(a.readBool()),V.push(a.readBool());if(d>0)for(R=d;R<8;R++)a.readBits(2);for(R=0;R<d;R++)X[R]&&(a.readByte(),a.readByte(),a.readByte(),a.readByte(),a.readByte(),a.readByte(),a.readByte(),a.readByte(),a.readByte(),a.readByte(),a.readByte()),V[R]&&a.readByte();a.readUEG();var k=a.readUEG();3==k&&a.readBits(1);var B=a.readUEG(),S=a.readUEG();a.readBool()&&(i+=a.readUEG(),n+=a.readUEG(),o+=a.readUEG(),c+=a.readUEG());var Y=a.readUEG(),A=a.readUEG(),Q=a.readUEG();for(R=a.readBool()?0:d;R<=d;R++)a.readUEG(),a.readUEG(),a.readUEG();if(a.readUEG(),a.readUEG(),a.readUEG(),a.readUEG(),a.readUEG(),a.readUEG(),a.readBool()&&a.readBool())for(var K=0;K<4;K++)for(var F=0;F<(3===K?2:6);F++)if(a.readBool()){var _=Math.min(64,1<<4+(K<<1));for(K>1&&a.readSEG(),R=0;R<_;R++)a.readSEG()}else a.readUEG();a.readBool(),a.readBool(),a.readBool()&&(a.readByte(),a.readUEG(),a.readUEG(),a.readBool());var f=a.readUEG(),w=0;for(R=0;R<f;R++){var H=!1;if(0!==R&&(H=a.readBool()),H){R===f&&a.readUEG(),a.readBool(),a.readUEG();for(var v=0,N=0;N<=w;N++){var z=a.readBool(),L=!1;z||(L=a.readBool()),(z||L)&&v++}w=v}else{var U=a.readUEG(),M=a.readUEG();for(w=U+M,N=0;N<U;N++)a.readUEG(),a.readBool();for(N=0;N<M;N++)a.readUEG(),a.readBool()}}if(a.readBool()){var T=a.readUEG();for(R=0;R<T;R++){for(N=0;N<Q+4;N++)a.readBits(1);a.readBits(1)}}var D=0,E=1,O=1,x=!1,P=1,j=1;if(a.readBool(),a.readBool(),a.readBool()){if(a.readBool()){var q=a.readByte();q>0&&q<=16?(E=[1,12,10,16,40,24,20,32,80,18,15,64,160,4,3,2][q-1],O=[1,11,11,11,33,11,11,11,33,11,11,33,99,3,2,1][q-1]):255===q&&(E=a.readBits(16),O=a.readBits(16))}if(a.readBool()&&a.readBool(),a.readBool()&&(a.readBits(3),a.readBool(),a.readBool()&&(a.readByte(),a.readByte(),a.readByte())),a.readBool()&&(a.readUEG(),a.readUEG()),a.readBool(),a.readBool(),a.readBool(),a.readBool()&&(a.readUEG(),a.readUEG(),a.readUEG(),a.readUEG()),a.readBool()&&(P=a.readBits(32),j=a.readBits(32),a.readBool()&&a.readUEG(),a.readBool())){var $=!1,ee=!1,te=!1;for($=a.readBool(),ee=a.readBool(),($||ee)&&((te=a.readBool())&&(a.readByte(),a.readBits(5),a.readBool(),a.readBits(5)),a.readBits(4),a.readBits(4),te&&a.readBits(4),a.readBits(5),a.readBits(5),a.readBits(5)),R=0;R<=d;R++){var le=a.readBool();x=le;var ae=!0,ie=1;le||(ae=a.readBool());var ne=!1;if(ae?a.readUEG():ne=a.readBool(),ne||(ie=a.readUEG()+1),$){for(N=0;N<ie;N++)a.readUEG(),a.readUEG(),te&&(a.readUEG(),a.readUEG());a.readBool()}if(ee){for(N=0;N<ie;N++)a.readUEG(),a.readUEG(),te&&(a.readUEG(),a.readUEG());a.readBool()}}}a.readBool()&&(a.readBool(),a.readBool(),a.readBool(),D=a.readUEG(),a.readUEG(),a.readUEG(),a.readUEG(),a.readUEG())}a.readBool();var oe="hvc1.".concat(C,".1.L").concat(W,".B0"),ce=B-(i+n)*(1===k||2===k?2:1),de=S-(o+c)*(1===k?2:1),ge=1;return 1!==E&&1!==O&&(ge=E/O),a.destroy(),a=null,{codec_mimetype:oe,profile_string:e.getProfileString(C),level_string:e.getLevelString(W),profile_idc:C,bit_depth:Y+8,ref_frames:1,chroma_format:k,chroma_format_string:e.getChromaFormatString(k),general_level_idc:W,general_profile_space:g,general_tier_flag:s,general_profile_idc:C,general_profile_compatibility_flags_1:m,general_profile_compatibility_flags_2:h,general_profile_compatibility_flags_3:Z,general_profile_compatibility_flags_4:I,general_constraint_indicator_flags_1:J,general_constraint_indicator_flags_2:u,general_constraint_indicator_flags_3:b,general_constraint_indicator_flags_4:G,general_constraint_indicator_flags_5:p,general_constraint_indicator_flags_6:y,min_spatial_segmentation_idc:D,constant_frame_rate:0,chroma_format_idc:k,bit_depth_luma_minus8:Y,bit_depth_chroma_minus8:A,frame_rate:{fixed:x,fps:j/P,fps_den:P,fps_num:j},sar_ratio:{width:E,height:O},codec_size:{width:ce,height:de},present_size:{width:ce*ge,height:de}}},e.parsePPS=function(t){var l=e._ebsp2rbsp(t),a=new r(l);a.readByte(),a.readByte(),a.readUEG(),a.readUEG(),a.readBool(),a.readBool(),a.readBits(3),a.readBool(),a.readBool(),a.readUEG(),a.readUEG(),a.readSEG(),a.readBool(),a.readBool(),a.readBool()&&a.readUEG(),a.readSEG(),a.readSEG(),a.readBool(),a.readBool(),a.readBool(),a.readBool();var i=a.readBool(),n=a.readBool(),o=1;return n&&i?o=0:n?o=3:i&&(o=2),{parallelismType:o}},e.getChromaFormatString=function(e){switch(e){case 0:return"4:0:0";case 1:return"4:2:0";case 2:return"4:2:2";case 3:return"4:4:4";default:return"Unknown"}},e.getProfileString=function(e){switch(e){case 1:return"Main";case 2:return"Main10";case 3:return"MainSP";case 4:return"Rext";case 9:return"SCC";default:return"Unknown"}},e.getLevelString=function(e){return(e/30).toFixed(1)},e}();function u(e){return e.byteOffset%2==0&&e.byteLength%2==0}function b(e){return e.byteOffset%4==0&&e.byteLength%4==0}function G(e,t){for(var l=0;l<e.length;l++)if(e[l]!==t[l])return!1;return!0}var p,y=function(e,t){return e.byteLength===t.byteLength&&(b(e)&&b(t)?function(e,t){return G(new Uint32Array(e.buffer,e.byteOffset,e.byteLength/4),new Uint32Array(t.buffer,t.byteOffset,t.byteLength/4))}(e,t):u(e)&&u(t)?function(e,t){return G(new Uint16Array(e.buffer,e.byteOffset,e.byteLength/2),new Uint16Array(t.buffer,t.byteOffset,t.byteLength/2))}(e,t):function(e,t){return G(e,t)}(e,t))},W=function(){return(W=Object.assign||function(e){for(var t,l=1,a=arguments.length;l<a;l++)for(var i in t=arguments[l])Object.prototype.hasOwnProperty.call(t,i)&&(e[i]=t[i]);return e}).apply(this,arguments)},X=function(){function e(){}return e.parseOBUs=function(t,l){for(var a=0;a<t.byteLength;){var i=a,n=(t[a],(120&t[a])>>3),o=!!(4&t[a]),c=!!(2&t[a]);t[a],a+=1,o&&(a+=1);var d=Number.POSITIVE_INFINITY;if(c){d=0;for(var g=0;;g++){var s=t[a++];if(d|=(127&s)<<7*g,!(128&s))break}}console.log(n),1===n?l=W(W({},e.parseSeuqneceHeader(t.subarray(a,a+d))),{sequence_header_data:t.subarray(i,a+d)}):(3==n&&l||6==n&&l)&&(l=e.parseOBUFrameHeader(t.subarray(a,a+d),0,0,l)),a+=d}return l},e.parseSeuqneceHeader=function(t){var l=new r(t),a=l.readBits(3),i=(l.readBool(),l.readBool()),n=!0,o=0,c=1,d=void 0,g=[];if(i)g.push({operating_point_idc:0,level:l.readBits(5),tier:0});else{if(l.readBool()){var s=l.readBits(32),C=l.readBits(32),m=l.readBool();if(m){for(var h=0;0===l.readBits(1);)h+=1;h>=32||l.readBits(h)}o=C,c=s,n=m,l.readBool()&&(l.readBits(5),l.readBits(32),d=l.readBits(5),l.readBits(5))}for(var Z=l.readBool(),I=l.readBits(5),J=0;J<=I;J++){var u=l.readBits(12),b=l.readBits(5),G=b>7?l.readBits(1):0;g.push({operating_point_idc:u,level:b,tier:G}),Z&&l.readBool()&&l.readBits(4)}}var p=g[0],y=p.level,W=p.tier,X=l.readBits(4),V=l.readBits(4),R=l.readBits(X+1)+1,k=l.readBits(V+1)+1,B=!1;i||(B=l.readBool()),B&&(l.readBits(4),l.readBits(4)),l.readBool(),l.readBool(),l.readBool();var S=!1,Y=2,A=2,Q=0;i||(l.readBool(),l.readBool(),l.readBool(),l.readBool(),(S=l.readBool())&&(l.readBool(),l.readBool()),A=(Y=l.readBool()?2:l.readBits(1))?l.readBool()?2:l.readBits(1):2,Q=S?l.readBits(3)+1:0);var K=l.readBool(),F=(l.readBool(),l.readBool(),l.readBool()),_=8;_=2===a&&F?l.readBool()?12:10:F?10:8;var f=!1;1!==a&&(f=l.readBool()),l.readBool()&&(l.readBits(8),l.readBits(8),l.readBits(8));var w=1,H=1;return f?(l.readBits(1),w=1,H=1):(l.readBits(1),0==a?(w=1,H=1):1==a?(w=0,H=0):12==_?l.readBits(1)&&l.readBits(1):(w=1,H=0),w&&H&&l.readBits(2),l.readBits(1)),l.readBool(),l.destroy(),l=null,{codec_mimetype:"av01.".concat(a,".").concat(e.getLevelString(y,W),".").concat(_.toString(10).padStart(2,"0")),level:y,tier:W,level_string:e.getLevelString(y,W),profile_idc:a,profile_string:"".concat(a),bit_depth:_,ref_frames:1,chroma_format:e.getChromaFormat(f,w,H),chroma_format_string:e.getChromaFormatString(f,w,H),sequence_header:{frame_id_numbers_present_flag:B,additional_frame_id_length_minus_1:void 0,delta_frame_id_length_minus_2:void 0,reduced_still_picture_header:i,decoder_model_info_present_flag:!1,operating_points:g,buffer_removal_time_length_minus_1:d,equal_picture_interval:n,seq_force_screen_content_tools:Y,seq_force_integer_mv:A,enable_order_hint:S,order_hint_bits:Q,enable_superres:K,frame_width_bit:X+1,frame_height_bit:V+1,max_frame_width:R,max_frame_height:k},keyframe:void 0,frame_rate:{fixed:n,fps:o/c,fps_den:c,fps_num:o}}},e.parseOBUFrameHeader=function(t,l,a,i){var n=i.sequence_header,o=new r(t),c=(n.max_frame_width,n.max_frame_height,0);n.frame_id_numbers_present_flag&&(c=n.additional_frame_id_length_minus_1+n.delta_frame_id_length_minus_2+3);var d=0,g=!0,s=!0,C=!1;if(!n.reduced_still_picture_header){if(o.readBool())return i;g=2===(d=o.readBits(2))||0===d,(s=o.readBool())&&n.decoder_model_info_present_flag&&n.equal_picture_interval,s&&o.readBool(),C=!!(3===d||0===d&&s)||o.readBool()}i.keyframe=g,o.readBool();var m=n.seq_force_screen_content_tools;2===n.seq_force_screen_content_tools&&(m=o.readBits(1)),m&&(n.seq_force_integer_mv,2==n.seq_force_integer_mv&&o.readBits(1)),n.frame_id_numbers_present_flag&&o.readBits(c);var h=!1;if(h=3==d||!n.reduced_still_picture_header&&o.readBool(),o.readBits(n.order_hint_bits),g||C||o.readBits(3),n.decoder_model_info_present_flag&&o.readBool())for(var Z=0;Z<=n.operating_points_cnt_minus_1;Z++)if(n.operating_points[Z].decoder_model_present_for_this_op[Z]){var I=n.operating_points[Z].operating_point_idc;(0===I||I>>l&1&&I>>a+8&1)&&o.readBits(n.buffer_removal_time_length_minus_1+1)}var J=255;if(3===d||0==d&&s||(J=o.readBits(8)),(g||255!==J)&&C&&n.enable_order_hint)for(var u=0;u<8;u++)o.readBits(n.order_hint_bits);if(g){var b=e.frameSizeAndRenderSize(o,h,n);i.codec_size={width:b.FrameWidth,height:b.FrameHeight},i.present_size={width:b.RenderWidth,height:b.RenderHeight},i.sar_ratio={width:b.RenderWidth/b.FrameWidth,height:b.RenderHeight/b.FrameHeight}}return o.destroy(),o=null,i},e.frameSizeAndRenderSize=function(e,t,l){var a=l.max_frame_width,i=l.max_frame_height;t&&(a=e.readBits(l.frame_width_bit)+1,i=e.readBits(l.frame_height_bit)+1);var n=!1;l.enable_superres&&(n=e.readBool());var o=8;n&&(o=e.readBits(3)+9);var c=a;a=Math.floor((8*c+o/2)/o);var d=c,g=i;if(e.readBool()){var s=e.readBits(16)+1,C=e.readBits(16)+1;d=e.readBits(s)+1,g=e.readBits(C)+1}return{UpscaledWidth:c,FrameWidth:a,FrameHeight:i,RenderWidth:d,RenderHeight:g}},e.getLevelString=function(e,t){return"".concat(e.toString(10).padStart(2,"0")).concat(0===t?"M":"H")},e.getChromaFormat=function(e,t,l){return e?0:0===t&&0===l?3:1===t&&0===l?2:1===t&&1===l?1:Number.NaN},e.getChromaFormatString=function(e,t,l){return e?"4:0:0":0===t&&0===l?"4:4:4":1===t&&0===l?"4:2:2":1===t&&1===l?"4:2:0":"Unknown"},e}(),V=function(){function e(e,t){this.TAG="FLVDemuxer",this._config=t,this._onError=null,this._onMediaInfo=null,this._onMetaDataArrived=null,this._onScriptDataArrived=null,this._onTrackMetadata=null,this._onDataAvailable=null,this._dataOffset=e.dataOffset,this._firstParse=!0,this._dispatch=!1,this._hasAudio=e.hasAudioTrack,this._hasVideo=e.hasVideoTrack,this._hasAudioFlagOverrided=!1,this._hasVideoFlagOverrided=!1,this._audioInitialMetadataDispatched=!1,this._videoInitialMetadataDispatched=!1,this._mediaInfo=new c.a,this._mediaInfo.hasAudio=this._hasAudio,this._mediaInfo.hasVideo=this._hasVideo,this._metadata=null,this._audioMetadata=null,this._videoMetadata=null,this._naluLengthSize=4,this._timestampBase=0,this._timescale=1e3,this._duration=0,this._durationOverrided=!1,this._referenceFrameRate={fixed:!0,fps:23.976,fps_num:23976,fps_den:1e3},this._flvSoundRateTable=[5500,11025,22050,44100,48e3],this._mpegSamplingRates=[96e3,88200,64e3,48e3,44100,32e3,24e3,22050,16e3,12e3,11025,8e3,7350],this._mpegAudioV10SampleRateTable=[44100,48e3,32e3,0],this._mpegAudioV20SampleRateTable=[22050,24e3,16e3,0],this._mpegAudioV25SampleRateTable=[11025,12e3,8e3,0],this._mpegAudioL1BitRateTable=[0,32,64,96,128,160,192,224,256,288,320,352,384,416,448,-1],this._mpegAudioL2BitRateTable=[0,32,48,56,64,80,96,112,128,160,192,224,256,320,384,-1],this._mpegAudioL3BitRateTable=[0,32,40,48,56,64,80,96,112,128,160,192,224,256,320,-1],this._videoTrack={type:"video",id:1,sequenceNumber:0,samples:[],length:0},this._audioTrack={type:"audio",id:2,sequenceNumber:0,samples:[],length:0},this._littleEndian=function(){var e=new ArrayBuffer(2);return new DataView(e).setInt16(0,256,!0),256===new Int16Array(e)[0]}()}return e.prototype.destroy=function(){this._mediaInfo=null,this._metadata=null,this._audioMetadata=null,this._videoMetadata=null,this._videoTrack=null,this._audioTrack=null,this._onError=null,this._onMediaInfo=null,this._onMetaDataArrived=null,this._onScriptDataArrived=null,this._onTrackMetadata=null,this._onDataAvailable=null},e.probe=function(e){var t=new Uint8Array(e);if(t.byteLength<9)return{needMoreData:!0};var l={match:!1};if(70!==t[0]||76!==t[1]||86!==t[2]||1!==t[3])return l;var a,i,n=(4&t[4])>>>2!=0,o=!!(1&t[4]),c=(a=t)[i=5]<<24|a[i+1]<<16|a[i+2]<<8|a[i+3];return c<9?l:{match:!0,consumed:c,dataOffset:c,hasAudioTrack:n,hasVideoTrack:o}},e.prototype.bindDataSource=function(e){return e.onDataArrival=this.parseChunks.bind(this),this},Object.defineProperty(e.prototype,"onTrackMetadata",{get:function(){return this._onTrackMetadata},set:function(e){this._onTrackMetadata=e},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"onMediaInfo",{get:function(){return this._onMediaInfo},set:function(e){this._onMediaInfo=e},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"onMetaDataArrived",{get:function(){return this._onMetaDataArrived},set:function(e){this._onMetaDataArrived=e},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"onScriptDataArrived",{get:function(){return this._onScriptDataArrived},set:function(e){this._onScriptDataArrived=e},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"onError",{get:function(){return this._onError},set:function(e){this._onError=e},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"onDataAvailable",{get:function(){return this._onDataAvailable},set:function(e){this._onDataAvailable=e},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"timestampBase",{get:function(){return this._timestampBase},set:function(e){this._timestampBase=e},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"overridedDuration",{get:function(){return this._duration},set:function(e){this._durationOverrided=!0,this._duration=e,this._mediaInfo.duration=e},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"overridedHasAudio",{set:function(e){this._hasAudioFlagOverrided=!0,this._hasAudio=e,this._mediaInfo.hasAudio=e},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"overridedHasVideo",{set:function(e){this._hasVideoFlagOverrided=!0,this._hasVideo=e,this._mediaInfo.hasVideo=e},enumerable:!1,configurable:!0}),e.prototype.resetMediaInfo=function(){this._mediaInfo=new c.a},e.prototype._isInitialMetadataDispatched=function(){return this._hasAudio&&this._hasVideo?this._audioInitialMetadataDispatched&&this._videoInitialMetadataDispatched:this._hasAudio&&!this._hasVideo?this._audioInitialMetadataDispatched:!(this._hasAudio||!this._hasVideo)&&this._videoInitialMetadataDispatched},e.prototype.parseChunks=function(t,l){if(!(this._onError&&this._onMediaInfo&&this._onTrackMetadata&&this._onDataAvailable))throw new C.a("Flv: onError & onMediaInfo & onTrackMetadata & onDataAvailable callback must be specified");var a=0,i=this._littleEndian;if(0===l){if(!(t.byteLength>13))return 0;a=e.probe(t).dataOffset}for(this._firstParse&&(this._firstParse=!1,l+a!==this._dataOffset&&n.a.w(this.TAG,"First time parsing but chunk byteStart invalid!"),0!==(o=new DataView(t,a)).getUint32(0,!i)&&n.a.w(this.TAG,"PrevTagSize0 !== 0 !!!"),a+=4);a<t.byteLength;){this._dispatch=!0;var o=new DataView(t,a);if(a+11+4>t.byteLength)break;var c=o.getUint8(0),d=16777215&o.getUint32(0,!i);if(a+11+d+4>t.byteLength)break;if(8===c||9===c||18===c){var g=o.getUint8(4),s=o.getUint8(5),m=o.getUint8(6)|s<<8|g<<16|o.getUint8(7)<<24;16777215&o.getUint32(7,!i)&&n.a.w(this.TAG,"Meet tag which has StreamID != 0!");var h=a+11;switch(c){case 8:this._parseAudioData(t,h,d,m);break;case 9:this._parseVideoData(t,h,d,m,l+a);break;case 18:this._parseScriptData(t,h,d)}var r=o.getUint32(11+d,!i);r!==11+d&&n.a.w(this.TAG,"Invalid PrevTagSize ".concat(r)),a+=11+d+4}else n.a.w(this.TAG,"Unsupported tag type ".concat(c,", skipped")),a+=11+d+4}return this._isInitialMetadataDispatched()&&this._dispatch&&(this._audioTrack.length||this._videoTrack.length)&&this._onDataAvailable(this._audioTrack,this._videoTrack),a},e.prototype._parseScriptData=function(e,t,l){var a=h.parseScriptData(e,t,l);if(a.hasOwnProperty("onMetaData")){if(null==a.onMetaData||"object"!=typeof a.onMetaData)return void n.a.w(this.TAG,"Invalid onMetaData structure!");this._metadata&&n.a.w(this.TAG,"Found another onMetaData tag!"),this._metadata=a;var i=this._metadata.onMetaData;if(this._onMetaDataArrived&&this._onMetaDataArrived(Object.assign({},i)),"boolean"==typeof i.hasAudio&&!1===this._hasAudioFlagOverrided&&(this._hasAudio=i.hasAudio,this._mediaInfo.hasAudio=this._hasAudio),"boolean"==typeof i.hasVideo&&!1===this._hasVideoFlagOverrided&&(this._hasVideo=i.hasVideo,this._mediaInfo.hasVideo=this._hasVideo),"number"==typeof i.audiodatarate&&(this._mediaInfo.audioDataRate=i.audiodatarate),"number"==typeof i.videodatarate&&(this._mediaInfo.videoDataRate=i.videodatarate),"number"==typeof i.width&&(this._mediaInfo.width=i.width),"number"==typeof i.height&&(this._mediaInfo.height=i.height),"number"==typeof i.duration){if(!this._durationOverrided){var o=Math.floor(i.duration*this._timescale);this._duration=o,this._mediaInfo.duration=o}}else this._mediaInfo.duration=0;if("number"==typeof i.framerate){var c=Math.floor(1e3*i.framerate);if(c>0){var d=c/1e3;this._referenceFrameRate.fixed=!0,this._referenceFrameRate.fps=d,this._referenceFrameRate.fps_num=c,this._referenceFrameRate.fps_den=1e3,this._mediaInfo.fps=d}}if("object"==typeof i.keyframes){this._mediaInfo.hasKeyframesIndex=!0;var g=i.keyframes;this._mediaInfo.keyframesIndex=this._parseKeyframesIndex(g),i.keyframes=null}else this._mediaInfo.hasKeyframesIndex=!1;this._dispatch=!1,this._mediaInfo.metadata=i,n.a.v(this.TAG,"Parsed onMetaData"),this._mediaInfo.isComplete()&&this._onMediaInfo(this._mediaInfo)}Object.keys(a).length>0&&this._onScriptDataArrived&&this._onScriptDataArrived(Object.assign({},a))},e.prototype._parseKeyframesIndex=function(e){for(var t=[],l=[],a=1;a<e.times.length;a++){var i=this._timestampBase+Math.floor(1e3*e.times[a]);t.push(i),l.push(e.filepositions[a])}return{times:t,filepositions:l}},e.prototype._parseAudioData=function(e,t,l,a){if(l<=1)n.a.w(this.TAG,"Flv: Invalid audio packet, missing SoundData payload!");else if(!0!==this._hasAudioFlagOverrided||!1!==this._hasAudio){this._littleEndian;var i=new DataView(e,t,l).getUint8(0),o=i>>>4;if(9!==o)if(2===o||10===o){var c=0,d=(12&i)>>>2;if(d>=0&&d<=4){c=this._flvSoundRateTable[d];var g=1&i,s=this._audioMetadata,C=this._audioTrack;if(s||(!1===this._hasAudio&&!1===this._hasAudioFlagOverrided&&(this._hasAudio=!0,this._mediaInfo.hasAudio=!0),(s=this._audioMetadata={}).type="audio",s.id=C.id,s.timescale=this._timescale,s.duration=this._duration,s.audioSampleRate=c,s.channelCount=0===g?1:2),10===o){var m=this._parseAACAudioData(e,t+1,l-1);if(null==m)return;if(0===m.packetType){if(s.config){if(y(m.data.config,s.config))return;n.a.w(this.TAG,"AudioSpecificConfig has been changed, re-generate initialization segment")}var h=m.data;s.audioSampleRate=h.samplingRate,s.channelCount=h.channelCount,s.codec=h.codec,s.originalCodec=h.originalCodec,s.config=h.config,s.refSampleDuration=1024/s.audioSampleRate*s.timescale,n.a.v(this.TAG,"Parsed AudioSpecificConfig"),this._isInitialMetadataDispatched()?this._dispatch&&(this._audioTrack.length||this._videoTrack.length)&&this._onDataAvailable(this._audioTrack,this._videoTrack):this._audioInitialMetadataDispatched=!0,this._dispatch=!1,this._onTrackMetadata("audio",s),(J=this._mediaInfo).audioCodec=s.originalCodec,J.audioSampleRate=s.audioSampleRate,J.audioChannelCount=s.channelCount,J.hasVideo?null!=J.videoCodec&&(J.mimeType='video/x-flv; codecs="'+J.videoCodec+","+J.audioCodec+'"'):J.mimeType='video/x-flv; codecs="'+J.audioCodec+'"',J.isComplete()&&this._onMediaInfo(J)}else if(1===m.packetType){var r=this._timestampBase+a,Z={unit:m.data,length:m.data.byteLength,dts:r,pts:r};C.samples.push(Z),C.length+=m.data.length}else n.a.e(this.TAG,"Flv: Unsupported AAC data type ".concat(m.packetType))}else if(2===o){if(!s.codec){var J;if(null==(h=this._parseMP3AudioData(e,t+1,l-1,!0)))return;s.audioSampleRate=h.samplingRate,s.channelCount=h.channelCount,s.codec=h.codec,s.originalCodec=h.originalCodec,s.refSampleDuration=1152/s.audioSampleRate*s.timescale,n.a.v(this.TAG,"Parsed MPEG Audio Frame Header"),this._audioInitialMetadataDispatched=!0,this._onTrackMetadata("audio",s),(J=this._mediaInfo).audioCodec=s.codec,J.audioSampleRate=s.audioSampleRate,J.audioChannelCount=s.channelCount,J.audioDataRate=h.bitRate,J.hasVideo?null!=J.videoCodec&&(J.mimeType='video/x-flv; codecs="'+J.videoCodec+","+J.audioCodec+'"'):J.mimeType='video/x-flv; codecs="'+J.audioCodec+'"',J.isComplete()&&this._onMediaInfo(J)}var u=this._parseMP3AudioData(e,t+1,l-1,!1);if(null==u)return;r=this._timestampBase+a;var b={unit:u,length:u.byteLength,dts:r,pts:r};C.samples.push(b),C.length+=u.length}}else this._onError(I.a.FORMAT_ERROR,"Flv: Invalid audio sample rate idx: "+d)}else this._onError(I.a.CODEC_UNSUPPORTED,"Flv: Unsupported audio codec idx: "+o);else{if(l<=5)return void n.a.w(this.TAG,"Flv: Invalid audio packet, missing AudioFourCC in Ehnanced FLV payload!");var G=15&i,p=String.fromCharCode.apply(String,new Uint8Array(e,t,l).slice(1,5));switch(p){case"Opus":this._parseOpusAudioPacket(e,t+5,l-5,a,G);break;case"fLaC":this._parseFlacAudioPacket(e,t+5,l-5,a,G);break;default:this._onError(I.a.CODEC_UNSUPPORTED,"Flv: Unsupported audio codec: "+p)}}}},e.prototype._parseAACAudioData=function(e,t,l){if(!(l<=1)){var a={},i=new Uint8Array(e,t,l);return a.packetType=i[0],0===i[0]?a.data=this._parseAACAudioSpecificConfig(e,t+1,l-1):a.data=i.subarray(1),a}n.a.w(this.TAG,"Flv: Invalid AAC packet, missing AACPacketType or/and Data!")},e.prototype._parseAACAudioSpecificConfig=function(e,t,l){var a,i,n=new Uint8Array(e,t,l),o=null,c=0,d=null;if(c=a=n[0]>>>3,(i=(7&n[0])<<1|n[1]>>>7)<0||i>=this._mpegSamplingRates.length)this._onError(I.a.FORMAT_ERROR,"Flv: AAC invalid sampling frequency index!");else{var g=this._mpegSamplingRates[i],s=(120&n[1])>>>3;if(!(s<0||s>=8)){5===c&&(d=(7&n[1])<<1|n[2]>>>7,n[2]);var C=self.navigator.userAgent.toLowerCase();return-1!==C.indexOf("firefox")?i>=6?(c=5,o=new Array(4),d=i-3):(c=2,o=new Array(2),d=i):-1!==C.indexOf("android")?(c=2,o=new Array(2),d=i):(c=5,d=i,o=new Array(4),i>=6?d=i-3:1===s&&(c=2,o=new Array(2),d=i)),o[0]=c<<3,o[0]|=(15&i)>>>1,o[1]=(15&i)<<7,o[1]|=(15&s)<<3,5===c&&(o[1]|=(15&d)>>>1,o[2]=(1&d)<<7,o[2]|=8,o[3]=0),{config:o,samplingRate:g,channelCount:s,codec:"mp4a.40."+c,originalCodec:"mp4a.40."+a}}this._onError(I.a.FORMAT_ERROR,"Flv: AAC invalid channel configuration")}},e.prototype._parseMP3AudioData=function(e,t,l,a){if(!(l<4)){this._littleEndian;var i=new Uint8Array(e,t,l),o=null;if(a){if(255!==i[0])return;var c=i[1]>>>3&3,d=(6&i[1])>>1,g=(240&i[2])>>>4,s=(12&i[2])>>>2,C=3&~(i[3]>>>6)?2:1,m=0,h=0;switch(c){case 0:m=this._mpegAudioV25SampleRateTable[s];break;case 2:m=this._mpegAudioV20SampleRateTable[s];break;case 3:m=this._mpegAudioV10SampleRateTable[s]}switch(d){case 1:g<this._mpegAudioL3BitRateTable.length&&(h=this._mpegAudioL3BitRateTable[g]);break;case 2:g<this._mpegAudioL2BitRateTable.length&&(h=this._mpegAudioL2BitRateTable[g]);break;case 3:g<this._mpegAudioL1BitRateTable.length&&(h=this._mpegAudioL1BitRateTable[g])}o={bitRate:h,samplingRate:m,channelCount:C,codec:"mp3",originalCodec:"mp3"}}else o=i;return o}n.a.w(this.TAG,"Flv: Invalid MP3 packet, header missing!")},e.prototype._parseOpusAudioPacket=function(e,t,l,a,i){if(0===i)this._parseOpusSequenceHeader(e,t,l);else if(1===i)this._parseOpusAudioData(e,t,l,a);else if(2!==i)return void this._onError(I.a.FORMAT_ERROR,"Flv: Invalid video packet type ".concat(i))},e.prototype._parseOpusSequenceHeader=function(e,t,l){if(l<=16)n.a.w(this.TAG,"Flv: Invalid OpusSequenceHeader, lack of data!");else{var a=this._audioMetadata,i=this._audioTrack;a||(!1===this._hasAudio&&!1===this._hasAudioFlagOverrided&&(this._hasAudio=!0,this._mediaInfo.hasAudio=!0),(a=this._audioMetadata={}).type="audio",a.id=i.id,a.timescale=this._timescale,a.duration=this._duration);var o=new DataView(e,t,l);o.setUint8(8,0);var c=o.getUint8(9);o.setUint16(10,o.getUint16(10,!0),!1);var d=o.getUint32(12,!0);o.setUint32(12,o.getUint32(12,!0),!1);var g={config:new Uint8Array(e,t+8,l-8),channelCount:c,samplingFrequence:d,codec:"opus",originalCodec:"opus"};if(a.config){if(y(g.config,a.config))return;n.a.w(this.TAG,"OpusSequenceHeader has been changed, re-generate initialization segment")}a.audioSampleRate=g.samplingFrequence,a.channelCount=g.channelCount,a.codec=g.codec,a.originalCodec=g.originalCodec,a.config=g.config,a.refSampleDuration=20,n.a.v(this.TAG,"Parsed OpusSequenceHeader"),this._isInitialMetadataDispatched()?this._dispatch&&(this._audioTrack.length||this._videoTrack.length)&&this._onDataAvailable(this._audioTrack,this._videoTrack):this._audioInitialMetadataDispatched=!0,this._dispatch=!1,this._onTrackMetadata("audio",a);var s=this._mediaInfo;s.audioCodec=a.originalCodec,s.audioSampleRate=a.audioSampleRate,s.audioChannelCount=a.channelCount,s.hasVideo?null!=s.videoCodec&&(s.mimeType='video/x-flv; codecs="'+s.videoCodec+","+s.audioCodec+'"'):s.mimeType='video/x-flv; codecs="'+s.audioCodec+'"',s.isComplete()&&this._onMediaInfo(s)}},e.prototype._parseOpusAudioData=function(e,t,l,a){var i=this._audioTrack,n=new Uint8Array(e,t,l),o=this._timestampBase+a,c={unit:n,length:n.byteLength,dts:o,pts:o};i.samples.push(c),i.length+=n.length},e.prototype._parseFlacAudioPacket=function(e,t,l,a,i){if(0===i)this._parseFlacSequenceHeader(e,t,l);else if(1===i)this._parseFlacAudioData(e,t,l,a);else if(2!==i)return void this._onError(I.a.FORMAT_ERROR,"Flv: Invalid Flac audio packet type ".concat(i))},e.prototype._parseFlacSequenceHeader=function(e,t,l){var a=this._audioMetadata,i=this._audioTrack;a||(!1===this._hasAudio&&!1===this._hasAudioFlagOverrided&&(this._hasAudio=!0,this._mediaInfo.hasAudio=!0),(a=this._audioMetadata={}).type="audio",a.id=i.id,a.timescale=this._timescale,a.duration=this._duration);var o=new Uint8Array(e,t+4,l-4),c=new r(o),d=c.readBits(16),g=c.readBits(16),s=g===d?g:null;c.readBits(24),c.readBits(24);var C=c.readBits(20),m=c.readBits(3)+1,h=c.readBits(5)+1;c.destroy();var Z=new Uint8Array(o.byteLength+4);Z.set(o,4),Z[0]=128,Z[1]=o.byteLength>>>16&255,Z[2]=o.byteLength>>>8&255,Z[3]=o.byteLength>>>0&255;var I={config:Z,channelCount:m,samplingFrequence:C,sampleSize:h,codec:"flac",originalCodec:"flac"};if(a.config){if(y(I.config,a.config))return;n.a.w(this.TAG,"FlacSequenceHeader has been changed, re-generate initialization segment")}a.audioSampleRate=I.samplingFrequence,a.channelCount=I.channelCount,a.sampleSize=I.sampleSize,a.codec=I.codec,a.originalCodec=I.originalCodec,a.config=I.config,a.refSampleDuration=null!=s?1e3*s/I.samplingFrequence:null,n.a.v(this.TAG,"Parsed FlacSequenceHeader"),this._isInitialMetadataDispatched()?this._dispatch&&(this._audioTrack.length||this._videoTrack.length)&&this._onDataAvailable(this._audioTrack,this._videoTrack):this._audioInitialMetadataDispatched=!0,this._dispatch=!1,this._onTrackMetadata("audio",a);var J=this._mediaInfo;J.audioCodec=a.originalCodec,J.audioSampleRate=a.audioSampleRate,J.audioChannelCount=a.channelCount,J.hasVideo?null!=J.videoCodec&&(J.mimeType='video/x-flv; codecs="'+J.videoCodec+","+J.audioCodec+'"'):J.mimeType='video/x-flv; codecs="'+J.audioCodec+'"',J.isComplete()&&this._onMediaInfo(J)},e.prototype._parseFlacAudioData=function(e,t,l,a){var i=this._audioTrack,n=new Uint8Array(e,t,l),o=this._timestampBase+a,c={unit:n,length:n.byteLength,dts:o,pts:o};i.samples.push(c),i.length+=n.length},e.prototype._parseVideoData=function(e,t,l,a,i){if(l<=1)n.a.w(this.TAG,"Flv: Invalid video packet, missing VideoData payload!");else if(!0!==this._hasVideoFlagOverrided||!1!==this._hasVideo){var o=new Uint8Array(e,t,l)[0],c=(112&o)>>>4;if(128&o){var d=15&o,g=String.fromCharCode.apply(String,new Uint8Array(e,t,l).slice(1,5));if("hvc1"===g)this._parseEnhancedHEVCVideoPacket(e,t+5,l-5,a,i,c,d);else{if("av01"!==g)return void this._onError(I.a.CODEC_UNSUPPORTED,"Flv: Unsupported codec in video frame: ".concat(g));this._parseEnhancedAV1VideoPacket(e,t+5,l-5,a,i,c,d)}}else{var s=15&o;if(7===s)this._parseAVCVideoPacket(e,t+1,l-1,a,i,c);else{if(12!==s)return void this._onError(I.a.CODEC_UNSUPPORTED,"Flv: Unsupported codec in video frame: ".concat(s));this._parseHEVCVideoPacket(e,t+1,l-1,a,i,c)}}}},e.prototype._parseAVCVideoPacket=function(e,t,l,a,i,o){if(l<4)n.a.w(this.TAG,"Flv: Invalid AVC packet, missing AVCPacketType or/and CompositionTime");else{var c=this._littleEndian,d=new DataView(e,t,l),g=d.getUint8(0),s=(16777215&d.getUint32(0,!c))<<8>>8;if(0===g)this._parseAVCDecoderConfigurationRecord(e,t+4,l-4);else if(1===g)this._parseAVCVideoData(e,t+4,l-4,a,i,o,s);else if(2!==g)return void this._onError(I.a.FORMAT_ERROR,"Flv: Invalid video packet type ".concat(g))}},e.prototype._parseHEVCVideoPacket=function(e,t,l,a,i,o){if(l<4)n.a.w(this.TAG,"Flv: Invalid HEVC packet, missing HEVCPacketType or/and CompositionTime");else{var c=this._littleEndian,d=new DataView(e,t,l),g=d.getUint8(0),s=(16777215&d.getUint32(0,!c))<<8>>8;if(0===g)this._parseHEVCDecoderConfigurationRecord(e,t+4,l-4);else if(1===g)this._parseHEVCVideoData(e,t+4,l-4,a,i,o,s);else if(2!==g)return void this._onError(I.a.FORMAT_ERROR,"Flv: Invalid video packet type ".concat(g))}},e.prototype._parseEnhancedHEVCVideoPacket=function(e,t,l,a,i,n,o){var c=this._littleEndian,d=new DataView(e,t,l);if(0===o)this._parseHEVCDecoderConfigurationRecord(e,t,l);else if(1===o){var g=(4294967040&d.getUint32(0,!c))>>8;this._parseHEVCVideoData(e,t+3,l-3,a,i,n,g)}else if(3===o)this._parseHEVCVideoData(e,t,l,a,i,n,0);else if(2!==o)return void this._onError(I.a.FORMAT_ERROR,"Flv: Invalid video packet type ".concat(o))},e.prototype._parseEnhancedAV1VideoPacket=function(e,t,l,a,i,n,o){if(this._littleEndian,0===o)this._parseAV1CodecConfigurationRecord(e,t,l);else if(1===o)this._parseAV1VideoData(e,t,l,a,i,n,0);else{if(5===o)return void this._onError(I.a.FORMAT_ERROR,"Flv: Not Supported MP2T AV1 video packet type ".concat(o));if(2!==o)return void this._onError(I.a.FORMAT_ERROR,"Flv: Invalid video packet type ".concat(o))}},e.prototype._parseAVCDecoderConfigurationRecord=function(e,t,l){if(l<7)n.a.w(this.TAG,"Flv: Invalid AVCDecoderConfigurationRecord, lack of data!");else{var a=this._videoMetadata,i=this._videoTrack,o=this._littleEndian,c=new DataView(e,t,l);if(a){if(void 0!==a.avcc){var d=new Uint8Array(e,t,l);if(y(d,a.avcc))return;n.a.w(this.TAG,"AVCDecoderConfigurationRecord has been changed, re-generate initialization segment")}}else!1===this._hasVideo&&!1===this._hasVideoFlagOverrided&&(this._hasVideo=!0,this._mediaInfo.hasVideo=!0),(a=this._videoMetadata={}).type="video",a.id=i.id,a.timescale=this._timescale,a.duration=this._duration;var g=c.getUint8(0),s=c.getUint8(1);if(c.getUint8(2),c.getUint8(3),1===g&&0!==s)if(this._naluLengthSize=1+(3&c.getUint8(4)),3===this._naluLengthSize||4===this._naluLengthSize){var C=31&c.getUint8(5);if(0!==C){C>1&&n.a.w(this.TAG,"Flv: Strange AVCDecoderConfigurationRecord: SPS Count = ".concat(C));for(var m=6,h=0;h<C;h++){var r=c.getUint16(m,!o);if(m+=2,0!==r){var J=new Uint8Array(e,t+m,r);m+=r;var u=Z.parseSPS(J);if(0===h){a.codecWidth=u.codec_size.width,a.codecHeight=u.codec_size.height,a.presentWidth=u.present_size.width,a.presentHeight=u.present_size.height,a.profile=u.profile_string,a.level=u.level_string,a.bitDepth=u.bit_depth,a.chromaFormat=u.chroma_format,a.sarRatio=u.sar_ratio,a.frameRate=u.frame_rate,!1!==u.frame_rate.fixed&&0!==u.frame_rate.fps_num&&0!==u.frame_rate.fps_den||(a.frameRate=this._referenceFrameRate);var b=a.frameRate.fps_den,G=a.frameRate.fps_num;a.refSampleDuration=a.timescale*(b/G);for(var p=J.subarray(1,4),W="avc1.",X=0;X<3;X++){var V=p[X].toString(16);V.length<2&&(V="0"+V),W+=V}a.codec=W;var R=this._mediaInfo;R.width=a.codecWidth,R.height=a.codecHeight,R.fps=a.frameRate.fps,R.profile=a.profile,R.level=a.level,R.refFrames=u.ref_frames,R.chromaFormat=u.chroma_format_string,R.sarNum=a.sarRatio.width,R.sarDen=a.sarRatio.height,R.videoCodec=W,R.hasAudio?null!=R.audioCodec&&(R.mimeType='video/x-flv; codecs="'+R.videoCodec+","+R.audioCodec+'"'):R.mimeType='video/x-flv; codecs="'+R.videoCodec+'"',R.isComplete()&&this._onMediaInfo(R)}}}var k=c.getUint8(m);if(0!==k){for(k>1&&n.a.w(this.TAG,"Flv: Strange AVCDecoderConfigurationRecord: PPS Count = ".concat(k)),m++,h=0;h<k;h++)r=c.getUint16(m,!o),m+=2,0!==r&&(m+=r);a.avcc=new Uint8Array(l),a.avcc.set(new Uint8Array(e,t,l),0),n.a.v(this.TAG,"Parsed AVCDecoderConfigurationRecord"),this._isInitialMetadataDispatched()?this._dispatch&&(this._audioTrack.length||this._videoTrack.length)&&this._onDataAvailable(this._audioTrack,this._videoTrack):this._videoInitialMetadataDispatched=!0,this._dispatch=!1,this._onTrackMetadata("video",a)}else this._onError(I.a.FORMAT_ERROR,"Flv: Invalid AVCDecoderConfigurationRecord: No PPS")}else this._onError(I.a.FORMAT_ERROR,"Flv: Invalid AVCDecoderConfigurationRecord: No SPS")}else this._onError(I.a.FORMAT_ERROR,"Flv: Strange NaluLengthSizeMinusOne: ".concat(this._naluLengthSize-1));else this._onError(I.a.FORMAT_ERROR,"Flv: Invalid AVCDecoderConfigurationRecord")}},e.prototype._parseHEVCDecoderConfigurationRecord=function(e,t,l){if(l<22)n.a.w(this.TAG,"Flv: Invalid HEVCDecoderConfigurationRecord, lack of data!");else{var a=this._videoMetadata,i=this._videoTrack,o=this._littleEndian,c=new DataView(e,t,l);if(a){if(void 0!==a.hvcc){var d=new Uint8Array(e,t,l);if(y(d,a.hvcc))return;n.a.w(this.TAG,"HEVCDecoderConfigurationRecord has been changed, re-generate initialization segment")}}else!1===this._hasVideo&&!1===this._hasVideoFlagOverrided&&(this._hasVideo=!0,this._mediaInfo.hasVideo=!0),(a=this._videoMetadata={}).type="video",a.id=i.id,a.timescale=this._timescale,a.duration=this._duration;var g=c.getUint8(0),s=31&c.getUint8(1);if(0!==g&&1!==g||0===s)this._onError(I.a.FORMAT_ERROR,"Flv: Invalid HEVCDecoderConfigurationRecord");else if(this._naluLengthSize=1+(3&c.getUint8(21)),3===this._naluLengthSize||4===this._naluLengthSize){for(var C=c.getUint8(22),m=0,h=23;m<C;m++){var r=63&c.getUint8(h+0),Z=c.getUint16(h+1,!o);h+=3;for(var u=0;u<Z;u++){var b=c.getUint16(h+0,!o);if(0===u)if(33===r){h+=2;var G=new Uint8Array(e,t+h,b),p=J.parseSPS(G);a.codecWidth=p.codec_size.width,a.codecHeight=p.codec_size.height,a.presentWidth=p.present_size.width,a.presentHeight=p.present_size.height,a.profile=p.profile_string,a.level=p.level_string,a.bitDepth=p.bit_depth,a.chromaFormat=p.chroma_format,a.sarRatio=p.sar_ratio,a.frameRate=p.frame_rate,!1!==p.frame_rate.fixed&&0!==p.frame_rate.fps_num&&0!==p.frame_rate.fps_den||(a.frameRate=this._referenceFrameRate);var W=a.frameRate.fps_den,X=a.frameRate.fps_num;a.refSampleDuration=a.timescale*(W/X),a.codec=p.codec_mimetype;var V=this._mediaInfo;V.width=a.codecWidth,V.height=a.codecHeight,V.fps=a.frameRate.fps,V.profile=a.profile,V.level=a.level,V.refFrames=p.ref_frames,V.chromaFormat=p.chroma_format_string,V.sarNum=a.sarRatio.width,V.sarDen=a.sarRatio.height,V.videoCodec=p.codec_mimetype,V.hasAudio?null!=V.audioCodec&&(V.mimeType='video/x-flv; codecs="'+V.videoCodec+","+V.audioCodec+'"'):V.mimeType='video/x-flv; codecs="'+V.videoCodec+'"',V.isComplete()&&this._onMediaInfo(V),h+=b}else h+=2+b;else h+=2+b}}a.hvcc=new Uint8Array(l),a.hvcc.set(new Uint8Array(e,t,l),0),n.a.v(this.TAG,"Parsed HEVCDecoderConfigurationRecord"),this._isInitialMetadataDispatched()?this._dispatch&&(this._audioTrack.length||this._videoTrack.length)&&this._onDataAvailable(this._audioTrack,this._videoTrack):this._videoInitialMetadataDispatched=!0,this._dispatch=!1,this._onTrackMetadata("video",a)}else this._onError(I.a.FORMAT_ERROR,"Flv: Strange NaluLengthSizeMinusOne: ".concat(this._naluLengthSize-1))}},e.prototype._parseAV1CodecConfigurationRecord=function(e,t,l){if(l<4)n.a.w(this.TAG,"Flv: Invalid AV1CodecConfigurationRecord, lack of data!");else{var a=this._videoMetadata,i=this._videoTrack,o=(this._littleEndian,new DataView(e,t,l));a?void 0!==a.av1c&&n.a.w(this.TAG,"Found another AV1CodecConfigurationRecord!"):(!1===this._hasVideo&&!1===this._hasVideoFlagOverrided&&(this._hasVideo=!0,this._mediaInfo.hasVideo=!0),(a=this._videoMetadata={}).type="video",a.id=i.id,a.timescale=this._timescale,a.duration=this._duration);var c=127&o.getUint8(0);if(o.getUint8(1),o.getUint8(1),o.getUint8(2),1===c){var d=X.parseOBUs(new Uint8Array(e,t+4,l-4));if(null!=d){a.profile=d.profile_string,a.level=d.level_string,a.bitDepth=d.bit_depth,a.chromaFormat=d.chroma_format,a.frameRate=d.frame_rate,!1!==d.frame_rate.fixed&&0!==d.frame_rate.fps_num&&0!==d.frame_rate.fps_den||(a.frameRate=this._referenceFrameRate);var g=a.frameRate.fps_den,s=a.frameRate.fps_num;a.refSampleDuration=a.timescale*(g/s),a.codec=d.codec_mimetype,a.extra=d;var C=this._mediaInfo;C.fps=a.frameRate.fps,C.profile=a.profile,C.level=a.level,C.refFrames=d.ref_frames,C.chromaFormat=d.chroma_format_string,C.videoCodec=d.codec_mimetype,C.hasAudio?null!=C.audioCodec&&(C.mimeType='video/x-flv; codecs="'+C.videoCodec+","+C.audioCodec+'"'):C.mimeType='video/x-flv; codecs="'+C.videoCodec+'"',C.isComplete()&&this._onMediaInfo(C),a.av1c=new Uint8Array(l),a.av1c.set(new Uint8Array(e,t,l),0),n.a.v(this.TAG,"Preparing AV1CodecConfigurationRecord")}else this._onError(I.a.FORMAT_ERROR,"Flv: Invalid AV1CodecConfigurationRecord")}else this._onError(I.a.FORMAT_ERROR,"Flv: Invalid AV1CodecConfigurationRecord")}},e.prototype._parseAVCVideoData=function(e,t,l,a,i,o,c){for(var d=this._littleEndian,g=new DataView(e,t,l),s=[],C=0,m=0,h=this._naluLengthSize,r=this._timestampBase+a,Z=1===o;m<l;){if(m+4>=l){n.a.w(this.TAG,"Malformed Nalu near timestamp ".concat(r,", offset = ").concat(m,", dataSize = ").concat(l));break}var I=g.getUint32(m,!d);if(3===h&&(I>>>=8),I>l-h)return void n.a.w(this.TAG,"Malformed Nalus near timestamp ".concat(r,", NaluSize > DataSize!"));var J=31&g.getUint8(m+h);5===J&&(Z=!0);var u=new Uint8Array(e,t+m,h+I),b={type:J,data:u};s.push(b),C+=u.byteLength,m+=h+I}if(s.length){var G=this._videoTrack,p={units:s,length:C,isKeyframe:Z,dts:r,cts:c,pts:r+c};Z&&(p.fileposition=i),G.samples.push(p),G.length+=C}},e.prototype._parseHEVCVideoData=function(e,t,l,a,i,o,c){for(var d=this._littleEndian,g=new DataView(e,t,l),s=[],C=0,m=0,h=this._naluLengthSize,r=this._timestampBase+a,Z=1===o;m<l;){if(m+4>=l){n.a.w(this.TAG,"Malformed Nalu near timestamp ".concat(r,", offset = ").concat(m,", dataSize = ").concat(l));break}var I=g.getUint32(m,!d);if(3===h&&(I>>>=8),I>l-h)return void n.a.w(this.TAG,"Malformed Nalus near timestamp ".concat(r,", NaluSize > DataSize!"));var J=g.getUint8(m+h)>>1&63;19!==J&&20!==J&&21!==J||(Z=!0);var u=new Uint8Array(e,t+m,h+I),b={type:J,data:u};s.push(b),C+=u.byteLength,m+=h+I}if(s.length){var G=this._videoTrack,p={units:s,length:C,isKeyframe:Z,dts:r,cts:c,pts:r+c};Z&&(p.fileposition=i),G.samples.push(p),G.length+=C}},e.prototype._parseAV1VideoData=function(e,t,l,a,i,o,c){this._littleEndian;var d,g=[],s=this._timestampBase+a,C=1===o;if(C){var m=this._videoMetadata,h=X.parseOBUs(new Uint8Array(e,t,l),m.extra);if(null==h)return void this._onError(I.a.FORMAT_ERROR,"Flv: Invalid AV1 VideoData");console.log(h),m.codecWidth=h.codec_size.width,m.codecHeight=h.codec_size.height,m.presentWidth=h.present_size.width,m.presentHeight=h.present_size.height,m.sarRatio=h.sar_ratio;var r=this._mediaInfo;r.width=m.codecWidth,r.height=m.codecHeight,r.sarNum=m.sarRatio.width,r.sarDen=m.sarRatio.height,n.a.v(this.TAG,"Parsed AV1DecoderConfigurationRecord"),this._isInitialMetadataDispatched()?this._dispatch&&(this._audioTrack.length||this._videoTrack.length)&&this._onDataAvailable(this._audioTrack,this._videoTrack):this._videoInitialMetadataDispatched=!0,this._dispatch=!1,this._onTrackMetadata("video",m)}if(d=l,g.push({unitType:0,data:new Uint8Array(e,t+0,l)}),g.length){var Z=this._videoTrack,J={units:g,length:d,isKeyframe:C,dts:s,cts:c,pts:s+c};C&&(J.fileposition=i),Z.samples.push(J),Z.length+=d}},e}(),R=function(){function e(){}return e.prototype.destroy=function(){this.onError=null,this.onMediaInfo=null,this.onMetaDataArrived=null,this.onTrackMetadata=null,this.onDataAvailable=null,this.onTimedID3Metadata=null,this.onSynchronousKLVMetadata=null,this.onAsynchronousKLVMetadata=null,this.onSMPTE2038Metadata=null,this.onSCTE35Metadata=null,this.onPESPrivateData=null,this.onPESPrivateDataDescriptor=null},e}(),k=function(){this.program_pmt_pid={}};!function(e){e[e.kMPEG1Audio=3]="kMPEG1Audio",e[e.kMPEG2Audio=4]="kMPEG2Audio",e[e.kPESPrivateData=6]="kPESPrivateData",e[e.kADTSAAC=15]="kADTSAAC",e[e.kLOASAAC=17]="kLOASAAC",e[e.kAC3=129]="kAC3",e[e.kEAC3=135]="kEAC3",e[e.kMetadata=21]="kMetadata",e[e.kSCTE35=134]="kSCTE35",e[e.kH264=27]="kH264",e[e.kH265=36]="kH265"}(p||(p={}));var B,S=function(){this.pid_stream_type={},this.common_pids={h264:void 0,h265:void 0,av1:void 0,adts_aac:void 0,loas_aac:void 0,opus:void 0,ac3:void 0,eac3:void 0,mp3:void 0},this.pes_private_data_pids={},this.timed_id3_pids={},this.synchronous_klv_pids={},this.asynchronous_klv_pids={},this.scte_35_pids={},this.smpte2038_pids={}},Y=function(){},A=function(){},Q=function(){this.slices=[],this.total_length=0,this.expected_length=0,this.file_position=0};!function(e){e[e.kUnspecified=0]="kUnspecified",e[e.kSliceNonIDR=1]="kSliceNonIDR",e[e.kSliceDPA=2]="kSliceDPA",e[e.kSliceDPB=3]="kSliceDPB",e[e.kSliceDPC=4]="kSliceDPC",e[e.kSliceIDR=5]="kSliceIDR",e[e.kSliceSEI=6]="kSliceSEI",e[e.kSliceSPS=7]="kSliceSPS",e[e.kSlicePPS=8]="kSlicePPS",e[e.kSliceAUD=9]="kSliceAUD",e[e.kEndOfSequence=10]="kEndOfSequence",e[e.kEndOfStream=11]="kEndOfStream",e[e.kFiller=12]="kFiller",e[e.kSPSExt=13]="kSPSExt",e[e.kReserved0=14]="kReserved0"}(B||(B={}));var K,F,_=function(){},f=function(e){var t=e.data.byteLength;this.type=e.type,this.data=new Uint8Array(4+t),new DataView(this.data.buffer).setUint32(0,t),this.data.set(e.data,4)},w=function(){function e(e){this.TAG="H264AnnexBParser",this.current_startcode_offset_=0,this.eof_flag_=!1,this.data_=e,this.current_startcode_offset_=this.findNextStartCodeOffset(0),this.eof_flag_&&n.a.e(this.TAG,"Could not find H264 startcode until payload end!")}return e.prototype.findNextStartCodeOffset=function(e){for(var t=e,l=this.data_;;){if(t+3>=l.byteLength)return this.eof_flag_=!0,l.byteLength;var a=l[t+0]<<24|l[t+1]<<16|l[t+2]<<8|l[t+3],i=l[t+0]<<16|l[t+1]<<8|l[t+2];if(1===a||1===i)return t;t++}},e.prototype.readNextNaluPayload=function(){for(var e=this.data_,t=null;null==t&&!this.eof_flag_;){var l=this.current_startcode_offset_,a=31&e[l+=1==(e[l]<<24|e[l+1]<<16|e[l+2]<<8|e[l+3])?4:3],i=(128&e[l])>>>7,n=this.findNextStartCodeOffset(l);if(this.current_startcode_offset_=n,!(a>=B.kReserved0)&&0===i){var o=e.subarray(l,n);(t=new _).type=a,t.data=o}}return t},e}(),H=function(){function e(e,t,l){var a=8+e.byteLength+1+2+t.byteLength,i=!1;66!==e[3]&&77!==e[3]&&88!==e[3]&&(i=!0,a+=4);var n=this.data=new Uint8Array(a);n[0]=1,n[1]=e[1],n[2]=e[2],n[3]=e[3],n[4]=255,n[5]=225;var o=e.byteLength;n[6]=o>>>8,n[7]=255&o;var c=8;n.set(e,8),n[c+=o]=1;var d=t.byteLength;n[c+1]=d>>>8,n[c+2]=255&d,n.set(t,c+3),c+=3+d,i&&(n[c]=252|l.chroma_format_idc,n[c+1]=248|l.bit_depth_luma-8,n[c+2]=248|l.bit_depth_chroma-8,n[c+3]=0,c+=4)}return e.prototype.getData=function(){return this.data},e}();!function(e){e[e.kNull=0]="kNull",e[e.kAACMain=1]="kAACMain",e[e.kAAC_LC=2]="kAAC_LC",e[e.kAAC_SSR=3]="kAAC_SSR",e[e.kAAC_LTP=4]="kAAC_LTP",e[e.kAAC_SBR=5]="kAAC_SBR",e[e.kAAC_Scalable=6]="kAAC_Scalable",e[e.kLayer1=32]="kLayer1",e[e.kLayer2=33]="kLayer2",e[e.kLayer3=34]="kLayer3"}(K||(K={})),function(e){e[e.k96000Hz=0]="k96000Hz",e[e.k88200Hz=1]="k88200Hz",e[e.k64000Hz=2]="k64000Hz",e[e.k48000Hz=3]="k48000Hz",e[e.k44100Hz=4]="k44100Hz",e[e.k32000Hz=5]="k32000Hz",e[e.k24000Hz=6]="k24000Hz",e[e.k22050Hz=7]="k22050Hz",e[e.k16000Hz=8]="k16000Hz",e[e.k12000Hz=9]="k12000Hz",e[e.k11025Hz=10]="k11025Hz",e[e.k8000Hz=11]="k8000Hz",e[e.k7350Hz=12]="k7350Hz"}(F||(F={}));var v,N,z=[96e3,88200,64e3,48e3,44100,32e3,24e3,22050,16e3,12e3,11025,8e3,7350],L=(v=function(e,t){return(v=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var l in t)Object.prototype.hasOwnProperty.call(t,l)&&(e[l]=t[l])})(e,t)},function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");function l(){this.constructor=e}v(e,t),e.prototype=null===t?Object.create(t):(l.prototype=t.prototype,new l)}),U=function(){},M=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return L(t,e),t}(U),T=function(){function e(e){this.TAG="AACADTSParser",this.data_=e,this.current_syncword_offset_=this.findNextSyncwordOffset(0),this.eof_flag_&&n.a.e(this.TAG,"Could not found ADTS syncword until payload end")}return e.prototype.findNextSyncwordOffset=function(e){for(var t=e,l=this.data_;;){if(t+7>=l.byteLength)return this.eof_flag_=!0,l.byteLength;if(4095==(l[t+0]<<8|l[t+1])>>>4)return t;t++}},e.prototype.readNextAACFrame=function(){for(var e=this.data_,t=null;null==t&&!this.eof_flag_;){var l=this.current_syncword_offset_,a=(8&e[l+1])>>>3,i=(6&e[l+1])>>>1,n=1&e[l+1],o=(192&e[l+2])>>>6,c=(60&e[l+2])>>>2,d=(1&e[l+2])<<2|(192&e[l+3])>>>6,g=(3&e[l+3])<<11|e[l+4]<<3|(224&e[l+5])>>>5;if(e[l+6],l+g>this.data_.byteLength){this.eof_flag_=!0,this.has_last_incomplete_data=!0;break}var s=1===n?7:9,C=g-s;l+=s;var m=this.findNextSyncwordOffset(l+C);if(this.current_syncword_offset_=m,(0===a||1===a)&&0===i){var h=e.subarray(l,l+C);(t=new U).audio_object_type=o+1,t.sampling_freq_index=c,t.sampling_frequency=z[c],t.channel_config=d,t.data=h}}return t},e.prototype.hasIncompleteData=function(){return this.has_last_incomplete_data},e.prototype.getIncompleteData=function(){return this.has_last_incomplete_data?this.data_.subarray(this.current_syncword_offset_):null},e}(),D=function(){function e(e){this.TAG="AACLOASParser",this.data_=e,this.current_syncword_offset_=this.findNextSyncwordOffset(0),this.eof_flag_&&n.a.e(this.TAG,"Could not found LOAS syncword until payload end")}return e.prototype.findNextSyncwordOffset=function(e){for(var t=e,l=this.data_;;){if(t+1>=l.byteLength)return this.eof_flag_=!0,l.byteLength;if(695==(l[t+0]<<3|l[t+1]>>>5))return t;t++}},e.prototype.getLATMValue=function(e){for(var t=e.readBits(2),l=0,a=0;a<=t;a++)l<<=8,l|=e.readByte();return l},e.prototype.readNextAACFrame=function(e){for(var t=this.data_,l=null;null==l&&!this.eof_flag_;){var a=this.current_syncword_offset_,i=(31&t[a+1])<<8|t[a+2];if(a+3+i>=this.data_.byteLength){this.eof_flag_=!0,this.has_last_incomplete_data=!0;break}var o=new r(t.subarray(a+3,a+3+i)),c=null;if(o.readBool()){if(null==e){n.a.w(this.TAG,"StreamMuxConfig Missing"),this.current_syncword_offset_=this.findNextSyncwordOffset(a+3+i),o.destroy();continue}c=e}else{var d=o.readBool();if(d&&o.readBool()){n.a.e(this.TAG,"audioMuxVersionA is Not Supported"),o.destroy();break}if(d&&this.getLATMValue(o),!o.readBool()){n.a.e(this.TAG,"allStreamsSameTimeFraming zero is Not Supported"),o.destroy();break}if(0!==o.readBits(6)){n.a.e(this.TAG,"more than 2 numSubFrames Not Supported"),o.destroy();break}if(0!==o.readBits(4)){n.a.e(this.TAG,"more than 2 numProgram Not Supported"),o.destroy();break}if(0!==o.readBits(3)){n.a.e(this.TAG,"more than 2 numLayer Not Supported"),o.destroy();break}var g=d?this.getLATMValue(o):0,s=o.readBits(5);g-=5;var C=o.readBits(4);g-=4;var m=o.readBits(4);g-=4,o.readBits(3),(g-=3)>0&&o.readBits(g);var h=o.readBits(3);if(0!==h){n.a.e(this.TAG,"frameLengthType = ".concat(h,". Only frameLengthType = 0 Supported")),o.destroy();break}o.readByte();var Z=o.readBool();if(Z)if(d)this.getLATMValue(o);else{for(var I=0;;){I<<=8;var J=o.readBool();if(I+=o.readByte(),!J)break}console.log(I)}o.readBool()&&o.readByte(),(c=new M).audio_object_type=s,c.sampling_freq_index=C,c.sampling_frequency=z[c.sampling_freq_index],c.channel_config=m,c.other_data_present=Z}for(var u=0;;){var b=o.readByte();if(u+=b,255!==b)break}for(var G=new Uint8Array(u),p=0;p<u;p++)G[p]=o.readByte();(l=new M).audio_object_type=c.audio_object_type,l.sampling_freq_index=c.sampling_freq_index,l.sampling_frequency=z[c.sampling_freq_index],l.channel_config=c.channel_config,l.other_data_present=c.other_data_present,l.data=G,this.current_syncword_offset_=this.findNextSyncwordOffset(a+3+i)}return l},e.prototype.hasIncompleteData=function(){return this.has_last_incomplete_data},e.prototype.getIncompleteData=function(){return this.has_last_incomplete_data?this.data_.subarray(this.current_syncword_offset_):null},e}(),E=function(e){var t=null,l=e.audio_object_type,a=e.audio_object_type,i=e.sampling_freq_index,n=e.channel_config,o=0,c=navigator.userAgent.toLowerCase();-1!==c.indexOf("firefox")?i>=6?(a=5,t=new Array(4),o=i-3):(a=2,t=new Array(2),o=i):-1!==c.indexOf("android")?(a=2,t=new Array(2),o=i):(a=5,o=i,t=new Array(4),i>=6?o=i-3:1===n&&(a=2,t=new Array(2),o=i)),t[0]=a<<3,t[0]|=(15&i)>>>1,t[1]=(15&i)<<7,t[1]|=(15&n)<<3,5===a&&(t[1]|=(15&o)>>>1,t[2]=(1&o)<<7,t[2]|=8,t[3]=0),this.config=t,this.sampling_rate=z[i],this.channel_count=n,this.codec_mimetype="mp4a.40."+a,this.original_codec_mimetype="mp4a.40."+l},O=function(){},x=function(){};!function(e){e[e.kSpliceNull=0]="kSpliceNull",e[e.kSpliceSchedule=4]="kSpliceSchedule",e[e.kSpliceInsert=5]="kSpliceInsert",e[e.kTimeSignal=6]="kTimeSignal",e[e.kBandwidthReservation=7]="kBandwidthReservation",e[e.kPrivateCommand=255]="kPrivateCommand"}(N||(N={}));var P,j=function(e){var t=e.readBool();return t?(e.readBits(6),{time_specified_flag:t,pts_time:4*e.readBits(31)+e.readBits(2)}):(e.readBits(7),{time_specified_flag:t})},q=function(e){var t=e.readBool();return e.readBits(6),{auto_return:t,duration:4*e.readBits(31)+e.readBits(2)}},$=function(e,t){var l=t.readBits(8);return e?{component_tag:l}:{component_tag:l,splice_time:j(t)}},ee=function(e){return{component_tag:e.readBits(8),utc_splice_time:e.readBits(32)}},te=function(e){var t=e.readBits(32),l=e.readBool();e.readBits(7);var a={splice_event_id:t,splice_event_cancel_indicator:l};if(l)return a;if(a.out_of_network_indicator=e.readBool(),a.program_splice_flag=e.readBool(),a.duration_flag=e.readBool(),e.readBits(5),a.program_splice_flag)a.utc_splice_time=e.readBits(32);else{a.component_count=e.readBits(8),a.components=[];for(var i=0;i<a.component_count;i++)a.components.push(ee(e))}return a.duration_flag&&(a.break_duration=q(e)),a.unique_program_id=e.readBits(16),a.avail_num=e.readBits(8),a.avails_expected=e.readBits(8),a},le=function(e,t,l,a){return{descriptor_tag:e,descriptor_length:t,identifier:l,provider_avail_id:a.readBits(32)}},ae=function(e,t,l,a){var i=a.readBits(8),n=a.readBits(3);a.readBits(5);for(var o="",c=0;c<n;c++)o+=String.fromCharCode(a.readBits(8));return{descriptor_tag:e,descriptor_length:t,identifier:l,preroll:i,dtmf_count:n,DTMF_char:o}},ie=function(e){var t=e.readBits(8);return e.readBits(7),{component_tag:t,pts_offset:4*e.readBits(31)+e.readBits(2)}},ne=function(e,t,l,a){var i=a.readBits(32),n=a.readBool();a.readBits(7);var o={descriptor_tag:e,descriptor_length:t,identifier:l,segmentation_event_id:i,segmentation_event_cancel_indicator:n};if(n)return o;if(o.program_segmentation_flag=a.readBool(),o.segmentation_duration_flag=a.readBool(),o.delivery_not_restricted_flag=a.readBool(),o.delivery_not_restricted_flag?a.readBits(5):(o.web_delivery_allowed_flag=a.readBool(),o.no_regional_blackout_flag=a.readBool(),o.archive_allowed_flag=a.readBool(),o.device_restrictions=a.readBits(2)),!o.program_segmentation_flag){o.component_count=a.readBits(8),o.components=[];for(var c=0;c<o.component_count;c++)o.components.push(ie(a))}o.segmentation_duration_flag&&(o.segmentation_duration=a.readBits(40)),o.segmentation_upid_type=a.readBits(8),o.segmentation_upid_length=a.readBits(8);var d=new Uint8Array(o.segmentation_upid_length);for(c=0;c<o.segmentation_upid_length;c++)d[c]=a.readBits(8);return o.segmentation_upid=d.buffer,o.segmentation_type_id=a.readBits(8),o.segment_num=a.readBits(8),o.segments_expected=a.readBits(8),52!==o.segmentation_type_id&&54!==o.segmentation_type_id&&56!==o.segmentation_type_id&&58!==o.segmentation_type_id||(o.sub_segment_num=a.readBits(8),o.sub_segments_expected=a.readBits(8)),o},oe=function(e,t,l,a){return{descriptor_tag:e,descriptor_length:t,identifier:l,TAI_seconds:a.readBits(48),TAI_ns:a.readBits(32),UTC_offset:a.readBits(16)}},ce=function(e){return{component_tag:e.readBits(8),ISO_code:String.fromCharCode(e.readBits(8),e.readBits(8),e.readBits(8)),Bit_Stream_Mode:e.readBits(3),Num_Channels:e.readBits(4),Full_Srvc_Audio:e.readBool()}},de=function(e,t,l,a){for(var i=a.readBits(4),n=[],o=0;o<i;o++)n.push(ce(a));return{descriptor_tag:e,descriptor_length:t,identifier:l,audio_count:i,components:n}},ge=function(e){var t=new r(e),l=t.readBits(8),a=t.readBool(),i=t.readBool();t.readBits(2);var n=t.readBits(12),o=t.readBits(8),c=t.readBool(),d=t.readBits(6),g=4*t.readBits(31)+t.readBits(2),s=t.readBits(8),C=t.readBits(12),m=t.readBits(12),h=t.readBits(8),Z=null;h===N.kSpliceNull?Z={}:h===N.kSpliceSchedule?Z=function(e){for(var t=e.readBits(8),l=[],a=0;a<t;a++)l.push(te(e));return{splice_count:t,events:l}}(t):h===N.kSpliceInsert?Z=function(e){var t=e.readBits(32),l=e.readBool();e.readBits(7);var a={splice_event_id:t,splice_event_cancel_indicator:l};if(l)return a;if(a.out_of_network_indicator=e.readBool(),a.program_splice_flag=e.readBool(),a.duration_flag=e.readBool(),a.splice_immediate_flag=e.readBool(),e.readBits(4),a.program_splice_flag&&!a.splice_immediate_flag&&(a.splice_time=j(e)),!a.program_splice_flag){a.component_count=e.readBits(8),a.components=[];for(var i=0;i<a.component_count;i++)a.components.push($(a.splice_immediate_flag,e))}return a.duration_flag&&(a.break_duration=q(e)),a.unique_program_id=e.readBits(16),a.avail_num=e.readBits(8),a.avails_expected=e.readBits(8),a}(t):h===N.kTimeSignal?Z=function(e){return{splice_time:j(e)}}(t):h===N.kBandwidthReservation?Z={}:h===N.kPrivateCommand?Z=function(e,t){for(var l=String.fromCharCode(t.readBits(8),t.readBits(8),t.readBits(8),t.readBits(8)),a=new Uint8Array(e-4),i=0;i<e-4;i++)a[i]=t.readBits(8);return{identifier:l,private_data:a.buffer}}(m,t):t.readBits(8*m);for(var I=[],J=t.readBits(16),u=0;u<J;){var b=t.readBits(8),G=t.readBits(8),p=String.fromCharCode(t.readBits(8),t.readBits(8),t.readBits(8),t.readBits(8));0===b?I.push(le(b,G,p,t)):1===b?I.push(ae(b,G,p,t)):2===b?I.push(ne(b,G,p,t)):3===b?I.push(oe(b,G,p,t)):4===b?I.push(de(b,G,p,t)):t.readBits(8*(G-4)),u+=2+G}var y={table_id:l,section_syntax_indicator:a,private_indicator:i,section_length:n,protocol_version:o,encrypted_packet:c,encryption_algorithm:d,pts_adjustment:g,cw_index:s,tier:C,splice_command_length:m,splice_command_type:h,splice_command:Z,descriptor_loop_length:J,splice_descriptors:I,E_CRC32:c?t.readBits(32):void 0,CRC32:t.readBits(32)};if(h===N.kSpliceInsert){var W=Z;if(W.splice_event_cancel_indicator)return{splice_command_type:h,detail:y,data:e};if(W.program_splice_flag&&!W.splice_immediate_flag){var X=W.duration_flag?W.break_duration.auto_return:void 0,V=W.duration_flag?W.break_duration.duration/90:void 0;return W.splice_time.time_specified_flag?{splice_command_type:h,pts:(g+W.splice_time.pts_time)%Math.pow(2,33),auto_return:X,duraiton:V,detail:y,data:e}:{splice_command_type:h,auto_return:X,duraiton:V,detail:y,data:e}}return{splice_command_type:h,auto_return:X=W.duration_flag?W.break_duration.auto_return:void 0,duraiton:V=W.duration_flag?W.break_duration.duration/90:void 0,detail:y,data:e}}if(h===N.kTimeSignal){var R=Z;return R.splice_time.time_specified_flag?{splice_command_type:h,pts:(g+R.splice_time.pts_time)%Math.pow(2,33),detail:y,data:e}:{splice_command_type:h,detail:y,data:e}}return{splice_command_type:h,detail:y,data:e}};!function(e){e[e.kSliceIDR_W_RADL=19]="kSliceIDR_W_RADL",e[e.kSliceIDR_N_LP=20]="kSliceIDR_N_LP",e[e.kSliceCRA_NUT=21]="kSliceCRA_NUT",e[e.kSliceVPS=32]="kSliceVPS",e[e.kSliceSPS=33]="kSliceSPS",e[e.kSlicePPS=34]="kSlicePPS",e[e.kSliceAUD=35]="kSliceAUD"}(P||(P={}));var se=function(){},Ce=function(e){var t=e.data.byteLength;this.type=e.type,this.data=new Uint8Array(4+t),new DataView(this.data.buffer).setUint32(0,t),this.data.set(e.data,4)},me=function(){function e(e){this.TAG="H265AnnexBParser",this.current_startcode_offset_=0,this.eof_flag_=!1,this.data_=e,this.current_startcode_offset_=this.findNextStartCodeOffset(0),this.eof_flag_&&n.a.e(this.TAG,"Could not find H265 startcode until payload end!")}return e.prototype.findNextStartCodeOffset=function(e){for(var t=e,l=this.data_;;){if(t+3>=l.byteLength)return this.eof_flag_=!0,l.byteLength;var a=l[t+0]<<24|l[t+1]<<16|l[t+2]<<8|l[t+3],i=l[t+0]<<16|l[t+1]<<8|l[t+2];if(1===a||1===i)return t;t++}},e.prototype.readNextNaluPayload=function(){for(var e=this.data_,t=null;null==t&&!this.eof_flag_;){var l=this.current_startcode_offset_,a=e[l+=1==(e[l]<<24|e[l+1]<<16|e[l+2]<<8|e[l+3])?4:3]>>1&63,i=(128&e[l])>>>7,n=this.findNextStartCodeOffset(l);if(this.current_startcode_offset_=n,0===i){var o=e.subarray(l,n);(t=new se).type=a,t.data=o}}return t},e}(),he=function(){function e(e,t,l,a){var i=23+(5+e.byteLength)+(5+t.byteLength)+(5+l.byteLength),n=this.data=new Uint8Array(i);n[0]=1,n[1]=(3&a.general_profile_space)<<6|(a.general_tier_flag?1:0)<<5|31&a.general_profile_idc,n[2]=a.general_profile_compatibility_flags_1,n[3]=a.general_profile_compatibility_flags_2,n[4]=a.general_profile_compatibility_flags_3,n[5]=a.general_profile_compatibility_flags_4,n[6]=a.general_constraint_indicator_flags_1,n[7]=a.general_constraint_indicator_flags_2,n[8]=a.general_constraint_indicator_flags_3,n[9]=a.general_constraint_indicator_flags_4,n[10]=a.general_constraint_indicator_flags_5,n[11]=a.general_constraint_indicator_flags_6,n[12]=a.general_level_idc,n[13]=240|(3840&a.min_spatial_segmentation_idc)>>8,n[14]=255&a.min_spatial_segmentation_idc,n[15]=252|3&a.parallelismType,n[16]=252|3&a.chroma_format_idc,n[17]=248|7&a.bit_depth_luma_minus8,n[18]=248|7&a.bit_depth_chroma_minus8,n[19]=0,n[20]=0,n[21]=(3&a.constant_frame_rate)<<6|(7&a.num_temporal_layers)<<3|(a.temporal_id_nested?1:0)<<2|3,n[22]=3,n[23]=128|P.kSliceVPS,n[24]=0,n[25]=1,n[26]=(65280&e.byteLength)>>8,n[27]=255&e.byteLength,n.set(e,28),n[23+(5+e.byteLength)+0]=128|P.kSliceSPS,n[23+(5+e.byteLength)+1]=0,n[23+(5+e.byteLength)+2]=1,n[23+(5+e.byteLength)+3]=(65280&t.byteLength)>>8,n[23+(5+e.byteLength)+4]=255&t.byteLength,n.set(t,23+(5+e.byteLength)+5),n[23+(5+e.byteLength+5+t.byteLength)+0]=128|P.kSlicePPS,n[23+(5+e.byteLength+5+t.byteLength)+1]=0,n[23+(5+e.byteLength+5+t.byteLength)+2]=1,n[23+(5+e.byteLength+5+t.byteLength)+3]=(65280&l.byteLength)>>8,n[23+(5+e.byteLength+5+t.byteLength)+4]=255&l.byteLength,n.set(l,23+(5+e.byteLength+5+t.byteLength)+5)}return e.prototype.getData=function(){return this.data},e}(),re=function(){},Ze=function(){},Ie=function(){},Je=[[64,64,80,80,96,96,112,112,128,128,160,160,192,192,224,224,256,256,320,320,384,384,448,448,512,512,640,640,768,768,896,896,1024,1024,1152,1152,1280,1280],[69,70,87,88,104,105,121,122,139,140,174,175,208,209,243,244,278,279,348,349,417,418,487,488,557,558,696,697,835,836,975,976,1114,1115,1253,1254,1393,1394],[96,96,120,120,144,144,168,168,192,192,240,240,288,288,336,336,384,384,480,480,576,576,672,672,768,768,960,960,1152,1152,1344,1344,1536,1536,1728,1728,1920,1920]],ue=function(){function e(e){this.TAG="AC3Parser",this.data_=e,this.current_syncword_offset_=this.findNextSyncwordOffset(0),this.eof_flag_&&n.a.e(this.TAG,"Could not found AC3 syncword until payload end")}return e.prototype.findNextSyncwordOffset=function(e){for(var t=e,l=this.data_;;){if(t+7>=l.byteLength)return this.eof_flag_=!0,l.byteLength;if(2935==(l[t+0]<<8|l[t+1]))return t;t++}},e.prototype.readNextAC3Frame=function(){for(var e=this.data_,t=null;null==t&&!this.eof_flag_;){var l=this.current_syncword_offset_,a=e[l+4]>>6,i=[48e3,44200,33e3][a],n=63&e[l+4],o=2*Je[a][n];if(isNaN(o)||l+o>this.data_.byteLength){this.eof_flag_=!0,this.has_last_incomplete_data=!0;break}var c=this.findNextSyncwordOffset(l+o);this.current_syncword_offset_=c;var d=e[l+5]>>3,g=7&e[l+5],s=e[l+6]>>5,C=0;!!(1&s)&&1!==s&&(C+=2),!!(4&s)&&(C+=2),2===s&&(C+=2);var m=(e[l+6]<<8|e[l+7])>>12-C&1,h=[2,1,2,3,3,4,4,5][s]+m;(t=new Ie).sampling_frequency=i,t.channel_count=h,t.channel_mode=s,t.bit_stream_identification=d,t.low_frequency_effects_channel_on=m,t.bit_stream_mode=g,t.frame_size_code=n,t.data=e.subarray(l,l+o)}return t},e.prototype.hasIncompleteData=function(){return this.has_last_incomplete_data},e.prototype.getIncompleteData=function(){return this.has_last_incomplete_data?this.data_.subarray(this.current_syncword_offset_):null},e}(),be=function(e){var t;t=[e.sampling_rate_code<<6|e.bit_stream_identification<<1|e.bit_stream_mode>>2,(3&e.bit_stream_mode)<<6|e.channel_mode<<3|e.low_frequency_effects_channel_on<<2|e.frame_size_code>>4,e.frame_size_code<<4&224],this.config=t,this.sampling_rate=e.sampling_frequency,this.bit_stream_identification=e.bit_stream_identification,this.bit_stream_mode=e.bit_stream_mode,this.low_frequency_effects_channel_on=e.low_frequency_effects_channel_on,this.channel_count=e.channel_count,this.channel_mode=e.channel_mode,this.codec_mimetype="ac-3",this.original_codec_mimetype="ac-3"},Ge=function(){},pe=function(){function e(e){this.TAG="EAC3Parser",this.data_=e,this.current_syncword_offset_=this.findNextSyncwordOffset(0),this.eof_flag_&&n.a.e(this.TAG,"Could not found AC3 syncword until payload end")}return e.prototype.findNextSyncwordOffset=function(e){for(var t=e,l=this.data_;;){if(t+7>=l.byteLength)return this.eof_flag_=!0,l.byteLength;if(2935==(l[t+0]<<8|l[t+1]))return t;t++}},e.prototype.readNextEAC3Frame=function(){for(var e=this.data_,t=null;null==t&&!this.eof_flag_;){var l=this.current_syncword_offset_,a=new r(e.subarray(l+2)),i=(a.readBits(2),a.readBits(3),a.readBits(11)+1<<1),n=a.readBits(2),o=null,c=null;3===n?(o=[24e3,22060,16e3][n=a.readBits(2)],c=3):(o=[48e3,44100,32e3][n],c=a.readBits(2));var d=a.readBits(3),g=a.readBits(1),s=a.readBits(5);if(l+i>this.data_.byteLength){this.eof_flag_=!0,this.has_last_incomplete_data=!0;break}var C=this.findNextSyncwordOffset(l+i);this.current_syncword_offset_=C;var m=[2,1,2,3,3,4,4,5][d]+g;a.destroy(),(t=new Ge).sampling_frequency=o,t.channel_count=m,t.channel_mode=d,t.bit_stream_identification=s,t.low_frequency_effects_channel_on=g,t.frame_size=i,t.num_blks=[1,2,3,6][c],t.data=e.subarray(l,l+i)}return t},e.prototype.hasIncompleteData=function(){return this.has_last_incomplete_data},e.prototype.getIncompleteData=function(){return this.has_last_incomplete_data?this.data_.subarray(this.current_syncword_offset_):null},e}(),ye=function(e){var t,l=Math.floor(e.frame_size*e.sampling_frequency/(16*e.num_blks));t=[255&l,248&l,e.sampling_rate_code<<6|e.bit_stream_identification<<1,e.channel_mode<<1|e.low_frequency_effects_channel_on,0],this.config=t,this.sampling_rate=e.sampling_frequency,this.bit_stream_identification=e.bit_stream_identification,this.num_blks=e.num_blks,this.low_frequency_effects_channel_on=e.low_frequency_effects_channel_on,this.channel_count=e.channel_count,this.channel_mode=e.channel_mode,this.codec_mimetype="ec-3",this.original_codec_mimetype="ec-3"},We=function(){},Xe=function(){function e(e){this.TAG="AV1OBUInMpegTsParser",this.current_startcode_offset_=0,this.eof_flag_=!1,this.data_=e,this.current_startcode_offset_=this.findNextStartCodeOffset(0),this.eof_flag_&&n.a.e(this.TAG,"Could not find AV1 startcode until payload end!")}return e._ebsp2rbsp=function(e){for(var t=e,l=t.byteLength,a=new Uint8Array(l),i=0,n=0;n<l;n++)n>=2&&3===t[n]&&0===t[n-1]&&0===t[n-2]||(a[i]=t[n],i++);return new Uint8Array(a.buffer,0,i)},e.prototype.findNextStartCodeOffset=function(e){for(var t=e,l=this.data_;;){if(t+2>=l.byteLength)return this.eof_flag_=!0,l.byteLength;if(1==(l[t+0]<<16|l[t+1]<<8|l[t+2]))return t;t++}},e.prototype.readNextOBUPayload=function(){for(var t=this.data_,l=null;null==l&&!this.eof_flag_;){var a=this.current_startcode_offset_+3,i=this.findNextStartCodeOffset(a);this.current_startcode_offset_=i,l=e._ebsp2rbsp(t.subarray(a,i))}return l},e}(),Ve=function(){var e=function(t,l){return(e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var l in t)Object.prototype.hasOwnProperty.call(t,l)&&(e[l]=t[l])})(t,l)};return function(t,l){if("function"!=typeof l&&null!==l)throw new TypeError("Class extends value "+String(l)+" is not a constructor or null");function a(){this.constructor=t}e(t,l),t.prototype=null===l?Object.create(l):(a.prototype=l.prototype,new a)}}(),Re=function(){return(Re=Object.assign||function(e){for(var t,l=1,a=arguments.length;l<a;l++)for(var i in t=arguments[l])Object.prototype.hasOwnProperty.call(t,i)&&(e[i]=t[i]);return e}).apply(this,arguments)},ke=function(e){function t(t,l){var a=e.call(this)||this;return a.TAG="TSDemuxer",a.first_parse_=!0,a.media_info_=new c.a,a.timescale_=90,a.duration_=0,a.current_pmt_pid_=-1,a.program_pmt_map_={},a.pes_slice_queues_={},a.section_slice_queues_={},a.video_metadata_={vps:void 0,sps:void 0,pps:void 0,av1c:void 0,details:void 0},a.audio_metadata_={codec:void 0,audio_object_type:void 0,sampling_freq_index:void 0,sampling_frequency:void 0,channel_config:void 0},a.last_pcr_base_=NaN,a.timestamp_offset_=0,a.audio_last_sample_pts_=void 0,a.aac_last_incomplete_data_=null,a.has_video_=!1,a.has_audio_=!1,a.video_init_segment_dispatched_=!1,a.audio_init_segment_dispatched_=!1,a.video_metadata_changed_=!1,a.audio_metadata_changed_=!1,a.loas_previous_frame=null,a.video_track_={type:"video",id:1,sequenceNumber:0,samples:[],length:0},a.audio_track_={type:"audio",id:2,sequenceNumber:0,samples:[],length:0},a.ts_packet_size_=t.ts_packet_size,a.sync_offset_=t.sync_offset,a.config_=l,a}return Ve(t,e),t.prototype.destroy=function(){this.media_info_=null,this.pes_slice_queues_=null,this.section_slice_queues_=null,this.video_metadata_=null,this.audio_metadata_=null,this.aac_last_incomplete_data_=null,this.video_track_=null,this.audio_track_=null,e.prototype.destroy.call(this)},t.probe=function(e){var t=new Uint8Array(e),l=-1,a=188;if(t.byteLength<=3*a)return{needMoreData:!0};for(;-1===l;){for(var i=Math.min(1e3,t.byteLength-3*a),o=0;o<i;){if(71===t[o]&&71===t[o+a]&&71===t[o+2*a]){l=o;break}o++}if(-1===l)if(188===a)a=192;else{if(192!==a)break;a=204}}return-1===l?{match:!1}:(192===a&&l>=4?(n.a.v("TSDemuxer","ts_packet_size = 192, m2ts mode"),l-=4):204===a&&n.a.v("TSDemuxer","ts_packet_size = 204, RS encoded MPEG2-TS stream"),{match:!0,consumed:0,ts_packet_size:a,sync_offset:l})},t.prototype.bindDataSource=function(e){return e.onDataArrival=this.parseChunks.bind(this),this},t.prototype.resetMediaInfo=function(){this.media_info_=new c.a},t.prototype.parseChunks=function(e,t){if(!(this.onError&&this.onMediaInfo&&this.onTrackMetadata&&this.onDataAvailable))throw new C.a("onError & onMediaInfo & onTrackMetadata & onDataAvailable callback must be specified");var l=0;for(this.first_parse_&&(this.first_parse_=!1,l=this.sync_offset_);l+this.ts_packet_size_<=e.byteLength;){var a=t+l;192===this.ts_packet_size_&&(l+=4);var i=new Uint8Array(e,l,188),o=i[0];if(71!==o){n.a.e(this.TAG,"sync_byte = ".concat(o,", not 0x47"));break}var c=(64&i[1])>>>6,d=(i[1],(31&i[1])<<8|i[2]),g=(48&i[3])>>>4,s=15&i[3],m=!(!this.pmt_||this.pmt_.pcr_pid!==d),h={},r=4;if(2==g||3==g){var Z=i[4];if(Z>0&&(m||3==g)&&(h.discontinuity_indicator=(128&i[5])>>>7,h.random_access_indicator=(64&i[5])>>>6,h.elementary_stream_priority_indicator=(32&i[5])>>>5,(16&i[5])>>>4)){var I=300*this.getPcrBase(i)+((1&i[10])<<8|i[11]);this.last_pcr_=I}if(2==g||5+Z===188){l+=188,204===this.ts_packet_size_&&(l+=16);continue}r=5+Z}if(1==g||3==g)if(0===d||d===this.current_pmt_pid_||null!=this.pmt_&&this.pmt_.pid_stream_type[d]===p.kSCTE35){var J=188-r;this.handleSectionSlice(e,l+r,J,{pid:d,file_position:a,payload_unit_start_indicator:c,continuity_conunter:s,random_access_indicator:h.random_access_indicator})}else if(null!=this.pmt_&&null!=this.pmt_.pid_stream_type[d]){J=188-r;var u=this.pmt_.pid_stream_type[d];d!==this.pmt_.common_pids.h264&&d!==this.pmt_.common_pids.h265&&d!==this.pmt_.common_pids.av1&&d!==this.pmt_.common_pids.adts_aac&&d!==this.pmt_.common_pids.loas_aac&&d!==this.pmt_.common_pids.ac3&&d!==this.pmt_.common_pids.eac3&&d!==this.pmt_.common_pids.opus&&d!==this.pmt_.common_pids.mp3&&!0!==this.pmt_.pes_private_data_pids[d]&&!0!==this.pmt_.timed_id3_pids[d]&&!0!==this.pmt_.synchronous_klv_pids[d]&&!0!==this.pmt_.asynchronous_klv_pids[d]||this.handlePESSlice(e,l+r,J,{pid:d,stream_type:u,file_position:a,payload_unit_start_indicator:c,continuity_conunter:s,random_access_indicator:h.random_access_indicator})}l+=188,204===this.ts_packet_size_&&(l+=16)}return this.dispatchAudioVideoMediaSegment(),l},t.prototype.handleSectionSlice=function(e,t,l,a){var i=new Uint8Array(e,t,l),n=this.section_slice_queues_[a.pid];if(a.payload_unit_start_indicator){var o=i[0];if(null!=n&&0!==n.total_length){var c=new Uint8Array(e,t+1,Math.min(l,o));n.slices.push(c),n.total_length+=c.byteLength,n.total_length===n.expected_length?this.emitSectionSlices(n,a):this.clearSlices(n,a)}for(var d=1+o;d<i.byteLength&&255!==i[d+0];){var g=(15&i[d+1])<<8|i[d+2];this.section_slice_queues_[a.pid]=new Q,(n=this.section_slice_queues_[a.pid]).expected_length=g+3,n.file_position=a.file_position,n.random_access_indicator=a.random_access_indicator,c=new Uint8Array(e,t+d,Math.min(l-d,n.expected_length-n.total_length)),n.slices.push(c),n.total_length+=c.byteLength,n.total_length===n.expected_length?this.emitSectionSlices(n,a):n.total_length>=n.expected_length&&this.clearSlices(n,a),d+=c.byteLength}}else null!=n&&0!==n.total_length&&(c=new Uint8Array(e,t,Math.min(l,n.expected_length-n.total_length)),n.slices.push(c),n.total_length+=c.byteLength,n.total_length===n.expected_length?this.emitSectionSlices(n,a):n.total_length>=n.expected_length&&this.clearSlices(n,a))},t.prototype.handlePESSlice=function(e,t,l,a){var i=new Uint8Array(e,t,l),o=i[0]<<16|i[1]<<8|i[2],c=(i[3],i[4]<<8|i[5]);if(a.payload_unit_start_indicator){if(1!==o)return void n.a.e(this.TAG,"handlePESSlice: packet_start_code_prefix should be 1 but with value ".concat(o));var d=this.pes_slice_queues_[a.pid];d&&(0===d.expected_length||d.expected_length===d.total_length?this.emitPESSlices(d,a):this.clearSlices(d,a)),this.pes_slice_queues_[a.pid]=new Q,this.pes_slice_queues_[a.pid].file_position=a.file_position,this.pes_slice_queues_[a.pid].random_access_indicator=a.random_access_indicator}if(null!=this.pes_slice_queues_[a.pid]){var g=this.pes_slice_queues_[a.pid];g.slices.push(i),a.payload_unit_start_indicator&&(g.expected_length=0===c?0:c+6),g.total_length+=i.byteLength,g.expected_length>0&&g.expected_length===g.total_length?this.emitPESSlices(g,a):g.expected_length>0&&g.expected_length<g.total_length&&this.clearSlices(g,a)}},t.prototype.emitSectionSlices=function(e,t){for(var l=new Uint8Array(e.total_length),a=0,i=0;a<e.slices.length;a++){var n=e.slices[a];l.set(n,i),i+=n.byteLength}e.slices=[],e.expected_length=-1,e.total_length=0;var o=new A;o.pid=t.pid,o.data=l,o.file_position=e.file_position,o.random_access_indicator=e.random_access_indicator,this.parseSection(o)},t.prototype.emitPESSlices=function(e,t){for(var l=new Uint8Array(e.total_length),a=0,i=0;a<e.slices.length;a++){var n=e.slices[a];l.set(n,i),i+=n.byteLength}e.slices=[],e.expected_length=-1,e.total_length=0;var o=new Y;o.pid=t.pid,o.data=l,o.stream_type=t.stream_type,o.file_position=e.file_position,o.random_access_indicator=e.random_access_indicator,this.parsePES(o)},t.prototype.clearSlices=function(e,t){e.slices=[],e.expected_length=-1,e.total_length=0},t.prototype.parseSection=function(e){var t=e.data,l=e.pid;0===l?this.parsePAT(t):l===this.current_pmt_pid_?this.parsePMT(t):null!=this.pmt_&&this.pmt_.scte_35_pids[l]&&this.parseSCTE35(t)},t.prototype.parsePES=function(e){var t=e.data,l=t[0]<<16|t[1]<<8|t[2],a=t[3],i=t[4]<<8|t[5];if(1===l)if(188!==a&&190!==a&&191!==a&&240!==a&&241!==a&&255!==a&&242!==a&&248!==a){t[6];var o=(192&t[7])>>>6,c=t[8],d=void 0,g=void 0;2!==o&&3!==o||(d=this.getTimestamp(t,9),g=3===o?this.getTimestamp(t,14):d);var s=9+c,C=void 0;if(0!==i){if(i<3+c)return void n.a.v(this.TAG,"Malformed PES: PES_packet_length < 3 + PES_header_data_length");C=i-3-c}else C=t.byteLength-s;var m=t.subarray(s,s+C);switch(e.stream_type){case p.kMPEG1Audio:case p.kMPEG2Audio:this.parseMP3Payload(m,d);break;case p.kPESPrivateData:this.pmt_.common_pids.av1===e.pid?this.parseAV1Payload(m,d,g,e.file_position,e.random_access_indicator):this.pmt_.common_pids.opus===e.pid?this.parseOpusPayload(m,d):this.pmt_.common_pids.ac3===e.pid?this.parseAC3Payload(m,d):this.pmt_.common_pids.eac3===e.pid?this.parseEAC3Payload(m,d):this.pmt_.asynchronous_klv_pids[e.pid]?this.parseAsynchronousKLVMetadataPayload(m,e.pid,a):this.pmt_.smpte2038_pids[e.pid]?this.parseSMPTE2038MetadataPayload(m,d,g,e.pid,a):this.parsePESPrivateDataPayload(m,d,g,e.pid,a);break;case p.kADTSAAC:this.parseADTSAACPayload(m,d);break;case p.kLOASAAC:this.parseLOASAACPayload(m,d);break;case p.kAC3:this.parseAC3Payload(m,d);break;case p.kEAC3:this.parseEAC3Payload(m,d);break;case p.kMetadata:this.pmt_.timed_id3_pids[e.pid]?this.parseTimedID3MetadataPayload(m,d,g,e.pid,a):this.pmt_.synchronous_klv_pids[e.pid]&&this.parseSynchronousKLVMetadataPayload(m,d,g,e.pid,a);break;case p.kH264:this.parseH264Payload(m,d,g,e.file_position,e.random_access_indicator);break;case p.kH265:this.parseH265Payload(m,d,g,e.file_position,e.random_access_indicator)}}else 188!==a&&191!==a&&240!==a&&241!==a&&255!==a&&242!==a&&248!==a||e.stream_type!==p.kPESPrivateData||(s=6,C=void 0,C=0!==i?i:t.byteLength-s,m=t.subarray(s,s+C),this.parsePESPrivateDataPayload(m,void 0,void 0,e.pid,a));else n.a.e(this.TAG,"parsePES: packet_start_code_prefix should be 1 but with value ".concat(l))},t.prototype.parsePAT=function(e){var t=e[0];if(0===t){var l=(15&e[1])<<8|e[2],a=(e[3],e[4],(62&e[5])>>>1),i=1&e[5],o=e[6],c=(e[7],null);if(1===i&&0===o)(c=new k).version_number=a;else if(null==(c=this.pat_))return;for(var d=l-5-4,g=-1,s=-1,C=8;C<8+d;C+=4){var m=e[C]<<8|e[C+1],h=(31&e[C+2])<<8|e[C+3];0===m?c.network_pid=h:(c.program_pmt_pid[m]=h,-1===g&&(g=m),-1===s&&(s=h))}1===i&&0===o&&(null==this.pat_&&n.a.v(this.TAG,"Parsed first PAT: ".concat(JSON.stringify(c))),this.pat_=c,this.current_program_=g,this.current_pmt_pid_=s)}else n.a.e(this.TAG,"parsePAT: table_id ".concat(t," is not corresponded to PAT!"))},t.prototype.parsePMT=function(e){var t=e[0];if(2===t){var l=(15&e[1])<<8|e[2],a=e[3]<<8|e[4],i=(62&e[5])>>>1,o=1&e[5],c=e[6],d=(e[7],null);if(1===o&&0===c)(d=new S).program_number=a,d.version_number=i,this.program_pmt_map_[a]=d;else if(null==(d=this.program_pmt_map_[a]))return;d.pcr_pid=(31&e[8])<<8|e[9];for(var g=(15&e[10])<<8|e[11],s=12+g,C=l-9-g-4,m=s;m<s+C;){var h=e[m],r=(31&e[m+1])<<8|e[m+2],Z=(15&e[m+3])<<8|e[m+4];d.pid_stream_type[r]=h;var I=d.common_pids.h264||d.common_pids.h265,J=d.common_pids.adts_aac||d.common_pids.loas_aac||d.common_pids.ac3||d.common_pids.eac3||d.common_pids.opus||d.common_pids.mp3;if(h!==p.kH264||I)if(h!==p.kH265||I)if(h!==p.kADTSAAC||J)if(h!==p.kLOASAAC||J)if(h!==p.kAC3||J)if(h!==p.kEAC3||J)if(h!==p.kMPEG1Audio&&h!==p.kMPEG2Audio||J)if(h===p.kPESPrivateData){if(d.pes_private_data_pids[r]=!0,Z>0){for(var u=m+5;u<m+5+Z;){var b=e[u+0],G=e[u+1];if(5===b){var y=String.fromCharCode.apply(String,Array.from(e.subarray(u+2,u+2+G)));"VANC"===y?d.smpte2038_pids[r]=!0:"AV01"===y?d.common_pids.av1=r:"Opus"===y?d.common_pids.opus=r:"KLVA"===y&&(d.asynchronous_klv_pids[r]=!0)}else if(127===b){if(r===d.common_pids.opus){var W=null;if(128===e[u+2]&&(W=e[u+3]),null==W){n.a.e(this.TAG,"Not Supported Opus channel count.");continue}var X={codec:"opus",channel_count:15&W?15&W:2,channel_config_code:W,sample_rate:48e3},V={codec:"opus",meta:X};0==this.audio_init_segment_dispatched_?(this.audio_metadata_=X,this.dispatchAudioInitSegment(V)):this.detectAudioMetadataChange(V)&&(this.dispatchAudioMediaSegment(),this.dispatchAudioInitSegment(V))}}else 128===b&&r===d.common_pids.av1&&(this.video_metadata_.av1c=e.subarray(u+2,u+2+G));u+=2+G}var R=e.subarray(m+5,m+5+Z);this.dispatchPESPrivateDataDescriptor(r,h,R)}}else if(h===p.kMetadata){if(Z>0)for(u=m+5;u<m+5+Z;){b=e[u+0];var k=e[u+1];if(38===b){var B=e[u+2]<<8|e[u+3],Y=null;65535===B&&(Y=String.fromCharCode.apply(String,Array.from(e.subarray(u+4,u+4+4))));var A=null;if(255===e[u+4+(65535===B?4:0)]){var Q=4+(65535===B?4:0)+1;A=String.fromCharCode.apply(String,Array.from(e.subarray(u+Q,u+Q+4)))}"ID3 "===Y&&"ID3 "===A?d.timed_id3_pids[r]=!0:"KLVA"===A&&(d.synchronous_klv_pids[r]=!0)}u+=2+k}}else h===p.kSCTE35&&(d.scte_35_pids[r]=!0);else d.common_pids.mp3=r;else d.common_pids.eac3=r;else d.common_pids.ac3=r;else d.common_pids.loas_aac=r;else d.common_pids.adts_aac=r;else d.common_pids.h265=r;else d.common_pids.h264=r;m+=5+Z}a===this.current_program_&&(null==this.pmt_&&n.a.v(this.TAG,"Parsed first PMT: ".concat(JSON.stringify(d))),this.pmt_=d,(d.common_pids.h264||d.common_pids.h265||d.common_pids.av1)&&(this.has_video_=!0),(d.common_pids.adts_aac||d.common_pids.loas_aac||d.common_pids.ac3||d.common_pids.opus||d.common_pids.mp3)&&(this.has_audio_=!0))}else n.a.e(this.TAG,"parsePMT: table_id ".concat(t," is not corresponded to PMT!"))},t.prototype.parseSCTE35=function(e){var t=ge(e);if(null!=t.pts){var l=Math.floor(t.pts/this.timescale_);t.pts=l}else t.nearest_pts=this.getNearestTimestampMilliseconds();this.onSCTE35Metadata&&this.onSCTE35Metadata(t)},t.prototype.parseAV1Payload=function(e,t,l,a,i){for(var n=new Xe(e),o=null,c=[],d=0,g=!1,s=null;null!=(o=n.readNextOBUPayload());){if((s=X.parseOBUs(o,this.video_metadata_.details))&&!0===s.keyframe)if(this.video_init_segment_dispatched_){var C;!0===this.detectVideoMetadataChange(null,s)&&(this.video_metadata_changed_=!0,this.dispatchVideoMediaSegment(),(C=new Uint8Array(new ArrayBuffer(this.video_metadata_.av1c.byteLength+s.sequence_header_data.byteLength))).set(this.video_metadata_.av1c,0),C.set(s.sequence_header_data,this.video_metadata_.av1c.byteLength),s.av1c=C,this.dispatchVideoInitSegment())}else(C=new Uint8Array(new ArrayBuffer(this.video_metadata_.av1c.byteLength+s.sequence_header_data.byteLength))).set(this.video_metadata_.av1c,0),C.set(s.sequence_header_data,this.video_metadata_.av1c.byteLength),s.av1c=C,this.video_metadata_.details=s,this.dispatchVideoInitSegment();this.video_metadata_.details=s,g||(g=s.keyframe),c.push({data:o}),d+=o.byteLength}var m=Math.floor(t/this.timescale_),h=Math.floor(l/this.timescale_);if(c.length){var r=this.video_track_,Z={units:c,length:d,isKeyframe:g,dts:h,pts:m,cts:m-h,file_position:a};r.samples.push(Z),r.length+=d}},t.prototype.parseH264Payload=function(e,t,l,a,i){for(var o=new w(e),c=null,d=[],g=0,s=!1;null!=(c=o.readNextNaluPayload());){var C=new f(c);if(C.type===B.kSliceSPS){var m=Z.parseSPS(c.data);this.video_init_segment_dispatched_?!0===this.detectVideoMetadataChange(C,m)&&(n.a.v(this.TAG,"H264: Critical h264 metadata has been changed, attempt to re-generate InitSegment"),this.video_metadata_changed_=!0,this.video_metadata_={vps:void 0,sps:C,pps:void 0,av1c:void 0,details:m}):(this.video_metadata_.sps=C,this.video_metadata_.details=m)}else C.type===B.kSlicePPS?this.video_init_segment_dispatched_&&!this.video_metadata_changed_||(this.video_metadata_.pps=C,this.video_metadata_.sps&&this.video_metadata_.pps&&(this.video_metadata_changed_&&this.dispatchVideoMediaSegment(),this.dispatchVideoInitSegment())):(C.type===B.kSliceIDR||C.type===B.kSliceNonIDR&&1===i)&&(s=!0);this.video_init_segment_dispatched_&&(d.push(C),g+=C.data.byteLength)}var h=Math.floor(t/this.timescale_),r=Math.floor(l/this.timescale_);if(d.length){var I=this.video_track_,J={units:d,length:g,isKeyframe:s,dts:r,pts:h,cts:h-r,file_position:a};I.samples.push(J),I.length+=g}},t.prototype.parseH265Payload=function(e,t,l,a,i){for(var o=new me(e),c=null,d=[],g=0,s=!1;null!=(c=o.readNextNaluPayload());){var C=new Ce(c);if(C.type===P.kSliceVPS){if(!this.video_init_segment_dispatched_){var m=J.parseVPS(c.data);this.video_metadata_.vps=C,this.video_metadata_.details=Re(Re({},this.video_metadata_.details),m)}}else C.type===P.kSliceSPS?(m=J.parseSPS(c.data),this.video_init_segment_dispatched_?!0===this.detectVideoMetadataChange(C,m)&&(n.a.v(this.TAG,"H265: Critical h265 metadata has been changed, attempt to re-generate InitSegment"),this.video_metadata_changed_=!0,this.video_metadata_={vps:void 0,sps:C,pps:void 0,av1c:void 0,details:m}):(this.video_metadata_.sps=C,this.video_metadata_.details=Re(Re({},this.video_metadata_.details),m))):C.type===P.kSlicePPS?this.video_init_segment_dispatched_&&!this.video_metadata_changed_||(m=J.parsePPS(c.data),this.video_metadata_.pps=C,this.video_metadata_.details=Re(Re({},this.video_metadata_.details),m),this.video_metadata_.vps&&this.video_metadata_.sps&&this.video_metadata_.pps&&(this.video_metadata_changed_&&this.dispatchVideoMediaSegment(),this.dispatchVideoInitSegment())):C.type!==P.kSliceIDR_W_RADL&&C.type!==P.kSliceIDR_N_LP&&C.type!==P.kSliceCRA_NUT||(s=!0);this.video_init_segment_dispatched_&&(d.push(C),g+=C.data.byteLength)}var h=Math.floor(t/this.timescale_),r=Math.floor(l/this.timescale_);if(d.length){var Z=this.video_track_,I={units:d,length:g,isKeyframe:s,dts:r,pts:h,cts:h-r,file_position:a};Z.samples.push(I),Z.length+=g}},t.prototype.detectVideoMetadataChange=function(e,t){if(t.codec_mimetype!==this.video_metadata_.details.codec_mimetype)return n.a.v(this.TAG,"Video: Codec mimeType changed from "+"".concat(this.video_metadata_.details.codec_mimetype," to ").concat(t.codec_mimetype)),!0;if(t.codec_size.width!==this.video_metadata_.details.codec_size.width||t.codec_size.height!==this.video_metadata_.details.codec_size.height){var l=this.video_metadata_.details.codec_size,a=t.codec_size;return n.a.v(this.TAG,"Video: Coded Resolution changed from "+"".concat(l.width,"x").concat(l.height," to ").concat(a.width,"x").concat(a.height)),!0}return t.present_size.width!==this.video_metadata_.details.present_size.width&&(n.a.v(this.TAG,"Video: Present resolution width changed from "+"".concat(this.video_metadata_.details.present_size.width," to ").concat(t.present_size.width)),!0)},t.prototype.isInitSegmentDispatched=function(){return this.has_video_&&this.has_audio_?this.video_init_segment_dispatched_&&this.audio_init_segment_dispatched_:this.has_video_&&!this.has_audio_?this.video_init_segment_dispatched_:!(this.has_video_||!this.has_audio_)&&this.audio_init_segment_dispatched_},t.prototype.dispatchVideoInitSegment=function(){var e=this.video_metadata_.details,t={type:"video"};t.id=this.video_track_.id,t.timescale=1e3,t.duration=this.duration_,t.codecWidth=e.codec_size.width,t.codecHeight=e.codec_size.height,t.presentWidth=e.present_size.width,t.presentHeight=e.present_size.height,t.profile=e.profile_string,t.level=e.level_string,t.bitDepth=e.bit_depth,t.chromaFormat=e.chroma_format,t.sarRatio=e.sar_ratio,t.frameRate=e.frame_rate;var l=t.frameRate.fps_den,a=t.frameRate.fps_num;if(t.refSampleDuration=l/a*1e3,t.codec=e.codec_mimetype,this.video_metadata_.av1c)t.av1c=this.video_metadata_.av1c,0==this.video_init_segment_dispatched_&&n.a.v(this.TAG,"Generated first AV1 for mimeType: ".concat(t.codec));else if(this.video_metadata_.vps){var i=this.video_metadata_.vps.data.subarray(4),o=this.video_metadata_.sps.data.subarray(4),c=this.video_metadata_.pps.data.subarray(4),d=new he(i,o,c,e);t.hvcc=d.getData(),0==this.video_init_segment_dispatched_&&n.a.v(this.TAG,"Generated first HEVCDecoderConfigurationRecord for mimeType: ".concat(t.codec))}else{o=this.video_metadata_.sps.data.subarray(4),c=this.video_metadata_.pps.data.subarray(4);var g=new H(o,c,e);t.avcc=g.getData(),0==this.video_init_segment_dispatched_&&n.a.v(this.TAG,"Generated first AVCDecoderConfigurationRecord for mimeType: ".concat(t.codec))}this.onTrackMetadata("video",t),this.video_init_segment_dispatched_=!0,this.video_metadata_changed_=!1;var s=this.media_info_;s.hasVideo=!0,s.width=t.codecWidth,s.height=t.codecHeight,s.fps=t.frameRate.fps,s.profile=t.profile,s.level=t.level,s.refFrames=e.ref_frames,s.chromaFormat=e.chroma_format_string,s.sarNum=t.sarRatio.width,s.sarDen=t.sarRatio.height,s.videoCodec=t.codec,s.hasAudio&&s.audioCodec?s.mimeType='video/mp2t; codecs="'.concat(s.videoCodec,",").concat(s.audioCodec,'"'):s.mimeType='video/mp2t; codecs="'.concat(s.videoCodec,'"'),s.isComplete()&&this.onMediaInfo(s)},t.prototype.dispatchVideoMediaSegment=function(){this.isInitSegmentDispatched()&&this.video_track_.length&&this.onDataAvailable(null,this.video_track_)},t.prototype.dispatchAudioMediaSegment=function(){this.isInitSegmentDispatched()&&this.audio_track_.length&&this.onDataAvailable(this.audio_track_,null)},t.prototype.dispatchAudioVideoMediaSegment=function(){this.isInitSegmentDispatched()&&(this.audio_track_.length||this.video_track_.length)&&this.onDataAvailable(this.audio_track_,this.video_track_)},t.prototype.parseADTSAACPayload=function(e,t){if(!this.has_video_||this.video_init_segment_dispatched_){if(this.aac_last_incomplete_data_){var l=new Uint8Array(e.byteLength+this.aac_last_incomplete_data_.byteLength);l.set(this.aac_last_incomplete_data_,0),l.set(e,this.aac_last_incomplete_data_.byteLength),e=l}var a,i;if(null!=t&&(i=t/this.timescale_),"aac"===this.audio_metadata_.codec){if(null==t&&null!=this.audio_last_sample_pts_)a=1024/this.audio_metadata_.sampling_frequency*1e3,i=this.audio_last_sample_pts_+a;else if(null==t)return void n.a.w(this.TAG,"AAC: Unknown pts");if(this.aac_last_incomplete_data_&&this.audio_last_sample_pts_){a=1024/this.audio_metadata_.sampling_frequency*1e3;var o=this.audio_last_sample_pts_+a;Math.abs(o-i)>1&&(n.a.w(this.TAG,"AAC: Detected pts overlapped, "+"expected: ".concat(o,"ms, PES pts: ").concat(i,"ms")),i=o)}}for(var c,d=new T(e),g=null,s=i;null!=(g=d.readNextAACFrame());){a=1024/g.sampling_frequency*1e3;var C={codec:"aac",data:g};0==this.audio_init_segment_dispatched_?(this.audio_metadata_={codec:"aac",audio_object_type:g.audio_object_type,sampling_freq_index:g.sampling_freq_index,sampling_frequency:g.sampling_frequency,channel_config:g.channel_config},this.dispatchAudioInitSegment(C)):this.detectAudioMetadataChange(C)&&(this.dispatchAudioMediaSegment(),this.dispatchAudioInitSegment(C)),c=s;var m=Math.floor(s),h={unit:g.data,length:g.data.byteLength,pts:m,dts:m};this.audio_track_.samples.push(h),this.audio_track_.length+=g.data.byteLength,s+=a}d.hasIncompleteData()&&(this.aac_last_incomplete_data_=d.getIncompleteData()),c&&(this.audio_last_sample_pts_=c)}},t.prototype.parseLOASAACPayload=function(e,t){var l;if(!this.has_video_||this.video_init_segment_dispatched_){if(this.aac_last_incomplete_data_){var a=new Uint8Array(e.byteLength+this.aac_last_incomplete_data_.byteLength);a.set(this.aac_last_incomplete_data_,0),a.set(e,this.aac_last_incomplete_data_.byteLength),e=a}var i,o;if(null!=t&&(o=t/this.timescale_),"aac"===this.audio_metadata_.codec){if(null==t&&null!=this.audio_last_sample_pts_)i=1024/this.audio_metadata_.sampling_frequency*1e3,o=this.audio_last_sample_pts_+i;else if(null==t)return void n.a.w(this.TAG,"AAC: Unknown pts");if(this.aac_last_incomplete_data_&&this.audio_last_sample_pts_){i=1024/this.audio_metadata_.sampling_frequency*1e3;var c=this.audio_last_sample_pts_+i;Math.abs(c-o)>1&&(n.a.w(this.TAG,"AAC: Detected pts overlapped, "+"expected: ".concat(c,"ms, PES pts: ").concat(o,"ms")),o=c)}}for(var d,g=new D(e),s=null,C=o;null!=(s=g.readNextAACFrame(null!==(l=this.loas_previous_frame)&&void 0!==l?l:void 0));){this.loas_previous_frame=s,i=1024/s.sampling_frequency*1e3;var m={codec:"aac",data:s};0==this.audio_init_segment_dispatched_?(this.audio_metadata_={codec:"aac",audio_object_type:s.audio_object_type,sampling_freq_index:s.sampling_freq_index,sampling_frequency:s.sampling_frequency,channel_config:s.channel_config},this.dispatchAudioInitSegment(m)):this.detectAudioMetadataChange(m)&&(this.dispatchAudioMediaSegment(),this.dispatchAudioInitSegment(m)),d=C;var h=Math.floor(C),r={unit:s.data,length:s.data.byteLength,pts:h,dts:h};this.audio_track_.samples.push(r),this.audio_track_.length+=s.data.byteLength,C+=i}g.hasIncompleteData()&&(this.aac_last_incomplete_data_=g.getIncompleteData()),d&&(this.audio_last_sample_pts_=d)}},t.prototype.parseAC3Payload=function(e,t){if(!this.has_video_||this.video_init_segment_dispatched_){var l,a;if(null!=t&&(a=t/this.timescale_),"ac-3"===this.audio_metadata_.codec)if(null==t&&null!=this.audio_last_sample_pts_)l=1536/this.audio_metadata_.sampling_frequency*1e3,a=this.audio_last_sample_pts_+l;else if(null==t)return void n.a.w(this.TAG,"AC3: Unknown pts");for(var i,o=new ue(e),c=null,d=a;null!=(c=o.readNextAC3Frame());){l=1536/c.sampling_frequency*1e3;var g={codec:"ac-3",data:c};0==this.audio_init_segment_dispatched_?(this.audio_metadata_={codec:"ac-3",sampling_frequency:c.sampling_frequency,bit_stream_identification:c.bit_stream_identification,bit_stream_mode:c.bit_stream_mode,low_frequency_effects_channel_on:c.low_frequency_effects_channel_on,channel_mode:c.channel_mode},this.dispatchAudioInitSegment(g)):this.detectAudioMetadataChange(g)&&(this.dispatchAudioMediaSegment(),this.dispatchAudioInitSegment(g)),i=d;var s=Math.floor(d),C={unit:c.data,length:c.data.byteLength,pts:s,dts:s};this.audio_track_.samples.push(C),this.audio_track_.length+=c.data.byteLength,d+=l}i&&(this.audio_last_sample_pts_=i)}},t.prototype.parseEAC3Payload=function(e,t){if(!this.has_video_||this.video_init_segment_dispatched_){var l,a;if(null!=t&&(a=t/this.timescale_),"ec-3"===this.audio_metadata_.codec)if(null==t&&null!=this.audio_last_sample_pts_)l=256*this.audio_metadata_.num_blks/this.audio_metadata_.sampling_frequency*1e3,a=this.audio_last_sample_pts_+l;else if(null==t)return void n.a.w(this.TAG,"EAC3: Unknown pts");for(var i,o=new pe(e),c=null,d=a;null!=(c=o.readNextEAC3Frame());){l=1536/c.sampling_frequency*1e3;var g={codec:"ec-3",data:c};0==this.audio_init_segment_dispatched_?(this.audio_metadata_={codec:"ec-3",sampling_frequency:c.sampling_frequency,bit_stream_identification:c.bit_stream_identification,low_frequency_effects_channel_on:c.low_frequency_effects_channel_on,num_blks:c.num_blks,channel_mode:c.channel_mode},this.dispatchAudioInitSegment(g)):this.detectAudioMetadataChange(g)&&(this.dispatchAudioMediaSegment(),this.dispatchAudioInitSegment(g)),i=d;var s=Math.floor(d),C={unit:c.data,length:c.data.byteLength,pts:s,dts:s};this.audio_track_.samples.push(C),this.audio_track_.length+=c.data.byteLength,d+=l}i&&(this.audio_last_sample_pts_=i)}},t.prototype.parseOpusPayload=function(e,t){if(!this.has_video_||this.video_init_segment_dispatched_){var l,a;if(null!=t&&(a=t/this.timescale_),"opus"===this.audio_metadata_.codec)if(null==t&&null!=this.audio_last_sample_pts_)l=20,a=this.audio_last_sample_pts_+l;else if(null==t)return void n.a.w(this.TAG,"Opus: Unknown pts");for(var i,o=a,c=0;c<e.length;){l=20;for(var d=!!(16&e[c+1]),g=!!(8&e[c+1]),s=c+2,C=0;255===e[s];)C+=255,s+=1;C+=e[s],s+=1,s+=d?2:0,s+=g?2:0,i=o;var m=Math.floor(o),h=e.slice(s,s+C),r={unit:h,length:h.byteLength,pts:m,dts:m};this.audio_track_.samples.push(r),this.audio_track_.length+=h.byteLength,o+=l,c=s+C}i&&(this.audio_last_sample_pts_=i)}},t.prototype.parseMP3Payload=function(e,t){if(!this.has_video_||this.video_init_segment_dispatched_){var l=[0,32,64,96,128,160,192,224,256,288,320,352,384,416,448,-1],a=[0,32,48,56,64,80,96,112,128,160,192,224,256,320,384,-1],i=[0,32,40,48,56,64,80,96,112,128,160,192,224,256,320,-1],n=e[1]>>>3&3,o=(6&e[1])>>1,c=(240&e[2])>>>4,d=(12&e[2])>>>2,g=3&~(e[3]>>>6)?2:1,s=0,C=34;switch(n){case 0:s=[11025,12e3,8e3,0][d];break;case 2:s=[22050,24e3,16e3,0][d];break;case 3:s=[44100,48e3,32e3,0][d]}switch(o){case 1:C=34,c<i.length&&i[c];break;case 2:C=33,c<a.length&&a[c];break;case 3:C=32,c<l.length&&l[c]}var m=new Ze;m.object_type=C,m.sample_rate=s,m.channel_count=g,m.data=e;var h={codec:"mp3",data:m};0==this.audio_init_segment_dispatched_?(this.audio_metadata_={codec:"mp3",object_type:C,sample_rate:s,channel_count:g},this.dispatchAudioInitSegment(h)):this.detectAudioMetadataChange(h)&&(this.dispatchAudioMediaSegment(),this.dispatchAudioInitSegment(h));var r={unit:e,length:e.byteLength,pts:t/this.timescale_,dts:t/this.timescale_};this.audio_track_.samples.push(r),this.audio_track_.length+=e.byteLength}},t.prototype.detectAudioMetadataChange=function(e){if(e.codec!==this.audio_metadata_.codec)return n.a.v(this.TAG,"Audio: Audio Codecs changed from "+"".concat(this.audio_metadata_.codec," to ").concat(e.codec)),!0;if("aac"===e.codec&&"aac"===this.audio_metadata_.codec){if((t=e.data).audio_object_type!==this.audio_metadata_.audio_object_type)return n.a.v(this.TAG,"AAC: AudioObjectType changed from "+"".concat(this.audio_metadata_.audio_object_type," to ").concat(t.audio_object_type)),!0;if(t.sampling_freq_index!==this.audio_metadata_.sampling_freq_index)return n.a.v(this.TAG,"AAC: SamplingFrequencyIndex changed from "+"".concat(this.audio_metadata_.sampling_freq_index," to ").concat(t.sampling_freq_index)),!0;if(t.channel_config!==this.audio_metadata_.channel_config)return n.a.v(this.TAG,"AAC: Channel configuration changed from "+"".concat(this.audio_metadata_.channel_config," to ").concat(t.channel_config)),!0}else if("ac-3"===e.codec&&"ac-3"===this.audio_metadata_.codec){var t;if((t=e.data).sampling_frequency!==this.audio_metadata_.sampling_frequency)return n.a.v(this.TAG,"AC3: Sampling Frequency changed from "+"".concat(this.audio_metadata_.sampling_frequency," to ").concat(t.sampling_frequency)),!0;if(t.bit_stream_identification!==this.audio_metadata_.bit_stream_identification)return n.a.v(this.TAG,"AC3: Bit Stream Identification changed from "+"".concat(this.audio_metadata_.bit_stream_identification," to ").concat(t.bit_stream_identification)),!0;if(t.bit_stream_mode!==this.audio_metadata_.bit_stream_mode)return n.a.v(this.TAG,"AC3: BitStream Mode changed from "+"".concat(this.audio_metadata_.bit_stream_mode," to ").concat(t.bit_stream_mode)),!0;if(t.channel_mode!==this.audio_metadata_.channel_mode)return n.a.v(this.TAG,"AC3: Channel Mode changed from "+"".concat(this.audio_metadata_.channel_mode," to ").concat(t.channel_mode)),!0;if(t.low_frequency_effects_channel_on!==this.audio_metadata_.low_frequency_effects_channel_on)return n.a.v(this.TAG,"AC3: Low Frequency Effects Channel On changed from "+"".concat(this.audio_metadata_.low_frequency_effects_channel_on," to ").concat(t.low_frequency_effects_channel_on)),!0}else if("opus"===e.codec&&"opus"===this.audio_metadata_.codec){if((l=e.meta).sample_rate!==this.audio_metadata_.sample_rate)return n.a.v(this.TAG,"Opus: SamplingFrequencyIndex changed from "+"".concat(this.audio_metadata_.sample_rate," to ").concat(l.sample_rate)),!0;if(l.channel_count!==this.audio_metadata_.channel_count)return n.a.v(this.TAG,"Opus: Channel count changed from "+"".concat(this.audio_metadata_.channel_count," to ").concat(l.channel_count)),!0}else if("mp3"===e.codec&&"mp3"===this.audio_metadata_.codec){var l;if((l=e.data).object_type!==this.audio_metadata_.object_type)return n.a.v(this.TAG,"MP3: AudioObjectType changed from "+"".concat(this.audio_metadata_.object_type," to ").concat(l.object_type)),!0;if(l.sample_rate!==this.audio_metadata_.sample_rate)return n.a.v(this.TAG,"MP3: SamplingFrequencyIndex changed from "+"".concat(this.audio_metadata_.sample_rate," to ").concat(l.sample_rate)),!0;if(l.channel_count!==this.audio_metadata_.channel_count)return n.a.v(this.TAG,"MP3: Channel count changed from "+"".concat(this.audio_metadata_.channel_count," to ").concat(l.channel_count)),!0}return!1},t.prototype.dispatchAudioInitSegment=function(e){var t={type:"audio"};if(t.id=this.audio_track_.id,t.timescale=1e3,t.duration=this.duration_,"aac"===this.audio_metadata_.codec){var l="aac"===e.codec?e.data:null,a=new E(l);t.audioSampleRate=a.sampling_rate,t.channelCount=a.channel_count,t.codec=a.codec_mimetype,t.originalCodec=a.original_codec_mimetype,t.config=a.config,t.refSampleDuration=1024/t.audioSampleRate*t.timescale}else if("ac-3"===this.audio_metadata_.codec){var i="ac-3"===e.codec?e.data:null,o=new be(i);t.audioSampleRate=o.sampling_rate,t.channelCount=o.channel_count,t.codec=o.codec_mimetype,t.originalCodec=o.original_codec_mimetype,t.config=o.config,t.refSampleDuration=1536/t.audioSampleRate*t.timescale}else if("ec-3"===this.audio_metadata_.codec){var c="ec-3"===e.codec?e.data:null,d=new ye(c);t.audioSampleRate=d.sampling_rate,t.channelCount=d.channel_count,t.codec=d.codec_mimetype,t.originalCodec=d.original_codec_mimetype,t.config=d.config,t.refSampleDuration=256*d.num_blks/t.audioSampleRate*t.timescale}else"opus"===this.audio_metadata_.codec?(t.audioSampleRate=this.audio_metadata_.sample_rate,t.channelCount=this.audio_metadata_.channel_count,t.channelConfigCode=this.audio_metadata_.channel_config_code,t.codec="opus",t.originalCodec="opus",t.config=void 0,t.refSampleDuration=20):"mp3"===this.audio_metadata_.codec&&(t.audioSampleRate=this.audio_metadata_.sample_rate,t.channelCount=this.audio_metadata_.channel_count,t.codec="mp3",t.originalCodec="mp3",t.config=void 0);0==this.audio_init_segment_dispatched_&&n.a.v(this.TAG,"Generated first AudioSpecificConfig for mimeType: ".concat(t.codec)),this.onTrackMetadata("audio",t),this.audio_init_segment_dispatched_=!0,this.video_metadata_changed_=!1;var g=this.media_info_;g.hasAudio=!0,g.audioCodec=t.originalCodec,g.audioSampleRate=t.audioSampleRate,g.audioChannelCount=t.channelCount,g.hasVideo&&g.videoCodec?g.mimeType='video/mp2t; codecs="'.concat(g.videoCodec,",").concat(g.audioCodec,'"'):g.mimeType='video/mp2t; codecs="'.concat(g.audioCodec,'"'),g.isComplete()&&this.onMediaInfo(g)},t.prototype.dispatchPESPrivateDataDescriptor=function(e,t,l){var a=new x;a.pid=e,a.stream_type=t,a.descriptor=l,this.onPESPrivateDataDescriptor&&this.onPESPrivateDataDescriptor(a)},t.prototype.parsePESPrivateDataPayload=function(e,t,l,a,i){var n=new O;if(n.pid=a,n.stream_id=i,n.len=e.byteLength,n.data=e,null!=t){var o=Math.floor(t/this.timescale_);n.pts=o}else n.nearest_pts=this.getNearestTimestampMilliseconds();if(null!=l){var c=Math.floor(l/this.timescale_);n.dts=c}this.onPESPrivateData&&this.onPESPrivateData(n)},t.prototype.parseTimedID3MetadataPayload=function(e,t,l,a,i){var n=new O;if(n.pid=a,n.stream_id=i,n.len=e.byteLength,n.data=e,null!=t){var o=Math.floor(t/this.timescale_);n.pts=o}if(null!=l){var c=Math.floor(l/this.timescale_);n.dts=c}this.onTimedID3Metadata&&this.onTimedID3Metadata(n)},t.prototype.parseSynchronousKLVMetadataPayload=function(e,t,l,a,i){var n=new We;if(n.pid=a,n.stream_id=i,n.len=e.byteLength,n.data=e,null!=t){var o=Math.floor(t/this.timescale_);n.pts=o}if(null!=l){var c=Math.floor(l/this.timescale_);n.dts=c}n.access_units=function(e){for(var t=[],l=0;l+5<e.byteLength;){var a=e[l+0],i=e[l+1],n=e[l+2],o=e[l+3]<<8|e[l+4],c=e.slice(l+5,l+5+o);t.push({service_id:a,sequence_number:i,flags:n,data:c}),l+=5+o}return t}(e),this.onSynchronousKLVMetadata&&this.onSynchronousKLVMetadata(n)},t.prototype.parseAsynchronousKLVMetadataPayload=function(e,t,l){var a=new O;a.pid=t,a.stream_id=l,a.len=e.byteLength,a.data=e,this.onAsynchronousKLVMetadata&&this.onAsynchronousKLVMetadata(a)},t.prototype.parseSMPTE2038MetadataPayload=function(e,t,l,a,i){var n=new re;if(n.pid=a,n.stream_id=i,n.len=e.byteLength,n.data=e,null!=t){var o=Math.floor(t/this.timescale_);n.pts=o}if(n.nearest_pts=this.getNearestTimestampMilliseconds(),null!=l){var c=Math.floor(l/this.timescale_);n.dts=c}n.ancillaries=function(e){for(var t=new r(e),l=0,a=[];l+=6,0===t.readBits(6);){var i=t.readBool();l+=1;var n=t.readBits(11);l+=11;var o=t.readBits(12);l+=12;var c=255&t.readBits(10);l+=10;var d=255&t.readBits(10);l+=10;var g=255&t.readBits(10);l+=10;for(var s=new Uint8Array(g),C=0;C<g;C++){var m=255&t.readBits(10);l+=10,s[C]=m}t.readBits(10),l+=10;var h="User Defined";65===c?7===d&&(h="SCTE-104"):95===c?220===d?h="ARIB STD-B37 (1SEG)":221===d?h="ARIB STD-B37 (ANALOG)":222===d?h="ARIB STD-B37 (SD)":223===d&&(h="ARIB STD-B37 (HD)"):97===c&&(1===d?h="EIA-708":2===d&&(h="EIA-608")),a.push({yc_indicator:i,line_number:n,horizontal_offset:o,did:c,sdid:d,user_data:s,description:h,information:{}}),t.readBits(8-(l-Math.floor(l/8))%8),l+=(8-(l-Math.floor(l/8)))%8}return t.destroy(),t=null,a}(e),this.onSMPTE2038Metadata&&this.onSMPTE2038Metadata(n)},t.prototype.getNearestTimestampMilliseconds=function(){return null!=this.audio_last_sample_pts_?Math.floor(this.audio_last_sample_pts_):null!=this.last_pcr_?Math.floor(this.last_pcr_/300/this.timescale_):void 0},t.prototype.getPcrBase=function(e){var t=33554432*e[6]+131072*e[7]+512*e[8]+2*e[9]+(128&e[10])/128+this.timestamp_offset_;return t+4294967296<this.last_pcr_base_&&(t+=8589934592,this.timestamp_offset_+=8589934592),this.last_pcr_base_=t,t},t.prototype.getTimestamp=function(e,t){var l=536870912*(14&e[t])+4194304*(255&e[t+1])+16384*(254&e[t+2])+128*(255&e[t+3])+(254&e[t+4])/2+this.timestamp_offset_;return l+4294967296<this.last_pcr_base_&&(l+=8589934592),l},t}(R),Be=function(e,t,l){for(var a,i=0,n=t.length;i<n;i++)!a&&i in t||(a||(a=Array.prototype.slice.call(t,0,i)),a[i]=t[i]);return e.concat(a||Array.prototype.slice.call(t))},Se=function(){function e(){}return e.init=function(){for(var t in e.types={avc1:[],avcC:[],btrt:[],dinf:[],dref:[],esds:[],ftyp:[],hdlr:[],hvc1:[],hvcC:[],av01:[],av1C:[],mdat:[],mdhd:[],mdia:[],mfhd:[],minf:[],moof:[],moov:[],mp4a:[],mvex:[],mvhd:[],sdtp:[],stbl:[],stco:[],stsc:[],stsd:[],stsz:[],stts:[],tfdt:[],tfhd:[],traf:[],trak:[],trun:[],trex:[],tkhd:[],vmhd:[],smhd:[],".mp3":[],Opus:[],dOps:[],"ac-3":[],dac3:[],"ec-3":[],dec3:[],fLaC:[],dfLa:[]},e.types)e.types.hasOwnProperty(t)&&(e.types[t]=[t.charCodeAt(0),t.charCodeAt(1),t.charCodeAt(2),t.charCodeAt(3)]);var l=e.constants={};l.FTYP=new Uint8Array([105,115,111,109,0,0,0,1,105,115,111,109,97,118,99,49]),l.STSD_PREFIX=new Uint8Array([0,0,0,0,0,0,0,1]),l.STTS=new Uint8Array([0,0,0,0,0,0,0,0]),l.STSC=l.STCO=l.STTS,l.STSZ=new Uint8Array([0,0,0,0,0,0,0,0,0,0,0,0]),l.HDLR_VIDEO=new Uint8Array([0,0,0,0,0,0,0,0,118,105,100,101,0,0,0,0,0,0,0,0,0,0,0,0,86,105,100,101,111,72,97,110,100,108,101,114,0]),l.HDLR_AUDIO=new Uint8Array([0,0,0,0,0,0,0,0,115,111,117,110,0,0,0,0,0,0,0,0,0,0,0,0,83,111,117,110,100,72,97,110,100,108,101,114,0]),l.DREF=new Uint8Array([0,0,0,0,0,0,0,1,0,0,0,12,117,114,108,32,0,0,0,1]),l.SMHD=new Uint8Array([0,0,0,0,0,0,0,0]),l.VMHD=new Uint8Array([0,0,0,1,0,0,0,0,0,0,0,0])},e.box=function(e){for(var t=8,l=null,a=Array.prototype.slice.call(arguments,1),i=a.length,n=0;n<i;n++)t+=a[n].byteLength;(l=new Uint8Array(t))[0]=t>>>24&255,l[1]=t>>>16&255,l[2]=t>>>8&255,l[3]=255&t,l.set(e,4);var o=8;for(n=0;n<i;n++)l.set(a[n],o),o+=a[n].byteLength;return l},e.generateInitSegment=function(t){var l=e.box(e.types.ftyp,e.constants.FTYP),a=e.moov(t),i=new Uint8Array(l.byteLength+a.byteLength);return i.set(l,0),i.set(a,l.byteLength),i},e.moov=function(t){var l=e.mvhd(t.timescale,t.duration),a=e.trak(t),i=e.mvex(t);return e.box(e.types.moov,l,a,i)},e.mvhd=function(t,l){return e.box(e.types.mvhd,new Uint8Array([0,0,0,0,0,0,0,0,0,0,0,0,t>>>24&255,t>>>16&255,t>>>8&255,255&t,l>>>24&255,l>>>16&255,l>>>8&255,255&l,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255]))},e.trak=function(t){return e.box(e.types.trak,e.tkhd(t),e.mdia(t))},e.tkhd=function(t){var l=t.id,a=t.duration,i=t.presentWidth,n=t.presentHeight;return e.box(e.types.tkhd,new Uint8Array([0,0,0,7,0,0,0,0,0,0,0,0,l>>>24&255,l>>>16&255,l>>>8&255,255&l,0,0,0,0,a>>>24&255,a>>>16&255,a>>>8&255,255&a,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,64,0,0,0,i>>>8&255,255&i,0,0,n>>>8&255,255&n,0,0]))},e.mdia=function(t){return e.box(e.types.mdia,e.mdhd(t),e.hdlr(t),e.minf(t))},e.mdhd=function(t){var l=t.timescale,a=t.duration;return e.box(e.types.mdhd,new Uint8Array([0,0,0,0,0,0,0,0,0,0,0,0,l>>>24&255,l>>>16&255,l>>>8&255,255&l,a>>>24&255,a>>>16&255,a>>>8&255,255&a,85,196,0,0]))},e.hdlr=function(t){var l=null;return l="audio"===t.type?e.constants.HDLR_AUDIO:e.constants.HDLR_VIDEO,e.box(e.types.hdlr,l)},e.minf=function(t){var l=null;return l="audio"===t.type?e.box(e.types.smhd,e.constants.SMHD):e.box(e.types.vmhd,e.constants.VMHD),e.box(e.types.minf,l,e.dinf(),e.stbl(t))},e.dinf=function(){return e.box(e.types.dinf,e.box(e.types.dref,e.constants.DREF))},e.stbl=function(t){return e.box(e.types.stbl,e.stsd(t),e.box(e.types.stts,e.constants.STTS),e.box(e.types.stsc,e.constants.STSC),e.box(e.types.stsz,e.constants.STSZ),e.box(e.types.stco,e.constants.STCO))},e.stsd=function(t){return"audio"===t.type?"mp3"===t.codec?e.box(e.types.stsd,e.constants.STSD_PREFIX,e.mp3(t)):"ac-3"===t.codec?e.box(e.types.stsd,e.constants.STSD_PREFIX,e.ac3(t)):"ec-3"===t.codec?e.box(e.types.stsd,e.constants.STSD_PREFIX,e.ec3(t)):"opus"===t.codec?e.box(e.types.stsd,e.constants.STSD_PREFIX,e.Opus(t)):"flac"==t.codec?e.box(e.types.stsd,e.constants.STSD_PREFIX,e.fLaC(t)):e.box(e.types.stsd,e.constants.STSD_PREFIX,e.mp4a(t)):"video"===t.type&&t.codec.startsWith("hvc1")?e.box(e.types.stsd,e.constants.STSD_PREFIX,e.hvc1(t)):"video"===t.type&&t.codec.startsWith("av01")?e.box(e.types.stsd,e.constants.STSD_PREFIX,e.av01(t)):e.box(e.types.stsd,e.constants.STSD_PREFIX,e.avc1(t))},e.mp3=function(t){var l=t.channelCount,a=t.audioSampleRate,i=new Uint8Array([0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,l,0,16,0,0,0,0,a>>>8&255,255&a,0,0]);return e.box(e.types[".mp3"],i)},e.mp4a=function(t){var l=t.channelCount,a=t.audioSampleRate,i=new Uint8Array([0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,l,0,16,0,0,0,0,a>>>8&255,255&a,0,0]);return e.box(e.types.mp4a,i,e.esds(t))},e.ac3=function(t){var l=t.channelCount,a=t.audioSampleRate,i=new Uint8Array([0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,l,0,16,0,0,0,0,a>>>8&255,255&a,0,0]);return e.box(e.types["ac-3"],i,e.box(e.types.dac3,new Uint8Array(t.config)))},e.ec3=function(t){var l=t.channelCount,a=t.audioSampleRate,i=new Uint8Array([0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,l,0,16,0,0,0,0,a>>>8&255,255&a,0,0]);return e.box(e.types["ec-3"],i,e.box(e.types.dec3,new Uint8Array(t.config)))},e.esds=function(t){var l=t.config||[],a=l.length,i=new Uint8Array([0,0,0,0,3,23+a,0,1,0,4,15+a,64,21,0,0,0,0,0,0,0,0,0,0,0,5].concat([a]).concat(l).concat([6,1,2]));return e.box(e.types.esds,i)},e.Opus=function(t){var l=t.channelCount,a=t.audioSampleRate,i=new Uint8Array([0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,l,0,16,0,0,0,0,a>>>8&255,255&a,0,0]);return e.box(e.types.Opus,i,e.dOps(t))},e.dOps=function(t){var l=t.channelCount,a=t.channelConfigCode,i=t.audioSampleRate;if(t.config)return e.box(e.types.dOps,t.config);var n=[];switch(a){case 1:case 2:n=[0];break;case 0:n=[255,1,1,0,1];break;case 128:n=[255,2,0,0,1];break;case 3:n=[1,2,1,0,2,1];break;case 4:n=[1,2,2,0,1,2,3];break;case 5:n=[1,3,2,0,4,1,2,3];break;case 6:n=[1,4,2,0,4,1,2,3,5];break;case 7:n=[1,4,2,0,4,1,2,3,5,6];break;case 8:n=[1,5,3,0,6,1,2,3,4,5,7];break;case 130:n=[1,1,2,0,1];break;case 131:n=[1,1,3,0,1,2];break;case 132:n=[1,1,4,0,1,2,3];break;case 133:n=[1,1,5,0,1,2,3,4];break;case 134:n=[1,1,6,0,1,2,3,4,5];break;case 135:n=[1,1,7,0,1,2,3,4,5,6];break;case 136:n=[1,1,8,0,1,2,3,4,5,6,7]}var o=new Uint8Array(Be([0,l,0,0,i>>>24&255,i>>>17&255,i>>>8&255,i>>>0&255,0,0],n));return e.box(e.types.dOps,o)},e.fLaC=function(t){var l=t.channelCount,a=Math.min(t.audioSampleRate,65535),i=t.sampleSize,n=new Uint8Array([0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,l,0,i,0,0,0,0,a>>>8&255,255&a,0,0]);return e.box(e.types.fLaC,n,e.dfLa(t))},e.dfLa=function(t){var l=new Uint8Array(Be([0,0,0,0],t.config));return e.box(e.types.dfLa,l)},e.avc1=function(t){var l=t.avcc,a=t.codecWidth,i=t.codecHeight,n=new Uint8Array([0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,a>>>8&255,255&a,i>>>8&255,255&i,0,72,0,0,0,72,0,0,0,0,0,0,0,1,10,120,113,113,47,102,108,118,46,106,115,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,24,255,255]);return e.box(e.types.avc1,n,e.box(e.types.avcC,l))},e.hvc1=function(t){var l=t.hvcc,a=t.codecWidth,i=t.codecHeight,n=new Uint8Array([0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,a>>>8&255,255&a,i>>>8&255,255&i,0,72,0,0,0,72,0,0,0,0,0,0,0,1,10,120,113,113,47,102,108,118,46,106,115,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,24,255,255]);return e.box(e.types.hvc1,n,e.box(e.types.hvcC,l))},e.av01=function(t){var l=t.av1c,a=t.codecWidth||192,i=t.codecHeight||108,n=new Uint8Array([0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,a>>>8&255,255&a,i>>>8&255,255&i,0,72,0,0,0,72,0,0,0,0,0,0,0,1,10,120,113,113,47,102,108,118,46,106,115,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,24,255,255]);return e.box(e.types.av01,n,e.box(e.types.av1C,l))},e.mvex=function(t){return e.box(e.types.mvex,e.trex(t))},e.trex=function(t){var l=t.id,a=new Uint8Array([0,0,0,0,l>>>24&255,l>>>16&255,l>>>8&255,255&l,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,1]);return e.box(e.types.trex,a)},e.moof=function(t,l){return e.box(e.types.moof,e.mfhd(t.sequenceNumber),e.traf(t,l))},e.mfhd=function(t){var l=new Uint8Array([0,0,0,0,t>>>24&255,t>>>16&255,t>>>8&255,255&t]);return e.box(e.types.mfhd,l)},e.traf=function(t,l){var a=t.id,i=e.box(e.types.tfhd,new Uint8Array([0,0,0,0,a>>>24&255,a>>>16&255,a>>>8&255,255&a])),n=e.box(e.types.tfdt,new Uint8Array([0,0,0,0,l>>>24&255,l>>>16&255,l>>>8&255,255&l])),o=e.sdtp(t),c=e.trun(t,o.byteLength+16+16+8+16+8+8);return e.box(e.types.traf,i,n,c,o)},e.sdtp=function(t){for(var l=t.samples||[],a=l.length,i=new Uint8Array(4+a),n=0;n<a;n++){var o=l[n].flags;i[n+4]=o.isLeading<<6|o.dependsOn<<4|o.isDependedOn<<2|o.hasRedundancy}return e.box(e.types.sdtp,i)},e.trun=function(t,l){var a=t.samples||[],i=a.length,n=12+16*i,o=new Uint8Array(n);l+=8+n,o.set([0,0,15,1,i>>>24&255,i>>>16&255,i>>>8&255,255&i,l>>>24&255,l>>>16&255,l>>>8&255,255&l],0);for(var c=0;c<i;c++){var d=a[c].duration,g=a[c].size,s=a[c].flags,C=a[c].cts;o.set([d>>>24&255,d>>>16&255,d>>>8&255,255&d,g>>>24&255,g>>>16&255,g>>>8&255,255&g,s.isLeading<<2|s.dependsOn,s.isDependedOn<<6|s.hasRedundancy<<4|s.isNonSync,0,0,C>>>24&255,C>>>16&255,C>>>8&255,255&C],12+16*c)}return e.box(e.types.trun,o)},e.mdat=function(t){return e.box(e.types.mdat,t)},e}();Se.init();var Ye=Se,Ae=function(){function e(){}return e.getSilentFrame=function(e,t){if("mp4a.40.2"===e){if(1===t)return new Uint8Array([0,200,0,128,35,128]);if(2===t)return new Uint8Array([33,0,73,144,2,25,0,35,128]);if(3===t)return new Uint8Array([0,200,0,128,32,132,1,38,64,8,100,0,142]);if(4===t)return new Uint8Array([0,200,0,128,32,132,1,38,64,8,100,0,128,44,128,8,2,56]);if(5===t)return new Uint8Array([0,200,0,128,32,132,1,38,64,8,100,0,130,48,4,153,0,33,144,2,56]);if(6===t)return new Uint8Array([0,200,0,128,32,132,1,38,64,8,100,0,130,48,4,153,0,33,144,2,0,178,0,32,8,224])}else{if(1===t)return new Uint8Array([1,64,34,128,163,78,230,128,186,8,0,0,0,28,6,241,193,10,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,94]);if(2===t)return new Uint8Array([1,64,34,128,163,94,230,128,186,8,0,0,0,0,149,0,6,241,161,10,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,94]);if(3===t)return new Uint8Array([1,64,34,128,163,94,230,128,186,8,0,0,0,0,149,0,6,241,161,10,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,94])}return null},e}(),Qe=l(11),Ke=function(){function e(e){this.TAG="MP4Remuxer",this._config=e,this._isLive=!0===e.isLive,this._dtsBase=-1,this._dtsBaseInited=!1,this._audioDtsBase=1/0,this._videoDtsBase=1/0,this._audioNextDts=void 0,this._videoNextDts=void 0,this._audioStashedLastSample=null,this._videoStashedLastSample=null,this._audioMeta=null,this._videoMeta=null,this._audioSegmentInfoList=new Qe.c("audio"),this._videoSegmentInfoList=new Qe.c("video"),this._onInitSegment=null,this._onMediaSegment=null,this._forceFirstIDR=!(!o.a.chrome||!(o.a.version.major<50||50===o.a.version.major&&o.a.version.build<2661)),this._fillSilentAfterSeek=o.a.msedge||o.a.msie,this._mp3UseMpegAudio=!o.a.firefox,this._fillAudioTimestampGap=this._config.fixAudioTimestampGap}return e.prototype.destroy=function(){this._dtsBase=-1,this._dtsBaseInited=!1,this._audioMeta=null,this._videoMeta=null,this._audioSegmentInfoList.clear(),this._audioSegmentInfoList=null,this._videoSegmentInfoList.clear(),this._videoSegmentInfoList=null,this._onInitSegment=null,this._onMediaSegment=null},e.prototype.bindDataSource=function(e){return e.onDataAvailable=this.remux.bind(this),e.onTrackMetadata=this._onTrackMetadataReceived.bind(this),this},Object.defineProperty(e.prototype,"onInitSegment",{get:function(){return this._onInitSegment},set:function(e){this._onInitSegment=e},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"onMediaSegment",{get:function(){return this._onMediaSegment},set:function(e){this._onMediaSegment=e},enumerable:!1,configurable:!0}),e.prototype.insertDiscontinuity=function(){this._audioNextDts=this._videoNextDts=void 0},e.prototype.seek=function(e){this._audioStashedLastSample=null,this._videoStashedLastSample=null,this._videoSegmentInfoList.clear(),this._audioSegmentInfoList.clear()},e.prototype.remux=function(e,t){if(!this._onMediaSegment)throw new C.a("MP4Remuxer: onMediaSegment callback must be specificed!");this._dtsBaseInited||this._calculateDtsBase(e,t),t&&this._remuxVideo(t),e&&this._remuxAudio(e)},e.prototype._onTrackMetadataReceived=function(e,t){var l=null,a="mp4",i=t.codec;if("audio"===e)this._audioMeta=t,"mp3"===t.codec&&this._mp3UseMpegAudio?(a="mpeg",i="",l=new Uint8Array):l=Ye.generateInitSegment(t);else{if("video"!==e)return;this._videoMeta=t,l=Ye.generateInitSegment(t)}if(!this._onInitSegment)throw new C.a("MP4Remuxer: onInitSegment callback must be specified!");this._onInitSegment(e,{type:e,data:l.buffer,codec:i,container:"".concat(e,"/").concat(a),mediaDuration:t.duration})},e.prototype._calculateDtsBase=function(e,t){this._dtsBaseInited||(e&&e.samples&&e.samples.length&&(this._audioDtsBase=e.samples[0].dts),t&&t.samples&&t.samples.length&&(this._videoDtsBase=t.samples[0].dts),this._dtsBase=Math.min(this._audioDtsBase,this._videoDtsBase),this._dtsBaseInited=!0)},e.prototype.getTimestampBase=function(){if(this._dtsBaseInited)return this._dtsBase},e.prototype.flushStashedSamples=function(){var e=this._videoStashedLastSample,t=this._audioStashedLastSample,l={type:"video",id:1,sequenceNumber:0,samples:[],length:0};null!=e&&(l.samples.push(e),l.length=e.length);var a={type:"audio",id:2,sequenceNumber:0,samples:[],length:0};null!=t&&(a.samples.push(t),a.length=t.length),this._videoStashedLastSample=null,this._audioStashedLastSample=null,this._remuxVideo(l,!0),this._remuxAudio(a,!0)},e.prototype._remuxAudio=function(e,t){if(null!=this._audioMeta){var l,a=e,i=a.samples,c=void 0,d=-1,g=this._audioMeta.refSampleDuration,s="mp3"===this._audioMeta.codec&&this._mp3UseMpegAudio,C=this._dtsBaseInited&&void 0===this._audioNextDts,m=!1;if(i&&0!==i.length&&(1!==i.length||t)){var h=0,r=null,Z=0;s?(h=0,Z=a.length):(h=8,Z=8+a.length);var I=null;if(i.length>1&&(Z-=(I=i.pop()).length),null!=this._audioStashedLastSample){var J=this._audioStashedLastSample;this._audioStashedLastSample=null,i.unshift(J),Z+=J.length}null!=I&&(this._audioStashedLastSample=I);var u=i[0].dts-this._dtsBase;if(this._audioNextDts)c=u-this._audioNextDts;else if(this._audioSegmentInfoList.isEmpty())c=0,this._fillSilentAfterSeek&&!this._videoSegmentInfoList.isEmpty()&&"mp3"!==this._audioMeta.originalCodec&&(m=!0);else{var b=this._audioSegmentInfoList.getLastSampleBefore(u);if(null!=b){var G=u-(b.originalDts+b.duration);G<=3&&(G=0),c=u-(b.dts+b.duration+G)}else c=0}if(m){var p=u-c,y=this._videoSegmentInfoList.getLastSegmentBefore(u);if(null!=y&&y.beginDts<p){if(K=Ae.getSilentFrame(this._audioMeta.originalCodec,this._audioMeta.channelCount)){var W=y.beginDts,X=p-y.beginDts;n.a.v(this.TAG,"InsertPrefixSilentAudio: dts: ".concat(W,", duration: ").concat(X)),i.unshift({unit:K,dts:W,pts:W}),Z+=K.byteLength}}else m=!1}for(var V=[],R=0;R<i.length;R++){var k=(J=i[R]).unit,B=J.dts-this._dtsBase,S=(W=B,!1),Y=null,A=0;if(!(B<-.001)){if("mp3"!==this._audioMeta.codec&&null!=g){var Q=B;if(this._audioNextDts&&(Q=this._audioNextDts),(c=B-Q)<=-3*g){n.a.w(this.TAG,"Dropping 1 audio frame (originalDts: ".concat(B," ms ,curRefDts: ").concat(Q," ms) due to dtsCorrection: ").concat(c," ms overlap."));continue}if(c>=3*g&&this._fillAudioTimestampGap&&!o.a.safari){S=!0;var K,F=Math.floor(c/g);n.a.w(this.TAG,"Large audio timestamp gap detected, may cause AV sync to drift. Silent frames will be generated to avoid unsync.\n"+"originalDts: ".concat(B," ms, curRefDts: ").concat(Q," ms, ")+"dtsCorrection: ".concat(Math.round(c)," ms, generate: ").concat(F," frames")),W=Math.floor(Q),A=Math.floor(Q+g)-W,null==(K=Ae.getSilentFrame(this._audioMeta.originalCodec,this._audioMeta.channelCount))&&(n.a.w(this.TAG,"Unable to generate silent frame for "+"".concat(this._audioMeta.originalCodec," with ").concat(this._audioMeta.channelCount," channels, repeat last frame")),K=k),Y=[];for(var _=0;_<F;_++){Q+=g;var f=Math.floor(Q),w=Math.floor(Q+g)-f,H={dts:f,pts:f,cts:0,unit:K,size:K.byteLength,duration:w,originalDts:B,flags:{isLeading:0,dependsOn:1,isDependedOn:0,hasRedundancy:0}};Y.push(H),Z+=H.size}this._audioNextDts=Q+g}else W=Math.floor(Q),A=Math.floor(Q+g)-W,this._audioNextDts=Q+g}else W=B-c,A=R!==i.length-1?i[R+1].dts-this._dtsBase-c-W:null!=I?I.dts-this._dtsBase-c-W:V.length>=1?V[V.length-1].duration:Math.floor(g),this._audioNextDts=W+A;-1===d&&(d=W),V.push({dts:W,pts:W,cts:0,unit:J.unit,size:J.unit.byteLength,duration:A,originalDts:B,flags:{isLeading:0,dependsOn:1,isDependedOn:0,hasRedundancy:0}}),S&&V.push.apply(V,Y)}}if(0===V.length)return a.samples=[],void(a.length=0);for(s?r=new Uint8Array(Z):((r=new Uint8Array(Z))[0]=Z>>>24&255,r[1]=Z>>>16&255,r[2]=Z>>>8&255,r[3]=255&Z,r.set(Ye.types.mdat,4)),R=0;R<V.length;R++)k=V[R].unit,r.set(k,h),h+=k.byteLength;var v=V[V.length-1];l=v.dts+v.duration;var N=new Qe.b;N.beginDts=d,N.endDts=l,N.beginPts=d,N.endPts=l,N.originalBeginDts=V[0].originalDts,N.originalEndDts=v.originalDts+v.duration,N.firstSample=new Qe.d(V[0].dts,V[0].pts,V[0].duration,V[0].originalDts,!1),N.lastSample=new Qe.d(v.dts,v.pts,v.duration,v.originalDts,!1),this._isLive||this._audioSegmentInfoList.append(N),a.samples=V,a.sequenceNumber++;var z=null;z=s?new Uint8Array:Ye.moof(a,d),a.samples=[],a.length=0;var L={type:"audio",data:this._mergeBoxes(z,r).buffer,sampleCount:V.length,info:N};s&&C&&(L.timestampOffset=d),this._onMediaSegment("audio",L)}}},e.prototype._remuxVideo=function(e,t){if(null!=this._videoMeta){var l,a,i=e,n=i.samples,o=void 0,c=-1,d=-1;if(n&&0!==n.length&&(1!==n.length||t)){var g=8,s=null,C=8+e.length,m=null;if(n.length>1&&(C-=(m=n.pop()).length),null!=this._videoStashedLastSample){var h=this._videoStashedLastSample;this._videoStashedLastSample=null,n.unshift(h),C+=h.length}null!=m&&(this._videoStashedLastSample=m);var r=n[0].dts-this._dtsBase;if(this._videoNextDts)o=r-this._videoNextDts;else if(this._videoSegmentInfoList.isEmpty())o=0;else{var Z=this._videoSegmentInfoList.getLastSampleBefore(r);if(null!=Z){var I=r-(Z.originalDts+Z.duration);I<=3&&(I=0),o=r-(Z.dts+Z.duration+I)}else o=0}for(var J=new Qe.b,u=[],b=0;b<n.length;b++){var G=(h=n[b]).dts-this._dtsBase,p=h.isKeyframe,y=G-o,W=h.cts,X=y+W;-1===c&&(c=y,d=X);var V=0;if(V=b!==n.length-1?n[b+1].dts-this._dtsBase-o-y:null!=m?m.dts-this._dtsBase-o-y:u.length>=1?u[u.length-1].duration:Math.floor(this._videoMeta.refSampleDuration),p){var R=new Qe.d(y,X,V,h.dts,!0);R.fileposition=h.fileposition,J.appendSyncPoint(R)}u.push({dts:y,pts:X,cts:W,units:h.units,size:h.length,isKeyframe:p,duration:V,originalDts:G,flags:{isLeading:0,dependsOn:p?2:1,isDependedOn:p?1:0,hasRedundancy:0,isNonSync:p?0:1}})}for((s=new Uint8Array(C))[0]=C>>>24&255,s[1]=C>>>16&255,s[2]=C>>>8&255,s[3]=255&C,s.set(Ye.types.mdat,4),b=0;b<u.length;b++)for(var k=u[b].units;k.length;){var B=k.shift().data;s.set(B,g),g+=B.byteLength}var S=u[u.length-1];if(l=S.dts+S.duration,a=S.pts+S.duration,this._videoNextDts=l,J.beginDts=c,J.endDts=l,J.beginPts=d,J.endPts=a,J.originalBeginDts=u[0].originalDts,J.originalEndDts=S.originalDts+S.duration,J.firstSample=new Qe.d(u[0].dts,u[0].pts,u[0].duration,u[0].originalDts,u[0].isKeyframe),J.lastSample=new Qe.d(S.dts,S.pts,S.duration,S.originalDts,S.isKeyframe),this._isLive||this._videoSegmentInfoList.append(J),i.samples=u,i.sequenceNumber++,this._forceFirstIDR){var Y=u[0].flags;Y.dependsOn=2,Y.isNonSync=0}var A=Ye.moof(i,c);i.samples=[],i.length=0,this._onMediaSegment("video",{type:"video",data:this._mergeBoxes(A,s).buffer,sampleCount:u.length,info:J})}}},e.prototype._mergeBoxes=function(e,t){var l=new Uint8Array(e.byteLength+t.byteLength);return l.set(e,0),l.set(t,e.byteLength),l},e}(),Fe=l(14),_e=l(1),fe=(l(2),function(){function e(e,t){this.TAG="TransmuxingController",this._emitter=new i.a,this._config=t,e.segments||(e.segments=[{duration:e.duration,filesize:e.filesize,url:e.url}]),"boolean"!=typeof e.cors&&(e.cors=!0),"boolean"!=typeof e.withCredentials&&(e.withCredentials=!1),this._mediaDataSource=e,this._currentSegmentIndex=0;var l=0;this._mediaDataSource.segments.forEach(function(a){a.timestampBase=l,l+=a.duration,a.cors=e.cors,a.withCredentials=e.withCredentials,t.referrerPolicy&&(a.referrerPolicy=t.referrerPolicy)}),isNaN(l)||this._mediaDataSource.duration===l||(this._mediaDataSource.duration=l),this._mediaInfo=null,this._demuxer=null,this._remuxer=null,this._ioctl=null,this._pendingSeekTime=null,this._pendingResolveSeekPoint=null,this._statisticsReporter=null}return e.prototype.destroy=function(){this._mediaInfo=null,this._mediaDataSource=null,this._statisticsReporter&&this._disableStatisticsReporter(),this._ioctl&&(this._ioctl.destroy(),this._ioctl=null),this._demuxer&&(this._demuxer.destroy(),this._demuxer=null),this._remuxer&&(this._remuxer.destroy(),this._remuxer=null),this._emitter.removeAllListeners(),this._emitter=null},e.prototype.on=function(e,t){this._emitter.addListener(e,t)},e.prototype.off=function(e,t){this._emitter.removeListener(e,t)},e.prototype.start=function(){this._loadSegment(0),this._enableStatisticsReporter()},e.prototype._loadSegment=function(e,t){this._currentSegmentIndex=e;var l=this._mediaDataSource.segments[e],a=this._ioctl=new Fe.a(l,this._config,e);a.onError=this._onIOException.bind(this),a.onSeeked=this._onIOSeeked.bind(this),a.onComplete=this._onIOComplete.bind(this),a.onRedirect=this._onIORedirect.bind(this),a.onRecoveredEarlyEof=this._onIORecoveredEarlyEof.bind(this),t?this._demuxer.bindDataSource(this._ioctl):a.onDataArrival=this._onInitChunkArrival.bind(this),a.open(t)},e.prototype.stop=function(){this._internalAbort(),this._disableStatisticsReporter()},e.prototype._internalAbort=function(){this._ioctl&&(this._ioctl.destroy(),this._ioctl=null)},e.prototype.pause=function(){this._ioctl&&this._ioctl.isWorking()&&(this._ioctl.pause(),this._disableStatisticsReporter())},e.prototype.resume=function(){this._ioctl&&this._ioctl.isPaused()&&(this._ioctl.resume(),this._enableStatisticsReporter())},e.prototype.seek=function(e){if(null!=this._mediaInfo&&this._mediaInfo.isSeekable()){var t=this._searchSegmentIndexContains(e);if(t===this._currentSegmentIndex){var l=this._mediaInfo.segments[t];if(null==l)this._pendingSeekTime=e;else{var a=l.getNearestKeyframe(e);this._remuxer.seek(a.milliseconds),this._ioctl.seek(a.fileposition),this._pendingResolveSeekPoint=a.milliseconds}}else{var i=this._mediaInfo.segments[t];null==i?(this._pendingSeekTime=e,this._internalAbort(),this._remuxer.seek(),this._remuxer.insertDiscontinuity(),this._loadSegment(t)):(a=i.getNearestKeyframe(e),this._internalAbort(),this._remuxer.seek(e),this._remuxer.insertDiscontinuity(),this._demuxer.resetMediaInfo(),this._demuxer.timestampBase=this._mediaDataSource.segments[t].timestampBase,this._loadSegment(t,a.fileposition),this._pendingResolveSeekPoint=a.milliseconds,this._reportSegmentMediaInfo(t))}this._enableStatisticsReporter()}},e.prototype._searchSegmentIndexContains=function(e){for(var t=this._mediaDataSource.segments,l=t.length-1,a=0;a<t.length;a++)if(e<t[a].timestampBase){l=a-1;break}return l},e.prototype._onInitChunkArrival=function(e,t){var l=this,a=0;if(t>0)this._demuxer.bindDataSource(this._ioctl),this._demuxer.timestampBase=this._mediaDataSource.segments[this._currentSegmentIndex].timestampBase,a=this._demuxer.parseChunks(e,t);else{var i=null;(i=V.probe(e)).match&&(this._setupFLVDemuxerRemuxer(i),a=this._demuxer.parseChunks(e,t)),i.match||i.needMoreData||(i=ke.probe(e)).match&&(this._setupTSDemuxerRemuxer(i),a=this._demuxer.parseChunks(e,t)),i.match||i.needMoreData||(i=null,n.a.e(this.TAG,"Non MPEG-TS/FLV, Unsupported media type!"),Promise.resolve().then(function(){l._internalAbort()}),this._emitter.emit(_e.a.DEMUX_ERROR,I.a.FORMAT_UNSUPPORTED,"Non MPEG-TS/FLV, Unsupported media type!"))}return a},e.prototype._setupFLVDemuxerRemuxer=function(e){this._demuxer=new V(e,this._config),this._remuxer||(this._remuxer=new Ke(this._config));var t=this._mediaDataSource;null==t.duration||isNaN(t.duration)||(this._demuxer.overridedDuration=t.duration),"boolean"==typeof t.hasAudio&&(this._demuxer.overridedHasAudio=t.hasAudio),"boolean"==typeof t.hasVideo&&(this._demuxer.overridedHasVideo=t.hasVideo),this._demuxer.timestampBase=t.segments[this._currentSegmentIndex].timestampBase,this._demuxer.onError=this._onDemuxException.bind(this),this._demuxer.onMediaInfo=this._onMediaInfo.bind(this),this._demuxer.onMetaDataArrived=this._onMetaDataArrived.bind(this),this._demuxer.onScriptDataArrived=this._onScriptDataArrived.bind(this),this._remuxer.bindDataSource(this._demuxer.bindDataSource(this._ioctl)),this._remuxer.onInitSegment=this._onRemuxerInitSegmentArrival.bind(this),this._remuxer.onMediaSegment=this._onRemuxerMediaSegmentArrival.bind(this)},e.prototype._setupTSDemuxerRemuxer=function(e){var t=this._demuxer=new ke(e,this._config);this._remuxer||(this._remuxer=new Ke(this._config)),t.onError=this._onDemuxException.bind(this),t.onMediaInfo=this._onMediaInfo.bind(this),t.onMetaDataArrived=this._onMetaDataArrived.bind(this),t.onTimedID3Metadata=this._onTimedID3Metadata.bind(this),t.onSynchronousKLVMetadata=this._onSynchronousKLVMetadata.bind(this),t.onAsynchronousKLVMetadata=this._onAsynchronousKLVMetadata.bind(this),t.onSMPTE2038Metadata=this._onSMPTE2038Metadata.bind(this),t.onSCTE35Metadata=this._onSCTE35Metadata.bind(this),t.onPESPrivateDataDescriptor=this._onPESPrivateDataDescriptor.bind(this),t.onPESPrivateData=this._onPESPrivateData.bind(this),this._remuxer.bindDataSource(this._demuxer),this._demuxer.bindDataSource(this._ioctl),this._remuxer.onInitSegment=this._onRemuxerInitSegmentArrival.bind(this),this._remuxer.onMediaSegment=this._onRemuxerMediaSegmentArrival.bind(this)},e.prototype._onMediaInfo=function(e){var t=this;null==this._mediaInfo&&(this._mediaInfo=Object.assign({},e),this._mediaInfo.keyframesIndex=null,this._mediaInfo.segments=[],this._mediaInfo.segmentCount=this._mediaDataSource.segments.length,Object.setPrototypeOf(this._mediaInfo,c.a.prototype));var l=Object.assign({},e);Object.setPrototypeOf(l,c.a.prototype),this._mediaInfo.segments[this._currentSegmentIndex]=l,this._reportSegmentMediaInfo(this._currentSegmentIndex),null!=this._pendingSeekTime&&Promise.resolve().then(function(){var e=t._pendingSeekTime;t._pendingSeekTime=null,t.seek(e)})},e.prototype._onMetaDataArrived=function(e){this._emitter.emit(_e.a.METADATA_ARRIVED,e)},e.prototype._onScriptDataArrived=function(e){this._emitter.emit(_e.a.SCRIPTDATA_ARRIVED,e)},e.prototype._onTimedID3Metadata=function(e){var t=this._remuxer.getTimestampBase();null!=t&&(null!=e.pts&&(e.pts-=t),null!=e.dts&&(e.dts-=t),this._emitter.emit(_e.a.TIMED_ID3_METADATA_ARRIVED,e))},e.prototype._onSynchronousKLVMetadata=function(e){var t=this._remuxer.getTimestampBase();null!=t&&(null!=e.pts&&(e.pts-=t),null!=e.dts&&(e.dts-=t),this._emitter.emit(_e.a.SYNCHRONOUS_KLV_METADATA_ARRIVED,e))},e.prototype._onAsynchronousKLVMetadata=function(e){this._emitter.emit(_e.a.ASYNCHRONOUS_KLV_METADATA_ARRIVED,e)},e.prototype._onSMPTE2038Metadata=function(e){var t=this._remuxer.getTimestampBase();null!=t&&(null!=e.pts&&(e.pts-=t),null!=e.dts&&(e.dts-=t),null!=e.nearest_pts&&(e.nearest_pts-=t),this._emitter.emit(_e.a.SMPTE2038_METADATA_ARRIVED,e))},e.prototype._onSCTE35Metadata=function(e){var t=this._remuxer.getTimestampBase();null!=t&&(null!=e.pts&&(e.pts-=t),null!=e.nearest_pts&&(e.nearest_pts-=t),this._emitter.emit(_e.a.SCTE35_METADATA_ARRIVED,e))},e.prototype._onPESPrivateDataDescriptor=function(e){this._emitter.emit(_e.a.PES_PRIVATE_DATA_DESCRIPTOR,e)},e.prototype._onPESPrivateData=function(e){var t=this._remuxer.getTimestampBase();null!=t&&(null!=e.pts&&(e.pts-=t),null!=e.nearest_pts&&(e.nearest_pts-=t),null!=e.dts&&(e.dts-=t),this._emitter.emit(_e.a.PES_PRIVATE_DATA_ARRIVED,e))},e.prototype._onIOSeeked=function(){this._remuxer.insertDiscontinuity()},e.prototype._onIOComplete=function(e){var t=e+1;t<this._mediaDataSource.segments.length?(this._internalAbort(),this._remuxer&&this._remuxer.flushStashedSamples(),this._loadSegment(t)):(this._remuxer&&this._remuxer.flushStashedSamples(),this._emitter.emit(_e.a.LOADING_COMPLETE),this._disableStatisticsReporter())},e.prototype._onIORedirect=function(e){var t=this._ioctl.extraData;this._mediaDataSource.segments[t].redirectedURL=e},e.prototype._onIORecoveredEarlyEof=function(){this._emitter.emit(_e.a.RECOVERED_EARLY_EOF)},e.prototype._onIOException=function(e,t){n.a.e(this.TAG,"IOException: type = ".concat(e,", code = ").concat(t.code,", msg = ").concat(t.msg)),this._emitter.emit(_e.a.IO_ERROR,e,t),this._disableStatisticsReporter()},e.prototype._onDemuxException=function(e,t){n.a.e(this.TAG,"DemuxException: type = ".concat(e,", info = ").concat(t)),this._emitter.emit(_e.a.DEMUX_ERROR,e,t)},e.prototype._onRemuxerInitSegmentArrival=function(e,t){this._emitter.emit(_e.a.INIT_SEGMENT,e,t)},e.prototype._onRemuxerMediaSegmentArrival=function(e,t){if(null==this._pendingSeekTime&&(this._emitter.emit(_e.a.MEDIA_SEGMENT,e,t),null!=this._pendingResolveSeekPoint&&"video"===e)){var l=t.info.syncPoints,a=this._pendingResolveSeekPoint;this._pendingResolveSeekPoint=null,o.a.safari&&l.length>0&&l[0].originalDts===a&&(a=l[0].pts),this._emitter.emit(_e.a.RECOMMEND_SEEKPOINT,a)}},e.prototype._enableStatisticsReporter=function(){null==this._statisticsReporter&&(this._statisticsReporter=self.setInterval(this._reportStatisticsInfo.bind(this),this._config.statisticsInfoReportInterval))},e.prototype._disableStatisticsReporter=function(){this._statisticsReporter&&(self.clearInterval(this._statisticsReporter),this._statisticsReporter=null)},e.prototype._reportSegmentMediaInfo=function(e){var t=this._mediaInfo.segments[e],l=Object.assign({},t);l.duration=this._mediaInfo.duration,l.segmentCount=this._mediaInfo.segmentCount,delete l.segments,delete l.keyframesIndex,this._emitter.emit(_e.a.MEDIA_INFO,l)},e.prototype._reportStatisticsInfo=function(){var e={};e.url=this._ioctl.currentURL,e.hasRedirect=this._ioctl.hasRedirect,e.hasRedirect&&(e.redirectedURL=this._ioctl.currentRedirectedURL),e.speed=this._ioctl.currentSpeed,e.loaderType=this._ioctl.loaderType,e.currentSegmentIndex=this._currentSegmentIndex,e.totalSegmentCount=this._mediaDataSource.segments.length,this._emitter.emit(_e.a.STATISTICS_INFO,e)},e}());t.a=fe},function(e,t,l){var a,i=l(0),n=function(){function e(){this._firstCheckpoint=0,this._lastCheckpoint=0,this._intervalBytes=0,this._totalBytes=0,this._lastSecondBytes=0,self.performance&&self.performance.now?this._now=self.performance.now.bind(self.performance):this._now=Date.now}return e.prototype.reset=function(){this._firstCheckpoint=this._lastCheckpoint=0,this._totalBytes=this._intervalBytes=0,this._lastSecondBytes=0},e.prototype.addBytes=function(e){0===this._firstCheckpoint?(this._firstCheckpoint=this._now(),this._lastCheckpoint=this._firstCheckpoint,this._intervalBytes+=e,this._totalBytes+=e):this._now()-this._lastCheckpoint<1e3?(this._intervalBytes+=e,this._totalBytes+=e):(this._lastSecondBytes=this._intervalBytes,this._intervalBytes=e,this._totalBytes+=e,this._lastCheckpoint=this._now())},Object.defineProperty(e.prototype,"currentKBps",{get:function(){this.addBytes(0);var e=(this._now()-this._lastCheckpoint)/1e3;return 0==e&&(e=1),this._intervalBytes/e/1024},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"lastSecondKBps",{get:function(){return this.addBytes(0),0!==this._lastSecondBytes?this._lastSecondBytes/1024:this._now()-this._lastCheckpoint>=500?this.currentKBps:0},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"averageKBps",{get:function(){var e=(this._now()-this._firstCheckpoint)/1e3;return this._totalBytes/e/1024},enumerable:!1,configurable:!0}),e}(),o=l(2),c=l(5),d=l(3),g=(a=function(e,t){return(a=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var l in t)Object.prototype.hasOwnProperty.call(t,l)&&(e[l]=t[l])})(e,t)},function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");function l(){this.constructor=e}a(e,t),e.prototype=null===t?Object.create(t):(l.prototype=t.prototype,new l)}),s=function(e){function t(t,l){var a=e.call(this,"fetch-stream-loader")||this;return a.TAG="FetchStreamLoader",a._seekHandler=t,a._config=l,a._needStash=!0,a._requestAbort=!1,a._abortController=null,a._contentLength=null,a._receivedLength=0,a}return g(t,e),t.isSupported=function(){try{var e=c.a.msedge&&c.a.version.minor>=15048,t=!c.a.msedge||e;return self.fetch&&self.ReadableStream&&t}catch(e){return!1}},t.prototype.destroy=function(){this.isWorking()&&this.abort(),e.prototype.destroy.call(this)},t.prototype.open=function(e,t){var l=this;this._dataSource=e,this._range=t;var a=e.url;this._config.reuseRedirectedURL&&null!=e.redirectedURL&&(a=e.redirectedURL);var i=this._seekHandler.getConfig(a,t),n=new self.Headers;if("object"==typeof i.headers){var c=i.headers;for(var g in c)c.hasOwnProperty(g)&&n.append(g,c[g])}var s={method:"GET",headers:n,mode:"cors",cache:"default",referrerPolicy:"no-referrer-when-downgrade"};if("object"==typeof this._config.headers)for(var g in this._config.headers)n.append(g,this._config.headers[g]);!1===e.cors&&(s.mode="same-origin"),e.withCredentials&&(s.credentials="include"),e.referrerPolicy&&(s.referrerPolicy=e.referrerPolicy),self.AbortController&&(this._abortController=new self.AbortController,s.signal=this._abortController.signal),this._status=o.c.kConnecting,self.fetch(i.url,s).then(function(e){if(l._requestAbort)return l._status=o.c.kIdle,void e.body.cancel();if(e.ok&&e.status>=200&&e.status<=299){if(e.url!==i.url&&l._onURLRedirect){var t=l._seekHandler.removeURLParameters(e.url);l._onURLRedirect(t)}var a=e.headers.get("Content-Length");return null!=a&&(l._contentLength=parseInt(a),0!==l._contentLength&&l._onContentLengthKnown&&l._onContentLengthKnown(l._contentLength)),l._pump.call(l,e.body.getReader())}if(l._status=o.c.kError,!l._onError)throw new d.d("FetchStreamLoader: Http code invalid, "+e.status+" "+e.statusText);l._onError(o.b.HTTP_STATUS_CODE_INVALID,{code:e.status,msg:e.statusText})}).catch(function(e){if(!l._abortController||!l._abortController.signal.aborted){if(l._status=o.c.kError,!l._onError)throw e;l._onError(o.b.EXCEPTION,{code:-1,msg:e.message})}})},t.prototype.abort=function(){if(this._requestAbort=!0,(this._status!==o.c.kBuffering||!c.a.chrome)&&this._abortController)try{this._abortController.abort()}catch(e){}},t.prototype._pump=function(e){var t=this;return e.read().then(function(l){if(l.done)if(null!==t._contentLength&&t._receivedLength<t._contentLength){t._status=o.c.kError;var a=o.b.EARLY_EOF,i={code:-1,msg:"Fetch stream meet Early-EOF"};if(!t._onError)throw new d.d(i.msg);t._onError(a,i)}else t._status=o.c.kComplete,t._onComplete&&t._onComplete(t._range.from,t._range.from+t._receivedLength-1);else{if(t._abortController&&t._abortController.signal.aborted)return void(t._status=o.c.kComplete);if(!0===t._requestAbort)return t._status=o.c.kComplete,e.cancel();t._status=o.c.kBuffering;var n=l.value.buffer,c=t._range.from+t._receivedLength;t._receivedLength+=n.byteLength,t._onDataArrival&&t._onDataArrival(n,c,t._receivedLength),t._pump(e)}}).catch(function(e){if(t._abortController&&t._abortController.signal.aborted)t._status=o.c.kComplete;else if(11!==e.code||!c.a.msedge){t._status=o.c.kError;var l=0,a=null;if(19!==e.code&&"network error"!==e.message||!(null===t._contentLength||null!==t._contentLength&&t._receivedLength<t._contentLength)?(l=o.b.EXCEPTION,a={code:e.code,msg:e.message}):(l=o.b.EARLY_EOF,a={code:e.code,msg:"Fetch stream meet Early-EOF"}),!t._onError)throw new d.d(a.msg);t._onError(l,a)}})},t}(o.a),C=function(){var e=function(t,l){return(e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var l in t)Object.prototype.hasOwnProperty.call(t,l)&&(e[l]=t[l])})(t,l)};return function(t,l){if("function"!=typeof l&&null!==l)throw new TypeError("Class extends value "+String(l)+" is not a constructor or null");function a(){this.constructor=t}e(t,l),t.prototype=null===l?Object.create(l):(a.prototype=l.prototype,new a)}}(),m=function(e){function t(t,l){var a=e.call(this,"xhr-moz-chunked-loader")||this;return a.TAG="MozChunkedLoader",a._seekHandler=t,a._config=l,a._needStash=!0,a._xhr=null,a._requestAbort=!1,a._contentLength=null,a._receivedLength=0,a}return C(t,e),t.isSupported=function(){try{var e=new XMLHttpRequest;return e.open("GET","https://example.com",!0),e.responseType="moz-chunked-arraybuffer","moz-chunked-arraybuffer"===e.responseType}catch(e){return i.a.w("MozChunkedLoader",e.message),!1}},t.prototype.destroy=function(){this.isWorking()&&this.abort(),this._xhr&&(this._xhr.onreadystatechange=null,this._xhr.onprogress=null,this._xhr.onloadend=null,this._xhr.onerror=null,this._xhr=null),e.prototype.destroy.call(this)},t.prototype.open=function(e,t){this._dataSource=e,this._range=t;var l=e.url;this._config.reuseRedirectedURL&&null!=e.redirectedURL&&(l=e.redirectedURL);var a=this._seekHandler.getConfig(l,t);this._requestURL=a.url;var i=this._xhr=new XMLHttpRequest;if(i.open("GET",a.url,!0),i.responseType="moz-chunked-arraybuffer",i.onreadystatechange=this._onReadyStateChange.bind(this),i.onprogress=this._onProgress.bind(this),i.onloadend=this._onLoadEnd.bind(this),i.onerror=this._onXhrError.bind(this),e.withCredentials&&(i.withCredentials=!0),"object"==typeof a.headers){var n=a.headers;for(var c in n)n.hasOwnProperty(c)&&i.setRequestHeader(c,n[c])}if("object"==typeof this._config.headers)for(var c in n=this._config.headers)n.hasOwnProperty(c)&&i.setRequestHeader(c,n[c]);this._status=o.c.kConnecting,i.send()},t.prototype.abort=function(){this._requestAbort=!0,this._xhr&&this._xhr.abort(),this._status=o.c.kComplete},t.prototype._onReadyStateChange=function(e){var t=e.target;if(2===t.readyState){if(null!=t.responseURL&&t.responseURL!==this._requestURL&&this._onURLRedirect){var l=this._seekHandler.removeURLParameters(t.responseURL);this._onURLRedirect(l)}if(0!==t.status&&(t.status<200||t.status>299)){if(this._status=o.c.kError,!this._onError)throw new d.d("MozChunkedLoader: Http code invalid, "+t.status+" "+t.statusText);this._onError(o.b.HTTP_STATUS_CODE_INVALID,{code:t.status,msg:t.statusText})}else this._status=o.c.kBuffering}},t.prototype._onProgress=function(e){if(this._status!==o.c.kError){null===this._contentLength&&null!==e.total&&0!==e.total&&(this._contentLength=e.total,this._onContentLengthKnown&&this._onContentLengthKnown(this._contentLength));var t=e.target.response,l=this._range.from+this._receivedLength;this._receivedLength+=t.byteLength,this._onDataArrival&&this._onDataArrival(t,l,this._receivedLength)}},t.prototype._onLoadEnd=function(e){!0!==this._requestAbort?this._status!==o.c.kError&&(this._status=o.c.kComplete,this._onComplete&&this._onComplete(this._range.from,this._range.from+this._receivedLength-1)):this._requestAbort=!1},t.prototype._onXhrError=function(e){this._status=o.c.kError;var t=0,l=null;if(this._contentLength&&e.loaded<this._contentLength?(t=o.b.EARLY_EOF,l={code:-1,msg:"Moz-Chunked stream meet Early-Eof"}):(t=o.b.EXCEPTION,l={code:-1,msg:e.constructor.name+" "+e.type}),!this._onError)throw new d.d(l.msg);this._onError(t,l)},t}(o.a),h=function(){var e=function(t,l){return(e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var l in t)Object.prototype.hasOwnProperty.call(t,l)&&(e[l]=t[l])})(t,l)};return function(t,l){if("function"!=typeof l&&null!==l)throw new TypeError("Class extends value "+String(l)+" is not a constructor or null");function a(){this.constructor=t}e(t,l),t.prototype=null===l?Object.create(l):(a.prototype=l.prototype,new a)}}(),r=(function(e){function t(t,l){var a=e.call(this,"xhr-msstream-loader")||this;return a.TAG="MSStreamLoader",a._seekHandler=t,a._config=l,a._needStash=!0,a._xhr=null,a._reader=null,a._totalRange=null,a._currentRange=null,a._currentRequestURL=null,a._currentRedirectedURL=null,a._contentLength=null,a._receivedLength=0,a._bufferLimit=16777216,a._lastTimeBufferSize=0,a._isReconnecting=!1,a}h(t,e),t.isSupported=function(){try{if(void 0===self.MSStream||void 0===self.MSStreamReader)return!1;var e=new XMLHttpRequest;return e.open("GET","https://example.com",!0),e.responseType="ms-stream","ms-stream"===e.responseType}catch(e){return i.a.w("MSStreamLoader",e.message),!1}},t.prototype.destroy=function(){this.isWorking()&&this.abort(),this._reader&&(this._reader.onprogress=null,this._reader.onload=null,this._reader.onerror=null,this._reader=null),this._xhr&&(this._xhr.onreadystatechange=null,this._xhr=null),e.prototype.destroy.call(this)},t.prototype.open=function(e,t){this._internalOpen(e,t,!1)},t.prototype._internalOpen=function(e,t,l){this._dataSource=e,l?this._currentRange=t:this._totalRange=t;var a=e.url;this._config.reuseRedirectedURL&&(null!=this._currentRedirectedURL?a=this._currentRedirectedURL:null!=e.redirectedURL&&(a=e.redirectedURL));var i=this._seekHandler.getConfig(a,t);this._currentRequestURL=i.url;var n=this._reader=new self.MSStreamReader;n.onprogress=this._msrOnProgress.bind(this),n.onload=this._msrOnLoad.bind(this),n.onerror=this._msrOnError.bind(this);var c=this._xhr=new XMLHttpRequest;if(c.open("GET",i.url,!0),c.responseType="ms-stream",c.onreadystatechange=this._xhrOnReadyStateChange.bind(this),c.onerror=this._xhrOnError.bind(this),e.withCredentials&&(c.withCredentials=!0),"object"==typeof i.headers){var d=i.headers;for(var g in d)d.hasOwnProperty(g)&&c.setRequestHeader(g,d[g])}if("object"==typeof this._config.headers)for(var g in d=this._config.headers)d.hasOwnProperty(g)&&c.setRequestHeader(g,d[g]);this._isReconnecting?this._isReconnecting=!1:this._status=o.c.kConnecting,c.send()},t.prototype.abort=function(){this._internalAbort(),this._status=o.c.kComplete},t.prototype._internalAbort=function(){this._reader&&(1===this._reader.readyState&&this._reader.abort(),this._reader.onprogress=null,this._reader.onload=null,this._reader.onerror=null,this._reader=null),this._xhr&&(this._xhr.abort(),this._xhr.onreadystatechange=null,this._xhr=null)},t.prototype._xhrOnReadyStateChange=function(e){var t=e.target;if(2===t.readyState)if(t.status>=200&&t.status<=299){if(this._status=o.c.kBuffering,null!=t.responseURL){var l=this._seekHandler.removeURLParameters(t.responseURL);t.responseURL!==this._currentRequestURL&&l!==this._currentRedirectedURL&&(this._currentRedirectedURL=l,this._onURLRedirect&&this._onURLRedirect(l))}var a=t.getResponseHeader("Content-Length");if(null!=a&&null==this._contentLength){var i=parseInt(a);i>0&&(this._contentLength=i,this._onContentLengthKnown&&this._onContentLengthKnown(this._contentLength))}}else{if(this._status=o.c.kError,!this._onError)throw new d.d("MSStreamLoader: Http code invalid, "+t.status+" "+t.statusText);this._onError(o.b.HTTP_STATUS_CODE_INVALID,{code:t.status,msg:t.statusText})}else if(3===t.readyState&&t.status>=200&&t.status<=299){this._status=o.c.kBuffering;var n=t.response;this._reader.readAsArrayBuffer(n)}},t.prototype._xhrOnError=function(e){this._status=o.c.kError;var t=o.b.EXCEPTION,l={code:-1,msg:e.constructor.name+" "+e.type};if(!this._onError)throw new d.d(l.msg);this._onError(t,l)},t.prototype._msrOnProgress=function(e){var t=e.target.result;if(null!=t){var l=t.slice(this._lastTimeBufferSize);this._lastTimeBufferSize=t.byteLength;var a=this._totalRange.from+this._receivedLength;this._receivedLength+=l.byteLength,this._onDataArrival&&this._onDataArrival(l,a,this._receivedLength),t.byteLength>=this._bufferLimit&&(i.a.v(this.TAG,"MSStream buffer exceeded max size near ".concat(a+l.byteLength,", reconnecting...")),this._doReconnectIfNeeded())}else this._doReconnectIfNeeded()},t.prototype._doReconnectIfNeeded=function(){if(null==this._contentLength||this._receivedLength<this._contentLength){this._isReconnecting=!0,this._lastTimeBufferSize=0,this._internalAbort();var e={from:this._totalRange.from+this._receivedLength,to:-1};this._internalOpen(this._dataSource,e,!0)}},t.prototype._msrOnLoad=function(e){this._status=o.c.kComplete,this._onComplete&&this._onComplete(this._totalRange.from,this._totalRange.from+this._receivedLength-1)},t.prototype._msrOnError=function(e){this._status=o.c.kError;var t=0,l=null;if(this._contentLength&&this._receivedLength<this._contentLength?(t=o.b.EARLY_EOF,l={code:-1,msg:"MSStream meet Early-Eof"}):(t=o.b.EARLY_EOF,l={code:-1,msg:e.constructor.name+" "+e.type}),!this._onError)throw new d.d(l.msg);this._onError(t,l)}}(o.a),function(){var e=function(t,l){return(e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var l in t)Object.prototype.hasOwnProperty.call(t,l)&&(e[l]=t[l])})(t,l)};return function(t,l){if("function"!=typeof l&&null!==l)throw new TypeError("Class extends value "+String(l)+" is not a constructor or null");function a(){this.constructor=t}e(t,l),t.prototype=null===l?Object.create(l):(a.prototype=l.prototype,new a)}}()),Z=function(e){function t(t,l){var a=e.call(this,"xhr-range-loader")||this;return a.TAG="RangeLoader",a._seekHandler=t,a._config=l,a._needStash=!1,a._chunkSizeKBList=[128,256,384,512,768,1024,1536,2048,3072,4096,5120,6144,7168,8192],a._currentChunkSizeKB=384,a._currentSpeedNormalized=0,a._zeroSpeedChunkCount=0,a._xhr=null,a._speedSampler=new n,a._requestAbort=!1,a._waitForTotalLength=!1,a._totalLengthReceived=!1,a._currentRequestURL=null,a._currentRedirectedURL=null,a._currentRequestRange=null,a._totalLength=null,a._contentLength=null,a._receivedLength=0,a._lastTimeLoaded=0,a}return r(t,e),t.isSupported=function(){try{var e=new XMLHttpRequest;return e.open("GET","https://example.com",!0),e.responseType="arraybuffer","arraybuffer"===e.responseType}catch(e){return i.a.w("RangeLoader",e.message),!1}},t.prototype.destroy=function(){this.isWorking()&&this.abort(),this._xhr&&(this._xhr.onreadystatechange=null,this._xhr.onprogress=null,this._xhr.onload=null,this._xhr.onerror=null,this._xhr=null),e.prototype.destroy.call(this)},Object.defineProperty(t.prototype,"currentSpeed",{get:function(){return this._speedSampler.lastSecondKBps},enumerable:!1,configurable:!0}),t.prototype.open=function(e,t){this._dataSource=e,this._range=t,this._status=o.c.kConnecting;var l=!1;null!=this._dataSource.filesize&&0!==this._dataSource.filesize&&(l=!0,this._totalLength=this._dataSource.filesize),this._totalLengthReceived||l?this._openSubRange():(this._waitForTotalLength=!0,this._internalOpen(this._dataSource,{from:0,to:-1}))},t.prototype._openSubRange=function(){var e=1024*this._currentChunkSizeKB,t=this._range.from+this._receivedLength,l=t+e;null!=this._contentLength&&l-this._range.from>=this._contentLength&&(l=this._range.from+this._contentLength-1),this._currentRequestRange={from:t,to:l},this._internalOpen(this._dataSource,this._currentRequestRange)},t.prototype._internalOpen=function(e,t){this._lastTimeLoaded=0;var l=e.url;this._config.reuseRedirectedURL&&(null!=this._currentRedirectedURL?l=this._currentRedirectedURL:null!=e.redirectedURL&&(l=e.redirectedURL));var a=this._seekHandler.getConfig(l,t);this._currentRequestURL=a.url;var i=this._xhr=new XMLHttpRequest;if(i.open("GET",a.url,!0),i.responseType="arraybuffer",i.onreadystatechange=this._onReadyStateChange.bind(this),i.onprogress=this._onProgress.bind(this),i.onload=this._onLoad.bind(this),i.onerror=this._onXhrError.bind(this),e.withCredentials&&(i.withCredentials=!0),"object"==typeof a.headers){var n=a.headers;for(var o in n)n.hasOwnProperty(o)&&i.setRequestHeader(o,n[o])}if("object"==typeof this._config.headers)for(var o in n=this._config.headers)n.hasOwnProperty(o)&&i.setRequestHeader(o,n[o]);i.send()},t.prototype.abort=function(){this._requestAbort=!0,this._internalAbort(),this._status=o.c.kComplete},t.prototype._internalAbort=function(){this._xhr&&(this._xhr.onreadystatechange=null,this._xhr.onprogress=null,this._xhr.onload=null,this._xhr.onerror=null,this._xhr.abort(),this._xhr=null)},t.prototype._onReadyStateChange=function(e){var t=e.target;if(2===t.readyState){if(null!=t.responseURL){var l=this._seekHandler.removeURLParameters(t.responseURL);t.responseURL!==this._currentRequestURL&&l!==this._currentRedirectedURL&&(this._currentRedirectedURL=l,this._onURLRedirect&&this._onURLRedirect(l))}if(t.status>=200&&t.status<=299){if(this._waitForTotalLength)return;this._status=o.c.kBuffering}else{if(this._status=o.c.kError,!this._onError)throw new d.d("RangeLoader: Http code invalid, "+t.status+" "+t.statusText);this._onError(o.b.HTTP_STATUS_CODE_INVALID,{code:t.status,msg:t.statusText})}}},t.prototype._onProgress=function(e){if(this._status!==o.c.kError){if(null===this._contentLength){var t=!1;if(this._waitForTotalLength){this._waitForTotalLength=!1,this._totalLengthReceived=!0,t=!0;var l=e.total;this._internalAbort(),null!=l&0!==l&&(this._totalLength=l)}if(-1===this._range.to?this._contentLength=this._totalLength-this._range.from:this._contentLength=this._range.to-this._range.from+1,t)return void this._openSubRange();this._onContentLengthKnown&&this._onContentLengthKnown(this._contentLength)}var a=e.loaded-this._lastTimeLoaded;this._lastTimeLoaded=e.loaded,this._speedSampler.addBytes(a)}},t.prototype._normalizeSpeed=function(e){var t=this._chunkSizeKBList,l=t.length-1,a=0,i=0,n=l;if(e<t[0])return t[0];for(;i<=n;){if((a=i+Math.floor((n-i)/2))===l||e>=t[a]&&e<t[a+1])return t[a];t[a]<e?i=a+1:n=a-1}},t.prototype._onLoad=function(e){if(this._status!==o.c.kError)if(this._waitForTotalLength)this._waitForTotalLength=!1;else{this._lastTimeLoaded=0;var t=this._speedSampler.lastSecondKBps;if(0===t&&(this._zeroSpeedChunkCount++,this._zeroSpeedChunkCount>=3&&(t=this._speedSampler.currentKBps)),0!==t){var l=this._normalizeSpeed(t);this._currentSpeedNormalized!==l&&(this._currentSpeedNormalized=l,this._currentChunkSizeKB=l)}var a=e.target.response,i=this._range.from+this._receivedLength;this._receivedLength+=a.byteLength;var n=!1;null!=this._contentLength&&this._receivedLength<this._contentLength?this._openSubRange():n=!0,this._onDataArrival&&this._onDataArrival(a,i,this._receivedLength),n&&(this._status=o.c.kComplete,this._onComplete&&this._onComplete(this._range.from,this._range.from+this._receivedLength-1))}},t.prototype._onXhrError=function(e){this._status=o.c.kError;var t=0,l=null;if(this._contentLength&&this._receivedLength>0&&this._receivedLength<this._contentLength?(t=o.b.EARLY_EOF,l={code:-1,msg:"RangeLoader meet Early-Eof"}):(t=o.b.EXCEPTION,l={code:-1,msg:e.constructor.name+" "+e.type}),!this._onError)throw new d.d(l.msg);this._onError(t,l)},t}(o.a),I=function(){var e=function(t,l){return(e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var l in t)Object.prototype.hasOwnProperty.call(t,l)&&(e[l]=t[l])})(t,l)};return function(t,l){if("function"!=typeof l&&null!==l)throw new TypeError("Class extends value "+String(l)+" is not a constructor or null");function a(){this.constructor=t}e(t,l),t.prototype=null===l?Object.create(l):(a.prototype=l.prototype,new a)}}(),J=function(e){function t(){var t=e.call(this,"websocket-loader")||this;return t.TAG="WebSocketLoader",t._needStash=!0,t._ws=null,t._requestAbort=!1,t._receivedLength=0,t}return I(t,e),t.isSupported=function(){try{return void 0!==self.WebSocket}catch(e){return!1}},t.prototype.destroy=function(){this._ws&&this.abort(),e.prototype.destroy.call(this)},t.prototype.open=function(e){try{var t=this._ws=new self.WebSocket(e.url);t.binaryType="arraybuffer",t.onopen=this._onWebSocketOpen.bind(this),t.onclose=this._onWebSocketClose.bind(this),t.onmessage=this._onWebSocketMessage.bind(this),t.onerror=this._onWebSocketError.bind(this),this._status=o.c.kConnecting}catch(e){this._status=o.c.kError;var l={code:e.code,msg:e.message};if(!this._onError)throw new d.d(l.msg);this._onError(o.b.EXCEPTION,l)}},t.prototype.abort=function(){var e=this._ws;!e||0!==e.readyState&&1!==e.readyState||(this._requestAbort=!0,e.close()),this._ws=null,this._status=o.c.kComplete},t.prototype._onWebSocketOpen=function(e){this._status=o.c.kBuffering},t.prototype._onWebSocketClose=function(e){!0!==this._requestAbort?(this._status=o.c.kComplete,this._onComplete&&this._onComplete(0,this._receivedLength-1)):this._requestAbort=!1},t.prototype._onWebSocketMessage=function(e){var t=this;if(e.data instanceof ArrayBuffer)this._dispatchArrayBuffer(e.data);else if(e.data instanceof Blob){var l=new FileReader;l.onload=function(){t._dispatchArrayBuffer(l.result)},l.readAsArrayBuffer(e.data)}else{this._status=o.c.kError;var a={code:-1,msg:"Unsupported WebSocket message type: "+e.data.constructor.name};if(!this._onError)throw new d.d(a.msg);this._onError(o.b.EXCEPTION,a)}},t.prototype._dispatchArrayBuffer=function(e){var t=e,l=this._receivedLength;this._receivedLength+=t.byteLength,this._onDataArrival&&this._onDataArrival(t,l,this._receivedLength)},t.prototype._onWebSocketError=function(e){this._status=o.c.kError;var t={code:e.code,msg:e.message};if(!this._onError)throw new d.d(t.msg);this._onError(o.b.EXCEPTION,t)},t}(o.a),u=function(){function e(e){this._zeroStart=e||!1}return e.prototype.getConfig=function(e,t){var l={};if(0!==t.from||-1!==t.to){var a=void 0;a=-1!==t.to?"bytes=".concat(t.from.toString(),"-").concat(t.to.toString()):"bytes=".concat(t.from.toString(),"-"),l.Range=a}else this._zeroStart&&(l.Range="bytes=0-");return{url:e,headers:l}},e.prototype.removeURLParameters=function(e){return e},e}(),b=function(){function e(e,t){this._startName=e,this._endName=t}return e.prototype.getConfig=function(e,t){var l=e;if(0!==t.from||-1!==t.to){var a=!0;-1===l.indexOf("?")&&(l+="?",a=!1),a&&(l+="&"),l+="".concat(this._startName,"=").concat(t.from.toString()),-1!==t.to&&(l+="&".concat(this._endName,"=").concat(t.to.toString()))}return{url:l,headers:{}}},e.prototype.removeURLParameters=function(e){var t=e.split("?")[0],l=void 0,a=e.indexOf("?");-1!==a&&(l=e.substring(a+1));var i="";if(null!=l&&l.length>0)for(var n=l.split("&"),o=0;o<n.length;o++){var c=n[o].split("="),d=o>0;c[0]!==this._startName&&c[0]!==this._endName&&(d&&(i+="&"),i+=n[o])}return 0===i.length?t:t+"?"+i},e}(),G=function(){function e(e,t,l){this.TAG="IOController",this._config=t,this._extraData=l,this._stashInitialSize=65536,null!=t.stashInitialSize&&t.stashInitialSize>0&&(this._stashInitialSize=t.stashInitialSize),this._stashUsed=0,this._stashSize=this._stashInitialSize,this._bufferSize=Math.max(this._stashSize,3145728),this._stashBuffer=new ArrayBuffer(this._bufferSize),this._stashByteStart=0,this._enableStash=!0,!1===t.enableStashBuffer&&(this._enableStash=!1),this._loader=null,this._loaderClass=null,this._seekHandler=null,this._dataSource=e,this._isWebSocketURL=/wss?:\/\/(.+?)/.test(e.url),this._refTotalLength=e.filesize?e.filesize:null,this._totalLength=this._refTotalLength,this._fullRequestFlag=!1,this._currentRange=null,this._redirectedURL=null,this._speedNormalized=0,this._speedSampler=new n,this._speedNormalizeList=[32,64,96,128,192,256,384,512,768,1024,1536,2048,3072,4096],this._isEarlyEofReconnecting=!1,this._paused=!1,this._resumeFrom=0,this._onDataArrival=null,this._onSeeked=null,this._onError=null,this._onComplete=null,this._onRedirect=null,this._onRecoveredEarlyEof=null,this._selectSeekHandler(),this._selectLoader(),this._createLoader()}return e.prototype.destroy=function(){this._loader.isWorking()&&this._loader.abort(),this._loader.destroy(),this._loader=null,this._loaderClass=null,this._dataSource=null,this._stashBuffer=null,this._stashUsed=this._stashSize=this._bufferSize=this._stashByteStart=0,this._currentRange=null,this._speedSampler=null,this._isEarlyEofReconnecting=!1,this._onDataArrival=null,this._onSeeked=null,this._onError=null,this._onComplete=null,this._onRedirect=null,this._onRecoveredEarlyEof=null,this._extraData=null},e.prototype.isWorking=function(){return this._loader&&this._loader.isWorking()&&!this._paused},e.prototype.isPaused=function(){return this._paused},Object.defineProperty(e.prototype,"status",{get:function(){return this._loader.status},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"extraData",{get:function(){return this._extraData},set:function(e){this._extraData=e},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"onDataArrival",{get:function(){return this._onDataArrival},set:function(e){this._onDataArrival=e},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"onSeeked",{get:function(){return this._onSeeked},set:function(e){this._onSeeked=e},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"onError",{get:function(){return this._onError},set:function(e){this._onError=e},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"onComplete",{get:function(){return this._onComplete},set:function(e){this._onComplete=e},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"onRedirect",{get:function(){return this._onRedirect},set:function(e){this._onRedirect=e},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"onRecoveredEarlyEof",{get:function(){return this._onRecoveredEarlyEof},set:function(e){this._onRecoveredEarlyEof=e},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"currentURL",{get:function(){return this._dataSource.url},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"hasRedirect",{get:function(){return null!=this._redirectedURL||null!=this._dataSource.redirectedURL},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"currentRedirectedURL",{get:function(){return this._redirectedURL||this._dataSource.redirectedURL},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"currentSpeed",{get:function(){return this._loaderClass===Z?this._loader.currentSpeed:this._speedSampler.lastSecondKBps},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"loaderType",{get:function(){return this._loader.type},enumerable:!1,configurable:!0}),e.prototype._selectSeekHandler=function(){var e=this._config;if("range"===e.seekType)this._seekHandler=new u(this._config.rangeLoadZeroStart);else if("param"===e.seekType){var t=e.seekParamStart||"bstart",l=e.seekParamEnd||"bend";this._seekHandler=new b(t,l)}else{if("custom"!==e.seekType)throw new d.b("Invalid seekType in config: ".concat(e.seekType));if("function"!=typeof e.customSeekHandler)throw new d.b("Custom seekType specified in config but invalid customSeekHandler!");this._seekHandler=new e.customSeekHandler}},e.prototype._selectLoader=function(){if(null!=this._config.customLoader)this._loaderClass=this._config.customLoader;else if(this._isWebSocketURL)this._loaderClass=J;else if(s.isSupported())this._loaderClass=s;else if(m.isSupported())this._loaderClass=m;else{if(!Z.isSupported())throw new d.d("Your browser doesn't support xhr with arraybuffer responseType!");this._loaderClass=Z}},e.prototype._createLoader=function(){this._loader=new this._loaderClass(this._seekHandler,this._config),!1===this._loader.needStashBuffer&&(this._enableStash=!1),this._loader.onContentLengthKnown=this._onContentLengthKnown.bind(this),this._loader.onURLRedirect=this._onURLRedirect.bind(this),this._loader.onDataArrival=this._onLoaderChunkArrival.bind(this),this._loader.onComplete=this._onLoaderComplete.bind(this),this._loader.onError=this._onLoaderError.bind(this)},e.prototype.open=function(e){this._currentRange={from:0,to:-1},e&&(this._currentRange.from=e),this._speedSampler.reset(),e||(this._fullRequestFlag=!0),this._loader.open(this._dataSource,Object.assign({},this._currentRange))},e.prototype.abort=function(){this._loader.abort(),this._paused&&(this._paused=!1,this._resumeFrom=0)},e.prototype.pause=function(){this.isWorking()&&(this._loader.abort(),0!==this._stashUsed?(this._resumeFrom=this._stashByteStart,this._currentRange.to=this._stashByteStart-1):this._resumeFrom=this._currentRange.to+1,this._stashUsed=0,this._stashByteStart=0,this._paused=!0)},e.prototype.resume=function(){if(this._paused){this._paused=!1;var e=this._resumeFrom;this._resumeFrom=0,this._internalSeek(e,!0)}},e.prototype.seek=function(e){this._paused=!1,this._stashUsed=0,this._stashByteStart=0,this._internalSeek(e,!0)},e.prototype._internalSeek=function(e,t){this._loader.isWorking()&&this._loader.abort(),this._flushStashBuffer(t),this._loader.destroy(),this._loader=null;var l={from:e,to:-1};this._currentRange={from:l.from,to:-1},this._speedSampler.reset(),this._stashSize=this._stashInitialSize,this._createLoader(),this._loader.open(this._dataSource,l),this._onSeeked&&this._onSeeked()},e.prototype.updateUrl=function(e){if(!e||"string"!=typeof e||0===e.length)throw new d.b("Url must be a non-empty string!");this._dataSource.url=e},e.prototype._expandBuffer=function(e){for(var t=this._stashSize;t+1048576<e;)t*=2;if((t+=1048576)!==this._bufferSize){var l=new ArrayBuffer(t);if(this._stashUsed>0){var a=new Uint8Array(this._stashBuffer,0,this._stashUsed);new Uint8Array(l,0,t).set(a,0)}this._stashBuffer=l,this._bufferSize=t}},e.prototype._normalizeSpeed=function(e){var t=this._speedNormalizeList,l=t.length-1,a=0,i=0,n=l;if(e<t[0])return t[0];for(;i<=n;){if((a=i+Math.floor((n-i)/2))===l||e>=t[a]&&e<t[a+1])return t[a];t[a]<e?i=a+1:n=a-1}},e.prototype._adjustStashSize=function(e){var t=0;(t=this._config.isLive?e/8:e<512?e:e>=512&&e<=1024?Math.floor(1.5*e):2*e)>8192&&(t=8192);var l=1024*t+1048576;this._bufferSize<l&&this._expandBuffer(l),this._stashSize=1024*t},e.prototype._dispatchChunks=function(e,t){return this._currentRange.to=t+e.byteLength-1,this._onDataArrival(e,t)},e.prototype._onURLRedirect=function(e){this._redirectedURL=e,this._onRedirect&&this._onRedirect(e)},e.prototype._onContentLengthKnown=function(e){e&&this._fullRequestFlag&&(this._totalLength=e,this._fullRequestFlag=!1)},e.prototype._onLoaderChunkArrival=function(e,t,l){if(!this._onDataArrival)throw new d.a("IOController: No existing consumer (onDataArrival) callback!");if(!this._paused){this._isEarlyEofReconnecting&&(this._isEarlyEofReconnecting=!1,this._onRecoveredEarlyEof&&this._onRecoveredEarlyEof()),this._speedSampler.addBytes(e.byteLength);var a=this._speedSampler.lastSecondKBps;if(0!==a){var i=this._normalizeSpeed(a);this._speedNormalized!==i&&(this._speedNormalized=i,this._adjustStashSize(i))}if(this._enableStash)if(0===this._stashUsed&&0===this._stashByteStart&&(this._stashByteStart=t),this._stashUsed+e.byteLength<=this._stashSize)(c=new Uint8Array(this._stashBuffer,0,this._stashSize)).set(new Uint8Array(e),this._stashUsed),this._stashUsed+=e.byteLength;else if(c=new Uint8Array(this._stashBuffer,0,this._bufferSize),this._stashUsed>0){var n=this._stashBuffer.slice(0,this._stashUsed);(g=this._dispatchChunks(n,this._stashByteStart))<n.byteLength?g>0&&(s=new Uint8Array(n,g),c.set(s,0),this._stashUsed=s.byteLength,this._stashByteStart+=g):(this._stashUsed=0,this._stashByteStart+=g),this._stashUsed+e.byteLength>this._bufferSize&&(this._expandBuffer(this._stashUsed+e.byteLength),c=new Uint8Array(this._stashBuffer,0,this._bufferSize)),c.set(new Uint8Array(e),this._stashUsed),this._stashUsed+=e.byteLength}else(g=this._dispatchChunks(e,t))<e.byteLength&&((o=e.byteLength-g)>this._bufferSize&&(this._expandBuffer(o),c=new Uint8Array(this._stashBuffer,0,this._bufferSize)),c.set(new Uint8Array(e,g),0),this._stashUsed+=o,this._stashByteStart=t+g);else if(0===this._stashUsed){var o;(g=this._dispatchChunks(e,t))<e.byteLength&&((o=e.byteLength-g)>this._bufferSize&&this._expandBuffer(o),(c=new Uint8Array(this._stashBuffer,0,this._bufferSize)).set(new Uint8Array(e,g),0),this._stashUsed+=o,this._stashByteStart=t+g)}else{var c,g;if(this._stashUsed+e.byteLength>this._bufferSize&&this._expandBuffer(this._stashUsed+e.byteLength),(c=new Uint8Array(this._stashBuffer,0,this._bufferSize)).set(new Uint8Array(e),this._stashUsed),this._stashUsed+=e.byteLength,(g=this._dispatchChunks(this._stashBuffer.slice(0,this._stashUsed),this._stashByteStart))<this._stashUsed&&g>0){var s=new Uint8Array(this._stashBuffer,g);c.set(s,0)}this._stashUsed-=g,this._stashByteStart+=g}}},e.prototype._flushStashBuffer=function(e){if(this._stashUsed>0){var t=this._stashBuffer.slice(0,this._stashUsed),l=this._dispatchChunks(t,this._stashByteStart),a=t.byteLength-l;if(l<t.byteLength){if(!e){if(l>0){var n=new Uint8Array(this._stashBuffer,0,this._bufferSize),o=new Uint8Array(t,l);n.set(o,0),this._stashUsed=o.byteLength,this._stashByteStart+=l}return 0}i.a.w(this.TAG,"".concat(a," bytes unconsumed data remain when flush buffer, dropped"))}return this._stashUsed=0,this._stashByteStart=0,a}return 0},e.prototype._onLoaderComplete=function(e,t){this._flushStashBuffer(!0),this._onComplete&&this._onComplete(this._extraData)},e.prototype._onLoaderError=function(e,t){switch(i.a.e(this.TAG,"Loader error, code = ".concat(t.code,", msg = ").concat(t.msg)),this._flushStashBuffer(!1),this._isEarlyEofReconnecting&&(this._isEarlyEofReconnecting=!1,e=o.b.UNRECOVERABLE_EARLY_EOF),e){case o.b.EARLY_EOF:if(!this._config.isLive&&this._totalLength){var l=this._currentRange.to+1;return void(l<this._totalLength&&(i.a.w(this.TAG,"Connection lost, trying reconnect..."),this._isEarlyEofReconnecting=!0,this._internalSeek(l,!1)))}e=o.b.UNRECOVERABLE_EARLY_EOF;case o.b.UNRECOVERABLE_EARLY_EOF:case o.b.CONNECTING_TIMEOUT:case o.b.HTTP_STATUS_CODE_INVALID:case o.b.EXCEPTION:}if(!this._onError)throw new d.d("IOException: "+t.msg);this._onError(e,t)},e}();t.a=G},function(e,t,l){var a=function(){function e(){}return e.install=function(){Object.setPrototypeOf=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e},Object.assign=Object.assign||function(e){if(null==e)throw new TypeError("Cannot convert undefined or null to object");for(var t=Object(e),l=1;l<arguments.length;l++){var a=arguments[l];if(null!=a)for(var i in a)a.hasOwnProperty(i)&&(t[i]=a[i])}return t},String.prototype.startsWith||Object.defineProperty(String.prototype,"startsWith",{value:function(e,t){var l=t>0?0|t:0;return this.substring(l,l+e.length)===e}}),"function"!=typeof self.Promise&&l(21).polyfill()},e}();a.install(),t.a=a},function(e,t,l){var a=l(9),i=l.n(a),n=l(0),o=l(5),c=l(7),d=l(3),g=function(){function e(e){this.TAG="MSEController",this._config=e,this._emitter=new i.a,this._config.isLive&&null==this._config.autoCleanupSourceBuffer&&(this._config.autoCleanupSourceBuffer=!0),this.e={onSourceOpen:this._onSourceOpen.bind(this),onSourceEnded:this._onSourceEnded.bind(this),onSourceClose:this._onSourceClose.bind(this),onStartStreaming:this._onStartStreaming.bind(this),onEndStreaming:this._onEndStreaming.bind(this),onQualityChange:this._onQualityChange.bind(this),onSourceBufferError:this._onSourceBufferError.bind(this),onSourceBufferUpdateEnd:this._onSourceBufferUpdateEnd.bind(this)},this._useManagedMediaSource="ManagedMediaSource"in self&&!("MediaSource"in self),this._mediaSource=null,this._mediaSourceObjectURL=null,this._mediaElementProxy=null,this._isBufferFull=!1,this._hasPendingEos=!1,this._requireSetMediaDuration=!1,this._pendingMediaDuration=0,this._pendingSourceBufferInit=[],this._mimeTypes={video:null,audio:null},this._sourceBuffers={video:null,audio:null},this._lastInitSegments={video:null,audio:null},this._pendingSegments={video:[],audio:[]},this._pendingRemoveRanges={video:[],audio:[]}}return e.prototype.destroy=function(){this._mediaSource&&this.shutdown(),this._mediaSourceObjectURL&&this.revokeObjectURL(),this.e=null,this._emitter.removeAllListeners(),this._emitter=null},e.prototype.on=function(e,t){this._emitter.addListener(e,t)},e.prototype.off=function(e,t){this._emitter.removeListener(e,t)},e.prototype.initialize=function(e){if(this._mediaSource)throw new d.a("MediaSource has been attached to an HTMLMediaElement!");this._useManagedMediaSource&&n.a.v(this.TAG,"Using ManagedMediaSource");var t=this._mediaSource=this._useManagedMediaSource?new self.ManagedMediaSource:new self.MediaSource;t.addEventListener("sourceopen",this.e.onSourceOpen),t.addEventListener("sourceended",this.e.onSourceEnded),t.addEventListener("sourceclose",this.e.onSourceClose),this._useManagedMediaSource&&(t.addEventListener("startstreaming",this.e.onStartStreaming),t.addEventListener("endstreaming",this.e.onEndStreaming),t.addEventListener("qualitychange",this.e.onQualityChange)),this._mediaElementProxy=e},e.prototype.shutdown=function(){if(this._mediaSource){var e=this._mediaSource;for(var t in this._sourceBuffers){var l=this._pendingSegments[t];l.splice(0,l.length),this._pendingSegments[t]=null,this._pendingRemoveRanges[t]=null,this._lastInitSegments[t]=null;var a=this._sourceBuffers[t];if(a){if("closed"!==e.readyState){try{e.removeSourceBuffer(a)}catch(e){n.a.e(this.TAG,e.message)}a.removeEventListener("error",this.e.onSourceBufferError),a.removeEventListener("updateend",this.e.onSourceBufferUpdateEnd)}this._mimeTypes[t]=null,this._sourceBuffers[t]=null}}if("open"===e.readyState)try{e.endOfStream()}catch(e){n.a.e(this.TAG,e.message)}this._mediaElementProxy=null,e.removeEventListener("sourceopen",this.e.onSourceOpen),e.removeEventListener("sourceended",this.e.onSourceEnded),e.removeEventListener("sourceclose",this.e.onSourceClose),this._useManagedMediaSource&&(e.removeEventListener("startstreaming",this.e.onStartStreaming),e.removeEventListener("endstreaming",this.e.onEndStreaming),e.removeEventListener("qualitychange",this.e.onQualityChange)),this._pendingSourceBufferInit=[],this._isBufferFull=!1,this._mediaSource=null}},e.prototype.isManagedMediaSource=function(){return this._useManagedMediaSource},e.prototype.getObject=function(){if(!this._mediaSource)throw new d.a("MediaSource has not been initialized yet!");return this._mediaSource},e.prototype.getHandle=function(){if(!this._mediaSource)throw new d.a("MediaSource has not been initialized yet!");return this._mediaSource.handle},e.prototype.getObjectURL=function(){if(!this._mediaSource)throw new d.a("MediaSource has not been initialized yet!");return null==this._mediaSourceObjectURL&&(this._mediaSourceObjectURL=URL.createObjectURL(this._mediaSource)),this._mediaSourceObjectURL},e.prototype.revokeObjectURL=function(){this._mediaSourceObjectURL&&(URL.revokeObjectURL(this._mediaSourceObjectURL),this._mediaSourceObjectURL=null)},e.prototype.appendInitSegment=function(e,t){if(void 0===t&&(t=void 0),!this._mediaSource||"open"!==this._mediaSource.readyState||!1===this._mediaSource.streaming)return this._pendingSourceBufferInit.push(e),void this._pendingSegments[e.type].push(e);var l=e,a="".concat(l.container);l.codec&&l.codec.length>0&&("opus"===l.codec&&o.a.safari&&(l.codec="Opus"),a+=";codecs=".concat(l.codec));var i=!1;if(n.a.v(this.TAG,"Received Initialization Segment, mimeType: "+a),this._lastInitSegments[l.type]=l,a!==this._mimeTypes[l.type]){if(this._mimeTypes[l.type])n.a.v(this.TAG,"Notice: ".concat(l.type," mimeType changed, origin: ").concat(this._mimeTypes[l.type],", target: ").concat(a));else{i=!0;try{var d=this._sourceBuffers[l.type]=this._mediaSource.addSourceBuffer(a);d.addEventListener("error",this.e.onSourceBufferError),d.addEventListener("updateend",this.e.onSourceBufferUpdateEnd)}catch(e){return n.a.e(this.TAG,e.message),void this._emitter.emit(c.a.ERROR,{code:e.code,msg:e.message})}}this._mimeTypes[l.type]=a}t||this._pendingSegments[l.type].push(l),i||this._sourceBuffers[l.type]&&!this._sourceBuffers[l.type].updating&&this._doAppendSegments(),o.a.safari&&"audio/mpeg"===l.container&&l.mediaDuration>0&&(this._requireSetMediaDuration=!0,this._pendingMediaDuration=l.mediaDuration/1e3,this._updateMediaSourceDuration())},e.prototype.appendMediaSegment=function(e){var t=e;this._pendingSegments[t.type].push(t),this._config.autoCleanupSourceBuffer&&this._needCleanupSourceBuffer()&&this._doCleanupSourceBuffer();var l=this._sourceBuffers[t.type];!l||l.updating||this._hasPendingRemoveRanges()||this._doAppendSegments()},e.prototype.flush=function(){for(var e in this._sourceBuffers)if(this._sourceBuffers[e]){var t=this._sourceBuffers[e];if("open"===this._mediaSource.readyState)try{t.abort()}catch(e){n.a.e(this.TAG,e.message)}var l=this._pendingSegments[e];if(l.splice(0,l.length),"closed"!==this._mediaSource.readyState){for(var a=0;a<t.buffered.length;a++){var i=t.buffered.start(a),c=t.buffered.end(a);this._pendingRemoveRanges[e].push({start:i,end:c})}if(t.updating||this._doRemoveRanges(),o.a.safari){var d=this._lastInitSegments[e];d&&(this._pendingSegments[e].push(d),t.updating||this._doAppendSegments())}}}},e.prototype.endOfStream=function(){var e=this._mediaSource,t=this._sourceBuffers;e&&"open"===e.readyState?t.video&&t.video.updating||t.audio&&t.audio.updating?this._hasPendingEos=!0:(this._hasPendingEos=!1,e.endOfStream()):e&&"closed"===e.readyState&&this._hasPendingSegments()&&(this._hasPendingEos=!0)},e.prototype._needCleanupSourceBuffer=function(){if(!this._config.autoCleanupSourceBuffer)return!1;var e=this._mediaElementProxy.getCurrentTime();for(var t in this._sourceBuffers){var l=this._sourceBuffers[t];if(l){var a=l.buffered;if(a.length>=1&&e-a.start(0)>=this._config.autoCleanupMaxBackwardDuration)return!0}}return!1},e.prototype._doCleanupSourceBuffer=function(){var e=this._mediaElementProxy.getCurrentTime();for(var t in this._sourceBuffers){var l=this._sourceBuffers[t];if(l){for(var a=l.buffered,i=!1,n=0;n<a.length;n++){var o=a.start(n),c=a.end(n);if(o<=e&&e<c+3){if(e-o>=this._config.autoCleanupMaxBackwardDuration){i=!0;var d=e-this._config.autoCleanupMinBackwardDuration;this._pendingRemoveRanges[t].push({start:o,end:d})}}else c<e&&(i=!0,this._pendingRemoveRanges[t].push({start:o,end:c}))}i&&!l.updating&&this._doRemoveRanges()}}},e.prototype._updateMediaSourceDuration=function(){var e=this._sourceBuffers;if(0!==this._mediaElementProxy.getReadyState()&&"open"===this._mediaSource.readyState&&!(e.video&&e.video.updating||e.audio&&e.audio.updating)){var t=this._mediaSource.duration,l=this._pendingMediaDuration;l>0&&(isNaN(t)||l>t)&&(n.a.v(this.TAG,"Update MediaSource duration from ".concat(t," to ").concat(l)),this._mediaSource.duration=l),this._requireSetMediaDuration=!1,this._pendingMediaDuration=0}},e.prototype._doRemoveRanges=function(){for(var e in this._pendingRemoveRanges)if(this._sourceBuffers[e]&&!this._sourceBuffers[e].updating)for(var t=this._sourceBuffers[e],l=this._pendingRemoveRanges[e];l.length&&!t.updating;){var a=l.shift();t.remove(a.start,a.end)}},e.prototype._doAppendSegments=function(){var e=this._pendingSegments;for(var t in e)if(this._sourceBuffers[t]&&!this._sourceBuffers[t].updating&&!1!==this._mediaSource.streaming&&e[t].length>0){var l=e[t].shift();if("number"==typeof l.timestampOffset&&isFinite(l.timestampOffset)){var a=this._sourceBuffers[t].timestampOffset,i=l.timestampOffset/1e3;Math.abs(a-i)>.1&&(n.a.v(this.TAG,"Update MPEG audio timestampOffset from ".concat(a," to ").concat(i)),this._sourceBuffers[t].timestampOffset=i),delete l.timestampOffset}if(!l.data||0===l.data.byteLength)continue;try{this._sourceBuffers[t].appendBuffer(l.data),this._isBufferFull=!1}catch(e){this._pendingSegments[t].unshift(l),22===e.code?(this._isBufferFull||this._emitter.emit(c.a.BUFFER_FULL),this._isBufferFull=!0):(n.a.e(this.TAG,e.message),this._emitter.emit(c.a.ERROR,{code:e.code,msg:e.message}))}}},e.prototype._onSourceOpen=function(){if(n.a.v(this.TAG,"MediaSource onSourceOpen"),this._mediaSource.removeEventListener("sourceopen",this.e.onSourceOpen),this._pendingSourceBufferInit.length>0)for(var e=this._pendingSourceBufferInit;e.length;){var t=e.shift();this.appendInitSegment(t,!0)}this._hasPendingSegments()&&this._doAppendSegments(),this._emitter.emit(c.a.SOURCE_OPEN)},e.prototype._onStartStreaming=function(){n.a.v(this.TAG,"ManagedMediaSource onStartStreaming"),this._emitter.emit(c.a.START_STREAMING)},e.prototype._onEndStreaming=function(){n.a.v(this.TAG,"ManagedMediaSource onEndStreaming"),this._emitter.emit(c.a.END_STREAMING)},e.prototype._onQualityChange=function(){n.a.v(this.TAG,"ManagedMediaSource onQualityChange")},e.prototype._onSourceEnded=function(){n.a.v(this.TAG,"MediaSource onSourceEnded")},e.prototype._onSourceClose=function(){n.a.v(this.TAG,"MediaSource onSourceClose"),this._mediaSource&&null!=this.e&&(this._mediaSource.removeEventListener("sourceopen",this.e.onSourceOpen),this._mediaSource.removeEventListener("sourceended",this.e.onSourceEnded),this._mediaSource.removeEventListener("sourceclose",this.e.onSourceClose),this._useManagedMediaSource&&(this._mediaSource.removeEventListener("startstreaming",this.e.onStartStreaming),this._mediaSource.removeEventListener("endstreaming",this.e.onEndStreaming),this._mediaSource.removeEventListener("qualitychange",this.e.onQualityChange)))},e.prototype._hasPendingSegments=function(){var e=this._pendingSegments;return e.video.length>0||e.audio.length>0},e.prototype._hasPendingRemoveRanges=function(){var e=this._pendingRemoveRanges;return e.video.length>0||e.audio.length>0},e.prototype._onSourceBufferUpdateEnd=function(){this._requireSetMediaDuration?this._updateMediaSourceDuration():this._hasPendingRemoveRanges()?this._doRemoveRanges():this._hasPendingSegments()?this._doAppendSegments():this._hasPendingEos&&this.endOfStream(),this._emitter.emit(c.a.UPDATE_END)},e.prototype._onSourceBufferError=function(e){n.a.e(this.TAG,"SourceBuffer Error: ".concat(e))},e}();t.a=g},function(e,t,l){var a=l(9),i=l.n(a),n=l(18),o=l.n(n),c=l(0),d=l(8),g=l(13),s=l(1),C=(l(19),l(12)),m=function(){function e(e,t){if(this.TAG="Transmuxer",this._emitter=new i.a,t.enableWorker&&"undefined"!=typeof Worker)try{this._worker=o()(19),this._workerDestroying=!1,this._worker.addEventListener("message",this._onWorkerMessage.bind(this)),this._worker.postMessage({cmd:"init",param:[e,t]}),this.e={onLoggingConfigChanged:this._onLoggingConfigChanged.bind(this)},d.a.registerListener(this.e.onLoggingConfigChanged),this._worker.postMessage({cmd:"logging_config",param:d.a.getConfig()})}catch(l){c.a.e(this.TAG,"Error while initialize transmuxing worker, fallback to inline transmuxing"),this._worker=null,this._controller=new g.a(e,t)}else this._controller=new g.a(e,t);if(this._controller){var l=this._controller;l.on(s.a.IO_ERROR,this._onIOError.bind(this)),l.on(s.a.DEMUX_ERROR,this._onDemuxError.bind(this)),l.on(s.a.INIT_SEGMENT,this._onInitSegment.bind(this)),l.on(s.a.MEDIA_SEGMENT,this._onMediaSegment.bind(this)),l.on(s.a.LOADING_COMPLETE,this._onLoadingComplete.bind(this)),l.on(s.a.RECOVERED_EARLY_EOF,this._onRecoveredEarlyEof.bind(this)),l.on(s.a.MEDIA_INFO,this._onMediaInfo.bind(this)),l.on(s.a.METADATA_ARRIVED,this._onMetaDataArrived.bind(this)),l.on(s.a.SCRIPTDATA_ARRIVED,this._onScriptDataArrived.bind(this)),l.on(s.a.TIMED_ID3_METADATA_ARRIVED,this._onTimedID3MetadataArrived.bind(this)),l.on(s.a.SYNCHRONOUS_KLV_METADATA_ARRIVED,this._onSynchronousKLVMetadataArrived.bind(this)),l.on(s.a.ASYNCHRONOUS_KLV_METADATA_ARRIVED,this._onAsynchronousKLVMetadataArrived.bind(this)),l.on(s.a.SMPTE2038_METADATA_ARRIVED,this._onSMPTE2038MetadataArrived.bind(this)),l.on(s.a.SCTE35_METADATA_ARRIVED,this._onSCTE35MetadataArrived.bind(this)),l.on(s.a.PES_PRIVATE_DATA_DESCRIPTOR,this._onPESPrivateDataDescriptor.bind(this)),l.on(s.a.PES_PRIVATE_DATA_ARRIVED,this._onPESPrivateDataArrived.bind(this)),l.on(s.a.STATISTICS_INFO,this._onStatisticsInfo.bind(this)),l.on(s.a.RECOMMEND_SEEKPOINT,this._onRecommendSeekpoint.bind(this))}}return e.prototype.destroy=function(){this._worker?this._workerDestroying||(this._workerDestroying=!0,this._worker.postMessage({cmd:"destroy"}),d.a.removeListener(this.e.onLoggingConfigChanged),this.e=null):(this._controller.destroy(),this._controller=null),this._emitter.removeAllListeners(),this._emitter=null},e.prototype.on=function(e,t){this._emitter.addListener(e,t)},e.prototype.off=function(e,t){this._emitter.removeListener(e,t)},e.prototype.hasWorker=function(){return null!=this._worker},e.prototype.open=function(){this._worker?this._worker.postMessage({cmd:"start"}):this._controller.start()},e.prototype.close=function(){this._worker?this._worker.postMessage({cmd:"stop"}):this._controller.stop()},e.prototype.seek=function(e){this._worker?this._worker.postMessage({cmd:"seek",param:e}):this._controller.seek(e)},e.prototype.pause=function(){this._worker?this._worker.postMessage({cmd:"pause"}):this._controller.pause()},e.prototype.resume=function(){this._worker?this._worker.postMessage({cmd:"resume"}):this._controller.resume()},e.prototype._onInitSegment=function(e,t){var l=this;Promise.resolve().then(function(){l._emitter.emit(s.a.INIT_SEGMENT,e,t)})},e.prototype._onMediaSegment=function(e,t){var l=this;Promise.resolve().then(function(){l._emitter.emit(s.a.MEDIA_SEGMENT,e,t)})},e.prototype._onLoadingComplete=function(){var e=this;Promise.resolve().then(function(){e._emitter.emit(s.a.LOADING_COMPLETE)})},e.prototype._onRecoveredEarlyEof=function(){var e=this;Promise.resolve().then(function(){e._emitter.emit(s.a.RECOVERED_EARLY_EOF)})},e.prototype._onMediaInfo=function(e){var t=this;Promise.resolve().then(function(){t._emitter.emit(s.a.MEDIA_INFO,e)})},e.prototype._onMetaDataArrived=function(e){var t=this;Promise.resolve().then(function(){t._emitter.emit(s.a.METADATA_ARRIVED,e)})},e.prototype._onScriptDataArrived=function(e){var t=this;Promise.resolve().then(function(){t._emitter.emit(s.a.SCRIPTDATA_ARRIVED,e)})},e.prototype._onTimedID3MetadataArrived=function(e){var t=this;Promise.resolve().then(function(){t._emitter.emit(s.a.TIMED_ID3_METADATA_ARRIVED,e)})},e.prototype._onSynchronousKLVMetadataArrived=function(e){var t=this;Promise.resolve().then(function(){t._emitter.emit(s.a.SYNCHRONOUS_KLV_METADATA_ARRIVED,e)})},e.prototype._onAsynchronousKLVMetadataArrived=function(e){var t=this;Promise.resolve().then(function(){t._emitter.emit(s.a.ASYNCHRONOUS_KLV_METADATA_ARRIVED,e)})},e.prototype._onSMPTE2038MetadataArrived=function(e){var t=this;Promise.resolve().then(function(){t._emitter.emit(s.a.SMPTE2038_METADATA_ARRIVED,e)})},e.prototype._onSCTE35MetadataArrived=function(e){var t=this;Promise.resolve().then(function(){t._emitter.emit(s.a.SCTE35_METADATA_ARRIVED,e)})},e.prototype._onPESPrivateDataDescriptor=function(e){var t=this;Promise.resolve().then(function(){t._emitter.emit(s.a.PES_PRIVATE_DATA_DESCRIPTOR,e)})},e.prototype._onPESPrivateDataArrived=function(e){var t=this;Promise.resolve().then(function(){t._emitter.emit(s.a.PES_PRIVATE_DATA_ARRIVED,e)})},e.prototype._onStatisticsInfo=function(e){var t=this;Promise.resolve().then(function(){t._emitter.emit(s.a.STATISTICS_INFO,e)})},e.prototype._onIOError=function(e,t){var l=this;Promise.resolve().then(function(){l._emitter.emit(s.a.IO_ERROR,e,t)})},e.prototype._onDemuxError=function(e,t){var l=this;Promise.resolve().then(function(){l._emitter.emit(s.a.DEMUX_ERROR,e,t)})},e.prototype._onRecommendSeekpoint=function(e){var t=this;Promise.resolve().then(function(){t._emitter.emit(s.a.RECOMMEND_SEEKPOINT,e)})},e.prototype._onLoggingConfigChanged=function(e){this._worker&&this._worker.postMessage({cmd:"logging_config",param:e})},e.prototype._onWorkerMessage=function(e){var t=e.data,l=t.data;if("destroyed"===t.msg||this._workerDestroying)return this._workerDestroying=!1,this._worker.terminate(),void(this._worker=null);switch(t.msg){case s.a.INIT_SEGMENT:case s.a.MEDIA_SEGMENT:this._emitter.emit(t.msg,l.type,l.data);break;case s.a.LOADING_COMPLETE:case s.a.RECOVERED_EARLY_EOF:this._emitter.emit(t.msg);break;case s.a.MEDIA_INFO:Object.setPrototypeOf(l,C.a.prototype),this._emitter.emit(t.msg,l);break;case s.a.METADATA_ARRIVED:case s.a.SCRIPTDATA_ARRIVED:case s.a.TIMED_ID3_METADATA_ARRIVED:case s.a.SYNCHRONOUS_KLV_METADATA_ARRIVED:case s.a.ASYNCHRONOUS_KLV_METADATA_ARRIVED:case s.a.SMPTE2038_METADATA_ARRIVED:case s.a.SCTE35_METADATA_ARRIVED:case s.a.PES_PRIVATE_DATA_DESCRIPTOR:case s.a.PES_PRIVATE_DATA_ARRIVED:case s.a.STATISTICS_INFO:this._emitter.emit(t.msg,l);break;case s.a.IO_ERROR:case s.a.DEMUX_ERROR:this._emitter.emit(t.msg,l.type,l.info);break;case s.a.RECOMMEND_SEEKPOINT:this._emitter.emit(t.msg,l);break;case"logcat_callback":c.a.emitter.emit("log",l.type,l.logcat)}},e}();t.a=m},function(e,t,l){function a(e){var t={};function l(a){if(t[a])return t[a].exports;var i=t[a]={i:a,l:!1,exports:{}};return e[a].call(i.exports,i,i.exports,l),i.l=!0,i.exports}l.m=e,l.c=t,l.i=function(e){return e},l.d=function(e,t,a){l.o(e,t)||Object.defineProperty(e,t,{configurable:!1,enumerable:!0,get:a})},l.r=function(e){Object.defineProperty(e,"__esModule",{value:!0})},l.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return l.d(t,"a",t),t},l.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},l.p="/",l.oe=function(e){throw console.error(e),e};var a=l(l.s=ENTRY_MODULE);return a.default||a}function i(e){return(e+"").replace(/[.?*+^$[\]\\(){}|-]/g,"\\$&")}function n(e,t,a){var n={};n[a]=[];var o=t.toString(),c=o.match(/^function\s?\w*\(\w+,\s*\w+,\s*(\w+)\)/);if(!c)return n;for(var d,g=c[1],s=new RegExp("(\\\\n|\\W)"+i(g)+"\\(\\s*(/\\*.*?\\*/)?\\s*.*?([\\.|\\-|\\+|\\w|/|@]+).*?\\)","g");d=s.exec(o);)"dll-reference"!==d[3]&&n[a].push(d[3]);for(s=new RegExp("\\("+i(g)+'\\("(dll-reference\\s([\\.|\\-|\\+|\\w|/|@]+))"\\)\\)\\(\\s*(/\\*.*?\\*/)?\\s*.*?([\\.|\\-|\\+|\\w|/|@]+).*?\\)',"g");d=s.exec(o);)e[d[2]]||(n[a].push(d[1]),e[d[2]]=l(d[1]).m),n[d[2]]=n[d[2]]||[],n[d[2]].push(d[4]);for(var C,m=Object.keys(n),h=0;h<m.length;h++)for(var r=0;r<n[m[h]].length;r++)C=n[m[h]][r],isNaN(1*C)||(n[m[h]][r]=1*n[m[h]][r]);return n}function o(e){return Object.keys(e).reduce(function(t,l){return t||e[l].length>0},!1)}e.exports=function(e,t){t=t||{};var i={main:l.m},c=t.all?{main:Object.keys(i.main)}:function(e,t){for(var l={main:[t]},a={main:[]},i={main:{}};o(l);)for(var c=Object.keys(l),d=0;d<c.length;d++){var g=c[d],s=l[g].pop();if(i[g]=i[g]||{},!i[g][s]&&e[g][s]){i[g][s]=!0,a[g]=a[g]||[],a[g].push(s);for(var C=n(e,e[g][s],g),m=Object.keys(C),h=0;h<m.length;h++)l[m[h]]=l[m[h]]||[],l[m[h]]=l[m[h]].concat(C[m[h]])}}return a}(i,e),d="";Object.keys(c).filter(function(e){return"main"!==e}).forEach(function(e){for(var t=0;c[e][t];)t++;c[e].push(t),i[e][t]="(function(module, exports, __webpack_require__) { module.exports = __webpack_require__; })",d=d+"var "+e+" = ("+a.toString().replace("ENTRY_MODULE",JSON.stringify(t))+")({"+c[e].map(function(t){return JSON.stringify(t)+": "+i[e][t].toString()}).join(",")+"});\n"}),d=d+"new (("+a.toString().replace("ENTRY_MODULE",JSON.stringify(e))+")({"+c.main.map(function(e){return JSON.stringify(e)+": "+i.main[e].toString()}).join(",")+"}))(self);";var g=new self.Blob([d],{type:"text/javascript"});if(t.bare)return g;var s=(self.URL||self.webkitURL||self.mozURL||self.msURL).createObjectURL(g),C=new self.Worker(s);return C.objectURL=s,C}},function(e,t,l){l.r(t),l(0);var a=l(8),i=l(15),n=l(13),o=l(1);t.default=function(e){var t=null,l=function(t,l){e.postMessage({msg:"logcat_callback",data:{type:t,logcat:l}})}.bind(this);function c(t,l){var a={msg:o.a.INIT_SEGMENT,data:{type:t,data:l}};e.postMessage(a,[l.data])}function d(t,l){var a={msg:o.a.MEDIA_SEGMENT,data:{type:t,data:l}};e.postMessage(a,[l.data])}function g(){var t={msg:o.a.LOADING_COMPLETE};e.postMessage(t)}function s(){var t={msg:o.a.RECOVERED_EARLY_EOF};e.postMessage(t)}function C(t){var l={msg:o.a.MEDIA_INFO,data:t};e.postMessage(l)}function m(t){var l={msg:o.a.METADATA_ARRIVED,data:t};e.postMessage(l)}function h(t){var l={msg:o.a.SCRIPTDATA_ARRIVED,data:t};e.postMessage(l)}function r(t){var l={msg:o.a.TIMED_ID3_METADATA_ARRIVED,data:t};e.postMessage(l)}function Z(t){var l={msg:o.a.SYNCHRONOUS_KLV_METADATA_ARRIVED,data:t};e.postMessage(l)}function I(t){var l={msg:o.a.ASYNCHRONOUS_KLV_METADATA_ARRIVED,data:t};e.postMessage(l)}function J(t){var l={msg:o.a.SMPTE2038_METADATA_ARRIVED,data:t};e.postMessage(l)}function u(t){var l={msg:o.a.SCTE35_METADATA_ARRIVED,data:t};e.postMessage(l)}function b(t){var l={msg:o.a.PES_PRIVATE_DATA_DESCRIPTOR,data:t};e.postMessage(l)}function G(t){var l={msg:o.a.PES_PRIVATE_DATA_ARRIVED,data:t};e.postMessage(l)}function p(t){var l={msg:o.a.STATISTICS_INFO,data:t};e.postMessage(l)}function y(t,l){e.postMessage({msg:o.a.IO_ERROR,data:{type:t,info:l}})}function W(t,l){e.postMessage({msg:o.a.DEMUX_ERROR,data:{type:t,info:l}})}function X(t){e.postMessage({msg:o.a.RECOMMEND_SEEKPOINT,data:t})}i.a.install(),e.addEventListener("message",function(i){switch(i.data.cmd){case"init":(t=new n.a(i.data.param[0],i.data.param[1])).on(o.a.IO_ERROR,y.bind(this)),t.on(o.a.DEMUX_ERROR,W.bind(this)),t.on(o.a.INIT_SEGMENT,c.bind(this)),t.on(o.a.MEDIA_SEGMENT,d.bind(this)),t.on(o.a.LOADING_COMPLETE,g.bind(this)),t.on(o.a.RECOVERED_EARLY_EOF,s.bind(this)),t.on(o.a.MEDIA_INFO,C.bind(this)),t.on(o.a.METADATA_ARRIVED,m.bind(this)),t.on(o.a.SCRIPTDATA_ARRIVED,h.bind(this)),t.on(o.a.TIMED_ID3_METADATA_ARRIVED,r.bind(this)),t.on(o.a.SYNCHRONOUS_KLV_METADATA_ARRIVED,Z.bind(this)),t.on(o.a.ASYNCHRONOUS_KLV_METADATA_ARRIVED,I.bind(this)),t.on(o.a.SMPTE2038_METADATA_ARRIVED,J.bind(this)),t.on(o.a.SCTE35_METADATA_ARRIVED,u.bind(this)),t.on(o.a.PES_PRIVATE_DATA_DESCRIPTOR,b.bind(this)),t.on(o.a.PES_PRIVATE_DATA_ARRIVED,G.bind(this)),t.on(o.a.STATISTICS_INFO,p.bind(this)),t.on(o.a.RECOMMEND_SEEKPOINT,X.bind(this));break;case"destroy":t&&(t.destroy(),t=null),e.postMessage({msg:"destroyed"});break;case"start":t.start();break;case"stop":t.stop();break;case"seek":t.seek(i.data.param);break;case"pause":t.pause();break;case"resume":t.resume();break;case"logging_config":var V=i.data.param;a.a.applyConfig(V),!0===V.enableCallback?a.a.addLogListener(l):a.a.removeLogListener(l)}})}},function(e,t,l){e.exports=l(25).default},function(e,t,l){(function(t,l){
  2. /*!
  3. * @overview es6-promise - a tiny implementation of Promises/A+.
  4. * @copyright Copyright (c) 2014 Yehuda Katz, Tom Dale, Stefan Penner and contributors (Conversion to ES6 API by Jake Archibald)
  5. * @license Licensed under MIT license
  6. * See https://raw.githubusercontent.com/stefanpenner/es6-promise/master/LICENSE
  7. * @version v4.2.8+1e68dce6
  8. */
  9. var a;a=function(){function e(e){return"function"==typeof e}var a=Array.isArray?Array.isArray:function(e){return"[object Array]"===Object.prototype.toString.call(e)},i=0,n=void 0,o=void 0,c=function(e,t){r[i]=e,r[i+1]=t,2===(i+=2)&&(o?o(Z):G())},d="undefined"!=typeof window?window:void 0,g=d||{},s=g.MutationObserver||g.WebKitMutationObserver,C="undefined"==typeof self&&void 0!==t&&"[object process]"==={}.toString.call(t),m="undefined"!=typeof Uint8ClampedArray&&"undefined"!=typeof importScripts&&"undefined"!=typeof MessageChannel;function h(){var e=setTimeout;return function(){return e(Z,1)}}var r=new Array(1e3);function Z(){for(var e=0;e<i;e+=2)(0,r[e])(r[e+1]),r[e]=void 0,r[e+1]=void 0;i=0}var I,J,u,b,G=void 0;function p(e,t){var l=this,a=new this.constructor(X);void 0===a[W]&&F(a);var i=l._state;if(i){var n=arguments[i-1];c(function(){return Q(i,a,n,l._result)})}else Y(l,a,e,t);return a}function y(e){if(e&&"object"==typeof e&&e.constructor===this)return e;var t=new this(X);return R(t,e),t}C?G=function(){return t.nextTick(Z)}:s?(J=0,u=new s(Z),b=document.createTextNode(""),u.observe(b,{characterData:!0}),G=function(){b.data=J=++J%2}):m?((I=new MessageChannel).port1.onmessage=Z,G=function(){return I.port2.postMessage(0)}):G=void 0===d?function(){try{var e=Function("return this")().require("vertx");return void 0!==(n=e.runOnLoop||e.runOnContext)?function(){n(Z)}:h()}catch(e){return h()}}():h();var W=Math.random().toString(36).substring(2);function X(){}function V(t,l,a){l.constructor===t.constructor&&a===p&&l.constructor.resolve===y?function(e,t){1===t._state?B(e,t._result):2===t._state?S(e,t._result):Y(t,void 0,function(t){return R(e,t)},function(t){return S(e,t)})}(t,l):void 0===a?B(t,l):e(a)?function(e,t,l){c(function(e){var a=!1,i=function(e,t,l,a){try{e.call(t,l,a)}catch(e){return e}}(l,t,function(l){a||(a=!0,t!==l?R(e,l):B(e,l))},function(t){a||(a=!0,S(e,t))},e._label);!a&&i&&(a=!0,S(e,i))},e)}(t,l,a):B(t,l)}function R(e,t){if(e===t)S(e,new TypeError("You cannot resolve a promise with itself"));else if(i=typeof(a=t),null===a||"object"!==i&&"function"!==i)B(e,t);else{var l=void 0;try{l=t.then}catch(t){return void S(e,t)}V(e,t,l)}var a,i}function k(e){e._onerror&&e._onerror(e._result),A(e)}function B(e,t){void 0===e._state&&(e._result=t,e._state=1,0!==e._subscribers.length&&c(A,e))}function S(e,t){void 0===e._state&&(e._state=2,e._result=t,c(k,e))}function Y(e,t,l,a){var i=e._subscribers,n=i.length;e._onerror=null,i[n]=t,i[n+1]=l,i[n+2]=a,0===n&&e._state&&c(A,e)}function A(e){var t=e._subscribers,l=e._state;if(0!==t.length){for(var a=void 0,i=void 0,n=e._result,o=0;o<t.length;o+=3)a=t[o],i=t[o+l],a?Q(l,a,i,n):i(n);e._subscribers.length=0}}function Q(t,l,a,i){var n=e(a),o=void 0,c=void 0,d=!0;if(n){try{o=a(i)}catch(e){d=!1,c=e}if(l===o)return void S(l,new TypeError("A promises callback cannot return that same promise."))}else o=i;void 0!==l._state||(n&&d?R(l,o):!1===d?S(l,c):1===t?B(l,o):2===t&&S(l,o))}var K=0;function F(e){e[W]=K++,e._state=void 0,e._result=void 0,e._subscribers=[]}var _=function(){function e(e,t){this._instanceConstructor=e,this.promise=new e(X),this.promise[W]||F(this.promise),a(t)?(this.length=t.length,this._remaining=t.length,this._result=new Array(this.length),0===this.length?B(this.promise,this._result):(this.length=this.length||0,this._enumerate(t),0===this._remaining&&B(this.promise,this._result))):S(this.promise,new Error("Array Methods must be provided an Array"))}return e.prototype._enumerate=function(e){for(var t=0;void 0===this._state&&t<e.length;t++)this._eachEntry(e[t],t)},e.prototype._eachEntry=function(e,t){var l=this._instanceConstructor,a=l.resolve;if(a===y){var i=void 0,n=void 0,o=!1;try{i=e.then}catch(e){o=!0,n=e}if(i===p&&void 0!==e._state)this._settledAt(e._state,t,e._result);else if("function"!=typeof i)this._remaining--,this._result[t]=e;else if(l===f){var c=new l(X);o?S(c,n):V(c,e,i),this._willSettleAt(c,t)}else this._willSettleAt(new l(function(t){return t(e)}),t)}else this._willSettleAt(a(e),t)},e.prototype._settledAt=function(e,t,l){var a=this.promise;void 0===a._state&&(this._remaining--,2===e?S(a,l):this._result[t]=l),0===this._remaining&&B(a,this._result)},e.prototype._willSettleAt=function(e,t){var l=this;Y(e,void 0,function(e){return l._settledAt(1,t,e)},function(e){return l._settledAt(2,t,e)})},e}(),f=function(){function t(e){this[W]=K++,this._result=this._state=void 0,this._subscribers=[],X!==e&&("function"!=typeof e&&function(){throw new TypeError("You must pass a resolver function as the first argument to the promise constructor")}(),this instanceof t?function(e,t){try{t(function(t){R(e,t)},function(t){S(e,t)})}catch(t){S(e,t)}}(this,e):function(){throw new TypeError("Failed to construct 'Promise': Please use the 'new' operator, this object constructor cannot be called as a function.")}())}return t.prototype.catch=function(e){return this.then(null,e)},t.prototype.finally=function(t){var l=this.constructor;return e(t)?this.then(function(e){return l.resolve(t()).then(function(){return e})},function(e){return l.resolve(t()).then(function(){throw e})}):this.then(t,t)},t}();return f.prototype.then=p,f.all=function(e){return new _(this,e).promise},f.race=function(e){var t=this;return a(e)?new t(function(l,a){for(var i=e.length,n=0;n<i;n++)t.resolve(e[n]).then(l,a)}):new t(function(e,t){return t(new TypeError("You must pass an array to race."))})},f.resolve=y,f.reject=function(e){var t=new this(X);return S(t,e),t},f._setScheduler=function(e){o=e},f._setAsap=function(e){c=e},f._asap=c,f.polyfill=function(){var e=void 0;if(void 0!==l)e=l;else if("undefined"!=typeof self)e=self;else try{e=Function("return this")()}catch(e){throw new Error("polyfill failed because global object is unavailable in this environment")}var t=e.Promise;if(t){var a=null;try{a=Object.prototype.toString.call(t.resolve())}catch(e){}if("[object Promise]"===a&&!t.cast)return}e.Promise=f},f.Promise=f,f},e.exports=a()}).call(this,l(22),l(23))},function(e,t){var l,a,i=e.exports={};function n(){throw new Error("setTimeout has not been defined")}function o(){throw new Error("clearTimeout has not been defined")}function c(e){if(l===setTimeout)return setTimeout(e,0);if((l===n||!l)&&setTimeout)return l=setTimeout,setTimeout(e,0);try{return l(e,0)}catch(t){try{return l.call(null,e,0)}catch(t){return l.call(this,e,0)}}}!function(){try{l="function"==typeof setTimeout?setTimeout:n}catch(e){l=n}try{a="function"==typeof clearTimeout?clearTimeout:o}catch(e){a=o}}();var d,g=[],s=!1,C=-1;function m(){s&&d&&(s=!1,d.length?g=d.concat(g):C=-1,g.length&&h())}function h(){if(!s){var e=c(m);s=!0;for(var t=g.length;t;){for(d=g,g=[];++C<t;)d&&d[C].run();C=-1,t=g.length}d=null,s=!1,function(e){if(a===clearTimeout)return clearTimeout(e);if((a===o||!a)&&clearTimeout)return a=clearTimeout,clearTimeout(e);try{a(e)}catch(t){try{return a.call(null,e)}catch(t){return a.call(this,e)}}}(e)}}function r(e,t){this.fun=e,this.array=t}function Z(){}i.nextTick=function(e){var t=new Array(arguments.length-1);if(arguments.length>1)for(var l=1;l<arguments.length;l++)t[l-1]=arguments[l];g.push(new r(e,t)),1!==g.length||s||c(h)},r.prototype.run=function(){this.fun.apply(null,this.array)},i.title="browser",i.browser=!0,i.env={},i.argv=[],i.version="",i.versions={},i.on=Z,i.addListener=Z,i.once=Z,i.off=Z,i.removeListener=Z,i.removeAllListeners=Z,i.emit=Z,i.prependListener=Z,i.prependOnceListener=Z,i.listeners=function(e){return[]},i.binding=function(e){throw new Error("process.binding is not supported")},i.cwd=function(){return"/"},i.chdir=function(e){throw new Error("process.chdir is not supported")},i.umask=function(){return 0}},function(e,t){var l;l=function(){return this}();try{l=l||new Function("return this")()}catch(e){"object"==typeof window&&(l=window)}e.exports=l},function(e,t,l){l.r(t);var a=l(0),i=l(8),n=l(3),o=l(7),c=l(16),d=l(17),g=l(1),s=l(4),C=l(10);t.default=function(e){var t="PlayerEngineWorker",l=function(t,l){e.postMessage({msg:"logcat_callback",type:t,logcat:l})}.bind(void 0),m=null,h=null,r=null,Z=null,I=!1,J=!1,u=0,b=0,G=!1;function p(){r&&(r.shutdown(),r.destroy(),r=null)}function y(){if(null==m||null==h)throw new n.a("Worker not initialized");if(Z)throw new n.a("Transmuxer has been initialized");J||(!h.deferLoadAfterSourceOpen||I?((Z=new d.a(m,h)).on(g.a.INIT_SEGMENT,function(e,t){r.appendInitSegment(t)}),Z.on(g.a.MEDIA_SEGMENT,function(t,l){r.appendMediaSegment(l),e.postMessage({msg:"buffered_position_changed",buffered_position_milliseconds:l.info.endDts})}),Z.on(g.a.LOADING_COMPLETE,function(){r.endOfStream(),e.postMessage({msg:"player_event",event:s.a.LOADING_COMPLETE})}),Z.on(g.a.RECOVERED_EARLY_EOF,function(){e.postMessage({msg:"player_event",event:s.a.RECOVERED_EARLY_EOF})}),Z.on(g.a.IO_ERROR,function(t,l){e.postMessage({msg:"player_event",event:s.a.ERROR,error_type:C.b.NETWORK_ERROR,error_detail:t,info:l})}),Z.on(g.a.DEMUX_ERROR,function(t,l){e.postMessage({msg:"player_event",event:s.a.ERROR,error_type:C.b.MEDIA_ERROR,error_detail:t,info:l})}),Z.on(g.a.MEDIA_INFO,function(e){B(g.a.MEDIA_INFO,e)}),Z.on(g.a.STATISTICS_INFO,function(e){B(g.a.STATISTICS_INFO,e)}),Z.on(g.a.RECOMMEND_SEEKPOINT,function(t){!function(t){e.postMessage({msg:"transmuxing_event",event:g.a.RECOMMEND_SEEKPOINT,milliseconds:t})}(t)}),Z.on(g.a.METADATA_ARRIVED,function(e){S(s.a.METADATA_ARRIVED,e)}),Z.on(g.a.SCRIPTDATA_ARRIVED,function(e){S(s.a.SCRIPTDATA_ARRIVED,e)}),Z.on(g.a.TIMED_ID3_METADATA_ARRIVED,function(e){S(s.a.TIMED_ID3_METADATA_ARRIVED,e)}),Z.on(g.a.SYNCHRONOUS_KLV_METADATA_ARRIVED,function(e){S(s.a.SYNCHRONOUS_KLV_METADATA_ARRIVED,e)}),Z.on(g.a.ASYNCHRONOUS_KLV_METADATA_ARRIVED,function(e){S(s.a.ASYNCHRONOUS_KLV_METADATA_ARRIVED,e)}),Z.on(g.a.SMPTE2038_METADATA_ARRIVED,function(e){S(s.a.SMPTE2038_METADATA_ARRIVED,e)}),Z.on(g.a.SCTE35_METADATA_ARRIVED,function(e){S(s.a.SCTE35_METADATA_ARRIVED,e)}),Z.on(g.a.PES_PRIVATE_DATA_DESCRIPTOR,function(e){S(s.a.PES_PRIVATE_DATA_DESCRIPTOR,e)}),Z.on(g.a.PES_PRIVATE_DATA_ARRIVED,function(e){S(s.a.PES_PRIVATE_DATA_ARRIVED,e)}),Z.open()):J=!0)}function W(){r&&r.flush(),Z&&(Z.close(),Z.destroy(),Z=null)}function X(){I=!0,J&&(J=!1,y())}function V(){e.postMessage({msg:"mse_event",event:o.a.UPDATE_END})}function R(){a.a.v(t,"MSE SourceBuffer is full, report to main thread"),e.postMessage({msg:"mse_event",event:o.a.BUFFER_FULL})}function k(t){e.postMessage({msg:"player_event",event:s.a.ERROR,error_type:C.b.MEDIA_ERROR,error_detail:C.b.MEDIA_MSE_ERROR,info:t})}function B(t,l){e.postMessage({msg:"transmuxing_event",event:t,info:l})}function S(t,l){e.postMessage({msg:"player_event",event:t,extraData:l})}e.addEventListener("message",function(n){if(!G){var d=n.data;switch(d.cmd){case"logging_config":var g=d;i.a.applyConfig(g.logging_config),!0===g.logging_config.enableCallback?i.a.addLogListener(l):i.a.removeLogListener(l);break;case"init":m=(g=d).media_data_source,h=g.config;break;case"destroy":Z&&W(),r&&p(),G=!0,e.postMessage({msg:"destroyed"});break;case"initialize_mse":!function(){a.a.v(t,"Initializing MediaSource in DedicatedWorker"),(r=new c.a(h)).on(o.a.SOURCE_OPEN,X.bind(this)),r.on(o.a.UPDATE_END,V.bind(this)),r.on(o.a.BUFFER_FULL,R.bind(this)),r.on(o.a.ERROR,k.bind(this)),r.initialize({getCurrentTime:function(){return u},getReadyState:function(){return b}});var l=r.getHandle();e.postMessage({msg:"mse_init",handle:l},[l])}();break;case"shutdown_mse":p();break;case"load":y();break;case"unload":W();break;case"unbuffered_seek":g=d,r.flush(),Z.seek(g.milliseconds);break;case"timeupdate":u=(g=d).current_time;break;case"readystatechange":b=(g=d).ready_state;break;case"pause_transmuxer":Z.pause();break;case"resume_transmuxer":Z.resume()}}})}},function(e,t,l){l.r(t);var a=l(15),i=l(14),n={enableWorker:!1,enableWorkerForMSE:!1,enableStashBuffer:!0,stashInitialSize:void 0,isLive:!1,liveBufferLatencyChasing:!1,liveBufferLatencyChasingOnPaused:!1,liveBufferLatencyMaxLatency:1.5,liveBufferLatencyMinRemain:.5,liveSync:!1,liveSyncMaxLatency:1.2,liveSyncTargetLatency:.8,liveSyncPlaybackRate:1.2,lazyLoad:!0,lazyLoadMaxDuration:180,lazyLoadRecoverDuration:30,deferLoadAfterSourceOpen:!0,autoCleanupMaxBackwardDuration:180,autoCleanupMinBackwardDuration:120,statisticsInfoReportInterval:600,fixAudioTimestampGap:!0,accurateSeek:!1,seekType:"range",seekParamStart:"bstart",seekParamEnd:"bend",rangeLoadZeroStart:!1,customSeekHandler:void 0,reuseRedirectedURL:!1,headers:void 0,customLoader:void 0};function o(){return Object.assign({},n)}var c=function(){function e(){}return e.supportMSEH264Playback=function(){var e=self.MediaSource&&self.MediaSource.isTypeSupported('video/mp4; codecs="avc1.42E01E,mp4a.40.2"'),t=self.ManagedMediaSource&&self.ManagedMediaSource.isTypeSupported('video/mp4; codecs="avc1.42E01E,mp4a.40.2"');return e||t},e.supportMSEH265Playback=function(){var e=self.MediaSource&&self.MediaSource.isTypeSupported('video/mp4; codecs="hvc1.1.6.L93.B0"'),t=self.ManagedMediaSource&&self.ManagedMediaSource.isTypeSupported('video/mp4; codecs="hvc1.1.6.L93.B0"');return e||t},e.supportNetworkStreamIO=function(){var e=new i.a({},o()),t=e.loaderType;return e.destroy(),"fetch-stream-loader"==t||"xhr-moz-chunked-loader"==t},e.getNetworkLoaderTypeName=function(){var e=new i.a({},o()),t=e.loaderType;return e.destroy(),t},e.supportNativeMediaPlayback=function(t){null==e.videoElement&&(e.videoElement=window.document.createElement("video"));var l=e.videoElement.canPlayType(t);return"probably"===l||"maybe"==l},e.getFeatureList=function(){var t={msePlayback:!1,mseLivePlayback:!1,mseH265Playback:!1,networkStreamIO:!1,networkLoaderName:"",nativeMP4H264Playback:!1,nativeMP4H265Playback:!1,nativeWebmVP8Playback:!1,nativeWebmVP9Playback:!1};return t.msePlayback=e.supportMSEH264Playback(),t.networkStreamIO=e.supportNetworkStreamIO(),t.networkLoaderName=e.getNetworkLoaderTypeName(),t.mseLivePlayback=t.msePlayback&&t.networkStreamIO,t.mseH265Playback=e.supportMSEH265Playback(),t.nativeMP4H264Playback=e.supportNativeMediaPlayback('video/mp4; codecs="avc1.42001E, mp4a.40.2"'),t.nativeMP4H265Playback=e.supportNativeMediaPlayback('video/mp4; codecs="hvc1.1.6.L93.B0"'),t.nativeWebmVP8Playback=e.supportNativeMediaPlayback('video/webm; codecs="vp8.0, vorbis"'),t.nativeWebmVP9Playback=e.supportNativeMediaPlayback('video/webm; codecs="vp9"'),t},e}(),d=l(2),g=l(0),s=l(9),C=l.n(s),m=l(16),h=l(4),r=l(17),Z=l(7),I=l(10),J=l(3),u=l(1),b=l(5),G=l(11),p=function(){function e(e,t,l){this.TAG="SeekingHandler",this._config=null,this._media_element=null,this._always_seek_keyframe=!1,this._on_unbuffered_seek=null,this._request_set_current_time=!1,this._seek_request_record_clocktime=null,this._idr_sample_list=new G.a,this.e=null,this._config=e,this._media_element=t,this._on_unbuffered_seek=l,this.e={onMediaSeeking:this._onMediaSeeking.bind(this)};var a=b.a.chrome&&(b.a.version.major<50||50===b.a.version.major&&b.a.version.build<2661);this._always_seek_keyframe=!!(a||b.a.msedge||b.a.msie),this._always_seek_keyframe&&(this._config.accurateSeek=!1),this._media_element.addEventListener("seeking",this.e.onMediaSeeking)}return e.prototype.destroy=function(){this._idr_sample_list.clear(),this._idr_sample_list=null,this._media_element.removeEventListener("seeking",this.e.onMediaSeeking),this._media_element=null,this._on_unbuffered_seek=null},e.prototype.seek=function(e){var t=this._isPositionBuffered(e),l=!1;if(e<1&&this._media_element.buffered.length>0){var a=this._media_element.buffered.start(0);(a<1&&e<a||b.a.safari)&&(l=!0,e=b.a.safari?.1:a)}if(l)this.directSeek(e);else if(t)if(this._always_seek_keyframe){var i=this._getNearestKeyframe(Math.floor(1e3*e));null!=i&&(e=i.dts/1e3),this.directSeek(e)}else this.directSeek(e);else this._idr_sample_list.clear(),this._on_unbuffered_seek(Math.floor(1e3*e)),this._config.accurateSeek&&this.directSeek(e)},e.prototype.directSeek=function(e){this._request_set_current_time=!0,this._media_element.currentTime=e},e.prototype.appendSyncPoints=function(e){this._idr_sample_list.appendArray(e)},e.prototype._onMediaSeeking=function(t){if(this._request_set_current_time)this._request_set_current_time=!1;else{var l=this._media_element.currentTime,a=this._media_element.buffered;if(l<1&&a.length>0){var i=a.start(0);if(i<1&&l<i||b.a.safari){var n=b.a.safari?.1:i;return void this.directSeek(n)}}if(this._isPositionBuffered(l)){if(this._always_seek_keyframe){var o=this._getNearestKeyframe(Math.floor(1e3*l));null!=o&&(l=o.dts/1e3,this.directSeek(l))}}else this._seek_request_record_clocktime=e._getClockTime(),window.setTimeout(this._pollAndApplyUnbufferedSeek.bind(this),50)}},e.prototype._pollAndApplyUnbufferedSeek=function(){if(null!=this._seek_request_record_clocktime)if(this._seek_request_record_clocktime<=e._getClockTime()-100){var t=this._media_element.currentTime;this._seek_request_record_clocktime=null,this._isPositionBuffered(t)||(this._idr_sample_list.clear(),this._on_unbuffered_seek(Math.floor(1e3*t)),this._config.accurateSeek&&this.directSeek(t))}else window.setTimeout(this._pollAndApplyUnbufferedSeek.bind(this),50)},e.prototype._isPositionBuffered=function(e){for(var t=this._media_element.buffered,l=0;l<t.length;l++){var a=t.start(l),i=t.end(l);if(e>=a&&e<i)return!0}return!1},e.prototype._getNearestKeyframe=function(e){return this._idr_sample_list.getLastSyncPointBeforeDts(e)},e._getClockTime=function(){return self.performance&&self.performance.now?self.performance.now():Date.now()},e}(),y=function(){function e(e,t,l,a){this.TAG="LoadingController",this._config=null,this._media_element=null,this._on_pause_transmuxer=null,this._on_resume_transmuxer=null,this._paused=!1,this.e=null,this._config=e,this._media_element=t,this._on_pause_transmuxer=l,this._on_resume_transmuxer=a,this.e={onMediaTimeUpdate:this._onMediaTimeUpdate.bind(this)}}return e.prototype.destroy=function(){this._media_element.removeEventListener("timeupdate",this.e.onMediaTimeUpdate),this.e=null,this._media_element=null,this._config=null,this._on_pause_transmuxer=null,this._on_resume_transmuxer=null},e.prototype.notifyBufferedPositionChanged=function(e){!this._config.isLive&&this._config.lazyLoad&&(null==e?this._suspendTransmuxerIfNeeded():this._suspendTransmuxerIfBufferedPositionExceeded(e))},e.prototype._onMediaTimeUpdate=function(e){this._paused&&this._resumeTransmuxerIfNeeded()},e.prototype._suspendTransmuxerIfNeeded=function(){for(var e=this._media_element.buffered,t=this._media_element.currentTime,l=0,a=0;a<e.length;a++){var i=e.start(a),n=e.end(a);if(i<=t&&t<n){l=n;break}}l>0&&this._suspendTransmuxerIfBufferedPositionExceeded(l)},e.prototype._suspendTransmuxerIfBufferedPositionExceeded=function(e){e>=this._media_element.currentTime+this._config.lazyLoadMaxDuration&&!this._paused&&(g.a.v(this.TAG,"Maximum buffering duration exceeded, suspend transmuxing task"),this.suspendTransmuxer(),this._media_element.addEventListener("timeupdate",this.e.onMediaTimeUpdate))},e.prototype.suspendTransmuxer=function(){this._paused=!0,this._on_pause_transmuxer()},e.prototype._resumeTransmuxerIfNeeded=function(){for(var e=this._media_element.buffered,t=this._media_element.currentTime,l=this._config.lazyLoadRecoverDuration,a=!1,i=0;i<e.length;i++){var n=e.start(i),o=e.end(i);if(t>=n&&t<o){t>=o-l&&(a=!0);break}}a&&(g.a.v(this.TAG,"Continue loading from paused position"),this.resumeTransmuxer(),this._media_element.removeEventListener("timeupdate",this.e.onMediaTimeUpdate))},e.prototype.resumeTransmuxer=function(){this._paused=!1,this._on_resume_transmuxer()},e}(),W=function(){function e(e,t){this.TAG="StartupStallJumper",this._media_element=null,this._on_direct_seek=null,this._canplay_received=!1,this.e=null,this._media_element=e,this._on_direct_seek=t,this.e={onMediaCanPlay:this._onMediaCanPlay.bind(this),onMediaStalled:this._onMediaStalled.bind(this),onMediaProgress:this._onMediaProgress.bind(this)},this._media_element.addEventListener("canplay",this.e.onMediaCanPlay),this._media_element.addEventListener("stalled",this.e.onMediaStalled),this._media_element.addEventListener("progress",this.e.onMediaProgress)}return e.prototype.destroy=function(){this._media_element.removeEventListener("canplay",this.e.onMediaCanPlay),this._media_element.removeEventListener("stalled",this.e.onMediaStalled),this._media_element.removeEventListener("progress",this.e.onMediaProgress),this._media_element=null,this._on_direct_seek=null},e.prototype._onMediaCanPlay=function(e){this._canplay_received=!0,this._media_element.removeEventListener("canplay",this.e.onMediaCanPlay)},e.prototype._onMediaStalled=function(e){this._detectAndFixStuckPlayback(!0)},e.prototype._onMediaProgress=function(e){this._detectAndFixStuckPlayback()},e.prototype._detectAndFixStuckPlayback=function(e){var t=this._media_element,l=t.buffered;e||!this._canplay_received||t.readyState<2?l.length>0&&t.currentTime<l.start(0)&&(g.a.w(this.TAG,"Playback seems stuck at ".concat(t.currentTime,", seek to ").concat(l.start(0))),this._on_direct_seek(l.start(0)),this._media_element.removeEventListener("progress",this.e.onMediaProgress)):this._media_element.removeEventListener("progress",this.e.onMediaProgress)},e}(),X=function(){function e(e,t,l){this._config=null,this._media_element=null,this._on_direct_seek=null,this._config=e,this._media_element=t,this._on_direct_seek=l}return e.prototype.destroy=function(){this._on_direct_seek=null,this._media_element=null,this._config=null},e.prototype.notifyBufferedRangeUpdate=function(){this._chaseLiveLatency()},e.prototype._chaseLiveLatency=function(){var e=this._media_element.buffered,t=this._media_element.currentTime,l=this._media_element.paused;if(this._config.isLive&&this._config.liveBufferLatencyChasing&&0!=e.length&&(this._config.liveBufferLatencyChasingOnPaused||!l)){var a=e.end(e.length-1);if(a>this._config.liveBufferLatencyMaxLatency&&a-t>this._config.liveBufferLatencyMaxLatency){var i=a-this._config.liveBufferLatencyMinRemain;this._on_direct_seek(i)}}},e}(),V=function(){function e(e,t){this._config=null,this._media_element=null,this.e=null,this._config=e,this._media_element=t,this.e={onMediaTimeUpdate:this._onMediaTimeUpdate.bind(this)},this._media_element.addEventListener("timeupdate",this.e.onMediaTimeUpdate)}return e.prototype.destroy=function(){this._media_element.removeEventListener("timeupdate",this.e.onMediaTimeUpdate),this._media_element=null,this._config=null},e.prototype._onMediaTimeUpdate=function(e){if(this._config.isLive&&this._config.liveSync){var t=this._getCurrentLatency();if(t>this._config.liveSyncMaxLatency){var l=Math.min(2,Math.max(1,this._config.liveSyncPlaybackRate));this._media_element.playbackRate=l}else t>this._config.liveSyncTargetLatency||1!==this._media_element.playbackRate&&0!==this._media_element.playbackRate&&(this._media_element.playbackRate=1)}},e.prototype._getCurrentLatency=function(){if(!this._media_element)return 0;var e=this._media_element.buffered,t=this._media_element.currentTime;return 0==e.length?0:e.end(e.length-1)-t},e}(),R=function(){function e(e,t){this.TAG="PlayerEngineMainThread",this._emitter=new s,this._media_element=null,this._mse_controller=null,this._transmuxer=null,this._pending_seek_time=null,this._seeking_handler=null,this._loading_controller=null,this._startup_stall_jumper=null,this._live_latency_chaser=null,this._live_latency_synchronizer=null,this._mse_source_opened=!1,this._has_pending_load=!1,this._loaded_metadata_received=!1,this._media_info=null,this._statistics_info=null,this.e=null,this._media_data_source=e,this._config=o(),"object"==typeof t&&Object.assign(this._config,t),!0===e.isLive&&(this._config.isLive=!0),this.e={onMediaLoadedMetadata:this._onMediaLoadedMetadata.bind(this)}}return e.prototype.destroy=function(){this._emitter.emit(h.a.DESTROYING),this._transmuxer&&this.unload(),this._media_element&&this.detachMediaElement(),this.e=null,this._media_data_source=null,this._emitter.removeAllListeners(),this._emitter=null},e.prototype.on=function(e,t){var l=this;this._emitter.addListener(e,t),e===h.a.MEDIA_INFO&&this._media_info?Promise.resolve().then(function(){return l._emitter.emit(h.a.MEDIA_INFO,l.mediaInfo)}):e==h.a.STATISTICS_INFO&&this._statistics_info&&Promise.resolve().then(function(){return l._emitter.emit(h.a.STATISTICS_INFO,l.statisticsInfo)})},e.prototype.off=function(e,t){this._emitter.removeListener(e,t)},e.prototype.attachMediaElement=function(e){var t=this;this._media_element=e,e.src="",e.removeAttribute("src"),e.srcObject=null,e.load(),e.addEventListener("loadedmetadata",this.e.onMediaLoadedMetadata),this._mse_controller=new m.a(this._config),this._mse_controller.on(Z.a.UPDATE_END,this._onMSEUpdateEnd.bind(this)),this._mse_controller.on(Z.a.BUFFER_FULL,this._onMSEBufferFull.bind(this)),this._mse_controller.on(Z.a.SOURCE_OPEN,this._onMSESourceOpen.bind(this)),this._mse_controller.on(Z.a.ERROR,this._onMSEError.bind(this)),this._mse_controller.on(Z.a.START_STREAMING,this._onMSEStartStreaming.bind(this)),this._mse_controller.on(Z.a.END_STREAMING,this._onMSEEndStreaming.bind(this)),this._mse_controller.initialize({getCurrentTime:function(){return t._media_element.currentTime},getReadyState:function(){return t._media_element.readyState}}),this._mse_controller.isManagedMediaSource()?(e.disableRemotePlayback=!0,e.srcObject=this._mse_controller.getObject()):e.src=this._mse_controller.getObjectURL()},e.prototype.detachMediaElement=function(){this._media_element&&(this._mse_controller.shutdown(),this._media_element.removeEventListener("loadedmetadata",this.e.onMediaLoadedMetadata),this._media_element.src="",this._media_element.removeAttribute("src"),this._media_element.srcObject=null,this._media_element.load(),this._media_element=null,this._mse_controller.revokeObjectURL()),this._mse_controller&&(this._mse_controller.destroy(),this._mse_controller=null)},e.prototype.load=function(){var e=this;if(!this._media_element)throw new J.a("HTMLMediaElement must be attached before load()!");if(this._transmuxer)throw new J.a("load() has been called, please call unload() first!");this._has_pending_load||(!this._config.deferLoadAfterSourceOpen||this._mse_source_opened?(this._transmuxer=new r.a(this._media_data_source,this._config),this._transmuxer.on(u.a.INIT_SEGMENT,function(t,l){e._mse_controller.appendInitSegment(l)}),this._transmuxer.on(u.a.MEDIA_SEGMENT,function(t,l){e._mse_controller.appendMediaSegment(l),!e._config.isLive&&"video"===t&&l.data&&l.data.byteLength>0&&"info"in l&&e._seeking_handler.appendSyncPoints(l.info.syncPoints),e._loading_controller.notifyBufferedPositionChanged(l.info.endDts/1e3)}),this._transmuxer.on(u.a.LOADING_COMPLETE,function(){e._mse_controller.endOfStream(),e._emitter.emit(h.a.LOADING_COMPLETE)}),this._transmuxer.on(u.a.RECOVERED_EARLY_EOF,function(){e._emitter.emit(h.a.RECOVERED_EARLY_EOF)}),this._transmuxer.on(u.a.IO_ERROR,function(t,l){e._emitter.emit(h.a.ERROR,I.b.NETWORK_ERROR,t,l)}),this._transmuxer.on(u.a.DEMUX_ERROR,function(t,l){e._emitter.emit(h.a.ERROR,I.b.MEDIA_ERROR,t,l)}),this._transmuxer.on(u.a.MEDIA_INFO,function(t){e._media_info=t,e._emitter.emit(h.a.MEDIA_INFO,Object.assign({},t))}),this._transmuxer.on(u.a.STATISTICS_INFO,function(t){e._statistics_info=e._fillStatisticsInfo(t),e._emitter.emit(h.a.STATISTICS_INFO,Object.assign({},t))}),this._transmuxer.on(u.a.RECOMMEND_SEEKPOINT,function(t){e._media_element&&!e._config.accurateSeek&&e._seeking_handler.directSeek(t/1e3)}),this._transmuxer.on(u.a.METADATA_ARRIVED,function(t){e._emitter.emit(h.a.METADATA_ARRIVED,t)}),this._transmuxer.on(u.a.SCRIPTDATA_ARRIVED,function(t){e._emitter.emit(h.a.SCRIPTDATA_ARRIVED,t)}),this._transmuxer.on(u.a.TIMED_ID3_METADATA_ARRIVED,function(t){e._emitter.emit(h.a.TIMED_ID3_METADATA_ARRIVED,t)}),this._transmuxer.on(u.a.SYNCHRONOUS_KLV_METADATA_ARRIVED,function(t){e._emitter.emit(h.a.SYNCHRONOUS_KLV_METADATA_ARRIVED,t)}),this._transmuxer.on(u.a.ASYNCHRONOUS_KLV_METADATA_ARRIVED,function(t){e._emitter.emit(h.a.ASYNCHRONOUS_KLV_METADATA_ARRIVED,t)}),this._transmuxer.on(u.a.SMPTE2038_METADATA_ARRIVED,function(t){e._emitter.emit(h.a.SMPTE2038_METADATA_ARRIVED,t)}),this._transmuxer.on(u.a.SCTE35_METADATA_ARRIVED,function(t){e._emitter.emit(h.a.SCTE35_METADATA_ARRIVED,t)}),this._transmuxer.on(u.a.PES_PRIVATE_DATA_DESCRIPTOR,function(t){e._emitter.emit(h.a.PES_PRIVATE_DATA_DESCRIPTOR,t)}),this._transmuxer.on(u.a.PES_PRIVATE_DATA_ARRIVED,function(t){e._emitter.emit(h.a.PES_PRIVATE_DATA_ARRIVED,t)}),this._seeking_handler=new p(this._config,this._media_element,this._onRequiredUnbufferedSeek.bind(this)),this._loading_controller=new y(this._config,this._media_element,this._onRequestPauseTransmuxer.bind(this),this._onRequestResumeTransmuxer.bind(this)),this._startup_stall_jumper=new W(this._media_element,this._onRequestDirectSeek.bind(this)),this._config.isLive&&this._config.liveBufferLatencyChasing&&(this._live_latency_chaser=new X(this._config,this._media_element,this._onRequestDirectSeek.bind(this))),this._config.isLive&&this._config.liveSync&&(this._live_latency_synchronizer=new V(this._config,this._media_element)),this._media_element.readyState>0&&this._seeking_handler.directSeek(0),this._transmuxer.open()):this._has_pending_load=!0)},e.prototype.unload=function(){var e,t,l,a,i,n,o,c,d;null===(e=this._media_element)||void 0===e||e.pause(),null===(t=this._live_latency_synchronizer)||void 0===t||t.destroy(),this._live_latency_synchronizer=null,null===(l=this._live_latency_chaser)||void 0===l||l.destroy(),this._live_latency_chaser=null,null===(a=this._startup_stall_jumper)||void 0===a||a.destroy(),this._startup_stall_jumper=null,null===(i=this._loading_controller)||void 0===i||i.destroy(),this._loading_controller=null,null===(n=this._seeking_handler)||void 0===n||n.destroy(),this._seeking_handler=null,null===(o=this._mse_controller)||void 0===o||o.flush(),null===(c=this._transmuxer)||void 0===c||c.close(),null===(d=this._transmuxer)||void 0===d||d.destroy(),this._transmuxer=null},e.prototype.play=function(){return this._media_element.play()},e.prototype.pause=function(){this._media_element.pause()},e.prototype.seek=function(e){this._media_element&&this._seeking_handler?this._seeking_handler.seek(e):this._pending_seek_time=e},Object.defineProperty(e.prototype,"mediaInfo",{get:function(){return Object.assign({},this._media_info)},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"statisticsInfo",{get:function(){return Object.assign({},this._statistics_info)},enumerable:!1,configurable:!0}),e.prototype._onMSESourceOpen=function(){this._mse_source_opened=!0,this._has_pending_load&&(this._has_pending_load=!1,this.load())},e.prototype._onMSEUpdateEnd=function(){this._config.isLive&&this._config.liveBufferLatencyChasing&&this._live_latency_chaser&&this._live_latency_chaser.notifyBufferedRangeUpdate(),this._loading_controller.notifyBufferedPositionChanged()},e.prototype._onMSEBufferFull=function(){g.a.v(this.TAG,"MSE SourceBuffer is full, suspend transmuxing task"),this._loading_controller.suspendTransmuxer()},e.prototype._onMSEError=function(e){this._emitter.emit(h.a.ERROR,I.b.MEDIA_ERROR,I.a.MEDIA_MSE_ERROR,e)},e.prototype._onMSEStartStreaming=function(){this._loaded_metadata_received&&(this._config.isLive||(g.a.v(this.TAG,"Resume transmuxing task due to ManagedMediaSource onStartStreaming"),this._loading_controller.resumeTransmuxer()))},e.prototype._onMSEEndStreaming=function(){this._config.isLive||(g.a.v(this.TAG,"Suspend transmuxing task due to ManagedMediaSource onEndStreaming"),this._loading_controller.suspendTransmuxer())},e.prototype._onMediaLoadedMetadata=function(e){this._loaded_metadata_received=!0,null!=this._pending_seek_time&&(this._seeking_handler.seek(this._pending_seek_time),this._pending_seek_time=null)},e.prototype._onRequestDirectSeek=function(e){this._seeking_handler.directSeek(e)},e.prototype._onRequiredUnbufferedSeek=function(e){this._mse_controller.flush(),this._transmuxer.seek(e)},e.prototype._onRequestPauseTransmuxer=function(){this._transmuxer.pause()},e.prototype._onRequestResumeTransmuxer=function(){this._transmuxer.resume()},e.prototype._fillStatisticsInfo=function(e){if(e.playerType="MSEPlayer",!(this._media_element instanceof HTMLVideoElement))return e;var t=!0,l=0,a=0;if(this._media_element.getVideoPlaybackQuality){var i=this._media_element.getVideoPlaybackQuality();l=i.totalVideoFrames,a=i.droppedVideoFrames}else null!=this._media_element.webkitDecodedFrameCount?(l=this._media_element.webkitDecodedFrameCount,a=this._media_element.webkitDroppedFrameCount):t=!1;return t&&(e.decodedFrames=l,e.droppedFrames=a),e},e}(),k=l(18),B=l(8),S=function(){function e(e,t){this.TAG="PlayerEngineDedicatedThread",this._emitter=new s,this._media_element=null,this._worker_destroying=!1,this._seeking_handler=null,this._loading_controller=null,this._startup_stall_jumper=null,this._live_latency_chaser=null,this._live_latency_synchronizer=null,this._pending_seek_time=null,this._media_info=null,this._statistics_info=null,this.e=null,this._media_data_source=e,this._config=o(),"object"==typeof t&&Object.assign(this._config,t),!0===e.isLive&&(this._config.isLive=!0),this.e={onLoggingConfigChanged:this._onLoggingConfigChanged.bind(this),onMediaLoadedMetadata:this._onMediaLoadedMetadata.bind(this),onMediaTimeUpdate:this._onMediaTimeUpdate.bind(this),onMediaReadyStateChanged:this._onMediaReadyStateChange.bind(this)},B.a.registerListener(this.e.onLoggingConfigChanged),this._worker=k(24,{all:!0}),this._worker.addEventListener("message",this._onWorkerMessage.bind(this)),this._worker.postMessage({cmd:"init",media_data_source:this._media_data_source,config:this._config}),this._worker.postMessage({cmd:"logging_config",logging_config:B.a.getConfig()})}return e.isSupported=function(){return!(!self.Worker||!(self.MediaSource&&"canConstructInDedicatedWorker"in self.MediaSource&&!0===self.MediaSource.canConstructInDedicatedWorker||self.ManagedMediaSource&&"canConstructInDedicatedWorker"in self.ManagedMediaSource&&!0===self.ManagedMediaSource.canConstructInDedicatedWorker))},e.prototype.destroy=function(){this._emitter.emit(h.a.DESTROYING),this.unload(),this.detachMediaElement(),this._worker_destroying=!0,this._worker.postMessage({cmd:"destroy"}),B.a.removeListener(this.e.onLoggingConfigChanged),this.e=null,this._media_data_source=null,this._emitter.removeAllListeners(),this._emitter=null},e.prototype.on=function(e,t){var l=this;this._emitter.addListener(e,t),e===h.a.MEDIA_INFO&&this._media_info?Promise.resolve().then(function(){return l._emitter.emit(h.a.MEDIA_INFO,l.mediaInfo)}):e==h.a.STATISTICS_INFO&&this._statistics_info&&Promise.resolve().then(function(){return l._emitter.emit(h.a.STATISTICS_INFO,l.statisticsInfo)})},e.prototype.off=function(e,t){this._emitter.removeListener(e,t)},e.prototype.attachMediaElement=function(e){this._media_element=e,this._media_element.src="",this._media_element.removeAttribute("src"),this._media_element.srcObject=null,this._media_element.load(),this._media_element.addEventListener("loadedmetadata",this.e.onMediaLoadedMetadata),this._media_element.addEventListener("timeupdate",this.e.onMediaTimeUpdate),this._media_element.addEventListener("readystatechange",this.e.onMediaReadyStateChanged),this._worker.postMessage({cmd:"initialize_mse"})},e.prototype.detachMediaElement=function(){this._worker.postMessage({cmd:"shutdown_mse"}),this._media_element&&(this._media_element.removeEventListener("loadedmetadata",this.e.onMediaLoadedMetadata),this._media_element.removeEventListener("timeupdate",this.e.onMediaTimeUpdate),this._media_element.removeEventListener("readystatechange",this.e.onMediaReadyStateChanged),this._media_element.src="",this._media_element.removeAttribute("src"),this._media_element.srcObject=null,this._media_element.load(),this._media_element=null)},e.prototype.load=function(){this._worker.postMessage({cmd:"load"}),this._seeking_handler=new p(this._config,this._media_element,this._onRequiredUnbufferedSeek.bind(this)),this._loading_controller=new y(this._config,this._media_element,this._onRequestPauseTransmuxer.bind(this),this._onRequestResumeTransmuxer.bind(this)),this._startup_stall_jumper=new W(this._media_element,this._onRequestDirectSeek.bind(this)),this._config.isLive&&this._config.liveBufferLatencyChasing&&(this._live_latency_chaser=new X(this._config,this._media_element,this._onRequestDirectSeek.bind(this))),this._config.isLive&&this._config.liveSync&&(this._live_latency_synchronizer=new V(this._config,this._media_element)),this._media_element.readyState>0&&this._seeking_handler.directSeek(0)},e.prototype.unload=function(){var e,t,l,a,i,n;null===(e=this._media_element)||void 0===e||e.pause(),this._worker.postMessage({cmd:"unload"}),null===(t=this._live_latency_synchronizer)||void 0===t||t.destroy(),this._live_latency_synchronizer=null,null===(l=this._live_latency_chaser)||void 0===l||l.destroy(),this._live_latency_chaser=null,null===(a=this._startup_stall_jumper)||void 0===a||a.destroy(),this._startup_stall_jumper=null,null===(i=this._loading_controller)||void 0===i||i.destroy(),this._loading_controller=null,null===(n=this._seeking_handler)||void 0===n||n.destroy(),this._seeking_handler=null},e.prototype.play=function(){return this._media_element.play()},e.prototype.pause=function(){this._media_element.pause()},e.prototype.seek=function(e){this._media_element&&this._seeking_handler?this._seeking_handler.seek(e):this._pending_seek_time=e},Object.defineProperty(e.prototype,"mediaInfo",{get:function(){return Object.assign({},this._media_info)},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"statisticsInfo",{get:function(){return Object.assign({},this._statistics_info)},enumerable:!1,configurable:!0}),e.prototype._onLoggingConfigChanged=function(e){var t;null===(t=this._worker)||void 0===t||t.postMessage({cmd:"logging_config",logging_config:e})},e.prototype._onMSEUpdateEnd=function(){this._config.isLive&&this._config.liveBufferLatencyChasing&&this._live_latency_chaser&&this._live_latency_chaser.notifyBufferedRangeUpdate(),this._loading_controller.notifyBufferedPositionChanged()},e.prototype._onMSEBufferFull=function(){g.a.v(this.TAG,"MSE SourceBuffer is full, suspend transmuxing task"),this._loading_controller.suspendTransmuxer()},e.prototype._onMediaLoadedMetadata=function(e){null!=this._pending_seek_time&&(this._seeking_handler.seek(this._pending_seek_time),this._pending_seek_time=null)},e.prototype._onRequestDirectSeek=function(e){this._seeking_handler.directSeek(e)},e.prototype._onRequiredUnbufferedSeek=function(e){this._worker.postMessage({cmd:"unbuffered_seek",milliseconds:e})},e.prototype._onRequestPauseTransmuxer=function(){this._worker.postMessage({cmd:"pause_transmuxer"})},e.prototype._onRequestResumeTransmuxer=function(){this._worker.postMessage({cmd:"resume_transmuxer"})},e.prototype._onMediaTimeUpdate=function(e){this._worker.postMessage({cmd:"timeupdate",current_time:e.target.currentTime})},e.prototype._onMediaReadyStateChange=function(e){this._worker.postMessage({cmd:"readystatechange",ready_state:e.target.readyState})},e.prototype._onWorkerMessage=function(e){var t,l=e.data,a=l.msg;if("destroyed"==a||this._worker_destroying)return this._worker_destroying=!1,null===(t=this._worker)||void 0===t||t.terminate(),void(this._worker=null);switch(a){case"mse_init":var i=l;"ManagedMediaSource"in self&&!("MediaSource"in self)&&(this._media_element.disableRemotePlayback=!0),this._media_element.srcObject=i.handle;break;case"mse_event":(i=l).event==Z.a.UPDATE_END?this._onMSEUpdateEnd():i.event==Z.a.BUFFER_FULL&&this._onMSEBufferFull();break;case"transmuxing_event":if((i=l).event==u.a.MEDIA_INFO){var n=l;this._media_info=n.info,this._emitter.emit(h.a.MEDIA_INFO,Object.assign({},n.info))}else if(i.event==u.a.STATISTICS_INFO){var o=l;this._statistics_info=this._fillStatisticsInfo(o.info),this._emitter.emit(h.a.STATISTICS_INFO,Object.assign({},o.info))}else if(i.event==u.a.RECOMMEND_SEEKPOINT){var c=l;this._media_element&&!this._config.accurateSeek&&this._seeking_handler.directSeek(c.milliseconds/1e3)}break;case"player_event":if((i=l).event==h.a.ERROR){var d=l;this._emitter.emit(h.a.ERROR,d.error_type,d.error_detail,d.info)}else if("extraData"in i){var s=l;this._emitter.emit(s.event,s.extraData)}break;case"logcat_callback":i=l,g.a.emitter.emit("log",i.type,i.logcat);break;case"buffered_position_changed":i=l,this._loading_controller.notifyBufferedPositionChanged(i.buffered_position_milliseconds/1e3)}},e.prototype._fillStatisticsInfo=function(e){if(e.playerType="MSEPlayer",!(this._media_element instanceof HTMLVideoElement))return e;var t=!0,l=0,a=0;if(this._media_element.getVideoPlaybackQuality){var i=this._media_element.getVideoPlaybackQuality();l=i.totalVideoFrames,a=i.droppedVideoFrames}else null!=this._media_element.webkitDecodedFrameCount?(l=this._media_element.webkitDecodedFrameCount,a=this._media_element.webkitDroppedFrameCount):t=!1;return t&&(e.decodedFrames=l,e.droppedFrames=a),e},e}(),Y=function(){function e(e,t){this.TAG="MSEPlayer",this._type="MSEPlayer",this._media_element=null,this._player_engine=null;var l=e.type.toLowerCase();if("mse"!==l&&"mpegts"!==l&&"m2ts"!==l&&"flv"!==l)throw new J.b("MSEPlayer requires an mpegts/m2ts/flv MediaDataSource input!");if(t&&t.enableWorkerForMSE&&S.isSupported())try{this._player_engine=new S(e,t)}catch(l){g.a.e(this.TAG,"Error while initializing PlayerEngineDedicatedThread, fallback to PlayerEngineMainThread"),this._player_engine=new R(e,t)}else this._player_engine=new R(e,t)}return e.prototype.destroy=function(){this._player_engine.destroy(),this._player_engine=null,this._media_element=null},e.prototype.on=function(e,t){this._player_engine.on(e,t)},e.prototype.off=function(e,t){this._player_engine.off(e,t)},e.prototype.attachMediaElement=function(e){this._media_element=e,this._player_engine.attachMediaElement(e)},e.prototype.detachMediaElement=function(){this._media_element=null,this._player_engine.detachMediaElement()},e.prototype.load=function(){this._player_engine.load()},e.prototype.unload=function(){this._player_engine.unload()},e.prototype.play=function(){return this._player_engine.play()},e.prototype.pause=function(){this._player_engine.pause()},Object.defineProperty(e.prototype,"type",{get:function(){return this._type},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"buffered",{get:function(){return this._media_element.buffered},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"duration",{get:function(){return this._media_element.duration},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"volume",{get:function(){return this._media_element.volume},set:function(e){this._media_element.volume=e},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"muted",{get:function(){return this._media_element.muted},set:function(e){this._media_element.muted=e},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"currentTime",{get:function(){return this._media_element?this._media_element.currentTime:0},set:function(e){this._player_engine.seek(e)},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"mediaInfo",{get:function(){return this._player_engine.mediaInfo},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"statisticsInfo",{get:function(){return this._player_engine.statisticsInfo},enumerable:!1,configurable:!0}),e}(),A=function(){function e(e,t){this.TAG="NativePlayer",this._type="NativePlayer",this._emitter=new C.a,this._config=o(),"object"==typeof t&&Object.assign(this._config,t);var l=e.type.toLowerCase();if("mse"===l||"mpegts"===l||"m2ts"===l||"flv"===l)throw new J.b("NativePlayer does't support mse/mpegts/m2ts/flv MediaDataSource input!");if(e.hasOwnProperty("segments"))throw new J.b("NativePlayer(".concat(e.type,") doesn't support multipart playback!"));this.e={onvLoadedMetadata:this._onvLoadedMetadata.bind(this)},this._pendingSeekTime=null,this._statisticsReporter=null,this._mediaDataSource=e,this._mediaElement=null}return e.prototype.destroy=function(){this._emitter.emit(h.a.DESTROYING),this._mediaElement&&(this.unload(),this.detachMediaElement()),this.e=null,this._mediaDataSource=null,this._emitter.removeAllListeners(),this._emitter=null},e.prototype.on=function(e,t){var l=this;e===h.a.MEDIA_INFO?null!=this._mediaElement&&0!==this._mediaElement.readyState&&Promise.resolve().then(function(){l._emitter.emit(h.a.MEDIA_INFO,l.mediaInfo)}):e===h.a.STATISTICS_INFO&&null!=this._mediaElement&&0!==this._mediaElement.readyState&&Promise.resolve().then(function(){l._emitter.emit(h.a.STATISTICS_INFO,l.statisticsInfo)}),this._emitter.addListener(e,t)},e.prototype.off=function(e,t){this._emitter.removeListener(e,t)},e.prototype.attachMediaElement=function(e){if(this._mediaElement=e,e.addEventListener("loadedmetadata",this.e.onvLoadedMetadata),null!=this._pendingSeekTime)try{e.currentTime=this._pendingSeekTime,this._pendingSeekTime=null}catch(e){}},e.prototype.detachMediaElement=function(){this._mediaElement&&(this._mediaElement.src="",this._mediaElement.removeAttribute("src"),this._mediaElement.removeEventListener("loadedmetadata",this.e.onvLoadedMetadata),this._mediaElement=null),null!=this._statisticsReporter&&(window.clearInterval(this._statisticsReporter),this._statisticsReporter=null)},e.prototype.load=function(){if(!this._mediaElement)throw new J.a("HTMLMediaElement must be attached before load()!");this._mediaElement.src=this._mediaDataSource.url,this._mediaElement.readyState>0&&(this._mediaElement.currentTime=0),this._mediaElement.preload="auto",this._mediaElement.load(),this._statisticsReporter=window.setInterval(this._reportStatisticsInfo.bind(this),this._config.statisticsInfoReportInterval)},e.prototype.unload=function(){this._mediaElement&&(this._mediaElement.src="",this._mediaElement.removeAttribute("src")),null!=this._statisticsReporter&&(window.clearInterval(this._statisticsReporter),this._statisticsReporter=null)},e.prototype.play=function(){return this._mediaElement.play()},e.prototype.pause=function(){this._mediaElement.pause()},Object.defineProperty(e.prototype,"type",{get:function(){return this._type},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"buffered",{get:function(){return this._mediaElement.buffered},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"duration",{get:function(){return this._mediaElement.duration},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"volume",{get:function(){return this._mediaElement.volume},set:function(e){this._mediaElement.volume=e},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"muted",{get:function(){return this._mediaElement.muted},set:function(e){this._mediaElement.muted=e},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"currentTime",{get:function(){return this._mediaElement?this._mediaElement.currentTime:0},set:function(e){this._mediaElement?this._mediaElement.currentTime=e:this._pendingSeekTime=e},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"mediaInfo",{get:function(){var e={mimeType:(this._mediaElement instanceof HTMLAudioElement?"audio/":"video/")+this._mediaDataSource.type};return this._mediaElement&&(e.duration=Math.floor(1e3*this._mediaElement.duration),this._mediaElement instanceof HTMLVideoElement&&(e.width=this._mediaElement.videoWidth,e.height=this._mediaElement.videoHeight)),e},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"statisticsInfo",{get:function(){var e={playerType:this._type,url:this._mediaDataSource.url};if(!(this._mediaElement instanceof HTMLVideoElement))return e;var t=!0,l=0,a=0;if(this._mediaElement.getVideoPlaybackQuality){var i=this._mediaElement.getVideoPlaybackQuality();l=i.totalVideoFrames,a=i.droppedVideoFrames}else null!=this._mediaElement.webkitDecodedFrameCount?(l=this._mediaElement.webkitDecodedFrameCount,a=this._mediaElement.webkitDroppedFrameCount):t=!1;return t&&(e.decodedFrames=l,e.droppedFrames=a),e},enumerable:!1,configurable:!0}),e.prototype._onvLoadedMetadata=function(e){null!=this._pendingSeekTime&&(this._mediaElement.currentTime=this._pendingSeekTime,this._pendingSeekTime=null),this._emitter.emit(h.a.MEDIA_INFO,this.mediaInfo)},e.prototype._reportStatisticsInfo=function(){this._emitter.emit(h.a.STATISTICS_INFO,this.statisticsInfo)},e}();a.a.install();var Q={createPlayer:function(e,t){var l=e;if(null==l||"object"!=typeof l)throw new J.b("MediaDataSource must be an javascript object!");if(!l.hasOwnProperty("type"))throw new J.b("MediaDataSource must has type field to indicate video file type!");switch(l.type){case"mse":case"mpegts":case"m2ts":case"flv":return new Y(l,t);default:return new A(l,t)}},isSupported:function(){return c.supportMSEH264Playback()},getFeatureList:function(){return c.getFeatureList()}};Q.BaseLoader=d.a,Q.LoaderStatus=d.c,Q.LoaderErrors=d.b,Q.Events=h.a,Q.ErrorTypes=I.b,Q.ErrorDetails=I.a,Q.MSEPlayer=Y,Q.NativePlayer=A,Q.LoggingControl=B.a,Object.defineProperty(Q,"version",{enumerable:!0,get:function(){return"1.8.0"}}),t.default=Q}])});class K{#t=null;#l=null;constructor(e,t,l,a){this.videoElement=e,this.url=t,this.config=a,this.callback=l,this.init()}init(){if(!Q.isSupported())throw new Error("MPEG-TS is not supported");const e={type:"flv",url:this.url,isLive:!0,hasAudio:!1,withCredentials:!0,liveBufferLatencyChasing:!0};this.#t=Q.createPlayer(e,{enableWorker:!0,enableWorkerForMSE:!0,liveBufferLatencyChasing:!0,lazyLoad:!0,lazyLoadMaxDuration:180,seekType:"range"}),this.#t.on(Q.Events.SCRIPTDATA_ARRIVED,()=>{console.error("LOADING_COMPLETE 加载完成"),this.callback()}),this.#t.on(Q.Events.DESTROYING,()=>{console.error("DESTROYING 销毁完成")}),this.#t.on(Q.ErrorTypes.NETWORK_ERROR,e=>{console.error("NETWORK_ERROR 网络错误",e)}),this.#t.on(Q.ErrorTypes.MEDIA_ERROR,e=>{console.error("MEDIA_ERROR 媒体错误",e)}),this.#t.on(Q.ErrorTypes.OTHER_ERROR,e=>{console.error("OTHER_ERROR 其他错误",e)}),this.#t.on(Q.Events.ERROR,e=>{console.error("ERROR 播放器错误",e)}),this.#t.attachMediaElement(this.videoElement),this.#t.load(),Y(this.videoElement.parentElement,this.videoElement,Object.assign({enableZoom:!1,enableDrag:!1,minScale:1,maxScale:6,dragSpeed:1.9},this.config))}play(){this.#t.play()}pause(){this.#t.pause()}destroyed(){this.#t&&(this.#t.unload(),this.#t.detachMediaElement(),this.#t.destroy(),this.#t=null)}screenshot(){const e=document.createElement("canvas");e.width=this.videoElement.videoWidth,e.height=this.videoElement.videoHeight,e.getContext("2d").drawImage(this.videoElement,0,0,e.width,e.height),e.toBlob(async e=>{e?await S(e,`${B(new Date)}.png`):console.error("截图失败")},"image/png")}recording(e){if(e){if(this.#l=new A(this.videoElement,{streamName:"streamName",fps:30,scale:1,containerFormat:"mp4"}),this.#l.startRecording())return!0}else if(this.#l&&this.#l.stopRecording())return!1}}var F=null;try{var _="undefined"!=typeof module&&"function"==typeof module.require&&module.require("worker_threads")||"function"==typeof __non_webpack_require__&&__non_webpack_require__("worker_threads")||"function"==typeof require&&require("worker_threads");F=_.Worker}catch(te){}function f(e,t,l){var a=function(e){return Buffer.from(e,"base64").toString("utf8")}(e),i=a.indexOf("\n",10)+1,n=a.substring(i)+"";return function(e){return new F(n,Object.assign({},e,{eval:!0}))}}function w(e,t,l){var a=function(e){return atob(e)}(e),i=a.indexOf("\n",10)+1,n=a.substring(i)+"",o=new Blob([n],{type:"application/javascript"});return URL.createObjectURL(o)}var H="[object process]"===Object.prototype.toString.call("undefined"!=typeof process?process:0);function v(e,t,l){return H?f(e):function(e){var t;return function(l){return t=t||w(e),new Worker(t,l)}}(e)}var N=v("Lyogcm9sbHVwLXBsdWdpbi13ZWItd29ya2VyLWxvYWRlciAqLwooZnVuY3Rpb24gKCkgewogICd1c2Ugc3RyaWN0JzsKCiAgY2xhc3MgQ2FudmFzMkRSZW5kZXJlciB7DQogICAgY2FudmFzID0gbnVsbDsNCiAgICBjdHggPSBudWxsOw0KICAgIGdldFNob3dEYXRhID0gbnVsbDsNCiAgICBzdG9yYWdlID0gW107DQoNCiAgICBjb25zdHJ1Y3RvcihjYW52YXMsIGdldFNob3dEYXRhLCBvdXRwdXRMYXllciwgY3JvcEZ1bGxJbmZvKSB7DQogICAgICB0aGlzLmNhbnZhcyA9IGNhbnZhczsNCiAgICAgIHRoaXMuY3R4ID0gY2FudmFzLmdldENvbnRleHQoIjJkIik7DQogICAgICB0aGlzLmdldFNob3dEYXRhID0gZ2V0U2hvd0RhdGE7DQogICAgICB0aGlzLm91dHB1dExheWVyID0gb3V0cHV0TGF5ZXI7DQogICAgICB0aGlzLmNyb3BGdWxsSW5mbyA9IEpTT04ucGFyc2UoY3JvcEZ1bGxJbmZvKTsNCiAgICB9DQogICAgI0FycmF5c0FyZUVxdWFsKGFycjEsIGFycjIpIHsNCiAgICAgIGlmIChhcnIxLmxlbmd0aCAhPT0gYXJyMi5sZW5ndGgpIHsNCiAgICAgICAgcmV0dXJuIGZhbHNlOw0KICAgICAgfQ0KICAgICAgcmV0dXJuIGFycjEuZXZlcnkoZnVuY3Rpb24gKHZhbCwgaW5kZXgpIHsNCiAgICAgICAgcmV0dXJuIHZhbCA9PT0gYXJyMltpbmRleF07DQogICAgICB9KTsNCiAgICB9DQoNCiAgICAjRHJhd0JveChhcnIpIHsNCiAgICAgIGlmIChhcnIubGVuZ3RoKSB7DQogICAgICAgIHRoaXMuY3R4LnNhdmUoKTsNCiAgICAgICAgdGhpcy5jdHguc2V0VHJhbnNmb3JtKDEsIDAsIDAsIDEsIDAsIDApOyAvLyBSZXNldCB0cmFuc2Zvcm0gdG8gYXZvaWQgYWZmZWN0aW5nIGJveCBkcmF3aW5nDQogICAgICAgIHRoaXMuY3R4LnN0cm9rZVN0eWxlID0gInJlZCI7DQogICAgICAgIHRoaXMuY3R4LmxpbmVXaWR0aCA9IDEwOw0KICAgICAgICBpZiAodGhpcy5vdXRwdXRMYXllcikgew0KICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSB7DQogICAgICAgICAgICBsZXQgW3gsIHksIHcsIGhdID0gWw0KICAgICAgICAgICAgICBhcnJbaV1bMF0gKiAodGhpcy5jYW52YXMud2lkdGggLyB0aGlzLm91dHB1dExheWVyLldpZHRoTWFpbiksDQogICAgICAgICAgICAgIGFycltpXVsxXSAqICh0aGlzLmNhbnZhcy5oZWlnaHQgLyB0aGlzLm91dHB1dExheWVyLkhlaWdodE1haW4pLA0KICAgICAgICAgICAgICAoYXJyW2ldWzJdIC0gYXJyW2ldWzBdKSAqDQogICAgICAgICAgICAgICAgKHRoaXMuY2FudmFzLndpZHRoIC8gdGhpcy5vdXRwdXRMYXllci5XaWR0aE1haW4pLA0KICAgICAgICAgICAgICAoYXJyW2ldWzNdIC0gYXJyW2ldWzFdKSAqDQogICAgICAgICAgICAgICAgKHRoaXMuY2FudmFzLmhlaWdodCAvIHRoaXMub3V0cHV0TGF5ZXIuSGVpZ2h0TWFpbiksDQogICAgICAgICAgICBdOw0KICAgICAgICAgICAgdGhpcy5jdHguc3Ryb2tlUmVjdCh4LCB5LCB3LCBoKTsNCiAgICAgICAgICAgIHRoaXMuc3RvcmFnZSA9IFt4LCB5LCB3LCBoXTsNCiAgICAgICAgICB9DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJvdXRwdXRMYXllciBpcyBudWxsIik7DQogICAgICAgIH0NCiAgICAgICAgdGhpcy5jdHgucmVzdG9yZSgpOw0KICAgICAgfSBlbHNlIHsNCiAgICAgICAgbGV0IFt4LCB5LCB3LCBoXSA9IHRoaXMuc3RvcmFnZTsNCiAgICAgICAgdGhpcy5jdHguc2F2ZSgpOw0KICAgICAgICB0aGlzLmN0eC5zZXRUcmFuc2Zvcm0oMSwgMCwgMCwgMSwgMCwgMCk7DQogICAgICAgIHRoaXMuY3R4LnN0cm9rZVN0eWxlID0gInRyYW5zcGFyZW50IjsNCiAgICAgICAgdGhpcy5jdHgubGluZVdpZHRoID0gMTA7DQogICAgICAgIHRoaXMuY3R4LnN0cm9rZVJlY3QoeCwgeSwgdywgaCk7DQogICAgICAgIHRoaXMuY3R4LnJlc3RvcmUoKTsNCiAgICAgIH0NCiAgICB9DQogICAgdGVtcCA9IG51bGw7DQogICAgZHJhdyhmcmFtZSkgew0KICAgICAgaWYgKHRoaXMuY3JvcEZ1bGxJbmZvLlVzZUNyb3ApIHsNCiAgICAgICAgdGhpcy5jYW52YXMud2lkdGggPSB0aGlzLmNyb3BGdWxsSW5mby5XOw0KICAgICAgICB0aGlzLmNhbnZhcy5oZWlnaHQgPSB0aGlzLmNyb3BGdWxsSW5mby5IOw0KICAgICAgfSBlbHNlIHsNCiAgICAgICAgdGhpcy5jYW52YXMud2lkdGggPSBmcmFtZS5kaXNwbGF5V2lkdGg7DQogICAgICAgIHRoaXMuY2FudmFzLmhlaWdodCA9IGZyYW1lLmRpc3BsYXlIZWlnaHQ7DQogICAgICB9DQogICAgICB0aGlzLmN0eC5zYXZlKCk7DQogICAgICB0aGlzLmN0eC50cmFuc2xhdGUodGhpcy5jYW52YXMud2lkdGggLyAyLCB0aGlzLmNhbnZhcy5oZWlnaHQgLyAyKTsNCiAgICAgIGlmICghdGhpcy5jcm9wRnVsbEluZm8uVXNlUm90YXRlKSB7DQogICAgICAgIHRoaXMuY3R4LnJvdGF0ZSgwKTsNCiAgICAgICAgdGhpcy5jcm9wRnVsbEluZm8uUm90YXRlID0gMDsNCiAgICAgIH0gZWxzZSB7DQogICAgICAgIHRoaXMuY3R4LnJvdGF0ZSgodGhpcy5jcm9wRnVsbEluZm8uUm90YXRlIC8gOTApICogMS41Nyk7DQogICAgICB9DQoNCiAgICAgIHN3aXRjaCAodGhpcy5jcm9wRnVsbEluZm8uUm90YXRlKSB7DQogICAgICAgIGNhc2UgMDoNCiAgICAgICAgY2FzZSAxODA6DQogICAgICAgICAgdGhpcy5jdHguZHJhd0ltYWdlKA0KICAgICAgICAgICAgZnJhbWUsDQogICAgICAgICAgICB0aGlzLmNyb3BGdWxsSW5mby5Vc2VDcm9wDQogICAgICAgICAgICAgID8gLXRoaXMuY2FudmFzLndpZHRoIC8gMiAtIHRoaXMuY3JvcEZ1bGxJbmZvLlgNCiAgICAgICAgICAgICAgOiAtdGhpcy5jYW52YXMud2lkdGggLyAyLA0KICAgICAgICAgICAgdGhpcy5jcm9wRnVsbEluZm8uVXNlQ3JvcA0KICAgICAgICAgICAgICA/IC10aGlzLmNhbnZhcy5oZWlnaHQgLyAyIC0gdGhpcy5jcm9wRnVsbEluZm8uWQ0KICAgICAgICAgICAgICA6IC10aGlzLmNhbnZhcy5oZWlnaHQgLyAyLA0KICAgICAgICAgICAgZnJhbWUuZGlzcGxheVdpZHRoLA0KICAgICAgICAgICAgZnJhbWUuZGlzcGxheUhlaWdodA0KICAgICAgICAgICk7DQogICAgICAgICAgYnJlYWs7DQogICAgICAgIGNhc2UgOTA6DQogICAgICAgIGNhc2UgMjcwOg0KICAgICAgICAgIHRoaXMuY3R4LmRyYXdJbWFnZSgNCiAgICAgICAgICAgIGZyYW1lLA0KICAgICAgICAgICAgdGhpcy5jcm9wRnVsbEluZm8uVXNlQ3JvcA0KICAgICAgICAgICAgICA/IC10aGlzLmNhbnZhcy5oZWlnaHQgLyAyIC0gdGhpcy5jcm9wRnVsbEluZm8uWQ0KICAgICAgICAgICAgICA6IC10aGlzLmNhbnZhcy5oZWlnaHQgLyAyLA0KICAgICAgICAgICAgdGhpcy5jcm9wRnVsbEluZm8uVXNlQ3JvcA0KICAgICAgICAgICAgICA/IC10aGlzLmNhbnZhcy53aWR0aCAvIDIgLSB0aGlzLmNyb3BGdWxsSW5mby5YDQogICAgICAgICAgICAgIDogLXRoaXMuY2FudmFzLndpZHRoIC8gMiwNCiAgICAgICAgICAgIGZyYW1lLmRpc3BsYXlXaWR0aCwNCiAgICAgICAgICAgIGZyYW1lLmRpc3BsYXlIZWlnaHQNCiAgICAgICAgICApOw0KICAgICAgICAgIGJyZWFrOw0KICAgICAgfQ0KICAgICAgdGhpcy5jdHgucmVzdG9yZSgpOw0KDQogICAgICBpZiAoc2VsZi5HZXRJbWcpIHsNCiAgICAgICAgdGhpcy5jdHguY2FudmFzLmNvbnZlcnRUb0Jsb2IoKS50aGVuKChibG9iKSA9PiB7DQogICAgICAgICAgc2VsZi5wb3N0TWVzc2FnZSh7IGltZzogYmxvYiwgdHlwZTogImltZyIgfSk7DQogICAgICAgIH0pOw0KICAgICAgICBzZWxmLkdldEltZyA9IGZhbHNlOw0KICAgICAgfQ0KICAgICAgY29uc3Qgc2hvd0RhdGEgPSB0aGlzLmdldFNob3dEYXRhKCk7DQogICAgICBpZiAoc2hvd0RhdGEpIHsNCiAgICAgICAgdGhpcy4jRHJhd0JveChzaG93RGF0YSk7DQogICAgICB9DQogICAgICBmcmFtZS5jbG9zZSgpOw0KICAgIH0NCiAgfQoKICBzZWxmLkdldEltZyA9IGZhbHNlOw0KDQogIC8vIOa4suafkyzmr4/kuKrliqjnlLvluKflj6rog73nu5jliLbkuIDmrKENCiAgbGV0IHJlbmRlcmVyID0gbnVsbDsNCiAgbGV0IHNob3dEYXRhID0gbnVsbDsNCiAgY2xhc3MgUXVldWUgew0KICAgIGNvbnN0cnVjdG9yKCkgew0KICAgICAgdGhpcy5faXRlbXMgPSBbXTsNCiAgICB9DQoNCiAgICBlbnF1ZXVlKGl0ZW0pIHsNCiAgICAgIHRoaXMuX2l0ZW1zLnB1c2goaXRlbSk7DQogICAgfQ0KDQogICAgZGVxdWV1ZSgpIHsNCiAgICAgIHJldHVybiB0aGlzLl9pdGVtcy5zaGlmdCgpOw0KICAgIH0NCg0KICAgIGhlYWQoKSB7DQogICAgICByZXR1cm4gdGhpcy5faXRlbXNbMF07DQogICAgfQ0KDQogICAgdGFpbCgpIHsNCiAgICAgIHJldHVybiB0aGlzLl9pdGVtc1t0aGlzLl9pdGVtcy5sZW5ndGggLSAxXTsNCiAgICB9DQoNCiAgICBpc0VtcHR5KCkgew0KICAgICAgcmV0dXJuICF0aGlzLl9pdGVtcy5sZW5ndGg7DQogICAgfQ0KDQogICAgc2l6ZSgpIHsNCiAgICAgIHJldHVybiB0aGlzLl9pdGVtcy5sZW5ndGg7DQogICAgfQ0KDQogICAgY2xlYXIoKSB7DQogICAgICB0aGlzLl9pdGVtcyA9IFtdOw0KICAgIH0NCiAgfQ0KDQogIHZhciBGcmFtZUJ1ZmZlciA9IG5ldyBRdWV1ZSgpOw0KDQogIGZ1bmN0aW9uIHJlbmRlckZyYW1lKGZyYW1lKSB7DQogICAgRnJhbWVCdWZmZXIuZW5xdWV1ZShmcmFtZSk7DQogIH0NCg0KICBjb25zdCBkZWNvZGVyID0gbmV3IFZpZGVvRGVjb2Rlcih7DQogICAgb3V0cHV0KGZyYW1lKSB7DQogICAgICByZW5kZXJGcmFtZShmcmFtZSk7DQogICAgfSwNCiAgICBlcnJvcihlKSB7DQogICAgICBjb25zb2xlLmVycm9yKGUpOw0KICAgIH0sDQogIH0pOw0KDQogIHNldEludGVydmFsKGZ1bmN0aW9uICgpIHsNCiAgICBpZiAoRnJhbWVCdWZmZXIuc2l6ZSgpID4gMCkgew0KICAgICAgcmVuZGVyZXIuZHJhdyhGcmFtZUJ1ZmZlci5kZXF1ZXVlKCkpOw0KICAgIH0NCiAgfSwgMzkpOw0KDQogIGZ1bmN0aW9uIGdldFNob3dEYXRhKCkgew0KICAgIHJldHVybiBzaG93RGF0YTsNCiAgfQ0KDQogIHZhciBmbGFnUG9zdCA9IDA7DQogIHZhciBjcm9wRnVsbEluZm8gPSAiIjsNCiAgLy8gTGlzdGVuIGZvciB0aGUgc3RhcnQgcmVxdWVzdC4NCiAgc2VsZi5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIiwgKG1lc3NhZ2UpID0+IHsNCiAgICBsZXQge2NhbnZhcywgdHlwZSwgYmFzZVdIIH0gPSBtZXNzYWdlLmRhdGE7DQogICAgaWYgKHR5cGUgPT09ICJqdCIpIHsNCiAgICAgIHNlbGYuR2V0SW1nID0gdHJ1ZTsNCiAgICB9DQogICAgaWYgKG1lc3NhZ2UuZGF0YS5EYXRhVHlwZSA9PT0gIk9wdCIpIHsNCiAgICAgIGNyb3BGdWxsSW5mbyA9IG1lc3NhZ2UuZGF0YS5kYXRhOw0KICAgIH0NCiAgICBpZiAobWVzc2FnZS5kYXRhLkRhdGFUeXBlID09PSAiU3RhcnQiKSB7DQogICAgICBjb25zdCBiYXNlSW5mbyA9IGJhc2VXSCA/IEpTT04ucGFyc2UoYmFzZVdIKSA6IG51bGw7DQoNCiAgICAgIHJlbmRlcmVyID0gbmV3IENhbnZhczJEUmVuZGVyZXIoY2FudmFzLCBnZXRTaG93RGF0YSwgYmFzZUluZm8sIGNyb3BGdWxsSW5mbyk7DQogICAgICBpZiAoIVZpZGVvRGVjb2RlcikNCiAgICAgICAgdGhyb3cgbmV3IEVycm9yKA0KICAgICAgICAgICJUaGUgY3VycmVudCBicm93c2VyIGRvZXMgbm90IHN1cHBvcnQgdGhlIFZpZGVvRGVjb2RlciBBUEkiDQogICAgICAgICk7DQogICAgfQ0KICAgIGlmIChtZXNzYWdlLmRhdGEuRGF0YVR5cGUgPT09ICJUcmFjayIpIHsNCiAgICAgIGRlY29kZXIuY29uZmlndXJlKHsNCiAgICAgICAgY29kZWM6IG1lc3NhZ2UuZGF0YS5jb2RlYywNCiAgICAgICAgY29kZWRIZWlnaHQ6IG1lc3NhZ2UuZGF0YS5jb2RlZEhlaWdodCwNCiAgICAgICAgY29kZWRXaWR0aDogbWVzc2FnZS5kYXRhLmNvZGVkV2lkdGgsDQogICAgICAgIGRlc2NyaXB0aW9uOiBtZXNzYWdlLmRhdGEuZGVzY3JpcHRpb24sDQogICAgICB9KTsNCiAgICAgIGNvbnNvbGUubG9nKG1lc3NhZ2UuZGF0YSk7DQogICAgfQ0KICAgIGlmIChtZXNzYWdlLmRhdGEuRGF0YVR5cGUgPT09ICJTYW1wbGVzIikgew0KICAgICAgc2hvd0RhdGEgPSBtZXNzYWdlLmRhdGEuc2hvd0RhdGEgfHwgbnVsbDsNCiAgICAgIGRlY29kZXIuZGVjb2RlKA0KICAgICAgICBuZXcgRW5jb2RlZFZpZGVvQ2h1bmsoew0KICAgICAgICAgIHR5cGU6IG1lc3NhZ2UuZGF0YS50eXBlLA0KICAgICAgICAgIHRpbWVzdGFtcDogbWVzc2FnZS5kYXRhLnRpbWVzdGFtcCwNCiAgICAgICAgICBkdXJhdGlvbjogbWVzc2FnZS5kYXRhLmR1cmF0aW9uLA0KICAgICAgICAgIGRhdGE6IG1lc3NhZ2UuZGF0YS5kYXRhLA0KICAgICAgICB9KQ0KICAgICAgKTsNCiAgICAgIGlmIChmbGFnUG9zdCA9PT0gMykgew0KICAgICAgICB2YXIgY29ubmVjdCA9IHRydWU7DQogICAgICAgIHNlbGYucG9zdE1lc3NhZ2UoY29ubmVjdCk7DQogICAgICAgIGZsYWdQb3N0ID0gNDsNCiAgICAgIH0gZWxzZSB7DQogICAgICAgIGlmIChmbGFnUG9zdCA9PT0gNCkgcmV0dXJuOw0KICAgICAgICBmbGFnUG9zdCsrOw0KICAgICAgfQ0KICAgIH0NCiAgfSk7Cgp9KSgpOwovLyMgc291cmNlTWFwcGluZ1VSTD13b3JrZXIuanMubWFwCgo="),z=v("Lyogcm9sbHVwLXBsdWdpbi13ZWItd29ya2VyLWxvYWRlciAqLwooZnVuY3Rpb24gKCkgewoJJ3VzZSBzdHJpY3QnOwoKCWZ1bmN0aW9uIGNyZWF0ZUNvbW1vbmpzTW9kdWxlKGZuLCBiYXNlZGlyLCBtb2R1bGUpIHsKCQlyZXR1cm4gbW9kdWxlID0gewoJCSAgcGF0aDogYmFzZWRpciwKCQkgIGV4cG9ydHM6IHt9LAoJCSAgcmVxdWlyZTogZnVuY3Rpb24gKHBhdGgsIGJhc2UpIHsKCSAgICAgIHJldHVybiBjb21tb25qc1JlcXVpcmUocGF0aCwgKGJhc2UgPT09IHVuZGVmaW5lZCB8fCBiYXNlID09PSBudWxsKSA/IG1vZHVsZS5wYXRoIDogYmFzZSk7CgkgICAgfQoJCX0sIGZuKG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMpLCBtb2R1bGUuZXhwb3J0czsKCX0KCglmdW5jdGlvbiBjb21tb25qc1JlcXVpcmUgKCkgewoJCXRocm93IG5ldyBFcnJvcignRHluYW1pYyByZXF1aXJlcyBhcmUgbm90IGN1cnJlbnRseSBzdXBwb3J0ZWQgYnkgQHJvbGx1cC9wbHVnaW4tY29tbW9uanMnKTsKCX0KCgl2YXIgbXA0Ym94X2FsbCA9IGNyZWF0ZUNvbW1vbmpzTW9kdWxlKGZ1bmN0aW9uIChtb2R1bGUsIGV4cG9ydHMkMSkgewoJLy8gZmlsZTpzcmMvbG9nLmpzCgkvKiAKCSAqIENvcHlyaWdodCAoYykgMjAxMi0yMDEzLiBUZWxlY29tIFBhcmlzVGVjaC9UU0kvTU0vR1BBQyBDeXJpbCBDb25jb2xhdG8KCSAqIExpY2Vuc2U6IEJTRC0zLUNsYXVzZSAoc2VlIExJQ0VOU0UgZmlsZSkKCSAqLwoJdmFyIExvZyA9IChmdW5jdGlvbiAoKXsKCQkJdmFyIHN0YXJ0ID0gbmV3IERhdGUoKTsKCQkJdmFyIExPR19MRVZFTF9FUlJPUiAJPSA0OwoJCQl2YXIgTE9HX0xFVkVMX1dBUk5JTkcgCT0gMzsKCQkJdmFyIExPR19MRVZFTF9JTkZPIAkJPSAyOwoJCQl2YXIgTE9HX0xFVkVMX0RFQlVHCQk9IDE7CgkJCXZhciBsb2dfbGV2ZWwgPSBMT0dfTEVWRUxfRVJST1I7CgkJCXZhciBsb2dPYmplY3QgPSB7CgkJCQlzZXRMb2dMZXZlbCA6IGZ1bmN0aW9uKGxldmVsKSB7CgkJCQkJaWYgKGxldmVsID09IHRoaXMuZGVidWcpIGxvZ19sZXZlbCA9IExPR19MRVZFTF9ERUJVRzsKCQkJCQllbHNlIGlmIChsZXZlbCA9PSB0aGlzLmluZm8pIGxvZ19sZXZlbCA9IExPR19MRVZFTF9JTkZPOwoJCQkJCWVsc2UgaWYgKGxldmVsID09IHRoaXMud2FybikgbG9nX2xldmVsID0gTE9HX0xFVkVMX1dBUk5JTkc7CgkJCQkJZWxzZSBpZiAobGV2ZWwgPT0gdGhpcy5lcnJvcikgbG9nX2xldmVsID0gTE9HX0xFVkVMX0VSUk9SOwoJCQkJCWVsc2UgbG9nX2xldmVsID0gTE9HX0xFVkVMX0VSUk9SOwoJCQkJfSwKCQkJCWRlYnVnIDogZnVuY3Rpb24obW9kdWxlLCBtc2cpIHsKCQkJCQlpZiAoY29uc29sZS5kZWJ1ZyA9PT0gdW5kZWZpbmVkKSB7CgkJCQkJCWNvbnNvbGUuZGVidWcgPSBjb25zb2xlLmxvZzsKCQkJCQl9CgkJCQkJaWYgKExPR19MRVZFTF9ERUJVRyA+PSBsb2dfbGV2ZWwpIHsKCQkJCQkJY29uc29sZS5kZWJ1ZygiWyIrTG9nLmdldER1cmF0aW9uU3RyaW5nKG5ldyBEYXRlKCktc3RhcnQsMTAwMCkrIl0iLCJbIittb2R1bGUrIl0iLG1zZyk7CgkJCQkJfQoJCQkJfSwKCQkJCWxvZyA6IGZ1bmN0aW9uKG1vZHVsZSwgbXNnKSB7CgkJCQkJdGhpcy5kZWJ1Zyhtb2R1bGUubXNnKTsKCQkJCX0sCgkJCQlpbmZvIDogZnVuY3Rpb24obW9kdWxlLCBtc2cpIHsKCQkJCQlpZiAoTE9HX0xFVkVMX0lORk8gPj0gbG9nX2xldmVsKSB7CgkJCQkJCWNvbnNvbGUuaW5mbygiWyIrTG9nLmdldER1cmF0aW9uU3RyaW5nKG5ldyBEYXRlKCktc3RhcnQsMTAwMCkrIl0iLCJbIittb2R1bGUrIl0iLG1zZyk7CgkJCQkJfQoJCQkJfSwKCQkJCXdhcm4gOiBmdW5jdGlvbihtb2R1bGUsIG1zZykgewoJCQkJCWlmIChMT0dfTEVWRUxfV0FSTklORyA+PSBsb2dfbGV2ZWwpIHsKCQkJCQkJY29uc29sZS53YXJuKCJbIitMb2cuZ2V0RHVyYXRpb25TdHJpbmcobmV3IERhdGUoKS1zdGFydCwxMDAwKSsiXSIsIlsiK21vZHVsZSsiXSIsbXNnKTsKCQkJCQl9CgkJCQl9LAoJCQkJZXJyb3IgOiBmdW5jdGlvbihtb2R1bGUsIG1zZykgewoJCQkJCWlmIChMT0dfTEVWRUxfRVJST1IgPj0gbG9nX2xldmVsKSB7CgkJCQkJCWNvbnNvbGUuZXJyb3IoIlsiK0xvZy5nZXREdXJhdGlvblN0cmluZyhuZXcgRGF0ZSgpLXN0YXJ0LDEwMDApKyJdIiwiWyIrbW9kdWxlKyJdIixtc2cpOwoJCQkJCX0KCQkJCX0KCQkJfTsKCQkJcmV0dXJuIGxvZ09iamVjdDsKCQl9KSgpOwoJCQoJLyogSGVscGVyIGZ1bmN0aW9uIHRvIHByaW50IGEgZHVyYXRpb24gdmFsdWUgaW4gdGhlIGZvcm0gSDpNTTpTUy5NUyAqLwoJTG9nLmdldER1cmF0aW9uU3RyaW5nID0gZnVuY3Rpb24oZHVyYXRpb24sIF90aW1lc2NhbGUpIHsKCQl2YXIgbmVnOwoJCS8qIEhlbHBlciBmdW5jdGlvbiB0byBwcmludCBhIG51bWJlciBvbiBhIGZpeGVkIG51bWJlciBvZiBkaWdpdHMgKi8KCQlmdW5jdGlvbiBwYWQobnVtYmVyLCBsZW5ndGgpIHsKCQkJdmFyIHN0ciA9ICcnICsgbnVtYmVyOwoJCQl2YXIgYSA9IHN0ci5zcGxpdCgnLicpOwkJCgkJCXdoaWxlIChhWzBdLmxlbmd0aCA8IGxlbmd0aCkgewoJCQkJYVswXSA9ICcwJyArIGFbMF07CgkJCX0KCQkJcmV0dXJuIGEuam9pbignLicpOwoJCX0KCQlpZiAoZHVyYXRpb24gPCAwKSB7CgkJCW5lZyA9IHRydWU7CgkJCWR1cmF0aW9uID0gLWR1cmF0aW9uOwoJCX0gZWxzZSB7CgkJCW5lZyA9IGZhbHNlOwkKCQl9CgkJdmFyIHRpbWVzY2FsZSA9IF90aW1lc2NhbGUgfHwgMTsKCQl2YXIgZHVyYXRpb25fc2VjID0gZHVyYXRpb24vdGltZXNjYWxlOwoJCXZhciBob3VycyA9IE1hdGguZmxvb3IoZHVyYXRpb25fc2VjLzM2MDApOwoJCWR1cmF0aW9uX3NlYyAtPSBob3VycyAqIDM2MDA7CgkJdmFyIG1pbnV0ZXMgPSBNYXRoLmZsb29yKGR1cmF0aW9uX3NlYy82MCk7CgkJZHVyYXRpb25fc2VjIC09IG1pbnV0ZXMgKiA2MDsJCQoJCXZhciBtc2VjID0gZHVyYXRpb25fc2VjKjEwMDA7CgkJZHVyYXRpb25fc2VjID0gTWF0aC5mbG9vcihkdXJhdGlvbl9zZWMpOwoJCW1zZWMgLT0gZHVyYXRpb25fc2VjKjEwMDA7CgkJbXNlYyA9IE1hdGguZmxvb3IobXNlYyk7CgkJcmV0dXJuIChuZWcgPyAiLSI6ICIiKStob3VycysiOiIrcGFkKG1pbnV0ZXMsMikrIjoiK3BhZChkdXJhdGlvbl9zZWMsMikrIi4iK3BhZChtc2VjLDMpOwoJfTsKCQkKCS8qIEhlbHBlciBmdW5jdGlvbiB0byBzdHJpbmdpZnkgSFRNTDUgVGltZVJhbmdlcyBvYmplY3RzICovCQoJTG9nLnByaW50UmFuZ2VzID0gZnVuY3Rpb24ocmFuZ2VzKSB7CgkJdmFyIGxlbmd0aCA9IHJhbmdlcy5sZW5ndGg7CgkJaWYgKGxlbmd0aCA+IDApIHsKCQkJdmFyIHN0ciA9ICIiOwoJCQlmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CgkJCSAgaWYgKGkgPiAwKSBzdHIgKz0gIiwiOwoJCQkgIHN0ciArPSAiWyIrTG9nLmdldER1cmF0aW9uU3RyaW5nKHJhbmdlcy5zdGFydChpKSkrICIsIitMb2cuZ2V0RHVyYXRpb25TdHJpbmcocmFuZ2VzLmVuZChpKSkrIl0iOwoJCQl9CgkJCXJldHVybiBzdHI7CgkJfSBlbHNlIHsKCQkJcmV0dXJuICIoZW1wdHkpIjsKCQl9Cgl9OwoKCXsKCQlleHBvcnRzJDEuTG9nID0gTG9nOwoJfQoJLy8gZmlsZTpzcmMvc3RyZWFtLmpzCgl2YXIgTVA0Qm94U3RyZWFtID0gZnVuY3Rpb24oYXJyYXlCdWZmZXIpIHsKCSAgaWYgKGFycmF5QnVmZmVyIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpIHsKCSAgICB0aGlzLmJ1ZmZlciA9IGFycmF5QnVmZmVyOwoJICAgIHRoaXMuZGF0YXZpZXcgPSBuZXcgRGF0YVZpZXcoYXJyYXlCdWZmZXIpOwoJICB9IGVsc2UgewoJICAgIHRocm93ICgiTmVlZHMgYW4gYXJyYXkgYnVmZmVyIik7CgkgIH0KCSAgdGhpcy5wb3NpdGlvbiA9IDA7Cgl9OwoKCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCgkgIENvbW1vbiBBUEkgYmV0d2VlbiBNdWx0aUJ1ZmZlclN0cmVhbSBhbmQgU2ltcGxlU3RyZWFtCgkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCU1QNEJveFN0cmVhbS5wcm90b3R5cGUuZ2V0UG9zaXRpb24gPSBmdW5jdGlvbigpIHsKCSAgcmV0dXJuIHRoaXMucG9zaXRpb247Cgl9OwoKCU1QNEJveFN0cmVhbS5wcm90b3R5cGUuZ2V0RW5kUG9zaXRpb24gPSBmdW5jdGlvbigpIHsKCSAgcmV0dXJuIHRoaXMuYnVmZmVyLmJ5dGVMZW5ndGg7Cgl9OwoKCU1QNEJveFN0cmVhbS5wcm90b3R5cGUuZ2V0TGVuZ3RoID0gZnVuY3Rpb24oKSB7CgkgIHJldHVybiB0aGlzLmJ1ZmZlci5ieXRlTGVuZ3RoOwoJfTsKCglNUDRCb3hTdHJlYW0ucHJvdG90eXBlLnNlZWsgPSBmdW5jdGlvbiAocG9zKSB7CgkgIHZhciBucG9zID0gTWF0aC5tYXgoMCwgTWF0aC5taW4odGhpcy5idWZmZXIuYnl0ZUxlbmd0aCwgcG9zKSk7CgkgIHRoaXMucG9zaXRpb24gPSAoaXNOYU4obnBvcykgfHwgIWlzRmluaXRlKG5wb3MpKSA/IDAgOiBucG9zOwoJICByZXR1cm4gdHJ1ZTsKCX07CgoJTVA0Qm94U3RyZWFtLnByb3RvdHlwZS5pc0VvcyA9IGZ1bmN0aW9uICgpIHsKCSAgcmV0dXJuIHRoaXMuZ2V0UG9zaXRpb24oKSA+PSB0aGlzLmdldEVuZFBvc2l0aW9uKCk7Cgl9OwoKCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCgkgIFJlYWQgbWV0aG9kcywgc2ltaW1hciB0byBEYXRhU3RyZWFtIGJ1dCBzaW1wbGVyCgkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCU1QNEJveFN0cmVhbS5wcm90b3R5cGUucmVhZEFueUludCA9IGZ1bmN0aW9uKHNpemUsIHNpZ25lZCkgewoJICB2YXIgcmVzID0gMDsKCSAgaWYgKHRoaXMucG9zaXRpb24gKyBzaXplIDw9IHRoaXMuYnVmZmVyLmJ5dGVMZW5ndGgpIHsKCSAgICBzd2l0Y2ggKHNpemUpIHsKCSAgICAgIGNhc2UgMToKCSAgICAgICAgaWYgKHNpZ25lZCkgewoJICAgICAgICAgIHJlcyA9IHRoaXMuZGF0YXZpZXcuZ2V0SW50OCh0aGlzLnBvc2l0aW9uKTsKCSAgICAgICAgfSBlbHNlIHsKCSAgICAgICAgICByZXMgPSB0aGlzLmRhdGF2aWV3LmdldFVpbnQ4KHRoaXMucG9zaXRpb24pOwoJICAgICAgICB9CgkgICAgICAgIGJyZWFrOwoJICAgICAgY2FzZSAyOgoJICAgICAgICBpZiAoc2lnbmVkKSB7CgkgICAgICAgICAgcmVzID0gdGhpcy5kYXRhdmlldy5nZXRJbnQxNih0aGlzLnBvc2l0aW9uKTsKCSAgICAgICAgfSBlbHNlIHsKCSAgICAgICAgICByZXMgPSB0aGlzLmRhdGF2aWV3LmdldFVpbnQxNih0aGlzLnBvc2l0aW9uKTsKCSAgICAgICAgfQoJICAgICAgICBicmVhazsKCSAgICAgIGNhc2UgMzoKCSAgICAgICAgaWYgKHNpZ25lZCkgewoJICAgICAgICAgIHRocm93ICgiTm8gbWV0aG9kIGZvciByZWFkaW5nIHNpZ25lZCAyNCBiaXRzIHZhbHVlcyIpOwoJICAgICAgICB9IGVsc2UgewoJICAgICAgICAgIHJlcyA9IHRoaXMuZGF0YXZpZXcuZ2V0VWludDgodGhpcy5wb3NpdGlvbikgPDwgMTY7CgkgICAgICAgICAgcmVzIHw9IHRoaXMuZGF0YXZpZXcuZ2V0VWludDgodGhpcy5wb3NpdGlvbisxKSA8PCA4OwoJICAgICAgICAgIHJlcyB8PSB0aGlzLmRhdGF2aWV3LmdldFVpbnQ4KHRoaXMucG9zaXRpb24rMik7CgkgICAgICAgIH0KCSAgICAgICAgYnJlYWs7CgkgICAgICBjYXNlIDQ6CgkgICAgICAgIGlmIChzaWduZWQpIHsKCSAgICAgICAgICByZXMgPSB0aGlzLmRhdGF2aWV3LmdldEludDMyKHRoaXMucG9zaXRpb24pOwoJICAgICAgICB9IGVsc2UgewoJICAgICAgICAgIHJlcyA9IHRoaXMuZGF0YXZpZXcuZ2V0VWludDMyKHRoaXMucG9zaXRpb24pOwoJICAgICAgICB9CgkgICAgICAgIGJyZWFrOwoJICAgICAgY2FzZSA4OgoJICAgICAgICBpZiAoc2lnbmVkKSB7CgkgICAgICAgICAgdGhyb3cgKCJObyBtZXRob2QgZm9yIHJlYWRpbmcgc2lnbmVkIDY0IGJpdHMgdmFsdWVzIik7CgkgICAgICAgIH0gZWxzZSB7CgkgICAgICAgICAgcmVzID0gdGhpcy5kYXRhdmlldy5nZXRVaW50MzIodGhpcy5wb3NpdGlvbikgPDwgMzI7CgkgICAgICAgICAgcmVzIHw9IHRoaXMuZGF0YXZpZXcuZ2V0VWludDMyKHRoaXMucG9zaXRpb24rNCk7CgkgICAgICAgIH0KCSAgICAgICAgYnJlYWs7CgkgICAgICBkZWZhdWx0OgoJICAgICAgICB0aHJvdyAoInJlYWRJbnQgbWV0aG9kIG5vdCBpbXBsZW1lbnRlZCBmb3Igc2l6ZTogIitzaXplKTsKCSAgICB9CgkgICAgdGhpcy5wb3NpdGlvbis9IHNpemU7CgkgICAgcmV0dXJuIHJlczsKCSAgfSBlbHNlIHsKCSAgICB0aHJvdyAoIk5vdCBlbm91Z2ggYnl0ZXMgaW4gYnVmZmVyIik7CgkgIH0KCX07CgoJTVA0Qm94U3RyZWFtLnByb3RvdHlwZS5yZWFkVWludDggPSBmdW5jdGlvbigpIHsKCSAgcmV0dXJuIHRoaXMucmVhZEFueUludCgxLCBmYWxzZSk7Cgl9OwoKCU1QNEJveFN0cmVhbS5wcm90b3R5cGUucmVhZFVpbnQxNiA9IGZ1bmN0aW9uKCkgewoJICByZXR1cm4gdGhpcy5yZWFkQW55SW50KDIsIGZhbHNlKTsKCX07CgoJTVA0Qm94U3RyZWFtLnByb3RvdHlwZS5yZWFkVWludDI0ID0gZnVuY3Rpb24oKSB7CgkgIHJldHVybiB0aGlzLnJlYWRBbnlJbnQoMywgZmFsc2UpOwoJfTsKCglNUDRCb3hTdHJlYW0ucHJvdG90eXBlLnJlYWRVaW50MzIgPSBmdW5jdGlvbigpIHsKCSAgcmV0dXJuIHRoaXMucmVhZEFueUludCg0LCBmYWxzZSk7Cgl9OwoKCU1QNEJveFN0cmVhbS5wcm90b3R5cGUucmVhZFVpbnQ2NCA9IGZ1bmN0aW9uKCkgewoJICByZXR1cm4gdGhpcy5yZWFkQW55SW50KDgsIGZhbHNlKTsKCX07CgoJTVA0Qm94U3RyZWFtLnByb3RvdHlwZS5yZWFkU3RyaW5nID0gZnVuY3Rpb24obGVuZ3RoKSB7CgkgIGlmICh0aGlzLnBvc2l0aW9uICsgbGVuZ3RoIDw9IHRoaXMuYnVmZmVyLmJ5dGVMZW5ndGgpIHsKCSAgICB2YXIgcyA9ICIiOwoJICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKCSAgICAgIHMgKz0gU3RyaW5nLmZyb21DaGFyQ29kZSh0aGlzLnJlYWRVaW50OCgpKTsKCSAgICB9CgkgICAgcmV0dXJuIHM7CgkgIH0gZWxzZSB7CgkgICAgdGhyb3cgKCJOb3QgZW5vdWdoIGJ5dGVzIGluIGJ1ZmZlciIpOwoJICB9Cgl9OwoKCU1QNEJveFN0cmVhbS5wcm90b3R5cGUucmVhZENTdHJpbmcgPSBmdW5jdGlvbigpIHsKCSAgdmFyIGFyciA9IFtdOwoJICB3aGlsZSh0cnVlKSB7CgkgICAgdmFyIGIgPSB0aGlzLnJlYWRVaW50OCgpOwoJICAgIGlmIChiICE9PSAwKSB7CgkgICAgICBhcnIucHVzaChiKTsKCSAgICB9IGVsc2UgewoJICAgICAgYnJlYWs7CgkgICAgfQoJICB9CgkgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsIGFycik7IAoJfTsKCglNUDRCb3hTdHJlYW0ucHJvdG90eXBlLnJlYWRJbnQ4ID0gZnVuY3Rpb24oKSB7CgkgIHJldHVybiB0aGlzLnJlYWRBbnlJbnQoMSwgdHJ1ZSk7Cgl9OwoKCU1QNEJveFN0cmVhbS5wcm90b3R5cGUucmVhZEludDE2ID0gZnVuY3Rpb24oKSB7CgkgIHJldHVybiB0aGlzLnJlYWRBbnlJbnQoMiwgdHJ1ZSk7Cgl9OwoKCU1QNEJveFN0cmVhbS5wcm90b3R5cGUucmVhZEludDMyID0gZnVuY3Rpb24oKSB7CgkgIHJldHVybiB0aGlzLnJlYWRBbnlJbnQoNCwgdHJ1ZSk7Cgl9OwoKCU1QNEJveFN0cmVhbS5wcm90b3R5cGUucmVhZEludDY0ID0gZnVuY3Rpb24oKSB7CgkgIHJldHVybiB0aGlzLnJlYWRBbnlJbnQoOCwgZmFsc2UpOwoJfTsKCglNUDRCb3hTdHJlYW0ucHJvdG90eXBlLnJlYWRVaW50OEFycmF5ID0gZnVuY3Rpb24obGVuZ3RoKSB7CgkgIHZhciBhcnIgPSBuZXcgVWludDhBcnJheShsZW5ndGgpOwoJICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CgkgICAgYXJyW2ldID0gdGhpcy5yZWFkVWludDgoKTsKCSAgfQoJICByZXR1cm4gYXJyOwoJfTsKCglNUDRCb3hTdHJlYW0ucHJvdG90eXBlLnJlYWRJbnQxNkFycmF5ID0gZnVuY3Rpb24obGVuZ3RoKSB7CgkgIHZhciBhcnIgPSBuZXcgSW50MTZBcnJheShsZW5ndGgpOwoJICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CgkgICAgYXJyW2ldID0gdGhpcy5yZWFkSW50MTYoKTsKCSAgfQoJICByZXR1cm4gYXJyOwoJfTsKCglNUDRCb3hTdHJlYW0ucHJvdG90eXBlLnJlYWRVaW50MTZBcnJheSA9IGZ1bmN0aW9uKGxlbmd0aCkgewoJICB2YXIgYXJyID0gbmV3IEludDE2QXJyYXkobGVuZ3RoKTsKCSAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewoJICAgIGFycltpXSA9IHRoaXMucmVhZFVpbnQxNigpOwoJICB9CgkgIHJldHVybiBhcnI7Cgl9OwoKCU1QNEJveFN0cmVhbS5wcm90b3R5cGUucmVhZFVpbnQzMkFycmF5ID0gZnVuY3Rpb24obGVuZ3RoKSB7CgkgIHZhciBhcnIgPSBuZXcgVWludDMyQXJyYXkobGVuZ3RoKTsKCSAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewoJICAgIGFycltpXSA9IHRoaXMucmVhZFVpbnQzMigpOwoJICB9CgkgIHJldHVybiBhcnI7Cgl9OwoKCU1QNEJveFN0cmVhbS5wcm90b3R5cGUucmVhZEludDMyQXJyYXkgPSBmdW5jdGlvbihsZW5ndGgpIHsKCSAgdmFyIGFyciA9IG5ldyBJbnQzMkFycmF5KGxlbmd0aCk7CgkgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKCSAgICBhcnJbaV0gPSB0aGlzLnJlYWRJbnQzMigpOwoJICB9CgkgIHJldHVybiBhcnI7Cgl9OwoKCXsKCSAgZXhwb3J0cyQxLk1QNEJveFN0cmVhbSA9IE1QNEJveFN0cmVhbTsKCX0vLyBmaWxlOnNyYy9EYXRhU3RyZWFtLmpzCgkvKioKCSAgRGF0YVN0cmVhbSByZWFkcyBzY2FsYXJzLCBhcnJheXMgYW5kIHN0cnVjdHMgb2YgZGF0YSBmcm9tIGFuIEFycmF5QnVmZmVyLgoJICBJdCdzIGxpa2UgYSBmaWxlLWxpa2UgRGF0YVZpZXcgb24gc3Rlcm9pZHMuCgoJICBAcGFyYW0ge0FycmF5QnVmZmVyfSBhcnJheUJ1ZmZlciBBcnJheUJ1ZmZlciB0byByZWFkIGZyb20uCgkgIEBwYXJhbSB7P051bWJlcn0gYnl0ZU9mZnNldCBPZmZzZXQgZnJvbSBhcnJheUJ1ZmZlciBiZWdpbm5pbmcgZm9yIHRoZSBEYXRhU3RyZWFtLgoJICBAcGFyYW0gez9Cb29sZWFufSBlbmRpYW5uZXNzIERhdGFTdHJlYW0uQklHX0VORElBTiBvciBEYXRhU3RyZWFtLkxJVFRMRV9FTkRJQU4gKHRoZSBkZWZhdWx0KS4KCSAgKi8KCXZhciBEYXRhU3RyZWFtID0gZnVuY3Rpb24oYXJyYXlCdWZmZXIsIGJ5dGVPZmZzZXQsIGVuZGlhbm5lc3MpIHsKCSAgdGhpcy5fYnl0ZU9mZnNldCA9IGJ5dGVPZmZzZXQgfHwgMDsKCSAgaWYgKGFycmF5QnVmZmVyIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpIHsKCSAgICB0aGlzLmJ1ZmZlciA9IGFycmF5QnVmZmVyOwoJICB9IGVsc2UgaWYgKHR5cGVvZiBhcnJheUJ1ZmZlciA9PSAib2JqZWN0IikgewoJICAgIHRoaXMuZGF0YVZpZXcgPSBhcnJheUJ1ZmZlcjsKCSAgICBpZiAoYnl0ZU9mZnNldCkgewoJICAgICAgdGhpcy5fYnl0ZU9mZnNldCArPSBieXRlT2Zmc2V0OwoJICAgIH0KCSAgfSBlbHNlIHsKCSAgICB0aGlzLmJ1ZmZlciA9IG5ldyBBcnJheUJ1ZmZlcihhcnJheUJ1ZmZlciB8fCAwKTsKCSAgfQoJICB0aGlzLnBvc2l0aW9uID0gMDsKCSAgdGhpcy5lbmRpYW5uZXNzID0gZW5kaWFubmVzcyA9PSBudWxsID8gRGF0YVN0cmVhbS5MSVRUTEVfRU5ESUFOIDogZW5kaWFubmVzczsKCX07CglEYXRhU3RyZWFtLnByb3RvdHlwZSA9IHt9OwoKCURhdGFTdHJlYW0ucHJvdG90eXBlLmdldFBvc2l0aW9uID0gZnVuY3Rpb24oKSB7CgkgIHJldHVybiB0aGlzLnBvc2l0aW9uOwoJfTsKCgkvKioKCSAgSW50ZXJuYWwgZnVuY3Rpb24gdG8gcmVzaXplIHRoZSBEYXRhU3RyZWFtIGJ1ZmZlciB3aGVuIHJlcXVpcmVkLgoJICBAcGFyYW0ge251bWJlcn0gZXh0cmEgTnVtYmVyIG9mIGJ5dGVzIHRvIGFkZCB0byB0aGUgYnVmZmVyIGFsbG9jYXRpb24uCgkgIEByZXR1cm4ge251bGx9CgkgICovCglEYXRhU3RyZWFtLnByb3RvdHlwZS5fcmVhbGxvYyA9IGZ1bmN0aW9uKGV4dHJhKSB7CgkgIGlmICghdGhpcy5fZHluYW1pY1NpemUpIHsKCSAgICByZXR1cm47CgkgIH0KCSAgdmFyIHJlcSA9IHRoaXMuX2J5dGVPZmZzZXQgKyB0aGlzLnBvc2l0aW9uICsgZXh0cmE7CgkgIHZhciBibGVuID0gdGhpcy5fYnVmZmVyLmJ5dGVMZW5ndGg7CgkgIGlmIChyZXEgPD0gYmxlbikgewoJICAgIGlmIChyZXEgPiB0aGlzLl9ieXRlTGVuZ3RoKSB7CgkgICAgICB0aGlzLl9ieXRlTGVuZ3RoID0gcmVxOwoJICAgIH0KCSAgICByZXR1cm47CgkgIH0KCSAgaWYgKGJsZW4gPCAxKSB7CgkgICAgYmxlbiA9IDE7CgkgIH0KCSAgd2hpbGUgKHJlcSA+IGJsZW4pIHsKCSAgICBibGVuICo9IDI7CgkgIH0KCSAgdmFyIGJ1ZiA9IG5ldyBBcnJheUJ1ZmZlcihibGVuKTsKCSAgdmFyIHNyYyA9IG5ldyBVaW50OEFycmF5KHRoaXMuX2J1ZmZlcik7CgkgIHZhciBkc3QgPSBuZXcgVWludDhBcnJheShidWYsIDAsIHNyYy5sZW5ndGgpOwoJICBkc3Quc2V0KHNyYyk7CgkgIHRoaXMuYnVmZmVyID0gYnVmOwoJICB0aGlzLl9ieXRlTGVuZ3RoID0gcmVxOwoJfTsKCgkvKioKCSAgSW50ZXJuYWwgZnVuY3Rpb24gdG8gdHJpbSB0aGUgRGF0YVN0cmVhbSBidWZmZXIgd2hlbiByZXF1aXJlZC4KCSAgVXNlZCBmb3Igc3RyaXBwaW5nIG91dCB0aGUgZXh0cmEgYnl0ZXMgZnJvbSB0aGUgYmFja2luZyBidWZmZXIgd2hlbgoJICB0aGUgdmlydHVhbCBieXRlTGVuZ3RoIGlzIHNtYWxsZXIgdGhhbiB0aGUgYnVmZmVyIGJ5dGVMZW5ndGggKGhhcHBlbnMgYWZ0ZXIKCSAgZ3Jvd2luZyB0aGUgYnVmZmVyIHdpdGggd3JpdGVzIGFuZCBub3QgZmlsbGluZyB0aGUgZXh0cmEgc3BhY2UgY29tcGxldGVseSkuCgoJICBAcmV0dXJuIHtudWxsfQoJICAqLwoJRGF0YVN0cmVhbS5wcm90b3R5cGUuX3RyaW1BbGxvYyA9IGZ1bmN0aW9uKCkgewoJICBpZiAodGhpcy5fYnl0ZUxlbmd0aCA9PSB0aGlzLl9idWZmZXIuYnl0ZUxlbmd0aCkgewoJICAgIHJldHVybjsKCSAgfQoJICB2YXIgYnVmID0gbmV3IEFycmF5QnVmZmVyKHRoaXMuX2J5dGVMZW5ndGgpOwoJICB2YXIgZHN0ID0gbmV3IFVpbnQ4QXJyYXkoYnVmKTsKCSAgdmFyIHNyYyA9IG5ldyBVaW50OEFycmF5KHRoaXMuX2J1ZmZlciwgMCwgZHN0Lmxlbmd0aCk7CgkgIGRzdC5zZXQoc3JjKTsKCSAgdGhpcy5idWZmZXIgPSBidWY7Cgl9OwoKCgkvKioKCSAgQmlnLWVuZGlhbiBjb25zdCB0byB1c2UgYXMgZGVmYXVsdCBlbmRpYW5uZXNzLgoJICBAdHlwZSB7Ym9vbGVhbn0KCSAgKi8KCURhdGFTdHJlYW0uQklHX0VORElBTiA9IGZhbHNlOwoKCS8qKgoJICBMaXR0bGUtZW5kaWFuIGNvbnN0IHRvIHVzZSBhcyBkZWZhdWx0IGVuZGlhbm5lc3MuCgkgIEB0eXBlIHtib29sZWFufQoJICAqLwoJRGF0YVN0cmVhbS5MSVRUTEVfRU5ESUFOID0gdHJ1ZTsKCgkvKioKCSAgVmlydHVhbCBieXRlIGxlbmd0aCBvZiB0aGUgRGF0YVN0cmVhbSBiYWNraW5nIGJ1ZmZlci4KCSAgVXBkYXRlZCB0byBiZSBtYXggb2Ygb3JpZ2luYWwgYnVmZmVyIHNpemUgYW5kIGxhc3Qgd3JpdHRlbiBzaXplLgoJICBJZiBkeW5hbWljU2l6ZSBpcyBmYWxzZSBpcyBzZXQgdG8gYnVmZmVyIHNpemUuCgkgIEB0eXBlIHtudW1iZXJ9CgkgICovCglEYXRhU3RyZWFtLnByb3RvdHlwZS5fYnl0ZUxlbmd0aCA9IDA7CgoJLyoqCgkgIFJldHVybnMgdGhlIGJ5dGUgbGVuZ3RoIG9mIHRoZSBEYXRhU3RyZWFtIG9iamVjdC4KCSAgQHR5cGUge251bWJlcn0KCSAgKi8KCU9iamVjdC5kZWZpbmVQcm9wZXJ0eShEYXRhU3RyZWFtLnByb3RvdHlwZSwgJ2J5dGVMZW5ndGgnLAoJICB7IGdldDogZnVuY3Rpb24oKSB7CgkgICAgcmV0dXJuIHRoaXMuX2J5dGVMZW5ndGggLSB0aGlzLl9ieXRlT2Zmc2V0OwoJICB9fSk7CgoJLyoqCgkgIFNldC9nZXQgdGhlIGJhY2tpbmcgQXJyYXlCdWZmZXIgb2YgdGhlIERhdGFTdHJlYW0gb2JqZWN0LgoJICBUaGUgc2V0dGVyIHVwZGF0ZXMgdGhlIERhdGFWaWV3IHRvIHBvaW50IHRvIHRoZSBuZXcgYnVmZmVyLgoJICBAdHlwZSB7T2JqZWN0fQoJICAqLwoJT2JqZWN0LmRlZmluZVByb3BlcnR5KERhdGFTdHJlYW0ucHJvdG90eXBlLCAnYnVmZmVyJywKCSAgeyBnZXQ6IGZ1bmN0aW9uKCkgewoJICAgICAgdGhpcy5fdHJpbUFsbG9jKCk7CgkgICAgICByZXR1cm4gdGhpcy5fYnVmZmVyOwoJICAgIH0sCgkgICAgc2V0OiBmdW5jdGlvbih2KSB7CgkgICAgICB0aGlzLl9idWZmZXIgPSB2OwoJICAgICAgdGhpcy5fZGF0YVZpZXcgPSBuZXcgRGF0YVZpZXcodGhpcy5fYnVmZmVyLCB0aGlzLl9ieXRlT2Zmc2V0KTsKCSAgICAgIHRoaXMuX2J5dGVMZW5ndGggPSB0aGlzLl9idWZmZXIuYnl0ZUxlbmd0aDsKCSAgICB9IH0pOwoKCS8qKgoJICBTZXQvZ2V0IHRoZSBieXRlT2Zmc2V0IG9mIHRoZSBEYXRhU3RyZWFtIG9iamVjdC4KCSAgVGhlIHNldHRlciB1cGRhdGVzIHRoZSBEYXRhVmlldyB0byBwb2ludCB0byB0aGUgbmV3IGJ5dGVPZmZzZXQuCgkgIEB0eXBlIHtudW1iZXJ9CgkgICovCglPYmplY3QuZGVmaW5lUHJvcGVydHkoRGF0YVN0cmVhbS5wcm90b3R5cGUsICdieXRlT2Zmc2V0JywKCSAgeyBnZXQ6IGZ1bmN0aW9uKCkgewoJICAgICAgcmV0dXJuIHRoaXMuX2J5dGVPZmZzZXQ7CgkgICAgfSwKCSAgICBzZXQ6IGZ1bmN0aW9uKHYpIHsKCSAgICAgIHRoaXMuX2J5dGVPZmZzZXQgPSB2OwoJICAgICAgdGhpcy5fZGF0YVZpZXcgPSBuZXcgRGF0YVZpZXcodGhpcy5fYnVmZmVyLCB0aGlzLl9ieXRlT2Zmc2V0KTsKCSAgICAgIHRoaXMuX2J5dGVMZW5ndGggPSB0aGlzLl9idWZmZXIuYnl0ZUxlbmd0aDsKCSAgICB9IH0pOwoKCS8qKgoJICBTZXQvZ2V0IHRoZSBiYWNraW5nIERhdGFWaWV3IG9mIHRoZSBEYXRhU3RyZWFtIG9iamVjdC4KCSAgVGhlIHNldHRlciB1cGRhdGVzIHRoZSBidWZmZXIgYW5kIGJ5dGVPZmZzZXQgdG8gcG9pbnQgdG8gdGhlIERhdGFWaWV3IHZhbHVlcy4KCSAgQHR5cGUge09iamVjdH0KCSAgKi8KCU9iamVjdC5kZWZpbmVQcm9wZXJ0eShEYXRhU3RyZWFtLnByb3RvdHlwZSwgJ2RhdGFWaWV3JywKCSAgeyBnZXQ6IGZ1bmN0aW9uKCkgewoJICAgICAgcmV0dXJuIHRoaXMuX2RhdGFWaWV3OwoJICAgIH0sCgkgICAgc2V0OiBmdW5jdGlvbih2KSB7CgkgICAgICB0aGlzLl9ieXRlT2Zmc2V0ID0gdi5ieXRlT2Zmc2V0OwoJICAgICAgdGhpcy5fYnVmZmVyID0gdi5idWZmZXI7CgkgICAgICB0aGlzLl9kYXRhVmlldyA9IG5ldyBEYXRhVmlldyh0aGlzLl9idWZmZXIsIHRoaXMuX2J5dGVPZmZzZXQpOwoJICAgICAgdGhpcy5fYnl0ZUxlbmd0aCA9IHRoaXMuX2J5dGVPZmZzZXQgKyB2LmJ5dGVMZW5ndGg7CgkgICAgfSB9KTsKCgkvKioKCSAgU2V0cyB0aGUgRGF0YVN0cmVhbSByZWFkL3dyaXRlIHBvc2l0aW9uIHRvIGdpdmVuIHBvc2l0aW9uLgoJICBDbGFtcHMgYmV0d2VlbiAwIGFuZCBEYXRhU3RyZWFtIGxlbmd0aC4KCgkgIEBwYXJhbSB7bnVtYmVyfSBwb3MgUG9zaXRpb24gdG8gc2VlayB0by4KCSAgQHJldHVybiB7bnVsbH0KCSAgKi8KCURhdGFTdHJlYW0ucHJvdG90eXBlLnNlZWsgPSBmdW5jdGlvbihwb3MpIHsKCSAgdmFyIG5wb3MgPSBNYXRoLm1heCgwLCBNYXRoLm1pbih0aGlzLmJ5dGVMZW5ndGgsIHBvcykpOwoJICB0aGlzLnBvc2l0aW9uID0gKGlzTmFOKG5wb3MpIHx8ICFpc0Zpbml0ZShucG9zKSkgPyAwIDogbnBvczsKCX07CgoJLyoqCgkgIFJldHVybnMgdHJ1ZSBpZiB0aGUgRGF0YVN0cmVhbSBzZWVrIHBvaW50ZXIgaXMgYXQgdGhlIGVuZCBvZiBidWZmZXIgYW5kCgkgIHRoZXJlJ3Mgbm8gbW9yZSBkYXRhIHRvIHJlYWQuCgoJICBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIHRoZSBzZWVrIHBvaW50ZXIgaXMgYXQgdGhlIGVuZCBvZiB0aGUgYnVmZmVyLgoJICAqLwoJRGF0YVN0cmVhbS5wcm90b3R5cGUuaXNFb2YgPSBmdW5jdGlvbigpIHsKCSAgcmV0dXJuICh0aGlzLnBvc2l0aW9uID49IHRoaXMuX2J5dGVMZW5ndGgpOwoJfTsKCgoJLyoqCgkgIE1hcHMgYSBVaW50OEFycmF5IGludG8gdGhlIERhdGFTdHJlYW0gYnVmZmVyLgoKCSAgTmljZSBmb3IgcXVpY2tseSByZWFkaW5nIGluIGRhdGEuCgoJICBAcGFyYW0ge251bWJlcn0gbGVuZ3RoIE51bWJlciBvZiBlbGVtZW50cyB0byBtYXAuCgkgIEBwYXJhbSB7P2Jvb2xlYW59IGUgRW5kaWFubmVzcyBvZiB0aGUgZGF0YSB0byByZWFkLgoJICBAcmV0dXJuIHtPYmplY3R9IFVpbnQ4QXJyYXkgdG8gdGhlIERhdGFTdHJlYW0gYmFja2luZyBidWZmZXIuCgkgICovCglEYXRhU3RyZWFtLnByb3RvdHlwZS5tYXBVaW50OEFycmF5ID0gZnVuY3Rpb24obGVuZ3RoKSB7CgkgIHRoaXMuX3JlYWxsb2MobGVuZ3RoICogMSk7CgkgIHZhciBhcnIgPSBuZXcgVWludDhBcnJheSh0aGlzLl9idWZmZXIsIHRoaXMuYnl0ZU9mZnNldCt0aGlzLnBvc2l0aW9uLCBsZW5ndGgpOwoJICB0aGlzLnBvc2l0aW9uICs9IGxlbmd0aCAqIDE7CgkgIHJldHVybiBhcnI7Cgl9OwoKCgkvKioKCSAgUmVhZHMgYW4gSW50MzJBcnJheSBvZiBkZXNpcmVkIGxlbmd0aCBhbmQgZW5kaWFubmVzcyBmcm9tIHRoZSBEYXRhU3RyZWFtLgoKCSAgQHBhcmFtIHtudW1iZXJ9IGxlbmd0aCBOdW1iZXIgb2YgZWxlbWVudHMgdG8gbWFwLgoJICBAcGFyYW0gez9ib29sZWFufSBlIEVuZGlhbm5lc3Mgb2YgdGhlIGRhdGEgdG8gcmVhZC4KCSAgQHJldHVybiB7T2JqZWN0fSBUaGUgcmVhZCBJbnQzMkFycmF5LgoJICovCglEYXRhU3RyZWFtLnByb3RvdHlwZS5yZWFkSW50MzJBcnJheSA9IGZ1bmN0aW9uKGxlbmd0aCwgZSkgewoJICBsZW5ndGggPSBsZW5ndGggPT0gbnVsbCA/ICh0aGlzLmJ5dGVMZW5ndGgtdGhpcy5wb3NpdGlvbiAvIDQpIDogbGVuZ3RoOwoJICB2YXIgYXJyID0gbmV3IEludDMyQXJyYXkobGVuZ3RoKTsKCSAgRGF0YVN0cmVhbS5tZW1jcHkoYXJyLmJ1ZmZlciwgMCwKCSAgICAgICAgICAgICAgICAgICAgdGhpcy5idWZmZXIsIHRoaXMuYnl0ZU9mZnNldCt0aGlzLnBvc2l0aW9uLAoJICAgICAgICAgICAgICAgICAgICBsZW5ndGgqYXJyLkJZVEVTX1BFUl9FTEVNRU5UKTsKCSAgRGF0YVN0cmVhbS5hcnJheVRvTmF0aXZlKGFyciwgZSA9PSBudWxsID8gdGhpcy5lbmRpYW5uZXNzIDogZSk7CgkgIHRoaXMucG9zaXRpb24gKz0gYXJyLmJ5dGVMZW5ndGg7CgkgIHJldHVybiBhcnI7Cgl9OwoKCS8qKgoJICBSZWFkcyBhbiBJbnQxNkFycmF5IG9mIGRlc2lyZWQgbGVuZ3RoIGFuZCBlbmRpYW5uZXNzIGZyb20gdGhlIERhdGFTdHJlYW0uCgoJICBAcGFyYW0ge251bWJlcn0gbGVuZ3RoIE51bWJlciBvZiBlbGVtZW50cyB0byBtYXAuCgkgIEBwYXJhbSB7P2Jvb2xlYW59IGUgRW5kaWFubmVzcyBvZiB0aGUgZGF0YSB0byByZWFkLgoJICBAcmV0dXJuIHtPYmplY3R9IFRoZSByZWFkIEludDE2QXJyYXkuCgkgKi8KCURhdGFTdHJlYW0ucHJvdG90eXBlLnJlYWRJbnQxNkFycmF5ID0gZnVuY3Rpb24obGVuZ3RoLCBlKSB7CgkgIGxlbmd0aCA9IGxlbmd0aCA9PSBudWxsID8gKHRoaXMuYnl0ZUxlbmd0aC10aGlzLnBvc2l0aW9uIC8gMikgOiBsZW5ndGg7CgkgIHZhciBhcnIgPSBuZXcgSW50MTZBcnJheShsZW5ndGgpOwoJICBEYXRhU3RyZWFtLm1lbWNweShhcnIuYnVmZmVyLCAwLAoJICAgICAgICAgICAgICAgICAgICB0aGlzLmJ1ZmZlciwgdGhpcy5ieXRlT2Zmc2V0K3RoaXMucG9zaXRpb24sCgkgICAgICAgICAgICAgICAgICAgIGxlbmd0aCphcnIuQllURVNfUEVSX0VMRU1FTlQpOwoJICBEYXRhU3RyZWFtLmFycmF5VG9OYXRpdmUoYXJyLCBlID09IG51bGwgPyB0aGlzLmVuZGlhbm5lc3MgOiBlKTsKCSAgdGhpcy5wb3NpdGlvbiArPSBhcnIuYnl0ZUxlbmd0aDsKCSAgcmV0dXJuIGFycjsKCX07CgoJLyoqCgkgIFJlYWRzIGFuIEludDhBcnJheSBvZiBkZXNpcmVkIGxlbmd0aCBmcm9tIHRoZSBEYXRhU3RyZWFtLgoKCSAgQHBhcmFtIHtudW1iZXJ9IGxlbmd0aCBOdW1iZXIgb2YgZWxlbWVudHMgdG8gbWFwLgoJICBAcGFyYW0gez9ib29sZWFufSBlIEVuZGlhbm5lc3Mgb2YgdGhlIGRhdGEgdG8gcmVhZC4KCSAgQHJldHVybiB7T2JqZWN0fSBUaGUgcmVhZCBJbnQ4QXJyYXkuCgkgKi8KCURhdGFTdHJlYW0ucHJvdG90eXBlLnJlYWRJbnQ4QXJyYXkgPSBmdW5jdGlvbihsZW5ndGgpIHsKCSAgbGVuZ3RoID0gbGVuZ3RoID09IG51bGwgPyAodGhpcy5ieXRlTGVuZ3RoLXRoaXMucG9zaXRpb24pIDogbGVuZ3RoOwoJICB2YXIgYXJyID0gbmV3IEludDhBcnJheShsZW5ndGgpOwoJICBEYXRhU3RyZWFtLm1lbWNweShhcnIuYnVmZmVyLCAwLAoJICAgICAgICAgICAgICAgICAgICB0aGlzLmJ1ZmZlciwgdGhpcy5ieXRlT2Zmc2V0K3RoaXMucG9zaXRpb24sCgkgICAgICAgICAgICAgICAgICAgIGxlbmd0aCphcnIuQllURVNfUEVSX0VMRU1FTlQpOwoJICB0aGlzLnBvc2l0aW9uICs9IGFyci5ieXRlTGVuZ3RoOwoJICByZXR1cm4gYXJyOwoJfTsKCgkvKioKCSAgUmVhZHMgYSBVaW50MzJBcnJheSBvZiBkZXNpcmVkIGxlbmd0aCBhbmQgZW5kaWFubmVzcyBmcm9tIHRoZSBEYXRhU3RyZWFtLgoKCSAgQHBhcmFtIHtudW1iZXJ9IGxlbmd0aCBOdW1iZXIgb2YgZWxlbWVudHMgdG8gbWFwLgoJICBAcGFyYW0gez9ib29sZWFufSBlIEVuZGlhbm5lc3Mgb2YgdGhlIGRhdGEgdG8gcmVhZC4KCSAgQHJldHVybiB7T2JqZWN0fSBUaGUgcmVhZCBVaW50MzJBcnJheS4KCSAqLwoJRGF0YVN0cmVhbS5wcm90b3R5cGUucmVhZFVpbnQzMkFycmF5ID0gZnVuY3Rpb24obGVuZ3RoLCBlKSB7CgkgIGxlbmd0aCA9IGxlbmd0aCA9PSBudWxsID8gKHRoaXMuYnl0ZUxlbmd0aC10aGlzLnBvc2l0aW9uIC8gNCkgOiBsZW5ndGg7CgkgIHZhciBhcnIgPSBuZXcgVWludDMyQXJyYXkobGVuZ3RoKTsKCSAgRGF0YVN0cmVhbS5tZW1jcHkoYXJyLmJ1ZmZlciwgMCwKCSAgICAgICAgICAgICAgICAgICAgdGhpcy5idWZmZXIsIHRoaXMuYnl0ZU9mZnNldCt0aGlzLnBvc2l0aW9uLAoJICAgICAgICAgICAgICAgICAgICBsZW5ndGgqYXJyLkJZVEVTX1BFUl9FTEVNRU5UKTsKCSAgRGF0YVN0cmVhbS5hcnJheVRvTmF0aXZlKGFyciwgZSA9PSBudWxsID8gdGhpcy5lbmRpYW5uZXNzIDogZSk7CgkgIHRoaXMucG9zaXRpb24gKz0gYXJyLmJ5dGVMZW5ndGg7CgkgIHJldHVybiBhcnI7Cgl9OwoKCS8qKgoJICBSZWFkcyBhIFVpbnQxNkFycmF5IG9mIGRlc2lyZWQgbGVuZ3RoIGFuZCBlbmRpYW5uZXNzIGZyb20gdGhlIERhdGFTdHJlYW0uCgoJICBAcGFyYW0ge251bWJlcn0gbGVuZ3RoIE51bWJlciBvZiBlbGVtZW50cyB0byBtYXAuCgkgIEBwYXJhbSB7P2Jvb2xlYW59IGUgRW5kaWFubmVzcyBvZiB0aGUgZGF0YSB0byByZWFkLgoJICBAcmV0dXJuIHtPYmplY3R9IFRoZSByZWFkIFVpbnQxNkFycmF5LgoJICovCglEYXRhU3RyZWFtLnByb3RvdHlwZS5yZWFkVWludDE2QXJyYXkgPSBmdW5jdGlvbihsZW5ndGgsIGUpIHsKCSAgbGVuZ3RoID0gbGVuZ3RoID09IG51bGwgPyAodGhpcy5ieXRlTGVuZ3RoLXRoaXMucG9zaXRpb24gLyAyKSA6IGxlbmd0aDsKCSAgdmFyIGFyciA9IG5ldyBVaW50MTZBcnJheShsZW5ndGgpOwoJICBEYXRhU3RyZWFtLm1lbWNweShhcnIuYnVmZmVyLCAwLAoJICAgICAgICAgICAgICAgICAgICB0aGlzLmJ1ZmZlciwgdGhpcy5ieXRlT2Zmc2V0K3RoaXMucG9zaXRpb24sCgkgICAgICAgICAgICAgICAgICAgIGxlbmd0aCphcnIuQllURVNfUEVSX0VMRU1FTlQpOwoJICBEYXRhU3RyZWFtLmFycmF5VG9OYXRpdmUoYXJyLCBlID09IG51bGwgPyB0aGlzLmVuZGlhbm5lc3MgOiBlKTsKCSAgdGhpcy5wb3NpdGlvbiArPSBhcnIuYnl0ZUxlbmd0aDsKCSAgcmV0dXJuIGFycjsKCX07CgoJLyoqCgkgIFJlYWRzIGEgVWludDhBcnJheSBvZiBkZXNpcmVkIGxlbmd0aCBmcm9tIHRoZSBEYXRhU3RyZWFtLgoKCSAgQHBhcmFtIHtudW1iZXJ9IGxlbmd0aCBOdW1iZXIgb2YgZWxlbWVudHMgdG8gbWFwLgoJICBAcGFyYW0gez9ib29sZWFufSBlIEVuZGlhbm5lc3Mgb2YgdGhlIGRhdGEgdG8gcmVhZC4KCSAgQHJldHVybiB7T2JqZWN0fSBUaGUgcmVhZCBVaW50OEFycmF5LgoJICovCglEYXRhU3RyZWFtLnByb3RvdHlwZS5yZWFkVWludDhBcnJheSA9IGZ1bmN0aW9uKGxlbmd0aCkgewoJICBsZW5ndGggPSBsZW5ndGggPT0gbnVsbCA/ICh0aGlzLmJ5dGVMZW5ndGgtdGhpcy5wb3NpdGlvbikgOiBsZW5ndGg7CgkgIHZhciBhcnIgPSBuZXcgVWludDhBcnJheShsZW5ndGgpOwoJICBEYXRhU3RyZWFtLm1lbWNweShhcnIuYnVmZmVyLCAwLAoJICAgICAgICAgICAgICAgICAgICB0aGlzLmJ1ZmZlciwgdGhpcy5ieXRlT2Zmc2V0K3RoaXMucG9zaXRpb24sCgkgICAgICAgICAgICAgICAgICAgIGxlbmd0aCphcnIuQllURVNfUEVSX0VMRU1FTlQpOwoJICB0aGlzLnBvc2l0aW9uICs9IGFyci5ieXRlTGVuZ3RoOwoJICByZXR1cm4gYXJyOwoJfTsKCgkvKioKCSAgUmVhZHMgYSBGbG9hdDY0QXJyYXkgb2YgZGVzaXJlZCBsZW5ndGggYW5kIGVuZGlhbm5lc3MgZnJvbSB0aGUgRGF0YVN0cmVhbS4KCgkgIEBwYXJhbSB7bnVtYmVyfSBsZW5ndGggTnVtYmVyIG9mIGVsZW1lbnRzIHRvIG1hcC4KCSAgQHBhcmFtIHs/Ym9vbGVhbn0gZSBFbmRpYW5uZXNzIG9mIHRoZSBkYXRhIHRvIHJlYWQuCgkgIEByZXR1cm4ge09iamVjdH0gVGhlIHJlYWQgRmxvYXQ2NEFycmF5LgoJICovCglEYXRhU3RyZWFtLnByb3RvdHlwZS5yZWFkRmxvYXQ2NEFycmF5ID0gZnVuY3Rpb24obGVuZ3RoLCBlKSB7CgkgIGxlbmd0aCA9IGxlbmd0aCA9PSBudWxsID8gKHRoaXMuYnl0ZUxlbmd0aC10aGlzLnBvc2l0aW9uIC8gOCkgOiBsZW5ndGg7CgkgIHZhciBhcnIgPSBuZXcgRmxvYXQ2NEFycmF5KGxlbmd0aCk7CgkgIERhdGFTdHJlYW0ubWVtY3B5KGFyci5idWZmZXIsIDAsCgkgICAgICAgICAgICAgICAgICAgIHRoaXMuYnVmZmVyLCB0aGlzLmJ5dGVPZmZzZXQrdGhpcy5wb3NpdGlvbiwKCSAgICAgICAgICAgICAgICAgICAgbGVuZ3RoKmFyci5CWVRFU19QRVJfRUxFTUVOVCk7CgkgIERhdGFTdHJlYW0uYXJyYXlUb05hdGl2ZShhcnIsIGUgPT0gbnVsbCA/IHRoaXMuZW5kaWFubmVzcyA6IGUpOwoJICB0aGlzLnBvc2l0aW9uICs9IGFyci5ieXRlTGVuZ3RoOwoJICByZXR1cm4gYXJyOwoJfTsKCgkvKioKCSAgUmVhZHMgYSBGbG9hdDMyQXJyYXkgb2YgZGVzaXJlZCBsZW5ndGggYW5kIGVuZGlhbm5lc3MgZnJvbSB0aGUgRGF0YVN0cmVhbS4KCgkgIEBwYXJhbSB7bnVtYmVyfSBsZW5ndGggTnVtYmVyIG9mIGVsZW1lbnRzIHRvIG1hcC4KCSAgQHBhcmFtIHs/Ym9vbGVhbn0gZSBFbmRpYW5uZXNzIG9mIHRoZSBkYXRhIHRvIHJlYWQuCgkgIEByZXR1cm4ge09iamVjdH0gVGhlIHJlYWQgRmxvYXQzMkFycmF5LgoJICovCglEYXRhU3RyZWFtLnByb3RvdHlwZS5yZWFkRmxvYXQzMkFycmF5ID0gZnVuY3Rpb24obGVuZ3RoLCBlKSB7CgkgIGxlbmd0aCA9IGxlbmd0aCA9PSBudWxsID8gKHRoaXMuYnl0ZUxlbmd0aC10aGlzLnBvc2l0aW9uIC8gNCkgOiBsZW5ndGg7CgkgIHZhciBhcnIgPSBuZXcgRmxvYXQzMkFycmF5KGxlbmd0aCk7CgkgIERhdGFTdHJlYW0ubWVtY3B5KGFyci5idWZmZXIsIDAsCgkgICAgICAgICAgICAgICAgICAgIHRoaXMuYnVmZmVyLCB0aGlzLmJ5dGVPZmZzZXQrdGhpcy5wb3NpdGlvbiwKCSAgICAgICAgICAgICAgICAgICAgbGVuZ3RoKmFyci5CWVRFU19QRVJfRUxFTUVOVCk7CgkgIERhdGFTdHJlYW0uYXJyYXlUb05hdGl2ZShhcnIsIGUgPT0gbnVsbCA/IHRoaXMuZW5kaWFubmVzcyA6IGUpOwoJICB0aGlzLnBvc2l0aW9uICs9IGFyci5ieXRlTGVuZ3RoOwoJICByZXR1cm4gYXJyOwoJfTsKCgoJLyoqCgkgIFJlYWRzIGEgMzItYml0IGludCBmcm9tIHRoZSBEYXRhU3RyZWFtIHdpdGggdGhlIGRlc2lyZWQgZW5kaWFubmVzcy4KCgkgIEBwYXJhbSB7P2Jvb2xlYW59IGUgRW5kaWFubmVzcyBvZiB0aGUgbnVtYmVyLgoJICBAcmV0dXJuIHtudW1iZXJ9IFRoZSByZWFkIG51bWJlci4KCSAqLwoJRGF0YVN0cmVhbS5wcm90b3R5cGUucmVhZEludDMyID0gZnVuY3Rpb24oZSkgewoJICB2YXIgdiA9IHRoaXMuX2RhdGFWaWV3LmdldEludDMyKHRoaXMucG9zaXRpb24sIGUgPT0gbnVsbCA/IHRoaXMuZW5kaWFubmVzcyA6IGUpOwoJICB0aGlzLnBvc2l0aW9uICs9IDQ7CgkgIHJldHVybiB2OwoJfTsKCgkvKioKCSAgUmVhZHMgYSAxNi1iaXQgaW50IGZyb20gdGhlIERhdGFTdHJlYW0gd2l0aCB0aGUgZGVzaXJlZCBlbmRpYW5uZXNzLgoKCSAgQHBhcmFtIHs/Ym9vbGVhbn0gZSBFbmRpYW5uZXNzIG9mIHRoZSBudW1iZXIuCgkgIEByZXR1cm4ge251bWJlcn0gVGhlIHJlYWQgbnVtYmVyLgoJICovCglEYXRhU3RyZWFtLnByb3RvdHlwZS5yZWFkSW50MTYgPSBmdW5jdGlvbihlKSB7CgkgIHZhciB2ID0gdGhpcy5fZGF0YVZpZXcuZ2V0SW50MTYodGhpcy5wb3NpdGlvbiwgZSA9PSBudWxsID8gdGhpcy5lbmRpYW5uZXNzIDogZSk7CgkgIHRoaXMucG9zaXRpb24gKz0gMjsKCSAgcmV0dXJuIHY7Cgl9OwoKCS8qKgoJICBSZWFkcyBhbiA4LWJpdCBpbnQgZnJvbSB0aGUgRGF0YVN0cmVhbS4KCgkgIEByZXR1cm4ge251bWJlcn0gVGhlIHJlYWQgbnVtYmVyLgoJICovCglEYXRhU3RyZWFtLnByb3RvdHlwZS5yZWFkSW50OCA9IGZ1bmN0aW9uKCkgewoJICB2YXIgdiA9IHRoaXMuX2RhdGFWaWV3LmdldEludDgodGhpcy5wb3NpdGlvbik7CgkgIHRoaXMucG9zaXRpb24gKz0gMTsKCSAgcmV0dXJuIHY7Cgl9OwoKCS8qKgoJICBSZWFkcyBhIDMyLWJpdCB1bnNpZ25lZCBpbnQgZnJvbSB0aGUgRGF0YVN0cmVhbSB3aXRoIHRoZSBkZXNpcmVkIGVuZGlhbm5lc3MuCgoJICBAcGFyYW0gez9ib29sZWFufSBlIEVuZGlhbm5lc3Mgb2YgdGhlIG51bWJlci4KCSAgQHJldHVybiB7bnVtYmVyfSBUaGUgcmVhZCBudW1iZXIuCgkgKi8KCURhdGFTdHJlYW0ucHJvdG90eXBlLnJlYWRVaW50MzIgPSBmdW5jdGlvbihlKSB7CgkgIHZhciB2ID0gdGhpcy5fZGF0YVZpZXcuZ2V0VWludDMyKHRoaXMucG9zaXRpb24sIGUgPT0gbnVsbCA/IHRoaXMuZW5kaWFubmVzcyA6IGUpOwoJICB0aGlzLnBvc2l0aW9uICs9IDQ7CgkgIHJldHVybiB2OwoJfTsKCgkvKioKCSAgUmVhZHMgYSAxNi1iaXQgdW5zaWduZWQgaW50IGZyb20gdGhlIERhdGFTdHJlYW0gd2l0aCB0aGUgZGVzaXJlZCBlbmRpYW5uZXNzLgoKCSAgQHBhcmFtIHs/Ym9vbGVhbn0gZSBFbmRpYW5uZXNzIG9mIHRoZSBudW1iZXIuCgkgIEByZXR1cm4ge251bWJlcn0gVGhlIHJlYWQgbnVtYmVyLgoJICovCglEYXRhU3RyZWFtLnByb3RvdHlwZS5yZWFkVWludDE2ID0gZnVuY3Rpb24oZSkgewoJICB2YXIgdiA9IHRoaXMuX2RhdGFWaWV3LmdldFVpbnQxNih0aGlzLnBvc2l0aW9uLCBlID09IG51bGwgPyB0aGlzLmVuZGlhbm5lc3MgOiBlKTsKCSAgdGhpcy5wb3NpdGlvbiArPSAyOwoJICByZXR1cm4gdjsKCX07CgoJLyoqCgkgIFJlYWRzIGFuIDgtYml0IHVuc2lnbmVkIGludCBmcm9tIHRoZSBEYXRhU3RyZWFtLgoKCSAgQHJldHVybiB7bnVtYmVyfSBUaGUgcmVhZCBudW1iZXIuCgkgKi8KCURhdGFTdHJlYW0ucHJvdG90eXBlLnJlYWRVaW50OCA9IGZ1bmN0aW9uKCkgewoJICB2YXIgdiA9IHRoaXMuX2RhdGFWaWV3LmdldFVpbnQ4KHRoaXMucG9zaXRpb24pOwoJICB0aGlzLnBvc2l0aW9uICs9IDE7CgkgIHJldHVybiB2OwoJfTsKCgkvKioKCSAgUmVhZHMgYSAzMi1iaXQgZmxvYXQgZnJvbSB0aGUgRGF0YVN0cmVhbSB3aXRoIHRoZSBkZXNpcmVkIGVuZGlhbm5lc3MuCgoJICBAcGFyYW0gez9ib29sZWFufSBlIEVuZGlhbm5lc3Mgb2YgdGhlIG51bWJlci4KCSAgQHJldHVybiB7bnVtYmVyfSBUaGUgcmVhZCBudW1iZXIuCgkgKi8KCURhdGFTdHJlYW0ucHJvdG90eXBlLnJlYWRGbG9hdDMyID0gZnVuY3Rpb24oZSkgewoJICB2YXIgdiA9IHRoaXMuX2RhdGFWaWV3LmdldEZsb2F0MzIodGhpcy5wb3NpdGlvbiwgZSA9PSBudWxsID8gdGhpcy5lbmRpYW5uZXNzIDogZSk7CgkgIHRoaXMucG9zaXRpb24gKz0gNDsKCSAgcmV0dXJuIHY7Cgl9OwoKCS8qKgoJICBSZWFkcyBhIDY0LWJpdCBmbG9hdCBmcm9tIHRoZSBEYXRhU3RyZWFtIHdpdGggdGhlIGRlc2lyZWQgZW5kaWFubmVzcy4KCgkgIEBwYXJhbSB7P2Jvb2xlYW59IGUgRW5kaWFubmVzcyBvZiB0aGUgbnVtYmVyLgoJICBAcmV0dXJuIHtudW1iZXJ9IFRoZSByZWFkIG51bWJlci4KCSAqLwoJRGF0YVN0cmVhbS5wcm90b3R5cGUucmVhZEZsb2F0NjQgPSBmdW5jdGlvbihlKSB7CgkgIHZhciB2ID0gdGhpcy5fZGF0YVZpZXcuZ2V0RmxvYXQ2NCh0aGlzLnBvc2l0aW9uLCBlID09IG51bGwgPyB0aGlzLmVuZGlhbm5lc3MgOiBlKTsKCSAgdGhpcy5wb3NpdGlvbiArPSA4OwoJICByZXR1cm4gdjsKCX07CgoJLyoqCgkgIE5hdGl2ZSBlbmRpYW5uZXNzLiBFaXRoZXIgRGF0YVN0cmVhbS5CSUdfRU5ESUFOIG9yIERhdGFTdHJlYW0uTElUVExFX0VORElBTgoJICBkZXBlbmRpbmcgb24gdGhlIHBsYXRmb3JtIGVuZGlhbm5lc3MuCgoJICBAdHlwZSB7Ym9vbGVhbn0KCSAqLwoJRGF0YVN0cmVhbS5lbmRpYW5uZXNzID0gbmV3IEludDhBcnJheShuZXcgSW50MTZBcnJheShbMV0pLmJ1ZmZlcilbMF0gPiAwOwoKCS8qKgoJICBDb3BpZXMgYnl0ZUxlbmd0aCBieXRlcyBmcm9tIHRoZSBzcmMgYnVmZmVyIGF0IHNyY09mZnNldCB0byB0aGUKCSAgZHN0IGJ1ZmZlciBhdCBkc3RPZmZzZXQuCgoJICBAcGFyYW0ge09iamVjdH0gZHN0IERlc3RpbmF0aW9uIEFycmF5QnVmZmVyIHRvIHdyaXRlIHRvLgoJICBAcGFyYW0ge251bWJlcn0gZHN0T2Zmc2V0IE9mZnNldCB0byB0aGUgZGVzdGluYXRpb24gQXJyYXlCdWZmZXIuCgkgIEBwYXJhbSB7T2JqZWN0fSBzcmMgU291cmNlIEFycmF5QnVmZmVyIHRvIHJlYWQgZnJvbS4KCSAgQHBhcmFtIHtudW1iZXJ9IHNyY09mZnNldCBPZmZzZXQgdG8gdGhlIHNvdXJjZSBBcnJheUJ1ZmZlci4KCSAgQHBhcmFtIHtudW1iZXJ9IGJ5dGVMZW5ndGggTnVtYmVyIG9mIGJ5dGVzIHRvIGNvcHkuCgkgKi8KCURhdGFTdHJlYW0ubWVtY3B5ID0gZnVuY3Rpb24oZHN0LCBkc3RPZmZzZXQsIHNyYywgc3JjT2Zmc2V0LCBieXRlTGVuZ3RoKSB7CgkgIHZhciBkc3RVOCA9IG5ldyBVaW50OEFycmF5KGRzdCwgZHN0T2Zmc2V0LCBieXRlTGVuZ3RoKTsKCSAgdmFyIHNyY1U4ID0gbmV3IFVpbnQ4QXJyYXkoc3JjLCBzcmNPZmZzZXQsIGJ5dGVMZW5ndGgpOwoJICBkc3RVOC5zZXQoc3JjVTgpOwoJfTsKCgkvKioKCSAgQ29udmVydHMgYXJyYXkgdG8gbmF0aXZlIGVuZGlhbm5lc3MgaW4tcGxhY2UuCgoJICBAcGFyYW0ge09iamVjdH0gYXJyYXkgVHlwZWQgYXJyYXkgdG8gY29udmVydC4KCSAgQHBhcmFtIHtib29sZWFufSBhcnJheUlzTGl0dGxlRW5kaWFuIFRydWUgaWYgdGhlIGRhdGEgaW4gdGhlIGFycmF5IGlzCgkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXR0bGUtZW5kaWFuLiBTZXQgZmFsc2UgZm9yIGJpZy1lbmRpYW4uCgkgIEByZXR1cm4ge09iamVjdH0gVGhlIGNvbnZlcnRlZCB0eXBlZCBhcnJheS4KCSAqLwoJRGF0YVN0cmVhbS5hcnJheVRvTmF0aXZlID0gZnVuY3Rpb24oYXJyYXksIGFycmF5SXNMaXR0bGVFbmRpYW4pIHsKCSAgaWYgKGFycmF5SXNMaXR0bGVFbmRpYW4gPT0gdGhpcy5lbmRpYW5uZXNzKSB7CgkgICAgcmV0dXJuIGFycmF5OwoJICB9IGVsc2UgewoJICAgIHJldHVybiB0aGlzLmZsaXBBcnJheUVuZGlhbm5lc3MoYXJyYXkpOwoJICB9Cgl9OwoKCS8qKgoJICBDb252ZXJ0cyBuYXRpdmUgZW5kaWFubmVzcyBhcnJheSB0byBkZXNpcmVkIGVuZGlhbm5lc3MgaW4tcGxhY2UuCgoJICBAcGFyYW0ge09iamVjdH0gYXJyYXkgVHlwZWQgYXJyYXkgdG8gY29udmVydC4KCSAgQHBhcmFtIHtib29sZWFufSBsaXR0bGVFbmRpYW4gVHJ1ZSBpZiB0aGUgY29udmVydGVkIGFycmF5IHNob3VsZCBiZQoJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXR0bGUtZW5kaWFuLiBTZXQgZmFsc2UgZm9yIGJpZy1lbmRpYW4uCgkgIEByZXR1cm4ge09iamVjdH0gVGhlIGNvbnZlcnRlZCB0eXBlZCBhcnJheS4KCSAqLwoJRGF0YVN0cmVhbS5uYXRpdmVUb0VuZGlhbiA9IGZ1bmN0aW9uKGFycmF5LCBsaXR0bGVFbmRpYW4pIHsKCSAgaWYgKHRoaXMuZW5kaWFubmVzcyA9PSBsaXR0bGVFbmRpYW4pIHsKCSAgICByZXR1cm4gYXJyYXk7CgkgIH0gZWxzZSB7CgkgICAgcmV0dXJuIHRoaXMuZmxpcEFycmF5RW5kaWFubmVzcyhhcnJheSk7CgkgIH0KCX07CgoJLyoqCgkgIEZsaXBzIHR5cGVkIGFycmF5IGVuZGlhbm5lc3MgaW4tcGxhY2UuCgoJICBAcGFyYW0ge09iamVjdH0gYXJyYXkgVHlwZWQgYXJyYXkgdG8gZmxpcC4KCSAgQHJldHVybiB7T2JqZWN0fSBUaGUgY29udmVydGVkIHR5cGVkIGFycmF5LgoJICovCglEYXRhU3RyZWFtLmZsaXBBcnJheUVuZGlhbm5lc3MgPSBmdW5jdGlvbihhcnJheSkgewoJICB2YXIgdTggPSBuZXcgVWludDhBcnJheShhcnJheS5idWZmZXIsIGFycmF5LmJ5dGVPZmZzZXQsIGFycmF5LmJ5dGVMZW5ndGgpOwoJICBmb3IgKHZhciBpPTA7IGk8YXJyYXkuYnl0ZUxlbmd0aDsgaSs9YXJyYXkuQllURVNfUEVSX0VMRU1FTlQpIHsKCSAgICBmb3IgKHZhciBqPWkrYXJyYXkuQllURVNfUEVSX0VMRU1FTlQtMSwgaz1pOyBqPms7IGotLSwgaysrKSB7CgkgICAgICB2YXIgdG1wID0gdThba107CgkgICAgICB1OFtrXSA9IHU4W2pdOwoJICAgICAgdThbal0gPSB0bXA7CgkgICAgfQoJICB9CgkgIHJldHVybiBhcnJheTsKCX07CgoJLyoqCgkgIFNlZWsgcG9zaXRpb24gd2hlcmUgRGF0YVN0cmVhbSNyZWFkU3RydWN0IHJhbiBpbnRvIGEgcHJvYmxlbS4KCSAgVXNlZnVsIGZvciBkZWJ1Z2dpbmcgc3RydWN0IHBhcnNpbmcuCgoJICBAdHlwZSB7bnVtYmVyfQoJICovCglEYXRhU3RyZWFtLnByb3RvdHlwZS5mYWlsdXJlUG9zaXRpb24gPSAwOwoKCVN0cmluZy5mcm9tQ2hhckNvZGVVaW50OCA9IGZ1bmN0aW9uKHVpbnQ4YXJyKSB7CgkgICAgdmFyIGFyciA9IFtdOwoJICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdWludDhhcnIubGVuZ3RoOyBpKyspIHsKCSAgICAgIGFycltpXSA9IHVpbnQ4YXJyW2ldOwoJICAgIH0KCSAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLCBhcnIpOwoJfTsKCS8qKgoJICBSZWFkIGEgc3RyaW5nIG9mIGRlc2lyZWQgbGVuZ3RoIGFuZCBlbmNvZGluZyBmcm9tIHRoZSBEYXRhU3RyZWFtLgoKCSAgQHBhcmFtIHtudW1iZXJ9IGxlbmd0aCBUaGUgbGVuZ3RoIG9mIHRoZSBzdHJpbmcgdG8gcmVhZCBpbiBieXRlcy4KCSAgQHBhcmFtIHs/c3RyaW5nfSBlbmNvZGluZyBUaGUgZW5jb2Rpbmcgb2YgdGhlIHN0cmluZyBkYXRhIGluIHRoZSBEYXRhU3RyZWFtLgoJICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlZmF1bHRzIHRvIEFTQ0lJLgoJICBAcmV0dXJuIHtzdHJpbmd9IFRoZSByZWFkIHN0cmluZy4KCSAqLwoJRGF0YVN0cmVhbS5wcm90b3R5cGUucmVhZFN0cmluZyA9IGZ1bmN0aW9uKGxlbmd0aCwgZW5jb2RpbmcpIHsKCSAgaWYgKGVuY29kaW5nID09IG51bGwgfHwgZW5jb2RpbmcgPT0gIkFTQ0lJIikgewoJICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlVWludDguYXBwbHkobnVsbCwgW3RoaXMubWFwVWludDhBcnJheShsZW5ndGggPT0gbnVsbCA/IHRoaXMuYnl0ZUxlbmd0aC10aGlzLnBvc2l0aW9uIDogbGVuZ3RoKV0pOwoJICB9IGVsc2UgewoJICAgIHJldHVybiAobmV3IFRleHREZWNvZGVyKGVuY29kaW5nKSkuZGVjb2RlKHRoaXMubWFwVWludDhBcnJheShsZW5ndGgpKTsKCSAgfQoJfTsKCgkvKioKCSAgUmVhZCBudWxsLXRlcm1pbmF0ZWQgc3RyaW5nIG9mIGRlc2lyZWQgbGVuZ3RoIGZyb20gdGhlIERhdGFTdHJlYW0uIFRydW5jYXRlcwoJICB0aGUgcmV0dXJuZWQgc3RyaW5nIHNvIHRoYXQgdGhlIG51bGwgYnl0ZSBpcyBub3QgYSBwYXJ0IG9mIGl0LgoKCSAgQHBhcmFtIHs/bnVtYmVyfSBsZW5ndGggVGhlIGxlbmd0aCBvZiB0aGUgc3RyaW5nIHRvIHJlYWQuCgkgIEByZXR1cm4ge3N0cmluZ30gVGhlIHJlYWQgc3RyaW5nLgoJICovCglEYXRhU3RyZWFtLnByb3RvdHlwZS5yZWFkQ1N0cmluZyA9IGZ1bmN0aW9uKGxlbmd0aCkgewoJICB2YXIgYmxlbiA9IHRoaXMuYnl0ZUxlbmd0aC10aGlzLnBvc2l0aW9uOwoJICB2YXIgdTggPSBuZXcgVWludDhBcnJheSh0aGlzLl9idWZmZXIsIHRoaXMuX2J5dGVPZmZzZXQgKyB0aGlzLnBvc2l0aW9uKTsKCSAgdmFyIGxlbiA9IGJsZW47CgkgIGlmIChsZW5ndGggIT0gbnVsbCkgewoJICAgIGxlbiA9IE1hdGgubWluKGxlbmd0aCwgYmxlbik7CgkgIH0KCSAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW4gJiYgdThbaV0gIT09IDA7IGkrKyk7IC8vIGZpbmQgZmlyc3QgemVybyBieXRlCgkgIHZhciBzID0gU3RyaW5nLmZyb21DaGFyQ29kZVVpbnQ4LmFwcGx5KG51bGwsIFt0aGlzLm1hcFVpbnQ4QXJyYXkoaSldKTsKCSAgaWYgKGxlbmd0aCAhPSBudWxsKSB7CgkgICAgdGhpcy5wb3NpdGlvbiArPSBsZW4taTsKCSAgfSBlbHNlIGlmIChpICE9IGJsZW4pIHsKCSAgICB0aGlzLnBvc2l0aW9uICs9IDE7IC8vIHRyYWlsaW5nIHplcm8gaWYgbm90IGF0IGVuZCBvZiBidWZmZXIKCSAgfQoJICByZXR1cm4gczsKCX07CgoJLyogCgkgICBUT0RPOiBmaXggZW5kaWFubmVzcyBmb3IgMjQvNjQtYml0IGZpZWxkcwoJICAgVE9ETzogY2hlY2sgcmFuZ2Uvc3VwcG9ydCBmb3IgNjQtYml0cyBudW1iZXJzIGluIEphdmFTY3JpcHQKCSovCgl2YXIgTUFYX1NJWkUgPSBNYXRoLnBvdygyLCAzMik7CgoJRGF0YVN0cmVhbS5wcm90b3R5cGUucmVhZEludDY0ID0gZnVuY3Rpb24gKCkgewoJICByZXR1cm4gKHRoaXMucmVhZEludDMyKCkqTUFYX1NJWkUpK3RoaXMucmVhZFVpbnQzMigpOwoJfTsKCURhdGFTdHJlYW0ucHJvdG90eXBlLnJlYWRVaW50NjQgPSBmdW5jdGlvbiAoKSB7CgkJcmV0dXJuICh0aGlzLnJlYWRVaW50MzIoKSpNQVhfU0laRSkrdGhpcy5yZWFkVWludDMyKCk7Cgl9OwoKCURhdGFTdHJlYW0ucHJvdG90eXBlLnJlYWRJbnQ2NCA9IGZ1bmN0aW9uICgpIHsKCSAgcmV0dXJuICh0aGlzLnJlYWRVaW50MzIoKSpNQVhfU0laRSkrdGhpcy5yZWFkVWludDMyKCk7Cgl9OwoKCURhdGFTdHJlYW0ucHJvdG90eXBlLnJlYWRVaW50MjQgPSBmdW5jdGlvbiAoKSB7CgkJcmV0dXJuICh0aGlzLnJlYWRVaW50OCgpPDwxNikrKHRoaXMucmVhZFVpbnQ4KCk8PDgpK3RoaXMucmVhZFVpbnQ4KCk7Cgl9OwoKCXsKCSAgZXhwb3J0cyQxLkRhdGFTdHJlYW0gPSBEYXRhU3RyZWFtOyAgCgl9CgkvLyBmaWxlOnNyYy9EYXRhU3RyZWFtLXdyaXRlLmpzCgkvKioKCSAgU2F2ZXMgdGhlIERhdGFTdHJlYW0gY29udGVudHMgdG8gdGhlIGdpdmVuIGZpbGVuYW1lLgoJICBVc2VzIENocm9tZSdzIGFuY2hvciBkb3dubG9hZCBwcm9wZXJ0eSB0byBpbml0aWF0ZSBkb3dubG9hZC4KCSAKCSAgQHBhcmFtIHtzdHJpbmd9IGZpbGVuYW1lIEZpbGVuYW1lIHRvIHNhdmUgYXMuCgkgIEByZXR1cm4ge251bGx9CgkgICovCglEYXRhU3RyZWFtLnByb3RvdHlwZS5zYXZlID0gZnVuY3Rpb24oZmlsZW5hbWUpIHsKCSAgdmFyIGJsb2IgPSBuZXcgQmxvYihbdGhpcy5idWZmZXJdKTsKCSAgaWYgKHdpbmRvdy5VUkwgJiYgVVJMLmNyZWF0ZU9iamVjdFVSTCkgewoJICAgICAgdmFyIHVybCA9IHdpbmRvdy5VUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpOwoJICAgICAgdmFyIGEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7CgkgICAgICAvLyBSZXF1aXJlZCBpbiBGaXJlZm94OgoJICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChhKTsKCSAgICAgIGEuc2V0QXR0cmlidXRlKCdocmVmJywgdXJsKTsKCSAgICAgIGEuc2V0QXR0cmlidXRlKCdkb3dubG9hZCcsIGZpbGVuYW1lKTsKCSAgICAgIC8vIFJlcXVpcmVkIGluIEZpcmVmb3g6CgkgICAgICBhLnNldEF0dHJpYnV0ZSgndGFyZ2V0JywgJ19zZWxmJyk7CgkgICAgICBhLmNsaWNrKCk7CgkgICAgICB3aW5kb3cuVVJMLnJldm9rZU9iamVjdFVSTCh1cmwpOwoJICB9IGVsc2UgewoJICAgICAgdGhyb3coIkRhdGFTdHJlYW0uc2F2ZTogQ2FuJ3QgY3JlYXRlIG9iamVjdCBVUkwuIik7CgkgIH0KCX07CgoJLyoqCgkgIFdoZXRoZXIgdG8gZXh0ZW5kIERhdGFTdHJlYW0gYnVmZmVyIHdoZW4gdHJ5aW5nIHRvIHdyaXRlIGJleW9uZCBpdHMgc2l6ZS4KCSAgSWYgc2V0LCB0aGUgYnVmZmVyIGlzIHJlYWxsb2NhdGVkIHRvIHR3aWNlIGl0cyBjdXJyZW50IHNpemUgdW50aWwgdGhlCgkgIHJlcXVlc3RlZCB3cml0ZSBmaXRzIHRoZSBidWZmZXIuCgkgIEB0eXBlIHtib29sZWFufQoJICAqLwoJRGF0YVN0cmVhbS5wcm90b3R5cGUuX2R5bmFtaWNTaXplID0gdHJ1ZTsKCU9iamVjdC5kZWZpbmVQcm9wZXJ0eShEYXRhU3RyZWFtLnByb3RvdHlwZSwgJ2R5bmFtaWNTaXplJywKCSAgeyBnZXQ6IGZ1bmN0aW9uKCkgewoJICAgICAgcmV0dXJuIHRoaXMuX2R5bmFtaWNTaXplOwoJICAgIH0sCgkgICAgc2V0OiBmdW5jdGlvbih2KSB7CgkgICAgICBpZiAoIXYpIHsKCSAgICAgICAgdGhpcy5fdHJpbUFsbG9jKCk7CgkgICAgICB9CgkgICAgICB0aGlzLl9keW5hbWljU2l6ZSA9IHY7CgkgICAgfSB9KTsKCgkvKioKCSAgSW50ZXJuYWwgZnVuY3Rpb24gdG8gdHJpbSB0aGUgRGF0YVN0cmVhbSBidWZmZXIgd2hlbiByZXF1aXJlZC4KCSAgVXNlZCBmb3Igc3RyaXBwaW5nIG91dCB0aGUgZmlyc3QgYnl0ZXMgd2hlbiBub3QgbmVlZGVkIGFueW1vcmUuCgoJICBAcmV0dXJuIHtudWxsfQoJICAqLwoJRGF0YVN0cmVhbS5wcm90b3R5cGUuc2hpZnQgPSBmdW5jdGlvbihvZmZzZXQpIHsKCSAgdmFyIGJ1ZiA9IG5ldyBBcnJheUJ1ZmZlcih0aGlzLl9ieXRlTGVuZ3RoLW9mZnNldCk7CgkgIHZhciBkc3QgPSBuZXcgVWludDhBcnJheShidWYpOwoJICB2YXIgc3JjID0gbmV3IFVpbnQ4QXJyYXkodGhpcy5fYnVmZmVyLCBvZmZzZXQsIGRzdC5sZW5ndGgpOwoJICBkc3Quc2V0KHNyYyk7CgkgIHRoaXMuYnVmZmVyID0gYnVmOwoJICB0aGlzLnBvc2l0aW9uIC09IG9mZnNldDsKCX07CgoJLyoqCgkgIFdyaXRlcyBhbiBJbnQzMkFycmF5IG9mIHNwZWNpZmllZCBlbmRpYW5uZXNzIHRvIHRoZSBEYXRhU3RyZWFtLgoKCSAgQHBhcmFtIHtPYmplY3R9IGFyciBUaGUgYXJyYXkgdG8gd3JpdGUuCgkgIEBwYXJhbSB7P2Jvb2xlYW59IGUgRW5kaWFubmVzcyBvZiB0aGUgZGF0YSB0byB3cml0ZS4KCSAqLwoJRGF0YVN0cmVhbS5wcm90b3R5cGUud3JpdGVJbnQzMkFycmF5ID0gZnVuY3Rpb24oYXJyLCBlKSB7CgkgIHRoaXMuX3JlYWxsb2MoYXJyLmxlbmd0aCAqIDQpOwoJICBpZiAoYXJyIGluc3RhbmNlb2YgSW50MzJBcnJheSAmJgoJICAgICAgdGhpcy5ieXRlT2Zmc2V0K3RoaXMucG9zaXRpb24gJSBhcnIuQllURVNfUEVSX0VMRU1FTlQgPT09IDApIHsKCSAgICBEYXRhU3RyZWFtLm1lbWNweSh0aGlzLl9idWZmZXIsIHRoaXMuYnl0ZU9mZnNldCt0aGlzLnBvc2l0aW9uLAoJICAgICAgICAgICAgICAgICAgICAgIGFyci5idWZmZXIsIDAsCgkgICAgICAgICAgICAgICAgICAgICAgYXJyLmJ5dGVMZW5ndGgpOwoJICAgIHRoaXMubWFwSW50MzJBcnJheShhcnIubGVuZ3RoLCBlKTsKCSAgfSBlbHNlIHsKCSAgICBmb3IgKHZhciBpPTA7IGk8YXJyLmxlbmd0aDsgaSsrKSB7CgkgICAgICB0aGlzLndyaXRlSW50MzIoYXJyW2ldLCBlKTsKCSAgICB9CgkgIH0KCX07CgoJLyoqCgkgIFdyaXRlcyBhbiBJbnQxNkFycmF5IG9mIHNwZWNpZmllZCBlbmRpYW5uZXNzIHRvIHRoZSBEYXRhU3RyZWFtLgoKCSAgQHBhcmFtIHtPYmplY3R9IGFyciBUaGUgYXJyYXkgdG8gd3JpdGUuCgkgIEBwYXJhbSB7P2Jvb2xlYW59IGUgRW5kaWFubmVzcyBvZiB0aGUgZGF0YSB0byB3cml0ZS4KCSAqLwoJRGF0YVN0cmVhbS5wcm90b3R5cGUud3JpdGVJbnQxNkFycmF5ID0gZnVuY3Rpb24oYXJyLCBlKSB7CgkgIHRoaXMuX3JlYWxsb2MoYXJyLmxlbmd0aCAqIDIpOwoJICBpZiAoYXJyIGluc3RhbmNlb2YgSW50MTZBcnJheSAmJgoJICAgICAgdGhpcy5ieXRlT2Zmc2V0K3RoaXMucG9zaXRpb24gJSBhcnIuQllURVNfUEVSX0VMRU1FTlQgPT09IDApIHsKCSAgICBEYXRhU3RyZWFtLm1lbWNweSh0aGlzLl9idWZmZXIsIHRoaXMuYnl0ZU9mZnNldCt0aGlzLnBvc2l0aW9uLAoJICAgICAgICAgICAgICAgICAgICAgIGFyci5idWZmZXIsIDAsCgkgICAgICAgICAgICAgICAgICAgICAgYXJyLmJ5dGVMZW5ndGgpOwoJICAgIHRoaXMubWFwSW50MTZBcnJheShhcnIubGVuZ3RoLCBlKTsKCSAgfSBlbHNlIHsKCSAgICBmb3IgKHZhciBpPTA7IGk8YXJyLmxlbmd0aDsgaSsrKSB7CgkgICAgICB0aGlzLndyaXRlSW50MTYoYXJyW2ldLCBlKTsKCSAgICB9CgkgIH0KCX07CgoJLyoqCgkgIFdyaXRlcyBhbiBJbnQ4QXJyYXkgdG8gdGhlIERhdGFTdHJlYW0uCgoJICBAcGFyYW0ge09iamVjdH0gYXJyIFRoZSBhcnJheSB0byB3cml0ZS4KCSAqLwoJRGF0YVN0cmVhbS5wcm90b3R5cGUud3JpdGVJbnQ4QXJyYXkgPSBmdW5jdGlvbihhcnIpIHsKCSAgdGhpcy5fcmVhbGxvYyhhcnIubGVuZ3RoICogMSk7CgkgIGlmIChhcnIgaW5zdGFuY2VvZiBJbnQ4QXJyYXkgJiYKCSAgICAgIHRoaXMuYnl0ZU9mZnNldCt0aGlzLnBvc2l0aW9uICUgYXJyLkJZVEVTX1BFUl9FTEVNRU5UID09PSAwKSB7CgkgICAgRGF0YVN0cmVhbS5tZW1jcHkodGhpcy5fYnVmZmVyLCB0aGlzLmJ5dGVPZmZzZXQrdGhpcy5wb3NpdGlvbiwKCSAgICAgICAgICAgICAgICAgICAgICBhcnIuYnVmZmVyLCAwLAoJICAgICAgICAgICAgICAgICAgICAgIGFyci5ieXRlTGVuZ3RoKTsKCSAgICB0aGlzLm1hcEludDhBcnJheShhcnIubGVuZ3RoKTsKCSAgfSBlbHNlIHsKCSAgICBmb3IgKHZhciBpPTA7IGk8YXJyLmxlbmd0aDsgaSsrKSB7CgkgICAgICB0aGlzLndyaXRlSW50OChhcnJbaV0pOwoJICAgIH0KCSAgfQoJfTsKCgkvKioKCSAgV3JpdGVzIGEgVWludDMyQXJyYXkgb2Ygc3BlY2lmaWVkIGVuZGlhbm5lc3MgdG8gdGhlIERhdGFTdHJlYW0uCgoJICBAcGFyYW0ge09iamVjdH0gYXJyIFRoZSBhcnJheSB0byB3cml0ZS4KCSAgQHBhcmFtIHs/Ym9vbGVhbn0gZSBFbmRpYW5uZXNzIG9mIHRoZSBkYXRhIHRvIHdyaXRlLgoJICovCglEYXRhU3RyZWFtLnByb3RvdHlwZS53cml0ZVVpbnQzMkFycmF5ID0gZnVuY3Rpb24oYXJyLCBlKSB7CgkgIHRoaXMuX3JlYWxsb2MoYXJyLmxlbmd0aCAqIDQpOwoJICBpZiAoYXJyIGluc3RhbmNlb2YgVWludDMyQXJyYXkgJiYKCSAgICAgIHRoaXMuYnl0ZU9mZnNldCt0aGlzLnBvc2l0aW9uICUgYXJyLkJZVEVTX1BFUl9FTEVNRU5UID09PSAwKSB7CgkgICAgRGF0YVN0cmVhbS5tZW1jcHkodGhpcy5fYnVmZmVyLCB0aGlzLmJ5dGVPZmZzZXQrdGhpcy5wb3NpdGlvbiwKCSAgICAgICAgICAgICAgICAgICAgICBhcnIuYnVmZmVyLCAwLAoJICAgICAgICAgICAgICAgICAgICAgIGFyci5ieXRlTGVuZ3RoKTsKCSAgICB0aGlzLm1hcFVpbnQzMkFycmF5KGFyci5sZW5ndGgsIGUpOwoJICB9IGVsc2UgewoJICAgIGZvciAodmFyIGk9MDsgaTxhcnIubGVuZ3RoOyBpKyspIHsKCSAgICAgIHRoaXMud3JpdGVVaW50MzIoYXJyW2ldLCBlKTsKCSAgICB9CgkgIH0KCX07CgoJLyoqCgkgIFdyaXRlcyBhIFVpbnQxNkFycmF5IG9mIHNwZWNpZmllZCBlbmRpYW5uZXNzIHRvIHRoZSBEYXRhU3RyZWFtLgoKCSAgQHBhcmFtIHtPYmplY3R9IGFyciBUaGUgYXJyYXkgdG8gd3JpdGUuCgkgIEBwYXJhbSB7P2Jvb2xlYW59IGUgRW5kaWFubmVzcyBvZiB0aGUgZGF0YSB0byB3cml0ZS4KCSAqLwoJRGF0YVN0cmVhbS5wcm90b3R5cGUud3JpdGVVaW50MTZBcnJheSA9IGZ1bmN0aW9uKGFyciwgZSkgewoJICB0aGlzLl9yZWFsbG9jKGFyci5sZW5ndGggKiAyKTsKCSAgaWYgKGFyciBpbnN0YW5jZW9mIFVpbnQxNkFycmF5ICYmCgkgICAgICB0aGlzLmJ5dGVPZmZzZXQrdGhpcy5wb3NpdGlvbiAlIGFyci5CWVRFU19QRVJfRUxFTUVOVCA9PT0gMCkgewoJICAgIERhdGFTdHJlYW0ubWVtY3B5KHRoaXMuX2J1ZmZlciwgdGhpcy5ieXRlT2Zmc2V0K3RoaXMucG9zaXRpb24sCgkgICAgICAgICAgICAgICAgICAgICAgYXJyLmJ1ZmZlciwgMCwKCSAgICAgICAgICAgICAgICAgICAgICBhcnIuYnl0ZUxlbmd0aCk7CgkgICAgdGhpcy5tYXBVaW50MTZBcnJheShhcnIubGVuZ3RoLCBlKTsKCSAgfSBlbHNlIHsKCSAgICBmb3IgKHZhciBpPTA7IGk8YXJyLmxlbmd0aDsgaSsrKSB7CgkgICAgICB0aGlzLndyaXRlVWludDE2KGFycltpXSwgZSk7CgkgICAgfQoJICB9Cgl9OwoKCS8qKgoJICBXcml0ZXMgYSBVaW50OEFycmF5IHRvIHRoZSBEYXRhU3RyZWFtLgoKCSAgQHBhcmFtIHtPYmplY3R9IGFyciBUaGUgYXJyYXkgdG8gd3JpdGUuCgkgKi8KCURhdGFTdHJlYW0ucHJvdG90eXBlLndyaXRlVWludDhBcnJheSA9IGZ1bmN0aW9uKGFycikgewoJICB0aGlzLl9yZWFsbG9jKGFyci5sZW5ndGggKiAxKTsKCSAgaWYgKGFyciBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkgJiYKCSAgICAgIHRoaXMuYnl0ZU9mZnNldCt0aGlzLnBvc2l0aW9uICUgYXJyLkJZVEVTX1BFUl9FTEVNRU5UID09PSAwKSB7CgkgICAgRGF0YVN0cmVhbS5tZW1jcHkodGhpcy5fYnVmZmVyLCB0aGlzLmJ5dGVPZmZzZXQrdGhpcy5wb3NpdGlvbiwKCSAgICAgICAgICAgICAgICAgICAgICBhcnIuYnVmZmVyLCAwLAoJICAgICAgICAgICAgICAgICAgICAgIGFyci5ieXRlTGVuZ3RoKTsKCSAgICB0aGlzLm1hcFVpbnQ4QXJyYXkoYXJyLmxlbmd0aCk7CgkgIH0gZWxzZSB7CgkgICAgZm9yICh2YXIgaT0wOyBpPGFyci5sZW5ndGg7IGkrKykgewoJICAgICAgdGhpcy53cml0ZVVpbnQ4KGFycltpXSk7CgkgICAgfQoJICB9Cgl9OwoKCS8qKgoJICBXcml0ZXMgYSBGbG9hdDY0QXJyYXkgb2Ygc3BlY2lmaWVkIGVuZGlhbm5lc3MgdG8gdGhlIERhdGFTdHJlYW0uCgoJICBAcGFyYW0ge09iamVjdH0gYXJyIFRoZSBhcnJheSB0byB3cml0ZS4KCSAgQHBhcmFtIHs/Ym9vbGVhbn0gZSBFbmRpYW5uZXNzIG9mIHRoZSBkYXRhIHRvIHdyaXRlLgoJICovCglEYXRhU3RyZWFtLnByb3RvdHlwZS53cml0ZUZsb2F0NjRBcnJheSA9IGZ1bmN0aW9uKGFyciwgZSkgewoJICB0aGlzLl9yZWFsbG9jKGFyci5sZW5ndGggKiA4KTsKCSAgaWYgKGFyciBpbnN0YW5jZW9mIEZsb2F0NjRBcnJheSAmJgoJICAgICAgdGhpcy5ieXRlT2Zmc2V0K3RoaXMucG9zaXRpb24gJSBhcnIuQllURVNfUEVSX0VMRU1FTlQgPT09IDApIHsKCSAgICBEYXRhU3RyZWFtLm1lbWNweSh0aGlzLl9idWZmZXIsIHRoaXMuYnl0ZU9mZnNldCt0aGlzLnBvc2l0aW9uLAoJICAgICAgICAgICAgICAgICAgICAgIGFyci5idWZmZXIsIDAsCgkgICAgICAgICAgICAgICAgICAgICAgYXJyLmJ5dGVMZW5ndGgpOwoJICAgIHRoaXMubWFwRmxvYXQ2NEFycmF5KGFyci5sZW5ndGgsIGUpOwoJICB9IGVsc2UgewoJICAgIGZvciAodmFyIGk9MDsgaTxhcnIubGVuZ3RoOyBpKyspIHsKCSAgICAgIHRoaXMud3JpdGVGbG9hdDY0KGFycltpXSwgZSk7CgkgICAgfQoJICB9Cgl9OwoKCS8qKgoJICBXcml0ZXMgYSBGbG9hdDMyQXJyYXkgb2Ygc3BlY2lmaWVkIGVuZGlhbm5lc3MgdG8gdGhlIERhdGFTdHJlYW0uCgoJICBAcGFyYW0ge09iamVjdH0gYXJyIFRoZSBhcnJheSB0byB3cml0ZS4KCSAgQHBhcmFtIHs/Ym9vbGVhbn0gZSBFbmRpYW5uZXNzIG9mIHRoZSBkYXRhIHRvIHdyaXRlLgoJICovCglEYXRhU3RyZWFtLnByb3RvdHlwZS53cml0ZUZsb2F0MzJBcnJheSA9IGZ1bmN0aW9uKGFyciwgZSkgewoJICB0aGlzLl9yZWFsbG9jKGFyci5sZW5ndGggKiA0KTsKCSAgaWYgKGFyciBpbnN0YW5jZW9mIEZsb2F0MzJBcnJheSAmJgoJICAgICAgdGhpcy5ieXRlT2Zmc2V0K3RoaXMucG9zaXRpb24gJSBhcnIuQllURVNfUEVSX0VMRU1FTlQgPT09IDApIHsKCSAgICBEYXRhU3RyZWFtLm1lbWNweSh0aGlzLl9idWZmZXIsIHRoaXMuYnl0ZU9mZnNldCt0aGlzLnBvc2l0aW9uLAoJICAgICAgICAgICAgICAgICAgICAgIGFyci5idWZmZXIsIDAsCgkgICAgICAgICAgICAgICAgICAgICAgYXJyLmJ5dGVMZW5ndGgpOwoJICAgIHRoaXMubWFwRmxvYXQzMkFycmF5KGFyci5sZW5ndGgsIGUpOwoJICB9IGVsc2UgewoJICAgIGZvciAodmFyIGk9MDsgaTxhcnIubGVuZ3RoOyBpKyspIHsKCSAgICAgIHRoaXMud3JpdGVGbG9hdDMyKGFycltpXSwgZSk7CgkgICAgfQoJICB9Cgl9OwoKCgkvKioKCSAgV3JpdGVzIGEgMzItYml0IGludCB0byB0aGUgRGF0YVN0cmVhbSB3aXRoIHRoZSBkZXNpcmVkIGVuZGlhbm5lc3MuCgoJICBAcGFyYW0ge251bWJlcn0gdiBOdW1iZXIgdG8gd3JpdGUuCgkgIEBwYXJhbSB7P2Jvb2xlYW59IGUgRW5kaWFubmVzcyBvZiB0aGUgbnVtYmVyLgoJICovCglEYXRhU3RyZWFtLnByb3RvdHlwZS53cml0ZUludDMyID0gZnVuY3Rpb24odiwgZSkgewoJICB0aGlzLl9yZWFsbG9jKDQpOwoJICB0aGlzLl9kYXRhVmlldy5zZXRJbnQzMih0aGlzLnBvc2l0aW9uLCB2LCBlID09IG51bGwgPyB0aGlzLmVuZGlhbm5lc3MgOiBlKTsKCSAgdGhpcy5wb3NpdGlvbiArPSA0OwoJfTsKCgkvKioKCSAgV3JpdGVzIGEgMTYtYml0IGludCB0byB0aGUgRGF0YVN0cmVhbSB3aXRoIHRoZSBkZXNpcmVkIGVuZGlhbm5lc3MuCgoJICBAcGFyYW0ge251bWJlcn0gdiBOdW1iZXIgdG8gd3JpdGUuCgkgIEBwYXJhbSB7P2Jvb2xlYW59IGUgRW5kaWFubmVzcyBvZiB0aGUgbnVtYmVyLgoJICovCglEYXRhU3RyZWFtLnByb3RvdHlwZS53cml0ZUludDE2ID0gZnVuY3Rpb24odiwgZSkgewoJICB0aGlzLl9yZWFsbG9jKDIpOwoJICB0aGlzLl9kYXRhVmlldy5zZXRJbnQxNih0aGlzLnBvc2l0aW9uLCB2LCBlID09IG51bGwgPyB0aGlzLmVuZGlhbm5lc3MgOiBlKTsKCSAgdGhpcy5wb3NpdGlvbiArPSAyOwoJfTsKCgkvKioKCSAgV3JpdGVzIGFuIDgtYml0IGludCB0byB0aGUgRGF0YVN0cmVhbS4KCgkgIEBwYXJhbSB7bnVtYmVyfSB2IE51bWJlciB0byB3cml0ZS4KCSAqLwoJRGF0YVN0cmVhbS5wcm90b3R5cGUud3JpdGVJbnQ4ID0gZnVuY3Rpb24odikgewoJICB0aGlzLl9yZWFsbG9jKDEpOwoJICB0aGlzLl9kYXRhVmlldy5zZXRJbnQ4KHRoaXMucG9zaXRpb24sIHYpOwoJICB0aGlzLnBvc2l0aW9uICs9IDE7Cgl9OwoKCS8qKgoJICBXcml0ZXMgYSAzMi1iaXQgdW5zaWduZWQgaW50IHRvIHRoZSBEYXRhU3RyZWFtIHdpdGggdGhlIGRlc2lyZWQgZW5kaWFubmVzcy4KCgkgIEBwYXJhbSB7bnVtYmVyfSB2IE51bWJlciB0byB3cml0ZS4KCSAgQHBhcmFtIHs/Ym9vbGVhbn0gZSBFbmRpYW5uZXNzIG9mIHRoZSBudW1iZXIuCgkgKi8KCURhdGFTdHJlYW0ucHJvdG90eXBlLndyaXRlVWludDMyID0gZnVuY3Rpb24odiwgZSkgewoJICB0aGlzLl9yZWFsbG9jKDQpOwoJICB0aGlzLl9kYXRhVmlldy5zZXRVaW50MzIodGhpcy5wb3NpdGlvbiwgdiwgZSA9PSBudWxsID8gdGhpcy5lbmRpYW5uZXNzIDogZSk7CgkgIHRoaXMucG9zaXRpb24gKz0gNDsKCX07CgoJLyoqCgkgIFdyaXRlcyBhIDE2LWJpdCB1bnNpZ25lZCBpbnQgdG8gdGhlIERhdGFTdHJlYW0gd2l0aCB0aGUgZGVzaXJlZCBlbmRpYW5uZXNzLgoKCSAgQHBhcmFtIHtudW1iZXJ9IHYgTnVtYmVyIHRvIHdyaXRlLgoJICBAcGFyYW0gez9ib29sZWFufSBlIEVuZGlhbm5lc3Mgb2YgdGhlIG51bWJlci4KCSAqLwoJRGF0YVN0cmVhbS5wcm90b3R5cGUud3JpdGVVaW50MTYgPSBmdW5jdGlvbih2LCBlKSB7CgkgIHRoaXMuX3JlYWxsb2MoMik7CgkgIHRoaXMuX2RhdGFWaWV3LnNldFVpbnQxNih0aGlzLnBvc2l0aW9uLCB2LCBlID09IG51bGwgPyB0aGlzLmVuZGlhbm5lc3MgOiBlKTsKCSAgdGhpcy5wb3NpdGlvbiArPSAyOwoJfTsKCgkvKioKCSAgV3JpdGVzIGFuIDgtYml0IHVuc2lnbmVkICBpbnQgdG8gdGhlIERhdGFTdHJlYW0uCgoJICBAcGFyYW0ge251bWJlcn0gdiBOdW1iZXIgdG8gd3JpdGUuCgkgKi8KCURhdGFTdHJlYW0ucHJvdG90eXBlLndyaXRlVWludDggPSBmdW5jdGlvbih2KSB7CgkgIHRoaXMuX3JlYWxsb2MoMSk7CgkgIHRoaXMuX2RhdGFWaWV3LnNldFVpbnQ4KHRoaXMucG9zaXRpb24sIHYpOwoJICB0aGlzLnBvc2l0aW9uICs9IDE7Cgl9OwoKCS8qKgoJICBXcml0ZXMgYSAzMi1iaXQgZmxvYXQgdG8gdGhlIERhdGFTdHJlYW0gd2l0aCB0aGUgZGVzaXJlZCBlbmRpYW5uZXNzLgoKCSAgQHBhcmFtIHtudW1iZXJ9IHYgTnVtYmVyIHRvIHdyaXRlLgoJICBAcGFyYW0gez9ib29sZWFufSBlIEVuZGlhbm5lc3Mgb2YgdGhlIG51bWJlci4KCSAqLwoJRGF0YVN0cmVhbS5wcm90b3R5cGUud3JpdGVGbG9hdDMyID0gZnVuY3Rpb24odiwgZSkgewoJICB0aGlzLl9yZWFsbG9jKDQpOwoJICB0aGlzLl9kYXRhVmlldy5zZXRGbG9hdDMyKHRoaXMucG9zaXRpb24sIHYsIGUgPT0gbnVsbCA/IHRoaXMuZW5kaWFubmVzcyA6IGUpOwoJICB0aGlzLnBvc2l0aW9uICs9IDQ7Cgl9OwoKCS8qKgoJICBXcml0ZXMgYSA2NC1iaXQgZmxvYXQgdG8gdGhlIERhdGFTdHJlYW0gd2l0aCB0aGUgZGVzaXJlZCBlbmRpYW5uZXNzLgoKCSAgQHBhcmFtIHtudW1iZXJ9IHYgTnVtYmVyIHRvIHdyaXRlLgoJICBAcGFyYW0gez9ib29sZWFufSBlIEVuZGlhbm5lc3Mgb2YgdGhlIG51bWJlci4KCSAqLwoJRGF0YVN0cmVhbS5wcm90b3R5cGUud3JpdGVGbG9hdDY0ID0gZnVuY3Rpb24odiwgZSkgewoJICB0aGlzLl9yZWFsbG9jKDgpOwoJICB0aGlzLl9kYXRhVmlldy5zZXRGbG9hdDY0KHRoaXMucG9zaXRpb24sIHYsIGUgPT0gbnVsbCA/IHRoaXMuZW5kaWFubmVzcyA6IGUpOwoJICB0aGlzLnBvc2l0aW9uICs9IDg7Cgl9OwoKCS8qKgoJICBXcml0ZSBhIFVDUy0yIHN0cmluZyBvZiBkZXNpcmVkIGVuZGlhbm5lc3MgdG8gdGhlIERhdGFTdHJlYW0uIFRoZQoJICBsZW5ndGhPdmVycmlkZSBhcmd1bWVudCBsZXRzIHlvdSBkZWZpbmUgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIHdyaXRlLgoJICBJZiB0aGUgc3RyaW5nIGlzIHNob3J0ZXIgdGhhbiBsZW5ndGhPdmVycmlkZSwgdGhlIGV4dHJhIHNwYWNlIGlzIHBhZGRlZCB3aXRoCgkgIHplcm9lcy4KCgkgIEBwYXJhbSB7c3RyaW5nfSBzdHIgVGhlIHN0cmluZyB0byB3cml0ZS4KCSAgQHBhcmFtIHs/Ym9vbGVhbn0gZW5kaWFubmVzcyBUaGUgZW5kaWFubmVzcyB0byB1c2UgZm9yIHRoZSB3cml0dGVuIHN0cmluZyBkYXRhLgoJICBAcGFyYW0gez9udW1iZXJ9IGxlbmd0aE92ZXJyaWRlIFRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB0byB3cml0ZS4KCSAqLwoJRGF0YVN0cmVhbS5wcm90b3R5cGUud3JpdGVVQ1MyU3RyaW5nID0gZnVuY3Rpb24oc3RyLCBlbmRpYW5uZXNzLCBsZW5ndGhPdmVycmlkZSkgewoJICBpZiAobGVuZ3RoT3ZlcnJpZGUgPT0gbnVsbCkgewoJICAgIGxlbmd0aE92ZXJyaWRlID0gc3RyLmxlbmd0aDsKCSAgfQoJICBmb3IgKHZhciBpID0gMDsgaSA8IHN0ci5sZW5ndGggJiYgaSA8IGxlbmd0aE92ZXJyaWRlOyBpKyspIHsKCSAgICB0aGlzLndyaXRlVWludDE2KHN0ci5jaGFyQ29kZUF0KGkpLCBlbmRpYW5uZXNzKTsKCSAgfQoJICBmb3IgKDsgaTxsZW5ndGhPdmVycmlkZTsgaSsrKSB7CgkgICAgdGhpcy53cml0ZVVpbnQxNigwKTsKCSAgfQoJfTsKCgkvKioKCSAgV3JpdGVzIGEgc3RyaW5nIG9mIGRlc2lyZWQgbGVuZ3RoIGFuZCBlbmNvZGluZyB0byB0aGUgRGF0YVN0cmVhbS4KCgkgIEBwYXJhbSB7c3RyaW5nfSBzIFRoZSBzdHJpbmcgdG8gd3JpdGUuCgkgIEBwYXJhbSB7P3N0cmluZ30gZW5jb2RpbmcgVGhlIGVuY29kaW5nIGZvciB0aGUgd3JpdHRlbiBzdHJpbmcgZGF0YS4KCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWZhdWx0cyB0byBBU0NJSS4KCSAgQHBhcmFtIHs/bnVtYmVyfSBsZW5ndGggVGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIHdyaXRlLgoJICovCglEYXRhU3RyZWFtLnByb3RvdHlwZS53cml0ZVN0cmluZyA9IGZ1bmN0aW9uKHMsIGVuY29kaW5nLCBsZW5ndGgpIHsKCSAgdmFyIGkgPSAwOwoJICBpZiAoZW5jb2RpbmcgPT0gbnVsbCB8fCBlbmNvZGluZyA9PSAiQVNDSUkiKSB7CgkgICAgaWYgKGxlbmd0aCAhPSBudWxsKSB7CgkgICAgICB2YXIgbGVuID0gTWF0aC5taW4ocy5sZW5ndGgsIGxlbmd0aCk7CgkgICAgICBmb3IgKGk9MDsgaTxsZW47IGkrKykgewoJICAgICAgICB0aGlzLndyaXRlVWludDgocy5jaGFyQ29kZUF0KGkpKTsKCSAgICAgIH0KCSAgICAgIGZvciAoOyBpPGxlbmd0aDsgaSsrKSB7CgkgICAgICAgIHRoaXMud3JpdGVVaW50OCgwKTsKCSAgICAgIH0KCSAgICB9IGVsc2UgewoJICAgICAgZm9yIChpPTA7IGk8cy5sZW5ndGg7IGkrKykgewoJICAgICAgICB0aGlzLndyaXRlVWludDgocy5jaGFyQ29kZUF0KGkpKTsKCSAgICAgIH0KCSAgICB9CgkgIH0gZWxzZSB7CgkgICAgdGhpcy53cml0ZVVpbnQ4QXJyYXkoKG5ldyBUZXh0RW5jb2RlcihlbmNvZGluZykpLmVuY29kZShzLnN1YnN0cmluZygwLCBsZW5ndGgpKSk7CgkgIH0KCX07CgoJLyoqCgkgIFdyaXRlcyBhIG51bGwtdGVybWluYXRlZCBzdHJpbmcgdG8gRGF0YVN0cmVhbSBhbmQgemVyby1wYWRzIGl0IHRvIGxlbmd0aAoJICBieXRlcy4gSWYgbGVuZ3RoIGlzIG5vdCBnaXZlbiwgd3JpdGVzIHRoZSBzdHJpbmcgZm9sbG93ZWQgYnkgYSB6ZXJvLgoJICBJZiBzdHJpbmcgaXMgbG9uZ2VyIHRoYW4gbGVuZ3RoLCB0aGUgd3JpdHRlbiBwYXJ0IG9mIHRoZSBzdHJpbmcgZG9lcyBub3QgaGF2ZQoJICBhIHRyYWlsaW5nIHplcm8uCgoJICBAcGFyYW0ge3N0cmluZ30gcyBUaGUgc3RyaW5nIHRvIHdyaXRlLgoJICBAcGFyYW0gez9udW1iZXJ9IGxlbmd0aCBUaGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gd3JpdGUuCgkgKi8KCURhdGFTdHJlYW0ucHJvdG90eXBlLndyaXRlQ1N0cmluZyA9IGZ1bmN0aW9uKHMsIGxlbmd0aCkgewoJICB2YXIgaSA9IDA7CgkgIGlmIChsZW5ndGggIT0gbnVsbCkgewoJICAgIHZhciBsZW4gPSBNYXRoLm1pbihzLmxlbmd0aCwgbGVuZ3RoKTsKCSAgICBmb3IgKGk9MDsgaTxsZW47IGkrKykgewoJICAgICAgdGhpcy53cml0ZVVpbnQ4KHMuY2hhckNvZGVBdChpKSk7CgkgICAgfQoJICAgIGZvciAoOyBpPGxlbmd0aDsgaSsrKSB7CgkgICAgICB0aGlzLndyaXRlVWludDgoMCk7CgkgICAgfQoJICB9IGVsc2UgewoJICAgIGZvciAoaT0wOyBpPHMubGVuZ3RoOyBpKyspIHsKCSAgICAgIHRoaXMud3JpdGVVaW50OChzLmNoYXJDb2RlQXQoaSkpOwoJICAgIH0KCSAgICB0aGlzLndyaXRlVWludDgoMCk7CgkgIH0KCX07CgoJLyoqCgkgIFdyaXRlcyBhIHN0cnVjdCB0byB0aGUgRGF0YVN0cmVhbS4gVGFrZXMgYSBzdHJ1Y3REZWZpbml0aW9uIHRoYXQgZ2l2ZXMgdGhlCgkgIHR5cGVzIGFuZCBhIHN0cnVjdCBvYmplY3QgdGhhdCBnaXZlcyB0aGUgdmFsdWVzLiBSZWZlciB0byByZWFkU3RydWN0IGZvciB0aGUKCSAgc3RydWN0dXJlIG9mIHN0cnVjdERlZmluaXRpb24uCgoJICBAcGFyYW0ge09iamVjdH0gc3RydWN0RGVmaW5pdGlvbiBUeXBlIGRlZmluaXRpb24gb2YgdGhlIHN0cnVjdC4KCSAgQHBhcmFtIHtPYmplY3R9IHN0cnVjdCBUaGUgc3RydWN0IGRhdGEgb2JqZWN0LgoJICAqLwoJRGF0YVN0cmVhbS5wcm90b3R5cGUud3JpdGVTdHJ1Y3QgPSBmdW5jdGlvbihzdHJ1Y3REZWZpbml0aW9uLCBzdHJ1Y3QpIHsKCSAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdHJ1Y3REZWZpbml0aW9uLmxlbmd0aDsgaSs9MikgewoJICAgIHZhciB0ID0gc3RydWN0RGVmaW5pdGlvbltpKzFdOwoJICAgIHRoaXMud3JpdGVUeXBlKHQsIHN0cnVjdFtzdHJ1Y3REZWZpbml0aW9uW2ldXSwgc3RydWN0KTsKCSAgfQoJfTsKCgkvKioKCSAgV3JpdGVzIG9iamVjdCB2IG9mIHR5cGUgdCB0byB0aGUgRGF0YVN0cmVhbS4KCgkgIEBwYXJhbSB7T2JqZWN0fSB0IFR5cGUgb2YgZGF0YSB0byB3cml0ZS4KCSAgQHBhcmFtIHtPYmplY3R9IHYgVmFsdWUgb2YgZGF0YSB0byB3cml0ZS4KCSAgQHBhcmFtIHtPYmplY3R9IHN0cnVjdCBTdHJ1Y3QgdG8gcGFzcyB0byB3cml0ZSBjYWxsYmFjayBmdW5jdGlvbnMuCgkgICovCglEYXRhU3RyZWFtLnByb3RvdHlwZS53cml0ZVR5cGUgPSBmdW5jdGlvbih0LCB2LCBzdHJ1Y3QpIHsKCSAgdmFyIHRwOwoJICBpZiAodHlwZW9mIHQgPT0gImZ1bmN0aW9uIikgewoJICAgIHJldHVybiB0KHRoaXMsIHYpOwoJICB9IGVsc2UgaWYgKHR5cGVvZiB0ID09ICJvYmplY3QiICYmICEodCBpbnN0YW5jZW9mIEFycmF5KSkgewoJICAgIHJldHVybiB0LnNldCh0aGlzLCB2LCBzdHJ1Y3QpOwoJICB9CgkgIHZhciBsZW5ndGhPdmVycmlkZSA9IG51bGw7CgkgIHZhciBjaGFyc2V0ID0gIkFTQ0lJIjsKCSAgdmFyIHBvcyA9IHRoaXMucG9zaXRpb247CgkgIGlmICh0eXBlb2YodCkgPT0gJ3N0cmluZycgJiYgLzovLnRlc3QodCkpIHsKCSAgICB0cCA9IHQuc3BsaXQoIjoiKTsKCSAgICB0ID0gdHBbMF07CgkgICAgbGVuZ3RoT3ZlcnJpZGUgPSBwYXJzZUludCh0cFsxXSk7CgkgIH0KCSAgaWYgKHR5cGVvZiB0ID09ICdzdHJpbmcnICYmIC8sLy50ZXN0KHQpKSB7CgkgICAgdHAgPSB0LnNwbGl0KCIsIik7CgkgICAgdCA9IHRwWzBdOwoJICAgIGNoYXJzZXQgPSBwYXJzZUludCh0cFsxXSk7CgkgIH0KCgkgIHN3aXRjaCh0KSB7CgkgICAgY2FzZSAndWludDgnOgoJICAgICAgdGhpcy53cml0ZVVpbnQ4KHYpOwoJICAgICAgYnJlYWs7CgkgICAgY2FzZSAnaW50OCc6CgkgICAgICB0aGlzLndyaXRlSW50OCh2KTsKCSAgICAgIGJyZWFrOwoKCSAgICBjYXNlICd1aW50MTYnOgoJICAgICAgdGhpcy53cml0ZVVpbnQxNih2LCB0aGlzLmVuZGlhbm5lc3MpOwoJICAgICAgYnJlYWs7CgkgICAgY2FzZSAnaW50MTYnOgoJICAgICAgdGhpcy53cml0ZUludDE2KHYsIHRoaXMuZW5kaWFubmVzcyk7CgkgICAgICBicmVhazsKCSAgICBjYXNlICd1aW50MzInOgoJICAgICAgdGhpcy53cml0ZVVpbnQzMih2LCB0aGlzLmVuZGlhbm5lc3MpOwoJICAgICAgYnJlYWs7CgkgICAgY2FzZSAnaW50MzInOgoJICAgICAgdGhpcy53cml0ZUludDMyKHYsIHRoaXMuZW5kaWFubmVzcyk7CgkgICAgICBicmVhazsKCSAgICBjYXNlICdmbG9hdDMyJzoKCSAgICAgIHRoaXMud3JpdGVGbG9hdDMyKHYsIHRoaXMuZW5kaWFubmVzcyk7CgkgICAgICBicmVhazsKCSAgICBjYXNlICdmbG9hdDY0JzoKCSAgICAgIHRoaXMud3JpdGVGbG9hdDY0KHYsIHRoaXMuZW5kaWFubmVzcyk7CgkgICAgICBicmVhazsKCgkgICAgY2FzZSAndWludDE2YmUnOgoJICAgICAgdGhpcy53cml0ZVVpbnQxNih2LCBEYXRhU3RyZWFtLkJJR19FTkRJQU4pOwoJICAgICAgYnJlYWs7CgkgICAgY2FzZSAnaW50MTZiZSc6CgkgICAgICB0aGlzLndyaXRlSW50MTYodiwgRGF0YVN0cmVhbS5CSUdfRU5ESUFOKTsKCSAgICAgIGJyZWFrOwoJICAgIGNhc2UgJ3VpbnQzMmJlJzoKCSAgICAgIHRoaXMud3JpdGVVaW50MzIodiwgRGF0YVN0cmVhbS5CSUdfRU5ESUFOKTsKCSAgICAgIGJyZWFrOwoJICAgIGNhc2UgJ2ludDMyYmUnOgoJICAgICAgdGhpcy53cml0ZUludDMyKHYsIERhdGFTdHJlYW0uQklHX0VORElBTik7CgkgICAgICBicmVhazsKCSAgICBjYXNlICdmbG9hdDMyYmUnOgoJICAgICAgdGhpcy53cml0ZUZsb2F0MzIodiwgRGF0YVN0cmVhbS5CSUdfRU5ESUFOKTsKCSAgICAgIGJyZWFrOwoJICAgIGNhc2UgJ2Zsb2F0NjRiZSc6CgkgICAgICB0aGlzLndyaXRlRmxvYXQ2NCh2LCBEYXRhU3RyZWFtLkJJR19FTkRJQU4pOwoJICAgICAgYnJlYWs7CgoJICAgIGNhc2UgJ3VpbnQxNmxlJzoKCSAgICAgIHRoaXMud3JpdGVVaW50MTYodiwgRGF0YVN0cmVhbS5MSVRUTEVfRU5ESUFOKTsKCSAgICAgIGJyZWFrOwoJICAgIGNhc2UgJ2ludDE2bGUnOgoJICAgICAgdGhpcy53cml0ZUludDE2KHYsIERhdGFTdHJlYW0uTElUVExFX0VORElBTik7CgkgICAgICBicmVhazsKCSAgICBjYXNlICd1aW50MzJsZSc6CgkgICAgICB0aGlzLndyaXRlVWludDMyKHYsIERhdGFTdHJlYW0uTElUVExFX0VORElBTik7CgkgICAgICBicmVhazsKCSAgICBjYXNlICdpbnQzMmxlJzoKCSAgICAgIHRoaXMud3JpdGVJbnQzMih2LCBEYXRhU3RyZWFtLkxJVFRMRV9FTkRJQU4pOwoJICAgICAgYnJlYWs7CgkgICAgY2FzZSAnZmxvYXQzMmxlJzoKCSAgICAgIHRoaXMud3JpdGVGbG9hdDMyKHYsIERhdGFTdHJlYW0uTElUVExFX0VORElBTik7CgkgICAgICBicmVhazsKCSAgICBjYXNlICdmbG9hdDY0bGUnOgoJICAgICAgdGhpcy53cml0ZUZsb2F0NjQodiwgRGF0YVN0cmVhbS5MSVRUTEVfRU5ESUFOKTsKCSAgICAgIGJyZWFrOwoKCSAgICBjYXNlICdjc3RyaW5nJzoKCSAgICAgIHRoaXMud3JpdGVDU3RyaW5nKHYsIGxlbmd0aE92ZXJyaWRlKTsKCSAgICAgIGJyZWFrOwoKCSAgICBjYXNlICdzdHJpbmcnOgoJICAgICAgdGhpcy53cml0ZVN0cmluZyh2LCBjaGFyc2V0LCBsZW5ndGhPdmVycmlkZSk7CgkgICAgICBicmVhazsKCgkgICAgY2FzZSAndTE2c3RyaW5nJzoKCSAgICAgIHRoaXMud3JpdGVVQ1MyU3RyaW5nKHYsIHRoaXMuZW5kaWFubmVzcywgbGVuZ3RoT3ZlcnJpZGUpOwoJICAgICAgYnJlYWs7CgoJICAgIGNhc2UgJ3UxNnN0cmluZ2xlJzoKCSAgICAgIHRoaXMud3JpdGVVQ1MyU3RyaW5nKHYsIERhdGFTdHJlYW0uTElUVExFX0VORElBTiwgbGVuZ3RoT3ZlcnJpZGUpOwoJICAgICAgYnJlYWs7CgoJICAgIGNhc2UgJ3UxNnN0cmluZ2JlJzoKCSAgICAgIHRoaXMud3JpdGVVQ1MyU3RyaW5nKHYsIERhdGFTdHJlYW0uQklHX0VORElBTiwgbGVuZ3RoT3ZlcnJpZGUpOwoJICAgICAgYnJlYWs7CgoJICAgIGRlZmF1bHQ6CgkgICAgICBpZiAodC5sZW5ndGggPT0gMykgewoJICAgICAgICB2YXIgdGEgPSB0WzFdOwoJICAgICAgICBmb3IgKHZhciBpPTA7IGk8di5sZW5ndGg7IGkrKykgewoJICAgICAgICAgIHRoaXMud3JpdGVUeXBlKHRhLCB2W2ldKTsKCSAgICAgICAgfQoJICAgICAgICBicmVhazsKCSAgICAgIH0gZWxzZSB7CgkgICAgICAgIHRoaXMud3JpdGVTdHJ1Y3QodCwgdik7CgkgICAgICAgIGJyZWFrOwoJICAgICAgfQoJICB9CgkgIGlmIChsZW5ndGhPdmVycmlkZSAhPSBudWxsKSB7CgkgICAgdGhpcy5wb3NpdGlvbiA9IHBvczsKCSAgICB0aGlzLl9yZWFsbG9jKGxlbmd0aE92ZXJyaWRlKTsKCSAgICB0aGlzLnBvc2l0aW9uID0gcG9zICsgbGVuZ3RoT3ZlcnJpZGU7CgkgIH0KCX07CgoKCURhdGFTdHJlYW0ucHJvdG90eXBlLndyaXRlVWludDY0ID0gZnVuY3Rpb24gKHYpIHsKCQl2YXIgaCA9IE1hdGguZmxvb3IodiAvIE1BWF9TSVpFKTsKCQl0aGlzLndyaXRlVWludDMyKGgpOwoJCXRoaXMud3JpdGVVaW50MzIodiAmIDB4RkZGRkZGRkYpOwoJfTsKCglEYXRhU3RyZWFtLnByb3RvdHlwZS53cml0ZVVpbnQyNCA9IGZ1bmN0aW9uICh2KSB7CgkJdGhpcy53cml0ZVVpbnQ4KCh2ICYgMHgwMEZGMDAwMCk+PjE2KTsKCQl0aGlzLndyaXRlVWludDgoKHYgJiAweDAwMDBGRjAwKT4+OCk7CgkJdGhpcy53cml0ZVVpbnQ4KCh2ICYgMHgwMDAwMDBGRikpOwoJfTsKCglEYXRhU3RyZWFtLnByb3RvdHlwZS5hZGp1c3RVaW50MzIgPSBmdW5jdGlvbihwb3NpdGlvbiwgdmFsdWUpIHsKCQl2YXIgcG9zID0gdGhpcy5wb3NpdGlvbjsKCQl0aGlzLnNlZWsocG9zaXRpb24pOwoJCXRoaXMud3JpdGVVaW50MzIodmFsdWUpOwoJCXRoaXMuc2Vlayhwb3MpOwoJfTsKCS8vIGZpbGU6c3JjL0RhdGFTdHJlYW0tbWFwLmpzCgkvKioKCSAgTWFwcyBhbiBJbnQzMkFycmF5IGludG8gdGhlIERhdGFTdHJlYW0gYnVmZmVyLCBzd2l6emxpbmcgaXQgdG8gbmF0aXZlCgkgIGVuZGlhbm5lc3MgaW4tcGxhY2UuIFRoZSBjdXJyZW50IG9mZnNldCBmcm9tIHRoZSBzdGFydCBvZiB0aGUgYnVmZmVyIG5lZWRzIHRvCgkgIGJlIGEgbXVsdGlwbGUgb2YgZWxlbWVudCBzaXplLCBqdXN0IGxpa2Ugd2l0aCB0eXBlZCBhcnJheSB2aWV3cy4KCgkgIE5pY2UgZm9yIHF1aWNrbHkgcmVhZGluZyBpbiBkYXRhLiBXYXJuaW5nOiBwb3RlbnRpYWxseSBtb2RpZmllcyB0aGUgYnVmZmVyCgkgIGNvbnRlbnRzLgoKCSAgQHBhcmFtIHtudW1iZXJ9IGxlbmd0aCBOdW1iZXIgb2YgZWxlbWVudHMgdG8gbWFwLgoJICBAcGFyYW0gez9ib29sZWFufSBlIEVuZGlhbm5lc3Mgb2YgdGhlIGRhdGEgdG8gcmVhZC4KCSAgQHJldHVybiB7T2JqZWN0fSBJbnQzMkFycmF5IHRvIHRoZSBEYXRhU3RyZWFtIGJhY2tpbmcgYnVmZmVyLgoJICAqLwoJRGF0YVN0cmVhbS5wcm90b3R5cGUubWFwSW50MzJBcnJheSA9IGZ1bmN0aW9uKGxlbmd0aCwgZSkgewoJICB0aGlzLl9yZWFsbG9jKGxlbmd0aCAqIDQpOwoJICB2YXIgYXJyID0gbmV3IEludDMyQXJyYXkodGhpcy5fYnVmZmVyLCB0aGlzLmJ5dGVPZmZzZXQrdGhpcy5wb3NpdGlvbiwgbGVuZ3RoKTsKCSAgRGF0YVN0cmVhbS5hcnJheVRvTmF0aXZlKGFyciwgZSA9PSBudWxsID8gdGhpcy5lbmRpYW5uZXNzIDogZSk7CgkgIHRoaXMucG9zaXRpb24gKz0gbGVuZ3RoICogNDsKCSAgcmV0dXJuIGFycjsKCX07CgoJLyoqCgkgIE1hcHMgYW4gSW50MTZBcnJheSBpbnRvIHRoZSBEYXRhU3RyZWFtIGJ1ZmZlciwgc3dpenpsaW5nIGl0IHRvIG5hdGl2ZQoJICBlbmRpYW5uZXNzIGluLXBsYWNlLiBUaGUgY3VycmVudCBvZmZzZXQgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIGJ1ZmZlciBuZWVkcyB0bwoJICBiZSBhIG11bHRpcGxlIG9mIGVsZW1lbnQgc2l6ZSwganVzdCBsaWtlIHdpdGggdHlwZWQgYXJyYXkgdmlld3MuCgoJICBOaWNlIGZvciBxdWlja2x5IHJlYWRpbmcgaW4gZGF0YS4gV2FybmluZzogcG90ZW50aWFsbHkgbW9kaWZpZXMgdGhlIGJ1ZmZlcgoJICBjb250ZW50cy4KCgkgIEBwYXJhbSB7bnVtYmVyfSBsZW5ndGggTnVtYmVyIG9mIGVsZW1lbnRzIHRvIG1hcC4KCSAgQHBhcmFtIHs/Ym9vbGVhbn0gZSBFbmRpYW5uZXNzIG9mIHRoZSBkYXRhIHRvIHJlYWQuCgkgIEByZXR1cm4ge09iamVjdH0gSW50MTZBcnJheSB0byB0aGUgRGF0YVN0cmVhbSBiYWNraW5nIGJ1ZmZlci4KCSAgKi8KCURhdGFTdHJlYW0ucHJvdG90eXBlLm1hcEludDE2QXJyYXkgPSBmdW5jdGlvbihsZW5ndGgsIGUpIHsKCSAgdGhpcy5fcmVhbGxvYyhsZW5ndGggKiAyKTsKCSAgdmFyIGFyciA9IG5ldyBJbnQxNkFycmF5KHRoaXMuX2J1ZmZlciwgdGhpcy5ieXRlT2Zmc2V0K3RoaXMucG9zaXRpb24sIGxlbmd0aCk7CgkgIERhdGFTdHJlYW0uYXJyYXlUb05hdGl2ZShhcnIsIGUgPT0gbnVsbCA/IHRoaXMuZW5kaWFubmVzcyA6IGUpOwoJICB0aGlzLnBvc2l0aW9uICs9IGxlbmd0aCAqIDI7CgkgIHJldHVybiBhcnI7Cgl9OwoKCS8qKgoJICBNYXBzIGFuIEludDhBcnJheSBpbnRvIHRoZSBEYXRhU3RyZWFtIGJ1ZmZlci4KCgkgIE5pY2UgZm9yIHF1aWNrbHkgcmVhZGluZyBpbiBkYXRhLgoKCSAgQHBhcmFtIHtudW1iZXJ9IGxlbmd0aCBOdW1iZXIgb2YgZWxlbWVudHMgdG8gbWFwLgoJICBAcGFyYW0gez9ib29sZWFufSBlIEVuZGlhbm5lc3Mgb2YgdGhlIGRhdGEgdG8gcmVhZC4KCSAgQHJldHVybiB7T2JqZWN0fSBJbnQ4QXJyYXkgdG8gdGhlIERhdGFTdHJlYW0gYmFja2luZyBidWZmZXIuCgkgICovCglEYXRhU3RyZWFtLnByb3RvdHlwZS5tYXBJbnQ4QXJyYXkgPSBmdW5jdGlvbihsZW5ndGgpIHsKCSAgdGhpcy5fcmVhbGxvYyhsZW5ndGggKiAxKTsKCSAgdmFyIGFyciA9IG5ldyBJbnQ4QXJyYXkodGhpcy5fYnVmZmVyLCB0aGlzLmJ5dGVPZmZzZXQrdGhpcy5wb3NpdGlvbiwgbGVuZ3RoKTsKCSAgdGhpcy5wb3NpdGlvbiArPSBsZW5ndGggKiAxOwoJICByZXR1cm4gYXJyOwoJfTsKCgkvKioKCSAgTWFwcyBhIFVpbnQzMkFycmF5IGludG8gdGhlIERhdGFTdHJlYW0gYnVmZmVyLCBzd2l6emxpbmcgaXQgdG8gbmF0aXZlCgkgIGVuZGlhbm5lc3MgaW4tcGxhY2UuIFRoZSBjdXJyZW50IG9mZnNldCBmcm9tIHRoZSBzdGFydCBvZiB0aGUgYnVmZmVyIG5lZWRzIHRvCgkgIGJlIGEgbXVsdGlwbGUgb2YgZWxlbWVudCBzaXplLCBqdXN0IGxpa2Ugd2l0aCB0eXBlZCBhcnJheSB2aWV3cy4KCgkgIE5pY2UgZm9yIHF1aWNrbHkgcmVhZGluZyBpbiBkYXRhLiBXYXJuaW5nOiBwb3RlbnRpYWxseSBtb2RpZmllcyB0aGUgYnVmZmVyCgkgIGNvbnRlbnRzLgoKCSAgQHBhcmFtIHtudW1iZXJ9IGxlbmd0aCBOdW1iZXIgb2YgZWxlbWVudHMgdG8gbWFwLgoJICBAcGFyYW0gez9ib29sZWFufSBlIEVuZGlhbm5lc3Mgb2YgdGhlIGRhdGEgdG8gcmVhZC4KCSAgQHJldHVybiB7T2JqZWN0fSBVaW50MzJBcnJheSB0byB0aGUgRGF0YVN0cmVhbSBiYWNraW5nIGJ1ZmZlci4KCSAgKi8KCURhdGFTdHJlYW0ucHJvdG90eXBlLm1hcFVpbnQzMkFycmF5ID0gZnVuY3Rpb24obGVuZ3RoLCBlKSB7CgkgIHRoaXMuX3JlYWxsb2MobGVuZ3RoICogNCk7CgkgIHZhciBhcnIgPSBuZXcgVWludDMyQXJyYXkodGhpcy5fYnVmZmVyLCB0aGlzLmJ5dGVPZmZzZXQrdGhpcy5wb3NpdGlvbiwgbGVuZ3RoKTsKCSAgRGF0YVN0cmVhbS5hcnJheVRvTmF0aXZlKGFyciwgZSA9PSBudWxsID8gdGhpcy5lbmRpYW5uZXNzIDogZSk7CgkgIHRoaXMucG9zaXRpb24gKz0gbGVuZ3RoICogNDsKCSAgcmV0dXJuIGFycjsKCX07CgoJLyoqCgkgIE1hcHMgYSBVaW50MTZBcnJheSBpbnRvIHRoZSBEYXRhU3RyZWFtIGJ1ZmZlciwgc3dpenpsaW5nIGl0IHRvIG5hdGl2ZQoJICBlbmRpYW5uZXNzIGluLXBsYWNlLiBUaGUgY3VycmVudCBvZmZzZXQgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIGJ1ZmZlciBuZWVkcyB0bwoJICBiZSBhIG11bHRpcGxlIG9mIGVsZW1lbnQgc2l6ZSwganVzdCBsaWtlIHdpdGggdHlwZWQgYXJyYXkgdmlld3MuCgoJICBOaWNlIGZvciBxdWlja2x5IHJlYWRpbmcgaW4gZGF0YS4gV2FybmluZzogcG90ZW50aWFsbHkgbW9kaWZpZXMgdGhlIGJ1ZmZlcgoJICBjb250ZW50cy4KCgkgIEBwYXJhbSB7bnVtYmVyfSBsZW5ndGggTnVtYmVyIG9mIGVsZW1lbnRzIHRvIG1hcC4KCSAgQHBhcmFtIHs/Ym9vbGVhbn0gZSBFbmRpYW5uZXNzIG9mIHRoZSBkYXRhIHRvIHJlYWQuCgkgIEByZXR1cm4ge09iamVjdH0gVWludDE2QXJyYXkgdG8gdGhlIERhdGFTdHJlYW0gYmFja2luZyBidWZmZXIuCgkgICovCglEYXRhU3RyZWFtLnByb3RvdHlwZS5tYXBVaW50MTZBcnJheSA9IGZ1bmN0aW9uKGxlbmd0aCwgZSkgewoJICB0aGlzLl9yZWFsbG9jKGxlbmd0aCAqIDIpOwoJICB2YXIgYXJyID0gbmV3IFVpbnQxNkFycmF5KHRoaXMuX2J1ZmZlciwgdGhpcy5ieXRlT2Zmc2V0K3RoaXMucG9zaXRpb24sIGxlbmd0aCk7CgkgIERhdGFTdHJlYW0uYXJyYXlUb05hdGl2ZShhcnIsIGUgPT0gbnVsbCA/IHRoaXMuZW5kaWFubmVzcyA6IGUpOwoJICB0aGlzLnBvc2l0aW9uICs9IGxlbmd0aCAqIDI7CgkgIHJldHVybiBhcnI7Cgl9OwoKCS8qKgoJICBNYXBzIGEgRmxvYXQ2NEFycmF5IGludG8gdGhlIERhdGFTdHJlYW0gYnVmZmVyLCBzd2l6emxpbmcgaXQgdG8gbmF0aXZlCgkgIGVuZGlhbm5lc3MgaW4tcGxhY2UuIFRoZSBjdXJyZW50IG9mZnNldCBmcm9tIHRoZSBzdGFydCBvZiB0aGUgYnVmZmVyIG5lZWRzIHRvCgkgIGJlIGEgbXVsdGlwbGUgb2YgZWxlbWVudCBzaXplLCBqdXN0IGxpa2Ugd2l0aCB0eXBlZCBhcnJheSB2aWV3cy4KCgkgIE5pY2UgZm9yIHF1aWNrbHkgcmVhZGluZyBpbiBkYXRhLiBXYXJuaW5nOiBwb3RlbnRpYWxseSBtb2RpZmllcyB0aGUgYnVmZmVyCgkgIGNvbnRlbnRzLgoKCSAgQHBhcmFtIHtudW1iZXJ9IGxlbmd0aCBOdW1iZXIgb2YgZWxlbWVudHMgdG8gbWFwLgoJICBAcGFyYW0gez9ib29sZWFufSBlIEVuZGlhbm5lc3Mgb2YgdGhlIGRhdGEgdG8gcmVhZC4KCSAgQHJldHVybiB7T2JqZWN0fSBGbG9hdDY0QXJyYXkgdG8gdGhlIERhdGFTdHJlYW0gYmFja2luZyBidWZmZXIuCgkgICovCglEYXRhU3RyZWFtLnByb3RvdHlwZS5tYXBGbG9hdDY0QXJyYXkgPSBmdW5jdGlvbihsZW5ndGgsIGUpIHsKCSAgdGhpcy5fcmVhbGxvYyhsZW5ndGggKiA4KTsKCSAgdmFyIGFyciA9IG5ldyBGbG9hdDY0QXJyYXkodGhpcy5fYnVmZmVyLCB0aGlzLmJ5dGVPZmZzZXQrdGhpcy5wb3NpdGlvbiwgbGVuZ3RoKTsKCSAgRGF0YVN0cmVhbS5hcnJheVRvTmF0aXZlKGFyciwgZSA9PSBudWxsID8gdGhpcy5lbmRpYW5uZXNzIDogZSk7CgkgIHRoaXMucG9zaXRpb24gKz0gbGVuZ3RoICogODsKCSAgcmV0dXJuIGFycjsKCX07CgoJLyoqCgkgIE1hcHMgYSBGbG9hdDMyQXJyYXkgaW50byB0aGUgRGF0YVN0cmVhbSBidWZmZXIsIHN3aXp6bGluZyBpdCB0byBuYXRpdmUKCSAgZW5kaWFubmVzcyBpbi1wbGFjZS4gVGhlIGN1cnJlbnQgb2Zmc2V0IGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBidWZmZXIgbmVlZHMgdG8KCSAgYmUgYSBtdWx0aXBsZSBvZiBlbGVtZW50IHNpemUsIGp1c3QgbGlrZSB3aXRoIHR5cGVkIGFycmF5IHZpZXdzLgoKCSAgTmljZSBmb3IgcXVpY2tseSByZWFkaW5nIGluIGRhdGEuIFdhcm5pbmc6IHBvdGVudGlhbGx5IG1vZGlmaWVzIHRoZSBidWZmZXIKCSAgY29udGVudHMuCgoJICBAcGFyYW0ge251bWJlcn0gbGVuZ3RoIE51bWJlciBvZiBlbGVtZW50cyB0byBtYXAuCgkgIEBwYXJhbSB7P2Jvb2xlYW59IGUgRW5kaWFubmVzcyBvZiB0aGUgZGF0YSB0byByZWFkLgoJICBAcmV0dXJuIHtPYmplY3R9IEZsb2F0MzJBcnJheSB0byB0aGUgRGF0YVN0cmVhbSBiYWNraW5nIGJ1ZmZlci4KCSAgKi8KCURhdGFTdHJlYW0ucHJvdG90eXBlLm1hcEZsb2F0MzJBcnJheSA9IGZ1bmN0aW9uKGxlbmd0aCwgZSkgewoJICB0aGlzLl9yZWFsbG9jKGxlbmd0aCAqIDQpOwoJICB2YXIgYXJyID0gbmV3IEZsb2F0MzJBcnJheSh0aGlzLl9idWZmZXIsIHRoaXMuYnl0ZU9mZnNldCt0aGlzLnBvc2l0aW9uLCBsZW5ndGgpOwoJICBEYXRhU3RyZWFtLmFycmF5VG9OYXRpdmUoYXJyLCBlID09IG51bGwgPyB0aGlzLmVuZGlhbm5lc3MgOiBlKTsKCSAgdGhpcy5wb3NpdGlvbiArPSBsZW5ndGggKiA0OwoJICByZXR1cm4gYXJyOwoJfTsKCS8vIGZpbGU6c3JjL2J1ZmZlci5qcwoJLyoqCgkgKiBNdWx0aUJ1ZmZlclN0cmVhbSBpcyBhIGNsYXNzIHRoYXQgYWN0cyBhcyBhIFNpbXBsZVN0cmVhbSBmb3IgcGFyc2luZyAKCSAqIEl0IGhvbGRzIHNldmVyYWwsIHBvc3NpYmx5IG5vbi1jb250aWd1b3VzIEFycmF5QnVmZmVyIG9iamVjdHMsIGVhY2ggd2l0aCBhIGZpbGVTdGFydCBwcm9wZXJ0eSAKCSAqIGNvbnRhaW5pbmcgdGhlIG9mZnNldCBmb3IgdGhlIGJ1ZmZlciBkYXRhIGluIGFuIG9yaWdpbmFsL3ZpcnR1YWwgZmlsZSAKCSAqCgkgKiBJdCBpbmhlcml0cyBhbHNvIGZyb20gRGF0YVN0cmVhbSBmb3IgYWxsIHJlYWQvd3JpdGUvYWxsb2Mgb3BlcmF0aW9ucwoJICovCgoJLyoqCgkgKiBDb25zdHJ1Y3RvcgoJICovCgl2YXIgTXVsdGlCdWZmZXJTdHJlYW0gPSBmdW5jdGlvbihidWZmZXIpIHsKCQkvKiBMaXN0IG9mIEFycmF5QnVmZmVycywgd2l0aCBhIGZpbGVTdGFydCBwcm9wZXJ0eSwgc29ydGVkIGluIGZpbGVTdGFydCBvcmRlciBhbmQgbm9uIG92ZXJsYXBwaW5nICovCgkJdGhpcy5idWZmZXJzID0gW107CQoJCXRoaXMuYnVmZmVySW5kZXggPSAtMTsKCQlpZiAoYnVmZmVyKSB7CgkJCXRoaXMuaW5zZXJ0QnVmZmVyKGJ1ZmZlcik7CgkJCXRoaXMuYnVmZmVySW5kZXggPSAwOwoJCX0KCX07CglNdWx0aUJ1ZmZlclN0cmVhbS5wcm90b3R5cGUgPSBuZXcgRGF0YVN0cmVhbShuZXcgQXJyYXlCdWZmZXIoKSwgMCwgRGF0YVN0cmVhbS5CSUdfRU5ESUFOKTsKCgkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCgkgIE1ldGhvZHMgZm9yIHRoZSBtYW5hZ25lbWVudCBvZiB0aGUgYnVmZmVycyAoaW5zZXJ0aW9uLCByZW1vdmFsLCBjb25jYXRlbmF0aW9uLCAuLi4pCgkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgoJTXVsdGlCdWZmZXJTdHJlYW0ucHJvdG90eXBlLmluaXRpYWxpemVkID0gZnVuY3Rpb24oKSB7CgkJdmFyIGZpcnN0QnVmZmVyOwoJCWlmICh0aGlzLmJ1ZmZlckluZGV4ID4gLTEpIHsKCQkJcmV0dXJuIHRydWU7CgkJfSBlbHNlIGlmICh0aGlzLmJ1ZmZlcnMubGVuZ3RoID4gMCkgewoJCQlmaXJzdEJ1ZmZlciA9IHRoaXMuYnVmZmVyc1swXTsKCQkJaWYgKGZpcnN0QnVmZmVyLmZpbGVTdGFydCA9PT0gMCkgewoJCQkJdGhpcy5idWZmZXIgPSBmaXJzdEJ1ZmZlcjsKCQkJCXRoaXMuYnVmZmVySW5kZXggPSAwOwoJCQkJTG9nLmRlYnVnKCJNdWx0aUJ1ZmZlclN0cmVhbSIsICJTdHJlYW0gcmVhZHkgZm9yIHBhcnNpbmciKTsKCQkJCXJldHVybiB0cnVlOwoJCQl9IGVsc2UgewoJCQkJTG9nLndhcm4oIk11bHRpQnVmZmVyU3RyZWFtIiwgIlRoZSBmaXJzdCBidWZmZXIgc2hvdWxkIGhhdmUgYSBmaWxlU3RhcnQgb2YgMCIpOwoJCQkJdGhpcy5sb2dCdWZmZXJMZXZlbCgpOwoJCQkJcmV0dXJuIGZhbHNlOwoJCQl9CgkJfSBlbHNlIHsKCQkJTG9nLndhcm4oIk11bHRpQnVmZmVyU3RyZWFtIiwgIk5vIGJ1ZmZlciB0byBzdGFydCBwYXJzaW5nIGZyb20iKTsKCQkJdGhpcy5sb2dCdWZmZXJMZXZlbCgpOwoJCQlyZXR1cm4gZmFsc2U7CgkJfQkJCQoJfTsKCgkvKioKCSAqIGhlbHBlciBmdW5jdGlvbnMgdG8gY29uY2F0ZW5hdGUgdHdvIEFycmF5QnVmZmVyIG9iamVjdHMKCSAqIEBwYXJhbSAge0FycmF5QnVmZmVyfSBidWZmZXIxIAoJICogQHBhcmFtICB7QXJyYXlCdWZmZXJ9IGJ1ZmZlcjIgCgkgKiBAcmV0dXJuIHtBcnJheUJ1ZmZlcn0gdGhlIGNvbmNhdGVuYXRpb24gb2YgYnVmZmVyMSBhbmQgYnVmZmVyMiBpbiB0aGF0IG9yZGVyCgkgKi8KCUFycmF5QnVmZmVyLmNvbmNhdCA9IGZ1bmN0aW9uKGJ1ZmZlcjEsIGJ1ZmZlcjIpIHsKCSAgTG9nLmRlYnVnKCJBcnJheUJ1ZmZlciIsICJUcnlpbmcgdG8gY3JlYXRlIGEgbmV3IGJ1ZmZlciBvZiBzaXplOiAiKyhidWZmZXIxLmJ5dGVMZW5ndGggKyBidWZmZXIyLmJ5dGVMZW5ndGgpKTsKCSAgdmFyIHRtcCA9IG5ldyBVaW50OEFycmF5KGJ1ZmZlcjEuYnl0ZUxlbmd0aCArIGJ1ZmZlcjIuYnl0ZUxlbmd0aCk7CgkgIHRtcC5zZXQobmV3IFVpbnQ4QXJyYXkoYnVmZmVyMSksIDApOwoJICB0bXAuc2V0KG5ldyBVaW50OEFycmF5KGJ1ZmZlcjIpLCBidWZmZXIxLmJ5dGVMZW5ndGgpOwoJICByZXR1cm4gdG1wLmJ1ZmZlcjsKCX07CgoJLyoqCgkgKiBSZWR1Y2VzIHRoZSBzaXplIG9mIGEgZ2l2ZW4gYnVmZmVyLCBidXQgdGFraW5nIHRoZSBwYXJ0IGJldHdlZW4gb2Zmc2V0IGFuZCBvZmZzZXQrbmV3bGVuZ3RoCgkgKiBAcGFyYW0gIHtBcnJheUJ1ZmZlcn0gYnVmZmVyICAgIAoJICogQHBhcmFtICB7TnVtYmVyfSAgICAgIG9mZnNldCAgICB0aGUgc3RhcnQgb2YgbmV3IGJ1ZmZlcgoJICogQHBhcmFtICB7TnVtYmVyfSAgICAgIG5ld0xlbmd0aCB0aGUgbGVuZ3RoIG9mIHRoZSBuZXcgYnVmZmVyCgkgKiBAcmV0dXJuIHtBcnJheUJ1ZmZlcn0gICAgICAgICAgIHRoZSBuZXcgYnVmZmVyCgkgKi8KCU11bHRpQnVmZmVyU3RyZWFtLnByb3RvdHlwZS5yZWR1Y2VCdWZmZXIgPSBmdW5jdGlvbihidWZmZXIsIG9mZnNldCwgbmV3TGVuZ3RoKSB7CgkJdmFyIHNtYWxsQjsKCQlzbWFsbEIgPSBuZXcgVWludDhBcnJheShuZXdMZW5ndGgpOwoJCXNtYWxsQi5zZXQobmV3IFVpbnQ4QXJyYXkoYnVmZmVyLCBvZmZzZXQsIG5ld0xlbmd0aCkpOwoJCXNtYWxsQi5idWZmZXIuZmlsZVN0YXJ0ID0gYnVmZmVyLmZpbGVTdGFydCtvZmZzZXQ7CgkJc21hbGxCLmJ1ZmZlci51c2VkQnl0ZXMgPSAwOwoJCXJldHVybiBzbWFsbEIuYnVmZmVyOwkKCX07CgoJLyoqCgkgKiBJbnNlcnRzIHRoZSBuZXcgYnVmZmVyIGluIHRoZSBzb3J0ZWQgbGlzdCBvZiBidWZmZXJzLAoJICogIG1ha2luZyBzdXJlLCBpdCBpcyBub3Qgb3ZlcmxhcHBpbmcgd2l0aCBleGlzdGluZyBvbmVzIChwb3NzaWJseSByZWR1Y2luZyBpdHMgc2l6ZSkuCgkgKiAgaWYgdGhlIG5ldyBidWZmZXIgb3ZlcnJpZGVzL3JlcGxhY2VzIHRoZSAwLXRoIGJ1ZmZlciAoZm9yIGluc3RhbmNlIGJlY2F1c2UgaXQgaXMgYmlnZ2VyKSwgCgkgKiAgdXBkYXRlcyB0aGUgRGF0YVN0cmVhbSBidWZmZXIgZm9yIHBhcnNpbmcgCgkqLwoJTXVsdGlCdWZmZXJTdHJlYW0ucHJvdG90eXBlLmluc2VydEJ1ZmZlciA9IGZ1bmN0aW9uKGFiKSB7CQoJCXZhciB0b19hZGQgPSB0cnVlOwoJCS8qIFRPRE86IGltcHJvdmUgaW5zZXJ0aW9uIGlmIG1hbnkgYnVmZmVycyAqLwoJCWZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5idWZmZXJzLmxlbmd0aDsgaSsrKSB7CgkJCXZhciBiID0gdGhpcy5idWZmZXJzW2ldOwoJCQlpZiAoYWIuZmlsZVN0YXJ0IDw9IGIuZmlsZVN0YXJ0KSB7CgkJCQkvKiB0aGUgaW5zZXJ0aW9uIHBvc2l0aW9uIGlzIGZvdW5kICovCgkJCQlpZiAoYWIuZmlsZVN0YXJ0ID09PSBiLmZpbGVTdGFydCkgewoJCQkJCS8qIFRoZSBuZXcgYnVmZmVyIG92ZXJsYXBzIHdpdGggYW4gZXhpc3RpbmcgYnVmZmVyICovCgkJCQkJaWYgKGFiLmJ5dGVMZW5ndGggPiAgYi5ieXRlTGVuZ3RoKSB7CgkJCQkJCS8qIHRoZSBuZXcgYnVmZmVyIGlzIGJpZ2dlciB0aGFuIHRoZSBleGlzdGluZyBvbmUKCQkJCQkJICAgcmVtb3ZlIHRoZSBleGlzdGluZyBidWZmZXIgYW5kIHRyeSBhZ2FpbiB0byBpbnNlcnQgCgkJCQkJCSAgIHRoZSBuZXcgYnVmZmVyIHRvIGNoZWNrIG92ZXJsYXAgd2l0aCB0aGUgbmV4dCBvbmVzICovCgkJCQkJCXRoaXMuYnVmZmVycy5zcGxpY2UoaSwgMSk7CgkJCQkJCWktLTsgCgkJCQkJCWNvbnRpbnVlOwoJCQkJCX0gZWxzZSB7CgkJCQkJCS8qIHRoZSBuZXcgYnVmZmVyIGlzIHNtYWxsZXIgdGhhbiB0aGUgZXhpc3Rpbmcgb25lLCBqdXN0IGRyb3AgaXQgKi8KCQkJCQkJTG9nLndhcm4oIk11bHRpQnVmZmVyU3RyZWFtIiwgIkJ1ZmZlciAoZmlsZVN0YXJ0OiAiK2FiLmZpbGVTdGFydCsiIC0gTGVuZ3RoOiAiK2FiLmJ5dGVMZW5ndGgrIikgYWxyZWFkeSBhcHBlbmRlZCwgaWdub3JpbmciKTsKCQkJCQl9CgkJCQl9IGVsc2UgewoJCQkJCS8qIFRoZSBiZWdpbm5pbmcgb2YgdGhlIG5ldyBidWZmZXIgaXMgbm90IG92ZXJsYXBwaW5nIHdpdGggYW4gZXhpc3RpbmcgYnVmZmVyCgkJCQkJICAgbGV0J3MgY2hlY2sgdGhlIGVuZCBvZiBpdCAqLwoJCQkJCWlmIChhYi5maWxlU3RhcnQgKyBhYi5ieXRlTGVuZ3RoIDw9IGIuZmlsZVN0YXJ0KSA7IGVsc2UgewoJCQkJCQkvKiBUaGVyZSBpcyBzb21lIG92ZXJsYXAsIGN1dCB0aGUgbmV3IGJ1ZmZlciBzaG9ydCwgYW5kIGFkZCBpdCovCgkJCQkJCWFiID0gdGhpcy5yZWR1Y2VCdWZmZXIoYWIsIDAsIGIuZmlsZVN0YXJ0IC0gYWIuZmlsZVN0YXJ0KTsKCQkJCQl9CgkJCQkJTG9nLmRlYnVnKCJNdWx0aUJ1ZmZlclN0cmVhbSIsICJBcHBlbmRpbmcgbmV3IGJ1ZmZlciAoZmlsZVN0YXJ0OiAiK2FiLmZpbGVTdGFydCsiIC0gTGVuZ3RoOiAiK2FiLmJ5dGVMZW5ndGgrIikiKTsKCQkJCQl0aGlzLmJ1ZmZlcnMuc3BsaWNlKGksIDAsIGFiKTsKCQkJCQkvKiBpZiB0aGlzIG5ldyBidWZmZXIgaXMgaW5zZXJ0ZWQgaW4gdGhlIGZpcnN0IHBsYWNlIGluIHRoZSBsaXN0IG9mIHRoZSBidWZmZXIsIAoJCQkJCSAgIGFuZCB0aGUgRGF0YVN0cmVhbSBpcyBpbml0aWFsaXplZCwgbWFrZSBpdCB0aGUgYnVmZmVyIHVzZWQgZm9yIHBhcnNpbmcgKi8KCQkJCQlpZiAoaSA9PT0gMCkgewoJCQkJCQl0aGlzLmJ1ZmZlciA9IGFiOwoJCQkJCX0KCQkJCX0KCQkJCXRvX2FkZCA9IGZhbHNlOwoJCQkJYnJlYWs7CgkJCX0gZWxzZSBpZiAoYWIuZmlsZVN0YXJ0IDwgYi5maWxlU3RhcnQgKyBiLmJ5dGVMZW5ndGgpIHsKCQkJCS8qIHRoZSBuZXcgYnVmZmVyIG92ZXJsYXBzIGl0cyBiZWdpbm5pbmcgd2l0aCB0aGUgZW5kIG9mIHRoZSBjdXJyZW50IGJ1ZmZlciAqLwoJCQkJdmFyIG9mZnNldCA9IGIuZmlsZVN0YXJ0ICsgYi5ieXRlTGVuZ3RoIC0gYWIuZmlsZVN0YXJ0OwoJCQkJdmFyIG5ld0xlbmd0aCA9IGFiLmJ5dGVMZW5ndGggLSBvZmZzZXQ7CgkJCQlpZiAobmV3TGVuZ3RoID4gMCkgewoJCQkJCS8qIHRoZSBuZXcgYnVmZmVyIGlzIGJpZ2dlciB0aGFuIHRoZSBjdXJyZW50IG92ZXJsYXAsIGRyb3AgdGhlIG92ZXJsYXBwaW5nIHBhcnQgYW5kIHRyeSBhZ2FpbiBpbnNlcnRpbmcgdGhlIHJlbWFpbmluZyBidWZmZXIgKi8KCQkJCQlhYiA9IHRoaXMucmVkdWNlQnVmZmVyKGFiLCBvZmZzZXQsIG5ld0xlbmd0aCk7CgkJCQl9IGVsc2UgewoJCQkJCS8qIHRoZSBjb250ZW50IG9mIHRoZSBuZXcgYnVmZmVyIGlzIGVudGlyZWx5IGNvbnRhaW5lZCBpbiB0aGUgZXhpc3RpbmcgYnVmZmVyLCBkcm9wIGl0IGVudGlyZWx5ICovCgkJCQkJdG9fYWRkID0gZmFsc2U7CgkJCQkJYnJlYWs7CgkJCQl9CgkJCX0KCQl9CgkJLyogaWYgdGhlIGJ1ZmZlciBoYXMgbm90IGJlZW4gYWRkZWQsIHdlIGNhbiBhZGQgaXQgYXQgdGhlIGVuZCAqLwoJCWlmICh0b19hZGQpIHsKCQkJTG9nLmRlYnVnKCJNdWx0aUJ1ZmZlclN0cmVhbSIsICJBcHBlbmRpbmcgbmV3IGJ1ZmZlciAoZmlsZVN0YXJ0OiAiK2FiLmZpbGVTdGFydCsiIC0gTGVuZ3RoOiAiK2FiLmJ5dGVMZW5ndGgrIikiKTsKCQkJdGhpcy5idWZmZXJzLnB1c2goYWIpOwoJCQkvKiBpZiB0aGlzIG5ldyBidWZmZXIgaXMgaW5zZXJ0ZWQgaW4gdGhlIGZpcnN0IHBsYWNlIGluIHRoZSBsaXN0IG9mIHRoZSBidWZmZXIsIAoJCQkgICBhbmQgdGhlIERhdGFTdHJlYW0gaXMgaW5pdGlhbGl6ZWQsIG1ha2UgaXQgdGhlIGJ1ZmZlciB1c2VkIGZvciBwYXJzaW5nICovCgkJCWlmIChpID09PSAwKSB7CgkJCQl0aGlzLmJ1ZmZlciA9IGFiOwoJCQl9CgkJfQoJfTsKCgkvKioKCSAqIERpc3BsYXlzIHRoZSBzdGF0dXMgb2YgdGhlIGJ1ZmZlcnMgKG51bWJlciBhbmQgdXNlZCBieXRlcykKCSAqIEBwYXJhbSAge09iamVjdH0gaW5mbyBjYWxsYmFjayBtZXRob2QgZm9yIGRpc3BsYXkKCSAqLwoJTXVsdGlCdWZmZXJTdHJlYW0ucHJvdG90eXBlLmxvZ0J1ZmZlckxldmVsID0gZnVuY3Rpb24oaW5mbykgewoJCXZhciBpOwoJCXZhciBidWZmZXI7CgkJdmFyIHVzZWQsIHRvdGFsOwoJCXZhciByYW5nZXMgPSBbXTsKCQl2YXIgcmFuZ2U7CgkJdmFyIGJ1ZmZlcmVkU3RyaW5nID0gIiI7CgkJdXNlZCA9IDA7CgkJdG90YWwgPSAwOwoJCWZvciAoaSA9IDA7IGkgPCB0aGlzLmJ1ZmZlcnMubGVuZ3RoOyBpKyspIHsKCQkJYnVmZmVyID0gdGhpcy5idWZmZXJzW2ldOwoJCQlpZiAoaSA9PT0gMCkgewoJCQkJcmFuZ2UgPSB7fTsKCQkJCXJhbmdlcy5wdXNoKHJhbmdlKTsKCQkJCXJhbmdlLnN0YXJ0ID0gYnVmZmVyLmZpbGVTdGFydDsKCQkJCXJhbmdlLmVuZCA9IGJ1ZmZlci5maWxlU3RhcnQrYnVmZmVyLmJ5dGVMZW5ndGg7CgkJCQlidWZmZXJlZFN0cmluZyArPSAiWyIrcmFuZ2Uuc3RhcnQrIi0iOwoJCQl9IGVsc2UgaWYgKHJhbmdlLmVuZCA9PT0gYnVmZmVyLmZpbGVTdGFydCkgewoJCQkJcmFuZ2UuZW5kID0gYnVmZmVyLmZpbGVTdGFydCtidWZmZXIuYnl0ZUxlbmd0aDsKCQkJfSBlbHNlIHsKCQkJCXJhbmdlID0ge307CgkJCQlyYW5nZS5zdGFydCA9IGJ1ZmZlci5maWxlU3RhcnQ7CgkJCQlidWZmZXJlZFN0cmluZyArPSAocmFuZ2VzW3Jhbmdlcy5sZW5ndGgtMV0uZW5kLTEpKyJdLCBbIityYW5nZS5zdGFydCsiLSI7CgkJCQlyYW5nZS5lbmQgPSBidWZmZXIuZmlsZVN0YXJ0K2J1ZmZlci5ieXRlTGVuZ3RoOwoJCQkJcmFuZ2VzLnB1c2gocmFuZ2UpOwoJCQl9CgkJCXVzZWQgKz0gYnVmZmVyLnVzZWRCeXRlczsKCQkJdG90YWwgKz0gYnVmZmVyLmJ5dGVMZW5ndGg7CgkJfQoJCWlmIChyYW5nZXMubGVuZ3RoID4gMCkgewoJCQlidWZmZXJlZFN0cmluZyArPSAocmFuZ2UuZW5kLTEpKyJdIjsKCQl9CgkJdmFyIGxvZyA9IChpbmZvID8gTG9nLmluZm8gOiBMb2cuZGVidWcpOwoJCWlmICh0aGlzLmJ1ZmZlcnMubGVuZ3RoID09PSAwKSB7CgkJCWxvZygiTXVsdGlCdWZmZXJTdHJlYW0iLCAiTm8gbW9yZSBidWZmZXIgaW4gbWVtb3J5Iik7CgkJfSBlbHNlIHsKCQkJbG9nKCJNdWx0aUJ1ZmZlclN0cmVhbSIsICIiK3RoaXMuYnVmZmVycy5sZW5ndGgrIiBzdG9yZWQgYnVmZmVyKHMpICgiK3VzZWQrIi8iK3RvdGFsKyIgYnl0ZXMpLCBjb250aW51b3VzIHJhbmdlczogIitidWZmZXJlZFN0cmluZyk7CgkJfQoJfTsKCglNdWx0aUJ1ZmZlclN0cmVhbS5wcm90b3R5cGUuY2xlYW5CdWZmZXJzID0gZnVuY3Rpb24gKCkgewoJCXZhciBpOwoJCXZhciBidWZmZXI7CgkJZm9yIChpID0gMDsgaSA8IHRoaXMuYnVmZmVycy5sZW5ndGg7IGkrKykgewoJCQlidWZmZXIgPSB0aGlzLmJ1ZmZlcnNbaV07CgkJCWlmIChidWZmZXIudXNlZEJ5dGVzID09PSBidWZmZXIuYnl0ZUxlbmd0aCkgewoJCQkJTG9nLmRlYnVnKCJNdWx0aUJ1ZmZlclN0cmVhbSIsICJSZW1vdmluZyBidWZmZXIgIyIraSk7CgkJCQl0aGlzLmJ1ZmZlcnMuc3BsaWNlKGksIDEpOwoJCQkJaS0tOwoJCQl9CgkJfQoJfTsKCglNdWx0aUJ1ZmZlclN0cmVhbS5wcm90b3R5cGUubWVyZ2VOZXh0QnVmZmVyID0gZnVuY3Rpb24oKSB7CgkJdmFyIG5leHRfYnVmZmVyOwoJCWlmICh0aGlzLmJ1ZmZlckluZGV4KzEgPCB0aGlzLmJ1ZmZlcnMubGVuZ3RoKSB7CgkJCW5leHRfYnVmZmVyID0gdGhpcy5idWZmZXJzW3RoaXMuYnVmZmVySW5kZXgrMV07CgkJCWlmIChuZXh0X2J1ZmZlci5maWxlU3RhcnQgPT09IHRoaXMuYnVmZmVyLmZpbGVTdGFydCArIHRoaXMuYnVmZmVyLmJ5dGVMZW5ndGgpIHsKCQkJCXZhciBvbGRMZW5ndGggPSB0aGlzLmJ1ZmZlci5ieXRlTGVuZ3RoOwoJCQkJdmFyIG9sZFVzZWRCeXRlcyA9IHRoaXMuYnVmZmVyLnVzZWRCeXRlczsKCQkJCXZhciBvbGRGaWxlU3RhcnQgPSB0aGlzLmJ1ZmZlci5maWxlU3RhcnQ7CgkJCQl0aGlzLmJ1ZmZlcnNbdGhpcy5idWZmZXJJbmRleF0gPSBBcnJheUJ1ZmZlci5jb25jYXQodGhpcy5idWZmZXIsIG5leHRfYnVmZmVyKTsKCQkJCXRoaXMuYnVmZmVyID0gdGhpcy5idWZmZXJzW3RoaXMuYnVmZmVySW5kZXhdOwoJCQkJdGhpcy5idWZmZXJzLnNwbGljZSh0aGlzLmJ1ZmZlckluZGV4KzEsIDEpOwoJCQkJdGhpcy5idWZmZXIudXNlZEJ5dGVzID0gb2xkVXNlZEJ5dGVzOyAvKiBUT0RPOiBzaG91bGQgaXQgYmUgKz0gPyAqLwoJCQkJdGhpcy5idWZmZXIuZmlsZVN0YXJ0ID0gb2xkRmlsZVN0YXJ0OwoJCQkJTG9nLmRlYnVnKCJJU09GaWxlIiwgIkNvbmNhdGVuYXRpbmcgYnVmZmVyIGZvciBib3ggcGFyc2luZyAobGVuZ3RoOiAiK29sZExlbmd0aCsiLT4iK3RoaXMuYnVmZmVyLmJ5dGVMZW5ndGgrIikiKTsKCQkJCXJldHVybiB0cnVlOwoJCQl9IGVsc2UgewoJCQkJcmV0dXJuIGZhbHNlOwoJCQl9CgkJfSBlbHNlIHsKCQkJcmV0dXJuIGZhbHNlOwoJCX0KCX07CgoKCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCgkgIFNlZWstcmVsYXRlZCBmdW5jdGlvbnMKCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKCS8qKgoJICogRmluZHMgdGhlIGJ1ZmZlciB0aGF0IGhvbGRzIHRoZSBnaXZlbiBmaWxlIHBvc2l0aW9uCgkgKiBAcGFyYW0gIHtCb29sZWFufSBmcm9tU3RhcnQgICAgaW5kaWNhdGVzIGlmIHRoZSBzZWFyY2ggc2hvdWxkIHN0YXJ0IGZyb20gdGhlIGN1cnJlbnQgYnVmZmVyIChmYWxzZSkgCgkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgZnJvbSB0aGUgZmlyc3QgYnVmZmVyICh0cnVlKQoJICogQHBhcmFtICB7TnVtYmVyfSAgZmlsZVBvc2l0aW9uIHBvc2l0aW9uIGluIHRoZSBmaWxlIHRvIHNlZWsgdG8KCSAqIEBwYXJhbSAge0Jvb2xlYW59IG1hcmtBc1VzZWQgICBpbmRpY2F0ZXMgaWYgdGhlIGJ5dGVzIGluIGJldHdlZW4gdGhlIGN1cnJlbnQgcG9zaXRpb24gYW5kIHRoZSBzZWVrIHBvc2l0aW9uIAoJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3VsZCBiZSBtYXJrZWQgYXMgdXNlZCBmb3IgZ2FyYmFnZSBjb2xsZWN0aW9uCgkgKiBAcmV0dXJuIHtOdW1iZXJ9ICAgICAgICAgICAgICAgdGhlIGluZGV4IG9mIHRoZSBidWZmZXIgaG9sZGluZyB0aGUgc2Vla2VkIGZpbGUgcG9zaXRpb24sIC0xIGlmIG5vdCBmb3VuZC4KCSAqLwoJTXVsdGlCdWZmZXJTdHJlYW0ucHJvdG90eXBlLmZpbmRQb3NpdGlvbiA9IGZ1bmN0aW9uKGZyb21TdGFydCwgZmlsZVBvc2l0aW9uLCBtYXJrQXNVc2VkKSB7CgkJdmFyIGk7CgkJdmFyIGFidWZmZXIgPSBudWxsOwoJCXZhciBpbmRleCA9IC0xOwoKCQkvKiBmaW5kIHRoZSBidWZmZXIgd2l0aCB0aGUgbGFyZ2VzdCBwb3NpdGlvbiBzbWFsbGVyIHRoYW4gdGhlIGdpdmVuIHBvc2l0aW9uICovCgkJaWYgKGZyb21TdGFydCA9PT0gdHJ1ZSkgewoJCSAgIC8qIHRoZSByZXBvc2l0aW9uIGNhbiBiZSBpbiB0aGUgcGFzdCwgd2UgbmVlZCB0byBjaGVjayBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGxpc3Qgb2YgYnVmZmVycyAqLwoJCQlpID0gMDsKCQl9IGVsc2UgewoJCQlpID0gdGhpcy5idWZmZXJJbmRleDsKCQl9CgoJCXdoaWxlIChpIDwgdGhpcy5idWZmZXJzLmxlbmd0aCkgewoJCQlhYnVmZmVyID0gdGhpcy5idWZmZXJzW2ldOwoJCQlpZiAoYWJ1ZmZlci5maWxlU3RhcnQgPD0gZmlsZVBvc2l0aW9uKSB7CgkJCQlpbmRleCA9IGk7CgkJCQlpZiAobWFya0FzVXNlZCkgewoJCQkJCWlmIChhYnVmZmVyLmZpbGVTdGFydCArIGFidWZmZXIuYnl0ZUxlbmd0aCA8PSBmaWxlUG9zaXRpb24pIHsKCQkJCQkJYWJ1ZmZlci51c2VkQnl0ZXMgPSBhYnVmZmVyLmJ5dGVMZW5ndGg7CQoJCQkJCX0gZWxzZSB7CgkJCQkJCWFidWZmZXIudXNlZEJ5dGVzID0gZmlsZVBvc2l0aW9uIC0gYWJ1ZmZlci5maWxlU3RhcnQ7CgkJCQkJfQkJCgkJCQkJdGhpcy5sb2dCdWZmZXJMZXZlbCgpOwkKCQkJCX0KCQkJfSBlbHNlIHsKCQkJCWJyZWFrOwoJCQl9CgkJCWkrKzsKCQl9CgoJCWlmIChpbmRleCAhPT0gLTEpIHsKCQkJYWJ1ZmZlciA9IHRoaXMuYnVmZmVyc1tpbmRleF07CgkJCWlmIChhYnVmZmVyLmZpbGVTdGFydCArIGFidWZmZXIuYnl0ZUxlbmd0aCA+PSBmaWxlUG9zaXRpb24pIHsJCQkKCQkJCUxvZy5kZWJ1ZygiTXVsdGlCdWZmZXJTdHJlYW0iLCAiRm91bmQgcG9zaXRpb24gaW4gZXhpc3RpbmcgYnVmZmVyICMiK2luZGV4KTsKCQkJCXJldHVybiBpbmRleDsKCQkJfSBlbHNlIHsKCQkJCXJldHVybiAtMTsKCQkJfQoJCX0gZWxzZSB7CgkJCXJldHVybiAtMTsKCQl9Cgl9OwoKCS8qKgoJICogRmluZHMgdGhlIGxhcmdlc3QgZmlsZSBwb3NpdGlvbiBjb250YWluZWQgaW4gYSBidWZmZXIgb3IgaW4gdGhlIG5leHQgYnVmZmVycyBpZiB0aGV5IGFyZSBjb250aWd1b3VzIChubyBnYXApCgkgKiBzdGFydGluZyBmcm9tIHRoZSBnaXZlbiBidWZmZXIgaW5kZXggb3IgZnJvbSB0aGUgY3VycmVudCBidWZmZXIgaWYgdGhlIGluZGV4IGlzIG5vdCBnaXZlbgoJICoKCSAqIEBwYXJhbSAge051bWJlcn0gaW5wdXRpbmRleCBJbmRleCBvZiB0aGUgYnVmZmVyIHRvIHN0YXJ0IGZyb20KCSAqIEByZXR1cm4ge051bWJlcn0gICAgICAgICAgICBUaGUgbGFyZ2VzdCBmaWxlIHBvc2l0aW9uIGZvdW5kIGluIHRoZSBidWZmZXJzCgkgKi8KCU11bHRpQnVmZmVyU3RyZWFtLnByb3RvdHlwZS5maW5kRW5kQ29udGlndW91c0J1ZiA9IGZ1bmN0aW9uKGlucHV0aW5kZXgpIHsKCQl2YXIgaTsKCQl2YXIgY3VycmVudEJ1ZjsKCQl2YXIgbmV4dEJ1ZjsKCQl2YXIgaW5kZXggPSAoaW5wdXRpbmRleCAhPT0gdW5kZWZpbmVkID8gaW5wdXRpbmRleCA6IHRoaXMuYnVmZmVySW5kZXgpOwoJCWN1cnJlbnRCdWYgPSB0aGlzLmJ1ZmZlcnNbaW5kZXhdOwoJCS8qIGZpbmQgdGhlIGVuZCBvZiB0aGUgY29udGlndW91cyByYW5nZSBvZiBkYXRhICovCgkJaWYgKHRoaXMuYnVmZmVycy5sZW5ndGggPiBpbmRleCsxKSB7CgkJCWZvciAoaSA9IGluZGV4KzE7IGkgPCB0aGlzLmJ1ZmZlcnMubGVuZ3RoOyBpKyspIHsKCQkJCW5leHRCdWYgPSB0aGlzLmJ1ZmZlcnNbaV07CgkJCQlpZiAobmV4dEJ1Zi5maWxlU3RhcnQgPT09IGN1cnJlbnRCdWYuZmlsZVN0YXJ0ICsgY3VycmVudEJ1Zi5ieXRlTGVuZ3RoKSB7CgkJCQkJY3VycmVudEJ1ZiA9IG5leHRCdWY7CgkJCQl9IGVsc2UgewoJCQkJCWJyZWFrOwoJCQkJfQoJCQl9CgkJfQoJCS8qIHJldHVybiB0aGUgcG9zaXRpb24gb2YgbGFzdCBieXRlIGluIHRoZSBmaWxlIHRoYXQgd2UgaGF2ZSAqLwoJCXJldHVybiBjdXJyZW50QnVmLmZpbGVTdGFydCArIGN1cnJlbnRCdWYuYnl0ZUxlbmd0aDsKCX07CgoJLyoqCgkgKiBSZXR1cm5zIHRoZSBsYXJnZXN0IGZpbGUgcG9zaXRpb24gY29udGFpbmVkIGluIHRoZSBidWZmZXJzLCBsYXJnZXIgdGhhbiB0aGUgZ2l2ZW4gcG9zaXRpb24KCSAqIEBwYXJhbSAge051bWJlcn0gcG9zIHRoZSBmaWxlIHBvc2l0aW9uIHRvIHN0YXJ0IGZyb20KCSAqIEByZXR1cm4ge051bWJlcn0gICAgIHRoZSBsYXJnZXN0IHBvc2l0aW9uIGluIHRoZSBjdXJyZW50IGJ1ZmZlciBvciBpbiB0aGUgYnVmZmVyIGFuZCB0aGUgbmV4dCBjb250aWd1b3VzIAoJICogICAgICAgICAgICAgICAgICAgICAgYnVmZmVyIHRoYXQgaG9sZHMgdGhlIGdpdmVuIHBvc2l0aW9uCgkgKi8KCU11bHRpQnVmZmVyU3RyZWFtLnByb3RvdHlwZS5nZXRFbmRGaWxlUG9zaXRpb25BZnRlciA9IGZ1bmN0aW9uKHBvcykgewoJCXZhciBpbmRleCA9IHRoaXMuZmluZFBvc2l0aW9uKHRydWUsIHBvcywgZmFsc2UpOwoJCWlmIChpbmRleCAhPT0gLTEpIHsKCQkJcmV0dXJuIHRoaXMuZmluZEVuZENvbnRpZ3VvdXNCdWYoaW5kZXgpOwoJCX0gZWxzZSB7CgkJCXJldHVybiBwb3M7CgkJfQoJfTsKCgkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoJICBHYXJiYWdlIGNvbGxlY3Rpb24gcmVsYXRlZCBmdW5jdGlvbnMKCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKCS8qKgoJICogTWFya3MgYSBnaXZlbiBudW1iZXIgb2YgYnl0ZXMgYXMgdXNlZCBpbiB0aGUgY3VycmVudCBidWZmZXIgZm9yIGdhcmJhZ2UgY29sbGVjdGlvbgoJICogQHBhcmFtIHtOdW1iZXJ9IG5iQnl0ZXMgCgkgKi8KCU11bHRpQnVmZmVyU3RyZWFtLnByb3RvdHlwZS5hZGRVc2VkQnl0ZXMgPSBmdW5jdGlvbihuYkJ5dGVzKSB7CgkJdGhpcy5idWZmZXIudXNlZEJ5dGVzICs9IG5iQnl0ZXM7CgkJdGhpcy5sb2dCdWZmZXJMZXZlbCgpOwoJfTsKCgkvKioKCSAqIE1hcmtzIHRoZSBlbnRpcmUgY3VycmVudCBidWZmZXIgYXMgdXNlZCwgcmVhZHkgZm9yIGdhcmJhZ2UgY29sbGVjdGlvbgoJICovCglNdWx0aUJ1ZmZlclN0cmVhbS5wcm90b3R5cGUuc2V0QWxsVXNlZEJ5dGVzID0gZnVuY3Rpb24oKSB7CgkJdGhpcy5idWZmZXIudXNlZEJ5dGVzID0gdGhpcy5idWZmZXIuYnl0ZUxlbmd0aDsKCQl0aGlzLmxvZ0J1ZmZlckxldmVsKCk7Cgl9OwoKCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCgkgIENvbW1vbiBBUEkgYmV0d2VlbiBNdWx0aUJ1ZmZlclN0cmVhbSBhbmQgU2ltcGxlU3RyZWFtCgkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCgkvKioKCSAqIFRyaWVzIHRvIHNlZWsgdG8gYSBnaXZlbiBmaWxlIHBvc2l0aW9uCgkgKiBpZiBwb3NzaWJsZSwgcmVwb3NpdGlvbnMgdGhlIHBhcnNpbmcgZnJvbSB0aGVyZSBhbmQgcmV0dXJucyB0cnVlIAoJICogaWYgbm90IHBvc3NpYmxlLCBkb2VzIG5vdCBjaGFuZ2UgYW55dGhpbmcgYW5kIHJldHVybnMgZmFsc2UgCgkgKiBAcGFyYW0gIHtOdW1iZXJ9ICBmaWxlUG9zaXRpb24gcG9zaXRpb24gaW4gdGhlIGZpbGUgdG8gc2VlayB0bwoJICogQHBhcmFtICB7Qm9vbGVhbn0gZnJvbVN0YXJ0ICAgIGluZGljYXRlcyBpZiB0aGUgc2VhcmNoIHNob3VsZCBzdGFydCBmcm9tIHRoZSBjdXJyZW50IGJ1ZmZlciAoZmFsc2UpIAoJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIGZyb20gdGhlIGZpcnN0IGJ1ZmZlciAodHJ1ZSkKCSAqIEBwYXJhbSAge0Jvb2xlYW59IG1hcmtBc1VzZWQgICBpbmRpY2F0ZXMgaWYgdGhlIGJ5dGVzIGluIGJldHdlZW4gdGhlIGN1cnJlbnQgcG9zaXRpb24gYW5kIHRoZSBzZWVrIHBvc2l0aW9uIAoJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3VsZCBiZSBtYXJrZWQgYXMgdXNlZCBmb3IgZ2FyYmFnZSBjb2xsZWN0aW9uCgkgKiBAcmV0dXJuIHtCb29sZWFufSAgICAgICAgICAgICAgdHJ1ZSBpZiB0aGUgc2VlayBzdWNjZWVkZWQsIGZhbHNlIG90aGVyd2lzZQoJICovCglNdWx0aUJ1ZmZlclN0cmVhbS5wcm90b3R5cGUuc2VlayA9IGZ1bmN0aW9uKGZpbGVQb3NpdGlvbiwgZnJvbVN0YXJ0LCBtYXJrQXNVc2VkKSB7CgkJdmFyIGluZGV4OwoJCWluZGV4ID0gdGhpcy5maW5kUG9zaXRpb24oZnJvbVN0YXJ0LCBmaWxlUG9zaXRpb24sIG1hcmtBc1VzZWQpOwoJCWlmIChpbmRleCAhPT0gLTEpIHsKCQkJdGhpcy5idWZmZXIgPSB0aGlzLmJ1ZmZlcnNbaW5kZXhdOwoJCQl0aGlzLmJ1ZmZlckluZGV4ID0gaW5kZXg7CgkJCXRoaXMucG9zaXRpb24gPSBmaWxlUG9zaXRpb24gLSB0aGlzLmJ1ZmZlci5maWxlU3RhcnQ7CgkJCUxvZy5kZWJ1ZygiTXVsdGlCdWZmZXJTdHJlYW0iLCAiUmVwb3NpdGlvbmluZyBwYXJzZXIgYXQgYnVmZmVyIHBvc2l0aW9uOiAiK3RoaXMucG9zaXRpb24pOwoJCQlyZXR1cm4gdHJ1ZTsKCQl9IGVsc2UgewoJCQlMb2cuZGVidWcoIk11bHRpQnVmZmVyU3RyZWFtIiwgIlBvc2l0aW9uICIrZmlsZVBvc2l0aW9uKyIgbm90IGZvdW5kIGluIGJ1ZmZlcmVkIGRhdGEiKTsKCQkJcmV0dXJuIGZhbHNlOwoJCX0KCX07CgoJLyoqCgkgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHBvc2l0aW9uIGluIHRoZSBmaWxlCgkgKiBAcmV0dXJuIHtOdW1iZXJ9IHRoZSBwb3NpdGlvbiBpbiB0aGUgZmlsZQoJICovCglNdWx0aUJ1ZmZlclN0cmVhbS5wcm90b3R5cGUuZ2V0UG9zaXRpb24gPSBmdW5jdGlvbigpIHsKCQlpZiAodGhpcy5idWZmZXJJbmRleCA9PT0gLTEgfHwgdGhpcy5idWZmZXJzW3RoaXMuYnVmZmVySW5kZXhdID09PSBudWxsKSB7CgkJCXRocm93ICJFcnJvciBhY2Nlc3NpbmcgcG9zaXRpb24gaW4gdGhlIE11bHRpQnVmZmVyU3RyZWFtIjsKCQl9CgkJcmV0dXJuIHRoaXMuYnVmZmVyc1t0aGlzLmJ1ZmZlckluZGV4XS5maWxlU3RhcnQrdGhpcy5wb3NpdGlvbjsKCX07CgoJLyoqCgkgKiBSZXR1cm5zIHRoZSBsZW5ndGggb2YgdGhlIGN1cnJlbnQgYnVmZmVyCgkgKiBAcmV0dXJuIHtOdW1iZXJ9IHRoZSBsZW5ndGggb2YgdGhlIGN1cnJlbnQgYnVmZmVyCgkgKi8KCU11bHRpQnVmZmVyU3RyZWFtLnByb3RvdHlwZS5nZXRMZW5ndGggPSBmdW5jdGlvbigpIHsKCQlyZXR1cm4gdGhpcy5ieXRlTGVuZ3RoOwoJfTsKCglNdWx0aUJ1ZmZlclN0cmVhbS5wcm90b3R5cGUuZ2V0RW5kUG9zaXRpb24gPSBmdW5jdGlvbigpIHsKCQlpZiAodGhpcy5idWZmZXJJbmRleCA9PT0gLTEgfHwgdGhpcy5idWZmZXJzW3RoaXMuYnVmZmVySW5kZXhdID09PSBudWxsKSB7CgkJCXRocm93ICJFcnJvciBhY2Nlc3NpbmcgcG9zaXRpb24gaW4gdGhlIE11bHRpQnVmZmVyU3RyZWFtIjsKCQl9CgkJcmV0dXJuIHRoaXMuYnVmZmVyc1t0aGlzLmJ1ZmZlckluZGV4XS5maWxlU3RhcnQrdGhpcy5ieXRlTGVuZ3RoOwoJfTsKCgl7CgkJZXhwb3J0cyQxLk11bHRpQnVmZmVyU3RyZWFtID0gTXVsdGlCdWZmZXJTdHJlYW07Cgl9Ly8gZmlsZTpzcmMvZGVzY3JpcHRvci5qcwoJLyoKCSAqIENvcHlyaWdodCAoYykgMjAxMi0yMDEzLiBUZWxlY29tIFBhcmlzVGVjaC9UU0kvTU0vR1BBQyBDeXJpbCBDb25jb2xhdG8KCSAqIExpY2Vuc2U6IEJTRC0zLUNsYXVzZSAoc2VlIExJQ0VOU0UgZmlsZSkKCSAqLwoJdmFyIE1QRUc0RGVzY3JpcHRvclBhcnNlciA9IGZ1bmN0aW9uICgpIHsKCQl2YXIgRVNfRGVzY3JUYWcgCQkJPSAweDAzOwoJCXZhciBEZWNvZGVyQ29uZmlnRGVzY3JUYWcgCT0gMHgwNDsKCQl2YXIgRGVjU3BlY2lmaWNJbmZvVGFnIAkJPSAweDA1OwoJCXZhciBTTENvbmZpZ0Rlc2NyVGFnIAkJPSAweDA2OwoKCQl2YXIgZGVzY1RhZ1RvTmFtZSA9IFtdOwoJCWRlc2NUYWdUb05hbWVbRVNfRGVzY3JUYWddIAkJCQk9ICJFU19EZXNjcmlwdG9yIjsKCQlkZXNjVGFnVG9OYW1lW0RlY29kZXJDb25maWdEZXNjclRhZ10gCT0gIkRlY29kZXJDb25maWdEZXNjcmlwdG9yIjsKCQlkZXNjVGFnVG9OYW1lW0RlY1NwZWNpZmljSW5mb1RhZ10gCQk9ICJEZWNvZGVyU3BlY2lmaWNJbmZvIjsKCQlkZXNjVGFnVG9OYW1lW1NMQ29uZmlnRGVzY3JUYWddIAkJPSAiU0xDb25maWdEZXNjcmlwdG9yIjsKCgkJdGhpcy5nZXREZXNjcmlwdG9yTmFtZSA9IGZ1bmN0aW9uKHRhZykgewoJCQlyZXR1cm4gZGVzY1RhZ1RvTmFtZVt0YWddOwoJCX07CgoJCXZhciB0aGF0ID0gdGhpczsKCQl2YXIgY2xhc3NlcyA9IHt9OwoKCQl0aGlzLnBhcnNlT25lRGVzY3JpcHRvciA9IGZ1bmN0aW9uIChzdHJlYW0pIHsKCQkJdmFyIHNpemUgPSAwOwoJCQl2YXIgdGFnOwoJCQl2YXIgZGVzYzsKCQkJdmFyIGJ5dGVSZWFkOwoJCQl0YWcgPSBzdHJlYW0ucmVhZFVpbnQ4KCk7CgkJCWJ5dGVSZWFkID0gc3RyZWFtLnJlYWRVaW50OCgpOwoJCQl3aGlsZSAoYnl0ZVJlYWQgJiAweDgwKSB7CgkJCQlzaXplID0gKGJ5dGVSZWFkICYgMHg3Rik8PDc7CgkJCQlieXRlUmVhZCA9IHN0cmVhbS5yZWFkVWludDgoKTsKCQkJfQoJCQlzaXplICs9IGJ5dGVSZWFkICYgMHg3RjsKCQkJTG9nLmRlYnVnKCJNUEVHNERlc2NyaXB0b3JQYXJzZXIiLCAiRm91bmQgIisoZGVzY1RhZ1RvTmFtZVt0YWddIHx8ICJEZXNjcmlwdG9yICIrdGFnKSsiLCBzaXplICIrc2l6ZSsiIGF0IHBvc2l0aW9uICIrc3RyZWFtLmdldFBvc2l0aW9uKCkpOwoJCQlpZiAoZGVzY1RhZ1RvTmFtZVt0YWddKSB7CgkJCQlkZXNjID0gbmV3IGNsYXNzZXNbZGVzY1RhZ1RvTmFtZVt0YWddXShzaXplKTsKCQkJfSBlbHNlIHsKCQkJCWRlc2MgPSBuZXcgY2xhc3Nlcy5EZXNjcmlwdG9yKHNpemUpOwoJCQl9CgkJCWRlc2MucGFyc2Uoc3RyZWFtKTsKCQkJcmV0dXJuIGRlc2M7CgkJfTsKCgkJY2xhc3Nlcy5EZXNjcmlwdG9yID0gZnVuY3Rpb24oX3RhZywgX3NpemUpIHsKCQkJdGhpcy50YWcgPSBfdGFnOwoJCQl0aGlzLnNpemUgPSBfc2l6ZTsKCQkJdGhpcy5kZXNjcyA9IFtdOwoJCX07CgoJCWNsYXNzZXMuRGVzY3JpcHRvci5wcm90b3R5cGUucGFyc2UgPSBmdW5jdGlvbiAoc3RyZWFtKSB7CgkJCXRoaXMuZGF0YSA9IHN0cmVhbS5yZWFkVWludDhBcnJheSh0aGlzLnNpemUpOwoJCX07CgoJCWNsYXNzZXMuRGVzY3JpcHRvci5wcm90b3R5cGUuZmluZERlc2NyaXB0b3IgPSBmdW5jdGlvbiAodGFnKSB7CgkJCWZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5kZXNjcy5sZW5ndGg7IGkrKykgewoJCQkJaWYgKHRoaXMuZGVzY3NbaV0udGFnID09IHRhZykgewoJCQkJCXJldHVybiB0aGlzLmRlc2NzW2ldOwoJCQkJfQoJCQl9CgkJCXJldHVybiBudWxsOwoJCX07CgoJCWNsYXNzZXMuRGVzY3JpcHRvci5wcm90b3R5cGUucGFyc2VSZW1haW5pbmdEZXNjcmlwdG9ycyA9IGZ1bmN0aW9uIChzdHJlYW0pIHsKCQkJdmFyIHN0YXJ0ID0gc3RyZWFtLnBvc2l0aW9uOwoJCQl3aGlsZSAoc3RyZWFtLnBvc2l0aW9uIDwgc3RhcnQrdGhpcy5zaXplKSB7CgkJCQl2YXIgZGVzYyA9IHRoYXQucGFyc2VPbmVEZXNjcmlwdG9yKHN0cmVhbSk7CgkJCQl0aGlzLmRlc2NzLnB1c2goZGVzYyk7CgkJCX0KCQl9OwoKCQljbGFzc2VzLkVTX0Rlc2NyaXB0b3IgPSBmdW5jdGlvbiAoc2l6ZSkgewoJCQljbGFzc2VzLkRlc2NyaXB0b3IuY2FsbCh0aGlzLCBFU19EZXNjclRhZywgc2l6ZSk7CgkJfTsKCgkJY2xhc3Nlcy5FU19EZXNjcmlwdG9yLnByb3RvdHlwZSA9IG5ldyBjbGFzc2VzLkRlc2NyaXB0b3IoKTsKCgkJY2xhc3Nlcy5FU19EZXNjcmlwdG9yLnByb3RvdHlwZS5wYXJzZSA9IGZ1bmN0aW9uKHN0cmVhbSkgewoJCQl0aGlzLkVTX0lEID0gc3RyZWFtLnJlYWRVaW50MTYoKTsKCQkJdGhpcy5mbGFncyA9IHN0cmVhbS5yZWFkVWludDgoKTsKCQkJdGhpcy5zaXplIC09IDM7CgkJCWlmICh0aGlzLmZsYWdzICYgMHg4MCkgewoJCQkJdGhpcy5kZXBlbmRzT25fRVNfSUQgPSBzdHJlYW0ucmVhZFVpbnQxNigpOwoJCQkJdGhpcy5zaXplIC09IDI7CgkJCX0gZWxzZSB7CgkJCQl0aGlzLmRlcGVuZHNPbl9FU19JRCA9IDA7CgkJCX0KCQkJaWYgKHRoaXMuZmxhZ3MgJiAweDQwKSB7CgkJCQl2YXIgbCA9IHN0cmVhbS5yZWFkVWludDgoKTsKCQkJCXRoaXMuVVJMID0gc3RyZWFtLnJlYWRTdHJpbmcobCk7CgkJCQl0aGlzLnNpemUgLT0gbCsxOwoJCQl9IGVsc2UgewoJCQkJdGhpcy5VUkwgPSAiIjsKCQkJfQoJCQlpZiAodGhpcy5mbGFncyAmIDB4MjApIHsKCQkJCXRoaXMuT0NSX0VTX0lEID0gc3RyZWFtLnJlYWRVaW50MTYoKTsKCQkJCXRoaXMuc2l6ZSAtPSAyOwoJCQl9IGVsc2UgewoJCQkJdGhpcy5PQ1JfRVNfSUQgPSAwOwoJCQl9CgkJCXRoaXMucGFyc2VSZW1haW5pbmdEZXNjcmlwdG9ycyhzdHJlYW0pOwoJCX07CgoJCWNsYXNzZXMuRVNfRGVzY3JpcHRvci5wcm90b3R5cGUuZ2V0T1RJID0gZnVuY3Rpb24oc3RyZWFtKSB7CgkJCXZhciBkY2QgPSB0aGlzLmZpbmREZXNjcmlwdG9yKERlY29kZXJDb25maWdEZXNjclRhZyk7CgkJCWlmIChkY2QpIHsKCQkJCXJldHVybiBkY2Qub3RpOwoJCQl9IGVsc2UgewoJCQkJcmV0dXJuIDA7CgkJCX0KCQl9OwoKCQljbGFzc2VzLkVTX0Rlc2NyaXB0b3IucHJvdG90eXBlLmdldEF1ZGlvQ29uZmlnID0gZnVuY3Rpb24oc3RyZWFtKSB7CgkJCXZhciBkY2QgPSB0aGlzLmZpbmREZXNjcmlwdG9yKERlY29kZXJDb25maWdEZXNjclRhZyk7CgkJCWlmICghZGNkKSByZXR1cm4gbnVsbDsKCQkJdmFyIGRzaSA9IGRjZC5maW5kRGVzY3JpcHRvcihEZWNTcGVjaWZpY0luZm9UYWcpOwoJCQlpZiAoZHNpICYmIGRzaS5kYXRhKSB7CgkJCQl2YXIgYXVkaW9PYmplY3RUeXBlID0gKGRzaS5kYXRhWzBdJiAweEY4KSA+PiAzOwoJCQkJaWYgKGF1ZGlvT2JqZWN0VHlwZSA9PT0gMzEgJiYgZHNpLmRhdGEubGVuZ3RoID49IDIpIHsKCQkJCQlhdWRpb09iamVjdFR5cGUgPSAzMiArICgoZHNpLmRhdGFbMF0gJiAweDcpIDw8IDMpICsgKChkc2kuZGF0YVsxXSAmIDB4RTApID4+IDUpOwoJCQkJfQoJCQkJcmV0dXJuIGF1ZGlvT2JqZWN0VHlwZTsKCQkJfSBlbHNlIHsKCQkJCXJldHVybiBudWxsOwoJCQl9CgkJfTsKCgkJY2xhc3Nlcy5EZWNvZGVyQ29uZmlnRGVzY3JpcHRvciA9IGZ1bmN0aW9uIChzaXplKSB7CgkJCWNsYXNzZXMuRGVzY3JpcHRvci5jYWxsKHRoaXMsIERlY29kZXJDb25maWdEZXNjclRhZywgc2l6ZSk7CgkJfTsKCQljbGFzc2VzLkRlY29kZXJDb25maWdEZXNjcmlwdG9yLnByb3RvdHlwZSA9IG5ldyBjbGFzc2VzLkRlc2NyaXB0b3IoKTsKCgkJY2xhc3Nlcy5EZWNvZGVyQ29uZmlnRGVzY3JpcHRvci5wcm90b3R5cGUucGFyc2UgPSBmdW5jdGlvbihzdHJlYW0pIHsKCQkJdGhpcy5vdGkgPSBzdHJlYW0ucmVhZFVpbnQ4KCk7CgkJCXRoaXMuc3RyZWFtVHlwZSA9IHN0cmVhbS5yZWFkVWludDgoKTsKCQkJdGhpcy5idWZmZXJTaXplID0gc3RyZWFtLnJlYWRVaW50MjQoKTsKCQkJdGhpcy5tYXhCaXRyYXRlID0gc3RyZWFtLnJlYWRVaW50MzIoKTsKCQkJdGhpcy5hdmdCaXRyYXRlID0gc3RyZWFtLnJlYWRVaW50MzIoKTsKCQkJdGhpcy5zaXplIC09IDEzOwoJCQl0aGlzLnBhcnNlUmVtYWluaW5nRGVzY3JpcHRvcnMoc3RyZWFtKTsKCQl9OwoKCQljbGFzc2VzLkRlY29kZXJTcGVjaWZpY0luZm8gPSBmdW5jdGlvbiAoc2l6ZSkgewoJCQljbGFzc2VzLkRlc2NyaXB0b3IuY2FsbCh0aGlzLCBEZWNTcGVjaWZpY0luZm9UYWcsIHNpemUpOwoJCX07CgkJY2xhc3Nlcy5EZWNvZGVyU3BlY2lmaWNJbmZvLnByb3RvdHlwZSA9IG5ldyBjbGFzc2VzLkRlc2NyaXB0b3IoKTsKCgkJY2xhc3Nlcy5TTENvbmZpZ0Rlc2NyaXB0b3IgPSBmdW5jdGlvbiAoc2l6ZSkgewoJCQljbGFzc2VzLkRlc2NyaXB0b3IuY2FsbCh0aGlzLCBTTENvbmZpZ0Rlc2NyVGFnLCBzaXplKTsKCQl9OwoJCWNsYXNzZXMuU0xDb25maWdEZXNjcmlwdG9yLnByb3RvdHlwZSA9IG5ldyBjbGFzc2VzLkRlc2NyaXB0b3IoKTsKCgkJcmV0dXJuIHRoaXM7Cgl9OwoKCXsKCQlleHBvcnRzJDEuTVBFRzREZXNjcmlwdG9yUGFyc2VyID0gTVBFRzREZXNjcmlwdG9yUGFyc2VyOwoJfS8vIGZpbGU6c3JjL2JveC5qcwoJLyoKCSAqIENvcHlyaWdodCAoYykgMjAxMi0yMDEzLiBUZWxlY29tIFBhcmlzVGVjaC9UU0kvTU0vR1BBQyBDeXJpbCBDb25jb2xhdG8KCSAqIExpY2Vuc2U6IEJTRC0zLUNsYXVzZSAoc2VlIExJQ0VOU0UgZmlsZSkKCSAqLwoJdmFyIEJveFBhcnNlciA9IHsKCQlFUlJfSU5WQUxJRF9EQVRBIDogLTEsCgkJRVJSX05PVF9FTk9VR0hfREFUQSA6IDAsCgkJT0sgOiAxLAoKCQkvLyBCb3hlcyB0byBiZSBjcmVhdGVkIHdpdGggZGVmYXVsdCBwYXJzaW5nCgkJQkFTSUNfQk9YRVM6IFsgIm1kYXQiLCAiaWRhdCIsICJmcmVlIiwgInNraXAiLCAibWVjbyIsICJzdHJrIiBdLAoJCUZVTExfQk9YRVM6IFsgImhtaGQiLCAibm1oZCIsICJpb2RzIiwgInhtbCAiLCAiYnhtbCIsICJpcHJvIiwgIm1lcmUiIF0sCgkJQ09OVEFJTkVSX0JPWEVTOiBbCgkJCVsgIm1vb3YiLCBbICJ0cmFrIiwgInBzc2giIF0gXSwKCQkJWyAidHJhayIgXSwKCQkJWyAiZWR0cyIgXSwKCQkJWyAibWRpYSIgXSwKCQkJWyAibWluZiIgXSwKCQkJWyAiZGluZiIgXSwKCQkJWyAic3RibCIsIFsgInNncGQiLCAic2JncCIgXSBdLAoJCQlbICJtdmV4IiwgWyAidHJleCIgXSBdLAoJCQlbICJtb29mIiwgWyAidHJhZiIgXSBdLAoJCQlbICJ0cmFmIiwgWyAidHJ1biIsICJzZ3BkIiwgInNiZ3AiIF0gXSwKCQkJWyAidnR0YyIgXSwKCQkJWyAidHJlZiIgXSwKCQkJWyAiaXJlZiIgXSwKCQkJWyAibWZyYSIsIFsgInRmcmEiIF0gXSwKCQkJWyAibWVjbyIgXSwKCQkJWyAiaG50aSIgXSwKCQkJWyAiaGluZiIgXSwKCQkJWyAic3RyayIgXSwKCQkJWyAic3RyZCIgXSwKCQkJWyAic2luZiIgXSwKCQkJWyAicmluZiIgXSwKCQkJWyAic2NoaSIgXSwKCQkJWyAidHJnciIgXSwKCQkJWyAidWR0YSIsIFsia2luZCJdIF0sCgkJCVsgImlwcnAiLCBbImlwbWEiXSBdLAoJCQlbICJpcGNvIl0KCQldLAoJCS8vIEJveGVzIGVmZmVjdGl2ZWx5IGNyZWF0ZWQKCQlib3hDb2RlcyA6IFtdLAoJCWZ1bGxCb3hDb2RlcyA6IFtdLAoJCWNvbnRhaW5lckJveENvZGVzIDogW10sCgkJc2FtcGxlRW50cnlDb2RlcyA6IHt9LAoJCXNhbXBsZUdyb3VwRW50cnlDb2RlczogW10sCgkJdHJhY2tHcm91cFR5cGVzOiBbXSwKCQlVVUlEQm94ZXM6IHt9LAoJCVVVSURzOiBbXSwKCQlpbml0aWFsaXplOiBmdW5jdGlvbigpIHsKCQkJQm94UGFyc2VyLkZ1bGxCb3gucHJvdG90eXBlID0gbmV3IEJveFBhcnNlci5Cb3goKTsKCQkJQm94UGFyc2VyLkNvbnRhaW5lckJveC5wcm90b3R5cGUgPSBuZXcgQm94UGFyc2VyLkJveCgpOwoJCQlCb3hQYXJzZXIuU2FtcGxlRW50cnkucHJvdG90eXBlID0gbmV3IEJveFBhcnNlci5Cb3goKTsKCQkJQm94UGFyc2VyLlRyYWNrR3JvdXBUeXBlQm94LnByb3RvdHlwZSA9IG5ldyBCb3hQYXJzZXIuRnVsbEJveCgpOwoKCQkJLyogY3JlYXRpbmcgY29uc3RydWN0b3JzIGZvciBzaW1wbGUgYm94ZXMgKi8KCQkJQm94UGFyc2VyLkJBU0lDX0JPWEVTLmZvckVhY2goZnVuY3Rpb24odHlwZSkgewoJCQkJQm94UGFyc2VyLmNyZWF0ZUJveEN0b3IodHlwZSk7CgkJCX0pOwoJCQlCb3hQYXJzZXIuRlVMTF9CT1hFUy5mb3JFYWNoKGZ1bmN0aW9uKHR5cGUpIHsKCQkJCUJveFBhcnNlci5jcmVhdGVGdWxsQm94Q3Rvcih0eXBlKTsKCQkJfSk7CgkJCUJveFBhcnNlci5DT05UQUlORVJfQk9YRVMuZm9yRWFjaChmdW5jdGlvbih0eXBlcykgewoJCQkJQm94UGFyc2VyLmNyZWF0ZUNvbnRhaW5lckJveEN0b3IodHlwZXNbMF0sIG51bGwsIHR5cGVzWzFdKTsKCQkJfSk7CgkJfSwKCQlCb3g6IGZ1bmN0aW9uKF90eXBlLCBfc2l6ZSwgX3V1aWQpIHsKCQkJdGhpcy50eXBlID0gX3R5cGU7CgkJCXRoaXMuc2l6ZSA9IF9zaXplOwoJCQl0aGlzLnV1aWQgPSBfdXVpZDsKCQl9LAoJCUZ1bGxCb3g6IGZ1bmN0aW9uKHR5cGUsIHNpemUsIHV1aWQpIHsKCQkJQm94UGFyc2VyLkJveC5jYWxsKHRoaXMsIHR5cGUsIHNpemUsIHV1aWQpOwoJCQl0aGlzLmZsYWdzID0gMDsKCQkJdGhpcy52ZXJzaW9uID0gMDsKCQl9LAoJCUNvbnRhaW5lckJveDogZnVuY3Rpb24odHlwZSwgc2l6ZSwgdXVpZCkgewoJCQlCb3hQYXJzZXIuQm94LmNhbGwodGhpcywgdHlwZSwgc2l6ZSwgdXVpZCk7CgkJCXRoaXMuYm94ZXMgPSBbXTsKCQl9LAoJCVNhbXBsZUVudHJ5OiBmdW5jdGlvbih0eXBlLCBzaXplLCBoZHJfc2l6ZSwgc3RhcnQpIHsKCQkJQm94UGFyc2VyLkNvbnRhaW5lckJveC5jYWxsKHRoaXMsIHR5cGUsIHNpemUpOwoJCQl0aGlzLmhkcl9zaXplID0gaGRyX3NpemU7CgkJCXRoaXMuc3RhcnQgPSBzdGFydDsKCQl9LAoJCVNhbXBsZUdyb3VwRW50cnk6IGZ1bmN0aW9uKHR5cGUpIHsKCQkJdGhpcy5ncm91cGluZ190eXBlID0gdHlwZTsKCQl9LAoJCVRyYWNrR3JvdXBUeXBlQm94OiBmdW5jdGlvbih0eXBlLCBzaXplKSB7CgkJCUJveFBhcnNlci5GdWxsQm94LmNhbGwodGhpcywgdHlwZSwgc2l6ZSk7CgkJfSwKCQljcmVhdGVCb3hDdG9yOiBmdW5jdGlvbih0eXBlLCBwYXJzZU1ldGhvZCl7CgkJCUJveFBhcnNlci5ib3hDb2Rlcy5wdXNoKHR5cGUpOwoJCQlCb3hQYXJzZXJbdHlwZSsiQm94Il0gPSBmdW5jdGlvbihzaXplKSB7CgkJCQlCb3hQYXJzZXIuQm94LmNhbGwodGhpcywgdHlwZSwgc2l6ZSk7CgkJCX07CgkJCUJveFBhcnNlclt0eXBlKyJCb3giXS5wcm90b3R5cGUgPSBuZXcgQm94UGFyc2VyLkJveCgpOwoJCQlpZiAocGFyc2VNZXRob2QpIEJveFBhcnNlclt0eXBlKyJCb3giXS5wcm90b3R5cGUucGFyc2UgPSBwYXJzZU1ldGhvZDsKCQl9LAoJCWNyZWF0ZUZ1bGxCb3hDdG9yOiBmdW5jdGlvbih0eXBlLCBwYXJzZU1ldGhvZCkgewoJCQkvL0JveFBhcnNlci5mdWxsQm94Q29kZXMucHVzaCh0eXBlKTsKCQkJQm94UGFyc2VyW3R5cGUrIkJveCJdID0gZnVuY3Rpb24oc2l6ZSkgewoJCQkJQm94UGFyc2VyLkZ1bGxCb3guY2FsbCh0aGlzLCB0eXBlLCBzaXplKTsKCQkJfTsKCQkJQm94UGFyc2VyW3R5cGUrIkJveCJdLnByb3RvdHlwZSA9IG5ldyBCb3hQYXJzZXIuRnVsbEJveCgpOwoJCQlCb3hQYXJzZXJbdHlwZSsiQm94Il0ucHJvdG90eXBlLnBhcnNlID0gZnVuY3Rpb24oc3RyZWFtKSB7CgkJCQl0aGlzLnBhcnNlRnVsbEhlYWRlcihzdHJlYW0pOwoJCQkJaWYgKHBhcnNlTWV0aG9kKSB7CgkJCQkJcGFyc2VNZXRob2QuY2FsbCh0aGlzLCBzdHJlYW0pOwoJCQkJfQoJCQl9OwoJCX0sCgkJYWRkU3ViQm94QXJyYXlzOiBmdW5jdGlvbihzdWJCb3hOYW1lcykgewoJCQlpZiAoc3ViQm94TmFtZXMpIHsKCQkJCXRoaXMuc3ViQm94TmFtZXMgPSBzdWJCb3hOYW1lczsKCQkJCXZhciBuYlN1YkJveGVzID0gc3ViQm94TmFtZXMubGVuZ3RoOwoJCQkJZm9yICh2YXIgayA9IDA7IGs8bmJTdWJCb3hlczsgaysrKSB7CgkJCQkJdGhpc1tzdWJCb3hOYW1lc1trXSsicyJdID0gW107CgkJCQl9CgkJCX0KCQl9LAoJCWNyZWF0ZUNvbnRhaW5lckJveEN0b3I6IGZ1bmN0aW9uKHR5cGUsIHBhcnNlTWV0aG9kLCBzdWJCb3hOYW1lcykgewoJCQkvL0JveFBhcnNlci5jb250YWluZXJCb3hDb2Rlcy5wdXNoKHR5cGUpOwoJCQlCb3hQYXJzZXJbdHlwZSsiQm94Il0gPSBmdW5jdGlvbihzaXplKSB7CgkJCQlCb3hQYXJzZXIuQ29udGFpbmVyQm94LmNhbGwodGhpcywgdHlwZSwgc2l6ZSk7CgkJCQlCb3hQYXJzZXIuYWRkU3ViQm94QXJyYXlzLmNhbGwodGhpcywgc3ViQm94TmFtZXMpOwoJCQl9OwoJCQlCb3hQYXJzZXJbdHlwZSsiQm94Il0ucHJvdG90eXBlID0gbmV3IEJveFBhcnNlci5Db250YWluZXJCb3goKTsKCQkJaWYgKHBhcnNlTWV0aG9kKSBCb3hQYXJzZXJbdHlwZSsiQm94Il0ucHJvdG90eXBlLnBhcnNlID0gcGFyc2VNZXRob2Q7CgkJfSwKCQljcmVhdGVNZWRpYVNhbXBsZUVudHJ5Q3RvcjogZnVuY3Rpb24obWVkaWFUeXBlLCBwYXJzZU1ldGhvZCwgc3ViQm94TmFtZXMpIHsKCQkJQm94UGFyc2VyLnNhbXBsZUVudHJ5Q29kZXNbbWVkaWFUeXBlXSA9IFtdOwoJCQlCb3hQYXJzZXJbbWVkaWFUeXBlKyJTYW1wbGVFbnRyeSJdID0gZnVuY3Rpb24odHlwZSwgc2l6ZSkgewoJCQkJQm94UGFyc2VyLlNhbXBsZUVudHJ5LmNhbGwodGhpcywgdHlwZSwgc2l6ZSk7CgkJCQlCb3hQYXJzZXIuYWRkU3ViQm94QXJyYXlzLmNhbGwodGhpcywgc3ViQm94TmFtZXMpOwoJCQl9OwoJCQlCb3hQYXJzZXJbbWVkaWFUeXBlKyJTYW1wbGVFbnRyeSJdLnByb3RvdHlwZSA9IG5ldyBCb3hQYXJzZXIuU2FtcGxlRW50cnkoKTsKCQkJaWYgKHBhcnNlTWV0aG9kKSBCb3hQYXJzZXJbbWVkaWFUeXBlKyJTYW1wbGVFbnRyeSJdLnByb3RvdHlwZSAucGFyc2UgPSBwYXJzZU1ldGhvZDsKCQl9LAoJCWNyZWF0ZVNhbXBsZUVudHJ5Q3RvcjogZnVuY3Rpb24obWVkaWFUeXBlLCB0eXBlLCBwYXJzZU1ldGhvZCwgc3ViQm94TmFtZXMpIHsKCQkJQm94UGFyc2VyLnNhbXBsZUVudHJ5Q29kZXNbbWVkaWFUeXBlXS5wdXNoKHR5cGUpOwoJCQlCb3hQYXJzZXJbdHlwZSsiU2FtcGxlRW50cnkiXSA9IGZ1bmN0aW9uKHNpemUpIHsKCQkJCUJveFBhcnNlclttZWRpYVR5cGUrIlNhbXBsZUVudHJ5Il0uY2FsbCh0aGlzLCB0eXBlLCBzaXplKTsKCQkJCUJveFBhcnNlci5hZGRTdWJCb3hBcnJheXMuY2FsbCh0aGlzLCBzdWJCb3hOYW1lcyk7CgkJCX07CgkJCUJveFBhcnNlclt0eXBlKyJTYW1wbGVFbnRyeSJdLnByb3RvdHlwZSA9IG5ldyBCb3hQYXJzZXJbbWVkaWFUeXBlKyJTYW1wbGVFbnRyeSJdKCk7CgkJCWlmIChwYXJzZU1ldGhvZCkgQm94UGFyc2VyW3R5cGUrIlNhbXBsZUVudHJ5Il0ucHJvdG90eXBlLnBhcnNlID0gcGFyc2VNZXRob2Q7CgkJfSwKCQljcmVhdGVFbmNyeXB0ZWRTYW1wbGVFbnRyeUN0b3I6IGZ1bmN0aW9uKG1lZGlhVHlwZSwgdHlwZSwgcGFyc2VNZXRob2QpIHsKCQkJQm94UGFyc2VyLmNyZWF0ZVNhbXBsZUVudHJ5Q3Rvci5jYWxsKHRoaXMsIG1lZGlhVHlwZSwgdHlwZSwgcGFyc2VNZXRob2QsIFsic2luZiJdKTsKCQl9LAoJCWNyZWF0ZVNhbXBsZUdyb3VwQ3RvcjogZnVuY3Rpb24odHlwZSwgcGFyc2VNZXRob2QpIHsKCQkJLy9Cb3hQYXJzZXIuc2FtcGxlR3JvdXBFbnRyeUNvZGVzLnB1c2godHlwZSk7CgkJCUJveFBhcnNlclt0eXBlKyJTYW1wbGVHcm91cEVudHJ5Il0gPSBmdW5jdGlvbihzaXplKSB7CgkJCQlCb3hQYXJzZXIuU2FtcGxlR3JvdXBFbnRyeS5jYWxsKHRoaXMsIHR5cGUsIHNpemUpOwoJCQl9OwoJCQlCb3hQYXJzZXJbdHlwZSsiU2FtcGxlR3JvdXBFbnRyeSJdLnByb3RvdHlwZSA9IG5ldyBCb3hQYXJzZXIuU2FtcGxlR3JvdXBFbnRyeSgpOwoJCQlpZiAocGFyc2VNZXRob2QpIEJveFBhcnNlclt0eXBlKyJTYW1wbGVHcm91cEVudHJ5Il0ucHJvdG90eXBlLnBhcnNlID0gcGFyc2VNZXRob2Q7CgkJfSwKCQljcmVhdGVUcmFja0dyb3VwQ3RvcjogZnVuY3Rpb24odHlwZSwgcGFyc2VNZXRob2QpIHsKCQkJLy9Cb3hQYXJzZXIudHJhY2tHcm91cFR5cGVzLnB1c2godHlwZSk7CgkJCUJveFBhcnNlclt0eXBlKyJUcmFja0dyb3VwVHlwZUJveCJdID0gZnVuY3Rpb24oc2l6ZSkgewoJCQkJQm94UGFyc2VyLlRyYWNrR3JvdXBUeXBlQm94LmNhbGwodGhpcywgdHlwZSwgc2l6ZSk7CgkJCX07CgkJCUJveFBhcnNlclt0eXBlKyJUcmFja0dyb3VwVHlwZUJveCJdLnByb3RvdHlwZSA9IG5ldyBCb3hQYXJzZXIuVHJhY2tHcm91cFR5cGVCb3goKTsKCQkJaWYgKHBhcnNlTWV0aG9kKSBCb3hQYXJzZXJbdHlwZSsiVHJhY2tHcm91cFR5cGVCb3giXS5wcm90b3R5cGUucGFyc2UgPSBwYXJzZU1ldGhvZDsKCQl9LAoJCWNyZWF0ZVVVSURCb3g6IGZ1bmN0aW9uKHV1aWQsIGlzRnVsbEJveCwgaXNDb250YWluZXJCb3gsIHBhcnNlTWV0aG9kKSB7CgkJCUJveFBhcnNlci5VVUlEcy5wdXNoKHV1aWQpOwoJCQlCb3hQYXJzZXIuVVVJREJveGVzW3V1aWRdID0gZnVuY3Rpb24oc2l6ZSkgewoJCQkJaWYgKGlzRnVsbEJveCkgewoJCQkJCUJveFBhcnNlci5GdWxsQm94LmNhbGwodGhpcywgInV1aWQiLCBzaXplLCB1dWlkKTsKCQkJCX0gZWxzZSB7CgkJCQkJaWYgKGlzQ29udGFpbmVyQm94KSB7CgkJCQkJCUJveFBhcnNlci5Db250YWluZXJCb3guY2FsbCh0aGlzLCAidXVpZCIsIHNpemUsIHV1aWQpOwoJCQkJCX0gZWxzZSB7CgkJCQkJCUJveFBhcnNlci5Cb3guY2FsbCh0aGlzLCAidXVpZCIsIHNpemUsIHV1aWQpOwoJCQkJCX0KCQkJCX0KCQkJfTsKCQkJQm94UGFyc2VyLlVVSURCb3hlc1t1dWlkXS5wcm90b3R5cGUgPSAoaXNGdWxsQm94ID8gbmV3IEJveFBhcnNlci5GdWxsQm94KCkgOiAoaXNDb250YWluZXJCb3ggPyBuZXcgQm94UGFyc2VyLkNvbnRhaW5lckJveCgpIDogbmV3IEJveFBhcnNlci5Cb3goKSkpOwoJCQlpZiAocGFyc2VNZXRob2QpIHsKCQkJCWlmIChpc0Z1bGxCb3gpIHsKCQkJCQlCb3hQYXJzZXIuVVVJREJveGVzW3V1aWRdLnByb3RvdHlwZS5wYXJzZSA9IGZ1bmN0aW9uKHN0cmVhbSkgewoJCQkJCQl0aGlzLnBhcnNlRnVsbEhlYWRlcihzdHJlYW0pOwoJCQkJCQlpZiAocGFyc2VNZXRob2QpIHsKCQkJCQkJCXBhcnNlTWV0aG9kLmNhbGwodGhpcywgc3RyZWFtKTsKCQkJCQkJfQoJCQkJCX07CgkJCQl9IGVsc2UgewoJCQkJCUJveFBhcnNlci5VVUlEQm94ZXNbdXVpZF0ucHJvdG90eXBlLnBhcnNlID0gcGFyc2VNZXRob2Q7CgkJCQl9CgkJCX0KCQl9Cgl9OwoKCUJveFBhcnNlci5pbml0aWFsaXplKCk7CgoJQm94UGFyc2VyLlRLSERfRkxBR19FTkFCTEVEICAgID0gMHgwMDAwMDE7CglCb3hQYXJzZXIuVEtIRF9GTEFHX0lOX01PVklFICAgPSAweDAwMDAwMjsKCUJveFBhcnNlci5US0hEX0ZMQUdfSU5fUFJFVklFVyA9IDB4MDAwMDA0OwoKCUJveFBhcnNlci5URkhEX0ZMQUdfQkFTRV9EQVRBX09GRlNFVAk9IDB4MDE7CglCb3hQYXJzZXIuVEZIRF9GTEFHX1NBTVBMRV9ERVNDCQkJPSAweDAyOwoJQm94UGFyc2VyLlRGSERfRkxBR19TQU1QTEVfRFVSCQkJPSAweDA4OwoJQm94UGFyc2VyLlRGSERfRkxBR19TQU1QTEVfU0laRQkJCT0gMHgxMDsKCUJveFBhcnNlci5URkhEX0ZMQUdfU0FNUExFX0ZMQUdTCQk9IDB4MjA7CglCb3hQYXJzZXIuVEZIRF9GTEFHX0RVUl9FTVBUWQkJCT0gMHgxMDAwMDsKCUJveFBhcnNlci5URkhEX0ZMQUdfREVGQVVMVF9CQVNFX0lTX01PT0Y9IDB4MjAwMDA7CgoJQm94UGFyc2VyLlRSVU5fRkxBR1NfREFUQV9PRkZTRVQ9IDB4MDE7CglCb3hQYXJzZXIuVFJVTl9GTEFHU19GSVJTVF9GTEFHCT0gMHgwNDsKCUJveFBhcnNlci5UUlVOX0ZMQUdTX0RVUkFUSU9OCT0gMHgxMDA7CglCb3hQYXJzZXIuVFJVTl9GTEFHU19TSVpFCQk9IDB4MjAwOwoJQm94UGFyc2VyLlRSVU5fRkxBR1NfRkxBR1MJCT0gMHg0MDA7CglCb3hQYXJzZXIuVFJVTl9GTEFHU19DVFNfT0ZGU0VUCT0gMHg4MDA7CgoJQm94UGFyc2VyLkJveC5wcm90b3R5cGUuYWRkID0gZnVuY3Rpb24obmFtZSkgewoJCXJldHVybiB0aGlzLmFkZEJveChuZXcgQm94UGFyc2VyW25hbWUrIkJveCJdKCkpOwoJfTsKCglCb3hQYXJzZXIuQm94LnByb3RvdHlwZS5hZGRCb3ggPSBmdW5jdGlvbihib3gpIHsKCQl0aGlzLmJveGVzLnB1c2goYm94KTsKCQlpZiAodGhpc1tib3gudHlwZSsicyJdKSB7CgkJCXRoaXNbYm94LnR5cGUrInMiXS5wdXNoKGJveCk7CgkJfSBlbHNlIHsKCQkJdGhpc1tib3gudHlwZV0gPSBib3g7CgkJfQoJCXJldHVybiBib3g7Cgl9OwoKCUJveFBhcnNlci5Cb3gucHJvdG90eXBlLnNldCA9IGZ1bmN0aW9uKHByb3AsIHZhbHVlKSB7CgkJdGhpc1twcm9wXSA9IHZhbHVlOwoJCXJldHVybiB0aGlzOwoJfTsKCglCb3hQYXJzZXIuQm94LnByb3RvdHlwZS5hZGRFbnRyeSA9IGZ1bmN0aW9uKHZhbHVlLCBfcHJvcCkgewoJCXZhciBwcm9wID0gX3Byb3AgfHwgImVudHJpZXMiOwoJCWlmICghdGhpc1twcm9wXSkgewoJCQl0aGlzW3Byb3BdID0gW107CgkJfQoJCXRoaXNbcHJvcF0ucHVzaCh2YWx1ZSk7CgkJcmV0dXJuIHRoaXM7Cgl9OwoKCXsKCQlleHBvcnRzJDEuQm94UGFyc2VyID0gQm94UGFyc2VyOwoJfQoJLy8gZmlsZTpzcmMvYm94LXBhcnNlLmpzCgkvKiAKCSAqIENvcHlyaWdodCAoYykgVGVsZWNvbSBQYXJpc1RlY2gvVFNJL01NL0dQQUMgQ3lyaWwgQ29uY29sYXRvCgkgKiBMaWNlbnNlOiBCU0QtMy1DbGF1c2UgKHNlZSBMSUNFTlNFIGZpbGUpCgkgKi8KCUJveFBhcnNlci5wYXJzZVVVSUQgPSBmdW5jdGlvbihzdHJlYW0pIHsKCQlyZXR1cm4gQm94UGFyc2VyLnBhcnNlSGV4MTYoc3RyZWFtKTsKCX07CgoJQm94UGFyc2VyLnBhcnNlSGV4MTYgPSBmdW5jdGlvbihzdHJlYW0pIHsKCQl2YXIgaGV4MTYgPSAiIjsKCQlmb3IgKHZhciBpID0gMDsgaSA8MTY7IGkrKykgewoJCQl2YXIgaGV4ID0gc3RyZWFtLnJlYWRVaW50OCgpLnRvU3RyaW5nKDE2KTsKCQkJaGV4MTYgKz0gKGhleC5sZW5ndGggPT09IDEgPyAiMCIraGV4IDogaGV4KTsKCQl9CgkJcmV0dXJuIGhleDE2OwoJfTsKCglCb3hQYXJzZXIucGFyc2VPbmVCb3ggPSBmdW5jdGlvbihzdHJlYW0sIGhlYWRlck9ubHksIHBhcmVudFNpemUpIHsKCQl2YXIgYm94OwoJCXZhciBzdGFydCA9IHN0cmVhbS5nZXRQb3NpdGlvbigpOwoJCXZhciBoZHJfc2l6ZSA9IDA7CgkJdmFyIGRpZmY7CgkJdmFyIHV1aWQ7CgkJaWYgKHN0cmVhbS5nZXRFbmRQb3NpdGlvbigpIC0gc3RhcnQgPCA4KSB7CgkJCUxvZy5kZWJ1ZygiQm94UGFyc2VyIiwgIk5vdCBlbm91Z2ggZGF0YSBpbiBzdHJlYW0gdG8gcGFyc2UgdGhlIHR5cGUgYW5kIHNpemUgb2YgdGhlIGJveCIpOwoJCQlyZXR1cm4geyBjb2RlOiBCb3hQYXJzZXIuRVJSX05PVF9FTk9VR0hfREFUQSB9OwoJCX0KCQlpZiAocGFyZW50U2l6ZSAmJiBwYXJlbnRTaXplIDwgOCkgewoJCQlMb2cuZGVidWcoIkJveFBhcnNlciIsICJOb3QgZW5vdWdoIGJ5dGVzIGxlZnQgaW4gdGhlIHBhcmVudCBib3ggdG8gcGFyc2UgYSBuZXcgYm94Iik7CgkJCXJldHVybiB7IGNvZGU6IEJveFBhcnNlci5FUlJfTk9UX0VOT1VHSF9EQVRBIH07CgkJfQoJCXZhciBzaXplID0gc3RyZWFtLnJlYWRVaW50MzIoKTsKCQl2YXIgdHlwZSA9IHN0cmVhbS5yZWFkU3RyaW5nKDQpOwoJCXZhciBib3hfdHlwZSA9IHR5cGU7CgkJTG9nLmRlYnVnKCJCb3hQYXJzZXIiLCAiRm91bmQgYm94IG9mIHR5cGUgJyIrdHlwZSsiJyBhbmQgc2l6ZSAiK3NpemUrIiBhdCBwb3NpdGlvbiAiK3N0YXJ0KTsKCQloZHJfc2l6ZSA9IDg7CgkJaWYgKHR5cGUgPT0gInV1aWQiKSB7CgkJCWlmICgoc3RyZWFtLmdldEVuZFBvc2l0aW9uKCkgLSBzdHJlYW0uZ2V0UG9zaXRpb24oKSA8IDE2KSB8fCAocGFyZW50U2l6ZSAtaGRyX3NpemUgPCAxNikpIHsKCQkJCXN0cmVhbS5zZWVrKHN0YXJ0KTsKCQkJCUxvZy5kZWJ1ZygiQm94UGFyc2VyIiwgIk5vdCBlbm91Z2ggYnl0ZXMgbGVmdCBpbiB0aGUgcGFyZW50IGJveCB0byBwYXJzZSBhIFVVSUQgYm94Iik7CgkJCQlyZXR1cm4geyBjb2RlOiBCb3hQYXJzZXIuRVJSX05PVF9FTk9VR0hfREFUQSB9OwoJCQl9CgkJCXV1aWQgPSBCb3hQYXJzZXIucGFyc2VVVUlEKHN0cmVhbSk7CgkJCWhkcl9zaXplICs9IDE2OwoJCQlib3hfdHlwZSA9IHV1aWQ7CgkJfQoJCWlmIChzaXplID09IDEpIHsKCQkJaWYgKChzdHJlYW0uZ2V0RW5kUG9zaXRpb24oKSAtIHN0cmVhbS5nZXRQb3NpdGlvbigpIDwgOCkgfHwgKHBhcmVudFNpemUgJiYgKHBhcmVudFNpemUgLSBoZHJfc2l6ZSkgPCA4KSkgewoJCQkJc3RyZWFtLnNlZWsoc3RhcnQpOwoJCQkJTG9nLndhcm4oIkJveFBhcnNlciIsICJOb3QgZW5vdWdoIGRhdGEgaW4gc3RyZWFtIHRvIHBhcnNlIHRoZSBleHRlbmRlZCBzaXplIG9mIHRoZSBcIiIrdHlwZSsiXCIgYm94Iik7CgkJCQlyZXR1cm4geyBjb2RlOiBCb3hQYXJzZXIuRVJSX05PVF9FTk9VR0hfREFUQSB9OwoJCQl9CgkJCXNpemUgPSBzdHJlYW0ucmVhZFVpbnQ2NCgpOwoJCQloZHJfc2l6ZSArPSA4OwoJCX0gZWxzZSBpZiAoc2l6ZSA9PT0gMCkgewoJCQkvKiBib3ggZXh0ZW5kcyB0aWxsIHRoZSBlbmQgb2YgZmlsZSBvciBpbnZhbGlkIGZpbGUgKi8KCQkJaWYgKHBhcmVudFNpemUpIHsKCQkJCXNpemUgPSBwYXJlbnRTaXplOwoJCQl9IGVsc2UgewoJCQkJLyogYm94IGV4dGVuZHMgdGlsbCB0aGUgZW5kIG9mIGZpbGUgKi8KCQkJCWlmICh0eXBlICE9PSAibWRhdCIpIHsKCQkJCQlMb2cuZXJyb3IoIkJveFBhcnNlciIsICJVbmxpbWl0ZWQgYm94IHNpemUgbm90IHN1cHBvcnRlZCBmb3IgdHlwZTogJyIrdHlwZSsiJyIpOwoJCQkJCWJveCA9IG5ldyBCb3hQYXJzZXIuQm94KHR5cGUsIHNpemUpOwoJCQkJCXJldHVybiB7IGNvZGU6IEJveFBhcnNlci5PSywgYm94OiBib3gsIHNpemU6IGJveC5zaXplIH07CgkJCQl9CgkJCX0KCQl9CgkJaWYgKHNpemUgIT09IDAgJiYgc2l6ZSA8IGhkcl9zaXplKSB7CgkJCUxvZy5lcnJvcigiQm94UGFyc2VyIiwgIkJveCBvZiB0eXBlICIrdHlwZSsiIGhhcyBhbiBpbnZhbGlkIHNpemUgIitzaXplKyIgKHRvbyBzbWFsbCB0byBiZSBhIGJveCkiKTsKCQkJcmV0dXJuIHsgY29kZTogQm94UGFyc2VyLkVSUl9OT1RfRU5PVUdIX0RBVEEsIHR5cGU6IHR5cGUsIHNpemU6IHNpemUsIGhkcl9zaXplOiBoZHJfc2l6ZSwgc3RhcnQ6IHN0YXJ0IH07CgkJfQoJCWlmIChzaXplICE9PSAwICYmIHBhcmVudFNpemUgJiYgc2l6ZSA+IHBhcmVudFNpemUpIHsKCQkJTG9nLmVycm9yKCJCb3hQYXJzZXIiLCAiQm94IG9mIHR5cGUgJyIrdHlwZSsiJyBoYXMgYSBzaXplICIrc2l6ZSsiIGdyZWF0ZXIgdGhhbiBpdHMgY29udGFpbmVyIHNpemUgIitwYXJlbnRTaXplKTsKCQkJcmV0dXJuIHsgY29kZTogQm94UGFyc2VyLkVSUl9OT1RfRU5PVUdIX0RBVEEsIHR5cGU6IHR5cGUsIHNpemU6IHNpemUsIGhkcl9zaXplOiBoZHJfc2l6ZSwgc3RhcnQ6IHN0YXJ0IH07CgkJfQoJCWlmIChzaXplICE9PSAwICYmIHN0YXJ0ICsgc2l6ZSA+IHN0cmVhbS5nZXRFbmRQb3NpdGlvbigpKSB7CgkJCXN0cmVhbS5zZWVrKHN0YXJ0KTsKCQkJTG9nLmluZm8oIkJveFBhcnNlciIsICJOb3QgZW5vdWdoIGRhdGEgaW4gc3RyZWFtIHRvIHBhcnNlIHRoZSBlbnRpcmUgJyIrdHlwZSsiJyBib3giKTsKCQkJcmV0dXJuIHsgY29kZTogQm94UGFyc2VyLkVSUl9OT1RfRU5PVUdIX0RBVEEsIHR5cGU6IHR5cGUsIHNpemU6IHNpemUsIGhkcl9zaXplOiBoZHJfc2l6ZSwgc3RhcnQ6IHN0YXJ0IH07CgkJfQoJCWlmIChoZWFkZXJPbmx5KSB7CgkJCXJldHVybiB7IGNvZGU6IEJveFBhcnNlci5PSywgdHlwZTogdHlwZSwgc2l6ZTogc2l6ZSwgaGRyX3NpemU6IGhkcl9zaXplLCBzdGFydDogc3RhcnQgfTsKCQl9IGVsc2UgewoJCQlpZiAoQm94UGFyc2VyW3R5cGUrIkJveCJdKSB7CgkJCQlib3ggPSBuZXcgQm94UGFyc2VyW3R5cGUrIkJveCJdKHNpemUpOwoJCQl9IGVsc2UgewoJCQkJaWYgKHR5cGUgIT09ICJ1dWlkIikgewoJCQkJCUxvZy53YXJuKCJCb3hQYXJzZXIiLCAiVW5rbm93biBib3ggdHlwZTogJyIrdHlwZSsiJyIpOwoJCQkJCWJveCA9IG5ldyBCb3hQYXJzZXIuQm94KHR5cGUsIHNpemUpOwoJCQkJCWJveC5oYXNfdW5wYXJzZWRfZGF0YSA9IHRydWU7CgkJCQl9IGVsc2UgewoJCQkJCWlmIChCb3hQYXJzZXIuVVVJREJveGVzW3V1aWRdKSB7CgkJCQkJCWJveCA9IG5ldyBCb3hQYXJzZXIuVVVJREJveGVzW3V1aWRdKHNpemUpOwoJCQkJCX0gZWxzZSB7CgkJCQkJCUxvZy53YXJuKCJCb3hQYXJzZXIiLCAiVW5rbm93biB1dWlkIHR5cGU6ICciK3V1aWQrIiciKTsKCQkJCQkJYm94ID0gbmV3IEJveFBhcnNlci5Cb3godHlwZSwgc2l6ZSk7CgkJCQkJCWJveC51dWlkID0gdXVpZDsKCQkJCQkJYm94Lmhhc191bnBhcnNlZF9kYXRhID0gdHJ1ZTsKCQkJCQl9CgkJCQl9CgkJCX0KCQl9CgkJYm94Lmhkcl9zaXplID0gaGRyX3NpemU7CgkJLyogcmVjb3JkaW5nIHRoZSBwb3NpdGlvbiBvZiB0aGUgYm94IGluIHRoZSBpbnB1dCBzdHJlYW0gKi8KCQlib3guc3RhcnQgPSBzdGFydDsKCQlpZiAoYm94LndyaXRlID09PSBCb3hQYXJzZXIuQm94LnByb3RvdHlwZS53cml0ZSAmJiBib3gudHlwZSAhPT0gIm1kYXQiKSB7CgkJCUxvZy5pbmZvKCJCb3hQYXJzZXIiLCAiJyIrYm94X3R5cGUrIicgYm94IHdyaXRpbmcgbm90IHlldCBpbXBsZW1lbnRlZCwga2VlcGluZyB1bnBhcnNlZCBkYXRhIGluIG1lbW9yeSBmb3IgbGF0ZXIgd3JpdGUiKTsKCQkJYm94LnBhcnNlRGF0YUFuZFJld2luZChzdHJlYW0pOwoJCX0KCQlib3gucGFyc2Uoc3RyZWFtKTsKCQlkaWZmID0gc3RyZWFtLmdldFBvc2l0aW9uKCkgLSAoYm94LnN0YXJ0K2JveC5zaXplKTsKCQlpZiAoZGlmZiA8IDApIHsKCQkJTG9nLndhcm4oIkJveFBhcnNlciIsICJQYXJzaW5nIG9mIGJveCAnIitib3hfdHlwZSsiJyBkaWQgbm90IHJlYWQgdGhlIGVudGlyZSBpbmRpY2F0ZWQgYm94IGRhdGEgc2l6ZSAobWlzc2luZyAiKygtZGlmZikrIiBieXRlcyksIHNlZWtpbmcgZm9yd2FyZCIpOwoJCQlzdHJlYW0uc2Vlayhib3guc3RhcnQrYm94LnNpemUpOwoJCX0gZWxzZSBpZiAoZGlmZiA+IDApIHsKCQkJTG9nLmVycm9yKCJCb3hQYXJzZXIiLCAiUGFyc2luZyBvZiBib3ggJyIrYm94X3R5cGUrIicgcmVhZCAiK2RpZmYrIiBtb3JlIGJ5dGVzIHRoYW4gdGhlIGluZGljYXRlZCBib3ggZGF0YSBzaXplLCBzZWVraW5nIGJhY2t3YXJkcyIpOwoJCQlpZiAoYm94LnNpemUgIT09IDApIHN0cmVhbS5zZWVrKGJveC5zdGFydCtib3guc2l6ZSk7CgkJfQoJCXJldHVybiB7IGNvZGU6IEJveFBhcnNlci5PSywgYm94OiBib3gsIHNpemU6IGJveC5zaXplIH07Cgl9OwoKCUJveFBhcnNlci5Cb3gucHJvdG90eXBlLnBhcnNlID0gZnVuY3Rpb24oc3RyZWFtKSB7CgkJaWYgKHRoaXMudHlwZSAhPSAibWRhdCIpIHsKCQkJdGhpcy5kYXRhID0gc3RyZWFtLnJlYWRVaW50OEFycmF5KHRoaXMuc2l6ZS10aGlzLmhkcl9zaXplKTsKCQl9IGVsc2UgewoJCQlpZiAodGhpcy5zaXplID09PSAwKSB7CgkJCQlzdHJlYW0uc2VlayhzdHJlYW0uZ2V0RW5kUG9zaXRpb24oKSk7CgkJCX0gZWxzZSB7CgkJCQlzdHJlYW0uc2Vlayh0aGlzLnN0YXJ0K3RoaXMuc2l6ZSk7CgkJCX0KCQl9Cgl9OwoKCS8qIFVzZWQgdG8gcGFyc2UgYSBib3ggd2l0aG91dCBjb25zdW1pbmcgaXRzIGRhdGEsIHRvIGFsbG93IGRldGFpbGxlZCBwYXJzaW5nCgkgICBVc2VmdWwgZm9yIGJveGVzIGZvciB3aGljaCBhIHdyaXRlIG1ldGhvZCBpcyBub3QgeWV0IGltcGxlbWVudGVkICovCglCb3hQYXJzZXIuQm94LnByb3RvdHlwZS5wYXJzZURhdGFBbmRSZXdpbmQgPSBmdW5jdGlvbihzdHJlYW0pIHsKCQl0aGlzLmRhdGEgPSBzdHJlYW0ucmVhZFVpbnQ4QXJyYXkodGhpcy5zaXplLXRoaXMuaGRyX3NpemUpOwoJCS8vIHJld2luZGluZwoJCXN0cmVhbS5wb3NpdGlvbiAtPSB0aGlzLnNpemUtdGhpcy5oZHJfc2l6ZTsKCX07CgoJQm94UGFyc2VyLkZ1bGxCb3gucHJvdG90eXBlLnBhcnNlRGF0YUFuZFJld2luZCA9IGZ1bmN0aW9uKHN0cmVhbSkgewoJCXRoaXMucGFyc2VGdWxsSGVhZGVyKHN0cmVhbSk7CgkJdGhpcy5kYXRhID0gc3RyZWFtLnJlYWRVaW50OEFycmF5KHRoaXMuc2l6ZS10aGlzLmhkcl9zaXplKTsKCQkvLyByZXN0b3JlIHRoZSBoZWFkZXIgc2l6ZSBhcyBpZiB0aGUgZnVsbCBoZWFkZXIgaGFkIG5vdCBiZWVuIHBhcnNlZAoJCXRoaXMuaGRyX3NpemUgLT0gNDsKCQkvLyByZXdpbmRpbmcKCQlzdHJlYW0ucG9zaXRpb24gLT0gdGhpcy5zaXplLXRoaXMuaGRyX3NpemU7Cgl9OwoKCUJveFBhcnNlci5GdWxsQm94LnByb3RvdHlwZS5wYXJzZUZ1bGxIZWFkZXIgPSBmdW5jdGlvbiAoc3RyZWFtKSB7CgkJdGhpcy52ZXJzaW9uID0gc3RyZWFtLnJlYWRVaW50OCgpOwoJCXRoaXMuZmxhZ3MgPSBzdHJlYW0ucmVhZFVpbnQyNCgpOwoJCXRoaXMuaGRyX3NpemUgKz0gNDsKCX07CgoJQm94UGFyc2VyLkZ1bGxCb3gucHJvdG90eXBlLnBhcnNlID0gZnVuY3Rpb24gKHN0cmVhbSkgewoJCXRoaXMucGFyc2VGdWxsSGVhZGVyKHN0cmVhbSk7CgkJdGhpcy5kYXRhID0gc3RyZWFtLnJlYWRVaW50OEFycmF5KHRoaXMuc2l6ZS10aGlzLmhkcl9zaXplKTsKCX07CgoJQm94UGFyc2VyLkNvbnRhaW5lckJveC5wcm90b3R5cGUucGFyc2UgPSBmdW5jdGlvbihzdHJlYW0pIHsKCQl2YXIgcmV0OwoJCXZhciBib3g7CgkJd2hpbGUgKHN0cmVhbS5nZXRQb3NpdGlvbigpIDwgdGhpcy5zdGFydCt0aGlzLnNpemUpIHsKCQkJcmV0ID0gQm94UGFyc2VyLnBhcnNlT25lQm94KHN0cmVhbSwgZmFsc2UsIHRoaXMuc2l6ZSAtIChzdHJlYW0uZ2V0UG9zaXRpb24oKSAtIHRoaXMuc3RhcnQpKTsKCQkJaWYgKHJldC5jb2RlID09PSBCb3hQYXJzZXIuT0spIHsKCQkJCWJveCA9IHJldC5ib3g7CgkJCQkvKiBzdG9yZSB0aGUgYm94IGluIHRoZSAnYm94ZXMnIGFycmF5IHRvIHByZXNlcnZlIGJveCBvcmRlciAoZm9yIG9mZnNldCkgYnV0IGFsc28gc3RvcmUgYm94IGluIGEgcHJvcGVydHkgZm9yIG1vcmUgZGlyZWN0IGFjY2VzcyAqLwoJCQkJdGhpcy5ib3hlcy5wdXNoKGJveCk7CgkJCQlpZiAodGhpcy5zdWJCb3hOYW1lcyAmJiB0aGlzLnN1YkJveE5hbWVzLmluZGV4T2YoYm94LnR5cGUpICE9IC0xKSB7CgkJCQkJdGhpc1t0aGlzLnN1YkJveE5hbWVzW3RoaXMuc3ViQm94TmFtZXMuaW5kZXhPZihib3gudHlwZSldKyJzIl0ucHVzaChib3gpOwoJCQkJfSBlbHNlIHsKCQkJCQl2YXIgYm94X3R5cGUgPSBib3gudHlwZSAhPT0gInV1aWQiID8gYm94LnR5cGUgOiBib3gudXVpZDsKCQkJCQlpZiAodGhpc1tib3hfdHlwZV0pIHsKCQkJCQkJTG9nLndhcm4oIkJveCBvZiB0eXBlICIrYm94X3R5cGUrIiBhbHJlYWR5IHN0b3JlZCBpbiBmaWVsZCBvZiB0aGlzIHR5cGUiKTsKCQkJCQl9IGVsc2UgewoJCQkJCQl0aGlzW2JveF90eXBlXSA9IGJveDsKCQkJCQl9CgkJCQl9CgkJCX0gZWxzZSB7CgkJCQlyZXR1cm47CgkJCX0KCQl9Cgl9OwoKCUJveFBhcnNlci5Cb3gucHJvdG90eXBlLnBhcnNlTGFuZ3VhZ2UgPSBmdW5jdGlvbihzdHJlYW0pIHsKCQl0aGlzLmxhbmd1YWdlID0gc3RyZWFtLnJlYWRVaW50MTYoKTsKCQl2YXIgY2hhcnMgPSBbXTsKCQljaGFyc1swXSA9ICh0aGlzLmxhbmd1YWdlPj4xMCkmMHgxRjsKCQljaGFyc1sxXSA9ICh0aGlzLmxhbmd1YWdlPj41KSYweDFGOwoJCWNoYXJzWzJdID0gKHRoaXMubGFuZ3VhZ2UpJjB4MUY7CgkJdGhpcy5sYW5ndWFnZVN0cmluZyA9IFN0cmluZy5mcm9tQ2hhckNvZGUoY2hhcnNbMF0rMHg2MCwgY2hhcnNbMV0rMHg2MCwgY2hhcnNbMl0rMHg2MCk7Cgl9OwoKCS8vIGZpbGU6c3JjL3BhcnNpbmcvc2FtcGxlZW50cmllcy9zYW1wbGVlbnRyeS5qcwoJQm94UGFyc2VyLlNBTVBMRV9FTlRSWV9UWVBFX1ZJU1VBTCAJCT0gIlZpc3VhbCI7CglCb3hQYXJzZXIuU0FNUExFX0VOVFJZX1RZUEVfQVVESU8gCQk9ICJBdWRpbyI7CglCb3hQYXJzZXIuU0FNUExFX0VOVFJZX1RZUEVfSElOVCAJCT0gIkhpbnQiOwoJQm94UGFyc2VyLlNBTVBMRV9FTlRSWV9UWVBFX01FVEFEQVRBIAk9ICJNZXRhZGF0YSI7CglCb3hQYXJzZXIuU0FNUExFX0VOVFJZX1RZUEVfU1VCVElUTEUgCT0gIlN1YnRpdGxlIjsKCUJveFBhcnNlci5TQU1QTEVfRU5UUllfVFlQRV9TWVNURU0gCQk9ICJTeXN0ZW0iOwoJQm94UGFyc2VyLlNBTVBMRV9FTlRSWV9UWVBFX1RFWFQgCQk9ICJUZXh0IjsKCglCb3hQYXJzZXIuU2FtcGxlRW50cnkucHJvdG90eXBlLnBhcnNlSGVhZGVyID0gZnVuY3Rpb24oc3RyZWFtKSB7CgkJc3RyZWFtLnJlYWRVaW50OEFycmF5KDYpOwoJCXRoaXMuZGF0YV9yZWZlcmVuY2VfaW5kZXggPSBzdHJlYW0ucmVhZFVpbnQxNigpOwoJCXRoaXMuaGRyX3NpemUgKz0gODsKCX07CgoJQm94UGFyc2VyLlNhbXBsZUVudHJ5LnByb3RvdHlwZS5wYXJzZSA9IGZ1bmN0aW9uKHN0cmVhbSkgewoJCXRoaXMucGFyc2VIZWFkZXIoc3RyZWFtKTsKCQl0aGlzLmRhdGEgPSBzdHJlYW0ucmVhZFVpbnQ4QXJyYXkodGhpcy5zaXplIC0gdGhpcy5oZHJfc2l6ZSk7Cgl9OwoKCUJveFBhcnNlci5TYW1wbGVFbnRyeS5wcm90b3R5cGUucGFyc2VEYXRhQW5kUmV3aW5kID0gZnVuY3Rpb24oc3RyZWFtKSB7CgkJdGhpcy5wYXJzZUhlYWRlcihzdHJlYW0pOwoJCXRoaXMuZGF0YSA9IHN0cmVhbS5yZWFkVWludDhBcnJheSh0aGlzLnNpemUgLSB0aGlzLmhkcl9zaXplKTsKCQkvLyByZXN0b3JlIHRoZSBoZWFkZXIgc2l6ZSBhcyBpZiB0aGUgc2FtcGxlIGVudHJ5IGhlYWRlciBoYWQgbm90IGJlZW4gcGFyc2VkCgkJdGhpcy5oZHJfc2l6ZSAtPSA4OwoJCS8vIHJld2luZGluZwoJCXN0cmVhbS5wb3NpdGlvbiAtPSB0aGlzLnNpemUtdGhpcy5oZHJfc2l6ZTsKCX07CgoJQm94UGFyc2VyLlNhbXBsZUVudHJ5LnByb3RvdHlwZS5wYXJzZUZvb3RlciA9IGZ1bmN0aW9uKHN0cmVhbSkgewoJCUJveFBhcnNlci5Db250YWluZXJCb3gucHJvdG90eXBlLnBhcnNlLmNhbGwodGhpcywgc3RyZWFtKTsKCX07CgoJLy8gQmFzZSBTYW1wbGVFbnRyeSB0eXBlcyB3aXRoIGRlZmF1bHQgcGFyc2luZwoJQm94UGFyc2VyLmNyZWF0ZU1lZGlhU2FtcGxlRW50cnlDdG9yKEJveFBhcnNlci5TQU1QTEVfRU5UUllfVFlQRV9ISU5UKTsKCUJveFBhcnNlci5jcmVhdGVNZWRpYVNhbXBsZUVudHJ5Q3RvcihCb3hQYXJzZXIuU0FNUExFX0VOVFJZX1RZUEVfTUVUQURBVEEpOwoJQm94UGFyc2VyLmNyZWF0ZU1lZGlhU2FtcGxlRW50cnlDdG9yKEJveFBhcnNlci5TQU1QTEVfRU5UUllfVFlQRV9TVUJUSVRMRSk7CglCb3hQYXJzZXIuY3JlYXRlTWVkaWFTYW1wbGVFbnRyeUN0b3IoQm94UGFyc2VyLlNBTVBMRV9FTlRSWV9UWVBFX1NZU1RFTSk7CglCb3hQYXJzZXIuY3JlYXRlTWVkaWFTYW1wbGVFbnRyeUN0b3IoQm94UGFyc2VyLlNBTVBMRV9FTlRSWV9UWVBFX1RFWFQpOwoKCS8vQmFzZSBTYW1wbGVFbnRyeSB0eXBlcyBmb3IgQXVkaW8gYW5kIFZpZGVvIHdpdGggc3BlY2lmaWMgcGFyc2luZwoJQm94UGFyc2VyLmNyZWF0ZU1lZGlhU2FtcGxlRW50cnlDdG9yKEJveFBhcnNlci5TQU1QTEVfRU5UUllfVFlQRV9WSVNVQUwsIGZ1bmN0aW9uKHN0cmVhbSkgewoJCXZhciBjb21wcmVzc29ybmFtZV9sZW5ndGg7CgkJdGhpcy5wYXJzZUhlYWRlcihzdHJlYW0pOwoJCXN0cmVhbS5yZWFkVWludDE2KCk7CgkJc3RyZWFtLnJlYWRVaW50MTYoKTsKCQlzdHJlYW0ucmVhZFVpbnQzMkFycmF5KDMpOwoJCXRoaXMud2lkdGggPSBzdHJlYW0ucmVhZFVpbnQxNigpOwoJCXRoaXMuaGVpZ2h0ID0gc3RyZWFtLnJlYWRVaW50MTYoKTsKCQl0aGlzLmhvcml6cmVzb2x1dGlvbiA9IHN0cmVhbS5yZWFkVWludDMyKCk7CgkJdGhpcy52ZXJ0cmVzb2x1dGlvbiA9IHN0cmVhbS5yZWFkVWludDMyKCk7CgkJc3RyZWFtLnJlYWRVaW50MzIoKTsKCQl0aGlzLmZyYW1lX2NvdW50ID0gc3RyZWFtLnJlYWRVaW50MTYoKTsKCQljb21wcmVzc29ybmFtZV9sZW5ndGggPSBNYXRoLm1pbigzMSwgc3RyZWFtLnJlYWRVaW50OCgpKTsKCQl0aGlzLmNvbXByZXNzb3JuYW1lID0gc3RyZWFtLnJlYWRTdHJpbmcoY29tcHJlc3Nvcm5hbWVfbGVuZ3RoKTsKCQlpZiAoY29tcHJlc3Nvcm5hbWVfbGVuZ3RoIDwgMzEpIHsKCQkJc3RyZWFtLnJlYWRTdHJpbmcoMzEgLSBjb21wcmVzc29ybmFtZV9sZW5ndGgpOwoJCX0KCQl0aGlzLmRlcHRoID0gc3RyZWFtLnJlYWRVaW50MTYoKTsKCQlzdHJlYW0ucmVhZFVpbnQxNigpOwoJCXRoaXMucGFyc2VGb290ZXIoc3RyZWFtKTsKCX0pOwoKCUJveFBhcnNlci5jcmVhdGVNZWRpYVNhbXBsZUVudHJ5Q3RvcihCb3hQYXJzZXIuU0FNUExFX0VOVFJZX1RZUEVfQVVESU8sIGZ1bmN0aW9uKHN0cmVhbSkgewoJCXRoaXMucGFyc2VIZWFkZXIoc3RyZWFtKTsKCQlzdHJlYW0ucmVhZFVpbnQzMkFycmF5KDIpOwoJCXRoaXMuY2hhbm5lbF9jb3VudCA9IHN0cmVhbS5yZWFkVWludDE2KCk7CgkJdGhpcy5zYW1wbGVzaXplID0gc3RyZWFtLnJlYWRVaW50MTYoKTsKCQlzdHJlYW0ucmVhZFVpbnQxNigpOwoJCXN0cmVhbS5yZWFkVWludDE2KCk7CgkJdGhpcy5zYW1wbGVyYXRlID0gKHN0cmVhbS5yZWFkVWludDMyKCkvKDE8PDE2KSk7CgkJdGhpcy5wYXJzZUZvb3RlcihzdHJlYW0pOwoJfSk7CgoJLy8gU2FtcGxlIGVudHJpZXMgaW5oZXJpdGluZyBmcm9tIEF1ZGlvIGFuZCBWaWRlbwoJQm94UGFyc2VyLmNyZWF0ZVNhbXBsZUVudHJ5Q3RvcihCb3hQYXJzZXIuU0FNUExFX0VOVFJZX1RZUEVfVklTVUFMLCAiYXZjMSIpOwoJQm94UGFyc2VyLmNyZWF0ZVNhbXBsZUVudHJ5Q3RvcihCb3hQYXJzZXIuU0FNUExFX0VOVFJZX1RZUEVfVklTVUFMLCAiYXZjMiIpOwoJQm94UGFyc2VyLmNyZWF0ZVNhbXBsZUVudHJ5Q3RvcihCb3hQYXJzZXIuU0FNUExFX0VOVFJZX1RZUEVfVklTVUFMLCAiYXZjMyIpOwoJQm94UGFyc2VyLmNyZWF0ZVNhbXBsZUVudHJ5Q3RvcihCb3hQYXJzZXIuU0FNUExFX0VOVFJZX1RZUEVfVklTVUFMLCAiYXZjNCIpOwoJQm94UGFyc2VyLmNyZWF0ZVNhbXBsZUVudHJ5Q3RvcihCb3hQYXJzZXIuU0FNUExFX0VOVFJZX1RZUEVfVklTVUFMLCAiYXYwMSIpOwoJQm94UGFyc2VyLmNyZWF0ZVNhbXBsZUVudHJ5Q3RvcihCb3hQYXJzZXIuU0FNUExFX0VOVFJZX1RZUEVfVklTVUFMLCAiaHZjMSIpOwoJQm94UGFyc2VyLmNyZWF0ZVNhbXBsZUVudHJ5Q3RvcihCb3hQYXJzZXIuU0FNUExFX0VOVFJZX1RZUEVfVklTVUFMLCAiaGV2MSIpOwoJQm94UGFyc2VyLmNyZWF0ZVNhbXBsZUVudHJ5Q3RvcihCb3hQYXJzZXIuU0FNUExFX0VOVFJZX1RZUEVfVklTVUFMLCAidnZjMSIpOwoJQm94UGFyc2VyLmNyZWF0ZVNhbXBsZUVudHJ5Q3RvcihCb3hQYXJzZXIuU0FNUExFX0VOVFJZX1RZUEVfVklTVUFMLCAidnZpMSIpOwoJQm94UGFyc2VyLmNyZWF0ZVNhbXBsZUVudHJ5Q3RvcihCb3hQYXJzZXIuU0FNUExFX0VOVFJZX1RZUEVfVklTVUFMLCAidnZzMSIpOwoJQm94UGFyc2VyLmNyZWF0ZVNhbXBsZUVudHJ5Q3RvcihCb3hQYXJzZXIuU0FNUExFX0VOVFJZX1RZUEVfVklTVUFMLCAidnZjTiIpOwoJQm94UGFyc2VyLmNyZWF0ZVNhbXBsZUVudHJ5Q3RvcihCb3hQYXJzZXIuU0FNUExFX0VOVFJZX1RZUEVfVklTVUFMLCAidnAwOCIpOwoJQm94UGFyc2VyLmNyZWF0ZVNhbXBsZUVudHJ5Q3RvcihCb3hQYXJzZXIuU0FNUExFX0VOVFJZX1RZUEVfVklTVUFMLCAidnAwOSIpOwoJQm94UGFyc2VyLmNyZWF0ZVNhbXBsZUVudHJ5Q3RvcihCb3hQYXJzZXIuU0FNUExFX0VOVFJZX1RZUEVfQVVESU8sIAkibXA0YSIpOwoJQm94UGFyc2VyLmNyZWF0ZVNhbXBsZUVudHJ5Q3RvcihCb3hQYXJzZXIuU0FNUExFX0VOVFJZX1RZUEVfQVVESU8sIAkiYWMtMyIpOwoJQm94UGFyc2VyLmNyZWF0ZVNhbXBsZUVudHJ5Q3RvcihCb3hQYXJzZXIuU0FNUExFX0VOVFJZX1RZUEVfQVVESU8sIAkiZWMtMyIpOwoJQm94UGFyc2VyLmNyZWF0ZVNhbXBsZUVudHJ5Q3RvcihCb3hQYXJzZXIuU0FNUExFX0VOVFJZX1RZUEVfQVVESU8sIAkiT3B1cyIpOwoKCS8vIEVuY3J5cHRlZCBzYW1wbGUgZW50cmllcwoJQm94UGFyc2VyLmNyZWF0ZUVuY3J5cHRlZFNhbXBsZUVudHJ5Q3RvcihCb3hQYXJzZXIuU0FNUExFX0VOVFJZX1RZUEVfVklTVUFMLCAJImVuY3YiKTsKCUJveFBhcnNlci5jcmVhdGVFbmNyeXB0ZWRTYW1wbGVFbnRyeUN0b3IoQm94UGFyc2VyLlNBTVBMRV9FTlRSWV9UWVBFX0FVRElPLCAJImVuY2EiKTsKCUJveFBhcnNlci5jcmVhdGVFbmNyeXB0ZWRTYW1wbGVFbnRyeUN0b3IoQm94UGFyc2VyLlNBTVBMRV9FTlRSWV9UWVBFX1NVQlRJVExFLCAJImVuY3UiKTsKCUJveFBhcnNlci5jcmVhdGVFbmNyeXB0ZWRTYW1wbGVFbnRyeUN0b3IoQm94UGFyc2VyLlNBTVBMRV9FTlRSWV9UWVBFX1NZU1RFTSwgCSJlbmNzIik7CglCb3hQYXJzZXIuY3JlYXRlRW5jcnlwdGVkU2FtcGxlRW50cnlDdG9yKEJveFBhcnNlci5TQU1QTEVfRU5UUllfVFlQRV9URVhULCAJCSJlbmN0Iik7CglCb3hQYXJzZXIuY3JlYXRlRW5jcnlwdGVkU2FtcGxlRW50cnlDdG9yKEJveFBhcnNlci5TQU1QTEVfRU5UUllfVFlQRV9NRVRBREFUQSwgCSJlbmNtIik7CgkvLyBmaWxlOnNyYy9wYXJzaW5nL2ExbHguanMKCUJveFBhcnNlci5jcmVhdGVCb3hDdG9yKCJhMWx4IiwgZnVuY3Rpb24oc3RyZWFtKSB7CgkJdmFyIGxhcmdlX3NpemUgPSBzdHJlYW0ucmVhZFVpbnQ4KCkgJiAxOwoJCXZhciBGaWVsZExlbmd0aCA9ICgobGFyZ2Vfc2l6ZSAmIDEpICsgMSkgKiAxNjsKCQl0aGlzLmxheWVyX3NpemUgPSBbXTsKCQlmb3IgKHZhciBpID0gMDsgaSA8IDM7IGkrKykgewoJCQlpZiAoRmllbGRMZW5ndGggPT0gMTYpIHsKCQkJCXRoaXMubGF5ZXJfc2l6ZVtpXSA9IHN0cmVhbS5yZWFkVWludDE2KCk7CgkJCX0gZWxzZSB7CgkJCQl0aGlzLmxheWVyX3NpemVbaV0gPSBzdHJlYW0ucmVhZFVpbnQzMigpOwoJCQl9CgkJfQoJfSk7Ly8gZmlsZTpzcmMvcGFyc2luZy9hMW9wLmpzCglCb3hQYXJzZXIuY3JlYXRlQm94Q3RvcigiYTFvcCIsIGZ1bmN0aW9uKHN0cmVhbSkgewoJCXRoaXMub3BfaW5kZXggPSBzdHJlYW0ucmVhZFVpbnQ4KCk7Cgl9KTsvLyBmaWxlOnNyYy9wYXJzaW5nL2F1eEMuanMKCUJveFBhcnNlci5jcmVhdGVGdWxsQm94Q3RvcigiYXV4QyIsIGZ1bmN0aW9uKHN0cmVhbSkgewoJCXRoaXMuYXV4X3R5cGUgPSBzdHJlYW0ucmVhZENTdHJpbmcoKTsKCQl2YXIgYXV4X3N1YnR5cGVfbGVuZ3RoID0gdGhpcy5zaXplIC0gdGhpcy5oZHJfc2l6ZSAtICh0aGlzLmF1eF90eXBlLmxlbmd0aCArIDEpOwoJCXRoaXMuYXV4X3N1YnR5cGUgPSBzdHJlYW0ucmVhZFVpbnQ4QXJyYXkoYXV4X3N1YnR5cGVfbGVuZ3RoKTsKCX0pOy8vIGZpbGU6c3JjL3BhcnNpbmcvYXYxQy5qcwoJQm94UGFyc2VyLmNyZWF0ZUJveEN0b3IoImF2MUMiLCBmdW5jdGlvbihzdHJlYW0pIHsKCQl2YXIgdG1wID0gc3RyZWFtLnJlYWRVaW50OCgpOwoJCWlmICgodG1wID4+IDcpICYgMHgxICE9PSAxKSB7CgkJCUxvZy5lcnJvcigiYXYxQyBtYXJrZXIgcHJvYmxlbSIpOwoJCQlyZXR1cm47CgkJfQoJCXRoaXMudmVyc2lvbiA9IHRtcCAmIDB4N0Y7CgkJaWYgKHRoaXMudmVyc2lvbiAhPT0gMSkgewoJCQlMb2cuZXJyb3IoImF2MUMgdmVyc2lvbiAiK3RoaXMudmVyc2lvbisiIG5vdCBzdXBwb3J0ZWQiKTsKCQkJcmV0dXJuOwoJCX0KCQl0bXAgPSBzdHJlYW0ucmVhZFVpbnQ4KCk7CgkJdGhpcy5zZXFfcHJvZmlsZSA9ICh0bXAgPj4gNSkgJiAweDc7CgkJdGhpcy5zZXFfbGV2ZWxfaWR4XzAgPSB0bXAgJiAweDFGOwoJCXRtcCA9IHN0cmVhbS5yZWFkVWludDgoKTsKCQl0aGlzLnNlcV90aWVyXzAgPSAodG1wID4+IDcpICYgMHgxOwoJCXRoaXMuaGlnaF9iaXRkZXB0aCA9ICh0bXAgPj4gNikgJiAweDE7CgkJdGhpcy50d2VsdmVfYml0ID0gKHRtcCA+PiA1KSAmIDB4MTsKCQl0aGlzLm1vbm9jaHJvbWUgPSAodG1wID4+IDQpICYgMHgxOwoJCXRoaXMuY2hyb21hX3N1YnNhbXBsaW5nX3ggPSAodG1wID4+IDMpICYgMHgxOwoJCXRoaXMuY2hyb21hX3N1YnNhbXBsaW5nX3kgPSAodG1wID4+IDIpICYgMHgxOwoJCXRoaXMuY2hyb21hX3NhbXBsZV9wb3NpdGlvbiA9ICh0bXAgJiAweDMpOwoJCXRtcCA9IHN0cmVhbS5yZWFkVWludDgoKTsKCQl0aGlzLnJlc2VydmVkXzEgPSAodG1wID4+IDUpICYgMHg3OwoJCWlmICh0aGlzLnJlc2VydmVkXzEgIT09IDApIHsKCQkJTG9nLmVycm9yKCJhdjFDIHJlc2VydmVkXzEgcGFyc2luZyBwcm9ibGVtIik7CgkJCXJldHVybjsKCQl9CgkJdGhpcy5pbml0aWFsX3ByZXNlbnRhdGlvbl9kZWxheV9wcmVzZW50ID0gKHRtcCA+PiA0KSAmIDB4MTsKCQlpZiAodGhpcy5pbml0aWFsX3ByZXNlbnRhdGlvbl9kZWxheV9wcmVzZW50ID09PSAxKSB7CgkJCXRoaXMuaW5pdGlhbF9wcmVzZW50YXRpb25fZGVsYXlfbWludXNfb25lID0gKHRtcCAmIDB4Rik7CgkJfSBlbHNlIHsKCQkJdGhpcy5yZXNlcnZlZF8yID0gKHRtcCAmIDB4Rik7CgkJCWlmICh0aGlzLnJlc2VydmVkXzIgIT09IDApIHsKCQkJCUxvZy5lcnJvcigiYXYxQyByZXNlcnZlZF8yIHBhcnNpbmcgcHJvYmxlbSIpOwoJCQkJcmV0dXJuOwoJCQl9CgkJfQoKCQl2YXIgY29uZmlnT0JVc19sZW5ndGggPSB0aGlzLnNpemUgLSB0aGlzLmhkcl9zaXplIC0gNDsKCQl0aGlzLmNvbmZpZ09CVXMgPSBzdHJlYW0ucmVhZFVpbnQ4QXJyYXkoY29uZmlnT0JVc19sZW5ndGgpOwoJfSk7CgoJLy8gZmlsZTpzcmMvcGFyc2luZy9hdmNDLmpzCglCb3hQYXJzZXIuY3JlYXRlQm94Q3RvcigiYXZjQyIsIGZ1bmN0aW9uKHN0cmVhbSkgewoJCXZhciBpOwoJCXZhciB0b3BhcnNlOwoJCXRoaXMuY29uZmlndXJhdGlvblZlcnNpb24gPSBzdHJlYW0ucmVhZFVpbnQ4KCk7CgkJdGhpcy5BVkNQcm9maWxlSW5kaWNhdGlvbiA9IHN0cmVhbS5yZWFkVWludDgoKTsKCQl0aGlzLnByb2ZpbGVfY29tcGF0aWJpbGl0eSA9IHN0cmVhbS5yZWFkVWludDgoKTsKCQl0aGlzLkFWQ0xldmVsSW5kaWNhdGlvbiA9IHN0cmVhbS5yZWFkVWludDgoKTsKCQl0aGlzLmxlbmd0aFNpemVNaW51c09uZSA9IChzdHJlYW0ucmVhZFVpbnQ4KCkgJiAweDMpOwoJCXRoaXMubmJfU1BTX25hbHVzID0gKHN0cmVhbS5yZWFkVWludDgoKSAmIDB4MUYpOwoJCXRvcGFyc2UgPSB0aGlzLnNpemUgLSB0aGlzLmhkcl9zaXplIC0gNjsKCQl0aGlzLlNQUyA9IFtdOwoJCWZvciAoaSA9IDA7IGkgPCB0aGlzLm5iX1NQU19uYWx1czsgaSsrKSB7CgkJCXRoaXMuU1BTW2ldID0ge307CgkJCXRoaXMuU1BTW2ldLmxlbmd0aCA9IHN0cmVhbS5yZWFkVWludDE2KCk7CgkJCXRoaXMuU1BTW2ldLm5hbHUgPSBzdHJlYW0ucmVhZFVpbnQ4QXJyYXkodGhpcy5TUFNbaV0ubGVuZ3RoKTsKCQkJdG9wYXJzZSAtPSAyK3RoaXMuU1BTW2ldLmxlbmd0aDsKCQl9CgkJdGhpcy5uYl9QUFNfbmFsdXMgPSBzdHJlYW0ucmVhZFVpbnQ4KCk7CgkJdG9wYXJzZS0tOwoJCXRoaXMuUFBTID0gW107CgkJZm9yIChpID0gMDsgaSA8IHRoaXMubmJfUFBTX25hbHVzOyBpKyspIHsKCQkJdGhpcy5QUFNbaV0gPSB7fTsKCQkJdGhpcy5QUFNbaV0ubGVuZ3RoID0gc3RyZWFtLnJlYWRVaW50MTYoKTsKCQkJdGhpcy5QUFNbaV0ubmFsdSA9IHN0cmVhbS5yZWFkVWludDhBcnJheSh0aGlzLlBQU1tpXS5sZW5ndGgpOwoJCQl0b3BhcnNlIC09IDIrdGhpcy5QUFNbaV0ubGVuZ3RoOwoJCX0KCQlpZiAodG9wYXJzZT4wKSB7CgkJCXRoaXMuZXh0ID0gc3RyZWFtLnJlYWRVaW50OEFycmF5KHRvcGFyc2UpOwoJCX0KCX0pOwoKCS8vIGZpbGU6c3JjL3BhcnNpbmcvYnRydC5qcwoJQm94UGFyc2VyLmNyZWF0ZUJveEN0b3IoImJ0cnQiLCBmdW5jdGlvbihzdHJlYW0pIHsKCQl0aGlzLmJ1ZmZlclNpemVEQiA9IHN0cmVhbS5yZWFkVWludDMyKCk7CgkJdGhpcy5tYXhCaXRyYXRlID0gc3RyZWFtLnJlYWRVaW50MzIoKTsKCQl0aGlzLmF2Z0JpdHJhdGUgPSBzdHJlYW0ucmVhZFVpbnQzMigpOwoJfSk7CgoJLy8gZmlsZTpzcmMvcGFyc2luZy9jbGFwLmpzCglCb3hQYXJzZXIuY3JlYXRlQm94Q3RvcigiY2xhcCIsIGZ1bmN0aW9uKHN0cmVhbSkgewoJCXRoaXMuY2xlYW5BcGVydHVyZVdpZHRoTiA9IHN0cmVhbS5yZWFkVWludDMyKCk7CgkJdGhpcy5jbGVhbkFwZXJ0dXJlV2lkdGhEID0gc3RyZWFtLnJlYWRVaW50MzIoKTsKCQl0aGlzLmNsZWFuQXBlcnR1cmVIZWlnaHROID0gc3RyZWFtLnJlYWRVaW50MzIoKTsKCQl0aGlzLmNsZWFuQXBlcnR1cmVIZWlnaHREID0gc3RyZWFtLnJlYWRVaW50MzIoKTsKCQl0aGlzLmhvcml6T2ZmTiA9IHN0cmVhbS5yZWFkVWludDMyKCk7CgkJdGhpcy5ob3Jpek9mZkQgPSBzdHJlYW0ucmVhZFVpbnQzMigpOwoJCXRoaXMudmVydE9mZk4gPSBzdHJlYW0ucmVhZFVpbnQzMigpOwoJCXRoaXMudmVydE9mZkQgPSBzdHJlYW0ucmVhZFVpbnQzMigpOwoJfSk7Ly8gZmlsZTpzcmMvcGFyc2luZy9jbGxpLmpzCglCb3hQYXJzZXIuY3JlYXRlQm94Q3RvcigiY2xsaSIsIGZ1bmN0aW9uKHN0cmVhbSkgewoJCXRoaXMubWF4X2NvbnRlbnRfbGlnaHRfbGV2ZWwgPSBzdHJlYW0ucmVhZFVpbnQxNigpOwoJICAgIHRoaXMubWF4X3BpY19hdmVyYWdlX2xpZ2h0X2xldmVsID0gc3RyZWFtLnJlYWRVaW50MTYoKTsKCX0pOwoKCS8vIGZpbGU6c3JjL3BhcnNpbmcvY282NC5qcwoJQm94UGFyc2VyLmNyZWF0ZUZ1bGxCb3hDdG9yKCJjbzY0IiwgZnVuY3Rpb24oc3RyZWFtKSB7CgkJdmFyIGVudHJ5X2NvdW50OwoJCXZhciBpOwoJCWVudHJ5X2NvdW50ID0gc3RyZWFtLnJlYWRVaW50MzIoKTsKCQl0aGlzLmNodW5rX29mZnNldHMgPSBbXTsKCQlpZiAodGhpcy52ZXJzaW9uID09PSAwKSB7CgkJCWZvcihpPTA7IGk8ZW50cnlfY291bnQ7IGkrKykgewoJCQkJdGhpcy5jaHVua19vZmZzZXRzLnB1c2goc3RyZWFtLnJlYWRVaW50NjQoKSk7CgkJCX0KCQl9Cgl9KTsKCgkvLyBmaWxlOnNyYy9wYXJzaW5nL0NvTEwuanMKCUJveFBhcnNlci5jcmVhdGVGdWxsQm94Q3RvcigiQ29MTCIsIGZ1bmN0aW9uKHN0cmVhbSkgewoJCXRoaXMubWF4Q0xMID0gc3RyZWFtLnJlYWRVaW50MTYoKTsKCSAgICB0aGlzLm1heEZBTEwgPSBzdHJlYW0ucmVhZFVpbnQxNigpOwoJfSk7CgoJLy8gZmlsZTpzcmMvcGFyc2luZy9jb2xyLmpzCglCb3hQYXJzZXIuY3JlYXRlQm94Q3RvcigiY29sciIsIGZ1bmN0aW9uKHN0cmVhbSkgewoJCXRoaXMuY29sb3VyX3R5cGUgPSBzdHJlYW0ucmVhZFN0cmluZyg0KTsKCQlpZiAodGhpcy5jb2xvdXJfdHlwZSA9PT0gJ25jbHgnKSB7CgkJCXRoaXMuY29sb3VyX3ByaW1hcmllcyA9IHN0cmVhbS5yZWFkVWludDE2KCk7CgkJCXRoaXMudHJhbnNmZXJfY2hhcmFjdGVyaXN0aWNzID0gc3RyZWFtLnJlYWRVaW50MTYoKTsKCQkJdGhpcy5tYXRyaXhfY29lZmZpY2llbnRzID0gc3RyZWFtLnJlYWRVaW50MTYoKTsKCQkJdmFyIHRtcCA9IHN0cmVhbS5yZWFkVWludDgoKTsKCQkJdGhpcy5mdWxsX3JhbmdlX2ZsYWcgPSB0bXAgPj4gNzsKCQl9IGVsc2UgaWYgKHRoaXMuY29sb3VyX3R5cGUgPT09ICdySUNDJykgewoJCQl0aGlzLklDQ19wcm9maWxlID0gc3RyZWFtLnJlYWRVaW50OEFycmF5KHRoaXMuc2l6ZSAtIDQpOwoJCX0gZWxzZSBpZiAodGhpcy5jb2xvdXJfdHlwZSA9PT0gJ3Byb2YnKSB7CgkJCXRoaXMuSUNDX3Byb2ZpbGUgPSBzdHJlYW0ucmVhZFVpbnQ4QXJyYXkodGhpcy5zaXplIC0gNCk7CgkJfQoJfSk7Ly8gZmlsZTpzcmMvcGFyc2luZy9jcHJ0LmpzCglCb3hQYXJzZXIuY3JlYXRlRnVsbEJveEN0b3IoImNwcnQiLCBmdW5jdGlvbiAoc3RyZWFtKSB7CgkJdGhpcy5wYXJzZUxhbmd1YWdlKHN0cmVhbSk7CgkJdGhpcy5ub3RpY2UgPSBzdHJlYW0ucmVhZENTdHJpbmcoKTsKCX0pOwoKCS8vIGZpbGU6c3JjL3BhcnNpbmcvY3NsZy5qcwoJQm94UGFyc2VyLmNyZWF0ZUZ1bGxCb3hDdG9yKCJjc2xnIiwgZnVuY3Rpb24oc3RyZWFtKSB7CgkJaWYgKHRoaXMudmVyc2lvbiA9PT0gMCkgewoJCQl0aGlzLmNvbXBvc2l0aW9uVG9EVFNTaGlmdCA9IHN0cmVhbS5yZWFkSW50MzIoKTsgLyogc2lnbmVkICovCgkJCXRoaXMubGVhc3REZWNvZGVUb0Rpc3BsYXlEZWx0YSA9IHN0cmVhbS5yZWFkSW50MzIoKTsgLyogc2lnbmVkICovCgkJCXRoaXMuZ3JlYXRlc3REZWNvZGVUb0Rpc3BsYXlEZWx0YSA9IHN0cmVhbS5yZWFkSW50MzIoKTsgLyogc2lnbmVkICovCgkJCXRoaXMuY29tcG9zaXRpb25TdGFydFRpbWUgPSBzdHJlYW0ucmVhZEludDMyKCk7IC8qIHNpZ25lZCAqLwoJCQl0aGlzLmNvbXBvc2l0aW9uRW5kVGltZSA9IHN0cmVhbS5yZWFkSW50MzIoKTsgLyogc2lnbmVkICovCgkJfQoJfSk7CgoJLy8gZmlsZTpzcmMvcGFyc2luZy9jdHRzLmpzCglCb3hQYXJzZXIuY3JlYXRlRnVsbEJveEN0b3IoImN0dHMiLCBmdW5jdGlvbihzdHJlYW0pIHsKCQl2YXIgZW50cnlfY291bnQ7CgkJdmFyIGk7CgkJZW50cnlfY291bnQgPSBzdHJlYW0ucmVhZFVpbnQzMigpOwoJCXRoaXMuc2FtcGxlX2NvdW50cyA9IFtdOwoJCXRoaXMuc2FtcGxlX29mZnNldHMgPSBbXTsKCQlpZiAodGhpcy52ZXJzaW9uID09PSAwKSB7CgkJCWZvcihpPTA7IGk8ZW50cnlfY291bnQ7IGkrKykgewoJCQkJdGhpcy5zYW1wbGVfY291bnRzLnB1c2goc3RyZWFtLnJlYWRVaW50MzIoKSk7CgkJCQkvKiBzb21lIGZpbGVzIGFyZSBidWdneSBhbmQgZGVjbGFyZSB2ZXJzaW9uPTAgd2hpbGUgdXNpbmcgc2lnbmVkIG9mZnNldHMuCgkJCQkgICBUaGUgbGlrZWx5aG9vZCBvZiB1c2luZyB0aGUgbW9zdCBzaWduaWZpY2FudCBiaXQgaW4gYSAzMi1iaXRzIHRpbWUgb2Zmc2V0IGlzIHZlcnkgbG93LAoJCQkJICAgc28gdXNpbmcgc2lnbmVkIHZhbHVlIGhlcmUgYXMgd2VsbCAqLwoJCQkJICAgdmFyIHZhbHVlID0gc3RyZWFtLnJlYWRJbnQzMigpOwoJCQkJICAgaWYgKHZhbHVlIDwgMCkgewoJCQkJICAgCQlMb2cud2FybigiQm94UGFyc2VyIiwgImN0dHMgYm94IHVzZXMgbmVnYXRpdmUgdmFsdWVzIHdpdGhvdXQgdXNpbmcgdmVyc2lvbiAxIik7CgkJCQkgICB9CgkJCQl0aGlzLnNhbXBsZV9vZmZzZXRzLnB1c2godmFsdWUpOwoJCQl9CgkJfSBlbHNlIGlmICh0aGlzLnZlcnNpb24gPT0gMSkgewoJCQlmb3IoaT0wOyBpPGVudHJ5X2NvdW50OyBpKyspIHsKCQkJCXRoaXMuc2FtcGxlX2NvdW50cy5wdXNoKHN0cmVhbS5yZWFkVWludDMyKCkpOwoJCQkJdGhpcy5zYW1wbGVfb2Zmc2V0cy5wdXNoKHN0cmVhbS5yZWFkSW50MzIoKSk7IC8qIHNpZ25lZCAqLwoJCQl9CgkJfQoJfSk7CgoJLy8gZmlsZTpzcmMvcGFyc2luZy9kYWMzLmpzCglCb3hQYXJzZXIuY3JlYXRlQm94Q3RvcigiZGFjMyIsIGZ1bmN0aW9uKHN0cmVhbSkgewoJCXZhciB0bXBfYnl0ZTEgPSBzdHJlYW0ucmVhZFVpbnQ4KCk7CgkJdmFyIHRtcF9ieXRlMiA9IHN0cmVhbS5yZWFkVWludDgoKTsKCQl2YXIgdG1wX2J5dGUzID0gc3RyZWFtLnJlYWRVaW50OCgpOwoJCXRoaXMuZnNjb2QgPSB0bXBfYnl0ZTEgPj4gNjsKCQl0aGlzLmJzaWQgID0gKCh0bXBfYnl0ZTEgPj4gMSkgJiAweDFGKTsKCQl0aGlzLmJzbW9kID0gKCh0bXBfYnl0ZTEgJiAweDEpIDw8ICAyKSB8ICgodG1wX2J5dGUyID4+IDYpICYgMHgzKTsKCQl0aGlzLmFjbW9kID0gKCh0bXBfYnl0ZTIgPj4gMykgJiAweDcpOwoJCXRoaXMubGZlb24gPSAoKHRtcF9ieXRlMiA+PiAyKSAmIDB4MSk7CgkJdGhpcy5iaXRfcmF0ZV9jb2RlID0gKHRtcF9ieXRlMiAmIDB4MykgfCAoKHRtcF9ieXRlMyA+PiA1KSAmIDB4Nyk7Cgl9KTsKCgkvLyBmaWxlOnNyYy9wYXJzaW5nL2RlYzMuanMKCUJveFBhcnNlci5jcmVhdGVCb3hDdG9yKCJkZWMzIiwgZnVuY3Rpb24oc3RyZWFtKSB7CgkJdmFyIHRtcF8xNiA9IHN0cmVhbS5yZWFkVWludDE2KCk7CgkJdGhpcy5kYXRhX3JhdGUgPSB0bXBfMTYgPj4gMzsKCQl0aGlzLm51bV9pbmRfc3ViID0gdG1wXzE2ICYgMHg3OwoJCXRoaXMuaW5kX3N1YnMgPSBbXTsKCQlmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMubnVtX2luZF9zdWIrMTsgaSsrKSB7CgkJCXZhciBpbmRfc3ViID0ge307CgkJCXRoaXMuaW5kX3N1YnMucHVzaChpbmRfc3ViKTsKCQkJdmFyIHRtcF9ieXRlMSA9IHN0cmVhbS5yZWFkVWludDgoKTsKCQkJdmFyIHRtcF9ieXRlMiA9IHN0cmVhbS5yZWFkVWludDgoKTsKCQkJdmFyIHRtcF9ieXRlMyA9IHN0cmVhbS5yZWFkVWludDgoKTsKCQkJaW5kX3N1Yi5mc2NvZCA9IHRtcF9ieXRlMSA+PiA2OwoJCQlpbmRfc3ViLmJzaWQgID0gKCh0bXBfYnl0ZTEgPj4gMSkgJiAweDFGKTsKCQkJaW5kX3N1Yi5ic21vZCA9ICgodG1wX2J5dGUxICYgMHgxKSA8PCA0KSB8ICgodG1wX2J5dGUyID4+IDQpICYgMHhGKTsKCQkJaW5kX3N1Yi5hY21vZCA9ICgodG1wX2J5dGUyID4+IDEpICYgMHg3KTsKCQkJaW5kX3N1Yi5sZmVvbiA9ICh0bXBfYnl0ZTIgJiAweDEpOwoJCQlpbmRfc3ViLm51bV9kZXBfc3ViID0gKCh0bXBfYnl0ZTMgPj4gMSkgJiAweEYpOwoJCQlpZiAoaW5kX3N1Yi5udW1fZGVwX3N1YiA+IDApIHsKCQkJCWluZF9zdWIuY2hhbl9sb2MgPSAoKHRtcF9ieXRlMyAmIDB4MSkgPDwgOCkgfCBzdHJlYW0ucmVhZFVpbnQ4KCk7CgkJCX0KCQl9Cgl9KTsKCgkvLyBmaWxlOnNyYy9wYXJzaW5nL2RmTGEuanMKCUJveFBhcnNlci5jcmVhdGVGdWxsQm94Q3RvcigiZGZMYSIsIGZ1bmN0aW9uKHN0cmVhbSkgewoJICAgIHZhciBCTE9DS1RZUEVfTUFTSyA9IDB4N0Y7CgkgICAgdmFyIExBU1RNRVRBREFUQUJMT0NLRkxBR19NQVNLID0gMHg4MDsKCgkgICAgdmFyIGJveGVzRm91bmQgPSBbXTsKCSAgICB2YXIga25vd25CbG9ja1R5cGVzID0gWwoJICAgICAgICAiU1RSRUFNSU5GTyIsCgkgICAgICAgICJQQURESU5HIiwKCSAgICAgICAgIkFQUExJQ0FUSU9OIiwKCSAgICAgICAgIlNFRUtUQUJMRSIsCgkgICAgICAgICJWT1JCSVNfQ09NTUVOVCIsCgkgICAgICAgICJDVUVTSEVFVCIsCgkgICAgICAgICJQSUNUVVJFIiwKCSAgICAgICAgIlJFU0VSVkVEIgoJICAgIF07CgoJICAgIC8vIGRmTGEgaXMgYSBGdWxsQm94CgkgICAgdGhpcy5wYXJzZUZ1bGxIZWFkZXIoc3RyZWFtKTsKCgkgICAgLy8gZm9yIChpPTA7IDsgaSsrKSB7IC8vIHRvIGVuZCBvZiBib3gKCSAgICBkbyB7CgkgICAgICAgIHZhciBmbGFnQW5kVHlwZSA9IHN0cmVhbS5yZWFkVWludDgoKTsKCgkgICAgICAgIHZhciB0eXBlID0gTWF0aC5taW4oCgkgICAgICAgICAgICAoZmxhZ0FuZFR5cGUgJiBCTE9DS1RZUEVfTUFTSyksCgkgICAgICAgICAgICAoa25vd25CbG9ja1R5cGVzLmxlbmd0aCAtIDEpCgkgICAgICAgICk7CgoJICAgICAgICAvLyBpZiB0aGlzIGlzIGEgU1RSRUFNSU5GTyBibG9jaywgcmVhZCB0aGUgdHJ1ZSBzYW1wbGVyYXRlIHNpbmNlIHRoaXMKCSAgICAgICAgLy8gY2FuIGJlIGRpZmZlcmVudCB0byB0aGUgQXVkaW9TYW1wbGVFbnRyeSBzYW1wbGVyYXRlLgoJICAgICAgICBpZiAoISh0eXBlKSkgewoJICAgICAgICAgICAgLy8gcmVhZCBwYXN0IGFsbCB0aGUgb3RoZXIgc3R1ZmYKCSAgICAgICAgICAgIHN0cmVhbS5yZWFkVWludDhBcnJheSgxMyk7CgoJICAgICAgICAgICAgLy8gZXh0cmFjdCBzYW1wbGVyYXRlCgkgICAgICAgICAgICB0aGlzLnNhbXBsZXJhdGUgPSAoc3RyZWFtLnJlYWRVaW50MzIoKSA+PiAxMik7CgoJICAgICAgICAgICAgLy8gcmVhZCB0byBlbmQgb2YgU1RSRUFNSU5GTwoJICAgICAgICAgICAgc3RyZWFtLnJlYWRVaW50OEFycmF5KDIwKTsKCSAgICAgICAgfSBlbHNlIHsKCSAgICAgICAgICAgIC8vIG5vdCBpbnRlcmVzdGVkIGluIG90aGVyIGJsb2NrIHR5cGVzIHNvIGp1c3QgZGlzY2FyZCBsZW5ndGggYnl0ZXMKCSAgICAgICAgICAgIHN0cmVhbS5yZWFkVWludDhBcnJheShzdHJlYW0ucmVhZFVpbnQyNCgpKTsKCSAgICAgICAgfQoKCSAgICAgICAgYm94ZXNGb3VuZC5wdXNoKGtub3duQmxvY2tUeXBlc1t0eXBlXSk7CgoJICAgICAgICBpZiAoISEoZmxhZ0FuZFR5cGUgJiBMQVNUTUVUQURBVEFCTE9DS0ZMQUdfTUFTSykpIHsKCSAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICB9CgkgICAgfSB3aGlsZSAodHJ1ZSk7CgoJICAgIHRoaXMubnVtTWV0YWRhdGFCbG9ja3MgPQoJICAgICAgICBib3hlc0ZvdW5kLmxlbmd0aCArICIgKCIgKyBib3hlc0ZvdW5kLmpvaW4oIiwgIikgKyAiKSI7Cgl9KTsKCS8vIGZpbGU6c3JjL3BhcnNpbmcvZGltbS5qcwoJQm94UGFyc2VyLmNyZWF0ZUJveEN0b3IoImRpbW0iLCBmdW5jdGlvbihzdHJlYW0pIHsKCQl0aGlzLmJ5dGVzc2VudCA9IHN0cmVhbS5yZWFkVWludDY0KCk7Cgl9KTsKCgkvLyBmaWxlOnNyYy9wYXJzaW5nL2RtYXguanMKCUJveFBhcnNlci5jcmVhdGVCb3hDdG9yKCJkbWF4IiwgZnVuY3Rpb24oc3RyZWFtKSB7CgkJdGhpcy50aW1lID0gc3RyZWFtLnJlYWRVaW50MzIoKTsKCX0pOwoKCS8vIGZpbGU6c3JjL3BhcnNpbmcvZG1lZC5qcwoJQm94UGFyc2VyLmNyZWF0ZUJveEN0b3IoImRtZWQiLCBmdW5jdGlvbihzdHJlYW0pIHsKCQl0aGlzLmJ5dGVzc2VudCA9IHN0cmVhbS5yZWFkVWludDY0KCk7Cgl9KTsKCgkvLyBmaWxlOnNyYy9wYXJzaW5nL2RPcHMuanMKCUJveFBhcnNlci5jcmVhdGVCb3hDdG9yKCJkT3BzIiwgZnVuY3Rpb24oc3RyZWFtKSB7CgkJdGhpcy5WZXJzaW9uID0gc3RyZWFtLnJlYWRVaW50OCgpOwoJCXRoaXMuT3V0cHV0Q2hhbm5lbENvdW50ID0gc3RyZWFtLnJlYWRVaW50OCgpOwoJCXRoaXMuUHJlU2tpcCA9IHN0cmVhbS5yZWFkVWludDE2KCk7CgkJdGhpcy5JbnB1dFNhbXBsZVJhdGUgPSBzdHJlYW0ucmVhZFVpbnQzMigpOwoJCXRoaXMuT3V0cHV0R2FpbiA9IHN0cmVhbS5yZWFkSW50MTYoKTsKCQl0aGlzLkNoYW5uZWxNYXBwaW5nRmFtaWx5ID0gc3RyZWFtLnJlYWRVaW50OCgpOwoJCWlmICh0aGlzLkNoYW5uZWxNYXBwaW5nRmFtaWx5ICE9PSAwKSB7CgkJCXRoaXMuU3RyZWFtQ291bnQgPSBzdHJlYW0ucmVhZFVpbnQ4KCk7CgkJCXRoaXMuQ291cGxlZENvdW50ID0gc3RyZWFtLnJlYWRVaW50OCgpOwoJCQl0aGlzLkNoYW5uZWxNYXBwaW5nID0gW107CgkJCWZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5PdXRwdXRDaGFubmVsQ291bnQ7IGkrKykgewoJCQkJdGhpcy5DaGFubmVsTWFwcGluZ1tpXSA9IHN0cmVhbS5yZWFkVWludDgoKTsKCQkJfQoJCX0KCX0pOwoKCS8vIGZpbGU6c3JjL3BhcnNpbmcvZHJlZi5qcwoJQm94UGFyc2VyLmNyZWF0ZUZ1bGxCb3hDdG9yKCJkcmVmIiwgZnVuY3Rpb24oc3RyZWFtKSB7CgkJdmFyIHJldDsKCQl2YXIgYm94OwoJCXRoaXMuZW50cmllcyA9IFtdOwoJCXZhciBlbnRyeV9jb3VudCA9IHN0cmVhbS5yZWFkVWludDMyKCk7CgkJZm9yICh2YXIgaSA9IDA7IGkgPCBlbnRyeV9jb3VudDsgaSsrKSB7CgkJCXJldCA9IEJveFBhcnNlci5wYXJzZU9uZUJveChzdHJlYW0sIGZhbHNlLCB0aGlzLnNpemUgLSAoc3RyZWFtLmdldFBvc2l0aW9uKCkgLSB0aGlzLnN0YXJ0KSk7CgkJCWlmIChyZXQuY29kZSA9PT0gQm94UGFyc2VyLk9LKSB7CgkJCQlib3ggPSByZXQuYm94OwoJCQkJdGhpcy5lbnRyaWVzLnB1c2goYm94KTsKCQkJfSBlbHNlIHsKCQkJCXJldHVybjsKCQkJfQoJCX0KCX0pOwoKCS8vIGZpbGU6c3JjL3BhcnNpbmcvZHJlcC5qcwoJQm94UGFyc2VyLmNyZWF0ZUJveEN0b3IoImRyZXAiLCBmdW5jdGlvbihzdHJlYW0pIHsKCQl0aGlzLmJ5dGVzc2VudCA9IHN0cmVhbS5yZWFkVWludDY0KCk7Cgl9KTsKCgkvLyBmaWxlOnNyYy9wYXJzaW5nL2VsbmcuanMKCUJveFBhcnNlci5jcmVhdGVGdWxsQm94Q3RvcigiZWxuZyIsIGZ1bmN0aW9uKHN0cmVhbSkgewoJCXRoaXMuZXh0ZW5kZWRfbGFuZ3VhZ2UgPSBzdHJlYW0ucmVhZFN0cmluZyh0aGlzLnNpemUtdGhpcy5oZHJfc2l6ZSk7Cgl9KTsKCgkvLyBmaWxlOnNyYy9wYXJzaW5nL2Vsc3QuanMKCUJveFBhcnNlci5jcmVhdGVGdWxsQm94Q3RvcigiZWxzdCIsIGZ1bmN0aW9uKHN0cmVhbSkgewoJCXRoaXMuZW50cmllcyA9IFtdOwoJCXZhciBlbnRyeV9jb3VudCA9IHN0cmVhbS5yZWFkVWludDMyKCk7CgkJZm9yICh2YXIgaSA9IDA7IGkgPCBlbnRyeV9jb3VudDsgaSsrKSB7CgkJCXZhciBlbnRyeSA9IHt9OwoJCQl0aGlzLmVudHJpZXMucHVzaChlbnRyeSk7CgkJCWlmICh0aGlzLnZlcnNpb24gPT09IDEpIHsKCQkJCWVudHJ5LnNlZ21lbnRfZHVyYXRpb24gPSBzdHJlYW0ucmVhZFVpbnQ2NCgpOwoJCQkJZW50cnkubWVkaWFfdGltZSA9IHN0cmVhbS5yZWFkSW50NjQoKTsKCQkJfSBlbHNlIHsKCQkJCWVudHJ5LnNlZ21lbnRfZHVyYXRpb24gPSBzdHJlYW0ucmVhZFVpbnQzMigpOwoJCQkJZW50cnkubWVkaWFfdGltZSA9IHN0cmVhbS5yZWFkSW50MzIoKTsKCQkJfQoJCQllbnRyeS5tZWRpYV9yYXRlX2ludGVnZXIgPSBzdHJlYW0ucmVhZEludDE2KCk7CgkJCWVudHJ5Lm1lZGlhX3JhdGVfZnJhY3Rpb24gPSBzdHJlYW0ucmVhZEludDE2KCk7CgkJfQoJfSk7CgoJLy8gZmlsZTpzcmMvcGFyc2luZy9lbXNnLmpzCglCb3hQYXJzZXIuY3JlYXRlRnVsbEJveEN0b3IoImVtc2ciLCBmdW5jdGlvbihzdHJlYW0pIHsKCQlpZiAodGhpcy52ZXJzaW9uID09IDEpIHsKCQkJdGhpcy50aW1lc2NhbGUgCQkJCQk9IHN0cmVhbS5yZWFkVWludDMyKCk7CgkJCXRoaXMucHJlc2VudGF0aW9uX3RpbWUgCQkJPSBzdHJlYW0ucmVhZFVpbnQ2NCgpOwoJCQl0aGlzLmV2ZW50X2R1cmF0aW9uCQkJIAk9IHN0cmVhbS5yZWFkVWludDMyKCk7CgkJCXRoaXMuaWQgCQkJCQkJPSBzdHJlYW0ucmVhZFVpbnQzMigpOwoJCQl0aGlzLnNjaGVtZV9pZF91cmkgCQkJCT0gc3RyZWFtLnJlYWRDU3RyaW5nKCk7CgkJCXRoaXMudmFsdWUgCQkJCQkJPSBzdHJlYW0ucmVhZENTdHJpbmcoKTsKCQl9IGVsc2UgewoJCQl0aGlzLnNjaGVtZV9pZF91cmkgCQkJCT0gc3RyZWFtLnJlYWRDU3RyaW5nKCk7CgkJCXRoaXMudmFsdWUgCQkJCQkJPSBzdHJlYW0ucmVhZENTdHJpbmcoKTsKCQkJdGhpcy50aW1lc2NhbGUgCQkJCQk9IHN0cmVhbS5yZWFkVWludDMyKCk7CgkJCXRoaXMucHJlc2VudGF0aW9uX3RpbWVfZGVsdGEgCT0gc3RyZWFtLnJlYWRVaW50MzIoKTsKCQkJdGhpcy5ldmVudF9kdXJhdGlvbgkJCSAJPSBzdHJlYW0ucmVhZFVpbnQzMigpOwoJCQl0aGlzLmlkIAkJCQkJCT0gc3RyZWFtLnJlYWRVaW50MzIoKTsKCQl9CgkJdmFyIG1lc3NhZ2Vfc2l6ZSA9IHRoaXMuc2l6ZSAtIHRoaXMuaGRyX3NpemUgLSAoNCo0ICsgKHRoaXMuc2NoZW1lX2lkX3VyaS5sZW5ndGgrMSkgKyAodGhpcy52YWx1ZS5sZW5ndGgrMSkpOwoJCWlmICh0aGlzLnZlcnNpb24gPT0gMSkgewoJCQltZXNzYWdlX3NpemUgLT0gNDsKCQl9CgkJdGhpcy5tZXNzYWdlX2RhdGEgPSBzdHJlYW0ucmVhZFVpbnQ4QXJyYXkobWVzc2FnZV9zaXplKTsKCX0pOwoKCS8vIGZpbGU6c3JjL3BhcnNpbmcvZXNkcy5qcwoJQm94UGFyc2VyLmNyZWF0ZUZ1bGxCb3hDdG9yKCJlc2RzIiwgZnVuY3Rpb24oc3RyZWFtKSB7CgkJdmFyIGVzZF9kYXRhID0gc3RyZWFtLnJlYWRVaW50OEFycmF5KHRoaXMuc2l6ZS10aGlzLmhkcl9zaXplKTsKCQlpZiAodHlwZW9mIE1QRUc0RGVzY3JpcHRvclBhcnNlciAhPT0gInVuZGVmaW5lZCIpIHsKCQkJdmFyIGVzZF9wYXJzZXIgPSBuZXcgTVBFRzREZXNjcmlwdG9yUGFyc2VyKCk7CgkJCXRoaXMuZXNkID0gZXNkX3BhcnNlci5wYXJzZU9uZURlc2NyaXB0b3IobmV3IERhdGFTdHJlYW0oZXNkX2RhdGEuYnVmZmVyLCAwLCBEYXRhU3RyZWFtLkJJR19FTkRJQU4pKTsKCQl9Cgl9KTsKCgkvLyBmaWxlOnNyYy9wYXJzaW5nL2ZpZWwuanMKCUJveFBhcnNlci5jcmVhdGVCb3hDdG9yKCJmaWVsIiwgZnVuY3Rpb24oc3RyZWFtKSB7CgkJdGhpcy5maWVsZENvdW50ID0gc3RyZWFtLnJlYWRVaW50OCgpOwoJCXRoaXMuZmllbGRPcmRlcmluZyA9IHN0cmVhbS5yZWFkVWludDgoKTsKCX0pOwoKCS8vIGZpbGU6c3JjL3BhcnNpbmcvZnJtYS5qcwoJQm94UGFyc2VyLmNyZWF0ZUJveEN0b3IoImZybWEiLCBmdW5jdGlvbihzdHJlYW0pIHsKCQl0aGlzLmRhdGFfZm9ybWF0ID0gc3RyZWFtLnJlYWRTdHJpbmcoNCk7Cgl9KTsKCgkvLyBmaWxlOnNyYy9wYXJzaW5nL2Z0eXAuanMKCUJveFBhcnNlci5jcmVhdGVCb3hDdG9yKCJmdHlwIiwgZnVuY3Rpb24oc3RyZWFtKSB7CgkJdmFyIHRvcGFyc2UgPSB0aGlzLnNpemUgLSB0aGlzLmhkcl9zaXplOwoJCXRoaXMubWFqb3JfYnJhbmQgPSBzdHJlYW0ucmVhZFN0cmluZyg0KTsKCQl0aGlzLm1pbm9yX3ZlcnNpb24gPSBzdHJlYW0ucmVhZFVpbnQzMigpOwoJCXRvcGFyc2UgLT0gODsKCQl0aGlzLmNvbXBhdGlibGVfYnJhbmRzID0gW107CgkJdmFyIGkgPSAwOwoJCXdoaWxlICh0b3BhcnNlPj00KSB7CgkJCXRoaXMuY29tcGF0aWJsZV9icmFuZHNbaV0gPSBzdHJlYW0ucmVhZFN0cmluZyg0KTsKCQkJdG9wYXJzZSAtPSA0OwoJCQlpKys7CgkJfQoJfSk7CgoJLy8gZmlsZTpzcmMvcGFyc2luZy9oZGxyLmpzCglCb3hQYXJzZXIuY3JlYXRlRnVsbEJveEN0b3IoImhkbHIiLCBmdW5jdGlvbihzdHJlYW0pIHsKCQlpZiAodGhpcy52ZXJzaW9uID09PSAwKSB7CgkJCXN0cmVhbS5yZWFkVWludDMyKCk7CgkJCXRoaXMuaGFuZGxlciA9IHN0cmVhbS5yZWFkU3RyaW5nKDQpOwoJCQlzdHJlYW0ucmVhZFVpbnQzMkFycmF5KDMpOwoJCQl0aGlzLm5hbWUgPSBzdHJlYW0ucmVhZFN0cmluZyh0aGlzLnNpemUtdGhpcy5oZHJfc2l6ZS0yMCk7CgkJCWlmICh0aGlzLm5hbWVbdGhpcy5uYW1lLmxlbmd0aC0xXT09PSdcMCcpIHsKCQkJCXRoaXMubmFtZSA9IHRoaXMubmFtZS5zbGljZSgwLC0xKTsKCQkJfQoJCX0KCX0pOwoKCS8vIGZpbGU6c3JjL3BhcnNpbmcvaHZjQy5qcwoJQm94UGFyc2VyLmNyZWF0ZUJveEN0b3IoImh2Y0MiLCBmdW5jdGlvbihzdHJlYW0pIHsKCQl2YXIgaSwgajsKCQl2YXIgbGVuZ3RoOwoJCXZhciB0bXBfYnl0ZTsKCQl0aGlzLmNvbmZpZ3VyYXRpb25WZXJzaW9uID0gc3RyZWFtLnJlYWRVaW50OCgpOwoJCXRtcF9ieXRlID0gc3RyZWFtLnJlYWRVaW50OCgpOwoJCXRoaXMuZ2VuZXJhbF9wcm9maWxlX3NwYWNlID0gdG1wX2J5dGUgPj4gNjsKCQl0aGlzLmdlbmVyYWxfdGllcl9mbGFnID0gKHRtcF9ieXRlICYgMHgyMCkgPj4gNTsKCQl0aGlzLmdlbmVyYWxfcHJvZmlsZV9pZGMgPSAodG1wX2J5dGUgJiAweDFGKTsKCQl0aGlzLmdlbmVyYWxfcHJvZmlsZV9jb21wYXRpYmlsaXR5ID0gc3RyZWFtLnJlYWRVaW50MzIoKTsKCQl0aGlzLmdlbmVyYWxfY29uc3RyYWludF9pbmRpY2F0b3IgPSBzdHJlYW0ucmVhZFVpbnQ4QXJyYXkoNik7CgkJdGhpcy5nZW5lcmFsX2xldmVsX2lkYyA9IHN0cmVhbS5yZWFkVWludDgoKTsKCQl0aGlzLm1pbl9zcGF0aWFsX3NlZ21lbnRhdGlvbl9pZGMgPSBzdHJlYW0ucmVhZFVpbnQxNigpICYgMHhGRkY7CgkJdGhpcy5wYXJhbGxlbGlzbVR5cGUgPSAoc3RyZWFtLnJlYWRVaW50OCgpICYgMHgzKTsKCQl0aGlzLmNocm9tYV9mb3JtYXRfaWRjID0gKHN0cmVhbS5yZWFkVWludDgoKSAmIDB4Myk7CgkJdGhpcy5iaXRfZGVwdGhfbHVtYV9taW51czggPSAoc3RyZWFtLnJlYWRVaW50OCgpICYgMHg3KTsKCQl0aGlzLmJpdF9kZXB0aF9jaHJvbWFfbWludXM4ID0gKHN0cmVhbS5yZWFkVWludDgoKSAmIDB4Nyk7CgkJdGhpcy5hdmdGcmFtZVJhdGUgPSBzdHJlYW0ucmVhZFVpbnQxNigpOwoJCXRtcF9ieXRlID0gc3RyZWFtLnJlYWRVaW50OCgpOwoJCXRoaXMuY29uc3RhbnRGcmFtZVJhdGUgPSAodG1wX2J5dGUgPj4gNik7CgkJdGhpcy5udW1UZW1wb3JhbExheWVycyA9ICh0bXBfYnl0ZSAmIDBYRCkgPj4gMzsKCQl0aGlzLnRlbXBvcmFsSWROZXN0ZWQgPSAodG1wX2J5dGUgJiAwWDQpID4+IDI7CgkJdGhpcy5sZW5ndGhTaXplTWludXNPbmUgPSAodG1wX2J5dGUgJiAwWDMpOwoKCQl0aGlzLm5hbHVfYXJyYXlzID0gW107CgkJdmFyIG51bU9mQXJyYXlzID0gc3RyZWFtLnJlYWRVaW50OCgpOwoJCWZvciAoaSA9IDA7IGkgPCBudW1PZkFycmF5czsgaSsrKSB7CgkJCXZhciBuYWx1X2FycmF5ID0gW107CgkJCXRoaXMubmFsdV9hcnJheXMucHVzaChuYWx1X2FycmF5KTsKCQkJdG1wX2J5dGUgPSBzdHJlYW0ucmVhZFVpbnQ4KCk7CgkJCW5hbHVfYXJyYXkuY29tcGxldGVuZXNzID0gKHRtcF9ieXRlICYgMHg4MCkgPj4gNzsKCQkJbmFsdV9hcnJheS5uYWx1X3R5cGUgPSB0bXBfYnl0ZSAmIDB4M0Y7CgkJCXZhciBudW1OYWx1cyA9IHN0cmVhbS5yZWFkVWludDE2KCk7CgkJCWZvciAoaiA9IDA7IGogPCBudW1OYWx1czsgaisrKSB7CgkJCQl2YXIgbmFsdSA9IHt9OwoJCQkJbmFsdV9hcnJheS5wdXNoKG5hbHUpOwoJCQkJbGVuZ3RoID0gc3RyZWFtLnJlYWRVaW50MTYoKTsKCQkJCW5hbHUuZGF0YSAgID0gc3RyZWFtLnJlYWRVaW50OEFycmF5KGxlbmd0aCk7CgkJCX0KCQl9Cgl9KTsKCgkvLyBmaWxlOnNyYy9wYXJzaW5nL2lpbmYuanMKCUJveFBhcnNlci5jcmVhdGVGdWxsQm94Q3RvcigiaWluZiIsIGZ1bmN0aW9uKHN0cmVhbSkgewoJCXZhciByZXQ7CgkJaWYgKHRoaXMudmVyc2lvbiA9PT0gMCkgewoJCQl0aGlzLmVudHJ5X2NvdW50ID0gc3RyZWFtLnJlYWRVaW50MTYoKTsKCQl9IGVsc2UgewoJCQl0aGlzLmVudHJ5X2NvdW50ID0gc3RyZWFtLnJlYWRVaW50MzIoKTsKCQl9CgkJdGhpcy5pdGVtX2luZm9zID0gW107CgkJZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmVudHJ5X2NvdW50OyBpKyspIHsKCQkJcmV0ID0gQm94UGFyc2VyLnBhcnNlT25lQm94KHN0cmVhbSwgZmFsc2UsIHRoaXMuc2l6ZSAtIChzdHJlYW0uZ2V0UG9zaXRpb24oKSAtIHRoaXMuc3RhcnQpKTsKCQkJaWYgKHJldC5jb2RlID09PSBCb3hQYXJzZXIuT0spIHsKCQkJCWlmIChyZXQuYm94LnR5cGUgIT09ICJpbmZlIikgewoJCQkJCUxvZy5lcnJvcigiQm94UGFyc2VyIiwgIkV4cGVjdGVkICdpbmZlJyBib3gsIGdvdCAiK3JldC5ib3gudHlwZSk7CgkJCQl9CgkJCQl0aGlzLml0ZW1faW5mb3NbaV0gPSByZXQuYm94OwoJCQl9IGVsc2UgewoJCQkJcmV0dXJuOwoJCQl9CgkJfQoJfSk7CgoJLy8gZmlsZTpzcmMvcGFyc2luZy9pbG9jLmpzCglCb3hQYXJzZXIuY3JlYXRlRnVsbEJveEN0b3IoImlsb2MiLCBmdW5jdGlvbihzdHJlYW0pIHsKCQl2YXIgYnl0ZTsKCQlieXRlID0gc3RyZWFtLnJlYWRVaW50OCgpOwoJCXRoaXMub2Zmc2V0X3NpemUgPSAoYnl0ZSA+PiA0KSAmIDB4RjsKCQl0aGlzLmxlbmd0aF9zaXplID0gYnl0ZSAmIDB4RjsKCQlieXRlID0gc3RyZWFtLnJlYWRVaW50OCgpOwoJCXRoaXMuYmFzZV9vZmZzZXRfc2l6ZSA9IChieXRlID4+IDQpICYgMHhGOwoJCWlmICh0aGlzLnZlcnNpb24gPT09IDEgfHwgdGhpcy52ZXJzaW9uID09PSAyKSB7CgkJCXRoaXMuaW5kZXhfc2l6ZSA9IGJ5dGUgJiAweEY7CgkJfSBlbHNlIHsKCQkJdGhpcy5pbmRleF9zaXplID0gMDsKCQkJLy8gcmVzZXJ2ZWQgPSBieXRlICYgMHhGOwoJCX0KCQl0aGlzLml0ZW1zID0gW107CgkJdmFyIGl0ZW1fY291bnQgPSAwOwoJCWlmICh0aGlzLnZlcnNpb24gPCAyKSB7CgkJCWl0ZW1fY291bnQgPSBzdHJlYW0ucmVhZFVpbnQxNigpOwoJCX0gZWxzZSBpZiAodGhpcy52ZXJzaW9uID09PSAyKSB7CgkJCWl0ZW1fY291bnQgPSBzdHJlYW0ucmVhZFVpbnQzMigpOwoJCX0gZWxzZSB7CgkJCXRocm93ICJ2ZXJzaW9uIG9mIGlsb2MgYm94IG5vdCBzdXBwb3J0ZWQiOwoJCX0KCQlmb3IgKHZhciBpID0gMDsgaSA8IGl0ZW1fY291bnQ7IGkrKykgewoJCQl2YXIgaXRlbSA9IHt9OwoJCQl0aGlzLml0ZW1zLnB1c2goaXRlbSk7CgkJCWlmICh0aGlzLnZlcnNpb24gPCAyKSB7CgkJCQlpdGVtLml0ZW1fSUQgPSBzdHJlYW0ucmVhZFVpbnQxNigpOwoJCQl9IGVsc2UgaWYgKHRoaXMudmVyc2lvbiA9PT0gMikgewoJCQkJaXRlbS5pdGVtX0lEID0gc3RyZWFtLnJlYWRVaW50MTYoKTsKCQkJfSBlbHNlIHsKCQkJCXRocm93ICJ2ZXJzaW9uIG9mIGlsb2MgYm94IG5vdCBzdXBwb3J0ZWQiOwoJCQl9CgkJCWlmICh0aGlzLnZlcnNpb24gPT09IDEgfHwgdGhpcy52ZXJzaW9uID09PSAyKSB7CgkJCQlpdGVtLmNvbnN0cnVjdGlvbl9tZXRob2QgPSAoc3RyZWFtLnJlYWRVaW50MTYoKSAmIDB4Rik7CgkJCX0gZWxzZSB7CgkJCQlpdGVtLmNvbnN0cnVjdGlvbl9tZXRob2QgPSAwOwoJCQl9CgkJCWl0ZW0uZGF0YV9yZWZlcmVuY2VfaW5kZXggPSBzdHJlYW0ucmVhZFVpbnQxNigpOwoJCQlzd2l0Y2godGhpcy5iYXNlX29mZnNldF9zaXplKSB7CgkJCQljYXNlIDA6CgkJCQkJaXRlbS5iYXNlX29mZnNldCA9IDA7CgkJCQkJYnJlYWs7CgkJCQljYXNlIDQ6CgkJCQkJaXRlbS5iYXNlX29mZnNldCA9IHN0cmVhbS5yZWFkVWludDMyKCk7CgkJCQkJYnJlYWs7CgkJCQljYXNlIDg6CgkJCQkJaXRlbS5iYXNlX29mZnNldCA9IHN0cmVhbS5yZWFkVWludDY0KCk7CgkJCQkJYnJlYWs7CgkJCQlkZWZhdWx0OgoJCQkJCXRocm93ICJFcnJvciByZWFkaW5nIGJhc2Ugb2Zmc2V0IHNpemUiOwoJCQl9CgkJCXZhciBleHRlbnRfY291bnQgPSBzdHJlYW0ucmVhZFVpbnQxNigpOwoJCQlpdGVtLmV4dGVudHMgPSBbXTsKCQkJZm9yICh2YXIgaj0wOyBqIDwgZXh0ZW50X2NvdW50OyBqKyspIHsKCQkJCXZhciBleHRlbnQgPSB7fTsKCQkJCWl0ZW0uZXh0ZW50cy5wdXNoKGV4dGVudCk7CgkJCQlpZiAodGhpcy52ZXJzaW9uID09PSAxIHx8IHRoaXMudmVyc2lvbiA9PT0gMikgewoJCQkJCXN3aXRjaCh0aGlzLmluZGV4X3NpemUpIHsKCQkJCQkJY2FzZSAwOgoJCQkJCQkJZXh0ZW50LmV4dGVudF9pbmRleCA9IDA7CgkJCQkJCQlicmVhazsKCQkJCQkJY2FzZSA0OgoJCQkJCQkJZXh0ZW50LmV4dGVudF9pbmRleCA9IHN0cmVhbS5yZWFkVWludDMyKCk7CgkJCQkJCQlicmVhazsKCQkJCQkJY2FzZSA4OgoJCQkJCQkJZXh0ZW50LmV4dGVudF9pbmRleCA9IHN0cmVhbS5yZWFkVWludDY0KCk7CgkJCQkJCQlicmVhazsKCQkJCQkJZGVmYXVsdDoKCQkJCQkJCXRocm93ICJFcnJvciByZWFkaW5nIGV4dGVudCBpbmRleCI7CgkJCQkJfQoJCQkJfQoJCQkJc3dpdGNoKHRoaXMub2Zmc2V0X3NpemUpIHsKCQkJCQljYXNlIDA6CgkJCQkJCWV4dGVudC5leHRlbnRfb2Zmc2V0ID0gMDsKCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSA0OgoJCQkJCQlleHRlbnQuZXh0ZW50X29mZnNldCA9IHN0cmVhbS5yZWFkVWludDMyKCk7CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgODoKCQkJCQkJZXh0ZW50LmV4dGVudF9vZmZzZXQgPSBzdHJlYW0ucmVhZFVpbnQ2NCgpOwoJCQkJCQlicmVhazsKCQkJCQlkZWZhdWx0OgoJCQkJCQl0aHJvdyAiRXJyb3IgcmVhZGluZyBleHRlbnQgaW5kZXgiOwoJCQkJfQoJCQkJc3dpdGNoKHRoaXMubGVuZ3RoX3NpemUpIHsKCQkJCQljYXNlIDA6CgkJCQkJCWV4dGVudC5leHRlbnRfbGVuZ3RoID0gMDsKCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSA0OgoJCQkJCQlleHRlbnQuZXh0ZW50X2xlbmd0aCA9IHN0cmVhbS5yZWFkVWludDMyKCk7CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgODoKCQkJCQkJZXh0ZW50LmV4dGVudF9sZW5ndGggPSBzdHJlYW0ucmVhZFVpbnQ2NCgpOwoJCQkJCQlicmVhazsKCQkJCQlkZWZhdWx0OgoJCQkJCQl0aHJvdyAiRXJyb3IgcmVhZGluZyBleHRlbnQgaW5kZXgiOwoJCQkJfQoJCQl9CgkJfQoJfSk7CgoJLy8gZmlsZTpzcmMvcGFyc2luZy9pbWlyLmpzCglCb3hQYXJzZXIuY3JlYXRlQm94Q3RvcigiaW1pciIsIGZ1bmN0aW9uKHN0cmVhbSkgewoJCXZhciB0bXAgPSBzdHJlYW0ucmVhZFVpbnQ4KCk7CgkJdGhpcy5yZXNlcnZlZCA9IHRtcCA+PiA3OwoJCXRoaXMuYXhpcyA9IHRtcCAmIDE7Cgl9KTsvLyBmaWxlOnNyYy9wYXJzaW5nL2luZmUuanMKCUJveFBhcnNlci5jcmVhdGVGdWxsQm94Q3RvcigiaW5mZSIsIGZ1bmN0aW9uKHN0cmVhbSkgewoJCWlmICh0aGlzLnZlcnNpb24gPT09IDAgfHwgdGhpcy52ZXJzaW9uID09PSAxKSB7CgkJCXRoaXMuaXRlbV9JRCA9IHN0cmVhbS5yZWFkVWludDE2KCk7CgkJCXRoaXMuaXRlbV9wcm90ZWN0aW9uX2luZGV4ID0gc3RyZWFtLnJlYWRVaW50MTYoKTsKCQkJdGhpcy5pdGVtX25hbWUgPSBzdHJlYW0ucmVhZENTdHJpbmcoKTsKCQkJdGhpcy5jb250ZW50X3R5cGUgPSBzdHJlYW0ucmVhZENTdHJpbmcoKTsKCQkJdGhpcy5jb250ZW50X2VuY29kaW5nID0gc3RyZWFtLnJlYWRDU3RyaW5nKCk7CgkJfQoJCWlmICh0aGlzLnZlcnNpb24gPT09IDEpIHsKCQkJdGhpcy5leHRlbnNpb25fdHlwZSA9IHN0cmVhbS5yZWFkU3RyaW5nKDQpOwoJCQlMb2cud2FybigiQm94UGFyc2VyIiwgIkNhbm5vdCBwYXJzZSBleHRlbnNpb24gdHlwZSIpOwoJCQlzdHJlYW0uc2Vlayh0aGlzLnN0YXJ0K3RoaXMuc2l6ZSk7CgkJCXJldHVybjsKCQl9CgkJaWYgKHRoaXMudmVyc2lvbiA+PSAyKSB7CgkJCWlmICh0aGlzLnZlcnNpb24gPT09IDIpIHsKCQkJCXRoaXMuaXRlbV9JRCA9IHN0cmVhbS5yZWFkVWludDE2KCk7CgkJCX0gZWxzZSBpZiAodGhpcy52ZXJzaW9uID09PSAzKSB7CgkJCQl0aGlzLml0ZW1fSUQgPSBzdHJlYW0ucmVhZFVpbnQzMigpOwoJCQl9CgkJCXRoaXMuaXRlbV9wcm90ZWN0aW9uX2luZGV4ID0gc3RyZWFtLnJlYWRVaW50MTYoKTsKCQkJdGhpcy5pdGVtX3R5cGUgPSBzdHJlYW0ucmVhZFN0cmluZyg0KTsKCQkJdGhpcy5pdGVtX25hbWUgPSBzdHJlYW0ucmVhZENTdHJpbmcoKTsKCQkJaWYgKHRoaXMuaXRlbV90eXBlID09PSAibWltZSIpIHsKCQkJCXRoaXMuY29udGVudF90eXBlID0gc3RyZWFtLnJlYWRDU3RyaW5nKCk7CgkJCQl0aGlzLmNvbnRlbnRfZW5jb2RpbmcgPSBzdHJlYW0ucmVhZENTdHJpbmcoKTsKCQkJfSBlbHNlIGlmICh0aGlzLml0ZW1fdHlwZSA9PT0gInVyaSAiKSB7CgkJCQl0aGlzLml0ZW1fdXJpX3R5cGUgPSBzdHJlYW0ucmVhZENTdHJpbmcoKTsKCQkJfQoJCX0KCX0pOwoJLy8gZmlsZTpzcmMvcGFyc2luZy9pcG1hLmpzCglCb3hQYXJzZXIuY3JlYXRlRnVsbEJveEN0b3IoImlwbWEiLCBmdW5jdGlvbihzdHJlYW0pIHsKCQl2YXIgaSwgajsKCQllbnRyeV9jb3VudCA9IHN0cmVhbS5yZWFkVWludDMyKCk7CgkJdGhpcy5hc3NvY2lhdGlvbnMgPSBbXTsKCQlmb3IoaT0wOyBpPGVudHJ5X2NvdW50OyBpKyspIHsKCQkJdmFyIGl0ZW1fYXNzb2MgPSB7fTsKCQkJdGhpcy5hc3NvY2lhdGlvbnMucHVzaChpdGVtX2Fzc29jKTsKCQkJaWYgKHRoaXMudmVyc2lvbiA8IDEpIHsKCQkJCWl0ZW1fYXNzb2MuaWQgPSBzdHJlYW0ucmVhZFVpbnQxNigpOwoJCQl9IGVsc2UgewoJCQkJaXRlbV9hc3NvYy5pZCA9IHN0cmVhbS5yZWFkVWludDMyKCk7CgkJCX0KCQkJdmFyIGFzc29jaWF0aW9uX2NvdW50ID0gc3RyZWFtLnJlYWRVaW50OCgpOwoJCQlpdGVtX2Fzc29jLnByb3BzID0gW107CgkJCWZvciAoaiA9IDA7IGogPCBhc3NvY2lhdGlvbl9jb3VudDsgaisrKSB7CgkJCQl2YXIgdG1wID0gc3RyZWFtLnJlYWRVaW50OCgpOwoJCQkJdmFyIHAgPSB7fTsKCQkJCWl0ZW1fYXNzb2MucHJvcHMucHVzaChwKTsKCQkJCXAuZXNzZW50aWFsID0gKCh0bXAgJiAweDgwKSA+PiA3KSA9PT0gMTsKCQkJCWlmICh0aGlzLmZsYWdzICYgMHgxKSB7CgkJCQkJcC5wcm9wZXJ0eV9pbmRleCA9ICh0bXAgJiAweDdGKSA8PCA4IHwgc3RyZWFtLnJlYWRVaW50OCgpOwoJCQkJfSBlbHNlIHsKCQkJCQlwLnByb3BlcnR5X2luZGV4ID0gKHRtcCAmIDB4N0YpOwoJCQkJfQoJCQl9CgkJfQoJfSk7CgoJLy8gZmlsZTpzcmMvcGFyc2luZy9pcmVmLmpzCglCb3hQYXJzZXIuY3JlYXRlRnVsbEJveEN0b3IoImlyZWYiLCBmdW5jdGlvbihzdHJlYW0pIHsKCQl2YXIgcmV0OwoJCXZhciBib3g7CgkJdGhpcy5yZWZlcmVuY2VzID0gW107CgoJCXdoaWxlIChzdHJlYW0uZ2V0UG9zaXRpb24oKSA8IHRoaXMuc3RhcnQrdGhpcy5zaXplKSB7CgkJCXJldCA9IEJveFBhcnNlci5wYXJzZU9uZUJveChzdHJlYW0sIHRydWUsIHRoaXMuc2l6ZSAtIChzdHJlYW0uZ2V0UG9zaXRpb24oKSAtIHRoaXMuc3RhcnQpKTsKCQkJaWYgKHJldC5jb2RlID09PSBCb3hQYXJzZXIuT0spIHsKCQkJCWlmICh0aGlzLnZlcnNpb24gPT09IDApIHsKCQkJCQlib3ggPSBuZXcgQm94UGFyc2VyLlNpbmdsZUl0ZW1UeXBlUmVmZXJlbmNlQm94KHJldC50eXBlLCByZXQuc2l6ZSwgcmV0Lmhkcl9zaXplLCByZXQuc3RhcnQpOwoJCQkJfSBlbHNlIHsKCQkJCQlib3ggPSBuZXcgQm94UGFyc2VyLlNpbmdsZUl0ZW1UeXBlUmVmZXJlbmNlQm94TGFyZ2UocmV0LnR5cGUsIHJldC5zaXplLCByZXQuaGRyX3NpemUsIHJldC5zdGFydCk7CgkJCQl9CgkJCQlpZiAoYm94LndyaXRlID09PSBCb3hQYXJzZXIuQm94LnByb3RvdHlwZS53cml0ZSAmJiBib3gudHlwZSAhPT0gIm1kYXQiKSB7CgkJCQkJTG9nLndhcm4oIkJveFBhcnNlciIsIGJveC50eXBlKyIgYm94IHdyaXRpbmcgbm90IHlldCBpbXBsZW1lbnRlZCwga2VlcGluZyB1bnBhcnNlZCBkYXRhIGluIG1lbW9yeSBmb3IgbGF0ZXIgd3JpdGUiKTsKCQkJCQlib3gucGFyc2VEYXRhQW5kUmV3aW5kKHN0cmVhbSk7CgkJCQl9CgkJCQlib3gucGFyc2Uoc3RyZWFtKTsKCQkJCXRoaXMucmVmZXJlbmNlcy5wdXNoKGJveCk7CgkJCX0gZWxzZSB7CgkJCQlyZXR1cm47CgkJCX0KCQl9Cgl9KTsKCS8vIGZpbGU6c3JjL3BhcnNpbmcvaXJvdC5qcwoJQm94UGFyc2VyLmNyZWF0ZUJveEN0b3IoImlyb3QiLCBmdW5jdGlvbihzdHJlYW0pIHsKCQl0aGlzLmFuZ2xlID0gc3RyZWFtLnJlYWRVaW50OCgpICYgMHgzOwoJfSk7CgoJLy8gZmlsZTpzcmMvcGFyc2luZy9pc3BlLmpzCglCb3hQYXJzZXIuY3JlYXRlRnVsbEJveEN0b3IoImlzcGUiLCBmdW5jdGlvbihzdHJlYW0pIHsKCQl0aGlzLmltYWdlX3dpZHRoID0gc3RyZWFtLnJlYWRVaW50MzIoKTsKCQl0aGlzLmltYWdlX2hlaWdodCA9IHN0cmVhbS5yZWFkVWludDMyKCk7Cgl9KTsvLyBmaWxlOnNyYy9wYXJzaW5nL2tpbmQuanMKCUJveFBhcnNlci5jcmVhdGVGdWxsQm94Q3Rvcigia2luZCIsIGZ1bmN0aW9uKHN0cmVhbSkgewoJCXRoaXMuc2NoZW1lVVJJID0gc3RyZWFtLnJlYWRDU3RyaW5nKCk7CgkJdGhpcy52YWx1ZSA9IHN0cmVhbS5yZWFkQ1N0cmluZygpOwoJfSk7CgkvLyBmaWxlOnNyYy9wYXJzaW5nL2xldmEuanMKCUJveFBhcnNlci5jcmVhdGVGdWxsQm94Q3RvcigibGV2YSIsIGZ1bmN0aW9uKHN0cmVhbSkgewoJCXZhciBjb3VudCA9IHN0cmVhbS5yZWFkVWludDgoKTsKCQl0aGlzLmxldmVscyA9IFtdOwoJCWZvciAodmFyIGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewoJCQl2YXIgbGV2ZWwgPSB7fTsKCQkJdGhpcy5sZXZlbHNbaV0gPSBsZXZlbDsKCQkJbGV2ZWwudHJhY2tfSUQgPSBzdHJlYW0ucmVhZFVpbnQzMigpOwoJCQl2YXIgdG1wX2J5dGUgPSBzdHJlYW0ucmVhZFVpbnQ4KCk7CgkJCWxldmVsLnBhZGRpbmdfZmxhZyA9IHRtcF9ieXRlID4+IDc7CgkJCWxldmVsLmFzc2lnbm1lbnRfdHlwZSA9IHRtcF9ieXRlICYgMHg3RjsKCQkJc3dpdGNoIChsZXZlbC5hc3NpZ25tZW50X3R5cGUpIHsKCQkJCWNhc2UgMDoKCQkJCQlsZXZlbC5ncm91cGluZ190eXBlID0gc3RyZWFtLnJlYWRTdHJpbmcoNCk7CgkJCQkJYnJlYWs7CgkJCQljYXNlIDE6CgkJCQkJbGV2ZWwuZ3JvdXBpbmdfdHlwZSA9IHN0cmVhbS5yZWFkU3RyaW5nKDQpOwoJCQkJCWxldmVsLmdyb3VwaW5nX3R5cGVfcGFyYW1ldGVyID0gc3RyZWFtLnJlYWRVaW50MzIoKTsKCQkJCQlicmVhazsKCQkJCWNhc2UgMjoKCQkJCQlicmVhazsKCQkJCWNhc2UgMzoKCQkJCQlicmVhazsKCQkJCWNhc2UgNDoKCQkJCQlsZXZlbC5zdWJfdHJhY2tfaWQgPSBzdHJlYW0ucmVhZFVpbnQzMigpOwoJCQkJCWJyZWFrOwoJCQkJZGVmYXVsdDoKCQkJCQlMb2cud2FybigiQm94UGFyc2VyIiwgIlVua25vd24gbGV2YSBhc3NpZ25lbWVudCB0eXBlIik7CgkJCX0KCQl9Cgl9KTsKCgkvLyBmaWxlOnNyYy9wYXJzaW5nL2xzZWwuanMKCUJveFBhcnNlci5jcmVhdGVCb3hDdG9yKCJsc2VsIiwgZnVuY3Rpb24oc3RyZWFtKSB7CgkJdGhpcy5sYXllcl9pZCA9IHN0cmVhbS5yZWFkVWludDE2KCk7Cgl9KTsvLyBmaWxlOnNyYy9wYXJzaW5nL21heHIuanMKCUJveFBhcnNlci5jcmVhdGVCb3hDdG9yKCJtYXhyIiwgZnVuY3Rpb24oc3RyZWFtKSB7CgkJdGhpcy5wZXJpb2QgPSBzdHJlYW0ucmVhZFVpbnQzMigpOwoJCXRoaXMuYnl0ZXMgPSBzdHJlYW0ucmVhZFVpbnQzMigpOwoJfSk7CgoJLy8gZmlsZTpzcmMvcGFyc2luZy9tZGN2LmpzCglCb3hQYXJzZXIuY3JlYXRlQm94Q3RvcigibWRjdiIsIGZ1bmN0aW9uKHN0cmVhbSkgewoJICAgIHRoaXMuZGlzcGxheV9wcmltYXJpZXMgPSBbXTsKCSAgICB0aGlzLmRpc3BsYXlfcHJpbWFyaWVzWzBdID0ge307CgkgICAgdGhpcy5kaXNwbGF5X3ByaW1hcmllc1swXS54ID0gc3RyZWFtLnJlYWRVaW50MTYoKTsKCSAgICB0aGlzLmRpc3BsYXlfcHJpbWFyaWVzWzBdLnkgPSBzdHJlYW0ucmVhZFVpbnQxNigpOwoJICAgIHRoaXMuZGlzcGxheV9wcmltYXJpZXNbMV0gPSB7fTsKCSAgICB0aGlzLmRpc3BsYXlfcHJpbWFyaWVzWzFdLnggPSBzdHJlYW0ucmVhZFVpbnQxNigpOwoJICAgIHRoaXMuZGlzcGxheV9wcmltYXJpZXNbMV0ueSA9IHN0cmVhbS5yZWFkVWludDE2KCk7CgkgICAgdGhpcy5kaXNwbGF5X3ByaW1hcmllc1syXSA9IHt9OwoJICAgIHRoaXMuZGlzcGxheV9wcmltYXJpZXNbMl0ueCA9IHN0cmVhbS5yZWFkVWludDE2KCk7CgkgICAgdGhpcy5kaXNwbGF5X3ByaW1hcmllc1syXS55ID0gc3RyZWFtLnJlYWRVaW50MTYoKTsKCSAgICB0aGlzLndoaXRlX3BvaW50ID0ge307CgkgICAgdGhpcy53aGl0ZV9wb2ludC54ID0gc3RyZWFtLnJlYWRVaW50MTYoKTsKCSAgICB0aGlzLndoaXRlX3BvaW50LnkgPSBzdHJlYW0ucmVhZFVpbnQxNigpOwoJICAgIHRoaXMubWF4X2Rpc3BsYXlfbWFzdGVyaW5nX2x1bWluYW5jZSA9IHN0cmVhbS5yZWFkVWludDMyKCk7CgkgICAgdGhpcy5taW5fZGlzcGxheV9tYXN0ZXJpbmdfbHVtaW5hbmNlID0gc3RyZWFtLnJlYWRVaW50MzIoKTsKCX0pOwoKCS8vIGZpbGU6c3JjL3BhcnNpbmcvbWRoZC5qcwoJQm94UGFyc2VyLmNyZWF0ZUZ1bGxCb3hDdG9yKCJtZGhkIiwgZnVuY3Rpb24oc3RyZWFtKSB7CgkJaWYgKHRoaXMudmVyc2lvbiA9PSAxKSB7CgkJCXRoaXMuY3JlYXRpb25fdGltZSA9IHN0cmVhbS5yZWFkVWludDY0KCk7CgkJCXRoaXMubW9kaWZpY2F0aW9uX3RpbWUgPSBzdHJlYW0ucmVhZFVpbnQ2NCgpOwoJCQl0aGlzLnRpbWVzY2FsZSA9IHN0cmVhbS5yZWFkVWludDMyKCk7CgkJCXRoaXMuZHVyYXRpb24gPSBzdHJlYW0ucmVhZFVpbnQ2NCgpOwoJCX0gZWxzZSB7CgkJCXRoaXMuY3JlYXRpb25fdGltZSA9IHN0cmVhbS5yZWFkVWludDMyKCk7CgkJCXRoaXMubW9kaWZpY2F0aW9uX3RpbWUgPSBzdHJlYW0ucmVhZFVpbnQzMigpOwoJCQl0aGlzLnRpbWVzY2FsZSA9IHN0cmVhbS5yZWFkVWludDMyKCk7CgkJCXRoaXMuZHVyYXRpb24gPSBzdHJlYW0ucmVhZFVpbnQzMigpOwoJCX0KCQl0aGlzLnBhcnNlTGFuZ3VhZ2Uoc3RyZWFtKTsKCQlzdHJlYW0ucmVhZFVpbnQxNigpOwoJfSk7CgoJLy8gZmlsZTpzcmMvcGFyc2luZy9tZWhkLmpzCglCb3hQYXJzZXIuY3JlYXRlRnVsbEJveEN0b3IoIm1laGQiLCBmdW5jdGlvbihzdHJlYW0pIHsKCQlpZiAodGhpcy5mbGFncyAmIDB4MSkgewoJCQlMb2cud2FybigiQm94UGFyc2VyIiwgIm1laGQgYm94IGluY29ycmVjdGx5IHVzZXMgZmxhZ3Mgc2V0IHRvIDEsIGNvbnZlcnRpbmcgdmVyc2lvbiB0byAxIik7CgkJCXRoaXMudmVyc2lvbiA9IDE7CgkJfQoJCWlmICh0aGlzLnZlcnNpb24gPT0gMSkgewoJCQl0aGlzLmZyYWdtZW50X2R1cmF0aW9uID0gc3RyZWFtLnJlYWRVaW50NjQoKTsKCQl9IGVsc2UgewoJCQl0aGlzLmZyYWdtZW50X2R1cmF0aW9uID0gc3RyZWFtLnJlYWRVaW50MzIoKTsKCQl9Cgl9KTsKCgkvLyBmaWxlOnNyYy9wYXJzaW5nL21ldGEuanMKCUJveFBhcnNlci5jcmVhdGVGdWxsQm94Q3RvcigibWV0YSIsIGZ1bmN0aW9uKHN0cmVhbSkgewoJCXRoaXMuYm94ZXMgPSBbXTsKCQlCb3hQYXJzZXIuQ29udGFpbmVyQm94LnByb3RvdHlwZS5wYXJzZS5jYWxsKHRoaXMsIHN0cmVhbSk7Cgl9KTsKCS8vIGZpbGU6c3JjL3BhcnNpbmcvbWZoZC5qcwoJQm94UGFyc2VyLmNyZWF0ZUZ1bGxCb3hDdG9yKCJtZmhkIiwgZnVuY3Rpb24oc3RyZWFtKSB7CgkJdGhpcy5zZXF1ZW5jZV9udW1iZXIgPSBzdHJlYW0ucmVhZFVpbnQzMigpOwoJfSk7CgoJLy8gZmlsZTpzcmMvcGFyc2luZy9tZnJvLmpzCglCb3hQYXJzZXIuY3JlYXRlRnVsbEJveEN0b3IoIm1mcm8iLCBmdW5jdGlvbihzdHJlYW0pIHsKCQl0aGlzLl9zaXplID0gc3RyZWFtLnJlYWRVaW50MzIoKTsKCX0pOwoKCS8vIGZpbGU6c3JjL3BhcnNpbmcvbXZoZC5qcwoJQm94UGFyc2VyLmNyZWF0ZUZ1bGxCb3hDdG9yKCJtdmhkIiwgZnVuY3Rpb24oc3RyZWFtKSB7CgkJaWYgKHRoaXMudmVyc2lvbiA9PSAxKSB7CgkJCXRoaXMuY3JlYXRpb25fdGltZSA9IHN0cmVhbS5yZWFkVWludDY0KCk7CgkJCXRoaXMubW9kaWZpY2F0aW9uX3RpbWUgPSBzdHJlYW0ucmVhZFVpbnQ2NCgpOwoJCQl0aGlzLnRpbWVzY2FsZSA9IHN0cmVhbS5yZWFkVWludDMyKCk7CgkJCXRoaXMuZHVyYXRpb24gPSBzdHJlYW0ucmVhZFVpbnQ2NCgpOwoJCX0gZWxzZSB7CgkJCXRoaXMuY3JlYXRpb25fdGltZSA9IHN0cmVhbS5yZWFkVWludDMyKCk7CgkJCXRoaXMubW9kaWZpY2F0aW9uX3RpbWUgPSBzdHJlYW0ucmVhZFVpbnQzMigpOwoJCQl0aGlzLnRpbWVzY2FsZSA9IHN0cmVhbS5yZWFkVWludDMyKCk7CgkJCXRoaXMuZHVyYXRpb24gPSBzdHJlYW0ucmVhZFVpbnQzMigpOwoJCX0KCQl0aGlzLnJhdGUgPSBzdHJlYW0ucmVhZFVpbnQzMigpOwoJCXRoaXMudm9sdW1lID0gc3RyZWFtLnJlYWRVaW50MTYoKT4+ODsKCQlzdHJlYW0ucmVhZFVpbnQxNigpOwoJCXN0cmVhbS5yZWFkVWludDMyQXJyYXkoMik7CgkJdGhpcy5tYXRyaXggPSBzdHJlYW0ucmVhZFVpbnQzMkFycmF5KDkpOwoJCXN0cmVhbS5yZWFkVWludDMyQXJyYXkoNik7CgkJdGhpcy5uZXh0X3RyYWNrX2lkID0gc3RyZWFtLnJlYWRVaW50MzIoKTsKCX0pOwoJLy8gZmlsZTpzcmMvcGFyc2luZy9ucGNrLmpzCglCb3hQYXJzZXIuY3JlYXRlQm94Q3RvcigibnBjayIsIGZ1bmN0aW9uKHN0cmVhbSkgewoJCXRoaXMucGFja2V0c3NlbnQgPSBzdHJlYW0ucmVhZFVpbnQzMigpOwoJfSk7CgoJLy8gZmlsZTpzcmMvcGFyc2luZy9udW1wLmpzCglCb3hQYXJzZXIuY3JlYXRlQm94Q3RvcigibnVtcCIsIGZ1bmN0aW9uKHN0cmVhbSkgewoJCXRoaXMucGFja2V0c3NlbnQgPSBzdHJlYW0ucmVhZFVpbnQ2NCgpOwoJfSk7CgoJLy8gZmlsZTpzcmMvcGFyc2luZy9wYWRiLmpzCglCb3hQYXJzZXIuY3JlYXRlRnVsbEJveEN0b3IoInBhZGIiLCBmdW5jdGlvbihzdHJlYW0pIHsKCQl2YXIgc2FtcGxlX2NvdW50ID0gc3RyZWFtLnJlYWRVaW50MzIoKTsKCQl0aGlzLnBhZGJpdHMgPSBbXTsKCQlmb3IgKHZhciBpID0gMDsgaSA8IE1hdGguZmxvb3IoKHNhbXBsZV9jb3VudCsxKS8yKTsgaSsrKSB7CgkJCXRoaXMucGFkYml0cyA9IHN0cmVhbS5yZWFkVWludDgoKTsKCQl9Cgl9KTsKCgkvLyBmaWxlOnNyYy9wYXJzaW5nL3Bhc3AuanMKCUJveFBhcnNlci5jcmVhdGVCb3hDdG9yKCJwYXNwIiwgZnVuY3Rpb24oc3RyZWFtKSB7CgkJdGhpcy5oU3BhY2luZyA9IHN0cmVhbS5yZWFkVWludDMyKCk7CgkJdGhpcy52U3BhY2luZyA9IHN0cmVhbS5yZWFkVWludDMyKCk7Cgl9KTsvLyBmaWxlOnNyYy9wYXJzaW5nL3BheWwuanMKCUJveFBhcnNlci5jcmVhdGVCb3hDdG9yKCJwYXlsIiwgZnVuY3Rpb24oc3RyZWFtKSB7CgkJdGhpcy50ZXh0ID0gc3RyZWFtLnJlYWRTdHJpbmcodGhpcy5zaXplIC0gdGhpcy5oZHJfc2l6ZSk7Cgl9KTsKCgkvLyBmaWxlOnNyYy9wYXJzaW5nL3BheXQuanMKCUJveFBhcnNlci5jcmVhdGVCb3hDdG9yKCJwYXl0IiwgZnVuY3Rpb24oc3RyZWFtKSB7CgkJdGhpcy5wYXlsb2FkSUQgPSBzdHJlYW0ucmVhZFVpbnQzMigpOwoJCXZhciBjb3VudCA9IHN0cmVhbS5yZWFkVWludDgoKTsKCQl0aGlzLnJ0cG1hcF9zdHJpbmcgPSBzdHJlYW0ucmVhZFN0cmluZyhjb3VudCk7Cgl9KTsKCgkvLyBmaWxlOnNyYy9wYXJzaW5nL3BkaW4uanMKCUJveFBhcnNlci5jcmVhdGVGdWxsQm94Q3RvcigicGRpbiIsIGZ1bmN0aW9uKHN0cmVhbSkgewoJCXZhciBjb3VudCA9ICh0aGlzLnNpemUgLSB0aGlzLmhkcl9zaXplKS84OwoJCXRoaXMucmF0ZSA9IFtdOwoJCXRoaXMuaW5pdGlhbF9kZWxheSA9IFtdOwoJCWZvciAodmFyIGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewoJCQl0aGlzLnJhdGVbaV0gPSBzdHJlYW0ucmVhZFVpbnQzMigpOwoJCQl0aGlzLmluaXRpYWxfZGVsYXlbaV0gPSBzdHJlYW0ucmVhZFVpbnQzMigpOwoJCX0KCX0pOwoKCS8vIGZpbGU6c3JjL3BhcnNpbmcvcGl0bS5qcwoJQm94UGFyc2VyLmNyZWF0ZUZ1bGxCb3hDdG9yKCJwaXRtIiwgZnVuY3Rpb24oc3RyZWFtKSB7CgkJaWYgKHRoaXMudmVyc2lvbiA9PT0gMCkgewoJCQl0aGlzLml0ZW1faWQgPSBzdHJlYW0ucmVhZFVpbnQxNigpOwoJCX0gZWxzZSB7CgkJCXRoaXMuaXRlbV9pZCA9IHN0cmVhbS5yZWFkVWludDMyKCk7CgkJfQoJfSk7CgoJLy8gZmlsZTpzcmMvcGFyc2luZy9waXhpLmpzCglCb3hQYXJzZXIuY3JlYXRlRnVsbEJveEN0b3IoInBpeGkiLCBmdW5jdGlvbihzdHJlYW0pIHsKCQl2YXIgaTsKCQl0aGlzLm51bV9jaGFubmVscyA9IHN0cmVhbS5yZWFkVWludDgoKTsKCQl0aGlzLmJpdHNfcGVyX2NoYW5uZWxzID0gW107CgkJZm9yIChpID0gMDsgaSA8IHRoaXMubnVtX2NoYW5uZWxzOyBpKyspIHsKCQkJdGhpcy5iaXRzX3Blcl9jaGFubmVsc1tpXSA9IHN0cmVhbS5yZWFkVWludDgoKTsKCQl9Cgl9KTsKCgkvLyBmaWxlOnNyYy9wYXJzaW5nL3BtYXguanMKCUJveFBhcnNlci5jcmVhdGVCb3hDdG9yKCJwbWF4IiwgZnVuY3Rpb24oc3RyZWFtKSB7CgkJdGhpcy5ieXRlcyA9IHN0cmVhbS5yZWFkVWludDMyKCk7Cgl9KTsKCgkvLyBmaWxlOnNyYy9wYXJzaW5nL3ByZnQuanMKCUJveFBhcnNlci5jcmVhdGVGdWxsQm94Q3RvcigicHJmdCIsIGZ1bmN0aW9uKHN0cmVhbSkgewoJCXRoaXMucmVmX3RyYWNrX2lkID0gc3RyZWFtLnJlYWRVaW50MzIoKTsKCQl0aGlzLm50cF90aW1lc3RhbXAgPSBzdHJlYW0ucmVhZFVpbnQ2NCgpOwoJCWlmICh0aGlzLnZlcnNpb24gPT09IDApIHsKCQkJdGhpcy5tZWRpYV90aW1lID0gc3RyZWFtLnJlYWRVaW50MzIoKTsKCQl9IGVsc2UgewoJCQl0aGlzLm1lZGlhX3RpbWUgPSBzdHJlYW0ucmVhZFVpbnQ2NCgpOwoJCX0KCX0pOwoKCS8vIGZpbGU6c3JjL3BhcnNpbmcvcHNzaC5qcwoJQm94UGFyc2VyLmNyZWF0ZUZ1bGxCb3hDdG9yKCJwc3NoIiwgZnVuY3Rpb24oc3RyZWFtKSB7CgkJdGhpcy5zeXN0ZW1faWQgPSBCb3hQYXJzZXIucGFyc2VIZXgxNihzdHJlYW0pOwoJCWlmICh0aGlzLnZlcnNpb24gPiAwKSB7CgkJCXZhciBjb3VudCA9IHN0cmVhbS5yZWFkVWludDMyKCk7CgkJCXRoaXMua2lkID0gW107CgkJCWZvciAodmFyIGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewoJCQkJdGhpcy5raWRbaV0gPSBCb3hQYXJzZXIucGFyc2VIZXgxNihzdHJlYW0pOwoJCQl9CgkJfQoJCXZhciBkYXRhc2l6ZSA9IHN0cmVhbS5yZWFkVWludDMyKCk7CgkJaWYgKGRhdGFzaXplID4gMCkgewoJCQl0aGlzLmRhdGEgPSBzdHJlYW0ucmVhZFVpbnQ4QXJyYXkoZGF0YXNpemUpOwoJCX0KCX0pOwoKCS8vIGZpbGU6c3JjL3BhcnNpbmcvcXQvY2xlZi5qcwoJQm94UGFyc2VyLmNyZWF0ZUZ1bGxCb3hDdG9yKCJjbGVmIiwgZnVuY3Rpb24oc3RyZWFtKSB7CgkJdGhpcy53aWR0aCA9IHN0cmVhbS5yZWFkVWludDMyKCk7CgkJdGhpcy5oZWlnaHQgPSBzdHJlYW0ucmVhZFVpbnQzMigpOwoJfSk7Ly8gZmlsZTpzcmMvcGFyc2luZy9xdC9lbm9mLmpzCglCb3hQYXJzZXIuY3JlYXRlRnVsbEJveEN0b3IoImVub2YiLCBmdW5jdGlvbihzdHJlYW0pIHsKCQl0aGlzLndpZHRoID0gc3RyZWFtLnJlYWRVaW50MzIoKTsKCQl0aGlzLmhlaWdodCA9IHN0cmVhbS5yZWFkVWludDMyKCk7Cgl9KTsvLyBmaWxlOnNyYy9wYXJzaW5nL3F0L3Byb2YuanMKCUJveFBhcnNlci5jcmVhdGVGdWxsQm94Q3RvcigicHJvZiIsIGZ1bmN0aW9uKHN0cmVhbSkgewoJCXRoaXMud2lkdGggPSBzdHJlYW0ucmVhZFVpbnQzMigpOwoJCXRoaXMuaGVpZ2h0ID0gc3RyZWFtLnJlYWRVaW50MzIoKTsKCX0pOy8vIGZpbGU6c3JjL3BhcnNpbmcvcXQvdGFwdC5qcwoJQm94UGFyc2VyLmNyZWF0ZUNvbnRhaW5lckJveEN0b3IoInRhcHQiLCBudWxsLCBbICJjbGVmIiwgInByb2YiLCAiZW5vZiJdKTsvLyBmaWxlOnNyYy9wYXJzaW5nL3J0cC5qcwoJQm94UGFyc2VyLmNyZWF0ZUJveEN0b3IoInJ0cCAiLCBmdW5jdGlvbihzdHJlYW0pIHsKCQl0aGlzLmRlc2NyaXB0aW9uZm9ybWF0ID0gc3RyZWFtLnJlYWRTdHJpbmcoNCk7CgkJdGhpcy5zZHB0ZXh0ID0gc3RyZWFtLnJlYWRTdHJpbmcodGhpcy5zaXplIC0gdGhpcy5oZHJfc2l6ZSAtIDQpOwoJfSk7CgoJLy8gZmlsZTpzcmMvcGFyc2luZy9zYWlvLmpzCglCb3hQYXJzZXIuY3JlYXRlRnVsbEJveEN0b3IoInNhaW8iLCBmdW5jdGlvbihzdHJlYW0pIHsKCQlpZiAodGhpcy5mbGFncyAmIDB4MSkgewoJCQl0aGlzLmF1eF9pbmZvX3R5cGUgPSBzdHJlYW0ucmVhZFVpbnQzMigpOwoJCQl0aGlzLmF1eF9pbmZvX3R5cGVfcGFyYW1ldGVyID0gc3RyZWFtLnJlYWRVaW50MzIoKTsKCQl9CgkJdmFyIGNvdW50ID0gc3RyZWFtLnJlYWRVaW50MzIoKTsKCQl0aGlzLm9mZnNldCA9IFtdOwoJCWZvciAodmFyIGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewoJCQlpZiAodGhpcy52ZXJzaW9uID09PSAwKSB7CgkJCQl0aGlzLm9mZnNldFtpXSA9IHN0cmVhbS5yZWFkVWludDMyKCk7CgkJCX0gZWxzZSB7CgkJCQl0aGlzLm9mZnNldFtpXSA9IHN0cmVhbS5yZWFkVWludDY0KCk7CgkJCX0KCQl9Cgl9KTsKCS8vIGZpbGU6c3JjL3BhcnNpbmcvc2Fpei5qcwoJQm94UGFyc2VyLmNyZWF0ZUZ1bGxCb3hDdG9yKCJzYWl6IiwgZnVuY3Rpb24oc3RyZWFtKSB7CgkJaWYgKHRoaXMuZmxhZ3MgJiAweDEpIHsKCQkJdGhpcy5hdXhfaW5mb190eXBlID0gc3RyZWFtLnJlYWRVaW50MzIoKTsKCQkJdGhpcy5hdXhfaW5mb190eXBlX3BhcmFtZXRlciA9IHN0cmVhbS5yZWFkVWludDMyKCk7CgkJfQoJCXRoaXMuZGVmYXVsdF9zYW1wbGVfaW5mb19zaXplID0gc3RyZWFtLnJlYWRVaW50OCgpOwoJCXZhciBjb3VudCA9IHN0cmVhbS5yZWFkVWludDMyKCk7CgkJdGhpcy5zYW1wbGVfaW5mb19zaXplID0gW107CgkJaWYgKHRoaXMuZGVmYXVsdF9zYW1wbGVfaW5mb19zaXplID09PSAwKSB7CgkJCWZvciAodmFyIGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewoJCQkJdGhpcy5zYW1wbGVfaW5mb19zaXplW2ldID0gc3RyZWFtLnJlYWRVaW50OCgpOwoJCQl9CgkJfQoJfSk7CgoJLy8gZmlsZTpzcmMvcGFyc2luZy9zYW1wbGVlbnRyaWVzL21ldHQuanMKCUJveFBhcnNlci5jcmVhdGVTYW1wbGVFbnRyeUN0b3IoQm94UGFyc2VyLlNBTVBMRV9FTlRSWV9UWVBFX01FVEFEQVRBLCAibWV0dCIsIGZ1bmN0aW9uKHN0cmVhbSkgewoJCXRoaXMucGFyc2VIZWFkZXIoc3RyZWFtKTsKCQl0aGlzLmNvbnRlbnRfZW5jb2RpbmcgPSBzdHJlYW0ucmVhZENTdHJpbmcoKTsKCQl0aGlzLm1pbWVfZm9ybWF0ID0gc3RyZWFtLnJlYWRDU3RyaW5nKCk7CgkJdGhpcy5wYXJzZUZvb3RlcihzdHJlYW0pOwoJfSk7CgoJLy8gZmlsZTpzcmMvcGFyc2luZy9zYW1wbGVlbnRyaWVzL21ldHguanMKCUJveFBhcnNlci5jcmVhdGVTYW1wbGVFbnRyeUN0b3IoQm94UGFyc2VyLlNBTVBMRV9FTlRSWV9UWVBFX01FVEFEQVRBLCAibWV0eCIsIGZ1bmN0aW9uKHN0cmVhbSkgewoJCXRoaXMucGFyc2VIZWFkZXIoc3RyZWFtKTsKCQl0aGlzLmNvbnRlbnRfZW5jb2RpbmcgPSBzdHJlYW0ucmVhZENTdHJpbmcoKTsKCQl0aGlzLm5hbWVzcGFjZSA9IHN0cmVhbS5yZWFkQ1N0cmluZygpOwoJCXRoaXMuc2NoZW1hX2xvY2F0aW9uID0gc3RyZWFtLnJlYWRDU3RyaW5nKCk7CgkJdGhpcy5wYXJzZUZvb3RlcihzdHJlYW0pOwoJfSk7CgoJLy8gZmlsZTpzcmMvcGFyc2luZy9zYW1wbGVlbnRyaWVzL3NidHQuanMKCUJveFBhcnNlci5jcmVhdGVTYW1wbGVFbnRyeUN0b3IoQm94UGFyc2VyLlNBTVBMRV9FTlRSWV9UWVBFX1NVQlRJVExFLCAic2J0dCIsIGZ1bmN0aW9uKHN0cmVhbSkgewoJCXRoaXMucGFyc2VIZWFkZXIoc3RyZWFtKTsKCQl0aGlzLmNvbnRlbnRfZW5jb2RpbmcgPSBzdHJlYW0ucmVhZENTdHJpbmcoKTsKCQl0aGlzLm1pbWVfZm9ybWF0ID0gc3RyZWFtLnJlYWRDU3RyaW5nKCk7CgkJdGhpcy5wYXJzZUZvb3RlcihzdHJlYW0pOwoJfSk7CgoJLy8gZmlsZTpzcmMvcGFyc2luZy9zYW1wbGVlbnRyaWVzL3N0cHAuanMKCUJveFBhcnNlci5jcmVhdGVTYW1wbGVFbnRyeUN0b3IoQm94UGFyc2VyLlNBTVBMRV9FTlRSWV9UWVBFX1NVQlRJVExFLCAic3RwcCIsIGZ1bmN0aW9uKHN0cmVhbSkgewoJCXRoaXMucGFyc2VIZWFkZXIoc3RyZWFtKTsKCQl0aGlzLm5hbWVzcGFjZSA9IHN0cmVhbS5yZWFkQ1N0cmluZygpOwoJCXRoaXMuc2NoZW1hX2xvY2F0aW9uID0gc3RyZWFtLnJlYWRDU3RyaW5nKCk7CgkJdGhpcy5hdXhpbGlhcnlfbWltZV90eXBlcyA9IHN0cmVhbS5yZWFkQ1N0cmluZygpOwoJCXRoaXMucGFyc2VGb290ZXIoc3RyZWFtKTsKCX0pOwoKCS8vIGZpbGU6c3JjL3BhcnNpbmcvc2FtcGxlZW50cmllcy9zdHh0LmpzCglCb3hQYXJzZXIuY3JlYXRlU2FtcGxlRW50cnlDdG9yKEJveFBhcnNlci5TQU1QTEVfRU5UUllfVFlQRV9TVUJUSVRMRSwgInN0eHQiLCBmdW5jdGlvbihzdHJlYW0pIHsKCQl0aGlzLnBhcnNlSGVhZGVyKHN0cmVhbSk7CgkJdGhpcy5jb250ZW50X2VuY29kaW5nID0gc3RyZWFtLnJlYWRDU3RyaW5nKCk7CgkJdGhpcy5taW1lX2Zvcm1hdCA9IHN0cmVhbS5yZWFkQ1N0cmluZygpOwoJCXRoaXMucGFyc2VGb290ZXIoc3RyZWFtKTsKCX0pOwoKCS8vIGZpbGU6c3JjL3BhcnNpbmcvc2FtcGxlZW50cmllcy90eDNnLmpzCglCb3hQYXJzZXIuY3JlYXRlU2FtcGxlRW50cnlDdG9yKEJveFBhcnNlci5TQU1QTEVfRU5UUllfVFlQRV9TVUJUSVRMRSwgInR4M2ciLCBmdW5jdGlvbihzdHJlYW0pIHsKCQl0aGlzLnBhcnNlSGVhZGVyKHN0cmVhbSk7CgkJdGhpcy5kaXNwbGF5RmxhZ3MgPSBzdHJlYW0ucmVhZFVpbnQzMigpOwoJCXRoaXMuaG9yaXpvbnRhbF9qdXN0aWZpY2F0aW9uID0gc3RyZWFtLnJlYWRJbnQ4KCk7CgkJdGhpcy52ZXJ0aWNhbF9qdXN0aWZpY2F0aW9uID0gc3RyZWFtLnJlYWRJbnQ4KCk7CgkJdGhpcy5iZ19jb2xvcl9yZ2JhID0gc3RyZWFtLnJlYWRVaW50OEFycmF5KDQpOwoJCXRoaXMuYm94X3JlY29yZCA9IHN0cmVhbS5yZWFkSW50MTZBcnJheSg0KTsKCQl0aGlzLnN0eWxlX3JlY29yZCA9IHN0cmVhbS5yZWFkVWludDhBcnJheSgxMik7CgkJdGhpcy5wYXJzZUZvb3RlcihzdHJlYW0pOwoJfSk7CgkvLyBmaWxlOnNyYy9wYXJzaW5nL3NhbXBsZWVudHJpZXMvd3Z0dC5qcwoJQm94UGFyc2VyLmNyZWF0ZVNhbXBsZUVudHJ5Q3RvcihCb3hQYXJzZXIuU0FNUExFX0VOVFJZX1RZUEVfTUVUQURBVEEsICJ3dnR0IiwgZnVuY3Rpb24oc3RyZWFtKSB7CgkJdGhpcy5wYXJzZUhlYWRlcihzdHJlYW0pOwoJCXRoaXMucGFyc2VGb290ZXIoc3RyZWFtKTsKCX0pOwoKCS8vIGZpbGU6c3JjL3BhcnNpbmcvc2FtcGxlZ3JvdXBzL2Fsc3QuanMKCUJveFBhcnNlci5jcmVhdGVTYW1wbGVHcm91cEN0b3IoImFsc3QiLCBmdW5jdGlvbihzdHJlYW0pIHsKCQl2YXIgaTsKCQl2YXIgcm9sbF9jb3VudCA9IHN0cmVhbS5yZWFkVWludDE2KCk7CgkJdGhpcy5maXJzdF9vdXRwdXRfc2FtcGxlID0gc3RyZWFtLnJlYWRVaW50MTYoKTsKCQl0aGlzLnNhbXBsZV9vZmZzZXQgPSBbXTsKCQlmb3IgKGkgPSAwOyBpIDwgcm9sbF9jb3VudDsgaSsrKSB7CgkJCXRoaXMuc2FtcGxlX29mZnNldFtpXSA9IHN0cmVhbS5yZWFkVWludDMyKCk7CgkJfQoJCXZhciByZW1haW5pbmcgPSB0aGlzLmRlc2NyaXB0aW9uX2xlbmd0aCAtIDQgLSA0KnJvbGxfY291bnQ7CgkJdGhpcy5udW1fb3V0cHV0X3NhbXBsZXMgPSBbXTsKCQl0aGlzLm51bV90b3RhbF9zYW1wbGVzID0gW107CgkJZm9yIChpID0gMDsgaSA8IHJlbWFpbmluZy80OyBpKyspIHsKCQkJdGhpcy5udW1fb3V0cHV0X3NhbXBsZXNbaV0gPSBzdHJlYW0ucmVhZFVpbnQxNigpOwoJCQl0aGlzLm51bV90b3RhbF9zYW1wbGVzW2ldID0gc3RyZWFtLnJlYWRVaW50MTYoKTsKCQl9Cgl9KTsKCgkvLyBmaWxlOnNyYy9wYXJzaW5nL3NhbXBsZWdyb3Vwcy9hdmxsLmpzCglCb3hQYXJzZXIuY3JlYXRlU2FtcGxlR3JvdXBDdG9yKCJhdmxsIiwgZnVuY3Rpb24oc3RyZWFtKSB7CgkJdGhpcy5sYXllck51bWJlciA9IHN0cmVhbS5yZWFkVWludDgoKTsKCQl0aGlzLmFjY3VyYXRlU3RhdGlzdGljc0ZsYWcgPSBzdHJlYW0ucmVhZFVpbnQ4KCk7CgkJdGhpcy5hdmdCaXRSYXRlID0gc3RyZWFtLnJlYWRVaW50MTYoKTsKCQl0aGlzLmF2Z0ZyYW1lUmF0ZSA9IHN0cmVhbS5yZWFkVWludDE2KCk7Cgl9KTsKCgkvLyBmaWxlOnNyYy9wYXJzaW5nL3NhbXBsZWdyb3Vwcy9hdnNzLmpzCglCb3hQYXJzZXIuY3JlYXRlU2FtcGxlR3JvdXBDdG9yKCJhdnNzIiwgZnVuY3Rpb24oc3RyZWFtKSB7CgkJdGhpcy5zdWJTZXF1ZW5jZUlkZW50aWZpZXIgPSBzdHJlYW0ucmVhZFVpbnQxNigpOwoJCXRoaXMubGF5ZXJOdW1iZXIgPSBzdHJlYW0ucmVhZFVpbnQ4KCk7CgkJdmFyIHRtcF9ieXRlID0gc3RyZWFtLnJlYWRVaW50OCgpOwoJCXRoaXMuZHVyYXRpb25GbGFnID0gdG1wX2J5dGUgPj4gNzsKCQl0aGlzLmF2Z1JhdGVGbGFnID0gKHRtcF9ieXRlID4+IDYpICYgMHgxOwoJCWlmICh0aGlzLmR1cmF0aW9uRmxhZykgewoJCQl0aGlzLmR1cmF0aW9uID0gc3RyZWFtLnJlYWRVaW50MzIoKTsKCQl9CgkJaWYgKHRoaXMuYXZnUmF0ZUZsYWcpIHsKCQkJdGhpcy5hY2N1cmF0ZVN0YXRpc3RpY3NGbGFnID0gc3RyZWFtLnJlYWRVaW50OCgpOwoJCQl0aGlzLmF2Z0JpdFJhdGUgPSBzdHJlYW0ucmVhZFVpbnQxNigpOwoJCQl0aGlzLmF2Z0ZyYW1lUmF0ZSA9IHN0cmVhbS5yZWFkVWludDE2KCk7CgkJfQoJCXRoaXMuZGVwZW5kZW5jeSA9IFtdOwoJCXZhciBudW1SZWZlcmVuY2VzID0gc3RyZWFtLnJlYWRVaW50OCgpOwoJCWZvciAodmFyIGkgPSAwOyBpIDwgbnVtUmVmZXJlbmNlczsgaSsrKSB7CgkJCXZhciBkZXBlbmRlbmN5SW5mbyA9IHt9OwoJCQl0aGlzLmRlcGVuZGVuY3kucHVzaChkZXBlbmRlbmN5SW5mbyk7CgkJCWRlcGVuZGVuY3lJbmZvLnN1YlNlcURpcmVjdGlvbkZsYWcgPSBzdHJlYW0ucmVhZFVpbnQ4KCk7CgkJCWRlcGVuZGVuY3lJbmZvLmxheWVyTnVtYmVyID0gc3RyZWFtLnJlYWRVaW50OCgpOwoJCQlkZXBlbmRlbmN5SW5mby5zdWJTZXF1ZW5jZUlkZW50aWZpZXIgPSBzdHJlYW0ucmVhZFVpbnQxNigpOwoJCX0KCX0pOwoKCS8vIGZpbGU6c3JjL3BhcnNpbmcvc2FtcGxlZ3JvdXBzL2R0cnQuanMKCUJveFBhcnNlci5jcmVhdGVTYW1wbGVHcm91cEN0b3IoImR0cnQiLCBmdW5jdGlvbihzdHJlYW0pIHsKCQlMb2cud2FybigiQm94UGFyc2VyIiwgIlNhbXBsZSBHcm91cCB0eXBlOiAiK3RoaXMuZ3JvdXBpbmdfdHlwZSsiIG5vdCBmdWxseSBwYXJzZWQiKTsKCX0pOwoKCS8vIGZpbGU6c3JjL3BhcnNpbmcvc2FtcGxlZ3JvdXBzL212aWYuanMKCUJveFBhcnNlci5jcmVhdGVTYW1wbGVHcm91cEN0b3IoIm12aWYiLCBmdW5jdGlvbihzdHJlYW0pIHsKCQlMb2cud2FybigiQm94UGFyc2VyIiwgIlNhbXBsZSBHcm91cCB0eXBlOiAiK3RoaXMuZ3JvdXBpbmdfdHlwZSsiIG5vdCBmdWxseSBwYXJzZWQiKTsKCX0pOwoKCS8vIGZpbGU6c3JjL3BhcnNpbmcvc2FtcGxlZ3JvdXBzL3Byb2wuanMKCUJveFBhcnNlci5jcmVhdGVTYW1wbGVHcm91cEN0b3IoInByb2wiLCBmdW5jdGlvbihzdHJlYW0pIHsKCQl0aGlzLnJvbGxfZGlzdGFuY2UgPSBzdHJlYW0ucmVhZEludDE2KCk7Cgl9KTsKCgkvLyBmaWxlOnNyYy9wYXJzaW5nL3NhbXBsZWdyb3Vwcy9yYXAuanMKCUJveFBhcnNlci5jcmVhdGVTYW1wbGVHcm91cEN0b3IoInJhcCAiLCBmdW5jdGlvbihzdHJlYW0pIHsKCQl2YXIgdG1wX2J5dGUgPSBzdHJlYW0ucmVhZFVpbnQ4KCk7CgkJdGhpcy5udW1fbGVhZGluZ19zYW1wbGVzX2tub3duID0gdG1wX2J5dGUgPj4gNzsKCQl0aGlzLm51bV9sZWFkaW5nX3NhbXBsZXMgPSB0bXBfYnl0ZSAmIDB4N0Y7Cgl9KTsKCgkvLyBmaWxlOnNyYy9wYXJzaW5nL3NhbXBsZWdyb3Vwcy9yYXNoLmpzCglCb3hQYXJzZXIuY3JlYXRlU2FtcGxlR3JvdXBDdG9yKCJyYXNoIiwgZnVuY3Rpb24oc3RyZWFtKSB7CgkJdGhpcy5vcGVyYXRpb25fcG9pbnRfY291bnQgPSBzdHJlYW0ucmVhZFVpbnQxNigpOwoJCWlmICh0aGlzLmRlc2NyaXB0aW9uX2xlbmd0aCAhPT0gMisodGhpcy5vcGVyYXRpb25fcG9pbnRfY291bnQgPT09IDE/Mjp0aGlzLm9wZXJhdGlvbl9wb2ludF9jb3VudCo2KSs5KSB7CgkJCUxvZy53YXJuKCJCb3hQYXJzZXIiLCAiTWlzbWF0Y2ggaW4gIit0aGlzLmdyb3VwaW5nX3R5cGUrIiBzYW1wbGUgZ3JvdXAgbGVuZ3RoIik7CgkJCXRoaXMuZGF0YSA9ICBzdHJlYW0ucmVhZFVpbnQ4QXJyYXkodGhpcy5kZXNjcmlwdGlvbl9sZW5ndGgtMik7CgkJfSBlbHNlIHsKCQkJaWYgKHRoaXMub3BlcmF0aW9uX3BvaW50X2NvdW50ID09PSAxKSB7CgkJCQl0aGlzLnRhcmdldF9yYXRlX3NoYXJlID0gc3RyZWFtLnJlYWRVaW50MTYoKTsKCQkJfSBlbHNlIHsKCQkJCXRoaXMudGFyZ2V0X3JhdGVfc2hhcmUgPSBbXTsKCQkJCXRoaXMuYXZhaWxhYmxlX2JpdHJhdGUgPSBbXTsKCQkJCWZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5vcGVyYXRpb25fcG9pbnRfY291bnQ7IGkrKykgewoJCQkJCXRoaXMuYXZhaWxhYmxlX2JpdHJhdGVbaV0gPSBzdHJlYW0ucmVhZFVpbnQzMigpOwoJCQkJCXRoaXMudGFyZ2V0X3JhdGVfc2hhcmVbaV0gPSBzdHJlYW0ucmVhZFVpbnQxNigpOwoJCQkJfQoJCQl9CgkJCXRoaXMubWF4aW11bV9iaXRyYXRlID0gc3RyZWFtLnJlYWRVaW50MzIoKTsKCQkJdGhpcy5taW5pbXVtX2JpdHJhdGUgPSBzdHJlYW0ucmVhZFVpbnQzMigpOwoJCQl0aGlzLmRpc2NhcmRfcHJpb3JpdHkgPSBzdHJlYW0ucmVhZFVpbnQ4KCk7CgkJfQoJfSk7CgoJLy8gZmlsZTpzcmMvcGFyc2luZy9zYW1wbGVncm91cHMvcm9sbC5qcwoJQm94UGFyc2VyLmNyZWF0ZVNhbXBsZUdyb3VwQ3Rvcigicm9sbCIsIGZ1bmN0aW9uKHN0cmVhbSkgewoJCXRoaXMucm9sbF9kaXN0YW5jZSA9IHN0cmVhbS5yZWFkSW50MTYoKTsKCX0pOwoKCS8vIGZpbGU6c3JjL3BhcnNpbmcvc2FtcGxlZ3JvdXBzL3NhbXBsZWdyb3VwLmpzCglCb3hQYXJzZXIuU2FtcGxlR3JvdXBFbnRyeS5wcm90b3R5cGUucGFyc2UgPSBmdW5jdGlvbihzdHJlYW0pIHsKCQlMb2cud2FybigiQm94UGFyc2VyIiwgIlVua25vd24gU2FtcGxlIEdyb3VwIHR5cGU6ICIrdGhpcy5ncm91cGluZ190eXBlKTsKCQl0aGlzLmRhdGEgPSAgc3RyZWFtLnJlYWRVaW50OEFycmF5KHRoaXMuZGVzY3JpcHRpb25fbGVuZ3RoKTsKCX07CgoJLy8gZmlsZTpzcmMvcGFyc2luZy9zYW1wbGVncm91cHMvc2NpZi5qcwoJQm94UGFyc2VyLmNyZWF0ZVNhbXBsZUdyb3VwQ3Rvcigic2NpZiIsIGZ1bmN0aW9uKHN0cmVhbSkgewoJCUxvZy53YXJuKCJCb3hQYXJzZXIiLCAiU2FtcGxlIEdyb3VwIHR5cGU6ICIrdGhpcy5ncm91cGluZ190eXBlKyIgbm90IGZ1bGx5IHBhcnNlZCIpOwoJfSk7CgoJLy8gZmlsZTpzcmMvcGFyc2luZy9zYW1wbGVncm91cHMvc2NubS5qcwoJQm94UGFyc2VyLmNyZWF0ZVNhbXBsZUdyb3VwQ3Rvcigic2NubSIsIGZ1bmN0aW9uKHN0cmVhbSkgewoJCUxvZy53YXJuKCJCb3hQYXJzZXIiLCAiU2FtcGxlIEdyb3VwIHR5cGU6ICIrdGhpcy5ncm91cGluZ190eXBlKyIgbm90IGZ1bGx5IHBhcnNlZCIpOwoJfSk7CgoJLy8gZmlsZTpzcmMvcGFyc2luZy9zYW1wbGVncm91cHMvc2VpZy5qcwoJQm94UGFyc2VyLmNyZWF0ZVNhbXBsZUdyb3VwQ3Rvcigic2VpZyIsIGZ1bmN0aW9uKHN0cmVhbSkgewoJCXRoaXMucmVzZXJ2ZWQgPSBzdHJlYW0ucmVhZFVpbnQ4KCk7CgkJdmFyIHRtcCA9IHN0cmVhbS5yZWFkVWludDgoKTsKCQl0aGlzLmNyeXB0X2J5dGVfYmxvY2sgPSB0bXAgPj4gNDsKCQl0aGlzLnNraXBfYnl0ZV9ibG9jayA9IHRtcCAmIDB4RjsKCQl0aGlzLmlzUHJvdGVjdGVkID0gc3RyZWFtLnJlYWRVaW50OCgpOwoJCXRoaXMuUGVyX1NhbXBsZV9JVl9TaXplID0gc3RyZWFtLnJlYWRVaW50OCgpOwoJCXRoaXMuS0lEID0gQm94UGFyc2VyLnBhcnNlSGV4MTYoc3RyZWFtKTsKCQl0aGlzLmNvbnN0YW50X0lWX3NpemUgPSAwOwoJCXRoaXMuY29uc3RhbnRfSVYgPSAwOwoJCWlmICh0aGlzLmlzUHJvdGVjdGVkID09PSAxICYmIHRoaXMuUGVyX1NhbXBsZV9JVl9TaXplID09PSAwKSB7CgkJCXRoaXMuY29uc3RhbnRfSVZfc2l6ZSA9IHN0cmVhbS5yZWFkVWludDgoKTsKCQkJdGhpcy5jb25zdGFudF9JViA9IHN0cmVhbS5yZWFkVWludDhBcnJheSh0aGlzLmNvbnN0YW50X0lWX3NpemUpOwoJCX0KCX0pOwoKCS8vIGZpbGU6c3JjL3BhcnNpbmcvc2FtcGxlZ3JvdXBzL3N0c2EuanMKCUJveFBhcnNlci5jcmVhdGVTYW1wbGVHcm91cEN0b3IoInN0c2EiLCBmdW5jdGlvbihzdHJlYW0pIHsKCQlMb2cud2FybigiQm94UGFyc2VyIiwgIlNhbXBsZSBHcm91cCB0eXBlOiAiK3RoaXMuZ3JvdXBpbmdfdHlwZSsiIG5vdCBmdWxseSBwYXJzZWQiKTsKCX0pOwoKCS8vIGZpbGU6c3JjL3BhcnNpbmcvc2FtcGxlZ3JvdXBzL3N5bmMuanMKCUJveFBhcnNlci5jcmVhdGVTYW1wbGVHcm91cEN0b3IoInN5bmMiLCBmdW5jdGlvbihzdHJlYW0pIHsKCQl2YXIgdG1wX2J5dGUgPSBzdHJlYW0ucmVhZFVpbnQ4KCk7CgkJdGhpcy5OQUxfdW5pdF90eXBlID0gdG1wX2J5dGUgJiAweDNGOwoJfSk7CgoJLy8gZmlsZTpzcmMvcGFyc2luZy9zYW1wbGVncm91cHMvdGVsZS5qcwoJQm94UGFyc2VyLmNyZWF0ZVNhbXBsZUdyb3VwQ3RvcigidGVsZSIsIGZ1bmN0aW9uKHN0cmVhbSkgewoJCXZhciB0bXBfYnl0ZSA9IHN0cmVhbS5yZWFkVWludDgoKTsKCQl0aGlzLmxldmVsX2luZGVwZW5kZW50bHlfZGVjb2RhYmxlID0gdG1wX2J5dGUgPj4gNzsKCX0pOwoKCS8vIGZpbGU6c3JjL3BhcnNpbmcvc2FtcGxlZ3JvdXBzL3RzYXMuanMKCUJveFBhcnNlci5jcmVhdGVTYW1wbGVHcm91cEN0b3IoInRzYXMiLCBmdW5jdGlvbihzdHJlYW0pIHsKCQlMb2cud2FybigiQm94UGFyc2VyIiwgIlNhbXBsZSBHcm91cCB0eXBlOiAiK3RoaXMuZ3JvdXBpbmdfdHlwZSsiIG5vdCBmdWxseSBwYXJzZWQiKTsKCX0pOwoKCS8vIGZpbGU6c3JjL3BhcnNpbmcvc2FtcGxlZ3JvdXBzL3RzY2wuanMKCUJveFBhcnNlci5jcmVhdGVTYW1wbGVHcm91cEN0b3IoInRzY2wiLCBmdW5jdGlvbihzdHJlYW0pIHsKCQlMb2cud2FybigiQm94UGFyc2VyIiwgIlNhbXBsZSBHcm91cCB0eXBlOiAiK3RoaXMuZ3JvdXBpbmdfdHlwZSsiIG5vdCBmdWxseSBwYXJzZWQiKTsKCX0pOwoKCS8vIGZpbGU6c3JjL3BhcnNpbmcvc2FtcGxlZ3JvdXBzL3ZpcHIuanMKCUJveFBhcnNlci5jcmVhdGVTYW1wbGVHcm91cEN0b3IoInZpcHIiLCBmdW5jdGlvbihzdHJlYW0pIHsKCQlMb2cud2FybigiQm94UGFyc2VyIiwgIlNhbXBsZSBHcm91cCB0eXBlOiAiK3RoaXMuZ3JvdXBpbmdfdHlwZSsiIG5vdCBmdWxseSBwYXJzZWQiKTsKCX0pOwoKCS8vIGZpbGU6c3JjL3BhcnNpbmcvc2JncC5qcwoJQm94UGFyc2VyLmNyZWF0ZUZ1bGxCb3hDdG9yKCJzYmdwIiwgZnVuY3Rpb24oc3RyZWFtKSB7CgkJdGhpcy5ncm91cGluZ190eXBlID0gc3RyZWFtLnJlYWRTdHJpbmcoNCk7CgkJaWYgKHRoaXMudmVyc2lvbiA9PT0gMSkgewoJCQl0aGlzLmdyb3VwaW5nX3R5cGVfcGFyYW1ldGVyID0gc3RyZWFtLnJlYWRVaW50MzIoKTsKCQl9IGVsc2UgewoJCQl0aGlzLmdyb3VwaW5nX3R5cGVfcGFyYW1ldGVyID0gMDsKCQl9CgkJdGhpcy5lbnRyaWVzID0gW107CgkJdmFyIGVudHJ5X2NvdW50ID0gc3RyZWFtLnJlYWRVaW50MzIoKTsKCQlmb3IgKHZhciBpID0gMDsgaSA8IGVudHJ5X2NvdW50OyBpKyspIHsKCQkJdmFyIGVudHJ5ID0ge307CgkJCXRoaXMuZW50cmllcy5wdXNoKGVudHJ5KTsKCQkJZW50cnkuc2FtcGxlX2NvdW50ID0gc3RyZWFtLnJlYWRJbnQzMigpOwoJCQllbnRyeS5ncm91cF9kZXNjcmlwdGlvbl9pbmRleCA9IHN0cmVhbS5yZWFkSW50MzIoKTsKCQl9Cgl9KTsKCgkvLyBmaWxlOnNyYy9wYXJzaW5nL3NjaG0uanMKCUJveFBhcnNlci5jcmVhdGVGdWxsQm94Q3Rvcigic2NobSIsIGZ1bmN0aW9uKHN0cmVhbSkgewoJCXRoaXMuc2NoZW1lX3R5cGUgPSBzdHJlYW0ucmVhZFN0cmluZyg0KTsKCQl0aGlzLnNjaGVtZV92ZXJzaW9uID0gc3RyZWFtLnJlYWRVaW50MzIoKTsKCQlpZiAodGhpcy5mbGFncyAmIDB4MDAwMDAxKSB7CgkJCXRoaXMuc2NoZW1lX3VyaSA9IHN0cmVhbS5yZWFkU3RyaW5nKHRoaXMuc2l6ZSAtIHRoaXMuaGRyX3NpemUgLSA4KTsKCQl9Cgl9KTsKCgkvLyBmaWxlOnNyYy9wYXJzaW5nL3NkcC5qcwoJQm94UGFyc2VyLmNyZWF0ZUJveEN0b3IoInNkcCAiLCBmdW5jdGlvbihzdHJlYW0pIHsKCQl0aGlzLnNkcHRleHQgPSBzdHJlYW0ucmVhZFN0cmluZyh0aGlzLnNpemUgLSB0aGlzLmhkcl9zaXplKTsKCX0pOwoKCS8vIGZpbGU6c3JjL3BhcnNpbmcvc2R0cC5qcwoJQm94UGFyc2VyLmNyZWF0ZUZ1bGxCb3hDdG9yKCJzZHRwIiwgZnVuY3Rpb24oc3RyZWFtKSB7CgkJdmFyIHRtcF9ieXRlOwoJCXZhciBjb3VudCA9ICh0aGlzLnNpemUgLSB0aGlzLmhkcl9zaXplKTsKCQl0aGlzLmlzX2xlYWRpbmcgPSBbXTsKCQl0aGlzLnNhbXBsZV9kZXBlbmRzX29uID0gW107CgkJdGhpcy5zYW1wbGVfaXNfZGVwZW5kZWRfb24gPSBbXTsKCQl0aGlzLnNhbXBsZV9oYXNfcmVkdW5kYW5jeSA9IFtdOwoJCWZvciAodmFyIGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewoJCQl0bXBfYnl0ZSA9IHN0cmVhbS5yZWFkVWludDgoKTsKCQkJdGhpcy5pc19sZWFkaW5nW2ldID0gdG1wX2J5dGUgPj4gNjsKCQkJdGhpcy5zYW1wbGVfZGVwZW5kc19vbltpXSA9ICh0bXBfYnl0ZSA+PiA0KSAmIDB4MzsKCQkJdGhpcy5zYW1wbGVfaXNfZGVwZW5kZWRfb25baV0gPSAodG1wX2J5dGUgPj4gMikgJiAweDM7CgkJCXRoaXMuc2FtcGxlX2hhc19yZWR1bmRhbmN5W2ldID0gdG1wX2J5dGUgJiAweDM7CgkJfQoJfSk7CgoJLy8gZmlsZTpzcmMvcGFyc2luZy9zZW5jLmpzCgkvLyBDYW5ub3QgYmUgZnVsbHkgcGFyc2VkIGJlY2F1c2UgUGVyX1NhbXBsZV9JVl9TaXplIG5lZWRzIHRvIGJlIGtub3duDQoJQm94UGFyc2VyLmNyZWF0ZUZ1bGxCb3hDdG9yKCJzZW5jIiAvKiwgZnVuY3Rpb24oc3RyZWFtKSB7DQoJCXRoaXMucGFyc2VGdWxsSGVhZGVyKHN0cmVhbSk7DQoJCXZhciBzYW1wbGVfY291bnQgPSBzdHJlYW0ucmVhZFVpbnQzMigpOw0KCQl0aGlzLnNhbXBsZXMgPSBbXTsNCgkJZm9yICh2YXIgaSA9IDA7IGkgPCBzYW1wbGVfY291bnQ7IGkrKykgew0KCQkJdmFyIHNhbXBsZSA9IHt9Ow0KCQkJLy8gdGVuYy5kZWZhdWx0X1Blcl9TYW1wbGVfSVZfU2l6ZSBvciBzZWlnLlBlcl9TYW1wbGVfSVZfU2l6ZQ0KCQkJc2FtcGxlLkluaXRpYWxpemF0aW9uVmVjdG9yID0gdGhpcy5yZWFkVWludDhBcnJheShQZXJfU2FtcGxlX0lWX1NpemUqOCk7DQoJCQlpZiAodGhpcy5mbGFncyAmIDB4Mikgew0KCQkJCXNhbXBsZS5zdWJzYW1wbGVzID0gW107DQoJCQkJc3Vic2FtcGxlX2NvdW50ID0gc3RyZWFtLnJlYWRVaW50MTYoKTsNCgkJCQlmb3IgKHZhciBqID0gMDsgaiA8IHN1YnNhbXBsZV9jb3VudDsgaisrKSB7DQoJCQkJCXZhciBzdWJzYW1wbGUgPSB7fTsNCgkJCQkJc3Vic2FtcGxlLkJ5dGVzT2ZDbGVhckRhdGEgPSBzdHJlYW0ucmVhZFVpbnQxNigpOw0KCQkJCQlzdWJzYW1wbGUuQnl0ZXNPZlByb3RlY3RlZERhdGEgPSBzdHJlYW0ucmVhZFVpbnQzMigpOw0KCQkJCQlzYW1wbGUuc3Vic2FtcGxlcy5wdXNoKHN1YnNhbXBsZSk7DQoJCQkJfQ0KCQkJfQ0KCQkJLy8gVE9ETw0KCQkJdGhpcy5zYW1wbGVzLnB1c2goc2FtcGxlKTsNCgkJfQ0KCX0qLyk7DQoJLy8gZmlsZTpzcmMvcGFyc2luZy9zZ3BkLmpzCglCb3hQYXJzZXIuY3JlYXRlRnVsbEJveEN0b3IoInNncGQiLCBmdW5jdGlvbihzdHJlYW0pIHsKCQl0aGlzLmdyb3VwaW5nX3R5cGUgPSBzdHJlYW0ucmVhZFN0cmluZyg0KTsKCQlMb2cuZGVidWcoIkJveFBhcnNlciIsICJGb3VuZCBTYW1wbGUgR3JvdXBzIG9mIHR5cGUgIit0aGlzLmdyb3VwaW5nX3R5cGUpOwoJCWlmICh0aGlzLnZlcnNpb24gPT09IDEpIHsKCQkJdGhpcy5kZWZhdWx0X2xlbmd0aCA9IHN0cmVhbS5yZWFkVWludDMyKCk7CgkJfSBlbHNlIHsKCQkJdGhpcy5kZWZhdWx0X2xlbmd0aCA9IDA7CgkJfQoJCWlmICh0aGlzLnZlcnNpb24gPj0gMikgewoJCQl0aGlzLmRlZmF1bHRfZ3JvdXBfZGVzY3JpcHRpb25faW5kZXggPSBzdHJlYW0ucmVhZFVpbnQzMigpOwoJCX0KCQl0aGlzLmVudHJpZXMgPSBbXTsKCQl2YXIgZW50cnlfY291bnQgPSBzdHJlYW0ucmVhZFVpbnQzMigpOwoJCWZvciAodmFyIGkgPSAwOyBpIDwgZW50cnlfY291bnQ7IGkrKykgewoJCQl2YXIgZW50cnk7CgkJCWlmIChCb3hQYXJzZXJbdGhpcy5ncm91cGluZ190eXBlKyJTYW1wbGVHcm91cEVudHJ5Il0pIHsKCQkJCWVudHJ5ID0gbmV3IEJveFBhcnNlclt0aGlzLmdyb3VwaW5nX3R5cGUrIlNhbXBsZUdyb3VwRW50cnkiXSh0aGlzLmdyb3VwaW5nX3R5cGUpOwoJCQl9ICBlbHNlIHsKCQkJCWVudHJ5ID0gbmV3IEJveFBhcnNlci5TYW1wbGVHcm91cEVudHJ5KHRoaXMuZ3JvdXBpbmdfdHlwZSk7CgkJCX0KCQkJdGhpcy5lbnRyaWVzLnB1c2goZW50cnkpOwoJCQlpZiAodGhpcy52ZXJzaW9uID09PSAxKSB7CgkJCQlpZiAodGhpcy5kZWZhdWx0X2xlbmd0aCA9PT0gMCkgewoJCQkJCWVudHJ5LmRlc2NyaXB0aW9uX2xlbmd0aCA9IHN0cmVhbS5yZWFkVWludDMyKCk7CgkJCQl9IGVsc2UgewoJCQkJCWVudHJ5LmRlc2NyaXB0aW9uX2xlbmd0aCA9IHRoaXMuZGVmYXVsdF9sZW5ndGg7CgkJCQl9CgkJCX0gZWxzZSB7CgkJCQllbnRyeS5kZXNjcmlwdGlvbl9sZW5ndGggPSB0aGlzLmRlZmF1bHRfbGVuZ3RoOwoJCQl9CgkJCWlmIChlbnRyeS53cml0ZSA9PT0gQm94UGFyc2VyLlNhbXBsZUdyb3VwRW50cnkucHJvdG90eXBlLndyaXRlKSB7CgkJCQlMb2cuaW5mbygiQm94UGFyc2VyIiwgIlNhbXBsZUdyb3VwIGZvciB0eXBlICIrdGhpcy5ncm91cGluZ190eXBlKyIgd3JpdGluZyBub3QgeWV0IGltcGxlbWVudGVkLCBrZWVwaW5nIHVucGFyc2VkIGRhdGEgaW4gbWVtb3J5IGZvciBsYXRlciB3cml0ZSIpOwoJCQkJLy8gc3RvcmluZyBkYXRhCgkJCQllbnRyeS5kYXRhID0gc3RyZWFtLnJlYWRVaW50OEFycmF5KGVudHJ5LmRlc2NyaXB0aW9uX2xlbmd0aCk7CgkJCQkvLyByZXdpbmRpbmcKCQkJCXN0cmVhbS5wb3NpdGlvbiAtPSBlbnRyeS5kZXNjcmlwdGlvbl9sZW5ndGg7CgkJCX0KCQkJZW50cnkucGFyc2Uoc3RyZWFtKTsKCQl9Cgl9KTsKCgkvLyBmaWxlOnNyYy9wYXJzaW5nL3NpZHguanMKCUJveFBhcnNlci5jcmVhdGVGdWxsQm94Q3Rvcigic2lkeCIsIGZ1bmN0aW9uKHN0cmVhbSkgewoJCXRoaXMucmVmZXJlbmNlX0lEID0gc3RyZWFtLnJlYWRVaW50MzIoKTsKCQl0aGlzLnRpbWVzY2FsZSA9IHN0cmVhbS5yZWFkVWludDMyKCk7CgkJaWYgKHRoaXMudmVyc2lvbiA9PT0gMCkgewoJCQl0aGlzLmVhcmxpZXN0X3ByZXNlbnRhdGlvbl90aW1lID0gc3RyZWFtLnJlYWRVaW50MzIoKTsKCQkJdGhpcy5maXJzdF9vZmZzZXQgPSBzdHJlYW0ucmVhZFVpbnQzMigpOwoJCX0gZWxzZSB7CgkJCXRoaXMuZWFybGllc3RfcHJlc2VudGF0aW9uX3RpbWUgPSBzdHJlYW0ucmVhZFVpbnQ2NCgpOwoJCQl0aGlzLmZpcnN0X29mZnNldCA9IHN0cmVhbS5yZWFkVWludDY0KCk7CgkJfQoJCXN0cmVhbS5yZWFkVWludDE2KCk7CgkJdGhpcy5yZWZlcmVuY2VzID0gW107CgkJdmFyIGNvdW50ID0gc3RyZWFtLnJlYWRVaW50MTYoKTsKCQlmb3IgKHZhciBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKCQkJdmFyIHJlZiA9IHt9OwoJCQl0aGlzLnJlZmVyZW5jZXMucHVzaChyZWYpOwoJCQl2YXIgdG1wXzMyID0gc3RyZWFtLnJlYWRVaW50MzIoKTsKCQkJcmVmLnJlZmVyZW5jZV90eXBlID0gKHRtcF8zMiA+PiAzMSkgJiAweDE7CgkJCXJlZi5yZWZlcmVuY2VkX3NpemUgPSB0bXBfMzIgJiAweDdGRkZGRkZGOwoJCQlyZWYuc3Vic2VnbWVudF9kdXJhdGlvbiA9IHN0cmVhbS5yZWFkVWludDMyKCk7CgkJCXRtcF8zMiA9IHN0cmVhbS5yZWFkVWludDMyKCk7CgkJCXJlZi5zdGFydHNfd2l0aF9TQVAgPSAodG1wXzMyID4+IDMxKSAmIDB4MTsKCQkJcmVmLlNBUF90eXBlID0gKHRtcF8zMiA+PiAyOCkgJiAweDc7CgkJCXJlZi5TQVBfZGVsdGFfdGltZSA9IHRtcF8zMiAmIDB4RkZGRkZGRjsKCQl9Cgl9KTsKCgkvLyBmaWxlOnNyYy9wYXJzaW5nL3NpbmdsZWl0ZW10eXBlcmVmZXJlbmNlLmpzCglCb3hQYXJzZXIuU2luZ2xlSXRlbVR5cGVSZWZlcmVuY2VCb3ggPSBmdW5jdGlvbih0eXBlLCBzaXplLCBoZHJfc2l6ZSwgc3RhcnQpIHsKCQlCb3hQYXJzZXIuQm94LmNhbGwodGhpcywgdHlwZSwgc2l6ZSk7CgkJdGhpcy5oZHJfc2l6ZSA9IGhkcl9zaXplOwoJCXRoaXMuc3RhcnQgPSBzdGFydDsKCX07CglCb3hQYXJzZXIuU2luZ2xlSXRlbVR5cGVSZWZlcmVuY2VCb3gucHJvdG90eXBlID0gbmV3IEJveFBhcnNlci5Cb3goKTsKCUJveFBhcnNlci5TaW5nbGVJdGVtVHlwZVJlZmVyZW5jZUJveC5wcm90b3R5cGUucGFyc2UgPSBmdW5jdGlvbihzdHJlYW0pIHsKCQl0aGlzLmZyb21faXRlbV9JRCA9IHN0cmVhbS5yZWFkVWludDE2KCk7CgkJdmFyIGNvdW50ID0gIHN0cmVhbS5yZWFkVWludDE2KCk7CgkJdGhpcy5yZWZlcmVuY2VzID0gW107CgkJZm9yKHZhciBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKCQkJdGhpcy5yZWZlcmVuY2VzW2ldID0gc3RyZWFtLnJlYWRVaW50MTYoKTsKCQl9Cgl9OwoKCS8vIGZpbGU6c3JjL3BhcnNpbmcvc2luZ2xlaXRlbXR5cGVyZWZlcmVuY2VsYXJnZS5qcwoJQm94UGFyc2VyLlNpbmdsZUl0ZW1UeXBlUmVmZXJlbmNlQm94TGFyZ2UgPSBmdW5jdGlvbih0eXBlLCBzaXplLCBoZHJfc2l6ZSwgc3RhcnQpIHsKCQlCb3hQYXJzZXIuQm94LmNhbGwodGhpcywgdHlwZSwgc2l6ZSk7CgkJdGhpcy5oZHJfc2l6ZSA9IGhkcl9zaXplOwoJCXRoaXMuc3RhcnQgPSBzdGFydDsKCX07CglCb3hQYXJzZXIuU2luZ2xlSXRlbVR5cGVSZWZlcmVuY2VCb3hMYXJnZS5wcm90b3R5cGUgPSBuZXcgQm94UGFyc2VyLkJveCgpOwoJQm94UGFyc2VyLlNpbmdsZUl0ZW1UeXBlUmVmZXJlbmNlQm94TGFyZ2UucHJvdG90eXBlLnBhcnNlID0gZnVuY3Rpb24oc3RyZWFtKSB7CgkJdGhpcy5mcm9tX2l0ZW1fSUQgPSBzdHJlYW0ucmVhZFVpbnQzMigpOwoJCXZhciBjb3VudCA9ICBzdHJlYW0ucmVhZFVpbnQxNigpOwoJCXRoaXMucmVmZXJlbmNlcyA9IFtdOwoJCWZvcih2YXIgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CgkJCXRoaXMucmVmZXJlbmNlc1tpXSA9IHN0cmVhbS5yZWFkVWludDMyKCk7CgkJfQoJfTsKCgkvLyBmaWxlOnNyYy9wYXJzaW5nL1NtRG0uanMKCUJveFBhcnNlci5jcmVhdGVGdWxsQm94Q3RvcigiU21EbSIsIGZ1bmN0aW9uKHN0cmVhbSkgewoJCXRoaXMucHJpbWFyeVJDaHJvbWF0aWNpdHlfeCA9IHN0cmVhbS5yZWFkVWludDE2KCk7CgkgICAgdGhpcy5wcmltYXJ5UkNocm9tYXRpY2l0eV95ID0gc3RyZWFtLnJlYWRVaW50MTYoKTsKCSAgICB0aGlzLnByaW1hcnlHQ2hyb21hdGljaXR5X3ggPSBzdHJlYW0ucmVhZFVpbnQxNigpOwoJICAgIHRoaXMucHJpbWFyeUdDaHJvbWF0aWNpdHlfeSA9IHN0cmVhbS5yZWFkVWludDE2KCk7CgkgICAgdGhpcy5wcmltYXJ5QkNocm9tYXRpY2l0eV94ID0gc3RyZWFtLnJlYWRVaW50MTYoKTsKCSAgICB0aGlzLnByaW1hcnlCQ2hyb21hdGljaXR5X3kgPSBzdHJlYW0ucmVhZFVpbnQxNigpOwoJICAgIHRoaXMud2hpdGVQb2ludENocm9tYXRpY2l0eV94ID0gc3RyZWFtLnJlYWRVaW50MTYoKTsKCSAgICB0aGlzLndoaXRlUG9pbnRDaHJvbWF0aWNpdHlfeSA9IHN0cmVhbS5yZWFkVWludDE2KCk7CgkgICAgdGhpcy5sdW1pbmFuY2VNYXggPSBzdHJlYW0ucmVhZFVpbnQzMigpOwoJICAgIHRoaXMubHVtaW5hbmNlTWluID0gc3RyZWFtLnJlYWRVaW50MzIoKTsKCX0pOwoKCS8vIGZpbGU6c3JjL3BhcnNpbmcvc21oZC5qcwoJQm94UGFyc2VyLmNyZWF0ZUZ1bGxCb3hDdG9yKCJzbWhkIiwgZnVuY3Rpb24oc3RyZWFtKSB7CgkJdGhpcy5iYWxhbmNlID0gc3RyZWFtLnJlYWRVaW50MTYoKTsKCQlzdHJlYW0ucmVhZFVpbnQxNigpOwoJfSk7CgoJLy8gZmlsZTpzcmMvcGFyc2luZy9zc2l4LmpzCglCb3hQYXJzZXIuY3JlYXRlRnVsbEJveEN0b3IoInNzaXgiLCBmdW5jdGlvbihzdHJlYW0pIHsKCQl0aGlzLnN1YnNlZ21lbnRzID0gW107CgkJdmFyIHN1YnNlZ21lbnRfY291bnQgPSBzdHJlYW0ucmVhZFVpbnQzMigpOwoJCWZvciAodmFyIGkgPSAwOyBpIDwgc3Vic2VnbWVudF9jb3VudDsgaSsrKSB7CgkJCXZhciBzdWJzZWdtZW50ID0ge307CgkJCXRoaXMuc3Vic2VnbWVudHMucHVzaChzdWJzZWdtZW50KTsKCQkJc3Vic2VnbWVudC5yYW5nZXMgPSBbXTsKCQkJdmFyIHJhbmdlX2NvdW50ID0gc3RyZWFtLnJlYWRVaW50MzIoKTsKCQkJZm9yICh2YXIgaiA9IDA7IGogPCByYW5nZV9jb3VudDsgaisrKSB7CgkJCQl2YXIgcmFuZ2UgPSB7fTsKCQkJCXN1YnNlZ21lbnQucmFuZ2VzLnB1c2gocmFuZ2UpOwoJCQkJcmFuZ2UubGV2ZWwgPSBzdHJlYW0ucmVhZFVpbnQ4KCk7CgkJCQlyYW5nZS5yYW5nZV9zaXplID0gc3RyZWFtLnJlYWRVaW50MjQoKTsKCQkJfQoJCX0KCX0pOwoKCS8vIGZpbGU6c3JjL3BhcnNpbmcvc3Rjby5qcwoJQm94UGFyc2VyLmNyZWF0ZUZ1bGxCb3hDdG9yKCJzdGNvIiwgZnVuY3Rpb24oc3RyZWFtKSB7CgkJdmFyIGVudHJ5X2NvdW50OwoJCWVudHJ5X2NvdW50ID0gc3RyZWFtLnJlYWRVaW50MzIoKTsKCQl0aGlzLmNodW5rX29mZnNldHMgPSBbXTsKCQlpZiAodGhpcy52ZXJzaW9uID09PSAwKSB7CgkJCWZvciAodmFyIGkgPSAwOyBpIDwgZW50cnlfY291bnQ7IGkrKykgewoJCQkJdGhpcy5jaHVua19vZmZzZXRzLnB1c2goc3RyZWFtLnJlYWRVaW50MzIoKSk7CgkJCX0KCQl9Cgl9KTsKCgkvLyBmaWxlOnNyYy9wYXJzaW5nL3N0ZHAuanMKCUJveFBhcnNlci5jcmVhdGVGdWxsQm94Q3Rvcigic3RkcCIsIGZ1bmN0aW9uKHN0cmVhbSkgewoJCXZhciBjb3VudCA9ICh0aGlzLnNpemUgLSB0aGlzLmhkcl9zaXplKS8yOwoJCXRoaXMucHJpb3JpdHkgPSBbXTsKCQlmb3IgKHZhciBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKCQkJdGhpcy5wcmlvcml0eVtpXSA9IHN0cmVhbS5yZWFkVWludDE2KCk7CgkJfQoJfSk7CgoJLy8gZmlsZTpzcmMvcGFyc2luZy9zdGhkLmpzCglCb3hQYXJzZXIuY3JlYXRlRnVsbEJveEN0b3IoInN0aGQiKTsKCgkvLyBmaWxlOnNyYy9wYXJzaW5nL3N0cmkuanMKCUJveFBhcnNlci5jcmVhdGVGdWxsQm94Q3Rvcigic3RyaSIsIGZ1bmN0aW9uKHN0cmVhbSkgewoJCXRoaXMuc3dpdGNoX2dyb3VwID0gc3RyZWFtLnJlYWRVaW50MTYoKTsKCQl0aGlzLmFsdGVybmF0ZV9ncm91cCA9IHN0cmVhbS5yZWFkVWludDE2KCk7CgkJdGhpcy5zdWJfdHJhY2tfaWQgPSBzdHJlYW0ucmVhZFVpbnQzMigpOwoJCXZhciBjb3VudCA9ICh0aGlzLnNpemUgLSB0aGlzLmhkcl9zaXplIC0gOCkvNDsKCQl0aGlzLmF0dHJpYnV0ZV9saXN0ID0gW107CgkJZm9yICh2YXIgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CgkJCXRoaXMuYXR0cmlidXRlX2xpc3RbaV0gPSBzdHJlYW0ucmVhZFVpbnQzMigpOwoJCX0KCX0pOwoKCS8vIGZpbGU6c3JjL3BhcnNpbmcvc3RzYy5qcwoJQm94UGFyc2VyLmNyZWF0ZUZ1bGxCb3hDdG9yKCJzdHNjIiwgZnVuY3Rpb24oc3RyZWFtKSB7CgkJdmFyIGVudHJ5X2NvdW50OwoJCXZhciBpOwoJCWVudHJ5X2NvdW50ID0gc3RyZWFtLnJlYWRVaW50MzIoKTsKCQl0aGlzLmZpcnN0X2NodW5rID0gW107CgkJdGhpcy5zYW1wbGVzX3Blcl9jaHVuayA9IFtdOwoJCXRoaXMuc2FtcGxlX2Rlc2NyaXB0aW9uX2luZGV4ID0gW107CgkJaWYgKHRoaXMudmVyc2lvbiA9PT0gMCkgewoJCQlmb3IoaT0wOyBpPGVudHJ5X2NvdW50OyBpKyspIHsKCQkJCXRoaXMuZmlyc3RfY2h1bmsucHVzaChzdHJlYW0ucmVhZFVpbnQzMigpKTsKCQkJCXRoaXMuc2FtcGxlc19wZXJfY2h1bmsucHVzaChzdHJlYW0ucmVhZFVpbnQzMigpKTsKCQkJCXRoaXMuc2FtcGxlX2Rlc2NyaXB0aW9uX2luZGV4LnB1c2goc3RyZWFtLnJlYWRVaW50MzIoKSk7CgkJCX0KCQl9Cgl9KTsKCgkvLyBmaWxlOnNyYy9wYXJzaW5nL3N0c2QuanMKCUJveFBhcnNlci5jcmVhdGVGdWxsQm94Q3Rvcigic3RzZCIsIGZ1bmN0aW9uKHN0cmVhbSkgewoJCXZhciBpOwoJCXZhciByZXQ7CgkJdmFyIGVudHJ5Q291bnQ7CgkJdmFyIGJveDsKCQl0aGlzLmVudHJpZXMgPSBbXTsKCQllbnRyeUNvdW50ID0gc3RyZWFtLnJlYWRVaW50MzIoKTsKCQlmb3IgKGkgPSAxOyBpIDw9IGVudHJ5Q291bnQ7IGkrKykgewoJCQlyZXQgPSBCb3hQYXJzZXIucGFyc2VPbmVCb3goc3RyZWFtLCB0cnVlLCB0aGlzLnNpemUgLSAoc3RyZWFtLmdldFBvc2l0aW9uKCkgLSB0aGlzLnN0YXJ0KSk7CgkJCWlmIChyZXQuY29kZSA9PT0gQm94UGFyc2VyLk9LKSB7CgkJCQlpZiAoQm94UGFyc2VyW3JldC50eXBlKyJTYW1wbGVFbnRyeSJdKSB7CgkJCQkJYm94ID0gbmV3IEJveFBhcnNlcltyZXQudHlwZSsiU2FtcGxlRW50cnkiXShyZXQuc2l6ZSk7CgkJCQkJYm94Lmhkcl9zaXplID0gcmV0Lmhkcl9zaXplOwoJCQkJCWJveC5zdGFydCA9IHJldC5zdGFydDsKCQkJCX0gZWxzZSB7CgkJCQkJTG9nLndhcm4oIkJveFBhcnNlciIsICJVbmtub3duIHNhbXBsZSBlbnRyeSB0eXBlOiAiK3JldC50eXBlKTsKCQkJCQlib3ggPSBuZXcgQm94UGFyc2VyLlNhbXBsZUVudHJ5KHJldC50eXBlLCByZXQuc2l6ZSwgcmV0Lmhkcl9zaXplLCByZXQuc3RhcnQpOwoJCQkJfQoJCQkJaWYgKGJveC53cml0ZSA9PT0gQm94UGFyc2VyLlNhbXBsZUVudHJ5LnByb3RvdHlwZS53cml0ZSkgewoJCQkJCUxvZy5pbmZvKCJCb3hQYXJzZXIiLCAiU2FtcGxlRW50cnkgIitib3gudHlwZSsiIGJveCB3cml0aW5nIG5vdCB5ZXQgaW1wbGVtZW50ZWQsIGtlZXBpbmcgdW5wYXJzZWQgZGF0YSBpbiBtZW1vcnkgZm9yIGxhdGVyIHdyaXRlIik7CgkJCQkJYm94LnBhcnNlRGF0YUFuZFJld2luZChzdHJlYW0pOwoJCQkJfQoJCQkJYm94LnBhcnNlKHN0cmVhbSk7CgkJCQl0aGlzLmVudHJpZXMucHVzaChib3gpOwoJCQl9IGVsc2UgewoJCQkJcmV0dXJuOwoJCQl9CgkJfQoJfSk7CgoJLy8gZmlsZTpzcmMvcGFyc2luZy9zdHNnLmpzCglCb3hQYXJzZXIuY3JlYXRlRnVsbEJveEN0b3IoInN0c2ciLCBmdW5jdGlvbihzdHJlYW0pIHsKCQl0aGlzLmdyb3VwaW5nX3R5cGUgPSBzdHJlYW0ucmVhZFVpbnQzMigpOwoJCXZhciBjb3VudCA9IHN0cmVhbS5yZWFkVWludDE2KCk7CgkJdGhpcy5ncm91cF9kZXNjcmlwdGlvbl9pbmRleCA9IFtdOwoJCWZvciAodmFyIGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewoJCQl0aGlzLmdyb3VwX2Rlc2NyaXB0aW9uX2luZGV4W2ldID0gc3RyZWFtLnJlYWRVaW50MzIoKTsKCQl9Cgl9KTsKCgkvLyBmaWxlOnNyYy9wYXJzaW5nL3N0c2guanMKCUJveFBhcnNlci5jcmVhdGVGdWxsQm94Q3Rvcigic3RzaCIsIGZ1bmN0aW9uKHN0cmVhbSkgewoJCXZhciBlbnRyeV9jb3VudDsKCQl2YXIgaTsKCQllbnRyeV9jb3VudCA9IHN0cmVhbS5yZWFkVWludDMyKCk7CgkJdGhpcy5zaGFkb3dlZF9zYW1wbGVfbnVtYmVycyA9IFtdOwoJCXRoaXMuc3luY19zYW1wbGVfbnVtYmVycyA9IFtdOwoJCWlmICh0aGlzLnZlcnNpb24gPT09IDApIHsKCQkJZm9yKGk9MDsgaTxlbnRyeV9jb3VudDsgaSsrKSB7CgkJCQl0aGlzLnNoYWRvd2VkX3NhbXBsZV9udW1iZXJzLnB1c2goc3RyZWFtLnJlYWRVaW50MzIoKSk7CgkJCQl0aGlzLnN5bmNfc2FtcGxlX251bWJlcnMucHVzaChzdHJlYW0ucmVhZFVpbnQzMigpKTsKCQkJfQoJCX0KCX0pOwoKCS8vIGZpbGU6c3JjL3BhcnNpbmcvc3Rzcy5qcwoJQm94UGFyc2VyLmNyZWF0ZUZ1bGxCb3hDdG9yKCJzdHNzIiwgZnVuY3Rpb24oc3RyZWFtKSB7CgkJdmFyIGk7CgkJdmFyIGVudHJ5X2NvdW50OwoJCWVudHJ5X2NvdW50ID0gc3RyZWFtLnJlYWRVaW50MzIoKTsKCQlpZiAodGhpcy52ZXJzaW9uID09PSAwKSB7CgkJCXRoaXMuc2FtcGxlX251bWJlcnMgPSBbXTsKCQkJZm9yKGk9MDsgaTxlbnRyeV9jb3VudDsgaSsrKSB7CgkJCQl0aGlzLnNhbXBsZV9udW1iZXJzLnB1c2goc3RyZWFtLnJlYWRVaW50MzIoKSk7CgkJCX0KCQl9Cgl9KTsKCgkvLyBmaWxlOnNyYy9wYXJzaW5nL3N0c3ouanMKCUJveFBhcnNlci5jcmVhdGVGdWxsQm94Q3Rvcigic3RzeiIsIGZ1bmN0aW9uKHN0cmVhbSkgewoJCXZhciBpOwoJCXRoaXMuc2FtcGxlX3NpemVzID0gW107CgkJaWYgKHRoaXMudmVyc2lvbiA9PT0gMCkgewoJCQl0aGlzLnNhbXBsZV9zaXplID0gc3RyZWFtLnJlYWRVaW50MzIoKTsKCQkJdGhpcy5zYW1wbGVfY291bnQgPSBzdHJlYW0ucmVhZFVpbnQzMigpOwoJCQlmb3IgKGkgPSAwOyBpIDwgdGhpcy5zYW1wbGVfY291bnQ7IGkrKykgewoJCQkJaWYgKHRoaXMuc2FtcGxlX3NpemUgPT09IDApIHsKCQkJCQl0aGlzLnNhbXBsZV9zaXplcy5wdXNoKHN0cmVhbS5yZWFkVWludDMyKCkpOwoJCQkJfSBlbHNlIHsKCQkJCQl0aGlzLnNhbXBsZV9zaXplc1tpXSA9IHRoaXMuc2FtcGxlX3NpemU7CgkJCQl9CgkJCX0KCQl9Cgl9KTsKCgkvLyBmaWxlOnNyYy9wYXJzaW5nL3N0dHMuanMKCUJveFBhcnNlci5jcmVhdGVGdWxsQm94Q3Rvcigic3R0cyIsIGZ1bmN0aW9uKHN0cmVhbSkgewoJCXZhciBlbnRyeV9jb3VudDsKCQl2YXIgaTsKCQl2YXIgZGVsdGE7CgkJZW50cnlfY291bnQgPSBzdHJlYW0ucmVhZFVpbnQzMigpOwoJCXRoaXMuc2FtcGxlX2NvdW50cyA9IFtdOwoJCXRoaXMuc2FtcGxlX2RlbHRhcyA9IFtdOwoJCWlmICh0aGlzLnZlcnNpb24gPT09IDApIHsKCQkJZm9yKGk9MDsgaTxlbnRyeV9jb3VudDsgaSsrKSB7CgkJCQl0aGlzLnNhbXBsZV9jb3VudHMucHVzaChzdHJlYW0ucmVhZFVpbnQzMigpKTsKCQkJCWRlbHRhID0gc3RyZWFtLnJlYWRJbnQzMigpOwoJCQkJaWYgKGRlbHRhIDwgMCkgewoJCQkJCUxvZy53YXJuKCJCb3hQYXJzZXIiLCAiRmlsZSB1c2VzIG5lZ2F0aXZlIHN0dHMgc2FtcGxlIGRlbHRhLCB1c2luZyB2YWx1ZSAxIGluc3RlYWQsIHN5bmMgbWF5IGJlIGxvc3QhIik7CgkJCQkJZGVsdGEgPSAxOwoJCQkJfQoJCQkJdGhpcy5zYW1wbGVfZGVsdGFzLnB1c2goZGVsdGEpOwoJCQl9CgkJfQoJfSk7CgoJLy8gZmlsZTpzcmMvcGFyc2luZy9zdHZpLmpzCglCb3hQYXJzZXIuY3JlYXRlRnVsbEJveEN0b3IoInN0dmkiLCBmdW5jdGlvbihzdHJlYW0pIHsKCQl2YXIgdG1wMzIgPSBzdHJlYW0ucmVhZFVpbnQzMigpOwoJCXRoaXMuc2luZ2xlX3ZpZXdfYWxsb3dlZCA9IHRtcDMyICYgMHgzOwoJCXRoaXMuc3RlcmVvX3NjaGVtZSA9IHN0cmVhbS5yZWFkVWludDMyKCk7CgkJdmFyIGxlbmd0aCA9IHN0cmVhbS5yZWFkVWludDMyKCk7CgkJdGhpcy5zdGVyZW9faW5kaWNhdGlvbl90eXBlID0gc3RyZWFtLnJlYWRTdHJpbmcobGVuZ3RoKTsKCQl2YXIgcmV0OwoJCXZhciBib3g7CgkJdGhpcy5ib3hlcyA9IFtdOwoJCXdoaWxlIChzdHJlYW0uZ2V0UG9zaXRpb24oKSA8IHRoaXMuc3RhcnQrdGhpcy5zaXplKSB7CgkJCXJldCA9IEJveFBhcnNlci5wYXJzZU9uZUJveChzdHJlYW0sIGZhbHNlLCB0aGlzLnNpemUgLSAoc3RyZWFtLmdldFBvc2l0aW9uKCkgLSB0aGlzLnN0YXJ0KSk7CgkJCWlmIChyZXQuY29kZSA9PT0gQm94UGFyc2VyLk9LKSB7CgkJCQlib3ggPSByZXQuYm94OwoJCQkJdGhpcy5ib3hlcy5wdXNoKGJveCk7CgkJCQl0aGlzW2JveC50eXBlXSA9IGJveDsKCQkJfSBlbHNlIHsKCQkJCXJldHVybjsKCQkJfQoJCX0KCX0pOwoKCS8vIGZpbGU6c3JjL3BhcnNpbmcvc3R5cC5qcwoJQm94UGFyc2VyLmNyZWF0ZUJveEN0b3IoInN0eXAiLCBmdW5jdGlvbihzdHJlYW0pIHsKCQlCb3hQYXJzZXIuZnR5cEJveC5wcm90b3R5cGUucGFyc2UuY2FsbCh0aGlzLCBzdHJlYW0pOwoJfSk7CgoJLy8gZmlsZTpzcmMvcGFyc2luZy9zdHoyLmpzCglCb3hQYXJzZXIuY3JlYXRlRnVsbEJveEN0b3IoInN0ejIiLCBmdW5jdGlvbihzdHJlYW0pIHsKCQl2YXIgaTsKCQl2YXIgc2FtcGxlX2NvdW50OwoJCXRoaXMuc2FtcGxlX3NpemVzID0gW107CgkJaWYgKHRoaXMudmVyc2lvbiA9PT0gMCkgewoJCQl0aGlzLnJlc2VydmVkID0gc3RyZWFtLnJlYWRVaW50MjQoKTsKCQkJdGhpcy5maWVsZF9zaXplID0gc3RyZWFtLnJlYWRVaW50OCgpOwoJCQlzYW1wbGVfY291bnQgPSBzdHJlYW0ucmVhZFVpbnQzMigpOwoJCQlpZiAodGhpcy5maWVsZF9zaXplID09PSA0KSB7CgkJCQlmb3IgKGkgPSAwOyBpIDwgc2FtcGxlX2NvdW50OyBpKz0yKSB7CgkJCQkJdmFyIHRtcCA9IHN0cmVhbS5yZWFkVWludDgoKTsKCQkJCQl0aGlzLnNhbXBsZV9zaXplc1tpXSA9ICh0bXAgPj4gNCkgJiAweEY7CgkJCQkJdGhpcy5zYW1wbGVfc2l6ZXNbaSsxXSA9IHRtcCAmIDB4RjsKCQkJCX0KCQkJfSBlbHNlIGlmICh0aGlzLmZpZWxkX3NpemUgPT09IDgpIHsKCQkJCWZvciAoaSA9IDA7IGkgPCBzYW1wbGVfY291bnQ7IGkrKykgewoJCQkJCXRoaXMuc2FtcGxlX3NpemVzW2ldID0gc3RyZWFtLnJlYWRVaW50OCgpOwoJCQkJfQoJCQl9IGVsc2UgaWYgKHRoaXMuZmllbGRfc2l6ZSA9PT0gMTYpIHsKCQkJCWZvciAoaSA9IDA7IGkgPCBzYW1wbGVfY291bnQ7IGkrKykgewoJCQkJCXRoaXMuc2FtcGxlX3NpemVzW2ldID0gc3RyZWFtLnJlYWRVaW50MTYoKTsKCQkJCX0KCQkJfSBlbHNlIHsKCQkJCUxvZy5lcnJvcigiQm94UGFyc2VyIiwgIkVycm9yIGluIGxlbmd0aCBmaWVsZCBpbiBzdHoyIGJveCIpOwoJCQl9CgkJfQoJfSk7CgoJLy8gZmlsZTpzcmMvcGFyc2luZy9zdWJzLmpzCglCb3hQYXJzZXIuY3JlYXRlRnVsbEJveEN0b3IoInN1YnMiLCBmdW5jdGlvbihzdHJlYW0pIHsKCQl2YXIgaSxqOwoJCXZhciBlbnRyeV9jb3VudDsKCQl2YXIgc3Vic2FtcGxlX2NvdW50OwoJCWVudHJ5X2NvdW50ID0gc3RyZWFtLnJlYWRVaW50MzIoKTsKCQl0aGlzLmVudHJpZXMgPSBbXTsKCQlmb3IgKGkgPSAwOyBpIDwgZW50cnlfY291bnQ7IGkrKykgewoJCQl2YXIgc2FtcGxlSW5mbyA9IHt9OwoJCQl0aGlzLmVudHJpZXNbaV0gPSBzYW1wbGVJbmZvOwoJCQlzYW1wbGVJbmZvLnNhbXBsZV9kZWx0YSA9IHN0cmVhbS5yZWFkVWludDMyKCk7CgkJCXNhbXBsZUluZm8uc3Vic2FtcGxlcyA9IFtdOwoJCQlzdWJzYW1wbGVfY291bnQgPSBzdHJlYW0ucmVhZFVpbnQxNigpOwoJCQlpZiAoc3Vic2FtcGxlX2NvdW50PjApIHsKCQkJCWZvciAoaiA9IDA7IGogPCBzdWJzYW1wbGVfY291bnQ7IGorKykgewoJCQkJCXZhciBzdWJzYW1wbGUgPSB7fTsKCQkJCQlzYW1wbGVJbmZvLnN1YnNhbXBsZXMucHVzaChzdWJzYW1wbGUpOwoJCQkJCWlmICh0aGlzLnZlcnNpb24gPT0gMSkgewoJCQkJCQlzdWJzYW1wbGUuc2l6ZSA9IHN0cmVhbS5yZWFkVWludDMyKCk7CgkJCQkJfSBlbHNlIHsKCQkJCQkJc3Vic2FtcGxlLnNpemUgPSBzdHJlYW0ucmVhZFVpbnQxNigpOwoJCQkJCX0KCQkJCQlzdWJzYW1wbGUucHJpb3JpdHkgPSBzdHJlYW0ucmVhZFVpbnQ4KCk7CgkJCQkJc3Vic2FtcGxlLmRpc2NhcmRhYmxlID0gc3RyZWFtLnJlYWRVaW50OCgpOwoJCQkJCXN1YnNhbXBsZS5jb2RlY19zcGVjaWZpY19wYXJhbWV0ZXJzID0gc3RyZWFtLnJlYWRVaW50MzIoKTsKCQkJCX0KCQkJfQoJCX0KCX0pOwoKCS8vIGZpbGU6c3JjL3BhcnNpbmcvdGVuYy5qcwoJQm94UGFyc2VyLmNyZWF0ZUZ1bGxCb3hDdG9yKCJ0ZW5jIiwgZnVuY3Rpb24oc3RyZWFtKSB7CgkJc3RyZWFtLnJlYWRVaW50OCgpOyAvLyByZXNlcnZlZAoJCWlmICh0aGlzLnZlcnNpb24gPT09IDApIHsKCQkJc3RyZWFtLnJlYWRVaW50OCgpOwoJCX0gZWxzZSB7CgkJCXZhciB0bXAgPSBzdHJlYW0ucmVhZFVpbnQ4KCk7CgkJCXRoaXMuZGVmYXVsdF9jcnlwdF9ieXRlX2Jsb2NrID0gKHRtcCA+PiA0KSAmIDB4RjsKCQkJdGhpcy5kZWZhdWx0X3NraXBfYnl0ZV9ibG9jayA9IHRtcCAmIDB4RjsKCQl9CgkJdGhpcy5kZWZhdWx0X2lzUHJvdGVjdGVkID0gc3RyZWFtLnJlYWRVaW50OCgpOwoJCXRoaXMuZGVmYXVsdF9QZXJfU2FtcGxlX0lWX1NpemUgPSBzdHJlYW0ucmVhZFVpbnQ4KCk7CgkJdGhpcy5kZWZhdWx0X0tJRCA9IEJveFBhcnNlci5wYXJzZUhleDE2KHN0cmVhbSk7CgkJaWYgKHRoaXMuZGVmYXVsdF9pc1Byb3RlY3RlZCA9PT0gMSAmJiB0aGlzLmRlZmF1bHRfUGVyX1NhbXBsZV9JVl9TaXplID09PSAwKSB7CgkJCXRoaXMuZGVmYXVsdF9jb25zdGFudF9JVl9zaXplID0gc3RyZWFtLnJlYWRVaW50OCgpOwoJCQl0aGlzLmRlZmF1bHRfY29uc3RhbnRfSVYgPSBzdHJlYW0ucmVhZFVpbnQ4QXJyYXkodGhpcy5kZWZhdWx0X2NvbnN0YW50X0lWX3NpemUpOwoJCX0KCX0pOy8vIGZpbGU6c3JjL3BhcnNpbmcvdGZkdC5qcwoJQm94UGFyc2VyLmNyZWF0ZUZ1bGxCb3hDdG9yKCJ0ZmR0IiwgZnVuY3Rpb24oc3RyZWFtKSB7CgkJaWYgKHRoaXMudmVyc2lvbiA9PSAxKSB7CgkJCXRoaXMuYmFzZU1lZGlhRGVjb2RlVGltZSA9IHN0cmVhbS5yZWFkVWludDY0KCk7CgkJfSBlbHNlIHsKCQkJdGhpcy5iYXNlTWVkaWFEZWNvZGVUaW1lID0gc3RyZWFtLnJlYWRVaW50MzIoKTsKCQl9Cgl9KTsKCgkvLyBmaWxlOnNyYy9wYXJzaW5nL3RmaGQuanMKCUJveFBhcnNlci5jcmVhdGVGdWxsQm94Q3RvcigidGZoZCIsIGZ1bmN0aW9uKHN0cmVhbSkgewoJCXZhciByZWFkQnl0ZXMgPSAwOwoJCXRoaXMudHJhY2tfaWQgPSBzdHJlYW0ucmVhZFVpbnQzMigpOwoJCWlmICh0aGlzLnNpemUgLSB0aGlzLmhkcl9zaXplID4gcmVhZEJ5dGVzICYmICh0aGlzLmZsYWdzICYgQm94UGFyc2VyLlRGSERfRkxBR19CQVNFX0RBVEFfT0ZGU0VUKSkgewoJCQl0aGlzLmJhc2VfZGF0YV9vZmZzZXQgPSBzdHJlYW0ucmVhZFVpbnQ2NCgpOwoJCQlyZWFkQnl0ZXMgKz0gODsKCQl9IGVsc2UgewoJCQl0aGlzLmJhc2VfZGF0YV9vZmZzZXQgPSAwOwoJCX0KCQlpZiAodGhpcy5zaXplIC0gdGhpcy5oZHJfc2l6ZSA+IHJlYWRCeXRlcyAmJiAodGhpcy5mbGFncyAmIEJveFBhcnNlci5URkhEX0ZMQUdfU0FNUExFX0RFU0MpKSB7CgkJCXRoaXMuZGVmYXVsdF9zYW1wbGVfZGVzY3JpcHRpb25faW5kZXggPSBzdHJlYW0ucmVhZFVpbnQzMigpOwoJCQlyZWFkQnl0ZXMgKz0gNDsKCQl9IGVsc2UgewoJCQl0aGlzLmRlZmF1bHRfc2FtcGxlX2Rlc2NyaXB0aW9uX2luZGV4ID0gMDsKCQl9CgkJaWYgKHRoaXMuc2l6ZSAtIHRoaXMuaGRyX3NpemUgPiByZWFkQnl0ZXMgJiYgKHRoaXMuZmxhZ3MgJiBCb3hQYXJzZXIuVEZIRF9GTEFHX1NBTVBMRV9EVVIpKSB7CgkJCXRoaXMuZGVmYXVsdF9zYW1wbGVfZHVyYXRpb24gPSBzdHJlYW0ucmVhZFVpbnQzMigpOwoJCQlyZWFkQnl0ZXMgKz0gNDsKCQl9IGVsc2UgewoJCQl0aGlzLmRlZmF1bHRfc2FtcGxlX2R1cmF0aW9uID0gMDsKCQl9CgkJaWYgKHRoaXMuc2l6ZSAtIHRoaXMuaGRyX3NpemUgPiByZWFkQnl0ZXMgJiYgKHRoaXMuZmxhZ3MgJiBCb3hQYXJzZXIuVEZIRF9GTEFHX1NBTVBMRV9TSVpFKSkgewoJCQl0aGlzLmRlZmF1bHRfc2FtcGxlX3NpemUgPSBzdHJlYW0ucmVhZFVpbnQzMigpOwoJCQlyZWFkQnl0ZXMgKz0gNDsKCQl9IGVsc2UgewoJCQl0aGlzLmRlZmF1bHRfc2FtcGxlX3NpemUgPSAwOwoJCX0KCQlpZiAodGhpcy5zaXplIC0gdGhpcy5oZHJfc2l6ZSA+IHJlYWRCeXRlcyAmJiAodGhpcy5mbGFncyAmIEJveFBhcnNlci5URkhEX0ZMQUdfU0FNUExFX0ZMQUdTKSkgewoJCQl0aGlzLmRlZmF1bHRfc2FtcGxlX2ZsYWdzID0gc3RyZWFtLnJlYWRVaW50MzIoKTsKCQkJcmVhZEJ5dGVzICs9IDQ7CgkJfSBlbHNlIHsKCQkJdGhpcy5kZWZhdWx0X3NhbXBsZV9mbGFncyA9IDA7CgkJfQoJfSk7CgoJLy8gZmlsZTpzcmMvcGFyc2luZy90ZnJhLmpzCglCb3hQYXJzZXIuY3JlYXRlRnVsbEJveEN0b3IoInRmcmEiLCBmdW5jdGlvbihzdHJlYW0pIHsKCQl0aGlzLnRyYWNrX0lEID0gc3RyZWFtLnJlYWRVaW50MzIoKTsKCQlzdHJlYW0ucmVhZFVpbnQyNCgpOwoJCXZhciB0bXBfYnl0ZSA9IHN0cmVhbS5yZWFkVWludDgoKTsKCQl0aGlzLmxlbmd0aF9zaXplX29mX3RyYWZfbnVtID0gKHRtcF9ieXRlID4+IDQpICYgMHgzOwoJCXRoaXMubGVuZ3RoX3NpemVfb2ZfdHJ1bl9udW0gPSAodG1wX2J5dGUgPj4gMikgJiAweDM7CgkJdGhpcy5sZW5ndGhfc2l6ZV9vZl9zYW1wbGVfbnVtID0gKHRtcF9ieXRlKSAmIDB4MzsKCQl0aGlzLmVudHJpZXMgPSBbXTsKCQl2YXIgbnVtYmVyX29mX2VudHJpZXMgPSBzdHJlYW0ucmVhZFVpbnQzMigpOwoJCWZvciAodmFyIGkgPSAwOyBpIDwgbnVtYmVyX29mX2VudHJpZXM7IGkrKykgewoJCQlpZiAodGhpcy52ZXJzaW9uID09PSAxKSB7CgkJCQl0aGlzLnRpbWUgPSBzdHJlYW0ucmVhZFVpbnQ2NCgpOwoJCQkJdGhpcy5tb29mX29mZnNldCA9IHN0cmVhbS5yZWFkVWludDY0KCk7CgkJCX0gZWxzZSB7CgkJCQl0aGlzLnRpbWUgPSBzdHJlYW0ucmVhZFVpbnQzMigpOwoJCQkJdGhpcy5tb29mX29mZnNldCA9IHN0cmVhbS5yZWFkVWludDMyKCk7CgkJCX0KCQkJdGhpcy50cmFmX251bWJlciA9IHN0cmVhbVsicmVhZFVpbnQiKyg4Kih0aGlzLmxlbmd0aF9zaXplX29mX3RyYWZfbnVtKzEpKV0oKTsKCQkJdGhpcy50cnVuX251bWJlciA9IHN0cmVhbVsicmVhZFVpbnQiKyg4Kih0aGlzLmxlbmd0aF9zaXplX29mX3RydW5fbnVtKzEpKV0oKTsKCQkJdGhpcy5zYW1wbGVfbnVtYmVyID0gc3RyZWFtWyJyZWFkVWludCIrKDgqKHRoaXMubGVuZ3RoX3NpemVfb2Zfc2FtcGxlX251bSsxKSldKCk7CgkJfQoJfSk7CgoJLy8gZmlsZTpzcmMvcGFyc2luZy90a2hkLmpzCglCb3hQYXJzZXIuY3JlYXRlRnVsbEJveEN0b3IoInRraGQiLCBmdW5jdGlvbihzdHJlYW0pIHsKCQlpZiAodGhpcy52ZXJzaW9uID09IDEpIHsKCQkJdGhpcy5jcmVhdGlvbl90aW1lID0gc3RyZWFtLnJlYWRVaW50NjQoKTsKCQkJdGhpcy5tb2RpZmljYXRpb25fdGltZSA9IHN0cmVhbS5yZWFkVWludDY0KCk7CgkJCXRoaXMudHJhY2tfaWQgPSBzdHJlYW0ucmVhZFVpbnQzMigpOwoJCQlzdHJlYW0ucmVhZFVpbnQzMigpOwoJCQl0aGlzLmR1cmF0aW9uID0gc3RyZWFtLnJlYWRVaW50NjQoKTsKCQl9IGVsc2UgewoJCQl0aGlzLmNyZWF0aW9uX3RpbWUgPSBzdHJlYW0ucmVhZFVpbnQzMigpOwoJCQl0aGlzLm1vZGlmaWNhdGlvbl90aW1lID0gc3RyZWFtLnJlYWRVaW50MzIoKTsKCQkJdGhpcy50cmFja19pZCA9IHN0cmVhbS5yZWFkVWludDMyKCk7CgkJCXN0cmVhbS5yZWFkVWludDMyKCk7CgkJCXRoaXMuZHVyYXRpb24gPSBzdHJlYW0ucmVhZFVpbnQzMigpOwoJCX0KCQlzdHJlYW0ucmVhZFVpbnQzMkFycmF5KDIpOwoJCXRoaXMubGF5ZXIgPSBzdHJlYW0ucmVhZEludDE2KCk7CgkJdGhpcy5hbHRlcm5hdGVfZ3JvdXAgPSBzdHJlYW0ucmVhZEludDE2KCk7CgkJdGhpcy52b2x1bWUgPSBzdHJlYW0ucmVhZEludDE2KCk+Pjg7CgkJc3RyZWFtLnJlYWRVaW50MTYoKTsKCQl0aGlzLm1hdHJpeCA9IHN0cmVhbS5yZWFkSW50MzJBcnJheSg5KTsKCQl0aGlzLndpZHRoID0gc3RyZWFtLnJlYWRVaW50MzIoKTsKCQl0aGlzLmhlaWdodCA9IHN0cmVhbS5yZWFkVWludDMyKCk7Cgl9KTsKCgkvLyBmaWxlOnNyYy9wYXJzaW5nL3RtYXguanMKCUJveFBhcnNlci5jcmVhdGVCb3hDdG9yKCJ0bWF4IiwgZnVuY3Rpb24oc3RyZWFtKSB7CgkJdGhpcy50aW1lID0gc3RyZWFtLnJlYWRVaW50MzIoKTsKCX0pOwoKCS8vIGZpbGU6c3JjL3BhcnNpbmcvdG1pbi5qcwoJQm94UGFyc2VyLmNyZWF0ZUJveEN0b3IoInRtaW4iLCBmdW5jdGlvbihzdHJlYW0pIHsKCQl0aGlzLnRpbWUgPSBzdHJlYW0ucmVhZFVpbnQzMigpOwoJfSk7CgoJLy8gZmlsZTpzcmMvcGFyc2luZy90b3RsLmpzCglCb3hQYXJzZXIuY3JlYXRlQm94Q3RvcigidG90bCIsZnVuY3Rpb24oc3RyZWFtKSB7CgkJdGhpcy5ieXRlc3NlbnQgPSBzdHJlYW0ucmVhZFVpbnQzMigpOwoJfSk7CgoJLy8gZmlsZTpzcmMvcGFyc2luZy90cGF5LmpzCglCb3hQYXJzZXIuY3JlYXRlQm94Q3RvcigidHBheSIsIGZ1bmN0aW9uKHN0cmVhbSkgewoJCXRoaXMuYnl0ZXNzZW50ID0gc3RyZWFtLnJlYWRVaW50MzIoKTsKCX0pOwoKCS8vIGZpbGU6c3JjL3BhcnNpbmcvdHB5bC5qcwoJQm94UGFyc2VyLmNyZWF0ZUJveEN0b3IoInRweWwiLCBmdW5jdGlvbihzdHJlYW0pIHsKCQl0aGlzLmJ5dGVzc2VudCA9IHN0cmVhbS5yZWFkVWludDY0KCk7Cgl9KTsKCgkvLyBmaWxlOnNyYy9wYXJzaW5nL1RyYWNrR3JvdXAuanMKCUJveFBhcnNlci5UcmFja0dyb3VwVHlwZUJveC5wcm90b3R5cGUucGFyc2UgPSBmdW5jdGlvbihzdHJlYW0pIHsKCQl0aGlzLnBhcnNlRnVsbEhlYWRlcihzdHJlYW0pOwoJCXRoaXMudHJhY2tfZ3JvdXBfaWQgPSBzdHJlYW0ucmVhZFVpbnQzMigpOwoJfTsKCgkvLyBmaWxlOnNyYy9wYXJzaW5nL3RyYWNrZ3JvdXBzL21zcmMuanMKCUJveFBhcnNlci5jcmVhdGVUcmFja0dyb3VwQ3RvcigibXNyYyIpOy8vIGZpbGU6c3JjL3BhcnNpbmcvVHJha1JlZmVyZW5jZS5qcwoJQm94UGFyc2VyLlRyYWNrUmVmZXJlbmNlVHlwZUJveCA9IGZ1bmN0aW9uKHR5cGUsIHNpemUsIGhkcl9zaXplLCBzdGFydCkgewoJCUJveFBhcnNlci5Cb3guY2FsbCh0aGlzLCB0eXBlLCBzaXplKTsKCQl0aGlzLmhkcl9zaXplID0gaGRyX3NpemU7CgkJdGhpcy5zdGFydCA9IHN0YXJ0OwoJfTsKCUJveFBhcnNlci5UcmFja1JlZmVyZW5jZVR5cGVCb3gucHJvdG90eXBlID0gbmV3IEJveFBhcnNlci5Cb3goKTsKCUJveFBhcnNlci5UcmFja1JlZmVyZW5jZVR5cGVCb3gucHJvdG90eXBlLnBhcnNlID0gZnVuY3Rpb24oc3RyZWFtKSB7CgkJdGhpcy50cmFja19pZHMgPSBzdHJlYW0ucmVhZFVpbnQzMkFycmF5KCh0aGlzLnNpemUtdGhpcy5oZHJfc2l6ZSkvNCk7Cgl9OwoKCS8vIGZpbGU6c3JjL3BhcnNpbmcvdHJlZi5qcwoJQm94UGFyc2VyLnRyZWZCb3gucHJvdG90eXBlLnBhcnNlID0gZnVuY3Rpb24oc3RyZWFtKSB7CgkJdmFyIHJldDsKCQl2YXIgYm94OwoJCXdoaWxlIChzdHJlYW0uZ2V0UG9zaXRpb24oKSA8IHRoaXMuc3RhcnQrdGhpcy5zaXplKSB7CgkJCXJldCA9IEJveFBhcnNlci5wYXJzZU9uZUJveChzdHJlYW0sIHRydWUsIHRoaXMuc2l6ZSAtIChzdHJlYW0uZ2V0UG9zaXRpb24oKSAtIHRoaXMuc3RhcnQpKTsKCQkJaWYgKHJldC5jb2RlID09PSBCb3hQYXJzZXIuT0spIHsKCQkJCWJveCA9IG5ldyBCb3hQYXJzZXIuVHJhY2tSZWZlcmVuY2VUeXBlQm94KHJldC50eXBlLCByZXQuc2l6ZSwgcmV0Lmhkcl9zaXplLCByZXQuc3RhcnQpOwoJCQkJaWYgKGJveC53cml0ZSA9PT0gQm94UGFyc2VyLkJveC5wcm90b3R5cGUud3JpdGUgJiYgYm94LnR5cGUgIT09ICJtZGF0IikgewoJCQkJCUxvZy5pbmZvKCJCb3hQYXJzZXIiLCAiVHJhY2tSZWZlcmVuY2UgIitib3gudHlwZSsiIGJveCB3cml0aW5nIG5vdCB5ZXQgaW1wbGVtZW50ZWQsIGtlZXBpbmcgdW5wYXJzZWQgZGF0YSBpbiBtZW1vcnkgZm9yIGxhdGVyIHdyaXRlIik7CgkJCQkJYm94LnBhcnNlRGF0YUFuZFJld2luZChzdHJlYW0pOwoJCQkJfQoJCQkJYm94LnBhcnNlKHN0cmVhbSk7CgkJCQl0aGlzLmJveGVzLnB1c2goYm94KTsKCQkJfSBlbHNlIHsKCQkJCXJldHVybjsKCQkJfQoJCX0KCX07CgoJLy8gZmlsZTpzcmMvcGFyc2luZy90cmVwLmpzCglCb3hQYXJzZXIuY3JlYXRlRnVsbEJveEN0b3IoInRyZXAiLCBmdW5jdGlvbihzdHJlYW0pIHsKCQl0aGlzLnRyYWNrX0lEID0gc3RyZWFtLnJlYWRVaW50MzIoKTsKCQl0aGlzLmJveGVzID0gW107CgkJd2hpbGUgKHN0cmVhbS5nZXRQb3NpdGlvbigpIDwgdGhpcy5zdGFydCt0aGlzLnNpemUpIHsKCQkJcmV0ID0gQm94UGFyc2VyLnBhcnNlT25lQm94KHN0cmVhbSwgZmFsc2UsIHRoaXMuc2l6ZSAtIChzdHJlYW0uZ2V0UG9zaXRpb24oKSAtIHRoaXMuc3RhcnQpKTsKCQkJaWYgKHJldC5jb2RlID09PSBCb3hQYXJzZXIuT0spIHsKCQkJCWJveCA9IHJldC5ib3g7CgkJCQl0aGlzLmJveGVzLnB1c2goYm94KTsKCQkJfSBlbHNlIHsKCQkJCXJldHVybjsKCQkJfQoJCX0KCX0pOwoKCS8vIGZpbGU6c3JjL3BhcnNpbmcvdHJleC5qcwoJQm94UGFyc2VyLmNyZWF0ZUZ1bGxCb3hDdG9yKCJ0cmV4IiwgZnVuY3Rpb24oc3RyZWFtKSB7CgkJdGhpcy50cmFja19pZCA9IHN0cmVhbS5yZWFkVWludDMyKCk7CgkJdGhpcy5kZWZhdWx0X3NhbXBsZV9kZXNjcmlwdGlvbl9pbmRleCA9IHN0cmVhbS5yZWFkVWludDMyKCk7CgkJdGhpcy5kZWZhdWx0X3NhbXBsZV9kdXJhdGlvbiA9IHN0cmVhbS5yZWFkVWludDMyKCk7CgkJdGhpcy5kZWZhdWx0X3NhbXBsZV9zaXplID0gc3RyZWFtLnJlYWRVaW50MzIoKTsKCQl0aGlzLmRlZmF1bHRfc2FtcGxlX2ZsYWdzID0gc3RyZWFtLnJlYWRVaW50MzIoKTsKCX0pOwoKCS8vIGZpbGU6c3JjL3BhcnNpbmcvdHJweS5qcwoJQm94UGFyc2VyLmNyZWF0ZUJveEN0b3IoInRycHkiLCBmdW5jdGlvbihzdHJlYW0pIHsKCQl0aGlzLmJ5dGVzc2VudCA9IHN0cmVhbS5yZWFkVWludDY0KCk7Cgl9KTsKCgkvLyBmaWxlOnNyYy9wYXJzaW5nL3RydW4uanMKCUJveFBhcnNlci5jcmVhdGVGdWxsQm94Q3RvcigidHJ1biIsIGZ1bmN0aW9uKHN0cmVhbSkgewoJCXZhciByZWFkQnl0ZXMgPSAwOwoJCXRoaXMuc2FtcGxlX2NvdW50ID0gc3RyZWFtLnJlYWRVaW50MzIoKTsKCQlyZWFkQnl0ZXMrPSA0OwoJCWlmICh0aGlzLnNpemUgLSB0aGlzLmhkcl9zaXplID4gcmVhZEJ5dGVzICYmICh0aGlzLmZsYWdzICYgQm94UGFyc2VyLlRSVU5fRkxBR1NfREFUQV9PRkZTRVQpICkgewoJCQl0aGlzLmRhdGFfb2Zmc2V0ID0gc3RyZWFtLnJlYWRJbnQzMigpOyAvL3NpZ25lZAoJCQlyZWFkQnl0ZXMgKz0gNDsKCQl9IGVsc2UgewoJCQl0aGlzLmRhdGFfb2Zmc2V0ID0gMDsKCQl9CgkJaWYgKHRoaXMuc2l6ZSAtIHRoaXMuaGRyX3NpemUgPiByZWFkQnl0ZXMgJiYgKHRoaXMuZmxhZ3MgJiBCb3hQYXJzZXIuVFJVTl9GTEFHU19GSVJTVF9GTEFHKSApIHsKCQkJdGhpcy5maXJzdF9zYW1wbGVfZmxhZ3MgPSBzdHJlYW0ucmVhZFVpbnQzMigpOwoJCQlyZWFkQnl0ZXMgKz0gNDsKCQl9IGVsc2UgewoJCQl0aGlzLmZpcnN0X3NhbXBsZV9mbGFncyA9IDA7CgkJfQoJCXRoaXMuc2FtcGxlX2R1cmF0aW9uID0gW107CgkJdGhpcy5zYW1wbGVfc2l6ZSA9IFtdOwoJCXRoaXMuc2FtcGxlX2ZsYWdzID0gW107CgkJdGhpcy5zYW1wbGVfY29tcG9zaXRpb25fdGltZV9vZmZzZXQgPSBbXTsKCQlpZiAodGhpcy5zaXplIC0gdGhpcy5oZHJfc2l6ZSA+IHJlYWRCeXRlcykgewoJCQlmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuc2FtcGxlX2NvdW50OyBpKyspIHsKCQkJCWlmICh0aGlzLmZsYWdzICYgQm94UGFyc2VyLlRSVU5fRkxBR1NfRFVSQVRJT04pIHsKCQkJCQl0aGlzLnNhbXBsZV9kdXJhdGlvbltpXSA9IHN0cmVhbS5yZWFkVWludDMyKCk7CgkJCQl9CgkJCQlpZiAodGhpcy5mbGFncyAmIEJveFBhcnNlci5UUlVOX0ZMQUdTX1NJWkUpIHsKCQkJCQl0aGlzLnNhbXBsZV9zaXplW2ldID0gc3RyZWFtLnJlYWRVaW50MzIoKTsKCQkJCX0KCQkJCWlmICh0aGlzLmZsYWdzICYgQm94UGFyc2VyLlRSVU5fRkxBR1NfRkxBR1MpIHsKCQkJCQl0aGlzLnNhbXBsZV9mbGFnc1tpXSA9IHN0cmVhbS5yZWFkVWludDMyKCk7CgkJCQl9CgkJCQlpZiAodGhpcy5mbGFncyAmIEJveFBhcnNlci5UUlVOX0ZMQUdTX0NUU19PRkZTRVQpIHsKCQkJCQlpZiAodGhpcy52ZXJzaW9uID09PSAwKSB7CgkJCQkJCXRoaXMuc2FtcGxlX2NvbXBvc2l0aW9uX3RpbWVfb2Zmc2V0W2ldID0gc3RyZWFtLnJlYWRVaW50MzIoKTsKCQkJCQl9IGVsc2UgewoJCQkJCQl0aGlzLnNhbXBsZV9jb21wb3NpdGlvbl90aW1lX29mZnNldFtpXSA9IHN0cmVhbS5yZWFkSW50MzIoKTsgLy9zaWduZWQKCQkJCQl9CgkJCQl9CgkJCX0KCQl9Cgl9KTsKCgkvLyBmaWxlOnNyYy9wYXJzaW5nL3RzZWwuanMKCUJveFBhcnNlci5jcmVhdGVGdWxsQm94Q3RvcigidHNlbCIsIGZ1bmN0aW9uKHN0cmVhbSkgewoJCXRoaXMuc3dpdGNoX2dyb3VwID0gc3RyZWFtLnJlYWRVaW50MzIoKTsKCQl2YXIgY291bnQgPSAodGhpcy5zaXplIC0gdGhpcy5oZHJfc2l6ZSAtIDQpLzQ7CgkJdGhpcy5hdHRyaWJ1dGVfbGlzdCA9IFtdOwoJCWZvciAodmFyIGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewoJCQl0aGlzLmF0dHJpYnV0ZV9saXN0W2ldID0gc3RyZWFtLnJlYWRVaW50MzIoKTsKCQl9Cgl9KTsKCgkvLyBmaWxlOnNyYy9wYXJzaW5nL3R4dEMuanMKCUJveFBhcnNlci5jcmVhdGVGdWxsQm94Q3RvcigidHh0QyIsIGZ1bmN0aW9uKHN0cmVhbSkgewoJCXRoaXMuY29uZmlnID0gc3RyZWFtLnJlYWRDU3RyaW5nKCk7Cgl9KTsKCgkvLyBmaWxlOnNyYy9wYXJzaW5nL3VybC5qcwoJQm94UGFyc2VyLmNyZWF0ZUZ1bGxCb3hDdG9yKCJ1cmwgIiwgZnVuY3Rpb24oc3RyZWFtKSB7CgkJaWYgKHRoaXMuZmxhZ3MgIT09IDB4MDAwMDAxKSB7CgkJCXRoaXMubG9jYXRpb24gPSBzdHJlYW0ucmVhZENTdHJpbmcoKTsKCQl9Cgl9KTsKCgkvLyBmaWxlOnNyYy9wYXJzaW5nL3Vybi5qcwoJQm94UGFyc2VyLmNyZWF0ZUZ1bGxCb3hDdG9yKCJ1cm4gIiwgZnVuY3Rpb24oc3RyZWFtKSB7CgkJdGhpcy5uYW1lID0gc3RyZWFtLnJlYWRDU3RyaW5nKCk7CgkJaWYgKHRoaXMuc2l6ZSAtIHRoaXMuaGRyX3NpemUgLSB0aGlzLm5hbWUubGVuZ3RoIC0gMSA+IDApIHsKCQkJdGhpcy5sb2NhdGlvbiA9IHN0cmVhbS5yZWFkQ1N0cmluZygpOwoJCX0KCX0pOwoKCS8vIGZpbGU6c3JjL3BhcnNpbmcvdXVpZC9waWZmL3BpZmZMc20uanMKCUJveFBhcnNlci5jcmVhdGVVVUlEQm94KCJhNWQ0MGIzMGU4MTQxMWRkYmEyZjA4MDAyMDBjOWE2NiIsIHRydWUsIGZhbHNlLCBmdW5jdGlvbihzdHJlYW0pIHsKCSAgICB0aGlzLkxpdmVTZXJ2ZXJNYW5pZmVzdCA9IHN0cmVhbS5yZWFkU3RyaW5nKHRoaXMuc2l6ZSAtIHRoaXMuaGRyX3NpemUpCgkgICAgICAgIC5yZXBsYWNlKC8mL2csICImYW1wOyIpCgkgICAgICAgIC5yZXBsYWNlKC88L2csICImbHQ7IikKCSAgICAgICAgLnJlcGxhY2UoLz4vZywgIiZndDsiKQoJICAgICAgICAucmVwbGFjZSgvIi9nLCAiJnF1b3Q7IikKCSAgICAgICAgLnJlcGxhY2UoLycvZywgIiYjMDM5OyIpOwoJfSk7Ly8gZmlsZTpzcmMvcGFyc2luZy91dWlkL3BpZmYvcGlmZlBzc2guanMKCUJveFBhcnNlci5jcmVhdGVVVUlEQm94KCJkMDhhNGYxODEwZjM0YTgyYjZjODMyZDhhYmExODNkMyIsIHRydWUsIGZhbHNlLCBmdW5jdGlvbihzdHJlYW0pIHsKCQl0aGlzLnN5c3RlbV9pZCA9IEJveFBhcnNlci5wYXJzZUhleDE2KHN0cmVhbSk7CgkJdmFyIGRhdGFzaXplID0gc3RyZWFtLnJlYWRVaW50MzIoKTsKCQlpZiAoZGF0YXNpemUgPiAwKSB7CgkJCXRoaXMuZGF0YSA9IHN0cmVhbS5yZWFkVWludDhBcnJheShkYXRhc2l6ZSk7CgkJfQoJfSk7CgoJLy8gZmlsZTpzcmMvcGFyc2luZy91dWlkL3BpZmYvcGlmZlNlbmMuanMKCUJveFBhcnNlci5jcmVhdGVVVUlEQm94KCJhMjM5NGY1MjVhOWI0ZjE0YTI0NDZjNDI3YzY0OGRmNCIsIHRydWUsIGZhbHNlIC8qLCBmdW5jdGlvbihzdHJlYW0pIHsKCQlpZiAodGhpcy5mbGFncyAmIDB4MSkgewoJCQl0aGlzLkFsZ29yaXRobUlEID0gc3RyZWFtLnJlYWRVaW50MjQoKTsKCQkJdGhpcy5JVl9zaXplID0gc3RyZWFtLnJlYWRVaW50OCgpOwoJCQl0aGlzLktJRCA9IEJveFBhcnNlci5wYXJzZUhleDE2KHN0cmVhbSk7CgkJfQoJCXZhciBzYW1wbGVfY291bnQgPSBzdHJlYW0ucmVhZFVpbnQzMigpOwoJCXRoaXMuc2FtcGxlcyA9IFtdOwoJCWZvciAodmFyIGkgPSAwOyBpIDwgc2FtcGxlX2NvdW50OyBpKyspIHsKCQkJdmFyIHNhbXBsZSA9IHt9OwoJCQlzYW1wbGUuSW5pdGlhbGl6YXRpb25WZWN0b3IgPSB0aGlzLnJlYWRVaW50OEFycmF5KHRoaXMuSVZfc2l6ZSo4KTsKCQkJaWYgKHRoaXMuZmxhZ3MgJiAweDIpIHsKCQkJCXNhbXBsZS5zdWJzYW1wbGVzID0gW107CgkJCQlzYW1wbGUuTnVtYmVyT2ZFbnRyaWVzID0gc3RyZWFtLnJlYWRVaW50MTYoKTsKCQkJCWZvciAodmFyIGogPSAwOyBqIDwgc2FtcGxlLk51bWJlck9mRW50cmllczsgaisrKSB7CgkJCQkJdmFyIHN1YnNhbXBsZSA9IHt9OwoJCQkJCXN1YnNhbXBsZS5CeXRlc09mQ2xlYXJEYXRhID0gc3RyZWFtLnJlYWRVaW50MTYoKTsKCQkJCQlzdWJzYW1wbGUuQnl0ZXNPZlByb3RlY3RlZERhdGEgPSBzdHJlYW0ucmVhZFVpbnQzMigpOwoJCQkJCXNhbXBsZS5zdWJzYW1wbGVzLnB1c2goc3Vic2FtcGxlKTsKCQkJCX0KCQkJfQoJCQl0aGlzLnNhbXBsZXMucHVzaChzYW1wbGUpOwoJCX0KCX0qLyk7CgkvLyBmaWxlOnNyYy9wYXJzaW5nL3V1aWQvcGlmZi9waWZmVGVuYy5qcwoJQm94UGFyc2VyLmNyZWF0ZVVVSURCb3goIjg5NzRkYmNlN2JlNzRjNTE4NGY5NzE0OGY5ODgyNTU0IiwgdHJ1ZSwgZmFsc2UsIGZ1bmN0aW9uKHN0cmVhbSkgewoJCXRoaXMuZGVmYXVsdF9BbGdvcml0aG1JRCA9IHN0cmVhbS5yZWFkVWludDI0KCk7CgkJdGhpcy5kZWZhdWx0X0lWX3NpemUgPSBzdHJlYW0ucmVhZFVpbnQ4KCk7CgkJdGhpcy5kZWZhdWx0X0tJRCA9IEJveFBhcnNlci5wYXJzZUhleDE2KHN0cmVhbSk7Cgl9KTsvLyBmaWxlOnNyYy9wYXJzaW5nL3V1aWQvcGlmZi9waWZmVGZyZi5qcwoJQm94UGFyc2VyLmNyZWF0ZVVVSURCb3goImQ0ODA3ZWYyY2EzOTQ2OTU4ZTU0MjZjYjllNDZhNzlmIiwgdHJ1ZSwgZmFsc2UsIGZ1bmN0aW9uKHN0cmVhbSkgewoJICAgIHRoaXMuZnJhZ21lbnRfY291bnQgPSBzdHJlYW0ucmVhZFVpbnQ4KCk7CgkgICAgdGhpcy5lbnRyaWVzID0gW107CgoJICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5mcmFnbWVudF9jb3VudDsgaSsrKSB7CgkgICAgICAgIHZhciBlbnRyeSA9IHt9OwoJICAgICAgICB2YXIgYWJzb2x1dGVfdGltZSA9IDA7CgkgICAgICAgIHZhciBhYnNvbHV0ZV9kdXJhdGlvbiA9IDA7CgoJICAgICAgICBpZiAodGhpcy52ZXJzaW9uID09PSAxKSB7CgkgICAgICAgICAgICBhYnNvbHV0ZV90aW1lID0gc3RyZWFtLnJlYWRVaW50NjQoKTsKCSAgICAgICAgICAgIGFic29sdXRlX2R1cmF0aW9uID0gc3RyZWFtLnJlYWRVaW50NjQoKTsKCSAgICAgICAgfSBlbHNlIHsKCSAgICAgICAgICAgIGFic29sdXRlX3RpbWUgPSBzdHJlYW0ucmVhZFVpbnQzMigpOwoJICAgICAgICAgICAgYWJzb2x1dGVfZHVyYXRpb24gPSBzdHJlYW0ucmVhZFVpbnQzMigpOwoJICAgICAgICB9CgoJICAgICAgICBlbnRyeS5hYnNvbHV0ZV90aW1lID0gYWJzb2x1dGVfdGltZTsKCSAgICAgICAgZW50cnkuYWJzb2x1dGVfZHVyYXRpb24gPSBhYnNvbHV0ZV9kdXJhdGlvbjsKCgkgICAgICAgIHRoaXMuZW50cmllcy5wdXNoKGVudHJ5KTsKCSAgICB9Cgl9KTsvLyBmaWxlOnNyYy9wYXJzaW5nL3V1aWQvcGlmZi9waWZmVGZ4ZC5qcwoJQm94UGFyc2VyLmNyZWF0ZVVVSURCb3goIjZkMWQ5YjA1NDJkNTQ0ZTY4MGUyMTQxZGFmZjc1N2IyIiwgdHJ1ZSwgZmFsc2UsIGZ1bmN0aW9uKHN0cmVhbSkgewoJICAgIGlmICh0aGlzLnZlcnNpb24gPT09IDEpIHsKCSAgICAgICB0aGlzLmFic29sdXRlX3RpbWUgPSBzdHJlYW0ucmVhZFVpbnQ2NCgpOwoJICAgICAgIHRoaXMuZHVyYXRpb24gPSBzdHJlYW0ucmVhZFVpbnQ2NCgpOwoJICAgIH0gZWxzZSB7CgkgICAgICAgdGhpcy5hYnNvbHV0ZV90aW1lID0gc3RyZWFtLnJlYWRVaW50MzIoKTsKCSAgICAgICB0aGlzLmR1cmF0aW9uID0gc3RyZWFtLnJlYWRVaW50MzIoKTsKCSAgICB9Cgl9KTsvLyBmaWxlOnNyYy9wYXJzaW5nL3ZtaGQuanMKCUJveFBhcnNlci5jcmVhdGVGdWxsQm94Q3Rvcigidm1oZCIsIGZ1bmN0aW9uKHN0cmVhbSkgewoJCXRoaXMuZ3JhcGhpY3Ntb2RlID0gc3RyZWFtLnJlYWRVaW50MTYoKTsKCQl0aGlzLm9wY29sb3IgPSBzdHJlYW0ucmVhZFVpbnQxNkFycmF5KDMpOwoJfSk7CgoJLy8gZmlsZTpzcmMvcGFyc2luZy92cGNDLmpzCglCb3hQYXJzZXIuY3JlYXRlRnVsbEJveEN0b3IoInZwY0MiLCBmdW5jdGlvbiAoc3RyZWFtKSB7CgkJdmFyIHRtcDsKCQlpZiAodGhpcy52ZXJzaW9uID09PSAxKSB7CgkJCXRoaXMucHJvZmlsZSA9IHN0cmVhbS5yZWFkVWludDgoKTsKCQkJdGhpcy5sZXZlbCA9IHN0cmVhbS5yZWFkVWludDgoKTsKCQkJdG1wID0gc3RyZWFtLnJlYWRVaW50OCgpOwoJCQl0aGlzLmJpdERlcHRoID0gdG1wID4+IDQ7CgkJCXRoaXMuY2hyb21hU3Vic2FtcGxpbmcgPSAodG1wID4+IDEpICYgMHg3OwoJCQl0aGlzLnZpZGVvRnVsbFJhbmdlRmxhZyA9IHRtcCAmIDB4MTsKCQkJdGhpcy5jb2xvdXJQcmltYXJpZXMgPSBzdHJlYW0ucmVhZFVpbnQ4KCk7CgkJCXRoaXMudHJhbnNmZXJDaGFyYWN0ZXJpc3RpY3MgPSBzdHJlYW0ucmVhZFVpbnQ4KCk7CgkJCXRoaXMubWF0cml4Q29lZmZpY2llbnRzID0gc3RyZWFtLnJlYWRVaW50OCgpOwoJCQl0aGlzLmNvZGVjSW50aWFsaXphdGlvbkRhdGFTaXplID0gc3RyZWFtLnJlYWRVaW50MTYoKTsKCQkJdGhpcy5jb2RlY0ludGlhbGl6YXRpb25EYXRhID0gc3RyZWFtLnJlYWRVaW50OEFycmF5KHRoaXMuY29kZWNJbnRpYWxpemF0aW9uRGF0YVNpemUpOwoJCX0gZWxzZSB7CgkJCXRoaXMucHJvZmlsZSA9IHN0cmVhbS5yZWFkVWludDgoKTsKCQkJdGhpcy5sZXZlbCA9IHN0cmVhbS5yZWFkVWludDgoKTsKCQkJdG1wID0gc3RyZWFtLnJlYWRVaW50OCgpOwoJCQl0aGlzLmJpdERlcHRoID0gKHRtcCA+PiA0KSAmIDB4RjsKCQkJdGhpcy5jb2xvclNwYWNlID0gdG1wICYgMHhGOwoJCQl0bXAgPSBzdHJlYW0ucmVhZFVpbnQ4KCk7CgkJCXRoaXMuY2hyb21hU3Vic2FtcGxpbmcgPSAodG1wID4+IDQpICYgMHhGOwoJCQl0aGlzLnRyYW5zZmVyRnVuY3Rpb24gPSAodG1wID4+IDEpICYgMHg3OwoJCQl0aGlzLnZpZGVvRnVsbFJhbmdlRmxhZyA9IHRtcCAmIDB4MTsKCQkJdGhpcy5jb2RlY0ludGlhbGl6YXRpb25EYXRhU2l6ZSA9IHN0cmVhbS5yZWFkVWludDE2KCk7CgkJCXRoaXMuY29kZWNJbnRpYWxpemF0aW9uRGF0YSA9IHN0cmVhbS5yZWFkVWludDhBcnJheSh0aGlzLmNvZGVjSW50aWFsaXphdGlvbkRhdGFTaXplKTsKCQl9Cgl9KTsvLyBmaWxlOnNyYy9wYXJzaW5nL3Z0dEMuanMKCUJveFBhcnNlci5jcmVhdGVCb3hDdG9yKCJ2dHRDIiwgZnVuY3Rpb24oc3RyZWFtKSB7CgkJdGhpcy50ZXh0ID0gc3RyZWFtLnJlYWRTdHJpbmcodGhpcy5zaXplIC0gdGhpcy5oZHJfc2l6ZSk7Cgl9KTsKCgkvLyBmaWxlOnNyYy9wYXJzaW5nL3Z2Y0MuanMKCUJveFBhcnNlci5jcmVhdGVGdWxsQm94Q3RvcigidnZjQyIsIGZ1bmN0aW9uIChzdHJlYW0pIHsKCSAgdmFyIGksIGo7CgoJICAvLyBoZWxwZXIgb2JqZWN0IHRvIHNpbXBsaWZ5IGV4dHJhY3RpbmcgaW5kaXZpZHVhbCBiaXRzCgkgIHZhciBiaXRSZWFkZXIgPSB7CgkgICAgaGVsZF9iaXRzOiB1bmRlZmluZWQsCgkgICAgbnVtX2hlbGRfYml0czogMCwKCgkgICAgc3RyZWFtX3JlYWRfMV9ieXRlczogZnVuY3Rpb24gKHN0cm0pIHsKCSAgICAgIHRoaXMuaGVsZF9iaXRzID0gc3RybS5yZWFkVWludDgoKTsKCSAgICAgIHRoaXMubnVtX2hlbGRfYml0cyA9IDEgKiA4OwoJICAgIH0sCgkgICAgc3RyZWFtX3JlYWRfMl9ieXRlczogZnVuY3Rpb24gKHN0cm0pIHsKCSAgICAgIHRoaXMuaGVsZF9iaXRzID0gc3RybS5yZWFkVWludDE2KCk7CgkgICAgICB0aGlzLm51bV9oZWxkX2JpdHMgPSAyICogODsKCSAgICB9LAoKCSAgICBleHRyYWN0X2JpdHM6IGZ1bmN0aW9uIChudW1fYml0cykgewoJICAgICAgdmFyIHJldCA9ICh0aGlzLmhlbGRfYml0cyA+PiAodGhpcy5udW1faGVsZF9iaXRzIC0gbnVtX2JpdHMpKSAmICgoMSA8PCBudW1fYml0cykgLSAxKTsKCSAgICAgIHRoaXMubnVtX2hlbGRfYml0cyAtPSBudW1fYml0czsKCSAgICAgIHJldHVybiByZXQ7CgkgICAgfQoJICB9OwoKCSAgLy8gVnZjRGVjb2RlckNvbmZpZ3VyYXRpb25SZWNvcmQKCSAgYml0UmVhZGVyLnN0cmVhbV9yZWFkXzFfYnl0ZXMoc3RyZWFtKTsKCSAgYml0UmVhZGVyLmV4dHJhY3RfYml0cyg1KTsgIC8vIHJlc2VydmVkCgkgIHRoaXMubGVuZ3RoU2l6ZU1pbnVzT25lID0gYml0UmVhZGVyLmV4dHJhY3RfYml0cygyKTsKCSAgdGhpcy5wdGxfcHJlc2VudF9mbGFnID0gYml0UmVhZGVyLmV4dHJhY3RfYml0cygxKTsKCgkgIGlmICh0aGlzLnB0bF9wcmVzZW50X2ZsYWcpIHsKCSAgICBiaXRSZWFkZXIuc3RyZWFtX3JlYWRfMl9ieXRlcyhzdHJlYW0pOwoJICAgIHRoaXMub2xzX2lkeCA9IGJpdFJlYWRlci5leHRyYWN0X2JpdHMoOSk7CgkgICAgdGhpcy5udW1fc3VibGF5ZXJzID0gYml0UmVhZGVyLmV4dHJhY3RfYml0cygzKTsKCSAgICB0aGlzLmNvbnN0YW50X2ZyYW1lX3JhdGUgPSBiaXRSZWFkZXIuZXh0cmFjdF9iaXRzKDIpOwoJICAgIHRoaXMuY2hyb21hX2Zvcm1hdF9pZGMgPSBiaXRSZWFkZXIuZXh0cmFjdF9iaXRzKDIpOwoKCSAgICBiaXRSZWFkZXIuc3RyZWFtX3JlYWRfMV9ieXRlcyhzdHJlYW0pOwoJICAgIHRoaXMuYml0X2RlcHRoX21pbnVzOCA9IGJpdFJlYWRlci5leHRyYWN0X2JpdHMoMyk7CgkgICAgYml0UmVhZGVyLmV4dHJhY3RfYml0cyg1KTsgIC8vIHJlc2VydmVkCgoJICAgIC8vIFZ2Y1BUTFJlY29yZAoJICAgIHsKCSAgICAgIGJpdFJlYWRlci5zdHJlYW1fcmVhZF8yX2J5dGVzKHN0cmVhbSk7CgkgICAgICBiaXRSZWFkZXIuZXh0cmFjdF9iaXRzKDIpOyAgLy8gcmVzZXJ2ZWQKCSAgICAgIHRoaXMubnVtX2J5dGVzX2NvbnN0cmFpbnRfaW5mbyA9IGJpdFJlYWRlci5leHRyYWN0X2JpdHMoNik7CgkgICAgICB0aGlzLmdlbmVyYWxfcHJvZmlsZV9pZGMgPSBiaXRSZWFkZXIuZXh0cmFjdF9iaXRzKDcpOwoJICAgICAgdGhpcy5nZW5lcmFsX3RpZXJfZmxhZyA9IGJpdFJlYWRlci5leHRyYWN0X2JpdHMoMSk7CgoJICAgICAgdGhpcy5nZW5lcmFsX2xldmVsX2lkYyA9IHN0cmVhbS5yZWFkVWludDgoKTsKCgkgICAgICBiaXRSZWFkZXIuc3RyZWFtX3JlYWRfMV9ieXRlcyhzdHJlYW0pOwoJICAgICAgdGhpcy5wdGxfZnJhbWVfb25seV9jb25zdHJhaW50X2ZsYWcgPSBiaXRSZWFkZXIuZXh0cmFjdF9iaXRzKDEpOwoJICAgICAgdGhpcy5wdGxfbXVsdGlsYXllcl9lbmFibGVkX2ZsYWcgPSBiaXRSZWFkZXIuZXh0cmFjdF9iaXRzKDEpOwoKCSAgICAgIHRoaXMuZ2VuZXJhbF9jb25zdHJhaW50X2luZm8gPSBuZXcgVWludDhBcnJheSh0aGlzLm51bV9ieXRlc19jb25zdHJhaW50X2luZm8pOwoJICAgICAgaWYgKHRoaXMubnVtX2J5dGVzX2NvbnN0cmFpbnRfaW5mbykgewoJICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdGhpcy5udW1fYnl0ZXNfY29uc3RyYWludF9pbmZvIC0gMTsgaSsrKSB7CgkgICAgICAgICAgdmFyIGNuc3RyMSA9IGJpdFJlYWRlci5leHRyYWN0X2JpdHMoNik7CgkgICAgICAgICAgYml0UmVhZGVyLnN0cmVhbV9yZWFkXzFfYnl0ZXMoc3RyZWFtKTsKCSAgICAgICAgICB2YXIgY25zdHIyID0gYml0UmVhZGVyLmV4dHJhY3RfYml0cygyKTsKCgkgICAgICAgICAgdGhpcy5nZW5lcmFsX2NvbnN0cmFpbnRfaW5mb1tpXSA9ICgoY25zdHIxIDw8IDIpIHwgY25zdHIyKTsKCSAgICAgICAgfQoJICAgICAgICB0aGlzLmdlbmVyYWxfY29uc3RyYWludF9pbmZvW3RoaXMubnVtX2J5dGVzX2NvbnN0cmFpbnRfaW5mbyAtIDFdID0gYml0UmVhZGVyLmV4dHJhY3RfYml0cyg2KTsKCSAgICAgIH0gZWxzZSB7CgkgICAgICAgIC8vZm9yYmlkZGVuIGluIHNwZWMhCgkgICAgICAgIGJpdFJlYWRlci5leHRyYWN0X2JpdHMoNik7CgkgICAgICB9CgoJICAgICAgYml0UmVhZGVyLnN0cmVhbV9yZWFkXzFfYnl0ZXMoc3RyZWFtKTsKCSAgICAgIHRoaXMucHRsX3N1YmxheWVyX3ByZXNlbnRfbWFzayA9IDA7CgkgICAgICBmb3IgKGogPSB0aGlzLm51bV9zdWJsYXllcnMgLSAyOyBqID49IDA7IC0taikgewoJICAgICAgICB2YXIgdmFsID0gYml0UmVhZGVyLmV4dHJhY3RfYml0cygxKTsKCSAgICAgICAgdGhpcy5wdGxfc3VibGF5ZXJfcHJlc2VudF9tYXNrIHw9IHZhbCA8PCBqOwoJICAgICAgfQoJICAgICAgZm9yIChqID0gdGhpcy5udW1fc3VibGF5ZXJzOyBqIDw9IDggJiYgdGhpcy5udW1fc3VibGF5ZXJzID4gMTsgKytqKSB7CgkgICAgICAgIGJpdFJlYWRlci5leHRyYWN0X2JpdHMoMSk7ICAvLyBwdGxfcmVzZXJ2ZWRfemVyb19iaXQKCSAgICAgIH0KCgkgICAgICBmb3IgKGogPSB0aGlzLm51bV9zdWJsYXllcnMgLSAyOyBqID49IDA7IC0taikgewoJICAgICAgICBpZiAodGhpcy5wdGxfc3VibGF5ZXJfcHJlc2VudF9tYXNrICYgKDEgPDwgaikpIHsKCSAgICAgICAgICB0aGlzLnN1YmxheWVyX2xldmVsX2lkY1tqXSA9IHN0cmVhbS5yZWFkVWludDgoKTsKCSAgICAgICAgfQoJICAgICAgfQoKCSAgICAgIHRoaXMucHRsX251bV9zdWJfcHJvZmlsZXMgPSBzdHJlYW0ucmVhZFVpbnQ4KCk7CgkgICAgICB0aGlzLmdlbmVyYWxfc3ViX3Byb2ZpbGVfaWRjID0gW107CgkgICAgICBpZiAodGhpcy5wdGxfbnVtX3N1Yl9wcm9maWxlcykgewoJICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdGhpcy5wdGxfbnVtX3N1Yl9wcm9maWxlczsgaSsrKSB7CgkgICAgICAgICAgdGhpcy5nZW5lcmFsX3N1Yl9wcm9maWxlX2lkYy5wdXNoKHN0cmVhbS5yZWFkVWludDMyKCkpOwoJICAgICAgICB9CgkgICAgICB9CgkgICAgfSAgLy8gZW5kIFZ2Y1BUTFJlY29yZAoKCSAgICB0aGlzLm1heF9waWN0dXJlX3dpZHRoID0gc3RyZWFtLnJlYWRVaW50MTYoKTsKCSAgICB0aGlzLm1heF9waWN0dXJlX2hlaWdodCA9IHN0cmVhbS5yZWFkVWludDE2KCk7CgkgICAgdGhpcy5hdmdfZnJhbWVfcmF0ZSA9IHN0cmVhbS5yZWFkVWludDE2KCk7CgkgIH0KCgkgIHZhciBWVkNfTkFMVV9PUEkgPSAxMjsKCSAgdmFyIFZWQ19OQUxVX0RFQ19QQVJBTSA9IDEzOwoKCSAgdGhpcy5uYWx1X2FycmF5cyA9IFtdOwoJICB2YXIgbnVtX29mX2FycmF5cyA9IHN0cmVhbS5yZWFkVWludDgoKTsKCSAgZm9yIChpID0gMDsgaSA8IG51bV9vZl9hcnJheXM7IGkrKykgewoJICAgIHZhciBuYWx1X2FycmF5ID0gW107CgkgICAgdGhpcy5uYWx1X2FycmF5cy5wdXNoKG5hbHVfYXJyYXkpOwoKCSAgICBiaXRSZWFkZXIuc3RyZWFtX3JlYWRfMV9ieXRlcyhzdHJlYW0pOwoJICAgIG5hbHVfYXJyYXkuY29tcGxldGVuZXNzID0gYml0UmVhZGVyLmV4dHJhY3RfYml0cygxKTsKCSAgICBiaXRSZWFkZXIuZXh0cmFjdF9iaXRzKDIpOyAgLy8gcmVzZXJ2ZWQKCSAgICBuYWx1X2FycmF5Lm5hbHVfdHlwZSA9IGJpdFJlYWRlci5leHRyYWN0X2JpdHMoNSk7CgoJICAgIHZhciBudW1OYWx1cyA9IDE7CgkgICAgaWYgKG5hbHVfYXJyYXkubmFsdV90eXBlICE9IFZWQ19OQUxVX0RFQ19QQVJBTSAmJiBuYWx1X2FycmF5Lm5hbHVfdHlwZSAhPSBWVkNfTkFMVV9PUEkpIHsKCSAgICAgIG51bU5hbHVzID0gc3RyZWFtLnJlYWRVaW50MTYoKTsKCSAgICB9CgoJICAgIGZvciAoaiA9IDA7IGogPCBudW1OYWx1czsgaisrKSB7CgkgICAgICB2YXIgbGVuID0gc3RyZWFtLnJlYWRVaW50MTYoKTsKCSAgICAgIG5hbHVfYXJyYXkucHVzaCh7CgkgICAgICAgIGRhdGE6IHN0cmVhbS5yZWFkVWludDhBcnJheShsZW4pLAoJICAgICAgICBsZW5ndGg6IGxlbgoJICAgICAgfSk7CgkgICAgfQoJICB9Cgl9KTsKCS8vIGZpbGU6c3JjL3BhcnNpbmcvdnZuQy5qcwoJQm94UGFyc2VyLmNyZWF0ZUZ1bGxCb3hDdG9yKCJ2dm5DIiwgZnVuY3Rpb24gKHN0cmVhbSkgewoJICAvLyBWdmNOQUxVQ29uZmlnQm94CgkgIHZhciB0bXAgPSBzdHJtLnJlYWRVaW50OCgpOwoJICB0aGlzLmxlbmd0aFNpemVNaW51c09uZSA9ICh0bXAgJiAweDMpOwoJfSk7CgkvLyBmaWxlOnNyYy9ib3gtY29kZWNzLmpzCglCb3hQYXJzZXIuU2FtcGxlRW50cnkucHJvdG90eXBlLmlzVmlkZW8gPSBmdW5jdGlvbigpIHsKCQlyZXR1cm4gZmFsc2U7Cgl9OwoKCUJveFBhcnNlci5TYW1wbGVFbnRyeS5wcm90b3R5cGUuaXNBdWRpbyA9IGZ1bmN0aW9uKCkgewoJCXJldHVybiBmYWxzZTsKCX07CgoJQm94UGFyc2VyLlNhbXBsZUVudHJ5LnByb3RvdHlwZS5pc1N1YnRpdGxlID0gZnVuY3Rpb24oKSB7CgkJcmV0dXJuIGZhbHNlOwoJfTsKCglCb3hQYXJzZXIuU2FtcGxlRW50cnkucHJvdG90eXBlLmlzTWV0YWRhdGEgPSBmdW5jdGlvbigpIHsKCQlyZXR1cm4gZmFsc2U7Cgl9OwoKCUJveFBhcnNlci5TYW1wbGVFbnRyeS5wcm90b3R5cGUuaXNIaW50ID0gZnVuY3Rpb24oKSB7CgkJcmV0dXJuIGZhbHNlOwoJfTsKCglCb3hQYXJzZXIuU2FtcGxlRW50cnkucHJvdG90eXBlLmdldENvZGVjID0gZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRoaXMudHlwZS5yZXBsYWNlKCcuJywnJyk7Cgl9OwoKCUJveFBhcnNlci5TYW1wbGVFbnRyeS5wcm90b3R5cGUuZ2V0V2lkdGggPSBmdW5jdGlvbigpIHsKCQlyZXR1cm4gIiI7Cgl9OwoKCUJveFBhcnNlci5TYW1wbGVFbnRyeS5wcm90b3R5cGUuZ2V0SGVpZ2h0ID0gZnVuY3Rpb24oKSB7CgkJcmV0dXJuICIiOwoJfTsKCglCb3hQYXJzZXIuU2FtcGxlRW50cnkucHJvdG90eXBlLmdldENoYW5uZWxDb3VudCA9IGZ1bmN0aW9uKCkgewoJCXJldHVybiAiIjsKCX07CgoJQm94UGFyc2VyLlNhbXBsZUVudHJ5LnByb3RvdHlwZS5nZXRTYW1wbGVSYXRlID0gZnVuY3Rpb24oKSB7CgkJcmV0dXJuICIiOwoJfTsKCglCb3hQYXJzZXIuU2FtcGxlRW50cnkucHJvdG90eXBlLmdldFNhbXBsZVNpemUgPSBmdW5jdGlvbigpIHsKCQlyZXR1cm4gIiI7Cgl9OwoKCUJveFBhcnNlci5WaXN1YWxTYW1wbGVFbnRyeS5wcm90b3R5cGUuaXNWaWRlbyA9IGZ1bmN0aW9uKCkgewoJCXJldHVybiB0cnVlOwoJfTsKCglCb3hQYXJzZXIuVmlzdWFsU2FtcGxlRW50cnkucHJvdG90eXBlLmdldFdpZHRoID0gZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRoaXMud2lkdGg7Cgl9OwoKCUJveFBhcnNlci5WaXN1YWxTYW1wbGVFbnRyeS5wcm90b3R5cGUuZ2V0SGVpZ2h0ID0gZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRoaXMuaGVpZ2h0OwoJfTsKCglCb3hQYXJzZXIuQXVkaW9TYW1wbGVFbnRyeS5wcm90b3R5cGUuaXNBdWRpbyA9IGZ1bmN0aW9uKCkgewoJCXJldHVybiB0cnVlOwoJfTsKCglCb3hQYXJzZXIuQXVkaW9TYW1wbGVFbnRyeS5wcm90b3R5cGUuZ2V0Q2hhbm5lbENvdW50ID0gZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRoaXMuY2hhbm5lbF9jb3VudDsKCX07CgoJQm94UGFyc2VyLkF1ZGlvU2FtcGxlRW50cnkucHJvdG90eXBlLmdldFNhbXBsZVJhdGUgPSBmdW5jdGlvbigpIHsKCQlyZXR1cm4gdGhpcy5zYW1wbGVyYXRlOwoJfTsKCglCb3hQYXJzZXIuQXVkaW9TYW1wbGVFbnRyeS5wcm90b3R5cGUuZ2V0U2FtcGxlU2l6ZSA9IGZ1bmN0aW9uKCkgewoJCXJldHVybiB0aGlzLnNhbXBsZXNpemU7Cgl9OwoKCUJveFBhcnNlci5TdWJ0aXRsZVNhbXBsZUVudHJ5LnByb3RvdHlwZS5pc1N1YnRpdGxlID0gZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRydWU7Cgl9OwoKCUJveFBhcnNlci5NZXRhZGF0YVNhbXBsZUVudHJ5LnByb3RvdHlwZS5pc01ldGFkYXRhID0gZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRydWU7Cgl9OwoKCglCb3hQYXJzZXIuZGVjaW1hbFRvSGV4ID0gZnVuY3Rpb24oZCwgcGFkZGluZykgewoJCXZhciBoZXggPSBOdW1iZXIoZCkudG9TdHJpbmcoMTYpOwoJCXBhZGRpbmcgPSB0eXBlb2YgKHBhZGRpbmcpID09PSAidW5kZWZpbmVkIiB8fCBwYWRkaW5nID09PSBudWxsID8gcGFkZGluZyA9IDIgOiBwYWRkaW5nOwoJCXdoaWxlIChoZXgubGVuZ3RoIDwgcGFkZGluZykgewoJCQloZXggPSAiMCIgKyBoZXg7CgkJfQoJCXJldHVybiBoZXg7Cgl9OwoKCUJveFBhcnNlci5hdmMxU2FtcGxlRW50cnkucHJvdG90eXBlLmdldENvZGVjID0KCUJveFBhcnNlci5hdmMyU2FtcGxlRW50cnkucHJvdG90eXBlLmdldENvZGVjID0KCUJveFBhcnNlci5hdmMzU2FtcGxlRW50cnkucHJvdG90eXBlLmdldENvZGVjID0KCUJveFBhcnNlci5hdmM0U2FtcGxlRW50cnkucHJvdG90eXBlLmdldENvZGVjID0gZnVuY3Rpb24oKSB7CgkJdmFyIGJhc2VDb2RlYyA9IEJveFBhcnNlci5TYW1wbGVFbnRyeS5wcm90b3R5cGUuZ2V0Q29kZWMuY2FsbCh0aGlzKTsKCQlpZiAodGhpcy5hdmNDKSB7CgkJCXJldHVybiBiYXNlQ29kZWMrIi4iK0JveFBhcnNlci5kZWNpbWFsVG9IZXgodGhpcy5hdmNDLkFWQ1Byb2ZpbGVJbmRpY2F0aW9uKSsKCQkJCQkJCSAgIiIrQm94UGFyc2VyLmRlY2ltYWxUb0hleCh0aGlzLmF2Y0MucHJvZmlsZV9jb21wYXRpYmlsaXR5KSsKCQkJCQkJCSAgIiIrQm94UGFyc2VyLmRlY2ltYWxUb0hleCh0aGlzLmF2Y0MuQVZDTGV2ZWxJbmRpY2F0aW9uKTsKCQl9IGVsc2UgewoJCQlyZXR1cm4gYmFzZUNvZGVjOwoJCX0KCX07CgoJQm94UGFyc2VyLmhldjFTYW1wbGVFbnRyeS5wcm90b3R5cGUuZ2V0Q29kZWMgPQoJQm94UGFyc2VyLmh2YzFTYW1wbGVFbnRyeS5wcm90b3R5cGUuZ2V0Q29kZWMgPSBmdW5jdGlvbigpIHsKCQl2YXIgaTsKCQl2YXIgYmFzZUNvZGVjID0gQm94UGFyc2VyLlNhbXBsZUVudHJ5LnByb3RvdHlwZS5nZXRDb2RlYy5jYWxsKHRoaXMpOwoJCWlmICh0aGlzLmh2Y0MpIHsKCQkJYmFzZUNvZGVjICs9ICcuJzsKCQkJc3dpdGNoICh0aGlzLmh2Y0MuZ2VuZXJhbF9wcm9maWxlX3NwYWNlKSB7CgkJCQljYXNlIDA6CgkJCQkJYmFzZUNvZGVjICs9ICcnOwoJCQkJCWJyZWFrOwoJCQkJY2FzZSAxOgoJCQkJCWJhc2VDb2RlYyArPSAnQSc7CgkJCQkJYnJlYWs7CgkJCQljYXNlIDI6CgkJCQkJYmFzZUNvZGVjICs9ICdCJzsKCQkJCQlicmVhazsKCQkJCWNhc2UgMzoKCQkJCQliYXNlQ29kZWMgKz0gJ0MnOwoJCQkJCWJyZWFrOwoJCQl9CgkJCWJhc2VDb2RlYyArPSB0aGlzLmh2Y0MuZ2VuZXJhbF9wcm9maWxlX2lkYzsKCQkJYmFzZUNvZGVjICs9ICcuJzsKCQkJdmFyIHZhbCA9IHRoaXMuaHZjQy5nZW5lcmFsX3Byb2ZpbGVfY29tcGF0aWJpbGl0eTsKCQkJdmFyIHJldmVyc2VkID0gMDsKCQkJZm9yIChpPTA7IGk8MzI7IGkrKykgewoJCQkJcmV2ZXJzZWQgfD0gdmFsICYgMTsKCQkJCWlmIChpPT0zMSkgYnJlYWs7CgkJCQlyZXZlcnNlZCA8PD0gMTsKCQkJCXZhbCA+Pj0xOwoJCQl9CgkJCWJhc2VDb2RlYyArPSBCb3hQYXJzZXIuZGVjaW1hbFRvSGV4KHJldmVyc2VkLCAwKTsKCQkJYmFzZUNvZGVjICs9ICcuJzsKCQkJaWYgKHRoaXMuaHZjQy5nZW5lcmFsX3RpZXJfZmxhZyA9PT0gMCkgewoJCQkJYmFzZUNvZGVjICs9ICdMJzsKCQkJfSBlbHNlIHsKCQkJCWJhc2VDb2RlYyArPSAnSCc7CgkJCX0KCQkJYmFzZUNvZGVjICs9IHRoaXMuaHZjQy5nZW5lcmFsX2xldmVsX2lkYzsKCQkJdmFyIGhhc0J5dGUgPSBmYWxzZTsKCQkJdmFyIGNvbnN0cmFpbnRfc3RyaW5nID0gIiI7CgkJCWZvciAoaSA9IDU7IGkgPj0gMDsgaS0tKSB7CgkJCQlpZiAodGhpcy5odmNDLmdlbmVyYWxfY29uc3RyYWludF9pbmRpY2F0b3JbaV0gfHwgaGFzQnl0ZSkgewoJCQkJCWNvbnN0cmFpbnRfc3RyaW5nID0gIi4iK0JveFBhcnNlci5kZWNpbWFsVG9IZXgodGhpcy5odmNDLmdlbmVyYWxfY29uc3RyYWludF9pbmRpY2F0b3JbaV0sIDApK2NvbnN0cmFpbnRfc3RyaW5nOwoJCQkJCWhhc0J5dGUgPSB0cnVlOwoJCQkJfQoJCQl9CgkJCWJhc2VDb2RlYyArPSBjb25zdHJhaW50X3N0cmluZzsKCQl9CgkJcmV0dXJuIGJhc2VDb2RlYzsKCX07CgoJQm94UGFyc2VyLnZ2YzFTYW1wbGVFbnRyeS5wcm90b3R5cGUuZ2V0Q29kZWMgPQoJQm94UGFyc2VyLnZ2aTFTYW1wbGVFbnRyeS5wcm90b3R5cGUuZ2V0Q29kZWMgPSBmdW5jdGlvbiAoKSB7CgkJdmFyIGk7CgkJdmFyIGJhc2VDb2RlYyA9IEJveFBhcnNlci5TYW1wbGVFbnRyeS5wcm90b3R5cGUuZ2V0Q29kZWMuY2FsbCh0aGlzKTsKCQlpZiAodGhpcy52dmNDKSB7CgkJCWJhc2VDb2RlYyArPSAnLicgKyB0aGlzLnZ2Y0MuZ2VuZXJhbF9wcm9maWxlX2lkYzsKCQkJaWYgKHRoaXMudnZjQy5nZW5lcmFsX3RpZXJfZmxhZykgewoJCQkJYmFzZUNvZGVjICs9ICcuSCc7CgkJCX0gZWxzZSB7CgkJCQliYXNlQ29kZWMgKz0gJy5MJzsKCQkJfQoJCQliYXNlQ29kZWMgKz0gdGhpcy52dmNDLmdlbmVyYWxfbGV2ZWxfaWRjOwoKCQkJdmFyIGNvbnN0cmFpbnRfc3RyaW5nID0gIiI7CgkJCWlmICh0aGlzLnZ2Y0MuZ2VuZXJhbF9jb25zdHJhaW50X2luZm8pIHsKCQkJCXZhciBieXRlcyA9IFtdOwoJCQkJdmFyIGJ5dGUgPSAwOwoJCQkJYnl0ZSB8PSB0aGlzLnZ2Y0MucHRsX2ZyYW1lX29ubHlfY29uc3RyYWludCA8PCA3OwoJCQkJYnl0ZSB8PSB0aGlzLnZ2Y0MucHRsX211bHRpbGF5ZXJfZW5hYmxlZCA8PCA2OwoJCQkJdmFyIGxhc3Rfbm9uemVybzsKCQkJCWZvciAoaSA9IDA7IGkgPCB0aGlzLnZ2Y0MuZ2VuZXJhbF9jb25zdHJhaW50X2luZm8ubGVuZ3RoOyArK2kpIHsKCQkJCQlieXRlIHw9ICh0aGlzLnZ2Y0MuZ2VuZXJhbF9jb25zdHJhaW50X2luZm9baV0gPj4gMikgJiAweDNmOwoJCQkJCWJ5dGVzLnB1c2goYnl0ZSk7CgkJCQkJaWYgKGJ5dGUpIHsKCQkJCQkJbGFzdF9ub256ZXJvID0gaTsKCQkJCQl9CgoJCQkJCWJ5dGUgPSAodGhpcy52dmNDLmdlbmVyYWxfY29uc3RyYWludF9pbmZvW2ldID4+IDIpICYgMHgwMzsKCQkJCX0KCgkJCQlpZiAobGFzdF9ub256ZXJvID09PSB1bmRlZmluZWQpIHsKCQkJCQljb25zdHJhaW50X3N0cmluZyA9ICIuQ0EiOwoJCQkJfQoJCQkJZWxzZSB7CgkJCQkJY29uc3RyYWludF9zdHJpbmcgPSAiLkMiOwoJCQkJCXZhciBiYXNlMzJfY2hhcnMgPSAiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVoyMzQ1NjciOwoJCQkJCXZhciBoZWxkX2JpdHMgPSAwOwoJCQkJCXZhciBudW1faGVsZF9iaXRzID0gMDsKCQkJCQlmb3IgKGkgPSAwOyBpIDw9IGxhc3Rfbm9uemVybzsgKytpKSB7CgkJCQkJCWhlbGRfYml0cyA9IChoZWxkX2JpdHMgPDwgOCkgfCBieXRlc1tpXTsKCQkJCQkJbnVtX2hlbGRfYml0cyArPSA4OwoKCQkJCQkJd2hpbGUgKG51bV9oZWxkX2JpdHMgPj0gNSkgewoJCQkJCQkJdmFyIHZhbCA9IChoZWxkX2JpdHMgPj4gKG51bV9oZWxkX2JpdHMgLSA1KSkgJiAweDFmOwoJCQkJCQkJY29uc3RyYWludF9zdHJpbmcgKz0gYmFzZTMyX2NoYXJzW3ZhbF07CgoJCQkJCQkJbnVtX2hlbGRfYml0cyAtPSA1OwoJCQkJCQkJaGVsZF9iaXRzICY9ICgxIDw8IG51bV9oZWxkX2JpdHMpIC0gMTsKCQkJCQkJfQoJCQkJCX0KCQkJCQlpZiAobnVtX2hlbGRfYml0cykgewoJCQkJCQloZWxkX2JpdHMgPDw9ICg1IC0gbnVtX2hlbGRfYml0cyk7ICAvLyByaWdodC1wYWQgd2l0aCB6ZXJvcyB0byA1IGJpdHMgKGlzIHRoaXMgY29ycmVjdD8pCgkJCQkJCWNvbnN0cmFpbnRfc3RyaW5nICs9IGJhc2UzMl9jaGFyc1toZWxkX2JpdHMgJiAweDFmXTsKCQkJCQl9CgkJCQl9CgkJCX0KCQkJYmFzZUNvZGVjICs9IGNvbnN0cmFpbnRfc3RyaW5nOwoJCX0KCQlyZXR1cm4gYmFzZUNvZGVjOwoJfTsKCglCb3hQYXJzZXIubXA0YVNhbXBsZUVudHJ5LnByb3RvdHlwZS5nZXRDb2RlYyA9IGZ1bmN0aW9uKCkgewoJCXZhciBiYXNlQ29kZWMgPSBCb3hQYXJzZXIuU2FtcGxlRW50cnkucHJvdG90eXBlLmdldENvZGVjLmNhbGwodGhpcyk7CgkJaWYgKHRoaXMuZXNkcyAmJiB0aGlzLmVzZHMuZXNkKSB7CgkJCXZhciBvdGkgPSB0aGlzLmVzZHMuZXNkLmdldE9USSgpOwoJCQl2YXIgZHNpID0gdGhpcy5lc2RzLmVzZC5nZXRBdWRpb0NvbmZpZygpOwoJCQlyZXR1cm4gYmFzZUNvZGVjKyIuIitCb3hQYXJzZXIuZGVjaW1hbFRvSGV4KG90aSkrKGRzaSA/ICIuIitkc2k6ICIiKTsKCQl9IGVsc2UgewoJCQlyZXR1cm4gYmFzZUNvZGVjOwoJCX0KCX07CgoJQm94UGFyc2VyLnN0eHRTYW1wbGVFbnRyeS5wcm90b3R5cGUuZ2V0Q29kZWMgPSBmdW5jdGlvbigpIHsKCQl2YXIgYmFzZUNvZGVjID0gQm94UGFyc2VyLlNhbXBsZUVudHJ5LnByb3RvdHlwZS5nZXRDb2RlYy5jYWxsKHRoaXMpOwoJCWlmKHRoaXMubWltZV9mb3JtYXQpIHsKCQkJcmV0dXJuIGJhc2VDb2RlYyArICIuIiArIHRoaXMubWltZV9mb3JtYXQ7CgkJfSBlbHNlIHsKCQkJcmV0dXJuIGJhc2VDb2RlYwoJCX0KCX07CgoJQm94UGFyc2VyLnZwMDhTYW1wbGVFbnRyeS5wcm90b3R5cGUuZ2V0Q29kZWMgPQoJQm94UGFyc2VyLnZwMDlTYW1wbGVFbnRyeS5wcm90b3R5cGUuZ2V0Q29kZWMgPSBmdW5jdGlvbigpIHsKCQl2YXIgYmFzZUNvZGVjID0gQm94UGFyc2VyLlNhbXBsZUVudHJ5LnByb3RvdHlwZS5nZXRDb2RlYy5jYWxsKHRoaXMpOwoJCXZhciBsZXZlbCA9IHRoaXMudnBjQy5sZXZlbDsKCQlpZiAobGV2ZWwgPT0gMCkgewoJCQlsZXZlbCA9ICIwMCI7CgkJfQoJCXZhciBiaXREZXB0aCA9IHRoaXMudnBjQy5iaXREZXB0aDsKCQlpZiAoYml0RGVwdGggPT0gOCkgewoJCQliaXREZXB0aCA9ICIwOCI7CgkJfQoJCXJldHVybiBiYXNlQ29kZWMgKyAiLjAiICsgdGhpcy52cGNDLnByb2ZpbGUgKyAiLiIgKyBsZXZlbCArICIuIiArIGJpdERlcHRoOwoJfTsKCglCb3hQYXJzZXIuYXYwMVNhbXBsZUVudHJ5LnByb3RvdHlwZS5nZXRDb2RlYyA9IGZ1bmN0aW9uKCkgewoJCXZhciBiYXNlQ29kZWMgPSBCb3hQYXJzZXIuU2FtcGxlRW50cnkucHJvdG90eXBlLmdldENvZGVjLmNhbGwodGhpcyk7CgkJdmFyIGxldmVsID0gdGhpcy5hdjFDLnNlcV9sZXZlbF9pZHhfMDsKCQlpZiAobGV2ZWwgPCAxMCkgewoJCQlsZXZlbCA9ICIwIiArIGxldmVsOwoJCX0KCQl2YXIgYml0ZGVwdGg7CgkJaWYgKHRoaXMuYXYxQy5zZXFfcHJvZmlsZSA9PT0gMiAmJiB0aGlzLmF2MUMuaGlnaF9iaXRkZXB0aCA9PT0gMSkgewoJCQliaXRkZXB0aCA9ICh0aGlzLmF2MUMudHdlbHZlX2JpdCA9PT0gMSkgPyAiMTIiIDogIjEwIjsKCQl9IGVsc2UgaWYgKCB0aGlzLmF2MUMuc2VxX3Byb2ZpbGUgPD0gMiApIHsKCQkJYml0ZGVwdGggPSAodGhpcy5hdjFDLmhpZ2hfYml0ZGVwdGggPT09IDEpID8gIjEwIiA6ICIwOCI7CgkJfQoJCS8vIFRPRE8gbmVlZCB0byBwYXJzZSB0aGUgU0ggdG8gZmluZCBjb2xvciBjb25maWcKCQlyZXR1cm4gYmFzZUNvZGVjKyIuIit0aGlzLmF2MUMuc2VxX3Byb2ZpbGUrIi4iK2xldmVsKyh0aGlzLmF2MUMuc2VxX3RpZXJfMD8iSCI6Ik0iKSsiLiIrYml0ZGVwdGg7Ly8rIi4iK3RoaXMuYXYxQy5tb25vY2hyb21lKyIuIit0aGlzLmF2MUMuY2hyb21hX3N1YnNhbXBsaW5nX3grIiIrdGhpcy5hdjFDLmNocm9tYV9zdWJzYW1wbGluZ195KyIiK3RoaXMuYXYxQy5jaHJvbWFfc2FtcGxlX3Bvc2l0aW9uOwoJfTsKCS8vIGZpbGU6c3JjL2JveC13cml0ZS5qcwoJLyogCgkgKiBDb3B5cmlnaHQgKGMpIFRlbGVjb20gUGFyaXNUZWNoL1RTSS9NTS9HUEFDIEN5cmlsIENvbmNvbGF0bwoJICogTGljZW5zZTogQlNELTMtQ2xhdXNlIChzZWUgTElDRU5TRSBmaWxlKQoJICovCglCb3hQYXJzZXIuQm94LnByb3RvdHlwZS53cml0ZUhlYWRlciA9IGZ1bmN0aW9uKHN0cmVhbSwgbXNnKSB7CgkJdGhpcy5zaXplICs9IDg7CgkJaWYgKHRoaXMuc2l6ZSA+IE1BWF9TSVpFKSB7CgkJCXRoaXMuc2l6ZSArPSA4OwoJCX0KCQlpZiAodGhpcy50eXBlID09PSAidXVpZCIpIHsKCQkJdGhpcy5zaXplICs9IDE2OwoJCX0KCQlMb2cuZGVidWcoIkJveFdyaXRlciIsICJXcml0aW5nIGJveCAiK3RoaXMudHlwZSsiIG9mIHNpemU6ICIrdGhpcy5zaXplKyIgYXQgcG9zaXRpb24gIitzdHJlYW0uZ2V0UG9zaXRpb24oKSsobXNnIHx8ICIiKSk7CgkJaWYgKHRoaXMuc2l6ZSA+IE1BWF9TSVpFKSB7CgkJCXN0cmVhbS53cml0ZVVpbnQzMigxKTsKCQl9IGVsc2UgewoJCQl0aGlzLnNpemVQb3NpdGlvbiA9IHN0cmVhbS5nZXRQb3NpdGlvbigpOwoJCQlzdHJlYW0ud3JpdGVVaW50MzIodGhpcy5zaXplKTsKCQl9CgkJc3RyZWFtLndyaXRlU3RyaW5nKHRoaXMudHlwZSwgbnVsbCwgNCk7CgkJaWYgKHRoaXMudHlwZSA9PT0gInV1aWQiKSB7CgkJCXN0cmVhbS53cml0ZVVpbnQ4QXJyYXkodGhpcy51dWlkKTsKCQl9CgkJaWYgKHRoaXMuc2l6ZSA+IE1BWF9TSVpFKSB7CgkJCXN0cmVhbS53cml0ZVVpbnQ2NCh0aGlzLnNpemUpOwoJCX0gCgl9OwoKCUJveFBhcnNlci5GdWxsQm94LnByb3RvdHlwZS53cml0ZUhlYWRlciA9IGZ1bmN0aW9uKHN0cmVhbSkgewoJCXRoaXMuc2l6ZSArPSA0OwoJCUJveFBhcnNlci5Cb3gucHJvdG90eXBlLndyaXRlSGVhZGVyLmNhbGwodGhpcywgc3RyZWFtLCAiIHY9Iit0aGlzLnZlcnNpb24rIiBmPSIrdGhpcy5mbGFncyk7CgkJc3RyZWFtLndyaXRlVWludDgodGhpcy52ZXJzaW9uKTsKCQlzdHJlYW0ud3JpdGVVaW50MjQodGhpcy5mbGFncyk7Cgl9OwoKCUJveFBhcnNlci5Cb3gucHJvdG90eXBlLndyaXRlID0gZnVuY3Rpb24oc3RyZWFtKSB7CgkJaWYgKHRoaXMudHlwZSA9PT0gIm1kYXQiKSB7CgkJCS8qIFRPRE86IGZpeCB0aGlzICovCgkJCWlmICh0aGlzLmRhdGEpIHsKCQkJCXRoaXMuc2l6ZSA9IHRoaXMuZGF0YS5sZW5ndGg7CgkJCQl0aGlzLndyaXRlSGVhZGVyKHN0cmVhbSk7CgkJCQlzdHJlYW0ud3JpdGVVaW50OEFycmF5KHRoaXMuZGF0YSk7CgkJCX0KCQl9IGVsc2UgewoJCQl0aGlzLnNpemUgPSAodGhpcy5kYXRhID8gdGhpcy5kYXRhLmxlbmd0aCA6IDApOwoJCQl0aGlzLndyaXRlSGVhZGVyKHN0cmVhbSk7CgkJCWlmICh0aGlzLmRhdGEpIHsKCQkJCXN0cmVhbS53cml0ZVVpbnQ4QXJyYXkodGhpcy5kYXRhKTsKCQkJfQoJCX0KCX07CgoJQm94UGFyc2VyLkNvbnRhaW5lckJveC5wcm90b3R5cGUud3JpdGUgPSBmdW5jdGlvbihzdHJlYW0pIHsKCQl0aGlzLnNpemUgPSAwOwoJCXRoaXMud3JpdGVIZWFkZXIoc3RyZWFtKTsKCQlmb3IgKHZhciBpPTA7IGk8dGhpcy5ib3hlcy5sZW5ndGg7IGkrKykgewoJCQlpZiAodGhpcy5ib3hlc1tpXSkgewoJCQkJdGhpcy5ib3hlc1tpXS53cml0ZShzdHJlYW0pOwoJCQkJdGhpcy5zaXplICs9IHRoaXMuYm94ZXNbaV0uc2l6ZTsKCQkJfQoJCX0KCQkvKiBhZGp1c3RpbmcgdGhlIHNpemUsIG5vdyB0aGF0IGFsbCBzdWItYm94ZXMgYXJlIGtub3duICovCgkJTG9nLmRlYnVnKCJCb3hXcml0ZXIiLCAiQWRqdXN0aW5nIGJveCAiK3RoaXMudHlwZSsiIHdpdGggbmV3IHNpemUgIit0aGlzLnNpemUpOwoJCXN0cmVhbS5hZGp1c3RVaW50MzIodGhpcy5zaXplUG9zaXRpb24sIHRoaXMuc2l6ZSk7Cgl9OwoKCUJveFBhcnNlci5UcmFja1JlZmVyZW5jZVR5cGVCb3gucHJvdG90eXBlLndyaXRlID0gZnVuY3Rpb24oc3RyZWFtKSB7CgkJdGhpcy5zaXplID0gdGhpcy50cmFja19pZHMubGVuZ3RoKjQ7CgkJdGhpcy53cml0ZUhlYWRlcihzdHJlYW0pOwoJCXN0cmVhbS53cml0ZVVpbnQzMkFycmF5KHRoaXMudHJhY2tfaWRzKTsKCX07CgoJLy8gZmlsZTpzcmMvd3JpdGluZy9hdmNDLmpzCglCb3hQYXJzZXIuYXZjQ0JveC5wcm90b3R5cGUud3JpdGUgPSBmdW5jdGlvbihzdHJlYW0pIHsKCQl2YXIgaTsKCQl0aGlzLnNpemUgPSA3OwoJCWZvciAoaSA9IDA7IGkgPCB0aGlzLlNQUy5sZW5ndGg7IGkrKykgewoJCQl0aGlzLnNpemUgKz0gMit0aGlzLlNQU1tpXS5sZW5ndGg7CgkJfQoJCWZvciAoaSA9IDA7IGkgPCB0aGlzLlBQUy5sZW5ndGg7IGkrKykgewoJCQl0aGlzLnNpemUgKz0gMit0aGlzLlBQU1tpXS5sZW5ndGg7CgkJfQoJCWlmICh0aGlzLmV4dCkgewoJCQl0aGlzLnNpemUgKz0gdGhpcy5leHQubGVuZ3RoOwoJCX0KCQl0aGlzLndyaXRlSGVhZGVyKHN0cmVhbSk7CgkJc3RyZWFtLndyaXRlVWludDgodGhpcy5jb25maWd1cmF0aW9uVmVyc2lvbik7CgkJc3RyZWFtLndyaXRlVWludDgodGhpcy5BVkNQcm9maWxlSW5kaWNhdGlvbik7CgkJc3RyZWFtLndyaXRlVWludDgodGhpcy5wcm9maWxlX2NvbXBhdGliaWxpdHkpOwoJCXN0cmVhbS53cml0ZVVpbnQ4KHRoaXMuQVZDTGV2ZWxJbmRpY2F0aW9uKTsKCQlzdHJlYW0ud3JpdGVVaW50OCh0aGlzLmxlbmd0aFNpemVNaW51c09uZSArICg2Mzw8MikpOwoJCXN0cmVhbS53cml0ZVVpbnQ4KHRoaXMuU1BTLmxlbmd0aCArICg3PDw1KSk7CgkJZm9yIChpID0gMDsgaSA8IHRoaXMuU1BTLmxlbmd0aDsgaSsrKSB7CgkJCXN0cmVhbS53cml0ZVVpbnQxNih0aGlzLlNQU1tpXS5sZW5ndGgpOwoJCQlzdHJlYW0ud3JpdGVVaW50OEFycmF5KHRoaXMuU1BTW2ldLm5hbHUpOwoJCX0KCQlzdHJlYW0ud3JpdGVVaW50OCh0aGlzLlBQUy5sZW5ndGgpOwoJCWZvciAoaSA9IDA7IGkgPCB0aGlzLlBQUy5sZW5ndGg7IGkrKykgewoJCQlzdHJlYW0ud3JpdGVVaW50MTYodGhpcy5QUFNbaV0ubGVuZ3RoKTsKCQkJc3RyZWFtLndyaXRlVWludDhBcnJheSh0aGlzLlBQU1tpXS5uYWx1KTsKCQl9CgkJaWYgKHRoaXMuZXh0KSB7CgkJCXN0cmVhbS53cml0ZVVpbnQ4QXJyYXkodGhpcy5leHQpOwoJCX0KCX07CgoJLy8gZmlsZTpzcmMvd3JpdGluZy9jbzY0LmpzCglCb3hQYXJzZXIuY282NEJveC5wcm90b3R5cGUud3JpdGUgPSBmdW5jdGlvbihzdHJlYW0pIHsKCQl2YXIgaTsKCQl0aGlzLnZlcnNpb24gPSAwOwoJCXRoaXMuZmxhZ3MgPSAwOwoJCXRoaXMuc2l6ZSA9IDQrOCp0aGlzLmNodW5rX29mZnNldHMubGVuZ3RoOwoJCXRoaXMud3JpdGVIZWFkZXIoc3RyZWFtKTsKCQlzdHJlYW0ud3JpdGVVaW50MzIodGhpcy5jaHVua19vZmZzZXRzLmxlbmd0aCk7CgkJZm9yKGk9MDsgaTx0aGlzLmNodW5rX29mZnNldHMubGVuZ3RoOyBpKyspIHsKCQkJc3RyZWFtLndyaXRlVWludDY0KHRoaXMuY2h1bmtfb2Zmc2V0c1tpXSk7CgkJfQoJfTsKCgkvLyBmaWxlOnNyYy93cml0aW5nL2NzbGcuanMKCUJveFBhcnNlci5jc2xnQm94LnByb3RvdHlwZS53cml0ZSA9IGZ1bmN0aW9uKHN0cmVhbSkgewoJCXRoaXMudmVyc2lvbiA9IDA7CgkJdGhpcy5mbGFncyA9IDA7CgkJdGhpcy5zaXplID0gNCo1OwoJCXRoaXMud3JpdGVIZWFkZXIoc3RyZWFtKTsKCQlzdHJlYW0ud3JpdGVJbnQzMih0aGlzLmNvbXBvc2l0aW9uVG9EVFNTaGlmdCk7CgkJc3RyZWFtLndyaXRlSW50MzIodGhpcy5sZWFzdERlY29kZVRvRGlzcGxheURlbHRhKTsKCQlzdHJlYW0ud3JpdGVJbnQzMih0aGlzLmdyZWF0ZXN0RGVjb2RlVG9EaXNwbGF5RGVsdGEpOwoJCXN0cmVhbS53cml0ZUludDMyKHRoaXMuY29tcG9zaXRpb25TdGFydFRpbWUpOwoJCXN0cmVhbS53cml0ZUludDMyKHRoaXMuY29tcG9zaXRpb25FbmRUaW1lKTsKCX07CgoJLy8gZmlsZTpzcmMvd3JpdGluZy9jdHRzLmpzCglCb3hQYXJzZXIuY3R0c0JveC5wcm90b3R5cGUud3JpdGUgPSBmdW5jdGlvbihzdHJlYW0pIHsKCQl2YXIgaTsKCQl0aGlzLnZlcnNpb24gPSAwOwoJCXRoaXMuZmxhZ3MgPSAwOwoJCXRoaXMuc2l6ZSA9IDQrOCp0aGlzLnNhbXBsZV9jb3VudHMubGVuZ3RoOwoJCXRoaXMud3JpdGVIZWFkZXIoc3RyZWFtKTsKCQlzdHJlYW0ud3JpdGVVaW50MzIodGhpcy5zYW1wbGVfY291bnRzLmxlbmd0aCk7CgkJZm9yKGk9MDsgaTx0aGlzLnNhbXBsZV9jb3VudHMubGVuZ3RoOyBpKyspIHsKCQkJc3RyZWFtLndyaXRlVWludDMyKHRoaXMuc2FtcGxlX2NvdW50c1tpXSk7CgkJCWlmICh0aGlzLnZlcnNpb24gPT09IDEpIHsKCQkJCXN0cmVhbS53cml0ZUludDMyKHRoaXMuc2FtcGxlX29mZnNldHNbaV0pOyAvKiBzaWduZWQgKi8KCQkJfSBlbHNlIHsJCQkKCQkJCXN0cmVhbS53cml0ZVVpbnQzMih0aGlzLnNhbXBsZV9vZmZzZXRzW2ldKTsgLyogdW5zaWduZWQgKi8KCQkJfQoJCX0KCX07CgoJLy8gZmlsZTpzcmMvd3JpdGluZy9kcmVmLmpzCglCb3hQYXJzZXIuZHJlZkJveC5wcm90b3R5cGUud3JpdGUgPSBmdW5jdGlvbihzdHJlYW0pIHsKCQl0aGlzLnZlcnNpb24gPSAwOwoJCXRoaXMuZmxhZ3MgPSAwOwoJCXRoaXMuc2l6ZSA9IDQ7IC8vCgkJdGhpcy53cml0ZUhlYWRlcihzdHJlYW0pOwoJCXN0cmVhbS53cml0ZVVpbnQzMih0aGlzLmVudHJpZXMubGVuZ3RoKTsKCQlmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuZW50cmllcy5sZW5ndGg7IGkrKykgewoJCQl0aGlzLmVudHJpZXNbaV0ud3JpdGUoc3RyZWFtKTsKCQkJdGhpcy5zaXplICs9IHRoaXMuZW50cmllc1tpXS5zaXplOwoJCX0JCgkJLyogYWRqdXN0aW5nIHRoZSBzaXplLCBub3cgdGhhdCBhbGwgc3ViLWJveGVzIGFyZSBrbm93biAqLwoJCUxvZy5kZWJ1ZygiQm94V3JpdGVyIiwgIkFkanVzdGluZyBib3ggIit0aGlzLnR5cGUrIiB3aXRoIG5ldyBzaXplICIrdGhpcy5zaXplKTsKCQlzdHJlYW0uYWRqdXN0VWludDMyKHRoaXMuc2l6ZVBvc2l0aW9uLCB0aGlzLnNpemUpOwoJfTsKCgkvLyBmaWxlOnNyYy93cml0aW5nL2VsbmcuanMKCUJveFBhcnNlci5lbG5nQm94LnByb3RvdHlwZS53cml0ZSA9IGZ1bmN0aW9uKHN0cmVhbSkgewoJCXRoaXMudmVyc2lvbiA9IDA7CQoJCXRoaXMuZmxhZ3MgPSAwOwoJCXRoaXMuc2l6ZSA9IHRoaXMuZXh0ZW5kZWRfbGFuZ3VhZ2UubGVuZ3RoOwoJCXRoaXMud3JpdGVIZWFkZXIoc3RyZWFtKTsKCQlzdHJlYW0ud3JpdGVTdHJpbmcodGhpcy5leHRlbmRlZF9sYW5ndWFnZSk7Cgl9OwoKCS8vIGZpbGU6c3JjL3dyaXRpbmcvZWxzdC5qcwoJQm94UGFyc2VyLmVsc3RCb3gucHJvdG90eXBlLndyaXRlID0gZnVuY3Rpb24oc3RyZWFtKSB7CgkJdGhpcy52ZXJzaW9uID0gMDsJCgkJdGhpcy5mbGFncyA9IDA7CgkJdGhpcy5zaXplID0gNCsxMip0aGlzLmVudHJpZXMubGVuZ3RoOwoJCXRoaXMud3JpdGVIZWFkZXIoc3RyZWFtKTsKCQlzdHJlYW0ud3JpdGVVaW50MzIodGhpcy5lbnRyaWVzLmxlbmd0aCk7CgkJZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmVudHJpZXMubGVuZ3RoOyBpKyspIHsKCQkJdmFyIGVudHJ5ID0gdGhpcy5lbnRyaWVzW2ldOwoJCQlzdHJlYW0ud3JpdGVVaW50MzIoZW50cnkuc2VnbWVudF9kdXJhdGlvbik7CgkJCXN0cmVhbS53cml0ZUludDMyKGVudHJ5Lm1lZGlhX3RpbWUpOwoJCQlzdHJlYW0ud3JpdGVJbnQxNihlbnRyeS5tZWRpYV9yYXRlX2ludGVnZXIpOwoJCQlzdHJlYW0ud3JpdGVJbnQxNihlbnRyeS5tZWRpYV9yYXRlX2ZyYWN0aW9uKTsKCQl9Cgl9OwoKCS8vIGZpbGU6c3JjL3dyaXRpbmcvZW1zZy5qcwoJQm94UGFyc2VyLmVtc2dCb3gucHJvdG90eXBlLndyaXRlID0gZnVuY3Rpb24oc3RyZWFtKSB7CgkJdGhpcy52ZXJzaW9uID0gMDsJCgkJdGhpcy5mbGFncyA9IDA7CgkJdGhpcy5zaXplID0gNCo0K3RoaXMubWVzc2FnZV9kYXRhLmxlbmd0aCsodGhpcy5zY2hlbWVfaWRfdXJpLmxlbmd0aCsxKSsodGhpcy52YWx1ZS5sZW5ndGgrMSk7CgkJdGhpcy53cml0ZUhlYWRlcihzdHJlYW0pOwoJCXN0cmVhbS53cml0ZUNTdHJpbmcodGhpcy5zY2hlbWVfaWRfdXJpKTsKCQlzdHJlYW0ud3JpdGVDU3RyaW5nKHRoaXMudmFsdWUpOwoJCXN0cmVhbS53cml0ZVVpbnQzMih0aGlzLnRpbWVzY2FsZSk7CgkJc3RyZWFtLndyaXRlVWludDMyKHRoaXMucHJlc2VudGF0aW9uX3RpbWVfZGVsdGEpOwoJCXN0cmVhbS53cml0ZVVpbnQzMih0aGlzLmV2ZW50X2R1cmF0aW9uKTsKCQlzdHJlYW0ud3JpdGVVaW50MzIodGhpcy5pZCk7CgkJc3RyZWFtLndyaXRlVWludDhBcnJheSh0aGlzLm1lc3NhZ2VfZGF0YSk7Cgl9OwoKCS8vIGZpbGU6c3JjL3dyaXRpbmcvZnR5cC5qcwoJQm94UGFyc2VyLmZ0eXBCb3gucHJvdG90eXBlLndyaXRlID0gZnVuY3Rpb24oc3RyZWFtKSB7CgkJdGhpcy5zaXplID0gOCs0KnRoaXMuY29tcGF0aWJsZV9icmFuZHMubGVuZ3RoOwoJCXRoaXMud3JpdGVIZWFkZXIoc3RyZWFtKTsKCQlzdHJlYW0ud3JpdGVTdHJpbmcodGhpcy5tYWpvcl9icmFuZCwgbnVsbCwgNCk7CgkJc3RyZWFtLndyaXRlVWludDMyKHRoaXMubWlub3JfdmVyc2lvbik7CgkJZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNvbXBhdGlibGVfYnJhbmRzLmxlbmd0aDsgaSsrKSB7CgkJCXN0cmVhbS53cml0ZVN0cmluZyh0aGlzLmNvbXBhdGlibGVfYnJhbmRzW2ldLCBudWxsLCA0KTsKCQl9Cgl9OwoKCS8vIGZpbGU6c3JjL3dyaXRpbmcvaGRsci5qcwoJQm94UGFyc2VyLmhkbHJCb3gucHJvdG90eXBlLndyaXRlID0gZnVuY3Rpb24oc3RyZWFtKSB7CgkJdGhpcy5zaXplID0gNSo0K3RoaXMubmFtZS5sZW5ndGgrMTsKCQl0aGlzLnZlcnNpb24gPSAwOwoJCXRoaXMuZmxhZ3MgPSAwOwoJCXRoaXMud3JpdGVIZWFkZXIoc3RyZWFtKTsKCQlzdHJlYW0ud3JpdGVVaW50MzIoMCk7CgkJc3RyZWFtLndyaXRlU3RyaW5nKHRoaXMuaGFuZGxlciwgbnVsbCwgNCk7CgkJc3RyZWFtLndyaXRlVWludDMyKDApOwoJCXN0cmVhbS53cml0ZVVpbnQzMigwKTsKCQlzdHJlYW0ud3JpdGVVaW50MzIoMCk7CgkJc3RyZWFtLndyaXRlQ1N0cmluZyh0aGlzLm5hbWUpOwoJfTsKCgkvLyBmaWxlOnNyYy93cml0aW5nL2tpbmQuanMKCUJveFBhcnNlci5raW5kQm94LnByb3RvdHlwZS53cml0ZSA9IGZ1bmN0aW9uKHN0cmVhbSkgewoJCXRoaXMudmVyc2lvbiA9IDA7CQoJCXRoaXMuZmxhZ3MgPSAwOwoJCXRoaXMuc2l6ZSA9ICh0aGlzLnNjaGVtZVVSSS5sZW5ndGgrMSkrKHRoaXMudmFsdWUubGVuZ3RoKzEpOwoJCXRoaXMud3JpdGVIZWFkZXIoc3RyZWFtKTsKCQlzdHJlYW0ud3JpdGVDU3RyaW5nKHRoaXMuc2NoZW1lVVJJKTsKCQlzdHJlYW0ud3JpdGVDU3RyaW5nKHRoaXMudmFsdWUpOwoJfTsKCgkvLyBmaWxlOnNyYy93cml0aW5nL21kaGQuanMKCUJveFBhcnNlci5tZGhkQm94LnByb3RvdHlwZS53cml0ZSA9IGZ1bmN0aW9uKHN0cmVhbSkgewoJCXRoaXMuc2l6ZSA9IDQqNCsyKjI7CgkJdGhpcy5mbGFncyA9IDA7CgkJdGhpcy52ZXJzaW9uID0gMDsKCQl0aGlzLndyaXRlSGVhZGVyKHN0cmVhbSk7CgkJc3RyZWFtLndyaXRlVWludDMyKHRoaXMuY3JlYXRpb25fdGltZSk7CgkJc3RyZWFtLndyaXRlVWludDMyKHRoaXMubW9kaWZpY2F0aW9uX3RpbWUpOwoJCXN0cmVhbS53cml0ZVVpbnQzMih0aGlzLnRpbWVzY2FsZSk7CgkJc3RyZWFtLndyaXRlVWludDMyKHRoaXMuZHVyYXRpb24pOwoJCXN0cmVhbS53cml0ZVVpbnQxNih0aGlzLmxhbmd1YWdlKTsKCQlzdHJlYW0ud3JpdGVVaW50MTYoMCk7Cgl9OwoKCS8vIGZpbGU6c3JjL3dyaXRpbmcvbWVoZC5qcwoJQm94UGFyc2VyLm1laGRCb3gucHJvdG90eXBlLndyaXRlID0gZnVuY3Rpb24oc3RyZWFtKSB7CgkJdGhpcy52ZXJzaW9uID0gMDsKCQl0aGlzLmZsYWdzID0gMDsKCQl0aGlzLnNpemUgPSA0OwoJCXRoaXMud3JpdGVIZWFkZXIoc3RyZWFtKTsKCQlzdHJlYW0ud3JpdGVVaW50MzIodGhpcy5mcmFnbWVudF9kdXJhdGlvbik7Cgl9OwoKCS8vIGZpbGU6c3JjL3dyaXRpbmcvbWZoZC5qcwoJQm94UGFyc2VyLm1maGRCb3gucHJvdG90eXBlLndyaXRlID0gZnVuY3Rpb24oc3RyZWFtKSB7CgkJdGhpcy52ZXJzaW9uID0gMDsKCQl0aGlzLmZsYWdzID0gMDsKCQl0aGlzLnNpemUgPSA0OwoJCXRoaXMud3JpdGVIZWFkZXIoc3RyZWFtKTsKCQlzdHJlYW0ud3JpdGVVaW50MzIodGhpcy5zZXF1ZW5jZV9udW1iZXIpOwoJfTsKCgkvLyBmaWxlOnNyYy93cml0aW5nL212aGQuanMKCUJveFBhcnNlci5tdmhkQm94LnByb3RvdHlwZS53cml0ZSA9IGZ1bmN0aW9uKHN0cmVhbSkgewoJCXRoaXMudmVyc2lvbiA9IDA7CgkJdGhpcy5mbGFncyA9IDA7CgkJdGhpcy5zaXplID0gMjMqNCsyKjI7CgkJdGhpcy53cml0ZUhlYWRlcihzdHJlYW0pOwoJCXN0cmVhbS53cml0ZVVpbnQzMih0aGlzLmNyZWF0aW9uX3RpbWUpOwoJCXN0cmVhbS53cml0ZVVpbnQzMih0aGlzLm1vZGlmaWNhdGlvbl90aW1lKTsKCQlzdHJlYW0ud3JpdGVVaW50MzIodGhpcy50aW1lc2NhbGUpOwoJCXN0cmVhbS53cml0ZVVpbnQzMih0aGlzLmR1cmF0aW9uKTsKCQlzdHJlYW0ud3JpdGVVaW50MzIodGhpcy5yYXRlKTsKCQlzdHJlYW0ud3JpdGVVaW50MTYodGhpcy52b2x1bWU8PDgpOwoJCXN0cmVhbS53cml0ZVVpbnQxNigwKTsKCQlzdHJlYW0ud3JpdGVVaW50MzIoMCk7CgkJc3RyZWFtLndyaXRlVWludDMyKDApOwoJCXN0cmVhbS53cml0ZVVpbnQzMkFycmF5KHRoaXMubWF0cml4KTsKCQlzdHJlYW0ud3JpdGVVaW50MzIoMCk7CgkJc3RyZWFtLndyaXRlVWludDMyKDApOwoJCXN0cmVhbS53cml0ZVVpbnQzMigwKTsKCQlzdHJlYW0ud3JpdGVVaW50MzIoMCk7CgkJc3RyZWFtLndyaXRlVWludDMyKDApOwoJCXN0cmVhbS53cml0ZVVpbnQzMigwKTsKCQlzdHJlYW0ud3JpdGVVaW50MzIodGhpcy5uZXh0X3RyYWNrX2lkKTsKCX07CgoJLy8gZmlsZTpzcmMvd3JpdGluZy9zYW1wbGVlbnRyeS5qcwoJQm94UGFyc2VyLlNhbXBsZUVudHJ5LnByb3RvdHlwZS53cml0ZUhlYWRlciA9IGZ1bmN0aW9uKHN0cmVhbSkgewoJCXRoaXMuc2l6ZSA9IDg7CgkJQm94UGFyc2VyLkJveC5wcm90b3R5cGUud3JpdGVIZWFkZXIuY2FsbCh0aGlzLCBzdHJlYW0pOwoJCXN0cmVhbS53cml0ZVVpbnQ4KDApOwoJCXN0cmVhbS53cml0ZVVpbnQ4KDApOwoJCXN0cmVhbS53cml0ZVVpbnQ4KDApOwoJCXN0cmVhbS53cml0ZVVpbnQ4KDApOwoJCXN0cmVhbS53cml0ZVVpbnQ4KDApOwoJCXN0cmVhbS53cml0ZVVpbnQ4KDApOwoJCXN0cmVhbS53cml0ZVVpbnQxNih0aGlzLmRhdGFfcmVmZXJlbmNlX2luZGV4KTsKCX07CgoJQm94UGFyc2VyLlNhbXBsZUVudHJ5LnByb3RvdHlwZS53cml0ZUZvb3RlciA9IGZ1bmN0aW9uKHN0cmVhbSkgewoJCWZvciAodmFyIGk9MDsgaTx0aGlzLmJveGVzLmxlbmd0aDsgaSsrKSB7CgkJCXRoaXMuYm94ZXNbaV0ud3JpdGUoc3RyZWFtKTsKCQkJdGhpcy5zaXplICs9IHRoaXMuYm94ZXNbaV0uc2l6ZTsKCQl9CgkJTG9nLmRlYnVnKCJCb3hXcml0ZXIiLCAiQWRqdXN0aW5nIGJveCAiK3RoaXMudHlwZSsiIHdpdGggbmV3IHNpemUgIit0aGlzLnNpemUpOwoJCXN0cmVhbS5hZGp1c3RVaW50MzIodGhpcy5zaXplUG9zaXRpb24sIHRoaXMuc2l6ZSk7CQoJfTsKCglCb3hQYXJzZXIuU2FtcGxlRW50cnkucHJvdG90eXBlLndyaXRlID0gZnVuY3Rpb24oc3RyZWFtKSB7CgkJdGhpcy53cml0ZUhlYWRlcihzdHJlYW0pOwoJCXN0cmVhbS53cml0ZVVpbnQ4QXJyYXkodGhpcy5kYXRhKTsKCQl0aGlzLnNpemUgKz0gdGhpcy5kYXRhLmxlbmd0aDsKCQlMb2cuZGVidWcoIkJveFdyaXRlciIsICJBZGp1c3RpbmcgYm94ICIrdGhpcy50eXBlKyIgd2l0aCBuZXcgc2l6ZSAiK3RoaXMuc2l6ZSk7CgkJc3RyZWFtLmFkanVzdFVpbnQzMih0aGlzLnNpemVQb3NpdGlvbiwgdGhpcy5zaXplKTsJCgl9OwoKCUJveFBhcnNlci5WaXN1YWxTYW1wbGVFbnRyeS5wcm90b3R5cGUud3JpdGUgPSBmdW5jdGlvbihzdHJlYW0pIHsKCQl0aGlzLndyaXRlSGVhZGVyKHN0cmVhbSk7CgkJdGhpcy5zaXplICs9IDIqNys2KjQrMzI7CgkJc3RyZWFtLndyaXRlVWludDE2KDApOyAKCQlzdHJlYW0ud3JpdGVVaW50MTYoMCk7CgkJc3RyZWFtLndyaXRlVWludDMyKDApOwoJCXN0cmVhbS53cml0ZVVpbnQzMigwKTsKCQlzdHJlYW0ud3JpdGVVaW50MzIoMCk7CgkJc3RyZWFtLndyaXRlVWludDE2KHRoaXMud2lkdGgpOwoJCXN0cmVhbS53cml0ZVVpbnQxNih0aGlzLmhlaWdodCk7CgkJc3RyZWFtLndyaXRlVWludDMyKHRoaXMuaG9yaXpyZXNvbHV0aW9uKTsKCQlzdHJlYW0ud3JpdGVVaW50MzIodGhpcy52ZXJ0cmVzb2x1dGlvbik7CgkJc3RyZWFtLndyaXRlVWludDMyKDApOwoJCXN0cmVhbS53cml0ZVVpbnQxNih0aGlzLmZyYW1lX2NvdW50KTsKCQlzdHJlYW0ud3JpdGVVaW50OChNYXRoLm1pbigzMSwgdGhpcy5jb21wcmVzc29ybmFtZS5sZW5ndGgpKTsKCQlzdHJlYW0ud3JpdGVTdHJpbmcodGhpcy5jb21wcmVzc29ybmFtZSwgbnVsbCwgMzEpOwoJCXN0cmVhbS53cml0ZVVpbnQxNih0aGlzLmRlcHRoKTsKCQlzdHJlYW0ud3JpdGVJbnQxNigtMSk7CgkJdGhpcy53cml0ZUZvb3RlcihzdHJlYW0pOwoJfTsKCglCb3hQYXJzZXIuQXVkaW9TYW1wbGVFbnRyeS5wcm90b3R5cGUud3JpdGUgPSBmdW5jdGlvbihzdHJlYW0pIHsKCQl0aGlzLndyaXRlSGVhZGVyKHN0cmVhbSk7CgkJdGhpcy5zaXplICs9IDIqNCszKjQ7CgkJc3RyZWFtLndyaXRlVWludDMyKDApOwoJCXN0cmVhbS53cml0ZVVpbnQzMigwKTsKCQlzdHJlYW0ud3JpdGVVaW50MTYodGhpcy5jaGFubmVsX2NvdW50KTsKCQlzdHJlYW0ud3JpdGVVaW50MTYodGhpcy5zYW1wbGVzaXplKTsKCQlzdHJlYW0ud3JpdGVVaW50MTYoMCk7CgkJc3RyZWFtLndyaXRlVWludDE2KDApOwoJCXN0cmVhbS53cml0ZVVpbnQzMih0aGlzLnNhbXBsZXJhdGU8PDE2KTsKCQl0aGlzLndyaXRlRm9vdGVyKHN0cmVhbSk7Cgl9OwoKCUJveFBhcnNlci5zdHBwU2FtcGxlRW50cnkucHJvdG90eXBlLndyaXRlID0gZnVuY3Rpb24oc3RyZWFtKSB7CgkJdGhpcy53cml0ZUhlYWRlcihzdHJlYW0pOwoJCXRoaXMuc2l6ZSArPSB0aGlzLm5hbWVzcGFjZS5sZW5ndGgrMSsKCQkJCQkgdGhpcy5zY2hlbWFfbG9jYXRpb24ubGVuZ3RoKzErCgkJCQkJIHRoaXMuYXV4aWxpYXJ5X21pbWVfdHlwZXMubGVuZ3RoKzE7CgkJc3RyZWFtLndyaXRlQ1N0cmluZyh0aGlzLm5hbWVzcGFjZSk7CgkJc3RyZWFtLndyaXRlQ1N0cmluZyh0aGlzLnNjaGVtYV9sb2NhdGlvbik7CgkJc3RyZWFtLndyaXRlQ1N0cmluZyh0aGlzLmF1eGlsaWFyeV9taW1lX3R5cGVzKTsKCQl0aGlzLndyaXRlRm9vdGVyKHN0cmVhbSk7Cgl9OwoKCS8vIGZpbGU6c3JjL3dyaXRpbmcvc2FtcGxlZ3JvdXBzL3NhbXBsZWdyb3VwLmpzCglCb3hQYXJzZXIuU2FtcGxlR3JvdXBFbnRyeS5wcm90b3R5cGUud3JpdGUgPSBmdW5jdGlvbihzdHJlYW0pIHsKCQlzdHJlYW0ud3JpdGVVaW50OEFycmF5KHRoaXMuZGF0YSk7Cgl9OwoKCS8vIGZpbGU6c3JjL3dyaXRpbmcvc2JncC5qcwoJQm94UGFyc2VyLnNiZ3BCb3gucHJvdG90eXBlLndyaXRlID0gZnVuY3Rpb24oc3RyZWFtKSB7CgkJdGhpcy52ZXJzaW9uID0gMTsJCgkJdGhpcy5mbGFncyA9IDA7CgkJdGhpcy5zaXplID0gMTIrOCp0aGlzLmVudHJpZXMubGVuZ3RoOwoJCXRoaXMud3JpdGVIZWFkZXIoc3RyZWFtKTsKCQlzdHJlYW0ud3JpdGVTdHJpbmcodGhpcy5ncm91cGluZ190eXBlLCBudWxsLCA0KTsKCQlzdHJlYW0ud3JpdGVVaW50MzIodGhpcy5ncm91cGluZ190eXBlX3BhcmFtZXRlcik7CgkJc3RyZWFtLndyaXRlVWludDMyKHRoaXMuZW50cmllcy5sZW5ndGgpOwoJCWZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5lbnRyaWVzLmxlbmd0aDsgaSsrKSB7CgkJCXZhciBlbnRyeSA9IHRoaXMuZW50cmllc1tpXTsKCQkJc3RyZWFtLndyaXRlSW50MzIoZW50cnkuc2FtcGxlX2NvdW50KTsKCQkJc3RyZWFtLndyaXRlSW50MzIoZW50cnkuZ3JvdXBfZGVzY3JpcHRpb25faW5kZXgpOwoJCX0KCX07CgoJLy8gZmlsZTpzcmMvd3JpdGluZy9zZ3BkLmpzCglCb3hQYXJzZXIuc2dwZEJveC5wcm90b3R5cGUud3JpdGUgPSBmdW5jdGlvbihzdHJlYW0pIHsKCQl2YXIgaTsKCQl2YXIgZW50cnk7CgkJLy8gbGVhdmUgdmVyc2lvbiBhcyByZWFkCgkJLy8gdGhpcy52ZXJzaW9uOwoJCXRoaXMuZmxhZ3MgPSAwOwoJCXRoaXMuc2l6ZSA9IDEyOwoJCWZvciAoaSA9IDA7IGkgPCB0aGlzLmVudHJpZXMubGVuZ3RoOyBpKyspIHsKCQkJZW50cnkgPSB0aGlzLmVudHJpZXNbaV07CgkJCWlmICh0aGlzLnZlcnNpb24gPT09IDEpIHsKCQkJCWlmICh0aGlzLmRlZmF1bHRfbGVuZ3RoID09PSAwKSB7CgkJCQkJdGhpcy5zaXplICs9IDQ7CgkJCQl9CgkJCQl0aGlzLnNpemUgKz0gZW50cnkuZGF0YS5sZW5ndGg7CgkJCX0KCQl9CgkJdGhpcy53cml0ZUhlYWRlcihzdHJlYW0pOwoJCXN0cmVhbS53cml0ZVN0cmluZyh0aGlzLmdyb3VwaW5nX3R5cGUsIG51bGwsIDQpOwoJCWlmICh0aGlzLnZlcnNpb24gPT09IDEpIHsKCQkJc3RyZWFtLndyaXRlVWludDMyKHRoaXMuZGVmYXVsdF9sZW5ndGgpOwoJCX0KCQlpZiAodGhpcy52ZXJzaW9uID49IDIpIHsKCQkJc3RyZWFtLndyaXRlVWludDMyKHRoaXMuZGVmYXVsdF9zYW1wbGVfZGVzY3JpcHRpb25faW5kZXgpOwoJCX0KCQlzdHJlYW0ud3JpdGVVaW50MzIodGhpcy5lbnRyaWVzLmxlbmd0aCk7CgkJZm9yIChpID0gMDsgaSA8IHRoaXMuZW50cmllcy5sZW5ndGg7IGkrKykgewoJCQllbnRyeSA9IHRoaXMuZW50cmllc1tpXTsKCQkJaWYgKHRoaXMudmVyc2lvbiA9PT0gMSkgewoJCQkJaWYgKHRoaXMuZGVmYXVsdF9sZW5ndGggPT09IDApIHsKCQkJCQlzdHJlYW0ud3JpdGVVaW50MzIoZW50cnkuZGVzY3JpcHRpb25fbGVuZ3RoKTsKCQkJCX0KCQkJfQoJCQllbnRyeS53cml0ZShzdHJlYW0pOwoJCX0KCX07CgoKCS8vIGZpbGU6c3JjL3dyaXRpbmcvc2lkeC5qcwoJQm94UGFyc2VyLnNpZHhCb3gucHJvdG90eXBlLndyaXRlID0gZnVuY3Rpb24oc3RyZWFtKSB7CgkJdGhpcy52ZXJzaW9uID0gMDsJCgkJdGhpcy5mbGFncyA9IDA7CgkJdGhpcy5zaXplID0gNCo0KzIrMisxMip0aGlzLnJlZmVyZW5jZXMubGVuZ3RoOwoJCXRoaXMud3JpdGVIZWFkZXIoc3RyZWFtKTsKCQlzdHJlYW0ud3JpdGVVaW50MzIodGhpcy5yZWZlcmVuY2VfSUQpOwoJCXN0cmVhbS53cml0ZVVpbnQzMih0aGlzLnRpbWVzY2FsZSk7CgkJc3RyZWFtLndyaXRlVWludDMyKHRoaXMuZWFybGllc3RfcHJlc2VudGF0aW9uX3RpbWUpOwoJCXN0cmVhbS53cml0ZVVpbnQzMih0aGlzLmZpcnN0X29mZnNldCk7CgkJc3RyZWFtLndyaXRlVWludDE2KDApOwoJCXN0cmVhbS53cml0ZVVpbnQxNih0aGlzLnJlZmVyZW5jZXMubGVuZ3RoKTsKCQlmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMucmVmZXJlbmNlcy5sZW5ndGg7IGkrKykgewoJCQl2YXIgcmVmID0gdGhpcy5yZWZlcmVuY2VzW2ldOwoJCQlzdHJlYW0ud3JpdGVVaW50MzIocmVmLnJlZmVyZW5jZV90eXBlIDw8IDMxIHwgcmVmLnJlZmVyZW5jZWRfc2l6ZSk7CgkJCXN0cmVhbS53cml0ZVVpbnQzMihyZWYuc3Vic2VnbWVudF9kdXJhdGlvbik7CgkJCXN0cmVhbS53cml0ZVVpbnQzMihyZWYuc3RhcnRzX3dpdGhfU0FQIDw8IDMxIHwgcmVmLlNBUF90eXBlIDw8IDI4IHwgcmVmLlNBUF9kZWx0YV90aW1lKTsKCQl9Cgl9OwoKCS8vIGZpbGU6c3JjL3dyaXRpbmcvc21oZC5qcwoJQm94UGFyc2VyLnNtaGRCb3gucHJvdG90eXBlLndyaXRlID0gZnVuY3Rpb24oc3RyZWFtKSB7CgkgIHRoaXMudmVyc2lvbiA9IDA7CgkgIHRoaXMuZmxhZ3MgPSAxOwoJICB0aGlzLnNpemUgPSA0OwoJICB0aGlzLndyaXRlSGVhZGVyKHN0cmVhbSk7CgkgIHN0cmVhbS53cml0ZVVpbnQxNih0aGlzLmJhbGFuY2UpOwoJICBzdHJlYW0ud3JpdGVVaW50MTYoMCk7Cgl9OwoJLy8gZmlsZTpzcmMvd3JpdGluZy9zdGNvLmpzCglCb3hQYXJzZXIuc3Rjb0JveC5wcm90b3R5cGUud3JpdGUgPSBmdW5jdGlvbihzdHJlYW0pIHsKCQl0aGlzLnZlcnNpb24gPSAwOwoJCXRoaXMuZmxhZ3MgPSAwOwoJCXRoaXMuc2l6ZSA9IDQrNCp0aGlzLmNodW5rX29mZnNldHMubGVuZ3RoOwoJCXRoaXMud3JpdGVIZWFkZXIoc3RyZWFtKTsKCQlzdHJlYW0ud3JpdGVVaW50MzIodGhpcy5jaHVua19vZmZzZXRzLmxlbmd0aCk7CgkJc3RyZWFtLndyaXRlVWludDMyQXJyYXkodGhpcy5jaHVua19vZmZzZXRzKTsKCX07CgoJLy8gZmlsZTpzcmMvd3JpdGluZy9zdHNjLmpzCglCb3hQYXJzZXIuc3RzY0JveC5wcm90b3R5cGUud3JpdGUgPSBmdW5jdGlvbihzdHJlYW0pIHsKCQl2YXIgaTsKCQl0aGlzLnZlcnNpb24gPSAwOwoJCXRoaXMuZmxhZ3MgPSAwOwoJCXRoaXMuc2l6ZSA9IDQrMTIqdGhpcy5maXJzdF9jaHVuay5sZW5ndGg7CgkJdGhpcy53cml0ZUhlYWRlcihzdHJlYW0pOwoJCXN0cmVhbS53cml0ZVVpbnQzMih0aGlzLmZpcnN0X2NodW5rLmxlbmd0aCk7CgkJZm9yKGk9MDsgaTx0aGlzLmZpcnN0X2NodW5rLmxlbmd0aDsgaSsrKSB7CgkJCXN0cmVhbS53cml0ZVVpbnQzMih0aGlzLmZpcnN0X2NodW5rW2ldKTsKCQkJc3RyZWFtLndyaXRlVWludDMyKHRoaXMuc2FtcGxlc19wZXJfY2h1bmtbaV0pOwoJCQlzdHJlYW0ud3JpdGVVaW50MzIodGhpcy5zYW1wbGVfZGVzY3JpcHRpb25faW5kZXhbaV0pOwoJCX0KCX07CgoJLy8gZmlsZTpzcmMvd3JpdGluZy9zdHNkLmpzCglCb3hQYXJzZXIuc3RzZEJveC5wcm90b3R5cGUud3JpdGUgPSBmdW5jdGlvbihzdHJlYW0pIHsKCQl2YXIgaTsKCQl0aGlzLnZlcnNpb24gPSAwOwoJCXRoaXMuZmxhZ3MgPSAwOwoJCXRoaXMuc2l6ZSA9IDA7CgkJdGhpcy53cml0ZUhlYWRlcihzdHJlYW0pOwoJCXN0cmVhbS53cml0ZVVpbnQzMih0aGlzLmVudHJpZXMubGVuZ3RoKTsKCQl0aGlzLnNpemUgKz0gNDsKCQlmb3IgKGkgPSAwOyBpIDwgdGhpcy5lbnRyaWVzLmxlbmd0aDsgaSsrKSB7CgkJCXRoaXMuZW50cmllc1tpXS53cml0ZShzdHJlYW0pOwoJCQl0aGlzLnNpemUgKz0gdGhpcy5lbnRyaWVzW2ldLnNpemU7CgkJfQoJCS8qIGFkanVzdGluZyB0aGUgc2l6ZSwgbm93IHRoYXQgYWxsIHN1Yi1ib3hlcyBhcmUga25vd24gKi8KCQlMb2cuZGVidWcoIkJveFdyaXRlciIsICJBZGp1c3RpbmcgYm94ICIrdGhpcy50eXBlKyIgd2l0aCBuZXcgc2l6ZSAiK3RoaXMuc2l6ZSk7CgkJc3RyZWFtLmFkanVzdFVpbnQzMih0aGlzLnNpemVQb3NpdGlvbiwgdGhpcy5zaXplKTsKCX07CgoJLy8gZmlsZTpzcmMvd3JpdGluZy9zdHNoLmpzCglCb3hQYXJzZXIuc3RzaEJveC5wcm90b3R5cGUud3JpdGUgPSBmdW5jdGlvbihzdHJlYW0pIHsKCQl2YXIgaTsKCQl0aGlzLnZlcnNpb24gPSAwOwoJCXRoaXMuZmxhZ3MgPSAwOwoJCXRoaXMuc2l6ZSA9IDQrOCp0aGlzLnNoYWRvd2VkX3NhbXBsZV9udW1iZXJzLmxlbmd0aDsKCQl0aGlzLndyaXRlSGVhZGVyKHN0cmVhbSk7CgkJc3RyZWFtLndyaXRlVWludDMyKHRoaXMuc2hhZG93ZWRfc2FtcGxlX251bWJlcnMubGVuZ3RoKTsKCQlmb3IoaT0wOyBpPHRoaXMuc2hhZG93ZWRfc2FtcGxlX251bWJlcnMubGVuZ3RoOyBpKyspIHsKCQkJc3RyZWFtLndyaXRlVWludDMyKHRoaXMuc2hhZG93ZWRfc2FtcGxlX251bWJlcnNbaV0pOwoJCQlzdHJlYW0ud3JpdGVVaW50MzIodGhpcy5zeW5jX3NhbXBsZV9udW1iZXJzW2ldKTsKCQl9Cgl9OwoKCS8vIGZpbGU6c3JjL3dyaXRpbmcvc3Rzcy5qcwoJQm94UGFyc2VyLnN0c3NCb3gucHJvdG90eXBlLndyaXRlID0gZnVuY3Rpb24oc3RyZWFtKSB7CgkJdGhpcy52ZXJzaW9uID0gMDsKCQl0aGlzLmZsYWdzID0gMDsKCQl0aGlzLnNpemUgPSA0KzQqdGhpcy5zYW1wbGVfbnVtYmVycy5sZW5ndGg7CgkJdGhpcy53cml0ZUhlYWRlcihzdHJlYW0pOwoJCXN0cmVhbS53cml0ZVVpbnQzMih0aGlzLnNhbXBsZV9udW1iZXJzLmxlbmd0aCk7CgkJc3RyZWFtLndyaXRlVWludDMyQXJyYXkodGhpcy5zYW1wbGVfbnVtYmVycyk7Cgl9OwoKCS8vIGZpbGU6c3JjL3dyaXRpbmcvc3Rzei5qcwoJQm94UGFyc2VyLnN0c3pCb3gucHJvdG90eXBlLndyaXRlID0gZnVuY3Rpb24oc3RyZWFtKSB7CgkJdmFyIGk7CgkJdmFyIGNvbnN0YW50ID0gdHJ1ZTsKCQl0aGlzLnZlcnNpb24gPSAwOwoJCXRoaXMuZmxhZ3MgPSAwOwoJCWlmICh0aGlzLnNhbXBsZV9zaXplcy5sZW5ndGggPiAwKSB7CgkJCWkgPSAwOwoJCQl3aGlsZSAoaSsxIDwgdGhpcy5zYW1wbGVfc2l6ZXMubGVuZ3RoKSB7CgkJCQlpZiAodGhpcy5zYW1wbGVfc2l6ZXNbaSsxXSAhPT0gIHRoaXMuc2FtcGxlX3NpemVzWzBdKSB7CgkJCQkJY29uc3RhbnQgPSBmYWxzZTsKCQkJCQlicmVhazsKCQkJCX0gZWxzZSB7CgkJCQkJaSsrOwoJCQkJfQoJCQl9CgkJfSBlbHNlIHsKCQkJY29uc3RhbnQgPSBmYWxzZTsKCQl9CgkJdGhpcy5zaXplID0gODsKCQlpZiAoIWNvbnN0YW50KSB7CgkJCXRoaXMuc2l6ZSArPSA0KnRoaXMuc2FtcGxlX3NpemVzLmxlbmd0aDsKCQl9CgkJdGhpcy53cml0ZUhlYWRlcihzdHJlYW0pOwoJCWlmICghY29uc3RhbnQpIHsKCQkJc3RyZWFtLndyaXRlVWludDMyKDApOwoJCX0gZWxzZSB7CgkJCXN0cmVhbS53cml0ZVVpbnQzMih0aGlzLnNhbXBsZV9zaXplc1swXSk7CgkJfQoJCXN0cmVhbS53cml0ZVVpbnQzMih0aGlzLnNhbXBsZV9zaXplcy5sZW5ndGgpOwoJCWlmICghY29uc3RhbnQpIHsKCQkJc3RyZWFtLndyaXRlVWludDMyQXJyYXkodGhpcy5zYW1wbGVfc2l6ZXMpOwoJCX0JCgl9OwoKCS8vIGZpbGU6c3JjL3dyaXRpbmcvc3R0cy5qcwoJQm94UGFyc2VyLnN0dHNCb3gucHJvdG90eXBlLndyaXRlID0gZnVuY3Rpb24oc3RyZWFtKSB7CgkJdmFyIGk7CgkJdGhpcy52ZXJzaW9uID0gMDsKCQl0aGlzLmZsYWdzID0gMDsKCQl0aGlzLnNpemUgPSA0KzgqdGhpcy5zYW1wbGVfY291bnRzLmxlbmd0aDsKCQl0aGlzLndyaXRlSGVhZGVyKHN0cmVhbSk7CgkJc3RyZWFtLndyaXRlVWludDMyKHRoaXMuc2FtcGxlX2NvdW50cy5sZW5ndGgpOwoJCWZvcihpPTA7IGk8dGhpcy5zYW1wbGVfY291bnRzLmxlbmd0aDsgaSsrKSB7CgkJCXN0cmVhbS53cml0ZVVpbnQzMih0aGlzLnNhbXBsZV9jb3VudHNbaV0pOwoJCQlzdHJlYW0ud3JpdGVVaW50MzIodGhpcy5zYW1wbGVfZGVsdGFzW2ldKTsKCQl9Cgl9OwoKCS8vIGZpbGU6c3JjL3dyaXRpbmcvdGZkdC5qcwoJQm94UGFyc2VyLnRmZHRCb3gucHJvdG90eXBlLndyaXRlID0gZnVuY3Rpb24oc3RyZWFtKSB7CgkJdmFyIFVJTlQzMl9NQVggPSBNYXRoLnBvdygyLCAzMikgLSAxOwoJCS8vIHVzZSB2ZXJzaW9uIDEgaWYgYmFzZU1lZGlhRGVjb2RlVGltZSBkb2VzIG5vdCBmaXQgMzIgYml0cwoJCXRoaXMudmVyc2lvbiA9IHRoaXMuYmFzZU1lZGlhRGVjb2RlVGltZSA+IFVJTlQzMl9NQVggPyAxIDogMDsKCQl0aGlzLmZsYWdzID0gMDsKCQl0aGlzLnNpemUgPSA0OwoJCWlmICh0aGlzLnZlcnNpb24gPT09IDEpIHsKCQkJdGhpcy5zaXplICs9IDQ7CgkJfQoJCXRoaXMud3JpdGVIZWFkZXIoc3RyZWFtKTsKCQlpZiAodGhpcy52ZXJzaW9uID09PSAxKSB7CgkJCXN0cmVhbS53cml0ZVVpbnQ2NCh0aGlzLmJhc2VNZWRpYURlY29kZVRpbWUpOwoJCX0gZWxzZSB7CgkJCXN0cmVhbS53cml0ZVVpbnQzMih0aGlzLmJhc2VNZWRpYURlY29kZVRpbWUpOwoJCX0KCX07CgoJLy8gZmlsZTpzcmMvd3JpdGluZy90ZmhkLmpzCglCb3hQYXJzZXIudGZoZEJveC5wcm90b3R5cGUud3JpdGUgPSBmdW5jdGlvbihzdHJlYW0pIHsKCQl0aGlzLnZlcnNpb24gPSAwOwoJCXRoaXMuc2l6ZSA9IDQ7CgkJaWYgKHRoaXMuZmxhZ3MgJiBCb3hQYXJzZXIuVEZIRF9GTEFHX0JBU0VfREFUQV9PRkZTRVQpIHsKCQkJdGhpcy5zaXplICs9IDg7CgkJfQoJCWlmICh0aGlzLmZsYWdzICYgQm94UGFyc2VyLlRGSERfRkxBR19TQU1QTEVfREVTQykgewoJCQl0aGlzLnNpemUgKz0gNDsKCQl9CgkJaWYgKHRoaXMuZmxhZ3MgJiBCb3hQYXJzZXIuVEZIRF9GTEFHX1NBTVBMRV9EVVIpIHsKCQkJdGhpcy5zaXplICs9IDQ7CgkJfQoJCWlmICh0aGlzLmZsYWdzICYgQm94UGFyc2VyLlRGSERfRkxBR19TQU1QTEVfU0laRSkgewoJCQl0aGlzLnNpemUgKz0gNDsKCQl9CgkJaWYgKHRoaXMuZmxhZ3MgJiBCb3hQYXJzZXIuVEZIRF9GTEFHX1NBTVBMRV9GTEFHUykgewoJCQl0aGlzLnNpemUgKz0gNDsKCQl9CgkJdGhpcy53cml0ZUhlYWRlcihzdHJlYW0pOwoJCXN0cmVhbS53cml0ZVVpbnQzMih0aGlzLnRyYWNrX2lkKTsKCQlpZiAodGhpcy5mbGFncyAmIEJveFBhcnNlci5URkhEX0ZMQUdfQkFTRV9EQVRBX09GRlNFVCkgewoJCQlzdHJlYW0ud3JpdGVVaW50NjQodGhpcy5iYXNlX2RhdGFfb2Zmc2V0KTsKCQl9CgkJaWYgKHRoaXMuZmxhZ3MgJiBCb3hQYXJzZXIuVEZIRF9GTEFHX1NBTVBMRV9ERVNDKSB7CgkJCXN0cmVhbS53cml0ZVVpbnQzMih0aGlzLmRlZmF1bHRfc2FtcGxlX2Rlc2NyaXB0aW9uX2luZGV4KTsKCQl9CgkJaWYgKHRoaXMuZmxhZ3MgJiBCb3hQYXJzZXIuVEZIRF9GTEFHX1NBTVBMRV9EVVIpIHsKCQkJc3RyZWFtLndyaXRlVWludDMyKHRoaXMuZGVmYXVsdF9zYW1wbGVfZHVyYXRpb24pOwoJCX0KCQlpZiAodGhpcy5mbGFncyAmIEJveFBhcnNlci5URkhEX0ZMQUdfU0FNUExFX1NJWkUpIHsKCQkJc3RyZWFtLndyaXRlVWludDMyKHRoaXMuZGVmYXVsdF9zYW1wbGVfc2l6ZSk7CgkJfQoJCWlmICh0aGlzLmZsYWdzICYgQm94UGFyc2VyLlRGSERfRkxBR19TQU1QTEVfRkxBR1MpIHsKCQkJc3RyZWFtLndyaXRlVWludDMyKHRoaXMuZGVmYXVsdF9zYW1wbGVfZmxhZ3MpOwoJCX0KCX07CgoJLy8gZmlsZTpzcmMvd3JpdGluZy90a2hkLmpzCglCb3hQYXJzZXIudGtoZEJveC5wcm90b3R5cGUud3JpdGUgPSBmdW5jdGlvbihzdHJlYW0pIHsKCQl0aGlzLnZlcnNpb24gPSAwOwoJCS8vdGhpcy5mbGFncyA9IDA7CgkJdGhpcy5zaXplID0gNCoxOCsyKjQ7CgkJdGhpcy53cml0ZUhlYWRlcihzdHJlYW0pOwoJCXN0cmVhbS53cml0ZVVpbnQzMih0aGlzLmNyZWF0aW9uX3RpbWUpOwoJCXN0cmVhbS53cml0ZVVpbnQzMih0aGlzLm1vZGlmaWNhdGlvbl90aW1lKTsKCQlzdHJlYW0ud3JpdGVVaW50MzIodGhpcy50cmFja19pZCk7CgkJc3RyZWFtLndyaXRlVWludDMyKDApOwoJCXN0cmVhbS53cml0ZVVpbnQzMih0aGlzLmR1cmF0aW9uKTsKCQlzdHJlYW0ud3JpdGVVaW50MzIoMCk7CgkJc3RyZWFtLndyaXRlVWludDMyKDApOwoJCXN0cmVhbS53cml0ZUludDE2KHRoaXMubGF5ZXIpOwoJCXN0cmVhbS53cml0ZUludDE2KHRoaXMuYWx0ZXJuYXRlX2dyb3VwKTsKCQlzdHJlYW0ud3JpdGVJbnQxNih0aGlzLnZvbHVtZTw8OCk7CgkJc3RyZWFtLndyaXRlVWludDE2KDApOwoJCXN0cmVhbS53cml0ZUludDMyQXJyYXkodGhpcy5tYXRyaXgpOwoJCXN0cmVhbS53cml0ZVVpbnQzMih0aGlzLndpZHRoKTsKCQlzdHJlYW0ud3JpdGVVaW50MzIodGhpcy5oZWlnaHQpOwoJfTsKCgkvLyBmaWxlOnNyYy93cml0aW5nL3RyZXguanMKCUJveFBhcnNlci50cmV4Qm94LnByb3RvdHlwZS53cml0ZSA9IGZ1bmN0aW9uKHN0cmVhbSkgewoJCXRoaXMudmVyc2lvbiA9IDA7CgkJdGhpcy5mbGFncyA9IDA7CgkJdGhpcy5zaXplID0gNCo1OwoJCXRoaXMud3JpdGVIZWFkZXIoc3RyZWFtKTsKCQlzdHJlYW0ud3JpdGVVaW50MzIodGhpcy50cmFja19pZCk7CgkJc3RyZWFtLndyaXRlVWludDMyKHRoaXMuZGVmYXVsdF9zYW1wbGVfZGVzY3JpcHRpb25faW5kZXgpOwoJCXN0cmVhbS53cml0ZVVpbnQzMih0aGlzLmRlZmF1bHRfc2FtcGxlX2R1cmF0aW9uKTsKCQlzdHJlYW0ud3JpdGVVaW50MzIodGhpcy5kZWZhdWx0X3NhbXBsZV9zaXplKTsKCQlzdHJlYW0ud3JpdGVVaW50MzIodGhpcy5kZWZhdWx0X3NhbXBsZV9mbGFncyk7Cgl9OwoKCS8vIGZpbGU6c3JjL3dyaXRpbmcvdHJ1bi5qcwoJQm94UGFyc2VyLnRydW5Cb3gucHJvdG90eXBlLndyaXRlID0gZnVuY3Rpb24oc3RyZWFtKSB7CgkJdGhpcy52ZXJzaW9uID0gMDsKCQl0aGlzLnNpemUgPSA0OwoJCWlmICh0aGlzLmZsYWdzICYgQm94UGFyc2VyLlRSVU5fRkxBR1NfREFUQV9PRkZTRVQpIHsKCQkJdGhpcy5zaXplICs9IDQ7CgkJfQoJCWlmICh0aGlzLmZsYWdzICYgQm94UGFyc2VyLlRSVU5fRkxBR1NfRklSU1RfRkxBRykgewoJCQl0aGlzLnNpemUgKz0gNDsKCQl9CgkJaWYgKHRoaXMuZmxhZ3MgJiBCb3hQYXJzZXIuVFJVTl9GTEFHU19EVVJBVElPTikgewoJCQl0aGlzLnNpemUgKz0gNCp0aGlzLnNhbXBsZV9kdXJhdGlvbi5sZW5ndGg7CgkJfQoJCWlmICh0aGlzLmZsYWdzICYgQm94UGFyc2VyLlRSVU5fRkxBR1NfU0laRSkgewoJCQl0aGlzLnNpemUgKz0gNCp0aGlzLnNhbXBsZV9zaXplLmxlbmd0aDsKCQl9CgkJaWYgKHRoaXMuZmxhZ3MgJiBCb3hQYXJzZXIuVFJVTl9GTEFHU19GTEFHUykgewoJCQl0aGlzLnNpemUgKz0gNCp0aGlzLnNhbXBsZV9mbGFncy5sZW5ndGg7CgkJfQoJCWlmICh0aGlzLmZsYWdzICYgQm94UGFyc2VyLlRSVU5fRkxBR1NfQ1RTX09GRlNFVCkgewoJCQl0aGlzLnNpemUgKz0gNCp0aGlzLnNhbXBsZV9jb21wb3NpdGlvbl90aW1lX29mZnNldC5sZW5ndGg7CgkJfQoJCXRoaXMud3JpdGVIZWFkZXIoc3RyZWFtKTsKCQlzdHJlYW0ud3JpdGVVaW50MzIodGhpcy5zYW1wbGVfY291bnQpOwoJCWlmICh0aGlzLmZsYWdzICYgQm94UGFyc2VyLlRSVU5fRkxBR1NfREFUQV9PRkZTRVQpIHsKCQkJdGhpcy5kYXRhX29mZnNldF9wb3NpdGlvbiA9IHN0cmVhbS5nZXRQb3NpdGlvbigpOwoJCQlzdHJlYW0ud3JpdGVJbnQzMih0aGlzLmRhdGFfb2Zmc2V0KTsgLy9zaWduZWQKCQl9CgkJaWYgKHRoaXMuZmxhZ3MgJiBCb3hQYXJzZXIuVFJVTl9GTEFHU19GSVJTVF9GTEFHKSB7CgkJCXN0cmVhbS53cml0ZVVpbnQzMih0aGlzLmZpcnN0X3NhbXBsZV9mbGFncyk7CgkJfQoJCWZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5zYW1wbGVfY291bnQ7IGkrKykgewoJCQlpZiAodGhpcy5mbGFncyAmIEJveFBhcnNlci5UUlVOX0ZMQUdTX0RVUkFUSU9OKSB7CgkJCQlzdHJlYW0ud3JpdGVVaW50MzIodGhpcy5zYW1wbGVfZHVyYXRpb25baV0pOwoJCQl9CgkJCWlmICh0aGlzLmZsYWdzICYgQm94UGFyc2VyLlRSVU5fRkxBR1NfU0laRSkgewoJCQkJc3RyZWFtLndyaXRlVWludDMyKHRoaXMuc2FtcGxlX3NpemVbaV0pOwoJCQl9CgkJCWlmICh0aGlzLmZsYWdzICYgQm94UGFyc2VyLlRSVU5fRkxBR1NfRkxBR1MpIHsKCQkJCXN0cmVhbS53cml0ZVVpbnQzMih0aGlzLnNhbXBsZV9mbGFnc1tpXSk7CgkJCX0KCQkJaWYgKHRoaXMuZmxhZ3MgJiBCb3hQYXJzZXIuVFJVTl9GTEFHU19DVFNfT0ZGU0VUKSB7CgkJCQlpZiAodGhpcy52ZXJzaW9uID09PSAwKSB7CgkJCQkJc3RyZWFtLndyaXRlVWludDMyKHRoaXMuc2FtcGxlX2NvbXBvc2l0aW9uX3RpbWVfb2Zmc2V0W2ldKTsKCQkJCX0gZWxzZSB7CgkJCQkJc3RyZWFtLndyaXRlSW50MzIodGhpcy5zYW1wbGVfY29tcG9zaXRpb25fdGltZV9vZmZzZXRbaV0pOyAvL3NpZ25lZAoJCQkJfQoJCQl9CgkJfQkJCgl9OwoKCS8vIGZpbGU6c3JjL3dyaXRpbmcvdXJsLmpzCglCb3hQYXJzZXJbInVybCBCb3giXS5wcm90b3R5cGUud3JpdGUgPSBmdW5jdGlvbihzdHJlYW0pIHsKCQl0aGlzLnZlcnNpb24gPSAwOwkKCQlpZiAodGhpcy5sb2NhdGlvbikgewoJCQl0aGlzLmZsYWdzID0gMDsKCQkJdGhpcy5zaXplID0gdGhpcy5sb2NhdGlvbi5sZW5ndGgrMTsKCQl9IGVsc2UgewoJCQl0aGlzLmZsYWdzID0gMHgwMDAwMDE7CgkJCXRoaXMuc2l6ZSA9IDA7CgkJfQoJCXRoaXMud3JpdGVIZWFkZXIoc3RyZWFtKTsKCQlpZiAodGhpcy5sb2NhdGlvbikgewoJCQlzdHJlYW0ud3JpdGVDU3RyaW5nKHRoaXMubG9jYXRpb24pOwoJCX0KCX07CgoJLy8gZmlsZTpzcmMvd3JpdGluZy91cm4uanMKCUJveFBhcnNlclsidXJuIEJveCJdLnByb3RvdHlwZS53cml0ZSA9IGZ1bmN0aW9uKHN0cmVhbSkgewoJCXRoaXMudmVyc2lvbiA9IDA7CQoJCXRoaXMuZmxhZ3MgPSAwOwoJCXRoaXMuc2l6ZSA9IHRoaXMubmFtZS5sZW5ndGgrMSsodGhpcy5sb2NhdGlvbiA/IHRoaXMubG9jYXRpb24ubGVuZ3RoKzEgOiAwKTsKCQl0aGlzLndyaXRlSGVhZGVyKHN0cmVhbSk7CgkJc3RyZWFtLndyaXRlQ1N0cmluZyh0aGlzLm5hbWUpOwoJCWlmICh0aGlzLmxvY2F0aW9uKSB7CgkJCXN0cmVhbS53cml0ZUNTdHJpbmcodGhpcy5sb2NhdGlvbik7CgkJfQoJfTsKCgkvLyBmaWxlOnNyYy93cml0aW5nL3ZtaGQuanMKCUJveFBhcnNlci52bWhkQm94LnByb3RvdHlwZS53cml0ZSA9IGZ1bmN0aW9uKHN0cmVhbSkgewoJCXRoaXMudmVyc2lvbiA9IDA7CgkJdGhpcy5mbGFncyA9IDE7CgkJdGhpcy5zaXplID0gODsKCQl0aGlzLndyaXRlSGVhZGVyKHN0cmVhbSk7CgkJc3RyZWFtLndyaXRlVWludDE2KHRoaXMuZ3JhcGhpY3Ntb2RlKTsKCQlzdHJlYW0ud3JpdGVVaW50MTZBcnJheSh0aGlzLm9wY29sb3IpOwoJfTsKCgkvLyBmaWxlOnNyYy9ib3gtdW5wYWNrLmpzCgkvKiAKCSAqIENvcHlyaWdodCAoYykgVGVsZWNvbSBQYXJpc1RlY2gvVFNJL01NL0dQQUMgQ3lyaWwgQ29uY29sYXRvCgkgKiBMaWNlbnNlOiBCU0QtMy1DbGF1c2UgKHNlZSBMSUNFTlNFIGZpbGUpCgkgKi8KCUJveFBhcnNlci5jdHRzQm94LnByb3RvdHlwZS51bnBhY2sgPSBmdW5jdGlvbihzYW1wbGVzKSB7CgkJdmFyIGksIGosIGs7CgkJayA9IDA7CgkJZm9yIChpID0gMDsgaSA8IHRoaXMuc2FtcGxlX2NvdW50cy5sZW5ndGg7IGkrKykgewoJCQlmb3IgKGogPSAwOyBqIDwgdGhpcy5zYW1wbGVfY291bnRzW2ldOyBqKyspIHsKCQkJCXNhbXBsZXNba10ucHRzID0gc2FtcGxlc1trXS5kdHMgKyB0aGlzLnNhbXBsZV9vZmZzZXRzW2ldOwoJCQkJaysrOwoJCQl9CgkJfQoJfTsKCglCb3hQYXJzZXIuc3R0c0JveC5wcm90b3R5cGUudW5wYWNrID0gZnVuY3Rpb24oc2FtcGxlcykgewoJCXZhciBpLCBqLCBrOwoJCWsgPSAwOwoJCWZvciAoaSA9IDA7IGkgPCB0aGlzLnNhbXBsZV9jb3VudHMubGVuZ3RoOyBpKyspIHsKCQkJZm9yIChqID0gMDsgaiA8IHRoaXMuc2FtcGxlX2NvdW50c1tpXTsgaisrKSB7CgkJCQlpZiAoayA9PT0gMCkgewoJCQkJCXNhbXBsZXNba10uZHRzID0gMDsKCQkJCX0gZWxzZSB7CgkJCQkJc2FtcGxlc1trXS5kdHMgPSBzYW1wbGVzW2stMV0uZHRzICsgdGhpcy5zYW1wbGVfZGVsdGFzW2ldOwoJCQkJfQoJCQkJaysrOwoJCQl9CgkJfQoJfTsKCglCb3hQYXJzZXIuc3Rjb0JveC5wcm90b3R5cGUudW5wYWNrID0gZnVuY3Rpb24oc2FtcGxlcykgewoJCXZhciBpOwoJCWZvciAoaSA9IDA7IGkgPCB0aGlzLmNodW5rX29mZnNldHMubGVuZ3RoOyBpKyspIHsKCQkJc2FtcGxlc1tpXS5vZmZzZXQgPSB0aGlzLmNodW5rX29mZnNldHNbaV07CgkJfQoJfTsKCglCb3hQYXJzZXIuc3RzY0JveC5wcm90b3R5cGUudW5wYWNrID0gZnVuY3Rpb24oc2FtcGxlcykgewoJCXZhciBpLCBqLCBrLCBsLCBtOwoJCWwgPSAwOwoJCW0gPSAwOwoJCWZvciAoaSA9IDA7IGkgPCB0aGlzLmZpcnN0X2NodW5rLmxlbmd0aDsgaSsrKSB7CgkJCWZvciAoaiA9IDA7IGogPCAoaSsxIDwgdGhpcy5maXJzdF9jaHVuay5sZW5ndGggPyB0aGlzLmZpcnN0X2NodW5rW2krMV0gOiBJbmZpbml0eSk7IGorKykgewoJCQkJbSsrOwoJCQkJZm9yIChrID0gMDsgayA8IHRoaXMuc2FtcGxlc19wZXJfY2h1bmtbaV07IGsrKykgewoJCQkJCWlmIChzYW1wbGVzW2xdKSB7CgkJCQkJCXNhbXBsZXNbbF0uZGVzY3JpcHRpb25faW5kZXggPSB0aGlzLnNhbXBsZV9kZXNjcmlwdGlvbl9pbmRleFtpXTsKCQkJCQkJc2FtcGxlc1tsXS5jaHVua19pbmRleCA9IG07CgkJCQkJfSBlbHNlIHsKCQkJCQkJcmV0dXJuOwoJCQkJCX0KCQkJCQlsKys7CgkJCQl9CQkJCgkJCX0KCQl9Cgl9OwoKCUJveFBhcnNlci5zdHN6Qm94LnByb3RvdHlwZS51bnBhY2sgPSBmdW5jdGlvbihzYW1wbGVzKSB7CgkJdmFyIGk7CgkJZm9yIChpID0gMDsgaSA8IHRoaXMuc2FtcGxlX3NpemVzLmxlbmd0aDsgaSsrKSB7CgkJCXNhbXBsZXNbaV0uc2l6ZSA9IHRoaXMuc2FtcGxlX3NpemVzW2ldOwoJCX0KCX07CgkvLyBmaWxlOnNyYy9ib3gtZGlmZi5qcwoKCUJveFBhcnNlci5ESUZGX0JPWEVTX1BST1BfTkFNRVMgPSBbICJib3hlcyIsICJlbnRyaWVzIiwgInJlZmVyZW5jZXMiLCAic3Vic2FtcGxlcyIsCgkJCQkJCSAJICJpdGVtcyIsICJpdGVtX2luZm9zIiwgImV4dGVudHMiLCAiYXNzb2NpYXRpb25zIiwKCQkJCQkJIAkgInN1YnNlZ21lbnRzIiwgInJhbmdlcyIsICJzZWVrTGlzdHMiLCAic2Vla1BvaW50cyIsCgkJCQkJCSAJICJlc2QiLCAibGV2ZWxzIl07CgoJQm94UGFyc2VyLkRJRkZfUFJJTUlUSVZFX0FSUkFZX1BST1BfTkFNRVMgPSBbICJjb21wYXRpYmxlX2JyYW5kcyIsICJtYXRyaXgiLCAib3Bjb2xvciIsICJzYW1wbGVfY291bnRzIiwgInNhbXBsZV9jb3VudHMiLCAic2FtcGxlX2RlbHRhcyIsCgkiZmlyc3RfY2h1bmsiLCAic2FtcGxlc19wZXJfY2h1bmsiLCAic2FtcGxlX3NpemVzIiwgImNodW5rX29mZnNldHMiLCAic2FtcGxlX29mZnNldHMiLCAic2FtcGxlX2Rlc2NyaXB0aW9uX2luZGV4IiwgInNhbXBsZV9kdXJhdGlvbiIgXTsKCglCb3hQYXJzZXIuYm94RXF1YWxGaWVsZHMgPSBmdW5jdGlvbihib3hfYSwgYm94X2IpIHsKCQlpZiAoYm94X2EgJiYgIWJveF9iKSByZXR1cm4gZmFsc2U7CgkJdmFyIHByb3A7CgkJZm9yIChwcm9wIGluIGJveF9hKSB7CgkJCWlmIChCb3hQYXJzZXIuRElGRl9CT1hFU19QUk9QX05BTUVTLmluZGV4T2YocHJvcCkgPiAtMSkgewoJCQkJY29udGludWU7CgkJCS8vIH0gZWxzZSBpZiAoZXhjbHVkZWRfZmllbGRzICYmIGV4Y2x1ZGVkX2ZpZWxkcy5pbmRleE9mKHByb3ApID4gLTEpIHsKCQkJLy8gCWNvbnRpbnVlOwoJCQl9IGVsc2UgaWYgKGJveF9hW3Byb3BdIGluc3RhbmNlb2YgQm94UGFyc2VyLkJveCB8fCBib3hfYltwcm9wXSBpbnN0YW5jZW9mIEJveFBhcnNlci5Cb3gpIHsKCQkJCWNvbnRpbnVlOwoJCQl9IGVsc2UgaWYgKHR5cGVvZiBib3hfYVtwcm9wXSA9PT0gInVuZGVmaW5lZCIgfHwgdHlwZW9mIGJveF9iW3Byb3BdID09PSAidW5kZWZpbmVkIikgewoJCQkJY29udGludWU7CgkJCX0gZWxzZSBpZiAodHlwZW9mIGJveF9hW3Byb3BdID09PSAiZnVuY3Rpb24iIHx8IHR5cGVvZiBib3hfYltwcm9wXSA9PT0gImZ1bmN0aW9uIikgewoJCQkJY29udGludWU7CgkJCX0gZWxzZSBpZiAoCgkJCQkoYm94X2Euc3ViQm94TmFtZXMgJiYgYm94X2Euc3ViQm94TmFtZXMuaW5kZXhPZihwcm9wLnNsaWNlKDAsNCkpID4gLTEpIHx8CgkJCQkoYm94X2Iuc3ViQm94TmFtZXMgJiYgYm94X2Iuc3ViQm94TmFtZXMuaW5kZXhPZihwcm9wLnNsaWNlKDAsNCkpID4gLTEpKSAgewoJCQkJY29udGludWU7CgkJCX0gZWxzZSB7CgkJCQlpZiAocHJvcCA9PT0gImRhdGEiIHx8IHByb3AgPT09ICJzdGFydCIgfHwgcHJvcCA9PT0gInNpemUiIHx8IHByb3AgPT09ICJjcmVhdGlvbl90aW1lIiB8fCBwcm9wID09PSAibW9kaWZpY2F0aW9uX3RpbWUiKSB7CgkJCQkJY29udGludWU7CgkJCQl9IGVsc2UgaWYgKEJveFBhcnNlci5ESUZGX1BSSU1JVElWRV9BUlJBWV9QUk9QX05BTUVTLmluZGV4T2YocHJvcCkgPiAtMSkgewoJCQkJCWNvbnRpbnVlOwoJCQkJfSBlbHNlIHsKCQkJCQlpZiAoYm94X2FbcHJvcF0gIT09IGJveF9iW3Byb3BdKSB7CgkJCQkJCXJldHVybiBmYWxzZTsKCQkJCQl9CgkJCQl9CgkJCX0KCQl9CgkJcmV0dXJuIHRydWU7Cgl9OwoKCUJveFBhcnNlci5ib3hFcXVhbCA9IGZ1bmN0aW9uKGJveF9hLCBib3hfYikgewoJCWlmICghQm94UGFyc2VyLmJveEVxdWFsRmllbGRzKGJveF9hLCBib3hfYikpIHsKCQkJcmV0dXJuIGZhbHNlOwoJCX0KCQlmb3IgKHZhciBqID0gMDsgaiA8IEJveFBhcnNlci5ESUZGX0JPWEVTX1BST1BfTkFNRVMubGVuZ3RoOyBqKyspIHsKCQkJdmFyIG5hbWUgPSBCb3hQYXJzZXIuRElGRl9CT1hFU19QUk9QX05BTUVTW2pdOwoJCQlpZiAoYm94X2FbbmFtZV0gJiYgYm94X2JbbmFtZV0pIHsKCQkJCWlmICghQm94UGFyc2VyLmJveEVxdWFsKGJveF9hW25hbWVdLCBib3hfYltuYW1lXSkpIHsKCQkJCQlyZXR1cm4gZmFsc2U7CgkJCQl9CgkJCX0KCQl9CgkJcmV0dXJuIHRydWU7Cgl9Oy8vIGZpbGU6c3JjL3RleHQtbXA0LmpzCgoJdmFyIFhNTFN1YnRpdGxlaW40UGFyc2VyID0gZnVuY3Rpb24oKSB7CQoJfTsKCglYTUxTdWJ0aXRsZWluNFBhcnNlci5wcm90b3R5cGUucGFyc2VTYW1wbGUgPSBmdW5jdGlvbihzYW1wbGUpIHsKCQl2YXIgcmVzID0ge307CQoJCXZhciBpOwoJCXJlcy5yZXNvdXJjZXMgPSBbXTsKCQl2YXIgc3RyZWFtID0gbmV3IE1QNEJveFN0cmVhbShzYW1wbGUuZGF0YS5idWZmZXIpOwoJCWlmICghc2FtcGxlLnN1YnNhbXBsZXMgfHwgc2FtcGxlLnN1YnNhbXBsZXMubGVuZ3RoID09PSAwKSB7CgkJCXJlcy5kb2N1bWVudFN0cmluZyA9IHN0cmVhbS5yZWFkU3RyaW5nKHNhbXBsZS5kYXRhLmxlbmd0aCk7CgkJfSBlbHNlIHsKCQkJcmVzLmRvY3VtZW50U3RyaW5nID0gc3RyZWFtLnJlYWRTdHJpbmcoc2FtcGxlLnN1YnNhbXBsZXNbMF0uc2l6ZSk7CgkJCWlmIChzYW1wbGUuc3Vic2FtcGxlcy5sZW5ndGggPiAxKSB7CgkJCQlmb3IgKGkgPSAxOyBpIDwgc2FtcGxlLnN1YnNhbXBsZXMubGVuZ3RoOyBpKyspIHsKCQkJCQlyZXMucmVzb3VyY2VzW2ldID0gc3RyZWFtLnJlYWRVaW50OEFycmF5KHNhbXBsZS5zdWJzYW1wbGVzW2ldLnNpemUpOwoJCQkJfQoJCQl9CgkJfQoJCWlmICh0eXBlb2YgKERPTVBhcnNlcikgIT09ICJ1bmRlZmluZWQiKSB7CgkJCXJlcy5kb2N1bWVudCA9IChuZXcgRE9NUGFyc2VyKCkpLnBhcnNlRnJvbVN0cmluZyhyZXMuZG9jdW1lbnRTdHJpbmcsICJhcHBsaWNhdGlvbi94bWwiKTsKCQl9CgkJcmV0dXJuIHJlczsKCX07CgoJdmFyIFRleHRpbjRQYXJzZXIgPSBmdW5jdGlvbigpIHsJCgl9OwoKCVRleHRpbjRQYXJzZXIucHJvdG90eXBlLnBhcnNlU2FtcGxlID0gZnVuY3Rpb24oc2FtcGxlKSB7CgkJdmFyIHRleHRTdHJpbmc7CgkJdmFyIHN0cmVhbSA9IG5ldyBNUDRCb3hTdHJlYW0oc2FtcGxlLmRhdGEuYnVmZmVyKTsKCQl0ZXh0U3RyaW5nID0gc3RyZWFtLnJlYWRTdHJpbmcoc2FtcGxlLmRhdGEubGVuZ3RoKTsKCQlyZXR1cm4gdGV4dFN0cmluZzsKCX07CgoJVGV4dGluNFBhcnNlci5wcm90b3R5cGUucGFyc2VDb25maWcgPSBmdW5jdGlvbihkYXRhKSB7CgkJdmFyIHRleHRTdHJpbmc7CgkJdmFyIHN0cmVhbSA9IG5ldyBNUDRCb3hTdHJlYW0oZGF0YS5idWZmZXIpOwoJCXN0cmVhbS5yZWFkVWludDMyKCk7IC8vIHZlcnNpb24gJiBmbGFncwoJCXRleHRTdHJpbmcgPSBzdHJlYW0ucmVhZENTdHJpbmcoKTsKCQlyZXR1cm4gdGV4dFN0cmluZzsKCX07CgoJewoJCWV4cG9ydHMkMS5YTUxTdWJ0aXRsZWluNFBhcnNlciA9IFhNTFN1YnRpdGxlaW40UGFyc2VyOwoJCWV4cG9ydHMkMS5UZXh0aW40UGFyc2VyID0gVGV4dGluNFBhcnNlcjsKCX0KCS8vIGZpbGU6c3JjL2lzb2ZpbGUuanMKCS8qCgkgKiBDb3B5cmlnaHQgKGMpIDIwMTItMjAxMy4gVGVsZWNvbSBQYXJpc1RlY2gvVFNJL01NL0dQQUMgQ3lyaWwgQ29uY29sYXRvCgkgKiBMaWNlbnNlOiBCU0QtMy1DbGF1c2UgKHNlZSBMSUNFTlNFIGZpbGUpCgkgKi8KCXZhciBJU09GaWxlID0gZnVuY3Rpb24gKHN0cmVhbSkgewoJCS8qIE11dGlCdWZmZXJTdHJlYW0gb2JqZWN0IHVzZWQgdG8gcGFyc2UgYm94ZXMgKi8KCQl0aGlzLnN0cmVhbSA9IHN0cmVhbSB8fCBuZXcgTXVsdGlCdWZmZXJTdHJlYW0oKTsKCQkvKiBBcnJheSBvZiBhbGwgYm94ZXMgKGluIG9yZGVyKSBmb3VuZCBpbiB0aGUgZmlsZSAqLwoJCXRoaXMuYm94ZXMgPSBbXTsKCQkvKiBBcnJheSBvZiBhbGwgbWRhdHMgKi8KCQl0aGlzLm1kYXRzID0gW107CgkJLyogQXJyYXkgb2YgYWxsIG1vb2ZzICovCgkJdGhpcy5tb29mcyA9IFtdOwoJCS8qIEJvb2xlYW4gaW5kaWNhdGluZyBpZiB0aGUgZmlsZSBpcyBjb21wYXRpYmxlIHdpdGggcHJvZ3Jlc3NpdmUgcGFyc2luZyAobW9vdiBmaXJzdCkgKi8KCQl0aGlzLmlzUHJvZ3Jlc3NpdmUgPSBmYWxzZTsKCQkvKiBCb29sZWFuIHVzZWQgdG8gZmlyZSBtb292IHN0YXJ0IGV2ZW50IG9ubHkgb25jZSAqLwoJCXRoaXMubW9vdlN0YXJ0Rm91bmQgPSBmYWxzZTsKCQkvKiBDYWxsYmFjayBjYWxsZWQgd2hlbiB0aGUgbW9vdiBwYXJzaW5nIHN0YXJ0cyAqLwoJCXRoaXMub25Nb292U3RhcnQgPSBudWxsOwoJCS8qIEJvb2xlYW4ga2VlcGluZyB0cmFjayBvZiB0aGUgY2FsbCB0byBvbk1vb3ZTdGFydCwgdG8gYXZvaWQgZG91YmxlIGNhbGxzICovCgkJdGhpcy5tb292U3RhcnRTZW50ID0gZmFsc2U7CgkJLyogQ2FsbGJhY2sgY2FsbGVkIHdoZW4gdGhlIG1vb3YgaXMgZW50aXJlbHkgcGFyc2VkICovCgkJdGhpcy5vblJlYWR5ID0gbnVsbDsKCQkvKiBCb29sZWFuIGtlZXBpbmcgdHJhY2sgb2YgdGhlIGNhbGwgdG8gb25SZWFkeSwgdG8gYXZvaWQgZG91YmxlIGNhbGxzICovCgkJdGhpcy5yZWFkeVNlbnQgPSBmYWxzZTsKCQkvKiBDYWxsYmFjayB0byBjYWxsIHdoZW4gc2VnbWVudHMgYXJlIHJlYWR5ICovCgkJdGhpcy5vblNlZ21lbnQgPSBudWxsOwoJCS8qIENhbGxiYWNrIHRvIGNhbGwgd2hlbiBzYW1wbGVzIGFyZSByZWFkeSAqLwoJCXRoaXMub25TYW1wbGVzID0gbnVsbDsKCQkvKiBDYWxsYmFjayB0byBjYWxsIHdoZW4gdGhlcmUgaXMgYW4gZXJyb3IgaW4gdGhlIHBhcnNpbmcgb3IgcHJvY2Vzc2luZyBvZiBzYW1wbGVzICovCgkJdGhpcy5vbkVycm9yID0gbnVsbDsKCQkvKiBCb29sZWFuIGluZGljYXRpbmcgaWYgdGhlIG1vb3YgYm94IHJ1bi1sZW5ndGggZW5jb2RlZCB0YWJsZXMgb2Ygc2FtcGxlIGluZm9ybWF0aW9uIGhhdmUgYmVlbiBwcm9jZXNzZWQgKi8KCQl0aGlzLnNhbXBsZUxpc3RCdWlsdCA9IGZhbHNlOwoJCS8qIEFycmF5IG9mIFRyYWNrIG9iamVjdHMgZm9yIHdoaWNoIGZyYWdtZW50YXRpb24gb2Ygc2FtcGxlcyBpcyByZXF1ZXN0ZWQgKi8KCQl0aGlzLmZyYWdtZW50ZWRUcmFja3MgPSBbXTsKCQkvKiBBcnJheSBvZiBUcmFjayBvYmplY3RzIGZvciB3aGljaCBleHRyYWN0aW9uIG9mIHNhbXBsZXMgaXMgcmVxdWVzdGVkICovCgkJdGhpcy5leHRyYWN0ZWRUcmFja3MgPSBbXTsKCQkvKiBCb29sZWFuIGluZGljYXRpbmcgdGhhdCBmcmFnbWVudGlvbiBpcyByZWFkeSAqLwoJCXRoaXMuaXNGcmFnbWVudGF0aW9uSW5pdGlhbGl6ZWQgPSBmYWxzZTsKCQkvKiBCb29sZWFuIGluZGljYXRpbmcgdGhhdCBmcmFnbWVudGVkIGhhcyBzdGFydGVkICovCgkJdGhpcy5zYW1wbGVQcm9jZXNzaW5nU3RhcnRlZCA9IGZhbHNlOwoJCS8qIE51bWJlciBvZiB0aGUgbmV4dCAnbW9vZicgdG8gZ2VuZXJhdGUgd2hlbiBmcmFnbWVudGluZyAqLwoJCXRoaXMubmV4dE1vb2ZOdW1iZXIgPSAwOwoJCS8qIEJvb2xlYW4gaW5kaWNhdGluZyBpZiB0aGUgaW5pdGlhbCBsaXN0IG9mIGl0ZW1zIGhhcyBiZWVuIHByb2R1Y2VkICovCgkJdGhpcy5pdGVtTGlzdEJ1aWx0ID0gZmFsc2U7CgkJLyogQ2FsbGJhY2sgY2FsbGVkIHdoZW4gdGhlIHNpZHggYm94IGlzIGVudGlyZWx5IHBhcnNlZCAqLwoJCXRoaXMub25TaWR4ID0gbnVsbDsKCQkvKiBCb29sZWFuIGtlZXBpbmcgdHJhY2sgb2YgdGhlIGNhbGwgdG8gb25TaWR4LCB0byBhdm9pZCBkb3VibGUgY2FsbHMgKi8KCQl0aGlzLnNpZHhTZW50ID0gZmFsc2U7Cgl9OwoKCUlTT0ZpbGUucHJvdG90eXBlLnNldFNlZ21lbnRPcHRpb25zID0gZnVuY3Rpb24oaWQsIHVzZXIsIG9wdGlvbnMpIHsKCQl2YXIgdHJhayA9IHRoaXMuZ2V0VHJhY2tCeUlkKGlkKTsKCQlpZiAodHJhaykgewoJCQl2YXIgZnJhZ1RyYWNrID0ge307CgkJCXRoaXMuZnJhZ21lbnRlZFRyYWNrcy5wdXNoKGZyYWdUcmFjayk7CgkJCWZyYWdUcmFjay5pZCA9IGlkOwoJCQlmcmFnVHJhY2sudXNlciA9IHVzZXI7CgkJCWZyYWdUcmFjay50cmFrID0gdHJhazsKCQkJdHJhay5uZXh0U2FtcGxlID0gMDsKCQkJZnJhZ1RyYWNrLnNlZ21lbnRTdHJlYW0gPSBudWxsOwoJCQlmcmFnVHJhY2submJfc2FtcGxlcyA9IDEwMDA7CgkJCWZyYWdUcmFjay5yYXBBbGlnbmVtZW50ID0gdHJ1ZTsKCQkJaWYgKG9wdGlvbnMpIHsKCQkJCWlmIChvcHRpb25zLm5iU2FtcGxlcykgZnJhZ1RyYWNrLm5iX3NhbXBsZXMgPSBvcHRpb25zLm5iU2FtcGxlczsKCQkJCWlmIChvcHRpb25zLnJhcEFsaWduZW1lbnQpIGZyYWdUcmFjay5yYXBBbGlnbmVtZW50ID0gb3B0aW9ucy5yYXBBbGlnbmVtZW50OwoJCQl9CgkJfQoJfTsKCglJU09GaWxlLnByb3RvdHlwZS51bnNldFNlZ21lbnRPcHRpb25zID0gZnVuY3Rpb24oaWQpIHsKCQl2YXIgaW5kZXggPSAtMTsKCQlmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuZnJhZ21lbnRlZFRyYWNrcy5sZW5ndGg7IGkrKykgewoJCQl2YXIgZnJhZ1RyYWNrID0gdGhpcy5mcmFnbWVudGVkVHJhY2tzW2ldOwoJCQlpZiAoZnJhZ1RyYWNrLmlkID09IGlkKSB7CgkJCQlpbmRleCA9IGk7CgkJCX0KCQl9CgkJaWYgKGluZGV4ID4gLTEpIHsKCQkJdGhpcy5mcmFnbWVudGVkVHJhY2tzLnNwbGljZShpbmRleCwgMSk7CgkJfQoJfTsKCglJU09GaWxlLnByb3RvdHlwZS5zZXRFeHRyYWN0aW9uT3B0aW9ucyA9IGZ1bmN0aW9uKGlkLCB1c2VyLCBvcHRpb25zKSB7CgkJdmFyIHRyYWsgPSB0aGlzLmdldFRyYWNrQnlJZChpZCk7CgkJaWYgKHRyYWspIHsKCQkJdmFyIGV4dHJhY3RUcmFjayA9IHt9OwoJCQl0aGlzLmV4dHJhY3RlZFRyYWNrcy5wdXNoKGV4dHJhY3RUcmFjayk7CgkJCWV4dHJhY3RUcmFjay5pZCA9IGlkOwoJCQlleHRyYWN0VHJhY2sudXNlciA9IHVzZXI7CgkJCWV4dHJhY3RUcmFjay50cmFrID0gdHJhazsKCQkJdHJhay5uZXh0U2FtcGxlID0gMDsKCQkJZXh0cmFjdFRyYWNrLm5iX3NhbXBsZXMgPSAxMDAwOwoJCQlleHRyYWN0VHJhY2suc2FtcGxlcyA9IFtdOwoJCQlpZiAob3B0aW9ucykgewoJCQkJaWYgKG9wdGlvbnMubmJTYW1wbGVzKSBleHRyYWN0VHJhY2submJfc2FtcGxlcyA9IG9wdGlvbnMubmJTYW1wbGVzOwoJCQl9CgkJfQoJfTsKCglJU09GaWxlLnByb3RvdHlwZS51bnNldEV4dHJhY3Rpb25PcHRpb25zID0gZnVuY3Rpb24oaWQpIHsKCQl2YXIgaW5kZXggPSAtMTsKCQlmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuZXh0cmFjdGVkVHJhY2tzLmxlbmd0aDsgaSsrKSB7CgkJCXZhciBleHRyYWN0VHJhY2sgPSB0aGlzLmV4dHJhY3RlZFRyYWNrc1tpXTsKCQkJaWYgKGV4dHJhY3RUcmFjay5pZCA9PSBpZCkgewoJCQkJaW5kZXggPSBpOwoJCQl9CgkJfQoJCWlmIChpbmRleCA+IC0xKSB7CgkJCXRoaXMuZXh0cmFjdGVkVHJhY2tzLnNwbGljZShpbmRleCwgMSk7CgkJfQoJfTsKCglJU09GaWxlLnByb3RvdHlwZS5wYXJzZSA9IGZ1bmN0aW9uKCkgewoJCXZhciByZXQ7CgkJdmFyIGJveDsKCQl2YXIgcGFyc2VCb3hIZWFkZXJzT25seSA9IGZhbHNlOwoKCQlpZiAodGhpcy5yZXN0b3JlUGFyc2VQb3NpdGlvbikJewoJCQlpZiAoIXRoaXMucmVzdG9yZVBhcnNlUG9zaXRpb24oKSkgewoJCQkJcmV0dXJuOwoJCQl9CgkJfQoKCQl3aGlsZSAodHJ1ZSkgewoKCQkJaWYgKHRoaXMuaGFzSW5jb21wbGV0ZU1kYXQgJiYgdGhpcy5oYXNJbmNvbXBsZXRlTWRhdCgpKSB7CgkJCQlpZiAodGhpcy5wcm9jZXNzSW5jb21wbGV0ZU1kYXQoKSkgewoJCQkJCWNvbnRpbnVlOwoJCQkJfSBlbHNlIHsKCQkJCQlyZXR1cm47CgkJCQl9CgkJCX0gZWxzZSB7CgkJCQlpZiAodGhpcy5zYXZlUGFyc2VQb3NpdGlvbikJewoJCQkJCXRoaXMuc2F2ZVBhcnNlUG9zaXRpb24oKTsKCQkJCX0KCQkJCXJldCA9IEJveFBhcnNlci5wYXJzZU9uZUJveCh0aGlzLnN0cmVhbSwgcGFyc2VCb3hIZWFkZXJzT25seSk7CgkJCQlpZiAocmV0LmNvZGUgPT09IEJveFBhcnNlci5FUlJfTk9UX0VOT1VHSF9EQVRBKSB7CgkJCQkJaWYgKHRoaXMucHJvY2Vzc0luY29tcGxldGVCb3gpIHsKCQkJCQkJaWYgKHRoaXMucHJvY2Vzc0luY29tcGxldGVCb3gocmV0KSkgewoJCQkJCQkJY29udGludWU7CgkJCQkJCX0gZWxzZSB7CgkJCQkJCQlyZXR1cm47CgkJCQkJCX0KCQkJCQl9IGVsc2UgewoJCQkJCQlyZXR1cm47CgkJCQkJfQoJCQkJfSBlbHNlIHsKCQkJCQl2YXIgYm94X3R5cGU7CgkJCQkJLyogdGhlIGJveCBpcyBlbnRpcmVseSBwYXJzZWQgKi8KCQkJCQlib3ggPSByZXQuYm94OwoJCQkJCWJveF90eXBlID0gKGJveC50eXBlICE9PSAidXVpZCIgPyBib3gudHlwZSA6IGJveC51dWlkKTsKCQkJCQkvKiBzdG9yZSB0aGUgYm94IGluIHRoZSAnYm94ZXMnIGFycmF5IHRvIHByZXNlcnZlIGJveCBvcmRlciAoZm9yIGZpbGUgcmV3cml0ZSBpZiBuZWVkZWQpICAqLwoJCQkJCXRoaXMuYm94ZXMucHVzaChib3gpOwoJCQkJCS8qIGJ1dCBhbHNvIHN0b3JlIGJveCBpbiBhIHByb3BlcnR5IGZvciBtb3JlIGRpcmVjdCBhY2Nlc3MgKi8KCQkJCQlzd2l0Y2ggKGJveF90eXBlKSB7CgkJCQkJCWNhc2UgIm1kYXQiOgoJCQkJCQkJdGhpcy5tZGF0cy5wdXNoKGJveCk7CgkJCQkJCQlicmVhazsKCQkJCQkJY2FzZSAibW9vZiI6CgkJCQkJCQl0aGlzLm1vb2ZzLnB1c2goYm94KTsKCQkJCQkJCWJyZWFrOwoJCQkJCQljYXNlICJtb292IjoKCQkJCQkJCXRoaXMubW9vdlN0YXJ0Rm91bmQgPSB0cnVlOwoJCQkJCQkJaWYgKHRoaXMubWRhdHMubGVuZ3RoID09PSAwKSB7CgkJCQkJCQkJdGhpcy5pc1Byb2dyZXNzaXZlID0gdHJ1ZTsKCQkJCQkJCX0KCQkJCQkJCS8qIG5vIGJyZWFrICovCgkJCQkJCQkvKiBmYWxscyB0aHJvdWdoICovCgkJCQkJCWRlZmF1bHQ6CgkJCQkJCQlpZiAodGhpc1tib3hfdHlwZV0gIT09IHVuZGVmaW5lZCkgewoJCQkJCQkJCUxvZy53YXJuKCJJU09GaWxlIiwgIkR1cGxpY2F0ZSBCb3ggb2YgdHlwZTogIitib3hfdHlwZSsiLCBvdmVycmlkaW5nIHByZXZpb3VzIG9jY3VycmVuY2UiKTsKCQkJCQkJCX0KCQkJCQkJCXRoaXNbYm94X3R5cGVdID0gYm94OwoJCQkJCQkJYnJlYWs7CgkJCQkJfQoJCQkJCWlmICh0aGlzLnVwZGF0ZVVzZWRCeXRlcykgewoJCQkJCQl0aGlzLnVwZGF0ZVVzZWRCeXRlcyhib3gsIHJldCk7CgkJCQkJfQoJCQkJfQoJCQl9CgkJfQoJfTsKCglJU09GaWxlLnByb3RvdHlwZS5jaGVja0J1ZmZlciA9IGZ1bmN0aW9uIChhYikgewoJCWlmIChhYiA9PT0gbnVsbCB8fCBhYiA9PT0gdW5kZWZpbmVkKSB7CgkJCXRocm93KCJCdWZmZXIgbXVzdCBiZSBkZWZpbmVkIGFuZCBub24gZW1wdHkiKTsKCQl9CgkJaWYgKGFiLmZpbGVTdGFydCA9PT0gdW5kZWZpbmVkKSB7CgkJCXRocm93KCJCdWZmZXIgbXVzdCBoYXZlIGEgZmlsZVN0YXJ0IHByb3BlcnR5Iik7CgkJfQoJCWlmIChhYi5ieXRlTGVuZ3RoID09PSAwKSB7CgkJCUxvZy53YXJuKCJJU09GaWxlIiwgIklnbm9yaW5nIGVtcHR5IGJ1ZmZlciAoZmlsZVN0YXJ0OiAiK2FiLmZpbGVTdGFydCsiKSIpOwoJCQl0aGlzLnN0cmVhbS5sb2dCdWZmZXJMZXZlbCgpOwoJCQlyZXR1cm4gZmFsc2U7CgkJfQoJCUxvZy5pbmZvKCJJU09GaWxlIiwgIlByb2Nlc3NpbmcgYnVmZmVyIChmaWxlU3RhcnQ6ICIrYWIuZmlsZVN0YXJ0KyIpIik7CgoJCS8qIG1hcmsgdGhlIGJ5dGVzIGluIHRoZSBidWZmZXIgYXMgbm90IGJlaW5nIHVzZWQgeWV0ICovCgkJYWIudXNlZEJ5dGVzID0gMDsKCQl0aGlzLnN0cmVhbS5pbnNlcnRCdWZmZXIoYWIpOwoJCXRoaXMuc3RyZWFtLmxvZ0J1ZmZlckxldmVsKCk7CgoJCWlmICghdGhpcy5zdHJlYW0uaW5pdGlhbGl6ZWQoKSkgewoJCQlMb2cud2FybigiSVNPRmlsZSIsICJOb3QgcmVhZHkgdG8gc3RhcnQgcGFyc2luZyIpOwoJCQlyZXR1cm4gZmFsc2U7CgkJfQoJCXJldHVybiB0cnVlOwoJfTsKCgkvKiBQcm9jZXNzZXMgYSBuZXcgQXJyYXlCdWZmZXIgKHdpdGggYSBmaWxlU3RhcnQgcHJvcGVydHkpCgkgICBSZXR1cm5zIHRoZSBuZXh0IGV4cGVjdGVkIGZpbGUgcG9zaXRpb24sIG9yIHVuZGVmaW5lZCBpZiBub3QgcmVhZHkgdG8gcGFyc2UgKi8KCUlTT0ZpbGUucHJvdG90eXBlLmFwcGVuZEJ1ZmZlciA9IGZ1bmN0aW9uKGFiLCBsYXN0KSB7CgkJdmFyIG5leHRGaWxlU3RhcnQ7CgkJaWYgKCF0aGlzLmNoZWNrQnVmZmVyKGFiKSkgewoJCQlyZXR1cm47CgkJfQoKCQkvKiBQYXJzZSB3aGF0ZXZlciBpcyBpbiB0aGUgZXhpc3RpbmcgYnVmZmVycyAqLwoJCXRoaXMucGFyc2UoKTsKCgkJLyogQ2hlY2sgaWYgdGhlIG1vb3ZTdGFydCBjYWxsYmFjayBuZWVkcyB0byBiZSBjYWxsZWQgKi8KCQlpZiAodGhpcy5tb292U3RhcnRGb3VuZCAmJiAhdGhpcy5tb292U3RhcnRTZW50KSB7CgkJCXRoaXMubW9vdlN0YXJ0U2VudCA9IHRydWU7CgkJCWlmICh0aGlzLm9uTW9vdlN0YXJ0KSB0aGlzLm9uTW9vdlN0YXJ0KCk7CgkJfQoKCQlpZiAodGhpcy5tb292KSB7CgkJCS8qIEEgbW9vdiBib3ggaGFzIGJlZW4gZW50aXJlbHkgcGFyc2VkICovCgoJCQkvKiBpZiB0aGlzIGlzIHRoZSBmaXJzdCBjYWxsIGFmdGVyIHRoZSBtb292IGlzIGZvdW5kIHdlIGluaXRpYWxpemUgdGhlIGxpc3Qgb2Ygc2FtcGxlcyAobWF5IGJlIGVtcHR5IGluIGZyYWdtZW50ZWQgZmlsZXMpICovCgkJCWlmICghdGhpcy5zYW1wbGVMaXN0QnVpbHQpIHsKCQkJCXRoaXMuYnVpbGRTYW1wbGVMaXN0cygpOwoJCQkJdGhpcy5zYW1wbGVMaXN0QnVpbHQgPSB0cnVlOwoJCQl9CgoJCQkvKiBXZSB1cGRhdGUgdGhlIHNhbXBsZSBpbmZvcm1hdGlvbiBpZiB0aGVyZSBhcmUgYW55IG5ldyBtb29mIGJveGVzICovCgkJCXRoaXMudXBkYXRlU2FtcGxlTGlzdHMoKTsKCgkJCS8qIElmIHRoZSBhcHBsaWNhdGlvbiBuZWVkcyB0byBiZSBpbmZvcm1lZCB0aGF0IHRoZSAnbW9vdicgaGFzIGJlZW4gZm91bmQsCgkJCSAgIHdlIGNyZWF0ZSB0aGUgaW5mb3JtYXRpb24gb2JqZWN0IGFuZCBjYWxsYmFjayB0aGUgYXBwbGljYXRpb24gKi8KCQkJaWYgKHRoaXMub25SZWFkeSAmJiAhdGhpcy5yZWFkeVNlbnQpIHsKCQkJCXRoaXMucmVhZHlTZW50ID0gdHJ1ZTsKCQkJCXRoaXMub25SZWFkeSh0aGlzLmdldEluZm8oKSk7CgkJCX0KCgkJCS8qIFNlZSBpZiBhbnkgc2FtcGxlIGV4dHJhY3Rpb24gb3Igc2VnbWVudCBjcmVhdGlvbiBuZWVkcyB0byBiZSBkb25lIHdpdGggdGhlIGF2YWlsYWJsZSBzYW1wbGVzICovCgkJCXRoaXMucHJvY2Vzc1NhbXBsZXMobGFzdCk7CgoJCQkvKiBJbmZvcm0gYWJvdXQgdGhlIGJlc3QgcmFuZ2UgdG8gZmV0Y2ggbmV4dCAqLwoJCQlpZiAodGhpcy5uZXh0U2Vla1Bvc2l0aW9uKSB7CgkJCQluZXh0RmlsZVN0YXJ0ID0gdGhpcy5uZXh0U2Vla1Bvc2l0aW9uOwoJCQkJdGhpcy5uZXh0U2Vla1Bvc2l0aW9uID0gdW5kZWZpbmVkOwoJCQl9IGVsc2UgewoJCQkJbmV4dEZpbGVTdGFydCA9IHRoaXMubmV4dFBhcnNlUG9zaXRpb247CgkJCX0KCQkJaWYgKHRoaXMuc3RyZWFtLmdldEVuZEZpbGVQb3NpdGlvbkFmdGVyKSB7CgkJCQluZXh0RmlsZVN0YXJ0ID0gdGhpcy5zdHJlYW0uZ2V0RW5kRmlsZVBvc2l0aW9uQWZ0ZXIobmV4dEZpbGVTdGFydCk7CgkJCX0KCQl9IGVsc2UgewoJCQlpZiAodGhpcy5uZXh0UGFyc2VQb3NpdGlvbikgewoJCQkJLyogbW9vdiBoYXMgbm90IGJlZW4gcGFyc2VkIGJ1dCB0aGUgZmlyc3QgYnVmZmVyIHdhcyByZWNlaXZlZCwKCQkJCSAgIHRoZSBuZXh0IGZldGNoIHNob3VsZCBwcm9iYWJseSBiZSB0aGUgbmV4dCBib3ggc3RhcnQgKi8KCQkJCW5leHRGaWxlU3RhcnQgPSB0aGlzLm5leHRQYXJzZVBvc2l0aW9uOwoJCQl9IGVsc2UgewoJCQkJLyogTm8gdmFsaWQgYnVmZmVyIGhhcyBiZWVuIHBhcnNlZCB5ZXQsIHdlIGNhbm5vdCBrbm93IHdoYXQgdG8gcGFyc2UgbmV4dCAqLwoJCQkJbmV4dEZpbGVTdGFydCA9IDA7CgkJCX0KCQl9CgkJaWYgKHRoaXMuc2lkeCkgewoJCQlpZiAodGhpcy5vblNpZHggJiYgIXRoaXMuc2lkeFNlbnQpIHsKCQkJCXRoaXMub25TaWR4KHRoaXMuc2lkeCk7CgkJCQl0aGlzLnNpZHhTZW50ID0gdHJ1ZTsKCQkJfQoJCX0KCQlpZiAodGhpcy5tZXRhKSB7CgkJCWlmICh0aGlzLmZsYXR0ZW5JdGVtSW5mbyAmJiAhdGhpcy5pdGVtTGlzdEJ1aWx0KSB7CgkJCQl0aGlzLmZsYXR0ZW5JdGVtSW5mbygpOwoJCQkJdGhpcy5pdGVtTGlzdEJ1aWx0ID0gdHJ1ZTsKCQkJfQoJCQlpZiAodGhpcy5wcm9jZXNzSXRlbXMpIHsKCQkJCXRoaXMucHJvY2Vzc0l0ZW1zKHRoaXMub25JdGVtKTsKCQkJfQoJCX0KCgkJaWYgKHRoaXMuc3RyZWFtLmNsZWFuQnVmZmVycykgewoJCQlMb2cuaW5mbygiSVNPRmlsZSIsICJEb25lIHByb2Nlc3NpbmcgYnVmZmVyIChmaWxlU3RhcnQ6ICIrYWIuZmlsZVN0YXJ0KyIpIC0gbmV4dCBidWZmZXIgdG8gZmV0Y2ggc2hvdWxkIGhhdmUgYSBmaWxlU3RhcnQgcG9zaXRpb24gb2YgIituZXh0RmlsZVN0YXJ0KTsKCQkJdGhpcy5zdHJlYW0ubG9nQnVmZmVyTGV2ZWwoKTsKCQkJdGhpcy5zdHJlYW0uY2xlYW5CdWZmZXJzKCk7CgkJCXRoaXMuc3RyZWFtLmxvZ0J1ZmZlckxldmVsKHRydWUpOwoJCQlMb2cuaW5mbygiSVNPRmlsZSIsICJTYW1wbGUgZGF0YSBzaXplIGluIG1lbW9yeTogIit0aGlzLmdldEFsbG9jYXRlZFNhbXBsZURhdGFTaXplKCkpOwoJCX0KCQlyZXR1cm4gbmV4dEZpbGVTdGFydDsKCX07CgoJSVNPRmlsZS5wcm90b3R5cGUuZ2V0SW5mbyA9IGZ1bmN0aW9uKCkgewoJCXZhciBpLCBqOwoJCXZhciBtb3ZpZSA9IHt9OwoJCXZhciB0cmFrOwoJCXZhciB0cmFjazsKCQl2YXIgcmVmOwoJCXZhciBzYW1wbGVfZGVzYzsKCQl2YXIgXzE5MDQgPSAobmV3IERhdGUoJzE5MDQtMDEtMDFUMDA6MDA6MDBaJykuZ2V0VGltZSgpKTsKCgkJaWYgKHRoaXMubW9vdikgewoJCQltb3ZpZS5oYXNNb292ID0gdHJ1ZTsKCQkJbW92aWUuZHVyYXRpb24gPSB0aGlzLm1vb3YubXZoZC5kdXJhdGlvbjsKCQkJbW92aWUudGltZXNjYWxlID0gdGhpcy5tb292Lm12aGQudGltZXNjYWxlOwoJCQltb3ZpZS5pc0ZyYWdtZW50ZWQgPSAodGhpcy5tb292Lm12ZXggIT0gbnVsbCk7CgkJCWlmIChtb3ZpZS5pc0ZyYWdtZW50ZWQgJiYgdGhpcy5tb292Lm12ZXgubWVoZCkgewoJCQkJbW92aWUuZnJhZ21lbnRfZHVyYXRpb24gPSB0aGlzLm1vb3YubXZleC5tZWhkLmZyYWdtZW50X2R1cmF0aW9uOwoJCQl9CgkJCW1vdmllLmlzUHJvZ3Jlc3NpdmUgPSB0aGlzLmlzUHJvZ3Jlc3NpdmU7CgkJCW1vdmllLmhhc0lPRCA9ICh0aGlzLm1vb3YuaW9kcyAhPSBudWxsKTsKCQkJbW92aWUuYnJhbmRzID0gW107CgkJCW1vdmllLmJyYW5kcy5wdXNoKHRoaXMuZnR5cC5tYWpvcl9icmFuZCk7CgkJCW1vdmllLmJyYW5kcyA9IG1vdmllLmJyYW5kcy5jb25jYXQodGhpcy5mdHlwLmNvbXBhdGlibGVfYnJhbmRzKTsKCQkJbW92aWUuY3JlYXRlZCA9IG5ldyBEYXRlKF8xOTA0K3RoaXMubW9vdi5tdmhkLmNyZWF0aW9uX3RpbWUqMTAwMCk7CgkJCW1vdmllLm1vZGlmaWVkID0gbmV3IERhdGUoXzE5MDQrdGhpcy5tb292Lm12aGQubW9kaWZpY2F0aW9uX3RpbWUqMTAwMCk7CgkJCW1vdmllLnRyYWNrcyA9IFtdOwoJCQltb3ZpZS5hdWRpb1RyYWNrcyA9IFtdOwoJCQltb3ZpZS52aWRlb1RyYWNrcyA9IFtdOwoJCQltb3ZpZS5zdWJ0aXRsZVRyYWNrcyA9IFtdOwoJCQltb3ZpZS5tZXRhZGF0YVRyYWNrcyA9IFtdOwoJCQltb3ZpZS5oaW50VHJhY2tzID0gW107CgkJCW1vdmllLm90aGVyVHJhY2tzID0gW107CgkJCWZvciAoaSA9IDA7IGkgPCB0aGlzLm1vb3YudHJha3MubGVuZ3RoOyBpKyspIHsKCQkJCXRyYWsgPSB0aGlzLm1vb3YudHJha3NbaV07CgkJCQlzYW1wbGVfZGVzYyA9IHRyYWsubWRpYS5taW5mLnN0Ymwuc3RzZC5lbnRyaWVzWzBdOwoJCQkJdHJhY2sgPSB7fTsKCQkJCW1vdmllLnRyYWNrcy5wdXNoKHRyYWNrKTsKCQkJCXRyYWNrLmlkID0gdHJhay50a2hkLnRyYWNrX2lkOwoJCQkJdHJhY2submFtZSA9IHRyYWsubWRpYS5oZGxyLm5hbWU7CgkJCQl0cmFjay5yZWZlcmVuY2VzID0gW107CgkJCQlpZiAodHJhay50cmVmKSB7CgkJCQkJZm9yIChqID0gMDsgaiA8IHRyYWsudHJlZi5ib3hlcy5sZW5ndGg7IGorKykgewoJCQkJCQlyZWYgPSB7fTsKCQkJCQkJdHJhY2sucmVmZXJlbmNlcy5wdXNoKHJlZik7CgkJCQkJCXJlZi50eXBlID0gdHJhay50cmVmLmJveGVzW2pdLnR5cGU7CgkJCQkJCXJlZi50cmFja19pZHMgPSB0cmFrLnRyZWYuYm94ZXNbal0udHJhY2tfaWRzOwoJCQkJCX0KCQkJCX0KCQkJCWlmICh0cmFrLmVkdHMpIHsKCQkJCQl0cmFjay5lZGl0cyA9IHRyYWsuZWR0cy5lbHN0LmVudHJpZXM7CgkJCQl9CgkJCQl0cmFjay5jcmVhdGVkID0gbmV3IERhdGUoXzE5MDQrdHJhay50a2hkLmNyZWF0aW9uX3RpbWUqMTAwMCk7CgkJCQl0cmFjay5tb2RpZmllZCA9IG5ldyBEYXRlKF8xOTA0K3RyYWsudGtoZC5tb2RpZmljYXRpb25fdGltZSoxMDAwKTsKCQkJCXRyYWNrLm1vdmllX2R1cmF0aW9uID0gdHJhay50a2hkLmR1cmF0aW9uOwoJCQkJdHJhY2subW92aWVfdGltZXNjYWxlID0gbW92aWUudGltZXNjYWxlOwoJCQkJdHJhY2subGF5ZXIgPSB0cmFrLnRraGQubGF5ZXI7CgkJCQl0cmFjay5hbHRlcm5hdGVfZ3JvdXAgPSB0cmFrLnRraGQuYWx0ZXJuYXRlX2dyb3VwOwoJCQkJdHJhY2sudm9sdW1lID0gdHJhay50a2hkLnZvbHVtZTsKCQkJCXRyYWNrLm1hdHJpeCA9IHRyYWsudGtoZC5tYXRyaXg7CgkJCQl0cmFjay50cmFja193aWR0aCA9IHRyYWsudGtoZC53aWR0aC8oMTw8MTYpOwoJCQkJdHJhY2sudHJhY2tfaGVpZ2h0ID0gdHJhay50a2hkLmhlaWdodC8oMTw8MTYpOwoJCQkJdHJhY2sudGltZXNjYWxlID0gdHJhay5tZGlhLm1kaGQudGltZXNjYWxlOwoJCQkJdHJhY2suY3RzX3NoaWZ0ID0gdHJhay5tZGlhLm1pbmYuc3RibC5jc2xnOwoJCQkJdHJhY2suZHVyYXRpb24gPSB0cmFrLm1kaWEubWRoZC5kdXJhdGlvbjsKCQkJCXRyYWNrLnNhbXBsZXNfZHVyYXRpb24gPSB0cmFrLnNhbXBsZXNfZHVyYXRpb247CgkJCQl0cmFjay5jb2RlYyA9IHNhbXBsZV9kZXNjLmdldENvZGVjKCk7CgkJCQl0cmFjay5raW5kID0gKHRyYWsudWR0YSAmJiB0cmFrLnVkdGEua2luZHMubGVuZ3RoID8gdHJhay51ZHRhLmtpbmRzWzBdIDogeyBzY2hlbWVVUkk6ICIiLCB2YWx1ZTogIiJ9KTsKCQkJCXRyYWNrLmxhbmd1YWdlID0gKHRyYWsubWRpYS5lbG5nID8gdHJhay5tZGlhLmVsbmcuZXh0ZW5kZWRfbGFuZ3VhZ2UgOiB0cmFrLm1kaWEubWRoZC5sYW5ndWFnZVN0cmluZyk7CgkJCQl0cmFjay5uYl9zYW1wbGVzID0gdHJhay5zYW1wbGVzLmxlbmd0aDsKCQkJCXRyYWNrLnNpemUgPSB0cmFrLnNhbXBsZXNfc2l6ZTsKCQkJCXRyYWNrLmJpdHJhdGUgPSAodHJhY2suc2l6ZSo4KnRyYWNrLnRpbWVzY2FsZSkvdHJhY2suc2FtcGxlc19kdXJhdGlvbjsKCQkJCWlmIChzYW1wbGVfZGVzYy5pc0F1ZGlvKCkpIHsKCQkJCQl0cmFjay50eXBlID0gImF1ZGlvIjsKCQkJCQltb3ZpZS5hdWRpb1RyYWNrcy5wdXNoKHRyYWNrKTsKCQkJCQl0cmFjay5hdWRpbyA9IHt9OwoJCQkJCXRyYWNrLmF1ZGlvLnNhbXBsZV9yYXRlID0gc2FtcGxlX2Rlc2MuZ2V0U2FtcGxlUmF0ZSgpOwoJCQkJCXRyYWNrLmF1ZGlvLmNoYW5uZWxfY291bnQgPSBzYW1wbGVfZGVzYy5nZXRDaGFubmVsQ291bnQoKTsKCQkJCQl0cmFjay5hdWRpby5zYW1wbGVfc2l6ZSA9IHNhbXBsZV9kZXNjLmdldFNhbXBsZVNpemUoKTsKCQkJCX0gZWxzZSBpZiAoc2FtcGxlX2Rlc2MuaXNWaWRlbygpKSB7CgkJCQkJdHJhY2sudHlwZSA9ICJ2aWRlbyI7CgkJCQkJbW92aWUudmlkZW9UcmFja3MucHVzaCh0cmFjayk7CgkJCQkJdHJhY2sudmlkZW8gPSB7fTsKCQkJCQl0cmFjay52aWRlby53aWR0aCA9IHNhbXBsZV9kZXNjLmdldFdpZHRoKCk7CgkJCQkJdHJhY2sudmlkZW8uaGVpZ2h0ID0gc2FtcGxlX2Rlc2MuZ2V0SGVpZ2h0KCk7CgkJCQl9IGVsc2UgaWYgKHNhbXBsZV9kZXNjLmlzU3VidGl0bGUoKSkgewoJCQkJCXRyYWNrLnR5cGUgPSAic3VidGl0bGVzIjsKCQkJCQltb3ZpZS5zdWJ0aXRsZVRyYWNrcy5wdXNoKHRyYWNrKTsKCQkJCX0gZWxzZSBpZiAoc2FtcGxlX2Rlc2MuaXNIaW50KCkpIHsKCQkJCQl0cmFjay50eXBlID0gIm1ldGFkYXRhIjsKCQkJCQltb3ZpZS5oaW50VHJhY2tzLnB1c2godHJhY2spOwoJCQkJfSBlbHNlIGlmIChzYW1wbGVfZGVzYy5pc01ldGFkYXRhKCkpIHsKCQkJCQl0cmFjay50eXBlID0gIm1ldGFkYXRhIjsKCQkJCQltb3ZpZS5tZXRhZGF0YVRyYWNrcy5wdXNoKHRyYWNrKTsKCQkJCX0gZWxzZSB7CgkJCQkJdHJhY2sudHlwZSA9ICJtZXRhZGF0YSI7CgkJCQkJbW92aWUub3RoZXJUcmFja3MucHVzaCh0cmFjayk7CgkJCQl9CgkJCX0KCQl9IGVsc2UgewoJCQltb3ZpZS5oYXNNb292ID0gZmFsc2U7CgkJfQoJCW1vdmllLm1pbWUgPSAiIjsKCQlpZiAobW92aWUuaGFzTW9vdiAmJiBtb3ZpZS50cmFja3MpIHsKCQkJaWYgKG1vdmllLnZpZGVvVHJhY2tzICYmIG1vdmllLnZpZGVvVHJhY2tzLmxlbmd0aCA+IDApIHsKCQkJCW1vdmllLm1pbWUgKz0gJ3ZpZGVvL21wNDsgY29kZWNzPVwiJzsKCQkJfSBlbHNlIGlmIChtb3ZpZS5hdWRpb1RyYWNrcyAmJiBtb3ZpZS5hdWRpb1RyYWNrcy5sZW5ndGggPiAwKSB7CgkJCQltb3ZpZS5taW1lICs9ICdhdWRpby9tcDQ7IGNvZGVjcz1cIic7CgkJCX0gZWxzZSB7CgkJCQltb3ZpZS5taW1lICs9ICdhcHBsaWNhdGlvbi9tcDQ7IGNvZGVjcz1cIic7CgkJCX0KCQkJZm9yIChpID0gMDsgaSA8IG1vdmllLnRyYWNrcy5sZW5ndGg7IGkrKykgewoJCQkJaWYgKGkgIT09IDApIG1vdmllLm1pbWUgKz0gJywnOwoJCQkJbW92aWUubWltZSs9IG1vdmllLnRyYWNrc1tpXS5jb2RlYzsKCQkJfQoJCQltb3ZpZS5taW1lICs9ICdcIjsgcHJvZmlsZXM9XCInOwoJCQltb3ZpZS5taW1lICs9IHRoaXMuZnR5cC5jb21wYXRpYmxlX2JyYW5kcy5qb2luKCk7CgkJCW1vdmllLm1pbWUgKz0gJ1wiJzsKCQl9CgkJcmV0dXJuIG1vdmllOwoJfTsKCglJU09GaWxlLnByb3RvdHlwZS5wcm9jZXNzU2FtcGxlcyA9IGZ1bmN0aW9uKGxhc3QpIHsKCQl2YXIgaTsKCQl2YXIgdHJhazsKCQlpZiAoIXRoaXMuc2FtcGxlUHJvY2Vzc2luZ1N0YXJ0ZWQpIHJldHVybjsKCgkJLyogRm9yIGVhY2ggdHJhY2sgbWFya2VkIGZvciBmcmFnbWVudGF0aW9uLAoJCSAgIGNoZWNrIGlmIHRoZSBuZXh0IHNhbXBsZSBpcyB0aGVyZSAoaS5lLiBpZiB0aGUgc2FtcGxlIGluZm9ybWF0aW9uIGlzIGtub3duIChpLmUuIG1vb2YgaGFzIGFycml2ZWQpIGFuZCBpZiBpdCBoYXMgYmVlbiBkb3dubG9hZGVkKQoJCSAgIGFuZCBjcmVhdGUgYSBmcmFnbWVudCB3aXRoIGl0ICovCgkJaWYgKHRoaXMuaXNGcmFnbWVudGF0aW9uSW5pdGlhbGl6ZWQgJiYgdGhpcy5vblNlZ21lbnQgIT09IG51bGwpIHsKCQkJZm9yIChpID0gMDsgaSA8IHRoaXMuZnJhZ21lbnRlZFRyYWNrcy5sZW5ndGg7IGkrKykgewoJCQkJdmFyIGZyYWdUcmFrID0gdGhpcy5mcmFnbWVudGVkVHJhY2tzW2ldOwoJCQkJdHJhayA9IGZyYWdUcmFrLnRyYWs7CgkJCQl3aGlsZSAodHJhay5uZXh0U2FtcGxlIDwgdHJhay5zYW1wbGVzLmxlbmd0aCAmJiB0aGlzLnNhbXBsZVByb2Nlc3NpbmdTdGFydGVkKSB7CgkJCQkJLyogVGhlIHNhbXBsZSBpbmZvcm1hdGlvbiBpcyB0aGVyZSAoZWl0aGVyIGJlY2F1c2UgdGhlIGZpbGUgaXMgbm90IGZyYWdtZW50ZWQgYW5kIHRoaXMgaXMgbm90IHRoZSBsYXN0IHNhbXBsZSwKCQkJCQlvciBiZWNhdXNlIHRoZSBmaWxlIGlzIGZyYWdtZW50ZWQgYW5kIHRoZSBtb29mIGZvciB0aGF0IHNhbXBsZSBoYXMgYmVlbiByZWNlaXZlZCAqLwoJCQkJCUxvZy5kZWJ1ZygiSVNPRmlsZSIsICJDcmVhdGluZyBtZWRpYSBmcmFnbWVudCBvbiB0cmFjayAjIitmcmFnVHJhay5pZCArIiBmb3Igc2FtcGxlICIrdHJhay5uZXh0U2FtcGxlKTsKCQkJCQl2YXIgcmVzdWx0ID0gdGhpcy5jcmVhdGVGcmFnbWVudChmcmFnVHJhay5pZCwgdHJhay5uZXh0U2FtcGxlLCBmcmFnVHJhay5zZWdtZW50U3RyZWFtKTsKCQkJCQlpZiAocmVzdWx0KSB7CgkJCQkJCWZyYWdUcmFrLnNlZ21lbnRTdHJlYW0gPSByZXN1bHQ7CgkJCQkJCXRyYWsubmV4dFNhbXBsZSsrOwoJCQkJCX0gZWxzZSB7CgkJCQkJCS8qIFRoZSBmcmFnbWVudCBjb3VsZCBub3QgYmUgY3JlYXRlZCBiZWNhdXNlIHRoZSBtZWRpYSBkYXRhIGlzIG5vdCB0aGVyZSAobm90IGRvd25sb2FkZWQpLCB3YWl0IGZvciBpdCAqLwoJCQkJCQlicmVhazsKCQkJCQl9CgkJCQkJLyogQSBmcmFnbWVudCBpcyBjcmVhdGVkIGJ5IHNhbXBsZSwgYnV0IHRoZSBzZWdtZW50IGlzIHRoZSBhY2N1bXVsYXRpb24gaW4gdGhlIGJ1ZmZlciBvZiB0aGVzZSBmcmFnbWVudHMuCgkJCQkJICAgSXQgaXMgZmx1c2hlZCBvbmx5IGFzIHJlcXVlc3RlZCBieSB0aGUgYXBwbGljYXRpb24gKG5iX3NhbXBsZXMpIHRvIGF2b2lkIHRvbyBtYW55IGNhbGxiYWNrcyAqLwoJCQkJCWlmICh0cmFrLm5leHRTYW1wbGUgJSBmcmFnVHJhay5uYl9zYW1wbGVzID09PSAwIHx8IChsYXN0IHx8IHRyYWsubmV4dFNhbXBsZSA+PSB0cmFrLnNhbXBsZXMubGVuZ3RoKSkgewoJCQkJCQlMb2cuaW5mbygiSVNPRmlsZSIsICJTZW5kaW5nIGZyYWdtZW50ZWQgZGF0YSBvbiB0cmFjayAjIitmcmFnVHJhay5pZCsiIGZvciBzYW1wbGVzIFsiK01hdGgubWF4KDAsdHJhay5uZXh0U2FtcGxlLWZyYWdUcmFrLm5iX3NhbXBsZXMpKyIsIisodHJhay5uZXh0U2FtcGxlLTEpKyJdIik7CgkJCQkJCUxvZy5pbmZvKCJJU09GaWxlIiwgIlNhbXBsZSBkYXRhIHNpemUgaW4gbWVtb3J5OiAiK3RoaXMuZ2V0QWxsb2NhdGVkU2FtcGxlRGF0YVNpemUoKSk7CgkJCQkJCWlmICh0aGlzLm9uU2VnbWVudCkgewoJCQkJCQkJdGhpcy5vblNlZ21lbnQoZnJhZ1RyYWsuaWQsIGZyYWdUcmFrLnVzZXIsIGZyYWdUcmFrLnNlZ21lbnRTdHJlYW0uYnVmZmVyLCB0cmFrLm5leHRTYW1wbGUsIChsYXN0IHx8IHRyYWsubmV4dFNhbXBsZSA+PSB0cmFrLnNhbXBsZXMubGVuZ3RoKSk7CgkJCQkJCX0KCQkJCQkJLyogZm9yY2UgdGhlIGNyZWF0aW9uIG9mIGEgbmV3IGJ1ZmZlciAqLwoJCQkJCQlmcmFnVHJhay5zZWdtZW50U3RyZWFtID0gbnVsbDsKCQkJCQkJaWYgKGZyYWdUcmFrICE9PSB0aGlzLmZyYWdtZW50ZWRUcmFja3NbaV0pIHsKCQkJCQkJCS8qIG1ha2Ugc3VyZSB3ZSBjYW4gc3RvcCBmcmFnbWVudGF0aW9uIGlmIG5lZWRlZCAqLwoJCQkJCQkJYnJlYWs7CgkJCQkJCX0KCQkJCQl9CgkJCQl9CgkJCX0KCQl9CgoJCWlmICh0aGlzLm9uU2FtcGxlcyAhPT0gbnVsbCkgewoJCQkvKiBGb3IgZWFjaCB0cmFjayBtYXJrZWQgZm9yIGRhdGEgZXhwb3J0LAoJCQkgICBjaGVjayBpZiB0aGUgbmV4dCBzYW1wbGUgaXMgdGhlcmUgKGkuZS4gaGFzIGJlZW4gZG93bmxvYWRlZCkgYW5kIHNlbmQgaXQgKi8KCQkJZm9yIChpID0gMDsgaSA8IHRoaXMuZXh0cmFjdGVkVHJhY2tzLmxlbmd0aDsgaSsrKSB7CgkJCQl2YXIgZXh0cmFjdFRyYWsgPSB0aGlzLmV4dHJhY3RlZFRyYWNrc1tpXTsKCQkJCXRyYWsgPSBleHRyYWN0VHJhay50cmFrOwoJCQkJd2hpbGUgKHRyYWsubmV4dFNhbXBsZSA8IHRyYWsuc2FtcGxlcy5sZW5ndGggJiYgdGhpcy5zYW1wbGVQcm9jZXNzaW5nU3RhcnRlZCkgewoJCQkJCUxvZy5kZWJ1ZygiSVNPRmlsZSIsICJFeHBvcnRpbmcgb24gdHJhY2sgIyIrZXh0cmFjdFRyYWsuaWQgKyIgc2FtcGxlICMiK3RyYWsubmV4dFNhbXBsZSk7CgkJCQkJdmFyIHNhbXBsZSA9IHRoaXMuZ2V0U2FtcGxlKHRyYWssIHRyYWsubmV4dFNhbXBsZSk7CgkJCQkJaWYgKHNhbXBsZSkgewoJCQkJCQl0cmFrLm5leHRTYW1wbGUrKzsKCQkJCQkJZXh0cmFjdFRyYWsuc2FtcGxlcy5wdXNoKHNhbXBsZSk7CgkJCQkJfSBlbHNlIHsKCQkJCQkJYnJlYWs7CgkJCQkJfQoJCQkJCWlmICh0cmFrLm5leHRTYW1wbGUgJSBleHRyYWN0VHJhay5uYl9zYW1wbGVzID09PSAwIHx8IHRyYWsubmV4dFNhbXBsZSA+PSB0cmFrLnNhbXBsZXMubGVuZ3RoKSB7CgkJCQkJCUxvZy5kZWJ1ZygiSVNPRmlsZSIsICJTZW5kaW5nIHNhbXBsZXMgb24gdHJhY2sgIyIrZXh0cmFjdFRyYWsuaWQrIiBmb3Igc2FtcGxlICIrdHJhay5uZXh0U2FtcGxlKTsKCQkJCQkJaWYgKHRoaXMub25TYW1wbGVzKSB7CgkJCQkJCQl0aGlzLm9uU2FtcGxlcyhleHRyYWN0VHJhay5pZCwgZXh0cmFjdFRyYWsudXNlciwgZXh0cmFjdFRyYWsuc2FtcGxlcyk7CgkJCQkJCX0KCQkJCQkJZXh0cmFjdFRyYWsuc2FtcGxlcyA9IFtdOwoJCQkJCQlpZiAoZXh0cmFjdFRyYWsgIT09IHRoaXMuZXh0cmFjdGVkVHJhY2tzW2ldKSB7CgkJCQkJCQkvKiBjaGVjayBpZiB0aGUgZXh0cmFjdGlvbiBuZWVkcyB0byBiZSBzdG9wcGVkICovCgkJCQkJCQlicmVhazsKCQkJCQkJfQoJCQkJCX0KCQkJCX0KCQkJfQoJCX0KCX07CgoJLyogRmluZCBhbmQgcmV0dXJuIHNwZWNpZmljIGJveGVzIHVzaW5nIHJlY3Vyc2lvbiBhbmQgZWFybHkgcmV0dXJuICovCglJU09GaWxlLnByb3RvdHlwZS5nZXRCb3ggPSBmdW5jdGlvbih0eXBlKSB7CgkgIHZhciByZXN1bHQgPSB0aGlzLmdldEJveGVzKHR5cGUsIHRydWUpOwoJICByZXR1cm4gKHJlc3VsdC5sZW5ndGggPyByZXN1bHRbMF0gOiBudWxsKTsKCX07CgoJSVNPRmlsZS5wcm90b3R5cGUuZ2V0Qm94ZXMgPSBmdW5jdGlvbih0eXBlLCByZXR1cm5FYXJseSkgewoJICB2YXIgcmVzdWx0ID0gW107CgkgIElTT0ZpbGUuX3N3ZWVwLmNhbGwodGhpcywgdHlwZSwgcmVzdWx0LCByZXR1cm5FYXJseSk7CgkgIHJldHVybiByZXN1bHQ7Cgl9OwoKCUlTT0ZpbGUuX3N3ZWVwID0gZnVuY3Rpb24odHlwZSwgcmVzdWx0LCByZXR1cm5FYXJseSkgewoJICBpZiAodGhpcy50eXBlICYmIHRoaXMudHlwZSA9PSB0eXBlKSByZXN1bHQucHVzaCh0aGlzKTsKCSAgZm9yICh2YXIgYm94IGluIHRoaXMuYm94ZXMpIHsKCSAgICBpZiAocmVzdWx0Lmxlbmd0aCAmJiByZXR1cm5FYXJseSkgcmV0dXJuOwoJICAgIElTT0ZpbGUuX3N3ZWVwLmNhbGwodGhpcy5ib3hlc1tib3hdLCB0eXBlLCByZXN1bHQsIHJldHVybkVhcmx5KTsKCSAgfQoJfTsKCglJU09GaWxlLnByb3RvdHlwZS5nZXRUcmFja1NhbXBsZXNJbmZvID0gZnVuY3Rpb24odHJhY2tfaWQpIHsKCQl2YXIgdHJhY2sgPSB0aGlzLmdldFRyYWNrQnlJZCh0cmFja19pZCk7CgkJaWYgKHRyYWNrKSB7CgkJCXJldHVybiB0cmFjay5zYW1wbGVzOwoJCX0gZWxzZSB7CgkJCXJldHVybjsKCQl9Cgl9OwoKCUlTT0ZpbGUucHJvdG90eXBlLmdldFRyYWNrU2FtcGxlID0gZnVuY3Rpb24odHJhY2tfaWQsIG51bWJlcikgewoJCXZhciB0cmFjayA9IHRoaXMuZ2V0VHJhY2tCeUlkKHRyYWNrX2lkKTsKCQl2YXIgc2FtcGxlID0gdGhpcy5nZXRTYW1wbGUodHJhY2ssIG51bWJlcik7CgkJcmV0dXJuIHNhbXBsZTsKCX07CgoJLyogQ2FsbGVkIGJ5IHRoZSBhcHBsaWNhdGlvbiB0byByZWxlYXNlIHRoZSByZXNvdXJjZXMgYXNzb2NpYXRlZCB0byBzYW1wbGVzIGFscmVhZHkgZm9yd2FyZGVkIHRvIHRoZSBhcHBsaWNhdGlvbiAqLwoJSVNPRmlsZS5wcm90b3R5cGUucmVsZWFzZVVzZWRTYW1wbGVzID0gZnVuY3Rpb24gKGlkLCBzYW1wbGVOdW0pIHsKCQl2YXIgc2l6ZSA9IDA7CgkJdmFyIHRyYWsgPSB0aGlzLmdldFRyYWNrQnlJZChpZCk7CgkJaWYgKCF0cmFrLmxhc3RWYWxpZFNhbXBsZSkgdHJhay5sYXN0VmFsaWRTYW1wbGUgPSAwOwoJCWZvciAodmFyIGkgPSB0cmFrLmxhc3RWYWxpZFNhbXBsZTsgaSA8IHNhbXBsZU51bTsgaSsrKSB7CgkJCXNpemUrPXRoaXMucmVsZWFzZVNhbXBsZSh0cmFrLCBpKTsKCQl9CgkJTG9nLmluZm8oIklTT0ZpbGUiLCAiVHJhY2sgIyIraWQrIiByZWxlYXNlZCBzYW1wbGVzIHVwIHRvICIrc2FtcGxlTnVtKyIgKHJlbGVhc2VkIHNpemU6ICIrc2l6ZSsiLCByZW1haW5pbmc6ICIrdGhpcy5zYW1wbGVzRGF0YVNpemUrIikiKTsKCQl0cmFrLmxhc3RWYWxpZFNhbXBsZSA9IHNhbXBsZU51bTsKCX07CgoJSVNPRmlsZS5wcm90b3R5cGUuc3RhcnQgPSBmdW5jdGlvbigpIHsKCQl0aGlzLnNhbXBsZVByb2Nlc3NpbmdTdGFydGVkID0gdHJ1ZTsKCQl0aGlzLnByb2Nlc3NTYW1wbGVzKGZhbHNlKTsKCX07CgoJSVNPRmlsZS5wcm90b3R5cGUuc3RvcCA9IGZ1bmN0aW9uKCkgewoJCXRoaXMuc2FtcGxlUHJvY2Vzc2luZ1N0YXJ0ZWQgPSBmYWxzZTsKCX07CgoJLyogQ2FsbGVkIGJ5IHRoZSBhcHBsaWNhdGlvbiB0byBmbHVzaCB0aGUgcmVtYWluaW5nIHNhbXBsZXMgKGUuZy4gb25jZSB0aGUgZG93bmxvYWQgaXMgZmluaXNoZWQgb3Igd2hlbiBubyBtb3JlIHNhbXBsZXMgd2lsbCBiZSBhZGRlZCkgKi8KCUlTT0ZpbGUucHJvdG90eXBlLmZsdXNoID0gZnVuY3Rpb24oKSB7CgkJTG9nLmluZm8oIklTT0ZpbGUiLCAiRmx1c2hpbmcgcmVtYWluaW5nIHNhbXBsZXMiKTsKCQl0aGlzLnVwZGF0ZVNhbXBsZUxpc3RzKCk7CgkJdGhpcy5wcm9jZXNzU2FtcGxlcyh0cnVlKTsKCQl0aGlzLnN0cmVhbS5jbGVhbkJ1ZmZlcnMoKTsKCQl0aGlzLnN0cmVhbS5sb2dCdWZmZXJMZXZlbCh0cnVlKTsKCX07CgoJLyogRmluZHMgdGhlIGJ5dGUgb2Zmc2V0IGZvciBhIGdpdmVuIHRpbWUgb24gYSBnaXZlbiB0cmFjawoJICAgYWxzbyByZXR1cm5zIHRoZSB0aW1lIG9mIHRoZSBwcmV2aW91cyByYXAgKi8KCUlTT0ZpbGUucHJvdG90eXBlLnNlZWtUcmFjayA9IGZ1bmN0aW9uKHRpbWUsIHVzZVJhcCwgdHJhaykgewoJCXZhciBqOwoJCXZhciBzYW1wbGU7CgkJdmFyIHNlZWtfb2Zmc2V0ID0gSW5maW5pdHk7CgkJdmFyIHJhcF9zZWVrX3NhbXBsZV9udW0gPSAwOwoJCXZhciBzZWVrX3NhbXBsZV9udW0gPSAwOwoJCXZhciB0aW1lc2NhbGU7CgoJCWlmICh0cmFrLnNhbXBsZXMubGVuZ3RoID09PSAwKSB7CgkJCUxvZy5pbmZvKCJJU09GaWxlIiwgIk5vIHNhbXBsZSBpbiB0cmFjaywgY2Fubm90IHNlZWshIFVzaW5nIHRpbWUgIitMb2cuZ2V0RHVyYXRpb25TdHJpbmcoMCwgMSkgKyIgYW5kIG9mZnNldDogIiswKTsKCQkJcmV0dXJuIHsgb2Zmc2V0OiAwLCB0aW1lOiAwIH07CgkJfQoKCQlmb3IgKGogPSAwOyBqIDwgdHJhay5zYW1wbGVzLmxlbmd0aDsgaisrKSB7CgkJCXNhbXBsZSA9IHRyYWsuc2FtcGxlc1tqXTsKCQkJaWYgKGogPT09IDApIHsKCQkJCXNlZWtfc2FtcGxlX251bSA9IDA7CgkJCQl0aW1lc2NhbGUgPSBzYW1wbGUudGltZXNjYWxlOwoJCQl9IGVsc2UgaWYgKHNhbXBsZS5jdHMgPiB0aW1lICogc2FtcGxlLnRpbWVzY2FsZSkgewoJCQkJc2Vla19zYW1wbGVfbnVtID0gai0xOwoJCQkJYnJlYWs7CgkJCX0KCQkJaWYgKHVzZVJhcCAmJiBzYW1wbGUuaXNfc3luYykgewoJCQkJcmFwX3NlZWtfc2FtcGxlX251bSA9IGo7CgkJCX0KCQl9CgkJaWYgKHVzZVJhcCkgewoJCQlzZWVrX3NhbXBsZV9udW0gPSByYXBfc2Vla19zYW1wbGVfbnVtOwoJCX0KCQl0aW1lID0gdHJhay5zYW1wbGVzW3NlZWtfc2FtcGxlX251bV0uY3RzOwoJCXRyYWsubmV4dFNhbXBsZSA9IHNlZWtfc2FtcGxlX251bTsKCQl3aGlsZSAodHJhay5zYW1wbGVzW3NlZWtfc2FtcGxlX251bV0uYWxyZWFkeVJlYWQgPT09IHRyYWsuc2FtcGxlc1tzZWVrX3NhbXBsZV9udW1dLnNpemUpIHsKCQkJLy8gTm8gcmVtYWluaW5nIHNhbXBsZXMgdG8gbG9vayBmb3IsIGFsbCBhcmUgZG93bmxvYWRlZC4KCQkJaWYgKCF0cmFrLnNhbXBsZXNbc2Vla19zYW1wbGVfbnVtICsgMV0pIHsKCQkJCWJyZWFrOwoJCQl9CgkJCXNlZWtfc2FtcGxlX251bSsrOwoJCX0KCQlzZWVrX29mZnNldCA9IHRyYWsuc2FtcGxlc1tzZWVrX3NhbXBsZV9udW1dLm9mZnNldCt0cmFrLnNhbXBsZXNbc2Vla19zYW1wbGVfbnVtXS5hbHJlYWR5UmVhZDsKCQlMb2cuaW5mbygiSVNPRmlsZSIsICJTZWVraW5nIHRvICIrKHVzZVJhcCA/ICJSQVAiOiAiIikrIiBzYW1wbGUgIyIrdHJhay5uZXh0U2FtcGxlKyIgb24gdHJhY2sgIit0cmFrLnRraGQudHJhY2tfaWQrIiwgdGltZSAiK0xvZy5nZXREdXJhdGlvblN0cmluZyh0aW1lLCB0aW1lc2NhbGUpICsiIGFuZCBvZmZzZXQ6ICIrc2Vla19vZmZzZXQpOwoJCXJldHVybiB7IG9mZnNldDogc2Vla19vZmZzZXQsIHRpbWU6IHRpbWUvdGltZXNjYWxlIH07Cgl9OwoKCS8qIEZpbmRzIHRoZSBieXRlIG9mZnNldCBpbiB0aGUgZmlsZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiB0aW1lIG9yIHRvIHRoZSB0aW1lIG9mIHRoZSBwcmV2aW91cyBSQVAgKi8KCUlTT0ZpbGUucHJvdG90eXBlLnNlZWsgPSBmdW5jdGlvbih0aW1lLCB1c2VSYXApIHsKCQl2YXIgbW9vdiA9IHRoaXMubW9vdjsKCQl2YXIgdHJhazsKCQl2YXIgdHJha19zZWVrX2luZm87CgkJdmFyIGk7CgkJdmFyIHNlZWtfaW5mbyA9IHsgb2Zmc2V0OiBJbmZpbml0eSwgdGltZTogSW5maW5pdHkgfTsKCQlpZiAoIXRoaXMubW9vdikgewoJCQl0aHJvdyAiQ2Fubm90IHNlZWs6IG1vb3Ygbm90IHJlY2VpdmVkISI7CgkJfSBlbHNlIHsKCQkJZm9yIChpID0gMDsgaTxtb292LnRyYWtzLmxlbmd0aDsgaSsrKSB7CgkJCQl0cmFrID0gbW9vdi50cmFrc1tpXTsKCQkJCXRyYWtfc2Vla19pbmZvID0gdGhpcy5zZWVrVHJhY2sodGltZSwgdXNlUmFwLCB0cmFrKTsKCQkJCWlmICh0cmFrX3NlZWtfaW5mby5vZmZzZXQgPCBzZWVrX2luZm8ub2Zmc2V0KSB7CgkJCQkJc2Vla19pbmZvLm9mZnNldCA9IHRyYWtfc2Vla19pbmZvLm9mZnNldDsKCQkJCX0KCQkJCWlmICh0cmFrX3NlZWtfaW5mby50aW1lIDwgc2Vla19pbmZvLnRpbWUpIHsKCQkJCQlzZWVrX2luZm8udGltZSA9IHRyYWtfc2Vla19pbmZvLnRpbWU7CgkJCQl9CgkJCX0KCQkJTG9nLmluZm8oIklTT0ZpbGUiLCAiU2Vla2luZyBhdCB0aW1lICIrTG9nLmdldER1cmF0aW9uU3RyaW5nKHNlZWtfaW5mby50aW1lLCAxKSsiIG5lZWRzIGEgYnVmZmVyIHdpdGggYSBmaWxlU3RhcnQgcG9zaXRpb24gb2YgIitzZWVrX2luZm8ub2Zmc2V0KTsKCQkJaWYgKHNlZWtfaW5mby5vZmZzZXQgPT09IEluZmluaXR5KSB7CgkJCQkvKiBObyBzYW1wbGUgaW5mbywgaW4gYWxsIHRyYWNrcywgY2Fubm90IHNlZWsgKi8KCQkJCXNlZWtfaW5mbyA9IHsgb2Zmc2V0OiB0aGlzLm5leHRQYXJzZVBvc2l0aW9uLCB0aW1lOiAwIH07CgkJCX0gZWxzZSB7CgkJCQkvKiBjaGVjayBpZiB0aGUgc2VlayBwb3NpdGlvbiBpcyBhbHJlYWR5IGluIHNvbWUgYnVmZmVyIGFuZAoJCQkJIGluIHRoYXQgY2FzZSByZXR1cm4gdGhlIGVuZCBvZiB0aGF0IGJ1ZmZlciAob3Igb2YgdGhlIGxhc3QgY29udGlndW91cyBidWZmZXIpICovCgkJCQkvKiBUT0RPOiBTaG91bGQgd2FpdCB1bnRpbCBhcHBlbmQgb3BlcmF0aW9ucyBhcmUgZG9uZSAqLwoJCQkJc2Vla19pbmZvLm9mZnNldCA9IHRoaXMuc3RyZWFtLmdldEVuZEZpbGVQb3NpdGlvbkFmdGVyKHNlZWtfaW5mby5vZmZzZXQpOwoJCQl9CgkJCUxvZy5pbmZvKCJJU09GaWxlIiwgIkFkanVzdGVkIHNlZWsgcG9zaXRpb24gKGFmdGVyIGNoZWNraW5nIGRhdGEgYWxyZWFkeSBpbiBidWZmZXIpOiAiK3NlZWtfaW5mby5vZmZzZXQpOwoJCQlyZXR1cm4gc2Vla19pbmZvOwoJCX0KCX07CgoJSVNPRmlsZS5wcm90b3R5cGUuZXF1YWwgPSBmdW5jdGlvbihiKSB7CgkJdmFyIGJveF9pbmRleCA9IDA7CgkJd2hpbGUgKGJveF9pbmRleCA8IHRoaXMuYm94ZXMubGVuZ3RoICYmIGJveF9pbmRleCA8IGIuYm94ZXMubGVuZ3RoKSB7CgkJCXZhciBhX2JveCA9IHRoaXMuYm94ZXNbYm94X2luZGV4XTsKCQkJdmFyIGJfYm94ID0gYi5ib3hlc1tib3hfaW5kZXhdOwoJCQlpZiAoIUJveFBhcnNlci5ib3hFcXVhbChhX2JveCwgYl9ib3gpKSB7CgkJCQlyZXR1cm4gZmFsc2U7CgkJCX0KCQkJYm94X2luZGV4Kys7CgkJfQoJCXJldHVybiB0cnVlOwoJfTsKCgl7CgkJZXhwb3J0cyQxLklTT0ZpbGUgPSBJU09GaWxlOwoJfQoJLy8gZmlsZTpzcmMvaXNvZmlsZS1hZHZhbmNlZC1wYXJzaW5nLmpzCgkvKiBwb3NpdGlvbiBpbiB0aGUgY3VycmVudCBidWZmZXIgb2YgdGhlIGJlZ2lubmluZyBvZiB0aGUgbGFzdCBib3ggcGFyc2VkICovCglJU09GaWxlLnByb3RvdHlwZS5sYXN0Qm94U3RhcnRQb3NpdGlvbiA9IDA7CgkvKiBpbmRpY2F0b3IgaWYgdGhlIHBhcnNpbmcgaXMgc3R1Y2sgaW4gdGhlIG1pZGRsZSBvZiBhbiBtZGF0IGJveCAqLwoJSVNPRmlsZS5wcm90b3R5cGUucGFyc2luZ01kYXQgPSBudWxsOwoJLyogbmV4dCBmaWxlIHBvc2l0aW9uIHRoYXQgdGhlIHBhcnNlciBuZWVkczoKCSAgICAtIDAgdW50aWwgdGhlIGZpcnN0IGJ1ZmZlciAoaS5lLiBmaWxlU3RhcnQgPT09MCkgaGFzIGJlZW4gcmVjZWl2ZWQgCgkgICAgLSBvdGhlcndpc2UsIHRoZSBuZXh0IGJveCBzdGFydCB1bnRpbCB0aGUgbW9vdiBib3ggaGFzIGJlZW4gcGFyc2VkCgkgICAgLSBvdGhlcndpc2UsIHRoZSBwb3NpdGlvbiBvZiB0aGUgbmV4dCBzYW1wbGUgdG8gZmV0Y2gKCSAqLwoJSVNPRmlsZS5wcm90b3R5cGUubmV4dFBhcnNlUG9zaXRpb24gPSAwOwoJLyoga2VlcCBtZGF0IGRhdGEgKi8KCUlTT0ZpbGUucHJvdG90eXBlLmRpc2NhcmRNZGF0RGF0YSA9IGZhbHNlOwoKCUlTT0ZpbGUucHJvdG90eXBlLnByb2Nlc3NJbmNvbXBsZXRlQm94ID0gZnVuY3Rpb24ocmV0KSB7CgkJdmFyIGJveDsKCQl2YXIgbWVyZ2VkOwoJCXZhciBmb3VuZDsKCQkKCQkvKiB3ZSBkaWQgbm90IGhhdmUgZW5vdWdoIGJ5dGVzIGluIHRoZSBjdXJyZW50IGJ1ZmZlciB0byBwYXJzZSB0aGUgZW50aXJlIGJveCAqLwoJCWlmIChyZXQudHlwZSA9PT0gIm1kYXQiKSB7IAoJCQkvKiB3ZSBoYWQgZW5vdWdoIGJ5dGVzIHRvIGdldCBpdHMgdHlwZSBhbmQgc2l6ZSBhbmQgaXQncyBhbiAnbWRhdCcgKi8KCQkJCgkJCS8qIHNwZWNpYWwgaGFuZGxpbmcgZm9yIG1kYXQgYm94ZXMsIHNpbmNlIHdlIGRvbid0IGFjdHVhbGx5IG5lZWQgdG8gcGFyc2UgaXQgbGluZWFybHkgCgkJCSAgIHdlIGNyZWF0ZSB0aGUgYm94ICovCgkJCWJveCA9IG5ldyBCb3hQYXJzZXJbcmV0LnR5cGUrIkJveCJdKHJldC5zaXplKTsJCgkJCXRoaXMucGFyc2luZ01kYXQgPSBib3g7CgkJCXRoaXMuYm94ZXMucHVzaChib3gpOwoJCQl0aGlzLm1kYXRzLnB1c2goYm94KTsJCQkKCQkJYm94LnN0YXJ0ID0gcmV0LnN0YXJ0OwoJCQlib3guaGRyX3NpemUgPSByZXQuaGRyX3NpemU7CgkJCXRoaXMuc3RyZWFtLmFkZFVzZWRCeXRlcyhib3guaGRyX3NpemUpOwoKCQkJLyogaW5kaWNhdGUgdGhhdCB0aGUgcGFyc2luZyBzaG91bGQgc3RhcnQgZnJvbSB0aGUgZW5kIG9mIHRoZSBib3ggKi8KCQkJdGhpcy5sYXN0Qm94U3RhcnRQb3NpdGlvbiA9IGJveC5zdGFydCArIGJveC5zaXplOwoJIAkJLyogbGV0J3Mgc2VlIGlmIHdlIGhhdmUgdGhlIGVuZCBvZiB0aGUgYm94IGluIHRoZSBvdGhlciBidWZmZXJzICovCgkJCWZvdW5kID0gdGhpcy5zdHJlYW0uc2Vlayhib3guc3RhcnQgKyBib3guc2l6ZSwgZmFsc2UsIHRoaXMuZGlzY2FyZE1kYXREYXRhKTsKCQkJaWYgKGZvdW5kKSB7CgkJCQkvKiBmb3VuZCB0aGUgZW5kIG9mIHRoZSBib3ggKi8KCQkJCXRoaXMucGFyc2luZ01kYXQgPSBudWxsOwoJCQkJLyogbGV0J3Mgc2VlIGlmIHdlIGNhbiBwYXJzZSBtb3JlIGluIHRoaXMgYnVmZmVyICovCgkJCQlyZXR1cm4gdHJ1ZTsKCQkJfSBlbHNlIHsKCQkJCS8qICdtZGF0JyBlbmQgbm90IGZvdW5kIGluIHRoZSBleGlzdGluZyBidWZmZXJzICovCgkJCQkvKiBkZXRlcm1pbmUgdGhlIG5leHQgcG9zaXRpb24gaW4gdGhlIGZpbGUgdG8gc3RhcnQgcGFyc2luZyBmcm9tICovCgkJCQlpZiAoIXRoaXMubW9vdlN0YXJ0Rm91bmQpIHsKCQkJCQkvKiBtb292IG5vdCBmaW5kIHlldCwgCgkJCQkJICAgdGhlIGZpbGUgcHJvYmFibHkgaGFzICdtZGF0JyBhdCB0aGUgYmVnaW5uaW5nLCBhbmQgJ21vb3YnIGF0IHRoZSBlbmQsIAoJCQkJCSAgIGluZGljYXRlIHRoYXQgdGhlIGRvd25sb2FkZXIgc2hvdWxkIG5vdCB0cnkgdG8gZG93bmxvYWQgdGhvc2UgYnl0ZXMgbm93ICovCgkJCQkJdGhpcy5uZXh0UGFyc2VQb3NpdGlvbiA9IGJveC5zdGFydCArIGJveC5zaXplOwoJCQkJfSBlbHNlIHsKCQkJCQkvKiB3ZSBoYXZlIHRoZSBzdGFydCBvZiB0aGUgbW9vdiBib3gsIAoJCQkJCSAgIHRoZSBuZXh0IGJ5dGVzIHNob3VsZCB0cnkgdG8gY29tcGxldGUgdGhlIGN1cnJlbnQgJ21kYXQnICovCgkJCQkJdGhpcy5uZXh0UGFyc2VQb3NpdGlvbiA9IHRoaXMuc3RyZWFtLmZpbmRFbmRDb250aWd1b3VzQnVmKCk7CgkJCQl9CgkJCQkvKiBub3QgbXVjaCB3ZSBjYW4gZG8sIHdhaXQgZm9yIG1vcmUgYnVmZmVycyB0byBhcnJpdmUgKi8KCQkJCXJldHVybiBmYWxzZTsKCQkJfQoJCX0gZWxzZSB7CgkJCS8qIGJveCBpcyBpbmNvbXBsZXRlLCB3ZSBtYXkgbm90IGV2ZW4ga25vdyBpdHMgdHlwZSAqLwoJCQlpZiAocmV0LnR5cGUgPT09ICJtb292IikgeyAKCQkJCS8qIHRoZSBpbmNvbXBsZXRlIGJveCBpcyBhICdtb292JyBib3ggKi8KCQkJCXRoaXMubW9vdlN0YXJ0Rm91bmQgPSB0cnVlOwoJCQkJaWYgKHRoaXMubWRhdHMubGVuZ3RoID09PSAwKSB7CgkJCQkJdGhpcy5pc1Byb2dyZXNzaXZlID0gdHJ1ZTsKCQkJCX0KCQkJfQoJCQkvKiBlaXRoZXIgaXQncyBub3QgYW4gbWRhdCBib3ggKGFuZCB3ZSBuZWVkIHRvIHBhcnNlIGl0LCB3ZSBjYW5ub3Qgc2tpcCBpdCkKCQkJICAgKFRPRE86IHdlIGNvdWxkIHNraXAgJ2ZyZWUnIGJveGVzIC4uLikKCQkJCSAgIG9yIHdlIGRpZCBub3QgaGF2ZSBlbm91Z2ggZGF0YSB0byBwYXJzZSB0aGUgdHlwZSBhbmQgc2l6ZSBvZiB0aGUgYm94LCAKCQkJICAgd2UgdHJ5IHRvIGNvbmNhdGVuYXRlIHRoZSBjdXJyZW50IGJ1ZmZlciB3aXRoIHRoZSBuZXh0IGJ1ZmZlciB0byByZXN0YXJ0IHBhcnNpbmcgKi8KCQkJbWVyZ2VkID0gKHRoaXMuc3RyZWFtLm1lcmdlTmV4dEJ1ZmZlciA/IHRoaXMuc3RyZWFtLm1lcmdlTmV4dEJ1ZmZlcigpIDogZmFsc2UpOwoJCQlpZiAobWVyZ2VkKSB7CgkJCQkvKiBUaGUgbmV4dCBidWZmZXIgd2FzIGNvbnRpZ3VvdXMsIHRoZSBtZXJnaW5nIHN1Y2NlZWRlZCwKCQkJCSAgIHdlIGNhbiBub3cgY29udGludWUgcGFyc2luZywgCgkJCQkgICB0aGUgbmV4dCBiZXN0IHBvc2l0aW9uIHRvIHBhcnNlIGlzIGF0IHRoZSBlbmQgb2YgdGhpcyBuZXcgYnVmZmVyICovCgkJCQl0aGlzLm5leHRQYXJzZVBvc2l0aW9uID0gdGhpcy5zdHJlYW0uZ2V0RW5kUG9zaXRpb24oKTsKCQkJCXJldHVybiB0cnVlOwoJCQl9IGVsc2UgewoJCQkJLyogd2UgY2Fubm90IGNvbmNhdGVuYXRlIGV4aXN0aW5nIGJ1ZmZlcnMgYmVjYXVzZSB0aGV5IGFyZSBub3QgY29udGlndW91cyBvciBiZWNhdXNlIHRoZXJlIGlzIG5vIGFkZGl0aW9uYWwgYnVmZmVyICovCgkJCQkvKiBUaGUgbmV4dCBiZXN0IHBvc2l0aW9uIHRvIHBhcnNlIGlzIHN0aWxsIGF0IHRoZSBlbmQgb2YgdGhpcyBvbGQgYnVmZmVyICovCgkJCQlpZiAoIXJldC50eXBlKSB7CgkJCQkJLyogVGhlcmUgd2VyZSBub3QgZW5vdWdoIGJ5dGVzIGluIHRoZSBidWZmZXIgdG8gcGFyc2UgdGhlIGJveCB0eXBlIGFuZCBsZW5ndGgsCgkJCQkJICAgdGhlIG5leHQgZmV0Y2ggc2hvdWxkIHJldHJpZXZlIHRob3NlIG1pc3NpbmcgYnl0ZXMsIGkuZS4gdGhlIG5leHQgYnl0ZXMgYWZ0ZXIgdGhpcyBidWZmZXIgKi8KCQkJCQl0aGlzLm5leHRQYXJzZVBvc2l0aW9uID0gdGhpcy5zdHJlYW0uZ2V0RW5kUG9zaXRpb24oKTsKCQkJCX0gZWxzZSB7CgkJCQkJLyogd2UgaGFkIGVub3VnaCBieXRlcyB0byBwYXJzZSBzaXplIGFuZCB0eXBlIG9mIHRoZSBpbmNvbXBsZXRlIGJveAoJCQkJCSAgIGlmIHdlIGhhdmVuJ3QgZm91bmQgeWV0IHRoZSBtb292IGJveCwgc2tpcCB0aGlzIG9uZSBhbmQgdHJ5IHRoZSBuZXh0IG9uZSAKCQkJCQkgICBpZiB3ZSBoYXZlIGZvdW5kIHRoZSBtb292IGJveCwgbGV0J3MgY29udGludWUgbGluZWFyIHBhcnNpbmcgKi8KCQkJCQlpZiAodGhpcy5tb292U3RhcnRGb3VuZCkgewoJCQkJCQl0aGlzLm5leHRQYXJzZVBvc2l0aW9uID0gdGhpcy5zdHJlYW0uZ2V0RW5kUG9zaXRpb24oKTsKCQkJCQl9IGVsc2UgewoJCQkJCQl0aGlzLm5leHRQYXJzZVBvc2l0aW9uID0gdGhpcy5zdHJlYW0uZ2V0UG9zaXRpb24oKSArIHJldC5zaXplOwoJCQkJCX0KCQkJCX0KCQkJCXJldHVybiBmYWxzZTsKCQkJfQoJCX0KCX07CgoJSVNPRmlsZS5wcm90b3R5cGUuaGFzSW5jb21wbGV0ZU1kYXQgPSBmdW5jdGlvbiAoKSB7CgkJcmV0dXJuICh0aGlzLnBhcnNpbmdNZGF0ICE9PSBudWxsKTsKCX07CgoJSVNPRmlsZS5wcm90b3R5cGUucHJvY2Vzc0luY29tcGxldGVNZGF0ID0gZnVuY3Rpb24gKCkgewoJCXZhciBib3g7CgkJdmFyIGZvdW5kOwoJCQoJCS8qIHdlIGFyZSBpbiB0aGUgcGFyc2luZyBvZiBhbiBpbmNvbXBsZXRlIG1kYXQgYm94ICovCgkJYm94ID0gdGhpcy5wYXJzaW5nTWRhdDsKCgkJZm91bmQgPSB0aGlzLnN0cmVhbS5zZWVrKGJveC5zdGFydCArIGJveC5zaXplLCBmYWxzZSwgdGhpcy5kaXNjYXJkTWRhdERhdGEpOwoJCWlmIChmb3VuZCkgewoJCQlMb2cuZGVidWcoIklTT0ZpbGUiLCAiRm91bmQgJ21kYXQnIGVuZCBpbiBidWZmZXJlZCBkYXRhIik7CgkJCS8qIHRoZSBlbmQgb2YgdGhlIG1kYXQgaGFzIGJlZW4gZm91bmQgKi8gCgkJCXRoaXMucGFyc2luZ01kYXQgPSBudWxsOwoJCQkvKiB3ZSBjYW4gcGFyc2UgbW9yZSBpbiB0aGlzIGJ1ZmZlciAqLwoJCQlyZXR1cm4gdHJ1ZTsKCQl9IGVsc2UgewoJCQkvKiB3ZSBkb24ndCBoYXZlIHRoZSBlbmQgb2YgdGhpcyBtZGF0IHlldCwgCgkJCSAgIGluZGljYXRlIHRoYXQgdGhlIG5leHQgYnl0ZSB0byBmZXRjaCBpcyB0aGUgZW5kIG9mIHRoZSBidWZmZXJzIHdlIGhhdmUgc28gZmFyLCAKCQkJICAgcmV0dXJuIGFuZCB3YWl0IGZvciBtb3JlIGJ1ZmZlciB0byBjb21lICovCgkJCXRoaXMubmV4dFBhcnNlUG9zaXRpb24gPSB0aGlzLnN0cmVhbS5maW5kRW5kQ29udGlndW91c0J1ZigpOwoJCQlyZXR1cm4gZmFsc2U7CgkJfQoJfTsKCglJU09GaWxlLnByb3RvdHlwZS5yZXN0b3JlUGFyc2VQb3NpdGlvbiA9IGZ1bmN0aW9uKCkgewoJCS8qIFJlcG9zaXRpb24gYXQgdGhlIHN0YXJ0IHBvc2l0aW9uIG9mIHRoZSBwcmV2aW91cyBib3ggbm90IGVudGlyZWx5IHBhcnNlZCAqLwoJCXJldHVybiB0aGlzLnN0cmVhbS5zZWVrKHRoaXMubGFzdEJveFN0YXJ0UG9zaXRpb24sIHRydWUsIHRoaXMuZGlzY2FyZE1kYXREYXRhKTsKCX07CgoJSVNPRmlsZS5wcm90b3R5cGUuc2F2ZVBhcnNlUG9zaXRpb24gPSBmdW5jdGlvbigpIHsKCQkvKiByZW1lbWJlciB0aGUgcG9zaXRpb24gb2YgdGhlIGJveCBzdGFydCBpbiBjYXNlIHdlIG5lZWQgdG8gcm9sbCBiYWNrIChpZiB0aGUgYm94IGlzIGluY29tcGxldGUpICovCgkJdGhpcy5sYXN0Qm94U3RhcnRQb3NpdGlvbiA9IHRoaXMuc3RyZWFtLmdldFBvc2l0aW9uKCk7CQoJfTsKCglJU09GaWxlLnByb3RvdHlwZS51cGRhdGVVc2VkQnl0ZXMgPSBmdW5jdGlvbihib3gsIHJldCkgewoJCWlmICh0aGlzLnN0cmVhbS5hZGRVc2VkQnl0ZXMpIHsKCQkJaWYgKGJveC50eXBlID09PSAibWRhdCIpIHsKCQkJCS8qIGZvciBhbiBtZGF0IGJveCwgb25seSBpdHMgaGVhZGVyIGlzIGNvbnNpZGVyZWQgdXNlZCwgb3RoZXIgYnl0ZXMgd2lsbCBiZSB1c2VkIHdoZW4gc2FtcGxlIGRhdGEgaXMgcmVxdWVzdGVkICovCgkJCQl0aGlzLnN0cmVhbS5hZGRVc2VkQnl0ZXMoYm94Lmhkcl9zaXplKTsKCQkJCWlmICh0aGlzLmRpc2NhcmRNZGF0RGF0YSkgewoJCQkJCXRoaXMuc3RyZWFtLmFkZFVzZWRCeXRlcyhib3guc2l6ZS1ib3guaGRyX3NpemUpOwoJCQkJfQoJCQl9IGVsc2UgewoJCQkJLyogZm9yIGFsbCBvdGhlciBib3hlcywgdGhlIGVudGlyZSBib3ggZGF0YSBpcyBjb25zaWRlcmVkIHVzZWQgKi8KCQkJCXRoaXMuc3RyZWFtLmFkZFVzZWRCeXRlcyhib3guc2l6ZSk7CgkJCX0JCgkJfQoJfTsKCS8vIGZpbGU6c3JjL2lzb2ZpbGUtYWR2YW5jZWQtY3JlYXRpb24uanMKCUlTT0ZpbGUucHJvdG90eXBlLmFkZCA9IEJveFBhcnNlci5Cb3gucHJvdG90eXBlLmFkZDsKCUlTT0ZpbGUucHJvdG90eXBlLmFkZEJveCA9IEJveFBhcnNlci5Cb3gucHJvdG90eXBlLmFkZEJveDsKCglJU09GaWxlLnByb3RvdHlwZS5pbml0ID0gZnVuY3Rpb24gKF9vcHRpb25zKSB7CgkJdmFyIG9wdGlvbnMgPSBfb3B0aW9ucyB8fCB7fTsgCgkJdGhpcy5hZGQoImZ0eXAiKS5zZXQoIm1ham9yX2JyYW5kIiwgKG9wdGlvbnMuYnJhbmRzICYmIG9wdGlvbnMuYnJhbmRzWzBdKSB8fCAiaXNvNCIpCgkJCQkJCQkJICAgLnNldCgibWlub3JfdmVyc2lvbiIsIDApCgkJCQkJCQkJICAgLnNldCgiY29tcGF0aWJsZV9icmFuZHMiLCBvcHRpb25zLmJyYW5kcyB8fCBbImlzbzQiXSk7CgkJdmFyIG1vb3YgPSB0aGlzLmFkZCgibW9vdiIpOwoJCW1vb3YuYWRkKCJtdmhkIikuc2V0KCJ0aW1lc2NhbGUiLCBvcHRpb25zLnRpbWVzY2FsZSB8fCA2MDApCgkJCQkJCS5zZXQoInJhdGUiLCBvcHRpb25zLnJhdGUgfHwgMTw8MTYpCgkJCQkJCS5zZXQoImNyZWF0aW9uX3RpbWUiLCAwKQoJCQkJCQkuc2V0KCJtb2RpZmljYXRpb25fdGltZSIsIDApCgkJCQkJCS5zZXQoImR1cmF0aW9uIiwgb3B0aW9ucy5kdXJhdGlvbiB8fCAwKQoJCQkJCQkuc2V0KCJ2b2x1bWUiLCAob3B0aW9ucy53aWR0aCkgPyAwIDogMHgwMTAwKQoJCQkJCQkuc2V0KCJtYXRyaXgiLCBbIDE8PDE2LCAwLCAwLCAwLCAxPDwxNiwgMCwgMCwgMCwgMHg0MDAwMDAwMF0pCgkJCQkJCS5zZXQoIm5leHRfdHJhY2tfaWQiLCAxKTsKCQltb292LmFkZCgibXZleCIpOwoJCXJldHVybiB0aGlzOwoJfTsKCglJU09GaWxlLnByb3RvdHlwZS5hZGRUcmFjayA9IGZ1bmN0aW9uIChfb3B0aW9ucykgewoJCWlmICghdGhpcy5tb292KSB7CgkJCXRoaXMuaW5pdChfb3B0aW9ucyk7CgkJfQoKCQl2YXIgb3B0aW9ucyA9IF9vcHRpb25zIHx8IHt9OyAKCQlvcHRpb25zLndpZHRoID0gb3B0aW9ucy53aWR0aCB8fCAzMjA7CgkJb3B0aW9ucy5oZWlnaHQgPSBvcHRpb25zLmhlaWdodCB8fCAzMjA7CgkJb3B0aW9ucy5pZCA9IG9wdGlvbnMuaWQgfHwgdGhpcy5tb292Lm12aGQubmV4dF90cmFja19pZDsKCQlvcHRpb25zLnR5cGUgPSBvcHRpb25zLnR5cGUgfHwgImF2YzEiOwoKCQl2YXIgdHJhayA9IHRoaXMubW9vdi5hZGQoInRyYWsiKTsKCQl0aGlzLm1vb3YubXZoZC5uZXh0X3RyYWNrX2lkID0gb3B0aW9ucy5pZCsxOwoJCXRyYWsuYWRkKCJ0a2hkIikuc2V0KCJmbGFncyIsQm94UGFyc2VyLlRLSERfRkxBR19FTkFCTEVEIHwgCgkJCQkJCQkJCSBCb3hQYXJzZXIuVEtIRF9GTEFHX0lOX01PVklFIHwgCgkJCQkJCQkJCSBCb3hQYXJzZXIuVEtIRF9GTEFHX0lOX1BSRVZJRVcpCgkJCQkJCS5zZXQoImNyZWF0aW9uX3RpbWUiLDApCgkJCQkJCS5zZXQoIm1vZGlmaWNhdGlvbl90aW1lIiwgMCkKCQkJCQkJLnNldCgidHJhY2tfaWQiLCBvcHRpb25zLmlkKQoJCQkJCQkuc2V0KCJkdXJhdGlvbiIsIG9wdGlvbnMuZHVyYXRpb24gfHwgMCkKCQkJCQkJLnNldCgibGF5ZXIiLCBvcHRpb25zLmxheWVyIHx8IDApCgkJCQkJCS5zZXQoImFsdGVybmF0ZV9ncm91cCIsIDApCgkJCQkJCS5zZXQoInZvbHVtZSIsIDEpCgkJCQkJCS5zZXQoIm1hdHJpeCIsIFsgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCBdKQoJCQkJCQkuc2V0KCJ3aWR0aCIsIG9wdGlvbnMud2lkdGggPDwgMTYpCgkJCQkJCS5zZXQoImhlaWdodCIsIG9wdGlvbnMuaGVpZ2h0IDw8IDE2KTsKCgkJdmFyIG1kaWEgPSB0cmFrLmFkZCgibWRpYSIpOwoJCW1kaWEuYWRkKCJtZGhkIikuc2V0KCJjcmVhdGlvbl90aW1lIiwgMCkKCQkJCQkJLnNldCgibW9kaWZpY2F0aW9uX3RpbWUiLCAwKQoJCQkJCQkuc2V0KCJ0aW1lc2NhbGUiLCBvcHRpb25zLnRpbWVzY2FsZSB8fCAxKQoJCQkJCQkuc2V0KCJkdXJhdGlvbiIsIG9wdGlvbnMubWVkaWFfZHVyYXRpb24gfHwgMCkKCQkJCQkJLnNldCgibGFuZ3VhZ2UiLCBvcHRpb25zLmxhbmd1YWdlIHx8ICJ1bmQiKTsKCgkJbWRpYS5hZGQoImhkbHIiKS5zZXQoImhhbmRsZXIiLCBvcHRpb25zLmhkbHIgfHwgInZpZGUiKQoJCQkJCQkuc2V0KCJuYW1lIiwgb3B0aW9ucy5uYW1lIHx8ICJUcmFjayBjcmVhdGVkIHdpdGggTVA0Qm94LmpzIik7CgoJCW1kaWEuYWRkKCJlbG5nIikuc2V0KCJleHRlbmRlZF9sYW5ndWFnZSIsIG9wdGlvbnMubGFuZ3VhZ2UgfHwgImZyLUZSIik7CgoJCXZhciBtaW5mID0gbWRpYS5hZGQoIm1pbmYiKTsKCQlpZiAoQm94UGFyc2VyW29wdGlvbnMudHlwZSsiU2FtcGxlRW50cnkiXSA9PT0gdW5kZWZpbmVkKSByZXR1cm47CgkJdmFyIHNhbXBsZV9kZXNjcmlwdGlvbl9lbnRyeSA9IG5ldyBCb3hQYXJzZXJbb3B0aW9ucy50eXBlKyJTYW1wbGVFbnRyeSJdKCk7CgkJc2FtcGxlX2Rlc2NyaXB0aW9uX2VudHJ5LmRhdGFfcmVmZXJlbmNlX2luZGV4ID0gMTsKCQl2YXIgbWVkaWFfdHlwZSA9ICIiOwoJCWZvciAodmFyIG1lZGlhVHlwZSBpbiBCb3hQYXJzZXIuc2FtcGxlRW50cnlDb2RlcykgewoJCQl2YXIgY29kZXMgPSBCb3hQYXJzZXIuc2FtcGxlRW50cnlDb2Rlc1ttZWRpYVR5cGVdOwoJCQlmb3IgKHZhciBpID0gMDsgaSA8IGNvZGVzLmxlbmd0aDsgaSsrKSB7CgkJCQlpZiAoY29kZXMuaW5kZXhPZihvcHRpb25zLnR5cGUpID4gLTEpIHsKCQkJCQltZWRpYV90eXBlID0gbWVkaWFUeXBlOwoJCQkJCWJyZWFrOwoJCQkJfQoJCQl9CgkJfQoJCXN3aXRjaChtZWRpYV90eXBlKSB7CgkJCWNhc2UgIlZpc3VhbCI6CgkJCQltaW5mLmFkZCgidm1oZCIpLnNldCgiZ3JhcGhpY3Ntb2RlIiwwKS5zZXQoIm9wY29sb3IiLCBbIDAsIDAsIDAgXSk7CgkJCQlzYW1wbGVfZGVzY3JpcHRpb25fZW50cnkuc2V0KCJ3aWR0aCIsIG9wdGlvbnMud2lkdGgpCgkJCQkJCQkuc2V0KCJoZWlnaHQiLCBvcHRpb25zLmhlaWdodCkKCQkJCQkJCS5zZXQoImhvcml6cmVzb2x1dGlvbiIsIDB4NDg8PDE2KQoJCQkJCQkJLnNldCgidmVydHJlc29sdXRpb24iLCAweDQ4PDwxNikKCQkJCQkJCS5zZXQoImZyYW1lX2NvdW50IiwgMSkKCQkJCQkJCS5zZXQoImNvbXByZXNzb3JuYW1lIiwgb3B0aW9ucy50eXBlKyIgQ29tcHJlc3NvciIpCgkJCQkJCQkuc2V0KCJkZXB0aCIsIDB4MTgpOwoJCQkJaWYgKG9wdGlvbnMuYXZjRGVjb2RlckNvbmZpZ1JlY29yZCkgewoJCQkJCXZhciBhdmNDID0gbmV3IEJveFBhcnNlci5hdmNDQm94KCk7CgkJCQkJdmFyIHN0cmVhbSA9IG5ldyBNUDRCb3hTdHJlYW0ob3B0aW9ucy5hdmNEZWNvZGVyQ29uZmlnUmVjb3JkKTsKCQkJCQlhdmNDLnBhcnNlKHN0cmVhbSk7CgkJCQkJc2FtcGxlX2Rlc2NyaXB0aW9uX2VudHJ5LmFkZEJveChhdmNDKTsKCQkJCX0KCQkJCWJyZWFrOwoJCQljYXNlICJBdWRpbyI6CgkJCQltaW5mLmFkZCgic21oZCIpLnNldCgiYmFsYW5jZSIsIG9wdGlvbnMuYmFsYW5jZSB8fCAwKTsKCQkJCXNhbXBsZV9kZXNjcmlwdGlvbl9lbnRyeS5zZXQoImNoYW5uZWxfY291bnQiLCBvcHRpb25zLmNoYW5uZWxfY291bnQgfHwgMikKCQkJCQkJCS5zZXQoInNhbXBsZXNpemUiLCBvcHRpb25zLnNhbXBsZXNpemUgfHwgMTYpCgkJCQkJCQkuc2V0KCJzYW1wbGVyYXRlIiwgb3B0aW9ucy5zYW1wbGVyYXRlIHx8IDE8PDE2KTsKCQkJCWJyZWFrOwoJCQljYXNlICJIaW50IjoKCQkJCW1pbmYuYWRkKCJobWhkIik7IC8vIFRPRE86IGFkZCBwcm9wZXJ0aWVzCgkJCQlicmVhazsKCQkJY2FzZSAiU3VidGl0bGUiOgoJCQkJbWluZi5hZGQoInN0aGQiKTsKCQkJCXN3aXRjaCAob3B0aW9ucy50eXBlKSB7CgkJCQkJY2FzZSAic3RwcCI6CgkJCQkJCXNhbXBsZV9kZXNjcmlwdGlvbl9lbnRyeS5zZXQoIm5hbWVzcGFjZSIsIG9wdGlvbnMubmFtZXNwYWNlIHx8ICJub25hbWVzcGFjZSIpCgkJCQkJCQkJCS5zZXQoInNjaGVtYV9sb2NhdGlvbiIsIG9wdGlvbnMuc2NoZW1hX2xvY2F0aW9uIHx8ICIiKQoJCQkJCQkJCQkuc2V0KCJhdXhpbGlhcnlfbWltZV90eXBlcyIsIG9wdGlvbnMuYXV4aWxpYXJ5X21pbWVfdHlwZXMgfHwgIiIpOwoJCQkJCQlicmVhazsKCQkJCX0KCQkJCWJyZWFrOwoJCQljYXNlICJNZXRhZGF0YSI6CgkJCQltaW5mLmFkZCgibm1oZCIpOwoJCQkJYnJlYWs7CgkJCWNhc2UgIlN5c3RlbSI6CgkJCQltaW5mLmFkZCgibm1oZCIpOwoJCQkJYnJlYWs7CgkJCWRlZmF1bHQ6CgkJCQltaW5mLmFkZCgibm1oZCIpOwoJCQkJYnJlYWs7CgkJfQoJCWlmIChvcHRpb25zLmRlc2NyaXB0aW9uKSB7CgkJCXNhbXBsZV9kZXNjcmlwdGlvbl9lbnRyeS5hZGRCb3gob3B0aW9ucy5kZXNjcmlwdGlvbik7CgkJfQoJCWlmIChvcHRpb25zLmRlc2NyaXB0aW9uX2JveGVzKSB7CgkJCW9wdGlvbnMuZGVzY3JpcHRpb25fYm94ZXMuZm9yRWFjaChmdW5jdGlvbiAoYikgewoJCQkJc2FtcGxlX2Rlc2NyaXB0aW9uX2VudHJ5LmFkZEJveChiKTsKCQkJfSk7CgkJfQoJCW1pbmYuYWRkKCJkaW5mIikuYWRkKCJkcmVmIikuYWRkRW50cnkoKG5ldyBCb3hQYXJzZXJbInVybCBCb3giXSgpKS5zZXQoImZsYWdzIiwgMHgxKSk7CgkJdmFyIHN0YmwgPSBtaW5mLmFkZCgic3RibCIpOwoJCXN0YmwuYWRkKCJzdHNkIikuYWRkRW50cnkoc2FtcGxlX2Rlc2NyaXB0aW9uX2VudHJ5KTsKCQlzdGJsLmFkZCgic3R0cyIpLnNldCgic2FtcGxlX2NvdW50cyIsIFtdKQoJCQkJCQkuc2V0KCJzYW1wbGVfZGVsdGFzIiwgW10pOwoJCXN0YmwuYWRkKCJzdHNjIikuc2V0KCJmaXJzdF9jaHVuayIsIFtdKQoJCQkJCQkuc2V0KCJzYW1wbGVzX3Blcl9jaHVuayIsIFtdKQoJCQkJCQkuc2V0KCJzYW1wbGVfZGVzY3JpcHRpb25faW5kZXgiLCBbXSk7CgkJc3RibC5hZGQoInN0Y28iKS5zZXQoImNodW5rX29mZnNldHMiLCBbXSk7CgkJc3RibC5hZGQoInN0c3oiKS5zZXQoInNhbXBsZV9zaXplcyIsIFtdKTsKCgkJdGhpcy5tb292Lm12ZXguYWRkKCJ0cmV4Iikuc2V0KCJ0cmFja19pZCIsIG9wdGlvbnMuaWQpCgkJCQkJCQkJICAuc2V0KCJkZWZhdWx0X3NhbXBsZV9kZXNjcmlwdGlvbl9pbmRleCIsIG9wdGlvbnMuZGVmYXVsdF9zYW1wbGVfZGVzY3JpcHRpb25faW5kZXggfHwgMSkKCQkJCQkJCQkgIC5zZXQoImRlZmF1bHRfc2FtcGxlX2R1cmF0aW9uIiwgb3B0aW9ucy5kZWZhdWx0X3NhbXBsZV9kdXJhdGlvbiB8fCAwKQoJCQkJCQkJCSAgLnNldCgiZGVmYXVsdF9zYW1wbGVfc2l6ZSIsIG9wdGlvbnMuZGVmYXVsdF9zYW1wbGVfc2l6ZSB8fCAwKQoJCQkJCQkJCSAgLnNldCgiZGVmYXVsdF9zYW1wbGVfZmxhZ3MiLCBvcHRpb25zLmRlZmF1bHRfc2FtcGxlX2ZsYWdzIHx8IDApOwoJCXRoaXMuYnVpbGRUcmFrU2FtcGxlTGlzdHModHJhayk7CgkJcmV0dXJuIG9wdGlvbnMuaWQ7Cgl9OwoKCUJveFBhcnNlci5Cb3gucHJvdG90eXBlLmNvbXB1dGVTaXplID0gZnVuY3Rpb24oc3RyZWFtXykgewoJCXZhciBzdHJlYW0gPSBzdHJlYW1fIHx8IG5ldyBEYXRhU3RyZWFtKCk7CgkJc3RyZWFtLmVuZGlhbm5lc3MgPSBEYXRhU3RyZWFtLkJJR19FTkRJQU47CgkJdGhpcy53cml0ZShzdHJlYW0pOwoJfTsKCglJU09GaWxlLnByb3RvdHlwZS5hZGRTYW1wbGUgPSBmdW5jdGlvbiAodHJhY2tfaWQsIGRhdGEsIF9vcHRpb25zKSB7CgkJdmFyIG9wdGlvbnMgPSBfb3B0aW9ucyB8fCB7fTsKCQl2YXIgc2FtcGxlID0ge307CgkJdmFyIHRyYWsgPSB0aGlzLmdldFRyYWNrQnlJZCh0cmFja19pZCk7CgkJaWYgKHRyYWsgPT09IG51bGwpIHJldHVybjsKCSAgICBzYW1wbGUubnVtYmVyID0gdHJhay5zYW1wbGVzLmxlbmd0aDsKCQlzYW1wbGUudHJhY2tfaWQgPSB0cmFrLnRraGQudHJhY2tfaWQ7CgkJc2FtcGxlLnRpbWVzY2FsZSA9IHRyYWsubWRpYS5tZGhkLnRpbWVzY2FsZTsKCQlzYW1wbGUuZGVzY3JpcHRpb25faW5kZXggPSAob3B0aW9ucy5zYW1wbGVfZGVzY3JpcHRpb25faW5kZXggPyBvcHRpb25zLnNhbXBsZV9kZXNjcmlwdGlvbl9pbmRleCAtIDE6IDApOwoJCXNhbXBsZS5kZXNjcmlwdGlvbiA9IHRyYWsubWRpYS5taW5mLnN0Ymwuc3RzZC5lbnRyaWVzW3NhbXBsZS5kZXNjcmlwdGlvbl9pbmRleF07CgkJc2FtcGxlLmRhdGEgPSBkYXRhOwoJCXNhbXBsZS5zaXplID0gZGF0YS5ieXRlTGVuZ3RoOwoJCXNhbXBsZS5hbHJlYWR5UmVhZCA9IHNhbXBsZS5zaXplOwoJCXNhbXBsZS5kdXJhdGlvbiA9IG9wdGlvbnMuZHVyYXRpb24gfHwgMTsKCQlzYW1wbGUuY3RzID0gb3B0aW9ucy5jdHMgfHwgMDsKCQlzYW1wbGUuZHRzID0gb3B0aW9ucy5kdHMgfHwgMDsKCQlzYW1wbGUuaXNfc3luYyA9IG9wdGlvbnMuaXNfc3luYyB8fCBmYWxzZTsKCQlzYW1wbGUuaXNfbGVhZGluZyA9IG9wdGlvbnMuaXNfbGVhZGluZyB8fCAwOwoJCXNhbXBsZS5kZXBlbmRzX29uID0gb3B0aW9ucy5kZXBlbmRzX29uIHx8IDA7CgkJc2FtcGxlLmlzX2RlcGVuZGVkX29uID0gb3B0aW9ucy5pc19kZXBlbmRlZF9vbiB8fCAwOwoJCXNhbXBsZS5oYXNfcmVkdW5kYW5jeSA9IG9wdGlvbnMuaGFzX3JlZHVuZGFuY3kgfHwgMDsKCQlzYW1wbGUuZGVncmFkYXRpb25fcHJpb3JpdHkgPSBvcHRpb25zLmRlZ3JhZGF0aW9uX3ByaW9yaXR5IHx8IDA7CgkJc2FtcGxlLm9mZnNldCA9IDA7CgkJc2FtcGxlLnN1YnNhbXBsZXMgPSBvcHRpb25zLnN1YnNhbXBsZXM7CgkJdHJhay5zYW1wbGVzLnB1c2goc2FtcGxlKTsKCQl0cmFrLnNhbXBsZXNfc2l6ZSArPSBzYW1wbGUuc2l6ZTsKCQl0cmFrLnNhbXBsZXNfZHVyYXRpb24gKz0gc2FtcGxlLmR1cmF0aW9uOwoJCWlmICghdHJhay5maXJzdF9kdHMpIHsKCQkJdHJhay5maXJzdF9kdHMgPSBvcHRpb25zLmR0czsKCQl9CgoJCXRoaXMucHJvY2Vzc1NhbXBsZXMoKTsKCQkKCQl2YXIgbW9vZiA9IHRoaXMuY3JlYXRlU2luZ2xlU2FtcGxlTW9vZihzYW1wbGUpOwoJCXRoaXMuYWRkQm94KG1vb2YpOwoJCW1vb2YuY29tcHV0ZVNpemUoKTsKCQkvKiBhZGp1c3RpbmcgdGhlIGRhdGFfb2Zmc2V0IG5vdyB0aGF0IHRoZSBtb29mIHNpemUgaXMga25vd24qLwoJCW1vb2YudHJhZnNbMF0udHJ1bnNbMF0uZGF0YV9vZmZzZXQgPSBtb29mLnNpemUrODsgLy84IGlzIG1kYXQgaGVhZGVyCgkJdGhpcy5hZGQoIm1kYXQiKS5kYXRhID0gbmV3IFVpbnQ4QXJyYXkoZGF0YSk7CgkJcmV0dXJuIHNhbXBsZTsKCX07CgoJSVNPRmlsZS5wcm90b3R5cGUuY3JlYXRlU2luZ2xlU2FtcGxlTW9vZiA9IGZ1bmN0aW9uKHNhbXBsZSkgewoJCXZhciBzYW1wbGVfZmxhZ3MgPSAwOwoJCWlmIChzYW1wbGUuaXNfc3luYykKCQkJc2FtcGxlX2ZsYWdzID0gKDEgPDwgMjUpOyAgLy8gc2FtcGxlX2RlcGVuZHNfb25fbm9uZSAoSSBwaWN0dXJlKQoJCWVsc2UKCQkJc2FtcGxlX2ZsYWdzID0gKDEgPDwgMTYpOyAgLy8gbm9uLXN5bmMKCgkJdmFyIG1vb2YgPSBuZXcgQm94UGFyc2VyLm1vb2ZCb3goKTsKCQltb29mLmFkZCgibWZoZCIpLnNldCgic2VxdWVuY2VfbnVtYmVyIiwgdGhpcy5uZXh0TW9vZk51bWJlcik7CgkJdGhpcy5uZXh0TW9vZk51bWJlcisrOwoJCXZhciB0cmFmID0gbW9vZi5hZGQoInRyYWYiKTsKCQl2YXIgdHJhayA9IHRoaXMuZ2V0VHJhY2tCeUlkKHNhbXBsZS50cmFja19pZCk7CgkJdHJhZi5hZGQoInRmaGQiKS5zZXQoInRyYWNrX2lkIiwgc2FtcGxlLnRyYWNrX2lkKQoJCQkJCQkuc2V0KCJmbGFncyIsIEJveFBhcnNlci5URkhEX0ZMQUdfREVGQVVMVF9CQVNFX0lTX01PT0YpOwoJCXRyYWYuYWRkKCJ0ZmR0Iikuc2V0KCJiYXNlTWVkaWFEZWNvZGVUaW1lIiwgKHNhbXBsZS5kdHMgLSAodHJhay5maXJzdF9kdHMgfHwgMCkpKTsKCQl0cmFmLmFkZCgidHJ1biIpLnNldCgiZmxhZ3MiLCBCb3hQYXJzZXIuVFJVTl9GTEFHU19EQVRBX09GRlNFVCB8IEJveFBhcnNlci5UUlVOX0ZMQUdTX0RVUkFUSU9OIHwgCgkJCQkJIAkJCQkgIEJveFBhcnNlci5UUlVOX0ZMQUdTX1NJWkUgfCBCb3hQYXJzZXIuVFJVTl9GTEFHU19GTEFHUyB8IAoJCQkJCSAJCQkJICBCb3hQYXJzZXIuVFJVTl9GTEFHU19DVFNfT0ZGU0VUKQoJCQkJCQkuc2V0KCJkYXRhX29mZnNldCIsMCkKCQkJCQkJLnNldCgiZmlyc3Rfc2FtcGxlX2ZsYWdzIiwwKQoJCQkJCQkuc2V0KCJzYW1wbGVfY291bnQiLDEpCgkJCQkJCS5zZXQoInNhbXBsZV9kdXJhdGlvbiIsW3NhbXBsZS5kdXJhdGlvbl0pCgkJCQkJCS5zZXQoInNhbXBsZV9zaXplIixbc2FtcGxlLnNpemVdKQoJCQkJCQkuc2V0KCJzYW1wbGVfZmxhZ3MiLFtzYW1wbGVfZmxhZ3NdKQoJCQkJCQkuc2V0KCJzYW1wbGVfY29tcG9zaXRpb25fdGltZV9vZmZzZXQiLCBbc2FtcGxlLmN0cyAtIHNhbXBsZS5kdHNdKTsKCQlyZXR1cm4gbW9vZjsKCX07CgoJLy8gZmlsZTpzcmMvaXNvZmlsZS1zYW1wbGUtcHJvY2Vzc2luZy5qcwoJLyogSW5kZXggb2YgdGhlIGxhc3QgbW9vZiBib3ggcmVjZWl2ZWQgKi8KCUlTT0ZpbGUucHJvdG90eXBlLmxhc3RNb29mSW5kZXggPSAwOwoKCS8qIHNpemUgb2YgdGhlIGJ1ZmZlcnMgYWxsb2NhdGVkIGZvciBzYW1wbGVzICovCglJU09GaWxlLnByb3RvdHlwZS5zYW1wbGVzRGF0YVNpemUgPSAwOwoKCS8qIFJlc2V0cyBhbGwgc2FtcGxlIHRhYmxlcyAqLwoJSVNPRmlsZS5wcm90b3R5cGUucmVzZXRUYWJsZXMgPSBmdW5jdGlvbiAoKSB7CgkJdmFyIGk7CgkJdmFyIHRyYWssIHN0Y28sIHN0c2MsIHN0c3osIHN0dHMsIGN0dHMsIHN0c3M7CgkJdGhpcy5pbml0aWFsX2R1cmF0aW9uID0gdGhpcy5tb292Lm12aGQuZHVyYXRpb247CgkJdGhpcy5tb292Lm12aGQuZHVyYXRpb24gPSAwOwoJCWZvciAoaSA9IDA7IGkgPCB0aGlzLm1vb3YudHJha3MubGVuZ3RoOyBpKyspIHsKCQkJdHJhayA9IHRoaXMubW9vdi50cmFrc1tpXTsKCQkJdHJhay50a2hkLmR1cmF0aW9uID0gMDsKCQkJdHJhay5tZGlhLm1kaGQuZHVyYXRpb24gPSAwOwoJCQlzdGNvID0gdHJhay5tZGlhLm1pbmYuc3RibC5zdGNvIHx8IHRyYWsubWRpYS5taW5mLnN0YmwuY282NDsKCQkJc3Rjby5jaHVua19vZmZzZXRzID0gW107CgkJCXN0c2MgPSB0cmFrLm1kaWEubWluZi5zdGJsLnN0c2M7CgkJCXN0c2MuZmlyc3RfY2h1bmsgPSBbXTsKCQkJc3RzYy5zYW1wbGVzX3Blcl9jaHVuayA9IFtdOwoJCQlzdHNjLnNhbXBsZV9kZXNjcmlwdGlvbl9pbmRleCA9IFtdOwoJCQlzdHN6ID0gdHJhay5tZGlhLm1pbmYuc3RibC5zdHN6IHx8IHRyYWsubWRpYS5taW5mLnN0Ymwuc3R6MjsKCQkJc3Rzei5zYW1wbGVfc2l6ZXMgPSBbXTsKCQkJc3R0cyA9IHRyYWsubWRpYS5taW5mLnN0Ymwuc3R0czsKCQkJc3R0cy5zYW1wbGVfY291bnRzID0gW107CgkJCXN0dHMuc2FtcGxlX2RlbHRhcyA9IFtdOwoJCQljdHRzID0gdHJhay5tZGlhLm1pbmYuc3RibC5jdHRzOwoJCQlpZiAoY3R0cykgewoJCQkJY3R0cy5zYW1wbGVfY291bnRzID0gW107CgkJCQljdHRzLnNhbXBsZV9vZmZzZXRzID0gW107CgkJCX0KCQkJc3RzcyA9IHRyYWsubWRpYS5taW5mLnN0Ymwuc3RzczsKCQkJdmFyIGsgPSB0cmFrLm1kaWEubWluZi5zdGJsLmJveGVzLmluZGV4T2Yoc3Rzcyk7CgkJCWlmIChrICE9IC0xKSB0cmFrLm1kaWEubWluZi5zdGJsLmJveGVzW2tdID0gbnVsbDsKCQl9Cgl9OwoKCUlTT0ZpbGUuaW5pdFNhbXBsZUdyb3VwcyA9IGZ1bmN0aW9uKHRyYWssIHRyYWYsIHNiZ3BzLCB0cmFrX3NncGRzLCB0cmFmX3NncGRzKSB7CgkJdmFyIGw7CgkJdmFyIGs7CgkJdmFyIHNhbXBsZV9ncm91cF9pbmZvOwoJCXZhciBzYW1wbGVfZ3JvdXBfa2V5OwoJCWZ1bmN0aW9uIFNhbXBsZUdyb3VwSW5mbyhfdHlwZSwgX3BhcmFtZXRlciwgX3NiZ3ApIHsKCQkJdGhpcy5ncm91cGluZ190eXBlID0gX3R5cGU7CgkJCXRoaXMuZ3JvdXBpbmdfdHlwZV9wYXJhbWV0ZXIgPSBfcGFyYW1ldGVyOwoJCQl0aGlzLnNiZ3AgPSBfc2JncDsKCQkJdGhpcy5sYXN0X3NhbXBsZV9pbl9ydW4gPSAtMTsKCQkJdGhpcy5lbnRyeV9pbmRleCA9IC0xOwkJCgkJfQoJCWlmICh0cmFmKSB7CgkJCXRyYWYuc2FtcGxlX2dyb3Vwc19pbmZvID0gW107CgkJfSAKCQlpZiAoIXRyYWsuc2FtcGxlX2dyb3Vwc19pbmZvKSB7CgkJCXRyYWsuc2FtcGxlX2dyb3Vwc19pbmZvID0gW107CgkJfQoJCWZvciAoayA9IDA7IGsgPCBzYmdwcy5sZW5ndGg7IGsrKykgewoJCQlzYW1wbGVfZ3JvdXBfa2V5ID0gc2JncHNba10uZ3JvdXBpbmdfdHlwZSArIi8iKyBzYmdwc1trXS5ncm91cGluZ190eXBlX3BhcmFtZXRlcjsKCQkJc2FtcGxlX2dyb3VwX2luZm8gPSBuZXcgU2FtcGxlR3JvdXBJbmZvKHNiZ3BzW2tdLmdyb3VwaW5nX3R5cGUsIHNiZ3BzW2tdLmdyb3VwaW5nX3R5cGVfcGFyYW1ldGVyLCBzYmdwc1trXSk7CgkJCWlmICh0cmFmKSB7CgkJCQl0cmFmLnNhbXBsZV9ncm91cHNfaW5mb1tzYW1wbGVfZ3JvdXBfa2V5XSA9IHNhbXBsZV9ncm91cF9pbmZvOwoJCQl9CgkJCWlmICghdHJhay5zYW1wbGVfZ3JvdXBzX2luZm9bc2FtcGxlX2dyb3VwX2tleV0pIHsKCQkJCXRyYWsuc2FtcGxlX2dyb3Vwc19pbmZvW3NhbXBsZV9ncm91cF9rZXldID0gc2FtcGxlX2dyb3VwX2luZm87CgkJCX0KCQkJZm9yIChsPTA7IGwgPHRyYWtfc2dwZHMubGVuZ3RoOyBsKyspIHsKCQkJCWlmICh0cmFrX3NncGRzW2xdLmdyb3VwaW5nX3R5cGUgPT09IHNiZ3BzW2tdLmdyb3VwaW5nX3R5cGUpIHsKCQkJCQlzYW1wbGVfZ3JvdXBfaW5mby5kZXNjcmlwdGlvbiA9IHRyYWtfc2dwZHNbbF07CgkJCQkJc2FtcGxlX2dyb3VwX2luZm8uZGVzY3JpcHRpb24udXNlZCA9IHRydWU7CgkJCQl9CgkJCX0KCQkJaWYgKHRyYWZfc2dwZHMpIHsKCQkJCWZvciAobD0wOyBsIDx0cmFmX3NncGRzLmxlbmd0aDsgbCsrKSB7CgkJCQkJaWYgKHRyYWZfc2dwZHNbbF0uZ3JvdXBpbmdfdHlwZSA9PT0gc2JncHNba10uZ3JvdXBpbmdfdHlwZSkgewoJCQkJCQlzYW1wbGVfZ3JvdXBfaW5mby5mcmFnbWVudF9kZXNjcmlwdGlvbiA9IHRyYWZfc2dwZHNbbF07CgkJCQkJCXNhbXBsZV9ncm91cF9pbmZvLmZyYWdtZW50X2Rlc2NyaXB0aW9uLnVzZWQgPSB0cnVlOwoJCQkJCQlzYW1wbGVfZ3JvdXBfaW5mby5pc19mcmFnbWVudCA9IHRydWU7CgkJCQkJfQoJCQkJfQkJCQoJCQl9CgkJfQoJCWlmICghdHJhZikgewoJCQlmb3IgKGsgPSAwOyBrIDwgdHJha19zZ3Bkcy5sZW5ndGg7IGsrKykgewoJCQkJaWYgKCF0cmFrX3NncGRzW2tdLnVzZWQgJiYgdHJha19zZ3Bkc1trXS52ZXJzaW9uID49IDIpIHsKCQkJCQlzYW1wbGVfZ3JvdXBfa2V5ID0gdHJha19zZ3Bkc1trXS5ncm91cGluZ190eXBlICsiLzAiOwoJCQkJCXNhbXBsZV9ncm91cF9pbmZvID0gbmV3IFNhbXBsZUdyb3VwSW5mbyh0cmFrX3NncGRzW2tdLmdyb3VwaW5nX3R5cGUsIDApOwoJCQkJCWlmICghdHJhay5zYW1wbGVfZ3JvdXBzX2luZm9bc2FtcGxlX2dyb3VwX2tleV0pIHsKCQkJCQkJdHJhay5zYW1wbGVfZ3JvdXBzX2luZm9bc2FtcGxlX2dyb3VwX2tleV0gPSBzYW1wbGVfZ3JvdXBfaW5mbzsKCQkJCQl9CgkJCQl9CgkJCX0KCQl9IGVsc2UgewoJCQlpZiAodHJhZl9zZ3BkcykgewoJCQkJZm9yIChrID0gMDsgayA8IHRyYWZfc2dwZHMubGVuZ3RoOyBrKyspIHsKCQkJCQlpZiAoIXRyYWZfc2dwZHNba10udXNlZCAmJiB0cmFmX3NncGRzW2tdLnZlcnNpb24gPj0gMikgewoJCQkJCQlzYW1wbGVfZ3JvdXBfa2V5ID0gdHJhZl9zZ3Bkc1trXS5ncm91cGluZ190eXBlICsiLzAiOwoJCQkJCQlzYW1wbGVfZ3JvdXBfaW5mbyA9IG5ldyBTYW1wbGVHcm91cEluZm8odHJhZl9zZ3Bkc1trXS5ncm91cGluZ190eXBlLCAwKTsKCQkJCQkJc2FtcGxlX2dyb3VwX2luZm8uaXNfZnJhZ21lbnQgPSB0cnVlOwoJCQkJCQlpZiAoIXRyYWYuc2FtcGxlX2dyb3Vwc19pbmZvW3NhbXBsZV9ncm91cF9rZXldKSB7CgkJCQkJCQl0cmFmLnNhbXBsZV9ncm91cHNfaW5mb1tzYW1wbGVfZ3JvdXBfa2V5XSA9IHNhbXBsZV9ncm91cF9pbmZvOwoJCQkJCQl9CgkJCQkJfQoJCQkJfQoJCQl9CgkJfQoJfTsKCglJU09GaWxlLnNldFNhbXBsZUdyb3VwUHJvcGVydGllcyA9IGZ1bmN0aW9uKHRyYWssIHNhbXBsZSwgc2FtcGxlX251bWJlciwgc2FtcGxlX2dyb3Vwc19pbmZvKSB7CgkJdmFyIGs7CgkJdmFyIGluZGV4OwoJCXNhbXBsZS5zYW1wbGVfZ3JvdXBzID0gW107CgkJZm9yIChrIGluIHNhbXBsZV9ncm91cHNfaW5mbykgewoJCQlzYW1wbGUuc2FtcGxlX2dyb3Vwc1trXSA9IHt9OwoJCQlzYW1wbGUuc2FtcGxlX2dyb3Vwc1trXS5ncm91cGluZ190eXBlID0gc2FtcGxlX2dyb3Vwc19pbmZvW2tdLmdyb3VwaW5nX3R5cGU7CgkJCXNhbXBsZS5zYW1wbGVfZ3JvdXBzW2tdLmdyb3VwaW5nX3R5cGVfcGFyYW1ldGVyID0gc2FtcGxlX2dyb3Vwc19pbmZvW2tdLmdyb3VwaW5nX3R5cGVfcGFyYW1ldGVyOwoJCQlpZiAoc2FtcGxlX251bWJlciA+PSBzYW1wbGVfZ3JvdXBzX2luZm9ba10ubGFzdF9zYW1wbGVfaW5fcnVuKSB7CgkJCQlpZiAoc2FtcGxlX2dyb3Vwc19pbmZvW2tdLmxhc3Rfc2FtcGxlX2luX3J1biA8IDApIHsKCQkJCQlzYW1wbGVfZ3JvdXBzX2luZm9ba10ubGFzdF9zYW1wbGVfaW5fcnVuID0gMDsKCQkJCX0KCQkJCXNhbXBsZV9ncm91cHNfaW5mb1trXS5lbnRyeV9pbmRleCsrOwkKCQkJCWlmIChzYW1wbGVfZ3JvdXBzX2luZm9ba10uZW50cnlfaW5kZXggPD0gc2FtcGxlX2dyb3Vwc19pbmZvW2tdLnNiZ3AuZW50cmllcy5sZW5ndGggLSAxKSB7CgkJCQkJc2FtcGxlX2dyb3Vwc19pbmZvW2tdLmxhc3Rfc2FtcGxlX2luX3J1biArPSBzYW1wbGVfZ3JvdXBzX2luZm9ba10uc2JncC5lbnRyaWVzW3NhbXBsZV9ncm91cHNfaW5mb1trXS5lbnRyeV9pbmRleF0uc2FtcGxlX2NvdW50OwoJCQkJfQoJCQl9CgkJCWlmIChzYW1wbGVfZ3JvdXBzX2luZm9ba10uZW50cnlfaW5kZXggPD0gc2FtcGxlX2dyb3Vwc19pbmZvW2tdLnNiZ3AuZW50cmllcy5sZW5ndGggLSAxKSB7CgkJCQlzYW1wbGUuc2FtcGxlX2dyb3Vwc1trXS5ncm91cF9kZXNjcmlwdGlvbl9pbmRleCA9IHNhbXBsZV9ncm91cHNfaW5mb1trXS5zYmdwLmVudHJpZXNbc2FtcGxlX2dyb3Vwc19pbmZvW2tdLmVudHJ5X2luZGV4XS5ncm91cF9kZXNjcmlwdGlvbl9pbmRleDsKCQkJfSBlbHNlIHsKCQkJCXNhbXBsZS5zYW1wbGVfZ3JvdXBzW2tdLmdyb3VwX2Rlc2NyaXB0aW9uX2luZGV4ID0gLTE7IC8vIHNwZWNpYWwgdmFsdWUgZm9yIG5vdCBkZWZpbmVkCgkJCX0KCQkJaWYgKHNhbXBsZS5zYW1wbGVfZ3JvdXBzW2tdLmdyb3VwX2Rlc2NyaXB0aW9uX2luZGV4ICE9PSAwKSB7CgkJCQl2YXIgZGVzY3JpcHRpb247CgkJCQlpZiAoc2FtcGxlX2dyb3Vwc19pbmZvW2tdLmZyYWdtZW50X2Rlc2NyaXB0aW9uKSB7CgkJCQkJZGVzY3JpcHRpb24gPSBzYW1wbGVfZ3JvdXBzX2luZm9ba10uZnJhZ21lbnRfZGVzY3JpcHRpb247CgkJCQl9IGVsc2UgewoJCQkJCWRlc2NyaXB0aW9uID0gc2FtcGxlX2dyb3Vwc19pbmZvW2tdLmRlc2NyaXB0aW9uOwoJCQkJfQoJCQkJaWYgKHNhbXBsZS5zYW1wbGVfZ3JvdXBzW2tdLmdyb3VwX2Rlc2NyaXB0aW9uX2luZGV4ID4gMCkgewoJCQkJCWlmIChzYW1wbGUuc2FtcGxlX2dyb3Vwc1trXS5ncm91cF9kZXNjcmlwdGlvbl9pbmRleCA+IDY1NTM1KSB7CgkJCQkJCWluZGV4ID0gKHNhbXBsZS5zYW1wbGVfZ3JvdXBzW2tdLmdyb3VwX2Rlc2NyaXB0aW9uX2luZGV4ID4+IDE2KS0xOwoJCQkJCX0gZWxzZSB7CgkJCQkJCWluZGV4ID0gc2FtcGxlLnNhbXBsZV9ncm91cHNba10uZ3JvdXBfZGVzY3JpcHRpb25faW5kZXgtMTsKCQkJCQl9CgkJCQkJaWYgKGRlc2NyaXB0aW9uICYmIGluZGV4ID49IDApIHsKCQkJCQkJc2FtcGxlLnNhbXBsZV9ncm91cHNba10uZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbi5lbnRyaWVzW2luZGV4XTsKCQkJCQl9CgkJCQl9IGVsc2UgewoJCQkJCWlmIChkZXNjcmlwdGlvbiAmJiBkZXNjcmlwdGlvbi52ZXJzaW9uID49IDIpIHsKCQkJCQkJaWYgKGRlc2NyaXB0aW9uLmRlZmF1bHRfZ3JvdXBfZGVzY3JpcHRpb25faW5kZXggPiAwKSB7CQkJCQkJCQkKCQkJCQkJCXNhbXBsZS5zYW1wbGVfZ3JvdXBzW2tdLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb24uZW50cmllc1tkZXNjcmlwdGlvbi5kZWZhdWx0X2dyb3VwX2Rlc2NyaXB0aW9uX2luZGV4LTFdOwoJCQkJCQl9CgkJCQkJfQoJCQkJfQoJCQl9CgkJfQoJfTsKCglJU09GaWxlLnByb2Nlc3Nfc2R0cCA9IGZ1bmN0aW9uIChzZHRwLCBzYW1wbGUsIG51bWJlcikgewoJCWlmICghc2FtcGxlKSB7CgkJCXJldHVybjsKCQl9CgkJaWYgKHNkdHApIHsKCQkJc2FtcGxlLmlzX2xlYWRpbmcgPSBzZHRwLmlzX2xlYWRpbmdbbnVtYmVyXTsKCQkJc2FtcGxlLmRlcGVuZHNfb24gPSBzZHRwLnNhbXBsZV9kZXBlbmRzX29uW251bWJlcl07CgkJCXNhbXBsZS5pc19kZXBlbmRlZF9vbiA9IHNkdHAuc2FtcGxlX2lzX2RlcGVuZGVkX29uW251bWJlcl07CgkJCXNhbXBsZS5oYXNfcmVkdW5kYW5jeSA9IHNkdHAuc2FtcGxlX2hhc19yZWR1bmRhbmN5W251bWJlcl07CgkJfSBlbHNlIHsKCQkJc2FtcGxlLmlzX2xlYWRpbmcgPSAwOwoJCQlzYW1wbGUuZGVwZW5kc19vbiA9IDA7CgkJCXNhbXBsZS5pc19kZXBlbmRlZF9vbiA9IDA7CgkJCXNhbXBsZS5oYXNfcmVkdW5kYW5jeSA9IDA7CgkJfQkKCX07CgoJLyogQnVpbGQgaW5pdGlhbCBzYW1wbGUgbGlzdCBmcm9tICBzYW1wbGUgdGFibGVzICovCglJU09GaWxlLnByb3RvdHlwZS5idWlsZFNhbXBsZUxpc3RzID0gZnVuY3Rpb24oKSB7CQoJCXZhciBpOwoJCXZhciB0cmFrOwoJCWZvciAoaSA9IDA7IGkgPCB0aGlzLm1vb3YudHJha3MubGVuZ3RoOyBpKyspIHsKCQkJdHJhayA9IHRoaXMubW9vdi50cmFrc1tpXTsKCQkJdGhpcy5idWlsZFRyYWtTYW1wbGVMaXN0cyh0cmFrKTsKCQl9Cgl9OwoKCUlTT0ZpbGUucHJvdG90eXBlLmJ1aWxkVHJha1NhbXBsZUxpc3RzID0gZnVuY3Rpb24odHJhaykgewkKCQl2YXIgajsKCQl2YXIgc3Rjbywgc3RzYywgc3Rzeiwgc3R0cywgY3R0cywgc3Rzcywgc3RzZCwgc3Vicywgc2JncHMsIHNncGRzLCBzdGRwOwoJCXZhciBjaHVua19ydW5faW5kZXgsIGNodW5rX2luZGV4LCBsYXN0X2NodW5rX2luX3J1biwgb2Zmc2V0X2luX2NodW5rLCBsYXN0X3NhbXBsZV9pbl9jaHVuazsKCQl2YXIgbGFzdF9zYW1wbGVfaW5fc3R0c19ydW4sIHN0dHNfcnVuX2luZGV4LCBsYXN0X3NhbXBsZV9pbl9jdHRzX3J1biwgY3R0c19ydW5faW5kZXgsIGxhc3Rfc3Rzc19pbmRleCwgc3Vic19lbnRyeV9pbmRleCwgbGFzdF9zdWJzX3NhbXBsZV9pbmRleDsKCgkJdHJhay5zYW1wbGVzID0gW107CgkJdHJhay5zYW1wbGVzX2R1cmF0aW9uID0gMDsKCQl0cmFrLnNhbXBsZXNfc2l6ZSA9IDA7CgkJc3RjbyA9IHRyYWsubWRpYS5taW5mLnN0Ymwuc3RjbyB8fCB0cmFrLm1kaWEubWluZi5zdGJsLmNvNjQ7CgkJc3RzYyA9IHRyYWsubWRpYS5taW5mLnN0Ymwuc3RzYzsKCQlzdHN6ID0gdHJhay5tZGlhLm1pbmYuc3RibC5zdHN6IHx8IHRyYWsubWRpYS5taW5mLnN0Ymwuc3R6MjsKCQlzdHRzID0gdHJhay5tZGlhLm1pbmYuc3RibC5zdHRzOwoJCWN0dHMgPSB0cmFrLm1kaWEubWluZi5zdGJsLmN0dHM7CgkJc3RzcyA9IHRyYWsubWRpYS5taW5mLnN0Ymwuc3RzczsKCQlzdHNkID0gdHJhay5tZGlhLm1pbmYuc3RibC5zdHNkOwoJCXN1YnMgPSB0cmFrLm1kaWEubWluZi5zdGJsLnN1YnM7CgkJc3RkcCA9IHRyYWsubWRpYS5taW5mLnN0Ymwuc3RkcDsKCQlzYmdwcyA9IHRyYWsubWRpYS5taW5mLnN0Ymwuc2JncHM7CgkJc2dwZHMgPSB0cmFrLm1kaWEubWluZi5zdGJsLnNncGRzOwoJCQoJCWxhc3Rfc2FtcGxlX2luX3N0dHNfcnVuID0gLTE7CgkJc3R0c19ydW5faW5kZXggPSAtMTsKCQlsYXN0X3NhbXBsZV9pbl9jdHRzX3J1biA9IC0xOwoJCWN0dHNfcnVuX2luZGV4ID0gLTE7CgkJbGFzdF9zdHNzX2luZGV4ID0gMDsKCQlzdWJzX2VudHJ5X2luZGV4ID0gMDsKCQlsYXN0X3N1YnNfc2FtcGxlX2luZGV4ID0gMDsJCQoKCQlJU09GaWxlLmluaXRTYW1wbGVHcm91cHModHJhaywgbnVsbCwgc2JncHMsIHNncGRzKTsKCgkJaWYgKHR5cGVvZiBzdHN6ID09PSAidW5kZWZpbmVkIikgewoJCQlyZXR1cm47CgkJfQoKCQkvKiB3ZSBidWlsZCB0aGUgc2FtcGxlcyBvbmUgYnkgb25lIGFuZCBjb21wdXRlIHRoZWlyIHByb3BlcnRpZXMgKi8KCQlmb3IgKGogPSAwOyBqIDwgc3Rzei5zYW1wbGVfc2l6ZXMubGVuZ3RoOyBqKyspIHsKCQkJdmFyIHNhbXBsZSA9IHt9OwoJCQlzYW1wbGUubnVtYmVyID0gajsKCQkJc2FtcGxlLnRyYWNrX2lkID0gdHJhay50a2hkLnRyYWNrX2lkOwoJCQlzYW1wbGUudGltZXNjYWxlID0gdHJhay5tZGlhLm1kaGQudGltZXNjYWxlOwoJCQlzYW1wbGUuYWxyZWFkeVJlYWQgPSAwOwoJCQl0cmFrLnNhbXBsZXNbal0gPSBzYW1wbGU7CgkJCS8qIHNpemUgY2FuIGJlIGtub3duIGRpcmVjdGx5ICovCgkJCXNhbXBsZS5zaXplID0gc3Rzei5zYW1wbGVfc2l6ZXNbal07CgkJCXRyYWsuc2FtcGxlc19zaXplICs9IHNhbXBsZS5zaXplOwoJCQkvKiBjb21wdXRpbmcgY2h1bmstYmFzZWQgcHJvcGVydGllcyAob2Zmc2V0LCBzYW1wbGUgZGVzY3JpcHRpb24gaW5kZXgpKi8KCQkJaWYgKGogPT09IDApIHsJCQkJCgkJCQljaHVua19pbmRleCA9IDE7IC8qIHRoZSBmaXJzdCBzYW1wbGUgaXMgaW4gdGhlIGZpcnN0IGNodW5rIChjaHVuayBpbmRleGVzIGFyZSAxLWJhc2VkKSAqLwoJCQkJY2h1bmtfcnVuX2luZGV4ID0gMDsgLyogdGhlIGZpcnN0IGNodW5rIGlzIHRoZSBmaXJzdCBlbnRyeSBpbiB0aGUgZmlyc3RfY2h1bmsgdGFibGUgKi8KCQkJCXNhbXBsZS5jaHVua19pbmRleCA9IGNodW5rX2luZGV4OwoJCQkJc2FtcGxlLmNodW5rX3J1bl9pbmRleCA9IGNodW5rX3J1bl9pbmRleDsKCQkJCWxhc3Rfc2FtcGxlX2luX2NodW5rID0gc3RzYy5zYW1wbGVzX3Blcl9jaHVua1tjaHVua19ydW5faW5kZXhdOwoJCQkJb2Zmc2V0X2luX2NodW5rID0gMDsKCgkJCQkvKiBJcyB0aGVyZSBhbm90aGVyIGVudHJ5IGluIHRoZSBmaXJzdF9jaHVuayB0YWJsZSA/ICovCgkJCQlpZiAoY2h1bmtfcnVuX2luZGV4ICsgMSA8IHN0c2MuZmlyc3RfY2h1bmsubGVuZ3RoKSB7CgkJCQkJLyogVGhlIGxhc3QgY2h1bmsgaW4gdGhlIHJ1biBpcyB0aGUgY2h1bmsgYmVmb3JlIHRoZSBuZXh0IGZpcnN0IGNodW5rICovCgkJCQkJbGFzdF9jaHVua19pbl9ydW4gPSBzdHNjLmZpcnN0X2NodW5rW2NodW5rX3J1bl9pbmRleCsxXS0xOyAJCgkJCQl9IGVsc2UgewoJCQkJCS8qIFRoZXJlIGlzIG9ubHkgb25lIGVudHJ5IGluIHRoZSB0YWJsZSwgaXQgaXMgdmFsaWQgZm9yIGFsbCBmdXR1cmUgY2h1bmtzKi8KCQkJCQlsYXN0X2NodW5rX2luX3J1biA9IEluZmluaXR5OwoJCQkJfQoJCQl9IGVsc2UgewoJCQkJaWYgKGogPCBsYXN0X3NhbXBsZV9pbl9jaHVuaykgewoJCQkJCS8qIHRoZSBzYW1wbGUgaXMgc3RpbGwgaW4gdGhlIGN1cnJlbnQgY2h1bmsgKi8KCQkJCQlzYW1wbGUuY2h1bmtfaW5kZXggPSBjaHVua19pbmRleDsKCQkJCQlzYW1wbGUuY2h1bmtfcnVuX2luZGV4ID0gY2h1bmtfcnVuX2luZGV4OwoJCQkJfSBlbHNlIHsKCQkJCQkvKiB0aGUgc2FtcGxlIGlzIGluIHRoZSBuZXh0IGNodW5rICovCgkJCQkJY2h1bmtfaW5kZXgrKzsKCQkJCQlzYW1wbGUuY2h1bmtfaW5kZXggPSBjaHVua19pbmRleDsKCQkJCQkvKiByZXNldCB0aGUgYWNjdW11bGF0ZWQgb2Zmc2V0IGluIHRoZSBjaHVuayAqLwoJCQkJCW9mZnNldF9pbl9jaHVuayA9IDA7CgkJCQkJaWYgKGNodW5rX2luZGV4IDw9IGxhc3RfY2h1bmtfaW5fcnVuKSA7IGVsc2UgewoJCQkJCQljaHVua19ydW5faW5kZXgrKzsKCQkJCQkJLyogSXMgdGhlcmUgYW5vdGhlciBlbnRyeSBpbiB0aGUgZmlyc3RfY2h1bmsgdGFibGUgPyAqLwoJCQkJCQlpZiAoY2h1bmtfcnVuX2luZGV4ICsgMSA8IHN0c2MuZmlyc3RfY2h1bmsubGVuZ3RoKSB7CgkJCQkJCQkvKiBUaGUgbGFzdCBjaHVuayBpbiB0aGUgcnVuIGlzIHRoZSBjaHVuayBiZWZvcmUgdGhlIG5leHQgZmlyc3QgY2h1bmsgKi8KCQkJCQkJCWxhc3RfY2h1bmtfaW5fcnVuID0gc3RzYy5maXJzdF9jaHVua1tjaHVua19ydW5faW5kZXgrMV0tMTsgCQoJCQkJCQl9IGVsc2UgewoJCQkJCQkJLyogVGhlcmUgaXMgb25seSBvbmUgZW50cnkgaW4gdGhlIHRhYmxlLCBpdCBpcyB2YWxpZCBmb3IgYWxsIGZ1dHVyZSBjaHVua3MqLwoJCQkJCQkJbGFzdF9jaHVua19pbl9ydW4gPSBJbmZpbml0eTsKCQkJCQkJfQoJCQkJCQkKCQkJCQl9CgkJCQkJc2FtcGxlLmNodW5rX3J1bl9pbmRleCA9IGNodW5rX3J1bl9pbmRleDsKCQkJCQlsYXN0X3NhbXBsZV9pbl9jaHVuayArPSBzdHNjLnNhbXBsZXNfcGVyX2NodW5rW2NodW5rX3J1bl9pbmRleF07CgkJCQl9CgkJCX0KCgkJCXNhbXBsZS5kZXNjcmlwdGlvbl9pbmRleCA9IHN0c2Muc2FtcGxlX2Rlc2NyaXB0aW9uX2luZGV4W3NhbXBsZS5jaHVua19ydW5faW5kZXhdLTE7CgkJCXNhbXBsZS5kZXNjcmlwdGlvbiA9IHN0c2QuZW50cmllc1tzYW1wbGUuZGVzY3JpcHRpb25faW5kZXhdOwoJCQlzYW1wbGUub2Zmc2V0ID0gc3Rjby5jaHVua19vZmZzZXRzW3NhbXBsZS5jaHVua19pbmRleC0xXSArIG9mZnNldF9pbl9jaHVuazsgLyogY2h1bmsgaW5kZXhlcyBhcmUgMS1iYXNlZCAqLwoJCQlvZmZzZXRfaW5fY2h1bmsgKz0gc2FtcGxlLnNpemU7CgoJCQkvKiBzZXR0aW5nIGR0cywgY3RzLCBkdXJhdGlvbiBhbmQgcmFwIGZsYWdzICovCgkJCWlmIChqID4gbGFzdF9zYW1wbGVfaW5fc3R0c19ydW4pIHsKCQkJCXN0dHNfcnVuX2luZGV4Kys7CgkJCQlpZiAobGFzdF9zYW1wbGVfaW5fc3R0c19ydW4gPCAwKSB7CgkJCQkJbGFzdF9zYW1wbGVfaW5fc3R0c19ydW4gPSAwOwoJCQkJfQoJCQkJbGFzdF9zYW1wbGVfaW5fc3R0c19ydW4gKz0gc3R0cy5zYW1wbGVfY291bnRzW3N0dHNfcnVuX2luZGV4XTsJCQkJCgkJCX0KCQkJaWYgKGogPiAwKSB7CgkJCQl0cmFrLnNhbXBsZXNbai0xXS5kdXJhdGlvbiA9IHN0dHMuc2FtcGxlX2RlbHRhc1tzdHRzX3J1bl9pbmRleF07CgkJCQl0cmFrLnNhbXBsZXNfZHVyYXRpb24gKz0gdHJhay5zYW1wbGVzW2otMV0uZHVyYXRpb247CgkJCQlzYW1wbGUuZHRzID0gdHJhay5zYW1wbGVzW2otMV0uZHRzICsgdHJhay5zYW1wbGVzW2otMV0uZHVyYXRpb247CgkJCX0gZWxzZSB7CgkJCQlzYW1wbGUuZHRzID0gMDsKCQkJfQoJCQlpZiAoY3R0cykgewoJCQkJaWYgKGogPj0gbGFzdF9zYW1wbGVfaW5fY3R0c19ydW4pIHsKCQkJCQljdHRzX3J1bl9pbmRleCsrOwoJCQkJCWlmIChsYXN0X3NhbXBsZV9pbl9jdHRzX3J1biA8IDApIHsKCQkJCQkJbGFzdF9zYW1wbGVfaW5fY3R0c19ydW4gPSAwOwoJCQkJCX0KCQkJCQlsYXN0X3NhbXBsZV9pbl9jdHRzX3J1biArPSBjdHRzLnNhbXBsZV9jb3VudHNbY3R0c19ydW5faW5kZXhdOwkJCQkKCQkJCX0KCQkJCXNhbXBsZS5jdHMgPSB0cmFrLnNhbXBsZXNbal0uZHRzICsgY3R0cy5zYW1wbGVfb2Zmc2V0c1tjdHRzX3J1bl9pbmRleF07CgkJCX0gZWxzZSB7CgkJCQlzYW1wbGUuY3RzID0gc2FtcGxlLmR0czsKCQkJfQoJCQlpZiAoc3RzcykgewoJCQkJaWYgKGogPT0gc3Rzcy5zYW1wbGVfbnVtYmVyc1tsYXN0X3N0c3NfaW5kZXhdIC0gMSkgeyAvLyBzYW1wbGUgbnVtYmVycyBhcmUgMS1iYXNlZAoJCQkJCXNhbXBsZS5pc19zeW5jID0gdHJ1ZTsKCQkJCQlsYXN0X3N0c3NfaW5kZXgrKzsKCQkJCX0gZWxzZSB7CgkJCQkJc2FtcGxlLmlzX3N5bmMgPSBmYWxzZTsJCQkJCgkJCQkJc2FtcGxlLmRlZ3JhZGF0aW9uX3ByaW9yaXR5ID0gMDsKCQkJCX0KCQkJCWlmIChzdWJzKSB7CgkJCQkJaWYgKHN1YnMuZW50cmllc1tzdWJzX2VudHJ5X2luZGV4XS5zYW1wbGVfZGVsdGEgKyBsYXN0X3N1YnNfc2FtcGxlX2luZGV4ID09IGorMSkgewoJCQkJCQlzYW1wbGUuc3Vic2FtcGxlcyA9IHN1YnMuZW50cmllc1tzdWJzX2VudHJ5X2luZGV4XS5zdWJzYW1wbGVzOwoJCQkJCQlsYXN0X3N1YnNfc2FtcGxlX2luZGV4ICs9IHN1YnMuZW50cmllc1tzdWJzX2VudHJ5X2luZGV4XS5zYW1wbGVfZGVsdGE7CgkJCQkJCXN1YnNfZW50cnlfaW5kZXgrKzsKCQkJCQl9CgkJCQl9CgkJCX0gZWxzZSB7CgkJCQlzYW1wbGUuaXNfc3luYyA9IHRydWU7CgkJCX0KCQkJSVNPRmlsZS5wcm9jZXNzX3NkdHAodHJhay5tZGlhLm1pbmYuc3RibC5zZHRwLCBzYW1wbGUsIHNhbXBsZS5udW1iZXIpOwoJCQlpZiAoc3RkcCkgewoJCQkJc2FtcGxlLmRlZ3JhZGF0aW9uX3ByaW9yaXR5ID0gc3RkcC5wcmlvcml0eVtqXTsKCQkJfSBlbHNlIHsKCQkJCXNhbXBsZS5kZWdyYWRhdGlvbl9wcmlvcml0eSA9IDA7CgkJCX0KCQkJaWYgKHN1YnMpIHsKCQkJCWlmIChzdWJzLmVudHJpZXNbc3Vic19lbnRyeV9pbmRleF0uc2FtcGxlX2RlbHRhICsgbGFzdF9zdWJzX3NhbXBsZV9pbmRleCA9PSBqKSB7CgkJCQkJc2FtcGxlLnN1YnNhbXBsZXMgPSBzdWJzLmVudHJpZXNbc3Vic19lbnRyeV9pbmRleF0uc3Vic2FtcGxlczsKCQkJCQlsYXN0X3N1YnNfc2FtcGxlX2luZGV4ICs9IHN1YnMuZW50cmllc1tzdWJzX2VudHJ5X2luZGV4XS5zYW1wbGVfZGVsdGE7CgkJCQl9CgkJCX0KCQkJaWYgKHNiZ3BzLmxlbmd0aCA+IDAgfHwgc2dwZHMubGVuZ3RoID4gMCkgewoJCQkJSVNPRmlsZS5zZXRTYW1wbGVHcm91cFByb3BlcnRpZXModHJhaywgc2FtcGxlLCBqLCB0cmFrLnNhbXBsZV9ncm91cHNfaW5mbyk7CgkJCX0KCQl9CgkJaWYgKGo+MCkgewoJCQl0cmFrLnNhbXBsZXNbai0xXS5kdXJhdGlvbiA9IE1hdGgubWF4KHRyYWsubWRpYS5tZGhkLmR1cmF0aW9uIC0gdHJhay5zYW1wbGVzW2otMV0uZHRzLCAwKTsKCQkJdHJhay5zYW1wbGVzX2R1cmF0aW9uICs9IHRyYWsuc2FtcGxlc1tqLTFdLmR1cmF0aW9uOwoJCX0KCX07CgoJLyogVXBkYXRlIHNhbXBsZSBsaXN0IHdoZW4gbmV3ICdtb29mJyBib3hlcyBhcmUgcmVjZWl2ZWQgKi8KCUlTT0ZpbGUucHJvdG90eXBlLnVwZGF0ZVNhbXBsZUxpc3RzID0gZnVuY3Rpb24oKSB7CQoJCXZhciBpLCBqLCBrOwoJCXZhciBkZWZhdWx0X3NhbXBsZV9kZXNjcmlwdGlvbl9pbmRleCwgZGVmYXVsdF9zYW1wbGVfZHVyYXRpb24sIGRlZmF1bHRfc2FtcGxlX3NpemUsIGRlZmF1bHRfc2FtcGxlX2ZsYWdzOwoJCXZhciBsYXN0X3J1bl9wb3NpdGlvbjsKCQl2YXIgYm94LCBtb29mLCB0cmFmLCB0cmFrLCB0cmV4OwoJCXZhciBzYW1wbGU7CgkJdmFyIHNhbXBsZV9mbGFnczsKCQkKCQlpZiAodGhpcy5tb292ID09PSB1bmRlZmluZWQpIHsKCQkJcmV0dXJuOwoJCX0KCQkvKiBpZiB0aGUgaW5wdXQgZmlsZSBpcyBmcmFnbWVudGVkIGFuZCBmZXRjaGVkIGluIG11bHRpcGxlIGRvd25sb2Fkcywgd2UgbmVlZCB0byB1cGRhdGUgdGhlIGxpc3Qgb2Ygc2FtcGxlcyAqLwoJCXdoaWxlICh0aGlzLmxhc3RNb29mSW5kZXggPCB0aGlzLm1vb2ZzLmxlbmd0aCkgewoJCQlib3ggPSB0aGlzLm1vb2ZzW3RoaXMubGFzdE1vb2ZJbmRleF07CgkJCXRoaXMubGFzdE1vb2ZJbmRleCsrOwoJCQlpZiAoYm94LnR5cGUgPT0gIm1vb2YiKSB7CgkJCQltb29mID0gYm94OwoJCQkJZm9yIChpID0gMDsgaSA8IG1vb2YudHJhZnMubGVuZ3RoOyBpKyspIHsKCQkJCQl0cmFmID0gbW9vZi50cmFmc1tpXTsKCQkJCQl0cmFrID0gdGhpcy5nZXRUcmFja0J5SWQodHJhZi50ZmhkLnRyYWNrX2lkKTsKCQkJCQl0cmV4ID0gdGhpcy5nZXRUcmV4QnlJZCh0cmFmLnRmaGQudHJhY2tfaWQpOwoJCQkJCWlmICh0cmFmLnRmaGQuZmxhZ3MgJiBCb3hQYXJzZXIuVEZIRF9GTEFHX1NBTVBMRV9ERVNDKSB7CgkJCQkJCWRlZmF1bHRfc2FtcGxlX2Rlc2NyaXB0aW9uX2luZGV4ID0gdHJhZi50ZmhkLmRlZmF1bHRfc2FtcGxlX2Rlc2NyaXB0aW9uX2luZGV4OwoJCQkJCX0gZWxzZSB7CgkJCQkJCWRlZmF1bHRfc2FtcGxlX2Rlc2NyaXB0aW9uX2luZGV4ID0gKHRyZXggPyB0cmV4LmRlZmF1bHRfc2FtcGxlX2Rlc2NyaXB0aW9uX2luZGV4OiAxKTsKCQkJCQl9CgkJCQkJaWYgKHRyYWYudGZoZC5mbGFncyAmIEJveFBhcnNlci5URkhEX0ZMQUdfU0FNUExFX0RVUikgewoJCQkJCQlkZWZhdWx0X3NhbXBsZV9kdXJhdGlvbiA9IHRyYWYudGZoZC5kZWZhdWx0X3NhbXBsZV9kdXJhdGlvbjsKCQkJCQl9IGVsc2UgewoJCQkJCQlkZWZhdWx0X3NhbXBsZV9kdXJhdGlvbiA9ICh0cmV4ID8gdHJleC5kZWZhdWx0X3NhbXBsZV9kdXJhdGlvbiA6IDApOwoJCQkJCX0KCQkJCQlpZiAodHJhZi50ZmhkLmZsYWdzICYgQm94UGFyc2VyLlRGSERfRkxBR19TQU1QTEVfU0laRSkgewoJCQkJCQlkZWZhdWx0X3NhbXBsZV9zaXplID0gdHJhZi50ZmhkLmRlZmF1bHRfc2FtcGxlX3NpemU7CgkJCQkJfSBlbHNlIHsKCQkJCQkJZGVmYXVsdF9zYW1wbGVfc2l6ZSA9ICh0cmV4ID8gdHJleC5kZWZhdWx0X3NhbXBsZV9zaXplIDogMCk7CgkJCQkJfQoJCQkJCWlmICh0cmFmLnRmaGQuZmxhZ3MgJiBCb3hQYXJzZXIuVEZIRF9GTEFHX1NBTVBMRV9GTEFHUykgewoJCQkJCQlkZWZhdWx0X3NhbXBsZV9mbGFncyA9IHRyYWYudGZoZC5kZWZhdWx0X3NhbXBsZV9mbGFnczsKCQkJCQl9IGVsc2UgewoJCQkJCQlkZWZhdWx0X3NhbXBsZV9mbGFncyA9ICh0cmV4ID8gdHJleC5kZWZhdWx0X3NhbXBsZV9mbGFncyA6IDApOwoJCQkJCX0KCQkJCQl0cmFmLnNhbXBsZV9udW1iZXIgPSAwOwoJCQkJCS8qIHByb2Nlc3Mgc2FtcGxlIGdyb3VwcyAqLwoJCQkJCWlmICh0cmFmLnNiZ3BzLmxlbmd0aCA+IDApIHsKCQkJCQkJSVNPRmlsZS5pbml0U2FtcGxlR3JvdXBzKHRyYWssIHRyYWYsIHRyYWYuc2JncHMsIHRyYWsubWRpYS5taW5mLnN0Ymwuc2dwZHMsIHRyYWYuc2dwZHMpOwoJCQkJCX0KCQkJCQlmb3IgKGogPSAwOyBqIDwgdHJhZi50cnVucy5sZW5ndGg7IGorKykgewoJCQkJCQl2YXIgdHJ1biA9IHRyYWYudHJ1bnNbal07CgkJCQkJCWZvciAoayA9IDA7IGsgPCB0cnVuLnNhbXBsZV9jb3VudDsgaysrKSB7CgkJCQkJCQlzYW1wbGUgPSB7fTsKCQkJCQkJCXNhbXBsZS5tb29mX251bWJlciA9IHRoaXMubGFzdE1vb2ZJbmRleDsKCQkJCQkJCXNhbXBsZS5udW1iZXJfaW5fdHJhZiA9IHRyYWYuc2FtcGxlX251bWJlcjsKCQkJCQkJCXRyYWYuc2FtcGxlX251bWJlcisrOwoJCQkJICAgICAgICAgICAgc2FtcGxlLm51bWJlciA9IHRyYWsuc2FtcGxlcy5sZW5ndGg7CgkJCQkJCQl0cmFmLmZpcnN0X3NhbXBsZV9pbmRleCA9IHRyYWsuc2FtcGxlcy5sZW5ndGg7CgkJCQkJCQl0cmFrLnNhbXBsZXMucHVzaChzYW1wbGUpOwoJCQkJCQkJc2FtcGxlLnRyYWNrX2lkID0gdHJhay50a2hkLnRyYWNrX2lkOwoJCQkJCQkJc2FtcGxlLnRpbWVzY2FsZSA9IHRyYWsubWRpYS5tZGhkLnRpbWVzY2FsZTsKCQkJCQkJCXNhbXBsZS5kZXNjcmlwdGlvbl9pbmRleCA9IGRlZmF1bHRfc2FtcGxlX2Rlc2NyaXB0aW9uX2luZGV4LTE7CgkJCQkJCQlzYW1wbGUuZGVzY3JpcHRpb24gPSB0cmFrLm1kaWEubWluZi5zdGJsLnN0c2QuZW50cmllc1tzYW1wbGUuZGVzY3JpcHRpb25faW5kZXhdOwoJCQkJCQkJc2FtcGxlLnNpemUgPSBkZWZhdWx0X3NhbXBsZV9zaXplOwoJCQkJCQkJaWYgKHRydW4uZmxhZ3MgJiBCb3hQYXJzZXIuVFJVTl9GTEFHU19TSVpFKSB7CgkJCQkJCQkJc2FtcGxlLnNpemUgPSB0cnVuLnNhbXBsZV9zaXplW2tdOwoJCQkJCQkJfQoJCQkJCQkJdHJhay5zYW1wbGVzX3NpemUgKz0gc2FtcGxlLnNpemU7CgkJCQkJCQlzYW1wbGUuZHVyYXRpb24gPSBkZWZhdWx0X3NhbXBsZV9kdXJhdGlvbjsKCQkJCQkJCWlmICh0cnVuLmZsYWdzICYgQm94UGFyc2VyLlRSVU5fRkxBR1NfRFVSQVRJT04pIHsKCQkJCQkJCQlzYW1wbGUuZHVyYXRpb24gPSB0cnVuLnNhbXBsZV9kdXJhdGlvbltrXTsKCQkJCQkJCX0KCQkJCQkJCXRyYWsuc2FtcGxlc19kdXJhdGlvbiArPSBzYW1wbGUuZHVyYXRpb247CgkJCQkJCQlpZiAodHJhay5maXJzdF90cmFmX21lcmdlZCB8fCBrID4gMCkgewoJCQkJCQkJCXNhbXBsZS5kdHMgPSB0cmFrLnNhbXBsZXNbdHJhay5zYW1wbGVzLmxlbmd0aC0yXS5kdHMrdHJhay5zYW1wbGVzW3RyYWsuc2FtcGxlcy5sZW5ndGgtMl0uZHVyYXRpb247CgkJCQkJCQl9IGVsc2UgewoJCQkJCQkJCWlmICh0cmFmLnRmZHQpIHsKCQkJCQkJCQkJc2FtcGxlLmR0cyA9IHRyYWYudGZkdC5iYXNlTWVkaWFEZWNvZGVUaW1lOwoJCQkJCQkJCX0gZWxzZSB7CgkJCQkJCQkJCXNhbXBsZS5kdHMgPSAwOwoJCQkJCQkJCX0KCQkJCQkJCQl0cmFrLmZpcnN0X3RyYWZfbWVyZ2VkID0gdHJ1ZTsKCQkJCQkJCX0KCQkJCQkJCXNhbXBsZS5jdHMgPSBzYW1wbGUuZHRzOwoJCQkJCQkJaWYgKHRydW4uZmxhZ3MgJiBCb3hQYXJzZXIuVFJVTl9GTEFHU19DVFNfT0ZGU0VUKSB7CgkJCQkJCQkJc2FtcGxlLmN0cyA9IHNhbXBsZS5kdHMgKyB0cnVuLnNhbXBsZV9jb21wb3NpdGlvbl90aW1lX29mZnNldFtrXTsKCQkJCQkJCX0KCQkJCQkJCXNhbXBsZV9mbGFncyA9IGRlZmF1bHRfc2FtcGxlX2ZsYWdzOwoJCQkJCQkJaWYgKHRydW4uZmxhZ3MgJiBCb3hQYXJzZXIuVFJVTl9GTEFHU19GTEFHUykgewoJCQkJCQkJCXNhbXBsZV9mbGFncyA9IHRydW4uc2FtcGxlX2ZsYWdzW2tdOwoJCQkJCQkJfSBlbHNlIGlmIChrID09PSAwICYmICh0cnVuLmZsYWdzICYgQm94UGFyc2VyLlRSVU5fRkxBR1NfRklSU1RfRkxBRykpIHsKCQkJCQkJCQlzYW1wbGVfZmxhZ3MgPSB0cnVuLmZpcnN0X3NhbXBsZV9mbGFnczsKCQkJCQkJCX0KCQkJCQkJCXNhbXBsZS5pc19zeW5jID0gKChzYW1wbGVfZmxhZ3MgPj4gMTYgJiAweDEpID8gZmFsc2UgOiB0cnVlKTsKCQkJCQkJCXNhbXBsZS5pc19sZWFkaW5nID0gKHNhbXBsZV9mbGFncyA+PiAyNiAmIDB4Myk7CgkJCQkJCQlzYW1wbGUuZGVwZW5kc19vbiA9IChzYW1wbGVfZmxhZ3MgPj4gMjQgJiAweDMpOwoJCQkJCQkJc2FtcGxlLmlzX2RlcGVuZGVkX29uID0gKHNhbXBsZV9mbGFncyA+PiAyMiAmIDB4Myk7CgkJCQkJCQlzYW1wbGUuaGFzX3JlZHVuZGFuY3kgPSAoc2FtcGxlX2ZsYWdzID4+IDIwICYgMHgzKTsKCQkJCQkJCXNhbXBsZS5kZWdyYWRhdGlvbl9wcmlvcml0eSA9IChzYW1wbGVfZmxhZ3MgJiAweEZGRkYpOwoJCQkJCQkJLy9JU09GaWxlLnByb2Nlc3Nfc2R0cCh0cmFmLnNkdHAsIHNhbXBsZSwgc2FtcGxlLm51bWJlcl9pbl90cmFmKTsKCQkJCQkJCXZhciBiZG9wID0gKHRyYWYudGZoZC5mbGFncyAmIEJveFBhcnNlci5URkhEX0ZMQUdfQkFTRV9EQVRBX09GRlNFVCkgPyB0cnVlIDogZmFsc2U7CgkJCQkJCQl2YXIgZGJpbSA9ICh0cmFmLnRmaGQuZmxhZ3MgJiBCb3hQYXJzZXIuVEZIRF9GTEFHX0RFRkFVTFRfQkFTRV9JU19NT09GKSA/IHRydWUgOiBmYWxzZTsKCQkJCQkJCXZhciBkb3AgPSAodHJ1bi5mbGFncyAmIEJveFBhcnNlci5UUlVOX0ZMQUdTX0RBVEFfT0ZGU0VUKSA/IHRydWUgOiBmYWxzZTsKCQkJCQkJCXZhciBiZG8gPSAwOwoJCQkJCQkJaWYgKCFiZG9wKSB7CgkJCQkJCQkJaWYgKCFkYmltKSB7CgkJCQkJCQkJCWlmIChqID09PSAwKSB7IC8vIHRoZSBmaXJzdCB0cmFjayBpbiB0aGUgbW92aWUgZnJhZ21lbnQKCQkJCQkJCQkJCWJkbyA9IG1vb2Yuc3RhcnQ7IC8vIHRoZSBwb3NpdGlvbiBvZiB0aGUgZmlyc3QgYnl0ZSBvZiB0aGUgZW5jbG9zaW5nIE1vdmllIEZyYWdtZW50IEJveAoJCQkJCQkJCQl9IGVsc2UgewoJCQkJCQkJCQkJYmRvID0gbGFzdF9ydW5fcG9zaXRpb247IC8vIGVuZCBvZiB0aGUgZGF0YSBkZWZpbmVkIGJ5IHRoZSBwcmVjZWRpbmcgKnRyYWNrKiAoaXJyZXNwZWN0aXZlIG9mIHRoZSB0cmFjayBpZCkgZnJhZ21lbnQgaW4gdGhlIG1vb2YKCQkJCQkJCQkJfQoJCQkJCQkJCX0gZWxzZSB7CgkJCQkJCQkJCWJkbyA9IG1vb2Yuc3RhcnQ7CgkJCQkJCQkJfQoJCQkJCQkJfSBlbHNlIHsKCQkJCQkJCQliZG8gPSB0cmFmLnRmaGQuYmFzZV9kYXRhX29mZnNldDsKCQkJCQkJCX0KCQkJCQkJCWlmIChqID09PSAwICYmIGsgPT09IDApIHsKCQkJCQkJCQlpZiAoZG9wKSB7CgkJCQkJCQkJCXNhbXBsZS5vZmZzZXQgPSBiZG8gKyB0cnVuLmRhdGFfb2Zmc2V0OyAvLyBJZiB0aGUgZGF0YS1vZmZzZXQgaXMgcHJlc2VudCwgaXQgaXMgcmVsYXRpdmUgdG8gdGhlIGJhc2UtZGF0YS1vZmZzZXQgZXN0YWJsaXNoZWQgaW4gdGhlIHRyYWNrIGZyYWdtZW50IGhlYWRlcgoJCQkJCQkJCX0gZWxzZSB7CgkJCQkJCQkJCXNhbXBsZS5vZmZzZXQgPSBiZG87IC8vIHRoZSBkYXRhIGZvciB0aGlzIHJ1biBzdGFydHMgdGhlIGJhc2UtZGF0YS1vZmZzZXQgZGVmaW5lZCBieSB0aGUgdHJhY2sgZnJhZ21lbnQgaGVhZGVyCgkJCQkJCQkJfQoJCQkJCQkJfSBlbHNlIHsKCQkJCQkJCQlzYW1wbGUub2Zmc2V0ID0gbGFzdF9ydW5fcG9zaXRpb247IC8vIHRoaXMgcnVuIHN0YXJ0cyBpbW1lZGlhdGVseSBhZnRlciB0aGUgZGF0YSBvZiB0aGUgcHJldmlvdXMgcnVuCgkJCQkJCQl9CgkJCQkJCQlsYXN0X3J1bl9wb3NpdGlvbiA9IHNhbXBsZS5vZmZzZXQgKyBzYW1wbGUuc2l6ZTsKCQkJCQkJCWlmICh0cmFmLnNiZ3BzLmxlbmd0aCA+IDAgfHwgdHJhZi5zZ3Bkcy5sZW5ndGggPiAwIHx8CgkJCQkJCQkJdHJhay5tZGlhLm1pbmYuc3RibC5zYmdwcy5sZW5ndGggPiAwIHx8IHRyYWsubWRpYS5taW5mLnN0Ymwuc2dwZHMubGVuZ3RoID4gMCkgewoJCQkJCQkJCUlTT0ZpbGUuc2V0U2FtcGxlR3JvdXBQcm9wZXJ0aWVzKHRyYWssIHNhbXBsZSwgc2FtcGxlLm51bWJlcl9pbl90cmFmLCB0cmFmLnNhbXBsZV9ncm91cHNfaW5mbyk7CgkJCQkJCQl9CgkJCQkJCX0KCQkJCQl9CgkJCQkJaWYgKHRyYWYuc3VicykgewoJCQkJCQl0cmFrLmhhc19mcmFnbWVudF9zdWJzYW1wbGVzID0gdHJ1ZTsKCQkJCQkJdmFyIHNhbXBsZV9pbmRleCA9IHRyYWYuZmlyc3Rfc2FtcGxlX2luZGV4OwoJCQkJCQlmb3IgKGogPSAwOyBqIDwgdHJhZi5zdWJzLmVudHJpZXMubGVuZ3RoOyBqKyspIHsKCQkJCQkJCXNhbXBsZV9pbmRleCArPSB0cmFmLnN1YnMuZW50cmllc1tqXS5zYW1wbGVfZGVsdGE7CgkJCQkJCQlzYW1wbGUgPSB0cmFrLnNhbXBsZXNbc2FtcGxlX2luZGV4LTFdOwoJCQkJCQkJc2FtcGxlLnN1YnNhbXBsZXMgPSB0cmFmLnN1YnMuZW50cmllc1tqXS5zdWJzYW1wbGVzOwoJCQkJCQl9CQkJCQkKCQkJCQl9CgkJCQl9CgkJCX0KCQl9CQoJfTsKCgkvKiBUcnkgdG8gZ2V0IHNhbXBsZSBkYXRhIGZvciBhIGdpdmVuIHNhbXBsZToKCSAgIHJldHVybnMgbnVsbCBpZiBub3QgZm91bmQKCSAgIHJldHVybnMgdGhlIHNhbWUgc2FtcGxlIGlmIGFscmVhZHkgcmVxdWVzdGVkCgkgKi8KCUlTT0ZpbGUucHJvdG90eXBlLmdldFNhbXBsZSA9IGZ1bmN0aW9uKHRyYWssIHNhbXBsZU51bSkgewkKCQl2YXIgYnVmZmVyOwoJCXZhciBzYW1wbGUgPSB0cmFrLnNhbXBsZXNbc2FtcGxlTnVtXTsKCQkKCQlpZiAoIXRoaXMubW9vdikgewoJCQlyZXR1cm4gbnVsbDsKCQl9CgoJCWlmICghc2FtcGxlLmRhdGEpIHsKCQkJLyogTm90IHlldCBmZXRjaGVkICovCgkJCXNhbXBsZS5kYXRhID0gbmV3IFVpbnQ4QXJyYXkoc2FtcGxlLnNpemUpOwoJCQlzYW1wbGUuYWxyZWFkeVJlYWQgPSAwOwoJCQl0aGlzLnNhbXBsZXNEYXRhU2l6ZSArPSBzYW1wbGUuc2l6ZTsKCQkJTG9nLmRlYnVnKCJJU09GaWxlIiwgIkFsbG9jYXRpbmcgc2FtcGxlICMiK3NhbXBsZU51bSsiIG9uIHRyYWNrICMiK3RyYWsudGtoZC50cmFja19pZCsiIG9mIHNpemUgIitzYW1wbGUuc2l6ZSsiICh0b3RhbDogIit0aGlzLnNhbXBsZXNEYXRhU2l6ZSsiKSIpOwoJCX0gZWxzZSBpZiAoc2FtcGxlLmFscmVhZHlSZWFkID09IHNhbXBsZS5zaXplKSB7CgkJCS8qIEFscmVhZHkgZmV0Y2hlZCBlbnRpcmVseSAqLwoJCQlyZXR1cm4gc2FtcGxlOwoJCX0KCgkJLyogVGhlIHNhbXBsZSBoYXMgb25seSBiZWVuIHBhcnRpYWxseSBmZXRjaGVkLCB3ZSBuZWVkIHRvIGNoZWNrIGluIGFsbCBidWZmZXJzICovCgkJd2hpbGUodHJ1ZSkgewoJCQl2YXIgaW5kZXggPQl0aGlzLnN0cmVhbS5maW5kUG9zaXRpb24odHJ1ZSwgc2FtcGxlLm9mZnNldCArIHNhbXBsZS5hbHJlYWR5UmVhZCwgZmFsc2UpOwoJCQlpZiAoaW5kZXggPiAtMSkgewoJCQkJYnVmZmVyID0gdGhpcy5zdHJlYW0uYnVmZmVyc1tpbmRleF07CgkJCQl2YXIgbGVuZ3RoQWZ0ZXJTdGFydCA9IGJ1ZmZlci5ieXRlTGVuZ3RoIC0gKHNhbXBsZS5vZmZzZXQgKyBzYW1wbGUuYWxyZWFkeVJlYWQgLSBidWZmZXIuZmlsZVN0YXJ0KTsKCQkJCWlmIChzYW1wbGUuc2l6ZSAtIHNhbXBsZS5hbHJlYWR5UmVhZCA8PSBsZW5ndGhBZnRlclN0YXJ0KSB7CgkJCQkJLyogdGhlIChyZXN0IG9mIHRoZSkgc2FtcGxlIGlzIGVudGlyZWx5IGNvbnRhaW5lZCBpbiB0aGlzIGJ1ZmZlciAqLwoKCQkJCQlMb2cuZGVidWcoIklTT0ZpbGUiLCJHZXR0aW5nIHNhbXBsZSAjIitzYW1wbGVOdW0rIiBkYXRhIChhbHJlYWR5UmVhZDogIitzYW1wbGUuYWxyZWFkeVJlYWQrIiBvZmZzZXQ6ICIrCgkJCQkJCShzYW1wbGUub2Zmc2V0K3NhbXBsZS5hbHJlYWR5UmVhZCAtIGJ1ZmZlci5maWxlU3RhcnQpKyIgcmVhZCBzaXplOiAiKyhzYW1wbGUuc2l6ZSAtIHNhbXBsZS5hbHJlYWR5UmVhZCkrIiBmdWxsIHNpemU6ICIrc2FtcGxlLnNpemUrIikiKTsKCgkJCQkJRGF0YVN0cmVhbS5tZW1jcHkoc2FtcGxlLmRhdGEuYnVmZmVyLCBzYW1wbGUuYWxyZWFkeVJlYWQsCgkJCQkJICAgICAgICAgICAgICAgICAgYnVmZmVyLCBzYW1wbGUub2Zmc2V0K3NhbXBsZS5hbHJlYWR5UmVhZCAtIGJ1ZmZlci5maWxlU3RhcnQsIHNhbXBsZS5zaXplIC0gc2FtcGxlLmFscmVhZHlSZWFkKTsKCgkJCQkJLyogdXBkYXRlIHRoZSBudW1iZXIgb2YgYnl0ZXMgdXNlZCBpbiB0aGlzIGJ1ZmZlciBhbmQgY2hlY2sgaWYgaXQgbmVlZHMgdG8gYmUgcmVtb3ZlZCAqLwoJCQkJCWJ1ZmZlci51c2VkQnl0ZXMgKz0gc2FtcGxlLnNpemUgLSBzYW1wbGUuYWxyZWFkeVJlYWQ7CgkJCQkJdGhpcy5zdHJlYW0ubG9nQnVmZmVyTGV2ZWwoKTsKCgkJCQkJc2FtcGxlLmFscmVhZHlSZWFkID0gc2FtcGxlLnNpemU7CgoJCQkJCXJldHVybiBzYW1wbGU7CgkJCQl9IGVsc2UgewoJCQkJCS8qIHRoZSBzYW1wbGUgZG9lcyBub3QgZW5kIGluIHRoaXMgYnVmZmVyICovCgoJCQkJCWlmIChsZW5ndGhBZnRlclN0YXJ0ID09PSAwKSByZXR1cm4gbnVsbDsKCgkJCQkJTG9nLmRlYnVnKCJJU09GaWxlIiwiR2V0dGluZyBzYW1wbGUgIyIrc2FtcGxlTnVtKyIgcGFydGlhbCBkYXRhIChhbHJlYWR5UmVhZDogIitzYW1wbGUuYWxyZWFkeVJlYWQrIiBvZmZzZXQ6ICIrCgkJCQkJCShzYW1wbGUub2Zmc2V0K3NhbXBsZS5hbHJlYWR5UmVhZCAtIGJ1ZmZlci5maWxlU3RhcnQpKyIgcmVhZCBzaXplOiAiK2xlbmd0aEFmdGVyU3RhcnQrIiBmdWxsIHNpemU6ICIrc2FtcGxlLnNpemUrIikiKTsKCgkJCQkJRGF0YVN0cmVhbS5tZW1jcHkoc2FtcGxlLmRhdGEuYnVmZmVyLCBzYW1wbGUuYWxyZWFkeVJlYWQsCgkJCQkJICAgICAgICAgICAgICAgICAgYnVmZmVyLCBzYW1wbGUub2Zmc2V0K3NhbXBsZS5hbHJlYWR5UmVhZCAtIGJ1ZmZlci5maWxlU3RhcnQsIGxlbmd0aEFmdGVyU3RhcnQpOwoJCQkJCXNhbXBsZS5hbHJlYWR5UmVhZCArPSBsZW5ndGhBZnRlclN0YXJ0OwoKCQkJCQkvKiB1cGRhdGUgdGhlIG51bWJlciBvZiBieXRlcyB1c2VkIGluIHRoaXMgYnVmZmVyIGFuZCBjaGVjayBpZiBpdCBuZWVkcyB0byBiZSByZW1vdmVkICovCgkJCQkJYnVmZmVyLnVzZWRCeXRlcyArPSBsZW5ndGhBZnRlclN0YXJ0OwoJCQkJCXRoaXMuc3RyZWFtLmxvZ0J1ZmZlckxldmVsKCk7CgoJCQkJCS8qIGtlZXAgbG9va2luZyBpbiB0aGUgbmV4dCBidWZmZXIgKi8KCQkJCX0KCQkJfSBlbHNlIHsKCQkJCXJldHVybiBudWxsOwoJCQl9CgkJfQoJfTsKCgkvKiBSZWxlYXNlIHRoZSBtZW1vcnkgdXNlZCB0byBzdG9yZSB0aGUgZGF0YSBvZiB0aGUgc2FtcGxlICovCglJU09GaWxlLnByb3RvdHlwZS5yZWxlYXNlU2FtcGxlID0gZnVuY3Rpb24odHJhaywgc2FtcGxlTnVtKSB7CQoJCXZhciBzYW1wbGUgPSB0cmFrLnNhbXBsZXNbc2FtcGxlTnVtXTsKCQlpZiAoc2FtcGxlLmRhdGEpIHsKCQkJdGhpcy5zYW1wbGVzRGF0YVNpemUgLT0gc2FtcGxlLnNpemU7CgkJCXNhbXBsZS5kYXRhID0gbnVsbDsKCQkJc2FtcGxlLmFscmVhZHlSZWFkID0gMDsKCQkJcmV0dXJuIHNhbXBsZS5zaXplOwoJCX0gZWxzZSB7CgkJCXJldHVybiAwOwoJCX0KCX07CgoJSVNPRmlsZS5wcm90b3R5cGUuZ2V0QWxsb2NhdGVkU2FtcGxlRGF0YVNpemUgPSBmdW5jdGlvbigpIHsKCQlyZXR1cm4gdGhpcy5zYW1wbGVzRGF0YVNpemU7Cgl9OwoKCS8qIEJ1aWxkcyB0aGUgTUlNRSBUeXBlICdjb2RlY3MnIHN1Yi1wYXJhbWV0ZXJzIGZvciB0aGUgd2hvbGUgZmlsZSAqLwoJSVNPRmlsZS5wcm90b3R5cGUuZ2V0Q29kZWNzID0gZnVuY3Rpb24oKSB7CQoJCXZhciBpOwoJCXZhciBjb2RlY3MgPSAiIjsKCQlmb3IgKGkgPSAwOyBpIDwgdGhpcy5tb292LnRyYWtzLmxlbmd0aDsgaSsrKSB7CgkJCXZhciB0cmFrID0gdGhpcy5tb292LnRyYWtzW2ldOwoJCQlpZiAoaT4wKSB7CgkJCQljb2RlY3MrPSIsIjsgCgkJCX0KCQkJY29kZWNzICs9IHRyYWsubWRpYS5taW5mLnN0Ymwuc3RzZC5lbnRyaWVzWzBdLmdldENvZGVjKCk7CQkKCQl9CgkJcmV0dXJuIGNvZGVjczsKCX07CgoJLyogSGVscGVyIGZ1bmN0aW9uICovCglJU09GaWxlLnByb3RvdHlwZS5nZXRUcmV4QnlJZCA9IGZ1bmN0aW9uKGlkKSB7CQoJCXZhciBpOwoJCWlmICghdGhpcy5tb292IHx8ICF0aGlzLm1vb3YubXZleCkgcmV0dXJuIG51bGw7CgkJZm9yIChpID0gMDsgaSA8IHRoaXMubW9vdi5tdmV4LnRyZXhzLmxlbmd0aDsgaSsrKSB7CgkJCXZhciB0cmV4ID0gdGhpcy5tb292Lm12ZXgudHJleHNbaV07CgkJCWlmICh0cmV4LnRyYWNrX2lkID09IGlkKSByZXR1cm4gdHJleDsKCQl9CgkJcmV0dXJuIG51bGw7Cgl9OwoKCS8qIEhlbHBlciBmdW5jdGlvbiAqLwoJSVNPRmlsZS5wcm90b3R5cGUuZ2V0VHJhY2tCeUlkID0gZnVuY3Rpb24oaWQpIHsKCQlpZiAodGhpcy5tb292ID09PSB1bmRlZmluZWQpIHsKCQkJcmV0dXJuIG51bGw7CgkJfQoJCWZvciAodmFyIGogPSAwOyBqIDwgdGhpcy5tb292LnRyYWtzLmxlbmd0aDsgaisrKSB7CgkJCXZhciB0cmFrID0gdGhpcy5tb292LnRyYWtzW2pdOwoJCQlpZiAodHJhay50a2hkLnRyYWNrX2lkID09IGlkKSByZXR1cm4gdHJhazsKCQl9CgkJcmV0dXJuIG51bGw7Cgl9OwoJLy8gZmlsZTpzcmMvaXNvZmlsZS1pdGVtLXByb2Nlc3NpbmcuanMKCUlTT0ZpbGUucHJvdG90eXBlLml0ZW1zID0gW107CgkvKiBzaXplIG9mIHRoZSBidWZmZXJzIGFsbG9jYXRlZCBmb3Igc2FtcGxlcyAqLwoJSVNPRmlsZS5wcm90b3R5cGUuaXRlbXNEYXRhU2l6ZSA9IDA7CgoJSVNPRmlsZS5wcm90b3R5cGUuZmxhdHRlbkl0ZW1JbmZvID0gZnVuY3Rpb24oKSB7CQoJCXZhciBpdGVtcyA9IHRoaXMuaXRlbXM7CgkJdmFyIGksIGo7CgkJdmFyIGl0ZW07CgkJdmFyIG1ldGEgPSB0aGlzLm1ldGE7CgkJaWYgKG1ldGEgPT09IG51bGwgfHwgbWV0YSA9PT0gdW5kZWZpbmVkKSByZXR1cm47CgkJaWYgKG1ldGEuaGRsciA9PT0gdW5kZWZpbmVkKSByZXR1cm47CgkJaWYgKG1ldGEuaWluZiA9PT0gdW5kZWZpbmVkKSByZXR1cm47CgkJZm9yIChpID0gMDsgaSA8IG1ldGEuaWluZi5pdGVtX2luZm9zLmxlbmd0aDsgaSsrKSB7CgkJCWl0ZW0gPSB7fTsKCQkJaXRlbS5pZCA9IG1ldGEuaWluZi5pdGVtX2luZm9zW2ldLml0ZW1fSUQ7CgkJCWl0ZW1zW2l0ZW0uaWRdID0gaXRlbTsKCQkJaXRlbS5yZWZfdG8gPSBbXTsKCQkJaXRlbS5uYW1lID0gbWV0YS5paW5mLml0ZW1faW5mb3NbaV0uaXRlbV9uYW1lOwoJCQlpZiAobWV0YS5paW5mLml0ZW1faW5mb3NbaV0ucHJvdGVjdGlvbl9pbmRleCA+IDApIHsKCQkJCWl0ZW0ucHJvdGVjdGlvbiA9IG1ldGEuaXByby5wcm90ZWN0aW9uc1ttZXRhLmlpbmYuaXRlbV9pbmZvc1tpXS5wcm90ZWN0aW9uX2luZGV4LTFdOwoJCQl9CgkJCWlmIChtZXRhLmlpbmYuaXRlbV9pbmZvc1tpXS5pdGVtX3R5cGUpIHsKCQkJCWl0ZW0udHlwZSA9IG1ldGEuaWluZi5pdGVtX2luZm9zW2ldLml0ZW1fdHlwZTsKCQkJfSBlbHNlIHsKCQkJCWl0ZW0udHlwZSA9ICJtaW1lIjsKCQkJfQoJCQlpdGVtLmNvbnRlbnRfdHlwZSA9IG1ldGEuaWluZi5pdGVtX2luZm9zW2ldLmNvbnRlbnRfdHlwZTsKCQkJaXRlbS5jb250ZW50X2VuY29kaW5nID0gbWV0YS5paW5mLml0ZW1faW5mb3NbaV0uY29udGVudF9lbmNvZGluZzsKCQl9CgkJaWYgKG1ldGEuaWxvYykgewoJCQlmb3IoaSA9IDA7IGkgPCBtZXRhLmlsb2MuaXRlbXMubGVuZ3RoOyBpKyspIHsKCQkJCXZhciBpdGVtbG9jID0gbWV0YS5pbG9jLml0ZW1zW2ldOwoJCQkJaXRlbSA9IGl0ZW1zW2l0ZW1sb2MuaXRlbV9JRF07CgkJCQlpZiAoaXRlbWxvYy5kYXRhX3JlZmVyZW5jZV9pbmRleCAhPT0gMCkgewoJCQkJCUxvZy53YXJuKCJJdGVtIHN0b3JhZ2Ugd2l0aCByZWZlcmVuY2UgdG8gb3RoZXIgZmlsZXM6IG5vdCBzdXBwb3J0ZWQiKTsKCQkJCQlpdGVtLnNvdXJjZSA9IG1ldGEuZGluZi5ib3hlc1tpdGVtbG9jLmRhdGFfcmVmZXJlbmNlX2luZGV4LTFdOwoJCQkJfQoJCQkJc3dpdGNoKGl0ZW1sb2MuY29uc3RydWN0aW9uX21ldGhvZCkgewoJCQkJCWNhc2UgMDogLy8gb2Zmc2V0IGludG8gdGhlIGZpbGUgcmVmZXJlbmNlZCBieSB0aGUgZGF0YSByZWZlcmVuY2UgaW5kZXgKCQkJCQlicmVhazsKCQkJCQljYXNlIDE6IC8vIG9mZnNldCBpbnRvIHRoZSBpZGF0IGJveCBvZiB0aGlzIG1ldGEgYm94CgkJCQkJTG9nLndhcm4oIkl0ZW0gc3RvcmFnZSB3aXRoIGNvbnN0cnVjdGlvbl9tZXRob2QgOiBub3Qgc3VwcG9ydGVkIik7CgkJCQkJYnJlYWs7CgkJCQkJY2FzZSAyOiAvLyBvZmZzZXQgaW50byBhbm90aGVyIGl0ZW0KCQkJCQlMb2cud2FybigiSXRlbSBzdG9yYWdlIHdpdGggY29uc3RydWN0aW9uX21ldGhvZCA6IG5vdCBzdXBwb3J0ZWQiKTsKCQkJCQlicmVhazsKCQkJCX0KCQkJCWl0ZW0uZXh0ZW50cyA9IFtdOwoJCQkJaXRlbS5zaXplID0gMDsKCQkJCWZvciAoaiA9IDA7IGogPCBpdGVtbG9jLmV4dGVudHMubGVuZ3RoOyBqKyspIHsKCQkJCQlpdGVtLmV4dGVudHNbal0gPSB7fTsKCQkJCQlpdGVtLmV4dGVudHNbal0ub2Zmc2V0ID0gaXRlbWxvYy5leHRlbnRzW2pdLmV4dGVudF9vZmZzZXQgKyBpdGVtbG9jLmJhc2Vfb2Zmc2V0OwoJCQkJCWl0ZW0uZXh0ZW50c1tqXS5sZW5ndGggPSBpdGVtbG9jLmV4dGVudHNbal0uZXh0ZW50X2xlbmd0aDsKCQkJCQlpdGVtLmV4dGVudHNbal0uYWxyZWFkeVJlYWQgPSAwOwoJCQkJCWl0ZW0uc2l6ZSArPSBpdGVtLmV4dGVudHNbal0ubGVuZ3RoOwoJCQkJfQoJCQl9CgkJfQoJCWlmIChtZXRhLnBpdG0pIHsKCQkJaXRlbXNbbWV0YS5waXRtLml0ZW1faWRdLnByaW1hcnkgPSB0cnVlOwoJCX0KCQlpZiAobWV0YS5pcmVmKSB7CgkJCWZvciAoaT0wOyBpIDxtZXRhLmlyZWYucmVmZXJlbmNlcy5sZW5ndGg7IGkrKykgewoJCQkJdmFyIHJlZiA9IG1ldGEuaXJlZi5yZWZlcmVuY2VzW2ldOwoJCQkJZm9yIChqPTA7IGo8cmVmLnJlZmVyZW5jZXMubGVuZ3RoOyBqKyspIHsKCQkJCQlpdGVtc1tyZWYuZnJvbV9pdGVtX0lEXS5yZWZfdG8ucHVzaCh7dHlwZTogcmVmLnR5cGUsIGlkOiByZWYucmVmZXJlbmNlc1tqXX0pOwoJCQkJfQoJCQl9CgkJfQoJCWlmIChtZXRhLmlwcnApIHsKCQkJZm9yICh2YXIgayA9IDA7IGsgPCBtZXRhLmlwcnAuaXBtYXMubGVuZ3RoOyBrKyspIHsKCQkJCXZhciBpcG1hID0gbWV0YS5pcHJwLmlwbWFzW2tdOwoJCQkJZm9yIChpID0gMDsgaSA8IGlwbWEuYXNzb2NpYXRpb25zLmxlbmd0aDsgaSsrKSB7CgkJCQkJdmFyIGFzc29jaWF0aW9uID0gaXBtYS5hc3NvY2lhdGlvbnNbaV07CgkJCQkJaXRlbSA9IGl0ZW1zW2Fzc29jaWF0aW9uLmlkXTsKCQkJCQlpZiAoaXRlbS5wcm9wZXJ0aWVzID09PSB1bmRlZmluZWQpIHsKCQkJCQkJaXRlbS5wcm9wZXJ0aWVzID0ge307CgkJCQkJCWl0ZW0ucHJvcGVydGllcy5ib3hlcyA9IFtdOwoJCQkJCX0KCQkJCQlmb3IgKGogPSAwOyBqIDwgYXNzb2NpYXRpb24ucHJvcHMubGVuZ3RoOyBqKyspIHsKCQkJCQkJdmFyIHByb3BFbnRyeSA9IGFzc29jaWF0aW9uLnByb3BzW2pdOwoJCQkJCQlpZiAocHJvcEVudHJ5LnByb3BlcnR5X2luZGV4ID4gMCAmJiBwcm9wRW50cnkucHJvcGVydHlfaW5kZXgtMSA8IG1ldGEuaXBycC5pcGNvLmJveGVzLmxlbmd0aCkgewoJCQkJCQkJdmFyIHByb3Bib3ggPSBtZXRhLmlwcnAuaXBjby5ib3hlc1twcm9wRW50cnkucHJvcGVydHlfaW5kZXgtMV07CgkJCQkJCQlpdGVtLnByb3BlcnRpZXNbcHJvcGJveC50eXBlXSA9IHByb3Bib3g7CgkJCQkJCQlpdGVtLnByb3BlcnRpZXMuYm94ZXMucHVzaChwcm9wYm94KTsKCQkJCQkJfQoJCQkJCX0KCQkJCX0KCQkJfQoJCX0KCX07CgoJSVNPRmlsZS5wcm90b3R5cGUuZ2V0SXRlbSA9IGZ1bmN0aW9uKGl0ZW1faWQpIHsJCgkJdmFyIGJ1ZmZlcjsKCQl2YXIgaXRlbTsKCQkKCQlpZiAoIXRoaXMubWV0YSkgewoJCQlyZXR1cm4gbnVsbDsKCQl9CgoJIAlpdGVtID0gdGhpcy5pdGVtc1tpdGVtX2lkXTsKCQlpZiAoIWl0ZW0uZGF0YSAmJiBpdGVtLnNpemUpIHsKCQkJLyogTm90IHlldCBmZXRjaGVkICovCgkJCWl0ZW0uZGF0YSA9IG5ldyBVaW50OEFycmF5KGl0ZW0uc2l6ZSk7CgkJCWl0ZW0uYWxyZWFkeVJlYWQgPSAwOwoJCQl0aGlzLml0ZW1zRGF0YVNpemUgKz0gaXRlbS5zaXplOwoJCQlMb2cuZGVidWcoIklTT0ZpbGUiLCAiQWxsb2NhdGluZyBpdGVtICMiK2l0ZW1faWQrIiBvZiBzaXplICIraXRlbS5zaXplKyIgKHRvdGFsOiAiK3RoaXMuaXRlbXNEYXRhU2l6ZSsiKSIpOwoJCX0gZWxzZSBpZiAoaXRlbS5hbHJlYWR5UmVhZCA9PT0gaXRlbS5zaXplKSB7CgkJCS8qIEFscmVhZHkgZmV0Y2hlZCBlbnRpcmVseSAqLwoJCQlyZXR1cm4gaXRlbTsKCQl9CgoJCS8qIFRoZSBpdGVtIGhhcyBvbmx5IGJlZW4gcGFydGlhbGx5IGZldGNoZWQsIHdlIG5lZWQgdG8gY2hlY2sgaW4gYWxsIGJ1ZmZlcnMgdG8gZmluZCB0aGUgcmVtYWluaW5nIGV4dGVudHMqLwoKCQlmb3IgKHZhciBpID0gMDsgaSA8IGl0ZW0uZXh0ZW50cy5sZW5ndGg7IGkrKykgewoJCQl2YXIgZXh0ZW50ID0gaXRlbS5leHRlbnRzW2ldOwoJCQlpZiAoZXh0ZW50LmFscmVhZHlSZWFkID09PSBleHRlbnQubGVuZ3RoKSB7CgkJCQljb250aW51ZTsKCQkJfSBlbHNlIHsKCQkJCXZhciBpbmRleCA9CXRoaXMuc3RyZWFtLmZpbmRQb3NpdGlvbih0cnVlLCBleHRlbnQub2Zmc2V0ICsgZXh0ZW50LmFscmVhZHlSZWFkLCBmYWxzZSk7CgkJCQlpZiAoaW5kZXggPiAtMSkgewoJCQkJCWJ1ZmZlciA9IHRoaXMuc3RyZWFtLmJ1ZmZlcnNbaW5kZXhdOwoJCQkJCXZhciBsZW5ndGhBZnRlclN0YXJ0ID0gYnVmZmVyLmJ5dGVMZW5ndGggLSAoZXh0ZW50Lm9mZnNldCArIGV4dGVudC5hbHJlYWR5UmVhZCAtIGJ1ZmZlci5maWxlU3RhcnQpOwoJCQkJCWlmIChleHRlbnQubGVuZ3RoIC0gZXh0ZW50LmFscmVhZHlSZWFkIDw9IGxlbmd0aEFmdGVyU3RhcnQpIHsKCQkJCQkJLyogdGhlIChyZXN0IG9mIHRoZSkgZXh0ZW50IGlzIGVudGlyZWx5IGNvbnRhaW5lZCBpbiB0aGlzIGJ1ZmZlciAqLwoKCQkJCQkJTG9nLmRlYnVnKCJJU09GaWxlIiwiR2V0dGluZyBpdGVtICMiK2l0ZW1faWQrIiBleHRlbnQgIyIraSsiIGRhdGEgKGFscmVhZHlSZWFkOiAiK2V4dGVudC5hbHJlYWR5UmVhZCsKCQkJCQkJCSIgb2Zmc2V0OiAiKyhleHRlbnQub2Zmc2V0K2V4dGVudC5hbHJlYWR5UmVhZCAtIGJ1ZmZlci5maWxlU3RhcnQpKyIgcmVhZCBzaXplOiAiKyhleHRlbnQubGVuZ3RoIC0gZXh0ZW50LmFscmVhZHlSZWFkKSsKCQkJCQkJCSIgZnVsbCBleHRlbnQgc2l6ZTogIitleHRlbnQubGVuZ3RoKyIgZnVsbCBpdGVtIHNpemU6ICIraXRlbS5zaXplKyIpIik7CgoJCQkJCQlEYXRhU3RyZWFtLm1lbWNweShpdGVtLmRhdGEuYnVmZmVyLCBpdGVtLmFscmVhZHlSZWFkLCAKCQkJCQkJICAgICAgICAgICAgICAgICAgYnVmZmVyLCBleHRlbnQub2Zmc2V0K2V4dGVudC5hbHJlYWR5UmVhZCAtIGJ1ZmZlci5maWxlU3RhcnQsIGV4dGVudC5sZW5ndGggLSBleHRlbnQuYWxyZWFkeVJlYWQpOwoKCQkJCQkJLyogdXBkYXRlIHRoZSBudW1iZXIgb2YgYnl0ZXMgdXNlZCBpbiB0aGlzIGJ1ZmZlciBhbmQgY2hlY2sgaWYgaXQgbmVlZHMgdG8gYmUgcmVtb3ZlZCAqLwoJCQkJCQlidWZmZXIudXNlZEJ5dGVzICs9IGV4dGVudC5sZW5ndGggLSBleHRlbnQuYWxyZWFkeVJlYWQ7CgkJCQkJCXRoaXMuc3RyZWFtLmxvZ0J1ZmZlckxldmVsKCk7CgoJCQkJCQlpdGVtLmFscmVhZHlSZWFkICs9IChleHRlbnQubGVuZ3RoIC0gZXh0ZW50LmFscmVhZHlSZWFkKTsKCQkJCQkJZXh0ZW50LmFscmVhZHlSZWFkID0gZXh0ZW50Lmxlbmd0aDsKCQkJCQl9IGVsc2UgewoJCQkJCQkvKiB0aGUgc2FtcGxlIGRvZXMgbm90IGVuZCBpbiB0aGlzIGJ1ZmZlciAqLwoKCQkJCQkJTG9nLmRlYnVnKCJJU09GaWxlIiwiR2V0dGluZyBpdGVtICMiK2l0ZW1faWQrIiBleHRlbnQgIyIraSsiIHBhcnRpYWwgZGF0YSAoYWxyZWFkeVJlYWQ6ICIrZXh0ZW50LmFscmVhZHlSZWFkKyIgb2Zmc2V0OiAiKwoJCQkJCQkJKGV4dGVudC5vZmZzZXQrZXh0ZW50LmFscmVhZHlSZWFkIC0gYnVmZmVyLmZpbGVTdGFydCkrIiByZWFkIHNpemU6ICIrbGVuZ3RoQWZ0ZXJTdGFydCsKCQkJCQkJCSIgZnVsbCBleHRlbnQgc2l6ZTogIitleHRlbnQubGVuZ3RoKyIgZnVsbCBpdGVtIHNpemU6ICIraXRlbS5zaXplKyIpIik7CgoJCQkJCQlEYXRhU3RyZWFtLm1lbWNweShpdGVtLmRhdGEuYnVmZmVyLCBpdGVtLmFscmVhZHlSZWFkLCAKCQkJCQkJICAgICAgICAgICAgICAgICAgYnVmZmVyLCBleHRlbnQub2Zmc2V0K2V4dGVudC5hbHJlYWR5UmVhZCAtIGJ1ZmZlci5maWxlU3RhcnQsIGxlbmd0aEFmdGVyU3RhcnQpOwoJCQkJCQlleHRlbnQuYWxyZWFkeVJlYWQgKz0gbGVuZ3RoQWZ0ZXJTdGFydDsKCQkJCQkJaXRlbS5hbHJlYWR5UmVhZCArPSBsZW5ndGhBZnRlclN0YXJ0OwoKCQkJCQkJLyogdXBkYXRlIHRoZSBudW1iZXIgb2YgYnl0ZXMgdXNlZCBpbiB0aGlzIGJ1ZmZlciBhbmQgY2hlY2sgaWYgaXQgbmVlZHMgdG8gYmUgcmVtb3ZlZCAqLwoJCQkJCQlidWZmZXIudXNlZEJ5dGVzICs9IGxlbmd0aEFmdGVyU3RhcnQ7CgkJCQkJCXRoaXMuc3RyZWFtLmxvZ0J1ZmZlckxldmVsKCk7CgkJCQkJCXJldHVybiBudWxsOwoJCQkJCX0KCQkJCX0gZWxzZSB7CgkJCQkJcmV0dXJuIG51bGw7CgkJCQl9CgkJCX0KCQl9CgkJaWYgKGl0ZW0uYWxyZWFkeVJlYWQgPT09IGl0ZW0uc2l6ZSkgewoJCQkvKiBmZXRjaGVkIGVudGlyZWx5ICovCgkJCXJldHVybiBpdGVtOwoJCX0gZWxzZSB7CgkJCXJldHVybiBudWxsOwoJCX0KCX07CgoJLyogUmVsZWFzZSB0aGUgbWVtb3J5IHVzZWQgdG8gc3RvcmUgdGhlIGRhdGEgb2YgdGhlIGl0ZW0gKi8KCUlTT0ZpbGUucHJvdG90eXBlLnJlbGVhc2VJdGVtID0gZnVuY3Rpb24oaXRlbV9pZCkgewkKCQl2YXIgaXRlbSA9IHRoaXMuaXRlbXNbaXRlbV9pZF07CgkJaWYgKGl0ZW0uZGF0YSkgewoJCQl0aGlzLml0ZW1zRGF0YVNpemUgLT0gaXRlbS5zaXplOwoJCQlpdGVtLmRhdGEgPSBudWxsOwoJCQlpdGVtLmFscmVhZHlSZWFkID0gMDsKCQkJZm9yICh2YXIgaSA9IDA7IGkgPCBpdGVtLmV4dGVudHMubGVuZ3RoOyBpKyspIHsKCQkJCXZhciBleHRlbnQgPSBpdGVtLmV4dGVudHNbaV07CgkJCQlleHRlbnQuYWxyZWFkeVJlYWQgPSAwOwoJCQl9CgkJCXJldHVybiBpdGVtLnNpemU7CgkJfSBlbHNlIHsKCQkJcmV0dXJuIDA7CgkJfQoJfTsKCgoJSVNPRmlsZS5wcm90b3R5cGUucHJvY2Vzc0l0ZW1zID0gZnVuY3Rpb24oY2FsbGJhY2spIHsKCQlmb3IodmFyIGkgaW4gdGhpcy5pdGVtcykgewoJCQl2YXIgaXRlbSA9IHRoaXMuaXRlbXNbaV07CgkJCXRoaXMuZ2V0SXRlbShpdGVtLmlkKTsKCQkJaWYgKGNhbGxiYWNrICYmICFpdGVtLnNlbnQpIHsKCQkJCWNhbGxiYWNrKGl0ZW0pOwoJCQkJaXRlbS5zZW50ID0gdHJ1ZTsKCQkJCWl0ZW0uZGF0YSA9IG51bGw7CgkJCX0KCQl9Cgl9OwoKCUlTT0ZpbGUucHJvdG90eXBlLmhhc0l0ZW0gPSBmdW5jdGlvbihuYW1lKSB7CgkJZm9yKHZhciBpIGluIHRoaXMuaXRlbXMpIHsKCQkJdmFyIGl0ZW0gPSB0aGlzLml0ZW1zW2ldOwoJCQlpZiAoaXRlbS5uYW1lID09PSBuYW1lKSB7CgkJCQlyZXR1cm4gaXRlbS5pZDsKCQkJfQoJCX0KCQlyZXR1cm4gLTE7Cgl9OwoKCUlTT0ZpbGUucHJvdG90eXBlLmdldE1ldGFIYW5kbGVyID0gZnVuY3Rpb24oKSB7CgkJaWYgKCF0aGlzLm1ldGEpIHsKCQkJcmV0dXJuIG51bGw7CgkJfSBlbHNlIHsKCQkJcmV0dXJuIHRoaXMubWV0YS5oZGxyLmhhbmRsZXI7CQkKCQl9Cgl9OwoKCUlTT0ZpbGUucHJvdG90eXBlLmdldFByaW1hcnlJdGVtID0gZnVuY3Rpb24oKSB7CgkJaWYgKCF0aGlzLm1ldGEgfHwgIXRoaXMubWV0YS5waXRtKSB7CgkJCXJldHVybiBudWxsOwoJCX0gZWxzZSB7CgkJCXJldHVybiB0aGlzLmdldEl0ZW0odGhpcy5tZXRhLnBpdG0uaXRlbV9pZCk7CgkJfQoJfTsKCglJU09GaWxlLnByb3RvdHlwZS5pdGVtVG9GcmFnbWVudGVkVHJhY2tGaWxlID0gZnVuY3Rpb24oX29wdGlvbnMpIHsKCQl2YXIgb3B0aW9ucyA9IF9vcHRpb25zIHx8IHt9OwoJCXZhciBpdGVtID0gbnVsbDsKCQlpZiAob3B0aW9ucy5pdGVtSWQpIHsKCQkJaXRlbSA9IHRoaXMuZ2V0SXRlbShvcHRpb25zLml0ZW1JZCk7CgkJfSBlbHNlIHsKCQkJaXRlbSA9IHRoaXMuZ2V0UHJpbWFyeUl0ZW0oKTsKCQl9CgkJaWYgKGl0ZW0gPT0gbnVsbCkgcmV0dXJuIG51bGw7CgoJCXZhciBmaWxlID0gbmV3IElTT0ZpbGUoKTsKCQlmaWxlLmRpc2NhcmRNZGF0RGF0YSA9IGZhbHNlOwoJCS8vIGFzc3VtaW5nIHRoZSB0cmFjayB0eXBlIGlzIHRoZSBzYW1lIGFzIHRoZSBpdGVtIHR5cGUKCQl2YXIgdHJhY2tPcHRpb25zID0geyB0eXBlOiBpdGVtLnR5cGUsIGRlc2NyaXB0aW9uX2JveGVzOiBpdGVtLnByb3BlcnRpZXMuYm94ZXN9OwoJCWlmIChpdGVtLnByb3BlcnRpZXMuaXNwZSkgewoJCQl0cmFja09wdGlvbnMud2lkdGggPSBpdGVtLnByb3BlcnRpZXMuaXNwZS5pbWFnZV93aWR0aDsKCQkJdHJhY2tPcHRpb25zLmhlaWdodCA9IGl0ZW0ucHJvcGVydGllcy5pc3BlLmltYWdlX2hlaWdodDsKCQl9CgkJdmFyIHRyYWNrSWQgPSBmaWxlLmFkZFRyYWNrKHRyYWNrT3B0aW9ucyk7CgkJaWYgKHRyYWNrSWQpIHsKCQkJZmlsZS5hZGRTYW1wbGUodHJhY2tJZCwgaXRlbS5kYXRhKTsKCQkJcmV0dXJuIGZpbGU7CgkJfSBlbHNlIHsKCQkJcmV0dXJuIG51bGw7CgkJfQoJfTsKCgkvLyBmaWxlOnNyYy9pc29maWxlLXdyaXRlLmpzCgkvKiBSZXdyaXRlIHRoZSBlbnRpcmUgZmlsZSAqLwoJSVNPRmlsZS5wcm90b3R5cGUud3JpdGUgPSBmdW5jdGlvbihvdXRzdHJlYW0pIHsKCQlmb3IgKHZhciBpPTA7IGk8dGhpcy5ib3hlcy5sZW5ndGg7IGkrKykgewoJCQl0aGlzLmJveGVzW2ldLndyaXRlKG91dHN0cmVhbSk7CgkJfQoJfTsKCglJU09GaWxlLnByb3RvdHlwZS5jcmVhdGVGcmFnbWVudCA9IGZ1bmN0aW9uKHRyYWNrX2lkLCBzYW1wbGVOdW1iZXIsIHN0cmVhbV8pIHsKCQl2YXIgdHJhayA9IHRoaXMuZ2V0VHJhY2tCeUlkKHRyYWNrX2lkKTsKCQl2YXIgc2FtcGxlID0gdGhpcy5nZXRTYW1wbGUodHJhaywgc2FtcGxlTnVtYmVyKTsKCQlpZiAoc2FtcGxlID09IG51bGwpIHsKCQkJc2FtcGxlID0gdHJhay5zYW1wbGVzW3NhbXBsZU51bWJlcl07CgkJCWlmICh0aGlzLm5leHRTZWVrUG9zaXRpb24pIHsKCQkJCXRoaXMubmV4dFNlZWtQb3NpdGlvbiA9IE1hdGgubWluKHNhbXBsZS5vZmZzZXQrc2FtcGxlLmFscmVhZHlSZWFkLHRoaXMubmV4dFNlZWtQb3NpdGlvbik7CgkJCX0gZWxzZSB7CgkJCQl0aGlzLm5leHRTZWVrUG9zaXRpb24gPSB0cmFrLnNhbXBsZXNbc2FtcGxlTnVtYmVyXS5vZmZzZXQrc2FtcGxlLmFscmVhZHlSZWFkOwoJCQl9CgkJCXJldHVybiBudWxsOwoJCX0KCQkKCQl2YXIgc3RyZWFtID0gc3RyZWFtXyB8fCBuZXcgRGF0YVN0cmVhbSgpOwoJCXN0cmVhbS5lbmRpYW5uZXNzID0gRGF0YVN0cmVhbS5CSUdfRU5ESUFOOwoKCQl2YXIgbW9vZiA9IHRoaXMuY3JlYXRlU2luZ2xlU2FtcGxlTW9vZihzYW1wbGUpOwoJCW1vb2Yud3JpdGUoc3RyZWFtKTsKCgkJLyogYWRqdXN0aW5nIHRoZSBkYXRhX29mZnNldCBub3cgdGhhdCB0aGUgbW9vZiBzaXplIGlzIGtub3duKi8KCQltb29mLnRyYWZzWzBdLnRydW5zWzBdLmRhdGFfb2Zmc2V0ID0gbW9vZi5zaXplKzg7IC8vOCBpcyBtZGF0IGhlYWRlcgoJCUxvZy5kZWJ1ZygiTVA0Qm94IiwgIkFkanVzdGluZyBkYXRhX29mZnNldCB3aXRoIG5ldyB2YWx1ZSAiK21vb2YudHJhZnNbMF0udHJ1bnNbMF0uZGF0YV9vZmZzZXQpOwoJCXN0cmVhbS5hZGp1c3RVaW50MzIobW9vZi50cmFmc1swXS50cnVuc1swXS5kYXRhX29mZnNldF9wb3NpdGlvbiwgbW9vZi50cmFmc1swXS50cnVuc1swXS5kYXRhX29mZnNldCk7CgkJCQoJCXZhciBtZGF0ID0gbmV3IEJveFBhcnNlci5tZGF0Qm94KCk7CgkJbWRhdC5kYXRhID0gc2FtcGxlLmRhdGE7CgkJbWRhdC53cml0ZShzdHJlYW0pOwoJCXJldHVybiBzdHJlYW07Cgl9OwoKCS8qIE1vZGlmeSB0aGUgZmlsZSBhbmQgY3JlYXRlIHRoZSBpbml0aWFsaXphdGlvbiBzZWdtZW50ICovCglJU09GaWxlLndyaXRlSW5pdGlhbGl6YXRpb25TZWdtZW50ID0gZnVuY3Rpb24oZnR5cCwgbW9vdiwgdG90YWxfZHVyYXRpb24sIHNhbXBsZV9kdXJhdGlvbikgewoJCXZhciBpOwoJCUxvZy5kZWJ1ZygiSVNPRmlsZSIsICJHZW5lcmF0aW5nIGluaXRpYWxpemF0aW9uIHNlZ21lbnQiKTsKCgkJdmFyIHN0cmVhbSA9IG5ldyBEYXRhU3RyZWFtKCk7CgkJc3RyZWFtLmVuZGlhbm5lc3MgPSBEYXRhU3RyZWFtLkJJR19FTkRJQU47CgkJZnR5cC53cml0ZShzdHJlYW0pOwoJCQoJCS8qIHdlIGNhbiBub3cgY3JlYXRlIHRoZSBuZXcgbXZleCBib3ggKi8KCQl2YXIgbXZleCA9IG1vb3YuYWRkKCJtdmV4Iik7CgkJaWYgKHRvdGFsX2R1cmF0aW9uKSB7CgkJCW12ZXguYWRkKCJtZWhkIikuc2V0KCJmcmFnbWVudF9kdXJhdGlvbiIsIHRvdGFsX2R1cmF0aW9uKTsKCQl9CgkJZm9yIChpID0gMDsgaSA8IG1vb3YudHJha3MubGVuZ3RoOyBpKyspIHsKCQkJbXZleC5hZGQoInRyZXgiKS5zZXQoInRyYWNrX2lkIiwgbW9vdi50cmFrc1tpXS50a2hkLnRyYWNrX2lkKQoJCQkJCQkJLnNldCgiZGVmYXVsdF9zYW1wbGVfZGVzY3JpcHRpb25faW5kZXgiLCAxKQoJCQkJCQkJLnNldCgiZGVmYXVsdF9zYW1wbGVfZHVyYXRpb24iLCBzYW1wbGVfZHVyYXRpb24pCgkJCQkJCQkuc2V0KCJkZWZhdWx0X3NhbXBsZV9zaXplIiwgMCkKCQkJCQkJCS5zZXQoImRlZmF1bHRfc2FtcGxlX2ZsYWdzIiwgMTw8MTYpOwoJCX0KCQltb292LndyaXRlKHN0cmVhbSk7CgoJCXJldHVybiBzdHJlYW0uYnVmZmVyOwoKCX07CgoJSVNPRmlsZS5wcm90b3R5cGUuc2F2ZSA9IGZ1bmN0aW9uKG5hbWUpIHsKCQl2YXIgc3RyZWFtID0gbmV3IERhdGFTdHJlYW0oKTsKCQlzdHJlYW0uZW5kaWFubmVzcyA9IERhdGFTdHJlYW0uQklHX0VORElBTjsKCQl0aGlzLndyaXRlKHN0cmVhbSk7CgkJc3RyZWFtLnNhdmUobmFtZSk7CQoJfTsKCglJU09GaWxlLnByb3RvdHlwZS5nZXRCdWZmZXIgPSBmdW5jdGlvbigpIHsKCQl2YXIgc3RyZWFtID0gbmV3IERhdGFTdHJlYW0oKTsKCQlzdHJlYW0uZW5kaWFubmVzcyA9IERhdGFTdHJlYW0uQklHX0VORElBTjsKCQl0aGlzLndyaXRlKHN0cmVhbSk7CgkJcmV0dXJuIHN0cmVhbS5idWZmZXI7Cgl9OwoKCUlTT0ZpbGUucHJvdG90eXBlLmluaXRpYWxpemVTZWdtZW50YXRpb24gPSBmdW5jdGlvbigpIHsKCQl2YXIgaTsKCQl2YXIgaW5pdFNlZ3M7CgkJdmFyIHRyYWs7CgkJdmFyIHNlZzsKCQlpZiAodGhpcy5vblNlZ21lbnQgPT09IG51bGwpIHsKCQkJTG9nLndhcm4oIk1QNEJveCIsICJObyBzZWdtZW50YXRpb24gY2FsbGJhY2sgc2V0ISIpOwoJCX0KCQlpZiAoIXRoaXMuaXNGcmFnbWVudGF0aW9uSW5pdGlhbGl6ZWQpIHsKCQkJdGhpcy5pc0ZyYWdtZW50YXRpb25Jbml0aWFsaXplZCA9IHRydWU7CQkKCQkJdGhpcy5uZXh0TW9vZk51bWJlciA9IDA7CgkJCXRoaXMucmVzZXRUYWJsZXMoKTsKCQl9CQoJCWluaXRTZWdzID0gW107CQoJCWZvciAoaSA9IDA7IGkgPCB0aGlzLmZyYWdtZW50ZWRUcmFja3MubGVuZ3RoOyBpKyspIHsKCQkJdmFyIG1vb3YgPSBuZXcgQm94UGFyc2VyLm1vb3ZCb3goKTsKCQkJbW9vdi5tdmhkID0gdGhpcy5tb292Lm12aGQ7CgkJICAgIG1vb3YuYm94ZXMucHVzaChtb292Lm12aGQpOwoJCQl0cmFrID0gdGhpcy5nZXRUcmFja0J5SWQodGhpcy5mcmFnbWVudGVkVHJhY2tzW2ldLmlkKTsKCQkJbW9vdi5ib3hlcy5wdXNoKHRyYWspOwoJCQltb292LnRyYWtzLnB1c2godHJhayk7CgkJCXNlZyA9IHt9OwoJCQlzZWcuaWQgPSB0cmFrLnRraGQudHJhY2tfaWQ7CgkJCXNlZy51c2VyID0gdGhpcy5mcmFnbWVudGVkVHJhY2tzW2ldLnVzZXI7CgkJCXNlZy5idWZmZXIgPSBJU09GaWxlLndyaXRlSW5pdGlhbGl6YXRpb25TZWdtZW50KHRoaXMuZnR5cCwgbW9vdiwgKHRoaXMubW9vdi5tdmV4ICYmIHRoaXMubW9vdi5tdmV4Lm1laGQgPyB0aGlzLm1vb3YubXZleC5tZWhkLmZyYWdtZW50X2R1cmF0aW9uOiB1bmRlZmluZWQpLCAodGhpcy5tb292LnRyYWtzW2ldLnNhbXBsZXMubGVuZ3RoPjAgPyB0aGlzLm1vb3YudHJha3NbaV0uc2FtcGxlc1swXS5kdXJhdGlvbjogMCkpOwoJCQlpbml0U2Vncy5wdXNoKHNlZyk7CgkJfQoJCXJldHVybiBpbml0U2VnczsKCX07CgoJLy8gZmlsZTpzcmMvYm94LXByaW50LmpzCgkvKiAKCSAqIENvcHlyaWdodCAoYykgVGVsZWNvbSBQYXJpc1RlY2gvVFNJL01NL0dQQUMgQ3lyaWwgQ29uY29sYXRvCgkgKiBMaWNlbnNlOiBCU0QtMy1DbGF1c2UgKHNlZSBMSUNFTlNFIGZpbGUpCgkgKi8KCUJveFBhcnNlci5Cb3gucHJvdG90eXBlLnByaW50SGVhZGVyID0gZnVuY3Rpb24ob3V0cHV0KSB7CgkJdGhpcy5zaXplICs9IDg7CgkJaWYgKHRoaXMuc2l6ZSA+IE1BWF9TSVpFKSB7CgkJCXRoaXMuc2l6ZSArPSA4OwoJCX0KCQlpZiAodGhpcy50eXBlID09PSAidXVpZCIpIHsKCQkJdGhpcy5zaXplICs9IDE2OwoJCX0KCQlvdXRwdXQubG9nKG91dHB1dC5pbmRlbnQrInNpemU6Iit0aGlzLnNpemUpOwoJCW91dHB1dC5sb2cob3V0cHV0LmluZGVudCsidHlwZToiK3RoaXMudHlwZSk7Cgl9OwoKCUJveFBhcnNlci5GdWxsQm94LnByb3RvdHlwZS5wcmludEhlYWRlciA9IGZ1bmN0aW9uKG91dHB1dCkgewoJCXRoaXMuc2l6ZSArPSA0OwoJCUJveFBhcnNlci5Cb3gucHJvdG90eXBlLnByaW50SGVhZGVyLmNhbGwodGhpcywgb3V0cHV0KTsKCQlvdXRwdXQubG9nKG91dHB1dC5pbmRlbnQrInZlcnNpb246Iit0aGlzLnZlcnNpb24pOwoJCW91dHB1dC5sb2cob3V0cHV0LmluZGVudCsiZmxhZ3M6Iit0aGlzLmZsYWdzKTsKCX07CgoJQm94UGFyc2VyLkJveC5wcm90b3R5cGUucHJpbnQgPSBmdW5jdGlvbihvdXRwdXQpIHsKCQl0aGlzLnByaW50SGVhZGVyKG91dHB1dCk7Cgl9OwoKCUJveFBhcnNlci5Db250YWluZXJCb3gucHJvdG90eXBlLnByaW50ID0gZnVuY3Rpb24ob3V0cHV0KSB7CgkJdGhpcy5wcmludEhlYWRlcihvdXRwdXQpOwoJCWZvciAodmFyIGk9MDsgaTx0aGlzLmJveGVzLmxlbmd0aDsgaSsrKSB7CgkJCWlmICh0aGlzLmJveGVzW2ldKSB7CgkJCQl2YXIgcHJldl9pbmRlbnQgPSBvdXRwdXQuaW5kZW50OwoJCQkJb3V0cHV0LmluZGVudCArPSAiICI7CgkJCQl0aGlzLmJveGVzW2ldLnByaW50KG91dHB1dCk7CgkJCQlvdXRwdXQuaW5kZW50ID0gcHJldl9pbmRlbnQ7CgkJCX0KCQl9Cgl9OwoKCUlTT0ZpbGUucHJvdG90eXBlLnByaW50ID0gZnVuY3Rpb24ob3V0cHV0KSB7CgkJb3V0cHV0LmluZGVudCA9ICIiOwoJCWZvciAodmFyIGk9MDsgaTx0aGlzLmJveGVzLmxlbmd0aDsgaSsrKSB7CgkJCWlmICh0aGlzLmJveGVzW2ldKSB7CgkJCQl0aGlzLmJveGVzW2ldLnByaW50KG91dHB1dCk7CgkJCX0KCQl9CQoJfTsKCglCb3hQYXJzZXIubXZoZEJveC5wcm90b3R5cGUucHJpbnQgPSBmdW5jdGlvbihvdXRwdXQpIHsKCQlCb3hQYXJzZXIuRnVsbEJveC5wcm90b3R5cGUucHJpbnRIZWFkZXIuY2FsbCh0aGlzLCBvdXRwdXQpOwoJCW91dHB1dC5sb2cob3V0cHV0LmluZGVudCsiY3JlYXRpb25fdGltZTogIit0aGlzLmNyZWF0aW9uX3RpbWUpOwoJCW91dHB1dC5sb2cob3V0cHV0LmluZGVudCsibW9kaWZpY2F0aW9uX3RpbWU6ICIrdGhpcy5tb2RpZmljYXRpb25fdGltZSk7CgkJb3V0cHV0LmxvZyhvdXRwdXQuaW5kZW50KyJ0aW1lc2NhbGU6ICIrdGhpcy50aW1lc2NhbGUpOwoJCW91dHB1dC5sb2cob3V0cHV0LmluZGVudCsiZHVyYXRpb246ICIrdGhpcy5kdXJhdGlvbik7CgkJb3V0cHV0LmxvZyhvdXRwdXQuaW5kZW50KyJyYXRlOiAiK3RoaXMucmF0ZSk7CgkJb3V0cHV0LmxvZyhvdXRwdXQuaW5kZW50KyJ2b2x1bWU6ICIrKHRoaXMudm9sdW1lPj44KSk7CgkJb3V0cHV0LmxvZyhvdXRwdXQuaW5kZW50KyJtYXRyaXg6ICIrdGhpcy5tYXRyaXguam9pbigiLCAiKSk7CgkJb3V0cHV0LmxvZyhvdXRwdXQuaW5kZW50KyJuZXh0X3RyYWNrX2lkOiAiK3RoaXMubmV4dF90cmFja19pZCk7Cgl9OwoKCUJveFBhcnNlci50a2hkQm94LnByb3RvdHlwZS5wcmludCA9IGZ1bmN0aW9uKG91dHB1dCkgewoJCUJveFBhcnNlci5GdWxsQm94LnByb3RvdHlwZS5wcmludEhlYWRlci5jYWxsKHRoaXMsIG91dHB1dCk7CgkJb3V0cHV0LmxvZyhvdXRwdXQuaW5kZW50KyJjcmVhdGlvbl90aW1lOiAiK3RoaXMuY3JlYXRpb25fdGltZSk7CgkJb3V0cHV0LmxvZyhvdXRwdXQuaW5kZW50KyJtb2RpZmljYXRpb25fdGltZTogIit0aGlzLm1vZGlmaWNhdGlvbl90aW1lKTsKCQlvdXRwdXQubG9nKG91dHB1dC5pbmRlbnQrInRyYWNrX2lkOiAiK3RoaXMudHJhY2tfaWQpOwoJCW91dHB1dC5sb2cob3V0cHV0LmluZGVudCsiZHVyYXRpb246ICIrdGhpcy5kdXJhdGlvbik7CgkJb3V0cHV0LmxvZyhvdXRwdXQuaW5kZW50KyJ2b2x1bWU6ICIrKHRoaXMudm9sdW1lPj44KSk7CgkJb3V0cHV0LmxvZyhvdXRwdXQuaW5kZW50KyJtYXRyaXg6ICIrdGhpcy5tYXRyaXguam9pbigiLCAiKSk7CgkJb3V0cHV0LmxvZyhvdXRwdXQuaW5kZW50KyJsYXllcjogIit0aGlzLmxheWVyKTsKCQlvdXRwdXQubG9nKG91dHB1dC5pbmRlbnQrImFsdGVybmF0ZV9ncm91cDogIit0aGlzLmFsdGVybmF0ZV9ncm91cCk7CgkJb3V0cHV0LmxvZyhvdXRwdXQuaW5kZW50KyJ3aWR0aDogIit0aGlzLndpZHRoKTsKCQlvdXRwdXQubG9nKG91dHB1dC5pbmRlbnQrImhlaWdodDogIit0aGlzLmhlaWdodCk7Cgl9Oy8vIGZpbGU6c3JjL21wNGJveC5qcwoJLyoKCSAqIENvcHlyaWdodCAoYykgMjAxMi0yMDEzLiBUZWxlY29tIFBhcmlzVGVjaC9UU0kvTU0vR1BBQyBDeXJpbCBDb25jb2xhdG8KCSAqIExpY2Vuc2U6IEJTRC0zLUNsYXVzZSAoc2VlIExJQ0VOU0UgZmlsZSkKCSAqLwoJdmFyIE1QNEJveCA9IHt9OwoKCU1QNEJveC5jcmVhdGVGaWxlID0gZnVuY3Rpb24gKF9rZWVwTWRhdERhdGEsIF9zdHJlYW0pIHsKCQkvKiBCb29sZWFuIGluZGljYXRpbmcgaWYgYnl0ZXMgY29udGFpbmluZyBtZWRpYSBkYXRhIHNob3VsZCBiZSBrZXB0IGluIG1lbW9yeSAqLwoJCXZhciBrZWVwTWRhdERhdGEgPSAoX2tlZXBNZGF0RGF0YSAhPT0gdW5kZWZpbmVkID8gX2tlZXBNZGF0RGF0YSA6IHRydWUpOwoJCXZhciBmaWxlID0gbmV3IElTT0ZpbGUoX3N0cmVhbSk7CgkJZmlsZS5kaXNjYXJkTWRhdERhdGEgPSAoa2VlcE1kYXREYXRhID8gZmFsc2UgOiB0cnVlKTsKCQlyZXR1cm4gZmlsZTsKCX07CgoJewoJCWV4cG9ydHMkMS5jcmVhdGVGaWxlID0gTVA0Qm94LmNyZWF0ZUZpbGU7Cgl9Cgl9KTsKCglzZWxmLkx4ID0gZmFsc2U7DQoNCgl2YXIgd3MgPSBudWxsOw0KCXZhciBmbGFnID0gMTsNCg0KCWZ1bmN0aW9uIFdzT3BlbihldmVudCkgew0KCSAgY29uc29sZS5sb2coIui/nuaOpeaJk+W8gCIpOw0KCX0NCglmdW5jdGlvbiBXc0Nsb3NlKGV2ZW50KSB7DQoJICBjb25zb2xlLmxvZygi6L+e5o6l5YWz6ZetIik7DQoJfQ0KCWZ1bmN0aW9uIFdzRXJyb3IoZXZlbnQpIHsNCgkgIGNvbnNvbGUubG9nKCJ3cyDlj5HnlJ/plJnor686IiArIGV2ZW50KTsNCgl9DQoJY2xhc3MgTVA0RmlsZVNpbmsgew0KCSAgI2ZpbGUgPSBudWxsOw0KCSAgI29mZnNldCA9IDA7DQoJICBjb25zdHJ1Y3RvcihmaWxlKSB7DQoJICAgIHRoaXMuI2ZpbGUgPSBmaWxlOw0KCSAgfQ0KCSAgd3JpdGUoY2h1bmspIHsNCgkgICAgY2h1bmsuZmlsZVN0YXJ0ID0gdGhpcy4jb2Zmc2V0Ow0KCSAgICB0aGlzLiNvZmZzZXQgKz0gY2h1bmsuYnl0ZUxlbmd0aDsNCgkgICAgdGhpcy4jZmlsZS5hcHBlbmRCdWZmZXIoY2h1bmspOw0KCSAgfQ0KCSAgY2xvc2UoKSB7DQoJICAgIHRoaXMuI2ZpbGUuZmx1c2goKTsNCgkgIH0NCgl9DQoNCgl2YXIgZmlsZSA9IG51bGw7DQoJdmFyIHNob3dEYXRhID0gbnVsbDsNCg0KCXZhciBTYXZlU3RlcCA9IDA7DQoJdmFyIFNhdmVCdWZmZXIgPSBbXTsNCglsZXQgTXA0SGVhcmRCdWZmZXIgPSBbXTsNCg0KCXZhciBrU2F2ZUJ1ZmZlclNpemUgPSAwOw0KCWxldCBNcDRIZWFyZEJ1ZmZlclNpemUgPSAwOw0KDQoJZnVuY3Rpb24gV3NNZXNzYWdlKGV2ZW50KSB7DQoJICBpZiAodHlwZW9mIGV2ZW50LmRhdGEgPT09ICJzdHJpbmciKSB7DQoJICAgIHZhciBEYXRhVHlwZSA9ICJPcHQiOw0KCSAgICBzZWxmLnBvc3RNZXNzYWdlKHsgRGF0YVR5cGUsIGRhdGE6IGV2ZW50LmRhdGEgfSk7DQoJICAgIHJldHVybjsNCgkgIH0NCgkgIGNvbnN0IGR2ID0gbmV3IERhdGFWaWV3KGV2ZW50LmRhdGEpOw0KCSAgY29uc3QgaW50MzJWYWx1ZSA9IGR2LmdldEludDMyKDAsIHRydWUpOw0KCSAgY29uc3QgdHlwZSA9IE51bWJlcihpbnQzMlZhbHVlKTsNCgkgIGxldCBqc29uT2JqZWN0LCB2aWRvZURhdGEsIGpzb25EYXRhOw0KCSAgc3dpdGNoICh0eXBlKSB7DQoJICAgIGNhc2UgMToNCgkgICAgICBmaWxlID0gbXA0Ym94X2FsbC5jcmVhdGVGaWxlKCk7DQoJICAgICAgZmlsZS5vblJlYWR5ID0gb25SZWFkeTsNCgkgICAgICBmaWxlLm9uU2FtcGxlcyA9IG9uU2FtcGxlczsNCgkgICAgICB0aGlzLmZpbGVTaW5rID0gbmV3IE1QNEZpbGVTaW5rKGZpbGUpOw0KCSAgICAgIHZpZG9lRGF0YSA9IGR2LmJ1ZmZlci5zbGljZSg0KTsNCgkgICAgICBpZiAoU2F2ZVN0ZXAgPT09IDApIHsNCgkgICAgICAgIE1wNEhlYXJkQnVmZmVyLnB1c2goZXZlbnQuZGF0YS5zbGljZSg0KSk7DQoJICAgICAgICBNcDRIZWFyZEJ1ZmZlclNpemUgKz0gZXZlbnQuZGF0YS5ieXRlTGVuZ3RoIC0gNDsNCgkgICAgICAgIFNhdmVTdGVwID0gMTsNCgkgICAgICB9DQoJICAgICAgdGhpcy5maWxlU2luay53cml0ZSh2aWRvZURhdGEpOw0KCSAgICAgIGJyZWFrOw0KCSAgICBjYXNlIDI6DQoJICAgICAgdmlkb2VEYXRhID0gZHYuYnVmZmVyLnNsaWNlKDQpOw0KCSAgICAgIGlmIChTYXZlU3RlcCA9PT0gMSkgew0KCSAgICAgICAgTXA0SGVhcmRCdWZmZXIucHVzaChldmVudC5kYXRhLnNsaWNlKDQpKTsNCgkgICAgICAgIE1wNEhlYXJkQnVmZmVyU2l6ZSArPSBldmVudC5kYXRhLmJ5dGVMZW5ndGggLSA0Ow0KCSAgICAgICAgU2F2ZVN0ZXAgPSAyOw0KCSAgICAgIH0NCgkgICAgICB0aGlzLmZpbGVTaW5rLndyaXRlKHZpZG9lRGF0YSk7DQoJICAgICAgYnJlYWs7DQoJICAgIGNhc2UgMzoNCgkgICAgICB2aWRvZURhdGEgPSBkdi5idWZmZXIuc2xpY2UoNCk7DQoJICAgICAgaWYgKEx4KSB7DQoJICAgICAgICBTYXZlQnVmZmVyLnB1c2goZXZlbnQuZGF0YS5zbGljZSg0KSk7DQoJICAgICAgICBrU2F2ZUJ1ZmZlclNpemUgKz0gZXZlbnQuZGF0YS5ieXRlTGVuZ3RoIC0gNDsNCgkgICAgICB9DQoJICAgICAgdGhpcy5maWxlU2luay53cml0ZSh2aWRvZURhdGEpOw0KCSAgICAgIGJyZWFrOw0KCSAgICBjYXNlIDQ6DQoJICAgICAgdmlkb2VEYXRhID0gZHYuYnVmZmVyLnNsaWNlKDQpOw0KCSAgICAgIGlmIChMeCkgew0KCSAgICAgICAgU2F2ZUJ1ZmZlci5wdXNoKGV2ZW50LmRhdGEuc2xpY2UoNCkpOw0KCSAgICAgICAga1NhdmVCdWZmZXJTaXplICs9IGV2ZW50LmRhdGEuYnl0ZUxlbmd0aCAtIDQ7DQoJICAgICAgfQ0KCSAgICAgIHRoaXMuZmlsZVNpbmsud3JpdGUodmlkb2VEYXRhKTsNCgkgICAgICBicmVhazsNCgkgICAgY2FzZSA1Og0KCSAgICAgIGpzb25EYXRhID0gbmV3IFRleHREZWNvZGVyKCkuZGVjb2RlKGR2LmJ1ZmZlci5zbGljZSg0KSk7DQoJICAgICAgLyoNCgkgICAgICAgICAgICB7DQoJICAgICAgICAgICAgICAgICJQZXJzb24iOiBbDQoJICAgICAgICAgICAgICAgICAgICBbDQoJICAgICAgICAgICAgICAgICAgICAgICAgMSwNCgkgICAgICAgICAgICAgICAgICAgICAgICAxMTgsDQoJICAgICAgICAgICAgICAgICAgICAgICAgNjE0LA0KCSAgICAgICAgICAgICAgICAgICAgICAgIDM4MTksDQoJICAgICAgICAgICAgICAgICAgICAgICAgODQNCgkgICAgICAgICAgICAgICAgICAgIF0NCgkgICAgICAgICAgICAgICAgXSwNCgkgICAgICAgICAgICAgICAgIlQiOiAxNzUwMDQzNDI1NzAwDQoJICAgICAgICAgICAgfQ0KCSAgICAgICAgICAgICovDQoJICAgICAgaWYgKGpzb25EYXRhKSB7DQoJICAgICAgICBqc29uT2JqZWN0ID0gSlNPTi5wYXJzZShqc29uRGF0YSk7DQoJICAgICAgICBpZiAoanNvbk9iamVjdC5QZXJzb24pIHsNCgkgICAgICAgICAgc2hvd0RhdGEgPSBqc29uT2JqZWN0LlBlcnNvbjsNCgkgICAgICAgIH0gZWxzZSB7DQoJICAgICAgICAgIHNob3dEYXRhID0gW107DQoJICAgICAgICB9DQoJICAgICAgfSBlbHNlIHsNCgkgICAgICAgIHNob3dEYXRhID0gW107DQoJICAgICAgfQ0KCSAgICAgIGJyZWFrOw0KCSAgfQ0KCX0NCg0KCWZ1bmN0aW9uIG9uUmVhZHkoaW5mbykgew0KCSAgY29uc29sZS5sb2coIm9uUmVhZHkiKTsNCgkgIGNvbnN0IHRyYWNrID0gaW5mby52aWRlb1RyYWNrc1swXTsNCgkgIGlmIChmbGFnICE9PSAyKSB7DQoJICAgIHZhciBEYXRhVHlwZSA9ICJUcmFjayI7DQoJICAgIHZhciB0a2luZm8gPSBkZXNjcmlwdGlvbihmaWxlLmdldFRyYWNrQnlJZCh0cmFjay5pZCkpOw0KDQoJICAgIHNlbGYucG9zdE1lc3NhZ2UoeyBEYXRhVHlwZSwgdHJhY2ssIHRraW5mbyB9KTsNCgkgIH0NCgkgIGZsYWcgPSAyOw0KCSAgZmlsZS5zZXRFeHRyYWN0aW9uT3B0aW9ucyh0cmFjay5pZCk7DQoJICBmaWxlLnN0YXJ0KCk7DQoJfQ0KDQoJZnVuY3Rpb24gb25TYW1wbGVzKHRyYWNrX2lkLCByZWYsIHNhbXBsZXMpIHsNCgkgIGZvciAoY29uc3Qgc2FtcGxlIG9mIHNhbXBsZXMpIHsNCgkgICAgdmFyIERhdGFUeXBlID0gIlNhbXBsZXMiOw0KCSAgICBzZWxmLnBvc3RNZXNzYWdlKHsgRGF0YVR5cGUsIHNhbXBsZSwgc2hvd0RhdGEgfSk7DQoJICB9DQoJfQ0KDQoJZnVuY3Rpb24gZGVzY3JpcHRpb24odHJhaykgew0KCSAgZm9yIChjb25zdCBlbnRyeSBvZiB0cmFrLm1kaWEubWluZi5zdGJsLnN0c2QuZW50cmllcykgew0KCSAgICBjb25zdCBib3ggPSBlbnRyeS5hdmNDIHx8IGVudHJ5Lmh2Y0MgfHwgZW50cnkudnBjQyB8fCBlbnRyeS5hdjFDOw0KCSAgICBpZiAoYm94KSB7DQoJICAgICAgY29uc3Qgc3RyZWFtID0gbmV3IG1wNGJveF9hbGwuRGF0YVN0cmVhbSgNCgkgICAgICAgIHVuZGVmaW5lZCwNCgkgICAgICAgIDAsDQoJICAgICAgICBtcDRib3hfYWxsLkRhdGFTdHJlYW0uQklHX0VORElBTg0KCSAgICAgICk7DQoJICAgICAgYm94LndyaXRlKHN0cmVhbSk7DQoJICAgICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KHN0cmVhbS5idWZmZXIsIDgpOyAvLyBSZW1vdmUgdGhlIGJveCBoZWFkZXIuDQoJICAgIH0NCgkgIH0NCgkgIHRocm93IG5ldyBFcnJvcigiYXZjQywgaHZjQywgdnBjQywgb3IgYXYxQyBib3ggbm90IGZvdW5kIik7DQoJfQ0KDQoJc2VsZi5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIiwgKG1lc3NhZ2UpID0+IHsNCgkgIGlmIChtZXNzYWdlLmRhdGEudHlwZSA9PT0gImx4Iikgew0KCSAgICBzZWxmLkx4ID0gbWVzc2FnZS5kYXRhLmx4Ow0KDQoJICAgIGlmICghbWVzc2FnZS5kYXRhLmx4KSB7DQoJICAgICAgc2VsZi5wb3N0TWVzc2FnZSh7DQoJICAgICAgICBEYXRhVHlwZTogImx4IiwNCgkgICAgICAgIERhdGE6IG1lcmdlQW5kRG93bmxvYWRCdWZmZXJzKE1wNEhlYXJkQnVmZmVyLCBTYXZlQnVmZmVyKSwNCgkgICAgICB9KTsNCgkgICAgfQ0KCSAgICByZXR1cm47DQoJICB9DQoJICB3cyA9IG5ldyBXZWJTb2NrZXQobWVzc2FnZS5kYXRhLnVybCk7DQoJICB3cy5iaW5hcnlUeXBlID0gImFycmF5YnVmZmVyIjsNCgkgIHdzLm9ub3BlbiA9IFdzT3BlbjsNCgkgIHdzLm9uY2xvc2UgPSBXc0Nsb3NlOw0KCSAgd3Mub25lcnJvciA9IFdzRXJyb3I7DQoJICB3cy5vbm1lc3NhZ2UgPSBXc01lc3NhZ2U7DQoJfSk7DQoNCglmdW5jdGlvbiBtZXJnZUFuZERvd25sb2FkQnVmZmVycyhidWZmZXJBcnJheTEsIGJ1ZmZlckFycmF5Mikgew0KCSAgLy8g5Yib5bu65LiA5Liq5paw55qEIEFycmF5QnVmZmVyIOadpeWtmOaUvuWQiOW5tuWQjueahOaVsOaNrg0KCSAgdmFyIG1lcmdlZEJ1ZmZlciA9IG5ldyBVaW50OEFycmF5KE1wNEhlYXJkQnVmZmVyU2l6ZSArIGtTYXZlQnVmZmVyU2l6ZSk7DQoNCgkgIC8vIOiusOW9leW9k+WJjeWGmeWFpeeahOS9jee9rg0KCSAgdmFyIG9mZnNldCA9IDA7DQoNCgkgIC8vIOWwhiBidWZmZXJBcnJheTEg5Lit55qE5q+P5LiqIEFycmF5QnVmZmVyIOeahOWGheWuueWkjeWItuWIsOaWsOeahCBBcnJheUJ1ZmZlciDkuK0NCgkgIGJ1ZmZlckFycmF5MS5mb3JFYWNoKChidWZmZXIpID0+IHsNCgkgICAgbWVyZ2VkQnVmZmVyLnNldChuZXcgVWludDhBcnJheShidWZmZXIpLCBvZmZzZXQpOw0KCSAgICBvZmZzZXQgKz0gYnVmZmVyLmJ5dGVMZW5ndGg7DQoJICB9KTsNCg0KCSAgLy8g5bCGIGJ1ZmZlckFycmF5MiDkuK3nmoTmr4/kuKogQXJyYXlCdWZmZXIg55qE5YaF5a655aSN5Yi25Yiw5paw55qEIEFycmF5QnVmZmVyIOS4rQ0KCSAgYnVmZmVyQXJyYXkyLmZvckVhY2goKGJ1ZmZlcikgPT4gew0KCSAgICBtZXJnZWRCdWZmZXIuc2V0KG5ldyBVaW50OEFycmF5KGJ1ZmZlciksIG9mZnNldCk7DQoJICAgIG9mZnNldCArPSBidWZmZXIuYnl0ZUxlbmd0aDsNCgkgIH0pOw0KCSAga1NhdmVCdWZmZXJTaXplID0gMDsNCgkgIFNhdmVCdWZmZXIgPSBbXTsNCg0KCSAgcmV0dXJuIG5ldyBCbG9iKFttZXJnZWRCdWZmZXJdLCB7IHR5cGU6ICJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0iIH0pOw0KCX0KCn0pKCk7Ci8vIyBzb3VyY2VNYXBwaW5nVVJMPUdldFZpZGVvU3RyZWFtaW5nLmpzLm1hcAoK");const L=new class{#a=null;#i={};#n={};#o=[];#c=[];loaded=!1;#d=()=>{this.#a&&(this.#a.onmessage=({data:{id:t,type:l,data:a}})=>{switch(l){case e.LOAD:this.loaded=!0,this.#i[t](a);break;case e.MOUNT:case e.UNMOUNT:case e.EXEC:case e.WRITE_FILE:case e.READ_FILE:case e.DELETE_FILE:case e.RENAME:case e.CREATE_DIR:case e.LIST_DIR:case e.DELETE_DIR:this.#i[t](a);break;case e.LOG:this.#o.forEach(e=>e(a));break;case e.PROGRESS:this.#c.forEach(e=>e(a));break;case e.ERROR:this.#n[t](a)}delete this.#i[t],delete this.#n[t]})};#g=({type:e,data:a},i=[],n)=>this.#a?new Promise((l,o)=>{const c=t();this.#a&&this.#a.postMessage({id:c,type:e,data:a},i),this.#i[c]=l,this.#n[c]=o,n?.addEventListener("abort",()=>{o(new DOMException(`Message # ${c} was aborted`,"AbortError"))},{once:!0})}):Promise.reject(l);on(e,t){"log"===e?this.#o.push(t):"progress"===e&&this.#c.push(t)}off(e,t){"log"===e?this.#o=this.#o.filter(e=>e!==t):"progress"===e&&(this.#c=this.#c.filter(e=>e!==t))}load=({classWorkerURL:t,...l}={},{signal:a}={})=>(this.#a||(this.#a=t?new Worker(new URL(t,import.meta.url).href,{type:"module"}):new Worker(new URL("./ffmpeg/worker.js",import.meta.url).href,{type:"module"}),this.#d()),this.#g({type:e.LOAD,data:l},void 0,a));exec=(t,l=-1,{signal:a}={})=>this.#g({type:e.EXEC,data:{args:t,timeout:l}},void 0,a);terminate=()=>{const e=Object.keys(this.#n);for(const t of e)this.#n[t](a),delete this.#n[t],delete this.#i[t];this.#a&&(this.#a.terminate(),this.#a=null,this.loaded=!1)};writeFile=(t,l,{signal:a}={})=>{const i=[];return l instanceof Uint8Array&&i.push(l.buffer),this.#g({type:e.WRITE_FILE,data:{path:t,data:l}},i,a)};mount=(t,l,a)=>this.#g({type:e.MOUNT,data:{fsType:t,options:l,mountPoint:a}},[]);unmount=t=>this.#g({type:e.UNMOUNT,data:{mountPoint:t}},[]);readFile=(t,l="binary",{signal:a}={})=>this.#g({type:e.READ_FILE,data:{path:t,encoding:l}},void 0,a);deleteFile=(t,{signal:l}={})=>this.#g({type:e.DELETE_FILE,data:{path:t}},void 0,l);rename=(t,l,{signal:a}={})=>this.#g({type:e.RENAME,data:{oldPath:t,newPath:l}},void 0,a);createDir=(t,{signal:l}={})=>this.#g({type:e.CREATE_DIR,data:{path:t}},void 0,l);listDir=(t,{signal:l}={})=>this.#g({type:e.LIST_DIR,data:{path:t}},void 0,l);deleteDir=(t,{signal:l}={})=>this.#g({type:e.DELETE_DIR,data:{path:t}},void 0,l)};function U(e){function t(e){return e<10?"0"+e:e}return`${e.getFullYear()}${t(e.getMonth()+1)}${t(e.getDate())}${t(e.getHours())}${t(e.getMinutes())}${t(e.getSeconds())}${e.getMilliseconds()}`}async function M(e,t){const l={suggestedName:t,types:[{"image/png":["png"]}]},a=await s(l),i=await a.createWritable();i.write(e),i.close()}function T(e,t,l=()=>{},a){let i=document.querySelector(t);i=i.transferControlToOffscreen();const n=new N;n.addEventListener("message",e=>{"img"===e.data.type?M(e.data.img,`${U(new Date)}.png`):l()});const o=new z;var c="";return o.postMessage({url:e}),o.addEventListener("message",async t=>{if("Opt"===t.data.DataType){c=t.data.data,n.postMessage({DataType:"Opt",data:t.data.data});let l="Start";n.postMessage({DataType:l,canvas:i,url:e,baseWH:a?JSON.stringify(a):null},[i])}if("Track"===t.data.DataType){let e="Track",l=t.data.track.codec.startsWith("vp08")?"vp8":t.data.track.codec,a=t.data.track.video.height,i=t.data.track.video.width,o=t.data.tkinfo;n.postMessage({DataType:e,codec:l,codedHeight:a,codedWidth:i,description:o})}if("Samples"===t.data.DataType){let e="Samples",l=t.data.sample.is_sync?"key":"delta",a=1e6*t.data.sample.cts/t.data.sample.timescale,i=1e6*t.data.sample.duration/t.data.sample.timescale,o=t.data.sample.data,c=t.data.showData;n.postMessage({DataType:e,type:l,timestamp:a,duration:i,data:o,showData:c})}if("lx"===t.data.DataType){L.on("log",({message:e})=>{console.log(e)}),await L.writeFile("test.mp4",await d.fetchFile(t.data.Data)),L.exec(["-i","test.mp4","-c","copy","-metadata:s:v","rotate="+JSON.parse(c).Rotate,"out.mp4"]);const e=await L.readFile("out.mp4");L.deleteFile("test.mp4"),M(new Blob([e.buffer],{type:"video/mp4"}),`${U(new Date)}.mp4`),L.deleteFile("out.mp4")}}),{worker:n,WebSocketWork:o,close:()=>{o.terminate(),n.terminate()}}}function D(e,t,l,a={}){return function(e,t,l=()=>{},a={}){const i=document.querySelector(e),n=new K(i,t,l,a);if(!i)throw new Error(`Video element not found for selector: ${e}`);if(!t)throw new Error("Video URL is required");return n}(t,e,l,a)}(async()=>{await L.load({coreURL:await d.toBlobURL(new URL("./core/package/pkg/esm/ffmpeg-core.js",import.meta.url).href,"text/javascript"),wasmURL:await d.toBlobURL(new URL("./core/package/pkg/esm/ffmpeg-core.wasm",import.meta.url).href,"application/wasm")})})(),window.OmnimatrixVideoPayer=T,window.OmnimatrixFlvPlayer=D;export{D as a,C as c,I as e,T as u};