soonspacejs 2.5.53 → 2.5.54

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.esm.js CHANGED
@@ -1,4 +1,4 @@
1
- var e="soonspacejs",t="2.5.53";
1
+ var e="soonspacejs",t="2.5.54";
2
2
  /**
3
3
  * @license
4
4
  * Copyright 2010-2022 Three.js Authors
@@ -17,7 +17,7 @@ INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
17
17
  LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
18
18
  OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
19
19
  PERFORMANCE OF THIS SOFTWARE.
20
- ***************************************************************************** */var tf=function(e,t){return(tf=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n])})(e,t)};var nf=function(){return(nf=Object.assign||function(e){for(var t,n=1,i=arguments.length;n<i;n++)for(var s in t=arguments[n])Object.prototype.hasOwnProperty.call(t,s)&&(e[s]=t[s]);return e}).apply(this,arguments)};function sf(e,t){var n={};for(var i in e)Object.prototype.hasOwnProperty.call(e,i)&&t.indexOf(i)<0&&(n[i]=e[i]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var s=0;for(i=Object.getOwnPropertySymbols(e);s<i.length;s++)t.indexOf(i[s])<0&&Object.prototype.propertyIsEnumerable.call(e,i[s])&&(n[i[s]]=e[i[s]])}return n}function rf(e,t,n,i){return new(n||(n=Promise))((function(s,r){function o(e){try{l(i.next(e))}catch(e){r(e)}}function a(e){try{l(i.throw(e))}catch(e){r(e)}}function l(e){var t;e.done?s(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(o,a)}l((i=i.apply(e,t||[])).next())}))}var of=Object.create?function(e,t,n,i){void 0===i&&(i=n),Object.defineProperty(e,i,{enumerable:!0,get:function(){return t[n]}})}:function(e,t,n,i){void 0===i&&(i=n),e[i]=t[n]};function af(e){var t="function"==typeof Symbol&&Symbol.iterator,n=t&&e[t],i=0;if(n)return n.call(e);if(e&&"number"==typeof e.length)return{next:function(){return e&&i>=e.length&&(e=void 0),{value:e&&e[i++],done:!e}}};throw new TypeError(t?"Object is not iterable.":"Symbol.iterator is not defined.")}function lf(e,t){var n="function"==typeof Symbol&&e[Symbol.iterator];if(!n)return e;var i,s,r=n.call(e),o=[];try{for(;(void 0===t||t-- >0)&&!(i=r.next()).done;)o.push(i.value)}catch(e){s={error:e}}finally{try{i&&!i.done&&(n=r.return)&&n.call(r)}finally{if(s)throw s.error}}return o}function cf(e){return this instanceof cf?(this.v=e,this):new cf(e)}var hf=Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t};function df(e,t){if(!t.has(e))throw new TypeError("attempted to get private field on non-instance");return t.get(e)}function uf(e,t,n){if(!t.has(e))throw new TypeError("attempted to set private field on non-instance");return t.set(e,n),n}var pf=Object.freeze({__proto__:null,__extends:function(e,t){function n(){this.constructor=e}tf(e,t),e.prototype=null===t?Object.create(t):(n.prototype=t.prototype,new n)},get __assign(){return nf},__rest:sf,__decorate:function(e,t,n,i){var s,r=arguments.length,o=r<3?t:null===i?i=Object.getOwnPropertyDescriptor(t,n):i;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,t,n,i);else for(var a=e.length-1;a>=0;a--)(s=e[a])&&(o=(r<3?s(o):r>3?s(t,n,o):s(t,n))||o);return r>3&&o&&Object.defineProperty(t,n,o),o},__param:function(e,t){return function(n,i){t(n,i,e)}},__metadata:function(e,t){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(e,t)},__awaiter:rf,__generator:function(e,t){var n,i,s,r,o={label:0,sent:function(){if(1&s[0])throw s[1];return s[1]},trys:[],ops:[]};return r={next:a(0),throw:a(1),return:a(2)},"function"==typeof Symbol&&(r[Symbol.iterator]=function(){return this}),r;function a(r){return function(a){return function(r){if(n)throw new TypeError("Generator is already executing.");for(;o;)try{if(n=1,i&&(s=2&r[0]?i.return:r[0]?i.throw||((s=i.return)&&s.call(i),0):i.next)&&!(s=s.call(i,r[1])).done)return s;switch(i=0,s&&(r=[2&r[0],s.value]),r[0]){case 0:case 1:s=r;break;case 4:return o.label++,{value:r[1],done:!1};case 5:o.label++,i=r[1],r=[0];continue;case 7:r=o.ops.pop(),o.trys.pop();continue;default:if(!(s=o.trys,(s=s.length>0&&s[s.length-1])||6!==r[0]&&2!==r[0])){o=0;continue}if(3===r[0]&&(!s||r[1]>s[0]&&r[1]<s[3])){o.label=r[1];break}if(6===r[0]&&o.label<s[1]){o.label=s[1],s=r;break}if(s&&o.label<s[2]){o.label=s[2],o.ops.push(r);break}s[2]&&o.ops.pop(),o.trys.pop();continue}r=t.call(e,o)}catch(e){r=[6,e],i=0}finally{n=s=0}if(5&r[0])throw r[1];return{value:r[0]?r[1]:void 0,done:!0}}([r,a])}}},__createBinding:of,__exportStar:function(e,t){for(var n in e)"default"===n||Object.prototype.hasOwnProperty.call(t,n)||of(t,e,n)},__values:af,__read:lf,__spread:function(){for(var e=[],t=0;t<arguments.length;t++)e=e.concat(lf(arguments[t]));return e},__spreadArrays:function(){for(var e=0,t=0,n=arguments.length;t<n;t++)e+=arguments[t].length;var i=Array(e),s=0;for(t=0;t<n;t++)for(var r=arguments[t],o=0,a=r.length;o<a;o++,s++)i[s]=r[o];return i},__await:cf,__asyncGenerator:function(e,t,n){if(!Symbol.asyncIterator)throw new TypeError("Symbol.asyncIterator is not defined.");var i,s=n.apply(e,t||[]),r=[];return i={},o("next"),o("throw"),o("return"),i[Symbol.asyncIterator]=function(){return this},i;function o(e){s[e]&&(i[e]=function(t){return new Promise((function(n,i){r.push([e,t,n,i])>1||a(e,t)}))})}function a(e,t){try{(n=s[e](t)).value instanceof cf?Promise.resolve(n.value.v).then(l,c):h(r[0][2],n)}catch(e){h(r[0][3],e)}var n}function l(e){a("next",e)}function c(e){a("throw",e)}function h(e,t){e(t),r.shift(),r.length&&a(r[0][0],r[0][1])}},__asyncDelegator:function(e){var t,n;return t={},i("next"),i("throw",(function(e){throw e})),i("return"),t[Symbol.iterator]=function(){return this},t;function i(i,s){t[i]=e[i]?function(t){return(n=!n)?{value:cf(e[i](t)),done:"return"===i}:s?s(t):t}:s}},__asyncValues:function(e){if(!Symbol.asyncIterator)throw new TypeError("Symbol.asyncIterator is not defined.");var t,n=e[Symbol.asyncIterator];return n?n.call(e):(e=af(e),t={},i("next"),i("throw"),i("return"),t[Symbol.asyncIterator]=function(){return this},t);function i(n){t[n]=e[n]&&function(t){return new Promise((function(i,s){(function(e,t,n,i){Promise.resolve(i).then((function(t){e({value:t,done:n})}),t)})(i,s,(t=e[n](t)).done,t.value)}))}}},__makeTemplateObject:function(e,t){return Object.defineProperty?Object.defineProperty(e,"raw",{value:t}):e.raw=t,e},__importStar:function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)"default"!==n&&Object.prototype.hasOwnProperty.call(e,n)&&of(t,e,n);return hf(t,e),t},__importDefault:function(e){return e&&e.__esModule?e:{default:e}},__classPrivateFieldGet:df,__classPrivateFieldSet:uf});const mf=e=>rf(void 0,void 0,void 0,(function*(){const t=yield fetch(e);if(200===t.status)return t;throw new Error(`Failed to fetch file: ${e}`)})),ff=e=>{"function"==typeof requestIdleCallback?requestIdleCallback(e):setTimeout(e)};var gf=function(){function e(){}return e.prototype.toJson=function(e,t){var n=this.xmlStringToXmlDom(e),i=this.xmlToJson(n);return t?(t.removeLineBreaks&&this.removeLineBreaks(i),t.removeComments&&this.removeCommentProperties(i),t.transformTextOnly&&this.transformTextOnly(i),i):i},e.prototype.xmlStringToXmlDom=function(e){return(new DOMParser).parseFromString(e,"text/xml")},e.prototype.removeLineBreaks=function(e){var t=this;Object.keys(e).forEach((function(n,i){"#text"===n&&Array.isArray(e[n])&&delete e[n],"object"==typeof e[n]&&t.removeLineBreaks(e[n])}))},e.prototype.removeCommentProperties=function(e){var t=this;Object.keys(e).forEach((function(n,i){"#comment"===n&&delete e[n],"object"==typeof e[n]&&t.removeCommentProperties(e[n])}))},e.prototype.transformTextOnly=function(e){var t=this;Object.keys(e).forEach((function(n,i){var s=Object.keys(e[n]).length>1,r=Object.keys(e[n])[0];s||"object"==typeof e[n][r]?t.transformTextOnly(e[n]):"object"==typeof e[n]&&e[n]["#text"]&&(e[n]=e[n]["#text"])}))},e.prototype.xmlToJson=function(e){var t={};if(1==e.nodeType){if(e.attributes.length>0){t._attributes={};for(var n=0;n<e.attributes.length;n++){var i=e.attributes.item(n);t._attributes[i.nodeName]=i.nodeValue}}}else 3==e.nodeType&&(t=e.nodeValue);if(e.hasChildNodes())for(var s=0;s<e.childNodes.length;s++){var r=e.childNodes.item(s),o=r.nodeName;if(void 0===t[o])t[o]=this.xmlToJson(r);else{if(void 0===t[o].push){var a=t[o];t[o]=[],t[o].push(a)}t[o].push(this.xmlToJson(r))}}return t},e}();function yf(e){return mf(e).then((e=>e.text())).then((e=>Promise.resolve(function(e){return(new gf).toJson(e,{transformTextOnly:!0,removeComments:!0,removeLineBreaks:!0})}(e))))}class bf{constructor(){this.pluginCallbacks=[],this.register((function(e){return new Yf(e)})),this.register((function(e){return new Kf(e)})),this.register((function(e){return new jf(e)})),this.register((function(e){return new qf(e)})),this.register((function(e){return new $f(e)})),this.register((function(e){return new Jf(e)})),this.register((function(e){return new Qf(e)}))}register(e){return-1===this.pluginCallbacks.indexOf(e)&&this.pluginCallbacks.push(e),this}unregister(e){return-1!==this.pluginCallbacks.indexOf(e)&&this.pluginCallbacks.splice(this.pluginCallbacks.indexOf(e),1),this}parse(e,t,n,i){"object"==typeof n&&(console.warn("THREE.GLTFExporter: parse() expects options as the fourth argument now."),i=n);const s=new Of,r=[];for(let e=0,t=this.pluginCallbacks.length;e<t;e++)r.push(this.pluginCallbacks[e](s));s.setPlugins(r),s.write(e,t,i).catch(n)}parseAsync(e,t){const n=this;return new Promise((function(i,s){n.parse(e,i,s,t)}))}}const vf=0,xf=1,wf=2,Sf=3,Mf=4,Tf=5121,Cf=5123,Lf=5126,Rf=5125,Gf=34962,Af=34963,_f=9728,If=9729,Ef=9984,Xf=9985,zf=9986,Pf=9987,Wf=33071,Zf=33648,Nf=10497,Vf={};Vf[1003]=_f,Vf[1004]=Ef,Vf[1005]=zf,Vf[1006]=If,Vf[1007]=Xf,Vf[1008]=Pf,Vf[1001]=Wf,Vf[1e3]=Nf,Vf[1002]=Zf;const Df={scale:"scale",position:"translation",quaternion:"rotation",morphTargetInfluences:"weights"};function Bf(e,t){return e.length===t.length&&e.every((function(e,n){return e===t[n]}))}function Hf(e){return 4*Math.ceil(e/4)}function kf(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0;const n=Hf(e.byteLength);if(n!==e.byteLength){const i=new Uint8Array(n);if(i.set(new Uint8Array(e)),0!==t)for(let s=e.byteLength;s<n;s++)i[s]=t;return i.buffer}return e}function Ff(){return"undefined"==typeof document&&"undefined"!=typeof OffscreenCanvas?new OffscreenCanvas(1,1):document.createElement("canvas")}function Uf(e,t){if(void 0!==e.toBlob)return new Promise((n=>e.toBlob(n,t)));let n;return"image/jpeg"===t?n=.92:"image/webp"===t&&(n=.8),e.convertToBlob({type:t,quality:n})}class Of{constructor(){this.plugins=[],this.options={},this.pending=[],this.buffers=[],this.byteOffset=0,this.buffers=[],this.nodeMap=new Map,this.skins=[],this.extensionsUsed={},this.uids=new Map,this.uid=0,this.json={asset:{version:"2.0",generator:"THREE.GLTFExporter"}},this.cache={meshes:new Map,attributes:new Map,attributesNormalized:new Map,materials:new Map,textures:new Map,images:new Map}}setPlugins(e){this.plugins=e}async write(e,t,n){this.options=Object.assign({},{binary:!1,trs:!1,onlyVisible:!0,truncateDrawRange:!0,maxTextureSize:1/0,animations:[],includeCustomExtensions:!1},n),this.options.animations.length>0&&(this.options.trs=!0),this.processInput(e),await Promise.all(this.pending);const i=this,s=i.buffers,r=i.json;n=i.options;const o=i.extensionsUsed,a=new Blob(s,{type:"application/octet-stream"}),l=Object.keys(o);if(l.length>0&&(r.extensionsUsed=l),r.buffers&&r.buffers.length>0&&(r.buffers[0].byteLength=a.size),!0===n.binary){const e=new FileReader;e.readAsArrayBuffer(a),e.onloadend=function(){const n=kf(e.result),i=new DataView(new ArrayBuffer(8));i.setUint32(0,n.byteLength,!0),i.setUint32(4,5130562,!0);const s=kf((o=JSON.stringify(r),(new TextEncoder).encode(o).buffer),32);var o;const a=new DataView(new ArrayBuffer(8));a.setUint32(0,s.byteLength,!0),a.setUint32(4,1313821514,!0);const l=new ArrayBuffer(12),c=new DataView(l);c.setUint32(0,1179937895,!0),c.setUint32(4,2,!0);const h=12+a.byteLength+s.byteLength+i.byteLength+n.byteLength;c.setUint32(8,h,!0);const d=new Blob([l,a,s,i,n],{type:"application/octet-stream"}),u=new FileReader;u.readAsArrayBuffer(d),u.onloadend=function(){t(u.result)}}}else if(r.buffers&&r.buffers.length>0){const e=new FileReader;e.readAsDataURL(a),e.onloadend=function(){const n=e.result;r.buffers[0].uri=n,t(r)}}else t(r)}serializeUserData(e,t){if(0===Object.keys(e.userData).length)return;const n=this.options,i=this.extensionsUsed;try{const s=JSON.parse(JSON.stringify(e.userData));if(n.includeCustomExtensions&&s.gltfExtensions){void 0===t.extensions&&(t.extensions={});for(const e in s.gltfExtensions)t.extensions[e]=s.gltfExtensions[e],i[e]=!0;delete s.gltfExtensions}Object.keys(s).length>0&&(t.extras=s)}catch(t){console.warn("THREE.GLTFExporter: userData of '"+e.name+"' won't be serialized because of JSON.stringify error - "+t.message)}}getUID(e){let t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];if(!1===this.uids.has(e)){const t=new Map;t.set(!0,this.uid++),t.set(!1,this.uid++),this.uids.set(e,t)}return this.uids.get(e).get(t)}isNormalizedNormalAttribute(e){if(this.cache.attributesNormalized.has(e))return!1;const t=new ri;for(let n=0,i=e.count;n<i;n++)if(Math.abs(t.fromBufferAttribute(e,n).length()-1)>5e-4)return!1;return!0}createNormalizedNormalAttribute(e){const t=this.cache;if(t.attributesNormalized.has(e))return t.attributesNormalized.get(e);const n=e.clone(),i=new ri;for(let e=0,t=n.count;e<t;e++)i.fromBufferAttribute(n,e),0===i.x&&0===i.y&&0===i.z?i.setX(1):i.normalize(),n.setXYZ(e,i.x,i.y,i.z);return t.attributesNormalized.set(e,n),n}applyTextureTransform(e,t){let n=!1;const i={};0===t.offset.x&&0===t.offset.y||(i.offset=t.offset.toArray(),n=!0),0!==t.rotation&&(i.rotation=t.rotation,n=!0),1===t.repeat.x&&1===t.repeat.y||(i.scale=t.repeat.toArray(),n=!0),n&&(e.extensions=e.extensions||{},e.extensions.KHR_texture_transform=i,this.extensionsUsed.KHR_texture_transform=!0)}buildMetalRoughTexture(e,t){if(e===t)return e;function n(e){return 3001===e.encoding?function(e){return e<.04045?.0773993808*e:Math.pow(.9478672986*e+.0521327014,2.4)}:function(e){return e}}console.warn("THREE.GLTFExporter: Merged metalnessMap and roughnessMap textures.");const i=null==e?void 0:e.image,s=null==t?void 0:t.image,r=Math.max((null==i?void 0:i.width)||0,(null==s?void 0:s.width)||0),o=Math.max((null==i?void 0:i.height)||0,(null==s?void 0:s.height)||0),a=Ff();a.width=r,a.height=o;const l=a.getContext("2d");l.fillStyle="#00ffff",l.fillRect(0,0,r,o);const c=l.getImageData(0,0,r,o);if(i){l.drawImage(i,0,0,r,o);const t=n(e),s=l.getImageData(0,0,r,o).data;for(let e=2;e<s.length;e+=4)c.data[e]=256*t(s[e]/256)}if(s){l.drawImage(s,0,0,r,o);const e=n(t),i=l.getImageData(0,0,r,o).data;for(let t=1;t<i.length;t+=4)c.data[t]=256*e(i[t]/256)}l.putImageData(c,0,0);const h=(e||t).clone();return h.source=new Yn(a),h.encoding=3e3,h}processBuffer(e){const t=this.json,n=this.buffers;return t.buffers||(t.buffers=[{byteLength:0}]),n.push(e),0}processBufferView(e,t,n,i,s){const r=this.json;let o;r.bufferViews||(r.bufferViews=[]),o=t===Tf?1:t===Cf?2:4;const a=Hf(i*e.itemSize*o),l=new DataView(new ArrayBuffer(a));let c=0;for(let s=n;s<n+i;s++)for(let n=0;n<e.itemSize;n++){let i;e.itemSize>4?i=e.array[s*e.itemSize+n]:0===n?i=e.getX(s):1===n?i=e.getY(s):2===n?i=e.getZ(s):3===n&&(i=e.getW(s)),t===Lf?l.setFloat32(c,i,!0):t===Rf?l.setUint32(c,i,!0):t===Cf?l.setUint16(c,i,!0):t===Tf&&l.setUint8(c,i),c+=o}const h={buffer:this.processBuffer(l.buffer),byteOffset:this.byteOffset,byteLength:a};void 0!==s&&(h.target=s),s===Gf&&(h.byteStride=e.itemSize*o),this.byteOffset+=a,r.bufferViews.push(h);return{id:r.bufferViews.length-1,byteLength:0}}processBufferViewImage(e){const t=this,n=t.json;return n.bufferViews||(n.bufferViews=[]),new Promise((function(i){const s=new FileReader;s.readAsArrayBuffer(e),s.onloadend=function(){const e=kf(s.result),r={buffer:t.processBuffer(e),byteOffset:t.byteOffset,byteLength:e.byteLength};t.byteOffset+=e.byteLength,i(n.bufferViews.push(r)-1)}}))}processAccessor(e,t,n,i){const s=this.options,r=this.json;let o;if(e.array.constructor===Float32Array)o=Lf;else if(e.array.constructor===Uint32Array)o=Rf;else if(e.array.constructor===Uint16Array)o=Cf;else{if(e.array.constructor!==Uint8Array)throw new Error("THREE.GLTFExporter: Unsupported bufferAttribute component type.");o=Tf}if(void 0===n&&(n=0),void 0===i&&(i=e.count),s.truncateDrawRange&&void 0!==t&&null===t.index){const s=n+i,r=t.drawRange.count===1/0?e.count:t.drawRange.start+t.drawRange.count;n=Math.max(n,t.drawRange.start),(i=Math.min(s,r)-n)<0&&(i=0)}if(0===i)return null;const a=function(e,t,n){const i={min:new Array(e.itemSize).fill(Number.POSITIVE_INFINITY),max:new Array(e.itemSize).fill(Number.NEGATIVE_INFINITY)};for(let s=t;s<t+n;s++)for(let t=0;t<e.itemSize;t++){let n;e.itemSize>4?n=e.array[s*e.itemSize+t]:0===t?n=e.getX(s):1===t?n=e.getY(s):2===t?n=e.getZ(s):3===t&&(n=e.getW(s)),i.min[t]=Math.min(i.min[t],n),i.max[t]=Math.max(i.max[t],n)}return i}(e,n,i);let l;void 0!==t&&(l=e===t.index?Af:Gf);const c=this.processBufferView(e,o,n,i,l),h={bufferView:c.id,byteOffset:c.byteOffset,componentType:o,count:i,max:a.max,min:a.min,type:{1:"SCALAR",2:"VEC2",3:"VEC3",4:"VEC4",16:"MAT4"}[e.itemSize]};return!0===e.normalized&&(h.normalized=!0),r.accessors||(r.accessors=[]),r.accessors.push(h)-1}processImage(e,t,n){let i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:"image/png";const s=this,r=s.cache,o=s.json,a=s.options,l=s.pending;r.images.has(e)||r.images.set(e,{});const c=r.images.get(e),h=i+":flipY/"+n.toString();if(void 0!==c[h])return c[h];o.images||(o.images=[]);const d={mimeType:i},u=Ff();u.width=Math.min(e.width,a.maxTextureSize),u.height=Math.min(e.height,a.maxTextureSize);const p=u.getContext("2d");if(!0===n&&(p.translate(0,u.height),p.scale(1,-1)),void 0!==e.data){1023!==t&&console.error("GLTFExporter: Only RGBAFormat is supported."),(e.width>a.maxTextureSize||e.height>a.maxTextureSize)&&console.warn("GLTFExporter: Image size is bigger than maxTextureSize",e);const n=new Uint8ClampedArray(e.height*e.width*4);for(let t=0;t<n.length;t+=4)n[t+0]=e.data[t+0],n[t+1]=e.data[t+1],n[t+2]=e.data[t+2],n[t+3]=e.data[t+3];p.putImageData(new ImageData(n,e.width,e.height),0,0)}else p.drawImage(e,0,0,u.width,u.height);!0===a.binary?l.push(Uf(u,i).then((e=>s.processBufferViewImage(e))).then((e=>{d.bufferView=e}))):void 0!==u.toDataURL?d.uri=u.toDataURL(i):l.push(Uf(u,i).then((e=>(new FileReader).readAsDataURL(e))).then((e=>{d.uri=e})));const m=o.images.push(d)-1;return c[h]=m,m}processSampler(e){const t=this.json;t.samplers||(t.samplers=[]);const n={magFilter:Vf[e.magFilter],minFilter:Vf[e.minFilter],wrapS:Vf[e.wrapS],wrapT:Vf[e.wrapT]};return t.samplers.push(n)-1}processTexture(e){const t=this.cache,n=this.json;if(t.textures.has(e))return t.textures.get(e);n.textures||(n.textures=[]);let i=e.userData.mimeType;"image/webp"===i&&(i="image/png");const s={sampler:this.processSampler(e),source:this.processImage(e.image,e.format,e.flipY,i)};e.name&&(s.name=e.name),this._invokeAll((function(t){t.writeTexture&&t.writeTexture(e,s)}));const r=n.textures.push(s)-1;return t.textures.set(e,r),r}processMaterial(e){const t=this.cache,n=this.json;if(t.materials.has(e))return t.materials.get(e);if(e.isShaderMaterial)return console.warn("GLTFExporter: THREE.ShaderMaterial not supported."),null;n.materials||(n.materials=[]);const i={pbrMetallicRoughness:{}};!0!==e.isMeshStandardMaterial&&!0!==e.isMeshBasicMaterial&&console.warn("GLTFExporter: Use MeshStandardMaterial or MeshBasicMaterial for best results.");const s=e.color.toArray().concat([e.opacity]);if(Bf(s,[1,1,1,1])||(i.pbrMetallicRoughness.baseColorFactor=s),e.isMeshStandardMaterial?(i.pbrMetallicRoughness.metallicFactor=e.metalness,i.pbrMetallicRoughness.roughnessFactor=e.roughness):(i.pbrMetallicRoughness.metallicFactor=.5,i.pbrMetallicRoughness.roughnessFactor=.5),e.metalnessMap||e.roughnessMap){const t=this.buildMetalRoughTexture(e.metalnessMap,e.roughnessMap),n={index:this.processTexture(t)};this.applyTextureTransform(n,t),i.pbrMetallicRoughness.metallicRoughnessTexture=n}if(e.map){const t={index:this.processTexture(e.map)};this.applyTextureTransform(t,e.map),i.pbrMetallicRoughness.baseColorTexture=t}if(e.emissive){const t=e.emissive.clone().multiplyScalar(e.emissiveIntensity),n=Math.max(t.r,t.g,t.b);if(n>1&&(t.multiplyScalar(1/n),console.warn("THREE.GLTFExporter: Some emissive components exceed 1; emissive has been limited")),n>0&&(i.emissiveFactor=t.toArray()),e.emissiveMap){const t={index:this.processTexture(e.emissiveMap)};this.applyTextureTransform(t,e.emissiveMap),i.emissiveTexture=t}}if(e.normalMap){const t={index:this.processTexture(e.normalMap)};e.normalScale&&1!==e.normalScale.x&&(t.scale=e.normalScale.x),this.applyTextureTransform(t,e.normalMap),i.normalTexture=t}if(e.aoMap){const t={index:this.processTexture(e.aoMap),texCoord:1};1!==e.aoMapIntensity&&(t.strength=e.aoMapIntensity),this.applyTextureTransform(t,e.aoMap),i.occlusionTexture=t}e.transparent?i.alphaMode="BLEND":e.alphaTest>0&&(i.alphaMode="MASK",i.alphaCutoff=e.alphaTest),2===e.side&&(i.doubleSided=!0),""!==e.name&&(i.name=e.name),this.serializeUserData(e,i),this._invokeAll((function(t){t.writeMaterial&&t.writeMaterial(e,i)}));const r=n.materials.push(i)-1;return t.materials.set(e,r),r}processMesh(e){const t=this.cache,n=this.json,i=[e.geometry.uuid];if(Array.isArray(e.material))for(let t=0,n=e.material.length;t<n;t++)i.push(e.material[t].uuid);else i.push(e.material.uuid);const s=i.join(":");if(t.meshes.has(s))return t.meshes.get(s);const r=e.geometry;let o;if(o=e.isLineSegments?xf:e.isLineLoop?wf:e.isLine?Sf:e.isPoints?vf:e.material.wireframe?xf:Mf,!0!==r.isBufferGeometry)throw new Error("THREE.GLTFExporter: Geometry is not of type THREE.BufferGeometry.");const a={},l={},c=[],h=[],d={uv:"TEXCOORD_0",uv2:"TEXCOORD_1",color:"COLOR_0",skinWeight:"WEIGHTS_0",skinIndex:"JOINTS_0"},u=r.getAttribute("normal");void 0===u||this.isNormalizedNormalAttribute(u)||(console.warn("THREE.GLTFExporter: Creating normalized normal attribute from the non-normalized one."),r.setAttribute("normal",this.createNormalizedNormalAttribute(u)));let p=null;for(let e in r.attributes){if("morph"===e.slice(0,5))continue;const n=r.attributes[e];e=d[e]||e.toUpperCase();if(/^(POSITION|NORMAL|TANGENT|TEXCOORD_\d+|COLOR_\d+|JOINTS_\d+|WEIGHTS_\d+)$/.test(e)||(e="_"+e),t.attributes.has(this.getUID(n))){l[e]=t.attributes.get(this.getUID(n));continue}p=null;const i=n.array;"JOINTS_0"!==e||i instanceof Uint16Array||i instanceof Uint8Array||(console.warn('GLTFExporter: Attribute "skinIndex" converted to type UNSIGNED_SHORT.'),p=new Ts(new Uint16Array(i),n.itemSize,n.normalized));const s=this.processAccessor(p||n,r);null!==s&&(l[e]=s,t.attributes.set(this.getUID(n),s))}if(void 0!==u&&r.setAttribute("normal",u),0===Object.keys(l).length)return null;if(void 0!==e.morphTargetInfluences&&e.morphTargetInfluences.length>0){const n=[],i=[],s={};if(void 0!==e.morphTargetDictionary)for(const t in e.morphTargetDictionary)s[e.morphTargetDictionary[t]]=t;for(let o=0;o<e.morphTargetInfluences.length;++o){const a={};let l=!1;for(const e in r.morphAttributes){if("position"!==e&&"normal"!==e){l||(console.warn("GLTFExporter: Only POSITION and NORMAL morph are supported."),l=!0);continue}const n=r.morphAttributes[e][o],i=e.toUpperCase(),s=r.attributes[e];if(t.attributes.has(this.getUID(n,!0))){a[i]=t.attributes.get(this.getUID(n,!0));continue}const c=n.clone();if(!r.morphTargetsRelative)for(let e=0,t=n.count;e<t;e++)c.setXYZ(e,n.getX(e)-s.getX(e),n.getY(e)-s.getY(e),n.getZ(e)-s.getZ(e));a[i]=this.processAccessor(c,r),t.attributes.set(this.getUID(s,!0),a[i])}h.push(a),n.push(e.morphTargetInfluences[o]),void 0!==e.morphTargetDictionary&&i.push(s[o])}a.weights=n,i.length>0&&(a.extras={},a.extras.targetNames=i)}const m=Array.isArray(e.material);if(m&&0===r.groups.length)return null;const f=m?e.material:[e.material],g=m?r.groups:[{materialIndex:0,start:void 0,count:void 0}];for(let e=0,n=g.length;e<n;e++){const n={mode:o,attributes:l};if(this.serializeUserData(r,n),h.length>0&&(n.targets=h),null!==r.index){let i=this.getUID(r.index);void 0===g[e].start&&void 0===g[e].count||(i+=":"+g[e].start+":"+g[e].count),t.attributes.has(i)?n.indices=t.attributes.get(i):(n.indices=this.processAccessor(r.index,r,g[e].start,g[e].count),t.attributes.set(i,n.indices)),null===n.indices&&delete n.indices}const i=this.processMaterial(f[g[e].materialIndex]);null!==i&&(n.material=i),c.push(n)}a.primitives=c,n.meshes||(n.meshes=[]),this._invokeAll((function(t){t.writeMesh&&t.writeMesh(e,a)}));const y=n.meshes.push(a)-1;return t.meshes.set(s,y),y}processCamera(e){const t=this.json;t.cameras||(t.cameras=[]);const n=e.isOrthographicCamera,i={type:n?"orthographic":"perspective"};return n?i.orthographic={xmag:2*e.right,ymag:2*e.top,zfar:e.far<=0?.001:e.far,znear:e.near<0?0:e.near}:i.perspective={aspectRatio:e.aspect,yfov:Rn.degToRad(e.fov),zfar:e.far<=0?.001:e.far,znear:e.near<0?0:e.near},""!==e.name&&(i.name=e.type),t.cameras.push(i)-1}processAnimation(e,t){const n=this.json,i=this.nodeMap;n.animations||(n.animations=[]);const s=(e=bf.Utils.mergeMorphTargetTracks(e.clone(),t)).tracks,r=[],o=[];for(let e=0;e<s.length;++e){const n=s[e],a=Lu.parseTrackName(n.name);let l=Lu.findNode(t,a.nodeName);const c=Df[a.propertyName];if("bones"===a.objectName&&(l=!0===l.isSkinnedMesh?l.skeleton.getBoneByName(a.objectIndex):void 0),!l||!c)return console.warn('THREE.GLTFExporter: Could not export animation track "%s".',n.name),null;const h=1;let d,u=n.values.length/n.times.length;c===Df.morphTargetInfluences&&(u/=l.morphTargetInfluences.length),!0===n.createInterpolant.isInterpolantFactoryMethodGLTFCubicSpline?(d="CUBICSPLINE",u/=3):d=2300===n.getInterpolation()?"STEP":"LINEAR",o.push({input:this.processAccessor(new Ts(n.times,h)),output:this.processAccessor(new Ts(n.values,u)),interpolation:d}),r.push({sampler:o.length-1,target:{node:i.get(l),path:c}})}return n.animations.push({name:e.name||"clip_"+n.animations.length,samplers:o,channels:r}),n.animations.length-1}processSkin(e){const t=this.json,n=this.nodeMap,i=t.nodes[n.get(e)],s=e.skeleton;if(void 0===s)return null;const r=e.skeleton.bones[0];if(void 0===r)return null;const o=[],a=new Float32Array(16*s.bones.length),l=new Wi;for(let t=0;t<s.bones.length;++t)o.push(n.get(s.bones[t])),l.copy(s.boneInverses[t]),l.multiply(e.bindMatrix).toArray(a,16*t);void 0===t.skins&&(t.skins=[]),t.skins.push({inverseBindMatrices:this.processAccessor(new Ts(a,16)),joints:o,skeleton:n.get(r)});return i.skin=t.skins.length-1}processNode(e){const t=this.json,n=this.options,i=this.nodeMap;t.nodes||(t.nodes=[]);const s={};if(n.trs){const t=e.quaternion.toArray(),n=e.position.toArray(),i=e.scale.toArray();Bf(t,[0,0,0,1])||(s.rotation=t),Bf(n,[0,0,0])||(s.translation=n),Bf(i,[1,1,1])||(s.scale=i)}else e.matrixAutoUpdate&&e.updateMatrix(),!1===Bf(e.matrix.elements,[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1])&&(s.matrix=e.matrix.elements);if(""!==e.name&&(s.name=String(e.name)),this.serializeUserData(e,s),e.isMesh||e.isLine||e.isPoints){const t=this.processMesh(e);null!==t&&(s.mesh=t)}else e.isCamera&&(s.camera=this.processCamera(e));if(e.isSkinnedMesh&&this.skins.push(e),e.children.length>0){const t=[];for(let i=0,s=e.children.length;i<s;i++){const s=e.children[i];if(s.visible||!1===n.onlyVisible){const e=this.processNode(s);null!==e&&t.push(e)}}t.length>0&&(s.children=t)}this._invokeAll((function(t){t.writeNode&&t.writeNode(e,s)}));const r=t.nodes.push(s)-1;return i.set(e,r),r}processScene(e){const t=this.json,n=this.options;t.scenes||(t.scenes=[],t.scene=0);const i={};""!==e.name&&(i.name=e.name),t.scenes.push(i);const s=[];for(let t=0,i=e.children.length;t<i;t++){const i=e.children[t];if(i.visible||!1===n.onlyVisible){const e=this.processNode(i);null!==e&&s.push(e)}}s.length>0&&(i.nodes=s),this.serializeUserData(e,i)}processObjects(e){const t=new cl;t.name="AuxScene";for(let n=0;n<e.length;n++)t.children.push(e[n]);this.processScene(t)}processInput(e){const t=this.options;e=e instanceof Array?e:[e],this._invokeAll((function(t){t.beforeParse&&t.beforeParse(e)}));const n=[];for(let t=0;t<e.length;t++)e[t]instanceof cl?this.processScene(e[t]):n.push(e[t]);n.length>0&&this.processObjects(n);for(let e=0;e<this.skins.length;++e)this.processSkin(this.skins[e]);for(let n=0;n<t.animations.length;++n)this.processAnimation(t.animations[n],e[0]);this._invokeAll((function(t){t.afterParse&&t.afterParse(e)}))}_invokeAll(e){for(let t=0,n=this.plugins.length;t<n;t++)e(this.plugins[t])}}class Yf{constructor(e){this.writer=e,this.name="KHR_lights_punctual"}writeNode(e,t){if(!e.isLight)return;if(!e.isDirectionalLight&&!e.isPointLight&&!e.isSpotLight)return void console.warn("THREE.GLTFExporter: Only directional, point, and spot lights are supported.",e);const n=this.writer,i=n.json,s=n.extensionsUsed,r={};e.name&&(r.name=e.name),r.color=e.color.toArray(),r.intensity=e.intensity,e.isDirectionalLight?r.type="directional":e.isPointLight?(r.type="point",e.distance>0&&(r.range=e.distance)):e.isSpotLight&&(r.type="spot",e.distance>0&&(r.range=e.distance),r.spot={},r.spot.innerConeAngle=(e.penumbra-1)*e.angle*-1,r.spot.outerConeAngle=e.angle),void 0!==e.decay&&2!==e.decay&&console.warn("THREE.GLTFExporter: Light decay may be lost. glTF is physically-based, and expects light.decay=2."),!e.target||e.target.parent===e&&0===e.target.position.x&&0===e.target.position.y&&-1===e.target.position.z||console.warn("THREE.GLTFExporter: Light direction may be lost. For best results, make light.target a child of the light with position 0,0,-1."),s[this.name]||(i.extensions=i.extensions||{},i.extensions[this.name]={lights:[]},s[this.name]=!0);const o=i.extensions[this.name].lights;o.push(r),t.extensions=t.extensions||{},t.extensions[this.name]={light:o.length-1}}}class Kf{constructor(e){this.writer=e,this.name="KHR_materials_unlit"}writeMaterial(e,t){if(!e.isMeshBasicMaterial)return;const n=this.writer.extensionsUsed;t.extensions=t.extensions||{},t.extensions[this.name]={},n[this.name]=!0,t.pbrMetallicRoughness.metallicFactor=0,t.pbrMetallicRoughness.roughnessFactor=.9}}class jf{constructor(e){this.writer=e,this.name="KHR_materials_pbrSpecularGlossiness"}writeMaterial(e,t){if(!e.isGLTFSpecularGlossinessMaterial)return;const n=this.writer,i=n.extensionsUsed,s={};t.pbrMetallicRoughness.baseColorFactor&&(s.diffuseFactor=t.pbrMetallicRoughness.baseColorFactor);const r=[1,1,1];if(e.specular.toArray(r,0),s.specularFactor=r,s.glossinessFactor=e.glossiness,t.pbrMetallicRoughness.baseColorTexture&&(s.diffuseTexture=t.pbrMetallicRoughness.baseColorTexture),e.specularMap){const t={index:n.processTexture(e.specularMap)};n.applyTextureTransform(t,e.specularMap),s.specularGlossinessTexture=t}t.extensions=t.extensions||{},t.extensions[this.name]=s,i[this.name]=!0}}class Jf{constructor(e){this.writer=e,this.name="KHR_materials_clearcoat"}writeMaterial(e,t){if(!e.isMeshPhysicalMaterial)return;const n=this.writer,i=n.extensionsUsed,s={};if(s.clearcoatFactor=e.clearcoat,e.clearcoatMap){const t={index:n.processTexture(e.clearcoatMap)};n.applyTextureTransform(t,e.clearcoatMap),s.clearcoatTexture=t}if(s.clearcoatRoughnessFactor=e.clearcoatRoughness,e.clearcoatRoughnessMap){const t={index:n.processTexture(e.clearcoatRoughnessMap)};n.applyTextureTransform(t,e.clearcoatRoughnessMap),s.clearcoatRoughnessTexture=t}if(e.clearcoatNormalMap){const t={index:n.processTexture(e.clearcoatNormalMap)};n.applyTextureTransform(t,e.clearcoatNormalMap),s.clearcoatNormalTexture=t}t.extensions=t.extensions||{},t.extensions[this.name]=s,i[this.name]=!0}}class Qf{constructor(e){this.writer=e,this.name="KHR_materials_iridescence"}writeMaterial(e,t){if(!e.isMeshPhysicalMaterial)return;const n=this.writer,i=n.extensionsUsed,s={};if(s.iridescenceFactor=e.iridescence,e.iridescenceMap){const t={index:n.processTexture(e.iridescenceMap)};n.applyTextureTransform(t,e.iridescenceMap),s.iridescenceTexture=t}if(s.iridescenceIor=e.iridescenceIOR,s.iridescenceThicknessMinimum=e.iridescenceThicknessRange[0],s.iridescenceThicknessMaximum=e.iridescenceThicknessRange[1],e.iridescenceThicknessMap){const t={index:n.processTexture(e.iridescenceThicknessMap)};n.applyTextureTransform(t,e.iridescenceThicknessMap),s.iridescenceThicknessTexture=t}t.extensions=t.extensions||{},t.extensions[this.name]=s,i[this.name]=!0}}class qf{constructor(e){this.writer=e,this.name="KHR_materials_transmission"}writeMaterial(e,t){if(!e.isMeshPhysicalMaterial||0===e.transmission)return;const n=this.writer,i=n.extensionsUsed,s={};if(s.transmissionFactor=e.transmission,e.transmissionMap){const t={index:n.processTexture(e.transmissionMap)};n.applyTextureTransform(t,e.transmissionMap),s.transmissionTexture=t}t.extensions=t.extensions||{},t.extensions[this.name]=s,i[this.name]=!0}}class $f{constructor(e){this.writer=e,this.name="KHR_materials_volume"}writeMaterial(e,t){if(!e.isMeshPhysicalMaterial||0===e.transmission)return;const n=this.writer,i=n.extensionsUsed,s={};if(s.thicknessFactor=e.thickness,e.thicknessMap){const t={index:n.processTexture(e.thicknessMap)};n.applyTextureTransform(t,e.thicknessMap),s.thicknessTexture=t}s.attenuationDistance=e.attenuationDistance,s.attenuationColor=e.attenuationColor.toArray(),t.extensions=t.extensions||{},t.extensions[this.name]=s,i[this.name]=!0}}bf.Utils={insertKeyframe:function(e,t){const n=.001,i=e.getValueSize(),s=new e.TimeBufferType(e.times.length+1),r=new e.ValueBufferType(e.values.length+i),o=e.createInterpolant(new e.ValueBufferType(i));let a;if(0===e.times.length){s[0]=t;for(let e=0;e<i;e++)r[e]=0;a=0}else if(t<e.times[0]){if(Math.abs(e.times[0]-t)<n)return 0;s[0]=t,s.set(e.times,1),r.set(o.evaluate(t),0),r.set(e.values,i),a=0}else if(t>e.times[e.times.length-1]){if(Math.abs(e.times[e.times.length-1]-t)<n)return e.times.length-1;s[s.length-1]=t,s.set(e.times,0),r.set(e.values,0),r.set(o.evaluate(t),e.values.length),a=s.length-1}else for(let l=0;l<e.times.length;l++){if(Math.abs(e.times[l]-t)<n)return l;if(e.times[l]<t&&e.times[l+1]>t){s.set(e.times.slice(0,l+1),0),s[l+1]=t,s.set(e.times.slice(l+1),l+2),r.set(e.values.slice(0,(l+1)*i),0),r.set(o.evaluate(t),(l+1)*i),r.set(e.values.slice((l+1)*i),(l+2)*i),a=l+1;break}}return e.times=s,e.values=r,a},mergeMorphTargetTracks:function(e,t){const n=[],i={},s=e.tracks;for(let e=0;e<s.length;++e){let r=s[e];const o=Lu.parseTrackName(r.name),a=Lu.findNode(t,o.nodeName);if("morphTargetInfluences"!==o.propertyName||void 0===o.propertyIndex){n.push(r);continue}if(r.createInterpolant!==r.InterpolantFactoryMethodDiscrete&&r.createInterpolant!==r.InterpolantFactoryMethodLinear){if(r.createInterpolant.isInterpolantFactoryMethodGLTFCubicSpline)throw new Error("THREE.GLTFExporter: Cannot merge tracks with glTF CUBICSPLINE interpolation.");console.warn("THREE.GLTFExporter: Morph target interpolation mode not yet supported. Using LINEAR instead."),r=r.clone(),r.setInterpolation(2301)}const l=a.morphTargetInfluences.length,c=a.morphTargetDictionary[o.propertyIndex];if(void 0===c)throw new Error("THREE.GLTFExporter: Morph target name not found: "+o.propertyIndex);let h;if(void 0===i[a.uuid]){h=r.clone();const e=new h.ValueBufferType(l*h.times.length);for(let t=0;t<h.times.length;t++)e[t*l+c]=h.values[t];h.name=(o.nodeName||"")+".morphTargetInfluences",h.values=e,i[a.uuid]=h,n.push(h);continue}const d=r.createInterpolant(new r.ValueBufferType(1));h=i[a.uuid];for(let e=0;e<h.times.length;e++)h.values[e*l+c]=d.evaluate(h.times[e]);for(let e=0;e<r.times.length;e++){const t=this.insertKeyframe(h,r.times[e]);h.values[t*l+c]=r.values[e]}}return e.tracks=n,e}};const eg=Object.prototype.hasOwnProperty,tg=e=>"String"===ag(e),ng=e=>"Boolean"===ag(e),ig=e=>"Number"===ag(e),sg=Array.isArray,rg=e=>"Object"===ag(e),og=e=>"Function"===ag(e),ag=e=>Object.prototype.toString.call(e).slice(8,-1),lg=(e,t,n)=>String.fromCodePoint(...new Uint8Array(e,t,n)),cg=()=>"[soonspacejs]: "+Math.random().toString(36).substring(7).split("").join("_");var hg=Object.freeze({__proto__:null,hasOwn:(e,t)=>eg.call(e,t),isString:tg,isBoolean:ng,isNumber:ig,isNull:e=>"Null"===ag(e),isUndefined:e=>"Undefined"===ag(e),isSymbol:e=>"Symbol"===ag(e),isDate:e=>"Date"===ag(e),isArray:sg,isObject:rg,isFunction:og,isPromise:e=>"Promise"===ag(e),getValueType:ag,sleep:e=>new Promise((t=>setTimeout((()=>t()),e))),getAsciiString:lg,randomString:cg,exportGltf:function(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return new Promise(((n,i)=>{(new bf).parse(e,(e=>n(e)),(e=>i(e)),t)}))},log:Nm,warn:Vm,error:e=>{console.error("In soonspacejs: "+e)},IVector3ToVector3:Dm,IVector3ToEuler:Bm,getBoundingBox:Hm,rotationAxisFix:km,rotationAFix:Fm,deg2Euler:Um,euler2Deg:function(e){return e/(Math.PI/180)},getSpaceAttributeFromObject:Om,syncSpaceAttributeToObject:Ym,isObjectVisible:Km,MinHeap:jm,getCubeTexture:Jm,gradientTexture:Qm,parseFilePath:qm,cloneDeep:$m,cloneMaterials:ef,fetchFile:mf,idleTask:ff,xmlToJson:yf});const dg={"Linear.None":Mm.Linear.None,"Quadratic.In":Mm.Quadratic.In,"Quadratic.Out":Mm.Quadratic.Out,"Quadratic.InOut":Mm.Quadratic.InOut,"Cubic.In":Mm.Cubic.In,"Cubic.Out":Mm.Cubic.Out,"Cubic.InOut":Mm.Cubic.InOut,"Quartic.In":Mm.Quartic.In,"Quartic.Out":Mm.Quartic.Out,"Quartic.InOut":Mm.Quartic.InOut,"Quintic.In":Mm.Quintic.In,"Quintic.Out":Mm.Quintic.Out,"Quintic.InOut":Mm.Quintic.InOut,"Sinusoidal.In":Mm.Sinusoidal.In,"Sinusoidal.Out":Mm.Sinusoidal.Out,"Sinusoidal.InOut":Mm.Sinusoidal.InOut,"Exponential.In":Mm.Exponential.In,"Exponential.Out":Mm.Exponential.Out,"Exponential.InOut":Mm.Exponential.InOut,"Circular.In":Mm.Circular.In,"Circular.Out":Mm.Circular.Out,"Circular.InOut":Mm.Circular.InOut,"Elastic.In":Mm.Elastic.In,"Elastic.Out":Mm.Elastic.Out,"Elastic.InOut":Mm.Elastic.InOut,"Back.In":Mm.Back.In,"Back.Out":Mm.Back.Out,"Back.InOut":Mm.Back.InOut,"Bounce.In":Mm.Bounce.In,"Bounce.Out":Mm.Bounce.Out,"Bounce.InOut":Mm.Bounce.InOut};function ug(e,t){let n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},i=arguments.length>3?arguments[3]:void 0,s=arguments.length>4?arguments[4]:void 0;return new Promise((r=>{const{duration:o=1e3,delay:a=0,repeat:l=!1,mode:c="Linear.None",yoyo:h=!1}=n,d=dg[c],u=new Am(e).to(t,o).easing(d).delay(a).onUpdate((n=>{e instanceof Oi&&t instanceof Oi&&n instanceof Oi&&(n.order=t.order),null==i||i(n,u)})).onComplete((()=>{u.stop(),r()})).onStart((()=>{null==s||s(u)}));ig(l)?u.repeat(l):ng(l)&&l&&u.repeat(1/0),u.yoyo(h),u.start()}))}const pg=Math.pow(2,-24);class mg{constructor(){}}function fg(e,t,n){return n.min.x=t[e],n.min.y=t[e+1],n.min.z=t[e+2],n.max.x=t[e+3],n.max.y=t[e+4],n.max.z=t[e+5],n}function gg(e){let t=-1,n=-1/0;for(let i=0;i<3;i++){const s=e[i+3]-e[i];s>n&&(n=s,t=i)}return t}function yg(e,t){t.set(e)}function bg(e,t,n){let i,s;for(let r=0;r<3;r++){const o=r+3;i=e[r],s=t[r],n[r]=i<s?i:s,i=e[o],s=t[o],n[o]=i>s?i:s}}function vg(e,t,n){for(let i=0;i<3;i++){const s=t[e+2*i],r=t[e+2*i+1],o=s-r,a=s+r;o<n[i]&&(n[i]=o),a>n[i+3]&&(n[i+3]=a)}}function xg(e){const t=e[3]-e[0],n=e[4]-e[1],i=e[5]-e[2];return 2*(t*n+n*i+i*t)}function wg(e,t,n,i){let s=arguments.length>4&&void 0!==arguments[4]?arguments[4]:null,r=1/0,o=1/0,a=1/0,l=-1/0,c=-1/0,h=-1/0,d=1/0,u=1/0,p=1/0,m=-1/0,f=-1/0,g=-1/0;const y=null!==s;for(let i=6*t,s=6*(t+n);i<s;i+=6){const t=e[i+0],n=e[i+1],s=t-n,b=t+n;s<r&&(r=s),b>l&&(l=b),y&&t<d&&(d=t),y&&t>m&&(m=t);const v=e[i+2],x=e[i+3],w=v-x,S=v+x;w<o&&(o=w),S>c&&(c=S),y&&v<u&&(u=v),y&&v>f&&(f=v);const M=e[i+4],T=e[i+5],C=M-T,L=M+T;C<a&&(a=C),L>h&&(h=L),y&&M<p&&(p=M),y&&M>g&&(g=M)}i[0]=r,i[1]=o,i[2]=a,i[3]=l,i[4]=c,i[5]=h,y&&(s[0]=d,s[1]=u,s[2]=p,s[3]=m,s[4]=f,s[5]=g)}function Sg(e,t,n,i,s){let r=n,o=n+i-1;const a=s.pos,l=2*s.axis;for(;;){for(;r<=o&&t[6*r+l]<a;)r++;for(;r<=o&&t[6*o+l]>=a;)o--;if(!(r<o))return r;for(let n=0;n<3;n++){let i=e[3*r+n];e[3*r+n]=e[3*o+n],e[3*o+n]=i;let s=t[6*r+2*n+0];t[6*r+2*n+0]=t[6*o+2*n+0],t[6*o+2*n+0]=s;let a=t[6*r+2*n+1];t[6*r+2*n+1]=t[6*o+2*n+1],t[6*o+2*n+1]=a}r++,o--}}const Mg=(e,t)=>e.candidate-t.candidate,Tg=new Array(32).fill().map((()=>({count:0,bounds:new Float32Array(6),rightCacheBounds:new Float32Array(6),leftCacheBounds:new Float32Array(6),candidate:0}))),Cg=new Float32Array(6);function Lg(e,t,n,i,s,r){let o=-1,a=0;if(0===r)o=gg(t),-1!==o&&(a=(t[o]+t[o+3])/2);else if(1===r)o=gg(e),-1!==o&&(a=function(e,t,n,i){let s=0;for(let r=t,o=t+n;r<o;r++)s+=e[6*r+2*i];return s/n}(n,i,s,o));else if(2===r){const r=xg(e);let l=1.25*s;const c=6*i,h=6*(i+s);for(let e=0;e<3;e++){const i=t[e],d=(t[e+3]-i)/32;if(s<8){const t=[...Tg];t.length=s;let i=0;for(let s=c;s<h;s+=6,i++){const r=t[i];r.candidate=n[s+2*e],r.count=0;const{bounds:o,leftCacheBounds:a,rightCacheBounds:l}=r;for(let e=0;e<3;e++)l[e]=1/0,l[e+3]=-1/0,a[e]=1/0,a[e+3]=-1/0,o[e]=1/0,o[e+3]=-1/0;vg(s,n,o)}t.sort(Mg);let d=s;for(let e=0;e<d;e++){const n=t[e];for(;e+1<d&&t[e+1].candidate===n.candidate;)t.splice(e+1,1),d--}for(let i=c;i<h;i+=6){const s=n[i+2*e];for(let e=0;e<d;e++){const r=t[e];s>=r.candidate?vg(i,n,r.rightCacheBounds):(vg(i,n,r.leftCacheBounds),r.count++)}}for(let n=0;n<d;n++){const i=t[n],c=i.count,h=s-i.count,d=i.leftCacheBounds,u=i.rightCacheBounds;let p=0;0!==c&&(p=xg(d)/r);let m=0;0!==h&&(m=xg(u)/r);const f=1+1.25*(p*c+m*h);f<l&&(o=e,l=f,a=i.candidate)}}else{for(let e=0;e<32;e++){const t=Tg[e];t.count=0,t.candidate=i+d+e*d;const n=t.bounds;for(let e=0;e<3;e++)n[e]=1/0,n[e+3]=-1/0}for(let t=c;t<h;t+=6){let s=~~((n[t+2*e]-i)/d);s>=32&&(s=31);const r=Tg[s];r.count++,vg(t,n,r.bounds)}const t=Tg[31];yg(t.bounds,t.rightCacheBounds);for(let e=30;e>=0;e--){const t=Tg[e],n=Tg[e+1];bg(t.bounds,n.rightCacheBounds,t.rightCacheBounds)}let u=0;for(let t=0;t<31;t++){const n=Tg[t],i=n.count,c=n.bounds,h=Tg[t+1].rightCacheBounds;0!==i&&(0===u?yg(c,Cg):bg(c,Cg,Cg)),u+=i;let d=0,p=0;0!==u&&(d=xg(Cg)/r);const m=s-u;0!==m&&(p=xg(h)/r);const f=1+1.25*(d*u+p*m);f<l&&(o=e,l=f,a=n.candidate)}}}}else console.warn(`MeshBVH: Invalid build strategy value ${r} used.`);return{axis:o,pos:a}}function Rg(e,t){function n(e){u&&u(e/p)}function i(t,s,u){let p=arguments.length>3&&void 0!==arguments[3]?arguments[3]:null,f=arguments.length>4&&void 0!==arguments[4]?arguments[4]:0;if(!m&&f>=l&&(m=!0,c&&(console.warn(`MeshBVH: Max depth of ${l} reached when generating BVH. Consider increasing maxDepth.`),console.warn(e))),u<=h||f>=l)return n(s+u),t.offset=s,t.count=u,t;const g=Lg(t.boundingData,p,o,s,u,d);if(-1===g.axis)return n(s+u),t.offset=s,t.count=u,t;const y=Sg(a,o,s,u,g);if(y===s||y===s+u)n(s+u),t.offset=s,t.count=u;else{t.splitAxis=g.axis;const e=new mg,n=s,a=y-s;t.left=e,e.boundingData=new Float32Array(6),wg(o,n,a,e.boundingData,r),i(e,n,a,r,f+1);const l=new mg,c=y,h=u-a;t.right=l,l.boundingData=new Float32Array(6),wg(o,c,h,l.boundingData,r),i(l,c,h,r,f+1)}return t}!function(e,t){if(!e.index){const n=e.attributes.position.count,i=t.useSharedArrayBuffer?SharedArrayBuffer:ArrayBuffer;let s;s=n>65535?new Uint32Array(new i(4*n)):new Uint16Array(new i(2*n)),e.setIndex(new Ts(s,1));for(let e=0;e<n;e++)s[e]=e}}(e,t);const s=new Float32Array(6),r=new Float32Array(6),o=function(e,t){const n=e.attributes.position,i=n.array,s=e.index.array,r=s.length/3,o=new Float32Array(6*r),a=n.offset||0;let l=3;n.isInterleavedBufferAttribute&&(l=n.data.stride);for(let e=0;e<r;e++){const n=3*e,r=6*e,c=s[n+0]*l+a,h=s[n+1]*l+a,d=s[n+2]*l+a;for(let e=0;e<3;e++){const n=i[c+e],s=i[h+e],a=i[d+e];let l=n;s<l&&(l=s),a<l&&(l=a);let u=n;s>u&&(u=s),a>u&&(u=a);const p=(u-l)/2,m=2*e;o[r+m+0]=l+p,o[r+m+1]=p+(Math.abs(l)+p)*pg,l<t[e]&&(t[e]=l),u>t[e+3]&&(t[e+3]=u)}}return o}(e,s),a=e.index.array,l=t.maxDepth,c=t.verbose,h=t.maxLeafTris,d=t.strategy,u=t.onProgress,p=e.index.count/3;let m=!1;const f=[],g=function(e){if(!e.groups||!e.groups.length)return[{offset:0,count:e.index.count/3}];const t=[],n=new Set;for(const t of e.groups)n.add(t.start),n.add(t.start+t.count);const i=Array.from(n.values()).sort(((e,t)=>e-t));for(let e=0;e<i.length-1;e++){const n=i[e],s=i[e+1];t.push({offset:n/3,count:(s-n)/3})}return t}(e);if(1===g.length){const e=g[0],t=new mg;t.boundingData=s,function(e,t,n,i){let s=1/0,r=1/0,o=1/0,a=-1/0,l=-1/0,c=-1/0;for(let i=6*t,h=6*(t+n);i<h;i+=6){const t=e[i+0];t<s&&(s=t),t>a&&(a=t);const n=e[i+2];n<r&&(r=n),n>l&&(l=n);const h=e[i+4];h<o&&(o=h),h>c&&(c=h)}i[0]=s,i[1]=r,i[2]=o,i[3]=a,i[4]=l,i[5]=c}(o,e.offset,e.count,r),i(t,e.offset,e.count,r),f.push(t)}else for(let e of g){const t=new mg;t.boundingData=new Float32Array(6),wg(o,e.offset,e.count,t.boundingData,r),i(t,e.offset,e.count,r),f.push(t)}return f}class Gg{constructor(){this.min=1/0,this.max=-1/0}setFromPointsField(e,t){let n=1/0,i=-1/0;for(let s=0,r=e.length;s<r;s++){const r=e[s][t];n=r<n?r:n,i=r>i?r:i}this.min=n,this.max=i}setFromPoints(e,t){let n=1/0,i=-1/0;for(let s=0,r=t.length;s<r;s++){const r=t[s],o=e.dot(r);n=o<n?o:n,i=o>i?o:i}this.min=n,this.max=i}isSeparated(e){return this.min>e.max||e.min>this.max}}Gg.prototype.setFromBox=function(){const e=new ri;return function(t,n){const i=n.min,s=n.max;let r=1/0,o=-1/0;for(let n=0;n<=1;n++)for(let a=0;a<=1;a++)for(let l=0;l<=1;l++){e.x=i.x*n+s.x*(1-n),e.y=i.y*a+s.y*(1-a),e.z=i.z*l+s.z*(1-l);const c=t.dot(e);r=Math.min(c,r),o=Math.max(c,o)}this.min=r,this.max=o}}(),function(){const e=new Gg}();const Ag=function(){const e=new ri,t=new ri,n=new ri;return function(i,s,r){const o=i.start,a=e,l=s.start,c=t;n.subVectors(o,l),e.subVectors(i.end,i.start),t.subVectors(s.end,s.start);const h=n.dot(c),d=c.dot(a),u=c.dot(c),p=n.dot(a),m=a.dot(a)*u-d*d;let f,g;f=0!==m?(h*d-p*u)/m:0,g=(h+f*d)/u,r.x=f,r.y=g}}(),_g=function(){const e=new Gn,t=new ri,n=new ri;return function(i,s,r,o){Ag(i,s,e);let a=e.x,l=e.y;if(a>=0&&a<=1&&l>=0&&l<=1)return i.at(a,r),void s.at(l,o);if(a>=0&&a<=1)return l<0?s.at(0,o):s.at(1,o),void i.closestPointToPoint(o,!0,r);if(l>=0&&l<=1)return a<0?i.at(0,r):i.at(1,r),void s.closestPointToPoint(r,!0,o);{let e,c;e=a<0?i.start:i.end,c=l<0?s.start:s.end;const h=t,d=n;return i.closestPointToPoint(c,!0,t),s.closestPointToPoint(e,!0,n),h.distanceToSquared(c)<=d.distanceToSquared(e)?(r.copy(h),void o.copy(c)):(r.copy(e),void o.copy(d))}}}(),Ig=function(){const e=new ri,t=new ri,n=new wr,i=new ku;return function(s,r){const{radius:o,center:a}=s,{a:l,b:c,c:h}=r;i.start=l,i.end=c;if(i.closestPointToPoint(a,!0,e).distanceTo(a)<=o)return!0;i.start=l,i.end=h;if(i.closestPointToPoint(a,!0,e).distanceTo(a)<=o)return!0;i.start=c,i.end=h;if(i.closestPointToPoint(a,!0,e).distanceTo(a)<=o)return!0;const d=r.getPlane(n);if(Math.abs(d.distanceToPoint(a))<=o){const e=d.projectPoint(a,t);if(r.containsPoint(e))return!0}return!1}}();function Eg(e){return Math.abs(e)<1e-15}class Xg extends bs{constructor(){super(...arguments),this.isExtendedTriangle=!0,this.satAxes=new Array(4).fill().map((()=>new ri)),this.satBounds=new Array(4).fill().map((()=>new Gg)),this.points=[this.a,this.b,this.c],this.sphere=new Ri,this.plane=new wr,this.needsUpdate=!0}intersectsSphere(e){return Ig(e,this)}update(){const e=this.a,t=this.b,n=this.c,i=this.points,s=this.satAxes,r=this.satBounds,o=s[0],a=r[0];this.getNormal(o),a.setFromPoints(o,i);const l=s[1],c=r[1];l.subVectors(e,t),c.setFromPoints(l,i);const h=s[2],d=r[2];h.subVectors(t,n),d.setFromPoints(h,i);const u=s[3],p=r[3];u.subVectors(n,e),p.setFromPoints(u,i),this.sphere.setFromPoints(this.points),this.plane.setFromNormalAndCoplanarPoint(o,e),this.needsUpdate=!1}}Xg.prototype.closestPointToSegment=function(){const e=new ri,t=new ri,n=new ku;return function(i){let s=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null,r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:null;const{start:o,end:a}=i,l=this.points;let c,h=1/0;for(let o=0;o<3;o++){const a=(o+1)%3;n.start.copy(l[o]),n.end.copy(l[a]),_g(n,i,e,t),c=e.distanceToSquared(t),c<h&&(h=c,s&&s.copy(e),r&&r.copy(t))}return this.closestPointToPoint(o,e),c=o.distanceToSquared(e),c<h&&(h=c,s&&s.copy(e),r&&r.copy(o)),this.closestPointToPoint(a,e),c=a.distanceToSquared(e),c<h&&(h=c,s&&s.copy(e),r&&r.copy(a)),Math.sqrt(h)}}(),Xg.prototype.intersectsTriangle=function(){const e=new Xg,t=new Array(3),n=new Array(3),i=new Gg,s=new Gg,r=new ri,o=new ri,a=new ri,l=new ri,c=new ku,h=new ku,d=new ku;return function(u){let p=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null;this.needsUpdate&&this.update(),u.isExtendedTriangle?u.needsUpdate&&u.update():(e.copy(u),e.update(),u=e);const m=this.plane,f=u.plane;if(Math.abs(m.normal.dot(f.normal))>1-1e-10){const e=this.satBounds,o=this.satAxes;n[0]=u.a,n[1]=u.b,n[2]=u.c;for(let t=0;t<4;t++){const s=e[t],r=o[t];if(i.setFromPoints(r,n),s.isSeparated(i))return!1}const a=u.satBounds,l=u.satAxes;t[0]=this.a,t[1]=this.b,t[2]=this.c;for(let e=0;e<4;e++){const n=a[e],s=l[e];if(i.setFromPoints(s,t),n.isSeparated(i))return!1}for(let e=0;e<4;e++){const a=o[e];for(let e=0;e<4;e++){const o=l[e];if(r.crossVectors(a,o),i.setFromPoints(r,t),s.setFromPoints(r,n),i.isSeparated(s))return!1}}return p&&(console.warn("ExtendedTriangle.intersectsTriangle: Triangles are coplanar which does not support an output edge. Setting edge to 0, 0, 0."),p.start.set(0,0,0),p.end.set(0,0,0)),!0}{const e=this.points;let t=!1,n=0;for(let i=0;i<3;i++){const s=e[i],r=e[(i+1)%3];c.start.copy(s),c.end.copy(r),c.delta(o);const a=t?h.start:h.end,l=Eg(f.distanceToPoint(s));if(Eg(f.normal.dot(o))&&l){h.copy(c),n=2;break}if((f.intersectLine(c,a)||l)&&!Eg(a.distanceTo(r))){if(n++,t)break;t=!0}}if(1===n&&this.containsPoint(h.end))return p&&(p.start.copy(h.end),p.end.copy(h.end)),!0;if(2!==n)return!1;const i=u.points;let s=!1,r=0;for(let e=0;e<3;e++){const t=i[e],n=i[(e+1)%3];c.start.copy(t),c.end.copy(n),c.delta(a);const o=s?d.start:d.end,l=Eg(m.distanceToPoint(t));if(Eg(m.normal.dot(a))&&l){d.copy(c),r=2;break}if((m.intersectLine(c,o)||l)&&!Eg(o.distanceTo(n))){if(r++,s)break;s=!0}}if(1===r&&this.containsPoint(d.end))return p&&(p.start.copy(d.end),p.end.copy(d.end)),!0;if(2!==r)return!1;if(h.delta(o),d.delta(a),o.dot(a)<0){let e=d.start;d.start=d.end,d.end=e}const g=h.start.dot(o),y=h.end.dot(o),b=d.start.dot(o),v=d.end.dot(o),x=y<b,w=g<v;return(g===v||b===y||x!==w)&&(p&&(l.subVectors(h.start,d.start),l.dot(o)>0?p.start.copy(h.start):p.start.copy(d.start),l.subVectors(h.end,d.end),l.dot(o)<0?p.end.copy(h.end):p.end.copy(d.end)),!0)}}}(),Xg.prototype.distanceToPoint=function(){const e=new ri;return function(t){return this.closestPointToPoint(t,e),t.distanceTo(e)}}(),Xg.prototype.distanceToTriangle=function(){const e=new ri,t=new ri,n=["a","b","c"],i=new ku,s=new ku;return function(r){let o=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null,a=arguments.length>2&&void 0!==arguments[2]?arguments[2]:null;const l=o||a?i:null;if(this.intersectsTriangle(r,l))return(o||a)&&(o&&l.getCenter(o),a&&l.getCenter(a)),0;let c=1/0;for(let t=0;t<3;t++){let i;const s=n[t],l=r[s];this.closestPointToPoint(l,e),i=l.distanceToSquared(e),i<c&&(c=i,o&&o.copy(e),a&&a.copy(l));const h=this[s];r.closestPointToPoint(h,e),i=h.distanceToSquared(e),i<c&&(c=i,o&&o.copy(h),a&&a.copy(e))}for(let l=0;l<3;l++){const h=n[l],d=n[(l+1)%3];i.set(this[h],this[d]);for(let l=0;l<3;l++){const h=n[l],d=n[(l+1)%3];s.set(r[h],r[d]),_g(i,s,e,t);const u=e.distanceToSquared(t);u<c&&(c=u,o&&o.copy(e),a&&a.copy(t))}}return Math.sqrt(c)}}();class zg extends li{constructor(){super(...arguments),this.isOrientedBox=!0,this.matrix=new Wi,this.invMatrix=new Wi,this.points=new Array(8).fill().map((()=>new ri)),this.satAxes=new Array(3).fill().map((()=>new ri)),this.satBounds=new Array(3).fill().map((()=>new Gg)),this.alignedSatBounds=new Array(3).fill().map((()=>new Gg)),this.needsUpdate=!1}set(e,t,n){super.set(e,t),this.matrix.copy(n),this.needsUpdate=!0}copy(e){super.copy(e),this.matrix.copy(e.matrix),this.needsUpdate=!0}}zg.prototype.update=function(){const e=this.matrix,t=this.min,n=this.max,i=this.points;for(let s=0;s<=1;s++)for(let r=0;r<=1;r++)for(let o=0;o<=1;o++){const a=i[1*s|2*r|4*o];a.x=s?n.x:t.x,a.y=r?n.y:t.y,a.z=o?n.z:t.z,a.applyMatrix4(e)}const s=this.satBounds,r=this.satAxes,o=i[0];for(let e=0;e<3;e++){const t=r[e],n=s[e],a=i[1<<e];t.subVectors(o,a),n.setFromPoints(t,i)}const a=this.alignedSatBounds;a[0].setFromPointsField(i,"x"),a[1].setFromPointsField(i,"y"),a[2].setFromPointsField(i,"z"),this.invMatrix.copy(this.matrix).invert(),this.needsUpdate=!1},zg.prototype.intersectsBox=function(){const e=new Gg;return function(t){this.needsUpdate&&this.update();const n=t.min,i=t.max,s=this.satBounds,r=this.satAxes,o=this.alignedSatBounds;if(e.min=n.x,e.max=i.x,o[0].isSeparated(e))return!1;if(e.min=n.y,e.max=i.y,o[1].isSeparated(e))return!1;if(e.min=n.z,e.max=i.z,o[2].isSeparated(e))return!1;for(let n=0;n<3;n++){const i=r[n],o=s[n];if(e.setFromBox(i,t),o.isSeparated(e))return!1}return!0}}(),zg.prototype.intersectsTriangle=function(){const e=new Xg,t=new Array(3),n=new Gg,i=new Gg,s=new ri;return function(r){this.needsUpdate&&this.update(),r.isExtendedTriangle?r.needsUpdate&&r.update():(e.copy(r),e.update(),r=e);const o=this.satBounds,a=this.satAxes;t[0]=r.a,t[1]=r.b,t[2]=r.c;for(let e=0;e<3;e++){const i=o[e],s=a[e];if(n.setFromPoints(s,t),i.isSeparated(n))return!1}const l=r.satBounds,c=r.satAxes,h=this.points;for(let e=0;e<3;e++){const t=l[e],i=c[e];if(n.setFromPoints(i,h),t.isSeparated(n))return!1}for(let e=0;e<3;e++){const r=a[e];for(let e=0;e<4;e++){const o=c[e];if(s.crossVectors(r,o),n.setFromPoints(s,t),i.setFromPoints(s,h),n.isSeparated(i))return!1}}return!0}}(),zg.prototype.closestPointToPoint=function(e,t){return this.needsUpdate&&this.update(),t.copy(e).applyMatrix4(this.invMatrix).clamp(this.min,this.max).applyMatrix4(this.matrix),t},zg.prototype.distanceToPoint=function(){const e=new ri;return function(t){return this.closestPointToPoint(t,e),t.distanceTo(e)}}(),zg.prototype.distanceToBox=function(){const e=["x","y","z"],t=new Array(12).fill().map((()=>new ku)),n=new Array(12).fill().map((()=>new ku)),i=new ri,s=new ri;return function(r){let o=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,a=arguments.length>2&&void 0!==arguments[2]?arguments[2]:null,l=arguments.length>3&&void 0!==arguments[3]?arguments[3]:null;if(this.needsUpdate&&this.update(),this.intersectsBox(r))return(a||l)&&(r.getCenter(s),this.closestPointToPoint(s,i),r.closestPointToPoint(i,s),a&&a.copy(i),l&&l.copy(s)),0;const c=o*o,h=r.min,d=r.max,u=this.points;let p=1/0;for(let e=0;e<8;e++){const t=u[e];s.copy(t).clamp(h,d);const n=t.distanceToSquared(s);if(n<p&&(p=n,a&&a.copy(t),l&&l.copy(s),n<c))return Math.sqrt(n)}let m=0;for(let i=0;i<3;i++)for(let s=0;s<=1;s++)for(let r=0;r<=1;r++){const o=(i+1)%3,a=(i+2)%3,l=1<<i|s<<o|r<<a,c=u[s<<o|r<<a],p=u[l];t[m].set(c,p);const f=e[i],g=e[o],y=e[a],b=n[m],v=b.start,x=b.end;v[f]=h[f],v[g]=s?h[g]:d[g],v[y]=r?h[y]:d[g],x[f]=d[f],x[g]=s?h[g]:d[g],x[y]=r?h[y]:d[g],m++}for(let e=0;e<=1;e++)for(let t=0;t<=1;t++)for(let n=0;n<=1;n++){s.x=e?d.x:h.x,s.y=t?d.y:h.y,s.z=n?d.z:h.z,this.closestPointToPoint(s,i);const r=s.distanceToSquared(i);if(r<p&&(p=r,a&&a.copy(i),l&&l.copy(s),r<c))return Math.sqrt(r)}for(let e=0;e<12;e++){const r=t[e];for(let e=0;e<12;e++){const t=n[e];_g(r,t,i,s);const o=i.distanceToSquared(s);if(o<p&&(p=o,a&&a.copy(i),l&&l.copy(s),o<c))return Math.sqrt(o)}}return Math.sqrt(p)}}();const Pg=new ri,Wg=new ri,Zg=new ri,Ng=new Gn,Vg=new Gn,Dg=new Gn,Bg=new ri;function Hg(e,t,n,i,s){const r=3*i,o=e.index.getX(r),a=e.index.getX(r+1),l=e.index.getX(r+2),c=function(e,t,n,i,s,r,o){Pg.fromBufferAttribute(t,i),Wg.fromBufferAttribute(t,s),Zg.fromBufferAttribute(t,r);const a=function(e,t,n,i,s,r){let o;return o=1===r?e.intersectTriangle(i,n,t,!0,s):e.intersectTriangle(t,n,i,2!==r,s),null===o?null:{distance:e.origin.distanceTo(s),point:s.clone()}}(e,Pg,Wg,Zg,Bg,o);if(a){n&&(Ng.fromBufferAttribute(n,i),Vg.fromBufferAttribute(n,s),Dg.fromBufferAttribute(n,r),a.uv=bs.getUV(Bg,Pg,Wg,Zg,Ng,Vg,Dg,new Gn));const e={a:i,b:s,c:r,normal:new ri,materialIndex:0};bs.getNormal(Pg,Wg,Zg,e.normal),a.face=e,a.faceIndex=i}return a}(n,e.attributes.position,e.attributes.uv,o,a,l,t);return c?(c.faceIndex=i,s&&s.push(c),c):null}function kg(e,t,n){return null===e?null:(e.point.applyMatrix4(t.matrixWorld),e.distance=e.point.distanceTo(n.ray.origin),e.object=t,e.distance<n.near||e.distance>n.far?null:e)}function Fg(e,t,n,i){const s=e.a,r=e.b,o=e.c;let a=t,l=t+1,c=t+2;n&&(a=n.getX(t),l=n.getX(t+1),c=n.getX(t+2)),s.x=i.getX(a),s.y=i.getY(a),s.z=i.getZ(a),r.x=i.getX(l),r.y=i.getY(l),r.z=i.getZ(l),o.x=i.getX(c),o.y=i.getY(c),o.z=i.getZ(c)}function Ug(e,t,n,i,s,r,o){const a=n.index,l=n.attributes.position;for(let n=e,c=t+e;n<c;n++)if(Fg(o,3*n,a,l),o.needsUpdate=!0,i(o,n,s,r))return!0;return!1}class Og{constructor(e){this._getNewPrimitive=e,this._primitives=[]}getPrimitive(){const e=this._primitives;return 0===e.length?this._getNewPrimitive():e.pop()}releasePrimitive(e){this._primitives.push(e)}}function Yg(e,t){return 65535===t[e+15]}function Kg(e,t){return t[e+6]}function jg(e,t){return t[e+14]}function Jg(e){return e+8}function Qg(e,t){return t[e+6]}const qg=new li,$g=new ri,ey=["x","y","z"];function ty(e,t,n,i,s){let r=2*e,o=ly,a=cy,l=hy;if(Yg(r,a)){!function(e,t,n,i,s,r){for(let o=i,a=i+s;o<a;o++)Hg(e,t,n,o,r)}(t,n,i,Kg(e,l),jg(r,a),s)}else{const r=Jg(e);ry(r,o,i,$g)&&ty(r,t,n,i,s);const a=Qg(e,l);ry(a,o,i,$g)&&ty(a,t,n,i,s)}}function ny(e,t,n,i){let s=2*e,r=ly,o=cy,a=hy;if(Yg(s,o)){return function(e,t,n,i,s){let r=1/0,o=null;for(let a=i,l=i+s;a<l;a++){const i=Hg(e,t,n,a);i&&i.distance<r&&(o=i,r=i.distance)}return o}(t,n,i,Kg(e,a),jg(s,o))}{const s=function(e,t){return t[e+7]}(e,a),o=ey[s],l=i.direction[o]>=0;let c,h;l?(c=Jg(e),h=Qg(e,a)):(c=Qg(e,a),h=Jg(e));const d=ry(c,r,i,$g)?ny(c,t,n,i):null;if(d){const e=d.point[o];if(l?e<=r[h+s]:e>=r[h+s+3])return d}const u=ry(h,r,i,$g)?ny(h,t,n,i):null;return d&&u?d.distance<=u.distance?d:u:d||u||null}}const iy=function(){let e,t;const n=[],i=new Og((()=>new li));return function(){e=i.getPrimitive(),t=i.getPrimitive(),n.push(e,t);const r=s(...arguments);i.releasePrimitive(e),i.releasePrimitive(t),n.pop(),n.pop();const o=n.length;return o>0&&(t=n[o-1],e=n[o-2]),r};function s(n,i,r,o){let a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:null,l=arguments.length>5&&void 0!==arguments[5]?arguments[5]:0,c=arguments.length>6&&void 0!==arguments[6]?arguments[6]:0;function h(e){let t=2*e,n=cy,i=hy;for(;!Yg(t,n);)t=2*(e=Jg(e));return Kg(e,i)}function d(e){let t=2*e,n=cy,i=hy;for(;!Yg(t,n);)t=2*(e=Qg(e,i));return Kg(e,i)+jg(t,n)}let u=2*n,p=ly,m=cy,f=hy;const g=Yg(u,m);if(g){const t=Kg(n,f),i=jg(u,m);return fg(n,p,e),o(t,i,!1,c,l+n,e)}{const u=Jg(n),g=Qg(n,f);let y,b,v,x,w=u,S=g;if(a&&(v=e,x=t,fg(w,p,v),fg(S,p,x),y=a(v),b=a(x),b<y)){w=g,S=u;const e=y;y=b,b=e,v=x}v||(v=e,fg(w,p,v));const M=r(v,Yg(2*w,m),y,c+1,l+w);let T;if(2===M){const e=h(w);T=o(e,d(w)-e,!0,c+1,l+w,v)}else T=M&&s(w,i,r,o,a,l,c+1);if(T)return!0;x=t,fg(S,p,x);const C=r(x,Yg(2*S,m),b,c+1,l+S);let L;if(2===C){const e=h(S);L=o(e,d(S)-e,!0,c+1,l+S,x)}else L=C&&s(S,i,r,o,a,l,c+1);return!!L}}}(),sy=function(){const e=new Xg,t=new Xg,n=new Wi,i=new zg,s=new zg;return function r(o,a,l,c){let h=arguments.length>4&&void 0!==arguments[4]?arguments[4]:null,d=2*o,u=ly,p=cy,m=hy;null===h&&(l.boundingBox||l.computeBoundingBox(),i.set(l.boundingBox.min,l.boundingBox.max,c),h=i);const f=Yg(d,p);if(!f){const e=o+8,t=m[o+6];fg(e,u,qg);if(h.intersectsBox(qg)&&r(e,a,l,c,h))return!0;fg(t,u,qg);return!!(h.intersectsBox(qg)&&r(t,a,l,c,h))}{const i=a,r=i.index,h=i.attributes.position,f=l.index,g=l.attributes.position,y=Kg(o,m),b=jg(d,p);if(n.copy(c).invert(),l.boundsTree){fg(o,u,s),s.matrix.copy(n),s.needsUpdate=!0;return l.boundsTree.shapecast({intersectsBounds:e=>s.intersectsBox(e),intersectsTriangle:e=>{e.a.applyMatrix4(c),e.b.applyMatrix4(c),e.c.applyMatrix4(c),e.needsUpdate=!0;for(let n=3*y,i=3*(b+y);n<i;n+=3)if(Fg(t,n,r,h),t.needsUpdate=!0,e.intersectsTriangle(t))return!0;return!1}})}for(let i=3*y,s=b+3*y;i<s;i+=3){Fg(e,i,r,h),e.a.applyMatrix4(n),e.b.applyMatrix4(n),e.c.applyMatrix4(n),e.needsUpdate=!0;for(let n=0,i=f.count;n<i;n+=3)if(Fg(t,n,f,g),t.needsUpdate=!0,e.intersectsTriangle(t))return!0}}}}();function ry(e,t,n,i){return fg(e,t,qg),n.intersectBox(qg,i)}const oy=[];let ay,ly,cy,hy;function dy(e){ay&&oy.push(ay),ay=e,ly=new Float32Array(e),cy=new Uint16Array(e),hy=new Uint32Array(e)}function uy(){ay=null,ly=null,cy=null,hy=null,oy.length&&dy(oy.pop())}const py=Symbol("skip tree generation"),my=new li,fy=new li,gy=new Wi,yy=new zg,by=new zg,vy=new ri,xy=new ri,wy=new ri,Sy=new ri,My=new ri,Ty=new li,Cy=new Og((()=>new Xg));class Ly{static serialize(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if(t.isBufferGeometry)return console.warn("MeshBVH.serialize: The arguments for the function have changed. See documentation for new signature."),Ly.serialize(arguments[0],{cloneBuffers:void 0===arguments[2]||arguments[2]});t={cloneBuffers:!0,...t};const n=e.geometry,i=e._roots,s=n.getIndex();let r;return r=t.cloneBuffers?{roots:i.map((e=>e.slice())),index:s.array.slice()}:{roots:i,index:s.array},r}static deserialize(e,t){let n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};if("boolean"==typeof n)return console.warn("MeshBVH.deserialize: The arguments for the function have changed. See documentation for new signature."),Ly.deserialize(arguments[0],arguments[1],{setIndex:void 0===arguments[2]||arguments[2]});n={setIndex:!0,...n};const{index:i,roots:s}=e,r=new Ly(t,{...n,[py]:!0});if(r._roots=s,n.setIndex){const n=t.getIndex();if(null===n){const n=new Ts(e.index,1,!1);t.setIndex(n)}else n.array!==i&&(n.array.set(i),n.needsUpdate=!0)}return r}constructor(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if(!e.isBufferGeometry)throw new Error("MeshBVH: Only BufferGeometries are supported.");if(e.index&&e.index.isInterleavedBufferAttribute)throw new Error("MeshBVH: InterleavedBufferAttribute is not supported for the index attribute.");if(t=Object.assign({strategy:0,maxDepth:40,maxLeafTris:10,verbose:!0,useSharedArrayBuffer:!1,setBoundingBox:!0,onProgress:null,[py]:!1},t),t.useSharedArrayBuffer&&"undefined"==typeof SharedArrayBuffer)throw new Error("MeshBVH: SharedArrayBuffer is not available.");this._roots=null,t[py]||(this._roots=function(e,t){const n=Rg(e,t);let i,s,r;const o=[],a=t.useSharedArrayBuffer?SharedArrayBuffer:ArrayBuffer;for(let e=0;e<n.length;e++){const t=n[e],h=new a(32*l(t));i=new Float32Array(h),s=new Uint32Array(h),r=new Uint16Array(h),c(0,t),o.push(h)}return o;function l(e){return e.count?1:1+l(e.left)+l(e.right)}function c(e,t){const n=e/4,o=e/2,a=!!t.count,l=t.boundingData;for(let e=0;e<6;e++)i[n+e]=l[e];if(a){const i=t.offset,a=t.count;return s[n+6]=i,r[o+14]=a,r[o+15]=65535,e+32}{const i=t.left,r=t.right,o=t.splitAxis;let a;if(a=c(e+32,i),a/4>Math.pow(2,32))throw new Error("MeshBVH: Cannot store child pointer greater than 32 bits.");return s[n+6]=a/4,a=c(a,r),s[n+7]=o,a}}}(e,t),!e.boundingBox&&t.setBoundingBox&&(e.boundingBox=this.getBoundingBox(new li))),this.geometry=e}refit(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:null;e&&Array.isArray(e)&&(e=new Set(e));const t=this.geometry,n=t.index.array,i=t.attributes.position,s=i.array,r=i.offset||0;let o,a,l,c,h=3;i.isInterleavedBufferAttribute&&(h=i.data.stride);let d=0;const u=this._roots;for(let e=0,t=u.length;e<t;e++)o=u[e],a=new Uint32Array(o),l=new Uint16Array(o),c=new Float32Array(o),p(0,d),d+=o.byteLength;function p(t,i){let o=arguments.length>2&&void 0!==arguments[2]&&arguments[2];const d=2*t,u=65535===l[d+15];if(u){const e=a[t+6];let i=1/0,o=1/0,u=1/0,p=-1/0,m=-1/0,f=-1/0;for(let t=3*e,a=3*(e+l[d+14]);t<a;t++){const e=n[t]*h+r,a=s[e+0],l=s[e+1],c=s[e+2];a<i&&(i=a),a>p&&(p=a),l<o&&(o=l),l>m&&(m=l),c<u&&(u=c),c>f&&(f=c)}return(c[t+0]!==i||c[t+1]!==o||c[t+2]!==u||c[t+3]!==p||c[t+4]!==m||c[t+5]!==f)&&(c[t+0]=i,c[t+1]=o,c[t+2]=u,c[t+3]=p,c[t+4]=m,c[t+5]=f,!0)}{const n=t+8,s=a[t+6],r=n+i,l=s+i;let h=o,d=!1,u=!1;e?h||(d=e.has(r),u=e.has(l),h=!d&&!u):(d=!0,u=!0);const m=h||u;let f=!1;(h||d)&&(f=p(n,i,h));let g=!1;m&&(g=p(s,i,h));const y=f||g;if(y)for(let e=0;e<3;e++){const i=n+e,r=s+e,o=c[i],a=c[i+3],l=c[r],h=c[r+3];c[t+e]=o<l?o:l,c[t+e+3]=a>h?a:h}return y}}}traverse(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0;const n=this._roots[t],i=new Uint32Array(n),s=new Uint16Array(n);!function t(r){let o=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0;const a=2*r,l=65535===s[a+15];if(l){const t=i[r+6],c=s[a+14];e(o,l,new Float32Array(n,4*r,6),t,c)}else{const s=r+8,a=i[r+6],c=i[r+7];e(o,l,new Float32Array(n,4*r,6),c)||(t(s,o+1),t(a,o+1))}}(0)}raycast(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0;const n=this._roots,i=this.geometry,s=[],r=t.isMaterial,o=Array.isArray(t),a=i.groups,l=r?t.side:t;for(let r=0,c=n.length;r<c;r++){const c=o?t[a[r].materialIndex].side:l,h=s.length;if(dy(n[r]),ty(0,i,c,e,s),uy(),o){const e=a[r].materialIndex;for(let t=h,n=s.length;t<n;t++)s[t].face.materialIndex=e}}return s}raycastFirst(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0;const n=this._roots,i=this.geometry,s=t.isMaterial,r=Array.isArray(t);let o=null;const a=i.groups,l=s?t.side:t;for(let s=0,c=n.length;s<c;s++){const c=r?t[a[s].materialIndex].side:l;dy(n[s]);const h=ny(0,i,c,e);uy(),null!=h&&(null==o||h.distance<o.distance)&&(o=h,r&&(h.face.materialIndex=a[s].materialIndex))}return o}intersectsGeometry(e,t){const n=this.geometry;let i=!1;for(const s of this._roots)if(dy(s),i=sy(0,n,e,t),uy(),i)break;return i}shapecast(e,t,n){const i=this.geometry;if(e instanceof Function){if(t){const e=t;t=(t,n,i,s)=>{const r=3*n;return e(t,r,r+1,r+2,i,s)}}e={boundsTraverseOrder:n,intersectsBounds:e,intersectsTriangle:t,intersectsRange:null},console.warn("MeshBVH: Shapecast function signature has changed and now takes an object of callbacks as a second argument. See docs for new signature.")}const s=Cy.getPrimitive();let{boundsTraverseOrder:r,intersectsBounds:o,intersectsRange:a,intersectsTriangle:l}=e;if(a&&l){const e=a;a=(t,n,r,o,a)=>!!e(t,n,r,o,a)||Ug(t,n,i,l,r,o,s)}else a||(a=l?(e,t,n,r)=>Ug(e,t,i,l,n,r,s):(e,t,n)=>n);let c=!1,h=0;for(const e of this._roots){if(dy(e),c=iy(0,i,o,a,r,h),uy(),c)break;h+=e.byteLength}return Cy.releasePrimitive(s),c}bvhcast(e,t,n){let{intersectsRanges:i,intersectsTriangles:s}=n;const r=this.geometry.index,o=this.geometry.attributes.position,a=e.geometry.index,l=e.geometry.attributes.position;gy.copy(t).invert();const c=Cy.getPrimitive(),h=Cy.getPrimitive();if(s){function d(e,n,i,d,u,p,m,f){for(let g=i,y=i+d;g<y;g++){Fg(h,3*g,a,l),h.a.applyMatrix4(t),h.b.applyMatrix4(t),h.c.applyMatrix4(t),h.needsUpdate=!0;for(let t=e,i=e+n;t<i;t++)if(Fg(c,3*t,r,o),c.needsUpdate=!0,s(c,h,t,g,u,p,m,f))return!0}return!1}if(i){const e=i;i=function(t,n,i,s,r,o,a,l){return!!e(t,n,i,s,r,o,a,l)||d(t,n,i,s,r,o,a,l)}}else i=d}e.getBoundingBox(fy),fy.applyMatrix4(t);const u=this.shapecast({intersectsBounds:e=>fy.intersectsBox(e),intersectsRange:(t,n,s,r,o,a)=>(my.copy(a),my.applyMatrix4(gy),e.shapecast({intersectsBounds:e=>my.intersectsBox(e),intersectsRange:(e,s,a,l,c)=>i(t,n,e,s,r,o,l,c)}))});return Cy.releasePrimitive(c),Cy.releasePrimitive(h),u}intersectsBox(e,t){return yy.set(e.min,e.max,t),yy.needsUpdate=!0,this.shapecast({intersectsBounds:e=>yy.intersectsBox(e),intersectsTriangle:e=>yy.intersectsTriangle(e)})}intersectsSphere(e){return this.shapecast({intersectsBounds:t=>e.intersectsBox(t),intersectsTriangle:t=>t.intersectsSphere(e)})}closestPointToGeometry(e,t){let n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{},s=arguments.length>4&&void 0!==arguments[4]?arguments[4]:0,r=arguments.length>5&&void 0!==arguments[5]?arguments[5]:1/0;e.boundingBox||e.computeBoundingBox(),yy.set(e.boundingBox.min,e.boundingBox.max,t),yy.needsUpdate=!0;const o=this.geometry,a=o.attributes.position,l=o.index,c=e.attributes.position,h=e.index,d=Cy.getPrimitive(),u=Cy.getPrimitive();let p=xy,m=wy,f=null,g=null;i&&(f=Sy,g=My);let y=1/0,b=null,v=null;return gy.copy(t).invert(),by.matrix.copy(gy),this.shapecast({boundsTraverseOrder:e=>yy.distanceToBox(e),intersectsBounds:(e,t,n)=>n<y&&n<r&&(t&&(by.min.copy(e.min),by.max.copy(e.max),by.needsUpdate=!0),!0),intersectsRange:(n,i)=>{if(e.boundsTree)return e.boundsTree.shapecast({boundsTraverseOrder:e=>by.distanceToBox(e),intersectsBounds:(e,t,n)=>n<y&&n<r,intersectsRange:(e,r)=>{for(let o=3*e,x=3*(e+r);o<x;o+=3){Fg(u,o,h,c),u.a.applyMatrix4(t),u.b.applyMatrix4(t),u.c.applyMatrix4(t),u.needsUpdate=!0;for(let e=3*n,t=3*(n+i);e<t;e+=3){Fg(d,e,l,a),d.needsUpdate=!0;const t=d.distanceToTriangle(u,p,f);if(t<y&&(m.copy(p),g&&g.copy(f),y=t,b=e/3,v=o/3),t<s)return!0}}}});for(let e=0,r=h?h.count:c.count;e<r;e+=3){Fg(u,e,h,c),u.a.applyMatrix4(t),u.b.applyMatrix4(t),u.c.applyMatrix4(t),u.needsUpdate=!0;for(let t=3*n,r=3*(n+i);t<r;t+=3){Fg(d,t,l,a),d.needsUpdate=!0;const n=d.distanceToTriangle(u,p,f);if(n<y&&(m.copy(p),g&&g.copy(f),y=n,b=t/3,v=e/3),n<s)return!0}}}}),Cy.releasePrimitive(d),Cy.releasePrimitive(u),y===1/0?null:(n.point?n.point.copy(m):n.point=m.clone(),n.distance=y,n.faceIndex=b,i&&(i.point?i.point.copy(g):i.point=g.clone(),i.point.applyMatrix4(gy),m.applyMatrix4(gy),i.distance=m.sub(i.point).length(),i.faceIndex=v),n)}closestPointToPoint(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:0,i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:1/0;const s=n*n,r=i*i;let o=1/0,a=null;if(this.shapecast({boundsTraverseOrder:t=>(vy.copy(e).clamp(t.min,t.max),vy.distanceToSquared(e)),intersectsBounds:(e,t,n)=>n<o&&n<r,intersectsTriangle:(t,n)=>{t.closestPointToPoint(e,vy);const i=e.distanceToSquared(vy);return i<o&&(xy.copy(vy),o=i,a=n),i<s}}),o===1/0)return null;const l=Math.sqrt(o);return t.point?t.point.copy(xy):t.point=xy.clone(),t.distance=l,t.faceIndex=a,t}getBoundingBox(e){e.makeEmpty();return this._roots.forEach((t=>{fg(0,new Float32Array(t),Ty),e.union(Ty)})),e}}const Ry=Ly.prototype.raycast;Ly.prototype.raycast=function(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];if(t[0].isMesh){console.warn('MeshBVH: The function signature and results frame for "raycast" has changed. See docs for new signature.');const[e,n,i,s]=t;return Ry.call(this,i,e.material).forEach((t=>{(t=kg(t,e,n))&&s.push(t)})),s}return Ry.apply(this,t)};const Gy=Ly.prototype.raycastFirst;Ly.prototype.raycastFirst=function(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];if(t[0].isMesh){console.warn('MeshBVH: The function signature and results frame for "raycastFirst" has changed. See docs for new signature.');const[e,n,i]=t;return kg(Gy.call(this,i,e.material),e,n)}return Gy.apply(this,t)};const Ay=Ly.prototype.closestPointToPoint;Ly.prototype.closestPointToPoint=function(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];if(t[0].isMesh){console.warn('MeshBVH: The function signature and results frame for "closestPointToPoint" has changed. See docs for new signature.'),t.unshift();const e=t[1],n={};return t[1]=n,Ay.apply(this,t),e&&e.copy(n.point),n.distance}return Ay.apply(this,t)};const _y=Ly.prototype.closestPointToGeometry;Ly.prototype.closestPointToGeometry=function(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];const i=t[2],s=t[3];if(i&&i.isVector3||s&&s.isVector3){console.warn('MeshBVH: The function signature and results frame for "closestPointToGeometry" has changed. See docs for new signature.');const e={},n={},r=t[1];return t[2]=e,t[3]=n,_y.apply(this,t),i&&i.copy(e.point),s&&s.copy(n.point).applyMatrix4(r),e.distance}return _y.apply(this,t)};const Iy=Ly.prototype.refit;Ly.prototype.refit=function(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];const i=t[0],s=t[1];if(s&&(s instanceof Set||Array.isArray(s))){console.warn('MeshBVH: The function signature for "refit" has changed. See docs for new signature.');const e=new Set;s.forEach((t=>e.add(t))),i&&i.forEach((t=>e.add(t))),Iy.call(this,e)}else Iy.apply(this,t)},["intersectsGeometry","shapecast","intersectsBox","intersectsSphere"].forEach((e=>{const t=Ly.prototype[e];Ly.prototype[e]=function(){for(var n=arguments.length,i=new Array(n),s=0;s<n;s++)i[s]=arguments[s];return(null===i[0]||i[0].isMesh)&&(i.shift(),console.warn(`MeshBVH: The function signature for "${e}" has changed and no longer takes Mesh. See docs for new signature.`)),t.apply(this,i)}}));const Ey=new Pi,Xy=new Wi,zy=or.prototype.raycast;class Py extends cl{constructor(){super();const e=new lr;e.deleteAttribute("uv");const t=new kh({side:1}),n=new kh,i=new Wd(16777215,5,28,2);i.position.set(.418,16.199,.3),this.add(i);const s=new or(e,t);s.position.set(-.757,13.219,.717),s.scale.set(31.713,28.305,28.591),this.add(s);const r=new or(e,n);r.position.set(-10.906,2.009,1.846),r.rotation.set(0,-.195,0),r.scale.set(2.328,7.905,4.651),this.add(r);const o=new or(e,n);o.position.set(-5.607,-.754,-.758),o.rotation.set(0,.994,0),o.scale.set(1.97,1.534,3.955),this.add(o);const a=new or(e,n);a.position.set(6.167,.857,7.803),a.rotation.set(0,.561,0),a.scale.set(3.927,6.285,3.687),this.add(a);const l=new or(e,n);l.position.set(-2.017,.018,6.124),l.rotation.set(0,.333,0),l.scale.set(2.002,4.566,2.064),this.add(l);const c=new or(e,n);c.position.set(2.291,-.756,-2.621),c.rotation.set(0,-.286,0),c.scale.set(1.546,1.552,1.496),this.add(c);const h=new or(e,n);h.position.set(-2.193,-.369,-5.547),h.rotation.set(0,.516,0),h.scale.set(3.875,3.487,2.986),this.add(h);const d=new or(e,Wy(50));d.position.set(-16.116,14.37,8.208),d.scale.set(.1,2.428,2.739),this.add(d);const u=new or(e,Wy(50));u.position.set(-16.109,18.021,-8.207),u.scale.set(.1,2.425,2.751),this.add(u);const p=new or(e,Wy(17));p.position.set(14.904,12.198,-1.832),p.scale.set(.15,4.265,6.331),this.add(p);const m=new or(e,Wy(43));m.position.set(-.462,8.89,14.52),m.scale.set(4.38,5.441,.088),this.add(m);const f=new or(e,Wy(20));f.position.set(3.235,11.486,-12.541),f.scale.set(2.5,2,.1),this.add(f);const g=new or(e,Wy(100));g.position.set(0,20,0),g.scale.set(1,.1,1),this.add(g)}}function Wy(e){const t=new ws;return t.color.setScalar(e),t}var Zy=function(){var e=0,t=document.createElement("div");function n(e){return t.appendChild(e.dom),e}function i(n){for(var i=0;i<t.children.length;i++)t.children[i].style.display=i===n?"block":"none";e=n}t.style.cssText="position:fixed;top:0;left:0;cursor:pointer;opacity:0.9;z-index:10000",t.addEventListener("click",(function(n){n.preventDefault(),i(++e%t.children.length)}),!1);var s=(performance||Date).now(),r=s,o=0,a=n(new Zy.Panel("FPS","#0ff","#002")),l=n(new Zy.Panel("MS","#0f0","#020"));if(self.performance&&self.performance.memory)var c=n(new Zy.Panel("MB","#f08","#201"));return i(0),{REVISION:16,dom:t,addPanel:n,showPanel:i,begin:function(){s=(performance||Date).now()},end:function(){o++;var e=(performance||Date).now();if(l.update(e-s,200),e>=r+1e3&&(a.update(1e3*o/(e-r),100),r=e,o=0,c)){var t=performance.memory;c.update(t.usedJSHeapSize/1048576,t.jsHeapSizeLimit/1048576)}return e},update:function(){s=this.end()},domElement:t,setMode:i}};Zy.Panel=function(e,t,n){var i=1/0,s=0,r=Math.round,o=r(window.devicePixelRatio||1),a=80*o,l=48*o,c=3*o,h=2*o,d=3*o,u=15*o,p=74*o,m=30*o,f=document.createElement("canvas");f.width=a,f.height=l,f.style.cssText="width:80px;height:48px";var g=f.getContext("2d");return g.font="bold "+9*o+"px Helvetica,Arial,sans-serif",g.textBaseline="top",g.fillStyle=n,g.fillRect(0,0,a,l),g.fillStyle=t,g.fillText(e,c,h),g.fillRect(d,u,p,m),g.fillStyle=n,g.globalAlpha=.9,g.fillRect(d,u,p,m),{dom:f,update:function(l,y){i=Math.min(i,l),s=Math.max(s,l),g.fillStyle=n,g.globalAlpha=1,g.fillRect(0,0,a,u),g.fillStyle=t,g.fillText(r(l)+" "+e+" ("+r(i)+"-"+r(s)+")",c,h),g.drawImage(f,d+o,u,p-o,m,d,u,p-o,m),g.fillRect(d+p-o,u,o,m),g.fillStyle=n,g.globalAlpha=.9,g.fillRect(d+p-o,u,o,r((1-l/y)*m))}}};var Ny=Zy;class Vy extends or{constructor(){const e=Vy.SkyShader,t=new ur({name:"SkyShader",fragmentShader:e.fragmentShader,vertexShader:e.vertexShader,uniforms:dr.clone(e.uniforms),side:1,depthWrite:!1});super(new lr(1,1,1),t),this.isSky=!0}}Vy.SkyShader={uniforms:{turbidity:{value:2},rayleigh:{value:1},mieCoefficient:{value:.005},mieDirectionalG:{value:.8},sunPosition:{value:new ri},up:{value:new ri(0,1,0)}},vertexShader:"\n\t\tuniform vec3 sunPosition;\n\t\tuniform float rayleigh;\n\t\tuniform float turbidity;\n\t\tuniform float mieCoefficient;\n\t\tuniform vec3 up;\n\n\t\tvarying vec3 vWorldPosition;\n\t\tvarying vec3 vSunDirection;\n\t\tvarying float vSunfade;\n\t\tvarying vec3 vBetaR;\n\t\tvarying vec3 vBetaM;\n\t\tvarying float vSunE;\n\n\t\t// constants for atmospheric scattering\n\t\tconst float e = 2.71828182845904523536028747135266249775724709369995957;\n\t\tconst float pi = 3.141592653589793238462643383279502884197169;\n\n\t\t// wavelength of used primaries, according to preetham\n\t\tconst vec3 lambda = vec3( 680E-9, 550E-9, 450E-9 );\n\t\t// this pre-calcuation replaces older TotalRayleigh(vec3 lambda) function:\n\t\t// (8.0 * pow(pi, 3.0) * pow(pow(n, 2.0) - 1.0, 2.0) * (6.0 + 3.0 * pn)) / (3.0 * N * pow(lambda, vec3(4.0)) * (6.0 - 7.0 * pn))\n\t\tconst vec3 totalRayleigh = vec3( 5.804542996261093E-6, 1.3562911419845635E-5, 3.0265902468824876E-5 );\n\n\t\t// mie stuff\n\t\t// K coefficient for the primaries\n\t\tconst float v = 4.0;\n\t\tconst vec3 K = vec3( 0.686, 0.678, 0.666 );\n\t\t// MieConst = pi * pow( ( 2.0 * pi ) / lambda, vec3( v - 2.0 ) ) * K\n\t\tconst vec3 MieConst = vec3( 1.8399918514433978E14, 2.7798023919660528E14, 4.0790479543861094E14 );\n\n\t\t// earth shadow hack\n\t\t// cutoffAngle = pi / 1.95;\n\t\tconst float cutoffAngle = 1.6110731556870734;\n\t\tconst float steepness = 1.5;\n\t\tconst float EE = 1000.0;\n\n\t\tfloat sunIntensity( float zenithAngleCos ) {\n\t\t\tzenithAngleCos = clamp( zenithAngleCos, -1.0, 1.0 );\n\t\t\treturn EE * max( 0.0, 1.0 - pow( e, -( ( cutoffAngle - acos( zenithAngleCos ) ) / steepness ) ) );\n\t\t}\n\n\t\tvec3 totalMie( float T ) {\n\t\t\tfloat c = ( 0.2 * T ) * 10E-18;\n\t\t\treturn 0.434 * c * MieConst;\n\t\t}\n\n\t\tvoid main() {\n\n\t\t\tvec4 worldPosition = modelMatrix * vec4( position, 1.0 );\n\t\t\tvWorldPosition = worldPosition.xyz;\n\n\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\t\t\tgl_Position.z = gl_Position.w; // set z to camera.far\n\n\t\t\tvSunDirection = normalize( sunPosition );\n\n\t\t\tvSunE = sunIntensity( dot( vSunDirection, up ) );\n\n\t\t\tvSunfade = 1.0 - clamp( 1.0 - exp( ( sunPosition.y / 450000.0 ) ), 0.0, 1.0 );\n\n\t\t\tfloat rayleighCoefficient = rayleigh - ( 1.0 * ( 1.0 - vSunfade ) );\n\n\t\t\t// extinction (absorbtion + out scattering)\n\t\t\t// rayleigh coefficients\n\t\t\tvBetaR = totalRayleigh * rayleighCoefficient;\n\n\t\t\t// mie coefficients\n\t\t\tvBetaM = totalMie( turbidity ) * mieCoefficient;\n\n\t\t}",fragmentShader:"\n\t\tvarying vec3 vWorldPosition;\n\t\tvarying vec3 vSunDirection;\n\t\tvarying float vSunfade;\n\t\tvarying vec3 vBetaR;\n\t\tvarying vec3 vBetaM;\n\t\tvarying float vSunE;\n\n\t\tuniform float mieDirectionalG;\n\t\tuniform vec3 up;\n\n\t\tconst vec3 cameraPos = vec3( 0.0, 0.0, 0.0 );\n\n\t\t// constants for atmospheric scattering\n\t\tconst float pi = 3.141592653589793238462643383279502884197169;\n\n\t\tconst float n = 1.0003; // refractive index of air\n\t\tconst float N = 2.545E25; // number of molecules per unit volume for air at 288.15K and 1013mb (sea level -45 celsius)\n\n\t\t// optical length at zenith for molecules\n\t\tconst float rayleighZenithLength = 8.4E3;\n\t\tconst float mieZenithLength = 1.25E3;\n\t\t// 66 arc seconds -> degrees, and the cosine of that\n\t\tconst float sunAngularDiameterCos = 0.999956676946448443553574619906976478926848692873900859324;\n\n\t\t// 3.0 / ( 16.0 * pi )\n\t\tconst float THREE_OVER_SIXTEENPI = 0.05968310365946075;\n\t\t// 1.0 / ( 4.0 * pi )\n\t\tconst float ONE_OVER_FOURPI = 0.07957747154594767;\n\n\t\tfloat rayleighPhase( float cosTheta ) {\n\t\t\treturn THREE_OVER_SIXTEENPI * ( 1.0 + pow( cosTheta, 2.0 ) );\n\t\t}\n\n\t\tfloat hgPhase( float cosTheta, float g ) {\n\t\t\tfloat g2 = pow( g, 2.0 );\n\t\t\tfloat inverse = 1.0 / pow( 1.0 - 2.0 * g * cosTheta + g2, 1.5 );\n\t\t\treturn ONE_OVER_FOURPI * ( ( 1.0 - g2 ) * inverse );\n\t\t}\n\n\t\tvoid main() {\n\n\t\t\tvec3 direction = normalize( vWorldPosition - cameraPos );\n\n\t\t\t// optical length\n\t\t\t// cutoff angle at 90 to avoid singularity in next formula.\n\t\t\tfloat zenithAngle = acos( max( 0.0, dot( up, direction ) ) );\n\t\t\tfloat inverse = 1.0 / ( cos( zenithAngle ) + 0.15 * pow( 93.885 - ( ( zenithAngle * 180.0 ) / pi ), -1.253 ) );\n\t\t\tfloat sR = rayleighZenithLength * inverse;\n\t\t\tfloat sM = mieZenithLength * inverse;\n\n\t\t\t// combined extinction factor\n\t\t\tvec3 Fex = exp( -( vBetaR * sR + vBetaM * sM ) );\n\n\t\t\t// in scattering\n\t\t\tfloat cosTheta = dot( direction, vSunDirection );\n\n\t\t\tfloat rPhase = rayleighPhase( cosTheta * 0.5 + 0.5 );\n\t\t\tvec3 betaRTheta = vBetaR * rPhase;\n\n\t\t\tfloat mPhase = hgPhase( cosTheta, mieDirectionalG );\n\t\t\tvec3 betaMTheta = vBetaM * mPhase;\n\n\t\t\tvec3 Lin = pow( vSunE * ( ( betaRTheta + betaMTheta ) / ( vBetaR + vBetaM ) ) * ( 1.0 - Fex ), vec3( 1.5 ) );\n\t\t\tLin *= mix( vec3( 1.0 ), pow( vSunE * ( ( betaRTheta + betaMTheta ) / ( vBetaR + vBetaM ) ) * Fex, vec3( 1.0 / 2.0 ) ), clamp( pow( 1.0 - dot( up, vSunDirection ), 5.0 ), 0.0, 1.0 ) );\n\n\t\t\t// nightsky\n\t\t\tfloat theta = acos( direction.y ); // elevation --\x3e y-axis, [-pi/2, pi/2]\n\t\t\tfloat phi = atan( direction.z, direction.x ); // azimuth --\x3e x-axis [-pi/2, pi/2]\n\t\t\tvec2 uv = vec2( phi, theta ) / vec2( 2.0 * pi, pi ) + vec2( 0.5, 0.0 );\n\t\t\tvec3 L0 = vec3( 0.1 ) * Fex;\n\n\t\t\t// composition + solar disc\n\t\t\tfloat sundisk = smoothstep( sunAngularDiameterCos, sunAngularDiameterCos + 0.00002, cosTheta );\n\t\t\tL0 += ( vSunE * 19000.0 * Fex ) * sundisk;\n\n\t\t\tvec3 texColor = ( Lin + L0 ) * 0.04 + vec3( 0.0, 0.0003, 0.00075 );\n\n\t\t\tvec3 retColor = pow( texColor, vec3( 1.0 / ( 1.2 + ( 1.2 * vSunfade ) ) ) );\n\n\t\t\tgl_FragColor = vec4( retColor, 1.0 );\n\n\t\t\t#include <tonemapping_fragment>\n\t\t\t#include <encodings_fragment>\n\n\t\t}"};class Dy{constructor(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:4;this.pool=e,this.queue=[],this.workers=[],this.workersResolve=[],this.workerStatus=0}_initWorker(e){if(!this.workers[e]){const t=this.workerCreator();t.addEventListener("message",this._onMessage.bind(this,e)),this.workers[e]=t}}_getIdleWorker(){for(let e=0;e<this.pool;e++)if(!(this.workerStatus&1<<e))return e;return-1}_onMessage(e,t){const n=this.workersResolve[e];if(n&&n(t),this.queue.length){const{resolve:t,msg:n,transfer:i}=this.queue.shift();this.workersResolve[e]=t,this.workers[e].postMessage(n,i)}else this.workerStatus^=1<<e}setWorkerCreator(e){this.workerCreator=e}setWorkerLimit(e){this.pool=e}postMessage(e,t){return new Promise((n=>{const i=this._getIdleWorker();-1!==i?(this._initWorker(i),this.workerStatus|=1<<i,this.workersResolve[i]=n,this.workers[i].postMessage(e,t)):this.queue.push({resolve:n,msg:e,transfer:t})}))}dispose(){this.workers.forEach((e=>e.terminate())),this.workersResolve.length=0,this.workers.length=0,this.queue.length=0,this.workerStatus=0}}function By(e,t,n){var i=void 0===t?null:t,s=function(e,t){var n=atob(e);if(t){for(var i=new Uint8Array(n.length),s=0,r=n.length;s<r;++s)i[s]=n.charCodeAt(s);return String.fromCharCode.apply(null,new Uint16Array(i.buffer))}return n}(e,void 0!==n&&n),r=s.indexOf("\n",10)+1,o=s.substring(r)+(i?"//# sourceMappingURL="+i:""),a=new Blob([o],{type:"application/javascript"});return URL.createObjectURL(a)}var Hy,ky,Fy,Uy,Oy=(Hy="Lyogcm9sbHVwLXBsdWdpbi13ZWItd29ya2VyLWxvYWRlciAqLwohZnVuY3Rpb24oKXsidXNlIHN0cmljdCI7Ci8qKgoJICogQGxpY2Vuc2UKCSAqIENvcHlyaWdodCAyMDEwLTIwMjIgVGhyZWUuanMgQXV0aG9ycwoJICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IE1JVAoJICovY29uc3QgdD0xMDAxLGU9InNyZ2IiLHM9InNyZ2ItbGluZWFyIjtjbGFzcyBpe2FkZEV2ZW50TGlzdGVuZXIodCxlKXt2b2lkIDA9PT10aGlzLl9saXN0ZW5lcnMmJih0aGlzLl9saXN0ZW5lcnM9e30pO2NvbnN0IHM9dGhpcy5fbGlzdGVuZXJzO3ZvaWQgMD09PXNbdF0mJihzW3RdPVtdKSwtMT09PXNbdF0uaW5kZXhPZihlKSYmc1t0XS5wdXNoKGUpfWhhc0V2ZW50TGlzdGVuZXIodCxlKXtpZih2b2lkIDA9PT10aGlzLl9saXN0ZW5lcnMpcmV0dXJuITE7Y29uc3Qgcz10aGlzLl9saXN0ZW5lcnM7cmV0dXJuIHZvaWQgMCE9PXNbdF0mJi0xIT09c1t0XS5pbmRleE9mKGUpfXJlbW92ZUV2ZW50TGlzdGVuZXIodCxlKXtpZih2b2lkIDA9PT10aGlzLl9saXN0ZW5lcnMpcmV0dXJuO2NvbnN0IHM9dGhpcy5fbGlzdGVuZXJzW3RdO2lmKHZvaWQgMCE9PXMpe2NvbnN0IHQ9cy5pbmRleE9mKGUpOy0xIT09dCYmcy5zcGxpY2UodCwxKX19ZGlzcGF0Y2hFdmVudCh0KXtpZih2b2lkIDA9PT10aGlzLl9saXN0ZW5lcnMpcmV0dXJuO2NvbnN0IGU9dGhpcy5fbGlzdGVuZXJzW3QudHlwZV07aWYodm9pZCAwIT09ZSl7dC50YXJnZXQ9dGhpcztjb25zdCBzPWUuc2xpY2UoMCk7Zm9yKGxldCBlPTAsaT1zLmxlbmd0aDtlPGk7ZSsrKXNbZV0uY2FsbCh0aGlzLHQpO3QudGFyZ2V0PW51bGx9fX1jb25zdCByPVsiMDAiLCIwMSIsIjAyIiwiMDMiLCIwNCIsIjA1IiwiMDYiLCIwNyIsIjA4IiwiMDkiLCIwYSIsIjBiIiwiMGMiLCIwZCIsIjBlIiwiMGYiLCIxMCIsIjExIiwiMTIiLCIxMyIsIjE0IiwiMTUiLCIxNiIsIjE3IiwiMTgiLCIxOSIsIjFhIiwiMWIiLCIxYyIsIjFkIiwiMWUiLCIxZiIsIjIwIiwiMjEiLCIyMiIsIjIzIiwiMjQiLCIyNSIsIjI2IiwiMjciLCIyOCIsIjI5IiwiMmEiLCIyYiIsIjJjIiwiMmQiLCIyZSIsIjJmIiwiMzAiLCIzMSIsIjMyIiwiMzMiLCIzNCIsIjM1IiwiMzYiLCIzNyIsIjM4IiwiMzkiLCIzYSIsIjNiIiwiM2MiLCIzZCIsIjNlIiwiM2YiLCI0MCIsIjQxIiwiNDIiLCI0MyIsIjQ0IiwiNDUiLCI0NiIsIjQ3IiwiNDgiLCI0OSIsIjRhIiwiNGIiLCI0YyIsIjRkIiwiNGUiLCI0ZiIsIjUwIiwiNTEiLCI1MiIsIjUzIiwiNTQiLCI1NSIsIjU2IiwiNTciLCI1OCIsIjU5IiwiNWEiLCI1YiIsIjVjIiwiNWQiLCI1ZSIsIjVmIiwiNjAiLCI2MSIsIjYyIiwiNjMiLCI2NCIsIjY1IiwiNjYiLCI2NyIsIjY4IiwiNjkiLCI2YSIsIjZiIiwiNmMiLCI2ZCIsIjZlIiwiNmYiLCI3MCIsIjcxIiwiNzIiLCI3MyIsIjc0IiwiNzUiLCI3NiIsIjc3IiwiNzgiLCI3OSIsIjdhIiwiN2IiLCI3YyIsIjdkIiwiN2UiLCI3ZiIsIjgwIiwiODEiLCI4MiIsIjgzIiwiODQiLCI4NSIsIjg2IiwiODciLCI4OCIsIjg5IiwiOGEiLCI4YiIsIjhjIiwiOGQiLCI4ZSIsIjhmIiwiOTAiLCI5MSIsIjkyIiwiOTMiLCI5NCIsIjk1IiwiOTYiLCI5NyIsIjk4IiwiOTkiLCI5YSIsIjliIiwiOWMiLCI5ZCIsIjllIiwiOWYiLCJhMCIsImExIiwiYTIiLCJhMyIsImE0IiwiYTUiLCJhNiIsImE3IiwiYTgiLCJhOSIsImFhIiwiYWIiLCJhYyIsImFkIiwiYWUiLCJhZiIsImIwIiwiYjEiLCJiMiIsImIzIiwiYjQiLCJiNSIsImI2IiwiYjciLCJiOCIsImI5IiwiYmEiLCJiYiIsImJjIiwiYmQiLCJiZSIsImJmIiwiYzAiLCJjMSIsImMyIiwiYzMiLCJjNCIsImM1IiwiYzYiLCJjNyIsImM4IiwiYzkiLCJjYSIsImNiIiwiY2MiLCJjZCIsImNlIiwiY2YiLCJkMCIsImQxIiwiZDIiLCJkMyIsImQ0IiwiZDUiLCJkNiIsImQ3IiwiZDgiLCJkOSIsImRhIiwiZGIiLCJkYyIsImRkIiwiZGUiLCJkZiIsImUwIiwiZTEiLCJlMiIsImUzIiwiZTQiLCJlNSIsImU2IiwiZTciLCJlOCIsImU5IiwiZWEiLCJlYiIsImVjIiwiZWQiLCJlZSIsImVmIiwiZjAiLCJmMSIsImYyIiwiZjMiLCJmNCIsImY1IiwiZjYiLCJmNyIsImY4IiwiZjkiLCJmYSIsImZiIiwiZmMiLCJmZCIsImZlIiwiZmYiXTtmdW5jdGlvbiBuKCl7Y29uc3QgdD00Mjk0OTY3Mjk1Kk1hdGgucmFuZG9tKCl8MCxlPTQyOTQ5NjcyOTUqTWF0aC5yYW5kb20oKXwwLHM9NDI5NDk2NzI5NSpNYXRoLnJhbmRvbSgpfDAsaT00Mjk0OTY3Mjk1Kk1hdGgucmFuZG9tKCl8MDtyZXR1cm4oclsyNTUmdF0rclt0Pj44JjI1NV0rclt0Pj4xNiYyNTVdK3JbdD4+MjQmMjU1XSsiLSIrclsyNTUmZV0rcltlPj44JjI1NV0rIi0iK3JbZT4+MTYmMTV8NjRdK3JbZT4+MjQmMjU1XSsiLSIrcls2MyZzfDEyOF0rcltzPj44JjI1NV0rIi0iK3Jbcz4+MTYmMjU1XStyW3M+PjI0JjI1NV0rclsyNTUmaV0rcltpPj44JjI1NV0rcltpPj4xNiYyNTVdK3JbaT4+MjQmMjU1XSkudG9Mb3dlckNhc2UoKX1mdW5jdGlvbiBvKHQsZSxzKXtyZXR1cm4gTWF0aC5tYXgoZSxNYXRoLm1pbihzLHQpKX1mdW5jdGlvbiBhKHQsZSxzKXtyZXR1cm4oMS1zKSp0K3MqZX1jbGFzcyBoe2NvbnN0cnVjdG9yKCl7bGV0IHQ9YXJndW1lbnRzLmxlbmd0aD4wJiZ2b2lkIDAhPT1hcmd1bWVudHNbMF0/YXJndW1lbnRzWzBdOjAsZT1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06MDtoLnByb3RvdHlwZS5pc1ZlY3RvcjI9ITAsdGhpcy54PXQsdGhpcy55PWV9Z2V0IHdpZHRoKCl7cmV0dXJuIHRoaXMueH1zZXQgd2lkdGgodCl7dGhpcy54PXR9Z2V0IGhlaWdodCgpe3JldHVybiB0aGlzLnl9c2V0IGhlaWdodCh0KXt0aGlzLnk9dH1zZXQodCxlKXtyZXR1cm4gdGhpcy54PXQsdGhpcy55PWUsdGhpc31zZXRTY2FsYXIodCl7cmV0dXJuIHRoaXMueD10LHRoaXMueT10LHRoaXN9c2V0WCh0KXtyZXR1cm4gdGhpcy54PXQsdGhpc31zZXRZKHQpe3JldHVybiB0aGlzLnk9dCx0aGlzfXNldENvbXBvbmVudCh0LGUpe3N3aXRjaCh0KXtjYXNlIDA6dGhpcy54PWU7YnJlYWs7Y2FzZSAxOnRoaXMueT1lO2JyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCJpbmRleCBpcyBvdXQgb2YgcmFuZ2U6ICIrdCl9cmV0dXJuIHRoaXN9Z2V0Q29tcG9uZW50KHQpe3N3aXRjaCh0KXtjYXNlIDA6cmV0dXJuIHRoaXMueDtjYXNlIDE6cmV0dXJuIHRoaXMueTtkZWZhdWx0OnRocm93IG5ldyBFcnJvcigiaW5kZXggaXMgb3V0IG9mIHJhbmdlOiAiK3QpfX1jbG9uZSgpe3JldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3Rvcih0aGlzLngsdGhpcy55KX1jb3B5KHQpe3JldHVybiB0aGlzLng9dC54LHRoaXMueT10LnksdGhpc31hZGQodCxlKXtyZXR1cm4gdm9pZCAwIT09ZT8oY29uc29sZS53YXJuKCJUSFJFRS5WZWN0b3IyOiAuYWRkKCkgbm93IG9ubHkgYWNjZXB0cyBvbmUgYXJndW1lbnQuIFVzZSAuYWRkVmVjdG9ycyggYSwgYiApIGluc3RlYWQuIiksdGhpcy5hZGRWZWN0b3JzKHQsZSkpOih0aGlzLngrPXQueCx0aGlzLnkrPXQueSx0aGlzKX1hZGRTY2FsYXIodCl7cmV0dXJuIHRoaXMueCs9dCx0aGlzLnkrPXQsdGhpc31hZGRWZWN0b3JzKHQsZSl7cmV0dXJuIHRoaXMueD10LngrZS54LHRoaXMueT10LnkrZS55LHRoaXN9YWRkU2NhbGVkVmVjdG9yKHQsZSl7cmV0dXJuIHRoaXMueCs9dC54KmUsdGhpcy55Kz10LnkqZSx0aGlzfXN1Yih0LGUpe3JldHVybiB2b2lkIDAhPT1lPyhjb25zb2xlLndhcm4oIlRIUkVFLlZlY3RvcjI6IC5zdWIoKSBub3cgb25seSBhY2NlcHRzIG9uZSBhcmd1bWVudC4gVXNlIC5zdWJWZWN0b3JzKCBhLCBiICkgaW5zdGVhZC4iKSx0aGlzLnN1YlZlY3RvcnModCxlKSk6KHRoaXMueC09dC54LHRoaXMueS09dC55LHRoaXMpfXN1YlNjYWxhcih0KXtyZXR1cm4gdGhpcy54LT10LHRoaXMueS09dCx0aGlzfXN1YlZlY3RvcnModCxlKXtyZXR1cm4gdGhpcy54PXQueC1lLngsdGhpcy55PXQueS1lLnksdGhpc31tdWx0aXBseSh0KXtyZXR1cm4gdGhpcy54Kj10LngsdGhpcy55Kj10LnksdGhpc31tdWx0aXBseVNjYWxhcih0KXtyZXR1cm4gdGhpcy54Kj10LHRoaXMueSo9dCx0aGlzfWRpdmlkZSh0KXtyZXR1cm4gdGhpcy54Lz10LngsdGhpcy55Lz10LnksdGhpc31kaXZpZGVTY2FsYXIodCl7cmV0dXJuIHRoaXMubXVsdGlwbHlTY2FsYXIoMS90KX1hcHBseU1hdHJpeDModCl7Y29uc3QgZT10aGlzLngscz10aGlzLnksaT10LmVsZW1lbnRzO3JldHVybiB0aGlzLng9aVswXSplK2lbM10qcytpWzZdLHRoaXMueT1pWzFdKmUraVs0XSpzK2lbN10sdGhpc31taW4odCl7cmV0dXJuIHRoaXMueD1NYXRoLm1pbih0aGlzLngsdC54KSx0aGlzLnk9TWF0aC5taW4odGhpcy55LHQueSksdGhpc31tYXgodCl7cmV0dXJuIHRoaXMueD1NYXRoLm1heCh0aGlzLngsdC54KSx0aGlzLnk9TWF0aC5tYXgodGhpcy55LHQueSksdGhpc31jbGFtcCh0LGUpe3JldHVybiB0aGlzLng9TWF0aC5tYXgodC54LE1hdGgubWluKGUueCx0aGlzLngpKSx0aGlzLnk9TWF0aC5tYXgodC55LE1hdGgubWluKGUueSx0aGlzLnkpKSx0aGlzfWNsYW1wU2NhbGFyKHQsZSl7cmV0dXJuIHRoaXMueD1NYXRoLm1heCh0LE1hdGgubWluKGUsdGhpcy54KSksdGhpcy55PU1hdGgubWF4KHQsTWF0aC5taW4oZSx0aGlzLnkpKSx0aGlzfWNsYW1wTGVuZ3RoKHQsZSl7Y29uc3Qgcz10aGlzLmxlbmd0aCgpO3JldHVybiB0aGlzLmRpdmlkZVNjYWxhcihzfHwxKS5tdWx0aXBseVNjYWxhcihNYXRoLm1heCh0LE1hdGgubWluKGUscykpKX1mbG9vcigpe3JldHVybiB0aGlzLng9TWF0aC5mbG9vcih0aGlzLngpLHRoaXMueT1NYXRoLmZsb29yKHRoaXMueSksdGhpc31jZWlsKCl7cmV0dXJuIHRoaXMueD1NYXRoLmNlaWwodGhpcy54KSx0aGlzLnk9TWF0aC5jZWlsKHRoaXMueSksdGhpc31yb3VuZCgpe3JldHVybiB0aGlzLng9TWF0aC5yb3VuZCh0aGlzLngpLHRoaXMueT1NYXRoLnJvdW5kKHRoaXMueSksdGhpc31yb3VuZFRvWmVybygpe3JldHVybiB0aGlzLng9dGhpcy54PDA/TWF0aC5jZWlsKHRoaXMueCk6TWF0aC5mbG9vcih0aGlzLngpLHRoaXMueT10aGlzLnk8MD9NYXRoLmNlaWwodGhpcy55KTpNYXRoLmZsb29yKHRoaXMueSksdGhpc31uZWdhdGUoKXtyZXR1cm4gdGhpcy54PS10aGlzLngsdGhpcy55PS10aGlzLnksdGhpc31kb3QodCl7cmV0dXJuIHRoaXMueCp0LngrdGhpcy55KnQueX1jcm9zcyh0KXtyZXR1cm4gdGhpcy54KnQueS10aGlzLnkqdC54fWxlbmd0aFNxKCl7cmV0dXJuIHRoaXMueCp0aGlzLngrdGhpcy55KnRoaXMueX1sZW5ndGgoKXtyZXR1cm4gTWF0aC5zcXJ0KHRoaXMueCp0aGlzLngrdGhpcy55KnRoaXMueSl9bWFuaGF0dGFuTGVuZ3RoKCl7cmV0dXJuIE1hdGguYWJzKHRoaXMueCkrTWF0aC5hYnModGhpcy55KX1ub3JtYWxpemUoKXtyZXR1cm4gdGhpcy5kaXZpZGVTY2FsYXIodGhpcy5sZW5ndGgoKXx8MSl9YW5nbGUoKXtyZXR1cm4gTWF0aC5hdGFuMigtdGhpcy55LC10aGlzLngpK01hdGguUEl9ZGlzdGFuY2VUbyh0KXtyZXR1cm4gTWF0aC5zcXJ0KHRoaXMuZGlzdGFuY2VUb1NxdWFyZWQodCkpfWRpc3RhbmNlVG9TcXVhcmVkKHQpe2NvbnN0IGU9dGhpcy54LXQueCxzPXRoaXMueS10Lnk7cmV0dXJuIGUqZStzKnN9bWFuaGF0dGFuRGlzdGFuY2VUbyh0KXtyZXR1cm4gTWF0aC5hYnModGhpcy54LXQueCkrTWF0aC5hYnModGhpcy55LXQueSl9c2V0TGVuZ3RoKHQpe3JldHVybiB0aGlzLm5vcm1hbGl6ZSgpLm11bHRpcGx5U2NhbGFyKHQpfWxlcnAodCxlKXtyZXR1cm4gdGhpcy54Kz0odC54LXRoaXMueCkqZSx0aGlzLnkrPSh0LnktdGhpcy55KSplLHRoaXN9bGVycFZlY3RvcnModCxlLHMpe3JldHVybiB0aGlzLng9dC54KyhlLngtdC54KSpzLHRoaXMueT10LnkrKGUueS10LnkpKnMsdGhpc31lcXVhbHModCl7cmV0dXJuIHQueD09PXRoaXMueCYmdC55PT09dGhpcy55fWZyb21BcnJheSh0KXtsZXQgZT1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06MDtyZXR1cm4gdGhpcy54PXRbZV0sdGhpcy55PXRbZSsxXSx0aGlzfXRvQXJyYXkoKXtsZXQgdD1hcmd1bWVudHMubGVuZ3RoPjAmJnZvaWQgMCE9PWFyZ3VtZW50c1swXT9hcmd1bWVudHNbMF06W10sZT1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06MDtyZXR1cm4gdFtlXT10aGlzLngsdFtlKzFdPXRoaXMueSx0fWZyb21CdWZmZXJBdHRyaWJ1dGUodCxlLHMpe3JldHVybiB2b2lkIDAhPT1zJiZjb25zb2xlLndhcm4oIlRIUkVFLlZlY3RvcjI6IG9mZnNldCBoYXMgYmVlbiByZW1vdmVkIGZyb20gLmZyb21CdWZmZXJBdHRyaWJ1dGUoKS4iKSx0aGlzLng9dC5nZXRYKGUpLHRoaXMueT10LmdldFkoZSksdGhpc31yb3RhdGVBcm91bmQodCxlKXtjb25zdCBzPU1hdGguY29zKGUpLGk9TWF0aC5zaW4oZSkscj10aGlzLngtdC54LG49dGhpcy55LXQueTtyZXR1cm4gdGhpcy54PXIqcy1uKmkrdC54LHRoaXMueT1yKmkrbipzK3QueSx0aGlzfXJhbmRvbSgpe3JldHVybiB0aGlzLng9TWF0aC5yYW5kb20oKSx0aGlzLnk9TWF0aC5yYW5kb20oKSx0aGlzfSpbU3ltYm9sLml0ZXJhdG9yXSgpe3lpZWxkIHRoaXMueCx5aWVsZCB0aGlzLnl9fWNsYXNzIGx7Y29uc3RydWN0b3IoKXtsLnByb3RvdHlwZS5pc01hdHJpeDM9ITAsdGhpcy5lbGVtZW50cz1bMSwwLDAsMCwxLDAsMCwwLDFdLGFyZ3VtZW50cy5sZW5ndGg+MCYmY29uc29sZS5lcnJvcigiVEhSRUUuTWF0cml4MzogdGhlIGNvbnN0cnVjdG9yIG5vIGxvbmdlciByZWFkcyBhcmd1bWVudHMuIHVzZSAuc2V0KCkgaW5zdGVhZC4iKX1zZXQodCxlLHMsaSxyLG4sbyxhLGgpe2NvbnN0IGw9dGhpcy5lbGVtZW50cztyZXR1cm4gbFswXT10LGxbMV09aSxsWzJdPW8sbFszXT1lLGxbNF09cixsWzVdPWEsbFs2XT1zLGxbN109bixsWzhdPWgsdGhpc31pZGVudGl0eSgpe3JldHVybiB0aGlzLnNldCgxLDAsMCwwLDEsMCwwLDAsMSksdGhpc31jb3B5KHQpe2NvbnN0IGU9dGhpcy5lbGVtZW50cyxzPXQuZWxlbWVudHM7cmV0dXJuIGVbMF09c1swXSxlWzFdPXNbMV0sZVsyXT1zWzJdLGVbM109c1szXSxlWzRdPXNbNF0sZVs1XT1zWzVdLGVbNl09c1s2XSxlWzddPXNbN10sZVs4XT1zWzhdLHRoaXN9ZXh0cmFjdEJhc2lzKHQsZSxzKXtyZXR1cm4gdC5zZXRGcm9tTWF0cml4M0NvbHVtbih0aGlzLDApLGUuc2V0RnJvbU1hdHJpeDNDb2x1bW4odGhpcywxKSxzLnNldEZyb21NYXRyaXgzQ29sdW1uKHRoaXMsMiksdGhpc31zZXRGcm9tTWF0cml4NCh0KXtjb25zdCBlPXQuZWxlbWVudHM7cmV0dXJuIHRoaXMuc2V0KGVbMF0sZVs0XSxlWzhdLGVbMV0sZVs1XSxlWzldLGVbMl0sZVs2XSxlWzEwXSksdGhpc31tdWx0aXBseSh0KXtyZXR1cm4gdGhpcy5tdWx0aXBseU1hdHJpY2VzKHRoaXMsdCl9cHJlbXVsdGlwbHkodCl7cmV0dXJuIHRoaXMubXVsdGlwbHlNYXRyaWNlcyh0LHRoaXMpfW11bHRpcGx5TWF0cmljZXModCxlKXtjb25zdCBzPXQuZWxlbWVudHMsaT1lLmVsZW1lbnRzLHI9dGhpcy5lbGVtZW50cyxuPXNbMF0sbz1zWzNdLGE9c1s2XSxoPXNbMV0sbD1zWzRdLGM9c1s3XSx1PXNbMl0sZD1zWzVdLG09c1s4XSx5PWlbMF0scD1pWzNdLHg9aVs2XSxmPWlbMV0sZz1pWzRdLGI9aVs3XSx3PWlbMl0sTT1pWzVdLHo9aVs4XTtyZXR1cm4gclswXT1uKnkrbypmK2EqdyxyWzNdPW4qcCtvKmcrYSpNLHJbNl09bip4K28qYithKnosclsxXT1oKnkrbCpmK2MqdyxyWzRdPWgqcCtsKmcrYypNLHJbN109aCp4K2wqYitjKnosclsyXT11KnkrZCpmK20qdyxyWzVdPXUqcCtkKmcrbSpNLHJbOF09dSp4K2QqYittKnosdGhpc31tdWx0aXBseVNjYWxhcih0KXtjb25zdCBlPXRoaXMuZWxlbWVudHM7cmV0dXJuIGVbMF0qPXQsZVszXSo9dCxlWzZdKj10LGVbMV0qPXQsZVs0XSo9dCxlWzddKj10LGVbMl0qPXQsZVs1XSo9dCxlWzhdKj10LHRoaXN9ZGV0ZXJtaW5hbnQoKXtjb25zdCB0PXRoaXMuZWxlbWVudHMsZT10WzBdLHM9dFsxXSxpPXRbMl0scj10WzNdLG49dFs0XSxvPXRbNV0sYT10WzZdLGg9dFs3XSxsPXRbOF07cmV0dXJuIGUqbipsLWUqbypoLXMqcipsK3MqbyphK2kqcipoLWkqbiphfWludmVydCgpe2NvbnN0IHQ9dGhpcy5lbGVtZW50cyxlPXRbMF0scz10WzFdLGk9dFsyXSxyPXRbM10sbj10WzRdLG89dFs1XSxhPXRbNl0saD10WzddLGw9dFs4XSxjPWwqbi1vKmgsdT1vKmEtbCpyLGQ9aCpyLW4qYSxtPWUqYytzKnUraSpkO2lmKDA9PT1tKXJldHVybiB0aGlzLnNldCgwLDAsMCwwLDAsMCwwLDAsMCk7Y29uc3QgeT0xL207cmV0dXJuIHRbMF09Yyp5LHRbMV09KGkqaC1sKnMpKnksdFsyXT0obypzLWkqbikqeSx0WzNdPXUqeSx0WzRdPShsKmUtaSphKSp5LHRbNV09KGkqci1vKmUpKnksdFs2XT1kKnksdFs3XT0ocyphLWgqZSkqeSx0WzhdPShuKmUtcypyKSp5LHRoaXN9dHJhbnNwb3NlKCl7bGV0IHQ7Y29uc3QgZT10aGlzLmVsZW1lbnRzO3JldHVybiB0PWVbMV0sZVsxXT1lWzNdLGVbM109dCx0PWVbMl0sZVsyXT1lWzZdLGVbNl09dCx0PWVbNV0sZVs1XT1lWzddLGVbN109dCx0aGlzfWdldE5vcm1hbE1hdHJpeCh0KXtyZXR1cm4gdGhpcy5zZXRGcm9tTWF0cml4NCh0KS5pbnZlcnQoKS50cmFuc3Bvc2UoKX10cmFuc3Bvc2VJbnRvQXJyYXkodCl7Y29uc3QgZT10aGlzLmVsZW1lbnRzO3JldHVybiB0WzBdPWVbMF0sdFsxXT1lWzNdLHRbMl09ZVs2XSx0WzNdPWVbMV0sdFs0XT1lWzRdLHRbNV09ZVs3XSx0WzZdPWVbMl0sdFs3XT1lWzVdLHRbOF09ZVs4XSx0aGlzfXNldFV2VHJhbnNmb3JtKHQsZSxzLGkscixuLG8pe2NvbnN0IGE9TWF0aC5jb3MociksaD1NYXRoLnNpbihyKTtyZXR1cm4gdGhpcy5zZXQocyphLHMqaCwtcyooYSpuK2gqbykrbit0LC1pKmgsaSphLC1pKigtaCpuK2EqbykrbytlLDAsMCwxKSx0aGlzfXNjYWxlKHQsZSl7Y29uc3Qgcz10aGlzLmVsZW1lbnRzO3JldHVybiBzWzBdKj10LHNbM10qPXQsc1s2XSo9dCxzWzFdKj1lLHNbNF0qPWUsc1s3XSo9ZSx0aGlzfXJvdGF0ZSh0KXtjb25zdCBlPU1hdGguY29zKHQpLHM9TWF0aC5zaW4odCksaT10aGlzLmVsZW1lbnRzLHI9aVswXSxuPWlbM10sbz1pWzZdLGE9aVsxXSxoPWlbNF0sbD1pWzddO3JldHVybiBpWzBdPWUqcitzKmEsaVszXT1lKm4rcypoLGlbNl09ZSpvK3MqbCxpWzFdPS1zKnIrZSphLGlbNF09LXMqbitlKmgsaVs3XT0tcypvK2UqbCx0aGlzfXRyYW5zbGF0ZSh0LGUpe2NvbnN0IHM9dGhpcy5lbGVtZW50cztyZXR1cm4gc1swXSs9dCpzWzJdLHNbM10rPXQqc1s1XSxzWzZdKz10KnNbOF0sc1sxXSs9ZSpzWzJdLHNbNF0rPWUqc1s1XSxzWzddKz1lKnNbOF0sdGhpc31lcXVhbHModCl7Y29uc3QgZT10aGlzLmVsZW1lbnRzLHM9dC5lbGVtZW50cztmb3IobGV0IHQ9MDt0PDk7dCsrKWlmKGVbdF0hPT1zW3RdKXJldHVybiExO3JldHVybiEwfWZyb21BcnJheSh0KXtsZXQgZT1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06MDtmb3IobGV0IHM9MDtzPDk7cysrKXRoaXMuZWxlbWVudHNbc109dFtzK2VdO3JldHVybiB0aGlzfXRvQXJyYXkoKXtsZXQgdD1hcmd1bWVudHMubGVuZ3RoPjAmJnZvaWQgMCE9PWFyZ3VtZW50c1swXT9hcmd1bWVudHNbMF06W10sZT1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06MDtjb25zdCBzPXRoaXMuZWxlbWVudHM7cmV0dXJuIHRbZV09c1swXSx0W2UrMV09c1sxXSx0W2UrMl09c1syXSx0W2UrM109c1szXSx0W2UrNF09c1s0XSx0W2UrNV09c1s1XSx0W2UrNl09c1s2XSx0W2UrN109c1s3XSx0W2UrOF09c1s4XSx0fWNsb25lKCl7cmV0dXJuKG5ldyB0aGlzLmNvbnN0cnVjdG9yKS5mcm9tQXJyYXkodGhpcy5lbGVtZW50cyl9fWZ1bmN0aW9uIGModCl7cmV0dXJuIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUygiaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIsdCl9ZnVuY3Rpb24gdSh0KXtyZXR1cm4gdDwuMDQwNDU/LjA3NzM5OTM4MDgqdDpNYXRoLnBvdyguOTQ3ODY3Mjk4Nip0Ky4wNTIxMzI3MDE0LDIuNCl9ZnVuY3Rpb24gZCh0KXtyZXR1cm4gdDwuMDAzMTMwOD8xMi45Mip0OjEuMDU1Kk1hdGgucG93KHQsLjQxNjY2KS0uMDU1fWNvbnN0IG09e1tlXTp7W3NdOnV9LFtzXTp7W2VdOmR9fSx5PXtsZWdhY3lNb2RlOiEwLGdldCB3b3JraW5nQ29sb3JTcGFjZSgpe3JldHVybiBzfSxzZXQgd29ya2luZ0NvbG9yU3BhY2UodCl7Y29uc29sZS53YXJuKCJUSFJFRS5Db2xvck1hbmFnZW1lbnQ6IC53b3JraW5nQ29sb3JTcGFjZSBpcyByZWFkb25seS4iKX0sY29udmVydDpmdW5jdGlvbih0LGUscyl7aWYodGhpcy5sZWdhY3lNb2RlfHxlPT09c3x8IWV8fCFzKXJldHVybiB0O2lmKG1bZV0mJnZvaWQgMCE9PW1bZV1bc10pe2NvbnN0IGk9bVtlXVtzXTtyZXR1cm4gdC5yPWkodC5yKSx0Lmc9aSh0LmcpLHQuYj1pKHQuYiksdH10aHJvdyBuZXcgRXJyb3IoIlVuc3VwcG9ydGVkIGNvbG9yIHNwYWNlIGNvbnZlcnNpb24uIil9LGZyb21Xb3JraW5nQ29sb3JTcGFjZTpmdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLmNvbnZlcnQodCx0aGlzLndvcmtpbmdDb2xvclNwYWNlLGUpfSx0b1dvcmtpbmdDb2xvclNwYWNlOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuY29udmVydCh0LGUsdGhpcy53b3JraW5nQ29sb3JTcGFjZSl9fSxwPXthbGljZWJsdWU6MTU3OTIzODMsYW50aXF1ZXdoaXRlOjE2NDQ0Mzc1LGFxdWE6NjU1MzUsYXF1YW1hcmluZTo4Mzg4NTY0LGF6dXJlOjE1Nzk0MTc1LGJlaWdlOjE2MTE5MjYwLGJpc3F1ZToxNjc3MDI0NCxibGFjazowLGJsYW5jaGVkYWxtb25kOjE2NzcyMDQ1LGJsdWU6MjU1LGJsdWV2aW9sZXQ6OTA1NTIwMixicm93bjoxMDgyNDIzNCxidXJseXdvb2Q6MTQ1OTYyMzEsY2FkZXRibHVlOjYyNjY1MjgsY2hhcnRyZXVzZTo4Mzg4MzUyLGNob2NvbGF0ZToxMzc4OTQ3MCxjb3JhbDoxNjc0NDI3Mixjb3JuZmxvd2VyYmx1ZTo2NTkxOTgxLGNvcm5zaWxrOjE2Nzc1Mzg4LGNyaW1zb246MTQ0MjMxMDAsY3lhbjo2NTUzNSxkYXJrYmx1ZToxMzksZGFya2N5YW46MzU3MjMsZGFya2dvbGRlbnJvZDoxMjA5MjkzOSxkYXJrZ3JheToxMTExOTAxNyxkYXJrZ3JlZW46MjU2MDAsZGFya2dyZXk6MTExMTkwMTcsZGFya2toYWtpOjEyNDMzMjU5LGRhcmttYWdlbnRhOjkxMDk2NDMsZGFya29saXZlZ3JlZW46NTU5Nzk5OSxkYXJrb3JhbmdlOjE2NzQ3NTIwLGRhcmtvcmNoaWQ6MTAwNDAwMTIsZGFya3JlZDo5MTA5NTA0LGRhcmtzYWxtb246MTUzMDg0MTAsZGFya3NlYWdyZWVuOjk0MTk5MTksZGFya3NsYXRlYmx1ZTo0NzM0MzQ3LGRhcmtzbGF0ZWdyYXk6MzEwMDQ5NSxkYXJrc2xhdGVncmV5OjMxMDA0OTUsZGFya3R1cnF1b2lzZTo1Mjk0NSxkYXJrdmlvbGV0Ojk2OTk1MzksZGVlcHBpbms6MTY3MTY5NDcsZGVlcHNreWJsdWU6NDkxNTEsZGltZ3JheTo2OTA4MjY1LGRpbWdyZXk6NjkwODI2NSxkb2RnZXJibHVlOjIwMDMxOTksZmlyZWJyaWNrOjExNjc0MTQ2LGZsb3JhbHdoaXRlOjE2Nzc1OTIwLGZvcmVzdGdyZWVuOjIyNjM4NDIsZnVjaHNpYToxNjcxMTkzNSxnYWluc2Jvcm86MTQ0NzQ0NjAsZ2hvc3R3aGl0ZToxNjMxNjY3MSxnb2xkOjE2NzY2NzIwLGdvbGRlbnJvZDoxNDMyOTEyMCxncmF5Ojg0MjE1MDQsZ3JlZW46MzI3NjgsZ3JlZW55ZWxsb3c6MTE0MDMwNTUsZ3JleTo4NDIxNTA0LGhvbmV5ZGV3OjE1Nzk0MTYwLGhvdHBpbms6MTY3Mzg3NDAsaW5kaWFucmVkOjEzNDU4NTI0LGluZGlnbzo0OTE1MzMwLGl2b3J5OjE2Nzc3MjAwLGtoYWtpOjE1Nzg3NjYwLGxhdmVuZGVyOjE1MTMyNDEwLGxhdmVuZGVyYmx1c2g6MTY3NzMzNjUsbGF3bmdyZWVuOjgxOTA5NzYsbGVtb25jaGlmZm9uOjE2Nzc1ODg1LGxpZ2h0Ymx1ZToxMTM5MzI1NCxsaWdodGNvcmFsOjE1NzYxNTM2LGxpZ2h0Y3lhbjoxNDc0NTU5OSxsaWdodGdvbGRlbnJvZHllbGxvdzoxNjQ0ODIxMCxsaWdodGdyYXk6MTM4ODIzMjMsbGlnaHRncmVlbjo5NDk4MjU2LGxpZ2h0Z3JleToxMzg4MjMyMyxsaWdodHBpbms6MTY3NTg0NjUsbGlnaHRzYWxtb246MTY3NTI3NjIsbGlnaHRzZWFncmVlbjoyMTQyODkwLGxpZ2h0c2t5Ymx1ZTo4OTAwMzQ2LGxpZ2h0c2xhdGVncmF5Ojc4MzM3NTMsbGlnaHRzbGF0ZWdyZXk6NzgzMzc1MyxsaWdodHN0ZWVsYmx1ZToxMTU4NDczNCxsaWdodHllbGxvdzoxNjc3NzE4NCxsaW1lOjY1MjgwLGxpbWVncmVlbjozMzI5MzMwLGxpbmVuOjE2NDQ1NjcwLG1hZ2VudGE6MTY3MTE5MzUsbWFyb29uOjgzODg2MDgsbWVkaXVtYXF1YW1hcmluZTo2NzM3MzIyLG1lZGl1bWJsdWU6MjA1LG1lZGl1bW9yY2hpZDoxMjIxMTY2NyxtZWRpdW1wdXJwbGU6OTY2MjY4MyxtZWRpdW1zZWFncmVlbjozOTc4MDk3LG1lZGl1bXNsYXRlYmx1ZTo4MDg3NzkwLG1lZGl1bXNwcmluZ2dyZWVuOjY0MTU0LG1lZGl1bXR1cnF1b2lzZTo0NzcyMzAwLG1lZGl1bXZpb2xldHJlZDoxMzA0NzE3MyxtaWRuaWdodGJsdWU6MTY0NDkxMixtaW50Y3JlYW06MTYxMjE4NTAsbWlzdHlyb3NlOjE2NzcwMjczLG1vY2Nhc2luOjE2NzcwMjI5LG5hdmFqb3doaXRlOjE2NzY4Njg1LG5hdnk6MTI4LG9sZGxhY2U6MTY2NDM1NTgsb2xpdmU6ODQyMTM3NixvbGl2ZWRyYWI6NzA0ODczOSxvcmFuZ2U6MTY3NTM5MjAsb3JhbmdlcmVkOjE2NzI5MzQ0LG9yY2hpZDoxNDMxNTczNCxwYWxlZ29sZGVucm9kOjE1NjU3MTMwLHBhbGVncmVlbjoxMDAyNTg4MCxwYWxldHVycXVvaXNlOjExNTI5OTY2LHBhbGV2aW9sZXRyZWQ6MTQzODEyMDMscGFwYXlhd2hpcDoxNjc3MzA3NyxwZWFjaHB1ZmY6MTY3Njc2NzMscGVydToxMzQ2ODk5MSxwaW5rOjE2NzYxMDM1LHBsdW06MTQ1MjQ2MzcscG93ZGVyYmx1ZToxMTU5MTkxMCxwdXJwbGU6ODM4ODczNixyZWJlY2NhcHVycGxlOjY2OTc4ODEscmVkOjE2NzExNjgwLHJvc3licm93bjoxMjM1NzUxOSxyb3lhbGJsdWU6NDI4Njk0NSxzYWRkbGVicm93bjo5MTI3MTg3LHNhbG1vbjoxNjQxNjg4MixzYW5keWJyb3duOjE2MDMyODY0LHNlYWdyZWVuOjMwNTAzMjcsc2Vhc2hlbGw6MTY3NzQ2Mzgsc2llbm5hOjEwNTA2Nzk3LHNpbHZlcjoxMjYzMjI1Nixza3libHVlOjg5MDAzMzEsc2xhdGVibHVlOjY5NzAwNjEsc2xhdGVncmF5OjczNzI5NDQsc2xhdGVncmV5OjczNzI5NDQsc25vdzoxNjc3NTkzMCxzcHJpbmdncmVlbjo2NTQwNyxzdGVlbGJsdWU6NDYyMDk4MCx0YW46MTM4MDg3ODAsdGVhbDozMjg5Nix0aGlzdGxlOjE0MjA0ODg4LHRvbWF0bzoxNjczNzA5NSx0dXJxdW9pc2U6NDI1MTg1Nix2aW9sZXQ6MTU2MzEwODYsd2hlYXQ6MTYxMTMzMzEsd2hpdGU6MTY3NzcyMTUsd2hpdGVzbW9rZToxNjExOTI4NSx5ZWxsb3c6MTY3NzY5NjAseWVsbG93Z3JlZW46MTAxNDUwNzR9LHg9e3I6MCxnOjAsYjowfSxmPXtoOjAsczowLGw6MH0sZz17aDowLHM6MCxsOjB9O2Z1bmN0aW9uIGIodCxlLHMpe3JldHVybiBzPDAmJihzKz0xKSxzPjEmJihzLT0xKSxzPDEvNj90KzYqKGUtdCkqczpzPC41P2U6czwyLzM/dCs2KihlLXQpKigyLzMtcyk6dH1mdW5jdGlvbiB3KHQsZSl7cmV0dXJuIGUucj10LnIsZS5nPXQuZyxlLmI9dC5iLGV9Y2xhc3MgTXtjb25zdHJ1Y3Rvcih0LGUscyl7cmV0dXJuIHRoaXMuaXNDb2xvcj0hMCx0aGlzLnI9MSx0aGlzLmc9MSx0aGlzLmI9MSx2b2lkIDA9PT1lJiZ2b2lkIDA9PT1zP3RoaXMuc2V0KHQpOnRoaXMuc2V0UkdCKHQsZSxzKX1zZXQodCl7cmV0dXJuIHQmJnQuaXNDb2xvcj90aGlzLmNvcHkodCk6Im51bWJlciI9PXR5cGVvZiB0P3RoaXMuc2V0SGV4KHQpOiJzdHJpbmciPT10eXBlb2YgdCYmdGhpcy5zZXRTdHlsZSh0KSx0aGlzfXNldFNjYWxhcih0KXtyZXR1cm4gdGhpcy5yPXQsdGhpcy5nPXQsdGhpcy5iPXQsdGhpc31zZXRIZXgodCl7bGV0IHM9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOmU7cmV0dXJuIHQ9TWF0aC5mbG9vcih0KSx0aGlzLnI9KHQ+PjE2JjI1NSkvMjU1LHRoaXMuZz0odD4+OCYyNTUpLzI1NSx0aGlzLmI9KDI1NSZ0KS8yNTUseS50b1dvcmtpbmdDb2xvclNwYWNlKHRoaXMscyksdGhpc31zZXRSR0IodCxlLGkpe2xldCByPWFyZ3VtZW50cy5sZW5ndGg+MyYmdm9pZCAwIT09YXJndW1lbnRzWzNdP2FyZ3VtZW50c1szXTpzO3JldHVybiB0aGlzLnI9dCx0aGlzLmc9ZSx0aGlzLmI9aSx5LnRvV29ya2luZ0NvbG9yU3BhY2UodGhpcyxyKSx0aGlzfXNldEhTTCh0LGUsaSl7bGV0IHI9YXJndW1lbnRzLmxlbmd0aD4zJiZ2b2lkIDAhPT1hcmd1bWVudHNbM10/YXJndW1lbnRzWzNdOnM7dmFyIG47aWYodD0odCUobj0xKStuKSVuLGU9byhlLDAsMSksaT1vKGksMCwxKSwwPT09ZSl0aGlzLnI9dGhpcy5nPXRoaXMuYj1pO2Vsc2V7Y29uc3Qgcz1pPD0uNT9pKigxK2UpOmkrZS1pKmUscj0yKmktczt0aGlzLnI9YihyLHMsdCsxLzMpLHRoaXMuZz1iKHIscyx0KSx0aGlzLmI9YihyLHMsdC0xLzMpfXJldHVybiB5LnRvV29ya2luZ0NvbG9yU3BhY2UodGhpcyxyKSx0aGlzfXNldFN0eWxlKHQpe2xldCBzLGk9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOmU7ZnVuY3Rpb24gcihlKXt2b2lkIDAhPT1lJiZwYXJzZUZsb2F0KGUpPDEmJmNvbnNvbGUud2FybigiVEhSRUUuQ29sb3I6IEFscGhhIGNvbXBvbmVudCBvZiAiK3QrIiB3aWxsIGJlIGlnbm9yZWQuIil9aWYocz0vXigoPzpyZ2J8aHNsKWE/KVwoKFteXCldKilcKS8uZXhlYyh0KSl7bGV0IHQ7Y29uc3QgZT1zWzFdLG49c1syXTtzd2l0Y2goZSl7Y2FzZSJyZ2IiOmNhc2UicmdiYSI6aWYodD0vXlxzKihcZCspXHMqLFxzKihcZCspXHMqLFxzKihcZCspXHMqKD86LFxzKihcZCpcLj9cZCspXHMqKT8kLy5leGVjKG4pKXJldHVybiB0aGlzLnI9TWF0aC5taW4oMjU1LHBhcnNlSW50KHRbMV0sMTApKS8yNTUsdGhpcy5nPU1hdGgubWluKDI1NSxwYXJzZUludCh0WzJdLDEwKSkvMjU1LHRoaXMuYj1NYXRoLm1pbigyNTUscGFyc2VJbnQodFszXSwxMCkpLzI1NSx5LnRvV29ya2luZ0NvbG9yU3BhY2UodGhpcyxpKSxyKHRbNF0pLHRoaXM7aWYodD0vXlxzKihcZCspXCVccyosXHMqKFxkKylcJVxzKixccyooXGQrKVwlXHMqKD86LFxzKihcZCpcLj9cZCspXHMqKT8kLy5leGVjKG4pKXJldHVybiB0aGlzLnI9TWF0aC5taW4oMTAwLHBhcnNlSW50KHRbMV0sMTApKS8xMDAsdGhpcy5nPU1hdGgubWluKDEwMCxwYXJzZUludCh0WzJdLDEwKSkvMTAwLHRoaXMuYj1NYXRoLm1pbigxMDAscGFyc2VJbnQodFszXSwxMCkpLzEwMCx5LnRvV29ya2luZ0NvbG9yU3BhY2UodGhpcyxpKSxyKHRbNF0pLHRoaXM7YnJlYWs7Y2FzZSJoc2wiOmNhc2UiaHNsYSI6aWYodD0vXlxzKihcZCpcLj9cZCspXHMqLFxzKihcZCspXCVccyosXHMqKFxkKylcJVxzKig/OixccyooXGQqXC4/XGQrKVxzKik/JC8uZXhlYyhuKSl7Y29uc3QgZT1wYXJzZUZsb2F0KHRbMV0pLzM2MCxzPXBhcnNlSW50KHRbMl0sMTApLzEwMCxuPXBhcnNlSW50KHRbM10sMTApLzEwMDtyZXR1cm4gcih0WzRdKSx0aGlzLnNldEhTTChlLHMsbixpKX19fWVsc2UgaWYocz0vXlwjKFtBLUZhLWZcZF0rKSQvLmV4ZWModCkpe2NvbnN0IHQ9c1sxXSxlPXQubGVuZ3RoO2lmKDM9PT1lKXJldHVybiB0aGlzLnI9cGFyc2VJbnQodC5jaGFyQXQoMCkrdC5jaGFyQXQoMCksMTYpLzI1NSx0aGlzLmc9cGFyc2VJbnQodC5jaGFyQXQoMSkrdC5jaGFyQXQoMSksMTYpLzI1NSx0aGlzLmI9cGFyc2VJbnQodC5jaGFyQXQoMikrdC5jaGFyQXQoMiksMTYpLzI1NSx5LnRvV29ya2luZ0NvbG9yU3BhY2UodGhpcyxpKSx0aGlzO2lmKDY9PT1lKXJldHVybiB0aGlzLnI9cGFyc2VJbnQodC5jaGFyQXQoMCkrdC5jaGFyQXQoMSksMTYpLzI1NSx0aGlzLmc9cGFyc2VJbnQodC5jaGFyQXQoMikrdC5jaGFyQXQoMyksMTYpLzI1NSx0aGlzLmI9cGFyc2VJbnQodC5jaGFyQXQoNCkrdC5jaGFyQXQoNSksMTYpLzI1NSx5LnRvV29ya2luZ0NvbG9yU3BhY2UodGhpcyxpKSx0aGlzfXJldHVybiB0JiZ0Lmxlbmd0aD4wP3RoaXMuc2V0Q29sb3JOYW1lKHQsaSk6dGhpc31zZXRDb2xvck5hbWUodCl7bGV0IHM9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOmU7Y29uc3QgaT1wW3QudG9Mb3dlckNhc2UoKV07cmV0dXJuIHZvaWQgMCE9PWk/dGhpcy5zZXRIZXgoaSxzKTpjb25zb2xlLndhcm4oIlRIUkVFLkNvbG9yOiBVbmtub3duIGNvbG9yICIrdCksdGhpc31jbG9uZSgpe3JldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3Rvcih0aGlzLnIsdGhpcy5nLHRoaXMuYil9Y29weSh0KXtyZXR1cm4gdGhpcy5yPXQucix0aGlzLmc9dC5nLHRoaXMuYj10LmIsdGhpc31jb3B5U1JHQlRvTGluZWFyKHQpe3JldHVybiB0aGlzLnI9dSh0LnIpLHRoaXMuZz11KHQuZyksdGhpcy5iPXUodC5iKSx0aGlzfWNvcHlMaW5lYXJUb1NSR0IodCl7cmV0dXJuIHRoaXMucj1kKHQuciksdGhpcy5nPWQodC5nKSx0aGlzLmI9ZCh0LmIpLHRoaXN9Y29udmVydFNSR0JUb0xpbmVhcigpe3JldHVybiB0aGlzLmNvcHlTUkdCVG9MaW5lYXIodGhpcyksdGhpc31jb252ZXJ0TGluZWFyVG9TUkdCKCl7cmV0dXJuIHRoaXMuY29weUxpbmVhclRvU1JHQih0aGlzKSx0aGlzfWdldEhleCgpe2xldCB0PWFyZ3VtZW50cy5sZW5ndGg+MCYmdm9pZCAwIT09YXJndW1lbnRzWzBdP2FyZ3VtZW50c1swXTplO3JldHVybiB5LmZyb21Xb3JraW5nQ29sb3JTcGFjZSh3KHRoaXMseCksdCksbygyNTUqeC5yLDAsMjU1KTw8MTZebygyNTUqeC5nLDAsMjU1KTw8OF5vKDI1NSp4LmIsMCwyNTUpPDwwfWdldEhleFN0cmluZygpe2xldCB0PWFyZ3VtZW50cy5sZW5ndGg+MCYmdm9pZCAwIT09YXJndW1lbnRzWzBdP2FyZ3VtZW50c1swXTplO3JldHVybigiMDAwMDAwIit0aGlzLmdldEhleCh0KS50b1N0cmluZygxNikpLnNsaWNlKC02KX1nZXRIU0wodCl7bGV0IGU9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOnM7eS5mcm9tV29ya2luZ0NvbG9yU3BhY2Uodyh0aGlzLHgpLGUpO2NvbnN0IGk9eC5yLHI9eC5nLG49eC5iLG89TWF0aC5tYXgoaSxyLG4pLGE9TWF0aC5taW4oaSxyLG4pO2xldCBoLGw7Y29uc3QgYz0oYStvKS8yO2lmKGE9PT1vKWg9MCxsPTA7ZWxzZXtjb25zdCB0PW8tYTtzd2l0Y2gobD1jPD0uNT90LyhvK2EpOnQvKDItby1hKSxvKXtjYXNlIGk6aD0oci1uKS90KyhyPG4/NjowKTticmVhaztjYXNlIHI6aD0obi1pKS90KzI7YnJlYWs7Y2FzZSBuOmg9KGktcikvdCs0fWgvPTZ9cmV0dXJuIHQuaD1oLHQucz1sLHQubD1jLHR9Z2V0UkdCKHQpe2xldCBlPWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTpzO3JldHVybiB5LmZyb21Xb3JraW5nQ29sb3JTcGFjZSh3KHRoaXMseCksZSksdC5yPXgucix0Lmc9eC5nLHQuYj14LmIsdH1nZXRTdHlsZSgpe2xldCB0PWFyZ3VtZW50cy5sZW5ndGg+MCYmdm9pZCAwIT09YXJndW1lbnRzWzBdP2FyZ3VtZW50c1swXTplO3JldHVybiB5LmZyb21Xb3JraW5nQ29sb3JTcGFjZSh3KHRoaXMseCksdCksdCE9PWU/YGNvbG9yKCR7dH0gJHt4LnJ9ICR7eC5nfSAke3guYn0pYDpgcmdiKCR7MjU1KngucnwwfSwkezI1NSp4Lmd8MH0sJHsyNTUqeC5ifDB9KWB9b2Zmc2V0SFNMKHQsZSxzKXtyZXR1cm4gdGhpcy5nZXRIU0woZiksZi5oKz10LGYucys9ZSxmLmwrPXMsdGhpcy5zZXRIU0woZi5oLGYucyxmLmwpLHRoaXN9YWRkKHQpe3JldHVybiB0aGlzLnIrPXQucix0aGlzLmcrPXQuZyx0aGlzLmIrPXQuYix0aGlzfWFkZENvbG9ycyh0LGUpe3JldHVybiB0aGlzLnI9dC5yK2Uucix0aGlzLmc9dC5nK2UuZyx0aGlzLmI9dC5iK2UuYix0aGlzfWFkZFNjYWxhcih0KXtyZXR1cm4gdGhpcy5yKz10LHRoaXMuZys9dCx0aGlzLmIrPXQsdGhpc31zdWIodCl7cmV0dXJuIHRoaXMucj1NYXRoLm1heCgwLHRoaXMuci10LnIpLHRoaXMuZz1NYXRoLm1heCgwLHRoaXMuZy10LmcpLHRoaXMuYj1NYXRoLm1heCgwLHRoaXMuYi10LmIpLHRoaXN9bXVsdGlwbHkodCl7cmV0dXJuIHRoaXMucio9dC5yLHRoaXMuZyo9dC5nLHRoaXMuYio9dC5iLHRoaXN9bXVsdGlwbHlTY2FsYXIodCl7cmV0dXJuIHRoaXMucio9dCx0aGlzLmcqPXQsdGhpcy5iKj10LHRoaXN9bGVycCh0LGUpe3JldHVybiB0aGlzLnIrPSh0LnItdGhpcy5yKSplLHRoaXMuZys9KHQuZy10aGlzLmcpKmUsdGhpcy5iKz0odC5iLXRoaXMuYikqZSx0aGlzfWxlcnBDb2xvcnModCxlLHMpe3JldHVybiB0aGlzLnI9dC5yKyhlLnItdC5yKSpzLHRoaXMuZz10LmcrKGUuZy10LmcpKnMsdGhpcy5iPXQuYisoZS5iLXQuYikqcyx0aGlzfWxlcnBIU0wodCxlKXt0aGlzLmdldEhTTChmKSx0LmdldEhTTChnKTtjb25zdCBzPWEoZi5oLGcuaCxlKSxpPWEoZi5zLGcucyxlKSxyPWEoZi5sLGcubCxlKTtyZXR1cm4gdGhpcy5zZXRIU0wocyxpLHIpLHRoaXN9ZXF1YWxzKHQpe3JldHVybiB0LnI9PT10aGlzLnImJnQuZz09PXRoaXMuZyYmdC5iPT09dGhpcy5ifWZyb21BcnJheSh0KXtsZXQgZT1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06MDtyZXR1cm4gdGhpcy5yPXRbZV0sdGhpcy5nPXRbZSsxXSx0aGlzLmI9dFtlKzJdLHRoaXN9dG9BcnJheSgpe2xldCB0PWFyZ3VtZW50cy5sZW5ndGg+MCYmdm9pZCAwIT09YXJndW1lbnRzWzBdP2FyZ3VtZW50c1swXTpbXSxlPWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTowO3JldHVybiB0W2VdPXRoaXMucix0W2UrMV09dGhpcy5nLHRbZSsyXT10aGlzLmIsdH1mcm9tQnVmZmVyQXR0cmlidXRlKHQsZSl7cmV0dXJuIHRoaXMucj10LmdldFgoZSksdGhpcy5nPXQuZ2V0WShlKSx0aGlzLmI9dC5nZXRaKGUpLCEwPT09dC5ub3JtYWxpemVkJiYodGhpcy5yLz0yNTUsdGhpcy5nLz0yNTUsdGhpcy5iLz0yNTUpLHRoaXN9dG9KU09OKCl7cmV0dXJuIHRoaXMuZ2V0SGV4KCl9KltTeW1ib2wuaXRlcmF0b3JdKCl7eWllbGQgdGhpcy5yLHlpZWxkIHRoaXMuZyx5aWVsZCB0aGlzLmJ9fWxldCB6O00uTkFNRVM9cDtjbGFzcyB2e2NvbnN0cnVjdG9yKCl7bGV0IHQ9YXJndW1lbnRzLmxlbmd0aD4wJiZ2b2lkIDAhPT1hcmd1bWVudHNbMF0/YXJndW1lbnRzWzBdOm51bGw7dGhpcy5pc1NvdXJjZT0hMCx0aGlzLnV1aWQ9bigpLHRoaXMuZGF0YT10LHRoaXMudmVyc2lvbj0wfXNldCBuZWVkc1VwZGF0ZSh0KXshMD09PXQmJnRoaXMudmVyc2lvbisrfXRvSlNPTih0KXtjb25zdCBlPXZvaWQgMD09PXR8fCJzdHJpbmciPT10eXBlb2YgdDtpZighZSYmdm9pZCAwIT09dC5pbWFnZXNbdGhpcy51dWlkXSlyZXR1cm4gdC5pbWFnZXNbdGhpcy51dWlkXTtjb25zdCBzPXt1dWlkOnRoaXMudXVpZCx1cmw6IiJ9LGk9dGhpcy5kYXRhO2lmKG51bGwhPT1pKXtsZXQgdDtpZihBcnJheS5pc0FycmF5KGkpKXt0PVtdO2ZvcihsZXQgZT0wLHM9aS5sZW5ndGg7ZTxzO2UrKylpW2VdLmlzRGF0YVRleHR1cmU/dC5wdXNoKF8oaVtlXS5pbWFnZSkpOnQucHVzaChfKGlbZV0pKX1lbHNlIHQ9XyhpKTtzLnVybD10fXJldHVybiBlfHwodC5pbWFnZXNbdGhpcy51dWlkXT1zKSxzfX1mdW5jdGlvbiBfKHQpe3JldHVybiJ1bmRlZmluZWQiIT10eXBlb2YgSFRNTEltYWdlRWxlbWVudCYmdCBpbnN0YW5jZW9mIEhUTUxJbWFnZUVsZW1lbnR8fCJ1bmRlZmluZWQiIT10eXBlb2YgSFRNTENhbnZhc0VsZW1lbnQmJnQgaW5zdGFuY2VvZiBIVE1MQ2FudmFzRWxlbWVudHx8InVuZGVmaW5lZCIhPXR5cGVvZiBJbWFnZUJpdG1hcCYmdCBpbnN0YW5jZW9mIEltYWdlQml0bWFwP2NsYXNze3N0YXRpYyBnZXREYXRhVVJMKHQpe2lmKC9eZGF0YTovaS50ZXN0KHQuc3JjKSlyZXR1cm4gdC5zcmM7aWYoInVuZGVmaW5lZCI9PXR5cGVvZiBIVE1MQ2FudmFzRWxlbWVudClyZXR1cm4gdC5zcmM7bGV0IGU7aWYodCBpbnN0YW5jZW9mIEhUTUxDYW52YXNFbGVtZW50KWU9dDtlbHNle3ZvaWQgMD09PXomJih6PWMoImNhbnZhcyIpKSx6LndpZHRoPXQud2lkdGgsei5oZWlnaHQ9dC5oZWlnaHQ7Y29uc3Qgcz16LmdldENvbnRleHQoIjJkIik7dCBpbnN0YW5jZW9mIEltYWdlRGF0YT9zLnB1dEltYWdlRGF0YSh0LDAsMCk6cy5kcmF3SW1hZ2UodCwwLDAsdC53aWR0aCx0LmhlaWdodCksZT16fXJldHVybiBlLndpZHRoPjIwNDh8fGUuaGVpZ2h0PjIwNDg/KGNvbnNvbGUud2FybigiVEhSRUUuSW1hZ2VVdGlscy5nZXREYXRhVVJMOiBJbWFnZSBjb252ZXJ0ZWQgdG8ganBnIGZvciBwZXJmb3JtYW5jZSByZWFzb25zIix0KSxlLnRvRGF0YVVSTCgiaW1hZ2UvanBlZyIsLjYpKTplLnRvRGF0YVVSTCgiaW1hZ2UvcG5nIil9c3RhdGljIHNSR0JUb0xpbmVhcih0KXtpZigidW5kZWZpbmVkIiE9dHlwZW9mIEhUTUxJbWFnZUVsZW1lbnQmJnQgaW5zdGFuY2VvZiBIVE1MSW1hZ2VFbGVtZW50fHwidW5kZWZpbmVkIiE9dHlwZW9mIEhUTUxDYW52YXNFbGVtZW50JiZ0IGluc3RhbmNlb2YgSFRNTENhbnZhc0VsZW1lbnR8fCJ1bmRlZmluZWQiIT10eXBlb2YgSW1hZ2VCaXRtYXAmJnQgaW5zdGFuY2VvZiBJbWFnZUJpdG1hcCl7Y29uc3QgZT1jKCJjYW52YXMiKTtlLndpZHRoPXQud2lkdGgsZS5oZWlnaHQ9dC5oZWlnaHQ7Y29uc3Qgcz1lLmdldENvbnRleHQoIjJkIik7cy5kcmF3SW1hZ2UodCwwLDAsdC53aWR0aCx0LmhlaWdodCk7Y29uc3QgaT1zLmdldEltYWdlRGF0YSgwLDAsdC53aWR0aCx0LmhlaWdodCkscj1pLmRhdGE7Zm9yKGxldCB0PTA7dDxyLmxlbmd0aDt0Kyspclt0XT0yNTUqdShyW3RdLzI1NSk7cmV0dXJuIHMucHV0SW1hZ2VEYXRhKGksMCwwKSxlfWlmKHQuZGF0YSl7Y29uc3QgZT10LmRhdGEuc2xpY2UoMCk7Zm9yKGxldCB0PTA7dDxlLmxlbmd0aDt0KyspZSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXl8fGUgaW5zdGFuY2VvZiBVaW50OENsYW1wZWRBcnJheT9lW3RdPU1hdGguZmxvb3IoMjU1KnUoZVt0XS8yNTUpKTplW3RdPXUoZVt0XSk7cmV0dXJue2RhdGE6ZSx3aWR0aDp0LndpZHRoLGhlaWdodDp0LmhlaWdodH19cmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuSW1hZ2VVdGlscy5zUkdCVG9MaW5lYXIoKTogVW5zdXBwb3J0ZWQgaW1hZ2UgdHlwZS4gTm8gY29sb3Igc3BhY2UgY29udmVyc2lvbiBhcHBsaWVkLiIpLHR9fS5nZXREYXRhVVJMKHQpOnQuZGF0YT97ZGF0YTpBcnJheS5mcm9tKHQuZGF0YSksd2lkdGg6dC53aWR0aCxoZWlnaHQ6dC5oZWlnaHQsdHlwZTp0LmRhdGEuY29uc3RydWN0b3IubmFtZX06KGNvbnNvbGUud2FybigiVEhSRUUuVGV4dHVyZTogVW5hYmxlIHRvIHNlcmlhbGl6ZSBUZXh0dXJlLiIpLHt9KX1sZXQgQT0wO2NsYXNzIFMgZXh0ZW5kcyBpe2NvbnN0cnVjdG9yKCl7bGV0IGU9YXJndW1lbnRzLmxlbmd0aD4wJiZ2b2lkIDAhPT1hcmd1bWVudHNbMF0/YXJndW1lbnRzWzBdOlMuREVGQVVMVF9JTUFHRSxzPWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTpTLkRFRkFVTFRfTUFQUElORyxpPWFyZ3VtZW50cy5sZW5ndGg+MiYmdm9pZCAwIT09YXJndW1lbnRzWzJdP2FyZ3VtZW50c1syXTp0LHI9YXJndW1lbnRzLmxlbmd0aD4zJiZ2b2lkIDAhPT1hcmd1bWVudHNbM10/YXJndW1lbnRzWzNdOnQsbz1hcmd1bWVudHMubGVuZ3RoPjQmJnZvaWQgMCE9PWFyZ3VtZW50c1s0XT9hcmd1bWVudHNbNF06MTAwNixhPWFyZ3VtZW50cy5sZW5ndGg+NSYmdm9pZCAwIT09YXJndW1lbnRzWzVdP2FyZ3VtZW50c1s1XToxMDA4LGM9YXJndW1lbnRzLmxlbmd0aD42JiZ2b2lkIDAhPT1hcmd1bWVudHNbNl0/YXJndW1lbnRzWzZdOjEwMjMsdT1hcmd1bWVudHMubGVuZ3RoPjcmJnZvaWQgMCE9PWFyZ3VtZW50c1s3XT9hcmd1bWVudHNbN106MTAwOSxkPWFyZ3VtZW50cy5sZW5ndGg+OCYmdm9pZCAwIT09YXJndW1lbnRzWzhdP2FyZ3VtZW50c1s4XToxLG09YXJndW1lbnRzLmxlbmd0aD45JiZ2b2lkIDAhPT1hcmd1bWVudHNbOV0/YXJndW1lbnRzWzldOjNlMztzdXBlcigpLHRoaXMuaXNUZXh0dXJlPSEwLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJpZCIse3ZhbHVlOkErK30pLHRoaXMudXVpZD1uKCksdGhpcy5uYW1lPSIiLHRoaXMuc291cmNlPW5ldyB2KGUpLHRoaXMubWlwbWFwcz1bXSx0aGlzLm1hcHBpbmc9cyx0aGlzLndyYXBTPWksdGhpcy53cmFwVD1yLHRoaXMubWFnRmlsdGVyPW8sdGhpcy5taW5GaWx0ZXI9YSx0aGlzLmFuaXNvdHJvcHk9ZCx0aGlzLmZvcm1hdD1jLHRoaXMuaW50ZXJuYWxGb3JtYXQ9bnVsbCx0aGlzLnR5cGU9dSx0aGlzLm9mZnNldD1uZXcgaCgwLDApLHRoaXMucmVwZWF0PW5ldyBoKDEsMSksdGhpcy5jZW50ZXI9bmV3IGgoMCwwKSx0aGlzLnJvdGF0aW9uPTAsdGhpcy5tYXRyaXhBdXRvVXBkYXRlPSEwLHRoaXMubWF0cml4PW5ldyBsLHRoaXMuZ2VuZXJhdGVNaXBtYXBzPSEwLHRoaXMucHJlbXVsdGlwbHlBbHBoYT0hMSx0aGlzLmZsaXBZPSEwLHRoaXMudW5wYWNrQWxpZ25tZW50PTQsdGhpcy5lbmNvZGluZz1tLHRoaXMudXNlckRhdGE9e30sdGhpcy52ZXJzaW9uPTAsdGhpcy5vblVwZGF0ZT1udWxsLHRoaXMuaXNSZW5kZXJUYXJnZXRUZXh0dXJlPSExLHRoaXMubmVlZHNQTVJFTVVwZGF0ZT0hMX1nZXQgaW1hZ2UoKXtyZXR1cm4gdGhpcy5zb3VyY2UuZGF0YX1zZXQgaW1hZ2UodCl7dGhpcy5zb3VyY2UuZGF0YT10fXVwZGF0ZU1hdHJpeCgpe3RoaXMubWF0cml4LnNldFV2VHJhbnNmb3JtKHRoaXMub2Zmc2V0LngsdGhpcy5vZmZzZXQueSx0aGlzLnJlcGVhdC54LHRoaXMucmVwZWF0LnksdGhpcy5yb3RhdGlvbix0aGlzLmNlbnRlci54LHRoaXMuY2VudGVyLnkpfWNsb25lKCl7cmV0dXJuKG5ldyB0aGlzLmNvbnN0cnVjdG9yKS5jb3B5KHRoaXMpfWNvcHkodCl7cmV0dXJuIHRoaXMubmFtZT10Lm5hbWUsdGhpcy5zb3VyY2U9dC5zb3VyY2UsdGhpcy5taXBtYXBzPXQubWlwbWFwcy5zbGljZSgwKSx0aGlzLm1hcHBpbmc9dC5tYXBwaW5nLHRoaXMud3JhcFM9dC53cmFwUyx0aGlzLndyYXBUPXQud3JhcFQsdGhpcy5tYWdGaWx0ZXI9dC5tYWdGaWx0ZXIsdGhpcy5taW5GaWx0ZXI9dC5taW5GaWx0ZXIsdGhpcy5hbmlzb3Ryb3B5PXQuYW5pc290cm9weSx0aGlzLmZvcm1hdD10LmZvcm1hdCx0aGlzLmludGVybmFsRm9ybWF0PXQuaW50ZXJuYWxGb3JtYXQsdGhpcy50eXBlPXQudHlwZSx0aGlzLm9mZnNldC5jb3B5KHQub2Zmc2V0KSx0aGlzLnJlcGVhdC5jb3B5KHQucmVwZWF0KSx0aGlzLmNlbnRlci5jb3B5KHQuY2VudGVyKSx0aGlzLnJvdGF0aW9uPXQucm90YXRpb24sdGhpcy5tYXRyaXhBdXRvVXBkYXRlPXQubWF0cml4QXV0b1VwZGF0ZSx0aGlzLm1hdHJpeC5jb3B5KHQubWF0cml4KSx0aGlzLmdlbmVyYXRlTWlwbWFwcz10LmdlbmVyYXRlTWlwbWFwcyx0aGlzLnByZW11bHRpcGx5QWxwaGE9dC5wcmVtdWx0aXBseUFscGhhLHRoaXMuZmxpcFk9dC5mbGlwWSx0aGlzLnVucGFja0FsaWdubWVudD10LnVucGFja0FsaWdubWVudCx0aGlzLmVuY29kaW5nPXQuZW5jb2RpbmcsdGhpcy51c2VyRGF0YT1KU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHQudXNlckRhdGEpKSx0aGlzLm5lZWRzVXBkYXRlPSEwLHRoaXN9dG9KU09OKHQpe2NvbnN0IGU9dm9pZCAwPT09dHx8InN0cmluZyI9PXR5cGVvZiB0O2lmKCFlJiZ2b2lkIDAhPT10LnRleHR1cmVzW3RoaXMudXVpZF0pcmV0dXJuIHQudGV4dHVyZXNbdGhpcy51dWlkXTtjb25zdCBzPXttZXRhZGF0YTp7dmVyc2lvbjo0LjUsdHlwZToiVGV4dHVyZSIsZ2VuZXJhdG9yOiJUZXh0dXJlLnRvSlNPTiJ9LHV1aWQ6dGhpcy51dWlkLG5hbWU6dGhpcy5uYW1lLGltYWdlOnRoaXMuc291cmNlLnRvSlNPTih0KS51dWlkLG1hcHBpbmc6dGhpcy5tYXBwaW5nLHJlcGVhdDpbdGhpcy5yZXBlYXQueCx0aGlzLnJlcGVhdC55XSxvZmZzZXQ6W3RoaXMub2Zmc2V0LngsdGhpcy5vZmZzZXQueV0sY2VudGVyOlt0aGlzLmNlbnRlci54LHRoaXMuY2VudGVyLnldLHJvdGF0aW9uOnRoaXMucm90YXRpb24sd3JhcDpbdGhpcy53cmFwUyx0aGlzLndyYXBUXSxmb3JtYXQ6dGhpcy5mb3JtYXQsdHlwZTp0aGlzLnR5cGUsZW5jb2Rpbmc6dGhpcy5lbmNvZGluZyxtaW5GaWx0ZXI6dGhpcy5taW5GaWx0ZXIsbWFnRmlsdGVyOnRoaXMubWFnRmlsdGVyLGFuaXNvdHJvcHk6dGhpcy5hbmlzb3Ryb3B5LGZsaXBZOnRoaXMuZmxpcFkscHJlbXVsdGlwbHlBbHBoYTp0aGlzLnByZW11bHRpcGx5QWxwaGEsdW5wYWNrQWxpZ25tZW50OnRoaXMudW5wYWNrQWxpZ25tZW50fTtyZXR1cm4ie30iIT09SlNPTi5zdHJpbmdpZnkodGhpcy51c2VyRGF0YSkmJihzLnVzZXJEYXRhPXRoaXMudXNlckRhdGEpLGV8fCh0LnRleHR1cmVzW3RoaXMudXVpZF09cyksc31kaXNwb3NlKCl7dGhpcy5kaXNwYXRjaEV2ZW50KHt0eXBlOiJkaXNwb3NlIn0pfXRyYW5zZm9ybVV2KGUpe2lmKDMwMCE9PXRoaXMubWFwcGluZylyZXR1cm4gZTtpZihlLmFwcGx5TWF0cml4Myh0aGlzLm1hdHJpeCksZS54PDB8fGUueD4xKXN3aXRjaCh0aGlzLndyYXBTKXtjYXNlIDFlMzplLng9ZS54LU1hdGguZmxvb3IoZS54KTticmVhaztjYXNlIHQ6ZS54PWUueDwwPzA6MTticmVhaztjYXNlIDEwMDI6MT09PU1hdGguYWJzKE1hdGguZmxvb3IoZS54KSUyKT9lLng9TWF0aC5jZWlsKGUueCktZS54OmUueD1lLngtTWF0aC5mbG9vcihlLngpfWlmKGUueTwwfHxlLnk+MSlzd2l0Y2godGhpcy53cmFwVCl7Y2FzZSAxZTM6ZS55PWUueS1NYXRoLmZsb29yKGUueSk7YnJlYWs7Y2FzZSB0OmUueT1lLnk8MD8wOjE7YnJlYWs7Y2FzZSAxMDAyOjE9PT1NYXRoLmFicyhNYXRoLmZsb29yKGUueSklMik/ZS55PU1hdGguY2VpbChlLnkpLWUueTplLnk9ZS55LU1hdGguZmxvb3IoZS55KX1yZXR1cm4gdGhpcy5mbGlwWSYmKGUueT0xLWUueSksZX1zZXQgbmVlZHNVcGRhdGUodCl7ITA9PT10JiYodGhpcy52ZXJzaW9uKyssdGhpcy5zb3VyY2UubmVlZHNVcGRhdGU9ITApfX1TLkRFRkFVTFRfSU1BR0U9bnVsbCxTLkRFRkFVTFRfTUFQUElORz0zMDA7Y2xhc3MgQntjb25zdHJ1Y3Rvcigpe2xldCB0PWFyZ3VtZW50cy5sZW5ndGg+MCYmdm9pZCAwIT09YXJndW1lbnRzWzBdP2FyZ3VtZW50c1swXTowLGU9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOjAscz1hcmd1bWVudHMubGVuZ3RoPjImJnZvaWQgMCE9PWFyZ3VtZW50c1syXT9hcmd1bWVudHNbMl06MCxpPWFyZ3VtZW50cy5sZW5ndGg+MyYmdm9pZCAwIT09YXJndW1lbnRzWzNdP2FyZ3VtZW50c1szXToxO0IucHJvdG90eXBlLmlzVmVjdG9yND0hMCx0aGlzLng9dCx0aGlzLnk9ZSx0aGlzLno9cyx0aGlzLnc9aX1nZXQgd2lkdGgoKXtyZXR1cm4gdGhpcy56fXNldCB3aWR0aCh0KXt0aGlzLno9dH1nZXQgaGVpZ2h0KCl7cmV0dXJuIHRoaXMud31zZXQgaGVpZ2h0KHQpe3RoaXMudz10fXNldCh0LGUscyxpKXtyZXR1cm4gdGhpcy54PXQsdGhpcy55PWUsdGhpcy56PXMsdGhpcy53PWksdGhpc31zZXRTY2FsYXIodCl7cmV0dXJuIHRoaXMueD10LHRoaXMueT10LHRoaXMuej10LHRoaXMudz10LHRoaXN9c2V0WCh0KXtyZXR1cm4gdGhpcy54PXQsdGhpc31zZXRZKHQpe3JldHVybiB0aGlzLnk9dCx0aGlzfXNldFoodCl7cmV0dXJuIHRoaXMuej10LHRoaXN9c2V0Vyh0KXtyZXR1cm4gdGhpcy53PXQsdGhpc31zZXRDb21wb25lbnQodCxlKXtzd2l0Y2godCl7Y2FzZSAwOnRoaXMueD1lO2JyZWFrO2Nhc2UgMTp0aGlzLnk9ZTticmVhaztjYXNlIDI6dGhpcy56PWU7YnJlYWs7Y2FzZSAzOnRoaXMudz1lO2JyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCJpbmRleCBpcyBvdXQgb2YgcmFuZ2U6ICIrdCl9cmV0dXJuIHRoaXN9Z2V0Q29tcG9uZW50KHQpe3N3aXRjaCh0KXtjYXNlIDA6cmV0dXJuIHRoaXMueDtjYXNlIDE6cmV0dXJuIHRoaXMueTtjYXNlIDI6cmV0dXJuIHRoaXMuejtjYXNlIDM6cmV0dXJuIHRoaXMudztkZWZhdWx0OnRocm93IG5ldyBFcnJvcigiaW5kZXggaXMgb3V0IG9mIHJhbmdlOiAiK3QpfX1jbG9uZSgpe3JldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3Rvcih0aGlzLngsdGhpcy55LHRoaXMueix0aGlzLncpfWNvcHkodCl7cmV0dXJuIHRoaXMueD10LngsdGhpcy55PXQueSx0aGlzLno9dC56LHRoaXMudz12b2lkIDAhPT10Lnc/dC53OjEsdGhpc31hZGQodCxlKXtyZXR1cm4gdm9pZCAwIT09ZT8oY29uc29sZS53YXJuKCJUSFJFRS5WZWN0b3I0OiAuYWRkKCkgbm93IG9ubHkgYWNjZXB0cyBvbmUgYXJndW1lbnQuIFVzZSAuYWRkVmVjdG9ycyggYSwgYiApIGluc3RlYWQuIiksdGhpcy5hZGRWZWN0b3JzKHQsZSkpOih0aGlzLngrPXQueCx0aGlzLnkrPXQueSx0aGlzLnorPXQueix0aGlzLncrPXQudyx0aGlzKX1hZGRTY2FsYXIodCl7cmV0dXJuIHRoaXMueCs9dCx0aGlzLnkrPXQsdGhpcy56Kz10LHRoaXMudys9dCx0aGlzfWFkZFZlY3RvcnModCxlKXtyZXR1cm4gdGhpcy54PXQueCtlLngsdGhpcy55PXQueStlLnksdGhpcy56PXQueitlLnosdGhpcy53PXQudytlLncsdGhpc31hZGRTY2FsZWRWZWN0b3IodCxlKXtyZXR1cm4gdGhpcy54Kz10LngqZSx0aGlzLnkrPXQueSplLHRoaXMueis9dC56KmUsdGhpcy53Kz10LncqZSx0aGlzfXN1Yih0LGUpe3JldHVybiB2b2lkIDAhPT1lPyhjb25zb2xlLndhcm4oIlRIUkVFLlZlY3RvcjQ6IC5zdWIoKSBub3cgb25seSBhY2NlcHRzIG9uZSBhcmd1bWVudC4gVXNlIC5zdWJWZWN0b3JzKCBhLCBiICkgaW5zdGVhZC4iKSx0aGlzLnN1YlZlY3RvcnModCxlKSk6KHRoaXMueC09dC54LHRoaXMueS09dC55LHRoaXMuei09dC56LHRoaXMudy09dC53LHRoaXMpfXN1YlNjYWxhcih0KXtyZXR1cm4gdGhpcy54LT10LHRoaXMueS09dCx0aGlzLnotPXQsdGhpcy53LT10LHRoaXN9c3ViVmVjdG9ycyh0LGUpe3JldHVybiB0aGlzLng9dC54LWUueCx0aGlzLnk9dC55LWUueSx0aGlzLno9dC56LWUueix0aGlzLnc9dC53LWUudyx0aGlzfW11bHRpcGx5KHQpe3JldHVybiB0aGlzLngqPXQueCx0aGlzLnkqPXQueSx0aGlzLnoqPXQueix0aGlzLncqPXQudyx0aGlzfW11bHRpcGx5U2NhbGFyKHQpe3JldHVybiB0aGlzLngqPXQsdGhpcy55Kj10LHRoaXMueio9dCx0aGlzLncqPXQsdGhpc31hcHBseU1hdHJpeDQodCl7Y29uc3QgZT10aGlzLngscz10aGlzLnksaT10aGlzLnoscj10aGlzLncsbj10LmVsZW1lbnRzO3JldHVybiB0aGlzLng9blswXSplK25bNF0qcytuWzhdKmkrblsxMl0qcix0aGlzLnk9blsxXSplK25bNV0qcytuWzldKmkrblsxM10qcix0aGlzLno9blsyXSplK25bNl0qcytuWzEwXSppK25bMTRdKnIsdGhpcy53PW5bM10qZStuWzddKnMrblsxMV0qaStuWzE1XSpyLHRoaXN9ZGl2aWRlU2NhbGFyKHQpe3JldHVybiB0aGlzLm11bHRpcGx5U2NhbGFyKDEvdCl9c2V0QXhpc0FuZ2xlRnJvbVF1YXRlcm5pb24odCl7dGhpcy53PTIqTWF0aC5hY29zKHQudyk7Y29uc3QgZT1NYXRoLnNxcnQoMS10LncqdC53KTtyZXR1cm4gZTwxZS00Pyh0aGlzLng9MSx0aGlzLnk9MCx0aGlzLno9MCk6KHRoaXMueD10LngvZSx0aGlzLnk9dC55L2UsdGhpcy56PXQuei9lKSx0aGlzfXNldEF4aXNBbmdsZUZyb21Sb3RhdGlvbk1hdHJpeCh0KXtsZXQgZSxzLGkscjtjb25zdCBuPS4wMSxvPS4xLGE9dC5lbGVtZW50cyxoPWFbMF0sbD1hWzRdLGM9YVs4XSx1PWFbMV0sZD1hWzVdLG09YVs5XSx5PWFbMl0scD1hWzZdLHg9YVsxMF07aWYoTWF0aC5hYnMobC11KTxuJiZNYXRoLmFicyhjLXkpPG4mJk1hdGguYWJzKG0tcCk8bil7aWYoTWF0aC5hYnMobCt1KTxvJiZNYXRoLmFicyhjK3kpPG8mJk1hdGguYWJzKG0rcCk8byYmTWF0aC5hYnMoaCtkK3gtMyk8bylyZXR1cm4gdGhpcy5zZXQoMSwwLDAsMCksdGhpcztlPU1hdGguUEk7Y29uc3QgdD0oaCsxKS8yLGE9KGQrMSkvMixmPSh4KzEpLzIsZz0obCt1KS80LGI9KGMreSkvNCx3PShtK3ApLzQ7cmV0dXJuIHQ+YSYmdD5mP3Q8bj8ocz0wLGk9LjcwNzEwNjc4MSxyPS43MDcxMDY3ODEpOihzPU1hdGguc3FydCh0KSxpPWcvcyxyPWIvcyk6YT5mP2E8bj8ocz0uNzA3MTA2NzgxLGk9MCxyPS43MDcxMDY3ODEpOihpPU1hdGguc3FydChhKSxzPWcvaSxyPXcvaSk6ZjxuPyhzPS43MDcxMDY3ODEsaT0uNzA3MTA2NzgxLHI9MCk6KHI9TWF0aC5zcXJ0KGYpLHM9Yi9yLGk9dy9yKSx0aGlzLnNldChzLGkscixlKSx0aGlzfWxldCBmPU1hdGguc3FydCgocC1tKSoocC1tKSsoYy15KSooYy15KSsodS1sKSoodS1sKSk7cmV0dXJuIE1hdGguYWJzKGYpPC4wMDEmJihmPTEpLHRoaXMueD0ocC1tKS9mLHRoaXMueT0oYy15KS9mLHRoaXMuej0odS1sKS9mLHRoaXMudz1NYXRoLmFjb3MoKGgrZCt4LTEpLzIpLHRoaXN9bWluKHQpe3JldHVybiB0aGlzLng9TWF0aC5taW4odGhpcy54LHQueCksdGhpcy55PU1hdGgubWluKHRoaXMueSx0LnkpLHRoaXMuej1NYXRoLm1pbih0aGlzLnosdC56KSx0aGlzLnc9TWF0aC5taW4odGhpcy53LHQudyksdGhpc31tYXgodCl7cmV0dXJuIHRoaXMueD1NYXRoLm1heCh0aGlzLngsdC54KSx0aGlzLnk9TWF0aC5tYXgodGhpcy55LHQueSksdGhpcy56PU1hdGgubWF4KHRoaXMueix0LnopLHRoaXMudz1NYXRoLm1heCh0aGlzLncsdC53KSx0aGlzfWNsYW1wKHQsZSl7cmV0dXJuIHRoaXMueD1NYXRoLm1heCh0LngsTWF0aC5taW4oZS54LHRoaXMueCkpLHRoaXMueT1NYXRoLm1heCh0LnksTWF0aC5taW4oZS55LHRoaXMueSkpLHRoaXMuej1NYXRoLm1heCh0LnosTWF0aC5taW4oZS56LHRoaXMueikpLHRoaXMudz1NYXRoLm1heCh0LncsTWF0aC5taW4oZS53LHRoaXMudykpLHRoaXN9Y2xhbXBTY2FsYXIodCxlKXtyZXR1cm4gdGhpcy54PU1hdGgubWF4KHQsTWF0aC5taW4oZSx0aGlzLngpKSx0aGlzLnk9TWF0aC5tYXgodCxNYXRoLm1pbihlLHRoaXMueSkpLHRoaXMuej1NYXRoLm1heCh0LE1hdGgubWluKGUsdGhpcy56KSksdGhpcy53PU1hdGgubWF4KHQsTWF0aC5taW4oZSx0aGlzLncpKSx0aGlzfWNsYW1wTGVuZ3RoKHQsZSl7Y29uc3Qgcz10aGlzLmxlbmd0aCgpO3JldHVybiB0aGlzLmRpdmlkZVNjYWxhcihzfHwxKS5tdWx0aXBseVNjYWxhcihNYXRoLm1heCh0LE1hdGgubWluKGUscykpKX1mbG9vcigpe3JldHVybiB0aGlzLng9TWF0aC5mbG9vcih0aGlzLngpLHRoaXMueT1NYXRoLmZsb29yKHRoaXMueSksdGhpcy56PU1hdGguZmxvb3IodGhpcy56KSx0aGlzLnc9TWF0aC5mbG9vcih0aGlzLncpLHRoaXN9Y2VpbCgpe3JldHVybiB0aGlzLng9TWF0aC5jZWlsKHRoaXMueCksdGhpcy55PU1hdGguY2VpbCh0aGlzLnkpLHRoaXMuej1NYXRoLmNlaWwodGhpcy56KSx0aGlzLnc9TWF0aC5jZWlsKHRoaXMudyksdGhpc31yb3VuZCgpe3JldHVybiB0aGlzLng9TWF0aC5yb3VuZCh0aGlzLngpLHRoaXMueT1NYXRoLnJvdW5kKHRoaXMueSksdGhpcy56PU1hdGgucm91bmQodGhpcy56KSx0aGlzLnc9TWF0aC5yb3VuZCh0aGlzLncpLHRoaXN9cm91bmRUb1plcm8oKXtyZXR1cm4gdGhpcy54PXRoaXMueDwwP01hdGguY2VpbCh0aGlzLngpOk1hdGguZmxvb3IodGhpcy54KSx0aGlzLnk9dGhpcy55PDA/TWF0aC5jZWlsKHRoaXMueSk6TWF0aC5mbG9vcih0aGlzLnkpLHRoaXMuej10aGlzLno8MD9NYXRoLmNlaWwodGhpcy56KTpNYXRoLmZsb29yKHRoaXMueiksdGhpcy53PXRoaXMudzwwP01hdGguY2VpbCh0aGlzLncpOk1hdGguZmxvb3IodGhpcy53KSx0aGlzfW5lZ2F0ZSgpe3JldHVybiB0aGlzLng9LXRoaXMueCx0aGlzLnk9LXRoaXMueSx0aGlzLno9LXRoaXMueix0aGlzLnc9LXRoaXMudyx0aGlzfWRvdCh0KXtyZXR1cm4gdGhpcy54KnQueCt0aGlzLnkqdC55K3RoaXMueip0LnordGhpcy53KnQud31sZW5ndGhTcSgpe3JldHVybiB0aGlzLngqdGhpcy54K3RoaXMueSp0aGlzLnkrdGhpcy56KnRoaXMueit0aGlzLncqdGhpcy53fWxlbmd0aCgpe3JldHVybiBNYXRoLnNxcnQodGhpcy54KnRoaXMueCt0aGlzLnkqdGhpcy55K3RoaXMueip0aGlzLnordGhpcy53KnRoaXMudyl9bWFuaGF0dGFuTGVuZ3RoKCl7cmV0dXJuIE1hdGguYWJzKHRoaXMueCkrTWF0aC5hYnModGhpcy55KStNYXRoLmFicyh0aGlzLnopK01hdGguYWJzKHRoaXMudyl9bm9ybWFsaXplKCl7cmV0dXJuIHRoaXMuZGl2aWRlU2NhbGFyKHRoaXMubGVuZ3RoKCl8fDEpfXNldExlbmd0aCh0KXtyZXR1cm4gdGhpcy5ub3JtYWxpemUoKS5tdWx0aXBseVNjYWxhcih0KX1sZXJwKHQsZSl7cmV0dXJuIHRoaXMueCs9KHQueC10aGlzLngpKmUsdGhpcy55Kz0odC55LXRoaXMueSkqZSx0aGlzLnorPSh0LnotdGhpcy56KSplLHRoaXMudys9KHQudy10aGlzLncpKmUsdGhpc31sZXJwVmVjdG9ycyh0LGUscyl7cmV0dXJuIHRoaXMueD10LngrKGUueC10LngpKnMsdGhpcy55PXQueSsoZS55LXQueSkqcyx0aGlzLno9dC56KyhlLnotdC56KSpzLHRoaXMudz10LncrKGUudy10LncpKnMsdGhpc31lcXVhbHModCl7cmV0dXJuIHQueD09PXRoaXMueCYmdC55PT09dGhpcy55JiZ0Lno9PT10aGlzLnomJnQudz09PXRoaXMud31mcm9tQXJyYXkodCl7bGV0IGU9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOjA7cmV0dXJuIHRoaXMueD10W2VdLHRoaXMueT10W2UrMV0sdGhpcy56PXRbZSsyXSx0aGlzLnc9dFtlKzNdLHRoaXN9dG9BcnJheSgpe2xldCB0PWFyZ3VtZW50cy5sZW5ndGg+MCYmdm9pZCAwIT09YXJndW1lbnRzWzBdP2FyZ3VtZW50c1swXTpbXSxlPWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTowO3JldHVybiB0W2VdPXRoaXMueCx0W2UrMV09dGhpcy55LHRbZSsyXT10aGlzLnosdFtlKzNdPXRoaXMudyx0fWZyb21CdWZmZXJBdHRyaWJ1dGUodCxlLHMpe3JldHVybiB2b2lkIDAhPT1zJiZjb25zb2xlLndhcm4oIlRIUkVFLlZlY3RvcjQ6IG9mZnNldCBoYXMgYmVlbiByZW1vdmVkIGZyb20gLmZyb21CdWZmZXJBdHRyaWJ1dGUoKS4iKSx0aGlzLng9dC5nZXRYKGUpLHRoaXMueT10LmdldFkoZSksdGhpcy56PXQuZ2V0WihlKSx0aGlzLnc9dC5nZXRXKGUpLHRoaXN9cmFuZG9tKCl7cmV0dXJuIHRoaXMueD1NYXRoLnJhbmRvbSgpLHRoaXMueT1NYXRoLnJhbmRvbSgpLHRoaXMuej1NYXRoLnJhbmRvbSgpLHRoaXMudz1NYXRoLnJhbmRvbSgpLHRoaXN9KltTeW1ib2wuaXRlcmF0b3JdKCl7eWllbGQgdGhpcy54LHlpZWxkIHRoaXMueSx5aWVsZCB0aGlzLnoseWllbGQgdGhpcy53fX1jbGFzcyBUe2NvbnN0cnVjdG9yKCl7bGV0IHQ9YXJndW1lbnRzLmxlbmd0aD4wJiZ2b2lkIDAhPT1hcmd1bWVudHNbMF0/YXJndW1lbnRzWzBdOjAsZT1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06MCxzPWFyZ3VtZW50cy5sZW5ndGg+MiYmdm9pZCAwIT09YXJndW1lbnRzWzJdP2FyZ3VtZW50c1syXTowLGk9YXJndW1lbnRzLmxlbmd0aD4zJiZ2b2lkIDAhPT1hcmd1bWVudHNbM10/YXJndW1lbnRzWzNdOjE7dGhpcy5pc1F1YXRlcm5pb249ITAsdGhpcy5feD10LHRoaXMuX3k9ZSx0aGlzLl96PXMsdGhpcy5fdz1pfXN0YXRpYyBzbGVycCh0LGUscyxpKXtyZXR1cm4gY29uc29sZS53YXJuKCJUSFJFRS5RdWF0ZXJuaW9uOiBTdGF0aWMgLnNsZXJwKCkgaGFzIGJlZW4gZGVwcmVjYXRlZC4gVXNlIHFtLnNsZXJwUXVhdGVybmlvbnMoIHFhLCBxYiwgdCApIGluc3RlYWQuIikscy5zbGVycFF1YXRlcm5pb25zKHQsZSxpKX1zdGF0aWMgc2xlcnBGbGF0KHQsZSxzLGkscixuLG8pe2xldCBhPXNbaSswXSxoPXNbaSsxXSxsPXNbaSsyXSxjPXNbaSszXTtjb25zdCB1PXJbbiswXSxkPXJbbisxXSxtPXJbbisyXSx5PXJbbiszXTtpZigwPT09bylyZXR1cm4gdFtlKzBdPWEsdFtlKzFdPWgsdFtlKzJdPWwsdm9pZCh0W2UrM109Yyk7aWYoMT09PW8pcmV0dXJuIHRbZSswXT11LHRbZSsxXT1kLHRbZSsyXT1tLHZvaWQodFtlKzNdPXkpO2lmKGMhPT15fHxhIT09dXx8aCE9PWR8fGwhPT1tKXtsZXQgdD0xLW87Y29uc3QgZT1hKnUraCpkK2wqbStjKnkscz1lPj0wPzE6LTEsaT0xLWUqZTtpZihpPk51bWJlci5FUFNJTE9OKXtjb25zdCByPU1hdGguc3FydChpKSxuPU1hdGguYXRhbjIocixlKnMpO3Q9TWF0aC5zaW4odCpuKS9yLG89TWF0aC5zaW4obypuKS9yfWNvbnN0IHI9bypzO2lmKGE9YSp0K3UqcixoPWgqdCtkKnIsbD1sKnQrbSpyLGM9Yyp0K3kqcix0PT09MS1vKXtjb25zdCB0PTEvTWF0aC5zcXJ0KGEqYStoKmgrbCpsK2MqYyk7YSo9dCxoKj10LGwqPXQsYyo9dH19dFtlXT1hLHRbZSsxXT1oLHRbZSsyXT1sLHRbZSszXT1jfXN0YXRpYyBtdWx0aXBseVF1YXRlcm5pb25zRmxhdCh0LGUscyxpLHIsbil7Y29uc3Qgbz1zW2ldLGE9c1tpKzFdLGg9c1tpKzJdLGw9c1tpKzNdLGM9cltuXSx1PXJbbisxXSxkPXJbbisyXSxtPXJbbiszXTtyZXR1cm4gdFtlXT1vKm0rbCpjK2EqZC1oKnUsdFtlKzFdPWEqbStsKnUraCpjLW8qZCx0W2UrMl09aCptK2wqZCtvKnUtYSpjLHRbZSszXT1sKm0tbypjLWEqdS1oKmQsdH1nZXQgeCgpe3JldHVybiB0aGlzLl94fXNldCB4KHQpe3RoaXMuX3g9dCx0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCl9Z2V0IHkoKXtyZXR1cm4gdGhpcy5feX1zZXQgeSh0KXt0aGlzLl95PXQsdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpfWdldCB6KCl7cmV0dXJuIHRoaXMuX3p9c2V0IHoodCl7dGhpcy5fej10LHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKX1nZXQgdygpe3JldHVybiB0aGlzLl93fXNldCB3KHQpe3RoaXMuX3c9dCx0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCl9c2V0KHQsZSxzLGkpe3JldHVybiB0aGlzLl94PXQsdGhpcy5feT1lLHRoaXMuX3o9cyx0aGlzLl93PWksdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpLHRoaXN9Y2xvbmUoKXtyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IodGhpcy5feCx0aGlzLl95LHRoaXMuX3osdGhpcy5fdyl9Y29weSh0KXtyZXR1cm4gdGhpcy5feD10LngsdGhpcy5feT10LnksdGhpcy5fej10LnosdGhpcy5fdz10LncsdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpLHRoaXN9c2V0RnJvbUV1bGVyKHQsZSl7aWYoIXR8fCF0LmlzRXVsZXIpdGhyb3cgbmV3IEVycm9yKCJUSFJFRS5RdWF0ZXJuaW9uOiAuc2V0RnJvbUV1bGVyKCkgbm93IGV4cGVjdHMgYW4gRXVsZXIgcm90YXRpb24gcmF0aGVyIHRoYW4gYSBWZWN0b3IzIGFuZCBvcmRlci4iKTtjb25zdCBzPXQuX3gsaT10Ll95LHI9dC5feixuPXQuX29yZGVyLG89TWF0aC5jb3MsYT1NYXRoLnNpbixoPW8ocy8yKSxsPW8oaS8yKSxjPW8oci8yKSx1PWEocy8yKSxkPWEoaS8yKSxtPWEoci8yKTtzd2l0Y2gobil7Y2FzZSJYWVoiOnRoaXMuX3g9dSpsKmMraCpkKm0sdGhpcy5feT1oKmQqYy11KmwqbSx0aGlzLl96PWgqbCptK3UqZCpjLHRoaXMuX3c9aCpsKmMtdSpkKm07YnJlYWs7Y2FzZSJZWFoiOnRoaXMuX3g9dSpsKmMraCpkKm0sdGhpcy5feT1oKmQqYy11KmwqbSx0aGlzLl96PWgqbCptLXUqZCpjLHRoaXMuX3c9aCpsKmMrdSpkKm07YnJlYWs7Y2FzZSJaWFkiOnRoaXMuX3g9dSpsKmMtaCpkKm0sdGhpcy5feT1oKmQqYyt1KmwqbSx0aGlzLl96PWgqbCptK3UqZCpjLHRoaXMuX3c9aCpsKmMtdSpkKm07YnJlYWs7Y2FzZSJaWVgiOnRoaXMuX3g9dSpsKmMtaCpkKm0sdGhpcy5feT1oKmQqYyt1KmwqbSx0aGlzLl96PWgqbCptLXUqZCpjLHRoaXMuX3c9aCpsKmMrdSpkKm07YnJlYWs7Y2FzZSJZWlgiOnRoaXMuX3g9dSpsKmMraCpkKm0sdGhpcy5feT1oKmQqYyt1KmwqbSx0aGlzLl96PWgqbCptLXUqZCpjLHRoaXMuX3c9aCpsKmMtdSpkKm07YnJlYWs7Y2FzZSJYWlkiOnRoaXMuX3g9dSpsKmMtaCpkKm0sdGhpcy5feT1oKmQqYy11KmwqbSx0aGlzLl96PWgqbCptK3UqZCpjLHRoaXMuX3c9aCpsKmMrdSpkKm07YnJlYWs7ZGVmYXVsdDpjb25zb2xlLndhcm4oIlRIUkVFLlF1YXRlcm5pb246IC5zZXRGcm9tRXVsZXIoKSBlbmNvdW50ZXJlZCBhbiB1bmtub3duIG9yZGVyOiAiK24pfXJldHVybiExIT09ZSYmdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpLHRoaXN9c2V0RnJvbUF4aXNBbmdsZSh0LGUpe2NvbnN0IHM9ZS8yLGk9TWF0aC5zaW4ocyk7cmV0dXJuIHRoaXMuX3g9dC54KmksdGhpcy5feT10LnkqaSx0aGlzLl96PXQueippLHRoaXMuX3c9TWF0aC5jb3MocyksdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpLHRoaXN9c2V0RnJvbVJvdGF0aW9uTWF0cml4KHQpe2NvbnN0IGU9dC5lbGVtZW50cyxzPWVbMF0saT1lWzRdLHI9ZVs4XSxuPWVbMV0sbz1lWzVdLGE9ZVs5XSxoPWVbMl0sbD1lWzZdLGM9ZVsxMF0sdT1zK28rYztpZih1PjApe2NvbnN0IHQ9LjUvTWF0aC5zcXJ0KHUrMSk7dGhpcy5fdz0uMjUvdCx0aGlzLl94PShsLWEpKnQsdGhpcy5feT0oci1oKSp0LHRoaXMuX3o9KG4taSkqdH1lbHNlIGlmKHM+byYmcz5jKXtjb25zdCB0PTIqTWF0aC5zcXJ0KDErcy1vLWMpO3RoaXMuX3c9KGwtYSkvdCx0aGlzLl94PS4yNSp0LHRoaXMuX3k9KGkrbikvdCx0aGlzLl96PShyK2gpL3R9ZWxzZSBpZihvPmMpe2NvbnN0IHQ9MipNYXRoLnNxcnQoMStvLXMtYyk7dGhpcy5fdz0oci1oKS90LHRoaXMuX3g9KGkrbikvdCx0aGlzLl95PS4yNSp0LHRoaXMuX3o9KGErbCkvdH1lbHNle2NvbnN0IHQ9MipNYXRoLnNxcnQoMStjLXMtbyk7dGhpcy5fdz0obi1pKS90LHRoaXMuX3g9KHIraCkvdCx0aGlzLl95PShhK2wpL3QsdGhpcy5fej0uMjUqdH1yZXR1cm4gdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpLHRoaXN9c2V0RnJvbVVuaXRWZWN0b3JzKHQsZSl7bGV0IHM9dC5kb3QoZSkrMTtyZXR1cm4gczxOdW1iZXIuRVBTSUxPTj8ocz0wLE1hdGguYWJzKHQueCk+TWF0aC5hYnModC56KT8odGhpcy5feD0tdC55LHRoaXMuX3k9dC54LHRoaXMuX3o9MCx0aGlzLl93PXMpOih0aGlzLl94PTAsdGhpcy5feT0tdC56LHRoaXMuX3o9dC55LHRoaXMuX3c9cykpOih0aGlzLl94PXQueSplLnotdC56KmUueSx0aGlzLl95PXQueiplLngtdC54KmUueix0aGlzLl96PXQueCplLnktdC55KmUueCx0aGlzLl93PXMpLHRoaXMubm9ybWFsaXplKCl9YW5nbGVUbyh0KXtyZXR1cm4gMipNYXRoLmFjb3MoTWF0aC5hYnMobyh0aGlzLmRvdCh0KSwtMSwxKSkpfXJvdGF0ZVRvd2FyZHModCxlKXtjb25zdCBzPXRoaXMuYW5nbGVUbyh0KTtpZigwPT09cylyZXR1cm4gdGhpcztjb25zdCBpPU1hdGgubWluKDEsZS9zKTtyZXR1cm4gdGhpcy5zbGVycCh0LGkpLHRoaXN9aWRlbnRpdHkoKXtyZXR1cm4gdGhpcy5zZXQoMCwwLDAsMSl9aW52ZXJ0KCl7cmV0dXJuIHRoaXMuY29uanVnYXRlKCl9Y29uanVnYXRlKCl7cmV0dXJuIHRoaXMuX3gqPS0xLHRoaXMuX3kqPS0xLHRoaXMuX3oqPS0xLHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKSx0aGlzfWRvdCh0KXtyZXR1cm4gdGhpcy5feCp0Ll94K3RoaXMuX3kqdC5feSt0aGlzLl96KnQuX3ordGhpcy5fdyp0Ll93fWxlbmd0aFNxKCl7cmV0dXJuIHRoaXMuX3gqdGhpcy5feCt0aGlzLl95KnRoaXMuX3krdGhpcy5feip0aGlzLl96K3RoaXMuX3cqdGhpcy5fd31sZW5ndGgoKXtyZXR1cm4gTWF0aC5zcXJ0KHRoaXMuX3gqdGhpcy5feCt0aGlzLl95KnRoaXMuX3krdGhpcy5feip0aGlzLl96K3RoaXMuX3cqdGhpcy5fdyl9bm9ybWFsaXplKCl7bGV0IHQ9dGhpcy5sZW5ndGgoKTtyZXR1cm4gMD09PXQ/KHRoaXMuX3g9MCx0aGlzLl95PTAsdGhpcy5fej0wLHRoaXMuX3c9MSk6KHQ9MS90LHRoaXMuX3g9dGhpcy5feCp0LHRoaXMuX3k9dGhpcy5feSp0LHRoaXMuX3o9dGhpcy5feip0LHRoaXMuX3c9dGhpcy5fdyp0KSx0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCksdGhpc31tdWx0aXBseSh0LGUpe3JldHVybiB2b2lkIDAhPT1lPyhjb25zb2xlLndhcm4oIlRIUkVFLlF1YXRlcm5pb246IC5tdWx0aXBseSgpIG5vdyBvbmx5IGFjY2VwdHMgb25lIGFyZ3VtZW50LiBVc2UgLm11bHRpcGx5UXVhdGVybmlvbnMoIGEsIGIgKSBpbnN0ZWFkLiIpLHRoaXMubXVsdGlwbHlRdWF0ZXJuaW9ucyh0LGUpKTp0aGlzLm11bHRpcGx5UXVhdGVybmlvbnModGhpcyx0KX1wcmVtdWx0aXBseSh0KXtyZXR1cm4gdGhpcy5tdWx0aXBseVF1YXRlcm5pb25zKHQsdGhpcyl9bXVsdGlwbHlRdWF0ZXJuaW9ucyh0LGUpe2NvbnN0IHM9dC5feCxpPXQuX3kscj10Ll96LG49dC5fdyxvPWUuX3gsYT1lLl95LGg9ZS5feixsPWUuX3c7cmV0dXJuIHRoaXMuX3g9cypsK24qbytpKmgtciphLHRoaXMuX3k9aSpsK24qYStyKm8tcypoLHRoaXMuX3o9cipsK24qaCtzKmEtaSpvLHRoaXMuX3c9bipsLXMqby1pKmEtcipoLHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKSx0aGlzfXNsZXJwKHQsZSl7aWYoMD09PWUpcmV0dXJuIHRoaXM7aWYoMT09PWUpcmV0dXJuIHRoaXMuY29weSh0KTtjb25zdCBzPXRoaXMuX3gsaT10aGlzLl95LHI9dGhpcy5feixuPXRoaXMuX3c7bGV0IG89bip0Ll93K3MqdC5feCtpKnQuX3krcip0Ll96O2lmKG88MD8odGhpcy5fdz0tdC5fdyx0aGlzLl94PS10Ll94LHRoaXMuX3k9LXQuX3ksdGhpcy5fej0tdC5feixvPS1vKTp0aGlzLmNvcHkodCksbz49MSlyZXR1cm4gdGhpcy5fdz1uLHRoaXMuX3g9cyx0aGlzLl95PWksdGhpcy5fej1yLHRoaXM7Y29uc3QgYT0xLW8qbztpZihhPD1OdW1iZXIuRVBTSUxPTil7Y29uc3QgdD0xLWU7cmV0dXJuIHRoaXMuX3c9dCpuK2UqdGhpcy5fdyx0aGlzLl94PXQqcytlKnRoaXMuX3gsdGhpcy5feT10KmkrZSp0aGlzLl95LHRoaXMuX3o9dCpyK2UqdGhpcy5feix0aGlzLm5vcm1hbGl6ZSgpLHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKSx0aGlzfWNvbnN0IGg9TWF0aC5zcXJ0KGEpLGw9TWF0aC5hdGFuMihoLG8pLGM9TWF0aC5zaW4oKDEtZSkqbCkvaCx1PU1hdGguc2luKGUqbCkvaDtyZXR1cm4gdGhpcy5fdz1uKmMrdGhpcy5fdyp1LHRoaXMuX3g9cypjK3RoaXMuX3gqdSx0aGlzLl95PWkqYyt0aGlzLl95KnUsdGhpcy5fej1yKmMrdGhpcy5feip1LHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKSx0aGlzfXNsZXJwUXVhdGVybmlvbnModCxlLHMpe3JldHVybiB0aGlzLmNvcHkodCkuc2xlcnAoZSxzKX1yYW5kb20oKXtjb25zdCB0PU1hdGgucmFuZG9tKCksZT1NYXRoLnNxcnQoMS10KSxzPU1hdGguc3FydCh0KSxpPTIqTWF0aC5QSSpNYXRoLnJhbmRvbSgpLHI9MipNYXRoLlBJKk1hdGgucmFuZG9tKCk7cmV0dXJuIHRoaXMuc2V0KGUqTWF0aC5jb3MoaSkscypNYXRoLnNpbihyKSxzKk1hdGguY29zKHIpLGUqTWF0aC5zaW4oaSkpfWVxdWFscyh0KXtyZXR1cm4gdC5feD09PXRoaXMuX3gmJnQuX3k9PT10aGlzLl95JiZ0Ll96PT09dGhpcy5feiYmdC5fdz09PXRoaXMuX3d9ZnJvbUFycmF5KHQpe2xldCBlPWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTowO3JldHVybiB0aGlzLl94PXRbZV0sdGhpcy5feT10W2UrMV0sdGhpcy5fej10W2UrMl0sdGhpcy5fdz10W2UrM10sdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpLHRoaXN9dG9BcnJheSgpe2xldCB0PWFyZ3VtZW50cy5sZW5ndGg+MCYmdm9pZCAwIT09YXJndW1lbnRzWzBdP2FyZ3VtZW50c1swXTpbXSxlPWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTowO3JldHVybiB0W2VdPXRoaXMuX3gsdFtlKzFdPXRoaXMuX3ksdFtlKzJdPXRoaXMuX3osdFtlKzNdPXRoaXMuX3csdH1mcm9tQnVmZmVyQXR0cmlidXRlKHQsZSl7cmV0dXJuIHRoaXMuX3g9dC5nZXRYKGUpLHRoaXMuX3k9dC5nZXRZKGUpLHRoaXMuX3o9dC5nZXRaKGUpLHRoaXMuX3c9dC5nZXRXKGUpLHRoaXN9X29uQ2hhbmdlKHQpe3JldHVybiB0aGlzLl9vbkNoYW5nZUNhbGxiYWNrPXQsdGhpc31fb25DaGFuZ2VDYWxsYmFjaygpe30qW1N5bWJvbC5pdGVyYXRvcl0oKXt5aWVsZCB0aGlzLl94LHlpZWxkIHRoaXMuX3kseWllbGQgdGhpcy5feix5aWVsZCB0aGlzLl93fX1jbGFzcyBFe2NvbnN0cnVjdG9yKCl7bGV0IHQ9YXJndW1lbnRzLmxlbmd0aD4wJiZ2b2lkIDAhPT1hcmd1bWVudHNbMF0/YXJndW1lbnRzWzBdOjAsZT1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06MCxzPWFyZ3VtZW50cy5sZW5ndGg+MiYmdm9pZCAwIT09YXJndW1lbnRzWzJdP2FyZ3VtZW50c1syXTowO0UucHJvdG90eXBlLmlzVmVjdG9yMz0hMCx0aGlzLng9dCx0aGlzLnk9ZSx0aGlzLno9c31zZXQodCxlLHMpe3JldHVybiB2b2lkIDA9PT1zJiYocz10aGlzLnopLHRoaXMueD10LHRoaXMueT1lLHRoaXMuej1zLHRoaXN9c2V0U2NhbGFyKHQpe3JldHVybiB0aGlzLng9dCx0aGlzLnk9dCx0aGlzLno9dCx0aGlzfXNldFgodCl7cmV0dXJuIHRoaXMueD10LHRoaXN9c2V0WSh0KXtyZXR1cm4gdGhpcy55PXQsdGhpc31zZXRaKHQpe3JldHVybiB0aGlzLno9dCx0aGlzfXNldENvbXBvbmVudCh0LGUpe3N3aXRjaCh0KXtjYXNlIDA6dGhpcy54PWU7YnJlYWs7Y2FzZSAxOnRoaXMueT1lO2JyZWFrO2Nhc2UgMjp0aGlzLno9ZTticmVhaztkZWZhdWx0OnRocm93IG5ldyBFcnJvcigiaW5kZXggaXMgb3V0IG9mIHJhbmdlOiAiK3QpfXJldHVybiB0aGlzfWdldENvbXBvbmVudCh0KXtzd2l0Y2godCl7Y2FzZSAwOnJldHVybiB0aGlzLng7Y2FzZSAxOnJldHVybiB0aGlzLnk7Y2FzZSAyOnJldHVybiB0aGlzLno7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoImluZGV4IGlzIG91dCBvZiByYW5nZTogIit0KX19Y2xvbmUoKXtyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IodGhpcy54LHRoaXMueSx0aGlzLnopfWNvcHkodCl7cmV0dXJuIHRoaXMueD10LngsdGhpcy55PXQueSx0aGlzLno9dC56LHRoaXN9YWRkKHQsZSl7cmV0dXJuIHZvaWQgMCE9PWU/KGNvbnNvbGUud2FybigiVEhSRUUuVmVjdG9yMzogLmFkZCgpIG5vdyBvbmx5IGFjY2VwdHMgb25lIGFyZ3VtZW50LiBVc2UgLmFkZFZlY3RvcnMoIGEsIGIgKSBpbnN0ZWFkLiIpLHRoaXMuYWRkVmVjdG9ycyh0LGUpKToodGhpcy54Kz10LngsdGhpcy55Kz10LnksdGhpcy56Kz10LnosdGhpcyl9YWRkU2NhbGFyKHQpe3JldHVybiB0aGlzLngrPXQsdGhpcy55Kz10LHRoaXMueis9dCx0aGlzfWFkZFZlY3RvcnModCxlKXtyZXR1cm4gdGhpcy54PXQueCtlLngsdGhpcy55PXQueStlLnksdGhpcy56PXQueitlLnosdGhpc31hZGRTY2FsZWRWZWN0b3IodCxlKXtyZXR1cm4gdGhpcy54Kz10LngqZSx0aGlzLnkrPXQueSplLHRoaXMueis9dC56KmUsdGhpc31zdWIodCxlKXtyZXR1cm4gdm9pZCAwIT09ZT8oY29uc29sZS53YXJuKCJUSFJFRS5WZWN0b3IzOiAuc3ViKCkgbm93IG9ubHkgYWNjZXB0cyBvbmUgYXJndW1lbnQuIFVzZSAuc3ViVmVjdG9ycyggYSwgYiApIGluc3RlYWQuIiksdGhpcy5zdWJWZWN0b3JzKHQsZSkpOih0aGlzLngtPXQueCx0aGlzLnktPXQueSx0aGlzLnotPXQueix0aGlzKX1zdWJTY2FsYXIodCl7cmV0dXJuIHRoaXMueC09dCx0aGlzLnktPXQsdGhpcy56LT10LHRoaXN9c3ViVmVjdG9ycyh0LGUpe3JldHVybiB0aGlzLng9dC54LWUueCx0aGlzLnk9dC55LWUueSx0aGlzLno9dC56LWUueix0aGlzfW11bHRpcGx5KHQsZSl7cmV0dXJuIHZvaWQgMCE9PWU/KGNvbnNvbGUud2FybigiVEhSRUUuVmVjdG9yMzogLm11bHRpcGx5KCkgbm93IG9ubHkgYWNjZXB0cyBvbmUgYXJndW1lbnQuIFVzZSAubXVsdGlwbHlWZWN0b3JzKCBhLCBiICkgaW5zdGVhZC4iKSx0aGlzLm11bHRpcGx5VmVjdG9ycyh0LGUpKToodGhpcy54Kj10LngsdGhpcy55Kj10LnksdGhpcy56Kj10LnosdGhpcyl9bXVsdGlwbHlTY2FsYXIodCl7cmV0dXJuIHRoaXMueCo9dCx0aGlzLnkqPXQsdGhpcy56Kj10LHRoaXN9bXVsdGlwbHlWZWN0b3JzKHQsZSl7cmV0dXJuIHRoaXMueD10LngqZS54LHRoaXMueT10LnkqZS55LHRoaXMuej10LnoqZS56LHRoaXN9YXBwbHlFdWxlcih0KXtyZXR1cm4gdCYmdC5pc0V1bGVyfHxjb25zb2xlLmVycm9yKCJUSFJFRS5WZWN0b3IzOiAuYXBwbHlFdWxlcigpIG5vdyBleHBlY3RzIGFuIEV1bGVyIHJvdGF0aW9uIHJhdGhlciB0aGFuIGEgVmVjdG9yMyBhbmQgb3JkZXIuIiksdGhpcy5hcHBseVF1YXRlcm5pb24oUC5zZXRGcm9tRXVsZXIodCkpfWFwcGx5QXhpc0FuZ2xlKHQsZSl7cmV0dXJuIHRoaXMuYXBwbHlRdWF0ZXJuaW9uKFAuc2V0RnJvbUF4aXNBbmdsZSh0LGUpKX1hcHBseU1hdHJpeDModCl7Y29uc3QgZT10aGlzLngscz10aGlzLnksaT10aGlzLnoscj10LmVsZW1lbnRzO3JldHVybiB0aGlzLng9clswXSplK3JbM10qcytyWzZdKmksdGhpcy55PXJbMV0qZStyWzRdKnMrcls3XSppLHRoaXMuej1yWzJdKmUrcls1XSpzK3JbOF0qaSx0aGlzfWFwcGx5Tm9ybWFsTWF0cml4KHQpe3JldHVybiB0aGlzLmFwcGx5TWF0cml4Myh0KS5ub3JtYWxpemUoKX1hcHBseU1hdHJpeDQodCl7Y29uc3QgZT10aGlzLngscz10aGlzLnksaT10aGlzLnoscj10LmVsZW1lbnRzLG49MS8oclszXSplK3JbN10qcytyWzExXSppK3JbMTVdKTtyZXR1cm4gdGhpcy54PShyWzBdKmUrcls0XSpzK3JbOF0qaStyWzEyXSkqbix0aGlzLnk9KHJbMV0qZStyWzVdKnMrcls5XSppK3JbMTNdKSpuLHRoaXMuej0oclsyXSplK3JbNl0qcytyWzEwXSppK3JbMTRdKSpuLHRoaXN9YXBwbHlRdWF0ZXJuaW9uKHQpe2NvbnN0IGU9dGhpcy54LHM9dGhpcy55LGk9dGhpcy56LHI9dC54LG49dC55LG89dC56LGE9dC53LGg9YSplK24qaS1vKnMsbD1hKnMrbyplLXIqaSxjPWEqaStyKnMtbiplLHU9LXIqZS1uKnMtbyppO3JldHVybiB0aGlzLng9aCphK3UqLXIrbCotby1jKi1uLHRoaXMueT1sKmErdSotbitjKi1yLWgqLW8sdGhpcy56PWMqYSt1Ki1vK2gqLW4tbCotcix0aGlzfXByb2plY3QodCl7cmV0dXJuIHRoaXMuYXBwbHlNYXRyaXg0KHQubWF0cml4V29ybGRJbnZlcnNlKS5hcHBseU1hdHJpeDQodC5wcm9qZWN0aW9uTWF0cml4KX11bnByb2plY3QodCl7cmV0dXJuIHRoaXMuYXBwbHlNYXRyaXg0KHQucHJvamVjdGlvbk1hdHJpeEludmVyc2UpLmFwcGx5TWF0cml4NCh0Lm1hdHJpeFdvcmxkKX10cmFuc2Zvcm1EaXJlY3Rpb24odCl7Y29uc3QgZT10aGlzLngscz10aGlzLnksaT10aGlzLnoscj10LmVsZW1lbnRzO3JldHVybiB0aGlzLng9clswXSplK3JbNF0qcytyWzhdKmksdGhpcy55PXJbMV0qZStyWzVdKnMrcls5XSppLHRoaXMuej1yWzJdKmUrcls2XSpzK3JbMTBdKmksdGhpcy5ub3JtYWxpemUoKX1kaXZpZGUodCl7cmV0dXJuIHRoaXMueC89dC54LHRoaXMueS89dC55LHRoaXMuei89dC56LHRoaXN9ZGl2aWRlU2NhbGFyKHQpe3JldHVybiB0aGlzLm11bHRpcGx5U2NhbGFyKDEvdCl9bWluKHQpe3JldHVybiB0aGlzLng9TWF0aC5taW4odGhpcy54LHQueCksdGhpcy55PU1hdGgubWluKHRoaXMueSx0LnkpLHRoaXMuej1NYXRoLm1pbih0aGlzLnosdC56KSx0aGlzfW1heCh0KXtyZXR1cm4gdGhpcy54PU1hdGgubWF4KHRoaXMueCx0LngpLHRoaXMueT1NYXRoLm1heCh0aGlzLnksdC55KSx0aGlzLno9TWF0aC5tYXgodGhpcy56LHQueiksdGhpc31jbGFtcCh0LGUpe3JldHVybiB0aGlzLng9TWF0aC5tYXgodC54LE1hdGgubWluKGUueCx0aGlzLngpKSx0aGlzLnk9TWF0aC5tYXgodC55LE1hdGgubWluKGUueSx0aGlzLnkpKSx0aGlzLno9TWF0aC5tYXgodC56LE1hdGgubWluKGUueix0aGlzLnopKSx0aGlzfWNsYW1wU2NhbGFyKHQsZSl7cmV0dXJuIHRoaXMueD1NYXRoLm1heCh0LE1hdGgubWluKGUsdGhpcy54KSksdGhpcy55PU1hdGgubWF4KHQsTWF0aC5taW4oZSx0aGlzLnkpKSx0aGlzLno9TWF0aC5tYXgodCxNYXRoLm1pbihlLHRoaXMueikpLHRoaXN9Y2xhbXBMZW5ndGgodCxlKXtjb25zdCBzPXRoaXMubGVuZ3RoKCk7cmV0dXJuIHRoaXMuZGl2aWRlU2NhbGFyKHN8fDEpLm11bHRpcGx5U2NhbGFyKE1hdGgubWF4KHQsTWF0aC5taW4oZSxzKSkpfWZsb29yKCl7cmV0dXJuIHRoaXMueD1NYXRoLmZsb29yKHRoaXMueCksdGhpcy55PU1hdGguZmxvb3IodGhpcy55KSx0aGlzLno9TWF0aC5mbG9vcih0aGlzLnopLHRoaXN9Y2VpbCgpe3JldHVybiB0aGlzLng9TWF0aC5jZWlsKHRoaXMueCksdGhpcy55PU1hdGguY2VpbCh0aGlzLnkpLHRoaXMuej1NYXRoLmNlaWwodGhpcy56KSx0aGlzfXJvdW5kKCl7cmV0dXJuIHRoaXMueD1NYXRoLnJvdW5kKHRoaXMueCksdGhpcy55PU1hdGgucm91bmQodGhpcy55KSx0aGlzLno9TWF0aC5yb3VuZCh0aGlzLnopLHRoaXN9cm91bmRUb1plcm8oKXtyZXR1cm4gdGhpcy54PXRoaXMueDwwP01hdGguY2VpbCh0aGlzLngpOk1hdGguZmxvb3IodGhpcy54KSx0aGlzLnk9dGhpcy55PDA/TWF0aC5jZWlsKHRoaXMueSk6TWF0aC5mbG9vcih0aGlzLnkpLHRoaXMuej10aGlzLno8MD9NYXRoLmNlaWwodGhpcy56KTpNYXRoLmZsb29yKHRoaXMueiksdGhpc31uZWdhdGUoKXtyZXR1cm4gdGhpcy54PS10aGlzLngsdGhpcy55PS10aGlzLnksdGhpcy56PS10aGlzLnosdGhpc31kb3QodCl7cmV0dXJuIHRoaXMueCp0LngrdGhpcy55KnQueSt0aGlzLnoqdC56fWxlbmd0aFNxKCl7cmV0dXJuIHRoaXMueCp0aGlzLngrdGhpcy55KnRoaXMueSt0aGlzLnoqdGhpcy56fWxlbmd0aCgpe3JldHVybiBNYXRoLnNxcnQodGhpcy54KnRoaXMueCt0aGlzLnkqdGhpcy55K3RoaXMueip0aGlzLnopfW1hbmhhdHRhbkxlbmd0aCgpe3JldHVybiBNYXRoLmFicyh0aGlzLngpK01hdGguYWJzKHRoaXMueSkrTWF0aC5hYnModGhpcy56KX1ub3JtYWxpemUoKXtyZXR1cm4gdGhpcy5kaXZpZGVTY2FsYXIodGhpcy5sZW5ndGgoKXx8MSl9c2V0TGVuZ3RoKHQpe3JldHVybiB0aGlzLm5vcm1hbGl6ZSgpLm11bHRpcGx5U2NhbGFyKHQpfWxlcnAodCxlKXtyZXR1cm4gdGhpcy54Kz0odC54LXRoaXMueCkqZSx0aGlzLnkrPSh0LnktdGhpcy55KSplLHRoaXMueis9KHQuei10aGlzLnopKmUsdGhpc31sZXJwVmVjdG9ycyh0LGUscyl7cmV0dXJuIHRoaXMueD10LngrKGUueC10LngpKnMsdGhpcy55PXQueSsoZS55LXQueSkqcyx0aGlzLno9dC56KyhlLnotdC56KSpzLHRoaXN9Y3Jvc3ModCxlKXtyZXR1cm4gdm9pZCAwIT09ZT8oY29uc29sZS53YXJuKCJUSFJFRS5WZWN0b3IzOiAuY3Jvc3MoKSBub3cgb25seSBhY2NlcHRzIG9uZSBhcmd1bWVudC4gVXNlIC5jcm9zc1ZlY3RvcnMoIGEsIGIgKSBpbnN0ZWFkLiIpLHRoaXMuY3Jvc3NWZWN0b3JzKHQsZSkpOnRoaXMuY3Jvc3NWZWN0b3JzKHRoaXMsdCl9Y3Jvc3NWZWN0b3JzKHQsZSl7Y29uc3Qgcz10LngsaT10Lnkscj10Lnosbj1lLngsbz1lLnksYT1lLno7cmV0dXJuIHRoaXMueD1pKmEtcipvLHRoaXMueT1yKm4tcyphLHRoaXMuej1zKm8taSpuLHRoaXN9cHJvamVjdE9uVmVjdG9yKHQpe2NvbnN0IGU9dC5sZW5ndGhTcSgpO2lmKDA9PT1lKXJldHVybiB0aGlzLnNldCgwLDAsMCk7Y29uc3Qgcz10LmRvdCh0aGlzKS9lO3JldHVybiB0aGlzLmNvcHkodCkubXVsdGlwbHlTY2FsYXIocyl9cHJvamVjdE9uUGxhbmUodCl7cmV0dXJuIGsuY29weSh0aGlzKS5wcm9qZWN0T25WZWN0b3IodCksdGhpcy5zdWIoayl9cmVmbGVjdCh0KXtyZXR1cm4gdGhpcy5zdWIoay5jb3B5KHQpLm11bHRpcGx5U2NhbGFyKDIqdGhpcy5kb3QodCkpKX1hbmdsZVRvKHQpe2NvbnN0IGU9TWF0aC5zcXJ0KHRoaXMubGVuZ3RoU3EoKSp0Lmxlbmd0aFNxKCkpO2lmKDA9PT1lKXJldHVybiBNYXRoLlBJLzI7Y29uc3Qgcz10aGlzLmRvdCh0KS9lO3JldHVybiBNYXRoLmFjb3MobyhzLC0xLDEpKX1kaXN0YW5jZVRvKHQpe3JldHVybiBNYXRoLnNxcnQodGhpcy5kaXN0YW5jZVRvU3F1YXJlZCh0KSl9ZGlzdGFuY2VUb1NxdWFyZWQodCl7Y29uc3QgZT10aGlzLngtdC54LHM9dGhpcy55LXQueSxpPXRoaXMuei10Lno7cmV0dXJuIGUqZStzKnMraSppfW1hbmhhdHRhbkRpc3RhbmNlVG8odCl7cmV0dXJuIE1hdGguYWJzKHRoaXMueC10LngpK01hdGguYWJzKHRoaXMueS10LnkpK01hdGguYWJzKHRoaXMuei10LnopfXNldEZyb21TcGhlcmljYWwodCl7cmV0dXJuIHRoaXMuc2V0RnJvbVNwaGVyaWNhbENvb3Jkcyh0LnJhZGl1cyx0LnBoaSx0LnRoZXRhKX1zZXRGcm9tU3BoZXJpY2FsQ29vcmRzKHQsZSxzKXtjb25zdCBpPU1hdGguc2luKGUpKnQ7cmV0dXJuIHRoaXMueD1pKk1hdGguc2luKHMpLHRoaXMueT1NYXRoLmNvcyhlKSp0LHRoaXMuej1pKk1hdGguY29zKHMpLHRoaXN9c2V0RnJvbUN5bGluZHJpY2FsKHQpe3JldHVybiB0aGlzLnNldEZyb21DeWxpbmRyaWNhbENvb3Jkcyh0LnJhZGl1cyx0LnRoZXRhLHQueSl9c2V0RnJvbUN5bGluZHJpY2FsQ29vcmRzKHQsZSxzKXtyZXR1cm4gdGhpcy54PXQqTWF0aC5zaW4oZSksdGhpcy55PXMsdGhpcy56PXQqTWF0aC5jb3MoZSksdGhpc31zZXRGcm9tTWF0cml4UG9zaXRpb24odCl7Y29uc3QgZT10LmVsZW1lbnRzO3JldHVybiB0aGlzLng9ZVsxMl0sdGhpcy55PWVbMTNdLHRoaXMuej1lWzE0XSx0aGlzfXNldEZyb21NYXRyaXhTY2FsZSh0KXtjb25zdCBlPXRoaXMuc2V0RnJvbU1hdHJpeENvbHVtbih0LDApLmxlbmd0aCgpLHM9dGhpcy5zZXRGcm9tTWF0cml4Q29sdW1uKHQsMSkubGVuZ3RoKCksaT10aGlzLnNldEZyb21NYXRyaXhDb2x1bW4odCwyKS5sZW5ndGgoKTtyZXR1cm4gdGhpcy54PWUsdGhpcy55PXMsdGhpcy56PWksdGhpc31zZXRGcm9tTWF0cml4Q29sdW1uKHQsZSl7cmV0dXJuIHRoaXMuZnJvbUFycmF5KHQuZWxlbWVudHMsNCplKX1zZXRGcm9tTWF0cml4M0NvbHVtbih0LGUpe3JldHVybiB0aGlzLmZyb21BcnJheSh0LmVsZW1lbnRzLDMqZSl9c2V0RnJvbUV1bGVyKHQpe3JldHVybiB0aGlzLng9dC5feCx0aGlzLnk9dC5feSx0aGlzLno9dC5feix0aGlzfWVxdWFscyh0KXtyZXR1cm4gdC54PT09dGhpcy54JiZ0Lnk9PT10aGlzLnkmJnQuej09PXRoaXMuen1mcm9tQXJyYXkodCl7bGV0IGU9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOjA7cmV0dXJuIHRoaXMueD10W2VdLHRoaXMueT10W2UrMV0sdGhpcy56PXRbZSsyXSx0aGlzfXRvQXJyYXkoKXtsZXQgdD1hcmd1bWVudHMubGVuZ3RoPjAmJnZvaWQgMCE9PWFyZ3VtZW50c1swXT9hcmd1bWVudHNbMF06W10sZT1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06MDtyZXR1cm4gdFtlXT10aGlzLngsdFtlKzFdPXRoaXMueSx0W2UrMl09dGhpcy56LHR9ZnJvbUJ1ZmZlckF0dHJpYnV0ZSh0LGUscyl7cmV0dXJuIHZvaWQgMCE9PXMmJmNvbnNvbGUud2FybigiVEhSRUUuVmVjdG9yMzogb2Zmc2V0IGhhcyBiZWVuIHJlbW92ZWQgZnJvbSAuZnJvbUJ1ZmZlckF0dHJpYnV0ZSgpLiIpLHRoaXMueD10LmdldFgoZSksdGhpcy55PXQuZ2V0WShlKSx0aGlzLno9dC5nZXRaKGUpLHRoaXN9cmFuZG9tKCl7cmV0dXJuIHRoaXMueD1NYXRoLnJhbmRvbSgpLHRoaXMueT1NYXRoLnJhbmRvbSgpLHRoaXMuej1NYXRoLnJhbmRvbSgpLHRoaXN9cmFuZG9tRGlyZWN0aW9uKCl7Y29uc3QgdD0yKihNYXRoLnJhbmRvbSgpLS41KSxlPU1hdGgucmFuZG9tKCkqTWF0aC5QSSoyLHM9TWF0aC5zcXJ0KDEtdCoqMik7cmV0dXJuIHRoaXMueD1zKk1hdGguY29zKGUpLHRoaXMueT1zKk1hdGguc2luKGUpLHRoaXMuej10LHRoaXN9KltTeW1ib2wuaXRlcmF0b3JdKCl7eWllbGQgdGhpcy54LHlpZWxkIHRoaXMueSx5aWVsZCB0aGlzLnp9fWNvbnN0IGs9bmV3IEUsUD1uZXcgVDtjbGFzcyBDe2NvbnN0cnVjdG9yKCl7bGV0IHQ9YXJndW1lbnRzLmxlbmd0aD4wJiZ2b2lkIDAhPT1hcmd1bWVudHNbMF0/YXJndW1lbnRzWzBdOm5ldyBFKDEvMCwxLzAsMS8wKSxlPWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTpuZXcgRSgtMS8wLC0xLzAsLTEvMCk7dGhpcy5pc0JveDM9ITAsdGhpcy5taW49dCx0aGlzLm1heD1lfXNldCh0LGUpe3JldHVybiB0aGlzLm1pbi5jb3B5KHQpLHRoaXMubWF4LmNvcHkoZSksdGhpc31zZXRGcm9tQXJyYXkodCl7bGV0IGU9MS8wLHM9MS8wLGk9MS8wLHI9LTEvMCxuPS0xLzAsbz0tMS8wO2ZvcihsZXQgYT0wLGg9dC5sZW5ndGg7YTxoO2ErPTMpe2NvbnN0IGg9dFthXSxsPXRbYSsxXSxjPXRbYSsyXTtoPGUmJihlPWgpLGw8cyYmKHM9bCksYzxpJiYoaT1jKSxoPnImJihyPWgpLGw+biYmKG49bCksYz5vJiYobz1jKX1yZXR1cm4gdGhpcy5taW4uc2V0KGUscyxpKSx0aGlzLm1heC5zZXQocixuLG8pLHRoaXN9c2V0RnJvbUJ1ZmZlckF0dHJpYnV0ZSh0KXtsZXQgZT0xLzAscz0xLzAsaT0xLzAscj0tMS8wLG49LTEvMCxvPS0xLzA7Zm9yKGxldCBhPTAsaD10LmNvdW50O2E8aDthKyspe2NvbnN0IGg9dC5nZXRYKGEpLGw9dC5nZXRZKGEpLGM9dC5nZXRaKGEpO2g8ZSYmKGU9aCksbDxzJiYocz1sKSxjPGkmJihpPWMpLGg+ciYmKHI9aCksbD5uJiYobj1sKSxjPm8mJihvPWMpfXJldHVybiB0aGlzLm1pbi5zZXQoZSxzLGkpLHRoaXMubWF4LnNldChyLG4sbyksdGhpc31zZXRGcm9tUG9pbnRzKHQpe3RoaXMubWFrZUVtcHR5KCk7Zm9yKGxldCBlPTAscz10Lmxlbmd0aDtlPHM7ZSsrKXRoaXMuZXhwYW5kQnlQb2ludCh0W2VdKTtyZXR1cm4gdGhpc31zZXRGcm9tQ2VudGVyQW5kU2l6ZSh0LGUpe2NvbnN0IHM9Vi5jb3B5KGUpLm11bHRpcGx5U2NhbGFyKC41KTtyZXR1cm4gdGhpcy5taW4uY29weSh0KS5zdWIocyksdGhpcy5tYXguY29weSh0KS5hZGQocyksdGhpc31zZXRGcm9tT2JqZWN0KHQpe2xldCBlPWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdJiZhcmd1bWVudHNbMV07cmV0dXJuIHRoaXMubWFrZUVtcHR5KCksdGhpcy5leHBhbmRCeU9iamVjdCh0LGUpfWNsb25lKCl7cmV0dXJuKG5ldyB0aGlzLmNvbnN0cnVjdG9yKS5jb3B5KHRoaXMpfWNvcHkodCl7cmV0dXJuIHRoaXMubWluLmNvcHkodC5taW4pLHRoaXMubWF4LmNvcHkodC5tYXgpLHRoaXN9bWFrZUVtcHR5KCl7cmV0dXJuIHRoaXMubWluLng9dGhpcy5taW4ueT10aGlzLm1pbi56PTEvMCx0aGlzLm1heC54PXRoaXMubWF4Lnk9dGhpcy5tYXguej0tMS8wLHRoaXN9aXNFbXB0eSgpe3JldHVybiB0aGlzLm1heC54PHRoaXMubWluLnh8fHRoaXMubWF4Lnk8dGhpcy5taW4ueXx8dGhpcy5tYXguejx0aGlzLm1pbi56fWdldENlbnRlcih0KXtyZXR1cm4gdGhpcy5pc0VtcHR5KCk/dC5zZXQoMCwwLDApOnQuYWRkVmVjdG9ycyh0aGlzLm1pbix0aGlzLm1heCkubXVsdGlwbHlTY2FsYXIoLjUpfWdldFNpemUodCl7cmV0dXJuIHRoaXMuaXNFbXB0eSgpP3Quc2V0KDAsMCwwKTp0LnN1YlZlY3RvcnModGhpcy5tYXgsdGhpcy5taW4pfWV4cGFuZEJ5UG9pbnQodCl7cmV0dXJuIHRoaXMubWluLm1pbih0KSx0aGlzLm1heC5tYXgodCksdGhpc31leHBhbmRCeVZlY3Rvcih0KXtyZXR1cm4gdGhpcy5taW4uc3ViKHQpLHRoaXMubWF4LmFkZCh0KSx0aGlzfWV4cGFuZEJ5U2NhbGFyKHQpe3JldHVybiB0aGlzLm1pbi5hZGRTY2FsYXIoLXQpLHRoaXMubWF4LmFkZFNjYWxhcih0KSx0aGlzfWV4cGFuZEJ5T2JqZWN0KHQpe2xldCBlPWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdJiZhcmd1bWVudHNbMV07dC51cGRhdGVXb3JsZE1hdHJpeCghMSwhMSk7Y29uc3Qgcz10Lmdlb21ldHJ5O2lmKHZvaWQgMCE9PXMpaWYoZSYmbnVsbCE9cy5hdHRyaWJ1dGVzJiZ2b2lkIDAhPT1zLmF0dHJpYnV0ZXMucG9zaXRpb24pe2NvbnN0IGU9cy5hdHRyaWJ1dGVzLnBvc2l0aW9uO2ZvcihsZXQgcz0wLGk9ZS5jb3VudDtzPGk7cysrKVYuZnJvbUJ1ZmZlckF0dHJpYnV0ZShlLHMpLmFwcGx5TWF0cml4NCh0Lm1hdHJpeFdvcmxkKSx0aGlzLmV4cGFuZEJ5UG9pbnQoVil9ZWxzZSBudWxsPT09cy5ib3VuZGluZ0JveCYmcy5jb21wdXRlQm91bmRpbmdCb3goKSxSLmNvcHkocy5ib3VuZGluZ0JveCksUi5hcHBseU1hdHJpeDQodC5tYXRyaXhXb3JsZCksdGhpcy51bmlvbihSKTtjb25zdCBpPXQuY2hpbGRyZW47Zm9yKGxldCB0PTAscz1pLmxlbmd0aDt0PHM7dCsrKXRoaXMuZXhwYW5kQnlPYmplY3QoaVt0XSxlKTtyZXR1cm4gdGhpc31jb250YWluc1BvaW50KHQpe3JldHVybiEodC54PHRoaXMubWluLnh8fHQueD50aGlzLm1heC54fHx0Lnk8dGhpcy5taW4ueXx8dC55PnRoaXMubWF4Lnl8fHQuejx0aGlzLm1pbi56fHx0Lno+dGhpcy5tYXgueil9Y29udGFpbnNCb3godCl7cmV0dXJuIHRoaXMubWluLng8PXQubWluLngmJnQubWF4Lng8PXRoaXMubWF4LngmJnRoaXMubWluLnk8PXQubWluLnkmJnQubWF4Lnk8PXRoaXMubWF4LnkmJnRoaXMubWluLno8PXQubWluLnomJnQubWF4Lno8PXRoaXMubWF4Lnp9Z2V0UGFyYW1ldGVyKHQsZSl7cmV0dXJuIGUuc2V0KCh0LngtdGhpcy5taW4ueCkvKHRoaXMubWF4LngtdGhpcy5taW4ueCksKHQueS10aGlzLm1pbi55KS8odGhpcy5tYXgueS10aGlzLm1pbi55KSwodC56LXRoaXMubWluLnopLyh0aGlzLm1heC56LXRoaXMubWluLnopKX1pbnRlcnNlY3RzQm94KHQpe3JldHVybiEodC5tYXgueDx0aGlzLm1pbi54fHx0Lm1pbi54PnRoaXMubWF4Lnh8fHQubWF4Lnk8dGhpcy5taW4ueXx8dC5taW4ueT50aGlzLm1heC55fHx0Lm1heC56PHRoaXMubWluLnp8fHQubWluLno+dGhpcy5tYXgueil9aW50ZXJzZWN0c1NwaGVyZSh0KXtyZXR1cm4gdGhpcy5jbGFtcFBvaW50KHQuY2VudGVyLFYpLFYuZGlzdGFuY2VUb1NxdWFyZWQodC5jZW50ZXIpPD10LnJhZGl1cyp0LnJhZGl1c31pbnRlcnNlY3RzUGxhbmUodCl7bGV0IGUscztyZXR1cm4gdC5ub3JtYWwueD4wPyhlPXQubm9ybWFsLngqdGhpcy5taW4ueCxzPXQubm9ybWFsLngqdGhpcy5tYXgueCk6KGU9dC5ub3JtYWwueCp0aGlzLm1heC54LHM9dC5ub3JtYWwueCp0aGlzLm1pbi54KSx0Lm5vcm1hbC55PjA/KGUrPXQubm9ybWFsLnkqdGhpcy5taW4ueSxzKz10Lm5vcm1hbC55KnRoaXMubWF4LnkpOihlKz10Lm5vcm1hbC55KnRoaXMubWF4Lnkscys9dC5ub3JtYWwueSp0aGlzLm1pbi55KSx0Lm5vcm1hbC56PjA/KGUrPXQubm9ybWFsLnoqdGhpcy5taW4ueixzKz10Lm5vcm1hbC56KnRoaXMubWF4LnopOihlKz10Lm5vcm1hbC56KnRoaXMubWF4Lnoscys9dC5ub3JtYWwueip0aGlzLm1pbi56KSxlPD0tdC5jb25zdGFudCYmcz49LXQuY29uc3RhbnR9aW50ZXJzZWN0c1RyaWFuZ2xlKHQpe2lmKHRoaXMuaXNFbXB0eSgpKXJldHVybiExO3RoaXMuZ2V0Q2VudGVyKEwpLFcuc3ViVmVjdG9ycyh0aGlzLm1heCxMKSxxLnN1YlZlY3RvcnModC5hLEwpLFUuc3ViVmVjdG9ycyh0LmIsTCksTy5zdWJWZWN0b3JzKHQuYyxMKSxILnN1YlZlY3RvcnMoVSxxKSxJLnN1YlZlY3RvcnMoTyxVKSxOLnN1YlZlY3RvcnMocSxPKTtsZXQgZT1bMCwtSC56LEgueSwwLC1JLnosSS55LDAsLU4ueixOLnksSC56LDAsLUgueCxJLnosMCwtSS54LE4ueiwwLC1OLngsLUgueSxILngsMCwtSS55LEkueCwwLC1OLnksTi54LDBdO3JldHVybiEhWShlLHEsVSxPLFcpJiYoZT1bMSwwLDAsMCwxLDAsMCwwLDFdLCEhWShlLHEsVSxPLFcpJiYoWC5jcm9zc1ZlY3RvcnMoSCxJKSxlPVtYLngsWC55LFguel0sWShlLHEsVSxPLFcpKSl9Y2xhbXBQb2ludCh0LGUpe3JldHVybiBlLmNvcHkodCkuY2xhbXAodGhpcy5taW4sdGhpcy5tYXgpfWRpc3RhbmNlVG9Qb2ludCh0KXtyZXR1cm4gVi5jb3B5KHQpLmNsYW1wKHRoaXMubWluLHRoaXMubWF4KS5zdWIodCkubGVuZ3RoKCl9Z2V0Qm91bmRpbmdTcGhlcmUodCl7cmV0dXJuIHRoaXMuZ2V0Q2VudGVyKHQuY2VudGVyKSx0LnJhZGl1cz0uNSp0aGlzLmdldFNpemUoVikubGVuZ3RoKCksdH1pbnRlcnNlY3QodCl7cmV0dXJuIHRoaXMubWluLm1heCh0Lm1pbiksdGhpcy5tYXgubWluKHQubWF4KSx0aGlzLmlzRW1wdHkoKSYmdGhpcy5tYWtlRW1wdHkoKSx0aGlzfXVuaW9uKHQpe3JldHVybiB0aGlzLm1pbi5taW4odC5taW4pLHRoaXMubWF4Lm1heCh0Lm1heCksdGhpc31hcHBseU1hdHJpeDQodCl7cmV0dXJuIHRoaXMuaXNFbXB0eSgpfHwoRlswXS5zZXQodGhpcy5taW4ueCx0aGlzLm1pbi55LHRoaXMubWluLnopLmFwcGx5TWF0cml4NCh0KSxGWzFdLnNldCh0aGlzLm1pbi54LHRoaXMubWluLnksdGhpcy5tYXgueikuYXBwbHlNYXRyaXg0KHQpLEZbMl0uc2V0KHRoaXMubWluLngsdGhpcy5tYXgueSx0aGlzLm1pbi56KS5hcHBseU1hdHJpeDQodCksRlszXS5zZXQodGhpcy5taW4ueCx0aGlzLm1heC55LHRoaXMubWF4LnopLmFwcGx5TWF0cml4NCh0KSxGWzRdLnNldCh0aGlzLm1heC54LHRoaXMubWluLnksdGhpcy5taW4ueikuYXBwbHlNYXRyaXg0KHQpLEZbNV0uc2V0KHRoaXMubWF4LngsdGhpcy5taW4ueSx0aGlzLm1heC56KS5hcHBseU1hdHJpeDQodCksRls2XS5zZXQodGhpcy5tYXgueCx0aGlzLm1heC55LHRoaXMubWluLnopLmFwcGx5TWF0cml4NCh0KSxGWzddLnNldCh0aGlzLm1heC54LHRoaXMubWF4LnksdGhpcy5tYXgueikuYXBwbHlNYXRyaXg0KHQpLHRoaXMuc2V0RnJvbVBvaW50cyhGKSksdGhpc310cmFuc2xhdGUodCl7cmV0dXJuIHRoaXMubWluLmFkZCh0KSx0aGlzLm1heC5hZGQodCksdGhpc31lcXVhbHModCl7cmV0dXJuIHQubWluLmVxdWFscyh0aGlzLm1pbikmJnQubWF4LmVxdWFscyh0aGlzLm1heCl9fWNvbnN0IEY9W25ldyBFLG5ldyBFLG5ldyBFLG5ldyBFLG5ldyBFLG5ldyBFLG5ldyBFLG5ldyBFXSxWPW5ldyBFLFI9bmV3IEMscT1uZXcgRSxVPW5ldyBFLE89bmV3IEUsSD1uZXcgRSxJPW5ldyBFLE49bmV3IEUsTD1uZXcgRSxXPW5ldyBFLFg9bmV3IEUsRD1uZXcgRTtmdW5jdGlvbiBZKHQsZSxzLGkscil7Zm9yKGxldCBuPTAsbz10Lmxlbmd0aC0zO248PW87bis9Myl7RC5mcm9tQXJyYXkodCxuKTtjb25zdCBvPXIueCpNYXRoLmFicyhELngpK3IueSpNYXRoLmFicyhELnkpK3IueipNYXRoLmFicyhELnopLGE9ZS5kb3QoRCksaD1zLmRvdChEKSxsPWkuZG90KEQpO2lmKE1hdGgubWF4KC1NYXRoLm1heChhLGgsbCksTWF0aC5taW4oYSxoLGwpKT5vKXJldHVybiExfXJldHVybiEwfWNvbnN0IFo9bmV3IEMsRz1uZXcgRSxqPW5ldyBFLFE9bmV3IEU7Y2xhc3MgSntjb25zdHJ1Y3Rvcigpe2xldCB0PWFyZ3VtZW50cy5sZW5ndGg+MCYmdm9pZCAwIT09YXJndW1lbnRzWzBdP2FyZ3VtZW50c1swXTpuZXcgRSxlPWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTotMTt0aGlzLmNlbnRlcj10LHRoaXMucmFkaXVzPWV9c2V0KHQsZSl7cmV0dXJuIHRoaXMuY2VudGVyLmNvcHkodCksdGhpcy5yYWRpdXM9ZSx0aGlzfXNldEZyb21Qb2ludHModCxlKXtjb25zdCBzPXRoaXMuY2VudGVyO3ZvaWQgMCE9PWU/cy5jb3B5KGUpOlouc2V0RnJvbVBvaW50cyh0KS5nZXRDZW50ZXIocyk7bGV0IGk9MDtmb3IobGV0IGU9MCxyPXQubGVuZ3RoO2U8cjtlKyspaT1NYXRoLm1heChpLHMuZGlzdGFuY2VUb1NxdWFyZWQodFtlXSkpO3JldHVybiB0aGlzLnJhZGl1cz1NYXRoLnNxcnQoaSksdGhpc31jb3B5KHQpe3JldHVybiB0aGlzLmNlbnRlci5jb3B5KHQuY2VudGVyKSx0aGlzLnJhZGl1cz10LnJhZGl1cyx0aGlzfWlzRW1wdHkoKXtyZXR1cm4gdGhpcy5yYWRpdXM8MH1tYWtlRW1wdHkoKXtyZXR1cm4gdGhpcy5jZW50ZXIuc2V0KDAsMCwwKSx0aGlzLnJhZGl1cz0tMSx0aGlzfWNvbnRhaW5zUG9pbnQodCl7cmV0dXJuIHQuZGlzdGFuY2VUb1NxdWFyZWQodGhpcy5jZW50ZXIpPD10aGlzLnJhZGl1cyp0aGlzLnJhZGl1c31kaXN0YW5jZVRvUG9pbnQodCl7cmV0dXJuIHQuZGlzdGFuY2VUbyh0aGlzLmNlbnRlciktdGhpcy5yYWRpdXN9aW50ZXJzZWN0c1NwaGVyZSh0KXtjb25zdCBlPXRoaXMucmFkaXVzK3QucmFkaXVzO3JldHVybiB0LmNlbnRlci5kaXN0YW5jZVRvU3F1YXJlZCh0aGlzLmNlbnRlcik8PWUqZX1pbnRlcnNlY3RzQm94KHQpe3JldHVybiB0LmludGVyc2VjdHNTcGhlcmUodGhpcyl9aW50ZXJzZWN0c1BsYW5lKHQpe3JldHVybiBNYXRoLmFicyh0LmRpc3RhbmNlVG9Qb2ludCh0aGlzLmNlbnRlcikpPD10aGlzLnJhZGl1c31jbGFtcFBvaW50KHQsZSl7Y29uc3Qgcz10aGlzLmNlbnRlci5kaXN0YW5jZVRvU3F1YXJlZCh0KTtyZXR1cm4gZS5jb3B5KHQpLHM+dGhpcy5yYWRpdXMqdGhpcy5yYWRpdXMmJihlLnN1Yih0aGlzLmNlbnRlcikubm9ybWFsaXplKCksZS5tdWx0aXBseVNjYWxhcih0aGlzLnJhZGl1cykuYWRkKHRoaXMuY2VudGVyKSksZX1nZXRCb3VuZGluZ0JveCh0KXtyZXR1cm4gdGhpcy5pc0VtcHR5KCk/KHQubWFrZUVtcHR5KCksdCk6KHQuc2V0KHRoaXMuY2VudGVyLHRoaXMuY2VudGVyKSx0LmV4cGFuZEJ5U2NhbGFyKHRoaXMucmFkaXVzKSx0KX1hcHBseU1hdHJpeDQodCl7cmV0dXJuIHRoaXMuY2VudGVyLmFwcGx5TWF0cml4NCh0KSx0aGlzLnJhZGl1cz10aGlzLnJhZGl1cyp0LmdldE1heFNjYWxlT25BeGlzKCksdGhpc310cmFuc2xhdGUodCl7cmV0dXJuIHRoaXMuY2VudGVyLmFkZCh0KSx0aGlzfWV4cGFuZEJ5UG9pbnQodCl7US5zdWJWZWN0b3JzKHQsdGhpcy5jZW50ZXIpO2NvbnN0IGU9US5sZW5ndGhTcSgpO2lmKGU+dGhpcy5yYWRpdXMqdGhpcy5yYWRpdXMpe2NvbnN0IHQ9TWF0aC5zcXJ0KGUpLHM9LjUqKHQtdGhpcy5yYWRpdXMpO3RoaXMuY2VudGVyLmFkZChRLm11bHRpcGx5U2NhbGFyKHMvdCkpLHRoaXMucmFkaXVzKz1zfXJldHVybiB0aGlzfXVuaW9uKHQpe3JldHVybiEwPT09dGhpcy5jZW50ZXIuZXF1YWxzKHQuY2VudGVyKT9qLnNldCgwLDAsMSkubXVsdGlwbHlTY2FsYXIodC5yYWRpdXMpOmouc3ViVmVjdG9ycyh0LmNlbnRlcix0aGlzLmNlbnRlcikubm9ybWFsaXplKCkubXVsdGlwbHlTY2FsYXIodC5yYWRpdXMpLHRoaXMuZXhwYW5kQnlQb2ludChHLmNvcHkodC5jZW50ZXIpLmFkZChqKSksdGhpcy5leHBhbmRCeVBvaW50KEcuY29weSh0LmNlbnRlcikuc3ViKGopKSx0aGlzfWVxdWFscyh0KXtyZXR1cm4gdC5jZW50ZXIuZXF1YWxzKHRoaXMuY2VudGVyKSYmdC5yYWRpdXM9PT10aGlzLnJhZGl1c31jbG9uZSgpe3JldHVybihuZXcgdGhpcy5jb25zdHJ1Y3RvcikuY29weSh0aGlzKX19Y2xhc3MgJHtjb25zdHJ1Y3RvcigpeyQucHJvdG90eXBlLmlzTWF0cml4ND0hMCx0aGlzLmVsZW1lbnRzPVsxLDAsMCwwLDAsMSwwLDAsMCwwLDEsMCwwLDAsMCwxXSxhcmd1bWVudHMubGVuZ3RoPjAmJmNvbnNvbGUuZXJyb3IoIlRIUkVFLk1hdHJpeDQ6IHRoZSBjb25zdHJ1Y3RvciBubyBsb25nZXIgcmVhZHMgYXJndW1lbnRzLiB1c2UgLnNldCgpIGluc3RlYWQuIil9c2V0KHQsZSxzLGkscixuLG8sYSxoLGwsYyx1LGQsbSx5LHApe2NvbnN0IHg9dGhpcy5lbGVtZW50cztyZXR1cm4geFswXT10LHhbNF09ZSx4WzhdPXMseFsxMl09aSx4WzFdPXIseFs1XT1uLHhbOV09byx4WzEzXT1hLHhbMl09aCx4WzZdPWwseFsxMF09Yyx4WzE0XT11LHhbM109ZCx4WzddPW0seFsxMV09eSx4WzE1XT1wLHRoaXN9aWRlbnRpdHkoKXtyZXR1cm4gdGhpcy5zZXQoMSwwLDAsMCwwLDEsMCwwLDAsMCwxLDAsMCwwLDAsMSksdGhpc31jbG9uZSgpe3JldHVybihuZXcgJCkuZnJvbUFycmF5KHRoaXMuZWxlbWVudHMpfWNvcHkodCl7Y29uc3QgZT10aGlzLmVsZW1lbnRzLHM9dC5lbGVtZW50cztyZXR1cm4gZVswXT1zWzBdLGVbMV09c1sxXSxlWzJdPXNbMl0sZVszXT1zWzNdLGVbNF09c1s0XSxlWzVdPXNbNV0sZVs2XT1zWzZdLGVbN109c1s3XSxlWzhdPXNbOF0sZVs5XT1zWzldLGVbMTBdPXNbMTBdLGVbMTFdPXNbMTFdLGVbMTJdPXNbMTJdLGVbMTNdPXNbMTNdLGVbMTRdPXNbMTRdLGVbMTVdPXNbMTVdLHRoaXN9Y29weVBvc2l0aW9uKHQpe2NvbnN0IGU9dGhpcy5lbGVtZW50cyxzPXQuZWxlbWVudHM7cmV0dXJuIGVbMTJdPXNbMTJdLGVbMTNdPXNbMTNdLGVbMTRdPXNbMTRdLHRoaXN9c2V0RnJvbU1hdHJpeDModCl7Y29uc3QgZT10LmVsZW1lbnRzO3JldHVybiB0aGlzLnNldChlWzBdLGVbM10sZVs2XSwwLGVbMV0sZVs0XSxlWzddLDAsZVsyXSxlWzVdLGVbOF0sMCwwLDAsMCwxKSx0aGlzfWV4dHJhY3RCYXNpcyh0LGUscyl7cmV0dXJuIHQuc2V0RnJvbU1hdHJpeENvbHVtbih0aGlzLDApLGUuc2V0RnJvbU1hdHJpeENvbHVtbih0aGlzLDEpLHMuc2V0RnJvbU1hdHJpeENvbHVtbih0aGlzLDIpLHRoaXN9bWFrZUJhc2lzKHQsZSxzKXtyZXR1cm4gdGhpcy5zZXQodC54LGUueCxzLngsMCx0LnksZS55LHMueSwwLHQueixlLnoscy56LDAsMCwwLDAsMSksdGhpc31leHRyYWN0Um90YXRpb24odCl7Y29uc3QgZT10aGlzLmVsZW1lbnRzLHM9dC5lbGVtZW50cyxpPTEvSy5zZXRGcm9tTWF0cml4Q29sdW1uKHQsMCkubGVuZ3RoKCkscj0xL0suc2V0RnJvbU1hdHJpeENvbHVtbih0LDEpLmxlbmd0aCgpLG49MS9LLnNldEZyb21NYXRyaXhDb2x1bW4odCwyKS5sZW5ndGgoKTtyZXR1cm4gZVswXT1zWzBdKmksZVsxXT1zWzFdKmksZVsyXT1zWzJdKmksZVszXT0wLGVbNF09c1s0XSpyLGVbNV09c1s1XSpyLGVbNl09c1s2XSpyLGVbN109MCxlWzhdPXNbOF0qbixlWzldPXNbOV0qbixlWzEwXT1zWzEwXSpuLGVbMTFdPTAsZVsxMl09MCxlWzEzXT0wLGVbMTRdPTAsZVsxNV09MSx0aGlzfW1ha2VSb3RhdGlvbkZyb21FdWxlcih0KXt0JiZ0LmlzRXVsZXJ8fGNvbnNvbGUuZXJyb3IoIlRIUkVFLk1hdHJpeDQ6IC5tYWtlUm90YXRpb25Gcm9tRXVsZXIoKSBub3cgZXhwZWN0cyBhIEV1bGVyIHJvdGF0aW9uIHJhdGhlciB0aGFuIGEgVmVjdG9yMyBhbmQgb3JkZXIuIik7Y29uc3QgZT10aGlzLmVsZW1lbnRzLHM9dC54LGk9dC55LHI9dC56LG49TWF0aC5jb3Mocyksbz1NYXRoLnNpbihzKSxhPU1hdGguY29zKGkpLGg9TWF0aC5zaW4oaSksbD1NYXRoLmNvcyhyKSxjPU1hdGguc2luKHIpO2lmKCJYWVoiPT09dC5vcmRlcil7Y29uc3QgdD1uKmwscz1uKmMsaT1vKmwscj1vKmM7ZVswXT1hKmwsZVs0XT0tYSpjLGVbOF09aCxlWzFdPXMraSpoLGVbNV09dC1yKmgsZVs5XT0tbyphLGVbMl09ci10KmgsZVs2XT1pK3MqaCxlWzEwXT1uKmF9ZWxzZSBpZigiWVhaIj09PXQub3JkZXIpe2NvbnN0IHQ9YSpsLHM9YSpjLGk9aCpsLHI9aCpjO2VbMF09dCtyKm8sZVs0XT1pKm8tcyxlWzhdPW4qaCxlWzFdPW4qYyxlWzVdPW4qbCxlWzldPS1vLGVbMl09cypvLWksZVs2XT1yK3QqbyxlWzEwXT1uKmF9ZWxzZSBpZigiWlhZIj09PXQub3JkZXIpe2NvbnN0IHQ9YSpsLHM9YSpjLGk9aCpsLHI9aCpjO2VbMF09dC1yKm8sZVs0XT0tbipjLGVbOF09aStzKm8sZVsxXT1zK2kqbyxlWzVdPW4qbCxlWzldPXItdCpvLGVbMl09LW4qaCxlWzZdPW8sZVsxMF09biphfWVsc2UgaWYoIlpZWCI9PT10Lm9yZGVyKXtjb25zdCB0PW4qbCxzPW4qYyxpPW8qbCxyPW8qYztlWzBdPWEqbCxlWzRdPWkqaC1zLGVbOF09dCpoK3IsZVsxXT1hKmMsZVs1XT1yKmgrdCxlWzldPXMqaC1pLGVbMl09LWgsZVs2XT1vKmEsZVsxMF09biphfWVsc2UgaWYoIllaWCI9PT10Lm9yZGVyKXtjb25zdCB0PW4qYSxzPW4qaCxpPW8qYSxyPW8qaDtlWzBdPWEqbCxlWzRdPXItdCpjLGVbOF09aSpjK3MsZVsxXT1jLGVbNV09bipsLGVbOV09LW8qbCxlWzJdPS1oKmwsZVs2XT1zKmMraSxlWzEwXT10LXIqY31lbHNlIGlmKCJYWlkiPT09dC5vcmRlcil7Y29uc3QgdD1uKmEscz1uKmgsaT1vKmEscj1vKmg7ZVswXT1hKmwsZVs0XT0tYyxlWzhdPWgqbCxlWzFdPXQqYytyLGVbNV09bipsLGVbOV09cypjLWksZVsyXT1pKmMtcyxlWzZdPW8qbCxlWzEwXT1yKmMrdH1yZXR1cm4gZVszXT0wLGVbN109MCxlWzExXT0wLGVbMTJdPTAsZVsxM109MCxlWzE0XT0wLGVbMTVdPTEsdGhpc31tYWtlUm90YXRpb25Gcm9tUXVhdGVybmlvbih0KXtyZXR1cm4gdGhpcy5jb21wb3NlKGV0LHQsc3QpfWxvb2tBdCh0LGUscyl7Y29uc3QgaT10aGlzLmVsZW1lbnRzO3JldHVybiBudC5zdWJWZWN0b3JzKHQsZSksMD09PW50Lmxlbmd0aFNxKCkmJihudC56PTEpLG50Lm5vcm1hbGl6ZSgpLGl0LmNyb3NzVmVjdG9ycyhzLG50KSwwPT09aXQubGVuZ3RoU3EoKSYmKDE9PT1NYXRoLmFicyhzLnopP250LngrPTFlLTQ6bnQueis9MWUtNCxudC5ub3JtYWxpemUoKSxpdC5jcm9zc1ZlY3RvcnMocyxudCkpLGl0Lm5vcm1hbGl6ZSgpLHJ0LmNyb3NzVmVjdG9ycyhudCxpdCksaVswXT1pdC54LGlbNF09cnQueCxpWzhdPW50LngsaVsxXT1pdC55LGlbNV09cnQueSxpWzldPW50LnksaVsyXT1pdC56LGlbNl09cnQueixpWzEwXT1udC56LHRoaXN9bXVsdGlwbHkodCxlKXtyZXR1cm4gdm9pZCAwIT09ZT8oY29uc29sZS53YXJuKCJUSFJFRS5NYXRyaXg0OiAubXVsdGlwbHkoKSBub3cgb25seSBhY2NlcHRzIG9uZSBhcmd1bWVudC4gVXNlIC5tdWx0aXBseU1hdHJpY2VzKCBhLCBiICkgaW5zdGVhZC4iKSx0aGlzLm11bHRpcGx5TWF0cmljZXModCxlKSk6dGhpcy5tdWx0aXBseU1hdHJpY2VzKHRoaXMsdCl9cHJlbXVsdGlwbHkodCl7cmV0dXJuIHRoaXMubXVsdGlwbHlNYXRyaWNlcyh0LHRoaXMpfW11bHRpcGx5TWF0cmljZXModCxlKXtjb25zdCBzPXQuZWxlbWVudHMsaT1lLmVsZW1lbnRzLHI9dGhpcy5lbGVtZW50cyxuPXNbMF0sbz1zWzRdLGE9c1s4XSxoPXNbMTJdLGw9c1sxXSxjPXNbNV0sdT1zWzldLGQ9c1sxM10sbT1zWzJdLHk9c1s2XSxwPXNbMTBdLHg9c1sxNF0sZj1zWzNdLGc9c1s3XSxiPXNbMTFdLHc9c1sxNV0sTT1pWzBdLHo9aVs0XSx2PWlbOF0sXz1pWzEyXSxBPWlbMV0sUz1pWzVdLEI9aVs5XSxUPWlbMTNdLEU9aVsyXSxrPWlbNl0sUD1pWzEwXSxDPWlbMTRdLEY9aVszXSxWPWlbN10sUj1pWzExXSxxPWlbMTVdO3JldHVybiByWzBdPW4qTStvKkErYSpFK2gqRixyWzRdPW4qeitvKlMrYSprK2gqVixyWzhdPW4qditvKkIrYSpQK2gqUixyWzEyXT1uKl8rbypUK2EqQytoKnEsclsxXT1sKk0rYypBK3UqRStkKkYscls1XT1sKnorYypTK3UqaytkKlYscls5XT1sKnYrYypCK3UqUCtkKlIsclsxM109bCpfK2MqVCt1KkMrZCpxLHJbMl09bSpNK3kqQStwKkUreCpGLHJbNl09bSp6K3kqUytwKmsreCpWLHJbMTBdPW0qdit5KkIrcCpQK3gqUixyWzE0XT1tKl8reSpUK3AqQyt4KnEsclszXT1mKk0rZypBK2IqRSt3KkYscls3XT1mKnorZypTK2Iqayt3KlYsclsxMV09Zip2K2cqQitiKlArdypSLHJbMTVdPWYqXytnKlQrYipDK3cqcSx0aGlzfW11bHRpcGx5U2NhbGFyKHQpe2NvbnN0IGU9dGhpcy5lbGVtZW50cztyZXR1cm4gZVswXSo9dCxlWzRdKj10LGVbOF0qPXQsZVsxMl0qPXQsZVsxXSo9dCxlWzVdKj10LGVbOV0qPXQsZVsxM10qPXQsZVsyXSo9dCxlWzZdKj10LGVbMTBdKj10LGVbMTRdKj10LGVbM10qPXQsZVs3XSo9dCxlWzExXSo9dCxlWzE1XSo9dCx0aGlzfWRldGVybWluYW50KCl7Y29uc3QgdD10aGlzLmVsZW1lbnRzLGU9dFswXSxzPXRbNF0saT10WzhdLHI9dFsxMl0sbj10WzFdLG89dFs1XSxhPXRbOV0saD10WzEzXSxsPXRbMl0sYz10WzZdLHU9dFsxMF0sZD10WzE0XTtyZXR1cm4gdFszXSooK3IqYSpjLWkqaCpjLXIqbyp1K3MqaCp1K2kqbypkLXMqYSpkKSt0WzddKigrZSphKmQtZSpoKnUrcipuKnUtaSpuKmQraSpoKmwtciphKmwpK3RbMTFdKigrZSpoKmMtZSpvKmQtcipuKmMrcypuKmQrcipvKmwtcypoKmwpK3RbMTVdKigtaSpvKmwtZSphKmMrZSpvKnUraSpuKmMtcypuKnUrcyphKmwpfXRyYW5zcG9zZSgpe2NvbnN0IHQ9dGhpcy5lbGVtZW50cztsZXQgZTtyZXR1cm4gZT10WzFdLHRbMV09dFs0XSx0WzRdPWUsZT10WzJdLHRbMl09dFs4XSx0WzhdPWUsZT10WzZdLHRbNl09dFs5XSx0WzldPWUsZT10WzNdLHRbM109dFsxMl0sdFsxMl09ZSxlPXRbN10sdFs3XT10WzEzXSx0WzEzXT1lLGU9dFsxMV0sdFsxMV09dFsxNF0sdFsxNF09ZSx0aGlzfXNldFBvc2l0aW9uKHQsZSxzKXtjb25zdCBpPXRoaXMuZWxlbWVudHM7cmV0dXJuIHQuaXNWZWN0b3IzPyhpWzEyXT10LngsaVsxM109dC55LGlbMTRdPXQueik6KGlbMTJdPXQsaVsxM109ZSxpWzE0XT1zKSx0aGlzfWludmVydCgpe2NvbnN0IHQ9dGhpcy5lbGVtZW50cyxlPXRbMF0scz10WzFdLGk9dFsyXSxyPXRbM10sbj10WzRdLG89dFs1XSxhPXRbNl0saD10WzddLGw9dFs4XSxjPXRbOV0sdT10WzEwXSxkPXRbMTFdLG09dFsxMl0seT10WzEzXSxwPXRbMTRdLHg9dFsxNV0sZj1jKnAqaC15KnUqaCt5KmEqZC1vKnAqZC1jKmEqeCtvKnUqeCxnPW0qdSpoLWwqcCpoLW0qYSpkK24qcCpkK2wqYSp4LW4qdSp4LGI9bCp5KmgtbSpjKmgrbSpvKmQtbip5KmQtbCpvKngrbipjKngsdz1tKmMqYS1sKnkqYS1tKm8qdStuKnkqdStsKm8qcC1uKmMqcCxNPWUqZitzKmcraSpiK3IqdztpZigwPT09TSlyZXR1cm4gdGhpcy5zZXQoMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCk7Y29uc3Qgej0xL007cmV0dXJuIHRbMF09Zip6LHRbMV09KHkqdSpyLWMqcCpyLXkqaSpkK3MqcCpkK2MqaSp4LXMqdSp4KSp6LHRbMl09KG8qcCpyLXkqYSpyK3kqaSpoLXMqcCpoLW8qaSp4K3MqYSp4KSp6LHRbM109KGMqYSpyLW8qdSpyLWMqaSpoK3MqdSpoK28qaSpkLXMqYSpkKSp6LHRbNF09Zyp6LHRbNV09KGwqcCpyLW0qdSpyK20qaSpkLWUqcCpkLWwqaSp4K2UqdSp4KSp6LHRbNl09KG0qYSpyLW4qcCpyLW0qaSpoK2UqcCpoK24qaSp4LWUqYSp4KSp6LHRbN109KG4qdSpyLWwqYSpyK2wqaSpoLWUqdSpoLW4qaSpkK2UqYSpkKSp6LHRbOF09Yip6LHRbOV09KG0qYypyLWwqeSpyLW0qcypkK2UqeSpkK2wqcyp4LWUqYyp4KSp6LHRbMTBdPShuKnkqci1tKm8qcittKnMqaC1lKnkqaC1uKnMqeCtlKm8qeCkqeix0WzExXT0obCpvKnItbipjKnItbCpzKmgrZSpjKmgrbipzKmQtZSpvKmQpKnosdFsxMl09dyp6LHRbMTNdPShsKnkqaS1tKmMqaSttKnMqdS1lKnkqdS1sKnMqcCtlKmMqcCkqeix0WzE0XT0obSpvKmktbip5KmktbSpzKmErZSp5KmErbipzKnAtZSpvKnApKnosdFsxNV09KG4qYyppLWwqbyppK2wqcyphLWUqYyphLW4qcyp1K2Uqbyp1KSp6LHRoaXN9c2NhbGUodCl7Y29uc3QgZT10aGlzLmVsZW1lbnRzLHM9dC54LGk9dC55LHI9dC56O3JldHVybiBlWzBdKj1zLGVbNF0qPWksZVs4XSo9cixlWzFdKj1zLGVbNV0qPWksZVs5XSo9cixlWzJdKj1zLGVbNl0qPWksZVsxMF0qPXIsZVszXSo9cyxlWzddKj1pLGVbMTFdKj1yLHRoaXN9Z2V0TWF4U2NhbGVPbkF4aXMoKXtjb25zdCB0PXRoaXMuZWxlbWVudHMsZT10WzBdKnRbMF0rdFsxXSp0WzFdK3RbMl0qdFsyXSxzPXRbNF0qdFs0XSt0WzVdKnRbNV0rdFs2XSp0WzZdLGk9dFs4XSp0WzhdK3RbOV0qdFs5XSt0WzEwXSp0WzEwXTtyZXR1cm4gTWF0aC5zcXJ0KE1hdGgubWF4KGUscyxpKSl9bWFrZVRyYW5zbGF0aW9uKHQsZSxzKXtyZXR1cm4gdGhpcy5zZXQoMSwwLDAsdCwwLDEsMCxlLDAsMCwxLHMsMCwwLDAsMSksdGhpc31tYWtlUm90YXRpb25YKHQpe2NvbnN0IGU9TWF0aC5jb3ModCkscz1NYXRoLnNpbih0KTtyZXR1cm4gdGhpcy5zZXQoMSwwLDAsMCwwLGUsLXMsMCwwLHMsZSwwLDAsMCwwLDEpLHRoaXN9bWFrZVJvdGF0aW9uWSh0KXtjb25zdCBlPU1hdGguY29zKHQpLHM9TWF0aC5zaW4odCk7cmV0dXJuIHRoaXMuc2V0KGUsMCxzLDAsMCwxLDAsMCwtcywwLGUsMCwwLDAsMCwxKSx0aGlzfW1ha2VSb3RhdGlvbloodCl7Y29uc3QgZT1NYXRoLmNvcyh0KSxzPU1hdGguc2luKHQpO3JldHVybiB0aGlzLnNldChlLC1zLDAsMCxzLGUsMCwwLDAsMCwxLDAsMCwwLDAsMSksdGhpc31tYWtlUm90YXRpb25BeGlzKHQsZSl7Y29uc3Qgcz1NYXRoLmNvcyhlKSxpPU1hdGguc2luKGUpLHI9MS1zLG49dC54LG89dC55LGE9dC56LGg9cipuLGw9cipvO3JldHVybiB0aGlzLnNldChoKm4rcyxoKm8taSphLGgqYStpKm8sMCxoKm8raSphLGwqbytzLGwqYS1pKm4sMCxoKmEtaSpvLGwqYStpKm4sciphKmErcywwLDAsMCwwLDEpLHRoaXN9bWFrZVNjYWxlKHQsZSxzKXtyZXR1cm4gdGhpcy5zZXQodCwwLDAsMCwwLGUsMCwwLDAsMCxzLDAsMCwwLDAsMSksdGhpc31tYWtlU2hlYXIodCxlLHMsaSxyLG4pe3JldHVybiB0aGlzLnNldCgxLHMsciwwLHQsMSxuLDAsZSxpLDEsMCwwLDAsMCwxKSx0aGlzfWNvbXBvc2UodCxlLHMpe2NvbnN0IGk9dGhpcy5lbGVtZW50cyxyPWUuX3gsbj1lLl95LG89ZS5feixhPWUuX3csaD1yK3IsbD1uK24sYz1vK28sdT1yKmgsZD1yKmwsbT1yKmMseT1uKmwscD1uKmMseD1vKmMsZj1hKmgsZz1hKmwsYj1hKmMsdz1zLngsTT1zLnksej1zLno7cmV0dXJuIGlbMF09KDEtKHkreCkpKncsaVsxXT0oZCtiKSp3LGlbMl09KG0tZykqdyxpWzNdPTAsaVs0XT0oZC1iKSpNLGlbNV09KDEtKHUreCkpKk0saVs2XT0ocCtmKSpNLGlbN109MCxpWzhdPShtK2cpKnosaVs5XT0ocC1mKSp6LGlbMTBdPSgxLSh1K3kpKSp6LGlbMTFdPTAsaVsxMl09dC54LGlbMTNdPXQueSxpWzE0XT10LnosaVsxNV09MSx0aGlzfWRlY29tcG9zZSh0LGUscyl7Y29uc3QgaT10aGlzLmVsZW1lbnRzO2xldCByPUsuc2V0KGlbMF0saVsxXSxpWzJdKS5sZW5ndGgoKTtjb25zdCBuPUsuc2V0KGlbNF0saVs1XSxpWzZdKS5sZW5ndGgoKSxvPUsuc2V0KGlbOF0saVs5XSxpWzEwXSkubGVuZ3RoKCk7dGhpcy5kZXRlcm1pbmFudCgpPDAmJihyPS1yKSx0Lng9aVsxMl0sdC55PWlbMTNdLHQuej1pWzE0XSx0dC5jb3B5KHRoaXMpO2NvbnN0IGE9MS9yLGg9MS9uLGw9MS9vO3JldHVybiB0dC5lbGVtZW50c1swXSo9YSx0dC5lbGVtZW50c1sxXSo9YSx0dC5lbGVtZW50c1syXSo9YSx0dC5lbGVtZW50c1s0XSo9aCx0dC5lbGVtZW50c1s1XSo9aCx0dC5lbGVtZW50c1s2XSo9aCx0dC5lbGVtZW50c1s4XSo9bCx0dC5lbGVtZW50c1s5XSo9bCx0dC5lbGVtZW50c1sxMF0qPWwsZS5zZXRGcm9tUm90YXRpb25NYXRyaXgodHQpLHMueD1yLHMueT1uLHMuej1vLHRoaXN9bWFrZVBlcnNwZWN0aXZlKHQsZSxzLGkscixuKXt2b2lkIDA9PT1uJiZjb25zb2xlLndhcm4oIlRIUkVFLk1hdHJpeDQ6IC5tYWtlUGVyc3BlY3RpdmUoKSBoYXMgYmVlbiByZWRlZmluZWQgYW5kIGhhcyBhIG5ldyBzaWduYXR1cmUuIFBsZWFzZSBjaGVjayB0aGUgZG9jcy4iKTtjb25zdCBvPXRoaXMuZWxlbWVudHMsYT0yKnIvKGUtdCksaD0yKnIvKHMtaSksbD0oZSt0KS8oZS10KSxjPShzK2kpLyhzLWkpLHU9LShuK3IpLyhuLXIpLGQ9LTIqbipyLyhuLXIpO3JldHVybiBvWzBdPWEsb1s0XT0wLG9bOF09bCxvWzEyXT0wLG9bMV09MCxvWzVdPWgsb1s5XT1jLG9bMTNdPTAsb1syXT0wLG9bNl09MCxvWzEwXT11LG9bMTRdPWQsb1szXT0wLG9bN109MCxvWzExXT0tMSxvWzE1XT0wLHRoaXN9bWFrZU9ydGhvZ3JhcGhpYyh0LGUscyxpLHIsbil7Y29uc3Qgbz10aGlzLmVsZW1lbnRzLGE9MS8oZS10KSxoPTEvKHMtaSksbD0xLyhuLXIpLGM9KGUrdCkqYSx1PShzK2kpKmgsZD0obityKSpsO3JldHVybiBvWzBdPTIqYSxvWzRdPTAsb1s4XT0wLG9bMTJdPS1jLG9bMV09MCxvWzVdPTIqaCxvWzldPTAsb1sxM109LXUsb1syXT0wLG9bNl09MCxvWzEwXT0tMipsLG9bMTRdPS1kLG9bM109MCxvWzddPTAsb1sxMV09MCxvWzE1XT0xLHRoaXN9ZXF1YWxzKHQpe2NvbnN0IGU9dGhpcy5lbGVtZW50cyxzPXQuZWxlbWVudHM7Zm9yKGxldCB0PTA7dDwxNjt0KyspaWYoZVt0XSE9PXNbdF0pcmV0dXJuITE7cmV0dXJuITB9ZnJvbUFycmF5KHQpe2xldCBlPWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTowO2ZvcihsZXQgcz0wO3M8MTY7cysrKXRoaXMuZWxlbWVudHNbc109dFtzK2VdO3JldHVybiB0aGlzfXRvQXJyYXkoKXtsZXQgdD1hcmd1bWVudHMubGVuZ3RoPjAmJnZvaWQgMCE9PWFyZ3VtZW50c1swXT9hcmd1bWVudHNbMF06W10sZT1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06MDtjb25zdCBzPXRoaXMuZWxlbWVudHM7cmV0dXJuIHRbZV09c1swXSx0W2UrMV09c1sxXSx0W2UrMl09c1syXSx0W2UrM109c1szXSx0W2UrNF09c1s0XSx0W2UrNV09c1s1XSx0W2UrNl09c1s2XSx0W2UrN109c1s3XSx0W2UrOF09c1s4XSx0W2UrOV09c1s5XSx0W2UrMTBdPXNbMTBdLHRbZSsxMV09c1sxMV0sdFtlKzEyXT1zWzEyXSx0W2UrMTNdPXNbMTNdLHRbZSsxNF09c1sxNF0sdFtlKzE1XT1zWzE1XSx0fX1jb25zdCBLPW5ldyBFLHR0PW5ldyAkLGV0PW5ldyBFKDAsMCwwKSxzdD1uZXcgRSgxLDEsMSksaXQ9bmV3IEUscnQ9bmV3IEUsbnQ9bmV3IEUsb3Q9bmV3ICQsYXQ9bmV3IFQ7Y2xhc3MgaHR7Y29uc3RydWN0b3IoKXtsZXQgdD1hcmd1bWVudHMubGVuZ3RoPjAmJnZvaWQgMCE9PWFyZ3VtZW50c1swXT9hcmd1bWVudHNbMF06MCxlPWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTowLHM9YXJndW1lbnRzLmxlbmd0aD4yJiZ2b2lkIDAhPT1hcmd1bWVudHNbMl0/YXJndW1lbnRzWzJdOjAsaT1hcmd1bWVudHMubGVuZ3RoPjMmJnZvaWQgMCE9PWFyZ3VtZW50c1szXT9hcmd1bWVudHNbM106aHQuRGVmYXVsdE9yZGVyO3RoaXMuaXNFdWxlcj0hMCx0aGlzLl94PXQsdGhpcy5feT1lLHRoaXMuX3o9cyx0aGlzLl9vcmRlcj1pfWdldCB4KCl7cmV0dXJuIHRoaXMuX3h9c2V0IHgodCl7dGhpcy5feD10LHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKX1nZXQgeSgpe3JldHVybiB0aGlzLl95fXNldCB5KHQpe3RoaXMuX3k9dCx0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCl9Z2V0IHooKXtyZXR1cm4gdGhpcy5fen1zZXQgeih0KXt0aGlzLl96PXQsdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpfWdldCBvcmRlcigpe3JldHVybiB0aGlzLl9vcmRlcn1zZXQgb3JkZXIodCl7dGhpcy5fb3JkZXI9dCx0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCl9c2V0KHQsZSxzKXtsZXQgaT1hcmd1bWVudHMubGVuZ3RoPjMmJnZvaWQgMCE9PWFyZ3VtZW50c1szXT9hcmd1bWVudHNbM106dGhpcy5fb3JkZXI7cmV0dXJuIHRoaXMuX3g9dCx0aGlzLl95PWUsdGhpcy5fej1zLHRoaXMuX29yZGVyPWksdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpLHRoaXN9Y2xvbmUoKXtyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IodGhpcy5feCx0aGlzLl95LHRoaXMuX3osdGhpcy5fb3JkZXIpfWNvcHkodCl7cmV0dXJuIHRoaXMuX3g9dC5feCx0aGlzLl95PXQuX3ksdGhpcy5fej10Ll96LHRoaXMuX29yZGVyPXQuX29yZGVyLHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKSx0aGlzfXNldEZyb21Sb3RhdGlvbk1hdHJpeCh0KXtsZXQgZT1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06dGhpcy5fb3JkZXIscz0hKGFyZ3VtZW50cy5sZW5ndGg+MiYmdm9pZCAwIT09YXJndW1lbnRzWzJdKXx8YXJndW1lbnRzWzJdO2NvbnN0IGk9dC5lbGVtZW50cyxyPWlbMF0sbj1pWzRdLGE9aVs4XSxoPWlbMV0sbD1pWzVdLGM9aVs5XSx1PWlbMl0sZD1pWzZdLG09aVsxMF07c3dpdGNoKGUpe2Nhc2UiWFlaIjp0aGlzLl95PU1hdGguYXNpbihvKGEsLTEsMSkpLE1hdGguYWJzKGEpPC45OTk5OTk5Pyh0aGlzLl94PU1hdGguYXRhbjIoLWMsbSksdGhpcy5fej1NYXRoLmF0YW4yKC1uLHIpKToodGhpcy5feD1NYXRoLmF0YW4yKGQsbCksdGhpcy5fej0wKTticmVhaztjYXNlIllYWiI6dGhpcy5feD1NYXRoLmFzaW4oLW8oYywtMSwxKSksTWF0aC5hYnMoYyk8Ljk5OTk5OTk/KHRoaXMuX3k9TWF0aC5hdGFuMihhLG0pLHRoaXMuX3o9TWF0aC5hdGFuMihoLGwpKToodGhpcy5feT1NYXRoLmF0YW4yKC11LHIpLHRoaXMuX3o9MCk7YnJlYWs7Y2FzZSJaWFkiOnRoaXMuX3g9TWF0aC5hc2luKG8oZCwtMSwxKSksTWF0aC5hYnMoZCk8Ljk5OTk5OTk/KHRoaXMuX3k9TWF0aC5hdGFuMigtdSxtKSx0aGlzLl96PU1hdGguYXRhbjIoLW4sbCkpOih0aGlzLl95PTAsdGhpcy5fej1NYXRoLmF0YW4yKGgscikpO2JyZWFrO2Nhc2UiWllYIjp0aGlzLl95PU1hdGguYXNpbigtbyh1LC0xLDEpKSxNYXRoLmFicyh1KTwuOTk5OTk5OT8odGhpcy5feD1NYXRoLmF0YW4yKGQsbSksdGhpcy5fej1NYXRoLmF0YW4yKGgscikpOih0aGlzLl94PTAsdGhpcy5fej1NYXRoLmF0YW4yKC1uLGwpKTticmVhaztjYXNlIllaWCI6dGhpcy5fej1NYXRoLmFzaW4obyhoLC0xLDEpKSxNYXRoLmFicyhoKTwuOTk5OTk5OT8odGhpcy5feD1NYXRoLmF0YW4yKC1jLGwpLHRoaXMuX3k9TWF0aC5hdGFuMigtdSxyKSk6KHRoaXMuX3g9MCx0aGlzLl95PU1hdGguYXRhbjIoYSxtKSk7YnJlYWs7Y2FzZSJYWlkiOnRoaXMuX3o9TWF0aC5hc2luKC1vKG4sLTEsMSkpLE1hdGguYWJzKG4pPC45OTk5OTk5Pyh0aGlzLl94PU1hdGguYXRhbjIoZCxsKSx0aGlzLl95PU1hdGguYXRhbjIoYSxyKSk6KHRoaXMuX3g9TWF0aC5hdGFuMigtYyxtKSx0aGlzLl95PTApO2JyZWFrO2RlZmF1bHQ6Y29uc29sZS53YXJuKCJUSFJFRS5FdWxlcjogLnNldEZyb21Sb3RhdGlvbk1hdHJpeCgpIGVuY291bnRlcmVkIGFuIHVua25vd24gb3JkZXI6ICIrZSl9cmV0dXJuIHRoaXMuX29yZGVyPWUsITA9PT1zJiZ0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCksdGhpc31zZXRGcm9tUXVhdGVybmlvbih0LGUscyl7cmV0dXJuIG90Lm1ha2VSb3RhdGlvbkZyb21RdWF0ZXJuaW9uKHQpLHRoaXMuc2V0RnJvbVJvdGF0aW9uTWF0cml4KG90LGUscyl9c2V0RnJvbVZlY3RvcjModCl7bGV0IGU9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOnRoaXMuX29yZGVyO3JldHVybiB0aGlzLnNldCh0LngsdC55LHQueixlKX1yZW9yZGVyKHQpe3JldHVybiBhdC5zZXRGcm9tRXVsZXIodGhpcyksdGhpcy5zZXRGcm9tUXVhdGVybmlvbihhdCx0KX1lcXVhbHModCl7cmV0dXJuIHQuX3g9PT10aGlzLl94JiZ0Ll95PT09dGhpcy5feSYmdC5fej09PXRoaXMuX3omJnQuX29yZGVyPT09dGhpcy5fb3JkZXJ9ZnJvbUFycmF5KHQpe3JldHVybiB0aGlzLl94PXRbMF0sdGhpcy5feT10WzFdLHRoaXMuX3o9dFsyXSx2b2lkIDAhPT10WzNdJiYodGhpcy5fb3JkZXI9dFszXSksdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpLHRoaXN9dG9BcnJheSgpe2xldCB0PWFyZ3VtZW50cy5sZW5ndGg+MCYmdm9pZCAwIT09YXJndW1lbnRzWzBdP2FyZ3VtZW50c1swXTpbXSxlPWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTowO3JldHVybiB0W2VdPXRoaXMuX3gsdFtlKzFdPXRoaXMuX3ksdFtlKzJdPXRoaXMuX3osdFtlKzNdPXRoaXMuX29yZGVyLHR9X29uQ2hhbmdlKHQpe3JldHVybiB0aGlzLl9vbkNoYW5nZUNhbGxiYWNrPXQsdGhpc31fb25DaGFuZ2VDYWxsYmFjaygpe30qW1N5bWJvbC5pdGVyYXRvcl0oKXt5aWVsZCB0aGlzLl94LHlpZWxkIHRoaXMuX3kseWllbGQgdGhpcy5feix5aWVsZCB0aGlzLl9vcmRlcn10b1ZlY3RvcjMoKXtjb25zb2xlLmVycm9yKCJUSFJFRS5FdWxlcjogLnRvVmVjdG9yMygpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBWZWN0b3IzLnNldEZyb21FdWxlcigpIGluc3RlYWQiKX19aHQuRGVmYXVsdE9yZGVyPSJYWVoiLGh0LlJvdGF0aW9uT3JkZXJzPVsiWFlaIiwiWVpYIiwiWlhZIiwiWFpZIiwiWVhaIiwiWllYIl07Y2xhc3MgbHR7Y29uc3RydWN0b3IoKXt0aGlzLm1hc2s9MX1zZXQodCl7dGhpcy5tYXNrPSgxPDx0fDApPj4+MH1lbmFibGUodCl7dGhpcy5tYXNrfD0xPDx0fDB9ZW5hYmxlQWxsKCl7dGhpcy5tYXNrPS0xfXRvZ2dsZSh0KXt0aGlzLm1hc2tePTE8PHR8MH1kaXNhYmxlKHQpe3RoaXMubWFzayY9figxPDx0fDApfWRpc2FibGVBbGwoKXt0aGlzLm1hc2s9MH10ZXN0KHQpe3JldHVybiAwIT0odGhpcy5tYXNrJnQubWFzayl9aXNFbmFibGVkKHQpe3JldHVybiAwIT0odGhpcy5tYXNrJigxPDx0fDApKX19bGV0IGN0PTA7Y29uc3QgdXQ9bmV3IEUsZHQ9bmV3IFQsbXQ9bmV3ICQseXQ9bmV3IEUscHQ9bmV3IEUseHQ9bmV3IEUsZnQ9bmV3IFQsZ3Q9bmV3IEUoMSwwLDApLGJ0PW5ldyBFKDAsMSwwKSx3dD1uZXcgRSgwLDAsMSksTXQ9e3R5cGU6ImFkZGVkIn0senQ9e3R5cGU6InJlbW92ZWQifTtjbGFzcyB2dCBleHRlbmRzIGl7Y29uc3RydWN0b3IoKXtzdXBlcigpLHRoaXMuaXNPYmplY3QzRD0hMCxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiaWQiLHt2YWx1ZTpjdCsrfSksdGhpcy51dWlkPW4oKSx0aGlzLm5hbWU9IiIsdGhpcy50eXBlPSJPYmplY3QzRCIsdGhpcy5wYXJlbnQ9bnVsbCx0aGlzLmNoaWxkcmVuPVtdLHRoaXMudXA9dnQuRGVmYXVsdFVwLmNsb25lKCk7Y29uc3QgdD1uZXcgRSxlPW5ldyBodCxzPW5ldyBULGk9bmV3IEUoMSwxLDEpO2UuX29uQ2hhbmdlKChmdW5jdGlvbigpe3Muc2V0RnJvbUV1bGVyKGUsITEpfSkpLHMuX29uQ2hhbmdlKChmdW5jdGlvbigpe2Uuc2V0RnJvbVF1YXRlcm5pb24ocyx2b2lkIDAsITEpfSkpLE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRoaXMse3Bvc2l0aW9uOntjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCx2YWx1ZTp0fSxyb3RhdGlvbjp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsdmFsdWU6ZX0scXVhdGVybmlvbjp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsdmFsdWU6c30sc2NhbGU6e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLHZhbHVlOml9LG1vZGVsVmlld01hdHJpeDp7dmFsdWU6bmV3ICR9LG5vcm1hbE1hdHJpeDp7dmFsdWU6bmV3IGx9fSksdGhpcy5tYXRyaXg9bmV3ICQsdGhpcy5tYXRyaXhXb3JsZD1uZXcgJCx0aGlzLm1hdHJpeEF1dG9VcGRhdGU9dnQuRGVmYXVsdE1hdHJpeEF1dG9VcGRhdGUsdGhpcy5tYXRyaXhXb3JsZE5lZWRzVXBkYXRlPSExLHRoaXMubGF5ZXJzPW5ldyBsdCx0aGlzLnZpc2libGU9ITAsdGhpcy5jYXN0U2hhZG93PSExLHRoaXMucmVjZWl2ZVNoYWRvdz0hMSx0aGlzLmZydXN0dW1DdWxsZWQ9ITAsdGhpcy5yZW5kZXJPcmRlcj0wLHRoaXMuYW5pbWF0aW9ucz1bXSx0aGlzLnVzZXJEYXRhPXt9fW9uQmVmb3JlUmVuZGVyKCl7fW9uQWZ0ZXJSZW5kZXIoKXt9YXBwbHlNYXRyaXg0KHQpe3RoaXMubWF0cml4QXV0b1VwZGF0ZSYmdGhpcy51cGRhdGVNYXRyaXgoKSx0aGlzLm1hdHJpeC5wcmVtdWx0aXBseSh0KSx0aGlzLm1hdHJpeC5kZWNvbXBvc2UodGhpcy5wb3NpdGlvbix0aGlzLnF1YXRlcm5pb24sdGhpcy5zY2FsZSl9YXBwbHlRdWF0ZXJuaW9uKHQpe3JldHVybiB0aGlzLnF1YXRlcm5pb24ucHJlbXVsdGlwbHkodCksdGhpc31zZXRSb3RhdGlvbkZyb21BeGlzQW5nbGUodCxlKXt0aGlzLnF1YXRlcm5pb24uc2V0RnJvbUF4aXNBbmdsZSh0LGUpfXNldFJvdGF0aW9uRnJvbUV1bGVyKHQpe3RoaXMucXVhdGVybmlvbi5zZXRGcm9tRXVsZXIodCwhMCl9c2V0Um90YXRpb25Gcm9tTWF0cml4KHQpe3RoaXMucXVhdGVybmlvbi5zZXRGcm9tUm90YXRpb25NYXRyaXgodCl9c2V0Um90YXRpb25Gcm9tUXVhdGVybmlvbih0KXt0aGlzLnF1YXRlcm5pb24uY29weSh0KX1yb3RhdGVPbkF4aXModCxlKXtyZXR1cm4gZHQuc2V0RnJvbUF4aXNBbmdsZSh0LGUpLHRoaXMucXVhdGVybmlvbi5tdWx0aXBseShkdCksdGhpc31yb3RhdGVPbldvcmxkQXhpcyh0LGUpe3JldHVybiBkdC5zZXRGcm9tQXhpc0FuZ2xlKHQsZSksdGhpcy5xdWF0ZXJuaW9uLnByZW11bHRpcGx5KGR0KSx0aGlzfXJvdGF0ZVgodCl7cmV0dXJuIHRoaXMucm90YXRlT25BeGlzKGd0LHQpfXJvdGF0ZVkodCl7cmV0dXJuIHRoaXMucm90YXRlT25BeGlzKGJ0LHQpfXJvdGF0ZVoodCl7cmV0dXJuIHRoaXMucm90YXRlT25BeGlzKHd0LHQpfXRyYW5zbGF0ZU9uQXhpcyh0LGUpe3JldHVybiB1dC5jb3B5KHQpLmFwcGx5UXVhdGVybmlvbih0aGlzLnF1YXRlcm5pb24pLHRoaXMucG9zaXRpb24uYWRkKHV0Lm11bHRpcGx5U2NhbGFyKGUpKSx0aGlzfXRyYW5zbGF0ZVgodCl7cmV0dXJuIHRoaXMudHJhbnNsYXRlT25BeGlzKGd0LHQpfXRyYW5zbGF0ZVkodCl7cmV0dXJuIHRoaXMudHJhbnNsYXRlT25BeGlzKGJ0LHQpfXRyYW5zbGF0ZVoodCl7cmV0dXJuIHRoaXMudHJhbnNsYXRlT25BeGlzKHd0LHQpfWxvY2FsVG9Xb3JsZCh0KXtyZXR1cm4gdC5hcHBseU1hdHJpeDQodGhpcy5tYXRyaXhXb3JsZCl9d29ybGRUb0xvY2FsKHQpe3JldHVybiB0LmFwcGx5TWF0cml4NChtdC5jb3B5KHRoaXMubWF0cml4V29ybGQpLmludmVydCgpKX1sb29rQXQodCxlLHMpe3QuaXNWZWN0b3IzP3l0LmNvcHkodCk6eXQuc2V0KHQsZSxzKTtjb25zdCBpPXRoaXMucGFyZW50O3RoaXMudXBkYXRlV29ybGRNYXRyaXgoITAsITEpLHB0LnNldEZyb21NYXRyaXhQb3NpdGlvbih0aGlzLm1hdHJpeFdvcmxkKSx0aGlzLmlzQ2FtZXJhfHx0aGlzLmlzTGlnaHQ/bXQubG9va0F0KHB0LHl0LHRoaXMudXApOm10Lmxvb2tBdCh5dCxwdCx0aGlzLnVwKSx0aGlzLnF1YXRlcm5pb24uc2V0RnJvbVJvdGF0aW9uTWF0cml4KG10KSxpJiYobXQuZXh0cmFjdFJvdGF0aW9uKGkubWF0cml4V29ybGQpLGR0LnNldEZyb21Sb3RhdGlvbk1hdHJpeChtdCksdGhpcy5xdWF0ZXJuaW9uLnByZW11bHRpcGx5KGR0LmludmVydCgpKSl9YWRkKHQpe2lmKGFyZ3VtZW50cy5sZW5ndGg+MSl7Zm9yKGxldCB0PTA7dDxhcmd1bWVudHMubGVuZ3RoO3QrKyl0aGlzLmFkZChhcmd1bWVudHNbdF0pO3JldHVybiB0aGlzfXJldHVybiB0PT09dGhpcz8oY29uc29sZS5lcnJvcigiVEhSRUUuT2JqZWN0M0QuYWRkOiBvYmplY3QgY2FuJ3QgYmUgYWRkZWQgYXMgYSBjaGlsZCBvZiBpdHNlbGYuIix0KSx0aGlzKToodCYmdC5pc09iamVjdDNEPyhudWxsIT09dC5wYXJlbnQmJnQucGFyZW50LnJlbW92ZSh0KSx0LnBhcmVudD10aGlzLHRoaXMuY2hpbGRyZW4ucHVzaCh0KSx0LmRpc3BhdGNoRXZlbnQoTXQpKTpjb25zb2xlLmVycm9yKCJUSFJFRS5PYmplY3QzRC5hZGQ6IG9iamVjdCBub3QgYW4gaW5zdGFuY2Ugb2YgVEhSRUUuT2JqZWN0M0QuIix0KSx0aGlzKX1yZW1vdmUodCl7aWYoYXJndW1lbnRzLmxlbmd0aD4xKXtmb3IobGV0IHQ9MDt0PGFyZ3VtZW50cy5sZW5ndGg7dCsrKXRoaXMucmVtb3ZlKGFyZ3VtZW50c1t0XSk7cmV0dXJuIHRoaXN9Y29uc3QgZT10aGlzLmNoaWxkcmVuLmluZGV4T2YodCk7cmV0dXJuLTEhPT1lJiYodC5wYXJlbnQ9bnVsbCx0aGlzLmNoaWxkcmVuLnNwbGljZShlLDEpLHQuZGlzcGF0Y2hFdmVudCh6dCkpLHRoaXN9cmVtb3ZlRnJvbVBhcmVudCgpe2NvbnN0IHQ9dGhpcy5wYXJlbnQ7cmV0dXJuIG51bGwhPT10JiZ0LnJlbW92ZSh0aGlzKSx0aGlzfWNsZWFyKCl7Zm9yKGxldCB0PTA7dDx0aGlzLmNoaWxkcmVuLmxlbmd0aDt0Kyspe2NvbnN0IGU9dGhpcy5jaGlsZHJlblt0XTtlLnBhcmVudD1udWxsLGUuZGlzcGF0Y2hFdmVudCh6dCl9cmV0dXJuIHRoaXMuY2hpbGRyZW4ubGVuZ3RoPTAsdGhpc31hdHRhY2godCl7cmV0dXJuIHRoaXMudXBkYXRlV29ybGRNYXRyaXgoITAsITEpLG10LmNvcHkodGhpcy5tYXRyaXhXb3JsZCkuaW52ZXJ0KCksbnVsbCE9PXQucGFyZW50JiYodC5wYXJlbnQudXBkYXRlV29ybGRNYXRyaXgoITAsITEpLG10Lm11bHRpcGx5KHQucGFyZW50Lm1hdHJpeFdvcmxkKSksdC5hcHBseU1hdHJpeDQobXQpLHRoaXMuYWRkKHQpLHQudXBkYXRlV29ybGRNYXRyaXgoITEsITApLHRoaXN9Z2V0T2JqZWN0QnlJZCh0KXtyZXR1cm4gdGhpcy5nZXRPYmplY3RCeVByb3BlcnR5KCJpZCIsdCl9Z2V0T2JqZWN0QnlOYW1lKHQpe3JldHVybiB0aGlzLmdldE9iamVjdEJ5UHJvcGVydHkoIm5hbWUiLHQpfWdldE9iamVjdEJ5UHJvcGVydHkodCxlKXtpZih0aGlzW3RdPT09ZSlyZXR1cm4gdGhpcztmb3IobGV0IHM9MCxpPXRoaXMuY2hpbGRyZW4ubGVuZ3RoO3M8aTtzKyspe2NvbnN0IGk9dGhpcy5jaGlsZHJlbltzXS5nZXRPYmplY3RCeVByb3BlcnR5KHQsZSk7aWYodm9pZCAwIT09aSlyZXR1cm4gaX19Z2V0V29ybGRQb3NpdGlvbih0KXtyZXR1cm4gdGhpcy51cGRhdGVXb3JsZE1hdHJpeCghMCwhMSksdC5zZXRGcm9tTWF0cml4UG9zaXRpb24odGhpcy5tYXRyaXhXb3JsZCl9Z2V0V29ybGRRdWF0ZXJuaW9uKHQpe3JldHVybiB0aGlzLnVwZGF0ZVdvcmxkTWF0cml4KCEwLCExKSx0aGlzLm1hdHJpeFdvcmxkLmRlY29tcG9zZShwdCx0LHh0KSx0fWdldFdvcmxkU2NhbGUodCl7cmV0dXJuIHRoaXMudXBkYXRlV29ybGRNYXRyaXgoITAsITEpLHRoaXMubWF0cml4V29ybGQuZGVjb21wb3NlKHB0LGZ0LHQpLHR9Z2V0V29ybGREaXJlY3Rpb24odCl7dGhpcy51cGRhdGVXb3JsZE1hdHJpeCghMCwhMSk7Y29uc3QgZT10aGlzLm1hdHJpeFdvcmxkLmVsZW1lbnRzO3JldHVybiB0LnNldChlWzhdLGVbOV0sZVsxMF0pLm5vcm1hbGl6ZSgpfXJheWNhc3QoKXt9dHJhdmVyc2UodCl7dCh0aGlzKTtjb25zdCBlPXRoaXMuY2hpbGRyZW47Zm9yKGxldCBzPTAsaT1lLmxlbmd0aDtzPGk7cysrKWVbc10udHJhdmVyc2UodCl9dHJhdmVyc2VWaXNpYmxlKHQpe2lmKCExPT09dGhpcy52aXNpYmxlKXJldHVybjt0KHRoaXMpO2NvbnN0IGU9dGhpcy5jaGlsZHJlbjtmb3IobGV0IHM9MCxpPWUubGVuZ3RoO3M8aTtzKyspZVtzXS50cmF2ZXJzZVZpc2libGUodCl9dHJhdmVyc2VBbmNlc3RvcnModCl7Y29uc3QgZT10aGlzLnBhcmVudDtudWxsIT09ZSYmKHQoZSksZS50cmF2ZXJzZUFuY2VzdG9ycyh0KSl9dXBkYXRlTWF0cml4KCl7dGhpcy5tYXRyaXguY29tcG9zZSh0aGlzLnBvc2l0aW9uLHRoaXMucXVhdGVybmlvbix0aGlzLnNjYWxlKSx0aGlzLm1hdHJpeFdvcmxkTmVlZHNVcGRhdGU9ITB9dXBkYXRlTWF0cml4V29ybGQodCl7dGhpcy5tYXRyaXhBdXRvVXBkYXRlJiZ0aGlzLnVwZGF0ZU1hdHJpeCgpLCh0aGlzLm1hdHJpeFdvcmxkTmVlZHNVcGRhdGV8fHQpJiYobnVsbD09PXRoaXMucGFyZW50P3RoaXMubWF0cml4V29ybGQuY29weSh0aGlzLm1hdHJpeCk6dGhpcy5tYXRyaXhXb3JsZC5tdWx0aXBseU1hdHJpY2VzKHRoaXMucGFyZW50Lm1hdHJpeFdvcmxkLHRoaXMubWF0cml4KSx0aGlzLm1hdHJpeFdvcmxkTmVlZHNVcGRhdGU9ITEsdD0hMCk7Y29uc3QgZT10aGlzLmNoaWxkcmVuO2ZvcihsZXQgcz0wLGk9ZS5sZW5ndGg7czxpO3MrKyllW3NdLnVwZGF0ZU1hdHJpeFdvcmxkKHQpfXVwZGF0ZVdvcmxkTWF0cml4KHQsZSl7Y29uc3Qgcz10aGlzLnBhcmVudDtpZighMD09PXQmJm51bGwhPT1zJiZzLnVwZGF0ZVdvcmxkTWF0cml4KCEwLCExKSx0aGlzLm1hdHJpeEF1dG9VcGRhdGUmJnRoaXMudXBkYXRlTWF0cml4KCksbnVsbD09PXRoaXMucGFyZW50P3RoaXMubWF0cml4V29ybGQuY29weSh0aGlzLm1hdHJpeCk6dGhpcy5tYXRyaXhXb3JsZC5tdWx0aXBseU1hdHJpY2VzKHRoaXMucGFyZW50Lm1hdHJpeFdvcmxkLHRoaXMubWF0cml4KSwhMD09PWUpe2NvbnN0IHQ9dGhpcy5jaGlsZHJlbjtmb3IobGV0IGU9MCxzPXQubGVuZ3RoO2U8cztlKyspdFtlXS51cGRhdGVXb3JsZE1hdHJpeCghMSwhMCl9fXRvSlNPTih0KXtjb25zdCBlPXZvaWQgMD09PXR8fCJzdHJpbmciPT10eXBlb2YgdCxzPXt9O2UmJih0PXtnZW9tZXRyaWVzOnt9LG1hdGVyaWFsczp7fSx0ZXh0dXJlczp7fSxpbWFnZXM6e30sc2hhcGVzOnt9LHNrZWxldG9uczp7fSxhbmltYXRpb25zOnt9LG5vZGVzOnt9fSxzLm1ldGFkYXRhPXt2ZXJzaW9uOjQuNSx0eXBlOiJPYmplY3QiLGdlbmVyYXRvcjoiT2JqZWN0M0QudG9KU09OIn0pO2NvbnN0IGk9e307ZnVuY3Rpb24gcihlLHMpe3JldHVybiB2b2lkIDA9PT1lW3MudXVpZF0mJihlW3MudXVpZF09cy50b0pTT04odCkpLHMudXVpZH1pZihpLnV1aWQ9dGhpcy51dWlkLGkudHlwZT10aGlzLnR5cGUsIiIhPT10aGlzLm5hbWUmJihpLm5hbWU9dGhpcy5uYW1lKSwhMD09PXRoaXMuY2FzdFNoYWRvdyYmKGkuY2FzdFNoYWRvdz0hMCksITA9PT10aGlzLnJlY2VpdmVTaGFkb3cmJihpLnJlY2VpdmVTaGFkb3c9ITApLCExPT09dGhpcy52aXNpYmxlJiYoaS52aXNpYmxlPSExKSwhMT09PXRoaXMuZnJ1c3R1bUN1bGxlZCYmKGkuZnJ1c3R1bUN1bGxlZD0hMSksMCE9PXRoaXMucmVuZGVyT3JkZXImJihpLnJlbmRlck9yZGVyPXRoaXMucmVuZGVyT3JkZXIpLCJ7fSIhPT1KU09OLnN0cmluZ2lmeSh0aGlzLnVzZXJEYXRhKSYmKGkudXNlckRhdGE9dGhpcy51c2VyRGF0YSksaS5sYXllcnM9dGhpcy5sYXllcnMubWFzayxpLm1hdHJpeD10aGlzLm1hdHJpeC50b0FycmF5KCksITE9PT10aGlzLm1hdHJpeEF1dG9VcGRhdGUmJihpLm1hdHJpeEF1dG9VcGRhdGU9ITEpLHRoaXMuaXNJbnN0YW5jZWRNZXNoJiYoaS50eXBlPSJJbnN0YW5jZWRNZXNoIixpLmNvdW50PXRoaXMuY291bnQsaS5pbnN0YW5jZU1hdHJpeD10aGlzLmluc3RhbmNlTWF0cml4LnRvSlNPTigpLG51bGwhPT10aGlzLmluc3RhbmNlQ29sb3ImJihpLmluc3RhbmNlQ29sb3I9dGhpcy5pbnN0YW5jZUNvbG9yLnRvSlNPTigpKSksdGhpcy5pc1NjZW5lKXRoaXMuYmFja2dyb3VuZCYmKHRoaXMuYmFja2dyb3VuZC5pc0NvbG9yP2kuYmFja2dyb3VuZD10aGlzLmJhY2tncm91bmQudG9KU09OKCk6dGhpcy5iYWNrZ3JvdW5kLmlzVGV4dHVyZSYmKGkuYmFja2dyb3VuZD10aGlzLmJhY2tncm91bmQudG9KU09OKHQpLnV1aWQpKSx0aGlzLmVudmlyb25tZW50JiZ0aGlzLmVudmlyb25tZW50LmlzVGV4dHVyZSYmKGkuZW52aXJvbm1lbnQ9dGhpcy5lbnZpcm9ubWVudC50b0pTT04odCkudXVpZCk7ZWxzZSBpZih0aGlzLmlzTWVzaHx8dGhpcy5pc0xpbmV8fHRoaXMuaXNQb2ludHMpe2kuZ2VvbWV0cnk9cih0Lmdlb21ldHJpZXMsdGhpcy5nZW9tZXRyeSk7Y29uc3QgZT10aGlzLmdlb21ldHJ5LnBhcmFtZXRlcnM7aWYodm9pZCAwIT09ZSYmdm9pZCAwIT09ZS5zaGFwZXMpe2NvbnN0IHM9ZS5zaGFwZXM7aWYoQXJyYXkuaXNBcnJheShzKSlmb3IobGV0IGU9MCxpPXMubGVuZ3RoO2U8aTtlKyspe2NvbnN0IGk9c1tlXTtyKHQuc2hhcGVzLGkpfWVsc2Ugcih0LnNoYXBlcyxzKX19aWYodGhpcy5pc1NraW5uZWRNZXNoJiYoaS5iaW5kTW9kZT10aGlzLmJpbmRNb2RlLGkuYmluZE1hdHJpeD10aGlzLmJpbmRNYXRyaXgudG9BcnJheSgpLHZvaWQgMCE9PXRoaXMuc2tlbGV0b24mJihyKHQuc2tlbGV0b25zLHRoaXMuc2tlbGV0b24pLGkuc2tlbGV0b249dGhpcy5za2VsZXRvbi51dWlkKSksdm9pZCAwIT09dGhpcy5tYXRlcmlhbClpZihBcnJheS5pc0FycmF5KHRoaXMubWF0ZXJpYWwpKXtjb25zdCBlPVtdO2ZvcihsZXQgcz0wLGk9dGhpcy5tYXRlcmlhbC5sZW5ndGg7czxpO3MrKyllLnB1c2gocih0Lm1hdGVyaWFscyx0aGlzLm1hdGVyaWFsW3NdKSk7aS5tYXRlcmlhbD1lfWVsc2UgaS5tYXRlcmlhbD1yKHQubWF0ZXJpYWxzLHRoaXMubWF0ZXJpYWwpO2lmKHRoaXMuY2hpbGRyZW4ubGVuZ3RoPjApe2kuY2hpbGRyZW49W107Zm9yKGxldCBlPTA7ZTx0aGlzLmNoaWxkcmVuLmxlbmd0aDtlKyspaS5jaGlsZHJlbi5wdXNoKHRoaXMuY2hpbGRyZW5bZV0udG9KU09OKHQpLm9iamVjdCl9aWYodGhpcy5hbmltYXRpb25zLmxlbmd0aD4wKXtpLmFuaW1hdGlvbnM9W107Zm9yKGxldCBlPTA7ZTx0aGlzLmFuaW1hdGlvbnMubGVuZ3RoO2UrKyl7Y29uc3Qgcz10aGlzLmFuaW1hdGlvbnNbZV07aS5hbmltYXRpb25zLnB1c2gocih0LmFuaW1hdGlvbnMscykpfX1pZihlKXtjb25zdCBlPW4odC5nZW9tZXRyaWVzKSxpPW4odC5tYXRlcmlhbHMpLHI9bih0LnRleHR1cmVzKSxvPW4odC5pbWFnZXMpLGE9bih0LnNoYXBlcyksaD1uKHQuc2tlbGV0b25zKSxsPW4odC5hbmltYXRpb25zKSxjPW4odC5ub2Rlcyk7ZS5sZW5ndGg+MCYmKHMuZ2VvbWV0cmllcz1lKSxpLmxlbmd0aD4wJiYocy5tYXRlcmlhbHM9aSksci5sZW5ndGg+MCYmKHMudGV4dHVyZXM9ciksby5sZW5ndGg+MCYmKHMuaW1hZ2VzPW8pLGEubGVuZ3RoPjAmJihzLnNoYXBlcz1hKSxoLmxlbmd0aD4wJiYocy5za2VsZXRvbnM9aCksbC5sZW5ndGg+MCYmKHMuYW5pbWF0aW9ucz1sKSxjLmxlbmd0aD4wJiYocy5ub2Rlcz1jKX1yZXR1cm4gcy5vYmplY3Q9aSxzO2Z1bmN0aW9uIG4odCl7Y29uc3QgZT1bXTtmb3IoY29uc3QgcyBpbiB0KXtjb25zdCBpPXRbc107ZGVsZXRlIGkubWV0YWRhdGEsZS5wdXNoKGkpfXJldHVybiBlfX1jbG9uZSh0KXtyZXR1cm4obmV3IHRoaXMuY29uc3RydWN0b3IpLmNvcHkodGhpcyx0KX1jb3B5KHQpe2xldCBlPSEoYXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0pfHxhcmd1bWVudHNbMV07aWYodGhpcy5uYW1lPXQubmFtZSx0aGlzLnVwLmNvcHkodC51cCksdGhpcy5wb3NpdGlvbi5jb3B5KHQucG9zaXRpb24pLHRoaXMucm90YXRpb24ub3JkZXI9dC5yb3RhdGlvbi5vcmRlcix0aGlzLnF1YXRlcm5pb24uY29weSh0LnF1YXRlcm5pb24pLHRoaXMuc2NhbGUuY29weSh0LnNjYWxlKSx0aGlzLm1hdHJpeC5jb3B5KHQubWF0cml4KSx0aGlzLm1hdHJpeFdvcmxkLmNvcHkodC5tYXRyaXhXb3JsZCksdGhpcy5tYXRyaXhBdXRvVXBkYXRlPXQubWF0cml4QXV0b1VwZGF0ZSx0aGlzLm1hdHJpeFdvcmxkTmVlZHNVcGRhdGU9dC5tYXRyaXhXb3JsZE5lZWRzVXBkYXRlLHRoaXMubGF5ZXJzLm1hc2s9dC5sYXllcnMubWFzayx0aGlzLnZpc2libGU9dC52aXNpYmxlLHRoaXMuY2FzdFNoYWRvdz10LmNhc3RTaGFkb3csdGhpcy5yZWNlaXZlU2hhZG93PXQucmVjZWl2ZVNoYWRvdyx0aGlzLmZydXN0dW1DdWxsZWQ9dC5mcnVzdHVtQ3VsbGVkLHRoaXMucmVuZGVyT3JkZXI9dC5yZW5kZXJPcmRlcix0aGlzLnVzZXJEYXRhPUpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodC51c2VyRGF0YSkpLCEwPT09ZSlmb3IobGV0IGU9MDtlPHQuY2hpbGRyZW4ubGVuZ3RoO2UrKyl7Y29uc3Qgcz10LmNoaWxkcmVuW2VdO3RoaXMuYWRkKHMuY2xvbmUoKSl9cmV0dXJuIHRoaXN9fXZ0LkRlZmF1bHRVcD1uZXcgRSgwLDEsMCksdnQuRGVmYXVsdE1hdHJpeEF1dG9VcGRhdGU9ITA7Y29uc3QgX3Q9bmV3IEUsQXQ9bmV3IEUsU3Q9bmV3IEUsQnQ9bmV3IEUsVHQ9bmV3IEUsRXQ9bmV3IEUsa3Q9bmV3IEUsUHQ9bmV3IEUsQ3Q9bmV3IEUsRnQ9bmV3IEU7Y2xhc3MgVnR7Y29uc3RydWN0b3IoKXtsZXQgdD1hcmd1bWVudHMubGVuZ3RoPjAmJnZvaWQgMCE9PWFyZ3VtZW50c1swXT9hcmd1bWVudHNbMF06bmV3IEUsZT1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06bmV3IEUscz1hcmd1bWVudHMubGVuZ3RoPjImJnZvaWQgMCE9PWFyZ3VtZW50c1syXT9hcmd1bWVudHNbMl06bmV3IEU7dGhpcy5hPXQsdGhpcy5iPWUsdGhpcy5jPXN9c3RhdGljIGdldE5vcm1hbCh0LGUscyxpKXtpLnN1YlZlY3RvcnMocyxlKSxfdC5zdWJWZWN0b3JzKHQsZSksaS5jcm9zcyhfdCk7Y29uc3Qgcj1pLmxlbmd0aFNxKCk7cmV0dXJuIHI+MD9pLm11bHRpcGx5U2NhbGFyKDEvTWF0aC5zcXJ0KHIpKTppLnNldCgwLDAsMCl9c3RhdGljIGdldEJhcnljb29yZCh0LGUscyxpLHIpe190LnN1YlZlY3RvcnMoaSxlKSxBdC5zdWJWZWN0b3JzKHMsZSksU3Quc3ViVmVjdG9ycyh0LGUpO2NvbnN0IG49X3QuZG90KF90KSxvPV90LmRvdChBdCksYT1fdC5kb3QoU3QpLGg9QXQuZG90KEF0KSxsPUF0LmRvdChTdCksYz1uKmgtbypvO2lmKDA9PT1jKXJldHVybiByLnNldCgtMiwtMSwtMSk7Y29uc3QgdT0xL2MsZD0oaCphLW8qbCkqdSxtPShuKmwtbyphKSp1O3JldHVybiByLnNldCgxLWQtbSxtLGQpfXN0YXRpYyBjb250YWluc1BvaW50KHQsZSxzLGkpe3JldHVybiB0aGlzLmdldEJhcnljb29yZCh0LGUscyxpLEJ0KSxCdC54Pj0wJiZCdC55Pj0wJiZCdC54K0J0Lnk8PTF9c3RhdGljIGdldFVWKHQsZSxzLGkscixuLG8sYSl7cmV0dXJuIHRoaXMuZ2V0QmFyeWNvb3JkKHQsZSxzLGksQnQpLGEuc2V0KDAsMCksYS5hZGRTY2FsZWRWZWN0b3IocixCdC54KSxhLmFkZFNjYWxlZFZlY3RvcihuLEJ0LnkpLGEuYWRkU2NhbGVkVmVjdG9yKG8sQnQueiksYX1zdGF0aWMgaXNGcm9udEZhY2luZyh0LGUscyxpKXtyZXR1cm4gX3Quc3ViVmVjdG9ycyhzLGUpLEF0LnN1YlZlY3RvcnModCxlKSxfdC5jcm9zcyhBdCkuZG90KGkpPDB9c2V0KHQsZSxzKXtyZXR1cm4gdGhpcy5hLmNvcHkodCksdGhpcy5iLmNvcHkoZSksdGhpcy5jLmNvcHkocyksdGhpc31zZXRGcm9tUG9pbnRzQW5kSW5kaWNlcyh0LGUscyxpKXtyZXR1cm4gdGhpcy5hLmNvcHkodFtlXSksdGhpcy5iLmNvcHkodFtzXSksdGhpcy5jLmNvcHkodFtpXSksdGhpc31zZXRGcm9tQXR0cmlidXRlQW5kSW5kaWNlcyh0LGUscyxpKXtyZXR1cm4gdGhpcy5hLmZyb21CdWZmZXJBdHRyaWJ1dGUodCxlKSx0aGlzLmIuZnJvbUJ1ZmZlckF0dHJpYnV0ZSh0LHMpLHRoaXMuYy5mcm9tQnVmZmVyQXR0cmlidXRlKHQsaSksdGhpc31jbG9uZSgpe3JldHVybihuZXcgdGhpcy5jb25zdHJ1Y3RvcikuY29weSh0aGlzKX1jb3B5KHQpe3JldHVybiB0aGlzLmEuY29weSh0LmEpLHRoaXMuYi5jb3B5KHQuYiksdGhpcy5jLmNvcHkodC5jKSx0aGlzfWdldEFyZWEoKXtyZXR1cm4gX3Quc3ViVmVjdG9ycyh0aGlzLmMsdGhpcy5iKSxBdC5zdWJWZWN0b3JzKHRoaXMuYSx0aGlzLmIpLC41Kl90LmNyb3NzKEF0KS5sZW5ndGgoKX1nZXRNaWRwb2ludCh0KXtyZXR1cm4gdC5hZGRWZWN0b3JzKHRoaXMuYSx0aGlzLmIpLmFkZCh0aGlzLmMpLm11bHRpcGx5U2NhbGFyKDEvMyl9Z2V0Tm9ybWFsKHQpe3JldHVybiBWdC5nZXROb3JtYWwodGhpcy5hLHRoaXMuYix0aGlzLmMsdCl9Z2V0UGxhbmUodCl7cmV0dXJuIHQuc2V0RnJvbUNvcGxhbmFyUG9pbnRzKHRoaXMuYSx0aGlzLmIsdGhpcy5jKX1nZXRCYXJ5Y29vcmQodCxlKXtyZXR1cm4gVnQuZ2V0QmFyeWNvb3JkKHQsdGhpcy5hLHRoaXMuYix0aGlzLmMsZSl9Z2V0VVYodCxlLHMsaSxyKXtyZXR1cm4gVnQuZ2V0VVYodCx0aGlzLmEsdGhpcy5iLHRoaXMuYyxlLHMsaSxyKX1jb250YWluc1BvaW50KHQpe3JldHVybiBWdC5jb250YWluc1BvaW50KHQsdGhpcy5hLHRoaXMuYix0aGlzLmMpfWlzRnJvbnRGYWNpbmcodCl7cmV0dXJuIFZ0LmlzRnJvbnRGYWNpbmcodGhpcy5hLHRoaXMuYix0aGlzLmMsdCl9aW50ZXJzZWN0c0JveCh0KXtyZXR1cm4gdC5pbnRlcnNlY3RzVHJpYW5nbGUodGhpcyl9Y2xvc2VzdFBvaW50VG9Qb2ludCh0LGUpe2NvbnN0IHM9dGhpcy5hLGk9dGhpcy5iLHI9dGhpcy5jO2xldCBuLG87VHQuc3ViVmVjdG9ycyhpLHMpLEV0LnN1YlZlY3RvcnMocixzKSxQdC5zdWJWZWN0b3JzKHQscyk7Y29uc3QgYT1UdC5kb3QoUHQpLGg9RXQuZG90KFB0KTtpZihhPD0wJiZoPD0wKXJldHVybiBlLmNvcHkocyk7Q3Quc3ViVmVjdG9ycyh0LGkpO2NvbnN0IGw9VHQuZG90KEN0KSxjPUV0LmRvdChDdCk7aWYobD49MCYmYzw9bClyZXR1cm4gZS5jb3B5KGkpO2NvbnN0IHU9YSpjLWwqaDtpZih1PD0wJiZhPj0wJiZsPD0wKXJldHVybiBuPWEvKGEtbCksZS5jb3B5KHMpLmFkZFNjYWxlZFZlY3RvcihUdCxuKTtGdC5zdWJWZWN0b3JzKHQscik7Y29uc3QgZD1UdC5kb3QoRnQpLG09RXQuZG90KEZ0KTtpZihtPj0wJiZkPD1tKXJldHVybiBlLmNvcHkocik7Y29uc3QgeT1kKmgtYSptO2lmKHk8PTAmJmg+PTAmJm08PTApcmV0dXJuIG89aC8oaC1tKSxlLmNvcHkocykuYWRkU2NhbGVkVmVjdG9yKEV0LG8pO2NvbnN0IHA9bCptLWQqYztpZihwPD0wJiZjLWw+PTAmJmQtbT49MClyZXR1cm4ga3Quc3ViVmVjdG9ycyhyLGkpLG89KGMtbCkvKGMtbCsoZC1tKSksZS5jb3B5KGkpLmFkZFNjYWxlZFZlY3RvcihrdCxvKTtjb25zdCB4PTEvKHAreSt1KTtyZXR1cm4gbj15Kngsbz11KngsZS5jb3B5KHMpLmFkZFNjYWxlZFZlY3RvcihUdCxuKS5hZGRTY2FsZWRWZWN0b3IoRXQsbyl9ZXF1YWxzKHQpe3JldHVybiB0LmEuZXF1YWxzKHRoaXMuYSkmJnQuYi5lcXVhbHModGhpcy5iKSYmdC5jLmVxdWFscyh0aGlzLmMpfX1jb25zdCBSdD1uZXcgRSxxdD1uZXcgaDtjbGFzcyBVdHtjb25zdHJ1Y3Rvcih0LGUscyl7aWYoQXJyYXkuaXNBcnJheSh0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJUSFJFRS5CdWZmZXJBdHRyaWJ1dGU6IGFycmF5IHNob3VsZCBiZSBhIFR5cGVkIEFycmF5LiIpO3RoaXMuaXNCdWZmZXJBdHRyaWJ1dGU9ITAsdGhpcy5uYW1lPSIiLHRoaXMuYXJyYXk9dCx0aGlzLml0ZW1TaXplPWUsdGhpcy5jb3VudD12b2lkIDAhPT10P3QubGVuZ3RoL2U6MCx0aGlzLm5vcm1hbGl6ZWQ9ITA9PT1zLHRoaXMudXNhZ2U9MzUwNDQsdGhpcy51cGRhdGVSYW5nZT17b2Zmc2V0OjAsY291bnQ6LTF9LHRoaXMudmVyc2lvbj0wfW9uVXBsb2FkQ2FsbGJhY2soKXt9c2V0IG5lZWRzVXBkYXRlKHQpeyEwPT09dCYmdGhpcy52ZXJzaW9uKyt9c2V0VXNhZ2UodCl7cmV0dXJuIHRoaXMudXNhZ2U9dCx0aGlzfWNvcHkodCl7cmV0dXJuIHRoaXMubmFtZT10Lm5hbWUsdGhpcy5hcnJheT1uZXcgdC5hcnJheS5jb25zdHJ1Y3Rvcih0LmFycmF5KSx0aGlzLml0ZW1TaXplPXQuaXRlbVNpemUsdGhpcy5jb3VudD10LmNvdW50LHRoaXMubm9ybWFsaXplZD10Lm5vcm1hbGl6ZWQsdGhpcy51c2FnZT10LnVzYWdlLHRoaXN9Y29weUF0KHQsZSxzKXt0Kj10aGlzLml0ZW1TaXplLHMqPWUuaXRlbVNpemU7Zm9yKGxldCBpPTAscj10aGlzLml0ZW1TaXplO2k8cjtpKyspdGhpcy5hcnJheVt0K2ldPWUuYXJyYXlbcytpXTtyZXR1cm4gdGhpc31jb3B5QXJyYXkodCl7cmV0dXJuIHRoaXMuYXJyYXkuc2V0KHQpLHRoaXN9Y29weUNvbG9yc0FycmF5KHQpe2NvbnN0IGU9dGhpcy5hcnJheTtsZXQgcz0wO2ZvcihsZXQgaT0wLHI9dC5sZW5ndGg7aTxyO2krKyl7bGV0IHI9dFtpXTt2b2lkIDA9PT1yJiYoY29uc29sZS53YXJuKCJUSFJFRS5CdWZmZXJBdHRyaWJ1dGUuY29weUNvbG9yc0FycmF5KCk6IGNvbG9yIGlzIHVuZGVmaW5lZCIsaSkscj1uZXcgTSksZVtzKytdPXIucixlW3MrK109ci5nLGVbcysrXT1yLmJ9cmV0dXJuIHRoaXN9Y29weVZlY3RvcjJzQXJyYXkodCl7Y29uc3QgZT10aGlzLmFycmF5O2xldCBzPTA7Zm9yKGxldCBpPTAscj10Lmxlbmd0aDtpPHI7aSsrKXtsZXQgcj10W2ldO3ZvaWQgMD09PXImJihjb25zb2xlLndhcm4oIlRIUkVFLkJ1ZmZlckF0dHJpYnV0ZS5jb3B5VmVjdG9yMnNBcnJheSgpOiB2ZWN0b3IgaXMgdW5kZWZpbmVkIixpKSxyPW5ldyBoKSxlW3MrK109ci54LGVbcysrXT1yLnl9cmV0dXJuIHRoaXN9Y29weVZlY3RvcjNzQXJyYXkodCl7Y29uc3QgZT10aGlzLmFycmF5O2xldCBzPTA7Zm9yKGxldCBpPTAscj10Lmxlbmd0aDtpPHI7aSsrKXtsZXQgcj10W2ldO3ZvaWQgMD09PXImJihjb25zb2xlLndhcm4oIlRIUkVFLkJ1ZmZlckF0dHJpYnV0ZS5jb3B5VmVjdG9yM3NBcnJheSgpOiB2ZWN0b3IgaXMgdW5kZWZpbmVkIixpKSxyPW5ldyBFKSxlW3MrK109ci54LGVbcysrXT1yLnksZVtzKytdPXIuen1yZXR1cm4gdGhpc31jb3B5VmVjdG9yNHNBcnJheSh0KXtjb25zdCBlPXRoaXMuYXJyYXk7bGV0IHM9MDtmb3IobGV0IGk9MCxyPXQubGVuZ3RoO2k8cjtpKyspe2xldCByPXRbaV07dm9pZCAwPT09ciYmKGNvbnNvbGUud2FybigiVEhSRUUuQnVmZmVyQXR0cmlidXRlLmNvcHlWZWN0b3I0c0FycmF5KCk6IHZlY3RvciBpcyB1bmRlZmluZWQiLGkpLHI9bmV3IEIpLGVbcysrXT1yLngsZVtzKytdPXIueSxlW3MrK109ci56LGVbcysrXT1yLnd9cmV0dXJuIHRoaXN9YXBwbHlNYXRyaXgzKHQpe2lmKDI9PT10aGlzLml0ZW1TaXplKWZvcihsZXQgZT0wLHM9dGhpcy5jb3VudDtlPHM7ZSsrKXF0LmZyb21CdWZmZXJBdHRyaWJ1dGUodGhpcyxlKSxxdC5hcHBseU1hdHJpeDModCksdGhpcy5zZXRYWShlLHF0LngscXQueSk7ZWxzZSBpZigzPT09dGhpcy5pdGVtU2l6ZSlmb3IobGV0IGU9MCxzPXRoaXMuY291bnQ7ZTxzO2UrKylSdC5mcm9tQnVmZmVyQXR0cmlidXRlKHRoaXMsZSksUnQuYXBwbHlNYXRyaXgzKHQpLHRoaXMuc2V0WFlaKGUsUnQueCxSdC55LFJ0LnopO3JldHVybiB0aGlzfWFwcGx5TWF0cml4NCh0KXtmb3IobGV0IGU9MCxzPXRoaXMuY291bnQ7ZTxzO2UrKylSdC5mcm9tQnVmZmVyQXR0cmlidXRlKHRoaXMsZSksUnQuYXBwbHlNYXRyaXg0KHQpLHRoaXMuc2V0WFlaKGUsUnQueCxSdC55LFJ0LnopO3JldHVybiB0aGlzfWFwcGx5Tm9ybWFsTWF0cml4KHQpe2ZvcihsZXQgZT0wLHM9dGhpcy5jb3VudDtlPHM7ZSsrKVJ0LmZyb21CdWZmZXJBdHRyaWJ1dGUodGhpcyxlKSxSdC5hcHBseU5vcm1hbE1hdHJpeCh0KSx0aGlzLnNldFhZWihlLFJ0LngsUnQueSxSdC56KTtyZXR1cm4gdGhpc310cmFuc2Zvcm1EaXJlY3Rpb24odCl7Zm9yKGxldCBlPTAscz10aGlzLmNvdW50O2U8cztlKyspUnQuZnJvbUJ1ZmZlckF0dHJpYnV0ZSh0aGlzLGUpLFJ0LnRyYW5zZm9ybURpcmVjdGlvbih0KSx0aGlzLnNldFhZWihlLFJ0LngsUnQueSxSdC56KTtyZXR1cm4gdGhpc31zZXQodCl7bGV0IGU9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOjA7cmV0dXJuIHRoaXMuYXJyYXkuc2V0KHQsZSksdGhpc31nZXRYKHQpe3JldHVybiB0aGlzLmFycmF5W3QqdGhpcy5pdGVtU2l6ZV19c2V0WCh0LGUpe3JldHVybiB0aGlzLmFycmF5W3QqdGhpcy5pdGVtU2l6ZV09ZSx0aGlzfWdldFkodCl7cmV0dXJuIHRoaXMuYXJyYXlbdCp0aGlzLml0ZW1TaXplKzFdfXNldFkodCxlKXtyZXR1cm4gdGhpcy5hcnJheVt0KnRoaXMuaXRlbVNpemUrMV09ZSx0aGlzfWdldFoodCl7cmV0dXJuIHRoaXMuYXJyYXlbdCp0aGlzLml0ZW1TaXplKzJdfXNldFoodCxlKXtyZXR1cm4gdGhpcy5hcnJheVt0KnRoaXMuaXRlbVNpemUrMl09ZSx0aGlzfWdldFcodCl7cmV0dXJuIHRoaXMuYXJyYXlbdCp0aGlzLml0ZW1TaXplKzNdfXNldFcodCxlKXtyZXR1cm4gdGhpcy5hcnJheVt0KnRoaXMuaXRlbVNpemUrM109ZSx0aGlzfXNldFhZKHQsZSxzKXtyZXR1cm4gdCo9dGhpcy5pdGVtU2l6ZSx0aGlzLmFycmF5W3QrMF09ZSx0aGlzLmFycmF5W3QrMV09cyx0aGlzfXNldFhZWih0LGUscyxpKXtyZXR1cm4gdCo9dGhpcy5pdGVtU2l6ZSx0aGlzLmFycmF5W3QrMF09ZSx0aGlzLmFycmF5W3QrMV09cyx0aGlzLmFycmF5W3QrMl09aSx0aGlzfXNldFhZWlcodCxlLHMsaSxyKXtyZXR1cm4gdCo9dGhpcy5pdGVtU2l6ZSx0aGlzLmFycmF5W3QrMF09ZSx0aGlzLmFycmF5W3QrMV09cyx0aGlzLmFycmF5W3QrMl09aSx0aGlzLmFycmF5W3QrM109cix0aGlzfW9uVXBsb2FkKHQpe3JldHVybiB0aGlzLm9uVXBsb2FkQ2FsbGJhY2s9dCx0aGlzfWNsb25lKCl7cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKHRoaXMuYXJyYXksdGhpcy5pdGVtU2l6ZSkuY29weSh0aGlzKX10b0pTT04oKXtjb25zdCB0PXtpdGVtU2l6ZTp0aGlzLml0ZW1TaXplLHR5cGU6dGhpcy5hcnJheS5jb25zdHJ1Y3Rvci5uYW1lLGFycmF5OkFycmF5LmZyb20odGhpcy5hcnJheSksbm9ybWFsaXplZDp0aGlzLm5vcm1hbGl6ZWR9O3JldHVybiIiIT09dGhpcy5uYW1lJiYodC5uYW1lPXRoaXMubmFtZSksMzUwNDQhPT10aGlzLnVzYWdlJiYodC51c2FnZT10aGlzLnVzYWdlKSwwPT09dGhpcy51cGRhdGVSYW5nZS5vZmZzZXQmJi0xPT09dGhpcy51cGRhdGVSYW5nZS5jb3VudHx8KHQudXBkYXRlUmFuZ2U9dGhpcy51cGRhdGVSYW5nZSksdH19Y2xhc3MgT3QgZXh0ZW5kcyBVdHtjb25zdHJ1Y3Rvcih0LGUscyl7c3VwZXIobmV3IFVpbnQxNkFycmF5KHQpLGUscyl9fWNsYXNzIEh0IGV4dGVuZHMgVXR7Y29uc3RydWN0b3IodCxlLHMpe3N1cGVyKG5ldyBVaW50MzJBcnJheSh0KSxlLHMpfX1jbGFzcyBJdCBleHRlbmRzIFV0e2NvbnN0cnVjdG9yKHQsZSxzKXtzdXBlcihuZXcgRmxvYXQzMkFycmF5KHQpLGUscyl9fWxldCBOdD0wO2NvbnN0IEx0PW5ldyAkLFd0PW5ldyB2dCxYdD1uZXcgRSxEdD1uZXcgQyxZdD1uZXcgQyxadD1uZXcgRTtjbGFzcyBHdCBleHRlbmRzIGl7Y29uc3RydWN0b3IoKXtzdXBlcigpLHRoaXMuaXNCdWZmZXJHZW9tZXRyeT0hMCxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiaWQiLHt2YWx1ZTpOdCsrfSksdGhpcy51dWlkPW4oKSx0aGlzLm5hbWU9IiIsdGhpcy50eXBlPSJCdWZmZXJHZW9tZXRyeSIsdGhpcy5pbmRleD1udWxsLHRoaXMuYXR0cmlidXRlcz17fSx0aGlzLm1vcnBoQXR0cmlidXRlcz17fSx0aGlzLm1vcnBoVGFyZ2V0c1JlbGF0aXZlPSExLHRoaXMuZ3JvdXBzPVtdLHRoaXMuYm91bmRpbmdCb3g9bnVsbCx0aGlzLmJvdW5kaW5nU3BoZXJlPW51bGwsdGhpcy5kcmF3UmFuZ2U9e3N0YXJ0OjAsY291bnQ6MS8wfSx0aGlzLnVzZXJEYXRhPXt9fWdldEluZGV4KCl7cmV0dXJuIHRoaXMuaW5kZXh9c2V0SW5kZXgodCl7cmV0dXJuIEFycmF5LmlzQXJyYXkodCk/dGhpcy5pbmRleD1uZXcoZnVuY3Rpb24odCl7Zm9yKGxldCBlPXQubGVuZ3RoLTE7ZT49MDstLWUpaWYodFtlXT42NTUzNSlyZXR1cm4hMDtyZXR1cm4hMX0odCk/SHQ6T3QpKHQsMSk6dGhpcy5pbmRleD10LHRoaXN9Z2V0QXR0cmlidXRlKHQpe3JldHVybiB0aGlzLmF0dHJpYnV0ZXNbdF19c2V0QXR0cmlidXRlKHQsZSl7cmV0dXJuIHRoaXMuYXR0cmlidXRlc1t0XT1lLHRoaXN9ZGVsZXRlQXR0cmlidXRlKHQpe3JldHVybiBkZWxldGUgdGhpcy5hdHRyaWJ1dGVzW3RdLHRoaXN9aGFzQXR0cmlidXRlKHQpe3JldHVybiB2b2lkIDAhPT10aGlzLmF0dHJpYnV0ZXNbdF19YWRkR3JvdXAodCxlKXtsZXQgcz1hcmd1bWVudHMubGVuZ3RoPjImJnZvaWQgMCE9PWFyZ3VtZW50c1syXT9hcmd1bWVudHNbMl06MDt0aGlzLmdyb3Vwcy5wdXNoKHtzdGFydDp0LGNvdW50OmUsbWF0ZXJpYWxJbmRleDpzfSl9Y2xlYXJHcm91cHMoKXt0aGlzLmdyb3Vwcz1bXX1zZXREcmF3UmFuZ2UodCxlKXt0aGlzLmRyYXdSYW5nZS5zdGFydD10LHRoaXMuZHJhd1JhbmdlLmNvdW50PWV9YXBwbHlNYXRyaXg0KHQpe2NvbnN0IGU9dGhpcy5hdHRyaWJ1dGVzLnBvc2l0aW9uO3ZvaWQgMCE9PWUmJihlLmFwcGx5TWF0cml4NCh0KSxlLm5lZWRzVXBkYXRlPSEwKTtjb25zdCBzPXRoaXMuYXR0cmlidXRlcy5ub3JtYWw7aWYodm9pZCAwIT09cyl7Y29uc3QgZT0obmV3IGwpLmdldE5vcm1hbE1hdHJpeCh0KTtzLmFwcGx5Tm9ybWFsTWF0cml4KGUpLHMubmVlZHNVcGRhdGU9ITB9Y29uc3QgaT10aGlzLmF0dHJpYnV0ZXMudGFuZ2VudDtyZXR1cm4gdm9pZCAwIT09aSYmKGkudHJhbnNmb3JtRGlyZWN0aW9uKHQpLGkubmVlZHNVcGRhdGU9ITApLG51bGwhPT10aGlzLmJvdW5kaW5nQm94JiZ0aGlzLmNvbXB1dGVCb3VuZGluZ0JveCgpLG51bGwhPT10aGlzLmJvdW5kaW5nU3BoZXJlJiZ0aGlzLmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpLHRoaXN9YXBwbHlRdWF0ZXJuaW9uKHQpe3JldHVybiBMdC5tYWtlUm90YXRpb25Gcm9tUXVhdGVybmlvbih0KSx0aGlzLmFwcGx5TWF0cml4NChMdCksdGhpc31yb3RhdGVYKHQpe3JldHVybiBMdC5tYWtlUm90YXRpb25YKHQpLHRoaXMuYXBwbHlNYXRyaXg0KEx0KSx0aGlzfXJvdGF0ZVkodCl7cmV0dXJuIEx0Lm1ha2VSb3RhdGlvblkodCksdGhpcy5hcHBseU1hdHJpeDQoTHQpLHRoaXN9cm90YXRlWih0KXtyZXR1cm4gTHQubWFrZVJvdGF0aW9uWih0KSx0aGlzLmFwcGx5TWF0cml4NChMdCksdGhpc310cmFuc2xhdGUodCxlLHMpe3JldHVybiBMdC5tYWtlVHJhbnNsYXRpb24odCxlLHMpLHRoaXMuYXBwbHlNYXRyaXg0KEx0KSx0aGlzfXNjYWxlKHQsZSxzKXtyZXR1cm4gTHQubWFrZVNjYWxlKHQsZSxzKSx0aGlzLmFwcGx5TWF0cml4NChMdCksdGhpc31sb29rQXQodCl7cmV0dXJuIFd0Lmxvb2tBdCh0KSxXdC51cGRhdGVNYXRyaXgoKSx0aGlzLmFwcGx5TWF0cml4NChXdC5tYXRyaXgpLHRoaXN9Y2VudGVyKCl7cmV0dXJuIHRoaXMuY29tcHV0ZUJvdW5kaW5nQm94KCksdGhpcy5ib3VuZGluZ0JveC5nZXRDZW50ZXIoWHQpLm5lZ2F0ZSgpLHRoaXMudHJhbnNsYXRlKFh0LngsWHQueSxYdC56KSx0aGlzfXNldEZyb21Qb2ludHModCl7Y29uc3QgZT1bXTtmb3IobGV0IHM9MCxpPXQubGVuZ3RoO3M8aTtzKyspe2NvbnN0IGk9dFtzXTtlLnB1c2goaS54LGkueSxpLnp8fDApfXJldHVybiB0aGlzLnNldEF0dHJpYnV0ZSgicG9zaXRpb24iLG5ldyBJdChlLDMpKSx0aGlzfWNvbXB1dGVCb3VuZGluZ0JveCgpe251bGw9PT10aGlzLmJvdW5kaW5nQm94JiYodGhpcy5ib3VuZGluZ0JveD1uZXcgQyk7Y29uc3QgdD10aGlzLmF0dHJpYnV0ZXMucG9zaXRpb24sZT10aGlzLm1vcnBoQXR0cmlidXRlcy5wb3NpdGlvbjtpZih0JiZ0LmlzR0xCdWZmZXJBdHRyaWJ1dGUpcmV0dXJuIGNvbnNvbGUuZXJyb3IoJ1RIUkVFLkJ1ZmZlckdlb21ldHJ5LmNvbXB1dGVCb3VuZGluZ0JveCgpOiBHTEJ1ZmZlckF0dHJpYnV0ZSByZXF1aXJlcyBhIG1hbnVhbCBib3VuZGluZyBib3guIEFsdGVybmF0aXZlbHkgc2V0ICJtZXNoLmZydXN0dW1DdWxsZWQiIHRvICJmYWxzZSIuJyx0aGlzKSx2b2lkIHRoaXMuYm91bmRpbmdCb3guc2V0KG5ldyBFKC0xLzAsLTEvMCwtMS8wKSxuZXcgRSgxLzAsMS8wLDEvMCkpO2lmKHZvaWQgMCE9PXQpe2lmKHRoaXMuYm91bmRpbmdCb3guc2V0RnJvbUJ1ZmZlckF0dHJpYnV0ZSh0KSxlKWZvcihsZXQgdD0wLHM9ZS5sZW5ndGg7dDxzO3QrKyl7Y29uc3Qgcz1lW3RdO0R0LnNldEZyb21CdWZmZXJBdHRyaWJ1dGUocyksdGhpcy5tb3JwaFRhcmdldHNSZWxhdGl2ZT8oWnQuYWRkVmVjdG9ycyh0aGlzLmJvdW5kaW5nQm94Lm1pbixEdC5taW4pLHRoaXMuYm91bmRpbmdCb3guZXhwYW5kQnlQb2ludChadCksWnQuYWRkVmVjdG9ycyh0aGlzLmJvdW5kaW5nQm94Lm1heCxEdC5tYXgpLHRoaXMuYm91bmRpbmdCb3guZXhwYW5kQnlQb2ludChadCkpOih0aGlzLmJvdW5kaW5nQm94LmV4cGFuZEJ5UG9pbnQoRHQubWluKSx0aGlzLmJvdW5kaW5nQm94LmV4cGFuZEJ5UG9pbnQoRHQubWF4KSl9fWVsc2UgdGhpcy5ib3VuZGluZ0JveC5tYWtlRW1wdHkoKTsoaXNOYU4odGhpcy5ib3VuZGluZ0JveC5taW4ueCl8fGlzTmFOKHRoaXMuYm91bmRpbmdCb3gubWluLnkpfHxpc05hTih0aGlzLmJvdW5kaW5nQm94Lm1pbi56KSkmJmNvbnNvbGUuZXJyb3IoJ1RIUkVFLkJ1ZmZlckdlb21ldHJ5LmNvbXB1dGVCb3VuZGluZ0JveCgpOiBDb21wdXRlZCBtaW4vbWF4IGhhdmUgTmFOIHZhbHVlcy4gVGhlICJwb3NpdGlvbiIgYXR0cmlidXRlIGlzIGxpa2VseSB0byBoYXZlIE5hTiB2YWx1ZXMuJyx0aGlzKX1jb21wdXRlQm91bmRpbmdTcGhlcmUoKXtudWxsPT09dGhpcy5ib3VuZGluZ1NwaGVyZSYmKHRoaXMuYm91bmRpbmdTcGhlcmU9bmV3IEopO2NvbnN0IHQ9dGhpcy5hdHRyaWJ1dGVzLnBvc2l0aW9uLGU9dGhpcy5tb3JwaEF0dHJpYnV0ZXMucG9zaXRpb247aWYodCYmdC5pc0dMQnVmZmVyQXR0cmlidXRlKXJldHVybiBjb25zb2xlLmVycm9yKCdUSFJFRS5CdWZmZXJHZW9tZXRyeS5jb21wdXRlQm91bmRpbmdTcGhlcmUoKTogR0xCdWZmZXJBdHRyaWJ1dGUgcmVxdWlyZXMgYSBtYW51YWwgYm91bmRpbmcgc3BoZXJlLiBBbHRlcm5hdGl2ZWx5IHNldCAibWVzaC5mcnVzdHVtQ3VsbGVkIiB0byAiZmFsc2UiLicsdGhpcyksdm9pZCB0aGlzLmJvdW5kaW5nU3BoZXJlLnNldChuZXcgRSwxLzApO2lmKHQpe2NvbnN0IHM9dGhpcy5ib3VuZGluZ1NwaGVyZS5jZW50ZXI7aWYoRHQuc2V0RnJvbUJ1ZmZlckF0dHJpYnV0ZSh0KSxlKWZvcihsZXQgdD0wLHM9ZS5sZW5ndGg7dDxzO3QrKyl7Y29uc3Qgcz1lW3RdO1l0LnNldEZyb21CdWZmZXJBdHRyaWJ1dGUocyksdGhpcy5tb3JwaFRhcmdldHNSZWxhdGl2ZT8oWnQuYWRkVmVjdG9ycyhEdC5taW4sWXQubWluKSxEdC5leHBhbmRCeVBvaW50KFp0KSxadC5hZGRWZWN0b3JzKER0Lm1heCxZdC5tYXgpLER0LmV4cGFuZEJ5UG9pbnQoWnQpKTooRHQuZXhwYW5kQnlQb2ludChZdC5taW4pLER0LmV4cGFuZEJ5UG9pbnQoWXQubWF4KSl9RHQuZ2V0Q2VudGVyKHMpO2xldCBpPTA7Zm9yKGxldCBlPTAscj10LmNvdW50O2U8cjtlKyspWnQuZnJvbUJ1ZmZlckF0dHJpYnV0ZSh0LGUpLGk9TWF0aC5tYXgoaSxzLmRpc3RhbmNlVG9TcXVhcmVkKFp0KSk7aWYoZSlmb3IobGV0IHI9MCxuPWUubGVuZ3RoO3I8bjtyKyspe2NvbnN0IG49ZVtyXSxvPXRoaXMubW9ycGhUYXJnZXRzUmVsYXRpdmU7Zm9yKGxldCBlPTAscj1uLmNvdW50O2U8cjtlKyspWnQuZnJvbUJ1ZmZlckF0dHJpYnV0ZShuLGUpLG8mJihYdC5mcm9tQnVmZmVyQXR0cmlidXRlKHQsZSksWnQuYWRkKFh0KSksaT1NYXRoLm1heChpLHMuZGlzdGFuY2VUb1NxdWFyZWQoWnQpKX10aGlzLmJvdW5kaW5nU3BoZXJlLnJhZGl1cz1NYXRoLnNxcnQoaSksaXNOYU4odGhpcy5ib3VuZGluZ1NwaGVyZS5yYWRpdXMpJiZjb25zb2xlLmVycm9yKCdUSFJFRS5CdWZmZXJHZW9tZXRyeS5jb21wdXRlQm91bmRpbmdTcGhlcmUoKTogQ29tcHV0ZWQgcmFkaXVzIGlzIE5hTi4gVGhlICJwb3NpdGlvbiIgYXR0cmlidXRlIGlzIGxpa2VseSB0byBoYXZlIE5hTiB2YWx1ZXMuJyx0aGlzKX19Y29tcHV0ZVRhbmdlbnRzKCl7Y29uc3QgdD10aGlzLmluZGV4LGU9dGhpcy5hdHRyaWJ1dGVzO2lmKG51bGw9PT10fHx2b2lkIDA9PT1lLnBvc2l0aW9ufHx2b2lkIDA9PT1lLm5vcm1hbHx8dm9pZCAwPT09ZS51dilyZXR1cm4gdm9pZCBjb25zb2xlLmVycm9yKCJUSFJFRS5CdWZmZXJHZW9tZXRyeTogLmNvbXB1dGVUYW5nZW50cygpIGZhaWxlZC4gTWlzc2luZyByZXF1aXJlZCBhdHRyaWJ1dGVzIChpbmRleCwgcG9zaXRpb24sIG5vcm1hbCBvciB1dikiKTtjb25zdCBzPXQuYXJyYXksaT1lLnBvc2l0aW9uLmFycmF5LHI9ZS5ub3JtYWwuYXJyYXksbj1lLnV2LmFycmF5LG89aS5sZW5ndGgvMzshMT09PXRoaXMuaGFzQXR0cmlidXRlKCJ0YW5nZW50IikmJnRoaXMuc2V0QXR0cmlidXRlKCJ0YW5nZW50IixuZXcgVXQobmV3IEZsb2F0MzJBcnJheSg0Km8pLDQpKTtjb25zdCBhPXRoaXMuZ2V0QXR0cmlidXRlKCJ0YW5nZW50IikuYXJyYXksbD1bXSxjPVtdO2ZvcihsZXQgdD0wO3Q8bzt0KyspbFt0XT1uZXcgRSxjW3RdPW5ldyBFO2NvbnN0IHU9bmV3IEUsZD1uZXcgRSxtPW5ldyBFLHk9bmV3IGgscD1uZXcgaCx4PW5ldyBoLGY9bmV3IEUsZz1uZXcgRTtmdW5jdGlvbiBiKHQsZSxzKXt1LmZyb21BcnJheShpLDMqdCksZC5mcm9tQXJyYXkoaSwzKmUpLG0uZnJvbUFycmF5KGksMypzKSx5LmZyb21BcnJheShuLDIqdCkscC5mcm9tQXJyYXkobiwyKmUpLHguZnJvbUFycmF5KG4sMipzKSxkLnN1Yih1KSxtLnN1Yih1KSxwLnN1Yih5KSx4LnN1Yih5KTtjb25zdCByPTEvKHAueCp4LnkteC54KnAueSk7aXNGaW5pdGUocikmJihmLmNvcHkoZCkubXVsdGlwbHlTY2FsYXIoeC55KS5hZGRTY2FsZWRWZWN0b3IobSwtcC55KS5tdWx0aXBseVNjYWxhcihyKSxnLmNvcHkobSkubXVsdGlwbHlTY2FsYXIocC54KS5hZGRTY2FsZWRWZWN0b3IoZCwteC54KS5tdWx0aXBseVNjYWxhcihyKSxsW3RdLmFkZChmKSxsW2VdLmFkZChmKSxsW3NdLmFkZChmKSxjW3RdLmFkZChnKSxjW2VdLmFkZChnKSxjW3NdLmFkZChnKSl9bGV0IHc9dGhpcy5ncm91cHM7MD09PXcubGVuZ3RoJiYodz1be3N0YXJ0OjAsY291bnQ6cy5sZW5ndGh9XSk7Zm9yKGxldCB0PTAsZT13Lmxlbmd0aDt0PGU7Kyt0KXtjb25zdCBlPXdbdF0saT1lLnN0YXJ0O2ZvcihsZXQgdD1pLHI9aStlLmNvdW50O3Q8cjt0Kz0zKWIoc1t0KzBdLHNbdCsxXSxzW3QrMl0pfWNvbnN0IE09bmV3IEUsej1uZXcgRSx2PW5ldyBFLF89bmV3IEU7ZnVuY3Rpb24gQSh0KXt2LmZyb21BcnJheShyLDMqdCksXy5jb3B5KHYpO2NvbnN0IGU9bFt0XTtNLmNvcHkoZSksTS5zdWIodi5tdWx0aXBseVNjYWxhcih2LmRvdChlKSkpLm5vcm1hbGl6ZSgpLHouY3Jvc3NWZWN0b3JzKF8sZSk7Y29uc3Qgcz16LmRvdChjW3RdKTwwPy0xOjE7YVs0KnRdPU0ueCxhWzQqdCsxXT1NLnksYVs0KnQrMl09TS56LGFbNCp0KzNdPXN9Zm9yKGxldCB0PTAsZT13Lmxlbmd0aDt0PGU7Kyt0KXtjb25zdCBlPXdbdF0saT1lLnN0YXJ0O2ZvcihsZXQgdD1pLHI9aStlLmNvdW50O3Q8cjt0Kz0zKUEoc1t0KzBdKSxBKHNbdCsxXSksQShzW3QrMl0pfX1jb21wdXRlVmVydGV4Tm9ybWFscygpe2NvbnN0IHQ9dGhpcy5pbmRleCxlPXRoaXMuZ2V0QXR0cmlidXRlKCJwb3NpdGlvbiIpO2lmKHZvaWQgMCE9PWUpe2xldCBzPXRoaXMuZ2V0QXR0cmlidXRlKCJub3JtYWwiKTtpZih2b2lkIDA9PT1zKXM9bmV3IFV0KG5ldyBGbG9hdDMyQXJyYXkoMyplLmNvdW50KSwzKSx0aGlzLnNldEF0dHJpYnV0ZSgibm9ybWFsIixzKTtlbHNlIGZvcihsZXQgdD0wLGU9cy5jb3VudDt0PGU7dCsrKXMuc2V0WFlaKHQsMCwwLDApO2NvbnN0IGk9bmV3IEUscj1uZXcgRSxuPW5ldyBFLG89bmV3IEUsYT1uZXcgRSxoPW5ldyBFLGw9bmV3IEUsYz1uZXcgRTtpZih0KWZvcihsZXQgdT0wLGQ9dC5jb3VudDt1PGQ7dSs9Myl7Y29uc3QgZD10LmdldFgodSswKSxtPXQuZ2V0WCh1KzEpLHk9dC5nZXRYKHUrMik7aS5mcm9tQnVmZmVyQXR0cmlidXRlKGUsZCksci5mcm9tQnVmZmVyQXR0cmlidXRlKGUsbSksbi5mcm9tQnVmZmVyQXR0cmlidXRlKGUseSksbC5zdWJWZWN0b3JzKG4sciksYy5zdWJWZWN0b3JzKGksciksbC5jcm9zcyhjKSxvLmZyb21CdWZmZXJBdHRyaWJ1dGUocyxkKSxhLmZyb21CdWZmZXJBdHRyaWJ1dGUocyxtKSxoLmZyb21CdWZmZXJBdHRyaWJ1dGUocyx5KSxvLmFkZChsKSxhLmFkZChsKSxoLmFkZChsKSxzLnNldFhZWihkLG8ueCxvLnksby56KSxzLnNldFhZWihtLGEueCxhLnksYS56KSxzLnNldFhZWih5LGgueCxoLnksaC56KX1lbHNlIGZvcihsZXQgdD0wLG89ZS5jb3VudDt0PG87dCs9MylpLmZyb21CdWZmZXJBdHRyaWJ1dGUoZSx0KzApLHIuZnJvbUJ1ZmZlckF0dHJpYnV0ZShlLHQrMSksbi5mcm9tQnVmZmVyQXR0cmlidXRlKGUsdCsyKSxsLnN1YlZlY3RvcnMobixyKSxjLnN1YlZlY3RvcnMoaSxyKSxsLmNyb3NzKGMpLHMuc2V0WFlaKHQrMCxsLngsbC55LGwueikscy5zZXRYWVoodCsxLGwueCxsLnksbC56KSxzLnNldFhZWih0KzIsbC54LGwueSxsLnopO3RoaXMubm9ybWFsaXplTm9ybWFscygpLHMubmVlZHNVcGRhdGU9ITB9fW1lcmdlKHQsZSl7aWYoIXR8fCF0LmlzQnVmZmVyR2VvbWV0cnkpcmV0dXJuIHZvaWQgY29uc29sZS5lcnJvcigiVEhSRUUuQnVmZmVyR2VvbWV0cnkubWVyZ2UoKTogZ2VvbWV0cnkgbm90IGFuIGluc3RhbmNlIG9mIFRIUkVFLkJ1ZmZlckdlb21ldHJ5LiIsdCk7dm9pZCAwPT09ZSYmKGU9MCxjb25zb2xlLndhcm4oIlRIUkVFLkJ1ZmZlckdlb21ldHJ5Lm1lcmdlKCk6IE92ZXJ3cml0aW5nIG9yaWdpbmFsIGdlb21ldHJ5LCBzdGFydGluZyBhdCBvZmZzZXQ9MC4gVXNlIEJ1ZmZlckdlb21ldHJ5VXRpbHMubWVyZ2VCdWZmZXJHZW9tZXRyaWVzKCkgZm9yIGxvc3NsZXNzIG1lcmdlLiIpKTtjb25zdCBzPXRoaXMuYXR0cmlidXRlcztmb3IoY29uc3QgaSBpbiBzKXtpZih2b2lkIDA9PT10LmF0dHJpYnV0ZXNbaV0pY29udGludWU7Y29uc3Qgcj1zW2ldLmFycmF5LG49dC5hdHRyaWJ1dGVzW2ldLG89bi5hcnJheSxhPW4uaXRlbVNpemUqZSxoPU1hdGgubWluKG8ubGVuZ3RoLHIubGVuZ3RoLWEpO2ZvcihsZXQgdD0wLGU9YTt0PGg7dCsrLGUrKylyW2VdPW9bdF19cmV0dXJuIHRoaXN9bm9ybWFsaXplTm9ybWFscygpe2NvbnN0IHQ9dGhpcy5hdHRyaWJ1dGVzLm5vcm1hbDtmb3IobGV0IGU9MCxzPXQuY291bnQ7ZTxzO2UrKyladC5mcm9tQnVmZmVyQXR0cmlidXRlKHQsZSksWnQubm9ybWFsaXplKCksdC5zZXRYWVooZSxadC54LFp0LnksWnQueil9dG9Ob25JbmRleGVkKCl7ZnVuY3Rpb24gdCh0LGUpe2NvbnN0IHM9dC5hcnJheSxpPXQuaXRlbVNpemUscj10Lm5vcm1hbGl6ZWQsbj1uZXcgcy5jb25zdHJ1Y3RvcihlLmxlbmd0aCppKTtsZXQgbz0wLGE9MDtmb3IobGV0IHI9MCxoPWUubGVuZ3RoO3I8aDtyKyspe289dC5pc0ludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlP2Vbcl0qdC5kYXRhLnN0cmlkZSt0Lm9mZnNldDplW3JdKmk7Zm9yKGxldCB0PTA7dDxpO3QrKyluW2ErK109c1tvKytdfXJldHVybiBuZXcgVXQobixpLHIpfWlmKG51bGw9PT10aGlzLmluZGV4KXJldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLkJ1ZmZlckdlb21ldHJ5LnRvTm9uSW5kZXhlZCgpOiBCdWZmZXJHZW9tZXRyeSBpcyBhbHJlYWR5IG5vbi1pbmRleGVkLiIpLHRoaXM7Y29uc3QgZT1uZXcgR3Qscz10aGlzLmluZGV4LmFycmF5LGk9dGhpcy5hdHRyaWJ1dGVzO2Zvcihjb25zdCByIGluIGkpe2NvbnN0IG49dChpW3JdLHMpO2Uuc2V0QXR0cmlidXRlKHIsbil9Y29uc3Qgcj10aGlzLm1vcnBoQXR0cmlidXRlcztmb3IoY29uc3QgaSBpbiByKXtjb25zdCBuPVtdLG89cltpXTtmb3IobGV0IGU9MCxpPW8ubGVuZ3RoO2U8aTtlKyspe2NvbnN0IGk9dChvW2VdLHMpO24ucHVzaChpKX1lLm1vcnBoQXR0cmlidXRlc1tpXT1ufWUubW9ycGhUYXJnZXRzUmVsYXRpdmU9dGhpcy5tb3JwaFRhcmdldHNSZWxhdGl2ZTtjb25zdCBuPXRoaXMuZ3JvdXBzO2ZvcihsZXQgdD0wLHM9bi5sZW5ndGg7dDxzO3QrKyl7Y29uc3Qgcz1uW3RdO2UuYWRkR3JvdXAocy5zdGFydCxzLmNvdW50LHMubWF0ZXJpYWxJbmRleCl9cmV0dXJuIGV9dG9KU09OKCl7Y29uc3QgdD17bWV0YWRhdGE6e3ZlcnNpb246NC41LHR5cGU6IkJ1ZmZlckdlb21ldHJ5IixnZW5lcmF0b3I6IkJ1ZmZlckdlb21ldHJ5LnRvSlNPTiJ9fTtpZih0LnV1aWQ9dGhpcy51dWlkLHQudHlwZT10aGlzLnR5cGUsIiIhPT10aGlzLm5hbWUmJih0Lm5hbWU9dGhpcy5uYW1lKSxPYmplY3Qua2V5cyh0aGlzLnVzZXJEYXRhKS5sZW5ndGg+MCYmKHQudXNlckRhdGE9dGhpcy51c2VyRGF0YSksdm9pZCAwIT09dGhpcy5wYXJhbWV0ZXJzKXtjb25zdCBlPXRoaXMucGFyYW1ldGVycztmb3IoY29uc3QgcyBpbiBlKXZvaWQgMCE9PWVbc10mJih0W3NdPWVbc10pO3JldHVybiB0fXQuZGF0YT17YXR0cmlidXRlczp7fX07Y29uc3QgZT10aGlzLmluZGV4O251bGwhPT1lJiYodC5kYXRhLmluZGV4PXt0eXBlOmUuYXJyYXkuY29uc3RydWN0b3IubmFtZSxhcnJheTpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChlLmFycmF5KX0pO2NvbnN0IHM9dGhpcy5hdHRyaWJ1dGVzO2Zvcihjb25zdCBlIGluIHMpe2NvbnN0IGk9c1tlXTt0LmRhdGEuYXR0cmlidXRlc1tlXT1pLnRvSlNPTih0LmRhdGEpfWNvbnN0IGk9e307bGV0IHI9ITE7Zm9yKGNvbnN0IGUgaW4gdGhpcy5tb3JwaEF0dHJpYnV0ZXMpe2NvbnN0IHM9dGhpcy5tb3JwaEF0dHJpYnV0ZXNbZV0sbj1bXTtmb3IobGV0IGU9MCxpPXMubGVuZ3RoO2U8aTtlKyspe2NvbnN0IGk9c1tlXTtuLnB1c2goaS50b0pTT04odC5kYXRhKSl9bi5sZW5ndGg+MCYmKGlbZV09bixyPSEwKX1yJiYodC5kYXRhLm1vcnBoQXR0cmlidXRlcz1pLHQuZGF0YS5tb3JwaFRhcmdldHNSZWxhdGl2ZT10aGlzLm1vcnBoVGFyZ2V0c1JlbGF0aXZlKTtjb25zdCBuPXRoaXMuZ3JvdXBzO24ubGVuZ3RoPjAmJih0LmRhdGEuZ3JvdXBzPUpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkobikpKTtjb25zdCBvPXRoaXMuYm91bmRpbmdTcGhlcmU7cmV0dXJuIG51bGwhPT1vJiYodC5kYXRhLmJvdW5kaW5nU3BoZXJlPXtjZW50ZXI6by5jZW50ZXIudG9BcnJheSgpLHJhZGl1czpvLnJhZGl1c30pLHR9Y2xvbmUoKXtyZXR1cm4obmV3IHRoaXMuY29uc3RydWN0b3IpLmNvcHkodGhpcyl9Y29weSh0KXt0aGlzLmluZGV4PW51bGwsdGhpcy5hdHRyaWJ1dGVzPXt9LHRoaXMubW9ycGhBdHRyaWJ1dGVzPXt9LHRoaXMuZ3JvdXBzPVtdLHRoaXMuYm91bmRpbmdCb3g9bnVsbCx0aGlzLmJvdW5kaW5nU3BoZXJlPW51bGw7Y29uc3QgZT17fTt0aGlzLm5hbWU9dC5uYW1lO2NvbnN0IHM9dC5pbmRleDtudWxsIT09cyYmdGhpcy5zZXRJbmRleChzLmNsb25lKGUpKTtjb25zdCBpPXQuYXR0cmlidXRlcztmb3IoY29uc3QgdCBpbiBpKXtjb25zdCBzPWlbdF07dGhpcy5zZXRBdHRyaWJ1dGUodCxzLmNsb25lKGUpKX1jb25zdCByPXQubW9ycGhBdHRyaWJ1dGVzO2Zvcihjb25zdCB0IGluIHIpe2NvbnN0IHM9W10saT1yW3RdO2ZvcihsZXQgdD0wLHI9aS5sZW5ndGg7dDxyO3QrKylzLnB1c2goaVt0XS5jbG9uZShlKSk7dGhpcy5tb3JwaEF0dHJpYnV0ZXNbdF09c310aGlzLm1vcnBoVGFyZ2V0c1JlbGF0aXZlPXQubW9ycGhUYXJnZXRzUmVsYXRpdmU7Y29uc3Qgbj10Lmdyb3Vwcztmb3IobGV0IHQ9MCxlPW4ubGVuZ3RoO3Q8ZTt0Kyspe2NvbnN0IGU9blt0XTt0aGlzLmFkZEdyb3VwKGUuc3RhcnQsZS5jb3VudCxlLm1hdGVyaWFsSW5kZXgpfWNvbnN0IG89dC5ib3VuZGluZ0JveDtudWxsIT09byYmKHRoaXMuYm91bmRpbmdCb3g9by5jbG9uZSgpKTtjb25zdCBhPXQuYm91bmRpbmdTcGhlcmU7cmV0dXJuIG51bGwhPT1hJiYodGhpcy5ib3VuZGluZ1NwaGVyZT1hLmNsb25lKCkpLHRoaXMuZHJhd1JhbmdlLnN0YXJ0PXQuZHJhd1JhbmdlLnN0YXJ0LHRoaXMuZHJhd1JhbmdlLmNvdW50PXQuZHJhd1JhbmdlLmNvdW50LHRoaXMudXNlckRhdGE9dC51c2VyRGF0YSx2b2lkIDAhPT10LnBhcmFtZXRlcnMmJih0aGlzLnBhcmFtZXRlcnM9T2JqZWN0LmFzc2lnbih7fSx0LnBhcmFtZXRlcnMpKSx0aGlzfWRpc3Bvc2UoKXt0aGlzLmRpc3BhdGNoRXZlbnQoe3R5cGU6ImRpc3Bvc2UifSl9fWNvbnN0IGp0PW5ldyBFLFF0PW5ldyBFLEp0PW5ldyBsO2NsYXNzICR0e2NvbnN0cnVjdG9yKCl7bGV0IHQ9YXJndW1lbnRzLmxlbmd0aD4wJiZ2b2lkIDAhPT1hcmd1bWVudHNbMF0/YXJndW1lbnRzWzBdOm5ldyBFKDEsMCwwKSxlPWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTowO3RoaXMuaXNQbGFuZT0hMCx0aGlzLm5vcm1hbD10LHRoaXMuY29uc3RhbnQ9ZX1zZXQodCxlKXtyZXR1cm4gdGhpcy5ub3JtYWwuY29weSh0KSx0aGlzLmNvbnN0YW50PWUsdGhpc31zZXRDb21wb25lbnRzKHQsZSxzLGkpe3JldHVybiB0aGlzLm5vcm1hbC5zZXQodCxlLHMpLHRoaXMuY29uc3RhbnQ9aSx0aGlzfXNldEZyb21Ob3JtYWxBbmRDb3BsYW5hclBvaW50KHQsZSl7cmV0dXJuIHRoaXMubm9ybWFsLmNvcHkodCksdGhpcy5jb25zdGFudD0tZS5kb3QodGhpcy5ub3JtYWwpLHRoaXN9c2V0RnJvbUNvcGxhbmFyUG9pbnRzKHQsZSxzKXtjb25zdCBpPWp0LnN1YlZlY3RvcnMocyxlKS5jcm9zcyhRdC5zdWJWZWN0b3JzKHQsZSkpLm5vcm1hbGl6ZSgpO3JldHVybiB0aGlzLnNldEZyb21Ob3JtYWxBbmRDb3BsYW5hclBvaW50KGksdCksdGhpc31jb3B5KHQpe3JldHVybiB0aGlzLm5vcm1hbC5jb3B5KHQubm9ybWFsKSx0aGlzLmNvbnN0YW50PXQuY29uc3RhbnQsdGhpc31ub3JtYWxpemUoKXtjb25zdCB0PTEvdGhpcy5ub3JtYWwubGVuZ3RoKCk7cmV0dXJuIHRoaXMubm9ybWFsLm11bHRpcGx5U2NhbGFyKHQpLHRoaXMuY29uc3RhbnQqPXQsdGhpc31uZWdhdGUoKXtyZXR1cm4gdGhpcy5jb25zdGFudCo9LTEsdGhpcy5ub3JtYWwubmVnYXRlKCksdGhpc31kaXN0YW5jZVRvUG9pbnQodCl7cmV0dXJuIHRoaXMubm9ybWFsLmRvdCh0KSt0aGlzLmNvbnN0YW50fWRpc3RhbmNlVG9TcGhlcmUodCl7cmV0dXJuIHRoaXMuZGlzdGFuY2VUb1BvaW50KHQuY2VudGVyKS10LnJhZGl1c31wcm9qZWN0UG9pbnQodCxlKXtyZXR1cm4gZS5jb3B5KHRoaXMubm9ybWFsKS5tdWx0aXBseVNjYWxhcigtdGhpcy5kaXN0YW5jZVRvUG9pbnQodCkpLmFkZCh0KX1pbnRlcnNlY3RMaW5lKHQsZSl7Y29uc3Qgcz10LmRlbHRhKGp0KSxpPXRoaXMubm9ybWFsLmRvdChzKTtpZigwPT09aSlyZXR1cm4gMD09PXRoaXMuZGlzdGFuY2VUb1BvaW50KHQuc3RhcnQpP2UuY29weSh0LnN0YXJ0KTpudWxsO2NvbnN0IHI9LSh0LnN0YXJ0LmRvdCh0aGlzLm5vcm1hbCkrdGhpcy5jb25zdGFudCkvaTtyZXR1cm4gcjwwfHxyPjE/bnVsbDplLmNvcHkocykubXVsdGlwbHlTY2FsYXIocikuYWRkKHQuc3RhcnQpfWludGVyc2VjdHNMaW5lKHQpe2NvbnN0IGU9dGhpcy5kaXN0YW5jZVRvUG9pbnQodC5zdGFydCkscz10aGlzLmRpc3RhbmNlVG9Qb2ludCh0LmVuZCk7cmV0dXJuIGU8MCYmcz4wfHxzPDAmJmU+MH1pbnRlcnNlY3RzQm94KHQpe3JldHVybiB0LmludGVyc2VjdHNQbGFuZSh0aGlzKX1pbnRlcnNlY3RzU3BoZXJlKHQpe3JldHVybiB0LmludGVyc2VjdHNQbGFuZSh0aGlzKX1jb3BsYW5hclBvaW50KHQpe3JldHVybiB0LmNvcHkodGhpcy5ub3JtYWwpLm11bHRpcGx5U2NhbGFyKC10aGlzLmNvbnN0YW50KX1hcHBseU1hdHJpeDQodCxlKXtjb25zdCBzPWV8fEp0LmdldE5vcm1hbE1hdHJpeCh0KSxpPXRoaXMuY29wbGFuYXJQb2ludChqdCkuYXBwbHlNYXRyaXg0KHQpLHI9dGhpcy5ub3JtYWwuYXBwbHlNYXRyaXgzKHMpLm5vcm1hbGl6ZSgpO3JldHVybiB0aGlzLmNvbnN0YW50PS1pLmRvdChyKSx0aGlzfXRyYW5zbGF0ZSh0KXtyZXR1cm4gdGhpcy5jb25zdGFudC09dC5kb3QodGhpcy5ub3JtYWwpLHRoaXN9ZXF1YWxzKHQpe3JldHVybiB0Lm5vcm1hbC5lcXVhbHModGhpcy5ub3JtYWwpJiZ0LmNvbnN0YW50PT09dGhpcy5jb25zdGFudH1jbG9uZSgpe3JldHVybihuZXcgdGhpcy5jb25zdHJ1Y3RvcikuY29weSh0aGlzKX19Y29uc3QgS3Q9bmV3IEUsdGU9bmV3IEU7Y2xhc3MgZWV7Y29uc3RydWN0b3IoKXtsZXQgdD1hcmd1bWVudHMubGVuZ3RoPjAmJnZvaWQgMCE9PWFyZ3VtZW50c1swXT9hcmd1bWVudHNbMF06bmV3IEUsZT1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06bmV3IEU7dGhpcy5zdGFydD10LHRoaXMuZW5kPWV9c2V0KHQsZSl7cmV0dXJuIHRoaXMuc3RhcnQuY29weSh0KSx0aGlzLmVuZC5jb3B5KGUpLHRoaXN9Y29weSh0KXtyZXR1cm4gdGhpcy5zdGFydC5jb3B5KHQuc3RhcnQpLHRoaXMuZW5kLmNvcHkodC5lbmQpLHRoaXN9Z2V0Q2VudGVyKHQpe3JldHVybiB0LmFkZFZlY3RvcnModGhpcy5zdGFydCx0aGlzLmVuZCkubXVsdGlwbHlTY2FsYXIoLjUpfWRlbHRhKHQpe3JldHVybiB0LnN1YlZlY3RvcnModGhpcy5lbmQsdGhpcy5zdGFydCl9ZGlzdGFuY2VTcSgpe3JldHVybiB0aGlzLnN0YXJ0LmRpc3RhbmNlVG9TcXVhcmVkKHRoaXMuZW5kKX1kaXN0YW5jZSgpe3JldHVybiB0aGlzLnN0YXJ0LmRpc3RhbmNlVG8odGhpcy5lbmQpfWF0KHQsZSl7cmV0dXJuIHRoaXMuZGVsdGEoZSkubXVsdGlwbHlTY2FsYXIodCkuYWRkKHRoaXMuc3RhcnQpfWNsb3Nlc3RQb2ludFRvUG9pbnRQYXJhbWV0ZXIodCxlKXtLdC5zdWJWZWN0b3JzKHQsdGhpcy5zdGFydCksdGUuc3ViVmVjdG9ycyh0aGlzLmVuZCx0aGlzLnN0YXJ0KTtjb25zdCBzPXRlLmRvdCh0ZSk7bGV0IGk9dGUuZG90KEt0KS9zO3JldHVybiBlJiYoaT1vKGksMCwxKSksaX1jbG9zZXN0UG9pbnRUb1BvaW50KHQsZSxzKXtjb25zdCBpPXRoaXMuY2xvc2VzdFBvaW50VG9Qb2ludFBhcmFtZXRlcih0LGUpO3JldHVybiB0aGlzLmRlbHRhKHMpLm11bHRpcGx5U2NhbGFyKGkpLmFkZCh0aGlzLnN0YXJ0KX1hcHBseU1hdHJpeDQodCl7cmV0dXJuIHRoaXMuc3RhcnQuYXBwbHlNYXRyaXg0KHQpLHRoaXMuZW5kLmFwcGx5TWF0cml4NCh0KSx0aGlzfWVxdWFscyh0KXtyZXR1cm4gdC5zdGFydC5lcXVhbHModGhpcy5zdGFydCkmJnQuZW5kLmVxdWFscyh0aGlzLmVuZCl9Y2xvbmUoKXtyZXR1cm4obmV3IHRoaXMuY29uc3RydWN0b3IpLmNvcHkodGhpcyl9fSJ1bmRlZmluZWQiIT10eXBlb2YgX19USFJFRV9ERVZUT09MU19fJiZfX1RIUkVFX0RFVlRPT0xTX18uZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoInJlZ2lzdGVyIix7ZGV0YWlsOntyZXZpc2lvbjoiMTQyIn19KSksInVuZGVmaW5lZCIhPXR5cGVvZiB3aW5kb3cmJih3aW5kb3cuX19USFJFRV9fP2NvbnNvbGUud2FybigiV0FSTklORzogTXVsdGlwbGUgaW5zdGFuY2VzIG9mIFRocmVlLmpzIGJlaW5nIGltcG9ydGVkLiIpOndpbmRvdy5fX1RIUkVFX189IjE0MiIpO2NvbnN0IHNlPTEuMjUsaWU9NjU1MzUscmU9TWF0aC5wb3coMiwtMjQpO2NsYXNzIG5le2NvbnN0cnVjdG9yKCl7fX1mdW5jdGlvbiBvZSh0LGUscyl7cmV0dXJuIHMubWluLng9ZVt0XSxzLm1pbi55PWVbdCsxXSxzLm1pbi56PWVbdCsyXSxzLm1heC54PWVbdCszXSxzLm1heC55PWVbdCs0XSxzLm1heC56PWVbdCs1XSxzfWZ1bmN0aW9uIGFlKHQpe2xldCBlPS0xLHM9LTEvMDtmb3IobGV0IGk9MDtpPDM7aSsrKXtjb25zdCByPXRbaSszXS10W2ldO3I+cyYmKHM9cixlPWkpfXJldHVybiBlfWZ1bmN0aW9uIGhlKHQsZSl7ZS5zZXQodCl9ZnVuY3Rpb24gbGUodCxlLHMpe2xldCBpLHI7Zm9yKGxldCBuPTA7bjwzO24rKyl7Y29uc3Qgbz1uKzM7aT10W25dLHI9ZVtuXSxzW25dPWk8cj9pOnIsaT10W29dLHI9ZVtvXSxzW29dPWk+cj9pOnJ9fWZ1bmN0aW9uIGNlKHQsZSxzKXtmb3IobGV0IGk9MDtpPDM7aSsrKXtjb25zdCByPWVbdCsyKmldLG49ZVt0KzIqaSsxXSxvPXItbixhPXIrbjtvPHNbaV0mJihzW2ldPW8pLGE+c1tpKzNdJiYoc1tpKzNdPWEpfX1mdW5jdGlvbiB1ZSh0KXtjb25zdCBlPXRbM10tdFswXSxzPXRbNF0tdFsxXSxpPXRbNV0tdFsyXTtyZXR1cm4gMiooZSpzK3MqaStpKmUpfWZ1bmN0aW9uIGRlKHQsZSxzLGkpe2xldCByPWFyZ3VtZW50cy5sZW5ndGg+NCYmdm9pZCAwIT09YXJndW1lbnRzWzRdP2FyZ3VtZW50c1s0XTpudWxsLG49MS8wLG89MS8wLGE9MS8wLGg9LTEvMCxsPS0xLzAsYz0tMS8wLHU9MS8wLGQ9MS8wLG09MS8wLHk9LTEvMCxwPS0xLzAseD0tMS8wO2NvbnN0IGY9bnVsbCE9PXI7Zm9yKGxldCBpPTYqZSxyPTYqKGUrcyk7aTxyO2krPTYpe2NvbnN0IGU9dFtpKzBdLHM9dFtpKzFdLHI9ZS1zLGc9ZStzO3I8biYmKG49ciksZz5oJiYoaD1nKSxmJiZlPHUmJih1PWUpLGYmJmU+eSYmKHk9ZSk7Y29uc3QgYj10W2krMl0sdz10W2krM10sTT1iLXcsej1iK3c7TTxvJiYobz1NKSx6PmwmJihsPXopLGYmJmI8ZCYmKGQ9YiksZiYmYj5wJiYocD1iKTtjb25zdCB2PXRbaSs0XSxfPXRbaSs1XSxBPXYtXyxTPXYrXztBPGEmJihhPUEpLFM+YyYmKGM9UyksZiYmdjxtJiYobT12KSxmJiZ2PngmJih4PXYpfWlbMF09bixpWzFdPW8saVsyXT1hLGlbM109aCxpWzRdPWwsaVs1XT1jLGYmJihyWzBdPXUsclsxXT1kLHJbMl09bSxyWzNdPXkscls0XT1wLHJbNV09eCl9ZnVuY3Rpb24gbWUodCxlLHMsaSxyKXtsZXQgbj1zLG89cytpLTE7Y29uc3QgYT1yLnBvcyxoPTIqci5heGlzO2Zvcig7Oyl7Zm9yKDtuPD1vJiZlWzYqbitoXTxhOyluKys7Zm9yKDtuPD1vJiZlWzYqbytoXT49YTspby0tO2lmKCEobjxvKSlyZXR1cm4gbjtmb3IobGV0IHM9MDtzPDM7cysrKXtsZXQgaT10WzMqbitzXTt0WzMqbitzXT10WzMqbytzXSx0WzMqbytzXT1pO2xldCByPWVbNipuKzIqcyswXTtlWzYqbisyKnMrMF09ZVs2Km8rMipzKzBdLGVbNipvKzIqcyswXT1yO2xldCBhPWVbNipuKzIqcysxXTtlWzYqbisyKnMrMV09ZVs2Km8rMipzKzFdLGVbNipvKzIqcysxXT1hfW4rKyxvLS19fWNvbnN0IHllPTMyLHBlPSh0LGUpPT50LmNhbmRpZGF0ZS1lLmNhbmRpZGF0ZSx4ZT1uZXcgQXJyYXkoeWUpLmZpbGwoKS5tYXAoKCgpPT4oe2NvdW50OjAsYm91bmRzOm5ldyBGbG9hdDMyQXJyYXkoNikscmlnaHRDYWNoZUJvdW5kczpuZXcgRmxvYXQzMkFycmF5KDYpLGxlZnRDYWNoZUJvdW5kczpuZXcgRmxvYXQzMkFycmF5KDYpLGNhbmRpZGF0ZTowfSkpKSxmZT1uZXcgRmxvYXQzMkFycmF5KDYpO2Z1bmN0aW9uIGdlKHQsZSxzLGkscixuKXtsZXQgbz0tMSxhPTA7aWYoMD09PW4pbz1hZShlKSwtMSE9PW8mJihhPShlW29dK2VbbyszXSkvMik7ZWxzZSBpZigxPT09bilvPWFlKHQpLC0xIT09byYmKGE9ZnVuY3Rpb24odCxlLHMsaSl7bGV0IHI9MDtmb3IobGV0IG49ZSxvPWUrcztuPG87bisrKXIrPXRbNipuKzIqaV07cmV0dXJuIHIvc30ocyxpLHIsbykpO2Vsc2UgaWYoMj09PW4pe2NvbnN0IG49dWUodCk7bGV0IGg9c2Uqcjtjb25zdCBsPTYqaSxjPTYqKGkrcik7Zm9yKGxldCB0PTA7dDwzO3QrKyl7Y29uc3QgaT1lW3RdLHU9KGVbdCszXS1pKS95ZTtpZihyPDgpe2NvbnN0IGU9Wy4uLnhlXTtlLmxlbmd0aD1yO2xldCBpPTA7Zm9yKGxldCByPWw7cjxjO3IrPTYsaSsrKXtjb25zdCBuPWVbaV07bi5jYW5kaWRhdGU9c1tyKzIqdF0sbi5jb3VudD0wO2NvbnN0e2JvdW5kczpvLGxlZnRDYWNoZUJvdW5kczphLHJpZ2h0Q2FjaGVCb3VuZHM6aH09bjtmb3IobGV0IHQ9MDt0PDM7dCsrKWhbdF09MS8wLGhbdCszXT0tMS8wLGFbdF09MS8wLGFbdCszXT0tMS8wLG9bdF09MS8wLG9bdCszXT0tMS8wO2NlKHIscyxvKX1lLnNvcnQocGUpO2xldCB1PXI7Zm9yKGxldCB0PTA7dDx1O3QrKyl7Y29uc3Qgcz1lW3RdO2Zvcig7dCsxPHUmJmVbdCsxXS5jYW5kaWRhdGU9PT1zLmNhbmRpZGF0ZTspZS5zcGxpY2UodCsxLDEpLHUtLX1mb3IobGV0IGk9bDtpPGM7aSs9Nil7Y29uc3Qgcj1zW2krMip0XTtmb3IobGV0IHQ9MDt0PHU7dCsrKXtjb25zdCBuPWVbdF07cj49bi5jYW5kaWRhdGU/Y2UoaSxzLG4ucmlnaHRDYWNoZUJvdW5kcyk6KGNlKGkscyxuLmxlZnRDYWNoZUJvdW5kcyksbi5jb3VudCsrKX19Zm9yKGxldCBzPTA7czx1O3MrKyl7Y29uc3QgaT1lW3NdLGw9aS5jb3VudCxjPXItaS5jb3VudCx1PWkubGVmdENhY2hlQm91bmRzLGQ9aS5yaWdodENhY2hlQm91bmRzO2xldCBtPTA7MCE9PWwmJihtPXVlKHUpL24pO2xldCB5PTA7MCE9PWMmJih5PXVlKGQpL24pO2NvbnN0IHA9MStzZSoobSpsK3kqYyk7cDxoJiYobz10LGg9cCxhPWkuY2FuZGlkYXRlKX19ZWxzZXtmb3IobGV0IHQ9MDt0PHllO3QrKyl7Y29uc3QgZT14ZVt0XTtlLmNvdW50PTAsZS5jYW5kaWRhdGU9aSt1K3QqdTtjb25zdCBzPWUuYm91bmRzO2ZvcihsZXQgdD0wO3Q8Mzt0Kyspc1t0XT0xLzAsc1t0KzNdPS0xLzB9Zm9yKGxldCBlPWw7ZTxjO2UrPTYpe2xldCByPX5+KChzW2UrMip0XS1pKS91KTtyPj15ZSYmKHI9MzEpO2NvbnN0IG49eGVbcl07bi5jb3VudCsrLGNlKGUscyxuLmJvdW5kcyl9Y29uc3QgZT14ZVszMV07aGUoZS5ib3VuZHMsZS5yaWdodENhY2hlQm91bmRzKTtmb3IobGV0IHQ9MzA7dD49MDt0LS0pe2NvbnN0IGU9eGVbdF0scz14ZVt0KzFdO2xlKGUuYm91bmRzLHMucmlnaHRDYWNoZUJvdW5kcyxlLnJpZ2h0Q2FjaGVCb3VuZHMpfWxldCBkPTA7Zm9yKGxldCBlPTA7ZTwzMTtlKyspe2NvbnN0IHM9eGVbZV0saT1zLmNvdW50LGw9cy5ib3VuZHMsYz14ZVtlKzFdLnJpZ2h0Q2FjaGVCb3VuZHM7MCE9PWkmJigwPT09ZD9oZShsLGZlKTpsZShsLGZlLGZlKSksZCs9aTtsZXQgdT0wLG09MDswIT09ZCYmKHU9dWUoZmUpL24pO2NvbnN0IHk9ci1kOzAhPT15JiYobT11ZShjKS9uKTtjb25zdCBwPTErc2UqKHUqZCttKnkpO3A8aCYmKG89dCxoPXAsYT1zLmNhbmRpZGF0ZSl9fX19ZWxzZSBjb25zb2xlLndhcm4oYE1lc2hCVkg6IEludmFsaWQgYnVpbGQgc3RyYXRlZ3kgdmFsdWUgJHtufSB1c2VkLmApO3JldHVybntheGlzOm8scG9zOmF9fWZ1bmN0aW9uIGJlKHQsZSl7ZnVuY3Rpb24gcyh0KXtkJiZkKHQvbSl9ZnVuY3Rpb24gaShlLHIsZCl7bGV0IG09YXJndW1lbnRzLmxlbmd0aD4zJiZ2b2lkIDAhPT1hcmd1bWVudHNbM10/YXJndW1lbnRzWzNdOm51bGwscD1hcmd1bWVudHMubGVuZ3RoPjQmJnZvaWQgMCE9PWFyZ3VtZW50c1s0XT9hcmd1bWVudHNbNF06MDtpZigheSYmcD49aCYmKHk9ITAsbCYmKGNvbnNvbGUud2FybihgTWVzaEJWSDogTWF4IGRlcHRoIG9mICR7aH0gcmVhY2hlZCB3aGVuIGdlbmVyYXRpbmcgQlZILiBDb25zaWRlciBpbmNyZWFzaW5nIG1heERlcHRoLmApLGNvbnNvbGUud2Fybih0KSkpLGQ8PWN8fHA+PWgpcmV0dXJuIHMocitkKSxlLm9mZnNldD1yLGUuY291bnQ9ZCxlO2NvbnN0IHg9Z2UoZS5ib3VuZGluZ0RhdGEsbSxvLHIsZCx1KTtpZigtMT09PXguYXhpcylyZXR1cm4gcyhyK2QpLGUub2Zmc2V0PXIsZS5jb3VudD1kLGU7Y29uc3QgZj1tZShhLG8scixkLHgpO2lmKGY9PT1yfHxmPT09citkKXMocitkKSxlLm9mZnNldD1yLGUuY291bnQ9ZDtlbHNle2Uuc3BsaXRBeGlzPXguYXhpcztjb25zdCB0PW5ldyBuZSxzPXIsYT1mLXI7ZS5sZWZ0PXQsdC5ib3VuZGluZ0RhdGE9bmV3IEZsb2F0MzJBcnJheSg2KSxkZShvLHMsYSx0LmJvdW5kaW5nRGF0YSxuKSxpKHQscyxhLG4scCsxKTtjb25zdCBoPW5ldyBuZSxsPWYsYz1kLWE7ZS5yaWdodD1oLGguYm91bmRpbmdEYXRhPW5ldyBGbG9hdDMyQXJyYXkoNiksZGUobyxsLGMsaC5ib3VuZGluZ0RhdGEsbiksaShoLGwsYyxuLHArMSl9cmV0dXJuIGV9IWZ1bmN0aW9uKHQsZSl7aWYoIXQuaW5kZXgpe2NvbnN0IHM9dC5hdHRyaWJ1dGVzLnBvc2l0aW9uLmNvdW50LGk9ZS51c2VTaGFyZWRBcnJheUJ1ZmZlcj9TaGFyZWRBcnJheUJ1ZmZlcjpBcnJheUJ1ZmZlcjtsZXQgcjtyPXM+NjU1MzU/bmV3IFVpbnQzMkFycmF5KG5ldyBpKDQqcykpOm5ldyBVaW50MTZBcnJheShuZXcgaSgyKnMpKSx0LnNldEluZGV4KG5ldyBVdChyLDEpKTtmb3IobGV0IHQ9MDt0PHM7dCsrKXJbdF09dH19KHQsZSk7Y29uc3Qgcj1uZXcgRmxvYXQzMkFycmF5KDYpLG49bmV3IEZsb2F0MzJBcnJheSg2KSxvPWZ1bmN0aW9uKHQsZSl7Y29uc3Qgcz10LmF0dHJpYnV0ZXMucG9zaXRpb24saT1zLmFycmF5LHI9dC5pbmRleC5hcnJheSxuPXIubGVuZ3RoLzMsbz1uZXcgRmxvYXQzMkFycmF5KDYqbiksYT1zLm9mZnNldHx8MDtsZXQgaD0zO3MuaXNJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZSYmKGg9cy5kYXRhLnN0cmlkZSk7Zm9yKGxldCB0PTA7dDxuO3QrKyl7Y29uc3Qgcz0zKnQsbj02KnQsbD1yW3MrMF0qaCthLGM9cltzKzFdKmgrYSx1PXJbcysyXSpoK2E7Zm9yKGxldCB0PTA7dDwzO3QrKyl7Y29uc3Qgcz1pW2wrdF0scj1pW2MrdF0sYT1pW3UrdF07bGV0IGg9cztyPGgmJihoPXIpLGE8aCYmKGg9YSk7bGV0IGQ9cztyPmQmJihkPXIpLGE+ZCYmKGQ9YSk7Y29uc3QgbT0oZC1oKS8yLHk9Mip0O29bbit5KzBdPWgrbSxvW24reSsxXT1tKyhNYXRoLmFicyhoKSttKSpyZSxoPGVbdF0mJihlW3RdPWgpLGQ+ZVt0KzNdJiYoZVt0KzNdPWQpfX1yZXR1cm4gb30odCxyKSxhPXQuaW5kZXguYXJyYXksaD1lLm1heERlcHRoLGw9ZS52ZXJib3NlLGM9ZS5tYXhMZWFmVHJpcyx1PWUuc3RyYXRlZ3ksZD1lLm9uUHJvZ3Jlc3MsbT10LmluZGV4LmNvdW50LzM7bGV0IHk9ITE7Y29uc3QgcD1bXSx4PWZ1bmN0aW9uKHQpe2lmKCF0Lmdyb3Vwc3x8IXQuZ3JvdXBzLmxlbmd0aClyZXR1cm5be29mZnNldDowLGNvdW50OnQuaW5kZXguY291bnQvM31dO2NvbnN0IGU9W10scz1uZXcgU2V0O2Zvcihjb25zdCBlIG9mIHQuZ3JvdXBzKXMuYWRkKGUuc3RhcnQpLHMuYWRkKGUuc3RhcnQrZS5jb3VudCk7Y29uc3QgaT1BcnJheS5mcm9tKHMudmFsdWVzKCkpLnNvcnQoKCh0LGUpPT50LWUpKTtmb3IobGV0IHQ9MDt0PGkubGVuZ3RoLTE7dCsrKXtjb25zdCBzPWlbdF0scj1pW3QrMV07ZS5wdXNoKHtvZmZzZXQ6cy8zLGNvdW50OihyLXMpLzN9KX1yZXR1cm4gZX0odCk7aWYoMT09PXgubGVuZ3RoKXtjb25zdCB0PXhbMF0sZT1uZXcgbmU7ZS5ib3VuZGluZ0RhdGE9cixmdW5jdGlvbih0LGUscyxpKXtsZXQgcj0xLzAsbj0xLzAsbz0xLzAsYT0tMS8wLGg9LTEvMCxsPS0xLzA7Zm9yKGxldCBpPTYqZSxjPTYqKGUrcyk7aTxjO2krPTYpe2NvbnN0IGU9dFtpKzBdO2U8ciYmKHI9ZSksZT5hJiYoYT1lKTtjb25zdCBzPXRbaSsyXTtzPG4mJihuPXMpLHM+aCYmKGg9cyk7Y29uc3QgYz10W2krNF07YzxvJiYobz1jKSxjPmwmJihsPWMpfWlbMF09cixpWzFdPW4saVsyXT1vLGlbM109YSxpWzRdPWgsaVs1XT1sfShvLHQub2Zmc2V0LHQuY291bnQsbiksaShlLHQub2Zmc2V0LHQuY291bnQsbikscC5wdXNoKGUpfWVsc2UgZm9yKGxldCB0IG9mIHgpe2NvbnN0IGU9bmV3IG5lO2UuYm91bmRpbmdEYXRhPW5ldyBGbG9hdDMyQXJyYXkoNiksZGUobyx0Lm9mZnNldCx0LmNvdW50LGUuYm91bmRpbmdEYXRhLG4pLGkoZSx0Lm9mZnNldCx0LmNvdW50LG4pLHAucHVzaChlKX1yZXR1cm4gcH1jbGFzcyB3ZXtjb25zdHJ1Y3Rvcigpe3RoaXMubWluPTEvMCx0aGlzLm1heD0tMS8wfXNldEZyb21Qb2ludHNGaWVsZCh0LGUpe2xldCBzPTEvMCxpPS0xLzA7Zm9yKGxldCByPTAsbj10Lmxlbmd0aDtyPG47cisrKXtjb25zdCBuPXRbcl1bZV07cz1uPHM/bjpzLGk9bj5pP246aX10aGlzLm1pbj1zLHRoaXMubWF4PWl9c2V0RnJvbVBvaW50cyh0LGUpe2xldCBzPTEvMCxpPS0xLzA7Zm9yKGxldCByPTAsbj1lLmxlbmd0aDtyPG47cisrKXtjb25zdCBuPWVbcl0sbz10LmRvdChuKTtzPW88cz9vOnMsaT1vPmk/bzppfXRoaXMubWluPXMsdGhpcy5tYXg9aX1pc1NlcGFyYXRlZCh0KXtyZXR1cm4gdGhpcy5taW4+dC5tYXh8fHQubWluPnRoaXMubWF4fX13ZS5wcm90b3R5cGUuc2V0RnJvbUJveD1mdW5jdGlvbigpe2NvbnN0IHQ9bmV3IEU7cmV0dXJuIGZ1bmN0aW9uKGUscyl7Y29uc3QgaT1zLm1pbixyPXMubWF4O2xldCBuPTEvMCxvPS0xLzA7Zm9yKGxldCBzPTA7czw9MTtzKyspZm9yKGxldCBhPTA7YTw9MTthKyspZm9yKGxldCBoPTA7aDw9MTtoKyspe3QueD1pLngqcytyLngqKDEtcyksdC55PWkueSphK3IueSooMS1hKSx0Lno9aS56Kmgrci56KigxLWgpO2NvbnN0IGw9ZS5kb3QodCk7bj1NYXRoLm1pbihsLG4pLG89TWF0aC5tYXgobCxvKX10aGlzLm1pbj1uLHRoaXMubWF4PW99fSgpLGZ1bmN0aW9uKCl7Y29uc3QgdD1uZXcgd2V9KCk7Y29uc3QgTWU9ZnVuY3Rpb24oKXtjb25zdCB0PW5ldyBFLGU9bmV3IEUscz1uZXcgRTtyZXR1cm4gZnVuY3Rpb24oaSxyLG4pe2NvbnN0IG89aS5zdGFydCxhPXQsaD1yLnN0YXJ0LGw9ZTtzLnN1YlZlY3RvcnMobyxoKSx0LnN1YlZlY3RvcnMoaS5lbmQsaS5zdGFydCksZS5zdWJWZWN0b3JzKHIuZW5kLHIuc3RhcnQpO2NvbnN0IGM9cy5kb3QobCksdT1sLmRvdChhKSxkPWwuZG90KGwpLG09cy5kb3QoYSkseT1hLmRvdChhKSpkLXUqdTtsZXQgcCx4O3A9MCE9PXk/KGMqdS1tKmQpL3k6MCx4PShjK3AqdSkvZCxuLng9cCxuLnk9eH19KCksemU9ZnVuY3Rpb24oKXtjb25zdCB0PW5ldyBoLGU9bmV3IEUscz1uZXcgRTtyZXR1cm4gZnVuY3Rpb24oaSxyLG4sbyl7TWUoaSxyLHQpO2xldCBhPXQueCxoPXQueTtpZihhPj0wJiZhPD0xJiZoPj0wJiZoPD0xKXJldHVybiBpLmF0KGEsbiksdm9pZCByLmF0KGgsbyk7aWYoYT49MCYmYTw9MSlyZXR1cm4gaDwwP3IuYXQoMCxvKTpyLmF0KDEsbyksdm9pZCBpLmNsb3Nlc3RQb2ludFRvUG9pbnQobywhMCxuKTtpZihoPj0wJiZoPD0xKXJldHVybiBhPDA/aS5hdCgwLG4pOmkuYXQoMSxuKSx2b2lkIHIuY2xvc2VzdFBvaW50VG9Qb2ludChuLCEwLG8pO3tsZXQgdCxsO3Q9YTwwP2kuc3RhcnQ6aS5lbmQsbD1oPDA/ci5zdGFydDpyLmVuZDtjb25zdCBjPWUsdT1zO3JldHVybiBpLmNsb3Nlc3RQb2ludFRvUG9pbnQobCwhMCxlKSxyLmNsb3Nlc3RQb2ludFRvUG9pbnQodCwhMCxzKSxjLmRpc3RhbmNlVG9TcXVhcmVkKGwpPD11LmRpc3RhbmNlVG9TcXVhcmVkKHQpPyhuLmNvcHkoYyksdm9pZCBvLmNvcHkobCkpOihuLmNvcHkodCksdm9pZCBvLmNvcHkodSkpfX19KCksdmU9ZnVuY3Rpb24oKXtjb25zdCB0PW5ldyBFLGU9bmV3IEUscz1uZXcgJHQsaT1uZXcgZWU7cmV0dXJuIGZ1bmN0aW9uKHIsbil7Y29uc3R7cmFkaXVzOm8sY2VudGVyOmF9PXIse2E6aCxiOmwsYzpjfT1uO2kuc3RhcnQ9aCxpLmVuZD1sO2lmKGkuY2xvc2VzdFBvaW50VG9Qb2ludChhLCEwLHQpLmRpc3RhbmNlVG8oYSk8PW8pcmV0dXJuITA7aS5zdGFydD1oLGkuZW5kPWM7aWYoaS5jbG9zZXN0UG9pbnRUb1BvaW50KGEsITAsdCkuZGlzdGFuY2VUbyhhKTw9bylyZXR1cm4hMDtpLnN0YXJ0PWwsaS5lbmQ9YztpZihpLmNsb3Nlc3RQb2ludFRvUG9pbnQoYSwhMCx0KS5kaXN0YW5jZVRvKGEpPD1vKXJldHVybiEwO2NvbnN0IHU9bi5nZXRQbGFuZShzKTtpZihNYXRoLmFicyh1LmRpc3RhbmNlVG9Qb2ludChhKSk8PW8pe2NvbnN0IHQ9dS5wcm9qZWN0UG9pbnQoYSxlKTtpZihuLmNvbnRhaW5zUG9pbnQodCkpcmV0dXJuITB9cmV0dXJuITF9fSgpO2Z1bmN0aW9uIF9lKHQpe3JldHVybiBNYXRoLmFicyh0KTwxZS0xNX1jbGFzcyBBZSBleHRlbmRzIFZ0e2NvbnN0cnVjdG9yKCl7c3VwZXIoLi4uYXJndW1lbnRzKSx0aGlzLmlzRXh0ZW5kZWRUcmlhbmdsZT0hMCx0aGlzLnNhdEF4ZXM9bmV3IEFycmF5KDQpLmZpbGwoKS5tYXAoKCgpPT5uZXcgRSkpLHRoaXMuc2F0Qm91bmRzPW5ldyBBcnJheSg0KS5maWxsKCkubWFwKCgoKT0+bmV3IHdlKSksdGhpcy5wb2ludHM9W3RoaXMuYSx0aGlzLmIsdGhpcy5jXSx0aGlzLnNwaGVyZT1uZXcgSix0aGlzLnBsYW5lPW5ldyAkdCx0aGlzLm5lZWRzVXBkYXRlPSEwfWludGVyc2VjdHNTcGhlcmUodCl7cmV0dXJuIHZlKHQsdGhpcyl9dXBkYXRlKCl7Y29uc3QgdD10aGlzLmEsZT10aGlzLmIscz10aGlzLmMsaT10aGlzLnBvaW50cyxyPXRoaXMuc2F0QXhlcyxuPXRoaXMuc2F0Qm91bmRzLG89clswXSxhPW5bMF07dGhpcy5nZXROb3JtYWwobyksYS5zZXRGcm9tUG9pbnRzKG8saSk7Y29uc3QgaD1yWzFdLGw9blsxXTtoLnN1YlZlY3RvcnModCxlKSxsLnNldEZyb21Qb2ludHMoaCxpKTtjb25zdCBjPXJbMl0sdT1uWzJdO2Muc3ViVmVjdG9ycyhlLHMpLHUuc2V0RnJvbVBvaW50cyhjLGkpO2NvbnN0IGQ9clszXSxtPW5bM107ZC5zdWJWZWN0b3JzKHMsdCksbS5zZXRGcm9tUG9pbnRzKGQsaSksdGhpcy5zcGhlcmUuc2V0RnJvbVBvaW50cyh0aGlzLnBvaW50cyksdGhpcy5wbGFuZS5zZXRGcm9tTm9ybWFsQW5kQ29wbGFuYXJQb2ludChvLHQpLHRoaXMubmVlZHNVcGRhdGU9ITF9fUFlLnByb3RvdHlwZS5jbG9zZXN0UG9pbnRUb1NlZ21lbnQ9ZnVuY3Rpb24oKXtjb25zdCB0PW5ldyBFLGU9bmV3IEUscz1uZXcgZWU7cmV0dXJuIGZ1bmN0aW9uKGkpe2xldCByPWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTpudWxsLG49YXJndW1lbnRzLmxlbmd0aD4yJiZ2b2lkIDAhPT1hcmd1bWVudHNbMl0/YXJndW1lbnRzWzJdOm51bGw7Y29uc3R7c3RhcnQ6byxlbmQ6YX09aSxoPXRoaXMucG9pbnRzO2xldCBsLGM9MS8wO2ZvcihsZXQgbz0wO288MztvKyspe2NvbnN0IGE9KG8rMSklMztzLnN0YXJ0LmNvcHkoaFtvXSkscy5lbmQuY29weShoW2FdKSx6ZShzLGksdCxlKSxsPXQuZGlzdGFuY2VUb1NxdWFyZWQoZSksbDxjJiYoYz1sLHImJnIuY29weSh0KSxuJiZuLmNvcHkoZSkpfXJldHVybiB0aGlzLmNsb3Nlc3RQb2ludFRvUG9pbnQobyx0KSxsPW8uZGlzdGFuY2VUb1NxdWFyZWQodCksbDxjJiYoYz1sLHImJnIuY29weSh0KSxuJiZuLmNvcHkobykpLHRoaXMuY2xvc2VzdFBvaW50VG9Qb2ludChhLHQpLGw9YS5kaXN0YW5jZVRvU3F1YXJlZCh0KSxsPGMmJihjPWwsciYmci5jb3B5KHQpLG4mJm4uY29weShhKSksTWF0aC5zcXJ0KGMpfX0oKSxBZS5wcm90b3R5cGUuaW50ZXJzZWN0c1RyaWFuZ2xlPWZ1bmN0aW9uKCl7Y29uc3QgdD1uZXcgQWUsZT1uZXcgQXJyYXkoMykscz1uZXcgQXJyYXkoMyksaT1uZXcgd2Uscj1uZXcgd2Usbj1uZXcgRSxvPW5ldyBFLGE9bmV3IEUsaD1uZXcgRSxsPW5ldyBlZSxjPW5ldyBlZSx1PW5ldyBlZTtyZXR1cm4gZnVuY3Rpb24oZCl7bGV0IG09YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOm51bGw7dGhpcy5uZWVkc1VwZGF0ZSYmdGhpcy51cGRhdGUoKSxkLmlzRXh0ZW5kZWRUcmlhbmdsZT9kLm5lZWRzVXBkYXRlJiZkLnVwZGF0ZSgpOih0LmNvcHkoZCksdC51cGRhdGUoKSxkPXQpO2NvbnN0IHk9dGhpcy5wbGFuZSxwPWQucGxhbmU7aWYoTWF0aC5hYnMoeS5ub3JtYWwuZG90KHAubm9ybWFsKSk+MS0xZS0xMCl7Y29uc3QgdD10aGlzLnNhdEJvdW5kcyxvPXRoaXMuc2F0QXhlcztzWzBdPWQuYSxzWzFdPWQuYixzWzJdPWQuYztmb3IobGV0IGU9MDtlPDQ7ZSsrKXtjb25zdCByPXRbZV0sbj1vW2VdO2lmKGkuc2V0RnJvbVBvaW50cyhuLHMpLHIuaXNTZXBhcmF0ZWQoaSkpcmV0dXJuITF9Y29uc3QgYT1kLnNhdEJvdW5kcyxoPWQuc2F0QXhlcztlWzBdPXRoaXMuYSxlWzFdPXRoaXMuYixlWzJdPXRoaXMuYztmb3IobGV0IHQ9MDt0PDQ7dCsrKXtjb25zdCBzPWFbdF0scj1oW3RdO2lmKGkuc2V0RnJvbVBvaW50cyhyLGUpLHMuaXNTZXBhcmF0ZWQoaSkpcmV0dXJuITF9Zm9yKGxldCB0PTA7dDw0O3QrKyl7Y29uc3QgYT1vW3RdO2ZvcihsZXQgdD0wO3Q8NDt0Kyspe2NvbnN0IG89aFt0XTtpZihuLmNyb3NzVmVjdG9ycyhhLG8pLGkuc2V0RnJvbVBvaW50cyhuLGUpLHIuc2V0RnJvbVBvaW50cyhuLHMpLGkuaXNTZXBhcmF0ZWQocikpcmV0dXJuITF9fXJldHVybiBtJiYoY29uc29sZS53YXJuKCJFeHRlbmRlZFRyaWFuZ2xlLmludGVyc2VjdHNUcmlhbmdsZTogVHJpYW5nbGVzIGFyZSBjb3BsYW5hciB3aGljaCBkb2VzIG5vdCBzdXBwb3J0IGFuIG91dHB1dCBlZGdlLiBTZXR0aW5nIGVkZ2UgdG8gMCwgMCwgMC4iKSxtLnN0YXJ0LnNldCgwLDAsMCksbS5lbmQuc2V0KDAsMCwwKSksITB9e2NvbnN0IHQ9dGhpcy5wb2ludHM7bGV0IGU9ITEscz0wO2ZvcihsZXQgaT0wO2k8MztpKyspe2NvbnN0IHI9dFtpXSxuPXRbKGkrMSklM107bC5zdGFydC5jb3B5KHIpLGwuZW5kLmNvcHkobiksbC5kZWx0YShvKTtjb25zdCBhPWU/Yy5zdGFydDpjLmVuZCxoPV9lKHAuZGlzdGFuY2VUb1BvaW50KHIpKTtpZihfZShwLm5vcm1hbC5kb3QobykpJiZoKXtjLmNvcHkobCkscz0yO2JyZWFrfWlmKChwLmludGVyc2VjdExpbmUobCxhKXx8aCkmJiFfZShhLmRpc3RhbmNlVG8obikpKXtpZihzKyssZSlicmVhaztlPSEwfX1pZigxPT09cyYmdGhpcy5jb250YWluc1BvaW50KGMuZW5kKSlyZXR1cm4gbSYmKG0uc3RhcnQuY29weShjLmVuZCksbS5lbmQuY29weShjLmVuZCkpLCEwO2lmKDIhPT1zKXJldHVybiExO2NvbnN0IGk9ZC5wb2ludHM7bGV0IHI9ITEsbj0wO2ZvcihsZXQgdD0wO3Q8Mzt0Kyspe2NvbnN0IGU9aVt0XSxzPWlbKHQrMSklM107bC5zdGFydC5jb3B5KGUpLGwuZW5kLmNvcHkocyksbC5kZWx0YShhKTtjb25zdCBvPXI/dS5zdGFydDp1LmVuZCxoPV9lKHkuZGlzdGFuY2VUb1BvaW50KGUpKTtpZihfZSh5Lm5vcm1hbC5kb3QoYSkpJiZoKXt1LmNvcHkobCksbj0yO2JyZWFrfWlmKCh5LmludGVyc2VjdExpbmUobCxvKXx8aCkmJiFfZShvLmRpc3RhbmNlVG8ocykpKXtpZihuKysscilicmVhaztyPSEwfX1pZigxPT09biYmdGhpcy5jb250YWluc1BvaW50KHUuZW5kKSlyZXR1cm4gbSYmKG0uc3RhcnQuY29weSh1LmVuZCksbS5lbmQuY29weSh1LmVuZCkpLCEwO2lmKDIhPT1uKXJldHVybiExO2lmKGMuZGVsdGEobyksdS5kZWx0YShhKSxvLmRvdChhKTwwKXtsZXQgdD11LnN0YXJ0O3Uuc3RhcnQ9dS5lbmQsdS5lbmQ9dH1jb25zdCB4PWMuc3RhcnQuZG90KG8pLGY9Yy5lbmQuZG90KG8pLGc9dS5zdGFydC5kb3QobyksYj11LmVuZC5kb3Qobyksdz1mPGcsTT14PGI7cmV0dXJuKHg9PT1ifHxnPT09Znx8dyE9PU0pJiYobSYmKGguc3ViVmVjdG9ycyhjLnN0YXJ0LHUuc3RhcnQpLGguZG90KG8pPjA/bS5zdGFydC5jb3B5KGMuc3RhcnQpOm0uc3RhcnQuY29weSh1LnN0YXJ0KSxoLnN1YlZlY3RvcnMoYy5lbmQsdS5lbmQpLGguZG90KG8pPDA/bS5lbmQuY29weShjLmVuZCk6bS5lbmQuY29weSh1LmVuZCkpLCEwKX19fSgpLEFlLnByb3RvdHlwZS5kaXN0YW5jZVRvUG9pbnQ9ZnVuY3Rpb24oKXtjb25zdCB0PW5ldyBFO3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5jbG9zZXN0UG9pbnRUb1BvaW50KGUsdCksZS5kaXN0YW5jZVRvKHQpfX0oKSxBZS5wcm90b3R5cGUuZGlzdGFuY2VUb1RyaWFuZ2xlPWZ1bmN0aW9uKCl7Y29uc3QgdD1uZXcgRSxlPW5ldyBFLHM9WyJhIiwiYiIsImMiXSxpPW5ldyBlZSxyPW5ldyBlZTtyZXR1cm4gZnVuY3Rpb24obil7bGV0IG89YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOm51bGwsYT1hcmd1bWVudHMubGVuZ3RoPjImJnZvaWQgMCE9PWFyZ3VtZW50c1syXT9hcmd1bWVudHNbMl06bnVsbDtjb25zdCBoPW98fGE/aTpudWxsO2lmKHRoaXMuaW50ZXJzZWN0c1RyaWFuZ2xlKG4saCkpcmV0dXJuKG98fGEpJiYobyYmaC5nZXRDZW50ZXIobyksYSYmaC5nZXRDZW50ZXIoYSkpLDA7bGV0IGw9MS8wO2ZvcihsZXQgZT0wO2U8MztlKyspe2xldCBpO2NvbnN0IHI9c1tlXSxoPW5bcl07dGhpcy5jbG9zZXN0UG9pbnRUb1BvaW50KGgsdCksaT1oLmRpc3RhbmNlVG9TcXVhcmVkKHQpLGk8bCYmKGw9aSxvJiZvLmNvcHkodCksYSYmYS5jb3B5KGgpKTtjb25zdCBjPXRoaXNbcl07bi5jbG9zZXN0UG9pbnRUb1BvaW50KGMsdCksaT1jLmRpc3RhbmNlVG9TcXVhcmVkKHQpLGk8bCYmKGw9aSxvJiZvLmNvcHkoYyksYSYmYS5jb3B5KHQpKX1mb3IobGV0IGg9MDtoPDM7aCsrKXtjb25zdCBjPXNbaF0sdT1zWyhoKzEpJTNdO2kuc2V0KHRoaXNbY10sdGhpc1t1XSk7Zm9yKGxldCBoPTA7aDwzO2grKyl7Y29uc3QgYz1zW2hdLHU9c1soaCsxKSUzXTtyLnNldChuW2NdLG5bdV0pLHplKGkscix0LGUpO2NvbnN0IGQ9dC5kaXN0YW5jZVRvU3F1YXJlZChlKTtkPGwmJihsPWQsbyYmby5jb3B5KHQpLGEmJmEuY29weShlKSl9fXJldHVybiBNYXRoLnNxcnQobCl9fSgpO2NsYXNzIFNlIGV4dGVuZHMgQ3tjb25zdHJ1Y3Rvcigpe3N1cGVyKC4uLmFyZ3VtZW50cyksdGhpcy5pc09yaWVudGVkQm94PSEwLHRoaXMubWF0cml4PW5ldyAkLHRoaXMuaW52TWF0cml4PW5ldyAkLHRoaXMucG9pbnRzPW5ldyBBcnJheSg4KS5maWxsKCkubWFwKCgoKT0+bmV3IEUpKSx0aGlzLnNhdEF4ZXM9bmV3IEFycmF5KDMpLmZpbGwoKS5tYXAoKCgpPT5uZXcgRSkpLHRoaXMuc2F0Qm91bmRzPW5ldyBBcnJheSgzKS5maWxsKCkubWFwKCgoKT0+bmV3IHdlKSksdGhpcy5hbGlnbmVkU2F0Qm91bmRzPW5ldyBBcnJheSgzKS5maWxsKCkubWFwKCgoKT0+bmV3IHdlKSksdGhpcy5uZWVkc1VwZGF0ZT0hMX1zZXQodCxlLHMpe3N1cGVyLnNldCh0LGUpLHRoaXMubWF0cml4LmNvcHkocyksdGhpcy5uZWVkc1VwZGF0ZT0hMH1jb3B5KHQpe3N1cGVyLmNvcHkodCksdGhpcy5tYXRyaXguY29weSh0Lm1hdHJpeCksdGhpcy5uZWVkc1VwZGF0ZT0hMH19U2UucHJvdG90eXBlLnVwZGF0ZT1mdW5jdGlvbigpe2NvbnN0IHQ9dGhpcy5tYXRyaXgsZT10aGlzLm1pbixzPXRoaXMubWF4LGk9dGhpcy5wb2ludHM7Zm9yKGxldCByPTA7cjw9MTtyKyspZm9yKGxldCBuPTA7bjw9MTtuKyspZm9yKGxldCBvPTA7bzw9MTtvKyspe2NvbnN0IGE9aVsxKnJ8MipufDQqb107YS54PXI/cy54OmUueCxhLnk9bj9zLnk6ZS55LGEuej1vP3MuejplLnosYS5hcHBseU1hdHJpeDQodCl9Y29uc3Qgcj10aGlzLnNhdEJvdW5kcyxuPXRoaXMuc2F0QXhlcyxvPWlbMF07Zm9yKGxldCB0PTA7dDwzO3QrKyl7Y29uc3QgZT1uW3RdLHM9clt0XSxhPWlbMTw8dF07ZS5zdWJWZWN0b3JzKG8sYSkscy5zZXRGcm9tUG9pbnRzKGUsaSl9Y29uc3QgYT10aGlzLmFsaWduZWRTYXRCb3VuZHM7YVswXS5zZXRGcm9tUG9pbnRzRmllbGQoaSwieCIpLGFbMV0uc2V0RnJvbVBvaW50c0ZpZWxkKGksInkiKSxhWzJdLnNldEZyb21Qb2ludHNGaWVsZChpLCJ6IiksdGhpcy5pbnZNYXRyaXguY29weSh0aGlzLm1hdHJpeCkuaW52ZXJ0KCksdGhpcy5uZWVkc1VwZGF0ZT0hMX0sU2UucHJvdG90eXBlLmludGVyc2VjdHNCb3g9ZnVuY3Rpb24oKXtjb25zdCB0PW5ldyB3ZTtyZXR1cm4gZnVuY3Rpb24oZSl7dGhpcy5uZWVkc1VwZGF0ZSYmdGhpcy51cGRhdGUoKTtjb25zdCBzPWUubWluLGk9ZS5tYXgscj10aGlzLnNhdEJvdW5kcyxuPXRoaXMuc2F0QXhlcyxvPXRoaXMuYWxpZ25lZFNhdEJvdW5kcztpZih0Lm1pbj1zLngsdC5tYXg9aS54LG9bMF0uaXNTZXBhcmF0ZWQodCkpcmV0dXJuITE7aWYodC5taW49cy55LHQubWF4PWkueSxvWzFdLmlzU2VwYXJhdGVkKHQpKXJldHVybiExO2lmKHQubWluPXMueix0Lm1heD1pLnosb1syXS5pc1NlcGFyYXRlZCh0KSlyZXR1cm4hMTtmb3IobGV0IHM9MDtzPDM7cysrKXtjb25zdCBpPW5bc10sbz1yW3NdO2lmKHQuc2V0RnJvbUJveChpLGUpLG8uaXNTZXBhcmF0ZWQodCkpcmV0dXJuITF9cmV0dXJuITB9fSgpLFNlLnByb3RvdHlwZS5pbnRlcnNlY3RzVHJpYW5nbGU9ZnVuY3Rpb24oKXtjb25zdCB0PW5ldyBBZSxlPW5ldyBBcnJheSgzKSxzPW5ldyB3ZSxpPW5ldyB3ZSxyPW5ldyBFO3JldHVybiBmdW5jdGlvbihuKXt0aGlzLm5lZWRzVXBkYXRlJiZ0aGlzLnVwZGF0ZSgpLG4uaXNFeHRlbmRlZFRyaWFuZ2xlP24ubmVlZHNVcGRhdGUmJm4udXBkYXRlKCk6KHQuY29weShuKSx0LnVwZGF0ZSgpLG49dCk7Y29uc3Qgbz10aGlzLnNhdEJvdW5kcyxhPXRoaXMuc2F0QXhlcztlWzBdPW4uYSxlWzFdPW4uYixlWzJdPW4uYztmb3IobGV0IHQ9MDt0PDM7dCsrKXtjb25zdCBpPW9bdF0scj1hW3RdO2lmKHMuc2V0RnJvbVBvaW50cyhyLGUpLGkuaXNTZXBhcmF0ZWQocykpcmV0dXJuITF9Y29uc3QgaD1uLnNhdEJvdW5kcyxsPW4uc2F0QXhlcyxjPXRoaXMucG9pbnRzO2ZvcihsZXQgdD0wO3Q8Mzt0Kyspe2NvbnN0IGU9aFt0XSxpPWxbdF07aWYocy5zZXRGcm9tUG9pbnRzKGksYyksZS5pc1NlcGFyYXRlZChzKSlyZXR1cm4hMX1mb3IobGV0IHQ9MDt0PDM7dCsrKXtjb25zdCBuPWFbdF07Zm9yKGxldCB0PTA7dDw0O3QrKyl7Y29uc3Qgbz1sW3RdO2lmKHIuY3Jvc3NWZWN0b3JzKG4sbykscy5zZXRGcm9tUG9pbnRzKHIsZSksaS5zZXRGcm9tUG9pbnRzKHIsYykscy5pc1NlcGFyYXRlZChpKSlyZXR1cm4hMX19cmV0dXJuITB9fSgpLFNlLnByb3RvdHlwZS5jbG9zZXN0UG9pbnRUb1BvaW50PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMubmVlZHNVcGRhdGUmJnRoaXMudXBkYXRlKCksZS5jb3B5KHQpLmFwcGx5TWF0cml4NCh0aGlzLmludk1hdHJpeCkuY2xhbXAodGhpcy5taW4sdGhpcy5tYXgpLmFwcGx5TWF0cml4NCh0aGlzLm1hdHJpeCksZX0sU2UucHJvdG90eXBlLmRpc3RhbmNlVG9Qb2ludD1mdW5jdGlvbigpe2NvbnN0IHQ9bmV3IEU7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmNsb3Nlc3RQb2ludFRvUG9pbnQoZSx0KSxlLmRpc3RhbmNlVG8odCl9fSgpLFNlLnByb3RvdHlwZS5kaXN0YW5jZVRvQm94PWZ1bmN0aW9uKCl7Y29uc3QgdD1bIngiLCJ5IiwieiJdLGU9bmV3IEFycmF5KDEyKS5maWxsKCkubWFwKCgoKT0+bmV3IGVlKSkscz1uZXcgQXJyYXkoMTIpLmZpbGwoKS5tYXAoKCgpPT5uZXcgZWUpKSxpPW5ldyBFLHI9bmV3IEU7cmV0dXJuIGZ1bmN0aW9uKG4pe2xldCBvPWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTowLGE9YXJndW1lbnRzLmxlbmd0aD4yJiZ2b2lkIDAhPT1hcmd1bWVudHNbMl0/YXJndW1lbnRzWzJdOm51bGwsaD1hcmd1bWVudHMubGVuZ3RoPjMmJnZvaWQgMCE9PWFyZ3VtZW50c1szXT9hcmd1bWVudHNbM106bnVsbDtpZih0aGlzLm5lZWRzVXBkYXRlJiZ0aGlzLnVwZGF0ZSgpLHRoaXMuaW50ZXJzZWN0c0JveChuKSlyZXR1cm4oYXx8aCkmJihuLmdldENlbnRlcihyKSx0aGlzLmNsb3Nlc3RQb2ludFRvUG9pbnQocixpKSxuLmNsb3Nlc3RQb2ludFRvUG9pbnQoaSxyKSxhJiZhLmNvcHkoaSksaCYmaC5jb3B5KHIpKSwwO2NvbnN0IGw9bypvLGM9bi5taW4sdT1uLm1heCxkPXRoaXMucG9pbnRzO2xldCBtPTEvMDtmb3IobGV0IHQ9MDt0PDg7dCsrKXtjb25zdCBlPWRbdF07ci5jb3B5KGUpLmNsYW1wKGMsdSk7Y29uc3Qgcz1lLmRpc3RhbmNlVG9TcXVhcmVkKHIpO2lmKHM8bSYmKG09cyxhJiZhLmNvcHkoZSksaCYmaC5jb3B5KHIpLHM8bCkpcmV0dXJuIE1hdGguc3FydChzKX1sZXQgeT0wO2ZvcihsZXQgaT0wO2k8MztpKyspZm9yKGxldCByPTA7cjw9MTtyKyspZm9yKGxldCBuPTA7bjw9MTtuKyspe2NvbnN0IG89KGkrMSklMyxhPShpKzIpJTMsaD0xPDxpfHI8PG98bjw8YSxsPWRbcjw8b3xuPDxhXSxtPWRbaF07ZVt5XS5zZXQobCxtKTtjb25zdCBwPXRbaV0seD10W29dLGY9dFthXSxnPXNbeV0sYj1nLnN0YXJ0LHc9Zy5lbmQ7YltwXT1jW3BdLGJbeF09cj9jW3hdOnVbeF0sYltmXT1uP2NbZl06dVt4XSx3W3BdPXVbcF0sd1t4XT1yP2NbeF06dVt4XSx3W2ZdPW4/Y1tmXTp1W3hdLHkrK31mb3IobGV0IHQ9MDt0PD0xO3QrKylmb3IobGV0IGU9MDtlPD0xO2UrKylmb3IobGV0IHM9MDtzPD0xO3MrKyl7ci54PXQ/dS54OmMueCxyLnk9ZT91Lnk6Yy55LHIuej1zP3UuejpjLnosdGhpcy5jbG9zZXN0UG9pbnRUb1BvaW50KHIsaSk7Y29uc3Qgbj1yLmRpc3RhbmNlVG9TcXVhcmVkKGkpO2lmKG48bSYmKG09bixhJiZhLmNvcHkoaSksaCYmaC5jb3B5KHIpLG48bCkpcmV0dXJuIE1hdGguc3FydChuKX1mb3IobGV0IHQ9MDt0PDEyO3QrKyl7Y29uc3Qgbj1lW3RdO2ZvcihsZXQgdD0wO3Q8MTI7dCsrKXtjb25zdCBlPXNbdF07emUobixlLGkscik7Y29uc3Qgbz1pLmRpc3RhbmNlVG9TcXVhcmVkKHIpO2lmKG88bSYmKG09byxhJiZhLmNvcHkoaSksaCYmaC5jb3B5KHIpLG88bCkpcmV0dXJuIE1hdGguc3FydChvKX19cmV0dXJuIE1hdGguc3FydChtKX19KCk7Y29uc3QgQmU9bmV3IEUsVGU9bmV3IEUsRWU9bmV3IEUsa2U9bmV3IGgsUGU9bmV3IGgsQ2U9bmV3IGgsRmU9bmV3IEU7ZnVuY3Rpb24gVmUodCxlLHMsaSxyKXtjb25zdCBuPTMqaSxvPXQuaW5kZXguZ2V0WChuKSxhPXQuaW5kZXguZ2V0WChuKzEpLGw9dC5pbmRleC5nZXRYKG4rMiksYz1mdW5jdGlvbih0LGUscyxpLHIsbixvKXtCZS5mcm9tQnVmZmVyQXR0cmlidXRlKGUsaSksVGUuZnJvbUJ1ZmZlckF0dHJpYnV0ZShlLHIpLEVlLmZyb21CdWZmZXJBdHRyaWJ1dGUoZSxuKTtjb25zdCBhPWZ1bmN0aW9uKHQsZSxzLGkscixuKXtsZXQgbztyZXR1cm4gbz0xPT09bj90LmludGVyc2VjdFRyaWFuZ2xlKGkscyxlLCEwLHIpOnQuaW50ZXJzZWN0VHJpYW5nbGUoZSxzLGksMiE9PW4sciksbnVsbD09PW8/bnVsbDp7ZGlzdGFuY2U6dC5vcmlnaW4uZGlzdGFuY2VUbyhyKSxwb2ludDpyLmNsb25lKCl9fSh0LEJlLFRlLEVlLEZlLG8pO2lmKGEpe3MmJihrZS5mcm9tQnVmZmVyQXR0cmlidXRlKHMsaSksUGUuZnJvbUJ1ZmZlckF0dHJpYnV0ZShzLHIpLENlLmZyb21CdWZmZXJBdHRyaWJ1dGUocyxuKSxhLnV2PVZ0LmdldFVWKEZlLEJlLFRlLEVlLGtlLFBlLENlLG5ldyBoKSk7Y29uc3QgdD17YTppLGI6cixjOm4sbm9ybWFsOm5ldyBFLG1hdGVyaWFsSW5kZXg6MH07VnQuZ2V0Tm9ybWFsKEJlLFRlLEVlLHQubm9ybWFsKSxhLmZhY2U9dCxhLmZhY2VJbmRleD1pfXJldHVybiBhfShzLHQuYXR0cmlidXRlcy5wb3NpdGlvbix0LmF0dHJpYnV0ZXMudXYsbyxhLGwsZSk7cmV0dXJuIGM/KGMuZmFjZUluZGV4PWksciYmci5wdXNoKGMpLGMpOm51bGx9ZnVuY3Rpb24gUmUodCxlLHMpe3JldHVybiBudWxsPT09dD9udWxsOih0LnBvaW50LmFwcGx5TWF0cml4NChlLm1hdHJpeFdvcmxkKSx0LmRpc3RhbmNlPXQucG9pbnQuZGlzdGFuY2VUbyhzLnJheS5vcmlnaW4pLHQub2JqZWN0PWUsdC5kaXN0YW5jZTxzLm5lYXJ8fHQuZGlzdGFuY2U+cy5mYXI/bnVsbDp0KX1mdW5jdGlvbiBxZSh0LGUscyxpKXtjb25zdCByPXQuYSxuPXQuYixvPXQuYztsZXQgYT1lLGg9ZSsxLGw9ZSsyO3MmJihhPXMuZ2V0WChlKSxoPXMuZ2V0WChlKzEpLGw9cy5nZXRYKGUrMikpLHIueD1pLmdldFgoYSksci55PWkuZ2V0WShhKSxyLno9aS5nZXRaKGEpLG4ueD1pLmdldFgoaCksbi55PWkuZ2V0WShoKSxuLno9aS5nZXRaKGgpLG8ueD1pLmdldFgobCksby55PWkuZ2V0WShsKSxvLno9aS5nZXRaKGwpfWZ1bmN0aW9uIFVlKHQsZSxzLGkscixuLG8pe2NvbnN0IGE9cy5pbmRleCxoPXMuYXR0cmlidXRlcy5wb3NpdGlvbjtmb3IobGV0IHM9dCxsPWUrdDtzPGw7cysrKWlmKHFlKG8sMypzLGEsaCksby5uZWVkc1VwZGF0ZT0hMCxpKG8scyxyLG4pKXJldHVybiEwO3JldHVybiExfWNsYXNzIE9le2NvbnN0cnVjdG9yKHQpe3RoaXMuX2dldE5ld1ByaW1pdGl2ZT10LHRoaXMuX3ByaW1pdGl2ZXM9W119Z2V0UHJpbWl0aXZlKCl7Y29uc3QgdD10aGlzLl9wcmltaXRpdmVzO3JldHVybiAwPT09dC5sZW5ndGg/dGhpcy5fZ2V0TmV3UHJpbWl0aXZlKCk6dC5wb3AoKX1yZWxlYXNlUHJpbWl0aXZlKHQpe3RoaXMuX3ByaW1pdGl2ZXMucHVzaCh0KX19ZnVuY3Rpb24gSGUodCxlKXtyZXR1cm4gNjU1MzU9PT1lW3QrMTVdfWZ1bmN0aW9uIEllKHQsZSl7cmV0dXJuIGVbdCs2XX1mdW5jdGlvbiBOZSh0LGUpe3JldHVybiBlW3QrMTRdfWZ1bmN0aW9uIExlKHQpe3JldHVybiB0Kzh9ZnVuY3Rpb24gV2UodCxlKXtyZXR1cm4gZVt0KzZdfWNvbnN0IFhlPW5ldyBDLERlPW5ldyBFLFllPVsieCIsInkiLCJ6Il07ZnVuY3Rpb24gWmUodCxlLHMsaSxyKXtsZXQgbj0yKnQsbz10cyxhPWVzLGg9c3M7aWYoSGUobixhKSl7IWZ1bmN0aW9uKHQsZSxzLGkscixuKXtmb3IobGV0IG89aSxhPWkrcjtvPGE7bysrKVZlKHQsZSxzLG8sbil9KGUscyxpLEllKHQsaCksTmUobixhKSxyKX1lbHNle2NvbnN0IG49TGUodCk7SmUobixvLGksRGUpJiZaZShuLGUscyxpLHIpO2NvbnN0IGE9V2UodCxoKTtKZShhLG8saSxEZSkmJlplKGEsZSxzLGkscil9fWZ1bmN0aW9uIEdlKHQsZSxzLGkpe2xldCByPTIqdCxuPXRzLG89ZXMsYT1zcztpZihIZShyLG8pKXtyZXR1cm4gZnVuY3Rpb24odCxlLHMsaSxyKXtsZXQgbj0xLzAsbz1udWxsO2ZvcihsZXQgYT1pLGg9aStyO2E8aDthKyspe2NvbnN0IGk9VmUodCxlLHMsYSk7aSYmaS5kaXN0YW5jZTxuJiYobz1pLG49aS5kaXN0YW5jZSl9cmV0dXJuIG99KGUscyxpLEllKHQsYSksTmUocixvKSl9e2NvbnN0IHI9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZVt0KzddfSh0LGEpLG89WWVbcl0saD1pLmRpcmVjdGlvbltvXT49MDtsZXQgbCxjO2g/KGw9TGUodCksYz1XZSh0LGEpKToobD1XZSh0LGEpLGM9TGUodCkpO2NvbnN0IHU9SmUobCxuLGksRGUpP0dlKGwsZSxzLGkpOm51bGw7aWYodSl7Y29uc3QgdD11LnBvaW50W29dO2lmKGg/dDw9bltjK3JdOnQ+PW5bYytyKzNdKXJldHVybiB1fWNvbnN0IGQ9SmUoYyxuLGksRGUpP0dlKGMsZSxzLGkpOm51bGw7cmV0dXJuIHUmJmQ/dS5kaXN0YW5jZTw9ZC5kaXN0YW5jZT91OmQ6dXx8ZHx8bnVsbH19Y29uc3QgamU9ZnVuY3Rpb24oKXtsZXQgdCxlO2NvbnN0IHM9W10saT1uZXcgT2UoKCgpPT5uZXcgQykpO3JldHVybiBmdW5jdGlvbigpe3Q9aS5nZXRQcmltaXRpdmUoKSxlPWkuZ2V0UHJpbWl0aXZlKCkscy5wdXNoKHQsZSk7Y29uc3Qgbj1yKC4uLmFyZ3VtZW50cyk7aS5yZWxlYXNlUHJpbWl0aXZlKHQpLGkucmVsZWFzZVByaW1pdGl2ZShlKSxzLnBvcCgpLHMucG9wKCk7Y29uc3Qgbz1zLmxlbmd0aDtyZXR1cm4gbz4wJiYoZT1zW28tMV0sdD1zW28tMl0pLG59O2Z1bmN0aW9uIHIocyxpLG4sbyl7bGV0IGE9YXJndW1lbnRzLmxlbmd0aD40JiZ2b2lkIDAhPT1hcmd1bWVudHNbNF0/YXJndW1lbnRzWzRdOm51bGwsaD1hcmd1bWVudHMubGVuZ3RoPjUmJnZvaWQgMCE9PWFyZ3VtZW50c1s1XT9hcmd1bWVudHNbNV06MCxsPWFyZ3VtZW50cy5sZW5ndGg+NiYmdm9pZCAwIT09YXJndW1lbnRzWzZdP2FyZ3VtZW50c1s2XTowO2Z1bmN0aW9uIGModCl7bGV0IGU9Mip0LHM9ZXMsaT1zcztmb3IoOyFIZShlLHMpOyllPTIqKHQ9TGUodCkpO3JldHVybiBJZSh0LGkpfWZ1bmN0aW9uIHUodCl7bGV0IGU9Mip0LHM9ZXMsaT1zcztmb3IoOyFIZShlLHMpOyllPTIqKHQ9V2UodCxpKSk7cmV0dXJuIEllKHQsaSkrTmUoZSxzKX1sZXQgZD0yKnMsbT10cyx5PWVzLHA9c3M7Y29uc3QgeD1IZShkLHkpO2lmKHgpe2NvbnN0IGU9SWUocyxwKSxpPU5lKGQseSk7cmV0dXJuIG9lKHMsbSx0KSxvKGUsaSwhMSxsLGgrcyx0KX17Y29uc3QgZD1MZShzKSx4PVdlKHMscCk7bGV0IGYsZyxiLHcsTT1kLHo9eDtpZihhJiYoYj10LHc9ZSxvZShNLG0sYiksb2UoeixtLHcpLGY9YShiKSxnPWEodyksZzxmKSl7TT14LHo9ZDtjb25zdCB0PWY7Zj1nLGc9dCxiPXd9Ynx8KGI9dCxvZShNLG0sYikpO2NvbnN0IHY9bihiLEhlKDIqTSx5KSxmLGwrMSxoK00pO2xldCBfO2lmKDI9PT12KXtjb25zdCB0PWMoTSk7Xz1vKHQsdShNKS10LCEwLGwrMSxoK00sYil9ZWxzZSBfPXYmJnIoTSxpLG4sbyxhLGgsbCsxKTtpZihfKXJldHVybiEwO3c9ZSxvZSh6LG0sdyk7Y29uc3QgQT1uKHcsSGUoMip6LHkpLGcsbCsxLGgreik7bGV0IFM7aWYoMj09PUEpe2NvbnN0IHQ9Yyh6KTtTPW8odCx1KHopLXQsITAsbCsxLGgreix3KX1lbHNlIFM9QSYmcih6LGksbixvLGEsaCxsKzEpO3JldHVybiEhU319fSgpLFFlPWZ1bmN0aW9uKCl7Y29uc3QgdD1uZXcgQWUsZT1uZXcgQWUscz1uZXcgJCxpPW5ldyBTZSxyPW5ldyBTZTtyZXR1cm4gZnVuY3Rpb24gbihvLGEsaCxsKXtsZXQgYz1hcmd1bWVudHMubGVuZ3RoPjQmJnZvaWQgMCE9PWFyZ3VtZW50c1s0XT9hcmd1bWVudHNbNF06bnVsbCx1PTIqbyxkPXRzLG09ZXMseT1zcztudWxsPT09YyYmKGguYm91bmRpbmdCb3h8fGguY29tcHV0ZUJvdW5kaW5nQm94KCksaS5zZXQoaC5ib3VuZGluZ0JveC5taW4saC5ib3VuZGluZ0JveC5tYXgsbCksYz1pKTtjb25zdCBwPUhlKHUsbSk7aWYoIXApe2NvbnN0IHQ9bys4LGU9eVtvKzZdO29lKHQsZCxYZSk7aWYoYy5pbnRlcnNlY3RzQm94KFhlKSYmbih0LGEsaCxsLGMpKXJldHVybiEwO29lKGUsZCxYZSk7cmV0dXJuISEoYy5pbnRlcnNlY3RzQm94KFhlKSYmbihlLGEsaCxsLGMpKX17Y29uc3QgaT1hLG49aS5pbmRleCxjPWkuYXR0cmlidXRlcy5wb3NpdGlvbixwPWguaW5kZXgseD1oLmF0dHJpYnV0ZXMucG9zaXRpb24sZj1JZShvLHkpLGc9TmUodSxtKTtpZihzLmNvcHkobCkuaW52ZXJ0KCksaC5ib3VuZHNUcmVlKXtvZShvLGQsciksci5tYXRyaXguY29weShzKSxyLm5lZWRzVXBkYXRlPSEwO3JldHVybiBoLmJvdW5kc1RyZWUuc2hhcGVjYXN0KHtpbnRlcnNlY3RzQm91bmRzOnQ9PnIuaW50ZXJzZWN0c0JveCh0KSxpbnRlcnNlY3RzVHJpYW5nbGU6dD0+e3QuYS5hcHBseU1hdHJpeDQobCksdC5iLmFwcGx5TWF0cml4NChsKSx0LmMuYXBwbHlNYXRyaXg0KGwpLHQubmVlZHNVcGRhdGU9ITA7Zm9yKGxldCBzPTMqZixpPTMqKGcrZik7czxpO3MrPTMpaWYocWUoZSxzLG4sYyksZS5uZWVkc1VwZGF0ZT0hMCx0LmludGVyc2VjdHNUcmlhbmdsZShlKSlyZXR1cm4hMDtyZXR1cm4hMX19KX1mb3IobGV0IGk9MypmLHI9ZyszKmY7aTxyO2krPTMpe3FlKHQsaSxuLGMpLHQuYS5hcHBseU1hdHJpeDQocyksdC5iLmFwcGx5TWF0cml4NChzKSx0LmMuYXBwbHlNYXRyaXg0KHMpLHQubmVlZHNVcGRhdGU9ITA7Zm9yKGxldCBzPTAsaT1wLmNvdW50O3M8aTtzKz0zKWlmKHFlKGUscyxwLHgpLGUubmVlZHNVcGRhdGU9ITAsdC5pbnRlcnNlY3RzVHJpYW5nbGUoZSkpcmV0dXJuITB9fX19KCk7ZnVuY3Rpb24gSmUodCxlLHMsaSl7cmV0dXJuIG9lKHQsZSxYZSkscy5pbnRlcnNlY3RCb3goWGUsaSl9Y29uc3QgJGU9W107bGV0IEtlLHRzLGVzLHNzO2Z1bmN0aW9uIGlzKHQpe0tlJiYkZS5wdXNoKEtlKSxLZT10LHRzPW5ldyBGbG9hdDMyQXJyYXkodCksZXM9bmV3IFVpbnQxNkFycmF5KHQpLHNzPW5ldyBVaW50MzJBcnJheSh0KX1mdW5jdGlvbiBycygpe0tlPW51bGwsdHM9bnVsbCxlcz1udWxsLHNzPW51bGwsJGUubGVuZ3RoJiZpcygkZS5wb3AoKSl9Y29uc3QgbnM9U3ltYm9sKCJza2lwIHRyZWUgZ2VuZXJhdGlvbiIpLG9zPW5ldyBDLGFzPW5ldyBDLGhzPW5ldyAkLGxzPW5ldyBTZSxjcz1uZXcgU2UsdXM9bmV3IEUsZHM9bmV3IEUsbXM9bmV3IEUseXM9bmV3IEUscHM9bmV3IEUseHM9bmV3IEMsZnM9bmV3IE9lKCgoKT0+bmV3IEFlKSk7Y2xhc3MgZ3N7c3RhdGljIHNlcmlhbGl6ZSh0KXtsZXQgZT1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06e307aWYoZS5pc0J1ZmZlckdlb21ldHJ5KXJldHVybiBjb25zb2xlLndhcm4oIk1lc2hCVkguc2VyaWFsaXplOiBUaGUgYXJndW1lbnRzIGZvciB0aGUgZnVuY3Rpb24gaGF2ZSBjaGFuZ2VkLiBTZWUgZG9jdW1lbnRhdGlvbiBmb3IgbmV3IHNpZ25hdHVyZS4iKSxncy5zZXJpYWxpemUoYXJndW1lbnRzWzBdLHtjbG9uZUJ1ZmZlcnM6dm9pZCAwPT09YXJndW1lbnRzWzJdfHxhcmd1bWVudHNbMl19KTtlPXtjbG9uZUJ1ZmZlcnM6ITAsLi4uZX07Y29uc3Qgcz10Lmdlb21ldHJ5LGk9dC5fcm9vdHMscj1zLmdldEluZGV4KCk7bGV0IG47cmV0dXJuIG49ZS5jbG9uZUJ1ZmZlcnM/e3Jvb3RzOmkubWFwKCh0PT50LnNsaWNlKCkpKSxpbmRleDpyLmFycmF5LnNsaWNlKCl9Ontyb290czppLGluZGV4OnIuYXJyYXl9LG59c3RhdGljIGRlc2VyaWFsaXplKHQsZSl7bGV0IHM9YXJndW1lbnRzLmxlbmd0aD4yJiZ2b2lkIDAhPT1hcmd1bWVudHNbMl0/YXJndW1lbnRzWzJdOnt9O2lmKCJib29sZWFuIj09dHlwZW9mIHMpcmV0dXJuIGNvbnNvbGUud2FybigiTWVzaEJWSC5kZXNlcmlhbGl6ZTogVGhlIGFyZ3VtZW50cyBmb3IgdGhlIGZ1bmN0aW9uIGhhdmUgY2hhbmdlZC4gU2VlIGRvY3VtZW50YXRpb24gZm9yIG5ldyBzaWduYXR1cmUuIiksZ3MuZGVzZXJpYWxpemUoYXJndW1lbnRzWzBdLGFyZ3VtZW50c1sxXSx7c2V0SW5kZXg6dm9pZCAwPT09YXJndW1lbnRzWzJdfHxhcmd1bWVudHNbMl19KTtzPXtzZXRJbmRleDohMCwuLi5zfTtjb25zdHtpbmRleDppLHJvb3RzOnJ9PXQsbj1uZXcgZ3MoZSx7Li4ucyxbbnNdOiEwfSk7aWYobi5fcm9vdHM9cixzLnNldEluZGV4KXtjb25zdCBzPWUuZ2V0SW5kZXgoKTtpZihudWxsPT09cyl7Y29uc3Qgcz1uZXcgVXQodC5pbmRleCwxLCExKTtlLnNldEluZGV4KHMpfWVsc2Ugcy5hcnJheSE9PWkmJihzLmFycmF5LnNldChpKSxzLm5lZWRzVXBkYXRlPSEwKX1yZXR1cm4gbn1jb25zdHJ1Y3Rvcih0KXtsZXQgZT1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06e307aWYoIXQuaXNCdWZmZXJHZW9tZXRyeSl0aHJvdyBuZXcgRXJyb3IoIk1lc2hCVkg6IE9ubHkgQnVmZmVyR2VvbWV0cmllcyBhcmUgc3VwcG9ydGVkLiIpO2lmKHQuaW5kZXgmJnQuaW5kZXguaXNJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZSl0aHJvdyBuZXcgRXJyb3IoIk1lc2hCVkg6IEludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIHRoZSBpbmRleCBhdHRyaWJ1dGUuIik7aWYoZT1PYmplY3QuYXNzaWduKHtzdHJhdGVneTowLG1heERlcHRoOjQwLG1heExlYWZUcmlzOjEwLHZlcmJvc2U6ITAsdXNlU2hhcmVkQXJyYXlCdWZmZXI6ITEsc2V0Qm91bmRpbmdCb3g6ITAsb25Qcm9ncmVzczpudWxsLFtuc106ITF9LGUpLGUudXNlU2hhcmVkQXJyYXlCdWZmZXImJiJ1bmRlZmluZWQiPT10eXBlb2YgU2hhcmVkQXJyYXlCdWZmZXIpdGhyb3cgbmV3IEVycm9yKCJNZXNoQlZIOiBTaGFyZWRBcnJheUJ1ZmZlciBpcyBub3QgYXZhaWxhYmxlLiIpO3RoaXMuX3Jvb3RzPW51bGwsZVtuc118fCh0aGlzLl9yb290cz1mdW5jdGlvbih0LGUpe2NvbnN0IHM9YmUodCxlKTtsZXQgaSxyLG47Y29uc3Qgbz1bXSxhPWUudXNlU2hhcmVkQXJyYXlCdWZmZXI/U2hhcmVkQXJyYXlCdWZmZXI6QXJyYXlCdWZmZXI7Zm9yKGxldCB0PTA7dDxzLmxlbmd0aDt0Kyspe2NvbnN0IGU9c1t0XSxjPW5ldyBhKDMyKmgoZSkpO2k9bmV3IEZsb2F0MzJBcnJheShjKSxyPW5ldyBVaW50MzJBcnJheShjKSxuPW5ldyBVaW50MTZBcnJheShjKSxsKDAsZSksby5wdXNoKGMpfXJldHVybiBvO2Z1bmN0aW9uIGgodCl7cmV0dXJuIHQuY291bnQ/MToxK2godC5sZWZ0KStoKHQucmlnaHQpfWZ1bmN0aW9uIGwodCxlKXtjb25zdCBzPXQvNCxvPXQvMixhPSEhZS5jb3VudCxoPWUuYm91bmRpbmdEYXRhO2ZvcihsZXQgdD0wO3Q8Njt0KyspaVtzK3RdPWhbdF07aWYoYSl7Y29uc3QgaT1lLm9mZnNldCxhPWUuY291bnQ7cmV0dXJuIHJbcys2XT1pLG5bbysxNF09YSxuW28rMTVdPWllLHQrMzJ9e2NvbnN0IGk9ZS5sZWZ0LG49ZS5yaWdodCxvPWUuc3BsaXRBeGlzO2xldCBhO2lmKGE9bCh0KzMyLGkpLGEvND5NYXRoLnBvdygyLDMyKSl0aHJvdyBuZXcgRXJyb3IoIk1lc2hCVkg6IENhbm5vdCBzdG9yZSBjaGlsZCBwb2ludGVyIGdyZWF0ZXIgdGhhbiAzMiBiaXRzLiIpO3JldHVybiByW3MrNl09YS80LGE9bChhLG4pLHJbcys3XT1vLGF9fX0odCxlKSwhdC5ib3VuZGluZ0JveCYmZS5zZXRCb3VuZGluZ0JveCYmKHQuYm91bmRpbmdCb3g9dGhpcy5nZXRCb3VuZGluZ0JveChuZXcgQykpKSx0aGlzLmdlb21ldHJ5PXR9cmVmaXQoKXtsZXQgdD1hcmd1bWVudHMubGVuZ3RoPjAmJnZvaWQgMCE9PWFyZ3VtZW50c1swXT9hcmd1bWVudHNbMF06bnVsbDt0JiZBcnJheS5pc0FycmF5KHQpJiYodD1uZXcgU2V0KHQpKTtjb25zdCBlPXRoaXMuZ2VvbWV0cnkscz1lLmluZGV4LmFycmF5LGk9ZS5hdHRyaWJ1dGVzLnBvc2l0aW9uLHI9aS5hcnJheSxuPWkub2Zmc2V0fHwwO2xldCBvLGEsaCxsLGM9MztpLmlzSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGUmJihjPWkuZGF0YS5zdHJpZGUpO2xldCB1PTA7Y29uc3QgZD10aGlzLl9yb290cztmb3IobGV0IHQ9MCxlPWQubGVuZ3RoO3Q8ZTt0Kyspbz1kW3RdLGE9bmV3IFVpbnQzMkFycmF5KG8pLGg9bmV3IFVpbnQxNkFycmF5KG8pLGw9bmV3IEZsb2F0MzJBcnJheShvKSxtKDAsdSksdSs9by5ieXRlTGVuZ3RoO2Z1bmN0aW9uIG0oZSxpKXtsZXQgbz1hcmd1bWVudHMubGVuZ3RoPjImJnZvaWQgMCE9PWFyZ3VtZW50c1syXSYmYXJndW1lbnRzWzJdO2NvbnN0IHU9MiplLGQ9aFt1KzE1XT09PWllO2lmKGQpe2NvbnN0IHQ9YVtlKzZdO2xldCBpPTEvMCxvPTEvMCxkPTEvMCxtPS0xLzAseT0tMS8wLHA9LTEvMDtmb3IobGV0IGU9Myp0LGE9MyoodCtoW3UrMTRdKTtlPGE7ZSsrKXtjb25zdCB0PXNbZV0qYytuLGE9clt0KzBdLGg9clt0KzFdLGw9clt0KzJdO2E8aSYmKGk9YSksYT5tJiYobT1hKSxoPG8mJihvPWgpLGg+eSYmKHk9aCksbDxkJiYoZD1sKSxsPnAmJihwPWwpfXJldHVybihsW2UrMF0hPT1pfHxsW2UrMV0hPT1vfHxsW2UrMl0hPT1kfHxsW2UrM10hPT1tfHxsW2UrNF0hPT15fHxsW2UrNV0hPT1wKSYmKGxbZSswXT1pLGxbZSsxXT1vLGxbZSsyXT1kLGxbZSszXT1tLGxbZSs0XT15LGxbZSs1XT1wLCEwKX17Y29uc3Qgcz1lKzgscj1hW2UrNl0sbj1zK2ksaD1yK2k7bGV0IGM9byx1PSExLGQ9ITE7dD9jfHwodT10LmhhcyhuKSxkPXQuaGFzKGgpLGM9IXUmJiFkKToodT0hMCxkPSEwKTtjb25zdCB5PWN8fGQ7bGV0IHA9ITE7KGN8fHUpJiYocD1tKHMsaSxjKSk7bGV0IHg9ITE7eSYmKHg9bShyLGksYykpO2NvbnN0IGY9cHx8eDtpZihmKWZvcihsZXQgdD0wO3Q8Mzt0Kyspe2NvbnN0IGk9cyt0LG49cit0LG89bFtpXSxhPWxbaSszXSxoPWxbbl0sYz1sW24rM107bFtlK3RdPW88aD9vOmgsbFtlK3QrM109YT5jP2E6Y31yZXR1cm4gZn19fXRyYXZlcnNlKHQpe2xldCBlPWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTowO2NvbnN0IHM9dGhpcy5fcm9vdHNbZV0saT1uZXcgVWludDMyQXJyYXkocykscj1uZXcgVWludDE2QXJyYXkocyk7IWZ1bmN0aW9uIGUobil7bGV0IG89YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOjA7Y29uc3QgYT0yKm4saD1yW2ErMTVdPT09aWU7aWYoaCl7Y29uc3QgZT1pW24rNl0sbD1yW2ErMTRdO3QobyxoLG5ldyBGbG9hdDMyQXJyYXkocyw0Km4sNiksZSxsKX1lbHNle2NvbnN0IHI9bis4LGE9aVtuKzZdLGw9aVtuKzddO3QobyxoLG5ldyBGbG9hdDMyQXJyYXkocyw0Km4sNiksbCl8fChlKHIsbysxKSxlKGEsbysxKSl9fSgwKX1yYXljYXN0KHQpe2xldCBlPWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTowO2NvbnN0IHM9dGhpcy5fcm9vdHMsaT10aGlzLmdlb21ldHJ5LHI9W10sbj1lLmlzTWF0ZXJpYWwsbz1BcnJheS5pc0FycmF5KGUpLGE9aS5ncm91cHMsaD1uP2Uuc2lkZTplO2ZvcihsZXQgbj0wLGw9cy5sZW5ndGg7bjxsO24rKyl7Y29uc3QgbD1vP2VbYVtuXS5tYXRlcmlhbEluZGV4XS5zaWRlOmgsYz1yLmxlbmd0aDtpZihpcyhzW25dKSxaZSgwLGksbCx0LHIpLHJzKCksbyl7Y29uc3QgdD1hW25dLm1hdGVyaWFsSW5kZXg7Zm9yKGxldCBlPWMscz1yLmxlbmd0aDtlPHM7ZSsrKXJbZV0uZmFjZS5tYXRlcmlhbEluZGV4PXR9fXJldHVybiByfXJheWNhc3RGaXJzdCh0KXtsZXQgZT1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06MDtjb25zdCBzPXRoaXMuX3Jvb3RzLGk9dGhpcy5nZW9tZXRyeSxyPWUuaXNNYXRlcmlhbCxuPUFycmF5LmlzQXJyYXkoZSk7bGV0IG89bnVsbDtjb25zdCBhPWkuZ3JvdXBzLGg9cj9lLnNpZGU6ZTtmb3IobGV0IHI9MCxsPXMubGVuZ3RoO3I8bDtyKyspe2NvbnN0IGw9bj9lW2Fbcl0ubWF0ZXJpYWxJbmRleF0uc2lkZTpoO2lzKHNbcl0pO2NvbnN0IGM9R2UoMCxpLGwsdCk7cnMoKSxudWxsIT1jJiYobnVsbD09b3x8Yy5kaXN0YW5jZTxvLmRpc3RhbmNlKSYmKG89YyxuJiYoYy5mYWNlLm1hdGVyaWFsSW5kZXg9YVtyXS5tYXRlcmlhbEluZGV4KSl9cmV0dXJuIG99aW50ZXJzZWN0c0dlb21ldHJ5KHQsZSl7Y29uc3Qgcz10aGlzLmdlb21ldHJ5O2xldCBpPSExO2Zvcihjb25zdCByIG9mIHRoaXMuX3Jvb3RzKWlmKGlzKHIpLGk9UWUoMCxzLHQsZSkscnMoKSxpKWJyZWFrO3JldHVybiBpfXNoYXBlY2FzdCh0LGUscyl7Y29uc3QgaT10aGlzLmdlb21ldHJ5O2lmKHQgaW5zdGFuY2VvZiBGdW5jdGlvbil7aWYoZSl7Y29uc3QgdD1lO2U9KGUscyxpLHIpPT57Y29uc3Qgbj0zKnM7cmV0dXJuIHQoZSxuLG4rMSxuKzIsaSxyKX19dD17Ym91bmRzVHJhdmVyc2VPcmRlcjpzLGludGVyc2VjdHNCb3VuZHM6dCxpbnRlcnNlY3RzVHJpYW5nbGU6ZSxpbnRlcnNlY3RzUmFuZ2U6bnVsbH0sY29uc29sZS53YXJuKCJNZXNoQlZIOiBTaGFwZWNhc3QgZnVuY3Rpb24gc2lnbmF0dXJlIGhhcyBjaGFuZ2VkIGFuZCBub3cgdGFrZXMgYW4gb2JqZWN0IG9mIGNhbGxiYWNrcyBhcyBhIHNlY29uZCBhcmd1bWVudC4gU2VlIGRvY3MgZm9yIG5ldyBzaWduYXR1cmUuIil9Y29uc3Qgcj1mcy5nZXRQcmltaXRpdmUoKTtsZXR7Ym91bmRzVHJhdmVyc2VPcmRlcjpuLGludGVyc2VjdHNCb3VuZHM6byxpbnRlcnNlY3RzUmFuZ2U6YSxpbnRlcnNlY3RzVHJpYW5nbGU6aH09dDtpZihhJiZoKXtjb25zdCB0PWE7YT0oZSxzLG4sbyxhKT0+ISF0KGUscyxuLG8sYSl8fFVlKGUscyxpLGgsbixvLHIpfWVsc2UgYXx8KGE9aD8odCxlLHMsbik9PlVlKHQsZSxpLGgscyxuLHIpOih0LGUscyk9PnMpO2xldCBsPSExLGM9MDtmb3IoY29uc3QgdCBvZiB0aGlzLl9yb290cyl7aWYoaXModCksbD1qZSgwLGksbyxhLG4sYykscnMoKSxsKWJyZWFrO2MrPXQuYnl0ZUxlbmd0aH1yZXR1cm4gZnMucmVsZWFzZVByaW1pdGl2ZShyKSxsfWJ2aGNhc3QodCxlLHMpe2xldHtpbnRlcnNlY3RzUmFuZ2VzOmksaW50ZXJzZWN0c1RyaWFuZ2xlczpyfT1zO2NvbnN0IG49dGhpcy5nZW9tZXRyeS5pbmRleCxvPXRoaXMuZ2VvbWV0cnkuYXR0cmlidXRlcy5wb3NpdGlvbixhPXQuZ2VvbWV0cnkuaW5kZXgsaD10Lmdlb21ldHJ5LmF0dHJpYnV0ZXMucG9zaXRpb247aHMuY29weShlKS5pbnZlcnQoKTtjb25zdCBsPWZzLmdldFByaW1pdGl2ZSgpLGM9ZnMuZ2V0UHJpbWl0aXZlKCk7aWYocil7ZnVuY3Rpb24gdSh0LHMsaSx1LGQsbSx5LHApe2ZvcihsZXQgeD1pLGY9aSt1O3g8Zjt4Kyspe3FlKGMsMyp4LGEsaCksYy5hLmFwcGx5TWF0cml4NChlKSxjLmIuYXBwbHlNYXRyaXg0KGUpLGMuYy5hcHBseU1hdHJpeDQoZSksYy5uZWVkc1VwZGF0ZT0hMDtmb3IobGV0IGU9dCxpPXQrcztlPGk7ZSsrKWlmKHFlKGwsMyplLG4sbyksbC5uZWVkc1VwZGF0ZT0hMCxyKGwsYyxlLHgsZCxtLHkscCkpcmV0dXJuITB9cmV0dXJuITF9aWYoaSl7Y29uc3QgdD1pO2k9ZnVuY3Rpb24oZSxzLGkscixuLG8sYSxoKXtyZXR1cm4hIXQoZSxzLGkscixuLG8sYSxoKXx8dShlLHMsaSxyLG4sbyxhLGgpfX1lbHNlIGk9dX10LmdldEJvdW5kaW5nQm94KGFzKSxhcy5hcHBseU1hdHJpeDQoZSk7Y29uc3QgZD10aGlzLnNoYXBlY2FzdCh7aW50ZXJzZWN0c0JvdW5kczp0PT5hcy5pbnRlcnNlY3RzQm94KHQpLGludGVyc2VjdHNSYW5nZTooZSxzLHIsbixvLGEpPT4ob3MuY29weShhKSxvcy5hcHBseU1hdHJpeDQoaHMpLHQuc2hhcGVjYXN0KHtpbnRlcnNlY3RzQm91bmRzOnQ9Pm9zLmludGVyc2VjdHNCb3godCksaW50ZXJzZWN0c1JhbmdlOih0LHIsYSxoLGwpPT5pKGUscyx0LHIsbixvLGgsbCl9KSl9KTtyZXR1cm4gZnMucmVsZWFzZVByaW1pdGl2ZShsKSxmcy5yZWxlYXNlUHJpbWl0aXZlKGMpLGR9aW50ZXJzZWN0c0JveCh0LGUpe3JldHVybiBscy5zZXQodC5taW4sdC5tYXgsZSksbHMubmVlZHNVcGRhdGU9ITAsdGhpcy5zaGFwZWNhc3Qoe2ludGVyc2VjdHNCb3VuZHM6dD0+bHMuaW50ZXJzZWN0c0JveCh0KSxpbnRlcnNlY3RzVHJpYW5nbGU6dD0+bHMuaW50ZXJzZWN0c1RyaWFuZ2xlKHQpfSl9aW50ZXJzZWN0c1NwaGVyZSh0KXtyZXR1cm4gdGhpcy5zaGFwZWNhc3Qoe2ludGVyc2VjdHNCb3VuZHM6ZT0+dC5pbnRlcnNlY3RzQm94KGUpLGludGVyc2VjdHNUcmlhbmdsZTplPT5lLmludGVyc2VjdHNTcGhlcmUodCl9KX1jbG9zZXN0UG9pbnRUb0dlb21ldHJ5KHQsZSl7bGV0IHM9YXJndW1lbnRzLmxlbmd0aD4yJiZ2b2lkIDAhPT1hcmd1bWVudHNbMl0/YXJndW1lbnRzWzJdOnt9LGk9YXJndW1lbnRzLmxlbmd0aD4zJiZ2b2lkIDAhPT1hcmd1bWVudHNbM10/YXJndW1lbnRzWzNdOnt9LHI9YXJndW1lbnRzLmxlbmd0aD40JiZ2b2lkIDAhPT1hcmd1bWVudHNbNF0/YXJndW1lbnRzWzRdOjAsbj1hcmd1bWVudHMubGVuZ3RoPjUmJnZvaWQgMCE9PWFyZ3VtZW50c1s1XT9hcmd1bWVudHNbNV06MS8wO3QuYm91bmRpbmdCb3h8fHQuY29tcHV0ZUJvdW5kaW5nQm94KCksbHMuc2V0KHQuYm91bmRpbmdCb3gubWluLHQuYm91bmRpbmdCb3gubWF4LGUpLGxzLm5lZWRzVXBkYXRlPSEwO2NvbnN0IG89dGhpcy5nZW9tZXRyeSxhPW8uYXR0cmlidXRlcy5wb3NpdGlvbixoPW8uaW5kZXgsbD10LmF0dHJpYnV0ZXMucG9zaXRpb24sYz10LmluZGV4LHU9ZnMuZ2V0UHJpbWl0aXZlKCksZD1mcy5nZXRQcmltaXRpdmUoKTtsZXQgbT1kcyx5PW1zLHA9bnVsbCx4PW51bGw7aSYmKHA9eXMseD1wcyk7bGV0IGY9MS8wLGc9bnVsbCxiPW51bGw7cmV0dXJuIGhzLmNvcHkoZSkuaW52ZXJ0KCksY3MubWF0cml4LmNvcHkoaHMpLHRoaXMuc2hhcGVjYXN0KHtib3VuZHNUcmF2ZXJzZU9yZGVyOnQ9PmxzLmRpc3RhbmNlVG9Cb3godCksaW50ZXJzZWN0c0JvdW5kczoodCxlLHMpPT5zPGYmJnM8biYmKGUmJihjcy5taW4uY29weSh0Lm1pbiksY3MubWF4LmNvcHkodC5tYXgpLGNzLm5lZWRzVXBkYXRlPSEwKSwhMCksaW50ZXJzZWN0c1JhbmdlOihzLGkpPT57aWYodC5ib3VuZHNUcmVlKXJldHVybiB0LmJvdW5kc1RyZWUuc2hhcGVjYXN0KHtib3VuZHNUcmF2ZXJzZU9yZGVyOnQ9PmNzLmRpc3RhbmNlVG9Cb3godCksaW50ZXJzZWN0c0JvdW5kczoodCxlLHMpPT5zPGYmJnM8bixpbnRlcnNlY3RzUmFuZ2U6KHQsbik9Pntmb3IobGV0IG89Myp0LHc9MyoodCtuKTtvPHc7bys9Myl7cWUoZCxvLGMsbCksZC5hLmFwcGx5TWF0cml4NChlKSxkLmIuYXBwbHlNYXRyaXg0KGUpLGQuYy5hcHBseU1hdHJpeDQoZSksZC5uZWVkc1VwZGF0ZT0hMDtmb3IobGV0IHQ9MypzLGU9MyoocytpKTt0PGU7dCs9Myl7cWUodSx0LGgsYSksdS5uZWVkc1VwZGF0ZT0hMDtjb25zdCBlPXUuZGlzdGFuY2VUb1RyaWFuZ2xlKGQsbSxwKTtpZihlPGYmJih5LmNvcHkobSkseCYmeC5jb3B5KHApLGY9ZSxnPXQvMyxiPW8vMyksZTxyKXJldHVybiEwfX19fSk7Zm9yKGxldCB0PTAsbj1jP2MuY291bnQ6bC5jb3VudDt0PG47dCs9Myl7cWUoZCx0LGMsbCksZC5hLmFwcGx5TWF0cml4NChlKSxkLmIuYXBwbHlNYXRyaXg0KGUpLGQuYy5hcHBseU1hdHJpeDQoZSksZC5uZWVkc1VwZGF0ZT0hMDtmb3IobGV0IGU9MypzLG49MyoocytpKTtlPG47ZSs9Myl7cWUodSxlLGgsYSksdS5uZWVkc1VwZGF0ZT0hMDtjb25zdCBzPXUuZGlzdGFuY2VUb1RyaWFuZ2xlKGQsbSxwKTtpZihzPGYmJih5LmNvcHkobSkseCYmeC5jb3B5KHApLGY9cyxnPWUvMyxiPXQvMyksczxyKXJldHVybiEwfX19fSksZnMucmVsZWFzZVByaW1pdGl2ZSh1KSxmcy5yZWxlYXNlUHJpbWl0aXZlKGQpLGY9PT0xLzA/bnVsbDoocy5wb2ludD9zLnBvaW50LmNvcHkoeSk6cy5wb2ludD15LmNsb25lKCkscy5kaXN0YW5jZT1mLHMuZmFjZUluZGV4PWcsaSYmKGkucG9pbnQ/aS5wb2ludC5jb3B5KHgpOmkucG9pbnQ9eC5jbG9uZSgpLGkucG9pbnQuYXBwbHlNYXRyaXg0KGhzKSx5LmFwcGx5TWF0cml4NChocyksaS5kaXN0YW5jZT15LnN1YihpLnBvaW50KS5sZW5ndGgoKSxpLmZhY2VJbmRleD1iKSxzKX1jbG9zZXN0UG9pbnRUb1BvaW50KHQpe2xldCBlPWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTp7fSxzPWFyZ3VtZW50cy5sZW5ndGg+MiYmdm9pZCAwIT09YXJndW1lbnRzWzJdP2FyZ3VtZW50c1syXTowLGk9YXJndW1lbnRzLmxlbmd0aD4zJiZ2b2lkIDAhPT1hcmd1bWVudHNbM10/YXJndW1lbnRzWzNdOjEvMDtjb25zdCByPXMqcyxuPWkqaTtsZXQgbz0xLzAsYT1udWxsO2lmKHRoaXMuc2hhcGVjYXN0KHtib3VuZHNUcmF2ZXJzZU9yZGVyOmU9Pih1cy5jb3B5KHQpLmNsYW1wKGUubWluLGUubWF4KSx1cy5kaXN0YW5jZVRvU3F1YXJlZCh0KSksaW50ZXJzZWN0c0JvdW5kczoodCxlLHMpPT5zPG8mJnM8bixpbnRlcnNlY3RzVHJpYW5nbGU6KGUscyk9PntlLmNsb3Nlc3RQb2ludFRvUG9pbnQodCx1cyk7Y29uc3QgaT10LmRpc3RhbmNlVG9TcXVhcmVkKHVzKTtyZXR1cm4gaTxvJiYoZHMuY29weSh1cyksbz1pLGE9cyksaTxyfX0pLG89PT0xLzApcmV0dXJuIG51bGw7Y29uc3QgaD1NYXRoLnNxcnQobyk7cmV0dXJuIGUucG9pbnQ/ZS5wb2ludC5jb3B5KGRzKTplLnBvaW50PWRzLmNsb25lKCksZS5kaXN0YW5jZT1oLGUuZmFjZUluZGV4PWEsZX1nZXRCb3VuZGluZ0JveCh0KXt0Lm1ha2VFbXB0eSgpO3JldHVybiB0aGlzLl9yb290cy5mb3JFYWNoKChlPT57b2UoMCxuZXcgRmxvYXQzMkFycmF5KGUpLHhzKSx0LnVuaW9uKHhzKX0pKSx0fX1jb25zdCBicz1ncy5wcm90b3R5cGUucmF5Y2FzdDtncy5wcm90b3R5cGUucmF5Y2FzdD1mdW5jdGlvbigpe2Zvcih2YXIgdD1hcmd1bWVudHMubGVuZ3RoLGU9bmV3IEFycmF5KHQpLHM9MDtzPHQ7cysrKWVbc109YXJndW1lbnRzW3NdO2lmKGVbMF0uaXNNZXNoKXtjb25zb2xlLndhcm4oJ01lc2hCVkg6IFRoZSBmdW5jdGlvbiBzaWduYXR1cmUgYW5kIHJlc3VsdHMgZnJhbWUgZm9yICJyYXljYXN0IiBoYXMgY2hhbmdlZC4gU2VlIGRvY3MgZm9yIG5ldyBzaWduYXR1cmUuJyk7Y29uc3RbdCxzLGkscl09ZTtyZXR1cm4gYnMuY2FsbCh0aGlzLGksdC5tYXRlcmlhbCkuZm9yRWFjaCgoZT0+eyhlPVJlKGUsdCxzKSkmJnIucHVzaChlKX0pKSxyfXJldHVybiBicy5hcHBseSh0aGlzLGUpfTtjb25zdCB3cz1ncy5wcm90b3R5cGUucmF5Y2FzdEZpcnN0O2dzLnByb3RvdHlwZS5yYXljYXN0Rmlyc3Q9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9YXJndW1lbnRzLmxlbmd0aCxlPW5ldyBBcnJheSh0KSxzPTA7czx0O3MrKyllW3NdPWFyZ3VtZW50c1tzXTtpZihlWzBdLmlzTWVzaCl7Y29uc29sZS53YXJuKCdNZXNoQlZIOiBUaGUgZnVuY3Rpb24gc2lnbmF0dXJlIGFuZCByZXN1bHRzIGZyYW1lIGZvciAicmF5Y2FzdEZpcnN0IiBoYXMgY2hhbmdlZC4gU2VlIGRvY3MgZm9yIG5ldyBzaWduYXR1cmUuJyk7Y29uc3RbdCxzLGldPWU7cmV0dXJuIFJlKHdzLmNhbGwodGhpcyxpLHQubWF0ZXJpYWwpLHQscyl9cmV0dXJuIHdzLmFwcGx5KHRoaXMsZSl9O2NvbnN0IE1zPWdzLnByb3RvdHlwZS5jbG9zZXN0UG9pbnRUb1BvaW50O2dzLnByb3RvdHlwZS5jbG9zZXN0UG9pbnRUb1BvaW50PWZ1bmN0aW9uKCl7Zm9yKHZhciB0PWFyZ3VtZW50cy5sZW5ndGgsZT1uZXcgQXJyYXkodCkscz0wO3M8dDtzKyspZVtzXT1hcmd1bWVudHNbc107aWYoZVswXS5pc01lc2gpe2NvbnNvbGUud2FybignTWVzaEJWSDogVGhlIGZ1bmN0aW9uIHNpZ25hdHVyZSBhbmQgcmVzdWx0cyBmcmFtZSBmb3IgImNsb3Nlc3RQb2ludFRvUG9pbnQiIGhhcyBjaGFuZ2VkLiBTZWUgZG9jcyBmb3IgbmV3IHNpZ25hdHVyZS4nKSxlLnVuc2hpZnQoKTtjb25zdCB0PWVbMV0scz17fTtyZXR1cm4gZVsxXT1zLE1zLmFwcGx5KHRoaXMsZSksdCYmdC5jb3B5KHMucG9pbnQpLHMuZGlzdGFuY2V9cmV0dXJuIE1zLmFwcGx5KHRoaXMsZSl9O2NvbnN0IHpzPWdzLnByb3RvdHlwZS5jbG9zZXN0UG9pbnRUb0dlb21ldHJ5O2dzLnByb3RvdHlwZS5jbG9zZXN0UG9pbnRUb0dlb21ldHJ5PWZ1bmN0aW9uKCl7Zm9yKHZhciB0PWFyZ3VtZW50cy5sZW5ndGgsZT1uZXcgQXJyYXkodCkscz0wO3M8dDtzKyspZVtzXT1hcmd1bWVudHNbc107Y29uc3QgaT1lWzJdLHI9ZVszXTtpZihpJiZpLmlzVmVjdG9yM3x8ciYmci5pc1ZlY3RvcjMpe2NvbnNvbGUud2FybignTWVzaEJWSDogVGhlIGZ1bmN0aW9uIHNpZ25hdHVyZSBhbmQgcmVzdWx0cyBmcmFtZSBmb3IgImNsb3Nlc3RQb2ludFRvR2VvbWV0cnkiIGhhcyBjaGFuZ2VkLiBTZWUgZG9jcyBmb3IgbmV3IHNpZ25hdHVyZS4nKTtjb25zdCB0PXt9LHM9e30sbj1lWzFdO3JldHVybiBlWzJdPXQsZVszXT1zLHpzLmFwcGx5KHRoaXMsZSksaSYmaS5jb3B5KHQucG9pbnQpLHImJnIuY29weShzLnBvaW50KS5hcHBseU1hdHJpeDQobiksdC5kaXN0YW5jZX1yZXR1cm4genMuYXBwbHkodGhpcyxlKX07Y29uc3QgdnM9Z3MucHJvdG90eXBlLnJlZml0O2dzLnByb3RvdHlwZS5yZWZpdD1mdW5jdGlvbigpe2Zvcih2YXIgdD1hcmd1bWVudHMubGVuZ3RoLGU9bmV3IEFycmF5KHQpLHM9MDtzPHQ7cysrKWVbc109YXJndW1lbnRzW3NdO2NvbnN0IGk9ZVswXSxyPWVbMV07aWYociYmKHIgaW5zdGFuY2VvZiBTZXR8fEFycmF5LmlzQXJyYXkocikpKXtjb25zb2xlLndhcm4oJ01lc2hCVkg6IFRoZSBmdW5jdGlvbiBzaWduYXR1cmUgZm9yICJyZWZpdCIgaGFzIGNoYW5nZWQuIFNlZSBkb2NzIGZvciBuZXcgc2lnbmF0dXJlLicpO2NvbnN0IHQ9bmV3IFNldDtyLmZvckVhY2goKGU9PnQuYWRkKGUpKSksaSYmaS5mb3JFYWNoKChlPT50LmFkZChlKSkpLHZzLmNhbGwodGhpcyx0KX1lbHNlIHZzLmFwcGx5KHRoaXMsZSl9LFsiaW50ZXJzZWN0c0dlb21ldHJ5Iiwic2hhcGVjYXN0IiwiaW50ZXJzZWN0c0JveCIsImludGVyc2VjdHNTcGhlcmUiXS5mb3JFYWNoKCh0PT57Y29uc3QgZT1ncy5wcm90b3R5cGVbdF07Z3MucHJvdG90eXBlW3RdPWZ1bmN0aW9uKCl7Zm9yKHZhciBzPWFyZ3VtZW50cy5sZW5ndGgsaT1uZXcgQXJyYXkocykscj0wO3I8cztyKyspaVtyXT1hcmd1bWVudHNbcl07cmV0dXJuKG51bGw9PT1pWzBdfHxpWzBdLmlzTWVzaCkmJihpLnNoaWZ0KCksY29uc29sZS53YXJuKGBNZXNoQlZIOiBUaGUgZnVuY3Rpb24gc2lnbmF0dXJlIGZvciAiJHt0fSIgaGFzIGNoYW5nZWQgYW5kIG5vIGxvbmdlciB0YWtlcyBNZXNoLiBTZWUgZG9jcyBmb3IgbmV3IHNpZ25hdHVyZS5gKSksZS5hcHBseSh0aGlzLGkpfX0pKSxvbm1lc3NhZ2U9ZnVuY3Rpb24odCl7bGV0e2RhdGE6ZX09dCxzPXBlcmZvcm1hbmNlLm5vdygpO3RyeXtpZighZSlyZXR1cm4gdm9pZCBwb3N0TWVzc2FnZShlKTtjb25zdHtpbmRleDp0LHBvc2l0aW9uOmksb3B0aW9uczpyfT1lLG49bmV3IEd0O2lmKG4uc2V0QXR0cmlidXRlKCJwb3NpdGlvbiIsbmV3IFV0KGksMywhMSkpLHQmJm4uc2V0SW5kZXgobmV3IFV0KHQsMSwhMSkpLHIuaW5jbHVkZWRQcm9ncmVzc0NhbGxiYWNrJiYoci5vblByb2dyZXNzPWZ1bmN0aW9uKHQpe2NvbnN0IGU9cGVyZm9ybWFuY2Uubm93KCk7KGUtcz49MTB8fDE9PT10KSYmKHBvc3RNZXNzYWdlKHtlcnJvcjpudWxsLHNlcmlhbGl6ZWQ6bnVsbCxwb3NpdGlvbjpudWxsLHByb2dyZXNzOnR9KSxzPWUpfSksci5ncm91cHMpe2NvbnN0IHQ9ci5ncm91cHM7Zm9yKGNvbnN0IGUgaW4gdCl7Y29uc3Qgcz10W2VdO24uYWRkR3JvdXAocy5zdGFydCxzLmNvdW50LHMubWF0ZXJpYWxJbmRleCl9fWNvbnN0IG89bmV3IGdzKG4sciksYT1ncy5zZXJpYWxpemUobyx7Y2xvbmVCdWZmZXJzOiExfSk7cG9zdE1lc3NhZ2Uoe2Vycm9yOm51bGwsc2VyaWFsaXplZDphLHBvc2l0aW9uOmkscHJvZ3Jlc3M6MX0sW2kuYnVmZmVyLC4uLmEucm9vdHNdKX1jYXRjaCh0KXtwb3N0TWVzc2FnZSh7ZXJyb3I6dCxzZXJpYWxpemVkOm51bGwscG9zaXRpb246bnVsbCxwcm9ncmVzczoxfSl9fX0oKTsKCg==",ky=null,Fy=!1,function(e){return Uy=Uy||By(Hy,ky,Fy),new Worker(Uy,e)});const Yy=new class extends fn{constructor(){super(),this.workerPool=new Dy(4),this.computingCount=0,this.workerPool.setWorkerCreator((()=>{const e=new Oy;return e.addEventListener("error",(e=>{throw e.message?new Error(`GenerateMeshBVHWorker: Could not create Web Worker with error "${e.message}"`):new Error("GenerateMeshBVHWorker: Could not create Web Worker.")})),e}))}generate(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};const{workerPool:n}=this;return new Promise(((i,s)=>{!function(e){const t=e.attributes,n=e.morphTargets,i=new Map;for(const e in t){const n=t[e];n.isInterleavedBufferAttribute&&(i.has(n)||i.set(n,wm(n)),t[e]=i.get(n))}for(const e in n){const t=n[e];t.isInterleavedBufferAttribute&&(i.has(t)||i.set(t,wm(t)),n[e]=i.get(t))}}(e);const r=e.index?e.index.array:null,o=e.attributes.position.array;this.computingCount++,n.postMessage({index:r,position:o,options:Object.assign(Object.assign({},t),{onProgress:null,includedProgressCallback:Boolean(t.onProgress),groups:[...e.groups]})}).then((n=>{this.computingCount--;const{data:r}=n;if(r){if(r.error)s(new Error(r.error));else if(r.serialized){const{serialized:n,position:s}=r,o=Ly.deserialize(n,e,{setIndex:!1}),a=Object.assign({setBoundingBox:!1},t);if(e.attributes.position instanceof ul?e.attributes.position.data.array=s:e.attributes.position.array=s,e.index)e.index.array=n.index;else{const t=new Ts(n.index,1,!1);e.setIndex(t)}a.setBoundingBox&&(e.boundingBox=o.getBoundingBox(new li)),i(o)}else t.onProgress&&t.onProgress(r.progress);this.computingCount<=0&&this.dispatchEvent({type:"end"})}}))}))}dispose(){this.workerPool.dispose()}};var Ky=function(){function e(t,n){if(void 0===n&&(n=null),this.nonEmpty=!1,t||n){if(!t)throw new Error("Parameter head cannot be null.");this.head=t,this.tail=n||e.NIL,this.nonEmpty=!0}else{if(e.NIL)throw new Error("Parameters head and tail are null. Use the NIL element instead.");this.nonEmpty=!1}}return Object.defineProperty(e.prototype,"length",{get:function(){if(!this.nonEmpty)return 0;if(this.tail===e.NIL)return 1;for(var t=0,n=this;n.nonEmpty;)++t,n=n.tail;return t},enumerable:!0,configurable:!0}),e.prototype.prepend=function(t){return new e(t,this)},e.prototype.append=function(t){if(!t)return this;if(!this.nonEmpty)return new e(t);if(this.tail===e.NIL)return new e(t).prepend(this.head);for(var n=new e(this.head),i=n,s=this.tail;s.nonEmpty;)i=i.tail=new e(s.head),s=s.tail;return i.tail=new e(t),n},e.prototype.insertWithPriority=function(t){if(!this.nonEmpty)return new e(t);var n=t.priority;if(n>this.head.priority)return this.prepend(t);for(var i=new e(this.head),s=i,r=this.tail;r.nonEmpty;){if(n>r.head.priority)return s.tail=r.prepend(t),i;s=s.tail=new e(r.head),r=r.tail}return s.tail=new e(t),i},e.prototype.filterNot=function(t){if(!this.nonEmpty||null==t)return this;if(t===this.head.listener)return this.tail;for(var n=new e(this.head),i=n,s=this.tail;s.nonEmpty;){if(s.head.listener===t)return i.tail=s.tail,n;i=i.tail=new e(s.head),s=s.tail}return this},e.prototype.contains=function(e){if(!this.nonEmpty)return!1;for(var t=this;t.nonEmpty;){if(t.head.listener===e)return!0;t=t.tail}return!1},e.prototype.find=function(e){if(!this.nonEmpty)return null;for(var t=this;t.nonEmpty;){if(t.head.listener===e)return t.head;t=t.tail}return null},e.prototype.toString=function(){for(var e="",t=this;t.nonEmpty;)e+=t.head+" -> ",t=t.tail;return"[List "+(e+="NIL")+"]"},e.NIL=new e(null,null),e}(),jy=Object.defineProperty({SlotList:Ky},"__esModule",{value:!0}),Jy=function(){function e(e,t,n,i){void 0===n&&(n=!1),void 0===i&&(i=0),this._enabled=!0,this._once=!1,this._priority=0,this._listener=e,this._once=n,this._signal=t,this._priority=i,this.verifyListener(e)}return e.prototype.execute0=function(){this._enabled&&(this._once&&this.remove(),this._params&&this._params.length?this._listener.apply(null,this._params):this._listener())},e.prototype.execute1=function(e){this._enabled&&(this._once&&this.remove(),this._params&&this._params.length?this._listener.apply(null,[e].concat(this._params)):this._listener(e))},e.prototype.execute=function(e){if(this._enabled){this._once&&this.remove(),this._params&&this._params.length&&(e=e.concat(this._params));var t=e.length;0===t?this._listener():1===t?this._listener(e[0]):2===t?this._listener(e[0],e[1]):3===t?this._listener(e[0],e[1],e[2]):this._listener.apply(null,e)}},Object.defineProperty(e.prototype,"listener",{get:function(){return this._listener},set:function(e){if(null==e)throw new Error("Given listener is null.\nDid you want to set enabled to false instead?");this.verifyListener(e),this._listener=e},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"once",{get:function(){return this._once},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"priority",{get:function(){return this._priority},enumerable:!0,configurable:!0}),e.prototype.toString=function(){return"[Slot listener: "+this._listener+", once: "+this._once+", priority: "+this._priority+", enabled: "+this._enabled+"]"},Object.defineProperty(e.prototype,"enabled",{get:function(){return this._enabled},set:function(e){this._enabled=e},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"params",{get:function(){return this._params},set:function(e){this._params=e},enumerable:!0,configurable:!0}),e.prototype.remove=function(){this._signal.remove(this._listener)},e.prototype.verifyListener=function(e){if(null==e)throw new Error("Given listener is null.");if(null==this._signal)throw new Error("Internal signal reference has not been set yet.")},e}(),Qy=Object.defineProperty({Slot:Jy},"__esModule",{value:!0}),qy=function(){function e(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];this.slots=jy.SlotList.NIL,this.valueClasses=1===e.length&&e[0]instanceof Array?e[0]:e}return Object.defineProperty(e.prototype,"valueClasses",{get:function(){return this._valueClasses},set:function(e){this._valueClasses=e?e.slice():[];for(var t=this._valueClasses.length;t--;)if(!(this._valueClasses[t]instanceof Object))throw new Error("Invalid valueClasses argument: item at index "+t+" should be a Class but was:<"+this._valueClasses[t]+">."+this._valueClasses[t])},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"numListeners",{get:function(){return this.slots.length},enumerable:!0,configurable:!0}),e.prototype.addOnce=function(e){return this.registerListener(e,!0)},e.prototype.remove=function(e){var t=this.slots.find(e);return t?(this.slots=this.slots.filterNot(e),t):null},e.prototype.removeAll=function(){this.slots=jy.SlotList.NIL},e.prototype.dispatch=function(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];var n=this._valueClasses.length,i=e.length;if(i<n)throw new Error("Incorrect number of arguments. Expected at least "+n+" but received "+i+".");for(var s=0;s<n;s++)if(!(null===e[s]||e[s]instanceof this._valueClasses[s]||e[s].constructor===this._valueClasses[s]))throw new Error("Value object <"+e[s]+"> is not an instance of <"+this._valueClasses[s]+">.");var r=this.slots;if(r.nonEmpty)for(;r.nonEmpty;)r.head.execute(e),r=r.tail},e.prototype.registerListener=function(e,t){if(void 0===t&&(t=!1),this.registrationPossible(e,t)){var n=new Qy.Slot(e,this,t);return this.slots=this.slots.prepend(n),n}return this.slots.find(e)},e.prototype.registrationPossible=function(e,t){if(!this.slots.nonEmpty)return!0;var n=this.slots.find(e);if(!n)return!0;if(n.once!==t)throw new Error("You cannot addOnce() then add() the same listener without removing the relationship first.");return!1},e}(),$y=Object.defineProperty({OnceSignal:qy},"__esModule",{value:!0}),eb="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{};function tb(e){if(e.__esModule)return e;var t=Object.defineProperty({},"__esModule",{value:!0});return Object.keys(e).forEach((function(n){var i=Object.getOwnPropertyDescriptor(e,n);Object.defineProperty(t,n,i.get?i:{enumerable:!0,get:function(){return e[n]}})})),t}function nb(e){var t={exports:{}};return e(t,t.exports),t.exports}function ib(e){throw new Error('Could not dynamically require "'+e+'". Please configure the dynamicRequireTargets option of @rollup/plugin-commonjs appropriately for this require call to behave properly.')}var sb=tb(pf),rb=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return sb.__extends(t,e),t.prototype.add=function(e){return this.registerListener(e)},t}($y.OnceSignal),ob=Object.defineProperty({Signal:rb},"__esModule",{value:!0}),ab=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return sb.__extends(t,e),t.prototype.addWithPriority=function(e,t){return void 0===t&&(t=0),this.registerListenerWithPriority(e,!1,t)},t.prototype.addOnceWithPriority=function(e,t){return void 0===t&&(t=0),this.registerListenerWithPriority(e,!0,t)},t.prototype.registerListener=function(e,t){return void 0===t&&(t=!1),this.registerListenerWithPriority(e,t)},t.prototype.registerListenerWithPriority=function(e,t,n){if(void 0===n&&(n=0),this.registrationPossible(e,t)){var i=new Qy.Slot(e,this,t,n);return this.slots=this.slots.insertWithPriority(i),i}return this.slots.find(e)},t}(ob.Signal),lb=Object.defineProperty({PrioritySignal:ab},"__esModule",{value:!0}),cb=function(e){function t(t){void 0===t&&(t=null);for(var n=[],i=1;i<arguments.length;i++)n[i-1]=arguments[i];var s=this;return n=1===n.length&&n[0]instanceof Array?n[0]:n,(s=e.call(this,n)||this)._target=t,s}return sb.__extends(t,e),Object.defineProperty(t.prototype,"target",{get:function(){return this._target},set:function(e){e!==this._target&&(this.removeAll(),this._target=e)},enumerable:!0,configurable:!0}),t.prototype.dispatch=function(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];var n=this._valueClasses.length,i=e.length;if(i<n)throw new Error("Incorrect number of arguments. Expected at least "+n+" but received "+i+".");for(var s=0;s<n;s++)if(null!==e[s]&&e[s].constructor!==this._valueClasses[s])throw new Error("Value object <"+e[s]+"> is not an instance of <"+this._valueClasses[s]+">.");var r=e[0];r&&(r.target&&(r=r.clone(),e[0]=r),r.target=this.target,r.currentTarget=this.target,r.signal=this);for(var o=this.slots;o.nonEmpty;)o.head.execute(e),o=o.tail;if(r&&r.bubbles)for(var a=this.target;a&&a.hasOwnProperty("parent")&&(null===(a=a.parent).onEventBubbled||(r.currentTarget=a,a.onEventBubbled(r))););},t}(lb.PrioritySignal),hb=Object.defineProperty({DeluxeSignal:cb},"__esModule",{value:!0}),db=function(){function e(e){void 0===e&&(e=!1),this._bubbles=e}return Object.defineProperty(e.prototype,"signal",{get:function(){return this._signal},set:function(e){this._signal=e},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"target",{get:function(){return this._target},set:function(e){this._target=e},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"currentTarget",{get:function(){return this._currentTarget},set:function(e){this._currentTarget=e},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"bubbles",{get:function(){return this._bubbles},set:function(e){this._bubbles=e},enumerable:!0,configurable:!0}),e.prototype.clone=function(){return new e(this._bubbles)},e}(),ub=Object.defineProperty({GenericEvent:db},"__esModule",{value:!0}),pb=Symbol("IOnceSignal"),mb=Object.defineProperty({IOnceSignal:pb},"__esModule",{value:!0}),fb=Symbol("IPrioritySignal"),gb=Object.defineProperty({IPrioritySignal:fb},"__esModule",{value:!0}),yb=Symbol("ISignal"),bb=Object.defineProperty({ISignal:yb},"__esModule",{value:!0}),vb=Symbol("ISlot"),xb=Object.defineProperty({ISlot:vb},"__esModule",{value:!0}),wb=function(){function e(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];this.valueClasses=1===e.length&&e[0]instanceof Array?e[0]:e}return Object.defineProperty(e.prototype,"valueClasses",{get:function(){return this._valueClasses},set:function(e){this._valueClasses=e?e.slice():[];for(var t=this._valueClasses.length;t--;)if("function"!=typeof this._valueClasses[t])throw new Error("Invalid valueClasses argument: item at index "+t+" should be a Class but was:<"+this._valueClasses[t]+"'>."+this._valueClasses[t])},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"numListeners",{get:function(){return this.slot?1:0},enumerable:!0,configurable:!0}),e.prototype.add=function(e){return this.registerListener(e)},e.prototype.addOnce=function(e){return this.registerListener(e,!0)},e.prototype.remove=function(e){if(this.slot&&this.slot.listener===e){var t=this.slot;return this.slot=null,t}return null},e.prototype.removeAll=function(){this.slot&&this.slot.remove()},e.prototype.dispatch=function(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];var n=this._valueClasses.length,i=e.length;if(i<n)throw new Error("Incorrect number of arguments. Expected at least "+n+" but received "+i+".");for(var s=0;s<n;s++)if(!(null===e[s]||e[s]instanceof this._valueClasses[s]||e[s].constructor===this._valueClasses[s]))throw new Error("Value object <"+e[s]+"> is not an instance of <"+this._valueClasses[s]+">.");this.slot&&this.slot.execute(e)},e.prototype.registerListener=function(e,t){if(void 0===t&&(t=!1),this.slot)throw new Error("You cannot add or addOnce with a listener already added, remove the current listener first.");return this.slot=new Qy.Slot(e,this,t)},e}(),Sb=Object.defineProperty({MonoSignal:wb},"__esModule",{value:!0}),Mb=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return sb.__extends(t,e),t.prototype.addOnce=function(t){var n=e.prototype.addOnce.call(this,t);return this.isDispatched&&(n.execute(this.valueObjects),n.remove()),n},t.prototype.dispatch=function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];if(this.isDispatched)throw new Error("You cannot dispatch() a Promise more than once");this.isDispatched=!0,this.valueObjects=t,e.prototype.dispatch.apply(this,t)},t}($y.OnceSignal),Tb=Object.defineProperty({Promise:Mb},"__esModule",{value:!0});hb.DeluxeSignal,ub.GenericEvent,mb.IOnceSignal,gb.IPrioritySignal,bb.ISignal,xb.ISlot,Sb.MonoSignal,$y.OnceSignal,lb.PrioritySignal,Tb.Promise;var Cb=ob.Signal;Qy.Slot,jy.SlotList;const Lb=new cl;Lb.name="Scene";class Rb{constructor(e,t){this.signals=e,this.viewportState=t,this.scene=Lb.clone(),this.scene.castShadow=!0,this.scene.receiveShadow=!0,this.selectedObjects={edge:[],stroke:[],opacity:[],highlight:[],emissive:[]},this.intersectsList={meshOfModelList:[],poiIconList:[],otherObjList:[],getAll:function(){return[...this.meshOfModelList,...this.poiIconList,...this.otherObjList]}}}addObject(e,t){if(this.viewportState.isDisposed)return this.removeObject(e),void Vm("Scene is disposed");t?t.add(e):this.scene.add(e),this._triggerObjectAdded(e),this.signals.objectAdded.dispatch(e)}removeObject(e){function t(e){var t;(e instanceof ws||e instanceof kh||e instanceof Uh)&&((t=e.map)&&t.isTexture&&t.dispose()),e.dispose()}e.traverse((e=>{if("Mesh"===e.type){const n=e;n.geometry.dispose(),sg(n.material)?n.material.forEach((e=>t(e))):n.material&&t(n.material)}e instanceof CS&&e.element.remove();const{meshOfModelList:n,poiIconList:i,otherObjList:s}=this.intersectsList,r=n.findIndex((t=>t.uuid===e.uuid)),o=i.findIndex((t=>t.uuid===e.uuid)),a=s.findIndex((t=>t.uuid===e.uuid));r>-1&&this.intersectsList.meshOfModelList.splice(r,1),o>-1&&this.intersectsList.poiIconList.splice(o,1),a>-1&&this.intersectsList.otherObjList.splice(a,1)})),e.removeFromParent(),this.signals.objectRemoved.dispatch(e)}openSceneFog(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};const{color:t=13426943,near:n=500,far:i=5e4}=e;this.scene.fog=new ll(t,n,i),this.signals.sceneChanged.dispatch()}closeSceneFog(){this.scene.fog=null,this.signals.sceneChanged.dispatch()}edgeShow(e,t){const n=[],i=e=>{-1===this.selectedObjects.edge.findIndex((t=>t.uuid===e.uuid))&&n.push(e)};return sg(e)?e.forEach((e=>i(e))):rg(e)&&i(e),this.selectedObjects.edge=[...this.selectedObjects.edge,...n],this.signals.outlineChange.dispatch({objects:this.selectedObjects.edge,options:t}),Promise.resolve()}unEdgeShow(e){e||(e=[...this.selectedObjects.edge]);const t=e=>{const t=this.selectedObjects.edge.findIndex((t=>t.uuid===e.uuid));return-1===t||(this.selectedObjects.edge.splice(t,1),this.signals.outlineChange.dispatch({objects:this.selectedObjects.edge})),Promise.resolve()};return sg(e)?Promise.all(e.map((e=>t(e)))):rg(e)?t(e):Promise.resolve()}strokeShow(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};const{isOpacityShow:n=!0,color:i=4647927,opacity:s=.2,edgeColor:r=61183,edgeOpacity:o=1}=t,a=e=>{if(-1!==this.selectedObjects.stroke.findIndex((t=>t.uuid===e.uuid)))return Promise.resolve();if(e.userData.strokeGroup)return Promise.resolve();const t=new MS({id:e.uuid});return e.traverse((n=>{if(n instanceof or){const i=new Jc(n.geometry,89),s=new sc(i,new jl({color:r,transparent:!0,opacity:o}));Ym(s,n),e.attach(s),t.add(s)}})),e.userData.strokeGroup=t,this.addObject(t,e),this.selectedObjects.stroke.push(e),Promise.resolve()};return n&&this.opacityShow(e,{color:i,opacity:s}),sg(e)?Promise.all(e.map((e=>a(e)))):rg(e)?a(e):Promise.resolve()}unStrokeShow(e){e||(e=[...this.selectedObjects.stroke]);const t=e=>{if(!e.userData.strokeGroup)return Promise.resolve();this.removeObject(e.userData.strokeGroup),Reflect.deleteProperty(e.userData,"strokeGroup");const t=this.selectedObjects.stroke.findIndex((t=>t.uuid===e.uuid));return-1===t||(this.selectedObjects.stroke.splice(t,1),this.signals.geometryChanged.dispatch(),this.unOpacityShow(e)),Promise.resolve()};return sg(e)?Promise.all(e.map((e=>t(e)))):rg(e)?t(e):Promise.resolve()}opacityShow(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};const{color:n="#fff",opacity:i=.8}=t;function s(e){return Reflect.construct(e.constructor,[{transparent:!0,depthWrite:!1,side:e.side,color:n,opacity:i}])}const r=e=>(-1!==this.selectedObjects.opacity.findIndex((t=>t.uuid===e.uuid))||(e.traverse((e=>{if(e instanceof or){if(e.userData.material)return;e.userData.material=e.material,sg(e.material)?e.material.forEach(((t,n)=>{e.material[n]=s(t)})):e.material instanceof xs&&(e.material=s(e.material))}})),this.signals.materialChanged.dispatch(),this.selectedObjects.opacity.push(e)),Promise.resolve());return sg(e)?Promise.all(e.map((e=>r(e)))):rg(e)?r(e):Promise.resolve()}unOpacityShow(e){e||(e=[...this.selectedObjects.opacity]);const t=e=>new Promise((t=>{const n=this.selectedObjects.opacity.findIndex((t=>t.uuid===e.uuid));-1===n&&t(),this.selectedObjects.opacity.splice(n,1),e.traverse((e=>{if(e instanceof or){if(!e.userData.material)return;e.material.dispose(),e.material=e.userData.material,Reflect.deleteProperty(e.userData,"material")}})),this.signals.materialChanged.dispatch(),t()}));return sg(e)?Promise.all(e.map((e=>t(e)))):rg(e)?t(e):Promise.resolve()}highlightShow(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};const{color:n="red",opacity:i=1}=t;function s(e){e instanceof kh&&(e.color=new Fn(n),e.opacity=i,e.transparent=i<1)}const r=e=>(-1!==this.selectedObjects.highlight.findIndex((t=>t.uuid===e.uuid))||(e.traverse((e=>{if(e instanceof or){if(e.userData.material)return;e.userData.material=e.material,e.material=ef(e),sg(e.material)?e.material.forEach((e=>s(e))):e.material instanceof xs&&s(e.material)}})),this.signals.materialChanged.dispatch(),this.selectedObjects.highlight.push(e)),Promise.resolve());return sg(e)?Promise.all(e.map((e=>r(e)))):rg(e)?r(e):Promise.resolve()}unHighlightShow(e){e||(e=[...this.selectedObjects.highlight]);const t=e=>new Promise((t=>{const n=this.selectedObjects.highlight.findIndex((t=>t.uuid===e.uuid));-1===n&&t(),this.selectedObjects.highlight.splice(n,1),e.traverse((e=>{if(e instanceof or){if(!e.userData.material)return;e.material=e.userData.material,Reflect.deleteProperty(e.userData,"material")}})),this.signals.materialChanged.dispatch(),t()}));return sg(e)?Promise.all(e.map((e=>t(e)))):rg(e)?t(e):Promise.resolve()}emissiveShow(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};const{color:n="red",opacity:i=.3,maxOpacity:s=1,minOpacity:r=0,duration:o=1e3}=t;function a(e){e instanceof kh&&(e.emissive.set(n),e.emissiveIntensity=i,ug({emissiveIntensity:s},{emissiveIntensity:r},{duration:o,repeat:!0},(t=>e.emissiveIntensity=t.emissiveIntensity),(t=>e.userData.animation=t)))}const l=e=>(-1!==this.selectedObjects.emissive.findIndex((t=>t.uuid===e.uuid))||(e.traverse((e=>{if(e instanceof or){if(e.userData.material)return;e.userData.material=e.material,e.material=ef(e),sg(e.material)?e.material.forEach((e=>a(e))):e.material instanceof xs&&a(e.material)}})),this.selectedObjects.emissive.push(e),this.signals.materialChanged.dispatch()),Promise.resolve());return sg(e)?Promise.all(e.map((e=>l(e)))):rg(e)?l(e):Promise.resolve()}unEmissiveShow(e){function t(e){e.userData.animation&&Zm.remove(e.userData.animation)}e||(e=[...this.selectedObjects.emissive]);const n=e=>new Promise((n=>{const i=this.selectedObjects.emissive.findIndex((t=>t.uuid===e.uuid));-1===i&&n(),this.selectedObjects.emissive.splice(i,1),e.traverse((e=>{if(e instanceof or){if(!e.userData.material)return;sg(e.material)?e.material.forEach((e=>t(e))):e.material instanceof xs&&t(e.material),e.material=e.userData.material,Reflect.deleteProperty(e.userData,"material")}})),this.signals.materialChanged.dispatch(),n()}));return sg(e)?Promise.all(e.map((e=>n(e)))):rg(e)?n(e):Promise.resolve()}_triggerObjectAdded(e){if(e instanceof SS)if("Model"===e.stype||"Topology"===e.stype||"Canvas3D"===e.stype)e.traverse((e=>{if(e instanceof or){-1===this.intersectsList.meshOfModelList.findIndex((t=>t.uuid===e.uuid))&&this.intersectsList.meshOfModelList.push(e)}}));else if("Poi"===e.stype){-1===this.intersectsList.poiIconList.findIndex((t=>t.uuid===e.icon.uuid))&&this.intersectsList.poiIconList.push(e.icon)}else if("BaseMesh"===e.stype){-1===this.intersectsList.otherObjList.findIndex((t=>t.uuid===e.uuid))&&this.intersectsList.otherObjList.push(e)}else"Group"===e.stype&&e.children.forEach((e=>this._triggerObjectAdded(e)));else if(e instanceof xS){-1===this.intersectsList.otherObjList.findIndex((t=>t.uuid===e.uuid))&&this.intersectsList.otherObjList.push(e)}else"Object3D"===e.type&&e.traverse((e=>{if(e instanceof or){-1===this.intersectsList.otherObjList.findIndex((t=>t.uuid===e.uuid))&&this.intersectsList.otherObjList.push(e)}}))}}class Gb extends as{constructor(e){super(),this.element=e,this.element.style.position="absolute",this.addEventListener("removed",(()=>{this.traverse((function(e){e instanceof Gb&&null!==e.element.parentNode&&e.element.parentNode.removeChild(e.element)}))}))}}let Ab,_b;const Ib=new ri,Eb=new Wi,Xb=new Wi,zb={objects:new WeakMap};function Pb(){const e=new ri,t=new ri;return function(n,i){return e.setFromMatrixPosition(n.matrixWorld),t.setFromMatrixPosition(i.matrixWorld),e.distanceToSquared(t)}}function Wb(e){const t=function(e){const t=[];return e.traverse((function(e){e instanceof Gb&&t.push(e)})),t}(e).sort((function(e,t){return zb.objects.get(e).distanceToCameraSquared-zb.objects.get(t).distanceToCameraSquared})),n=t.length;for(let e=0,i=t.length;e<i;e++)t[e].element.style.zIndex=""+(n-e)}class Zb{constructor(e){e||(e=document.createElement("div")),e.style.overflow="hidden",this.domElement=e}setSize(e,t){Ab=e/2,_b=t/2,this.domElement.style.width=e+"px",this.domElement.style.height=t+"px"}renderObject(e,t,n){if(e instanceof Gb){Ib.setFromMatrixPosition(e.matrixWorld),Ib.applyMatrix4(Xb);const t=e.element,i="translate(-50%,-100%) translate("+(Ib.x*Ab+Ab)+"px,"+(-Ib.y*_b+_b)+"px)";t.style.transform=i,t.style.display=e.visible&&Ib.z>=-1&&Ib.z<=1?e.userData.elDisplay||"":"none";const s={distanceToCameraSquared:Pb()(n,e)};zb.objects.set(e,s),t.parentNode!==this.domElement&&this.domElement.appendChild(t)}for(let i=0,s=e.children.length;i<s;i++)this.renderObject(e.children[i],t,n)}render(e,t){!0===e.autoUpdate&&e.updateMatrixWorld(),null===t.parent&&t.updateMatrixWorld(),Eb.copy(t.matrixWorldInverse),Xb.multiplyMatrices(t.projectionMatrix,Eb),this.renderObject(e,e,t),Wb(e)}}class Nb extends as{constructor(e){super(),this.element=e,this.element.style.position="absolute",this.addEventListener("removed",(()=>{this.traverse((function(e){e instanceof Nb&&null!==e.element.parentNode&&e.element.parentNode.removeChild(e.element)}))}))}}let Vb,Db,Bb,Hb;function kb(e){return Math.abs(e)<1e-10?0:e}function Fb(e){const t=e.elements;return"matrix3d("+kb(t[0])+","+kb(-t[1])+","+kb(t[2])+","+kb(t[3])+","+kb(t[4])+","+kb(-t[5])+","+kb(t[6])+","+kb(t[7])+","+kb(t[8])+","+kb(-t[9])+","+kb(t[10])+","+kb(t[11])+","+kb(t[12])+","+kb(-t[13])+","+kb(t[14])+","+kb(t[15])+")"}class Ub{constructor(e,t){this.cache={camera:{fov:0,style:""},objects:new WeakMap},e||(e=document.createElement("div")),e.style.overflow="hidden",e.style.pointerEvents="auto",this.domElement=e,t||(t=document.createElement("div")),t.style.transformStyle="preserve-3d",t.style.pointerEvents="auto",t.style.position="absolute",t.style.top="0",e.appendChild(t),this.cameraElement=t}setSize(e,t){Vb=e/2,Db=t/2,this.domElement.style.width=e+"px",this.domElement.style.height=t+"px",this.cameraElement.style.width=e+"px",this.cameraElement.style.height=t+"px"}renderObject(e,t,n,i){if(e instanceof Nb){const t=function(e,t){const n=e.elements;return"translateX(-50%)matrix3d("+kb(n[0])+","+kb(n[1])+","+kb(n[2])+","+kb(n[3])+","+kb(-n[4])+","+kb(-n[5])+","+kb(-n[6])+","+kb(-n[7])+","+kb(n[8])+","+kb(n[9])+","+kb(n[10])+","+kb(n[11])+","+kb(n[12])+","+kb(n[13])+","+kb(n[14])+","+kb(n[15])+")"}(e.matrixWorld),n=e.element;n.style.transform=t;const i={style:t,distanceToCameraSquared:0};this.cache.objects.set(e,i),n.parentNode!==this.cameraElement&&this.cameraElement.appendChild(n)}for(let s=0,r=e.children.length;s<r;s++)this.renderObject(e.children[s],t,n,i)}render(e,t){const n=t.projectionMatrix.elements[5]*Db;this.cache.camera.fov!==n&&(this.domElement.style.perspective=t instanceof mr?n+"px":"",this.cache.camera.fov=n),!0===e.autoUpdate&&e.updateMatrixWorld(),null===t.parent&&t.updateMatrixWorld();let i="";if(t instanceof Zr){i+="scale("+n+")translateX("+kb(-(t.right+t.left)/2)+"px)"+Fb(t.matrixWorldInverse)}else i+="translateZ("+n+"px)"+Fb(t.matrixWorldInverse);const s=i+"translate("+Vb+"px,"+Db+"px)";this.cameraElement.style.transform=s,this.cache.camera.style=s,this.renderObject(e,e,t,i)}}class Ob extends as{constructor(e){super(),this.element=e,this.element.style.position="absolute",this.addEventListener("removed",(()=>{this.traverse((function(e){e instanceof Ob&&null!==e.element.parentNode&&e.element.parentNode.removeChild(e.element)}))}))}}function Yb(e){return Math.abs(e)<1e-10?0:e}function Kb(e){const t=e.elements;return"matrix3d("+Yb(t[0])+","+Yb(-t[1])+","+Yb(t[2])+","+Yb(t[3])+","+Yb(t[4])+","+Yb(-t[5])+","+Yb(t[6])+","+Yb(t[7])+","+Yb(t[8])+","+Yb(-t[9])+","+Yb(t[10])+","+Yb(t[11])+","+Yb(t[12])+","+Yb(-t[13])+","+Yb(t[14])+","+Yb(t[15])+")"}class jb{constructor(e,t){this.cache={camera:{fov:0,style:""},objects:new WeakMap},e||(e=document.createElement("div")),e.style.overflow="hidden",e.style.pointerEvents="auto",this.domElement=e,t||(t=document.createElement("div")),t.style.transformStyle="preserve-3d",t.style.pointerEvents="auto",t.style.position="absolute",t.style.top="0",e.appendChild(t),this.cameraElement=t}setSize(e,t){Bb=e/2,Hb=t/2,this.domElement.style.width=e+"px",this.domElement.style.height=t+"px",this.cameraElement.style.width=e+"px",this.cameraElement.style.height=t+"px"}renderObject(e,t,n,i){if(e instanceof Ob){const t=n.quaternion.clone();t.x=-n.quaternion.x,t.z=-n.quaternion.z;const i=function(e,t){const n=e.elements;return"translateX(-50%)matrix3d("+Yb(n[0])+","+Yb(-n[1])+","+Yb(n[2])+","+Yb(n[3])+","+Yb(n[4])+","+Yb(-n[5])+","+Yb(n[6])+","+Yb(n[7])+","+Yb(n[8])+","+Yb(-n[9])+","+Yb(n[10])+","+Yb(n[11])+","+Yb(n[12])+","+Yb(n[13])+","+Yb(n[14])+","+Yb(n[15])+")"}((new Wi).compose(e.parent.getWorldPosition(new ri(0,0,0)),t,e.parent.scale)),s=e.element;s.style.transform=i;const r={style:i,distanceToCameraSquared:0};this.cache.objects.set(e,r),s.parentNode!==this.cameraElement&&this.cameraElement.appendChild(s)}for(let s=0,r=e.children.length;s<r;s++)this.renderObject(e.children[s],t,n,i)}render(e,t){const n=t.projectionMatrix.elements[5]*Hb;this.cache.camera.fov!==n&&(this.domElement.style.perspective=t instanceof mr?n+"px":"",this.cache.camera.fov=n),!0===e.autoUpdate&&e.updateMatrixWorld(),null===t.parent&&t.updateMatrixWorld();let i="";if(t instanceof Zr){i+="scale("+n+")translateX("+Yb(-(t.right+t.left)/2)+"px)"+Kb(t.matrixWorldInverse)}else i+="translateZ("+n+"px)"+Kb(t.matrixWorldInverse);const s=i+"translate("+Bb+"px,"+Hb+"px)";this.cameraElement.style.transform=s,this.cache.camera.style=s,this.renderObject(e,e,t,i)}}class Jb{constructor(e){this.options=e,this.internalOptions={enableRenderCss2D:!1,enableRenderCss2DHalf:!1,enableRenderCss3D:!1},this.container=this._initContainer(),this.renderer=this._initRenderer(),this.rendererCSS2D=this._initRenderCSS2D(),this.rendererCSS3D=this._initRenderCSS3D(),this.rendererCSS2DHalf=this._initRenderCSS2DHalf(),this.interactiveContainer=this._initInteractiveContainer()}setInternalState(e,t){this.internalOptions[e]=t}getWidth(){return this.renderer.domElement.width}getHeight(){return this.renderer.domElement.height}getMouseRelativeConRatio(e){const t=this.container.getBoundingClientRect();return[(e.offsetX-t.left)/t.width,(e.offsetY-t.top)/t.height]}getMousePoint(e){const t=new Gn(0,0);return t.fromArray(this.getMouseRelativeConRatio(e)),t}_initContainer(){const e=document.createElement("div");return e.style.position="relative",e.style.width="100%",e.style.height="100%",e}_initRenderer(){const{background:e={},logarithmicDepthBuffer:t}=this.options,{color:n,alpha:i}=e,s=new rl({alpha:i,logarithmicDepthBuffer:t,preserveDrawingBuffer:!0,antialias:!1,stencil:!1,depth:!1,powerPreference:"high-performance"}),r=i?0:1,{offsetWidth:o,offsetHeight:a}=this.container;return s.setSize(o,a),s.setClearColor(n||0,r),s.setPixelRatio(self.devicePixelRatio),s.localClippingEnabled=!0,s.sortObjects=!0,s.shadowMap.enabled=!0,s.shadowMap.type=2,this.container.appendChild(s.domElement),s}_initRenderCSS2D(){const e=new Zb;return e.domElement.id="ssp_view_2DPoi",e.domElement.style.position="absolute",e.domElement.style.top="0",e.domElement.style.width="100%",e.domElement.style.height="100%",e.setSize(this.container.offsetWidth,this.container.offsetHeight),this.container.appendChild(e.domElement),e}_initRenderCSS3D(){const e=new Ub;return e.domElement.id="ssp_view_3DPoi",e.domElement.style.position="absolute",e.domElement.style.top="0",e.domElement.style.width="100%",e.domElement.style.height="100%",e.setSize(this.container.offsetWidth,this.container.offsetHeight),this.container.appendChild(e.domElement),e}_initRenderCSS2DHalf(){const e=new jb(this.rendererCSS3D.domElement,this.rendererCSS3D.cameraElement);return e.setSize(this.container.offsetWidth,this.container.offsetHeight),e}_initInteractiveContainer(){return this.rendererCSS3D.domElement}}const Qb=new Wi,qb=(e,t)=>{const n=Qb.clone(),i=Qb.clone(),s=Qb.clone();n.makeRotationY(e),i.makeRotationX(t);const r=new Oi;return s.multiplyMatrices(n,i),r.setFromRotationMatrix(s),r},$b=qb(-Math.PI/2,-Math.PI/4),ev=qb(Math.PI/2,-Math.PI/4),tv=qb(-Math.PI/4,-Math.PI/4),nv=qb(Math.PI/4,-Math.PI/4),iv=qb(1.25*Math.PI,-Math.PI/4),sv=qb(.75*Math.PI,-Math.PI/4),rv={LEFT:new Oi(0,-Math.PI/2,0),RIGHT:new Oi(0,Math.PI/2,0),FRONT:new Oi(0,0,0),BACK:new Oi(0,Math.PI,0),TOP:new Oi(-Math.PI/2,0,0),BOTTOM:new Oi(Math.PI/2,0,0),FRONTTOP:new Oi(-Math.PI/4,0,0),BACKTOP:new Oi(Math.PI/4,Math.PI,0),LEFTTOP:new Oi($b.x,$b.y,$b.z),RIGHTTOP:new Oi(ev.x,ev.y,ev.z),LEFTFRONTTOP:new Oi(tv.x,tv.y,tv.z),RIGHTFRONTTOP:new Oi(nv.x,nv.y,nv.z),LEFTBACKTOP:new Oi(iv.x,iv.y,iv.z),RIGHTBACKTOP:new Oi(sv.x,sv.y,sv.z)},ov=e=>ig(e)?e:e.includes("%")?.01*Number(e.split("%")[0]):isNaN(+e)?0:Number(e),av=new ri,lv=new Oi,cv=new mr(50,1,.1,5e5);cv.position.set(500,1e3,500),cv.lookAt(av.set(0,0,0)),cv.name="Camera";class hv{constructor(e){this.viewport=e,this.mainCamera=cv.clone(),this.mainCamera.name="freeCamera",this.currentCamera=this.mainCamera,this.cameras={}}createCamera(e){const t=cv.clone();return t.name=e,this.cameras[e]=t,t}removeCamera(e){return"fullFreeCamera"!==e&&(delete this.cameras[e],!0)}setCurrentCamera(e){this.currentCamera=this.viewport.camera=e,this.viewport.signals.cameraObjectChange.dispatch()}getMainCamera(){return this.mainCamera}getCameraViewpoint(){if("free"===this.viewport.controls.options.type)return{position:this.currentCamera.position.clone(),rotation:{x:this.currentCamera.rotation.x,y:this.currentCamera.rotation.y,z:this.currentCamera.rotation.z}};{const e=this.viewport.controls.currentControls;return{position:this.currentCamera.position.clone(),target:e.target.clone()}}}setCameraViewpoint(e){if("free"===this.viewport.controls.options.type&&rg(e)){const{position:t,rotation:n}=e;this.currentCamera.position.set(t.x,t.y,t.z),this.currentCamera.rotation.set(n.x,n.y,n.z)}else if(rg(e)){const{position:t,target:n}=e,i=this.viewport.controls.currentControls;this.currentCamera.position.set(t.x,t.y,t.z),i.target.set(n.x,n.y,n.z)}this.viewport.signals.cameraChange.dispatch(this.currentCamera.position.clone())}moveTo(e,t){return ug(this.currentCamera.position,e,t,(e=>this.viewport.signals.cameraChange.dispatch(e)))}rotateTo(e,t){const n=this.currentCamera.quaternion.clone(),i=(new si).setFromEuler(e);return ug({t:0},{t:1},t,(e=>{let{t:t}=e;this.currentCamera.quaternion.slerpQuaternions(n,i,t)}))}flyTo(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"frontTop",n=arguments.length>2?arguments[2]:void 0;return rf(this,void 0,void 0,(function*(){if(tg(t)){const e=t.toLocaleUpperCase();"CURRENT"===e?lv.copy(this.currentCamera.rotation):rv[e]&&lv.copy(rv[e])}else t instanceof Oi?lv.copy(t):rg(t)&&lv.set(t.x,t.y,t.z);lv.copy(Fm(this.currentCamera.rotation,lv.clone())),yield Promise.all([this.moveTo(e,n),this.rotateTo(lv,n)])}))}flyToBoundingBox(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"frontTop",n=arguments.length>2?arguments[2]:void 0;return rf(this,void 0,void 0,(function*(){if(e.isEmpty())return void Vm("target box is empty");const i=this.viewport.controls.options.type,s=new ri;if(tg(t)){if("CURRENT"===t.toLocaleUpperCase())s.copy(this.getMovePosByBBox(e));else{const n=rv[t.toLocaleUpperCase()],i=this.getObjectLabelPos(e,n);s.copy(i)}}else{"orbit"===i&&Vm("orbit 控制器不支持 Rotation 类型 的 rotation 参数");const n=Bm(t),r=this.getObjectLabelPos(e,n);s.copy(r)}if("orbit"===i){const n=e.getCenter(av),i=this.viewport.controls.currentControls;i.target.copy(n);const r=new Wi;r.lookAt(s,n,i.object.up),t=lv.setFromRotationMatrix(r)}yield this.flyTo(s,t,n)}))}flyToObj(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"frontTop",n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};if(e instanceof AS||e instanceof CS){const{padding:i=50}=n,s=ov(i);return this.flyToBoundingBox(e.getBoundingBox(s),t,n)}{const{padding:i="30%"}=n,s=Hm(e),r=s.getSize(av);let o=0;if(tg(i)){const e=Math.max(r.x,r.y,r.z);o=ov(i)*e}else o=i;let a=o,l=o;if(o<0){const e=Math.min(r.x,r.z),t=r.y-1;a=Math.abs(o)>e?-e:o,l=Math.abs(a)>t?-t:a}return 0!==i&&(s.max.add(av.set(a/2,l/2,a/2)),s.min.sub(av.set(a/2,l/2,a/2))),s.isEmpty()&&(av.setFromMatrixPosition(e.matrixWorld),s.setFromCenterAndSize(av,new ri(0,0,0))),this.flyToBoundingBox(s,t,n)}}surroundOnTarget(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};const{speed:n=1,angle:i=360,onStart:s}=t,r=Dm(e),o=r.clone().setY(this.currentCamera.position.y).distanceTo(this.currentCamera.position),a=Math.abs(i);return ug({angle:0},{angle:Math.PI/180*a},{duration:a/360*5e3/n},(e=>{const t=i>0?e.angle:2*Math.PI-e.angle;if(this.currentCamera.position.x=Math.sin(t)*o+r.x,this.currentCamera.position.z=Math.cos(t)*o+r.z,"orbit"===this.viewport.controls.options.type){const e=this.viewport.controls.currentControls;e.target.copy(r),e.update()}else this.currentCamera.lookAt(r)}),s)}surroundOnObject(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};const n=(new li).setFromObject(e).getCenter(av);return this.surroundOnTarget(n,t)}getMovePosByBBox(e){const t=this.currentCamera.position,n=e.getCenter(av);(new ri).subVectors(n,t).normalize();let i=new Ri;i=e.getBoundingSphere(i);const s=this.currentCamera.fov/2*Math.PI/180,r=Math.sin(s),o=i.radius/r,a=new ri;this.currentCamera.getWorldDirection(a);const l=a.clone();return l.multiplyScalar(-o),n.clone().add(l)}getObjectLabelPos(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"frontTop",n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};if(e instanceof SS&&(e=(new li).setFromObject(e)),e.isEmpty())return Vm("target box is empty"),new ri;const{extendScale:i=1.6,mode:s="scene"}=n;if("scene"===s){const n=e.getCenter(av),s=e.max.clone().sub(e.min),r=Math.max(s.x,s.y,s.z),o=n.clone(),a=e=>{const t=(i-.5)*Math.abs(r),n=Math.max(t,this.viewport.camera.near);o.add(e.multiplyScalar(n))};let l;return l=tg(t)?rv[t.toLocaleUpperCase()]:Bm(t),a(av.set(0,0,1).applyEuler(l)),o}return"screen"===s?e.getCenter(av).clone():new ri}}
20
+ ***************************************************************************** */var tf=function(e,t){return(tf=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n])})(e,t)};var nf=function(){return(nf=Object.assign||function(e){for(var t,n=1,i=arguments.length;n<i;n++)for(var s in t=arguments[n])Object.prototype.hasOwnProperty.call(t,s)&&(e[s]=t[s]);return e}).apply(this,arguments)};function sf(e,t){var n={};for(var i in e)Object.prototype.hasOwnProperty.call(e,i)&&t.indexOf(i)<0&&(n[i]=e[i]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var s=0;for(i=Object.getOwnPropertySymbols(e);s<i.length;s++)t.indexOf(i[s])<0&&Object.prototype.propertyIsEnumerable.call(e,i[s])&&(n[i[s]]=e[i[s]])}return n}function rf(e,t,n,i){return new(n||(n=Promise))((function(s,r){function o(e){try{l(i.next(e))}catch(e){r(e)}}function a(e){try{l(i.throw(e))}catch(e){r(e)}}function l(e){var t;e.done?s(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(o,a)}l((i=i.apply(e,t||[])).next())}))}var of=Object.create?function(e,t,n,i){void 0===i&&(i=n),Object.defineProperty(e,i,{enumerable:!0,get:function(){return t[n]}})}:function(e,t,n,i){void 0===i&&(i=n),e[i]=t[n]};function af(e){var t="function"==typeof Symbol&&Symbol.iterator,n=t&&e[t],i=0;if(n)return n.call(e);if(e&&"number"==typeof e.length)return{next:function(){return e&&i>=e.length&&(e=void 0),{value:e&&e[i++],done:!e}}};throw new TypeError(t?"Object is not iterable.":"Symbol.iterator is not defined.")}function lf(e,t){var n="function"==typeof Symbol&&e[Symbol.iterator];if(!n)return e;var i,s,r=n.call(e),o=[];try{for(;(void 0===t||t-- >0)&&!(i=r.next()).done;)o.push(i.value)}catch(e){s={error:e}}finally{try{i&&!i.done&&(n=r.return)&&n.call(r)}finally{if(s)throw s.error}}return o}function cf(e){return this instanceof cf?(this.v=e,this):new cf(e)}var hf=Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t};function df(e,t){if(!t.has(e))throw new TypeError("attempted to get private field on non-instance");return t.get(e)}function uf(e,t,n){if(!t.has(e))throw new TypeError("attempted to set private field on non-instance");return t.set(e,n),n}var pf=Object.freeze({__proto__:null,__extends:function(e,t){function n(){this.constructor=e}tf(e,t),e.prototype=null===t?Object.create(t):(n.prototype=t.prototype,new n)},get __assign(){return nf},__rest:sf,__decorate:function(e,t,n,i){var s,r=arguments.length,o=r<3?t:null===i?i=Object.getOwnPropertyDescriptor(t,n):i;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,t,n,i);else for(var a=e.length-1;a>=0;a--)(s=e[a])&&(o=(r<3?s(o):r>3?s(t,n,o):s(t,n))||o);return r>3&&o&&Object.defineProperty(t,n,o),o},__param:function(e,t){return function(n,i){t(n,i,e)}},__metadata:function(e,t){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(e,t)},__awaiter:rf,__generator:function(e,t){var n,i,s,r,o={label:0,sent:function(){if(1&s[0])throw s[1];return s[1]},trys:[],ops:[]};return r={next:a(0),throw:a(1),return:a(2)},"function"==typeof Symbol&&(r[Symbol.iterator]=function(){return this}),r;function a(r){return function(a){return function(r){if(n)throw new TypeError("Generator is already executing.");for(;o;)try{if(n=1,i&&(s=2&r[0]?i.return:r[0]?i.throw||((s=i.return)&&s.call(i),0):i.next)&&!(s=s.call(i,r[1])).done)return s;switch(i=0,s&&(r=[2&r[0],s.value]),r[0]){case 0:case 1:s=r;break;case 4:return o.label++,{value:r[1],done:!1};case 5:o.label++,i=r[1],r=[0];continue;case 7:r=o.ops.pop(),o.trys.pop();continue;default:if(!(s=o.trys,(s=s.length>0&&s[s.length-1])||6!==r[0]&&2!==r[0])){o=0;continue}if(3===r[0]&&(!s||r[1]>s[0]&&r[1]<s[3])){o.label=r[1];break}if(6===r[0]&&o.label<s[1]){o.label=s[1],s=r;break}if(s&&o.label<s[2]){o.label=s[2],o.ops.push(r);break}s[2]&&o.ops.pop(),o.trys.pop();continue}r=t.call(e,o)}catch(e){r=[6,e],i=0}finally{n=s=0}if(5&r[0])throw r[1];return{value:r[0]?r[1]:void 0,done:!0}}([r,a])}}},__createBinding:of,__exportStar:function(e,t){for(var n in e)"default"===n||Object.prototype.hasOwnProperty.call(t,n)||of(t,e,n)},__values:af,__read:lf,__spread:function(){for(var e=[],t=0;t<arguments.length;t++)e=e.concat(lf(arguments[t]));return e},__spreadArrays:function(){for(var e=0,t=0,n=arguments.length;t<n;t++)e+=arguments[t].length;var i=Array(e),s=0;for(t=0;t<n;t++)for(var r=arguments[t],o=0,a=r.length;o<a;o++,s++)i[s]=r[o];return i},__await:cf,__asyncGenerator:function(e,t,n){if(!Symbol.asyncIterator)throw new TypeError("Symbol.asyncIterator is not defined.");var i,s=n.apply(e,t||[]),r=[];return i={},o("next"),o("throw"),o("return"),i[Symbol.asyncIterator]=function(){return this},i;function o(e){s[e]&&(i[e]=function(t){return new Promise((function(n,i){r.push([e,t,n,i])>1||a(e,t)}))})}function a(e,t){try{(n=s[e](t)).value instanceof cf?Promise.resolve(n.value.v).then(l,c):h(r[0][2],n)}catch(e){h(r[0][3],e)}var n}function l(e){a("next",e)}function c(e){a("throw",e)}function h(e,t){e(t),r.shift(),r.length&&a(r[0][0],r[0][1])}},__asyncDelegator:function(e){var t,n;return t={},i("next"),i("throw",(function(e){throw e})),i("return"),t[Symbol.iterator]=function(){return this},t;function i(i,s){t[i]=e[i]?function(t){return(n=!n)?{value:cf(e[i](t)),done:"return"===i}:s?s(t):t}:s}},__asyncValues:function(e){if(!Symbol.asyncIterator)throw new TypeError("Symbol.asyncIterator is not defined.");var t,n=e[Symbol.asyncIterator];return n?n.call(e):(e=af(e),t={},i("next"),i("throw"),i("return"),t[Symbol.asyncIterator]=function(){return this},t);function i(n){t[n]=e[n]&&function(t){return new Promise((function(i,s){(function(e,t,n,i){Promise.resolve(i).then((function(t){e({value:t,done:n})}),t)})(i,s,(t=e[n](t)).done,t.value)}))}}},__makeTemplateObject:function(e,t){return Object.defineProperty?Object.defineProperty(e,"raw",{value:t}):e.raw=t,e},__importStar:function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)"default"!==n&&Object.prototype.hasOwnProperty.call(e,n)&&of(t,e,n);return hf(t,e),t},__importDefault:function(e){return e&&e.__esModule?e:{default:e}},__classPrivateFieldGet:df,__classPrivateFieldSet:uf});const mf=e=>rf(void 0,void 0,void 0,(function*(){const t=yield fetch(e);if(200===t.status)return t;throw new Error(`Failed to fetch file: ${e}`)})),ff=e=>{"function"==typeof requestIdleCallback?requestIdleCallback(e):setTimeout(e)};var gf=function(){function e(){}return e.prototype.toJson=function(e,t){var n=this.xmlStringToXmlDom(e),i=this.xmlToJson(n);return t?(t.removeLineBreaks&&this.removeLineBreaks(i),t.removeComments&&this.removeCommentProperties(i),t.transformTextOnly&&this.transformTextOnly(i),i):i},e.prototype.xmlStringToXmlDom=function(e){return(new DOMParser).parseFromString(e,"text/xml")},e.prototype.removeLineBreaks=function(e){var t=this;Object.keys(e).forEach((function(n,i){"#text"===n&&Array.isArray(e[n])&&delete e[n],"object"==typeof e[n]&&t.removeLineBreaks(e[n])}))},e.prototype.removeCommentProperties=function(e){var t=this;Object.keys(e).forEach((function(n,i){"#comment"===n&&delete e[n],"object"==typeof e[n]&&t.removeCommentProperties(e[n])}))},e.prototype.transformTextOnly=function(e){var t=this;Object.keys(e).forEach((function(n,i){var s=Object.keys(e[n]).length>1,r=Object.keys(e[n])[0];s||"object"==typeof e[n][r]?t.transformTextOnly(e[n]):"object"==typeof e[n]&&e[n]["#text"]&&(e[n]=e[n]["#text"])}))},e.prototype.xmlToJson=function(e){var t={};if(1==e.nodeType){if(e.attributes.length>0){t._attributes={};for(var n=0;n<e.attributes.length;n++){var i=e.attributes.item(n);t._attributes[i.nodeName]=i.nodeValue}}}else 3==e.nodeType&&(t=e.nodeValue);if(e.hasChildNodes())for(var s=0;s<e.childNodes.length;s++){var r=e.childNodes.item(s),o=r.nodeName;if(void 0===t[o])t[o]=this.xmlToJson(r);else{if(void 0===t[o].push){var a=t[o];t[o]=[],t[o].push(a)}t[o].push(this.xmlToJson(r))}}return t},e}();function yf(e){return mf(e).then((e=>e.text())).then((e=>Promise.resolve(function(e){return(new gf).toJson(e,{transformTextOnly:!0,removeComments:!0,removeLineBreaks:!0})}(e))))}class bf{constructor(){this.pluginCallbacks=[],this.register((function(e){return new Yf(e)})),this.register((function(e){return new Kf(e)})),this.register((function(e){return new jf(e)})),this.register((function(e){return new qf(e)})),this.register((function(e){return new $f(e)})),this.register((function(e){return new Jf(e)})),this.register((function(e){return new Qf(e)}))}register(e){return-1===this.pluginCallbacks.indexOf(e)&&this.pluginCallbacks.push(e),this}unregister(e){return-1!==this.pluginCallbacks.indexOf(e)&&this.pluginCallbacks.splice(this.pluginCallbacks.indexOf(e),1),this}parse(e,t,n,i){"object"==typeof n&&(console.warn("THREE.GLTFExporter: parse() expects options as the fourth argument now."),i=n);const s=new Of,r=[];for(let e=0,t=this.pluginCallbacks.length;e<t;e++)r.push(this.pluginCallbacks[e](s));s.setPlugins(r),s.write(e,t,i).catch(n)}parseAsync(e,t){const n=this;return new Promise((function(i,s){n.parse(e,i,s,t)}))}}const vf=0,xf=1,wf=2,Sf=3,Mf=4,Tf=5121,Cf=5123,Lf=5126,Rf=5125,Gf=34962,Af=34963,_f=9728,If=9729,Ef=9984,Xf=9985,zf=9986,Pf=9987,Wf=33071,Zf=33648,Nf=10497,Vf={};Vf[1003]=_f,Vf[1004]=Ef,Vf[1005]=zf,Vf[1006]=If,Vf[1007]=Xf,Vf[1008]=Pf,Vf[1001]=Wf,Vf[1e3]=Nf,Vf[1002]=Zf;const Df={scale:"scale",position:"translation",quaternion:"rotation",morphTargetInfluences:"weights"};function Bf(e,t){return e.length===t.length&&e.every((function(e,n){return e===t[n]}))}function Hf(e){return 4*Math.ceil(e/4)}function kf(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0;const n=Hf(e.byteLength);if(n!==e.byteLength){const i=new Uint8Array(n);if(i.set(new Uint8Array(e)),0!==t)for(let s=e.byteLength;s<n;s++)i[s]=t;return i.buffer}return e}function Ff(){return"undefined"==typeof document&&"undefined"!=typeof OffscreenCanvas?new OffscreenCanvas(1,1):document.createElement("canvas")}function Uf(e,t){if(void 0!==e.toBlob)return new Promise((n=>e.toBlob(n,t)));let n;return"image/jpeg"===t?n=.92:"image/webp"===t&&(n=.8),e.convertToBlob({type:t,quality:n})}class Of{constructor(){this.plugins=[],this.options={},this.pending=[],this.buffers=[],this.byteOffset=0,this.buffers=[],this.nodeMap=new Map,this.skins=[],this.extensionsUsed={},this.uids=new Map,this.uid=0,this.json={asset:{version:"2.0",generator:"THREE.GLTFExporter"}},this.cache={meshes:new Map,attributes:new Map,attributesNormalized:new Map,materials:new Map,textures:new Map,images:new Map}}setPlugins(e){this.plugins=e}async write(e,t,n){this.options=Object.assign({},{binary:!1,trs:!1,onlyVisible:!0,truncateDrawRange:!0,maxTextureSize:1/0,animations:[],includeCustomExtensions:!1},n),this.options.animations.length>0&&(this.options.trs=!0),this.processInput(e),await Promise.all(this.pending);const i=this,s=i.buffers,r=i.json;n=i.options;const o=i.extensionsUsed,a=new Blob(s,{type:"application/octet-stream"}),l=Object.keys(o);if(l.length>0&&(r.extensionsUsed=l),r.buffers&&r.buffers.length>0&&(r.buffers[0].byteLength=a.size),!0===n.binary){const e=new FileReader;e.readAsArrayBuffer(a),e.onloadend=function(){const n=kf(e.result),i=new DataView(new ArrayBuffer(8));i.setUint32(0,n.byteLength,!0),i.setUint32(4,5130562,!0);const s=kf((o=JSON.stringify(r),(new TextEncoder).encode(o).buffer),32);var o;const a=new DataView(new ArrayBuffer(8));a.setUint32(0,s.byteLength,!0),a.setUint32(4,1313821514,!0);const l=new ArrayBuffer(12),c=new DataView(l);c.setUint32(0,1179937895,!0),c.setUint32(4,2,!0);const h=12+a.byteLength+s.byteLength+i.byteLength+n.byteLength;c.setUint32(8,h,!0);const d=new Blob([l,a,s,i,n],{type:"application/octet-stream"}),u=new FileReader;u.readAsArrayBuffer(d),u.onloadend=function(){t(u.result)}}}else if(r.buffers&&r.buffers.length>0){const e=new FileReader;e.readAsDataURL(a),e.onloadend=function(){const n=e.result;r.buffers[0].uri=n,t(r)}}else t(r)}serializeUserData(e,t){if(0===Object.keys(e.userData).length)return;const n=this.options,i=this.extensionsUsed;try{const s=JSON.parse(JSON.stringify(e.userData));if(n.includeCustomExtensions&&s.gltfExtensions){void 0===t.extensions&&(t.extensions={});for(const e in s.gltfExtensions)t.extensions[e]=s.gltfExtensions[e],i[e]=!0;delete s.gltfExtensions}Object.keys(s).length>0&&(t.extras=s)}catch(t){console.warn("THREE.GLTFExporter: userData of '"+e.name+"' won't be serialized because of JSON.stringify error - "+t.message)}}getUID(e){let t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];if(!1===this.uids.has(e)){const t=new Map;t.set(!0,this.uid++),t.set(!1,this.uid++),this.uids.set(e,t)}return this.uids.get(e).get(t)}isNormalizedNormalAttribute(e){if(this.cache.attributesNormalized.has(e))return!1;const t=new ri;for(let n=0,i=e.count;n<i;n++)if(Math.abs(t.fromBufferAttribute(e,n).length()-1)>5e-4)return!1;return!0}createNormalizedNormalAttribute(e){const t=this.cache;if(t.attributesNormalized.has(e))return t.attributesNormalized.get(e);const n=e.clone(),i=new ri;for(let e=0,t=n.count;e<t;e++)i.fromBufferAttribute(n,e),0===i.x&&0===i.y&&0===i.z?i.setX(1):i.normalize(),n.setXYZ(e,i.x,i.y,i.z);return t.attributesNormalized.set(e,n),n}applyTextureTransform(e,t){let n=!1;const i={};0===t.offset.x&&0===t.offset.y||(i.offset=t.offset.toArray(),n=!0),0!==t.rotation&&(i.rotation=t.rotation,n=!0),1===t.repeat.x&&1===t.repeat.y||(i.scale=t.repeat.toArray(),n=!0),n&&(e.extensions=e.extensions||{},e.extensions.KHR_texture_transform=i,this.extensionsUsed.KHR_texture_transform=!0)}buildMetalRoughTexture(e,t){if(e===t)return e;function n(e){return 3001===e.encoding?function(e){return e<.04045?.0773993808*e:Math.pow(.9478672986*e+.0521327014,2.4)}:function(e){return e}}console.warn("THREE.GLTFExporter: Merged metalnessMap and roughnessMap textures.");const i=null==e?void 0:e.image,s=null==t?void 0:t.image,r=Math.max((null==i?void 0:i.width)||0,(null==s?void 0:s.width)||0),o=Math.max((null==i?void 0:i.height)||0,(null==s?void 0:s.height)||0),a=Ff();a.width=r,a.height=o;const l=a.getContext("2d");l.fillStyle="#00ffff",l.fillRect(0,0,r,o);const c=l.getImageData(0,0,r,o);if(i){l.drawImage(i,0,0,r,o);const t=n(e),s=l.getImageData(0,0,r,o).data;for(let e=2;e<s.length;e+=4)c.data[e]=256*t(s[e]/256)}if(s){l.drawImage(s,0,0,r,o);const e=n(t),i=l.getImageData(0,0,r,o).data;for(let t=1;t<i.length;t+=4)c.data[t]=256*e(i[t]/256)}l.putImageData(c,0,0);const h=(e||t).clone();return h.source=new Yn(a),h.encoding=3e3,h}processBuffer(e){const t=this.json,n=this.buffers;return t.buffers||(t.buffers=[{byteLength:0}]),n.push(e),0}processBufferView(e,t,n,i,s){const r=this.json;let o;r.bufferViews||(r.bufferViews=[]),o=t===Tf?1:t===Cf?2:4;const a=Hf(i*e.itemSize*o),l=new DataView(new ArrayBuffer(a));let c=0;for(let s=n;s<n+i;s++)for(let n=0;n<e.itemSize;n++){let i;e.itemSize>4?i=e.array[s*e.itemSize+n]:0===n?i=e.getX(s):1===n?i=e.getY(s):2===n?i=e.getZ(s):3===n&&(i=e.getW(s)),t===Lf?l.setFloat32(c,i,!0):t===Rf?l.setUint32(c,i,!0):t===Cf?l.setUint16(c,i,!0):t===Tf&&l.setUint8(c,i),c+=o}const h={buffer:this.processBuffer(l.buffer),byteOffset:this.byteOffset,byteLength:a};void 0!==s&&(h.target=s),s===Gf&&(h.byteStride=e.itemSize*o),this.byteOffset+=a,r.bufferViews.push(h);return{id:r.bufferViews.length-1,byteLength:0}}processBufferViewImage(e){const t=this,n=t.json;return n.bufferViews||(n.bufferViews=[]),new Promise((function(i){const s=new FileReader;s.readAsArrayBuffer(e),s.onloadend=function(){const e=kf(s.result),r={buffer:t.processBuffer(e),byteOffset:t.byteOffset,byteLength:e.byteLength};t.byteOffset+=e.byteLength,i(n.bufferViews.push(r)-1)}}))}processAccessor(e,t,n,i){const s=this.options,r=this.json;let o;if(e.array.constructor===Float32Array)o=Lf;else if(e.array.constructor===Uint32Array)o=Rf;else if(e.array.constructor===Uint16Array)o=Cf;else{if(e.array.constructor!==Uint8Array)throw new Error("THREE.GLTFExporter: Unsupported bufferAttribute component type.");o=Tf}if(void 0===n&&(n=0),void 0===i&&(i=e.count),s.truncateDrawRange&&void 0!==t&&null===t.index){const s=n+i,r=t.drawRange.count===1/0?e.count:t.drawRange.start+t.drawRange.count;n=Math.max(n,t.drawRange.start),(i=Math.min(s,r)-n)<0&&(i=0)}if(0===i)return null;const a=function(e,t,n){const i={min:new Array(e.itemSize).fill(Number.POSITIVE_INFINITY),max:new Array(e.itemSize).fill(Number.NEGATIVE_INFINITY)};for(let s=t;s<t+n;s++)for(let t=0;t<e.itemSize;t++){let n;e.itemSize>4?n=e.array[s*e.itemSize+t]:0===t?n=e.getX(s):1===t?n=e.getY(s):2===t?n=e.getZ(s):3===t&&(n=e.getW(s)),i.min[t]=Math.min(i.min[t],n),i.max[t]=Math.max(i.max[t],n)}return i}(e,n,i);let l;void 0!==t&&(l=e===t.index?Af:Gf);const c=this.processBufferView(e,o,n,i,l),h={bufferView:c.id,byteOffset:c.byteOffset,componentType:o,count:i,max:a.max,min:a.min,type:{1:"SCALAR",2:"VEC2",3:"VEC3",4:"VEC4",16:"MAT4"}[e.itemSize]};return!0===e.normalized&&(h.normalized=!0),r.accessors||(r.accessors=[]),r.accessors.push(h)-1}processImage(e,t,n){let i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:"image/png";const s=this,r=s.cache,o=s.json,a=s.options,l=s.pending;r.images.has(e)||r.images.set(e,{});const c=r.images.get(e),h=i+":flipY/"+n.toString();if(void 0!==c[h])return c[h];o.images||(o.images=[]);const d={mimeType:i},u=Ff();u.width=Math.min(e.width,a.maxTextureSize),u.height=Math.min(e.height,a.maxTextureSize);const p=u.getContext("2d");if(!0===n&&(p.translate(0,u.height),p.scale(1,-1)),void 0!==e.data){1023!==t&&console.error("GLTFExporter: Only RGBAFormat is supported."),(e.width>a.maxTextureSize||e.height>a.maxTextureSize)&&console.warn("GLTFExporter: Image size is bigger than maxTextureSize",e);const n=new Uint8ClampedArray(e.height*e.width*4);for(let t=0;t<n.length;t+=4)n[t+0]=e.data[t+0],n[t+1]=e.data[t+1],n[t+2]=e.data[t+2],n[t+3]=e.data[t+3];p.putImageData(new ImageData(n,e.width,e.height),0,0)}else p.drawImage(e,0,0,u.width,u.height);!0===a.binary?l.push(Uf(u,i).then((e=>s.processBufferViewImage(e))).then((e=>{d.bufferView=e}))):void 0!==u.toDataURL?d.uri=u.toDataURL(i):l.push(Uf(u,i).then((e=>(new FileReader).readAsDataURL(e))).then((e=>{d.uri=e})));const m=o.images.push(d)-1;return c[h]=m,m}processSampler(e){const t=this.json;t.samplers||(t.samplers=[]);const n={magFilter:Vf[e.magFilter],minFilter:Vf[e.minFilter],wrapS:Vf[e.wrapS],wrapT:Vf[e.wrapT]};return t.samplers.push(n)-1}processTexture(e){const t=this.cache,n=this.json;if(t.textures.has(e))return t.textures.get(e);n.textures||(n.textures=[]);let i=e.userData.mimeType;"image/webp"===i&&(i="image/png");const s={sampler:this.processSampler(e),source:this.processImage(e.image,e.format,e.flipY,i)};e.name&&(s.name=e.name),this._invokeAll((function(t){t.writeTexture&&t.writeTexture(e,s)}));const r=n.textures.push(s)-1;return t.textures.set(e,r),r}processMaterial(e){const t=this.cache,n=this.json;if(t.materials.has(e))return t.materials.get(e);if(e.isShaderMaterial)return console.warn("GLTFExporter: THREE.ShaderMaterial not supported."),null;n.materials||(n.materials=[]);const i={pbrMetallicRoughness:{}};!0!==e.isMeshStandardMaterial&&!0!==e.isMeshBasicMaterial&&console.warn("GLTFExporter: Use MeshStandardMaterial or MeshBasicMaterial for best results.");const s=e.color.toArray().concat([e.opacity]);if(Bf(s,[1,1,1,1])||(i.pbrMetallicRoughness.baseColorFactor=s),e.isMeshStandardMaterial?(i.pbrMetallicRoughness.metallicFactor=e.metalness,i.pbrMetallicRoughness.roughnessFactor=e.roughness):(i.pbrMetallicRoughness.metallicFactor=.5,i.pbrMetallicRoughness.roughnessFactor=.5),e.metalnessMap||e.roughnessMap){const t=this.buildMetalRoughTexture(e.metalnessMap,e.roughnessMap),n={index:this.processTexture(t)};this.applyTextureTransform(n,t),i.pbrMetallicRoughness.metallicRoughnessTexture=n}if(e.map){const t={index:this.processTexture(e.map)};this.applyTextureTransform(t,e.map),i.pbrMetallicRoughness.baseColorTexture=t}if(e.emissive){const t=e.emissive.clone().multiplyScalar(e.emissiveIntensity),n=Math.max(t.r,t.g,t.b);if(n>1&&(t.multiplyScalar(1/n),console.warn("THREE.GLTFExporter: Some emissive components exceed 1; emissive has been limited")),n>0&&(i.emissiveFactor=t.toArray()),e.emissiveMap){const t={index:this.processTexture(e.emissiveMap)};this.applyTextureTransform(t,e.emissiveMap),i.emissiveTexture=t}}if(e.normalMap){const t={index:this.processTexture(e.normalMap)};e.normalScale&&1!==e.normalScale.x&&(t.scale=e.normalScale.x),this.applyTextureTransform(t,e.normalMap),i.normalTexture=t}if(e.aoMap){const t={index:this.processTexture(e.aoMap),texCoord:1};1!==e.aoMapIntensity&&(t.strength=e.aoMapIntensity),this.applyTextureTransform(t,e.aoMap),i.occlusionTexture=t}e.transparent?i.alphaMode="BLEND":e.alphaTest>0&&(i.alphaMode="MASK",i.alphaCutoff=e.alphaTest),2===e.side&&(i.doubleSided=!0),""!==e.name&&(i.name=e.name),this.serializeUserData(e,i),this._invokeAll((function(t){t.writeMaterial&&t.writeMaterial(e,i)}));const r=n.materials.push(i)-1;return t.materials.set(e,r),r}processMesh(e){const t=this.cache,n=this.json,i=[e.geometry.uuid];if(Array.isArray(e.material))for(let t=0,n=e.material.length;t<n;t++)i.push(e.material[t].uuid);else i.push(e.material.uuid);const s=i.join(":");if(t.meshes.has(s))return t.meshes.get(s);const r=e.geometry;let o;if(o=e.isLineSegments?xf:e.isLineLoop?wf:e.isLine?Sf:e.isPoints?vf:e.material.wireframe?xf:Mf,!0!==r.isBufferGeometry)throw new Error("THREE.GLTFExporter: Geometry is not of type THREE.BufferGeometry.");const a={},l={},c=[],h=[],d={uv:"TEXCOORD_0",uv2:"TEXCOORD_1",color:"COLOR_0",skinWeight:"WEIGHTS_0",skinIndex:"JOINTS_0"},u=r.getAttribute("normal");void 0===u||this.isNormalizedNormalAttribute(u)||(console.warn("THREE.GLTFExporter: Creating normalized normal attribute from the non-normalized one."),r.setAttribute("normal",this.createNormalizedNormalAttribute(u)));let p=null;for(let e in r.attributes){if("morph"===e.slice(0,5))continue;const n=r.attributes[e];e=d[e]||e.toUpperCase();if(/^(POSITION|NORMAL|TANGENT|TEXCOORD_\d+|COLOR_\d+|JOINTS_\d+|WEIGHTS_\d+)$/.test(e)||(e="_"+e),t.attributes.has(this.getUID(n))){l[e]=t.attributes.get(this.getUID(n));continue}p=null;const i=n.array;"JOINTS_0"!==e||i instanceof Uint16Array||i instanceof Uint8Array||(console.warn('GLTFExporter: Attribute "skinIndex" converted to type UNSIGNED_SHORT.'),p=new Ts(new Uint16Array(i),n.itemSize,n.normalized));const s=this.processAccessor(p||n,r);null!==s&&(l[e]=s,t.attributes.set(this.getUID(n),s))}if(void 0!==u&&r.setAttribute("normal",u),0===Object.keys(l).length)return null;if(void 0!==e.morphTargetInfluences&&e.morphTargetInfluences.length>0){const n=[],i=[],s={};if(void 0!==e.morphTargetDictionary)for(const t in e.morphTargetDictionary)s[e.morphTargetDictionary[t]]=t;for(let o=0;o<e.morphTargetInfluences.length;++o){const a={};let l=!1;for(const e in r.morphAttributes){if("position"!==e&&"normal"!==e){l||(console.warn("GLTFExporter: Only POSITION and NORMAL morph are supported."),l=!0);continue}const n=r.morphAttributes[e][o],i=e.toUpperCase(),s=r.attributes[e];if(t.attributes.has(this.getUID(n,!0))){a[i]=t.attributes.get(this.getUID(n,!0));continue}const c=n.clone();if(!r.morphTargetsRelative)for(let e=0,t=n.count;e<t;e++)c.setXYZ(e,n.getX(e)-s.getX(e),n.getY(e)-s.getY(e),n.getZ(e)-s.getZ(e));a[i]=this.processAccessor(c,r),t.attributes.set(this.getUID(s,!0),a[i])}h.push(a),n.push(e.morphTargetInfluences[o]),void 0!==e.morphTargetDictionary&&i.push(s[o])}a.weights=n,i.length>0&&(a.extras={},a.extras.targetNames=i)}const m=Array.isArray(e.material);if(m&&0===r.groups.length)return null;const f=m?e.material:[e.material],g=m?r.groups:[{materialIndex:0,start:void 0,count:void 0}];for(let e=0,n=g.length;e<n;e++){const n={mode:o,attributes:l};if(this.serializeUserData(r,n),h.length>0&&(n.targets=h),null!==r.index){let i=this.getUID(r.index);void 0===g[e].start&&void 0===g[e].count||(i+=":"+g[e].start+":"+g[e].count),t.attributes.has(i)?n.indices=t.attributes.get(i):(n.indices=this.processAccessor(r.index,r,g[e].start,g[e].count),t.attributes.set(i,n.indices)),null===n.indices&&delete n.indices}const i=this.processMaterial(f[g[e].materialIndex]);null!==i&&(n.material=i),c.push(n)}a.primitives=c,n.meshes||(n.meshes=[]),this._invokeAll((function(t){t.writeMesh&&t.writeMesh(e,a)}));const y=n.meshes.push(a)-1;return t.meshes.set(s,y),y}processCamera(e){const t=this.json;t.cameras||(t.cameras=[]);const n=e.isOrthographicCamera,i={type:n?"orthographic":"perspective"};return n?i.orthographic={xmag:2*e.right,ymag:2*e.top,zfar:e.far<=0?.001:e.far,znear:e.near<0?0:e.near}:i.perspective={aspectRatio:e.aspect,yfov:Rn.degToRad(e.fov),zfar:e.far<=0?.001:e.far,znear:e.near<0?0:e.near},""!==e.name&&(i.name=e.type),t.cameras.push(i)-1}processAnimation(e,t){const n=this.json,i=this.nodeMap;n.animations||(n.animations=[]);const s=(e=bf.Utils.mergeMorphTargetTracks(e.clone(),t)).tracks,r=[],o=[];for(let e=0;e<s.length;++e){const n=s[e],a=Lu.parseTrackName(n.name);let l=Lu.findNode(t,a.nodeName);const c=Df[a.propertyName];if("bones"===a.objectName&&(l=!0===l.isSkinnedMesh?l.skeleton.getBoneByName(a.objectIndex):void 0),!l||!c)return console.warn('THREE.GLTFExporter: Could not export animation track "%s".',n.name),null;const h=1;let d,u=n.values.length/n.times.length;c===Df.morphTargetInfluences&&(u/=l.morphTargetInfluences.length),!0===n.createInterpolant.isInterpolantFactoryMethodGLTFCubicSpline?(d="CUBICSPLINE",u/=3):d=2300===n.getInterpolation()?"STEP":"LINEAR",o.push({input:this.processAccessor(new Ts(n.times,h)),output:this.processAccessor(new Ts(n.values,u)),interpolation:d}),r.push({sampler:o.length-1,target:{node:i.get(l),path:c}})}return n.animations.push({name:e.name||"clip_"+n.animations.length,samplers:o,channels:r}),n.animations.length-1}processSkin(e){const t=this.json,n=this.nodeMap,i=t.nodes[n.get(e)],s=e.skeleton;if(void 0===s)return null;const r=e.skeleton.bones[0];if(void 0===r)return null;const o=[],a=new Float32Array(16*s.bones.length),l=new Wi;for(let t=0;t<s.bones.length;++t)o.push(n.get(s.bones[t])),l.copy(s.boneInverses[t]),l.multiply(e.bindMatrix).toArray(a,16*t);void 0===t.skins&&(t.skins=[]),t.skins.push({inverseBindMatrices:this.processAccessor(new Ts(a,16)),joints:o,skeleton:n.get(r)});return i.skin=t.skins.length-1}processNode(e){const t=this.json,n=this.options,i=this.nodeMap;t.nodes||(t.nodes=[]);const s={};if(n.trs){const t=e.quaternion.toArray(),n=e.position.toArray(),i=e.scale.toArray();Bf(t,[0,0,0,1])||(s.rotation=t),Bf(n,[0,0,0])||(s.translation=n),Bf(i,[1,1,1])||(s.scale=i)}else e.matrixAutoUpdate&&e.updateMatrix(),!1===Bf(e.matrix.elements,[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1])&&(s.matrix=e.matrix.elements);if(""!==e.name&&(s.name=String(e.name)),this.serializeUserData(e,s),e.isMesh||e.isLine||e.isPoints){const t=this.processMesh(e);null!==t&&(s.mesh=t)}else e.isCamera&&(s.camera=this.processCamera(e));if(e.isSkinnedMesh&&this.skins.push(e),e.children.length>0){const t=[];for(let i=0,s=e.children.length;i<s;i++){const s=e.children[i];if(s.visible||!1===n.onlyVisible){const e=this.processNode(s);null!==e&&t.push(e)}}t.length>0&&(s.children=t)}this._invokeAll((function(t){t.writeNode&&t.writeNode(e,s)}));const r=t.nodes.push(s)-1;return i.set(e,r),r}processScene(e){const t=this.json,n=this.options;t.scenes||(t.scenes=[],t.scene=0);const i={};""!==e.name&&(i.name=e.name),t.scenes.push(i);const s=[];for(let t=0,i=e.children.length;t<i;t++){const i=e.children[t];if(i.visible||!1===n.onlyVisible){const e=this.processNode(i);null!==e&&s.push(e)}}s.length>0&&(i.nodes=s),this.serializeUserData(e,i)}processObjects(e){const t=new cl;t.name="AuxScene";for(let n=0;n<e.length;n++)t.children.push(e[n]);this.processScene(t)}processInput(e){const t=this.options;e=e instanceof Array?e:[e],this._invokeAll((function(t){t.beforeParse&&t.beforeParse(e)}));const n=[];for(let t=0;t<e.length;t++)e[t]instanceof cl?this.processScene(e[t]):n.push(e[t]);n.length>0&&this.processObjects(n);for(let e=0;e<this.skins.length;++e)this.processSkin(this.skins[e]);for(let n=0;n<t.animations.length;++n)this.processAnimation(t.animations[n],e[0]);this._invokeAll((function(t){t.afterParse&&t.afterParse(e)}))}_invokeAll(e){for(let t=0,n=this.plugins.length;t<n;t++)e(this.plugins[t])}}class Yf{constructor(e){this.writer=e,this.name="KHR_lights_punctual"}writeNode(e,t){if(!e.isLight)return;if(!e.isDirectionalLight&&!e.isPointLight&&!e.isSpotLight)return void console.warn("THREE.GLTFExporter: Only directional, point, and spot lights are supported.",e);const n=this.writer,i=n.json,s=n.extensionsUsed,r={};e.name&&(r.name=e.name),r.color=e.color.toArray(),r.intensity=e.intensity,e.isDirectionalLight?r.type="directional":e.isPointLight?(r.type="point",e.distance>0&&(r.range=e.distance)):e.isSpotLight&&(r.type="spot",e.distance>0&&(r.range=e.distance),r.spot={},r.spot.innerConeAngle=(e.penumbra-1)*e.angle*-1,r.spot.outerConeAngle=e.angle),void 0!==e.decay&&2!==e.decay&&console.warn("THREE.GLTFExporter: Light decay may be lost. glTF is physically-based, and expects light.decay=2."),!e.target||e.target.parent===e&&0===e.target.position.x&&0===e.target.position.y&&-1===e.target.position.z||console.warn("THREE.GLTFExporter: Light direction may be lost. For best results, make light.target a child of the light with position 0,0,-1."),s[this.name]||(i.extensions=i.extensions||{},i.extensions[this.name]={lights:[]},s[this.name]=!0);const o=i.extensions[this.name].lights;o.push(r),t.extensions=t.extensions||{},t.extensions[this.name]={light:o.length-1}}}class Kf{constructor(e){this.writer=e,this.name="KHR_materials_unlit"}writeMaterial(e,t){if(!e.isMeshBasicMaterial)return;const n=this.writer.extensionsUsed;t.extensions=t.extensions||{},t.extensions[this.name]={},n[this.name]=!0,t.pbrMetallicRoughness.metallicFactor=0,t.pbrMetallicRoughness.roughnessFactor=.9}}class jf{constructor(e){this.writer=e,this.name="KHR_materials_pbrSpecularGlossiness"}writeMaterial(e,t){if(!e.isGLTFSpecularGlossinessMaterial)return;const n=this.writer,i=n.extensionsUsed,s={};t.pbrMetallicRoughness.baseColorFactor&&(s.diffuseFactor=t.pbrMetallicRoughness.baseColorFactor);const r=[1,1,1];if(e.specular.toArray(r,0),s.specularFactor=r,s.glossinessFactor=e.glossiness,t.pbrMetallicRoughness.baseColorTexture&&(s.diffuseTexture=t.pbrMetallicRoughness.baseColorTexture),e.specularMap){const t={index:n.processTexture(e.specularMap)};n.applyTextureTransform(t,e.specularMap),s.specularGlossinessTexture=t}t.extensions=t.extensions||{},t.extensions[this.name]=s,i[this.name]=!0}}class Jf{constructor(e){this.writer=e,this.name="KHR_materials_clearcoat"}writeMaterial(e,t){if(!e.isMeshPhysicalMaterial)return;const n=this.writer,i=n.extensionsUsed,s={};if(s.clearcoatFactor=e.clearcoat,e.clearcoatMap){const t={index:n.processTexture(e.clearcoatMap)};n.applyTextureTransform(t,e.clearcoatMap),s.clearcoatTexture=t}if(s.clearcoatRoughnessFactor=e.clearcoatRoughness,e.clearcoatRoughnessMap){const t={index:n.processTexture(e.clearcoatRoughnessMap)};n.applyTextureTransform(t,e.clearcoatRoughnessMap),s.clearcoatRoughnessTexture=t}if(e.clearcoatNormalMap){const t={index:n.processTexture(e.clearcoatNormalMap)};n.applyTextureTransform(t,e.clearcoatNormalMap),s.clearcoatNormalTexture=t}t.extensions=t.extensions||{},t.extensions[this.name]=s,i[this.name]=!0}}class Qf{constructor(e){this.writer=e,this.name="KHR_materials_iridescence"}writeMaterial(e,t){if(!e.isMeshPhysicalMaterial)return;const n=this.writer,i=n.extensionsUsed,s={};if(s.iridescenceFactor=e.iridescence,e.iridescenceMap){const t={index:n.processTexture(e.iridescenceMap)};n.applyTextureTransform(t,e.iridescenceMap),s.iridescenceTexture=t}if(s.iridescenceIor=e.iridescenceIOR,s.iridescenceThicknessMinimum=e.iridescenceThicknessRange[0],s.iridescenceThicknessMaximum=e.iridescenceThicknessRange[1],e.iridescenceThicknessMap){const t={index:n.processTexture(e.iridescenceThicknessMap)};n.applyTextureTransform(t,e.iridescenceThicknessMap),s.iridescenceThicknessTexture=t}t.extensions=t.extensions||{},t.extensions[this.name]=s,i[this.name]=!0}}class qf{constructor(e){this.writer=e,this.name="KHR_materials_transmission"}writeMaterial(e,t){if(!e.isMeshPhysicalMaterial||0===e.transmission)return;const n=this.writer,i=n.extensionsUsed,s={};if(s.transmissionFactor=e.transmission,e.transmissionMap){const t={index:n.processTexture(e.transmissionMap)};n.applyTextureTransform(t,e.transmissionMap),s.transmissionTexture=t}t.extensions=t.extensions||{},t.extensions[this.name]=s,i[this.name]=!0}}class $f{constructor(e){this.writer=e,this.name="KHR_materials_volume"}writeMaterial(e,t){if(!e.isMeshPhysicalMaterial||0===e.transmission)return;const n=this.writer,i=n.extensionsUsed,s={};if(s.thicknessFactor=e.thickness,e.thicknessMap){const t={index:n.processTexture(e.thicknessMap)};n.applyTextureTransform(t,e.thicknessMap),s.thicknessTexture=t}s.attenuationDistance=e.attenuationDistance,s.attenuationColor=e.attenuationColor.toArray(),t.extensions=t.extensions||{},t.extensions[this.name]=s,i[this.name]=!0}}bf.Utils={insertKeyframe:function(e,t){const n=.001,i=e.getValueSize(),s=new e.TimeBufferType(e.times.length+1),r=new e.ValueBufferType(e.values.length+i),o=e.createInterpolant(new e.ValueBufferType(i));let a;if(0===e.times.length){s[0]=t;for(let e=0;e<i;e++)r[e]=0;a=0}else if(t<e.times[0]){if(Math.abs(e.times[0]-t)<n)return 0;s[0]=t,s.set(e.times,1),r.set(o.evaluate(t),0),r.set(e.values,i),a=0}else if(t>e.times[e.times.length-1]){if(Math.abs(e.times[e.times.length-1]-t)<n)return e.times.length-1;s[s.length-1]=t,s.set(e.times,0),r.set(e.values,0),r.set(o.evaluate(t),e.values.length),a=s.length-1}else for(let l=0;l<e.times.length;l++){if(Math.abs(e.times[l]-t)<n)return l;if(e.times[l]<t&&e.times[l+1]>t){s.set(e.times.slice(0,l+1),0),s[l+1]=t,s.set(e.times.slice(l+1),l+2),r.set(e.values.slice(0,(l+1)*i),0),r.set(o.evaluate(t),(l+1)*i),r.set(e.values.slice((l+1)*i),(l+2)*i),a=l+1;break}}return e.times=s,e.values=r,a},mergeMorphTargetTracks:function(e,t){const n=[],i={},s=e.tracks;for(let e=0;e<s.length;++e){let r=s[e];const o=Lu.parseTrackName(r.name),a=Lu.findNode(t,o.nodeName);if("morphTargetInfluences"!==o.propertyName||void 0===o.propertyIndex){n.push(r);continue}if(r.createInterpolant!==r.InterpolantFactoryMethodDiscrete&&r.createInterpolant!==r.InterpolantFactoryMethodLinear){if(r.createInterpolant.isInterpolantFactoryMethodGLTFCubicSpline)throw new Error("THREE.GLTFExporter: Cannot merge tracks with glTF CUBICSPLINE interpolation.");console.warn("THREE.GLTFExporter: Morph target interpolation mode not yet supported. Using LINEAR instead."),r=r.clone(),r.setInterpolation(2301)}const l=a.morphTargetInfluences.length,c=a.morphTargetDictionary[o.propertyIndex];if(void 0===c)throw new Error("THREE.GLTFExporter: Morph target name not found: "+o.propertyIndex);let h;if(void 0===i[a.uuid]){h=r.clone();const e=new h.ValueBufferType(l*h.times.length);for(let t=0;t<h.times.length;t++)e[t*l+c]=h.values[t];h.name=(o.nodeName||"")+".morphTargetInfluences",h.values=e,i[a.uuid]=h,n.push(h);continue}const d=r.createInterpolant(new r.ValueBufferType(1));h=i[a.uuid];for(let e=0;e<h.times.length;e++)h.values[e*l+c]=d.evaluate(h.times[e]);for(let e=0;e<r.times.length;e++){const t=this.insertKeyframe(h,r.times[e]);h.values[t*l+c]=r.values[e]}}return e.tracks=n,e}};const eg=Object.prototype.hasOwnProperty,tg=e=>"String"===ag(e),ng=e=>"Boolean"===ag(e),ig=e=>"Number"===ag(e),sg=Array.isArray,rg=e=>"Object"===ag(e),og=e=>"Function"===ag(e),ag=e=>Object.prototype.toString.call(e).slice(8,-1),lg=(e,t,n)=>String.fromCodePoint(...new Uint8Array(e,t,n)),cg=()=>"[soonspacejs]: "+Math.random().toString(36).substring(7).split("").join("_");var hg=Object.freeze({__proto__:null,hasOwn:(e,t)=>eg.call(e,t),isString:tg,isBoolean:ng,isNumber:ig,isNull:e=>"Null"===ag(e),isUndefined:e=>"Undefined"===ag(e),isSymbol:e=>"Symbol"===ag(e),isDate:e=>"Date"===ag(e),isArray:sg,isObject:rg,isFunction:og,isPromise:e=>"Promise"===ag(e),getValueType:ag,sleep:e=>new Promise((t=>setTimeout((()=>t()),e))),getAsciiString:lg,randomString:cg,exportGltf:function(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return new Promise(((n,i)=>{(new bf).parse(e,(e=>n(e)),(e=>i(e)),t)}))},log:Nm,warn:Vm,error:e=>{console.error("In soonspacejs: "+e)},IVector3ToVector3:Dm,IVector3ToEuler:Bm,getBoundingBox:Hm,rotationAxisFix:km,rotationAFix:Fm,deg2Euler:Um,euler2Deg:function(e){return e/(Math.PI/180)},getSpaceAttributeFromObject:Om,syncSpaceAttributeToObject:Ym,isObjectVisible:Km,MinHeap:jm,getCubeTexture:Jm,gradientTexture:Qm,parseFilePath:qm,cloneDeep:$m,cloneMaterials:ef,fetchFile:mf,idleTask:ff,xmlToJson:yf});const dg={"Linear.None":Mm.Linear.None,"Quadratic.In":Mm.Quadratic.In,"Quadratic.Out":Mm.Quadratic.Out,"Quadratic.InOut":Mm.Quadratic.InOut,"Cubic.In":Mm.Cubic.In,"Cubic.Out":Mm.Cubic.Out,"Cubic.InOut":Mm.Cubic.InOut,"Quartic.In":Mm.Quartic.In,"Quartic.Out":Mm.Quartic.Out,"Quartic.InOut":Mm.Quartic.InOut,"Quintic.In":Mm.Quintic.In,"Quintic.Out":Mm.Quintic.Out,"Quintic.InOut":Mm.Quintic.InOut,"Sinusoidal.In":Mm.Sinusoidal.In,"Sinusoidal.Out":Mm.Sinusoidal.Out,"Sinusoidal.InOut":Mm.Sinusoidal.InOut,"Exponential.In":Mm.Exponential.In,"Exponential.Out":Mm.Exponential.Out,"Exponential.InOut":Mm.Exponential.InOut,"Circular.In":Mm.Circular.In,"Circular.Out":Mm.Circular.Out,"Circular.InOut":Mm.Circular.InOut,"Elastic.In":Mm.Elastic.In,"Elastic.Out":Mm.Elastic.Out,"Elastic.InOut":Mm.Elastic.InOut,"Back.In":Mm.Back.In,"Back.Out":Mm.Back.Out,"Back.InOut":Mm.Back.InOut,"Bounce.In":Mm.Bounce.In,"Bounce.Out":Mm.Bounce.Out,"Bounce.InOut":Mm.Bounce.InOut};function ug(e,t){let n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},i=arguments.length>3?arguments[3]:void 0,s=arguments.length>4?arguments[4]:void 0;return new Promise((r=>{const{duration:o=1e3,delay:a=0,repeat:l=!1,mode:c="Linear.None",yoyo:h=!1}=n,d=dg[c],u=new Am(e).to(t,o).easing(d).delay(a).onUpdate((n=>{e instanceof Oi&&t instanceof Oi&&n instanceof Oi&&(n.order=t.order),null==i||i(n,u)})).onComplete((()=>{u.stop(),r()})).onStart((()=>{null==s||s(u)}));ig(l)?u.repeat(l):ng(l)&&l&&u.repeat(1/0),u.yoyo(h),u.start()}))}const pg=Math.pow(2,-24);class mg{constructor(){}}function fg(e,t,n){return n.min.x=t[e],n.min.y=t[e+1],n.min.z=t[e+2],n.max.x=t[e+3],n.max.y=t[e+4],n.max.z=t[e+5],n}function gg(e){let t=-1,n=-1/0;for(let i=0;i<3;i++){const s=e[i+3]-e[i];s>n&&(n=s,t=i)}return t}function yg(e,t){t.set(e)}function bg(e,t,n){let i,s;for(let r=0;r<3;r++){const o=r+3;i=e[r],s=t[r],n[r]=i<s?i:s,i=e[o],s=t[o],n[o]=i>s?i:s}}function vg(e,t,n){for(let i=0;i<3;i++){const s=t[e+2*i],r=t[e+2*i+1],o=s-r,a=s+r;o<n[i]&&(n[i]=o),a>n[i+3]&&(n[i+3]=a)}}function xg(e){const t=e[3]-e[0],n=e[4]-e[1],i=e[5]-e[2];return 2*(t*n+n*i+i*t)}function wg(e,t,n,i){let s=arguments.length>4&&void 0!==arguments[4]?arguments[4]:null,r=1/0,o=1/0,a=1/0,l=-1/0,c=-1/0,h=-1/0,d=1/0,u=1/0,p=1/0,m=-1/0,f=-1/0,g=-1/0;const y=null!==s;for(let i=6*t,s=6*(t+n);i<s;i+=6){const t=e[i+0],n=e[i+1],s=t-n,b=t+n;s<r&&(r=s),b>l&&(l=b),y&&t<d&&(d=t),y&&t>m&&(m=t);const v=e[i+2],x=e[i+3],w=v-x,S=v+x;w<o&&(o=w),S>c&&(c=S),y&&v<u&&(u=v),y&&v>f&&(f=v);const M=e[i+4],T=e[i+5],C=M-T,L=M+T;C<a&&(a=C),L>h&&(h=L),y&&M<p&&(p=M),y&&M>g&&(g=M)}i[0]=r,i[1]=o,i[2]=a,i[3]=l,i[4]=c,i[5]=h,y&&(s[0]=d,s[1]=u,s[2]=p,s[3]=m,s[4]=f,s[5]=g)}function Sg(e,t,n,i,s){let r=n,o=n+i-1;const a=s.pos,l=2*s.axis;for(;;){for(;r<=o&&t[6*r+l]<a;)r++;for(;r<=o&&t[6*o+l]>=a;)o--;if(!(r<o))return r;for(let n=0;n<3;n++){let i=e[3*r+n];e[3*r+n]=e[3*o+n],e[3*o+n]=i;let s=t[6*r+2*n+0];t[6*r+2*n+0]=t[6*o+2*n+0],t[6*o+2*n+0]=s;let a=t[6*r+2*n+1];t[6*r+2*n+1]=t[6*o+2*n+1],t[6*o+2*n+1]=a}r++,o--}}const Mg=(e,t)=>e.candidate-t.candidate,Tg=new Array(32).fill().map((()=>({count:0,bounds:new Float32Array(6),rightCacheBounds:new Float32Array(6),leftCacheBounds:new Float32Array(6),candidate:0}))),Cg=new Float32Array(6);function Lg(e,t,n,i,s,r){let o=-1,a=0;if(0===r)o=gg(t),-1!==o&&(a=(t[o]+t[o+3])/2);else if(1===r)o=gg(e),-1!==o&&(a=function(e,t,n,i){let s=0;for(let r=t,o=t+n;r<o;r++)s+=e[6*r+2*i];return s/n}(n,i,s,o));else if(2===r){const r=xg(e);let l=1.25*s;const c=6*i,h=6*(i+s);for(let e=0;e<3;e++){const i=t[e],d=(t[e+3]-i)/32;if(s<8){const t=[...Tg];t.length=s;let i=0;for(let s=c;s<h;s+=6,i++){const r=t[i];r.candidate=n[s+2*e],r.count=0;const{bounds:o,leftCacheBounds:a,rightCacheBounds:l}=r;for(let e=0;e<3;e++)l[e]=1/0,l[e+3]=-1/0,a[e]=1/0,a[e+3]=-1/0,o[e]=1/0,o[e+3]=-1/0;vg(s,n,o)}t.sort(Mg);let d=s;for(let e=0;e<d;e++){const n=t[e];for(;e+1<d&&t[e+1].candidate===n.candidate;)t.splice(e+1,1),d--}for(let i=c;i<h;i+=6){const s=n[i+2*e];for(let e=0;e<d;e++){const r=t[e];s>=r.candidate?vg(i,n,r.rightCacheBounds):(vg(i,n,r.leftCacheBounds),r.count++)}}for(let n=0;n<d;n++){const i=t[n],c=i.count,h=s-i.count,d=i.leftCacheBounds,u=i.rightCacheBounds;let p=0;0!==c&&(p=xg(d)/r);let m=0;0!==h&&(m=xg(u)/r);const f=1+1.25*(p*c+m*h);f<l&&(o=e,l=f,a=i.candidate)}}else{for(let e=0;e<32;e++){const t=Tg[e];t.count=0,t.candidate=i+d+e*d;const n=t.bounds;for(let e=0;e<3;e++)n[e]=1/0,n[e+3]=-1/0}for(let t=c;t<h;t+=6){let s=~~((n[t+2*e]-i)/d);s>=32&&(s=31);const r=Tg[s];r.count++,vg(t,n,r.bounds)}const t=Tg[31];yg(t.bounds,t.rightCacheBounds);for(let e=30;e>=0;e--){const t=Tg[e],n=Tg[e+1];bg(t.bounds,n.rightCacheBounds,t.rightCacheBounds)}let u=0;for(let t=0;t<31;t++){const n=Tg[t],i=n.count,c=n.bounds,h=Tg[t+1].rightCacheBounds;0!==i&&(0===u?yg(c,Cg):bg(c,Cg,Cg)),u+=i;let d=0,p=0;0!==u&&(d=xg(Cg)/r);const m=s-u;0!==m&&(p=xg(h)/r);const f=1+1.25*(d*u+p*m);f<l&&(o=e,l=f,a=n.candidate)}}}}else console.warn(`MeshBVH: Invalid build strategy value ${r} used.`);return{axis:o,pos:a}}function Rg(e,t){function n(e){u&&u(e/p)}function i(t,s,u){let p=arguments.length>3&&void 0!==arguments[3]?arguments[3]:null,f=arguments.length>4&&void 0!==arguments[4]?arguments[4]:0;if(!m&&f>=l&&(m=!0,c&&(console.warn(`MeshBVH: Max depth of ${l} reached when generating BVH. Consider increasing maxDepth.`),console.warn(e))),u<=h||f>=l)return n(s+u),t.offset=s,t.count=u,t;const g=Lg(t.boundingData,p,o,s,u,d);if(-1===g.axis)return n(s+u),t.offset=s,t.count=u,t;const y=Sg(a,o,s,u,g);if(y===s||y===s+u)n(s+u),t.offset=s,t.count=u;else{t.splitAxis=g.axis;const e=new mg,n=s,a=y-s;t.left=e,e.boundingData=new Float32Array(6),wg(o,n,a,e.boundingData,r),i(e,n,a,r,f+1);const l=new mg,c=y,h=u-a;t.right=l,l.boundingData=new Float32Array(6),wg(o,c,h,l.boundingData,r),i(l,c,h,r,f+1)}return t}!function(e,t){if(!e.index){const n=e.attributes.position.count,i=t.useSharedArrayBuffer?SharedArrayBuffer:ArrayBuffer;let s;s=n>65535?new Uint32Array(new i(4*n)):new Uint16Array(new i(2*n)),e.setIndex(new Ts(s,1));for(let e=0;e<n;e++)s[e]=e}}(e,t);const s=new Float32Array(6),r=new Float32Array(6),o=function(e,t){const n=e.attributes.position,i=n.array,s=e.index.array,r=s.length/3,o=new Float32Array(6*r),a=n.offset||0;let l=3;n.isInterleavedBufferAttribute&&(l=n.data.stride);for(let e=0;e<r;e++){const n=3*e,r=6*e,c=s[n+0]*l+a,h=s[n+1]*l+a,d=s[n+2]*l+a;for(let e=0;e<3;e++){const n=i[c+e],s=i[h+e],a=i[d+e];let l=n;s<l&&(l=s),a<l&&(l=a);let u=n;s>u&&(u=s),a>u&&(u=a);const p=(u-l)/2,m=2*e;o[r+m+0]=l+p,o[r+m+1]=p+(Math.abs(l)+p)*pg,l<t[e]&&(t[e]=l),u>t[e+3]&&(t[e+3]=u)}}return o}(e,s),a=e.index.array,l=t.maxDepth,c=t.verbose,h=t.maxLeafTris,d=t.strategy,u=t.onProgress,p=e.index.count/3;let m=!1;const f=[],g=function(e){if(!e.groups||!e.groups.length)return[{offset:0,count:e.index.count/3}];const t=[],n=new Set;for(const t of e.groups)n.add(t.start),n.add(t.start+t.count);const i=Array.from(n.values()).sort(((e,t)=>e-t));for(let e=0;e<i.length-1;e++){const n=i[e],s=i[e+1];t.push({offset:n/3,count:(s-n)/3})}return t}(e);if(1===g.length){const e=g[0],t=new mg;t.boundingData=s,function(e,t,n,i){let s=1/0,r=1/0,o=1/0,a=-1/0,l=-1/0,c=-1/0;for(let i=6*t,h=6*(t+n);i<h;i+=6){const t=e[i+0];t<s&&(s=t),t>a&&(a=t);const n=e[i+2];n<r&&(r=n),n>l&&(l=n);const h=e[i+4];h<o&&(o=h),h>c&&(c=h)}i[0]=s,i[1]=r,i[2]=o,i[3]=a,i[4]=l,i[5]=c}(o,e.offset,e.count,r),i(t,e.offset,e.count,r),f.push(t)}else for(let e of g){const t=new mg;t.boundingData=new Float32Array(6),wg(o,e.offset,e.count,t.boundingData,r),i(t,e.offset,e.count,r),f.push(t)}return f}class Gg{constructor(){this.min=1/0,this.max=-1/0}setFromPointsField(e,t){let n=1/0,i=-1/0;for(let s=0,r=e.length;s<r;s++){const r=e[s][t];n=r<n?r:n,i=r>i?r:i}this.min=n,this.max=i}setFromPoints(e,t){let n=1/0,i=-1/0;for(let s=0,r=t.length;s<r;s++){const r=t[s],o=e.dot(r);n=o<n?o:n,i=o>i?o:i}this.min=n,this.max=i}isSeparated(e){return this.min>e.max||e.min>this.max}}Gg.prototype.setFromBox=function(){const e=new ri;return function(t,n){const i=n.min,s=n.max;let r=1/0,o=-1/0;for(let n=0;n<=1;n++)for(let a=0;a<=1;a++)for(let l=0;l<=1;l++){e.x=i.x*n+s.x*(1-n),e.y=i.y*a+s.y*(1-a),e.z=i.z*l+s.z*(1-l);const c=t.dot(e);r=Math.min(c,r),o=Math.max(c,o)}this.min=r,this.max=o}}(),function(){const e=new Gg}();const Ag=function(){const e=new ri,t=new ri,n=new ri;return function(i,s,r){const o=i.start,a=e,l=s.start,c=t;n.subVectors(o,l),e.subVectors(i.end,i.start),t.subVectors(s.end,s.start);const h=n.dot(c),d=c.dot(a),u=c.dot(c),p=n.dot(a),m=a.dot(a)*u-d*d;let f,g;f=0!==m?(h*d-p*u)/m:0,g=(h+f*d)/u,r.x=f,r.y=g}}(),_g=function(){const e=new Gn,t=new ri,n=new ri;return function(i,s,r,o){Ag(i,s,e);let a=e.x,l=e.y;if(a>=0&&a<=1&&l>=0&&l<=1)return i.at(a,r),void s.at(l,o);if(a>=0&&a<=1)return l<0?s.at(0,o):s.at(1,o),void i.closestPointToPoint(o,!0,r);if(l>=0&&l<=1)return a<0?i.at(0,r):i.at(1,r),void s.closestPointToPoint(r,!0,o);{let e,c;e=a<0?i.start:i.end,c=l<0?s.start:s.end;const h=t,d=n;return i.closestPointToPoint(c,!0,t),s.closestPointToPoint(e,!0,n),h.distanceToSquared(c)<=d.distanceToSquared(e)?(r.copy(h),void o.copy(c)):(r.copy(e),void o.copy(d))}}}(),Ig=function(){const e=new ri,t=new ri,n=new wr,i=new ku;return function(s,r){const{radius:o,center:a}=s,{a:l,b:c,c:h}=r;i.start=l,i.end=c;if(i.closestPointToPoint(a,!0,e).distanceTo(a)<=o)return!0;i.start=l,i.end=h;if(i.closestPointToPoint(a,!0,e).distanceTo(a)<=o)return!0;i.start=c,i.end=h;if(i.closestPointToPoint(a,!0,e).distanceTo(a)<=o)return!0;const d=r.getPlane(n);if(Math.abs(d.distanceToPoint(a))<=o){const e=d.projectPoint(a,t);if(r.containsPoint(e))return!0}return!1}}();function Eg(e){return Math.abs(e)<1e-15}class Xg extends bs{constructor(){super(...arguments),this.isExtendedTriangle=!0,this.satAxes=new Array(4).fill().map((()=>new ri)),this.satBounds=new Array(4).fill().map((()=>new Gg)),this.points=[this.a,this.b,this.c],this.sphere=new Ri,this.plane=new wr,this.needsUpdate=!0}intersectsSphere(e){return Ig(e,this)}update(){const e=this.a,t=this.b,n=this.c,i=this.points,s=this.satAxes,r=this.satBounds,o=s[0],a=r[0];this.getNormal(o),a.setFromPoints(o,i);const l=s[1],c=r[1];l.subVectors(e,t),c.setFromPoints(l,i);const h=s[2],d=r[2];h.subVectors(t,n),d.setFromPoints(h,i);const u=s[3],p=r[3];u.subVectors(n,e),p.setFromPoints(u,i),this.sphere.setFromPoints(this.points),this.plane.setFromNormalAndCoplanarPoint(o,e),this.needsUpdate=!1}}Xg.prototype.closestPointToSegment=function(){const e=new ri,t=new ri,n=new ku;return function(i){let s=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null,r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:null;const{start:o,end:a}=i,l=this.points;let c,h=1/0;for(let o=0;o<3;o++){const a=(o+1)%3;n.start.copy(l[o]),n.end.copy(l[a]),_g(n,i,e,t),c=e.distanceToSquared(t),c<h&&(h=c,s&&s.copy(e),r&&r.copy(t))}return this.closestPointToPoint(o,e),c=o.distanceToSquared(e),c<h&&(h=c,s&&s.copy(e),r&&r.copy(o)),this.closestPointToPoint(a,e),c=a.distanceToSquared(e),c<h&&(h=c,s&&s.copy(e),r&&r.copy(a)),Math.sqrt(h)}}(),Xg.prototype.intersectsTriangle=function(){const e=new Xg,t=new Array(3),n=new Array(3),i=new Gg,s=new Gg,r=new ri,o=new ri,a=new ri,l=new ri,c=new ku,h=new ku,d=new ku;return function(u){let p=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null;this.needsUpdate&&this.update(),u.isExtendedTriangle?u.needsUpdate&&u.update():(e.copy(u),e.update(),u=e);const m=this.plane,f=u.plane;if(Math.abs(m.normal.dot(f.normal))>1-1e-10){const e=this.satBounds,o=this.satAxes;n[0]=u.a,n[1]=u.b,n[2]=u.c;for(let t=0;t<4;t++){const s=e[t],r=o[t];if(i.setFromPoints(r,n),s.isSeparated(i))return!1}const a=u.satBounds,l=u.satAxes;t[0]=this.a,t[1]=this.b,t[2]=this.c;for(let e=0;e<4;e++){const n=a[e],s=l[e];if(i.setFromPoints(s,t),n.isSeparated(i))return!1}for(let e=0;e<4;e++){const a=o[e];for(let e=0;e<4;e++){const o=l[e];if(r.crossVectors(a,o),i.setFromPoints(r,t),s.setFromPoints(r,n),i.isSeparated(s))return!1}}return p&&(console.warn("ExtendedTriangle.intersectsTriangle: Triangles are coplanar which does not support an output edge. Setting edge to 0, 0, 0."),p.start.set(0,0,0),p.end.set(0,0,0)),!0}{const e=this.points;let t=!1,n=0;for(let i=0;i<3;i++){const s=e[i],r=e[(i+1)%3];c.start.copy(s),c.end.copy(r),c.delta(o);const a=t?h.start:h.end,l=Eg(f.distanceToPoint(s));if(Eg(f.normal.dot(o))&&l){h.copy(c),n=2;break}if((f.intersectLine(c,a)||l)&&!Eg(a.distanceTo(r))){if(n++,t)break;t=!0}}if(1===n&&this.containsPoint(h.end))return p&&(p.start.copy(h.end),p.end.copy(h.end)),!0;if(2!==n)return!1;const i=u.points;let s=!1,r=0;for(let e=0;e<3;e++){const t=i[e],n=i[(e+1)%3];c.start.copy(t),c.end.copy(n),c.delta(a);const o=s?d.start:d.end,l=Eg(m.distanceToPoint(t));if(Eg(m.normal.dot(a))&&l){d.copy(c),r=2;break}if((m.intersectLine(c,o)||l)&&!Eg(o.distanceTo(n))){if(r++,s)break;s=!0}}if(1===r&&this.containsPoint(d.end))return p&&(p.start.copy(d.end),p.end.copy(d.end)),!0;if(2!==r)return!1;if(h.delta(o),d.delta(a),o.dot(a)<0){let e=d.start;d.start=d.end,d.end=e}const g=h.start.dot(o),y=h.end.dot(o),b=d.start.dot(o),v=d.end.dot(o),x=y<b,w=g<v;return(g===v||b===y||x!==w)&&(p&&(l.subVectors(h.start,d.start),l.dot(o)>0?p.start.copy(h.start):p.start.copy(d.start),l.subVectors(h.end,d.end),l.dot(o)<0?p.end.copy(h.end):p.end.copy(d.end)),!0)}}}(),Xg.prototype.distanceToPoint=function(){const e=new ri;return function(t){return this.closestPointToPoint(t,e),t.distanceTo(e)}}(),Xg.prototype.distanceToTriangle=function(){const e=new ri,t=new ri,n=["a","b","c"],i=new ku,s=new ku;return function(r){let o=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null,a=arguments.length>2&&void 0!==arguments[2]?arguments[2]:null;const l=o||a?i:null;if(this.intersectsTriangle(r,l))return(o||a)&&(o&&l.getCenter(o),a&&l.getCenter(a)),0;let c=1/0;for(let t=0;t<3;t++){let i;const s=n[t],l=r[s];this.closestPointToPoint(l,e),i=l.distanceToSquared(e),i<c&&(c=i,o&&o.copy(e),a&&a.copy(l));const h=this[s];r.closestPointToPoint(h,e),i=h.distanceToSquared(e),i<c&&(c=i,o&&o.copy(h),a&&a.copy(e))}for(let l=0;l<3;l++){const h=n[l],d=n[(l+1)%3];i.set(this[h],this[d]);for(let l=0;l<3;l++){const h=n[l],d=n[(l+1)%3];s.set(r[h],r[d]),_g(i,s,e,t);const u=e.distanceToSquared(t);u<c&&(c=u,o&&o.copy(e),a&&a.copy(t))}}return Math.sqrt(c)}}();class zg extends li{constructor(){super(...arguments),this.isOrientedBox=!0,this.matrix=new Wi,this.invMatrix=new Wi,this.points=new Array(8).fill().map((()=>new ri)),this.satAxes=new Array(3).fill().map((()=>new ri)),this.satBounds=new Array(3).fill().map((()=>new Gg)),this.alignedSatBounds=new Array(3).fill().map((()=>new Gg)),this.needsUpdate=!1}set(e,t,n){super.set(e,t),this.matrix.copy(n),this.needsUpdate=!0}copy(e){super.copy(e),this.matrix.copy(e.matrix),this.needsUpdate=!0}}zg.prototype.update=function(){const e=this.matrix,t=this.min,n=this.max,i=this.points;for(let s=0;s<=1;s++)for(let r=0;r<=1;r++)for(let o=0;o<=1;o++){const a=i[1*s|2*r|4*o];a.x=s?n.x:t.x,a.y=r?n.y:t.y,a.z=o?n.z:t.z,a.applyMatrix4(e)}const s=this.satBounds,r=this.satAxes,o=i[0];for(let e=0;e<3;e++){const t=r[e],n=s[e],a=i[1<<e];t.subVectors(o,a),n.setFromPoints(t,i)}const a=this.alignedSatBounds;a[0].setFromPointsField(i,"x"),a[1].setFromPointsField(i,"y"),a[2].setFromPointsField(i,"z"),this.invMatrix.copy(this.matrix).invert(),this.needsUpdate=!1},zg.prototype.intersectsBox=function(){const e=new Gg;return function(t){this.needsUpdate&&this.update();const n=t.min,i=t.max,s=this.satBounds,r=this.satAxes,o=this.alignedSatBounds;if(e.min=n.x,e.max=i.x,o[0].isSeparated(e))return!1;if(e.min=n.y,e.max=i.y,o[1].isSeparated(e))return!1;if(e.min=n.z,e.max=i.z,o[2].isSeparated(e))return!1;for(let n=0;n<3;n++){const i=r[n],o=s[n];if(e.setFromBox(i,t),o.isSeparated(e))return!1}return!0}}(),zg.prototype.intersectsTriangle=function(){const e=new Xg,t=new Array(3),n=new Gg,i=new Gg,s=new ri;return function(r){this.needsUpdate&&this.update(),r.isExtendedTriangle?r.needsUpdate&&r.update():(e.copy(r),e.update(),r=e);const o=this.satBounds,a=this.satAxes;t[0]=r.a,t[1]=r.b,t[2]=r.c;for(let e=0;e<3;e++){const i=o[e],s=a[e];if(n.setFromPoints(s,t),i.isSeparated(n))return!1}const l=r.satBounds,c=r.satAxes,h=this.points;for(let e=0;e<3;e++){const t=l[e],i=c[e];if(n.setFromPoints(i,h),t.isSeparated(n))return!1}for(let e=0;e<3;e++){const r=a[e];for(let e=0;e<4;e++){const o=c[e];if(s.crossVectors(r,o),n.setFromPoints(s,t),i.setFromPoints(s,h),n.isSeparated(i))return!1}}return!0}}(),zg.prototype.closestPointToPoint=function(e,t){return this.needsUpdate&&this.update(),t.copy(e).applyMatrix4(this.invMatrix).clamp(this.min,this.max).applyMatrix4(this.matrix),t},zg.prototype.distanceToPoint=function(){const e=new ri;return function(t){return this.closestPointToPoint(t,e),t.distanceTo(e)}}(),zg.prototype.distanceToBox=function(){const e=["x","y","z"],t=new Array(12).fill().map((()=>new ku)),n=new Array(12).fill().map((()=>new ku)),i=new ri,s=new ri;return function(r){let o=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,a=arguments.length>2&&void 0!==arguments[2]?arguments[2]:null,l=arguments.length>3&&void 0!==arguments[3]?arguments[3]:null;if(this.needsUpdate&&this.update(),this.intersectsBox(r))return(a||l)&&(r.getCenter(s),this.closestPointToPoint(s,i),r.closestPointToPoint(i,s),a&&a.copy(i),l&&l.copy(s)),0;const c=o*o,h=r.min,d=r.max,u=this.points;let p=1/0;for(let e=0;e<8;e++){const t=u[e];s.copy(t).clamp(h,d);const n=t.distanceToSquared(s);if(n<p&&(p=n,a&&a.copy(t),l&&l.copy(s),n<c))return Math.sqrt(n)}let m=0;for(let i=0;i<3;i++)for(let s=0;s<=1;s++)for(let r=0;r<=1;r++){const o=(i+1)%3,a=(i+2)%3,l=1<<i|s<<o|r<<a,c=u[s<<o|r<<a],p=u[l];t[m].set(c,p);const f=e[i],g=e[o],y=e[a],b=n[m],v=b.start,x=b.end;v[f]=h[f],v[g]=s?h[g]:d[g],v[y]=r?h[y]:d[g],x[f]=d[f],x[g]=s?h[g]:d[g],x[y]=r?h[y]:d[g],m++}for(let e=0;e<=1;e++)for(let t=0;t<=1;t++)for(let n=0;n<=1;n++){s.x=e?d.x:h.x,s.y=t?d.y:h.y,s.z=n?d.z:h.z,this.closestPointToPoint(s,i);const r=s.distanceToSquared(i);if(r<p&&(p=r,a&&a.copy(i),l&&l.copy(s),r<c))return Math.sqrt(r)}for(let e=0;e<12;e++){const r=t[e];for(let e=0;e<12;e++){const t=n[e];_g(r,t,i,s);const o=i.distanceToSquared(s);if(o<p&&(p=o,a&&a.copy(i),l&&l.copy(s),o<c))return Math.sqrt(o)}}return Math.sqrt(p)}}();const Pg=new ri,Wg=new ri,Zg=new ri,Ng=new Gn,Vg=new Gn,Dg=new Gn,Bg=new ri;function Hg(e,t,n,i,s){const r=3*i,o=e.index.getX(r),a=e.index.getX(r+1),l=e.index.getX(r+2),c=function(e,t,n,i,s,r,o){Pg.fromBufferAttribute(t,i),Wg.fromBufferAttribute(t,s),Zg.fromBufferAttribute(t,r);const a=function(e,t,n,i,s,r){let o;return o=1===r?e.intersectTriangle(i,n,t,!0,s):e.intersectTriangle(t,n,i,2!==r,s),null===o?null:{distance:e.origin.distanceTo(s),point:s.clone()}}(e,Pg,Wg,Zg,Bg,o);if(a){n&&(Ng.fromBufferAttribute(n,i),Vg.fromBufferAttribute(n,s),Dg.fromBufferAttribute(n,r),a.uv=bs.getUV(Bg,Pg,Wg,Zg,Ng,Vg,Dg,new Gn));const e={a:i,b:s,c:r,normal:new ri,materialIndex:0};bs.getNormal(Pg,Wg,Zg,e.normal),a.face=e,a.faceIndex=i}return a}(n,e.attributes.position,e.attributes.uv,o,a,l,t);return c?(c.faceIndex=i,s&&s.push(c),c):null}function kg(e,t,n){return null===e?null:(e.point.applyMatrix4(t.matrixWorld),e.distance=e.point.distanceTo(n.ray.origin),e.object=t,e.distance<n.near||e.distance>n.far?null:e)}function Fg(e,t,n,i){const s=e.a,r=e.b,o=e.c;let a=t,l=t+1,c=t+2;n&&(a=n.getX(t),l=n.getX(t+1),c=n.getX(t+2)),s.x=i.getX(a),s.y=i.getY(a),s.z=i.getZ(a),r.x=i.getX(l),r.y=i.getY(l),r.z=i.getZ(l),o.x=i.getX(c),o.y=i.getY(c),o.z=i.getZ(c)}function Ug(e,t,n,i,s,r,o){const a=n.index,l=n.attributes.position;for(let n=e,c=t+e;n<c;n++)if(Fg(o,3*n,a,l),o.needsUpdate=!0,i(o,n,s,r))return!0;return!1}class Og{constructor(e){this._getNewPrimitive=e,this._primitives=[]}getPrimitive(){const e=this._primitives;return 0===e.length?this._getNewPrimitive():e.pop()}releasePrimitive(e){this._primitives.push(e)}}function Yg(e,t){return 65535===t[e+15]}function Kg(e,t){return t[e+6]}function jg(e,t){return t[e+14]}function Jg(e){return e+8}function Qg(e,t){return t[e+6]}const qg=new li,$g=new ri,ey=["x","y","z"];function ty(e,t,n,i,s){let r=2*e,o=ly,a=cy,l=hy;if(Yg(r,a)){!function(e,t,n,i,s,r){for(let o=i,a=i+s;o<a;o++)Hg(e,t,n,o,r)}(t,n,i,Kg(e,l),jg(r,a),s)}else{const r=Jg(e);ry(r,o,i,$g)&&ty(r,t,n,i,s);const a=Qg(e,l);ry(a,o,i,$g)&&ty(a,t,n,i,s)}}function ny(e,t,n,i){let s=2*e,r=ly,o=cy,a=hy;if(Yg(s,o)){return function(e,t,n,i,s){let r=1/0,o=null;for(let a=i,l=i+s;a<l;a++){const i=Hg(e,t,n,a);i&&i.distance<r&&(o=i,r=i.distance)}return o}(t,n,i,Kg(e,a),jg(s,o))}{const s=function(e,t){return t[e+7]}(e,a),o=ey[s],l=i.direction[o]>=0;let c,h;l?(c=Jg(e),h=Qg(e,a)):(c=Qg(e,a),h=Jg(e));const d=ry(c,r,i,$g)?ny(c,t,n,i):null;if(d){const e=d.point[o];if(l?e<=r[h+s]:e>=r[h+s+3])return d}const u=ry(h,r,i,$g)?ny(h,t,n,i):null;return d&&u?d.distance<=u.distance?d:u:d||u||null}}const iy=function(){let e,t;const n=[],i=new Og((()=>new li));return function(){e=i.getPrimitive(),t=i.getPrimitive(),n.push(e,t);const r=s(...arguments);i.releasePrimitive(e),i.releasePrimitive(t),n.pop(),n.pop();const o=n.length;return o>0&&(t=n[o-1],e=n[o-2]),r};function s(n,i,r,o){let a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:null,l=arguments.length>5&&void 0!==arguments[5]?arguments[5]:0,c=arguments.length>6&&void 0!==arguments[6]?arguments[6]:0;function h(e){let t=2*e,n=cy,i=hy;for(;!Yg(t,n);)t=2*(e=Jg(e));return Kg(e,i)}function d(e){let t=2*e,n=cy,i=hy;for(;!Yg(t,n);)t=2*(e=Qg(e,i));return Kg(e,i)+jg(t,n)}let u=2*n,p=ly,m=cy,f=hy;const g=Yg(u,m);if(g){const t=Kg(n,f),i=jg(u,m);return fg(n,p,e),o(t,i,!1,c,l+n,e)}{const u=Jg(n),g=Qg(n,f);let y,b,v,x,w=u,S=g;if(a&&(v=e,x=t,fg(w,p,v),fg(S,p,x),y=a(v),b=a(x),b<y)){w=g,S=u;const e=y;y=b,b=e,v=x}v||(v=e,fg(w,p,v));const M=r(v,Yg(2*w,m),y,c+1,l+w);let T;if(2===M){const e=h(w);T=o(e,d(w)-e,!0,c+1,l+w,v)}else T=M&&s(w,i,r,o,a,l,c+1);if(T)return!0;x=t,fg(S,p,x);const C=r(x,Yg(2*S,m),b,c+1,l+S);let L;if(2===C){const e=h(S);L=o(e,d(S)-e,!0,c+1,l+S,x)}else L=C&&s(S,i,r,o,a,l,c+1);return!!L}}}(),sy=function(){const e=new Xg,t=new Xg,n=new Wi,i=new zg,s=new zg;return function r(o,a,l,c){let h=arguments.length>4&&void 0!==arguments[4]?arguments[4]:null,d=2*o,u=ly,p=cy,m=hy;null===h&&(l.boundingBox||l.computeBoundingBox(),i.set(l.boundingBox.min,l.boundingBox.max,c),h=i);const f=Yg(d,p);if(!f){const e=o+8,t=m[o+6];fg(e,u,qg);if(h.intersectsBox(qg)&&r(e,a,l,c,h))return!0;fg(t,u,qg);return!!(h.intersectsBox(qg)&&r(t,a,l,c,h))}{const i=a,r=i.index,h=i.attributes.position,f=l.index,g=l.attributes.position,y=Kg(o,m),b=jg(d,p);if(n.copy(c).invert(),l.boundsTree){fg(o,u,s),s.matrix.copy(n),s.needsUpdate=!0;return l.boundsTree.shapecast({intersectsBounds:e=>s.intersectsBox(e),intersectsTriangle:e=>{e.a.applyMatrix4(c),e.b.applyMatrix4(c),e.c.applyMatrix4(c),e.needsUpdate=!0;for(let n=3*y,i=3*(b+y);n<i;n+=3)if(Fg(t,n,r,h),t.needsUpdate=!0,e.intersectsTriangle(t))return!0;return!1}})}for(let i=3*y,s=b+3*y;i<s;i+=3){Fg(e,i,r,h),e.a.applyMatrix4(n),e.b.applyMatrix4(n),e.c.applyMatrix4(n),e.needsUpdate=!0;for(let n=0,i=f.count;n<i;n+=3)if(Fg(t,n,f,g),t.needsUpdate=!0,e.intersectsTriangle(t))return!0}}}}();function ry(e,t,n,i){return fg(e,t,qg),n.intersectBox(qg,i)}const oy=[];let ay,ly,cy,hy;function dy(e){ay&&oy.push(ay),ay=e,ly=new Float32Array(e),cy=new Uint16Array(e),hy=new Uint32Array(e)}function uy(){ay=null,ly=null,cy=null,hy=null,oy.length&&dy(oy.pop())}const py=Symbol("skip tree generation"),my=new li,fy=new li,gy=new Wi,yy=new zg,by=new zg,vy=new ri,xy=new ri,wy=new ri,Sy=new ri,My=new ri,Ty=new li,Cy=new Og((()=>new Xg));class Ly{static serialize(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if(t.isBufferGeometry)return console.warn("MeshBVH.serialize: The arguments for the function have changed. See documentation for new signature."),Ly.serialize(arguments[0],{cloneBuffers:void 0===arguments[2]||arguments[2]});t={cloneBuffers:!0,...t};const n=e.geometry,i=e._roots,s=n.getIndex();let r;return r=t.cloneBuffers?{roots:i.map((e=>e.slice())),index:s.array.slice()}:{roots:i,index:s.array},r}static deserialize(e,t){let n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};if("boolean"==typeof n)return console.warn("MeshBVH.deserialize: The arguments for the function have changed. See documentation for new signature."),Ly.deserialize(arguments[0],arguments[1],{setIndex:void 0===arguments[2]||arguments[2]});n={setIndex:!0,...n};const{index:i,roots:s}=e,r=new Ly(t,{...n,[py]:!0});if(r._roots=s,n.setIndex){const n=t.getIndex();if(null===n){const n=new Ts(e.index,1,!1);t.setIndex(n)}else n.array!==i&&(n.array.set(i),n.needsUpdate=!0)}return r}constructor(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if(!e.isBufferGeometry)throw new Error("MeshBVH: Only BufferGeometries are supported.");if(e.index&&e.index.isInterleavedBufferAttribute)throw new Error("MeshBVH: InterleavedBufferAttribute is not supported for the index attribute.");if(t=Object.assign({strategy:0,maxDepth:40,maxLeafTris:10,verbose:!0,useSharedArrayBuffer:!1,setBoundingBox:!0,onProgress:null,[py]:!1},t),t.useSharedArrayBuffer&&"undefined"==typeof SharedArrayBuffer)throw new Error("MeshBVH: SharedArrayBuffer is not available.");this._roots=null,t[py]||(this._roots=function(e,t){const n=Rg(e,t);let i,s,r;const o=[],a=t.useSharedArrayBuffer?SharedArrayBuffer:ArrayBuffer;for(let e=0;e<n.length;e++){const t=n[e],h=new a(32*l(t));i=new Float32Array(h),s=new Uint32Array(h),r=new Uint16Array(h),c(0,t),o.push(h)}return o;function l(e){return e.count?1:1+l(e.left)+l(e.right)}function c(e,t){const n=e/4,o=e/2,a=!!t.count,l=t.boundingData;for(let e=0;e<6;e++)i[n+e]=l[e];if(a){const i=t.offset,a=t.count;return s[n+6]=i,r[o+14]=a,r[o+15]=65535,e+32}{const i=t.left,r=t.right,o=t.splitAxis;let a;if(a=c(e+32,i),a/4>Math.pow(2,32))throw new Error("MeshBVH: Cannot store child pointer greater than 32 bits.");return s[n+6]=a/4,a=c(a,r),s[n+7]=o,a}}}(e,t),!e.boundingBox&&t.setBoundingBox&&(e.boundingBox=this.getBoundingBox(new li))),this.geometry=e}refit(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:null;e&&Array.isArray(e)&&(e=new Set(e));const t=this.geometry,n=t.index.array,i=t.attributes.position,s=i.array,r=i.offset||0;let o,a,l,c,h=3;i.isInterleavedBufferAttribute&&(h=i.data.stride);let d=0;const u=this._roots;for(let e=0,t=u.length;e<t;e++)o=u[e],a=new Uint32Array(o),l=new Uint16Array(o),c=new Float32Array(o),p(0,d),d+=o.byteLength;function p(t,i){let o=arguments.length>2&&void 0!==arguments[2]&&arguments[2];const d=2*t,u=65535===l[d+15];if(u){const e=a[t+6];let i=1/0,o=1/0,u=1/0,p=-1/0,m=-1/0,f=-1/0;for(let t=3*e,a=3*(e+l[d+14]);t<a;t++){const e=n[t]*h+r,a=s[e+0],l=s[e+1],c=s[e+2];a<i&&(i=a),a>p&&(p=a),l<o&&(o=l),l>m&&(m=l),c<u&&(u=c),c>f&&(f=c)}return(c[t+0]!==i||c[t+1]!==o||c[t+2]!==u||c[t+3]!==p||c[t+4]!==m||c[t+5]!==f)&&(c[t+0]=i,c[t+1]=o,c[t+2]=u,c[t+3]=p,c[t+4]=m,c[t+5]=f,!0)}{const n=t+8,s=a[t+6],r=n+i,l=s+i;let h=o,d=!1,u=!1;e?h||(d=e.has(r),u=e.has(l),h=!d&&!u):(d=!0,u=!0);const m=h||u;let f=!1;(h||d)&&(f=p(n,i,h));let g=!1;m&&(g=p(s,i,h));const y=f||g;if(y)for(let e=0;e<3;e++){const i=n+e,r=s+e,o=c[i],a=c[i+3],l=c[r],h=c[r+3];c[t+e]=o<l?o:l,c[t+e+3]=a>h?a:h}return y}}}traverse(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0;const n=this._roots[t],i=new Uint32Array(n),s=new Uint16Array(n);!function t(r){let o=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0;const a=2*r,l=65535===s[a+15];if(l){const t=i[r+6],c=s[a+14];e(o,l,new Float32Array(n,4*r,6),t,c)}else{const s=r+8,a=i[r+6],c=i[r+7];e(o,l,new Float32Array(n,4*r,6),c)||(t(s,o+1),t(a,o+1))}}(0)}raycast(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0;const n=this._roots,i=this.geometry,s=[],r=t.isMaterial,o=Array.isArray(t),a=i.groups,l=r?t.side:t;for(let r=0,c=n.length;r<c;r++){const c=o?t[a[r].materialIndex].side:l,h=s.length;if(dy(n[r]),ty(0,i,c,e,s),uy(),o){const e=a[r].materialIndex;for(let t=h,n=s.length;t<n;t++)s[t].face.materialIndex=e}}return s}raycastFirst(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0;const n=this._roots,i=this.geometry,s=t.isMaterial,r=Array.isArray(t);let o=null;const a=i.groups,l=s?t.side:t;for(let s=0,c=n.length;s<c;s++){const c=r?t[a[s].materialIndex].side:l;dy(n[s]);const h=ny(0,i,c,e);uy(),null!=h&&(null==o||h.distance<o.distance)&&(o=h,r&&(h.face.materialIndex=a[s].materialIndex))}return o}intersectsGeometry(e,t){const n=this.geometry;let i=!1;for(const s of this._roots)if(dy(s),i=sy(0,n,e,t),uy(),i)break;return i}shapecast(e,t,n){const i=this.geometry;if(e instanceof Function){if(t){const e=t;t=(t,n,i,s)=>{const r=3*n;return e(t,r,r+1,r+2,i,s)}}e={boundsTraverseOrder:n,intersectsBounds:e,intersectsTriangle:t,intersectsRange:null},console.warn("MeshBVH: Shapecast function signature has changed and now takes an object of callbacks as a second argument. See docs for new signature.")}const s=Cy.getPrimitive();let{boundsTraverseOrder:r,intersectsBounds:o,intersectsRange:a,intersectsTriangle:l}=e;if(a&&l){const e=a;a=(t,n,r,o,a)=>!!e(t,n,r,o,a)||Ug(t,n,i,l,r,o,s)}else a||(a=l?(e,t,n,r)=>Ug(e,t,i,l,n,r,s):(e,t,n)=>n);let c=!1,h=0;for(const e of this._roots){if(dy(e),c=iy(0,i,o,a,r,h),uy(),c)break;h+=e.byteLength}return Cy.releasePrimitive(s),c}bvhcast(e,t,n){let{intersectsRanges:i,intersectsTriangles:s}=n;const r=this.geometry.index,o=this.geometry.attributes.position,a=e.geometry.index,l=e.geometry.attributes.position;gy.copy(t).invert();const c=Cy.getPrimitive(),h=Cy.getPrimitive();if(s){function d(e,n,i,d,u,p,m,f){for(let g=i,y=i+d;g<y;g++){Fg(h,3*g,a,l),h.a.applyMatrix4(t),h.b.applyMatrix4(t),h.c.applyMatrix4(t),h.needsUpdate=!0;for(let t=e,i=e+n;t<i;t++)if(Fg(c,3*t,r,o),c.needsUpdate=!0,s(c,h,t,g,u,p,m,f))return!0}return!1}if(i){const e=i;i=function(t,n,i,s,r,o,a,l){return!!e(t,n,i,s,r,o,a,l)||d(t,n,i,s,r,o,a,l)}}else i=d}e.getBoundingBox(fy),fy.applyMatrix4(t);const u=this.shapecast({intersectsBounds:e=>fy.intersectsBox(e),intersectsRange:(t,n,s,r,o,a)=>(my.copy(a),my.applyMatrix4(gy),e.shapecast({intersectsBounds:e=>my.intersectsBox(e),intersectsRange:(e,s,a,l,c)=>i(t,n,e,s,r,o,l,c)}))});return Cy.releasePrimitive(c),Cy.releasePrimitive(h),u}intersectsBox(e,t){return yy.set(e.min,e.max,t),yy.needsUpdate=!0,this.shapecast({intersectsBounds:e=>yy.intersectsBox(e),intersectsTriangle:e=>yy.intersectsTriangle(e)})}intersectsSphere(e){return this.shapecast({intersectsBounds:t=>e.intersectsBox(t),intersectsTriangle:t=>t.intersectsSphere(e)})}closestPointToGeometry(e,t){let n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{},s=arguments.length>4&&void 0!==arguments[4]?arguments[4]:0,r=arguments.length>5&&void 0!==arguments[5]?arguments[5]:1/0;e.boundingBox||e.computeBoundingBox(),yy.set(e.boundingBox.min,e.boundingBox.max,t),yy.needsUpdate=!0;const o=this.geometry,a=o.attributes.position,l=o.index,c=e.attributes.position,h=e.index,d=Cy.getPrimitive(),u=Cy.getPrimitive();let p=xy,m=wy,f=null,g=null;i&&(f=Sy,g=My);let y=1/0,b=null,v=null;return gy.copy(t).invert(),by.matrix.copy(gy),this.shapecast({boundsTraverseOrder:e=>yy.distanceToBox(e),intersectsBounds:(e,t,n)=>n<y&&n<r&&(t&&(by.min.copy(e.min),by.max.copy(e.max),by.needsUpdate=!0),!0),intersectsRange:(n,i)=>{if(e.boundsTree)return e.boundsTree.shapecast({boundsTraverseOrder:e=>by.distanceToBox(e),intersectsBounds:(e,t,n)=>n<y&&n<r,intersectsRange:(e,r)=>{for(let o=3*e,x=3*(e+r);o<x;o+=3){Fg(u,o,h,c),u.a.applyMatrix4(t),u.b.applyMatrix4(t),u.c.applyMatrix4(t),u.needsUpdate=!0;for(let e=3*n,t=3*(n+i);e<t;e+=3){Fg(d,e,l,a),d.needsUpdate=!0;const t=d.distanceToTriangle(u,p,f);if(t<y&&(m.copy(p),g&&g.copy(f),y=t,b=e/3,v=o/3),t<s)return!0}}}});for(let e=0,r=h?h.count:c.count;e<r;e+=3){Fg(u,e,h,c),u.a.applyMatrix4(t),u.b.applyMatrix4(t),u.c.applyMatrix4(t),u.needsUpdate=!0;for(let t=3*n,r=3*(n+i);t<r;t+=3){Fg(d,t,l,a),d.needsUpdate=!0;const n=d.distanceToTriangle(u,p,f);if(n<y&&(m.copy(p),g&&g.copy(f),y=n,b=t/3,v=e/3),n<s)return!0}}}}),Cy.releasePrimitive(d),Cy.releasePrimitive(u),y===1/0?null:(n.point?n.point.copy(m):n.point=m.clone(),n.distance=y,n.faceIndex=b,i&&(i.point?i.point.copy(g):i.point=g.clone(),i.point.applyMatrix4(gy),m.applyMatrix4(gy),i.distance=m.sub(i.point).length(),i.faceIndex=v),n)}closestPointToPoint(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:0,i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:1/0;const s=n*n,r=i*i;let o=1/0,a=null;if(this.shapecast({boundsTraverseOrder:t=>(vy.copy(e).clamp(t.min,t.max),vy.distanceToSquared(e)),intersectsBounds:(e,t,n)=>n<o&&n<r,intersectsTriangle:(t,n)=>{t.closestPointToPoint(e,vy);const i=e.distanceToSquared(vy);return i<o&&(xy.copy(vy),o=i,a=n),i<s}}),o===1/0)return null;const l=Math.sqrt(o);return t.point?t.point.copy(xy):t.point=xy.clone(),t.distance=l,t.faceIndex=a,t}getBoundingBox(e){e.makeEmpty();return this._roots.forEach((t=>{fg(0,new Float32Array(t),Ty),e.union(Ty)})),e}}const Ry=Ly.prototype.raycast;Ly.prototype.raycast=function(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];if(t[0].isMesh){console.warn('MeshBVH: The function signature and results frame for "raycast" has changed. See docs for new signature.');const[e,n,i,s]=t;return Ry.call(this,i,e.material).forEach((t=>{(t=kg(t,e,n))&&s.push(t)})),s}return Ry.apply(this,t)};const Gy=Ly.prototype.raycastFirst;Ly.prototype.raycastFirst=function(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];if(t[0].isMesh){console.warn('MeshBVH: The function signature and results frame for "raycastFirst" has changed. See docs for new signature.');const[e,n,i]=t;return kg(Gy.call(this,i,e.material),e,n)}return Gy.apply(this,t)};const Ay=Ly.prototype.closestPointToPoint;Ly.prototype.closestPointToPoint=function(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];if(t[0].isMesh){console.warn('MeshBVH: The function signature and results frame for "closestPointToPoint" has changed. See docs for new signature.'),t.unshift();const e=t[1],n={};return t[1]=n,Ay.apply(this,t),e&&e.copy(n.point),n.distance}return Ay.apply(this,t)};const _y=Ly.prototype.closestPointToGeometry;Ly.prototype.closestPointToGeometry=function(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];const i=t[2],s=t[3];if(i&&i.isVector3||s&&s.isVector3){console.warn('MeshBVH: The function signature and results frame for "closestPointToGeometry" has changed. See docs for new signature.');const e={},n={},r=t[1];return t[2]=e,t[3]=n,_y.apply(this,t),i&&i.copy(e.point),s&&s.copy(n.point).applyMatrix4(r),e.distance}return _y.apply(this,t)};const Iy=Ly.prototype.refit;Ly.prototype.refit=function(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];const i=t[0],s=t[1];if(s&&(s instanceof Set||Array.isArray(s))){console.warn('MeshBVH: The function signature for "refit" has changed. See docs for new signature.');const e=new Set;s.forEach((t=>e.add(t))),i&&i.forEach((t=>e.add(t))),Iy.call(this,e)}else Iy.apply(this,t)},["intersectsGeometry","shapecast","intersectsBox","intersectsSphere"].forEach((e=>{const t=Ly.prototype[e];Ly.prototype[e]=function(){for(var n=arguments.length,i=new Array(n),s=0;s<n;s++)i[s]=arguments[s];return(null===i[0]||i[0].isMesh)&&(i.shift(),console.warn(`MeshBVH: The function signature for "${e}" has changed and no longer takes Mesh. See docs for new signature.`)),t.apply(this,i)}}));const Ey=new Pi,Xy=new Wi,zy=or.prototype.raycast;class Py extends cl{constructor(){super();const e=new lr;e.deleteAttribute("uv");const t=new kh({side:1}),n=new kh,i=new Wd(16777215,5,28,2);i.position.set(.418,16.199,.3),this.add(i);const s=new or(e,t);s.position.set(-.757,13.219,.717),s.scale.set(31.713,28.305,28.591),this.add(s);const r=new or(e,n);r.position.set(-10.906,2.009,1.846),r.rotation.set(0,-.195,0),r.scale.set(2.328,7.905,4.651),this.add(r);const o=new or(e,n);o.position.set(-5.607,-.754,-.758),o.rotation.set(0,.994,0),o.scale.set(1.97,1.534,3.955),this.add(o);const a=new or(e,n);a.position.set(6.167,.857,7.803),a.rotation.set(0,.561,0),a.scale.set(3.927,6.285,3.687),this.add(a);const l=new or(e,n);l.position.set(-2.017,.018,6.124),l.rotation.set(0,.333,0),l.scale.set(2.002,4.566,2.064),this.add(l);const c=new or(e,n);c.position.set(2.291,-.756,-2.621),c.rotation.set(0,-.286,0),c.scale.set(1.546,1.552,1.496),this.add(c);const h=new or(e,n);h.position.set(-2.193,-.369,-5.547),h.rotation.set(0,.516,0),h.scale.set(3.875,3.487,2.986),this.add(h);const d=new or(e,Wy(50));d.position.set(-16.116,14.37,8.208),d.scale.set(.1,2.428,2.739),this.add(d);const u=new or(e,Wy(50));u.position.set(-16.109,18.021,-8.207),u.scale.set(.1,2.425,2.751),this.add(u);const p=new or(e,Wy(17));p.position.set(14.904,12.198,-1.832),p.scale.set(.15,4.265,6.331),this.add(p);const m=new or(e,Wy(43));m.position.set(-.462,8.89,14.52),m.scale.set(4.38,5.441,.088),this.add(m);const f=new or(e,Wy(20));f.position.set(3.235,11.486,-12.541),f.scale.set(2.5,2,.1),this.add(f);const g=new or(e,Wy(100));g.position.set(0,20,0),g.scale.set(1,.1,1),this.add(g)}}function Wy(e){const t=new ws;return t.color.setScalar(e),t}var Zy=function(){var e=0,t=document.createElement("div");function n(e){return t.appendChild(e.dom),e}function i(n){for(var i=0;i<t.children.length;i++)t.children[i].style.display=i===n?"block":"none";e=n}t.style.cssText="position:fixed;top:0;left:0;cursor:pointer;opacity:0.9;z-index:10000",t.addEventListener("click",(function(n){n.preventDefault(),i(++e%t.children.length)}),!1);var s=(performance||Date).now(),r=s,o=0,a=n(new Zy.Panel("FPS","#0ff","#002")),l=n(new Zy.Panel("MS","#0f0","#020"));if(self.performance&&self.performance.memory)var c=n(new Zy.Panel("MB","#f08","#201"));return i(0),{REVISION:16,dom:t,addPanel:n,showPanel:i,begin:function(){s=(performance||Date).now()},end:function(){o++;var e=(performance||Date).now();if(l.update(e-s,200),e>=r+1e3&&(a.update(1e3*o/(e-r),100),r=e,o=0,c)){var t=performance.memory;c.update(t.usedJSHeapSize/1048576,t.jsHeapSizeLimit/1048576)}return e},update:function(){s=this.end()},domElement:t,setMode:i}};Zy.Panel=function(e,t,n){var i=1/0,s=0,r=Math.round,o=r(window.devicePixelRatio||1),a=80*o,l=48*o,c=3*o,h=2*o,d=3*o,u=15*o,p=74*o,m=30*o,f=document.createElement("canvas");f.width=a,f.height=l,f.style.cssText="width:80px;height:48px";var g=f.getContext("2d");return g.font="bold "+9*o+"px Helvetica,Arial,sans-serif",g.textBaseline="top",g.fillStyle=n,g.fillRect(0,0,a,l),g.fillStyle=t,g.fillText(e,c,h),g.fillRect(d,u,p,m),g.fillStyle=n,g.globalAlpha=.9,g.fillRect(d,u,p,m),{dom:f,update:function(l,y){i=Math.min(i,l),s=Math.max(s,l),g.fillStyle=n,g.globalAlpha=1,g.fillRect(0,0,a,u),g.fillStyle=t,g.fillText(r(l)+" "+e+" ("+r(i)+"-"+r(s)+")",c,h),g.drawImage(f,d+o,u,p-o,m,d,u,p-o,m),g.fillRect(d+p-o,u,o,m),g.fillStyle=n,g.globalAlpha=.9,g.fillRect(d+p-o,u,o,r((1-l/y)*m))}}};var Ny=Zy;class Vy extends or{constructor(){const e=Vy.SkyShader,t=new ur({name:"SkyShader",fragmentShader:e.fragmentShader,vertexShader:e.vertexShader,uniforms:dr.clone(e.uniforms),side:1,depthWrite:!1});super(new lr(1,1,1),t),this.isSky=!0}}Vy.SkyShader={uniforms:{turbidity:{value:2},rayleigh:{value:1},mieCoefficient:{value:.005},mieDirectionalG:{value:.8},sunPosition:{value:new ri},up:{value:new ri(0,1,0)}},vertexShader:"\n\t\tuniform vec3 sunPosition;\n\t\tuniform float rayleigh;\n\t\tuniform float turbidity;\n\t\tuniform float mieCoefficient;\n\t\tuniform vec3 up;\n\n\t\tvarying vec3 vWorldPosition;\n\t\tvarying vec3 vSunDirection;\n\t\tvarying float vSunfade;\n\t\tvarying vec3 vBetaR;\n\t\tvarying vec3 vBetaM;\n\t\tvarying float vSunE;\n\n\t\t// constants for atmospheric scattering\n\t\tconst float e = 2.71828182845904523536028747135266249775724709369995957;\n\t\tconst float pi = 3.141592653589793238462643383279502884197169;\n\n\t\t// wavelength of used primaries, according to preetham\n\t\tconst vec3 lambda = vec3( 680E-9, 550E-9, 450E-9 );\n\t\t// this pre-calcuation replaces older TotalRayleigh(vec3 lambda) function:\n\t\t// (8.0 * pow(pi, 3.0) * pow(pow(n, 2.0) - 1.0, 2.0) * (6.0 + 3.0 * pn)) / (3.0 * N * pow(lambda, vec3(4.0)) * (6.0 - 7.0 * pn))\n\t\tconst vec3 totalRayleigh = vec3( 5.804542996261093E-6, 1.3562911419845635E-5, 3.0265902468824876E-5 );\n\n\t\t// mie stuff\n\t\t// K coefficient for the primaries\n\t\tconst float v = 4.0;\n\t\tconst vec3 K = vec3( 0.686, 0.678, 0.666 );\n\t\t// MieConst = pi * pow( ( 2.0 * pi ) / lambda, vec3( v - 2.0 ) ) * K\n\t\tconst vec3 MieConst = vec3( 1.8399918514433978E14, 2.7798023919660528E14, 4.0790479543861094E14 );\n\n\t\t// earth shadow hack\n\t\t// cutoffAngle = pi / 1.95;\n\t\tconst float cutoffAngle = 1.6110731556870734;\n\t\tconst float steepness = 1.5;\n\t\tconst float EE = 1000.0;\n\n\t\tfloat sunIntensity( float zenithAngleCos ) {\n\t\t\tzenithAngleCos = clamp( zenithAngleCos, -1.0, 1.0 );\n\t\t\treturn EE * max( 0.0, 1.0 - pow( e, -( ( cutoffAngle - acos( zenithAngleCos ) ) / steepness ) ) );\n\t\t}\n\n\t\tvec3 totalMie( float T ) {\n\t\t\tfloat c = ( 0.2 * T ) * 10E-18;\n\t\t\treturn 0.434 * c * MieConst;\n\t\t}\n\n\t\tvoid main() {\n\n\t\t\tvec4 worldPosition = modelMatrix * vec4( position, 1.0 );\n\t\t\tvWorldPosition = worldPosition.xyz;\n\n\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\t\t\tgl_Position.z = gl_Position.w; // set z to camera.far\n\n\t\t\tvSunDirection = normalize( sunPosition );\n\n\t\t\tvSunE = sunIntensity( dot( vSunDirection, up ) );\n\n\t\t\tvSunfade = 1.0 - clamp( 1.0 - exp( ( sunPosition.y / 450000.0 ) ), 0.0, 1.0 );\n\n\t\t\tfloat rayleighCoefficient = rayleigh - ( 1.0 * ( 1.0 - vSunfade ) );\n\n\t\t\t// extinction (absorbtion + out scattering)\n\t\t\t// rayleigh coefficients\n\t\t\tvBetaR = totalRayleigh * rayleighCoefficient;\n\n\t\t\t// mie coefficients\n\t\t\tvBetaM = totalMie( turbidity ) * mieCoefficient;\n\n\t\t}",fragmentShader:"\n\t\tvarying vec3 vWorldPosition;\n\t\tvarying vec3 vSunDirection;\n\t\tvarying float vSunfade;\n\t\tvarying vec3 vBetaR;\n\t\tvarying vec3 vBetaM;\n\t\tvarying float vSunE;\n\n\t\tuniform float mieDirectionalG;\n\t\tuniform vec3 up;\n\n\t\tconst vec3 cameraPos = vec3( 0.0, 0.0, 0.0 );\n\n\t\t// constants for atmospheric scattering\n\t\tconst float pi = 3.141592653589793238462643383279502884197169;\n\n\t\tconst float n = 1.0003; // refractive index of air\n\t\tconst float N = 2.545E25; // number of molecules per unit volume for air at 288.15K and 1013mb (sea level -45 celsius)\n\n\t\t// optical length at zenith for molecules\n\t\tconst float rayleighZenithLength = 8.4E3;\n\t\tconst float mieZenithLength = 1.25E3;\n\t\t// 66 arc seconds -> degrees, and the cosine of that\n\t\tconst float sunAngularDiameterCos = 0.999956676946448443553574619906976478926848692873900859324;\n\n\t\t// 3.0 / ( 16.0 * pi )\n\t\tconst float THREE_OVER_SIXTEENPI = 0.05968310365946075;\n\t\t// 1.0 / ( 4.0 * pi )\n\t\tconst float ONE_OVER_FOURPI = 0.07957747154594767;\n\n\t\tfloat rayleighPhase( float cosTheta ) {\n\t\t\treturn THREE_OVER_SIXTEENPI * ( 1.0 + pow( cosTheta, 2.0 ) );\n\t\t}\n\n\t\tfloat hgPhase( float cosTheta, float g ) {\n\t\t\tfloat g2 = pow( g, 2.0 );\n\t\t\tfloat inverse = 1.0 / pow( 1.0 - 2.0 * g * cosTheta + g2, 1.5 );\n\t\t\treturn ONE_OVER_FOURPI * ( ( 1.0 - g2 ) * inverse );\n\t\t}\n\n\t\tvoid main() {\n\n\t\t\tvec3 direction = normalize( vWorldPosition - cameraPos );\n\n\t\t\t// optical length\n\t\t\t// cutoff angle at 90 to avoid singularity in next formula.\n\t\t\tfloat zenithAngle = acos( max( 0.0, dot( up, direction ) ) );\n\t\t\tfloat inverse = 1.0 / ( cos( zenithAngle ) + 0.15 * pow( 93.885 - ( ( zenithAngle * 180.0 ) / pi ), -1.253 ) );\n\t\t\tfloat sR = rayleighZenithLength * inverse;\n\t\t\tfloat sM = mieZenithLength * inverse;\n\n\t\t\t// combined extinction factor\n\t\t\tvec3 Fex = exp( -( vBetaR * sR + vBetaM * sM ) );\n\n\t\t\t// in scattering\n\t\t\tfloat cosTheta = dot( direction, vSunDirection );\n\n\t\t\tfloat rPhase = rayleighPhase( cosTheta * 0.5 + 0.5 );\n\t\t\tvec3 betaRTheta = vBetaR * rPhase;\n\n\t\t\tfloat mPhase = hgPhase( cosTheta, mieDirectionalG );\n\t\t\tvec3 betaMTheta = vBetaM * mPhase;\n\n\t\t\tvec3 Lin = pow( vSunE * ( ( betaRTheta + betaMTheta ) / ( vBetaR + vBetaM ) ) * ( 1.0 - Fex ), vec3( 1.5 ) );\n\t\t\tLin *= mix( vec3( 1.0 ), pow( vSunE * ( ( betaRTheta + betaMTheta ) / ( vBetaR + vBetaM ) ) * Fex, vec3( 1.0 / 2.0 ) ), clamp( pow( 1.0 - dot( up, vSunDirection ), 5.0 ), 0.0, 1.0 ) );\n\n\t\t\t// nightsky\n\t\t\tfloat theta = acos( direction.y ); // elevation --\x3e y-axis, [-pi/2, pi/2]\n\t\t\tfloat phi = atan( direction.z, direction.x ); // azimuth --\x3e x-axis [-pi/2, pi/2]\n\t\t\tvec2 uv = vec2( phi, theta ) / vec2( 2.0 * pi, pi ) + vec2( 0.5, 0.0 );\n\t\t\tvec3 L0 = vec3( 0.1 ) * Fex;\n\n\t\t\t// composition + solar disc\n\t\t\tfloat sundisk = smoothstep( sunAngularDiameterCos, sunAngularDiameterCos + 0.00002, cosTheta );\n\t\t\tL0 += ( vSunE * 19000.0 * Fex ) * sundisk;\n\n\t\t\tvec3 texColor = ( Lin + L0 ) * 0.04 + vec3( 0.0, 0.0003, 0.00075 );\n\n\t\t\tvec3 retColor = pow( texColor, vec3( 1.0 / ( 1.2 + ( 1.2 * vSunfade ) ) ) );\n\n\t\t\tgl_FragColor = vec4( retColor, 1.0 );\n\n\t\t\t#include <tonemapping_fragment>\n\t\t\t#include <encodings_fragment>\n\n\t\t}"};class Dy{constructor(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:4;this.pool=e,this.queue=[],this.workers=[],this.workersResolve=[],this.workerStatus=0}_initWorker(e){if(!this.workers[e]){const t=this.workerCreator();t.addEventListener("message",this._onMessage.bind(this,e)),this.workers[e]=t}}_getIdleWorker(){for(let e=0;e<this.pool;e++)if(!(this.workerStatus&1<<e))return e;return-1}_onMessage(e,t){const n=this.workersResolve[e];if(n&&n(t),this.queue.length){const{resolve:t,msg:n,transfer:i}=this.queue.shift();this.workersResolve[e]=t,this.workers[e].postMessage(n,i)}else this.workerStatus^=1<<e}setWorkerCreator(e){this.workerCreator=e}setWorkerLimit(e){this.pool=e}postMessage(e,t){return new Promise((n=>{const i=this._getIdleWorker();-1!==i?(this._initWorker(i),this.workerStatus|=1<<i,this.workersResolve[i]=n,this.workers[i].postMessage(e,t)):this.queue.push({resolve:n,msg:e,transfer:t})}))}dispose(){this.workers.forEach((e=>e.terminate())),this.workersResolve.length=0,this.workers.length=0,this.queue.length=0,this.workerStatus=0}}function By(e,t,n){var i=void 0===t?null:t,s=function(e,t){var n=atob(e);if(t){for(var i=new Uint8Array(n.length),s=0,r=n.length;s<r;++s)i[s]=n.charCodeAt(s);return String.fromCharCode.apply(null,new Uint16Array(i.buffer))}return n}(e,void 0!==n&&n),r=s.indexOf("\n",10)+1,o=s.substring(r)+(i?"//# sourceMappingURL="+i:""),a=new Blob([o],{type:"application/javascript"});return URL.createObjectURL(a)}var Hy,ky,Fy,Uy,Oy=(Hy="Lyogcm9sbHVwLXBsdWdpbi13ZWItd29ya2VyLWxvYWRlciAqLwohZnVuY3Rpb24oKXsidXNlIHN0cmljdCI7Ci8qKgoJICogQGxpY2Vuc2UKCSAqIENvcHlyaWdodCAyMDEwLTIwMjIgVGhyZWUuanMgQXV0aG9ycwoJICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IE1JVAoJICovY29uc3QgdD0xMDAxLGU9InNyZ2IiLHM9InNyZ2ItbGluZWFyIjtjbGFzcyBpe2FkZEV2ZW50TGlzdGVuZXIodCxlKXt2b2lkIDA9PT10aGlzLl9saXN0ZW5lcnMmJih0aGlzLl9saXN0ZW5lcnM9e30pO2NvbnN0IHM9dGhpcy5fbGlzdGVuZXJzO3ZvaWQgMD09PXNbdF0mJihzW3RdPVtdKSwtMT09PXNbdF0uaW5kZXhPZihlKSYmc1t0XS5wdXNoKGUpfWhhc0V2ZW50TGlzdGVuZXIodCxlKXtpZih2b2lkIDA9PT10aGlzLl9saXN0ZW5lcnMpcmV0dXJuITE7Y29uc3Qgcz10aGlzLl9saXN0ZW5lcnM7cmV0dXJuIHZvaWQgMCE9PXNbdF0mJi0xIT09c1t0XS5pbmRleE9mKGUpfXJlbW92ZUV2ZW50TGlzdGVuZXIodCxlKXtpZih2b2lkIDA9PT10aGlzLl9saXN0ZW5lcnMpcmV0dXJuO2NvbnN0IHM9dGhpcy5fbGlzdGVuZXJzW3RdO2lmKHZvaWQgMCE9PXMpe2NvbnN0IHQ9cy5pbmRleE9mKGUpOy0xIT09dCYmcy5zcGxpY2UodCwxKX19ZGlzcGF0Y2hFdmVudCh0KXtpZih2b2lkIDA9PT10aGlzLl9saXN0ZW5lcnMpcmV0dXJuO2NvbnN0IGU9dGhpcy5fbGlzdGVuZXJzW3QudHlwZV07aWYodm9pZCAwIT09ZSl7dC50YXJnZXQ9dGhpcztjb25zdCBzPWUuc2xpY2UoMCk7Zm9yKGxldCBlPTAsaT1zLmxlbmd0aDtlPGk7ZSsrKXNbZV0uY2FsbCh0aGlzLHQpO3QudGFyZ2V0PW51bGx9fX1jb25zdCByPVsiMDAiLCIwMSIsIjAyIiwiMDMiLCIwNCIsIjA1IiwiMDYiLCIwNyIsIjA4IiwiMDkiLCIwYSIsIjBiIiwiMGMiLCIwZCIsIjBlIiwiMGYiLCIxMCIsIjExIiwiMTIiLCIxMyIsIjE0IiwiMTUiLCIxNiIsIjE3IiwiMTgiLCIxOSIsIjFhIiwiMWIiLCIxYyIsIjFkIiwiMWUiLCIxZiIsIjIwIiwiMjEiLCIyMiIsIjIzIiwiMjQiLCIyNSIsIjI2IiwiMjciLCIyOCIsIjI5IiwiMmEiLCIyYiIsIjJjIiwiMmQiLCIyZSIsIjJmIiwiMzAiLCIzMSIsIjMyIiwiMzMiLCIzNCIsIjM1IiwiMzYiLCIzNyIsIjM4IiwiMzkiLCIzYSIsIjNiIiwiM2MiLCIzZCIsIjNlIiwiM2YiLCI0MCIsIjQxIiwiNDIiLCI0MyIsIjQ0IiwiNDUiLCI0NiIsIjQ3IiwiNDgiLCI0OSIsIjRhIiwiNGIiLCI0YyIsIjRkIiwiNGUiLCI0ZiIsIjUwIiwiNTEiLCI1MiIsIjUzIiwiNTQiLCI1NSIsIjU2IiwiNTciLCI1OCIsIjU5IiwiNWEiLCI1YiIsIjVjIiwiNWQiLCI1ZSIsIjVmIiwiNjAiLCI2MSIsIjYyIiwiNjMiLCI2NCIsIjY1IiwiNjYiLCI2NyIsIjY4IiwiNjkiLCI2YSIsIjZiIiwiNmMiLCI2ZCIsIjZlIiwiNmYiLCI3MCIsIjcxIiwiNzIiLCI3MyIsIjc0IiwiNzUiLCI3NiIsIjc3IiwiNzgiLCI3OSIsIjdhIiwiN2IiLCI3YyIsIjdkIiwiN2UiLCI3ZiIsIjgwIiwiODEiLCI4MiIsIjgzIiwiODQiLCI4NSIsIjg2IiwiODciLCI4OCIsIjg5IiwiOGEiLCI4YiIsIjhjIiwiOGQiLCI4ZSIsIjhmIiwiOTAiLCI5MSIsIjkyIiwiOTMiLCI5NCIsIjk1IiwiOTYiLCI5NyIsIjk4IiwiOTkiLCI5YSIsIjliIiwiOWMiLCI5ZCIsIjllIiwiOWYiLCJhMCIsImExIiwiYTIiLCJhMyIsImE0IiwiYTUiLCJhNiIsImE3IiwiYTgiLCJhOSIsImFhIiwiYWIiLCJhYyIsImFkIiwiYWUiLCJhZiIsImIwIiwiYjEiLCJiMiIsImIzIiwiYjQiLCJiNSIsImI2IiwiYjciLCJiOCIsImI5IiwiYmEiLCJiYiIsImJjIiwiYmQiLCJiZSIsImJmIiwiYzAiLCJjMSIsImMyIiwiYzMiLCJjNCIsImM1IiwiYzYiLCJjNyIsImM4IiwiYzkiLCJjYSIsImNiIiwiY2MiLCJjZCIsImNlIiwiY2YiLCJkMCIsImQxIiwiZDIiLCJkMyIsImQ0IiwiZDUiLCJkNiIsImQ3IiwiZDgiLCJkOSIsImRhIiwiZGIiLCJkYyIsImRkIiwiZGUiLCJkZiIsImUwIiwiZTEiLCJlMiIsImUzIiwiZTQiLCJlNSIsImU2IiwiZTciLCJlOCIsImU5IiwiZWEiLCJlYiIsImVjIiwiZWQiLCJlZSIsImVmIiwiZjAiLCJmMSIsImYyIiwiZjMiLCJmNCIsImY1IiwiZjYiLCJmNyIsImY4IiwiZjkiLCJmYSIsImZiIiwiZmMiLCJmZCIsImZlIiwiZmYiXTtmdW5jdGlvbiBuKCl7Y29uc3QgdD00Mjk0OTY3Mjk1Kk1hdGgucmFuZG9tKCl8MCxlPTQyOTQ5NjcyOTUqTWF0aC5yYW5kb20oKXwwLHM9NDI5NDk2NzI5NSpNYXRoLnJhbmRvbSgpfDAsaT00Mjk0OTY3Mjk1Kk1hdGgucmFuZG9tKCl8MDtyZXR1cm4oclsyNTUmdF0rclt0Pj44JjI1NV0rclt0Pj4xNiYyNTVdK3JbdD4+MjQmMjU1XSsiLSIrclsyNTUmZV0rcltlPj44JjI1NV0rIi0iK3JbZT4+MTYmMTV8NjRdK3JbZT4+MjQmMjU1XSsiLSIrcls2MyZzfDEyOF0rcltzPj44JjI1NV0rIi0iK3Jbcz4+MTYmMjU1XStyW3M+PjI0JjI1NV0rclsyNTUmaV0rcltpPj44JjI1NV0rcltpPj4xNiYyNTVdK3JbaT4+MjQmMjU1XSkudG9Mb3dlckNhc2UoKX1mdW5jdGlvbiBvKHQsZSxzKXtyZXR1cm4gTWF0aC5tYXgoZSxNYXRoLm1pbihzLHQpKX1mdW5jdGlvbiBhKHQsZSxzKXtyZXR1cm4oMS1zKSp0K3MqZX1jbGFzcyBoe2NvbnN0cnVjdG9yKCl7bGV0IHQ9YXJndW1lbnRzLmxlbmd0aD4wJiZ2b2lkIDAhPT1hcmd1bWVudHNbMF0/YXJndW1lbnRzWzBdOjAsZT1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06MDtoLnByb3RvdHlwZS5pc1ZlY3RvcjI9ITAsdGhpcy54PXQsdGhpcy55PWV9Z2V0IHdpZHRoKCl7cmV0dXJuIHRoaXMueH1zZXQgd2lkdGgodCl7dGhpcy54PXR9Z2V0IGhlaWdodCgpe3JldHVybiB0aGlzLnl9c2V0IGhlaWdodCh0KXt0aGlzLnk9dH1zZXQodCxlKXtyZXR1cm4gdGhpcy54PXQsdGhpcy55PWUsdGhpc31zZXRTY2FsYXIodCl7cmV0dXJuIHRoaXMueD10LHRoaXMueT10LHRoaXN9c2V0WCh0KXtyZXR1cm4gdGhpcy54PXQsdGhpc31zZXRZKHQpe3JldHVybiB0aGlzLnk9dCx0aGlzfXNldENvbXBvbmVudCh0LGUpe3N3aXRjaCh0KXtjYXNlIDA6dGhpcy54PWU7YnJlYWs7Y2FzZSAxOnRoaXMueT1lO2JyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCJpbmRleCBpcyBvdXQgb2YgcmFuZ2U6ICIrdCl9cmV0dXJuIHRoaXN9Z2V0Q29tcG9uZW50KHQpe3N3aXRjaCh0KXtjYXNlIDA6cmV0dXJuIHRoaXMueDtjYXNlIDE6cmV0dXJuIHRoaXMueTtkZWZhdWx0OnRocm93IG5ldyBFcnJvcigiaW5kZXggaXMgb3V0IG9mIHJhbmdlOiAiK3QpfX1jbG9uZSgpe3JldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3Rvcih0aGlzLngsdGhpcy55KX1jb3B5KHQpe3JldHVybiB0aGlzLng9dC54LHRoaXMueT10LnksdGhpc31hZGQodCxlKXtyZXR1cm4gdm9pZCAwIT09ZT8oY29uc29sZS53YXJuKCJUSFJFRS5WZWN0b3IyOiAuYWRkKCkgbm93IG9ubHkgYWNjZXB0cyBvbmUgYXJndW1lbnQuIFVzZSAuYWRkVmVjdG9ycyggYSwgYiApIGluc3RlYWQuIiksdGhpcy5hZGRWZWN0b3JzKHQsZSkpOih0aGlzLngrPXQueCx0aGlzLnkrPXQueSx0aGlzKX1hZGRTY2FsYXIodCl7cmV0dXJuIHRoaXMueCs9dCx0aGlzLnkrPXQsdGhpc31hZGRWZWN0b3JzKHQsZSl7cmV0dXJuIHRoaXMueD10LngrZS54LHRoaXMueT10LnkrZS55LHRoaXN9YWRkU2NhbGVkVmVjdG9yKHQsZSl7cmV0dXJuIHRoaXMueCs9dC54KmUsdGhpcy55Kz10LnkqZSx0aGlzfXN1Yih0LGUpe3JldHVybiB2b2lkIDAhPT1lPyhjb25zb2xlLndhcm4oIlRIUkVFLlZlY3RvcjI6IC5zdWIoKSBub3cgb25seSBhY2NlcHRzIG9uZSBhcmd1bWVudC4gVXNlIC5zdWJWZWN0b3JzKCBhLCBiICkgaW5zdGVhZC4iKSx0aGlzLnN1YlZlY3RvcnModCxlKSk6KHRoaXMueC09dC54LHRoaXMueS09dC55LHRoaXMpfXN1YlNjYWxhcih0KXtyZXR1cm4gdGhpcy54LT10LHRoaXMueS09dCx0aGlzfXN1YlZlY3RvcnModCxlKXtyZXR1cm4gdGhpcy54PXQueC1lLngsdGhpcy55PXQueS1lLnksdGhpc31tdWx0aXBseSh0KXtyZXR1cm4gdGhpcy54Kj10LngsdGhpcy55Kj10LnksdGhpc31tdWx0aXBseVNjYWxhcih0KXtyZXR1cm4gdGhpcy54Kj10LHRoaXMueSo9dCx0aGlzfWRpdmlkZSh0KXtyZXR1cm4gdGhpcy54Lz10LngsdGhpcy55Lz10LnksdGhpc31kaXZpZGVTY2FsYXIodCl7cmV0dXJuIHRoaXMubXVsdGlwbHlTY2FsYXIoMS90KX1hcHBseU1hdHJpeDModCl7Y29uc3QgZT10aGlzLngscz10aGlzLnksaT10LmVsZW1lbnRzO3JldHVybiB0aGlzLng9aVswXSplK2lbM10qcytpWzZdLHRoaXMueT1pWzFdKmUraVs0XSpzK2lbN10sdGhpc31taW4odCl7cmV0dXJuIHRoaXMueD1NYXRoLm1pbih0aGlzLngsdC54KSx0aGlzLnk9TWF0aC5taW4odGhpcy55LHQueSksdGhpc31tYXgodCl7cmV0dXJuIHRoaXMueD1NYXRoLm1heCh0aGlzLngsdC54KSx0aGlzLnk9TWF0aC5tYXgodGhpcy55LHQueSksdGhpc31jbGFtcCh0LGUpe3JldHVybiB0aGlzLng9TWF0aC5tYXgodC54LE1hdGgubWluKGUueCx0aGlzLngpKSx0aGlzLnk9TWF0aC5tYXgodC55LE1hdGgubWluKGUueSx0aGlzLnkpKSx0aGlzfWNsYW1wU2NhbGFyKHQsZSl7cmV0dXJuIHRoaXMueD1NYXRoLm1heCh0LE1hdGgubWluKGUsdGhpcy54KSksdGhpcy55PU1hdGgubWF4KHQsTWF0aC5taW4oZSx0aGlzLnkpKSx0aGlzfWNsYW1wTGVuZ3RoKHQsZSl7Y29uc3Qgcz10aGlzLmxlbmd0aCgpO3JldHVybiB0aGlzLmRpdmlkZVNjYWxhcihzfHwxKS5tdWx0aXBseVNjYWxhcihNYXRoLm1heCh0LE1hdGgubWluKGUscykpKX1mbG9vcigpe3JldHVybiB0aGlzLng9TWF0aC5mbG9vcih0aGlzLngpLHRoaXMueT1NYXRoLmZsb29yKHRoaXMueSksdGhpc31jZWlsKCl7cmV0dXJuIHRoaXMueD1NYXRoLmNlaWwodGhpcy54KSx0aGlzLnk9TWF0aC5jZWlsKHRoaXMueSksdGhpc31yb3VuZCgpe3JldHVybiB0aGlzLng9TWF0aC5yb3VuZCh0aGlzLngpLHRoaXMueT1NYXRoLnJvdW5kKHRoaXMueSksdGhpc31yb3VuZFRvWmVybygpe3JldHVybiB0aGlzLng9dGhpcy54PDA/TWF0aC5jZWlsKHRoaXMueCk6TWF0aC5mbG9vcih0aGlzLngpLHRoaXMueT10aGlzLnk8MD9NYXRoLmNlaWwodGhpcy55KTpNYXRoLmZsb29yKHRoaXMueSksdGhpc31uZWdhdGUoKXtyZXR1cm4gdGhpcy54PS10aGlzLngsdGhpcy55PS10aGlzLnksdGhpc31kb3QodCl7cmV0dXJuIHRoaXMueCp0LngrdGhpcy55KnQueX1jcm9zcyh0KXtyZXR1cm4gdGhpcy54KnQueS10aGlzLnkqdC54fWxlbmd0aFNxKCl7cmV0dXJuIHRoaXMueCp0aGlzLngrdGhpcy55KnRoaXMueX1sZW5ndGgoKXtyZXR1cm4gTWF0aC5zcXJ0KHRoaXMueCp0aGlzLngrdGhpcy55KnRoaXMueSl9bWFuaGF0dGFuTGVuZ3RoKCl7cmV0dXJuIE1hdGguYWJzKHRoaXMueCkrTWF0aC5hYnModGhpcy55KX1ub3JtYWxpemUoKXtyZXR1cm4gdGhpcy5kaXZpZGVTY2FsYXIodGhpcy5sZW5ndGgoKXx8MSl9YW5nbGUoKXtyZXR1cm4gTWF0aC5hdGFuMigtdGhpcy55LC10aGlzLngpK01hdGguUEl9ZGlzdGFuY2VUbyh0KXtyZXR1cm4gTWF0aC5zcXJ0KHRoaXMuZGlzdGFuY2VUb1NxdWFyZWQodCkpfWRpc3RhbmNlVG9TcXVhcmVkKHQpe2NvbnN0IGU9dGhpcy54LXQueCxzPXRoaXMueS10Lnk7cmV0dXJuIGUqZStzKnN9bWFuaGF0dGFuRGlzdGFuY2VUbyh0KXtyZXR1cm4gTWF0aC5hYnModGhpcy54LXQueCkrTWF0aC5hYnModGhpcy55LXQueSl9c2V0TGVuZ3RoKHQpe3JldHVybiB0aGlzLm5vcm1hbGl6ZSgpLm11bHRpcGx5U2NhbGFyKHQpfWxlcnAodCxlKXtyZXR1cm4gdGhpcy54Kz0odC54LXRoaXMueCkqZSx0aGlzLnkrPSh0LnktdGhpcy55KSplLHRoaXN9bGVycFZlY3RvcnModCxlLHMpe3JldHVybiB0aGlzLng9dC54KyhlLngtdC54KSpzLHRoaXMueT10LnkrKGUueS10LnkpKnMsdGhpc31lcXVhbHModCl7cmV0dXJuIHQueD09PXRoaXMueCYmdC55PT09dGhpcy55fWZyb21BcnJheSh0KXtsZXQgZT1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06MDtyZXR1cm4gdGhpcy54PXRbZV0sdGhpcy55PXRbZSsxXSx0aGlzfXRvQXJyYXkoKXtsZXQgdD1hcmd1bWVudHMubGVuZ3RoPjAmJnZvaWQgMCE9PWFyZ3VtZW50c1swXT9hcmd1bWVudHNbMF06W10sZT1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06MDtyZXR1cm4gdFtlXT10aGlzLngsdFtlKzFdPXRoaXMueSx0fWZyb21CdWZmZXJBdHRyaWJ1dGUodCxlLHMpe3JldHVybiB2b2lkIDAhPT1zJiZjb25zb2xlLndhcm4oIlRIUkVFLlZlY3RvcjI6IG9mZnNldCBoYXMgYmVlbiByZW1vdmVkIGZyb20gLmZyb21CdWZmZXJBdHRyaWJ1dGUoKS4iKSx0aGlzLng9dC5nZXRYKGUpLHRoaXMueT10LmdldFkoZSksdGhpc31yb3RhdGVBcm91bmQodCxlKXtjb25zdCBzPU1hdGguY29zKGUpLGk9TWF0aC5zaW4oZSkscj10aGlzLngtdC54LG49dGhpcy55LXQueTtyZXR1cm4gdGhpcy54PXIqcy1uKmkrdC54LHRoaXMueT1yKmkrbipzK3QueSx0aGlzfXJhbmRvbSgpe3JldHVybiB0aGlzLng9TWF0aC5yYW5kb20oKSx0aGlzLnk9TWF0aC5yYW5kb20oKSx0aGlzfSpbU3ltYm9sLml0ZXJhdG9yXSgpe3lpZWxkIHRoaXMueCx5aWVsZCB0aGlzLnl9fWNsYXNzIGx7Y29uc3RydWN0b3IoKXtsLnByb3RvdHlwZS5pc01hdHJpeDM9ITAsdGhpcy5lbGVtZW50cz1bMSwwLDAsMCwxLDAsMCwwLDFdLGFyZ3VtZW50cy5sZW5ndGg+MCYmY29uc29sZS5lcnJvcigiVEhSRUUuTWF0cml4MzogdGhlIGNvbnN0cnVjdG9yIG5vIGxvbmdlciByZWFkcyBhcmd1bWVudHMuIHVzZSAuc2V0KCkgaW5zdGVhZC4iKX1zZXQodCxlLHMsaSxyLG4sbyxhLGgpe2NvbnN0IGw9dGhpcy5lbGVtZW50cztyZXR1cm4gbFswXT10LGxbMV09aSxsWzJdPW8sbFszXT1lLGxbNF09cixsWzVdPWEsbFs2XT1zLGxbN109bixsWzhdPWgsdGhpc31pZGVudGl0eSgpe3JldHVybiB0aGlzLnNldCgxLDAsMCwwLDEsMCwwLDAsMSksdGhpc31jb3B5KHQpe2NvbnN0IGU9dGhpcy5lbGVtZW50cyxzPXQuZWxlbWVudHM7cmV0dXJuIGVbMF09c1swXSxlWzFdPXNbMV0sZVsyXT1zWzJdLGVbM109c1szXSxlWzRdPXNbNF0sZVs1XT1zWzVdLGVbNl09c1s2XSxlWzddPXNbN10sZVs4XT1zWzhdLHRoaXN9ZXh0cmFjdEJhc2lzKHQsZSxzKXtyZXR1cm4gdC5zZXRGcm9tTWF0cml4M0NvbHVtbih0aGlzLDApLGUuc2V0RnJvbU1hdHJpeDNDb2x1bW4odGhpcywxKSxzLnNldEZyb21NYXRyaXgzQ29sdW1uKHRoaXMsMiksdGhpc31zZXRGcm9tTWF0cml4NCh0KXtjb25zdCBlPXQuZWxlbWVudHM7cmV0dXJuIHRoaXMuc2V0KGVbMF0sZVs0XSxlWzhdLGVbMV0sZVs1XSxlWzldLGVbMl0sZVs2XSxlWzEwXSksdGhpc31tdWx0aXBseSh0KXtyZXR1cm4gdGhpcy5tdWx0aXBseU1hdHJpY2VzKHRoaXMsdCl9cHJlbXVsdGlwbHkodCl7cmV0dXJuIHRoaXMubXVsdGlwbHlNYXRyaWNlcyh0LHRoaXMpfW11bHRpcGx5TWF0cmljZXModCxlKXtjb25zdCBzPXQuZWxlbWVudHMsaT1lLmVsZW1lbnRzLHI9dGhpcy5lbGVtZW50cyxuPXNbMF0sbz1zWzNdLGE9c1s2XSxoPXNbMV0sbD1zWzRdLGM9c1s3XSx1PXNbMl0sZD1zWzVdLG09c1s4XSx5PWlbMF0scD1pWzNdLHg9aVs2XSxmPWlbMV0sZz1pWzRdLGI9aVs3XSx3PWlbMl0sTT1pWzVdLHo9aVs4XTtyZXR1cm4gclswXT1uKnkrbypmK2EqdyxyWzNdPW4qcCtvKmcrYSpNLHJbNl09bip4K28qYithKnosclsxXT1oKnkrbCpmK2MqdyxyWzRdPWgqcCtsKmcrYypNLHJbN109aCp4K2wqYitjKnosclsyXT11KnkrZCpmK20qdyxyWzVdPXUqcCtkKmcrbSpNLHJbOF09dSp4K2QqYittKnosdGhpc31tdWx0aXBseVNjYWxhcih0KXtjb25zdCBlPXRoaXMuZWxlbWVudHM7cmV0dXJuIGVbMF0qPXQsZVszXSo9dCxlWzZdKj10LGVbMV0qPXQsZVs0XSo9dCxlWzddKj10LGVbMl0qPXQsZVs1XSo9dCxlWzhdKj10LHRoaXN9ZGV0ZXJtaW5hbnQoKXtjb25zdCB0PXRoaXMuZWxlbWVudHMsZT10WzBdLHM9dFsxXSxpPXRbMl0scj10WzNdLG49dFs0XSxvPXRbNV0sYT10WzZdLGg9dFs3XSxsPXRbOF07cmV0dXJuIGUqbipsLWUqbypoLXMqcipsK3MqbyphK2kqcipoLWkqbiphfWludmVydCgpe2NvbnN0IHQ9dGhpcy5lbGVtZW50cyxlPXRbMF0scz10WzFdLGk9dFsyXSxyPXRbM10sbj10WzRdLG89dFs1XSxhPXRbNl0saD10WzddLGw9dFs4XSxjPWwqbi1vKmgsdT1vKmEtbCpyLGQ9aCpyLW4qYSxtPWUqYytzKnUraSpkO2lmKDA9PT1tKXJldHVybiB0aGlzLnNldCgwLDAsMCwwLDAsMCwwLDAsMCk7Y29uc3QgeT0xL207cmV0dXJuIHRbMF09Yyp5LHRbMV09KGkqaC1sKnMpKnksdFsyXT0obypzLWkqbikqeSx0WzNdPXUqeSx0WzRdPShsKmUtaSphKSp5LHRbNV09KGkqci1vKmUpKnksdFs2XT1kKnksdFs3XT0ocyphLWgqZSkqeSx0WzhdPShuKmUtcypyKSp5LHRoaXN9dHJhbnNwb3NlKCl7bGV0IHQ7Y29uc3QgZT10aGlzLmVsZW1lbnRzO3JldHVybiB0PWVbMV0sZVsxXT1lWzNdLGVbM109dCx0PWVbMl0sZVsyXT1lWzZdLGVbNl09dCx0PWVbNV0sZVs1XT1lWzddLGVbN109dCx0aGlzfWdldE5vcm1hbE1hdHJpeCh0KXtyZXR1cm4gdGhpcy5zZXRGcm9tTWF0cml4NCh0KS5pbnZlcnQoKS50cmFuc3Bvc2UoKX10cmFuc3Bvc2VJbnRvQXJyYXkodCl7Y29uc3QgZT10aGlzLmVsZW1lbnRzO3JldHVybiB0WzBdPWVbMF0sdFsxXT1lWzNdLHRbMl09ZVs2XSx0WzNdPWVbMV0sdFs0XT1lWzRdLHRbNV09ZVs3XSx0WzZdPWVbMl0sdFs3XT1lWzVdLHRbOF09ZVs4XSx0aGlzfXNldFV2VHJhbnNmb3JtKHQsZSxzLGkscixuLG8pe2NvbnN0IGE9TWF0aC5jb3MociksaD1NYXRoLnNpbihyKTtyZXR1cm4gdGhpcy5zZXQocyphLHMqaCwtcyooYSpuK2gqbykrbit0LC1pKmgsaSphLC1pKigtaCpuK2EqbykrbytlLDAsMCwxKSx0aGlzfXNjYWxlKHQsZSl7Y29uc3Qgcz10aGlzLmVsZW1lbnRzO3JldHVybiBzWzBdKj10LHNbM10qPXQsc1s2XSo9dCxzWzFdKj1lLHNbNF0qPWUsc1s3XSo9ZSx0aGlzfXJvdGF0ZSh0KXtjb25zdCBlPU1hdGguY29zKHQpLHM9TWF0aC5zaW4odCksaT10aGlzLmVsZW1lbnRzLHI9aVswXSxuPWlbM10sbz1pWzZdLGE9aVsxXSxoPWlbNF0sbD1pWzddO3JldHVybiBpWzBdPWUqcitzKmEsaVszXT1lKm4rcypoLGlbNl09ZSpvK3MqbCxpWzFdPS1zKnIrZSphLGlbNF09LXMqbitlKmgsaVs3XT0tcypvK2UqbCx0aGlzfXRyYW5zbGF0ZSh0LGUpe2NvbnN0IHM9dGhpcy5lbGVtZW50cztyZXR1cm4gc1swXSs9dCpzWzJdLHNbM10rPXQqc1s1XSxzWzZdKz10KnNbOF0sc1sxXSs9ZSpzWzJdLHNbNF0rPWUqc1s1XSxzWzddKz1lKnNbOF0sdGhpc31lcXVhbHModCl7Y29uc3QgZT10aGlzLmVsZW1lbnRzLHM9dC5lbGVtZW50cztmb3IobGV0IHQ9MDt0PDk7dCsrKWlmKGVbdF0hPT1zW3RdKXJldHVybiExO3JldHVybiEwfWZyb21BcnJheSh0KXtsZXQgZT1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06MDtmb3IobGV0IHM9MDtzPDk7cysrKXRoaXMuZWxlbWVudHNbc109dFtzK2VdO3JldHVybiB0aGlzfXRvQXJyYXkoKXtsZXQgdD1hcmd1bWVudHMubGVuZ3RoPjAmJnZvaWQgMCE9PWFyZ3VtZW50c1swXT9hcmd1bWVudHNbMF06W10sZT1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06MDtjb25zdCBzPXRoaXMuZWxlbWVudHM7cmV0dXJuIHRbZV09c1swXSx0W2UrMV09c1sxXSx0W2UrMl09c1syXSx0W2UrM109c1szXSx0W2UrNF09c1s0XSx0W2UrNV09c1s1XSx0W2UrNl09c1s2XSx0W2UrN109c1s3XSx0W2UrOF09c1s4XSx0fWNsb25lKCl7cmV0dXJuKG5ldyB0aGlzLmNvbnN0cnVjdG9yKS5mcm9tQXJyYXkodGhpcy5lbGVtZW50cyl9fWZ1bmN0aW9uIGModCl7cmV0dXJuIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUygiaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIsdCl9ZnVuY3Rpb24gdSh0KXtyZXR1cm4gdDwuMDQwNDU/LjA3NzM5OTM4MDgqdDpNYXRoLnBvdyguOTQ3ODY3Mjk4Nip0Ky4wNTIxMzI3MDE0LDIuNCl9ZnVuY3Rpb24gZCh0KXtyZXR1cm4gdDwuMDAzMTMwOD8xMi45Mip0OjEuMDU1Kk1hdGgucG93KHQsLjQxNjY2KS0uMDU1fWNvbnN0IG09e1tlXTp7W3NdOnV9LFtzXTp7W2VdOmR9fSx5PXtsZWdhY3lNb2RlOiEwLGdldCB3b3JraW5nQ29sb3JTcGFjZSgpe3JldHVybiBzfSxzZXQgd29ya2luZ0NvbG9yU3BhY2UodCl7Y29uc29sZS53YXJuKCJUSFJFRS5Db2xvck1hbmFnZW1lbnQ6IC53b3JraW5nQ29sb3JTcGFjZSBpcyByZWFkb25seS4iKX0sY29udmVydDpmdW5jdGlvbih0LGUscyl7aWYodGhpcy5sZWdhY3lNb2RlfHxlPT09c3x8IWV8fCFzKXJldHVybiB0O2lmKG1bZV0mJnZvaWQgMCE9PW1bZV1bc10pe2NvbnN0IGk9bVtlXVtzXTtyZXR1cm4gdC5yPWkodC5yKSx0Lmc9aSh0LmcpLHQuYj1pKHQuYiksdH10aHJvdyBuZXcgRXJyb3IoIlVuc3VwcG9ydGVkIGNvbG9yIHNwYWNlIGNvbnZlcnNpb24uIil9LGZyb21Xb3JraW5nQ29sb3JTcGFjZTpmdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLmNvbnZlcnQodCx0aGlzLndvcmtpbmdDb2xvclNwYWNlLGUpfSx0b1dvcmtpbmdDb2xvclNwYWNlOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuY29udmVydCh0LGUsdGhpcy53b3JraW5nQ29sb3JTcGFjZSl9fSxwPXthbGljZWJsdWU6MTU3OTIzODMsYW50aXF1ZXdoaXRlOjE2NDQ0Mzc1LGFxdWE6NjU1MzUsYXF1YW1hcmluZTo4Mzg4NTY0LGF6dXJlOjE1Nzk0MTc1LGJlaWdlOjE2MTE5MjYwLGJpc3F1ZToxNjc3MDI0NCxibGFjazowLGJsYW5jaGVkYWxtb25kOjE2NzcyMDQ1LGJsdWU6MjU1LGJsdWV2aW9sZXQ6OTA1NTIwMixicm93bjoxMDgyNDIzNCxidXJseXdvb2Q6MTQ1OTYyMzEsY2FkZXRibHVlOjYyNjY1MjgsY2hhcnRyZXVzZTo4Mzg4MzUyLGNob2NvbGF0ZToxMzc4OTQ3MCxjb3JhbDoxNjc0NDI3Mixjb3JuZmxvd2VyYmx1ZTo2NTkxOTgxLGNvcm5zaWxrOjE2Nzc1Mzg4LGNyaW1zb246MTQ0MjMxMDAsY3lhbjo2NTUzNSxkYXJrYmx1ZToxMzksZGFya2N5YW46MzU3MjMsZGFya2dvbGRlbnJvZDoxMjA5MjkzOSxkYXJrZ3JheToxMTExOTAxNyxkYXJrZ3JlZW46MjU2MDAsZGFya2dyZXk6MTExMTkwMTcsZGFya2toYWtpOjEyNDMzMjU5LGRhcmttYWdlbnRhOjkxMDk2NDMsZGFya29saXZlZ3JlZW46NTU5Nzk5OSxkYXJrb3JhbmdlOjE2NzQ3NTIwLGRhcmtvcmNoaWQ6MTAwNDAwMTIsZGFya3JlZDo5MTA5NTA0LGRhcmtzYWxtb246MTUzMDg0MTAsZGFya3NlYWdyZWVuOjk0MTk5MTksZGFya3NsYXRlYmx1ZTo0NzM0MzQ3LGRhcmtzbGF0ZWdyYXk6MzEwMDQ5NSxkYXJrc2xhdGVncmV5OjMxMDA0OTUsZGFya3R1cnF1b2lzZTo1Mjk0NSxkYXJrdmlvbGV0Ojk2OTk1MzksZGVlcHBpbms6MTY3MTY5NDcsZGVlcHNreWJsdWU6NDkxNTEsZGltZ3JheTo2OTA4MjY1LGRpbWdyZXk6NjkwODI2NSxkb2RnZXJibHVlOjIwMDMxOTksZmlyZWJyaWNrOjExNjc0MTQ2LGZsb3JhbHdoaXRlOjE2Nzc1OTIwLGZvcmVzdGdyZWVuOjIyNjM4NDIsZnVjaHNpYToxNjcxMTkzNSxnYWluc2Jvcm86MTQ0NzQ0NjAsZ2hvc3R3aGl0ZToxNjMxNjY3MSxnb2xkOjE2NzY2NzIwLGdvbGRlbnJvZDoxNDMyOTEyMCxncmF5Ojg0MjE1MDQsZ3JlZW46MzI3NjgsZ3JlZW55ZWxsb3c6MTE0MDMwNTUsZ3JleTo4NDIxNTA0LGhvbmV5ZGV3OjE1Nzk0MTYwLGhvdHBpbms6MTY3Mzg3NDAsaW5kaWFucmVkOjEzNDU4NTI0LGluZGlnbzo0OTE1MzMwLGl2b3J5OjE2Nzc3MjAwLGtoYWtpOjE1Nzg3NjYwLGxhdmVuZGVyOjE1MTMyNDEwLGxhdmVuZGVyYmx1c2g6MTY3NzMzNjUsbGF3bmdyZWVuOjgxOTA5NzYsbGVtb25jaGlmZm9uOjE2Nzc1ODg1LGxpZ2h0Ymx1ZToxMTM5MzI1NCxsaWdodGNvcmFsOjE1NzYxNTM2LGxpZ2h0Y3lhbjoxNDc0NTU5OSxsaWdodGdvbGRlbnJvZHllbGxvdzoxNjQ0ODIxMCxsaWdodGdyYXk6MTM4ODIzMjMsbGlnaHRncmVlbjo5NDk4MjU2LGxpZ2h0Z3JleToxMzg4MjMyMyxsaWdodHBpbms6MTY3NTg0NjUsbGlnaHRzYWxtb246MTY3NTI3NjIsbGlnaHRzZWFncmVlbjoyMTQyODkwLGxpZ2h0c2t5Ymx1ZTo4OTAwMzQ2LGxpZ2h0c2xhdGVncmF5Ojc4MzM3NTMsbGlnaHRzbGF0ZWdyZXk6NzgzMzc1MyxsaWdodHN0ZWVsYmx1ZToxMTU4NDczNCxsaWdodHllbGxvdzoxNjc3NzE4NCxsaW1lOjY1MjgwLGxpbWVncmVlbjozMzI5MzMwLGxpbmVuOjE2NDQ1NjcwLG1hZ2VudGE6MTY3MTE5MzUsbWFyb29uOjgzODg2MDgsbWVkaXVtYXF1YW1hcmluZTo2NzM3MzIyLG1lZGl1bWJsdWU6MjA1LG1lZGl1bW9yY2hpZDoxMjIxMTY2NyxtZWRpdW1wdXJwbGU6OTY2MjY4MyxtZWRpdW1zZWFncmVlbjozOTc4MDk3LG1lZGl1bXNsYXRlYmx1ZTo4MDg3NzkwLG1lZGl1bXNwcmluZ2dyZWVuOjY0MTU0LG1lZGl1bXR1cnF1b2lzZTo0NzcyMzAwLG1lZGl1bXZpb2xldHJlZDoxMzA0NzE3MyxtaWRuaWdodGJsdWU6MTY0NDkxMixtaW50Y3JlYW06MTYxMjE4NTAsbWlzdHlyb3NlOjE2NzcwMjczLG1vY2Nhc2luOjE2NzcwMjI5LG5hdmFqb3doaXRlOjE2NzY4Njg1LG5hdnk6MTI4LG9sZGxhY2U6MTY2NDM1NTgsb2xpdmU6ODQyMTM3NixvbGl2ZWRyYWI6NzA0ODczOSxvcmFuZ2U6MTY3NTM5MjAsb3JhbmdlcmVkOjE2NzI5MzQ0LG9yY2hpZDoxNDMxNTczNCxwYWxlZ29sZGVucm9kOjE1NjU3MTMwLHBhbGVncmVlbjoxMDAyNTg4MCxwYWxldHVycXVvaXNlOjExNTI5OTY2LHBhbGV2aW9sZXRyZWQ6MTQzODEyMDMscGFwYXlhd2hpcDoxNjc3MzA3NyxwZWFjaHB1ZmY6MTY3Njc2NzMscGVydToxMzQ2ODk5MSxwaW5rOjE2NzYxMDM1LHBsdW06MTQ1MjQ2MzcscG93ZGVyYmx1ZToxMTU5MTkxMCxwdXJwbGU6ODM4ODczNixyZWJlY2NhcHVycGxlOjY2OTc4ODEscmVkOjE2NzExNjgwLHJvc3licm93bjoxMjM1NzUxOSxyb3lhbGJsdWU6NDI4Njk0NSxzYWRkbGVicm93bjo5MTI3MTg3LHNhbG1vbjoxNjQxNjg4MixzYW5keWJyb3duOjE2MDMyODY0LHNlYWdyZWVuOjMwNTAzMjcsc2Vhc2hlbGw6MTY3NzQ2Mzgsc2llbm5hOjEwNTA2Nzk3LHNpbHZlcjoxMjYzMjI1Nixza3libHVlOjg5MDAzMzEsc2xhdGVibHVlOjY5NzAwNjEsc2xhdGVncmF5OjczNzI5NDQsc2xhdGVncmV5OjczNzI5NDQsc25vdzoxNjc3NTkzMCxzcHJpbmdncmVlbjo2NTQwNyxzdGVlbGJsdWU6NDYyMDk4MCx0YW46MTM4MDg3ODAsdGVhbDozMjg5Nix0aGlzdGxlOjE0MjA0ODg4LHRvbWF0bzoxNjczNzA5NSx0dXJxdW9pc2U6NDI1MTg1Nix2aW9sZXQ6MTU2MzEwODYsd2hlYXQ6MTYxMTMzMzEsd2hpdGU6MTY3NzcyMTUsd2hpdGVzbW9rZToxNjExOTI4NSx5ZWxsb3c6MTY3NzY5NjAseWVsbG93Z3JlZW46MTAxNDUwNzR9LHg9e3I6MCxnOjAsYjowfSxmPXtoOjAsczowLGw6MH0sZz17aDowLHM6MCxsOjB9O2Z1bmN0aW9uIGIodCxlLHMpe3JldHVybiBzPDAmJihzKz0xKSxzPjEmJihzLT0xKSxzPDEvNj90KzYqKGUtdCkqczpzPC41P2U6czwyLzM/dCs2KihlLXQpKigyLzMtcyk6dH1mdW5jdGlvbiB3KHQsZSl7cmV0dXJuIGUucj10LnIsZS5nPXQuZyxlLmI9dC5iLGV9Y2xhc3MgTXtjb25zdHJ1Y3Rvcih0LGUscyl7cmV0dXJuIHRoaXMuaXNDb2xvcj0hMCx0aGlzLnI9MSx0aGlzLmc9MSx0aGlzLmI9MSx2b2lkIDA9PT1lJiZ2b2lkIDA9PT1zP3RoaXMuc2V0KHQpOnRoaXMuc2V0UkdCKHQsZSxzKX1zZXQodCl7cmV0dXJuIHQmJnQuaXNDb2xvcj90aGlzLmNvcHkodCk6Im51bWJlciI9PXR5cGVvZiB0P3RoaXMuc2V0SGV4KHQpOiJzdHJpbmciPT10eXBlb2YgdCYmdGhpcy5zZXRTdHlsZSh0KSx0aGlzfXNldFNjYWxhcih0KXtyZXR1cm4gdGhpcy5yPXQsdGhpcy5nPXQsdGhpcy5iPXQsdGhpc31zZXRIZXgodCl7bGV0IHM9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOmU7cmV0dXJuIHQ9TWF0aC5mbG9vcih0KSx0aGlzLnI9KHQ+PjE2JjI1NSkvMjU1LHRoaXMuZz0odD4+OCYyNTUpLzI1NSx0aGlzLmI9KDI1NSZ0KS8yNTUseS50b1dvcmtpbmdDb2xvclNwYWNlKHRoaXMscyksdGhpc31zZXRSR0IodCxlLGkpe2xldCByPWFyZ3VtZW50cy5sZW5ndGg+MyYmdm9pZCAwIT09YXJndW1lbnRzWzNdP2FyZ3VtZW50c1szXTpzO3JldHVybiB0aGlzLnI9dCx0aGlzLmc9ZSx0aGlzLmI9aSx5LnRvV29ya2luZ0NvbG9yU3BhY2UodGhpcyxyKSx0aGlzfXNldEhTTCh0LGUsaSl7bGV0IHI9YXJndW1lbnRzLmxlbmd0aD4zJiZ2b2lkIDAhPT1hcmd1bWVudHNbM10/YXJndW1lbnRzWzNdOnM7dmFyIG47aWYodD0odCUobj0xKStuKSVuLGU9byhlLDAsMSksaT1vKGksMCwxKSwwPT09ZSl0aGlzLnI9dGhpcy5nPXRoaXMuYj1pO2Vsc2V7Y29uc3Qgcz1pPD0uNT9pKigxK2UpOmkrZS1pKmUscj0yKmktczt0aGlzLnI9YihyLHMsdCsxLzMpLHRoaXMuZz1iKHIscyx0KSx0aGlzLmI9YihyLHMsdC0xLzMpfXJldHVybiB5LnRvV29ya2luZ0NvbG9yU3BhY2UodGhpcyxyKSx0aGlzfXNldFN0eWxlKHQpe2xldCBzLGk9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOmU7ZnVuY3Rpb24gcihlKXt2b2lkIDAhPT1lJiZwYXJzZUZsb2F0KGUpPDEmJmNvbnNvbGUud2FybigiVEhSRUUuQ29sb3I6IEFscGhhIGNvbXBvbmVudCBvZiAiK3QrIiB3aWxsIGJlIGlnbm9yZWQuIil9aWYocz0vXigoPzpyZ2J8aHNsKWE/KVwoKFteXCldKilcKS8uZXhlYyh0KSl7bGV0IHQ7Y29uc3QgZT1zWzFdLG49c1syXTtzd2l0Y2goZSl7Y2FzZSJyZ2IiOmNhc2UicmdiYSI6aWYodD0vXlxzKihcZCspXHMqLFxzKihcZCspXHMqLFxzKihcZCspXHMqKD86LFxzKihcZCpcLj9cZCspXHMqKT8kLy5leGVjKG4pKXJldHVybiB0aGlzLnI9TWF0aC5taW4oMjU1LHBhcnNlSW50KHRbMV0sMTApKS8yNTUsdGhpcy5nPU1hdGgubWluKDI1NSxwYXJzZUludCh0WzJdLDEwKSkvMjU1LHRoaXMuYj1NYXRoLm1pbigyNTUscGFyc2VJbnQodFszXSwxMCkpLzI1NSx5LnRvV29ya2luZ0NvbG9yU3BhY2UodGhpcyxpKSxyKHRbNF0pLHRoaXM7aWYodD0vXlxzKihcZCspXCVccyosXHMqKFxkKylcJVxzKixccyooXGQrKVwlXHMqKD86LFxzKihcZCpcLj9cZCspXHMqKT8kLy5leGVjKG4pKXJldHVybiB0aGlzLnI9TWF0aC5taW4oMTAwLHBhcnNlSW50KHRbMV0sMTApKS8xMDAsdGhpcy5nPU1hdGgubWluKDEwMCxwYXJzZUludCh0WzJdLDEwKSkvMTAwLHRoaXMuYj1NYXRoLm1pbigxMDAscGFyc2VJbnQodFszXSwxMCkpLzEwMCx5LnRvV29ya2luZ0NvbG9yU3BhY2UodGhpcyxpKSxyKHRbNF0pLHRoaXM7YnJlYWs7Y2FzZSJoc2wiOmNhc2UiaHNsYSI6aWYodD0vXlxzKihcZCpcLj9cZCspXHMqLFxzKihcZCspXCVccyosXHMqKFxkKylcJVxzKig/OixccyooXGQqXC4/XGQrKVxzKik/JC8uZXhlYyhuKSl7Y29uc3QgZT1wYXJzZUZsb2F0KHRbMV0pLzM2MCxzPXBhcnNlSW50KHRbMl0sMTApLzEwMCxuPXBhcnNlSW50KHRbM10sMTApLzEwMDtyZXR1cm4gcih0WzRdKSx0aGlzLnNldEhTTChlLHMsbixpKX19fWVsc2UgaWYocz0vXlwjKFtBLUZhLWZcZF0rKSQvLmV4ZWModCkpe2NvbnN0IHQ9c1sxXSxlPXQubGVuZ3RoO2lmKDM9PT1lKXJldHVybiB0aGlzLnI9cGFyc2VJbnQodC5jaGFyQXQoMCkrdC5jaGFyQXQoMCksMTYpLzI1NSx0aGlzLmc9cGFyc2VJbnQodC5jaGFyQXQoMSkrdC5jaGFyQXQoMSksMTYpLzI1NSx0aGlzLmI9cGFyc2VJbnQodC5jaGFyQXQoMikrdC5jaGFyQXQoMiksMTYpLzI1NSx5LnRvV29ya2luZ0NvbG9yU3BhY2UodGhpcyxpKSx0aGlzO2lmKDY9PT1lKXJldHVybiB0aGlzLnI9cGFyc2VJbnQodC5jaGFyQXQoMCkrdC5jaGFyQXQoMSksMTYpLzI1NSx0aGlzLmc9cGFyc2VJbnQodC5jaGFyQXQoMikrdC5jaGFyQXQoMyksMTYpLzI1NSx0aGlzLmI9cGFyc2VJbnQodC5jaGFyQXQoNCkrdC5jaGFyQXQoNSksMTYpLzI1NSx5LnRvV29ya2luZ0NvbG9yU3BhY2UodGhpcyxpKSx0aGlzfXJldHVybiB0JiZ0Lmxlbmd0aD4wP3RoaXMuc2V0Q29sb3JOYW1lKHQsaSk6dGhpc31zZXRDb2xvck5hbWUodCl7bGV0IHM9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOmU7Y29uc3QgaT1wW3QudG9Mb3dlckNhc2UoKV07cmV0dXJuIHZvaWQgMCE9PWk/dGhpcy5zZXRIZXgoaSxzKTpjb25zb2xlLndhcm4oIlRIUkVFLkNvbG9yOiBVbmtub3duIGNvbG9yICIrdCksdGhpc31jbG9uZSgpe3JldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3Rvcih0aGlzLnIsdGhpcy5nLHRoaXMuYil9Y29weSh0KXtyZXR1cm4gdGhpcy5yPXQucix0aGlzLmc9dC5nLHRoaXMuYj10LmIsdGhpc31jb3B5U1JHQlRvTGluZWFyKHQpe3JldHVybiB0aGlzLnI9dSh0LnIpLHRoaXMuZz11KHQuZyksdGhpcy5iPXUodC5iKSx0aGlzfWNvcHlMaW5lYXJUb1NSR0IodCl7cmV0dXJuIHRoaXMucj1kKHQuciksdGhpcy5nPWQodC5nKSx0aGlzLmI9ZCh0LmIpLHRoaXN9Y29udmVydFNSR0JUb0xpbmVhcigpe3JldHVybiB0aGlzLmNvcHlTUkdCVG9MaW5lYXIodGhpcyksdGhpc31jb252ZXJ0TGluZWFyVG9TUkdCKCl7cmV0dXJuIHRoaXMuY29weUxpbmVhclRvU1JHQih0aGlzKSx0aGlzfWdldEhleCgpe2xldCB0PWFyZ3VtZW50cy5sZW5ndGg+MCYmdm9pZCAwIT09YXJndW1lbnRzWzBdP2FyZ3VtZW50c1swXTplO3JldHVybiB5LmZyb21Xb3JraW5nQ29sb3JTcGFjZSh3KHRoaXMseCksdCksbygyNTUqeC5yLDAsMjU1KTw8MTZebygyNTUqeC5nLDAsMjU1KTw8OF5vKDI1NSp4LmIsMCwyNTUpPDwwfWdldEhleFN0cmluZygpe2xldCB0PWFyZ3VtZW50cy5sZW5ndGg+MCYmdm9pZCAwIT09YXJndW1lbnRzWzBdP2FyZ3VtZW50c1swXTplO3JldHVybigiMDAwMDAwIit0aGlzLmdldEhleCh0KS50b1N0cmluZygxNikpLnNsaWNlKC02KX1nZXRIU0wodCl7bGV0IGU9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOnM7eS5mcm9tV29ya2luZ0NvbG9yU3BhY2Uodyh0aGlzLHgpLGUpO2NvbnN0IGk9eC5yLHI9eC5nLG49eC5iLG89TWF0aC5tYXgoaSxyLG4pLGE9TWF0aC5taW4oaSxyLG4pO2xldCBoLGw7Y29uc3QgYz0oYStvKS8yO2lmKGE9PT1vKWg9MCxsPTA7ZWxzZXtjb25zdCB0PW8tYTtzd2l0Y2gobD1jPD0uNT90LyhvK2EpOnQvKDItby1hKSxvKXtjYXNlIGk6aD0oci1uKS90KyhyPG4/NjowKTticmVhaztjYXNlIHI6aD0obi1pKS90KzI7YnJlYWs7Y2FzZSBuOmg9KGktcikvdCs0fWgvPTZ9cmV0dXJuIHQuaD1oLHQucz1sLHQubD1jLHR9Z2V0UkdCKHQpe2xldCBlPWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTpzO3JldHVybiB5LmZyb21Xb3JraW5nQ29sb3JTcGFjZSh3KHRoaXMseCksZSksdC5yPXgucix0Lmc9eC5nLHQuYj14LmIsdH1nZXRTdHlsZSgpe2xldCB0PWFyZ3VtZW50cy5sZW5ndGg+MCYmdm9pZCAwIT09YXJndW1lbnRzWzBdP2FyZ3VtZW50c1swXTplO3JldHVybiB5LmZyb21Xb3JraW5nQ29sb3JTcGFjZSh3KHRoaXMseCksdCksdCE9PWU/YGNvbG9yKCR7dH0gJHt4LnJ9ICR7eC5nfSAke3guYn0pYDpgcmdiKCR7MjU1KngucnwwfSwkezI1NSp4Lmd8MH0sJHsyNTUqeC5ifDB9KWB9b2Zmc2V0SFNMKHQsZSxzKXtyZXR1cm4gdGhpcy5nZXRIU0woZiksZi5oKz10LGYucys9ZSxmLmwrPXMsdGhpcy5zZXRIU0woZi5oLGYucyxmLmwpLHRoaXN9YWRkKHQpe3JldHVybiB0aGlzLnIrPXQucix0aGlzLmcrPXQuZyx0aGlzLmIrPXQuYix0aGlzfWFkZENvbG9ycyh0LGUpe3JldHVybiB0aGlzLnI9dC5yK2Uucix0aGlzLmc9dC5nK2UuZyx0aGlzLmI9dC5iK2UuYix0aGlzfWFkZFNjYWxhcih0KXtyZXR1cm4gdGhpcy5yKz10LHRoaXMuZys9dCx0aGlzLmIrPXQsdGhpc31zdWIodCl7cmV0dXJuIHRoaXMucj1NYXRoLm1heCgwLHRoaXMuci10LnIpLHRoaXMuZz1NYXRoLm1heCgwLHRoaXMuZy10LmcpLHRoaXMuYj1NYXRoLm1heCgwLHRoaXMuYi10LmIpLHRoaXN9bXVsdGlwbHkodCl7cmV0dXJuIHRoaXMucio9dC5yLHRoaXMuZyo9dC5nLHRoaXMuYio9dC5iLHRoaXN9bXVsdGlwbHlTY2FsYXIodCl7cmV0dXJuIHRoaXMucio9dCx0aGlzLmcqPXQsdGhpcy5iKj10LHRoaXN9bGVycCh0LGUpe3JldHVybiB0aGlzLnIrPSh0LnItdGhpcy5yKSplLHRoaXMuZys9KHQuZy10aGlzLmcpKmUsdGhpcy5iKz0odC5iLXRoaXMuYikqZSx0aGlzfWxlcnBDb2xvcnModCxlLHMpe3JldHVybiB0aGlzLnI9dC5yKyhlLnItdC5yKSpzLHRoaXMuZz10LmcrKGUuZy10LmcpKnMsdGhpcy5iPXQuYisoZS5iLXQuYikqcyx0aGlzfWxlcnBIU0wodCxlKXt0aGlzLmdldEhTTChmKSx0LmdldEhTTChnKTtjb25zdCBzPWEoZi5oLGcuaCxlKSxpPWEoZi5zLGcucyxlKSxyPWEoZi5sLGcubCxlKTtyZXR1cm4gdGhpcy5zZXRIU0wocyxpLHIpLHRoaXN9ZXF1YWxzKHQpe3JldHVybiB0LnI9PT10aGlzLnImJnQuZz09PXRoaXMuZyYmdC5iPT09dGhpcy5ifWZyb21BcnJheSh0KXtsZXQgZT1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06MDtyZXR1cm4gdGhpcy5yPXRbZV0sdGhpcy5nPXRbZSsxXSx0aGlzLmI9dFtlKzJdLHRoaXN9dG9BcnJheSgpe2xldCB0PWFyZ3VtZW50cy5sZW5ndGg+MCYmdm9pZCAwIT09YXJndW1lbnRzWzBdP2FyZ3VtZW50c1swXTpbXSxlPWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTowO3JldHVybiB0W2VdPXRoaXMucix0W2UrMV09dGhpcy5nLHRbZSsyXT10aGlzLmIsdH1mcm9tQnVmZmVyQXR0cmlidXRlKHQsZSl7cmV0dXJuIHRoaXMucj10LmdldFgoZSksdGhpcy5nPXQuZ2V0WShlKSx0aGlzLmI9dC5nZXRaKGUpLCEwPT09dC5ub3JtYWxpemVkJiYodGhpcy5yLz0yNTUsdGhpcy5nLz0yNTUsdGhpcy5iLz0yNTUpLHRoaXN9dG9KU09OKCl7cmV0dXJuIHRoaXMuZ2V0SGV4KCl9KltTeW1ib2wuaXRlcmF0b3JdKCl7eWllbGQgdGhpcy5yLHlpZWxkIHRoaXMuZyx5aWVsZCB0aGlzLmJ9fWxldCB6O00uTkFNRVM9cDtjbGFzcyB2e2NvbnN0cnVjdG9yKCl7bGV0IHQ9YXJndW1lbnRzLmxlbmd0aD4wJiZ2b2lkIDAhPT1hcmd1bWVudHNbMF0/YXJndW1lbnRzWzBdOm51bGw7dGhpcy5pc1NvdXJjZT0hMCx0aGlzLnV1aWQ9bigpLHRoaXMuZGF0YT10LHRoaXMudmVyc2lvbj0wfXNldCBuZWVkc1VwZGF0ZSh0KXshMD09PXQmJnRoaXMudmVyc2lvbisrfXRvSlNPTih0KXtjb25zdCBlPXZvaWQgMD09PXR8fCJzdHJpbmciPT10eXBlb2YgdDtpZighZSYmdm9pZCAwIT09dC5pbWFnZXNbdGhpcy51dWlkXSlyZXR1cm4gdC5pbWFnZXNbdGhpcy51dWlkXTtjb25zdCBzPXt1dWlkOnRoaXMudXVpZCx1cmw6IiJ9LGk9dGhpcy5kYXRhO2lmKG51bGwhPT1pKXtsZXQgdDtpZihBcnJheS5pc0FycmF5KGkpKXt0PVtdO2ZvcihsZXQgZT0wLHM9aS5sZW5ndGg7ZTxzO2UrKylpW2VdLmlzRGF0YVRleHR1cmU/dC5wdXNoKF8oaVtlXS5pbWFnZSkpOnQucHVzaChfKGlbZV0pKX1lbHNlIHQ9XyhpKTtzLnVybD10fXJldHVybiBlfHwodC5pbWFnZXNbdGhpcy51dWlkXT1zKSxzfX1mdW5jdGlvbiBfKHQpe3JldHVybiJ1bmRlZmluZWQiIT10eXBlb2YgSFRNTEltYWdlRWxlbWVudCYmdCBpbnN0YW5jZW9mIEhUTUxJbWFnZUVsZW1lbnR8fCJ1bmRlZmluZWQiIT10eXBlb2YgSFRNTENhbnZhc0VsZW1lbnQmJnQgaW5zdGFuY2VvZiBIVE1MQ2FudmFzRWxlbWVudHx8InVuZGVmaW5lZCIhPXR5cGVvZiBJbWFnZUJpdG1hcCYmdCBpbnN0YW5jZW9mIEltYWdlQml0bWFwP2NsYXNze3N0YXRpYyBnZXREYXRhVVJMKHQpe2lmKC9eZGF0YTovaS50ZXN0KHQuc3JjKSlyZXR1cm4gdC5zcmM7aWYoInVuZGVmaW5lZCI9PXR5cGVvZiBIVE1MQ2FudmFzRWxlbWVudClyZXR1cm4gdC5zcmM7bGV0IGU7aWYodCBpbnN0YW5jZW9mIEhUTUxDYW52YXNFbGVtZW50KWU9dDtlbHNle3ZvaWQgMD09PXomJih6PWMoImNhbnZhcyIpKSx6LndpZHRoPXQud2lkdGgsei5oZWlnaHQ9dC5oZWlnaHQ7Y29uc3Qgcz16LmdldENvbnRleHQoIjJkIik7dCBpbnN0YW5jZW9mIEltYWdlRGF0YT9zLnB1dEltYWdlRGF0YSh0LDAsMCk6cy5kcmF3SW1hZ2UodCwwLDAsdC53aWR0aCx0LmhlaWdodCksZT16fXJldHVybiBlLndpZHRoPjIwNDh8fGUuaGVpZ2h0PjIwNDg/KGNvbnNvbGUud2FybigiVEhSRUUuSW1hZ2VVdGlscy5nZXREYXRhVVJMOiBJbWFnZSBjb252ZXJ0ZWQgdG8ganBnIGZvciBwZXJmb3JtYW5jZSByZWFzb25zIix0KSxlLnRvRGF0YVVSTCgiaW1hZ2UvanBlZyIsLjYpKTplLnRvRGF0YVVSTCgiaW1hZ2UvcG5nIil9c3RhdGljIHNSR0JUb0xpbmVhcih0KXtpZigidW5kZWZpbmVkIiE9dHlwZW9mIEhUTUxJbWFnZUVsZW1lbnQmJnQgaW5zdGFuY2VvZiBIVE1MSW1hZ2VFbGVtZW50fHwidW5kZWZpbmVkIiE9dHlwZW9mIEhUTUxDYW52YXNFbGVtZW50JiZ0IGluc3RhbmNlb2YgSFRNTENhbnZhc0VsZW1lbnR8fCJ1bmRlZmluZWQiIT10eXBlb2YgSW1hZ2VCaXRtYXAmJnQgaW5zdGFuY2VvZiBJbWFnZUJpdG1hcCl7Y29uc3QgZT1jKCJjYW52YXMiKTtlLndpZHRoPXQud2lkdGgsZS5oZWlnaHQ9dC5oZWlnaHQ7Y29uc3Qgcz1lLmdldENvbnRleHQoIjJkIik7cy5kcmF3SW1hZ2UodCwwLDAsdC53aWR0aCx0LmhlaWdodCk7Y29uc3QgaT1zLmdldEltYWdlRGF0YSgwLDAsdC53aWR0aCx0LmhlaWdodCkscj1pLmRhdGE7Zm9yKGxldCB0PTA7dDxyLmxlbmd0aDt0Kyspclt0XT0yNTUqdShyW3RdLzI1NSk7cmV0dXJuIHMucHV0SW1hZ2VEYXRhKGksMCwwKSxlfWlmKHQuZGF0YSl7Y29uc3QgZT10LmRhdGEuc2xpY2UoMCk7Zm9yKGxldCB0PTA7dDxlLmxlbmd0aDt0KyspZSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXl8fGUgaW5zdGFuY2VvZiBVaW50OENsYW1wZWRBcnJheT9lW3RdPU1hdGguZmxvb3IoMjU1KnUoZVt0XS8yNTUpKTplW3RdPXUoZVt0XSk7cmV0dXJue2RhdGE6ZSx3aWR0aDp0LndpZHRoLGhlaWdodDp0LmhlaWdodH19cmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuSW1hZ2VVdGlscy5zUkdCVG9MaW5lYXIoKTogVW5zdXBwb3J0ZWQgaW1hZ2UgdHlwZS4gTm8gY29sb3Igc3BhY2UgY29udmVyc2lvbiBhcHBsaWVkLiIpLHR9fS5nZXREYXRhVVJMKHQpOnQuZGF0YT97ZGF0YTpBcnJheS5mcm9tKHQuZGF0YSksd2lkdGg6dC53aWR0aCxoZWlnaHQ6dC5oZWlnaHQsdHlwZTp0LmRhdGEuY29uc3RydWN0b3IubmFtZX06KGNvbnNvbGUud2FybigiVEhSRUUuVGV4dHVyZTogVW5hYmxlIHRvIHNlcmlhbGl6ZSBUZXh0dXJlLiIpLHt9KX1sZXQgQT0wO2NsYXNzIFMgZXh0ZW5kcyBpe2NvbnN0cnVjdG9yKCl7bGV0IGU9YXJndW1lbnRzLmxlbmd0aD4wJiZ2b2lkIDAhPT1hcmd1bWVudHNbMF0/YXJndW1lbnRzWzBdOlMuREVGQVVMVF9JTUFHRSxzPWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTpTLkRFRkFVTFRfTUFQUElORyxpPWFyZ3VtZW50cy5sZW5ndGg+MiYmdm9pZCAwIT09YXJndW1lbnRzWzJdP2FyZ3VtZW50c1syXTp0LHI9YXJndW1lbnRzLmxlbmd0aD4zJiZ2b2lkIDAhPT1hcmd1bWVudHNbM10/YXJndW1lbnRzWzNdOnQsbz1hcmd1bWVudHMubGVuZ3RoPjQmJnZvaWQgMCE9PWFyZ3VtZW50c1s0XT9hcmd1bWVudHNbNF06MTAwNixhPWFyZ3VtZW50cy5sZW5ndGg+NSYmdm9pZCAwIT09YXJndW1lbnRzWzVdP2FyZ3VtZW50c1s1XToxMDA4LGM9YXJndW1lbnRzLmxlbmd0aD42JiZ2b2lkIDAhPT1hcmd1bWVudHNbNl0/YXJndW1lbnRzWzZdOjEwMjMsdT1hcmd1bWVudHMubGVuZ3RoPjcmJnZvaWQgMCE9PWFyZ3VtZW50c1s3XT9hcmd1bWVudHNbN106MTAwOSxkPWFyZ3VtZW50cy5sZW5ndGg+OCYmdm9pZCAwIT09YXJndW1lbnRzWzhdP2FyZ3VtZW50c1s4XToxLG09YXJndW1lbnRzLmxlbmd0aD45JiZ2b2lkIDAhPT1hcmd1bWVudHNbOV0/YXJndW1lbnRzWzldOjNlMztzdXBlcigpLHRoaXMuaXNUZXh0dXJlPSEwLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJpZCIse3ZhbHVlOkErK30pLHRoaXMudXVpZD1uKCksdGhpcy5uYW1lPSIiLHRoaXMuc291cmNlPW5ldyB2KGUpLHRoaXMubWlwbWFwcz1bXSx0aGlzLm1hcHBpbmc9cyx0aGlzLndyYXBTPWksdGhpcy53cmFwVD1yLHRoaXMubWFnRmlsdGVyPW8sdGhpcy5taW5GaWx0ZXI9YSx0aGlzLmFuaXNvdHJvcHk9ZCx0aGlzLmZvcm1hdD1jLHRoaXMuaW50ZXJuYWxGb3JtYXQ9bnVsbCx0aGlzLnR5cGU9dSx0aGlzLm9mZnNldD1uZXcgaCgwLDApLHRoaXMucmVwZWF0PW5ldyBoKDEsMSksdGhpcy5jZW50ZXI9bmV3IGgoMCwwKSx0aGlzLnJvdGF0aW9uPTAsdGhpcy5tYXRyaXhBdXRvVXBkYXRlPSEwLHRoaXMubWF0cml4PW5ldyBsLHRoaXMuZ2VuZXJhdGVNaXBtYXBzPSEwLHRoaXMucHJlbXVsdGlwbHlBbHBoYT0hMSx0aGlzLmZsaXBZPSEwLHRoaXMudW5wYWNrQWxpZ25tZW50PTQsdGhpcy5lbmNvZGluZz1tLHRoaXMudXNlckRhdGE9e30sdGhpcy52ZXJzaW9uPTAsdGhpcy5vblVwZGF0ZT1udWxsLHRoaXMuaXNSZW5kZXJUYXJnZXRUZXh0dXJlPSExLHRoaXMubmVlZHNQTVJFTVVwZGF0ZT0hMX1nZXQgaW1hZ2UoKXtyZXR1cm4gdGhpcy5zb3VyY2UuZGF0YX1zZXQgaW1hZ2UodCl7dGhpcy5zb3VyY2UuZGF0YT10fXVwZGF0ZU1hdHJpeCgpe3RoaXMubWF0cml4LnNldFV2VHJhbnNmb3JtKHRoaXMub2Zmc2V0LngsdGhpcy5vZmZzZXQueSx0aGlzLnJlcGVhdC54LHRoaXMucmVwZWF0LnksdGhpcy5yb3RhdGlvbix0aGlzLmNlbnRlci54LHRoaXMuY2VudGVyLnkpfWNsb25lKCl7cmV0dXJuKG5ldyB0aGlzLmNvbnN0cnVjdG9yKS5jb3B5KHRoaXMpfWNvcHkodCl7cmV0dXJuIHRoaXMubmFtZT10Lm5hbWUsdGhpcy5zb3VyY2U9dC5zb3VyY2UsdGhpcy5taXBtYXBzPXQubWlwbWFwcy5zbGljZSgwKSx0aGlzLm1hcHBpbmc9dC5tYXBwaW5nLHRoaXMud3JhcFM9dC53cmFwUyx0aGlzLndyYXBUPXQud3JhcFQsdGhpcy5tYWdGaWx0ZXI9dC5tYWdGaWx0ZXIsdGhpcy5taW5GaWx0ZXI9dC5taW5GaWx0ZXIsdGhpcy5hbmlzb3Ryb3B5PXQuYW5pc290cm9weSx0aGlzLmZvcm1hdD10LmZvcm1hdCx0aGlzLmludGVybmFsRm9ybWF0PXQuaW50ZXJuYWxGb3JtYXQsdGhpcy50eXBlPXQudHlwZSx0aGlzLm9mZnNldC5jb3B5KHQub2Zmc2V0KSx0aGlzLnJlcGVhdC5jb3B5KHQucmVwZWF0KSx0aGlzLmNlbnRlci5jb3B5KHQuY2VudGVyKSx0aGlzLnJvdGF0aW9uPXQucm90YXRpb24sdGhpcy5tYXRyaXhBdXRvVXBkYXRlPXQubWF0cml4QXV0b1VwZGF0ZSx0aGlzLm1hdHJpeC5jb3B5KHQubWF0cml4KSx0aGlzLmdlbmVyYXRlTWlwbWFwcz10LmdlbmVyYXRlTWlwbWFwcyx0aGlzLnByZW11bHRpcGx5QWxwaGE9dC5wcmVtdWx0aXBseUFscGhhLHRoaXMuZmxpcFk9dC5mbGlwWSx0aGlzLnVucGFja0FsaWdubWVudD10LnVucGFja0FsaWdubWVudCx0aGlzLmVuY29kaW5nPXQuZW5jb2RpbmcsdGhpcy51c2VyRGF0YT1KU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHQudXNlckRhdGEpKSx0aGlzLm5lZWRzVXBkYXRlPSEwLHRoaXN9dG9KU09OKHQpe2NvbnN0IGU9dm9pZCAwPT09dHx8InN0cmluZyI9PXR5cGVvZiB0O2lmKCFlJiZ2b2lkIDAhPT10LnRleHR1cmVzW3RoaXMudXVpZF0pcmV0dXJuIHQudGV4dHVyZXNbdGhpcy51dWlkXTtjb25zdCBzPXttZXRhZGF0YTp7dmVyc2lvbjo0LjUsdHlwZToiVGV4dHVyZSIsZ2VuZXJhdG9yOiJUZXh0dXJlLnRvSlNPTiJ9LHV1aWQ6dGhpcy51dWlkLG5hbWU6dGhpcy5uYW1lLGltYWdlOnRoaXMuc291cmNlLnRvSlNPTih0KS51dWlkLG1hcHBpbmc6dGhpcy5tYXBwaW5nLHJlcGVhdDpbdGhpcy5yZXBlYXQueCx0aGlzLnJlcGVhdC55XSxvZmZzZXQ6W3RoaXMub2Zmc2V0LngsdGhpcy5vZmZzZXQueV0sY2VudGVyOlt0aGlzLmNlbnRlci54LHRoaXMuY2VudGVyLnldLHJvdGF0aW9uOnRoaXMucm90YXRpb24sd3JhcDpbdGhpcy53cmFwUyx0aGlzLndyYXBUXSxmb3JtYXQ6dGhpcy5mb3JtYXQsdHlwZTp0aGlzLnR5cGUsZW5jb2Rpbmc6dGhpcy5lbmNvZGluZyxtaW5GaWx0ZXI6dGhpcy5taW5GaWx0ZXIsbWFnRmlsdGVyOnRoaXMubWFnRmlsdGVyLGFuaXNvdHJvcHk6dGhpcy5hbmlzb3Ryb3B5LGZsaXBZOnRoaXMuZmxpcFkscHJlbXVsdGlwbHlBbHBoYTp0aGlzLnByZW11bHRpcGx5QWxwaGEsdW5wYWNrQWxpZ25tZW50OnRoaXMudW5wYWNrQWxpZ25tZW50fTtyZXR1cm4ie30iIT09SlNPTi5zdHJpbmdpZnkodGhpcy51c2VyRGF0YSkmJihzLnVzZXJEYXRhPXRoaXMudXNlckRhdGEpLGV8fCh0LnRleHR1cmVzW3RoaXMudXVpZF09cyksc31kaXNwb3NlKCl7dGhpcy5kaXNwYXRjaEV2ZW50KHt0eXBlOiJkaXNwb3NlIn0pfXRyYW5zZm9ybVV2KGUpe2lmKDMwMCE9PXRoaXMubWFwcGluZylyZXR1cm4gZTtpZihlLmFwcGx5TWF0cml4Myh0aGlzLm1hdHJpeCksZS54PDB8fGUueD4xKXN3aXRjaCh0aGlzLndyYXBTKXtjYXNlIDFlMzplLng9ZS54LU1hdGguZmxvb3IoZS54KTticmVhaztjYXNlIHQ6ZS54PWUueDwwPzA6MTticmVhaztjYXNlIDEwMDI6MT09PU1hdGguYWJzKE1hdGguZmxvb3IoZS54KSUyKT9lLng9TWF0aC5jZWlsKGUueCktZS54OmUueD1lLngtTWF0aC5mbG9vcihlLngpfWlmKGUueTwwfHxlLnk+MSlzd2l0Y2godGhpcy53cmFwVCl7Y2FzZSAxZTM6ZS55PWUueS1NYXRoLmZsb29yKGUueSk7YnJlYWs7Y2FzZSB0OmUueT1lLnk8MD8wOjE7YnJlYWs7Y2FzZSAxMDAyOjE9PT1NYXRoLmFicyhNYXRoLmZsb29yKGUueSklMik/ZS55PU1hdGguY2VpbChlLnkpLWUueTplLnk9ZS55LU1hdGguZmxvb3IoZS55KX1yZXR1cm4gdGhpcy5mbGlwWSYmKGUueT0xLWUueSksZX1zZXQgbmVlZHNVcGRhdGUodCl7ITA9PT10JiYodGhpcy52ZXJzaW9uKyssdGhpcy5zb3VyY2UubmVlZHNVcGRhdGU9ITApfX1TLkRFRkFVTFRfSU1BR0U9bnVsbCxTLkRFRkFVTFRfTUFQUElORz0zMDA7Y2xhc3MgQntjb25zdHJ1Y3Rvcigpe2xldCB0PWFyZ3VtZW50cy5sZW5ndGg+MCYmdm9pZCAwIT09YXJndW1lbnRzWzBdP2FyZ3VtZW50c1swXTowLGU9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOjAscz1hcmd1bWVudHMubGVuZ3RoPjImJnZvaWQgMCE9PWFyZ3VtZW50c1syXT9hcmd1bWVudHNbMl06MCxpPWFyZ3VtZW50cy5sZW5ndGg+MyYmdm9pZCAwIT09YXJndW1lbnRzWzNdP2FyZ3VtZW50c1szXToxO0IucHJvdG90eXBlLmlzVmVjdG9yND0hMCx0aGlzLng9dCx0aGlzLnk9ZSx0aGlzLno9cyx0aGlzLnc9aX1nZXQgd2lkdGgoKXtyZXR1cm4gdGhpcy56fXNldCB3aWR0aCh0KXt0aGlzLno9dH1nZXQgaGVpZ2h0KCl7cmV0dXJuIHRoaXMud31zZXQgaGVpZ2h0KHQpe3RoaXMudz10fXNldCh0LGUscyxpKXtyZXR1cm4gdGhpcy54PXQsdGhpcy55PWUsdGhpcy56PXMsdGhpcy53PWksdGhpc31zZXRTY2FsYXIodCl7cmV0dXJuIHRoaXMueD10LHRoaXMueT10LHRoaXMuej10LHRoaXMudz10LHRoaXN9c2V0WCh0KXtyZXR1cm4gdGhpcy54PXQsdGhpc31zZXRZKHQpe3JldHVybiB0aGlzLnk9dCx0aGlzfXNldFoodCl7cmV0dXJuIHRoaXMuej10LHRoaXN9c2V0Vyh0KXtyZXR1cm4gdGhpcy53PXQsdGhpc31zZXRDb21wb25lbnQodCxlKXtzd2l0Y2godCl7Y2FzZSAwOnRoaXMueD1lO2JyZWFrO2Nhc2UgMTp0aGlzLnk9ZTticmVhaztjYXNlIDI6dGhpcy56PWU7YnJlYWs7Y2FzZSAzOnRoaXMudz1lO2JyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCJpbmRleCBpcyBvdXQgb2YgcmFuZ2U6ICIrdCl9cmV0dXJuIHRoaXN9Z2V0Q29tcG9uZW50KHQpe3N3aXRjaCh0KXtjYXNlIDA6cmV0dXJuIHRoaXMueDtjYXNlIDE6cmV0dXJuIHRoaXMueTtjYXNlIDI6cmV0dXJuIHRoaXMuejtjYXNlIDM6cmV0dXJuIHRoaXMudztkZWZhdWx0OnRocm93IG5ldyBFcnJvcigiaW5kZXggaXMgb3V0IG9mIHJhbmdlOiAiK3QpfX1jbG9uZSgpe3JldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3Rvcih0aGlzLngsdGhpcy55LHRoaXMueix0aGlzLncpfWNvcHkodCl7cmV0dXJuIHRoaXMueD10LngsdGhpcy55PXQueSx0aGlzLno9dC56LHRoaXMudz12b2lkIDAhPT10Lnc/dC53OjEsdGhpc31hZGQodCxlKXtyZXR1cm4gdm9pZCAwIT09ZT8oY29uc29sZS53YXJuKCJUSFJFRS5WZWN0b3I0OiAuYWRkKCkgbm93IG9ubHkgYWNjZXB0cyBvbmUgYXJndW1lbnQuIFVzZSAuYWRkVmVjdG9ycyggYSwgYiApIGluc3RlYWQuIiksdGhpcy5hZGRWZWN0b3JzKHQsZSkpOih0aGlzLngrPXQueCx0aGlzLnkrPXQueSx0aGlzLnorPXQueix0aGlzLncrPXQudyx0aGlzKX1hZGRTY2FsYXIodCl7cmV0dXJuIHRoaXMueCs9dCx0aGlzLnkrPXQsdGhpcy56Kz10LHRoaXMudys9dCx0aGlzfWFkZFZlY3RvcnModCxlKXtyZXR1cm4gdGhpcy54PXQueCtlLngsdGhpcy55PXQueStlLnksdGhpcy56PXQueitlLnosdGhpcy53PXQudytlLncsdGhpc31hZGRTY2FsZWRWZWN0b3IodCxlKXtyZXR1cm4gdGhpcy54Kz10LngqZSx0aGlzLnkrPXQueSplLHRoaXMueis9dC56KmUsdGhpcy53Kz10LncqZSx0aGlzfXN1Yih0LGUpe3JldHVybiB2b2lkIDAhPT1lPyhjb25zb2xlLndhcm4oIlRIUkVFLlZlY3RvcjQ6IC5zdWIoKSBub3cgb25seSBhY2NlcHRzIG9uZSBhcmd1bWVudC4gVXNlIC5zdWJWZWN0b3JzKCBhLCBiICkgaW5zdGVhZC4iKSx0aGlzLnN1YlZlY3RvcnModCxlKSk6KHRoaXMueC09dC54LHRoaXMueS09dC55LHRoaXMuei09dC56LHRoaXMudy09dC53LHRoaXMpfXN1YlNjYWxhcih0KXtyZXR1cm4gdGhpcy54LT10LHRoaXMueS09dCx0aGlzLnotPXQsdGhpcy53LT10LHRoaXN9c3ViVmVjdG9ycyh0LGUpe3JldHVybiB0aGlzLng9dC54LWUueCx0aGlzLnk9dC55LWUueSx0aGlzLno9dC56LWUueix0aGlzLnc9dC53LWUudyx0aGlzfW11bHRpcGx5KHQpe3JldHVybiB0aGlzLngqPXQueCx0aGlzLnkqPXQueSx0aGlzLnoqPXQueix0aGlzLncqPXQudyx0aGlzfW11bHRpcGx5U2NhbGFyKHQpe3JldHVybiB0aGlzLngqPXQsdGhpcy55Kj10LHRoaXMueio9dCx0aGlzLncqPXQsdGhpc31hcHBseU1hdHJpeDQodCl7Y29uc3QgZT10aGlzLngscz10aGlzLnksaT10aGlzLnoscj10aGlzLncsbj10LmVsZW1lbnRzO3JldHVybiB0aGlzLng9blswXSplK25bNF0qcytuWzhdKmkrblsxMl0qcix0aGlzLnk9blsxXSplK25bNV0qcytuWzldKmkrblsxM10qcix0aGlzLno9blsyXSplK25bNl0qcytuWzEwXSppK25bMTRdKnIsdGhpcy53PW5bM10qZStuWzddKnMrblsxMV0qaStuWzE1XSpyLHRoaXN9ZGl2aWRlU2NhbGFyKHQpe3JldHVybiB0aGlzLm11bHRpcGx5U2NhbGFyKDEvdCl9c2V0QXhpc0FuZ2xlRnJvbVF1YXRlcm5pb24odCl7dGhpcy53PTIqTWF0aC5hY29zKHQudyk7Y29uc3QgZT1NYXRoLnNxcnQoMS10LncqdC53KTtyZXR1cm4gZTwxZS00Pyh0aGlzLng9MSx0aGlzLnk9MCx0aGlzLno9MCk6KHRoaXMueD10LngvZSx0aGlzLnk9dC55L2UsdGhpcy56PXQuei9lKSx0aGlzfXNldEF4aXNBbmdsZUZyb21Sb3RhdGlvbk1hdHJpeCh0KXtsZXQgZSxzLGkscjtjb25zdCBuPS4wMSxvPS4xLGE9dC5lbGVtZW50cyxoPWFbMF0sbD1hWzRdLGM9YVs4XSx1PWFbMV0sZD1hWzVdLG09YVs5XSx5PWFbMl0scD1hWzZdLHg9YVsxMF07aWYoTWF0aC5hYnMobC11KTxuJiZNYXRoLmFicyhjLXkpPG4mJk1hdGguYWJzKG0tcCk8bil7aWYoTWF0aC5hYnMobCt1KTxvJiZNYXRoLmFicyhjK3kpPG8mJk1hdGguYWJzKG0rcCk8byYmTWF0aC5hYnMoaCtkK3gtMyk8bylyZXR1cm4gdGhpcy5zZXQoMSwwLDAsMCksdGhpcztlPU1hdGguUEk7Y29uc3QgdD0oaCsxKS8yLGE9KGQrMSkvMixmPSh4KzEpLzIsZz0obCt1KS80LGI9KGMreSkvNCx3PShtK3ApLzQ7cmV0dXJuIHQ+YSYmdD5mP3Q8bj8ocz0wLGk9LjcwNzEwNjc4MSxyPS43MDcxMDY3ODEpOihzPU1hdGguc3FydCh0KSxpPWcvcyxyPWIvcyk6YT5mP2E8bj8ocz0uNzA3MTA2NzgxLGk9MCxyPS43MDcxMDY3ODEpOihpPU1hdGguc3FydChhKSxzPWcvaSxyPXcvaSk6ZjxuPyhzPS43MDcxMDY3ODEsaT0uNzA3MTA2NzgxLHI9MCk6KHI9TWF0aC5zcXJ0KGYpLHM9Yi9yLGk9dy9yKSx0aGlzLnNldChzLGkscixlKSx0aGlzfWxldCBmPU1hdGguc3FydCgocC1tKSoocC1tKSsoYy15KSooYy15KSsodS1sKSoodS1sKSk7cmV0dXJuIE1hdGguYWJzKGYpPC4wMDEmJihmPTEpLHRoaXMueD0ocC1tKS9mLHRoaXMueT0oYy15KS9mLHRoaXMuej0odS1sKS9mLHRoaXMudz1NYXRoLmFjb3MoKGgrZCt4LTEpLzIpLHRoaXN9bWluKHQpe3JldHVybiB0aGlzLng9TWF0aC5taW4odGhpcy54LHQueCksdGhpcy55PU1hdGgubWluKHRoaXMueSx0LnkpLHRoaXMuej1NYXRoLm1pbih0aGlzLnosdC56KSx0aGlzLnc9TWF0aC5taW4odGhpcy53LHQudyksdGhpc31tYXgodCl7cmV0dXJuIHRoaXMueD1NYXRoLm1heCh0aGlzLngsdC54KSx0aGlzLnk9TWF0aC5tYXgodGhpcy55LHQueSksdGhpcy56PU1hdGgubWF4KHRoaXMueix0LnopLHRoaXMudz1NYXRoLm1heCh0aGlzLncsdC53KSx0aGlzfWNsYW1wKHQsZSl7cmV0dXJuIHRoaXMueD1NYXRoLm1heCh0LngsTWF0aC5taW4oZS54LHRoaXMueCkpLHRoaXMueT1NYXRoLm1heCh0LnksTWF0aC5taW4oZS55LHRoaXMueSkpLHRoaXMuej1NYXRoLm1heCh0LnosTWF0aC5taW4oZS56LHRoaXMueikpLHRoaXMudz1NYXRoLm1heCh0LncsTWF0aC5taW4oZS53LHRoaXMudykpLHRoaXN9Y2xhbXBTY2FsYXIodCxlKXtyZXR1cm4gdGhpcy54PU1hdGgubWF4KHQsTWF0aC5taW4oZSx0aGlzLngpKSx0aGlzLnk9TWF0aC5tYXgodCxNYXRoLm1pbihlLHRoaXMueSkpLHRoaXMuej1NYXRoLm1heCh0LE1hdGgubWluKGUsdGhpcy56KSksdGhpcy53PU1hdGgubWF4KHQsTWF0aC5taW4oZSx0aGlzLncpKSx0aGlzfWNsYW1wTGVuZ3RoKHQsZSl7Y29uc3Qgcz10aGlzLmxlbmd0aCgpO3JldHVybiB0aGlzLmRpdmlkZVNjYWxhcihzfHwxKS5tdWx0aXBseVNjYWxhcihNYXRoLm1heCh0LE1hdGgubWluKGUscykpKX1mbG9vcigpe3JldHVybiB0aGlzLng9TWF0aC5mbG9vcih0aGlzLngpLHRoaXMueT1NYXRoLmZsb29yKHRoaXMueSksdGhpcy56PU1hdGguZmxvb3IodGhpcy56KSx0aGlzLnc9TWF0aC5mbG9vcih0aGlzLncpLHRoaXN9Y2VpbCgpe3JldHVybiB0aGlzLng9TWF0aC5jZWlsKHRoaXMueCksdGhpcy55PU1hdGguY2VpbCh0aGlzLnkpLHRoaXMuej1NYXRoLmNlaWwodGhpcy56KSx0aGlzLnc9TWF0aC5jZWlsKHRoaXMudyksdGhpc31yb3VuZCgpe3JldHVybiB0aGlzLng9TWF0aC5yb3VuZCh0aGlzLngpLHRoaXMueT1NYXRoLnJvdW5kKHRoaXMueSksdGhpcy56PU1hdGgucm91bmQodGhpcy56KSx0aGlzLnc9TWF0aC5yb3VuZCh0aGlzLncpLHRoaXN9cm91bmRUb1plcm8oKXtyZXR1cm4gdGhpcy54PXRoaXMueDwwP01hdGguY2VpbCh0aGlzLngpOk1hdGguZmxvb3IodGhpcy54KSx0aGlzLnk9dGhpcy55PDA/TWF0aC5jZWlsKHRoaXMueSk6TWF0aC5mbG9vcih0aGlzLnkpLHRoaXMuej10aGlzLno8MD9NYXRoLmNlaWwodGhpcy56KTpNYXRoLmZsb29yKHRoaXMueiksdGhpcy53PXRoaXMudzwwP01hdGguY2VpbCh0aGlzLncpOk1hdGguZmxvb3IodGhpcy53KSx0aGlzfW5lZ2F0ZSgpe3JldHVybiB0aGlzLng9LXRoaXMueCx0aGlzLnk9LXRoaXMueSx0aGlzLno9LXRoaXMueix0aGlzLnc9LXRoaXMudyx0aGlzfWRvdCh0KXtyZXR1cm4gdGhpcy54KnQueCt0aGlzLnkqdC55K3RoaXMueip0LnordGhpcy53KnQud31sZW5ndGhTcSgpe3JldHVybiB0aGlzLngqdGhpcy54K3RoaXMueSp0aGlzLnkrdGhpcy56KnRoaXMueit0aGlzLncqdGhpcy53fWxlbmd0aCgpe3JldHVybiBNYXRoLnNxcnQodGhpcy54KnRoaXMueCt0aGlzLnkqdGhpcy55K3RoaXMueip0aGlzLnordGhpcy53KnRoaXMudyl9bWFuaGF0dGFuTGVuZ3RoKCl7cmV0dXJuIE1hdGguYWJzKHRoaXMueCkrTWF0aC5hYnModGhpcy55KStNYXRoLmFicyh0aGlzLnopK01hdGguYWJzKHRoaXMudyl9bm9ybWFsaXplKCl7cmV0dXJuIHRoaXMuZGl2aWRlU2NhbGFyKHRoaXMubGVuZ3RoKCl8fDEpfXNldExlbmd0aCh0KXtyZXR1cm4gdGhpcy5ub3JtYWxpemUoKS5tdWx0aXBseVNjYWxhcih0KX1sZXJwKHQsZSl7cmV0dXJuIHRoaXMueCs9KHQueC10aGlzLngpKmUsdGhpcy55Kz0odC55LXRoaXMueSkqZSx0aGlzLnorPSh0LnotdGhpcy56KSplLHRoaXMudys9KHQudy10aGlzLncpKmUsdGhpc31sZXJwVmVjdG9ycyh0LGUscyl7cmV0dXJuIHRoaXMueD10LngrKGUueC10LngpKnMsdGhpcy55PXQueSsoZS55LXQueSkqcyx0aGlzLno9dC56KyhlLnotdC56KSpzLHRoaXMudz10LncrKGUudy10LncpKnMsdGhpc31lcXVhbHModCl7cmV0dXJuIHQueD09PXRoaXMueCYmdC55PT09dGhpcy55JiZ0Lno9PT10aGlzLnomJnQudz09PXRoaXMud31mcm9tQXJyYXkodCl7bGV0IGU9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOjA7cmV0dXJuIHRoaXMueD10W2VdLHRoaXMueT10W2UrMV0sdGhpcy56PXRbZSsyXSx0aGlzLnc9dFtlKzNdLHRoaXN9dG9BcnJheSgpe2xldCB0PWFyZ3VtZW50cy5sZW5ndGg+MCYmdm9pZCAwIT09YXJndW1lbnRzWzBdP2FyZ3VtZW50c1swXTpbXSxlPWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTowO3JldHVybiB0W2VdPXRoaXMueCx0W2UrMV09dGhpcy55LHRbZSsyXT10aGlzLnosdFtlKzNdPXRoaXMudyx0fWZyb21CdWZmZXJBdHRyaWJ1dGUodCxlLHMpe3JldHVybiB2b2lkIDAhPT1zJiZjb25zb2xlLndhcm4oIlRIUkVFLlZlY3RvcjQ6IG9mZnNldCBoYXMgYmVlbiByZW1vdmVkIGZyb20gLmZyb21CdWZmZXJBdHRyaWJ1dGUoKS4iKSx0aGlzLng9dC5nZXRYKGUpLHRoaXMueT10LmdldFkoZSksdGhpcy56PXQuZ2V0WihlKSx0aGlzLnc9dC5nZXRXKGUpLHRoaXN9cmFuZG9tKCl7cmV0dXJuIHRoaXMueD1NYXRoLnJhbmRvbSgpLHRoaXMueT1NYXRoLnJhbmRvbSgpLHRoaXMuej1NYXRoLnJhbmRvbSgpLHRoaXMudz1NYXRoLnJhbmRvbSgpLHRoaXN9KltTeW1ib2wuaXRlcmF0b3JdKCl7eWllbGQgdGhpcy54LHlpZWxkIHRoaXMueSx5aWVsZCB0aGlzLnoseWllbGQgdGhpcy53fX1jbGFzcyBUe2NvbnN0cnVjdG9yKCl7bGV0IHQ9YXJndW1lbnRzLmxlbmd0aD4wJiZ2b2lkIDAhPT1hcmd1bWVudHNbMF0/YXJndW1lbnRzWzBdOjAsZT1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06MCxzPWFyZ3VtZW50cy5sZW5ndGg+MiYmdm9pZCAwIT09YXJndW1lbnRzWzJdP2FyZ3VtZW50c1syXTowLGk9YXJndW1lbnRzLmxlbmd0aD4zJiZ2b2lkIDAhPT1hcmd1bWVudHNbM10/YXJndW1lbnRzWzNdOjE7dGhpcy5pc1F1YXRlcm5pb249ITAsdGhpcy5feD10LHRoaXMuX3k9ZSx0aGlzLl96PXMsdGhpcy5fdz1pfXN0YXRpYyBzbGVycCh0LGUscyxpKXtyZXR1cm4gY29uc29sZS53YXJuKCJUSFJFRS5RdWF0ZXJuaW9uOiBTdGF0aWMgLnNsZXJwKCkgaGFzIGJlZW4gZGVwcmVjYXRlZC4gVXNlIHFtLnNsZXJwUXVhdGVybmlvbnMoIHFhLCBxYiwgdCApIGluc3RlYWQuIikscy5zbGVycFF1YXRlcm5pb25zKHQsZSxpKX1zdGF0aWMgc2xlcnBGbGF0KHQsZSxzLGkscixuLG8pe2xldCBhPXNbaSswXSxoPXNbaSsxXSxsPXNbaSsyXSxjPXNbaSszXTtjb25zdCB1PXJbbiswXSxkPXJbbisxXSxtPXJbbisyXSx5PXJbbiszXTtpZigwPT09bylyZXR1cm4gdFtlKzBdPWEsdFtlKzFdPWgsdFtlKzJdPWwsdm9pZCh0W2UrM109Yyk7aWYoMT09PW8pcmV0dXJuIHRbZSswXT11LHRbZSsxXT1kLHRbZSsyXT1tLHZvaWQodFtlKzNdPXkpO2lmKGMhPT15fHxhIT09dXx8aCE9PWR8fGwhPT1tKXtsZXQgdD0xLW87Y29uc3QgZT1hKnUraCpkK2wqbStjKnkscz1lPj0wPzE6LTEsaT0xLWUqZTtpZihpPk51bWJlci5FUFNJTE9OKXtjb25zdCByPU1hdGguc3FydChpKSxuPU1hdGguYXRhbjIocixlKnMpO3Q9TWF0aC5zaW4odCpuKS9yLG89TWF0aC5zaW4obypuKS9yfWNvbnN0IHI9bypzO2lmKGE9YSp0K3UqcixoPWgqdCtkKnIsbD1sKnQrbSpyLGM9Yyp0K3kqcix0PT09MS1vKXtjb25zdCB0PTEvTWF0aC5zcXJ0KGEqYStoKmgrbCpsK2MqYyk7YSo9dCxoKj10LGwqPXQsYyo9dH19dFtlXT1hLHRbZSsxXT1oLHRbZSsyXT1sLHRbZSszXT1jfXN0YXRpYyBtdWx0aXBseVF1YXRlcm5pb25zRmxhdCh0LGUscyxpLHIsbil7Y29uc3Qgbz1zW2ldLGE9c1tpKzFdLGg9c1tpKzJdLGw9c1tpKzNdLGM9cltuXSx1PXJbbisxXSxkPXJbbisyXSxtPXJbbiszXTtyZXR1cm4gdFtlXT1vKm0rbCpjK2EqZC1oKnUsdFtlKzFdPWEqbStsKnUraCpjLW8qZCx0W2UrMl09aCptK2wqZCtvKnUtYSpjLHRbZSszXT1sKm0tbypjLWEqdS1oKmQsdH1nZXQgeCgpe3JldHVybiB0aGlzLl94fXNldCB4KHQpe3RoaXMuX3g9dCx0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCl9Z2V0IHkoKXtyZXR1cm4gdGhpcy5feX1zZXQgeSh0KXt0aGlzLl95PXQsdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpfWdldCB6KCl7cmV0dXJuIHRoaXMuX3p9c2V0IHoodCl7dGhpcy5fej10LHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKX1nZXQgdygpe3JldHVybiB0aGlzLl93fXNldCB3KHQpe3RoaXMuX3c9dCx0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCl9c2V0KHQsZSxzLGkpe3JldHVybiB0aGlzLl94PXQsdGhpcy5feT1lLHRoaXMuX3o9cyx0aGlzLl93PWksdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpLHRoaXN9Y2xvbmUoKXtyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IodGhpcy5feCx0aGlzLl95LHRoaXMuX3osdGhpcy5fdyl9Y29weSh0KXtyZXR1cm4gdGhpcy5feD10LngsdGhpcy5feT10LnksdGhpcy5fej10LnosdGhpcy5fdz10LncsdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpLHRoaXN9c2V0RnJvbUV1bGVyKHQsZSl7aWYoIXR8fCF0LmlzRXVsZXIpdGhyb3cgbmV3IEVycm9yKCJUSFJFRS5RdWF0ZXJuaW9uOiAuc2V0RnJvbUV1bGVyKCkgbm93IGV4cGVjdHMgYW4gRXVsZXIgcm90YXRpb24gcmF0aGVyIHRoYW4gYSBWZWN0b3IzIGFuZCBvcmRlci4iKTtjb25zdCBzPXQuX3gsaT10Ll95LHI9dC5feixuPXQuX29yZGVyLG89TWF0aC5jb3MsYT1NYXRoLnNpbixoPW8ocy8yKSxsPW8oaS8yKSxjPW8oci8yKSx1PWEocy8yKSxkPWEoaS8yKSxtPWEoci8yKTtzd2l0Y2gobil7Y2FzZSJYWVoiOnRoaXMuX3g9dSpsKmMraCpkKm0sdGhpcy5feT1oKmQqYy11KmwqbSx0aGlzLl96PWgqbCptK3UqZCpjLHRoaXMuX3c9aCpsKmMtdSpkKm07YnJlYWs7Y2FzZSJZWFoiOnRoaXMuX3g9dSpsKmMraCpkKm0sdGhpcy5feT1oKmQqYy11KmwqbSx0aGlzLl96PWgqbCptLXUqZCpjLHRoaXMuX3c9aCpsKmMrdSpkKm07YnJlYWs7Y2FzZSJaWFkiOnRoaXMuX3g9dSpsKmMtaCpkKm0sdGhpcy5feT1oKmQqYyt1KmwqbSx0aGlzLl96PWgqbCptK3UqZCpjLHRoaXMuX3c9aCpsKmMtdSpkKm07YnJlYWs7Y2FzZSJaWVgiOnRoaXMuX3g9dSpsKmMtaCpkKm0sdGhpcy5feT1oKmQqYyt1KmwqbSx0aGlzLl96PWgqbCptLXUqZCpjLHRoaXMuX3c9aCpsKmMrdSpkKm07YnJlYWs7Y2FzZSJZWlgiOnRoaXMuX3g9dSpsKmMraCpkKm0sdGhpcy5feT1oKmQqYyt1KmwqbSx0aGlzLl96PWgqbCptLXUqZCpjLHRoaXMuX3c9aCpsKmMtdSpkKm07YnJlYWs7Y2FzZSJYWlkiOnRoaXMuX3g9dSpsKmMtaCpkKm0sdGhpcy5feT1oKmQqYy11KmwqbSx0aGlzLl96PWgqbCptK3UqZCpjLHRoaXMuX3c9aCpsKmMrdSpkKm07YnJlYWs7ZGVmYXVsdDpjb25zb2xlLndhcm4oIlRIUkVFLlF1YXRlcm5pb246IC5zZXRGcm9tRXVsZXIoKSBlbmNvdW50ZXJlZCBhbiB1bmtub3duIG9yZGVyOiAiK24pfXJldHVybiExIT09ZSYmdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpLHRoaXN9c2V0RnJvbUF4aXNBbmdsZSh0LGUpe2NvbnN0IHM9ZS8yLGk9TWF0aC5zaW4ocyk7cmV0dXJuIHRoaXMuX3g9dC54KmksdGhpcy5feT10LnkqaSx0aGlzLl96PXQueippLHRoaXMuX3c9TWF0aC5jb3MocyksdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpLHRoaXN9c2V0RnJvbVJvdGF0aW9uTWF0cml4KHQpe2NvbnN0IGU9dC5lbGVtZW50cyxzPWVbMF0saT1lWzRdLHI9ZVs4XSxuPWVbMV0sbz1lWzVdLGE9ZVs5XSxoPWVbMl0sbD1lWzZdLGM9ZVsxMF0sdT1zK28rYztpZih1PjApe2NvbnN0IHQ9LjUvTWF0aC5zcXJ0KHUrMSk7dGhpcy5fdz0uMjUvdCx0aGlzLl94PShsLWEpKnQsdGhpcy5feT0oci1oKSp0LHRoaXMuX3o9KG4taSkqdH1lbHNlIGlmKHM+byYmcz5jKXtjb25zdCB0PTIqTWF0aC5zcXJ0KDErcy1vLWMpO3RoaXMuX3c9KGwtYSkvdCx0aGlzLl94PS4yNSp0LHRoaXMuX3k9KGkrbikvdCx0aGlzLl96PShyK2gpL3R9ZWxzZSBpZihvPmMpe2NvbnN0IHQ9MipNYXRoLnNxcnQoMStvLXMtYyk7dGhpcy5fdz0oci1oKS90LHRoaXMuX3g9KGkrbikvdCx0aGlzLl95PS4yNSp0LHRoaXMuX3o9KGErbCkvdH1lbHNle2NvbnN0IHQ9MipNYXRoLnNxcnQoMStjLXMtbyk7dGhpcy5fdz0obi1pKS90LHRoaXMuX3g9KHIraCkvdCx0aGlzLl95PShhK2wpL3QsdGhpcy5fej0uMjUqdH1yZXR1cm4gdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpLHRoaXN9c2V0RnJvbVVuaXRWZWN0b3JzKHQsZSl7bGV0IHM9dC5kb3QoZSkrMTtyZXR1cm4gczxOdW1iZXIuRVBTSUxPTj8ocz0wLE1hdGguYWJzKHQueCk+TWF0aC5hYnModC56KT8odGhpcy5feD0tdC55LHRoaXMuX3k9dC54LHRoaXMuX3o9MCx0aGlzLl93PXMpOih0aGlzLl94PTAsdGhpcy5feT0tdC56LHRoaXMuX3o9dC55LHRoaXMuX3c9cykpOih0aGlzLl94PXQueSplLnotdC56KmUueSx0aGlzLl95PXQueiplLngtdC54KmUueix0aGlzLl96PXQueCplLnktdC55KmUueCx0aGlzLl93PXMpLHRoaXMubm9ybWFsaXplKCl9YW5nbGVUbyh0KXtyZXR1cm4gMipNYXRoLmFjb3MoTWF0aC5hYnMobyh0aGlzLmRvdCh0KSwtMSwxKSkpfXJvdGF0ZVRvd2FyZHModCxlKXtjb25zdCBzPXRoaXMuYW5nbGVUbyh0KTtpZigwPT09cylyZXR1cm4gdGhpcztjb25zdCBpPU1hdGgubWluKDEsZS9zKTtyZXR1cm4gdGhpcy5zbGVycCh0LGkpLHRoaXN9aWRlbnRpdHkoKXtyZXR1cm4gdGhpcy5zZXQoMCwwLDAsMSl9aW52ZXJ0KCl7cmV0dXJuIHRoaXMuY29uanVnYXRlKCl9Y29uanVnYXRlKCl7cmV0dXJuIHRoaXMuX3gqPS0xLHRoaXMuX3kqPS0xLHRoaXMuX3oqPS0xLHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKSx0aGlzfWRvdCh0KXtyZXR1cm4gdGhpcy5feCp0Ll94K3RoaXMuX3kqdC5feSt0aGlzLl96KnQuX3ordGhpcy5fdyp0Ll93fWxlbmd0aFNxKCl7cmV0dXJuIHRoaXMuX3gqdGhpcy5feCt0aGlzLl95KnRoaXMuX3krdGhpcy5feip0aGlzLl96K3RoaXMuX3cqdGhpcy5fd31sZW5ndGgoKXtyZXR1cm4gTWF0aC5zcXJ0KHRoaXMuX3gqdGhpcy5feCt0aGlzLl95KnRoaXMuX3krdGhpcy5feip0aGlzLl96K3RoaXMuX3cqdGhpcy5fdyl9bm9ybWFsaXplKCl7bGV0IHQ9dGhpcy5sZW5ndGgoKTtyZXR1cm4gMD09PXQ/KHRoaXMuX3g9MCx0aGlzLl95PTAsdGhpcy5fej0wLHRoaXMuX3c9MSk6KHQ9MS90LHRoaXMuX3g9dGhpcy5feCp0LHRoaXMuX3k9dGhpcy5feSp0LHRoaXMuX3o9dGhpcy5feip0LHRoaXMuX3c9dGhpcy5fdyp0KSx0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCksdGhpc31tdWx0aXBseSh0LGUpe3JldHVybiB2b2lkIDAhPT1lPyhjb25zb2xlLndhcm4oIlRIUkVFLlF1YXRlcm5pb246IC5tdWx0aXBseSgpIG5vdyBvbmx5IGFjY2VwdHMgb25lIGFyZ3VtZW50LiBVc2UgLm11bHRpcGx5UXVhdGVybmlvbnMoIGEsIGIgKSBpbnN0ZWFkLiIpLHRoaXMubXVsdGlwbHlRdWF0ZXJuaW9ucyh0LGUpKTp0aGlzLm11bHRpcGx5UXVhdGVybmlvbnModGhpcyx0KX1wcmVtdWx0aXBseSh0KXtyZXR1cm4gdGhpcy5tdWx0aXBseVF1YXRlcm5pb25zKHQsdGhpcyl9bXVsdGlwbHlRdWF0ZXJuaW9ucyh0LGUpe2NvbnN0IHM9dC5feCxpPXQuX3kscj10Ll96LG49dC5fdyxvPWUuX3gsYT1lLl95LGg9ZS5feixsPWUuX3c7cmV0dXJuIHRoaXMuX3g9cypsK24qbytpKmgtciphLHRoaXMuX3k9aSpsK24qYStyKm8tcypoLHRoaXMuX3o9cipsK24qaCtzKmEtaSpvLHRoaXMuX3c9bipsLXMqby1pKmEtcipoLHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKSx0aGlzfXNsZXJwKHQsZSl7aWYoMD09PWUpcmV0dXJuIHRoaXM7aWYoMT09PWUpcmV0dXJuIHRoaXMuY29weSh0KTtjb25zdCBzPXRoaXMuX3gsaT10aGlzLl95LHI9dGhpcy5feixuPXRoaXMuX3c7bGV0IG89bip0Ll93K3MqdC5feCtpKnQuX3krcip0Ll96O2lmKG88MD8odGhpcy5fdz0tdC5fdyx0aGlzLl94PS10Ll94LHRoaXMuX3k9LXQuX3ksdGhpcy5fej0tdC5feixvPS1vKTp0aGlzLmNvcHkodCksbz49MSlyZXR1cm4gdGhpcy5fdz1uLHRoaXMuX3g9cyx0aGlzLl95PWksdGhpcy5fej1yLHRoaXM7Y29uc3QgYT0xLW8qbztpZihhPD1OdW1iZXIuRVBTSUxPTil7Y29uc3QgdD0xLWU7cmV0dXJuIHRoaXMuX3c9dCpuK2UqdGhpcy5fdyx0aGlzLl94PXQqcytlKnRoaXMuX3gsdGhpcy5feT10KmkrZSp0aGlzLl95LHRoaXMuX3o9dCpyK2UqdGhpcy5feix0aGlzLm5vcm1hbGl6ZSgpLHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKSx0aGlzfWNvbnN0IGg9TWF0aC5zcXJ0KGEpLGw9TWF0aC5hdGFuMihoLG8pLGM9TWF0aC5zaW4oKDEtZSkqbCkvaCx1PU1hdGguc2luKGUqbCkvaDtyZXR1cm4gdGhpcy5fdz1uKmMrdGhpcy5fdyp1LHRoaXMuX3g9cypjK3RoaXMuX3gqdSx0aGlzLl95PWkqYyt0aGlzLl95KnUsdGhpcy5fej1yKmMrdGhpcy5feip1LHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKSx0aGlzfXNsZXJwUXVhdGVybmlvbnModCxlLHMpe3JldHVybiB0aGlzLmNvcHkodCkuc2xlcnAoZSxzKX1yYW5kb20oKXtjb25zdCB0PU1hdGgucmFuZG9tKCksZT1NYXRoLnNxcnQoMS10KSxzPU1hdGguc3FydCh0KSxpPTIqTWF0aC5QSSpNYXRoLnJhbmRvbSgpLHI9MipNYXRoLlBJKk1hdGgucmFuZG9tKCk7cmV0dXJuIHRoaXMuc2V0KGUqTWF0aC5jb3MoaSkscypNYXRoLnNpbihyKSxzKk1hdGguY29zKHIpLGUqTWF0aC5zaW4oaSkpfWVxdWFscyh0KXtyZXR1cm4gdC5feD09PXRoaXMuX3gmJnQuX3k9PT10aGlzLl95JiZ0Ll96PT09dGhpcy5feiYmdC5fdz09PXRoaXMuX3d9ZnJvbUFycmF5KHQpe2xldCBlPWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTowO3JldHVybiB0aGlzLl94PXRbZV0sdGhpcy5feT10W2UrMV0sdGhpcy5fej10W2UrMl0sdGhpcy5fdz10W2UrM10sdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpLHRoaXN9dG9BcnJheSgpe2xldCB0PWFyZ3VtZW50cy5sZW5ndGg+MCYmdm9pZCAwIT09YXJndW1lbnRzWzBdP2FyZ3VtZW50c1swXTpbXSxlPWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTowO3JldHVybiB0W2VdPXRoaXMuX3gsdFtlKzFdPXRoaXMuX3ksdFtlKzJdPXRoaXMuX3osdFtlKzNdPXRoaXMuX3csdH1mcm9tQnVmZmVyQXR0cmlidXRlKHQsZSl7cmV0dXJuIHRoaXMuX3g9dC5nZXRYKGUpLHRoaXMuX3k9dC5nZXRZKGUpLHRoaXMuX3o9dC5nZXRaKGUpLHRoaXMuX3c9dC5nZXRXKGUpLHRoaXN9X29uQ2hhbmdlKHQpe3JldHVybiB0aGlzLl9vbkNoYW5nZUNhbGxiYWNrPXQsdGhpc31fb25DaGFuZ2VDYWxsYmFjaygpe30qW1N5bWJvbC5pdGVyYXRvcl0oKXt5aWVsZCB0aGlzLl94LHlpZWxkIHRoaXMuX3kseWllbGQgdGhpcy5feix5aWVsZCB0aGlzLl93fX1jbGFzcyBFe2NvbnN0cnVjdG9yKCl7bGV0IHQ9YXJndW1lbnRzLmxlbmd0aD4wJiZ2b2lkIDAhPT1hcmd1bWVudHNbMF0/YXJndW1lbnRzWzBdOjAsZT1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06MCxzPWFyZ3VtZW50cy5sZW5ndGg+MiYmdm9pZCAwIT09YXJndW1lbnRzWzJdP2FyZ3VtZW50c1syXTowO0UucHJvdG90eXBlLmlzVmVjdG9yMz0hMCx0aGlzLng9dCx0aGlzLnk9ZSx0aGlzLno9c31zZXQodCxlLHMpe3JldHVybiB2b2lkIDA9PT1zJiYocz10aGlzLnopLHRoaXMueD10LHRoaXMueT1lLHRoaXMuej1zLHRoaXN9c2V0U2NhbGFyKHQpe3JldHVybiB0aGlzLng9dCx0aGlzLnk9dCx0aGlzLno9dCx0aGlzfXNldFgodCl7cmV0dXJuIHRoaXMueD10LHRoaXN9c2V0WSh0KXtyZXR1cm4gdGhpcy55PXQsdGhpc31zZXRaKHQpe3JldHVybiB0aGlzLno9dCx0aGlzfXNldENvbXBvbmVudCh0LGUpe3N3aXRjaCh0KXtjYXNlIDA6dGhpcy54PWU7YnJlYWs7Y2FzZSAxOnRoaXMueT1lO2JyZWFrO2Nhc2UgMjp0aGlzLno9ZTticmVhaztkZWZhdWx0OnRocm93IG5ldyBFcnJvcigiaW5kZXggaXMgb3V0IG9mIHJhbmdlOiAiK3QpfXJldHVybiB0aGlzfWdldENvbXBvbmVudCh0KXtzd2l0Y2godCl7Y2FzZSAwOnJldHVybiB0aGlzLng7Y2FzZSAxOnJldHVybiB0aGlzLnk7Y2FzZSAyOnJldHVybiB0aGlzLno7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoImluZGV4IGlzIG91dCBvZiByYW5nZTogIit0KX19Y2xvbmUoKXtyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IodGhpcy54LHRoaXMueSx0aGlzLnopfWNvcHkodCl7cmV0dXJuIHRoaXMueD10LngsdGhpcy55PXQueSx0aGlzLno9dC56LHRoaXN9YWRkKHQsZSl7cmV0dXJuIHZvaWQgMCE9PWU/KGNvbnNvbGUud2FybigiVEhSRUUuVmVjdG9yMzogLmFkZCgpIG5vdyBvbmx5IGFjY2VwdHMgb25lIGFyZ3VtZW50LiBVc2UgLmFkZFZlY3RvcnMoIGEsIGIgKSBpbnN0ZWFkLiIpLHRoaXMuYWRkVmVjdG9ycyh0LGUpKToodGhpcy54Kz10LngsdGhpcy55Kz10LnksdGhpcy56Kz10LnosdGhpcyl9YWRkU2NhbGFyKHQpe3JldHVybiB0aGlzLngrPXQsdGhpcy55Kz10LHRoaXMueis9dCx0aGlzfWFkZFZlY3RvcnModCxlKXtyZXR1cm4gdGhpcy54PXQueCtlLngsdGhpcy55PXQueStlLnksdGhpcy56PXQueitlLnosdGhpc31hZGRTY2FsZWRWZWN0b3IodCxlKXtyZXR1cm4gdGhpcy54Kz10LngqZSx0aGlzLnkrPXQueSplLHRoaXMueis9dC56KmUsdGhpc31zdWIodCxlKXtyZXR1cm4gdm9pZCAwIT09ZT8oY29uc29sZS53YXJuKCJUSFJFRS5WZWN0b3IzOiAuc3ViKCkgbm93IG9ubHkgYWNjZXB0cyBvbmUgYXJndW1lbnQuIFVzZSAuc3ViVmVjdG9ycyggYSwgYiApIGluc3RlYWQuIiksdGhpcy5zdWJWZWN0b3JzKHQsZSkpOih0aGlzLngtPXQueCx0aGlzLnktPXQueSx0aGlzLnotPXQueix0aGlzKX1zdWJTY2FsYXIodCl7cmV0dXJuIHRoaXMueC09dCx0aGlzLnktPXQsdGhpcy56LT10LHRoaXN9c3ViVmVjdG9ycyh0LGUpe3JldHVybiB0aGlzLng9dC54LWUueCx0aGlzLnk9dC55LWUueSx0aGlzLno9dC56LWUueix0aGlzfW11bHRpcGx5KHQsZSl7cmV0dXJuIHZvaWQgMCE9PWU/KGNvbnNvbGUud2FybigiVEhSRUUuVmVjdG9yMzogLm11bHRpcGx5KCkgbm93IG9ubHkgYWNjZXB0cyBvbmUgYXJndW1lbnQuIFVzZSAubXVsdGlwbHlWZWN0b3JzKCBhLCBiICkgaW5zdGVhZC4iKSx0aGlzLm11bHRpcGx5VmVjdG9ycyh0LGUpKToodGhpcy54Kj10LngsdGhpcy55Kj10LnksdGhpcy56Kj10LnosdGhpcyl9bXVsdGlwbHlTY2FsYXIodCl7cmV0dXJuIHRoaXMueCo9dCx0aGlzLnkqPXQsdGhpcy56Kj10LHRoaXN9bXVsdGlwbHlWZWN0b3JzKHQsZSl7cmV0dXJuIHRoaXMueD10LngqZS54LHRoaXMueT10LnkqZS55LHRoaXMuej10LnoqZS56LHRoaXN9YXBwbHlFdWxlcih0KXtyZXR1cm4gdCYmdC5pc0V1bGVyfHxjb25zb2xlLmVycm9yKCJUSFJFRS5WZWN0b3IzOiAuYXBwbHlFdWxlcigpIG5vdyBleHBlY3RzIGFuIEV1bGVyIHJvdGF0aW9uIHJhdGhlciB0aGFuIGEgVmVjdG9yMyBhbmQgb3JkZXIuIiksdGhpcy5hcHBseVF1YXRlcm5pb24oUC5zZXRGcm9tRXVsZXIodCkpfWFwcGx5QXhpc0FuZ2xlKHQsZSl7cmV0dXJuIHRoaXMuYXBwbHlRdWF0ZXJuaW9uKFAuc2V0RnJvbUF4aXNBbmdsZSh0LGUpKX1hcHBseU1hdHJpeDModCl7Y29uc3QgZT10aGlzLngscz10aGlzLnksaT10aGlzLnoscj10LmVsZW1lbnRzO3JldHVybiB0aGlzLng9clswXSplK3JbM10qcytyWzZdKmksdGhpcy55PXJbMV0qZStyWzRdKnMrcls3XSppLHRoaXMuej1yWzJdKmUrcls1XSpzK3JbOF0qaSx0aGlzfWFwcGx5Tm9ybWFsTWF0cml4KHQpe3JldHVybiB0aGlzLmFwcGx5TWF0cml4Myh0KS5ub3JtYWxpemUoKX1hcHBseU1hdHJpeDQodCl7Y29uc3QgZT10aGlzLngscz10aGlzLnksaT10aGlzLnoscj10LmVsZW1lbnRzLG49MS8oclszXSplK3JbN10qcytyWzExXSppK3JbMTVdKTtyZXR1cm4gdGhpcy54PShyWzBdKmUrcls0XSpzK3JbOF0qaStyWzEyXSkqbix0aGlzLnk9KHJbMV0qZStyWzVdKnMrcls5XSppK3JbMTNdKSpuLHRoaXMuej0oclsyXSplK3JbNl0qcytyWzEwXSppK3JbMTRdKSpuLHRoaXN9YXBwbHlRdWF0ZXJuaW9uKHQpe2NvbnN0IGU9dGhpcy54LHM9dGhpcy55LGk9dGhpcy56LHI9dC54LG49dC55LG89dC56LGE9dC53LGg9YSplK24qaS1vKnMsbD1hKnMrbyplLXIqaSxjPWEqaStyKnMtbiplLHU9LXIqZS1uKnMtbyppO3JldHVybiB0aGlzLng9aCphK3UqLXIrbCotby1jKi1uLHRoaXMueT1sKmErdSotbitjKi1yLWgqLW8sdGhpcy56PWMqYSt1Ki1vK2gqLW4tbCotcix0aGlzfXByb2plY3QodCl7cmV0dXJuIHRoaXMuYXBwbHlNYXRyaXg0KHQubWF0cml4V29ybGRJbnZlcnNlKS5hcHBseU1hdHJpeDQodC5wcm9qZWN0aW9uTWF0cml4KX11bnByb2plY3QodCl7cmV0dXJuIHRoaXMuYXBwbHlNYXRyaXg0KHQucHJvamVjdGlvbk1hdHJpeEludmVyc2UpLmFwcGx5TWF0cml4NCh0Lm1hdHJpeFdvcmxkKX10cmFuc2Zvcm1EaXJlY3Rpb24odCl7Y29uc3QgZT10aGlzLngscz10aGlzLnksaT10aGlzLnoscj10LmVsZW1lbnRzO3JldHVybiB0aGlzLng9clswXSplK3JbNF0qcytyWzhdKmksdGhpcy55PXJbMV0qZStyWzVdKnMrcls5XSppLHRoaXMuej1yWzJdKmUrcls2XSpzK3JbMTBdKmksdGhpcy5ub3JtYWxpemUoKX1kaXZpZGUodCl7cmV0dXJuIHRoaXMueC89dC54LHRoaXMueS89dC55LHRoaXMuei89dC56LHRoaXN9ZGl2aWRlU2NhbGFyKHQpe3JldHVybiB0aGlzLm11bHRpcGx5U2NhbGFyKDEvdCl9bWluKHQpe3JldHVybiB0aGlzLng9TWF0aC5taW4odGhpcy54LHQueCksdGhpcy55PU1hdGgubWluKHRoaXMueSx0LnkpLHRoaXMuej1NYXRoLm1pbih0aGlzLnosdC56KSx0aGlzfW1heCh0KXtyZXR1cm4gdGhpcy54PU1hdGgubWF4KHRoaXMueCx0LngpLHRoaXMueT1NYXRoLm1heCh0aGlzLnksdC55KSx0aGlzLno9TWF0aC5tYXgodGhpcy56LHQueiksdGhpc31jbGFtcCh0LGUpe3JldHVybiB0aGlzLng9TWF0aC5tYXgodC54LE1hdGgubWluKGUueCx0aGlzLngpKSx0aGlzLnk9TWF0aC5tYXgodC55LE1hdGgubWluKGUueSx0aGlzLnkpKSx0aGlzLno9TWF0aC5tYXgodC56LE1hdGgubWluKGUueix0aGlzLnopKSx0aGlzfWNsYW1wU2NhbGFyKHQsZSl7cmV0dXJuIHRoaXMueD1NYXRoLm1heCh0LE1hdGgubWluKGUsdGhpcy54KSksdGhpcy55PU1hdGgubWF4KHQsTWF0aC5taW4oZSx0aGlzLnkpKSx0aGlzLno9TWF0aC5tYXgodCxNYXRoLm1pbihlLHRoaXMueikpLHRoaXN9Y2xhbXBMZW5ndGgodCxlKXtjb25zdCBzPXRoaXMubGVuZ3RoKCk7cmV0dXJuIHRoaXMuZGl2aWRlU2NhbGFyKHN8fDEpLm11bHRpcGx5U2NhbGFyKE1hdGgubWF4KHQsTWF0aC5taW4oZSxzKSkpfWZsb29yKCl7cmV0dXJuIHRoaXMueD1NYXRoLmZsb29yKHRoaXMueCksdGhpcy55PU1hdGguZmxvb3IodGhpcy55KSx0aGlzLno9TWF0aC5mbG9vcih0aGlzLnopLHRoaXN9Y2VpbCgpe3JldHVybiB0aGlzLng9TWF0aC5jZWlsKHRoaXMueCksdGhpcy55PU1hdGguY2VpbCh0aGlzLnkpLHRoaXMuej1NYXRoLmNlaWwodGhpcy56KSx0aGlzfXJvdW5kKCl7cmV0dXJuIHRoaXMueD1NYXRoLnJvdW5kKHRoaXMueCksdGhpcy55PU1hdGgucm91bmQodGhpcy55KSx0aGlzLno9TWF0aC5yb3VuZCh0aGlzLnopLHRoaXN9cm91bmRUb1plcm8oKXtyZXR1cm4gdGhpcy54PXRoaXMueDwwP01hdGguY2VpbCh0aGlzLngpOk1hdGguZmxvb3IodGhpcy54KSx0aGlzLnk9dGhpcy55PDA/TWF0aC5jZWlsKHRoaXMueSk6TWF0aC5mbG9vcih0aGlzLnkpLHRoaXMuej10aGlzLno8MD9NYXRoLmNlaWwodGhpcy56KTpNYXRoLmZsb29yKHRoaXMueiksdGhpc31uZWdhdGUoKXtyZXR1cm4gdGhpcy54PS10aGlzLngsdGhpcy55PS10aGlzLnksdGhpcy56PS10aGlzLnosdGhpc31kb3QodCl7cmV0dXJuIHRoaXMueCp0LngrdGhpcy55KnQueSt0aGlzLnoqdC56fWxlbmd0aFNxKCl7cmV0dXJuIHRoaXMueCp0aGlzLngrdGhpcy55KnRoaXMueSt0aGlzLnoqdGhpcy56fWxlbmd0aCgpe3JldHVybiBNYXRoLnNxcnQodGhpcy54KnRoaXMueCt0aGlzLnkqdGhpcy55K3RoaXMueip0aGlzLnopfW1hbmhhdHRhbkxlbmd0aCgpe3JldHVybiBNYXRoLmFicyh0aGlzLngpK01hdGguYWJzKHRoaXMueSkrTWF0aC5hYnModGhpcy56KX1ub3JtYWxpemUoKXtyZXR1cm4gdGhpcy5kaXZpZGVTY2FsYXIodGhpcy5sZW5ndGgoKXx8MSl9c2V0TGVuZ3RoKHQpe3JldHVybiB0aGlzLm5vcm1hbGl6ZSgpLm11bHRpcGx5U2NhbGFyKHQpfWxlcnAodCxlKXtyZXR1cm4gdGhpcy54Kz0odC54LXRoaXMueCkqZSx0aGlzLnkrPSh0LnktdGhpcy55KSplLHRoaXMueis9KHQuei10aGlzLnopKmUsdGhpc31sZXJwVmVjdG9ycyh0LGUscyl7cmV0dXJuIHRoaXMueD10LngrKGUueC10LngpKnMsdGhpcy55PXQueSsoZS55LXQueSkqcyx0aGlzLno9dC56KyhlLnotdC56KSpzLHRoaXN9Y3Jvc3ModCxlKXtyZXR1cm4gdm9pZCAwIT09ZT8oY29uc29sZS53YXJuKCJUSFJFRS5WZWN0b3IzOiAuY3Jvc3MoKSBub3cgb25seSBhY2NlcHRzIG9uZSBhcmd1bWVudC4gVXNlIC5jcm9zc1ZlY3RvcnMoIGEsIGIgKSBpbnN0ZWFkLiIpLHRoaXMuY3Jvc3NWZWN0b3JzKHQsZSkpOnRoaXMuY3Jvc3NWZWN0b3JzKHRoaXMsdCl9Y3Jvc3NWZWN0b3JzKHQsZSl7Y29uc3Qgcz10LngsaT10Lnkscj10Lnosbj1lLngsbz1lLnksYT1lLno7cmV0dXJuIHRoaXMueD1pKmEtcipvLHRoaXMueT1yKm4tcyphLHRoaXMuej1zKm8taSpuLHRoaXN9cHJvamVjdE9uVmVjdG9yKHQpe2NvbnN0IGU9dC5sZW5ndGhTcSgpO2lmKDA9PT1lKXJldHVybiB0aGlzLnNldCgwLDAsMCk7Y29uc3Qgcz10LmRvdCh0aGlzKS9lO3JldHVybiB0aGlzLmNvcHkodCkubXVsdGlwbHlTY2FsYXIocyl9cHJvamVjdE9uUGxhbmUodCl7cmV0dXJuIGsuY29weSh0aGlzKS5wcm9qZWN0T25WZWN0b3IodCksdGhpcy5zdWIoayl9cmVmbGVjdCh0KXtyZXR1cm4gdGhpcy5zdWIoay5jb3B5KHQpLm11bHRpcGx5U2NhbGFyKDIqdGhpcy5kb3QodCkpKX1hbmdsZVRvKHQpe2NvbnN0IGU9TWF0aC5zcXJ0KHRoaXMubGVuZ3RoU3EoKSp0Lmxlbmd0aFNxKCkpO2lmKDA9PT1lKXJldHVybiBNYXRoLlBJLzI7Y29uc3Qgcz10aGlzLmRvdCh0KS9lO3JldHVybiBNYXRoLmFjb3MobyhzLC0xLDEpKX1kaXN0YW5jZVRvKHQpe3JldHVybiBNYXRoLnNxcnQodGhpcy5kaXN0YW5jZVRvU3F1YXJlZCh0KSl9ZGlzdGFuY2VUb1NxdWFyZWQodCl7Y29uc3QgZT10aGlzLngtdC54LHM9dGhpcy55LXQueSxpPXRoaXMuei10Lno7cmV0dXJuIGUqZStzKnMraSppfW1hbmhhdHRhbkRpc3RhbmNlVG8odCl7cmV0dXJuIE1hdGguYWJzKHRoaXMueC10LngpK01hdGguYWJzKHRoaXMueS10LnkpK01hdGguYWJzKHRoaXMuei10LnopfXNldEZyb21TcGhlcmljYWwodCl7cmV0dXJuIHRoaXMuc2V0RnJvbVNwaGVyaWNhbENvb3Jkcyh0LnJhZGl1cyx0LnBoaSx0LnRoZXRhKX1zZXRGcm9tU3BoZXJpY2FsQ29vcmRzKHQsZSxzKXtjb25zdCBpPU1hdGguc2luKGUpKnQ7cmV0dXJuIHRoaXMueD1pKk1hdGguc2luKHMpLHRoaXMueT1NYXRoLmNvcyhlKSp0LHRoaXMuej1pKk1hdGguY29zKHMpLHRoaXN9c2V0RnJvbUN5bGluZHJpY2FsKHQpe3JldHVybiB0aGlzLnNldEZyb21DeWxpbmRyaWNhbENvb3Jkcyh0LnJhZGl1cyx0LnRoZXRhLHQueSl9c2V0RnJvbUN5bGluZHJpY2FsQ29vcmRzKHQsZSxzKXtyZXR1cm4gdGhpcy54PXQqTWF0aC5zaW4oZSksdGhpcy55PXMsdGhpcy56PXQqTWF0aC5jb3MoZSksdGhpc31zZXRGcm9tTWF0cml4UG9zaXRpb24odCl7Y29uc3QgZT10LmVsZW1lbnRzO3JldHVybiB0aGlzLng9ZVsxMl0sdGhpcy55PWVbMTNdLHRoaXMuej1lWzE0XSx0aGlzfXNldEZyb21NYXRyaXhTY2FsZSh0KXtjb25zdCBlPXRoaXMuc2V0RnJvbU1hdHJpeENvbHVtbih0LDApLmxlbmd0aCgpLHM9dGhpcy5zZXRGcm9tTWF0cml4Q29sdW1uKHQsMSkubGVuZ3RoKCksaT10aGlzLnNldEZyb21NYXRyaXhDb2x1bW4odCwyKS5sZW5ndGgoKTtyZXR1cm4gdGhpcy54PWUsdGhpcy55PXMsdGhpcy56PWksdGhpc31zZXRGcm9tTWF0cml4Q29sdW1uKHQsZSl7cmV0dXJuIHRoaXMuZnJvbUFycmF5KHQuZWxlbWVudHMsNCplKX1zZXRGcm9tTWF0cml4M0NvbHVtbih0LGUpe3JldHVybiB0aGlzLmZyb21BcnJheSh0LmVsZW1lbnRzLDMqZSl9c2V0RnJvbUV1bGVyKHQpe3JldHVybiB0aGlzLng9dC5feCx0aGlzLnk9dC5feSx0aGlzLno9dC5feix0aGlzfWVxdWFscyh0KXtyZXR1cm4gdC54PT09dGhpcy54JiZ0Lnk9PT10aGlzLnkmJnQuej09PXRoaXMuen1mcm9tQXJyYXkodCl7bGV0IGU9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOjA7cmV0dXJuIHRoaXMueD10W2VdLHRoaXMueT10W2UrMV0sdGhpcy56PXRbZSsyXSx0aGlzfXRvQXJyYXkoKXtsZXQgdD1hcmd1bWVudHMubGVuZ3RoPjAmJnZvaWQgMCE9PWFyZ3VtZW50c1swXT9hcmd1bWVudHNbMF06W10sZT1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06MDtyZXR1cm4gdFtlXT10aGlzLngsdFtlKzFdPXRoaXMueSx0W2UrMl09dGhpcy56LHR9ZnJvbUJ1ZmZlckF0dHJpYnV0ZSh0LGUscyl7cmV0dXJuIHZvaWQgMCE9PXMmJmNvbnNvbGUud2FybigiVEhSRUUuVmVjdG9yMzogb2Zmc2V0IGhhcyBiZWVuIHJlbW92ZWQgZnJvbSAuZnJvbUJ1ZmZlckF0dHJpYnV0ZSgpLiIpLHRoaXMueD10LmdldFgoZSksdGhpcy55PXQuZ2V0WShlKSx0aGlzLno9dC5nZXRaKGUpLHRoaXN9cmFuZG9tKCl7cmV0dXJuIHRoaXMueD1NYXRoLnJhbmRvbSgpLHRoaXMueT1NYXRoLnJhbmRvbSgpLHRoaXMuej1NYXRoLnJhbmRvbSgpLHRoaXN9cmFuZG9tRGlyZWN0aW9uKCl7Y29uc3QgdD0yKihNYXRoLnJhbmRvbSgpLS41KSxlPU1hdGgucmFuZG9tKCkqTWF0aC5QSSoyLHM9TWF0aC5zcXJ0KDEtdCoqMik7cmV0dXJuIHRoaXMueD1zKk1hdGguY29zKGUpLHRoaXMueT1zKk1hdGguc2luKGUpLHRoaXMuej10LHRoaXN9KltTeW1ib2wuaXRlcmF0b3JdKCl7eWllbGQgdGhpcy54LHlpZWxkIHRoaXMueSx5aWVsZCB0aGlzLnp9fWNvbnN0IGs9bmV3IEUsUD1uZXcgVDtjbGFzcyBDe2NvbnN0cnVjdG9yKCl7bGV0IHQ9YXJndW1lbnRzLmxlbmd0aD4wJiZ2b2lkIDAhPT1hcmd1bWVudHNbMF0/YXJndW1lbnRzWzBdOm5ldyBFKDEvMCwxLzAsMS8wKSxlPWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTpuZXcgRSgtMS8wLC0xLzAsLTEvMCk7dGhpcy5pc0JveDM9ITAsdGhpcy5taW49dCx0aGlzLm1heD1lfXNldCh0LGUpe3JldHVybiB0aGlzLm1pbi5jb3B5KHQpLHRoaXMubWF4LmNvcHkoZSksdGhpc31zZXRGcm9tQXJyYXkodCl7bGV0IGU9MS8wLHM9MS8wLGk9MS8wLHI9LTEvMCxuPS0xLzAsbz0tMS8wO2ZvcihsZXQgYT0wLGg9dC5sZW5ndGg7YTxoO2ErPTMpe2NvbnN0IGg9dFthXSxsPXRbYSsxXSxjPXRbYSsyXTtoPGUmJihlPWgpLGw8cyYmKHM9bCksYzxpJiYoaT1jKSxoPnImJihyPWgpLGw+biYmKG49bCksYz5vJiYobz1jKX1yZXR1cm4gdGhpcy5taW4uc2V0KGUscyxpKSx0aGlzLm1heC5zZXQocixuLG8pLHRoaXN9c2V0RnJvbUJ1ZmZlckF0dHJpYnV0ZSh0KXtsZXQgZT0xLzAscz0xLzAsaT0xLzAscj0tMS8wLG49LTEvMCxvPS0xLzA7Zm9yKGxldCBhPTAsaD10LmNvdW50O2E8aDthKyspe2NvbnN0IGg9dC5nZXRYKGEpLGw9dC5nZXRZKGEpLGM9dC5nZXRaKGEpO2g8ZSYmKGU9aCksbDxzJiYocz1sKSxjPGkmJihpPWMpLGg+ciYmKHI9aCksbD5uJiYobj1sKSxjPm8mJihvPWMpfXJldHVybiB0aGlzLm1pbi5zZXQoZSxzLGkpLHRoaXMubWF4LnNldChyLG4sbyksdGhpc31zZXRGcm9tUG9pbnRzKHQpe3RoaXMubWFrZUVtcHR5KCk7Zm9yKGxldCBlPTAscz10Lmxlbmd0aDtlPHM7ZSsrKXRoaXMuZXhwYW5kQnlQb2ludCh0W2VdKTtyZXR1cm4gdGhpc31zZXRGcm9tQ2VudGVyQW5kU2l6ZSh0LGUpe2NvbnN0IHM9Vi5jb3B5KGUpLm11bHRpcGx5U2NhbGFyKC41KTtyZXR1cm4gdGhpcy5taW4uY29weSh0KS5zdWIocyksdGhpcy5tYXguY29weSh0KS5hZGQocyksdGhpc31zZXRGcm9tT2JqZWN0KHQpe2xldCBlPWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdJiZhcmd1bWVudHNbMV07cmV0dXJuIHRoaXMubWFrZUVtcHR5KCksdGhpcy5leHBhbmRCeU9iamVjdCh0LGUpfWNsb25lKCl7cmV0dXJuKG5ldyB0aGlzLmNvbnN0cnVjdG9yKS5jb3B5KHRoaXMpfWNvcHkodCl7cmV0dXJuIHRoaXMubWluLmNvcHkodC5taW4pLHRoaXMubWF4LmNvcHkodC5tYXgpLHRoaXN9bWFrZUVtcHR5KCl7cmV0dXJuIHRoaXMubWluLng9dGhpcy5taW4ueT10aGlzLm1pbi56PTEvMCx0aGlzLm1heC54PXRoaXMubWF4Lnk9dGhpcy5tYXguej0tMS8wLHRoaXN9aXNFbXB0eSgpe3JldHVybiB0aGlzLm1heC54PHRoaXMubWluLnh8fHRoaXMubWF4Lnk8dGhpcy5taW4ueXx8dGhpcy5tYXguejx0aGlzLm1pbi56fWdldENlbnRlcih0KXtyZXR1cm4gdGhpcy5pc0VtcHR5KCk/dC5zZXQoMCwwLDApOnQuYWRkVmVjdG9ycyh0aGlzLm1pbix0aGlzLm1heCkubXVsdGlwbHlTY2FsYXIoLjUpfWdldFNpemUodCl7cmV0dXJuIHRoaXMuaXNFbXB0eSgpP3Quc2V0KDAsMCwwKTp0LnN1YlZlY3RvcnModGhpcy5tYXgsdGhpcy5taW4pfWV4cGFuZEJ5UG9pbnQodCl7cmV0dXJuIHRoaXMubWluLm1pbih0KSx0aGlzLm1heC5tYXgodCksdGhpc31leHBhbmRCeVZlY3Rvcih0KXtyZXR1cm4gdGhpcy5taW4uc3ViKHQpLHRoaXMubWF4LmFkZCh0KSx0aGlzfWV4cGFuZEJ5U2NhbGFyKHQpe3JldHVybiB0aGlzLm1pbi5hZGRTY2FsYXIoLXQpLHRoaXMubWF4LmFkZFNjYWxhcih0KSx0aGlzfWV4cGFuZEJ5T2JqZWN0KHQpe2xldCBlPWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdJiZhcmd1bWVudHNbMV07dC51cGRhdGVXb3JsZE1hdHJpeCghMSwhMSk7Y29uc3Qgcz10Lmdlb21ldHJ5O2lmKHZvaWQgMCE9PXMpaWYoZSYmbnVsbCE9cy5hdHRyaWJ1dGVzJiZ2b2lkIDAhPT1zLmF0dHJpYnV0ZXMucG9zaXRpb24pe2NvbnN0IGU9cy5hdHRyaWJ1dGVzLnBvc2l0aW9uO2ZvcihsZXQgcz0wLGk9ZS5jb3VudDtzPGk7cysrKVYuZnJvbUJ1ZmZlckF0dHJpYnV0ZShlLHMpLmFwcGx5TWF0cml4NCh0Lm1hdHJpeFdvcmxkKSx0aGlzLmV4cGFuZEJ5UG9pbnQoVil9ZWxzZSBudWxsPT09cy5ib3VuZGluZ0JveCYmcy5jb21wdXRlQm91bmRpbmdCb3goKSxSLmNvcHkocy5ib3VuZGluZ0JveCksUi5hcHBseU1hdHJpeDQodC5tYXRyaXhXb3JsZCksdGhpcy51bmlvbihSKTtjb25zdCBpPXQuY2hpbGRyZW47Zm9yKGxldCB0PTAscz1pLmxlbmd0aDt0PHM7dCsrKXRoaXMuZXhwYW5kQnlPYmplY3QoaVt0XSxlKTtyZXR1cm4gdGhpc31jb250YWluc1BvaW50KHQpe3JldHVybiEodC54PHRoaXMubWluLnh8fHQueD50aGlzLm1heC54fHx0Lnk8dGhpcy5taW4ueXx8dC55PnRoaXMubWF4Lnl8fHQuejx0aGlzLm1pbi56fHx0Lno+dGhpcy5tYXgueil9Y29udGFpbnNCb3godCl7cmV0dXJuIHRoaXMubWluLng8PXQubWluLngmJnQubWF4Lng8PXRoaXMubWF4LngmJnRoaXMubWluLnk8PXQubWluLnkmJnQubWF4Lnk8PXRoaXMubWF4LnkmJnRoaXMubWluLno8PXQubWluLnomJnQubWF4Lno8PXRoaXMubWF4Lnp9Z2V0UGFyYW1ldGVyKHQsZSl7cmV0dXJuIGUuc2V0KCh0LngtdGhpcy5taW4ueCkvKHRoaXMubWF4LngtdGhpcy5taW4ueCksKHQueS10aGlzLm1pbi55KS8odGhpcy5tYXgueS10aGlzLm1pbi55KSwodC56LXRoaXMubWluLnopLyh0aGlzLm1heC56LXRoaXMubWluLnopKX1pbnRlcnNlY3RzQm94KHQpe3JldHVybiEodC5tYXgueDx0aGlzLm1pbi54fHx0Lm1pbi54PnRoaXMubWF4Lnh8fHQubWF4Lnk8dGhpcy5taW4ueXx8dC5taW4ueT50aGlzLm1heC55fHx0Lm1heC56PHRoaXMubWluLnp8fHQubWluLno+dGhpcy5tYXgueil9aW50ZXJzZWN0c1NwaGVyZSh0KXtyZXR1cm4gdGhpcy5jbGFtcFBvaW50KHQuY2VudGVyLFYpLFYuZGlzdGFuY2VUb1NxdWFyZWQodC5jZW50ZXIpPD10LnJhZGl1cyp0LnJhZGl1c31pbnRlcnNlY3RzUGxhbmUodCl7bGV0IGUscztyZXR1cm4gdC5ub3JtYWwueD4wPyhlPXQubm9ybWFsLngqdGhpcy5taW4ueCxzPXQubm9ybWFsLngqdGhpcy5tYXgueCk6KGU9dC5ub3JtYWwueCp0aGlzLm1heC54LHM9dC5ub3JtYWwueCp0aGlzLm1pbi54KSx0Lm5vcm1hbC55PjA/KGUrPXQubm9ybWFsLnkqdGhpcy5taW4ueSxzKz10Lm5vcm1hbC55KnRoaXMubWF4LnkpOihlKz10Lm5vcm1hbC55KnRoaXMubWF4Lnkscys9dC5ub3JtYWwueSp0aGlzLm1pbi55KSx0Lm5vcm1hbC56PjA/KGUrPXQubm9ybWFsLnoqdGhpcy5taW4ueixzKz10Lm5vcm1hbC56KnRoaXMubWF4LnopOihlKz10Lm5vcm1hbC56KnRoaXMubWF4Lnoscys9dC5ub3JtYWwueip0aGlzLm1pbi56KSxlPD0tdC5jb25zdGFudCYmcz49LXQuY29uc3RhbnR9aW50ZXJzZWN0c1RyaWFuZ2xlKHQpe2lmKHRoaXMuaXNFbXB0eSgpKXJldHVybiExO3RoaXMuZ2V0Q2VudGVyKEwpLFcuc3ViVmVjdG9ycyh0aGlzLm1heCxMKSxxLnN1YlZlY3RvcnModC5hLEwpLFUuc3ViVmVjdG9ycyh0LmIsTCksTy5zdWJWZWN0b3JzKHQuYyxMKSxILnN1YlZlY3RvcnMoVSxxKSxJLnN1YlZlY3RvcnMoTyxVKSxOLnN1YlZlY3RvcnMocSxPKTtsZXQgZT1bMCwtSC56LEgueSwwLC1JLnosSS55LDAsLU4ueixOLnksSC56LDAsLUgueCxJLnosMCwtSS54LE4ueiwwLC1OLngsLUgueSxILngsMCwtSS55LEkueCwwLC1OLnksTi54LDBdO3JldHVybiEhWShlLHEsVSxPLFcpJiYoZT1bMSwwLDAsMCwxLDAsMCwwLDFdLCEhWShlLHEsVSxPLFcpJiYoWC5jcm9zc1ZlY3RvcnMoSCxJKSxlPVtYLngsWC55LFguel0sWShlLHEsVSxPLFcpKSl9Y2xhbXBQb2ludCh0LGUpe3JldHVybiBlLmNvcHkodCkuY2xhbXAodGhpcy5taW4sdGhpcy5tYXgpfWRpc3RhbmNlVG9Qb2ludCh0KXtyZXR1cm4gVi5jb3B5KHQpLmNsYW1wKHRoaXMubWluLHRoaXMubWF4KS5zdWIodCkubGVuZ3RoKCl9Z2V0Qm91bmRpbmdTcGhlcmUodCl7cmV0dXJuIHRoaXMuZ2V0Q2VudGVyKHQuY2VudGVyKSx0LnJhZGl1cz0uNSp0aGlzLmdldFNpemUoVikubGVuZ3RoKCksdH1pbnRlcnNlY3QodCl7cmV0dXJuIHRoaXMubWluLm1heCh0Lm1pbiksdGhpcy5tYXgubWluKHQubWF4KSx0aGlzLmlzRW1wdHkoKSYmdGhpcy5tYWtlRW1wdHkoKSx0aGlzfXVuaW9uKHQpe3JldHVybiB0aGlzLm1pbi5taW4odC5taW4pLHRoaXMubWF4Lm1heCh0Lm1heCksdGhpc31hcHBseU1hdHJpeDQodCl7cmV0dXJuIHRoaXMuaXNFbXB0eSgpfHwoRlswXS5zZXQodGhpcy5taW4ueCx0aGlzLm1pbi55LHRoaXMubWluLnopLmFwcGx5TWF0cml4NCh0KSxGWzFdLnNldCh0aGlzLm1pbi54LHRoaXMubWluLnksdGhpcy5tYXgueikuYXBwbHlNYXRyaXg0KHQpLEZbMl0uc2V0KHRoaXMubWluLngsdGhpcy5tYXgueSx0aGlzLm1pbi56KS5hcHBseU1hdHJpeDQodCksRlszXS5zZXQodGhpcy5taW4ueCx0aGlzLm1heC55LHRoaXMubWF4LnopLmFwcGx5TWF0cml4NCh0KSxGWzRdLnNldCh0aGlzLm1heC54LHRoaXMubWluLnksdGhpcy5taW4ueikuYXBwbHlNYXRyaXg0KHQpLEZbNV0uc2V0KHRoaXMubWF4LngsdGhpcy5taW4ueSx0aGlzLm1heC56KS5hcHBseU1hdHJpeDQodCksRls2XS5zZXQodGhpcy5tYXgueCx0aGlzLm1heC55LHRoaXMubWluLnopLmFwcGx5TWF0cml4NCh0KSxGWzddLnNldCh0aGlzLm1heC54LHRoaXMubWF4LnksdGhpcy5tYXgueikuYXBwbHlNYXRyaXg0KHQpLHRoaXMuc2V0RnJvbVBvaW50cyhGKSksdGhpc310cmFuc2xhdGUodCl7cmV0dXJuIHRoaXMubWluLmFkZCh0KSx0aGlzLm1heC5hZGQodCksdGhpc31lcXVhbHModCl7cmV0dXJuIHQubWluLmVxdWFscyh0aGlzLm1pbikmJnQubWF4LmVxdWFscyh0aGlzLm1heCl9fWNvbnN0IEY9W25ldyBFLG5ldyBFLG5ldyBFLG5ldyBFLG5ldyBFLG5ldyBFLG5ldyBFLG5ldyBFXSxWPW5ldyBFLFI9bmV3IEMscT1uZXcgRSxVPW5ldyBFLE89bmV3IEUsSD1uZXcgRSxJPW5ldyBFLE49bmV3IEUsTD1uZXcgRSxXPW5ldyBFLFg9bmV3IEUsRD1uZXcgRTtmdW5jdGlvbiBZKHQsZSxzLGkscil7Zm9yKGxldCBuPTAsbz10Lmxlbmd0aC0zO248PW87bis9Myl7RC5mcm9tQXJyYXkodCxuKTtjb25zdCBvPXIueCpNYXRoLmFicyhELngpK3IueSpNYXRoLmFicyhELnkpK3IueipNYXRoLmFicyhELnopLGE9ZS5kb3QoRCksaD1zLmRvdChEKSxsPWkuZG90KEQpO2lmKE1hdGgubWF4KC1NYXRoLm1heChhLGgsbCksTWF0aC5taW4oYSxoLGwpKT5vKXJldHVybiExfXJldHVybiEwfWNvbnN0IFo9bmV3IEMsRz1uZXcgRSxqPW5ldyBFLFE9bmV3IEU7Y2xhc3MgSntjb25zdHJ1Y3Rvcigpe2xldCB0PWFyZ3VtZW50cy5sZW5ndGg+MCYmdm9pZCAwIT09YXJndW1lbnRzWzBdP2FyZ3VtZW50c1swXTpuZXcgRSxlPWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTotMTt0aGlzLmNlbnRlcj10LHRoaXMucmFkaXVzPWV9c2V0KHQsZSl7cmV0dXJuIHRoaXMuY2VudGVyLmNvcHkodCksdGhpcy5yYWRpdXM9ZSx0aGlzfXNldEZyb21Qb2ludHModCxlKXtjb25zdCBzPXRoaXMuY2VudGVyO3ZvaWQgMCE9PWU/cy5jb3B5KGUpOlouc2V0RnJvbVBvaW50cyh0KS5nZXRDZW50ZXIocyk7bGV0IGk9MDtmb3IobGV0IGU9MCxyPXQubGVuZ3RoO2U8cjtlKyspaT1NYXRoLm1heChpLHMuZGlzdGFuY2VUb1NxdWFyZWQodFtlXSkpO3JldHVybiB0aGlzLnJhZGl1cz1NYXRoLnNxcnQoaSksdGhpc31jb3B5KHQpe3JldHVybiB0aGlzLmNlbnRlci5jb3B5KHQuY2VudGVyKSx0aGlzLnJhZGl1cz10LnJhZGl1cyx0aGlzfWlzRW1wdHkoKXtyZXR1cm4gdGhpcy5yYWRpdXM8MH1tYWtlRW1wdHkoKXtyZXR1cm4gdGhpcy5jZW50ZXIuc2V0KDAsMCwwKSx0aGlzLnJhZGl1cz0tMSx0aGlzfWNvbnRhaW5zUG9pbnQodCl7cmV0dXJuIHQuZGlzdGFuY2VUb1NxdWFyZWQodGhpcy5jZW50ZXIpPD10aGlzLnJhZGl1cyp0aGlzLnJhZGl1c31kaXN0YW5jZVRvUG9pbnQodCl7cmV0dXJuIHQuZGlzdGFuY2VUbyh0aGlzLmNlbnRlciktdGhpcy5yYWRpdXN9aW50ZXJzZWN0c1NwaGVyZSh0KXtjb25zdCBlPXRoaXMucmFkaXVzK3QucmFkaXVzO3JldHVybiB0LmNlbnRlci5kaXN0YW5jZVRvU3F1YXJlZCh0aGlzLmNlbnRlcik8PWUqZX1pbnRlcnNlY3RzQm94KHQpe3JldHVybiB0LmludGVyc2VjdHNTcGhlcmUodGhpcyl9aW50ZXJzZWN0c1BsYW5lKHQpe3JldHVybiBNYXRoLmFicyh0LmRpc3RhbmNlVG9Qb2ludCh0aGlzLmNlbnRlcikpPD10aGlzLnJhZGl1c31jbGFtcFBvaW50KHQsZSl7Y29uc3Qgcz10aGlzLmNlbnRlci5kaXN0YW5jZVRvU3F1YXJlZCh0KTtyZXR1cm4gZS5jb3B5KHQpLHM+dGhpcy5yYWRpdXMqdGhpcy5yYWRpdXMmJihlLnN1Yih0aGlzLmNlbnRlcikubm9ybWFsaXplKCksZS5tdWx0aXBseVNjYWxhcih0aGlzLnJhZGl1cykuYWRkKHRoaXMuY2VudGVyKSksZX1nZXRCb3VuZGluZ0JveCh0KXtyZXR1cm4gdGhpcy5pc0VtcHR5KCk/KHQubWFrZUVtcHR5KCksdCk6KHQuc2V0KHRoaXMuY2VudGVyLHRoaXMuY2VudGVyKSx0LmV4cGFuZEJ5U2NhbGFyKHRoaXMucmFkaXVzKSx0KX1hcHBseU1hdHJpeDQodCl7cmV0dXJuIHRoaXMuY2VudGVyLmFwcGx5TWF0cml4NCh0KSx0aGlzLnJhZGl1cz10aGlzLnJhZGl1cyp0LmdldE1heFNjYWxlT25BeGlzKCksdGhpc310cmFuc2xhdGUodCl7cmV0dXJuIHRoaXMuY2VudGVyLmFkZCh0KSx0aGlzfWV4cGFuZEJ5UG9pbnQodCl7US5zdWJWZWN0b3JzKHQsdGhpcy5jZW50ZXIpO2NvbnN0IGU9US5sZW5ndGhTcSgpO2lmKGU+dGhpcy5yYWRpdXMqdGhpcy5yYWRpdXMpe2NvbnN0IHQ9TWF0aC5zcXJ0KGUpLHM9LjUqKHQtdGhpcy5yYWRpdXMpO3RoaXMuY2VudGVyLmFkZChRLm11bHRpcGx5U2NhbGFyKHMvdCkpLHRoaXMucmFkaXVzKz1zfXJldHVybiB0aGlzfXVuaW9uKHQpe3JldHVybiEwPT09dGhpcy5jZW50ZXIuZXF1YWxzKHQuY2VudGVyKT9qLnNldCgwLDAsMSkubXVsdGlwbHlTY2FsYXIodC5yYWRpdXMpOmouc3ViVmVjdG9ycyh0LmNlbnRlcix0aGlzLmNlbnRlcikubm9ybWFsaXplKCkubXVsdGlwbHlTY2FsYXIodC5yYWRpdXMpLHRoaXMuZXhwYW5kQnlQb2ludChHLmNvcHkodC5jZW50ZXIpLmFkZChqKSksdGhpcy5leHBhbmRCeVBvaW50KEcuY29weSh0LmNlbnRlcikuc3ViKGopKSx0aGlzfWVxdWFscyh0KXtyZXR1cm4gdC5jZW50ZXIuZXF1YWxzKHRoaXMuY2VudGVyKSYmdC5yYWRpdXM9PT10aGlzLnJhZGl1c31jbG9uZSgpe3JldHVybihuZXcgdGhpcy5jb25zdHJ1Y3RvcikuY29weSh0aGlzKX19Y2xhc3MgJHtjb25zdHJ1Y3RvcigpeyQucHJvdG90eXBlLmlzTWF0cml4ND0hMCx0aGlzLmVsZW1lbnRzPVsxLDAsMCwwLDAsMSwwLDAsMCwwLDEsMCwwLDAsMCwxXSxhcmd1bWVudHMubGVuZ3RoPjAmJmNvbnNvbGUuZXJyb3IoIlRIUkVFLk1hdHJpeDQ6IHRoZSBjb25zdHJ1Y3RvciBubyBsb25nZXIgcmVhZHMgYXJndW1lbnRzLiB1c2UgLnNldCgpIGluc3RlYWQuIil9c2V0KHQsZSxzLGkscixuLG8sYSxoLGwsYyx1LGQsbSx5LHApe2NvbnN0IHg9dGhpcy5lbGVtZW50cztyZXR1cm4geFswXT10LHhbNF09ZSx4WzhdPXMseFsxMl09aSx4WzFdPXIseFs1XT1uLHhbOV09byx4WzEzXT1hLHhbMl09aCx4WzZdPWwseFsxMF09Yyx4WzE0XT11LHhbM109ZCx4WzddPW0seFsxMV09eSx4WzE1XT1wLHRoaXN9aWRlbnRpdHkoKXtyZXR1cm4gdGhpcy5zZXQoMSwwLDAsMCwwLDEsMCwwLDAsMCwxLDAsMCwwLDAsMSksdGhpc31jbG9uZSgpe3JldHVybihuZXcgJCkuZnJvbUFycmF5KHRoaXMuZWxlbWVudHMpfWNvcHkodCl7Y29uc3QgZT10aGlzLmVsZW1lbnRzLHM9dC5lbGVtZW50cztyZXR1cm4gZVswXT1zWzBdLGVbMV09c1sxXSxlWzJdPXNbMl0sZVszXT1zWzNdLGVbNF09c1s0XSxlWzVdPXNbNV0sZVs2XT1zWzZdLGVbN109c1s3XSxlWzhdPXNbOF0sZVs5XT1zWzldLGVbMTBdPXNbMTBdLGVbMTFdPXNbMTFdLGVbMTJdPXNbMTJdLGVbMTNdPXNbMTNdLGVbMTRdPXNbMTRdLGVbMTVdPXNbMTVdLHRoaXN9Y29weVBvc2l0aW9uKHQpe2NvbnN0IGU9dGhpcy5lbGVtZW50cyxzPXQuZWxlbWVudHM7cmV0dXJuIGVbMTJdPXNbMTJdLGVbMTNdPXNbMTNdLGVbMTRdPXNbMTRdLHRoaXN9c2V0RnJvbU1hdHJpeDModCl7Y29uc3QgZT10LmVsZW1lbnRzO3JldHVybiB0aGlzLnNldChlWzBdLGVbM10sZVs2XSwwLGVbMV0sZVs0XSxlWzddLDAsZVsyXSxlWzVdLGVbOF0sMCwwLDAsMCwxKSx0aGlzfWV4dHJhY3RCYXNpcyh0LGUscyl7cmV0dXJuIHQuc2V0RnJvbU1hdHJpeENvbHVtbih0aGlzLDApLGUuc2V0RnJvbU1hdHJpeENvbHVtbih0aGlzLDEpLHMuc2V0RnJvbU1hdHJpeENvbHVtbih0aGlzLDIpLHRoaXN9bWFrZUJhc2lzKHQsZSxzKXtyZXR1cm4gdGhpcy5zZXQodC54LGUueCxzLngsMCx0LnksZS55LHMueSwwLHQueixlLnoscy56LDAsMCwwLDAsMSksdGhpc31leHRyYWN0Um90YXRpb24odCl7Y29uc3QgZT10aGlzLmVsZW1lbnRzLHM9dC5lbGVtZW50cyxpPTEvSy5zZXRGcm9tTWF0cml4Q29sdW1uKHQsMCkubGVuZ3RoKCkscj0xL0suc2V0RnJvbU1hdHJpeENvbHVtbih0LDEpLmxlbmd0aCgpLG49MS9LLnNldEZyb21NYXRyaXhDb2x1bW4odCwyKS5sZW5ndGgoKTtyZXR1cm4gZVswXT1zWzBdKmksZVsxXT1zWzFdKmksZVsyXT1zWzJdKmksZVszXT0wLGVbNF09c1s0XSpyLGVbNV09c1s1XSpyLGVbNl09c1s2XSpyLGVbN109MCxlWzhdPXNbOF0qbixlWzldPXNbOV0qbixlWzEwXT1zWzEwXSpuLGVbMTFdPTAsZVsxMl09MCxlWzEzXT0wLGVbMTRdPTAsZVsxNV09MSx0aGlzfW1ha2VSb3RhdGlvbkZyb21FdWxlcih0KXt0JiZ0LmlzRXVsZXJ8fGNvbnNvbGUuZXJyb3IoIlRIUkVFLk1hdHJpeDQ6IC5tYWtlUm90YXRpb25Gcm9tRXVsZXIoKSBub3cgZXhwZWN0cyBhIEV1bGVyIHJvdGF0aW9uIHJhdGhlciB0aGFuIGEgVmVjdG9yMyBhbmQgb3JkZXIuIik7Y29uc3QgZT10aGlzLmVsZW1lbnRzLHM9dC54LGk9dC55LHI9dC56LG49TWF0aC5jb3Mocyksbz1NYXRoLnNpbihzKSxhPU1hdGguY29zKGkpLGg9TWF0aC5zaW4oaSksbD1NYXRoLmNvcyhyKSxjPU1hdGguc2luKHIpO2lmKCJYWVoiPT09dC5vcmRlcil7Y29uc3QgdD1uKmwscz1uKmMsaT1vKmwscj1vKmM7ZVswXT1hKmwsZVs0XT0tYSpjLGVbOF09aCxlWzFdPXMraSpoLGVbNV09dC1yKmgsZVs5XT0tbyphLGVbMl09ci10KmgsZVs2XT1pK3MqaCxlWzEwXT1uKmF9ZWxzZSBpZigiWVhaIj09PXQub3JkZXIpe2NvbnN0IHQ9YSpsLHM9YSpjLGk9aCpsLHI9aCpjO2VbMF09dCtyKm8sZVs0XT1pKm8tcyxlWzhdPW4qaCxlWzFdPW4qYyxlWzVdPW4qbCxlWzldPS1vLGVbMl09cypvLWksZVs2XT1yK3QqbyxlWzEwXT1uKmF9ZWxzZSBpZigiWlhZIj09PXQub3JkZXIpe2NvbnN0IHQ9YSpsLHM9YSpjLGk9aCpsLHI9aCpjO2VbMF09dC1yKm8sZVs0XT0tbipjLGVbOF09aStzKm8sZVsxXT1zK2kqbyxlWzVdPW4qbCxlWzldPXItdCpvLGVbMl09LW4qaCxlWzZdPW8sZVsxMF09biphfWVsc2UgaWYoIlpZWCI9PT10Lm9yZGVyKXtjb25zdCB0PW4qbCxzPW4qYyxpPW8qbCxyPW8qYztlWzBdPWEqbCxlWzRdPWkqaC1zLGVbOF09dCpoK3IsZVsxXT1hKmMsZVs1XT1yKmgrdCxlWzldPXMqaC1pLGVbMl09LWgsZVs2XT1vKmEsZVsxMF09biphfWVsc2UgaWYoIllaWCI9PT10Lm9yZGVyKXtjb25zdCB0PW4qYSxzPW4qaCxpPW8qYSxyPW8qaDtlWzBdPWEqbCxlWzRdPXItdCpjLGVbOF09aSpjK3MsZVsxXT1jLGVbNV09bipsLGVbOV09LW8qbCxlWzJdPS1oKmwsZVs2XT1zKmMraSxlWzEwXT10LXIqY31lbHNlIGlmKCJYWlkiPT09dC5vcmRlcil7Y29uc3QgdD1uKmEscz1uKmgsaT1vKmEscj1vKmg7ZVswXT1hKmwsZVs0XT0tYyxlWzhdPWgqbCxlWzFdPXQqYytyLGVbNV09bipsLGVbOV09cypjLWksZVsyXT1pKmMtcyxlWzZdPW8qbCxlWzEwXT1yKmMrdH1yZXR1cm4gZVszXT0wLGVbN109MCxlWzExXT0wLGVbMTJdPTAsZVsxM109MCxlWzE0XT0wLGVbMTVdPTEsdGhpc31tYWtlUm90YXRpb25Gcm9tUXVhdGVybmlvbih0KXtyZXR1cm4gdGhpcy5jb21wb3NlKGV0LHQsc3QpfWxvb2tBdCh0LGUscyl7Y29uc3QgaT10aGlzLmVsZW1lbnRzO3JldHVybiBudC5zdWJWZWN0b3JzKHQsZSksMD09PW50Lmxlbmd0aFNxKCkmJihudC56PTEpLG50Lm5vcm1hbGl6ZSgpLGl0LmNyb3NzVmVjdG9ycyhzLG50KSwwPT09aXQubGVuZ3RoU3EoKSYmKDE9PT1NYXRoLmFicyhzLnopP250LngrPTFlLTQ6bnQueis9MWUtNCxudC5ub3JtYWxpemUoKSxpdC5jcm9zc1ZlY3RvcnMocyxudCkpLGl0Lm5vcm1hbGl6ZSgpLHJ0LmNyb3NzVmVjdG9ycyhudCxpdCksaVswXT1pdC54LGlbNF09cnQueCxpWzhdPW50LngsaVsxXT1pdC55LGlbNV09cnQueSxpWzldPW50LnksaVsyXT1pdC56LGlbNl09cnQueixpWzEwXT1udC56LHRoaXN9bXVsdGlwbHkodCxlKXtyZXR1cm4gdm9pZCAwIT09ZT8oY29uc29sZS53YXJuKCJUSFJFRS5NYXRyaXg0OiAubXVsdGlwbHkoKSBub3cgb25seSBhY2NlcHRzIG9uZSBhcmd1bWVudC4gVXNlIC5tdWx0aXBseU1hdHJpY2VzKCBhLCBiICkgaW5zdGVhZC4iKSx0aGlzLm11bHRpcGx5TWF0cmljZXModCxlKSk6dGhpcy5tdWx0aXBseU1hdHJpY2VzKHRoaXMsdCl9cHJlbXVsdGlwbHkodCl7cmV0dXJuIHRoaXMubXVsdGlwbHlNYXRyaWNlcyh0LHRoaXMpfW11bHRpcGx5TWF0cmljZXModCxlKXtjb25zdCBzPXQuZWxlbWVudHMsaT1lLmVsZW1lbnRzLHI9dGhpcy5lbGVtZW50cyxuPXNbMF0sbz1zWzRdLGE9c1s4XSxoPXNbMTJdLGw9c1sxXSxjPXNbNV0sdT1zWzldLGQ9c1sxM10sbT1zWzJdLHk9c1s2XSxwPXNbMTBdLHg9c1sxNF0sZj1zWzNdLGc9c1s3XSxiPXNbMTFdLHc9c1sxNV0sTT1pWzBdLHo9aVs0XSx2PWlbOF0sXz1pWzEyXSxBPWlbMV0sUz1pWzVdLEI9aVs5XSxUPWlbMTNdLEU9aVsyXSxrPWlbNl0sUD1pWzEwXSxDPWlbMTRdLEY9aVszXSxWPWlbN10sUj1pWzExXSxxPWlbMTVdO3JldHVybiByWzBdPW4qTStvKkErYSpFK2gqRixyWzRdPW4qeitvKlMrYSprK2gqVixyWzhdPW4qditvKkIrYSpQK2gqUixyWzEyXT1uKl8rbypUK2EqQytoKnEsclsxXT1sKk0rYypBK3UqRStkKkYscls1XT1sKnorYypTK3UqaytkKlYscls5XT1sKnYrYypCK3UqUCtkKlIsclsxM109bCpfK2MqVCt1KkMrZCpxLHJbMl09bSpNK3kqQStwKkUreCpGLHJbNl09bSp6K3kqUytwKmsreCpWLHJbMTBdPW0qdit5KkIrcCpQK3gqUixyWzE0XT1tKl8reSpUK3AqQyt4KnEsclszXT1mKk0rZypBK2IqRSt3KkYscls3XT1mKnorZypTK2Iqayt3KlYsclsxMV09Zip2K2cqQitiKlArdypSLHJbMTVdPWYqXytnKlQrYipDK3cqcSx0aGlzfW11bHRpcGx5U2NhbGFyKHQpe2NvbnN0IGU9dGhpcy5lbGVtZW50cztyZXR1cm4gZVswXSo9dCxlWzRdKj10LGVbOF0qPXQsZVsxMl0qPXQsZVsxXSo9dCxlWzVdKj10LGVbOV0qPXQsZVsxM10qPXQsZVsyXSo9dCxlWzZdKj10LGVbMTBdKj10LGVbMTRdKj10LGVbM10qPXQsZVs3XSo9dCxlWzExXSo9dCxlWzE1XSo9dCx0aGlzfWRldGVybWluYW50KCl7Y29uc3QgdD10aGlzLmVsZW1lbnRzLGU9dFswXSxzPXRbNF0saT10WzhdLHI9dFsxMl0sbj10WzFdLG89dFs1XSxhPXRbOV0saD10WzEzXSxsPXRbMl0sYz10WzZdLHU9dFsxMF0sZD10WzE0XTtyZXR1cm4gdFszXSooK3IqYSpjLWkqaCpjLXIqbyp1K3MqaCp1K2kqbypkLXMqYSpkKSt0WzddKigrZSphKmQtZSpoKnUrcipuKnUtaSpuKmQraSpoKmwtciphKmwpK3RbMTFdKigrZSpoKmMtZSpvKmQtcipuKmMrcypuKmQrcipvKmwtcypoKmwpK3RbMTVdKigtaSpvKmwtZSphKmMrZSpvKnUraSpuKmMtcypuKnUrcyphKmwpfXRyYW5zcG9zZSgpe2NvbnN0IHQ9dGhpcy5lbGVtZW50cztsZXQgZTtyZXR1cm4gZT10WzFdLHRbMV09dFs0XSx0WzRdPWUsZT10WzJdLHRbMl09dFs4XSx0WzhdPWUsZT10WzZdLHRbNl09dFs5XSx0WzldPWUsZT10WzNdLHRbM109dFsxMl0sdFsxMl09ZSxlPXRbN10sdFs3XT10WzEzXSx0WzEzXT1lLGU9dFsxMV0sdFsxMV09dFsxNF0sdFsxNF09ZSx0aGlzfXNldFBvc2l0aW9uKHQsZSxzKXtjb25zdCBpPXRoaXMuZWxlbWVudHM7cmV0dXJuIHQuaXNWZWN0b3IzPyhpWzEyXT10LngsaVsxM109dC55LGlbMTRdPXQueik6KGlbMTJdPXQsaVsxM109ZSxpWzE0XT1zKSx0aGlzfWludmVydCgpe2NvbnN0IHQ9dGhpcy5lbGVtZW50cyxlPXRbMF0scz10WzFdLGk9dFsyXSxyPXRbM10sbj10WzRdLG89dFs1XSxhPXRbNl0saD10WzddLGw9dFs4XSxjPXRbOV0sdT10WzEwXSxkPXRbMTFdLG09dFsxMl0seT10WzEzXSxwPXRbMTRdLHg9dFsxNV0sZj1jKnAqaC15KnUqaCt5KmEqZC1vKnAqZC1jKmEqeCtvKnUqeCxnPW0qdSpoLWwqcCpoLW0qYSpkK24qcCpkK2wqYSp4LW4qdSp4LGI9bCp5KmgtbSpjKmgrbSpvKmQtbip5KmQtbCpvKngrbipjKngsdz1tKmMqYS1sKnkqYS1tKm8qdStuKnkqdStsKm8qcC1uKmMqcCxNPWUqZitzKmcraSpiK3IqdztpZigwPT09TSlyZXR1cm4gdGhpcy5zZXQoMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCk7Y29uc3Qgej0xL007cmV0dXJuIHRbMF09Zip6LHRbMV09KHkqdSpyLWMqcCpyLXkqaSpkK3MqcCpkK2MqaSp4LXMqdSp4KSp6LHRbMl09KG8qcCpyLXkqYSpyK3kqaSpoLXMqcCpoLW8qaSp4K3MqYSp4KSp6LHRbM109KGMqYSpyLW8qdSpyLWMqaSpoK3MqdSpoK28qaSpkLXMqYSpkKSp6LHRbNF09Zyp6LHRbNV09KGwqcCpyLW0qdSpyK20qaSpkLWUqcCpkLWwqaSp4K2UqdSp4KSp6LHRbNl09KG0qYSpyLW4qcCpyLW0qaSpoK2UqcCpoK24qaSp4LWUqYSp4KSp6LHRbN109KG4qdSpyLWwqYSpyK2wqaSpoLWUqdSpoLW4qaSpkK2UqYSpkKSp6LHRbOF09Yip6LHRbOV09KG0qYypyLWwqeSpyLW0qcypkK2UqeSpkK2wqcyp4LWUqYyp4KSp6LHRbMTBdPShuKnkqci1tKm8qcittKnMqaC1lKnkqaC1uKnMqeCtlKm8qeCkqeix0WzExXT0obCpvKnItbipjKnItbCpzKmgrZSpjKmgrbipzKmQtZSpvKmQpKnosdFsxMl09dyp6LHRbMTNdPShsKnkqaS1tKmMqaSttKnMqdS1lKnkqdS1sKnMqcCtlKmMqcCkqeix0WzE0XT0obSpvKmktbip5KmktbSpzKmErZSp5KmErbipzKnAtZSpvKnApKnosdFsxNV09KG4qYyppLWwqbyppK2wqcyphLWUqYyphLW4qcyp1K2Uqbyp1KSp6LHRoaXN9c2NhbGUodCl7Y29uc3QgZT10aGlzLmVsZW1lbnRzLHM9dC54LGk9dC55LHI9dC56O3JldHVybiBlWzBdKj1zLGVbNF0qPWksZVs4XSo9cixlWzFdKj1zLGVbNV0qPWksZVs5XSo9cixlWzJdKj1zLGVbNl0qPWksZVsxMF0qPXIsZVszXSo9cyxlWzddKj1pLGVbMTFdKj1yLHRoaXN9Z2V0TWF4U2NhbGVPbkF4aXMoKXtjb25zdCB0PXRoaXMuZWxlbWVudHMsZT10WzBdKnRbMF0rdFsxXSp0WzFdK3RbMl0qdFsyXSxzPXRbNF0qdFs0XSt0WzVdKnRbNV0rdFs2XSp0WzZdLGk9dFs4XSp0WzhdK3RbOV0qdFs5XSt0WzEwXSp0WzEwXTtyZXR1cm4gTWF0aC5zcXJ0KE1hdGgubWF4KGUscyxpKSl9bWFrZVRyYW5zbGF0aW9uKHQsZSxzKXtyZXR1cm4gdGhpcy5zZXQoMSwwLDAsdCwwLDEsMCxlLDAsMCwxLHMsMCwwLDAsMSksdGhpc31tYWtlUm90YXRpb25YKHQpe2NvbnN0IGU9TWF0aC5jb3ModCkscz1NYXRoLnNpbih0KTtyZXR1cm4gdGhpcy5zZXQoMSwwLDAsMCwwLGUsLXMsMCwwLHMsZSwwLDAsMCwwLDEpLHRoaXN9bWFrZVJvdGF0aW9uWSh0KXtjb25zdCBlPU1hdGguY29zKHQpLHM9TWF0aC5zaW4odCk7cmV0dXJuIHRoaXMuc2V0KGUsMCxzLDAsMCwxLDAsMCwtcywwLGUsMCwwLDAsMCwxKSx0aGlzfW1ha2VSb3RhdGlvbloodCl7Y29uc3QgZT1NYXRoLmNvcyh0KSxzPU1hdGguc2luKHQpO3JldHVybiB0aGlzLnNldChlLC1zLDAsMCxzLGUsMCwwLDAsMCwxLDAsMCwwLDAsMSksdGhpc31tYWtlUm90YXRpb25BeGlzKHQsZSl7Y29uc3Qgcz1NYXRoLmNvcyhlKSxpPU1hdGguc2luKGUpLHI9MS1zLG49dC54LG89dC55LGE9dC56LGg9cipuLGw9cipvO3JldHVybiB0aGlzLnNldChoKm4rcyxoKm8taSphLGgqYStpKm8sMCxoKm8raSphLGwqbytzLGwqYS1pKm4sMCxoKmEtaSpvLGwqYStpKm4sciphKmErcywwLDAsMCwwLDEpLHRoaXN9bWFrZVNjYWxlKHQsZSxzKXtyZXR1cm4gdGhpcy5zZXQodCwwLDAsMCwwLGUsMCwwLDAsMCxzLDAsMCwwLDAsMSksdGhpc31tYWtlU2hlYXIodCxlLHMsaSxyLG4pe3JldHVybiB0aGlzLnNldCgxLHMsciwwLHQsMSxuLDAsZSxpLDEsMCwwLDAsMCwxKSx0aGlzfWNvbXBvc2UodCxlLHMpe2NvbnN0IGk9dGhpcy5lbGVtZW50cyxyPWUuX3gsbj1lLl95LG89ZS5feixhPWUuX3csaD1yK3IsbD1uK24sYz1vK28sdT1yKmgsZD1yKmwsbT1yKmMseT1uKmwscD1uKmMseD1vKmMsZj1hKmgsZz1hKmwsYj1hKmMsdz1zLngsTT1zLnksej1zLno7cmV0dXJuIGlbMF09KDEtKHkreCkpKncsaVsxXT0oZCtiKSp3LGlbMl09KG0tZykqdyxpWzNdPTAsaVs0XT0oZC1iKSpNLGlbNV09KDEtKHUreCkpKk0saVs2XT0ocCtmKSpNLGlbN109MCxpWzhdPShtK2cpKnosaVs5XT0ocC1mKSp6LGlbMTBdPSgxLSh1K3kpKSp6LGlbMTFdPTAsaVsxMl09dC54LGlbMTNdPXQueSxpWzE0XT10LnosaVsxNV09MSx0aGlzfWRlY29tcG9zZSh0LGUscyl7Y29uc3QgaT10aGlzLmVsZW1lbnRzO2xldCByPUsuc2V0KGlbMF0saVsxXSxpWzJdKS5sZW5ndGgoKTtjb25zdCBuPUsuc2V0KGlbNF0saVs1XSxpWzZdKS5sZW5ndGgoKSxvPUsuc2V0KGlbOF0saVs5XSxpWzEwXSkubGVuZ3RoKCk7dGhpcy5kZXRlcm1pbmFudCgpPDAmJihyPS1yKSx0Lng9aVsxMl0sdC55PWlbMTNdLHQuej1pWzE0XSx0dC5jb3B5KHRoaXMpO2NvbnN0IGE9MS9yLGg9MS9uLGw9MS9vO3JldHVybiB0dC5lbGVtZW50c1swXSo9YSx0dC5lbGVtZW50c1sxXSo9YSx0dC5lbGVtZW50c1syXSo9YSx0dC5lbGVtZW50c1s0XSo9aCx0dC5lbGVtZW50c1s1XSo9aCx0dC5lbGVtZW50c1s2XSo9aCx0dC5lbGVtZW50c1s4XSo9bCx0dC5lbGVtZW50c1s5XSo9bCx0dC5lbGVtZW50c1sxMF0qPWwsZS5zZXRGcm9tUm90YXRpb25NYXRyaXgodHQpLHMueD1yLHMueT1uLHMuej1vLHRoaXN9bWFrZVBlcnNwZWN0aXZlKHQsZSxzLGkscixuKXt2b2lkIDA9PT1uJiZjb25zb2xlLndhcm4oIlRIUkVFLk1hdHJpeDQ6IC5tYWtlUGVyc3BlY3RpdmUoKSBoYXMgYmVlbiByZWRlZmluZWQgYW5kIGhhcyBhIG5ldyBzaWduYXR1cmUuIFBsZWFzZSBjaGVjayB0aGUgZG9jcy4iKTtjb25zdCBvPXRoaXMuZWxlbWVudHMsYT0yKnIvKGUtdCksaD0yKnIvKHMtaSksbD0oZSt0KS8oZS10KSxjPShzK2kpLyhzLWkpLHU9LShuK3IpLyhuLXIpLGQ9LTIqbipyLyhuLXIpO3JldHVybiBvWzBdPWEsb1s0XT0wLG9bOF09bCxvWzEyXT0wLG9bMV09MCxvWzVdPWgsb1s5XT1jLG9bMTNdPTAsb1syXT0wLG9bNl09MCxvWzEwXT11LG9bMTRdPWQsb1szXT0wLG9bN109MCxvWzExXT0tMSxvWzE1XT0wLHRoaXN9bWFrZU9ydGhvZ3JhcGhpYyh0LGUscyxpLHIsbil7Y29uc3Qgbz10aGlzLmVsZW1lbnRzLGE9MS8oZS10KSxoPTEvKHMtaSksbD0xLyhuLXIpLGM9KGUrdCkqYSx1PShzK2kpKmgsZD0obityKSpsO3JldHVybiBvWzBdPTIqYSxvWzRdPTAsb1s4XT0wLG9bMTJdPS1jLG9bMV09MCxvWzVdPTIqaCxvWzldPTAsb1sxM109LXUsb1syXT0wLG9bNl09MCxvWzEwXT0tMipsLG9bMTRdPS1kLG9bM109MCxvWzddPTAsb1sxMV09MCxvWzE1XT0xLHRoaXN9ZXF1YWxzKHQpe2NvbnN0IGU9dGhpcy5lbGVtZW50cyxzPXQuZWxlbWVudHM7Zm9yKGxldCB0PTA7dDwxNjt0KyspaWYoZVt0XSE9PXNbdF0pcmV0dXJuITE7cmV0dXJuITB9ZnJvbUFycmF5KHQpe2xldCBlPWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTowO2ZvcihsZXQgcz0wO3M8MTY7cysrKXRoaXMuZWxlbWVudHNbc109dFtzK2VdO3JldHVybiB0aGlzfXRvQXJyYXkoKXtsZXQgdD1hcmd1bWVudHMubGVuZ3RoPjAmJnZvaWQgMCE9PWFyZ3VtZW50c1swXT9hcmd1bWVudHNbMF06W10sZT1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06MDtjb25zdCBzPXRoaXMuZWxlbWVudHM7cmV0dXJuIHRbZV09c1swXSx0W2UrMV09c1sxXSx0W2UrMl09c1syXSx0W2UrM109c1szXSx0W2UrNF09c1s0XSx0W2UrNV09c1s1XSx0W2UrNl09c1s2XSx0W2UrN109c1s3XSx0W2UrOF09c1s4XSx0W2UrOV09c1s5XSx0W2UrMTBdPXNbMTBdLHRbZSsxMV09c1sxMV0sdFtlKzEyXT1zWzEyXSx0W2UrMTNdPXNbMTNdLHRbZSsxNF09c1sxNF0sdFtlKzE1XT1zWzE1XSx0fX1jb25zdCBLPW5ldyBFLHR0PW5ldyAkLGV0PW5ldyBFKDAsMCwwKSxzdD1uZXcgRSgxLDEsMSksaXQ9bmV3IEUscnQ9bmV3IEUsbnQ9bmV3IEUsb3Q9bmV3ICQsYXQ9bmV3IFQ7Y2xhc3MgaHR7Y29uc3RydWN0b3IoKXtsZXQgdD1hcmd1bWVudHMubGVuZ3RoPjAmJnZvaWQgMCE9PWFyZ3VtZW50c1swXT9hcmd1bWVudHNbMF06MCxlPWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTowLHM9YXJndW1lbnRzLmxlbmd0aD4yJiZ2b2lkIDAhPT1hcmd1bWVudHNbMl0/YXJndW1lbnRzWzJdOjAsaT1hcmd1bWVudHMubGVuZ3RoPjMmJnZvaWQgMCE9PWFyZ3VtZW50c1szXT9hcmd1bWVudHNbM106aHQuRGVmYXVsdE9yZGVyO3RoaXMuaXNFdWxlcj0hMCx0aGlzLl94PXQsdGhpcy5feT1lLHRoaXMuX3o9cyx0aGlzLl9vcmRlcj1pfWdldCB4KCl7cmV0dXJuIHRoaXMuX3h9c2V0IHgodCl7dGhpcy5feD10LHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKX1nZXQgeSgpe3JldHVybiB0aGlzLl95fXNldCB5KHQpe3RoaXMuX3k9dCx0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCl9Z2V0IHooKXtyZXR1cm4gdGhpcy5fen1zZXQgeih0KXt0aGlzLl96PXQsdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpfWdldCBvcmRlcigpe3JldHVybiB0aGlzLl9vcmRlcn1zZXQgb3JkZXIodCl7dGhpcy5fb3JkZXI9dCx0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCl9c2V0KHQsZSxzKXtsZXQgaT1hcmd1bWVudHMubGVuZ3RoPjMmJnZvaWQgMCE9PWFyZ3VtZW50c1szXT9hcmd1bWVudHNbM106dGhpcy5fb3JkZXI7cmV0dXJuIHRoaXMuX3g9dCx0aGlzLl95PWUsdGhpcy5fej1zLHRoaXMuX29yZGVyPWksdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpLHRoaXN9Y2xvbmUoKXtyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IodGhpcy5feCx0aGlzLl95LHRoaXMuX3osdGhpcy5fb3JkZXIpfWNvcHkodCl7cmV0dXJuIHRoaXMuX3g9dC5feCx0aGlzLl95PXQuX3ksdGhpcy5fej10Ll96LHRoaXMuX29yZGVyPXQuX29yZGVyLHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKSx0aGlzfXNldEZyb21Sb3RhdGlvbk1hdHJpeCh0KXtsZXQgZT1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06dGhpcy5fb3JkZXIscz0hKGFyZ3VtZW50cy5sZW5ndGg+MiYmdm9pZCAwIT09YXJndW1lbnRzWzJdKXx8YXJndW1lbnRzWzJdO2NvbnN0IGk9dC5lbGVtZW50cyxyPWlbMF0sbj1pWzRdLGE9aVs4XSxoPWlbMV0sbD1pWzVdLGM9aVs5XSx1PWlbMl0sZD1pWzZdLG09aVsxMF07c3dpdGNoKGUpe2Nhc2UiWFlaIjp0aGlzLl95PU1hdGguYXNpbihvKGEsLTEsMSkpLE1hdGguYWJzKGEpPC45OTk5OTk5Pyh0aGlzLl94PU1hdGguYXRhbjIoLWMsbSksdGhpcy5fej1NYXRoLmF0YW4yKC1uLHIpKToodGhpcy5feD1NYXRoLmF0YW4yKGQsbCksdGhpcy5fej0wKTticmVhaztjYXNlIllYWiI6dGhpcy5feD1NYXRoLmFzaW4oLW8oYywtMSwxKSksTWF0aC5hYnMoYyk8Ljk5OTk5OTk/KHRoaXMuX3k9TWF0aC5hdGFuMihhLG0pLHRoaXMuX3o9TWF0aC5hdGFuMihoLGwpKToodGhpcy5feT1NYXRoLmF0YW4yKC11LHIpLHRoaXMuX3o9MCk7YnJlYWs7Y2FzZSJaWFkiOnRoaXMuX3g9TWF0aC5hc2luKG8oZCwtMSwxKSksTWF0aC5hYnMoZCk8Ljk5OTk5OTk/KHRoaXMuX3k9TWF0aC5hdGFuMigtdSxtKSx0aGlzLl96PU1hdGguYXRhbjIoLW4sbCkpOih0aGlzLl95PTAsdGhpcy5fej1NYXRoLmF0YW4yKGgscikpO2JyZWFrO2Nhc2UiWllYIjp0aGlzLl95PU1hdGguYXNpbigtbyh1LC0xLDEpKSxNYXRoLmFicyh1KTwuOTk5OTk5OT8odGhpcy5feD1NYXRoLmF0YW4yKGQsbSksdGhpcy5fej1NYXRoLmF0YW4yKGgscikpOih0aGlzLl94PTAsdGhpcy5fej1NYXRoLmF0YW4yKC1uLGwpKTticmVhaztjYXNlIllaWCI6dGhpcy5fej1NYXRoLmFzaW4obyhoLC0xLDEpKSxNYXRoLmFicyhoKTwuOTk5OTk5OT8odGhpcy5feD1NYXRoLmF0YW4yKC1jLGwpLHRoaXMuX3k9TWF0aC5hdGFuMigtdSxyKSk6KHRoaXMuX3g9MCx0aGlzLl95PU1hdGguYXRhbjIoYSxtKSk7YnJlYWs7Y2FzZSJYWlkiOnRoaXMuX3o9TWF0aC5hc2luKC1vKG4sLTEsMSkpLE1hdGguYWJzKG4pPC45OTk5OTk5Pyh0aGlzLl94PU1hdGguYXRhbjIoZCxsKSx0aGlzLl95PU1hdGguYXRhbjIoYSxyKSk6KHRoaXMuX3g9TWF0aC5hdGFuMigtYyxtKSx0aGlzLl95PTApO2JyZWFrO2RlZmF1bHQ6Y29uc29sZS53YXJuKCJUSFJFRS5FdWxlcjogLnNldEZyb21Sb3RhdGlvbk1hdHJpeCgpIGVuY291bnRlcmVkIGFuIHVua25vd24gb3JkZXI6ICIrZSl9cmV0dXJuIHRoaXMuX29yZGVyPWUsITA9PT1zJiZ0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCksdGhpc31zZXRGcm9tUXVhdGVybmlvbih0LGUscyl7cmV0dXJuIG90Lm1ha2VSb3RhdGlvbkZyb21RdWF0ZXJuaW9uKHQpLHRoaXMuc2V0RnJvbVJvdGF0aW9uTWF0cml4KG90LGUscyl9c2V0RnJvbVZlY3RvcjModCl7bGV0IGU9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOnRoaXMuX29yZGVyO3JldHVybiB0aGlzLnNldCh0LngsdC55LHQueixlKX1yZW9yZGVyKHQpe3JldHVybiBhdC5zZXRGcm9tRXVsZXIodGhpcyksdGhpcy5zZXRGcm9tUXVhdGVybmlvbihhdCx0KX1lcXVhbHModCl7cmV0dXJuIHQuX3g9PT10aGlzLl94JiZ0Ll95PT09dGhpcy5feSYmdC5fej09PXRoaXMuX3omJnQuX29yZGVyPT09dGhpcy5fb3JkZXJ9ZnJvbUFycmF5KHQpe3JldHVybiB0aGlzLl94PXRbMF0sdGhpcy5feT10WzFdLHRoaXMuX3o9dFsyXSx2b2lkIDAhPT10WzNdJiYodGhpcy5fb3JkZXI9dFszXSksdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpLHRoaXN9dG9BcnJheSgpe2xldCB0PWFyZ3VtZW50cy5sZW5ndGg+MCYmdm9pZCAwIT09YXJndW1lbnRzWzBdP2FyZ3VtZW50c1swXTpbXSxlPWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTowO3JldHVybiB0W2VdPXRoaXMuX3gsdFtlKzFdPXRoaXMuX3ksdFtlKzJdPXRoaXMuX3osdFtlKzNdPXRoaXMuX29yZGVyLHR9X29uQ2hhbmdlKHQpe3JldHVybiB0aGlzLl9vbkNoYW5nZUNhbGxiYWNrPXQsdGhpc31fb25DaGFuZ2VDYWxsYmFjaygpe30qW1N5bWJvbC5pdGVyYXRvcl0oKXt5aWVsZCB0aGlzLl94LHlpZWxkIHRoaXMuX3kseWllbGQgdGhpcy5feix5aWVsZCB0aGlzLl9vcmRlcn10b1ZlY3RvcjMoKXtjb25zb2xlLmVycm9yKCJUSFJFRS5FdWxlcjogLnRvVmVjdG9yMygpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBWZWN0b3IzLnNldEZyb21FdWxlcigpIGluc3RlYWQiKX19aHQuRGVmYXVsdE9yZGVyPSJYWVoiLGh0LlJvdGF0aW9uT3JkZXJzPVsiWFlaIiwiWVpYIiwiWlhZIiwiWFpZIiwiWVhaIiwiWllYIl07Y2xhc3MgbHR7Y29uc3RydWN0b3IoKXt0aGlzLm1hc2s9MX1zZXQodCl7dGhpcy5tYXNrPSgxPDx0fDApPj4+MH1lbmFibGUodCl7dGhpcy5tYXNrfD0xPDx0fDB9ZW5hYmxlQWxsKCl7dGhpcy5tYXNrPS0xfXRvZ2dsZSh0KXt0aGlzLm1hc2tePTE8PHR8MH1kaXNhYmxlKHQpe3RoaXMubWFzayY9figxPDx0fDApfWRpc2FibGVBbGwoKXt0aGlzLm1hc2s9MH10ZXN0KHQpe3JldHVybiAwIT0odGhpcy5tYXNrJnQubWFzayl9aXNFbmFibGVkKHQpe3JldHVybiAwIT0odGhpcy5tYXNrJigxPDx0fDApKX19bGV0IGN0PTA7Y29uc3QgdXQ9bmV3IEUsZHQ9bmV3IFQsbXQ9bmV3ICQseXQ9bmV3IEUscHQ9bmV3IEUseHQ9bmV3IEUsZnQ9bmV3IFQsZ3Q9bmV3IEUoMSwwLDApLGJ0PW5ldyBFKDAsMSwwKSx3dD1uZXcgRSgwLDAsMSksTXQ9e3R5cGU6ImFkZGVkIn0senQ9e3R5cGU6InJlbW92ZWQifTtjbGFzcyB2dCBleHRlbmRzIGl7Y29uc3RydWN0b3IoKXtzdXBlcigpLHRoaXMuaXNPYmplY3QzRD0hMCxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiaWQiLHt2YWx1ZTpjdCsrfSksdGhpcy51dWlkPW4oKSx0aGlzLm5hbWU9IiIsdGhpcy50eXBlPSJPYmplY3QzRCIsdGhpcy5wYXJlbnQ9bnVsbCx0aGlzLmNoaWxkcmVuPVtdLHRoaXMudXA9dnQuRGVmYXVsdFVwLmNsb25lKCk7Y29uc3QgdD1uZXcgRSxlPW5ldyBodCxzPW5ldyBULGk9bmV3IEUoMSwxLDEpO2UuX29uQ2hhbmdlKChmdW5jdGlvbigpe3Muc2V0RnJvbUV1bGVyKGUsITEpfSkpLHMuX29uQ2hhbmdlKChmdW5jdGlvbigpe2Uuc2V0RnJvbVF1YXRlcm5pb24ocyx2b2lkIDAsITEpfSkpLE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRoaXMse3Bvc2l0aW9uOntjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCx2YWx1ZTp0fSxyb3RhdGlvbjp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsdmFsdWU6ZX0scXVhdGVybmlvbjp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsdmFsdWU6c30sc2NhbGU6e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLHZhbHVlOml9LG1vZGVsVmlld01hdHJpeDp7dmFsdWU6bmV3ICR9LG5vcm1hbE1hdHJpeDp7dmFsdWU6bmV3IGx9fSksdGhpcy5tYXRyaXg9bmV3ICQsdGhpcy5tYXRyaXhXb3JsZD1uZXcgJCx0aGlzLm1hdHJpeEF1dG9VcGRhdGU9dnQuRGVmYXVsdE1hdHJpeEF1dG9VcGRhdGUsdGhpcy5tYXRyaXhXb3JsZE5lZWRzVXBkYXRlPSExLHRoaXMubGF5ZXJzPW5ldyBsdCx0aGlzLnZpc2libGU9ITAsdGhpcy5jYXN0U2hhZG93PSExLHRoaXMucmVjZWl2ZVNoYWRvdz0hMSx0aGlzLmZydXN0dW1DdWxsZWQ9ITAsdGhpcy5yZW5kZXJPcmRlcj0wLHRoaXMuYW5pbWF0aW9ucz1bXSx0aGlzLnVzZXJEYXRhPXt9fW9uQmVmb3JlUmVuZGVyKCl7fW9uQWZ0ZXJSZW5kZXIoKXt9YXBwbHlNYXRyaXg0KHQpe3RoaXMubWF0cml4QXV0b1VwZGF0ZSYmdGhpcy51cGRhdGVNYXRyaXgoKSx0aGlzLm1hdHJpeC5wcmVtdWx0aXBseSh0KSx0aGlzLm1hdHJpeC5kZWNvbXBvc2UodGhpcy5wb3NpdGlvbix0aGlzLnF1YXRlcm5pb24sdGhpcy5zY2FsZSl9YXBwbHlRdWF0ZXJuaW9uKHQpe3JldHVybiB0aGlzLnF1YXRlcm5pb24ucHJlbXVsdGlwbHkodCksdGhpc31zZXRSb3RhdGlvbkZyb21BeGlzQW5nbGUodCxlKXt0aGlzLnF1YXRlcm5pb24uc2V0RnJvbUF4aXNBbmdsZSh0LGUpfXNldFJvdGF0aW9uRnJvbUV1bGVyKHQpe3RoaXMucXVhdGVybmlvbi5zZXRGcm9tRXVsZXIodCwhMCl9c2V0Um90YXRpb25Gcm9tTWF0cml4KHQpe3RoaXMucXVhdGVybmlvbi5zZXRGcm9tUm90YXRpb25NYXRyaXgodCl9c2V0Um90YXRpb25Gcm9tUXVhdGVybmlvbih0KXt0aGlzLnF1YXRlcm5pb24uY29weSh0KX1yb3RhdGVPbkF4aXModCxlKXtyZXR1cm4gZHQuc2V0RnJvbUF4aXNBbmdsZSh0LGUpLHRoaXMucXVhdGVybmlvbi5tdWx0aXBseShkdCksdGhpc31yb3RhdGVPbldvcmxkQXhpcyh0LGUpe3JldHVybiBkdC5zZXRGcm9tQXhpc0FuZ2xlKHQsZSksdGhpcy5xdWF0ZXJuaW9uLnByZW11bHRpcGx5KGR0KSx0aGlzfXJvdGF0ZVgodCl7cmV0dXJuIHRoaXMucm90YXRlT25BeGlzKGd0LHQpfXJvdGF0ZVkodCl7cmV0dXJuIHRoaXMucm90YXRlT25BeGlzKGJ0LHQpfXJvdGF0ZVoodCl7cmV0dXJuIHRoaXMucm90YXRlT25BeGlzKHd0LHQpfXRyYW5zbGF0ZU9uQXhpcyh0LGUpe3JldHVybiB1dC5jb3B5KHQpLmFwcGx5UXVhdGVybmlvbih0aGlzLnF1YXRlcm5pb24pLHRoaXMucG9zaXRpb24uYWRkKHV0Lm11bHRpcGx5U2NhbGFyKGUpKSx0aGlzfXRyYW5zbGF0ZVgodCl7cmV0dXJuIHRoaXMudHJhbnNsYXRlT25BeGlzKGd0LHQpfXRyYW5zbGF0ZVkodCl7cmV0dXJuIHRoaXMudHJhbnNsYXRlT25BeGlzKGJ0LHQpfXRyYW5zbGF0ZVoodCl7cmV0dXJuIHRoaXMudHJhbnNsYXRlT25BeGlzKHd0LHQpfWxvY2FsVG9Xb3JsZCh0KXtyZXR1cm4gdC5hcHBseU1hdHJpeDQodGhpcy5tYXRyaXhXb3JsZCl9d29ybGRUb0xvY2FsKHQpe3JldHVybiB0LmFwcGx5TWF0cml4NChtdC5jb3B5KHRoaXMubWF0cml4V29ybGQpLmludmVydCgpKX1sb29rQXQodCxlLHMpe3QuaXNWZWN0b3IzP3l0LmNvcHkodCk6eXQuc2V0KHQsZSxzKTtjb25zdCBpPXRoaXMucGFyZW50O3RoaXMudXBkYXRlV29ybGRNYXRyaXgoITAsITEpLHB0LnNldEZyb21NYXRyaXhQb3NpdGlvbih0aGlzLm1hdHJpeFdvcmxkKSx0aGlzLmlzQ2FtZXJhfHx0aGlzLmlzTGlnaHQ/bXQubG9va0F0KHB0LHl0LHRoaXMudXApOm10Lmxvb2tBdCh5dCxwdCx0aGlzLnVwKSx0aGlzLnF1YXRlcm5pb24uc2V0RnJvbVJvdGF0aW9uTWF0cml4KG10KSxpJiYobXQuZXh0cmFjdFJvdGF0aW9uKGkubWF0cml4V29ybGQpLGR0LnNldEZyb21Sb3RhdGlvbk1hdHJpeChtdCksdGhpcy5xdWF0ZXJuaW9uLnByZW11bHRpcGx5KGR0LmludmVydCgpKSl9YWRkKHQpe2lmKGFyZ3VtZW50cy5sZW5ndGg+MSl7Zm9yKGxldCB0PTA7dDxhcmd1bWVudHMubGVuZ3RoO3QrKyl0aGlzLmFkZChhcmd1bWVudHNbdF0pO3JldHVybiB0aGlzfXJldHVybiB0PT09dGhpcz8oY29uc29sZS5lcnJvcigiVEhSRUUuT2JqZWN0M0QuYWRkOiBvYmplY3QgY2FuJ3QgYmUgYWRkZWQgYXMgYSBjaGlsZCBvZiBpdHNlbGYuIix0KSx0aGlzKToodCYmdC5pc09iamVjdDNEPyhudWxsIT09dC5wYXJlbnQmJnQucGFyZW50LnJlbW92ZSh0KSx0LnBhcmVudD10aGlzLHRoaXMuY2hpbGRyZW4ucHVzaCh0KSx0LmRpc3BhdGNoRXZlbnQoTXQpKTpjb25zb2xlLmVycm9yKCJUSFJFRS5PYmplY3QzRC5hZGQ6IG9iamVjdCBub3QgYW4gaW5zdGFuY2Ugb2YgVEhSRUUuT2JqZWN0M0QuIix0KSx0aGlzKX1yZW1vdmUodCl7aWYoYXJndW1lbnRzLmxlbmd0aD4xKXtmb3IobGV0IHQ9MDt0PGFyZ3VtZW50cy5sZW5ndGg7dCsrKXRoaXMucmVtb3ZlKGFyZ3VtZW50c1t0XSk7cmV0dXJuIHRoaXN9Y29uc3QgZT10aGlzLmNoaWxkcmVuLmluZGV4T2YodCk7cmV0dXJuLTEhPT1lJiYodC5wYXJlbnQ9bnVsbCx0aGlzLmNoaWxkcmVuLnNwbGljZShlLDEpLHQuZGlzcGF0Y2hFdmVudCh6dCkpLHRoaXN9cmVtb3ZlRnJvbVBhcmVudCgpe2NvbnN0IHQ9dGhpcy5wYXJlbnQ7cmV0dXJuIG51bGwhPT10JiZ0LnJlbW92ZSh0aGlzKSx0aGlzfWNsZWFyKCl7Zm9yKGxldCB0PTA7dDx0aGlzLmNoaWxkcmVuLmxlbmd0aDt0Kyspe2NvbnN0IGU9dGhpcy5jaGlsZHJlblt0XTtlLnBhcmVudD1udWxsLGUuZGlzcGF0Y2hFdmVudCh6dCl9cmV0dXJuIHRoaXMuY2hpbGRyZW4ubGVuZ3RoPTAsdGhpc31hdHRhY2godCl7cmV0dXJuIHRoaXMudXBkYXRlV29ybGRNYXRyaXgoITAsITEpLG10LmNvcHkodGhpcy5tYXRyaXhXb3JsZCkuaW52ZXJ0KCksbnVsbCE9PXQucGFyZW50JiYodC5wYXJlbnQudXBkYXRlV29ybGRNYXRyaXgoITAsITEpLG10Lm11bHRpcGx5KHQucGFyZW50Lm1hdHJpeFdvcmxkKSksdC5hcHBseU1hdHJpeDQobXQpLHRoaXMuYWRkKHQpLHQudXBkYXRlV29ybGRNYXRyaXgoITEsITApLHRoaXN9Z2V0T2JqZWN0QnlJZCh0KXtyZXR1cm4gdGhpcy5nZXRPYmplY3RCeVByb3BlcnR5KCJpZCIsdCl9Z2V0T2JqZWN0QnlOYW1lKHQpe3JldHVybiB0aGlzLmdldE9iamVjdEJ5UHJvcGVydHkoIm5hbWUiLHQpfWdldE9iamVjdEJ5UHJvcGVydHkodCxlKXtpZih0aGlzW3RdPT09ZSlyZXR1cm4gdGhpcztmb3IobGV0IHM9MCxpPXRoaXMuY2hpbGRyZW4ubGVuZ3RoO3M8aTtzKyspe2NvbnN0IGk9dGhpcy5jaGlsZHJlbltzXS5nZXRPYmplY3RCeVByb3BlcnR5KHQsZSk7aWYodm9pZCAwIT09aSlyZXR1cm4gaX19Z2V0V29ybGRQb3NpdGlvbih0KXtyZXR1cm4gdGhpcy51cGRhdGVXb3JsZE1hdHJpeCghMCwhMSksdC5zZXRGcm9tTWF0cml4UG9zaXRpb24odGhpcy5tYXRyaXhXb3JsZCl9Z2V0V29ybGRRdWF0ZXJuaW9uKHQpe3JldHVybiB0aGlzLnVwZGF0ZVdvcmxkTWF0cml4KCEwLCExKSx0aGlzLm1hdHJpeFdvcmxkLmRlY29tcG9zZShwdCx0LHh0KSx0fWdldFdvcmxkU2NhbGUodCl7cmV0dXJuIHRoaXMudXBkYXRlV29ybGRNYXRyaXgoITAsITEpLHRoaXMubWF0cml4V29ybGQuZGVjb21wb3NlKHB0LGZ0LHQpLHR9Z2V0V29ybGREaXJlY3Rpb24odCl7dGhpcy51cGRhdGVXb3JsZE1hdHJpeCghMCwhMSk7Y29uc3QgZT10aGlzLm1hdHJpeFdvcmxkLmVsZW1lbnRzO3JldHVybiB0LnNldChlWzhdLGVbOV0sZVsxMF0pLm5vcm1hbGl6ZSgpfXJheWNhc3QoKXt9dHJhdmVyc2UodCl7dCh0aGlzKTtjb25zdCBlPXRoaXMuY2hpbGRyZW47Zm9yKGxldCBzPTAsaT1lLmxlbmd0aDtzPGk7cysrKWVbc10udHJhdmVyc2UodCl9dHJhdmVyc2VWaXNpYmxlKHQpe2lmKCExPT09dGhpcy52aXNpYmxlKXJldHVybjt0KHRoaXMpO2NvbnN0IGU9dGhpcy5jaGlsZHJlbjtmb3IobGV0IHM9MCxpPWUubGVuZ3RoO3M8aTtzKyspZVtzXS50cmF2ZXJzZVZpc2libGUodCl9dHJhdmVyc2VBbmNlc3RvcnModCl7Y29uc3QgZT10aGlzLnBhcmVudDtudWxsIT09ZSYmKHQoZSksZS50cmF2ZXJzZUFuY2VzdG9ycyh0KSl9dXBkYXRlTWF0cml4KCl7dGhpcy5tYXRyaXguY29tcG9zZSh0aGlzLnBvc2l0aW9uLHRoaXMucXVhdGVybmlvbix0aGlzLnNjYWxlKSx0aGlzLm1hdHJpeFdvcmxkTmVlZHNVcGRhdGU9ITB9dXBkYXRlTWF0cml4V29ybGQodCl7dGhpcy5tYXRyaXhBdXRvVXBkYXRlJiZ0aGlzLnVwZGF0ZU1hdHJpeCgpLCh0aGlzLm1hdHJpeFdvcmxkTmVlZHNVcGRhdGV8fHQpJiYobnVsbD09PXRoaXMucGFyZW50P3RoaXMubWF0cml4V29ybGQuY29weSh0aGlzLm1hdHJpeCk6dGhpcy5tYXRyaXhXb3JsZC5tdWx0aXBseU1hdHJpY2VzKHRoaXMucGFyZW50Lm1hdHJpeFdvcmxkLHRoaXMubWF0cml4KSx0aGlzLm1hdHJpeFdvcmxkTmVlZHNVcGRhdGU9ITEsdD0hMCk7Y29uc3QgZT10aGlzLmNoaWxkcmVuO2ZvcihsZXQgcz0wLGk9ZS5sZW5ndGg7czxpO3MrKyllW3NdLnVwZGF0ZU1hdHJpeFdvcmxkKHQpfXVwZGF0ZVdvcmxkTWF0cml4KHQsZSl7Y29uc3Qgcz10aGlzLnBhcmVudDtpZighMD09PXQmJm51bGwhPT1zJiZzLnVwZGF0ZVdvcmxkTWF0cml4KCEwLCExKSx0aGlzLm1hdHJpeEF1dG9VcGRhdGUmJnRoaXMudXBkYXRlTWF0cml4KCksbnVsbD09PXRoaXMucGFyZW50P3RoaXMubWF0cml4V29ybGQuY29weSh0aGlzLm1hdHJpeCk6dGhpcy5tYXRyaXhXb3JsZC5tdWx0aXBseU1hdHJpY2VzKHRoaXMucGFyZW50Lm1hdHJpeFdvcmxkLHRoaXMubWF0cml4KSwhMD09PWUpe2NvbnN0IHQ9dGhpcy5jaGlsZHJlbjtmb3IobGV0IGU9MCxzPXQubGVuZ3RoO2U8cztlKyspdFtlXS51cGRhdGVXb3JsZE1hdHJpeCghMSwhMCl9fXRvSlNPTih0KXtjb25zdCBlPXZvaWQgMD09PXR8fCJzdHJpbmciPT10eXBlb2YgdCxzPXt9O2UmJih0PXtnZW9tZXRyaWVzOnt9LG1hdGVyaWFsczp7fSx0ZXh0dXJlczp7fSxpbWFnZXM6e30sc2hhcGVzOnt9LHNrZWxldG9uczp7fSxhbmltYXRpb25zOnt9LG5vZGVzOnt9fSxzLm1ldGFkYXRhPXt2ZXJzaW9uOjQuNSx0eXBlOiJPYmplY3QiLGdlbmVyYXRvcjoiT2JqZWN0M0QudG9KU09OIn0pO2NvbnN0IGk9e307ZnVuY3Rpb24gcihlLHMpe3JldHVybiB2b2lkIDA9PT1lW3MudXVpZF0mJihlW3MudXVpZF09cy50b0pTT04odCkpLHMudXVpZH1pZihpLnV1aWQ9dGhpcy51dWlkLGkudHlwZT10aGlzLnR5cGUsIiIhPT10aGlzLm5hbWUmJihpLm5hbWU9dGhpcy5uYW1lKSwhMD09PXRoaXMuY2FzdFNoYWRvdyYmKGkuY2FzdFNoYWRvdz0hMCksITA9PT10aGlzLnJlY2VpdmVTaGFkb3cmJihpLnJlY2VpdmVTaGFkb3c9ITApLCExPT09dGhpcy52aXNpYmxlJiYoaS52aXNpYmxlPSExKSwhMT09PXRoaXMuZnJ1c3R1bUN1bGxlZCYmKGkuZnJ1c3R1bUN1bGxlZD0hMSksMCE9PXRoaXMucmVuZGVyT3JkZXImJihpLnJlbmRlck9yZGVyPXRoaXMucmVuZGVyT3JkZXIpLCJ7fSIhPT1KU09OLnN0cmluZ2lmeSh0aGlzLnVzZXJEYXRhKSYmKGkudXNlckRhdGE9dGhpcy51c2VyRGF0YSksaS5sYXllcnM9dGhpcy5sYXllcnMubWFzayxpLm1hdHJpeD10aGlzLm1hdHJpeC50b0FycmF5KCksITE9PT10aGlzLm1hdHJpeEF1dG9VcGRhdGUmJihpLm1hdHJpeEF1dG9VcGRhdGU9ITEpLHRoaXMuaXNJbnN0YW5jZWRNZXNoJiYoaS50eXBlPSJJbnN0YW5jZWRNZXNoIixpLmNvdW50PXRoaXMuY291bnQsaS5pbnN0YW5jZU1hdHJpeD10aGlzLmluc3RhbmNlTWF0cml4LnRvSlNPTigpLG51bGwhPT10aGlzLmluc3RhbmNlQ29sb3ImJihpLmluc3RhbmNlQ29sb3I9dGhpcy5pbnN0YW5jZUNvbG9yLnRvSlNPTigpKSksdGhpcy5pc1NjZW5lKXRoaXMuYmFja2dyb3VuZCYmKHRoaXMuYmFja2dyb3VuZC5pc0NvbG9yP2kuYmFja2dyb3VuZD10aGlzLmJhY2tncm91bmQudG9KU09OKCk6dGhpcy5iYWNrZ3JvdW5kLmlzVGV4dHVyZSYmKGkuYmFja2dyb3VuZD10aGlzLmJhY2tncm91bmQudG9KU09OKHQpLnV1aWQpKSx0aGlzLmVudmlyb25tZW50JiZ0aGlzLmVudmlyb25tZW50LmlzVGV4dHVyZSYmKGkuZW52aXJvbm1lbnQ9dGhpcy5lbnZpcm9ubWVudC50b0pTT04odCkudXVpZCk7ZWxzZSBpZih0aGlzLmlzTWVzaHx8dGhpcy5pc0xpbmV8fHRoaXMuaXNQb2ludHMpe2kuZ2VvbWV0cnk9cih0Lmdlb21ldHJpZXMsdGhpcy5nZW9tZXRyeSk7Y29uc3QgZT10aGlzLmdlb21ldHJ5LnBhcmFtZXRlcnM7aWYodm9pZCAwIT09ZSYmdm9pZCAwIT09ZS5zaGFwZXMpe2NvbnN0IHM9ZS5zaGFwZXM7aWYoQXJyYXkuaXNBcnJheShzKSlmb3IobGV0IGU9MCxpPXMubGVuZ3RoO2U8aTtlKyspe2NvbnN0IGk9c1tlXTtyKHQuc2hhcGVzLGkpfWVsc2Ugcih0LnNoYXBlcyxzKX19aWYodGhpcy5pc1NraW5uZWRNZXNoJiYoaS5iaW5kTW9kZT10aGlzLmJpbmRNb2RlLGkuYmluZE1hdHJpeD10aGlzLmJpbmRNYXRyaXgudG9BcnJheSgpLHZvaWQgMCE9PXRoaXMuc2tlbGV0b24mJihyKHQuc2tlbGV0b25zLHRoaXMuc2tlbGV0b24pLGkuc2tlbGV0b249dGhpcy5za2VsZXRvbi51dWlkKSksdm9pZCAwIT09dGhpcy5tYXRlcmlhbClpZihBcnJheS5pc0FycmF5KHRoaXMubWF0ZXJpYWwpKXtjb25zdCBlPVtdO2ZvcihsZXQgcz0wLGk9dGhpcy5tYXRlcmlhbC5sZW5ndGg7czxpO3MrKyllLnB1c2gocih0Lm1hdGVyaWFscyx0aGlzLm1hdGVyaWFsW3NdKSk7aS5tYXRlcmlhbD1lfWVsc2UgaS5tYXRlcmlhbD1yKHQubWF0ZXJpYWxzLHRoaXMubWF0ZXJpYWwpO2lmKHRoaXMuY2hpbGRyZW4ubGVuZ3RoPjApe2kuY2hpbGRyZW49W107Zm9yKGxldCBlPTA7ZTx0aGlzLmNoaWxkcmVuLmxlbmd0aDtlKyspaS5jaGlsZHJlbi5wdXNoKHRoaXMuY2hpbGRyZW5bZV0udG9KU09OKHQpLm9iamVjdCl9aWYodGhpcy5hbmltYXRpb25zLmxlbmd0aD4wKXtpLmFuaW1hdGlvbnM9W107Zm9yKGxldCBlPTA7ZTx0aGlzLmFuaW1hdGlvbnMubGVuZ3RoO2UrKyl7Y29uc3Qgcz10aGlzLmFuaW1hdGlvbnNbZV07aS5hbmltYXRpb25zLnB1c2gocih0LmFuaW1hdGlvbnMscykpfX1pZihlKXtjb25zdCBlPW4odC5nZW9tZXRyaWVzKSxpPW4odC5tYXRlcmlhbHMpLHI9bih0LnRleHR1cmVzKSxvPW4odC5pbWFnZXMpLGE9bih0LnNoYXBlcyksaD1uKHQuc2tlbGV0b25zKSxsPW4odC5hbmltYXRpb25zKSxjPW4odC5ub2Rlcyk7ZS5sZW5ndGg+MCYmKHMuZ2VvbWV0cmllcz1lKSxpLmxlbmd0aD4wJiYocy5tYXRlcmlhbHM9aSksci5sZW5ndGg+MCYmKHMudGV4dHVyZXM9ciksby5sZW5ndGg+MCYmKHMuaW1hZ2VzPW8pLGEubGVuZ3RoPjAmJihzLnNoYXBlcz1hKSxoLmxlbmd0aD4wJiYocy5za2VsZXRvbnM9aCksbC5sZW5ndGg+MCYmKHMuYW5pbWF0aW9ucz1sKSxjLmxlbmd0aD4wJiYocy5ub2Rlcz1jKX1yZXR1cm4gcy5vYmplY3Q9aSxzO2Z1bmN0aW9uIG4odCl7Y29uc3QgZT1bXTtmb3IoY29uc3QgcyBpbiB0KXtjb25zdCBpPXRbc107ZGVsZXRlIGkubWV0YWRhdGEsZS5wdXNoKGkpfXJldHVybiBlfX1jbG9uZSh0KXtyZXR1cm4obmV3IHRoaXMuY29uc3RydWN0b3IpLmNvcHkodGhpcyx0KX1jb3B5KHQpe2xldCBlPSEoYXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0pfHxhcmd1bWVudHNbMV07aWYodGhpcy5uYW1lPXQubmFtZSx0aGlzLnVwLmNvcHkodC51cCksdGhpcy5wb3NpdGlvbi5jb3B5KHQucG9zaXRpb24pLHRoaXMucm90YXRpb24ub3JkZXI9dC5yb3RhdGlvbi5vcmRlcix0aGlzLnF1YXRlcm5pb24uY29weSh0LnF1YXRlcm5pb24pLHRoaXMuc2NhbGUuY29weSh0LnNjYWxlKSx0aGlzLm1hdHJpeC5jb3B5KHQubWF0cml4KSx0aGlzLm1hdHJpeFdvcmxkLmNvcHkodC5tYXRyaXhXb3JsZCksdGhpcy5tYXRyaXhBdXRvVXBkYXRlPXQubWF0cml4QXV0b1VwZGF0ZSx0aGlzLm1hdHJpeFdvcmxkTmVlZHNVcGRhdGU9dC5tYXRyaXhXb3JsZE5lZWRzVXBkYXRlLHRoaXMubGF5ZXJzLm1hc2s9dC5sYXllcnMubWFzayx0aGlzLnZpc2libGU9dC52aXNpYmxlLHRoaXMuY2FzdFNoYWRvdz10LmNhc3RTaGFkb3csdGhpcy5yZWNlaXZlU2hhZG93PXQucmVjZWl2ZVNoYWRvdyx0aGlzLmZydXN0dW1DdWxsZWQ9dC5mcnVzdHVtQ3VsbGVkLHRoaXMucmVuZGVyT3JkZXI9dC5yZW5kZXJPcmRlcix0aGlzLnVzZXJEYXRhPUpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodC51c2VyRGF0YSkpLCEwPT09ZSlmb3IobGV0IGU9MDtlPHQuY2hpbGRyZW4ubGVuZ3RoO2UrKyl7Y29uc3Qgcz10LmNoaWxkcmVuW2VdO3RoaXMuYWRkKHMuY2xvbmUoKSl9cmV0dXJuIHRoaXN9fXZ0LkRlZmF1bHRVcD1uZXcgRSgwLDEsMCksdnQuRGVmYXVsdE1hdHJpeEF1dG9VcGRhdGU9ITA7Y29uc3QgX3Q9bmV3IEUsQXQ9bmV3IEUsU3Q9bmV3IEUsQnQ9bmV3IEUsVHQ9bmV3IEUsRXQ9bmV3IEUsa3Q9bmV3IEUsUHQ9bmV3IEUsQ3Q9bmV3IEUsRnQ9bmV3IEU7Y2xhc3MgVnR7Y29uc3RydWN0b3IoKXtsZXQgdD1hcmd1bWVudHMubGVuZ3RoPjAmJnZvaWQgMCE9PWFyZ3VtZW50c1swXT9hcmd1bWVudHNbMF06bmV3IEUsZT1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06bmV3IEUscz1hcmd1bWVudHMubGVuZ3RoPjImJnZvaWQgMCE9PWFyZ3VtZW50c1syXT9hcmd1bWVudHNbMl06bmV3IEU7dGhpcy5hPXQsdGhpcy5iPWUsdGhpcy5jPXN9c3RhdGljIGdldE5vcm1hbCh0LGUscyxpKXtpLnN1YlZlY3RvcnMocyxlKSxfdC5zdWJWZWN0b3JzKHQsZSksaS5jcm9zcyhfdCk7Y29uc3Qgcj1pLmxlbmd0aFNxKCk7cmV0dXJuIHI+MD9pLm11bHRpcGx5U2NhbGFyKDEvTWF0aC5zcXJ0KHIpKTppLnNldCgwLDAsMCl9c3RhdGljIGdldEJhcnljb29yZCh0LGUscyxpLHIpe190LnN1YlZlY3RvcnMoaSxlKSxBdC5zdWJWZWN0b3JzKHMsZSksU3Quc3ViVmVjdG9ycyh0LGUpO2NvbnN0IG49X3QuZG90KF90KSxvPV90LmRvdChBdCksYT1fdC5kb3QoU3QpLGg9QXQuZG90KEF0KSxsPUF0LmRvdChTdCksYz1uKmgtbypvO2lmKDA9PT1jKXJldHVybiByLnNldCgtMiwtMSwtMSk7Y29uc3QgdT0xL2MsZD0oaCphLW8qbCkqdSxtPShuKmwtbyphKSp1O3JldHVybiByLnNldCgxLWQtbSxtLGQpfXN0YXRpYyBjb250YWluc1BvaW50KHQsZSxzLGkpe3JldHVybiB0aGlzLmdldEJhcnljb29yZCh0LGUscyxpLEJ0KSxCdC54Pj0wJiZCdC55Pj0wJiZCdC54K0J0Lnk8PTF9c3RhdGljIGdldFVWKHQsZSxzLGkscixuLG8sYSl7cmV0dXJuIHRoaXMuZ2V0QmFyeWNvb3JkKHQsZSxzLGksQnQpLGEuc2V0KDAsMCksYS5hZGRTY2FsZWRWZWN0b3IocixCdC54KSxhLmFkZFNjYWxlZFZlY3RvcihuLEJ0LnkpLGEuYWRkU2NhbGVkVmVjdG9yKG8sQnQueiksYX1zdGF0aWMgaXNGcm9udEZhY2luZyh0LGUscyxpKXtyZXR1cm4gX3Quc3ViVmVjdG9ycyhzLGUpLEF0LnN1YlZlY3RvcnModCxlKSxfdC5jcm9zcyhBdCkuZG90KGkpPDB9c2V0KHQsZSxzKXtyZXR1cm4gdGhpcy5hLmNvcHkodCksdGhpcy5iLmNvcHkoZSksdGhpcy5jLmNvcHkocyksdGhpc31zZXRGcm9tUG9pbnRzQW5kSW5kaWNlcyh0LGUscyxpKXtyZXR1cm4gdGhpcy5hLmNvcHkodFtlXSksdGhpcy5iLmNvcHkodFtzXSksdGhpcy5jLmNvcHkodFtpXSksdGhpc31zZXRGcm9tQXR0cmlidXRlQW5kSW5kaWNlcyh0LGUscyxpKXtyZXR1cm4gdGhpcy5hLmZyb21CdWZmZXJBdHRyaWJ1dGUodCxlKSx0aGlzLmIuZnJvbUJ1ZmZlckF0dHJpYnV0ZSh0LHMpLHRoaXMuYy5mcm9tQnVmZmVyQXR0cmlidXRlKHQsaSksdGhpc31jbG9uZSgpe3JldHVybihuZXcgdGhpcy5jb25zdHJ1Y3RvcikuY29weSh0aGlzKX1jb3B5KHQpe3JldHVybiB0aGlzLmEuY29weSh0LmEpLHRoaXMuYi5jb3B5KHQuYiksdGhpcy5jLmNvcHkodC5jKSx0aGlzfWdldEFyZWEoKXtyZXR1cm4gX3Quc3ViVmVjdG9ycyh0aGlzLmMsdGhpcy5iKSxBdC5zdWJWZWN0b3JzKHRoaXMuYSx0aGlzLmIpLC41Kl90LmNyb3NzKEF0KS5sZW5ndGgoKX1nZXRNaWRwb2ludCh0KXtyZXR1cm4gdC5hZGRWZWN0b3JzKHRoaXMuYSx0aGlzLmIpLmFkZCh0aGlzLmMpLm11bHRpcGx5U2NhbGFyKDEvMyl9Z2V0Tm9ybWFsKHQpe3JldHVybiBWdC5nZXROb3JtYWwodGhpcy5hLHRoaXMuYix0aGlzLmMsdCl9Z2V0UGxhbmUodCl7cmV0dXJuIHQuc2V0RnJvbUNvcGxhbmFyUG9pbnRzKHRoaXMuYSx0aGlzLmIsdGhpcy5jKX1nZXRCYXJ5Y29vcmQodCxlKXtyZXR1cm4gVnQuZ2V0QmFyeWNvb3JkKHQsdGhpcy5hLHRoaXMuYix0aGlzLmMsZSl9Z2V0VVYodCxlLHMsaSxyKXtyZXR1cm4gVnQuZ2V0VVYodCx0aGlzLmEsdGhpcy5iLHRoaXMuYyxlLHMsaSxyKX1jb250YWluc1BvaW50KHQpe3JldHVybiBWdC5jb250YWluc1BvaW50KHQsdGhpcy5hLHRoaXMuYix0aGlzLmMpfWlzRnJvbnRGYWNpbmcodCl7cmV0dXJuIFZ0LmlzRnJvbnRGYWNpbmcodGhpcy5hLHRoaXMuYix0aGlzLmMsdCl9aW50ZXJzZWN0c0JveCh0KXtyZXR1cm4gdC5pbnRlcnNlY3RzVHJpYW5nbGUodGhpcyl9Y2xvc2VzdFBvaW50VG9Qb2ludCh0LGUpe2NvbnN0IHM9dGhpcy5hLGk9dGhpcy5iLHI9dGhpcy5jO2xldCBuLG87VHQuc3ViVmVjdG9ycyhpLHMpLEV0LnN1YlZlY3RvcnMocixzKSxQdC5zdWJWZWN0b3JzKHQscyk7Y29uc3QgYT1UdC5kb3QoUHQpLGg9RXQuZG90KFB0KTtpZihhPD0wJiZoPD0wKXJldHVybiBlLmNvcHkocyk7Q3Quc3ViVmVjdG9ycyh0LGkpO2NvbnN0IGw9VHQuZG90KEN0KSxjPUV0LmRvdChDdCk7aWYobD49MCYmYzw9bClyZXR1cm4gZS5jb3B5KGkpO2NvbnN0IHU9YSpjLWwqaDtpZih1PD0wJiZhPj0wJiZsPD0wKXJldHVybiBuPWEvKGEtbCksZS5jb3B5KHMpLmFkZFNjYWxlZFZlY3RvcihUdCxuKTtGdC5zdWJWZWN0b3JzKHQscik7Y29uc3QgZD1UdC5kb3QoRnQpLG09RXQuZG90KEZ0KTtpZihtPj0wJiZkPD1tKXJldHVybiBlLmNvcHkocik7Y29uc3QgeT1kKmgtYSptO2lmKHk8PTAmJmg+PTAmJm08PTApcmV0dXJuIG89aC8oaC1tKSxlLmNvcHkocykuYWRkU2NhbGVkVmVjdG9yKEV0LG8pO2NvbnN0IHA9bCptLWQqYztpZihwPD0wJiZjLWw+PTAmJmQtbT49MClyZXR1cm4ga3Quc3ViVmVjdG9ycyhyLGkpLG89KGMtbCkvKGMtbCsoZC1tKSksZS5jb3B5KGkpLmFkZFNjYWxlZFZlY3RvcihrdCxvKTtjb25zdCB4PTEvKHAreSt1KTtyZXR1cm4gbj15Kngsbz11KngsZS5jb3B5KHMpLmFkZFNjYWxlZFZlY3RvcihUdCxuKS5hZGRTY2FsZWRWZWN0b3IoRXQsbyl9ZXF1YWxzKHQpe3JldHVybiB0LmEuZXF1YWxzKHRoaXMuYSkmJnQuYi5lcXVhbHModGhpcy5iKSYmdC5jLmVxdWFscyh0aGlzLmMpfX1jb25zdCBSdD1uZXcgRSxxdD1uZXcgaDtjbGFzcyBVdHtjb25zdHJ1Y3Rvcih0LGUscyl7aWYoQXJyYXkuaXNBcnJheSh0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJUSFJFRS5CdWZmZXJBdHRyaWJ1dGU6IGFycmF5IHNob3VsZCBiZSBhIFR5cGVkIEFycmF5LiIpO3RoaXMuaXNCdWZmZXJBdHRyaWJ1dGU9ITAsdGhpcy5uYW1lPSIiLHRoaXMuYXJyYXk9dCx0aGlzLml0ZW1TaXplPWUsdGhpcy5jb3VudD12b2lkIDAhPT10P3QubGVuZ3RoL2U6MCx0aGlzLm5vcm1hbGl6ZWQ9ITA9PT1zLHRoaXMudXNhZ2U9MzUwNDQsdGhpcy51cGRhdGVSYW5nZT17b2Zmc2V0OjAsY291bnQ6LTF9LHRoaXMudmVyc2lvbj0wfW9uVXBsb2FkQ2FsbGJhY2soKXt9c2V0IG5lZWRzVXBkYXRlKHQpeyEwPT09dCYmdGhpcy52ZXJzaW9uKyt9c2V0VXNhZ2UodCl7cmV0dXJuIHRoaXMudXNhZ2U9dCx0aGlzfWNvcHkodCl7cmV0dXJuIHRoaXMubmFtZT10Lm5hbWUsdGhpcy5hcnJheT1uZXcgdC5hcnJheS5jb25zdHJ1Y3Rvcih0LmFycmF5KSx0aGlzLml0ZW1TaXplPXQuaXRlbVNpemUsdGhpcy5jb3VudD10LmNvdW50LHRoaXMubm9ybWFsaXplZD10Lm5vcm1hbGl6ZWQsdGhpcy51c2FnZT10LnVzYWdlLHRoaXN9Y29weUF0KHQsZSxzKXt0Kj10aGlzLml0ZW1TaXplLHMqPWUuaXRlbVNpemU7Zm9yKGxldCBpPTAscj10aGlzLml0ZW1TaXplO2k8cjtpKyspdGhpcy5hcnJheVt0K2ldPWUuYXJyYXlbcytpXTtyZXR1cm4gdGhpc31jb3B5QXJyYXkodCl7cmV0dXJuIHRoaXMuYXJyYXkuc2V0KHQpLHRoaXN9Y29weUNvbG9yc0FycmF5KHQpe2NvbnN0IGU9dGhpcy5hcnJheTtsZXQgcz0wO2ZvcihsZXQgaT0wLHI9dC5sZW5ndGg7aTxyO2krKyl7bGV0IHI9dFtpXTt2b2lkIDA9PT1yJiYoY29uc29sZS53YXJuKCJUSFJFRS5CdWZmZXJBdHRyaWJ1dGUuY29weUNvbG9yc0FycmF5KCk6IGNvbG9yIGlzIHVuZGVmaW5lZCIsaSkscj1uZXcgTSksZVtzKytdPXIucixlW3MrK109ci5nLGVbcysrXT1yLmJ9cmV0dXJuIHRoaXN9Y29weVZlY3RvcjJzQXJyYXkodCl7Y29uc3QgZT10aGlzLmFycmF5O2xldCBzPTA7Zm9yKGxldCBpPTAscj10Lmxlbmd0aDtpPHI7aSsrKXtsZXQgcj10W2ldO3ZvaWQgMD09PXImJihjb25zb2xlLndhcm4oIlRIUkVFLkJ1ZmZlckF0dHJpYnV0ZS5jb3B5VmVjdG9yMnNBcnJheSgpOiB2ZWN0b3IgaXMgdW5kZWZpbmVkIixpKSxyPW5ldyBoKSxlW3MrK109ci54LGVbcysrXT1yLnl9cmV0dXJuIHRoaXN9Y29weVZlY3RvcjNzQXJyYXkodCl7Y29uc3QgZT10aGlzLmFycmF5O2xldCBzPTA7Zm9yKGxldCBpPTAscj10Lmxlbmd0aDtpPHI7aSsrKXtsZXQgcj10W2ldO3ZvaWQgMD09PXImJihjb25zb2xlLndhcm4oIlRIUkVFLkJ1ZmZlckF0dHJpYnV0ZS5jb3B5VmVjdG9yM3NBcnJheSgpOiB2ZWN0b3IgaXMgdW5kZWZpbmVkIixpKSxyPW5ldyBFKSxlW3MrK109ci54LGVbcysrXT1yLnksZVtzKytdPXIuen1yZXR1cm4gdGhpc31jb3B5VmVjdG9yNHNBcnJheSh0KXtjb25zdCBlPXRoaXMuYXJyYXk7bGV0IHM9MDtmb3IobGV0IGk9MCxyPXQubGVuZ3RoO2k8cjtpKyspe2xldCByPXRbaV07dm9pZCAwPT09ciYmKGNvbnNvbGUud2FybigiVEhSRUUuQnVmZmVyQXR0cmlidXRlLmNvcHlWZWN0b3I0c0FycmF5KCk6IHZlY3RvciBpcyB1bmRlZmluZWQiLGkpLHI9bmV3IEIpLGVbcysrXT1yLngsZVtzKytdPXIueSxlW3MrK109ci56LGVbcysrXT1yLnd9cmV0dXJuIHRoaXN9YXBwbHlNYXRyaXgzKHQpe2lmKDI9PT10aGlzLml0ZW1TaXplKWZvcihsZXQgZT0wLHM9dGhpcy5jb3VudDtlPHM7ZSsrKXF0LmZyb21CdWZmZXJBdHRyaWJ1dGUodGhpcyxlKSxxdC5hcHBseU1hdHJpeDModCksdGhpcy5zZXRYWShlLHF0LngscXQueSk7ZWxzZSBpZigzPT09dGhpcy5pdGVtU2l6ZSlmb3IobGV0IGU9MCxzPXRoaXMuY291bnQ7ZTxzO2UrKylSdC5mcm9tQnVmZmVyQXR0cmlidXRlKHRoaXMsZSksUnQuYXBwbHlNYXRyaXgzKHQpLHRoaXMuc2V0WFlaKGUsUnQueCxSdC55LFJ0LnopO3JldHVybiB0aGlzfWFwcGx5TWF0cml4NCh0KXtmb3IobGV0IGU9MCxzPXRoaXMuY291bnQ7ZTxzO2UrKylSdC5mcm9tQnVmZmVyQXR0cmlidXRlKHRoaXMsZSksUnQuYXBwbHlNYXRyaXg0KHQpLHRoaXMuc2V0WFlaKGUsUnQueCxSdC55LFJ0LnopO3JldHVybiB0aGlzfWFwcGx5Tm9ybWFsTWF0cml4KHQpe2ZvcihsZXQgZT0wLHM9dGhpcy5jb3VudDtlPHM7ZSsrKVJ0LmZyb21CdWZmZXJBdHRyaWJ1dGUodGhpcyxlKSxSdC5hcHBseU5vcm1hbE1hdHJpeCh0KSx0aGlzLnNldFhZWihlLFJ0LngsUnQueSxSdC56KTtyZXR1cm4gdGhpc310cmFuc2Zvcm1EaXJlY3Rpb24odCl7Zm9yKGxldCBlPTAscz10aGlzLmNvdW50O2U8cztlKyspUnQuZnJvbUJ1ZmZlckF0dHJpYnV0ZSh0aGlzLGUpLFJ0LnRyYW5zZm9ybURpcmVjdGlvbih0KSx0aGlzLnNldFhZWihlLFJ0LngsUnQueSxSdC56KTtyZXR1cm4gdGhpc31zZXQodCl7bGV0IGU9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOjA7cmV0dXJuIHRoaXMuYXJyYXkuc2V0KHQsZSksdGhpc31nZXRYKHQpe3JldHVybiB0aGlzLmFycmF5W3QqdGhpcy5pdGVtU2l6ZV19c2V0WCh0LGUpe3JldHVybiB0aGlzLmFycmF5W3QqdGhpcy5pdGVtU2l6ZV09ZSx0aGlzfWdldFkodCl7cmV0dXJuIHRoaXMuYXJyYXlbdCp0aGlzLml0ZW1TaXplKzFdfXNldFkodCxlKXtyZXR1cm4gdGhpcy5hcnJheVt0KnRoaXMuaXRlbVNpemUrMV09ZSx0aGlzfWdldFoodCl7cmV0dXJuIHRoaXMuYXJyYXlbdCp0aGlzLml0ZW1TaXplKzJdfXNldFoodCxlKXtyZXR1cm4gdGhpcy5hcnJheVt0KnRoaXMuaXRlbVNpemUrMl09ZSx0aGlzfWdldFcodCl7cmV0dXJuIHRoaXMuYXJyYXlbdCp0aGlzLml0ZW1TaXplKzNdfXNldFcodCxlKXtyZXR1cm4gdGhpcy5hcnJheVt0KnRoaXMuaXRlbVNpemUrM109ZSx0aGlzfXNldFhZKHQsZSxzKXtyZXR1cm4gdCo9dGhpcy5pdGVtU2l6ZSx0aGlzLmFycmF5W3QrMF09ZSx0aGlzLmFycmF5W3QrMV09cyx0aGlzfXNldFhZWih0LGUscyxpKXtyZXR1cm4gdCo9dGhpcy5pdGVtU2l6ZSx0aGlzLmFycmF5W3QrMF09ZSx0aGlzLmFycmF5W3QrMV09cyx0aGlzLmFycmF5W3QrMl09aSx0aGlzfXNldFhZWlcodCxlLHMsaSxyKXtyZXR1cm4gdCo9dGhpcy5pdGVtU2l6ZSx0aGlzLmFycmF5W3QrMF09ZSx0aGlzLmFycmF5W3QrMV09cyx0aGlzLmFycmF5W3QrMl09aSx0aGlzLmFycmF5W3QrM109cix0aGlzfW9uVXBsb2FkKHQpe3JldHVybiB0aGlzLm9uVXBsb2FkQ2FsbGJhY2s9dCx0aGlzfWNsb25lKCl7cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKHRoaXMuYXJyYXksdGhpcy5pdGVtU2l6ZSkuY29weSh0aGlzKX10b0pTT04oKXtjb25zdCB0PXtpdGVtU2l6ZTp0aGlzLml0ZW1TaXplLHR5cGU6dGhpcy5hcnJheS5jb25zdHJ1Y3Rvci5uYW1lLGFycmF5OkFycmF5LmZyb20odGhpcy5hcnJheSksbm9ybWFsaXplZDp0aGlzLm5vcm1hbGl6ZWR9O3JldHVybiIiIT09dGhpcy5uYW1lJiYodC5uYW1lPXRoaXMubmFtZSksMzUwNDQhPT10aGlzLnVzYWdlJiYodC51c2FnZT10aGlzLnVzYWdlKSwwPT09dGhpcy51cGRhdGVSYW5nZS5vZmZzZXQmJi0xPT09dGhpcy51cGRhdGVSYW5nZS5jb3VudHx8KHQudXBkYXRlUmFuZ2U9dGhpcy51cGRhdGVSYW5nZSksdH19Y2xhc3MgT3QgZXh0ZW5kcyBVdHtjb25zdHJ1Y3Rvcih0LGUscyl7c3VwZXIobmV3IFVpbnQxNkFycmF5KHQpLGUscyl9fWNsYXNzIEh0IGV4dGVuZHMgVXR7Y29uc3RydWN0b3IodCxlLHMpe3N1cGVyKG5ldyBVaW50MzJBcnJheSh0KSxlLHMpfX1jbGFzcyBJdCBleHRlbmRzIFV0e2NvbnN0cnVjdG9yKHQsZSxzKXtzdXBlcihuZXcgRmxvYXQzMkFycmF5KHQpLGUscyl9fWxldCBOdD0wO2NvbnN0IEx0PW5ldyAkLFd0PW5ldyB2dCxYdD1uZXcgRSxEdD1uZXcgQyxZdD1uZXcgQyxadD1uZXcgRTtjbGFzcyBHdCBleHRlbmRzIGl7Y29uc3RydWN0b3IoKXtzdXBlcigpLHRoaXMuaXNCdWZmZXJHZW9tZXRyeT0hMCxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiaWQiLHt2YWx1ZTpOdCsrfSksdGhpcy51dWlkPW4oKSx0aGlzLm5hbWU9IiIsdGhpcy50eXBlPSJCdWZmZXJHZW9tZXRyeSIsdGhpcy5pbmRleD1udWxsLHRoaXMuYXR0cmlidXRlcz17fSx0aGlzLm1vcnBoQXR0cmlidXRlcz17fSx0aGlzLm1vcnBoVGFyZ2V0c1JlbGF0aXZlPSExLHRoaXMuZ3JvdXBzPVtdLHRoaXMuYm91bmRpbmdCb3g9bnVsbCx0aGlzLmJvdW5kaW5nU3BoZXJlPW51bGwsdGhpcy5kcmF3UmFuZ2U9e3N0YXJ0OjAsY291bnQ6MS8wfSx0aGlzLnVzZXJEYXRhPXt9fWdldEluZGV4KCl7cmV0dXJuIHRoaXMuaW5kZXh9c2V0SW5kZXgodCl7cmV0dXJuIEFycmF5LmlzQXJyYXkodCk/dGhpcy5pbmRleD1uZXcoZnVuY3Rpb24odCl7Zm9yKGxldCBlPXQubGVuZ3RoLTE7ZT49MDstLWUpaWYodFtlXT42NTUzNSlyZXR1cm4hMDtyZXR1cm4hMX0odCk/SHQ6T3QpKHQsMSk6dGhpcy5pbmRleD10LHRoaXN9Z2V0QXR0cmlidXRlKHQpe3JldHVybiB0aGlzLmF0dHJpYnV0ZXNbdF19c2V0QXR0cmlidXRlKHQsZSl7cmV0dXJuIHRoaXMuYXR0cmlidXRlc1t0XT1lLHRoaXN9ZGVsZXRlQXR0cmlidXRlKHQpe3JldHVybiBkZWxldGUgdGhpcy5hdHRyaWJ1dGVzW3RdLHRoaXN9aGFzQXR0cmlidXRlKHQpe3JldHVybiB2b2lkIDAhPT10aGlzLmF0dHJpYnV0ZXNbdF19YWRkR3JvdXAodCxlKXtsZXQgcz1hcmd1bWVudHMubGVuZ3RoPjImJnZvaWQgMCE9PWFyZ3VtZW50c1syXT9hcmd1bWVudHNbMl06MDt0aGlzLmdyb3Vwcy5wdXNoKHtzdGFydDp0LGNvdW50OmUsbWF0ZXJpYWxJbmRleDpzfSl9Y2xlYXJHcm91cHMoKXt0aGlzLmdyb3Vwcz1bXX1zZXREcmF3UmFuZ2UodCxlKXt0aGlzLmRyYXdSYW5nZS5zdGFydD10LHRoaXMuZHJhd1JhbmdlLmNvdW50PWV9YXBwbHlNYXRyaXg0KHQpe2NvbnN0IGU9dGhpcy5hdHRyaWJ1dGVzLnBvc2l0aW9uO3ZvaWQgMCE9PWUmJihlLmFwcGx5TWF0cml4NCh0KSxlLm5lZWRzVXBkYXRlPSEwKTtjb25zdCBzPXRoaXMuYXR0cmlidXRlcy5ub3JtYWw7aWYodm9pZCAwIT09cyl7Y29uc3QgZT0obmV3IGwpLmdldE5vcm1hbE1hdHJpeCh0KTtzLmFwcGx5Tm9ybWFsTWF0cml4KGUpLHMubmVlZHNVcGRhdGU9ITB9Y29uc3QgaT10aGlzLmF0dHJpYnV0ZXMudGFuZ2VudDtyZXR1cm4gdm9pZCAwIT09aSYmKGkudHJhbnNmb3JtRGlyZWN0aW9uKHQpLGkubmVlZHNVcGRhdGU9ITApLG51bGwhPT10aGlzLmJvdW5kaW5nQm94JiZ0aGlzLmNvbXB1dGVCb3VuZGluZ0JveCgpLG51bGwhPT10aGlzLmJvdW5kaW5nU3BoZXJlJiZ0aGlzLmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpLHRoaXN9YXBwbHlRdWF0ZXJuaW9uKHQpe3JldHVybiBMdC5tYWtlUm90YXRpb25Gcm9tUXVhdGVybmlvbih0KSx0aGlzLmFwcGx5TWF0cml4NChMdCksdGhpc31yb3RhdGVYKHQpe3JldHVybiBMdC5tYWtlUm90YXRpb25YKHQpLHRoaXMuYXBwbHlNYXRyaXg0KEx0KSx0aGlzfXJvdGF0ZVkodCl7cmV0dXJuIEx0Lm1ha2VSb3RhdGlvblkodCksdGhpcy5hcHBseU1hdHJpeDQoTHQpLHRoaXN9cm90YXRlWih0KXtyZXR1cm4gTHQubWFrZVJvdGF0aW9uWih0KSx0aGlzLmFwcGx5TWF0cml4NChMdCksdGhpc310cmFuc2xhdGUodCxlLHMpe3JldHVybiBMdC5tYWtlVHJhbnNsYXRpb24odCxlLHMpLHRoaXMuYXBwbHlNYXRyaXg0KEx0KSx0aGlzfXNjYWxlKHQsZSxzKXtyZXR1cm4gTHQubWFrZVNjYWxlKHQsZSxzKSx0aGlzLmFwcGx5TWF0cml4NChMdCksdGhpc31sb29rQXQodCl7cmV0dXJuIFd0Lmxvb2tBdCh0KSxXdC51cGRhdGVNYXRyaXgoKSx0aGlzLmFwcGx5TWF0cml4NChXdC5tYXRyaXgpLHRoaXN9Y2VudGVyKCl7cmV0dXJuIHRoaXMuY29tcHV0ZUJvdW5kaW5nQm94KCksdGhpcy5ib3VuZGluZ0JveC5nZXRDZW50ZXIoWHQpLm5lZ2F0ZSgpLHRoaXMudHJhbnNsYXRlKFh0LngsWHQueSxYdC56KSx0aGlzfXNldEZyb21Qb2ludHModCl7Y29uc3QgZT1bXTtmb3IobGV0IHM9MCxpPXQubGVuZ3RoO3M8aTtzKyspe2NvbnN0IGk9dFtzXTtlLnB1c2goaS54LGkueSxpLnp8fDApfXJldHVybiB0aGlzLnNldEF0dHJpYnV0ZSgicG9zaXRpb24iLG5ldyBJdChlLDMpKSx0aGlzfWNvbXB1dGVCb3VuZGluZ0JveCgpe251bGw9PT10aGlzLmJvdW5kaW5nQm94JiYodGhpcy5ib3VuZGluZ0JveD1uZXcgQyk7Y29uc3QgdD10aGlzLmF0dHJpYnV0ZXMucG9zaXRpb24sZT10aGlzLm1vcnBoQXR0cmlidXRlcy5wb3NpdGlvbjtpZih0JiZ0LmlzR0xCdWZmZXJBdHRyaWJ1dGUpcmV0dXJuIGNvbnNvbGUuZXJyb3IoJ1RIUkVFLkJ1ZmZlckdlb21ldHJ5LmNvbXB1dGVCb3VuZGluZ0JveCgpOiBHTEJ1ZmZlckF0dHJpYnV0ZSByZXF1aXJlcyBhIG1hbnVhbCBib3VuZGluZyBib3guIEFsdGVybmF0aXZlbHkgc2V0ICJtZXNoLmZydXN0dW1DdWxsZWQiIHRvICJmYWxzZSIuJyx0aGlzKSx2b2lkIHRoaXMuYm91bmRpbmdCb3guc2V0KG5ldyBFKC0xLzAsLTEvMCwtMS8wKSxuZXcgRSgxLzAsMS8wLDEvMCkpO2lmKHZvaWQgMCE9PXQpe2lmKHRoaXMuYm91bmRpbmdCb3guc2V0RnJvbUJ1ZmZlckF0dHJpYnV0ZSh0KSxlKWZvcihsZXQgdD0wLHM9ZS5sZW5ndGg7dDxzO3QrKyl7Y29uc3Qgcz1lW3RdO0R0LnNldEZyb21CdWZmZXJBdHRyaWJ1dGUocyksdGhpcy5tb3JwaFRhcmdldHNSZWxhdGl2ZT8oWnQuYWRkVmVjdG9ycyh0aGlzLmJvdW5kaW5nQm94Lm1pbixEdC5taW4pLHRoaXMuYm91bmRpbmdCb3guZXhwYW5kQnlQb2ludChadCksWnQuYWRkVmVjdG9ycyh0aGlzLmJvdW5kaW5nQm94Lm1heCxEdC5tYXgpLHRoaXMuYm91bmRpbmdCb3guZXhwYW5kQnlQb2ludChadCkpOih0aGlzLmJvdW5kaW5nQm94LmV4cGFuZEJ5UG9pbnQoRHQubWluKSx0aGlzLmJvdW5kaW5nQm94LmV4cGFuZEJ5UG9pbnQoRHQubWF4KSl9fWVsc2UgdGhpcy5ib3VuZGluZ0JveC5tYWtlRW1wdHkoKTsoaXNOYU4odGhpcy5ib3VuZGluZ0JveC5taW4ueCl8fGlzTmFOKHRoaXMuYm91bmRpbmdCb3gubWluLnkpfHxpc05hTih0aGlzLmJvdW5kaW5nQm94Lm1pbi56KSkmJmNvbnNvbGUuZXJyb3IoJ1RIUkVFLkJ1ZmZlckdlb21ldHJ5LmNvbXB1dGVCb3VuZGluZ0JveCgpOiBDb21wdXRlZCBtaW4vbWF4IGhhdmUgTmFOIHZhbHVlcy4gVGhlICJwb3NpdGlvbiIgYXR0cmlidXRlIGlzIGxpa2VseSB0byBoYXZlIE5hTiB2YWx1ZXMuJyx0aGlzKX1jb21wdXRlQm91bmRpbmdTcGhlcmUoKXtudWxsPT09dGhpcy5ib3VuZGluZ1NwaGVyZSYmKHRoaXMuYm91bmRpbmdTcGhlcmU9bmV3IEopO2NvbnN0IHQ9dGhpcy5hdHRyaWJ1dGVzLnBvc2l0aW9uLGU9dGhpcy5tb3JwaEF0dHJpYnV0ZXMucG9zaXRpb247aWYodCYmdC5pc0dMQnVmZmVyQXR0cmlidXRlKXJldHVybiBjb25zb2xlLmVycm9yKCdUSFJFRS5CdWZmZXJHZW9tZXRyeS5jb21wdXRlQm91bmRpbmdTcGhlcmUoKTogR0xCdWZmZXJBdHRyaWJ1dGUgcmVxdWlyZXMgYSBtYW51YWwgYm91bmRpbmcgc3BoZXJlLiBBbHRlcm5hdGl2ZWx5IHNldCAibWVzaC5mcnVzdHVtQ3VsbGVkIiB0byAiZmFsc2UiLicsdGhpcyksdm9pZCB0aGlzLmJvdW5kaW5nU3BoZXJlLnNldChuZXcgRSwxLzApO2lmKHQpe2NvbnN0IHM9dGhpcy5ib3VuZGluZ1NwaGVyZS5jZW50ZXI7aWYoRHQuc2V0RnJvbUJ1ZmZlckF0dHJpYnV0ZSh0KSxlKWZvcihsZXQgdD0wLHM9ZS5sZW5ndGg7dDxzO3QrKyl7Y29uc3Qgcz1lW3RdO1l0LnNldEZyb21CdWZmZXJBdHRyaWJ1dGUocyksdGhpcy5tb3JwaFRhcmdldHNSZWxhdGl2ZT8oWnQuYWRkVmVjdG9ycyhEdC5taW4sWXQubWluKSxEdC5leHBhbmRCeVBvaW50KFp0KSxadC5hZGRWZWN0b3JzKER0Lm1heCxZdC5tYXgpLER0LmV4cGFuZEJ5UG9pbnQoWnQpKTooRHQuZXhwYW5kQnlQb2ludChZdC5taW4pLER0LmV4cGFuZEJ5UG9pbnQoWXQubWF4KSl9RHQuZ2V0Q2VudGVyKHMpO2xldCBpPTA7Zm9yKGxldCBlPTAscj10LmNvdW50O2U8cjtlKyspWnQuZnJvbUJ1ZmZlckF0dHJpYnV0ZSh0LGUpLGk9TWF0aC5tYXgoaSxzLmRpc3RhbmNlVG9TcXVhcmVkKFp0KSk7aWYoZSlmb3IobGV0IHI9MCxuPWUubGVuZ3RoO3I8bjtyKyspe2NvbnN0IG49ZVtyXSxvPXRoaXMubW9ycGhUYXJnZXRzUmVsYXRpdmU7Zm9yKGxldCBlPTAscj1uLmNvdW50O2U8cjtlKyspWnQuZnJvbUJ1ZmZlckF0dHJpYnV0ZShuLGUpLG8mJihYdC5mcm9tQnVmZmVyQXR0cmlidXRlKHQsZSksWnQuYWRkKFh0KSksaT1NYXRoLm1heChpLHMuZGlzdGFuY2VUb1NxdWFyZWQoWnQpKX10aGlzLmJvdW5kaW5nU3BoZXJlLnJhZGl1cz1NYXRoLnNxcnQoaSksaXNOYU4odGhpcy5ib3VuZGluZ1NwaGVyZS5yYWRpdXMpJiZjb25zb2xlLmVycm9yKCdUSFJFRS5CdWZmZXJHZW9tZXRyeS5jb21wdXRlQm91bmRpbmdTcGhlcmUoKTogQ29tcHV0ZWQgcmFkaXVzIGlzIE5hTi4gVGhlICJwb3NpdGlvbiIgYXR0cmlidXRlIGlzIGxpa2VseSB0byBoYXZlIE5hTiB2YWx1ZXMuJyx0aGlzKX19Y29tcHV0ZVRhbmdlbnRzKCl7Y29uc3QgdD10aGlzLmluZGV4LGU9dGhpcy5hdHRyaWJ1dGVzO2lmKG51bGw9PT10fHx2b2lkIDA9PT1lLnBvc2l0aW9ufHx2b2lkIDA9PT1lLm5vcm1hbHx8dm9pZCAwPT09ZS51dilyZXR1cm4gdm9pZCBjb25zb2xlLmVycm9yKCJUSFJFRS5CdWZmZXJHZW9tZXRyeTogLmNvbXB1dGVUYW5nZW50cygpIGZhaWxlZC4gTWlzc2luZyByZXF1aXJlZCBhdHRyaWJ1dGVzIChpbmRleCwgcG9zaXRpb24sIG5vcm1hbCBvciB1dikiKTtjb25zdCBzPXQuYXJyYXksaT1lLnBvc2l0aW9uLmFycmF5LHI9ZS5ub3JtYWwuYXJyYXksbj1lLnV2LmFycmF5LG89aS5sZW5ndGgvMzshMT09PXRoaXMuaGFzQXR0cmlidXRlKCJ0YW5nZW50IikmJnRoaXMuc2V0QXR0cmlidXRlKCJ0YW5nZW50IixuZXcgVXQobmV3IEZsb2F0MzJBcnJheSg0Km8pLDQpKTtjb25zdCBhPXRoaXMuZ2V0QXR0cmlidXRlKCJ0YW5nZW50IikuYXJyYXksbD1bXSxjPVtdO2ZvcihsZXQgdD0wO3Q8bzt0KyspbFt0XT1uZXcgRSxjW3RdPW5ldyBFO2NvbnN0IHU9bmV3IEUsZD1uZXcgRSxtPW5ldyBFLHk9bmV3IGgscD1uZXcgaCx4PW5ldyBoLGY9bmV3IEUsZz1uZXcgRTtmdW5jdGlvbiBiKHQsZSxzKXt1LmZyb21BcnJheShpLDMqdCksZC5mcm9tQXJyYXkoaSwzKmUpLG0uZnJvbUFycmF5KGksMypzKSx5LmZyb21BcnJheShuLDIqdCkscC5mcm9tQXJyYXkobiwyKmUpLHguZnJvbUFycmF5KG4sMipzKSxkLnN1Yih1KSxtLnN1Yih1KSxwLnN1Yih5KSx4LnN1Yih5KTtjb25zdCByPTEvKHAueCp4LnkteC54KnAueSk7aXNGaW5pdGUocikmJihmLmNvcHkoZCkubXVsdGlwbHlTY2FsYXIoeC55KS5hZGRTY2FsZWRWZWN0b3IobSwtcC55KS5tdWx0aXBseVNjYWxhcihyKSxnLmNvcHkobSkubXVsdGlwbHlTY2FsYXIocC54KS5hZGRTY2FsZWRWZWN0b3IoZCwteC54KS5tdWx0aXBseVNjYWxhcihyKSxsW3RdLmFkZChmKSxsW2VdLmFkZChmKSxsW3NdLmFkZChmKSxjW3RdLmFkZChnKSxjW2VdLmFkZChnKSxjW3NdLmFkZChnKSl9bGV0IHc9dGhpcy5ncm91cHM7MD09PXcubGVuZ3RoJiYodz1be3N0YXJ0OjAsY291bnQ6cy5sZW5ndGh9XSk7Zm9yKGxldCB0PTAsZT13Lmxlbmd0aDt0PGU7Kyt0KXtjb25zdCBlPXdbdF0saT1lLnN0YXJ0O2ZvcihsZXQgdD1pLHI9aStlLmNvdW50O3Q8cjt0Kz0zKWIoc1t0KzBdLHNbdCsxXSxzW3QrMl0pfWNvbnN0IE09bmV3IEUsej1uZXcgRSx2PW5ldyBFLF89bmV3IEU7ZnVuY3Rpb24gQSh0KXt2LmZyb21BcnJheShyLDMqdCksXy5jb3B5KHYpO2NvbnN0IGU9bFt0XTtNLmNvcHkoZSksTS5zdWIodi5tdWx0aXBseVNjYWxhcih2LmRvdChlKSkpLm5vcm1hbGl6ZSgpLHouY3Jvc3NWZWN0b3JzKF8sZSk7Y29uc3Qgcz16LmRvdChjW3RdKTwwPy0xOjE7YVs0KnRdPU0ueCxhWzQqdCsxXT1NLnksYVs0KnQrMl09TS56LGFbNCp0KzNdPXN9Zm9yKGxldCB0PTAsZT13Lmxlbmd0aDt0PGU7Kyt0KXtjb25zdCBlPXdbdF0saT1lLnN0YXJ0O2ZvcihsZXQgdD1pLHI9aStlLmNvdW50O3Q8cjt0Kz0zKUEoc1t0KzBdKSxBKHNbdCsxXSksQShzW3QrMl0pfX1jb21wdXRlVmVydGV4Tm9ybWFscygpe2NvbnN0IHQ9dGhpcy5pbmRleCxlPXRoaXMuZ2V0QXR0cmlidXRlKCJwb3NpdGlvbiIpO2lmKHZvaWQgMCE9PWUpe2xldCBzPXRoaXMuZ2V0QXR0cmlidXRlKCJub3JtYWwiKTtpZih2b2lkIDA9PT1zKXM9bmV3IFV0KG5ldyBGbG9hdDMyQXJyYXkoMyplLmNvdW50KSwzKSx0aGlzLnNldEF0dHJpYnV0ZSgibm9ybWFsIixzKTtlbHNlIGZvcihsZXQgdD0wLGU9cy5jb3VudDt0PGU7dCsrKXMuc2V0WFlaKHQsMCwwLDApO2NvbnN0IGk9bmV3IEUscj1uZXcgRSxuPW5ldyBFLG89bmV3IEUsYT1uZXcgRSxoPW5ldyBFLGw9bmV3IEUsYz1uZXcgRTtpZih0KWZvcihsZXQgdT0wLGQ9dC5jb3VudDt1PGQ7dSs9Myl7Y29uc3QgZD10LmdldFgodSswKSxtPXQuZ2V0WCh1KzEpLHk9dC5nZXRYKHUrMik7aS5mcm9tQnVmZmVyQXR0cmlidXRlKGUsZCksci5mcm9tQnVmZmVyQXR0cmlidXRlKGUsbSksbi5mcm9tQnVmZmVyQXR0cmlidXRlKGUseSksbC5zdWJWZWN0b3JzKG4sciksYy5zdWJWZWN0b3JzKGksciksbC5jcm9zcyhjKSxvLmZyb21CdWZmZXJBdHRyaWJ1dGUocyxkKSxhLmZyb21CdWZmZXJBdHRyaWJ1dGUocyxtKSxoLmZyb21CdWZmZXJBdHRyaWJ1dGUocyx5KSxvLmFkZChsKSxhLmFkZChsKSxoLmFkZChsKSxzLnNldFhZWihkLG8ueCxvLnksby56KSxzLnNldFhZWihtLGEueCxhLnksYS56KSxzLnNldFhZWih5LGgueCxoLnksaC56KX1lbHNlIGZvcihsZXQgdD0wLG89ZS5jb3VudDt0PG87dCs9MylpLmZyb21CdWZmZXJBdHRyaWJ1dGUoZSx0KzApLHIuZnJvbUJ1ZmZlckF0dHJpYnV0ZShlLHQrMSksbi5mcm9tQnVmZmVyQXR0cmlidXRlKGUsdCsyKSxsLnN1YlZlY3RvcnMobixyKSxjLnN1YlZlY3RvcnMoaSxyKSxsLmNyb3NzKGMpLHMuc2V0WFlaKHQrMCxsLngsbC55LGwueikscy5zZXRYWVoodCsxLGwueCxsLnksbC56KSxzLnNldFhZWih0KzIsbC54LGwueSxsLnopO3RoaXMubm9ybWFsaXplTm9ybWFscygpLHMubmVlZHNVcGRhdGU9ITB9fW1lcmdlKHQsZSl7aWYoIXR8fCF0LmlzQnVmZmVyR2VvbWV0cnkpcmV0dXJuIHZvaWQgY29uc29sZS5lcnJvcigiVEhSRUUuQnVmZmVyR2VvbWV0cnkubWVyZ2UoKTogZ2VvbWV0cnkgbm90IGFuIGluc3RhbmNlIG9mIFRIUkVFLkJ1ZmZlckdlb21ldHJ5LiIsdCk7dm9pZCAwPT09ZSYmKGU9MCxjb25zb2xlLndhcm4oIlRIUkVFLkJ1ZmZlckdlb21ldHJ5Lm1lcmdlKCk6IE92ZXJ3cml0aW5nIG9yaWdpbmFsIGdlb21ldHJ5LCBzdGFydGluZyBhdCBvZmZzZXQ9MC4gVXNlIEJ1ZmZlckdlb21ldHJ5VXRpbHMubWVyZ2VCdWZmZXJHZW9tZXRyaWVzKCkgZm9yIGxvc3NsZXNzIG1lcmdlLiIpKTtjb25zdCBzPXRoaXMuYXR0cmlidXRlcztmb3IoY29uc3QgaSBpbiBzKXtpZih2b2lkIDA9PT10LmF0dHJpYnV0ZXNbaV0pY29udGludWU7Y29uc3Qgcj1zW2ldLmFycmF5LG49dC5hdHRyaWJ1dGVzW2ldLG89bi5hcnJheSxhPW4uaXRlbVNpemUqZSxoPU1hdGgubWluKG8ubGVuZ3RoLHIubGVuZ3RoLWEpO2ZvcihsZXQgdD0wLGU9YTt0PGg7dCsrLGUrKylyW2VdPW9bdF19cmV0dXJuIHRoaXN9bm9ybWFsaXplTm9ybWFscygpe2NvbnN0IHQ9dGhpcy5hdHRyaWJ1dGVzLm5vcm1hbDtmb3IobGV0IGU9MCxzPXQuY291bnQ7ZTxzO2UrKyladC5mcm9tQnVmZmVyQXR0cmlidXRlKHQsZSksWnQubm9ybWFsaXplKCksdC5zZXRYWVooZSxadC54LFp0LnksWnQueil9dG9Ob25JbmRleGVkKCl7ZnVuY3Rpb24gdCh0LGUpe2NvbnN0IHM9dC5hcnJheSxpPXQuaXRlbVNpemUscj10Lm5vcm1hbGl6ZWQsbj1uZXcgcy5jb25zdHJ1Y3RvcihlLmxlbmd0aCppKTtsZXQgbz0wLGE9MDtmb3IobGV0IHI9MCxoPWUubGVuZ3RoO3I8aDtyKyspe289dC5pc0ludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlP2Vbcl0qdC5kYXRhLnN0cmlkZSt0Lm9mZnNldDplW3JdKmk7Zm9yKGxldCB0PTA7dDxpO3QrKyluW2ErK109c1tvKytdfXJldHVybiBuZXcgVXQobixpLHIpfWlmKG51bGw9PT10aGlzLmluZGV4KXJldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLkJ1ZmZlckdlb21ldHJ5LnRvTm9uSW5kZXhlZCgpOiBCdWZmZXJHZW9tZXRyeSBpcyBhbHJlYWR5IG5vbi1pbmRleGVkLiIpLHRoaXM7Y29uc3QgZT1uZXcgR3Qscz10aGlzLmluZGV4LmFycmF5LGk9dGhpcy5hdHRyaWJ1dGVzO2Zvcihjb25zdCByIGluIGkpe2NvbnN0IG49dChpW3JdLHMpO2Uuc2V0QXR0cmlidXRlKHIsbil9Y29uc3Qgcj10aGlzLm1vcnBoQXR0cmlidXRlcztmb3IoY29uc3QgaSBpbiByKXtjb25zdCBuPVtdLG89cltpXTtmb3IobGV0IGU9MCxpPW8ubGVuZ3RoO2U8aTtlKyspe2NvbnN0IGk9dChvW2VdLHMpO24ucHVzaChpKX1lLm1vcnBoQXR0cmlidXRlc1tpXT1ufWUubW9ycGhUYXJnZXRzUmVsYXRpdmU9dGhpcy5tb3JwaFRhcmdldHNSZWxhdGl2ZTtjb25zdCBuPXRoaXMuZ3JvdXBzO2ZvcihsZXQgdD0wLHM9bi5sZW5ndGg7dDxzO3QrKyl7Y29uc3Qgcz1uW3RdO2UuYWRkR3JvdXAocy5zdGFydCxzLmNvdW50LHMubWF0ZXJpYWxJbmRleCl9cmV0dXJuIGV9dG9KU09OKCl7Y29uc3QgdD17bWV0YWRhdGE6e3ZlcnNpb246NC41LHR5cGU6IkJ1ZmZlckdlb21ldHJ5IixnZW5lcmF0b3I6IkJ1ZmZlckdlb21ldHJ5LnRvSlNPTiJ9fTtpZih0LnV1aWQ9dGhpcy51dWlkLHQudHlwZT10aGlzLnR5cGUsIiIhPT10aGlzLm5hbWUmJih0Lm5hbWU9dGhpcy5uYW1lKSxPYmplY3Qua2V5cyh0aGlzLnVzZXJEYXRhKS5sZW5ndGg+MCYmKHQudXNlckRhdGE9dGhpcy51c2VyRGF0YSksdm9pZCAwIT09dGhpcy5wYXJhbWV0ZXJzKXtjb25zdCBlPXRoaXMucGFyYW1ldGVycztmb3IoY29uc3QgcyBpbiBlKXZvaWQgMCE9PWVbc10mJih0W3NdPWVbc10pO3JldHVybiB0fXQuZGF0YT17YXR0cmlidXRlczp7fX07Y29uc3QgZT10aGlzLmluZGV4O251bGwhPT1lJiYodC5kYXRhLmluZGV4PXt0eXBlOmUuYXJyYXkuY29uc3RydWN0b3IubmFtZSxhcnJheTpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChlLmFycmF5KX0pO2NvbnN0IHM9dGhpcy5hdHRyaWJ1dGVzO2Zvcihjb25zdCBlIGluIHMpe2NvbnN0IGk9c1tlXTt0LmRhdGEuYXR0cmlidXRlc1tlXT1pLnRvSlNPTih0LmRhdGEpfWNvbnN0IGk9e307bGV0IHI9ITE7Zm9yKGNvbnN0IGUgaW4gdGhpcy5tb3JwaEF0dHJpYnV0ZXMpe2NvbnN0IHM9dGhpcy5tb3JwaEF0dHJpYnV0ZXNbZV0sbj1bXTtmb3IobGV0IGU9MCxpPXMubGVuZ3RoO2U8aTtlKyspe2NvbnN0IGk9c1tlXTtuLnB1c2goaS50b0pTT04odC5kYXRhKSl9bi5sZW5ndGg+MCYmKGlbZV09bixyPSEwKX1yJiYodC5kYXRhLm1vcnBoQXR0cmlidXRlcz1pLHQuZGF0YS5tb3JwaFRhcmdldHNSZWxhdGl2ZT10aGlzLm1vcnBoVGFyZ2V0c1JlbGF0aXZlKTtjb25zdCBuPXRoaXMuZ3JvdXBzO24ubGVuZ3RoPjAmJih0LmRhdGEuZ3JvdXBzPUpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkobikpKTtjb25zdCBvPXRoaXMuYm91bmRpbmdTcGhlcmU7cmV0dXJuIG51bGwhPT1vJiYodC5kYXRhLmJvdW5kaW5nU3BoZXJlPXtjZW50ZXI6by5jZW50ZXIudG9BcnJheSgpLHJhZGl1czpvLnJhZGl1c30pLHR9Y2xvbmUoKXtyZXR1cm4obmV3IHRoaXMuY29uc3RydWN0b3IpLmNvcHkodGhpcyl9Y29weSh0KXt0aGlzLmluZGV4PW51bGwsdGhpcy5hdHRyaWJ1dGVzPXt9LHRoaXMubW9ycGhBdHRyaWJ1dGVzPXt9LHRoaXMuZ3JvdXBzPVtdLHRoaXMuYm91bmRpbmdCb3g9bnVsbCx0aGlzLmJvdW5kaW5nU3BoZXJlPW51bGw7Y29uc3QgZT17fTt0aGlzLm5hbWU9dC5uYW1lO2NvbnN0IHM9dC5pbmRleDtudWxsIT09cyYmdGhpcy5zZXRJbmRleChzLmNsb25lKGUpKTtjb25zdCBpPXQuYXR0cmlidXRlcztmb3IoY29uc3QgdCBpbiBpKXtjb25zdCBzPWlbdF07dGhpcy5zZXRBdHRyaWJ1dGUodCxzLmNsb25lKGUpKX1jb25zdCByPXQubW9ycGhBdHRyaWJ1dGVzO2Zvcihjb25zdCB0IGluIHIpe2NvbnN0IHM9W10saT1yW3RdO2ZvcihsZXQgdD0wLHI9aS5sZW5ndGg7dDxyO3QrKylzLnB1c2goaVt0XS5jbG9uZShlKSk7dGhpcy5tb3JwaEF0dHJpYnV0ZXNbdF09c310aGlzLm1vcnBoVGFyZ2V0c1JlbGF0aXZlPXQubW9ycGhUYXJnZXRzUmVsYXRpdmU7Y29uc3Qgbj10Lmdyb3Vwcztmb3IobGV0IHQ9MCxlPW4ubGVuZ3RoO3Q8ZTt0Kyspe2NvbnN0IGU9blt0XTt0aGlzLmFkZEdyb3VwKGUuc3RhcnQsZS5jb3VudCxlLm1hdGVyaWFsSW5kZXgpfWNvbnN0IG89dC5ib3VuZGluZ0JveDtudWxsIT09byYmKHRoaXMuYm91bmRpbmdCb3g9by5jbG9uZSgpKTtjb25zdCBhPXQuYm91bmRpbmdTcGhlcmU7cmV0dXJuIG51bGwhPT1hJiYodGhpcy5ib3VuZGluZ1NwaGVyZT1hLmNsb25lKCkpLHRoaXMuZHJhd1JhbmdlLnN0YXJ0PXQuZHJhd1JhbmdlLnN0YXJ0LHRoaXMuZHJhd1JhbmdlLmNvdW50PXQuZHJhd1JhbmdlLmNvdW50LHRoaXMudXNlckRhdGE9dC51c2VyRGF0YSx2b2lkIDAhPT10LnBhcmFtZXRlcnMmJih0aGlzLnBhcmFtZXRlcnM9T2JqZWN0LmFzc2lnbih7fSx0LnBhcmFtZXRlcnMpKSx0aGlzfWRpc3Bvc2UoKXt0aGlzLmRpc3BhdGNoRXZlbnQoe3R5cGU6ImRpc3Bvc2UifSl9fWNvbnN0IGp0PW5ldyBFLFF0PW5ldyBFLEp0PW5ldyBsO2NsYXNzICR0e2NvbnN0cnVjdG9yKCl7bGV0IHQ9YXJndW1lbnRzLmxlbmd0aD4wJiZ2b2lkIDAhPT1hcmd1bWVudHNbMF0/YXJndW1lbnRzWzBdOm5ldyBFKDEsMCwwKSxlPWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTowO3RoaXMuaXNQbGFuZT0hMCx0aGlzLm5vcm1hbD10LHRoaXMuY29uc3RhbnQ9ZX1zZXQodCxlKXtyZXR1cm4gdGhpcy5ub3JtYWwuY29weSh0KSx0aGlzLmNvbnN0YW50PWUsdGhpc31zZXRDb21wb25lbnRzKHQsZSxzLGkpe3JldHVybiB0aGlzLm5vcm1hbC5zZXQodCxlLHMpLHRoaXMuY29uc3RhbnQ9aSx0aGlzfXNldEZyb21Ob3JtYWxBbmRDb3BsYW5hclBvaW50KHQsZSl7cmV0dXJuIHRoaXMubm9ybWFsLmNvcHkodCksdGhpcy5jb25zdGFudD0tZS5kb3QodGhpcy5ub3JtYWwpLHRoaXN9c2V0RnJvbUNvcGxhbmFyUG9pbnRzKHQsZSxzKXtjb25zdCBpPWp0LnN1YlZlY3RvcnMocyxlKS5jcm9zcyhRdC5zdWJWZWN0b3JzKHQsZSkpLm5vcm1hbGl6ZSgpO3JldHVybiB0aGlzLnNldEZyb21Ob3JtYWxBbmRDb3BsYW5hclBvaW50KGksdCksdGhpc31jb3B5KHQpe3JldHVybiB0aGlzLm5vcm1hbC5jb3B5KHQubm9ybWFsKSx0aGlzLmNvbnN0YW50PXQuY29uc3RhbnQsdGhpc31ub3JtYWxpemUoKXtjb25zdCB0PTEvdGhpcy5ub3JtYWwubGVuZ3RoKCk7cmV0dXJuIHRoaXMubm9ybWFsLm11bHRpcGx5U2NhbGFyKHQpLHRoaXMuY29uc3RhbnQqPXQsdGhpc31uZWdhdGUoKXtyZXR1cm4gdGhpcy5jb25zdGFudCo9LTEsdGhpcy5ub3JtYWwubmVnYXRlKCksdGhpc31kaXN0YW5jZVRvUG9pbnQodCl7cmV0dXJuIHRoaXMubm9ybWFsLmRvdCh0KSt0aGlzLmNvbnN0YW50fWRpc3RhbmNlVG9TcGhlcmUodCl7cmV0dXJuIHRoaXMuZGlzdGFuY2VUb1BvaW50KHQuY2VudGVyKS10LnJhZGl1c31wcm9qZWN0UG9pbnQodCxlKXtyZXR1cm4gZS5jb3B5KHRoaXMubm9ybWFsKS5tdWx0aXBseVNjYWxhcigtdGhpcy5kaXN0YW5jZVRvUG9pbnQodCkpLmFkZCh0KX1pbnRlcnNlY3RMaW5lKHQsZSl7Y29uc3Qgcz10LmRlbHRhKGp0KSxpPXRoaXMubm9ybWFsLmRvdChzKTtpZigwPT09aSlyZXR1cm4gMD09PXRoaXMuZGlzdGFuY2VUb1BvaW50KHQuc3RhcnQpP2UuY29weSh0LnN0YXJ0KTpudWxsO2NvbnN0IHI9LSh0LnN0YXJ0LmRvdCh0aGlzLm5vcm1hbCkrdGhpcy5jb25zdGFudCkvaTtyZXR1cm4gcjwwfHxyPjE/bnVsbDplLmNvcHkocykubXVsdGlwbHlTY2FsYXIocikuYWRkKHQuc3RhcnQpfWludGVyc2VjdHNMaW5lKHQpe2NvbnN0IGU9dGhpcy5kaXN0YW5jZVRvUG9pbnQodC5zdGFydCkscz10aGlzLmRpc3RhbmNlVG9Qb2ludCh0LmVuZCk7cmV0dXJuIGU8MCYmcz4wfHxzPDAmJmU+MH1pbnRlcnNlY3RzQm94KHQpe3JldHVybiB0LmludGVyc2VjdHNQbGFuZSh0aGlzKX1pbnRlcnNlY3RzU3BoZXJlKHQpe3JldHVybiB0LmludGVyc2VjdHNQbGFuZSh0aGlzKX1jb3BsYW5hclBvaW50KHQpe3JldHVybiB0LmNvcHkodGhpcy5ub3JtYWwpLm11bHRpcGx5U2NhbGFyKC10aGlzLmNvbnN0YW50KX1hcHBseU1hdHJpeDQodCxlKXtjb25zdCBzPWV8fEp0LmdldE5vcm1hbE1hdHJpeCh0KSxpPXRoaXMuY29wbGFuYXJQb2ludChqdCkuYXBwbHlNYXRyaXg0KHQpLHI9dGhpcy5ub3JtYWwuYXBwbHlNYXRyaXgzKHMpLm5vcm1hbGl6ZSgpO3JldHVybiB0aGlzLmNvbnN0YW50PS1pLmRvdChyKSx0aGlzfXRyYW5zbGF0ZSh0KXtyZXR1cm4gdGhpcy5jb25zdGFudC09dC5kb3QodGhpcy5ub3JtYWwpLHRoaXN9ZXF1YWxzKHQpe3JldHVybiB0Lm5vcm1hbC5lcXVhbHModGhpcy5ub3JtYWwpJiZ0LmNvbnN0YW50PT09dGhpcy5jb25zdGFudH1jbG9uZSgpe3JldHVybihuZXcgdGhpcy5jb25zdHJ1Y3RvcikuY29weSh0aGlzKX19Y29uc3QgS3Q9bmV3IEUsdGU9bmV3IEU7Y2xhc3MgZWV7Y29uc3RydWN0b3IoKXtsZXQgdD1hcmd1bWVudHMubGVuZ3RoPjAmJnZvaWQgMCE9PWFyZ3VtZW50c1swXT9hcmd1bWVudHNbMF06bmV3IEUsZT1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06bmV3IEU7dGhpcy5zdGFydD10LHRoaXMuZW5kPWV9c2V0KHQsZSl7cmV0dXJuIHRoaXMuc3RhcnQuY29weSh0KSx0aGlzLmVuZC5jb3B5KGUpLHRoaXN9Y29weSh0KXtyZXR1cm4gdGhpcy5zdGFydC5jb3B5KHQuc3RhcnQpLHRoaXMuZW5kLmNvcHkodC5lbmQpLHRoaXN9Z2V0Q2VudGVyKHQpe3JldHVybiB0LmFkZFZlY3RvcnModGhpcy5zdGFydCx0aGlzLmVuZCkubXVsdGlwbHlTY2FsYXIoLjUpfWRlbHRhKHQpe3JldHVybiB0LnN1YlZlY3RvcnModGhpcy5lbmQsdGhpcy5zdGFydCl9ZGlzdGFuY2VTcSgpe3JldHVybiB0aGlzLnN0YXJ0LmRpc3RhbmNlVG9TcXVhcmVkKHRoaXMuZW5kKX1kaXN0YW5jZSgpe3JldHVybiB0aGlzLnN0YXJ0LmRpc3RhbmNlVG8odGhpcy5lbmQpfWF0KHQsZSl7cmV0dXJuIHRoaXMuZGVsdGEoZSkubXVsdGlwbHlTY2FsYXIodCkuYWRkKHRoaXMuc3RhcnQpfWNsb3Nlc3RQb2ludFRvUG9pbnRQYXJhbWV0ZXIodCxlKXtLdC5zdWJWZWN0b3JzKHQsdGhpcy5zdGFydCksdGUuc3ViVmVjdG9ycyh0aGlzLmVuZCx0aGlzLnN0YXJ0KTtjb25zdCBzPXRlLmRvdCh0ZSk7bGV0IGk9dGUuZG90KEt0KS9zO3JldHVybiBlJiYoaT1vKGksMCwxKSksaX1jbG9zZXN0UG9pbnRUb1BvaW50KHQsZSxzKXtjb25zdCBpPXRoaXMuY2xvc2VzdFBvaW50VG9Qb2ludFBhcmFtZXRlcih0LGUpO3JldHVybiB0aGlzLmRlbHRhKHMpLm11bHRpcGx5U2NhbGFyKGkpLmFkZCh0aGlzLnN0YXJ0KX1hcHBseU1hdHJpeDQodCl7cmV0dXJuIHRoaXMuc3RhcnQuYXBwbHlNYXRyaXg0KHQpLHRoaXMuZW5kLmFwcGx5TWF0cml4NCh0KSx0aGlzfWVxdWFscyh0KXtyZXR1cm4gdC5zdGFydC5lcXVhbHModGhpcy5zdGFydCkmJnQuZW5kLmVxdWFscyh0aGlzLmVuZCl9Y2xvbmUoKXtyZXR1cm4obmV3IHRoaXMuY29uc3RydWN0b3IpLmNvcHkodGhpcyl9fSJ1bmRlZmluZWQiIT10eXBlb2YgX19USFJFRV9ERVZUT09MU19fJiZfX1RIUkVFX0RFVlRPT0xTX18uZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoInJlZ2lzdGVyIix7ZGV0YWlsOntyZXZpc2lvbjoiMTQyIn19KSksInVuZGVmaW5lZCIhPXR5cGVvZiB3aW5kb3cmJih3aW5kb3cuX19USFJFRV9fP2NvbnNvbGUud2FybigiV0FSTklORzogTXVsdGlwbGUgaW5zdGFuY2VzIG9mIFRocmVlLmpzIGJlaW5nIGltcG9ydGVkLiIpOndpbmRvdy5fX1RIUkVFX189IjE0MiIpO2NvbnN0IHNlPTEuMjUsaWU9NjU1MzUscmU9TWF0aC5wb3coMiwtMjQpO2NsYXNzIG5le2NvbnN0cnVjdG9yKCl7fX1mdW5jdGlvbiBvZSh0LGUscyl7cmV0dXJuIHMubWluLng9ZVt0XSxzLm1pbi55PWVbdCsxXSxzLm1pbi56PWVbdCsyXSxzLm1heC54PWVbdCszXSxzLm1heC55PWVbdCs0XSxzLm1heC56PWVbdCs1XSxzfWZ1bmN0aW9uIGFlKHQpe2xldCBlPS0xLHM9LTEvMDtmb3IobGV0IGk9MDtpPDM7aSsrKXtjb25zdCByPXRbaSszXS10W2ldO3I+cyYmKHM9cixlPWkpfXJldHVybiBlfWZ1bmN0aW9uIGhlKHQsZSl7ZS5zZXQodCl9ZnVuY3Rpb24gbGUodCxlLHMpe2xldCBpLHI7Zm9yKGxldCBuPTA7bjwzO24rKyl7Y29uc3Qgbz1uKzM7aT10W25dLHI9ZVtuXSxzW25dPWk8cj9pOnIsaT10W29dLHI9ZVtvXSxzW29dPWk+cj9pOnJ9fWZ1bmN0aW9uIGNlKHQsZSxzKXtmb3IobGV0IGk9MDtpPDM7aSsrKXtjb25zdCByPWVbdCsyKmldLG49ZVt0KzIqaSsxXSxvPXItbixhPXIrbjtvPHNbaV0mJihzW2ldPW8pLGE+c1tpKzNdJiYoc1tpKzNdPWEpfX1mdW5jdGlvbiB1ZSh0KXtjb25zdCBlPXRbM10tdFswXSxzPXRbNF0tdFsxXSxpPXRbNV0tdFsyXTtyZXR1cm4gMiooZSpzK3MqaStpKmUpfWZ1bmN0aW9uIGRlKHQsZSxzLGkpe2xldCByPWFyZ3VtZW50cy5sZW5ndGg+NCYmdm9pZCAwIT09YXJndW1lbnRzWzRdP2FyZ3VtZW50c1s0XTpudWxsLG49MS8wLG89MS8wLGE9MS8wLGg9LTEvMCxsPS0xLzAsYz0tMS8wLHU9MS8wLGQ9MS8wLG09MS8wLHk9LTEvMCxwPS0xLzAseD0tMS8wO2NvbnN0IGY9bnVsbCE9PXI7Zm9yKGxldCBpPTYqZSxyPTYqKGUrcyk7aTxyO2krPTYpe2NvbnN0IGU9dFtpKzBdLHM9dFtpKzFdLHI9ZS1zLGc9ZStzO3I8biYmKG49ciksZz5oJiYoaD1nKSxmJiZlPHUmJih1PWUpLGYmJmU+eSYmKHk9ZSk7Y29uc3QgYj10W2krMl0sdz10W2krM10sTT1iLXcsej1iK3c7TTxvJiYobz1NKSx6PmwmJihsPXopLGYmJmI8ZCYmKGQ9YiksZiYmYj5wJiYocD1iKTtjb25zdCB2PXRbaSs0XSxfPXRbaSs1XSxBPXYtXyxTPXYrXztBPGEmJihhPUEpLFM+YyYmKGM9UyksZiYmdjxtJiYobT12KSxmJiZ2PngmJih4PXYpfWlbMF09bixpWzFdPW8saVsyXT1hLGlbM109aCxpWzRdPWwsaVs1XT1jLGYmJihyWzBdPXUsclsxXT1kLHJbMl09bSxyWzNdPXkscls0XT1wLHJbNV09eCl9ZnVuY3Rpb24gbWUodCxlLHMsaSxyKXtsZXQgbj1zLG89cytpLTE7Y29uc3QgYT1yLnBvcyxoPTIqci5heGlzO2Zvcig7Oyl7Zm9yKDtuPD1vJiZlWzYqbitoXTxhOyluKys7Zm9yKDtuPD1vJiZlWzYqbytoXT49YTspby0tO2lmKCEobjxvKSlyZXR1cm4gbjtmb3IobGV0IHM9MDtzPDM7cysrKXtsZXQgaT10WzMqbitzXTt0WzMqbitzXT10WzMqbytzXSx0WzMqbytzXT1pO2xldCByPWVbNipuKzIqcyswXTtlWzYqbisyKnMrMF09ZVs2Km8rMipzKzBdLGVbNipvKzIqcyswXT1yO2xldCBhPWVbNipuKzIqcysxXTtlWzYqbisyKnMrMV09ZVs2Km8rMipzKzFdLGVbNipvKzIqcysxXT1hfW4rKyxvLS19fWNvbnN0IHllPTMyLHBlPSh0LGUpPT50LmNhbmRpZGF0ZS1lLmNhbmRpZGF0ZSx4ZT1uZXcgQXJyYXkoeWUpLmZpbGwoKS5tYXAoKCgpPT4oe2NvdW50OjAsYm91bmRzOm5ldyBGbG9hdDMyQXJyYXkoNikscmlnaHRDYWNoZUJvdW5kczpuZXcgRmxvYXQzMkFycmF5KDYpLGxlZnRDYWNoZUJvdW5kczpuZXcgRmxvYXQzMkFycmF5KDYpLGNhbmRpZGF0ZTowfSkpKSxmZT1uZXcgRmxvYXQzMkFycmF5KDYpO2Z1bmN0aW9uIGdlKHQsZSxzLGkscixuKXtsZXQgbz0tMSxhPTA7aWYoMD09PW4pbz1hZShlKSwtMSE9PW8mJihhPShlW29dK2VbbyszXSkvMik7ZWxzZSBpZigxPT09bilvPWFlKHQpLC0xIT09byYmKGE9ZnVuY3Rpb24odCxlLHMsaSl7bGV0IHI9MDtmb3IobGV0IG49ZSxvPWUrcztuPG87bisrKXIrPXRbNipuKzIqaV07cmV0dXJuIHIvc30ocyxpLHIsbykpO2Vsc2UgaWYoMj09PW4pe2NvbnN0IG49dWUodCk7bGV0IGg9c2Uqcjtjb25zdCBsPTYqaSxjPTYqKGkrcik7Zm9yKGxldCB0PTA7dDwzO3QrKyl7Y29uc3QgaT1lW3RdLHU9KGVbdCszXS1pKS95ZTtpZihyPDgpe2NvbnN0IGU9Wy4uLnhlXTtlLmxlbmd0aD1yO2xldCBpPTA7Zm9yKGxldCByPWw7cjxjO3IrPTYsaSsrKXtjb25zdCBuPWVbaV07bi5jYW5kaWRhdGU9c1tyKzIqdF0sbi5jb3VudD0wO2NvbnN0e2JvdW5kczpvLGxlZnRDYWNoZUJvdW5kczphLHJpZ2h0Q2FjaGVCb3VuZHM6aH09bjtmb3IobGV0IHQ9MDt0PDM7dCsrKWhbdF09MS8wLGhbdCszXT0tMS8wLGFbdF09MS8wLGFbdCszXT0tMS8wLG9bdF09MS8wLG9bdCszXT0tMS8wO2NlKHIscyxvKX1lLnNvcnQocGUpO2xldCB1PXI7Zm9yKGxldCB0PTA7dDx1O3QrKyl7Y29uc3Qgcz1lW3RdO2Zvcig7dCsxPHUmJmVbdCsxXS5jYW5kaWRhdGU9PT1zLmNhbmRpZGF0ZTspZS5zcGxpY2UodCsxLDEpLHUtLX1mb3IobGV0IGk9bDtpPGM7aSs9Nil7Y29uc3Qgcj1zW2krMip0XTtmb3IobGV0IHQ9MDt0PHU7dCsrKXtjb25zdCBuPWVbdF07cj49bi5jYW5kaWRhdGU/Y2UoaSxzLG4ucmlnaHRDYWNoZUJvdW5kcyk6KGNlKGkscyxuLmxlZnRDYWNoZUJvdW5kcyksbi5jb3VudCsrKX19Zm9yKGxldCBzPTA7czx1O3MrKyl7Y29uc3QgaT1lW3NdLGw9aS5jb3VudCxjPXItaS5jb3VudCx1PWkubGVmdENhY2hlQm91bmRzLGQ9aS5yaWdodENhY2hlQm91bmRzO2xldCBtPTA7MCE9PWwmJihtPXVlKHUpL24pO2xldCB5PTA7MCE9PWMmJih5PXVlKGQpL24pO2NvbnN0IHA9MStzZSoobSpsK3kqYyk7cDxoJiYobz10LGg9cCxhPWkuY2FuZGlkYXRlKX19ZWxzZXtmb3IobGV0IHQ9MDt0PHllO3QrKyl7Y29uc3QgZT14ZVt0XTtlLmNvdW50PTAsZS5jYW5kaWRhdGU9aSt1K3QqdTtjb25zdCBzPWUuYm91bmRzO2ZvcihsZXQgdD0wO3Q8Mzt0Kyspc1t0XT0xLzAsc1t0KzNdPS0xLzB9Zm9yKGxldCBlPWw7ZTxjO2UrPTYpe2xldCByPX5+KChzW2UrMip0XS1pKS91KTtyPj15ZSYmKHI9MzEpO2NvbnN0IG49eGVbcl07bi5jb3VudCsrLGNlKGUscyxuLmJvdW5kcyl9Y29uc3QgZT14ZVszMV07aGUoZS5ib3VuZHMsZS5yaWdodENhY2hlQm91bmRzKTtmb3IobGV0IHQ9MzA7dD49MDt0LS0pe2NvbnN0IGU9eGVbdF0scz14ZVt0KzFdO2xlKGUuYm91bmRzLHMucmlnaHRDYWNoZUJvdW5kcyxlLnJpZ2h0Q2FjaGVCb3VuZHMpfWxldCBkPTA7Zm9yKGxldCBlPTA7ZTwzMTtlKyspe2NvbnN0IHM9eGVbZV0saT1zLmNvdW50LGw9cy5ib3VuZHMsYz14ZVtlKzFdLnJpZ2h0Q2FjaGVCb3VuZHM7MCE9PWkmJigwPT09ZD9oZShsLGZlKTpsZShsLGZlLGZlKSksZCs9aTtsZXQgdT0wLG09MDswIT09ZCYmKHU9dWUoZmUpL24pO2NvbnN0IHk9ci1kOzAhPT15JiYobT11ZShjKS9uKTtjb25zdCBwPTErc2UqKHUqZCttKnkpO3A8aCYmKG89dCxoPXAsYT1zLmNhbmRpZGF0ZSl9fX19ZWxzZSBjb25zb2xlLndhcm4oYE1lc2hCVkg6IEludmFsaWQgYnVpbGQgc3RyYXRlZ3kgdmFsdWUgJHtufSB1c2VkLmApO3JldHVybntheGlzOm8scG9zOmF9fWZ1bmN0aW9uIGJlKHQsZSl7ZnVuY3Rpb24gcyh0KXtkJiZkKHQvbSl9ZnVuY3Rpb24gaShlLHIsZCl7bGV0IG09YXJndW1lbnRzLmxlbmd0aD4zJiZ2b2lkIDAhPT1hcmd1bWVudHNbM10/YXJndW1lbnRzWzNdOm51bGwscD1hcmd1bWVudHMubGVuZ3RoPjQmJnZvaWQgMCE9PWFyZ3VtZW50c1s0XT9hcmd1bWVudHNbNF06MDtpZigheSYmcD49aCYmKHk9ITAsbCYmKGNvbnNvbGUud2FybihgTWVzaEJWSDogTWF4IGRlcHRoIG9mICR7aH0gcmVhY2hlZCB3aGVuIGdlbmVyYXRpbmcgQlZILiBDb25zaWRlciBpbmNyZWFzaW5nIG1heERlcHRoLmApLGNvbnNvbGUud2Fybih0KSkpLGQ8PWN8fHA+PWgpcmV0dXJuIHMocitkKSxlLm9mZnNldD1yLGUuY291bnQ9ZCxlO2NvbnN0IHg9Z2UoZS5ib3VuZGluZ0RhdGEsbSxvLHIsZCx1KTtpZigtMT09PXguYXhpcylyZXR1cm4gcyhyK2QpLGUub2Zmc2V0PXIsZS5jb3VudD1kLGU7Y29uc3QgZj1tZShhLG8scixkLHgpO2lmKGY9PT1yfHxmPT09citkKXMocitkKSxlLm9mZnNldD1yLGUuY291bnQ9ZDtlbHNle2Uuc3BsaXRBeGlzPXguYXhpcztjb25zdCB0PW5ldyBuZSxzPXIsYT1mLXI7ZS5sZWZ0PXQsdC5ib3VuZGluZ0RhdGE9bmV3IEZsb2F0MzJBcnJheSg2KSxkZShvLHMsYSx0LmJvdW5kaW5nRGF0YSxuKSxpKHQscyxhLG4scCsxKTtjb25zdCBoPW5ldyBuZSxsPWYsYz1kLWE7ZS5yaWdodD1oLGguYm91bmRpbmdEYXRhPW5ldyBGbG9hdDMyQXJyYXkoNiksZGUobyxsLGMsaC5ib3VuZGluZ0RhdGEsbiksaShoLGwsYyxuLHArMSl9cmV0dXJuIGV9IWZ1bmN0aW9uKHQsZSl7aWYoIXQuaW5kZXgpe2NvbnN0IHM9dC5hdHRyaWJ1dGVzLnBvc2l0aW9uLmNvdW50LGk9ZS51c2VTaGFyZWRBcnJheUJ1ZmZlcj9TaGFyZWRBcnJheUJ1ZmZlcjpBcnJheUJ1ZmZlcjtsZXQgcjtyPXM+NjU1MzU/bmV3IFVpbnQzMkFycmF5KG5ldyBpKDQqcykpOm5ldyBVaW50MTZBcnJheShuZXcgaSgyKnMpKSx0LnNldEluZGV4KG5ldyBVdChyLDEpKTtmb3IobGV0IHQ9MDt0PHM7dCsrKXJbdF09dH19KHQsZSk7Y29uc3Qgcj1uZXcgRmxvYXQzMkFycmF5KDYpLG49bmV3IEZsb2F0MzJBcnJheSg2KSxvPWZ1bmN0aW9uKHQsZSl7Y29uc3Qgcz10LmF0dHJpYnV0ZXMucG9zaXRpb24saT1zLmFycmF5LHI9dC5pbmRleC5hcnJheSxuPXIubGVuZ3RoLzMsbz1uZXcgRmxvYXQzMkFycmF5KDYqbiksYT1zLm9mZnNldHx8MDtsZXQgaD0zO3MuaXNJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZSYmKGg9cy5kYXRhLnN0cmlkZSk7Zm9yKGxldCB0PTA7dDxuO3QrKyl7Y29uc3Qgcz0zKnQsbj02KnQsbD1yW3MrMF0qaCthLGM9cltzKzFdKmgrYSx1PXJbcysyXSpoK2E7Zm9yKGxldCB0PTA7dDwzO3QrKyl7Y29uc3Qgcz1pW2wrdF0scj1pW2MrdF0sYT1pW3UrdF07bGV0IGg9cztyPGgmJihoPXIpLGE8aCYmKGg9YSk7bGV0IGQ9cztyPmQmJihkPXIpLGE+ZCYmKGQ9YSk7Y29uc3QgbT0oZC1oKS8yLHk9Mip0O29bbit5KzBdPWgrbSxvW24reSsxXT1tKyhNYXRoLmFicyhoKSttKSpyZSxoPGVbdF0mJihlW3RdPWgpLGQ+ZVt0KzNdJiYoZVt0KzNdPWQpfX1yZXR1cm4gb30odCxyKSxhPXQuaW5kZXguYXJyYXksaD1lLm1heERlcHRoLGw9ZS52ZXJib3NlLGM9ZS5tYXhMZWFmVHJpcyx1PWUuc3RyYXRlZ3ksZD1lLm9uUHJvZ3Jlc3MsbT10LmluZGV4LmNvdW50LzM7bGV0IHk9ITE7Y29uc3QgcD1bXSx4PWZ1bmN0aW9uKHQpe2lmKCF0Lmdyb3Vwc3x8IXQuZ3JvdXBzLmxlbmd0aClyZXR1cm5be29mZnNldDowLGNvdW50OnQuaW5kZXguY291bnQvM31dO2NvbnN0IGU9W10scz1uZXcgU2V0O2Zvcihjb25zdCBlIG9mIHQuZ3JvdXBzKXMuYWRkKGUuc3RhcnQpLHMuYWRkKGUuc3RhcnQrZS5jb3VudCk7Y29uc3QgaT1BcnJheS5mcm9tKHMudmFsdWVzKCkpLnNvcnQoKCh0LGUpPT50LWUpKTtmb3IobGV0IHQ9MDt0PGkubGVuZ3RoLTE7dCsrKXtjb25zdCBzPWlbdF0scj1pW3QrMV07ZS5wdXNoKHtvZmZzZXQ6cy8zLGNvdW50OihyLXMpLzN9KX1yZXR1cm4gZX0odCk7aWYoMT09PXgubGVuZ3RoKXtjb25zdCB0PXhbMF0sZT1uZXcgbmU7ZS5ib3VuZGluZ0RhdGE9cixmdW5jdGlvbih0LGUscyxpKXtsZXQgcj0xLzAsbj0xLzAsbz0xLzAsYT0tMS8wLGg9LTEvMCxsPS0xLzA7Zm9yKGxldCBpPTYqZSxjPTYqKGUrcyk7aTxjO2krPTYpe2NvbnN0IGU9dFtpKzBdO2U8ciYmKHI9ZSksZT5hJiYoYT1lKTtjb25zdCBzPXRbaSsyXTtzPG4mJihuPXMpLHM+aCYmKGg9cyk7Y29uc3QgYz10W2krNF07YzxvJiYobz1jKSxjPmwmJihsPWMpfWlbMF09cixpWzFdPW4saVsyXT1vLGlbM109YSxpWzRdPWgsaVs1XT1sfShvLHQub2Zmc2V0LHQuY291bnQsbiksaShlLHQub2Zmc2V0LHQuY291bnQsbikscC5wdXNoKGUpfWVsc2UgZm9yKGxldCB0IG9mIHgpe2NvbnN0IGU9bmV3IG5lO2UuYm91bmRpbmdEYXRhPW5ldyBGbG9hdDMyQXJyYXkoNiksZGUobyx0Lm9mZnNldCx0LmNvdW50LGUuYm91bmRpbmdEYXRhLG4pLGkoZSx0Lm9mZnNldCx0LmNvdW50LG4pLHAucHVzaChlKX1yZXR1cm4gcH1jbGFzcyB3ZXtjb25zdHJ1Y3Rvcigpe3RoaXMubWluPTEvMCx0aGlzLm1heD0tMS8wfXNldEZyb21Qb2ludHNGaWVsZCh0LGUpe2xldCBzPTEvMCxpPS0xLzA7Zm9yKGxldCByPTAsbj10Lmxlbmd0aDtyPG47cisrKXtjb25zdCBuPXRbcl1bZV07cz1uPHM/bjpzLGk9bj5pP246aX10aGlzLm1pbj1zLHRoaXMubWF4PWl9c2V0RnJvbVBvaW50cyh0LGUpe2xldCBzPTEvMCxpPS0xLzA7Zm9yKGxldCByPTAsbj1lLmxlbmd0aDtyPG47cisrKXtjb25zdCBuPWVbcl0sbz10LmRvdChuKTtzPW88cz9vOnMsaT1vPmk/bzppfXRoaXMubWluPXMsdGhpcy5tYXg9aX1pc1NlcGFyYXRlZCh0KXtyZXR1cm4gdGhpcy5taW4+dC5tYXh8fHQubWluPnRoaXMubWF4fX13ZS5wcm90b3R5cGUuc2V0RnJvbUJveD1mdW5jdGlvbigpe2NvbnN0IHQ9bmV3IEU7cmV0dXJuIGZ1bmN0aW9uKGUscyl7Y29uc3QgaT1zLm1pbixyPXMubWF4O2xldCBuPTEvMCxvPS0xLzA7Zm9yKGxldCBzPTA7czw9MTtzKyspZm9yKGxldCBhPTA7YTw9MTthKyspZm9yKGxldCBoPTA7aDw9MTtoKyspe3QueD1pLngqcytyLngqKDEtcyksdC55PWkueSphK3IueSooMS1hKSx0Lno9aS56Kmgrci56KigxLWgpO2NvbnN0IGw9ZS5kb3QodCk7bj1NYXRoLm1pbihsLG4pLG89TWF0aC5tYXgobCxvKX10aGlzLm1pbj1uLHRoaXMubWF4PW99fSgpLGZ1bmN0aW9uKCl7Y29uc3QgdD1uZXcgd2V9KCk7Y29uc3QgTWU9ZnVuY3Rpb24oKXtjb25zdCB0PW5ldyBFLGU9bmV3IEUscz1uZXcgRTtyZXR1cm4gZnVuY3Rpb24oaSxyLG4pe2NvbnN0IG89aS5zdGFydCxhPXQsaD1yLnN0YXJ0LGw9ZTtzLnN1YlZlY3RvcnMobyxoKSx0LnN1YlZlY3RvcnMoaS5lbmQsaS5zdGFydCksZS5zdWJWZWN0b3JzKHIuZW5kLHIuc3RhcnQpO2NvbnN0IGM9cy5kb3QobCksdT1sLmRvdChhKSxkPWwuZG90KGwpLG09cy5kb3QoYSkseT1hLmRvdChhKSpkLXUqdTtsZXQgcCx4O3A9MCE9PXk/KGMqdS1tKmQpL3k6MCx4PShjK3AqdSkvZCxuLng9cCxuLnk9eH19KCksemU9ZnVuY3Rpb24oKXtjb25zdCB0PW5ldyBoLGU9bmV3IEUscz1uZXcgRTtyZXR1cm4gZnVuY3Rpb24oaSxyLG4sbyl7TWUoaSxyLHQpO2xldCBhPXQueCxoPXQueTtpZihhPj0wJiZhPD0xJiZoPj0wJiZoPD0xKXJldHVybiBpLmF0KGEsbiksdm9pZCByLmF0KGgsbyk7aWYoYT49MCYmYTw9MSlyZXR1cm4gaDwwP3IuYXQoMCxvKTpyLmF0KDEsbyksdm9pZCBpLmNsb3Nlc3RQb2ludFRvUG9pbnQobywhMCxuKTtpZihoPj0wJiZoPD0xKXJldHVybiBhPDA/aS5hdCgwLG4pOmkuYXQoMSxuKSx2b2lkIHIuY2xvc2VzdFBvaW50VG9Qb2ludChuLCEwLG8pO3tsZXQgdCxsO3Q9YTwwP2kuc3RhcnQ6aS5lbmQsbD1oPDA/ci5zdGFydDpyLmVuZDtjb25zdCBjPWUsdT1zO3JldHVybiBpLmNsb3Nlc3RQb2ludFRvUG9pbnQobCwhMCxlKSxyLmNsb3Nlc3RQb2ludFRvUG9pbnQodCwhMCxzKSxjLmRpc3RhbmNlVG9TcXVhcmVkKGwpPD11LmRpc3RhbmNlVG9TcXVhcmVkKHQpPyhuLmNvcHkoYyksdm9pZCBvLmNvcHkobCkpOihuLmNvcHkodCksdm9pZCBvLmNvcHkodSkpfX19KCksdmU9ZnVuY3Rpb24oKXtjb25zdCB0PW5ldyBFLGU9bmV3IEUscz1uZXcgJHQsaT1uZXcgZWU7cmV0dXJuIGZ1bmN0aW9uKHIsbil7Y29uc3R7cmFkaXVzOm8sY2VudGVyOmF9PXIse2E6aCxiOmwsYzpjfT1uO2kuc3RhcnQ9aCxpLmVuZD1sO2lmKGkuY2xvc2VzdFBvaW50VG9Qb2ludChhLCEwLHQpLmRpc3RhbmNlVG8oYSk8PW8pcmV0dXJuITA7aS5zdGFydD1oLGkuZW5kPWM7aWYoaS5jbG9zZXN0UG9pbnRUb1BvaW50KGEsITAsdCkuZGlzdGFuY2VUbyhhKTw9bylyZXR1cm4hMDtpLnN0YXJ0PWwsaS5lbmQ9YztpZihpLmNsb3Nlc3RQb2ludFRvUG9pbnQoYSwhMCx0KS5kaXN0YW5jZVRvKGEpPD1vKXJldHVybiEwO2NvbnN0IHU9bi5nZXRQbGFuZShzKTtpZihNYXRoLmFicyh1LmRpc3RhbmNlVG9Qb2ludChhKSk8PW8pe2NvbnN0IHQ9dS5wcm9qZWN0UG9pbnQoYSxlKTtpZihuLmNvbnRhaW5zUG9pbnQodCkpcmV0dXJuITB9cmV0dXJuITF9fSgpO2Z1bmN0aW9uIF9lKHQpe3JldHVybiBNYXRoLmFicyh0KTwxZS0xNX1jbGFzcyBBZSBleHRlbmRzIFZ0e2NvbnN0cnVjdG9yKCl7c3VwZXIoLi4uYXJndW1lbnRzKSx0aGlzLmlzRXh0ZW5kZWRUcmlhbmdsZT0hMCx0aGlzLnNhdEF4ZXM9bmV3IEFycmF5KDQpLmZpbGwoKS5tYXAoKCgpPT5uZXcgRSkpLHRoaXMuc2F0Qm91bmRzPW5ldyBBcnJheSg0KS5maWxsKCkubWFwKCgoKT0+bmV3IHdlKSksdGhpcy5wb2ludHM9W3RoaXMuYSx0aGlzLmIsdGhpcy5jXSx0aGlzLnNwaGVyZT1uZXcgSix0aGlzLnBsYW5lPW5ldyAkdCx0aGlzLm5lZWRzVXBkYXRlPSEwfWludGVyc2VjdHNTcGhlcmUodCl7cmV0dXJuIHZlKHQsdGhpcyl9dXBkYXRlKCl7Y29uc3QgdD10aGlzLmEsZT10aGlzLmIscz10aGlzLmMsaT10aGlzLnBvaW50cyxyPXRoaXMuc2F0QXhlcyxuPXRoaXMuc2F0Qm91bmRzLG89clswXSxhPW5bMF07dGhpcy5nZXROb3JtYWwobyksYS5zZXRGcm9tUG9pbnRzKG8saSk7Y29uc3QgaD1yWzFdLGw9blsxXTtoLnN1YlZlY3RvcnModCxlKSxsLnNldEZyb21Qb2ludHMoaCxpKTtjb25zdCBjPXJbMl0sdT1uWzJdO2Muc3ViVmVjdG9ycyhlLHMpLHUuc2V0RnJvbVBvaW50cyhjLGkpO2NvbnN0IGQ9clszXSxtPW5bM107ZC5zdWJWZWN0b3JzKHMsdCksbS5zZXRGcm9tUG9pbnRzKGQsaSksdGhpcy5zcGhlcmUuc2V0RnJvbVBvaW50cyh0aGlzLnBvaW50cyksdGhpcy5wbGFuZS5zZXRGcm9tTm9ybWFsQW5kQ29wbGFuYXJQb2ludChvLHQpLHRoaXMubmVlZHNVcGRhdGU9ITF9fUFlLnByb3RvdHlwZS5jbG9zZXN0UG9pbnRUb1NlZ21lbnQ9ZnVuY3Rpb24oKXtjb25zdCB0PW5ldyBFLGU9bmV3IEUscz1uZXcgZWU7cmV0dXJuIGZ1bmN0aW9uKGkpe2xldCByPWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTpudWxsLG49YXJndW1lbnRzLmxlbmd0aD4yJiZ2b2lkIDAhPT1hcmd1bWVudHNbMl0/YXJndW1lbnRzWzJdOm51bGw7Y29uc3R7c3RhcnQ6byxlbmQ6YX09aSxoPXRoaXMucG9pbnRzO2xldCBsLGM9MS8wO2ZvcihsZXQgbz0wO288MztvKyspe2NvbnN0IGE9KG8rMSklMztzLnN0YXJ0LmNvcHkoaFtvXSkscy5lbmQuY29weShoW2FdKSx6ZShzLGksdCxlKSxsPXQuZGlzdGFuY2VUb1NxdWFyZWQoZSksbDxjJiYoYz1sLHImJnIuY29weSh0KSxuJiZuLmNvcHkoZSkpfXJldHVybiB0aGlzLmNsb3Nlc3RQb2ludFRvUG9pbnQobyx0KSxsPW8uZGlzdGFuY2VUb1NxdWFyZWQodCksbDxjJiYoYz1sLHImJnIuY29weSh0KSxuJiZuLmNvcHkobykpLHRoaXMuY2xvc2VzdFBvaW50VG9Qb2ludChhLHQpLGw9YS5kaXN0YW5jZVRvU3F1YXJlZCh0KSxsPGMmJihjPWwsciYmci5jb3B5KHQpLG4mJm4uY29weShhKSksTWF0aC5zcXJ0KGMpfX0oKSxBZS5wcm90b3R5cGUuaW50ZXJzZWN0c1RyaWFuZ2xlPWZ1bmN0aW9uKCl7Y29uc3QgdD1uZXcgQWUsZT1uZXcgQXJyYXkoMykscz1uZXcgQXJyYXkoMyksaT1uZXcgd2Uscj1uZXcgd2Usbj1uZXcgRSxvPW5ldyBFLGE9bmV3IEUsaD1uZXcgRSxsPW5ldyBlZSxjPW5ldyBlZSx1PW5ldyBlZTtyZXR1cm4gZnVuY3Rpb24oZCl7bGV0IG09YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOm51bGw7dGhpcy5uZWVkc1VwZGF0ZSYmdGhpcy51cGRhdGUoKSxkLmlzRXh0ZW5kZWRUcmlhbmdsZT9kLm5lZWRzVXBkYXRlJiZkLnVwZGF0ZSgpOih0LmNvcHkoZCksdC51cGRhdGUoKSxkPXQpO2NvbnN0IHk9dGhpcy5wbGFuZSxwPWQucGxhbmU7aWYoTWF0aC5hYnMoeS5ub3JtYWwuZG90KHAubm9ybWFsKSk+MS0xZS0xMCl7Y29uc3QgdD10aGlzLnNhdEJvdW5kcyxvPXRoaXMuc2F0QXhlcztzWzBdPWQuYSxzWzFdPWQuYixzWzJdPWQuYztmb3IobGV0IGU9MDtlPDQ7ZSsrKXtjb25zdCByPXRbZV0sbj1vW2VdO2lmKGkuc2V0RnJvbVBvaW50cyhuLHMpLHIuaXNTZXBhcmF0ZWQoaSkpcmV0dXJuITF9Y29uc3QgYT1kLnNhdEJvdW5kcyxoPWQuc2F0QXhlcztlWzBdPXRoaXMuYSxlWzFdPXRoaXMuYixlWzJdPXRoaXMuYztmb3IobGV0IHQ9MDt0PDQ7dCsrKXtjb25zdCBzPWFbdF0scj1oW3RdO2lmKGkuc2V0RnJvbVBvaW50cyhyLGUpLHMuaXNTZXBhcmF0ZWQoaSkpcmV0dXJuITF9Zm9yKGxldCB0PTA7dDw0O3QrKyl7Y29uc3QgYT1vW3RdO2ZvcihsZXQgdD0wO3Q8NDt0Kyspe2NvbnN0IG89aFt0XTtpZihuLmNyb3NzVmVjdG9ycyhhLG8pLGkuc2V0RnJvbVBvaW50cyhuLGUpLHIuc2V0RnJvbVBvaW50cyhuLHMpLGkuaXNTZXBhcmF0ZWQocikpcmV0dXJuITF9fXJldHVybiBtJiYoY29uc29sZS53YXJuKCJFeHRlbmRlZFRyaWFuZ2xlLmludGVyc2VjdHNUcmlhbmdsZTogVHJpYW5nbGVzIGFyZSBjb3BsYW5hciB3aGljaCBkb2VzIG5vdCBzdXBwb3J0IGFuIG91dHB1dCBlZGdlLiBTZXR0aW5nIGVkZ2UgdG8gMCwgMCwgMC4iKSxtLnN0YXJ0LnNldCgwLDAsMCksbS5lbmQuc2V0KDAsMCwwKSksITB9e2NvbnN0IHQ9dGhpcy5wb2ludHM7bGV0IGU9ITEscz0wO2ZvcihsZXQgaT0wO2k8MztpKyspe2NvbnN0IHI9dFtpXSxuPXRbKGkrMSklM107bC5zdGFydC5jb3B5KHIpLGwuZW5kLmNvcHkobiksbC5kZWx0YShvKTtjb25zdCBhPWU/Yy5zdGFydDpjLmVuZCxoPV9lKHAuZGlzdGFuY2VUb1BvaW50KHIpKTtpZihfZShwLm5vcm1hbC5kb3QobykpJiZoKXtjLmNvcHkobCkscz0yO2JyZWFrfWlmKChwLmludGVyc2VjdExpbmUobCxhKXx8aCkmJiFfZShhLmRpc3RhbmNlVG8obikpKXtpZihzKyssZSlicmVhaztlPSEwfX1pZigxPT09cyYmdGhpcy5jb250YWluc1BvaW50KGMuZW5kKSlyZXR1cm4gbSYmKG0uc3RhcnQuY29weShjLmVuZCksbS5lbmQuY29weShjLmVuZCkpLCEwO2lmKDIhPT1zKXJldHVybiExO2NvbnN0IGk9ZC5wb2ludHM7bGV0IHI9ITEsbj0wO2ZvcihsZXQgdD0wO3Q8Mzt0Kyspe2NvbnN0IGU9aVt0XSxzPWlbKHQrMSklM107bC5zdGFydC5jb3B5KGUpLGwuZW5kLmNvcHkocyksbC5kZWx0YShhKTtjb25zdCBvPXI/dS5zdGFydDp1LmVuZCxoPV9lKHkuZGlzdGFuY2VUb1BvaW50KGUpKTtpZihfZSh5Lm5vcm1hbC5kb3QoYSkpJiZoKXt1LmNvcHkobCksbj0yO2JyZWFrfWlmKCh5LmludGVyc2VjdExpbmUobCxvKXx8aCkmJiFfZShvLmRpc3RhbmNlVG8ocykpKXtpZihuKysscilicmVhaztyPSEwfX1pZigxPT09biYmdGhpcy5jb250YWluc1BvaW50KHUuZW5kKSlyZXR1cm4gbSYmKG0uc3RhcnQuY29weSh1LmVuZCksbS5lbmQuY29weSh1LmVuZCkpLCEwO2lmKDIhPT1uKXJldHVybiExO2lmKGMuZGVsdGEobyksdS5kZWx0YShhKSxvLmRvdChhKTwwKXtsZXQgdD11LnN0YXJ0O3Uuc3RhcnQ9dS5lbmQsdS5lbmQ9dH1jb25zdCB4PWMuc3RhcnQuZG90KG8pLGY9Yy5lbmQuZG90KG8pLGc9dS5zdGFydC5kb3QobyksYj11LmVuZC5kb3Qobyksdz1mPGcsTT14PGI7cmV0dXJuKHg9PT1ifHxnPT09Znx8dyE9PU0pJiYobSYmKGguc3ViVmVjdG9ycyhjLnN0YXJ0LHUuc3RhcnQpLGguZG90KG8pPjA/bS5zdGFydC5jb3B5KGMuc3RhcnQpOm0uc3RhcnQuY29weSh1LnN0YXJ0KSxoLnN1YlZlY3RvcnMoYy5lbmQsdS5lbmQpLGguZG90KG8pPDA/bS5lbmQuY29weShjLmVuZCk6bS5lbmQuY29weSh1LmVuZCkpLCEwKX19fSgpLEFlLnByb3RvdHlwZS5kaXN0YW5jZVRvUG9pbnQ9ZnVuY3Rpb24oKXtjb25zdCB0PW5ldyBFO3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5jbG9zZXN0UG9pbnRUb1BvaW50KGUsdCksZS5kaXN0YW5jZVRvKHQpfX0oKSxBZS5wcm90b3R5cGUuZGlzdGFuY2VUb1RyaWFuZ2xlPWZ1bmN0aW9uKCl7Y29uc3QgdD1uZXcgRSxlPW5ldyBFLHM9WyJhIiwiYiIsImMiXSxpPW5ldyBlZSxyPW5ldyBlZTtyZXR1cm4gZnVuY3Rpb24obil7bGV0IG89YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOm51bGwsYT1hcmd1bWVudHMubGVuZ3RoPjImJnZvaWQgMCE9PWFyZ3VtZW50c1syXT9hcmd1bWVudHNbMl06bnVsbDtjb25zdCBoPW98fGE/aTpudWxsO2lmKHRoaXMuaW50ZXJzZWN0c1RyaWFuZ2xlKG4saCkpcmV0dXJuKG98fGEpJiYobyYmaC5nZXRDZW50ZXIobyksYSYmaC5nZXRDZW50ZXIoYSkpLDA7bGV0IGw9MS8wO2ZvcihsZXQgZT0wO2U8MztlKyspe2xldCBpO2NvbnN0IHI9c1tlXSxoPW5bcl07dGhpcy5jbG9zZXN0UG9pbnRUb1BvaW50KGgsdCksaT1oLmRpc3RhbmNlVG9TcXVhcmVkKHQpLGk8bCYmKGw9aSxvJiZvLmNvcHkodCksYSYmYS5jb3B5KGgpKTtjb25zdCBjPXRoaXNbcl07bi5jbG9zZXN0UG9pbnRUb1BvaW50KGMsdCksaT1jLmRpc3RhbmNlVG9TcXVhcmVkKHQpLGk8bCYmKGw9aSxvJiZvLmNvcHkoYyksYSYmYS5jb3B5KHQpKX1mb3IobGV0IGg9MDtoPDM7aCsrKXtjb25zdCBjPXNbaF0sdT1zWyhoKzEpJTNdO2kuc2V0KHRoaXNbY10sdGhpc1t1XSk7Zm9yKGxldCBoPTA7aDwzO2grKyl7Y29uc3QgYz1zW2hdLHU9c1soaCsxKSUzXTtyLnNldChuW2NdLG5bdV0pLHplKGkscix0LGUpO2NvbnN0IGQ9dC5kaXN0YW5jZVRvU3F1YXJlZChlKTtkPGwmJihsPWQsbyYmby5jb3B5KHQpLGEmJmEuY29weShlKSl9fXJldHVybiBNYXRoLnNxcnQobCl9fSgpO2NsYXNzIFNlIGV4dGVuZHMgQ3tjb25zdHJ1Y3Rvcigpe3N1cGVyKC4uLmFyZ3VtZW50cyksdGhpcy5pc09yaWVudGVkQm94PSEwLHRoaXMubWF0cml4PW5ldyAkLHRoaXMuaW52TWF0cml4PW5ldyAkLHRoaXMucG9pbnRzPW5ldyBBcnJheSg4KS5maWxsKCkubWFwKCgoKT0+bmV3IEUpKSx0aGlzLnNhdEF4ZXM9bmV3IEFycmF5KDMpLmZpbGwoKS5tYXAoKCgpPT5uZXcgRSkpLHRoaXMuc2F0Qm91bmRzPW5ldyBBcnJheSgzKS5maWxsKCkubWFwKCgoKT0+bmV3IHdlKSksdGhpcy5hbGlnbmVkU2F0Qm91bmRzPW5ldyBBcnJheSgzKS5maWxsKCkubWFwKCgoKT0+bmV3IHdlKSksdGhpcy5uZWVkc1VwZGF0ZT0hMX1zZXQodCxlLHMpe3N1cGVyLnNldCh0LGUpLHRoaXMubWF0cml4LmNvcHkocyksdGhpcy5uZWVkc1VwZGF0ZT0hMH1jb3B5KHQpe3N1cGVyLmNvcHkodCksdGhpcy5tYXRyaXguY29weSh0Lm1hdHJpeCksdGhpcy5uZWVkc1VwZGF0ZT0hMH19U2UucHJvdG90eXBlLnVwZGF0ZT1mdW5jdGlvbigpe2NvbnN0IHQ9dGhpcy5tYXRyaXgsZT10aGlzLm1pbixzPXRoaXMubWF4LGk9dGhpcy5wb2ludHM7Zm9yKGxldCByPTA7cjw9MTtyKyspZm9yKGxldCBuPTA7bjw9MTtuKyspZm9yKGxldCBvPTA7bzw9MTtvKyspe2NvbnN0IGE9aVsxKnJ8MipufDQqb107YS54PXI/cy54OmUueCxhLnk9bj9zLnk6ZS55LGEuej1vP3MuejplLnosYS5hcHBseU1hdHJpeDQodCl9Y29uc3Qgcj10aGlzLnNhdEJvdW5kcyxuPXRoaXMuc2F0QXhlcyxvPWlbMF07Zm9yKGxldCB0PTA7dDwzO3QrKyl7Y29uc3QgZT1uW3RdLHM9clt0XSxhPWlbMTw8dF07ZS5zdWJWZWN0b3JzKG8sYSkscy5zZXRGcm9tUG9pbnRzKGUsaSl9Y29uc3QgYT10aGlzLmFsaWduZWRTYXRCb3VuZHM7YVswXS5zZXRGcm9tUG9pbnRzRmllbGQoaSwieCIpLGFbMV0uc2V0RnJvbVBvaW50c0ZpZWxkKGksInkiKSxhWzJdLnNldEZyb21Qb2ludHNGaWVsZChpLCJ6IiksdGhpcy5pbnZNYXRyaXguY29weSh0aGlzLm1hdHJpeCkuaW52ZXJ0KCksdGhpcy5uZWVkc1VwZGF0ZT0hMX0sU2UucHJvdG90eXBlLmludGVyc2VjdHNCb3g9ZnVuY3Rpb24oKXtjb25zdCB0PW5ldyB3ZTtyZXR1cm4gZnVuY3Rpb24oZSl7dGhpcy5uZWVkc1VwZGF0ZSYmdGhpcy51cGRhdGUoKTtjb25zdCBzPWUubWluLGk9ZS5tYXgscj10aGlzLnNhdEJvdW5kcyxuPXRoaXMuc2F0QXhlcyxvPXRoaXMuYWxpZ25lZFNhdEJvdW5kcztpZih0Lm1pbj1zLngsdC5tYXg9aS54LG9bMF0uaXNTZXBhcmF0ZWQodCkpcmV0dXJuITE7aWYodC5taW49cy55LHQubWF4PWkueSxvWzFdLmlzU2VwYXJhdGVkKHQpKXJldHVybiExO2lmKHQubWluPXMueix0Lm1heD1pLnosb1syXS5pc1NlcGFyYXRlZCh0KSlyZXR1cm4hMTtmb3IobGV0IHM9MDtzPDM7cysrKXtjb25zdCBpPW5bc10sbz1yW3NdO2lmKHQuc2V0RnJvbUJveChpLGUpLG8uaXNTZXBhcmF0ZWQodCkpcmV0dXJuITF9cmV0dXJuITB9fSgpLFNlLnByb3RvdHlwZS5pbnRlcnNlY3RzVHJpYW5nbGU9ZnVuY3Rpb24oKXtjb25zdCB0PW5ldyBBZSxlPW5ldyBBcnJheSgzKSxzPW5ldyB3ZSxpPW5ldyB3ZSxyPW5ldyBFO3JldHVybiBmdW5jdGlvbihuKXt0aGlzLm5lZWRzVXBkYXRlJiZ0aGlzLnVwZGF0ZSgpLG4uaXNFeHRlbmRlZFRyaWFuZ2xlP24ubmVlZHNVcGRhdGUmJm4udXBkYXRlKCk6KHQuY29weShuKSx0LnVwZGF0ZSgpLG49dCk7Y29uc3Qgbz10aGlzLnNhdEJvdW5kcyxhPXRoaXMuc2F0QXhlcztlWzBdPW4uYSxlWzFdPW4uYixlWzJdPW4uYztmb3IobGV0IHQ9MDt0PDM7dCsrKXtjb25zdCBpPW9bdF0scj1hW3RdO2lmKHMuc2V0RnJvbVBvaW50cyhyLGUpLGkuaXNTZXBhcmF0ZWQocykpcmV0dXJuITF9Y29uc3QgaD1uLnNhdEJvdW5kcyxsPW4uc2F0QXhlcyxjPXRoaXMucG9pbnRzO2ZvcihsZXQgdD0wO3Q8Mzt0Kyspe2NvbnN0IGU9aFt0XSxpPWxbdF07aWYocy5zZXRGcm9tUG9pbnRzKGksYyksZS5pc1NlcGFyYXRlZChzKSlyZXR1cm4hMX1mb3IobGV0IHQ9MDt0PDM7dCsrKXtjb25zdCBuPWFbdF07Zm9yKGxldCB0PTA7dDw0O3QrKyl7Y29uc3Qgbz1sW3RdO2lmKHIuY3Jvc3NWZWN0b3JzKG4sbykscy5zZXRGcm9tUG9pbnRzKHIsZSksaS5zZXRGcm9tUG9pbnRzKHIsYykscy5pc1NlcGFyYXRlZChpKSlyZXR1cm4hMX19cmV0dXJuITB9fSgpLFNlLnByb3RvdHlwZS5jbG9zZXN0UG9pbnRUb1BvaW50PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMubmVlZHNVcGRhdGUmJnRoaXMudXBkYXRlKCksZS5jb3B5KHQpLmFwcGx5TWF0cml4NCh0aGlzLmludk1hdHJpeCkuY2xhbXAodGhpcy5taW4sdGhpcy5tYXgpLmFwcGx5TWF0cml4NCh0aGlzLm1hdHJpeCksZX0sU2UucHJvdG90eXBlLmRpc3RhbmNlVG9Qb2ludD1mdW5jdGlvbigpe2NvbnN0IHQ9bmV3IEU7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmNsb3Nlc3RQb2ludFRvUG9pbnQoZSx0KSxlLmRpc3RhbmNlVG8odCl9fSgpLFNlLnByb3RvdHlwZS5kaXN0YW5jZVRvQm94PWZ1bmN0aW9uKCl7Y29uc3QgdD1bIngiLCJ5IiwieiJdLGU9bmV3IEFycmF5KDEyKS5maWxsKCkubWFwKCgoKT0+bmV3IGVlKSkscz1uZXcgQXJyYXkoMTIpLmZpbGwoKS5tYXAoKCgpPT5uZXcgZWUpKSxpPW5ldyBFLHI9bmV3IEU7cmV0dXJuIGZ1bmN0aW9uKG4pe2xldCBvPWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTowLGE9YXJndW1lbnRzLmxlbmd0aD4yJiZ2b2lkIDAhPT1hcmd1bWVudHNbMl0/YXJndW1lbnRzWzJdOm51bGwsaD1hcmd1bWVudHMubGVuZ3RoPjMmJnZvaWQgMCE9PWFyZ3VtZW50c1szXT9hcmd1bWVudHNbM106bnVsbDtpZih0aGlzLm5lZWRzVXBkYXRlJiZ0aGlzLnVwZGF0ZSgpLHRoaXMuaW50ZXJzZWN0c0JveChuKSlyZXR1cm4oYXx8aCkmJihuLmdldENlbnRlcihyKSx0aGlzLmNsb3Nlc3RQb2ludFRvUG9pbnQocixpKSxuLmNsb3Nlc3RQb2ludFRvUG9pbnQoaSxyKSxhJiZhLmNvcHkoaSksaCYmaC5jb3B5KHIpKSwwO2NvbnN0IGw9bypvLGM9bi5taW4sdT1uLm1heCxkPXRoaXMucG9pbnRzO2xldCBtPTEvMDtmb3IobGV0IHQ9MDt0PDg7dCsrKXtjb25zdCBlPWRbdF07ci5jb3B5KGUpLmNsYW1wKGMsdSk7Y29uc3Qgcz1lLmRpc3RhbmNlVG9TcXVhcmVkKHIpO2lmKHM8bSYmKG09cyxhJiZhLmNvcHkoZSksaCYmaC5jb3B5KHIpLHM8bCkpcmV0dXJuIE1hdGguc3FydChzKX1sZXQgeT0wO2ZvcihsZXQgaT0wO2k8MztpKyspZm9yKGxldCByPTA7cjw9MTtyKyspZm9yKGxldCBuPTA7bjw9MTtuKyspe2NvbnN0IG89KGkrMSklMyxhPShpKzIpJTMsaD0xPDxpfHI8PG98bjw8YSxsPWRbcjw8b3xuPDxhXSxtPWRbaF07ZVt5XS5zZXQobCxtKTtjb25zdCBwPXRbaV0seD10W29dLGY9dFthXSxnPXNbeV0sYj1nLnN0YXJ0LHc9Zy5lbmQ7YltwXT1jW3BdLGJbeF09cj9jW3hdOnVbeF0sYltmXT1uP2NbZl06dVt4XSx3W3BdPXVbcF0sd1t4XT1yP2NbeF06dVt4XSx3W2ZdPW4/Y1tmXTp1W3hdLHkrK31mb3IobGV0IHQ9MDt0PD0xO3QrKylmb3IobGV0IGU9MDtlPD0xO2UrKylmb3IobGV0IHM9MDtzPD0xO3MrKyl7ci54PXQ/dS54OmMueCxyLnk9ZT91Lnk6Yy55LHIuej1zP3UuejpjLnosdGhpcy5jbG9zZXN0UG9pbnRUb1BvaW50KHIsaSk7Y29uc3Qgbj1yLmRpc3RhbmNlVG9TcXVhcmVkKGkpO2lmKG48bSYmKG09bixhJiZhLmNvcHkoaSksaCYmaC5jb3B5KHIpLG48bCkpcmV0dXJuIE1hdGguc3FydChuKX1mb3IobGV0IHQ9MDt0PDEyO3QrKyl7Y29uc3Qgbj1lW3RdO2ZvcihsZXQgdD0wO3Q8MTI7dCsrKXtjb25zdCBlPXNbdF07emUobixlLGkscik7Y29uc3Qgbz1pLmRpc3RhbmNlVG9TcXVhcmVkKHIpO2lmKG88bSYmKG09byxhJiZhLmNvcHkoaSksaCYmaC5jb3B5KHIpLG88bCkpcmV0dXJuIE1hdGguc3FydChvKX19cmV0dXJuIE1hdGguc3FydChtKX19KCk7Y29uc3QgQmU9bmV3IEUsVGU9bmV3IEUsRWU9bmV3IEUsa2U9bmV3IGgsUGU9bmV3IGgsQ2U9bmV3IGgsRmU9bmV3IEU7ZnVuY3Rpb24gVmUodCxlLHMsaSxyKXtjb25zdCBuPTMqaSxvPXQuaW5kZXguZ2V0WChuKSxhPXQuaW5kZXguZ2V0WChuKzEpLGw9dC5pbmRleC5nZXRYKG4rMiksYz1mdW5jdGlvbih0LGUscyxpLHIsbixvKXtCZS5mcm9tQnVmZmVyQXR0cmlidXRlKGUsaSksVGUuZnJvbUJ1ZmZlckF0dHJpYnV0ZShlLHIpLEVlLmZyb21CdWZmZXJBdHRyaWJ1dGUoZSxuKTtjb25zdCBhPWZ1bmN0aW9uKHQsZSxzLGkscixuKXtsZXQgbztyZXR1cm4gbz0xPT09bj90LmludGVyc2VjdFRyaWFuZ2xlKGkscyxlLCEwLHIpOnQuaW50ZXJzZWN0VHJpYW5nbGUoZSxzLGksMiE9PW4sciksbnVsbD09PW8/bnVsbDp7ZGlzdGFuY2U6dC5vcmlnaW4uZGlzdGFuY2VUbyhyKSxwb2ludDpyLmNsb25lKCl9fSh0LEJlLFRlLEVlLEZlLG8pO2lmKGEpe3MmJihrZS5mcm9tQnVmZmVyQXR0cmlidXRlKHMsaSksUGUuZnJvbUJ1ZmZlckF0dHJpYnV0ZShzLHIpLENlLmZyb21CdWZmZXJBdHRyaWJ1dGUocyxuKSxhLnV2PVZ0LmdldFVWKEZlLEJlLFRlLEVlLGtlLFBlLENlLG5ldyBoKSk7Y29uc3QgdD17YTppLGI6cixjOm4sbm9ybWFsOm5ldyBFLG1hdGVyaWFsSW5kZXg6MH07VnQuZ2V0Tm9ybWFsKEJlLFRlLEVlLHQubm9ybWFsKSxhLmZhY2U9dCxhLmZhY2VJbmRleD1pfXJldHVybiBhfShzLHQuYXR0cmlidXRlcy5wb3NpdGlvbix0LmF0dHJpYnV0ZXMudXYsbyxhLGwsZSk7cmV0dXJuIGM/KGMuZmFjZUluZGV4PWksciYmci5wdXNoKGMpLGMpOm51bGx9ZnVuY3Rpb24gUmUodCxlLHMpe3JldHVybiBudWxsPT09dD9udWxsOih0LnBvaW50LmFwcGx5TWF0cml4NChlLm1hdHJpeFdvcmxkKSx0LmRpc3RhbmNlPXQucG9pbnQuZGlzdGFuY2VUbyhzLnJheS5vcmlnaW4pLHQub2JqZWN0PWUsdC5kaXN0YW5jZTxzLm5lYXJ8fHQuZGlzdGFuY2U+cy5mYXI/bnVsbDp0KX1mdW5jdGlvbiBxZSh0LGUscyxpKXtjb25zdCByPXQuYSxuPXQuYixvPXQuYztsZXQgYT1lLGg9ZSsxLGw9ZSsyO3MmJihhPXMuZ2V0WChlKSxoPXMuZ2V0WChlKzEpLGw9cy5nZXRYKGUrMikpLHIueD1pLmdldFgoYSksci55PWkuZ2V0WShhKSxyLno9aS5nZXRaKGEpLG4ueD1pLmdldFgoaCksbi55PWkuZ2V0WShoKSxuLno9aS5nZXRaKGgpLG8ueD1pLmdldFgobCksby55PWkuZ2V0WShsKSxvLno9aS5nZXRaKGwpfWZ1bmN0aW9uIFVlKHQsZSxzLGkscixuLG8pe2NvbnN0IGE9cy5pbmRleCxoPXMuYXR0cmlidXRlcy5wb3NpdGlvbjtmb3IobGV0IHM9dCxsPWUrdDtzPGw7cysrKWlmKHFlKG8sMypzLGEsaCksby5uZWVkc1VwZGF0ZT0hMCxpKG8scyxyLG4pKXJldHVybiEwO3JldHVybiExfWNsYXNzIE9le2NvbnN0cnVjdG9yKHQpe3RoaXMuX2dldE5ld1ByaW1pdGl2ZT10LHRoaXMuX3ByaW1pdGl2ZXM9W119Z2V0UHJpbWl0aXZlKCl7Y29uc3QgdD10aGlzLl9wcmltaXRpdmVzO3JldHVybiAwPT09dC5sZW5ndGg/dGhpcy5fZ2V0TmV3UHJpbWl0aXZlKCk6dC5wb3AoKX1yZWxlYXNlUHJpbWl0aXZlKHQpe3RoaXMuX3ByaW1pdGl2ZXMucHVzaCh0KX19ZnVuY3Rpb24gSGUodCxlKXtyZXR1cm4gNjU1MzU9PT1lW3QrMTVdfWZ1bmN0aW9uIEllKHQsZSl7cmV0dXJuIGVbdCs2XX1mdW5jdGlvbiBOZSh0LGUpe3JldHVybiBlW3QrMTRdfWZ1bmN0aW9uIExlKHQpe3JldHVybiB0Kzh9ZnVuY3Rpb24gV2UodCxlKXtyZXR1cm4gZVt0KzZdfWNvbnN0IFhlPW5ldyBDLERlPW5ldyBFLFllPVsieCIsInkiLCJ6Il07ZnVuY3Rpb24gWmUodCxlLHMsaSxyKXtsZXQgbj0yKnQsbz10cyxhPWVzLGg9c3M7aWYoSGUobixhKSl7IWZ1bmN0aW9uKHQsZSxzLGkscixuKXtmb3IobGV0IG89aSxhPWkrcjtvPGE7bysrKVZlKHQsZSxzLG8sbil9KGUscyxpLEllKHQsaCksTmUobixhKSxyKX1lbHNle2NvbnN0IG49TGUodCk7SmUobixvLGksRGUpJiZaZShuLGUscyxpLHIpO2NvbnN0IGE9V2UodCxoKTtKZShhLG8saSxEZSkmJlplKGEsZSxzLGkscil9fWZ1bmN0aW9uIEdlKHQsZSxzLGkpe2xldCByPTIqdCxuPXRzLG89ZXMsYT1zcztpZihIZShyLG8pKXtyZXR1cm4gZnVuY3Rpb24odCxlLHMsaSxyKXtsZXQgbj0xLzAsbz1udWxsO2ZvcihsZXQgYT1pLGg9aStyO2E8aDthKyspe2NvbnN0IGk9VmUodCxlLHMsYSk7aSYmaS5kaXN0YW5jZTxuJiYobz1pLG49aS5kaXN0YW5jZSl9cmV0dXJuIG99KGUscyxpLEllKHQsYSksTmUocixvKSl9e2NvbnN0IHI9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZVt0KzddfSh0LGEpLG89WWVbcl0saD1pLmRpcmVjdGlvbltvXT49MDtsZXQgbCxjO2g/KGw9TGUodCksYz1XZSh0LGEpKToobD1XZSh0LGEpLGM9TGUodCkpO2NvbnN0IHU9SmUobCxuLGksRGUpP0dlKGwsZSxzLGkpOm51bGw7aWYodSl7Y29uc3QgdD11LnBvaW50W29dO2lmKGg/dDw9bltjK3JdOnQ+PW5bYytyKzNdKXJldHVybiB1fWNvbnN0IGQ9SmUoYyxuLGksRGUpP0dlKGMsZSxzLGkpOm51bGw7cmV0dXJuIHUmJmQ/dS5kaXN0YW5jZTw9ZC5kaXN0YW5jZT91OmQ6dXx8ZHx8bnVsbH19Y29uc3QgamU9ZnVuY3Rpb24oKXtsZXQgdCxlO2NvbnN0IHM9W10saT1uZXcgT2UoKCgpPT5uZXcgQykpO3JldHVybiBmdW5jdGlvbigpe3Q9aS5nZXRQcmltaXRpdmUoKSxlPWkuZ2V0UHJpbWl0aXZlKCkscy5wdXNoKHQsZSk7Y29uc3Qgbj1yKC4uLmFyZ3VtZW50cyk7aS5yZWxlYXNlUHJpbWl0aXZlKHQpLGkucmVsZWFzZVByaW1pdGl2ZShlKSxzLnBvcCgpLHMucG9wKCk7Y29uc3Qgbz1zLmxlbmd0aDtyZXR1cm4gbz4wJiYoZT1zW28tMV0sdD1zW28tMl0pLG59O2Z1bmN0aW9uIHIocyxpLG4sbyl7bGV0IGE9YXJndW1lbnRzLmxlbmd0aD40JiZ2b2lkIDAhPT1hcmd1bWVudHNbNF0/YXJndW1lbnRzWzRdOm51bGwsaD1hcmd1bWVudHMubGVuZ3RoPjUmJnZvaWQgMCE9PWFyZ3VtZW50c1s1XT9hcmd1bWVudHNbNV06MCxsPWFyZ3VtZW50cy5sZW5ndGg+NiYmdm9pZCAwIT09YXJndW1lbnRzWzZdP2FyZ3VtZW50c1s2XTowO2Z1bmN0aW9uIGModCl7bGV0IGU9Mip0LHM9ZXMsaT1zcztmb3IoOyFIZShlLHMpOyllPTIqKHQ9TGUodCkpO3JldHVybiBJZSh0LGkpfWZ1bmN0aW9uIHUodCl7bGV0IGU9Mip0LHM9ZXMsaT1zcztmb3IoOyFIZShlLHMpOyllPTIqKHQ9V2UodCxpKSk7cmV0dXJuIEllKHQsaSkrTmUoZSxzKX1sZXQgZD0yKnMsbT10cyx5PWVzLHA9c3M7Y29uc3QgeD1IZShkLHkpO2lmKHgpe2NvbnN0IGU9SWUocyxwKSxpPU5lKGQseSk7cmV0dXJuIG9lKHMsbSx0KSxvKGUsaSwhMSxsLGgrcyx0KX17Y29uc3QgZD1MZShzKSx4PVdlKHMscCk7bGV0IGYsZyxiLHcsTT1kLHo9eDtpZihhJiYoYj10LHc9ZSxvZShNLG0sYiksb2UoeixtLHcpLGY9YShiKSxnPWEodyksZzxmKSl7TT14LHo9ZDtjb25zdCB0PWY7Zj1nLGc9dCxiPXd9Ynx8KGI9dCxvZShNLG0sYikpO2NvbnN0IHY9bihiLEhlKDIqTSx5KSxmLGwrMSxoK00pO2xldCBfO2lmKDI9PT12KXtjb25zdCB0PWMoTSk7Xz1vKHQsdShNKS10LCEwLGwrMSxoK00sYil9ZWxzZSBfPXYmJnIoTSxpLG4sbyxhLGgsbCsxKTtpZihfKXJldHVybiEwO3c9ZSxvZSh6LG0sdyk7Y29uc3QgQT1uKHcsSGUoMip6LHkpLGcsbCsxLGgreik7bGV0IFM7aWYoMj09PUEpe2NvbnN0IHQ9Yyh6KTtTPW8odCx1KHopLXQsITAsbCsxLGgreix3KX1lbHNlIFM9QSYmcih6LGksbixvLGEsaCxsKzEpO3JldHVybiEhU319fSgpLFFlPWZ1bmN0aW9uKCl7Y29uc3QgdD1uZXcgQWUsZT1uZXcgQWUscz1uZXcgJCxpPW5ldyBTZSxyPW5ldyBTZTtyZXR1cm4gZnVuY3Rpb24gbihvLGEsaCxsKXtsZXQgYz1hcmd1bWVudHMubGVuZ3RoPjQmJnZvaWQgMCE9PWFyZ3VtZW50c1s0XT9hcmd1bWVudHNbNF06bnVsbCx1PTIqbyxkPXRzLG09ZXMseT1zcztudWxsPT09YyYmKGguYm91bmRpbmdCb3h8fGguY29tcHV0ZUJvdW5kaW5nQm94KCksaS5zZXQoaC5ib3VuZGluZ0JveC5taW4saC5ib3VuZGluZ0JveC5tYXgsbCksYz1pKTtjb25zdCBwPUhlKHUsbSk7aWYoIXApe2NvbnN0IHQ9bys4LGU9eVtvKzZdO29lKHQsZCxYZSk7aWYoYy5pbnRlcnNlY3RzQm94KFhlKSYmbih0LGEsaCxsLGMpKXJldHVybiEwO29lKGUsZCxYZSk7cmV0dXJuISEoYy5pbnRlcnNlY3RzQm94KFhlKSYmbihlLGEsaCxsLGMpKX17Y29uc3QgaT1hLG49aS5pbmRleCxjPWkuYXR0cmlidXRlcy5wb3NpdGlvbixwPWguaW5kZXgseD1oLmF0dHJpYnV0ZXMucG9zaXRpb24sZj1JZShvLHkpLGc9TmUodSxtKTtpZihzLmNvcHkobCkuaW52ZXJ0KCksaC5ib3VuZHNUcmVlKXtvZShvLGQsciksci5tYXRyaXguY29weShzKSxyLm5lZWRzVXBkYXRlPSEwO3JldHVybiBoLmJvdW5kc1RyZWUuc2hhcGVjYXN0KHtpbnRlcnNlY3RzQm91bmRzOnQ9PnIuaW50ZXJzZWN0c0JveCh0KSxpbnRlcnNlY3RzVHJpYW5nbGU6dD0+e3QuYS5hcHBseU1hdHJpeDQobCksdC5iLmFwcGx5TWF0cml4NChsKSx0LmMuYXBwbHlNYXRyaXg0KGwpLHQubmVlZHNVcGRhdGU9ITA7Zm9yKGxldCBzPTMqZixpPTMqKGcrZik7czxpO3MrPTMpaWYocWUoZSxzLG4sYyksZS5uZWVkc1VwZGF0ZT0hMCx0LmludGVyc2VjdHNUcmlhbmdsZShlKSlyZXR1cm4hMDtyZXR1cm4hMX19KX1mb3IobGV0IGk9MypmLHI9ZyszKmY7aTxyO2krPTMpe3FlKHQsaSxuLGMpLHQuYS5hcHBseU1hdHJpeDQocyksdC5iLmFwcGx5TWF0cml4NChzKSx0LmMuYXBwbHlNYXRyaXg0KHMpLHQubmVlZHNVcGRhdGU9ITA7Zm9yKGxldCBzPTAsaT1wLmNvdW50O3M8aTtzKz0zKWlmKHFlKGUscyxwLHgpLGUubmVlZHNVcGRhdGU9ITAsdC5pbnRlcnNlY3RzVHJpYW5nbGUoZSkpcmV0dXJuITB9fX19KCk7ZnVuY3Rpb24gSmUodCxlLHMsaSl7cmV0dXJuIG9lKHQsZSxYZSkscy5pbnRlcnNlY3RCb3goWGUsaSl9Y29uc3QgJGU9W107bGV0IEtlLHRzLGVzLHNzO2Z1bmN0aW9uIGlzKHQpe0tlJiYkZS5wdXNoKEtlKSxLZT10LHRzPW5ldyBGbG9hdDMyQXJyYXkodCksZXM9bmV3IFVpbnQxNkFycmF5KHQpLHNzPW5ldyBVaW50MzJBcnJheSh0KX1mdW5jdGlvbiBycygpe0tlPW51bGwsdHM9bnVsbCxlcz1udWxsLHNzPW51bGwsJGUubGVuZ3RoJiZpcygkZS5wb3AoKSl9Y29uc3QgbnM9U3ltYm9sKCJza2lwIHRyZWUgZ2VuZXJhdGlvbiIpLG9zPW5ldyBDLGFzPW5ldyBDLGhzPW5ldyAkLGxzPW5ldyBTZSxjcz1uZXcgU2UsdXM9bmV3IEUsZHM9bmV3IEUsbXM9bmV3IEUseXM9bmV3IEUscHM9bmV3IEUseHM9bmV3IEMsZnM9bmV3IE9lKCgoKT0+bmV3IEFlKSk7Y2xhc3MgZ3N7c3RhdGljIHNlcmlhbGl6ZSh0KXtsZXQgZT1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06e307aWYoZS5pc0J1ZmZlckdlb21ldHJ5KXJldHVybiBjb25zb2xlLndhcm4oIk1lc2hCVkguc2VyaWFsaXplOiBUaGUgYXJndW1lbnRzIGZvciB0aGUgZnVuY3Rpb24gaGF2ZSBjaGFuZ2VkLiBTZWUgZG9jdW1lbnRhdGlvbiBmb3IgbmV3IHNpZ25hdHVyZS4iKSxncy5zZXJpYWxpemUoYXJndW1lbnRzWzBdLHtjbG9uZUJ1ZmZlcnM6dm9pZCAwPT09YXJndW1lbnRzWzJdfHxhcmd1bWVudHNbMl19KTtlPXtjbG9uZUJ1ZmZlcnM6ITAsLi4uZX07Y29uc3Qgcz10Lmdlb21ldHJ5LGk9dC5fcm9vdHMscj1zLmdldEluZGV4KCk7bGV0IG47cmV0dXJuIG49ZS5jbG9uZUJ1ZmZlcnM/e3Jvb3RzOmkubWFwKCh0PT50LnNsaWNlKCkpKSxpbmRleDpyLmFycmF5LnNsaWNlKCl9Ontyb290czppLGluZGV4OnIuYXJyYXl9LG59c3RhdGljIGRlc2VyaWFsaXplKHQsZSl7bGV0IHM9YXJndW1lbnRzLmxlbmd0aD4yJiZ2b2lkIDAhPT1hcmd1bWVudHNbMl0/YXJndW1lbnRzWzJdOnt9O2lmKCJib29sZWFuIj09dHlwZW9mIHMpcmV0dXJuIGNvbnNvbGUud2FybigiTWVzaEJWSC5kZXNlcmlhbGl6ZTogVGhlIGFyZ3VtZW50cyBmb3IgdGhlIGZ1bmN0aW9uIGhhdmUgY2hhbmdlZC4gU2VlIGRvY3VtZW50YXRpb24gZm9yIG5ldyBzaWduYXR1cmUuIiksZ3MuZGVzZXJpYWxpemUoYXJndW1lbnRzWzBdLGFyZ3VtZW50c1sxXSx7c2V0SW5kZXg6dm9pZCAwPT09YXJndW1lbnRzWzJdfHxhcmd1bWVudHNbMl19KTtzPXtzZXRJbmRleDohMCwuLi5zfTtjb25zdHtpbmRleDppLHJvb3RzOnJ9PXQsbj1uZXcgZ3MoZSx7Li4ucyxbbnNdOiEwfSk7aWYobi5fcm9vdHM9cixzLnNldEluZGV4KXtjb25zdCBzPWUuZ2V0SW5kZXgoKTtpZihudWxsPT09cyl7Y29uc3Qgcz1uZXcgVXQodC5pbmRleCwxLCExKTtlLnNldEluZGV4KHMpfWVsc2Ugcy5hcnJheSE9PWkmJihzLmFycmF5LnNldChpKSxzLm5lZWRzVXBkYXRlPSEwKX1yZXR1cm4gbn1jb25zdHJ1Y3Rvcih0KXtsZXQgZT1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06e307aWYoIXQuaXNCdWZmZXJHZW9tZXRyeSl0aHJvdyBuZXcgRXJyb3IoIk1lc2hCVkg6IE9ubHkgQnVmZmVyR2VvbWV0cmllcyBhcmUgc3VwcG9ydGVkLiIpO2lmKHQuaW5kZXgmJnQuaW5kZXguaXNJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZSl0aHJvdyBuZXcgRXJyb3IoIk1lc2hCVkg6IEludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIHRoZSBpbmRleCBhdHRyaWJ1dGUuIik7aWYoZT1PYmplY3QuYXNzaWduKHtzdHJhdGVneTowLG1heERlcHRoOjQwLG1heExlYWZUcmlzOjEwLHZlcmJvc2U6ITAsdXNlU2hhcmVkQXJyYXlCdWZmZXI6ITEsc2V0Qm91bmRpbmdCb3g6ITAsb25Qcm9ncmVzczpudWxsLFtuc106ITF9LGUpLGUudXNlU2hhcmVkQXJyYXlCdWZmZXImJiJ1bmRlZmluZWQiPT10eXBlb2YgU2hhcmVkQXJyYXlCdWZmZXIpdGhyb3cgbmV3IEVycm9yKCJNZXNoQlZIOiBTaGFyZWRBcnJheUJ1ZmZlciBpcyBub3QgYXZhaWxhYmxlLiIpO3RoaXMuX3Jvb3RzPW51bGwsZVtuc118fCh0aGlzLl9yb290cz1mdW5jdGlvbih0LGUpe2NvbnN0IHM9YmUodCxlKTtsZXQgaSxyLG47Y29uc3Qgbz1bXSxhPWUudXNlU2hhcmVkQXJyYXlCdWZmZXI/U2hhcmVkQXJyYXlCdWZmZXI6QXJyYXlCdWZmZXI7Zm9yKGxldCB0PTA7dDxzLmxlbmd0aDt0Kyspe2NvbnN0IGU9c1t0XSxjPW5ldyBhKDMyKmgoZSkpO2k9bmV3IEZsb2F0MzJBcnJheShjKSxyPW5ldyBVaW50MzJBcnJheShjKSxuPW5ldyBVaW50MTZBcnJheShjKSxsKDAsZSksby5wdXNoKGMpfXJldHVybiBvO2Z1bmN0aW9uIGgodCl7cmV0dXJuIHQuY291bnQ/MToxK2godC5sZWZ0KStoKHQucmlnaHQpfWZ1bmN0aW9uIGwodCxlKXtjb25zdCBzPXQvNCxvPXQvMixhPSEhZS5jb3VudCxoPWUuYm91bmRpbmdEYXRhO2ZvcihsZXQgdD0wO3Q8Njt0KyspaVtzK3RdPWhbdF07aWYoYSl7Y29uc3QgaT1lLm9mZnNldCxhPWUuY291bnQ7cmV0dXJuIHJbcys2XT1pLG5bbysxNF09YSxuW28rMTVdPWllLHQrMzJ9e2NvbnN0IGk9ZS5sZWZ0LG49ZS5yaWdodCxvPWUuc3BsaXRBeGlzO2xldCBhO2lmKGE9bCh0KzMyLGkpLGEvND5NYXRoLnBvdygyLDMyKSl0aHJvdyBuZXcgRXJyb3IoIk1lc2hCVkg6IENhbm5vdCBzdG9yZSBjaGlsZCBwb2ludGVyIGdyZWF0ZXIgdGhhbiAzMiBiaXRzLiIpO3JldHVybiByW3MrNl09YS80LGE9bChhLG4pLHJbcys3XT1vLGF9fX0odCxlKSwhdC5ib3VuZGluZ0JveCYmZS5zZXRCb3VuZGluZ0JveCYmKHQuYm91bmRpbmdCb3g9dGhpcy5nZXRCb3VuZGluZ0JveChuZXcgQykpKSx0aGlzLmdlb21ldHJ5PXR9cmVmaXQoKXtsZXQgdD1hcmd1bWVudHMubGVuZ3RoPjAmJnZvaWQgMCE9PWFyZ3VtZW50c1swXT9hcmd1bWVudHNbMF06bnVsbDt0JiZBcnJheS5pc0FycmF5KHQpJiYodD1uZXcgU2V0KHQpKTtjb25zdCBlPXRoaXMuZ2VvbWV0cnkscz1lLmluZGV4LmFycmF5LGk9ZS5hdHRyaWJ1dGVzLnBvc2l0aW9uLHI9aS5hcnJheSxuPWkub2Zmc2V0fHwwO2xldCBvLGEsaCxsLGM9MztpLmlzSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGUmJihjPWkuZGF0YS5zdHJpZGUpO2xldCB1PTA7Y29uc3QgZD10aGlzLl9yb290cztmb3IobGV0IHQ9MCxlPWQubGVuZ3RoO3Q8ZTt0Kyspbz1kW3RdLGE9bmV3IFVpbnQzMkFycmF5KG8pLGg9bmV3IFVpbnQxNkFycmF5KG8pLGw9bmV3IEZsb2F0MzJBcnJheShvKSxtKDAsdSksdSs9by5ieXRlTGVuZ3RoO2Z1bmN0aW9uIG0oZSxpKXtsZXQgbz1hcmd1bWVudHMubGVuZ3RoPjImJnZvaWQgMCE9PWFyZ3VtZW50c1syXSYmYXJndW1lbnRzWzJdO2NvbnN0IHU9MiplLGQ9aFt1KzE1XT09PWllO2lmKGQpe2NvbnN0IHQ9YVtlKzZdO2xldCBpPTEvMCxvPTEvMCxkPTEvMCxtPS0xLzAseT0tMS8wLHA9LTEvMDtmb3IobGV0IGU9Myp0LGE9MyoodCtoW3UrMTRdKTtlPGE7ZSsrKXtjb25zdCB0PXNbZV0qYytuLGE9clt0KzBdLGg9clt0KzFdLGw9clt0KzJdO2E8aSYmKGk9YSksYT5tJiYobT1hKSxoPG8mJihvPWgpLGg+eSYmKHk9aCksbDxkJiYoZD1sKSxsPnAmJihwPWwpfXJldHVybihsW2UrMF0hPT1pfHxsW2UrMV0hPT1vfHxsW2UrMl0hPT1kfHxsW2UrM10hPT1tfHxsW2UrNF0hPT15fHxsW2UrNV0hPT1wKSYmKGxbZSswXT1pLGxbZSsxXT1vLGxbZSsyXT1kLGxbZSszXT1tLGxbZSs0XT15LGxbZSs1XT1wLCEwKX17Y29uc3Qgcz1lKzgscj1hW2UrNl0sbj1zK2ksaD1yK2k7bGV0IGM9byx1PSExLGQ9ITE7dD9jfHwodT10LmhhcyhuKSxkPXQuaGFzKGgpLGM9IXUmJiFkKToodT0hMCxkPSEwKTtjb25zdCB5PWN8fGQ7bGV0IHA9ITE7KGN8fHUpJiYocD1tKHMsaSxjKSk7bGV0IHg9ITE7eSYmKHg9bShyLGksYykpO2NvbnN0IGY9cHx8eDtpZihmKWZvcihsZXQgdD0wO3Q8Mzt0Kyspe2NvbnN0IGk9cyt0LG49cit0LG89bFtpXSxhPWxbaSszXSxoPWxbbl0sYz1sW24rM107bFtlK3RdPW88aD9vOmgsbFtlK3QrM109YT5jP2E6Y31yZXR1cm4gZn19fXRyYXZlcnNlKHQpe2xldCBlPWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTowO2NvbnN0IHM9dGhpcy5fcm9vdHNbZV0saT1uZXcgVWludDMyQXJyYXkocykscj1uZXcgVWludDE2QXJyYXkocyk7IWZ1bmN0aW9uIGUobil7bGV0IG89YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOjA7Y29uc3QgYT0yKm4saD1yW2ErMTVdPT09aWU7aWYoaCl7Y29uc3QgZT1pW24rNl0sbD1yW2ErMTRdO3QobyxoLG5ldyBGbG9hdDMyQXJyYXkocyw0Km4sNiksZSxsKX1lbHNle2NvbnN0IHI9bis4LGE9aVtuKzZdLGw9aVtuKzddO3QobyxoLG5ldyBGbG9hdDMyQXJyYXkocyw0Km4sNiksbCl8fChlKHIsbysxKSxlKGEsbysxKSl9fSgwKX1yYXljYXN0KHQpe2xldCBlPWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTowO2NvbnN0IHM9dGhpcy5fcm9vdHMsaT10aGlzLmdlb21ldHJ5LHI9W10sbj1lLmlzTWF0ZXJpYWwsbz1BcnJheS5pc0FycmF5KGUpLGE9aS5ncm91cHMsaD1uP2Uuc2lkZTplO2ZvcihsZXQgbj0wLGw9cy5sZW5ndGg7bjxsO24rKyl7Y29uc3QgbD1vP2VbYVtuXS5tYXRlcmlhbEluZGV4XS5zaWRlOmgsYz1yLmxlbmd0aDtpZihpcyhzW25dKSxaZSgwLGksbCx0LHIpLHJzKCksbyl7Y29uc3QgdD1hW25dLm1hdGVyaWFsSW5kZXg7Zm9yKGxldCBlPWMscz1yLmxlbmd0aDtlPHM7ZSsrKXJbZV0uZmFjZS5tYXRlcmlhbEluZGV4PXR9fXJldHVybiByfXJheWNhc3RGaXJzdCh0KXtsZXQgZT1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06MDtjb25zdCBzPXRoaXMuX3Jvb3RzLGk9dGhpcy5nZW9tZXRyeSxyPWUuaXNNYXRlcmlhbCxuPUFycmF5LmlzQXJyYXkoZSk7bGV0IG89bnVsbDtjb25zdCBhPWkuZ3JvdXBzLGg9cj9lLnNpZGU6ZTtmb3IobGV0IHI9MCxsPXMubGVuZ3RoO3I8bDtyKyspe2NvbnN0IGw9bj9lW2Fbcl0ubWF0ZXJpYWxJbmRleF0uc2lkZTpoO2lzKHNbcl0pO2NvbnN0IGM9R2UoMCxpLGwsdCk7cnMoKSxudWxsIT1jJiYobnVsbD09b3x8Yy5kaXN0YW5jZTxvLmRpc3RhbmNlKSYmKG89YyxuJiYoYy5mYWNlLm1hdGVyaWFsSW5kZXg9YVtyXS5tYXRlcmlhbEluZGV4KSl9cmV0dXJuIG99aW50ZXJzZWN0c0dlb21ldHJ5KHQsZSl7Y29uc3Qgcz10aGlzLmdlb21ldHJ5O2xldCBpPSExO2Zvcihjb25zdCByIG9mIHRoaXMuX3Jvb3RzKWlmKGlzKHIpLGk9UWUoMCxzLHQsZSkscnMoKSxpKWJyZWFrO3JldHVybiBpfXNoYXBlY2FzdCh0LGUscyl7Y29uc3QgaT10aGlzLmdlb21ldHJ5O2lmKHQgaW5zdGFuY2VvZiBGdW5jdGlvbil7aWYoZSl7Y29uc3QgdD1lO2U9KGUscyxpLHIpPT57Y29uc3Qgbj0zKnM7cmV0dXJuIHQoZSxuLG4rMSxuKzIsaSxyKX19dD17Ym91bmRzVHJhdmVyc2VPcmRlcjpzLGludGVyc2VjdHNCb3VuZHM6dCxpbnRlcnNlY3RzVHJpYW5nbGU6ZSxpbnRlcnNlY3RzUmFuZ2U6bnVsbH0sY29uc29sZS53YXJuKCJNZXNoQlZIOiBTaGFwZWNhc3QgZnVuY3Rpb24gc2lnbmF0dXJlIGhhcyBjaGFuZ2VkIGFuZCBub3cgdGFrZXMgYW4gb2JqZWN0IG9mIGNhbGxiYWNrcyBhcyBhIHNlY29uZCBhcmd1bWVudC4gU2VlIGRvY3MgZm9yIG5ldyBzaWduYXR1cmUuIil9Y29uc3Qgcj1mcy5nZXRQcmltaXRpdmUoKTtsZXR7Ym91bmRzVHJhdmVyc2VPcmRlcjpuLGludGVyc2VjdHNCb3VuZHM6byxpbnRlcnNlY3RzUmFuZ2U6YSxpbnRlcnNlY3RzVHJpYW5nbGU6aH09dDtpZihhJiZoKXtjb25zdCB0PWE7YT0oZSxzLG4sbyxhKT0+ISF0KGUscyxuLG8sYSl8fFVlKGUscyxpLGgsbixvLHIpfWVsc2UgYXx8KGE9aD8odCxlLHMsbik9PlVlKHQsZSxpLGgscyxuLHIpOih0LGUscyk9PnMpO2xldCBsPSExLGM9MDtmb3IoY29uc3QgdCBvZiB0aGlzLl9yb290cyl7aWYoaXModCksbD1qZSgwLGksbyxhLG4sYykscnMoKSxsKWJyZWFrO2MrPXQuYnl0ZUxlbmd0aH1yZXR1cm4gZnMucmVsZWFzZVByaW1pdGl2ZShyKSxsfWJ2aGNhc3QodCxlLHMpe2xldHtpbnRlcnNlY3RzUmFuZ2VzOmksaW50ZXJzZWN0c1RyaWFuZ2xlczpyfT1zO2NvbnN0IG49dGhpcy5nZW9tZXRyeS5pbmRleCxvPXRoaXMuZ2VvbWV0cnkuYXR0cmlidXRlcy5wb3NpdGlvbixhPXQuZ2VvbWV0cnkuaW5kZXgsaD10Lmdlb21ldHJ5LmF0dHJpYnV0ZXMucG9zaXRpb247aHMuY29weShlKS5pbnZlcnQoKTtjb25zdCBsPWZzLmdldFByaW1pdGl2ZSgpLGM9ZnMuZ2V0UHJpbWl0aXZlKCk7aWYocil7ZnVuY3Rpb24gdSh0LHMsaSx1LGQsbSx5LHApe2ZvcihsZXQgeD1pLGY9aSt1O3g8Zjt4Kyspe3FlKGMsMyp4LGEsaCksYy5hLmFwcGx5TWF0cml4NChlKSxjLmIuYXBwbHlNYXRyaXg0KGUpLGMuYy5hcHBseU1hdHJpeDQoZSksYy5uZWVkc1VwZGF0ZT0hMDtmb3IobGV0IGU9dCxpPXQrcztlPGk7ZSsrKWlmKHFlKGwsMyplLG4sbyksbC5uZWVkc1VwZGF0ZT0hMCxyKGwsYyxlLHgsZCxtLHkscCkpcmV0dXJuITB9cmV0dXJuITF9aWYoaSl7Y29uc3QgdD1pO2k9ZnVuY3Rpb24oZSxzLGkscixuLG8sYSxoKXtyZXR1cm4hIXQoZSxzLGkscixuLG8sYSxoKXx8dShlLHMsaSxyLG4sbyxhLGgpfX1lbHNlIGk9dX10LmdldEJvdW5kaW5nQm94KGFzKSxhcy5hcHBseU1hdHJpeDQoZSk7Y29uc3QgZD10aGlzLnNoYXBlY2FzdCh7aW50ZXJzZWN0c0JvdW5kczp0PT5hcy5pbnRlcnNlY3RzQm94KHQpLGludGVyc2VjdHNSYW5nZTooZSxzLHIsbixvLGEpPT4ob3MuY29weShhKSxvcy5hcHBseU1hdHJpeDQoaHMpLHQuc2hhcGVjYXN0KHtpbnRlcnNlY3RzQm91bmRzOnQ9Pm9zLmludGVyc2VjdHNCb3godCksaW50ZXJzZWN0c1JhbmdlOih0LHIsYSxoLGwpPT5pKGUscyx0LHIsbixvLGgsbCl9KSl9KTtyZXR1cm4gZnMucmVsZWFzZVByaW1pdGl2ZShsKSxmcy5yZWxlYXNlUHJpbWl0aXZlKGMpLGR9aW50ZXJzZWN0c0JveCh0LGUpe3JldHVybiBscy5zZXQodC5taW4sdC5tYXgsZSksbHMubmVlZHNVcGRhdGU9ITAsdGhpcy5zaGFwZWNhc3Qoe2ludGVyc2VjdHNCb3VuZHM6dD0+bHMuaW50ZXJzZWN0c0JveCh0KSxpbnRlcnNlY3RzVHJpYW5nbGU6dD0+bHMuaW50ZXJzZWN0c1RyaWFuZ2xlKHQpfSl9aW50ZXJzZWN0c1NwaGVyZSh0KXtyZXR1cm4gdGhpcy5zaGFwZWNhc3Qoe2ludGVyc2VjdHNCb3VuZHM6ZT0+dC5pbnRlcnNlY3RzQm94KGUpLGludGVyc2VjdHNUcmlhbmdsZTplPT5lLmludGVyc2VjdHNTcGhlcmUodCl9KX1jbG9zZXN0UG9pbnRUb0dlb21ldHJ5KHQsZSl7bGV0IHM9YXJndW1lbnRzLmxlbmd0aD4yJiZ2b2lkIDAhPT1hcmd1bWVudHNbMl0/YXJndW1lbnRzWzJdOnt9LGk9YXJndW1lbnRzLmxlbmd0aD4zJiZ2b2lkIDAhPT1hcmd1bWVudHNbM10/YXJndW1lbnRzWzNdOnt9LHI9YXJndW1lbnRzLmxlbmd0aD40JiZ2b2lkIDAhPT1hcmd1bWVudHNbNF0/YXJndW1lbnRzWzRdOjAsbj1hcmd1bWVudHMubGVuZ3RoPjUmJnZvaWQgMCE9PWFyZ3VtZW50c1s1XT9hcmd1bWVudHNbNV06MS8wO3QuYm91bmRpbmdCb3h8fHQuY29tcHV0ZUJvdW5kaW5nQm94KCksbHMuc2V0KHQuYm91bmRpbmdCb3gubWluLHQuYm91bmRpbmdCb3gubWF4LGUpLGxzLm5lZWRzVXBkYXRlPSEwO2NvbnN0IG89dGhpcy5nZW9tZXRyeSxhPW8uYXR0cmlidXRlcy5wb3NpdGlvbixoPW8uaW5kZXgsbD10LmF0dHJpYnV0ZXMucG9zaXRpb24sYz10LmluZGV4LHU9ZnMuZ2V0UHJpbWl0aXZlKCksZD1mcy5nZXRQcmltaXRpdmUoKTtsZXQgbT1kcyx5PW1zLHA9bnVsbCx4PW51bGw7aSYmKHA9eXMseD1wcyk7bGV0IGY9MS8wLGc9bnVsbCxiPW51bGw7cmV0dXJuIGhzLmNvcHkoZSkuaW52ZXJ0KCksY3MubWF0cml4LmNvcHkoaHMpLHRoaXMuc2hhcGVjYXN0KHtib3VuZHNUcmF2ZXJzZU9yZGVyOnQ9PmxzLmRpc3RhbmNlVG9Cb3godCksaW50ZXJzZWN0c0JvdW5kczoodCxlLHMpPT5zPGYmJnM8biYmKGUmJihjcy5taW4uY29weSh0Lm1pbiksY3MubWF4LmNvcHkodC5tYXgpLGNzLm5lZWRzVXBkYXRlPSEwKSwhMCksaW50ZXJzZWN0c1JhbmdlOihzLGkpPT57aWYodC5ib3VuZHNUcmVlKXJldHVybiB0LmJvdW5kc1RyZWUuc2hhcGVjYXN0KHtib3VuZHNUcmF2ZXJzZU9yZGVyOnQ9PmNzLmRpc3RhbmNlVG9Cb3godCksaW50ZXJzZWN0c0JvdW5kczoodCxlLHMpPT5zPGYmJnM8bixpbnRlcnNlY3RzUmFuZ2U6KHQsbik9Pntmb3IobGV0IG89Myp0LHc9MyoodCtuKTtvPHc7bys9Myl7cWUoZCxvLGMsbCksZC5hLmFwcGx5TWF0cml4NChlKSxkLmIuYXBwbHlNYXRyaXg0KGUpLGQuYy5hcHBseU1hdHJpeDQoZSksZC5uZWVkc1VwZGF0ZT0hMDtmb3IobGV0IHQ9MypzLGU9MyoocytpKTt0PGU7dCs9Myl7cWUodSx0LGgsYSksdS5uZWVkc1VwZGF0ZT0hMDtjb25zdCBlPXUuZGlzdGFuY2VUb1RyaWFuZ2xlKGQsbSxwKTtpZihlPGYmJih5LmNvcHkobSkseCYmeC5jb3B5KHApLGY9ZSxnPXQvMyxiPW8vMyksZTxyKXJldHVybiEwfX19fSk7Zm9yKGxldCB0PTAsbj1jP2MuY291bnQ6bC5jb3VudDt0PG47dCs9Myl7cWUoZCx0LGMsbCksZC5hLmFwcGx5TWF0cml4NChlKSxkLmIuYXBwbHlNYXRyaXg0KGUpLGQuYy5hcHBseU1hdHJpeDQoZSksZC5uZWVkc1VwZGF0ZT0hMDtmb3IobGV0IGU9MypzLG49MyoocytpKTtlPG47ZSs9Myl7cWUodSxlLGgsYSksdS5uZWVkc1VwZGF0ZT0hMDtjb25zdCBzPXUuZGlzdGFuY2VUb1RyaWFuZ2xlKGQsbSxwKTtpZihzPGYmJih5LmNvcHkobSkseCYmeC5jb3B5KHApLGY9cyxnPWUvMyxiPXQvMyksczxyKXJldHVybiEwfX19fSksZnMucmVsZWFzZVByaW1pdGl2ZSh1KSxmcy5yZWxlYXNlUHJpbWl0aXZlKGQpLGY9PT0xLzA/bnVsbDoocy5wb2ludD9zLnBvaW50LmNvcHkoeSk6cy5wb2ludD15LmNsb25lKCkscy5kaXN0YW5jZT1mLHMuZmFjZUluZGV4PWcsaSYmKGkucG9pbnQ/aS5wb2ludC5jb3B5KHgpOmkucG9pbnQ9eC5jbG9uZSgpLGkucG9pbnQuYXBwbHlNYXRyaXg0KGhzKSx5LmFwcGx5TWF0cml4NChocyksaS5kaXN0YW5jZT15LnN1YihpLnBvaW50KS5sZW5ndGgoKSxpLmZhY2VJbmRleD1iKSxzKX1jbG9zZXN0UG9pbnRUb1BvaW50KHQpe2xldCBlPWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTp7fSxzPWFyZ3VtZW50cy5sZW5ndGg+MiYmdm9pZCAwIT09YXJndW1lbnRzWzJdP2FyZ3VtZW50c1syXTowLGk9YXJndW1lbnRzLmxlbmd0aD4zJiZ2b2lkIDAhPT1hcmd1bWVudHNbM10/YXJndW1lbnRzWzNdOjEvMDtjb25zdCByPXMqcyxuPWkqaTtsZXQgbz0xLzAsYT1udWxsO2lmKHRoaXMuc2hhcGVjYXN0KHtib3VuZHNUcmF2ZXJzZU9yZGVyOmU9Pih1cy5jb3B5KHQpLmNsYW1wKGUubWluLGUubWF4KSx1cy5kaXN0YW5jZVRvU3F1YXJlZCh0KSksaW50ZXJzZWN0c0JvdW5kczoodCxlLHMpPT5zPG8mJnM8bixpbnRlcnNlY3RzVHJpYW5nbGU6KGUscyk9PntlLmNsb3Nlc3RQb2ludFRvUG9pbnQodCx1cyk7Y29uc3QgaT10LmRpc3RhbmNlVG9TcXVhcmVkKHVzKTtyZXR1cm4gaTxvJiYoZHMuY29weSh1cyksbz1pLGE9cyksaTxyfX0pLG89PT0xLzApcmV0dXJuIG51bGw7Y29uc3QgaD1NYXRoLnNxcnQobyk7cmV0dXJuIGUucG9pbnQ/ZS5wb2ludC5jb3B5KGRzKTplLnBvaW50PWRzLmNsb25lKCksZS5kaXN0YW5jZT1oLGUuZmFjZUluZGV4PWEsZX1nZXRCb3VuZGluZ0JveCh0KXt0Lm1ha2VFbXB0eSgpO3JldHVybiB0aGlzLl9yb290cy5mb3JFYWNoKChlPT57b2UoMCxuZXcgRmxvYXQzMkFycmF5KGUpLHhzKSx0LnVuaW9uKHhzKX0pKSx0fX1jb25zdCBicz1ncy5wcm90b3R5cGUucmF5Y2FzdDtncy5wcm90b3R5cGUucmF5Y2FzdD1mdW5jdGlvbigpe2Zvcih2YXIgdD1hcmd1bWVudHMubGVuZ3RoLGU9bmV3IEFycmF5KHQpLHM9MDtzPHQ7cysrKWVbc109YXJndW1lbnRzW3NdO2lmKGVbMF0uaXNNZXNoKXtjb25zb2xlLndhcm4oJ01lc2hCVkg6IFRoZSBmdW5jdGlvbiBzaWduYXR1cmUgYW5kIHJlc3VsdHMgZnJhbWUgZm9yICJyYXljYXN0IiBoYXMgY2hhbmdlZC4gU2VlIGRvY3MgZm9yIG5ldyBzaWduYXR1cmUuJyk7Y29uc3RbdCxzLGkscl09ZTtyZXR1cm4gYnMuY2FsbCh0aGlzLGksdC5tYXRlcmlhbCkuZm9yRWFjaCgoZT0+eyhlPVJlKGUsdCxzKSkmJnIucHVzaChlKX0pKSxyfXJldHVybiBicy5hcHBseSh0aGlzLGUpfTtjb25zdCB3cz1ncy5wcm90b3R5cGUucmF5Y2FzdEZpcnN0O2dzLnByb3RvdHlwZS5yYXljYXN0Rmlyc3Q9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9YXJndW1lbnRzLmxlbmd0aCxlPW5ldyBBcnJheSh0KSxzPTA7czx0O3MrKyllW3NdPWFyZ3VtZW50c1tzXTtpZihlWzBdLmlzTWVzaCl7Y29uc29sZS53YXJuKCdNZXNoQlZIOiBUaGUgZnVuY3Rpb24gc2lnbmF0dXJlIGFuZCByZXN1bHRzIGZyYW1lIGZvciAicmF5Y2FzdEZpcnN0IiBoYXMgY2hhbmdlZC4gU2VlIGRvY3MgZm9yIG5ldyBzaWduYXR1cmUuJyk7Y29uc3RbdCxzLGldPWU7cmV0dXJuIFJlKHdzLmNhbGwodGhpcyxpLHQubWF0ZXJpYWwpLHQscyl9cmV0dXJuIHdzLmFwcGx5KHRoaXMsZSl9O2NvbnN0IE1zPWdzLnByb3RvdHlwZS5jbG9zZXN0UG9pbnRUb1BvaW50O2dzLnByb3RvdHlwZS5jbG9zZXN0UG9pbnRUb1BvaW50PWZ1bmN0aW9uKCl7Zm9yKHZhciB0PWFyZ3VtZW50cy5sZW5ndGgsZT1uZXcgQXJyYXkodCkscz0wO3M8dDtzKyspZVtzXT1hcmd1bWVudHNbc107aWYoZVswXS5pc01lc2gpe2NvbnNvbGUud2FybignTWVzaEJWSDogVGhlIGZ1bmN0aW9uIHNpZ25hdHVyZSBhbmQgcmVzdWx0cyBmcmFtZSBmb3IgImNsb3Nlc3RQb2ludFRvUG9pbnQiIGhhcyBjaGFuZ2VkLiBTZWUgZG9jcyBmb3IgbmV3IHNpZ25hdHVyZS4nKSxlLnVuc2hpZnQoKTtjb25zdCB0PWVbMV0scz17fTtyZXR1cm4gZVsxXT1zLE1zLmFwcGx5KHRoaXMsZSksdCYmdC5jb3B5KHMucG9pbnQpLHMuZGlzdGFuY2V9cmV0dXJuIE1zLmFwcGx5KHRoaXMsZSl9O2NvbnN0IHpzPWdzLnByb3RvdHlwZS5jbG9zZXN0UG9pbnRUb0dlb21ldHJ5O2dzLnByb3RvdHlwZS5jbG9zZXN0UG9pbnRUb0dlb21ldHJ5PWZ1bmN0aW9uKCl7Zm9yKHZhciB0PWFyZ3VtZW50cy5sZW5ndGgsZT1uZXcgQXJyYXkodCkscz0wO3M8dDtzKyspZVtzXT1hcmd1bWVudHNbc107Y29uc3QgaT1lWzJdLHI9ZVszXTtpZihpJiZpLmlzVmVjdG9yM3x8ciYmci5pc1ZlY3RvcjMpe2NvbnNvbGUud2FybignTWVzaEJWSDogVGhlIGZ1bmN0aW9uIHNpZ25hdHVyZSBhbmQgcmVzdWx0cyBmcmFtZSBmb3IgImNsb3Nlc3RQb2ludFRvR2VvbWV0cnkiIGhhcyBjaGFuZ2VkLiBTZWUgZG9jcyBmb3IgbmV3IHNpZ25hdHVyZS4nKTtjb25zdCB0PXt9LHM9e30sbj1lWzFdO3JldHVybiBlWzJdPXQsZVszXT1zLHpzLmFwcGx5KHRoaXMsZSksaSYmaS5jb3B5KHQucG9pbnQpLHImJnIuY29weShzLnBvaW50KS5hcHBseU1hdHJpeDQobiksdC5kaXN0YW5jZX1yZXR1cm4genMuYXBwbHkodGhpcyxlKX07Y29uc3QgdnM9Z3MucHJvdG90eXBlLnJlZml0O2dzLnByb3RvdHlwZS5yZWZpdD1mdW5jdGlvbigpe2Zvcih2YXIgdD1hcmd1bWVudHMubGVuZ3RoLGU9bmV3IEFycmF5KHQpLHM9MDtzPHQ7cysrKWVbc109YXJndW1lbnRzW3NdO2NvbnN0IGk9ZVswXSxyPWVbMV07aWYociYmKHIgaW5zdGFuY2VvZiBTZXR8fEFycmF5LmlzQXJyYXkocikpKXtjb25zb2xlLndhcm4oJ01lc2hCVkg6IFRoZSBmdW5jdGlvbiBzaWduYXR1cmUgZm9yICJyZWZpdCIgaGFzIGNoYW5nZWQuIFNlZSBkb2NzIGZvciBuZXcgc2lnbmF0dXJlLicpO2NvbnN0IHQ9bmV3IFNldDtyLmZvckVhY2goKGU9PnQuYWRkKGUpKSksaSYmaS5mb3JFYWNoKChlPT50LmFkZChlKSkpLHZzLmNhbGwodGhpcyx0KX1lbHNlIHZzLmFwcGx5KHRoaXMsZSl9LFsiaW50ZXJzZWN0c0dlb21ldHJ5Iiwic2hhcGVjYXN0IiwiaW50ZXJzZWN0c0JveCIsImludGVyc2VjdHNTcGhlcmUiXS5mb3JFYWNoKCh0PT57Y29uc3QgZT1ncy5wcm90b3R5cGVbdF07Z3MucHJvdG90eXBlW3RdPWZ1bmN0aW9uKCl7Zm9yKHZhciBzPWFyZ3VtZW50cy5sZW5ndGgsaT1uZXcgQXJyYXkocykscj0wO3I8cztyKyspaVtyXT1hcmd1bWVudHNbcl07cmV0dXJuKG51bGw9PT1pWzBdfHxpWzBdLmlzTWVzaCkmJihpLnNoaWZ0KCksY29uc29sZS53YXJuKGBNZXNoQlZIOiBUaGUgZnVuY3Rpb24gc2lnbmF0dXJlIGZvciAiJHt0fSIgaGFzIGNoYW5nZWQgYW5kIG5vIGxvbmdlciB0YWtlcyBNZXNoLiBTZWUgZG9jcyBmb3IgbmV3IHNpZ25hdHVyZS5gKSksZS5hcHBseSh0aGlzLGkpfX0pKSxvbm1lc3NhZ2U9ZnVuY3Rpb24odCl7bGV0e2RhdGE6ZX09dCxzPXBlcmZvcm1hbmNlLm5vdygpO3RyeXtpZighZSlyZXR1cm4gdm9pZCBwb3N0TWVzc2FnZShlKTtjb25zdHtpbmRleDp0LHBvc2l0aW9uOmksb3B0aW9uczpyfT1lLG49bmV3IEd0O2lmKG4uc2V0QXR0cmlidXRlKCJwb3NpdGlvbiIsbmV3IFV0KGksMywhMSkpLHQmJm4uc2V0SW5kZXgobmV3IFV0KHQsMSwhMSkpLHIuaW5jbHVkZWRQcm9ncmVzc0NhbGxiYWNrJiYoci5vblByb2dyZXNzPWZ1bmN0aW9uKHQpe2NvbnN0IGU9cGVyZm9ybWFuY2Uubm93KCk7KGUtcz49MTB8fDE9PT10KSYmKHBvc3RNZXNzYWdlKHtlcnJvcjpudWxsLHNlcmlhbGl6ZWQ6bnVsbCxwb3NpdGlvbjpudWxsLHByb2dyZXNzOnR9KSxzPWUpfSksci5ncm91cHMpe2NvbnN0IHQ9ci5ncm91cHM7Zm9yKGNvbnN0IGUgaW4gdCl7Y29uc3Qgcz10W2VdO24uYWRkR3JvdXAocy5zdGFydCxzLmNvdW50LHMubWF0ZXJpYWxJbmRleCl9fWNvbnN0IG89bmV3IGdzKG4sciksYT1ncy5zZXJpYWxpemUobyx7Y2xvbmVCdWZmZXJzOiExfSk7cG9zdE1lc3NhZ2Uoe2Vycm9yOm51bGwsc2VyaWFsaXplZDphLHBvc2l0aW9uOmkscHJvZ3Jlc3M6MX0sW2kuYnVmZmVyLC4uLmEucm9vdHNdKX1jYXRjaCh0KXtwb3N0TWVzc2FnZSh7ZXJyb3I6dCxzZXJpYWxpemVkOm51bGwscG9zaXRpb246bnVsbCxwcm9ncmVzczoxfSl9fX0oKTsKCg==",ky=null,Fy=!1,function(e){return Uy=Uy||By(Hy,ky,Fy),new Worker(Uy,e)});const Yy=new class extends fn{constructor(){super(),this.workerPool=new Dy(4),this.computingCount=0,this.workerPool.setWorkerCreator((()=>{const e=new Oy;return e.addEventListener("error",(e=>{throw e.message?new Error(`GenerateMeshBVHWorker: Could not create Web Worker with error "${e.message}"`):new Error("GenerateMeshBVHWorker: Could not create Web Worker.")})),e}))}generate(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};const{workerPool:n}=this;return new Promise(((i,s)=>{!function(e){const t=e.attributes,n=e.morphTargets,i=new Map;for(const e in t){const n=t[e];n.isInterleavedBufferAttribute&&(i.has(n)||i.set(n,wm(n)),t[e]=i.get(n))}for(const e in n){const t=n[e];t.isInterleavedBufferAttribute&&(i.has(t)||i.set(t,wm(t)),n[e]=i.get(t))}}(e);const r=e.index?e.index.array:null,o=e.attributes.position.array;this.computingCount++,n.postMessage({index:r,position:o,options:Object.assign(Object.assign({},t),{onProgress:null,includedProgressCallback:Boolean(t.onProgress),groups:[...e.groups]})}).then((n=>{this.computingCount--;const{data:r}=n;if(r){if(r.error)s(new Error(r.error));else if(r.serialized){const{serialized:n,position:s}=r,o=Ly.deserialize(n,e,{setIndex:!1}),a=Object.assign({setBoundingBox:!1},t);if(e.attributes.position instanceof ul?e.attributes.position.data.array=s:e.attributes.position.array=s,e.index)e.index.array=n.index;else{const t=new Ts(n.index,1,!1);e.setIndex(t)}a.setBoundingBox&&(e.boundingBox=o.getBoundingBox(new li)),i(o)}else t.onProgress&&t.onProgress(r.progress);this.computingCount<=0&&this.dispatchEvent({type:"end"})}}))}))}dispose(){this.workerPool.dispose()}};var Ky=function(){function e(t,n){if(void 0===n&&(n=null),this.nonEmpty=!1,t||n){if(!t)throw new Error("Parameter head cannot be null.");this.head=t,this.tail=n||e.NIL,this.nonEmpty=!0}else{if(e.NIL)throw new Error("Parameters head and tail are null. Use the NIL element instead.");this.nonEmpty=!1}}return Object.defineProperty(e.prototype,"length",{get:function(){if(!this.nonEmpty)return 0;if(this.tail===e.NIL)return 1;for(var t=0,n=this;n.nonEmpty;)++t,n=n.tail;return t},enumerable:!0,configurable:!0}),e.prototype.prepend=function(t){return new e(t,this)},e.prototype.append=function(t){if(!t)return this;if(!this.nonEmpty)return new e(t);if(this.tail===e.NIL)return new e(t).prepend(this.head);for(var n=new e(this.head),i=n,s=this.tail;s.nonEmpty;)i=i.tail=new e(s.head),s=s.tail;return i.tail=new e(t),n},e.prototype.insertWithPriority=function(t){if(!this.nonEmpty)return new e(t);var n=t.priority;if(n>this.head.priority)return this.prepend(t);for(var i=new e(this.head),s=i,r=this.tail;r.nonEmpty;){if(n>r.head.priority)return s.tail=r.prepend(t),i;s=s.tail=new e(r.head),r=r.tail}return s.tail=new e(t),i},e.prototype.filterNot=function(t){if(!this.nonEmpty||null==t)return this;if(t===this.head.listener)return this.tail;for(var n=new e(this.head),i=n,s=this.tail;s.nonEmpty;){if(s.head.listener===t)return i.tail=s.tail,n;i=i.tail=new e(s.head),s=s.tail}return this},e.prototype.contains=function(e){if(!this.nonEmpty)return!1;for(var t=this;t.nonEmpty;){if(t.head.listener===e)return!0;t=t.tail}return!1},e.prototype.find=function(e){if(!this.nonEmpty)return null;for(var t=this;t.nonEmpty;){if(t.head.listener===e)return t.head;t=t.tail}return null},e.prototype.toString=function(){for(var e="",t=this;t.nonEmpty;)e+=t.head+" -> ",t=t.tail;return"[List "+(e+="NIL")+"]"},e.NIL=new e(null,null),e}(),jy=Object.defineProperty({SlotList:Ky},"__esModule",{value:!0}),Jy=function(){function e(e,t,n,i){void 0===n&&(n=!1),void 0===i&&(i=0),this._enabled=!0,this._once=!1,this._priority=0,this._listener=e,this._once=n,this._signal=t,this._priority=i,this.verifyListener(e)}return e.prototype.execute0=function(){this._enabled&&(this._once&&this.remove(),this._params&&this._params.length?this._listener.apply(null,this._params):this._listener())},e.prototype.execute1=function(e){this._enabled&&(this._once&&this.remove(),this._params&&this._params.length?this._listener.apply(null,[e].concat(this._params)):this._listener(e))},e.prototype.execute=function(e){if(this._enabled){this._once&&this.remove(),this._params&&this._params.length&&(e=e.concat(this._params));var t=e.length;0===t?this._listener():1===t?this._listener(e[0]):2===t?this._listener(e[0],e[1]):3===t?this._listener(e[0],e[1],e[2]):this._listener.apply(null,e)}},Object.defineProperty(e.prototype,"listener",{get:function(){return this._listener},set:function(e){if(null==e)throw new Error("Given listener is null.\nDid you want to set enabled to false instead?");this.verifyListener(e),this._listener=e},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"once",{get:function(){return this._once},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"priority",{get:function(){return this._priority},enumerable:!0,configurable:!0}),e.prototype.toString=function(){return"[Slot listener: "+this._listener+", once: "+this._once+", priority: "+this._priority+", enabled: "+this._enabled+"]"},Object.defineProperty(e.prototype,"enabled",{get:function(){return this._enabled},set:function(e){this._enabled=e},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"params",{get:function(){return this._params},set:function(e){this._params=e},enumerable:!0,configurable:!0}),e.prototype.remove=function(){this._signal.remove(this._listener)},e.prototype.verifyListener=function(e){if(null==e)throw new Error("Given listener is null.");if(null==this._signal)throw new Error("Internal signal reference has not been set yet.")},e}(),Qy=Object.defineProperty({Slot:Jy},"__esModule",{value:!0}),qy=function(){function e(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];this.slots=jy.SlotList.NIL,this.valueClasses=1===e.length&&e[0]instanceof Array?e[0]:e}return Object.defineProperty(e.prototype,"valueClasses",{get:function(){return this._valueClasses},set:function(e){this._valueClasses=e?e.slice():[];for(var t=this._valueClasses.length;t--;)if(!(this._valueClasses[t]instanceof Object))throw new Error("Invalid valueClasses argument: item at index "+t+" should be a Class but was:<"+this._valueClasses[t]+">."+this._valueClasses[t])},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"numListeners",{get:function(){return this.slots.length},enumerable:!0,configurable:!0}),e.prototype.addOnce=function(e){return this.registerListener(e,!0)},e.prototype.remove=function(e){var t=this.slots.find(e);return t?(this.slots=this.slots.filterNot(e),t):null},e.prototype.removeAll=function(){this.slots=jy.SlotList.NIL},e.prototype.dispatch=function(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];var n=this._valueClasses.length,i=e.length;if(i<n)throw new Error("Incorrect number of arguments. Expected at least "+n+" but received "+i+".");for(var s=0;s<n;s++)if(!(null===e[s]||e[s]instanceof this._valueClasses[s]||e[s].constructor===this._valueClasses[s]))throw new Error("Value object <"+e[s]+"> is not an instance of <"+this._valueClasses[s]+">.");var r=this.slots;if(r.nonEmpty)for(;r.nonEmpty;)r.head.execute(e),r=r.tail},e.prototype.registerListener=function(e,t){if(void 0===t&&(t=!1),this.registrationPossible(e,t)){var n=new Qy.Slot(e,this,t);return this.slots=this.slots.prepend(n),n}return this.slots.find(e)},e.prototype.registrationPossible=function(e,t){if(!this.slots.nonEmpty)return!0;var n=this.slots.find(e);if(!n)return!0;if(n.once!==t)throw new Error("You cannot addOnce() then add() the same listener without removing the relationship first.");return!1},e}(),$y=Object.defineProperty({OnceSignal:qy},"__esModule",{value:!0}),eb="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{};function tb(e){if(e.__esModule)return e;var t=Object.defineProperty({},"__esModule",{value:!0});return Object.keys(e).forEach((function(n){var i=Object.getOwnPropertyDescriptor(e,n);Object.defineProperty(t,n,i.get?i:{enumerable:!0,get:function(){return e[n]}})})),t}function nb(e){var t={exports:{}};return e(t,t.exports),t.exports}function ib(e){throw new Error('Could not dynamically require "'+e+'". Please configure the dynamicRequireTargets option of @rollup/plugin-commonjs appropriately for this require call to behave properly.')}var sb=tb(pf),rb=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return sb.__extends(t,e),t.prototype.add=function(e){return this.registerListener(e)},t}($y.OnceSignal),ob=Object.defineProperty({Signal:rb},"__esModule",{value:!0}),ab=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return sb.__extends(t,e),t.prototype.addWithPriority=function(e,t){return void 0===t&&(t=0),this.registerListenerWithPriority(e,!1,t)},t.prototype.addOnceWithPriority=function(e,t){return void 0===t&&(t=0),this.registerListenerWithPriority(e,!0,t)},t.prototype.registerListener=function(e,t){return void 0===t&&(t=!1),this.registerListenerWithPriority(e,t)},t.prototype.registerListenerWithPriority=function(e,t,n){if(void 0===n&&(n=0),this.registrationPossible(e,t)){var i=new Qy.Slot(e,this,t,n);return this.slots=this.slots.insertWithPriority(i),i}return this.slots.find(e)},t}(ob.Signal),lb=Object.defineProperty({PrioritySignal:ab},"__esModule",{value:!0}),cb=function(e){function t(t){void 0===t&&(t=null);for(var n=[],i=1;i<arguments.length;i++)n[i-1]=arguments[i];var s=this;return n=1===n.length&&n[0]instanceof Array?n[0]:n,(s=e.call(this,n)||this)._target=t,s}return sb.__extends(t,e),Object.defineProperty(t.prototype,"target",{get:function(){return this._target},set:function(e){e!==this._target&&(this.removeAll(),this._target=e)},enumerable:!0,configurable:!0}),t.prototype.dispatch=function(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];var n=this._valueClasses.length,i=e.length;if(i<n)throw new Error("Incorrect number of arguments. Expected at least "+n+" but received "+i+".");for(var s=0;s<n;s++)if(null!==e[s]&&e[s].constructor!==this._valueClasses[s])throw new Error("Value object <"+e[s]+"> is not an instance of <"+this._valueClasses[s]+">.");var r=e[0];r&&(r.target&&(r=r.clone(),e[0]=r),r.target=this.target,r.currentTarget=this.target,r.signal=this);for(var o=this.slots;o.nonEmpty;)o.head.execute(e),o=o.tail;if(r&&r.bubbles)for(var a=this.target;a&&a.hasOwnProperty("parent")&&(null===(a=a.parent).onEventBubbled||(r.currentTarget=a,a.onEventBubbled(r))););},t}(lb.PrioritySignal),hb=Object.defineProperty({DeluxeSignal:cb},"__esModule",{value:!0}),db=function(){function e(e){void 0===e&&(e=!1),this._bubbles=e}return Object.defineProperty(e.prototype,"signal",{get:function(){return this._signal},set:function(e){this._signal=e},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"target",{get:function(){return this._target},set:function(e){this._target=e},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"currentTarget",{get:function(){return this._currentTarget},set:function(e){this._currentTarget=e},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"bubbles",{get:function(){return this._bubbles},set:function(e){this._bubbles=e},enumerable:!0,configurable:!0}),e.prototype.clone=function(){return new e(this._bubbles)},e}(),ub=Object.defineProperty({GenericEvent:db},"__esModule",{value:!0}),pb=Symbol("IOnceSignal"),mb=Object.defineProperty({IOnceSignal:pb},"__esModule",{value:!0}),fb=Symbol("IPrioritySignal"),gb=Object.defineProperty({IPrioritySignal:fb},"__esModule",{value:!0}),yb=Symbol("ISignal"),bb=Object.defineProperty({ISignal:yb},"__esModule",{value:!0}),vb=Symbol("ISlot"),xb=Object.defineProperty({ISlot:vb},"__esModule",{value:!0}),wb=function(){function e(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];this.valueClasses=1===e.length&&e[0]instanceof Array?e[0]:e}return Object.defineProperty(e.prototype,"valueClasses",{get:function(){return this._valueClasses},set:function(e){this._valueClasses=e?e.slice():[];for(var t=this._valueClasses.length;t--;)if("function"!=typeof this._valueClasses[t])throw new Error("Invalid valueClasses argument: item at index "+t+" should be a Class but was:<"+this._valueClasses[t]+"'>."+this._valueClasses[t])},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"numListeners",{get:function(){return this.slot?1:0},enumerable:!0,configurable:!0}),e.prototype.add=function(e){return this.registerListener(e)},e.prototype.addOnce=function(e){return this.registerListener(e,!0)},e.prototype.remove=function(e){if(this.slot&&this.slot.listener===e){var t=this.slot;return this.slot=null,t}return null},e.prototype.removeAll=function(){this.slot&&this.slot.remove()},e.prototype.dispatch=function(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];var n=this._valueClasses.length,i=e.length;if(i<n)throw new Error("Incorrect number of arguments. Expected at least "+n+" but received "+i+".");for(var s=0;s<n;s++)if(!(null===e[s]||e[s]instanceof this._valueClasses[s]||e[s].constructor===this._valueClasses[s]))throw new Error("Value object <"+e[s]+"> is not an instance of <"+this._valueClasses[s]+">.");this.slot&&this.slot.execute(e)},e.prototype.registerListener=function(e,t){if(void 0===t&&(t=!1),this.slot)throw new Error("You cannot add or addOnce with a listener already added, remove the current listener first.");return this.slot=new Qy.Slot(e,this,t)},e}(),Sb=Object.defineProperty({MonoSignal:wb},"__esModule",{value:!0}),Mb=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return sb.__extends(t,e),t.prototype.addOnce=function(t){var n=e.prototype.addOnce.call(this,t);return this.isDispatched&&(n.execute(this.valueObjects),n.remove()),n},t.prototype.dispatch=function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];if(this.isDispatched)throw new Error("You cannot dispatch() a Promise more than once");this.isDispatched=!0,this.valueObjects=t,e.prototype.dispatch.apply(this,t)},t}($y.OnceSignal),Tb=Object.defineProperty({Promise:Mb},"__esModule",{value:!0});hb.DeluxeSignal,ub.GenericEvent,mb.IOnceSignal,gb.IPrioritySignal,bb.ISignal,xb.ISlot,Sb.MonoSignal,$y.OnceSignal,lb.PrioritySignal,Tb.Promise;var Cb=ob.Signal;Qy.Slot,jy.SlotList;const Lb=new cl;Lb.name="Scene";class Rb{constructor(e,t){this.signals=e,this.viewportState=t,this.scene=Lb.clone(),this.scene.castShadow=!0,this.scene.receiveShadow=!0,this.selectedObjects={edge:[],stroke:[],opacity:[],highlight:[],emissive:[]},this.intersectsList={meshOfModelList:[],poiIconList:[],otherObjList:[],getAll:function(){return[...this.meshOfModelList,...this.poiIconList,...this.otherObjList]}}}addObject(e,t){if(this.viewportState.isDisposed)return this.removeObject(e),void Vm("Scene is disposed");t?t.add(e):this.scene.add(e),this._triggerObjectAdded(e),this.signals.objectAdded.dispatch(e)}removeObject(e){function t(e){var t;(e instanceof ws||e instanceof kh||e instanceof Uh)&&((t=e.map)&&t.isTexture&&t.dispose()),e.dispose()}e.traverse((e=>{if("Mesh"===e.type){const n=e;n.geometry.dispose(),sg(n.material)?n.material.forEach((e=>t(e))):n.material&&t(n.material)}e instanceof CS&&e.element.remove();const{meshOfModelList:n,poiIconList:i,otherObjList:s}=this.intersectsList,r=n.findIndex((t=>t.uuid===e.uuid)),o=i.findIndex((t=>t.uuid===e.uuid)),a=s.findIndex((t=>t.uuid===e.uuid));r>-1&&this.intersectsList.meshOfModelList.splice(r,1),o>-1&&this.intersectsList.poiIconList.splice(o,1),a>-1&&this.intersectsList.otherObjList.splice(a,1)})),e.removeFromParent(),this.signals.objectRemoved.dispatch(e)}openSceneFog(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};const{color:t=13426943,near:n=500,far:i=5e4}=e;this.scene.fog=new ll(t,n,i),this.signals.sceneChanged.dispatch()}closeSceneFog(){this.scene.fog=null,this.signals.sceneChanged.dispatch()}edgeShow(e,t){const n=[],i=e=>{-1===this.selectedObjects.edge.findIndex((t=>t.uuid===e.uuid))&&n.push(e)};return sg(e)?e.forEach((e=>i(e))):rg(e)&&i(e),this.selectedObjects.edge=[...this.selectedObjects.edge,...n],this.signals.outlineChange.dispatch({objects:this.selectedObjects.edge,options:t}),Promise.resolve()}unEdgeShow(e){e||(e=[...this.selectedObjects.edge]);const t=e=>{const t=this.selectedObjects.edge.findIndex((t=>t.uuid===e.uuid));return-1===t||(this.selectedObjects.edge.splice(t,1),this.signals.outlineChange.dispatch({objects:this.selectedObjects.edge})),Promise.resolve()};return sg(e)?Promise.all(e.map((e=>t(e)))):rg(e)?t(e):Promise.resolve()}strokeShow(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};const{isOpacityShow:n=!0,color:i=4647927,opacity:s=.2,edgeColor:r=61183,edgeOpacity:o=1}=t,a=e=>{if(-1!==this.selectedObjects.stroke.findIndex((t=>t.uuid===e.uuid)))return Promise.resolve();if(e.userData.strokeGroup)return Promise.resolve();const t=new MS({id:e.uuid});return e.traverse((n=>{if(n instanceof or){const i=new Jc(n.geometry,89),s=new sc(i,new jl({color:r,transparent:!0,opacity:o}));Ym(s,n),e.attach(s),t.add(s)}})),e.userData.strokeGroup=t,this.addObject(t,e),this.selectedObjects.stroke.push(e),Promise.resolve()};return n&&this.opacityShow(e,{color:i,opacity:s}),sg(e)?Promise.all(e.map((e=>a(e)))):rg(e)?a(e):Promise.resolve()}unStrokeShow(e){e||(e=[...this.selectedObjects.stroke]);const t=e=>{if(!e.userData.strokeGroup)return Promise.resolve();this.removeObject(e.userData.strokeGroup),Reflect.deleteProperty(e.userData,"strokeGroup");const t=this.selectedObjects.stroke.findIndex((t=>t.uuid===e.uuid));return-1===t||(this.selectedObjects.stroke.splice(t,1),this.signals.geometryChanged.dispatch(),this.unOpacityShow(e)),Promise.resolve()};return sg(e)?Promise.all(e.map((e=>t(e)))):rg(e)?t(e):Promise.resolve()}opacityShow(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};const{color:n="#fff",opacity:i=.8}=t;function s(e){return Reflect.construct(e.constructor,[{transparent:!0,depthWrite:!1,side:e.side,color:n,opacity:i}])}const r=e=>(-1!==this.selectedObjects.opacity.findIndex((t=>t.uuid===e.uuid))||(e.traverse((e=>{if(e instanceof or){if(e.userData.material)return;e.userData.material=e.material,sg(e.material)?e.material.forEach(((t,n)=>{e.material[n]=s(t)})):e.material instanceof xs&&(e.material=s(e.material))}})),this.signals.materialChanged.dispatch(),this.selectedObjects.opacity.push(e)),Promise.resolve());return sg(e)?Promise.all(e.map((e=>r(e)))):rg(e)?r(e):Promise.resolve()}unOpacityShow(e){e||(e=[...this.selectedObjects.opacity]);const t=e=>new Promise((t=>{const n=this.selectedObjects.opacity.findIndex((t=>t.uuid===e.uuid));-1===n&&t(),this.selectedObjects.opacity.splice(n,1),e.traverse((e=>{if(e instanceof or){if(!e.userData.material)return;e.material.dispose(),e.material=e.userData.material,Reflect.deleteProperty(e.userData,"material")}})),this.signals.materialChanged.dispatch(),t()}));return sg(e)?Promise.all(e.map((e=>t(e)))):rg(e)?t(e):Promise.resolve()}highlightShow(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};const{color:n="red",opacity:i=1}=t;function s(e){e instanceof kh&&(e.color=new Fn(n),e.opacity=i,e.transparent=i<1)}const r=e=>(-1!==this.selectedObjects.highlight.findIndex((t=>t.uuid===e.uuid))||(e.traverse((e=>{if(e instanceof or){if(e.userData.material)return;e.userData.material=e.material,e.material=ef(e),sg(e.material)?e.material.forEach((e=>s(e))):e.material instanceof xs&&s(e.material)}})),this.signals.materialChanged.dispatch(),this.selectedObjects.highlight.push(e)),Promise.resolve());return sg(e)?Promise.all(e.map((e=>r(e)))):rg(e)?r(e):Promise.resolve()}unHighlightShow(e){e||(e=[...this.selectedObjects.highlight]);const t=e=>new Promise((t=>{const n=this.selectedObjects.highlight.findIndex((t=>t.uuid===e.uuid));-1===n&&t(),this.selectedObjects.highlight.splice(n,1),e.traverse((e=>{if(e instanceof or){if(!e.userData.material)return;e.material=e.userData.material,Reflect.deleteProperty(e.userData,"material")}})),this.signals.materialChanged.dispatch(),t()}));return sg(e)?Promise.all(e.map((e=>t(e)))):rg(e)?t(e):Promise.resolve()}emissiveShow(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};const{color:n="red",opacity:i=.3,maxOpacity:s=1,minOpacity:r=0,duration:o=1e3}=t;function a(e){e instanceof kh&&(e.emissive.set(n),e.emissiveIntensity=i,ug({emissiveIntensity:s},{emissiveIntensity:r},{duration:o,repeat:!0},(t=>e.emissiveIntensity=t.emissiveIntensity),(t=>e.userData.animation=t)))}const l=e=>(-1!==this.selectedObjects.emissive.findIndex((t=>t.uuid===e.uuid))||(e.traverse((e=>{if(e instanceof or){if(e.userData.material)return;e.userData.material=e.material,e.material=ef(e),sg(e.material)?e.material.forEach((e=>a(e))):e.material instanceof xs&&a(e.material)}})),this.selectedObjects.emissive.push(e),this.signals.materialChanged.dispatch()),Promise.resolve());return sg(e)?Promise.all(e.map((e=>l(e)))):rg(e)?l(e):Promise.resolve()}unEmissiveShow(e){function t(e){e.userData.animation&&Zm.remove(e.userData.animation)}e||(e=[...this.selectedObjects.emissive]);const n=e=>new Promise((n=>{const i=this.selectedObjects.emissive.findIndex((t=>t.uuid===e.uuid));-1===i&&n(),this.selectedObjects.emissive.splice(i,1),e.traverse((e=>{if(e instanceof or){if(!e.userData.material)return;sg(e.material)?e.material.forEach((e=>t(e))):e.material instanceof xs&&t(e.material),e.material=e.userData.material,Reflect.deleteProperty(e.userData,"material")}})),this.signals.materialChanged.dispatch(),n()}));return sg(e)?Promise.all(e.map((e=>n(e)))):rg(e)?n(e):Promise.resolve()}_triggerObjectAdded(e){if(e instanceof SS)if("Model"===e.stype||"Topology"===e.stype||"Canvas3D"===e.stype)e.traverse((e=>{if(e instanceof or){-1===this.intersectsList.meshOfModelList.findIndex((t=>t.uuid===e.uuid))&&this.intersectsList.meshOfModelList.push(e)}}));else if("Poi"===e.stype){-1===this.intersectsList.poiIconList.findIndex((t=>t.uuid===e.icon.uuid))&&this.intersectsList.poiIconList.push(e.icon)}else if("BaseMesh"===e.stype){-1===this.intersectsList.otherObjList.findIndex((t=>t.uuid===e.uuid))&&this.intersectsList.otherObjList.push(e)}else"Group"===e.stype&&e.children.forEach((e=>this._triggerObjectAdded(e)));else if(e instanceof xS){-1===this.intersectsList.otherObjList.findIndex((t=>t.uuid===e.uuid))&&this.intersectsList.otherObjList.push(e)}else"Object3D"===e.type&&e.traverse((e=>{if(e instanceof or){-1===this.intersectsList.otherObjList.findIndex((t=>t.uuid===e.uuid))&&this.intersectsList.otherObjList.push(e)}}))}}class Gb extends as{constructor(e){super(),this.element=e,this.element.style.position="absolute",this.addEventListener("removed",(()=>{this.traverse((function(e){e instanceof Gb&&null!==e.element.parentNode&&e.element.parentNode.removeChild(e.element)}))}))}}let Ab,_b;const Ib=new ri,Eb=new Wi,Xb=new Wi,zb={objects:new WeakMap};function Pb(){const e=new ri,t=new ri;return function(n,i){return e.setFromMatrixPosition(n.matrixWorld),t.setFromMatrixPosition(i.matrixWorld),e.distanceToSquared(t)}}function Wb(e){const t=function(e){const t=[];return e.traverse((function(e){e instanceof Gb&&t.push(e)})),t}(e).sort((function(e,t){return zb.objects.get(e).distanceToCameraSquared-zb.objects.get(t).distanceToCameraSquared})),n=t.length;for(let e=0,i=t.length;e<i;e++)t[e].element.style.zIndex=""+(n-e)}class Zb{constructor(e){e||(e=document.createElement("div")),e.style.overflow="hidden",this.domElement=e}setSize(e,t){Ab=e/2,_b=t/2,this.domElement.style.width=e+"px",this.domElement.style.height=t+"px"}renderObject(e,t,n){if(e instanceof Gb){Ib.setFromMatrixPosition(e.matrixWorld),Ib.applyMatrix4(Xb);const t=e.element,i="translate(-50%,-100%) translate("+(Ib.x*Ab+Ab)+"px,"+(-Ib.y*_b+_b)+"px)";t.style.transform=i,t.style.display=Km(e)&&Ib.z>=-1&&Ib.z<=1?"block":"none";const s={distanceToCameraSquared:Pb()(n,e)};zb.objects.set(e,s),t.parentNode!==this.domElement&&this.domElement.appendChild(t)}for(let i=0,s=e.children.length;i<s;i++)this.renderObject(e.children[i],t,n)}render(e,t){!0===e.autoUpdate&&e.updateMatrixWorld(),null===t.parent&&t.updateMatrixWorld(),Eb.copy(t.matrixWorldInverse),Xb.multiplyMatrices(t.projectionMatrix,Eb),this.renderObject(e,e,t),Wb(e)}}class Nb extends as{constructor(e){super(),this.element=e,this.element.style.position="absolute",this.addEventListener("removed",(()=>{this.traverse((function(e){e instanceof Nb&&null!==e.element.parentNode&&e.element.parentNode.removeChild(e.element)}))}))}}let Vb,Db,Bb,Hb;function kb(e){return Math.abs(e)<1e-10?0:e}function Fb(e){const t=e.elements;return"matrix3d("+kb(t[0])+","+kb(-t[1])+","+kb(t[2])+","+kb(t[3])+","+kb(t[4])+","+kb(-t[5])+","+kb(t[6])+","+kb(t[7])+","+kb(t[8])+","+kb(-t[9])+","+kb(t[10])+","+kb(t[11])+","+kb(t[12])+","+kb(-t[13])+","+kb(t[14])+","+kb(t[15])+")"}class Ub{constructor(e,t){this.cache={camera:{fov:0,style:""},objects:new WeakMap},e||(e=document.createElement("div")),e.style.overflow="hidden",e.style.pointerEvents="auto",this.domElement=e,t||(t=document.createElement("div")),t.style.transformStyle="preserve-3d",t.style.pointerEvents="auto",t.style.position="absolute",t.style.top="0",e.appendChild(t),this.cameraElement=t}setSize(e,t){Vb=e/2,Db=t/2,this.domElement.style.width=e+"px",this.domElement.style.height=t+"px",this.cameraElement.style.width=e+"px",this.cameraElement.style.height=t+"px"}renderObject(e,t,n,i){if(e instanceof Nb){const t=function(e,t){const n=e.elements;return"translateX(-50%)matrix3d("+kb(n[0])+","+kb(n[1])+","+kb(n[2])+","+kb(n[3])+","+kb(-n[4])+","+kb(-n[5])+","+kb(-n[6])+","+kb(-n[7])+","+kb(n[8])+","+kb(n[9])+","+kb(n[10])+","+kb(n[11])+","+kb(n[12])+","+kb(n[13])+","+kb(n[14])+","+kb(n[15])+")"}(e.matrixWorld),n=e.element;n.style.transform=t,n.style.display=Km(e)?"block":"none";const i={style:t,distanceToCameraSquared:0};this.cache.objects.set(e,i),n.parentNode!==this.cameraElement&&this.cameraElement.appendChild(n)}for(let s=0,r=e.children.length;s<r;s++)this.renderObject(e.children[s],t,n,i)}render(e,t){const n=t.projectionMatrix.elements[5]*Db;this.cache.camera.fov!==n&&(this.domElement.style.perspective=t instanceof mr?n+"px":"",this.cache.camera.fov=n),!0===e.autoUpdate&&e.updateMatrixWorld(),null===t.parent&&t.updateMatrixWorld();let i="";if(t instanceof Zr){i+="scale("+n+")translateX("+kb(-(t.right+t.left)/2)+"px)"+Fb(t.matrixWorldInverse)}else i+="translateZ("+n+"px)"+Fb(t.matrixWorldInverse);const s=i+"translate("+Vb+"px,"+Db+"px)";this.cameraElement.style.transform=s,this.cache.camera.style=s,this.renderObject(e,e,t,i)}}class Ob extends as{constructor(e){super(),this.element=e,this.element.style.position="absolute",this.addEventListener("removed",(()=>{this.traverse((function(e){e instanceof Ob&&null!==e.element.parentNode&&e.element.parentNode.removeChild(e.element)}))}))}}function Yb(e){return Math.abs(e)<1e-10?0:e}function Kb(e){const t=e.elements;return"matrix3d("+Yb(t[0])+","+Yb(-t[1])+","+Yb(t[2])+","+Yb(t[3])+","+Yb(t[4])+","+Yb(-t[5])+","+Yb(t[6])+","+Yb(t[7])+","+Yb(t[8])+","+Yb(-t[9])+","+Yb(t[10])+","+Yb(t[11])+","+Yb(t[12])+","+Yb(-t[13])+","+Yb(t[14])+","+Yb(t[15])+")"}class jb{constructor(e,t){this.cache={camera:{fov:0,style:""},objects:new WeakMap},e||(e=document.createElement("div")),e.style.overflow="hidden",e.style.pointerEvents="auto",this.domElement=e,t||(t=document.createElement("div")),t.style.transformStyle="preserve-3d",t.style.pointerEvents="auto",t.style.position="absolute",t.style.top="0",e.appendChild(t),this.cameraElement=t}setSize(e,t){Bb=e/2,Hb=t/2,this.domElement.style.width=e+"px",this.domElement.style.height=t+"px",this.cameraElement.style.width=e+"px",this.cameraElement.style.height=t+"px"}renderObject(e,t,n,i){if(e instanceof Ob){const t=n.quaternion.clone();t.x=-n.quaternion.x,t.z=-n.quaternion.z;const i=function(e,t){const n=e.elements;return"translateX(-50%)matrix3d("+Yb(n[0])+","+Yb(-n[1])+","+Yb(n[2])+","+Yb(n[3])+","+Yb(n[4])+","+Yb(-n[5])+","+Yb(n[6])+","+Yb(n[7])+","+Yb(n[8])+","+Yb(-n[9])+","+Yb(n[10])+","+Yb(n[11])+","+Yb(n[12])+","+Yb(n[13])+","+Yb(n[14])+","+Yb(n[15])+")"}((new Wi).compose(e.parent.getWorldPosition(new ri(0,0,0)),t,e.parent.scale)),s=e.element;s.style.transform=i,s.style.display=Km(e)?"block":"none";const r={style:i,distanceToCameraSquared:0};this.cache.objects.set(e,r),s.parentNode!==this.cameraElement&&this.cameraElement.appendChild(s)}for(let s=0,r=e.children.length;s<r;s++)this.renderObject(e.children[s],t,n,i)}render(e,t){const n=t.projectionMatrix.elements[5]*Hb;this.cache.camera.fov!==n&&(this.domElement.style.perspective=t instanceof mr?n+"px":"",this.cache.camera.fov=n),!0===e.autoUpdate&&e.updateMatrixWorld(),null===t.parent&&t.updateMatrixWorld();let i="";if(t instanceof Zr){i+="scale("+n+")translateX("+Yb(-(t.right+t.left)/2)+"px)"+Kb(t.matrixWorldInverse)}else i+="translateZ("+n+"px)"+Kb(t.matrixWorldInverse);const s=i+"translate("+Bb+"px,"+Hb+"px)";this.cameraElement.style.transform=s,this.cache.camera.style=s,this.renderObject(e,e,t,i)}}class Jb{constructor(e){this.options=e,this.internalOptions={enableRenderCss2D:!1,enableRenderCss2DHalf:!1,enableRenderCss3D:!1},this.container=this._initContainer(),this.renderer=this._initRenderer(),this.rendererCSS2D=this._initRenderCSS2D(),this.rendererCSS3D=this._initRenderCSS3D(),this.rendererCSS2DHalf=this._initRenderCSS2DHalf(),this.interactiveContainer=this._initInteractiveContainer()}setInternalState(e,t){this.internalOptions[e]=t}getWidth(){return this.renderer.domElement.width}getHeight(){return this.renderer.domElement.height}getMouseRelativeConRatio(e){const t=this.container.getBoundingClientRect();return[(e.offsetX-t.left)/t.width,(e.offsetY-t.top)/t.height]}getMousePoint(e){const t=new Gn(0,0);return t.fromArray(this.getMouseRelativeConRatio(e)),t}_initContainer(){const e=document.createElement("div");return e.style.position="relative",e.style.width="100%",e.style.height="100%",e}_initRenderer(){const{background:e={},logarithmicDepthBuffer:t}=this.options,{color:n,alpha:i}=e,s=new rl({alpha:i,logarithmicDepthBuffer:t,preserveDrawingBuffer:!0,antialias:!1,stencil:!1,depth:!1,powerPreference:"high-performance"}),r=i?0:1,{offsetWidth:o,offsetHeight:a}=this.container;return s.setSize(o,a),s.setClearColor(n||0,r),s.setPixelRatio(self.devicePixelRatio),s.localClippingEnabled=!0,s.sortObjects=!0,s.shadowMap.enabled=!0,s.shadowMap.type=2,this.container.appendChild(s.domElement),s}_initRenderCSS2D(){const e=new Zb;return e.domElement.id="ssp_view_2DPoi",e.domElement.style.position="absolute",e.domElement.style.top="0",e.domElement.style.width="100%",e.domElement.style.height="100%",e.setSize(this.container.offsetWidth,this.container.offsetHeight),this.container.appendChild(e.domElement),e}_initRenderCSS3D(){const e=new Ub;return e.domElement.id="ssp_view_3DPoi",e.domElement.style.position="absolute",e.domElement.style.top="0",e.domElement.style.width="100%",e.domElement.style.height="100%",e.setSize(this.container.offsetWidth,this.container.offsetHeight),this.container.appendChild(e.domElement),e}_initRenderCSS2DHalf(){const e=new jb(this.rendererCSS3D.domElement,this.rendererCSS3D.cameraElement);return e.setSize(this.container.offsetWidth,this.container.offsetHeight),e}_initInteractiveContainer(){return this.rendererCSS3D.domElement}}const Qb=new Wi,qb=(e,t)=>{const n=Qb.clone(),i=Qb.clone(),s=Qb.clone();n.makeRotationY(e),i.makeRotationX(t);const r=new Oi;return s.multiplyMatrices(n,i),r.setFromRotationMatrix(s),r},$b=qb(-Math.PI/2,-Math.PI/4),ev=qb(Math.PI/2,-Math.PI/4),tv=qb(-Math.PI/4,-Math.PI/4),nv=qb(Math.PI/4,-Math.PI/4),iv=qb(1.25*Math.PI,-Math.PI/4),sv=qb(.75*Math.PI,-Math.PI/4),rv={LEFT:new Oi(0,-Math.PI/2,0),RIGHT:new Oi(0,Math.PI/2,0),FRONT:new Oi(0,0,0),BACK:new Oi(0,Math.PI,0),TOP:new Oi(-Math.PI/2,0,0),BOTTOM:new Oi(Math.PI/2,0,0),FRONTTOP:new Oi(-Math.PI/4,0,0),BACKTOP:new Oi(Math.PI/4,Math.PI,0),LEFTTOP:new Oi($b.x,$b.y,$b.z),RIGHTTOP:new Oi(ev.x,ev.y,ev.z),LEFTFRONTTOP:new Oi(tv.x,tv.y,tv.z),RIGHTFRONTTOP:new Oi(nv.x,nv.y,nv.z),LEFTBACKTOP:new Oi(iv.x,iv.y,iv.z),RIGHTBACKTOP:new Oi(sv.x,sv.y,sv.z)},ov=e=>ig(e)?e:e.includes("%")?.01*Number(e.split("%")[0]):isNaN(+e)?0:Number(e),av=new ri,lv=new Oi,cv=new mr(50,1,.1,5e5);cv.position.set(500,1e3,500),cv.lookAt(av.set(0,0,0)),cv.name="Camera";class hv{constructor(e){this.viewport=e,this.mainCamera=cv.clone(),this.mainCamera.name="freeCamera",this.currentCamera=this.mainCamera,this.cameras={}}createCamera(e){const t=cv.clone();return t.name=e,this.cameras[e]=t,t}removeCamera(e){return"fullFreeCamera"!==e&&(delete this.cameras[e],!0)}setCurrentCamera(e){this.currentCamera=this.viewport.camera=e,this.viewport.signals.cameraObjectChange.dispatch()}getMainCamera(){return this.mainCamera}getCameraViewpoint(){if("free"===this.viewport.controls.options.type)return{position:this.currentCamera.position.clone(),rotation:{x:this.currentCamera.rotation.x,y:this.currentCamera.rotation.y,z:this.currentCamera.rotation.z}};{const e=this.viewport.controls.currentControls;return{position:this.currentCamera.position.clone(),target:e.target.clone()}}}setCameraViewpoint(e){if("free"===this.viewport.controls.options.type&&rg(e)){const{position:t,rotation:n}=e;this.currentCamera.position.set(t.x,t.y,t.z),this.currentCamera.rotation.set(n.x,n.y,n.z)}else if(rg(e)){const{position:t,target:n}=e,i=this.viewport.controls.currentControls;this.currentCamera.position.set(t.x,t.y,t.z),i.target.set(n.x,n.y,n.z)}this.viewport.signals.cameraChange.dispatch(this.currentCamera.position.clone())}moveTo(e,t){return ug(this.currentCamera.position,e,t,(e=>this.viewport.signals.cameraChange.dispatch(e)))}rotateTo(e,t){const n=this.currentCamera.quaternion.clone(),i=(new si).setFromEuler(e);return ug({t:0},{t:1},t,(e=>{let{t:t}=e;this.currentCamera.quaternion.slerpQuaternions(n,i,t)}))}flyTo(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"frontTop",n=arguments.length>2?arguments[2]:void 0;return rf(this,void 0,void 0,(function*(){if(tg(t)){const e=t.toLocaleUpperCase();"CURRENT"===e?lv.copy(this.currentCamera.rotation):rv[e]&&lv.copy(rv[e])}else t instanceof Oi?lv.copy(t):rg(t)&&lv.set(t.x,t.y,t.z);lv.copy(Fm(this.currentCamera.rotation,lv.clone())),yield Promise.all([this.moveTo(e,n),this.rotateTo(lv,n)])}))}flyToBoundingBox(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"frontTop",n=arguments.length>2?arguments[2]:void 0;return rf(this,void 0,void 0,(function*(){if(e.isEmpty())return void Vm("target box is empty");const i=this.viewport.controls.options.type,s=new ri;if(tg(t)){if("CURRENT"===t.toLocaleUpperCase())s.copy(this.getMovePosByBBox(e));else{const n=rv[t.toLocaleUpperCase()],i=this.getObjectLabelPos(e,n);s.copy(i)}}else{"orbit"===i&&Vm("orbit 控制器不支持 Rotation 类型 的 rotation 参数");const n=Bm(t),r=this.getObjectLabelPos(e,n);s.copy(r)}if("orbit"===i){const n=e.getCenter(av),i=this.viewport.controls.currentControls;i.target.copy(n);const r=new Wi;r.lookAt(s,n,i.object.up),t=lv.setFromRotationMatrix(r)}yield this.flyTo(s,t,n)}))}flyToObj(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"frontTop",n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};if(e instanceof AS||e instanceof CS){const{padding:i=50}=n,s=ov(i);return this.flyToBoundingBox(e.getBoundingBox(s),t,n)}{const{padding:i="30%"}=n,s=Hm(e),r=s.getSize(av);let o=0;if(tg(i)){const e=Math.max(r.x,r.y,r.z);o=ov(i)*e}else o=i;let a=o,l=o;if(o<0){const e=Math.min(r.x,r.z),t=r.y-1;a=Math.abs(o)>e?-e:o,l=Math.abs(a)>t?-t:a}return 0!==i&&(s.max.add(av.set(a/2,l/2,a/2)),s.min.sub(av.set(a/2,l/2,a/2))),s.isEmpty()&&(av.setFromMatrixPosition(e.matrixWorld),s.setFromCenterAndSize(av,new ri(0,0,0))),this.flyToBoundingBox(s,t,n)}}surroundOnTarget(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};const{speed:n=1,angle:i=360,onStart:s}=t,r=Dm(e),o=r.clone().setY(this.currentCamera.position.y).distanceTo(this.currentCamera.position),a=Math.abs(i);return ug({angle:0},{angle:Math.PI/180*a},{duration:a/360*5e3/n},(e=>{const t=i>0?e.angle:2*Math.PI-e.angle;if(this.currentCamera.position.x=Math.sin(t)*o+r.x,this.currentCamera.position.z=Math.cos(t)*o+r.z,"orbit"===this.viewport.controls.options.type){const e=this.viewport.controls.currentControls;e.target.copy(r),e.update()}else this.currentCamera.lookAt(r)}),s)}surroundOnObject(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};const n=(new li).setFromObject(e).getCenter(av);return this.surroundOnTarget(n,t)}getMovePosByBBox(e){const t=this.currentCamera.position,n=e.getCenter(av);(new ri).subVectors(n,t).normalize();let i=new Ri;i=e.getBoundingSphere(i);const s=this.currentCamera.fov/2*Math.PI/180,r=Math.sin(s),o=i.radius/r,a=new ri;this.currentCamera.getWorldDirection(a);const l=a.clone();return l.multiplyScalar(-o),n.clone().add(l)}getObjectLabelPos(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"frontTop",n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};if(e instanceof SS&&(e=(new li).setFromObject(e)),e.isEmpty())return Vm("target box is empty"),new ri;const{extendScale:i=1.6,mode:s="scene"}=n;if("scene"===s){const n=e.getCenter(av),s=e.max.clone().sub(e.min),r=Math.max(s.x,s.y,s.z),o=n.clone(),a=e=>{const t=(i-.5)*Math.abs(r),n=Math.max(t,this.viewport.camera.near);o.add(e.multiplyScalar(n))};let l;return l=tg(t)?rv[t.toLocaleUpperCase()]:Bm(t),a(av.set(0,0,1).applyEuler(l)),o}return"screen"===s?e.getCenter(av).clone():new ri}}
21
21
  /**
22
22
  * postprocessing v6.29.0 build Mon Oct 17 2022
23
23
  * https://github.com/pmndrs/postprocessing
@@ -38,7 +38,7 @@ version: 2.9.0
38
38
  * @since jsrsasign 2.1
39
39
  * @license <a href="https://kjur.github.io/jsrsasign/license/">MIT License</a>
40
40
  */
41
- var jw={};void 0!==jw.asn1&&jw.asn1||(jw.asn1={}),jw.asn1.ASN1Util=new function(){this.integerToByteHex=function(e){var t=e.toString(16);return t.length%2==1&&(t="0"+t),t},this.bigIntToMinTwosComplementsHex=function(e){var t=e.toString(16);if("-"!=t.substr(0,1))t.length%2==1?t="0"+t:t.match(/^[0-7]/)||(t="00"+t);else{var n=t.substr(1).length;n%2==1?n+=1:t.match(/^[0-7]/)||(n+=2);for(var i="",s=0;s<n;s++)i+="f";t=new Sw(i,16).xor(e).add(Sw.ONE).toString(16).replace(/^-/,"")}return t},this.getPEMStringFromHex=function(e,t){return hextopem(e,t)},this.newObject=function(e){var t=jw.asn1,n=t.DERBoolean,i=t.DERInteger,s=t.DERBitString,r=t.DEROctetString,o=t.DERNull,a=t.DERObjectIdentifier,l=t.DEREnumerated,c=t.DERUTF8String,h=t.DERNumericString,d=t.DERPrintableString,u=t.DERTeletexString,p=t.DERIA5String,m=t.DERUTCTime,f=t.DERGeneralizedTime,g=t.DERSequence,y=t.DERSet,b=t.DERTaggedObject,v=t.ASN1Util.newObject,x=Object.keys(e);if(1!=x.length)throw"key of param shall be only one.";var w=x[0];if(-1==":bool:int:bitstr:octstr:null:oid:enum:utf8str:numstr:prnstr:telstr:ia5str:utctime:gentime:seq:set:tag:".indexOf(":"+w+":"))throw"undefined key: "+w;if("bool"==w)return new n(e[w]);if("int"==w)return new i(e[w]);if("bitstr"==w)return new s(e[w]);if("octstr"==w)return new r(e[w]);if("null"==w)return new o(e[w]);if("oid"==w)return new a(e[w]);if("enum"==w)return new l(e[w]);if("utf8str"==w)return new c(e[w]);if("numstr"==w)return new h(e[w]);if("prnstr"==w)return new d(e[w]);if("telstr"==w)return new u(e[w]);if("ia5str"==w)return new p(e[w]);if("utctime"==w)return new m(e[w]);if("gentime"==w)return new f(e[w]);if("seq"==w){for(var S=e[w],M=[],T=0;T<S.length;T++){var C=v(S[T]);M.push(C)}return new g({array:M})}if("set"==w){for(S=e[w],M=[],T=0;T<S.length;T++){C=v(S[T]);M.push(C)}return new y({array:M})}if("tag"==w){var L=e[w];if("[object Array]"===Object.prototype.toString.call(L)&&3==L.length){var R=v(L[2]);return new b({tag:L[0],explicit:L[1],obj:R})}var G={};if(void 0!==L.explicit&&(G.explicit=L.explicit),void 0!==L.tag&&(G.tag=L.tag),void 0===L.obj)throw"obj shall be specified for 'tag'.";return G.obj=v(L.obj),new b(G)}},this.jsonToASN1HEX=function(e){return this.newObject(e).getEncodedHex()}},jw.asn1.ASN1Util.oidHexToInt=function(e){for(var t="",n=parseInt(e.substr(0,2),16),i=(t=Math.floor(n/40)+"."+n%40,""),s=2;s<e.length;s+=2){var r=("00000000"+parseInt(e.substr(s,2),16).toString(2)).slice(-8);if(i+=r.substr(1,7),"0"==r.substr(0,1))t=t+"."+new Sw(i,2).toString(10),i=""}return t},jw.asn1.ASN1Util.oidIntToHex=function(e){var t=function(e){var t=e.toString(16);return 1==t.length&&(t="0"+t),t},n=function(e){var n="",i=new Sw(e,10).toString(2),s=7-i.length%7;7==s&&(s=0);for(var r="",o=0;o<s;o++)r+="0";i=r+i;for(o=0;o<i.length-1;o+=7){var a=i.substr(o,7);o!=i.length-7&&(a="1"+a),n+=t(parseInt(a,2))}return n};if(!e.match(/^[0-9.]+$/))throw"malformed oid string: "+e;var i="",s=e.split("."),r=40*parseInt(s[0])+parseInt(s[1]);i+=t(r),s.splice(0,2);for(var o=0;o<s.length;o++)i+=n(s[o]);return i},jw.asn1.ASN1Object=function(){this.getLengthHexFromValue=function(){if(void 0===this.hV||null==this.hV)throw"this.hV is null or undefined.";if(this.hV.length%2==1)throw"value hex must be even length: n="+"".length+",v="+this.hV;var e=this.hV.length/2,t=e.toString(16);if(t.length%2==1&&(t="0"+t),e<128)return t;var n=t.length/2;if(n>15)throw"ASN.1 length too long to represent by 8x: n = "+e.toString(16);return(128+n).toString(16)+t},this.getEncodedHex=function(){return(null==this.hTLV||this.isModified)&&(this.hV=this.getFreshValueHex(),this.hL=this.getLengthHexFromValue(),this.hTLV=this.hT+this.hL+this.hV,this.isModified=!1),this.hTLV},this.getValueHex=function(){return this.getEncodedHex(),this.hV},this.getFreshValueHex=function(){return""}},jw.asn1.DERAbstractString=function(e){jw.asn1.DERAbstractString.superclass.constructor.call(this),this.getString=function(){return this.s},this.setString=function(e){this.hTLV=null,this.isModified=!0,this.s=e,this.hV=stohex(this.s)},this.setStringHex=function(e){this.hTLV=null,this.isModified=!0,this.s=null,this.hV=e},this.getFreshValueHex=function(){return this.hV},void 0!==e&&("string"==typeof e?this.setString(e):void 0!==e.str?this.setString(e.str):void 0!==e.hex&&this.setStringHex(e.hex))},Kw.lang.extend(jw.asn1.DERAbstractString,jw.asn1.ASN1Object),jw.asn1.DERAbstractTime=function(e){jw.asn1.DERAbstractTime.superclass.constructor.call(this),this.localDateToUTC=function(e){return utc=e.getTime()+6e4*e.getTimezoneOffset(),new Date(utc)},this.formatDate=function(e,t,n){var i=this.zeroPadding,s=this.localDateToUTC(e),r=String(s.getFullYear());"utc"==t&&(r=r.substr(2,2));var o=r+i(String(s.getMonth()+1),2)+i(String(s.getDate()),2)+i(String(s.getHours()),2)+i(String(s.getMinutes()),2)+i(String(s.getSeconds()),2);if(!0===n){var a=s.getMilliseconds();if(0!=a){var l=i(String(a),3);o=o+"."+(l=l.replace(/[0]+$/,""))}}return o+"Z"},this.zeroPadding=function(e,t){return e.length>=t?e:new Array(t-e.length+1).join("0")+e},this.getString=function(){return this.s},this.setString=function(e){this.hTLV=null,this.isModified=!0,this.s=e,this.hV=stohex(e)},this.setByDateValue=function(e,t,n,i,s,r){var o=new Date(Date.UTC(e,t-1,n,i,s,r,0));this.setByDate(o)},this.getFreshValueHex=function(){return this.hV}},Kw.lang.extend(jw.asn1.DERAbstractTime,jw.asn1.ASN1Object),jw.asn1.DERAbstractStructured=function(e){jw.asn1.DERAbstractString.superclass.constructor.call(this),this.setByASN1ObjectArray=function(e){this.hTLV=null,this.isModified=!0,this.asn1Array=e},this.appendASN1Object=function(e){this.hTLV=null,this.isModified=!0,this.asn1Array.push(e)},this.asn1Array=new Array,void 0!==e&&void 0!==e.array&&(this.asn1Array=e.array)},Kw.lang.extend(jw.asn1.DERAbstractStructured,jw.asn1.ASN1Object),jw.asn1.DERBoolean=function(){jw.asn1.DERBoolean.superclass.constructor.call(this),this.hT="01",this.hTLV="0101ff"},Kw.lang.extend(jw.asn1.DERBoolean,jw.asn1.ASN1Object),jw.asn1.DERInteger=function(e){jw.asn1.DERInteger.superclass.constructor.call(this),this.hT="02",this.setByBigInteger=function(e){this.hTLV=null,this.isModified=!0,this.hV=jw.asn1.ASN1Util.bigIntToMinTwosComplementsHex(e)},this.setByInteger=function(e){var t=new Sw(String(e),10);this.setByBigInteger(t)},this.setValueHex=function(e){this.hV=e},this.getFreshValueHex=function(){return this.hV},void 0!==e&&(void 0!==e.bigint?this.setByBigInteger(e.bigint):void 0!==e.int?this.setByInteger(e.int):"number"==typeof e?this.setByInteger(e):void 0!==e.hex&&this.setValueHex(e.hex))},Kw.lang.extend(jw.asn1.DERInteger,jw.asn1.ASN1Object),jw.asn1.DERBitString=function(e){if(void 0!==e&&void 0!==e.obj){var t=jw.asn1.ASN1Util.newObject(e.obj);e.hex="00"+t.getEncodedHex()}jw.asn1.DERBitString.superclass.constructor.call(this),this.hT="03",this.setHexValueIncludingUnusedBits=function(e){this.hTLV=null,this.isModified=!0,this.hV=e},this.setUnusedBitsAndHexValue=function(e,t){if(e<0||7<e)throw"unused bits shall be from 0 to 7: u = "+e;var n="0"+e;this.hTLV=null,this.isModified=!0,this.hV=n+t},this.setByBinaryString=function(e){var t=8-(e=e.replace(/0+$/,"")).length%8;8==t&&(t=0);for(var n=0;n<=t;n++)e+="0";var i="";for(n=0;n<e.length-1;n+=8){var s=e.substr(n,8),r=parseInt(s,2).toString(16);1==r.length&&(r="0"+r),i+=r}this.hTLV=null,this.isModified=!0,this.hV="0"+t+i},this.setByBooleanArray=function(e){for(var t="",n=0;n<e.length;n++)1==e[n]?t+="1":t+="0";this.setByBinaryString(t)},this.newFalseArray=function(e){for(var t=new Array(e),n=0;n<e;n++)t[n]=!1;return t},this.getFreshValueHex=function(){return this.hV},void 0!==e&&("string"==typeof e&&e.toLowerCase().match(/^[0-9a-f]+$/)?this.setHexValueIncludingUnusedBits(e):void 0!==e.hex?this.setHexValueIncludingUnusedBits(e.hex):void 0!==e.bin?this.setByBinaryString(e.bin):void 0!==e.array&&this.setByBooleanArray(e.array))},Kw.lang.extend(jw.asn1.DERBitString,jw.asn1.ASN1Object),jw.asn1.DEROctetString=function(e){if(void 0!==e&&void 0!==e.obj){var t=jw.asn1.ASN1Util.newObject(e.obj);e.hex=t.getEncodedHex()}jw.asn1.DEROctetString.superclass.constructor.call(this,e),this.hT="04"},Kw.lang.extend(jw.asn1.DEROctetString,jw.asn1.DERAbstractString),jw.asn1.DERNull=function(){jw.asn1.DERNull.superclass.constructor.call(this),this.hT="05",this.hTLV="0500"},Kw.lang.extend(jw.asn1.DERNull,jw.asn1.ASN1Object),jw.asn1.DERObjectIdentifier=function(e){var t=function(e){var t=e.toString(16);return 1==t.length&&(t="0"+t),t},n=function(e){var n="",i=new Sw(e,10).toString(2),s=7-i.length%7;7==s&&(s=0);for(var r="",o=0;o<s;o++)r+="0";i=r+i;for(o=0;o<i.length-1;o+=7){var a=i.substr(o,7);o!=i.length-7&&(a="1"+a),n+=t(parseInt(a,2))}return n};jw.asn1.DERObjectIdentifier.superclass.constructor.call(this),this.hT="06",this.setValueHex=function(e){this.hTLV=null,this.isModified=!0,this.s=null,this.hV=e},this.setValueOidString=function(e){if(!e.match(/^[0-9.]+$/))throw"malformed oid string: "+e;var i="",s=e.split("."),r=40*parseInt(s[0])+parseInt(s[1]);i+=t(r),s.splice(0,2);for(var o=0;o<s.length;o++)i+=n(s[o]);this.hTLV=null,this.isModified=!0,this.s=null,this.hV=i},this.setValueName=function(e){var t=jw.asn1.x509.OID.name2oid(e);if(""===t)throw"DERObjectIdentifier oidName undefined: "+e;this.setValueOidString(t)},this.getFreshValueHex=function(){return this.hV},void 0!==e&&("string"==typeof e?e.match(/^[0-2].[0-9.]+$/)?this.setValueOidString(e):this.setValueName(e):void 0!==e.oid?this.setValueOidString(e.oid):void 0!==e.hex?this.setValueHex(e.hex):void 0!==e.name&&this.setValueName(e.name))},Kw.lang.extend(jw.asn1.DERObjectIdentifier,jw.asn1.ASN1Object),jw.asn1.DEREnumerated=function(e){jw.asn1.DEREnumerated.superclass.constructor.call(this),this.hT="0a",this.setByBigInteger=function(e){this.hTLV=null,this.isModified=!0,this.hV=jw.asn1.ASN1Util.bigIntToMinTwosComplementsHex(e)},this.setByInteger=function(e){var t=new Sw(String(e),10);this.setByBigInteger(t)},this.setValueHex=function(e){this.hV=e},this.getFreshValueHex=function(){return this.hV},void 0!==e&&(void 0!==e.int?this.setByInteger(e.int):"number"==typeof e?this.setByInteger(e):void 0!==e.hex&&this.setValueHex(e.hex))},Kw.lang.extend(jw.asn1.DEREnumerated,jw.asn1.ASN1Object),jw.asn1.DERUTF8String=function(e){jw.asn1.DERUTF8String.superclass.constructor.call(this,e),this.hT="0c"},Kw.lang.extend(jw.asn1.DERUTF8String,jw.asn1.DERAbstractString),jw.asn1.DERNumericString=function(e){jw.asn1.DERNumericString.superclass.constructor.call(this,e),this.hT="12"},Kw.lang.extend(jw.asn1.DERNumericString,jw.asn1.DERAbstractString),jw.asn1.DERPrintableString=function(e){jw.asn1.DERPrintableString.superclass.constructor.call(this,e),this.hT="13"},Kw.lang.extend(jw.asn1.DERPrintableString,jw.asn1.DERAbstractString),jw.asn1.DERTeletexString=function(e){jw.asn1.DERTeletexString.superclass.constructor.call(this,e),this.hT="14"},Kw.lang.extend(jw.asn1.DERTeletexString,jw.asn1.DERAbstractString),jw.asn1.DERIA5String=function(e){jw.asn1.DERIA5String.superclass.constructor.call(this,e),this.hT="16"},Kw.lang.extend(jw.asn1.DERIA5String,jw.asn1.DERAbstractString),jw.asn1.DERUTCTime=function(e){jw.asn1.DERUTCTime.superclass.constructor.call(this,e),this.hT="17",this.setByDate=function(e){this.hTLV=null,this.isModified=!0,this.date=e,this.s=this.formatDate(this.date,"utc"),this.hV=stohex(this.s)},this.getFreshValueHex=function(){return void 0===this.date&&void 0===this.s&&(this.date=new Date,this.s=this.formatDate(this.date,"utc"),this.hV=stohex(this.s)),this.hV},void 0!==e&&(void 0!==e.str?this.setString(e.str):"string"==typeof e&&e.match(/^[0-9]{12}Z$/)?this.setString(e):void 0!==e.hex?this.setStringHex(e.hex):void 0!==e.date&&this.setByDate(e.date))},Kw.lang.extend(jw.asn1.DERUTCTime,jw.asn1.DERAbstractTime),jw.asn1.DERGeneralizedTime=function(e){jw.asn1.DERGeneralizedTime.superclass.constructor.call(this,e),this.hT="18",this.withMillis=!1,this.setByDate=function(e){this.hTLV=null,this.isModified=!0,this.date=e,this.s=this.formatDate(this.date,"gen",this.withMillis),this.hV=stohex(this.s)},this.getFreshValueHex=function(){return void 0===this.date&&void 0===this.s&&(this.date=new Date,this.s=this.formatDate(this.date,"gen",this.withMillis),this.hV=stohex(this.s)),this.hV},void 0!==e&&(void 0!==e.str?this.setString(e.str):"string"==typeof e&&e.match(/^[0-9]{14}Z$/)?this.setString(e):void 0!==e.hex?this.setStringHex(e.hex):void 0!==e.date&&this.setByDate(e.date),!0===e.millis&&(this.withMillis=!0))},Kw.lang.extend(jw.asn1.DERGeneralizedTime,jw.asn1.DERAbstractTime),jw.asn1.DERSequence=function(e){jw.asn1.DERSequence.superclass.constructor.call(this,e),this.hT="30",this.getFreshValueHex=function(){for(var e="",t=0;t<this.asn1Array.length;t++){e+=this.asn1Array[t].getEncodedHex()}return this.hV=e,this.hV}},Kw.lang.extend(jw.asn1.DERSequence,jw.asn1.DERAbstractStructured),jw.asn1.DERSet=function(e){jw.asn1.DERSet.superclass.constructor.call(this,e),this.hT="31",this.sortFlag=!0,this.getFreshValueHex=function(){for(var e=new Array,t=0;t<this.asn1Array.length;t++){var n=this.asn1Array[t];e.push(n.getEncodedHex())}return 1==this.sortFlag&&e.sort(),this.hV=e.join(""),this.hV},void 0!==e&&void 0!==e.sortflag&&0==e.sortflag&&(this.sortFlag=!1)},Kw.lang.extend(jw.asn1.DERSet,jw.asn1.DERAbstractStructured),jw.asn1.DERTaggedObject=function(e){jw.asn1.DERTaggedObject.superclass.constructor.call(this),this.hT="a0",this.hV="",this.isExplicit=!0,this.asn1Object=null,this.setASN1Object=function(e,t,n){this.hT=t,this.isExplicit=e,this.asn1Object=n,this.isExplicit?(this.hV=this.asn1Object.getEncodedHex(),this.hTLV=null,this.isModified=!0):(this.hV=null,this.hTLV=n.getEncodedHex(),this.hTLV=this.hTLV.replace(/^../,t),this.isModified=!1)},this.getFreshValueHex=function(){return this.hV},void 0!==e&&(void 0!==e.tag&&(this.hT=e.tag),void 0!==e.explicit&&(this.isExplicit=e.explicit),void 0!==e.obj&&(this.asn1Object=e.obj,this.setASN1Object(this.isExplicit,this.hT,this.asn1Object)))},Kw.lang.extend(jw.asn1.DERTaggedObject,jw.asn1.ASN1Object);var Jw,Qw=function(){var e=function(t,n){return(e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n])})(t,n)};return function(t,n){if("function"!=typeof n&&null!==n)throw new TypeError("Class extends value "+String(n)+" is not a constructor or null");function i(){this.constructor=t}e(t,n),t.prototype=null===n?Object.create(n):(i.prototype=n.prototype,new i)}}(),qw=function(e){function t(n){var i=e.call(this)||this;return n&&("string"==typeof n?i.parseKey(n):(t.hasPrivateKeyProperty(n)||t.hasPublicKeyProperty(n))&&i.parsePropertiesFrom(n)),i}return Qw(t,e),t.prototype.parseKey=function(e){try{var t=0,n=0,i=/^\s*(?:[0-9A-Fa-f][0-9A-Fa-f]\s*)+$/.test(e)?cw(e):hw.unarmor(e),s=bw.decode(i);if(3===s.sub.length&&(s=s.sub[2].sub[0]),9===s.sub.length){t=s.sub[1].getHexStringValue(),this.n=Gw(t,16),n=s.sub[2].getHexStringValue(),this.e=parseInt(n,16);var r=s.sub[3].getHexStringValue();this.d=Gw(r,16);var o=s.sub[4].getHexStringValue();this.p=Gw(o,16);var a=s.sub[5].getHexStringValue();this.q=Gw(a,16);var l=s.sub[6].getHexStringValue();this.dmp1=Gw(l,16);var c=s.sub[7].getHexStringValue();this.dmq1=Gw(c,16);var h=s.sub[8].getHexStringValue();this.coeff=Gw(h,16)}else{if(2!==s.sub.length)return!1;if(s.sub[0].sub){var d=s.sub[1].sub[0];t=d.sub[0].getHexStringValue(),this.n=Gw(t,16),n=d.sub[1].getHexStringValue(),this.e=parseInt(n,16)}else t=s.sub[0].getHexStringValue(),this.n=Gw(t,16),n=s.sub[1].getHexStringValue(),this.e=parseInt(n,16)}return!0}catch(e){return!1}},t.prototype.getPrivateBaseKey=function(){var e={array:[new jw.asn1.DERInteger({int:0}),new jw.asn1.DERInteger({bigint:this.n}),new jw.asn1.DERInteger({int:this.e}),new jw.asn1.DERInteger({bigint:this.d}),new jw.asn1.DERInteger({bigint:this.p}),new jw.asn1.DERInteger({bigint:this.q}),new jw.asn1.DERInteger({bigint:this.dmp1}),new jw.asn1.DERInteger({bigint:this.dmq1}),new jw.asn1.DERInteger({bigint:this.coeff})]};return new jw.asn1.DERSequence(e).getEncodedHex()},t.prototype.getPrivateBaseKeyB64=function(){return ow(this.getPrivateBaseKey())},t.prototype.getPublicBaseKey=function(){var e=new jw.asn1.DERSequence({array:[new jw.asn1.DERObjectIdentifier({oid:"1.2.840.113549.1.1.1"}),new jw.asn1.DERNull]}),t=new jw.asn1.DERSequence({array:[new jw.asn1.DERInteger({bigint:this.n}),new jw.asn1.DERInteger({int:this.e})]}),n=new jw.asn1.DERBitString({hex:"00"+t.getEncodedHex()});return new jw.asn1.DERSequence({array:[e,n]}).getEncodedHex()},t.prototype.getPublicBaseKeyB64=function(){return ow(this.getPublicBaseKey())},t.wordwrap=function(e,t){if(!e)return e;var n="(.{1,"+(t=t||64)+"})( +|$\n?)|(.{1,"+t+"})";return e.match(RegExp(n,"g")).join("\n")},t.prototype.getPrivateKey=function(){var e="-----BEGIN RSA PRIVATE KEY-----\n";return e+=t.wordwrap(this.getPrivateBaseKeyB64())+"\n",e+="-----END RSA PRIVATE KEY-----"},t.prototype.getPublicKey=function(){var e="-----BEGIN PUBLIC KEY-----\n";return e+=t.wordwrap(this.getPublicBaseKeyB64())+"\n",e+="-----END PUBLIC KEY-----"},t.hasPublicKeyProperty=function(e){return(e=e||{}).hasOwnProperty("n")&&e.hasOwnProperty("e")},t.hasPrivateKeyProperty=function(e){return(e=e||{}).hasOwnProperty("n")&&e.hasOwnProperty("e")&&e.hasOwnProperty("d")&&e.hasOwnProperty("p")&&e.hasOwnProperty("q")&&e.hasOwnProperty("dmp1")&&e.hasOwnProperty("dmq1")&&e.hasOwnProperty("coeff")},t.prototype.parsePropertiesFrom=function(e){this.n=e.n,this.e=e.e,e.hasOwnProperty("d")&&(this.d=e.d,this.p=e.p,this.q=e.q,this.dmp1=e.dmp1,this.dmq1=e.dmq1,this.coeff=e.coeff)},t}(Ow),$w="undefined"!=typeof process?null===(Jw=process.env)||void 0===Jw?void 0:Jw.npm_package_version:void 0,eS=function(){function e(e){void 0===e&&(e={}),e=e||{},this.default_key_size=e.default_key_size?parseInt(e.default_key_size,10):1024,this.default_public_exponent=e.default_public_exponent||"010001",this.log=e.log||!1,this.key=null}return e.prototype.setKey=function(e){this.log&&this.key&&console.warn("A key was already set, overriding existing."),this.key=new qw(e)},e.prototype.setPrivateKey=function(e){this.setKey(e)},e.prototype.setPublicKey=function(e){this.setKey(e)},e.prototype.decrypt=function(e){try{return this.getKey().decrypt(aw(e))}catch(e){return!1}},e.prototype.encrypt=function(e){try{return ow(this.getKey().encrypt(e))}catch(e){return!1}},e.prototype.sign=function(e,t,n){try{return ow(this.getKey().sign(e,t,n))}catch(e){return!1}},e.prototype.verify=function(e,t,n){try{return this.getKey().verify(e,aw(t),n)}catch(e){return!1}},e.prototype.getKey=function(e){if(!this.key){if(this.key=new qw,e&&"[object Function]"==={}.toString.call(e))return void this.key.generateAsync(this.default_key_size,this.default_public_exponent,e);this.key.generate(this.default_key_size,this.default_public_exponent)}return this.key},e.prototype.getPrivateKey=function(){return this.getKey().getPrivateKey()},e.prototype.getPrivateKeyB64=function(){return this.getKey().getPrivateBaseKeyB64()},e.prototype.getPublicKey=function(){return this.getKey().getPublicKey()},e.prototype.getPublicKeyB64=function(){return this.getKey().getPublicBaseKeyB64()},e.version=$w,e}(),tS=nb((function(e){!function(){var t="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",n={rotl:function(e,t){return e<<t|e>>>32-t},rotr:function(e,t){return e<<32-t|e>>>t},endian:function(e){if(e.constructor==Number)return 16711935&n.rotl(e,8)|4278255360&n.rotl(e,24);for(var t=0;t<e.length;t++)e[t]=n.endian(e[t]);return e},randomBytes:function(e){for(var t=[];e>0;e--)t.push(Math.floor(256*Math.random()));return t},bytesToWords:function(e){for(var t=[],n=0,i=0;n<e.length;n++,i+=8)t[i>>>5]|=e[n]<<24-i%32;return t},wordsToBytes:function(e){for(var t=[],n=0;n<32*e.length;n+=8)t.push(e[n>>>5]>>>24-n%32&255);return t},bytesToHex:function(e){for(var t=[],n=0;n<e.length;n++)t.push((e[n]>>>4).toString(16)),t.push((15&e[n]).toString(16));return t.join("")},hexToBytes:function(e){for(var t=[],n=0;n<e.length;n+=2)t.push(parseInt(e.substr(n,2),16));return t},bytesToBase64:function(e){for(var n=[],i=0;i<e.length;i+=3)for(var s=e[i]<<16|e[i+1]<<8|e[i+2],r=0;r<4;r++)8*i+6*r<=8*e.length?n.push(t.charAt(s>>>6*(3-r)&63)):n.push("=");return n.join("")},base64ToBytes:function(e){e=e.replace(/[^A-Z0-9+\/]/gi,"");for(var n=[],i=0,s=0;i<e.length;s=++i%4)0!=s&&n.push((t.indexOf(e.charAt(i-1))&Math.pow(2,-2*s+8)-1)<<2*s|t.indexOf(e.charAt(i))>>>6-2*s);return n}};e.exports=n}()})),nS={utf8:{stringToBytes:function(e){return nS.bin.stringToBytes(unescape(encodeURIComponent(e)))},bytesToString:function(e){return decodeURIComponent(escape(nS.bin.bytesToString(e)))}},bin:{stringToBytes:function(e){for(var t=[],n=0;n<e.length;n++)t.push(255&e.charCodeAt(n));return t},bytesToString:function(e){for(var t=[],n=0;n<e.length;n++)t.push(String.fromCharCode(e[n]));return t.join("")}}},iS=nS,sS=function(e){return null!=e&&(rS(e)||function(e){return"function"==typeof e.readFloatLE&&"function"==typeof e.slice&&rS(e.slice(0,0))}(e)||!!e._isBuffer)};function rS(e){return!!e.constructor&&"function"==typeof e.constructor.isBuffer&&e.constructor.isBuffer(e)}var oS,aS,lS=nb((function(e){!function(){var t=tS,n=iS.utf8,i=sS,s=iS.bin,r=function(e,o){e.constructor==String?e=o&&"binary"===o.encoding?s.stringToBytes(e):n.stringToBytes(e):i(e)?e=Array.prototype.slice.call(e,0):Array.isArray(e)||e.constructor===Uint8Array||(e=e.toString());for(var a=t.bytesToWords(e),l=8*e.length,c=1732584193,h=-271733879,d=-1732584194,u=271733878,p=0;p<a.length;p++)a[p]=16711935&(a[p]<<8|a[p]>>>24)|4278255360&(a[p]<<24|a[p]>>>8);a[l>>>5]|=128<<l%32,a[14+(l+64>>>9<<4)]=l;var m=r._ff,f=r._gg,g=r._hh,y=r._ii;for(p=0;p<a.length;p+=16){var b=c,v=h,x=d,w=u;c=m(c,h,d,u,a[p+0],7,-680876936),u=m(u,c,h,d,a[p+1],12,-389564586),d=m(d,u,c,h,a[p+2],17,606105819),h=m(h,d,u,c,a[p+3],22,-1044525330),c=m(c,h,d,u,a[p+4],7,-176418897),u=m(u,c,h,d,a[p+5],12,1200080426),d=m(d,u,c,h,a[p+6],17,-1473231341),h=m(h,d,u,c,a[p+7],22,-45705983),c=m(c,h,d,u,a[p+8],7,1770035416),u=m(u,c,h,d,a[p+9],12,-1958414417),d=m(d,u,c,h,a[p+10],17,-42063),h=m(h,d,u,c,a[p+11],22,-1990404162),c=m(c,h,d,u,a[p+12],7,1804603682),u=m(u,c,h,d,a[p+13],12,-40341101),d=m(d,u,c,h,a[p+14],17,-1502002290),c=f(c,h=m(h,d,u,c,a[p+15],22,1236535329),d,u,a[p+1],5,-165796510),u=f(u,c,h,d,a[p+6],9,-1069501632),d=f(d,u,c,h,a[p+11],14,643717713),h=f(h,d,u,c,a[p+0],20,-373897302),c=f(c,h,d,u,a[p+5],5,-701558691),u=f(u,c,h,d,a[p+10],9,38016083),d=f(d,u,c,h,a[p+15],14,-660478335),h=f(h,d,u,c,a[p+4],20,-405537848),c=f(c,h,d,u,a[p+9],5,568446438),u=f(u,c,h,d,a[p+14],9,-1019803690),d=f(d,u,c,h,a[p+3],14,-187363961),h=f(h,d,u,c,a[p+8],20,1163531501),c=f(c,h,d,u,a[p+13],5,-1444681467),u=f(u,c,h,d,a[p+2],9,-51403784),d=f(d,u,c,h,a[p+7],14,1735328473),c=g(c,h=f(h,d,u,c,a[p+12],20,-1926607734),d,u,a[p+5],4,-378558),u=g(u,c,h,d,a[p+8],11,-2022574463),d=g(d,u,c,h,a[p+11],16,1839030562),h=g(h,d,u,c,a[p+14],23,-35309556),c=g(c,h,d,u,a[p+1],4,-1530992060),u=g(u,c,h,d,a[p+4],11,1272893353),d=g(d,u,c,h,a[p+7],16,-155497632),h=g(h,d,u,c,a[p+10],23,-1094730640),c=g(c,h,d,u,a[p+13],4,681279174),u=g(u,c,h,d,a[p+0],11,-358537222),d=g(d,u,c,h,a[p+3],16,-722521979),h=g(h,d,u,c,a[p+6],23,76029189),c=g(c,h,d,u,a[p+9],4,-640364487),u=g(u,c,h,d,a[p+12],11,-421815835),d=g(d,u,c,h,a[p+15],16,530742520),c=y(c,h=g(h,d,u,c,a[p+2],23,-995338651),d,u,a[p+0],6,-198630844),u=y(u,c,h,d,a[p+7],10,1126891415),d=y(d,u,c,h,a[p+14],15,-1416354905),h=y(h,d,u,c,a[p+5],21,-57434055),c=y(c,h,d,u,a[p+12],6,1700485571),u=y(u,c,h,d,a[p+3],10,-1894986606),d=y(d,u,c,h,a[p+10],15,-1051523),h=y(h,d,u,c,a[p+1],21,-2054922799),c=y(c,h,d,u,a[p+8],6,1873313359),u=y(u,c,h,d,a[p+15],10,-30611744),d=y(d,u,c,h,a[p+6],15,-1560198380),h=y(h,d,u,c,a[p+13],21,1309151649),c=y(c,h,d,u,a[p+4],6,-145523070),u=y(u,c,h,d,a[p+11],10,-1120210379),d=y(d,u,c,h,a[p+2],15,718787259),h=y(h,d,u,c,a[p+9],21,-343485551),c=c+b>>>0,h=h+v>>>0,d=d+x>>>0,u=u+w>>>0}return t.endian([c,h,d,u])};r._ff=function(e,t,n,i,s,r,o){var a=e+(t&n|~t&i)+(s>>>0)+o;return(a<<r|a>>>32-r)+t},r._gg=function(e,t,n,i,s,r,o){var a=e+(t&i|n&~i)+(s>>>0)+o;return(a<<r|a>>>32-r)+t},r._hh=function(e,t,n,i,s,r,o){var a=e+(t^n^i)+(s>>>0)+o;return(a<<r|a>>>32-r)+t},r._ii=function(e,t,n,i,s,r,o){var a=e+(n^(t|~i))+(s>>>0)+o;return(a<<r|a>>>32-r)+t},r._blocksize=16,r._digestsize=16,e.exports=function(e,n){if(null==e)throw new Error("Illegal argument "+e);var i=t.wordsToBytes(r(e,n));return n&&n.asBytes?i:n&&n.asString?s.bytesToString(i):t.bytesToHex(i)}}()})),cS={serialNums:[],key:""};class hS{constructor(e){this.viewport=e,this.encryptInfo=cS,oS.set(this,!0),aS.set(this,setTimeout((()=>{uf(this,oS,!1),this.viewport.triggerRender()}),5e3))}verify(e,t){var n;clearTimeout(df(this,aS));const i=new eS;i.setPublicKey(null===(n=this.encryptInfo)||void 0===n?void 0:n.key);const s=i.verify(e,t,lS);return uf(this,oS,s),this.viewport.triggerRender(),s}getVerified(){return!0}}oS=new WeakMap,aS=new WeakMap;class dS{constructor(e,t){this.scene=e,this.signals=t;const n=document.createElement("div");n.style.position="absolute",n.style.left="12px",n.style.bottom="12px",n.style.fontSize="12px",n.style.color="#fff",n.style.pointerEvents="none",this.container=n,this.state={objects:0,vertices:0,triangles:0,frametime:0,lodFrametime:0}}addListeners(){const{scene:e,signals:t}=this;function n(e){let t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];const n=document.createElement("span");return t&&(n.style.marginLeft="6px"),n.innerText=e,n}function i(){return document.createElement("br")}const s=n("0"),r=n("0"),o=n("0"),a=n("0"),l=n("0");this.container.appendChild(n("objects",!1)),this.container.appendChild(s),this.container.appendChild(i()),this.container.appendChild(n("triangles",!1)),this.container.appendChild(r),this.container.appendChild(i()),this.container.appendChild(n("vertices",!1)),this.container.appendChild(o),this.container.appendChild(i()),this.container.appendChild(n("frametime",!1)),this.container.appendChild(a),this.container.appendChild(i()),this.container.appendChild(n("lodFrametime",!1)),this.container.appendChild(l);const c=()=>{this.state.objects=0,this.state.vertices=0,this.state.triangles=0;for(let t=0;t<e.children.length;t++){e.children[t].traverseVisible((e=>{var t,n,i,s;if("SceneManager"!==e.stype&&this.state.objects++,e.isMesh){const r=e.geometry;r.isGeometry?(this.state.vertices+=(null===(t=r.vertices)||void 0===t?void 0:t.length)||0,this.state.triangles+=(null===(n=r.faces)||void 0===n?void 0:n.length)||0):r.isBufferGeometry&&(this.state.vertices+=(null===(i=r.attributes.position)||void 0===i?void 0:i.count)||0,null!==r.index?this.state.triangles+=r.index.count/3:this.state.triangles+=(null===(s=r.attributes.position)||void 0===s?void 0:s.count)/3||0)}}))}s.innerText=String(this.state.objects),o.innerText=String(this.state.vertices),r.innerText=String(this.state.triangles)};t.objectAdded.add(c),t.objectRemoved.add(c),t.geometryChanged.add(c);t.sceneRendered.add((e=>{this.state.frametime=e,a.innerText=Number(e).toFixed(2)+" ms"}));t.loadRendered.add((e=>{this.state.lodFrametime=e,l.innerText=Number(e).toFixed(2)+" ms"}))}}const uS=new Qn;class pS extends as{constructor(e,t){super();const n=new Fn("#ff3653"),i=new Fn("#8adb00"),s=new Fn("#2c8fff"),r=new Zr(-2,2,2,-2,0,4);r.position.set(0,0,2);const o=new lr(.8,.05,.05).translate(.4,0,0),a=new or(o,y(n)),l=new or(o,y(i)),c=new or(o,y(s));l.rotation.z=Math.PI/2,c.rotation.y=-Math.PI/2,this.add(a),this.add(c),this.add(l);const h=new Rl(b(n,"X"));h.userData.type="posX";const d=new Rl(b(i,"Y"));d.userData.type="posY";const u=new Rl(b(s,"Z"));u.userData.type="posZ";const p=new Rl(b(n));p.userData.type="negX";const m=new Rl(b(i));m.userData.type="negY";const f=new Rl(b(s));f.userData.type="negZ",h.position.x=1,d.position.y=1,u.position.z=1,p.position.x=-1,p.scale.setScalar(.8),m.position.y=-1,m.scale.setScalar(.8),f.position.z=-1,f.scale.setScalar(.8),this.add(h),this.add(d),this.add(u),this.add(p),this.add(m),this.add(f);const g=new ri;function y(e){return new ws({color:e,toneMapped:!1})}function b(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null;const n=document.createElement("canvas");n.width=64,n.height=64;const i=n.getContext("2d");if(!i)return;i.beginPath(),i.arc(32,32,16,0,2*Math.PI),i.closePath(),i.fillStyle=e.getStyle(),i.fill(),null!==t&&(i.font="24px Arial",i.textAlign="center",i.fillStyle="#000000",i.fillText(t,32,41));const s=new gc(n);return new pl({map:s,toneMapped:!1})}this.render=function(n){this.quaternion.copy(e.quaternion).invert(),this.updateMatrixWorld(),g.set(0,0,1),g.applyQuaternion(e.quaternion),g.x>=0?(h.material.opacity=1,p.material.opacity=.5):(h.material.opacity=.5,p.material.opacity=1),g.y>=0?(d.material.opacity=1,m.material.opacity=.5):(d.material.opacity=.5,m.material.opacity=1),g.z>=0?(u.material.opacity=1,f.material.opacity=.5):(u.material.opacity=.5,f.material.opacity=1);const i=t.offsetWidth-128;n.clearDepth(),n.getViewport(uS),n.setViewport(i,0,128,128),n.render(this,r),n.setViewport(uS.x,uS.y,uS.z,uS.w)}}}const mS=new Qn;class fS extends as{constructor(e){super(),this.viewport=e,this.camera=new Zr(-1.6,1.6,.8,-.8,0,4),this.camera.position.z=2,this._generateMark()}_generateMark(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"试用版";const t=document.createElement("canvas");t.width=150,t.height=74;const n=t.getContext("2d");if(n){const i=n.createLinearGradient(0,0,t.width,t.height);i.addColorStop(0,"#ff3653"),i.addColorStop(.5,"#8adb00"),i.addColorStop(1,"#2c8fff"),n.fillStyle=i,n.font="bold 32px/1 serif",n.fillText(e,26,46)}const i=new gc(t),s=new ws({map:i,toneMapped:!1,transparent:!1}),r=new or(new Rr(2,1),s);this.add(r)}render(){const{renderer:e,container:t}=this.viewport,n=t.offsetWidth-256,i=t.offsetHeight-128;e.clearDepth(),e.getViewport(mS),e.setViewport(n,i,256,128),e.render(this,this.camera),e.setViewport(mS.x,mS.y,mS.z,mS.w)}}Hs.prototype.disposeBoundsTree=function(){this.boundsTree=null},or.prototype.raycast=function(e,t){if(this.geometry.boundsTree){if(void 0===this.material)return;Xy.copy(this.matrixWorld).invert(),Ey.copy(e.ray).applyMatrix4(Xy);const n=this.geometry.boundsTree;if(!0===e.firstHitOnly){const i=kg(n.raycastFirst(Ey,this.material),this,e);i&&t.push(i)}else{const i=n.raycast(Ey,this.material);for(let n=0,s=i.length;n<s;n++){const s=kg(i[n],this,e);s&&t.push(s)}}}else zy.call(this,e,t)},zu.prototype.firstHitOnly=!0;const gS={needsUpdate:!1};let yS=0,bS=0;class vS{constructor(e){this.clock=new au,this.sky=null,this.options=e,this.state={useFreq:1,isPausedRender:!1,isDisposed:!1},this.bvhWorker=Yy,this.signals={windowResize:new Cb,cameraObjectChange:new Cb,sceneChanged:new Cb,backgroundChanged:new Cb,beforeRender:new Cb,sceneRendered:new Cb,loadRendered:new Cb,tweenUpdate:new Cb,hover:new Cb,click:new Cb,dblClick:new Cb,rightClick:new Cb,mouseDown:new Cb,mouseMove:new Cb,mouseUp:new Cb,mouseWheel:new Cb,keyDown:new Cb,keyUp:new Cb,modelHover:new Cb,modelUnHover:new Cb,modelClick:new Cb,modelDblClick:new Cb,modelRightClick:new Cb,poiHover:new Cb,poiUnHover:new Cb,poiClick:new Cb,poiDblClick:new Cb,poiRightClick:new Cb,selectPosition:new Cb,sceneClick:new Cb,objectAdded:new Cb,objectRemoved:new Cb,objectChanged:new Cb,geometryChanged:new Cb,materialAdded:new Cb,materialChanged:new Cb,materialRemoved:new Cb,cameraChange:new Cb,outlineChange:new Cb,modelAnimation:new Cb,getSceneInfo:new Cb},this.scener=new Rb(this.signals,this.state),this.scene=this.scener.scene,this.cameraManager=new hv(this),this.camera=this.cameraManager.currentCamera,this.rendererManager=new Jb(e),this.container=this.rendererManager.container,this.interactiveContainer=this.rendererManager.interactiveContainer,this.renderer=this.rendererManager.renderer,this.rendererCSS3D=this.rendererManager.rendererCSS3D,this.rendererCSS2D=this.rendererManager.rendererCSS2D,this.rendererCSS2DHalf=this.rendererManager.rendererCSS2DHalf,this.pmremGenerator=new Ur(this.renderer),this.pmremGenerator.compileEquirectangularShader(),this.effectManager=new Nx(this.renderer,this.scene,this.camera),this.effectComposer=this.effectManager.effectComposer,this.controls=new Jx(this),this.info=new dS(this.scene,this.signals),this.stats=Ny(),this.mixer=new _u(this.scene),this.clipsSet=new Set,this.postUpdate=new Map,this.postRender=new Map,this.selectModel=null,this.selectPoi=null,this._loop=0,this.viewHelper=new pS(this.camera,this.container),this.license=new hS(this),this.waterMark=new fS(this),this._initInfo(),this._initStats(),this._signalsEventListenr(),this._containerAddEventListener(this.container),this.animate(0)}_initInfo(){if(this.options.showInfo){this.info.addListeners();const{container:e}=this.info;e.style.zIndex="1",this.container.appendChild(e)}}_initStats(){if(this.options.showStats){const{dom:e}=this.stats;e.style.zIndex="1",this.container.appendChild(e),this.signals.sceneRendered.add((()=>{this.stats.update()}))}}setSSR(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};const{enabled:t=!0,intensity:n=1,exponent:i=1.75,distance:s=20,fade:r=0,roughnessFade:o=1,thickness:a=3.5,ior:l=1.75,maxRoughness:c=.1,maxDepthDifference:h=20,blend:d=.95,correction:u=1,correctionRadius:p=1,blur:m=1,blurKernel:f=1,blurSharpness:g=10,jitter:y=0,jitterRoughness:b=2,steps:v=20,refineSteps:x=10,missedRays:w=!1,useNormalMap:S=!0,useRoughnessMap:M=!0,resolutionScale:T=1,velocityResolutionScale:C=1}=e,{effectManager:L}=this;L.effectsNeedsUpddate=!0;const R=L.effectsMap.get(Nx.CONSTANTS.ssrEffect);R.enabled=t;const{effect:G}=R;G.usingBoxProjectedEnvMap=!0,G.intensity=n,G.exponent=i,G.distance=s,G.fade=r,G.roughnessFade=o,G.thickness=a,G.ior=l,G.maxRoughness=c,G.maxDepthDifference=h,G.blend=d,G.correction=u,G.correctionRadius=p,G.blur=m,G.blurKernel=f,G.blurSharpness=g,G.jitter=y,G.jitterRoughness=b,G.steps=v,G.refineSteps=x,G.missedRays=w,G.useNormalMap=S,G.useRoughnessMap=M,G.resolutionScale=T,G.velocityResolutionScale=C,this.triggerRender()}setBloom(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};var t;const{enabled:n=!0,intensity:i=3,radius:s=.85,threshold:r=1,smoothing:o=0,scalar:a=2,opacity:l=1,selection:c=[]}=e,{effectManager:h}=this;h.effectsNeedsUpddate=!0;const d=h.effectsMap.get(Nx.CONSTANTS.bloomEffect);d.enabled=n;const{effect:u}=d;u.intensity=i,u.mipmapBlurPass.radius=s,u.luminanceMaterial.threshold=r,u.luminanceMaterial.smoothing=o,u.blendMode.opacity.value=l,null===(t=u.luminanceMaterial.userData.bloomSelection)||void 0===t||t.forEach((e=>{e instanceof or&&e.material.color&&(e.material.toneMapped=!0,e.material.color.multiplyScalar(1/a))})),u.luminanceMaterial.userData.bloomSelection=[],n&&c.forEach((e=>{e.traverse((e=>{e instanceof or&&e.material.color&&(e.material.toneMapped=!1,e.material.color.multiplyScalar(a),u.luminanceMaterial.userData.bloomSelection.push(e))}))})),this.triggerRender()}setSSAO(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};const{enabled:t=!0,depthAwareUpsampling:n=!0,samples:i=32,rings:s=7,distanceThreshold:r=.02,distanceFalloff:o=.0025,rangeThreshold:a=3e-4,rangeFalloff:l=1e-4,luminanceInfluence:c=.7,minRadiusScale:h=.33,radius:d=.1,intensity:u=3,bias:p=.004,fade:m=.01,color:f=null,resolutionScale:g=1}=e,{effectManager:y}=this;y.effectsNeedsUpddate=!0;const b=y.passesMap.get(Nx.CONSTANTS.normalPass),v=y.effectsMap.get(Nx.CONSTANTS.ssaoEffect);b.enabled=t,v.enabled=t;const{effect:x}=v,{ssaoMaterial:w}=x;x.depthAwareUpsampling=n,x.luminanceInfluence=c,x.resolution.scale=g,x.intensity=u,w.samples=i,w.rings=s,w.distanceThreshold=r,w.distanceFalloff=o,w.proximityThreshold=a,w.proximityFalloff=l,w.minRadiusScale=h,w.fade=m,w.bias=p,w.radius=d,f&&(x.color=new Fn(f)),this.triggerRender()}setColorSpace(e){this.renderer.outputEncoding="sRGB"===e?3001:3e3,this.signals.sceneChanged.dispatch()}setToneMapping(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};const{type:t="ACESFilmic",exposure:n=.8}=e,i={None:0,Linear:1,Reinhard:2,Cineon:3,ACESFilmic:4};this.renderer.toneMapping=i[t],this.renderer.toneMappingExposure=n,this.signals.sceneChanged.dispatch()}setSphereSkyBackground(e){(new Md).load(e,(e=>{e.mapping=303,this.scene.background=e,this.signals.backgroundChanged.dispatch()}))}setSkyBackground(e,t){Jm(e,t).then((e=>{this.scene.background=e,this.signals.backgroundChanged.dispatch()}))}setBackgroundColor(e){this.scene.background=new Fn(e),this.signals.backgroundChanged.dispatch()}setBackgroundImage(e){(new Md).load(e,(e=>{e.wrapS=1002,e.wrapT=1002,this.scene.background=e,this.signals.backgroundChanged.dispatch()}))}setSky(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};const{enabled:t=!0,position:n={x:0,y:0,z:0},scalar:i=45e4,turbidity:s=10,rayleigh:r=3,elevation:o=2,azimuth:a=180,exposure:l=.6}=e;if(!t)return void this.closeSky();this.sky||(this.sky=new Vy,this.scene.add(this.sky)),this.sky.name="sky",this.sky.position.set(n.x,n.y,n.z),this.sky.scale.setScalar(i);const c=this.sky.material.uniforms;c.turbidity.value=s,c.rayleigh.value=r,c.mieCoefficient.value=.005,c.mieDirectionalG.value=.7;const h=new ri,d=Um(90-o),u=Um(a);return h.setFromSphericalCoords(1,d,u),c.sunPosition.value.copy(h),this.sky.userData.toneMapping=this.renderer.toneMapping,this.sky.userData.toneMappingExposure=this.renderer.toneMappingExposure,this.renderer.toneMapping=4,this.renderer.toneMappingExposure=l,this.signals.objectAdded.dispatch(),this.sky}closeSky(){if(!this.sky)return!1;const{toneMapping:e,toneMappingExposure:t}=this.sky.userData;return this.renderer.toneMapping=e,this.renderer.toneMappingExposure=t,this.sky.removeFromParent(),this.sky=null,this.signals.objectRemoved.dispatch(),!0}screenshot(){return new Promise((e=>{this.renderer.domElement.toBlob((t=>{e(t)}))}))}setEnvironment(){return this.scene.environment=this.pmremGenerator.fromScene(new Py,.04).texture,this.signals.sceneChanged.dispatch(),this.scene.environment}playModelAnimation(e,t){let n;if(t instanceof hd?n=t:ig(t)?n=e.animations[t]:og(t)&&(n=e.animations.find(t)),!n)return;const i=this.mixer.clipAction(n,e);return i.play(),this.clipsSet.add(n),i}stopModelAnimation(e,t){var n;let i;t instanceof hd?i=t:ig(t)?i=e.animations[t]:og(t)&&(i=e.animations.find(t)),i&&(null===(n=this.mixer.existingAction(i))||void 0===n||n.stop(),this.mixer.uncacheAction(i,e),this.clipsSet.delete(i))}render(e){return rf(this,void 0,void 0,(function*(){return yield null==e?void 0:e(),new Promise((e=>{this.signals.sceneRendered.addOnce(e),this.triggerRender()}))}))}triggerRender(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:1;this.state.useFreq=e}setPauseRender(){let e=!(arguments.length>0&&void 0!==arguments[0])||arguments[0];return rf(this,void 0,void 0,(function*(){if(this.state.isPausedRender=e,!1===e)return this.render()}))}_passesObserver(){this.effectManager.updateEffectPass()}autoRender(e){if(this.state.useFreq<=0&&!gS.needsUpdate)return;if(this.state.useFreq>0&&this.state.useFreq--,gS.needsUpdate&&(gS.needsUpdate=!1),this.state.isPausedRender)return;yS=performance.now(),this.signals.beforeRender.dispatch(),this._passesObserver(),this.effectComposer.render();const t=this.scene.autoUpdate;this.scene.autoUpdate=!1,this.rendererCSS2D&&this.rendererManager.internalOptions.enableRenderCss2D&&this.rendererCSS2D.render(this.scene,this.camera),this.rendererCSS2DHalf&&this.rendererManager.internalOptions.enableRenderCss2DHalf&&this.rendererCSS2DHalf.render(this.scene,this.camera),this.rendererCSS3D&&this.rendererManager.internalOptions.enableRenderCss3D&&this.rendererCSS3D.render(this.scene,this.camera),this.scene.autoUpdate=t,this.options.showViewHelper&&this.camera===this.cameraManager.mainCamera&&this.viewHelper.render(this.renderer),this.license.getVerified()||this.waterMark.render(),this.postRender.forEach((t=>t(e))),bS=performance.now(),this.signals.sceneRendered.dispatch(bS-yS)}animate(e){this._loop=requestAnimationFrame((e=>{this.animate(e)}));const t=this.clock.getDelta();this.clipsSet.size>0&&(this.mixer.update(t),this.signals.modelAnimation.dispatch()),Zm.update()&&this.signals.tweenUpdate.dispatch(),this.postUpdate.forEach((t=>t(e))),this.autoRender(e),this.signals.getSceneInfo.dispatch(this.info.state)}getOffsetByPosition(e){const t=new ri(e.x,e.y,e.z).project(this.camera),n=this.renderer.domElement.getBoundingClientRect();return{left:Math.round(n.left+n.width/2*(t.x+1)),top:Math.round(n.top+n.height/2*(1-t.y))}}getPositionByOffset(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:.1;const n=new ri(0,0,0),i=new ri(0,0,0),s=this.renderer.domElement.getBoundingClientRect();i.set(e.offsetX/s.width*2-1,-e.offsetY/s.height*2+1,t),i.unproject(this.camera),i.sub(this.camera.position).normalize();const r=i.distanceTo(this.camera.position);return n.copy(this.camera.position).add(i.multiplyScalar(r)),n}getIntersects(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:this.scener.intersectsList.getAll(),n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};const{isFilterHideObject:i=!0}=n,s=this.container.getBoundingClientRect();let r={offsetX:0,offsetY:0};if(e instanceof MouseEvent)r={offsetX:e.clientX-s.left,offsetY:e.clientY-s.top};else if(e instanceof TouchEvent){const t=e.changedTouches[0];r={offsetX:t.clientX-s.left,offsetY:t.clientY-s.top}}else r=e;const o=new Gn;o.set(r.offsetX/s.width*2-1,-r.offsetY/s.height*2+1);const a=new zu;a.setFromCamera(o,this.camera);let l=[];return l=sg(t)?a.intersectObjects(t,!0):a.intersectObject(t,!0),i?l.filter((e=>{let{object:t}=e;return Km(t)})):l}rayClash(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.camera.position,t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:new ri(0,-1,0),n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:this.scener.intersectsList.meshOfModelList;const i=new zu;return i.set(e,t),sg(n)?i.intersectObjects(n,!0):i.intersectObject(n,!0)}setHoverEnabled(e){this.options.hoverEnabled=e}clearSignals(){for(const e in this.signals)this.signals[e].removeAll()}dispose(){cancelAnimationFrame(this._loop),this.mixer.stopAllAction(),this.clipsSet.forEach((e=>{this.mixer.uncacheAction(e),this.mixer.uncacheClip(e)})),this.mixer.uncacheRoot(this.scene),this.clipsSet.clear(),this.controls.dispose(),Zm.removeAll(),this.bvhWorker.dispose(),this.clearSignals(),this.scene.clear(),this.pmremGenerator.dispose(),this.effectComposer.dispose(),this.renderer.dispose(),this.renderer.forceContextLoss(),this.container.remove(),this.state.isDisposed=!0}_signalsEventListenr(){const e=()=>{const{offsetWidth:e,offsetHeight:t}=this.container;this.effectManager.updateCamera(this.camera),this.camera.aspect=e/t,this.camera.updateProjectionMatrix(),this.renderer.setSize(e,t),this.effectComposer.setSize(e,t),this.rendererCSS3D&&this.rendererCSS3D.setSize(e,t),this.rendererCSS2D&&this.rendererCSS2D.setSize(e,t),this.rendererCSS2DHalf&&this.rendererCSS2DHalf.setSize(e,t),this.triggerRender()};setTimeout((()=>e())),this.signals.windowResize.add(e),this.signals.cameraObjectChange.add(e),this.signals.sceneChanged.add((()=>this.triggerRender())),this.signals.backgroundChanged.add((()=>this.triggerRender())),this.signals.objectAdded.add((()=>this.triggerRender())),this.signals.objectRemoved.add((()=>this.triggerRender())),this.signals.objectChanged.add((()=>this.triggerRender())),this.signals.materialAdded.add((()=>this.triggerRender())),this.signals.materialRemoved.add((()=>this.triggerRender())),this.signals.materialChanged.add((()=>this.triggerRender())),this.signals.geometryChanged.add((()=>this.triggerRender())),this.signals.cameraChange.add((()=>this.triggerRender())),this.signals.tweenUpdate.add((()=>this.triggerRender())),this.signals.modelAnimation.add((()=>this.triggerRender()));this.signals.outlineChange.add((e=>{const{objects:t,options:n}=e,{color:i,hideColor:s,edgeThickness:r,edgeStrength:o}=Object.assign(Object.assign({},{color:16777215,hideColor:10066329,edgeThickness:3,edgeStrength:10}),n),{effectManager:a}=this;a.effectsNeedsUpddate=!0;const l=a.effectsMap.get(Nx.CONSTANTS.outlineEffect),c=t.length>0;l.enabled=c;const{effect:h}=l,{uniforms:d}=h,u=[];t.forEach((e=>{e.traverse((e=>{e instanceof or&&u.push(e)}))})),h.selection.set(u),h.blur=r>0,h.blurPass.kernelSize=r;const p=d.get("visibleEdgeColor"),m=d.get("hiddenEdgeColor"),f=d.get("edgeStrength");p&&p.value.set(i),m&&m.value.set(s),f&&(f.value=o),this.triggerRender()}))}_containerAddEventListener(e){const t=[0,0];let n=null;const i=s=>{var r,o;this.signals.mouseUp.dispatch(s);const a=s.offsetX-(null!==(r=null==n?void 0:n.offsetX)&&void 0!==r?r:0),l=s.offsetY-(null!==(o=null==n?void 0:n.offsetY)&&void 0!==o?o:0);if(Math.abs(a)>2||Math.abs(l)>2)return t[0]=0,void(t[1]=0);setTimeout((()=>{0!==t[0]&&0===t[1]&&(0===s.button?(this.signals.click.dispatch(s),this._triggerSceneEventInAllObject("click",s)):2===s.button&&(this.signals.rightClick.dispatch(s),this._triggerSceneEventInAllObject("rightClick",s))),t[0]=0,t[1]=0}),300),e.removeEventListener("mouseup",i,!1)};let s=!1,r=null,o=null;const a=[0,0],l=e=>{var t,n;r&&clearTimeout(r);const i=()=>{s=!1,a[0]=0,a[1]=0},l=e.changedTouches[0].clientX-(null!==(t=null==o?void 0:o.changedTouches[0].clientX)&&void 0!==t?t:0),c=e.changedTouches[0].clientY-(null!==(n=null==o?void 0:o.changedTouches[0].clientY)&&void 0!==n?n:0);Math.abs(l)>2||Math.abs(c)>2?i():s?(i(),this.signals.rightClick.dispatch(e),this._triggerSceneEventInAllObject("rightClick",e)):setTimeout((()=>{0!==a[0]&&0===a[1]?(this.signals.click.dispatch(e),this._triggerSceneEventInAllObject("click",e)):0!==a[0]&&0!==a[1]&&a[1]-a[0]<=300&&(this.signals.dblClick.dispatch(e),this._triggerSceneEventInAllObject("dblClick",e)),i()}),300)};e.addEventListener("mousedown",(s=>{n=s,this.signals.mouseDown.dispatch(s),0===t[0]?t[0]=performance.now():0===t[1]&&(t[1]=performance.now()),e.addEventListener("mouseup",i,!1)}),!1),e.addEventListener("mousemove",(e=>{this.signals.mouseMove.dispatch(e),this.options.hoverEnabled&&this._triggerSceneEventInAllObject("hover",e)}),!1),e.addEventListener("dblclick",(e=>{this.signals.dblClick.dispatch(e),this._triggerSceneEventInAllObject("dblClick",e)}),!1),e.addEventListener("wheel",(e=>{this.signals.mouseWheel.dispatch(e)}),{passive:!0}),e.addEventListener("touchstart",(t=>{0===a[0]?a[0]=performance.now():0===a[1]&&(a[1]=performance.now()),o=t,r&&clearTimeout(r),r=setTimeout((()=>{s=!0}),800),e.addEventListener("touchend",l,{once:!0})}),{passive:!0}),e.addEventListener("contextmenu",(e=>e.preventDefault()),!1),document.addEventListener("keydown",(e=>{this.signals.keyDown.dispatch(e)}),!1),document.addEventListener("keyup",(e=>{this.signals.keyUp.dispatch(e)}),!1)}_triggerSceneEventInAllObject(e,t){const n=this.getIntersects(t,this.scener.intersectsList.getAll());if(0===n.length)return this.selectModel&&this.signals.modelHover.numListeners>0&&this.signals.modelUnHover.dispatch(this.selectModel),this.selectPoi&&this.signals.poiHover.numListeners>0&&this.signals.poiUnHover.dispatch(this.selectPoi),this.selectModel=null,this.selectPoi=null,void this.signals.sceneClick.dispatch({type:e,event:t});const i={object:null,type:null,point:null},s=[],r=[];function o(e){return e.parent?"Model"===e.parent.stype?e.parent:o(e.parent):void 0}n.forEach((e=>{if(e.object.parent instanceof AS){const t=e.object.parent;i.object||(i.type="Poi",i.object=e.object,i.point=e.point);-1===s.findIndex((e=>e.poi.uuid===t.uuid))&&s.push({poi:t,sourceData:e})}else if(e.object instanceof as){const t=o(e.object);t&&(i.object||(i.type="Model",i.object=e.object,i.point=e.point),r.push({model:t,sourceData:e}))}})),"click"===e&&i.point&&this.signals.selectPosition.dispatch(i.point);const a=e.slice(0,1).toUpperCase()+e.slice(1),l=e=>{var n;const{model:s}=e[0];if(s)if("Hover"===a)(null===(n=this.selectModel)||void 0===n?void 0:n.uuid)!==s.uuid&&(this.signals.modelHover.dispatch({target:s,currentTarget:i.object,intersects:e,event:t}),this.selectModel=s);else{let n=null;"Click"===a?(n=s.onClick,s.dispatchEvent({type:"click"})):"RightClick"===a?(n=s.onRightClick,s.dispatchEvent({type:"rightClick"})):"DblClick"===a&&(n=s.onDblClick,s.dispatchEvent({type:"dblClick"})),n?n(s):s.isEventPropagation=!0,s.isEventPropagation&&(this.signals[`model${a}`].dispatch({target:s,currentTarget:i.object,intersects:e,event:t}),s.isEventPropagation=!1)}},c=e=>{var n;const{poi:i}=e[0];if(i)if("Hover"===a)(null===(n=this.selectPoi)||void 0===n?void 0:n.uuid)!==i.uuid&&(this.signals.poiHover.dispatch({target:i,event:t}),this.selectPoi=i);else{let e=null;"Click"===a?(e=i.onClick,i.dispatchEvent({type:"click"})):"RightClick"===a?(e=i.onRightClick,i.dispatchEvent({type:"rightClick"})):"DblClick"===a&&(e=i.onDblClick,i.dispatchEvent({type:"dblClick"})),e?e(i):i.isEventPropagation=!0,i.isEventPropagation&&(this.signals[`poi${a}`].dispatch({target:i,event:t}),i.isEventPropagation=!1)}};"Model"===i.type?l(r):"Poi"===i.type&&c(s)}}class xS extends or{constructor(e,t,n){let i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:"BaseMesh";super(e,t);const{id:s,name:r="",level:o={max:null,min:null},visible:a=!0,position:l={x:0,y:0,z:0},rotation:c={x:0,y:0,z:0},scale:h={x:1,y:1,z:1},userData:d={}}=n;if(void 0===s)throw new Error("In soonspacejs: 空间对象实例化失败,缺少必要字段 'id'!");this.sid=s,this.name=r,this.stype=i,this.level=o,this.visible=null==a||a,this.handleHide=!a,this.position.set(l.x,l.y,l.z),this.rotation.set(c.x,c.y,c.z),this.scale.set(h.x,h.y,h.z),this.castShadow=!0,this.receiveShadow=!0,this.userData=d,this.isEventPropagation=!1,this.autoUpdate=!1}show(){this.visible=!0,this.handleHide=!1,this.autoUpdate=!0,gS.needsUpdate=!0}hide(){this.visible=!1,this.handleHide=!0,this.autoUpdate=!0,gS.needsUpdate=!0}setMove(e,t,n,i){return ug(this.position,Dm(e),t,n,i)}setRotate(e,t,n,i){const s=Bm(e),r=this.quaternion.clone(),o=(new si).setFromEuler(s);return ug({t:0},{t:1},t,((e,t)=>{let{t:i}=e;this.quaternion.slerpQuaternions(r,o,i),null==n||n(this.rotation,t)}),i)}setScale(e,t,n,i){return ug(this.scale,Dm(e),t,n,i)}getBoundingBox(){return new li(new ri,new ri).setFromObject(this)}eventPropagation(){this.isEventPropagation=!0}sClone(e){return new xS(this.geometry,this.material,{id:`clone_${cg()}`}).sCopy(this,e)}sCopy(e){let t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];if(this.name=e.name,this.stype=e.stype,this.up.copy(e.up),this.position.copy(e.position),this.rotation.order=e.rotation.order,this.quaternion.copy(e.quaternion),this.scale.copy(e.scale),this.geometry=e.geometry,this.material=e.material,this.matrix.copy(e.matrix),this.matrixWorld.copy(e.matrixWorld),this.matrixAutoUpdate=e.matrixAutoUpdate,this.matrixWorldNeedsUpdate=e.matrixWorldNeedsUpdate,this.layers.mask=e.layers.mask,this.visible=e.visible,this.castShadow=e.castShadow,this.receiveShadow=e.receiveShadow,this.frustumCulled=e.frustumCulled,this.renderOrder=e.renderOrder,this.userData=JSON.parse(JSON.stringify(e.userData)),!0===t)for(let t=0;t<e.children.length;t++)e.children[t]instanceof SS||e.children[t]instanceof xS?this.add(e.children[t].sClone()):this.add(e.children[t].clone());return this}}const wS={onLoad:null,onClick:null,onDblClick:null,onRightClick:null};class SS extends as{constructor(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"BaseObject3D";super();const{id:n,name:i="",level:s={max:null,min:null},visible:r=!0,position:o={x:0,y:0,z:0},rotation:a={x:0,y:0,z:0},scale:l={x:1,y:1,z:1},userData:c={},onLoad:h,onClick:d,onDblClick:u,onRightClick:p}=Object.assign(Object.assign({},wS),e);if(void 0===n)throw new Error("In soonspacejs: 空间对象实例化失败,缺少必要字段 'id'!");this.sid=n,this.name=i,this.stype=t,this.level=s,this.visible=null==r||r,this.handleHide=!r,this.isEventPropagation=!1,this.position.set(o.x,o.y,o.z),this.rotation.set(a.x,a.y,a.z),this.scale.set(l.x,l.y,l.z),this.castShadow=!0,this.receiveShadow=!0,this.userData=c,this.autoUpdate=!1,this.onLoad=(null==h?void 0:h.bind(this))||null,this.onClick=(null==d?void 0:d.bind(this))||null,this.onDblClick=(null==u?void 0:u.bind(this))||null,this.onRightClick=(null==p?void 0:p.bind(this))||null}eventPropagation(){this.isEventPropagation=!0}show(){this.visible=!0,this.handleHide=!1,this.autoUpdate=!0,gS.needsUpdate=!0}hide(){this.visible=!1,this.handleHide=!0,this.autoUpdate=!0,gS.needsUpdate=!0}setMove(e,t,n,i){return ug(this.position,Dm(e),t,n,i)}setRotate(e,t,n,i){const s=Bm(e),r=this.quaternion.clone(),o=(new si).setFromEuler(s);return ug({t:0},{t:1},t,((e,t)=>{let{t:i}=e;this.quaternion.slerpQuaternions(r,o,i),null==n||n(this.rotation,t)}),i)}setScale(e,t,n,i){return ug(this.scale,Dm(e),t,n,i)}sClone(e){return new SS({id:`clone_${cg()}`}).sCopy(this,e)}sCopy(e){let t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];if(this.name=e.name,this.stype=e.stype,this.up.copy(e.up),this.position.copy(e.position),this.rotation.order=e.rotation.order,this.quaternion.copy(e.quaternion),this.scale.copy(e.scale),this.matrix.copy(e.matrix),this.matrixWorld.copy(e.matrixWorld),this.matrixAutoUpdate=e.matrixAutoUpdate,this.matrixWorldNeedsUpdate=e.matrixWorldNeedsUpdate,this.layers.mask=e.layers.mask,this.visible=e.visible,this.castShadow=e.castShadow,this.receiveShadow=e.receiveShadow,this.frustumCulled=e.frustumCulled,this.renderOrder=e.renderOrder,this.userData=JSON.parse(JSON.stringify(e.userData)),this.animations=e.animations,!0===t)for(let t=0;t<e.children.length;t++){const n=e.children[t];n instanceof SS||n instanceof xS?this.add(n.sClone()):this.add(n.clone())}return this}getBoundingBox(){return new li(new ri,new ri).setFromObject(this)}getSpaceAttribute(){return Om(this,!(arguments.length>0&&void 0!==arguments[0])||arguments[0])}syncSpaceAttribute(e){e instanceof SS?Ym(this,e,!(arguments.length>1&&void 0!==arguments[1])||arguments[1]):Vm("In soonspacejs: BaseObject3D 对象原型方法 'syncSpaceAttribute' 第一个参数对象类型错误!")}}class MS extends SS{constructor(e){super(e,"Group")}showAllChild(){this.children.forEach((e=>{e instanceof SS&&e.show()}))}hideAllChild(){this.children.forEach((e=>{e instanceof SS&&e.hide()}))}}class TS extends SS{constructor(e){super(e,"PluginObject")}}class CS extends SS{constructor(e){super(e,"PoiNode");const{type:t,element:n}=e;this.elementType=t,this.element=n,this.create(t)}create(e){"2D"===e||"2d"===e?this._create2D():"2.5D"===e||"2.5d"===e?this._create2DHalf():"3D"!==e&&"3d"!==e||this._create3D()}show(){this.visible=!0,this.handleHide=!1,this._setElementDisplay(!0),this.autoUpdate=!0}hide(){this.visible=!1,this.handleHide=!0,this._setElementDisplay(!1),this.autoUpdate=!0}getBoundingBox(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:50;e=e<=0?50:e;const t=new ri,n=new ri,i=new ri(e,e,e);return t.copy(this.position),n.copy(this.position),t.sub(i),n.add(i),new li(t,n)}_create2D(){this.add(new Gb(this.element))}_create2DHalf(){this.add(new Ob(this.element))}_create3D(){this.add(new Nb(this.element))}_setElementDisplay(e){this.children.forEach((t=>{(t instanceof Gb||t instanceof Ob||t instanceof Nb)&&("2D"===this.elementType||"2d"===this.elementType?t.visible=e:e&&"none"===t.element.style.display?t.element.style.display=t.userData.elDisplay||"block":e||"none"===t.element.style.display||(t.userData.elDisplay=t.element.style.display,t.element.style.display="none"))}))}}class LS extends SS{constructor(e){super(e,"Model");const{format:t}=e;this.formatType=t}setEnvMap(e,t){let n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};Jm(e,t).then((e=>{this.traverse((t=>{if(t instanceof or&&t.material instanceof kh){const{reflectivity:i=.5}=n;t.material.envMap=e,t.material.envMapIntensity=i,gS.needsUpdate=!0}}))}))}sClone(e){return new LS({id:`${this.sid}_clone`,url:"",format:this.formatType}).sCopy(this,e)}}const RS={position:{x:0,y:0,z:0},scale:{x:16,y:16,z:1},stype:"Icon"};class GS extends Rl{constructor(e,t){super(e);const{position:n,scale:i,stype:s}=Object.assign(Object.assign({},RS),t);this.stype=s,this.position.set(n.x,n.y,n.z),this.scale.set(i.x,i.y,i.z),this.renderOrder=1}}class AS extends SS{constructor(e,t){super(t,"Poi");const{name:n,type:i="2.5d",nameScale:s={x:16,y:16,z:1}}=t;this.iconType=i,this.icon=this._createIcon(e);const r={position:{x:0,y:10,z:0},name:n,scale:s};this.text=this.name?this._createText(r):null,this.renderOrder=11}getBoundingBox(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:50;e=e<=0?50:e;const t=new ri,n=new ri,i=new ri(e,e,e);return t.copy(this.position),n.copy(this.position),t.sub(i),n.add(i),new li(t,n)}sClone(e){return new AS(this.icon.material,{id:`${this.sid}_clone`,url:"",type:this.iconType,name:this.name}).sCopy(this,e)}_createIcon(e){const t=new GS(this._computeMaterialSizeAttenuation(e));return this.add(t),t}_createText(e){const t=this._createTextMaterial(e),n=new GS(this._computeMaterialSizeAttenuation(t),e);return this.add(n),n}_createTextMaterial(e){const t=this._createTextCanvas(e.name||""),n=new Jn(t);n.flipY=!0,n.version+=1;return new pl({map:n,depthTest:!0})}_createTextCanvas(e,t){const n=256,i=document.createElement("canvas");i.width=n,i.height=n;const s=i.getContext("2d"),{fontFamily:r,fontSize:o,color:a,textAlign:l,textBaseline:c}=Object.assign(Object.assign({},{fontFamily:"Microsoft YaHei",fontSize:32,color:"#fff",textAlign:"center",textBaseline:"bottom"}),t);return s&&(s.save(),s.font=o+"px "+r,s.textAlign=l,s.textBaseline=c,s.shadowColor="black",s.strokeStyle="black",s.lineWidth=3,s.fillStyle=a,s.strokeText(e,128,128),s.fillText(e,128,128),s.restore()),i}_computeMaterialSizeAttenuation(e){return"2D"===this.iconType||"2d"===this.iconType?e.sizeAttenuation=!1:"2.5D"!==this.iconType&&"2.5d"!==this.iconType||(e.sizeAttenuation=!0),e}}class _S extends xS{constructor(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"Point";const{radius:n=10,color:i=16777215,opacity:s=1,gradient:r}=e;super(function(e){return new Xh(e,32,32)}(n),function(e,t,n){return new ws({color:e,opacity:t,transparent:t<1,map:Qm(n)})}(i,s,r),e,t)}setOptions(e){const{color:t,opacity:n,radius:i,position:s,gradient:r}=e,o=this.material;t&&(o.color=new Fn(t)),n&&(o.opacity=n),i&&(this.geometry=new Xh(i,32,32)),s&&this.position.copy(Dm(s)),r&&(o.map=Qm(r)),o.needsUpdate=!0,gS.needsUpdate=!0}}class IS extends _S{constructor(e){super(e,"Node"),this.graphs=e.graphs}}class ES extends xS{constructor(e){const{radius:t=50,color:n=16777215,opacity:i=1,gradient:s}=e;super(function(e){return new Bc(e,64)}(t),function(e,t,n){return new ws({color:e,opacity:t,transparent:t<1,side:2,map:Qm(n)})}(n,i,s),e,"Circle"),this.rotation.set(Math.PI/2,0,0)}setOptions(e){const{color:t,opacity:n,radius:i,position:s,gradient:r}=e,o=this.material;t&&(o.color=new Fn(t)),n&&(o.opacity=n),i&&(this.geometry=new Bc(i,64)),s&&this.position.copy(Dm(s)),r&&(o.map=Qm(r)),o.needsUpdate=!0,gS.needsUpdate=!0}}class XS extends xS{constructor(e){const{start:t,end:n,imgUrl:i,width:s=20,color:r=65280,opacity:o=1,animation:a=!1,passable:l=0,restrict:c=0}=e,h=Dm(t),d=Dm(n),u=h.distanceTo(d);super(function(e,t,n){let i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:new ri(0,1,0);const s=n/2,r=new ri,o=new ri;r.subVectors(t,e),r.normalize(),o.crossVectors(r,i);const a=new ri(o.x*s,o.y*s,o.z*s),l=new ri(-o.x*s,-o.y*s,-o.z*s),c=new ri;c.addVectors(e,a);const h=new ri;h.addVectors(e,l);const d=new ri;d.addVectors(t,l);const u=new ri;u.addVectors(t,a);const p=new Hs;return p.setAttribute("position",new Xs([c.x,c.y,c.z,h.x,h.y,h.z,d.x,d.y,d.z,d.x,d.y,d.z,u.x,u.y,u.z,c.x,c.y,c.z],3)),p.setAttribute("uv",new Xs([0,0,1,0,1,1,1,1,0,1,0,0],2)),p}(h,d,s),function(e,t,n,i,s,r){const o=new ws({color:n,side:2,transparent:void 0!==i&&i<1,opacity:i});let a;return s&&(a=(new Md).load(s,(n=>{a.repeat.set(1,e/(t*(n.image.height/n.image.width))*.63*(n.image.height/n.image.height)),o.color.set(16777215)})),a.wrapS=1e3,a.wrapT=1e3,a.flipY=!0,a.matrixAutoUpdate=!0,ng(r)&&r?ug(a.offset,{y:-1,x:0},{repeat:!0,duration:500}):rg(r)&&ug(a.offset,{y:-1,x:0},Object.assign(Object.assign({},r),{repeat:!0})),o.map=a),o}(u,s,r,o,i,a),e,"Link"),this.passable=l,this.restrict=c}}class zS extends SS{constructor(e){super(e,"Topology");const{type:t="line"}=e;this.topologyType=t,this.nodes=[],this.links=[],this.info=e,this.create()}create(){var e,t;const{nodes:n,renderLink:i=!0,linkWidth:s=20,linkColor:r=65280,renderNode:o=!0,nodeColor:a=255,nodeRadius:l=s/2,imgUrl:c,animation:h=!1}=this.info,d=[];for(const u of n){const n=this.createNode(Object.assign(Object.assign({},u),{radius:l,color:a}));if(!1===o&&n.hide(),this.nodes.push(n),!c&&i){const n=sg(r)?r[null===(e=u.graphs[0])||void 0===e?void 0:e.passable]?r[null===(t=u.graphs[0])||void 0===t?void 0:t.passable]:r[0]:r;!o&&this.createCircle({id:`${u.id}_circle`,name:`${u.name||u.id}_circle`,position:u.position,radius:s/2,color:n})}if(i)for(let e=0;e<u.graphs.length;e++){const{linkInfo:t,targetNodeId:n,passable:i,restrict:o}=u.graphs[e],{id:a,name:l}=t,p=this.info.nodes.find((e=>e.id===n));if(!d.includes(a)&&p){d.push(a);const e=sg(r)?r[i]?r[i]:r[0]:r,t=this.createLink({id:a,name:l,start:u.position,end:p.position,width:s,color:e,imgUrl:c,opacity:c?.99:1,animation:h,passable:i,restrict:o,userData:{startNodeId:u.id,endNodeId:p.id}});this.links.push(t)}}}}createNode(e){const t=new IS(Object.assign({},e));return this.add(t),t}createCircle(e){const t=new ES(Object.assign(Object.assign({},e),{rotation:{x:Math.PI/2,y:0,z:0}}));return this.add(t),t}createLink(e){const t=new XS(Object.assign({},e));return this.add(t),t}resetNodes(e){const{renderLink:t=!0,linkWidth:n=20,linkColor:i=65280,renderNode:s=!0,nodeColor:r=255,nodeRadius:o=n/2,imgUrl:a,animation:l=!1}=this.info,c=[],h=[...this.info.nodes];this.info.nodes=[...e];const d=[];for(let t=0;t<h.length;t++){const n=e.find((e=>e.id===h[t].id));n&&Dm(n.position).equals(Dm(h[t].position))||d.push(h[t])}for(let e=0;e<d.length;e++){const t=this.nodes.findIndex((t=>d[e].id===t.sid));this.remove(this.nodes[t]),this.nodes.splice(t,1)}const u=[];for(let t=0;t<e.length;t++){const n=h.find((n=>n.id===e[t].id));n&&Dm(n.position).equals(Dm(e[t].position))||u.push(e[t])}for(let e=0;e<u.length;e++){const t=this.createNode(Object.assign(Object.assign({},u[e]),{radius:o,color:r}));this.nodes.push(t)}this.remove(...this.links),this.links.length=0;for(const s of e)if(t)for(let e=0;e<s.graphs.length;e++){const{linkInfo:t,targetNodeId:r,passable:o,restrict:h}=s.graphs[e],{id:d,name:u}=t,p=this.info.nodes.find((e=>e.id===r));if(!c.includes(d)&&p){c.push(d);const e=sg(i)?i[o]?i[o]:i[0]:i,t=this.createLink({id:d,name:u,start:s.position,end:p.position,width:n,color:e,imgUrl:a,opacity:a?.99:1,animation:l,passable:o,restrict:h});this.links.push(t)}}}getLength(){let e=0;for(let t=1;t<this.nodes.length;t++)e+=this.nodes[t].position.distanceTo(this.nodes[t-1].position);return e}}function PS(e,t){let n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:new ri(0,1,0);const i=t/2,s=new Hs;let r=[],o=[];if(e.length<2)return s;for(let t=0;t<e.length-1;t++){const s=Dm(e[t]),a=Dm(e[t+1]),l=new ri,c=new ri;l.subVectors(a,s),l.normalize(),c.crossVectors(l,n);const h=new ri(c.x*i,c.y*i,c.z*i),d=new ri(-c.x*i,-c.y*i,-c.z*i),u=new ri;u.addVectors(s,h);const p=new ri;p.addVectors(s,d);const m=new ri;m.addVectors(a,d);const f=new ri;f.addVectors(a,h),r=[...r,u.x,u.y,u.z,p.x,p.y,p.z,m.x,m.y,m.z,m.x,m.y,m.z,f.x,f.y,f.z,u.x,u.y,u.z],o=[...o,0,0,1,0,1,1,1,1,0,1,0,0]}return s.setAttribute("position",new Xs(r,3)),s.setAttribute("uv",new Xs(o,2)),s}class WS extends xS{constructor(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"Line";const{points:n,width:i=20,color:s=16777215,opacity:r=1,gradient:o}=e;super(PS(n,i),function(e,t,n){return new ws({color:e,side:2,transparent:t<1,opacity:t,map:Qm(n)})}(s,r,o),e,t),this.params=e,this.points=n,this.frustumCulled=!1}setOptions(e){var t;const{color:n,opacity:i,points:s,width:r,gradient:o}=e;this.points=s;const a=this.material;n&&(a.color=new Fn(n)),i&&(a.opacity=i),o&&(a.map=Qm(o)),s&&r?this.geometry=PS(s,r):s?this.geometry=PS(s,null!==(t=this.params.width)&&void 0!==t?t:20):r&&(this.geometry=PS(this.points,r)),a.needsUpdate=!0,gS.needsUpdate=!0}}function ZS(e){const t=[];for(let n=0;n<e.length;n++)t.push(new Gn(e[n].x,e[n].z));return t.length>2?new Eh(new Qc(t)):new Hs}class NS extends xS{constructor(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"Polygon";const{yHeight:n,points:i,color:s=16777215,opacity:r=1,gradient:o}=e;super(ZS(i),function(e,t,n){return new ws({color:e,opacity:t,transparent:t<1,side:2,map:Qm(n)})}(s,r,o),e,t),this.points=i,this.position.set(0,n,0),this.rotation.set(Math.PI/2,0,0)}setOptions(e){const{color:t,opacity:n,yHeight:i,points:s,gradient:r}=e,o=this.material;t&&(o.color=new Fn(t)),n&&(o.opacity=n),i&&this.position.set(0,i,0),s&&(this.geometry=ZS(s)),r&&(o.map=Qm(r)),o.needsUpdate=!0,gS.needsUpdate=!0}}class VS extends SS{constructor(e){super(e,"Canvas3D"),this.create(e)}create(e){const{points:t=[],lines:n=[],polygons:i=[],circles:s=[]}=e;for(let e=0;e<t.length;e++)this.createPoint(t[e]);for(let e=0;e<n.length;e++)this.createLine(n[e]);for(let e=0;e<i.length;e++)this.createPolygon(i[e]);for(let e=0;e<s.length;e++)this.createCircle(s[e])}createPoint(e){const t=new _S(e);return this.add(t),gS.needsUpdate=!0,t}getPoint(e){return this.getChildForType("Point",e)}removePoint(e){const t=this.getPoint(e);t&&this.remove(t),gS.needsUpdate=!0}createLine(e){const t=new WS(e);return this.add(t),gS.needsUpdate=!0,t}getLine(e){return this.getChildForType("Line",e)}removeLine(e){const t=this.getLine(e);t&&this.remove(t),gS.needsUpdate=!0}createPolygon(e){const t=new NS(e);return this.add(t),gS.needsUpdate=!0,t}getPolygon(e){return this.getChildForType("Polygon",e)}removePolygon(e){const t=this.getPolygon(e);t&&this.remove(t),gS.needsUpdate=!0}createCircle(e){const t=new ES(e);return this.add(t),gS.needsUpdate=!0,t}getCircle(e){return this.getChildForType("Circle",e)}removeCircle(e){const t=this.getCircle(e);t&&this.remove(t),gS.needsUpdate=!0}getChildForType(e,t){for(let n=0;n<this.children.length;n++)if(this.children[n].stype===e&&this.children[n].sid===t)return this.children[n];return null}}class DS extends xS{constructor(e,t,n){super(e,t,n,"Ground")}}var BS=Object.freeze({__proto__:null,BaseObject3D:SS,BaseMesh:xS,Group:MS,PluginObject:TS,PoiNode:CS,Model:LS,Poi:AS,Icon:GS,Topology:zS,Point:_S,Line:WS,Polygon:NS,Circle:ES,Node:IS,Link:XS,Canvas3D:VS,Ground:DS});class HS{constructor(e,t,n){this.type=e,this.scene=n,this.viewport=t}createGroup(e,t){const n=new MS(e);return null!==t&&this.viewport.scener.addObject(n,null!=t?t:this.scene),n}clear(){this.getAll().forEach((e=>{this.viewport.scener.removeObject(e)}))}getAll(){const e=[];return this.scene.traverse((t=>{((t instanceof SS||t instanceof xS)&&rg(t)&&t.stype===this.type||rg(t)&&t.userData.stype===this.type)&&e.push(t)})),e}hideAll(){this.getAll().forEach((e=>{e.hide?e.hide():e.visible=!1})),this.viewport.signals.objectChanged.dispatch()}showAll(){this.getAll().forEach((e=>{e.show?e.show():e.visible=!0})),this.viewport.signals.objectChanged.dispatch()}}class kS extends HS{constructor(e,t){super("Light",e,t),class{static init(){const e=[1,0,0,2e-5,1,0,0,503905e-9,1,0,0,.00201562,1,0,0,.00453516,1,0,0,.00806253,1,0,0,.0125978,1,0,0,.018141,1,0,0,.0246924,1,0,0,.0322525,1,0,0,.0408213,1,0,0,.0503999,1,0,0,.0609894,1,0,0,.0725906,1,0,0,.0852058,1,0,0,.0988363,1,0,0,.113484,1,0,0,.129153,1,0,0,.145839,1,0,0,.163548,1,0,0,.182266,1,0,0,.201942,1,0,0,.222314,1,0,0,.241906,1,0,0,.262314,1,0,0,.285754,1,0,0,.310159,1,0,0,.335426,1,0,0,.361341,1,0,0,.387445,1,0,0,.412784,1,0,0,.438197,1,0,0,.466966,1,0,0,.49559,1,0,0,.523448,1,0,0,.549938,1,0,0,.57979,1,0,0,.608746,1,0,0,.636185,1,0,0,.664748,1,0,0,.69313,1,0,0,.71966,1,0,0,.747662,1,0,0,.774023,1,0,0,.799775,1,0,0,.825274,1,0,0,.849156,1,0,0,.873248,1,0,0,.89532,1,0,0,.917565,1,0,0,.937863,1,0,0,.958139,1,0,0,.976563,1,0,0,.994658,1,0,0,1.0112,1,0,0,1.02712,1,0,0,1.04189,1,0,0,1.05568,1,0,0,1.06877,1,0,0,1.08058,1,0,0,1.09194,1,0,0,1.10191,1,0,0,1.11161,1,0,0,1.1199,1,0,0,1.12813,.999547,-4.48815e-7,.0224417,199902e-10,.999495,-113079e-10,.0224406,503651e-9,.999496,-452317e-10,.0224406,.00201461,.999496,-101772e-9,.0224406,.00453287,.999495,-180928e-9,.0224406,.00805845,.999497,-282702e-9,.0224406,.0125914,.999496,-407096e-9,.0224406,.0181319,.999498,-554114e-9,.0224406,.02468,.999499,-723768e-9,.0224406,.0322363,.999495,-916058e-9,.0224405,.0408009,.999499,-.00113101,.0224408,.050375,.999494,-.00136863,.0224405,.0609586,.999489,-.00162896,.0224401,.0725537,.999489,-.00191201,.0224414,.0851619,.999498,-.00221787,.0224413,.0987867,.999492,-.00254642,.0224409,.113426,.999507,-.00289779,.0224417,.129088,.999494,-.0032716,.0224386,.145767,.999546,-.0036673,.0224424,.163472,.999543,-.00408166,.0224387,.182182,.999499,-.00450056,.0224338,.201843,.999503,-.00483661,.0224203,.222198,.999546,-.00452928,.022315,.241714,.999508,-.00587403,.0224329,.262184,.999509,-.00638806,.0224271,.285609,.999501,-.00691028,.0224166,.309998,.999539,-.00741979,.0223989,.335262,.999454,-.00786282,.0223675,.361154,.999529,-.00811928,.0222828,.387224,.999503,-.00799941,.0221063,.41252,.999561,-.00952753,.0223057,.438006,.999557,-.0099134,.0222065,.466735,.999541,-.0100935,.0220402,.495332,.999562,-.00996821,.0218067,.523197,.999556,-.0105031,.0217096,.550223,.999561,-.0114191,.0217215,.579498,.999588,-.0111818,.0213357,.608416,.999633,-.0107725,.0208689,.635965,.999527,-.0121671,.0210149,.664476,.999508,-.0116005,.020431,.692786,.999568,-.0115604,.0199791,.719709,.999671,-.0121117,.0197415,.74737,.999688,-.0110769,.0188846,.773692,.99962,-.0122368,.0188452,.799534,.999823,-.0110325,.0178001,.825046,.999599,-.0114923,.0174221,.849075,.999619,-.0105923,.0164345,.872999,.999613,-.0105988,.0158227,.895371,.99964,-.00979861,.0148131,.917364,.99977,-.00967238,.0140721,.938002,.999726,-.00869175,.0129543,.957917,.99973,-.00866872,.0122329,.976557,.999773,-.00731956,.0108958,.994459,.999811,-.00756027,.0102715,1.01118,.999862,-.00583732,.00878781,1.02701,.999835,-.00631438,.00827529,1.04186,.999871,-.00450785,.00674583,1.05569,.999867,-.00486079,.00621041,1.06861,.999939,-.00322072,.00478301,1.08064,.999918,-.00318199,.00406395,1.09181,1.00003,-.00193348,.00280682,1.10207,.999928,-.00153729,.00198741,1.11152,.999933,-623666e-9,917714e-9,1.12009,1,-102387e-11,9.07581e-7,1.12813,.997866,-8.96716e-7,.0448334,199584e-10,.997987,-225945e-10,.0448389,502891e-9,.997987,-903781e-10,.0448388,.00201156,.997985,-203351e-9,.0448388,.00452602,.997986,-361514e-9,.0448388,.00804629,.997987,-56487e-8,.0448389,.0125724,.997988,-813423e-9,.0448389,.0181045,.997984,-.00110718,.0448387,.0246427,.997985,-.00144616,.0448388,.0321875,.997987,-.00183038,.044839,.0407392,.997983,-.00225987,.0448387,.0502986,.997991,-.00273467,.0448389,.0608667,.997984,-.00325481,.0448384,.0724444,.998002,-.00382043,.044839,.0850348,.997997,-.00443145,.0448396,.0986372,.998007,-.00508796,.0448397,.113255,.998008,-.00578985,.04484,.128891,.998003,-.00653683,.0448384,.145548,.997983,-.00732713,.0448358,.163221,.997985,-.00815454,.0448358,.181899,.998005,-.00898985,.0448286,.201533,.998026,-.00964404,.0447934,.221821,.998055,-.00922677,.044611,.241282,.99804,-.0117361,.0448245,.261791,.998048,-.0127628,.0448159,.285181,.998088,-.0138055,.0447996,.30954,.998058,-.0148206,.0447669,.334751,.998099,-.0156998,.044697,.36061,.998116,-.0161976,.0445122,.386603,.998195,-.015945,.0441711,.411844,.998168,-.0183947,.0444255,.43773,.998184,-.0197913,.0443809,.466009,.998251,-.0201426,.0440689,.494574,.998305,-.0198847,.0435632,.522405,.998273,-.0210577,.043414,.549967,.998254,-.0227901,.0433943,.578655,.998349,-.0223108,.0426529,.60758,.99843,-.0223088,.042,.635524,.998373,-.0241141,.0418987,.663621,.998425,-.0231446,.0408118,.691906,.998504,-.0233684,.0400565,.719339,.998443,-.0241652,.0394634,.74643,.99848,-.0228715,.0380002,.773086,.998569,-.023519,.0372322,.798988,.998619,-.0223108,.0356468,.824249,.998594,-.0223105,.034523,.848808,.998622,-.0213426,.0328887,.87227,.998669,-.0207912,.0314374,.895157,.998705,-.0198416,.0296925,.916769,.998786,-.0189168,.0279634,.937773,.998888,-.0178811,.0261597,.957431,.99906,-.0166845,.0242159,.976495,.999038,-.0155464,.0222638,.994169,.999237,-.0141349,.0201967,1.01112,.999378,-.0129324,.0181744,1.02692,.999433,-.0113192,.0159898,1.04174,.999439,-.0101244,.0140385,1.05559,.999614,-.00837456,.0117826,1.06852,.999722,-.00721769,.00983745,1.08069,.999817,-.00554067,.00769002,1.09176,.99983,-.00426961,.005782,1.10211,.999964,-.00273904,.00374503,1.11152,1.00001,-.00136739,.00187176,1.12031,.999946,393227e-10,-28919e-9,1.12804,.995847,-13435e-10,.0671785,19916e-9,.995464,-338387e-10,.0671527,501622e-9,.99547,-135355e-9,.0671531,.00200649,.995471,-30455e-8,.0671532,.00451461,.99547,-541423e-9,.0671531,.008026,.995471,-84598e-8,.0671531,.0125407,.99547,-.00121823,.0671531,.0180589,.99547,-.00165817,.0671531,.0245806,.995463,-.00216583,.0671526,.0321062,.995468,-.00274127,.0671527,.0406366,.995474,-.00338447,.0671534,.0501717,.995473,-.00409554,.0671533,.0607131,.995478,-.00487451,.0671531,.0722618,.995476,-.00572148,.0671532,.0848191,.995477,-.00663658,.0671539,.0983882,.995498,-.00761986,.0671541,.112972,.995509,-.00867094,.0671542,.128568,.995509,-.00978951,.0671531,.145183,.995503,-.0109725,.0671491,.162808,.995501,-.012211,.0671465,.181441,.99553,-.0134565,.0671371,.201015,.99555,-.014391,.0670831,.221206,.99558,-.014351,.0668883,.240813,.995577,-.0173997,.0671055,.261257,.995602,-.0191111,.0671178,.284467,.995623,-.0206705,.0670946,.308765,.995658,-.022184,.0670472,.333905,.995705,-.0234832,.0669417,.359677,.995719,-.0241933,.0666714,.385554,.995786,-.0243539,.066266,.410951,.995887,-.0271866,.0664367,.437163,.995944,-.0296012,.0664931,.464842,.996004,-.0301045,.0660105,.49332,.996128,-.0298311,.0652694,.521131,.996253,-.0316426,.0650739,.549167,.996244,-.0339043,.0649433,.57737,.996309,-.033329,.0638926,.606073,.996417,-.0338935,.0630849,.634527,.996372,-.0353104,.0625083,.66256,.996542,-.0348942,.0611986,.690516,.996568,-.0351614,.060069,.718317,.996711,-.0354317,.0588522,.74528,.996671,-.0349513,.0571902,.772061,.996865,-.0345622,.0555321,.798089,.996802,-.0342566,.0537816,.823178,.996992,-.0330862,.0516095,.847949,.996944,-.0324666,.0495537,.871431,.997146,-.0309544,.0470302,.894357,.997189,-.0299372,.0446043,.916142,.997471,-.0281389,.0418812,.937193,.997515,-.0268702,.0391823,.957,.997812,-.0247166,.0361338,.975936,.998027,-.0233525,.0333945,.99391,.998233,-.0209839,.0301917,1.01075,.998481,-.0194309,.027271,1.02669,.998859,-.0169728,.0240162,1.04173,.99894,-.0152322,.0210517,1.05551,.999132,-.0127497,.0178632,1.06856,.999369,-.0108282,.014787,1.08054,.999549,-.00845886,.0116185,1.09185,.999805,-.0063937,.00867209,1.10207,.99985,-.00414582,.00566823,1.1117,.999912,-.00207443,.00277562,1.12022,1.00001,870226e-10,-53766e-9,1.12832,.991943,-178672e-11,.0893382,198384e-10,.991952,-450183e-10,.089339,499849e-9,.991956,-180074e-9,.0893394,.0019994,.991955,-405167e-9,.0893393,.00449867,.991953,-720298e-9,.0893391,.00799764,.991955,-.00112548,.0893393,.0124964,.991957,-.0016207,.0893395,.0179951,.991958,-.00220601,.0893396,.0244939,.991947,-.00288137,.0893385,.0319929,.991962,-.00364693,.0893399,.0404933,.991965,-.00450264,.0893399,.049995,.99198,-.00544862,.0893411,.0604995,.99197,-.00648491,.0893397,.0720074,.991976,-.00761164,.089341,.0845207,.99198,-.00882891,.0893405,.0980413,.991982,-.0101367,.0893396,.112571,.992008,-.011535,.0893415,.128115,.992026,-.0130228,.0893414,.144672,.992064,-.0145966,.0893418,.162241,.992041,-.0162421,.0893359,.180801,.992086,-.0178888,.0893214,.200302,.992157,-.0190368,.0892401,.220332,.992181,-.0195584,.0890525,.240144,.992175,-.0227257,.0892153,.260728,.99221,-.0254195,.089304,.283473,.99222,-.0274883,.0892703,.307673,.992317,-.0294905,.0892027,.332729,.992374,-.0311861,.0890577,.358387,.992505,-.0320656,.0886994,.384102,.992568,-.0329715,.0883198,.409767,.992675,-.036006,.0883602,.436145,.992746,-.0392897,.0884591,.463217,.992873,-.0399337,.0878287,.491557,.992934,-.040231,.0870108,.519516,.993091,-.0422013,.0865857,.547741,.993259,-.0443503,.0861937,.575792,.993455,-.0446368,.0851187,.604233,.993497,-.0454299,.0840576,.632925,.993694,-.0463296,.0829671,.660985,.993718,-.0470619,.0817185,.688714,.993973,-.0468838,.0800294,.716743,.994207,-.046705,.0781286,.74377,.994168,-.0469698,.0763337,.77042,.9945,-.0456816,.0738184,.796659,.994356,-.0455518,.0715545,.821868,.994747,-.0439488,.0686085,.846572,.994937,-.0430056,.065869,.870435,.995142,-.0413414,.0626446,.893272,.995451,-.0396521,.05929,.915376,.995445,-.0378453,.0558503,.936196,.995967,-.0355219,.0520949,.956376,.996094,-.0335146,.048377,.975327,.996622,-.030682,.0442575,.993471,.996938,-.0285504,.0404693,1.01052,.997383,-.0253399,.0360903,1.02637,.997714,-.0231651,.0322176,1.04139,.998249,-.0198138,.0278433,1.05542,.998596,-.0174337,.0238759,1.06846,.998946,-.0141349,.0195944,1.08056,.99928,-.0115603,.0156279,1.09181,.999507,-.00839065,.0114607,1.10213,.999697,-.005666,.00763325,1.11169,.999869,-.00269902,.00364946,1.12042,1.00001,623836e-10,-319288e-10,1.12832,.987221,-222675e-11,.111332,197456e-10,.98739,-561116e-10,.111351,497563e-9,.987448,-224453e-9,.111357,.00199031,.987441,-505019e-9,.111357,.0044782,.987442,-897816e-9,.111357,.00796129,.987442,-.00140284,.111357,.0124396,.987444,-.00202012,.111357,.0179132,.987442,-.00274964,.111357,.0243824,.987446,-.00359147,.111357,.0318474,.987435,-.00454562,.111356,.0403086,.987461,-.00561225,.111358,.0497678,.987458,-.00679125,.111358,.0602239,.987443,-.0080828,.111356,.0716792,.987476,-.0094872,.111358,.0841364,.98749,-.0110044,.111361,.097597,.987508,-.0126344,.111362,.112062,.987494,-.0143767,.111357,.127533,.987526,-.0162307,.111359,.144015,.987558,-.0181912,.111361,.161502,.987602,-.0202393,.111355,.179979,.987692,-.022273,.111346,.199386,.987702,-.0235306,.111215,.219183,.987789,-.0247628,.111061,.239202,.987776,-.0280668,.111171,.259957,.987856,-.0316751,.111327,.282198,.987912,-.0342468,.111282,.306294,.988,-.0367205,.111198,.331219,.988055,-.0387766,.110994,.356708,.988241,-.0397722,.110547,.382234,.988399,-.0416076,.110198,.408227,.988539,-.0448192,.110137,.434662,.988661,-.0483793,.110143,.461442,.988967,-.0495895,.109453,.489318,.989073,-.0506797,.108628,.517516,.989274,-.0526953,.108003,.545844,.989528,-.054578,.107255,.573823,.989709,-.0561503,.106294,.601944,.989991,-.056866,.104896,.630855,.990392,-.0572914,.103336,.658925,.990374,-.0586224,.10189,.686661,.990747,-.0584764,.099783,.714548,.991041,-.0582662,.0974309,.74186,.991236,-.0584118,.0951678,.768422,.991585,-.0573055,.0921581,.794817,.991984,-.0564241,.0891167,.820336,.9921,-.0553608,.085805,.84493,.992749,-.0533816,.0820354,.868961,.99288,-.0518661,.0782181,.891931,.993511,-.0492492,.0738935,.914186,.993617,-.0471956,.0696402,.93532,.99411,-.044216,.0649659,.95543,.994595,-.0416654,.0603177,.974685,.994976,-.0384314,.0553493,.992807,.995579,-.0353491,.0503942,1.00996,.996069,-.0319787,.0452123,1.02606,.996718,-.028472,.0400112,1.04114,.997173,-.0250789,.0349456,1.05517,.997818,-.0213326,.029653,1.0683,.998318,-.0178509,.024549,1.0805,.998853,-.0141118,.0194197,1.09177,.999218,-.0105914,.0143869,1.1022,.999594,-.00693474,.00943517,1.11175,.99975,-.00340478,.00464051,1.12056,1.00001,109172e-9,-112821e-9,1.12853,.983383,-266524e-11,.133358,196534e-10,.981942,-671009e-10,.133162,494804e-9,.981946,-268405e-9,.133163,.00197923,.981944,-603912e-9,.133163,.00445326,.981941,-.00107362,.133162,.00791693,.981946,-.00167755,.133163,.0123703,.981944,-.00241569,.133162,.0178135,.981945,-.00328807,.133163,.0242466,.981945,-.00429472,.133162,.03167,.981955,-.00543573,.133164,.0400846,.981951,-.00671105,.133163,.0494901,.981968,-.00812092,.133165,.0598886,.981979,-.00966541,.133166,.0712811,.981996,-.0113446,.133168,.083669,.982014,-.0131585,.133169,.0970533,.982011,-.0151073,.133167,.111438,.982062,-.0171906,.133172,.126826,.9821,-.0194067,.133175,.143215,.982149,-.0217502,.133176,.160609,.982163,-.0241945,.133173,.178981,.982247,-.0265907,.133148,.198249,.982291,-.027916,.132974,.217795,.982396,-.0299663,.132868,.238042,.982456,-.0334544,.132934,.258901,.982499,-.0378636,.133137,.280639,.982617,-.0409274,.133085,.304604,.98274,-.0438523,.132985,.329376,.982944,-.0462288,.132728,.354697,.98308,-.0475995,.132228,.380102,.983391,-.0501901,.131924,.406256,.983514,-.0535899,.131737,.432735,.98373,-.0571858,.131567,.459359,.984056,-.0592353,.130932,.486637,.984234,-.0610488,.130092,.51509,.984748,-.0630758,.12923,.543461,.985073,-.0647398,.128174,.571376,.985195,-.0671941,.127133,.599414,.985734,-.0681345,.125576,.628134,.986241,-.0686089,.123639,.656399,.986356,-.0698511,.121834,.684258,.986894,-.0700931,.119454,.711818,.987382,-.0698321,.116718,.739511,.988109,-.0693975,.113699,.766267,.988363,-.0689584,.110454,.792456,.989112,-.0672353,.106602,.81813,.989241,-.0662034,.10267,.842889,.990333,-.0638938,.0981381,.867204,.990591,-.0618534,.0935388,.89038,.991106,-.0593117,.088553,.912576,.991919,-.0562676,.0832187,.934118,.992111,-.0534085,.0778302,.954254,.992997,-.0495459,.0720453,.973722,.993317,-.0463707,.0663458,.991949,.994133,-.0421245,.0601883,1.00936,.994705,-.0384977,.0542501,1.02559,.995495,-.0340956,.0479862,1.04083,.996206,-.030105,.041887,1.05497,.996971,-.0256095,.0355355,1.06824,.997796,-.0213932,.0293655,1.08056,.998272,-.0169612,.0232926,1.09182,.998857,-.0126756,.0172786,1.10219,.99939,-.00832486,.0113156,1.11192,.999752,-.00410826,.00557892,1.12075,1,150957e-9,-119101e-9,1.12885,.975169,-309397e-11,.154669,195073e-10,.975439,-779608e-10,.154712,491534e-9,.975464,-311847e-9,.154716,.00196617,.975464,-701656e-9,.154716,.00442387,.975462,-.0012474,.154715,.0078647,.975461,-.00194906,.154715,.0122886,.975464,-.00280667,.154715,.0176959,.975468,-.00382025,.154716,.0240867,.975471,-.00498985,.154716,.0314612,.975472,-.00631541,.154717,.0398199,.975486,-.00779719,.154718,.0491639,.975489,-.00943505,.154718,.0594932,.975509,-.0112295,.154721,.0708113,.97554,-.0131802,.154724,.0831176,.975557,-.0152876,.154726,.096415,.975585,-.0175512,.154728,.110705,.975605,-.0199713,.154729,.125992,.975645,-.0225447,.154729,.142272,.975711,-.0252649,.154735,.159549,.975788,-.0280986,.154736,.177805,.975872,-.0308232,.154704,.196911,.975968,-.0324841,.154525,.216324,.976063,-.0351281,.154432,.236628,.976157,-.0388618,.15446,.257539,.976204,-.0437704,.154665,.278975,.976358,-.047514,.154652,.302606,.976571,-.0508638,.154535,.327204,.976725,-.0534995,.154221,.352276,.977013,-.0555547,.153737,.377696,.977294,-.0586728,.153403,.403855,.977602,-.0622715,.15312,.430333,.977932,-.0658166,.152755,.456855,.978241,-.0689877,.152233,.483668,.978602,-.0712805,.15132,.512097,.979234,-.0732775,.150235,.540455,.97977,-.075163,.148978,.568486,.979995,-.0778026,.147755,.596524,.98078,-.0791854,.146019,.624825,.981628,-.0799666,.143906,.653403,.982067,-.0808532,.141561,.681445,.98271,-.0816024,.139025,.708918,.983734,-.0812511,.135764,.736594,.98431,-.0806201,.132152,.763576,.985071,-.0801605,.12846,.789797,.98618,-.0784208,.124084,.815804,.986886,-.0766643,.1193,.840869,.987485,-.0747744,.114236,.864952,.988431,-.0716701,.108654,.888431,.988886,-.0691609,.102994,.910963,.990024,-.0654048,.0967278,.932629,.990401,-.0619765,.090384,.95313,.991093,-.0579296,.0837885,.972587,.992018,-.0536576,.0770171,.991184,.992536,-.0493719,.0701486,1.00863,.993421,-.0444813,.062953,1.02494,.993928,-.040008,.0560455,1.04017,.994994,-.0347982,.04856,1.05463,.995866,-.0301017,.0416152,1.06807,.996916,-.0248225,.0342597,1.08039,.997766,-.0199229,.0271668,1.09177,.998479,-.0147422,.0201387,1.10235,.99921,-.00980173,.0131944,1.11206,.999652,-.0047426,.00640712,1.12104,.999998,891673e-10,-10379e-8,1.12906,.967868,-351885e-11,.175947,193569e-10,.968001,-886733e-10,.175972,487782e-9,.96801,-354697e-9,.175973,.00195115,.968012,-798063e-9,.175974,.00439006,.968011,-.00141879,.175973,.00780461,.968011,-.00221686,.175973,.0121948,.968016,-.00319231,.175974,.0175607,.968019,-.00434515,.175974,.0239027,.968018,-.00567538,.175974,.0312208,.968033,-.00718308,.175977,.0395158,.968049,-.00886836,.175979,.0487885,.968047,-.0107312,.175978,.0590394,.968072,-.0127719,.175981,.0702705,.968108,-.0149905,.175986,.0824836,.968112,-.0173866,.175985,.0956783,.968173,-.0199611,.175993,.109862,.96827,-.0227128,.176008,.125033,.968292,-.025639,.17601,.141193,.968339,-.0287299,.176007,.158336,.968389,-.0319399,.176001,.176441,.968501,-.034941,.175962,.195359,.968646,-.0370812,.175793,.214686,.968789,-.0402329,.175708,.234973,.96886,-.0442601,.1757,.255871,.969013,-.049398,.175876,.277238,.969242,-.0539932,.17594,.300326,.969419,-.0577299,.175781,.324702,.969763,-.0605643,.175432,.349527,.970093,-.0634488,.174992,.374976,.970361,-.0670589,.174611,.401097,.970825,-.0708246,.174226,.427496,.971214,-.0742871,.173684,.453858,.971622,-.0782608,.173186,.480637,.972175,-.0813151,.172288,.508655,.972944,-.0832678,.170979,.536973,.973595,-.0855964,.169573,.565138,.974345,-.0882163,.168152,.593222,.975233,-.0901671,.166314,.621201,.976239,-.0912111,.163931,.649919,.977289,-.0916959,.161106,.678011,.978076,-.0927061,.158272,.705717,.979533,-.0925562,.15475,.733228,.980335,-.0918159,.150638,.760454,.981808,-.0908508,.146201,.786918,.983061,-.0896172,.141386,.812953,.984148,-.0871588,.135837,.838281,.985047,-.0850624,.130135,.862594,.986219,-.0818541,.123882,.88633,.987043,-.0784523,.117126,.908952,.988107,-.0749601,.110341,.930744,.988955,-.0703548,.102885,.951728,.989426,-.0662798,.0954167,.971166,.990421,-.0610834,.0876331,.989984,.991032,-.0562936,.0797785,1.00765,.992041,-.0508154,.0718166,1.02434,.992794,-.0454045,.0637125,1.03976,.993691,-.0398194,.0555338,1.05418,.994778,-.0341482,.0473388,1.06772,.995915,-.028428,.0391016,1.08028,.997109,-.022642,.0309953,1.09185,.998095,-.0168738,.0230288,1.10247,.998985,-.0111274,.0150722,1.11229,.999581,-.00543881,.00740605,1.12131,1.00003,162239e-9,-105549e-9,1.12946,.959505,-393734e-11,.196876,191893e-10,.959599,-992157e-10,.196895,483544e-9,.959641,-396868e-9,.196903,.0019342,.959599,-892948e-9,.196895,.00435193,.959603,-.00158747,.196896,.0077368,.959604,-.00248042,.196896,.0120888,.959605,-.00357184,.196896,.0174082,.959605,-.00486169,.196896,.0236949,.959613,-.00635008,.196897,.0309497,.959619,-.00803696,.196898,.0391725,.959636,-.00992255,.196901,.0483649,.959634,-.0120067,.1969,.0585266,.959675,-.0142898,.196906,.0696609,.959712,-.0167717,.196911,.0817678,.959752,-.0194524,.196918,.0948494,.959807,-.0223321,.196925,.10891,.959828,-.0254091,.196924,.123947,.959906,-.0286815,.196934,.139968,.960005,-.0321371,.196944,.156968,.960071,-.0357114,.196936,.17491,.960237,-.0389064,.196882,.193597,.960367,-.041623,.196731,.21285,.960562,-.0452655,.196654,.233075,.960735,-.0496207,.196643,.253941,.960913,-.0549379,.196774,.275278,.961121,-.0603414,.196893,.297733,.96139,-.0644244,.196717,.321877,.961818,-.067556,.196314,.346476,.962175,-.0712709,.195917,.371907,.96255,-.0752848,.1955,.397916,.963164,-.0792073,.195026,.424229,.963782,-.0828225,.194424,.450637,.964306,-.0873119,.193831,.477288,.964923,-.0911051,.192973,.504716,.966048,-.093251,.19151,.533053,.967024,-.0958983,.190013,.561366,.968038,-.09835,.188253,.589464,.969152,-.100754,.186257,.617433,.970557,-.102239,.183775,.645801,.972104,-.102767,.180645,.674278,.973203,-.103492,.177242,.702004,.975123,-.103793,.17345,.729529,.97641,-.102839,.168886,.756712,.978313,-.101687,.163892,.783801,.980036,-.100314,.158439,.809671,.981339,-.097836,.152211,.835402,.982794,-.0950006,.145679,.860081,.984123,-.0920994,.138949,.883757,.984918,-.0878641,.131283,.90685,.985999,-.083939,.123464,.928786,.987151,-.0791234,.115324,.94983,.987827,-.0739332,.106854,.96962,.988806,-.0688088,.0982691,.98861,.989588,-.0628962,.0893456,1.00667,.990438,-.0573146,.0805392,1.02344,.991506,-.0509433,.0713725,1.03933,.992492,-.0448724,.0623732,1.05378,.993663,-.0383497,.0530838,1.06747,.994956,-.0319593,.0439512,1.08007,.99634,-.025401,.0347803,1.09182,.99761,-.0189687,.0257954,1.1025,.99863,-.0124441,.0169893,1.11247,.99947,-.00614003,.00829498,1.12151,1.00008,216624e-9,-146107e-9,1.12993,.950129,-434955e-11,.217413,190081e-10,.950264,-10957e-8,.217444,47884e-8,.9503,-438299e-9,.217451,.00191543,.950246,-986124e-9,.21744,.00430951,.950246,-.00175311,.21744,.00766137,.950245,-.00273923,.21744,.011971,.950253,-.00394453,.217441,.0172385,.950258,-.00536897,.217442,.0234641,.950267,-.00701262,.217444,.030648,.950277,-.00887551,.217446,.038791,.950284,-.0109576,.217446,.0478931,.950312,-.0132591,.217451,.0579568,.950334,-.01578,.217454,.0689821,.950378,-.0185204,.217462,.0809714,.950417,-.0214803,.217467,.0939265,.950488,-.0246594,.217479,.10785,.950534,-.0280565,.217483,.122743,.950633,-.0316685,.217498,.138611,.950698,-.0354787,.217499,.155442,.950844,-.0394003,.217507,.173208,.950999,-.0426812,.217419,.191605,.951221,-.0461302,.217317,.21084,.951412,-.0502131,.217238,.230945,.951623,-.0549183,.21722,.251745,.951867,-.0604493,.217306,.273001,.952069,-.0665189,.217466,.294874,.952459,-.0709179,.217266,.318732,.952996,-.0746112,.216891,.34318,.953425,-.0789252,.216503,.36849,.953885,-.0833293,.216042,.394373,.954617,-.087371,.215469,.420505,.955429,-.0914054,.214802,.446907,.956068,-.0961671,.214146,.473522,.957094,-.10048,.213286,.50052,.958372,-.103248,.211796,.528715,.959654,-.106033,.21016,.557065,.961305,-.108384,.208149,.585286,.962785,-.111122,.206024,.613334,.964848,-.112981,.203442,.641334,.966498,-.113717,.19996,.669955,.968678,-.114121,.196105,.698094,.970489,-.114524,.191906,.725643,.972903,-.113792,.186963,.752856,.974701,-.112406,.181343,.780013,.976718,-.110685,.175185,.806268,.978905,-.108468,.168535,.832073,.980267,-.105061,.161106,.857149,.981967,-.101675,.153387,.881145,.983063,-.0974492,.145199,.904255,.984432,-.0925815,.136527,.926686,.985734,-.0877983,.127584,.947901,.986228,-.081884,.118125,.968111,.98719,-.0761208,.108594,.98719,.988228,-.0698196,.0989996,1.00559,.989046,-.0632739,.0890074,1.02246,.990242,-.056522,.0790832,1.03841,.991252,-.0495272,.0689182,1.05347,.992542,-.0425373,.0588592,1.06724,.994096,-.0353198,.0486833,1.08009,.995593,-.028235,.0385977,1.09177,.99711,-.0209511,.0286457,1.10274,.998263,-.0139289,.0188497,1.11262,.999254,-.0067359,.009208,1.12191,.999967,141846e-9,-657764e-10,1.13024,.935608,-474692e-11,.236466,187817e-10,.93996,-11971e-8,.237568,473646e-9,.939959,-478845e-9,.237567,.0018946,.939954,-.0010774,.237566,.00426284,.939956,-.00191538,.237566,.00757842,.939954,-.00299277,.237566,.0118413,.93996,-.00430961,.237567,.0170518,.939969,-.00586589,.237569,.02321,.939982,-.00766166,.237572,.0303164,.939987,-.00969686,.237572,.0383711,.939997,-.0119715,.237574,.0473751,.940031,-.0144858,.237581,.0573298,.940073,-.0172399,.237589,.0682366,.94012,-.0202335,.237598,.080097,.940162,-.0234663,.237604,.0929116,.940237,-.0269387,.237615,.106686,.940328,-.0306489,.237632,.121421,.940419,-.0345917,.237645,.137115,.940522,-.0387481,.237654,.153766,.940702,-.0429906,.237661,.17133,.940871,-.0465089,.237561,.189502,.941103,-.050531,.23748,.208616,.941369,-.0550657,.237423,.228595,.941641,-.0601337,.237399,.249287,.941903,-.0658804,.237443,.270467,.942224,-.0722674,.237597,.292024,.942633,-.0771788,.237419,.315272,.943172,-.0815623,.237068,.339579,.943691,-.0863973,.236682,.364717,.944382,-.0911536,.236213,.390435,.945392,-.0952967,.235562,.416425,.946185,-.0998948,.234832,.442772,.947212,-.104796,.234114,.469347,.948778,-.10928,.233222,.496162,.950149,-.113081,.231845,.523978,.951989,-.115893,.230005,.552295,.953921,-.11846,.227862,.580569,.955624,-.12115,.225439,.608698,.958234,-.123373,.222635,.636696,.960593,-.124519,.219093,.665208,.963201,-.124736,.214749,.693557,.965642,-.125012,.210059,.721334,.968765,-.124661,.204935,.748613,.971753,-.122996,.198661,.776224,.973751,-.120998,.191823,.802461,.976709,-.118583,.184359,.828399,.977956,-.115102,.176437,.853693,.979672,-.111077,.167681,.877962,.981816,-.10688,.158872,.901564,.98238,-.101469,.149398,.924057,.983964,-.0960013,.139436,.945751,.984933,-.0899626,.12943,.966272,.985694,-.0832973,.11894,.985741,.986822,-.0767082,.108349,1.00407,.987725,-.0693614,.0976026,1.02154,.98877,-.06211,.086652,1.03757,.990129,-.0544143,.0756182,1.05296,.991337,-.046744,.0645753,1.06683,.992978,-.0387931,.0534683,1.0798,.994676,-.030973,.0424137,1.09181,.99645,-.0230311,.0314035,1.10286,.997967,-.0152065,.0206869,1.11291,.99922,-.00744837,.010155,1.12237,1.00002,240209e-9,-752767e-10,1.13089,.922948,-515351e-11,.255626,186069e-10,.928785,-129623e-9,.257244,468009e-9,.928761,-51849e-8,.257237,.00187202,.928751,-.0011666,.257235,.00421204,.928751,-.00207395,.257234,.0074881,.928754,-.00324055,.257235,.0117002,.92876,-.00466639,.257236,.0168486,.928763,-.00635149,.257237,.0229334,.928774,-.00829584,.257239,.029955,.928791,-.0104995,.257243,.0379139,.928804,-.0129623,.257245,.0468108,.928847,-.0156846,.257255,.0566473,.92889,-.0186661,.257263,.0674246,.928924,-.0219067,.257268,.0791433,.928989,-.0254066,.257282,.0918076,.92909,-.0291651,.257301,.105419,.92918,-.0331801,.257316,.119978,.92929,-.0374469,.257332,.135491,.929453,-.041939,.257357,.151948,.929586,-.0464612,.257347,.169275,.929858,-.0503426,.257269,.187257,.930125,-.0548409,.257199,.206204,.930403,-.0598063,.257149,.22601,.930726,-.0652437,.257122,.246561,.931098,-.0712376,.257153,.267618,.931396,-.0777506,.257237,.288993,.931947,-.0832374,.257124,.311527,.932579,-.0883955,.25683,.335697,.933194,-.0937037,.256444,.360634,.934013,-.0987292,.255939,.386126,.935307,-.103215,.255282,.412018,.936374,-.108234,.254538,.438292,.93776,-.113234,.253728,.464805,.939599,-.118013,.25275,.491464,.941036,-.122661,.251404,.518751,.94337,-.125477,.249435,.547133,.945318,-.128374,.247113,.575456,.947995,-.130996,.244441,.60372,.950818,-.133438,.241352,.63174,.954378,-.135004,.237849,.659971,.957151,-.135313,.233188,.688478,.960743,-.13521,.228001,.716767,.964352,-.135007,.222249,.744349,.967273,-.133523,.21542,.771786,.969767,-.131155,.208039,.798639,.973195,-.128492,.200076,.824774,.975557,-.125094,.191451,.850222,.977692,-.120578,.18184,.874761,.98026,-.115882,.172102,.898497,.981394,-.110372,.161859,.921636,.982386,-.10415,.15108,.943467,.983783,-.0978128,.140407,.964045,.98422,-.0906171,.129058,.98398,.985447,-.0832921,.117614,1.00276,.986682,-.0754412,.10585,1.02047,.987326,-.0673885,.0940943,1.03678,.988707,-.0592565,.0822093,1.05218,.990185,-.050717,.070192,1.06652,.991866,-.0423486,.0582081,1.07965,.993897,-.0336118,.0460985,1.09188,.995841,-.0252178,.0342737,1.10307,.997605,-.0164893,.0224829,1.11324,.999037,-.00817112,.0110647,1.12262,1.00003,291686e-9,-168673e-9,1.13139,.915304,-552675e-11,.275999,183285e-10,.91668,-139285e-9,.276414,461914e-9,.916664,-55713e-8,.276409,.00184763,.916653,-.00125354,.276406,.00415715,.916651,-.00222851,.276405,.00739053,.916655,-.00348205,.276406,.0115478,.916653,-.00501414,.276405,.0166291,.916667,-.00682478,.276409,.0226346,.91668,-.00891398,.276412,.0295648,.91669,-.0112817,.276413,.0374199,.916727,-.013928,.276422,.0462016,.916759,-.0168528,.276429,.0559101,.916793,-.0200558,.276436,.0665466,.916849,-.0235373,.276448,.0781139,.916964,-.0272973,.276474,.0906156,.917047,-.0313344,.276491,.104051,.917152,-.0356465,.276511,.118424,.917286,-.0402271,.276533,.133736,.917469,-.0450408,.276564,.149978,.917686,-.0497872,.276563,.167057,.917953,-.0540937,.276493,.184846,.918228,-.0590709,.276437,.203614,.918572,-.0644277,.276398,.223212,.918918,-.0702326,.276362,.243584,.919356,-.076484,.276383,.264465,.919842,-.0830808,.276434,.285701,.920451,-.0892972,.276407,.307559,.921113,-.095016,.276128,.331501,.921881,-.100771,.275754,.356207,.923027,-.106029,.275254,.381477,.924364,-.111029,.274595,.40722,.925818,-.116345,.273841,.433385,.92746,-.121424,.272913,.459848,.929167,-.12657,.271837,.486493,.931426,-.131581,.270575,.513432,.934001,-.135038,.268512,.541502,.936296,-.138039,.266135,.569658,.939985,-.140687,.263271,.598375,.943516,-.143247,.260058,.626563,.94782,-.145135,.256138,.654711,.951023,-.145733,.251154,.683285,.955338,-.145554,.245562,.711831,.959629,-.145008,.239265,.739573,.963123,-.144003,.232064,.767027,.966742,-.141289,.224036,.794359,.969991,-.138247,.215305,.820361,.973403,-.134786,.206051,.846548,.975317,-.129966,.195914,.871541,.977647,-.12471,.185184,.895313,.980137,-.119086,.174161,.918398,.981031,-.112297,.162792,.940679,.982037,-.105372,.150952,.961991,.983164,-.097821,.138921,.981913,.983757,-.0897245,.126611,1.00109,.985036,-.0815974,.114228,1.01902,.986289,-.0727725,.101389,1.03604,.987329,-.0639323,.0886476,1.05149,.989193,-.0548109,.0756837,1.06619,.990716,-.045687,.0627581,1.07948,.992769,-.0364315,.0498337,1.09172,.99524,-.0271761,.0370305,1.1033,.997154,-.0179609,.0243959,1.11353,.998845,-.00878063,.0119567,1.12319,1.00002,259038e-9,-108146e-9,1.13177,.903945,-591681e-11,.295126,181226e-10,.903668,-148672e-9,.295037,455367e-9,.903677,-594683e-9,.29504,.00182145,.903673,-.00133805,.295039,.00409831,.903666,-.00237872,.295036,.00728584,.903668,-.00371676,.295037,.0113842,.903679,-.00535212,.29504,.0163936,.903684,-.00728479,.295041,.0223141,.903698,-.00951473,.295044,.0291462,.903718,-.0120419,.295049,.0368904,.903754,-.0148664,.295058,.0455477,.903801,-.017988,.29507,.0551194,.903851,-.0214064,.295082,.0656058,.903921,-.0251219,.295097,.0770109,.904002,-.0291337,.295116,.0893354,.904111,-.033441,.29514,.102583,.904246,-.0380415,.295169,.116755,.904408,-.0429258,.295202,.131853,.904637,-.0480468,.295245,.147869,.904821,-.0529208,.295214,.164658,.905163,-.0577748,.295185,.182274,.905469,-.0631763,.295143,.200828,.905851,-.068917,.295112,.2202,.906322,-.0750861,.295104,.240372,.906761,-.0815855,.295086,.261082,.90735,-.0882138,.295095,.282123,.908087,-.095082,.295139,.303563,.908826,-.101488,.29492,.327028,.909832,-.107577,.294577,.351464,.911393,-.113033,.294115,.376497,.912804,-.118629,.293446,.402115,.914081,-.124232,.292581,.428111,.91637,-.129399,.29166,.454442,.91814,-.134892,.290422,.481024,.921179,-.140069,.289194,.507924,.924544,-.144431,.287421,.535557,.927995,-.147498,.284867,.563984,.931556,-.150197,.281722,.5923,.935777,-.152711,.278207,.620832,.940869,-.154836,.274148,.649069,.945994,-.155912,.269057,.677746,.949634,-.155641,.262799,.706293,.955032,-.154809,.256097,.734278,.95917,-.153678,.248618,.761751,.962931,-.151253,.239794,.789032,.966045,-.147625,.230281,.815422,.96971,-.143964,.220382,.841787,.972747,-.139464,.209846,.867446,.975545,-.133459,.198189,.892004,.978381,-.127424,.186362,.915458,.979935,-.120506,.173964,.937948,.980948,-.11282,.161429,.959732,.982234,-.104941,.148557,.980118,.982767,-.0962905,.135508,.999463,.983544,-.0873625,.122338,1.01756,.984965,-.0783447,.108669,1.03492,.986233,-.0684798,.0949911,1.05087,.987796,-.0590867,.0811386,1.0656,.989885,-.0489145,.0673099,1.0794,.991821,-.0391,.0535665,1.09174,.99448,-.029087,.0397529,1.10341,.996769,-.019114,.0261463,1.11383,.998641,-.00947007,.0128731,1.1237,.999978,446316e-9,-169093e-9,1.13253,.888362,-627064e-11,.312578,178215e-10,.889988,-157791e-9,.313148,448451e-9,.889825,-631076e-9,.313092,.00179356,.88984,-.00141994,.313097,.00403554,.889828,-.0025243,.313092,.00717429,.889831,-.00394421,.313093,.0112099,.889831,-.00567962,.313093,.0161425,.889844,-.00773051,.313096,.0219724,.889858,-.0100968,.3131,.0286999,.889882,-.0127786,.313106,.0363256,.889918,-.0157757,.313116,.0448509,.889967,-.0190878,.313129,.0542758,.89003,-.022715,.313145,.0646032,.890108,-.0266566,.313165,.0758339,.890218,-.0309131,.313193,.0879729,.890351,-.0354819,.313226,.101019,.89051,-.0403613,.313263,.114979,.890672,-.0455385,.313294,.129848,.890882,-.0509444,.313333,.145616,.891189,-.0559657,.313324,.162122,.891457,-.0613123,.313281,.179524,.891856,-.0671488,.313281,.197855,.892312,-.0732732,.313268,.216991,.892819,-.0797865,.313263,.236924,.893369,-.0865269,.313247,.257433,.894045,-.0931592,.313205,.278215,.894884,-.100532,.313276,.299467,.895832,-.107716,.313205,.322276,.897043,-.114099,.312873,.34642,.898515,-.119941,.312331,.371187,.900191,-.126044,.311731,.396656,.90188,-.131808,.310859,.422488,.904359,-.137289,.309857,.448744,.906923,-.142991,.308714,.475239,.910634,-.148253,.307465,.501983,.914502,-.153332,.305774,.529254,.919046,-.156646,.303156,.557709,.923194,-.159612,.299928,.586267,.928858,-.162027,.296245,.614925,.934464,-.164203,.291832,.643187,.939824,-.165602,.286565,.671601,.944582,-.165383,.280073,.700213,.949257,-.164439,.272891,.728432,.954389,-.162953,.264771,.756082,.958595,-.161007,.255927,.78369,.962138,-.157243,.245769,.810769,.966979,-.152872,.235127,.836999,.969566,-.148209,.22347,.862684,.972372,-.142211,.211147,.887847,.975916,-.135458,.198606,.911843,.978026,-.128398,.185498,.934795,.979686,-.120313,.17171,.956787,.980748,-.11166,.158159,.978046,.981622,-.103035,.144399,.997693,.982356,-.0930328,.13001,1.01642,.983308,-.0834627,.115778,1.03366,.985037,-.0732249,.101327,1.05014,.986493,-.0628145,.086554,1.06507,.988484,-.0526556,.0720413,1.07907,.991051,-.0415744,.0571151,1.09189,.993523,-.0314275,.0426643,1.10369,.99628,-.0203603,.0279325,1.11423,.998344,-.0102446,.0138182,1.12421,.999997,42612e-8,-193628e-9,1.1333,.871555,-660007e-11,.329176,174749e-10,.875255,-166579e-9,.330571,441051e-9,.875644,-666394e-9,.330718,.00176441,.875159,-.00149903,.330536,.00396899,.87516,-.00266493,.330536,.007056,.875158,-.00416393,.330535,.0110251,.87516,-.00599598,.330535,.0158764,.875163,-.00816108,.330536,.0216101,.875174,-.0106591,.330538,.0282266,.875199,-.0134899,.330545,.0357266,.875257,-.0166538,.330563,.0441117,.875304,-.0201501,.330575,.0533821,.875373,-.0239785,.330595,.0635395,.875464,-.0281389,.330619,.0745872,.875565,-.0326301,.330645,.0865255,.875691,-.0374516,.330676,.0993599,.875897,-.0425993,.330733,.113093,.876091,-.0480576,.330776,.127722,.876353,-.0537216,.330826,.143227,.876649,-.0589807,.330809,.159462,.877034,-.0647865,.330819,.176642,.877443,-.0709789,.330817,.194702,.877956,-.0774782,.330832,.213577,.878499,-.0843175,.330822,.233246,.879144,-.0912714,.330804,.253512,.879982,-.0980824,.330766,.274137,.88097,-.105823,.330864,.295209,.882051,-.113671,.330896,.317226,.883397,-.120303,.330545,.341068,.884987,-.12667,.330068,.365613,.886789,-.133118,.329418,.390807,.889311,-.139024,.328683,.416494,.891995,-.144971,.327729,.442618,.895106,-.150747,.326521,.469131,.899527,-.156283,.325229,.495921,.90504,-.161707,.32378,.523162,.909875,-.165661,.32122,.55092,.91561,-.168755,.317942,.579928,.921225,-.171193,.313983,.608539,.927308,-.17319,.309636,.636854,.933077,-.174819,.304262,.66523,.938766,-.175002,.297563,.693609,.943667,-.173946,.289613,.722157,.949033,-.172221,.281227,.750021,.953765,-.169869,.271545,.777466,.95804,-.166578,.261034,.804853,.962302,-.161761,.249434,.831569,.966544,-.156636,.237484,.857779,.969372,-.150784,.224395,.883051,.972486,-.143672,.210786,.907864,.975853,-.135772,.196556,.931223,.977975,-.127942,.182307,.954061,.979122,-.118347,.167607,.97531,.980719,-.109112,.152739,.995666,.981223,-.0991789,.137932,1.01475,.98216,-.0883553,.122692,1.03253,.983379,-.0780825,.107493,1.04917,.985434,-.0665646,.0917791,1.06464,.987332,-.0557714,.0764949,1.07896,.990004,-.0442805,.060721,1.09199,.992975,-.0331676,.0452284,1.10393,.995811,-.0219547,.0297934,1.11476,.9982,-.0107613,.0146415,1.12484,1.00002,248678e-9,-14555e-8,1.13413,.859519,-693595e-11,.347264,171673e-10,.859843,-17503e-8,.347394,433219e-9,.859656,-700076e-9,.347319,.00173277,.859671,-.00157517,.347325,.00389875,.859669,-.00280028,.347324,.00693112,.85967,-.0043754,.347324,.01083,.859665,-.00630049,.347321,.0155954,.859685,-.0085755,.347328,.0212278,.859694,-.0112003,.347329,.0277273,.859718,-.0141747,.347336,.0350946,.85976,-.0174988,.347348,.0433314,.85982,-.0211722,.347366,.0524384,.859892,-.0251941,.347387,.0624168,.860006,-.0295649,.347422,.0732708,.860122,-.0342825,.347453,.0849999,.860282,-.0393462,.347499,.0976102,.860482,-.0447513,.347554,.111104,.860719,-.0504775,.347614,.125479,.860998,-.0563577,.347666,.140703,.861322,-.0619473,.347662,.156681,.861724,-.0681277,.347684,.173597,.862198,-.0746567,.347709,.191371,.862733,-.0815234,.347727,.209976,.863371,-.0886643,.347744,.229351,.86414,-.0957908,.347734,.24934,.865138,-.102912,.34772,.269797,.866182,-.110924,.3478,.290654,.867436,-.119223,.347911,.312074,.869087,-.126197,.347649,.335438,.870859,-.133145,.347222,.359732,.872997,-.139869,.346645,.38467,.875939,-.146089,.345935,.41019,.879012,-.152334,.345012,.436218,.883353,-.15821,.343924,.462641,.888362,-.164097,.342636,.489449,.895026,-.169528,.341351,.516629,.900753,-.174408,.339115,.544109,.906814,-.17751,.335809,.572857,.912855,-.180101,.331597,.601554,.919438,-.182116,.32698,.630198,.925962,-.183494,.321449,.658404,.931734,-.184159,.314595,.686625,.93762,-.18304,.306462,.71531,.943858,-.181323,.297514,.744272,.948662,-.178683,.287447,.771462,.953299,-.175379,.276166,.798593,.957346,-.170395,.263758,.8256,.962565,-.165042,.251019,.852575,.966075,-.158655,.237011,.878316,.969048,-.151707,.222518,.90329,.972423,-.143271,.207848,.927745,.975833,-.134824,.192463,.950859,.977629,-.125444,.1768,.972947,.978995,-.114949,.161033,.993263,.980533,-.104936,.145523,1.01337,.980745,-.0935577,.129799,1.03128,.981814,-.0822956,.113486,1.04825,.983943,-.0710082,.0972925,1.06405,.986141,-.0587931,.0808138,1.0785,.988878,-.0472755,.0644915,1.09204,.992132,-.0349128,.0478128,1.10413,.9953,-.0232407,.031621,1.11527,.998117,-.0112713,.0154935,1.12551,1.00003,339743e-9,-195763e-9,1.13504,.845441,-729126e-11,.364305,169208e-10,.843588,-183164e-9,.363506,425067e-9,.843412,-73253e-8,.36343,.00169999,.843401,-.00164818,.363426,.00382495,.843399,-.00293008,.363425,.00679993,.843401,-.00457822,.363425,.010625,.843394,-.00659249,.363421,.0153002,.843398,-.00897282,.363421,.0208258,.843415,-.0117191,.363426,.0272024,.843438,-.0148312,.363432,.0344305,.843483,-.018309,.363447,.0425116,.84356,-.0221521,.363472,.0514471,.843646,-.0263597,.363499,.061238,.843743,-.0309315,.363527,.0718873,.84388,-.0358658,.363569,.0833969,.844079,-.0411624,.363631,.0957742,.844279,-.0468128,.363688,.109015,.844549,-.0527923,.363761,.123124,.844858,-.0588204,.363817,.138044,.84522,-.0647573,.36383,.153755,.845669,-.0713181,.363879,.170394,.846155,-.0781697,.363908,.187861,.846789,-.0853913,.363969,.206176,.847502,-.0928086,.363999,.225244,.8484,-.10005,.363997,.244926,.849461,-.107615,.364008,.265188,.850562,-.115814,.364055,.28587,.851962,-.124334,.364179,.306926,.854326,-.131995,.364233,.329605,.856295,-.139338,.363856,.35359,.858857,-.146346,.363347,.37831,.862428,-.152994,.362807,.403722,.866203,-.159463,.361963,.429537,.871629,-.165623,.36112,.456,.877365,-.171649,.359917,.482773,.883744,-.177151,.35848,.509705,.890693,-.182381,.356523,.537215,.897278,-.186076,.3533,.565493,.903958,-.188602,.349095,.594293,.910908,-.190755,.344215,.623165,.918117,-.192063,.338606,.651573,.924644,-.192758,.331544,.679869,.931054,-.192238,.323163,.708668,.937303,-.190035,.313529,.737201,.943387,-.187162,.303152,.764977,.948494,-.183876,.29146,.792683,.952546,-.178901,.277917,.819228,.958077,-.173173,.264753,.846559,.962462,-.16645,.25002,.872962,.966569,-.159452,.234873,.898729,.969108,-.15074,.218752,.923126,.973072,-.141523,.202673,.947278,.975452,-.132075,.186326,.969938,.977784,-.121257,.169396,.991325,.97899,-.110182,.153044,1.01123,.979777,-.0989634,.136485,1.0299,.980865,-.0865894,.119343,1.04727,.982432,-.0746115,.102452,1.06341,.984935,-.0621822,.0852423,1.07834,.987776,-.0495694,.0678546,1.092,.99103,-.0372386,.0506917,1.1043,.99474,-.0244353,.0333316,1.11576,.997768,-.0121448,.0164348,1.12617,1.00003,31774e-8,-169504e-9,1.13598,.825551,-756799e-11,.378425,165099e-10,.82664,-190922e-9,.378923,416504e-9,.826323,-763495e-9,.378779,.0016656,.826359,-.00171789,.378795,.00374768,.82636,-.00305402,.378795,.00666259,.826368,-.00477185,.378798,.0104104,.826364,-.00687131,.378795,.0149912,.826368,-.00935232,.378795,.0204054,.826376,-.0122146,.378797,.0266532,.826399,-.0154581,.378803,.0337355,.82646,-.0190825,.378824,.0416537,.826525,-.0230873,.378846,.0504091,.826614,-.0274719,.378876,.0600032,.82674,-.0322355,.378917,.0704393,.826888,-.0373766,.378964,.0817195,.827078,-.0428936,.379024,.0938492,.827318,-.0487778,.379099,.106828,.82764,-.0549935,.379199,.120659,.827926,-.0611058,.379227,.13526,.828325,-.0675054,.379275,.150713,.828801,-.0743455,.379332,.167034,.8294,-.0815523,.379415,.184209,.830094,-.0890779,.379495,.202203,.8309,-.096736,.379555,.220945,.831943,-.104135,.379577,.240306,.833037,-.112106,.379604,.260317,.834278,-.120554,.379668,.2808,.836192,-.129128,.3799,.301654,.838671,-.137541,.380109,.323502,.840939,-.14523,.379809,.347176,.844575,-.15248,.379593,.371706,.848379,-.159607,.37909,.39688,.853616,-.166267,.378617,.422702,.858921,-.172698,.377746,.448919,.865324,-.178823,.376749,.475661,.872207,-.184542,.375363,.502599,.880018,-.189836,.373657,.529914,.88694,-.194294,.370673,.557683,.894779,-.197022,.36662,.586848,.902242,-.199108,.36138,.615831,.909914,-.200398,.355434,.644478,.917088,-.20094,.348173,.672905,.923888,-.200671,.339482,.701327,.930495,-.198773,.32956,.730101,.937247,-.195394,.318363,.758383,.943108,-.191956,.306323,.786539,.948296,-.187227,.292576,.813637,.953472,-.181165,.278234,.840793,.958485,-.174119,.263054,.867712,.962714,-.166564,.246756,.893635,.966185,-.158181,.229945,.919028,.970146,-.148275,.212633,.943413,.973491,-.138157,.195229,.966627,.975741,-.127574,.178048,.988817,.977238,-.11554,.160312,1.00924,.978411,-.10364,.142857,1.02845,.979811,-.0913122,.125317,1.04648,.98116,-.0782558,.107627,1.06284,.983543,-.0655957,.0895862,1.07798,.986789,-.0520411,.0713756,1.092,.990292,-.0389727,.053228,1.10484,.994187,-.025808,.0351945,1.11642,.997499,-.0126071,.0173198,1.12703,.999999,275604e-9,-148602e-9,1.13674,.81075,-78735e-10,.394456,161829e-10,.808692,-198293e-9,.393453,407564e-9,.80846,-792877e-9,.39334,.00162965,.808595,-.00178416,.393407,.00366711,.808597,-.00317182,.393408,.00651934,.808598,-.00495589,.393408,.0101866,.808591,-.00713627,.393403,.0146689,.808592,-.00971285,.393402,.0199667,.80861,-.0126855,.393407,.0260803,.808633,-.0160538,.393413,.0330107,.80868,-.0198175,.393429,.0407589,.808748,-.0239758,.393453,.0493264,.808854,-.0285286,.39349,.0587161,.808992,-.0334748,.39354,.0689304,.809141,-.0388116,.393588,.0799707,.809352,-.0445375,.39366,.0918432,.809608,-.0506427,.393742,.104549,.809915,-.0570708,.393834,.118085,.810253,-.0633526,.393885,.132377,.810687,-.0700966,.393953,.147537,.811233,-.0772274,.394047,.163543,.811865,-.0847629,.394148,.180394,.812648,-.0925663,.394265,.198051,.813583,-.100416,.394363,.216443,.814683,-.108119,.394402,.235502,.815948,-.11644,.394489,.255242,.817278,-.125036,.394542,.275441,.819605,-.133655,.39486,.296094,.822256,-.142682,.395248,.317309,.825349,-.150756,.395241,.340516,.829605,-.158392,.395285,.364819,.83391,-.165801,.394922,.389736,.839808,-.172677,.394691,.415409,.845708,-.179448,.394006,.441546,.853025,-.185746,.393279,.46832,.859666,-.191684,.391655,.495302,.86789,-.197146,.390068,.52262,.875845,-.201904,.38727,.550336,.882634,-.205023,.382688,.578825,.891076,-.207098,.377543,.608103,.900589,-.208474,.371752,.63723,.90791,-.209068,.364016,.665769,.915971,-.208655,.355593,.694428,.923455,-.20729,.345439,.723224,.931514,-.203821,.334099,.751925,.937885,-.19986,.321069,.780249,.943136,-.194993,.306571,.8077,.948818,-.189132,.291556,.83497,.954433,-.181617,.275745,.86188,.959078,-.173595,.258695,.888562,.962705,-.164855,.240825,.914008,.966753,-.155129,.22268,.939145,.970704,-.144241,.204542,.963393,.973367,-.133188,.185927,.985983,.975984,-.121146,.167743,1.00704,.976994,-.108366,.149218,1.02715,.978485,-.0956746,.13131,1.0455,.980074,-.0820733,.112513,1.06221,.98225,-.0684061,.0938323,1.07782,.98553,-.0549503,.0749508,1.09199,.989529,-.0407857,.055848,1.10508,.993536,-.0271978,.0368581,1.11684,.997247,-.0132716,.0181845,1.12789,1,431817e-9,-198809e-9,1.13792,.785886,-812608e-11,.405036,157669e-10,.790388,-205278e-9,.407355,398297e-9,.790145,-820824e-9,.407231,.00159263,.790135,-.00184681,.407226,.00358336,.790119,-.00328316,.407218,.00637039,.790126,-.00512988,.40722,.0099539,.79013,-.00738684,.407221,.0143339,.790135,-.0100538,.407221,.0195107,.790134,-.0131306,.407217,.0254848,.79016,-.0166169,.407224,.0322572,.790197,-.020512,.407236,.0398284,.790273,-.0248157,.407263,.0482014,.790381,-.029527,.407304,.0573777,.790521,-.0346446,.407355,.0673602,.790704,-.0401665,.40742,.0781522,.790925,-.0460896,.407499,.0897582,.791195,-.0524017,.407589,.10218,.791522,-.0590121,.407691,.11541,.791878,-.0654876,.407748,.12939,.792361,-.0725207,.407849,.144237,.792942,-.0799844,.407963,.159924,.79362,-.0877896,.408087,.176425,.794529,-.0958451,.408259,.193733,.795521,-.103827,.408362,.211756,.796778,-.111937,.408482,.230524,.798027,-.120521,.408547,.249967,.799813,-.129242,.408721,.269926,.802387,-.138048,.409148,.290338,.805279,-.147301,.409641,.311193,.809251,-.155895,.410154,.333611,.813733,-.163942,.410297,.357615,.819081,-.171666,.410373,.382339,.825427,-.178905,.410348,.407828,.83172,-.185812,.409486,.434034,.83877,-.192318,.408776,.460493,.845817,-.198249,.407176,.487346,.854664,-.204034,.405719,.514832,.863495,-.208908,.403282,.542401,.871883,-.212765,.399293,.570683,.88065,-.214911,.393803,.599947,.89004,-.216214,.387536,.62932,.898476,-.216745,.379846,.658319,.906738,-.216387,.370625,.687138,.914844,-.215053,.360139,.71601,.923877,-.212007,.348849,.745124,.931925,-.207481,.335639,.773366,.938054,-.202418,.320798,.801636,.943895,-.196507,.304772,.829055,.949468,-.189009,.288033,.856097,.955152,-.180539,.270532,.88301,.959403,-.171437,.251639,.909296,.963309,-.161661,.232563,.934868,.967399,-.150425,.213231,.959662,.972009,-.138659,.194247,.98302,.97433,-.126595,.174718,1.00517,.975823,-.113205,.155518,1.02566,.976371,-.0996096,.136709,1.04418,.978705,-.0860754,.117571,1.06146,.981477,-.0714438,.0980046,1.07777,.984263,-.0572304,.0782181,1.09214,.988423,-.0428875,.0584052,1.10553,.993,-.0282442,.038522,1.11758,.99704,-.0140183,.0190148,1.12864,.999913,369494e-9,-145203e-9,1.13901,.777662,-84153e-10,.423844,154403e-10,.770458,-211714e-9,.419915,38845e-8,.770716,-846888e-9,.420055,.00155386,.770982,-.00190567,.420202,.00349653,.770981,-.00338782,.420201,.00621606,.77098,-.00529338,.4202,.00971274,.770983,-.00762223,.4202,.0139867,.770985,-.0103741,.420198,.0190381,.770996,-.0135489,.4202,.0248677,.771029,-.0171461,.420212,.0314764,.771052,-.0211647,.420215,.0388648,.771131,-.0256048,.420245,.047036,.771235,-.0304647,.420284,.0559911,.771383,-.0357436,.420341,.0657346,.771591,-.0414392,.420423,.0762694,.771819,-.0475462,.420506,.0875984,.772123,-.0540506,.420617,.099727,.772464,-.060797,.42072,.112637,.772855,-.0675393,.420799,.126313,.773317,-.0748323,.420893,.140824,.773981,-.0825681,.421058,.15617,.774746,-.0906307,.421226,.172322,.77566,-.0988982,.421397,.189253,.776837,-.106994,.421569,.206912,.778097,-.115528,.421704,.225359,.779588,-.124317,.421849,.24447,.781574,-.133139,.422097,.264156,.784451,-.142179,.422615,.284318,.787682,-.15165,.423269,.304902,.792433,-.160771,.424396,.3265,.797359,-.169166,.424772,.35014,.803986,-.177149,.425475,.374768,.809504,-.184745,.424996,.399928,.815885,-.19173,.424247,.425796,.823513,-.198525,.423515,.452287,.832549,-.204709,.422787,.479321,.841653,-.210447,.421187,.506718,.850401,-.215501,.418519,.53432,.859854,-.219752,.414715,.56242,.869364,-.222305,.409462,.591558,.878837,-.223744,.402926,.621074,.888636,-.224065,.395043,.650538,.898132,-.223742,.38564,.679538,.907181,-.222308,.375378,.708674,.915621,-.219837,.363212,.737714,.9239,-.215233,.349313,.767014,.931644,-.209592,.334162,.795133,.938887,-.203644,.317943,.823228,.945282,-.196349,.300581,.850822,.950758,-.18742,.282195,.877594,.956146,-.177879,.262481,.904564,.960355,-.167643,.242487,.930741,.965256,-.156671,.222668,.955868,.968029,-.144123,.201907,.979869,.97251,-.131305,.18202,1.00291,.974925,-.118335,.161909,1.02392,.975402,-.103714,.142129,1.0433,.976987,-.089415,.122447,1.06089,.979677,-.0748858,.102248,1.07713,.983184,-.0596086,.0814851,1.09218,.987466,-.0447671,.0609484,1.10585,.992348,-.0295217,.0401835,1.11829,.996674,-.0143917,.0198163,1.12966,1.00003,321364e-9,-149983e-9,1.1402,.757901,-869074e-11,.436176,151011e-10,.751195,-217848e-9,.432317,378533e-9,.751178,-871373e-9,.432307,.0015141,.751195,-.00196061,.432317,.0034068,.751198,-.00348552,.432318,.00605659,.751195,-.00544599,.432315,.00946353,.751207,-.00784203,.43232,.013628,.751213,-.0106732,.43232,.0185499,.751221,-.0139393,.432319,.0242302,.751244,-.0176398,.432325,.0306694,.7513,-.0217743,.432348,.0378698,.751358,-.0263412,.432367,.0458321,.751458,-.0313396,.432404,.0545587,.751608,-.0367682,.432464,.0640543,.7518,-.0426246,.43254,.0743222,.752065,-.0489031,.432645,.0853668,.752376,-.0555828,.432762,.0971911,.752715,-.0623861,.432859,.109768,.753137,-.069415,.432958,.123126,.753676,-.0770039,.433099,.137308,.754345,-.084971,.433272,.15229,.755235,-.0932681,.433504,.168075,.756186,-.10171,.433693,.184625,.757363,-.110019,.433857,.201897,.75884,-.11887,.434102,.220014,.760467,-.127881,.434306,.238778,.762969,-.136766,.434751,.258172,.765823,-.14612,.43529,.278062,.769676,-.15566,.436236,.298437,.774909,-.165177,.437754,.319532,.77994,-.17402,.438343,.342505,.785757,-.182201,.438609,.366693,.792487,-.190104,.438762,.391668,.80038,-.197438,.438795,.417494,.808494,-.204365,.438226,.443933,.817695,-.210714,.437283,.470929,.828111,-.216651,.436087,.498569,.837901,-.221804,.433717,.526165,.847813,-.226318,.430133,.554155,.858314,-.229297,.425213,.582822,.868891,-.230999,.418576,.612847,.878941,-.231155,.410405,.642445,.888809,-.230935,.400544,.672024,.898089,-.229343,.389613,.701366,.908081,-.226886,.377197,.730763,.916819,-.222676,.363397,.759642,.924968,-.216835,.347437,.788775,.932906,-.210245,.32995,.817135,.940025,-.202992,.312262,.844912,.946101,-.19436,.293313,.872164,.952835,-.184125,.273638,.899443,.957347,-.173657,.252385,.926389,.961434,-.162204,.231038,.951947,.965522,-.14979,.209834,.976751,.969412,-.136307,.188821,1.00022,.973902,-.122527,.168013,1.02229,.974045,-.108213,.147634,1.04199,.975775,-.0927397,.12705,1.06019,.978383,-.0778212,.106309,1.07711,.98211,-.0621216,.0849279,1.09245,.986517,-.0463847,.0633519,1.10651,.991696,-.0309353,.0419698,1.11903,.996349,-.0150914,.0206272,1.13073,1.00003,442449e-9,-231396e-9,1.14146,.727498,-885074e-11,.441528,145832e-10,.730897,-223525e-9,.443589,368298e-9,.730796,-893996e-9,.443528,.00147303,.730805,-.00201149,.443533,.00331433,.730814,-.00357596,.443538,.00589222,.730815,-.00558734,.443538,.00920678,.730822,-.00804544,.44354,.0132582,.730836,-.0109501,.443545,.0180468,.730848,-.0143008,.443546,.0235732,.730871,-.0180969,.443552,.0298382,.730915,-.022338,.443567,.0368438,.730982,-.0270225,.443591,.044591,.731076,-.0321491,.443627,.0530831,.731245,-.0377166,.443699,.0623243,.73144,-.0437216,.443777,.0723181,.7317,-.0501576,.443881,.0830691,.732034,-.0569942,.444014,.0945809,.732388,-.0638756,.444113,.106825,.732853,-.071203,.444247,.119859,.733473,-.0790076,.444442,.13369,.734195,-.0871937,.444645,.148304,.735069,-.095696,.444877,.163702,.736169,-.10426,.445133,.179861,.73747,-.112853,.44537,.196778,.738991,-.12199,.445651,.214496,.740865,-.131153,.445958,.232913,.743637,-.140245,.446548,.251977,.746797,-.149722,.447246,.271551,.751517,-.159341,.448656,.291774,.756156,-.169106,.449866,.312455,.761519,-.178436,.450919,.334552,.768295,-.186904,.451776,.358491,.776613,-.195117,.452832,.383446,.783966,-.202695,.45249,.408945,.793542,-.20985,.452587,.435364,.803192,-.216403,.451852,.462336,.813892,-.22251,.450708,.48987,.824968,-.227676,.4486,.517697,.835859,-.232443,.445156,.545975,.846825,-.235775,.440351,.574483,.858085,-.237897,.433641,.604246,.868825,-.238074,.425354,.634101,.879638,-.237661,.415383,.664201,.889966,-.236186,.404136,.693918,.899479,-.233599,.390917,.723481,.908769,-.229737,.376352,.75258,.917966,-.223836,.360372,.781764,.926304,-.217067,.342551,.811139,.934626,-.209309,.324238,.839585,.941841,-.20071,.304484,.867044,.94789,-.190602,.283607,.894579,.954196,-.179253,.262205,.921743,.958383,-.167646,.239847,.948026,.963119,-.155073,.218078,.973296,.966941,-.141426,.195899,.998135,.970836,-.126849,.174121,1.02021,.973301,-.112296,.153052,1.04085,.97448,-.0964965,.131733,1.05946,.977045,-.080489,.10997,1.07693,.980751,-.064844,.0881657,1.09254,.985475,-.0481938,.0657987,1.10697,.991089,-.0319185,.0435215,1.12004,.996122,-.0158088,.0214779,1.13173,1.00001,372455e-9,-200295e-9,1.14291,.708622,-907597e-11,.45304,141962e-10,.711162,-228911e-9,.454662,358052e-9,.709812,-914446e-9,.453797,.00143034,.709865,-.00205819,.453834,.00321935,.709864,-.00365894,.453833,.00572331,.709855,-.00571692,.453826,.00894278,.709862,-.00823201,.453828,.012878,.709875,-.011204,.453832,.0175295,.709896,-.0146323,.453839,.0228978,.709925,-.0185163,.453847,.0289839,.709974,-.0228551,.453866,.0357894,.710045,-.0276473,.453892,.0433161,.710133,-.032891,.453924,.0515665,.710292,-.0385851,.453992,.0605458,.710485,-.0447254,.45407,.0702574,.710769,-.0513051,.454192,.0807077,.711106,-.0582733,.454329,.091896,.711516,-.0652866,.45446,.103814,.712071,-.0728426,.454653,.116508,.712676,-.0808307,.45484,.129968,.713476,-.0892216,.455096,.144206,.714377,-.0979047,.455346,.159212,.715579,-.106531,.455647,.174973,.716977,-.115492,.455961,.191504,.71862,-.124821,.456315,.208835,.72084,-.134079,.4568,.226869,.723786,-.143427,.457521,.245582,.727464,-.153061,.458475,.264957,.732771,-.162768,.460239,.284948,.736515,-.172627,.460899,.30522,.743519,-.182487,.463225,.326717,.750041,-.191295,.464027,.350113,.758589,-.199746,.465227,.374782,.767703,-.207584,.465877,.400226,.777484,-.214973,.465996,.426442,.788792,-.221796,.466019,.453688,.800194,-.228038,.465083,.481246,.811234,-.233346,.462506,.509086,.822859,-.238073,.459257,.537338,.835082,-.241764,.454863,.566108,.846332,-.244241,.448163,.595126,.858355,-.244736,.439709,.625574,.87034,-.244278,.429837,.65617,.881027,-.24255,.418002,.686029,.891007,-.239912,.404325,.716039,.900874,-.236133,.389222,.745518,.911072,-.230672,.373269,.775026,.920359,-.22356,.355083,.804521,.928604,-.215591,.335533,.834045,.937175,-.206503,.315278,.861612,.942825,-.196684,.293653,.889131,.949805,-.185116,.271503,.916853,.955535,-.172703,.248821,.943541,.959843,-.159978,.225591,.970132,.964393,-.146375,.202719,.994709,.968008,-.131269,.179928,1.0186,.971013,-.11569,.158007,1.03928,.973334,-.1003,.13624,1.05887,.975775,-.0833352,.1138,1.07652,.979579,-.0668981,.0913141,1.09297,.984323,-.0500902,.0683051,1.10734,.990351,-.0332377,.0451771,1.12084,.995823,-.0161491,.0221705,1.13296,1.0001,234083e-9,-108712e-9,1.14441,.683895,-924677e-11,.46015,137429e-10,.68833,-233383e-9,.463134,346865e-9,.688368,-933547e-9,.463159,.00138748,.688367,-.00210049,.463159,.00312187,.688369,-.00373415,.463159,.00555004,.688377,-.00583449,.463163,.00867216,.688386,-.00840128,.463166,.0124884,.688398,-.0114343,.463169,.0169993,.688418,-.0149329,.463175,.0222054,.688453,-.0188964,.463188,.028108,.688515,-.0233239,.463214,.0347085,.68857,-.0282136,.463231,.0420091,.688679,-.033564,.463276,.0500132,.688854,-.0393733,.463356,.0587255,.689038,-.0456354,.46343,.0681476,.689321,-.0523433,.463553,.0782897,.689662,-.059412,.463693,.0891501,.690188,-.0665736,.4639,.100735,.690755,-.0743106,.464107,.113074,.691405,-.0824722,.464329,.126161,.692198,-.0910484,.464585,.140007,.693196,-.0998778,.464893,.154612,.69454,-.108651,.465285,.169984,.695921,-.117855,.465596,.186106,.697749,-.12734,.466056,.203034,.700375,-.136714,.466771,.220703,.703395,-.146386,.467579,.239062,.707904,-.156096,.469067,.258188,.711673,-.165904,.469851,.277759,.717489,-.175812,.471815,.297935,.724051,-.185931,.47389,.318916,.731965,-.195238,.47587,.341591,.741151,-.204021,.477523,.366062,.751416,-.212113,.478881,.391396,.761848,-.21979,.479226,.417599,.771886,-.2267,.478495,.444401,.783998,-.232991,.477622,.472084,.796523,-.238645,.475833,.500193,.808851,-.243396,.472568,.52865,.821191,-.247226,.467857,.557362,.834261,-.250102,.461871,.586768,.846762,-.251056,.453543,.617085,.859867,-.250604,.443494,.647659,.871948,-.248783,.431711,.678119,.882967,-.245855,.417911,.708399,.892826,-.242168,.401993,.738256,.90332,-.237062,.385371,.767999,.913633,-.22997,.366837,.798191,.922774,-.221687,.346372,.827756,.931371,-.212345,.325682,.856425,.938929,-.20206,.303665,.884299,.944821,-.190981,.280786,.912023,.951792,-.178065,.2573,.939669,.957712,-.164634,.233448,.96655,.961912,-.150863,.209504,.992366,.966382,-.13577,.18597,1.01633,.969588,-.119593,.162905,1.03843,.971777,-.103203,.14053,1.05841,.97433,-.0865888,.117909,1.07632,.978686,-.0690829,.0944101,1.09326,.983281,-.0516568,.0705671,1.10796,.989562,-.034558,.0468592,1.12182,.995465,-.0167808,.0229846,1.1342,.999991,373016e-9,-235606e-9,1.1459,.662251,-939016e-11,.468575,132714e-10,.666634,-237624e-9,.471675,335842e-9,.666411,-950385e-9,.471516,.00134321,.666399,-.00213833,.471509,.00302221,.666386,-.0038014,.471499,.00537283,.666405,-.00593958,.471511,.00839533,.666406,-.00855253,.471508,.0120898,.666428,-.0116401,.471519,.0164569,.666444,-.0152015,.471522,.0214971,.66649,-.0192362,.471543,.027212,.666537,-.0237428,.471558,.033603,.666617,-.0287198,.471591,.0406728,.666718,-.0341647,.471631,.0484238,.666889,-.0400759,.47171,.0568621,.667104,-.0464479,.471805,.0659915,.667374,-.0532677,.471923,.0758178,.667772,-.0603805,.472098,.0863425,.668371,-.0677392,.472363,.0975917,.668971,-.0756028,.472596,.109567,.669696,-.0839293,.472869,.122272,.670481,-.0926683,.473126,.135718,.6715,-.1016,.473442,.149914,.672911,-.110566,.47389,.164882,.674512,-.119984,.474354,.180602,.67651,-.129574,.474922,.19711,.679292,-.139106,.475764,.214371,.682798,-.148993,.476886,.232405,.686955,-.158737,.478179,.251153,.691406,-.168754,.479432,.270436,.697438,-.178703,.481481,.290374,.704761,-.188955,.484143,.311044,.713599,-.198814,.487007,.333003,.723194,-.207869,.488962,.357144,.732601,-.216189,.489815,.382169,.744193,-.22398,.490888,.408227,.754907,-.231156,.490355,.434928,.767403,-.23747,.489548,.462599,.78107,-.243503,.488274,.490908,.793893,-.248114,.484843,.519421,.807296,-.25222,.4803,.548561,.820529,-.255265,.474097,.577772,.833716,-.256741,.466041,.607782,.848403,-.25637,.456547,.638807,.860755,-.254804,.443946,.670058,.874012,-.251834,.430852,.700749,.885619,-.247867,.414903,.731446,.896069,-.242634,.397276,.761191,.906266,-.236093,.378535,.791053,.916759,-.227543,.358038,.821298,.92523,-.21783,.335705,.850747,.93436,-.207534,.313797,.879258,.941631,-.195983,.289671,.907734,.947564,-.183567,.265319,.935206,.953681,-.169345,.240815,.962739,.960008,-.154909,.216119,.989227,.964145,-.140161,.192096,1.01465,.968171,-.123411,.167855,1.03737,.969859,-.106525,.144817,1.05767,.972666,-.0891023,.12149,1.0761,.977055,-.0718094,.0975306,1.09336,.982527,-.0534213,.0730217,1.10878,.989001,-.0355579,.0483366,1.12285,.99512,-.0176383,.023938,1.13548,1.00007,368831e-9,-211581e-9,1.14744,.651047,-960845e-11,.484101,12922e-9,.644145,-241347e-9,.478968,324578e-9,.64396,-965142e-9,.478831,.00129798,.64396,-.00217154,.47883,.00292046,.643968,-.00386049,.478835,.00519202,.643974,-.00603186,.478838,.0081128,.643977,-.0086854,.478836,.011683,.643982,-.0118207,.478834,.0159031,.644024,-.0154374,.478856,.0207743,.644059,-.0195343,.478868,.0262975,.644122,-.0241103,.478896,.0324747,.644207,-.0291638,.478933,.039309,.64432,-.0346919,.478981,.0468029,.644481,-.0406919,.479053,.0549614,.644722,-.047159,.479169,.0637909,.645013,-.0540748,.479302,.0732974,.645503,-.0612001,.479541,.0834898,.646117,-.0687303,.479829,.0943873,.646707,-.0767846,.480061,.105991,.647431,-.0852465,.480343,.11831,.64831,-.0940719,.48066,.131348,.649486,-.103056,.481083,.14514,.650864,-.112261,.481528,.159676,.652604,-.121852,.482102,.174979,.654825,-.131505,.482813,.191079,.657876,-.141189,.483876,.207927,.661339,-.151239,.48499,.225586,.665463,-.161091,.486279,.243947,.670542,-.171235,.487968,.262957,.677361,-.181347,.49053,.282781,.685672,-.191679,.493862,.303311,.694551,-.201781,.49699,.324607,.703753,-.211164,.498884,.347916,.713703,-.219675,.500086,.372628,.725911,-.227836,.501554,.398694,.73862,-.23533,.502193,.425529,.752118,-.241786,.501811,.453209,.76579,-.247865,.500185,.481381,.779568,-.252696,.497159,.51011,.793991,-.256802,.492765,.539322,.808182,-.259942,.486827,.569078,.821698,-.261703,.478386,.598818,.836009,-.262006,.468772,.629762,.849824,-.260333,.456352,.661366,.863888,-.257398,.442533,.69295,.876585,-.253264,.426573,.723608,.888665,-.248026,.408964,.754378,.899537,-.241487,.389677,.784761,.9094,-.233463,.368516,.814688,.920166,-.223397,.346624,.845009,.928899,-.21255,.322717,.874431,.937156,-.200869,.298698,.902922,.943861,-.188387,.273491,.931356,.949557,-.174341,.247866,.958854,.955862,-.158994,.222496,.986098,.961721,-.143664,.197522,1.01229,.965976,-.127412,.17302,1.03571,.968652,-.109798,.148954,1.05699,.971084,-.0916787,.125044,1.07587,.975584,-.0739634,.100577,1.09372,.98122,-.055322,.0753666,1.10948,.988253,-.0366825,.0498899,1.12394,.99482,-.0180389,.024611,1.13694,1.00001,229839e-9,-188283e-9,1.14919,.613867,-964198e-11,.479449,123452e-10,.621485,-244534e-9,.485399,313091e-9,.621429,-978202e-9,.485353,.00125245,.62112,-.00220004,.485114,.00281687,.621119,-.0039111,.485112,.00500783,.621122,-.00611091,.485112,.00782498,.621133,-.00879922,.485117,.0112687,.621152,-.0119756,.485125,.0153394,.621183,-.0156396,.485139,.0200382,.621227,-.0197898,.485158,.0253663,.621298,-.0244253,.485192,.0313261,.621388,-.0295441,.485233,.0379204,.621507,-.0351432,.485286,.0451523,.621693,-.0412198,.485378,.0530277,.621933,-.0477673,.485495,.0615522,.622232,-.0547574,.485635,.0707316,.622809,-.0619417,.485943,.0805883,.623407,-.069625,.486232,.0911267,.62406,-.077796,.486516,.102354,.624835,-.0863731,.486838,.114279,.625758,-.095251,.487188,.126902,.627043,-.104299,.487695,.140285,.628438,-.113724,.488163,.154397,.630325,-.123417,.488858,.169267,.632801,-.133137,.489754,.184941,.635784,-.143052,.490815,.20136,.639406,-.153132,.492048,.218643,.643872,-.163143,.49363,.236615,.6499,-.17333,.496009,.255449,.657201,-.183622,.498994,.275006,.666221,-.194019,.502888,.295354,.674419,-.204192,.505459,.316244,.683729,-.21406,.507771,.33849,.695584,-.222854,.510245,.363166,.708583,-.231315,.512293,.389071,.721233,-.238911,.512747,.415737,.735134,-.245657,.512482,.443331,.750179,-.251879,.511526,.471891,.765073,-.256911,.508935,.500892,.779794,-.261144,.504341,.530294,.794801,-.264316,.498515,.560144,.810339,-.266276,.491015,.590213,.824818,-.266981,.481126,.620865,.839375,-.265778,.468685,.652687,.853043,-.262748,.453925,.684759,.867335,-.258474,.437912,.716209,.88037,-.253187,.419648,.747508,.891711,-.246476,.39982,.77797,.902896,-.238735,.37879,.808586,.913601,-.22885,.355891,.838843,.923019,-.217656,.331773,.869014,.933432,-.205539,.307356,.898512,.939691,-.192595,.281321,.9269,.946938,-.178945,.255441,.955297,.952372,-.163587,.229013,.983231,.95909,-.147214,.203179,1.00971,.963675,-.13064,.17792,1.03438,.968247,-.113121,.152898,1.05625,.97001,-.0945824,.128712,1.07598,.974458,-.0755648,.103349,1.094,.980168,-.0571998,.0776731,1.1104,.987295,-.0377994,.0514445,1.12491,.994432,-.0186417,.025429,1.13851,.999975,542714e-9,-282356e-9,1.15108,.592656,-980249e-11,.486018,119532e-10,.598467,-247275e-9,.490781,301531e-9,.597934,-988317e-9,.490343,.00120517,.597903,-.00222366,.490319,.0027116,.597913,-.00395315,.490327,.00482077,.597919,-.00617653,.490329,.00753264,.597936,-.00889375,.490339,.0108478,.597956,-.0121043,.490347,.0147668,.597992,-.0158073,.490365,.0192905,.598032,-.0200017,.490382,.0244204,.598109,-.0246865,.49042,.0301593,.598215,-.0298594,.490474,.03651,.59833,-.0355167,.490524,.0434757,.598525,-.0416559,.490624,.0510629,.598778,-.0482692,.490753,.0592781,.599135,-.0553114,.49094,.0681304,.599802,-.062542,.491328,.0776467,.600361,-.0703638,.491598,.0878184,.60101,-.0786256,.491882,.0986573,.601811,-.0872962,.492232,.11018,.602861,-.0962284,.492684,.1224,.604167,-.10538,.493213,.135354,.605693,-.114896,.493799,.149034,.607682,-.124654,.494576,.163469,.610672,-.13456,.4959,.178747,.613313,-.144581,.496713,.194723,.617603,-.154703,.498499,.211617,.622174,-.16489,.500188,.229183,.628855,-.175164,.503072,.247786,.636963,-.185565,.506798,.267116,.644866,-.195911,.509719,.28702,.653741,-.206104,.512776,.307763,.664942,-.216447,.516812,.329631,.67633,-.22552,.519181,.353515,.690012,-.234316,.521681,.379226,.704243,-.242032,.523129,.405901,.719396,-.249172,.523768,.433585,.734471,-.255543,.522541,.462085,.750539,-.260697,.520217,.491233,.766365,-.26501,.516293,.521094,.781677,-.268409,.509708,.551014,.797132,-.270399,.501944,.581463,.812655,-.271247,.492025,.612402,.828592,-.270708,.480424,.643798,.844044,-.268085,.465955,.67682,.857305,-.263459,.448425,.708496,.87114,-.258151,.430243,.74046,.884936,-.251171,.410578,.771583,.895772,-.243305,.38862,.802234,.906961,-.234037,.365214,.833179,.917775,-.222714,.34116,.86353,.927883,-.210175,.31572,.893557,.936617,-.196925,.289159,.922976,.943384,-.182788,.261996,.951606,.949713,-.167965,.235324,.979958,.955818,-.151109,.208408,1.00765,.961344,-.133834,.182591,1.03329,.965469,-.115987,.156958,1.0557,.968693,-.09746,.132239,1.07583,.973165,-.0778514,.106195,1.09451,.979387,-.0585067,.0797669,1.11137,.98671,-.0390409,.0530263,1.12643,.994093,-.019408,.0263163,1.14016,1.00002,540029e-9,-194487e-9,1.15299,.574483,-989066e-11,.494533,114896e-10,.574478,-249127e-9,.494528,289403e-9,.574607,-996811e-9,.494637,.00115797,.574396,-.00224241,.494458,.00260498,.574377,-.00398632,.49444,.00463102,.574386,-.00622836,.494445,.00723623,.574401,-.0089683,.494453,.010421,.574419,-.0122056,.49446,.0141859,.574459,-.0159396,.494481,.0185322,.574525,-.0201692,.49452,.0234617,.574587,-.0248924,.494547,.0289762,.574697,-.0301074,.494604,.0350797,.574853,-.0358114,.494688,.0417767,.575027,-.041999,.494772,.0490718,.575294,-.0486618,.494915,.0569728,.575733,-.0557148,.495173,.0654955,.576356,-.0630489,.495537,.0746612,.576944,-.0709285,.495836,.0844615,.57765,-.0792723,.496177,.0949142,.578491,-.0880167,.496563,.10603,.579639,-.0969462,.497096,.117841,.580989,-.10622,.497684,.130367,.582587,-.115861,.498337,.143609,.584951,-.125605,.499414,.157625,.587602,-.135608,.500518,.172413,.59076,-.145742,.501767,.187999,.594992,-.155934,.503542,.20445,.600656,-.166303,.506135,.221764,.607816,-.176681,.509542,.24002,.61522,-.187071,.51263,.258992,.623702,-.197465,.516021,.278773,.634192,-.207816,.520422,.299377,.644936,-.218183,.524073,.320802,.657888,-.2278,.528049,.34384,.670666,-.236747,.52986,.36916,.685626,-.24484,.531892,.395867,.701304,-.252071,.532727,.423488,.717727,-.258714,.532146,.452201,.733914,-.264211,.529883,.481579,.750529,-.26859,.5259,.511558,.76747,-.272046,.51999,.542042,.785189,-.274225,.513083,.572799,.800954,-.275189,.502936,.603816,.816962,-.274946,.490921,.635461,.83336,-.272695,.47684,.6676,.848143,-.268223,.459405,.70051,.861818,-.262768,.440319,.732902,.876828,-.255872,.420123,.765084,.889312,-.247703,.398379,.796391,.900412,-.238381,.374496,.827333,.912251,-.227783,.349874,.858385,.921792,-.214832,.323181,.888652,.931273,-.200949,.296624,.917763,.940295,-.186537,.269211,.947878,.946812,-.171538,.241447,.977016,.953588,-.155254,.213829,1.00501,.958841,-.137156,.186807,1.03179,.963746,-.118699,.160706,1.05502,.966468,-.0998358,.135504,1.07568,.971178,-.0805186,.109131,1.09479,.97831,-.0599348,.0818293,1.1123,.985886,-.0399661,.0545872,1.12771,.994021,-.0198682,.0269405,1.14186,1.00009,271022e-9,-12989e-8,1.15514,.538716,-990918e-11,.486732,109675e-10,.550656,-250642e-9,.497518,277412e-9,.55057,-.00100265,.497441,.00110974,.550903,-.00225672,.497733,.00249779,.550568,-.00401046,.497438,.00443906,.550574,-.00626613,.49744,.00693637,.550591,-.0090226,.497449,.00998921,.550623,-.0122795,.497469,.0135984,.550667,-.0160361,.497495,.0177654,.550724,-.0202908,.497526,.0224915,.550792,-.0250421,.497557,.0277795,.550918,-.0302878,.49763,.0336334,.551058,-.0360241,.497701,.0400573,.551276,-.0422473,.497824,.0470585,.551551,-.0489441,.497977,.0546433,.552074,-.0559596,.498312,.0628367,.552681,-.0633978,.498679,.071646,.553324,-.0713176,.499031,.0810746,.554011,-.0797268,.499365,.091129,.55488,-.0885238,.499779,.101837,.556171,-.0974417,.500444,.113239,.557498,-.106841,.501025,.125316,.559299,-.116533,.501864,.138128,.561647,-.126298,.502967,.151695,.564347,-.136388,.504129,.16604,.567863,-.146576,.505713,.181207,.572569,-.156832,.507953,.197259,.578919,-.167323,.511186,.214258,.585387,-.177712,.514042,.232038,.593134,-.188184,.517484,.250733,.603295,-.198717,.522345,.270454,.613854,-.209177,.526751,.290807,.626092,-.219644,.531595,.312202,.637868,-.229494,.534721,.334435,.652458,-.238718,.538304,.359184,.666985,-.247061,.539875,.385637,.683301,-.254652,.541042,.41328,.69998,-.261376,.540735,.441903,.717824,-.267085,.539139,.471609,.734617,-.271465,.534958,.501446,.753663,-.27528,.53032,.532571,.770512,-.277617,.522134,.563641,.787356,-.278525,.51206,.595067,.806252,-.278512,.50119,.627226,.822061,-.277023,.486791,.659402,.838959,-.273175,.470467,.692874,.85379,-.267238,.450688,.725702,.868268,-.260327,.429741,.75832,.881994,-.251946,.407223,.790189,.893885,-.242432,.383214,.821625,.905118,-.231904,.357297,.853011,.916045,-.219545,.330733,.883773,.927614,-.205378,.303916,.914435,.936005,-.190388,.275941,.944502,.944533,-.1749,.247493,.974439,.950758,-.158588,.218996,1.00286,.957078,-.141027,.191559,1.0304,.962448,-.121507,.164457,1.05466,.964993,-.102068,.138636,1.0761,.970017,-.0822598,.111861,1.09541,.97661,-.062033,.0843438,1.11317,.985073,-.0409832,.0558496,1.12911,.993515,-.020146,.0275331,1.1438,1.00006,27329e-8,-107883e-9,1.15736,.525324,-999341e-11,.498153,105385e-10,.526513,-251605e-9,.499277,265329e-9,.526517,-.00100641,.499282,.0010613,.526588,-.00226466,.499337,.00238823,.526539,-.0040255,.499302,.00424535,.526547,-.00628954,.499306,.00663364,.526561,-.00905628,.499313,.00955337,.526593,-.0123253,.499334,.0130054,.526642,-.0160957,.499365,.0169911,.5267,-.0203661,.499396,.0215122,.526792,-.0251347,.499451,.0265718,.526904,-.0303985,.499511,.0321732,.527079,-.0361554,.499617,.0383231,.527285,-.0423982,.499731,.045026,.527602,-.0491121,.499924,.0522936,.528166,-.0561127,.500306,.0601528,.52879,-.0635988,.5007,.0686059,.529421,-.071581,.501048,.0776518,.530144,-.0799854,.501421,.0873148,.531062,-.0888032,.501884,.0976084,.532374,-.0977643,.50259,.108588,.533828,-.107197,.50329,.120234,.53581,-.116887,.504312,.132602,.538063,-.126755,.505365,.145721,.5409,-.136819,.506668,.159617,.544882,-.147117,.508731,.174369,.550238,-.157446,.511601,.190028,.556038,-.167988,.514431,.206587,.563031,-.178364,.517808,.224046,.571543,-.189007,.521937,.242503,.582255,-.199546,.527415,.261977,.59272,-.210084,.531682,.282162,.605648,-.220448,.537123,.303426,.61785,-.230593,.540664,.325323,.632223,-.240238,.544467,.348993,.648819,-.24887,.547594,.375462,.665825,-.256657,.54912,.403024,.683389,-.263711,.549294,.431773,.701495,-.269666,.547649,.461494,.719197,-.274169,.543786,.491623,.737906,-.278124,.538644,.522994,.756652,-.280632,.531057,.554775,.775279,-.281741,.521972,.586441,.792688,-.281652,.509613,.618596,.811894,-.280345,.496497,.651462,.827938,-.277128,.47968,.684023,.844837,-.271646,.460688,.718024,.859239,-.264397,.438872,.751207,.874088,-.256144,.41577,.784232,.887693,-.246311,.391369,.816191,.899402,-.235497,.365872,.847828,.910973,-.223631,.338618,.87934,.92204,-.209874,.310803,.910325,.930987,-.194265,.281802,.940695,.94,-.178125,.252836,.970958,.948018,-.161479,.224239,1.00078,.955141,-.144038,.195857,1.0288,.960513,-.124915,.168487,1.05371,.963964,-.104284,.141495,1.07596,.968713,-.0838732,.114437,1.09628,.975524,-.0635579,.0863105,1.11448,.98431,-.042291,.0574774,1.13069,.992916,-.0209131,.0284343,1.14568,.999926,743097e-9,-379265e-9,1.15955,.501042,-998428e-11,.498726,100306e-10,.502992,-252112e-9,.500665,253283e-9,.502417,-.00100791,.500092,.00101259,.502965,-.00226919,.500621,.00227978,.502318,-.00403109,.499994,.00405011,.502333,-.00629832,.500005,.00632868,.502362,-.00906907,.500027,.00911446,.502369,-.0123423,.500023,.0124078,.50243,-.0161178,.500066,.016211,.502493,-.0203937,.500103,.0205256,.502592,-.0251684,.500166,.0253548,.502707,-.0304389,.50023,.0307029,.502881,-.0362015,.500335,.0365753,.503124,-.0424507,.500488,.0429798,.503443,-.0491582,.500686,.0499268,.504083,-.0561476,.501155,.0574541,.504668,-.0636846,.501524,.0655408,.505319,-.0716834,.501904,.0742072,.50609,-.0800925,.502321,.0834699,.507122,-.0888425,.502896,.0933603,.508414,-.097855,.503603,.10391,.509955,-.107304,.504416,.115113,.512061,-.116921,.505565,.127054,.514419,-.12689,.506732,.139709,.517529,-.136934,.508338,.153173,.522085,-.147327,.510987,.167528,.526986,-.157612,.513527,.182708,.533122,-.168213,.516717,.198881,.540807,-.178688,.520832,.215986,.550687,-.189511,.52632,.234335,.560567,-.199998,.531009,.253375,.571698,-.210652,.535839,.273499,.584364,-.220917,.541091,.294355,.599066,-.23137,.546875,.316525,.614148,-.241206,.551306,.339671,.631157,-.250379,.555187,.36531,.647919,-.258397,.556595,.392767,.666112,-.265528,.556949,.421397,.686158,-.271827,.556617,.451433,.704838,-.27674,.552975,.482131,.723957,-.280733,.547814,.513458,.74262,-.283359,.53997,.545446,.762009,-.284541,.530422,.57775,.781314,-.284507,.518546,.610434,.799116,-.283309,.504178,.643178,.817604,-.280378,.48843,.676248,.83459,-.275619,.469457,.709698,.850974,-.26856,.447698,.744245,.866747,-.260094,.424791,.777695,.881412,-.249929,.399913,.810392,.8936,-.239137,.37308,.842872,.905943,-.226818,.345705,.874677,.916408,-.213699,.31706,.906257,.927215,-.198428,.288444,.936881,.935625,-.181643,.258329,.96795,.944076,-.164386,.228488,.998216,.951229,-.146339,.199763,1.02689,.958793,-.127709,.172153,1.0535,.963219,-.107244,.144989,1.07646,.967562,-.0857764,.11685,1.09675,.974866,-.0645377,.0880571,1.11576,.983353,-.0431732,.0587352,1.13227,.992503,-.0218356,.0294181,1.1478,1.00003,605203e-9,-231013e-9,1.16207,.482935,-101177e-10,.504695,968142e-11,.477554,-251521e-9,.499071,240676e-9,.477904,-.00100683,.499436,96342e-8,.478368,-.00226636,.499899,.0021687,.477977,-.00402719,.499513,.00385384,.477993,-.00629226,.499525,.0060221,.478011,-.00906011,.499536,.00867289,.478051,-.0123305,.499566,.0118074,.478089,-.016102,.499587,.0154269,.478171,-.0203736,.499645,.0195341,.478254,-.025143,.499692,.0241318,.47839,-.0304071,.499779,.0292247,.478588,-.0361631,.499911,.0348196,.478812,-.0424023,.500046,.0409231,.479208,-.0490724,.500326,.047552,.479841,-.0560722,.500805,.0547377,.480392,-.0636125,.501152,.0624607,.481068,-.0716134,.501561,.0707473,.481898,-.0800062,.502054,.0796118,.483022,-.0886568,.502728,.0890974,.484332,-.0977553,.503479,.0992099,.486126,-.107173,.504546,.10999,.488066,-.11677,.50557,.121476,.490521,-.126725,.506849,.133672,.494232,-.136793,.50911,.146731,.498302,-.147116,.511345,.160577,.503565,-.157446,.514344,.175335,.510902,-.168121,.518824,.191207,.519263,-.178799,.523666,.208058,.528204,-.189407,.528296,.225875,.538854,-.200145,.533724,.244782,.551278,-.210701,.539833,.264753,.565222,-.221303,.546131,.285745,.579403,-.231688,.551496,.307592,.595469,-.241718,.556809,.330582,.610929,-.250992,.559641,.354995,.629433,-.259602,.562379,.382471,.648504,-.267038,.563676,.411126,.66756,-.273388,.562092,.440924,.689143,-.278788,.560807,.472118,.709056,-.282783,.555701,.503774,.729855,-.285836,.548698,.536364,.748954,-.287078,.538544,.56895,.768373,-.287133,.526711,.601991,.78827,-.285839,.512511,.635403,.807465,-.283238,.496323,.668797,.825194,-.27906,.477638,.702584,.842203,-.272286,.456253,.736393,.857749,-.263854,.432412,.77096,.874799,-.253943,.407806,.80489,.887497,-.24237,.38033,.83771,.89966,-.230278,.352446,.870376,.911753,-.21646,.323268,.902256,.923011,-.202071,.294314,.933306,.932375,-.185519,.264104,.965177,.940537,-.167604,.234035,.996303,.948904,-.149068,.20412,1.0261,.955263,-.129539,.175431,1.05304,.960303,-.109932,.148116,1.07617,.965512,-.0880572,.119693,1.09742,.973466,-.0660548,.0901619,1.11721,.98284,-.0439228,.0599875,1.13436,.992216,-.0219588,.0298975,1.15006,.999946,119402e-9,-208547e-10,1.16471,.447827,-100414e-10,.491543,914833e-11,.454778,-251257e-9,.499172,22891e-8,.453519,-.00100342,.497787,914184e-9,.45357,-.00225776,.497847,.00205701,.453578,-.00401371,.497855,.00365705,.45357,-.00627107,.497841,.00571453,.453598,-.00902968,.497864,.00823019,.453627,-.0122888,.497882,.0112049,.453684,-.0160475,.497923,.0146405,.453764,-.0203044,.49798,.0185394,.453866,-.0250576,.498049,.0229054,.453996,-.0303028,.49813,.0277424,.454196,-.0360379,.498267,.0330587,.454457,-.0422521,.498445,.0388613,.454926,-.0488393,.498812,.0451767,.455525,-.0558653,.499272,.0520153,.456074,-.0633772,.499625,.0593754,.456752,-.0713606,.500049,.0672751,.457648,-.07971,.500615,.0757447,.458849,-.0883032,.501399,.0848231,.46029,-.0974095,.502293,.0945135,.462,-.106729,.503301,.104848,.464121,-.116354,.504533,.115884,.466889,-.126214,.506172,.127652,.470744,-.136324,.508667,.14024,.47488,-.146595,.510995,.153673,.480845,-.157027,.514832,.168053,.488262,-.167658,.519506,.183508,.496547,-.178343,.524347,.199948,.506254,-.188916,.52983,.217503,.517961,-.199975,.536357,.236272,.531484,-.210624,.543641,.256096,.545496,-.221227,.550048,.277085,.559497,-.231568,.555076,.298615,.575752,-.241698,.560541,.321547,.591999,-.251172,.564156,.345602,.610654,-.260178,.567607,.371851,.630484,-.268094,.56923,.40076,.651807,-.274661,.569779,.430801,.67239,-.280331,.566791,.461939,.693024,-.284501,.562007,.493854,.715473,-.287852,.555791,.526992,.736323,-.28929,.546345,.560102,.755771,-.289405,.534,.593543,.775424,-.2881,.519114,.627256,.795447,-.285562,.502543,.661464,.815319,-.281416,.484773,.695206,.831769,-.275523,.463445,.729044,.849464,-.267516,.440269,.764069,.866775,-.257584,.415049,.799089,.881252,-.245817,.388049,.831948,.894209,-.233127,.35889,.865526,.906922,-.219579,.329915,.89818,.919686,-.204491,.300441,.930013,.929044,-.188962,.269445,.962061,.938393,-.171079,.238402,.994214,.94661,-.15199,.208204,1.02533,.953095,-.131953,.178653,1.0529,.958644,-.111233,.150684,1.0771,.963925,-.0903098,.122359,1.09855,.971995,-.0680505,.0923342,1.11874,.981658,-.0448512,.0614195,1.13635,.991649,-.0221931,.0303582,1.15238,.999985,393403e-9,-111086e-9,1.16772,.396806,-971563e-11,.457671,842355e-11,.429186,-249421e-9,.495017,21625e-8,.429324,-998052e-9,.495173,865322e-9,.429175,-.00224487,.494999,.00194637,.429129,-.00399041,.494952,.00346004,.429153,-.00623476,.494974,.00540684,.429168,-.0089773,.494983,.00778714,.429207,-.0122175,.495012,.0106022,.429257,-.0159542,.495047,.0138535,.429338,-.0201864,.495106,.0175443,.429431,-.0249104,.495165,.0216774,.429587,-.0301252,.495279,.0262594,.429796,-.0358249,.495432,.0312968,.430065,-.0419972,.495621,.0367985,.430588,-.0485144,.496061,.042798,.43113,-.0555028,.496472,.0492914,.431743,-.0629852,.496904,.0562907,.432448,-.0709256,.497369,.0638056,.433414,-.0791942,.498032,.071885,.434638,-.0877346,.498854,.0805517,.43611,-.0968056,.499812,.0898047,.437859,-.106002,.500891,.0997142,.440017,-.115648,.502198,.110289,.443236,-.125427,.504389,.121644,.44697,-.135492,.506809,.133769,.451689,-.145746,.509858,.146787,.45811,-.156219,.514247,.160793,.465305,-.166834,.518816,.175791,.474085,-.177546,.524331,.191906,.484808,-.188262,.53104,.209199,.49732,-.199346,.538511,.227825,.509693,-.209951,.544554,.247269,.524367,-.220533,.551616,.267978,.539228,-.231082,.557368,.289672,.55644,-.241342,.563782,.31268,.574204,-.250964,.568851,.33651,.593388,-.260306,.57312,.362219,.613358,-.268667,.574916,.390322,.634512,-.275591,.575053,.420478,.65563,-.281328,.572404,.451614,.678265,-.285948,.568893,.484112,.70011,-.289408,.561878,.517348,.723005,-.291328,.55359,.551355,.743744,-.291418,.541099,.585109,.763949,-.290252,.526489,.619487,.784186,-.287648,.509496,.65404,.804304,-.283782,.491484,.688649,.823629,-.278067,.470517,.723133,.84094,-.270588,.44705,.757163,.857852,-.261188,.421252,.792816,.874934,-.249313,.394191,.827248,.888709,-.236492,.365359,.861074,.902589,-.222185,.336016,.894417,.914201,-.207314,.30527,.926825,.925978,-.191146,.274532,.9595,.93512,-.174135,.243393,.991583,.943656,-.155231,.212414,1.02356,.951719,-.134403,.182005,1.05239,.957164,-.113023,.153043,1.07754,.962656,-.0914493,.124186,1.09984,.970695,-.0694179,.0941654,1.12,.980749,-.0466199,.0629671,1.13849,.991205,-.0227032,.0311146,1.15494,.999884,632388e-9,-254483e-9,1.1706,.379821,-957289e-11,.460637,789337e-11,.405188,-247483e-9,.491396,204064e-9,.404796,-989434e-9,.490914,815853e-9,.40483,-.00222607,.490949,.00183559,.40473,-.00395723,.49084,.00326332,.404731,-.00618287,.490836,.00509945,.404768,-.00890258,.490871,.00734463,.404791,-.0121156,.490883,.00999992,.404857,-.0158214,.490938,.0130676,.404943,-.0200178,.491004,.0165503,.405059,-.0247027,.491093,.0204521,.405213,-.0298729,.491205,.0247788,.405399,-.0355226,.491333,.0295373,.405731,-.0416352,.491604,.034741,.406303,-.0480807,.492116,.0404255,.406814,-.0550458,.492506,.0465732,.407404,-.0624652,.492926,.0532058,.408149,-.0702958,.493442,.0603442,.409128,-.0784623,.494136,.0680297,.410408,-.087007,.495054,.0762786,.411813,-.0959639,.495962,.0851046,.413735,-.105075,.497257,.0945878,.416137,-.114646,.498882,.104725,.41934,-.124394,.501132,.11563,.423326,-.134328,.503883,.127325,.428419,-.14458,.50747,.139911,.43484,-.154979,.511964,.153481,.442641,-.165628,.517328,.168114,.452511,-.176365,.524258,.183995,.463473,-.187298,.531248,.200953,.475564,-.198244,.538367,.219176,.488664,-.208938,.545175,.238514,.504073,-.219599,.553227,.259129,.520832,-.230378,.560653,.280997,.538455,-.240703,.567523,.303821,.55709,-.250548,.573287,.327948,.576646,-.259964,.577795,.353362,.596705,-.268721,.580077,.380336,.618053,-.276054,.58018,.4101,.640303,-.282176,.578747,.44161,.662365,-.286931,.574294,.474106,.684542,-.290521,.567035,.507549,.707984,-.292672,.558687,.541853,.730913,-.293189,.547606,.576581,.752948,-.292199,.533471,.61172,.773452,-.289508,.516395,.646339,.794715,-.285716,.497873,.682131,.814251,-.280051,.476845,.716396,.833057,-.272873,.453449,.751503,.84959,-.263982,.427857,.786085,.867022,-.252745,.400335,.821355,.882277,-.239655,.371304,.85646,.895375,-.225386,.340397,.890828,.909347,-.209587,.310005,.923532,.921885,-.193433,.2796,.956419,.932127,-.176135,.247276,.989445,.941869,-.157872,.216186,1.02221,.949735,-.137577,.185602,1.05195,.956617,-.115285,.155767,1.07822,.961974,-.0928418,.126103,1.10149,.96972,-.0700592,.0956758,1.12207,.98012,-.0474671,.0643269,1.1408,.990825,-.0238113,.0320863,1.1577,.999876,381574e-9,-812203e-10,1.17403,.367636,-961342e-11,.469176,753287e-11,.380377,-244772e-9,.485434,191797e-9,.380416,-978857e-9,.485475,767015e-9,.380376,-.00220165,.485435,.00172522,.380419,-.00391408,.485487,.00306734,.380438,-.00611549,.485505,.00479332,.380462,-.00880558,.485525,.00690391,.380496,-.0119837,.485551,.00940039,.38056,-.0156487,.485605,.0122848,.38064,-.0197988,.485666,.0155601,.380767,-.0244324,.48577,.0192313,.380909,-.0295444,.485871,.0233032,.381142,-.0351321,.48606,.0277861,.381472,-.0411535,.486336,.0326939,.382015,-.0475408,.486833,.0380565,.382523,-.0544395,.487231,.0438615,.383129,-.061784,.487683,.0501332,.383952,-.0695085,.488313,.0568996,.38498,-.0775819,.489077,.0641952,.386331,-.0860443,.490113,.0720324,.387788,-.0948406,.491099,.0804379,.389808,-.103899,.492566,.0894899,.39252,-.113313,.494601,.0992098,.395493,-.123007,.496619,.109641,.399826,-.132859,.499912,.120919,.405341,-.143077,.504061,.133107,.411932,-.153465,.508905,.146263,.420591,-.164108,.515482,.160544,.43101,-.174893,.523191,.176123,.441881,-.185839,.53026,.192757,.453919,-.196633,.537295,.210535,.468715,-.207611,.546156,.229886,.485182,-.218517,.555173,.250543,.501926,-.229249,.562728,.27221,.51785,-.239481,.567494,.294892,.536947,-.249395,.573889,.318987,.557115,-.259,.578831,.344348,.577966,-.268075,.582055,.371223,.599489,-.276115,.583307,.399834,.62479,-.282523,.583902,.431415,.647504,-.287663,.57953,.464301,.670601,-.291538,.573103,.498123,.693539,-.293842,.563731,.532662,.717385,-.294681,.553169,.567925,.741533,-.293717,.539908,.603502,.762142,-.291156,.521902,.639074,.783014,-.28719,.502815,.674439,.805158,-.281773,.482598,.710497,.823646,-.274682,.458949,.7456,.841879,-.266184,.433129,.781085,.859515,-.255682,.406064,.816,.875335,-.242849,.376509,.851074,.890147,-.228329,.345502,.886473,.903144,-.212491,.31428,.920751,.916618,-.195695,.282994,.954606,.927953,-.178267,.251091,.988402,.937414,-.159549,.219107,1.02141,.946823,-.140022,.18896,1.05167,.954651,-.118154,.158667,1.07819,.959955,-.0946636,.128808,1.1025,.96858,-.0711792,.0973787,1.12391,.97938,-.0475046,.0650965,1.14322,.990498,-.024059,.0326267,1.16077,.999844,-512408e-10,112444e-9,1.17727,.316912,-934977e-11,.425996,695559e-11,.356423,-241372e-9,.479108,179562e-9,.356272,-965292e-9,.478897,71811e-8,.356262,-.00217182,.478894,.00161574,.356265,-.00386092,.478895,.00287261,.356278,-.0060324,.478905,.00448907,.356293,-.00868565,.478914,.00646572,.356346,-.0118207,.478965,.00880438,.356395,-.0154355,.479001,.0115066,.356484,-.019529,.479075,.0145762,.356609,-.0240991,.47918,.018018,.356766,-.0291413,.479305,.0218379,.357009,-.0346498,.479512,.0260454,.357424,-.0405462,.479909,.0306657,.357899,-.0468825,.480337,.0357054,.358424,-.0536887,.480771,.0411728,.359041,-.0609416,.481242,.0470841,.359903,-.0685239,.481943,.0534831,.360932,-.0764883,.482741,.0603795,.362196,-.0848364,.483688,.0678028,.363847,-.0935002,.484947,.0758086,.365972,-.102471,.486588,.0844173,.368741,-.111751,.488787,.0937199,.372146,-.121334,.491405,.103732,.377114,-.131147,.495604,.114608,.38226,-.141213,.499436,.126345,.389609,-.151632,.505334,.139116,.397925,-.162073,.51168,.152995,.407824,-.172819,.518876,.168071,.420014,-.183929,.527639,.184495,.434266,-.195032,.537588,.20232,.447352,-.205792,.544379,.221189,.463726,-.216704,.553422,.241616,.481406,-.227531,.562074,.263298,.498707,-.238017,.568227,.286116,.518039,-.247936,.574473,.3101,.538277,-.257437,.579191,.335401,.561166,-.266829,.584807,.362246,.583189,-.275329,.586476,.390609,.606024,-.28234,.585578,.420998,.632419,-.287924,.584496,.454357,.656128,-.291972,.577766,.488233,.679953,-.29456,.56875,.523248,.704654,-.295816,.558388,.559168,.729016,-.295157,.544826,.595326,.752062,-.292779,.528273,.631864,.773138,-.288681,.508482,.667793,.794869,-.283358,.487341,.704035,.815101,-.27608,.46354,.739925,.834212,-.26767,.438672,.775539,.852368,-.257397,.411239,.810895,.870207,-.245689,.3829,.846472,.884063,-.231452,.351496,.881788,.898284,-.215561,.31895,.917438,.912964,-.198208,.287367,.952422,.924666,-.180426,.254487,.987551,.934429,-.161525,.222226,1.02142,.943485,-.141197,.191143,1.05218,.9521,-.120085,.161112,1.07937,.957876,-.0975881,.130982,1.10403,.966943,-.0726842,.0990553,1.12616,.978313,-.0483705,.0662818,1.14619,.990048,-.0239072,.0329243,1.16413,.999984,461885e-9,-772859e-10,1.18099,.321287,-935049e-11,.455413,659662e-11,.332595,-237513e-9,.471437,167562e-9,.332729,-949964e-9,.471618,670192e-9,.332305,-.00213618,.471028,.00150712,.332326,-.00379765,.471055,.00267959,.332344,-.00593353,.471072,.00418751,.332356,-.00854349,.471077,.00603172,.332403,-.0116268,.471121,.00821362,.332461,-.0151824,.47117,.0107357,.332552,-.0192088,.471251,.0136014,.332657,-.0237024,.47133,.0168152,.332835,-.0286615,.471487,.0203853,.333083,-.0340765,.471708,.0243212,.333547,-.0398563,.47219,.0286518,.333989,-.0460916,.472587,.0333763,.334532,-.0527897,.473054,.0385084,.335167,-.0599284,.473568,.0440638,.33608,-.0673514,.474362,.0500962,.337146,-.0752237,.475231,.0566022,.338462,-.083418,.476282,.0636272,.34014,-.0919382,.477615,.0712153,.342341,-.100741,.479404,.079417,.345088,-.109905,.481618,.0882631,.349049,-.119369,.485081,.0978851,.353939,-.129033,.489317,.108336,.359893,-.139038,.494309,.119698,.366945,-.149411,.499983,.132024,.375814,-.159843,.507185,.145558,.387112,-.170664,.516392,.160433,.40023,-.181897,.526519,.176648,.412555,-.192785,.53423,.193922,.427023,-.203663,.542741,.212662,.443685,-.214695,.552066,.232944,.461499,-.225561,.560762,.254495,.480975,-.236257,.569421,.277531,.501,-.24639,.576101,.301724,.521691,-.256101,.581493,.327112,.543478,-.265289,.585221,.353917,.566094,-.273938,.587614,.381941,.589578,-.281679,.587991,.41172,.614583,-.287655,.585928,.444148,.641813,-.292228,.582092,.478617,.666189,-.295172,.57398,.51397,.690475,-.29648,.561676,.550118,.715543,-.296203,.548758,.586933,.740405,-.293999,.532792,.62384,.762183,-.28998,.512735,.660723,.786069,-.28478,.492402,.69807,.806812,-.277568,.469058,.734422,.826987,-.268951,.443017,.770946,.844588,-.259049,.415501,.80699,.863725,-.2471,.387328,.842107,.879137,-.234157,.356108,.878078,.894634,-.218719,.324315,.914058,.909162,-.201293,.291813,.949922,.92072,-.18267,.258474,.985337,.93158,-.163212,.225593,1.0205,.941238,-.142771,.193986,1.05273,.949293,-.120956,.163392,1.08075,.956226,-.0985743,.132934,1.10559,.96546,-.075118,.101255,1.12823,.977403,-.0497921,.0675441,1.149,.989648,-.0241574,.0334681,1.16765,1.00001,5762e-7,-184807e-9,1.18519,.303474,-916603e-11,.4542,61243e-10,.308894,-232869e-9,.462306,155592e-9,.309426,-931661e-9,.463093,622499e-9,.308643,-.0020949,.461933,.00139979,.308651,-.0037242,.461941,.00248874,.308662,-.00581873,.46195,.00388933,.308687,-.00837818,.461974,.00560247,.308728,-.0114016,.462011,.00762948,.308789,-.0148884,.462067,.00997326,.308882,-.0188369,.462151,.0126375,.309007,-.0232436,.462263,.0156271,.30918,-.0281054,.462417,.0189498,.309442,-.0334065,.462667,.0226167,.309901,-.0390589,.463162,.0266614,.310331,-.0452042,.463555,.0310715,.310858,-.0517735,.464019,.0358698,.311576,-.0587359,.464669,.0410848,.312436,-.0660383,.465406,.0467453,.313526,-.0737266,.466339,.0528718,.314903,-.0817574,.467504,.0595039,.316814,-.090167,.469226,.0666888,.318965,-.0987555,.470981,.0744658,.322077,-.107792,.473814,.082912,.325947,-.117098,.477241,.0920846,.331008,-.126602,.48184,.102137,.337893,-.136619,.488334,.113135,.345106,-.146838,.494415,.12511,.355111,-.157357,.503275,.138356,.365095,-.167955,.510966,.152686,.378344,-.179157,.521508,.16856,.391599,-.190143,.530455,.18561,.407786,-.20123,.541275,.204308,.425294,-.212456,.551784,.224623,.444021,-.223568,.561493,.246172,.463418,-.234154,.569886,.268979,.484077,-.244546,.577116,.293411,.505513,-.254301,.582914,.318936,.527672,-.263564,.587208,.345856,.550565,-.272332,.589277,.374054,.573656,-.280011,.588426,.403276,.59827,-.286924,.587504,.43474,.624731,-.291994,.583401,.468767,.652396,-.295159,.576997,.504411,.67732,-.296954,.565863,.54114,.703147,-.296877,.552316,.57816,.728715,-.295147,.536773,.616124,.752448,-.291275,.51771,.653885,.775169,-.285905,.496087,.691537,.799307,-.279064,.474232,.729251,.819482,-.270294,.447676,.766267,.837659,-.260032,.419656,.802616,.856903,-.248497,.391328,.838583,.873325,-.235252,.360285,.874711,.889788,-.221126,.329215,.91077,.904486,-.204304,.296392,.94653,.917711,-.185562,.262159,.983828,.928969,-.165635,.229142,1.01955,.939707,-.14442,.19673,1.05317,.948167,-.122147,.165095,1.0823,.955222,-.099098,.13451,1.10791,.964401,-.0755332,.102476,1.1312,.976605,-.0513817,.0689667,1.15218,.989085,-.0258499,.034506,1.17129,.999908,617773e-9,-271268e-9,1.18961,.285803,-905752e-11,.452348,572272e-11,.284689,-22732e-8,.450581,143626e-9,.285263,-910214e-9,.451482,575099e-9,.285302,-.00204784,.451553,.00129395,.285318,-.00364057,.451574,.0023006,.28533,-.00568813,.451585,.00359547,.285361,-.00819001,.451618,.00517934,.285397,-.0111458,.45165,.007054,.285447,-.0145536,.451688,.00922167,.285527,-.0184127,.451758,.0116869,.285688,-.0227207,.451929,.0144555,.28584,-.0274712,.452055,.0175341,.286136,-.0326278,.452369,.0209406,.286574,-.0381792,.452853,.0246965,.287012,-.0441879,.453272,.0287996,.287542,-.0506096,.453752,.033268,.288299,-.0573634,.454488,.0381504,.289186,-.0645458,.455294,.0434447,.290302,-.0720405,.456301,.0491973,.291776,-.0799046,.457648,.0554453,.29372,-.088117,.459483,.0622311,.296052,-.0965328,.461571,.0695992,.299563,-.105409,.465085,.077658,.30335,-.114553,.468506,.0864176,.309167,-.123917,.474423,.0961078,.31529,-.13381,.47995,.106643,.324163,-.144021,.488592,.118322,.333272,-.154382,.496461,.131133,.344224,-.165015,.50562,.145208,.357733,-.176168,.516719,.16073,.373046,-.187468,.528513,.177807,.38788,-.198488,.537713,.196072,.405133,-.209545,.547999,.21605,.423845,-.220724,.55759,.237484,.443777,-.231518,.566246,.26039,.464824,-.242035,.574326,.284835,.486635,-.251898,.58037,.310518,.51012,-.261304,.58568,.337678,.535301,-.270384,.590197,.366242,.559193,-.27841,.590569,.395873,.583544,-.285325,.588161,.426857,.608834,-.291113,.584249,.459477,.635753,-.294882,.57763,.494734,.664367,-.297088,.569479,.532023,.689688,-.297364,.555064,.569629,.715732,-.295949,.539522,.608124,.741307,-.292259,.521613,.646231,.764949,-.287063,.49969,.684938,.788599,-.28012,.476747,.723548,.81048,-.27153,.45116,.761135,.831372,-.261289,.424101,.798916,.850092,-.249559,.39443,.835952,.867777,-.236348,.363849,.871606,.884632,-.221569,.332477,.907843,.90047,-.20618,.300667,.944187,.914524,-.188771,.266552,.981371,.926892,-.168362,.232349,1.01841,.937951,-.146761,.199359,1.05308,.947236,-.123813,.1675,1.0839,.954367,-.099984,.136166,1.11047,.963907,-.0759278,.103808,1.13414,.976218,-.0511367,.0697061,1.15575,.988772,-.0267415,.0352529,1.17531,.999888,-520778e-9,289926e-9,1.19389,.263546,-883274e-11,.441896,526783e-11,.262352,-221849e-9,.439889,132311e-9,.262325,-886683e-9,.439848,528824e-9,.26228,-.00199476,.439765,.00118975,.262372,-.00354671,.439922,.00211568,.26239,-.00554141,.439941,.00330652,.262412,-.00797888,.439961,.00476346,.262453,-.0108584,.440002,.00648818,.262528,-.0141788,.440085,.0084835,.262615,-.017938,.440166,.0107533,.262744,-.0221346,.440291,.0133044,.262939,-.026762,.440493,.0161445,.263277,-.0317573,.440889,.0192974,.26368,-.0371832,.441338,.0227699,.264106,-.0430371,.441753,.0265698,.264624,-.0493035,.442227,.0307178,.265378,-.0558669,.442985,.0352616,.266253,-.0628718,.443795,.0401968,.267478,-.0701569,.445008,.04559,.269062,-.077845,.446599,.0514539,.270926,-.0857941,.448349,.0578382,.273693,-.0940773,.451221,.0648363,.276746,-.102704,.454097,.0724389,.281693,-.111735,.459517,.0808744,.287335,-.121004,.46531,.0901551,.29448,-.130734,.472605,.100371,.30257,-.140777,.480251,.111644,.312465,-.15111,.489444,.124111,.324856,-.16189,.500919,.137979,.33774,-.172946,.511317,.153163,.35255,-.184152,.522684,.169817,.367786,-.19522,.53248,.187886,.385474,-.20632,.543326,.207634,.404976,-.217744,.554109,.229165,.425203,-.228691,.563395,.252068,.446704,-.239299,.571565,.276471,.468951,-.249348,.577935,.302323,.493487,-.258933,.584309,.329882,.517861,-.268009,.58773,.358525,.543309,-.276238,.589612,.388585,.569704,-.28356,.589294,.419787,.594871,-.289497,.585137,.452114,.622555,-.294452,.580356,.486466,.651167,-.296918,.57185,.523079,.677332,-.297647,.558428,.5611,.703718,-.296321,.542232,.599592,.730262,-.293339,.524541,.639138,.754304,-.288036,.502691,.677978,.778051,-.281018,.479212,.716537,.801557,-.272414,.454071,.75586,.822559,-.262419,.425952,.794477,.843051,-.250702,.397313,.832664,.86232,-.237264,.366534,.869876,.879044,-.222716,.334816,.906973,.896362,-.206827,.303143,.943558,.910342,-.189659,.269699,.979759,.924119,-.171108,.236411,1.01718,.935374,-.149579,.202224,1.05289,.944295,-.126295,.16989,1.08496,.952227,-.101511,.138089,1.11256,.962041,-.0766392,.105053,1.1375,.97528,-.0511967,.070329,1.15983,.988476,-.025463,.0351268,1.17987,.999962,286808e-10,145564e-10,1.19901,.227089,-841413e-11,.404216,472707e-11,.239725,-215083e-9,.426708,120833e-9,.239904,-860718e-9,.427028,483555e-9,.239911,-.00193661,.427039,.00108806,.239914,-.00344276,.42704,.00193457,.239933,-.00537907,.427064,.00302363,.239944,-.00774482,.427065,.00435604,.239993,-.01054,.427122,.00593398,.240052,-.0137626,.427179,.00775987,.240148,-.0174115,.427279,.00983854,.240278,-.021484,.42741,.0121763,.240472,-.0259729,.427618,.0147827,.240839,-.0308131,.428086,.0176837,.241201,-.0360893,.428482,.0208775,.241626,-.0417723,.428907,.0243821,.242207,-.0478337,.42952,.0282228,.24298,-.0542199,.430332,.0324333,.243881,-.0610015,.431222,.0370252,.245123,-.0680874,.432512,.0420535,.24667,-.0755482,.434088,.0475414,.248779,-.0832873,.436323,.0535542,.251665,-.0913546,.439509,.0601716,.255305,-.0998489,.443478,.0674282,.260049,-.108576,.448713,.0754673,.266192,-.117754,.455524,.084339,.273158,-.127294,.4627,.0941683,.282131,-.137311,.472068,.10515,.293332,-.147736,.483565,.117402,.304667,-.158357,.493702,.130824,.317785,-.169274,.504708,.145724,.333245,-.180595,.517107,.16215,.349843,-.191892,.528849,.180149,.367944,-.203168,.540301,.199746,.387579,-.214443,.551514,.221047,.408247,-.225624,.560906,.243981,.43014,-.236422,.56959,.268513,.452669,-.24654,.576098,.294409,.476196,-.256157,.580925,.322002,.501157,-.265289,.584839,.351052,.527632,-.273671,.587614,.3812,.555754,-.281254,.589119,.412994,.581682,-.287448,.585204,.445498,.608196,-.292614,.579006,.479505,.635661,-.296068,.571297,.514643,.664999,-.297395,.560855,.552213,.691039,-.296645,.544525,.591365,.7179,-.293785,.526535,.630883,.744059,-.289089,.50545,.670932,.76863,-.282239,.482514,.710904,.793273,-.273688,.457246,.750259,.814731,-.26328,.428872,.78948,.835603,-.251526,.399384,.828597,.85489,-.238339,.368811,.866892,.872828,-.223607,.336617,.90563,.889462,-.207538,.303997,.943538,.904929,-.190297,.270812,.980591,.919101,-.172034,.237453,1.01935,.930536,-.152058,.204431,1.05498,.941223,-.129515,.172495,1.08717,.94982,-.104263,.140175,1.11551,.960592,-.0781944,.106465,1.14098,.974629,-.051688,.0711592,1.16418,.98811,-.0253929,.0354432,1.18465,1.00004,804378e-9,-330876e-9,1.20462,.214668,-821282e-11,.406619,433582e-11,.218053,-208144e-9,.413025,109887e-9,.217987,-832212e-9,.412901,439362e-9,.217971,-.00187246,.412876,988623e-9,.217968,-.00332855,.41286,.00175772,.217985,-.00520055,.412882,.00274729,.218014,-.00748814,.412916,.00395842,.218054,-.0101901,.412957,.00539274,.218106,-.0133057,.413005,.00705348,.218217,-.0168342,.413139,.00894581,.218338,-.0207707,.413258,.0110754,.21855,-.0251001,.413509,.0134551,.218913,-.0297861,.413992,.0161081,.219265,-.0348956,.414383,.0190307,.219696,-.0403909,.414839,.0222458,.220329,-.0462003,.415567,.025792,.220989,-.0524208,.41621,.0296637,.222027,-.058948,.417385,.0339323,.223301,-.0658208,.418779,.0386055,.224988,-.0730347,.420665,.0437355,.227211,-.0805274,.423198,.0493844,.230131,-.088395,.426566,.0556135,.233908,-.0966208,.43091,.0624829,.239092,-.105223,.437148,.0701636,.245315,-.11424,.444302,.0786949,.253166,-.12368,.453262,.0882382,.262374,-.133569,.463211,.0988682,.273145,-.143836,.474271,.110727,.285512,-.154577,.4863,.123945,.299512,-.165501,.498817,.138581,.314287,-.176698,.510341,.154676,.331083,-.188066,.522583,.172459,.349615,-.199597,.534879,.191979,.369318,-.210843,.546083,.21309,.390377,-.222068,.5562,.235998,.412411,-.233059,.564704,.260518,.435715,-.24357,.572314,.286795,.461196,-.253356,.579395,.314559,.485587,-.262362,.581985,.343581,.511908,-.270895,.584347,.374367,.539798,-.278452,.58505,.406015,.567974,-.284877,.583344,.439168,.594303,-.290124,.577348,.473005,.622951,-.294183,.570751,.508534,.652404,-.296389,.561541,.544764,.679291,-.296605,.546426,.582927,.706437,-.294095,.528599,.622681,.734485,-.28978,.508676,.663567,.758841,-.283363,.484768,.704092,.78537,-.275015,.460434,.745101,.807315,-.264689,.432166,.784712,.8271,-.252597,.401807,.824241,.849191,-.239154,.371458,.863803,.867046,-.224451,.338873,.903063,.8852,-.208342,.306175,.942763,.901771,-.190684,.272759,.981559,.915958,-.172105,.239306,1.02048,.928046,-.152214,.206071,1.05765,.939961,-.130247,.17367,1.08999,.948711,-.10672,.142201,1.11829,.959305,-.0808688,.108454,1.14467,.973009,-.0539145,.0728109,1.16839,.987631,-.0262947,.0360625,1.19004,.999978,.00132758,-559424e-9,1.21058,.193925,-793421e-11,.391974,392537e-11,.196746,-200315e-9,.397675,991033e-10,.19667,-801099e-9,.397521,396342e-9,.196633,-.00180246,.397445,891829e-9,.196654,-.00320443,.397482,.00158582,.196659,-.00500647,.39748,.00247867,.196683,-.0072086,.397506,.00357167,.196728,-.00981001,.397562,.00486675,.196792,-.0128096,.397633,.00636707,.19689,-.0162055,.397746,.00807752,.197017,-.0199943,.397884,.0100052,.19729,-.024139,.39827,.0121691,.197583,-.0286671,.398639,.0145755,.197927,-.0335858,.399034,.0172355,.198383,-.0388806,.399554,.0201718,.199002,-.0444736,.400289,.0234194,.199739,-.0504583,.401111,.026984,.200784,-.056729,.402349,.0309217,.202075,-.0633643,.403841,.0352496,.203898,-.0703247,.406076,.0400313,.206199,-.0775565,.408841,.0453282,.209252,-.085184,.41259,.0511794,.213638,-.0931994,.418288,.0577459,.21881,-.101617,.424681,.0650508,.225642,-.11052,.433429,.0732759,.233717,-.119772,.442897,.0824683,.242823,-.129505,.452888,.0927484,.254772,-.139906,.466407,.104417,.266603,-.150402,.477413,.117211,.28073,-.161395,.490519,.131598,.295399,-.172465,.50201,.147407,.312705,-.183982,.515311,.165031,.331335,-.195532,.52786,.184336,.351037,-.206971,.5392,.205361,.372175,-.218117,.54941,.228043,.394548,-.229327,.558642,.25267,.419598,-.240052,.567861,.279071,.443922,-.249937,.573332,.306882,.471495,-.259407,.58013,.33661,.496769,-.267749,.580564,.367328,.524951,-.275524,.581696,.399753,.55318,-.282148,.579885,.433134,.581577,-.287533,.575471,.467534,.609231,-.291612,.567445,.502943,.637478,-.293911,.557657,.53871,.667795,-.295096,.546535,.576568,.694272,-.294073,.529561,.614929,.722937,-.290386,.510561,.655909,.749682,-.284481,.487846,.697663,.774754,-.276188,.462487,.738515,.799301,-.266215,.43481,.779802,.820762,-.254116,.404879,.820045,.843231,-.240393,.374559,.860294,.861857,-.225503,.341582,.900965,.880815,-.209382,.308778,.941727,.89766,-.19155,.275232,.980916,.912926,-.172346,.240938,1.02162,.926391,-.151799,.207223,1.0597,.938429,-.129968,.17484,1.09291,.947834,-.10651,.142984,1.12248,.958432,-.0824098,.109902,1.149,.972402,-.0565242,.0744454,1.1733,.987191,-.028427,.0373794,1.19538,.999975,385685e-10,-4203e-8,1.21676,.178114,-766075e-11,.385418,354027e-11,.176074,-191966e-9,.381002,887135e-10,.17601,-767549e-9,.380861,354715e-9,.17598,-.00172696,.380798,798168e-9,.175994,-.00307012,.380824,.00141928,.176017,-.00479684,.380858,.00221859,.176019,-.00690648,.380839,.00319714,.176072,-.00939888,.380913,.0043572,.176131,-.0122726,.380979,.005702,.176239,-.0155264,.38112,.00723689,.176371,-.0191551,.381272,.00896907,.176638,-.023117,.381669,.0109194,.176912,-.0274633,.382015,.0130903,.177279,-.032173,.382476,.0154949,.17774,-.0372219,.383041,.0181669,.178344,-.0426132,.38378,.0211209,.179153,-.0483309,.384773,.0243899,.180197,-.0543447,.386076,.0280062,.181581,-.0607122,.387809,.032004,.18344,-.0673855,.390205,.036453,.186139,-.0743989,.393944,.0414162,.189432,-.0817731,.39832,.0469394,.193795,-.0895464,.404188,.0531442,.199641,-.0978264,.4121,.0601374,.206679,-.106499,.421425,.0680078,.214865,-.115654,.431504,.076919,.224406,-.125268,.442526,.0868835,.235876,-.135475,.455465,.0981875,.248335,-.146023,.4681,.110759,.262868,-.157016,.482069,.124885,.278962,-.168245,.496182,.140645,.295082,-.17958,.507401,.157838,.313738,-.191227,.520252,.17695,.333573,-.202718,.531708,.197817,.356433,-.214424,.544509,.220785,.378853,-.225492,.55373,.245306,.402717,-.236236,.561348,.271593,.428375,-.246568,.568538,.299776,.454724,-.255941,.573462,.329433,.482291,-.264511,.576356,.360598,.509706,-.272129,.576446,.393204,.538805,-.278979,.575298,.427227,.568919,-.284528,.572154,.462157,.596804,-.288801,.564691,.497997,.625987,-.291334,.555134,.534467,.656414,-.292722,.545051,.571736,.683916,-.292185,.528813,.610158,.711809,-.290043,.51106,.649061,.739547,-.285246,.490103,.690081,.766914,-.277647,.465523,.732554,.791375,-.267603,.437718,.773982,.814772,-.256109,.40882,.81609,.836691,-.242281,.377823,.856849,.856984,-.227155,.34496,.898363,.876332,-.210395,.311335,.939471,.894988,-.192612,.277703,.980799,.911113,-.173236,.243019,1.02215,.924092,-.152258,.209037,1.06139,.936828,-.129575,.175909,1.09635,.946869,-.10594,.143852,1.12707,.958284,-.081318,.110289,1.15419,.972325,-.0556133,.0747232,1.17909,.986878,-.0297899,.0383149,1.20163,.999936,-.00197169,912402e-9,1.22338,.151174,-720365e-11,.351531,309789e-11,.155594,-18279e-8,.361806,78608e-9,.156099,-731569e-9,.362982,314615e-9,.156053,-.00164578,.362869,707845e-9,.156093,-.0029261,.362961,.00125884,.156099,-.00457155,.362959,.00196783,.15612,-.00658224,.362982,.00283622,.156168,-.00895774,.363048,.00386625,.156221,-.0116962,.363101,.00506109,.156324,-.0147973,.363241,.00642675,.156476,-.0182503,.363448,.00797175,.156731,-.0220266,.36384,.00971484,.156994,-.026176,.364179,.0116575,.157341,-.0306701,.36462,.0138207,.157867,-.0354591,.365364,.0162356,.15846,-.0406141,.366111,.0189092,.159308,-.0460519,.367248,.021885,.160426,-.0518096,.368767,.0252004,.161877,-.0578906,.370745,.0288825,.163995,-.0642812,.373831,.0330139,.16655,-.0710067,.377366,.0376283,.170237,-.0781522,.382799,.0428493,.175096,-.0857172,.389915,.0487324,.181069,-.0938025,.398487,.0554214,.188487,-.102363,.408799,.0630189,.197029,-.111343,.419991,.071634,.206684,-.120812,.431455,.0812797,.218698,-.131033,.445746,.0923651,.230726,-.141373,.457471,.104545,.245516,-.152387,.472388,.118449,.261551,-.163628,.486671,.133923,.277437,-.174814,.49762,.150849,.296662,-.186713,.51162,.169924,.31795,-.198513,.525435,.190848,.339422,-.210119,.536267,.213504,.362143,-.221354,.545982,.237947,.387198,-.23224,.555364,.264427,.412349,-.24257,.561489,.292519,.439274,-.252284,.566903,.322561,.466779,-.261023,.569614,.353952,.496011,-.26899,.571589,.387278,.524964,-.275498,.570325,.421356,.556518,-.281449,.568792,.457314,.584363,-.285526,.560268,.493199,.614214,-.28844,.55205,.530276,.645684,-.289777,.541906,.56855,.673446,-.289722,.526464,.606927,.701924,-.287792,.509872,.645945,.73037,-.284315,.490649,.685564,.757405,-.278804,.467964,.726511,.784025,-.269543,.441468,.768601,.808255,-.258117,.41216,.811321,.830739,-.244728,.380606,.853496,.851914,-.229428,.348111,.895374,.872586,-.212508,.314732,.937674,.891581,-.194025,.280338,.979869,.907641,-.174711,.245203,1.02253,.922233,-.153509,.21077,1.06371,.935878,-.130418,.177399,1.09972,.946338,-.105558,.144507,1.13124,.957265,-.080059,.110508,1.15973,.971668,-.0539766,.0742311,1.18515,.9866,-.0277101,.0375224,1.20858,1.00021,-515531e-9,135226e-9,1.23135,.137468,-686011e-11,.345041,273315e-11,.13703,-173378e-9,.343936,690761e-10,.136986,-693048e-9,.34383,276126e-9,.136964,-.00155931,.343761,621337e-9,.137003,-.00277211,.343863,.00110494,.137012,-.00433103,.343868,.00172744,.137043,-.00623606,.343916,.00249022,.13709,-.0084868,.343986,.00339559,.137145,-.0110814,.344045,.00444687,.137242,-.0140187,.344177,.00565007,.137431,-.0172713,.344491,.00701868,.137644,-.0208605,.344805,.00856042,.13791,-.024792,.345172,.0102863,.138295,-.0290461,.345734,.0122185,.138764,-.0335957,.346371,.0143771,.139415,-.038467,.347298,.0167894,.140272,-.0436176,.348527,.0194895,.141457,-.0491016,.350276,.0225043,.14303,-.0548764,.352646,.0258962,.145289,-.0610096,.356206,.0297168,.148502,-.0674777,.361488,.0340562,.152188,-.074345,.367103,.0389534,.157359,-.0817442,.375247,.0445541,.16379,-.0896334,.385064,.0509535,.171376,-.098005,.396082,.0582611,.179901,-.106817,.407418,.06654,.189892,-.116239,.420031,.075994,.201838,-.12627,.434321,.0867239,.214311,-.136701,.447631,.0987517,.228902,-.147616,.462046,.112353,.245107,-.158871,.476942,.127605,.262292,-.170261,.490285,.144469,.281215,-.182017,.503783,.163282,.301058,-.193729,.515505,.183873,.322752,-.205512,.52682,.206466,.347547,-.217214,.539473,.231194,.370969,-.227966,.546625,.257288,.397533,-.238555,.55472,.285789,.42398,-.248278,.559468,.315746,.452928,-.257422,.564095,.347724,.482121,-.265306,.565426,.380922,.510438,-.272043,.563205,.415639,.541188,-.277614,.561087,.451702,.571667,-.281927,.554922,.48845,.602432,-.285015,.546838,.526442,.634126,-.286512,.537415,.564896,.662816,-.286388,.522906,.604037,.692411,-.284734,.507003,.643795,.720946,-.281297,.488398,.68298,.748293,-.276262,.466353,.723466,.776931,-.269978,.443573,.764565,.801065,-.260305,.415279,.805838,.825843,-.247426,.384773,.849985,.84807,-.232437,.352555,.893174,.869122,-.215806,.318642,.936564,.888963,-.197307,.28381,.980253,.905547,-.177203,.247888,1.02463,.918554,-.155542,.212904,1.06714,.931395,-.131948,.1787,1.10451,.941749,-.106723,.145902,1.13694,.954551,-.0804939,.111193,1.1666,.970279,-.0534239,.0744697,1.19249,.986117,-.0257452,.0368788,1.21665,.999938,.00190634,-.0010291,1.23981,.118493,-647439e-11,.32272,23772e-10,.118765,-163023e-9,.323456,598573e-10,.118772,-65212e-8,.323477,239447e-9,.118843,-.00146741,.323657,538881e-9,.118804,-.00260846,.323553,95826e-8,.118826,-.00407576,.323595,.00149845,.118846,-.00586826,.323617,.00216047,.118886,-.00798578,.32367,.00294679,.118947,-.0104273,.323753,.00386124,.119055,-.0131909,.323922,.00490999,.119241,-.0162444,.324251,.00610804,.11944,-.0196339,.324544,.00745805,.119739,-.0233378,.325026,.00897805,.12011,-.0273179,.325586,.0106895,.120571,-.0316143,.326231,.0126073,.12124,-.0361939,.327264,.0147654,.122162,-.0410511,.328733,.0172001,.123378,-.0462233,.330659,.0199375,.125183,-.0517109,.333754,.0230498,.127832,-.0575652,.338507,.026597,.130909,-.0637441,.343666,.0306345,.135221,-.0704302,.351063,.035273,.14082,-.0776364,.360604,.0406137,.146781,-.0852293,.369638,.0466788,.155121,-.0935351,.3827,.0537628,.16398,-.102234,.39522,.0617985,.173926,-.111465,.40793,.07097,.185137,-.121296,.42105,.0813426,.19826,-.13169,.435735,.0931596,.212938,-.142614,.450932,.106547,.229046,-.153884,.465726,.121575,.246246,-.165382,.479461,.138286,.264637,-.176806,.492106,.15666,.284959,-.188793,.504774,.17728,.308157,-.200763,.518805,.19988,.330951,-.21239,.528231,.224293,.3549,-.223521,.536376,.250541,.381502,-.234169,.544846,.278902,.409529,-.244077,.551717,.309227,.437523,-.253363,.55517,.341426,.467624,-.261659,.557772,.37518,.497268,-.268498,.556442,.41007,.528294,-.274018,.553915,.446445,.559053,-.278169,.549153,.483779,.589329,-.281229,.539878,.522249,.622503,-.282902,.53162,.561754,.652382,-.282815,.518119,.601544,.681847,-.281247,.502187,.641574,.712285,-.277986,.484824,.682633,.740094,-.273017,.463483,.723426,.768478,-.266692,.441299,.763747,.794556,-.258358,.415238,.805565,.819408,-.248807,.386912,.847254,.843411,-.236214,.356165,.891091,.862397,-.219794,.320562,.936174,.883113,-.201768,.285322,.982562,.90023,-.181672,.249713,1.02862,.915192,-.159279,.214546,1.07163,.928458,-.134725,.180285,1.10995,.94069,-.10913,.147119,1.14354,.953409,-.0821315,.112492,1.17372,.969537,-.0542677,.0752014,1.20043,.985612,-.0259096,.0370361,1.22528,.999835,.00298198,-.00151801,1.24959,.10097,-602574e-11,.300277,202619e-11,.101577,-152164e-9,.302077,511662e-10,.101572,-608889e-9,.302066,204751e-9,.101566,-.00136997,.302047,460753e-9,.101592,-.00243557,.302114,819497e-9,.101608,-.0038053,.30214,.00128154,.101627,-.00547906,.30216,.0018483,.101669,-.00745647,.302224,.00252223,.101732,-.00973615,.302318,.00330716,.101844,-.0123097,.302513,.00421061,.102025,-.0151681,.30285,.00524481,.102224,-.0183334,.303166,.0064154,.102515,-.0217819,.303654,.00774063,.102886,-.0255067,.304243,.0092398,.103395,-.029514,.305089,.0109339,.104109,-.0337912,.306301,.0128561,.105074,-.0383565,.30798,.0150338,.10654,-.0432132,.310726,.0175228,.108478,-.0484244,.314351,.0203648,.111015,-.0539339,.319032,.0236325,.114682,-.0598885,.32605,.0274188,.11911,-.0663375,.334109,.0317905,.124736,-.0733011,.344013,.0368502,.131479,-.0807744,.355358,.0427104,.139283,-.0888204,.367614,.0494788,.148054,-.0973394,.380072,.0572367,.159037,-.10665,.395678,.0662704,.169794,-.116221,.40795,.0763192,.18314,-.126632,.423546,.087956,.197515,-.137383,.438213,.101042,.213514,-.148641,.453248,.115827,.23065,-.160117,.46688,.132283,.249148,-.171807,.479962,.150644,.270219,-.183695,.494618,.171073,.292338,-.195574,.506937,.193378,.314999,-.207205,.516463,.217585,.340991,-.218955,.528123,.24428,.367982,-.229917,.537025,.272784,.39432,-.239737,.541627,.302742,.423364,-.249048,.546466,.335112,.453751,-.257329,.549466,.369032,.48416,-.264623,.549503,.404577,.515262,-.270411,.547008,.441337,.547036,-.274581,.542249,.479162,.576614,-.277266,.533015,.517904,.611143,-.279144,.525512,.558508,.640989,-.279001,.51154,.598995,.671182,-.277324,.495641,.639935,.700848,-.273908,.477526,.681017,.729862,-.269063,.457955,.722764,.758273,-.262282,.434846,.764349,.784121,-.254281,.409203,.806206,.809798,-.24505,.382694,.848617,.834953,-.233861,.354034,.892445,.856817,-.221308,.321764,.936263,.877609,-.205996,.288118,.982401,.897489,-.186702,.253277,1.02975,.913792,-.164618,.217963,1.07488,.92785,-.140023,.183221,1.11487,.940378,-.11328,.149385,1.14947,.95273,-.0853958,.114152,1.1807,.969059,-.0568698,.0769845,1.20912,.985574,-.0276502,.0381186,1.23498,.999943,.00239052,-.00126861,1.25987,.0852715,-560067e-11,.279021,171162e-11,.0854143,-140871e-9,.279483,430516e-10,.0854191,-563385e-9,.2795,172184e-9,.0854188,-.00126753,.279493,387464e-9,.0854229,-.00225337,.279501,68918e-8,.0854443,-.00352086,.279549,.00107803,.0854697,-.00506962,.279591,.00155536,.0855093,-.00689873,.279652,.00212354,.0855724,-.00900821,.279752,.00278703,.0856991,-.0113799,.280011,.0035551,.085855,-.0140314,.280297,.00443449,.0860682,-.016963,.280682,.00543636,.086344,-.0201438,.281159,.0065788,.0867426,-.0235999,.281886,.00787977,.087239,-.0273069,.282745,.0093606,.0879815,-.031269,.284139,.011056,.0891258,-.035531,.28647,.0130065,.0906909,-.0400947,.289708,.0152495,.0927624,-.0449638,.293904,.0178454,.0958376,-.0502427,.300471,.0208915,.0995827,-.0559514,.30806,.0244247,.104526,-.0622152,.317874,.0285721,.110532,-.0690046,.329332,.0334227,.117385,-.0763068,.341217,.0390466,.12522,-.084184,.353968,.0455786,.134037,-.0925248,.366797,.0530773,.144014,-.101487,.380209,.0617424,.156013,-.111273,.395956,.071777,.168872,-.121431,.41053,.0830905,.183089,-.132105,.425073,.0959341,.198763,-.143286,.439833,.110448,.216159,-.154841,.454507,.126769,.234859,-.166588,.468368,.14495,.255879,-.178626,.482846,.165233,.27677,-.190218,.493489,.187217,.301184,-.202227,.506549,.211659,.325852,-.213764,.5158,.237922,.352824,-.22487,.525442,.26632,.380882,-.235246,.532487,.296691,.410137,-.244847,.537703,.329179,.439787,-.253122,.540361,.363135,.472291,-.260517,.542734,.399222,.501856,-.266519,.538826,.436352,.534816,-.270905,.535152,.474505,.565069,-.273826,.525979,.513988,.597154,-.275333,.516394,.554852,.630473,-.275314,.506206,.596592,.660574,-.273323,.489769,.638117,.692015,-.270008,.472578,.680457,.720647,-.265001,.452134,.723008,.750528,-.258311,.430344,.765954,.777568,-.250046,.405624,.809012,.80387,-.240114,.378339,.852425,.828439,-.228737,.349877,.895346,.851472,-.216632,.318968,.940695,.873906,-.202782,.287489,.987235,.89467,-.187059,.254394,1.03348,.912281,-.168818,.221294,1.07812,.927358,-.146494,.18675,1.11928,.940385,-.120009,.152322,1.15609,.952672,-.0917183,.117514,1.18875,.968496,-.0620321,.0797405,1.21821,.985236,-.0314945,.0402383,1.24523,.99998,-575153e-9,110644e-9,1.27133,.0702429,-512222e-11,.255273,140947e-11,.0702981,-128826e-9,.255469,354488e-10,.0703691,-515562e-9,.255727,141874e-9,.0703805,-.00116,.255754,31929e-8,.0703961,-.00206224,.255813,567999e-9,.0704102,-.00322223,.255839,88871e-8,.0704298,-.00463928,.255863,.00128272,.0704759,-.00631375,.255953,.00175283,.0705434,-.00824317,.256079,.00230342,.0706693,-.010412,.25636,.0029443,.0708189,-.0128439,.256647,.00368031,.0710364,-.0155177,.257084,.00452614,.0713223,-.0184374,.257637,.00549706,.0717182,-.0216002,.258416,.00661246,.072321,-.0249966,.259699,.00790147,.0731446,-.0286566,.261475,.0093884,.0743352,-.0325888,.264132,.0111186,.0760676,-.036843,.26815,.013145,.078454,-.0414292,.273636,.0155251,.0818618,-.0464634,.281653,.0183525,.0857382,-.0519478,.289992,.0216642,.0908131,-.0579836,.30066,.0255956,.0967512,-.0645124,.312204,.0301954,.103717,-.0716505,.325001,.0356017,.111596,-.0793232,.338129,.041896,.120933,-.087645,.352853,.0492447,.130787,-.096492,.366192,.0576749,.142311,-.105973,.380864,.0673969,.155344,-.116182,.396575,.0785899,.169535,-.126815,.411443,.0912377,.185173,-.138015,.426256,.105607,.201755,-.149325,.439607,.121551,.221334,-.161207,.455467,.139608,.241461,-.173162,.469096,.159591,.26294,-.18504,.481014,.18156,.286776,-.196881,.493291,.205781,.311596,-.208311,.503556,.231819,.338667,-.219671,.513268,.260274,.366021,-.230451,.519414,.290862,.395875,-.240131,.526766,.323196,.425564,-.248566,.52905,.357071,.457094,-.256195,.530796,.393262,.488286,-.262331,.528703,.430797,.522291,-.267141,.52727,.470231,.554172,-.270411,.519848,.510477,.586427,-.271986,.510307,.551594,.619638,-.27192,.499158,.593849,.650656,-.269817,.483852,.636314,.68284,-.266267,.467515,.679679,.714356,-.26113,.44931,.723884,.742717,-.254067,.425789,.767245,.770894,-.245652,.401144,.811819,.797358,-.235554,.374224,.856315,.823377,-.223896,.346167,.901077,.847456,-.210865,.316056,.946502,.870697,-.196574,.284503,.993711,.891068,-.180814,.251628,1.04134,.909267,-.163314,.219065,1.08609,.925653,-.143304,.186446,1.12702,.940017,-.121322,.153416,1.16371,.952398,-.0973872,.120334,1.19712,.967568,-.0698785,.08352,1.22791,.984772,-.0390031,.0439209,1.25672,1.00026,-.0070087,.00315668,1.28428,.0556653,-459654e-11,.227325,112556e-11,.0565238,-116382e-9,.230826,284985e-10,.0565717,-465666e-9,.231026,114036e-9,.0565859,-.00104773,.231079,256656e-9,.0565761,-.00186255,.231025,45663e-8,.0565913,-.00291002,.231058,714664e-9,.0566108,-.00418998,.231085,.00103224,.0566532,-.00570206,.231169,.00141202,.0567473,-.00743666,.231417,.00186018,.0568567,-.00940298,.231661,.00238264,.0569859,-.0115991,.231895,.00298699,.0572221,-.0140096,.232456,.00368957,.057519,-.0166508,.233096,.00450303,.0579534,-.01951,.234094,.00544945,.0585922,-.0225991,.235629,.00655564,.0595647,-.0259416,.238106,.00785724,.0609109,-.0295661,.241557,.00939127,.0628751,-.0335126,.246652,.0112198,.0656908,-.0378604,.254091,.0134168,.0691347,-.0426543,.262666,.0160374,.0732165,-.0478967,.272029,.0191514,.0782863,-.0536716,.283007,.0228597,.0843973,-.0600683,.295732,.0272829,.0913598,-.0670095,.308779,.032484,.0994407,-.0745516,.322886,.0385886,.108189,-.082712,.336408,.0457133,.118574,-.0914927,.351692,.0539832,.129989,-.100854,.366502,.0635162,.142722,-.110837,.381675,.0744386,.156654,-.121353,.3963,.0868483,.172151,-.132414,.411477,.100963,.188712,-.143809,.42508,.116795,.208093,-.155765,.441328,.134715,.227936,-.167608,.454328,.154396,.249495,-.179579,.467235,.176179,.27362,-.191488,.480248,.200193,.296371,-.202618,.487886,.225775,.324234,-.214133,.499632,.25441,.353049,-.225212,.509532,.285077,.381785,-.234875,.514265,.317047,.414038,-.244205,.521282,.351874,.445251,-.252145,.522931,.388279,.476819,-.258433,.520947,.425825,.509209,-.263411,.517669,.465104,.542759,-.266732,.512841,.505741,.574822,-.268263,.503317,.547611,.609324,-.268489,.493035,.590953,.641772,-.266941,.478816,.63488,.674049,-.263297,.462863,.679072,.705071,-.257618,.442931,.723487,.734709,-.250625,.421299,.768708,.763704,-.24179,.397085,.814375,.791818,-.231115,.370577,.859907,.817439,-.21922,.34232,.906715,.843202,-.205658,.312627,.953943,.866639,-.190563,.280933,1.00185,.888129,-.173978,.248393,1.05105,.907239,-.155485,.216007,1.09704,.923893,-.134782,.183233,1.13857,.938882,-.11249,.150376,1.17539,.952464,-.0890706,.117177,1.20924,.968529,-.0646523,.0813095,1.24055,.984763,-.038606,.0439378,1.27018,1.00053,-.01238,.00598668,1.29873,.0437928,-409594e-11,.204012,8.79224e-7,.0440166,-103395e-9,.205049,221946e-10,.0440529,-413633e-9,.205225,887981e-10,.0440493,-930594e-9,.2052,199858e-9,.0439884,-.00165352,.204901,355495e-9,.0440716,-.0025849,.205255,556983e-9,.0440968,-.00372222,.205311,805326e-9,.0441359,-.00506478,.205391,.00110333,.0442231,-.00660384,.205638,.00145768,.0443254,-.00835246,.205877,.00187275,.0444832,-.0102992,.20627,.00235938,.0447001,-.0124449,.206796,.0029299,.0450168,-.0147935,.207593,.0036005,.0454816,-.017336,.208819,.00439246,.0462446,-.0201156,.211036,.00533864,.0473694,-.0231568,.214388,.00646984,.0490191,-.0264941,.219357,.00783856,.0512776,-.030184,.226061,.00950182,.0541279,-.0342661,.234094,.0115156,.0578989,-.0388539,.244297,.0139687,.0620835,-.0438735,.254457,.0169015,.0673497,-.04951,.266706,.0204554,.0731759,-.0556263,.278753,.0246606,.0803937,-.0624585,.29309,.0297126,.0879287,-.0697556,.305856,.0355868,.0970669,-.0778795,.321059,.0425768,.106508,-.0863541,.333873,.05056,.11776,-.0955935,.349008,.0598972,.130081,-.105438,.363776,.0706314,.144454,-.115899,.380112,.0828822,.1596,-.126827,.394843,.0967611,.176097,-.138161,.409033,.112381,.194726,-.149904,.424257,.129952,.213944,-.161675,.436945,.149333,.235516,-.173659,.450176,.170892,.260564,-.185963,.466305,.194984,.285183,-.197582,.477328,.220805,.311095,-.208697,.486566,.248694,.338924,-.219519,.494811,.279015,.369757,-.229766,.504065,.311725,.3996,-.238879,.507909,.345844,.430484,-.246802,.509805,.381749,.46413,-.253924,.511436,.420251,.497077,-.259319,.508787,.459957,.530434,-.263297,.50394,.501356,.565725,-.265619,.49804,.544252,.599254,-.265842,.487346,.587856,.631251,-.263978,.472975,.631969,.663972,-.26043,.457135,.677471,.697724,-.255358,.439844,.723744,.727725,-.248308,.417872,.770653,.756417,-.239181,.39273,.817357,.785419,-.22814,.367839,.864221,.81266,-.215681,.339449,.912701,.839391,-.201623,.309279,.962419,.86366,-.185624,.278029,1.0122,.885028,-.16797,.245294,1.06186,.904639,-.148336,.212689,1.10934,.922048,-.12637,.179616,1.15063,.936952,-.102928,.146749,1.18885,.951895,-.0785268,.112733,1.22352,.967198,-.0530153,.0760056,1.25681,.984405,-.02649,.0383183,1.28762,1.00021,70019e-8,-20039e-8,1.31656,.0325964,-355447e-11,.176706,6.55682e-7,.0329333,-899174e-10,.178527,165869e-10,.0329181,-359637e-9,.178453,663498e-10,.0329085,-808991e-9,.178383,149332e-9,.0329181,-.00143826,.178394,265873e-9,.0329425,-.00224678,.178517,416597e-9,.0329511,-.00323575,.17849,603299e-9,.033011,-.00439875,.178695,829422e-9,.0330733,-.00574059,.178843,.00109908,.0331857,-.00725896,.179176,.00141933,.0333445,-.00895289,.179618,.0017999,.0335674,-.0108219,.180238,.00225316,.033939,-.0128687,.181417,.00279765,.0345239,-.015114,.183395,.0034564,.0354458,-.017596,.186616,.00425864,.0368313,-.0203524,.191547,.00524936,.0386115,-.0234105,.197508,.00647033,.0410303,-.0268509,.205395,.00798121,.0442245,-.0307481,.215365,.0098557,.0478659,-.0350863,.225595,.0121417,.0522416,-.0399506,.236946,.0149385,.0574513,-.045357,.249442,.0183189,.0631208,-.0512863,.261222,.0223644,.0701124,-.0579273,.275418,.0272418,.0777331,-.0650652,.288989,.0329458,.0862709,-.0728813,.302546,.0396819,.096103,-.081363,.317164,.04757,.106976,-.0904463,.331733,.0567012,.119175,-.100105,.34661,.067202,.132919,-.110375,.362249,.0792588,.147727,-.121115,.376978,.0928672,.163618,-.132299,.390681,.108228,.182234,-.143887,.406571,.125502,.201809,-.155827,.42042,.144836,.225041,-.168357,.438411,.166706,.247621,-.18004,.450368,.189909,.27097,-.191536,.460083,.215251,.296658,-.203024,.469765,.243164,.325892,-.214056,.481837,.273388,.35406,-.224104,.487474,.305344,.384372,-.233489,.492773,.339741,.41749,-.241874,.498451,.376287,.45013,-.248834,.499632,.414195,.481285,-.254658,.495233,.454077,.519183,-.259367,.496401,.496352,.551544,-.261818,.487686,.538798,.587349,-.262964,.479453,.583626,.621679,-.262128,.467709,.629451,.654991,-.258998,.452123,.67566,.686873,-.254119,.433495,.723248,.719801,-.246946,.413657,.771156,.750355,-.237709,.390366,.81989,.780033,-.226549,.364947,.868601,.809254,-.214186,.337256,.920034,.836576,-.199639,.307395,.971706,.861774,-.183169,.275431,1.02479,.885707,-.165111,.243431,1.07837,.904742,-.144363,.210921,1.12783,.915604,-.121305,.17647,1.17254,.930959,-.0962119,.143106,1.21012,.948404,-.069969,.108112,1.24474,.967012,-.0427586,.0708478,1.27718,.984183,-.0147043,.032335,1.3083,.999577,.0142165,-.00726867,1.3382,.0229227,-299799e-11,.148623,4.62391e-7,.0232194,-758796e-10,.15054,117033e-10,.0232315,-303636e-9,.15063,468397e-10,.0232354,-683189e-9,.150624,105472e-9,.0232092,-.0012136,.150445,187744e-9,.0232523,-.00189765,.150679,294847e-9,.0232828,-.00273247,.150789,428013e-9,.0233371,-.00371287,.150995,591134e-9,.0234015,-.00484794,.15118,787642e-9,.023514,-.00612877,.151562,.00102547,.023679,-.00756125,.152116,.00131351,.0239559,-.00914651,.153162,.00166594,.0244334,-.010904,.155133,.00210182,.025139,-.0128615,.158035,.00264406,.0262598,-.0150628,.162751,.00332923,.0277875,-.0175532,.168944,.00419773,.0298472,-.0203981,.176835,.00530034,.0325444,-.023655,.186686,.00669777,.0355581,-.0272982,.196248,.00842661,.0392841,-.0314457,.207352,.0105854,.0436815,-.0361157,.219279,.0132458,.0485272,-.0412932,.230728,.0164736,.0541574,-.0470337,.242994,.0203715,.0609479,-.0535002,.257042,.0250953,.0685228,-.0605409,.27102,.0306856,.0768042,-.0680553,.28406,.037193,.0864844,-.0765011,.299186,.0449795,.0969415,-.0852674,.3132,.0538316,.108478,-.0947333,.327138,.0641149,.121705,-.10481,.342345,.0759185,.136743,-.115474,.358472,.0894116,.152986,-.126536,.374067,.104562,.170397,-.138061,.388267,.121632,.191392,-.150203,.406467,.140996,.211566,-.161751,.418641,.161696,.233567,-.173407,.430418,.184557,.257769,-.185397,.44277,.210092,.28531,-.197048,.457191,.237827,.311726,-.20784,.464712,.267253,.340537,-.218345,.472539,.299332,.372921,-.228306,.482331,.333988,.402924,-.236665,.484378,.369722,.434475,-.244097,.484717,.407836,.469736,-.250547,.487093,.448465,.505045,-.25511,.485575,.490263,.540262,-.258444,.481225,.534495,.576347,-.259903,.473481,.579451,.608656,-.259572,.4603,.625604,.646679,-.257908,.450341,.674511,.679902,-.253663,.431561,.723269,.714159,-.247419,.412684,.773263,.745345,-.239122,.389388,.824182,.778248,-.228837,.365361,.876634,.807208,-.216197,.337667,.92945,.835019,-.201772,.307197,.985261,.860261,-.185291,.274205,1.04299,.877601,-.165809,.240178,1.09816,.898211,-.143897,.207571,1.14694,.915789,-.119513,.174904,1.19008,.931831,-.0932919,.141423,1.2297,.949244,-.0656528,.105603,1.26553,.967527,-.0370262,.0679551,1.29986,.984139,-.00730117,.0283133,1.33252,.999713,.0234648,-.0121785,1.36397,.0152135,-245447e-11,.122795,3.04092e-7,.0151652,-615778e-10,.122399,76292e-10,.0151181,-245948e-9,.122023,304802e-10,.0151203,-553394e-9,.12203,686634e-10,.015125,-983841e-9,.122037,122463e-9,.0151427,-.00153774,.12214,192706e-9,.0151708,-.0022103,.122237,281219e-9,.0152115,-.00300741,.12238,390804e-9,.0152877,-.00392494,.1227,526317e-9,.015412,-.00496597,.123244,69443e-8,.0156201,-.00613314,.124228,90547e-8,.0159658,-.00744113,.125945,.0011732,.0165674,-.00892546,.129098,.00151888,.017487,-.010627,.133865,.00197007,.018839,-.0126043,.140682,.0025637,.020554,-.0148814,.148534,.00333637,.0226727,-.0175123,.157381,.00433738,.0251879,-.0205266,.166685,.00561664,.0283635,-.0240319,.177796,.00725563,.0318694,-.0279432,.188251,.00928811,.0361044,-.0324313,.200038,.011835,.0406656,-.0373527,.210685,.0149146,.0463846,-.0430132,.224182,.0187254,.0525696,-.0491013,.23634,.0232283,.0598083,-.0559175,.250013,.0286521,.0679437,-.0633657,.263981,.0350634,.0771181,-.0714602,.278072,.0425882,.0881273,-.0803502,.29511,.0514487,.0996628,-.0896903,.309976,.0615766,.112702,-.099644,.325611,.0732139,.126488,-.109829,.339321,.0862324,.142625,-.120859,.35574,.101275,.15953,-.131956,.369845,.117892,.176991,-.143145,.38146,.136205,.199715,-.155292,.40052,.157252,.220787,-.167066,.412055,.179966,.243697,-.178396,.423133,.204418,.272106,-.190433,.439524,.232141,.297637,-.201265,.447041,.261109,.325273,-.211834,.454488,.292627,.357219,-.221889,.465004,.326669,.387362,-.230729,.468527,.362426,.423131,-.23924,.475836,.401533,.45543,-.246067,.475017,.441902,.493393,-.251557,.478017,.484239,.526253,-.255571,.4709,.528586,.560554,-.257752,.463167,.574346,.599306,-.258076,.456452,.621655,.634541,-.256471,.443725,.670492,.668907,-.253283,.428719,.721943,.705619,-.247562,.411348,.772477,.739034,-.240626,.388939,.8264,.771408,-.231493,.36425,.881702,.803312,-.220125,.337321,.9385,.828457,-.206645,.305364,.997437,.854819,-.190664,.273715,1.05693,.878666,-.171429,.242218,1.11251,.898404,-.149235,.209556,1.16398,.917416,-.12435,.176863,1.21014,.933133,-.0972703,.142775,1.25178,.95066,-.0683607,.106735,1.29028,.968589,-.0378724,.0681609,1.32703,.984776,-.00605712,.0273966,1.36158,.99994,.0263276,-.0138124,1.3943,.00867437,-186005e-11,.0928979,1.73682e-7,.00864003,-466389e-10,.0925237,435505e-11,.00864593,-186594e-9,.0925806,174322e-10,.00864095,-419639e-9,.0924903,392862e-10,.00863851,-746272e-9,.0924589,702598e-10,.00868531,-.00116456,.0929,111188e-9,.00869667,-.00167711,.0928529,163867e-9,.00874332,-.00228051,.0930914,23104e-8,.00882709,-.00297864,.0935679,31741e-8,.00898874,-.00377557,.0946165,430186e-9,.00929346,-.00469247,.0967406,580383e-9,.00978271,-.00575491,.100084,783529e-9,.0105746,-.00701514,.105447,.00106304,.0116949,-.00851797,.112494,.00144685,.0130419,-.0102757,.119876,.00196439,.0148375,-.012381,.129034,.00266433,.0168725,-.01482,.137812,.00358364,.0193689,-.0176563,.147696,.00478132,.0222691,-.0209211,.157795,.00631721,.0256891,-.0246655,.168431,.00826346,.0294686,-.0288597,.178587,.0106714,.0340412,-.0336441,.190251,.0136629,.0393918,-.039033,.202999,.0173272,.0453947,-.0450087,.215655,.0217448,.0521936,-.0515461,.228686,.0269941,.0600279,-.058817,.242838,.033272,.0692398,-.0667228,.258145,.0406457,.0793832,-.0752401,.273565,.0492239,.0902297,-.0841851,.287735,.0590105,.102014,-.0936479,.301161,.0702021,.116054,-.103967,.317438,.0832001,.13191,-.114622,.334166,.0977951,.148239,-.125452,.348192,.113985,.165809,-.136453,.361094,.131928,.184616,-.147648,.373534,.151811,.207491,-.159607,.39101,.174476,.230106,-.171119,.402504,.198798,.257036,-.182906,.418032,.225796,.281172,-.193605,.425468,.254027,.312034,-.204771,.440379,.285713,.340402,-.214988,.445406,.319196,.370231,-.224711,.44968,.35537,.407105,-.233516,.460747,.393838,.439037,-.240801,.460624,.433747,.47781,-.24762,.465957,.477234,.510655,-.251823,.460054,.52044,.550584,-.255552,.459172,.567853,.585872,-.257036,.450311,.615943,.620466,-.257535,.437763,.667693,.660496,-.255248,.426639,.718988,.695578,-.251141,.409185,.772503,.732176,-.244718,.39015,.827023,.760782,-.236782,.362594,.885651,.79422,-.225923,.33711,.943756,.824521,-.213855,.308272,1.00874,.854964,-.197723,.278529,1.06764,.878065,-.179209,.246208,1.12836,.899834,-.157569,.21329,1.18318,.918815,-.133206,.181038,1.23161,.934934,-.106545,.146993,1.27644,.952115,-.0780574,.111175,1.31842,.96906,-.0478279,.0728553,1.35839,.985178,-.0160014,.032579,1.39697,1.00039,.0173126,-.0095256,1.43312,.00384146,-124311e-11,.0613583,7.78271e-8,.00390023,-314043e-10,.0622919,196626e-11,.00389971,-125622e-9,.0622632,787379e-11,.00389491,-282352e-9,.0620659,1778e-8,.00391618,-502512e-9,.0624687,320918e-10,.00392662,-784458e-9,.0625113,515573e-10,.00396053,-.00112907,.0628175,778668e-10,.00401911,-.00153821,.0633286,113811e-9,.00414994,-.0020208,.0646443,16445e-8,.00441223,-.00260007,.0673886,237734e-9,.00484427,-.0033097,.0716528,345929e-9,.00549109,-.00418966,.0774998,505987e-9,.00636293,-.00527331,.0844758,739208e-9,.00746566,-.00660428,.0921325,.00107347,.00876625,-.00818826,.0997067,.00153691,.0103125,-.0100811,.107433,.00217153,.0123309,-.0123643,.117088,.00303427,.0146274,-.0150007,.126438,.00416018,.0172295,-.0180531,.135672,.00561513,.0204248,-.0215962,.146244,.007478,.0241597,-.0256234,.157481,.00981046,.0284693,-.0302209,.169125,.0127148,.033445,-.0353333,.181659,.0162453,.0391251,-.0410845,.1944,.0205417,.0454721,-.0473451,.207082,.0256333,.0530983,-.0542858,.221656,.0317036,.0615356,-.0618384,.236036,.0388319,.0703363,-.0697631,.248398,.046974,.0810391,-.0784757,.263611,.0565246,.0920144,-.0873488,.275857,.0671724,.105584,-.0973652,.292555,.0798105,.119506,-.107271,.306333,.0935945,.134434,-.117608,.318888,.109106,.153399,-.128938,.337552,.127074,.171258,-.139944,.349955,.14643,.191059,-.151288,.361545,.168,.215069,-.163018,.378421,.192082,.237838,-.174226,.38879,.217838,.266965,-.186063,.405857,.246931,.292827,-.196909,.414146,.277505,.324352,-.207473,.426955,.310711,.354427,-.217713,.433429,.346794,.389854,-.227183,.443966,.385237,.420749,-.235131,.44471,.424955,.459597,-.242786,.451729,.468446,.495316,-.248767,.45072,.513422,.534903,-.253351,.450924,.560618,.572369,-.256277,.445266,.609677,.612383,-.2576,.438798,.660995,.644037,-.256931,.421693,.713807,.686749,-.254036,.4109,.767616,.719814,-.249785,.390151,.82533,.754719,-.244283,.367847,.888311,.792022,-.235076,.345013,.948177,.822404,-.225061,.316193,1.01661,.853084,-.211113,.287013,1.08075,.879871,-.19449,.255424,1.14501,.901655,-.174023,.222879,1.20203,.919957,-.1509,.18989,1.25698,.938412,-.124923,.15606,1.30588,.953471,-.0968139,.120512,1.3529,.970451,-.066734,.0828515,1.3986,.985522,-.034734,.0424458,1.44148,1.00099,-.00102222,678929e-9,1.48398,965494e-9,-6.27338e-7,.0306409,1.97672e-8,99168e-8,-158573e-10,.0314638,4.99803e-7,991068e-9,-634012e-10,.031363,200682e-11,974567e-9,-14144e-8,.03036,457312e-11,998079e-9,-252812e-9,.031496,860131e-11,.00102243,-396506e-9,.0319955,148288e-10,.00107877,-577593e-9,.0331376,249141e-10,.00121622,-816816e-9,.0359396,423011e-10,.0014455,-.00113761,.0399652,724613e-10,.00178791,-.00156959,.0450556,123929e-9,.00225668,-.00214064,.0508025,208531e-9,.00285627,-.00287655,.0568443,341969e-9,.0035991,-.00380271,.0630892,544158e-9,.00455524,-.00496264,.0702204,842423e-9,.00569143,-.0063793,.0773426,.00126704,.00716928,-.00813531,.0860839,.00186642,.00885307,-.0101946,.0944079,.00267014,.0109316,-.0126386,.103951,.00374033,.0133704,-.0154876,.113786,.0051304,.0161525,-.0187317,.123477,.00688858,.0194267,-.0224652,.133986,.00910557,.0230967,-.0265976,.143979,.0118074,.0273627,-.0312848,.154645,.0151266,.0323898,-.0365949,.166765,.0191791,.0379225,-.0422914,.177932,.0239236,.0447501,-.0487469,.19167,.0296568,.0519391,-.0556398,.203224,.0362924,.0599464,-.0631646,.215652,.0440585,.0702427,-.0714308,.232089,.0531619,.0806902,-.0800605,.245258,.0634564,.0923194,-.0892815,.258609,.0752481,.106938,-.09931,.276654,.0888914,.121238,-.109575,.289847,.104055,.138817,-.120461,.307566,.121266,.15595,-.131209,.320117,.139944,.178418,-.143049,.339677,.161591,.197875,-.154074,.349886,.184303,.224368,-.166307,.369352,.210669,.252213,-.178051,.386242,.238895,.277321,-.189335,.395294,.269182,.310332,-.200683,.412148,.302508,.338809,-.210856,.418266,.337264,.372678,-.220655,.428723,.374881,.405632,-.230053,.433887,.415656,.442293,-.237993,.439911,.457982,.477256,-.244897,.440175,.502831,.515592,-.250657,.441079,.550277,.550969,-.255459,.435219,.601102,.592883,-.257696,.432882,.651785,.629092,-.259894,.421054,.708961,.672033,-.258592,.41177,.763806,.709147,-.256525,.395267,.824249,.745367,-.254677,.375013,.8951,.784715,-.247892,.353906,.959317,.818107,-.240162,.327801,1.03153,.847895,-.229741,.298821,1.10601,.879603,-.213084,.269115,1.164,.902605,-.195242,.236606,1.22854,.922788,-.174505,.203442,1.29017,.944831,-.150169,.169594,1.34157,.959656,-.124099,.135909,1.3956,.972399,-.0960626,.0990563,1.45128,.986549,-.0657097,.0602348,1.50312,1.00013,-.0333558,.0186694,1.55364,619747e-11,-1e-7,.00778326,796756e-16,2.37499e-8,-9.99999e-8,282592e-10,1.14596e-10,100292e-11,-166369e-11,250354e-9,6.77492e-9,350752e-11,-637769e-11,357289e-9,6.31655e-8,826445e-11,-174689e-10,516179e-9,3.1851e-7,242481e-10,-450868e-10,.0010223,130577e-11,455631e-10,-89044e-9,.00144302,374587e-11,971222e-10,-178311e-9,.00241912,102584e-10,171403e-9,-313976e-9,.00354938,236481e-10,292747e-9,-520026e-9,.00513765,496014e-10,789827e-9,-.00118187,.0238621,139056e-9,.00114093,-.00171827,.0286691,244093e-9,.00176119,-.00249667,.0368565,420623e-9,.0022233,-.00333742,.0400469,65673e-8,.00343382,-.00481976,.0535751,.00109323,.00427602,-.00600755,.057099,.00155268,.00461435,-.00737637,.0551084,.00215031,.00695698,-.00971401,.0715767,.00316529,.00867619,-.0120943,.0793314,.00436995,.0106694,-.0148202,.0869391,.0058959,.0140351,-.0183501,.101572,.00798757,.0168939,-.022006,.11018,.0104233,.020197,-.0261568,.119041,.0134167,.0254702,-.0312778,.135404,.0173009,.0298384,-.0362469,.1437,.0215428,.035159,-.042237,.15512,.0268882,.0427685,-.0488711,.17128,.033235,.0494848,-.0557997,.181813,.0404443,.0592394,-.0635578,.198745,.0490043,.0681463,-.071838,.210497,.0588239,.0804753,-.0809297,.228864,.0702835,.0942205,-.0906488,.247008,.0834012,.106777,-.100216,.258812,.0975952,.124471,-.110827,.278617,.114162,.138389,-.121193,.287049,.131983,.159543,-.13253,.307151,.152541,.176432,-.143611,.31564,.174673,.201723,-.15548,.33538,.199842,.229721,-.167166,.355256,.227097,.250206,-.178238,.360047,.256014,.282118,-.189905,.378761,.28855,.312821,-.201033,.39181,.323348,.341482,-.211584,.397716,.360564,.377368,-.221314,.410141,.400004,.418229,-.230474,.423485,.442371,.444881,-.239443,.418874,.488796,.488899,-.245987,.427545,.535012,.520317,-.253948,.422147,.589678,.568566,-.256616,.42719,.637683,.599607,-.26376,.415114,.703363,.64222,-.268687,.408715,.771363,.685698,-.2694,.399722,.83574,.732327,-.266642,.388651,.897764,.769873,-.267712,.369198,.983312,.806733,-.263479,.346802,1.06222,.843466,-.254575,.321368,1.13477,.873008,-.242749,.29211,1.20712,.908438,-.22725,.262143,1.27465,.936321,-.207621,.228876,1.33203,.950353,-.187932,.19484,1.40439,.96442,-.165154,.163178,1.4732,.979856,-.139302,.127531,1.53574,.982561,-.11134,.0903457,1.59982,.996389,-.0808124,.0489007,1.6577],t=[1,0,0,0,1,791421e-36,0,0,1,104392e-29,0,0,1,349405e-26,0,0,1,109923e-23,0,0,1,947414e-22,0,0,1,359627e-20,0,0,1,772053e-19,0,0,1,108799e-17,0,0,1,110655e-16,0,0,1,865818e-16,0,0,.999998,5.45037e-10,0,0,.999994,2.85095e-9,0,0,.999989,1.26931e-8,0,0,.999973,4.89938e-8,0,0,.999947,1.66347e-7,0,0,.999894,5.02694e-7,0,0,.999798,136532e-11,0,0,.999617,335898e-11,0,0,.999234,752126e-11,0,0,.998258,152586e-10,0,0,.99504,266207e-10,0,0,.980816,236802e-10,0,0,.967553,207684e-11,0,0,.966877,403733e-11,0,0,.965752,741174e-11,0,0,.96382,127746e-10,0,0,.960306,202792e-10,0,0,.953619,280232e-10,0,0,.941103,278816e-10,0,0,.926619,160221e-10,0,0,.920983,235164e-10,0,0,.912293,311924e-10,0,.0158731,.899277,348118e-10,0,.0476191,.880884,26041e-9,0,.0793651,.870399,338726e-10,0,.111111,.856138,392906e-10,0,.142857,.837436,372874e-10,0,.174603,.820973,392558e-10,0,.206349,.803583,434658e-10,0,.238095,.782168,40256e-9,0,.269841,.764107,448159e-10,0,.301587,.743092,457627e-10,0,.333333,.721626,455314e-10,0,.365079,.700375,477335e-10,0,.396825,.677334,461072e-10,0,.428571,.655702,484393e-10,0,.460317,.632059,464583e-10,0,.492064,.610125,483923e-10,0,.52381,.58653,464342e-10,0,.555556,.564508,477033e-10,0,.587302,.541405,459263e-10,0,.619048,.519556,46412e-9,0,.650794,.497292,448913e-10,0,.68254,.475898,445789e-10,0,.714286,.454722,433496e-10,0,.746032,.434042,423054e-10,0,.777778,.414126,413737e-10,0,.809524,.394387,397265e-10,0,.84127,.375841,390709e-10,0,.873016,.357219,369938e-10,0,.904762,.340084,365618e-10,0,.936508,.322714,342533e-10,0,.968254,.306974,339596e-10,0,1,1,101524e-23,0,0,1,10292e-22,0,0,1,130908e-23,0,0,1,473331e-23,0,0,1,625319e-22,0,0,1,107932e-20,0,0,1,163779e-19,0,0,1,203198e-18,0,0,1,204717e-17,0,0,.999999,168995e-16,0,0,.999998,1.15855e-10,0,0,.999996,6.6947e-10,0,0,.999991,3.30863e-9,0,0,.999983,1.41737e-8,0,0,.999968,5.32626e-8,0,0,.99994,1.77431e-7,0,0,.999891,5.28835e-7,0,0,.999797,142169e-11,0,0,.999617,347057e-11,0,0,.999227,77231e-10,0,0,.998239,155753e-10,0,0,.994937,268495e-10,0,0,.980225,213742e-10,0,0,.967549,21631e-10,0,0,.966865,417989e-11,0,0,.965739,763341e-11,0,0,.963794,130892e-10,0,0,.960244,206456e-10,0,0,.953495,282016e-10,0,148105e-9,.940876,271581e-10,0,.002454,.926569,164159e-10,0,.00867491,.920905,239521e-10,0,.01956,.912169,315127e-10,0,.035433,.899095,346626e-10,0,.056294,.882209,290223e-10,0,.0818191,.870272,342992e-10,0,.111259,.855977,394164e-10,0,.142857,.837431,372343e-10,0,.174603,.820826,396691e-10,0,.206349,.803408,435395e-10,0,.238095,.782838,419579e-10,0,.269841,.763941,450953e-10,0,.301587,.742904,455847e-10,0,.333333,.721463,458833e-10,0,.365079,.700197,477159e-10,0,.396825,.677501,470641e-10,0,.428571,.655527,484732e-10,0,.460317,.6324,476834e-10,0,.492064,.609964,484213e-10,0,.52381,.586839,475541e-10,0,.555556,.564353,476951e-10,0,.587302,.541589,467611e-10,0,.619048,.519413,463493e-10,0,.650794,.497337,453994e-10,0,.68254,.475797,445308e-10,0,.714286,.454659,435787e-10,0,.746032,.434065,424839e-10,0,.777778,.414018,41436e-9,0,.809524,.39455,401902e-10,0,.84127,.375742,390813e-10,0,.873016,.357501,377116e-10,0,.904762,.339996,36535e-9,0,.936508,.323069,351265e-10,0,.968254,.306897,339112e-10,0,1,1,10396e-19,0,0,1,104326e-20,0,0,1,110153e-20,0,0,1,144668e-20,0,0,1,34528e-19,0,0,1,175958e-19,0,0,1,12627e-17,0,0,1,936074e-18,0,0,1,645742e-17,0,0,.999998,401228e-16,0,0,.999997,2.22338e-10,0,0,.999995,1.0967e-9,0,0,.999991,4.82132e-9,0,0,.999981,1.89434e-8,0,0,.999967,6.67716e-8,0,0,.999938,2.12066e-7,0,0,.999886,6.0977e-7,0,0,.999792,159504e-11,0,0,.999608,381191e-11,0,0,.999209,833727e-11,0,0,.998179,165288e-10,0,0,.994605,274387e-10,0,0,.979468,167316e-10,0,0,.967529,242877e-11,0,0,.966836,461696e-11,0,0,.96569,830977e-11,0,0,.963706,140427e-10,0,244659e-11,.960063,217353e-10,0,760774e-9,.953113,286606e-10,0,.00367261,.940192,247691e-10,0,.00940263,.927731,195814e-10,0,.018333,.920669,252531e-10,0,.0306825,.911799,324277e-10,0,.0465556,.89857,340982e-10,0,.0659521,.883283,319622e-10,0,.0887677,.86989,35548e-9,0,.114784,.855483,397143e-10,0,.143618,.837987,391665e-10,0,.174606,.820546,411306e-10,0,.206349,.802878,436753e-10,0,.238095,.783402,444e-7,0,.269841,.763439,458726e-10,0,.301587,.742925,467097e-10,0,.333333,.721633,478887e-10,0,.365079,.69985,481251e-10,0,.396825,.67783,491811e-10,0,.428571,.655126,488199e-10,0,.460318,.632697,496025e-10,0,.492064,.609613,48829e-9,0,.52381,.587098,492754e-10,0,.555556,.564119,482625e-10,0,.587302,.541813,482807e-10,0,.619048,.519342,471552e-10,0,.650794,.497514,466765e-10,0,.68254,.475879,455582e-10,0,.714286,.454789,446007e-10,0,.746032,.434217,435382e-10,0,.777778,.414086,421753e-10,0,.809524,.394744,412093e-10,0,.84127,.375782,396634e-10,0,.873016,.357707,386419e-10,0,.904762,.340038,370345e-10,0,.936508,.323284,359725e-10,0,.968254,.306954,3436e-8,0,1,1,599567e-19,0,0,1,600497e-19,0,0,1,614839e-19,0,0,1,686641e-19,0,0,1,972658e-19,0,0,1,221271e-18,0,0,1,833195e-18,0,0,1,403601e-17,0,0,.999999,206001e-16,0,0,.999998,1.01739e-10,0,0,.999997,4.70132e-10,0,0,.999993,2.00436e-9,0,0,.999988,7.83682e-9,0,0,.999979,2.80338e-8,0,0,.999962,9.17033e-8,0,0,.999933,2.74514e-7,0,0,.999881,7.53201e-7,0,0,.999783,189826e-11,0,0,.999594,440279e-11,0,0,.999178,93898e-10,0,0,.998073,181265e-10,0,0,.993993,280487e-10,0,0,.979982,149422e-10,0,0,.968145,378481e-11,0,0,.966786,53771e-10,0,0,.965611,947508e-11,0,388934e-10,.963557,156616e-10,0,9693e-7,.959752,235144e-10,0,.00370329,.952461,291568e-10,0,.00868428,.940193,240102e-10,0,.0161889,.929042,231235e-10,0,.0263948,.920266,273968e-10,0,.0394088,.911178,337915e-10,0,.0552818,.897873,333629e-10,0,.0740138,.884053,351405e-10,0,.0955539,.869455,378034e-10,0,.119795,.854655,399378e-10,0,.14656,.838347,419108e-10,0,.175573,.820693,440831e-10,0,.206388,.802277,445599e-10,0,.238095,.783634,472691e-10,0,.269841,.763159,476984e-10,0,.301587,.742914,491487e-10,0,.333333,.721662,502312e-10,0,.365079,.699668,502817e-10,0,.396825,.677839,51406e-9,0,.428571,.655091,511095e-10,0,.460317,.632665,516067e-10,0,.492064,.609734,512255e-10,0,.52381,.587043,510263e-10,0,.555556,.564298,50565e-9,0,.587302,.541769,497951e-10,0,.619048,.519529,492698e-10,0,.650794,.497574,482066e-10,0,.68254,.476028,473689e-10,0,.714286,.454961,461941e-10,0,.746032,.434341,450618e-10,0,.777778,.414364,438355e-10,0,.809524,.394832,424196e-10,0,.84127,.376109,412563e-10,0,.873016,.35779,396226e-10,0,.904762,.340379,384886e-10,0,.936508,.323385,368214e-10,0,.968254,.307295,356636e-10,0,1,1,106465e-17,0,0,1,106555e-17,0,0,1,107966e-17,0,0,1,114601e-17,0,0,1,137123e-17,0,0,1,21243e-16,0,0,.999999,489653e-17,0,0,.999999,160283e-16,0,0,.999998,62269e-15,0,0,.999997,2.51859e-10,0,0,.999996,9.96192e-10,0,0,.999992,3.74531e-9,0,0,.999986,1.32022e-8,0,0,.999975,4.33315e-8,0,0,.999959,1.31956e-7,0,0,.999927,3.72249e-7,0,0,.999871,9.72461e-7,0,0,.999771,235343e-11,0,0,.999572,52768e-10,0,0,.999133,109237e-10,0,0,.997912,203675e-10,0,0,.993008,279396e-10,0,0,.980645,139604e-10,0,0,.970057,646596e-11,0,0,.966717,65089e-10,0,474145e-10,.965497,111863e-10,0,89544e-8,.96334,179857e-10,0,.0032647,.959294,259045e-10,0,.0075144,.951519,292327e-10,0,.0138734,.940517,249769e-10,0,.0224952,.93014,26803e-9,0,.0334828,.91972,303656e-10,0,.0468973,.910294,353323e-10,0,.0627703,.897701,351002e-10,0,.0811019,.884522,388104e-10,0,.10186,.869489,412932e-10,0,.124985,.853983,415781e-10,0,.150372,.838425,454066e-10,0,.177868,.820656,471624e-10,0,.207245,.801875,475243e-10,0,.238143,.783521,505621e-10,0,.269841,.763131,50721e-9,0,.301587,.74261,523293e-10,0,.333333,.72148,528699e-10,0,.365079,.699696,538677e-10,0,.396825,.677592,539255e-10,0,.428571,.65525,546367e-10,0,.460317,.632452,541348e-10,0,.492064,.609903,544976e-10,0,.52381,.586928,536201e-10,0,.555556,.564464,535185e-10,0,.587302,.541801,524949e-10,0,.619048,.519681,51812e-9,0,.650794,.497685,507687e-10,0,.68254,.47622,496243e-10,0,.714286,.455135,485714e-10,0,.746032,.4346,471847e-10,0,.777778,.414564,459294e-10,0,.809524,.395165,444705e-10,0,.84127,.376333,430772e-10,0,.873016,.358197,416229e-10,0,.904762,.34064,401019e-10,0,.936508,.323816,386623e-10,0,.968254,.307581,370933e-10,0,1,1,991541e-17,0,0,1,992077e-17,0,0,1,100041e-16,0,0,1,10385e-15,0,0,1,115777e-16,0,0,1,150215e-16,0,0,.999999,254738e-16,0,0,.999999,598822e-16,0,0,.999998,1.79597e-10,0,0,.999997,6.02367e-10,0,0,.999994,2.06835e-9,0,0,.99999,6.94952e-9,0,0,.999984,2.23363e-8,0,0,.999972,6.78578e-8,0,0,.999952,1.93571e-7,0,0,.999919,5.16594e-7,0,0,.99986,128739e-11,0,0,.999753,299298e-11,0,0,.999546,648258e-11,0,0,.999074,129985e-10,0,0,.997671,232176e-10,0,0,.991504,256701e-10,0,0,.981148,131141e-10,0,0,.971965,869048e-11,0,280182e-10,.966624,808301e-11,0,695475e-9,.965344,135235e-10,0,.00265522,.963048,210592e-10,0,.00622975,.958673,287473e-10,0,.0116234,.950262,281379e-10,0,.018976,.940836,271089e-10,0,.0283844,.930996,30926e-9,0,.0399151,.919848,348359e-10,0,.0536063,.909136,366092e-10,0,.0694793,.897554,384162e-10,0,.0875342,.884691,430971e-10,0,.107749,.869414,447803e-10,0,.130087,.853462,452858e-10,0,.154481,.838187,495769e-10,0,.180833,.820381,502709e-10,0,.209005,.801844,522713e-10,0,.238791,.783061,541505e-10,0,.269869,.763205,553712e-10,0,.301587,.742362,564909e-10,0,.333333,.721393,572646e-10,0,.365079,.699676,581012e-10,0,.396825,.677395,58096e-9,0,.428571,.655208,585766e-10,0,.460317,.632451,583602e-10,0,.492064,.609839,580234e-10,0,.52381,.587093,577161e-10,0,.555556,.564467,568447e-10,0,.587302,.542043,563166e-10,0,.619048,.519826,55156e-9,0,.650794,.497952,541682e-10,0,.68254,.476477,528971e-10,0,.714286,.455412,514952e-10,0,.746032,.434926,502222e-10,0,.777778,.4149,485779e-10,0,.809524,.395552,472242e-10,0,.84127,.376712,454891e-10,0,.873016,.358622,440924e-10,0,.904762,.341048,422984e-10,0,.936508,.324262,408582e-10,0,.968254,.308013,390839e-10,0,1,1,613913e-16,0,0,1,614145e-16,0,0,1,617708e-16,0,0,1,633717e-16,0,0,1,681648e-16,0,0,1,808291e-16,0,0,1,1.14608e-10,0,0,.999998,2.10507e-10,0,0,.999997,4.99595e-10,0,0,.999995,1.39897e-9,0,0,.999994,4.19818e-9,0,0,.999988,1.27042e-8,0,0,.999979,3.75153e-8,0,0,.999965,1.06206e-7,0,0,.999945,2.85381e-7,0,0,.999908,7.23611e-7,0,0,.999846,17255e-10,0,0,.999733,386104e-11,0,0,.999511,808493e-11,0,0,.998993,156884e-10,0,0,.997326,265538e-10,0,0,.989706,206466e-10,0,0,.981713,130756e-10,0,70005e-10,.973636,106473e-10,0,464797e-9,.966509,10194e-9,0,.00201743,.965149,165881e-10,0,.00497549,.962669,249147e-10,0,.00953262,.95786,317449e-10,0,.0158211,.949334,281045e-10,0,.0239343,.941041,303263e-10,0,.0339372,.931575,356754e-10,0,.0458738,.920102,397075e-10,0,.059772,.908002,384886e-10,0,.075645,.897269,43027e-9,0,.0934929,.884559,479925e-10,0,.113302,.869161,48246e-9,0,.135045,.853342,509505e-10,0,.158678,.837633,542846e-10,0,.184136,.820252,554139e-10,0,.211325,.801872,581412e-10,0,.240113,.782418,585535e-10,0,.270306,.7631,610923e-10,0,.301594,.742183,613678e-10,0,.333333,.721098,627275e-10,0,.365079,.699512,629413e-10,0,.396825,.677372,636351e-10,0,.428571,.655059,633555e-10,0,.460317,.632567,636513e-10,0,.492064,.609784,628965e-10,0,.52381,.587237,625546e-10,0,.555556,.564525,615825e-10,0,.587302,.542181,605048e-10,0,.619048,.520017,596329e-10,0,.650794,.498204,581516e-10,0,.68254,.476742,569186e-10,0,.714286,.455803,553833e-10,0,.746032,.435251,537807e-10,0,.777778,.415374,522025e-10,0,.809524,.395921,503421e-10,0,.84127,.377253,488211e-10,0,.873016,.359021,468234e-10,0,.904762,.341637,453269e-10,0,.936508,.3247,433014e-10,0,.968254,.308625,418007e-10,0,1,1,2.86798e-10,0,0,1,2.86877e-10,0,0,1,2.88094e-10,0,0,1,2.93506e-10,0,0,1,3.09262e-10,0,0,.999999,3.48593e-10,0,0,.999999,4.44582e-10,0,0,.999998,6.88591e-10,0,0,.999996,1.34391e-9,0,0,.999993,3.17438e-9,0,0,.999989,8.35609e-9,0,0,.999983,2.28677e-8,0,0,.999974,6.23361e-8,0,0,.999959,1.65225e-7,0,0,.999936,4.19983e-7,0,0,.999896,101546e-11,0,0,.99983,232376e-11,0,0,.999709,50156e-10,0,0,.999469,10167e-9,0,0,.998886,190775e-10,0,0,.996819,300511e-10,0,0,.988837,185092e-10,0,1.68222e-7,.982178,134622e-10,0,259622e-9,.975017,125961e-10,0,.00142595,.967101,13507e-9,0,.00382273,.964905,205003e-10,0,.00764164,.96218,29546e-9,0,.0130121,.956821,343738e-10,0,.0200253,.948829,305063e-10,0,.0287452,.941092,346487e-10,0,.039218,.931883,412061e-10,0,.0514748,.920211,444651e-10,0,.0655351,.907307,431252e-10,0,.0814082,.89684,490382e-10,0,.0990939,.884119,53334e-9,0,.118583,.869148,54114e-9,0,.139856,.853377,578536e-10,0,.162882,.836753,592285e-10,0,.187615,.820063,622787e-10,0,.213991,.801694,645492e-10,0,.241918,.782116,65353e-9,0,.271267,.762673,674344e-10,0,.301847,.742133,682788e-10,0,.333333,.720779,691959e-10,0,.365079,.699386,696817e-10,0,.396826,.67732,699583e-10,0,.428572,.654888,698447e-10,0,.460318,.632499,694063e-10,0,.492064,.609825,691612e-10,0,.52381,.587287,681576e-10,0,.555556,.564743,674138e-10,0,.587302,.542409,661617e-10,0,.619048,.520282,647785e-10,0,.650794,.498506,633836e-10,0,.68254,.477102,615905e-10,0,.714286,.456167,601013e-10,0,.746032,.435728,581457e-10,0,.777778,.415809,564215e-10,0,.809524,.396517,544997e-10,0,.84127,.377737,525061e-10,0,.873016,.359698,506831e-10,0,.904762,.342164,48568e-9,0,.936508,.325417,467826e-10,0,.968254,.309186,446736e-10,0,1,1,1.09018e-9,0,0,1,1.0904e-9,0,0,1,1.09393e-9,0,0,1,1.1095e-9,0,0,1,1.154e-9,0,0,1,1.26089e-9,0,0,.999999,1.5059e-9,0,0,.999997,2.07899e-9,0,0,.999994,3.48164e-9,0,0,.999993,7.05728e-9,0,0,.999987,1.63692e-8,0,0,.999981,4.06033e-8,0,0,.999969,1.0245e-7,0,0,.999953,2.55023e-7,0,0,.999925,6.1511e-7,0,0,.999881,142218e-11,0,0,.99981,313086e-11,0,0,.99968,653119e-11,0,0,.999418,12832e-9,0,0,.998748,232497e-10,0,0,.996066,329522e-10,0,0,.988379,179613e-10,0,108799e-9,.982567,143715e-10,0,921302e-9,.976097,148096e-10,0,.00280738,.968475,178905e-10,0,.00596622,.964606,253921e-10,0,.0105284,.961564,348623e-10,0,.0165848,.955517,357612e-10,0,.0242,.948381,343493e-10,0,.03342,.941095,405849e-10,0,.0442777,.931923,475394e-10,0,.0567958,.91996,484328e-10,0,.0709879,.907419,502146e-10,0,.086861,.89618,561654e-10,0,.104415,.88337,587612e-10,0,.123643,.869046,618057e-10,0,.144531,.853278,657392e-10,0,.167057,.836091,66303e-9,0,.191188,.819644,704445e-10,0,.216878,.801246,714071e-10,0,.244062,.782031,740093e-10,0,.272649,.762066,74685e-9,0,.302509,.741964,766647e-10,0,.333442,.720554,766328e-10,0,.365079,.699098,777857e-10,0,.396826,.677189,774633e-10,0,.428572,.65484,776235e-10,0,.460318,.632496,770316e-10,0,.492064,.609908,762669e-10,0,.52381,.587312,753972e-10,0,.555556,.564938,739994e-10,0,.587302,.542577,728382e-10,0,.619048,.52062,71112e-9,0,.650794,.498819,694004e-10,0,.68254,.477555,675575e-10,0,.714286,.456568,653449e-10,0,.746032,.436278,636068e-10,0,.777778,.41637,613466e-10,0,.809524,.397144,594177e-10,0,.84127,.378412,570987e-10,0,.873016,.360376,550419e-10,0,.904762,.342906,527422e-10,0,.936508,.326136,506544e-10,0,.968254,.30997,484307e-10,0,1,1,3.54014e-9,0,0,1,3.54073e-9,0,0,1,3.54972e-9,0,0,1,3.58929e-9,0,0,1,3.70093e-9,0,0,.999999,3.96194e-9,0,0,.999998,4.53352e-9,0,0,.999997,5.78828e-9,0,0,.999994,8.63812e-9,0,0,.999991,1.53622e-8,0,0,.999985,3.16356e-8,0,0,.999977,7.12781e-8,0,0,.999964,1.66725e-7,0,0,.999945,3.90501e-7,0,0,.999912,8.95622e-7,0,0,.999866,198428e-11,0,0,.999786,421038e-11,0,0,.999647,850239e-11,0,0,.999356,162059e-10,0,0,.998563,282652e-10,0,0,.994928,336309e-10,0,244244e-10,.987999,178458e-10,0,523891e-9,.982893,159162e-10,0,.00194729,.977044,178056e-10,0,.00451099,.969972,230624e-10,0,.00835132,.964237,313922e-10,0,.013561,.960791,406145e-10,0,.0202056,.954292,372796e-10,0,.0283321,.948052,403199e-10,0,.0379739,.940938,479537e-10,0,.0491551,.931689,545292e-10,0,.0618918,.91987,54038e-9,0,.0761941,.907665,589909e-10,0,.0920672,.895281,642651e-10,0,.109511,.882621,659707e-10,0,.12852,.86873,709973e-10,0,.149085,.853008,742221e-10,0,.171189,.835944,761754e-10,0,.194809,.818949,797052e-10,0,.21991,.800951,812434e-10,0,.246447,.781847,838075e-10,0,.274352,.761649,84501e-9,0,.303535,.74152,860258e-10,0,.333857,.720495,866233e-10,0,.365104,.698742,868326e-10,0,.396826,.677096,87133e-9,0,.428572,.654782,863497e-10,0,.460318,.632335,860206e-10,0,.492064,.610031,849337e-10,0,.52381,.587457,838279e-10,0,.555556,.56513,82309e-9,0,.587302,.542877,803542e-10,0,.619048,.5209,786928e-10,0,.650794,.499291,765171e-10,0,.68254,.477971,744753e-10,0,.714286,.457221,72209e-9,0,.746032,.436803,697448e-10,0,.777778,.417083,675333e-10,0,.809524,.397749,648058e-10,0,.84127,.379177,625759e-10,0,.873016,.361061,598584e-10,0,.904762,.343713,575797e-10,0,.936508,.326894,549999e-10,0,.968254,.310816,527482e-10,0,1,1,1.0153e-8,0,0,1,1.01544e-8,0,0,1,1.01751e-8,0,0,1,1.02662e-8,0,0,1,1.0521e-8,0,0,.999999,1.11049e-8,0,0,.999999,1.23408e-8,0,0,.999996,1.4924e-8,0,0,.999992,2.04471e-8,0,0,.999989,3.26539e-8,0,0,.99998,6.03559e-8,0,0,.999971,1.23936e-7,0,0,.999955,2.69058e-7,0,0,.999933,5.93604e-7,0,0,.999901,129633e-11,0,0,.999847,275621e-11,0,0,.999761,564494e-11,0,0,.999607,110485e-10,0,0,.999282,204388e-10,0,0,.99831,341084e-10,0,2.2038e-7,.993288,294949e-10,0,242388e-9,.987855,192736e-10,0,.0012503,.983167,182383e-10,0,.0032745,.977908,218633e-10,0,.00646321,.971194,290662e-10,0,.0109133,.963867,386401e-10,0,.0166927,.95982,462827e-10,0,.0238494,.953497,420705e-10,0,.0324178,.947621,477743e-10,0,.0424225,.940611,568258e-10,0,.0538808,.931174,618061e-10,0,.0668047,.919919,627098e-10,0,.0812014,.907856,694714e-10,0,.0970745,.894509,735008e-10,0,.114424,.881954,763369e-10,0,.133246,.868309,821896e-10,0,.153534,.852511,83769e-9,0,.175275,.835821,881615e-10,0,.198453,.817981,896368e-10,0,.223042,.800504,930906e-10,0,.249009,.78141,945056e-10,0,.276304,.761427,963605e-10,0,.304862,.74094,968088e-10,0,.334584,.720233,981481e-10,0,.365322,.698592,979122e-10,0,.396826,.676763,981057e-10,0,.428571,.654808,973956e-10,0,.460318,.632326,962619e-10,0,.492064,.610049,952996e-10,0,.52381,.58763,933334e-10,0,.555556,.565261,917573e-10,0,.587302,.543244,896636e-10,0,.619048,.521273,873304e-10,0,.650794,.499818,852648e-10,0,.68254,.478536,823961e-10,0,.714286,.457826,79939e-9,0,.746032,.437549,77126e-9,0,.777778,.41776,743043e-10,0,.809524,.39863,716426e-10,0,.84127,.379954,686456e-10,0,.873016,.362025,660514e-10,0,.904762,.344581,630755e-10,0,.936508,.327909,605439e-10,0,.968254,.311736,576345e-10,0,1,1,2.63344e-8,0,0,1,2.63373e-8,0,0,1,2.63815e-8,0,0,1,2.65753e-8,0,0,1,2.71132e-8,0,0,.999999,2.83279e-8,0,0,.999997,3.0833e-8,0,0,.999995,3.58711e-8,0,0,.999992,4.61266e-8,0,0,.999985,6.7574e-8,0,0,.999977,1.1358e-7,0,0,.999966,2.13657e-7,0,0,.999948,4.31151e-7,0,0,.999923,8.96656e-7,0,0,.999884,186603e-11,0,0,.999826,381115e-11,0,0,.999732,754184e-11,0,0,.999561,143192e-10,0,0,.999191,257061e-10,0,0,.997955,405724e-10,0,744132e-10,.992228,276537e-10,0,716477e-9,.987638,208885e-10,0,.0022524,.983395,215226e-10,0,.00484816,.978614,270795e-10,0,.00860962,.972389,365282e-10,0,.0136083,.964392,474747e-10,0,.0198941,.95861,509141e-10,0,.0275023,.952806,48963e-9,0,.0364584,.94712,571119e-10,0,.04678,.940104,671704e-10,0,.0584799,.930398,687586e-10,0,.0715665,.919866,738161e-10,0,.086045,.907853,813235e-10,0,.101918,.894078,834582e-10,0,.119186,.881177,892093e-10,0,.137845,.867575,944548e-10,0,.157891,.852107,969607e-10,0,.179316,.835502,101456e-9,0,.202106,.81756,103256e-9,0,.226243,.79984,106954e-9,0,.251704,.780998,108066e-9,0,.278451,.761132,110111e-9,0,.306436,.740429,110459e-9,0,.335586,.719836,111219e-9,0,.365796,.698467,11145e-8,0,.3969,.676446,110393e-9,0,.428571,.654635,110035e-9,0,.460318,.632411,108548e-9,0,.492064,.609986,106963e-9,0,.52381,.587872,105238e-9,0,.555556,.565528,102665e-9,0,.587302,.543563,100543e-9,0,.619048,.52176,976182e-10,0,.650794,.500188,947099e-10,0,.68254,.479204,919929e-10,0,.714286,.458413,886139e-10,0,.746032,.438314,857839e-10,0,.777778,.418573,82411e-9,0,.809524,.39947,792211e-10,0,.84127,.380892,759546e-10,0,.873016,.362953,727571e-10,0,.904762,.345601,695738e-10,0,.936508,.328895,664907e-10,0,.968254,.312808,634277e-10,0,1,1,6.28647e-8,0,0,1,6.28705e-8,0,0,1,6.29587e-8,0,0,1,6.33441e-8,0,0,.999999,6.44087e-8,0,0,.999998,6.67856e-8,0,0,.999997,7.15889e-8,0,0,.999995,8.09577e-8,0,0,.999989,9.92764e-8,0,0,.999983,1.35834e-7,0,0,.999974,2.10482e-7,0,0,.999959,3.65215e-7,0,0,.999939,6.86693e-7,0,0,.999911,13472e-10,0,0,.999868,26731e-10,0,0,.999804,524756e-11,0,0,.9997,100403e-10,0,0,.99951,185019e-10,0,0,.999078,322036e-10,0,620676e-11,.997428,470002e-10,0,341552e-9,.99162,287123e-10,0,.00143727,.987479,234706e-10,0,.00349201,.983582,260083e-10,0,.0066242,.979186,337927e-10,0,.0109113,.97325,454689e-10,0,.0164064,.965221,573759e-10,0,.0231463,.957262,544114e-10,0,.0311571,.952211,587006e-10,0,.0404572,.946631,692256e-10,0,.0510592,.939391,787819e-10,0,.0629723,.929795,792368e-10,0,.0762025,.91965,875075e-10,0,.090753,.907737,950903e-10,0,.106626,.893899,972963e-10,0,.123822,.880239,10459e-8,0,.142337,.866562,107689e-9,0,.16217,.85164,113081e-9,0,.183314,.835021,116636e-9,0,.20576,.817311,120074e-9,0,.229496,.798845,121921e-9,0,.254502,.780479,12475e-8,0,.280753,.760694,125255e-9,0,.308212,.740142,126719e-9,0,.336825,.719248,12636e-8,0,.366517,.698209,126712e-9,0,.397167,.676398,125769e-9,0,.428578,.654378,124432e-9,0,.460318,.632484,123272e-9,0,.492064,.610113,12085e-8,0,.52381,.587931,118411e-9,0,.555556,.565872,11569e-8,0,.587302,.543814,112521e-9,0,.619048,.522265,109737e-9,0,.650794,.500835,106228e-9,0,.68254,.479818,102591e-9,0,.714286,.459258,991288e-10,0,.746032,.439061,952325e-10,0,.777778,.419552,91895e-9,0,.809524,.400399,879051e-10,0,.84127,.381976,844775e-10,0,.873016,.364009,806316e-10,0,.904762,.346761,771848e-10,0,.936508,.330049,735429e-10,0,.968254,.314018,702103e-10,0,1,1,1.39968e-7,0,0,1,1.39979e-7,0,0,1,1.40145e-7,0,0,1,1.4087e-7,0,0,.999999,1.42865e-7,0,0,.999998,1.47279e-7,0,0,.999997,1.56057e-7,0,0,.999992,1.7276e-7,0,0,.999989,2.04352e-7,0,0,.99998,2.6494e-7,0,0,.999969,3.83435e-7,0,0,.999953,6.18641e-7,0,0,.999929,108755e-11,0,0,.999898,201497e-11,0,0,.999849,381346e-11,0,0,.999778,719815e-11,0,0,.999661,133215e-10,0,0,.999451,238313e-10,0,0,.998936,401343e-10,0,113724e-9,.99662,517346e-10,0,820171e-9,.991094,304323e-10,0,.00238143,.987487,281757e-10,0,.00493527,.983731,320048e-10,0,.00856859,.979647,423905e-10,0,.0133393,.973837,562935e-10,0,.0192863,.96584,677442e-10,0,.0264369,.956309,623073e-10,0,.03481,.951523,704131e-10,0,.0444184,.946003,836594e-10,0,.0552713,.938454,911736e-10,0,.0673749,.929279,938264e-10,0,.0807329,.919239,103754e-9,0,.0953479,.907293,109928e-9,0,.111221,.893936,115257e-9,0,.128352,.879674,122265e-9,0,.14674,.865668,125733e-9,0,.166382,.850998,132305e-9,0,.187276,.834498,134844e-9,0,.209413,.816903,139276e-9,0,.232786,.798235,140984e-9,0,.257382,.779724,14378e-8,0,.283181,.760251,144623e-9,0,.310156,.739808,145228e-9,0,.338269,.718762,14539e-8,0,.367461,.697815,144432e-9,0,.397646,.67631,143893e-9,0,.428685,.654278,141846e-9,0,.460318,.632347,13935e-8,0,.492064,.610296,137138e-9,0,.52381,.588039,133806e-9,0,.555556,.566218,130755e-9,0,.587302,.544346,127128e-9,0,.619048,.522701,123002e-9,0,.650794,.501542,119443e-9,0,.68254,.480508,115055e-9,0,.714286,.460092,111032e-9,0,.746032,.440021,106635e-9,0,.777778,.420446,102162e-9,0,.809524,.401512,98184e-9,0,.84127,.38299,936497e-10,0,.873016,.365232,89813e-9,0,.904762,.347865,853073e-10,0,.936508,.331342,817068e-10,0,.968254,.315202,773818e-10,0,1,1,2.9368e-7,0,0,1,2.937e-7,0,0,1,2.93998e-7,0,0,1,2.95298e-7,0,0,.999999,2.98865e-7,0,0,.999998,3.067e-7,0,0,.999995,3.22082e-7,0,0,.999992,3.50767e-7,0,0,.999986,4.03538e-7,0,0,.999976,5.01372e-7,0,0,.999964,6.8562e-7,0,0,.999945,10374e-10,0,0,.999919,171269e-11,0,0,.999882,300175e-11,0,0,.999829,542144e-11,0,0,.999749,984182e-11,0,0,.99962,176213e-10,0,0,.999382,305995e-10,0,138418e-10,.998751,496686e-10,0,389844e-9,.995344,510733e-10,0,.00150343,.990768,345829e-10,0,.00352451,.987464,342841e-10,0,.00655379,.983846,399072e-10,0,.0106554,.980007,533219e-10,0,.0158723,.974494,696992e-10,0,.0222333,.96622,776754e-10,0,.029758,.956273,747718e-10,0,.0384596,.950952,864611e-10,0,.0483473,.945215,100464e-9,0,.0594266,.937287,103729e-9,0,.0717019,.928649,111665e-9,0,.0851752,.918791,12353e-8,0,.0998479,.906685,127115e-9,0,.115721,.893706,13628e-8,0,.132794,.879248,142427e-9,0,.151067,.864685,148091e-9,0,.170538,.850032,153517e-9,0,.191204,.833853,157322e-9,0,.213063,.816353,161086e-9,0,.236107,.797834,164111e-9,0,.260329,.778831,165446e-9,0,.285714,.759756,167492e-9,0,.312243,.739419,166928e-9,0,.339887,.718491,167e-6,0,.368604,.697392,165674e-9,0,.398329,.676102,163815e-9,0,.428961,.654243,162003e-9,0,.460331,.632176,158831e-9,0,.492064,.610407,155463e-9,0,.52381,.588394,152062e-9,0,.555556,.56645,147665e-9,0,.587302,.5449,14375e-8,0,.619048,.523276,138905e-9,0,.650794,.502179,134189e-9,0,.68254,.481359,129392e-9,0,.714286,.46092,124556e-9,0,.746032,.441084,11957e-8,0,.777778,.421517,114652e-9,0,.809524,.402721,109688e-9,0,.84127,.384222,104667e-9,0,.873016,.366534,999633e-10,0,.904762,.349205,950177e-10,0,.936508,.332702,907301e-10,0,.968254,.316599,859769e-10,0,1,1,5.85473e-7,0,0,1,5.85507e-7,0,0,1,5.8602e-7,0,0,.999999,5.88259e-7,0,0,.999999,5.94381e-7,0,0,.999998,6.07754e-7,0,0,.999995,6.33729e-7,0,0,.99999,6.8137e-7,0,0,.999984,7.67003e-7,0,0,.999973,9.21212e-7,0,0,.999959,120218e-11,0,0,.999936,172024e-11,0,0,.999907,268088e-11,0,0,.999866,445512e-11,0,0,.999806,768481e-11,0,0,.999716,1342e-8,0,0,.999576,232473e-10,0,0,.9993,391694e-10,0,129917e-9,.998498,608429e-10,0,845035e-9,.994132,489743e-10,0,.00237616,.99031,384644e-10,0,.00484456,.987409,421768e-10,0,.00832472,.983981,504854e-10,0,.0128643,.980268,671028e-10,0,.0184947,.974875,852749e-10,0,.025237,.966063,85531e-9,0,.0331046,.956779,900588e-10,0,.0421067,.950259,10577e-8,0,.0522487,.944239,119458e-9,0,.0635343,.936341,122164e-9,0,.0759654,.928047,134929e-9,0,.0895434,.918065,145544e-9,0,.104269,.906267,150531e-9,0,.120142,.893419,161652e-9,0,.137163,.878758,16593e-8,0,.15533,.863699,174014e-9,0,.174645,.848876,177877e-9,0,.195106,.833032,184049e-9,0,.21671,.815557,186088e-9,0,.239454,.797323,19054e-8,0,.263332,.778124,191765e-9,0,.288336,.758929,192535e-9,0,.314451,.738979,192688e-9,0,.341658,.718213,191522e-9,0,.369924,.696947,190491e-9,0,.399202,.675807,187913e-9,0,.429416,.654147,184451e-9,0,.460447,.63229,181442e-9,0,.492064,.610499,177139e-9,0,.523809,.588747,172596e-9,0,.555555,.566783,167457e-9,0,.587301,.545359,162518e-9,0,.619048,.523984,156818e-9,0,.650794,.502917,151884e-9,0,.68254,.482294,145514e-9,0,.714286,.461945,140199e-9,0,.746032,.442133,134101e-9,0,.777778,.422705,128374e-9,0,.809524,.403916,122996e-9,0,.84127,.38554,116808e-9,0,.873016,.367909,111973e-9,0,.904762,.350651,105938e-9,0,.936508,.334208,101355e-9,0,.968254,.318123,957629e-10,0,1,1,111633e-11,0,0,1,111639e-11,0,0,1,111725e-11,0,0,1,112096e-11,0,0,.999999,11311e-10,0,0,.999997,115315e-11,0,0,.999995,11956e-10,0,0,.999989,127239e-11,0,0,.999981,140772e-11,0,0,.999969,164541e-11,0,0,.999952,206607e-11,0,0,.999928,281783e-11,0,0,.999895,416835e-11,0,0,.999848,658728e-11,0,0,.999781,108648e-10,0,0,.999682,182579e-10,0,0,.999523,306003e-10,0,159122e-10,.999205,499862e-10,0,391184e-9,.998131,73306e-9,0,.00147534,.993334,513229e-10,0,.0034227,.99016,467783e-10,0,.00632232,.987321,523413e-10,0,.0102295,.984099,64267e-9,0,.0151794,.980432,843042e-10,0,.0211947,.974976,102819e-9,0,.0282899,.966429,996234e-10,0,.0364739,.957633,111074e-9,0,.0457522,.949422,128644e-9,0,.0561278,.943045,140076e-9,0,.0676023,.935448,146349e-9,0,.0801762,.927225,161854e-9,0,.0938499,.917033,169135e-9,0,.108623,.905762,179987e-9,0,.124496,.892879,189832e-9,0,.141469,.878435,195881e-9,0,.159541,.863114,20466e-8,0,.178713,.84776,209473e-9,0,.198985,.832084,214861e-9,0,.220355,.814915,217695e-9,0,.242823,.796711,220313e-9,0,.266385,.777603,22313e-8,0,.291036,.757991,222471e-9,0,.316767,.738371,222869e-9,0,.343563,.717872,221243e-9,0,.371402,.696619,218089e-9,0,.400248,.675379,21562e-8,0,.430047,.65411,21169e-8,0,.460709,.63241,206947e-9,0,.492079,.61046,201709e-9,0,.52381,.58903,196753e-9,0,.555556,.567267,189637e-9,0,.587302,.545886,184735e-9,0,.619048,.524714,177257e-9,0,.650794,.503789,171424e-9,0,.68254,.483204,164688e-9,0,.714286,.462976,157172e-9,0,.746032,.443294,151341e-9,0,.777778,.423988,143737e-9,0,.809524,.405325,138098e-9,0,.84127,.386981,130698e-9,0,.873016,.369436,125276e-9,0,.904762,.35219,118349e-9,0,.936508,.335804,11312e-8,0,.968254,.319749,106687e-9,0,1,1,204685e-11,0,0,1,204694e-11,0,0,1,204831e-11,0,0,.999999,205428e-11,0,0,.999999,207056e-11,0,0,.999997,210581e-11,0,0,.999993,21732e-10,0,0,.999987,229365e-11,0,0,.999979,250243e-11,0,0,.999965,286127e-11,0,0,.999947,348028e-11,0,0,.999918,455588e-11,0,0,.999881,643303e-11,0,0,.999828,970064e-11,0,0,.999753,153233e-10,0,0,.999642,24793e-9,0,0,.999464,402032e-10,0,122947e-9,.999089,635852e-10,0,807414e-9,.997567,857026e-10,0,.00227206,.992903,594912e-10,0,.00462812,.990011,578515e-10,0,.00794162,.987192,65399e-9,0,.0122534,.98418,819675e-10,0,.0175888,.980491,105514e-9,0,.0239635,.974779,121532e-9,0,.031387,.96675,119144e-9,0,.0398644,.958248,136125e-9,0,.0493982,.948884,155408e-9,0,.0599896,.941673,162281e-9,0,.0716382,.934521,176754e-9,0,.0843437,.926205,192873e-9,0,.0981056,.916089,200038e-9,0,.112923,.904963,213624e-9,0,.128796,.892089,221834e-9,0,.145725,.878028,232619e-9,0,.163709,.86249,238632e-9,0,.182749,.846587,247002e-9,0,.202847,.830988,250702e-9,0,.224001,.814165,255562e-9,0,.246214,.796135,257505e-9,0,.269482,.777052,258625e-9,0,.293805,.757201,258398e-9,0,.319176,.737655,256714e-9,0,.345587,.717477,255187e-9,0,.373021,.696433,251792e-9,0,.401454,.675084,247223e-9,0,.430844,.653907,242213e-9,0,.461125,.632561,237397e-9,0,.492187,.610658,229313e-9,0,.52381,.589322,224402e-9,0,.555556,.567857,216116e-9,0,.587302,.54652,209124e-9,0,.619048,.525433,201601e-9,0,.650794,.504679,192957e-9,0,.68254,.484203,186052e-9,0,.714286,.464203,177672e-9,0,.746032,.444549,170005e-9,0,.777778,.425346,162401e-9,0,.809524,.406706,1544e-7,0,.84127,.388576,147437e-9,0,.873016,.37094,139493e-9,0,.904762,.353996,133219e-9,0,.936508,.337391,125573e-9,0,.968254,.321648,119867e-9,0,1,1,362511e-11,0,0,1,362525e-11,0,0,1,362739e-11,0,0,.999999,363673e-11,0,0,.999998,366214e-11,0,0,.999996,371698e-11,0,0,.999992,382116e-11,0,0,.999986,400554e-11,0,0,.999976,432058e-11,0,0,.999961,485194e-11,0,0,.999938,574808e-11,0,0,.999908,726643e-11,0,0,.999865,984707e-11,0,0,.999807,142217e-10,0,0,.999723,215581e-10,0,0,.999602,336114e-10,0,119113e-10,.999398,527353e-10,0,355813e-9,.998946,805809e-10,0,.00137768,.996647,942908e-10,0,.00322469,.992298,668733e-10,0,.00597897,.989802,716564e-10,0,.00968903,.987019,821355e-10,0,.0143845,.984219,104555e-9,0,.0200831,.980425,131245e-9,0,.0267948,.974241,139613e-9,0,.034525,.967006,145931e-9,0,.0432757,.95893,167153e-9,0,.0530471,.949157,188146e-9,0,.0638386,.94062,194625e-9,0,.0756487,.933509,213721e-9,0,.0884762,.925088,229616e-9,0,.10232,.915178,239638e-9,0,.117178,.904093,254814e-9,0,.133051,.891337,263685e-9,0,.149939,.877326,274789e-9,0,.167841,.861794,280534e-9,0,.18676,.845758,289534e-9,0,.206696,.829792,294446e-9,0,.22765,.813037,296877e-9,0,.249625,.795285,300217e-9,0,.27262,.776323,299826e-9,0,.296636,.756673,299787e-9,0,.321671,.736856,297867e-9,0,.347718,.716883,294052e-9,0,.374768,.696089,289462e-9,0,.402804,.67505,285212e-9,0,.431796,.653509,27653e-8,0,.461695,.63258,271759e-9,0,.49242,.61104,262811e-9,0,.523822,.589567,255151e-9,0,.555556,.568322,246434e-9,0,.587302,.547235,237061e-9,0,.619048,.52616,228343e-9,0,.650794,.505716,219236e-9,0,.68254,.485274,209595e-9,0,.714286,.465411,201011e-9,0,.746032,.445854,19109e-8,0,.777778,.426911,182897e-9,0,.809524,.408222,173569e-9,0,.84127,.390307,165496e-9,0,.873016,.372624,156799e-9,0,.904762,.355804,14917e-8,0,.936508,.33924,140907e-9,0,.968254,.323534,134062e-9,0,1,1,622487e-11,0,0,1,62251e-10,0,0,1,622837e-11,0,0,.999999,624259e-11,0,0,.999998,628127e-11,0,0,.999996,636451e-11,0,0,.999991,65218e-10,0,0,.999984,679782e-11,0,0,.999973,726361e-11,0,0,.999955,803644e-11,0,0,.999931,931397e-11,0,0,.999896,114299e-10,0,0,.999847,149402e-10,0,0,.999784,207461e-10,0,0,.999692,302493e-10,0,0,.999554,454957e-10,0,997275e-10,.999326,690762e-10,0,724813e-9,.998757,101605e-9,0,.0020972,.995367,958745e-10,0,.00432324,.99209,832808e-10,0,.00746347,.989517,887601e-10,0,.0115534,.987008,10564e-8,0,.0166134,.98421,133179e-9,0,.0226552,.98021,161746e-9,0,.0296838,.973676,161821e-9,0,.0377016,.967052,178635e-9,0,.0467079,.959385,206765e-9,0,.0567013,.949461,22476e-8,0,.0676796,.939578,23574e-8,0,.0796403,.932416,25893e-8,0,.0925812,.923759,271228e-9,0,.106501,.914223,289165e-9,0,.121397,.902942,301156e-9,0,.13727,.890419,313852e-9,0,.15412,.876639,324408e-9,0,.171946,.861316,33249e-8,0,.190751,.84496,338497e-9,0,.210537,.828427,345861e-9,0,.231305,.811871,347863e-9,0,.253057,.794397,350225e-9,0,.275797,.775726,349915e-9,0,.299525,.75617,347297e-9,0,.324242,.736091,344232e-9,0,.349947,.716213,340835e-9,0,.376633,.695736,332369e-9,0,.404289,.674961,327943e-9,0,.432895,.653518,318533e-9,0,.462415,.632574,310391e-9,0,.492788,.61134,300755e-9,0,.523909,.590017,290506e-9,0,.555556,.568752,280446e-9,0,.587302,.548061,269902e-9,0,.619048,.52711,258815e-9,0,.650794,.506682,248481e-9,0,.68254,.486524,237141e-9,0,.714286,.466812,226872e-9,0,.746032,.44732,216037e-9,0,.777778,.428473,205629e-9,0,.809524,.409921,195691e-9,0,.84127,.392028,185457e-9,0,.873016,.374606,176436e-9,0,.904762,.357601,166508e-9,0,.936508,.341348,158385e-9,0,.968254,.32542,149203e-9,0,1,1,103967e-10,0,0,1,10397e-9,0,0,1,104019e-10,0,0,.999999,104231e-10,0,0,.999998,104806e-10,0,0,.999995,106042e-10,0,0,.999991,108366e-10,0,0,.999982,112415e-10,0,0,.999968,119174e-10,0,0,.99995,130227e-10,0,0,.999922,148176e-10,0,0,.999884,177303e-10,0,0,.99983,224564e-10,0,0,.999758,300966e-10,0,0,.999654,423193e-10,0,549083e-11,.999503,614848e-10,0,296087e-9,.999237,903576e-10,0,.00123144,.998491,1271e-7,0,.00295954,.994594,107754e-9,0,.00555829,.99178,103025e-9,0,.00907209,.989265,11154e-8,0,.0135257,.986998,136296e-9,0,.0189327,.984137,169154e-9,0,.0252993,.979798,196671e-9,0,.0326272,.97337,196678e-9,0,.0409157,.967239,223121e-9,0,.0501623,.959543,253809e-9,0,.0603638,.949466,265972e-9,0,.0715171,.939074,288372e-9,0,.0836187,.931118,310983e-9,0,.0966657,.922525,325561e-9,0,.110656,.912983,345725e-9,0,.125588,.901617,3556e-7,0,.141461,.889487,374012e-9,0,.158275,.875787,383445e-9,0,.176031,.860654,393972e-9,0,.19473,.844417,400311e-9,0,.214374,.82741,405004e-9,0,.234967,.810545,407378e-9,0,.256512,.793312,407351e-9,0,.279011,.774847,406563e-9,0,.302468,.755621,404903e-9,0,.326887,.735511,397486e-9,0,.352266,.715435,39357e-8,0,.378605,.695403,384739e-9,0,.405897,.674681,376108e-9,0,.43413,.65359,365997e-9,0,.463277,.632471,354957e-9,0,.493295,.61151,343593e-9,0,.524106,.59064,331841e-9,0,.555561,.569386,318891e-9,0,.587302,.548785,3072e-7,0,.619048,.528146,29361e-8,0,.650794,.507872,281709e-9,0,.68254,.487805,268627e-9,0,.714286,.468196,255887e-9,0,.746032,.448922,243997e-9,0,.777778,.430093,231662e-9,0,.809524,.411845,220339e-9,0,.84127,.393808,208694e-9,0,.873016,.376615,198045e-9,0,.904762,.359655,187375e-9,0,.936508,.343452,177371e-9,0,.968254,.32765,167525e-9,0,1,1,169351e-10,0,0,1,169356e-10,0,0,1,169427e-10,0,0,.999999,169736e-10,0,0,.999998,170575e-10,0,0,.999995,172372e-10,0,0,.99999,175739e-10,0,0,.999979,181568e-10,0,0,.999966,191206e-10,0,0,.999944,20677e-9,0,0,.999912,231644e-10,0,0,.999869,271268e-10,0,0,.999811,334272e-10,0,0,.99973,433979e-10,0,0,.999617,590083e-10,0,680315e-10,.999445,829497e-10,0,612796e-9,.999138,118019e-9,0,.00187408,.998095,156712e-9,0,.00395791,.993919,125054e-9,0,.00692144,.991333,126091e-9,0,.0107962,.989226,144912e-9,0,.0155986,.986954,175737e-9,0,.0213364,.983982,213883e-9,0,.0280114,.979128,234526e-9,0,.0356226,.973327,243725e-9,0,.0441668,.967416,2773e-7,0,.0536399,.959729,308799e-9,0,.0640376,.949758,322447e-9,0,.0753554,.939173,350021e-9,0,.0875893,.9296,370089e-9,0,.100736,.921181,391365e-9,0,.114793,.91164,413636e-9,0,.129759,.900435,427068e-9,0,.145632,.888183,441046e-9,0,.162412,.874772,454968e-9,0,.180101,.859566,461882e-9,0,.1987,.843579,471556e-9,0,.218213,.826453,474335e-9,0,.238641,.809164,477078e-9,0,.259989,.792179,47755e-8,0,.282262,.773866,472573e-9,0,.305464,.754944,469765e-9,0,.329599,.735133,462371e-9,0,.35467,.714858,453674e-9,0,.380678,.694829,443888e-9,0,.407622,.674453,432052e-9,0,.435493,.653685,420315e-9,0,.464275,.632666,406829e-9,0,.493938,.611676,392234e-9,0,.524422,.591193,379208e-9,0,.555624,.570145,36319e-8,0,.587302,.549566,349111e-9,0,.619048,.529278,334166e-9,0,.650794,.509026,318456e-9,0,.68254,.489186,30449e-8,0,.714286,.469662,289051e-9,0,.746032,.450691,275494e-9,0,.777778,.431841,261437e-9,0,.809524,.413752,247846e-9,0,.84127,.395951,235085e-9,0,.873016,.378633,222245e-9,0,.904762,.36194,210533e-9,0,.936508,.345599,198494e-9,0,.968254,.329999,188133e-9,0,1,1,269663e-10,0,0,1,26967e-9,0,0,1,269772e-10,0,0,.999999,270214e-10,0,0,.999998,271415e-10,0,0,.999994,27398e-9,0,0,.999988,278771e-10,0,0,.999977,287019e-10,0,0,.999961,300544e-10,0,0,.999937,322138e-10,0,0,.999904,356163e-10,0,0,.999854,409465e-10,0,0,.99979,492651e-10,0,0,.999699,621722e-10,0,8.8288e-7,.999572,819715e-10,0,223369e-9,.999381,111689e-9,0,.00105414,.999016,153862e-9,0,.0026493,.997437,187667e-9,0,.00508608,.993545,155672e-9,0,.00840554,.991135,161455e-9,0,.012629,.989157,188241e-9,0,.0177661,.986874,226229e-9,0,.0238198,.983714,268668e-9,0,.0307887,.978301,277109e-9,0,.0386688,.973227,303446e-9,0,.0474554,.967317,341851e-9,0,.0571428,.959477,370885e-9,0,.0677256,.950012,392753e-9,0,.0791988,.939484,42781e-8,0,.0915576,.928135,443866e-9,0,.104798,.919819,472959e-9,0,.118918,.910049,491551e-9,0,.133915,.899181,512616e-9,0,.149788,.886881,523563e-9,0,.166537,.87359,540183e-9,0,.184164,.858613,547386e-9,0,.202669,.842809,554809e-9,0,.222056,.825727,558316e-9,0,.242329,.808086,557824e-9,0,.263492,.790728,556346e-9,0,.285551,.772987,552672e-9,0,.30851,.7541,543738e-9,0,.332376,.734669,536107e-9,0,.357153,.714411,523342e-9,0,.382845,.694196,512238e-9,0,.409454,.674252,497465e-9,0,.436977,.65357,481096e-9,0,.465404,.632999,467054e-9,0,.494713,.611994,448771e-9,0,.524864,.591604,431889e-9,0,.555779,.571134,415238e-9,0,.587302,.550528,396369e-9,0,.619048,.530292,379477e-9,0,.650794,.510364,361488e-9,0,.68254,.490749,343787e-9,0,.714286,.471266,327822e-9,0,.746032,.452462,310626e-9,0,.777778,.433907,295352e-9,0,.809524,.415659,279179e-9,0,.84127,.398138,264685e-9,0,.873016,.380833,249905e-9,0,.904762,.364247,236282e-9,0,.936508,.348041,222905e-9,0,.968254,.332389,210522e-9,0,1,1,420604e-10,0,0,1,420614e-10,0,0,1,420757e-10,0,0,.999999,42138e-9,0,0,.999997,423067e-10,0,0,.999993,426668e-10,0,0,.999986,433372e-10,0,0,.999974,444857e-10,0,0,.999956,463554e-10,0,0,.99993,493105e-10,0,0,.999892,539077e-10,0,0,.999838,610005e-10,0,0,.999767,718822e-10,0,0,.999666,884581e-10,0,365471e-10,.999525,113398e-9,0,485623e-9,.999311,150043e-9,0,.00162096,.998865,200063e-9,0,.00355319,.996278,211014e-9,0,.00633818,.992956,189672e-9,0,.0100043,.991017,210262e-9,0,.0145648,.989055,244292e-9,0,.0200237,.986741,290481e-9,0,.0263798,.983288,334303e-9,0,.033629,.977784,340307e-9,0,.0417652,.973037,377864e-9,0,.0507821,.967181,4239e-7,0,.060673,.958971,443854e-9,0,.0714314,.950093,483039e-9,0,.0830518,.939552,517934e-9,0,.0955288,.927678,539449e-9,0,.108859,.918278,568604e-9,0,.123038,.908449,588505e-9,0,.138065,.897713,612473e-9,0,.153938,.885533,625575e-9,0,.170657,.872131,63854e-8,0,.188224,.857517,647034e-9,0,.20664,.841796,65209e-8,0,.225909,.824726,6544e-7,0,.246035,.807297,655744e-9,0,.267022,.789058,646716e-9,0,.288878,.77189,643898e-9,0,.311607,.753082,629973e-9,0,.335216,.7341,621564e-9,0,.359713,.714094,605171e-9,0,.385103,.693839,588752e-9,0,.41139,.673891,573294e-9,0,.438576,.653565,552682e-9,0,.466656,.633326,533446e-9,0,.495617,.612582,514635e-9,0,.525431,.59205,49303e-8,0,.556041,.571918,471842e-9,0,.587338,.551572,451713e-9,0,.619048,.531553,430049e-9,0,.650794,.51175,410445e-9,0,.68254,.49238,390098e-9,0,.714286,.473143,370033e-9,0,.746032,.45423,351205e-9,0,.777778,.435963,332049e-9,0,.809524,.41787,315021e-9,0,.84127,.400387,297315e-9,0,.873016,.383332,281385e-9,0,.904762,.366665,265397e-9,0,.936508,.350633,250601e-9,0,.968254,.334964,23589e-8,0,1,1,643736e-10,0,0,1,64375e-9,0,0,1,643947e-10,0,0,.999999,64481e-9,0,0,.999997,647143e-10,0,0,.999994,652119e-10,0,0,.999985,661359e-10,0,0,.999972,677116e-10,0,0,.999952,702599e-10,0,0,.999922,742517e-10,0,0,.99988,803906e-10,0,0,.99982,897315e-10,0,0,.999741,103838e-9,0,0,.999629,12496e-8,0,149024e-9,.999474,156161e-9,0,861027e-9,.999229,201034e-9,0,.00231198,.998662,259069e-9,0,.00458147,.995299,245439e-9,0,.00770895,.992732,24498e-8,0,.0117126,.990847,273211e-9,0,.0165989,.988911,316492e-9,0,.0223674,.98654,37161e-8,0,.0290135,.982636,410352e-9,0,.0365309,.977346,421756e-9,0,.0449117,.972909,475578e-9,0,.0541481,.966821,522482e-9,0,.0642326,.958686,545008e-9,0,.075158,.949754,589286e-9,0,.0869181,.939184,619995e-9,0,.0995074,.927505,654266e-9,0,.112922,.916606,682362e-9,0,.127157,.906707,704286e-9,0,.142212,.895937,725909e-9,0,.158085,.883913,743939e-9,0,.174776,.870642,755157e-9,0,.192287,.856241,764387e-9,0,.210619,.84069,771032e-9,0,.229775,.823728,765906e-9,0,.249761,.806481,767604e-9,0,.270582,.787924,754385e-9,0,.292243,.770588,749668e-9,0,.314753,.751991,731613e-9,0,.338118,.733407,717655e-9,0,.362347,.713688,700604e-9,0,.387447,.693595,678765e-9,0,.413424,.673426,657042e-9,0,.440284,.65359,635892e-9,0,.468027,.633576,611569e-9,0,.496645,.613144,586011e-9,0,.526122,.592711,563111e-9,0,.556417,.572722,537699e-9,0,.587451,.552762,512556e-9,0,.619048,.532985,489757e-9,0,.650794,.513219,464139e-9,0,.68254,.493992,442193e-9,0,.714286,.47509,418629e-9,0,.746032,.456287,397045e-9,0,.777778,.438152,375504e-9,0,.809524,.420294,35492e-8,0,.84127,.402749,335327e-9,0,.873016,.385879,316422e-9,0,.904762,.369352,298333e-9,0,.936508,.353301,281417e-9,0,.968254,.337781,265203e-9,0,1,1,968267e-10,0,0,1,968284e-10,0,0,1,968556e-10,0,0,.999999,969733e-10,0,0,.999997,972913e-10,0,0,.999993,979688e-10,0,0,.999984,992239e-10,0,0,.999969,101356e-9,0,0,.999946,104784e-9,0,0,.999913,110111e-9,0,0,.999868,118217e-9,0,0,.999801,130396e-9,0,0,.999712,148523e-9,0,124907e-10,.999589,175233e-9,0,355405e-9,.999416,213999e-9,0,.0013528,.999136,268529e-9,0,.00312557,.998367,333088e-9,0,.00573045,.994701,304757e-9,0,.00919397,.992497,318031e-9,0,.0135261,.990608,353863e-9,0,.0187278,.988715,409044e-9,0,.0247947,.986241,472967e-9,0,.0317196,.981696,495104e-9,0,.039494,.977097,532873e-9,0,.0481087,.972583,594447e-9,0,.0575549,.966142,636867e-9,0,.0678242,.95823,669899e-9,0,.0789089,.949677,719499e-9,0,.0908023,.939226,750584e-9,0,.103499,.927501,793183e-9,0,.116993,.915199,81995e-8,0,.131282,.90498,847654e-9,0,.146364,.894243,868929e-9,0,.162237,.882154,884278e-9,0,.178902,.869161,898108e-9,0,.196358,.854751,901254e-9,0,.21461,.839368,90679e-8,0,.23366,.822874,901541e-9,0,.253512,.805514,897297e-9,0,.274174,.78716,881856e-9,0,.29565,.769061,870032e-9,0,.31795,.751,851719e-9,0,.341081,.732614,830671e-9,0,.365053,.713171,806569e-9,0,.389874,.693472,78338e-8,0,.415553,.673528,756404e-9,0,.442098,.653397,726872e-9,0,.469512,.633781,700494e-9,0,.497794,.613877,67105e-8,0,.526935,.593506,640361e-9,0,.556908,.573667,613502e-9,0,.587657,.553932,583177e-9,0,.61906,.534345,554375e-9,0,.650794,.515042,527811e-9,0,.68254,.495674,499367e-9,0,.714286,.477132,47429e-8,0,.746032,.458609,447726e-9,0,.777778,.440354,424205e-9,0,.809524,.422765,399549e-9,0,.84127,.405472,378315e-9,0,.873016,.388482,355327e-9,0,.904762,.372191,336122e-9,0,.936508,.356099,315247e-9,0,.968254,.340737,29794e-8,0,1,1,143327e-9,0,0,1,14333e-8,0,0,1,143366e-9,0,0,.999999,143524e-9,0,0,.999996,143952e-9,0,0,.999991,144862e-9,0,0,.999981,146544e-9,0,0,.999966,149391e-9,0,0,.999941,153946e-9,0,0,.999905,160971e-9,0,0,.999852,171562e-9,0,0,.99978,18729e-8,0,0,.999681,210386e-9,0,826239e-10,.999546,243906e-9,0,664807e-9,.999352,291739e-9,0,.00196192,.999027,357419e-9,0,.00405941,.997886,422349e-9,0,.00699664,.99419,385008e-9,0,.0107896,.99214,409775e-9,0,.0154415,.990274,456418e-9,0,.0209488,.988455,527008e-9,0,.0273037,.985804,597685e-9,0,.0344969,.98103,613124e-9,0,.0425183,.976674,668321e-9,0,.0513575,.972021,736985e-9,0,.0610046,.965274,773789e-9,0,.0714508,.958046,830852e-9,0,.0826877,.949333,875766e-9,0,.0947085,.939135,917088e-9,0,.107507,.927119,952244e-9,0,.121078,.91469,990626e-9,0,.135419,.903006,.00101304,0,.150526,.892368,.00103834,0,.166399,.880231,.00105002,0,.183038,.867432,.00106331,0,.200443,.853208,.00106783,0,.218618,.837956,.00106458,0,.237566,.821772,.00105945,0,.257291,.804328,.00104685,0,.2778,.786465,.00103178,0,.2991,.768004,.00101077,0,.321199,.74972,985504e-9,0,.344106,.731682,962893e-9,0,.36783,.712813,932146e-9,0,.392383,.693139,89871e-8,0,.417774,.673566,869678e-9,0,.444013,.653483,835525e-9,0,.471107,.633891,799853e-9,0,.49906,.614433,766838e-9,0,.527869,.594586,732227e-9,0,.557517,.574769,696442e-9,0,.587966,.555149,663935e-9,0,.61913,.535898,629826e-9,0,.650794,.516753,596486e-9,0,.68254,.497816,567078e-9,0,.714286,.479034,534399e-9,0,.746032,.460975,507013e-9,0,.777778,.442935,477421e-9,0,.809524,.425263,451101e-9,0,.84127,.408248,424964e-9,0,.873016,.391339,39993e-8,0,.904762,.37513,377619e-9,0,.936508,.359172,354418e-9,0,.968254,.343876,334823e-9,0,1,1,209042e-9,0,0,1,209045e-9,0,0,1,209093e-9,0,0,.999999,209304e-9,0,0,.999996,209871e-9,0,0,.999991,211078e-9,0,0,.999979,213304e-9,0,0,.999963,217061e-9,0,0,.999933,223042e-9,0,0,.999894,232206e-9,0,0,.999837,245901e-9,0,0,.999756,266023e-9,0,102927e-11,.999648,295204e-9,0,233468e-9,.999499,336958e-9,0,.00108237,.999283,395563e-9,0,.00268832,.998896,473785e-9,0,.00511138,.997006,520008e-9,0,.00837705,.993819,497261e-9,0,.0124928,.991632,523722e-9,0,.0174561,.989875,587258e-9,0,.0232596,.988109,676329e-9,0,.0298932,.985155,747701e-9,0,.0373453,.980479,768803e-9,0,.0456045,.976271,841054e-9,0,.0546593,.971347,911469e-9,0,.0644994,.964528,953057e-9,0,.0751152,.957632,.00102221,0,.0864981,.948681,.00106122,0,.0986407,.938716,.00111857,0,.111537,.926629,.00114762,0,.125182,.914025,.00118995,0,.139571,.901026,.00121228,0,.154703,.890358,.00123946,0,.170576,.878283,.0012527,0,.18719,.865459,.00125536,0,.204547,.851407,.00126134,0,.222648,.836276,.00124759,0,.241498,.820436,.00124443,0,.261101,.803253,.00122071,0,.281465,.785562,.00120107,0,.302595,.76718,.00117762,0,.324501,.748551,.00114289,0,.347192,.730564,.00110872,0,.370679,.712253,.00107636,0,.394973,.692867,.00103646,0,.420085,.673695,996793e-9,0,.446027,.653912,95675e-8,0,.47281,.634129,916739e-9,0,.500441,.615004,874401e-9,0,.528921,.595587,833411e-9,0,.558244,.575965,794556e-9,0,.588384,.5566,75196e-8,0,.619281,.537428,716381e-9,0,.650795,.518623,676558e-9,0,.68254,.499964,64074e-8,0,.714286,.481356,605984e-9,0,.746032,.463279,570256e-9,0,.777778,.445673,540138e-9,0,.809524,.428032,507299e-9,0,.84127,.411112,479553e-9,0,.873016,.394444,450737e-9,0,.904762,.378247,424269e-9,0,.936508,.362415,399111e-9,0,.968254,.347103,375274e-9,0,1,1,300729e-9,0,0,1,300733e-9,0,0,1,300797e-9,0,0,.999998,301072e-9,0,0,.999996,301817e-9,0,0,.999989,303398e-9,0,0,.999977,306309e-9,0,0,.999958,311209e-9,0,0,.999927,318975e-9,0,0,.999884,330804e-9,0,0,.99982,34834e-8,0,0,.999733,373854e-9,0,326995e-10,.999613,410424e-9,0,477174e-9,.999447,462047e-9,0,.00161099,.999204,533322e-9,0,.00353153,.998725,624964e-9,0,.00627965,.995871,631786e-9,0,.0098693,.993194,632017e-9,0,.0143011,.991541,68923e-8,0,.019568,.989773,766892e-9,0,.0256593,.987647,863668e-9,0,.0325625,.984193,922089e-9,0,.0402647,.980016,970749e-9,0,.0487532,.975859,.00106027,0,.058016,.970514,.00112239,0,.0680419,.963625,.00117212,0,.0788208,.956959,.00125211,0,.0903439,.947956,.00129411,0,.102604,.93809,.00135879,0,.115594,.92659,.00139309,0,.129309,.913829,.00143253,0,.143745,.90005,.00145809,0,.158901,.888129,.0014748,0,.174774,.87607,.00148756,0,.191365,.863461,.00148714,0,.208674,.849594,.00148892,0,.226705,.834531,.00146496,0,.245461,.81903,.0014579,0,.264947,.802122,.00143039,0,.28517,.78445,.00139717,0,.306137,.766434,.00136312,0,.327857,.747816,.00132597,0,.350341,.729519,.00128323,0,.373598,.711454,.00123803,0,.397642,.692699,.00119097,0,.422485,.673723,.00114565,0,.448139,.654386,.00109552,0,.474619,.634673,.00104553,0,.501933,.615554,99985e-8,0,.530089,.596462,948207e-9,0,.559087,.577385,902299e-9,0,.588913,.558257,856448e-9,0,.619525,.5392,810395e-9,0,.650826,.520543,768558e-9,0,.68254,.502206,7239e-7,0,.714286,.48402,685794e-9,0,.746032,.465779,64471e-8,0,.777778,.448455,609583e-9,0,.809524,.431091,57227e-8,0,.84127,.414147,54042e-8,0,.873016,.39765,506545e-9,0,.904762,.381576,477635e-9,0,.936508,.365881,448446e-9,0,.968254,.350582,421424e-9,0,1,1,427144e-9,0,0,1,427151e-9,0,0,1,427232e-9,0,0,.999998,42759e-8,0,0,.999995,428555e-9,0,0,.999988,430603e-9,0,0,.999976,434368e-9,0,0,.999952,440688e-9,0,0,.999919,450667e-9,0,0,.999871,46578e-8,0,0,.999801,488024e-9,0,0,.999704,520092e-9,0,129791e-9,.999572,565553e-9,0,821056e-9,.999389,628906e-9,0,.00225241,.999114,714911e-9,0,.00449109,.998488,819218e-9,0,.00756249,.995234,80415e-8,0,.0114716,.993021,830181e-9,0,.0162131,.991407,902645e-9,0,.021776,.989625,996934e-9,0,.0281471,.987064,.00109707,0,.0353118,.983265,.00114353,0,.0432562,.979535,.0012272,0,.0519665,.975224,.00132642,0,.0614298,.969574,.00138092,0,.0716348,.963021,.00145896,0,.0825709,.956046,.00152834,0,.094229,.947136,.00158217,0,.106602,.937313,.0016347,0,.119682,.926073,.00168383,0,.133465,.913121,.00171627,0,.147947,.899165,.00174229,0,.163125,.885891,.00176137,0,.178998,.873783,.00176406,0,.195566,.861331,.00176156,0,.21283,.847569,.00175346,0,.230793,.832785,.00172753,0,.249459,.817442,.00170204,0,.268832,.800613,.00166576,0,.28892,.783597,.00162909,0,.30973,.76571,.0015826,0,.331271,.747021,.00153106,0,.353554,.728593,.00148036,0,.37659,.710661,.00142808,0,.400391,.692426,.00136906,0,.424973,.673623,.00131066,0,.450347,.65494,.00125569,0,.476531,.635448,.00119517,0,.503535,.616221,.00113828,0,.531372,.597531,.0010816,0,.560047,.578795,.00102673,0,.589554,.559892,970985e-9,0,.619869,.541307,919773e-9,0,.650923,.522608,868479e-9,0,.68254,.504484,82137e-8,0,.714286,.486603,772916e-9,0,.746032,.468802,730353e-9,0,.777778,.451172,684955e-9,0,.809524,.434348,647565e-9,0,.84127,.417445,605863e-9,0,.873016,.401077,571885e-9,0,.904762,.385039,536034e-9,0,.936508,.369483,504227e-9,0,.968254,.354272,473165e-9,0,1,1,599525e-9,0,0,1,599533e-9,0,0,1,599639e-9,0,0,.999998,600097e-9,0,0,.999994,601336e-9,0,0,.999987,603958e-9,0,0,.999972,608775e-9,0,0,.999949,616842e-9,0,0,.999912,629534e-9,0,0,.999857,648658e-9,0,0,.999781,676615e-9,0,538873e-11,.999674,716574e-9,0,308602e-9,.999528,772641e-9,0,.00127003,.999326,849806e-9,0,.00300783,.999009,952682e-9,0,.00556637,.998112,.00106394,0,.00895889,.994496,.00102228,0,.0131827,.992806,.00108586,0,.0182277,.991211,.0011759,0,.0240795,.989415,.00128955,0,.030723,.986499,.00139038,0,.0381418,.982679,.00144539,0,.046321,.978839,.00153954,0,.0552459,.974295,.00164417,0,.0649034,.968784,.00171517,0,.0752814,.962324,.00180282,0,.0863693,.954956,.00186387,0,.0981578,.94624,.00193817,0,.110639,.936517,.00198156,0,.123806,.925186,.00203042,0,.137655,.91252,.0020664,0,.15218,.898441,.00207822,0,.16738,.884394,.0020992,0,.183253,.871273,.00208748,0,.199799,.859057,.00208686,0,.21702,.845243,.00205519,0,.234918,.830723,.00202868,0,.253496,.815801,.00199501,0,.272761,.79914,.00194193,0,.292719,.782372,.00188824,0,.313377,.76482,.00183695,0,.334745,.746586,.00177418,0,.356833,.7281,.00170628,0,.379654,.709842,.00164063,0,.403221,.692019,.00157355,0,.427548,.67364,.00150262,0,.452651,.655277,.00143473,0,.478545,.636438,.00136371,0,.505246,.617364,.00129911,0,.532768,.598603,.00123014,0,.561122,.580195,.00116587,0,.590309,.561786,.00110398,0,.620318,.543377,.00104148,0,.651102,.525093,983984e-9,0,.682545,.506791,92667e-8,0,.714286,.489291,874326e-9,0,.746032,.471811,821734e-9,0,.777778,.454435,774698e-9,0,.809524,.437493,727302e-9,0,.84127,.420977,684039e-9,0,.873016,.404729,64373e-8,0,.904762,.388756,60285e-8,0,.936508,.373344,56765e-8,0,.968254,.358191,531929e-9,0,1,1,832169e-9,0,0,1,832178e-9,0,0,1,83231e-8,0,0,.999998,832893e-9,0,0,.999995,834465e-9,0,0,.999985,837791e-9,0,0,.999969,843893e-9,0,0,.999944,854086e-9,0,0,.999903,870071e-9,0,0,.999843,894042e-9,0,0,.999759,928865e-9,0,531805e-10,.999643,978242e-9,0,579365e-9,.99948,.00104684,0,.00182774,.999255,.00114012,0,.00387804,.998885,.00126188,0,.00675709,.997405,.00135888,0,.010468,.99424,.00133626,0,.0150018,.992458,.00140905,0,.0203443,.990929,.00152305,0,.0264786,.989116,.00165882,0,.0333875,.985624,.00174128,0,.0410536,.982003,.00182108,0,.0494609,.978336,.00194498,0,.0585941,.973184,.00202708,0,.0684396,.9678,.00212166,0,.0789851,.961348,.00221366,0,.0902199,.953841,.00228219,0,.102134,.94534,.00235662,0,.114721,.935552,.00240572,0,.127972,.924064,.00244405,0,.141884,.911827,.00247557,0,.156451,.897731,.00248374,0,.171672,.883409,.00249863,0,.187545,.868625,.00246688,0,.20407,.856529,.00246523,0,.221249,.842999,.00242368,0,.239083,.828505,.00237354,0,.257578,.813825,.00232588,0,.276738,.797813,.00226731,0,.296569,.781097,.00219704,0,.31708,.764038,.00212394,0,.338281,.746067,.00204786,0,.360181,.727687,.00196728,0,.382794,.709571,.00188779,0,.406133,.691503,.00180532,0,.430213,.673673,.00171849,0,.45505,.655732,.00164147,0,.480662,.637399,.00155858,0,.507065,.618616,.00147641,0,.534278,.60005,.00140125,0,.562313,.581713,.00132441,0,.59118,.563546,.00125014,0,.620875,.545605,.00118249,0,.651373,.527559,.0011116,0,.682593,.509764,.00104979,0,.714286,.49193,985977e-9,0,.746032,.475011,928592e-9,0,.777778,.457878,873466e-9,0,.809524,.440979,819585e-9,0,.84127,.424613,772365e-9,0,.873016,.408549,722195e-9,0,.904762,.392771,680014e-9,0,.936508,.377317,636797e-9,0,.968254,.362352,598318e-9,0,1,1,.00114313,0,0,1,.00114314,0,0,.999999,.00114331,0,0,.999998,.00114404,0,0,.999994,.00114601,0,0,.999984,.00115019,0,0,.999967,.00115784,0,0,.999937,.0011706,0,0,.999894,.00119054,0,0,.999828,.00122031,0,0,.999735,.00126331,0,169263e-9,.999606,.00132382,0,949167e-9,.999426,.0014071,0,.00249668,.999173,.00151895,0,.00486392,.99873,.00166102,0,.00806323,.996243,.0017023,0,.0120895,.993779,.00172782,0,.0169288,.9919,.0018108,0,.0225633,.990524,.00196028,0,.028974,.98868,.00212014,0,.036142,.984663,.00217598,0,.044049,.981457,.00230563,0,.0526781,.977608,.00243966,0,.0620137,.972215,.00251336,0,.0720418,.966798,.0026285,0,.0827499,.960241,.00271409,0,.0941271,.952489,.00278381,0,.106164,.944127,.00285399,0,.118852,.934282,.00290994,0,.132185,.923271,.00294558,0,.146157,.910803,.00296269,0,.160766,.896705,.00296803,0,.176007,.88238,.00296637,0,.19188,.867116,.00293163,0,.208385,.853636,.00289418,0,.225523,.840469,.00284663,0,.243296,.82639,.00278594,0,.261709,.811759,.00271618,0,.280767,.796113,.00263187,0,.300476,.779518,.00254589,0,.320845,.763142,.00246003,0,.341883,.745464,.00236529,0,.363601,.727491,.00226536,0,.386011,.709414,.00216375,0,.409128,.691396,.00207127,0,.432967,.67368,.00197106,0,.457545,.656049,.00187022,0,.482881,.638188,.00177605,0,.508992,.620177,.00168482,0,.535899,.601506,.00158909,0,.563619,.58362,.00150583,0,.592165,.565496,.00141791,0,.621544,.54789,.00133693,0,.651743,.530323,.00126038,0,.682709,.512795,.00118556,0,.714286,.495199,.00111527,0,.746032,.478101,.0010489,0,.777778,.461511,984264e-9,0,.809524,.444879,92591e-8,0,.84127,.428424,866582e-9,0,.873016,.412495,814463e-9,0,.904762,.396975,764498e-9,0,.936508,.381614,715967e-9,0,.968254,.366732,672483e-9,0,1,1,.00155501,0,0,1,.00155503,0,0,1,.00155524,0,0,.999998,.00155615,0,0,.999994,.0015586,0,0,.999983,.00156379,0,0,.999963,.0015733,0,0,.999932,.00158911,0,0,.999882,.00161376,0,0,.99981,.00165041,0,100875e-10,.999708,.00170304,0,367658e-9,.999565,.00177658,0,.0014234,.999368,.00187688,0,.00327939,.999081,.00200989,0,.00596629,.99852,.00217177,0,.0094852,.99549,.0021745,0,.013824,.993252,.00222357,0,.0189642,.991727,.00235022,0,.0248856,.989951,.00250561,0,.0315669,.988029,.00268829,0,.0389882,.984029,.0027496,0,.0471302,.980683,.00289793,0,.0559754,.976554,.00303315,0,.0655081,.97139,.00313257,0,.0757138,.965544,.00323656,0,.08658,.95912,.00333432,0,.0980954,.951183,.0034039,0,.110251,.942974,.00347515,0,.123038,.932642,.00350381,0,.13645,.922158,.00354519,0,.150482,.909404,.00353851,0,.165129,.896071,.0035435,0,.18039,.881206,.00349936,0,.196263,.866077,.00347256,0,.212748,.85093,.003415,0,.229847,.837703,.00333367,0,.247561,.823878,.003249,0,.265895,.809449,.00316347,0,.284854,.794379,.00306351,0,.304445,.778138,.0029499,0,.324675,.761997,.00284099,0,.345555,.744938,.00272104,0,.367095,.727212,.00260715,0,.389309,.709549,.00248855,0,.41221,.691704,.00236783,0,.435814,.673689,.00225178,0,.460138,.656453,.00213765,0,.485203,.639128,.00202178,0,.511028,.621512,.00191443,0,.537634,.603598,.00180977,0,.565041,.58559,.00170456,0,.593268,.567852,.00160927,0,.622327,.5503,.00151395,0,.652217,.533033,.00142499,0,.682907,.515942,.00133955,0,.714296,.498814,.0012602,0,.746032,.481595,.00118188,0,.777778,.465117,.00111171,0,.809524,.448865,.00104091,0,.84127,.432711,976618e-9,0,.873016,.416822,91859e-8,0,.904762,.401272,857704e-9,0,.936508,.386226,807172e-9,0,.968254,.371321,75464e-8,0,1,1,.00209596,0,0,1,.00209598,0,0,1,.00209624,0,0,.999997,.00209736,0,0,.999991,.00210039,0,0,.999979,.00210678,0,0,.999959,.00211847,0,0,.999925,.0021379,0,0,.99987,.00216809,0,0,.999791,.00221281,0,681487e-10,.999677,.00227669,0,658161e-9,.999521,.00236533,0,.00200635,.999301,.00248514,0,.0041779,.998977,.00264185,0,.00718648,.998191,.00281695,0,.0110239,.994801,.00278518,0,.015672,.993091,.00288774,0,.0211091,.991571,.00303931,0,.0273123,.9897,.00321643,0,.034259,.987023,.00337332,0,.0419282,.983289,.00346146,0,.0502998,.979892,.00363704,0,.0593562,.975111,.00373601,0,.069081,.970351,.0038842,0,.0794598,.964131,.00397053,0,.0904798,.957747,.00408078,0,.10213,.949536,.00413533,0,.1144,.941372,.00420305,0,.127284,.931049,.00422815,0,.140772,.920647,.00425048,0,.154862,.908033,.0042281,0,.169548,.895028,.00422026,0,.184828,.879968,.00415042,0,.200701,.864875,.00408821,0,.217167,.84918,.00400909,0,.234227,.834934,.00391178,0,.251884,.821397,.00380066,0,.270141,.807135,.00367974,0,.289004,.792363,.00355172,0,.308479,.776661,.003411,0,.328575,.760705,.00328123,0,.349301,.744408,.00314003,0,.370668,.726994,.0029906,0,.392689,.709598,.00285034,0,.415379,.692112,.00271179,0,.438754,.674435,.00257185,0,.46283,.65676,.00243425,0,.48763,.639982,.00230351,0,.513173,.622983,.0021777,0,.539482,.605471,.00204991,0,.566579,.58796,.00193759,0,.594488,.570463,.00181976,0,.623226,.553058,.00171497,0,.6528,.535894,.00161109,0,.683198,.519089,.00151394,0,.714354,.502454,.00142122,0,.746032,.485681,.00133488,0,.777778,.468935,.00124975,0,.809524,.452951,.00117309,0,.84127,.437139,.00110155,0,.873016,.421446,.00103124,0,.904762,.405951,966387e-9,0,.936508,.391003,908119e-9,0,.968254,.376198,848057e-9,0,1,1,.00280076,0,0,1,.00280078,0,0,.999999,.00280109,0,0,.999997,.00280246,0,0,.999992,.00280616,0,0,.999979,.00281396,0,0,.999956,.00282822,0,0,.999916,.00285186,0,0,.999857,.0028885,0,0,.999768,.00294259,0,196026e-9,.999645,.00301946,0,.00104842,.99947,.00312541,0,.00270199,.999229,.00326733,0,.00519449,.998852,.00344992,0,.00852602,.997558,.00361052,0,.0126804,.994417,.0035898,0,.017635,.992824,.00372393,0,.023365,.991344,.00390695,0,.0298456,.989337,.00410392,0,.0370529,.985811,.00420987,0,.0449651,.982772,.00437488,0,.0535615,.979001,.00455069,0,.0628243,.974102,.00464462,0,.0727368,.969197,.00480577,0,.0832844,.962759,.00487818,0,.0944545,.956207,.00498176,0,.106236,.947909,.00503392,0,.118619,.939596,.00507474,0,.131595,.929642,.00509798,0,.145159,.918807,.00508476,0,.159305,.906921,.00505634,0,.174028,.893312,.00498845,0,.189327,.878933,.0049133,0,.2052,.863986,.0048259,0,.221647,.847936,.00470848,0,.23867,.832253,.00456889,0,.25627,.818619,.00442726,0,.274453,.804788,.00427677,0,.293222,.790241,.00411906,0,.312585,.775162,.00394833,0,.33255,.759463,.00377366,0,.353126,.743598,.00361026,0,.374324,.72697,.00343627,0,.396158,.709646,.00326422,0,.418641,.69277,.00309717,0,.44179,.675371,.0029356,0,.465624,.657863,.00277712,0,.490163,.640772,.00261738,0,.515429,.624441,.0024737,0,.541445,.607497,.00233125,0,.568236,.590438,.00218994,0,.595828,.573224,.0020664,0,.624242,.556168,.00193526,0,.653496,.539232,.00182463,0,.683588,.522352,.00170735,0,.714482,.506172,.00160555,0,.746032,.489842,.00150451,0,.777778,.473463,.00140938,0,.809524,.457266,.00132568,0,.84127,.441609,.0012376,0,.873016,.426348,.00116265,0,.904762,.411002,.00108935,0,.936508,.396045,.00101946,0,.968254,.381448,955665e-9,0,1,1,.0037121,0,0,1,.00371213,0,0,1,.00371251,0,0,.999997,.00371417,0,0,.99999,.00371863,0,0,.999977,.00372807,0,0,.99995,.00374529,0,0,.999908,.0037738,0,0,.999843,.00381789,0,123596e-10,.999745,.00388273,0,407442e-9,.999608,.00397443,0,.0015447,.999415,.00409998,0,.00351385,.999143,.00426662,0,.0063316,.9987,.00447625,0,.00998679,.996363,.00455323,0,.0144569,.994021,.00461052,0,.0197151,.992372,.00476359,0,.0257344,.991007,.00499101,0,.0324882,.988767,.0051972,0,.0399517,.984872,.00528407,0,.0481022,.982004,.00548926,0,.0569191,.977714,.00564385,0,.0663839,.973076,.0057693,0,.0764801,.967565,.0058924,0,.0871928,.961384,.00599629,0,.0985095,.954435,.00605998,0,.110419,.946303,.0061133,0,.122912,.937662,.00612028,0,.13598,.927867,.00612209,0,.149617,.916475,.00604813,0,.163817,.90541,.00603088,0,.178577,.891591,.00592218,0,.193894,.877573,.00578854,0,.209767,.862511,.00566648,0,.226196,.846861,.00551481,0,.243182,.83068,.00533754,0,.260728,.815725,.00515487,0,.278837,.802321,.0049655,0,.297515,.787826,.00475421,0,.316768,.773454,.00456002,0,.336605,.758224,.00434727,0,.357034,.74265,.00414444,0,.378067,.726729,.00393738,0,.399717,.710155,.00373575,0,.421998,.693312,.00353736,0,.444928,.67653,.00334368,0,.468523,.659444,.00315981,0,.492806,.642051,.00297809,0,.517798,.625758,.00280592,0,.543525,.609615,.00264254,0,.570012,.592919,.00248459,0,.597288,.576298,.00233327,0,.625379,.559489,.00219519,0,.654307,.542891,.00205441,0,.684084,.526255,.00193385,0,.714693,.509853,.00180745,0,.746044,.494131,.00169817,0,.777778,.478114,.0015913,0,.809524,.462274,.00148981,0,.84127,.446412,.00139537,0,.873016,.431274,.00130984,0,.904762,.41635,.00122403,0,.936508,.401476,.00114809,0,.968254,.386993,.00107563,0,1,1,.00488216,0,0,1,.0048822,0,0,1,.00488265,0,0,.999997,.00488463,0,0,.999988,.00488999,0,0,.999974,.00490129,0,0,.999946,.00492191,0,0,.999897,.00495598,0,0,.999825,.00500855,0,744791e-10,.999718,.00508559,0,712744e-9,.999565,.005194,0,.00215249,.999352,.00534147,0,.00444576,.999046,.00553523,0,.00759218,.998492,.00577016,0,.0115714,.995564,.00578487,0,.0163557,.993339,.00586414,0,.021915,.991834,.00606002,0,.0282201,.990496,.00633312,0,.0352433,.987826,.00651941,0,.042959,.98383,.00660842,0,.0513439,.98109,.00685523,0,.0603772,.976131,.00695778,0,.0700402,.971922,.00714236,0,.0803163,.965901,.00721437,0,.0911908,.959606,.00732017,0,.102651,.952504,.00735788,0,.114686,.944365,.00738493,0,.127286,.935652,.00737969,0,.140443,.925813,.00733612,0,.154151,.914397,.00723094,0,.168405,.903257,.00714002,0,.183201,.890015,.00700149,0,.198536,.876014,.00682813,0,.214409,.861436,.00665567,0,.23082,.845752,.00644526,0,.24777,.829169,.00621635,0,.265263,.813435,.00597789,0,.283301,.799701,.00575694,0,.301889,.785726,.00549866,0,.321035,.77152,.0052503,0,.340746,.75683,.00499619,0,.361032,.741951,.0047543,0,.381904,.726367,.0045084,0,.403374,.710537,.00426784,0,.425457,.693965,.00403487,0,.448169,.677724,.0038075,0,.47153,.66117,.00359431,0,.495561,.644274,.00338354,0,.520284,.627449,.00318163,0,.545725,.611645,.00299672,0,.571911,.595614,.00281016,0,.598873,.579426,.00264252,0,.62664,.563016,.00247509,0,.655239,.546728,.00232647,0,.684692,.530539,.00217803,0,.714999,.514164,.00204216,0,.746106,.498344,.00191403,0,.777778,.482957,.00179203,0,.809524,.467336,.00167695,0,.84127,.451994,.00157567,0,.873016,.436514,.00147113,0,.904762,.42178,.00138034,0,.936508,.407271,.00129219,0,.968254,.392822,.0012098,0,1,1,.00637427,0,0,1,.00637431,0,0,.999999,.00637485,0,0,.999996,.00637721,0,0,.999987,.00638357,0,0,.999971,.006397,0,0,.999939,.00642142,0,0,.999888,.00646177,0,0,.999807,.00652387,0,207916e-9,.999689,.00661454,0,.00112051,.99952,.00674155,0,.00287719,.999283,.00691313,0,.00550145,.998936,.00713598,0,.00897928,.998165,.00738501,0,.0132829,.994847,.00734388,0,.01838,.993182,.00749991,0,.0242381,.991665,.0077246,0,.030826,.989708,.00797579,0,.0381152,.986663,.00813011,0,.0460794,.983288,.00830365,0,.0546951,.980104,.00853496,0,.0639411,.974855,.00861045,0,.0737988,.97045,.00879133,0,.0842516,.964509,.00886377,0,.0952848,.957594,.00890346,0,.106886,.950546,.00893289,0,.119044,.942225,.00890074,0,.131749,.933365,.00886826,0,.144994,.923202,.0087316,0,.158772,.912605,.00863082,0,.173078,.901099,.00847403,0,.187908,.888177,.00825838,0,.203261,.873955,.00801834,0,.219134,.860091,.00779026,0,.235527,.84434,.00752478,0,.252443,.828517,.00724074,0,.269883,.81239,.00693769,0,.287851,.79721,.00664817,0,.306352,.783489,.00634763,0,.325393,.769514,.00604221,0,.344981,.755419,.00573568,0,.365126,.741083,.00544359,0,.385839,.726059,.00515515,0,.407132,.710809,.00487139,0,.42902,.695052,.00459846,0,.45152,.678886,.00433412,0,.474651,.663042,.00407981,0,.498433,.646634,.00384264,0,.52289,.630117,.00360897,0,.548048,.613804,.00338863,0,.573936,.598338,.00318486,0,.600584,.582687,.00298377,0,.628027,.566809,.00280082,0,.656295,.550817,.00262255,0,.685417,.534937,.00245835,0,.715406,.519151,.00230574,0,.74624,.503118,.0021549,0,.777778,.487723,.00202008,0,.809524,.472725,.00189355,0,.84127,.457599,.00177108,0,.873016,.442558,.00165843,0,.904762,.427624,.00155494,0,.936508,.413171,.00145273,0,.968254,.399122,.00136454,0,1,1,.00826496,0,0,1,.00826499,0,0,1,.00826564,0,0,.999996,.00826842,0,0,.999987,.00827589,0,0,.999967,.00829167,0,0,.999933,.00832037,0,0,.999876,.00836768,0,109338e-10,.999786,.00844031,0,427145e-9,.999655,.00854603,0,.0016384,.999468,.00869337,0,.00372392,.999203,.008891,0,.00668513,.998803,.00914387,0,.0104968,.99748,.00935838,0,.015125,.994446,.00933309,0,.0205338,.99292,.00953084,0,.0266884,.991414,.0097893,0,.0335565,.989049,.0100228,0,.0411086,.98582,.0101664,0,.0493181,.982441,.0103582,0,.0581613,.978595,.0105292,0,.0676169,.973495,.0106274,0,.0776661,.968405,.0107261,0,.0882926,.962717,.0108234,0,.0994817,.955478,.0108102,0,.111221,.948275,.0107914,0,.123499,.940006,.0107161,0,.136308,.930831,.0106309,0,.149639,.920648,.0104083,0,.163485,.910205,.0102312,0,.177843,.898445,.0100051,0,.192707,.885986,.00971928,0,.208077,.872204,.00940747,0,.22395,.858436,.0091085,0,.240326,.843454,.00876595,0,.257208,.827437,.00839794,0,.274596,.811488,.00803692,0,.292496,.796039,.00767352,0,.310911,.781083,.0073097,0,.329849,.767642,.00694032,0,.349316,.753901,.00657476,0,.369323,.740131,.00622699,0,.38988,.725845,.0058838,0,.410999,.710991,.00555586,0,.432696,.696002,.00523089,0,.454987,.680461,.00492494,0,.47789,.664875,.00463464,0,.501426,.649273,.00435422,0,.52562,.63302,.0040875,0,.550498,.61705,.00384075,0,.576089,.601154,.00359557,0,.602427,.586008,.00337636,0,.629544,.570699,.00316019,0,.657479,.555166,.00296033,0,.686264,.539645,.00277552,0,.715924,.524159,.00259499,0,.746459,.508682,.00243257,0,.777789,.493163,.00227851,0,.809524,.478004,.00213083,0,.84127,.46347,.00199502,0,.873016,.448778,.00186967,0,.904762,.434105,.00174732,0,.936508,.419576,.00163861,0,.968254,.405541,.00153341,0,1,1,.0106462,0,0,1,.0106462,0,0,.999999,.010647,0,0,.999995,.0106502,0,0,.999985,.0106589,0,0,.999964,.0106773,0,0,.999925,.0107106,0,0,.999861,.0107655,0,712986e-10,.999763,.0108497,0,743959e-9,.999616,.0109716,0,.00227361,.999408,.0111408,0,.0046983,.999112,.0113659,0,.00800158,.998637,.0116475,0,.0121493,.996223,.0117231,0,.0171023,.994006,.0118064,0,.0228218,.992444,.0120254,0,.0292711,.991028,.0123314,0,.036417,.98803,.0124954,0,.0442295,.984816,.0126538,0,.0526815,.981399,.0128537,0,.0617492,.977085,.0129694,0,.0714114,.972154,.013091,0,.0816495,.966617,.0131166,0,.0924472,.960628,.0131583,0,.10379,.953295,.0131094,0,.115665,.94575,.0129966,0,.128062,.937654,.0128796,0,.140972,.927716,.0126477,0,.154387,.917932,.0123889,0,.168301,.907719,.012131,0,.182709,.89584,.0118013,0,.197608,.883526,.0114145,0,.212994,.870301,.0110075,0,.228867,.856272,.0106019,0,.245227,.842251,.0101938,0,.262074,.826466,.00973254,0,.279412,.810859,.0092846,0,.297244,.795051,.00883304,0,.315575,.780053,.00840272,0,.334412,.76575,.00796438,0,.35376,.752298,.00752526,0,.373631,.739153,.00711486,0,.394034,.725514,.00670361,0,.414983,.711473,.00632656,0,.436491,.696936,.00595206,0,.458575,.682126,.00559191,0,.481253,.667027,.00525362,0,.504547,.651875,.00493805,0,.528481,.636463,.00462848,0,.553081,.620641,.00433936,0,.578377,.604931,.00407,0,.604404,.589549,.00380864,0,.631197,.574712,.00357049,0,.658795,.559775,.00334466,0,.687238,.544514,.00312505,0,.716559,.529555,.00293199,0,.746776,.514402,.00274204,0,.777849,.499302,.00256647,0,.809524,.484114,.00239901,0,.84127,.469308,.00225148,0,.873016,.455133,.00210178,0,.904762,.440939,.0019727,0,.936508,.426627,.00184382,0,.968254,.412509,.00172548,0,1,1,.013628,0,0,1,.0136281,0,0,.999999,.0136289,0,0,.999995,.0136327,0,0,.999983,.0136427,0,0,.99996,.0136638,0,0,.999917,.0137022,0,0,.999846,.0137652,0,204597e-9,.999736,.0138615,0,.00116837,.999573,.0140007,0,.00303325,.99934,.0141927,0,.00580613,.999004,.0144457,0,.00945626,.998407,.0147489,0,.0139421,.995464,.014731,0,.0192202,.993328,.0148283,0,.0252495,.991799,.0150797,0,.0319921,.990397,.0154316,0,.0394138,.986835,.0155005,0,.0474843,.983938,.0157308,0,.0561763,.980154,.0158753,0,.0654661,.975659,.0159581,0,.0753326,.970171,.0159832,0,.0857571,.964803,.0160084,0,.0967236,.958366,.0159484,0,.108218,.950613,.0158001,0,.120227,.942874,.0155845,0,.132741,.935005,.0154292,0,.145751,.924991,.0150742,0,.159249,.914814,.0146757,0,.17323,.904743,.0143097,0,.187687,.893216,.0138695,0,.202619,.880769,.0133706,0,.218021,.868136,.0128606,0,.233894,.85469,.0123403,0,.250238,.840593,.0118091,0,.267052,.825808,.011253,0,.284341,.81009,.0107099,0,.302106,.79504,.0101636,0,.320354,.779757,.00964041,0,.33909,.764697,.00911896,0,.358322,.750913,.00859533,0,.378059,.738175,.00811592,0,.398311,.725242,.00764504,0,.41909,.711864,.00718885,0,.440412,.698009,.00675843,0,.462292,.683841,.00634984,0,.484748,.669391,.00595502,0,.507802,.654731,.00558671,0,.531477,.639805,.00523578,0,.555802,.624789,.00490834,0,.580805,.609325,.00459448,0,.606522,.593975,.00430342,0,.63299,.578983,.00403019,0,.66025,.564442,.0037707,0,.688346,.549835,.0035316,0,.717319,.535039,.00330255,0,.7472,.520403,.00308932,0,.777982,.505687,.00289335,0,.809524,.490939,.00270818,0,.84127,.476233,.0025343,0,.873016,.461624,.00237097,0,.904762,.447833,.00222065,0,.936508,.433992,.00207561,0,.968254,.420147,.00194955,0,1,1,.0173415,0,0,1,.0173416,0,0,.999999,.0173426,0,0,.999995,.0173468,0,0,.999983,.0173582,0,0,.999954,.0173822,0,0,.999908,.0174258,0,669501e-11,.999828,.0174973,0,427399e-9,.999705,.0176063,0,.00171019,.999524,.0177631,0,.0039248,.999263,.0179781,0,.00705382,.998878,.018258,0,.0110552,.998012,.0185551,0,.0158812,.994614,.0184264,0,.0214852,.993132,.0186385,0,.0278239,.991563,.0189067,0,.0348585,.989298,.0191577,0,.0425544,.986036,.0192522,0,.050881,.982558,.0194063,0,.059811,.978531,.019486,0,.0693209,.974198,.0195847,0,.0793895,.968148,.0194749,0,.0899984,.962565,.0194277,0,.101132,.956041,.0192991,0,.112775,.947749,.0189893,0,.124917,.94018,.018704,0,.137547,.93165,.0183458,0,.150655,.921798,.0178775,0,.164236,.911573,.0173618,0,.178281,.901569,.0168482,0,.192788,.890341,.016265,0,.207752,.877835,.0156199,0,.223171,.865472,.0149516,0,.239044,.852905,.0143274,0,.255371,.838906,.0136643,0,.272153,.824888,.0129903,0,.289393,.809977,.0123218,0,.307093,.794697,.0116572,0,.325259,.780028,.0110307,0,.343896,.765124,.0104236,0,.363012,.750411,.0098219,0,.382617,.737264,.00924397,0,.402719,.724799,.00868719,0,.423332,.712253,.00816476,0,.444469,.699267,.00767262,0,.466146,.685618,.00719746,0,.488383,.671736,.00673916,0,.511199,.657777,.00631937,0,.534618,.643497,.00592411,0,.558668,.62889,.00553928,0,.58338,.614299,.0051934,0,.608787,.599197,.00485985,0,.634929,.584175,.00454357,0,.661849,.569541,.00425787,0,.689594,.555193,.00397905,0,.718211,.540947,.00372364,0,.747742,.526593,.00348599,0,.778205,.512335,.00326103,0,.80953,.498017,.00305137,0,.84127,.483609,.00285485,0,.873016,.469368,.00267472,0,.904762,.455037,.00249945,0,.936508,.441493,.00234792,0,.968254,.428147,.00219936,0,1,1,.0219422,0,0,1,.0219423,0,0,.999998,.0219434,0,0,.999993,.0219481,0,0,.999981,.021961,0,0,.999949,.0219879,0,0,.999896,.0220367,0,593194e-10,.999808,.0221167,0,75364e-8,.99967,.0222383,0,.00237884,.999466,.0224125,0,.00495612,.999174,.0226495,0,.00844887,.998725,.0229525,0,.0128058,.996979,.0231123,0,.0179742,.994317,.0230742,0,.0239047,.992781,.0232895,0,.0305526,.991191,.0235734,0,.0378786,.987787,.0236152,0,.0458475,.985092,.0237994,0,.0544287,.981121,.0238553,0,.0635952,.976924,.0238706,0,.0733233,.97218,.0238704,0,.0835922,.965956,.0236598,0,.0943839,.959998,.0234735,0,.105682,.953245,.0232277,0,.117474,.944445,.0226973,0,.129747,.937087,.0223527,0,.142491,.928341,.0218144,0,.155697,.9184,.0211516,0,.169358,.907959,.0204553,0,.183469,.89808,.0197673,0,.198024,.887047,.0189915,0,.21302,.875221,.0182082,0,.228455,.86269,.0173584,0,.244329,.850735,.0165718,0,.260639,.837545,.0157524,0,.277389,.823639,.0149482,0,.29458,.809699,.0141431,0,.312216,.794797,.0133527,0,.3303,.780578,.0126193,0,.34884,.766019,.0118914,0,.367842,.751447,.0111839,0,.387315,.737275,.010514,0,.40727,.724545,.00987277,0,.427717,.712644,.00926569,0,.448671,.700432,.00869029,0,.470149,.687664,.00814691,0,.492167,.674288,.00763012,0,.514746,.660966,.00714437,0,.537911,.647264,.00668457,0,.561688,.633431,.00626581,0,.586108,.619133,.00585593,0,.611206,.604935,.00548188,0,.637022,.590236,.00513288,0,.663599,.575473,.0047906,0,.690989,.561228,.00448895,0,.719242,.547054,.00420233,0,.748411,.533175,.00392869,0,.778531,.519163,.00367445,0,.809583,.505328,.00344097,0,.84127,.491446,.00322003,0,.873016,.477356,.00301283,0,.904762,.46356,.00282592,0,.936508,.449623,.00264956,0,.968254,.436068,.00246956,0,1,1,.0276135,0,0,1,.0276136,0,0,.999998,.0276148,0,0,.999993,.0276201,0,0,.999976,.0276342,0,0,.999945,.027664,0,0,.999884,.0277179,0,18679e-8,.999784,.027806,0,.00119607,.99963,.0279394,0,.00318407,.999401,.0281295,0,.00613601,.999066,.0283858,0,.00999963,.998524,.0287027,0,.0147164,.995702,.0286256,0,.0202295,.993593,.0286733,0,.0264876,.992067,.0288989,0,.0334452,.990548,.0292135,0,.0410621,.986775,.0291296,0,.0493032,.984054,.0293099,0,.0581381,.979481,.0291881,0,.0675397,.975297,.0291598,0,.0774848,.96981,.028954,0,.0879528,.963524,.028628,0,.0989258,.957398,.0283135,0,.110388,.950088,.0278469,0,.122327,.941538,.0271798,0,.134729,.933332,.0265388,0,.147587,.924392,.0257776,0,.160889,.914581,.024916,0,.174631,.904347,.0240242,0,.188806,.894324,.0231229,0,.203409,.883724,.022153,0,.218437,.872207,.0211355,0,.233888,.859927,.0201048,0,.249761,.848373,.0191263,0,.266056,.836023,.0181306,0,.282774,.82289,.0171718,0,.299917,.809324,.0162196,0,.317488,.795361,.0152622,0,.335493,.781253,.01439,0,.353936,.767338,.013533,0,.372825,.753156,.0127244,0,.392168,.739122,.0119454,0,.411976,.725358,.0112054,0,.432259,.712949,.010487,0,.453032,.701621,.00984032,0,.47431,.689703,.00921495,0,.496111,.677216,.00862492,0,.518456,.664217,.00806882,0,.541367,.65137,.00755922,0,.564872,.638,.00705705,0,.589001,.62453,.00661266,0,.613789,.610601,.00618432,0,.639277,.59676,.00578033,0,.66551,.582433,.00540927,0,.692539,.568026,.00506104,0,.720422,.55414,.0047353,0,.749216,.540178,.00442889,0,.778974,.526513,.00414363,0,.809711,.512954,.00388237,0,.84127,.499403,.00362875,0,.873016,.486026,.00340827,0,.904762,.472345,.00318598,0,.936508,.458828,.00297635,0,.968254,.445379,.00279447,0,1,1,.0345716,0,0,1,.0345717,0,0,.999999,.034573,0,0,.999991,.0345787,0,0,.999974,.0345941,0,0,.999937,.0346263,0,188589e-11,.999869,.0346847,0,409238e-9,.999757,.0347798,0,.0017674,.999582,.0349233,0,.00413658,.999322,.0351265,0,.00747408,.998939,.0353967,0,.0117157,.998219,.0357018,0,.0167966,.994974,.0354726,0,.0226572,.993201,.0355621,0,.0292445,.991573,.0357641,0,.0365123,.989301,.0359252,0,.0444203,.985712,.0358017,0,.0529334,.982411,.0358353,0,.0620214,.977827,.035617,0,.0716574,.973278,.0354398,0,.0818186,.967397,.0350483,0,.0924846,.960696,.0344795,0,.103638,.954349,.0339861,0,.115263,.946066,.0331323,0,.127348,.938012,.032359,0,.13988,.929413,.0314413,0,.152849,.920355,.0304103,0,.166248,.910586,.0292785,0,.18007,.900609,.0281391,0,.194308,.890093,.0269103,0,.208958,.880013,.0257269,0,.224018,.869001,.0244671,0,.239485,.85751,.0232252,0,.255359,.84582,.0220117,0,.271638,.834383,.0208274,0,.288324,.822158,.0196628,0,.305419,.809056,.0185306,0,.322927,.795832,.0174174,0,.340851,.782547,.0163758,0,.359199,.7689,.015391,0,.377975,.755526,.0144488,0,.397189,.741681,.0135372,0,.416851,.728178,.0126957,0,.436971,.714642,.0118812,0,.457564,.702756,.0111165,0,.478644,.69175,.0104145,0,.500229,.680159,.00974439,0,.522339,.668073,.00911926,0,.544997,.655405,.00851393,0,.56823,.642921,.00797637,0,.592068,.629993,.00745119,0,.616546,.616828,.00696972,0,.641705,.603305,.00652425,0,.66759,.589833,.00610188,0,.694255,.575945,.00570834,0,.72176,.561745,.00533384,0,.750168,.548277,.00500001,0,.779545,.534467,.00467582,0,.809933,.521032,.00438092,0,.841272,.507877,.00410348,0,.873016,.494654,.00383618,0,.904762,.481592,.00358699,0,.936508,.468509,.00337281,0,.968254,.455293,.00316196,0,1,1,.0430698,0,0,1,.0430699,0,0,.999998,.0430713,0,0,.999991,.0430773,0,0,.99997,.0430936,0,0,.999928,.0431277,0,406396e-10,.999852,.0431893,0,744376e-9,.999724,.0432895,0,.0024806,.999527,.0434397,0,.00524779,.99923,.0436507,0,.00898164,.998783,.0439255,0,.0136083,.997507,.0441104,0,.0190582,.994418,.0438225,0,.0252694,.992864,.0439396,0,.0321879,.991127,.0440962,0,.039767,.987331,.0438408,0,.0479667,.984819,.0438991,0,.056752,.980384,.0435906,0,.0660929,.975846,.0432543,0,.075963,.970748,.0428293,0,.0863398,.964303,.042153,0,.0972035,.95772,.0414111,0,.108537,.950747,.0405893,0,.120325,.942533,.0394887,0,.132554,.934045,.0383544,0,.145215,.924942,.037057,0,.158296,.915811,.0356993,0,.17179,.90612,.0342401,0,.185691,.896434,.0328078,0,.199993,.886021,.031288,0,.214691,.876081,.0297776,0,.229782,.865608,.0282334,0,.245265,.854924,.026749,0,.261138,.843607,.02526,0,.277401,.832456,.0238214,0,.294056,.821342,.0224682,0,.311104,.809303,.0211297,0,.328548,.796468,.0198387,0,.346394,.784046,.0186227,0,.364645,.771262,.0174561,0,.38331,.758118,.0163806,0,.402396,.745075,.0153287,0,.421912,.731926,.0143647,0,.44187,.71863,.0134363,0,.462283,.705414,.0125603,0,.483165,.693792,.0117508,0,.504535,.683108,.0110016,0,.52641,.67183,.0102757,0,.548816,.66015,.00962044,0,.571776,.647907,.00898031,0,.595323,.635734,.00840811,0,.619489,.623208,.00786211,0,.644317,.610438,.00734953,0,.669852,.597345,.00687688,0,.696148,.584138,.00643469,0,.723267,.5707,.00602236,0,.75128,.556966,.0056324,0,.780258,.543607,.00528277,0,.810268,.530213,.00493999,0,.841311,.516912,.00462265,0,.873016,.503916,.0043307,0,.904762,.491146,.00406858,0,.936508,.478439,.00381436,0,.968254,.465834,.00358003,0,1,1,.0534039,0,0,1,.053404,0,0,.999998,.0534055,0,0,.999989,.0534116,0,0,.999968,.0534283,0,0,.999918,.0534633,0,155895e-9,.99983,.0535262,0,.00120914,.999685,.0536281,0,.00334944,.999461,.0537799,0,.00653077,.999119,.0539902,0,.0106718,.998582,.0542524,0,.0156907,.995919,.0540318,0,.0215147,.993735,.0538914,0,.0280801,.992126,.0539557,0,.0353323,.990266,.0540401,0,.0432247,.986317,.0536064,0,.0517172,.983213,.0534425,0,.0607754,.978303,.0528622,0,.0703698,.973665,.0523363,0,.0804742,.968091,.0516165,0,.0910667,.961026,.0505434,0,.102128,.954333,.049523,0,.113641,.946372,.0481698,0,.125591,.938254,.0467674,0,.137965,.929516,.0452341,0,.150754,.920106,.0435083,0,.163947,.910899,.0417399,0,.177537,.901532,.0399389,0,.191516,.891919,.0380901,0,.205881,.882006,.0362341,0,.220626,.871965,.0343444,0,.235749,.862145,.0324832,0,.251248,.852058,.0306681,0,.267121,.84161,.0289097,0,.283368,.830806,.0272079,0,.299992,.820476,.0256089,0,.316992,.809514,.0240394,0,.334374,.797865,.0225379,0,.35214,.785621,.0211235,0,.370296,.773765,.0197908,0,.388849,.761629,.0185235,0,.407807,.748891,.0173358,0,.427178,.736437,.0162305,0,.446974,.723707,.0151778,0,.467207,.710606,.0141791,0,.487892,.698019,.0132592,0,.509046,.686203,.0123887,0,.530687,.675692,.0115976,0,.552839,.664826,.0108325,0,.575527,.65349,.0101348,0,.59878,.641774,.00947756,0,.622634,.629794,.00886058,0,.647128,.617647,.00828526,0,.672308,.60534,.00775312,0,.698231,.592718,.00726033,0,.724958,.579746,.00679731,0,.752563,.566763,.00636111,0,.781127,.553515,.00595228,0,.810733,.540118,.00556876,0,.841426,.527325,.00523051,0,.873016,.514265,.00490712,0,.904762,.501406,.00460297,0,.936508,.488922,.00431247,0,.968254,.476541,.0040472,0,1,1,.0659184,0,0,1,.0659185,0,0,.999998,.06592,0,0,.999988,.0659259,0,0,.999963,.0659423,0,0,.999907,.0659764,0,374198e-9,.999806,.0660376,0,.00182071,.999639,.0661361,0,.0043894,.999378,.0662814,0,.00800055,.998985,.0664779,0,.0125594,.998285,.0666914,0,.0179786,.995071,.0661989,0,.0241822,.993172,.0660454,0,.031106,.991438,.0660105,0,.0386952,.988428,.0656875,0,.0469032,.985218,.0652913,0,.0556905,.981128,.0647107,0,.065023,.976015,.0638491,0,.0748717,.97097,.062993,0,.0852112,.964582,.0617927,0,.0960199,.957383,.0603626,0,.107279,.949969,.0588128,0,.118971,.941843,.0570274,0,.131084,.933624,.0551885,0,.143604,.924543,.053122,0,.156521,.914919,.0508897,0,.169825,.905773,.0486418,0,.18351,.896434,.0463364,0,.197569,.887195,.0440623,0,.211997,.877706,.0417799,0,.226789,.867719,.03945,0,.241944,.858587,.037243,0,.257458,.849317,.0350956,0,.273331,.839585,.0329852,0,.289563,.829856,.0310028,0,.306154,.819589,.0290953,0,.323108,.809714,.0272738,0,.340426,.79934,.0255631,0,.358113,.788224,.0239175,0,.376175,.776619,.0223831,0,.394616,.76521,.0209298,0,.413445,.753716,.0195786,0,.432671,.741564,.0183001,0,.452305,.729413,.0171259,0,.472358,.717146,.0159933,0,.492845,.70436,.0149495,0,.513783,.69219,.0139681,0,.535189,.680289,.0130577,0,.557087,.669611,.0122198,0,.5795,.659113,.0114174,0,.602459,.648148,.0106729,0,.625997,.636905,.00998997,0,.650154,.625154,.00934313,0,.674976,.613481,.00874839,0,.700518,.60154,.00818265,0,.726845,.58943,.00766889,0,.754032,.576828,.00717153,0,.782167,.564194,.00672696,0,.811344,.551501,.00630863,0,.841644,.538635,.00592177,0,.873016,.525724,.00554888,0,.904762,.513209,.00520225,0,.936508,.500457,.00488231,0,.968254,.48799,.00457153,0,1,1,.0810131,0,0,1,.0810133,0,0,.999997,.0810145,0,0,.999985,.08102,0,0,.999956,.0810347,0,195026e-10,.999893,.0810656,0,719316e-9,.999777,.0811205,0,.00259774,.999583,.081208,0,.00561807,.999281,.0813343,0,.00967472,.998813,.0814969,0,.0146627,.997597,.0815217,0,.0204902,.994379,.0808502,0,.0270802,.992744,.0806792,0,.0343674,.990745,.0804589,0,.0422974,.986646,.0796107,0,.0508242,.983611,.0790913,0,.0599087,.978869,.0780746,0,.0695175,.973475,.0768218,0,.0796223,.967845,.0754926,0,.0901983,.960778,.0737063,0,.101224,.953333,.0718052,0,.112682,.945274,.0695946,0,.124555,.936955,.0672492,0,.136831,.928319,.0647732,0,.149496,.919075,.0620947,0,.162542,.909114,.0591816,0,.175958,.900137,.0563917,0,.189739,.891069,.0535392,0,.203877,.882262,.0507642,0,.218368,.873232,.0479793,0,.233208,.864042,.045226,0,.248393,.855002,.0425413,0,.263923,.846569,.0400126,0,.279796,.837714,.0375269,0,.296012,.828918,.0352027,0,.312573,.819783,.0330011,0,.329479,.810129,.0308908,0,.346734,.800866,.0289112,0,.364342,.79093,.0270255,0,.382307,.780593,.0252758,0,.400637,.769511,.0236178,0,.419337,.758558,.0220652,0,.438418,.747632,.0206289,0,.457889,.736146,.0192873,0,.477761,.724093,.0180333,0,.49805,.71234,.0168264,0,.51877,.700201,.015746,0,.53994,.687949,.0147027,0,.561581,.676163,.0137512,0,.583718,.665001,.0128655,0,.60638,.65472,.0120366,0,.629599,.644213,.0112604,0,.653415,.633382,.0105413,0,.677874,.62212,.00986498,0,.70303,.610631,.00923308,0,.728948,.599078,.00864206,0,.755706,.587519,.00811784,0,.783396,.575505,.00761237,0,.812121,.563148,.00713949,0,.841989,.550828,.00668379,0,.873035,.538458,.00627715,0,.904762,.525905,.00588336,0,.936508,.513517,.00552687,0,.968254,.501395,.00519681,0,1,1,.0991506,0,0,1,.0991504,0,0,.999996,.0991515,0,0,.999984,.0991558,0,0,.999947,.0991672,0,114389e-9,.999874,.0991912,0,.00121503,.999739,.0992331,0,.00356108,.999514,.0992983,0,.00705578,.999159,.0993877,0,.011574,.998586,.0994837,0,.017003,.995731,.0988425,0,.0232484,.993384,.098276,0,.0302318,.991615,.0979269,0,.0378884,.989029,.0973432,0,.0461641,.985373,.0963539,0,.0550136,.981278,.0952306,0,.0643988,.975777,.0936233,0,.0742868,.970526,.0920219,0,.0846501,.963755,.0898912,0,.0954644,.956676,.0876064,0,.106709,.948099,.0847751,0,.118367,.939718,.0818638,0,.130423,.931305,.078857,0,.142862,.922342,.0756127,0,.155674,.912842,.0721473,0,.168849,.903304,.0686195,0,.182378,.89411,.0650589,0,.196255,.885512,.0616022,0,.210473,.877193,.0582434,0,.225027,.86877,.0548979,0,.239915,.860267,.0516095,0,.255132,.851915,.048468,0,.270678,.843912,.0454447,0,.286551,.83604,.0425612,0,.302751,.828245,.0398752,0,.31928,.820159,.0373198,0,.336138,.81167,.034916,0,.35333,.802659,.0326402,0,.370858,.793921,.0304901,0,.388728,.784713,.0284857,0,.406944,.774946,.0266186,0,.425515,.76448,.0248593,0,.444449,.753793,.0232114,0,.463756,.743506,.0217039,0,.483447,.732555,.0202841,0,.503535,.720965,.0189648,0,.524036,.709422,.0177189,0,.544968,.697756,.0165626,0,.56635,.685565,.015483,0,.588208,.673987,.0144892,0,.610569,.66244,.0135607,0,.633466,.651675,.0126956,0,.656936,.641598,.0118788,0,.681025,.63121,.0111261,0,.705788,.620514,.010437,0,.731289,.609366,.00978747,0,.757606,.598137,.00917257,0,.784834,.586966,.00859778,0,.813085,.575549,.00806803,0,.842485,.563797,.00757294,0,.87313,.551758,.00710592,0,.904762,.539894,.0066841,0,.936508,.527901,.00627901,0,.968254,.515819,.00590506,0,1,1,.120864,0,0,1,.120864,0,0,.999996,.120864,0,0,.99998,.120867,0,0,.99994,.120872,0,323781e-9,.999852,.120884,0,.00188693,.999693,.120903,0,.00473489,.999426,.120929,0,.00872704,.999002,.120955,0,.0137237,.998235,.120918,0,.0196068,.994608,.119764,0,.0262803,.992997,.119265,0,.0336657,.990968,.11863,0,.0416987,.987002,.117261,0,.0503261,.983524,.116009,0,.0595035,.97875,.114252,0,.0691935,.972652,.11193,0,.0793645,.966613,.109555,0,.0899894,.959275,.106612,0,.101045,.951272,.103375,0,.112512,.942323,.0996594,0,.124372,.933679,.0958841,0,.136611,.924822,.0919265,0,.149216,.915742,.0878061,0,.162176,.906348,.0834894,0,.175482,.896883,.079085,0,.189125,.88774,.0746745,0,.203098,.87986,.0705773,0,.217396,.871998,.0665005,0,.232015,.864325,.0625413,0,.24695,.856685,.0586781,0,.2622,.84925,.0550063,0,.277761,.841719,.0514727,0,.293634,.834755,.0481398,0,.309819,.827853,.0450172,0,.326315,.820888,.0420969,0,.343126,.813616,.0393702,0,.360254,.805767,.0367771,0,.377701,.797338,.0343274,0,.395474,.789122,.0320529,0,.413577,.780601,.0299485,0,.432018,.771424,.0279812,0,.450804,.761502,.0261054,0,.469944,.751166,.0243942,0,.489451,.741276,.0228087,0,.509337,.730898,.0213265,0,.529617,.719878,.0199307,0,.550307,.708379,.0186574,0,.571428,.697165,.0174446,0,.593003,.685554,.0163144,0,.615059,.673631,.015276,0,.637628,.662385,.0143003,0,.660746,.651059,.0134112,0,.68446,.640451,.0125794,0,.70882,.630536,.011793,0,.733893,.620316,.0110547,0,.759756,.609722,.0103668,0,.786505,.598804,.00973009,0,.814259,.587871,.00912812,0,.843157,.577121,.00858916,0,.87334,.566019,.00807333,0,.904762,.554664,.00759687,0,.936508,.543101,.00714759,0,.968254,.531558,.00673418,0,1,1,.146767,0,0,1,.146767,0,0,.999997,.146767,0,0,.999977,.146765,0,320658e-11,.999929,.146762,0,682576e-9,.999823,.146753,0,.00276402,.999633,.146735,0,.00614771,.999314,.146699,0,.0106613,.998796,.14662,0,.0161546,.997124,.146107,0,.0225063,.994062,.144857,0,.0296198,.992154,.144011,0,.037417,.989186,.142712,0,.0458348,.985279,.140926,0,.0548211,.980826,.13885,0,.0643326,.975056,.136168,0,.074333,.969005,.133217,0,.0847917,.961554,.12959,0,.0956828,.954206,.125886,0,.106984,.945046,.121335,0,.118675,.935678,.116492,0,.130741,.926748,.111635,0,.143166,.917764,.106625,0,.155939,.908358,.101325,0,.169049,.899219,.0960249,0,.182487,.890089,.0906527,0,.196245,.881488,.0853905,0,.210317,.874031,.0804177,0,.224697,.866932,.0756005,0,.23938,.859976,.0709019,0,.254364,.853375,.0664391,0,.269646,.846971,.0622012,0,.285223,.840483,.058129,0,.301096,.833969,.0542762,0,.317265,.82806,.0507042,0,.333729,.822128,.047368,0,.350491,.815989,.044272,0,.367554,.809336,.0413444,0,.38492,.802177,.038601,0,.402594,.79441,.0360227,0,.420582,.786573,.0336383,0,.438891,.778619,.0314321,0,.457527,.77,.029362,0,.476499,.760698,.0274102,0,.49582,.750932,.0256146,0,.5155,.740993,.023974,0,.535555,.731159,.0224182,0,.556,.720836,.0209889,0,.576855,.709913,.0196411,0,.598143,.698415,.0183824,0,.619888,.68745,.0172222,0,.642123,.676154,.0161509,0,.664883,.664383,.0151397,0,.688211,.6533,.0141873,0,.71216,.642072,.0133105,0,.736792,.631412,.0124932,0,.762186,.621622,.0117408,0,.788439,.611681,.0110358,0,.815672,.60142,.0103775,0,.844034,.59083,.00975623,0,.873699,.580254,.00918084,0,.904765,.569841,.00864721,0,.936508,.559224,.00815731,0,.968254,.548315,.00767924,0,1,1,.177563,0,0,1,.177563,0,0,.999994,.177562,0,0,.999972,.177555,0,664171e-10,.999914,.177536,0,.0012276,.999787,.177496,0,.00388025,.999556,.17742,0,.00783463,.999165,.177285,0,.0128953,.9985,.177037,0,.0189053,.995388,.175634,0,.025742,.993102,.174375,0,.033309,.990992,.173121,0,.0415298,.986932,.170896,0,.0503425,.982786,.16847,0,.0596964,.977592,.165455,0,.0695498,.971075,.161676,0,.0798676,.963967,.157458,0,.0906201,.956397,.152836,0,.101783,.947489,.147467,0,.113333,.937564,.14145,0,.125254,.928182,.135383,0,.137529,.919027,.129212,0,.150144,.909618,.12276,0,.163088,.900492,.116273,0,.176351,.891671,.1098,0,.189924,.883146,.103362,0,.203799,.875151,.0970799,0,.21797,.868338,.0911732,0,.232433,.862033,.0854966,0,.247182,.856107,.0800691,0,.262216,.850644,.0749618,0,.27753,.845261,.070079,0,.293124,.839885,.0654321,0,.308997,.834609,.0610975,0,.325149,.829083,.0569741,0,.341581,.82404,.0531736,0,.358294,.818968,.049665,0,.37529,.813496,.0463856,0,.392573,.807533,.0433217,0,.410148,.80099,.0404402,0,.428019,.793891,.0377578,0,.446192,.786281,.0352616,0,.464676,.778773,.0329577,0,.483478,.770737,.030808,0,.502608,.762094,.0287964,0,.522079,.752898,.0269254,0,.541905,.743306,.0251926,0,.5621,.733416,.023595,0,.582684,.723742,.0221155,0,.603677,.713542,.0207435,0,.625106,.702755,.019434,0,.646998,.691484,.0182046,0,.66939,.680531,.0170771,0,.692324,.66953,.0160339,0,.715849,.658126,.0150677,0,.740028,.646933,.0141551,0,.764937,.636107,.0133179,0,.790673,.625271,.0125284,0,.817358,.615225,.0117937,0,.84515,.605678,.0111181,0,.874244,.59583,.0104759,0,.904828,.585704,.00986672,0,.936508,.575413,.00929712,0,.968254,.565373,.00876713,0,1,1,.214058,0,0,.999999,.214058,0,0,.999994,.214055,0,0,.999966,.214039,0,259642e-9,.999893,.213998,0,.00200075,.999737,.21391,0,.00527775,.999449,.213745,0,.00983959,.99896,.213458,0,.0154755,.9979,.212855,0,.0220249,.994278,.210779,0,.0293654,.992254,.20926,0,.0374021,.98881,.206908,0,.0460604,.984715,.204009,0,.0552802,.979738,.200471,0,.0650127,.972884,.195813,0,.0752175,.965996,.190856,0,.0858612,.957974,.185077,0,.0969155,.949155,.17868,0,.108356,.939288,.171513,0,.120163,.928996,.163838,0,.132319,.919563,.156246,0,.144808,.910004,.148359,0,.157618,.900791,.140417,0,.170737,.892135,.132569,0,.184155,.883803,.124741,0,.197866,.876034,.117091,0,.211861,.869219,.109835,0,.226134,.863062,.102859,0,.240682,.857795,.0962928,0,.255499,.853009,.0900725,0,.270583,.848603,.0842101,0,.285931,.844335,.0786527,0,.301542,.840208,.0734397,0,.317415,.836035,.0685334,0,.33355,.83172,.0639275,0,.349948,.827135,.0595909,0,.36661,.822797,.0556204,0,.383539,.818387,.0519394,0,.400738,.813565,.0485317,0,.41821,.808142,.0453138,0,.435961,.802212,.0423354,0,.453997,.79573,.0395553,0,.472324,.788741,.036988,0,.490951,.781093,.0345688,0,.509887,.773597,.0323297,0,.529144,.765622,.0302719,0,.548735,.757083,.0283477,0,.568674,.747992,.0265562,0,.588979,.738591,.0248844,0,.609671,.728719,.0233342,0,.630773,.719146,.0219081,0,.652314,.709165,.0205711,0,.674328,.69875,.0193248,0,.696854,.687884,.0181582,0,.719942,.676818,.0170746,0,.743651,.666247,.0160718,0,.768057,.655284,.0151262,0,.793253,.64401,.0142561,0,.819363,.633353,.0134327,0,.846547,.622674,.012653,0,.875017,.612265,.0119354,0,.905021,.602455,.0112533,0,.936508,.593147,.0106234,0,.968254,.583592,.0100213,0,1,1,.25717,0,0,1,.25717,0,0,.999992,.257164,0,0,.999958,.257135,0,641715e-9,.999864,.25706,0,.00305314,.999666,.256897,0,.00700975,.999302,.256596,0,.0122194,.998663,.25607,0,.0184622,.995607,.254123,0,.0255773,.993094,.252081,0,.0334439,.9907,.249867,0,.0419696,.98594,.246118,0,.0510823,.981214,.242049,0,.0607242,.974966,.236869,0,.0708486,.967589,.230724,0,.081417,.95915,.223635,0,.0923974,.950257,.21596,0,.103763,.940165,.207296,0,.115491,.929396,.197901,0,.127562,.919288,.188437,0,.13996,.909428,.178762,0,.15267,.900105,.169072,0,.165679,.891418,.159478,0,.178979,.883347,.15002,0,.192558,.875992,.140813,0,.20641,.869466,.13196,0,.220529,.863699,.123501,0,.234907,.858553,.115436,0,.249542,.854379,.107901,0,.264428,.850894,.10088,0,.279564,.847632,.0942296,0,.294947,.844571,.0879861,0,.310575,.84163,.0821534,0,.326448,.838542,.0766409,0,.342566,.835412,.0715322,0,.358929,.831899,.0666883,0,.37554,.828177,.0622175,0,.392399,.82416,.0580452,0,.409511,.820393,.054267,0,.426878,.816068,.0507172,0,.444506,.811201,.0474041,0,.4624,.805785,.0443174,0,.480566,.799878,.0414562,0,.499013,.793469,.0388147,0,.517749,.786473,.0363453,0,.536785,.778874,.0340225,0,.556134,.771277,.0318599,0,.575809,.763426,.0298859,0,.595827,.755044,.0280357,0,.616207,.746161,.0262979,0,.636973,.737124,.0247295,0,.65815,.72761,.0232514,0,.679772,.717822,.0218755,0,.701876,.708279,.0205942,0,.724509,.698333,.0193947,0,.74773,.68802,.0182717,0,.771609,.677321,.0172044,0,.79624,.666504,.0162122,0,.821743,.656184,.0152924,0,.84828,.64556,.0144326,0,.876069,.634636,.0136157,0,.905404,.624124,.0128612,0,.936508,.613914,.0121435,0,.968254,.603589,.0114887,0,1,1,.307946,0,0,.999999,.307945,0,0,.999988,.307934,0,204479e-10,.999944,.307886,0,.00127833,.999824,.307756,0,.00445047,.999565,.30748,0,.00914673,.999085,.306966,0,.0150498,.998103,.306004,0,.0219367,.994249,.303028,0,.0296485,.991807,.300435,0,.038068,.987773,.296554,0,.0471062,.982673,.2916,0,.0566942,.976623,.285641,0,.0667768,.968757,.27815,0,.0773099,.959849,.269529,0,.088257,.950663,.260248,0,.0995879,.940129,.249704,0,.111277,.92895,.238291,0,.123304,.917996,.226501,0,.13565,.907813,.214669,0,.148299,.898305,.202835,0,.161237,.889626,.191158,0,.174455,.88175,.179695,0,.187941,.874715,.168548,0,.201687,.868746,.15792,0,.215687,.863703,.147807,0,.229933,.859315,.138149,0,.24442,.855538,.128993,0,.259145,.852428,.120414,0,.274103,.850168,.112498,0,.289293,.848132,.105054,0,.304711,.846291,.0981087,0,.320357,.844431,.0915942,0,.33623,.842493,.0855056,0,.35233,.840368,.0798204,0,.368658,.83798,.0745097,0,.385214,.83523,.0695424,0,.402002,.832091,.0649092,0,.419023,.828667,.0606291,0,.436282,.824805,.0566523,0,.453782,.820988,.0530229,0,.471529,.816635,.0496364,0,.489528,.811725,.0464658,0,.507788,.806316,.0435082,0,.526317,.800469,.0407873,0,.545124,.794107,.038255,0,.564221,.787218,.0358825,0,.583621,.779872,.0336785,0,.603341,.772097,.0316379,0,.623397,.764484,.0297379,0,.643812,.756428,.0279581,0,.664611,.748022,.0263153,0,.685824,.739268,.0247799,0,.707488,.73024,.0233385,0,.729646,.720893,.0220035,0,.752354,.71119,.0207555,0,.77568,.701791,.0195843,0,.799715,.692184,.0184891,0,.824574,.682258,.0174541,0,.850417,.67206,.0164873,0,.877466,.661717,.0155959,0,.90604,.651462,.0147519,0,.936528,.641467,.0139727,0,.968254,.631229,.0132363,0,1,1,.367573,0,0,.999999,.367571,0,0,.999984,.367553,0,183382e-9,.999925,.367473,0,.00225254,.999759,.367259,0,.00628165,.99941,.366801,0,.0117858,.998739,.365946,0,.0184359,.995529,.363191,0,.0260114,.992875,.360171,0,.0343581,.989135,.355981,0,.0433637,.984166,.350401,0,.0529438,.977871,.343348,0,.0630334,.96951,.334341,0,.0735805,.959964,.323862,0,.0845437,.950162,.312521,0,.095889,.938882,.299577,0,.107588,.926992,.285573,0,.119617,.915589,.271212,0,.131957,.904791,.256611,0,.144591,.895177,.242224,0,.157503,.886403,.227952,0,.170682,.878957,.214192,0,.184117,.872418,.200795,0,.197799,.867029,.188015,0,.21172,.862835,.175975,0,.225873,.859411,.164526,0,.240253,.856655,.153693,0,.254854,.854519,.14352,0,.269673,.852828,.13397,0,.284707,.851412,.124984,0,.299953,.850609,.116748,0,.315408,.849855,.10905,0,.331073,.849017,.101839,0,.346946,.848079,.0951359,0,.363028,.846911,.0888774,0,.379318,.845445,.0830375,0,.395818,.84362,.0775844,0,.41253,.841411,.0725054,0,.429457,.838768,.0677691,0,.446602,.835801,.0634016,0,.463968,.832341,.0593095,0,.481561,.828424,.0555121,0,.499386,.824312,.052024,0,.51745,.819918,.0487865,0,.535761,.815072,.0457801,0,.554328,.809863,.0430184,0,.573162,.804164,.0404245,0,.592275,.798034,.0380146,0,.611681,.791436,.0357436,0,.631398,.784498,.0336475,0,.651445,.777125,.0316666,0,.671845,.769365,.0298122,0,.692628,.761579,.0281001,0,.713827,.753746,.0265049,0,.735484,.745573,.0250067,0,.75765,.737083,.0236026,0,.78039,.728545,.0223302,0,.803789,.719691,.0211243,0,.82796,.710569,.0199983,0,.853056,.701216,.0189569,0,.879298,.692094,.0179702,0,.907014,.682909,.0170418,0,.936691,.673509,.0161732,0,.968254,.663863,.0153406,0,1,1,.437395,0,0,.999998,.437394,0,0,.99998,.437363,0,616704e-9,.999891,.437232,0,.00367925,.999656,.436877,0,.00867446,.999148,.436121,0,.0150679,.997959,.434564,0,.022531,.993464,.430134,0,.0308507,.990606,.426077,0,.0398805,.985027,.419397,0,.0495148,.978491,.41118,0,.0596749,.969643,.40048,0,.0703001,.959189,.38769,0,.0813427,.948223,.373575,0,.0927641,.935955,.357622,0,.104533,.923237,.34043,0,.116624,.911074,.322735,0,.129015,.899724,.30479,0,.141687,.890189,.287392,0,.154626,.881796,.270248,0,.167818,.874781,.253659,0,.181252,.869166,.237786,0,.194918,.864725,.222618,0,.208807,.861565,.208356,0,.222913,.859284,.194867,0,.237229,.857677,.18212,0,.25175,.856714,.17018,0,.266473,.856155,.158969,0,.281392,.8558,.148413,0,.296505,.855672,.138578,0,.311811,.855538,.129345,0,.327306,.855689,.120861,0,.342991,.855767,.112969,0,.358864,.855618,.105593,0,.374925,.85525,.0987451,0,.391176,.854583,.0923727,0,.407616,.853534,.0864143,0,.424249,.852061,.0808338,0,.441076,.850253,.0756771,0,.4581,.848004,.0708612,0,.475324,.845333,.0663784,0,.492754,.842376,.0622631,0,.510394,.838956,.0584112,0,.528251,.835121,.0548328,0,.546331,.830842,.0514838,0,.564644,.826212,.048355,0,.583198,.821522,.0454714,0,.602005,.816551,.0428263,0,.621078,.811211,.0403612,0,.640434,.805479,.038039,0,.660089,.799409,.0358739,0,.680066,.79306,.0338727,0,.70039,.786395,.0319985,0,.721094,.779416,.030241,0,.742215,.77214,.0285951,0,.7638,.764636,.0270747,0,.785912,.756836,.0256354,0,.808628,.749315,.0243027,0,.832055,.741561,.0230497,0,.856338,.733589,.0218801,0,.88169,.725479,.020784,0,.908441,.717255,.0197702,0,.937125,.708829,.0188168,0,.968254,.700191,.0179113,0,1,1,.518937,0,0,.999998,.518933,0,0,.999967,.518883,0,.00147741,.999832,.51866,0,.00573221,.999466,.518057,0,.011826,.998644,.516752,0,.0192116,.994458,.512347,0,.027573,.991223,.507675,0,.0367099,.985515,.500188,0,.046487,.978308,.490408,0,.0568071,.968359,.477357,0,.0675984,.95682,.461752,0,.0788059,.943929,.443796,0,.090386,.930224,.423893,0,.102304,.916514,.402682,0,.114532,.903653,.380914,0,.127047,.892315,.359212,0,.139828,.882942,.338102,0,.152861,.875438,.31773,0,.16613,.869642,.298186,0,.179624,.865304,.279491,0,.193332,.862382,.261804,0,.207247,.860666,.245146,0,.22136,.859788,.229406,0,.235666,.859608,.214605,0,.250158,.859912,.200691,0,.264832,.86053,.187623,0,.279684,.861368,.17539,0,.294711,.862237,.163901,0,.309911,.863127,.153175,0,.32528,.863923,.143147,0,.340819,.864567,.133781,0,.356524,.865013,.125042,0,.372397,.86539,.116952,0,.388438,.865591,.109476,0,.404645,.865517,.102542,0,.421022,.865084,.0960688,0,.437569,.864309,.0900499,0,.454287,.863151,.0844328,0,.471181,.861649,.0792218,0,.488253,.859742,.0743482,0,.505507,.857446,.0697963,0,.522947,.854757,.0655364,0,.54058,.851783,.061608,0,.558412,.848516,.0579701,0,.576449,.844897,.0545742,0,.594701,.840956,.0514167,0,.613178,.836676,.0484598,0,.631892,.832075,.0456934,0,.650856,.827191,.0431178,0,.670088,.822295,.0407718,0,.689606,.817294,.0386032,0,.709434,.812013,.0365675,0,.7296,.806465,.0346547,0,.750138,.800691,.0328717,0,.771093,.794709,.031211,0,.792519,.788493,.0296504,0,.814488,.782049,.0281782,0,.837097,.775403,.0267965,0,.860481,.76857,.0255002,0,.884842,.761536,.0242759,0,.910494,.754303,.0231142,0,.937985,.74692,.0220305,0,.968254,.739745,.0210192,0,1,1,.613914,0,0,.999996,.613907,0,963597e-10,.999942,.613814,0,.00301247,.999704,.613407,0,.00870385,.999046,.612302,0,.0160714,.995516,.608266,0,.0245899,.991726,.602863,0,.0339681,.985157,.593956,0,.0440254,.97642,.581748,0,.0546409,.964404,.565183,0,.0657284,.950601,.545273,0,.0772246,.935158,.522129,0,.0890812,.919364,.496782,0,.10126,.904754,.470571,0,.113731,.89176,.444037,0,.126469,.881492,.418322,0,.139454,.873656,.393522,0,.15267,.868053,.369795,0,.166101,.864336,.347171,0,.179736,.862259,.325737,0,.193565,.861556,.305532,0,.207578,.861776,.286416,0,.221769,.862661,.268355,0,.23613,.864015,.251334,0,.250656,.865711,.235352,0,.265343,.867519,.220302,0,.280187,.869351,.206161,0,.295183,.871144,.192908,0,.31033,.872839,.180505,0,.325624,.874307,.168848,0,.341065,.875667,.158021,0,.35665,.876758,.147877,0,.37238,.87764,.138441,0,.388253,.878237,.129627,0,.404269,.878563,.121415,0,.42043,.878572,.113741,0,.436735,.87842,.106652,0,.453187,.878057,.100097,0,.469786,.877413,.0940128,0,.486536,.87646,.0883462,0,.503439,.875233,.0830924,0,.520498,.8737,.0781975,0,.537717,.871873,.07364,0,.555102,.86978,.0694103,0,.572657,.867405,.0654696,0,.59039,.864751,.0617914,0,.608307,.861818,.0583491,0,.626419,.858645,.0551443,0,.644733,.855307,.0521894,0,.663264,.851736,.0494334,0,.682025,.847927,.0468504,0,.701032,.843888,.0444261,0,.720308,.839629,.0421497,0,.739875,.835158,.0400082,0,.759764,.830509,.0380076,0,.780014,.825714,.0361488,0,.800673,.820729,.0343956,0,.821803,.815751,.0327781,0,.843492,.810752,.031275,0,.86586,.805587,.0298542,0,.889087,.800317,.0285397,0,.913466,.79489,.0272948,0,.93952,.789314,.0261139,0,.96835,.783593,.0249938,0,1,1,.724258,0,0,.999992,.724243,0,726889e-9,.99987,.724044,0,.00569574,.999336,.72317,0,.0131702,.996271,.719432,0,.0220738,.991159,.712576,0,.0319405,.982465,.700927,0,.0425202,.97049,.684297,0,.0536599,.953973,.661244,0,.065258,.935546,.633804,0,.0772427,.916596,.603071,0,.0895616,.899353,.57105,0,.102175,.885216,.539206,0,.11505,.875076,.508714,0,.128164,.868334,.479571,0,.141495,.864414,.451796,0,.155026,.862678,.425328,0,.168745,.862835,.400352,0,.182639,.864067,.376532,0,.196699,.866086,.35391,0,.210915,.868557,.332424,0,.225282,.871271,.312053,0,.239792,.874058,.292764,0,.25444,.8768,.27453,0,.269223,.87939,.257297,0,.284135,.8819,.24114,0,.299174,.884187,.225934,0,.314337,.886262,.211669,0,.329622,.888119,.198311,0,.345026,.889709,.185783,0,.360549,.891054,.174063,0,.376189,.892196,.163143,0,.391946,.893101,.152952,0,.407819,.893803,.143475,0,.423808,.894277,.134647,0,.439914,.894532,.126434,0,.456137,.894576,.1188,0,.472479,.894393,.111694,0,.48894,.893976,.105069,0,.505523,.893346,.0989077,0,.52223,.892502,.0931724,0,.539064,.891441,.0878276,0,.556028,.890276,.082903,0,.573125,.888972,.0783505,0,.590361,.887469,.0741083,0,.607741,.885785,.0701633,0,.62527,.883914,.0664835,0,.642957,.881872,.0630567,0,.660809,.879651,.0598527,0,.678836,.877267,.0568615,0,.69705,.874717,.05406,0,.715465,.872012,.0514378,0,.734098,.869157,.0489805,0,.752968,.866155,.0466727,0,.772101,.863014,.0445056,0,.791529,.859748,.0424733,0,.81129,.856416,.0405957,0,.831438,.852958,.0388273,0,.852044,.849382,.0371619,0,.87321,.845694,.0355959,0,.89509,.841893,.0341155,0,.917932,.837981,.0327141,0,.942204,.833963,.0313856,0,.968981,.829847,.0301275,0,1,1,.85214,0,0,.999969,.852095,0,.00279627,.999483,.851408,0,.0107635,.994545,.84579,0,.0206454,.986188,.835231,0,.0315756,.969847,.814687,0,.0432021,.945951,.783735,0,.0553396,.91917,.746074,0,.0678766,.895488,.706938,0,.0807395,.878232,.669534,0,.0938767,.868252,.635168,0,.10725,.863873,.603069,0,.120832,.863369,.572514,0,.134598,.86545,.543169,0,.148533,.868803,.514578,0,.16262,.872794,.486762,0,.176849,.87702,.459811,0,.19121,.881054,.433654,0,.205694,.884974,.408574,0,.220294,.888587,.384525,0,.235005,.891877,.36156,0,.24982,.894793,.339661,0,.264737,.89743,.318913,0,.279751,.899796,.299302,0,.294859,.901943,.280843,0,.310058,.903858,.263481,0,.325346,.905574,.247197,0,.340721,.907069,.231915,0,.356181,.908379,.217614,0,.371725,.90952,.20425,0,.387353,.910483,.191758,0,.403063,.91128,.180092,0,.418854,.911936,.169222,0,.434727,.912454,.159098,0,.450682,.912835,.149668,0,.466718,.913078,.140884,0,.482837,.913192,.132709,0,.499038,.913175,.125095,0,.515324,.91304,.118012,0,.531695,.912781,.111417,0,.548153,.91241,.105281,0,.5647,.911924,.0995691,0,.581338,.911331,.0942531,0,.59807,.910637,.0893076,0,.6149,.90984,.0846998,0,.63183,.908941,.0804044,0,.648865,.907944,.0763984,0,.666011,.906857,.0726638,0,.683273,.90568,.0691783,0,.700659,.904416,.0659222,0,.718176,.903067,.0628782,0,.735834,.901637,.0600307,0,.753646,.900128,.0573647,0,.771625,.898544,.0548668,0,.78979,.89689,.052527,0,.808162,.895165,.0503306,0,.826771,.893371,.0482668,0,.845654,.891572,.0463605,0,.864863,.889763,.0445998,0,.884472,.887894,.0429451,0,.904592,.885967,.0413884,0,.925407,.883984,.0399225,0,.947271,.881945,.0385405,0,.97105,.879854,.0372362,0,1,.999804,.995833,0,0,.938155,.933611,0,.0158731,.864755,.854311,0,.0317461,.888594,.865264,0,.0476191,.905575,.863922,0,.0634921,.915125,.850558,0,.0793651,.920665,.829254,0,.0952381,.924073,.802578,0,.111111,.926304,.772211,0,.126984,.927829,.739366,0,.142857,.928924,.705033,0,.15873,.92973,.670019,0,.174603,.930339,.634993,0,.190476,.930811,.600485,0,.206349,.931191,.566897,0,.222222,.93149,.534485,0,.238095,.931737,.503429,0,.253968,.931939,.473811,0,.269841,.932108,.445668,0,.285714,.93225,.418993,0,.301587,.932371,.393762,0,.31746,.932474,.369939,0,.333333,.932562,.347479,0,.349206,.932638,.326336,0,.365079,.932703,.306462,0,.380952,.93276,.287805,0,.396825,.932809,.270313,0,.412698,.932851,.253933,0,.428571,.932887,.23861,0,.444444,.932917,.224289,0,.460317,.932943,.210917,0,.47619,.932965,.19844,0,.492063,.932982,.186807,0,.507937,.932995,.175966,0,.52381,.933005,.165869,0,.539683,.933011,.156468,0,.555556,.933013,.147719,0,.571429,.933013,.139579,0,.587302,.93301,.132007,0,.603175,.933004,.124965,0,.619048,.932994,.118416,0,.634921,.932982,.112326,0,.650794,.932968,.106663,0,.666667,.93295,.101397,0,.68254,.932931,.0964993,0,.698413,.932908,.0919438,0,.714286,.932883,.0877057,0,.730159,.932856,.0837623,0,.746032,.932827,.0800921,0,.761905,.932796,.0766754,0,.777778,.932762,.0734936,0,.793651,.932727,.0705296,0,.809524,.932689,.0677676,0,.825397,.93265,.0651929,0,.84127,.932609,.0627917,0,.857143,.932565,.0605515,0,.873016,.932521,.0584606,0,.888889,.932474,.0565082,0,.904762,.932427,.0546841,0,.920635,.932377,.0529793,0,.936508,.932326,.0513851,0,.952381,.932274,.0498936,0,.968254,.93222,.0484975,0,.984127,.932164,.0471899,0,1],n=new Float32Array(e),i=new Float32Array(t);Ar.LTC_FLOAT_1=new Vl(n,64,64,1023,1015,300,1001,1001,1006,1003,1),Ar.LTC_FLOAT_2=new Vl(i,64,64,1023,1015,300,1001,1001,1006,1003,1),Ar.LTC_FLOAT_1.needsUpdate=!0,Ar.LTC_FLOAT_2.needsUpdate=!0;const s=new Uint16Array(e.length);e.forEach((function(e,t){s[t]=_p.toHalfFloat(e)}));const r=new Uint16Array(t.length);t.forEach((function(e,t){r[t]=_p.toHalfFloat(e)})),Ar.LTC_HALF_1=new Vl(s,64,64,1023,1016,300,1001,1001,1006,1003,1),Ar.LTC_HALF_2=new Vl(r,64,64,1023,1016,300,1001,1001,1006,1003,1),Ar.LTC_HALF_1.needsUpdate=!0,Ar.LTC_HALF_2.needsUpdate=!0}}.init()}createAmbientLight(e){const{id:t,name:n="",color:i=10132122,intensity:s=1}=e,r=new Vd(i,s);return r.name=n,r.userData.sid=t,r.userData.stype="Light",this.viewport.scener.addObject(r,this.scene),r}setAmbientLight(e,t){const{name:n="",color:i=10132122,intensity:s=1}=t;return!!e&&(e.name=n,e.color=new Fn(i),e.intensity=s,this.viewport.signals.objectChanged.dispatch(),!0)}createDirectionalLight(e){const{id:t,name:n="",color:i=10132122,intensity:s=1,position:r={x:1e3,y:1e3,z:1e3},target:o={x:-1e3,y:-1e3,z:-1e3},openShadow:a=!1,shadowAutoUpdate:l=!1,mapSize:c=4096}=e,h=new Nd(i,s);if(h.name=n,h.userData.sid=t,h.userData.stype="Light",h.position.set(r.x,r.y,r.z),h.target.name=`${n}-target`,h.target.position.set(o.x,o.y,o.z),h.castShadow=a,a){const e=h.position.distanceTo(h.target.position);h.shadow.bias=-.005,h.shadow.camera.left=-e,h.shadow.camera.right=e,h.shadow.camera.top=e,h.shadow.camera.bottom=-e,h.shadow.camera.far=e,h.shadow.autoUpdate=l,h.shadow.mapSize.width=c,h.shadow.mapSize.height=c,h.shadow.camera.updateProjectionMatrix()}return this.viewport.scener.addObject(h,this.scene),this.viewport.scener.addObject(h.target,this.scene),h}setDirectionalLight(e,t){const{name:n="",color:i=10132122,intensity:s=1,position:r={x:1e3,y:1e3,z:1e3},target:o={x:-1e3,y:-1e3,z:-1e3},openShadow:a=!1,shadowAutoUpdate:l=!1,mapSize:c=4096}=t;if(!e)return!1;if(e.name=n,e.color=new Fn(i),e.intensity=s,e.position.set(r.x,r.y,r.z),e.target.position.set(o.x,o.y,o.z),e.castShadow=a,a){const t=e.position.distanceTo(e.target.position);e.shadow.bias=-.005,e.shadow.camera.left=-t,e.shadow.camera.right=t,e.shadow.camera.top=t,e.shadow.camera.bottom=-t,e.shadow.camera.far=t,e.shadow.autoUpdate=l,e.shadow.mapSize.width=c,e.shadow.mapSize.height=c,e.shadow.camera.updateProjectionMatrix()}return this.viewport.signals.objectChanged.dispatch(),!0}createHemisphereLight(e){const{id:t,name:n="",skyColor:i=16777215,groundColor:s=14540253,intensity:r=1,position:o={x:0,y:0,z:0}}=e,a=new Cd(i,s,r);return a.name=n,a.position.set(o.x,o.y,o.z),a.userData.sid=t,a.userData.stype="Light",this.viewport.scener.addObject(a,this.scene),a}setHemisphereLight(e,t){const{name:n="",skyColor:i=16777215,groundColor:s=14540253,intensity:r=1,position:o={x:0,y:0,z:0}}=t;return!!e&&(e.name=n,e.color=new Fn(i),e.groundColor=new Fn(s),e.intensity=r,e.position.set(o.x,o.y,o.z),this.viewport.signals.objectChanged.dispatch(),!0)}createSpotLight(e){const{id:t,name:n="",color:i=16777215,intensity:s=1,angle:r=45,position:o={x:0,y:500,z:0},target:a={x:0,y:0,z:0},openShadow:l=!1,shadowAutoUpdate:c=!1,mapSize:h=4096}=e,d=Dm(o).distanceTo(Dm(a)),u=new Id(i,s,d,Math.PI/360*r,0,0);if(u.name=n,u.position.set(o.x,o.y,o.z),u.userData.sid=t,u.userData.stype="Light",u.castShadow=l,u.target.position.set(a.x,a.y,a.z),u.target.castShadow=l,u.target.receiveShadow=!0,u.target.updateMatrixWorld(),l){const e=u.position.distanceTo(u.target.position);u.shadow.autoUpdate=c,u.shadow.mapSize.width=h,u.shadow.mapSize.height=h,u.shadow.bias=-.005,u.shadow.focus=.6,u.shadow.camera.far=e,u.shadow.camera.updateProjectionMatrix()}return this.viewport.scener.addObject(u,this.scene),u}setSpotLight(e,t){const{name:n="",color:i=16777215,intensity:s=1,angle:r=45,position:o={x:0,y:500,z:0},target:a={x:0,y:0,z:0},openShadow:l=!1,shadowAutoUpdate:c=!1,mapSize:h=4096}=t;if(!e)return!1;const d=Dm(o).distanceTo(Dm(a));if(e.name=n,e.color=new Fn(i),e.intensity=s,e.distance=d,e.angle=Math.PI/360*r,e.position.set(o.x,o.y,o.z),e.castShadow=l,e.target.position.set(a.x,a.y,a.z),e.target.castShadow=l,e.target.updateMatrixWorld(),l){const t=e.position.distanceTo(e.target.position);e.shadow.autoUpdate=c,e.shadow.mapSize.width=h,e.shadow.mapSize.height=h,e.shadow.bias=-.005,e.shadow.focus=.6,e.shadow.camera.far=t,e.shadow.camera.updateProjectionMatrix()}return this.viewport.signals.objectChanged.dispatch(),!0}createPointLight(e){const{id:t,name:n="",color:i=16777215,intensity:s=1,distance:r=5e3,position:o={x:0,y:500,z:0},openShadow:a=!1,shadowAutoUpdate:l=!1,mapSize:c=4096}=e,h=new Wd(i,s,r);return h.name=n,h.userData.sid=t,h.userData.stype="Light",h.position.set(o.x,o.y,o.z),h.castShadow=a,a&&(h.shadow.bias=-.005,h.shadow.camera.far=r,h.shadow.autoUpdate=l,h.shadow.mapSize.width=c,h.shadow.mapSize.height=c,h.shadow.camera.updateProjectionMatrix()),this.viewport.scener.addObject(h,this.scene),h}setPointLight(e,t){const{name:n="",color:i=16777215,intensity:s=1,distance:r=5e3,position:o={x:0,y:500,z:0},openShadow:a=!1,shadowAutoUpdate:l=!1,mapSize:c=4096}=t;return!!e&&(e.name=n,e.color=new Fn(i),e.intensity=s,e.distance=r,e.position.set(o.x,o.y,o.z),e.castShadow=a,a&&(e.shadow.bias=-.005,e.shadow.camera.far=r,e.shadow.autoUpdate=l,e.shadow.mapSize.width=c,e.shadow.mapSize.height=c,e.shadow.camera.updateProjectionMatrix()),this.viewport.signals.objectChanged.dispatch(),!0)}createRectAreaLight(e){const{id:t,name:n="",color:i=16777215,intensity:s=1,width:r=10,height:o=10,position:a={x:0,y:0,z:0}}=e,l=new Dd(i,s,r,o);return l.name=n,l.userData.sid=t,l.userData.stype="Light",l.position.set(a.x,a.y,a.z),this.viewport.scener.addObject(l,this.scene),l}setRectAreaLight(e,t){const{name:n="",color:i=16777215,intensity:s=1,width:r=10,height:o=10,position:a={x:0,y:0,z:0}}=t;return!!e&&(e.name=n,e.color=new Fn(i),e.intensity=s,e.width=r,e.height=o,e.position.set(a.x,a.y,a.z),this.viewport.signals.objectChanged.dispatch(),!0)}updateAllShadow(){this.getAll().forEach((e=>{var t;!1===(null===(t=e.shadow)||void 0===t?void 0:t.autoUpdate)&&(e.shadow.needsUpdate=!0)})),this.viewport.signals.objectChanged.dispatch()}}
41
+ var jw={};void 0!==jw.asn1&&jw.asn1||(jw.asn1={}),jw.asn1.ASN1Util=new function(){this.integerToByteHex=function(e){var t=e.toString(16);return t.length%2==1&&(t="0"+t),t},this.bigIntToMinTwosComplementsHex=function(e){var t=e.toString(16);if("-"!=t.substr(0,1))t.length%2==1?t="0"+t:t.match(/^[0-7]/)||(t="00"+t);else{var n=t.substr(1).length;n%2==1?n+=1:t.match(/^[0-7]/)||(n+=2);for(var i="",s=0;s<n;s++)i+="f";t=new Sw(i,16).xor(e).add(Sw.ONE).toString(16).replace(/^-/,"")}return t},this.getPEMStringFromHex=function(e,t){return hextopem(e,t)},this.newObject=function(e){var t=jw.asn1,n=t.DERBoolean,i=t.DERInteger,s=t.DERBitString,r=t.DEROctetString,o=t.DERNull,a=t.DERObjectIdentifier,l=t.DEREnumerated,c=t.DERUTF8String,h=t.DERNumericString,d=t.DERPrintableString,u=t.DERTeletexString,p=t.DERIA5String,m=t.DERUTCTime,f=t.DERGeneralizedTime,g=t.DERSequence,y=t.DERSet,b=t.DERTaggedObject,v=t.ASN1Util.newObject,x=Object.keys(e);if(1!=x.length)throw"key of param shall be only one.";var w=x[0];if(-1==":bool:int:bitstr:octstr:null:oid:enum:utf8str:numstr:prnstr:telstr:ia5str:utctime:gentime:seq:set:tag:".indexOf(":"+w+":"))throw"undefined key: "+w;if("bool"==w)return new n(e[w]);if("int"==w)return new i(e[w]);if("bitstr"==w)return new s(e[w]);if("octstr"==w)return new r(e[w]);if("null"==w)return new o(e[w]);if("oid"==w)return new a(e[w]);if("enum"==w)return new l(e[w]);if("utf8str"==w)return new c(e[w]);if("numstr"==w)return new h(e[w]);if("prnstr"==w)return new d(e[w]);if("telstr"==w)return new u(e[w]);if("ia5str"==w)return new p(e[w]);if("utctime"==w)return new m(e[w]);if("gentime"==w)return new f(e[w]);if("seq"==w){for(var S=e[w],M=[],T=0;T<S.length;T++){var C=v(S[T]);M.push(C)}return new g({array:M})}if("set"==w){for(S=e[w],M=[],T=0;T<S.length;T++){C=v(S[T]);M.push(C)}return new y({array:M})}if("tag"==w){var L=e[w];if("[object Array]"===Object.prototype.toString.call(L)&&3==L.length){var R=v(L[2]);return new b({tag:L[0],explicit:L[1],obj:R})}var G={};if(void 0!==L.explicit&&(G.explicit=L.explicit),void 0!==L.tag&&(G.tag=L.tag),void 0===L.obj)throw"obj shall be specified for 'tag'.";return G.obj=v(L.obj),new b(G)}},this.jsonToASN1HEX=function(e){return this.newObject(e).getEncodedHex()}},jw.asn1.ASN1Util.oidHexToInt=function(e){for(var t="",n=parseInt(e.substr(0,2),16),i=(t=Math.floor(n/40)+"."+n%40,""),s=2;s<e.length;s+=2){var r=("00000000"+parseInt(e.substr(s,2),16).toString(2)).slice(-8);if(i+=r.substr(1,7),"0"==r.substr(0,1))t=t+"."+new Sw(i,2).toString(10),i=""}return t},jw.asn1.ASN1Util.oidIntToHex=function(e){var t=function(e){var t=e.toString(16);return 1==t.length&&(t="0"+t),t},n=function(e){var n="",i=new Sw(e,10).toString(2),s=7-i.length%7;7==s&&(s=0);for(var r="",o=0;o<s;o++)r+="0";i=r+i;for(o=0;o<i.length-1;o+=7){var a=i.substr(o,7);o!=i.length-7&&(a="1"+a),n+=t(parseInt(a,2))}return n};if(!e.match(/^[0-9.]+$/))throw"malformed oid string: "+e;var i="",s=e.split("."),r=40*parseInt(s[0])+parseInt(s[1]);i+=t(r),s.splice(0,2);for(var o=0;o<s.length;o++)i+=n(s[o]);return i},jw.asn1.ASN1Object=function(){this.getLengthHexFromValue=function(){if(void 0===this.hV||null==this.hV)throw"this.hV is null or undefined.";if(this.hV.length%2==1)throw"value hex must be even length: n="+"".length+",v="+this.hV;var e=this.hV.length/2,t=e.toString(16);if(t.length%2==1&&(t="0"+t),e<128)return t;var n=t.length/2;if(n>15)throw"ASN.1 length too long to represent by 8x: n = "+e.toString(16);return(128+n).toString(16)+t},this.getEncodedHex=function(){return(null==this.hTLV||this.isModified)&&(this.hV=this.getFreshValueHex(),this.hL=this.getLengthHexFromValue(),this.hTLV=this.hT+this.hL+this.hV,this.isModified=!1),this.hTLV},this.getValueHex=function(){return this.getEncodedHex(),this.hV},this.getFreshValueHex=function(){return""}},jw.asn1.DERAbstractString=function(e){jw.asn1.DERAbstractString.superclass.constructor.call(this),this.getString=function(){return this.s},this.setString=function(e){this.hTLV=null,this.isModified=!0,this.s=e,this.hV=stohex(this.s)},this.setStringHex=function(e){this.hTLV=null,this.isModified=!0,this.s=null,this.hV=e},this.getFreshValueHex=function(){return this.hV},void 0!==e&&("string"==typeof e?this.setString(e):void 0!==e.str?this.setString(e.str):void 0!==e.hex&&this.setStringHex(e.hex))},Kw.lang.extend(jw.asn1.DERAbstractString,jw.asn1.ASN1Object),jw.asn1.DERAbstractTime=function(e){jw.asn1.DERAbstractTime.superclass.constructor.call(this),this.localDateToUTC=function(e){return utc=e.getTime()+6e4*e.getTimezoneOffset(),new Date(utc)},this.formatDate=function(e,t,n){var i=this.zeroPadding,s=this.localDateToUTC(e),r=String(s.getFullYear());"utc"==t&&(r=r.substr(2,2));var o=r+i(String(s.getMonth()+1),2)+i(String(s.getDate()),2)+i(String(s.getHours()),2)+i(String(s.getMinutes()),2)+i(String(s.getSeconds()),2);if(!0===n){var a=s.getMilliseconds();if(0!=a){var l=i(String(a),3);o=o+"."+(l=l.replace(/[0]+$/,""))}}return o+"Z"},this.zeroPadding=function(e,t){return e.length>=t?e:new Array(t-e.length+1).join("0")+e},this.getString=function(){return this.s},this.setString=function(e){this.hTLV=null,this.isModified=!0,this.s=e,this.hV=stohex(e)},this.setByDateValue=function(e,t,n,i,s,r){var o=new Date(Date.UTC(e,t-1,n,i,s,r,0));this.setByDate(o)},this.getFreshValueHex=function(){return this.hV}},Kw.lang.extend(jw.asn1.DERAbstractTime,jw.asn1.ASN1Object),jw.asn1.DERAbstractStructured=function(e){jw.asn1.DERAbstractString.superclass.constructor.call(this),this.setByASN1ObjectArray=function(e){this.hTLV=null,this.isModified=!0,this.asn1Array=e},this.appendASN1Object=function(e){this.hTLV=null,this.isModified=!0,this.asn1Array.push(e)},this.asn1Array=new Array,void 0!==e&&void 0!==e.array&&(this.asn1Array=e.array)},Kw.lang.extend(jw.asn1.DERAbstractStructured,jw.asn1.ASN1Object),jw.asn1.DERBoolean=function(){jw.asn1.DERBoolean.superclass.constructor.call(this),this.hT="01",this.hTLV="0101ff"},Kw.lang.extend(jw.asn1.DERBoolean,jw.asn1.ASN1Object),jw.asn1.DERInteger=function(e){jw.asn1.DERInteger.superclass.constructor.call(this),this.hT="02",this.setByBigInteger=function(e){this.hTLV=null,this.isModified=!0,this.hV=jw.asn1.ASN1Util.bigIntToMinTwosComplementsHex(e)},this.setByInteger=function(e){var t=new Sw(String(e),10);this.setByBigInteger(t)},this.setValueHex=function(e){this.hV=e},this.getFreshValueHex=function(){return this.hV},void 0!==e&&(void 0!==e.bigint?this.setByBigInteger(e.bigint):void 0!==e.int?this.setByInteger(e.int):"number"==typeof e?this.setByInteger(e):void 0!==e.hex&&this.setValueHex(e.hex))},Kw.lang.extend(jw.asn1.DERInteger,jw.asn1.ASN1Object),jw.asn1.DERBitString=function(e){if(void 0!==e&&void 0!==e.obj){var t=jw.asn1.ASN1Util.newObject(e.obj);e.hex="00"+t.getEncodedHex()}jw.asn1.DERBitString.superclass.constructor.call(this),this.hT="03",this.setHexValueIncludingUnusedBits=function(e){this.hTLV=null,this.isModified=!0,this.hV=e},this.setUnusedBitsAndHexValue=function(e,t){if(e<0||7<e)throw"unused bits shall be from 0 to 7: u = "+e;var n="0"+e;this.hTLV=null,this.isModified=!0,this.hV=n+t},this.setByBinaryString=function(e){var t=8-(e=e.replace(/0+$/,"")).length%8;8==t&&(t=0);for(var n=0;n<=t;n++)e+="0";var i="";for(n=0;n<e.length-1;n+=8){var s=e.substr(n,8),r=parseInt(s,2).toString(16);1==r.length&&(r="0"+r),i+=r}this.hTLV=null,this.isModified=!0,this.hV="0"+t+i},this.setByBooleanArray=function(e){for(var t="",n=0;n<e.length;n++)1==e[n]?t+="1":t+="0";this.setByBinaryString(t)},this.newFalseArray=function(e){for(var t=new Array(e),n=0;n<e;n++)t[n]=!1;return t},this.getFreshValueHex=function(){return this.hV},void 0!==e&&("string"==typeof e&&e.toLowerCase().match(/^[0-9a-f]+$/)?this.setHexValueIncludingUnusedBits(e):void 0!==e.hex?this.setHexValueIncludingUnusedBits(e.hex):void 0!==e.bin?this.setByBinaryString(e.bin):void 0!==e.array&&this.setByBooleanArray(e.array))},Kw.lang.extend(jw.asn1.DERBitString,jw.asn1.ASN1Object),jw.asn1.DEROctetString=function(e){if(void 0!==e&&void 0!==e.obj){var t=jw.asn1.ASN1Util.newObject(e.obj);e.hex=t.getEncodedHex()}jw.asn1.DEROctetString.superclass.constructor.call(this,e),this.hT="04"},Kw.lang.extend(jw.asn1.DEROctetString,jw.asn1.DERAbstractString),jw.asn1.DERNull=function(){jw.asn1.DERNull.superclass.constructor.call(this),this.hT="05",this.hTLV="0500"},Kw.lang.extend(jw.asn1.DERNull,jw.asn1.ASN1Object),jw.asn1.DERObjectIdentifier=function(e){var t=function(e){var t=e.toString(16);return 1==t.length&&(t="0"+t),t},n=function(e){var n="",i=new Sw(e,10).toString(2),s=7-i.length%7;7==s&&(s=0);for(var r="",o=0;o<s;o++)r+="0";i=r+i;for(o=0;o<i.length-1;o+=7){var a=i.substr(o,7);o!=i.length-7&&(a="1"+a),n+=t(parseInt(a,2))}return n};jw.asn1.DERObjectIdentifier.superclass.constructor.call(this),this.hT="06",this.setValueHex=function(e){this.hTLV=null,this.isModified=!0,this.s=null,this.hV=e},this.setValueOidString=function(e){if(!e.match(/^[0-9.]+$/))throw"malformed oid string: "+e;var i="",s=e.split("."),r=40*parseInt(s[0])+parseInt(s[1]);i+=t(r),s.splice(0,2);for(var o=0;o<s.length;o++)i+=n(s[o]);this.hTLV=null,this.isModified=!0,this.s=null,this.hV=i},this.setValueName=function(e){var t=jw.asn1.x509.OID.name2oid(e);if(""===t)throw"DERObjectIdentifier oidName undefined: "+e;this.setValueOidString(t)},this.getFreshValueHex=function(){return this.hV},void 0!==e&&("string"==typeof e?e.match(/^[0-2].[0-9.]+$/)?this.setValueOidString(e):this.setValueName(e):void 0!==e.oid?this.setValueOidString(e.oid):void 0!==e.hex?this.setValueHex(e.hex):void 0!==e.name&&this.setValueName(e.name))},Kw.lang.extend(jw.asn1.DERObjectIdentifier,jw.asn1.ASN1Object),jw.asn1.DEREnumerated=function(e){jw.asn1.DEREnumerated.superclass.constructor.call(this),this.hT="0a",this.setByBigInteger=function(e){this.hTLV=null,this.isModified=!0,this.hV=jw.asn1.ASN1Util.bigIntToMinTwosComplementsHex(e)},this.setByInteger=function(e){var t=new Sw(String(e),10);this.setByBigInteger(t)},this.setValueHex=function(e){this.hV=e},this.getFreshValueHex=function(){return this.hV},void 0!==e&&(void 0!==e.int?this.setByInteger(e.int):"number"==typeof e?this.setByInteger(e):void 0!==e.hex&&this.setValueHex(e.hex))},Kw.lang.extend(jw.asn1.DEREnumerated,jw.asn1.ASN1Object),jw.asn1.DERUTF8String=function(e){jw.asn1.DERUTF8String.superclass.constructor.call(this,e),this.hT="0c"},Kw.lang.extend(jw.asn1.DERUTF8String,jw.asn1.DERAbstractString),jw.asn1.DERNumericString=function(e){jw.asn1.DERNumericString.superclass.constructor.call(this,e),this.hT="12"},Kw.lang.extend(jw.asn1.DERNumericString,jw.asn1.DERAbstractString),jw.asn1.DERPrintableString=function(e){jw.asn1.DERPrintableString.superclass.constructor.call(this,e),this.hT="13"},Kw.lang.extend(jw.asn1.DERPrintableString,jw.asn1.DERAbstractString),jw.asn1.DERTeletexString=function(e){jw.asn1.DERTeletexString.superclass.constructor.call(this,e),this.hT="14"},Kw.lang.extend(jw.asn1.DERTeletexString,jw.asn1.DERAbstractString),jw.asn1.DERIA5String=function(e){jw.asn1.DERIA5String.superclass.constructor.call(this,e),this.hT="16"},Kw.lang.extend(jw.asn1.DERIA5String,jw.asn1.DERAbstractString),jw.asn1.DERUTCTime=function(e){jw.asn1.DERUTCTime.superclass.constructor.call(this,e),this.hT="17",this.setByDate=function(e){this.hTLV=null,this.isModified=!0,this.date=e,this.s=this.formatDate(this.date,"utc"),this.hV=stohex(this.s)},this.getFreshValueHex=function(){return void 0===this.date&&void 0===this.s&&(this.date=new Date,this.s=this.formatDate(this.date,"utc"),this.hV=stohex(this.s)),this.hV},void 0!==e&&(void 0!==e.str?this.setString(e.str):"string"==typeof e&&e.match(/^[0-9]{12}Z$/)?this.setString(e):void 0!==e.hex?this.setStringHex(e.hex):void 0!==e.date&&this.setByDate(e.date))},Kw.lang.extend(jw.asn1.DERUTCTime,jw.asn1.DERAbstractTime),jw.asn1.DERGeneralizedTime=function(e){jw.asn1.DERGeneralizedTime.superclass.constructor.call(this,e),this.hT="18",this.withMillis=!1,this.setByDate=function(e){this.hTLV=null,this.isModified=!0,this.date=e,this.s=this.formatDate(this.date,"gen",this.withMillis),this.hV=stohex(this.s)},this.getFreshValueHex=function(){return void 0===this.date&&void 0===this.s&&(this.date=new Date,this.s=this.formatDate(this.date,"gen",this.withMillis),this.hV=stohex(this.s)),this.hV},void 0!==e&&(void 0!==e.str?this.setString(e.str):"string"==typeof e&&e.match(/^[0-9]{14}Z$/)?this.setString(e):void 0!==e.hex?this.setStringHex(e.hex):void 0!==e.date&&this.setByDate(e.date),!0===e.millis&&(this.withMillis=!0))},Kw.lang.extend(jw.asn1.DERGeneralizedTime,jw.asn1.DERAbstractTime),jw.asn1.DERSequence=function(e){jw.asn1.DERSequence.superclass.constructor.call(this,e),this.hT="30",this.getFreshValueHex=function(){for(var e="",t=0;t<this.asn1Array.length;t++){e+=this.asn1Array[t].getEncodedHex()}return this.hV=e,this.hV}},Kw.lang.extend(jw.asn1.DERSequence,jw.asn1.DERAbstractStructured),jw.asn1.DERSet=function(e){jw.asn1.DERSet.superclass.constructor.call(this,e),this.hT="31",this.sortFlag=!0,this.getFreshValueHex=function(){for(var e=new Array,t=0;t<this.asn1Array.length;t++){var n=this.asn1Array[t];e.push(n.getEncodedHex())}return 1==this.sortFlag&&e.sort(),this.hV=e.join(""),this.hV},void 0!==e&&void 0!==e.sortflag&&0==e.sortflag&&(this.sortFlag=!1)},Kw.lang.extend(jw.asn1.DERSet,jw.asn1.DERAbstractStructured),jw.asn1.DERTaggedObject=function(e){jw.asn1.DERTaggedObject.superclass.constructor.call(this),this.hT="a0",this.hV="",this.isExplicit=!0,this.asn1Object=null,this.setASN1Object=function(e,t,n){this.hT=t,this.isExplicit=e,this.asn1Object=n,this.isExplicit?(this.hV=this.asn1Object.getEncodedHex(),this.hTLV=null,this.isModified=!0):(this.hV=null,this.hTLV=n.getEncodedHex(),this.hTLV=this.hTLV.replace(/^../,t),this.isModified=!1)},this.getFreshValueHex=function(){return this.hV},void 0!==e&&(void 0!==e.tag&&(this.hT=e.tag),void 0!==e.explicit&&(this.isExplicit=e.explicit),void 0!==e.obj&&(this.asn1Object=e.obj,this.setASN1Object(this.isExplicit,this.hT,this.asn1Object)))},Kw.lang.extend(jw.asn1.DERTaggedObject,jw.asn1.ASN1Object);var Jw,Qw=function(){var e=function(t,n){return(e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n])})(t,n)};return function(t,n){if("function"!=typeof n&&null!==n)throw new TypeError("Class extends value "+String(n)+" is not a constructor or null");function i(){this.constructor=t}e(t,n),t.prototype=null===n?Object.create(n):(i.prototype=n.prototype,new i)}}(),qw=function(e){function t(n){var i=e.call(this)||this;return n&&("string"==typeof n?i.parseKey(n):(t.hasPrivateKeyProperty(n)||t.hasPublicKeyProperty(n))&&i.parsePropertiesFrom(n)),i}return Qw(t,e),t.prototype.parseKey=function(e){try{var t=0,n=0,i=/^\s*(?:[0-9A-Fa-f][0-9A-Fa-f]\s*)+$/.test(e)?cw(e):hw.unarmor(e),s=bw.decode(i);if(3===s.sub.length&&(s=s.sub[2].sub[0]),9===s.sub.length){t=s.sub[1].getHexStringValue(),this.n=Gw(t,16),n=s.sub[2].getHexStringValue(),this.e=parseInt(n,16);var r=s.sub[3].getHexStringValue();this.d=Gw(r,16);var o=s.sub[4].getHexStringValue();this.p=Gw(o,16);var a=s.sub[5].getHexStringValue();this.q=Gw(a,16);var l=s.sub[6].getHexStringValue();this.dmp1=Gw(l,16);var c=s.sub[7].getHexStringValue();this.dmq1=Gw(c,16);var h=s.sub[8].getHexStringValue();this.coeff=Gw(h,16)}else{if(2!==s.sub.length)return!1;if(s.sub[0].sub){var d=s.sub[1].sub[0];t=d.sub[0].getHexStringValue(),this.n=Gw(t,16),n=d.sub[1].getHexStringValue(),this.e=parseInt(n,16)}else t=s.sub[0].getHexStringValue(),this.n=Gw(t,16),n=s.sub[1].getHexStringValue(),this.e=parseInt(n,16)}return!0}catch(e){return!1}},t.prototype.getPrivateBaseKey=function(){var e={array:[new jw.asn1.DERInteger({int:0}),new jw.asn1.DERInteger({bigint:this.n}),new jw.asn1.DERInteger({int:this.e}),new jw.asn1.DERInteger({bigint:this.d}),new jw.asn1.DERInteger({bigint:this.p}),new jw.asn1.DERInteger({bigint:this.q}),new jw.asn1.DERInteger({bigint:this.dmp1}),new jw.asn1.DERInteger({bigint:this.dmq1}),new jw.asn1.DERInteger({bigint:this.coeff})]};return new jw.asn1.DERSequence(e).getEncodedHex()},t.prototype.getPrivateBaseKeyB64=function(){return ow(this.getPrivateBaseKey())},t.prototype.getPublicBaseKey=function(){var e=new jw.asn1.DERSequence({array:[new jw.asn1.DERObjectIdentifier({oid:"1.2.840.113549.1.1.1"}),new jw.asn1.DERNull]}),t=new jw.asn1.DERSequence({array:[new jw.asn1.DERInteger({bigint:this.n}),new jw.asn1.DERInteger({int:this.e})]}),n=new jw.asn1.DERBitString({hex:"00"+t.getEncodedHex()});return new jw.asn1.DERSequence({array:[e,n]}).getEncodedHex()},t.prototype.getPublicBaseKeyB64=function(){return ow(this.getPublicBaseKey())},t.wordwrap=function(e,t){if(!e)return e;var n="(.{1,"+(t=t||64)+"})( +|$\n?)|(.{1,"+t+"})";return e.match(RegExp(n,"g")).join("\n")},t.prototype.getPrivateKey=function(){var e="-----BEGIN RSA PRIVATE KEY-----\n";return e+=t.wordwrap(this.getPrivateBaseKeyB64())+"\n",e+="-----END RSA PRIVATE KEY-----"},t.prototype.getPublicKey=function(){var e="-----BEGIN PUBLIC KEY-----\n";return e+=t.wordwrap(this.getPublicBaseKeyB64())+"\n",e+="-----END PUBLIC KEY-----"},t.hasPublicKeyProperty=function(e){return(e=e||{}).hasOwnProperty("n")&&e.hasOwnProperty("e")},t.hasPrivateKeyProperty=function(e){return(e=e||{}).hasOwnProperty("n")&&e.hasOwnProperty("e")&&e.hasOwnProperty("d")&&e.hasOwnProperty("p")&&e.hasOwnProperty("q")&&e.hasOwnProperty("dmp1")&&e.hasOwnProperty("dmq1")&&e.hasOwnProperty("coeff")},t.prototype.parsePropertiesFrom=function(e){this.n=e.n,this.e=e.e,e.hasOwnProperty("d")&&(this.d=e.d,this.p=e.p,this.q=e.q,this.dmp1=e.dmp1,this.dmq1=e.dmq1,this.coeff=e.coeff)},t}(Ow),$w="undefined"!=typeof process?null===(Jw=process.env)||void 0===Jw?void 0:Jw.npm_package_version:void 0,eS=function(){function e(e){void 0===e&&(e={}),e=e||{},this.default_key_size=e.default_key_size?parseInt(e.default_key_size,10):1024,this.default_public_exponent=e.default_public_exponent||"010001",this.log=e.log||!1,this.key=null}return e.prototype.setKey=function(e){this.log&&this.key&&console.warn("A key was already set, overriding existing."),this.key=new qw(e)},e.prototype.setPrivateKey=function(e){this.setKey(e)},e.prototype.setPublicKey=function(e){this.setKey(e)},e.prototype.decrypt=function(e){try{return this.getKey().decrypt(aw(e))}catch(e){return!1}},e.prototype.encrypt=function(e){try{return ow(this.getKey().encrypt(e))}catch(e){return!1}},e.prototype.sign=function(e,t,n){try{return ow(this.getKey().sign(e,t,n))}catch(e){return!1}},e.prototype.verify=function(e,t,n){try{return this.getKey().verify(e,aw(t),n)}catch(e){return!1}},e.prototype.getKey=function(e){if(!this.key){if(this.key=new qw,e&&"[object Function]"==={}.toString.call(e))return void this.key.generateAsync(this.default_key_size,this.default_public_exponent,e);this.key.generate(this.default_key_size,this.default_public_exponent)}return this.key},e.prototype.getPrivateKey=function(){return this.getKey().getPrivateKey()},e.prototype.getPrivateKeyB64=function(){return this.getKey().getPrivateBaseKeyB64()},e.prototype.getPublicKey=function(){return this.getKey().getPublicKey()},e.prototype.getPublicKeyB64=function(){return this.getKey().getPublicBaseKeyB64()},e.version=$w,e}(),tS=nb((function(e){!function(){var t="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",n={rotl:function(e,t){return e<<t|e>>>32-t},rotr:function(e,t){return e<<32-t|e>>>t},endian:function(e){if(e.constructor==Number)return 16711935&n.rotl(e,8)|4278255360&n.rotl(e,24);for(var t=0;t<e.length;t++)e[t]=n.endian(e[t]);return e},randomBytes:function(e){for(var t=[];e>0;e--)t.push(Math.floor(256*Math.random()));return t},bytesToWords:function(e){for(var t=[],n=0,i=0;n<e.length;n++,i+=8)t[i>>>5]|=e[n]<<24-i%32;return t},wordsToBytes:function(e){for(var t=[],n=0;n<32*e.length;n+=8)t.push(e[n>>>5]>>>24-n%32&255);return t},bytesToHex:function(e){for(var t=[],n=0;n<e.length;n++)t.push((e[n]>>>4).toString(16)),t.push((15&e[n]).toString(16));return t.join("")},hexToBytes:function(e){for(var t=[],n=0;n<e.length;n+=2)t.push(parseInt(e.substr(n,2),16));return t},bytesToBase64:function(e){for(var n=[],i=0;i<e.length;i+=3)for(var s=e[i]<<16|e[i+1]<<8|e[i+2],r=0;r<4;r++)8*i+6*r<=8*e.length?n.push(t.charAt(s>>>6*(3-r)&63)):n.push("=");return n.join("")},base64ToBytes:function(e){e=e.replace(/[^A-Z0-9+\/]/gi,"");for(var n=[],i=0,s=0;i<e.length;s=++i%4)0!=s&&n.push((t.indexOf(e.charAt(i-1))&Math.pow(2,-2*s+8)-1)<<2*s|t.indexOf(e.charAt(i))>>>6-2*s);return n}};e.exports=n}()})),nS={utf8:{stringToBytes:function(e){return nS.bin.stringToBytes(unescape(encodeURIComponent(e)))},bytesToString:function(e){return decodeURIComponent(escape(nS.bin.bytesToString(e)))}},bin:{stringToBytes:function(e){for(var t=[],n=0;n<e.length;n++)t.push(255&e.charCodeAt(n));return t},bytesToString:function(e){for(var t=[],n=0;n<e.length;n++)t.push(String.fromCharCode(e[n]));return t.join("")}}},iS=nS,sS=function(e){return null!=e&&(rS(e)||function(e){return"function"==typeof e.readFloatLE&&"function"==typeof e.slice&&rS(e.slice(0,0))}(e)||!!e._isBuffer)};function rS(e){return!!e.constructor&&"function"==typeof e.constructor.isBuffer&&e.constructor.isBuffer(e)}var oS,aS,lS=nb((function(e){!function(){var t=tS,n=iS.utf8,i=sS,s=iS.bin,r=function(e,o){e.constructor==String?e=o&&"binary"===o.encoding?s.stringToBytes(e):n.stringToBytes(e):i(e)?e=Array.prototype.slice.call(e,0):Array.isArray(e)||e.constructor===Uint8Array||(e=e.toString());for(var a=t.bytesToWords(e),l=8*e.length,c=1732584193,h=-271733879,d=-1732584194,u=271733878,p=0;p<a.length;p++)a[p]=16711935&(a[p]<<8|a[p]>>>24)|4278255360&(a[p]<<24|a[p]>>>8);a[l>>>5]|=128<<l%32,a[14+(l+64>>>9<<4)]=l;var m=r._ff,f=r._gg,g=r._hh,y=r._ii;for(p=0;p<a.length;p+=16){var b=c,v=h,x=d,w=u;c=m(c,h,d,u,a[p+0],7,-680876936),u=m(u,c,h,d,a[p+1],12,-389564586),d=m(d,u,c,h,a[p+2],17,606105819),h=m(h,d,u,c,a[p+3],22,-1044525330),c=m(c,h,d,u,a[p+4],7,-176418897),u=m(u,c,h,d,a[p+5],12,1200080426),d=m(d,u,c,h,a[p+6],17,-1473231341),h=m(h,d,u,c,a[p+7],22,-45705983),c=m(c,h,d,u,a[p+8],7,1770035416),u=m(u,c,h,d,a[p+9],12,-1958414417),d=m(d,u,c,h,a[p+10],17,-42063),h=m(h,d,u,c,a[p+11],22,-1990404162),c=m(c,h,d,u,a[p+12],7,1804603682),u=m(u,c,h,d,a[p+13],12,-40341101),d=m(d,u,c,h,a[p+14],17,-1502002290),c=f(c,h=m(h,d,u,c,a[p+15],22,1236535329),d,u,a[p+1],5,-165796510),u=f(u,c,h,d,a[p+6],9,-1069501632),d=f(d,u,c,h,a[p+11],14,643717713),h=f(h,d,u,c,a[p+0],20,-373897302),c=f(c,h,d,u,a[p+5],5,-701558691),u=f(u,c,h,d,a[p+10],9,38016083),d=f(d,u,c,h,a[p+15],14,-660478335),h=f(h,d,u,c,a[p+4],20,-405537848),c=f(c,h,d,u,a[p+9],5,568446438),u=f(u,c,h,d,a[p+14],9,-1019803690),d=f(d,u,c,h,a[p+3],14,-187363961),h=f(h,d,u,c,a[p+8],20,1163531501),c=f(c,h,d,u,a[p+13],5,-1444681467),u=f(u,c,h,d,a[p+2],9,-51403784),d=f(d,u,c,h,a[p+7],14,1735328473),c=g(c,h=f(h,d,u,c,a[p+12],20,-1926607734),d,u,a[p+5],4,-378558),u=g(u,c,h,d,a[p+8],11,-2022574463),d=g(d,u,c,h,a[p+11],16,1839030562),h=g(h,d,u,c,a[p+14],23,-35309556),c=g(c,h,d,u,a[p+1],4,-1530992060),u=g(u,c,h,d,a[p+4],11,1272893353),d=g(d,u,c,h,a[p+7],16,-155497632),h=g(h,d,u,c,a[p+10],23,-1094730640),c=g(c,h,d,u,a[p+13],4,681279174),u=g(u,c,h,d,a[p+0],11,-358537222),d=g(d,u,c,h,a[p+3],16,-722521979),h=g(h,d,u,c,a[p+6],23,76029189),c=g(c,h,d,u,a[p+9],4,-640364487),u=g(u,c,h,d,a[p+12],11,-421815835),d=g(d,u,c,h,a[p+15],16,530742520),c=y(c,h=g(h,d,u,c,a[p+2],23,-995338651),d,u,a[p+0],6,-198630844),u=y(u,c,h,d,a[p+7],10,1126891415),d=y(d,u,c,h,a[p+14],15,-1416354905),h=y(h,d,u,c,a[p+5],21,-57434055),c=y(c,h,d,u,a[p+12],6,1700485571),u=y(u,c,h,d,a[p+3],10,-1894986606),d=y(d,u,c,h,a[p+10],15,-1051523),h=y(h,d,u,c,a[p+1],21,-2054922799),c=y(c,h,d,u,a[p+8],6,1873313359),u=y(u,c,h,d,a[p+15],10,-30611744),d=y(d,u,c,h,a[p+6],15,-1560198380),h=y(h,d,u,c,a[p+13],21,1309151649),c=y(c,h,d,u,a[p+4],6,-145523070),u=y(u,c,h,d,a[p+11],10,-1120210379),d=y(d,u,c,h,a[p+2],15,718787259),h=y(h,d,u,c,a[p+9],21,-343485551),c=c+b>>>0,h=h+v>>>0,d=d+x>>>0,u=u+w>>>0}return t.endian([c,h,d,u])};r._ff=function(e,t,n,i,s,r,o){var a=e+(t&n|~t&i)+(s>>>0)+o;return(a<<r|a>>>32-r)+t},r._gg=function(e,t,n,i,s,r,o){var a=e+(t&i|n&~i)+(s>>>0)+o;return(a<<r|a>>>32-r)+t},r._hh=function(e,t,n,i,s,r,o){var a=e+(t^n^i)+(s>>>0)+o;return(a<<r|a>>>32-r)+t},r._ii=function(e,t,n,i,s,r,o){var a=e+(n^(t|~i))+(s>>>0)+o;return(a<<r|a>>>32-r)+t},r._blocksize=16,r._digestsize=16,e.exports=function(e,n){if(null==e)throw new Error("Illegal argument "+e);var i=t.wordsToBytes(r(e,n));return n&&n.asBytes?i:n&&n.asString?s.bytesToString(i):t.bytesToHex(i)}}()})),cS={serialNums:[],key:""};class hS{constructor(e){this.viewport=e,this.encryptInfo=cS,oS.set(this,!0),aS.set(this,setTimeout((()=>{uf(this,oS,!1),this.viewport.triggerRender()}),5e3))}verify(e,t){var n;clearTimeout(df(this,aS));const i=new eS;i.setPublicKey(null===(n=this.encryptInfo)||void 0===n?void 0:n.key);const s=i.verify(e,t,lS);return uf(this,oS,s),this.viewport.triggerRender(),s}getVerified(){return!0}}oS=new WeakMap,aS=new WeakMap;class dS{constructor(e,t){this.scene=e,this.signals=t;const n=document.createElement("div");n.style.position="absolute",n.style.left="12px",n.style.bottom="12px",n.style.fontSize="12px",n.style.color="#fff",n.style.pointerEvents="none",this.container=n,this.state={objects:0,vertices:0,triangles:0,frametime:0,lodFrametime:0}}addListeners(){const{scene:e,signals:t}=this;function n(e){let t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];const n=document.createElement("span");return t&&(n.style.marginLeft="6px"),n.innerText=e,n}function i(){return document.createElement("br")}const s=n("0"),r=n("0"),o=n("0"),a=n("0"),l=n("0");this.container.appendChild(n("objects",!1)),this.container.appendChild(s),this.container.appendChild(i()),this.container.appendChild(n("triangles",!1)),this.container.appendChild(r),this.container.appendChild(i()),this.container.appendChild(n("vertices",!1)),this.container.appendChild(o),this.container.appendChild(i()),this.container.appendChild(n("frametime",!1)),this.container.appendChild(a),this.container.appendChild(i()),this.container.appendChild(n("lodFrametime",!1)),this.container.appendChild(l);const c=()=>{this.state.objects=0,this.state.vertices=0,this.state.triangles=0;for(let t=0;t<e.children.length;t++){e.children[t].traverseVisible((e=>{var t,n,i,s;if("SceneManager"!==e.stype&&this.state.objects++,e.isMesh){const r=e.geometry;r.isGeometry?(this.state.vertices+=(null===(t=r.vertices)||void 0===t?void 0:t.length)||0,this.state.triangles+=(null===(n=r.faces)||void 0===n?void 0:n.length)||0):r.isBufferGeometry&&(this.state.vertices+=(null===(i=r.attributes.position)||void 0===i?void 0:i.count)||0,null!==r.index?this.state.triangles+=r.index.count/3:this.state.triangles+=(null===(s=r.attributes.position)||void 0===s?void 0:s.count)/3||0)}}))}s.innerText=String(this.state.objects),o.innerText=String(this.state.vertices),r.innerText=String(this.state.triangles)};t.objectAdded.add(c),t.objectRemoved.add(c),t.geometryChanged.add(c);t.sceneRendered.add((e=>{this.state.frametime=e,a.innerText=Number(e).toFixed(2)+" ms"}));t.loadRendered.add((e=>{this.state.lodFrametime=e,l.innerText=Number(e).toFixed(2)+" ms"}))}}const uS=new Qn;class pS extends as{constructor(e,t){super();const n=new Fn("#ff3653"),i=new Fn("#8adb00"),s=new Fn("#2c8fff"),r=new Zr(-2,2,2,-2,0,4);r.position.set(0,0,2);const o=new lr(.8,.05,.05).translate(.4,0,0),a=new or(o,y(n)),l=new or(o,y(i)),c=new or(o,y(s));l.rotation.z=Math.PI/2,c.rotation.y=-Math.PI/2,this.add(a),this.add(c),this.add(l);const h=new Rl(b(n,"X"));h.userData.type="posX";const d=new Rl(b(i,"Y"));d.userData.type="posY";const u=new Rl(b(s,"Z"));u.userData.type="posZ";const p=new Rl(b(n));p.userData.type="negX";const m=new Rl(b(i));m.userData.type="negY";const f=new Rl(b(s));f.userData.type="negZ",h.position.x=1,d.position.y=1,u.position.z=1,p.position.x=-1,p.scale.setScalar(.8),m.position.y=-1,m.scale.setScalar(.8),f.position.z=-1,f.scale.setScalar(.8),this.add(h),this.add(d),this.add(u),this.add(p),this.add(m),this.add(f);const g=new ri;function y(e){return new ws({color:e,toneMapped:!1})}function b(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null;const n=document.createElement("canvas");n.width=64,n.height=64;const i=n.getContext("2d");if(!i)return;i.beginPath(),i.arc(32,32,16,0,2*Math.PI),i.closePath(),i.fillStyle=e.getStyle(),i.fill(),null!==t&&(i.font="24px Arial",i.textAlign="center",i.fillStyle="#000000",i.fillText(t,32,41));const s=new gc(n);return new pl({map:s,toneMapped:!1})}this.render=function(n){this.quaternion.copy(e.quaternion).invert(),this.updateMatrixWorld(),g.set(0,0,1),g.applyQuaternion(e.quaternion),g.x>=0?(h.material.opacity=1,p.material.opacity=.5):(h.material.opacity=.5,p.material.opacity=1),g.y>=0?(d.material.opacity=1,m.material.opacity=.5):(d.material.opacity=.5,m.material.opacity=1),g.z>=0?(u.material.opacity=1,f.material.opacity=.5):(u.material.opacity=.5,f.material.opacity=1);const i=t.offsetWidth-128;n.clearDepth(),n.getViewport(uS),n.setViewport(i,0,128,128),n.render(this,r),n.setViewport(uS.x,uS.y,uS.z,uS.w)}}}const mS=new Qn;class fS extends as{constructor(e){super(),this.viewport=e,this.camera=new Zr(-1.6,1.6,.8,-.8,0,4),this.camera.position.z=2,this._generateMark()}_generateMark(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"试用版";const t=document.createElement("canvas");t.width=150,t.height=74;const n=t.getContext("2d");if(n){const i=n.createLinearGradient(0,0,t.width,t.height);i.addColorStop(0,"#ff3653"),i.addColorStop(.5,"#8adb00"),i.addColorStop(1,"#2c8fff"),n.fillStyle=i,n.font="bold 32px/1 serif",n.fillText(e,26,46)}const i=new gc(t),s=new ws({map:i,toneMapped:!1,transparent:!1}),r=new or(new Rr(2,1),s);this.add(r)}render(){const{renderer:e,container:t}=this.viewport,n=t.offsetWidth-256,i=t.offsetHeight-128;e.clearDepth(),e.getViewport(mS),e.setViewport(n,i,256,128),e.render(this,this.camera),e.setViewport(mS.x,mS.y,mS.z,mS.w)}}Hs.prototype.disposeBoundsTree=function(){this.boundsTree=null},or.prototype.raycast=function(e,t){if(this.geometry.boundsTree){if(void 0===this.material)return;Xy.copy(this.matrixWorld).invert(),Ey.copy(e.ray).applyMatrix4(Xy);const n=this.geometry.boundsTree;if(!0===e.firstHitOnly){const i=kg(n.raycastFirst(Ey,this.material),this,e);i&&t.push(i)}else{const i=n.raycast(Ey,this.material);for(let n=0,s=i.length;n<s;n++){const s=kg(i[n],this,e);s&&t.push(s)}}}else zy.call(this,e,t)},zu.prototype.firstHitOnly=!0;const gS={needsUpdate:!1};let yS=0,bS=0;class vS{constructor(e){this.clock=new au,this.sky=null,this.options=e,this.state={useFreq:1,isPausedRender:!1,isDisposed:!1},this.bvhWorker=Yy,this.signals={windowResize:new Cb,cameraObjectChange:new Cb,sceneChanged:new Cb,backgroundChanged:new Cb,beforeRender:new Cb,sceneRendered:new Cb,loadRendered:new Cb,tweenUpdate:new Cb,hover:new Cb,click:new Cb,dblClick:new Cb,rightClick:new Cb,mouseDown:new Cb,mouseMove:new Cb,mouseUp:new Cb,mouseWheel:new Cb,keyDown:new Cb,keyUp:new Cb,modelHover:new Cb,modelUnHover:new Cb,modelClick:new Cb,modelDblClick:new Cb,modelRightClick:new Cb,poiHover:new Cb,poiUnHover:new Cb,poiClick:new Cb,poiDblClick:new Cb,poiRightClick:new Cb,selectPosition:new Cb,sceneClick:new Cb,objectAdded:new Cb,objectRemoved:new Cb,objectChanged:new Cb,geometryChanged:new Cb,materialAdded:new Cb,materialChanged:new Cb,materialRemoved:new Cb,cameraChange:new Cb,outlineChange:new Cb,modelAnimation:new Cb,getSceneInfo:new Cb},this.scener=new Rb(this.signals,this.state),this.scene=this.scener.scene,this.cameraManager=new hv(this),this.camera=this.cameraManager.currentCamera,this.rendererManager=new Jb(e),this.container=this.rendererManager.container,this.interactiveContainer=this.rendererManager.interactiveContainer,this.renderer=this.rendererManager.renderer,this.rendererCSS3D=this.rendererManager.rendererCSS3D,this.rendererCSS2D=this.rendererManager.rendererCSS2D,this.rendererCSS2DHalf=this.rendererManager.rendererCSS2DHalf,this.pmremGenerator=new Ur(this.renderer),this.pmremGenerator.compileEquirectangularShader(),this.effectManager=new Nx(this.renderer,this.scene,this.camera),this.effectComposer=this.effectManager.effectComposer,this.controls=new Jx(this),this.info=new dS(this.scene,this.signals),this.stats=Ny(),this.mixer=new _u(this.scene),this.clipsSet=new Set,this.postUpdate=new Map,this.postRender=new Map,this.selectModel=null,this.selectPoi=null,this._loop=0,this.viewHelper=new pS(this.camera,this.container),this.license=new hS(this),this.waterMark=new fS(this),this._initInfo(),this._initStats(),this._signalsEventListenr(),this._containerAddEventListener(this.container),this.animate(0)}_initInfo(){if(this.options.showInfo){this.info.addListeners();const{container:e}=this.info;e.style.zIndex="1",this.container.appendChild(e)}}_initStats(){if(this.options.showStats){const{dom:e}=this.stats;e.style.zIndex="1",this.container.appendChild(e),this.signals.sceneRendered.add((()=>{this.stats.update()}))}}setSSR(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};const{enabled:t=!0,intensity:n=1,exponent:i=1.75,distance:s=20,fade:r=0,roughnessFade:o=1,thickness:a=3.5,ior:l=1.75,maxRoughness:c=.1,maxDepthDifference:h=20,blend:d=.95,correction:u=1,correctionRadius:p=1,blur:m=1,blurKernel:f=1,blurSharpness:g=10,jitter:y=0,jitterRoughness:b=2,steps:v=20,refineSteps:x=10,missedRays:w=!1,useNormalMap:S=!0,useRoughnessMap:M=!0,resolutionScale:T=1,velocityResolutionScale:C=1}=e,{effectManager:L}=this;L.effectsNeedsUpddate=!0;const R=L.effectsMap.get(Nx.CONSTANTS.ssrEffect);R.enabled=t;const{effect:G}=R;G.usingBoxProjectedEnvMap=!0,G.intensity=n,G.exponent=i,G.distance=s,G.fade=r,G.roughnessFade=o,G.thickness=a,G.ior=l,G.maxRoughness=c,G.maxDepthDifference=h,G.blend=d,G.correction=u,G.correctionRadius=p,G.blur=m,G.blurKernel=f,G.blurSharpness=g,G.jitter=y,G.jitterRoughness=b,G.steps=v,G.refineSteps=x,G.missedRays=w,G.useNormalMap=S,G.useRoughnessMap=M,G.resolutionScale=T,G.velocityResolutionScale=C,this.triggerRender()}setBloom(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};var t;const{enabled:n=!0,intensity:i=3,radius:s=.85,threshold:r=1,smoothing:o=0,scalar:a=2,opacity:l=1,selection:c=[]}=e,{effectManager:h}=this;h.effectsNeedsUpddate=!0;const d=h.effectsMap.get(Nx.CONSTANTS.bloomEffect);d.enabled=n;const{effect:u}=d;u.intensity=i,u.mipmapBlurPass.radius=s,u.luminanceMaterial.threshold=r,u.luminanceMaterial.smoothing=o,u.blendMode.opacity.value=l,null===(t=u.luminanceMaterial.userData.bloomSelection)||void 0===t||t.forEach((e=>{e instanceof or&&e.material.color&&(e.material.toneMapped=!0,e.material.color.multiplyScalar(1/a))})),u.luminanceMaterial.userData.bloomSelection=[],n&&c.forEach((e=>{e.traverse((e=>{e instanceof or&&e.material.color&&(e.material.toneMapped=!1,e.material.color.multiplyScalar(a),u.luminanceMaterial.userData.bloomSelection.push(e))}))})),this.triggerRender()}setSSAO(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};const{enabled:t=!0,depthAwareUpsampling:n=!0,samples:i=32,rings:s=7,distanceThreshold:r=.02,distanceFalloff:o=.0025,rangeThreshold:a=3e-4,rangeFalloff:l=1e-4,luminanceInfluence:c=.7,minRadiusScale:h=.33,radius:d=.1,intensity:u=3,bias:p=.004,fade:m=.01,color:f=null,resolutionScale:g=1}=e,{effectManager:y}=this;y.effectsNeedsUpddate=!0;const b=y.passesMap.get(Nx.CONSTANTS.normalPass),v=y.effectsMap.get(Nx.CONSTANTS.ssaoEffect);b.enabled=t,v.enabled=t;const{effect:x}=v,{ssaoMaterial:w}=x;x.depthAwareUpsampling=n,x.luminanceInfluence=c,x.resolution.scale=g,x.intensity=u,w.samples=i,w.rings=s,w.distanceThreshold=r,w.distanceFalloff=o,w.proximityThreshold=a,w.proximityFalloff=l,w.minRadiusScale=h,w.fade=m,w.bias=p,w.radius=d,f&&(x.color=new Fn(f)),this.triggerRender()}setColorSpace(e){this.renderer.outputEncoding="sRGB"===e?3001:3e3,this.signals.sceneChanged.dispatch()}setToneMapping(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};const{type:t="ACESFilmic",exposure:n=.8}=e,i={None:0,Linear:1,Reinhard:2,Cineon:3,ACESFilmic:4};this.renderer.toneMapping=i[t],this.renderer.toneMappingExposure=n,this.signals.sceneChanged.dispatch()}setSphereSkyBackground(e){(new Md).load(e,(e=>{e.mapping=303,this.scene.background=e,this.signals.backgroundChanged.dispatch()}))}setSkyBackground(e,t){Jm(e,t).then((e=>{this.scene.background=e,this.signals.backgroundChanged.dispatch()}))}setBackgroundColor(e){this.scene.background=new Fn(e),this.signals.backgroundChanged.dispatch()}setBackgroundImage(e){(new Md).load(e,(e=>{e.wrapS=1002,e.wrapT=1002,this.scene.background=e,this.signals.backgroundChanged.dispatch()}))}setSky(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};const{enabled:t=!0,position:n={x:0,y:0,z:0},scalar:i=45e4,turbidity:s=10,rayleigh:r=3,elevation:o=2,azimuth:a=180,exposure:l=.6}=e;if(!t)return void this.closeSky();this.sky||(this.sky=new Vy,this.scene.add(this.sky)),this.sky.name="sky",this.sky.position.set(n.x,n.y,n.z),this.sky.scale.setScalar(i);const c=this.sky.material.uniforms;c.turbidity.value=s,c.rayleigh.value=r,c.mieCoefficient.value=.005,c.mieDirectionalG.value=.7;const h=new ri,d=Um(90-o),u=Um(a);return h.setFromSphericalCoords(1,d,u),c.sunPosition.value.copy(h),this.sky.userData.toneMapping=this.renderer.toneMapping,this.sky.userData.toneMappingExposure=this.renderer.toneMappingExposure,this.renderer.toneMapping=4,this.renderer.toneMappingExposure=l,this.signals.objectAdded.dispatch(),this.sky}closeSky(){if(!this.sky)return!1;const{toneMapping:e,toneMappingExposure:t}=this.sky.userData;return this.renderer.toneMapping=e,this.renderer.toneMappingExposure=t,this.sky.removeFromParent(),this.sky=null,this.signals.objectRemoved.dispatch(),!0}screenshot(){return new Promise((e=>{this.renderer.domElement.toBlob((t=>{e(t)}))}))}setEnvironment(){return this.scene.environment=this.pmremGenerator.fromScene(new Py,.04).texture,this.signals.sceneChanged.dispatch(),this.scene.environment}playModelAnimation(e,t){let n;if(t instanceof hd?n=t:ig(t)?n=e.animations[t]:og(t)&&(n=e.animations.find(t)),!n)return;const i=this.mixer.clipAction(n,e);return i.play(),this.clipsSet.add(n),i}stopModelAnimation(e,t){var n;let i;t instanceof hd?i=t:ig(t)?i=e.animations[t]:og(t)&&(i=e.animations.find(t)),i&&(null===(n=this.mixer.existingAction(i))||void 0===n||n.stop(),this.mixer.uncacheAction(i,e),this.clipsSet.delete(i))}render(e){return rf(this,void 0,void 0,(function*(){return yield null==e?void 0:e(),new Promise((e=>{this.signals.sceneRendered.addOnce(e),this.triggerRender()}))}))}triggerRender(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:1;this.state.useFreq=e}setPauseRender(){let e=!(arguments.length>0&&void 0!==arguments[0])||arguments[0];return rf(this,void 0,void 0,(function*(){if(this.state.isPausedRender=e,!1===e)return this.render()}))}_passesObserver(){this.effectManager.updateEffectPass()}autoRender(e){if(this.state.useFreq<=0&&!gS.needsUpdate)return;if(this.state.useFreq>0&&this.state.useFreq--,gS.needsUpdate&&(gS.needsUpdate=!1),this.state.isPausedRender)return;yS=performance.now(),this.signals.beforeRender.dispatch(),this._passesObserver(),this.effectComposer.render();const t=this.scene.autoUpdate;this.scene.autoUpdate=!1,this.rendererCSS2D&&this.rendererManager.internalOptions.enableRenderCss2D&&this.rendererCSS2D.render(this.scene,this.camera),this.rendererCSS2DHalf&&this.rendererManager.internalOptions.enableRenderCss2DHalf&&this.rendererCSS2DHalf.render(this.scene,this.camera),this.rendererCSS3D&&this.rendererManager.internalOptions.enableRenderCss3D&&this.rendererCSS3D.render(this.scene,this.camera),this.scene.autoUpdate=t,this.options.showViewHelper&&this.camera===this.cameraManager.mainCamera&&this.viewHelper.render(this.renderer),this.license.getVerified()||this.waterMark.render(),this.postRender.forEach((t=>t(e))),bS=performance.now(),this.signals.sceneRendered.dispatch(bS-yS)}animate(e){this._loop=requestAnimationFrame((e=>{this.animate(e)}));const t=this.clock.getDelta();this.clipsSet.size>0&&(this.mixer.update(t),this.signals.modelAnimation.dispatch()),Zm.update()&&this.signals.tweenUpdate.dispatch(),this.postUpdate.forEach((t=>t(e))),this.autoRender(e),this.signals.getSceneInfo.dispatch(this.info.state)}getOffsetByPosition(e){const t=new ri(e.x,e.y,e.z).project(this.camera),n=this.renderer.domElement.getBoundingClientRect();return{left:Math.round(n.left+n.width/2*(t.x+1)),top:Math.round(n.top+n.height/2*(1-t.y))}}getPositionByOffset(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:.1;const n=new ri(0,0,0),i=new ri(0,0,0),s=this.renderer.domElement.getBoundingClientRect();i.set(e.offsetX/s.width*2-1,-e.offsetY/s.height*2+1,t),i.unproject(this.camera),i.sub(this.camera.position).normalize();const r=i.distanceTo(this.camera.position);return n.copy(this.camera.position).add(i.multiplyScalar(r)),n}getIntersects(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:this.scener.intersectsList.getAll(),n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};const{isFilterHideObject:i=!0}=n,s=this.container.getBoundingClientRect();let r={offsetX:0,offsetY:0};if(e instanceof MouseEvent)r={offsetX:e.clientX-s.left,offsetY:e.clientY-s.top};else if(e instanceof TouchEvent){const t=e.changedTouches[0];r={offsetX:t.clientX-s.left,offsetY:t.clientY-s.top}}else r=e;const o=new Gn;o.set(r.offsetX/s.width*2-1,-r.offsetY/s.height*2+1);const a=new zu;a.setFromCamera(o,this.camera);let l=[];return l=sg(t)?a.intersectObjects(t,!0):a.intersectObject(t,!0),i?l.filter((e=>{let{object:t}=e;return Km(t)})):l}rayClash(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.camera.position,t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:new ri(0,-1,0),n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:this.scener.intersectsList.meshOfModelList;const i=new zu;return i.set(e,t),sg(n)?i.intersectObjects(n,!0):i.intersectObject(n,!0)}setHoverEnabled(e){this.options.hoverEnabled=e}clearSignals(){for(const e in this.signals)this.signals[e].removeAll()}dispose(){cancelAnimationFrame(this._loop),this.mixer.stopAllAction(),this.clipsSet.forEach((e=>{this.mixer.uncacheAction(e),this.mixer.uncacheClip(e)})),this.mixer.uncacheRoot(this.scene),this.clipsSet.clear(),this.controls.dispose(),Zm.removeAll(),this.bvhWorker.dispose(),this.clearSignals(),this.scene.clear(),this.pmremGenerator.dispose(),this.effectComposer.dispose(),this.renderer.dispose(),this.renderer.forceContextLoss(),this.container.remove(),this.state.isDisposed=!0}_signalsEventListenr(){const e=()=>{const{offsetWidth:e,offsetHeight:t}=this.container;this.effectManager.updateCamera(this.camera),this.camera.aspect=e/t,this.camera.updateProjectionMatrix(),this.renderer.setSize(e,t),this.effectComposer.setSize(e,t),this.rendererCSS3D&&this.rendererCSS3D.setSize(e,t),this.rendererCSS2D&&this.rendererCSS2D.setSize(e,t),this.rendererCSS2DHalf&&this.rendererCSS2DHalf.setSize(e,t),this.triggerRender()};setTimeout((()=>e())),this.signals.windowResize.add(e),this.signals.cameraObjectChange.add(e),this.signals.sceneChanged.add((()=>this.triggerRender())),this.signals.backgroundChanged.add((()=>this.triggerRender())),this.signals.objectAdded.add((()=>this.triggerRender())),this.signals.objectRemoved.add((()=>this.triggerRender())),this.signals.objectChanged.add((()=>this.triggerRender())),this.signals.materialAdded.add((()=>this.triggerRender())),this.signals.materialRemoved.add((()=>this.triggerRender())),this.signals.materialChanged.add((()=>this.triggerRender())),this.signals.geometryChanged.add((()=>this.triggerRender())),this.signals.cameraChange.add((()=>this.triggerRender())),this.signals.tweenUpdate.add((()=>this.triggerRender())),this.signals.modelAnimation.add((()=>this.triggerRender()));this.signals.outlineChange.add((e=>{const{objects:t,options:n}=e,{color:i,hideColor:s,edgeThickness:r,edgeStrength:o}=Object.assign(Object.assign({},{color:16777215,hideColor:10066329,edgeThickness:3,edgeStrength:10}),n),{effectManager:a}=this;a.effectsNeedsUpddate=!0;const l=a.effectsMap.get(Nx.CONSTANTS.outlineEffect),c=t.length>0;l.enabled=c;const{effect:h}=l,{uniforms:d}=h,u=[];t.forEach((e=>{e.traverse((e=>{e instanceof or&&u.push(e)}))})),h.selection.set(u),h.blur=r>0,h.blurPass.kernelSize=r;const p=d.get("visibleEdgeColor"),m=d.get("hiddenEdgeColor"),f=d.get("edgeStrength");p&&p.value.set(i),m&&m.value.set(s),f&&(f.value=o),this.triggerRender()}))}_containerAddEventListener(e){const t=[0,0];let n=null;const i=s=>{var r,o;this.signals.mouseUp.dispatch(s);const a=s.offsetX-(null!==(r=null==n?void 0:n.offsetX)&&void 0!==r?r:0),l=s.offsetY-(null!==(o=null==n?void 0:n.offsetY)&&void 0!==o?o:0);if(Math.abs(a)>2||Math.abs(l)>2)return t[0]=0,void(t[1]=0);setTimeout((()=>{0!==t[0]&&0===t[1]&&(0===s.button?(this.signals.click.dispatch(s),this._triggerSceneEventInAllObject("click",s)):2===s.button&&(this.signals.rightClick.dispatch(s),this._triggerSceneEventInAllObject("rightClick",s))),t[0]=0,t[1]=0}),300),e.removeEventListener("mouseup",i,!1)};let s=!1,r=null,o=null;const a=[0,0],l=e=>{var t,n;r&&clearTimeout(r);const i=()=>{s=!1,a[0]=0,a[1]=0},l=e.changedTouches[0].clientX-(null!==(t=null==o?void 0:o.changedTouches[0].clientX)&&void 0!==t?t:0),c=e.changedTouches[0].clientY-(null!==(n=null==o?void 0:o.changedTouches[0].clientY)&&void 0!==n?n:0);Math.abs(l)>2||Math.abs(c)>2?i():s?(i(),this.signals.rightClick.dispatch(e),this._triggerSceneEventInAllObject("rightClick",e)):setTimeout((()=>{0!==a[0]&&0===a[1]?(this.signals.click.dispatch(e),this._triggerSceneEventInAllObject("click",e)):0!==a[0]&&0!==a[1]&&a[1]-a[0]<=300&&(this.signals.dblClick.dispatch(e),this._triggerSceneEventInAllObject("dblClick",e)),i()}),300)};e.addEventListener("mousedown",(s=>{n=s,this.signals.mouseDown.dispatch(s),0===t[0]?t[0]=performance.now():0===t[1]&&(t[1]=performance.now()),e.addEventListener("mouseup",i,!1)}),!1),e.addEventListener("mousemove",(e=>{this.signals.mouseMove.dispatch(e),this.options.hoverEnabled&&this._triggerSceneEventInAllObject("hover",e)}),!1),e.addEventListener("dblclick",(e=>{this.signals.dblClick.dispatch(e),this._triggerSceneEventInAllObject("dblClick",e)}),!1),e.addEventListener("wheel",(e=>{this.signals.mouseWheel.dispatch(e)}),{passive:!0}),e.addEventListener("touchstart",(t=>{0===a[0]?a[0]=performance.now():0===a[1]&&(a[1]=performance.now()),o=t,r&&clearTimeout(r),r=setTimeout((()=>{s=!0}),800),e.addEventListener("touchend",l,{once:!0})}),{passive:!0}),e.addEventListener("contextmenu",(e=>e.preventDefault()),!1),document.addEventListener("keydown",(e=>{this.signals.keyDown.dispatch(e)}),!1),document.addEventListener("keyup",(e=>{this.signals.keyUp.dispatch(e)}),!1)}_triggerSceneEventInAllObject(e,t){const n=this.getIntersects(t,this.scener.intersectsList.getAll());if(0===n.length)return this.selectModel&&this.signals.modelHover.numListeners>0&&this.signals.modelUnHover.dispatch(this.selectModel),this.selectPoi&&this.signals.poiHover.numListeners>0&&this.signals.poiUnHover.dispatch(this.selectPoi),this.selectModel=null,this.selectPoi=null,void this.signals.sceneClick.dispatch({type:e,event:t});const i={object:null,type:null,point:null},s=[],r=[];function o(e){return e.parent?"Model"===e.parent.stype?e.parent:o(e.parent):void 0}n.forEach((e=>{if(e.object.parent instanceof AS){const t=e.object.parent;i.object||(i.type="Poi",i.object=e.object,i.point=e.point);-1===s.findIndex((e=>e.poi.uuid===t.uuid))&&s.push({poi:t,sourceData:e})}else if(e.object instanceof as){const t=o(e.object);t&&(i.object||(i.type="Model",i.object=e.object,i.point=e.point),r.push({model:t,sourceData:e}))}})),"click"===e&&i.point&&this.signals.selectPosition.dispatch(i.point);const a=e.slice(0,1).toUpperCase()+e.slice(1),l=e=>{var n;const{model:s}=e[0];if(s)if("Hover"===a)(null===(n=this.selectModel)||void 0===n?void 0:n.uuid)!==s.uuid&&(this.signals.modelHover.dispatch({target:s,currentTarget:i.object,intersects:e,event:t}),this.selectModel=s);else{let n=null;"Click"===a?(n=s.onClick,s.dispatchEvent({type:"click"})):"RightClick"===a?(n=s.onRightClick,s.dispatchEvent({type:"rightClick"})):"DblClick"===a&&(n=s.onDblClick,s.dispatchEvent({type:"dblClick"})),n?n(s):s.isEventPropagation=!0,s.isEventPropagation&&(this.signals[`model${a}`].dispatch({target:s,currentTarget:i.object,intersects:e,event:t}),s.isEventPropagation=!1)}},c=e=>{var n;const{poi:i}=e[0];if(i)if("Hover"===a)(null===(n=this.selectPoi)||void 0===n?void 0:n.uuid)!==i.uuid&&(this.signals.poiHover.dispatch({target:i,event:t}),this.selectPoi=i);else{let e=null;"Click"===a?(e=i.onClick,i.dispatchEvent({type:"click"})):"RightClick"===a?(e=i.onRightClick,i.dispatchEvent({type:"rightClick"})):"DblClick"===a&&(e=i.onDblClick,i.dispatchEvent({type:"dblClick"})),e?e(i):i.isEventPropagation=!0,i.isEventPropagation&&(this.signals[`poi${a}`].dispatch({target:i,event:t}),i.isEventPropagation=!1)}};"Model"===i.type?l(r):"Poi"===i.type&&c(s)}}class xS extends or{constructor(e,t,n){let i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:"BaseMesh";super(e,t);const{id:s,name:r="",level:o={max:null,min:null},visible:a=!0,position:l={x:0,y:0,z:0},rotation:c={x:0,y:0,z:0},scale:h={x:1,y:1,z:1},userData:d={}}=n;if(void 0===s)throw new Error("In soonspacejs: 空间对象实例化失败,缺少必要字段 'id'!");this.sid=s,this.name=r,this.stype=i,this.level=o,this.visible=null==a||a,this.handleHide=!a,this.position.set(l.x,l.y,l.z),this.rotation.set(c.x,c.y,c.z),this.scale.set(h.x,h.y,h.z),this.castShadow=!0,this.receiveShadow=!0,this.userData=d,this.isEventPropagation=!1,this.autoUpdate=!1}show(){this.visible=!0,this.handleHide=!1,this.autoUpdate=!0,gS.needsUpdate=!0}hide(){this.visible=!1,this.handleHide=!0,this.autoUpdate=!0,gS.needsUpdate=!0}setMove(e,t,n,i){return ug(this.position,Dm(e),t,n,i)}setRotate(e,t,n,i){const s=Bm(e),r=this.quaternion.clone(),o=(new si).setFromEuler(s);return ug({t:0},{t:1},t,((e,t)=>{let{t:i}=e;this.quaternion.slerpQuaternions(r,o,i),null==n||n(this.rotation,t)}),i)}setScale(e,t,n,i){return ug(this.scale,Dm(e),t,n,i)}getBoundingBox(){return new li(new ri,new ri).setFromObject(this)}eventPropagation(){this.isEventPropagation=!0}sClone(e){return new xS(this.geometry,this.material,{id:`clone_${cg()}`}).sCopy(this,e)}sCopy(e){let t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];if(this.name=e.name,this.stype=e.stype,this.up.copy(e.up),this.position.copy(e.position),this.rotation.order=e.rotation.order,this.quaternion.copy(e.quaternion),this.scale.copy(e.scale),this.geometry=e.geometry,this.material=e.material,this.matrix.copy(e.matrix),this.matrixWorld.copy(e.matrixWorld),this.matrixAutoUpdate=e.matrixAutoUpdate,this.matrixWorldNeedsUpdate=e.matrixWorldNeedsUpdate,this.layers.mask=e.layers.mask,this.visible=e.visible,this.castShadow=e.castShadow,this.receiveShadow=e.receiveShadow,this.frustumCulled=e.frustumCulled,this.renderOrder=e.renderOrder,this.userData=JSON.parse(JSON.stringify(e.userData)),!0===t)for(let t=0;t<e.children.length;t++)e.children[t]instanceof SS||e.children[t]instanceof xS?this.add(e.children[t].sClone()):this.add(e.children[t].clone());return this}}const wS={onLoad:null,onClick:null,onDblClick:null,onRightClick:null};class SS extends as{constructor(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"BaseObject3D";super();const{id:n,name:i="",level:s={max:null,min:null},visible:r=!0,position:o={x:0,y:0,z:0},rotation:a={x:0,y:0,z:0},scale:l={x:1,y:1,z:1},userData:c={},onLoad:h,onClick:d,onDblClick:u,onRightClick:p}=Object.assign(Object.assign({},wS),e);if(void 0===n)throw new Error("In soonspacejs: 空间对象实例化失败,缺少必要字段 'id'!");this.sid=n,this.name=i,this.stype=t,this.level=s,this.visible=null==r||r,this.handleHide=!r,this.isEventPropagation=!1,this.position.set(o.x,o.y,o.z),this.rotation.set(a.x,a.y,a.z),this.scale.set(l.x,l.y,l.z),this.castShadow=!0,this.receiveShadow=!0,this.userData=c,this.autoUpdate=!1,this.onLoad=(null==h?void 0:h.bind(this))||null,this.onClick=(null==d?void 0:d.bind(this))||null,this.onDblClick=(null==u?void 0:u.bind(this))||null,this.onRightClick=(null==p?void 0:p.bind(this))||null}eventPropagation(){this.isEventPropagation=!0}show(){this.visible=!0,this.handleHide=!1,this.autoUpdate=!0,gS.needsUpdate=!0}hide(){this.visible=!1,this.handleHide=!0,this.autoUpdate=!0,gS.needsUpdate=!0}setMove(e,t,n,i){return ug(this.position,Dm(e),t,n,i)}setRotate(e,t,n,i){const s=Bm(e),r=this.quaternion.clone(),o=(new si).setFromEuler(s);return ug({t:0},{t:1},t,((e,t)=>{let{t:i}=e;this.quaternion.slerpQuaternions(r,o,i),null==n||n(this.rotation,t)}),i)}setScale(e,t,n,i){return ug(this.scale,Dm(e),t,n,i)}sClone(e){return new SS({id:`clone_${cg()}`}).sCopy(this,e)}sCopy(e){let t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];if(this.name=e.name,this.stype=e.stype,this.up.copy(e.up),this.position.copy(e.position),this.rotation.order=e.rotation.order,this.quaternion.copy(e.quaternion),this.scale.copy(e.scale),this.matrix.copy(e.matrix),this.matrixWorld.copy(e.matrixWorld),this.matrixAutoUpdate=e.matrixAutoUpdate,this.matrixWorldNeedsUpdate=e.matrixWorldNeedsUpdate,this.layers.mask=e.layers.mask,this.visible=e.visible,this.castShadow=e.castShadow,this.receiveShadow=e.receiveShadow,this.frustumCulled=e.frustumCulled,this.renderOrder=e.renderOrder,this.userData=JSON.parse(JSON.stringify(e.userData)),this.animations=e.animations,!0===t)for(let t=0;t<e.children.length;t++){const n=e.children[t];n instanceof SS||n instanceof xS?this.add(n.sClone()):this.add(n.clone())}return this}getBoundingBox(){return new li(new ri,new ri).setFromObject(this)}getSpaceAttribute(){return Om(this,!(arguments.length>0&&void 0!==arguments[0])||arguments[0])}syncSpaceAttribute(e){e instanceof SS?Ym(this,e,!(arguments.length>1&&void 0!==arguments[1])||arguments[1]):Vm("In soonspacejs: BaseObject3D 对象原型方法 'syncSpaceAttribute' 第一个参数对象类型错误!")}}class MS extends SS{constructor(e){super(e,"Group")}showAllChild(){this.children.forEach((e=>{e instanceof SS&&e.show()}))}hideAllChild(){this.children.forEach((e=>{e instanceof SS&&e.hide()}))}}class TS extends SS{constructor(e){super(e,"PluginObject")}}class CS extends SS{constructor(e){super(e,"PoiNode");const{type:t,element:n}=e;this.elementType=t,this.element=n,this.create(t)}create(e){"2D"===e||"2d"===e?this._create2D():"2.5D"===e||"2.5d"===e?this._create2DHalf():"3D"!==e&&"3d"!==e||this._create3D()}show(){this.visible=!0,this.handleHide=!1,this.autoUpdate=!0}hide(){this.visible=!1,this.handleHide=!0,this.autoUpdate=!0}getBoundingBox(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:50;e=e<=0?50:e;const t=new ri,n=new ri,i=new ri(e,e,e);return t.copy(this.position),n.copy(this.position),t.sub(i),n.add(i),new li(t,n)}_create2D(){this.add(new Gb(this.element))}_create2DHalf(){this.add(new Ob(this.element))}_create3D(){this.add(new Nb(this.element))}}class LS extends SS{constructor(e){super(e,"Model");const{format:t}=e;this.formatType=t}setEnvMap(e,t){let n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};Jm(e,t).then((e=>{this.traverse((t=>{if(t instanceof or&&t.material instanceof kh){const{reflectivity:i=.5}=n;t.material.envMap=e,t.material.envMapIntensity=i,gS.needsUpdate=!0}}))}))}sClone(e){return new LS({id:`${this.sid}_clone`,url:"",format:this.formatType}).sCopy(this,e)}}const RS={position:{x:0,y:0,z:0},scale:{x:16,y:16,z:1},stype:"Icon"};class GS extends Rl{constructor(e,t){super(e);const{position:n,scale:i,stype:s}=Object.assign(Object.assign({},RS),t);this.stype=s,this.position.set(n.x,n.y,n.z),this.scale.set(i.x,i.y,i.z),this.renderOrder=1}}class AS extends SS{constructor(e,t){super(t,"Poi");const{name:n,type:i="2.5d",nameScale:s={x:16,y:16,z:1}}=t;this.iconType=i,this.icon=this._createIcon(e);const r={position:{x:0,y:10,z:0},name:n,scale:s};this.text=this.name?this._createText(r):null,this.renderOrder=11}getBoundingBox(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:50;e=e<=0?50:e;const t=new ri,n=new ri,i=new ri(e,e,e);return t.copy(this.position),n.copy(this.position),t.sub(i),n.add(i),new li(t,n)}sClone(e,t){return new AS(this.icon.material,{id:`${this.sid}_clone`,url:"",type:null!=t?t:this.iconType,name:this.name}).sCopy(this,e)}_createIcon(e){const t=new GS(this._computeMaterialSizeAttenuation(e));return this.add(t),t}_createText(e){const t=this._createTextMaterial(e),n=new GS(this._computeMaterialSizeAttenuation(t),e);return this.add(n),n}_createTextMaterial(e){const t=this._createTextCanvas(e.name||""),n=new Jn(t);n.flipY=!0,n.version+=1;return new pl({map:n,depthTest:!0})}_createTextCanvas(e,t){const n=256,i=document.createElement("canvas");i.width=n,i.height=n;const s=i.getContext("2d"),{fontFamily:r,fontSize:o,color:a,textAlign:l,textBaseline:c}=Object.assign(Object.assign({},{fontFamily:"Microsoft YaHei",fontSize:32,color:"#fff",textAlign:"center",textBaseline:"bottom"}),t);return s&&(s.save(),s.font=o+"px "+r,s.textAlign=l,s.textBaseline=c,s.shadowColor="black",s.strokeStyle="black",s.lineWidth=3,s.fillStyle=a,s.strokeText(e,128,128),s.fillText(e,128,128),s.restore()),i}_computeMaterialSizeAttenuation(e){return"2D"===this.iconType||"2d"===this.iconType?e.sizeAttenuation=!1:"2.5D"!==this.iconType&&"2.5d"!==this.iconType||(e.sizeAttenuation=!0),e}}class _S extends xS{constructor(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"Point";const{radius:n=10,color:i=16777215,opacity:s=1,gradient:r}=e;super(function(e){return new Xh(e,32,32)}(n),function(e,t,n){return new ws({color:e,opacity:t,transparent:t<1,map:Qm(n)})}(i,s,r),e,t)}setOptions(e){const{color:t,opacity:n,radius:i,position:s,gradient:r}=e,o=this.material;t&&(o.color=new Fn(t)),n&&(o.opacity=n),i&&(this.geometry=new Xh(i,32,32)),s&&this.position.copy(Dm(s)),r&&(o.map=Qm(r)),o.needsUpdate=!0,gS.needsUpdate=!0}}class IS extends _S{constructor(e){super(e,"Node"),this.graphs=e.graphs}}class ES extends xS{constructor(e){const{radius:t=50,color:n=16777215,opacity:i=1,gradient:s}=e;super(function(e){return new Bc(e,64)}(t),function(e,t,n){return new ws({color:e,opacity:t,transparent:t<1,side:2,map:Qm(n)})}(n,i,s),e,"Circle"),this.rotation.set(Math.PI/2,0,0)}setOptions(e){const{color:t,opacity:n,radius:i,position:s,gradient:r}=e,o=this.material;t&&(o.color=new Fn(t)),n&&(o.opacity=n),i&&(this.geometry=new Bc(i,64)),s&&this.position.copy(Dm(s)),r&&(o.map=Qm(r)),o.needsUpdate=!0,gS.needsUpdate=!0}}class XS extends xS{constructor(e){const{start:t,end:n,imgUrl:i,width:s=20,color:r=65280,opacity:o=1,animation:a=!1,passable:l=0,restrict:c=0}=e,h=Dm(t),d=Dm(n),u=h.distanceTo(d);super(function(e,t,n){let i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:new ri(0,1,0);const s=n/2,r=new ri,o=new ri;r.subVectors(t,e),r.normalize(),o.crossVectors(r,i);const a=new ri(o.x*s,o.y*s,o.z*s),l=new ri(-o.x*s,-o.y*s,-o.z*s),c=new ri;c.addVectors(e,a);const h=new ri;h.addVectors(e,l);const d=new ri;d.addVectors(t,l);const u=new ri;u.addVectors(t,a);const p=new Hs;return p.setAttribute("position",new Xs([c.x,c.y,c.z,h.x,h.y,h.z,d.x,d.y,d.z,d.x,d.y,d.z,u.x,u.y,u.z,c.x,c.y,c.z],3)),p.setAttribute("uv",new Xs([0,0,1,0,1,1,1,1,0,1,0,0],2)),p}(h,d,s),function(e,t,n,i,s,r){const o=new ws({color:n,side:2,transparent:void 0!==i&&i<1,opacity:i});let a;return s&&(a=(new Md).load(s,(n=>{a.repeat.set(1,e/(t*(n.image.height/n.image.width))*.63*(n.image.height/n.image.height)),o.color.set(16777215)})),a.wrapS=1e3,a.wrapT=1e3,a.flipY=!0,a.matrixAutoUpdate=!0,ng(r)&&r?ug(a.offset,{y:-1,x:0},{repeat:!0,duration:500}):rg(r)&&ug(a.offset,{y:-1,x:0},Object.assign(Object.assign({},r),{repeat:!0})),o.map=a),o}(u,s,r,o,i,a),e,"Link"),this.passable=l,this.restrict=c}}class zS extends SS{constructor(e){super(e,"Topology");const{type:t="line"}=e;this.topologyType=t,this.nodes=[],this.links=[],this.info=e,this.create()}create(){var e,t;const{nodes:n,renderLink:i=!0,linkWidth:s=20,linkColor:r=65280,renderNode:o=!0,nodeColor:a=255,nodeRadius:l=s/2,imgUrl:c,animation:h=!1}=this.info,d=[];for(const u of n){const n=this.createNode(Object.assign(Object.assign({},u),{radius:l,color:a}));if(!1===o&&n.hide(),this.nodes.push(n),!c&&i){const n=sg(r)?r[null===(e=u.graphs[0])||void 0===e?void 0:e.passable]?r[null===(t=u.graphs[0])||void 0===t?void 0:t.passable]:r[0]:r;!o&&this.createCircle({id:`${u.id}_circle`,name:`${u.name||u.id}_circle`,position:u.position,radius:s/2,color:n})}if(i)for(let e=0;e<u.graphs.length;e++){const{linkInfo:t,targetNodeId:n,passable:i,restrict:o}=u.graphs[e],{id:a,name:l}=t,p=this.info.nodes.find((e=>e.id===n));if(!d.includes(a)&&p){d.push(a);const e=sg(r)?r[i]?r[i]:r[0]:r,t=this.createLink({id:a,name:l,start:u.position,end:p.position,width:s,color:e,imgUrl:c,opacity:c?.99:1,animation:h,passable:i,restrict:o,userData:{startNodeId:u.id,endNodeId:p.id}});this.links.push(t)}}}}createNode(e){const t=new IS(Object.assign({},e));return this.add(t),t}createCircle(e){const t=new ES(Object.assign(Object.assign({},e),{rotation:{x:Math.PI/2,y:0,z:0}}));return this.add(t),t}createLink(e){const t=new XS(Object.assign({},e));return this.add(t),t}resetNodes(e){const{renderLink:t=!0,linkWidth:n=20,linkColor:i=65280,renderNode:s=!0,nodeColor:r=255,nodeRadius:o=n/2,imgUrl:a,animation:l=!1}=this.info,c=[],h=[...this.info.nodes];this.info.nodes=[...e];const d=[];for(let t=0;t<h.length;t++){const n=e.find((e=>e.id===h[t].id));n&&Dm(n.position).equals(Dm(h[t].position))||d.push(h[t])}for(let e=0;e<d.length;e++){const t=this.nodes.findIndex((t=>d[e].id===t.sid));this.remove(this.nodes[t]),this.nodes.splice(t,1)}const u=[];for(let t=0;t<e.length;t++){const n=h.find((n=>n.id===e[t].id));n&&Dm(n.position).equals(Dm(e[t].position))||u.push(e[t])}for(let e=0;e<u.length;e++){const t=this.createNode(Object.assign(Object.assign({},u[e]),{radius:o,color:r}));this.nodes.push(t)}this.remove(...this.links),this.links.length=0;for(const s of e)if(t)for(let e=0;e<s.graphs.length;e++){const{linkInfo:t,targetNodeId:r,passable:o,restrict:h}=s.graphs[e],{id:d,name:u}=t,p=this.info.nodes.find((e=>e.id===r));if(!c.includes(d)&&p){c.push(d);const e=sg(i)?i[o]?i[o]:i[0]:i,t=this.createLink({id:d,name:u,start:s.position,end:p.position,width:n,color:e,imgUrl:a,opacity:a?.99:1,animation:l,passable:o,restrict:h});this.links.push(t)}}}getLength(){let e=0;for(let t=1;t<this.nodes.length;t++)e+=this.nodes[t].position.distanceTo(this.nodes[t-1].position);return e}}function PS(e,t){let n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:new ri(0,1,0);const i=t/2,s=new Hs;let r=[],o=[];if(e.length<2)return s;for(let t=0;t<e.length-1;t++){const s=Dm(e[t]),a=Dm(e[t+1]),l=new ri,c=new ri;l.subVectors(a,s),l.normalize(),c.crossVectors(l,n);const h=new ri(c.x*i,c.y*i,c.z*i),d=new ri(-c.x*i,-c.y*i,-c.z*i),u=new ri;u.addVectors(s,h);const p=new ri;p.addVectors(s,d);const m=new ri;m.addVectors(a,d);const f=new ri;f.addVectors(a,h),r=[...r,u.x,u.y,u.z,p.x,p.y,p.z,m.x,m.y,m.z,m.x,m.y,m.z,f.x,f.y,f.z,u.x,u.y,u.z],o=[...o,0,0,1,0,1,1,1,1,0,1,0,0]}return s.setAttribute("position",new Xs(r,3)),s.setAttribute("uv",new Xs(o,2)),s}class WS extends xS{constructor(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"Line";const{points:n,width:i=20,color:s=16777215,opacity:r=1,gradient:o}=e;super(PS(n,i),function(e,t,n){return new ws({color:e,side:2,transparent:t<1,opacity:t,map:Qm(n)})}(s,r,o),e,t),this.params=e,this.points=n,this.frustumCulled=!1}setOptions(e){var t;const{color:n,opacity:i,points:s,width:r,gradient:o}=e;this.points=s;const a=this.material;n&&(a.color=new Fn(n)),i&&(a.opacity=i),o&&(a.map=Qm(o)),s&&r?this.geometry=PS(s,r):s?this.geometry=PS(s,null!==(t=this.params.width)&&void 0!==t?t:20):r&&(this.geometry=PS(this.points,r)),a.needsUpdate=!0,gS.needsUpdate=!0}}function ZS(e){const t=[];for(let n=0;n<e.length;n++)t.push(new Gn(e[n].x,e[n].z));return t.length>2?new Eh(new Qc(t)):new Hs}class NS extends xS{constructor(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"Polygon";const{yHeight:n,points:i,color:s=16777215,opacity:r=1,gradient:o}=e;super(ZS(i),function(e,t,n){return new ws({color:e,opacity:t,transparent:t<1,side:2,map:Qm(n)})}(s,r,o),e,t),this.points=i,this.position.set(0,n,0),this.rotation.set(Math.PI/2,0,0)}setOptions(e){const{color:t,opacity:n,yHeight:i,points:s,gradient:r}=e,o=this.material;t&&(o.color=new Fn(t)),n&&(o.opacity=n),i&&this.position.set(0,i,0),s&&(this.geometry=ZS(s)),r&&(o.map=Qm(r)),o.needsUpdate=!0,gS.needsUpdate=!0}}class VS extends SS{constructor(e){super(e,"Canvas3D"),this.create(e)}create(e){const{points:t=[],lines:n=[],polygons:i=[],circles:s=[]}=e;for(let e=0;e<t.length;e++)this.createPoint(t[e]);for(let e=0;e<n.length;e++)this.createLine(n[e]);for(let e=0;e<i.length;e++)this.createPolygon(i[e]);for(let e=0;e<s.length;e++)this.createCircle(s[e])}createPoint(e){const t=new _S(e);return this.add(t),gS.needsUpdate=!0,t}getPoint(e){return this.getChildForType("Point",e)}removePoint(e){const t=this.getPoint(e);t&&this.remove(t),gS.needsUpdate=!0}createLine(e){const t=new WS(e);return this.add(t),gS.needsUpdate=!0,t}getLine(e){return this.getChildForType("Line",e)}removeLine(e){const t=this.getLine(e);t&&this.remove(t),gS.needsUpdate=!0}createPolygon(e){const t=new NS(e);return this.add(t),gS.needsUpdate=!0,t}getPolygon(e){return this.getChildForType("Polygon",e)}removePolygon(e){const t=this.getPolygon(e);t&&this.remove(t),gS.needsUpdate=!0}createCircle(e){const t=new ES(e);return this.add(t),gS.needsUpdate=!0,t}getCircle(e){return this.getChildForType("Circle",e)}removeCircle(e){const t=this.getCircle(e);t&&this.remove(t),gS.needsUpdate=!0}getChildForType(e,t){for(let n=0;n<this.children.length;n++)if(this.children[n].stype===e&&this.children[n].sid===t)return this.children[n];return null}}class DS extends xS{constructor(e,t,n){super(e,t,n,"Ground")}}var BS=Object.freeze({__proto__:null,BaseObject3D:SS,BaseMesh:xS,Group:MS,PluginObject:TS,PoiNode:CS,Model:LS,Poi:AS,Icon:GS,Topology:zS,Point:_S,Line:WS,Polygon:NS,Circle:ES,Node:IS,Link:XS,Canvas3D:VS,Ground:DS});class HS{constructor(e,t,n){this.type=e,this.scene=n,this.viewport=t}createGroup(e,t){const n=new MS(e);return null!==t&&this.viewport.scener.addObject(n,null!=t?t:this.scene),n}clear(){this.getAll().forEach((e=>{this.viewport.scener.removeObject(e)}))}getAll(){const e=[];return this.scene.traverse((t=>{((t instanceof SS||t instanceof xS)&&rg(t)&&t.stype===this.type||rg(t)&&t.userData.stype===this.type)&&e.push(t)})),e}hideAll(){this.getAll().forEach((e=>{e.hide?e.hide():e.visible=!1})),this.viewport.signals.objectChanged.dispatch()}showAll(){this.getAll().forEach((e=>{e.show?e.show():e.visible=!0})),this.viewport.signals.objectChanged.dispatch()}}class kS extends HS{constructor(e,t){super("Light",e,t),class{static init(){const e=[1,0,0,2e-5,1,0,0,503905e-9,1,0,0,.00201562,1,0,0,.00453516,1,0,0,.00806253,1,0,0,.0125978,1,0,0,.018141,1,0,0,.0246924,1,0,0,.0322525,1,0,0,.0408213,1,0,0,.0503999,1,0,0,.0609894,1,0,0,.0725906,1,0,0,.0852058,1,0,0,.0988363,1,0,0,.113484,1,0,0,.129153,1,0,0,.145839,1,0,0,.163548,1,0,0,.182266,1,0,0,.201942,1,0,0,.222314,1,0,0,.241906,1,0,0,.262314,1,0,0,.285754,1,0,0,.310159,1,0,0,.335426,1,0,0,.361341,1,0,0,.387445,1,0,0,.412784,1,0,0,.438197,1,0,0,.466966,1,0,0,.49559,1,0,0,.523448,1,0,0,.549938,1,0,0,.57979,1,0,0,.608746,1,0,0,.636185,1,0,0,.664748,1,0,0,.69313,1,0,0,.71966,1,0,0,.747662,1,0,0,.774023,1,0,0,.799775,1,0,0,.825274,1,0,0,.849156,1,0,0,.873248,1,0,0,.89532,1,0,0,.917565,1,0,0,.937863,1,0,0,.958139,1,0,0,.976563,1,0,0,.994658,1,0,0,1.0112,1,0,0,1.02712,1,0,0,1.04189,1,0,0,1.05568,1,0,0,1.06877,1,0,0,1.08058,1,0,0,1.09194,1,0,0,1.10191,1,0,0,1.11161,1,0,0,1.1199,1,0,0,1.12813,.999547,-4.48815e-7,.0224417,199902e-10,.999495,-113079e-10,.0224406,503651e-9,.999496,-452317e-10,.0224406,.00201461,.999496,-101772e-9,.0224406,.00453287,.999495,-180928e-9,.0224406,.00805845,.999497,-282702e-9,.0224406,.0125914,.999496,-407096e-9,.0224406,.0181319,.999498,-554114e-9,.0224406,.02468,.999499,-723768e-9,.0224406,.0322363,.999495,-916058e-9,.0224405,.0408009,.999499,-.00113101,.0224408,.050375,.999494,-.00136863,.0224405,.0609586,.999489,-.00162896,.0224401,.0725537,.999489,-.00191201,.0224414,.0851619,.999498,-.00221787,.0224413,.0987867,.999492,-.00254642,.0224409,.113426,.999507,-.00289779,.0224417,.129088,.999494,-.0032716,.0224386,.145767,.999546,-.0036673,.0224424,.163472,.999543,-.00408166,.0224387,.182182,.999499,-.00450056,.0224338,.201843,.999503,-.00483661,.0224203,.222198,.999546,-.00452928,.022315,.241714,.999508,-.00587403,.0224329,.262184,.999509,-.00638806,.0224271,.285609,.999501,-.00691028,.0224166,.309998,.999539,-.00741979,.0223989,.335262,.999454,-.00786282,.0223675,.361154,.999529,-.00811928,.0222828,.387224,.999503,-.00799941,.0221063,.41252,.999561,-.00952753,.0223057,.438006,.999557,-.0099134,.0222065,.466735,.999541,-.0100935,.0220402,.495332,.999562,-.00996821,.0218067,.523197,.999556,-.0105031,.0217096,.550223,.999561,-.0114191,.0217215,.579498,.999588,-.0111818,.0213357,.608416,.999633,-.0107725,.0208689,.635965,.999527,-.0121671,.0210149,.664476,.999508,-.0116005,.020431,.692786,.999568,-.0115604,.0199791,.719709,.999671,-.0121117,.0197415,.74737,.999688,-.0110769,.0188846,.773692,.99962,-.0122368,.0188452,.799534,.999823,-.0110325,.0178001,.825046,.999599,-.0114923,.0174221,.849075,.999619,-.0105923,.0164345,.872999,.999613,-.0105988,.0158227,.895371,.99964,-.00979861,.0148131,.917364,.99977,-.00967238,.0140721,.938002,.999726,-.00869175,.0129543,.957917,.99973,-.00866872,.0122329,.976557,.999773,-.00731956,.0108958,.994459,.999811,-.00756027,.0102715,1.01118,.999862,-.00583732,.00878781,1.02701,.999835,-.00631438,.00827529,1.04186,.999871,-.00450785,.00674583,1.05569,.999867,-.00486079,.00621041,1.06861,.999939,-.00322072,.00478301,1.08064,.999918,-.00318199,.00406395,1.09181,1.00003,-.00193348,.00280682,1.10207,.999928,-.00153729,.00198741,1.11152,.999933,-623666e-9,917714e-9,1.12009,1,-102387e-11,9.07581e-7,1.12813,.997866,-8.96716e-7,.0448334,199584e-10,.997987,-225945e-10,.0448389,502891e-9,.997987,-903781e-10,.0448388,.00201156,.997985,-203351e-9,.0448388,.00452602,.997986,-361514e-9,.0448388,.00804629,.997987,-56487e-8,.0448389,.0125724,.997988,-813423e-9,.0448389,.0181045,.997984,-.00110718,.0448387,.0246427,.997985,-.00144616,.0448388,.0321875,.997987,-.00183038,.044839,.0407392,.997983,-.00225987,.0448387,.0502986,.997991,-.00273467,.0448389,.0608667,.997984,-.00325481,.0448384,.0724444,.998002,-.00382043,.044839,.0850348,.997997,-.00443145,.0448396,.0986372,.998007,-.00508796,.0448397,.113255,.998008,-.00578985,.04484,.128891,.998003,-.00653683,.0448384,.145548,.997983,-.00732713,.0448358,.163221,.997985,-.00815454,.0448358,.181899,.998005,-.00898985,.0448286,.201533,.998026,-.00964404,.0447934,.221821,.998055,-.00922677,.044611,.241282,.99804,-.0117361,.0448245,.261791,.998048,-.0127628,.0448159,.285181,.998088,-.0138055,.0447996,.30954,.998058,-.0148206,.0447669,.334751,.998099,-.0156998,.044697,.36061,.998116,-.0161976,.0445122,.386603,.998195,-.015945,.0441711,.411844,.998168,-.0183947,.0444255,.43773,.998184,-.0197913,.0443809,.466009,.998251,-.0201426,.0440689,.494574,.998305,-.0198847,.0435632,.522405,.998273,-.0210577,.043414,.549967,.998254,-.0227901,.0433943,.578655,.998349,-.0223108,.0426529,.60758,.99843,-.0223088,.042,.635524,.998373,-.0241141,.0418987,.663621,.998425,-.0231446,.0408118,.691906,.998504,-.0233684,.0400565,.719339,.998443,-.0241652,.0394634,.74643,.99848,-.0228715,.0380002,.773086,.998569,-.023519,.0372322,.798988,.998619,-.0223108,.0356468,.824249,.998594,-.0223105,.034523,.848808,.998622,-.0213426,.0328887,.87227,.998669,-.0207912,.0314374,.895157,.998705,-.0198416,.0296925,.916769,.998786,-.0189168,.0279634,.937773,.998888,-.0178811,.0261597,.957431,.99906,-.0166845,.0242159,.976495,.999038,-.0155464,.0222638,.994169,.999237,-.0141349,.0201967,1.01112,.999378,-.0129324,.0181744,1.02692,.999433,-.0113192,.0159898,1.04174,.999439,-.0101244,.0140385,1.05559,.999614,-.00837456,.0117826,1.06852,.999722,-.00721769,.00983745,1.08069,.999817,-.00554067,.00769002,1.09176,.99983,-.00426961,.005782,1.10211,.999964,-.00273904,.00374503,1.11152,1.00001,-.00136739,.00187176,1.12031,.999946,393227e-10,-28919e-9,1.12804,.995847,-13435e-10,.0671785,19916e-9,.995464,-338387e-10,.0671527,501622e-9,.99547,-135355e-9,.0671531,.00200649,.995471,-30455e-8,.0671532,.00451461,.99547,-541423e-9,.0671531,.008026,.995471,-84598e-8,.0671531,.0125407,.99547,-.00121823,.0671531,.0180589,.99547,-.00165817,.0671531,.0245806,.995463,-.00216583,.0671526,.0321062,.995468,-.00274127,.0671527,.0406366,.995474,-.00338447,.0671534,.0501717,.995473,-.00409554,.0671533,.0607131,.995478,-.00487451,.0671531,.0722618,.995476,-.00572148,.0671532,.0848191,.995477,-.00663658,.0671539,.0983882,.995498,-.00761986,.0671541,.112972,.995509,-.00867094,.0671542,.128568,.995509,-.00978951,.0671531,.145183,.995503,-.0109725,.0671491,.162808,.995501,-.012211,.0671465,.181441,.99553,-.0134565,.0671371,.201015,.99555,-.014391,.0670831,.221206,.99558,-.014351,.0668883,.240813,.995577,-.0173997,.0671055,.261257,.995602,-.0191111,.0671178,.284467,.995623,-.0206705,.0670946,.308765,.995658,-.022184,.0670472,.333905,.995705,-.0234832,.0669417,.359677,.995719,-.0241933,.0666714,.385554,.995786,-.0243539,.066266,.410951,.995887,-.0271866,.0664367,.437163,.995944,-.0296012,.0664931,.464842,.996004,-.0301045,.0660105,.49332,.996128,-.0298311,.0652694,.521131,.996253,-.0316426,.0650739,.549167,.996244,-.0339043,.0649433,.57737,.996309,-.033329,.0638926,.606073,.996417,-.0338935,.0630849,.634527,.996372,-.0353104,.0625083,.66256,.996542,-.0348942,.0611986,.690516,.996568,-.0351614,.060069,.718317,.996711,-.0354317,.0588522,.74528,.996671,-.0349513,.0571902,.772061,.996865,-.0345622,.0555321,.798089,.996802,-.0342566,.0537816,.823178,.996992,-.0330862,.0516095,.847949,.996944,-.0324666,.0495537,.871431,.997146,-.0309544,.0470302,.894357,.997189,-.0299372,.0446043,.916142,.997471,-.0281389,.0418812,.937193,.997515,-.0268702,.0391823,.957,.997812,-.0247166,.0361338,.975936,.998027,-.0233525,.0333945,.99391,.998233,-.0209839,.0301917,1.01075,.998481,-.0194309,.027271,1.02669,.998859,-.0169728,.0240162,1.04173,.99894,-.0152322,.0210517,1.05551,.999132,-.0127497,.0178632,1.06856,.999369,-.0108282,.014787,1.08054,.999549,-.00845886,.0116185,1.09185,.999805,-.0063937,.00867209,1.10207,.99985,-.00414582,.00566823,1.1117,.999912,-.00207443,.00277562,1.12022,1.00001,870226e-10,-53766e-9,1.12832,.991943,-178672e-11,.0893382,198384e-10,.991952,-450183e-10,.089339,499849e-9,.991956,-180074e-9,.0893394,.0019994,.991955,-405167e-9,.0893393,.00449867,.991953,-720298e-9,.0893391,.00799764,.991955,-.00112548,.0893393,.0124964,.991957,-.0016207,.0893395,.0179951,.991958,-.00220601,.0893396,.0244939,.991947,-.00288137,.0893385,.0319929,.991962,-.00364693,.0893399,.0404933,.991965,-.00450264,.0893399,.049995,.99198,-.00544862,.0893411,.0604995,.99197,-.00648491,.0893397,.0720074,.991976,-.00761164,.089341,.0845207,.99198,-.00882891,.0893405,.0980413,.991982,-.0101367,.0893396,.112571,.992008,-.011535,.0893415,.128115,.992026,-.0130228,.0893414,.144672,.992064,-.0145966,.0893418,.162241,.992041,-.0162421,.0893359,.180801,.992086,-.0178888,.0893214,.200302,.992157,-.0190368,.0892401,.220332,.992181,-.0195584,.0890525,.240144,.992175,-.0227257,.0892153,.260728,.99221,-.0254195,.089304,.283473,.99222,-.0274883,.0892703,.307673,.992317,-.0294905,.0892027,.332729,.992374,-.0311861,.0890577,.358387,.992505,-.0320656,.0886994,.384102,.992568,-.0329715,.0883198,.409767,.992675,-.036006,.0883602,.436145,.992746,-.0392897,.0884591,.463217,.992873,-.0399337,.0878287,.491557,.992934,-.040231,.0870108,.519516,.993091,-.0422013,.0865857,.547741,.993259,-.0443503,.0861937,.575792,.993455,-.0446368,.0851187,.604233,.993497,-.0454299,.0840576,.632925,.993694,-.0463296,.0829671,.660985,.993718,-.0470619,.0817185,.688714,.993973,-.0468838,.0800294,.716743,.994207,-.046705,.0781286,.74377,.994168,-.0469698,.0763337,.77042,.9945,-.0456816,.0738184,.796659,.994356,-.0455518,.0715545,.821868,.994747,-.0439488,.0686085,.846572,.994937,-.0430056,.065869,.870435,.995142,-.0413414,.0626446,.893272,.995451,-.0396521,.05929,.915376,.995445,-.0378453,.0558503,.936196,.995967,-.0355219,.0520949,.956376,.996094,-.0335146,.048377,.975327,.996622,-.030682,.0442575,.993471,.996938,-.0285504,.0404693,1.01052,.997383,-.0253399,.0360903,1.02637,.997714,-.0231651,.0322176,1.04139,.998249,-.0198138,.0278433,1.05542,.998596,-.0174337,.0238759,1.06846,.998946,-.0141349,.0195944,1.08056,.99928,-.0115603,.0156279,1.09181,.999507,-.00839065,.0114607,1.10213,.999697,-.005666,.00763325,1.11169,.999869,-.00269902,.00364946,1.12042,1.00001,623836e-10,-319288e-10,1.12832,.987221,-222675e-11,.111332,197456e-10,.98739,-561116e-10,.111351,497563e-9,.987448,-224453e-9,.111357,.00199031,.987441,-505019e-9,.111357,.0044782,.987442,-897816e-9,.111357,.00796129,.987442,-.00140284,.111357,.0124396,.987444,-.00202012,.111357,.0179132,.987442,-.00274964,.111357,.0243824,.987446,-.00359147,.111357,.0318474,.987435,-.00454562,.111356,.0403086,.987461,-.00561225,.111358,.0497678,.987458,-.00679125,.111358,.0602239,.987443,-.0080828,.111356,.0716792,.987476,-.0094872,.111358,.0841364,.98749,-.0110044,.111361,.097597,.987508,-.0126344,.111362,.112062,.987494,-.0143767,.111357,.127533,.987526,-.0162307,.111359,.144015,.987558,-.0181912,.111361,.161502,.987602,-.0202393,.111355,.179979,.987692,-.022273,.111346,.199386,.987702,-.0235306,.111215,.219183,.987789,-.0247628,.111061,.239202,.987776,-.0280668,.111171,.259957,.987856,-.0316751,.111327,.282198,.987912,-.0342468,.111282,.306294,.988,-.0367205,.111198,.331219,.988055,-.0387766,.110994,.356708,.988241,-.0397722,.110547,.382234,.988399,-.0416076,.110198,.408227,.988539,-.0448192,.110137,.434662,.988661,-.0483793,.110143,.461442,.988967,-.0495895,.109453,.489318,.989073,-.0506797,.108628,.517516,.989274,-.0526953,.108003,.545844,.989528,-.054578,.107255,.573823,.989709,-.0561503,.106294,.601944,.989991,-.056866,.104896,.630855,.990392,-.0572914,.103336,.658925,.990374,-.0586224,.10189,.686661,.990747,-.0584764,.099783,.714548,.991041,-.0582662,.0974309,.74186,.991236,-.0584118,.0951678,.768422,.991585,-.0573055,.0921581,.794817,.991984,-.0564241,.0891167,.820336,.9921,-.0553608,.085805,.84493,.992749,-.0533816,.0820354,.868961,.99288,-.0518661,.0782181,.891931,.993511,-.0492492,.0738935,.914186,.993617,-.0471956,.0696402,.93532,.99411,-.044216,.0649659,.95543,.994595,-.0416654,.0603177,.974685,.994976,-.0384314,.0553493,.992807,.995579,-.0353491,.0503942,1.00996,.996069,-.0319787,.0452123,1.02606,.996718,-.028472,.0400112,1.04114,.997173,-.0250789,.0349456,1.05517,.997818,-.0213326,.029653,1.0683,.998318,-.0178509,.024549,1.0805,.998853,-.0141118,.0194197,1.09177,.999218,-.0105914,.0143869,1.1022,.999594,-.00693474,.00943517,1.11175,.99975,-.00340478,.00464051,1.12056,1.00001,109172e-9,-112821e-9,1.12853,.983383,-266524e-11,.133358,196534e-10,.981942,-671009e-10,.133162,494804e-9,.981946,-268405e-9,.133163,.00197923,.981944,-603912e-9,.133163,.00445326,.981941,-.00107362,.133162,.00791693,.981946,-.00167755,.133163,.0123703,.981944,-.00241569,.133162,.0178135,.981945,-.00328807,.133163,.0242466,.981945,-.00429472,.133162,.03167,.981955,-.00543573,.133164,.0400846,.981951,-.00671105,.133163,.0494901,.981968,-.00812092,.133165,.0598886,.981979,-.00966541,.133166,.0712811,.981996,-.0113446,.133168,.083669,.982014,-.0131585,.133169,.0970533,.982011,-.0151073,.133167,.111438,.982062,-.0171906,.133172,.126826,.9821,-.0194067,.133175,.143215,.982149,-.0217502,.133176,.160609,.982163,-.0241945,.133173,.178981,.982247,-.0265907,.133148,.198249,.982291,-.027916,.132974,.217795,.982396,-.0299663,.132868,.238042,.982456,-.0334544,.132934,.258901,.982499,-.0378636,.133137,.280639,.982617,-.0409274,.133085,.304604,.98274,-.0438523,.132985,.329376,.982944,-.0462288,.132728,.354697,.98308,-.0475995,.132228,.380102,.983391,-.0501901,.131924,.406256,.983514,-.0535899,.131737,.432735,.98373,-.0571858,.131567,.459359,.984056,-.0592353,.130932,.486637,.984234,-.0610488,.130092,.51509,.984748,-.0630758,.12923,.543461,.985073,-.0647398,.128174,.571376,.985195,-.0671941,.127133,.599414,.985734,-.0681345,.125576,.628134,.986241,-.0686089,.123639,.656399,.986356,-.0698511,.121834,.684258,.986894,-.0700931,.119454,.711818,.987382,-.0698321,.116718,.739511,.988109,-.0693975,.113699,.766267,.988363,-.0689584,.110454,.792456,.989112,-.0672353,.106602,.81813,.989241,-.0662034,.10267,.842889,.990333,-.0638938,.0981381,.867204,.990591,-.0618534,.0935388,.89038,.991106,-.0593117,.088553,.912576,.991919,-.0562676,.0832187,.934118,.992111,-.0534085,.0778302,.954254,.992997,-.0495459,.0720453,.973722,.993317,-.0463707,.0663458,.991949,.994133,-.0421245,.0601883,1.00936,.994705,-.0384977,.0542501,1.02559,.995495,-.0340956,.0479862,1.04083,.996206,-.030105,.041887,1.05497,.996971,-.0256095,.0355355,1.06824,.997796,-.0213932,.0293655,1.08056,.998272,-.0169612,.0232926,1.09182,.998857,-.0126756,.0172786,1.10219,.99939,-.00832486,.0113156,1.11192,.999752,-.00410826,.00557892,1.12075,1,150957e-9,-119101e-9,1.12885,.975169,-309397e-11,.154669,195073e-10,.975439,-779608e-10,.154712,491534e-9,.975464,-311847e-9,.154716,.00196617,.975464,-701656e-9,.154716,.00442387,.975462,-.0012474,.154715,.0078647,.975461,-.00194906,.154715,.0122886,.975464,-.00280667,.154715,.0176959,.975468,-.00382025,.154716,.0240867,.975471,-.00498985,.154716,.0314612,.975472,-.00631541,.154717,.0398199,.975486,-.00779719,.154718,.0491639,.975489,-.00943505,.154718,.0594932,.975509,-.0112295,.154721,.0708113,.97554,-.0131802,.154724,.0831176,.975557,-.0152876,.154726,.096415,.975585,-.0175512,.154728,.110705,.975605,-.0199713,.154729,.125992,.975645,-.0225447,.154729,.142272,.975711,-.0252649,.154735,.159549,.975788,-.0280986,.154736,.177805,.975872,-.0308232,.154704,.196911,.975968,-.0324841,.154525,.216324,.976063,-.0351281,.154432,.236628,.976157,-.0388618,.15446,.257539,.976204,-.0437704,.154665,.278975,.976358,-.047514,.154652,.302606,.976571,-.0508638,.154535,.327204,.976725,-.0534995,.154221,.352276,.977013,-.0555547,.153737,.377696,.977294,-.0586728,.153403,.403855,.977602,-.0622715,.15312,.430333,.977932,-.0658166,.152755,.456855,.978241,-.0689877,.152233,.483668,.978602,-.0712805,.15132,.512097,.979234,-.0732775,.150235,.540455,.97977,-.075163,.148978,.568486,.979995,-.0778026,.147755,.596524,.98078,-.0791854,.146019,.624825,.981628,-.0799666,.143906,.653403,.982067,-.0808532,.141561,.681445,.98271,-.0816024,.139025,.708918,.983734,-.0812511,.135764,.736594,.98431,-.0806201,.132152,.763576,.985071,-.0801605,.12846,.789797,.98618,-.0784208,.124084,.815804,.986886,-.0766643,.1193,.840869,.987485,-.0747744,.114236,.864952,.988431,-.0716701,.108654,.888431,.988886,-.0691609,.102994,.910963,.990024,-.0654048,.0967278,.932629,.990401,-.0619765,.090384,.95313,.991093,-.0579296,.0837885,.972587,.992018,-.0536576,.0770171,.991184,.992536,-.0493719,.0701486,1.00863,.993421,-.0444813,.062953,1.02494,.993928,-.040008,.0560455,1.04017,.994994,-.0347982,.04856,1.05463,.995866,-.0301017,.0416152,1.06807,.996916,-.0248225,.0342597,1.08039,.997766,-.0199229,.0271668,1.09177,.998479,-.0147422,.0201387,1.10235,.99921,-.00980173,.0131944,1.11206,.999652,-.0047426,.00640712,1.12104,.999998,891673e-10,-10379e-8,1.12906,.967868,-351885e-11,.175947,193569e-10,.968001,-886733e-10,.175972,487782e-9,.96801,-354697e-9,.175973,.00195115,.968012,-798063e-9,.175974,.00439006,.968011,-.00141879,.175973,.00780461,.968011,-.00221686,.175973,.0121948,.968016,-.00319231,.175974,.0175607,.968019,-.00434515,.175974,.0239027,.968018,-.00567538,.175974,.0312208,.968033,-.00718308,.175977,.0395158,.968049,-.00886836,.175979,.0487885,.968047,-.0107312,.175978,.0590394,.968072,-.0127719,.175981,.0702705,.968108,-.0149905,.175986,.0824836,.968112,-.0173866,.175985,.0956783,.968173,-.0199611,.175993,.109862,.96827,-.0227128,.176008,.125033,.968292,-.025639,.17601,.141193,.968339,-.0287299,.176007,.158336,.968389,-.0319399,.176001,.176441,.968501,-.034941,.175962,.195359,.968646,-.0370812,.175793,.214686,.968789,-.0402329,.175708,.234973,.96886,-.0442601,.1757,.255871,.969013,-.049398,.175876,.277238,.969242,-.0539932,.17594,.300326,.969419,-.0577299,.175781,.324702,.969763,-.0605643,.175432,.349527,.970093,-.0634488,.174992,.374976,.970361,-.0670589,.174611,.401097,.970825,-.0708246,.174226,.427496,.971214,-.0742871,.173684,.453858,.971622,-.0782608,.173186,.480637,.972175,-.0813151,.172288,.508655,.972944,-.0832678,.170979,.536973,.973595,-.0855964,.169573,.565138,.974345,-.0882163,.168152,.593222,.975233,-.0901671,.166314,.621201,.976239,-.0912111,.163931,.649919,.977289,-.0916959,.161106,.678011,.978076,-.0927061,.158272,.705717,.979533,-.0925562,.15475,.733228,.980335,-.0918159,.150638,.760454,.981808,-.0908508,.146201,.786918,.983061,-.0896172,.141386,.812953,.984148,-.0871588,.135837,.838281,.985047,-.0850624,.130135,.862594,.986219,-.0818541,.123882,.88633,.987043,-.0784523,.117126,.908952,.988107,-.0749601,.110341,.930744,.988955,-.0703548,.102885,.951728,.989426,-.0662798,.0954167,.971166,.990421,-.0610834,.0876331,.989984,.991032,-.0562936,.0797785,1.00765,.992041,-.0508154,.0718166,1.02434,.992794,-.0454045,.0637125,1.03976,.993691,-.0398194,.0555338,1.05418,.994778,-.0341482,.0473388,1.06772,.995915,-.028428,.0391016,1.08028,.997109,-.022642,.0309953,1.09185,.998095,-.0168738,.0230288,1.10247,.998985,-.0111274,.0150722,1.11229,.999581,-.00543881,.00740605,1.12131,1.00003,162239e-9,-105549e-9,1.12946,.959505,-393734e-11,.196876,191893e-10,.959599,-992157e-10,.196895,483544e-9,.959641,-396868e-9,.196903,.0019342,.959599,-892948e-9,.196895,.00435193,.959603,-.00158747,.196896,.0077368,.959604,-.00248042,.196896,.0120888,.959605,-.00357184,.196896,.0174082,.959605,-.00486169,.196896,.0236949,.959613,-.00635008,.196897,.0309497,.959619,-.00803696,.196898,.0391725,.959636,-.00992255,.196901,.0483649,.959634,-.0120067,.1969,.0585266,.959675,-.0142898,.196906,.0696609,.959712,-.0167717,.196911,.0817678,.959752,-.0194524,.196918,.0948494,.959807,-.0223321,.196925,.10891,.959828,-.0254091,.196924,.123947,.959906,-.0286815,.196934,.139968,.960005,-.0321371,.196944,.156968,.960071,-.0357114,.196936,.17491,.960237,-.0389064,.196882,.193597,.960367,-.041623,.196731,.21285,.960562,-.0452655,.196654,.233075,.960735,-.0496207,.196643,.253941,.960913,-.0549379,.196774,.275278,.961121,-.0603414,.196893,.297733,.96139,-.0644244,.196717,.321877,.961818,-.067556,.196314,.346476,.962175,-.0712709,.195917,.371907,.96255,-.0752848,.1955,.397916,.963164,-.0792073,.195026,.424229,.963782,-.0828225,.194424,.450637,.964306,-.0873119,.193831,.477288,.964923,-.0911051,.192973,.504716,.966048,-.093251,.19151,.533053,.967024,-.0958983,.190013,.561366,.968038,-.09835,.188253,.589464,.969152,-.100754,.186257,.617433,.970557,-.102239,.183775,.645801,.972104,-.102767,.180645,.674278,.973203,-.103492,.177242,.702004,.975123,-.103793,.17345,.729529,.97641,-.102839,.168886,.756712,.978313,-.101687,.163892,.783801,.980036,-.100314,.158439,.809671,.981339,-.097836,.152211,.835402,.982794,-.0950006,.145679,.860081,.984123,-.0920994,.138949,.883757,.984918,-.0878641,.131283,.90685,.985999,-.083939,.123464,.928786,.987151,-.0791234,.115324,.94983,.987827,-.0739332,.106854,.96962,.988806,-.0688088,.0982691,.98861,.989588,-.0628962,.0893456,1.00667,.990438,-.0573146,.0805392,1.02344,.991506,-.0509433,.0713725,1.03933,.992492,-.0448724,.0623732,1.05378,.993663,-.0383497,.0530838,1.06747,.994956,-.0319593,.0439512,1.08007,.99634,-.025401,.0347803,1.09182,.99761,-.0189687,.0257954,1.1025,.99863,-.0124441,.0169893,1.11247,.99947,-.00614003,.00829498,1.12151,1.00008,216624e-9,-146107e-9,1.12993,.950129,-434955e-11,.217413,190081e-10,.950264,-10957e-8,.217444,47884e-8,.9503,-438299e-9,.217451,.00191543,.950246,-986124e-9,.21744,.00430951,.950246,-.00175311,.21744,.00766137,.950245,-.00273923,.21744,.011971,.950253,-.00394453,.217441,.0172385,.950258,-.00536897,.217442,.0234641,.950267,-.00701262,.217444,.030648,.950277,-.00887551,.217446,.038791,.950284,-.0109576,.217446,.0478931,.950312,-.0132591,.217451,.0579568,.950334,-.01578,.217454,.0689821,.950378,-.0185204,.217462,.0809714,.950417,-.0214803,.217467,.0939265,.950488,-.0246594,.217479,.10785,.950534,-.0280565,.217483,.122743,.950633,-.0316685,.217498,.138611,.950698,-.0354787,.217499,.155442,.950844,-.0394003,.217507,.173208,.950999,-.0426812,.217419,.191605,.951221,-.0461302,.217317,.21084,.951412,-.0502131,.217238,.230945,.951623,-.0549183,.21722,.251745,.951867,-.0604493,.217306,.273001,.952069,-.0665189,.217466,.294874,.952459,-.0709179,.217266,.318732,.952996,-.0746112,.216891,.34318,.953425,-.0789252,.216503,.36849,.953885,-.0833293,.216042,.394373,.954617,-.087371,.215469,.420505,.955429,-.0914054,.214802,.446907,.956068,-.0961671,.214146,.473522,.957094,-.10048,.213286,.50052,.958372,-.103248,.211796,.528715,.959654,-.106033,.21016,.557065,.961305,-.108384,.208149,.585286,.962785,-.111122,.206024,.613334,.964848,-.112981,.203442,.641334,.966498,-.113717,.19996,.669955,.968678,-.114121,.196105,.698094,.970489,-.114524,.191906,.725643,.972903,-.113792,.186963,.752856,.974701,-.112406,.181343,.780013,.976718,-.110685,.175185,.806268,.978905,-.108468,.168535,.832073,.980267,-.105061,.161106,.857149,.981967,-.101675,.153387,.881145,.983063,-.0974492,.145199,.904255,.984432,-.0925815,.136527,.926686,.985734,-.0877983,.127584,.947901,.986228,-.081884,.118125,.968111,.98719,-.0761208,.108594,.98719,.988228,-.0698196,.0989996,1.00559,.989046,-.0632739,.0890074,1.02246,.990242,-.056522,.0790832,1.03841,.991252,-.0495272,.0689182,1.05347,.992542,-.0425373,.0588592,1.06724,.994096,-.0353198,.0486833,1.08009,.995593,-.028235,.0385977,1.09177,.99711,-.0209511,.0286457,1.10274,.998263,-.0139289,.0188497,1.11262,.999254,-.0067359,.009208,1.12191,.999967,141846e-9,-657764e-10,1.13024,.935608,-474692e-11,.236466,187817e-10,.93996,-11971e-8,.237568,473646e-9,.939959,-478845e-9,.237567,.0018946,.939954,-.0010774,.237566,.00426284,.939956,-.00191538,.237566,.00757842,.939954,-.00299277,.237566,.0118413,.93996,-.00430961,.237567,.0170518,.939969,-.00586589,.237569,.02321,.939982,-.00766166,.237572,.0303164,.939987,-.00969686,.237572,.0383711,.939997,-.0119715,.237574,.0473751,.940031,-.0144858,.237581,.0573298,.940073,-.0172399,.237589,.0682366,.94012,-.0202335,.237598,.080097,.940162,-.0234663,.237604,.0929116,.940237,-.0269387,.237615,.106686,.940328,-.0306489,.237632,.121421,.940419,-.0345917,.237645,.137115,.940522,-.0387481,.237654,.153766,.940702,-.0429906,.237661,.17133,.940871,-.0465089,.237561,.189502,.941103,-.050531,.23748,.208616,.941369,-.0550657,.237423,.228595,.941641,-.0601337,.237399,.249287,.941903,-.0658804,.237443,.270467,.942224,-.0722674,.237597,.292024,.942633,-.0771788,.237419,.315272,.943172,-.0815623,.237068,.339579,.943691,-.0863973,.236682,.364717,.944382,-.0911536,.236213,.390435,.945392,-.0952967,.235562,.416425,.946185,-.0998948,.234832,.442772,.947212,-.104796,.234114,.469347,.948778,-.10928,.233222,.496162,.950149,-.113081,.231845,.523978,.951989,-.115893,.230005,.552295,.953921,-.11846,.227862,.580569,.955624,-.12115,.225439,.608698,.958234,-.123373,.222635,.636696,.960593,-.124519,.219093,.665208,.963201,-.124736,.214749,.693557,.965642,-.125012,.210059,.721334,.968765,-.124661,.204935,.748613,.971753,-.122996,.198661,.776224,.973751,-.120998,.191823,.802461,.976709,-.118583,.184359,.828399,.977956,-.115102,.176437,.853693,.979672,-.111077,.167681,.877962,.981816,-.10688,.158872,.901564,.98238,-.101469,.149398,.924057,.983964,-.0960013,.139436,.945751,.984933,-.0899626,.12943,.966272,.985694,-.0832973,.11894,.985741,.986822,-.0767082,.108349,1.00407,.987725,-.0693614,.0976026,1.02154,.98877,-.06211,.086652,1.03757,.990129,-.0544143,.0756182,1.05296,.991337,-.046744,.0645753,1.06683,.992978,-.0387931,.0534683,1.0798,.994676,-.030973,.0424137,1.09181,.99645,-.0230311,.0314035,1.10286,.997967,-.0152065,.0206869,1.11291,.99922,-.00744837,.010155,1.12237,1.00002,240209e-9,-752767e-10,1.13089,.922948,-515351e-11,.255626,186069e-10,.928785,-129623e-9,.257244,468009e-9,.928761,-51849e-8,.257237,.00187202,.928751,-.0011666,.257235,.00421204,.928751,-.00207395,.257234,.0074881,.928754,-.00324055,.257235,.0117002,.92876,-.00466639,.257236,.0168486,.928763,-.00635149,.257237,.0229334,.928774,-.00829584,.257239,.029955,.928791,-.0104995,.257243,.0379139,.928804,-.0129623,.257245,.0468108,.928847,-.0156846,.257255,.0566473,.92889,-.0186661,.257263,.0674246,.928924,-.0219067,.257268,.0791433,.928989,-.0254066,.257282,.0918076,.92909,-.0291651,.257301,.105419,.92918,-.0331801,.257316,.119978,.92929,-.0374469,.257332,.135491,.929453,-.041939,.257357,.151948,.929586,-.0464612,.257347,.169275,.929858,-.0503426,.257269,.187257,.930125,-.0548409,.257199,.206204,.930403,-.0598063,.257149,.22601,.930726,-.0652437,.257122,.246561,.931098,-.0712376,.257153,.267618,.931396,-.0777506,.257237,.288993,.931947,-.0832374,.257124,.311527,.932579,-.0883955,.25683,.335697,.933194,-.0937037,.256444,.360634,.934013,-.0987292,.255939,.386126,.935307,-.103215,.255282,.412018,.936374,-.108234,.254538,.438292,.93776,-.113234,.253728,.464805,.939599,-.118013,.25275,.491464,.941036,-.122661,.251404,.518751,.94337,-.125477,.249435,.547133,.945318,-.128374,.247113,.575456,.947995,-.130996,.244441,.60372,.950818,-.133438,.241352,.63174,.954378,-.135004,.237849,.659971,.957151,-.135313,.233188,.688478,.960743,-.13521,.228001,.716767,.964352,-.135007,.222249,.744349,.967273,-.133523,.21542,.771786,.969767,-.131155,.208039,.798639,.973195,-.128492,.200076,.824774,.975557,-.125094,.191451,.850222,.977692,-.120578,.18184,.874761,.98026,-.115882,.172102,.898497,.981394,-.110372,.161859,.921636,.982386,-.10415,.15108,.943467,.983783,-.0978128,.140407,.964045,.98422,-.0906171,.129058,.98398,.985447,-.0832921,.117614,1.00276,.986682,-.0754412,.10585,1.02047,.987326,-.0673885,.0940943,1.03678,.988707,-.0592565,.0822093,1.05218,.990185,-.050717,.070192,1.06652,.991866,-.0423486,.0582081,1.07965,.993897,-.0336118,.0460985,1.09188,.995841,-.0252178,.0342737,1.10307,.997605,-.0164893,.0224829,1.11324,.999037,-.00817112,.0110647,1.12262,1.00003,291686e-9,-168673e-9,1.13139,.915304,-552675e-11,.275999,183285e-10,.91668,-139285e-9,.276414,461914e-9,.916664,-55713e-8,.276409,.00184763,.916653,-.00125354,.276406,.00415715,.916651,-.00222851,.276405,.00739053,.916655,-.00348205,.276406,.0115478,.916653,-.00501414,.276405,.0166291,.916667,-.00682478,.276409,.0226346,.91668,-.00891398,.276412,.0295648,.91669,-.0112817,.276413,.0374199,.916727,-.013928,.276422,.0462016,.916759,-.0168528,.276429,.0559101,.916793,-.0200558,.276436,.0665466,.916849,-.0235373,.276448,.0781139,.916964,-.0272973,.276474,.0906156,.917047,-.0313344,.276491,.104051,.917152,-.0356465,.276511,.118424,.917286,-.0402271,.276533,.133736,.917469,-.0450408,.276564,.149978,.917686,-.0497872,.276563,.167057,.917953,-.0540937,.276493,.184846,.918228,-.0590709,.276437,.203614,.918572,-.0644277,.276398,.223212,.918918,-.0702326,.276362,.243584,.919356,-.076484,.276383,.264465,.919842,-.0830808,.276434,.285701,.920451,-.0892972,.276407,.307559,.921113,-.095016,.276128,.331501,.921881,-.100771,.275754,.356207,.923027,-.106029,.275254,.381477,.924364,-.111029,.274595,.40722,.925818,-.116345,.273841,.433385,.92746,-.121424,.272913,.459848,.929167,-.12657,.271837,.486493,.931426,-.131581,.270575,.513432,.934001,-.135038,.268512,.541502,.936296,-.138039,.266135,.569658,.939985,-.140687,.263271,.598375,.943516,-.143247,.260058,.626563,.94782,-.145135,.256138,.654711,.951023,-.145733,.251154,.683285,.955338,-.145554,.245562,.711831,.959629,-.145008,.239265,.739573,.963123,-.144003,.232064,.767027,.966742,-.141289,.224036,.794359,.969991,-.138247,.215305,.820361,.973403,-.134786,.206051,.846548,.975317,-.129966,.195914,.871541,.977647,-.12471,.185184,.895313,.980137,-.119086,.174161,.918398,.981031,-.112297,.162792,.940679,.982037,-.105372,.150952,.961991,.983164,-.097821,.138921,.981913,.983757,-.0897245,.126611,1.00109,.985036,-.0815974,.114228,1.01902,.986289,-.0727725,.101389,1.03604,.987329,-.0639323,.0886476,1.05149,.989193,-.0548109,.0756837,1.06619,.990716,-.045687,.0627581,1.07948,.992769,-.0364315,.0498337,1.09172,.99524,-.0271761,.0370305,1.1033,.997154,-.0179609,.0243959,1.11353,.998845,-.00878063,.0119567,1.12319,1.00002,259038e-9,-108146e-9,1.13177,.903945,-591681e-11,.295126,181226e-10,.903668,-148672e-9,.295037,455367e-9,.903677,-594683e-9,.29504,.00182145,.903673,-.00133805,.295039,.00409831,.903666,-.00237872,.295036,.00728584,.903668,-.00371676,.295037,.0113842,.903679,-.00535212,.29504,.0163936,.903684,-.00728479,.295041,.0223141,.903698,-.00951473,.295044,.0291462,.903718,-.0120419,.295049,.0368904,.903754,-.0148664,.295058,.0455477,.903801,-.017988,.29507,.0551194,.903851,-.0214064,.295082,.0656058,.903921,-.0251219,.295097,.0770109,.904002,-.0291337,.295116,.0893354,.904111,-.033441,.29514,.102583,.904246,-.0380415,.295169,.116755,.904408,-.0429258,.295202,.131853,.904637,-.0480468,.295245,.147869,.904821,-.0529208,.295214,.164658,.905163,-.0577748,.295185,.182274,.905469,-.0631763,.295143,.200828,.905851,-.068917,.295112,.2202,.906322,-.0750861,.295104,.240372,.906761,-.0815855,.295086,.261082,.90735,-.0882138,.295095,.282123,.908087,-.095082,.295139,.303563,.908826,-.101488,.29492,.327028,.909832,-.107577,.294577,.351464,.911393,-.113033,.294115,.376497,.912804,-.118629,.293446,.402115,.914081,-.124232,.292581,.428111,.91637,-.129399,.29166,.454442,.91814,-.134892,.290422,.481024,.921179,-.140069,.289194,.507924,.924544,-.144431,.287421,.535557,.927995,-.147498,.284867,.563984,.931556,-.150197,.281722,.5923,.935777,-.152711,.278207,.620832,.940869,-.154836,.274148,.649069,.945994,-.155912,.269057,.677746,.949634,-.155641,.262799,.706293,.955032,-.154809,.256097,.734278,.95917,-.153678,.248618,.761751,.962931,-.151253,.239794,.789032,.966045,-.147625,.230281,.815422,.96971,-.143964,.220382,.841787,.972747,-.139464,.209846,.867446,.975545,-.133459,.198189,.892004,.978381,-.127424,.186362,.915458,.979935,-.120506,.173964,.937948,.980948,-.11282,.161429,.959732,.982234,-.104941,.148557,.980118,.982767,-.0962905,.135508,.999463,.983544,-.0873625,.122338,1.01756,.984965,-.0783447,.108669,1.03492,.986233,-.0684798,.0949911,1.05087,.987796,-.0590867,.0811386,1.0656,.989885,-.0489145,.0673099,1.0794,.991821,-.0391,.0535665,1.09174,.99448,-.029087,.0397529,1.10341,.996769,-.019114,.0261463,1.11383,.998641,-.00947007,.0128731,1.1237,.999978,446316e-9,-169093e-9,1.13253,.888362,-627064e-11,.312578,178215e-10,.889988,-157791e-9,.313148,448451e-9,.889825,-631076e-9,.313092,.00179356,.88984,-.00141994,.313097,.00403554,.889828,-.0025243,.313092,.00717429,.889831,-.00394421,.313093,.0112099,.889831,-.00567962,.313093,.0161425,.889844,-.00773051,.313096,.0219724,.889858,-.0100968,.3131,.0286999,.889882,-.0127786,.313106,.0363256,.889918,-.0157757,.313116,.0448509,.889967,-.0190878,.313129,.0542758,.89003,-.022715,.313145,.0646032,.890108,-.0266566,.313165,.0758339,.890218,-.0309131,.313193,.0879729,.890351,-.0354819,.313226,.101019,.89051,-.0403613,.313263,.114979,.890672,-.0455385,.313294,.129848,.890882,-.0509444,.313333,.145616,.891189,-.0559657,.313324,.162122,.891457,-.0613123,.313281,.179524,.891856,-.0671488,.313281,.197855,.892312,-.0732732,.313268,.216991,.892819,-.0797865,.313263,.236924,.893369,-.0865269,.313247,.257433,.894045,-.0931592,.313205,.278215,.894884,-.100532,.313276,.299467,.895832,-.107716,.313205,.322276,.897043,-.114099,.312873,.34642,.898515,-.119941,.312331,.371187,.900191,-.126044,.311731,.396656,.90188,-.131808,.310859,.422488,.904359,-.137289,.309857,.448744,.906923,-.142991,.308714,.475239,.910634,-.148253,.307465,.501983,.914502,-.153332,.305774,.529254,.919046,-.156646,.303156,.557709,.923194,-.159612,.299928,.586267,.928858,-.162027,.296245,.614925,.934464,-.164203,.291832,.643187,.939824,-.165602,.286565,.671601,.944582,-.165383,.280073,.700213,.949257,-.164439,.272891,.728432,.954389,-.162953,.264771,.756082,.958595,-.161007,.255927,.78369,.962138,-.157243,.245769,.810769,.966979,-.152872,.235127,.836999,.969566,-.148209,.22347,.862684,.972372,-.142211,.211147,.887847,.975916,-.135458,.198606,.911843,.978026,-.128398,.185498,.934795,.979686,-.120313,.17171,.956787,.980748,-.11166,.158159,.978046,.981622,-.103035,.144399,.997693,.982356,-.0930328,.13001,1.01642,.983308,-.0834627,.115778,1.03366,.985037,-.0732249,.101327,1.05014,.986493,-.0628145,.086554,1.06507,.988484,-.0526556,.0720413,1.07907,.991051,-.0415744,.0571151,1.09189,.993523,-.0314275,.0426643,1.10369,.99628,-.0203603,.0279325,1.11423,.998344,-.0102446,.0138182,1.12421,.999997,42612e-8,-193628e-9,1.1333,.871555,-660007e-11,.329176,174749e-10,.875255,-166579e-9,.330571,441051e-9,.875644,-666394e-9,.330718,.00176441,.875159,-.00149903,.330536,.00396899,.87516,-.00266493,.330536,.007056,.875158,-.00416393,.330535,.0110251,.87516,-.00599598,.330535,.0158764,.875163,-.00816108,.330536,.0216101,.875174,-.0106591,.330538,.0282266,.875199,-.0134899,.330545,.0357266,.875257,-.0166538,.330563,.0441117,.875304,-.0201501,.330575,.0533821,.875373,-.0239785,.330595,.0635395,.875464,-.0281389,.330619,.0745872,.875565,-.0326301,.330645,.0865255,.875691,-.0374516,.330676,.0993599,.875897,-.0425993,.330733,.113093,.876091,-.0480576,.330776,.127722,.876353,-.0537216,.330826,.143227,.876649,-.0589807,.330809,.159462,.877034,-.0647865,.330819,.176642,.877443,-.0709789,.330817,.194702,.877956,-.0774782,.330832,.213577,.878499,-.0843175,.330822,.233246,.879144,-.0912714,.330804,.253512,.879982,-.0980824,.330766,.274137,.88097,-.105823,.330864,.295209,.882051,-.113671,.330896,.317226,.883397,-.120303,.330545,.341068,.884987,-.12667,.330068,.365613,.886789,-.133118,.329418,.390807,.889311,-.139024,.328683,.416494,.891995,-.144971,.327729,.442618,.895106,-.150747,.326521,.469131,.899527,-.156283,.325229,.495921,.90504,-.161707,.32378,.523162,.909875,-.165661,.32122,.55092,.91561,-.168755,.317942,.579928,.921225,-.171193,.313983,.608539,.927308,-.17319,.309636,.636854,.933077,-.174819,.304262,.66523,.938766,-.175002,.297563,.693609,.943667,-.173946,.289613,.722157,.949033,-.172221,.281227,.750021,.953765,-.169869,.271545,.777466,.95804,-.166578,.261034,.804853,.962302,-.161761,.249434,.831569,.966544,-.156636,.237484,.857779,.969372,-.150784,.224395,.883051,.972486,-.143672,.210786,.907864,.975853,-.135772,.196556,.931223,.977975,-.127942,.182307,.954061,.979122,-.118347,.167607,.97531,.980719,-.109112,.152739,.995666,.981223,-.0991789,.137932,1.01475,.98216,-.0883553,.122692,1.03253,.983379,-.0780825,.107493,1.04917,.985434,-.0665646,.0917791,1.06464,.987332,-.0557714,.0764949,1.07896,.990004,-.0442805,.060721,1.09199,.992975,-.0331676,.0452284,1.10393,.995811,-.0219547,.0297934,1.11476,.9982,-.0107613,.0146415,1.12484,1.00002,248678e-9,-14555e-8,1.13413,.859519,-693595e-11,.347264,171673e-10,.859843,-17503e-8,.347394,433219e-9,.859656,-700076e-9,.347319,.00173277,.859671,-.00157517,.347325,.00389875,.859669,-.00280028,.347324,.00693112,.85967,-.0043754,.347324,.01083,.859665,-.00630049,.347321,.0155954,.859685,-.0085755,.347328,.0212278,.859694,-.0112003,.347329,.0277273,.859718,-.0141747,.347336,.0350946,.85976,-.0174988,.347348,.0433314,.85982,-.0211722,.347366,.0524384,.859892,-.0251941,.347387,.0624168,.860006,-.0295649,.347422,.0732708,.860122,-.0342825,.347453,.0849999,.860282,-.0393462,.347499,.0976102,.860482,-.0447513,.347554,.111104,.860719,-.0504775,.347614,.125479,.860998,-.0563577,.347666,.140703,.861322,-.0619473,.347662,.156681,.861724,-.0681277,.347684,.173597,.862198,-.0746567,.347709,.191371,.862733,-.0815234,.347727,.209976,.863371,-.0886643,.347744,.229351,.86414,-.0957908,.347734,.24934,.865138,-.102912,.34772,.269797,.866182,-.110924,.3478,.290654,.867436,-.119223,.347911,.312074,.869087,-.126197,.347649,.335438,.870859,-.133145,.347222,.359732,.872997,-.139869,.346645,.38467,.875939,-.146089,.345935,.41019,.879012,-.152334,.345012,.436218,.883353,-.15821,.343924,.462641,.888362,-.164097,.342636,.489449,.895026,-.169528,.341351,.516629,.900753,-.174408,.339115,.544109,.906814,-.17751,.335809,.572857,.912855,-.180101,.331597,.601554,.919438,-.182116,.32698,.630198,.925962,-.183494,.321449,.658404,.931734,-.184159,.314595,.686625,.93762,-.18304,.306462,.71531,.943858,-.181323,.297514,.744272,.948662,-.178683,.287447,.771462,.953299,-.175379,.276166,.798593,.957346,-.170395,.263758,.8256,.962565,-.165042,.251019,.852575,.966075,-.158655,.237011,.878316,.969048,-.151707,.222518,.90329,.972423,-.143271,.207848,.927745,.975833,-.134824,.192463,.950859,.977629,-.125444,.1768,.972947,.978995,-.114949,.161033,.993263,.980533,-.104936,.145523,1.01337,.980745,-.0935577,.129799,1.03128,.981814,-.0822956,.113486,1.04825,.983943,-.0710082,.0972925,1.06405,.986141,-.0587931,.0808138,1.0785,.988878,-.0472755,.0644915,1.09204,.992132,-.0349128,.0478128,1.10413,.9953,-.0232407,.031621,1.11527,.998117,-.0112713,.0154935,1.12551,1.00003,339743e-9,-195763e-9,1.13504,.845441,-729126e-11,.364305,169208e-10,.843588,-183164e-9,.363506,425067e-9,.843412,-73253e-8,.36343,.00169999,.843401,-.00164818,.363426,.00382495,.843399,-.00293008,.363425,.00679993,.843401,-.00457822,.363425,.010625,.843394,-.00659249,.363421,.0153002,.843398,-.00897282,.363421,.0208258,.843415,-.0117191,.363426,.0272024,.843438,-.0148312,.363432,.0344305,.843483,-.018309,.363447,.0425116,.84356,-.0221521,.363472,.0514471,.843646,-.0263597,.363499,.061238,.843743,-.0309315,.363527,.0718873,.84388,-.0358658,.363569,.0833969,.844079,-.0411624,.363631,.0957742,.844279,-.0468128,.363688,.109015,.844549,-.0527923,.363761,.123124,.844858,-.0588204,.363817,.138044,.84522,-.0647573,.36383,.153755,.845669,-.0713181,.363879,.170394,.846155,-.0781697,.363908,.187861,.846789,-.0853913,.363969,.206176,.847502,-.0928086,.363999,.225244,.8484,-.10005,.363997,.244926,.849461,-.107615,.364008,.265188,.850562,-.115814,.364055,.28587,.851962,-.124334,.364179,.306926,.854326,-.131995,.364233,.329605,.856295,-.139338,.363856,.35359,.858857,-.146346,.363347,.37831,.862428,-.152994,.362807,.403722,.866203,-.159463,.361963,.429537,.871629,-.165623,.36112,.456,.877365,-.171649,.359917,.482773,.883744,-.177151,.35848,.509705,.890693,-.182381,.356523,.537215,.897278,-.186076,.3533,.565493,.903958,-.188602,.349095,.594293,.910908,-.190755,.344215,.623165,.918117,-.192063,.338606,.651573,.924644,-.192758,.331544,.679869,.931054,-.192238,.323163,.708668,.937303,-.190035,.313529,.737201,.943387,-.187162,.303152,.764977,.948494,-.183876,.29146,.792683,.952546,-.178901,.277917,.819228,.958077,-.173173,.264753,.846559,.962462,-.16645,.25002,.872962,.966569,-.159452,.234873,.898729,.969108,-.15074,.218752,.923126,.973072,-.141523,.202673,.947278,.975452,-.132075,.186326,.969938,.977784,-.121257,.169396,.991325,.97899,-.110182,.153044,1.01123,.979777,-.0989634,.136485,1.0299,.980865,-.0865894,.119343,1.04727,.982432,-.0746115,.102452,1.06341,.984935,-.0621822,.0852423,1.07834,.987776,-.0495694,.0678546,1.092,.99103,-.0372386,.0506917,1.1043,.99474,-.0244353,.0333316,1.11576,.997768,-.0121448,.0164348,1.12617,1.00003,31774e-8,-169504e-9,1.13598,.825551,-756799e-11,.378425,165099e-10,.82664,-190922e-9,.378923,416504e-9,.826323,-763495e-9,.378779,.0016656,.826359,-.00171789,.378795,.00374768,.82636,-.00305402,.378795,.00666259,.826368,-.00477185,.378798,.0104104,.826364,-.00687131,.378795,.0149912,.826368,-.00935232,.378795,.0204054,.826376,-.0122146,.378797,.0266532,.826399,-.0154581,.378803,.0337355,.82646,-.0190825,.378824,.0416537,.826525,-.0230873,.378846,.0504091,.826614,-.0274719,.378876,.0600032,.82674,-.0322355,.378917,.0704393,.826888,-.0373766,.378964,.0817195,.827078,-.0428936,.379024,.0938492,.827318,-.0487778,.379099,.106828,.82764,-.0549935,.379199,.120659,.827926,-.0611058,.379227,.13526,.828325,-.0675054,.379275,.150713,.828801,-.0743455,.379332,.167034,.8294,-.0815523,.379415,.184209,.830094,-.0890779,.379495,.202203,.8309,-.096736,.379555,.220945,.831943,-.104135,.379577,.240306,.833037,-.112106,.379604,.260317,.834278,-.120554,.379668,.2808,.836192,-.129128,.3799,.301654,.838671,-.137541,.380109,.323502,.840939,-.14523,.379809,.347176,.844575,-.15248,.379593,.371706,.848379,-.159607,.37909,.39688,.853616,-.166267,.378617,.422702,.858921,-.172698,.377746,.448919,.865324,-.178823,.376749,.475661,.872207,-.184542,.375363,.502599,.880018,-.189836,.373657,.529914,.88694,-.194294,.370673,.557683,.894779,-.197022,.36662,.586848,.902242,-.199108,.36138,.615831,.909914,-.200398,.355434,.644478,.917088,-.20094,.348173,.672905,.923888,-.200671,.339482,.701327,.930495,-.198773,.32956,.730101,.937247,-.195394,.318363,.758383,.943108,-.191956,.306323,.786539,.948296,-.187227,.292576,.813637,.953472,-.181165,.278234,.840793,.958485,-.174119,.263054,.867712,.962714,-.166564,.246756,.893635,.966185,-.158181,.229945,.919028,.970146,-.148275,.212633,.943413,.973491,-.138157,.195229,.966627,.975741,-.127574,.178048,.988817,.977238,-.11554,.160312,1.00924,.978411,-.10364,.142857,1.02845,.979811,-.0913122,.125317,1.04648,.98116,-.0782558,.107627,1.06284,.983543,-.0655957,.0895862,1.07798,.986789,-.0520411,.0713756,1.092,.990292,-.0389727,.053228,1.10484,.994187,-.025808,.0351945,1.11642,.997499,-.0126071,.0173198,1.12703,.999999,275604e-9,-148602e-9,1.13674,.81075,-78735e-10,.394456,161829e-10,.808692,-198293e-9,.393453,407564e-9,.80846,-792877e-9,.39334,.00162965,.808595,-.00178416,.393407,.00366711,.808597,-.00317182,.393408,.00651934,.808598,-.00495589,.393408,.0101866,.808591,-.00713627,.393403,.0146689,.808592,-.00971285,.393402,.0199667,.80861,-.0126855,.393407,.0260803,.808633,-.0160538,.393413,.0330107,.80868,-.0198175,.393429,.0407589,.808748,-.0239758,.393453,.0493264,.808854,-.0285286,.39349,.0587161,.808992,-.0334748,.39354,.0689304,.809141,-.0388116,.393588,.0799707,.809352,-.0445375,.39366,.0918432,.809608,-.0506427,.393742,.104549,.809915,-.0570708,.393834,.118085,.810253,-.0633526,.393885,.132377,.810687,-.0700966,.393953,.147537,.811233,-.0772274,.394047,.163543,.811865,-.0847629,.394148,.180394,.812648,-.0925663,.394265,.198051,.813583,-.100416,.394363,.216443,.814683,-.108119,.394402,.235502,.815948,-.11644,.394489,.255242,.817278,-.125036,.394542,.275441,.819605,-.133655,.39486,.296094,.822256,-.142682,.395248,.317309,.825349,-.150756,.395241,.340516,.829605,-.158392,.395285,.364819,.83391,-.165801,.394922,.389736,.839808,-.172677,.394691,.415409,.845708,-.179448,.394006,.441546,.853025,-.185746,.393279,.46832,.859666,-.191684,.391655,.495302,.86789,-.197146,.390068,.52262,.875845,-.201904,.38727,.550336,.882634,-.205023,.382688,.578825,.891076,-.207098,.377543,.608103,.900589,-.208474,.371752,.63723,.90791,-.209068,.364016,.665769,.915971,-.208655,.355593,.694428,.923455,-.20729,.345439,.723224,.931514,-.203821,.334099,.751925,.937885,-.19986,.321069,.780249,.943136,-.194993,.306571,.8077,.948818,-.189132,.291556,.83497,.954433,-.181617,.275745,.86188,.959078,-.173595,.258695,.888562,.962705,-.164855,.240825,.914008,.966753,-.155129,.22268,.939145,.970704,-.144241,.204542,.963393,.973367,-.133188,.185927,.985983,.975984,-.121146,.167743,1.00704,.976994,-.108366,.149218,1.02715,.978485,-.0956746,.13131,1.0455,.980074,-.0820733,.112513,1.06221,.98225,-.0684061,.0938323,1.07782,.98553,-.0549503,.0749508,1.09199,.989529,-.0407857,.055848,1.10508,.993536,-.0271978,.0368581,1.11684,.997247,-.0132716,.0181845,1.12789,1,431817e-9,-198809e-9,1.13792,.785886,-812608e-11,.405036,157669e-10,.790388,-205278e-9,.407355,398297e-9,.790145,-820824e-9,.407231,.00159263,.790135,-.00184681,.407226,.00358336,.790119,-.00328316,.407218,.00637039,.790126,-.00512988,.40722,.0099539,.79013,-.00738684,.407221,.0143339,.790135,-.0100538,.407221,.0195107,.790134,-.0131306,.407217,.0254848,.79016,-.0166169,.407224,.0322572,.790197,-.020512,.407236,.0398284,.790273,-.0248157,.407263,.0482014,.790381,-.029527,.407304,.0573777,.790521,-.0346446,.407355,.0673602,.790704,-.0401665,.40742,.0781522,.790925,-.0460896,.407499,.0897582,.791195,-.0524017,.407589,.10218,.791522,-.0590121,.407691,.11541,.791878,-.0654876,.407748,.12939,.792361,-.0725207,.407849,.144237,.792942,-.0799844,.407963,.159924,.79362,-.0877896,.408087,.176425,.794529,-.0958451,.408259,.193733,.795521,-.103827,.408362,.211756,.796778,-.111937,.408482,.230524,.798027,-.120521,.408547,.249967,.799813,-.129242,.408721,.269926,.802387,-.138048,.409148,.290338,.805279,-.147301,.409641,.311193,.809251,-.155895,.410154,.333611,.813733,-.163942,.410297,.357615,.819081,-.171666,.410373,.382339,.825427,-.178905,.410348,.407828,.83172,-.185812,.409486,.434034,.83877,-.192318,.408776,.460493,.845817,-.198249,.407176,.487346,.854664,-.204034,.405719,.514832,.863495,-.208908,.403282,.542401,.871883,-.212765,.399293,.570683,.88065,-.214911,.393803,.599947,.89004,-.216214,.387536,.62932,.898476,-.216745,.379846,.658319,.906738,-.216387,.370625,.687138,.914844,-.215053,.360139,.71601,.923877,-.212007,.348849,.745124,.931925,-.207481,.335639,.773366,.938054,-.202418,.320798,.801636,.943895,-.196507,.304772,.829055,.949468,-.189009,.288033,.856097,.955152,-.180539,.270532,.88301,.959403,-.171437,.251639,.909296,.963309,-.161661,.232563,.934868,.967399,-.150425,.213231,.959662,.972009,-.138659,.194247,.98302,.97433,-.126595,.174718,1.00517,.975823,-.113205,.155518,1.02566,.976371,-.0996096,.136709,1.04418,.978705,-.0860754,.117571,1.06146,.981477,-.0714438,.0980046,1.07777,.984263,-.0572304,.0782181,1.09214,.988423,-.0428875,.0584052,1.10553,.993,-.0282442,.038522,1.11758,.99704,-.0140183,.0190148,1.12864,.999913,369494e-9,-145203e-9,1.13901,.777662,-84153e-10,.423844,154403e-10,.770458,-211714e-9,.419915,38845e-8,.770716,-846888e-9,.420055,.00155386,.770982,-.00190567,.420202,.00349653,.770981,-.00338782,.420201,.00621606,.77098,-.00529338,.4202,.00971274,.770983,-.00762223,.4202,.0139867,.770985,-.0103741,.420198,.0190381,.770996,-.0135489,.4202,.0248677,.771029,-.0171461,.420212,.0314764,.771052,-.0211647,.420215,.0388648,.771131,-.0256048,.420245,.047036,.771235,-.0304647,.420284,.0559911,.771383,-.0357436,.420341,.0657346,.771591,-.0414392,.420423,.0762694,.771819,-.0475462,.420506,.0875984,.772123,-.0540506,.420617,.099727,.772464,-.060797,.42072,.112637,.772855,-.0675393,.420799,.126313,.773317,-.0748323,.420893,.140824,.773981,-.0825681,.421058,.15617,.774746,-.0906307,.421226,.172322,.77566,-.0988982,.421397,.189253,.776837,-.106994,.421569,.206912,.778097,-.115528,.421704,.225359,.779588,-.124317,.421849,.24447,.781574,-.133139,.422097,.264156,.784451,-.142179,.422615,.284318,.787682,-.15165,.423269,.304902,.792433,-.160771,.424396,.3265,.797359,-.169166,.424772,.35014,.803986,-.177149,.425475,.374768,.809504,-.184745,.424996,.399928,.815885,-.19173,.424247,.425796,.823513,-.198525,.423515,.452287,.832549,-.204709,.422787,.479321,.841653,-.210447,.421187,.506718,.850401,-.215501,.418519,.53432,.859854,-.219752,.414715,.56242,.869364,-.222305,.409462,.591558,.878837,-.223744,.402926,.621074,.888636,-.224065,.395043,.650538,.898132,-.223742,.38564,.679538,.907181,-.222308,.375378,.708674,.915621,-.219837,.363212,.737714,.9239,-.215233,.349313,.767014,.931644,-.209592,.334162,.795133,.938887,-.203644,.317943,.823228,.945282,-.196349,.300581,.850822,.950758,-.18742,.282195,.877594,.956146,-.177879,.262481,.904564,.960355,-.167643,.242487,.930741,.965256,-.156671,.222668,.955868,.968029,-.144123,.201907,.979869,.97251,-.131305,.18202,1.00291,.974925,-.118335,.161909,1.02392,.975402,-.103714,.142129,1.0433,.976987,-.089415,.122447,1.06089,.979677,-.0748858,.102248,1.07713,.983184,-.0596086,.0814851,1.09218,.987466,-.0447671,.0609484,1.10585,.992348,-.0295217,.0401835,1.11829,.996674,-.0143917,.0198163,1.12966,1.00003,321364e-9,-149983e-9,1.1402,.757901,-869074e-11,.436176,151011e-10,.751195,-217848e-9,.432317,378533e-9,.751178,-871373e-9,.432307,.0015141,.751195,-.00196061,.432317,.0034068,.751198,-.00348552,.432318,.00605659,.751195,-.00544599,.432315,.00946353,.751207,-.00784203,.43232,.013628,.751213,-.0106732,.43232,.0185499,.751221,-.0139393,.432319,.0242302,.751244,-.0176398,.432325,.0306694,.7513,-.0217743,.432348,.0378698,.751358,-.0263412,.432367,.0458321,.751458,-.0313396,.432404,.0545587,.751608,-.0367682,.432464,.0640543,.7518,-.0426246,.43254,.0743222,.752065,-.0489031,.432645,.0853668,.752376,-.0555828,.432762,.0971911,.752715,-.0623861,.432859,.109768,.753137,-.069415,.432958,.123126,.753676,-.0770039,.433099,.137308,.754345,-.084971,.433272,.15229,.755235,-.0932681,.433504,.168075,.756186,-.10171,.433693,.184625,.757363,-.110019,.433857,.201897,.75884,-.11887,.434102,.220014,.760467,-.127881,.434306,.238778,.762969,-.136766,.434751,.258172,.765823,-.14612,.43529,.278062,.769676,-.15566,.436236,.298437,.774909,-.165177,.437754,.319532,.77994,-.17402,.438343,.342505,.785757,-.182201,.438609,.366693,.792487,-.190104,.438762,.391668,.80038,-.197438,.438795,.417494,.808494,-.204365,.438226,.443933,.817695,-.210714,.437283,.470929,.828111,-.216651,.436087,.498569,.837901,-.221804,.433717,.526165,.847813,-.226318,.430133,.554155,.858314,-.229297,.425213,.582822,.868891,-.230999,.418576,.612847,.878941,-.231155,.410405,.642445,.888809,-.230935,.400544,.672024,.898089,-.229343,.389613,.701366,.908081,-.226886,.377197,.730763,.916819,-.222676,.363397,.759642,.924968,-.216835,.347437,.788775,.932906,-.210245,.32995,.817135,.940025,-.202992,.312262,.844912,.946101,-.19436,.293313,.872164,.952835,-.184125,.273638,.899443,.957347,-.173657,.252385,.926389,.961434,-.162204,.231038,.951947,.965522,-.14979,.209834,.976751,.969412,-.136307,.188821,1.00022,.973902,-.122527,.168013,1.02229,.974045,-.108213,.147634,1.04199,.975775,-.0927397,.12705,1.06019,.978383,-.0778212,.106309,1.07711,.98211,-.0621216,.0849279,1.09245,.986517,-.0463847,.0633519,1.10651,.991696,-.0309353,.0419698,1.11903,.996349,-.0150914,.0206272,1.13073,1.00003,442449e-9,-231396e-9,1.14146,.727498,-885074e-11,.441528,145832e-10,.730897,-223525e-9,.443589,368298e-9,.730796,-893996e-9,.443528,.00147303,.730805,-.00201149,.443533,.00331433,.730814,-.00357596,.443538,.00589222,.730815,-.00558734,.443538,.00920678,.730822,-.00804544,.44354,.0132582,.730836,-.0109501,.443545,.0180468,.730848,-.0143008,.443546,.0235732,.730871,-.0180969,.443552,.0298382,.730915,-.022338,.443567,.0368438,.730982,-.0270225,.443591,.044591,.731076,-.0321491,.443627,.0530831,.731245,-.0377166,.443699,.0623243,.73144,-.0437216,.443777,.0723181,.7317,-.0501576,.443881,.0830691,.732034,-.0569942,.444014,.0945809,.732388,-.0638756,.444113,.106825,.732853,-.071203,.444247,.119859,.733473,-.0790076,.444442,.13369,.734195,-.0871937,.444645,.148304,.735069,-.095696,.444877,.163702,.736169,-.10426,.445133,.179861,.73747,-.112853,.44537,.196778,.738991,-.12199,.445651,.214496,.740865,-.131153,.445958,.232913,.743637,-.140245,.446548,.251977,.746797,-.149722,.447246,.271551,.751517,-.159341,.448656,.291774,.756156,-.169106,.449866,.312455,.761519,-.178436,.450919,.334552,.768295,-.186904,.451776,.358491,.776613,-.195117,.452832,.383446,.783966,-.202695,.45249,.408945,.793542,-.20985,.452587,.435364,.803192,-.216403,.451852,.462336,.813892,-.22251,.450708,.48987,.824968,-.227676,.4486,.517697,.835859,-.232443,.445156,.545975,.846825,-.235775,.440351,.574483,.858085,-.237897,.433641,.604246,.868825,-.238074,.425354,.634101,.879638,-.237661,.415383,.664201,.889966,-.236186,.404136,.693918,.899479,-.233599,.390917,.723481,.908769,-.229737,.376352,.75258,.917966,-.223836,.360372,.781764,.926304,-.217067,.342551,.811139,.934626,-.209309,.324238,.839585,.941841,-.20071,.304484,.867044,.94789,-.190602,.283607,.894579,.954196,-.179253,.262205,.921743,.958383,-.167646,.239847,.948026,.963119,-.155073,.218078,.973296,.966941,-.141426,.195899,.998135,.970836,-.126849,.174121,1.02021,.973301,-.112296,.153052,1.04085,.97448,-.0964965,.131733,1.05946,.977045,-.080489,.10997,1.07693,.980751,-.064844,.0881657,1.09254,.985475,-.0481938,.0657987,1.10697,.991089,-.0319185,.0435215,1.12004,.996122,-.0158088,.0214779,1.13173,1.00001,372455e-9,-200295e-9,1.14291,.708622,-907597e-11,.45304,141962e-10,.711162,-228911e-9,.454662,358052e-9,.709812,-914446e-9,.453797,.00143034,.709865,-.00205819,.453834,.00321935,.709864,-.00365894,.453833,.00572331,.709855,-.00571692,.453826,.00894278,.709862,-.00823201,.453828,.012878,.709875,-.011204,.453832,.0175295,.709896,-.0146323,.453839,.0228978,.709925,-.0185163,.453847,.0289839,.709974,-.0228551,.453866,.0357894,.710045,-.0276473,.453892,.0433161,.710133,-.032891,.453924,.0515665,.710292,-.0385851,.453992,.0605458,.710485,-.0447254,.45407,.0702574,.710769,-.0513051,.454192,.0807077,.711106,-.0582733,.454329,.091896,.711516,-.0652866,.45446,.103814,.712071,-.0728426,.454653,.116508,.712676,-.0808307,.45484,.129968,.713476,-.0892216,.455096,.144206,.714377,-.0979047,.455346,.159212,.715579,-.106531,.455647,.174973,.716977,-.115492,.455961,.191504,.71862,-.124821,.456315,.208835,.72084,-.134079,.4568,.226869,.723786,-.143427,.457521,.245582,.727464,-.153061,.458475,.264957,.732771,-.162768,.460239,.284948,.736515,-.172627,.460899,.30522,.743519,-.182487,.463225,.326717,.750041,-.191295,.464027,.350113,.758589,-.199746,.465227,.374782,.767703,-.207584,.465877,.400226,.777484,-.214973,.465996,.426442,.788792,-.221796,.466019,.453688,.800194,-.228038,.465083,.481246,.811234,-.233346,.462506,.509086,.822859,-.238073,.459257,.537338,.835082,-.241764,.454863,.566108,.846332,-.244241,.448163,.595126,.858355,-.244736,.439709,.625574,.87034,-.244278,.429837,.65617,.881027,-.24255,.418002,.686029,.891007,-.239912,.404325,.716039,.900874,-.236133,.389222,.745518,.911072,-.230672,.373269,.775026,.920359,-.22356,.355083,.804521,.928604,-.215591,.335533,.834045,.937175,-.206503,.315278,.861612,.942825,-.196684,.293653,.889131,.949805,-.185116,.271503,.916853,.955535,-.172703,.248821,.943541,.959843,-.159978,.225591,.970132,.964393,-.146375,.202719,.994709,.968008,-.131269,.179928,1.0186,.971013,-.11569,.158007,1.03928,.973334,-.1003,.13624,1.05887,.975775,-.0833352,.1138,1.07652,.979579,-.0668981,.0913141,1.09297,.984323,-.0500902,.0683051,1.10734,.990351,-.0332377,.0451771,1.12084,.995823,-.0161491,.0221705,1.13296,1.0001,234083e-9,-108712e-9,1.14441,.683895,-924677e-11,.46015,137429e-10,.68833,-233383e-9,.463134,346865e-9,.688368,-933547e-9,.463159,.00138748,.688367,-.00210049,.463159,.00312187,.688369,-.00373415,.463159,.00555004,.688377,-.00583449,.463163,.00867216,.688386,-.00840128,.463166,.0124884,.688398,-.0114343,.463169,.0169993,.688418,-.0149329,.463175,.0222054,.688453,-.0188964,.463188,.028108,.688515,-.0233239,.463214,.0347085,.68857,-.0282136,.463231,.0420091,.688679,-.033564,.463276,.0500132,.688854,-.0393733,.463356,.0587255,.689038,-.0456354,.46343,.0681476,.689321,-.0523433,.463553,.0782897,.689662,-.059412,.463693,.0891501,.690188,-.0665736,.4639,.100735,.690755,-.0743106,.464107,.113074,.691405,-.0824722,.464329,.126161,.692198,-.0910484,.464585,.140007,.693196,-.0998778,.464893,.154612,.69454,-.108651,.465285,.169984,.695921,-.117855,.465596,.186106,.697749,-.12734,.466056,.203034,.700375,-.136714,.466771,.220703,.703395,-.146386,.467579,.239062,.707904,-.156096,.469067,.258188,.711673,-.165904,.469851,.277759,.717489,-.175812,.471815,.297935,.724051,-.185931,.47389,.318916,.731965,-.195238,.47587,.341591,.741151,-.204021,.477523,.366062,.751416,-.212113,.478881,.391396,.761848,-.21979,.479226,.417599,.771886,-.2267,.478495,.444401,.783998,-.232991,.477622,.472084,.796523,-.238645,.475833,.500193,.808851,-.243396,.472568,.52865,.821191,-.247226,.467857,.557362,.834261,-.250102,.461871,.586768,.846762,-.251056,.453543,.617085,.859867,-.250604,.443494,.647659,.871948,-.248783,.431711,.678119,.882967,-.245855,.417911,.708399,.892826,-.242168,.401993,.738256,.90332,-.237062,.385371,.767999,.913633,-.22997,.366837,.798191,.922774,-.221687,.346372,.827756,.931371,-.212345,.325682,.856425,.938929,-.20206,.303665,.884299,.944821,-.190981,.280786,.912023,.951792,-.178065,.2573,.939669,.957712,-.164634,.233448,.96655,.961912,-.150863,.209504,.992366,.966382,-.13577,.18597,1.01633,.969588,-.119593,.162905,1.03843,.971777,-.103203,.14053,1.05841,.97433,-.0865888,.117909,1.07632,.978686,-.0690829,.0944101,1.09326,.983281,-.0516568,.0705671,1.10796,.989562,-.034558,.0468592,1.12182,.995465,-.0167808,.0229846,1.1342,.999991,373016e-9,-235606e-9,1.1459,.662251,-939016e-11,.468575,132714e-10,.666634,-237624e-9,.471675,335842e-9,.666411,-950385e-9,.471516,.00134321,.666399,-.00213833,.471509,.00302221,.666386,-.0038014,.471499,.00537283,.666405,-.00593958,.471511,.00839533,.666406,-.00855253,.471508,.0120898,.666428,-.0116401,.471519,.0164569,.666444,-.0152015,.471522,.0214971,.66649,-.0192362,.471543,.027212,.666537,-.0237428,.471558,.033603,.666617,-.0287198,.471591,.0406728,.666718,-.0341647,.471631,.0484238,.666889,-.0400759,.47171,.0568621,.667104,-.0464479,.471805,.0659915,.667374,-.0532677,.471923,.0758178,.667772,-.0603805,.472098,.0863425,.668371,-.0677392,.472363,.0975917,.668971,-.0756028,.472596,.109567,.669696,-.0839293,.472869,.122272,.670481,-.0926683,.473126,.135718,.6715,-.1016,.473442,.149914,.672911,-.110566,.47389,.164882,.674512,-.119984,.474354,.180602,.67651,-.129574,.474922,.19711,.679292,-.139106,.475764,.214371,.682798,-.148993,.476886,.232405,.686955,-.158737,.478179,.251153,.691406,-.168754,.479432,.270436,.697438,-.178703,.481481,.290374,.704761,-.188955,.484143,.311044,.713599,-.198814,.487007,.333003,.723194,-.207869,.488962,.357144,.732601,-.216189,.489815,.382169,.744193,-.22398,.490888,.408227,.754907,-.231156,.490355,.434928,.767403,-.23747,.489548,.462599,.78107,-.243503,.488274,.490908,.793893,-.248114,.484843,.519421,.807296,-.25222,.4803,.548561,.820529,-.255265,.474097,.577772,.833716,-.256741,.466041,.607782,.848403,-.25637,.456547,.638807,.860755,-.254804,.443946,.670058,.874012,-.251834,.430852,.700749,.885619,-.247867,.414903,.731446,.896069,-.242634,.397276,.761191,.906266,-.236093,.378535,.791053,.916759,-.227543,.358038,.821298,.92523,-.21783,.335705,.850747,.93436,-.207534,.313797,.879258,.941631,-.195983,.289671,.907734,.947564,-.183567,.265319,.935206,.953681,-.169345,.240815,.962739,.960008,-.154909,.216119,.989227,.964145,-.140161,.192096,1.01465,.968171,-.123411,.167855,1.03737,.969859,-.106525,.144817,1.05767,.972666,-.0891023,.12149,1.0761,.977055,-.0718094,.0975306,1.09336,.982527,-.0534213,.0730217,1.10878,.989001,-.0355579,.0483366,1.12285,.99512,-.0176383,.023938,1.13548,1.00007,368831e-9,-211581e-9,1.14744,.651047,-960845e-11,.484101,12922e-9,.644145,-241347e-9,.478968,324578e-9,.64396,-965142e-9,.478831,.00129798,.64396,-.00217154,.47883,.00292046,.643968,-.00386049,.478835,.00519202,.643974,-.00603186,.478838,.0081128,.643977,-.0086854,.478836,.011683,.643982,-.0118207,.478834,.0159031,.644024,-.0154374,.478856,.0207743,.644059,-.0195343,.478868,.0262975,.644122,-.0241103,.478896,.0324747,.644207,-.0291638,.478933,.039309,.64432,-.0346919,.478981,.0468029,.644481,-.0406919,.479053,.0549614,.644722,-.047159,.479169,.0637909,.645013,-.0540748,.479302,.0732974,.645503,-.0612001,.479541,.0834898,.646117,-.0687303,.479829,.0943873,.646707,-.0767846,.480061,.105991,.647431,-.0852465,.480343,.11831,.64831,-.0940719,.48066,.131348,.649486,-.103056,.481083,.14514,.650864,-.112261,.481528,.159676,.652604,-.121852,.482102,.174979,.654825,-.131505,.482813,.191079,.657876,-.141189,.483876,.207927,.661339,-.151239,.48499,.225586,.665463,-.161091,.486279,.243947,.670542,-.171235,.487968,.262957,.677361,-.181347,.49053,.282781,.685672,-.191679,.493862,.303311,.694551,-.201781,.49699,.324607,.703753,-.211164,.498884,.347916,.713703,-.219675,.500086,.372628,.725911,-.227836,.501554,.398694,.73862,-.23533,.502193,.425529,.752118,-.241786,.501811,.453209,.76579,-.247865,.500185,.481381,.779568,-.252696,.497159,.51011,.793991,-.256802,.492765,.539322,.808182,-.259942,.486827,.569078,.821698,-.261703,.478386,.598818,.836009,-.262006,.468772,.629762,.849824,-.260333,.456352,.661366,.863888,-.257398,.442533,.69295,.876585,-.253264,.426573,.723608,.888665,-.248026,.408964,.754378,.899537,-.241487,.389677,.784761,.9094,-.233463,.368516,.814688,.920166,-.223397,.346624,.845009,.928899,-.21255,.322717,.874431,.937156,-.200869,.298698,.902922,.943861,-.188387,.273491,.931356,.949557,-.174341,.247866,.958854,.955862,-.158994,.222496,.986098,.961721,-.143664,.197522,1.01229,.965976,-.127412,.17302,1.03571,.968652,-.109798,.148954,1.05699,.971084,-.0916787,.125044,1.07587,.975584,-.0739634,.100577,1.09372,.98122,-.055322,.0753666,1.10948,.988253,-.0366825,.0498899,1.12394,.99482,-.0180389,.024611,1.13694,1.00001,229839e-9,-188283e-9,1.14919,.613867,-964198e-11,.479449,123452e-10,.621485,-244534e-9,.485399,313091e-9,.621429,-978202e-9,.485353,.00125245,.62112,-.00220004,.485114,.00281687,.621119,-.0039111,.485112,.00500783,.621122,-.00611091,.485112,.00782498,.621133,-.00879922,.485117,.0112687,.621152,-.0119756,.485125,.0153394,.621183,-.0156396,.485139,.0200382,.621227,-.0197898,.485158,.0253663,.621298,-.0244253,.485192,.0313261,.621388,-.0295441,.485233,.0379204,.621507,-.0351432,.485286,.0451523,.621693,-.0412198,.485378,.0530277,.621933,-.0477673,.485495,.0615522,.622232,-.0547574,.485635,.0707316,.622809,-.0619417,.485943,.0805883,.623407,-.069625,.486232,.0911267,.62406,-.077796,.486516,.102354,.624835,-.0863731,.486838,.114279,.625758,-.095251,.487188,.126902,.627043,-.104299,.487695,.140285,.628438,-.113724,.488163,.154397,.630325,-.123417,.488858,.169267,.632801,-.133137,.489754,.184941,.635784,-.143052,.490815,.20136,.639406,-.153132,.492048,.218643,.643872,-.163143,.49363,.236615,.6499,-.17333,.496009,.255449,.657201,-.183622,.498994,.275006,.666221,-.194019,.502888,.295354,.674419,-.204192,.505459,.316244,.683729,-.21406,.507771,.33849,.695584,-.222854,.510245,.363166,.708583,-.231315,.512293,.389071,.721233,-.238911,.512747,.415737,.735134,-.245657,.512482,.443331,.750179,-.251879,.511526,.471891,.765073,-.256911,.508935,.500892,.779794,-.261144,.504341,.530294,.794801,-.264316,.498515,.560144,.810339,-.266276,.491015,.590213,.824818,-.266981,.481126,.620865,.839375,-.265778,.468685,.652687,.853043,-.262748,.453925,.684759,.867335,-.258474,.437912,.716209,.88037,-.253187,.419648,.747508,.891711,-.246476,.39982,.77797,.902896,-.238735,.37879,.808586,.913601,-.22885,.355891,.838843,.923019,-.217656,.331773,.869014,.933432,-.205539,.307356,.898512,.939691,-.192595,.281321,.9269,.946938,-.178945,.255441,.955297,.952372,-.163587,.229013,.983231,.95909,-.147214,.203179,1.00971,.963675,-.13064,.17792,1.03438,.968247,-.113121,.152898,1.05625,.97001,-.0945824,.128712,1.07598,.974458,-.0755648,.103349,1.094,.980168,-.0571998,.0776731,1.1104,.987295,-.0377994,.0514445,1.12491,.994432,-.0186417,.025429,1.13851,.999975,542714e-9,-282356e-9,1.15108,.592656,-980249e-11,.486018,119532e-10,.598467,-247275e-9,.490781,301531e-9,.597934,-988317e-9,.490343,.00120517,.597903,-.00222366,.490319,.0027116,.597913,-.00395315,.490327,.00482077,.597919,-.00617653,.490329,.00753264,.597936,-.00889375,.490339,.0108478,.597956,-.0121043,.490347,.0147668,.597992,-.0158073,.490365,.0192905,.598032,-.0200017,.490382,.0244204,.598109,-.0246865,.49042,.0301593,.598215,-.0298594,.490474,.03651,.59833,-.0355167,.490524,.0434757,.598525,-.0416559,.490624,.0510629,.598778,-.0482692,.490753,.0592781,.599135,-.0553114,.49094,.0681304,.599802,-.062542,.491328,.0776467,.600361,-.0703638,.491598,.0878184,.60101,-.0786256,.491882,.0986573,.601811,-.0872962,.492232,.11018,.602861,-.0962284,.492684,.1224,.604167,-.10538,.493213,.135354,.605693,-.114896,.493799,.149034,.607682,-.124654,.494576,.163469,.610672,-.13456,.4959,.178747,.613313,-.144581,.496713,.194723,.617603,-.154703,.498499,.211617,.622174,-.16489,.500188,.229183,.628855,-.175164,.503072,.247786,.636963,-.185565,.506798,.267116,.644866,-.195911,.509719,.28702,.653741,-.206104,.512776,.307763,.664942,-.216447,.516812,.329631,.67633,-.22552,.519181,.353515,.690012,-.234316,.521681,.379226,.704243,-.242032,.523129,.405901,.719396,-.249172,.523768,.433585,.734471,-.255543,.522541,.462085,.750539,-.260697,.520217,.491233,.766365,-.26501,.516293,.521094,.781677,-.268409,.509708,.551014,.797132,-.270399,.501944,.581463,.812655,-.271247,.492025,.612402,.828592,-.270708,.480424,.643798,.844044,-.268085,.465955,.67682,.857305,-.263459,.448425,.708496,.87114,-.258151,.430243,.74046,.884936,-.251171,.410578,.771583,.895772,-.243305,.38862,.802234,.906961,-.234037,.365214,.833179,.917775,-.222714,.34116,.86353,.927883,-.210175,.31572,.893557,.936617,-.196925,.289159,.922976,.943384,-.182788,.261996,.951606,.949713,-.167965,.235324,.979958,.955818,-.151109,.208408,1.00765,.961344,-.133834,.182591,1.03329,.965469,-.115987,.156958,1.0557,.968693,-.09746,.132239,1.07583,.973165,-.0778514,.106195,1.09451,.979387,-.0585067,.0797669,1.11137,.98671,-.0390409,.0530263,1.12643,.994093,-.019408,.0263163,1.14016,1.00002,540029e-9,-194487e-9,1.15299,.574483,-989066e-11,.494533,114896e-10,.574478,-249127e-9,.494528,289403e-9,.574607,-996811e-9,.494637,.00115797,.574396,-.00224241,.494458,.00260498,.574377,-.00398632,.49444,.00463102,.574386,-.00622836,.494445,.00723623,.574401,-.0089683,.494453,.010421,.574419,-.0122056,.49446,.0141859,.574459,-.0159396,.494481,.0185322,.574525,-.0201692,.49452,.0234617,.574587,-.0248924,.494547,.0289762,.574697,-.0301074,.494604,.0350797,.574853,-.0358114,.494688,.0417767,.575027,-.041999,.494772,.0490718,.575294,-.0486618,.494915,.0569728,.575733,-.0557148,.495173,.0654955,.576356,-.0630489,.495537,.0746612,.576944,-.0709285,.495836,.0844615,.57765,-.0792723,.496177,.0949142,.578491,-.0880167,.496563,.10603,.579639,-.0969462,.497096,.117841,.580989,-.10622,.497684,.130367,.582587,-.115861,.498337,.143609,.584951,-.125605,.499414,.157625,.587602,-.135608,.500518,.172413,.59076,-.145742,.501767,.187999,.594992,-.155934,.503542,.20445,.600656,-.166303,.506135,.221764,.607816,-.176681,.509542,.24002,.61522,-.187071,.51263,.258992,.623702,-.197465,.516021,.278773,.634192,-.207816,.520422,.299377,.644936,-.218183,.524073,.320802,.657888,-.2278,.528049,.34384,.670666,-.236747,.52986,.36916,.685626,-.24484,.531892,.395867,.701304,-.252071,.532727,.423488,.717727,-.258714,.532146,.452201,.733914,-.264211,.529883,.481579,.750529,-.26859,.5259,.511558,.76747,-.272046,.51999,.542042,.785189,-.274225,.513083,.572799,.800954,-.275189,.502936,.603816,.816962,-.274946,.490921,.635461,.83336,-.272695,.47684,.6676,.848143,-.268223,.459405,.70051,.861818,-.262768,.440319,.732902,.876828,-.255872,.420123,.765084,.889312,-.247703,.398379,.796391,.900412,-.238381,.374496,.827333,.912251,-.227783,.349874,.858385,.921792,-.214832,.323181,.888652,.931273,-.200949,.296624,.917763,.940295,-.186537,.269211,.947878,.946812,-.171538,.241447,.977016,.953588,-.155254,.213829,1.00501,.958841,-.137156,.186807,1.03179,.963746,-.118699,.160706,1.05502,.966468,-.0998358,.135504,1.07568,.971178,-.0805186,.109131,1.09479,.97831,-.0599348,.0818293,1.1123,.985886,-.0399661,.0545872,1.12771,.994021,-.0198682,.0269405,1.14186,1.00009,271022e-9,-12989e-8,1.15514,.538716,-990918e-11,.486732,109675e-10,.550656,-250642e-9,.497518,277412e-9,.55057,-.00100265,.497441,.00110974,.550903,-.00225672,.497733,.00249779,.550568,-.00401046,.497438,.00443906,.550574,-.00626613,.49744,.00693637,.550591,-.0090226,.497449,.00998921,.550623,-.0122795,.497469,.0135984,.550667,-.0160361,.497495,.0177654,.550724,-.0202908,.497526,.0224915,.550792,-.0250421,.497557,.0277795,.550918,-.0302878,.49763,.0336334,.551058,-.0360241,.497701,.0400573,.551276,-.0422473,.497824,.0470585,.551551,-.0489441,.497977,.0546433,.552074,-.0559596,.498312,.0628367,.552681,-.0633978,.498679,.071646,.553324,-.0713176,.499031,.0810746,.554011,-.0797268,.499365,.091129,.55488,-.0885238,.499779,.101837,.556171,-.0974417,.500444,.113239,.557498,-.106841,.501025,.125316,.559299,-.116533,.501864,.138128,.561647,-.126298,.502967,.151695,.564347,-.136388,.504129,.16604,.567863,-.146576,.505713,.181207,.572569,-.156832,.507953,.197259,.578919,-.167323,.511186,.214258,.585387,-.177712,.514042,.232038,.593134,-.188184,.517484,.250733,.603295,-.198717,.522345,.270454,.613854,-.209177,.526751,.290807,.626092,-.219644,.531595,.312202,.637868,-.229494,.534721,.334435,.652458,-.238718,.538304,.359184,.666985,-.247061,.539875,.385637,.683301,-.254652,.541042,.41328,.69998,-.261376,.540735,.441903,.717824,-.267085,.539139,.471609,.734617,-.271465,.534958,.501446,.753663,-.27528,.53032,.532571,.770512,-.277617,.522134,.563641,.787356,-.278525,.51206,.595067,.806252,-.278512,.50119,.627226,.822061,-.277023,.486791,.659402,.838959,-.273175,.470467,.692874,.85379,-.267238,.450688,.725702,.868268,-.260327,.429741,.75832,.881994,-.251946,.407223,.790189,.893885,-.242432,.383214,.821625,.905118,-.231904,.357297,.853011,.916045,-.219545,.330733,.883773,.927614,-.205378,.303916,.914435,.936005,-.190388,.275941,.944502,.944533,-.1749,.247493,.974439,.950758,-.158588,.218996,1.00286,.957078,-.141027,.191559,1.0304,.962448,-.121507,.164457,1.05466,.964993,-.102068,.138636,1.0761,.970017,-.0822598,.111861,1.09541,.97661,-.062033,.0843438,1.11317,.985073,-.0409832,.0558496,1.12911,.993515,-.020146,.0275331,1.1438,1.00006,27329e-8,-107883e-9,1.15736,.525324,-999341e-11,.498153,105385e-10,.526513,-251605e-9,.499277,265329e-9,.526517,-.00100641,.499282,.0010613,.526588,-.00226466,.499337,.00238823,.526539,-.0040255,.499302,.00424535,.526547,-.00628954,.499306,.00663364,.526561,-.00905628,.499313,.00955337,.526593,-.0123253,.499334,.0130054,.526642,-.0160957,.499365,.0169911,.5267,-.0203661,.499396,.0215122,.526792,-.0251347,.499451,.0265718,.526904,-.0303985,.499511,.0321732,.527079,-.0361554,.499617,.0383231,.527285,-.0423982,.499731,.045026,.527602,-.0491121,.499924,.0522936,.528166,-.0561127,.500306,.0601528,.52879,-.0635988,.5007,.0686059,.529421,-.071581,.501048,.0776518,.530144,-.0799854,.501421,.0873148,.531062,-.0888032,.501884,.0976084,.532374,-.0977643,.50259,.108588,.533828,-.107197,.50329,.120234,.53581,-.116887,.504312,.132602,.538063,-.126755,.505365,.145721,.5409,-.136819,.506668,.159617,.544882,-.147117,.508731,.174369,.550238,-.157446,.511601,.190028,.556038,-.167988,.514431,.206587,.563031,-.178364,.517808,.224046,.571543,-.189007,.521937,.242503,.582255,-.199546,.527415,.261977,.59272,-.210084,.531682,.282162,.605648,-.220448,.537123,.303426,.61785,-.230593,.540664,.325323,.632223,-.240238,.544467,.348993,.648819,-.24887,.547594,.375462,.665825,-.256657,.54912,.403024,.683389,-.263711,.549294,.431773,.701495,-.269666,.547649,.461494,.719197,-.274169,.543786,.491623,.737906,-.278124,.538644,.522994,.756652,-.280632,.531057,.554775,.775279,-.281741,.521972,.586441,.792688,-.281652,.509613,.618596,.811894,-.280345,.496497,.651462,.827938,-.277128,.47968,.684023,.844837,-.271646,.460688,.718024,.859239,-.264397,.438872,.751207,.874088,-.256144,.41577,.784232,.887693,-.246311,.391369,.816191,.899402,-.235497,.365872,.847828,.910973,-.223631,.338618,.87934,.92204,-.209874,.310803,.910325,.930987,-.194265,.281802,.940695,.94,-.178125,.252836,.970958,.948018,-.161479,.224239,1.00078,.955141,-.144038,.195857,1.0288,.960513,-.124915,.168487,1.05371,.963964,-.104284,.141495,1.07596,.968713,-.0838732,.114437,1.09628,.975524,-.0635579,.0863105,1.11448,.98431,-.042291,.0574774,1.13069,.992916,-.0209131,.0284343,1.14568,.999926,743097e-9,-379265e-9,1.15955,.501042,-998428e-11,.498726,100306e-10,.502992,-252112e-9,.500665,253283e-9,.502417,-.00100791,.500092,.00101259,.502965,-.00226919,.500621,.00227978,.502318,-.00403109,.499994,.00405011,.502333,-.00629832,.500005,.00632868,.502362,-.00906907,.500027,.00911446,.502369,-.0123423,.500023,.0124078,.50243,-.0161178,.500066,.016211,.502493,-.0203937,.500103,.0205256,.502592,-.0251684,.500166,.0253548,.502707,-.0304389,.50023,.0307029,.502881,-.0362015,.500335,.0365753,.503124,-.0424507,.500488,.0429798,.503443,-.0491582,.500686,.0499268,.504083,-.0561476,.501155,.0574541,.504668,-.0636846,.501524,.0655408,.505319,-.0716834,.501904,.0742072,.50609,-.0800925,.502321,.0834699,.507122,-.0888425,.502896,.0933603,.508414,-.097855,.503603,.10391,.509955,-.107304,.504416,.115113,.512061,-.116921,.505565,.127054,.514419,-.12689,.506732,.139709,.517529,-.136934,.508338,.153173,.522085,-.147327,.510987,.167528,.526986,-.157612,.513527,.182708,.533122,-.168213,.516717,.198881,.540807,-.178688,.520832,.215986,.550687,-.189511,.52632,.234335,.560567,-.199998,.531009,.253375,.571698,-.210652,.535839,.273499,.584364,-.220917,.541091,.294355,.599066,-.23137,.546875,.316525,.614148,-.241206,.551306,.339671,.631157,-.250379,.555187,.36531,.647919,-.258397,.556595,.392767,.666112,-.265528,.556949,.421397,.686158,-.271827,.556617,.451433,.704838,-.27674,.552975,.482131,.723957,-.280733,.547814,.513458,.74262,-.283359,.53997,.545446,.762009,-.284541,.530422,.57775,.781314,-.284507,.518546,.610434,.799116,-.283309,.504178,.643178,.817604,-.280378,.48843,.676248,.83459,-.275619,.469457,.709698,.850974,-.26856,.447698,.744245,.866747,-.260094,.424791,.777695,.881412,-.249929,.399913,.810392,.8936,-.239137,.37308,.842872,.905943,-.226818,.345705,.874677,.916408,-.213699,.31706,.906257,.927215,-.198428,.288444,.936881,.935625,-.181643,.258329,.96795,.944076,-.164386,.228488,.998216,.951229,-.146339,.199763,1.02689,.958793,-.127709,.172153,1.0535,.963219,-.107244,.144989,1.07646,.967562,-.0857764,.11685,1.09675,.974866,-.0645377,.0880571,1.11576,.983353,-.0431732,.0587352,1.13227,.992503,-.0218356,.0294181,1.1478,1.00003,605203e-9,-231013e-9,1.16207,.482935,-101177e-10,.504695,968142e-11,.477554,-251521e-9,.499071,240676e-9,.477904,-.00100683,.499436,96342e-8,.478368,-.00226636,.499899,.0021687,.477977,-.00402719,.499513,.00385384,.477993,-.00629226,.499525,.0060221,.478011,-.00906011,.499536,.00867289,.478051,-.0123305,.499566,.0118074,.478089,-.016102,.499587,.0154269,.478171,-.0203736,.499645,.0195341,.478254,-.025143,.499692,.0241318,.47839,-.0304071,.499779,.0292247,.478588,-.0361631,.499911,.0348196,.478812,-.0424023,.500046,.0409231,.479208,-.0490724,.500326,.047552,.479841,-.0560722,.500805,.0547377,.480392,-.0636125,.501152,.0624607,.481068,-.0716134,.501561,.0707473,.481898,-.0800062,.502054,.0796118,.483022,-.0886568,.502728,.0890974,.484332,-.0977553,.503479,.0992099,.486126,-.107173,.504546,.10999,.488066,-.11677,.50557,.121476,.490521,-.126725,.506849,.133672,.494232,-.136793,.50911,.146731,.498302,-.147116,.511345,.160577,.503565,-.157446,.514344,.175335,.510902,-.168121,.518824,.191207,.519263,-.178799,.523666,.208058,.528204,-.189407,.528296,.225875,.538854,-.200145,.533724,.244782,.551278,-.210701,.539833,.264753,.565222,-.221303,.546131,.285745,.579403,-.231688,.551496,.307592,.595469,-.241718,.556809,.330582,.610929,-.250992,.559641,.354995,.629433,-.259602,.562379,.382471,.648504,-.267038,.563676,.411126,.66756,-.273388,.562092,.440924,.689143,-.278788,.560807,.472118,.709056,-.282783,.555701,.503774,.729855,-.285836,.548698,.536364,.748954,-.287078,.538544,.56895,.768373,-.287133,.526711,.601991,.78827,-.285839,.512511,.635403,.807465,-.283238,.496323,.668797,.825194,-.27906,.477638,.702584,.842203,-.272286,.456253,.736393,.857749,-.263854,.432412,.77096,.874799,-.253943,.407806,.80489,.887497,-.24237,.38033,.83771,.89966,-.230278,.352446,.870376,.911753,-.21646,.323268,.902256,.923011,-.202071,.294314,.933306,.932375,-.185519,.264104,.965177,.940537,-.167604,.234035,.996303,.948904,-.149068,.20412,1.0261,.955263,-.129539,.175431,1.05304,.960303,-.109932,.148116,1.07617,.965512,-.0880572,.119693,1.09742,.973466,-.0660548,.0901619,1.11721,.98284,-.0439228,.0599875,1.13436,.992216,-.0219588,.0298975,1.15006,.999946,119402e-9,-208547e-10,1.16471,.447827,-100414e-10,.491543,914833e-11,.454778,-251257e-9,.499172,22891e-8,.453519,-.00100342,.497787,914184e-9,.45357,-.00225776,.497847,.00205701,.453578,-.00401371,.497855,.00365705,.45357,-.00627107,.497841,.00571453,.453598,-.00902968,.497864,.00823019,.453627,-.0122888,.497882,.0112049,.453684,-.0160475,.497923,.0146405,.453764,-.0203044,.49798,.0185394,.453866,-.0250576,.498049,.0229054,.453996,-.0303028,.49813,.0277424,.454196,-.0360379,.498267,.0330587,.454457,-.0422521,.498445,.0388613,.454926,-.0488393,.498812,.0451767,.455525,-.0558653,.499272,.0520153,.456074,-.0633772,.499625,.0593754,.456752,-.0713606,.500049,.0672751,.457648,-.07971,.500615,.0757447,.458849,-.0883032,.501399,.0848231,.46029,-.0974095,.502293,.0945135,.462,-.106729,.503301,.104848,.464121,-.116354,.504533,.115884,.466889,-.126214,.506172,.127652,.470744,-.136324,.508667,.14024,.47488,-.146595,.510995,.153673,.480845,-.157027,.514832,.168053,.488262,-.167658,.519506,.183508,.496547,-.178343,.524347,.199948,.506254,-.188916,.52983,.217503,.517961,-.199975,.536357,.236272,.531484,-.210624,.543641,.256096,.545496,-.221227,.550048,.277085,.559497,-.231568,.555076,.298615,.575752,-.241698,.560541,.321547,.591999,-.251172,.564156,.345602,.610654,-.260178,.567607,.371851,.630484,-.268094,.56923,.40076,.651807,-.274661,.569779,.430801,.67239,-.280331,.566791,.461939,.693024,-.284501,.562007,.493854,.715473,-.287852,.555791,.526992,.736323,-.28929,.546345,.560102,.755771,-.289405,.534,.593543,.775424,-.2881,.519114,.627256,.795447,-.285562,.502543,.661464,.815319,-.281416,.484773,.695206,.831769,-.275523,.463445,.729044,.849464,-.267516,.440269,.764069,.866775,-.257584,.415049,.799089,.881252,-.245817,.388049,.831948,.894209,-.233127,.35889,.865526,.906922,-.219579,.329915,.89818,.919686,-.204491,.300441,.930013,.929044,-.188962,.269445,.962061,.938393,-.171079,.238402,.994214,.94661,-.15199,.208204,1.02533,.953095,-.131953,.178653,1.0529,.958644,-.111233,.150684,1.0771,.963925,-.0903098,.122359,1.09855,.971995,-.0680505,.0923342,1.11874,.981658,-.0448512,.0614195,1.13635,.991649,-.0221931,.0303582,1.15238,.999985,393403e-9,-111086e-9,1.16772,.396806,-971563e-11,.457671,842355e-11,.429186,-249421e-9,.495017,21625e-8,.429324,-998052e-9,.495173,865322e-9,.429175,-.00224487,.494999,.00194637,.429129,-.00399041,.494952,.00346004,.429153,-.00623476,.494974,.00540684,.429168,-.0089773,.494983,.00778714,.429207,-.0122175,.495012,.0106022,.429257,-.0159542,.495047,.0138535,.429338,-.0201864,.495106,.0175443,.429431,-.0249104,.495165,.0216774,.429587,-.0301252,.495279,.0262594,.429796,-.0358249,.495432,.0312968,.430065,-.0419972,.495621,.0367985,.430588,-.0485144,.496061,.042798,.43113,-.0555028,.496472,.0492914,.431743,-.0629852,.496904,.0562907,.432448,-.0709256,.497369,.0638056,.433414,-.0791942,.498032,.071885,.434638,-.0877346,.498854,.0805517,.43611,-.0968056,.499812,.0898047,.437859,-.106002,.500891,.0997142,.440017,-.115648,.502198,.110289,.443236,-.125427,.504389,.121644,.44697,-.135492,.506809,.133769,.451689,-.145746,.509858,.146787,.45811,-.156219,.514247,.160793,.465305,-.166834,.518816,.175791,.474085,-.177546,.524331,.191906,.484808,-.188262,.53104,.209199,.49732,-.199346,.538511,.227825,.509693,-.209951,.544554,.247269,.524367,-.220533,.551616,.267978,.539228,-.231082,.557368,.289672,.55644,-.241342,.563782,.31268,.574204,-.250964,.568851,.33651,.593388,-.260306,.57312,.362219,.613358,-.268667,.574916,.390322,.634512,-.275591,.575053,.420478,.65563,-.281328,.572404,.451614,.678265,-.285948,.568893,.484112,.70011,-.289408,.561878,.517348,.723005,-.291328,.55359,.551355,.743744,-.291418,.541099,.585109,.763949,-.290252,.526489,.619487,.784186,-.287648,.509496,.65404,.804304,-.283782,.491484,.688649,.823629,-.278067,.470517,.723133,.84094,-.270588,.44705,.757163,.857852,-.261188,.421252,.792816,.874934,-.249313,.394191,.827248,.888709,-.236492,.365359,.861074,.902589,-.222185,.336016,.894417,.914201,-.207314,.30527,.926825,.925978,-.191146,.274532,.9595,.93512,-.174135,.243393,.991583,.943656,-.155231,.212414,1.02356,.951719,-.134403,.182005,1.05239,.957164,-.113023,.153043,1.07754,.962656,-.0914493,.124186,1.09984,.970695,-.0694179,.0941654,1.12,.980749,-.0466199,.0629671,1.13849,.991205,-.0227032,.0311146,1.15494,.999884,632388e-9,-254483e-9,1.1706,.379821,-957289e-11,.460637,789337e-11,.405188,-247483e-9,.491396,204064e-9,.404796,-989434e-9,.490914,815853e-9,.40483,-.00222607,.490949,.00183559,.40473,-.00395723,.49084,.00326332,.404731,-.00618287,.490836,.00509945,.404768,-.00890258,.490871,.00734463,.404791,-.0121156,.490883,.00999992,.404857,-.0158214,.490938,.0130676,.404943,-.0200178,.491004,.0165503,.405059,-.0247027,.491093,.0204521,.405213,-.0298729,.491205,.0247788,.405399,-.0355226,.491333,.0295373,.405731,-.0416352,.491604,.034741,.406303,-.0480807,.492116,.0404255,.406814,-.0550458,.492506,.0465732,.407404,-.0624652,.492926,.0532058,.408149,-.0702958,.493442,.0603442,.409128,-.0784623,.494136,.0680297,.410408,-.087007,.495054,.0762786,.411813,-.0959639,.495962,.0851046,.413735,-.105075,.497257,.0945878,.416137,-.114646,.498882,.104725,.41934,-.124394,.501132,.11563,.423326,-.134328,.503883,.127325,.428419,-.14458,.50747,.139911,.43484,-.154979,.511964,.153481,.442641,-.165628,.517328,.168114,.452511,-.176365,.524258,.183995,.463473,-.187298,.531248,.200953,.475564,-.198244,.538367,.219176,.488664,-.208938,.545175,.238514,.504073,-.219599,.553227,.259129,.520832,-.230378,.560653,.280997,.538455,-.240703,.567523,.303821,.55709,-.250548,.573287,.327948,.576646,-.259964,.577795,.353362,.596705,-.268721,.580077,.380336,.618053,-.276054,.58018,.4101,.640303,-.282176,.578747,.44161,.662365,-.286931,.574294,.474106,.684542,-.290521,.567035,.507549,.707984,-.292672,.558687,.541853,.730913,-.293189,.547606,.576581,.752948,-.292199,.533471,.61172,.773452,-.289508,.516395,.646339,.794715,-.285716,.497873,.682131,.814251,-.280051,.476845,.716396,.833057,-.272873,.453449,.751503,.84959,-.263982,.427857,.786085,.867022,-.252745,.400335,.821355,.882277,-.239655,.371304,.85646,.895375,-.225386,.340397,.890828,.909347,-.209587,.310005,.923532,.921885,-.193433,.2796,.956419,.932127,-.176135,.247276,.989445,.941869,-.157872,.216186,1.02221,.949735,-.137577,.185602,1.05195,.956617,-.115285,.155767,1.07822,.961974,-.0928418,.126103,1.10149,.96972,-.0700592,.0956758,1.12207,.98012,-.0474671,.0643269,1.1408,.990825,-.0238113,.0320863,1.1577,.999876,381574e-9,-812203e-10,1.17403,.367636,-961342e-11,.469176,753287e-11,.380377,-244772e-9,.485434,191797e-9,.380416,-978857e-9,.485475,767015e-9,.380376,-.00220165,.485435,.00172522,.380419,-.00391408,.485487,.00306734,.380438,-.00611549,.485505,.00479332,.380462,-.00880558,.485525,.00690391,.380496,-.0119837,.485551,.00940039,.38056,-.0156487,.485605,.0122848,.38064,-.0197988,.485666,.0155601,.380767,-.0244324,.48577,.0192313,.380909,-.0295444,.485871,.0233032,.381142,-.0351321,.48606,.0277861,.381472,-.0411535,.486336,.0326939,.382015,-.0475408,.486833,.0380565,.382523,-.0544395,.487231,.0438615,.383129,-.061784,.487683,.0501332,.383952,-.0695085,.488313,.0568996,.38498,-.0775819,.489077,.0641952,.386331,-.0860443,.490113,.0720324,.387788,-.0948406,.491099,.0804379,.389808,-.103899,.492566,.0894899,.39252,-.113313,.494601,.0992098,.395493,-.123007,.496619,.109641,.399826,-.132859,.499912,.120919,.405341,-.143077,.504061,.133107,.411932,-.153465,.508905,.146263,.420591,-.164108,.515482,.160544,.43101,-.174893,.523191,.176123,.441881,-.185839,.53026,.192757,.453919,-.196633,.537295,.210535,.468715,-.207611,.546156,.229886,.485182,-.218517,.555173,.250543,.501926,-.229249,.562728,.27221,.51785,-.239481,.567494,.294892,.536947,-.249395,.573889,.318987,.557115,-.259,.578831,.344348,.577966,-.268075,.582055,.371223,.599489,-.276115,.583307,.399834,.62479,-.282523,.583902,.431415,.647504,-.287663,.57953,.464301,.670601,-.291538,.573103,.498123,.693539,-.293842,.563731,.532662,.717385,-.294681,.553169,.567925,.741533,-.293717,.539908,.603502,.762142,-.291156,.521902,.639074,.783014,-.28719,.502815,.674439,.805158,-.281773,.482598,.710497,.823646,-.274682,.458949,.7456,.841879,-.266184,.433129,.781085,.859515,-.255682,.406064,.816,.875335,-.242849,.376509,.851074,.890147,-.228329,.345502,.886473,.903144,-.212491,.31428,.920751,.916618,-.195695,.282994,.954606,.927953,-.178267,.251091,.988402,.937414,-.159549,.219107,1.02141,.946823,-.140022,.18896,1.05167,.954651,-.118154,.158667,1.07819,.959955,-.0946636,.128808,1.1025,.96858,-.0711792,.0973787,1.12391,.97938,-.0475046,.0650965,1.14322,.990498,-.024059,.0326267,1.16077,.999844,-512408e-10,112444e-9,1.17727,.316912,-934977e-11,.425996,695559e-11,.356423,-241372e-9,.479108,179562e-9,.356272,-965292e-9,.478897,71811e-8,.356262,-.00217182,.478894,.00161574,.356265,-.00386092,.478895,.00287261,.356278,-.0060324,.478905,.00448907,.356293,-.00868565,.478914,.00646572,.356346,-.0118207,.478965,.00880438,.356395,-.0154355,.479001,.0115066,.356484,-.019529,.479075,.0145762,.356609,-.0240991,.47918,.018018,.356766,-.0291413,.479305,.0218379,.357009,-.0346498,.479512,.0260454,.357424,-.0405462,.479909,.0306657,.357899,-.0468825,.480337,.0357054,.358424,-.0536887,.480771,.0411728,.359041,-.0609416,.481242,.0470841,.359903,-.0685239,.481943,.0534831,.360932,-.0764883,.482741,.0603795,.362196,-.0848364,.483688,.0678028,.363847,-.0935002,.484947,.0758086,.365972,-.102471,.486588,.0844173,.368741,-.111751,.488787,.0937199,.372146,-.121334,.491405,.103732,.377114,-.131147,.495604,.114608,.38226,-.141213,.499436,.126345,.389609,-.151632,.505334,.139116,.397925,-.162073,.51168,.152995,.407824,-.172819,.518876,.168071,.420014,-.183929,.527639,.184495,.434266,-.195032,.537588,.20232,.447352,-.205792,.544379,.221189,.463726,-.216704,.553422,.241616,.481406,-.227531,.562074,.263298,.498707,-.238017,.568227,.286116,.518039,-.247936,.574473,.3101,.538277,-.257437,.579191,.335401,.561166,-.266829,.584807,.362246,.583189,-.275329,.586476,.390609,.606024,-.28234,.585578,.420998,.632419,-.287924,.584496,.454357,.656128,-.291972,.577766,.488233,.679953,-.29456,.56875,.523248,.704654,-.295816,.558388,.559168,.729016,-.295157,.544826,.595326,.752062,-.292779,.528273,.631864,.773138,-.288681,.508482,.667793,.794869,-.283358,.487341,.704035,.815101,-.27608,.46354,.739925,.834212,-.26767,.438672,.775539,.852368,-.257397,.411239,.810895,.870207,-.245689,.3829,.846472,.884063,-.231452,.351496,.881788,.898284,-.215561,.31895,.917438,.912964,-.198208,.287367,.952422,.924666,-.180426,.254487,.987551,.934429,-.161525,.222226,1.02142,.943485,-.141197,.191143,1.05218,.9521,-.120085,.161112,1.07937,.957876,-.0975881,.130982,1.10403,.966943,-.0726842,.0990553,1.12616,.978313,-.0483705,.0662818,1.14619,.990048,-.0239072,.0329243,1.16413,.999984,461885e-9,-772859e-10,1.18099,.321287,-935049e-11,.455413,659662e-11,.332595,-237513e-9,.471437,167562e-9,.332729,-949964e-9,.471618,670192e-9,.332305,-.00213618,.471028,.00150712,.332326,-.00379765,.471055,.00267959,.332344,-.00593353,.471072,.00418751,.332356,-.00854349,.471077,.00603172,.332403,-.0116268,.471121,.00821362,.332461,-.0151824,.47117,.0107357,.332552,-.0192088,.471251,.0136014,.332657,-.0237024,.47133,.0168152,.332835,-.0286615,.471487,.0203853,.333083,-.0340765,.471708,.0243212,.333547,-.0398563,.47219,.0286518,.333989,-.0460916,.472587,.0333763,.334532,-.0527897,.473054,.0385084,.335167,-.0599284,.473568,.0440638,.33608,-.0673514,.474362,.0500962,.337146,-.0752237,.475231,.0566022,.338462,-.083418,.476282,.0636272,.34014,-.0919382,.477615,.0712153,.342341,-.100741,.479404,.079417,.345088,-.109905,.481618,.0882631,.349049,-.119369,.485081,.0978851,.353939,-.129033,.489317,.108336,.359893,-.139038,.494309,.119698,.366945,-.149411,.499983,.132024,.375814,-.159843,.507185,.145558,.387112,-.170664,.516392,.160433,.40023,-.181897,.526519,.176648,.412555,-.192785,.53423,.193922,.427023,-.203663,.542741,.212662,.443685,-.214695,.552066,.232944,.461499,-.225561,.560762,.254495,.480975,-.236257,.569421,.277531,.501,-.24639,.576101,.301724,.521691,-.256101,.581493,.327112,.543478,-.265289,.585221,.353917,.566094,-.273938,.587614,.381941,.589578,-.281679,.587991,.41172,.614583,-.287655,.585928,.444148,.641813,-.292228,.582092,.478617,.666189,-.295172,.57398,.51397,.690475,-.29648,.561676,.550118,.715543,-.296203,.548758,.586933,.740405,-.293999,.532792,.62384,.762183,-.28998,.512735,.660723,.786069,-.28478,.492402,.69807,.806812,-.277568,.469058,.734422,.826987,-.268951,.443017,.770946,.844588,-.259049,.415501,.80699,.863725,-.2471,.387328,.842107,.879137,-.234157,.356108,.878078,.894634,-.218719,.324315,.914058,.909162,-.201293,.291813,.949922,.92072,-.18267,.258474,.985337,.93158,-.163212,.225593,1.0205,.941238,-.142771,.193986,1.05273,.949293,-.120956,.163392,1.08075,.956226,-.0985743,.132934,1.10559,.96546,-.075118,.101255,1.12823,.977403,-.0497921,.0675441,1.149,.989648,-.0241574,.0334681,1.16765,1.00001,5762e-7,-184807e-9,1.18519,.303474,-916603e-11,.4542,61243e-10,.308894,-232869e-9,.462306,155592e-9,.309426,-931661e-9,.463093,622499e-9,.308643,-.0020949,.461933,.00139979,.308651,-.0037242,.461941,.00248874,.308662,-.00581873,.46195,.00388933,.308687,-.00837818,.461974,.00560247,.308728,-.0114016,.462011,.00762948,.308789,-.0148884,.462067,.00997326,.308882,-.0188369,.462151,.0126375,.309007,-.0232436,.462263,.0156271,.30918,-.0281054,.462417,.0189498,.309442,-.0334065,.462667,.0226167,.309901,-.0390589,.463162,.0266614,.310331,-.0452042,.463555,.0310715,.310858,-.0517735,.464019,.0358698,.311576,-.0587359,.464669,.0410848,.312436,-.0660383,.465406,.0467453,.313526,-.0737266,.466339,.0528718,.314903,-.0817574,.467504,.0595039,.316814,-.090167,.469226,.0666888,.318965,-.0987555,.470981,.0744658,.322077,-.107792,.473814,.082912,.325947,-.117098,.477241,.0920846,.331008,-.126602,.48184,.102137,.337893,-.136619,.488334,.113135,.345106,-.146838,.494415,.12511,.355111,-.157357,.503275,.138356,.365095,-.167955,.510966,.152686,.378344,-.179157,.521508,.16856,.391599,-.190143,.530455,.18561,.407786,-.20123,.541275,.204308,.425294,-.212456,.551784,.224623,.444021,-.223568,.561493,.246172,.463418,-.234154,.569886,.268979,.484077,-.244546,.577116,.293411,.505513,-.254301,.582914,.318936,.527672,-.263564,.587208,.345856,.550565,-.272332,.589277,.374054,.573656,-.280011,.588426,.403276,.59827,-.286924,.587504,.43474,.624731,-.291994,.583401,.468767,.652396,-.295159,.576997,.504411,.67732,-.296954,.565863,.54114,.703147,-.296877,.552316,.57816,.728715,-.295147,.536773,.616124,.752448,-.291275,.51771,.653885,.775169,-.285905,.496087,.691537,.799307,-.279064,.474232,.729251,.819482,-.270294,.447676,.766267,.837659,-.260032,.419656,.802616,.856903,-.248497,.391328,.838583,.873325,-.235252,.360285,.874711,.889788,-.221126,.329215,.91077,.904486,-.204304,.296392,.94653,.917711,-.185562,.262159,.983828,.928969,-.165635,.229142,1.01955,.939707,-.14442,.19673,1.05317,.948167,-.122147,.165095,1.0823,.955222,-.099098,.13451,1.10791,.964401,-.0755332,.102476,1.1312,.976605,-.0513817,.0689667,1.15218,.989085,-.0258499,.034506,1.17129,.999908,617773e-9,-271268e-9,1.18961,.285803,-905752e-11,.452348,572272e-11,.284689,-22732e-8,.450581,143626e-9,.285263,-910214e-9,.451482,575099e-9,.285302,-.00204784,.451553,.00129395,.285318,-.00364057,.451574,.0023006,.28533,-.00568813,.451585,.00359547,.285361,-.00819001,.451618,.00517934,.285397,-.0111458,.45165,.007054,.285447,-.0145536,.451688,.00922167,.285527,-.0184127,.451758,.0116869,.285688,-.0227207,.451929,.0144555,.28584,-.0274712,.452055,.0175341,.286136,-.0326278,.452369,.0209406,.286574,-.0381792,.452853,.0246965,.287012,-.0441879,.453272,.0287996,.287542,-.0506096,.453752,.033268,.288299,-.0573634,.454488,.0381504,.289186,-.0645458,.455294,.0434447,.290302,-.0720405,.456301,.0491973,.291776,-.0799046,.457648,.0554453,.29372,-.088117,.459483,.0622311,.296052,-.0965328,.461571,.0695992,.299563,-.105409,.465085,.077658,.30335,-.114553,.468506,.0864176,.309167,-.123917,.474423,.0961078,.31529,-.13381,.47995,.106643,.324163,-.144021,.488592,.118322,.333272,-.154382,.496461,.131133,.344224,-.165015,.50562,.145208,.357733,-.176168,.516719,.16073,.373046,-.187468,.528513,.177807,.38788,-.198488,.537713,.196072,.405133,-.209545,.547999,.21605,.423845,-.220724,.55759,.237484,.443777,-.231518,.566246,.26039,.464824,-.242035,.574326,.284835,.486635,-.251898,.58037,.310518,.51012,-.261304,.58568,.337678,.535301,-.270384,.590197,.366242,.559193,-.27841,.590569,.395873,.583544,-.285325,.588161,.426857,.608834,-.291113,.584249,.459477,.635753,-.294882,.57763,.494734,.664367,-.297088,.569479,.532023,.689688,-.297364,.555064,.569629,.715732,-.295949,.539522,.608124,.741307,-.292259,.521613,.646231,.764949,-.287063,.49969,.684938,.788599,-.28012,.476747,.723548,.81048,-.27153,.45116,.761135,.831372,-.261289,.424101,.798916,.850092,-.249559,.39443,.835952,.867777,-.236348,.363849,.871606,.884632,-.221569,.332477,.907843,.90047,-.20618,.300667,.944187,.914524,-.188771,.266552,.981371,.926892,-.168362,.232349,1.01841,.937951,-.146761,.199359,1.05308,.947236,-.123813,.1675,1.0839,.954367,-.099984,.136166,1.11047,.963907,-.0759278,.103808,1.13414,.976218,-.0511367,.0697061,1.15575,.988772,-.0267415,.0352529,1.17531,.999888,-520778e-9,289926e-9,1.19389,.263546,-883274e-11,.441896,526783e-11,.262352,-221849e-9,.439889,132311e-9,.262325,-886683e-9,.439848,528824e-9,.26228,-.00199476,.439765,.00118975,.262372,-.00354671,.439922,.00211568,.26239,-.00554141,.439941,.00330652,.262412,-.00797888,.439961,.00476346,.262453,-.0108584,.440002,.00648818,.262528,-.0141788,.440085,.0084835,.262615,-.017938,.440166,.0107533,.262744,-.0221346,.440291,.0133044,.262939,-.026762,.440493,.0161445,.263277,-.0317573,.440889,.0192974,.26368,-.0371832,.441338,.0227699,.264106,-.0430371,.441753,.0265698,.264624,-.0493035,.442227,.0307178,.265378,-.0558669,.442985,.0352616,.266253,-.0628718,.443795,.0401968,.267478,-.0701569,.445008,.04559,.269062,-.077845,.446599,.0514539,.270926,-.0857941,.448349,.0578382,.273693,-.0940773,.451221,.0648363,.276746,-.102704,.454097,.0724389,.281693,-.111735,.459517,.0808744,.287335,-.121004,.46531,.0901551,.29448,-.130734,.472605,.100371,.30257,-.140777,.480251,.111644,.312465,-.15111,.489444,.124111,.324856,-.16189,.500919,.137979,.33774,-.172946,.511317,.153163,.35255,-.184152,.522684,.169817,.367786,-.19522,.53248,.187886,.385474,-.20632,.543326,.207634,.404976,-.217744,.554109,.229165,.425203,-.228691,.563395,.252068,.446704,-.239299,.571565,.276471,.468951,-.249348,.577935,.302323,.493487,-.258933,.584309,.329882,.517861,-.268009,.58773,.358525,.543309,-.276238,.589612,.388585,.569704,-.28356,.589294,.419787,.594871,-.289497,.585137,.452114,.622555,-.294452,.580356,.486466,.651167,-.296918,.57185,.523079,.677332,-.297647,.558428,.5611,.703718,-.296321,.542232,.599592,.730262,-.293339,.524541,.639138,.754304,-.288036,.502691,.677978,.778051,-.281018,.479212,.716537,.801557,-.272414,.454071,.75586,.822559,-.262419,.425952,.794477,.843051,-.250702,.397313,.832664,.86232,-.237264,.366534,.869876,.879044,-.222716,.334816,.906973,.896362,-.206827,.303143,.943558,.910342,-.189659,.269699,.979759,.924119,-.171108,.236411,1.01718,.935374,-.149579,.202224,1.05289,.944295,-.126295,.16989,1.08496,.952227,-.101511,.138089,1.11256,.962041,-.0766392,.105053,1.1375,.97528,-.0511967,.070329,1.15983,.988476,-.025463,.0351268,1.17987,.999962,286808e-10,145564e-10,1.19901,.227089,-841413e-11,.404216,472707e-11,.239725,-215083e-9,.426708,120833e-9,.239904,-860718e-9,.427028,483555e-9,.239911,-.00193661,.427039,.00108806,.239914,-.00344276,.42704,.00193457,.239933,-.00537907,.427064,.00302363,.239944,-.00774482,.427065,.00435604,.239993,-.01054,.427122,.00593398,.240052,-.0137626,.427179,.00775987,.240148,-.0174115,.427279,.00983854,.240278,-.021484,.42741,.0121763,.240472,-.0259729,.427618,.0147827,.240839,-.0308131,.428086,.0176837,.241201,-.0360893,.428482,.0208775,.241626,-.0417723,.428907,.0243821,.242207,-.0478337,.42952,.0282228,.24298,-.0542199,.430332,.0324333,.243881,-.0610015,.431222,.0370252,.245123,-.0680874,.432512,.0420535,.24667,-.0755482,.434088,.0475414,.248779,-.0832873,.436323,.0535542,.251665,-.0913546,.439509,.0601716,.255305,-.0998489,.443478,.0674282,.260049,-.108576,.448713,.0754673,.266192,-.117754,.455524,.084339,.273158,-.127294,.4627,.0941683,.282131,-.137311,.472068,.10515,.293332,-.147736,.483565,.117402,.304667,-.158357,.493702,.130824,.317785,-.169274,.504708,.145724,.333245,-.180595,.517107,.16215,.349843,-.191892,.528849,.180149,.367944,-.203168,.540301,.199746,.387579,-.214443,.551514,.221047,.408247,-.225624,.560906,.243981,.43014,-.236422,.56959,.268513,.452669,-.24654,.576098,.294409,.476196,-.256157,.580925,.322002,.501157,-.265289,.584839,.351052,.527632,-.273671,.587614,.3812,.555754,-.281254,.589119,.412994,.581682,-.287448,.585204,.445498,.608196,-.292614,.579006,.479505,.635661,-.296068,.571297,.514643,.664999,-.297395,.560855,.552213,.691039,-.296645,.544525,.591365,.7179,-.293785,.526535,.630883,.744059,-.289089,.50545,.670932,.76863,-.282239,.482514,.710904,.793273,-.273688,.457246,.750259,.814731,-.26328,.428872,.78948,.835603,-.251526,.399384,.828597,.85489,-.238339,.368811,.866892,.872828,-.223607,.336617,.90563,.889462,-.207538,.303997,.943538,.904929,-.190297,.270812,.980591,.919101,-.172034,.237453,1.01935,.930536,-.152058,.204431,1.05498,.941223,-.129515,.172495,1.08717,.94982,-.104263,.140175,1.11551,.960592,-.0781944,.106465,1.14098,.974629,-.051688,.0711592,1.16418,.98811,-.0253929,.0354432,1.18465,1.00004,804378e-9,-330876e-9,1.20462,.214668,-821282e-11,.406619,433582e-11,.218053,-208144e-9,.413025,109887e-9,.217987,-832212e-9,.412901,439362e-9,.217971,-.00187246,.412876,988623e-9,.217968,-.00332855,.41286,.00175772,.217985,-.00520055,.412882,.00274729,.218014,-.00748814,.412916,.00395842,.218054,-.0101901,.412957,.00539274,.218106,-.0133057,.413005,.00705348,.218217,-.0168342,.413139,.00894581,.218338,-.0207707,.413258,.0110754,.21855,-.0251001,.413509,.0134551,.218913,-.0297861,.413992,.0161081,.219265,-.0348956,.414383,.0190307,.219696,-.0403909,.414839,.0222458,.220329,-.0462003,.415567,.025792,.220989,-.0524208,.41621,.0296637,.222027,-.058948,.417385,.0339323,.223301,-.0658208,.418779,.0386055,.224988,-.0730347,.420665,.0437355,.227211,-.0805274,.423198,.0493844,.230131,-.088395,.426566,.0556135,.233908,-.0966208,.43091,.0624829,.239092,-.105223,.437148,.0701636,.245315,-.11424,.444302,.0786949,.253166,-.12368,.453262,.0882382,.262374,-.133569,.463211,.0988682,.273145,-.143836,.474271,.110727,.285512,-.154577,.4863,.123945,.299512,-.165501,.498817,.138581,.314287,-.176698,.510341,.154676,.331083,-.188066,.522583,.172459,.349615,-.199597,.534879,.191979,.369318,-.210843,.546083,.21309,.390377,-.222068,.5562,.235998,.412411,-.233059,.564704,.260518,.435715,-.24357,.572314,.286795,.461196,-.253356,.579395,.314559,.485587,-.262362,.581985,.343581,.511908,-.270895,.584347,.374367,.539798,-.278452,.58505,.406015,.567974,-.284877,.583344,.439168,.594303,-.290124,.577348,.473005,.622951,-.294183,.570751,.508534,.652404,-.296389,.561541,.544764,.679291,-.296605,.546426,.582927,.706437,-.294095,.528599,.622681,.734485,-.28978,.508676,.663567,.758841,-.283363,.484768,.704092,.78537,-.275015,.460434,.745101,.807315,-.264689,.432166,.784712,.8271,-.252597,.401807,.824241,.849191,-.239154,.371458,.863803,.867046,-.224451,.338873,.903063,.8852,-.208342,.306175,.942763,.901771,-.190684,.272759,.981559,.915958,-.172105,.239306,1.02048,.928046,-.152214,.206071,1.05765,.939961,-.130247,.17367,1.08999,.948711,-.10672,.142201,1.11829,.959305,-.0808688,.108454,1.14467,.973009,-.0539145,.0728109,1.16839,.987631,-.0262947,.0360625,1.19004,.999978,.00132758,-559424e-9,1.21058,.193925,-793421e-11,.391974,392537e-11,.196746,-200315e-9,.397675,991033e-10,.19667,-801099e-9,.397521,396342e-9,.196633,-.00180246,.397445,891829e-9,.196654,-.00320443,.397482,.00158582,.196659,-.00500647,.39748,.00247867,.196683,-.0072086,.397506,.00357167,.196728,-.00981001,.397562,.00486675,.196792,-.0128096,.397633,.00636707,.19689,-.0162055,.397746,.00807752,.197017,-.0199943,.397884,.0100052,.19729,-.024139,.39827,.0121691,.197583,-.0286671,.398639,.0145755,.197927,-.0335858,.399034,.0172355,.198383,-.0388806,.399554,.0201718,.199002,-.0444736,.400289,.0234194,.199739,-.0504583,.401111,.026984,.200784,-.056729,.402349,.0309217,.202075,-.0633643,.403841,.0352496,.203898,-.0703247,.406076,.0400313,.206199,-.0775565,.408841,.0453282,.209252,-.085184,.41259,.0511794,.213638,-.0931994,.418288,.0577459,.21881,-.101617,.424681,.0650508,.225642,-.11052,.433429,.0732759,.233717,-.119772,.442897,.0824683,.242823,-.129505,.452888,.0927484,.254772,-.139906,.466407,.104417,.266603,-.150402,.477413,.117211,.28073,-.161395,.490519,.131598,.295399,-.172465,.50201,.147407,.312705,-.183982,.515311,.165031,.331335,-.195532,.52786,.184336,.351037,-.206971,.5392,.205361,.372175,-.218117,.54941,.228043,.394548,-.229327,.558642,.25267,.419598,-.240052,.567861,.279071,.443922,-.249937,.573332,.306882,.471495,-.259407,.58013,.33661,.496769,-.267749,.580564,.367328,.524951,-.275524,.581696,.399753,.55318,-.282148,.579885,.433134,.581577,-.287533,.575471,.467534,.609231,-.291612,.567445,.502943,.637478,-.293911,.557657,.53871,.667795,-.295096,.546535,.576568,.694272,-.294073,.529561,.614929,.722937,-.290386,.510561,.655909,.749682,-.284481,.487846,.697663,.774754,-.276188,.462487,.738515,.799301,-.266215,.43481,.779802,.820762,-.254116,.404879,.820045,.843231,-.240393,.374559,.860294,.861857,-.225503,.341582,.900965,.880815,-.209382,.308778,.941727,.89766,-.19155,.275232,.980916,.912926,-.172346,.240938,1.02162,.926391,-.151799,.207223,1.0597,.938429,-.129968,.17484,1.09291,.947834,-.10651,.142984,1.12248,.958432,-.0824098,.109902,1.149,.972402,-.0565242,.0744454,1.1733,.987191,-.028427,.0373794,1.19538,.999975,385685e-10,-4203e-8,1.21676,.178114,-766075e-11,.385418,354027e-11,.176074,-191966e-9,.381002,887135e-10,.17601,-767549e-9,.380861,354715e-9,.17598,-.00172696,.380798,798168e-9,.175994,-.00307012,.380824,.00141928,.176017,-.00479684,.380858,.00221859,.176019,-.00690648,.380839,.00319714,.176072,-.00939888,.380913,.0043572,.176131,-.0122726,.380979,.005702,.176239,-.0155264,.38112,.00723689,.176371,-.0191551,.381272,.00896907,.176638,-.023117,.381669,.0109194,.176912,-.0274633,.382015,.0130903,.177279,-.032173,.382476,.0154949,.17774,-.0372219,.383041,.0181669,.178344,-.0426132,.38378,.0211209,.179153,-.0483309,.384773,.0243899,.180197,-.0543447,.386076,.0280062,.181581,-.0607122,.387809,.032004,.18344,-.0673855,.390205,.036453,.186139,-.0743989,.393944,.0414162,.189432,-.0817731,.39832,.0469394,.193795,-.0895464,.404188,.0531442,.199641,-.0978264,.4121,.0601374,.206679,-.106499,.421425,.0680078,.214865,-.115654,.431504,.076919,.224406,-.125268,.442526,.0868835,.235876,-.135475,.455465,.0981875,.248335,-.146023,.4681,.110759,.262868,-.157016,.482069,.124885,.278962,-.168245,.496182,.140645,.295082,-.17958,.507401,.157838,.313738,-.191227,.520252,.17695,.333573,-.202718,.531708,.197817,.356433,-.214424,.544509,.220785,.378853,-.225492,.55373,.245306,.402717,-.236236,.561348,.271593,.428375,-.246568,.568538,.299776,.454724,-.255941,.573462,.329433,.482291,-.264511,.576356,.360598,.509706,-.272129,.576446,.393204,.538805,-.278979,.575298,.427227,.568919,-.284528,.572154,.462157,.596804,-.288801,.564691,.497997,.625987,-.291334,.555134,.534467,.656414,-.292722,.545051,.571736,.683916,-.292185,.528813,.610158,.711809,-.290043,.51106,.649061,.739547,-.285246,.490103,.690081,.766914,-.277647,.465523,.732554,.791375,-.267603,.437718,.773982,.814772,-.256109,.40882,.81609,.836691,-.242281,.377823,.856849,.856984,-.227155,.34496,.898363,.876332,-.210395,.311335,.939471,.894988,-.192612,.277703,.980799,.911113,-.173236,.243019,1.02215,.924092,-.152258,.209037,1.06139,.936828,-.129575,.175909,1.09635,.946869,-.10594,.143852,1.12707,.958284,-.081318,.110289,1.15419,.972325,-.0556133,.0747232,1.17909,.986878,-.0297899,.0383149,1.20163,.999936,-.00197169,912402e-9,1.22338,.151174,-720365e-11,.351531,309789e-11,.155594,-18279e-8,.361806,78608e-9,.156099,-731569e-9,.362982,314615e-9,.156053,-.00164578,.362869,707845e-9,.156093,-.0029261,.362961,.00125884,.156099,-.00457155,.362959,.00196783,.15612,-.00658224,.362982,.00283622,.156168,-.00895774,.363048,.00386625,.156221,-.0116962,.363101,.00506109,.156324,-.0147973,.363241,.00642675,.156476,-.0182503,.363448,.00797175,.156731,-.0220266,.36384,.00971484,.156994,-.026176,.364179,.0116575,.157341,-.0306701,.36462,.0138207,.157867,-.0354591,.365364,.0162356,.15846,-.0406141,.366111,.0189092,.159308,-.0460519,.367248,.021885,.160426,-.0518096,.368767,.0252004,.161877,-.0578906,.370745,.0288825,.163995,-.0642812,.373831,.0330139,.16655,-.0710067,.377366,.0376283,.170237,-.0781522,.382799,.0428493,.175096,-.0857172,.389915,.0487324,.181069,-.0938025,.398487,.0554214,.188487,-.102363,.408799,.0630189,.197029,-.111343,.419991,.071634,.206684,-.120812,.431455,.0812797,.218698,-.131033,.445746,.0923651,.230726,-.141373,.457471,.104545,.245516,-.152387,.472388,.118449,.261551,-.163628,.486671,.133923,.277437,-.174814,.49762,.150849,.296662,-.186713,.51162,.169924,.31795,-.198513,.525435,.190848,.339422,-.210119,.536267,.213504,.362143,-.221354,.545982,.237947,.387198,-.23224,.555364,.264427,.412349,-.24257,.561489,.292519,.439274,-.252284,.566903,.322561,.466779,-.261023,.569614,.353952,.496011,-.26899,.571589,.387278,.524964,-.275498,.570325,.421356,.556518,-.281449,.568792,.457314,.584363,-.285526,.560268,.493199,.614214,-.28844,.55205,.530276,.645684,-.289777,.541906,.56855,.673446,-.289722,.526464,.606927,.701924,-.287792,.509872,.645945,.73037,-.284315,.490649,.685564,.757405,-.278804,.467964,.726511,.784025,-.269543,.441468,.768601,.808255,-.258117,.41216,.811321,.830739,-.244728,.380606,.853496,.851914,-.229428,.348111,.895374,.872586,-.212508,.314732,.937674,.891581,-.194025,.280338,.979869,.907641,-.174711,.245203,1.02253,.922233,-.153509,.21077,1.06371,.935878,-.130418,.177399,1.09972,.946338,-.105558,.144507,1.13124,.957265,-.080059,.110508,1.15973,.971668,-.0539766,.0742311,1.18515,.9866,-.0277101,.0375224,1.20858,1.00021,-515531e-9,135226e-9,1.23135,.137468,-686011e-11,.345041,273315e-11,.13703,-173378e-9,.343936,690761e-10,.136986,-693048e-9,.34383,276126e-9,.136964,-.00155931,.343761,621337e-9,.137003,-.00277211,.343863,.00110494,.137012,-.00433103,.343868,.00172744,.137043,-.00623606,.343916,.00249022,.13709,-.0084868,.343986,.00339559,.137145,-.0110814,.344045,.00444687,.137242,-.0140187,.344177,.00565007,.137431,-.0172713,.344491,.00701868,.137644,-.0208605,.344805,.00856042,.13791,-.024792,.345172,.0102863,.138295,-.0290461,.345734,.0122185,.138764,-.0335957,.346371,.0143771,.139415,-.038467,.347298,.0167894,.140272,-.0436176,.348527,.0194895,.141457,-.0491016,.350276,.0225043,.14303,-.0548764,.352646,.0258962,.145289,-.0610096,.356206,.0297168,.148502,-.0674777,.361488,.0340562,.152188,-.074345,.367103,.0389534,.157359,-.0817442,.375247,.0445541,.16379,-.0896334,.385064,.0509535,.171376,-.098005,.396082,.0582611,.179901,-.106817,.407418,.06654,.189892,-.116239,.420031,.075994,.201838,-.12627,.434321,.0867239,.214311,-.136701,.447631,.0987517,.228902,-.147616,.462046,.112353,.245107,-.158871,.476942,.127605,.262292,-.170261,.490285,.144469,.281215,-.182017,.503783,.163282,.301058,-.193729,.515505,.183873,.322752,-.205512,.52682,.206466,.347547,-.217214,.539473,.231194,.370969,-.227966,.546625,.257288,.397533,-.238555,.55472,.285789,.42398,-.248278,.559468,.315746,.452928,-.257422,.564095,.347724,.482121,-.265306,.565426,.380922,.510438,-.272043,.563205,.415639,.541188,-.277614,.561087,.451702,.571667,-.281927,.554922,.48845,.602432,-.285015,.546838,.526442,.634126,-.286512,.537415,.564896,.662816,-.286388,.522906,.604037,.692411,-.284734,.507003,.643795,.720946,-.281297,.488398,.68298,.748293,-.276262,.466353,.723466,.776931,-.269978,.443573,.764565,.801065,-.260305,.415279,.805838,.825843,-.247426,.384773,.849985,.84807,-.232437,.352555,.893174,.869122,-.215806,.318642,.936564,.888963,-.197307,.28381,.980253,.905547,-.177203,.247888,1.02463,.918554,-.155542,.212904,1.06714,.931395,-.131948,.1787,1.10451,.941749,-.106723,.145902,1.13694,.954551,-.0804939,.111193,1.1666,.970279,-.0534239,.0744697,1.19249,.986117,-.0257452,.0368788,1.21665,.999938,.00190634,-.0010291,1.23981,.118493,-647439e-11,.32272,23772e-10,.118765,-163023e-9,.323456,598573e-10,.118772,-65212e-8,.323477,239447e-9,.118843,-.00146741,.323657,538881e-9,.118804,-.00260846,.323553,95826e-8,.118826,-.00407576,.323595,.00149845,.118846,-.00586826,.323617,.00216047,.118886,-.00798578,.32367,.00294679,.118947,-.0104273,.323753,.00386124,.119055,-.0131909,.323922,.00490999,.119241,-.0162444,.324251,.00610804,.11944,-.0196339,.324544,.00745805,.119739,-.0233378,.325026,.00897805,.12011,-.0273179,.325586,.0106895,.120571,-.0316143,.326231,.0126073,.12124,-.0361939,.327264,.0147654,.122162,-.0410511,.328733,.0172001,.123378,-.0462233,.330659,.0199375,.125183,-.0517109,.333754,.0230498,.127832,-.0575652,.338507,.026597,.130909,-.0637441,.343666,.0306345,.135221,-.0704302,.351063,.035273,.14082,-.0776364,.360604,.0406137,.146781,-.0852293,.369638,.0466788,.155121,-.0935351,.3827,.0537628,.16398,-.102234,.39522,.0617985,.173926,-.111465,.40793,.07097,.185137,-.121296,.42105,.0813426,.19826,-.13169,.435735,.0931596,.212938,-.142614,.450932,.106547,.229046,-.153884,.465726,.121575,.246246,-.165382,.479461,.138286,.264637,-.176806,.492106,.15666,.284959,-.188793,.504774,.17728,.308157,-.200763,.518805,.19988,.330951,-.21239,.528231,.224293,.3549,-.223521,.536376,.250541,.381502,-.234169,.544846,.278902,.409529,-.244077,.551717,.309227,.437523,-.253363,.55517,.341426,.467624,-.261659,.557772,.37518,.497268,-.268498,.556442,.41007,.528294,-.274018,.553915,.446445,.559053,-.278169,.549153,.483779,.589329,-.281229,.539878,.522249,.622503,-.282902,.53162,.561754,.652382,-.282815,.518119,.601544,.681847,-.281247,.502187,.641574,.712285,-.277986,.484824,.682633,.740094,-.273017,.463483,.723426,.768478,-.266692,.441299,.763747,.794556,-.258358,.415238,.805565,.819408,-.248807,.386912,.847254,.843411,-.236214,.356165,.891091,.862397,-.219794,.320562,.936174,.883113,-.201768,.285322,.982562,.90023,-.181672,.249713,1.02862,.915192,-.159279,.214546,1.07163,.928458,-.134725,.180285,1.10995,.94069,-.10913,.147119,1.14354,.953409,-.0821315,.112492,1.17372,.969537,-.0542677,.0752014,1.20043,.985612,-.0259096,.0370361,1.22528,.999835,.00298198,-.00151801,1.24959,.10097,-602574e-11,.300277,202619e-11,.101577,-152164e-9,.302077,511662e-10,.101572,-608889e-9,.302066,204751e-9,.101566,-.00136997,.302047,460753e-9,.101592,-.00243557,.302114,819497e-9,.101608,-.0038053,.30214,.00128154,.101627,-.00547906,.30216,.0018483,.101669,-.00745647,.302224,.00252223,.101732,-.00973615,.302318,.00330716,.101844,-.0123097,.302513,.00421061,.102025,-.0151681,.30285,.00524481,.102224,-.0183334,.303166,.0064154,.102515,-.0217819,.303654,.00774063,.102886,-.0255067,.304243,.0092398,.103395,-.029514,.305089,.0109339,.104109,-.0337912,.306301,.0128561,.105074,-.0383565,.30798,.0150338,.10654,-.0432132,.310726,.0175228,.108478,-.0484244,.314351,.0203648,.111015,-.0539339,.319032,.0236325,.114682,-.0598885,.32605,.0274188,.11911,-.0663375,.334109,.0317905,.124736,-.0733011,.344013,.0368502,.131479,-.0807744,.355358,.0427104,.139283,-.0888204,.367614,.0494788,.148054,-.0973394,.380072,.0572367,.159037,-.10665,.395678,.0662704,.169794,-.116221,.40795,.0763192,.18314,-.126632,.423546,.087956,.197515,-.137383,.438213,.101042,.213514,-.148641,.453248,.115827,.23065,-.160117,.46688,.132283,.249148,-.171807,.479962,.150644,.270219,-.183695,.494618,.171073,.292338,-.195574,.506937,.193378,.314999,-.207205,.516463,.217585,.340991,-.218955,.528123,.24428,.367982,-.229917,.537025,.272784,.39432,-.239737,.541627,.302742,.423364,-.249048,.546466,.335112,.453751,-.257329,.549466,.369032,.48416,-.264623,.549503,.404577,.515262,-.270411,.547008,.441337,.547036,-.274581,.542249,.479162,.576614,-.277266,.533015,.517904,.611143,-.279144,.525512,.558508,.640989,-.279001,.51154,.598995,.671182,-.277324,.495641,.639935,.700848,-.273908,.477526,.681017,.729862,-.269063,.457955,.722764,.758273,-.262282,.434846,.764349,.784121,-.254281,.409203,.806206,.809798,-.24505,.382694,.848617,.834953,-.233861,.354034,.892445,.856817,-.221308,.321764,.936263,.877609,-.205996,.288118,.982401,.897489,-.186702,.253277,1.02975,.913792,-.164618,.217963,1.07488,.92785,-.140023,.183221,1.11487,.940378,-.11328,.149385,1.14947,.95273,-.0853958,.114152,1.1807,.969059,-.0568698,.0769845,1.20912,.985574,-.0276502,.0381186,1.23498,.999943,.00239052,-.00126861,1.25987,.0852715,-560067e-11,.279021,171162e-11,.0854143,-140871e-9,.279483,430516e-10,.0854191,-563385e-9,.2795,172184e-9,.0854188,-.00126753,.279493,387464e-9,.0854229,-.00225337,.279501,68918e-8,.0854443,-.00352086,.279549,.00107803,.0854697,-.00506962,.279591,.00155536,.0855093,-.00689873,.279652,.00212354,.0855724,-.00900821,.279752,.00278703,.0856991,-.0113799,.280011,.0035551,.085855,-.0140314,.280297,.00443449,.0860682,-.016963,.280682,.00543636,.086344,-.0201438,.281159,.0065788,.0867426,-.0235999,.281886,.00787977,.087239,-.0273069,.282745,.0093606,.0879815,-.031269,.284139,.011056,.0891258,-.035531,.28647,.0130065,.0906909,-.0400947,.289708,.0152495,.0927624,-.0449638,.293904,.0178454,.0958376,-.0502427,.300471,.0208915,.0995827,-.0559514,.30806,.0244247,.104526,-.0622152,.317874,.0285721,.110532,-.0690046,.329332,.0334227,.117385,-.0763068,.341217,.0390466,.12522,-.084184,.353968,.0455786,.134037,-.0925248,.366797,.0530773,.144014,-.101487,.380209,.0617424,.156013,-.111273,.395956,.071777,.168872,-.121431,.41053,.0830905,.183089,-.132105,.425073,.0959341,.198763,-.143286,.439833,.110448,.216159,-.154841,.454507,.126769,.234859,-.166588,.468368,.14495,.255879,-.178626,.482846,.165233,.27677,-.190218,.493489,.187217,.301184,-.202227,.506549,.211659,.325852,-.213764,.5158,.237922,.352824,-.22487,.525442,.26632,.380882,-.235246,.532487,.296691,.410137,-.244847,.537703,.329179,.439787,-.253122,.540361,.363135,.472291,-.260517,.542734,.399222,.501856,-.266519,.538826,.436352,.534816,-.270905,.535152,.474505,.565069,-.273826,.525979,.513988,.597154,-.275333,.516394,.554852,.630473,-.275314,.506206,.596592,.660574,-.273323,.489769,.638117,.692015,-.270008,.472578,.680457,.720647,-.265001,.452134,.723008,.750528,-.258311,.430344,.765954,.777568,-.250046,.405624,.809012,.80387,-.240114,.378339,.852425,.828439,-.228737,.349877,.895346,.851472,-.216632,.318968,.940695,.873906,-.202782,.287489,.987235,.89467,-.187059,.254394,1.03348,.912281,-.168818,.221294,1.07812,.927358,-.146494,.18675,1.11928,.940385,-.120009,.152322,1.15609,.952672,-.0917183,.117514,1.18875,.968496,-.0620321,.0797405,1.21821,.985236,-.0314945,.0402383,1.24523,.99998,-575153e-9,110644e-9,1.27133,.0702429,-512222e-11,.255273,140947e-11,.0702981,-128826e-9,.255469,354488e-10,.0703691,-515562e-9,.255727,141874e-9,.0703805,-.00116,.255754,31929e-8,.0703961,-.00206224,.255813,567999e-9,.0704102,-.00322223,.255839,88871e-8,.0704298,-.00463928,.255863,.00128272,.0704759,-.00631375,.255953,.00175283,.0705434,-.00824317,.256079,.00230342,.0706693,-.010412,.25636,.0029443,.0708189,-.0128439,.256647,.00368031,.0710364,-.0155177,.257084,.00452614,.0713223,-.0184374,.257637,.00549706,.0717182,-.0216002,.258416,.00661246,.072321,-.0249966,.259699,.00790147,.0731446,-.0286566,.261475,.0093884,.0743352,-.0325888,.264132,.0111186,.0760676,-.036843,.26815,.013145,.078454,-.0414292,.273636,.0155251,.0818618,-.0464634,.281653,.0183525,.0857382,-.0519478,.289992,.0216642,.0908131,-.0579836,.30066,.0255956,.0967512,-.0645124,.312204,.0301954,.103717,-.0716505,.325001,.0356017,.111596,-.0793232,.338129,.041896,.120933,-.087645,.352853,.0492447,.130787,-.096492,.366192,.0576749,.142311,-.105973,.380864,.0673969,.155344,-.116182,.396575,.0785899,.169535,-.126815,.411443,.0912377,.185173,-.138015,.426256,.105607,.201755,-.149325,.439607,.121551,.221334,-.161207,.455467,.139608,.241461,-.173162,.469096,.159591,.26294,-.18504,.481014,.18156,.286776,-.196881,.493291,.205781,.311596,-.208311,.503556,.231819,.338667,-.219671,.513268,.260274,.366021,-.230451,.519414,.290862,.395875,-.240131,.526766,.323196,.425564,-.248566,.52905,.357071,.457094,-.256195,.530796,.393262,.488286,-.262331,.528703,.430797,.522291,-.267141,.52727,.470231,.554172,-.270411,.519848,.510477,.586427,-.271986,.510307,.551594,.619638,-.27192,.499158,.593849,.650656,-.269817,.483852,.636314,.68284,-.266267,.467515,.679679,.714356,-.26113,.44931,.723884,.742717,-.254067,.425789,.767245,.770894,-.245652,.401144,.811819,.797358,-.235554,.374224,.856315,.823377,-.223896,.346167,.901077,.847456,-.210865,.316056,.946502,.870697,-.196574,.284503,.993711,.891068,-.180814,.251628,1.04134,.909267,-.163314,.219065,1.08609,.925653,-.143304,.186446,1.12702,.940017,-.121322,.153416,1.16371,.952398,-.0973872,.120334,1.19712,.967568,-.0698785,.08352,1.22791,.984772,-.0390031,.0439209,1.25672,1.00026,-.0070087,.00315668,1.28428,.0556653,-459654e-11,.227325,112556e-11,.0565238,-116382e-9,.230826,284985e-10,.0565717,-465666e-9,.231026,114036e-9,.0565859,-.00104773,.231079,256656e-9,.0565761,-.00186255,.231025,45663e-8,.0565913,-.00291002,.231058,714664e-9,.0566108,-.00418998,.231085,.00103224,.0566532,-.00570206,.231169,.00141202,.0567473,-.00743666,.231417,.00186018,.0568567,-.00940298,.231661,.00238264,.0569859,-.0115991,.231895,.00298699,.0572221,-.0140096,.232456,.00368957,.057519,-.0166508,.233096,.00450303,.0579534,-.01951,.234094,.00544945,.0585922,-.0225991,.235629,.00655564,.0595647,-.0259416,.238106,.00785724,.0609109,-.0295661,.241557,.00939127,.0628751,-.0335126,.246652,.0112198,.0656908,-.0378604,.254091,.0134168,.0691347,-.0426543,.262666,.0160374,.0732165,-.0478967,.272029,.0191514,.0782863,-.0536716,.283007,.0228597,.0843973,-.0600683,.295732,.0272829,.0913598,-.0670095,.308779,.032484,.0994407,-.0745516,.322886,.0385886,.108189,-.082712,.336408,.0457133,.118574,-.0914927,.351692,.0539832,.129989,-.100854,.366502,.0635162,.142722,-.110837,.381675,.0744386,.156654,-.121353,.3963,.0868483,.172151,-.132414,.411477,.100963,.188712,-.143809,.42508,.116795,.208093,-.155765,.441328,.134715,.227936,-.167608,.454328,.154396,.249495,-.179579,.467235,.176179,.27362,-.191488,.480248,.200193,.296371,-.202618,.487886,.225775,.324234,-.214133,.499632,.25441,.353049,-.225212,.509532,.285077,.381785,-.234875,.514265,.317047,.414038,-.244205,.521282,.351874,.445251,-.252145,.522931,.388279,.476819,-.258433,.520947,.425825,.509209,-.263411,.517669,.465104,.542759,-.266732,.512841,.505741,.574822,-.268263,.503317,.547611,.609324,-.268489,.493035,.590953,.641772,-.266941,.478816,.63488,.674049,-.263297,.462863,.679072,.705071,-.257618,.442931,.723487,.734709,-.250625,.421299,.768708,.763704,-.24179,.397085,.814375,.791818,-.231115,.370577,.859907,.817439,-.21922,.34232,.906715,.843202,-.205658,.312627,.953943,.866639,-.190563,.280933,1.00185,.888129,-.173978,.248393,1.05105,.907239,-.155485,.216007,1.09704,.923893,-.134782,.183233,1.13857,.938882,-.11249,.150376,1.17539,.952464,-.0890706,.117177,1.20924,.968529,-.0646523,.0813095,1.24055,.984763,-.038606,.0439378,1.27018,1.00053,-.01238,.00598668,1.29873,.0437928,-409594e-11,.204012,8.79224e-7,.0440166,-103395e-9,.205049,221946e-10,.0440529,-413633e-9,.205225,887981e-10,.0440493,-930594e-9,.2052,199858e-9,.0439884,-.00165352,.204901,355495e-9,.0440716,-.0025849,.205255,556983e-9,.0440968,-.00372222,.205311,805326e-9,.0441359,-.00506478,.205391,.00110333,.0442231,-.00660384,.205638,.00145768,.0443254,-.00835246,.205877,.00187275,.0444832,-.0102992,.20627,.00235938,.0447001,-.0124449,.206796,.0029299,.0450168,-.0147935,.207593,.0036005,.0454816,-.017336,.208819,.00439246,.0462446,-.0201156,.211036,.00533864,.0473694,-.0231568,.214388,.00646984,.0490191,-.0264941,.219357,.00783856,.0512776,-.030184,.226061,.00950182,.0541279,-.0342661,.234094,.0115156,.0578989,-.0388539,.244297,.0139687,.0620835,-.0438735,.254457,.0169015,.0673497,-.04951,.266706,.0204554,.0731759,-.0556263,.278753,.0246606,.0803937,-.0624585,.29309,.0297126,.0879287,-.0697556,.305856,.0355868,.0970669,-.0778795,.321059,.0425768,.106508,-.0863541,.333873,.05056,.11776,-.0955935,.349008,.0598972,.130081,-.105438,.363776,.0706314,.144454,-.115899,.380112,.0828822,.1596,-.126827,.394843,.0967611,.176097,-.138161,.409033,.112381,.194726,-.149904,.424257,.129952,.213944,-.161675,.436945,.149333,.235516,-.173659,.450176,.170892,.260564,-.185963,.466305,.194984,.285183,-.197582,.477328,.220805,.311095,-.208697,.486566,.248694,.338924,-.219519,.494811,.279015,.369757,-.229766,.504065,.311725,.3996,-.238879,.507909,.345844,.430484,-.246802,.509805,.381749,.46413,-.253924,.511436,.420251,.497077,-.259319,.508787,.459957,.530434,-.263297,.50394,.501356,.565725,-.265619,.49804,.544252,.599254,-.265842,.487346,.587856,.631251,-.263978,.472975,.631969,.663972,-.26043,.457135,.677471,.697724,-.255358,.439844,.723744,.727725,-.248308,.417872,.770653,.756417,-.239181,.39273,.817357,.785419,-.22814,.367839,.864221,.81266,-.215681,.339449,.912701,.839391,-.201623,.309279,.962419,.86366,-.185624,.278029,1.0122,.885028,-.16797,.245294,1.06186,.904639,-.148336,.212689,1.10934,.922048,-.12637,.179616,1.15063,.936952,-.102928,.146749,1.18885,.951895,-.0785268,.112733,1.22352,.967198,-.0530153,.0760056,1.25681,.984405,-.02649,.0383183,1.28762,1.00021,70019e-8,-20039e-8,1.31656,.0325964,-355447e-11,.176706,6.55682e-7,.0329333,-899174e-10,.178527,165869e-10,.0329181,-359637e-9,.178453,663498e-10,.0329085,-808991e-9,.178383,149332e-9,.0329181,-.00143826,.178394,265873e-9,.0329425,-.00224678,.178517,416597e-9,.0329511,-.00323575,.17849,603299e-9,.033011,-.00439875,.178695,829422e-9,.0330733,-.00574059,.178843,.00109908,.0331857,-.00725896,.179176,.00141933,.0333445,-.00895289,.179618,.0017999,.0335674,-.0108219,.180238,.00225316,.033939,-.0128687,.181417,.00279765,.0345239,-.015114,.183395,.0034564,.0354458,-.017596,.186616,.00425864,.0368313,-.0203524,.191547,.00524936,.0386115,-.0234105,.197508,.00647033,.0410303,-.0268509,.205395,.00798121,.0442245,-.0307481,.215365,.0098557,.0478659,-.0350863,.225595,.0121417,.0522416,-.0399506,.236946,.0149385,.0574513,-.045357,.249442,.0183189,.0631208,-.0512863,.261222,.0223644,.0701124,-.0579273,.275418,.0272418,.0777331,-.0650652,.288989,.0329458,.0862709,-.0728813,.302546,.0396819,.096103,-.081363,.317164,.04757,.106976,-.0904463,.331733,.0567012,.119175,-.100105,.34661,.067202,.132919,-.110375,.362249,.0792588,.147727,-.121115,.376978,.0928672,.163618,-.132299,.390681,.108228,.182234,-.143887,.406571,.125502,.201809,-.155827,.42042,.144836,.225041,-.168357,.438411,.166706,.247621,-.18004,.450368,.189909,.27097,-.191536,.460083,.215251,.296658,-.203024,.469765,.243164,.325892,-.214056,.481837,.273388,.35406,-.224104,.487474,.305344,.384372,-.233489,.492773,.339741,.41749,-.241874,.498451,.376287,.45013,-.248834,.499632,.414195,.481285,-.254658,.495233,.454077,.519183,-.259367,.496401,.496352,.551544,-.261818,.487686,.538798,.587349,-.262964,.479453,.583626,.621679,-.262128,.467709,.629451,.654991,-.258998,.452123,.67566,.686873,-.254119,.433495,.723248,.719801,-.246946,.413657,.771156,.750355,-.237709,.390366,.81989,.780033,-.226549,.364947,.868601,.809254,-.214186,.337256,.920034,.836576,-.199639,.307395,.971706,.861774,-.183169,.275431,1.02479,.885707,-.165111,.243431,1.07837,.904742,-.144363,.210921,1.12783,.915604,-.121305,.17647,1.17254,.930959,-.0962119,.143106,1.21012,.948404,-.069969,.108112,1.24474,.967012,-.0427586,.0708478,1.27718,.984183,-.0147043,.032335,1.3083,.999577,.0142165,-.00726867,1.3382,.0229227,-299799e-11,.148623,4.62391e-7,.0232194,-758796e-10,.15054,117033e-10,.0232315,-303636e-9,.15063,468397e-10,.0232354,-683189e-9,.150624,105472e-9,.0232092,-.0012136,.150445,187744e-9,.0232523,-.00189765,.150679,294847e-9,.0232828,-.00273247,.150789,428013e-9,.0233371,-.00371287,.150995,591134e-9,.0234015,-.00484794,.15118,787642e-9,.023514,-.00612877,.151562,.00102547,.023679,-.00756125,.152116,.00131351,.0239559,-.00914651,.153162,.00166594,.0244334,-.010904,.155133,.00210182,.025139,-.0128615,.158035,.00264406,.0262598,-.0150628,.162751,.00332923,.0277875,-.0175532,.168944,.00419773,.0298472,-.0203981,.176835,.00530034,.0325444,-.023655,.186686,.00669777,.0355581,-.0272982,.196248,.00842661,.0392841,-.0314457,.207352,.0105854,.0436815,-.0361157,.219279,.0132458,.0485272,-.0412932,.230728,.0164736,.0541574,-.0470337,.242994,.0203715,.0609479,-.0535002,.257042,.0250953,.0685228,-.0605409,.27102,.0306856,.0768042,-.0680553,.28406,.037193,.0864844,-.0765011,.299186,.0449795,.0969415,-.0852674,.3132,.0538316,.108478,-.0947333,.327138,.0641149,.121705,-.10481,.342345,.0759185,.136743,-.115474,.358472,.0894116,.152986,-.126536,.374067,.104562,.170397,-.138061,.388267,.121632,.191392,-.150203,.406467,.140996,.211566,-.161751,.418641,.161696,.233567,-.173407,.430418,.184557,.257769,-.185397,.44277,.210092,.28531,-.197048,.457191,.237827,.311726,-.20784,.464712,.267253,.340537,-.218345,.472539,.299332,.372921,-.228306,.482331,.333988,.402924,-.236665,.484378,.369722,.434475,-.244097,.484717,.407836,.469736,-.250547,.487093,.448465,.505045,-.25511,.485575,.490263,.540262,-.258444,.481225,.534495,.576347,-.259903,.473481,.579451,.608656,-.259572,.4603,.625604,.646679,-.257908,.450341,.674511,.679902,-.253663,.431561,.723269,.714159,-.247419,.412684,.773263,.745345,-.239122,.389388,.824182,.778248,-.228837,.365361,.876634,.807208,-.216197,.337667,.92945,.835019,-.201772,.307197,.985261,.860261,-.185291,.274205,1.04299,.877601,-.165809,.240178,1.09816,.898211,-.143897,.207571,1.14694,.915789,-.119513,.174904,1.19008,.931831,-.0932919,.141423,1.2297,.949244,-.0656528,.105603,1.26553,.967527,-.0370262,.0679551,1.29986,.984139,-.00730117,.0283133,1.33252,.999713,.0234648,-.0121785,1.36397,.0152135,-245447e-11,.122795,3.04092e-7,.0151652,-615778e-10,.122399,76292e-10,.0151181,-245948e-9,.122023,304802e-10,.0151203,-553394e-9,.12203,686634e-10,.015125,-983841e-9,.122037,122463e-9,.0151427,-.00153774,.12214,192706e-9,.0151708,-.0022103,.122237,281219e-9,.0152115,-.00300741,.12238,390804e-9,.0152877,-.00392494,.1227,526317e-9,.015412,-.00496597,.123244,69443e-8,.0156201,-.00613314,.124228,90547e-8,.0159658,-.00744113,.125945,.0011732,.0165674,-.00892546,.129098,.00151888,.017487,-.010627,.133865,.00197007,.018839,-.0126043,.140682,.0025637,.020554,-.0148814,.148534,.00333637,.0226727,-.0175123,.157381,.00433738,.0251879,-.0205266,.166685,.00561664,.0283635,-.0240319,.177796,.00725563,.0318694,-.0279432,.188251,.00928811,.0361044,-.0324313,.200038,.011835,.0406656,-.0373527,.210685,.0149146,.0463846,-.0430132,.224182,.0187254,.0525696,-.0491013,.23634,.0232283,.0598083,-.0559175,.250013,.0286521,.0679437,-.0633657,.263981,.0350634,.0771181,-.0714602,.278072,.0425882,.0881273,-.0803502,.29511,.0514487,.0996628,-.0896903,.309976,.0615766,.112702,-.099644,.325611,.0732139,.126488,-.109829,.339321,.0862324,.142625,-.120859,.35574,.101275,.15953,-.131956,.369845,.117892,.176991,-.143145,.38146,.136205,.199715,-.155292,.40052,.157252,.220787,-.167066,.412055,.179966,.243697,-.178396,.423133,.204418,.272106,-.190433,.439524,.232141,.297637,-.201265,.447041,.261109,.325273,-.211834,.454488,.292627,.357219,-.221889,.465004,.326669,.387362,-.230729,.468527,.362426,.423131,-.23924,.475836,.401533,.45543,-.246067,.475017,.441902,.493393,-.251557,.478017,.484239,.526253,-.255571,.4709,.528586,.560554,-.257752,.463167,.574346,.599306,-.258076,.456452,.621655,.634541,-.256471,.443725,.670492,.668907,-.253283,.428719,.721943,.705619,-.247562,.411348,.772477,.739034,-.240626,.388939,.8264,.771408,-.231493,.36425,.881702,.803312,-.220125,.337321,.9385,.828457,-.206645,.305364,.997437,.854819,-.190664,.273715,1.05693,.878666,-.171429,.242218,1.11251,.898404,-.149235,.209556,1.16398,.917416,-.12435,.176863,1.21014,.933133,-.0972703,.142775,1.25178,.95066,-.0683607,.106735,1.29028,.968589,-.0378724,.0681609,1.32703,.984776,-.00605712,.0273966,1.36158,.99994,.0263276,-.0138124,1.3943,.00867437,-186005e-11,.0928979,1.73682e-7,.00864003,-466389e-10,.0925237,435505e-11,.00864593,-186594e-9,.0925806,174322e-10,.00864095,-419639e-9,.0924903,392862e-10,.00863851,-746272e-9,.0924589,702598e-10,.00868531,-.00116456,.0929,111188e-9,.00869667,-.00167711,.0928529,163867e-9,.00874332,-.00228051,.0930914,23104e-8,.00882709,-.00297864,.0935679,31741e-8,.00898874,-.00377557,.0946165,430186e-9,.00929346,-.00469247,.0967406,580383e-9,.00978271,-.00575491,.100084,783529e-9,.0105746,-.00701514,.105447,.00106304,.0116949,-.00851797,.112494,.00144685,.0130419,-.0102757,.119876,.00196439,.0148375,-.012381,.129034,.00266433,.0168725,-.01482,.137812,.00358364,.0193689,-.0176563,.147696,.00478132,.0222691,-.0209211,.157795,.00631721,.0256891,-.0246655,.168431,.00826346,.0294686,-.0288597,.178587,.0106714,.0340412,-.0336441,.190251,.0136629,.0393918,-.039033,.202999,.0173272,.0453947,-.0450087,.215655,.0217448,.0521936,-.0515461,.228686,.0269941,.0600279,-.058817,.242838,.033272,.0692398,-.0667228,.258145,.0406457,.0793832,-.0752401,.273565,.0492239,.0902297,-.0841851,.287735,.0590105,.102014,-.0936479,.301161,.0702021,.116054,-.103967,.317438,.0832001,.13191,-.114622,.334166,.0977951,.148239,-.125452,.348192,.113985,.165809,-.136453,.361094,.131928,.184616,-.147648,.373534,.151811,.207491,-.159607,.39101,.174476,.230106,-.171119,.402504,.198798,.257036,-.182906,.418032,.225796,.281172,-.193605,.425468,.254027,.312034,-.204771,.440379,.285713,.340402,-.214988,.445406,.319196,.370231,-.224711,.44968,.35537,.407105,-.233516,.460747,.393838,.439037,-.240801,.460624,.433747,.47781,-.24762,.465957,.477234,.510655,-.251823,.460054,.52044,.550584,-.255552,.459172,.567853,.585872,-.257036,.450311,.615943,.620466,-.257535,.437763,.667693,.660496,-.255248,.426639,.718988,.695578,-.251141,.409185,.772503,.732176,-.244718,.39015,.827023,.760782,-.236782,.362594,.885651,.79422,-.225923,.33711,.943756,.824521,-.213855,.308272,1.00874,.854964,-.197723,.278529,1.06764,.878065,-.179209,.246208,1.12836,.899834,-.157569,.21329,1.18318,.918815,-.133206,.181038,1.23161,.934934,-.106545,.146993,1.27644,.952115,-.0780574,.111175,1.31842,.96906,-.0478279,.0728553,1.35839,.985178,-.0160014,.032579,1.39697,1.00039,.0173126,-.0095256,1.43312,.00384146,-124311e-11,.0613583,7.78271e-8,.00390023,-314043e-10,.0622919,196626e-11,.00389971,-125622e-9,.0622632,787379e-11,.00389491,-282352e-9,.0620659,1778e-8,.00391618,-502512e-9,.0624687,320918e-10,.00392662,-784458e-9,.0625113,515573e-10,.00396053,-.00112907,.0628175,778668e-10,.00401911,-.00153821,.0633286,113811e-9,.00414994,-.0020208,.0646443,16445e-8,.00441223,-.00260007,.0673886,237734e-9,.00484427,-.0033097,.0716528,345929e-9,.00549109,-.00418966,.0774998,505987e-9,.00636293,-.00527331,.0844758,739208e-9,.00746566,-.00660428,.0921325,.00107347,.00876625,-.00818826,.0997067,.00153691,.0103125,-.0100811,.107433,.00217153,.0123309,-.0123643,.117088,.00303427,.0146274,-.0150007,.126438,.00416018,.0172295,-.0180531,.135672,.00561513,.0204248,-.0215962,.146244,.007478,.0241597,-.0256234,.157481,.00981046,.0284693,-.0302209,.169125,.0127148,.033445,-.0353333,.181659,.0162453,.0391251,-.0410845,.1944,.0205417,.0454721,-.0473451,.207082,.0256333,.0530983,-.0542858,.221656,.0317036,.0615356,-.0618384,.236036,.0388319,.0703363,-.0697631,.248398,.046974,.0810391,-.0784757,.263611,.0565246,.0920144,-.0873488,.275857,.0671724,.105584,-.0973652,.292555,.0798105,.119506,-.107271,.306333,.0935945,.134434,-.117608,.318888,.109106,.153399,-.128938,.337552,.127074,.171258,-.139944,.349955,.14643,.191059,-.151288,.361545,.168,.215069,-.163018,.378421,.192082,.237838,-.174226,.38879,.217838,.266965,-.186063,.405857,.246931,.292827,-.196909,.414146,.277505,.324352,-.207473,.426955,.310711,.354427,-.217713,.433429,.346794,.389854,-.227183,.443966,.385237,.420749,-.235131,.44471,.424955,.459597,-.242786,.451729,.468446,.495316,-.248767,.45072,.513422,.534903,-.253351,.450924,.560618,.572369,-.256277,.445266,.609677,.612383,-.2576,.438798,.660995,.644037,-.256931,.421693,.713807,.686749,-.254036,.4109,.767616,.719814,-.249785,.390151,.82533,.754719,-.244283,.367847,.888311,.792022,-.235076,.345013,.948177,.822404,-.225061,.316193,1.01661,.853084,-.211113,.287013,1.08075,.879871,-.19449,.255424,1.14501,.901655,-.174023,.222879,1.20203,.919957,-.1509,.18989,1.25698,.938412,-.124923,.15606,1.30588,.953471,-.0968139,.120512,1.3529,.970451,-.066734,.0828515,1.3986,.985522,-.034734,.0424458,1.44148,1.00099,-.00102222,678929e-9,1.48398,965494e-9,-6.27338e-7,.0306409,1.97672e-8,99168e-8,-158573e-10,.0314638,4.99803e-7,991068e-9,-634012e-10,.031363,200682e-11,974567e-9,-14144e-8,.03036,457312e-11,998079e-9,-252812e-9,.031496,860131e-11,.00102243,-396506e-9,.0319955,148288e-10,.00107877,-577593e-9,.0331376,249141e-10,.00121622,-816816e-9,.0359396,423011e-10,.0014455,-.00113761,.0399652,724613e-10,.00178791,-.00156959,.0450556,123929e-9,.00225668,-.00214064,.0508025,208531e-9,.00285627,-.00287655,.0568443,341969e-9,.0035991,-.00380271,.0630892,544158e-9,.00455524,-.00496264,.0702204,842423e-9,.00569143,-.0063793,.0773426,.00126704,.00716928,-.00813531,.0860839,.00186642,.00885307,-.0101946,.0944079,.00267014,.0109316,-.0126386,.103951,.00374033,.0133704,-.0154876,.113786,.0051304,.0161525,-.0187317,.123477,.00688858,.0194267,-.0224652,.133986,.00910557,.0230967,-.0265976,.143979,.0118074,.0273627,-.0312848,.154645,.0151266,.0323898,-.0365949,.166765,.0191791,.0379225,-.0422914,.177932,.0239236,.0447501,-.0487469,.19167,.0296568,.0519391,-.0556398,.203224,.0362924,.0599464,-.0631646,.215652,.0440585,.0702427,-.0714308,.232089,.0531619,.0806902,-.0800605,.245258,.0634564,.0923194,-.0892815,.258609,.0752481,.106938,-.09931,.276654,.0888914,.121238,-.109575,.289847,.104055,.138817,-.120461,.307566,.121266,.15595,-.131209,.320117,.139944,.178418,-.143049,.339677,.161591,.197875,-.154074,.349886,.184303,.224368,-.166307,.369352,.210669,.252213,-.178051,.386242,.238895,.277321,-.189335,.395294,.269182,.310332,-.200683,.412148,.302508,.338809,-.210856,.418266,.337264,.372678,-.220655,.428723,.374881,.405632,-.230053,.433887,.415656,.442293,-.237993,.439911,.457982,.477256,-.244897,.440175,.502831,.515592,-.250657,.441079,.550277,.550969,-.255459,.435219,.601102,.592883,-.257696,.432882,.651785,.629092,-.259894,.421054,.708961,.672033,-.258592,.41177,.763806,.709147,-.256525,.395267,.824249,.745367,-.254677,.375013,.8951,.784715,-.247892,.353906,.959317,.818107,-.240162,.327801,1.03153,.847895,-.229741,.298821,1.10601,.879603,-.213084,.269115,1.164,.902605,-.195242,.236606,1.22854,.922788,-.174505,.203442,1.29017,.944831,-.150169,.169594,1.34157,.959656,-.124099,.135909,1.3956,.972399,-.0960626,.0990563,1.45128,.986549,-.0657097,.0602348,1.50312,1.00013,-.0333558,.0186694,1.55364,619747e-11,-1e-7,.00778326,796756e-16,2.37499e-8,-9.99999e-8,282592e-10,1.14596e-10,100292e-11,-166369e-11,250354e-9,6.77492e-9,350752e-11,-637769e-11,357289e-9,6.31655e-8,826445e-11,-174689e-10,516179e-9,3.1851e-7,242481e-10,-450868e-10,.0010223,130577e-11,455631e-10,-89044e-9,.00144302,374587e-11,971222e-10,-178311e-9,.00241912,102584e-10,171403e-9,-313976e-9,.00354938,236481e-10,292747e-9,-520026e-9,.00513765,496014e-10,789827e-9,-.00118187,.0238621,139056e-9,.00114093,-.00171827,.0286691,244093e-9,.00176119,-.00249667,.0368565,420623e-9,.0022233,-.00333742,.0400469,65673e-8,.00343382,-.00481976,.0535751,.00109323,.00427602,-.00600755,.057099,.00155268,.00461435,-.00737637,.0551084,.00215031,.00695698,-.00971401,.0715767,.00316529,.00867619,-.0120943,.0793314,.00436995,.0106694,-.0148202,.0869391,.0058959,.0140351,-.0183501,.101572,.00798757,.0168939,-.022006,.11018,.0104233,.020197,-.0261568,.119041,.0134167,.0254702,-.0312778,.135404,.0173009,.0298384,-.0362469,.1437,.0215428,.035159,-.042237,.15512,.0268882,.0427685,-.0488711,.17128,.033235,.0494848,-.0557997,.181813,.0404443,.0592394,-.0635578,.198745,.0490043,.0681463,-.071838,.210497,.0588239,.0804753,-.0809297,.228864,.0702835,.0942205,-.0906488,.247008,.0834012,.106777,-.100216,.258812,.0975952,.124471,-.110827,.278617,.114162,.138389,-.121193,.287049,.131983,.159543,-.13253,.307151,.152541,.176432,-.143611,.31564,.174673,.201723,-.15548,.33538,.199842,.229721,-.167166,.355256,.227097,.250206,-.178238,.360047,.256014,.282118,-.189905,.378761,.28855,.312821,-.201033,.39181,.323348,.341482,-.211584,.397716,.360564,.377368,-.221314,.410141,.400004,.418229,-.230474,.423485,.442371,.444881,-.239443,.418874,.488796,.488899,-.245987,.427545,.535012,.520317,-.253948,.422147,.589678,.568566,-.256616,.42719,.637683,.599607,-.26376,.415114,.703363,.64222,-.268687,.408715,.771363,.685698,-.2694,.399722,.83574,.732327,-.266642,.388651,.897764,.769873,-.267712,.369198,.983312,.806733,-.263479,.346802,1.06222,.843466,-.254575,.321368,1.13477,.873008,-.242749,.29211,1.20712,.908438,-.22725,.262143,1.27465,.936321,-.207621,.228876,1.33203,.950353,-.187932,.19484,1.40439,.96442,-.165154,.163178,1.4732,.979856,-.139302,.127531,1.53574,.982561,-.11134,.0903457,1.59982,.996389,-.0808124,.0489007,1.6577],t=[1,0,0,0,1,791421e-36,0,0,1,104392e-29,0,0,1,349405e-26,0,0,1,109923e-23,0,0,1,947414e-22,0,0,1,359627e-20,0,0,1,772053e-19,0,0,1,108799e-17,0,0,1,110655e-16,0,0,1,865818e-16,0,0,.999998,5.45037e-10,0,0,.999994,2.85095e-9,0,0,.999989,1.26931e-8,0,0,.999973,4.89938e-8,0,0,.999947,1.66347e-7,0,0,.999894,5.02694e-7,0,0,.999798,136532e-11,0,0,.999617,335898e-11,0,0,.999234,752126e-11,0,0,.998258,152586e-10,0,0,.99504,266207e-10,0,0,.980816,236802e-10,0,0,.967553,207684e-11,0,0,.966877,403733e-11,0,0,.965752,741174e-11,0,0,.96382,127746e-10,0,0,.960306,202792e-10,0,0,.953619,280232e-10,0,0,.941103,278816e-10,0,0,.926619,160221e-10,0,0,.920983,235164e-10,0,0,.912293,311924e-10,0,.0158731,.899277,348118e-10,0,.0476191,.880884,26041e-9,0,.0793651,.870399,338726e-10,0,.111111,.856138,392906e-10,0,.142857,.837436,372874e-10,0,.174603,.820973,392558e-10,0,.206349,.803583,434658e-10,0,.238095,.782168,40256e-9,0,.269841,.764107,448159e-10,0,.301587,.743092,457627e-10,0,.333333,.721626,455314e-10,0,.365079,.700375,477335e-10,0,.396825,.677334,461072e-10,0,.428571,.655702,484393e-10,0,.460317,.632059,464583e-10,0,.492064,.610125,483923e-10,0,.52381,.58653,464342e-10,0,.555556,.564508,477033e-10,0,.587302,.541405,459263e-10,0,.619048,.519556,46412e-9,0,.650794,.497292,448913e-10,0,.68254,.475898,445789e-10,0,.714286,.454722,433496e-10,0,.746032,.434042,423054e-10,0,.777778,.414126,413737e-10,0,.809524,.394387,397265e-10,0,.84127,.375841,390709e-10,0,.873016,.357219,369938e-10,0,.904762,.340084,365618e-10,0,.936508,.322714,342533e-10,0,.968254,.306974,339596e-10,0,1,1,101524e-23,0,0,1,10292e-22,0,0,1,130908e-23,0,0,1,473331e-23,0,0,1,625319e-22,0,0,1,107932e-20,0,0,1,163779e-19,0,0,1,203198e-18,0,0,1,204717e-17,0,0,.999999,168995e-16,0,0,.999998,1.15855e-10,0,0,.999996,6.6947e-10,0,0,.999991,3.30863e-9,0,0,.999983,1.41737e-8,0,0,.999968,5.32626e-8,0,0,.99994,1.77431e-7,0,0,.999891,5.28835e-7,0,0,.999797,142169e-11,0,0,.999617,347057e-11,0,0,.999227,77231e-10,0,0,.998239,155753e-10,0,0,.994937,268495e-10,0,0,.980225,213742e-10,0,0,.967549,21631e-10,0,0,.966865,417989e-11,0,0,.965739,763341e-11,0,0,.963794,130892e-10,0,0,.960244,206456e-10,0,0,.953495,282016e-10,0,148105e-9,.940876,271581e-10,0,.002454,.926569,164159e-10,0,.00867491,.920905,239521e-10,0,.01956,.912169,315127e-10,0,.035433,.899095,346626e-10,0,.056294,.882209,290223e-10,0,.0818191,.870272,342992e-10,0,.111259,.855977,394164e-10,0,.142857,.837431,372343e-10,0,.174603,.820826,396691e-10,0,.206349,.803408,435395e-10,0,.238095,.782838,419579e-10,0,.269841,.763941,450953e-10,0,.301587,.742904,455847e-10,0,.333333,.721463,458833e-10,0,.365079,.700197,477159e-10,0,.396825,.677501,470641e-10,0,.428571,.655527,484732e-10,0,.460317,.6324,476834e-10,0,.492064,.609964,484213e-10,0,.52381,.586839,475541e-10,0,.555556,.564353,476951e-10,0,.587302,.541589,467611e-10,0,.619048,.519413,463493e-10,0,.650794,.497337,453994e-10,0,.68254,.475797,445308e-10,0,.714286,.454659,435787e-10,0,.746032,.434065,424839e-10,0,.777778,.414018,41436e-9,0,.809524,.39455,401902e-10,0,.84127,.375742,390813e-10,0,.873016,.357501,377116e-10,0,.904762,.339996,36535e-9,0,.936508,.323069,351265e-10,0,.968254,.306897,339112e-10,0,1,1,10396e-19,0,0,1,104326e-20,0,0,1,110153e-20,0,0,1,144668e-20,0,0,1,34528e-19,0,0,1,175958e-19,0,0,1,12627e-17,0,0,1,936074e-18,0,0,1,645742e-17,0,0,.999998,401228e-16,0,0,.999997,2.22338e-10,0,0,.999995,1.0967e-9,0,0,.999991,4.82132e-9,0,0,.999981,1.89434e-8,0,0,.999967,6.67716e-8,0,0,.999938,2.12066e-7,0,0,.999886,6.0977e-7,0,0,.999792,159504e-11,0,0,.999608,381191e-11,0,0,.999209,833727e-11,0,0,.998179,165288e-10,0,0,.994605,274387e-10,0,0,.979468,167316e-10,0,0,.967529,242877e-11,0,0,.966836,461696e-11,0,0,.96569,830977e-11,0,0,.963706,140427e-10,0,244659e-11,.960063,217353e-10,0,760774e-9,.953113,286606e-10,0,.00367261,.940192,247691e-10,0,.00940263,.927731,195814e-10,0,.018333,.920669,252531e-10,0,.0306825,.911799,324277e-10,0,.0465556,.89857,340982e-10,0,.0659521,.883283,319622e-10,0,.0887677,.86989,35548e-9,0,.114784,.855483,397143e-10,0,.143618,.837987,391665e-10,0,.174606,.820546,411306e-10,0,.206349,.802878,436753e-10,0,.238095,.783402,444e-7,0,.269841,.763439,458726e-10,0,.301587,.742925,467097e-10,0,.333333,.721633,478887e-10,0,.365079,.69985,481251e-10,0,.396825,.67783,491811e-10,0,.428571,.655126,488199e-10,0,.460318,.632697,496025e-10,0,.492064,.609613,48829e-9,0,.52381,.587098,492754e-10,0,.555556,.564119,482625e-10,0,.587302,.541813,482807e-10,0,.619048,.519342,471552e-10,0,.650794,.497514,466765e-10,0,.68254,.475879,455582e-10,0,.714286,.454789,446007e-10,0,.746032,.434217,435382e-10,0,.777778,.414086,421753e-10,0,.809524,.394744,412093e-10,0,.84127,.375782,396634e-10,0,.873016,.357707,386419e-10,0,.904762,.340038,370345e-10,0,.936508,.323284,359725e-10,0,.968254,.306954,3436e-8,0,1,1,599567e-19,0,0,1,600497e-19,0,0,1,614839e-19,0,0,1,686641e-19,0,0,1,972658e-19,0,0,1,221271e-18,0,0,1,833195e-18,0,0,1,403601e-17,0,0,.999999,206001e-16,0,0,.999998,1.01739e-10,0,0,.999997,4.70132e-10,0,0,.999993,2.00436e-9,0,0,.999988,7.83682e-9,0,0,.999979,2.80338e-8,0,0,.999962,9.17033e-8,0,0,.999933,2.74514e-7,0,0,.999881,7.53201e-7,0,0,.999783,189826e-11,0,0,.999594,440279e-11,0,0,.999178,93898e-10,0,0,.998073,181265e-10,0,0,.993993,280487e-10,0,0,.979982,149422e-10,0,0,.968145,378481e-11,0,0,.966786,53771e-10,0,0,.965611,947508e-11,0,388934e-10,.963557,156616e-10,0,9693e-7,.959752,235144e-10,0,.00370329,.952461,291568e-10,0,.00868428,.940193,240102e-10,0,.0161889,.929042,231235e-10,0,.0263948,.920266,273968e-10,0,.0394088,.911178,337915e-10,0,.0552818,.897873,333629e-10,0,.0740138,.884053,351405e-10,0,.0955539,.869455,378034e-10,0,.119795,.854655,399378e-10,0,.14656,.838347,419108e-10,0,.175573,.820693,440831e-10,0,.206388,.802277,445599e-10,0,.238095,.783634,472691e-10,0,.269841,.763159,476984e-10,0,.301587,.742914,491487e-10,0,.333333,.721662,502312e-10,0,.365079,.699668,502817e-10,0,.396825,.677839,51406e-9,0,.428571,.655091,511095e-10,0,.460317,.632665,516067e-10,0,.492064,.609734,512255e-10,0,.52381,.587043,510263e-10,0,.555556,.564298,50565e-9,0,.587302,.541769,497951e-10,0,.619048,.519529,492698e-10,0,.650794,.497574,482066e-10,0,.68254,.476028,473689e-10,0,.714286,.454961,461941e-10,0,.746032,.434341,450618e-10,0,.777778,.414364,438355e-10,0,.809524,.394832,424196e-10,0,.84127,.376109,412563e-10,0,.873016,.35779,396226e-10,0,.904762,.340379,384886e-10,0,.936508,.323385,368214e-10,0,.968254,.307295,356636e-10,0,1,1,106465e-17,0,0,1,106555e-17,0,0,1,107966e-17,0,0,1,114601e-17,0,0,1,137123e-17,0,0,1,21243e-16,0,0,.999999,489653e-17,0,0,.999999,160283e-16,0,0,.999998,62269e-15,0,0,.999997,2.51859e-10,0,0,.999996,9.96192e-10,0,0,.999992,3.74531e-9,0,0,.999986,1.32022e-8,0,0,.999975,4.33315e-8,0,0,.999959,1.31956e-7,0,0,.999927,3.72249e-7,0,0,.999871,9.72461e-7,0,0,.999771,235343e-11,0,0,.999572,52768e-10,0,0,.999133,109237e-10,0,0,.997912,203675e-10,0,0,.993008,279396e-10,0,0,.980645,139604e-10,0,0,.970057,646596e-11,0,0,.966717,65089e-10,0,474145e-10,.965497,111863e-10,0,89544e-8,.96334,179857e-10,0,.0032647,.959294,259045e-10,0,.0075144,.951519,292327e-10,0,.0138734,.940517,249769e-10,0,.0224952,.93014,26803e-9,0,.0334828,.91972,303656e-10,0,.0468973,.910294,353323e-10,0,.0627703,.897701,351002e-10,0,.0811019,.884522,388104e-10,0,.10186,.869489,412932e-10,0,.124985,.853983,415781e-10,0,.150372,.838425,454066e-10,0,.177868,.820656,471624e-10,0,.207245,.801875,475243e-10,0,.238143,.783521,505621e-10,0,.269841,.763131,50721e-9,0,.301587,.74261,523293e-10,0,.333333,.72148,528699e-10,0,.365079,.699696,538677e-10,0,.396825,.677592,539255e-10,0,.428571,.65525,546367e-10,0,.460317,.632452,541348e-10,0,.492064,.609903,544976e-10,0,.52381,.586928,536201e-10,0,.555556,.564464,535185e-10,0,.587302,.541801,524949e-10,0,.619048,.519681,51812e-9,0,.650794,.497685,507687e-10,0,.68254,.47622,496243e-10,0,.714286,.455135,485714e-10,0,.746032,.4346,471847e-10,0,.777778,.414564,459294e-10,0,.809524,.395165,444705e-10,0,.84127,.376333,430772e-10,0,.873016,.358197,416229e-10,0,.904762,.34064,401019e-10,0,.936508,.323816,386623e-10,0,.968254,.307581,370933e-10,0,1,1,991541e-17,0,0,1,992077e-17,0,0,1,100041e-16,0,0,1,10385e-15,0,0,1,115777e-16,0,0,1,150215e-16,0,0,.999999,254738e-16,0,0,.999999,598822e-16,0,0,.999998,1.79597e-10,0,0,.999997,6.02367e-10,0,0,.999994,2.06835e-9,0,0,.99999,6.94952e-9,0,0,.999984,2.23363e-8,0,0,.999972,6.78578e-8,0,0,.999952,1.93571e-7,0,0,.999919,5.16594e-7,0,0,.99986,128739e-11,0,0,.999753,299298e-11,0,0,.999546,648258e-11,0,0,.999074,129985e-10,0,0,.997671,232176e-10,0,0,.991504,256701e-10,0,0,.981148,131141e-10,0,0,.971965,869048e-11,0,280182e-10,.966624,808301e-11,0,695475e-9,.965344,135235e-10,0,.00265522,.963048,210592e-10,0,.00622975,.958673,287473e-10,0,.0116234,.950262,281379e-10,0,.018976,.940836,271089e-10,0,.0283844,.930996,30926e-9,0,.0399151,.919848,348359e-10,0,.0536063,.909136,366092e-10,0,.0694793,.897554,384162e-10,0,.0875342,.884691,430971e-10,0,.107749,.869414,447803e-10,0,.130087,.853462,452858e-10,0,.154481,.838187,495769e-10,0,.180833,.820381,502709e-10,0,.209005,.801844,522713e-10,0,.238791,.783061,541505e-10,0,.269869,.763205,553712e-10,0,.301587,.742362,564909e-10,0,.333333,.721393,572646e-10,0,.365079,.699676,581012e-10,0,.396825,.677395,58096e-9,0,.428571,.655208,585766e-10,0,.460317,.632451,583602e-10,0,.492064,.609839,580234e-10,0,.52381,.587093,577161e-10,0,.555556,.564467,568447e-10,0,.587302,.542043,563166e-10,0,.619048,.519826,55156e-9,0,.650794,.497952,541682e-10,0,.68254,.476477,528971e-10,0,.714286,.455412,514952e-10,0,.746032,.434926,502222e-10,0,.777778,.4149,485779e-10,0,.809524,.395552,472242e-10,0,.84127,.376712,454891e-10,0,.873016,.358622,440924e-10,0,.904762,.341048,422984e-10,0,.936508,.324262,408582e-10,0,.968254,.308013,390839e-10,0,1,1,613913e-16,0,0,1,614145e-16,0,0,1,617708e-16,0,0,1,633717e-16,0,0,1,681648e-16,0,0,1,808291e-16,0,0,1,1.14608e-10,0,0,.999998,2.10507e-10,0,0,.999997,4.99595e-10,0,0,.999995,1.39897e-9,0,0,.999994,4.19818e-9,0,0,.999988,1.27042e-8,0,0,.999979,3.75153e-8,0,0,.999965,1.06206e-7,0,0,.999945,2.85381e-7,0,0,.999908,7.23611e-7,0,0,.999846,17255e-10,0,0,.999733,386104e-11,0,0,.999511,808493e-11,0,0,.998993,156884e-10,0,0,.997326,265538e-10,0,0,.989706,206466e-10,0,0,.981713,130756e-10,0,70005e-10,.973636,106473e-10,0,464797e-9,.966509,10194e-9,0,.00201743,.965149,165881e-10,0,.00497549,.962669,249147e-10,0,.00953262,.95786,317449e-10,0,.0158211,.949334,281045e-10,0,.0239343,.941041,303263e-10,0,.0339372,.931575,356754e-10,0,.0458738,.920102,397075e-10,0,.059772,.908002,384886e-10,0,.075645,.897269,43027e-9,0,.0934929,.884559,479925e-10,0,.113302,.869161,48246e-9,0,.135045,.853342,509505e-10,0,.158678,.837633,542846e-10,0,.184136,.820252,554139e-10,0,.211325,.801872,581412e-10,0,.240113,.782418,585535e-10,0,.270306,.7631,610923e-10,0,.301594,.742183,613678e-10,0,.333333,.721098,627275e-10,0,.365079,.699512,629413e-10,0,.396825,.677372,636351e-10,0,.428571,.655059,633555e-10,0,.460317,.632567,636513e-10,0,.492064,.609784,628965e-10,0,.52381,.587237,625546e-10,0,.555556,.564525,615825e-10,0,.587302,.542181,605048e-10,0,.619048,.520017,596329e-10,0,.650794,.498204,581516e-10,0,.68254,.476742,569186e-10,0,.714286,.455803,553833e-10,0,.746032,.435251,537807e-10,0,.777778,.415374,522025e-10,0,.809524,.395921,503421e-10,0,.84127,.377253,488211e-10,0,.873016,.359021,468234e-10,0,.904762,.341637,453269e-10,0,.936508,.3247,433014e-10,0,.968254,.308625,418007e-10,0,1,1,2.86798e-10,0,0,1,2.86877e-10,0,0,1,2.88094e-10,0,0,1,2.93506e-10,0,0,1,3.09262e-10,0,0,.999999,3.48593e-10,0,0,.999999,4.44582e-10,0,0,.999998,6.88591e-10,0,0,.999996,1.34391e-9,0,0,.999993,3.17438e-9,0,0,.999989,8.35609e-9,0,0,.999983,2.28677e-8,0,0,.999974,6.23361e-8,0,0,.999959,1.65225e-7,0,0,.999936,4.19983e-7,0,0,.999896,101546e-11,0,0,.99983,232376e-11,0,0,.999709,50156e-10,0,0,.999469,10167e-9,0,0,.998886,190775e-10,0,0,.996819,300511e-10,0,0,.988837,185092e-10,0,1.68222e-7,.982178,134622e-10,0,259622e-9,.975017,125961e-10,0,.00142595,.967101,13507e-9,0,.00382273,.964905,205003e-10,0,.00764164,.96218,29546e-9,0,.0130121,.956821,343738e-10,0,.0200253,.948829,305063e-10,0,.0287452,.941092,346487e-10,0,.039218,.931883,412061e-10,0,.0514748,.920211,444651e-10,0,.0655351,.907307,431252e-10,0,.0814082,.89684,490382e-10,0,.0990939,.884119,53334e-9,0,.118583,.869148,54114e-9,0,.139856,.853377,578536e-10,0,.162882,.836753,592285e-10,0,.187615,.820063,622787e-10,0,.213991,.801694,645492e-10,0,.241918,.782116,65353e-9,0,.271267,.762673,674344e-10,0,.301847,.742133,682788e-10,0,.333333,.720779,691959e-10,0,.365079,.699386,696817e-10,0,.396826,.67732,699583e-10,0,.428572,.654888,698447e-10,0,.460318,.632499,694063e-10,0,.492064,.609825,691612e-10,0,.52381,.587287,681576e-10,0,.555556,.564743,674138e-10,0,.587302,.542409,661617e-10,0,.619048,.520282,647785e-10,0,.650794,.498506,633836e-10,0,.68254,.477102,615905e-10,0,.714286,.456167,601013e-10,0,.746032,.435728,581457e-10,0,.777778,.415809,564215e-10,0,.809524,.396517,544997e-10,0,.84127,.377737,525061e-10,0,.873016,.359698,506831e-10,0,.904762,.342164,48568e-9,0,.936508,.325417,467826e-10,0,.968254,.309186,446736e-10,0,1,1,1.09018e-9,0,0,1,1.0904e-9,0,0,1,1.09393e-9,0,0,1,1.1095e-9,0,0,1,1.154e-9,0,0,1,1.26089e-9,0,0,.999999,1.5059e-9,0,0,.999997,2.07899e-9,0,0,.999994,3.48164e-9,0,0,.999993,7.05728e-9,0,0,.999987,1.63692e-8,0,0,.999981,4.06033e-8,0,0,.999969,1.0245e-7,0,0,.999953,2.55023e-7,0,0,.999925,6.1511e-7,0,0,.999881,142218e-11,0,0,.99981,313086e-11,0,0,.99968,653119e-11,0,0,.999418,12832e-9,0,0,.998748,232497e-10,0,0,.996066,329522e-10,0,0,.988379,179613e-10,0,108799e-9,.982567,143715e-10,0,921302e-9,.976097,148096e-10,0,.00280738,.968475,178905e-10,0,.00596622,.964606,253921e-10,0,.0105284,.961564,348623e-10,0,.0165848,.955517,357612e-10,0,.0242,.948381,343493e-10,0,.03342,.941095,405849e-10,0,.0442777,.931923,475394e-10,0,.0567958,.91996,484328e-10,0,.0709879,.907419,502146e-10,0,.086861,.89618,561654e-10,0,.104415,.88337,587612e-10,0,.123643,.869046,618057e-10,0,.144531,.853278,657392e-10,0,.167057,.836091,66303e-9,0,.191188,.819644,704445e-10,0,.216878,.801246,714071e-10,0,.244062,.782031,740093e-10,0,.272649,.762066,74685e-9,0,.302509,.741964,766647e-10,0,.333442,.720554,766328e-10,0,.365079,.699098,777857e-10,0,.396826,.677189,774633e-10,0,.428572,.65484,776235e-10,0,.460318,.632496,770316e-10,0,.492064,.609908,762669e-10,0,.52381,.587312,753972e-10,0,.555556,.564938,739994e-10,0,.587302,.542577,728382e-10,0,.619048,.52062,71112e-9,0,.650794,.498819,694004e-10,0,.68254,.477555,675575e-10,0,.714286,.456568,653449e-10,0,.746032,.436278,636068e-10,0,.777778,.41637,613466e-10,0,.809524,.397144,594177e-10,0,.84127,.378412,570987e-10,0,.873016,.360376,550419e-10,0,.904762,.342906,527422e-10,0,.936508,.326136,506544e-10,0,.968254,.30997,484307e-10,0,1,1,3.54014e-9,0,0,1,3.54073e-9,0,0,1,3.54972e-9,0,0,1,3.58929e-9,0,0,1,3.70093e-9,0,0,.999999,3.96194e-9,0,0,.999998,4.53352e-9,0,0,.999997,5.78828e-9,0,0,.999994,8.63812e-9,0,0,.999991,1.53622e-8,0,0,.999985,3.16356e-8,0,0,.999977,7.12781e-8,0,0,.999964,1.66725e-7,0,0,.999945,3.90501e-7,0,0,.999912,8.95622e-7,0,0,.999866,198428e-11,0,0,.999786,421038e-11,0,0,.999647,850239e-11,0,0,.999356,162059e-10,0,0,.998563,282652e-10,0,0,.994928,336309e-10,0,244244e-10,.987999,178458e-10,0,523891e-9,.982893,159162e-10,0,.00194729,.977044,178056e-10,0,.00451099,.969972,230624e-10,0,.00835132,.964237,313922e-10,0,.013561,.960791,406145e-10,0,.0202056,.954292,372796e-10,0,.0283321,.948052,403199e-10,0,.0379739,.940938,479537e-10,0,.0491551,.931689,545292e-10,0,.0618918,.91987,54038e-9,0,.0761941,.907665,589909e-10,0,.0920672,.895281,642651e-10,0,.109511,.882621,659707e-10,0,.12852,.86873,709973e-10,0,.149085,.853008,742221e-10,0,.171189,.835944,761754e-10,0,.194809,.818949,797052e-10,0,.21991,.800951,812434e-10,0,.246447,.781847,838075e-10,0,.274352,.761649,84501e-9,0,.303535,.74152,860258e-10,0,.333857,.720495,866233e-10,0,.365104,.698742,868326e-10,0,.396826,.677096,87133e-9,0,.428572,.654782,863497e-10,0,.460318,.632335,860206e-10,0,.492064,.610031,849337e-10,0,.52381,.587457,838279e-10,0,.555556,.56513,82309e-9,0,.587302,.542877,803542e-10,0,.619048,.5209,786928e-10,0,.650794,.499291,765171e-10,0,.68254,.477971,744753e-10,0,.714286,.457221,72209e-9,0,.746032,.436803,697448e-10,0,.777778,.417083,675333e-10,0,.809524,.397749,648058e-10,0,.84127,.379177,625759e-10,0,.873016,.361061,598584e-10,0,.904762,.343713,575797e-10,0,.936508,.326894,549999e-10,0,.968254,.310816,527482e-10,0,1,1,1.0153e-8,0,0,1,1.01544e-8,0,0,1,1.01751e-8,0,0,1,1.02662e-8,0,0,1,1.0521e-8,0,0,.999999,1.11049e-8,0,0,.999999,1.23408e-8,0,0,.999996,1.4924e-8,0,0,.999992,2.04471e-8,0,0,.999989,3.26539e-8,0,0,.99998,6.03559e-8,0,0,.999971,1.23936e-7,0,0,.999955,2.69058e-7,0,0,.999933,5.93604e-7,0,0,.999901,129633e-11,0,0,.999847,275621e-11,0,0,.999761,564494e-11,0,0,.999607,110485e-10,0,0,.999282,204388e-10,0,0,.99831,341084e-10,0,2.2038e-7,.993288,294949e-10,0,242388e-9,.987855,192736e-10,0,.0012503,.983167,182383e-10,0,.0032745,.977908,218633e-10,0,.00646321,.971194,290662e-10,0,.0109133,.963867,386401e-10,0,.0166927,.95982,462827e-10,0,.0238494,.953497,420705e-10,0,.0324178,.947621,477743e-10,0,.0424225,.940611,568258e-10,0,.0538808,.931174,618061e-10,0,.0668047,.919919,627098e-10,0,.0812014,.907856,694714e-10,0,.0970745,.894509,735008e-10,0,.114424,.881954,763369e-10,0,.133246,.868309,821896e-10,0,.153534,.852511,83769e-9,0,.175275,.835821,881615e-10,0,.198453,.817981,896368e-10,0,.223042,.800504,930906e-10,0,.249009,.78141,945056e-10,0,.276304,.761427,963605e-10,0,.304862,.74094,968088e-10,0,.334584,.720233,981481e-10,0,.365322,.698592,979122e-10,0,.396826,.676763,981057e-10,0,.428571,.654808,973956e-10,0,.460318,.632326,962619e-10,0,.492064,.610049,952996e-10,0,.52381,.58763,933334e-10,0,.555556,.565261,917573e-10,0,.587302,.543244,896636e-10,0,.619048,.521273,873304e-10,0,.650794,.499818,852648e-10,0,.68254,.478536,823961e-10,0,.714286,.457826,79939e-9,0,.746032,.437549,77126e-9,0,.777778,.41776,743043e-10,0,.809524,.39863,716426e-10,0,.84127,.379954,686456e-10,0,.873016,.362025,660514e-10,0,.904762,.344581,630755e-10,0,.936508,.327909,605439e-10,0,.968254,.311736,576345e-10,0,1,1,2.63344e-8,0,0,1,2.63373e-8,0,0,1,2.63815e-8,0,0,1,2.65753e-8,0,0,1,2.71132e-8,0,0,.999999,2.83279e-8,0,0,.999997,3.0833e-8,0,0,.999995,3.58711e-8,0,0,.999992,4.61266e-8,0,0,.999985,6.7574e-8,0,0,.999977,1.1358e-7,0,0,.999966,2.13657e-7,0,0,.999948,4.31151e-7,0,0,.999923,8.96656e-7,0,0,.999884,186603e-11,0,0,.999826,381115e-11,0,0,.999732,754184e-11,0,0,.999561,143192e-10,0,0,.999191,257061e-10,0,0,.997955,405724e-10,0,744132e-10,.992228,276537e-10,0,716477e-9,.987638,208885e-10,0,.0022524,.983395,215226e-10,0,.00484816,.978614,270795e-10,0,.00860962,.972389,365282e-10,0,.0136083,.964392,474747e-10,0,.0198941,.95861,509141e-10,0,.0275023,.952806,48963e-9,0,.0364584,.94712,571119e-10,0,.04678,.940104,671704e-10,0,.0584799,.930398,687586e-10,0,.0715665,.919866,738161e-10,0,.086045,.907853,813235e-10,0,.101918,.894078,834582e-10,0,.119186,.881177,892093e-10,0,.137845,.867575,944548e-10,0,.157891,.852107,969607e-10,0,.179316,.835502,101456e-9,0,.202106,.81756,103256e-9,0,.226243,.79984,106954e-9,0,.251704,.780998,108066e-9,0,.278451,.761132,110111e-9,0,.306436,.740429,110459e-9,0,.335586,.719836,111219e-9,0,.365796,.698467,11145e-8,0,.3969,.676446,110393e-9,0,.428571,.654635,110035e-9,0,.460318,.632411,108548e-9,0,.492064,.609986,106963e-9,0,.52381,.587872,105238e-9,0,.555556,.565528,102665e-9,0,.587302,.543563,100543e-9,0,.619048,.52176,976182e-10,0,.650794,.500188,947099e-10,0,.68254,.479204,919929e-10,0,.714286,.458413,886139e-10,0,.746032,.438314,857839e-10,0,.777778,.418573,82411e-9,0,.809524,.39947,792211e-10,0,.84127,.380892,759546e-10,0,.873016,.362953,727571e-10,0,.904762,.345601,695738e-10,0,.936508,.328895,664907e-10,0,.968254,.312808,634277e-10,0,1,1,6.28647e-8,0,0,1,6.28705e-8,0,0,1,6.29587e-8,0,0,1,6.33441e-8,0,0,.999999,6.44087e-8,0,0,.999998,6.67856e-8,0,0,.999997,7.15889e-8,0,0,.999995,8.09577e-8,0,0,.999989,9.92764e-8,0,0,.999983,1.35834e-7,0,0,.999974,2.10482e-7,0,0,.999959,3.65215e-7,0,0,.999939,6.86693e-7,0,0,.999911,13472e-10,0,0,.999868,26731e-10,0,0,.999804,524756e-11,0,0,.9997,100403e-10,0,0,.99951,185019e-10,0,0,.999078,322036e-10,0,620676e-11,.997428,470002e-10,0,341552e-9,.99162,287123e-10,0,.00143727,.987479,234706e-10,0,.00349201,.983582,260083e-10,0,.0066242,.979186,337927e-10,0,.0109113,.97325,454689e-10,0,.0164064,.965221,573759e-10,0,.0231463,.957262,544114e-10,0,.0311571,.952211,587006e-10,0,.0404572,.946631,692256e-10,0,.0510592,.939391,787819e-10,0,.0629723,.929795,792368e-10,0,.0762025,.91965,875075e-10,0,.090753,.907737,950903e-10,0,.106626,.893899,972963e-10,0,.123822,.880239,10459e-8,0,.142337,.866562,107689e-9,0,.16217,.85164,113081e-9,0,.183314,.835021,116636e-9,0,.20576,.817311,120074e-9,0,.229496,.798845,121921e-9,0,.254502,.780479,12475e-8,0,.280753,.760694,125255e-9,0,.308212,.740142,126719e-9,0,.336825,.719248,12636e-8,0,.366517,.698209,126712e-9,0,.397167,.676398,125769e-9,0,.428578,.654378,124432e-9,0,.460318,.632484,123272e-9,0,.492064,.610113,12085e-8,0,.52381,.587931,118411e-9,0,.555556,.565872,11569e-8,0,.587302,.543814,112521e-9,0,.619048,.522265,109737e-9,0,.650794,.500835,106228e-9,0,.68254,.479818,102591e-9,0,.714286,.459258,991288e-10,0,.746032,.439061,952325e-10,0,.777778,.419552,91895e-9,0,.809524,.400399,879051e-10,0,.84127,.381976,844775e-10,0,.873016,.364009,806316e-10,0,.904762,.346761,771848e-10,0,.936508,.330049,735429e-10,0,.968254,.314018,702103e-10,0,1,1,1.39968e-7,0,0,1,1.39979e-7,0,0,1,1.40145e-7,0,0,1,1.4087e-7,0,0,.999999,1.42865e-7,0,0,.999998,1.47279e-7,0,0,.999997,1.56057e-7,0,0,.999992,1.7276e-7,0,0,.999989,2.04352e-7,0,0,.99998,2.6494e-7,0,0,.999969,3.83435e-7,0,0,.999953,6.18641e-7,0,0,.999929,108755e-11,0,0,.999898,201497e-11,0,0,.999849,381346e-11,0,0,.999778,719815e-11,0,0,.999661,133215e-10,0,0,.999451,238313e-10,0,0,.998936,401343e-10,0,113724e-9,.99662,517346e-10,0,820171e-9,.991094,304323e-10,0,.00238143,.987487,281757e-10,0,.00493527,.983731,320048e-10,0,.00856859,.979647,423905e-10,0,.0133393,.973837,562935e-10,0,.0192863,.96584,677442e-10,0,.0264369,.956309,623073e-10,0,.03481,.951523,704131e-10,0,.0444184,.946003,836594e-10,0,.0552713,.938454,911736e-10,0,.0673749,.929279,938264e-10,0,.0807329,.919239,103754e-9,0,.0953479,.907293,109928e-9,0,.111221,.893936,115257e-9,0,.128352,.879674,122265e-9,0,.14674,.865668,125733e-9,0,.166382,.850998,132305e-9,0,.187276,.834498,134844e-9,0,.209413,.816903,139276e-9,0,.232786,.798235,140984e-9,0,.257382,.779724,14378e-8,0,.283181,.760251,144623e-9,0,.310156,.739808,145228e-9,0,.338269,.718762,14539e-8,0,.367461,.697815,144432e-9,0,.397646,.67631,143893e-9,0,.428685,.654278,141846e-9,0,.460318,.632347,13935e-8,0,.492064,.610296,137138e-9,0,.52381,.588039,133806e-9,0,.555556,.566218,130755e-9,0,.587302,.544346,127128e-9,0,.619048,.522701,123002e-9,0,.650794,.501542,119443e-9,0,.68254,.480508,115055e-9,0,.714286,.460092,111032e-9,0,.746032,.440021,106635e-9,0,.777778,.420446,102162e-9,0,.809524,.401512,98184e-9,0,.84127,.38299,936497e-10,0,.873016,.365232,89813e-9,0,.904762,.347865,853073e-10,0,.936508,.331342,817068e-10,0,.968254,.315202,773818e-10,0,1,1,2.9368e-7,0,0,1,2.937e-7,0,0,1,2.93998e-7,0,0,1,2.95298e-7,0,0,.999999,2.98865e-7,0,0,.999998,3.067e-7,0,0,.999995,3.22082e-7,0,0,.999992,3.50767e-7,0,0,.999986,4.03538e-7,0,0,.999976,5.01372e-7,0,0,.999964,6.8562e-7,0,0,.999945,10374e-10,0,0,.999919,171269e-11,0,0,.999882,300175e-11,0,0,.999829,542144e-11,0,0,.999749,984182e-11,0,0,.99962,176213e-10,0,0,.999382,305995e-10,0,138418e-10,.998751,496686e-10,0,389844e-9,.995344,510733e-10,0,.00150343,.990768,345829e-10,0,.00352451,.987464,342841e-10,0,.00655379,.983846,399072e-10,0,.0106554,.980007,533219e-10,0,.0158723,.974494,696992e-10,0,.0222333,.96622,776754e-10,0,.029758,.956273,747718e-10,0,.0384596,.950952,864611e-10,0,.0483473,.945215,100464e-9,0,.0594266,.937287,103729e-9,0,.0717019,.928649,111665e-9,0,.0851752,.918791,12353e-8,0,.0998479,.906685,127115e-9,0,.115721,.893706,13628e-8,0,.132794,.879248,142427e-9,0,.151067,.864685,148091e-9,0,.170538,.850032,153517e-9,0,.191204,.833853,157322e-9,0,.213063,.816353,161086e-9,0,.236107,.797834,164111e-9,0,.260329,.778831,165446e-9,0,.285714,.759756,167492e-9,0,.312243,.739419,166928e-9,0,.339887,.718491,167e-6,0,.368604,.697392,165674e-9,0,.398329,.676102,163815e-9,0,.428961,.654243,162003e-9,0,.460331,.632176,158831e-9,0,.492064,.610407,155463e-9,0,.52381,.588394,152062e-9,0,.555556,.56645,147665e-9,0,.587302,.5449,14375e-8,0,.619048,.523276,138905e-9,0,.650794,.502179,134189e-9,0,.68254,.481359,129392e-9,0,.714286,.46092,124556e-9,0,.746032,.441084,11957e-8,0,.777778,.421517,114652e-9,0,.809524,.402721,109688e-9,0,.84127,.384222,104667e-9,0,.873016,.366534,999633e-10,0,.904762,.349205,950177e-10,0,.936508,.332702,907301e-10,0,.968254,.316599,859769e-10,0,1,1,5.85473e-7,0,0,1,5.85507e-7,0,0,1,5.8602e-7,0,0,.999999,5.88259e-7,0,0,.999999,5.94381e-7,0,0,.999998,6.07754e-7,0,0,.999995,6.33729e-7,0,0,.99999,6.8137e-7,0,0,.999984,7.67003e-7,0,0,.999973,9.21212e-7,0,0,.999959,120218e-11,0,0,.999936,172024e-11,0,0,.999907,268088e-11,0,0,.999866,445512e-11,0,0,.999806,768481e-11,0,0,.999716,1342e-8,0,0,.999576,232473e-10,0,0,.9993,391694e-10,0,129917e-9,.998498,608429e-10,0,845035e-9,.994132,489743e-10,0,.00237616,.99031,384644e-10,0,.00484456,.987409,421768e-10,0,.00832472,.983981,504854e-10,0,.0128643,.980268,671028e-10,0,.0184947,.974875,852749e-10,0,.025237,.966063,85531e-9,0,.0331046,.956779,900588e-10,0,.0421067,.950259,10577e-8,0,.0522487,.944239,119458e-9,0,.0635343,.936341,122164e-9,0,.0759654,.928047,134929e-9,0,.0895434,.918065,145544e-9,0,.104269,.906267,150531e-9,0,.120142,.893419,161652e-9,0,.137163,.878758,16593e-8,0,.15533,.863699,174014e-9,0,.174645,.848876,177877e-9,0,.195106,.833032,184049e-9,0,.21671,.815557,186088e-9,0,.239454,.797323,19054e-8,0,.263332,.778124,191765e-9,0,.288336,.758929,192535e-9,0,.314451,.738979,192688e-9,0,.341658,.718213,191522e-9,0,.369924,.696947,190491e-9,0,.399202,.675807,187913e-9,0,.429416,.654147,184451e-9,0,.460447,.63229,181442e-9,0,.492064,.610499,177139e-9,0,.523809,.588747,172596e-9,0,.555555,.566783,167457e-9,0,.587301,.545359,162518e-9,0,.619048,.523984,156818e-9,0,.650794,.502917,151884e-9,0,.68254,.482294,145514e-9,0,.714286,.461945,140199e-9,0,.746032,.442133,134101e-9,0,.777778,.422705,128374e-9,0,.809524,.403916,122996e-9,0,.84127,.38554,116808e-9,0,.873016,.367909,111973e-9,0,.904762,.350651,105938e-9,0,.936508,.334208,101355e-9,0,.968254,.318123,957629e-10,0,1,1,111633e-11,0,0,1,111639e-11,0,0,1,111725e-11,0,0,1,112096e-11,0,0,.999999,11311e-10,0,0,.999997,115315e-11,0,0,.999995,11956e-10,0,0,.999989,127239e-11,0,0,.999981,140772e-11,0,0,.999969,164541e-11,0,0,.999952,206607e-11,0,0,.999928,281783e-11,0,0,.999895,416835e-11,0,0,.999848,658728e-11,0,0,.999781,108648e-10,0,0,.999682,182579e-10,0,0,.999523,306003e-10,0,159122e-10,.999205,499862e-10,0,391184e-9,.998131,73306e-9,0,.00147534,.993334,513229e-10,0,.0034227,.99016,467783e-10,0,.00632232,.987321,523413e-10,0,.0102295,.984099,64267e-9,0,.0151794,.980432,843042e-10,0,.0211947,.974976,102819e-9,0,.0282899,.966429,996234e-10,0,.0364739,.957633,111074e-9,0,.0457522,.949422,128644e-9,0,.0561278,.943045,140076e-9,0,.0676023,.935448,146349e-9,0,.0801762,.927225,161854e-9,0,.0938499,.917033,169135e-9,0,.108623,.905762,179987e-9,0,.124496,.892879,189832e-9,0,.141469,.878435,195881e-9,0,.159541,.863114,20466e-8,0,.178713,.84776,209473e-9,0,.198985,.832084,214861e-9,0,.220355,.814915,217695e-9,0,.242823,.796711,220313e-9,0,.266385,.777603,22313e-8,0,.291036,.757991,222471e-9,0,.316767,.738371,222869e-9,0,.343563,.717872,221243e-9,0,.371402,.696619,218089e-9,0,.400248,.675379,21562e-8,0,.430047,.65411,21169e-8,0,.460709,.63241,206947e-9,0,.492079,.61046,201709e-9,0,.52381,.58903,196753e-9,0,.555556,.567267,189637e-9,0,.587302,.545886,184735e-9,0,.619048,.524714,177257e-9,0,.650794,.503789,171424e-9,0,.68254,.483204,164688e-9,0,.714286,.462976,157172e-9,0,.746032,.443294,151341e-9,0,.777778,.423988,143737e-9,0,.809524,.405325,138098e-9,0,.84127,.386981,130698e-9,0,.873016,.369436,125276e-9,0,.904762,.35219,118349e-9,0,.936508,.335804,11312e-8,0,.968254,.319749,106687e-9,0,1,1,204685e-11,0,0,1,204694e-11,0,0,1,204831e-11,0,0,.999999,205428e-11,0,0,.999999,207056e-11,0,0,.999997,210581e-11,0,0,.999993,21732e-10,0,0,.999987,229365e-11,0,0,.999979,250243e-11,0,0,.999965,286127e-11,0,0,.999947,348028e-11,0,0,.999918,455588e-11,0,0,.999881,643303e-11,0,0,.999828,970064e-11,0,0,.999753,153233e-10,0,0,.999642,24793e-9,0,0,.999464,402032e-10,0,122947e-9,.999089,635852e-10,0,807414e-9,.997567,857026e-10,0,.00227206,.992903,594912e-10,0,.00462812,.990011,578515e-10,0,.00794162,.987192,65399e-9,0,.0122534,.98418,819675e-10,0,.0175888,.980491,105514e-9,0,.0239635,.974779,121532e-9,0,.031387,.96675,119144e-9,0,.0398644,.958248,136125e-9,0,.0493982,.948884,155408e-9,0,.0599896,.941673,162281e-9,0,.0716382,.934521,176754e-9,0,.0843437,.926205,192873e-9,0,.0981056,.916089,200038e-9,0,.112923,.904963,213624e-9,0,.128796,.892089,221834e-9,0,.145725,.878028,232619e-9,0,.163709,.86249,238632e-9,0,.182749,.846587,247002e-9,0,.202847,.830988,250702e-9,0,.224001,.814165,255562e-9,0,.246214,.796135,257505e-9,0,.269482,.777052,258625e-9,0,.293805,.757201,258398e-9,0,.319176,.737655,256714e-9,0,.345587,.717477,255187e-9,0,.373021,.696433,251792e-9,0,.401454,.675084,247223e-9,0,.430844,.653907,242213e-9,0,.461125,.632561,237397e-9,0,.492187,.610658,229313e-9,0,.52381,.589322,224402e-9,0,.555556,.567857,216116e-9,0,.587302,.54652,209124e-9,0,.619048,.525433,201601e-9,0,.650794,.504679,192957e-9,0,.68254,.484203,186052e-9,0,.714286,.464203,177672e-9,0,.746032,.444549,170005e-9,0,.777778,.425346,162401e-9,0,.809524,.406706,1544e-7,0,.84127,.388576,147437e-9,0,.873016,.37094,139493e-9,0,.904762,.353996,133219e-9,0,.936508,.337391,125573e-9,0,.968254,.321648,119867e-9,0,1,1,362511e-11,0,0,1,362525e-11,0,0,1,362739e-11,0,0,.999999,363673e-11,0,0,.999998,366214e-11,0,0,.999996,371698e-11,0,0,.999992,382116e-11,0,0,.999986,400554e-11,0,0,.999976,432058e-11,0,0,.999961,485194e-11,0,0,.999938,574808e-11,0,0,.999908,726643e-11,0,0,.999865,984707e-11,0,0,.999807,142217e-10,0,0,.999723,215581e-10,0,0,.999602,336114e-10,0,119113e-10,.999398,527353e-10,0,355813e-9,.998946,805809e-10,0,.00137768,.996647,942908e-10,0,.00322469,.992298,668733e-10,0,.00597897,.989802,716564e-10,0,.00968903,.987019,821355e-10,0,.0143845,.984219,104555e-9,0,.0200831,.980425,131245e-9,0,.0267948,.974241,139613e-9,0,.034525,.967006,145931e-9,0,.0432757,.95893,167153e-9,0,.0530471,.949157,188146e-9,0,.0638386,.94062,194625e-9,0,.0756487,.933509,213721e-9,0,.0884762,.925088,229616e-9,0,.10232,.915178,239638e-9,0,.117178,.904093,254814e-9,0,.133051,.891337,263685e-9,0,.149939,.877326,274789e-9,0,.167841,.861794,280534e-9,0,.18676,.845758,289534e-9,0,.206696,.829792,294446e-9,0,.22765,.813037,296877e-9,0,.249625,.795285,300217e-9,0,.27262,.776323,299826e-9,0,.296636,.756673,299787e-9,0,.321671,.736856,297867e-9,0,.347718,.716883,294052e-9,0,.374768,.696089,289462e-9,0,.402804,.67505,285212e-9,0,.431796,.653509,27653e-8,0,.461695,.63258,271759e-9,0,.49242,.61104,262811e-9,0,.523822,.589567,255151e-9,0,.555556,.568322,246434e-9,0,.587302,.547235,237061e-9,0,.619048,.52616,228343e-9,0,.650794,.505716,219236e-9,0,.68254,.485274,209595e-9,0,.714286,.465411,201011e-9,0,.746032,.445854,19109e-8,0,.777778,.426911,182897e-9,0,.809524,.408222,173569e-9,0,.84127,.390307,165496e-9,0,.873016,.372624,156799e-9,0,.904762,.355804,14917e-8,0,.936508,.33924,140907e-9,0,.968254,.323534,134062e-9,0,1,1,622487e-11,0,0,1,62251e-10,0,0,1,622837e-11,0,0,.999999,624259e-11,0,0,.999998,628127e-11,0,0,.999996,636451e-11,0,0,.999991,65218e-10,0,0,.999984,679782e-11,0,0,.999973,726361e-11,0,0,.999955,803644e-11,0,0,.999931,931397e-11,0,0,.999896,114299e-10,0,0,.999847,149402e-10,0,0,.999784,207461e-10,0,0,.999692,302493e-10,0,0,.999554,454957e-10,0,997275e-10,.999326,690762e-10,0,724813e-9,.998757,101605e-9,0,.0020972,.995367,958745e-10,0,.00432324,.99209,832808e-10,0,.00746347,.989517,887601e-10,0,.0115534,.987008,10564e-8,0,.0166134,.98421,133179e-9,0,.0226552,.98021,161746e-9,0,.0296838,.973676,161821e-9,0,.0377016,.967052,178635e-9,0,.0467079,.959385,206765e-9,0,.0567013,.949461,22476e-8,0,.0676796,.939578,23574e-8,0,.0796403,.932416,25893e-8,0,.0925812,.923759,271228e-9,0,.106501,.914223,289165e-9,0,.121397,.902942,301156e-9,0,.13727,.890419,313852e-9,0,.15412,.876639,324408e-9,0,.171946,.861316,33249e-8,0,.190751,.84496,338497e-9,0,.210537,.828427,345861e-9,0,.231305,.811871,347863e-9,0,.253057,.794397,350225e-9,0,.275797,.775726,349915e-9,0,.299525,.75617,347297e-9,0,.324242,.736091,344232e-9,0,.349947,.716213,340835e-9,0,.376633,.695736,332369e-9,0,.404289,.674961,327943e-9,0,.432895,.653518,318533e-9,0,.462415,.632574,310391e-9,0,.492788,.61134,300755e-9,0,.523909,.590017,290506e-9,0,.555556,.568752,280446e-9,0,.587302,.548061,269902e-9,0,.619048,.52711,258815e-9,0,.650794,.506682,248481e-9,0,.68254,.486524,237141e-9,0,.714286,.466812,226872e-9,0,.746032,.44732,216037e-9,0,.777778,.428473,205629e-9,0,.809524,.409921,195691e-9,0,.84127,.392028,185457e-9,0,.873016,.374606,176436e-9,0,.904762,.357601,166508e-9,0,.936508,.341348,158385e-9,0,.968254,.32542,149203e-9,0,1,1,103967e-10,0,0,1,10397e-9,0,0,1,104019e-10,0,0,.999999,104231e-10,0,0,.999998,104806e-10,0,0,.999995,106042e-10,0,0,.999991,108366e-10,0,0,.999982,112415e-10,0,0,.999968,119174e-10,0,0,.99995,130227e-10,0,0,.999922,148176e-10,0,0,.999884,177303e-10,0,0,.99983,224564e-10,0,0,.999758,300966e-10,0,0,.999654,423193e-10,0,549083e-11,.999503,614848e-10,0,296087e-9,.999237,903576e-10,0,.00123144,.998491,1271e-7,0,.00295954,.994594,107754e-9,0,.00555829,.99178,103025e-9,0,.00907209,.989265,11154e-8,0,.0135257,.986998,136296e-9,0,.0189327,.984137,169154e-9,0,.0252993,.979798,196671e-9,0,.0326272,.97337,196678e-9,0,.0409157,.967239,223121e-9,0,.0501623,.959543,253809e-9,0,.0603638,.949466,265972e-9,0,.0715171,.939074,288372e-9,0,.0836187,.931118,310983e-9,0,.0966657,.922525,325561e-9,0,.110656,.912983,345725e-9,0,.125588,.901617,3556e-7,0,.141461,.889487,374012e-9,0,.158275,.875787,383445e-9,0,.176031,.860654,393972e-9,0,.19473,.844417,400311e-9,0,.214374,.82741,405004e-9,0,.234967,.810545,407378e-9,0,.256512,.793312,407351e-9,0,.279011,.774847,406563e-9,0,.302468,.755621,404903e-9,0,.326887,.735511,397486e-9,0,.352266,.715435,39357e-8,0,.378605,.695403,384739e-9,0,.405897,.674681,376108e-9,0,.43413,.65359,365997e-9,0,.463277,.632471,354957e-9,0,.493295,.61151,343593e-9,0,.524106,.59064,331841e-9,0,.555561,.569386,318891e-9,0,.587302,.548785,3072e-7,0,.619048,.528146,29361e-8,0,.650794,.507872,281709e-9,0,.68254,.487805,268627e-9,0,.714286,.468196,255887e-9,0,.746032,.448922,243997e-9,0,.777778,.430093,231662e-9,0,.809524,.411845,220339e-9,0,.84127,.393808,208694e-9,0,.873016,.376615,198045e-9,0,.904762,.359655,187375e-9,0,.936508,.343452,177371e-9,0,.968254,.32765,167525e-9,0,1,1,169351e-10,0,0,1,169356e-10,0,0,1,169427e-10,0,0,.999999,169736e-10,0,0,.999998,170575e-10,0,0,.999995,172372e-10,0,0,.99999,175739e-10,0,0,.999979,181568e-10,0,0,.999966,191206e-10,0,0,.999944,20677e-9,0,0,.999912,231644e-10,0,0,.999869,271268e-10,0,0,.999811,334272e-10,0,0,.99973,433979e-10,0,0,.999617,590083e-10,0,680315e-10,.999445,829497e-10,0,612796e-9,.999138,118019e-9,0,.00187408,.998095,156712e-9,0,.00395791,.993919,125054e-9,0,.00692144,.991333,126091e-9,0,.0107962,.989226,144912e-9,0,.0155986,.986954,175737e-9,0,.0213364,.983982,213883e-9,0,.0280114,.979128,234526e-9,0,.0356226,.973327,243725e-9,0,.0441668,.967416,2773e-7,0,.0536399,.959729,308799e-9,0,.0640376,.949758,322447e-9,0,.0753554,.939173,350021e-9,0,.0875893,.9296,370089e-9,0,.100736,.921181,391365e-9,0,.114793,.91164,413636e-9,0,.129759,.900435,427068e-9,0,.145632,.888183,441046e-9,0,.162412,.874772,454968e-9,0,.180101,.859566,461882e-9,0,.1987,.843579,471556e-9,0,.218213,.826453,474335e-9,0,.238641,.809164,477078e-9,0,.259989,.792179,47755e-8,0,.282262,.773866,472573e-9,0,.305464,.754944,469765e-9,0,.329599,.735133,462371e-9,0,.35467,.714858,453674e-9,0,.380678,.694829,443888e-9,0,.407622,.674453,432052e-9,0,.435493,.653685,420315e-9,0,.464275,.632666,406829e-9,0,.493938,.611676,392234e-9,0,.524422,.591193,379208e-9,0,.555624,.570145,36319e-8,0,.587302,.549566,349111e-9,0,.619048,.529278,334166e-9,0,.650794,.509026,318456e-9,0,.68254,.489186,30449e-8,0,.714286,.469662,289051e-9,0,.746032,.450691,275494e-9,0,.777778,.431841,261437e-9,0,.809524,.413752,247846e-9,0,.84127,.395951,235085e-9,0,.873016,.378633,222245e-9,0,.904762,.36194,210533e-9,0,.936508,.345599,198494e-9,0,.968254,.329999,188133e-9,0,1,1,269663e-10,0,0,1,26967e-9,0,0,1,269772e-10,0,0,.999999,270214e-10,0,0,.999998,271415e-10,0,0,.999994,27398e-9,0,0,.999988,278771e-10,0,0,.999977,287019e-10,0,0,.999961,300544e-10,0,0,.999937,322138e-10,0,0,.999904,356163e-10,0,0,.999854,409465e-10,0,0,.99979,492651e-10,0,0,.999699,621722e-10,0,8.8288e-7,.999572,819715e-10,0,223369e-9,.999381,111689e-9,0,.00105414,.999016,153862e-9,0,.0026493,.997437,187667e-9,0,.00508608,.993545,155672e-9,0,.00840554,.991135,161455e-9,0,.012629,.989157,188241e-9,0,.0177661,.986874,226229e-9,0,.0238198,.983714,268668e-9,0,.0307887,.978301,277109e-9,0,.0386688,.973227,303446e-9,0,.0474554,.967317,341851e-9,0,.0571428,.959477,370885e-9,0,.0677256,.950012,392753e-9,0,.0791988,.939484,42781e-8,0,.0915576,.928135,443866e-9,0,.104798,.919819,472959e-9,0,.118918,.910049,491551e-9,0,.133915,.899181,512616e-9,0,.149788,.886881,523563e-9,0,.166537,.87359,540183e-9,0,.184164,.858613,547386e-9,0,.202669,.842809,554809e-9,0,.222056,.825727,558316e-9,0,.242329,.808086,557824e-9,0,.263492,.790728,556346e-9,0,.285551,.772987,552672e-9,0,.30851,.7541,543738e-9,0,.332376,.734669,536107e-9,0,.357153,.714411,523342e-9,0,.382845,.694196,512238e-9,0,.409454,.674252,497465e-9,0,.436977,.65357,481096e-9,0,.465404,.632999,467054e-9,0,.494713,.611994,448771e-9,0,.524864,.591604,431889e-9,0,.555779,.571134,415238e-9,0,.587302,.550528,396369e-9,0,.619048,.530292,379477e-9,0,.650794,.510364,361488e-9,0,.68254,.490749,343787e-9,0,.714286,.471266,327822e-9,0,.746032,.452462,310626e-9,0,.777778,.433907,295352e-9,0,.809524,.415659,279179e-9,0,.84127,.398138,264685e-9,0,.873016,.380833,249905e-9,0,.904762,.364247,236282e-9,0,.936508,.348041,222905e-9,0,.968254,.332389,210522e-9,0,1,1,420604e-10,0,0,1,420614e-10,0,0,1,420757e-10,0,0,.999999,42138e-9,0,0,.999997,423067e-10,0,0,.999993,426668e-10,0,0,.999986,433372e-10,0,0,.999974,444857e-10,0,0,.999956,463554e-10,0,0,.99993,493105e-10,0,0,.999892,539077e-10,0,0,.999838,610005e-10,0,0,.999767,718822e-10,0,0,.999666,884581e-10,0,365471e-10,.999525,113398e-9,0,485623e-9,.999311,150043e-9,0,.00162096,.998865,200063e-9,0,.00355319,.996278,211014e-9,0,.00633818,.992956,189672e-9,0,.0100043,.991017,210262e-9,0,.0145648,.989055,244292e-9,0,.0200237,.986741,290481e-9,0,.0263798,.983288,334303e-9,0,.033629,.977784,340307e-9,0,.0417652,.973037,377864e-9,0,.0507821,.967181,4239e-7,0,.060673,.958971,443854e-9,0,.0714314,.950093,483039e-9,0,.0830518,.939552,517934e-9,0,.0955288,.927678,539449e-9,0,.108859,.918278,568604e-9,0,.123038,.908449,588505e-9,0,.138065,.897713,612473e-9,0,.153938,.885533,625575e-9,0,.170657,.872131,63854e-8,0,.188224,.857517,647034e-9,0,.20664,.841796,65209e-8,0,.225909,.824726,6544e-7,0,.246035,.807297,655744e-9,0,.267022,.789058,646716e-9,0,.288878,.77189,643898e-9,0,.311607,.753082,629973e-9,0,.335216,.7341,621564e-9,0,.359713,.714094,605171e-9,0,.385103,.693839,588752e-9,0,.41139,.673891,573294e-9,0,.438576,.653565,552682e-9,0,.466656,.633326,533446e-9,0,.495617,.612582,514635e-9,0,.525431,.59205,49303e-8,0,.556041,.571918,471842e-9,0,.587338,.551572,451713e-9,0,.619048,.531553,430049e-9,0,.650794,.51175,410445e-9,0,.68254,.49238,390098e-9,0,.714286,.473143,370033e-9,0,.746032,.45423,351205e-9,0,.777778,.435963,332049e-9,0,.809524,.41787,315021e-9,0,.84127,.400387,297315e-9,0,.873016,.383332,281385e-9,0,.904762,.366665,265397e-9,0,.936508,.350633,250601e-9,0,.968254,.334964,23589e-8,0,1,1,643736e-10,0,0,1,64375e-9,0,0,1,643947e-10,0,0,.999999,64481e-9,0,0,.999997,647143e-10,0,0,.999994,652119e-10,0,0,.999985,661359e-10,0,0,.999972,677116e-10,0,0,.999952,702599e-10,0,0,.999922,742517e-10,0,0,.99988,803906e-10,0,0,.99982,897315e-10,0,0,.999741,103838e-9,0,0,.999629,12496e-8,0,149024e-9,.999474,156161e-9,0,861027e-9,.999229,201034e-9,0,.00231198,.998662,259069e-9,0,.00458147,.995299,245439e-9,0,.00770895,.992732,24498e-8,0,.0117126,.990847,273211e-9,0,.0165989,.988911,316492e-9,0,.0223674,.98654,37161e-8,0,.0290135,.982636,410352e-9,0,.0365309,.977346,421756e-9,0,.0449117,.972909,475578e-9,0,.0541481,.966821,522482e-9,0,.0642326,.958686,545008e-9,0,.075158,.949754,589286e-9,0,.0869181,.939184,619995e-9,0,.0995074,.927505,654266e-9,0,.112922,.916606,682362e-9,0,.127157,.906707,704286e-9,0,.142212,.895937,725909e-9,0,.158085,.883913,743939e-9,0,.174776,.870642,755157e-9,0,.192287,.856241,764387e-9,0,.210619,.84069,771032e-9,0,.229775,.823728,765906e-9,0,.249761,.806481,767604e-9,0,.270582,.787924,754385e-9,0,.292243,.770588,749668e-9,0,.314753,.751991,731613e-9,0,.338118,.733407,717655e-9,0,.362347,.713688,700604e-9,0,.387447,.693595,678765e-9,0,.413424,.673426,657042e-9,0,.440284,.65359,635892e-9,0,.468027,.633576,611569e-9,0,.496645,.613144,586011e-9,0,.526122,.592711,563111e-9,0,.556417,.572722,537699e-9,0,.587451,.552762,512556e-9,0,.619048,.532985,489757e-9,0,.650794,.513219,464139e-9,0,.68254,.493992,442193e-9,0,.714286,.47509,418629e-9,0,.746032,.456287,397045e-9,0,.777778,.438152,375504e-9,0,.809524,.420294,35492e-8,0,.84127,.402749,335327e-9,0,.873016,.385879,316422e-9,0,.904762,.369352,298333e-9,0,.936508,.353301,281417e-9,0,.968254,.337781,265203e-9,0,1,1,968267e-10,0,0,1,968284e-10,0,0,1,968556e-10,0,0,.999999,969733e-10,0,0,.999997,972913e-10,0,0,.999993,979688e-10,0,0,.999984,992239e-10,0,0,.999969,101356e-9,0,0,.999946,104784e-9,0,0,.999913,110111e-9,0,0,.999868,118217e-9,0,0,.999801,130396e-9,0,0,.999712,148523e-9,0,124907e-10,.999589,175233e-9,0,355405e-9,.999416,213999e-9,0,.0013528,.999136,268529e-9,0,.00312557,.998367,333088e-9,0,.00573045,.994701,304757e-9,0,.00919397,.992497,318031e-9,0,.0135261,.990608,353863e-9,0,.0187278,.988715,409044e-9,0,.0247947,.986241,472967e-9,0,.0317196,.981696,495104e-9,0,.039494,.977097,532873e-9,0,.0481087,.972583,594447e-9,0,.0575549,.966142,636867e-9,0,.0678242,.95823,669899e-9,0,.0789089,.949677,719499e-9,0,.0908023,.939226,750584e-9,0,.103499,.927501,793183e-9,0,.116993,.915199,81995e-8,0,.131282,.90498,847654e-9,0,.146364,.894243,868929e-9,0,.162237,.882154,884278e-9,0,.178902,.869161,898108e-9,0,.196358,.854751,901254e-9,0,.21461,.839368,90679e-8,0,.23366,.822874,901541e-9,0,.253512,.805514,897297e-9,0,.274174,.78716,881856e-9,0,.29565,.769061,870032e-9,0,.31795,.751,851719e-9,0,.341081,.732614,830671e-9,0,.365053,.713171,806569e-9,0,.389874,.693472,78338e-8,0,.415553,.673528,756404e-9,0,.442098,.653397,726872e-9,0,.469512,.633781,700494e-9,0,.497794,.613877,67105e-8,0,.526935,.593506,640361e-9,0,.556908,.573667,613502e-9,0,.587657,.553932,583177e-9,0,.61906,.534345,554375e-9,0,.650794,.515042,527811e-9,0,.68254,.495674,499367e-9,0,.714286,.477132,47429e-8,0,.746032,.458609,447726e-9,0,.777778,.440354,424205e-9,0,.809524,.422765,399549e-9,0,.84127,.405472,378315e-9,0,.873016,.388482,355327e-9,0,.904762,.372191,336122e-9,0,.936508,.356099,315247e-9,0,.968254,.340737,29794e-8,0,1,1,143327e-9,0,0,1,14333e-8,0,0,1,143366e-9,0,0,.999999,143524e-9,0,0,.999996,143952e-9,0,0,.999991,144862e-9,0,0,.999981,146544e-9,0,0,.999966,149391e-9,0,0,.999941,153946e-9,0,0,.999905,160971e-9,0,0,.999852,171562e-9,0,0,.99978,18729e-8,0,0,.999681,210386e-9,0,826239e-10,.999546,243906e-9,0,664807e-9,.999352,291739e-9,0,.00196192,.999027,357419e-9,0,.00405941,.997886,422349e-9,0,.00699664,.99419,385008e-9,0,.0107896,.99214,409775e-9,0,.0154415,.990274,456418e-9,0,.0209488,.988455,527008e-9,0,.0273037,.985804,597685e-9,0,.0344969,.98103,613124e-9,0,.0425183,.976674,668321e-9,0,.0513575,.972021,736985e-9,0,.0610046,.965274,773789e-9,0,.0714508,.958046,830852e-9,0,.0826877,.949333,875766e-9,0,.0947085,.939135,917088e-9,0,.107507,.927119,952244e-9,0,.121078,.91469,990626e-9,0,.135419,.903006,.00101304,0,.150526,.892368,.00103834,0,.166399,.880231,.00105002,0,.183038,.867432,.00106331,0,.200443,.853208,.00106783,0,.218618,.837956,.00106458,0,.237566,.821772,.00105945,0,.257291,.804328,.00104685,0,.2778,.786465,.00103178,0,.2991,.768004,.00101077,0,.321199,.74972,985504e-9,0,.344106,.731682,962893e-9,0,.36783,.712813,932146e-9,0,.392383,.693139,89871e-8,0,.417774,.673566,869678e-9,0,.444013,.653483,835525e-9,0,.471107,.633891,799853e-9,0,.49906,.614433,766838e-9,0,.527869,.594586,732227e-9,0,.557517,.574769,696442e-9,0,.587966,.555149,663935e-9,0,.61913,.535898,629826e-9,0,.650794,.516753,596486e-9,0,.68254,.497816,567078e-9,0,.714286,.479034,534399e-9,0,.746032,.460975,507013e-9,0,.777778,.442935,477421e-9,0,.809524,.425263,451101e-9,0,.84127,.408248,424964e-9,0,.873016,.391339,39993e-8,0,.904762,.37513,377619e-9,0,.936508,.359172,354418e-9,0,.968254,.343876,334823e-9,0,1,1,209042e-9,0,0,1,209045e-9,0,0,1,209093e-9,0,0,.999999,209304e-9,0,0,.999996,209871e-9,0,0,.999991,211078e-9,0,0,.999979,213304e-9,0,0,.999963,217061e-9,0,0,.999933,223042e-9,0,0,.999894,232206e-9,0,0,.999837,245901e-9,0,0,.999756,266023e-9,0,102927e-11,.999648,295204e-9,0,233468e-9,.999499,336958e-9,0,.00108237,.999283,395563e-9,0,.00268832,.998896,473785e-9,0,.00511138,.997006,520008e-9,0,.00837705,.993819,497261e-9,0,.0124928,.991632,523722e-9,0,.0174561,.989875,587258e-9,0,.0232596,.988109,676329e-9,0,.0298932,.985155,747701e-9,0,.0373453,.980479,768803e-9,0,.0456045,.976271,841054e-9,0,.0546593,.971347,911469e-9,0,.0644994,.964528,953057e-9,0,.0751152,.957632,.00102221,0,.0864981,.948681,.00106122,0,.0986407,.938716,.00111857,0,.111537,.926629,.00114762,0,.125182,.914025,.00118995,0,.139571,.901026,.00121228,0,.154703,.890358,.00123946,0,.170576,.878283,.0012527,0,.18719,.865459,.00125536,0,.204547,.851407,.00126134,0,.222648,.836276,.00124759,0,.241498,.820436,.00124443,0,.261101,.803253,.00122071,0,.281465,.785562,.00120107,0,.302595,.76718,.00117762,0,.324501,.748551,.00114289,0,.347192,.730564,.00110872,0,.370679,.712253,.00107636,0,.394973,.692867,.00103646,0,.420085,.673695,996793e-9,0,.446027,.653912,95675e-8,0,.47281,.634129,916739e-9,0,.500441,.615004,874401e-9,0,.528921,.595587,833411e-9,0,.558244,.575965,794556e-9,0,.588384,.5566,75196e-8,0,.619281,.537428,716381e-9,0,.650795,.518623,676558e-9,0,.68254,.499964,64074e-8,0,.714286,.481356,605984e-9,0,.746032,.463279,570256e-9,0,.777778,.445673,540138e-9,0,.809524,.428032,507299e-9,0,.84127,.411112,479553e-9,0,.873016,.394444,450737e-9,0,.904762,.378247,424269e-9,0,.936508,.362415,399111e-9,0,.968254,.347103,375274e-9,0,1,1,300729e-9,0,0,1,300733e-9,0,0,1,300797e-9,0,0,.999998,301072e-9,0,0,.999996,301817e-9,0,0,.999989,303398e-9,0,0,.999977,306309e-9,0,0,.999958,311209e-9,0,0,.999927,318975e-9,0,0,.999884,330804e-9,0,0,.99982,34834e-8,0,0,.999733,373854e-9,0,326995e-10,.999613,410424e-9,0,477174e-9,.999447,462047e-9,0,.00161099,.999204,533322e-9,0,.00353153,.998725,624964e-9,0,.00627965,.995871,631786e-9,0,.0098693,.993194,632017e-9,0,.0143011,.991541,68923e-8,0,.019568,.989773,766892e-9,0,.0256593,.987647,863668e-9,0,.0325625,.984193,922089e-9,0,.0402647,.980016,970749e-9,0,.0487532,.975859,.00106027,0,.058016,.970514,.00112239,0,.0680419,.963625,.00117212,0,.0788208,.956959,.00125211,0,.0903439,.947956,.00129411,0,.102604,.93809,.00135879,0,.115594,.92659,.00139309,0,.129309,.913829,.00143253,0,.143745,.90005,.00145809,0,.158901,.888129,.0014748,0,.174774,.87607,.00148756,0,.191365,.863461,.00148714,0,.208674,.849594,.00148892,0,.226705,.834531,.00146496,0,.245461,.81903,.0014579,0,.264947,.802122,.00143039,0,.28517,.78445,.00139717,0,.306137,.766434,.00136312,0,.327857,.747816,.00132597,0,.350341,.729519,.00128323,0,.373598,.711454,.00123803,0,.397642,.692699,.00119097,0,.422485,.673723,.00114565,0,.448139,.654386,.00109552,0,.474619,.634673,.00104553,0,.501933,.615554,99985e-8,0,.530089,.596462,948207e-9,0,.559087,.577385,902299e-9,0,.588913,.558257,856448e-9,0,.619525,.5392,810395e-9,0,.650826,.520543,768558e-9,0,.68254,.502206,7239e-7,0,.714286,.48402,685794e-9,0,.746032,.465779,64471e-8,0,.777778,.448455,609583e-9,0,.809524,.431091,57227e-8,0,.84127,.414147,54042e-8,0,.873016,.39765,506545e-9,0,.904762,.381576,477635e-9,0,.936508,.365881,448446e-9,0,.968254,.350582,421424e-9,0,1,1,427144e-9,0,0,1,427151e-9,0,0,1,427232e-9,0,0,.999998,42759e-8,0,0,.999995,428555e-9,0,0,.999988,430603e-9,0,0,.999976,434368e-9,0,0,.999952,440688e-9,0,0,.999919,450667e-9,0,0,.999871,46578e-8,0,0,.999801,488024e-9,0,0,.999704,520092e-9,0,129791e-9,.999572,565553e-9,0,821056e-9,.999389,628906e-9,0,.00225241,.999114,714911e-9,0,.00449109,.998488,819218e-9,0,.00756249,.995234,80415e-8,0,.0114716,.993021,830181e-9,0,.0162131,.991407,902645e-9,0,.021776,.989625,996934e-9,0,.0281471,.987064,.00109707,0,.0353118,.983265,.00114353,0,.0432562,.979535,.0012272,0,.0519665,.975224,.00132642,0,.0614298,.969574,.00138092,0,.0716348,.963021,.00145896,0,.0825709,.956046,.00152834,0,.094229,.947136,.00158217,0,.106602,.937313,.0016347,0,.119682,.926073,.00168383,0,.133465,.913121,.00171627,0,.147947,.899165,.00174229,0,.163125,.885891,.00176137,0,.178998,.873783,.00176406,0,.195566,.861331,.00176156,0,.21283,.847569,.00175346,0,.230793,.832785,.00172753,0,.249459,.817442,.00170204,0,.268832,.800613,.00166576,0,.28892,.783597,.00162909,0,.30973,.76571,.0015826,0,.331271,.747021,.00153106,0,.353554,.728593,.00148036,0,.37659,.710661,.00142808,0,.400391,.692426,.00136906,0,.424973,.673623,.00131066,0,.450347,.65494,.00125569,0,.476531,.635448,.00119517,0,.503535,.616221,.00113828,0,.531372,.597531,.0010816,0,.560047,.578795,.00102673,0,.589554,.559892,970985e-9,0,.619869,.541307,919773e-9,0,.650923,.522608,868479e-9,0,.68254,.504484,82137e-8,0,.714286,.486603,772916e-9,0,.746032,.468802,730353e-9,0,.777778,.451172,684955e-9,0,.809524,.434348,647565e-9,0,.84127,.417445,605863e-9,0,.873016,.401077,571885e-9,0,.904762,.385039,536034e-9,0,.936508,.369483,504227e-9,0,.968254,.354272,473165e-9,0,1,1,599525e-9,0,0,1,599533e-9,0,0,1,599639e-9,0,0,.999998,600097e-9,0,0,.999994,601336e-9,0,0,.999987,603958e-9,0,0,.999972,608775e-9,0,0,.999949,616842e-9,0,0,.999912,629534e-9,0,0,.999857,648658e-9,0,0,.999781,676615e-9,0,538873e-11,.999674,716574e-9,0,308602e-9,.999528,772641e-9,0,.00127003,.999326,849806e-9,0,.00300783,.999009,952682e-9,0,.00556637,.998112,.00106394,0,.00895889,.994496,.00102228,0,.0131827,.992806,.00108586,0,.0182277,.991211,.0011759,0,.0240795,.989415,.00128955,0,.030723,.986499,.00139038,0,.0381418,.982679,.00144539,0,.046321,.978839,.00153954,0,.0552459,.974295,.00164417,0,.0649034,.968784,.00171517,0,.0752814,.962324,.00180282,0,.0863693,.954956,.00186387,0,.0981578,.94624,.00193817,0,.110639,.936517,.00198156,0,.123806,.925186,.00203042,0,.137655,.91252,.0020664,0,.15218,.898441,.00207822,0,.16738,.884394,.0020992,0,.183253,.871273,.00208748,0,.199799,.859057,.00208686,0,.21702,.845243,.00205519,0,.234918,.830723,.00202868,0,.253496,.815801,.00199501,0,.272761,.79914,.00194193,0,.292719,.782372,.00188824,0,.313377,.76482,.00183695,0,.334745,.746586,.00177418,0,.356833,.7281,.00170628,0,.379654,.709842,.00164063,0,.403221,.692019,.00157355,0,.427548,.67364,.00150262,0,.452651,.655277,.00143473,0,.478545,.636438,.00136371,0,.505246,.617364,.00129911,0,.532768,.598603,.00123014,0,.561122,.580195,.00116587,0,.590309,.561786,.00110398,0,.620318,.543377,.00104148,0,.651102,.525093,983984e-9,0,.682545,.506791,92667e-8,0,.714286,.489291,874326e-9,0,.746032,.471811,821734e-9,0,.777778,.454435,774698e-9,0,.809524,.437493,727302e-9,0,.84127,.420977,684039e-9,0,.873016,.404729,64373e-8,0,.904762,.388756,60285e-8,0,.936508,.373344,56765e-8,0,.968254,.358191,531929e-9,0,1,1,832169e-9,0,0,1,832178e-9,0,0,1,83231e-8,0,0,.999998,832893e-9,0,0,.999995,834465e-9,0,0,.999985,837791e-9,0,0,.999969,843893e-9,0,0,.999944,854086e-9,0,0,.999903,870071e-9,0,0,.999843,894042e-9,0,0,.999759,928865e-9,0,531805e-10,.999643,978242e-9,0,579365e-9,.99948,.00104684,0,.00182774,.999255,.00114012,0,.00387804,.998885,.00126188,0,.00675709,.997405,.00135888,0,.010468,.99424,.00133626,0,.0150018,.992458,.00140905,0,.0203443,.990929,.00152305,0,.0264786,.989116,.00165882,0,.0333875,.985624,.00174128,0,.0410536,.982003,.00182108,0,.0494609,.978336,.00194498,0,.0585941,.973184,.00202708,0,.0684396,.9678,.00212166,0,.0789851,.961348,.00221366,0,.0902199,.953841,.00228219,0,.102134,.94534,.00235662,0,.114721,.935552,.00240572,0,.127972,.924064,.00244405,0,.141884,.911827,.00247557,0,.156451,.897731,.00248374,0,.171672,.883409,.00249863,0,.187545,.868625,.00246688,0,.20407,.856529,.00246523,0,.221249,.842999,.00242368,0,.239083,.828505,.00237354,0,.257578,.813825,.00232588,0,.276738,.797813,.00226731,0,.296569,.781097,.00219704,0,.31708,.764038,.00212394,0,.338281,.746067,.00204786,0,.360181,.727687,.00196728,0,.382794,.709571,.00188779,0,.406133,.691503,.00180532,0,.430213,.673673,.00171849,0,.45505,.655732,.00164147,0,.480662,.637399,.00155858,0,.507065,.618616,.00147641,0,.534278,.60005,.00140125,0,.562313,.581713,.00132441,0,.59118,.563546,.00125014,0,.620875,.545605,.00118249,0,.651373,.527559,.0011116,0,.682593,.509764,.00104979,0,.714286,.49193,985977e-9,0,.746032,.475011,928592e-9,0,.777778,.457878,873466e-9,0,.809524,.440979,819585e-9,0,.84127,.424613,772365e-9,0,.873016,.408549,722195e-9,0,.904762,.392771,680014e-9,0,.936508,.377317,636797e-9,0,.968254,.362352,598318e-9,0,1,1,.00114313,0,0,1,.00114314,0,0,.999999,.00114331,0,0,.999998,.00114404,0,0,.999994,.00114601,0,0,.999984,.00115019,0,0,.999967,.00115784,0,0,.999937,.0011706,0,0,.999894,.00119054,0,0,.999828,.00122031,0,0,.999735,.00126331,0,169263e-9,.999606,.00132382,0,949167e-9,.999426,.0014071,0,.00249668,.999173,.00151895,0,.00486392,.99873,.00166102,0,.00806323,.996243,.0017023,0,.0120895,.993779,.00172782,0,.0169288,.9919,.0018108,0,.0225633,.990524,.00196028,0,.028974,.98868,.00212014,0,.036142,.984663,.00217598,0,.044049,.981457,.00230563,0,.0526781,.977608,.00243966,0,.0620137,.972215,.00251336,0,.0720418,.966798,.0026285,0,.0827499,.960241,.00271409,0,.0941271,.952489,.00278381,0,.106164,.944127,.00285399,0,.118852,.934282,.00290994,0,.132185,.923271,.00294558,0,.146157,.910803,.00296269,0,.160766,.896705,.00296803,0,.176007,.88238,.00296637,0,.19188,.867116,.00293163,0,.208385,.853636,.00289418,0,.225523,.840469,.00284663,0,.243296,.82639,.00278594,0,.261709,.811759,.00271618,0,.280767,.796113,.00263187,0,.300476,.779518,.00254589,0,.320845,.763142,.00246003,0,.341883,.745464,.00236529,0,.363601,.727491,.00226536,0,.386011,.709414,.00216375,0,.409128,.691396,.00207127,0,.432967,.67368,.00197106,0,.457545,.656049,.00187022,0,.482881,.638188,.00177605,0,.508992,.620177,.00168482,0,.535899,.601506,.00158909,0,.563619,.58362,.00150583,0,.592165,.565496,.00141791,0,.621544,.54789,.00133693,0,.651743,.530323,.00126038,0,.682709,.512795,.00118556,0,.714286,.495199,.00111527,0,.746032,.478101,.0010489,0,.777778,.461511,984264e-9,0,.809524,.444879,92591e-8,0,.84127,.428424,866582e-9,0,.873016,.412495,814463e-9,0,.904762,.396975,764498e-9,0,.936508,.381614,715967e-9,0,.968254,.366732,672483e-9,0,1,1,.00155501,0,0,1,.00155503,0,0,1,.00155524,0,0,.999998,.00155615,0,0,.999994,.0015586,0,0,.999983,.00156379,0,0,.999963,.0015733,0,0,.999932,.00158911,0,0,.999882,.00161376,0,0,.99981,.00165041,0,100875e-10,.999708,.00170304,0,367658e-9,.999565,.00177658,0,.0014234,.999368,.00187688,0,.00327939,.999081,.00200989,0,.00596629,.99852,.00217177,0,.0094852,.99549,.0021745,0,.013824,.993252,.00222357,0,.0189642,.991727,.00235022,0,.0248856,.989951,.00250561,0,.0315669,.988029,.00268829,0,.0389882,.984029,.0027496,0,.0471302,.980683,.00289793,0,.0559754,.976554,.00303315,0,.0655081,.97139,.00313257,0,.0757138,.965544,.00323656,0,.08658,.95912,.00333432,0,.0980954,.951183,.0034039,0,.110251,.942974,.00347515,0,.123038,.932642,.00350381,0,.13645,.922158,.00354519,0,.150482,.909404,.00353851,0,.165129,.896071,.0035435,0,.18039,.881206,.00349936,0,.196263,.866077,.00347256,0,.212748,.85093,.003415,0,.229847,.837703,.00333367,0,.247561,.823878,.003249,0,.265895,.809449,.00316347,0,.284854,.794379,.00306351,0,.304445,.778138,.0029499,0,.324675,.761997,.00284099,0,.345555,.744938,.00272104,0,.367095,.727212,.00260715,0,.389309,.709549,.00248855,0,.41221,.691704,.00236783,0,.435814,.673689,.00225178,0,.460138,.656453,.00213765,0,.485203,.639128,.00202178,0,.511028,.621512,.00191443,0,.537634,.603598,.00180977,0,.565041,.58559,.00170456,0,.593268,.567852,.00160927,0,.622327,.5503,.00151395,0,.652217,.533033,.00142499,0,.682907,.515942,.00133955,0,.714296,.498814,.0012602,0,.746032,.481595,.00118188,0,.777778,.465117,.00111171,0,.809524,.448865,.00104091,0,.84127,.432711,976618e-9,0,.873016,.416822,91859e-8,0,.904762,.401272,857704e-9,0,.936508,.386226,807172e-9,0,.968254,.371321,75464e-8,0,1,1,.00209596,0,0,1,.00209598,0,0,1,.00209624,0,0,.999997,.00209736,0,0,.999991,.00210039,0,0,.999979,.00210678,0,0,.999959,.00211847,0,0,.999925,.0021379,0,0,.99987,.00216809,0,0,.999791,.00221281,0,681487e-10,.999677,.00227669,0,658161e-9,.999521,.00236533,0,.00200635,.999301,.00248514,0,.0041779,.998977,.00264185,0,.00718648,.998191,.00281695,0,.0110239,.994801,.00278518,0,.015672,.993091,.00288774,0,.0211091,.991571,.00303931,0,.0273123,.9897,.00321643,0,.034259,.987023,.00337332,0,.0419282,.983289,.00346146,0,.0502998,.979892,.00363704,0,.0593562,.975111,.00373601,0,.069081,.970351,.0038842,0,.0794598,.964131,.00397053,0,.0904798,.957747,.00408078,0,.10213,.949536,.00413533,0,.1144,.941372,.00420305,0,.127284,.931049,.00422815,0,.140772,.920647,.00425048,0,.154862,.908033,.0042281,0,.169548,.895028,.00422026,0,.184828,.879968,.00415042,0,.200701,.864875,.00408821,0,.217167,.84918,.00400909,0,.234227,.834934,.00391178,0,.251884,.821397,.00380066,0,.270141,.807135,.00367974,0,.289004,.792363,.00355172,0,.308479,.776661,.003411,0,.328575,.760705,.00328123,0,.349301,.744408,.00314003,0,.370668,.726994,.0029906,0,.392689,.709598,.00285034,0,.415379,.692112,.00271179,0,.438754,.674435,.00257185,0,.46283,.65676,.00243425,0,.48763,.639982,.00230351,0,.513173,.622983,.0021777,0,.539482,.605471,.00204991,0,.566579,.58796,.00193759,0,.594488,.570463,.00181976,0,.623226,.553058,.00171497,0,.6528,.535894,.00161109,0,.683198,.519089,.00151394,0,.714354,.502454,.00142122,0,.746032,.485681,.00133488,0,.777778,.468935,.00124975,0,.809524,.452951,.00117309,0,.84127,.437139,.00110155,0,.873016,.421446,.00103124,0,.904762,.405951,966387e-9,0,.936508,.391003,908119e-9,0,.968254,.376198,848057e-9,0,1,1,.00280076,0,0,1,.00280078,0,0,.999999,.00280109,0,0,.999997,.00280246,0,0,.999992,.00280616,0,0,.999979,.00281396,0,0,.999956,.00282822,0,0,.999916,.00285186,0,0,.999857,.0028885,0,0,.999768,.00294259,0,196026e-9,.999645,.00301946,0,.00104842,.99947,.00312541,0,.00270199,.999229,.00326733,0,.00519449,.998852,.00344992,0,.00852602,.997558,.00361052,0,.0126804,.994417,.0035898,0,.017635,.992824,.00372393,0,.023365,.991344,.00390695,0,.0298456,.989337,.00410392,0,.0370529,.985811,.00420987,0,.0449651,.982772,.00437488,0,.0535615,.979001,.00455069,0,.0628243,.974102,.00464462,0,.0727368,.969197,.00480577,0,.0832844,.962759,.00487818,0,.0944545,.956207,.00498176,0,.106236,.947909,.00503392,0,.118619,.939596,.00507474,0,.131595,.929642,.00509798,0,.145159,.918807,.00508476,0,.159305,.906921,.00505634,0,.174028,.893312,.00498845,0,.189327,.878933,.0049133,0,.2052,.863986,.0048259,0,.221647,.847936,.00470848,0,.23867,.832253,.00456889,0,.25627,.818619,.00442726,0,.274453,.804788,.00427677,0,.293222,.790241,.00411906,0,.312585,.775162,.00394833,0,.33255,.759463,.00377366,0,.353126,.743598,.00361026,0,.374324,.72697,.00343627,0,.396158,.709646,.00326422,0,.418641,.69277,.00309717,0,.44179,.675371,.0029356,0,.465624,.657863,.00277712,0,.490163,.640772,.00261738,0,.515429,.624441,.0024737,0,.541445,.607497,.00233125,0,.568236,.590438,.00218994,0,.595828,.573224,.0020664,0,.624242,.556168,.00193526,0,.653496,.539232,.00182463,0,.683588,.522352,.00170735,0,.714482,.506172,.00160555,0,.746032,.489842,.00150451,0,.777778,.473463,.00140938,0,.809524,.457266,.00132568,0,.84127,.441609,.0012376,0,.873016,.426348,.00116265,0,.904762,.411002,.00108935,0,.936508,.396045,.00101946,0,.968254,.381448,955665e-9,0,1,1,.0037121,0,0,1,.00371213,0,0,1,.00371251,0,0,.999997,.00371417,0,0,.99999,.00371863,0,0,.999977,.00372807,0,0,.99995,.00374529,0,0,.999908,.0037738,0,0,.999843,.00381789,0,123596e-10,.999745,.00388273,0,407442e-9,.999608,.00397443,0,.0015447,.999415,.00409998,0,.00351385,.999143,.00426662,0,.0063316,.9987,.00447625,0,.00998679,.996363,.00455323,0,.0144569,.994021,.00461052,0,.0197151,.992372,.00476359,0,.0257344,.991007,.00499101,0,.0324882,.988767,.0051972,0,.0399517,.984872,.00528407,0,.0481022,.982004,.00548926,0,.0569191,.977714,.00564385,0,.0663839,.973076,.0057693,0,.0764801,.967565,.0058924,0,.0871928,.961384,.00599629,0,.0985095,.954435,.00605998,0,.110419,.946303,.0061133,0,.122912,.937662,.00612028,0,.13598,.927867,.00612209,0,.149617,.916475,.00604813,0,.163817,.90541,.00603088,0,.178577,.891591,.00592218,0,.193894,.877573,.00578854,0,.209767,.862511,.00566648,0,.226196,.846861,.00551481,0,.243182,.83068,.00533754,0,.260728,.815725,.00515487,0,.278837,.802321,.0049655,0,.297515,.787826,.00475421,0,.316768,.773454,.00456002,0,.336605,.758224,.00434727,0,.357034,.74265,.00414444,0,.378067,.726729,.00393738,0,.399717,.710155,.00373575,0,.421998,.693312,.00353736,0,.444928,.67653,.00334368,0,.468523,.659444,.00315981,0,.492806,.642051,.00297809,0,.517798,.625758,.00280592,0,.543525,.609615,.00264254,0,.570012,.592919,.00248459,0,.597288,.576298,.00233327,0,.625379,.559489,.00219519,0,.654307,.542891,.00205441,0,.684084,.526255,.00193385,0,.714693,.509853,.00180745,0,.746044,.494131,.00169817,0,.777778,.478114,.0015913,0,.809524,.462274,.00148981,0,.84127,.446412,.00139537,0,.873016,.431274,.00130984,0,.904762,.41635,.00122403,0,.936508,.401476,.00114809,0,.968254,.386993,.00107563,0,1,1,.00488216,0,0,1,.0048822,0,0,1,.00488265,0,0,.999997,.00488463,0,0,.999988,.00488999,0,0,.999974,.00490129,0,0,.999946,.00492191,0,0,.999897,.00495598,0,0,.999825,.00500855,0,744791e-10,.999718,.00508559,0,712744e-9,.999565,.005194,0,.00215249,.999352,.00534147,0,.00444576,.999046,.00553523,0,.00759218,.998492,.00577016,0,.0115714,.995564,.00578487,0,.0163557,.993339,.00586414,0,.021915,.991834,.00606002,0,.0282201,.990496,.00633312,0,.0352433,.987826,.00651941,0,.042959,.98383,.00660842,0,.0513439,.98109,.00685523,0,.0603772,.976131,.00695778,0,.0700402,.971922,.00714236,0,.0803163,.965901,.00721437,0,.0911908,.959606,.00732017,0,.102651,.952504,.00735788,0,.114686,.944365,.00738493,0,.127286,.935652,.00737969,0,.140443,.925813,.00733612,0,.154151,.914397,.00723094,0,.168405,.903257,.00714002,0,.183201,.890015,.00700149,0,.198536,.876014,.00682813,0,.214409,.861436,.00665567,0,.23082,.845752,.00644526,0,.24777,.829169,.00621635,0,.265263,.813435,.00597789,0,.283301,.799701,.00575694,0,.301889,.785726,.00549866,0,.321035,.77152,.0052503,0,.340746,.75683,.00499619,0,.361032,.741951,.0047543,0,.381904,.726367,.0045084,0,.403374,.710537,.00426784,0,.425457,.693965,.00403487,0,.448169,.677724,.0038075,0,.47153,.66117,.00359431,0,.495561,.644274,.00338354,0,.520284,.627449,.00318163,0,.545725,.611645,.00299672,0,.571911,.595614,.00281016,0,.598873,.579426,.00264252,0,.62664,.563016,.00247509,0,.655239,.546728,.00232647,0,.684692,.530539,.00217803,0,.714999,.514164,.00204216,0,.746106,.498344,.00191403,0,.777778,.482957,.00179203,0,.809524,.467336,.00167695,0,.84127,.451994,.00157567,0,.873016,.436514,.00147113,0,.904762,.42178,.00138034,0,.936508,.407271,.00129219,0,.968254,.392822,.0012098,0,1,1,.00637427,0,0,1,.00637431,0,0,.999999,.00637485,0,0,.999996,.00637721,0,0,.999987,.00638357,0,0,.999971,.006397,0,0,.999939,.00642142,0,0,.999888,.00646177,0,0,.999807,.00652387,0,207916e-9,.999689,.00661454,0,.00112051,.99952,.00674155,0,.00287719,.999283,.00691313,0,.00550145,.998936,.00713598,0,.00897928,.998165,.00738501,0,.0132829,.994847,.00734388,0,.01838,.993182,.00749991,0,.0242381,.991665,.0077246,0,.030826,.989708,.00797579,0,.0381152,.986663,.00813011,0,.0460794,.983288,.00830365,0,.0546951,.980104,.00853496,0,.0639411,.974855,.00861045,0,.0737988,.97045,.00879133,0,.0842516,.964509,.00886377,0,.0952848,.957594,.00890346,0,.106886,.950546,.00893289,0,.119044,.942225,.00890074,0,.131749,.933365,.00886826,0,.144994,.923202,.0087316,0,.158772,.912605,.00863082,0,.173078,.901099,.00847403,0,.187908,.888177,.00825838,0,.203261,.873955,.00801834,0,.219134,.860091,.00779026,0,.235527,.84434,.00752478,0,.252443,.828517,.00724074,0,.269883,.81239,.00693769,0,.287851,.79721,.00664817,0,.306352,.783489,.00634763,0,.325393,.769514,.00604221,0,.344981,.755419,.00573568,0,.365126,.741083,.00544359,0,.385839,.726059,.00515515,0,.407132,.710809,.00487139,0,.42902,.695052,.00459846,0,.45152,.678886,.00433412,0,.474651,.663042,.00407981,0,.498433,.646634,.00384264,0,.52289,.630117,.00360897,0,.548048,.613804,.00338863,0,.573936,.598338,.00318486,0,.600584,.582687,.00298377,0,.628027,.566809,.00280082,0,.656295,.550817,.00262255,0,.685417,.534937,.00245835,0,.715406,.519151,.00230574,0,.74624,.503118,.0021549,0,.777778,.487723,.00202008,0,.809524,.472725,.00189355,0,.84127,.457599,.00177108,0,.873016,.442558,.00165843,0,.904762,.427624,.00155494,0,.936508,.413171,.00145273,0,.968254,.399122,.00136454,0,1,1,.00826496,0,0,1,.00826499,0,0,1,.00826564,0,0,.999996,.00826842,0,0,.999987,.00827589,0,0,.999967,.00829167,0,0,.999933,.00832037,0,0,.999876,.00836768,0,109338e-10,.999786,.00844031,0,427145e-9,.999655,.00854603,0,.0016384,.999468,.00869337,0,.00372392,.999203,.008891,0,.00668513,.998803,.00914387,0,.0104968,.99748,.00935838,0,.015125,.994446,.00933309,0,.0205338,.99292,.00953084,0,.0266884,.991414,.0097893,0,.0335565,.989049,.0100228,0,.0411086,.98582,.0101664,0,.0493181,.982441,.0103582,0,.0581613,.978595,.0105292,0,.0676169,.973495,.0106274,0,.0776661,.968405,.0107261,0,.0882926,.962717,.0108234,0,.0994817,.955478,.0108102,0,.111221,.948275,.0107914,0,.123499,.940006,.0107161,0,.136308,.930831,.0106309,0,.149639,.920648,.0104083,0,.163485,.910205,.0102312,0,.177843,.898445,.0100051,0,.192707,.885986,.00971928,0,.208077,.872204,.00940747,0,.22395,.858436,.0091085,0,.240326,.843454,.00876595,0,.257208,.827437,.00839794,0,.274596,.811488,.00803692,0,.292496,.796039,.00767352,0,.310911,.781083,.0073097,0,.329849,.767642,.00694032,0,.349316,.753901,.00657476,0,.369323,.740131,.00622699,0,.38988,.725845,.0058838,0,.410999,.710991,.00555586,0,.432696,.696002,.00523089,0,.454987,.680461,.00492494,0,.47789,.664875,.00463464,0,.501426,.649273,.00435422,0,.52562,.63302,.0040875,0,.550498,.61705,.00384075,0,.576089,.601154,.00359557,0,.602427,.586008,.00337636,0,.629544,.570699,.00316019,0,.657479,.555166,.00296033,0,.686264,.539645,.00277552,0,.715924,.524159,.00259499,0,.746459,.508682,.00243257,0,.777789,.493163,.00227851,0,.809524,.478004,.00213083,0,.84127,.46347,.00199502,0,.873016,.448778,.00186967,0,.904762,.434105,.00174732,0,.936508,.419576,.00163861,0,.968254,.405541,.00153341,0,1,1,.0106462,0,0,1,.0106462,0,0,.999999,.010647,0,0,.999995,.0106502,0,0,.999985,.0106589,0,0,.999964,.0106773,0,0,.999925,.0107106,0,0,.999861,.0107655,0,712986e-10,.999763,.0108497,0,743959e-9,.999616,.0109716,0,.00227361,.999408,.0111408,0,.0046983,.999112,.0113659,0,.00800158,.998637,.0116475,0,.0121493,.996223,.0117231,0,.0171023,.994006,.0118064,0,.0228218,.992444,.0120254,0,.0292711,.991028,.0123314,0,.036417,.98803,.0124954,0,.0442295,.984816,.0126538,0,.0526815,.981399,.0128537,0,.0617492,.977085,.0129694,0,.0714114,.972154,.013091,0,.0816495,.966617,.0131166,0,.0924472,.960628,.0131583,0,.10379,.953295,.0131094,0,.115665,.94575,.0129966,0,.128062,.937654,.0128796,0,.140972,.927716,.0126477,0,.154387,.917932,.0123889,0,.168301,.907719,.012131,0,.182709,.89584,.0118013,0,.197608,.883526,.0114145,0,.212994,.870301,.0110075,0,.228867,.856272,.0106019,0,.245227,.842251,.0101938,0,.262074,.826466,.00973254,0,.279412,.810859,.0092846,0,.297244,.795051,.00883304,0,.315575,.780053,.00840272,0,.334412,.76575,.00796438,0,.35376,.752298,.00752526,0,.373631,.739153,.00711486,0,.394034,.725514,.00670361,0,.414983,.711473,.00632656,0,.436491,.696936,.00595206,0,.458575,.682126,.00559191,0,.481253,.667027,.00525362,0,.504547,.651875,.00493805,0,.528481,.636463,.00462848,0,.553081,.620641,.00433936,0,.578377,.604931,.00407,0,.604404,.589549,.00380864,0,.631197,.574712,.00357049,0,.658795,.559775,.00334466,0,.687238,.544514,.00312505,0,.716559,.529555,.00293199,0,.746776,.514402,.00274204,0,.777849,.499302,.00256647,0,.809524,.484114,.00239901,0,.84127,.469308,.00225148,0,.873016,.455133,.00210178,0,.904762,.440939,.0019727,0,.936508,.426627,.00184382,0,.968254,.412509,.00172548,0,1,1,.013628,0,0,1,.0136281,0,0,.999999,.0136289,0,0,.999995,.0136327,0,0,.999983,.0136427,0,0,.99996,.0136638,0,0,.999917,.0137022,0,0,.999846,.0137652,0,204597e-9,.999736,.0138615,0,.00116837,.999573,.0140007,0,.00303325,.99934,.0141927,0,.00580613,.999004,.0144457,0,.00945626,.998407,.0147489,0,.0139421,.995464,.014731,0,.0192202,.993328,.0148283,0,.0252495,.991799,.0150797,0,.0319921,.990397,.0154316,0,.0394138,.986835,.0155005,0,.0474843,.983938,.0157308,0,.0561763,.980154,.0158753,0,.0654661,.975659,.0159581,0,.0753326,.970171,.0159832,0,.0857571,.964803,.0160084,0,.0967236,.958366,.0159484,0,.108218,.950613,.0158001,0,.120227,.942874,.0155845,0,.132741,.935005,.0154292,0,.145751,.924991,.0150742,0,.159249,.914814,.0146757,0,.17323,.904743,.0143097,0,.187687,.893216,.0138695,0,.202619,.880769,.0133706,0,.218021,.868136,.0128606,0,.233894,.85469,.0123403,0,.250238,.840593,.0118091,0,.267052,.825808,.011253,0,.284341,.81009,.0107099,0,.302106,.79504,.0101636,0,.320354,.779757,.00964041,0,.33909,.764697,.00911896,0,.358322,.750913,.00859533,0,.378059,.738175,.00811592,0,.398311,.725242,.00764504,0,.41909,.711864,.00718885,0,.440412,.698009,.00675843,0,.462292,.683841,.00634984,0,.484748,.669391,.00595502,0,.507802,.654731,.00558671,0,.531477,.639805,.00523578,0,.555802,.624789,.00490834,0,.580805,.609325,.00459448,0,.606522,.593975,.00430342,0,.63299,.578983,.00403019,0,.66025,.564442,.0037707,0,.688346,.549835,.0035316,0,.717319,.535039,.00330255,0,.7472,.520403,.00308932,0,.777982,.505687,.00289335,0,.809524,.490939,.00270818,0,.84127,.476233,.0025343,0,.873016,.461624,.00237097,0,.904762,.447833,.00222065,0,.936508,.433992,.00207561,0,.968254,.420147,.00194955,0,1,1,.0173415,0,0,1,.0173416,0,0,.999999,.0173426,0,0,.999995,.0173468,0,0,.999983,.0173582,0,0,.999954,.0173822,0,0,.999908,.0174258,0,669501e-11,.999828,.0174973,0,427399e-9,.999705,.0176063,0,.00171019,.999524,.0177631,0,.0039248,.999263,.0179781,0,.00705382,.998878,.018258,0,.0110552,.998012,.0185551,0,.0158812,.994614,.0184264,0,.0214852,.993132,.0186385,0,.0278239,.991563,.0189067,0,.0348585,.989298,.0191577,0,.0425544,.986036,.0192522,0,.050881,.982558,.0194063,0,.059811,.978531,.019486,0,.0693209,.974198,.0195847,0,.0793895,.968148,.0194749,0,.0899984,.962565,.0194277,0,.101132,.956041,.0192991,0,.112775,.947749,.0189893,0,.124917,.94018,.018704,0,.137547,.93165,.0183458,0,.150655,.921798,.0178775,0,.164236,.911573,.0173618,0,.178281,.901569,.0168482,0,.192788,.890341,.016265,0,.207752,.877835,.0156199,0,.223171,.865472,.0149516,0,.239044,.852905,.0143274,0,.255371,.838906,.0136643,0,.272153,.824888,.0129903,0,.289393,.809977,.0123218,0,.307093,.794697,.0116572,0,.325259,.780028,.0110307,0,.343896,.765124,.0104236,0,.363012,.750411,.0098219,0,.382617,.737264,.00924397,0,.402719,.724799,.00868719,0,.423332,.712253,.00816476,0,.444469,.699267,.00767262,0,.466146,.685618,.00719746,0,.488383,.671736,.00673916,0,.511199,.657777,.00631937,0,.534618,.643497,.00592411,0,.558668,.62889,.00553928,0,.58338,.614299,.0051934,0,.608787,.599197,.00485985,0,.634929,.584175,.00454357,0,.661849,.569541,.00425787,0,.689594,.555193,.00397905,0,.718211,.540947,.00372364,0,.747742,.526593,.00348599,0,.778205,.512335,.00326103,0,.80953,.498017,.00305137,0,.84127,.483609,.00285485,0,.873016,.469368,.00267472,0,.904762,.455037,.00249945,0,.936508,.441493,.00234792,0,.968254,.428147,.00219936,0,1,1,.0219422,0,0,1,.0219423,0,0,.999998,.0219434,0,0,.999993,.0219481,0,0,.999981,.021961,0,0,.999949,.0219879,0,0,.999896,.0220367,0,593194e-10,.999808,.0221167,0,75364e-8,.99967,.0222383,0,.00237884,.999466,.0224125,0,.00495612,.999174,.0226495,0,.00844887,.998725,.0229525,0,.0128058,.996979,.0231123,0,.0179742,.994317,.0230742,0,.0239047,.992781,.0232895,0,.0305526,.991191,.0235734,0,.0378786,.987787,.0236152,0,.0458475,.985092,.0237994,0,.0544287,.981121,.0238553,0,.0635952,.976924,.0238706,0,.0733233,.97218,.0238704,0,.0835922,.965956,.0236598,0,.0943839,.959998,.0234735,0,.105682,.953245,.0232277,0,.117474,.944445,.0226973,0,.129747,.937087,.0223527,0,.142491,.928341,.0218144,0,.155697,.9184,.0211516,0,.169358,.907959,.0204553,0,.183469,.89808,.0197673,0,.198024,.887047,.0189915,0,.21302,.875221,.0182082,0,.228455,.86269,.0173584,0,.244329,.850735,.0165718,0,.260639,.837545,.0157524,0,.277389,.823639,.0149482,0,.29458,.809699,.0141431,0,.312216,.794797,.0133527,0,.3303,.780578,.0126193,0,.34884,.766019,.0118914,0,.367842,.751447,.0111839,0,.387315,.737275,.010514,0,.40727,.724545,.00987277,0,.427717,.712644,.00926569,0,.448671,.700432,.00869029,0,.470149,.687664,.00814691,0,.492167,.674288,.00763012,0,.514746,.660966,.00714437,0,.537911,.647264,.00668457,0,.561688,.633431,.00626581,0,.586108,.619133,.00585593,0,.611206,.604935,.00548188,0,.637022,.590236,.00513288,0,.663599,.575473,.0047906,0,.690989,.561228,.00448895,0,.719242,.547054,.00420233,0,.748411,.533175,.00392869,0,.778531,.519163,.00367445,0,.809583,.505328,.00344097,0,.84127,.491446,.00322003,0,.873016,.477356,.00301283,0,.904762,.46356,.00282592,0,.936508,.449623,.00264956,0,.968254,.436068,.00246956,0,1,1,.0276135,0,0,1,.0276136,0,0,.999998,.0276148,0,0,.999993,.0276201,0,0,.999976,.0276342,0,0,.999945,.027664,0,0,.999884,.0277179,0,18679e-8,.999784,.027806,0,.00119607,.99963,.0279394,0,.00318407,.999401,.0281295,0,.00613601,.999066,.0283858,0,.00999963,.998524,.0287027,0,.0147164,.995702,.0286256,0,.0202295,.993593,.0286733,0,.0264876,.992067,.0288989,0,.0334452,.990548,.0292135,0,.0410621,.986775,.0291296,0,.0493032,.984054,.0293099,0,.0581381,.979481,.0291881,0,.0675397,.975297,.0291598,0,.0774848,.96981,.028954,0,.0879528,.963524,.028628,0,.0989258,.957398,.0283135,0,.110388,.950088,.0278469,0,.122327,.941538,.0271798,0,.134729,.933332,.0265388,0,.147587,.924392,.0257776,0,.160889,.914581,.024916,0,.174631,.904347,.0240242,0,.188806,.894324,.0231229,0,.203409,.883724,.022153,0,.218437,.872207,.0211355,0,.233888,.859927,.0201048,0,.249761,.848373,.0191263,0,.266056,.836023,.0181306,0,.282774,.82289,.0171718,0,.299917,.809324,.0162196,0,.317488,.795361,.0152622,0,.335493,.781253,.01439,0,.353936,.767338,.013533,0,.372825,.753156,.0127244,0,.392168,.739122,.0119454,0,.411976,.725358,.0112054,0,.432259,.712949,.010487,0,.453032,.701621,.00984032,0,.47431,.689703,.00921495,0,.496111,.677216,.00862492,0,.518456,.664217,.00806882,0,.541367,.65137,.00755922,0,.564872,.638,.00705705,0,.589001,.62453,.00661266,0,.613789,.610601,.00618432,0,.639277,.59676,.00578033,0,.66551,.582433,.00540927,0,.692539,.568026,.00506104,0,.720422,.55414,.0047353,0,.749216,.540178,.00442889,0,.778974,.526513,.00414363,0,.809711,.512954,.00388237,0,.84127,.499403,.00362875,0,.873016,.486026,.00340827,0,.904762,.472345,.00318598,0,.936508,.458828,.00297635,0,.968254,.445379,.00279447,0,1,1,.0345716,0,0,1,.0345717,0,0,.999999,.034573,0,0,.999991,.0345787,0,0,.999974,.0345941,0,0,.999937,.0346263,0,188589e-11,.999869,.0346847,0,409238e-9,.999757,.0347798,0,.0017674,.999582,.0349233,0,.00413658,.999322,.0351265,0,.00747408,.998939,.0353967,0,.0117157,.998219,.0357018,0,.0167966,.994974,.0354726,0,.0226572,.993201,.0355621,0,.0292445,.991573,.0357641,0,.0365123,.989301,.0359252,0,.0444203,.985712,.0358017,0,.0529334,.982411,.0358353,0,.0620214,.977827,.035617,0,.0716574,.973278,.0354398,0,.0818186,.967397,.0350483,0,.0924846,.960696,.0344795,0,.103638,.954349,.0339861,0,.115263,.946066,.0331323,0,.127348,.938012,.032359,0,.13988,.929413,.0314413,0,.152849,.920355,.0304103,0,.166248,.910586,.0292785,0,.18007,.900609,.0281391,0,.194308,.890093,.0269103,0,.208958,.880013,.0257269,0,.224018,.869001,.0244671,0,.239485,.85751,.0232252,0,.255359,.84582,.0220117,0,.271638,.834383,.0208274,0,.288324,.822158,.0196628,0,.305419,.809056,.0185306,0,.322927,.795832,.0174174,0,.340851,.782547,.0163758,0,.359199,.7689,.015391,0,.377975,.755526,.0144488,0,.397189,.741681,.0135372,0,.416851,.728178,.0126957,0,.436971,.714642,.0118812,0,.457564,.702756,.0111165,0,.478644,.69175,.0104145,0,.500229,.680159,.00974439,0,.522339,.668073,.00911926,0,.544997,.655405,.00851393,0,.56823,.642921,.00797637,0,.592068,.629993,.00745119,0,.616546,.616828,.00696972,0,.641705,.603305,.00652425,0,.66759,.589833,.00610188,0,.694255,.575945,.00570834,0,.72176,.561745,.00533384,0,.750168,.548277,.00500001,0,.779545,.534467,.00467582,0,.809933,.521032,.00438092,0,.841272,.507877,.00410348,0,.873016,.494654,.00383618,0,.904762,.481592,.00358699,0,.936508,.468509,.00337281,0,.968254,.455293,.00316196,0,1,1,.0430698,0,0,1,.0430699,0,0,.999998,.0430713,0,0,.999991,.0430773,0,0,.99997,.0430936,0,0,.999928,.0431277,0,406396e-10,.999852,.0431893,0,744376e-9,.999724,.0432895,0,.0024806,.999527,.0434397,0,.00524779,.99923,.0436507,0,.00898164,.998783,.0439255,0,.0136083,.997507,.0441104,0,.0190582,.994418,.0438225,0,.0252694,.992864,.0439396,0,.0321879,.991127,.0440962,0,.039767,.987331,.0438408,0,.0479667,.984819,.0438991,0,.056752,.980384,.0435906,0,.0660929,.975846,.0432543,0,.075963,.970748,.0428293,0,.0863398,.964303,.042153,0,.0972035,.95772,.0414111,0,.108537,.950747,.0405893,0,.120325,.942533,.0394887,0,.132554,.934045,.0383544,0,.145215,.924942,.037057,0,.158296,.915811,.0356993,0,.17179,.90612,.0342401,0,.185691,.896434,.0328078,0,.199993,.886021,.031288,0,.214691,.876081,.0297776,0,.229782,.865608,.0282334,0,.245265,.854924,.026749,0,.261138,.843607,.02526,0,.277401,.832456,.0238214,0,.294056,.821342,.0224682,0,.311104,.809303,.0211297,0,.328548,.796468,.0198387,0,.346394,.784046,.0186227,0,.364645,.771262,.0174561,0,.38331,.758118,.0163806,0,.402396,.745075,.0153287,0,.421912,.731926,.0143647,0,.44187,.71863,.0134363,0,.462283,.705414,.0125603,0,.483165,.693792,.0117508,0,.504535,.683108,.0110016,0,.52641,.67183,.0102757,0,.548816,.66015,.00962044,0,.571776,.647907,.00898031,0,.595323,.635734,.00840811,0,.619489,.623208,.00786211,0,.644317,.610438,.00734953,0,.669852,.597345,.00687688,0,.696148,.584138,.00643469,0,.723267,.5707,.00602236,0,.75128,.556966,.0056324,0,.780258,.543607,.00528277,0,.810268,.530213,.00493999,0,.841311,.516912,.00462265,0,.873016,.503916,.0043307,0,.904762,.491146,.00406858,0,.936508,.478439,.00381436,0,.968254,.465834,.00358003,0,1,1,.0534039,0,0,1,.053404,0,0,.999998,.0534055,0,0,.999989,.0534116,0,0,.999968,.0534283,0,0,.999918,.0534633,0,155895e-9,.99983,.0535262,0,.00120914,.999685,.0536281,0,.00334944,.999461,.0537799,0,.00653077,.999119,.0539902,0,.0106718,.998582,.0542524,0,.0156907,.995919,.0540318,0,.0215147,.993735,.0538914,0,.0280801,.992126,.0539557,0,.0353323,.990266,.0540401,0,.0432247,.986317,.0536064,0,.0517172,.983213,.0534425,0,.0607754,.978303,.0528622,0,.0703698,.973665,.0523363,0,.0804742,.968091,.0516165,0,.0910667,.961026,.0505434,0,.102128,.954333,.049523,0,.113641,.946372,.0481698,0,.125591,.938254,.0467674,0,.137965,.929516,.0452341,0,.150754,.920106,.0435083,0,.163947,.910899,.0417399,0,.177537,.901532,.0399389,0,.191516,.891919,.0380901,0,.205881,.882006,.0362341,0,.220626,.871965,.0343444,0,.235749,.862145,.0324832,0,.251248,.852058,.0306681,0,.267121,.84161,.0289097,0,.283368,.830806,.0272079,0,.299992,.820476,.0256089,0,.316992,.809514,.0240394,0,.334374,.797865,.0225379,0,.35214,.785621,.0211235,0,.370296,.773765,.0197908,0,.388849,.761629,.0185235,0,.407807,.748891,.0173358,0,.427178,.736437,.0162305,0,.446974,.723707,.0151778,0,.467207,.710606,.0141791,0,.487892,.698019,.0132592,0,.509046,.686203,.0123887,0,.530687,.675692,.0115976,0,.552839,.664826,.0108325,0,.575527,.65349,.0101348,0,.59878,.641774,.00947756,0,.622634,.629794,.00886058,0,.647128,.617647,.00828526,0,.672308,.60534,.00775312,0,.698231,.592718,.00726033,0,.724958,.579746,.00679731,0,.752563,.566763,.00636111,0,.781127,.553515,.00595228,0,.810733,.540118,.00556876,0,.841426,.527325,.00523051,0,.873016,.514265,.00490712,0,.904762,.501406,.00460297,0,.936508,.488922,.00431247,0,.968254,.476541,.0040472,0,1,1,.0659184,0,0,1,.0659185,0,0,.999998,.06592,0,0,.999988,.0659259,0,0,.999963,.0659423,0,0,.999907,.0659764,0,374198e-9,.999806,.0660376,0,.00182071,.999639,.0661361,0,.0043894,.999378,.0662814,0,.00800055,.998985,.0664779,0,.0125594,.998285,.0666914,0,.0179786,.995071,.0661989,0,.0241822,.993172,.0660454,0,.031106,.991438,.0660105,0,.0386952,.988428,.0656875,0,.0469032,.985218,.0652913,0,.0556905,.981128,.0647107,0,.065023,.976015,.0638491,0,.0748717,.97097,.062993,0,.0852112,.964582,.0617927,0,.0960199,.957383,.0603626,0,.107279,.949969,.0588128,0,.118971,.941843,.0570274,0,.131084,.933624,.0551885,0,.143604,.924543,.053122,0,.156521,.914919,.0508897,0,.169825,.905773,.0486418,0,.18351,.896434,.0463364,0,.197569,.887195,.0440623,0,.211997,.877706,.0417799,0,.226789,.867719,.03945,0,.241944,.858587,.037243,0,.257458,.849317,.0350956,0,.273331,.839585,.0329852,0,.289563,.829856,.0310028,0,.306154,.819589,.0290953,0,.323108,.809714,.0272738,0,.340426,.79934,.0255631,0,.358113,.788224,.0239175,0,.376175,.776619,.0223831,0,.394616,.76521,.0209298,0,.413445,.753716,.0195786,0,.432671,.741564,.0183001,0,.452305,.729413,.0171259,0,.472358,.717146,.0159933,0,.492845,.70436,.0149495,0,.513783,.69219,.0139681,0,.535189,.680289,.0130577,0,.557087,.669611,.0122198,0,.5795,.659113,.0114174,0,.602459,.648148,.0106729,0,.625997,.636905,.00998997,0,.650154,.625154,.00934313,0,.674976,.613481,.00874839,0,.700518,.60154,.00818265,0,.726845,.58943,.00766889,0,.754032,.576828,.00717153,0,.782167,.564194,.00672696,0,.811344,.551501,.00630863,0,.841644,.538635,.00592177,0,.873016,.525724,.00554888,0,.904762,.513209,.00520225,0,.936508,.500457,.00488231,0,.968254,.48799,.00457153,0,1,1,.0810131,0,0,1,.0810133,0,0,.999997,.0810145,0,0,.999985,.08102,0,0,.999956,.0810347,0,195026e-10,.999893,.0810656,0,719316e-9,.999777,.0811205,0,.00259774,.999583,.081208,0,.00561807,.999281,.0813343,0,.00967472,.998813,.0814969,0,.0146627,.997597,.0815217,0,.0204902,.994379,.0808502,0,.0270802,.992744,.0806792,0,.0343674,.990745,.0804589,0,.0422974,.986646,.0796107,0,.0508242,.983611,.0790913,0,.0599087,.978869,.0780746,0,.0695175,.973475,.0768218,0,.0796223,.967845,.0754926,0,.0901983,.960778,.0737063,0,.101224,.953333,.0718052,0,.112682,.945274,.0695946,0,.124555,.936955,.0672492,0,.136831,.928319,.0647732,0,.149496,.919075,.0620947,0,.162542,.909114,.0591816,0,.175958,.900137,.0563917,0,.189739,.891069,.0535392,0,.203877,.882262,.0507642,0,.218368,.873232,.0479793,0,.233208,.864042,.045226,0,.248393,.855002,.0425413,0,.263923,.846569,.0400126,0,.279796,.837714,.0375269,0,.296012,.828918,.0352027,0,.312573,.819783,.0330011,0,.329479,.810129,.0308908,0,.346734,.800866,.0289112,0,.364342,.79093,.0270255,0,.382307,.780593,.0252758,0,.400637,.769511,.0236178,0,.419337,.758558,.0220652,0,.438418,.747632,.0206289,0,.457889,.736146,.0192873,0,.477761,.724093,.0180333,0,.49805,.71234,.0168264,0,.51877,.700201,.015746,0,.53994,.687949,.0147027,0,.561581,.676163,.0137512,0,.583718,.665001,.0128655,0,.60638,.65472,.0120366,0,.629599,.644213,.0112604,0,.653415,.633382,.0105413,0,.677874,.62212,.00986498,0,.70303,.610631,.00923308,0,.728948,.599078,.00864206,0,.755706,.587519,.00811784,0,.783396,.575505,.00761237,0,.812121,.563148,.00713949,0,.841989,.550828,.00668379,0,.873035,.538458,.00627715,0,.904762,.525905,.00588336,0,.936508,.513517,.00552687,0,.968254,.501395,.00519681,0,1,1,.0991506,0,0,1,.0991504,0,0,.999996,.0991515,0,0,.999984,.0991558,0,0,.999947,.0991672,0,114389e-9,.999874,.0991912,0,.00121503,.999739,.0992331,0,.00356108,.999514,.0992983,0,.00705578,.999159,.0993877,0,.011574,.998586,.0994837,0,.017003,.995731,.0988425,0,.0232484,.993384,.098276,0,.0302318,.991615,.0979269,0,.0378884,.989029,.0973432,0,.0461641,.985373,.0963539,0,.0550136,.981278,.0952306,0,.0643988,.975777,.0936233,0,.0742868,.970526,.0920219,0,.0846501,.963755,.0898912,0,.0954644,.956676,.0876064,0,.106709,.948099,.0847751,0,.118367,.939718,.0818638,0,.130423,.931305,.078857,0,.142862,.922342,.0756127,0,.155674,.912842,.0721473,0,.168849,.903304,.0686195,0,.182378,.89411,.0650589,0,.196255,.885512,.0616022,0,.210473,.877193,.0582434,0,.225027,.86877,.0548979,0,.239915,.860267,.0516095,0,.255132,.851915,.048468,0,.270678,.843912,.0454447,0,.286551,.83604,.0425612,0,.302751,.828245,.0398752,0,.31928,.820159,.0373198,0,.336138,.81167,.034916,0,.35333,.802659,.0326402,0,.370858,.793921,.0304901,0,.388728,.784713,.0284857,0,.406944,.774946,.0266186,0,.425515,.76448,.0248593,0,.444449,.753793,.0232114,0,.463756,.743506,.0217039,0,.483447,.732555,.0202841,0,.503535,.720965,.0189648,0,.524036,.709422,.0177189,0,.544968,.697756,.0165626,0,.56635,.685565,.015483,0,.588208,.673987,.0144892,0,.610569,.66244,.0135607,0,.633466,.651675,.0126956,0,.656936,.641598,.0118788,0,.681025,.63121,.0111261,0,.705788,.620514,.010437,0,.731289,.609366,.00978747,0,.757606,.598137,.00917257,0,.784834,.586966,.00859778,0,.813085,.575549,.00806803,0,.842485,.563797,.00757294,0,.87313,.551758,.00710592,0,.904762,.539894,.0066841,0,.936508,.527901,.00627901,0,.968254,.515819,.00590506,0,1,1,.120864,0,0,1,.120864,0,0,.999996,.120864,0,0,.99998,.120867,0,0,.99994,.120872,0,323781e-9,.999852,.120884,0,.00188693,.999693,.120903,0,.00473489,.999426,.120929,0,.00872704,.999002,.120955,0,.0137237,.998235,.120918,0,.0196068,.994608,.119764,0,.0262803,.992997,.119265,0,.0336657,.990968,.11863,0,.0416987,.987002,.117261,0,.0503261,.983524,.116009,0,.0595035,.97875,.114252,0,.0691935,.972652,.11193,0,.0793645,.966613,.109555,0,.0899894,.959275,.106612,0,.101045,.951272,.103375,0,.112512,.942323,.0996594,0,.124372,.933679,.0958841,0,.136611,.924822,.0919265,0,.149216,.915742,.0878061,0,.162176,.906348,.0834894,0,.175482,.896883,.079085,0,.189125,.88774,.0746745,0,.203098,.87986,.0705773,0,.217396,.871998,.0665005,0,.232015,.864325,.0625413,0,.24695,.856685,.0586781,0,.2622,.84925,.0550063,0,.277761,.841719,.0514727,0,.293634,.834755,.0481398,0,.309819,.827853,.0450172,0,.326315,.820888,.0420969,0,.343126,.813616,.0393702,0,.360254,.805767,.0367771,0,.377701,.797338,.0343274,0,.395474,.789122,.0320529,0,.413577,.780601,.0299485,0,.432018,.771424,.0279812,0,.450804,.761502,.0261054,0,.469944,.751166,.0243942,0,.489451,.741276,.0228087,0,.509337,.730898,.0213265,0,.529617,.719878,.0199307,0,.550307,.708379,.0186574,0,.571428,.697165,.0174446,0,.593003,.685554,.0163144,0,.615059,.673631,.015276,0,.637628,.662385,.0143003,0,.660746,.651059,.0134112,0,.68446,.640451,.0125794,0,.70882,.630536,.011793,0,.733893,.620316,.0110547,0,.759756,.609722,.0103668,0,.786505,.598804,.00973009,0,.814259,.587871,.00912812,0,.843157,.577121,.00858916,0,.87334,.566019,.00807333,0,.904762,.554664,.00759687,0,.936508,.543101,.00714759,0,.968254,.531558,.00673418,0,1,1,.146767,0,0,1,.146767,0,0,.999997,.146767,0,0,.999977,.146765,0,320658e-11,.999929,.146762,0,682576e-9,.999823,.146753,0,.00276402,.999633,.146735,0,.00614771,.999314,.146699,0,.0106613,.998796,.14662,0,.0161546,.997124,.146107,0,.0225063,.994062,.144857,0,.0296198,.992154,.144011,0,.037417,.989186,.142712,0,.0458348,.985279,.140926,0,.0548211,.980826,.13885,0,.0643326,.975056,.136168,0,.074333,.969005,.133217,0,.0847917,.961554,.12959,0,.0956828,.954206,.125886,0,.106984,.945046,.121335,0,.118675,.935678,.116492,0,.130741,.926748,.111635,0,.143166,.917764,.106625,0,.155939,.908358,.101325,0,.169049,.899219,.0960249,0,.182487,.890089,.0906527,0,.196245,.881488,.0853905,0,.210317,.874031,.0804177,0,.224697,.866932,.0756005,0,.23938,.859976,.0709019,0,.254364,.853375,.0664391,0,.269646,.846971,.0622012,0,.285223,.840483,.058129,0,.301096,.833969,.0542762,0,.317265,.82806,.0507042,0,.333729,.822128,.047368,0,.350491,.815989,.044272,0,.367554,.809336,.0413444,0,.38492,.802177,.038601,0,.402594,.79441,.0360227,0,.420582,.786573,.0336383,0,.438891,.778619,.0314321,0,.457527,.77,.029362,0,.476499,.760698,.0274102,0,.49582,.750932,.0256146,0,.5155,.740993,.023974,0,.535555,.731159,.0224182,0,.556,.720836,.0209889,0,.576855,.709913,.0196411,0,.598143,.698415,.0183824,0,.619888,.68745,.0172222,0,.642123,.676154,.0161509,0,.664883,.664383,.0151397,0,.688211,.6533,.0141873,0,.71216,.642072,.0133105,0,.736792,.631412,.0124932,0,.762186,.621622,.0117408,0,.788439,.611681,.0110358,0,.815672,.60142,.0103775,0,.844034,.59083,.00975623,0,.873699,.580254,.00918084,0,.904765,.569841,.00864721,0,.936508,.559224,.00815731,0,.968254,.548315,.00767924,0,1,1,.177563,0,0,1,.177563,0,0,.999994,.177562,0,0,.999972,.177555,0,664171e-10,.999914,.177536,0,.0012276,.999787,.177496,0,.00388025,.999556,.17742,0,.00783463,.999165,.177285,0,.0128953,.9985,.177037,0,.0189053,.995388,.175634,0,.025742,.993102,.174375,0,.033309,.990992,.173121,0,.0415298,.986932,.170896,0,.0503425,.982786,.16847,0,.0596964,.977592,.165455,0,.0695498,.971075,.161676,0,.0798676,.963967,.157458,0,.0906201,.956397,.152836,0,.101783,.947489,.147467,0,.113333,.937564,.14145,0,.125254,.928182,.135383,0,.137529,.919027,.129212,0,.150144,.909618,.12276,0,.163088,.900492,.116273,0,.176351,.891671,.1098,0,.189924,.883146,.103362,0,.203799,.875151,.0970799,0,.21797,.868338,.0911732,0,.232433,.862033,.0854966,0,.247182,.856107,.0800691,0,.262216,.850644,.0749618,0,.27753,.845261,.070079,0,.293124,.839885,.0654321,0,.308997,.834609,.0610975,0,.325149,.829083,.0569741,0,.341581,.82404,.0531736,0,.358294,.818968,.049665,0,.37529,.813496,.0463856,0,.392573,.807533,.0433217,0,.410148,.80099,.0404402,0,.428019,.793891,.0377578,0,.446192,.786281,.0352616,0,.464676,.778773,.0329577,0,.483478,.770737,.030808,0,.502608,.762094,.0287964,0,.522079,.752898,.0269254,0,.541905,.743306,.0251926,0,.5621,.733416,.023595,0,.582684,.723742,.0221155,0,.603677,.713542,.0207435,0,.625106,.702755,.019434,0,.646998,.691484,.0182046,0,.66939,.680531,.0170771,0,.692324,.66953,.0160339,0,.715849,.658126,.0150677,0,.740028,.646933,.0141551,0,.764937,.636107,.0133179,0,.790673,.625271,.0125284,0,.817358,.615225,.0117937,0,.84515,.605678,.0111181,0,.874244,.59583,.0104759,0,.904828,.585704,.00986672,0,.936508,.575413,.00929712,0,.968254,.565373,.00876713,0,1,1,.214058,0,0,.999999,.214058,0,0,.999994,.214055,0,0,.999966,.214039,0,259642e-9,.999893,.213998,0,.00200075,.999737,.21391,0,.00527775,.999449,.213745,0,.00983959,.99896,.213458,0,.0154755,.9979,.212855,0,.0220249,.994278,.210779,0,.0293654,.992254,.20926,0,.0374021,.98881,.206908,0,.0460604,.984715,.204009,0,.0552802,.979738,.200471,0,.0650127,.972884,.195813,0,.0752175,.965996,.190856,0,.0858612,.957974,.185077,0,.0969155,.949155,.17868,0,.108356,.939288,.171513,0,.120163,.928996,.163838,0,.132319,.919563,.156246,0,.144808,.910004,.148359,0,.157618,.900791,.140417,0,.170737,.892135,.132569,0,.184155,.883803,.124741,0,.197866,.876034,.117091,0,.211861,.869219,.109835,0,.226134,.863062,.102859,0,.240682,.857795,.0962928,0,.255499,.853009,.0900725,0,.270583,.848603,.0842101,0,.285931,.844335,.0786527,0,.301542,.840208,.0734397,0,.317415,.836035,.0685334,0,.33355,.83172,.0639275,0,.349948,.827135,.0595909,0,.36661,.822797,.0556204,0,.383539,.818387,.0519394,0,.400738,.813565,.0485317,0,.41821,.808142,.0453138,0,.435961,.802212,.0423354,0,.453997,.79573,.0395553,0,.472324,.788741,.036988,0,.490951,.781093,.0345688,0,.509887,.773597,.0323297,0,.529144,.765622,.0302719,0,.548735,.757083,.0283477,0,.568674,.747992,.0265562,0,.588979,.738591,.0248844,0,.609671,.728719,.0233342,0,.630773,.719146,.0219081,0,.652314,.709165,.0205711,0,.674328,.69875,.0193248,0,.696854,.687884,.0181582,0,.719942,.676818,.0170746,0,.743651,.666247,.0160718,0,.768057,.655284,.0151262,0,.793253,.64401,.0142561,0,.819363,.633353,.0134327,0,.846547,.622674,.012653,0,.875017,.612265,.0119354,0,.905021,.602455,.0112533,0,.936508,.593147,.0106234,0,.968254,.583592,.0100213,0,1,1,.25717,0,0,1,.25717,0,0,.999992,.257164,0,0,.999958,.257135,0,641715e-9,.999864,.25706,0,.00305314,.999666,.256897,0,.00700975,.999302,.256596,0,.0122194,.998663,.25607,0,.0184622,.995607,.254123,0,.0255773,.993094,.252081,0,.0334439,.9907,.249867,0,.0419696,.98594,.246118,0,.0510823,.981214,.242049,0,.0607242,.974966,.236869,0,.0708486,.967589,.230724,0,.081417,.95915,.223635,0,.0923974,.950257,.21596,0,.103763,.940165,.207296,0,.115491,.929396,.197901,0,.127562,.919288,.188437,0,.13996,.909428,.178762,0,.15267,.900105,.169072,0,.165679,.891418,.159478,0,.178979,.883347,.15002,0,.192558,.875992,.140813,0,.20641,.869466,.13196,0,.220529,.863699,.123501,0,.234907,.858553,.115436,0,.249542,.854379,.107901,0,.264428,.850894,.10088,0,.279564,.847632,.0942296,0,.294947,.844571,.0879861,0,.310575,.84163,.0821534,0,.326448,.838542,.0766409,0,.342566,.835412,.0715322,0,.358929,.831899,.0666883,0,.37554,.828177,.0622175,0,.392399,.82416,.0580452,0,.409511,.820393,.054267,0,.426878,.816068,.0507172,0,.444506,.811201,.0474041,0,.4624,.805785,.0443174,0,.480566,.799878,.0414562,0,.499013,.793469,.0388147,0,.517749,.786473,.0363453,0,.536785,.778874,.0340225,0,.556134,.771277,.0318599,0,.575809,.763426,.0298859,0,.595827,.755044,.0280357,0,.616207,.746161,.0262979,0,.636973,.737124,.0247295,0,.65815,.72761,.0232514,0,.679772,.717822,.0218755,0,.701876,.708279,.0205942,0,.724509,.698333,.0193947,0,.74773,.68802,.0182717,0,.771609,.677321,.0172044,0,.79624,.666504,.0162122,0,.821743,.656184,.0152924,0,.84828,.64556,.0144326,0,.876069,.634636,.0136157,0,.905404,.624124,.0128612,0,.936508,.613914,.0121435,0,.968254,.603589,.0114887,0,1,1,.307946,0,0,.999999,.307945,0,0,.999988,.307934,0,204479e-10,.999944,.307886,0,.00127833,.999824,.307756,0,.00445047,.999565,.30748,0,.00914673,.999085,.306966,0,.0150498,.998103,.306004,0,.0219367,.994249,.303028,0,.0296485,.991807,.300435,0,.038068,.987773,.296554,0,.0471062,.982673,.2916,0,.0566942,.976623,.285641,0,.0667768,.968757,.27815,0,.0773099,.959849,.269529,0,.088257,.950663,.260248,0,.0995879,.940129,.249704,0,.111277,.92895,.238291,0,.123304,.917996,.226501,0,.13565,.907813,.214669,0,.148299,.898305,.202835,0,.161237,.889626,.191158,0,.174455,.88175,.179695,0,.187941,.874715,.168548,0,.201687,.868746,.15792,0,.215687,.863703,.147807,0,.229933,.859315,.138149,0,.24442,.855538,.128993,0,.259145,.852428,.120414,0,.274103,.850168,.112498,0,.289293,.848132,.105054,0,.304711,.846291,.0981087,0,.320357,.844431,.0915942,0,.33623,.842493,.0855056,0,.35233,.840368,.0798204,0,.368658,.83798,.0745097,0,.385214,.83523,.0695424,0,.402002,.832091,.0649092,0,.419023,.828667,.0606291,0,.436282,.824805,.0566523,0,.453782,.820988,.0530229,0,.471529,.816635,.0496364,0,.489528,.811725,.0464658,0,.507788,.806316,.0435082,0,.526317,.800469,.0407873,0,.545124,.794107,.038255,0,.564221,.787218,.0358825,0,.583621,.779872,.0336785,0,.603341,.772097,.0316379,0,.623397,.764484,.0297379,0,.643812,.756428,.0279581,0,.664611,.748022,.0263153,0,.685824,.739268,.0247799,0,.707488,.73024,.0233385,0,.729646,.720893,.0220035,0,.752354,.71119,.0207555,0,.77568,.701791,.0195843,0,.799715,.692184,.0184891,0,.824574,.682258,.0174541,0,.850417,.67206,.0164873,0,.877466,.661717,.0155959,0,.90604,.651462,.0147519,0,.936528,.641467,.0139727,0,.968254,.631229,.0132363,0,1,1,.367573,0,0,.999999,.367571,0,0,.999984,.367553,0,183382e-9,.999925,.367473,0,.00225254,.999759,.367259,0,.00628165,.99941,.366801,0,.0117858,.998739,.365946,0,.0184359,.995529,.363191,0,.0260114,.992875,.360171,0,.0343581,.989135,.355981,0,.0433637,.984166,.350401,0,.0529438,.977871,.343348,0,.0630334,.96951,.334341,0,.0735805,.959964,.323862,0,.0845437,.950162,.312521,0,.095889,.938882,.299577,0,.107588,.926992,.285573,0,.119617,.915589,.271212,0,.131957,.904791,.256611,0,.144591,.895177,.242224,0,.157503,.886403,.227952,0,.170682,.878957,.214192,0,.184117,.872418,.200795,0,.197799,.867029,.188015,0,.21172,.862835,.175975,0,.225873,.859411,.164526,0,.240253,.856655,.153693,0,.254854,.854519,.14352,0,.269673,.852828,.13397,0,.284707,.851412,.124984,0,.299953,.850609,.116748,0,.315408,.849855,.10905,0,.331073,.849017,.101839,0,.346946,.848079,.0951359,0,.363028,.846911,.0888774,0,.379318,.845445,.0830375,0,.395818,.84362,.0775844,0,.41253,.841411,.0725054,0,.429457,.838768,.0677691,0,.446602,.835801,.0634016,0,.463968,.832341,.0593095,0,.481561,.828424,.0555121,0,.499386,.824312,.052024,0,.51745,.819918,.0487865,0,.535761,.815072,.0457801,0,.554328,.809863,.0430184,0,.573162,.804164,.0404245,0,.592275,.798034,.0380146,0,.611681,.791436,.0357436,0,.631398,.784498,.0336475,0,.651445,.777125,.0316666,0,.671845,.769365,.0298122,0,.692628,.761579,.0281001,0,.713827,.753746,.0265049,0,.735484,.745573,.0250067,0,.75765,.737083,.0236026,0,.78039,.728545,.0223302,0,.803789,.719691,.0211243,0,.82796,.710569,.0199983,0,.853056,.701216,.0189569,0,.879298,.692094,.0179702,0,.907014,.682909,.0170418,0,.936691,.673509,.0161732,0,.968254,.663863,.0153406,0,1,1,.437395,0,0,.999998,.437394,0,0,.99998,.437363,0,616704e-9,.999891,.437232,0,.00367925,.999656,.436877,0,.00867446,.999148,.436121,0,.0150679,.997959,.434564,0,.022531,.993464,.430134,0,.0308507,.990606,.426077,0,.0398805,.985027,.419397,0,.0495148,.978491,.41118,0,.0596749,.969643,.40048,0,.0703001,.959189,.38769,0,.0813427,.948223,.373575,0,.0927641,.935955,.357622,0,.104533,.923237,.34043,0,.116624,.911074,.322735,0,.129015,.899724,.30479,0,.141687,.890189,.287392,0,.154626,.881796,.270248,0,.167818,.874781,.253659,0,.181252,.869166,.237786,0,.194918,.864725,.222618,0,.208807,.861565,.208356,0,.222913,.859284,.194867,0,.237229,.857677,.18212,0,.25175,.856714,.17018,0,.266473,.856155,.158969,0,.281392,.8558,.148413,0,.296505,.855672,.138578,0,.311811,.855538,.129345,0,.327306,.855689,.120861,0,.342991,.855767,.112969,0,.358864,.855618,.105593,0,.374925,.85525,.0987451,0,.391176,.854583,.0923727,0,.407616,.853534,.0864143,0,.424249,.852061,.0808338,0,.441076,.850253,.0756771,0,.4581,.848004,.0708612,0,.475324,.845333,.0663784,0,.492754,.842376,.0622631,0,.510394,.838956,.0584112,0,.528251,.835121,.0548328,0,.546331,.830842,.0514838,0,.564644,.826212,.048355,0,.583198,.821522,.0454714,0,.602005,.816551,.0428263,0,.621078,.811211,.0403612,0,.640434,.805479,.038039,0,.660089,.799409,.0358739,0,.680066,.79306,.0338727,0,.70039,.786395,.0319985,0,.721094,.779416,.030241,0,.742215,.77214,.0285951,0,.7638,.764636,.0270747,0,.785912,.756836,.0256354,0,.808628,.749315,.0243027,0,.832055,.741561,.0230497,0,.856338,.733589,.0218801,0,.88169,.725479,.020784,0,.908441,.717255,.0197702,0,.937125,.708829,.0188168,0,.968254,.700191,.0179113,0,1,1,.518937,0,0,.999998,.518933,0,0,.999967,.518883,0,.00147741,.999832,.51866,0,.00573221,.999466,.518057,0,.011826,.998644,.516752,0,.0192116,.994458,.512347,0,.027573,.991223,.507675,0,.0367099,.985515,.500188,0,.046487,.978308,.490408,0,.0568071,.968359,.477357,0,.0675984,.95682,.461752,0,.0788059,.943929,.443796,0,.090386,.930224,.423893,0,.102304,.916514,.402682,0,.114532,.903653,.380914,0,.127047,.892315,.359212,0,.139828,.882942,.338102,0,.152861,.875438,.31773,0,.16613,.869642,.298186,0,.179624,.865304,.279491,0,.193332,.862382,.261804,0,.207247,.860666,.245146,0,.22136,.859788,.229406,0,.235666,.859608,.214605,0,.250158,.859912,.200691,0,.264832,.86053,.187623,0,.279684,.861368,.17539,0,.294711,.862237,.163901,0,.309911,.863127,.153175,0,.32528,.863923,.143147,0,.340819,.864567,.133781,0,.356524,.865013,.125042,0,.372397,.86539,.116952,0,.388438,.865591,.109476,0,.404645,.865517,.102542,0,.421022,.865084,.0960688,0,.437569,.864309,.0900499,0,.454287,.863151,.0844328,0,.471181,.861649,.0792218,0,.488253,.859742,.0743482,0,.505507,.857446,.0697963,0,.522947,.854757,.0655364,0,.54058,.851783,.061608,0,.558412,.848516,.0579701,0,.576449,.844897,.0545742,0,.594701,.840956,.0514167,0,.613178,.836676,.0484598,0,.631892,.832075,.0456934,0,.650856,.827191,.0431178,0,.670088,.822295,.0407718,0,.689606,.817294,.0386032,0,.709434,.812013,.0365675,0,.7296,.806465,.0346547,0,.750138,.800691,.0328717,0,.771093,.794709,.031211,0,.792519,.788493,.0296504,0,.814488,.782049,.0281782,0,.837097,.775403,.0267965,0,.860481,.76857,.0255002,0,.884842,.761536,.0242759,0,.910494,.754303,.0231142,0,.937985,.74692,.0220305,0,.968254,.739745,.0210192,0,1,1,.613914,0,0,.999996,.613907,0,963597e-10,.999942,.613814,0,.00301247,.999704,.613407,0,.00870385,.999046,.612302,0,.0160714,.995516,.608266,0,.0245899,.991726,.602863,0,.0339681,.985157,.593956,0,.0440254,.97642,.581748,0,.0546409,.964404,.565183,0,.0657284,.950601,.545273,0,.0772246,.935158,.522129,0,.0890812,.919364,.496782,0,.10126,.904754,.470571,0,.113731,.89176,.444037,0,.126469,.881492,.418322,0,.139454,.873656,.393522,0,.15267,.868053,.369795,0,.166101,.864336,.347171,0,.179736,.862259,.325737,0,.193565,.861556,.305532,0,.207578,.861776,.286416,0,.221769,.862661,.268355,0,.23613,.864015,.251334,0,.250656,.865711,.235352,0,.265343,.867519,.220302,0,.280187,.869351,.206161,0,.295183,.871144,.192908,0,.31033,.872839,.180505,0,.325624,.874307,.168848,0,.341065,.875667,.158021,0,.35665,.876758,.147877,0,.37238,.87764,.138441,0,.388253,.878237,.129627,0,.404269,.878563,.121415,0,.42043,.878572,.113741,0,.436735,.87842,.106652,0,.453187,.878057,.100097,0,.469786,.877413,.0940128,0,.486536,.87646,.0883462,0,.503439,.875233,.0830924,0,.520498,.8737,.0781975,0,.537717,.871873,.07364,0,.555102,.86978,.0694103,0,.572657,.867405,.0654696,0,.59039,.864751,.0617914,0,.608307,.861818,.0583491,0,.626419,.858645,.0551443,0,.644733,.855307,.0521894,0,.663264,.851736,.0494334,0,.682025,.847927,.0468504,0,.701032,.843888,.0444261,0,.720308,.839629,.0421497,0,.739875,.835158,.0400082,0,.759764,.830509,.0380076,0,.780014,.825714,.0361488,0,.800673,.820729,.0343956,0,.821803,.815751,.0327781,0,.843492,.810752,.031275,0,.86586,.805587,.0298542,0,.889087,.800317,.0285397,0,.913466,.79489,.0272948,0,.93952,.789314,.0261139,0,.96835,.783593,.0249938,0,1,1,.724258,0,0,.999992,.724243,0,726889e-9,.99987,.724044,0,.00569574,.999336,.72317,0,.0131702,.996271,.719432,0,.0220738,.991159,.712576,0,.0319405,.982465,.700927,0,.0425202,.97049,.684297,0,.0536599,.953973,.661244,0,.065258,.935546,.633804,0,.0772427,.916596,.603071,0,.0895616,.899353,.57105,0,.102175,.885216,.539206,0,.11505,.875076,.508714,0,.128164,.868334,.479571,0,.141495,.864414,.451796,0,.155026,.862678,.425328,0,.168745,.862835,.400352,0,.182639,.864067,.376532,0,.196699,.866086,.35391,0,.210915,.868557,.332424,0,.225282,.871271,.312053,0,.239792,.874058,.292764,0,.25444,.8768,.27453,0,.269223,.87939,.257297,0,.284135,.8819,.24114,0,.299174,.884187,.225934,0,.314337,.886262,.211669,0,.329622,.888119,.198311,0,.345026,.889709,.185783,0,.360549,.891054,.174063,0,.376189,.892196,.163143,0,.391946,.893101,.152952,0,.407819,.893803,.143475,0,.423808,.894277,.134647,0,.439914,.894532,.126434,0,.456137,.894576,.1188,0,.472479,.894393,.111694,0,.48894,.893976,.105069,0,.505523,.893346,.0989077,0,.52223,.892502,.0931724,0,.539064,.891441,.0878276,0,.556028,.890276,.082903,0,.573125,.888972,.0783505,0,.590361,.887469,.0741083,0,.607741,.885785,.0701633,0,.62527,.883914,.0664835,0,.642957,.881872,.0630567,0,.660809,.879651,.0598527,0,.678836,.877267,.0568615,0,.69705,.874717,.05406,0,.715465,.872012,.0514378,0,.734098,.869157,.0489805,0,.752968,.866155,.0466727,0,.772101,.863014,.0445056,0,.791529,.859748,.0424733,0,.81129,.856416,.0405957,0,.831438,.852958,.0388273,0,.852044,.849382,.0371619,0,.87321,.845694,.0355959,0,.89509,.841893,.0341155,0,.917932,.837981,.0327141,0,.942204,.833963,.0313856,0,.968981,.829847,.0301275,0,1,1,.85214,0,0,.999969,.852095,0,.00279627,.999483,.851408,0,.0107635,.994545,.84579,0,.0206454,.986188,.835231,0,.0315756,.969847,.814687,0,.0432021,.945951,.783735,0,.0553396,.91917,.746074,0,.0678766,.895488,.706938,0,.0807395,.878232,.669534,0,.0938767,.868252,.635168,0,.10725,.863873,.603069,0,.120832,.863369,.572514,0,.134598,.86545,.543169,0,.148533,.868803,.514578,0,.16262,.872794,.486762,0,.176849,.87702,.459811,0,.19121,.881054,.433654,0,.205694,.884974,.408574,0,.220294,.888587,.384525,0,.235005,.891877,.36156,0,.24982,.894793,.339661,0,.264737,.89743,.318913,0,.279751,.899796,.299302,0,.294859,.901943,.280843,0,.310058,.903858,.263481,0,.325346,.905574,.247197,0,.340721,.907069,.231915,0,.356181,.908379,.217614,0,.371725,.90952,.20425,0,.387353,.910483,.191758,0,.403063,.91128,.180092,0,.418854,.911936,.169222,0,.434727,.912454,.159098,0,.450682,.912835,.149668,0,.466718,.913078,.140884,0,.482837,.913192,.132709,0,.499038,.913175,.125095,0,.515324,.91304,.118012,0,.531695,.912781,.111417,0,.548153,.91241,.105281,0,.5647,.911924,.0995691,0,.581338,.911331,.0942531,0,.59807,.910637,.0893076,0,.6149,.90984,.0846998,0,.63183,.908941,.0804044,0,.648865,.907944,.0763984,0,.666011,.906857,.0726638,0,.683273,.90568,.0691783,0,.700659,.904416,.0659222,0,.718176,.903067,.0628782,0,.735834,.901637,.0600307,0,.753646,.900128,.0573647,0,.771625,.898544,.0548668,0,.78979,.89689,.052527,0,.808162,.895165,.0503306,0,.826771,.893371,.0482668,0,.845654,.891572,.0463605,0,.864863,.889763,.0445998,0,.884472,.887894,.0429451,0,.904592,.885967,.0413884,0,.925407,.883984,.0399225,0,.947271,.881945,.0385405,0,.97105,.879854,.0372362,0,1,.999804,.995833,0,0,.938155,.933611,0,.0158731,.864755,.854311,0,.0317461,.888594,.865264,0,.0476191,.905575,.863922,0,.0634921,.915125,.850558,0,.0793651,.920665,.829254,0,.0952381,.924073,.802578,0,.111111,.926304,.772211,0,.126984,.927829,.739366,0,.142857,.928924,.705033,0,.15873,.92973,.670019,0,.174603,.930339,.634993,0,.190476,.930811,.600485,0,.206349,.931191,.566897,0,.222222,.93149,.534485,0,.238095,.931737,.503429,0,.253968,.931939,.473811,0,.269841,.932108,.445668,0,.285714,.93225,.418993,0,.301587,.932371,.393762,0,.31746,.932474,.369939,0,.333333,.932562,.347479,0,.349206,.932638,.326336,0,.365079,.932703,.306462,0,.380952,.93276,.287805,0,.396825,.932809,.270313,0,.412698,.932851,.253933,0,.428571,.932887,.23861,0,.444444,.932917,.224289,0,.460317,.932943,.210917,0,.47619,.932965,.19844,0,.492063,.932982,.186807,0,.507937,.932995,.175966,0,.52381,.933005,.165869,0,.539683,.933011,.156468,0,.555556,.933013,.147719,0,.571429,.933013,.139579,0,.587302,.93301,.132007,0,.603175,.933004,.124965,0,.619048,.932994,.118416,0,.634921,.932982,.112326,0,.650794,.932968,.106663,0,.666667,.93295,.101397,0,.68254,.932931,.0964993,0,.698413,.932908,.0919438,0,.714286,.932883,.0877057,0,.730159,.932856,.0837623,0,.746032,.932827,.0800921,0,.761905,.932796,.0766754,0,.777778,.932762,.0734936,0,.793651,.932727,.0705296,0,.809524,.932689,.0677676,0,.825397,.93265,.0651929,0,.84127,.932609,.0627917,0,.857143,.932565,.0605515,0,.873016,.932521,.0584606,0,.888889,.932474,.0565082,0,.904762,.932427,.0546841,0,.920635,.932377,.0529793,0,.936508,.932326,.0513851,0,.952381,.932274,.0498936,0,.968254,.93222,.0484975,0,.984127,.932164,.0471899,0,1],n=new Float32Array(e),i=new Float32Array(t);Ar.LTC_FLOAT_1=new Vl(n,64,64,1023,1015,300,1001,1001,1006,1003,1),Ar.LTC_FLOAT_2=new Vl(i,64,64,1023,1015,300,1001,1001,1006,1003,1),Ar.LTC_FLOAT_1.needsUpdate=!0,Ar.LTC_FLOAT_2.needsUpdate=!0;const s=new Uint16Array(e.length);e.forEach((function(e,t){s[t]=_p.toHalfFloat(e)}));const r=new Uint16Array(t.length);t.forEach((function(e,t){r[t]=_p.toHalfFloat(e)})),Ar.LTC_HALF_1=new Vl(s,64,64,1023,1016,300,1001,1001,1006,1003,1),Ar.LTC_HALF_2=new Vl(r,64,64,1023,1016,300,1001,1001,1006,1003,1),Ar.LTC_HALF_1.needsUpdate=!0,Ar.LTC_HALF_2.needsUpdate=!0}}.init()}createAmbientLight(e){const{id:t,name:n="",color:i=10132122,intensity:s=1}=e,r=new Vd(i,s);return r.name=n,r.userData.sid=t,r.userData.stype="Light",this.viewport.scener.addObject(r,this.scene),r}setAmbientLight(e,t){const{name:n="",color:i=10132122,intensity:s=1}=t;return!!e&&(e.name=n,e.color=new Fn(i),e.intensity=s,this.viewport.signals.objectChanged.dispatch(),!0)}createDirectionalLight(e){const{id:t,name:n="",color:i=10132122,intensity:s=1,position:r={x:1e3,y:1e3,z:1e3},target:o={x:-1e3,y:-1e3,z:-1e3},openShadow:a=!1,shadowAutoUpdate:l=!1,mapSize:c=4096}=e,h=new Nd(i,s);if(h.name=n,h.userData.sid=t,h.userData.stype="Light",h.position.set(r.x,r.y,r.z),h.target.name=`${n}-target`,h.target.position.set(o.x,o.y,o.z),h.castShadow=a,a){const e=h.position.distanceTo(h.target.position);h.shadow.bias=-.005,h.shadow.camera.left=-e,h.shadow.camera.right=e,h.shadow.camera.top=e,h.shadow.camera.bottom=-e,h.shadow.camera.far=e,h.shadow.autoUpdate=l,h.shadow.mapSize.width=c,h.shadow.mapSize.height=c,h.shadow.camera.updateProjectionMatrix()}return this.viewport.scener.addObject(h,this.scene),this.viewport.scener.addObject(h.target,this.scene),h}setDirectionalLight(e,t){const{name:n="",color:i=10132122,intensity:s=1,position:r={x:1e3,y:1e3,z:1e3},target:o={x:-1e3,y:-1e3,z:-1e3},openShadow:a=!1,shadowAutoUpdate:l=!1,mapSize:c=4096}=t;if(!e)return!1;if(e.name=n,e.color=new Fn(i),e.intensity=s,e.position.set(r.x,r.y,r.z),e.target.position.set(o.x,o.y,o.z),e.castShadow=a,a){const t=e.position.distanceTo(e.target.position);e.shadow.bias=-.005,e.shadow.camera.left=-t,e.shadow.camera.right=t,e.shadow.camera.top=t,e.shadow.camera.bottom=-t,e.shadow.camera.far=t,e.shadow.autoUpdate=l,e.shadow.mapSize.width=c,e.shadow.mapSize.height=c,e.shadow.camera.updateProjectionMatrix()}return this.viewport.signals.objectChanged.dispatch(),!0}createHemisphereLight(e){const{id:t,name:n="",skyColor:i=16777215,groundColor:s=14540253,intensity:r=1,position:o={x:0,y:0,z:0}}=e,a=new Cd(i,s,r);return a.name=n,a.position.set(o.x,o.y,o.z),a.userData.sid=t,a.userData.stype="Light",this.viewport.scener.addObject(a,this.scene),a}setHemisphereLight(e,t){const{name:n="",skyColor:i=16777215,groundColor:s=14540253,intensity:r=1,position:o={x:0,y:0,z:0}}=t;return!!e&&(e.name=n,e.color=new Fn(i),e.groundColor=new Fn(s),e.intensity=r,e.position.set(o.x,o.y,o.z),this.viewport.signals.objectChanged.dispatch(),!0)}createSpotLight(e){const{id:t,name:n="",color:i=16777215,intensity:s=1,angle:r=45,position:o={x:0,y:500,z:0},target:a={x:0,y:0,z:0},openShadow:l=!1,shadowAutoUpdate:c=!1,mapSize:h=4096}=e,d=Dm(o).distanceTo(Dm(a)),u=new Id(i,s,d,Math.PI/360*r,0,0);if(u.name=n,u.position.set(o.x,o.y,o.z),u.userData.sid=t,u.userData.stype="Light",u.castShadow=l,u.target.position.set(a.x,a.y,a.z),u.target.castShadow=l,u.target.receiveShadow=!0,u.target.updateMatrixWorld(),l){const e=u.position.distanceTo(u.target.position);u.shadow.autoUpdate=c,u.shadow.mapSize.width=h,u.shadow.mapSize.height=h,u.shadow.bias=-.005,u.shadow.focus=.6,u.shadow.camera.far=e,u.shadow.camera.updateProjectionMatrix()}return this.viewport.scener.addObject(u,this.scene),u}setSpotLight(e,t){const{name:n="",color:i=16777215,intensity:s=1,angle:r=45,position:o={x:0,y:500,z:0},target:a={x:0,y:0,z:0},openShadow:l=!1,shadowAutoUpdate:c=!1,mapSize:h=4096}=t;if(!e)return!1;const d=Dm(o).distanceTo(Dm(a));if(e.name=n,e.color=new Fn(i),e.intensity=s,e.distance=d,e.angle=Math.PI/360*r,e.position.set(o.x,o.y,o.z),e.castShadow=l,e.target.position.set(a.x,a.y,a.z),e.target.castShadow=l,e.target.updateMatrixWorld(),l){const t=e.position.distanceTo(e.target.position);e.shadow.autoUpdate=c,e.shadow.mapSize.width=h,e.shadow.mapSize.height=h,e.shadow.bias=-.005,e.shadow.focus=.6,e.shadow.camera.far=t,e.shadow.camera.updateProjectionMatrix()}return this.viewport.signals.objectChanged.dispatch(),!0}createPointLight(e){const{id:t,name:n="",color:i=16777215,intensity:s=1,distance:r=5e3,position:o={x:0,y:500,z:0},openShadow:a=!1,shadowAutoUpdate:l=!1,mapSize:c=4096}=e,h=new Wd(i,s,r);return h.name=n,h.userData.sid=t,h.userData.stype="Light",h.position.set(o.x,o.y,o.z),h.castShadow=a,a&&(h.shadow.bias=-.005,h.shadow.camera.far=r,h.shadow.autoUpdate=l,h.shadow.mapSize.width=c,h.shadow.mapSize.height=c,h.shadow.camera.updateProjectionMatrix()),this.viewport.scener.addObject(h,this.scene),h}setPointLight(e,t){const{name:n="",color:i=16777215,intensity:s=1,distance:r=5e3,position:o={x:0,y:500,z:0},openShadow:a=!1,shadowAutoUpdate:l=!1,mapSize:c=4096}=t;return!!e&&(e.name=n,e.color=new Fn(i),e.intensity=s,e.distance=r,e.position.set(o.x,o.y,o.z),e.castShadow=a,a&&(e.shadow.bias=-.005,e.shadow.camera.far=r,e.shadow.autoUpdate=l,e.shadow.mapSize.width=c,e.shadow.mapSize.height=c,e.shadow.camera.updateProjectionMatrix()),this.viewport.signals.objectChanged.dispatch(),!0)}createRectAreaLight(e){const{id:t,name:n="",color:i=16777215,intensity:s=1,width:r=10,height:o=10,position:a={x:0,y:0,z:0}}=e,l=new Dd(i,s,r,o);return l.name=n,l.userData.sid=t,l.userData.stype="Light",l.position.set(a.x,a.y,a.z),this.viewport.scener.addObject(l,this.scene),l}setRectAreaLight(e,t){const{name:n="",color:i=16777215,intensity:s=1,width:r=10,height:o=10,position:a={x:0,y:0,z:0}}=t;return!!e&&(e.name=n,e.color=new Fn(i),e.intensity=s,e.width=r,e.height=o,e.position.set(a.x,a.y,a.z),this.viewport.signals.objectChanged.dispatch(),!0)}updateAllShadow(){this.getAll().forEach((e=>{var t;!1===(null===(t=e.shadow)||void 0===t?void 0:t.autoUpdate)&&(e.shadow.needsUpdate=!0)})),this.viewport.signals.objectChanged.dispatch()}}
42
42
  /*!
43
43
  fflate - fast JavaScript compression/decompression
44
44
  <https://101arrowz.github.io/fflate>
@@ -50,4 +50,4 @@ version 0.6.9
50
50
  Version 1.9.0
51
51
  https://localforage.github.io/localForage
52
52
  (c) 2013-2017 Mozilla, Apache License 2.0
53
- */var ZL=nb((function(e,t){e.exports=function e(t,n,i){function s(o,a){if(!n[o]){if(!t[o]){if(!a&&ib)return ib(o);if(r)return r(o,!0);var l=new Error("Cannot find module '"+o+"'");throw l.code="MODULE_NOT_FOUND",l}var c=n[o]={exports:{}};t[o][0].call(c.exports,(function(e){var n=t[o][1][e];return s(n||e)}),c,c.exports,e,t,n,i)}return n[o].exports}for(var r=ib,o=0;o<i.length;o++)s(i[o]);return s}({1:[function(e,t,n){(function(e){var n,i,s=e.MutationObserver||e.WebKitMutationObserver;if(s){var r=0,o=new s(h),a=e.document.createTextNode("");o.observe(a,{characterData:!0}),n=function(){a.data=r=++r%2}}else if(e.setImmediate||void 0===e.MessageChannel)n="document"in e&&"onreadystatechange"in e.document.createElement("script")?function(){var t=e.document.createElement("script");t.onreadystatechange=function(){h(),t.onreadystatechange=null,t.parentNode.removeChild(t),t=null},e.document.documentElement.appendChild(t)}:function(){setTimeout(h,0)};else{var l=new e.MessageChannel;l.port1.onmessage=h,n=function(){l.port2.postMessage(0)}}var c=[];function h(){var e,t;i=!0;for(var n=c.length;n;){for(t=c,c=[],e=-1;++e<n;)t[e]();n=c.length}i=!1}function d(e){1!==c.push(e)||i||n()}t.exports=d}).call(this,void 0!==eb?eb:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{}],2:[function(e,t,n){var i=e(1);function s(){}var r={},o=["REJECTED"],a=["FULFILLED"],l=["PENDING"];function c(e){if("function"!=typeof e)throw new TypeError("resolver must be a function");this.state=l,this.queue=[],this.outcome=void 0,e!==s&&p(this,e)}function h(e,t,n){this.promise=e,"function"==typeof t&&(this.onFulfilled=t,this.callFulfilled=this.otherCallFulfilled),"function"==typeof n&&(this.onRejected=n,this.callRejected=this.otherCallRejected)}function d(e,t,n){i((function(){var i;try{i=t(n)}catch(t){return r.reject(e,t)}i===e?r.reject(e,new TypeError("Cannot resolve promise with itself")):r.resolve(e,i)}))}function u(e){var t=e&&e.then;if(e&&("object"==typeof e||"function"==typeof e)&&"function"==typeof t)return function(){t.apply(e,arguments)}}function p(e,t){var n=!1;function i(t){n||(n=!0,r.reject(e,t))}function s(t){n||(n=!0,r.resolve(e,t))}function o(){t(s,i)}var a=m(o);"error"===a.status&&i(a.value)}function m(e,t){var n={};try{n.value=e(t),n.status="success"}catch(e){n.status="error",n.value=e}return n}function f(e){return e instanceof this?e:r.resolve(new this(s),e)}function g(e){var t=new this(s);return r.reject(t,e)}function y(e){var t=this;if("[object Array]"!==Object.prototype.toString.call(e))return this.reject(new TypeError("must be an array"));var n=e.length,i=!1;if(!n)return this.resolve([]);for(var o=new Array(n),a=0,l=-1,c=new this(s);++l<n;)h(e[l],l);return c;function h(e,s){function l(e){o[s]=e,++a!==n||i||(i=!0,r.resolve(c,o))}t.resolve(e).then(l,(function(e){i||(i=!0,r.reject(c,e))}))}}function b(e){var t=this;if("[object Array]"!==Object.prototype.toString.call(e))return this.reject(new TypeError("must be an array"));var n=e.length,i=!1;if(!n)return this.resolve([]);for(var o=-1,a=new this(s);++o<n;)l(e[o]);return a;function l(e){t.resolve(e).then((function(e){i||(i=!0,r.resolve(a,e))}),(function(e){i||(i=!0,r.reject(a,e))}))}}t.exports=c,c.prototype.catch=function(e){return this.then(null,e)},c.prototype.then=function(e,t){if("function"!=typeof e&&this.state===a||"function"!=typeof t&&this.state===o)return this;var n=new this.constructor(s);return this.state!==l?d(n,this.state===a?e:t,this.outcome):this.queue.push(new h(n,e,t)),n},h.prototype.callFulfilled=function(e){r.resolve(this.promise,e)},h.prototype.otherCallFulfilled=function(e){d(this.promise,this.onFulfilled,e)},h.prototype.callRejected=function(e){r.reject(this.promise,e)},h.prototype.otherCallRejected=function(e){d(this.promise,this.onRejected,e)},r.resolve=function(e,t){var n=m(u,t);if("error"===n.status)return r.reject(e,n.value);var i=n.value;if(i)p(e,i);else{e.state=a,e.outcome=t;for(var s=-1,o=e.queue.length;++s<o;)e.queue[s].callFulfilled(t)}return e},r.reject=function(e,t){e.state=o,e.outcome=t;for(var n=-1,i=e.queue.length;++n<i;)e.queue[n].callRejected(t);return e},c.resolve=f,c.reject=g,c.all=y,c.race=b},{1:1}],3:[function(e,t,n){(function(t){"function"!=typeof t.Promise&&(t.Promise=e(2))}).call(this,void 0!==eb?eb:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{2:2}],4:[function(e,t,n){var i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e};function s(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function r(){try{if("undefined"!=typeof indexedDB)return indexedDB;if("undefined"!=typeof webkitIndexedDB)return webkitIndexedDB;if("undefined"!=typeof mozIndexedDB)return mozIndexedDB;if("undefined"!=typeof OIndexedDB)return OIndexedDB;if("undefined"!=typeof msIndexedDB)return msIndexedDB}catch(e){return}}var o=r();function a(){try{if(!o||!o.open)return!1;var e="undefined"!=typeof openDatabase&&/(Safari|iPhone|iPad|iPod)/.test(navigator.userAgent)&&!/Chrome/.test(navigator.userAgent)&&!/BlackBerry/.test(navigator.platform),t="function"==typeof fetch&&-1!==fetch.toString().indexOf("[native code");return(!e||t)&&"undefined"!=typeof indexedDB&&"undefined"!=typeof IDBKeyRange}catch(e){return!1}}function l(e,t){e=e||[],t=t||{};try{return new Blob(e,t)}catch(s){if("TypeError"!==s.name)throw s;for(var n=new("undefined"!=typeof BlobBuilder?BlobBuilder:"undefined"!=typeof MSBlobBuilder?MSBlobBuilder:"undefined"!=typeof MozBlobBuilder?MozBlobBuilder:WebKitBlobBuilder),i=0;i<e.length;i+=1)n.append(e[i]);return n.getBlob(t.type)}}"undefined"==typeof Promise&&e(3);var c=Promise;function h(e,t){t&&e.then((function(e){t(null,e)}),(function(e){t(e)}))}function d(e,t,n){"function"==typeof t&&e.then(t),"function"==typeof n&&e.catch(n)}function u(e){return"string"!=typeof e&&(console.warn(e+" used as a key, but it is not a string."),e=String(e)),e}function p(){if(arguments.length&&"function"==typeof arguments[arguments.length-1])return arguments[arguments.length-1]}var m="local-forage-detect-blob-support",f=void 0,g={},y=Object.prototype.toString,b="readonly",v="readwrite";function x(e){for(var t=e.length,n=new ArrayBuffer(t),i=new Uint8Array(n),s=0;s<t;s++)i[s]=e.charCodeAt(s);return n}function w(e){return new c((function(t){var n=e.transaction(m,v),i=l([""]);n.objectStore(m).put(i,"key"),n.onabort=function(e){e.preventDefault(),e.stopPropagation(),t(!1)},n.oncomplete=function(){var e=navigator.userAgent.match(/Chrome\/(\d+)/),n=navigator.userAgent.match(/Edge\//);t(n||!e||parseInt(e[1],10)>=43)}})).catch((function(){return!1}))}function S(e){return"boolean"==typeof f?c.resolve(f):w(e).then((function(e){return f=e}))}function M(e){var t=g[e.name],n={};n.promise=new c((function(e,t){n.resolve=e,n.reject=t})),t.deferredOperations.push(n),t.dbReady?t.dbReady=t.dbReady.then((function(){return n.promise})):t.dbReady=n.promise}function T(e){var t=g[e.name].deferredOperations.pop();if(t)return t.resolve(),t.promise}function C(e,t){var n=g[e.name].deferredOperations.pop();if(n)return n.reject(t),n.promise}function L(e,t){return new c((function(n,i){if(g[e.name]=g[e.name]||W(),e.db){if(!t)return n(e.db);M(e),e.db.close()}var s=[e.name];t&&s.push(e.version);var r=o.open.apply(o,s);t&&(r.onupgradeneeded=function(t){var n=r.result;try{n.createObjectStore(e.storeName),t.oldVersion<=1&&n.createObjectStore(m)}catch(n){if("ConstraintError"!==n.name)throw n;console.warn('The database "'+e.name+'" has been upgraded from version '+t.oldVersion+" to version "+t.newVersion+', but the storage "'+e.storeName+'" already exists.')}}),r.onerror=function(e){e.preventDefault(),i(r.error)},r.onsuccess=function(){n(r.result),T(e)}}))}function R(e){return L(e,!1)}function G(e){return L(e,!0)}function A(e,t){if(!e.db)return!0;var n=!e.db.objectStoreNames.contains(e.storeName),i=e.version<e.db.version,s=e.version>e.db.version;if(i&&(e.version!==t&&console.warn('The database "'+e.name+"\" can't be downgraded from version "+e.db.version+" to version "+e.version+"."),e.version=e.db.version),s||n){if(n){var r=e.db.version+1;r>e.version&&(e.version=r)}return!0}return!1}function _(e){return new c((function(t,n){var i=new FileReader;i.onerror=n,i.onloadend=function(n){var i=btoa(n.target.result||"");t({__local_forage_encoded_blob:!0,data:i,type:e.type})},i.readAsBinaryString(e)}))}function I(e){return l([x(atob(e.data))],{type:e.type})}function E(e){return e&&e.__local_forage_encoded_blob}function X(e){var t=this,n=t._initReady().then((function(){var e=g[t._dbInfo.name];if(e&&e.dbReady)return e.dbReady}));return d(n,e,e),n}function z(e){M(e);for(var t=g[e.name],n=t.forages,i=0;i<n.length;i++){var s=n[i];s._dbInfo.db&&(s._dbInfo.db.close(),s._dbInfo.db=null)}return e.db=null,R(e).then((function(t){return e.db=t,A(e)?G(e):t})).then((function(i){e.db=t.db=i;for(var s=0;s<n.length;s++)n[s]._dbInfo.db=i})).catch((function(t){throw C(e,t),t}))}function P(e,t,n,i){void 0===i&&(i=1);try{var s=e.db.transaction(e.storeName,t);n(null,s)}catch(s){if(i>0&&(!e.db||"InvalidStateError"===s.name||"NotFoundError"===s.name))return c.resolve().then((function(){if(!e.db||"NotFoundError"===s.name&&!e.db.objectStoreNames.contains(e.storeName)&&e.version<=e.db.version)return e.db&&(e.version=e.db.version+1),G(e)})).then((function(){return z(e).then((function(){P(e,t,n,i-1)}))})).catch(n);n(s)}}function W(){return{forages:[],db:null,dbReady:null,deferredOperations:[]}}function Z(e){var t=this,n={db:null};if(e)for(var i in e)n[i]=e[i];var s=g[n.name];s||(s=W(),g[n.name]=s),s.forages.push(t),t._initReady||(t._initReady=t.ready,t.ready=X);var r=[];function o(){return c.resolve()}for(var a=0;a<s.forages.length;a++){var l=s.forages[a];l!==t&&r.push(l._initReady().catch(o))}var h=s.forages.slice(0);return c.all(r).then((function(){return n.db=s.db,R(n)})).then((function(e){return n.db=e,A(n,t._defaultConfig.version)?G(n):e})).then((function(e){n.db=s.db=e,t._dbInfo=n;for(var i=0;i<h.length;i++){var r=h[i];r!==t&&(r._dbInfo.db=n.db,r._dbInfo.version=n.version)}}))}function N(e,t){var n=this;e=u(e);var i=new c((function(t,i){n.ready().then((function(){P(n._dbInfo,b,(function(s,r){if(s)return i(s);try{var o=r.objectStore(n._dbInfo.storeName).get(e);o.onsuccess=function(){var e=o.result;void 0===e&&(e=null),E(e)&&(e=I(e)),t(e)},o.onerror=function(){i(o.error)}}catch(e){i(e)}}))})).catch(i)}));return h(i,t),i}function V(e,t){var n=this,i=new c((function(t,i){n.ready().then((function(){P(n._dbInfo,b,(function(s,r){if(s)return i(s);try{var o=r.objectStore(n._dbInfo.storeName).openCursor(),a=1;o.onsuccess=function(){var n=o.result;if(n){var i=n.value;E(i)&&(i=I(i));var s=e(i,n.key,a++);void 0!==s?t(s):n.continue()}else t()},o.onerror=function(){i(o.error)}}catch(e){i(e)}}))})).catch(i)}));return h(i,t),i}function D(e,t,n){var i=this;e=u(e);var s=new c((function(n,s){var r;i.ready().then((function(){return r=i._dbInfo,"[object Blob]"===y.call(t)?S(r.db).then((function(e){return e?t:_(t)})):t})).then((function(t){P(i._dbInfo,v,(function(r,o){if(r)return s(r);try{var a=o.objectStore(i._dbInfo.storeName);null===t&&(t=void 0);var l=a.put(t,e);o.oncomplete=function(){void 0===t&&(t=null),n(t)},o.onabort=o.onerror=function(){var e=l.error?l.error:l.transaction.error;s(e)}}catch(e){s(e)}}))})).catch(s)}));return h(s,n),s}function B(e,t){var n=this;e=u(e);var i=new c((function(t,i){n.ready().then((function(){P(n._dbInfo,v,(function(s,r){if(s)return i(s);try{var o=r.objectStore(n._dbInfo.storeName).delete(e);r.oncomplete=function(){t()},r.onerror=function(){i(o.error)},r.onabort=function(){var e=o.error?o.error:o.transaction.error;i(e)}}catch(e){i(e)}}))})).catch(i)}));return h(i,t),i}function H(e){var t=this,n=new c((function(e,n){t.ready().then((function(){P(t._dbInfo,v,(function(i,s){if(i)return n(i);try{var r=s.objectStore(t._dbInfo.storeName).clear();s.oncomplete=function(){e()},s.onabort=s.onerror=function(){var e=r.error?r.error:r.transaction.error;n(e)}}catch(e){n(e)}}))})).catch(n)}));return h(n,e),n}function k(e){var t=this,n=new c((function(e,n){t.ready().then((function(){P(t._dbInfo,b,(function(i,s){if(i)return n(i);try{var r=s.objectStore(t._dbInfo.storeName).count();r.onsuccess=function(){e(r.result)},r.onerror=function(){n(r.error)}}catch(e){n(e)}}))})).catch(n)}));return h(n,e),n}function F(e,t){var n=this,i=new c((function(t,i){e<0?t(null):n.ready().then((function(){P(n._dbInfo,b,(function(s,r){if(s)return i(s);try{var o=r.objectStore(n._dbInfo.storeName),a=!1,l=o.openKeyCursor();l.onsuccess=function(){var n=l.result;n?0===e||a?t(n.key):(a=!0,n.advance(e)):t(null)},l.onerror=function(){i(l.error)}}catch(e){i(e)}}))})).catch(i)}));return h(i,t),i}function U(e){var t=this,n=new c((function(e,n){t.ready().then((function(){P(t._dbInfo,b,(function(i,s){if(i)return n(i);try{var r=s.objectStore(t._dbInfo.storeName).openKeyCursor(),o=[];r.onsuccess=function(){var t=r.result;t?(o.push(t.key),t.continue()):e(o)},r.onerror=function(){n(r.error)}}catch(e){n(e)}}))})).catch(n)}));return h(n,e),n}function O(e,t){t=p.apply(this,arguments);var n=this.config();(e="function"!=typeof e&&e||{}).name||(e.name=e.name||n.name,e.storeName=e.storeName||n.storeName);var i,s=this;if(e.name){var r=e.name===n.name&&s._dbInfo.db?c.resolve(s._dbInfo.db):R(e).then((function(t){var n=g[e.name],i=n.forages;n.db=t;for(var s=0;s<i.length;s++)i[s]._dbInfo.db=t;return t}));i=e.storeName?r.then((function(t){if(t.objectStoreNames.contains(e.storeName)){var n=t.version+1;M(e);var i=g[e.name],s=i.forages;t.close();for(var r=0;r<s.length;r++){var a=s[r];a._dbInfo.db=null,a._dbInfo.version=n}return new c((function(t,i){var s=o.open(e.name,n);s.onerror=function(e){s.result.close(),i(e)},s.onupgradeneeded=function(){s.result.deleteObjectStore(e.storeName)},s.onsuccess=function(){var e=s.result;e.close(),t(e)}})).then((function(e){i.db=e;for(var t=0;t<s.length;t++){var n=s[t];n._dbInfo.db=e,T(n._dbInfo)}})).catch((function(t){throw(C(e,t)||c.resolve()).catch((function(){})),t}))}})):r.then((function(t){M(e);var n=g[e.name],i=n.forages;t.close();for(var s=0;s<i.length;s++)i[s]._dbInfo.db=null;return new c((function(t,n){var i=o.deleteDatabase(e.name);i.onerror=i.onblocked=function(e){var t=i.result;t&&t.close(),n(e)},i.onsuccess=function(){var e=i.result;e&&e.close(),t(e)}})).then((function(e){n.db=e;for(var t=0;t<i.length;t++)T(i[t]._dbInfo)})).catch((function(t){throw(C(e,t)||c.resolve()).catch((function(){})),t}))}))}else i=c.reject("Invalid arguments");return h(i,t),i}var Y={_driver:"asyncStorage",_initStorage:Z,_support:a(),iterate:V,getItem:N,setItem:D,removeItem:B,clear:H,length:k,key:F,keys:U,dropInstance:O};function K(){return"function"==typeof openDatabase}var j="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",J="~~local_forage_type~",Q=/^~~local_forage_type~([^~]+)~/,q="__lfsc__:",$=q.length,ee="arbf",te="blob",ne="si08",ie="ui08",se="uic8",re="si16",oe="si32",ae="ur16",le="ui32",ce="fl32",he="fl64",de=$+ee.length,ue=Object.prototype.toString;function pe(e){var t,n,i,s,r,o=.75*e.length,a=e.length,l=0;"="===e[e.length-1]&&(o--,"="===e[e.length-2]&&o--);var c=new ArrayBuffer(o),h=new Uint8Array(c);for(t=0;t<a;t+=4)n=j.indexOf(e[t]),i=j.indexOf(e[t+1]),s=j.indexOf(e[t+2]),r=j.indexOf(e[t+3]),h[l++]=n<<2|i>>4,h[l++]=(15&i)<<4|s>>2,h[l++]=(3&s)<<6|63&r;return c}function me(e){var t,n=new Uint8Array(e),i="";for(t=0;t<n.length;t+=3)i+=j[n[t]>>2],i+=j[(3&n[t])<<4|n[t+1]>>4],i+=j[(15&n[t+1])<<2|n[t+2]>>6],i+=j[63&n[t+2]];return n.length%3==2?i=i.substring(0,i.length-1)+"=":n.length%3==1&&(i=i.substring(0,i.length-2)+"=="),i}function fe(e,t){var n="";if(e&&(n=ue.call(e)),e&&("[object ArrayBuffer]"===n||e.buffer&&"[object ArrayBuffer]"===ue.call(e.buffer))){var i,s=q;e instanceof ArrayBuffer?(i=e,s+=ee):(i=e.buffer,"[object Int8Array]"===n?s+=ne:"[object Uint8Array]"===n?s+=ie:"[object Uint8ClampedArray]"===n?s+=se:"[object Int16Array]"===n?s+=re:"[object Uint16Array]"===n?s+=ae:"[object Int32Array]"===n?s+=oe:"[object Uint32Array]"===n?s+=le:"[object Float32Array]"===n?s+=ce:"[object Float64Array]"===n?s+=he:t(new Error("Failed to get type for BinaryArray"))),t(s+me(i))}else if("[object Blob]"===n){var r=new FileReader;r.onload=function(){var n=J+e.type+"~"+me(this.result);t(q+te+n)},r.readAsArrayBuffer(e)}else try{t(JSON.stringify(e))}catch(n){console.error("Couldn't convert value into a JSON string: ",e),t(null,n)}}function ge(e){if(e.substring(0,$)!==q)return JSON.parse(e);var t,n=e.substring(de),i=e.substring($,de);if(i===te&&Q.test(n)){var s=n.match(Q);t=s[1],n=n.substring(s[0].length)}var r=pe(n);switch(i){case ee:return r;case te:return l([r],{type:t});case ne:return new Int8Array(r);case ie:return new Uint8Array(r);case se:return new Uint8ClampedArray(r);case re:return new Int16Array(r);case ae:return new Uint16Array(r);case oe:return new Int32Array(r);case le:return new Uint32Array(r);case ce:return new Float32Array(r);case he:return new Float64Array(r);default:throw new Error("Unkown type: "+i)}}var ye={serialize:fe,deserialize:ge,stringToBuffer:pe,bufferToString:me};function be(e,t,n,i){e.executeSql("CREATE TABLE IF NOT EXISTS "+t.storeName+" (id INTEGER PRIMARY KEY, key unique, value)",[],n,i)}function ve(e){var t=this,n={db:null};if(e)for(var i in e)n[i]="string"!=typeof e[i]?e[i].toString():e[i];var s=new c((function(e,i){try{n.db=openDatabase(n.name,String(n.version),n.description,n.size)}catch(e){return i(e)}n.db.transaction((function(s){be(s,n,(function(){t._dbInfo=n,e()}),(function(e,t){i(t)}))}),i)}));return n.serializer=ye,s}function xe(e,t,n,i,s,r){e.executeSql(n,i,s,(function(e,o){o.code===o.SYNTAX_ERR?e.executeSql("SELECT name FROM sqlite_master WHERE type='table' AND name = ?",[t.storeName],(function(e,a){a.rows.length?r(e,o):be(e,t,(function(){e.executeSql(n,i,s,r)}),r)}),r):r(e,o)}),r)}function we(e,t){var n=this;e=u(e);var i=new c((function(t,i){n.ready().then((function(){var s=n._dbInfo;s.db.transaction((function(n){xe(n,s,"SELECT * FROM "+s.storeName+" WHERE key = ? LIMIT 1",[e],(function(e,n){var i=n.rows.length?n.rows.item(0).value:null;i&&(i=s.serializer.deserialize(i)),t(i)}),(function(e,t){i(t)}))}))})).catch(i)}));return h(i,t),i}function Se(e,t){var n=this,i=new c((function(t,i){n.ready().then((function(){var s=n._dbInfo;s.db.transaction((function(n){xe(n,s,"SELECT * FROM "+s.storeName,[],(function(n,i){for(var r=i.rows,o=r.length,a=0;a<o;a++){var l=r.item(a),c=l.value;if(c&&(c=s.serializer.deserialize(c)),void 0!==(c=e(c,l.key,a+1)))return void t(c)}t()}),(function(e,t){i(t)}))}))})).catch(i)}));return h(i,t),i}function Me(e,t,n,i){var s=this;e=u(e);var r=new c((function(r,o){s.ready().then((function(){void 0===t&&(t=null);var a=t,l=s._dbInfo;l.serializer.serialize(t,(function(t,c){c?o(c):l.db.transaction((function(n){xe(n,l,"INSERT OR REPLACE INTO "+l.storeName+" (key, value) VALUES (?, ?)",[e,t],(function(){r(a)}),(function(e,t){o(t)}))}),(function(t){if(t.code===t.QUOTA_ERR){if(i>0)return void r(Me.apply(s,[e,a,n,i-1]));o(t)}}))}))})).catch(o)}));return h(r,n),r}function Te(e,t,n){return Me.apply(this,[e,t,n,1])}function Ce(e,t){var n=this;e=u(e);var i=new c((function(t,i){n.ready().then((function(){var s=n._dbInfo;s.db.transaction((function(n){xe(n,s,"DELETE FROM "+s.storeName+" WHERE key = ?",[e],(function(){t()}),(function(e,t){i(t)}))}))})).catch(i)}));return h(i,t),i}function Le(e){var t=this,n=new c((function(e,n){t.ready().then((function(){var i=t._dbInfo;i.db.transaction((function(t){xe(t,i,"DELETE FROM "+i.storeName,[],(function(){e()}),(function(e,t){n(t)}))}))})).catch(n)}));return h(n,e),n}function Re(e){var t=this,n=new c((function(e,n){t.ready().then((function(){var i=t._dbInfo;i.db.transaction((function(t){xe(t,i,"SELECT COUNT(key) as c FROM "+i.storeName,[],(function(t,n){var i=n.rows.item(0).c;e(i)}),(function(e,t){n(t)}))}))})).catch(n)}));return h(n,e),n}function Ge(e,t){var n=this,i=new c((function(t,i){n.ready().then((function(){var s=n._dbInfo;s.db.transaction((function(n){xe(n,s,"SELECT key FROM "+s.storeName+" WHERE id = ? LIMIT 1",[e+1],(function(e,n){var i=n.rows.length?n.rows.item(0).key:null;t(i)}),(function(e,t){i(t)}))}))})).catch(i)}));return h(i,t),i}function Ae(e){var t=this,n=new c((function(e,n){t.ready().then((function(){var i=t._dbInfo;i.db.transaction((function(t){xe(t,i,"SELECT key FROM "+i.storeName,[],(function(t,n){for(var i=[],s=0;s<n.rows.length;s++)i.push(n.rows.item(s).key);e(i)}),(function(e,t){n(t)}))}))})).catch(n)}));return h(n,e),n}function _e(e){return new c((function(t,n){e.transaction((function(i){i.executeSql("SELECT name FROM sqlite_master WHERE type='table' AND name <> '__WebKitDatabaseInfoTable__'",[],(function(n,i){for(var s=[],r=0;r<i.rows.length;r++)s.push(i.rows.item(r).name);t({db:e,storeNames:s})}),(function(e,t){n(t)}))}),(function(e){n(e)}))}))}function Ie(e,t){t=p.apply(this,arguments);var n=this.config();(e="function"!=typeof e&&e||{}).name||(e.name=e.name||n.name,e.storeName=e.storeName||n.storeName);var i,s=this;return h(i=e.name?new c((function(t){var i;i=e.name===n.name?s._dbInfo.db:openDatabase(e.name,"","",0),e.storeName?t({db:i,storeNames:[e.storeName]}):t(_e(i))})).then((function(e){return new c((function(t,n){e.db.transaction((function(i){function s(e){return new c((function(t,n){i.executeSql("DROP TABLE IF EXISTS "+e,[],(function(){t()}),(function(e,t){n(t)}))}))}for(var r=[],o=0,a=e.storeNames.length;o<a;o++)r.push(s(e.storeNames[o]));c.all(r).then((function(){t()})).catch((function(e){n(e)}))}),(function(e){n(e)}))}))})):c.reject("Invalid arguments"),t),i}var Ee={_driver:"webSQLStorage",_initStorage:ve,_support:K(),iterate:Se,getItem:we,setItem:Te,removeItem:Ce,clear:Le,length:Re,key:Ge,keys:Ae,dropInstance:Ie};function Xe(){try{return"undefined"!=typeof localStorage&&"setItem"in localStorage&&!!localStorage.setItem}catch(e){return!1}}function ze(e,t){var n=e.name+"/";return e.storeName!==t.storeName&&(n+=e.storeName+"/"),n}function Pe(){var e="_localforage_support_test";try{return localStorage.setItem(e,!0),localStorage.removeItem(e),!1}catch(e){return!0}}function We(){return!Pe()||localStorage.length>0}function Ze(e){var t=this,n={};if(e)for(var i in e)n[i]=e[i];return n.keyPrefix=ze(e,t._defaultConfig),We()?(t._dbInfo=n,n.serializer=ye,c.resolve()):c.reject()}function Ne(e){var t=this,n=t.ready().then((function(){for(var e=t._dbInfo.keyPrefix,n=localStorage.length-1;n>=0;n--){var i=localStorage.key(n);0===i.indexOf(e)&&localStorage.removeItem(i)}}));return h(n,e),n}function Ve(e,t){var n=this;e=u(e);var i=n.ready().then((function(){var t=n._dbInfo,i=localStorage.getItem(t.keyPrefix+e);return i&&(i=t.serializer.deserialize(i)),i}));return h(i,t),i}function De(e,t){var n=this,i=n.ready().then((function(){for(var t=n._dbInfo,i=t.keyPrefix,s=i.length,r=localStorage.length,o=1,a=0;a<r;a++){var l=localStorage.key(a);if(0===l.indexOf(i)){var c=localStorage.getItem(l);if(c&&(c=t.serializer.deserialize(c)),void 0!==(c=e(c,l.substring(s),o++)))return c}}}));return h(i,t),i}function Be(e,t){var n=this,i=n.ready().then((function(){var t,i=n._dbInfo;try{t=localStorage.key(e)}catch(e){t=null}return t&&(t=t.substring(i.keyPrefix.length)),t}));return h(i,t),i}function He(e){var t=this,n=t.ready().then((function(){for(var e=t._dbInfo,n=localStorage.length,i=[],s=0;s<n;s++){var r=localStorage.key(s);0===r.indexOf(e.keyPrefix)&&i.push(r.substring(e.keyPrefix.length))}return i}));return h(n,e),n}function ke(e){var t=this.keys().then((function(e){return e.length}));return h(t,e),t}function Fe(e,t){var n=this;e=u(e);var i=n.ready().then((function(){var t=n._dbInfo;localStorage.removeItem(t.keyPrefix+e)}));return h(i,t),i}function Ue(e,t,n){var i=this;e=u(e);var s=i.ready().then((function(){void 0===t&&(t=null);var n=t;return new c((function(s,r){var o=i._dbInfo;o.serializer.serialize(t,(function(t,i){if(i)r(i);else try{localStorage.setItem(o.keyPrefix+e,t),s(n)}catch(e){"QuotaExceededError"!==e.name&&"NS_ERROR_DOM_QUOTA_REACHED"!==e.name||r(e),r(e)}}))}))}));return h(s,n),s}function Oe(e,t){if(t=p.apply(this,arguments),!(e="function"!=typeof e&&e||{}).name){var n=this.config();e.name=e.name||n.name,e.storeName=e.storeName||n.storeName}var i,s=this;return h(i=e.name?new c((function(t){e.storeName?t(ze(e,s._defaultConfig)):t(e.name+"/")})).then((function(e){for(var t=localStorage.length-1;t>=0;t--){var n=localStorage.key(t);0===n.indexOf(e)&&localStorage.removeItem(n)}})):c.reject("Invalid arguments"),t),i}var Ye={_driver:"localStorageWrapper",_initStorage:Ze,_support:Xe(),iterate:De,getItem:Ve,setItem:Ue,removeItem:Fe,clear:Ne,length:ke,key:Be,keys:He,dropInstance:Oe},Ke=function(e,t){return e===t||"number"==typeof e&&"number"==typeof t&&isNaN(e)&&isNaN(t)},je=function(e,t){for(var n=e.length,i=0;i<n;){if(Ke(e[i],t))return!0;i++}return!1},Je=Array.isArray||function(e){return"[object Array]"===Object.prototype.toString.call(e)},Qe={},qe={},$e={INDEXEDDB:Y,WEBSQL:Ee,LOCALSTORAGE:Ye},et=[$e.INDEXEDDB._driver,$e.WEBSQL._driver,$e.LOCALSTORAGE._driver],tt=["dropInstance"],nt=["clear","getItem","iterate","key","keys","length","removeItem","setItem"].concat(tt),it={description:"",driver:et.slice(),name:"localforage",size:4980736,storeName:"keyvaluepairs",version:1};function st(e,t){e[t]=function(){var n=arguments;return e.ready().then((function(){return e[t].apply(e,n)}))}}function rt(){for(var e=1;e<arguments.length;e++){var t=arguments[e];if(t)for(var n in t)t.hasOwnProperty(n)&&(Je(t[n])?arguments[0][n]=t[n].slice():arguments[0][n]=t[n])}return arguments[0]}var ot=new(function(){function e(t){for(var n in s(this,e),$e)if($e.hasOwnProperty(n)){var i=$e[n],r=i._driver;this[n]=r,Qe[r]||this.defineDriver(i)}this._defaultConfig=rt({},it),this._config=rt({},this._defaultConfig,t),this._driverSet=null,this._initDriver=null,this._ready=!1,this._dbInfo=null,this._wrapLibraryMethodsWithReady(),this.setDriver(this._config.driver).catch((function(){}))}return e.prototype.config=function(e){if("object"===(void 0===e?"undefined":i(e))){if(this._ready)return new Error("Can't call config() after localforage has been used.");for(var t in e){if("storeName"===t&&(e[t]=e[t].replace(/\W/g,"_")),"version"===t&&"number"!=typeof e[t])return new Error("Database version must be a number.");this._config[t]=e[t]}return!("driver"in e)||!e.driver||this.setDriver(this._config.driver)}return"string"==typeof e?this._config[e]:this._config},e.prototype.defineDriver=function(e,t,n){var i=new c((function(t,n){try{var i=e._driver,s=new Error("Custom driver not compliant; see https://mozilla.github.io/localForage/#definedriver");if(!e._driver)return void n(s);for(var r=nt.concat("_initStorage"),o=0,a=r.length;o<a;o++){var l=r[o];if((!je(tt,l)||e[l])&&"function"!=typeof e[l])return void n(s)}!function(){for(var t=function(e){return function(){var t=new Error("Method "+e+" is not implemented by the current driver"),n=c.reject(t);return h(n,arguments[arguments.length-1]),n}},n=0,i=tt.length;n<i;n++){var s=tt[n];e[s]||(e[s]=t(s))}}();var d=function(n){Qe[i]&&console.info("Redefining LocalForage driver: "+i),Qe[i]=e,qe[i]=n,t()};"_support"in e?e._support&&"function"==typeof e._support?e._support().then(d,n):d(!!e._support):d(!0)}catch(e){n(e)}}));return d(i,t,n),i},e.prototype.driver=function(){return this._driver||null},e.prototype.getDriver=function(e,t,n){var i=Qe[e]?c.resolve(Qe[e]):c.reject(new Error("Driver not found."));return d(i,t,n),i},e.prototype.getSerializer=function(e){var t=c.resolve(ye);return d(t,e),t},e.prototype.ready=function(e){var t=this,n=t._driverSet.then((function(){return null===t._ready&&(t._ready=t._initDriver()),t._ready}));return d(n,e,e),n},e.prototype.setDriver=function(e,t,n){var i=this;Je(e)||(e=[e]);var s=this._getSupportedDrivers(e);function r(){i._config.driver=i.driver()}function o(e){return i._extend(e),r(),i._ready=i._initStorage(i._config),i._ready}function a(e){return function(){var t=0;function n(){for(;t<e.length;){var s=e[t];return t++,i._dbInfo=null,i._ready=null,i.getDriver(s).then(o).catch(n)}r();var a=new Error("No available storage method found.");return i._driverSet=c.reject(a),i._driverSet}return n()}}var l=null!==this._driverSet?this._driverSet.catch((function(){return c.resolve()})):c.resolve();return this._driverSet=l.then((function(){var e=s[0];return i._dbInfo=null,i._ready=null,i.getDriver(e).then((function(e){i._driver=e._driver,r(),i._wrapLibraryMethodsWithReady(),i._initDriver=a(s)}))})).catch((function(){r();var e=new Error("No available storage method found.");return i._driverSet=c.reject(e),i._driverSet})),d(this._driverSet,t,n),this._driverSet},e.prototype.supports=function(e){return!!qe[e]},e.prototype._extend=function(e){rt(this,e)},e.prototype._getSupportedDrivers=function(e){for(var t=[],n=0,i=e.length;n<i;n++){var s=e[n];this.supports(s)&&t.push(s)}return t},e.prototype._wrapLibraryMethodsWithReady=function(){for(var e=0,t=nt.length;e<t;e++)st(this,nt[e])},e.prototype.createInstance=function(t){return new e(t)},e}());t.exports=ot},{3:3}]},{},[4])(4)}));class NL{constructor(e){this.name="EXT_mesh_gpu_instancing",this.parser=e}createNodeMesh(e){const t=this.parser.json.nodes[e];if(!t.extensions||!t.extensions[this.name]||void 0===t.mesh)return null;const n=t.extensions[this.name].attributes,i=[],s={};for(const e in n)i.push(this.parser.getDependency("accessor",n[e]).then((t=>(s[e]=t,s[e]))));return i.length<1?null:(i.push(this.parser.createNodeMesh(e)),Promise.all(i).then((e=>{const t=e.pop(),n=t.isGroup?t.children:[t],i=e[0].count,r=[];for(const e of n){const t=e.matrix.clone(),n=e.position.clone().set(0,0,0),o=e.quaternion.clone().set(0,0,0,1),a=e.scale.clone().set(1,1,1),l=new Kl(e.geometry,e.material,i);for(let e=0;e<i;e++)s.TRANSLATION&&n.fromBufferAttribute(s.TRANSLATION,e),s.ROTATION&&o.fromBufferAttribute(s.ROTATION,e),s.SCALE&&a.fromBufferAttribute(s.SCALE,e),l.setMatrixAt(e,t.compose(n,o,a));for(const t in s)"TRANSLATION"!==t&&"ROTATION"!==t&&"SCALE"!==t&&e.geometry.setAttribute(t,s[t]);as.prototype.copy.call(l,e),l.frustumCulled=!1,this.parser.assignFinalMaterial(l),r.push(l)}if(t.isGroup){for(;t.children.length>0;)t.remove(t.children[0]);for(const e of r)t.add(e);return t}return r[0]})))}}const VL=()=>{self.noCompressWorker=function(e,t){const[n]=new Uint32Array(e,t,1),i={byteOffset:t+=4,length:3*n},s={byteOffset:t+=3*n*4,length:2*n},r={byteOffset:t+=2*n*4,length:4*n},o={byteOffset:t+=4*n*1,length:3*n};t+=3*n*1;let a=(r.length+o.length)%4;a>0&&(a=4-a,t+=a);const l=new Uint32Array(e,t,1);t+=4;const[c]=l,h={byteOffset:t,length:c};t+=4*c;const d=new Uint32Array(e,t,1);t+=4;const[u]=d,p=[];if(u>0)for(let n=0;n<u;n++){const[n]=new Uint32Array(e,t,1);t+=4;const[i]=new Uint32Array(e,t,1);t+=4;const[s]=new Uint32Array(e,t,1);t+=4;const[r]=new Uint32Array(e,t,1);t+=4;const o=new Uint8Array(e,t,r);t+=r;const a=(new TextDecoder).decode(o);p.push({start:n,count:i,uuid:a,alphaMode:s})}return{buffer:e,position:i,normal:o,color:r,texcoord:s,indice:h,sub_mesh:p}}},DL=()=>{self.gzipCompressWorker=function(e){const t=new Uint8Array(e,4,e.byteLength-4),n=new pako.Inflate;n.push(t,!0);const{result:i}=n;if(i instanceof Uint8Array){const{buffer:e}=i;let t=0;const[n]=new Uint32Array(e,t,1);t+=4;const s={byteOffset:t,length:3*n};t+=3*n*4;const r={byteOffset:t,length:2*n};t+=2*n*4;const o={byteOffset:t,length:4*n};t+=4*n*1;const a={byteOffset:t,length:3*n};t+=3*n*1;let l=(o.length+a.length)%4;l>0&&(l=4-l,t+=l);const c=new Uint32Array(e,t,1);t+=4;const[h]=c,d={byteOffset:t,length:h};t+=4*h;const u=new Uint32Array(e,t,1);t+=4;const[p]=u,m=[];if(p>0)for(let n=0;n<p;n++){const[n]=new Uint32Array(e,t,1);t+=4;const[i]=new Uint32Array(e,t,1);t+=4;const[s]=new Uint32Array(e,t,1);t+=4;const[r]=new Uint32Array(e,t,1);t+=4;const o=new Uint8Array(e,t,r);t+=r;const a=(new TextDecoder).decode(o);m.push({start:n,count:i,uuid:a,alphaMode:s})}return{buffer:e,position:s,normal:a,color:o,texcoord:r,indice:d,sub_mesh:m}}}},BL=()=>{self.parseChunkWorker=function(e){let t=0;const n=new Int8Array(e,t,128);t+=128,(new TextDecoder).decode(n.slice(0,4));const[i]=n.slice(4,8);if(0===i)return self.noCompressWorker(e,t);if(1===i){const t=e.slice(128);return self.gzipCompressWorker(t)}throw new Error("unknown compress mode [ .sbmx model ]")}},HL="\n onmessage = function ( e ) {\n \n const message = e.data\n\n switch ( message.type ) {\n\n case 'decode': {\n\n const chunkInfo = self.parseChunkWorker( message.data )\n\n if ( chunkInfo ) { \n\n self.postMessage( \n { type: 'decode', data: chunkInfo, }, \n [ chunkInfo.buffer ]\n )\n\n } else {\n\n self.postMessage( { type: 'decode', data: {}, } )\n\n }\n\n break\n \n }\n \n }\n\n }\n\n";class kL extends fd{constructor(e){super(),this.store=e,this.loadedTextures=new Map,this.loadedMaterialsMap=new Map,this.defaultMaterial=new kh({name:"defaultDatMaterial",color:0}),this.loadedMaterials=[this.defaultMaterial],this.dracoDecoderPath=null,this.workerPool=new Dy(4),this.workerSourceURL="";const t=this._initWorkerCreator();this.workerPool.setWorkerCreator(t)}parseAsync(e,t){return rf(this,void 0,void 0,(function*(){const[n]=yield Promise.allSettled([this._decodeBuffer(e,t),this._createMaterial(t)]);if("fulfilled"===n.status&&n.value){const e=qm(t),i=this._createMesh(n.value,e),s=new qa;return s.add(i),s}}))}_decodeBuffer(e,t){return rf(this,void 0,void 0,(function*(){const n=yield this.store.getItem(`${t}_object`);if(n)return n;const[{data:i}]=yield Promise.all([this.workerPool.postMessage({type:"decode",data:e},[e])]);if(i){const{type:e,data:n}=null!=i?i:{};if("decode"===e&&n){const{buffer:{byteLength:e}}=n;return ig(e)&&e/1024/1024<=500&&ff((()=>{this.store.setItem(`${t}_object`,n)})),n}}}))}_initWorkerCreator(){if(!this.workerSourceURL){const e=VL.toString(),t=DL.toString(),n=BL.toString(),i=["/* dat decoder */",["/* pako */","\n\n(function (global, factory) {\n typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :\n typeof define === 'function' && define.amd ? define(['exports'], factory) :\n (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.pako = {}));\n}(this, (function (exports) { 'use strict';\n\n // Note: adler32 takes 12% for level 0 and 2% for level 6.\n // It isn't worth it to make additional optimizations as in original.\n // Small size is preferable.\n\n // (C) 1995-2013 Jean-loup Gailly and Mark Adler\n // (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n //\n // This software is provided 'as-is', without any express ofr implied\n // warranty. In no event will the authors be held liable for any damages\n // arising from the use of this software.\n //\n // Permission is granted to anyone to use this software for any purpose,\n // including commercial applications, and to alter it and redistribute it\n // freely, subject to the following restrictions:\n //\n // 1. The origin of this software must not be misrepresented; you must not\n // claim that you wrote the original software. If you use this software\n // in a product, an acknowledgment in the product documentation would be\n // appreciated but is not required.\n // 2. Altered source versions must be plainly marked as such, and must not be\n // misrepresented as being the original software.\n // 3. This notice may not be removed or altered from any source distribution.\n\n const adler32 = (adler, buf, len, pos) => {\n let s1 = (adler & 0xffff) |0,\n s2 = ((adler >>> 16) & 0xffff) |0,\n n = 0;\n\n while (len !== 0) {\n // Set limit ~ twice less than 5552, to keep\n // s2 in 31-bits, because we force signed ints.\n // in other case %= will fail.\n n = len > 2000 ? 2000 : len;\n len -= n;\n\n do {\n s1 = (s1 + buf[pos++]) |0;\n s2 = (s2 + s1) |0;\n } while (--n);\n\n s1 %= 65521;\n s2 %= 65521;\n }\n\n return (s1 | (s2 << 16)) |0;\n };\n\n\n var adler32_1 = adler32;\n\n // Note: we can't get significant speed boost here.\n // So write code to minimize size - no pregenerated tables\n // and array tools dependencies.\n\n // (C) 1995-2013 Jean-loup Gailly and Mark Adler\n // (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n //\n // This software is provided 'as-is', without any express or implied\n // warranty. In no event will the authors be held liable for any damages\n // arising from the use of this software.\n //\n // Permission is granted to anyone to use this software for any purpose,\n // including commercial applications, and to alter it and redistribute it\n // freely, subject to the following restrictions:\n //\n // 1. The origin of this software must not be misrepresented; you must not\n // claim that you wrote the original software. If you use this software\n // in a product, an acknowledgment in the product documentation would be\n // appreciated but is not required.\n // 2. Altered source versions must be plainly marked as such, and must not be\n // misrepresented as being the original software.\n // 3. This notice may not be removed or altered from any source distribution.\n\n // Use ordinary array, since untyped makes no boost here\n const makeTable = () => {\n let c, table = [];\n\n for (var n = 0; n < 256; n++) {\n c = n;\n for (var k = 0; k < 8; k++) {\n c = ((c & 1) ? (0xEDB88320 ^ (c >>> 1)) : (c >>> 1));\n }\n table[n] = c;\n }\n\n return table;\n };\n\n // Create table on load. Just 255 signed longs. Not a problem.\n const crcTable = new Uint32Array(makeTable());\n\n\n const crc32 = (crc, buf, len, pos) => {\n const t = crcTable;\n const end = pos + len;\n\n crc ^= -1;\n\n for (let i = pos; i < end; i++) {\n crc = (crc >>> 8) ^ t[(crc ^ buf[i]) & 0xFF];\n }\n\n return (crc ^ (-1)); // >>> 0;\n };\n\n\n var crc32_1 = crc32;\n\n // (C) 1995-2013 Jean-loup Gailly and Mark Adler\n // (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n //\n // This software is provided 'as-is', without any express or implied\n // warranty. In no event will the authors be held liable for any damages\n // arising from the use of this software.\n //\n // Permission is granted to anyone to use this software for any purpose,\n // including commercial applications, and to alter it and redistribute it\n // freely, subject to the following restrictions:\n //\n // 1. The origin of this software must not be misrepresented; you must not\n // claim that you wrote the original software. If you use this software\n // in a product, an acknowledgment in the product documentation would be\n // appreciated but is not required.\n // 2. Altered source versions must be plainly marked as such, and must not be\n // misrepresented as being the original software.\n // 3. This notice may not be removed or altered from any source distribution.\n\n // See state defs from inflate.js\n const BAD$1 = 30; /* got a data error -- remain here until reset */\n const TYPE$1 = 12; /* i: waiting for type bits, including last-flag bit */\n\n /*\n Decode literal, length, and distance codes and write out the resulting\n literal and match bytes until either not enough input or output is\n available, an end-of-block is encountered, or a data error is encountered.\n When large enough input and output buffers are supplied to inflate(), for\n example, a 16K input buffer and a 64K output buffer, more than 95% of the\n inflate execution time is spent in this routine.\n\n Entry assumptions:\n\n state.mode === LEN\n strm.avail_in >= 6\n strm.avail_out >= 258\n start >= strm.avail_out\n state.bits < 8\n\n On return, state.mode is one of:\n\n LEN -- ran out of enough output space or enough available input\n TYPE -- reached end of block code, inflate() to interpret next block\n BAD -- error in block data\n\n Notes:\n\n - The maximum input bits used by a length/distance pair is 15 bits for the\n length code, 5 bits for the length extra, 15 bits for the distance code,\n and 13 bits for the distance extra. This totals 48 bits, or six bytes.\n Therefore if strm.avail_in >= 6, then there is enough input to avoid\n checking for available input while decoding.\n\n - The maximum bytes that a single length/distance pair can output is 258\n bytes, which is the maximum length that can be coded. inflate_fast()\n requires strm.avail_out >= 258 for each loop to avoid checking for\n output space.\n */\n var inffast = function inflate_fast(strm, start) {\n let _in; /* local strm.input */\n let last; /* have enough input while in < last */\n let _out; /* local strm.output */\n let beg; /* inflate()'s initial strm.output */\n let end; /* while out < end, enough space available */\n //#ifdef INFLATE_STRICT\n let dmax; /* maximum distance from zlib header */\n //#endif\n let wsize; /* window size or zero if not using window */\n let whave; /* valid bytes in the window */\n let wnext; /* window write index */\n // Use `s_window` instead `window`, avoid conflict with instrumentation tools\n let s_window; /* allocated sliding window, if wsize != 0 */\n let hold; /* local strm.hold */\n let bits; /* local strm.bits */\n let lcode; /* local strm.lencode */\n let dcode; /* local strm.distcode */\n let lmask; /* mask for first level of length codes */\n let dmask; /* mask for first level of distance codes */\n let here; /* retrieved table entry */\n let op; /* code bits, operation, extra bits, or */\n /* window position, window bytes to copy */\n let len; /* match length, unused bytes */\n let dist; /* match distance */\n let from; /* where to copy match from */\n let from_source;\n\n\n let input, output; // JS specific, because we have no pointers\n\n /* copy state to local variables */\n const state = strm.state;\n //here = state.here;\n _in = strm.next_in;\n input = strm.input;\n last = _in + (strm.avail_in - 5);\n _out = strm.next_out;\n output = strm.output;\n beg = _out - (start - strm.avail_out);\n end = _out + (strm.avail_out - 257);\n //#ifdef INFLATE_STRICT\n dmax = state.dmax;\n //#endif\n wsize = state.wsize;\n whave = state.whave;\n wnext = state.wnext;\n s_window = state.window;\n hold = state.hold;\n bits = state.bits;\n lcode = state.lencode;\n dcode = state.distcode;\n lmask = (1 << state.lenbits) - 1;\n dmask = (1 << state.distbits) - 1;\n\n\n /* decode literals and length/distances until end-of-block or not enough\n input data or output space */\n\n top:\n do {\n if (bits < 15) {\n hold += input[_in++] << bits;\n bits += 8;\n hold += input[_in++] << bits;\n bits += 8;\n }\n\n here = lcode[hold & lmask];\n\n dolen:\n for (;;) { // Goto emulation\n op = here >>> 24/*here.bits*/;\n hold >>>= op;\n bits -= op;\n op = (here >>> 16) & 0xff/*here.op*/;\n if (op === 0) { /* literal */\n //Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ?\n // \"inflate: literal '%c'\" :\n // \"inflate: literal 0x%02x\", here.val));\n output[_out++] = here & 0xffff/*here.val*/;\n }\n else if (op & 16) { /* length base */\n len = here & 0xffff/*here.val*/;\n op &= 15; /* number of extra bits */\n if (op) {\n if (bits < op) {\n hold += input[_in++] << bits;\n bits += 8;\n }\n len += hold & ((1 << op) - 1);\n hold >>>= op;\n bits -= op;\n }\n //Tracevv((stderr, \"inflate: length %u\", len));\n if (bits < 15) {\n hold += input[_in++] << bits;\n bits += 8;\n hold += input[_in++] << bits;\n bits += 8;\n }\n here = dcode[hold & dmask];\n\n dodist:\n for (;;) { // goto emulation\n op = here >>> 24/*here.bits*/;\n hold >>>= op;\n bits -= op;\n op = (here >>> 16) & 0xff/*here.op*/;\n\n if (op & 16) { /* distance base */\n dist = here & 0xffff/*here.val*/;\n op &= 15; /* number of extra bits */\n if (bits < op) {\n hold += input[_in++] << bits;\n bits += 8;\n if (bits < op) {\n hold += input[_in++] << bits;\n bits += 8;\n }\n }\n dist += hold & ((1 << op) - 1);\n //#ifdef INFLATE_STRICT\n if (dist > dmax) {\n strm.msg = 'invalid distance too far back';\n state.mode = BAD$1;\n break top;\n }\n //#endif\n hold >>>= op;\n bits -= op;\n //Tracevv((stderr, \"inflate: distance %u\", dist));\n op = _out - beg; /* max distance in output */\n if (dist > op) { /* see if copy from window */\n op = dist - op; /* distance back in window */\n if (op > whave) {\n if (state.sane) {\n strm.msg = 'invalid distance too far back';\n state.mode = BAD$1;\n break top;\n }\n\n // (!) This block is disabled in zlib defaults,\n // don't enable it for binary compatibility\n //#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR\n // if (len <= op - whave) {\n // do {\n // output[_out++] = 0;\n // } while (--len);\n // continue top;\n // }\n // len -= op - whave;\n // do {\n // output[_out++] = 0;\n // } while (--op > whave);\n // if (op === 0) {\n // from = _out - dist;\n // do {\n // output[_out++] = output[from++];\n // } while (--len);\n // continue top;\n // }\n //#endif\n }\n from = 0; // window index\n from_source = s_window;\n if (wnext === 0) { /* very common case */\n from += wsize - op;\n if (op < len) { /* some from window */\n len -= op;\n do {\n output[_out++] = s_window[from++];\n } while (--op);\n from = _out - dist; /* rest from output */\n from_source = output;\n }\n }\n else if (wnext < op) { /* wrap around window */\n from += wsize + wnext - op;\n op -= wnext;\n if (op < len) { /* some from end of window */\n len -= op;\n do {\n output[_out++] = s_window[from++];\n } while (--op);\n from = 0;\n if (wnext < len) { /* some from start of window */\n op = wnext;\n len -= op;\n do {\n output[_out++] = s_window[from++];\n } while (--op);\n from = _out - dist; /* rest from output */\n from_source = output;\n }\n }\n }\n else { /* contiguous in window */\n from += wnext - op;\n if (op < len) { /* some from window */\n len -= op;\n do {\n output[_out++] = s_window[from++];\n } while (--op);\n from = _out - dist; /* rest from output */\n from_source = output;\n }\n }\n while (len > 2) {\n output[_out++] = from_source[from++];\n output[_out++] = from_source[from++];\n output[_out++] = from_source[from++];\n len -= 3;\n }\n if (len) {\n output[_out++] = from_source[from++];\n if (len > 1) {\n output[_out++] = from_source[from++];\n }\n }\n }\n else {\n from = _out - dist; /* copy direct from output */\n do { /* minimum length is three */\n output[_out++] = output[from++];\n output[_out++] = output[from++];\n output[_out++] = output[from++];\n len -= 3;\n } while (len > 2);\n if (len) {\n output[_out++] = output[from++];\n if (len > 1) {\n output[_out++] = output[from++];\n }\n }\n }\n }\n else if ((op & 64) === 0) { /* 2nd level distance code */\n here = dcode[(here & 0xffff)/*here.val*/ + (hold & ((1 << op) - 1))];\n continue dodist;\n }\n else {\n strm.msg = 'invalid distance code';\n state.mode = BAD$1;\n break top;\n }\n\n break; // need to emulate goto via \"continue\"\n }\n }\n else if ((op & 64) === 0) { /* 2nd level length code */\n here = lcode[(here & 0xffff)/*here.val*/ + (hold & ((1 << op) - 1))];\n continue dolen;\n }\n else if (op & 32) { /* end-of-block */\n //Tracevv((stderr, \"inflate: end of block\"));\n state.mode = TYPE$1;\n break top;\n }\n else {\n strm.msg = 'invalid literal/length code';\n state.mode = BAD$1;\n break top;\n }\n\n break; // need to emulate goto via \"continue\"\n }\n } while (_in < last && _out < end);\n\n /* return unused bytes (on entry, bits < 8, so in won't go too far back) */\n len = bits >> 3;\n _in -= len;\n bits -= len << 3;\n hold &= (1 << bits) - 1;\n\n /* update state and return */\n strm.next_in = _in;\n strm.next_out = _out;\n strm.avail_in = (_in < last ? 5 + (last - _in) : 5 - (_in - last));\n strm.avail_out = (_out < end ? 257 + (end - _out) : 257 - (_out - end));\n state.hold = hold;\n state.bits = bits;\n return;\n };\n\n // (C) 1995-2013 Jean-loup Gailly and Mark Adler\n // (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n //\n // This software is provided 'as-is', without any express or implied\n // warranty. In no event will the authors be held liable for any damages\n // arising from the use of this software.\n //\n // Permission is granted to anyone to use this software for any purpose,\n // including commercial applications, and to alter it and redistribute it\n // freely, subject to the following restrictions:\n //\n // 1. The origin of this software must not be misrepresented; you must not\n // claim that you wrote the original software. If you use this software\n // in a product, an acknowledgment in the product documentation would be\n // appreciated but is not required.\n // 2. Altered source versions must be plainly marked as such, and must not be\n // misrepresented as being the original software.\n // 3. This notice may not be removed or altered from any source distribution.\n\n const MAXBITS = 15;\n const ENOUGH_LENS$1 = 852;\n const ENOUGH_DISTS$1 = 592;\n //const ENOUGH = (ENOUGH_LENS+ENOUGH_DISTS);\n\n const CODES$1 = 0;\n const LENS$1 = 1;\n const DISTS$1 = 2;\n\n const lbase = new Uint16Array([ /* Length codes 257..285 base */\n 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31,\n 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0\n ]);\n\n const lext = new Uint8Array([ /* Length codes 257..285 extra */\n 16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18,\n 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 72, 78\n ]);\n\n const dbase = new Uint16Array([ /* Distance codes 0..29 base */\n 1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193,\n 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145,\n 8193, 12289, 16385, 24577, 0, 0\n ]);\n\n const dext = new Uint8Array([ /* Distance codes 0..29 extra */\n 16, 16, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22,\n 23, 23, 24, 24, 25, 25, 26, 26, 27, 27,\n 28, 28, 29, 29, 64, 64\n ]);\n\n const inflate_table = (type, lens, lens_index, codes, table, table_index, work, opts) =>\n {\n const bits = opts.bits;\n //here = opts.here; /* table entry for duplication */\n\n let len = 0; /* a code's length in bits */\n let sym = 0; /* index of code symbols */\n let min = 0, max = 0; /* minimum and maximum code lengths */\n let root = 0; /* number of index bits for root table */\n let curr = 0; /* number of index bits for current table */\n let drop = 0; /* code bits to drop for sub-table */\n let left = 0; /* number of prefix codes available */\n let used = 0; /* code entries in table used */\n let huff = 0; /* Huffman code */\n let incr; /* for incrementing code, index */\n let fill; /* index for replicating entries */\n let low; /* low bits for current root entry */\n let mask; /* mask for low root bits */\n let next; /* next available space in table */\n let base = null; /* base value table to use */\n let base_index = 0;\n // let shoextra; /* extra bits table to use */\n let end; /* use base and extra for symbol > end */\n const count = new Uint16Array(MAXBITS + 1); //[MAXBITS+1]; /* number of codes of each length */\n const offs = new Uint16Array(MAXBITS + 1); //[MAXBITS+1]; /* offsets in table for each length */\n let extra = null;\n let extra_index = 0;\n\n let here_bits, here_op, here_val;\n\n /*\n Process a set of code lengths to create a canonical Huffman code. The\n code lengths are lens[0..codes-1]. Each length corresponds to the\n symbols 0..codes-1. The Huffman code is generated by first sorting the\n symbols by length from short to long, and retaining the symbol order\n for codes with equal lengths. Then the code starts with all zero bits\n for the first code of the shortest length, and the codes are integer\n increments for the same length, and zeros are appended as the length\n increases. For the deflate format, these bits are stored backwards\n from their more natural integer increment ordering, and so when the\n decoding tables are built in the large loop below, the integer codes\n are incremented backwards.\n\n This routine assumes, but does not check, that all of the entries in\n lens[] are in the range 0..MAXBITS. The caller must assure this.\n 1..MAXBITS is interpreted as that code length. zero means that that\n symbol does not occur in this code.\n\n The codes are sorted by computing a count of codes for each length,\n creating from that a table of starting indices for each length in the\n sorted table, and then entering the symbols in order in the sorted\n table. The sorted table is work[], with that space being provided by\n the caller.\n\n The length counts are used for other purposes as well, i.e. finding\n the minimum and maximum length codes, determining if there are any\n codes at all, checking for a valid set of lengths, and looking ahead\n at length counts to determine sub-table sizes when building the\n decoding tables.\n */\n\n /* accumulate lengths for codes (assumes lens[] all in 0..MAXBITS) */\n for (len = 0; len <= MAXBITS; len++) {\n count[len] = 0;\n }\n for (sym = 0; sym < codes; sym++) {\n count[lens[lens_index + sym]]++;\n }\n\n /* bound code lengths, force root to be within code lengths */\n root = bits;\n for (max = MAXBITS; max >= 1; max--) {\n if (count[max] !== 0) { break; }\n }\n if (root > max) {\n root = max;\n }\n if (max === 0) { /* no symbols to code at all */\n //table.op[opts.table_index] = 64; //here.op = (var char)64; /* invalid code marker */\n //table.bits[opts.table_index] = 1; //here.bits = (var char)1;\n //table.val[opts.table_index++] = 0; //here.val = (var short)0;\n table[table_index++] = (1 << 24) | (64 << 16) | 0;\n\n\n //table.op[opts.table_index] = 64;\n //table.bits[opts.table_index] = 1;\n //table.val[opts.table_index++] = 0;\n table[table_index++] = (1 << 24) | (64 << 16) | 0;\n\n opts.bits = 1;\n return 0; /* no symbols, but wait for decoding to report error */\n }\n for (min = 1; min < max; min++) {\n if (count[min] !== 0) { break; }\n }\n if (root < min) {\n root = min;\n }\n\n /* check for an over-subscribed or incomplete set of lengths */\n left = 1;\n for (len = 1; len <= MAXBITS; len++) {\n left <<= 1;\n left -= count[len];\n if (left < 0) {\n return -1;\n } /* over-subscribed */\n }\n if (left > 0 && (type === CODES$1 || max !== 1)) {\n return -1; /* incomplete set */\n }\n\n /* generate offsets into symbol table for each length for sorting */\n offs[1] = 0;\n for (len = 1; len < MAXBITS; len++) {\n offs[len + 1] = offs[len] + count[len];\n }\n\n /* sort symbols by length, by symbol order within each length */\n for (sym = 0; sym < codes; sym++) {\n if (lens[lens_index + sym] !== 0) {\n work[offs[lens[lens_index + sym]]++] = sym;\n }\n }\n\n /*\n Create and fill in decoding tables. In this loop, the table being\n filled is at next and has curr index bits. The code being used is huff\n with length len. That code is converted to an index by dropping drop\n bits off of the bottom. For codes where len is less than drop + curr,\n those top drop + curr - len bits are incremented through all values to\n fill the table with replicated entries.\n\n root is the number of index bits for the root table. When len exceeds\n root, sub-tables are created pointed to by the root entry with an index\n of the low root bits of huff. This is saved in low to check for when a\n new sub-table should be started. drop is zero when the root table is\n being filled, and drop is root when sub-tables are being filled.\n\n When a new sub-table is needed, it is necessary to look ahead in the\n code lengths to determine what size sub-table is needed. The length\n counts are used for this, and so count[] is decremented as codes are\n entered in the tables.\n\n used keeps track of how many table entries have been allocated from the\n provided *table space. It is checked for LENS and DIST tables against\n the constants ENOUGH_LENS and ENOUGH_DISTS to guard against changes in\n the initial root table size constants. See the comments in inftrees.h\n for more information.\n\n sym increments through all symbols, and the loop terminates when\n all codes of length max, i.e. all codes, have been processed. This\n routine permits incomplete codes, so another loop after this one fills\n in the rest of the decoding tables with invalid code markers.\n */\n\n /* set up for code type */\n // poor man optimization - use if-else instead of switch,\n // to avoid deopts in old v8\n if (type === CODES$1) {\n base = extra = work; /* dummy value--not used */\n end = 19;\n\n } else if (type === LENS$1) {\n base = lbase;\n base_index -= 257;\n extra = lext;\n extra_index -= 257;\n end = 256;\n\n } else { /* DISTS */\n base = dbase;\n extra = dext;\n end = -1;\n }\n\n /* initialize opts for loop */\n huff = 0; /* starting code */\n sym = 0; /* starting code symbol */\n len = min; /* starting code length */\n next = table_index; /* current table to fill in */\n curr = root; /* current table index bits */\n drop = 0; /* current bits to drop from code for index */\n low = -1; /* trigger new sub-table when len > root */\n used = 1 << root; /* use root table entries */\n mask = used - 1; /* mask for comparing low */\n\n /* check available table space */\n if ((type === LENS$1 && used > ENOUGH_LENS$1) ||\n (type === DISTS$1 && used > ENOUGH_DISTS$1)) {\n return 1;\n }\n\n /* process all codes and make table entries */\n for (;;) {\n /* create table entry */\n here_bits = len - drop;\n if (work[sym] < end) {\n here_op = 0;\n here_val = work[sym];\n }\n else if (work[sym] > end) {\n here_op = extra[extra_index + work[sym]];\n here_val = base[base_index + work[sym]];\n }\n else {\n here_op = 32 + 64; /* end of block */\n here_val = 0;\n }\n\n /* replicate for those indices with low len bits equal to huff */\n incr = 1 << (len - drop);\n fill = 1 << curr;\n min = fill; /* save offset to next table */\n do {\n fill -= incr;\n table[next + (huff >> drop) + fill] = (here_bits << 24) | (here_op << 16) | here_val |0;\n } while (fill !== 0);\n\n /* backwards increment the len-bit code huff */\n incr = 1 << (len - 1);\n while (huff & incr) {\n incr >>= 1;\n }\n if (incr !== 0) {\n huff &= incr - 1;\n huff += incr;\n } else {\n huff = 0;\n }\n\n /* go to next symbol, update count, len */\n sym++;\n if (--count[len] === 0) {\n if (len === max) { break; }\n len = lens[lens_index + work[sym]];\n }\n\n /* create new sub-table if needed */\n if (len > root && (huff & mask) !== low) {\n /* if first time, transition to sub-tables */\n if (drop === 0) {\n drop = root;\n }\n\n /* increment past last table */\n next += min; /* here min is 1 << curr */\n\n /* determine length of next table */\n curr = len - drop;\n left = 1 << curr;\n while (curr + drop < max) {\n left -= count[curr + drop];\n if (left <= 0) { break; }\n curr++;\n left <<= 1;\n }\n\n /* check for enough space */\n used += 1 << curr;\n if ((type === LENS$1 && used > ENOUGH_LENS$1) ||\n (type === DISTS$1 && used > ENOUGH_DISTS$1)) {\n return 1;\n }\n\n /* point entry in root table to sub-table */\n low = huff & mask;\n /*table.op[low] = curr;\n table.bits[low] = root;\n table.val[low] = next - opts.table_index;*/\n table[low] = (root << 24) | (curr << 16) | (next - table_index) |0;\n }\n }\n\n /* fill in remaining table entry if code is incomplete (guaranteed to have\n at most one remaining entry, since if the code is incomplete, the\n maximum code length that was allowed to get this far is one bit) */\n if (huff !== 0) {\n //table.op[next + huff] = 64; /* invalid code marker */\n //table.bits[next + huff] = len - drop;\n //table.val[next + huff] = 0;\n table[next + huff] = ((len - drop) << 24) | (64 << 16) |0;\n }\n\n /* set return parameters */\n //opts.table_index += used;\n opts.bits = root;\n return 0;\n };\n\n\n var inftrees = inflate_table;\n\n // (C) 1995-2013 Jean-loup Gailly and Mark Adler\n // (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n //\n // This software is provided 'as-is', without any express or implied\n // warranty. In no event will the authors be held liable for any damages\n // arising from the use of this software.\n //\n // Permission is granted to anyone to use this software for any purpose,\n // including commercial applications, and to alter it and redistribute it\n // freely, subject to the following restrictions:\n //\n // 1. The origin of this software must not be misrepresented; you must not\n // claim that you wrote the original software. If you use this software\n // in a product, an acknowledgment in the product documentation would be\n // appreciated but is not required.\n // 2. Altered source versions must be plainly marked as such, and must not be\n // misrepresented as being the original software.\n // 3. This notice may not be removed or altered from any source distribution.\n\n var constants$1 = {\n\n /* Allowed flush values; see deflate() and inflate() below for details */\n Z_NO_FLUSH: 0,\n Z_PARTIAL_FLUSH: 1,\n Z_SYNC_FLUSH: 2,\n Z_FULL_FLUSH: 3,\n Z_FINISH: 4,\n Z_BLOCK: 5,\n Z_TREES: 6,\n\n /* Return codes for the compression/decompression functions. Negative values\n * are errors, positive values are used for special but normal events.\n */\n Z_OK: 0,\n Z_STREAM_END: 1,\n Z_NEED_DICT: 2,\n Z_ERRNO: -1,\n Z_STREAM_ERROR: -2,\n Z_DATA_ERROR: -3,\n Z_MEM_ERROR: -4,\n Z_BUF_ERROR: -5,\n //Z_VERSION_ERROR: -6,\n\n /* compression levels */\n Z_NO_COMPRESSION: 0,\n Z_BEST_SPEED: 1,\n Z_BEST_COMPRESSION: 9,\n Z_DEFAULT_COMPRESSION: -1,\n\n\n Z_FILTERED: 1,\n Z_HUFFMAN_ONLY: 2,\n Z_RLE: 3,\n Z_FIXED: 4,\n Z_DEFAULT_STRATEGY: 0,\n\n /* Possible values of the data_type field (though see inflate()) */\n Z_BINARY: 0,\n Z_TEXT: 1,\n //Z_ASCII: 1, // = Z_TEXT (deprecated)\n Z_UNKNOWN: 2,\n\n /* The deflate compression method */\n Z_DEFLATED: 8\n //Z_NULL: null // Use -1 or null inline, depending on var type\n };\n\n // (C) 1995-2013 Jean-loup Gailly and Mark Adler\n // (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n //\n // This software is provided 'as-is', without any express or implied\n // warranty. In no event will the authors be held liable for any damages\n // arising from the use of this software.\n //\n // Permission is granted to anyone to use this software for any purpose,\n // including commercial applications, and to alter it and redistribute it\n // freely, subject to the following restrictions:\n //\n // 1. The origin of this software must not be misrepresented; you must not\n // claim that you wrote the original software. If you use this software\n // in a product, an acknowledgment in the product documentation would be\n // appreciated but is not required.\n // 2. Altered source versions must be plainly marked as such, and must not be\n // misrepresented as being the original software.\n // 3. This notice may not be removed or altered from any source distribution.\n\n\n\n\n\n\n const CODES = 0;\n const LENS = 1;\n const DISTS = 2;\n\n /* Public constants ==========================================================*/\n /* ===========================================================================*/\n\n const {\n Z_FINISH: Z_FINISH$1, Z_BLOCK, Z_TREES,\n Z_OK: Z_OK$1, Z_STREAM_END: Z_STREAM_END$1, Z_NEED_DICT: Z_NEED_DICT$1, Z_STREAM_ERROR: Z_STREAM_ERROR$1, Z_DATA_ERROR: Z_DATA_ERROR$1, Z_MEM_ERROR: Z_MEM_ERROR$1, Z_BUF_ERROR,\n Z_DEFLATED\n } = constants$1;\n\n\n /* STATES ====================================================================*/\n /* ===========================================================================*/\n\n\n const HEAD = 1; /* i: waiting for magic header */\n const FLAGS = 2; /* i: waiting for method and flags (gzip) */\n const TIME = 3; /* i: waiting for modification time (gzip) */\n const OS = 4; /* i: waiting for extra flags and operating system (gzip) */\n const EXLEN = 5; /* i: waiting for extra length (gzip) */\n const EXTRA = 6; /* i: waiting for extra bytes (gzip) */\n const NAME = 7; /* i: waiting for end of file name (gzip) */\n const COMMENT = 8; /* i: waiting for end of comment (gzip) */\n const HCRC = 9; /* i: waiting for header crc (gzip) */\n const DICTID = 10; /* i: waiting for dictionary check value */\n const DICT = 11; /* waiting for inflateSetDictionary() call */\n const TYPE = 12; /* i: waiting for type bits, including last-flag bit */\n const TYPEDO = 13; /* i: same, but skip check to exit inflate on new block */\n const STORED = 14; /* i: waiting for stored size (length and complement) */\n const COPY_ = 15; /* i/o: same as COPY below, but only first time in */\n const COPY = 16; /* i/o: waiting for input or output to copy stored block */\n const TABLE = 17; /* i: waiting for dynamic block table lengths */\n const LENLENS = 18; /* i: waiting for code length code lengths */\n const CODELENS = 19; /* i: waiting for length/lit and distance code lengths */\n const LEN_ = 20; /* i: same as LEN below, but only first time in */\n const LEN = 21; /* i: waiting for length/lit/eob code */\n const LENEXT = 22; /* i: waiting for length extra bits */\n const DIST = 23; /* i: waiting for distance code */\n const DISTEXT = 24; /* i: waiting for distance extra bits */\n const MATCH = 25; /* o: waiting for output space to copy string */\n const LIT = 26; /* o: waiting for output space to write literal */\n const CHECK = 27; /* i: waiting for 32-bit check value */\n const LENGTH = 28; /* i: waiting for 32-bit length (gzip) */\n const DONE = 29; /* finished check, done -- remain here until reset */\n const BAD = 30; /* got a data error -- remain here until reset */\n const MEM = 31; /* got an inflate() memory error -- remain here until reset */\n const SYNC = 32; /* looking for synchronization bytes to restart inflate() */\n\n /* ===========================================================================*/\n\n\n\n const ENOUGH_LENS = 852;\n const ENOUGH_DISTS = 592;\n //const ENOUGH = (ENOUGH_LENS+ENOUGH_DISTS);\n\n const MAX_WBITS = 15;\n /* 32K LZ77 window */\n const DEF_WBITS = MAX_WBITS;\n\n\n const zswap32 = (q) => {\n\n return (((q >>> 24) & 0xff) +\n ((q >>> 8) & 0xff00) +\n ((q & 0xff00) << 8) +\n ((q & 0xff) << 24));\n };\n\n\n function InflateState() {\n this.mode = 0; /* current inflate mode */\n this.last = false; /* true if processing last block */\n this.wrap = 0; /* bit 0 true for zlib, bit 1 true for gzip */\n this.havedict = false; /* true if dictionary provided */\n this.flags = 0; /* gzip header method and flags (0 if zlib) */\n this.dmax = 0; /* zlib header max distance (INFLATE_STRICT) */\n this.check = 0; /* protected copy of check value */\n this.total = 0; /* protected copy of output count */\n // TODO: may be {}\n this.head = null; /* where to save gzip header information */\n\n /* sliding window */\n this.wbits = 0; /* log base 2 of requested window size */\n this.wsize = 0; /* window size or zero if not using window */\n this.whave = 0; /* valid bytes in the window */\n this.wnext = 0; /* window write index */\n this.window = null; /* allocated sliding window, if needed */\n\n /* bit accumulator */\n this.hold = 0; /* input bit accumulator */\n this.bits = 0; /* number of bits in \"in\" */\n\n /* for string and stored block copying */\n this.length = 0; /* literal or length of data to copy */\n this.offset = 0; /* distance back to copy string from */\n\n /* for table and code decoding */\n this.extra = 0; /* extra bits needed */\n\n /* fixed and dynamic code tables */\n this.lencode = null; /* starting table for length/literal codes */\n this.distcode = null; /* starting table for distance codes */\n this.lenbits = 0; /* index bits for lencode */\n this.distbits = 0; /* index bits for distcode */\n\n /* dynamic table building */\n this.ncode = 0; /* number of code length code lengths */\n this.nlen = 0; /* number of length code lengths */\n this.ndist = 0; /* number of distance code lengths */\n this.have = 0; /* number of code lengths in lens[] */\n this.next = null; /* next available space in codes[] */\n\n this.lens = new Uint16Array(320); /* temporary storage for code lengths */\n this.work = new Uint16Array(288); /* work area for code table building */\n\n /*\n because we don't have pointers in js, we use lencode and distcode directly\n as buffers so we don't need codes\n */\n //this.codes = new Int32Array(ENOUGH); /* space for code tables */\n this.lendyn = null; /* dynamic table for length/literal codes (JS specific) */\n this.distdyn = null; /* dynamic table for distance codes (JS specific) */\n this.sane = 0; /* if false, allow invalid distance too far */\n this.back = 0; /* bits back of last unprocessed length/lit */\n this.was = 0; /* initial length of match */\n }\n\n\n const inflateResetKeep = (strm) => {\n\n if (!strm || !strm.state) { return Z_STREAM_ERROR$1; }\n const state = strm.state;\n strm.total_in = strm.total_out = state.total = 0;\n strm.msg = ''; /*Z_NULL*/\n if (state.wrap) { /* to support ill-conceived Java test suite */\n strm.adler = state.wrap & 1;\n }\n state.mode = HEAD;\n state.last = 0;\n state.havedict = 0;\n state.dmax = 32768;\n state.head = null/*Z_NULL*/;\n state.hold = 0;\n state.bits = 0;\n //state.lencode = state.distcode = state.next = state.codes;\n state.lencode = state.lendyn = new Int32Array(ENOUGH_LENS);\n state.distcode = state.distdyn = new Int32Array(ENOUGH_DISTS);\n\n state.sane = 1;\n state.back = -1;\n //Tracev((stderr, \"inflate: reset\"));\n return Z_OK$1;\n };\n\n\n const inflateReset = (strm) => {\n\n if (!strm || !strm.state) { return Z_STREAM_ERROR$1; }\n const state = strm.state;\n state.wsize = 0;\n state.whave = 0;\n state.wnext = 0;\n return inflateResetKeep(strm);\n\n };\n\n\n const inflateReset2 = (strm, windowBits) => {\n let wrap;\n\n /* get the state */\n if (!strm || !strm.state) { return Z_STREAM_ERROR$1; }\n const state = strm.state;\n\n /* extract wrap request from windowBits parameter */\n if (windowBits < 0) {\n wrap = 0;\n windowBits = -windowBits;\n }\n else {\n wrap = (windowBits >> 4) + 1;\n if (windowBits < 48) {\n windowBits &= 15;\n }\n }\n\n /* set number of window bits, free window if different */\n if (windowBits && (windowBits < 8 || windowBits > 15)) {\n return Z_STREAM_ERROR$1;\n }\n if (state.window !== null && state.wbits !== windowBits) {\n state.window = null;\n }\n\n /* update state and reset the rest of it */\n state.wrap = wrap;\n state.wbits = windowBits;\n return inflateReset(strm);\n };\n\n\n const inflateInit2 = (strm, windowBits) => {\n\n if (!strm) { return Z_STREAM_ERROR$1; }\n //strm.msg = Z_NULL; /* in case we return an error */\n\n const state = new InflateState();\n\n //if (state === Z_NULL) return Z_MEM_ERROR;\n //Tracev((stderr, \"inflate: allocated\"));\n strm.state = state;\n state.window = null/*Z_NULL*/;\n const ret = inflateReset2(strm, windowBits);\n if (ret !== Z_OK$1) {\n strm.state = null/*Z_NULL*/;\n }\n return ret;\n };\n\n\n const inflateInit = (strm) => {\n\n return inflateInit2(strm, DEF_WBITS);\n };\n\n\n /*\n Return state with length and distance decoding tables and index sizes set to\n fixed code decoding. Normally this returns fixed tables from inffixed.h.\n If BUILDFIXED is defined, then instead this routine builds the tables the\n first time it's called, and returns those tables the first time and\n thereafter. This reduces the size of the code by about 2K bytes, in\n exchange for a little execution time. However, BUILDFIXED should not be\n used for threaded applications, since the rewriting of the tables and virgin\n may not be thread-safe.\n */\n let virgin = true;\n\n let lenfix, distfix; // We have no pointers in JS, so keep tables separate\n\n\n const fixedtables = (state) => {\n\n /* build fixed huffman tables if first call (may not be thread safe) */\n if (virgin) {\n lenfix = new Int32Array(512);\n distfix = new Int32Array(32);\n\n /* literal/length table */\n let sym = 0;\n while (sym < 144) { state.lens[sym++] = 8; }\n while (sym < 256) { state.lens[sym++] = 9; }\n while (sym < 280) { state.lens[sym++] = 7; }\n while (sym < 288) { state.lens[sym++] = 8; }\n\n inftrees(LENS, state.lens, 0, 288, lenfix, 0, state.work, { bits: 9 });\n\n /* distance table */\n sym = 0;\n while (sym < 32) { state.lens[sym++] = 5; }\n\n inftrees(DISTS, state.lens, 0, 32, distfix, 0, state.work, { bits: 5 });\n\n /* do this just once */\n virgin = false;\n }\n\n state.lencode = lenfix;\n state.lenbits = 9;\n state.distcode = distfix;\n state.distbits = 5;\n };\n\n\n /*\n Update the window with the last wsize (normally 32K) bytes written before\n returning. If window does not exist yet, create it. This is only called\n when a window is already in use, or when output has been written during this\n inflate call, but the end of the deflate stream has not been reached yet.\n It is also called to create a window for dictionary data when a dictionary\n is loaded.\n\n Providing output buffers larger than 32K to inflate() should provide a speed\n advantage, since only the last 32K of output is copied to the sliding window\n upon return from inflate(), and since all distances after the first 32K of\n output will fall in the output data, making match copies simpler and faster.\n The advantage may be dependent on the size of the processor's data caches.\n */\n const updatewindow = (strm, src, end, copy) => {\n\n let dist;\n const state = strm.state;\n\n /* if it hasn't been done already, allocate space for the window */\n if (state.window === null) {\n state.wsize = 1 << state.wbits;\n state.wnext = 0;\n state.whave = 0;\n\n state.window = new Uint8Array(state.wsize);\n }\n\n /* copy state->wsize or less output bytes into the circular window */\n if (copy >= state.wsize) {\n state.window.set(src.subarray(end - state.wsize, end), 0);\n state.wnext = 0;\n state.whave = state.wsize;\n }\n else {\n dist = state.wsize - state.wnext;\n if (dist > copy) {\n dist = copy;\n }\n //zmemcpy(state->window + state->wnext, end - copy, dist);\n state.window.set(src.subarray(end - copy, end - copy + dist), state.wnext);\n copy -= dist;\n if (copy) {\n //zmemcpy(state->window, end - copy, copy);\n state.window.set(src.subarray(end - copy, end), 0);\n state.wnext = copy;\n state.whave = state.wsize;\n }\n else {\n state.wnext += dist;\n if (state.wnext === state.wsize) { state.wnext = 0; }\n if (state.whave < state.wsize) { state.whave += dist; }\n }\n }\n return 0;\n };\n\n\n const inflate$1 = (strm, flush) => {\n\n let state;\n let input, output; // input/output buffers\n let next; /* next input INDEX */\n let put; /* next output INDEX */\n let have, left; /* available input and output */\n let hold; /* bit buffer */\n let bits; /* bits in bit buffer */\n let _in, _out; /* save starting available input and output */\n let copy; /* number of stored or match bytes to copy */\n let from; /* where to copy match bytes from */\n let from_source;\n let here = 0; /* current decoding table entry */\n let here_bits, here_op, here_val; // paked \"here\" denormalized (JS specific)\n //let last; /* parent table entry */\n let last_bits, last_op, last_val; // paked \"last\" denormalized (JS specific)\n let len; /* length to copy for repeats, bits to drop */\n let ret; /* return code */\n const hbuf = new Uint8Array(4); /* buffer for gzip header crc calculation */\n let opts;\n\n let n; // temporary variable for NEED_BITS\n\n const order = /* permutation of code lengths */\n new Uint8Array([ 16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15 ]);\n\n\n if (!strm || !strm.state || !strm.output ||\n (!strm.input && strm.avail_in !== 0)) {\n return Z_STREAM_ERROR$1;\n }\n\n state = strm.state;\n if (state.mode === TYPE) { state.mode = TYPEDO; } /* skip check */\n\n\n //--- LOAD() ---\n put = strm.next_out;\n output = strm.output;\n left = strm.avail_out;\n next = strm.next_in;\n input = strm.input;\n have = strm.avail_in;\n hold = state.hold;\n bits = state.bits;\n //---\n\n _in = have;\n _out = left;\n ret = Z_OK$1;\n\n inf_leave: // goto emulation\n for (;;) {\n switch (state.mode) {\n case HEAD:\n if (state.wrap === 0) {\n state.mode = TYPEDO;\n break;\n }\n //=== NEEDBITS(16);\n while (bits < 16) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n if ((state.wrap & 2) && hold === 0x8b1f) { /* gzip header */\n state.check = 0/*crc32(0L, Z_NULL, 0)*/;\n //=== CRC2(state.check, hold);\n hbuf[0] = hold & 0xff;\n hbuf[1] = (hold >>> 8) & 0xff;\n state.check = crc32_1(state.check, hbuf, 2, 0);\n //===//\n\n //=== INITBITS();\n hold = 0;\n bits = 0;\n //===//\n state.mode = FLAGS;\n break;\n }\n state.flags = 0; /* expect zlib header */\n if (state.head) {\n state.head.done = false;\n }\n if (!(state.wrap & 1) || /* check if zlib header allowed */\n (((hold & 0xff)/*BITS(8)*/ << 8) + (hold >> 8)) % 31) {\n strm.msg = 'incorrect header check';\n state.mode = BAD;\n break;\n }\n if ((hold & 0x0f)/*BITS(4)*/ !== Z_DEFLATED) {\n strm.msg = 'unknown compression method';\n state.mode = BAD;\n break;\n }\n //--- DROPBITS(4) ---//\n hold >>>= 4;\n bits -= 4;\n //---//\n len = (hold & 0x0f)/*BITS(4)*/ + 8;\n if (state.wbits === 0) {\n state.wbits = len;\n }\n else if (len > state.wbits) {\n strm.msg = 'invalid window size';\n state.mode = BAD;\n break;\n }\n\n // !!! pako patch. Force use `options.windowBits` if passed.\n // Required to always use max window size by default.\n state.dmax = 1 << state.wbits;\n //state.dmax = 1 << len;\n\n //Tracev((stderr, \"inflate: zlib header ok\"));\n strm.adler = state.check = 1/*adler32(0L, Z_NULL, 0)*/;\n state.mode = hold & 0x200 ? DICTID : TYPE;\n //=== INITBITS();\n hold = 0;\n bits = 0;\n //===//\n break;\n case FLAGS:\n //=== NEEDBITS(16); */\n while (bits < 16) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n state.flags = hold;\n if ((state.flags & 0xff) !== Z_DEFLATED) {\n strm.msg = 'unknown compression method';\n state.mode = BAD;\n break;\n }\n if (state.flags & 0xe000) {\n strm.msg = 'unknown header flags set';\n state.mode = BAD;\n break;\n }\n if (state.head) {\n state.head.text = ((hold >> 8) & 1);\n }\n if (state.flags & 0x0200) {\n //=== CRC2(state.check, hold);\n hbuf[0] = hold & 0xff;\n hbuf[1] = (hold >>> 8) & 0xff;\n state.check = crc32_1(state.check, hbuf, 2, 0);\n //===//\n }\n //=== INITBITS();\n hold = 0;\n bits = 0;\n //===//\n state.mode = TIME;\n /* falls through */\n case TIME:\n //=== NEEDBITS(32); */\n while (bits < 32) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n if (state.head) {\n state.head.time = hold;\n }\n if (state.flags & 0x0200) {\n //=== CRC4(state.check, hold)\n hbuf[0] = hold & 0xff;\n hbuf[1] = (hold >>> 8) & 0xff;\n hbuf[2] = (hold >>> 16) & 0xff;\n hbuf[3] = (hold >>> 24) & 0xff;\n state.check = crc32_1(state.check, hbuf, 4, 0);\n //===\n }\n //=== INITBITS();\n hold = 0;\n bits = 0;\n //===//\n state.mode = OS;\n /* falls through */\n case OS:\n //=== NEEDBITS(16); */\n while (bits < 16) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n if (state.head) {\n state.head.xflags = (hold & 0xff);\n state.head.os = (hold >> 8);\n }\n if (state.flags & 0x0200) {\n //=== CRC2(state.check, hold);\n hbuf[0] = hold & 0xff;\n hbuf[1] = (hold >>> 8) & 0xff;\n state.check = crc32_1(state.check, hbuf, 2, 0);\n //===//\n }\n //=== INITBITS();\n hold = 0;\n bits = 0;\n //===//\n state.mode = EXLEN;\n /* falls through */\n case EXLEN:\n if (state.flags & 0x0400) {\n //=== NEEDBITS(16); */\n while (bits < 16) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n state.length = hold;\n if (state.head) {\n state.head.extra_len = hold;\n }\n if (state.flags & 0x0200) {\n //=== CRC2(state.check, hold);\n hbuf[0] = hold & 0xff;\n hbuf[1] = (hold >>> 8) & 0xff;\n state.check = crc32_1(state.check, hbuf, 2, 0);\n //===//\n }\n //=== INITBITS();\n hold = 0;\n bits = 0;\n //===//\n }\n else if (state.head) {\n state.head.extra = null/*Z_NULL*/;\n }\n state.mode = EXTRA;\n /* falls through */\n case EXTRA:\n if (state.flags & 0x0400) {\n copy = state.length;\n if (copy > have) { copy = have; }\n if (copy) {\n if (state.head) {\n len = state.head.extra_len - state.length;\n if (!state.head.extra) {\n // Use untyped array for more convenient processing later\n state.head.extra = new Uint8Array(state.head.extra_len);\n }\n state.head.extra.set(\n input.subarray(\n next,\n // extra field is limited to 65536 bytes\n // - no need for additional size check\n next + copy\n ),\n /*len + copy > state.head.extra_max - len ? state.head.extra_max : copy,*/\n len\n );\n //zmemcpy(state.head.extra + len, next,\n // len + copy > state.head.extra_max ?\n // state.head.extra_max - len : copy);\n }\n if (state.flags & 0x0200) {\n state.check = crc32_1(state.check, input, copy, next);\n }\n have -= copy;\n next += copy;\n state.length -= copy;\n }\n if (state.length) { break inf_leave; }\n }\n state.length = 0;\n state.mode = NAME;\n /* falls through */\n case NAME:\n if (state.flags & 0x0800) {\n if (have === 0) { break inf_leave; }\n copy = 0;\n do {\n // TODO: 2 or 1 bytes?\n len = input[next + copy++];\n /* use constant limit because in js we should not preallocate memory */\n if (state.head && len &&\n (state.length < 65536 /*state.head.name_max*/)) {\n state.head.name += String.fromCharCode(len);\n }\n } while (len && copy < have);\n\n if (state.flags & 0x0200) {\n state.check = crc32_1(state.check, input, copy, next);\n }\n have -= copy;\n next += copy;\n if (len) { break inf_leave; }\n }\n else if (state.head) {\n state.head.name = null;\n }\n state.length = 0;\n state.mode = COMMENT;\n /* falls through */\n case COMMENT:\n if (state.flags & 0x1000) {\n if (have === 0) { break inf_leave; }\n copy = 0;\n do {\n len = input[next + copy++];\n /* use constant limit because in js we should not preallocate memory */\n if (state.head && len &&\n (state.length < 65536 /*state.head.comm_max*/)) {\n state.head.comment += String.fromCharCode(len);\n }\n } while (len && copy < have);\n if (state.flags & 0x0200) {\n state.check = crc32_1(state.check, input, copy, next);\n }\n have -= copy;\n next += copy;\n if (len) { break inf_leave; }\n }\n else if (state.head) {\n state.head.comment = null;\n }\n state.mode = HCRC;\n /* falls through */\n case HCRC:\n if (state.flags & 0x0200) {\n //=== NEEDBITS(16); */\n while (bits < 16) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n if (hold !== (state.check & 0xffff)) {\n strm.msg = 'header crc mismatch';\n state.mode = BAD;\n break;\n }\n //=== INITBITS();\n hold = 0;\n bits = 0;\n //===//\n }\n if (state.head) {\n state.head.hcrc = ((state.flags >> 9) & 1);\n state.head.done = true;\n }\n strm.adler = state.check = 0;\n state.mode = TYPE;\n break;\n case DICTID:\n //=== NEEDBITS(32); */\n while (bits < 32) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n strm.adler = state.check = zswap32(hold);\n //=== INITBITS();\n hold = 0;\n bits = 0;\n //===//\n state.mode = DICT;\n /* falls through */\n case DICT:\n if (state.havedict === 0) {\n //--- RESTORE() ---\n strm.next_out = put;\n strm.avail_out = left;\n strm.next_in = next;\n strm.avail_in = have;\n state.hold = hold;\n state.bits = bits;\n //---\n return Z_NEED_DICT$1;\n }\n strm.adler = state.check = 1/*adler32(0L, Z_NULL, 0)*/;\n state.mode = TYPE;\n /* falls through */\n case TYPE:\n if (flush === Z_BLOCK || flush === Z_TREES) { break inf_leave; }\n /* falls through */\n case TYPEDO:\n if (state.last) {\n //--- BYTEBITS() ---//\n hold >>>= bits & 7;\n bits -= bits & 7;\n //---//\n state.mode = CHECK;\n break;\n }\n //=== NEEDBITS(3); */\n while (bits < 3) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n state.last = (hold & 0x01)/*BITS(1)*/;\n //--- DROPBITS(1) ---//\n hold >>>= 1;\n bits -= 1;\n //---//\n\n switch ((hold & 0x03)/*BITS(2)*/) {\n case 0: /* stored block */\n //Tracev((stderr, \"inflate: stored block%s\",\n // state.last ? \" (last)\" : \"\"));\n state.mode = STORED;\n break;\n case 1: /* fixed block */\n fixedtables(state);\n //Tracev((stderr, \"inflate: fixed codes block%s\",\n // state.last ? \" (last)\" : \"\"));\n state.mode = LEN_; /* decode codes */\n if (flush === Z_TREES) {\n //--- DROPBITS(2) ---//\n hold >>>= 2;\n bits -= 2;\n //---//\n break inf_leave;\n }\n break;\n case 2: /* dynamic block */\n //Tracev((stderr, \"inflate: dynamic codes block%s\",\n // state.last ? \" (last)\" : \"\"));\n state.mode = TABLE;\n break;\n case 3:\n strm.msg = 'invalid block type';\n state.mode = BAD;\n }\n //--- DROPBITS(2) ---//\n hold >>>= 2;\n bits -= 2;\n //---//\n break;\n case STORED:\n //--- BYTEBITS() ---// /* go to byte boundary */\n hold >>>= bits & 7;\n bits -= bits & 7;\n //---//\n //=== NEEDBITS(32); */\n while (bits < 32) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n if ((hold & 0xffff) !== ((hold >>> 16) ^ 0xffff)) {\n strm.msg = 'invalid stored block lengths';\n state.mode = BAD;\n break;\n }\n state.length = hold & 0xffff;\n //Tracev((stderr, \"inflate: stored length %u\",\n // state.length));\n //=== INITBITS();\n hold = 0;\n bits = 0;\n //===//\n state.mode = COPY_;\n if (flush === Z_TREES) { break inf_leave; }\n /* falls through */\n case COPY_:\n state.mode = COPY;\n /* falls through */\n case COPY:\n copy = state.length;\n if (copy) {\n if (copy > have) { copy = have; }\n if (copy > left) { copy = left; }\n if (copy === 0) { break inf_leave; }\n //--- zmemcpy(put, next, copy); ---\n output.set(input.subarray(next, next + copy), put);\n //---//\n have -= copy;\n next += copy;\n left -= copy;\n put += copy;\n state.length -= copy;\n break;\n }\n //Tracev((stderr, \"inflate: stored end\"));\n state.mode = TYPE;\n break;\n case TABLE:\n //=== NEEDBITS(14); */\n while (bits < 14) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n state.nlen = (hold & 0x1f)/*BITS(5)*/ + 257;\n //--- DROPBITS(5) ---//\n hold >>>= 5;\n bits -= 5;\n //---//\n state.ndist = (hold & 0x1f)/*BITS(5)*/ + 1;\n //--- DROPBITS(5) ---//\n hold >>>= 5;\n bits -= 5;\n //---//\n state.ncode = (hold & 0x0f)/*BITS(4)*/ + 4;\n //--- DROPBITS(4) ---//\n hold >>>= 4;\n bits -= 4;\n //---//\n //#ifndef PKZIP_BUG_WORKAROUND\n if (state.nlen > 286 || state.ndist > 30) {\n strm.msg = 'too many length or distance symbols';\n state.mode = BAD;\n break;\n }\n //#endif\n //Tracev((stderr, \"inflate: table sizes ok\"));\n state.have = 0;\n state.mode = LENLENS;\n /* falls through */\n case LENLENS:\n while (state.have < state.ncode) {\n //=== NEEDBITS(3);\n while (bits < 3) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n state.lens[order[state.have++]] = (hold & 0x07);//BITS(3);\n //--- DROPBITS(3) ---//\n hold >>>= 3;\n bits -= 3;\n //---//\n }\n while (state.have < 19) {\n state.lens[order[state.have++]] = 0;\n }\n // We have separate tables & no pointers. 2 commented lines below not needed.\n //state.next = state.codes;\n //state.lencode = state.next;\n // Switch to use dynamic table\n state.lencode = state.lendyn;\n state.lenbits = 7;\n\n opts = { bits: state.lenbits };\n ret = inftrees(CODES, state.lens, 0, 19, state.lencode, 0, state.work, opts);\n state.lenbits = opts.bits;\n\n if (ret) {\n strm.msg = 'invalid code lengths set';\n state.mode = BAD;\n break;\n }\n //Tracev((stderr, \"inflate: code lengths ok\"));\n state.have = 0;\n state.mode = CODELENS;\n /* falls through */\n case CODELENS:\n while (state.have < state.nlen + state.ndist) {\n for (;;) {\n here = state.lencode[hold & ((1 << state.lenbits) - 1)];/*BITS(state.lenbits)*/\n here_bits = here >>> 24;\n here_op = (here >>> 16) & 0xff;\n here_val = here & 0xffff;\n\n if ((here_bits) <= bits) { break; }\n //--- PULLBYTE() ---//\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n //---//\n }\n if (here_val < 16) {\n //--- DROPBITS(here.bits) ---//\n hold >>>= here_bits;\n bits -= here_bits;\n //---//\n state.lens[state.have++] = here_val;\n }\n else {\n if (here_val === 16) {\n //=== NEEDBITS(here.bits + 2);\n n = here_bits + 2;\n while (bits < n) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n //--- DROPBITS(here.bits) ---//\n hold >>>= here_bits;\n bits -= here_bits;\n //---//\n if (state.have === 0) {\n strm.msg = 'invalid bit length repeat';\n state.mode = BAD;\n break;\n }\n len = state.lens[state.have - 1];\n copy = 3 + (hold & 0x03);//BITS(2);\n //--- DROPBITS(2) ---//\n hold >>>= 2;\n bits -= 2;\n //---//\n }\n else if (here_val === 17) {\n //=== NEEDBITS(here.bits + 3);\n n = here_bits + 3;\n while (bits < n) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n //--- DROPBITS(here.bits) ---//\n hold >>>= here_bits;\n bits -= here_bits;\n //---//\n len = 0;\n copy = 3 + (hold & 0x07);//BITS(3);\n //--- DROPBITS(3) ---//\n hold >>>= 3;\n bits -= 3;\n //---//\n }\n else {\n //=== NEEDBITS(here.bits + 7);\n n = here_bits + 7;\n while (bits < n) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n //--- DROPBITS(here.bits) ---//\n hold >>>= here_bits;\n bits -= here_bits;\n //---//\n len = 0;\n copy = 11 + (hold & 0x7f);//BITS(7);\n //--- DROPBITS(7) ---//\n hold >>>= 7;\n bits -= 7;\n //---//\n }\n if (state.have + copy > state.nlen + state.ndist) {\n strm.msg = 'invalid bit length repeat';\n state.mode = BAD;\n break;\n }\n while (copy--) {\n state.lens[state.have++] = len;\n }\n }\n }\n\n /* handle error breaks in while */\n if (state.mode === BAD) { break; }\n\n /* check for end-of-block code (better have one) */\n if (state.lens[256] === 0) {\n strm.msg = 'invalid code -- missing end-of-block';\n state.mode = BAD;\n break;\n }\n\n /* build code tables -- note: do not change the lenbits or distbits\n values here (9 and 6) without reading the comments in inftrees.h\n concerning the ENOUGH constants, which depend on those values */\n state.lenbits = 9;\n\n opts = { bits: state.lenbits };\n ret = inftrees(LENS, state.lens, 0, state.nlen, state.lencode, 0, state.work, opts);\n // We have separate tables & no pointers. 2 commented lines below not needed.\n // state.next_index = opts.table_index;\n state.lenbits = opts.bits;\n // state.lencode = state.next;\n\n if (ret) {\n strm.msg = 'invalid literal/lengths set';\n state.mode = BAD;\n break;\n }\n\n state.distbits = 6;\n //state.distcode.copy(state.codes);\n // Switch to use dynamic table\n state.distcode = state.distdyn;\n opts = { bits: state.distbits };\n ret = inftrees(DISTS, state.lens, state.nlen, state.ndist, state.distcode, 0, state.work, opts);\n // We have separate tables & no pointers. 2 commented lines below not needed.\n // state.next_index = opts.table_index;\n state.distbits = opts.bits;\n // state.distcode = state.next;\n\n if (ret) {\n strm.msg = 'invalid distances set';\n state.mode = BAD;\n break;\n }\n //Tracev((stderr, 'inflate: codes ok'));\n state.mode = LEN_;\n if (flush === Z_TREES) { break inf_leave; }\n /* falls through */\n case LEN_:\n state.mode = LEN;\n /* falls through */\n case LEN:\n if (have >= 6 && left >= 258) {\n //--- RESTORE() ---\n strm.next_out = put;\n strm.avail_out = left;\n strm.next_in = next;\n strm.avail_in = have;\n state.hold = hold;\n state.bits = bits;\n //---\n inffast(strm, _out);\n //--- LOAD() ---\n put = strm.next_out;\n output = strm.output;\n left = strm.avail_out;\n next = strm.next_in;\n input = strm.input;\n have = strm.avail_in;\n hold = state.hold;\n bits = state.bits;\n //---\n\n if (state.mode === TYPE) {\n state.back = -1;\n }\n break;\n }\n state.back = 0;\n for (;;) {\n here = state.lencode[hold & ((1 << state.lenbits) - 1)]; /*BITS(state.lenbits)*/\n here_bits = here >>> 24;\n here_op = (here >>> 16) & 0xff;\n here_val = here & 0xffff;\n\n if (here_bits <= bits) { break; }\n //--- PULLBYTE() ---//\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n //---//\n }\n if (here_op && (here_op & 0xf0) === 0) {\n last_bits = here_bits;\n last_op = here_op;\n last_val = here_val;\n for (;;) {\n here = state.lencode[last_val +\n ((hold & ((1 << (last_bits + last_op)) - 1))/*BITS(last.bits + last.op)*/ >> last_bits)];\n here_bits = here >>> 24;\n here_op = (here >>> 16) & 0xff;\n here_val = here & 0xffff;\n\n if ((last_bits + here_bits) <= bits) { break; }\n //--- PULLBYTE() ---//\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n //---//\n }\n //--- DROPBITS(last.bits) ---//\n hold >>>= last_bits;\n bits -= last_bits;\n //---//\n state.back += last_bits;\n }\n //--- DROPBITS(here.bits) ---//\n hold >>>= here_bits;\n bits -= here_bits;\n //---//\n state.back += here_bits;\n state.length = here_val;\n if (here_op === 0) {\n //Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ?\n // \"inflate: literal '%c'\" :\n // \"inflate: literal 0x%02x\", here.val));\n state.mode = LIT;\n break;\n }\n if (here_op & 32) {\n //Tracevv((stderr, \"inflate: end of block\"));\n state.back = -1;\n state.mode = TYPE;\n break;\n }\n if (here_op & 64) {\n strm.msg = 'invalid literal/length code';\n state.mode = BAD;\n break;\n }\n state.extra = here_op & 15;\n state.mode = LENEXT;\n /* falls through */\n case LENEXT:\n if (state.extra) {\n //=== NEEDBITS(state.extra);\n n = state.extra;\n while (bits < n) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n state.length += hold & ((1 << state.extra) - 1)/*BITS(state.extra)*/;\n //--- DROPBITS(state.extra) ---//\n hold >>>= state.extra;\n bits -= state.extra;\n //---//\n state.back += state.extra;\n }\n //Tracevv((stderr, \"inflate: length %u\", state.length));\n state.was = state.length;\n state.mode = DIST;\n /* falls through */\n case DIST:\n for (;;) {\n here = state.distcode[hold & ((1 << state.distbits) - 1)];/*BITS(state.distbits)*/\n here_bits = here >>> 24;\n here_op = (here >>> 16) & 0xff;\n here_val = here & 0xffff;\n\n if ((here_bits) <= bits) { break; }\n //--- PULLBYTE() ---//\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n //---//\n }\n if ((here_op & 0xf0) === 0) {\n last_bits = here_bits;\n last_op = here_op;\n last_val = here_val;\n for (;;) {\n here = state.distcode[last_val +\n ((hold & ((1 << (last_bits + last_op)) - 1))/*BITS(last.bits + last.op)*/ >> last_bits)];\n here_bits = here >>> 24;\n here_op = (here >>> 16) & 0xff;\n here_val = here & 0xffff;\n\n if ((last_bits + here_bits) <= bits) { break; }\n //--- PULLBYTE() ---//\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n //---//\n }\n //--- DROPBITS(last.bits) ---//\n hold >>>= last_bits;\n bits -= last_bits;\n //---//\n state.back += last_bits;\n }\n //--- DROPBITS(here.bits) ---//\n hold >>>= here_bits;\n bits -= here_bits;\n //---//\n state.back += here_bits;\n if (here_op & 64) {\n strm.msg = 'invalid distance code';\n state.mode = BAD;\n break;\n }\n state.offset = here_val;\n state.extra = (here_op) & 15;\n state.mode = DISTEXT;\n /* falls through */\n case DISTEXT:\n if (state.extra) {\n //=== NEEDBITS(state.extra);\n n = state.extra;\n while (bits < n) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n state.offset += hold & ((1 << state.extra) - 1)/*BITS(state.extra)*/;\n //--- DROPBITS(state.extra) ---//\n hold >>>= state.extra;\n bits -= state.extra;\n //---//\n state.back += state.extra;\n }\n //#ifdef INFLATE_STRICT\n if (state.offset > state.dmax) {\n strm.msg = 'invalid distance too far back';\n state.mode = BAD;\n break;\n }\n //#endif\n //Tracevv((stderr, \"inflate: distance %u\", state.offset));\n state.mode = MATCH;\n /* falls through */\n case MATCH:\n if (left === 0) { break inf_leave; }\n copy = _out - left;\n if (state.offset > copy) { /* copy from window */\n copy = state.offset - copy;\n if (copy > state.whave) {\n if (state.sane) {\n strm.msg = 'invalid distance too far back';\n state.mode = BAD;\n break;\n }\n // (!) This block is disabled in zlib defaults,\n // don't enable it for binary compatibility\n //#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR\n // Trace((stderr, \"inflate.c too far\"));\n // copy -= state.whave;\n // if (copy > state.length) { copy = state.length; }\n // if (copy > left) { copy = left; }\n // left -= copy;\n // state.length -= copy;\n // do {\n // output[put++] = 0;\n // } while (--copy);\n // if (state.length === 0) { state.mode = LEN; }\n // break;\n //#endif\n }\n if (copy > state.wnext) {\n copy -= state.wnext;\n from = state.wsize - copy;\n }\n else {\n from = state.wnext - copy;\n }\n if (copy > state.length) { copy = state.length; }\n from_source = state.window;\n }\n else { /* copy from output */\n from_source = output;\n from = put - state.offset;\n copy = state.length;\n }\n if (copy > left) { copy = left; }\n left -= copy;\n state.length -= copy;\n do {\n output[put++] = from_source[from++];\n } while (--copy);\n if (state.length === 0) { state.mode = LEN; }\n break;\n case LIT:\n if (left === 0) { break inf_leave; }\n output[put++] = state.length;\n left--;\n state.mode = LEN;\n break;\n case CHECK:\n if (state.wrap) {\n //=== NEEDBITS(32);\n while (bits < 32) {\n if (have === 0) { break inf_leave; }\n have--;\n // Use '|' instead of '+' to make sure that result is signed\n hold |= input[next++] << bits;\n bits += 8;\n }\n //===//\n _out -= left;\n strm.total_out += _out;\n state.total += _out;\n if (_out) {\n strm.adler = state.check =\n /*UPDATE(state.check, put - _out, _out);*/\n (state.flags ? crc32_1(state.check, output, _out, put - _out) : adler32_1(state.check, output, _out, put - _out));\n\n }\n _out = left;\n // NB: crc32 stored as signed 32-bit int, zswap32 returns signed too\n if ((state.flags ? hold : zswap32(hold)) !== state.check) {\n strm.msg = 'incorrect data check';\n state.mode = BAD;\n break;\n }\n //=== INITBITS();\n hold = 0;\n bits = 0;\n //===//\n //Tracev((stderr, \"inflate: check matches trailer\"));\n }\n state.mode = LENGTH;\n /* falls through */\n case LENGTH:\n if (state.wrap && state.flags) {\n //=== NEEDBITS(32);\n while (bits < 32) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n if (hold !== (state.total & 0xffffffff)) {\n strm.msg = 'incorrect length check';\n state.mode = BAD;\n break;\n }\n //=== INITBITS();\n hold = 0;\n bits = 0;\n //===//\n //Tracev((stderr, \"inflate: length matches trailer\"));\n }\n state.mode = DONE;\n /* falls through */\n case DONE:\n ret = Z_STREAM_END$1;\n break inf_leave;\n case BAD:\n ret = Z_DATA_ERROR$1;\n break inf_leave;\n case MEM:\n return Z_MEM_ERROR$1;\n case SYNC:\n /* falls through */\n default:\n return Z_STREAM_ERROR$1;\n }\n }\n\n // inf_leave <- here is real place for \"goto inf_leave\", emulated via \"break inf_leave\"\n\n /*\n Return from inflate(), updating the total counts and the check value.\n If there was no progress during the inflate() call, return a buffer\n error. Call updatewindow() to create and/or update the window state.\n Note: a memory error from inflate() is non-recoverable.\n */\n\n //--- RESTORE() ---\n strm.next_out = put;\n strm.avail_out = left;\n strm.next_in = next;\n strm.avail_in = have;\n state.hold = hold;\n state.bits = bits;\n //---\n\n if (state.wsize || (_out !== strm.avail_out && state.mode < BAD &&\n (state.mode < CHECK || flush !== Z_FINISH$1))) {\n if (updatewindow(strm, strm.output, strm.next_out, _out - strm.avail_out)) ;\n }\n _in -= strm.avail_in;\n _out -= strm.avail_out;\n strm.total_in += _in;\n strm.total_out += _out;\n state.total += _out;\n if (state.wrap && _out) {\n strm.adler = state.check = /*UPDATE(state.check, strm.next_out - _out, _out);*/\n (state.flags ? crc32_1(state.check, output, _out, strm.next_out - _out) : adler32_1(state.check, output, _out, strm.next_out - _out));\n }\n strm.data_type = state.bits + (state.last ? 64 : 0) +\n (state.mode === TYPE ? 128 : 0) +\n (state.mode === LEN_ || state.mode === COPY_ ? 256 : 0);\n if (((_in === 0 && _out === 0) || flush === Z_FINISH$1) && ret === Z_OK$1) {\n ret = Z_BUF_ERROR;\n }\n return ret;\n };\n\n\n const inflateEnd = (strm) => {\n\n if (!strm || !strm.state /*|| strm->zfree == (free_func)0*/) {\n return Z_STREAM_ERROR$1;\n }\n\n let state = strm.state;\n if (state.window) {\n state.window = null;\n }\n strm.state = null;\n return Z_OK$1;\n };\n\n\n const inflateGetHeader = (strm, head) => {\n\n /* check state */\n if (!strm || !strm.state) { return Z_STREAM_ERROR$1; }\n const state = strm.state;\n if ((state.wrap & 2) === 0) { return Z_STREAM_ERROR$1; }\n\n /* save header structure */\n state.head = head;\n head.done = false;\n return Z_OK$1;\n };\n\n\n const inflateSetDictionary = (strm, dictionary) => {\n const dictLength = dictionary.length;\n\n let state;\n let dictid;\n let ret;\n\n /* check state */\n if (!strm /* == Z_NULL */ || !strm.state /* == Z_NULL */) { return Z_STREAM_ERROR$1; }\n state = strm.state;\n\n if (state.wrap !== 0 && state.mode !== DICT) {\n return Z_STREAM_ERROR$1;\n }\n\n /* check for correct dictionary identifier */\n if (state.mode === DICT) {\n dictid = 1; /* adler32(0, null, 0)*/\n /* dictid = adler32(dictid, dictionary, dictLength); */\n dictid = adler32_1(dictid, dictionary, dictLength, 0);\n if (dictid !== state.check) {\n return Z_DATA_ERROR$1;\n }\n }\n /* copy dictionary to window using updatewindow(), which will amend the\n existing dictionary if appropriate */\n ret = updatewindow(strm, dictionary, dictLength, dictLength);\n if (ret) {\n state.mode = MEM;\n return Z_MEM_ERROR$1;\n }\n state.havedict = 1;\n // Tracev((stderr, \"inflate: dictionary set\"));\n return Z_OK$1;\n };\n\n\n var inflateReset_1 = inflateReset;\n var inflateReset2_1 = inflateReset2;\n var inflateResetKeep_1 = inflateResetKeep;\n var inflateInit_1 = inflateInit;\n var inflateInit2_1 = inflateInit2;\n var inflate_2$1 = inflate$1;\n var inflateEnd_1 = inflateEnd;\n var inflateGetHeader_1 = inflateGetHeader;\n var inflateSetDictionary_1 = inflateSetDictionary;\n var inflateInfo = 'pako inflate (from Nodeca project)';\n\n /* Not implemented\n module.exports.inflateCopy = inflateCopy;\n module.exports.inflateGetDictionary = inflateGetDictionary;\n module.exports.inflateMark = inflateMark;\n module.exports.inflatePrime = inflatePrime;\n module.exports.inflateSync = inflateSync;\n module.exports.inflateSyncPoint = inflateSyncPoint;\n module.exports.inflateUndermine = inflateUndermine;\n */\n\n var inflate_1$1 = {\n \tinflateReset: inflateReset_1,\n \tinflateReset2: inflateReset2_1,\n \tinflateResetKeep: inflateResetKeep_1,\n \tinflateInit: inflateInit_1,\n \tinflateInit2: inflateInit2_1,\n \tinflate: inflate_2$1,\n \tinflateEnd: inflateEnd_1,\n \tinflateGetHeader: inflateGetHeader_1,\n \tinflateSetDictionary: inflateSetDictionary_1,\n \tinflateInfo: inflateInfo\n };\n\n const _has = (obj, key) => {\n return Object.prototype.hasOwnProperty.call(obj, key);\n };\n\n var assign = function (obj /*from1, from2, from3, ...*/) {\n const sources = Array.prototype.slice.call(arguments, 1);\n while (sources.length) {\n const source = sources.shift();\n if (!source) { continue; }\n\n if (typeof source !== 'object') {\n throw new TypeError(source + 'must be non-object');\n }\n\n for (const p in source) {\n if (_has(source, p)) {\n obj[p] = source[p];\n }\n }\n }\n\n return obj;\n };\n\n\n // Join array of chunks to single array.\n var flattenChunks = (chunks) => {\n // calculate data length\n let len = 0;\n\n for (let i = 0, l = chunks.length; i < l; i++) {\n len += chunks[i].length;\n }\n\n // join chunks\n const result = new Uint8Array(len);\n\n for (let i = 0, pos = 0, l = chunks.length; i < l; i++) {\n let chunk = chunks[i];\n result.set(chunk, pos);\n pos += chunk.length;\n }\n\n return result;\n };\n\n var common = {\n \tassign: assign,\n \tflattenChunks: flattenChunks\n };\n\n // String encode/decode helpers\n\n\n // Quick check if we can use fast array to bin string conversion\n //\n // - apply(Array) can fail on Android 2.2\n // - apply(Uint8Array) can fail on iOS 5.1 Safari\n //\n let STR_APPLY_UIA_OK = true;\n\n try { String.fromCharCode.apply(null, new Uint8Array(1)); } catch (__) { STR_APPLY_UIA_OK = false; }\n\n\n // Table with utf8 lengths (calculated by first byte of sequence)\n // Note, that 5 & 6-byte values and some 4-byte values can not be represented in JS,\n // because max possible codepoint is 0x10ffff\n const _utf8len = new Uint8Array(256);\n for (let q = 0; q < 256; q++) {\n _utf8len[q] = (q >= 252 ? 6 : q >= 248 ? 5 : q >= 240 ? 4 : q >= 224 ? 3 : q >= 192 ? 2 : 1);\n }\n _utf8len[254] = _utf8len[254] = 1; // Invalid sequence start\n\n\n // convert string to array (typed, when possible)\n var string2buf = (str) => {\n if (typeof TextEncoder === 'function' && TextEncoder.prototype.encode) {\n return new TextEncoder().encode(str);\n }\n\n let buf, c, c2, m_pos, i, str_len = str.length, buf_len = 0;\n\n // count binary size\n for (m_pos = 0; m_pos < str_len; m_pos++) {\n c = str.charCodeAt(m_pos);\n if ((c & 0xfc00) === 0xd800 && (m_pos + 1 < str_len)) {\n c2 = str.charCodeAt(m_pos + 1);\n if ((c2 & 0xfc00) === 0xdc00) {\n c = 0x10000 + ((c - 0xd800) << 10) + (c2 - 0xdc00);\n m_pos++;\n }\n }\n buf_len += c < 0x80 ? 1 : c < 0x800 ? 2 : c < 0x10000 ? 3 : 4;\n }\n\n // allocate buffer\n buf = new Uint8Array(buf_len);\n\n // convert\n for (i = 0, m_pos = 0; i < buf_len; m_pos++) {\n c = str.charCodeAt(m_pos);\n if ((c & 0xfc00) === 0xd800 && (m_pos + 1 < str_len)) {\n c2 = str.charCodeAt(m_pos + 1);\n if ((c2 & 0xfc00) === 0xdc00) {\n c = 0x10000 + ((c - 0xd800) << 10) + (c2 - 0xdc00);\n m_pos++;\n }\n }\n if (c < 0x80) {\n /* one byte */\n buf[i++] = c;\n } else if (c < 0x800) {\n /* two bytes */\n buf[i++] = 0xC0 | (c >>> 6);\n buf[i++] = 0x80 | (c & 0x3f);\n } else if (c < 0x10000) {\n /* three bytes */\n buf[i++] = 0xE0 | (c >>> 12);\n buf[i++] = 0x80 | (c >>> 6 & 0x3f);\n buf[i++] = 0x80 | (c & 0x3f);\n } else {\n /* four bytes */\n buf[i++] = 0xf0 | (c >>> 18);\n buf[i++] = 0x80 | (c >>> 12 & 0x3f);\n buf[i++] = 0x80 | (c >>> 6 & 0x3f);\n buf[i++] = 0x80 | (c & 0x3f);\n }\n }\n\n return buf;\n };\n\n // Helper\n const buf2binstring = (buf, len) => {\n // On Chrome, the arguments in a function call that are allowed is `65534`.\n // If the length of the buffer is smaller than that, we can use this optimization,\n // otherwise we will take a slower path.\n if (len < 65534) {\n if (buf.subarray && STR_APPLY_UIA_OK) {\n return String.fromCharCode.apply(null, buf.length === len ? buf : buf.subarray(0, len));\n }\n }\n\n let result = '';\n for (let i = 0; i < len; i++) {\n result += String.fromCharCode(buf[i]);\n }\n return result;\n };\n\n\n // convert array to string\n var buf2string = (buf, max) => {\n const len = max || buf.length;\n\n if (typeof TextDecoder === 'function' && TextDecoder.prototype.decode) {\n return new TextDecoder().decode(buf.subarray(0, max));\n }\n\n let i, out;\n\n // Reserve max possible length (2 words per char)\n // NB: by unknown reasons, Array is significantly faster for\n // String.fromCharCode.apply than Uint16Array.\n const utf16buf = new Array(len * 2);\n\n for (out = 0, i = 0; i < len;) {\n let c = buf[i++];\n // quick process ascii\n if (c < 0x80) { utf16buf[out++] = c; continue; }\n\n let c_len = _utf8len[c];\n // skip 5 & 6 byte codes\n if (c_len > 4) { utf16buf[out++] = 0xfffd; i += c_len - 1; continue; }\n\n // apply mask on first byte\n c &= c_len === 2 ? 0x1f : c_len === 3 ? 0x0f : 0x07;\n // join the rest\n while (c_len > 1 && i < len) {\n c = (c << 6) | (buf[i++] & 0x3f);\n c_len--;\n }\n\n // terminated by end of string?\n if (c_len > 1) { utf16buf[out++] = 0xfffd; continue; }\n\n if (c < 0x10000) {\n utf16buf[out++] = c;\n } else {\n c -= 0x10000;\n utf16buf[out++] = 0xd800 | ((c >> 10) & 0x3ff);\n utf16buf[out++] = 0xdc00 | (c & 0x3ff);\n }\n }\n\n return buf2binstring(utf16buf, out);\n };\n\n\n // Calculate max possible position in utf8 buffer,\n // that will not break sequence. If that's not possible\n // - (very small limits) return max size as is.\n //\n // buf[] - utf8 bytes array\n // max - length limit (mandatory);\n var utf8border = (buf, max) => {\n\n max = max || buf.length;\n if (max > buf.length) { max = buf.length; }\n\n // go back from last position, until start of sequence found\n let pos = max - 1;\n while (pos >= 0 && (buf[pos] & 0xC0) === 0x80) { pos--; }\n\n // Very small and broken sequence,\n // return max, because we should return something anyway.\n if (pos < 0) { return max; }\n\n // If we came to start of buffer - that means buffer is too small,\n // return max too.\n if (pos === 0) { return max; }\n\n return (pos + _utf8len[buf[pos]] > max) ? pos : max;\n };\n\n var strings = {\n \tstring2buf: string2buf,\n \tbuf2string: buf2string,\n \tutf8border: utf8border\n };\n\n // (C) 1995-2013 Jean-loup Gailly and Mark Adler\n // (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n //\n // This software is provided 'as-is', without any express or implied\n // warranty. In no event will the authors be held liable for any damages\n // arising from the use of this software.\n //\n // Permission is granted to anyone to use this software for any purpose,\n // including commercial applications, and to alter it and redistribute it\n // freely, subject to the following restrictions:\n //\n // 1. The origin of this software must not be misrepresented; you must not\n // claim that you wrote the original software. If you use this software\n // in a product, an acknowledgment in the product documentation would be\n // appreciated but is not required.\n // 2. Altered source versions must be plainly marked as such, and must not be\n // misrepresented as being the original software.\n // 3. This notice may not be removed or altered from any source distribution.\n\n var messages = {\n 2: 'need dictionary', /* Z_NEED_DICT 2 */\n 1: 'stream end', /* Z_STREAM_END 1 */\n 0: '', /* Z_OK 0 */\n '-1': 'file error', /* Z_ERRNO (-1) */\n '-2': 'stream error', /* Z_STREAM_ERROR (-2) */\n '-3': 'data error', /* Z_DATA_ERROR (-3) */\n '-4': 'insufficient memory', /* Z_MEM_ERROR (-4) */\n '-5': 'buffer error', /* Z_BUF_ERROR (-5) */\n '-6': 'incompatible version' /* Z_VERSION_ERROR (-6) */\n };\n\n // (C) 1995-2013 Jean-loup Gailly and Mark Adler\n // (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n //\n // This software is provided 'as-is', without any express or implied\n // warranty. In no event will the authors be held liable for any damages\n // arising from the use of this software.\n //\n // Permission is granted to anyone to use this software for any purpose,\n // including commercial applications, and to alter it and redistribute it\n // freely, subject to the following restrictions:\n //\n // 1. The origin of this software must not be misrepresented; you must not\n // claim that you wrote the original software. If you use this software\n // in a product, an acknowledgment in the product documentation would be\n // appreciated but is not required.\n // 2. Altered source versions must be plainly marked as such, and must not be\n // misrepresented as being the original software.\n // 3. This notice may not be removed or altered from any source distribution.\n\n function ZStream() {\n /* next input byte */\n this.input = null; // JS specific, because we have no pointers\n this.next_in = 0;\n /* number of bytes available at input */\n this.avail_in = 0;\n /* total number of input bytes read so far */\n this.total_in = 0;\n /* next output byte should be put there */\n this.output = null; // JS specific, because we have no pointers\n this.next_out = 0;\n /* remaining free space at output */\n this.avail_out = 0;\n /* total number of bytes output so far */\n this.total_out = 0;\n /* last error message, NULL if no error */\n this.msg = ''/*Z_NULL*/;\n /* not visible by applications */\n this.state = null;\n /* best guess about the data type: binary or text */\n this.data_type = 2/*Z_UNKNOWN*/;\n /* adler32 value of the uncompressed data */\n this.adler = 0;\n }\n\n var zstream = ZStream;\n\n // (C) 1995-2013 Jean-loup Gailly and Mark Adler\n // (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n //\n // This software is provided 'as-is', without any express or implied\n // warranty. In no event will the authors be held liable for any damages\n // arising from the use of this software.\n //\n // Permission is granted to anyone to use this software for any purpose,\n // including commercial applications, and to alter it and redistribute it\n // freely, subject to the following restrictions:\n //\n // 1. The origin of this software must not be misrepresented; you must not\n // claim that you wrote the original software. If you use this software\n // in a product, an acknowledgment in the product documentation would be\n // appreciated but is not required.\n // 2. Altered source versions must be plainly marked as such, and must not be\n // misrepresented as being the original software.\n // 3. This notice may not be removed or altered from any source distribution.\n\n function GZheader() {\n /* true if compressed data believed to be text */\n this.text = 0;\n /* modification time */\n this.time = 0;\n /* extra flags (not used when writing a gzip file) */\n this.xflags = 0;\n /* operating system */\n this.os = 0;\n /* pointer to extra field or Z_NULL if none */\n this.extra = null;\n /* extra field length (valid if extra != Z_NULL) */\n this.extra_len = 0; // Actually, we don't need it in JS,\n // but leave for few code modifications\n\n //\n // Setup limits is not necessary because in js we should not preallocate memory\n // for inflate use constant limit in 65536 bytes\n //\n\n /* space at extra (only when reading header) */\n // this.extra_max = 0;\n /* pointer to zero-terminated file name or Z_NULL */\n this.name = '';\n /* space at name (only when reading header) */\n // this.name_max = 0;\n /* pointer to zero-terminated comment or Z_NULL */\n this.comment = '';\n /* space at comment (only when reading header) */\n // this.comm_max = 0;\n /* true if there was or will be a header crc */\n this.hcrc = 0;\n /* true when done reading gzip header (not used when writing a gzip file) */\n this.done = false;\n }\n\n var gzheader = GZheader;\n\n const toString = Object.prototype.toString;\n\n /* Public constants ==========================================================*/\n /* ===========================================================================*/\n\n const {\n Z_NO_FLUSH, Z_FINISH,\n Z_OK, Z_STREAM_END, Z_NEED_DICT, Z_STREAM_ERROR, Z_DATA_ERROR, Z_MEM_ERROR\n } = constants$1;\n\n /* ===========================================================================*/\n\n\n /**\n * class Inflate\n *\n * Generic JS-style wrapper for zlib calls. If you don't need\n * streaming behaviour - use more simple functions: [[inflate]]\n * and [[inflateRaw]].\n **/\n\n /* internal\n * inflate.chunks -> Array\n *\n * Chunks of output data, if [[Inflate#onData]] not overridden.\n **/\n\n /**\n * Inflate.result -> Uint8Array|String\n *\n * Uncompressed result, generated by default [[Inflate#onData]]\n * and [[Inflate#onEnd]] handlers. Filled after you push last chunk\n * (call [[Inflate#push]] with `Z_FINISH` / `true` param).\n **/\n\n /**\n * Inflate.err -> Number\n *\n * Error code after inflate finished. 0 (Z_OK) on success.\n * Should be checked if broken data possible.\n **/\n\n /**\n * Inflate.msg -> String\n *\n * Error message, if [[Inflate.err]] != 0\n **/\n\n\n /**\n * new Inflate(options)\n * - options (Object): zlib inflate options.\n *\n * Creates new inflator instance with specified params. Throws exception\n * on bad params. Supported options:\n *\n * - `windowBits`\n * - `dictionary`\n *\n * [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced)\n * for more information on these.\n *\n * Additional options, for internal needs:\n *\n * - `chunkSize` - size of generated data chunks (16K by default)\n * - `raw` (Boolean) - do raw inflate\n * - `to` (String) - if equal to 'string', then result will be converted\n * from utf8 to utf16 (javascript) string. When string output requested,\n * chunk length can differ from `chunkSize`, depending on content.\n *\n * By default, when no options set, autodetect deflate/gzip data format via\n * wrapper header.\n *\n * ##### Example:\n *\n * ```javascript\n * const pako = require('pako')\n * const chunk1 = new Uint8Array([1,2,3,4,5,6,7,8,9])\n * const chunk2 = new Uint8Array([10,11,12,13,14,15,16,17,18,19]);\n *\n * const inflate = new pako.Inflate({ level: 3});\n *\n * inflate.push(chunk1, false);\n * inflate.push(chunk2, true); // true -> last chunk\n *\n * if (inflate.err) { throw new Error(inflate.err); }\n *\n * console.log(inflate.result);\n * ```\n **/\n function Inflate(options) {\n this.options = common.assign({\n chunkSize: 1024 * 64,\n windowBits: 15,\n to: ''\n }, options || {});\n\n const opt = this.options;\n\n // Force window size for `raw` data, if not set directly,\n // because we have no header for autodetect.\n if (opt.raw && (opt.windowBits >= 0) && (opt.windowBits < 16)) {\n opt.windowBits = -opt.windowBits;\n if (opt.windowBits === 0) { opt.windowBits = -15; }\n }\n\n // If `windowBits` not defined (and mode not raw) - set autodetect flag for gzip/deflate\n if ((opt.windowBits >= 0) && (opt.windowBits < 16) &&\n !(options && options.windowBits)) {\n opt.windowBits += 32;\n }\n\n // Gzip header has no info about windows size, we can do autodetect only\n // for deflate. So, if window size not set, force it to max when gzip possible\n if ((opt.windowBits > 15) && (opt.windowBits < 48)) {\n // bit 3 (16) -> gzipped data\n // bit 4 (32) -> autodetect gzip/deflate\n if ((opt.windowBits & 15) === 0) {\n opt.windowBits |= 15;\n }\n }\n\n this.err = 0; // error code, if happens (0 = Z_OK)\n this.msg = ''; // error message\n this.ended = false; // used to avoid multiple onEnd() calls\n this.chunks = []; // chunks of compressed data\n\n this.strm = new zstream();\n this.strm.avail_out = 0;\n\n let status = inflate_1$1.inflateInit2(\n this.strm,\n opt.windowBits\n );\n\n if (status !== Z_OK) {\n throw new Error(messages[status]);\n }\n\n this.header = new gzheader();\n\n inflate_1$1.inflateGetHeader(this.strm, this.header);\n\n // Setup dictionary\n if (opt.dictionary) {\n // Convert data if needed\n if (typeof opt.dictionary === 'string') {\n opt.dictionary = strings.string2buf(opt.dictionary);\n } else if (toString.call(opt.dictionary) === '[object ArrayBuffer]') {\n opt.dictionary = new Uint8Array(opt.dictionary);\n }\n if (opt.raw) { //In raw mode we need to set the dictionary early\n status = inflate_1$1.inflateSetDictionary(this.strm, opt.dictionary);\n if (status !== Z_OK) {\n throw new Error(messages[status]);\n }\n }\n }\n }\n\n /**\n * Inflate#push(data[, flush_mode]) -> Boolean\n * - data (Uint8Array|ArrayBuffer): input data\n * - flush_mode (Number|Boolean): 0..6 for corresponding Z_NO_FLUSH..Z_TREE\n * flush modes. See constants. Skipped or `false` means Z_NO_FLUSH,\n * `true` means Z_FINISH.\n *\n * Sends input data to inflate pipe, generating [[Inflate#onData]] calls with\n * new output chunks. Returns `true` on success. If end of stream detected,\n * [[Inflate#onEnd]] will be called.\n *\n * `flush_mode` is not needed for normal operation, because end of stream\n * detected automatically. You may try to use it for advanced things, but\n * this functionality was not tested.\n *\n * On fail call [[Inflate#onEnd]] with error code and return false.\n *\n * ##### Example\n *\n * ```javascript\n * push(chunk, false); // push one of data chunks\n * ...\n * push(chunk, true); // push last chunk\n * ```\n **/\n Inflate.prototype.push = function (data, flush_mode) {\n const strm = this.strm;\n const chunkSize = this.options.chunkSize;\n const dictionary = this.options.dictionary;\n let status, _flush_mode, last_avail_out;\n\n if (this.ended) return false;\n\n if (flush_mode === ~~flush_mode) _flush_mode = flush_mode;\n else _flush_mode = flush_mode === true ? Z_FINISH : Z_NO_FLUSH;\n\n // Convert data if needed\n if (toString.call(data) === '[object ArrayBuffer]') {\n strm.input = new Uint8Array(data);\n } else {\n strm.input = data;\n }\n\n strm.next_in = 0;\n strm.avail_in = strm.input.length;\n\n for (;;) {\n if (strm.avail_out === 0) {\n strm.output = new Uint8Array(chunkSize);\n strm.next_out = 0;\n strm.avail_out = chunkSize;\n }\n\n status = inflate_1$1.inflate(strm, _flush_mode);\n\n if (status === Z_NEED_DICT && dictionary) {\n status = inflate_1$1.inflateSetDictionary(strm, dictionary);\n\n if (status === Z_OK) {\n status = inflate_1$1.inflate(strm, _flush_mode);\n } else if (status === Z_DATA_ERROR) {\n // Replace code with more verbose\n status = Z_NEED_DICT;\n }\n }\n\n // Skip snyc markers if more data follows and not raw mode\n while (strm.avail_in > 0 &&\n status === Z_STREAM_END &&\n strm.state.wrap > 0 &&\n data[strm.next_in] !== 0)\n {\n inflate_1$1.inflateReset(strm);\n status = inflate_1$1.inflate(strm, _flush_mode);\n }\n\n switch (status) {\n case Z_STREAM_ERROR:\n case Z_DATA_ERROR:\n case Z_NEED_DICT:\n case Z_MEM_ERROR:\n this.onEnd(status);\n this.ended = true;\n return false;\n }\n\n // Remember real `avail_out` value, because we may patch out buffer content\n // to align utf8 strings boundaries.\n last_avail_out = strm.avail_out;\n\n if (strm.next_out) {\n if (strm.avail_out === 0 || status === Z_STREAM_END) {\n\n if (this.options.to === 'string') {\n\n let next_out_utf8 = strings.utf8border(strm.output, strm.next_out);\n\n let tail = strm.next_out - next_out_utf8;\n let utf8str = strings.buf2string(strm.output, next_out_utf8);\n\n // move tail & realign counters\n strm.next_out = tail;\n strm.avail_out = chunkSize - tail;\n if (tail) strm.output.set(strm.output.subarray(next_out_utf8, next_out_utf8 + tail), 0);\n\n this.onData(utf8str);\n\n } else {\n this.onData(strm.output.length === strm.next_out ? strm.output : strm.output.subarray(0, strm.next_out));\n }\n }\n }\n\n // Must repeat iteration if out buffer is full\n if (status === Z_OK && last_avail_out === 0) continue;\n\n // Finalize if end of stream reached.\n if (status === Z_STREAM_END) {\n status = inflate_1$1.inflateEnd(this.strm);\n this.onEnd(status);\n this.ended = true;\n return true;\n }\n\n if (strm.avail_in === 0) break;\n }\n\n return true;\n };\n\n\n /**\n * Inflate#onData(chunk) -> Void\n * - chunk (Uint8Array|String): output data. When string output requested,\n * each chunk will be string.\n *\n * By default, stores data blocks in `chunks[]` property and glue\n * those in `onEnd`. Override this handler, if you need another behaviour.\n **/\n Inflate.prototype.onData = function (chunk) {\n this.chunks.push(chunk);\n };\n\n\n /**\n * Inflate#onEnd(status) -> Void\n * - status (Number): inflate status. 0 (Z_OK) on success,\n * other if not.\n *\n * Called either after you tell inflate that the input stream is\n * complete (Z_FINISH). By default - join collected chunks,\n * free memory and fill `results` / `err` properties.\n **/\n Inflate.prototype.onEnd = function (status) {\n // On success - join\n if (status === Z_OK) {\n if (this.options.to === 'string') {\n this.result = this.chunks.join('');\n } else {\n this.result = common.flattenChunks(this.chunks);\n }\n }\n this.chunks = [];\n this.err = status;\n this.msg = this.strm.msg;\n };\n\n\n /**\n * inflate(data[, options]) -> Uint8Array|String\n * - data (Uint8Array): input data to decompress.\n * - options (Object): zlib inflate options.\n *\n * Decompress `data` with inflate/ungzip and `options`. Autodetect\n * format via wrapper header by default. That's why we don't provide\n * separate `ungzip` method.\n *\n * Supported options are:\n *\n * - windowBits\n *\n * [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced)\n * for more information.\n *\n * Sugar (options):\n *\n * - `raw` (Boolean) - say that we work with raw stream, if you don't wish to specify\n * negative windowBits implicitly.\n * - `to` (String) - if equal to 'string', then result will be converted\n * from utf8 to utf16 (javascript) string. When string output requested,\n * chunk length can differ from `chunkSize`, depending on content.\n *\n *\n * ##### Example:\n *\n * ```javascript\n * const pako = require('pako');\n * const input = pako.deflate(new Uint8Array([1,2,3,4,5,6,7,8,9]));\n * let output;\n *\n * try {\n * output = pako.inflate(input);\n * } catch (err) {\n * console.log(err);\n * }\n * ```\n **/\n function inflate(input, options) {\n const inflator = new Inflate(options);\n\n inflator.push(input);\n\n // That will never happens, if you don't cheat with options :)\n if (inflator.err) throw inflator.msg || messages[inflator.err];\n\n return inflator.result;\n }\n\n\n /**\n * inflateRaw(data[, options]) -> Uint8Array|String\n * - data (Uint8Array): input data to decompress.\n * - options (Object): zlib inflate options.\n *\n * The same as [[inflate]], but creates raw data, without wrapper\n * (header and adler32 crc).\n **/\n function inflateRaw(input, options) {\n options = options || {};\n options.raw = true;\n return inflate(input, options);\n }\n\n\n /**\n * ungzip(data[, options]) -> Uint8Array|String\n * - data (Uint8Array): input data to decompress.\n * - options (Object): zlib inflate options.\n *\n * Just shortcut to [[inflate]], because it autodetects format\n * by header.content. Done for convenience.\n **/\n\n\n var Inflate_1 = Inflate;\n var inflate_2 = inflate;\n var inflateRaw_1 = inflateRaw;\n var ungzip = inflate;\n var constants = constants$1;\n\n var inflate_1 = {\n \tInflate: Inflate_1,\n \tinflate: inflate_2,\n \tinflateRaw: inflateRaw_1,\n \tungzip: ungzip,\n \tconstants: constants\n };\n\n exports.Inflate = Inflate_1;\n exports.constants = constants;\n exports['default'] = inflate_1;\n exports.inflate = inflate_2;\n exports.inflateRaw = inflateRaw_1;\n exports.ungzip = ungzip;\n\n Object.defineProperty(exports, '__esModule', { value: true });\n\n})));\n\n","/* noCompress */",e.substring(e.indexOf("{")+1,e.lastIndexOf("}")),"/* gzipCompress */",t.substring(t.indexOf("{")+1,t.lastIndexOf("}")),"/* parseChunk */",n.substring(n.indexOf("{")+1,n.lastIndexOf("}"))].join("\n"),"","/* worker */",HL].join("\n");this.workerSourceURL=URL.createObjectURL(new Blob([i]))}return()=>new Worker(this.workerSourceURL)}_createMesh(e,t){const{buffer:n,position:i,normal:s,texcoord:r,indice:o,sub_mesh:a}=e,l=new Uint32Array(n,o.byteOffset,o.length),c=new Float32Array(n,i.byteOffset,i.length),h=new Int8Array(n,s.byteOffset,s.length),d=new Float32Array(n,r.byteOffset,r.length),u=new Hs;u.setIndex(new Ts(l,1)),u.setAttribute("position",new Ts(c,3)),u.setAttribute("normal",new Ts(h,3,!0)),u.setAttribute("uv",new Ts(d,2));for(let e=0;e<a.length;e++){const{uuid:n,start:i,count:s}=a[e],r=this.loadedMaterialsMap.get(n);if(r){const{materialIndex:e}=r;u.addGroup(i,s,e)}else u.addGroup(i,s,0),Vm(`sbmx material: not found uuid: ${n} in file: ${t+"textureIndex.json"}`)}Yy.generate(u).then((e=>{u.boundsTree=e}));const p=new or(u,this.loadedMaterials);return p.castShadow=!0,p.receiveShadow=!0,p}_createMaterial(e){return rf(this,void 0,void 0,(function*(){const t=qm(e),n=t+"textureIndex.json",i=this.loadedTextures.get(n);if(i)return i;const s=yield this.store.getItem(`${e}_texture`);let r;if(s)r=s,this.loadedTextures.set(n,Promise.resolve(r));else{const t=this.loadedTextures.get(n);if(t)return t;const i=mf(n).then((e=>e.json()));this.loadedTextures.set(n,i),r=yield i,ff((()=>{this.store.setItem(`${e}_texture`,r)}))}Object.entries(r).forEach((e=>{let[n,i]=e;if(this.loadedMaterialsMap.has(n))return;const{name:s,base_map:r,nor_map:o,alphamode:a,color:l={r:1,g:1,b:1,a:1},metallic:c=.5,roughness:h=.5}=i,{r:d,g:u,b:p,a:m}=l,f=0!==a,g=new kh({name:s,color:new Fn(d,u,p),side:0,metalness:c,roughness:h,opacity:m,transparent:f,depthWrite:!f});if(r){const e=t+r;(new Md).load(e,(e=>{e.flipY=!0,e.encoding=3001,e.wrapS=1e3,e.wrapT=1e3,e.minFilter=1008,e.magFilter=1006,e.needsUpdate=!0,g.map=e,g.needsUpdate=!0,gS.needsUpdate=!0}))}if(o){const e=t+o;(new Md).load(e,(e=>{e.flipY=!0,e.encoding=3001,e.wrapS=1e3,e.wrapT=1e3,e.needsUpdate=!0,g.normalMap=e,g.needsUpdate=!0,gS.needsUpdate=!0}))}const y=this.loadedMaterials.push(g)-1;this.loadedMaterialsMap.set(n,{material:g,materialIndex:y})}))}))}dispose(){this.workerPool.dispose(),URL.revokeObjectURL(this.workerSourceURL)}}const FL=new Map,UL=e=>{var t;return null!==(t=null==e?void 0:e.toLowerCase().endsWith(".png"))&&void 0!==t&&t},OL=e=>{if(FL.has(e))return FL.get(e);const t=new Jn;return FL.set(e,t),(new xd).load(e,(e=>{t.image=e,t.needsUpdate=!0,gS.needsUpdate=!0})),t.encoding=3001,t.wrapS=1e3,t.wrapT=1e3,t.flipY=!1,t.anisotropy=16,t.mipmaps=[],t.generateMipmaps=!0,t},YL=(e,t,n,i)=>{const[s,r,o,a,l]=t,c=i||a<1;return new kh({name:e,color:new Fn(s,r,o),opacity:a,transparent:c,depthWrite:!c,alphaTest:.01,map:n,side:l})};class KL extends DataView{constructor(e,t){super(e),this.isLE=!0,this.appKeys=t}byteRevers(e,t){const n=t%this.appKeys.length;return e^this.appKeys[n]}getSoonUint8(e){return this.byteRevers(this.getUint8(e),e)}getSoonUint16(e){const t=new DataView(new Uint8Array(2).buffer);for(let n=0;n<2;n++)t.setUint8(n,this.getSoonUint8(e+n));return t.getUint16(0,this.isLE)}getSoonUint32(e){const t=new DataView(new Uint8Array(4).buffer);for(let n=0;n<4;n++)t.setUint8(n,this.getSoonUint8(e+n));return t.getUint32(0,this.isLE)}getSoonFloat32(e){const t=new DataView(new Uint8Array(4).buffer);for(let n=0;n<4;n++)t.setUint8(n,this.getSoonUint8(e+n));return t.getFloat32(0,this.isLE)}}const jL=new TextDecoder;new TextDecoder;class JL{constructor(){this.materials=new Map}parseObject(e,t){const n=new LS(Object.assign(Object.assign({},t),{format:"sbm"})),i=new MS({id:cg()});n.add(i);const{materialsCache:s,meshsCache:r}=e;for(const[e,t]of Object.entries(s)){if(this.materials.has(e))continue;const{textureUrl:n,materialInfo:i}=t;let s=null;n&&(s=OL(n));const r=YL(e,i,s,UL(n));this.materials.set(e,r)}for(const[e,t]of Object.entries(r)){const{meshName:n,materialId:s,position:r,uv:o}=t,a=this.materials.get(s.toString());if(a){const t=new Hs,s=new Float32Array(r),l=new Float32Array(o);s.length>0&&t.setAttribute("position",new Ts(s,3)),l.length>0&&t.setAttribute("uv",new Ts(l,2)),t.computeVertexNormals(),Yy.generate(t).then((e=>{t.boundsTree=e}));const c=new xS(t,a,{id:`${e}_${cg()}`,name:n||e});i.add(c)}}return n}}var QL=class{constructor(){this.materials=new Map,this.sbmInfo=null}parseBuffer(e,t,n){return rf(this,void 0,void 0,(function*(){this.sbmInfo=t;const i=new DataView(e);let s=0;const r=[];for(let e=0;e<8;e++)r.push(i.getUint8(s)),s+=1;if("SBK-----"!==String.fromCharCode(...r))return Promise.reject(`In soonspacejs: sbm 资源模型(${this.sbmInfo.url})格式或数据错误!`);const o=[],a=[],l=[];for(let e=0;e<32;e++)o.push(i.getUint8(s)),s+=1;const c=i.getUint8(s);s+=1;const h=i.getUint8(s);s+=1;for(let e=0;e<32;e++)a.push(i.getUint8(s)),s+=1;for(let e=0;e<64;e++)l.push(i.getUint8(s)),s+=1;const d=[...a,...l,...o],u=[];for(let e=0;e<d.length;e++)(e<=7||e>23&&e<=31||e>39&&e<=55||e>63&&e<=87||e>95&&e<=103)&&u.push(d[e]);if(64!==u.length)return Promise.reject(`In soonspacejs: sbm 资源模型(${this.sbmInfo.url} 数据错误!`);if(1===c){const e=i.buffer.slice(s,i.buffer.byteLength),t=new KL(e,u);return 1===h||2===h?this._parseV2(t,n):3===h?this._parseV3(t,n):Promise.reject(`In soonspacejs: sbm 资源模型(${this.sbmInfo.url})版本错误!`)}return Promise.reject(`In soonspacejs: sbm 资源模型(${this.sbmInfo.url})key 错误!`)}))}_parseV2(e,t){let n=0;const i=performance.now();n+=66;const s={total:0,loaded:0,timeStamp:0};if(!this.sbmInfo)return Promise.reject("In soonspacejs: sbm 模型资源解析时 'sbmInfo' 缺失!");const r=new LS(Object.assign(Object.assign({},this.sbmInfo),{format:"sbm"})),o=new MS({id:cg()});r.add(o);const a=e.getSoonUint16(n);n+=2;const l=e.getSoonUint16(n);n+=2,s.total=l;const c={};for(let t=0;t<a;++t){const t=e.getSoonUint16(n).toString();n+=2,c[t]={materialInfo:[]},n+=4,n+=4,n+=4,n+=4;const i=e.getSoonFloat32(n);n+=4;const s=e.getSoonFloat32(n);n+=4;const r=e.getSoonFloat32(n);n+=4;const o=e.getSoonFloat32(n);n+=4,n+=4,n+=4,n+=4,n+=4;let a=e.getSoonUint8(n);n+=1,0===a?a=0:1===a?a=1:2===a&&(a=2);const l=e.getSoonUint16(n);n+=2;let h=null;if(l>0){let i="",s="";for(let t=0;t<l;t++){const t=e.getSoonUint8(n);t>127?s=s+"%"+t.toString(16).toUpperCase():s.length>0?(i+=decodeURIComponent(s)+String.fromCharCode(t),s=""):i+=String.fromCharCode(t),n+=1}i=i.replace("\\","/");const{url:r,isPlatform:o}=this.sbmInfo,a=this.getTextureUrl(r,i,o);c[t].textureUrl=a,h=OL(a)}if(!this.materials.has(t)){const e=[i,s,r,o,a],n=YL(t,e,h,UL(c[t].textureUrl));this.materials.set(t,n),c[t].materialInfo=e}}const h={};for(let r=0;r<l;++r){const r=e.getSoonUint16(n);n+=2;const a=e.getSoonUint16(n).toString();n+=2,h[r]={materialId:a,position:new ArrayBuffer(0),uv:new ArrayBuffer(0)};const l=[],c=[],d=[],u=[],p=e.getSoonUint16(n);if(n+=2,p>0)for(let t=0;t<p;t++){const t=new ri;t.setX(e.getSoonFloat32(n)),n+=4,t.setY(e.getSoonFloat32(n)),n+=4,t.setZ(e.getSoonFloat32(n)),n+=4,l.push(t)}const m=e.getSoonUint16(n);if(n+=2,m>0)for(let t=0;t<m;t++){const t=new ri;t.setX(e.getSoonFloat32(n)),n+=4,t.setY(e.getSoonFloat32(n)),n+=4,t.setZ(e.getSoonFloat32(n)),n+=4}const f=e.getSoonUint16(n);if(n+=2,f>0)for(let t=0;t<f;t++){const t=new Gn;t.setX(e.getSoonFloat32(n)),n+=4,t.setY(e.getSoonFloat32(n)),n+=4,c.push(t)}const g=e.getSoonUint16(n);if(n+=2,g>0)for(let t=0;t<g;t++){const t=e.getSoonUint16(n);n+=2;const i=e.getSoonUint16(n);n+=2;const s=e.getSoonUint16(n);n+=2;const r=[t,i,s];d.push(r),c.length>0&&u.push([c[r[0]],c[r[1]],c[r[2]]])}const y=[],b=[];for(let e=0;e<d.length;e++){const t=d[e],n=l[t[0]],i=l[t[1]],s=l[t[2]];y.push(...n.toArray(),...i.toArray(),...s.toArray());let r=new Gn,o=new Gn,a=new Gn;const c=u[e];void 0!==c&&(r=c[0],o=c[1],a=c[2]),b.push(...r.toArray(),...o.toArray(),...a.toArray())}const v=new Float32Array(y),x=new Float32Array(b);h[r].position=v.buffer,h[r].uv=x.buffer;const w=new Hs;v.length>0&&w.setAttribute("position",new Ts(v,3)),x.length>0&&w.setAttribute("uv",new Ts(x,2)),w.computeVertexNormals(),Yy.generate(w).then((e=>{w.boundsTree=e}));const S=this.materials.get(a);if(S){const e=new xS(w,S,{id:`${r}_${cg()}`,name:r.toString()});o.add(e)}s.loaded++,s.timeStamp=performance.now()-i,null==t||t(s)}const d={materialsCache:c,meshsCache:h};return Promise.resolve({model:r,caches:d})}_parseV3(e,t){let n=0;n+=66;const i=performance.now(),s={total:0,loaded:0,timeStamp:0};if(!this.sbmInfo)return Promise.reject("In soonspacejs: sbm 模型资源解析时 'sbmInfo' 缺失!");const r=new LS(Object.assign(Object.assign({},this.sbmInfo),{format:"sbm"})),o=new MS({id:cg()});r.add(o);const a=e.getSoonUint16(n);n+=2;const l=e.getSoonUint16(n);n+=2,s.total=l;const c={};for(let t=0;t<a;++t){const t=e.getSoonUint16(n).toString();n+=2,c[t]={materialInfo:[]},n+=4,n+=4,n+=4,n+=4;const i=e.getSoonFloat32(n);n+=4;const s=e.getSoonFloat32(n);n+=4;const r=e.getSoonFloat32(n);n+=4;const o=e.getSoonFloat32(n);n+=4,n+=4,n+=4,n+=4,n+=4;let a=e.getSoonUint8(n);n+=1,0===a?a=0:1===a?a=1:2===a&&(a=2);const l=e.getSoonUint16(n);n+=2;let h=null;if(l>0){let i="",s="";for(let t=0;t<l;t++){const t=e.getSoonUint8(n);t>127?s=s+"%"+t.toString(16).toUpperCase():s.length>0?(i+=decodeURIComponent(s)+String.fromCharCode(t),s=""):i+=String.fromCharCode(t),n+=1}i=i.replace("\\","/");const{url:r,isPlatform:o}=this.sbmInfo,a=this.getTextureUrl(r,i,o);c[t].textureUrl=a,h=OL(a)}if(!this.materials.has(t)){const e=[i,s,r,o,a],n=YL(t,e,h,UL(c[t].textureUrl));this.materials.set(t,n),c[t].materialInfo=e}}const h={};for(let r=0;r<l;++r){const r=e.getSoonUint16(n).toString();n+=2;const a=e.getSoonUint16(n);n+=2;let l="";if(a>0){const t=[];for(let i=0;i<a;i++){const i=e.getSoonUint8(n);t.push(i),n+=1}const i=new Uint8Array(t);l=jL.decode(i)}const c=e.getSoonUint16(n).toString();n+=2,h[r]={meshName:l,materialId:c,position:new ArrayBuffer(0),uv:new ArrayBuffer(0)};const d=[],u=[],p=[],m=[],f=e.getSoonUint32(n);if(n+=4,f>0)for(let t=0;t<f;t++){const t=new ri;t.setX(e.getSoonFloat32(n)),n+=4,t.setY(e.getSoonFloat32(n)),n+=4,t.setZ(e.getSoonFloat32(n)),n+=4,d.push(t)}const g=e.getSoonUint32(n);if(n+=4,g>0)for(let t=0;t<g;t++){const t=new ri;t.setX(e.getSoonFloat32(n)),n+=4,t.setY(e.getSoonFloat32(n)),n+=4,t.setZ(e.getSoonFloat32(n)),n+=4}const y=e.getSoonUint32(n);if(n+=4,y>0)for(let t=0;t<y;t++){const t=new Gn;t.setX(e.getSoonFloat32(n)),n+=4,t.setY(e.getSoonFloat32(n)),n+=4,u.push(t)}const b=e.getSoonUint32(n);if(n+=4,b>0)for(let t=0;t<b;t++){const t=e.getSoonUint32(n);n+=4;const i=e.getSoonUint32(n);n+=4;const s=e.getSoonUint32(n);n+=4;const r=[t,i,s];p.push(r),u.length>0&&m.push([u[r[0]],u[r[1]],u[r[2]]])}const v=[],x=[];for(let e=0;e<p.length;e++){const t=p[e],n=d[t[0]],i=d[t[1]],s=d[t[2]];v.push(...n.toArray(),...i.toArray(),...s.toArray());let r=new Gn,o=new Gn,a=new Gn;const l=m[e];void 0!==l&&(r=l[0],o=l[1],a=l[2]),x.push(...r.toArray(),...o.toArray(),...a.toArray())}const w=new Float32Array(v),S=new Float32Array(x);h[r].position=w.buffer,h[r].uv=S.buffer;const M=new Hs;if(w.length>0&&M.setAttribute("position",new Ts(w,3)),S.length>0&&M.setAttribute("uv",new Ts(S,2)),M.computeVertexNormals(),Yy.generate(M).then((e=>{M.boundsTree=e})),this.materials.has(c)){const e=new xS(M,this.materials.get(c),{id:`${r}_${cg()}`,name:l});o.add(e)}s.loaded++,s.timeStamp=performance.now()-i,null==t||t(s)}const d={materialsCache:c,meshsCache:h};return Promise.resolve({model:r,caches:d})}getTextureUrl(e,t,n){let i="",s=t;const r=s.lastIndexOf("/");if(-1!==r&&(s=s.substring(r+1)),i=e,n){const e=i.split("/");e.length>1&&(e.splice(e.length-3,e.length),i=e.join("/")+"/Maps/"+s)}else{const e=i.lastIndexOf("/");-1!==e&&(i=i.substring(0,e+1)+"Maps/"+s)}return i}};class qL extends HS{constructor(e,t){super("Model",e,t),this.viewport=e,this.isDisposed=!1,this.modelsPromiseMap=new Map,this.modelsMap=new Map,this.store=ZL.createInstance({name:"soonspace",storeName:"modelData"}),this.cacheStore=ZL.createInstance({name:"soonspace",storeName:"modelCache"}),this.loadingManager=new pd,this.datLoader=new kL(this.cacheStore),this.gltfLoader=new EC(this.loadingManager),this.fbxLoader=new uC(this.loadingManager),this.dracoDecoderPath=null,this.gltfLoader.register((e=>new NL(e))),this._initLoadingManager(this.loadingManager)}setDracoDecoderPath(e){this.dracoDecoderPath=e;const t=new PL;t.setDecoderPath(e),this.gltfLoader.setDRACOLoader(t),this.datLoader.dracoDecoderPath=e}load(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:this.scene;return rf(this,void 0,void 0,(function*(){const{url:n}=e,i=this.modelsPromiseMap.get(n);if(i){if(yield i,this.isDisposed)return this.dispose(),null;const s=this.modelsMap.get(n);return s?this.clone(s,e,t):null}const s=this._innerLoad(e,t);return this.modelsPromiseMap.set(n,s),s}))}parse(e){return rf(this,void 0,void 0,(function*(){const{url:t,id:n}=e;if(!t)return Vm(`id: ${n} url: ${t} is empty`),null;switch(t.slice(t.lastIndexOf(".")+1).toLocaleUpperCase()){case"SBM":return this._parseSbm(e);case"SBMX":return this._parseSbmx(e);case"DAT":return this._parseDat(e);case"GLB":case"GLTF":return this._parseGltf(e);case"FBX":return this._parseFbx(e);default:return Vm(`模型资源( id: ${n}, url: ${t} )格式错误,当前格式支持 sbm、sbmx、fbx、gltf、glb !`),null}}))}clone(e,t,n){return new Promise(((i,s)=>{var r;"Model"!==e.stype&&s("In soonspacejs: 方法 cloneModel 参入对象类型错误!");const{id:o,name:a,level:l,visible:c,position:h,rotation:d,scale:u,onClick:p,onDblClick:m,onRightClick:f,onLoad:g,userData:y}=t;function b(e,t,n){n(e,t);for(let i=0;i<e.children.length;i++)b(e.children[i],t.children[i],n)}const v=function(e){const t=new Map,n=new Map,i=e.sClone();return b(e,i,(function(e,i){t.set(i,e),n.set(e,i)})),i.traverse((function(e){if(e instanceof Zl){const i=e,s=t.get(e),r=s.skeleton.bones;i.skeleton=s.skeleton.clone(),i.bindMatrix.copy(s.bindMatrix),i.skeleton.bones=r.map((function(e){return n.get(e)})),i.bind(i.skeleton,i.bindMatrix)}})),i}(e);v.animations=v.animations.map((e=>e.clone())),o&&(v.sid=o),a&&(v.name=a),l&&(v.level=l),!1===c&&v.hide(),h&&v.position.set(h.x,h.y,h.z),d&&v.rotation.set(d.x,d.y,d.z),u&&v.scale.set(u.x,u.y,u.z),v.onClick=p?p.bind(v):null,v.onDblClick=m?m.bind(v):null,v.onRightClick=f?f.bind(v):null,v.onLoad=g?g.bind(v):null,null===(r=v.onLoad)||void 0===r||r.call(v,v),y&&(v.userData=y),null!==n&&this.viewport.scener.addObject(v,n||this.scene||e.parent),i(v)}))}loadToGroup(e,t){return rf(this,void 0,void 0,(function*(){const n=this.createGroup(e,null);return yield Promise.allSettled(t.map((e=>this.load(e,null).then((e=>e&&n.add(e))).catch(console.error)))),this.viewport.scener.addObject(n,this.scene),n}))}addForGroup(e,t){return rf(this,void 0,void 0,(function*(){return e&&(yield Promise.allSettled(t.map((t=>rf(this,void 0,void 0,(function*(){return this.load(t,null).then((t=>t&&this.viewport.scener.addObject(t,e))).catch(console.error)})))))),e}))}clearIdb(){return rf(this,void 0,void 0,(function*(){yield this.store.clear(),yield this.cacheStore.clear()}))}dispose(){var e;this.isDisposed=!0,this.modelsPromiseMap.clear(),this.modelsMap.clear(),null===(e=this.gltfLoader.dracoLoader)||void 0===e||e.dispose(),this.datLoader.dispose()}_initLoadingManager(e){e.addHandler(/\.tga$/i,new IC)}_setModelsMap(e,t){this.modelsMap.has(e)||this.modelsMap.set(e,t)}_parseSbm(e){return rf(this,void 0,void 0,(function*(){const{useIndexedDB:t}=this.viewport.options,{url:n}=e,i=t=>rf(this,void 0,void 0,(function*(){const i=yield(new QL).parseBuffer(t,e),{model:s,caches:r}=i;return r&&ff((()=>{this.cacheStore.setItem(n,r)})),s})),s=e=>{var t;null===(t=e.onLoad)||void 0===t||t.call(e,e)};if(t){const t=yield this.cacheStore.getItem(n);if(t){const n=(new JL).parseObject(t,e);return s(n),n}{const e=(yield this.store.getItem(n))||(yield this._fetchBuffer(n)),t=yield i(e);return s(t),t}}{const e=yield this._fetchBuffer(n),t=yield i(e);return s(t),t}}))}_parseSbmx(e){return rf(this,void 0,void 0,(function*(){const{url:t}=e,n=yield this._getBuffer(t),i=lg(n,0,8),s=new DataView(n.slice(8));switch(i){case"SBMG----":for(let e=0;e<s.byteLength;e++){const t=s.getUint8(e),n=(t>>4&15)+(t<<4&240);s.setUint8(e,n)}return this._parseGltf(e,s.buffer);case"SBMD----":return this._parseDat(e,s.buffer);default:return this._parseGltf(e,s.buffer)}}))}_parseDat(e,t){return rf(this,void 0,void 0,(function*(){const{url:n}=e,i=t||(yield this._getBuffer(n)),s=new LS(Object.assign(Object.assign({},e),{format:"dat"})),r=yield this.datLoader.parseAsync(i,n);return r&&s.add(r),s}))}_parseGltf(e,t){return rf(this,void 0,void 0,(function*(){const{url:n}=e,i=qm(n),s=t||(yield this._getBuffer(n)),r=new LS(Object.assign(Object.assign({},e),{format:"gltf"})),o=yield this.gltfLoader.parseAsync(s,i),{animations:a}=o;return a&&a.length>0&&(r.animations=a),o.scene.traverse((e=>{"AmbientLight"!==e.type&&"DirectionalLight"!==e.type||(e.visible=!1),e.castShadow=!0,e.receiveShadow=!0,e instanceof or&&Yy.generate(e.geometry).then((t=>{e.geometry.boundsTree=t}))})),r.add(o.scene),r}))}_parseFbx(e){return rf(this,void 0,void 0,(function*(){const{url:t}=e,n=qm(t),i=yield this._getBuffer(t),s=new LS(Object.assign(Object.assign({},e),{format:"gltf"})),r=this.fbxLoader.parse(i,n),{animations:o}=r;return o&&o.length>0&&(s.animations=o),r.traverse((e=>{"AmbientLight"!==e.type&&"DirectionalLight"!==e.type||(e.visible=!1),e.castShadow=!0,e.receiveShadow=!0,e instanceof or&&Yy.generate(e.geometry).then((t=>{e.geometry.boundsTree=t}))})),s.add(r),s}))}_innerLoad(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:this.scene;var n;return rf(this,void 0,void 0,(function*(){const{url:i}=e,s=yield this.parse(e);return s?(null===(n=s.onLoad)||void 0===n||n.call(s,s),this._setModelsMap(i,s),null!==t&&this.viewport.scener.addObject(s,t),s):null}))}_fetchBuffer(e){return rf(this,void 0,void 0,(function*(){const{useIndexedDB:t}=this.viewport.options,n=yield mf(e),i=yield n.arrayBuffer();return t&&this.store.setItem(e,i),i}))}_getBuffer(e){return rf(this,void 0,void 0,(function*(){const{useIndexedDB:t}=this.viewport.options;if(t){const t=yield this.store.getItem(e);return t||this._fetchBuffer(e)}return this._fetchBuffer(e)}))}}class $L extends HS{constructor(e,t){super("Poi",e,t),this.materials=new Map}create(e){const t=this._createMaterial(e.url),n=new AS(t,e);return this.viewport.scener.addObject(n,this.scene),n}clone(e,t,n){"Poi"!==e.stype&&console.error("In soonspacejs: 方法 clonePoi 参入对象类型错误!");const{id:i,name:s,level:r,visible:o,position:a,rotation:l,scale:c,onClick:h,onDblClick:d,onRightClick:u,userData:p}=t,m=e.sClone(!1);return this._copyMaterial(m),i&&(m.sid=i),s&&(m.name=s),r&&(m.level=r),ng(o)&&(m.visible=o),a&&m.position.set(a.x,a.y,a.z),l&&m.rotation.set(l.x,l.y,l.z),c&&m.scale.set(c.x,c.y,c.z),m.onClick=h?h.bind(m):null,m.onDblClick=d?d.bind(m):null,m.onRightClick=u?u.bind(m):null,p&&(m.userData=p),null!==n&&this.viewport.scener.addObject(m,n||this.scene||e.parent),m}createToGroup(e,t){const n=this.createGroup(e,null);return t.forEach((e=>{const t=this._createMaterial(e.url),i=new AS(t,e);n.add(i)})),this.viewport.scener.addObject(n,this.scene),n}addForGroup(e,t){return e&&(t.forEach((t=>{const n=this._createMaterial(t.url),i=new AS(n,t);e.add(i)})),this.viewport.scener.addObject(e,this.scene)),e}_createMaterial(e){const t=this.materials.get(e);if(!t){const t=(new Md).load(e);t.flipY=!0;const n=new pl({map:t,color:16777215});return this.materials.set(e,n),n}return t}_copyMaterial(e){e.traverse((e=>{(e instanceof or||e instanceof Rl)&&(sg(e.material)?e.material=e.material.map((e=>e.clone())):e.material instanceof xs&&(e.material=e.material.clone()))}))}}class eR extends HS{constructor(e,t){super("PoiNode",e,t)}create(e){this._openEnableRenderCss(e);const t=new CS(e);return this.viewport.scener.addObject(t,this.scene),t}createToGroup(e,t){const n=this.createGroup(e,null);return t.forEach((e=>{this._openEnableRenderCss(e);const t=new CS(e);n.add(t)})),this.viewport.scener.addObject(n,this.scene),n}addForGroup(e,t){return e&&(t.forEach((t=>{this._openEnableRenderCss(t);const n=new CS(t);e.add(n)})),this.viewport.scener.addObject(e,this.scene)),e}_openEnableRenderCss(e){switch(e.type){case"2d":case"2D":this.viewport.rendererManager.setInternalState("enableRenderCss2D",!0);break;case"2.5d":case"2.5D":this.viewport.rendererManager.setInternalState("enableRenderCss2DHalf",!0);break;case"3d":case"3D":this.viewport.rendererManager.setInternalState("enableRenderCss3D",!0)}}}class tR extends HS{constructor(e,t){super("Canvas3D",e,t)}create(e){const t=new VS(e);return this.viewport.scener.addObject(t,this.scene),t}createToGroup(e,t){const n=this.createGroup(e,null);return t.forEach((e=>{const t=new VS(e);n.add(t)})),this.viewport.scener.addObject(n,this.scene),n}addForGroup(e,t){return e&&(t.forEach((t=>{const n=new VS(t);e.add(n)})),this.viewport.scener.addObject(e,this.scene)),e}}class nR{constructor(){this.graph=new Map,this.queue=null,this.previous=new Map}setGraph(e){if(!(e.length<1))for(const t of e){const[e,n]=t;this.graph.set(e,new Map);for(const t of n){const[n,i]=t,s=this.graph.get(e);null==s||s.set(n,i)}}}getPath(e,t){var n;if(e===t)return[];const i=this.queue=new jm;i.add(e,0),this.previous.set(e,null);let s=null;for(;s=i.shift();){if(s===t){const e=[];for(;null!==s&&null!==this.previous.get(s);)e.unshift(s),s=null!==(n=this.previous.get(s))&&void 0!==n?n:null;return e}const e=i.getDistance(s);if(e===1/0)return[];const r=this.graph.get(s);r&&r.forEach(((t,n)=>{const r=i.getDistance(n),o=e+t;o<r&&(i.update(n,o),this.previous.set(n,s))}))}return[]}}class iR extends HS{constructor(e,t){super("Topology",e,t),this.dijkstra=new nR}createFromGml(e){return rf(this,void 0,void 0,(function*(){const{url:t,linkWidth:n=20,linkColor:i=65280,renderNode:s=!0,nodeColor:r=255}=e;return yf(t).then((t=>{if(!t||!t.MultiLayeredGraph)return Promise.reject('In soonspace: createTopologyFromGml "url" path error!');const o=[],a=new Map;let l=[],c=[];const h=t.MultiLayeredGraph.SpaceLayerMember.SpaceLayer.X_floor;sg(h)?h.forEach((e=>{l=[...l,...e.state],c=[...c,...e.transition]})):(l=[...l,...h.state],c=[...c,...h.transition]),l.forEach(((e,t)=>{const n=e.State._attributes["gml:id"],i=e.State.topoNode["gml:Node"].node_name;o.push({id:tg(n)?n:"",name:tg(i)?i:"",position:{x:Number(e.State.topoNode["gml:Node"].xcoord["#text"]),y:Number(e.State.topoNode["gml:Node"].zcoord["#text"]),z:-1*Number(e.State.topoNode["gml:Node"].ycoord["#text"])},graphs:[]}),a.set(n,t)})),c.forEach((e=>{const t=e.Transition.topoEdge["gml:Edge"]["gml:directedNode"][0]._attributes["xlink:href"],n=e.Transition.topoEdge["gml:Edge"]["gml:directedNode"][1]._attributes["xlink:href"],i=e.Transition.topoEdge["gml:Edge"].restrict["#text"],s=e.Transition.topoEdge["gml:Edge"].passable["#text"],r=a.get(t),l=a.get(n),c=e.Transition._attributes["gml:id"],h=e.Transition.topoEdge["gml:Edge"].link_name["#text"];void 0!==r&&void 0!==l&&("2"!==s&&"3"!==s&&o[r].graphs.push({targetNodeId:n,linkInfo:{id:c,name:h},enable:!0,restrict:parseInt(i),passable:parseInt(s)}),"1"!==s&&"3"!==s&&o[l].graphs.push({targetNodeId:t,linkInfo:{id:c,name:h},enable:!0,restrict:parseInt(i),passable:parseInt(s)}))}));const d=new zS(Object.assign(Object.assign({},e),{type:"network",nodes:o,linkWidth:n,renderLink:!0,linkColor:i,renderNode:s,nodeColor:r}));return this.setDijkstraGraph(d.nodes),this.viewport.scener.addObject(d,this.scene),Promise.resolve(d)}))}))}create(e){const t=this.generateLineTopologyInfoNodeGraphs(e),n=new zS(t);return this.setDijkstraGraph(n.nodes),this.viewport.scener.addObject(n,this.scene),n}resetNodes(e,t){const n=this.generateLineTopologyInfoNodeGraphs(Object.assign(Object.assign({},e.info),{nodes:t}));return e.resetNodes(n.nodes),this.viewport.signals.objectChanged.dispatch(),e}createToGroup(e,t){const n=this.createGroup(e,null);return t.forEach((e=>{const t=this.generateLineTopologyInfoNodeGraphs(e),i=new zS(t);this.setDijkstraGraph(i.nodes),n.add(i)})),this.viewport.scener.addObject(n,this.scene),n}addForGroup(e,t){return e&&t.forEach((t=>{const n=this.generateLineTopologyInfoNodeGraphs(t),i=new zS(n);this.setDijkstraGraph(i.nodes),e.add(i)})),e}getShortestPath(e,t){const n=$m(e.info.nodes),i=Dm(t.start),s=Dm(t.end);let r=null,o=1/0,a=null,l=1/0;for(let t=0;t<n.length;t++){const c=n[t];if(0===c.graphs.length)continue;const h=e.nodes.find((e=>e.sid===c.id));if(!h)continue;const d=h.getWorldPosition(new ri),u=d.distanceTo(i),p=d.distanceTo(s);u<o&&(o=u,r=c),p<l&&(l=p,a=c)}if(!r||!a||r.id===a.id)return null;const c=r.id,h=a.id,d=this.dijkstra.getPath(c,h);if(0===d.length)return null;d.unshift(r.id);const u=[];for(let e=0;e<d.length;e++){const t=n.find((t=>t.id==d[e]));t&&(t.id+=cg(),t.position.y+=.01,u.push(t))}const p=Object.assign(Object.assign(Object.assign({},t),{type:"line",nodes:u}),e.getSpaceAttribute(!0));this.generateLineTopologyInfoNodeGraphs(p);const m=new zS(p);return this.viewport.scener.addObject(m,this.scene),m}getShortestPathByMultipleStartPoints(e,t){const{nodes:n}=e.info,i=[];t.start.forEach((e=>{const s=Dm(e),r=Dm(t.end);let o=null,a=1/0,l=null,c=1/0;if(n.forEach((e=>{if(e.graphs.length>0){const t=Dm(e.position),n=t.distanceTo(s),i=t.distanceTo(r);n<a&&(a=n,o=e.id),i<c&&(c=i,l=e.id)}})),o&&l){let e=0;const t=this.dijkstra.getPath(o,l);if(t.length>0){const o=[{id:"startPoint",position:s,graphs:[]}];t.forEach(((t,i)=>{const r=n.find((e=>e.id==t));r&&(e+=0===i?Dm(r.position).distanceTo(s):Dm(r.position).distanceTo(Dm(o[o.length-1].position)),o.push(r))})),o.push({id:"endPoint",position:r,graphs:[]}),e+=r.distanceTo(Dm(o[o.length-1].position)),i.push({nodeInfo:o,pathLength:e})}}}));let s=[],r=1/0;if(i.forEach((e=>{let{nodeInfo:t,pathLength:n}=e;n<r&&(r=n,s=t)})),s.length){for(let e=0;e<s.length;e++)s[e].position.y+=.01;const n=Object.assign(Object.assign({},t),{type:"line",nodes:s,position:e.getWorldPosition(new ri),rotation:(new Oi).setFromQuaternion(e.getWorldQuaternion(new si)),scale:e.getWorldScale(new ri)});this.generateLineTopologyInfoNodeGraphs(n);const i=new zS(n);return this.viewport.scener.addObject(i,this.scene),i}return null}getShortestPathByMultipleEndPoints(e,t){const{nodes:n}=e.info,i=[];t.end.forEach((e=>{const s=Dm(t.start),r=Dm(e);let o=null,a=1/0,l=null,c=1/0;if(n.forEach((e=>{if(e.graphs.length>0){const t=Dm(e.position),n=t.distanceTo(s),i=t.distanceTo(r);n<a&&(a=n,o=e.id),i<c&&(c=i,l=e.id)}})),o&&l){let e=0;const t=this.dijkstra.getPath(o,l);if(t.length>0){const o=[{id:"startPoint",position:s,graphs:[]}];t.forEach(((t,i)=>{const r=n.find((e=>e.id==t));r&&(e+=0===i?Dm(r.position).distanceTo(s):Dm(r.position).distanceTo(Dm(o[o.length-1].position)),o.push(r))})),o.push({id:"endPoint",position:r,graphs:[]}),e+=r.distanceTo(Dm(o[o.length-1].position)),i.push({nodeInfo:o,pathLength:e})}}}));let s=[],r=1/0;if(i.forEach((e=>{let{nodeInfo:t,pathLength:n}=e;n<r&&(r=n,s=t)})),s.length){for(let e=0;e<s.length;e++)s[e].position.y+=.01;const n=Object.assign(Object.assign({},t),{type:"line",nodes:s,position:e.getWorldPosition(new ri),rotation:(new Oi).setFromQuaternion(e.getWorldQuaternion(new si)),scale:e.getWorldScale(new ri)});this.generateLineTopologyInfoNodeGraphs(n);const i=new zS(n);return this.viewport.scener.addObject(i,this.scene),i}return null}setDijkstraGraph(e){const t=[];for(let n=0;n<e.length;n++){const i=e[n];if(0===i.graphs.length)continue;const s=[];for(let t=0;t<i.graphs.length;t++){const n=i.graphs[t],r=e.find((e=>e.sid===n.targetNodeId));if(!r)continue;const o=i.getWorldPosition(new ri),a=r.getWorldPosition(new ri);s.push([n.targetNodeId,o.distanceTo(a)])}t.push([i.sid,s])}t.length>0&&this.dijkstra.setGraph(t)}generateLineTopologyInfoNodeGraphs(e){const{type:t,nodes:n}=e;if("line"===t)for(let t=0;t<n.length;t++)if(t===n.length-1)n[t].graphs=[];else{const i=e.nodes[t],s=e.nodes[t+1];n[t].graphs=[{targetNodeId:s.id,linkInfo:{id:`${i.id}_to_${s.id}`,name:`${i.name||i.id}_to_${s.name||s.id}`},enable:!0,restrict:0,passable:0}]}return Object.assign(Object.assign({},e),{nodes:n})}}class sR extends tc{constructor(e,t){const n=new Hs;n.setAttribute("position",new Xs([1,1,0,-1,1,0,-1,-1,0,1,-1,0,1,1,0],3)),n.computeBoundingSphere();super(n,new jl({fog:!1})),this.light=e,this.color=t,this.type="RectAreaLightHelper";const i=new Hs;i.setAttribute("position",new Xs([1,1,0,-1,1,0,-1,-1,0,1,1,0,-1,-1,0,1,-1,0],3)),i.computeBoundingSphere(),this.add(new or(i,new ws({side:1,fog:!1})))}updateMatrixWorld(){if(this.scale.set(.5*this.light.width,.5*this.light.height,1),void 0!==this.color)this.material.color.set(this.color),this.children[0].material.color.set(this.color);else{this.material.color.copy(this.light.color).multiplyScalar(this.light.intensity);const e=this.material.color,t=Math.max(e.r,e.g,e.b);t>1&&e.multiplyScalar(1/t),this.children[0].material.color.copy(this.material.color)}this.matrixWorld.extractRotation(this.light.matrixWorld).scale(this.scale).copyPosition(this.light.matrixWorld),this.children[0].matrixWorld.copy(this.matrixWorld)}dispose(){this.geometry.dispose(),this.material.dispose(),this.children[0].geometry.dispose(),this.children[0].material.dispose()}}class rR extends HS{constructor(e,t){super("Helper",e,t)}addGridHelper(e){const{id:t,size:n=1e3,divisions:i=20,color:s="#fff",position:r={x:0,y:0,z:0},rotation:o={x:0,y:0,z:0},scale:a={x:1,y:1,z:1}}=e,l=new np(n,i,s,s);return l.position.set(r.x,r.y,r.z),l.rotation.set(o.x,o.y,o.z),l.scale.set(a.x,a.y,a.z),l.userData.sid=t,l.userData.stype="Helper",this.viewport.scener.addObject(l,this.scene),l}addAxesHelper(e){const{id:t,axesLength:n=1e3}=e,i=new xp(n);return i.userData.sid=t,i.userData.stype="Helper",this.viewport.scener.addObject(i,this.scene),i}addBoxHelper(e){const{id:t,box:n,color:i="#00ff00"}=e,s=new mp(n,new Fn(i));return s.userData.sid=t,s.userData.stype="Helper",this.viewport.scener.addObject(s,this.scene),s}addPlaneHelper(e){const{id:t,width:n=500,height:i=500,color:s="#00ff00",opacity:r=.2,position:o={x:0,y:0,z:0},rotation:a={x:0,y:0,z:0},scale:l={x:1,y:1,z:1}}=e,c=new xS(new Rr(n,i),new ws({color:s,opacity:r,transparent:r<1,side:2}),{id:t,position:o,rotation:a,scale:l});return c.userData.sid=t,c.userData.stype="Helper",this.viewport.scener.addObject(c,this.scene),c}addGroundHelper(e){const{imgUrl:t,id:n,width:i=500,height:s=500,opacity:r=1,position:o={x:0,y:0,z:0},rotation:a={x:0,y:0,z:0},scale:l={x:1,y:1,z:1},repeat:c={x:10,y:10}}=e,h=(new Md).load(t),d=new Rr(i,s);d.computeBoundingBox();const u=new kh({side:2,map:h,transparent:r<1,opacity:r,roughness:.8});u.map&&(u.map.repeat.set(c.x,c.x),u.map.wrapS=1e3,u.map.wrapT=1e3,u.map.version++),a.x-=Math.PI/2,u.version++;const p=new DS(d,u,{id:n,position:o,rotation:a,scale:l});return p.userData.sid=n,p.userData.stype="Helper",this.viewport.scener.addObject(p,this.scene),p}addDirectionalLightHelper(e){const{id:t,light:n,color:i,size:s=50}=e,r=new ap(n,s,i);return r.userData.sid=t,r.userData.stype="Helper",this.viewport.scener.addObject(r,this.scene),r}addHemisphereLightHelper(e){const{id:t,light:n,color:i,size:s=20}=e,r=new tp(n,s,i);return r.userData.sid=t,r.userData.stype="Helper",this.viewport.scener.addObject(r,this.scene),r}addSpotLightHelper(e){const{id:t,light:n,color:i}=e,s=new Uu(n,i);return s.userData.sid=t,s.userData.stype="Helper",this.viewport.scener.addObject(s,this.scene),s}addPointLightHelper(e){const{id:t,light:n,color:i,size:s=20}=e,r=new Qu(n,s,i);return r.userData.sid=t,r.userData.stype="Helper",this.viewport.scener.addObject(r,this.scene),r}addRectAreaLightHelper(e){const{id:t,light:n,color:i}=e,s=new sR(n,i);return s.userData.sid=t,s.userData.stype="Helper",this.viewport.scener.addObject(s,this.scene),s}}class oR extends HS{constructor(e,t){super("PluginObject",e,t)}createObject(e,t){const n=new TS(e);return t&&n.add(t),this.viewport.scener.addObject(n,this.scene),n}addToObject(e,t){return e?(this.viewport.scener.addObject(t,e),e):null}}class aR extends HS{constructor(e,t){super("Group",e,t)}}class lR{constructor(e){this.viewport=e,this.cache={objects:new Map},this.scene=e.scene,this.store={groupManager:new aR(e,this.scene),lightManager:new kS(e,this.scene),modelManager:new qL(e,this.scene),poiManager:new $L(e,this.scene),poiNodeManager:new eR(e,this.scene),canvas3DManager:new tR(e,this.scene),topologyManager:new iR(e,this.scene),helperManager:new rR(e,this.scene),pluginObjectManager:new oR(e,this.scene)},e.postUpdate.set("ManagerRender",this.update.bind(this)),e.signals.objectAdded.add(this.setObjectCache.bind(this)),e.signals.objectRemoved.add(this.deleteObjectCache.bind(this))}levelUpdate(){const e=(e,t)=>{e.visible!==t&&(e instanceof CS&&e._setElementDisplay(t),e.visible=t,e.matrixAutoUpdate=t,e.autoUpdate=!0)},t=t=>{const{level:n,handleHide:i,autoUpdate:s}=t,{max:r=null,min:o=null}=n;if(s)t.autoUpdate=!1,this.viewport.signals.objectChanged.dispatch();else if(Km(t)){if(!i&&(r||o)){const n=this.viewport.camera.position.distanceTo(t.position);e(t,!(r&&n>r)&&!(o&&n<o))}}else e(t,!1)};this.scene.traverse((e=>{(e instanceof SS||e instanceof xS)&&t(e)}))}poiNodeUpdate(){this.scene.traverse((e=>{e instanceof CS&&(e=>{const t=Km(e);e._setElementDisplay(t),e.visible=t,e.matrixAutoUpdate=t,e.autoUpdate=!0})(e)}))}update(){if(0===this.scene.children.length)return;const e=performance.now();this.viewport.options.levelEnabled?this.levelUpdate():this.poiNodeUpdate(),this.viewport.signals.loadRendered.dispatch(performance.now()-e)}isObjectInScene(e){let t=!1;return e.traverseAncestors((e=>{e===this.scene&&(t=!0)})),t}getObjectById(e){const t=this.getObjectCache(e);if(t){if(this.isObjectInScene(t))return t}return null}getObjectByName(e){return this._getObjectByProps("name",e)}getObjectByUserDataProperty(e,t){const n=[];return this.cache.objects.forEach((i=>{this.isObjectInScene(i)&&rg(i)&&(i instanceof SS||i instanceof xS||i.userData.stype)&&(og(e)&&e(i.userData)||tg(e)&&i.userData[e]===t)&&n.push(i)})),n}removeObjectById(e){const t=this.getObjectById(e);return!!t&&(this.viewport.scener.removeObject(t),!0)}_getObjectByProps(e,t){const n=[];return this.cache.objects.forEach((i=>{this.isObjectInScene(i)&&((i instanceof SS||i instanceof xS)&&rg(i)&&i[e]===t||rg(i)&&i.userData.stype&&("name"===e&&i.name===t||"sid"===e&&i.userData.sid===t))&&n.push(i)})),n}getObjectCache(e){return this.cache.objects.get(e)}setObjectCache(e){const t=(e,t)=>{const n=this.cache.objects.get(t);n&&n!==e&&Vm(`object id ${t} already exists in scene`)};null==e||e.traverse((n=>{if(n instanceof SS||n instanceof xS){if("string"==typeof n.sid&&n.sid.startsWith("[soonspacejs]: "))return;t(n,n.sid),this.cache.objects.set(n.sid,n)}else n.userData.sid&&e.userData.stype&&(t(n,n.userData.sid),this.cache.objects.set(n.userData.sid,n))}))}deleteObjectCache(e){null==e||e.traverse((t=>{t instanceof SS||t instanceof xS?this.cache.objects.delete(t.sid):t.userData.sid&&e.userData.stype&&this.cache.objects.delete(t.userData.sid)}))}clearObject(){this.store.modelManager.clear(),this.store.poiManager.clear(),this.store.poiNodeManager.clear(),this.store.canvas3DManager.clear(),this.store.topologyManager.clear(),this.store.helperManager.clear(),this.store.pluginObjectManager.clear()}clear(){this.clearObject(),this.store.lightManager.clear()}dispose(){this.store.modelManager.dispose(),this.cache.objects.clear(),this.clear()}}function cR(e){const t=hR(e),n=new Wi;n.setFromMatrix3(t);const i=e[0],s=n.clone();s.setPosition(i);const r=s.clone().invert(),o=e.map((e=>{const t=e.clone().applyMatrix4(r);return new Gn(t.x,t.y)})),a=new Qc(o),l=new Eh(a),c=new Du;c.setFromPoints(o);const h=dR(c);return l.getAttribute("uv").applyMatrix3(h),l.applyMatrix4(n),{geometry:l,polygonBox:c,modelMatrix:n,planeMatrix:s,projectionMatrix:r,position:i}}function hR(e){const[t,n,i]=e,s=new wr;s.setFromCoplanarPoints(n,t,i);const r=s.normal,o=r.clone().cross(new ri(0,0,1));o.equals(new ri)&&o.set(1,0,0);const a=r.clone().cross(o);o.normalize(),a.normalize(),r.normalize();const l=new An;return l.elements=[o.x,o.y,o.z,a.x,a.y,a.z,r.x,r.y,r.z],l}function dR(e){const t=e.min,n=e.getSize(new Gn),i=new An;return i.elements=[n.x,0,0,0,n.y,0,t.x,t.y,1],i.invert()}function uR(e,t){const n=pR(t);return e.intersectsBox(n)}function pR(e){const t=new li,n=t.min.clone(),i=t.max.clone();if(t.setFromObject(e),t.min.equals(n)&&t.max.equals(i)){const n=new ri;e.getWorldPosition(n),t.min.copy(n),t.max.copy(n)}if(e.isInstancedMesh){const{count:n,matrixWorld:i,geometry:s}=e;let r=s.boundingBox;if(r||(s.computeBoundingBox(),r=s.boundingBox),r){const s=i.clone();for(let i=0;i<n;i++){const n=new Wi;e.getMatrixAt(i,n),n.premultiply(s);const o=r.clone();o.applyMatrix4(s),t.union(o)}}}return t}function mR(e,t,n){if("string"==typeof e){let i=t?null==n?void 0:n.get(e):null;if(!i){i=(new Md).load(e),null==n||n.set(e,i)}return i}return e instanceof HTMLImageElement?new Jn(e):e instanceof HTMLCanvasElement?new gc(e):new pc(e)}function fR(e,t,n,i){const s=e.map,r=mR(t,n,i);if(!s)return e.map=s,s;const o=r.source;return r.copy(s),r.source=o,e.map=r,r}function gR(e,t){const{top:n,left:i,bottom:s,right:r,front:o,back:a}=e,l=new ri(r,n,o),c=new ri(i,s,a),h=new li;return function(e){return h.max.addVectors(e,l),h.min.subVectors(e,c),t.filter((e=>uR(h,e)))}}function yR(e,t){const n=new Ri(new ri,e);return function(e){return n.center.copy(e),t.filter((e=>uR(n,e)))}}function bR(e,t){const n=e.length-1,i=[];for(let t=0;t<n;t++){const n=e[t],s=e[t+1],r=new ku(n,s);i.push(r)}const s=new Ri(new ri,t);return function(e){return e.filter((e=>{const t=pR(e),n=new ri;t.getCenter(n);const r=i.filter((e=>{const t=e.closestPointToPointParameter(n);return 0<=t||t>=1}));if(0===r.length)return!1;let o=1/0,a=n;for(const e of r){const t=e.closestPointToPoint(n,!0,new ri),i=n.distanceToSquared(t);i<o&&(o=i,a=t)}return s.center.copy(a),s.intersectsBox(t)}))}}function vR(e,t){const{image:n,color:i,width:s,height:r,position:o,rotation:a,needLight:l,id:c,name:h,userData:d,level:u,visible:p,cache:m}=e,f=sf(e,["image","color","width","height","position","rotation","needLight","id","name","userData","level","visible","cache"]),g=new Rr(s,r),y=n?Object.assign(Object.assign({transparent:!0},f),{map:mR(n,null==m||m,t)}):f,b=l?new Uh(y):new ws(y),v=new xS(g,b,{id:c,name:h,userData:d,level:u,visible:p});return o&&v.position.copy(o),a&&v.rotation.copy(a),v}function xR(e,t){const{points:n,image:i,color:s,needLight:r,id:o,name:a,userData:l,level:c,visible:h,cache:d}=e,u=sf(e,["points","image","color","needLight","id","name","userData","level","visible","cache"]),p=n.map((e=>new ri(e.x,e.y,e.z))),m=i?Object.assign(Object.assign({transparent:!0},u),{map:mR(i,null==d||d,t)}):u,f=r?new Uh(m):new ws(m),{geometry:g,position:y}=cR(p),b=new xS(g,f,{id:o,name:a,userData:l,level:c,visible:h});return b.position.copy(y),b}class wR{constructor(e){this.THREE=Vp,this.TWEEN=Zm,this.utils=hg,this.THREE_PLUGINS={TransformControls:jp,Reflector:bm,mergeBufferGeometries:vm},this.version=t,this.animation=ug,this.library=BS,this.plugins={},this.textureCache=new Map;const{el:n,options:i={},events:s={}}=e;if(this.domElement=document.querySelector(n),this.options=Object.assign(Object.assign({},{showInfo:!1,showStats:!1,showViewHelper:!1,showGrid:!1,background:{color:11459572,alpha:!1},fog:!1,controls:{type:"free"},hoverEnabled:!1,levelEnabled:!1,closeInfoLog:!1,closeWarnLog:!1,useIndexedDB:!0,logarithmicDepthBuffer:!0}),i),this.viewport=new vS(this.options),this.signals=this.viewport.signals,this.manager=new lR(this.viewport),!this.domElement)throw new Error(`In SoonSpace: Can't find element by "${n}"!`);this.domElement.appendChild(this.viewport.container),this._init(),this._initEvents(s),this._initDefaultSettings()}_init(){const{showGrid:t,background:n,fog:i,controls:s,closeInfoLog:r,closeWarnLog:o,useIndexedDB:a}=this.options;if(!r){Nm(" ____ ____ _ \n / ___| ___ ___ _ __ / ___| _ __ __ _ ___ ___ (_)___ \n \\___ \\ / _ \\ / _ \\| '_ \\\\___ \\| '_ \\ / _` |/ __/ _ \\ | / __| \n ___) | (_) | (_) | | | |___) | |_) | (_| | (_| __/_ | \\__ \\ \n |____/ \\___/ \\___/|_| |_|____/| .__/ \\__,_|\\___\\___(_)/ |___/ \n |_| |__/ \n",{color:"#3eaf7c"}),Nm(e,{color:"#3eaf7c","font-size":"24px"}),Nm(`当前版本: ${this.version}`,{color:"#3eaf7c","font-size":"12px"}),Nm("文档: http://www.xwbuilders.com:8800",{color:"#3eaf7c","font-size":"12px"}),Nm("样例: http://www.xwbuilders.com:8800/examples",{color:"#3eaf7c","font-size":"12px"}),Nm("GitHub: https://github.com/soonspacejs",{color:"#3eaf7c","font-size":"12px"})}t&&this.addGridHelper(!0===t?{id:"defaultGridHelper"}:t),(null==n?void 0:n.skyBox)?tg(null==n?void 0:n.skyBox)?this.setSphereSkyBackground(null==n?void 0:n.skyBox):rg(null==n?void 0:n.skyBox)&&this.setSkyBackground(n.skyBox.dirPath,n.skyBox.fileNames):(null==n?void 0:n.img)?this.setBackgroundImage(n.img):(null==n?void 0:n.color)&&this.setBackgroundColor(n.color),i&&this.openSceneFog(!0===i?void 0:i),s&&this.setControlsOptions(s),o&&(window.console.warn=function(){}),a&&!window.indexedDB&&(this.options.useIndexedDB=!1,window.console.warn("Your browser doesn't support a stable version of IndexedDB. Such and such feature will not be available."))}_initEvents(e){const{modelHover:t,modelUnHover:n,modelClick:i,modelRightClick:s,modelDblClick:r,poiHover:o,poiUnHover:a,poiClick:l,poiRightClick:c,poiDblClick:h,selectPosition:d,sceneClick:u,resize:p}=e;t&&this.signals.modelHover.add(t),n&&this.signals.modelUnHover.add(n),i&&this.signals.modelClick.add(i),s&&this.signals.modelRightClick.add(s),r&&this.signals.modelDblClick.add(r),o&&this.signals.poiHover.add(o),a&&this.signals.poiUnHover.add(a),l&&this.signals.poiClick.add(l),c&&this.signals.poiRightClick.add(c),h&&this.signals.poiDblClick.add(h),d&&this.signals.selectPosition.add(d),u&&this.signals.sceneClick.add(u),p&&this.signals.windowResize.add(p),this.signals.windowResize.dispatch(),window.addEventListener("resize",(()=>this.signals.windowResize.dispatch()),!1)}_initDefaultSettings(){this.setEnvironment(),this.setColorSpace("sRGB"),this.setToneMapping({type:"ACESFilmic",exposure:.8})}registerPlugin(e,t){const n=new e(this);return this.plugins[t]=n,n}getPlugin(e){return this.plugins[e]?this.plugins[e]:null}createPluginObject(e,t){return this.manager.store.pluginObjectManager.createObject(e,t)}addToPluginObject(e,t){const n=this.getObjectById(e);return this.manager.store.pluginObjectManager.addToObject(n,t)}getPluginObjectById(e){return Vm("getPluginObjectById is deprecated, use getObjectById instead"),this.getObjectById(e)}getPluginObjectByName(e){return Vm("getPluginObjectByName is deprecated, use getObjectByName instead"),this.getObjectByName(e)}removePluginObjectById(e){return Vm("removePluginObjectById is deprecated, use removeObjectById instead"),this.removeObjectById(e)}setSSR(e){this.viewport.setSSR(e)}setBloom(e){this.viewport.setBloom(e)}setSSAO(e){this.viewport.setSSAO(e)}setColorSpace(e){this.viewport.setColorSpace(e)}setToneMapping(e){this.viewport.setToneMapping(e)}setHoverEnabled(e){this.viewport.setHoverEnabled(e)}setBackgroundColor(e){this.viewport.setBackgroundColor(e)}setBackgroundImage(e){this.viewport.setBackgroundImage(e)}setSphereSkyBackground(e){this.viewport.setSphereSkyBackground(e)}setSkyBackground(e,t){this.viewport.setSkyBackground(e,t)}setEnvironment(){return this.viewport.setEnvironment()}playModelAnimation(e,t){return this.viewport.playModelAnimation(e,t)}stopModelAnimation(e,t){this.viewport.stopModelAnimation(e,t)}getOffsetByPosition(e){return this.viewport.getOffsetByPosition(e)}getPositionByOffset(e,t){return this.viewport.getPositionByOffset(e,t)}render(e){return this.viewport.render(e)}clearSignals(){this.viewport.clearSignals()}dispose(){this.manager.dispose(),this.viewport.dispose()}getCameraViewpoint(){return this.viewport.cameraManager.getCameraViewpoint()}setCameraViewpoint(e){this.viewport.cameraManager.setCameraViewpoint(e)}getCameraTargetView(){return this.viewport.cameraManager.getCameraViewpoint()}setCameraTargetView(e){this.viewport.cameraManager.setCameraViewpoint(e)}flyTo(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"frontTop",n=arguments.length>2?arguments[2]:void 0;return"orbit"===this.viewport.controls.options.type&&this.utils.warn("flyTo 方法不适用于 orbit 控制器"),this.viewport.cameraManager.flyTo(e,t,n)}flyToBoundingBox(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"frontTop",n=arguments.length>2?arguments[2]:void 0;return this.viewport.cameraManager.flyToBoundingBox(e,t,n)}flyToObj(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"frontTop",n=arguments.length>2?arguments[2]:void 0;return this.viewport.cameraManager.flyToObj(e,t,n)}flyMainViewpoint(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"frontTop",t=arguments.length>1?arguments[1]:void 0;return this.flyToObj(this.manager.scene,e,t)}surroundOnTarget(e,t){return this.viewport.cameraManager.surroundOnTarget(e,t)}surroundOnObject(e,t){return this.viewport.cameraManager.surroundOnObject(e,t)}getObjectLabelPos(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"frontTop",n=arguments.length>2?arguments[2]:void 0;return this.viewport.cameraManager.getObjectLabelPos(e,t,n)}setControlsOptions(e){return this.viewport.controls.setOptions(e)}addObject(e,t){this.viewport.scener.addObject(e,t)}removeObject(e){this.viewport.scener.removeObject(e)}openSceneFog(e){this.viewport.scener.openSceneFog(e)}closeSceneFog(){this.viewport.scener.closeSceneFog()}setSky(e){return this.viewport.setSky(e)}getScreenshot(){return this.screenshot()}screenshot(){return this.viewport.screenshot()}edgeShow(e,t){return this.viewport.scener.edgeShow(e,t)}unEdgeShow(e){return this.viewport.scener.unEdgeShow(e)}strokeShow(e,t){return this.viewport.scener.strokeShow(e,t)}unStrokeShow(e){return this.viewport.scener.unStrokeShow(e)}opacityShow(e,t){return this.viewport.scener.opacityShow(e,t)}unOpacityShow(e){return this.viewport.scener.unOpacityShow(e)}highlightShow(e,t){return this.viewport.scener.highlightShow(e,t)}unHighlightShow(e){return this.viewport.scener.unHighlightShow(e)}emissiveShow(e,t){return this.viewport.scener.emissiveShow(e,t)}unEmissiveShow(e){return this.viewport.scener.unEmissiveShow(e)}clearObject(){this.manager.clearObject()}clear(){this.manager.clear()}createAmbientLight(e){return this.manager.store.lightManager.createAmbientLight(e)}setAmbientLight(e){const t=this.getObjectById(e.id);return this.manager.store.lightManager.setAmbientLight(t,e)}createDirectionalLight(e){return this.manager.store.lightManager.createDirectionalLight(e)}setDirectionalLight(e){const t=this.getObjectById(e.id);return this.manager.store.lightManager.setDirectionalLight(t,e)}createHemisphereLight(e){return this.manager.store.lightManager.createHemisphereLight(e)}setHemisphereLight(e){const t=this.getObjectById(e.id);return this.manager.store.lightManager.setHemisphereLight(t,e)}createSpotLight(e){return this.manager.store.lightManager.createSpotLight(e)}setSpotLight(e){const t=this.getObjectById(e.id);return this.manager.store.lightManager.setSpotLight(t,e)}createPointLight(e){return this.manager.store.lightManager.createPointLight(e)}setPointLight(e){const t=this.getObjectById(e.id);return this.manager.store.lightManager.setPointLight(t,e)}createRectAreaLight(e){return this.manager.store.lightManager.createRectAreaLight(e)}setRectAreaLight(e){const t=this.getObjectById(e.id);return this.manager.store.lightManager.setRectAreaLight(t,e)}getLightById(e){return Vm("getLightById is deprecated, use getObjectById instead"),this.getObjectById(e)}removeLightById(e){return Vm("removeLightById is deprecated, use removeObjectById instead"),this.removeObjectById(e)}getAllLight(){return this.manager.store.lightManager.getAll()}clearLight(){return this.manager.store.lightManager.clear()}showAllLight(){return this.manager.store.lightManager.showAll()}hideAllLight(){return this.manager.store.lightManager.hideAll()}updateAllShadow(){return this.manager.store.lightManager.updateAllShadow()}getObjectById(e){return this.manager.getObjectById(e)}getObjectByName(e){return this.manager.getObjectByName(e)}getObjectByUserDataProperty(e,t){return this.manager.getObjectByUserDataProperty(e,t)}removeObjectById(e){return this.manager.removeObjectById(e)}createGroup(e){return this.manager.store.groupManager.createGroup(e)}getGroupById(e){return Vm("getGroupById is deprecated, use getObjectById instead"),this.getObjectById(e)}getGroupByName(e){return Vm("getGroupByName is deprecated, use getObjectByName instead"),this.getObjectByName(e)}getAllGroup(){return this.manager.store.groupManager.getAll()}showAllGroup(){return this.manager.store.groupManager.showAll()}hideAllGroup(){return this.manager.store.groupManager.hideAll()}removeGroupById(e){return Vm("removeGroupById is deprecated, use removeObjectById instead"),this.removeObjectById(e)}loadSbm(e){return Vm("loadSbm is deprecated, use loadModel instead"),this.loadModel(e)}parseSbm(){Vm("parseSbm is deprecated!")}cloneSbm(e,t,n){return Vm("cloneSbm is deprecated, use cloneModel instead"),this.cloneModel(e,t,n)}getSbmById(e){return Vm("getSbmById is deprecated, use getObjectById instead"),this.getObjectById(e)}getSbmByName(e){return Vm("getSbmByName is deprecated, use getObjectByName instead"),this.getObjectByName(e)}getSbmByUserDataProperty(e,t){return Vm("getSbmByUserDataProperty is deprecated, use getObjectByUserDataProperty instead"),this.getObjectByUserDataProperty(e,t)}removeSbmById(e){return Vm("removeSbmById is deprecated, use removeObjectById instead"),this.removeObjectById(e)}createGroupForSbm(e){return Vm("createGroupForSbm is deprecated, use createGroup instead"),this.createGroup(e)}loadSbmToGroup(e,t){return Vm("loadSbmToGroup is deprecated, use loadModelToGroup instead"),this.loadModelToGroup(e,t)}addSbmForGroup(e,t){return Vm("addSbmForGroup is deprecated, use addModelForGroup instead"),this.addModelForGroup(e,t)}createSbmGroupFromXml(){Vm("createGroupForSbm is deprecated!")}getSbmGroupById(e){return Vm("getSbmGroupById is deprecated, use getObjectById instead"),this.getObjectById(e)}getSbmGroupByName(e){return Vm("getSbmGroupByName is deprecated, use getObjectByName instead"),this.getObjectByName(e)}getAllSbmGroup(){return Vm("getAllSbmGroup is deprecated, use getAllGroup instead"),this.getAllGroup()}removeSbmGroupById(e){return Vm("removeSbmGroupById is deprecated, use removeObjectById instead"),this.removeObjectById(e)}clearSbm(){return Vm("clearSbm is deprecated, use clearModel instead"),this.clearModel()}getAllSbm(){return Vm("getAllSbm is deprecated, use getAllModel instead"),this.getAllModel()}showAllSbm(){return Vm("showAllSbm is deprecated, use showAllModel instead"),this.showAllModel()}hideAllSbm(){return Vm("hideAllSbm is deprecated, use hideAllModel instead"),this.hideAllModel()}getSbmModelMaps(){return Vm("getSbmModelMaps is deprecated, use getModelsMap instead"),this.getModelsMap()}setSbmModelMaps(e){return Vm("setSbmModelMaps is deprecated, use setModelsMap instead"),this.setModelsMap(e)}setModelDracoDecoderPath(e){return this.manager.store.modelManager.setDracoDecoderPath(e)}loadModel(e){return this.manager.store.modelManager.load(e)}cloneModel(e,t,n){return this.manager.store.modelManager.clone(e,t,n)}getModelById(e){return Vm("getModelById is deprecated, use getObjectById instead"),this.getObjectById(e)}getModelByName(e){return Vm("getModelByName is deprecated, use getObjectByName instead"),this.getObjectByName(e)}getModelByUserDataProperty(e,t){return Vm("getModelByUserDataProperty is deprecated, use getObjectByUserDataProperty instead"),this.getObjectByUserDataProperty(e,t)}removeModelById(e){return Vm("removeModelById is deprecated, use removeObjectById instead"),this.removeObjectById(e)}createGroupForModel(e){return Vm("createGroupForModel is deprecated, use createGroup instead"),this.createGroup(e)}loadModelToGroup(e,t){return this.manager.store.modelManager.loadToGroup(e,t)}addModelForGroup(e,t){const n=this.getObjectById(e);return this.manager.store.modelManager.addForGroup(n,t)}getModelGroupById(e){return Vm("getModelGroupById is deprecated, use getObjectById instead"),this.getObjectById(e)}getModelGroupByName(e){return Vm("getModelGroupByName is deprecated, use getObjectByName instead"),this.getObjectByName(e)}getAllModelGroup(){return Vm("getAllModelGroup is deprecated, use getAllGroup instead"),this.getAllGroup()}removeModelGroupById(e){return Vm("removeModelGroupById is deprecated, use removeObjectById instead"),this.removeObjectById(e)}clearModel(){return this.manager.store.modelManager.clear()}getAllModel(){return this.manager.store.modelManager.getAll()}showAllModel(){return this.manager.store.modelManager.showAll()}hideAllModel(){return this.manager.store.modelManager.hideAll()}clearIdb(){return this.manager.store.modelManager.clearIdb()}getModelsMap(){return this.manager.store.modelManager.modelsMap}setModelsMap(e){this.manager.store.modelManager.modelsMap=e}createPoi(e){return this.manager.store.poiManager.create(e)}clonePoi(e,t,n){return this.manager.store.poiManager.clone(e,t,n)}getPoiById(e){return Vm("getPoiById is deprecated, use getObjectById instead"),this.getObjectById(e)}getPoiByName(e){return Vm("getPoiByName is deprecated, use getObjectByName instead"),this.getObjectByName(e)}getPoiByUserDataProperty(e,t){return Vm("getPoiByUserDataProperty is deprecated, use getObjectByUserDataProperty instead"),this.getObjectByUserDataProperty(e,t)}removePoiById(e){return Vm("removePoiById is deprecated, use removeObjectById instead"),this.removeObjectById(e)}createGroupForPoi(e){return Vm("createGroupForPoi is deprecated, use createGroup instead"),this.createGroup(e)}createPoiToGroup(e,t){return this.manager.store.poiManager.createToGroup(e,t)}addPoiForGroup(e,t){const n=this.getObjectById(e);return this.manager.store.poiManager.addForGroup(n,t)}getPoiGroupById(e){return Vm("getPoiGroupById is deprecated, use getObjectById instead"),this.getObjectById(e)}getPoiGroupByName(e){return Vm("getPoiGroupByName is deprecated, use getObjectByName instead"),this.getObjectByName(e)}getAllPoiGroup(){return Vm("getAllPoiGroup is deprecated, use getAllGroup instead"),this.getAllGroup()}removePoiGroupById(e){return Vm("removePoiGroupById is deprecated, use removeObjectById instead"),this.removeObjectById(e)}clearPoi(){return this.manager.store.poiManager.clear()}getAllPoi(){return this.manager.store.poiManager.getAll()}showAllPoi(){return this.manager.store.poiManager.showAll()}hideAllPoi(){return this.manager.store.poiManager.hideAll()}createPoiNode(e){return this.manager.store.poiNodeManager.create(e)}getPoiNodeById(e){return Vm("getPoiNodeById is deprecated, use getObjectById instead"),this.getObjectById(e)}getPoiNodeByName(e){return Vm("getPoiNodeByName is deprecated, use getObjectByName instead"),this.getObjectByName(e)}getPoiNodeByUserDataProperty(e,t){return Vm("getPoiNodeByUserDataProperty is deprecated, use getObjectByUserDataProperty instead"),this.getObjectByUserDataProperty(e,t)}removePoiNodeById(e){return Vm("removePoiNodeById is deprecated, use removeObjectById instead"),this.removeObjectById(e)}createGroupForPoiNode(e){return Vm("createGroupForPoiNode is deprecated, use createGroup instead"),this.createGroup(e)}createPoiNodeToGroup(e,t){return this.manager.store.poiNodeManager.createToGroup(e,t)}addPoiNodeForGroup(e,t){const n=this.getObjectById(e);return this.manager.store.poiNodeManager.addForGroup(n,t)}getPoiNodeGroupById(e){return Vm("getPoiNodeGroupById is deprecated, use getObjectById instead"),this.getObjectById(e)}getPoiNodeGroupByName(e){return Vm("getPoiNodeGroupByName is deprecated, use getObjectByName instead"),this.getObjectByName(e)}getAllPoiNodeGroup(){return Vm("getAllPoiNodeGroup is deprecated, use getAllGroup instead"),this.getAllGroup()}removePoiNodeGroupById(e){return Vm("removePoiNodeGroupById is deprecated, use removeObjectById instead"),this.removeObjectById(e)}clearPoiNode(){return this.manager.store.poiNodeManager.clear()}getAllPoiNode(){return this.manager.store.poiNodeManager.getAll()}showAllPoiNode(){return this.manager.store.poiNodeManager.showAll()}hideAllPoiNode(){return this.manager.store.poiNodeManager.hideAll()}createPoiMesh(e){const t=vR(e,this.textureCache);return this.addObject(t),t}createPolygonPoiMesh(e){const t=xR(e,this.textureCache);return this.addObject(t),t}setTexture(e,t,n){const{cache:i=!0,independ:s}=n||{};let r=e.material;s&&(r=r.clone(),e.material=r);return fR(r,t,i,this.textureCache)}createCanvas3D(e){return this.manager.store.canvas3DManager.create(e)}getCanvas3DById(e){return Vm("getCanvas3DById is deprecated, use getObjectById instead"),this.getObjectById(e)}getCanvas3DByName(e){return Vm("getCanvas3DByName is deprecated, use getObjectByName instead"),this.getObjectByName(e)}getCanvas3DByUserDataProperty(e,t){return Vm("getCanvas3DByUserDataProperty is deprecated, use getObjectByUserDataProperty instead"),this.getObjectByUserDataProperty(e,t)}removeCanvas3DById(e){return Vm("removeCanvas3DById is deprecated, use removeObjectById instead"),this.removeObjectById(e)}createGroupForCanvas3D(e){return Vm("createGroupForCanvas3D is deprecated, use createGroup instead"),this.createGroup(e)}createCanvas3DToGroup(e,t){return this.manager.store.canvas3DManager.createToGroup(e,t)}addCanvas3DForGroup(e,t){const n=this.getObjectById(e);return this.manager.store.canvas3DManager.addForGroup(n,t)}getCanvas3DGroupById(e){return Vm("getCanvas3DGroupById is deprecated, use getObjectById instead"),this.getObjectById(e)}getCanvas3DGroupByName(e){return Vm("getCanvas3DGroupByName is deprecated, use getObjectByName instead"),this.getObjectByName(e)}getAllCanvas3DGroup(){return Vm("getAllCanvas3DGroup is deprecated, use getAllGroup instead"),this.getAllGroup()}removeCanvas3DGroupById(e){return Vm("removeCanvas3DGroupById is deprecated, use removeObjectById instead"),this.removeObjectById(e)}clearCanvas3D(){return this.manager.store.canvas3DManager.clear()}getAllCanvas3D(){return this.manager.store.canvas3DManager.getAll()}showAllCanvas3D(){return this.manager.store.canvas3DManager.showAll()}hideAllCanvas3D(){return this.manager.store.canvas3DManager.hideAll()}getShortestPath(e,t){return this.manager.store.topologyManager.getShortestPath(e,t)}getShortestPathByMultipleStartPoints(e,t){return this.manager.store.topologyManager.getShortestPathByMultipleStartPoints(e,t)}getShortestPathByMultipleEndPoints(e,t){return this.manager.store.topologyManager.getShortestPathByMultipleEndPoints(e,t)}createTopologyFromGml(e){return this.manager.store.topologyManager.createFromGml(e)}createTopology(e){return this.manager.store.topologyManager.create(e)}resetTopologyNodes(e,t){return this.manager.store.topologyManager.resetNodes(e,t)}getTopologyById(e){return Vm("getTopologyById is deprecated, use getObjectById instead"),this.getObjectById(e)}getTopologyByName(e){return Vm("getTopologyByName is deprecated, use getObjectByName instead"),this.getObjectByName(e)}getTopologyByUserDataProperty(e,t){return Vm("getTopologyByUserDataProperty is deprecated, use getObjectByUserDataProperty instead"),this.getObjectByUserDataProperty(e,t)}removeTopologyById(e){return Vm("removeTopologyById is deprecated, use removeObjectById instead"),this.removeObjectById(e)}createGroupForTopology(e){return Vm("createGroupForTopology is deprecated, use createGroup instead"),this.createGroup(e)}createTopologyToGroup(e,t){return this.manager.store.topologyManager.createToGroup(e,t)}addTopologyForGroup(e,t){const n=this.getObjectById(e);return this.manager.store.topologyManager.addForGroup(n,t)}getTopologyGroupById(e){return Vm("getTopologyGroupById is deprecated, use getObjectById instead"),this.getObjectById(e)}getTopologyGroupByName(e){return Vm("getTopologyGroupByName is deprecated, use getObjectByName instead"),this.getObjectByName(e)}getAllTopologyGroup(){return Vm("getAllTopologyGroup is deprecated, use getAllGroups instead"),this.getAllGroup()}removeTopologyGroupById(e){return Vm("removeTopologyGroupById is deprecated, use removeObjectById instead"),this.removeObjectById(e)}clearTopology(){return this.manager.store.topologyManager.clear()}getAllTopology(){return this.manager.store.topologyManager.getAll()}showAllTopology(){return this.manager.store.topologyManager.showAll()}hideAllTopology(){return this.manager.store.topologyManager.hideAll()}addGridHelper(e){return this.manager.store.helperManager.addGridHelper(e)}addAxesHelper(e){return this.manager.store.helperManager.addAxesHelper(e)}addBoxHelper(e){return this.manager.store.helperManager.addBoxHelper(e)}addPlaneHelper(e){return this.manager.store.helperManager.addPlaneHelper(e)}createGround(e){return Vm("In soonspacejs: 'createGround' 已弃用,请使用 'addGroundHelper'!"),this.addGroundHelper(e)}addGroundHelper(e){return this.manager.store.helperManager.addGroundHelper(e)}addDirectionalLightHelper(e){return this.manager.store.helperManager.addDirectionalLightHelper(e)}addHemisphereLightHelper(e){return this.manager.store.helperManager.addHemisphereLightHelper(e)}addSpotLightHelper(e){return this.manager.store.helperManager.addSpotLightHelper(e)}addPointLightHelper(e){return this.manager.store.helperManager.addPointLightHelper(e)}addRectAreaLightHelper(e){return this.manager.store.helperManager.addRectAreaLightHelper(e)}getHelperById(e){return Vm("getHelperById is deprecated, use getObjectById instead"),this.getObjectById(e)}removeHelperById(e){return Vm("removeHelperById is deprecated, use removeObjectById instead"),this.removeObjectById(e)}clearHelper(){return this.manager.store.helperManager.clear()}showAllHelper(){return this.manager.store.helperManager.showAll()}hideAllHelper(){return this.manager.store.helperManager.hideAll()}createFindObjectsInBoxNearPosition(e,t){return gR(e,t)}createFindObjectsInSphereNearPosition(e,t){return yR(e,t)}createFindObjectsNearPath(e,t){return bR(e,t)}}wR.THREE=Vp,wR.TWEEN=Zm,wR.utils=hg;export{te as ACESFilmicToneMapping,T as AddEquation,J as AddOperation,Rt as AdditiveAnimationBlendMode,x as AdditiveBlending,Xe as AlphaFormat,B as AlwaysDepth,tn as AlwaysStencilFunc,Vd as AmbientLight,nu as AmbientLightProbe,hd as AnimationClip,bd as AnimationLoader,_u as AnimationMixer,Ru as AnimationObjectGroup,Qh as AnimationUtils,vc as ArcCurve,Qa as ArrayCamera,vp as ArrowHelper,mu as Audio,xu as AudioAnalyser,$d as AudioContext,pu as AudioListener,eu as AudioLoader,xp as AxesHelper,m as BackSide,Xt as BasicDepthPacking,c as BasicShadowMap,Nl as Bone,id as BooleanKeyframeTrack,Du as Box2,li as Box3,mp as Box3Helper,lr as BoxBufferGeometry,lr as BoxGeometry,pp as BoxHelper,Ts as BufferAttribute,Hs as BufferGeometry,Od as BufferGeometryLoader,Me as ByteType,ud as Cache,pr as Camera,hp as CameraHelper,gc as CanvasTexture,Dc as CapsuleBufferGeometry,Dc as CapsuleGeometry,Cc as CatmullRomCurve3,ee as CineonToneMapping,Bc as CircleBufferGeometry,Bc as CircleGeometry,he as ClampToEdgeWrapping,au as Clock,Fn as Color,sd as ColorKeyframeTrack,Zn as ColorManagement,fc as CompressedTexture,vd as CompressedTextureLoader,kc as ConeBufferGeometry,kc as ConeGeometry,fr as CubeCamera,se as CubeReflectionMapping,re as CubeRefractionMapping,gr as CubeTexture,wd as CubeTextureLoader,le as CubeUVReflectionMapping,Ac as CubicBezierCurve,_c as CubicBezierCurve3,$h as CubicInterpolant,o as CullFaceBack,a as CullFaceFront,l as CullFaceFrontBack,r as CullFaceNone,yc as Curve,Zc as CurvePath,M as CustomBlending,ne as CustomToneMapping,Hc as CylinderBufferGeometry,Hc as CylinderGeometry,Nu as Cylindrical,ti as Data3DTexture,$n as DataArrayTexture,Vl as DataTexture,Zp as DataTexture2DArray,Np as DataTexture3D,Sd as DataTextureLoader,_p as DataUtils,Ft as DecrementStencilOp,Ot as DecrementWrapStencilOp,md as DefaultLoadingManager,Ne as DepthFormat,Ve as DepthStencilFormat,tl as DepthTexture,Nd as DirectionalLight,ap as DirectionalLightHelper,td as DiscreteInterpolant,Uc as DodecahedronBufferGeometry,Uc as DodecahedronGeometry,f as DoubleSide,P as DstAlphaFactor,Z as DstColorFactor,hn as DynamicCopyUsage,sn as DynamicDrawUsage,an as DynamicReadUsage,Jc as EdgesGeometry,bc as EllipseCurve,F as EqualDepth,Jt as EqualStencilFunc,oe as EquirectangularReflectionMapping,ae as EquirectangularRefractionMapping,Oi as Euler,fn as EventDispatcher,Rh as ExtrudeBufferGeometry,Rh as ExtrudeGeometry,yd as FileLoader,g as FlatShading,Es as Float16BufferAttribute,Xs as Float32BufferAttribute,zs as Float64BufferAttribute,Ge as FloatType,ll as Fog,al as FogExp2,zp as Font,Xp as FontLoader,mc as FramebufferTexture,p as FrontSide,Tr as Frustum,Xu as GLBufferAttribute,un as GLSL1,pn as GLSL3,O as GreaterDepth,U as GreaterEqualDepth,en as GreaterEqualStencilFunc,qt as GreaterStencilFunc,np as GridHelper,qa as Group,Ae as HalfFloatType,Cd as HemisphereLight,tp as HemisphereLightHelper,tu as HemisphereLightProbe,Ah as IcosahedronBufferGeometry,Ah as IcosahedronGeometry,Qd as ImageBitmapLoader,xd as ImageLoader,On as ImageUtils,Pp as ImmediateRenderObject,kt as IncrementStencilOp,Ut as IncrementWrapStencilOp,kl as InstancedBufferAttribute,Ud as InstancedBufferGeometry,Eu as InstancedInterleavedBuffer,Kl as InstancedMesh,Gs as Int16BufferAttribute,_s as Int32BufferAttribute,Cs as Int8BufferAttribute,Le as IntType,hl as InterleavedBuffer,ul as InterleavedBufferAttribute,qh as Interpolant,xt as InterpolateDiscrete,wt as InterpolateLinear,St as InterpolateSmooth,Yt as InvertStencilOp,Bt as KeepStencilOp,nd as KeyframeTrack,Il as LOD,Vc as LatheBufferGeometry,Vc as LatheGeometry,Yi as Layers,H as LessDepth,k as LessEqualDepth,Qt as LessEqualStencilFunc,jt as LessStencilFunc,Td as Light,Hd as LightProbe,tc as Line,ku as Line3,jl as LineBasicMaterial,Ic as LineCurve,Ec as LineCurve3,Jh as LineDashedMaterial,rc as LineLoop,sc as LineSegments,It as LinearEncoding,ye as LinearFilter,ed as LinearInterpolant,we as LinearMipMapLinearFilter,ve as LinearMipMapNearestFilter,xe as LinearMipmapLinearFilter,be as LinearMipmapNearestFilter,Vt as LinearSRGBColorSpace,q as LinearToneMapping,fd as Loader,Fd as LoaderUtils,pd as LoadingManager,yt as LoopOnce,vt as LoopPingPong,bt as LoopRepeat,Ze as LuminanceAlphaFormat,We as LuminanceFormat,i as MOUSE,xs as Material,kd as MaterialLoader,Rn as MathUtils,An as Matrix3,Wi as Matrix4,G as MaxEquation,or as Mesh,ws as MeshBasicMaterial,Ua as MeshDepthMaterial,Oa as MeshDistanceMaterial,Kh as MeshLambertMaterial,jh as MeshMatcapMaterial,Yh as MeshNormalMaterial,Uh as MeshPhongMaterial,Fh as MeshPhysicalMaterial,kh as MeshStandardMaterial,Oh as MeshToonMaterial,R as MinEquation,de as MirroredRepeatWrapping,j as MixOperation,S as MultiplyBlending,K as MultiplyOperation,ue as NearestFilter,ge as NearestMipMapLinearFilter,me as NearestMipMapNearestFilter,fe as NearestMipmapLinearFilter,pe as NearestMipmapNearestFilter,D as NeverDepth,Kt as NeverStencilFunc,b as NoBlending,Zt as NoColorSpace,Q as NoToneMapping,Lt as NormalAnimationBlendMode,v as NormalBlending,Y as NotEqualDepth,$t as NotEqualStencilFunc,rd as NumberKeyframeTrack,as as Object3D,Yd as ObjectLoader,Wt as ObjectSpaceNormalMap,_h as OctahedronBufferGeometry,_h as OctahedronGeometry,_ as OneFactor,W as OneMinusDstAlphaFactor,N as OneMinusDstColorFactor,z as OneMinusSrcAlphaFactor,E as OneMinusSrcColorFactor,Zr as OrthographicCamera,h as PCFShadowMap,d as PCFSoftShadowMap,Ur as PMREMGenerator,Ip as ParametricGeometry,Nc as Path,mr as PerspectiveCamera,wr as Plane,Rr as PlaneBufferGeometry,Rr as PlaneGeometry,fp as PlaneHelper,Wd as PointLight,Qu as PointLightHelper,dc as Points,oc as PointsMaterial,ip as PolarGridHelper,Fc as PolyhedronBufferGeometry,Fc as PolyhedronGeometry,vu as PositionalAudio,Lu as PropertyBinding,wu as PropertyMixer,Xc as QuadraticBezierCurve,zc as QuadraticBezierCurve3,si as Quaternion,ad as QuaternionKeyframeTrack,od as QuaternionLinearInterpolant,n as REVISION,zt as RGBADepthPacking,Pe as RGBAFormat,Fe as RGBAIntegerFormat,pt as RGBA_ASTC_10x10_Format,ht as RGBA_ASTC_10x5_Format,dt as RGBA_ASTC_10x6_Format,ut as RGBA_ASTC_10x8_Format,mt as RGBA_ASTC_12x10_Format,ft as RGBA_ASTC_12x12_Format,nt as RGBA_ASTC_4x4_Format,it as RGBA_ASTC_5x4_Format,st as RGBA_ASTC_5x5_Format,rt as RGBA_ASTC_6x5_Format,ot as RGBA_ASTC_6x6_Format,at as RGBA_ASTC_8x5_Format,lt as RGBA_ASTC_8x6_Format,ct as RGBA_ASTC_8x8_Format,gt as RGBA_BPTC_Format,tt as RGBA_ETC2_EAC_Format,qe as RGBA_PVRTC_2BPPV1_Format,Qe as RGBA_PVRTC_4BPPV1_Format,Oe as RGBA_S3TC_DXT1_Format,Ye as RGBA_S3TC_DXT3_Format,Ke as RGBA_S3TC_DXT5_Format,ze as RGBFormat,$e as RGB_ETC1_Format,et as RGB_ETC2_Format,Je as RGB_PVRTC_2BPPV1_Format,je as RGB_PVRTC_4BPPV1_Format,Ue as RGB_S3TC_DXT1_Format,He as RGFormat,ke as RGIntegerFormat,Hh as RawShaderMaterial,Pi as Ray,zu as Raycaster,Dd as RectAreaLight,De as RedFormat,Be as RedIntegerFormat,$ as ReinhardToneMapping,ce as RepeatWrapping,Ht as ReplaceStencilOp,L as ReverseSubtractEquation,Ih as RingBufferGeometry,Ih as RingGeometry,Nt as SRGBColorSpace,cl as Scene,Gr as ShaderChunk,_r as ShaderLib,ur as ShaderMaterial,Bh as ShadowMaterial,Qc as Shape,Eh as ShapeBufferGeometry,Eh as ShapeGeometry,wp as ShapePath,Th as ShapeUtils,Te as ShortType,Hl as Skeleton,ju as SkeletonHelper,Zl as SkinnedMesh,y as SmoothShading,wR as SoonSpace,Yn as Source,Ri as Sphere,Xh as SphereBufferGeometry,Xh as SphereGeometry,Zu as Spherical,Bd as SphericalHarmonics3,Pc as SplineCurve,Id as SpotLight,Uu as SpotLightHelper,Rl as Sprite,pl as SpriteMaterial,X as SrcAlphaFactor,V as SrcAlphaSaturateFactor,I as SrcColorFactor,cn as StaticCopyUsage,nn as StaticDrawUsage,on as StaticReadUsage,ou as StereoCamera,dn as StreamCopyUsage,rn as StreamDrawUsage,ln as StreamReadUsage,ld as StringKeyframeTrack,C as SubtractEquation,w as SubtractiveBlending,s as TOUCH,Pt as TangentSpaceNormalMap,zh as TetrahedronBufferGeometry,zh as TetrahedronGeometry,Ep as TextGeometry,Jn as Texture,Md as TextureLoader,Ph as TorusBufferGeometry,Ph as TorusGeometry,Wh as TorusKnotBufferGeometry,Wh as TorusKnotGeometry,bs as Triangle,_t as TriangleFanDrawMode,At as TriangleStripDrawMode,Gt as TrianglesDrawMode,Zh as TubeBufferGeometry,Zh as TubeGeometry,ie as UVMapping,As as Uint16BufferAttribute,Is as Uint32BufferAttribute,Ls as Uint8BufferAttribute,Rs as Uint8ClampedBufferAttribute,Iu as Uniform,Ar as UniformsLib,dr as UniformsUtils,Se as UnsignedByteType,Ee as UnsignedInt248Type,Re as UnsignedIntType,_e as UnsignedShort4444Type,Ie as UnsignedShort5551Type,Ce as UnsignedShortType,u as VSMShadowMap,Gn as Vector2,ri as Vector3,Qn as Vector4,cd as VectorKeyframeTrack,pc as VideoTexture,ol as WebGL1Renderer,ni as WebGL3DRenderTarget,ei as WebGLArrayRenderTarget,yr as WebGLCubeRenderTarget,ii as WebGLMultipleRenderTargets,Wp as WebGLMultisampleRenderTarget,qn as WebGLRenderTarget,rl as WebGLRenderer,Ja as WebGLUtils,Nh as WireframeGeometry,Ct as WrapAroundEnding,Mt as ZeroCurvatureEnding,A as ZeroFactor,Tt as ZeroSlopeEnding,Dt as ZeroStencilOp,mn as _SRGBAFormat,uR as boundingIsIntersected,gR as createFindObjectsInBoxNearPosition,yR as createFindObjectsInSphereNearPosition,bR as createFindObjectsNearPath,hR as createPlaneMatrix,vR as createPoiMesh,xR as createPolygonPoiMesh,mR as createTexture,dR as createUVMatrix,wR as default,pR as getBoundingBox,cR as getPolygonGeometryInfo,Et as sRGBEncoding,fR as setTexture};
53
+ */var ZL=nb((function(e,t){e.exports=function e(t,n,i){function s(o,a){if(!n[o]){if(!t[o]){if(!a&&ib)return ib(o);if(r)return r(o,!0);var l=new Error("Cannot find module '"+o+"'");throw l.code="MODULE_NOT_FOUND",l}var c=n[o]={exports:{}};t[o][0].call(c.exports,(function(e){var n=t[o][1][e];return s(n||e)}),c,c.exports,e,t,n,i)}return n[o].exports}for(var r=ib,o=0;o<i.length;o++)s(i[o]);return s}({1:[function(e,t,n){(function(e){var n,i,s=e.MutationObserver||e.WebKitMutationObserver;if(s){var r=0,o=new s(h),a=e.document.createTextNode("");o.observe(a,{characterData:!0}),n=function(){a.data=r=++r%2}}else if(e.setImmediate||void 0===e.MessageChannel)n="document"in e&&"onreadystatechange"in e.document.createElement("script")?function(){var t=e.document.createElement("script");t.onreadystatechange=function(){h(),t.onreadystatechange=null,t.parentNode.removeChild(t),t=null},e.document.documentElement.appendChild(t)}:function(){setTimeout(h,0)};else{var l=new e.MessageChannel;l.port1.onmessage=h,n=function(){l.port2.postMessage(0)}}var c=[];function h(){var e,t;i=!0;for(var n=c.length;n;){for(t=c,c=[],e=-1;++e<n;)t[e]();n=c.length}i=!1}function d(e){1!==c.push(e)||i||n()}t.exports=d}).call(this,void 0!==eb?eb:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{}],2:[function(e,t,n){var i=e(1);function s(){}var r={},o=["REJECTED"],a=["FULFILLED"],l=["PENDING"];function c(e){if("function"!=typeof e)throw new TypeError("resolver must be a function");this.state=l,this.queue=[],this.outcome=void 0,e!==s&&p(this,e)}function h(e,t,n){this.promise=e,"function"==typeof t&&(this.onFulfilled=t,this.callFulfilled=this.otherCallFulfilled),"function"==typeof n&&(this.onRejected=n,this.callRejected=this.otherCallRejected)}function d(e,t,n){i((function(){var i;try{i=t(n)}catch(t){return r.reject(e,t)}i===e?r.reject(e,new TypeError("Cannot resolve promise with itself")):r.resolve(e,i)}))}function u(e){var t=e&&e.then;if(e&&("object"==typeof e||"function"==typeof e)&&"function"==typeof t)return function(){t.apply(e,arguments)}}function p(e,t){var n=!1;function i(t){n||(n=!0,r.reject(e,t))}function s(t){n||(n=!0,r.resolve(e,t))}function o(){t(s,i)}var a=m(o);"error"===a.status&&i(a.value)}function m(e,t){var n={};try{n.value=e(t),n.status="success"}catch(e){n.status="error",n.value=e}return n}function f(e){return e instanceof this?e:r.resolve(new this(s),e)}function g(e){var t=new this(s);return r.reject(t,e)}function y(e){var t=this;if("[object Array]"!==Object.prototype.toString.call(e))return this.reject(new TypeError("must be an array"));var n=e.length,i=!1;if(!n)return this.resolve([]);for(var o=new Array(n),a=0,l=-1,c=new this(s);++l<n;)h(e[l],l);return c;function h(e,s){function l(e){o[s]=e,++a!==n||i||(i=!0,r.resolve(c,o))}t.resolve(e).then(l,(function(e){i||(i=!0,r.reject(c,e))}))}}function b(e){var t=this;if("[object Array]"!==Object.prototype.toString.call(e))return this.reject(new TypeError("must be an array"));var n=e.length,i=!1;if(!n)return this.resolve([]);for(var o=-1,a=new this(s);++o<n;)l(e[o]);return a;function l(e){t.resolve(e).then((function(e){i||(i=!0,r.resolve(a,e))}),(function(e){i||(i=!0,r.reject(a,e))}))}}t.exports=c,c.prototype.catch=function(e){return this.then(null,e)},c.prototype.then=function(e,t){if("function"!=typeof e&&this.state===a||"function"!=typeof t&&this.state===o)return this;var n=new this.constructor(s);return this.state!==l?d(n,this.state===a?e:t,this.outcome):this.queue.push(new h(n,e,t)),n},h.prototype.callFulfilled=function(e){r.resolve(this.promise,e)},h.prototype.otherCallFulfilled=function(e){d(this.promise,this.onFulfilled,e)},h.prototype.callRejected=function(e){r.reject(this.promise,e)},h.prototype.otherCallRejected=function(e){d(this.promise,this.onRejected,e)},r.resolve=function(e,t){var n=m(u,t);if("error"===n.status)return r.reject(e,n.value);var i=n.value;if(i)p(e,i);else{e.state=a,e.outcome=t;for(var s=-1,o=e.queue.length;++s<o;)e.queue[s].callFulfilled(t)}return e},r.reject=function(e,t){e.state=o,e.outcome=t;for(var n=-1,i=e.queue.length;++n<i;)e.queue[n].callRejected(t);return e},c.resolve=f,c.reject=g,c.all=y,c.race=b},{1:1}],3:[function(e,t,n){(function(t){"function"!=typeof t.Promise&&(t.Promise=e(2))}).call(this,void 0!==eb?eb:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{2:2}],4:[function(e,t,n){var i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e};function s(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function r(){try{if("undefined"!=typeof indexedDB)return indexedDB;if("undefined"!=typeof webkitIndexedDB)return webkitIndexedDB;if("undefined"!=typeof mozIndexedDB)return mozIndexedDB;if("undefined"!=typeof OIndexedDB)return OIndexedDB;if("undefined"!=typeof msIndexedDB)return msIndexedDB}catch(e){return}}var o=r();function a(){try{if(!o||!o.open)return!1;var e="undefined"!=typeof openDatabase&&/(Safari|iPhone|iPad|iPod)/.test(navigator.userAgent)&&!/Chrome/.test(navigator.userAgent)&&!/BlackBerry/.test(navigator.platform),t="function"==typeof fetch&&-1!==fetch.toString().indexOf("[native code");return(!e||t)&&"undefined"!=typeof indexedDB&&"undefined"!=typeof IDBKeyRange}catch(e){return!1}}function l(e,t){e=e||[],t=t||{};try{return new Blob(e,t)}catch(s){if("TypeError"!==s.name)throw s;for(var n=new("undefined"!=typeof BlobBuilder?BlobBuilder:"undefined"!=typeof MSBlobBuilder?MSBlobBuilder:"undefined"!=typeof MozBlobBuilder?MozBlobBuilder:WebKitBlobBuilder),i=0;i<e.length;i+=1)n.append(e[i]);return n.getBlob(t.type)}}"undefined"==typeof Promise&&e(3);var c=Promise;function h(e,t){t&&e.then((function(e){t(null,e)}),(function(e){t(e)}))}function d(e,t,n){"function"==typeof t&&e.then(t),"function"==typeof n&&e.catch(n)}function u(e){return"string"!=typeof e&&(console.warn(e+" used as a key, but it is not a string."),e=String(e)),e}function p(){if(arguments.length&&"function"==typeof arguments[arguments.length-1])return arguments[arguments.length-1]}var m="local-forage-detect-blob-support",f=void 0,g={},y=Object.prototype.toString,b="readonly",v="readwrite";function x(e){for(var t=e.length,n=new ArrayBuffer(t),i=new Uint8Array(n),s=0;s<t;s++)i[s]=e.charCodeAt(s);return n}function w(e){return new c((function(t){var n=e.transaction(m,v),i=l([""]);n.objectStore(m).put(i,"key"),n.onabort=function(e){e.preventDefault(),e.stopPropagation(),t(!1)},n.oncomplete=function(){var e=navigator.userAgent.match(/Chrome\/(\d+)/),n=navigator.userAgent.match(/Edge\//);t(n||!e||parseInt(e[1],10)>=43)}})).catch((function(){return!1}))}function S(e){return"boolean"==typeof f?c.resolve(f):w(e).then((function(e){return f=e}))}function M(e){var t=g[e.name],n={};n.promise=new c((function(e,t){n.resolve=e,n.reject=t})),t.deferredOperations.push(n),t.dbReady?t.dbReady=t.dbReady.then((function(){return n.promise})):t.dbReady=n.promise}function T(e){var t=g[e.name].deferredOperations.pop();if(t)return t.resolve(),t.promise}function C(e,t){var n=g[e.name].deferredOperations.pop();if(n)return n.reject(t),n.promise}function L(e,t){return new c((function(n,i){if(g[e.name]=g[e.name]||W(),e.db){if(!t)return n(e.db);M(e),e.db.close()}var s=[e.name];t&&s.push(e.version);var r=o.open.apply(o,s);t&&(r.onupgradeneeded=function(t){var n=r.result;try{n.createObjectStore(e.storeName),t.oldVersion<=1&&n.createObjectStore(m)}catch(n){if("ConstraintError"!==n.name)throw n;console.warn('The database "'+e.name+'" has been upgraded from version '+t.oldVersion+" to version "+t.newVersion+', but the storage "'+e.storeName+'" already exists.')}}),r.onerror=function(e){e.preventDefault(),i(r.error)},r.onsuccess=function(){n(r.result),T(e)}}))}function R(e){return L(e,!1)}function G(e){return L(e,!0)}function A(e,t){if(!e.db)return!0;var n=!e.db.objectStoreNames.contains(e.storeName),i=e.version<e.db.version,s=e.version>e.db.version;if(i&&(e.version!==t&&console.warn('The database "'+e.name+"\" can't be downgraded from version "+e.db.version+" to version "+e.version+"."),e.version=e.db.version),s||n){if(n){var r=e.db.version+1;r>e.version&&(e.version=r)}return!0}return!1}function _(e){return new c((function(t,n){var i=new FileReader;i.onerror=n,i.onloadend=function(n){var i=btoa(n.target.result||"");t({__local_forage_encoded_blob:!0,data:i,type:e.type})},i.readAsBinaryString(e)}))}function I(e){return l([x(atob(e.data))],{type:e.type})}function E(e){return e&&e.__local_forage_encoded_blob}function X(e){var t=this,n=t._initReady().then((function(){var e=g[t._dbInfo.name];if(e&&e.dbReady)return e.dbReady}));return d(n,e,e),n}function z(e){M(e);for(var t=g[e.name],n=t.forages,i=0;i<n.length;i++){var s=n[i];s._dbInfo.db&&(s._dbInfo.db.close(),s._dbInfo.db=null)}return e.db=null,R(e).then((function(t){return e.db=t,A(e)?G(e):t})).then((function(i){e.db=t.db=i;for(var s=0;s<n.length;s++)n[s]._dbInfo.db=i})).catch((function(t){throw C(e,t),t}))}function P(e,t,n,i){void 0===i&&(i=1);try{var s=e.db.transaction(e.storeName,t);n(null,s)}catch(s){if(i>0&&(!e.db||"InvalidStateError"===s.name||"NotFoundError"===s.name))return c.resolve().then((function(){if(!e.db||"NotFoundError"===s.name&&!e.db.objectStoreNames.contains(e.storeName)&&e.version<=e.db.version)return e.db&&(e.version=e.db.version+1),G(e)})).then((function(){return z(e).then((function(){P(e,t,n,i-1)}))})).catch(n);n(s)}}function W(){return{forages:[],db:null,dbReady:null,deferredOperations:[]}}function Z(e){var t=this,n={db:null};if(e)for(var i in e)n[i]=e[i];var s=g[n.name];s||(s=W(),g[n.name]=s),s.forages.push(t),t._initReady||(t._initReady=t.ready,t.ready=X);var r=[];function o(){return c.resolve()}for(var a=0;a<s.forages.length;a++){var l=s.forages[a];l!==t&&r.push(l._initReady().catch(o))}var h=s.forages.slice(0);return c.all(r).then((function(){return n.db=s.db,R(n)})).then((function(e){return n.db=e,A(n,t._defaultConfig.version)?G(n):e})).then((function(e){n.db=s.db=e,t._dbInfo=n;for(var i=0;i<h.length;i++){var r=h[i];r!==t&&(r._dbInfo.db=n.db,r._dbInfo.version=n.version)}}))}function N(e,t){var n=this;e=u(e);var i=new c((function(t,i){n.ready().then((function(){P(n._dbInfo,b,(function(s,r){if(s)return i(s);try{var o=r.objectStore(n._dbInfo.storeName).get(e);o.onsuccess=function(){var e=o.result;void 0===e&&(e=null),E(e)&&(e=I(e)),t(e)},o.onerror=function(){i(o.error)}}catch(e){i(e)}}))})).catch(i)}));return h(i,t),i}function V(e,t){var n=this,i=new c((function(t,i){n.ready().then((function(){P(n._dbInfo,b,(function(s,r){if(s)return i(s);try{var o=r.objectStore(n._dbInfo.storeName).openCursor(),a=1;o.onsuccess=function(){var n=o.result;if(n){var i=n.value;E(i)&&(i=I(i));var s=e(i,n.key,a++);void 0!==s?t(s):n.continue()}else t()},o.onerror=function(){i(o.error)}}catch(e){i(e)}}))})).catch(i)}));return h(i,t),i}function D(e,t,n){var i=this;e=u(e);var s=new c((function(n,s){var r;i.ready().then((function(){return r=i._dbInfo,"[object Blob]"===y.call(t)?S(r.db).then((function(e){return e?t:_(t)})):t})).then((function(t){P(i._dbInfo,v,(function(r,o){if(r)return s(r);try{var a=o.objectStore(i._dbInfo.storeName);null===t&&(t=void 0);var l=a.put(t,e);o.oncomplete=function(){void 0===t&&(t=null),n(t)},o.onabort=o.onerror=function(){var e=l.error?l.error:l.transaction.error;s(e)}}catch(e){s(e)}}))})).catch(s)}));return h(s,n),s}function B(e,t){var n=this;e=u(e);var i=new c((function(t,i){n.ready().then((function(){P(n._dbInfo,v,(function(s,r){if(s)return i(s);try{var o=r.objectStore(n._dbInfo.storeName).delete(e);r.oncomplete=function(){t()},r.onerror=function(){i(o.error)},r.onabort=function(){var e=o.error?o.error:o.transaction.error;i(e)}}catch(e){i(e)}}))})).catch(i)}));return h(i,t),i}function H(e){var t=this,n=new c((function(e,n){t.ready().then((function(){P(t._dbInfo,v,(function(i,s){if(i)return n(i);try{var r=s.objectStore(t._dbInfo.storeName).clear();s.oncomplete=function(){e()},s.onabort=s.onerror=function(){var e=r.error?r.error:r.transaction.error;n(e)}}catch(e){n(e)}}))})).catch(n)}));return h(n,e),n}function k(e){var t=this,n=new c((function(e,n){t.ready().then((function(){P(t._dbInfo,b,(function(i,s){if(i)return n(i);try{var r=s.objectStore(t._dbInfo.storeName).count();r.onsuccess=function(){e(r.result)},r.onerror=function(){n(r.error)}}catch(e){n(e)}}))})).catch(n)}));return h(n,e),n}function F(e,t){var n=this,i=new c((function(t,i){e<0?t(null):n.ready().then((function(){P(n._dbInfo,b,(function(s,r){if(s)return i(s);try{var o=r.objectStore(n._dbInfo.storeName),a=!1,l=o.openKeyCursor();l.onsuccess=function(){var n=l.result;n?0===e||a?t(n.key):(a=!0,n.advance(e)):t(null)},l.onerror=function(){i(l.error)}}catch(e){i(e)}}))})).catch(i)}));return h(i,t),i}function U(e){var t=this,n=new c((function(e,n){t.ready().then((function(){P(t._dbInfo,b,(function(i,s){if(i)return n(i);try{var r=s.objectStore(t._dbInfo.storeName).openKeyCursor(),o=[];r.onsuccess=function(){var t=r.result;t?(o.push(t.key),t.continue()):e(o)},r.onerror=function(){n(r.error)}}catch(e){n(e)}}))})).catch(n)}));return h(n,e),n}function O(e,t){t=p.apply(this,arguments);var n=this.config();(e="function"!=typeof e&&e||{}).name||(e.name=e.name||n.name,e.storeName=e.storeName||n.storeName);var i,s=this;if(e.name){var r=e.name===n.name&&s._dbInfo.db?c.resolve(s._dbInfo.db):R(e).then((function(t){var n=g[e.name],i=n.forages;n.db=t;for(var s=0;s<i.length;s++)i[s]._dbInfo.db=t;return t}));i=e.storeName?r.then((function(t){if(t.objectStoreNames.contains(e.storeName)){var n=t.version+1;M(e);var i=g[e.name],s=i.forages;t.close();for(var r=0;r<s.length;r++){var a=s[r];a._dbInfo.db=null,a._dbInfo.version=n}return new c((function(t,i){var s=o.open(e.name,n);s.onerror=function(e){s.result.close(),i(e)},s.onupgradeneeded=function(){s.result.deleteObjectStore(e.storeName)},s.onsuccess=function(){var e=s.result;e.close(),t(e)}})).then((function(e){i.db=e;for(var t=0;t<s.length;t++){var n=s[t];n._dbInfo.db=e,T(n._dbInfo)}})).catch((function(t){throw(C(e,t)||c.resolve()).catch((function(){})),t}))}})):r.then((function(t){M(e);var n=g[e.name],i=n.forages;t.close();for(var s=0;s<i.length;s++)i[s]._dbInfo.db=null;return new c((function(t,n){var i=o.deleteDatabase(e.name);i.onerror=i.onblocked=function(e){var t=i.result;t&&t.close(),n(e)},i.onsuccess=function(){var e=i.result;e&&e.close(),t(e)}})).then((function(e){n.db=e;for(var t=0;t<i.length;t++)T(i[t]._dbInfo)})).catch((function(t){throw(C(e,t)||c.resolve()).catch((function(){})),t}))}))}else i=c.reject("Invalid arguments");return h(i,t),i}var Y={_driver:"asyncStorage",_initStorage:Z,_support:a(),iterate:V,getItem:N,setItem:D,removeItem:B,clear:H,length:k,key:F,keys:U,dropInstance:O};function K(){return"function"==typeof openDatabase}var j="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",J="~~local_forage_type~",Q=/^~~local_forage_type~([^~]+)~/,q="__lfsc__:",$=q.length,ee="arbf",te="blob",ne="si08",ie="ui08",se="uic8",re="si16",oe="si32",ae="ur16",le="ui32",ce="fl32",he="fl64",de=$+ee.length,ue=Object.prototype.toString;function pe(e){var t,n,i,s,r,o=.75*e.length,a=e.length,l=0;"="===e[e.length-1]&&(o--,"="===e[e.length-2]&&o--);var c=new ArrayBuffer(o),h=new Uint8Array(c);for(t=0;t<a;t+=4)n=j.indexOf(e[t]),i=j.indexOf(e[t+1]),s=j.indexOf(e[t+2]),r=j.indexOf(e[t+3]),h[l++]=n<<2|i>>4,h[l++]=(15&i)<<4|s>>2,h[l++]=(3&s)<<6|63&r;return c}function me(e){var t,n=new Uint8Array(e),i="";for(t=0;t<n.length;t+=3)i+=j[n[t]>>2],i+=j[(3&n[t])<<4|n[t+1]>>4],i+=j[(15&n[t+1])<<2|n[t+2]>>6],i+=j[63&n[t+2]];return n.length%3==2?i=i.substring(0,i.length-1)+"=":n.length%3==1&&(i=i.substring(0,i.length-2)+"=="),i}function fe(e,t){var n="";if(e&&(n=ue.call(e)),e&&("[object ArrayBuffer]"===n||e.buffer&&"[object ArrayBuffer]"===ue.call(e.buffer))){var i,s=q;e instanceof ArrayBuffer?(i=e,s+=ee):(i=e.buffer,"[object Int8Array]"===n?s+=ne:"[object Uint8Array]"===n?s+=ie:"[object Uint8ClampedArray]"===n?s+=se:"[object Int16Array]"===n?s+=re:"[object Uint16Array]"===n?s+=ae:"[object Int32Array]"===n?s+=oe:"[object Uint32Array]"===n?s+=le:"[object Float32Array]"===n?s+=ce:"[object Float64Array]"===n?s+=he:t(new Error("Failed to get type for BinaryArray"))),t(s+me(i))}else if("[object Blob]"===n){var r=new FileReader;r.onload=function(){var n=J+e.type+"~"+me(this.result);t(q+te+n)},r.readAsArrayBuffer(e)}else try{t(JSON.stringify(e))}catch(n){console.error("Couldn't convert value into a JSON string: ",e),t(null,n)}}function ge(e){if(e.substring(0,$)!==q)return JSON.parse(e);var t,n=e.substring(de),i=e.substring($,de);if(i===te&&Q.test(n)){var s=n.match(Q);t=s[1],n=n.substring(s[0].length)}var r=pe(n);switch(i){case ee:return r;case te:return l([r],{type:t});case ne:return new Int8Array(r);case ie:return new Uint8Array(r);case se:return new Uint8ClampedArray(r);case re:return new Int16Array(r);case ae:return new Uint16Array(r);case oe:return new Int32Array(r);case le:return new Uint32Array(r);case ce:return new Float32Array(r);case he:return new Float64Array(r);default:throw new Error("Unkown type: "+i)}}var ye={serialize:fe,deserialize:ge,stringToBuffer:pe,bufferToString:me};function be(e,t,n,i){e.executeSql("CREATE TABLE IF NOT EXISTS "+t.storeName+" (id INTEGER PRIMARY KEY, key unique, value)",[],n,i)}function ve(e){var t=this,n={db:null};if(e)for(var i in e)n[i]="string"!=typeof e[i]?e[i].toString():e[i];var s=new c((function(e,i){try{n.db=openDatabase(n.name,String(n.version),n.description,n.size)}catch(e){return i(e)}n.db.transaction((function(s){be(s,n,(function(){t._dbInfo=n,e()}),(function(e,t){i(t)}))}),i)}));return n.serializer=ye,s}function xe(e,t,n,i,s,r){e.executeSql(n,i,s,(function(e,o){o.code===o.SYNTAX_ERR?e.executeSql("SELECT name FROM sqlite_master WHERE type='table' AND name = ?",[t.storeName],(function(e,a){a.rows.length?r(e,o):be(e,t,(function(){e.executeSql(n,i,s,r)}),r)}),r):r(e,o)}),r)}function we(e,t){var n=this;e=u(e);var i=new c((function(t,i){n.ready().then((function(){var s=n._dbInfo;s.db.transaction((function(n){xe(n,s,"SELECT * FROM "+s.storeName+" WHERE key = ? LIMIT 1",[e],(function(e,n){var i=n.rows.length?n.rows.item(0).value:null;i&&(i=s.serializer.deserialize(i)),t(i)}),(function(e,t){i(t)}))}))})).catch(i)}));return h(i,t),i}function Se(e,t){var n=this,i=new c((function(t,i){n.ready().then((function(){var s=n._dbInfo;s.db.transaction((function(n){xe(n,s,"SELECT * FROM "+s.storeName,[],(function(n,i){for(var r=i.rows,o=r.length,a=0;a<o;a++){var l=r.item(a),c=l.value;if(c&&(c=s.serializer.deserialize(c)),void 0!==(c=e(c,l.key,a+1)))return void t(c)}t()}),(function(e,t){i(t)}))}))})).catch(i)}));return h(i,t),i}function Me(e,t,n,i){var s=this;e=u(e);var r=new c((function(r,o){s.ready().then((function(){void 0===t&&(t=null);var a=t,l=s._dbInfo;l.serializer.serialize(t,(function(t,c){c?o(c):l.db.transaction((function(n){xe(n,l,"INSERT OR REPLACE INTO "+l.storeName+" (key, value) VALUES (?, ?)",[e,t],(function(){r(a)}),(function(e,t){o(t)}))}),(function(t){if(t.code===t.QUOTA_ERR){if(i>0)return void r(Me.apply(s,[e,a,n,i-1]));o(t)}}))}))})).catch(o)}));return h(r,n),r}function Te(e,t,n){return Me.apply(this,[e,t,n,1])}function Ce(e,t){var n=this;e=u(e);var i=new c((function(t,i){n.ready().then((function(){var s=n._dbInfo;s.db.transaction((function(n){xe(n,s,"DELETE FROM "+s.storeName+" WHERE key = ?",[e],(function(){t()}),(function(e,t){i(t)}))}))})).catch(i)}));return h(i,t),i}function Le(e){var t=this,n=new c((function(e,n){t.ready().then((function(){var i=t._dbInfo;i.db.transaction((function(t){xe(t,i,"DELETE FROM "+i.storeName,[],(function(){e()}),(function(e,t){n(t)}))}))})).catch(n)}));return h(n,e),n}function Re(e){var t=this,n=new c((function(e,n){t.ready().then((function(){var i=t._dbInfo;i.db.transaction((function(t){xe(t,i,"SELECT COUNT(key) as c FROM "+i.storeName,[],(function(t,n){var i=n.rows.item(0).c;e(i)}),(function(e,t){n(t)}))}))})).catch(n)}));return h(n,e),n}function Ge(e,t){var n=this,i=new c((function(t,i){n.ready().then((function(){var s=n._dbInfo;s.db.transaction((function(n){xe(n,s,"SELECT key FROM "+s.storeName+" WHERE id = ? LIMIT 1",[e+1],(function(e,n){var i=n.rows.length?n.rows.item(0).key:null;t(i)}),(function(e,t){i(t)}))}))})).catch(i)}));return h(i,t),i}function Ae(e){var t=this,n=new c((function(e,n){t.ready().then((function(){var i=t._dbInfo;i.db.transaction((function(t){xe(t,i,"SELECT key FROM "+i.storeName,[],(function(t,n){for(var i=[],s=0;s<n.rows.length;s++)i.push(n.rows.item(s).key);e(i)}),(function(e,t){n(t)}))}))})).catch(n)}));return h(n,e),n}function _e(e){return new c((function(t,n){e.transaction((function(i){i.executeSql("SELECT name FROM sqlite_master WHERE type='table' AND name <> '__WebKitDatabaseInfoTable__'",[],(function(n,i){for(var s=[],r=0;r<i.rows.length;r++)s.push(i.rows.item(r).name);t({db:e,storeNames:s})}),(function(e,t){n(t)}))}),(function(e){n(e)}))}))}function Ie(e,t){t=p.apply(this,arguments);var n=this.config();(e="function"!=typeof e&&e||{}).name||(e.name=e.name||n.name,e.storeName=e.storeName||n.storeName);var i,s=this;return h(i=e.name?new c((function(t){var i;i=e.name===n.name?s._dbInfo.db:openDatabase(e.name,"","",0),e.storeName?t({db:i,storeNames:[e.storeName]}):t(_e(i))})).then((function(e){return new c((function(t,n){e.db.transaction((function(i){function s(e){return new c((function(t,n){i.executeSql("DROP TABLE IF EXISTS "+e,[],(function(){t()}),(function(e,t){n(t)}))}))}for(var r=[],o=0,a=e.storeNames.length;o<a;o++)r.push(s(e.storeNames[o]));c.all(r).then((function(){t()})).catch((function(e){n(e)}))}),(function(e){n(e)}))}))})):c.reject("Invalid arguments"),t),i}var Ee={_driver:"webSQLStorage",_initStorage:ve,_support:K(),iterate:Se,getItem:we,setItem:Te,removeItem:Ce,clear:Le,length:Re,key:Ge,keys:Ae,dropInstance:Ie};function Xe(){try{return"undefined"!=typeof localStorage&&"setItem"in localStorage&&!!localStorage.setItem}catch(e){return!1}}function ze(e,t){var n=e.name+"/";return e.storeName!==t.storeName&&(n+=e.storeName+"/"),n}function Pe(){var e="_localforage_support_test";try{return localStorage.setItem(e,!0),localStorage.removeItem(e),!1}catch(e){return!0}}function We(){return!Pe()||localStorage.length>0}function Ze(e){var t=this,n={};if(e)for(var i in e)n[i]=e[i];return n.keyPrefix=ze(e,t._defaultConfig),We()?(t._dbInfo=n,n.serializer=ye,c.resolve()):c.reject()}function Ne(e){var t=this,n=t.ready().then((function(){for(var e=t._dbInfo.keyPrefix,n=localStorage.length-1;n>=0;n--){var i=localStorage.key(n);0===i.indexOf(e)&&localStorage.removeItem(i)}}));return h(n,e),n}function Ve(e,t){var n=this;e=u(e);var i=n.ready().then((function(){var t=n._dbInfo,i=localStorage.getItem(t.keyPrefix+e);return i&&(i=t.serializer.deserialize(i)),i}));return h(i,t),i}function De(e,t){var n=this,i=n.ready().then((function(){for(var t=n._dbInfo,i=t.keyPrefix,s=i.length,r=localStorage.length,o=1,a=0;a<r;a++){var l=localStorage.key(a);if(0===l.indexOf(i)){var c=localStorage.getItem(l);if(c&&(c=t.serializer.deserialize(c)),void 0!==(c=e(c,l.substring(s),o++)))return c}}}));return h(i,t),i}function Be(e,t){var n=this,i=n.ready().then((function(){var t,i=n._dbInfo;try{t=localStorage.key(e)}catch(e){t=null}return t&&(t=t.substring(i.keyPrefix.length)),t}));return h(i,t),i}function He(e){var t=this,n=t.ready().then((function(){for(var e=t._dbInfo,n=localStorage.length,i=[],s=0;s<n;s++){var r=localStorage.key(s);0===r.indexOf(e.keyPrefix)&&i.push(r.substring(e.keyPrefix.length))}return i}));return h(n,e),n}function ke(e){var t=this.keys().then((function(e){return e.length}));return h(t,e),t}function Fe(e,t){var n=this;e=u(e);var i=n.ready().then((function(){var t=n._dbInfo;localStorage.removeItem(t.keyPrefix+e)}));return h(i,t),i}function Ue(e,t,n){var i=this;e=u(e);var s=i.ready().then((function(){void 0===t&&(t=null);var n=t;return new c((function(s,r){var o=i._dbInfo;o.serializer.serialize(t,(function(t,i){if(i)r(i);else try{localStorage.setItem(o.keyPrefix+e,t),s(n)}catch(e){"QuotaExceededError"!==e.name&&"NS_ERROR_DOM_QUOTA_REACHED"!==e.name||r(e),r(e)}}))}))}));return h(s,n),s}function Oe(e,t){if(t=p.apply(this,arguments),!(e="function"!=typeof e&&e||{}).name){var n=this.config();e.name=e.name||n.name,e.storeName=e.storeName||n.storeName}var i,s=this;return h(i=e.name?new c((function(t){e.storeName?t(ze(e,s._defaultConfig)):t(e.name+"/")})).then((function(e){for(var t=localStorage.length-1;t>=0;t--){var n=localStorage.key(t);0===n.indexOf(e)&&localStorage.removeItem(n)}})):c.reject("Invalid arguments"),t),i}var Ye={_driver:"localStorageWrapper",_initStorage:Ze,_support:Xe(),iterate:De,getItem:Ve,setItem:Ue,removeItem:Fe,clear:Ne,length:ke,key:Be,keys:He,dropInstance:Oe},Ke=function(e,t){return e===t||"number"==typeof e&&"number"==typeof t&&isNaN(e)&&isNaN(t)},je=function(e,t){for(var n=e.length,i=0;i<n;){if(Ke(e[i],t))return!0;i++}return!1},Je=Array.isArray||function(e){return"[object Array]"===Object.prototype.toString.call(e)},Qe={},qe={},$e={INDEXEDDB:Y,WEBSQL:Ee,LOCALSTORAGE:Ye},et=[$e.INDEXEDDB._driver,$e.WEBSQL._driver,$e.LOCALSTORAGE._driver],tt=["dropInstance"],nt=["clear","getItem","iterate","key","keys","length","removeItem","setItem"].concat(tt),it={description:"",driver:et.slice(),name:"localforage",size:4980736,storeName:"keyvaluepairs",version:1};function st(e,t){e[t]=function(){var n=arguments;return e.ready().then((function(){return e[t].apply(e,n)}))}}function rt(){for(var e=1;e<arguments.length;e++){var t=arguments[e];if(t)for(var n in t)t.hasOwnProperty(n)&&(Je(t[n])?arguments[0][n]=t[n].slice():arguments[0][n]=t[n])}return arguments[0]}var ot=new(function(){function e(t){for(var n in s(this,e),$e)if($e.hasOwnProperty(n)){var i=$e[n],r=i._driver;this[n]=r,Qe[r]||this.defineDriver(i)}this._defaultConfig=rt({},it),this._config=rt({},this._defaultConfig,t),this._driverSet=null,this._initDriver=null,this._ready=!1,this._dbInfo=null,this._wrapLibraryMethodsWithReady(),this.setDriver(this._config.driver).catch((function(){}))}return e.prototype.config=function(e){if("object"===(void 0===e?"undefined":i(e))){if(this._ready)return new Error("Can't call config() after localforage has been used.");for(var t in e){if("storeName"===t&&(e[t]=e[t].replace(/\W/g,"_")),"version"===t&&"number"!=typeof e[t])return new Error("Database version must be a number.");this._config[t]=e[t]}return!("driver"in e)||!e.driver||this.setDriver(this._config.driver)}return"string"==typeof e?this._config[e]:this._config},e.prototype.defineDriver=function(e,t,n){var i=new c((function(t,n){try{var i=e._driver,s=new Error("Custom driver not compliant; see https://mozilla.github.io/localForage/#definedriver");if(!e._driver)return void n(s);for(var r=nt.concat("_initStorage"),o=0,a=r.length;o<a;o++){var l=r[o];if((!je(tt,l)||e[l])&&"function"!=typeof e[l])return void n(s)}!function(){for(var t=function(e){return function(){var t=new Error("Method "+e+" is not implemented by the current driver"),n=c.reject(t);return h(n,arguments[arguments.length-1]),n}},n=0,i=tt.length;n<i;n++){var s=tt[n];e[s]||(e[s]=t(s))}}();var d=function(n){Qe[i]&&console.info("Redefining LocalForage driver: "+i),Qe[i]=e,qe[i]=n,t()};"_support"in e?e._support&&"function"==typeof e._support?e._support().then(d,n):d(!!e._support):d(!0)}catch(e){n(e)}}));return d(i,t,n),i},e.prototype.driver=function(){return this._driver||null},e.prototype.getDriver=function(e,t,n){var i=Qe[e]?c.resolve(Qe[e]):c.reject(new Error("Driver not found."));return d(i,t,n),i},e.prototype.getSerializer=function(e){var t=c.resolve(ye);return d(t,e),t},e.prototype.ready=function(e){var t=this,n=t._driverSet.then((function(){return null===t._ready&&(t._ready=t._initDriver()),t._ready}));return d(n,e,e),n},e.prototype.setDriver=function(e,t,n){var i=this;Je(e)||(e=[e]);var s=this._getSupportedDrivers(e);function r(){i._config.driver=i.driver()}function o(e){return i._extend(e),r(),i._ready=i._initStorage(i._config),i._ready}function a(e){return function(){var t=0;function n(){for(;t<e.length;){var s=e[t];return t++,i._dbInfo=null,i._ready=null,i.getDriver(s).then(o).catch(n)}r();var a=new Error("No available storage method found.");return i._driverSet=c.reject(a),i._driverSet}return n()}}var l=null!==this._driverSet?this._driverSet.catch((function(){return c.resolve()})):c.resolve();return this._driverSet=l.then((function(){var e=s[0];return i._dbInfo=null,i._ready=null,i.getDriver(e).then((function(e){i._driver=e._driver,r(),i._wrapLibraryMethodsWithReady(),i._initDriver=a(s)}))})).catch((function(){r();var e=new Error("No available storage method found.");return i._driverSet=c.reject(e),i._driverSet})),d(this._driverSet,t,n),this._driverSet},e.prototype.supports=function(e){return!!qe[e]},e.prototype._extend=function(e){rt(this,e)},e.prototype._getSupportedDrivers=function(e){for(var t=[],n=0,i=e.length;n<i;n++){var s=e[n];this.supports(s)&&t.push(s)}return t},e.prototype._wrapLibraryMethodsWithReady=function(){for(var e=0,t=nt.length;e<t;e++)st(this,nt[e])},e.prototype.createInstance=function(t){return new e(t)},e}());t.exports=ot},{3:3}]},{},[4])(4)}));class NL{constructor(e){this.name="EXT_mesh_gpu_instancing",this.parser=e}createNodeMesh(e){const t=this.parser.json.nodes[e];if(!t.extensions||!t.extensions[this.name]||void 0===t.mesh)return null;const n=t.extensions[this.name].attributes,i=[],s={};for(const e in n)i.push(this.parser.getDependency("accessor",n[e]).then((t=>(s[e]=t,s[e]))));return i.length<1?null:(i.push(this.parser.createNodeMesh(e)),Promise.all(i).then((e=>{const t=e.pop(),n=t.isGroup?t.children:[t],i=e[0].count,r=[];for(const e of n){const t=e.matrix.clone(),n=e.position.clone().set(0,0,0),o=e.quaternion.clone().set(0,0,0,1),a=e.scale.clone().set(1,1,1),l=new Kl(e.geometry,e.material,i);for(let e=0;e<i;e++)s.TRANSLATION&&n.fromBufferAttribute(s.TRANSLATION,e),s.ROTATION&&o.fromBufferAttribute(s.ROTATION,e),s.SCALE&&a.fromBufferAttribute(s.SCALE,e),l.setMatrixAt(e,t.compose(n,o,a));for(const t in s)"TRANSLATION"!==t&&"ROTATION"!==t&&"SCALE"!==t&&e.geometry.setAttribute(t,s[t]);as.prototype.copy.call(l,e),l.frustumCulled=!1,this.parser.assignFinalMaterial(l),r.push(l)}if(t.isGroup){for(;t.children.length>0;)t.remove(t.children[0]);for(const e of r)t.add(e);return t}return r[0]})))}}const VL=()=>{self.noCompressWorker=function(e,t){const[n]=new Uint32Array(e,t,1),i={byteOffset:t+=4,length:3*n},s={byteOffset:t+=3*n*4,length:2*n},r={byteOffset:t+=2*n*4,length:4*n},o={byteOffset:t+=4*n*1,length:3*n};t+=3*n*1;let a=(r.length+o.length)%4;a>0&&(a=4-a,t+=a);const l=new Uint32Array(e,t,1);t+=4;const[c]=l,h={byteOffset:t,length:c};t+=4*c;const d=new Uint32Array(e,t,1);t+=4;const[u]=d,p=[];if(u>0)for(let n=0;n<u;n++){const[n]=new Uint32Array(e,t,1);t+=4;const[i]=new Uint32Array(e,t,1);t+=4;const[s]=new Uint32Array(e,t,1);t+=4;const[r]=new Uint32Array(e,t,1);t+=4;const o=new Uint8Array(e,t,r);t+=r;const a=(new TextDecoder).decode(o);p.push({start:n,count:i,uuid:a,alphaMode:s})}return{buffer:e,position:i,normal:o,color:r,texcoord:s,indice:h,sub_mesh:p}}},DL=()=>{self.gzipCompressWorker=function(e){const t=new Uint8Array(e,4,e.byteLength-4),n=new pako.Inflate;n.push(t,!0);const{result:i}=n;if(i instanceof Uint8Array){const{buffer:e}=i;let t=0;const[n]=new Uint32Array(e,t,1);t+=4;const s={byteOffset:t,length:3*n};t+=3*n*4;const r={byteOffset:t,length:2*n};t+=2*n*4;const o={byteOffset:t,length:4*n};t+=4*n*1;const a={byteOffset:t,length:3*n};t+=3*n*1;let l=(o.length+a.length)%4;l>0&&(l=4-l,t+=l);const c=new Uint32Array(e,t,1);t+=4;const[h]=c,d={byteOffset:t,length:h};t+=4*h;const u=new Uint32Array(e,t,1);t+=4;const[p]=u,m=[];if(p>0)for(let n=0;n<p;n++){const[n]=new Uint32Array(e,t,1);t+=4;const[i]=new Uint32Array(e,t,1);t+=4;const[s]=new Uint32Array(e,t,1);t+=4;const[r]=new Uint32Array(e,t,1);t+=4;const o=new Uint8Array(e,t,r);t+=r;const a=(new TextDecoder).decode(o);m.push({start:n,count:i,uuid:a,alphaMode:s})}return{buffer:e,position:s,normal:a,color:o,texcoord:r,indice:d,sub_mesh:m}}}},BL=()=>{self.parseChunkWorker=function(e){let t=0;const n=new Int8Array(e,t,128);t+=128,(new TextDecoder).decode(n.slice(0,4));const[i]=n.slice(4,8);if(0===i)return self.noCompressWorker(e,t);if(1===i){const t=e.slice(128);return self.gzipCompressWorker(t)}throw new Error("unknown compress mode [ .sbmx model ]")}},HL="\n onmessage = function ( e ) {\n \n const message = e.data\n\n switch ( message.type ) {\n\n case 'decode': {\n\n const chunkInfo = self.parseChunkWorker( message.data )\n\n if ( chunkInfo ) { \n\n self.postMessage( \n { type: 'decode', data: chunkInfo, }, \n [ chunkInfo.buffer ]\n )\n\n } else {\n\n self.postMessage( { type: 'decode', data: {}, } )\n\n }\n\n break\n \n }\n \n }\n\n }\n\n";class kL extends fd{constructor(e){super(),this.store=e,this.loadedTextures=new Map,this.loadedMaterialsMap=new Map,this.defaultMaterial=new kh({name:"defaultDatMaterial",color:0}),this.loadedMaterials=[this.defaultMaterial],this.dracoDecoderPath=null,this.workerPool=new Dy(4),this.workerSourceURL="";const t=this._initWorkerCreator();this.workerPool.setWorkerCreator(t)}parseAsync(e,t){return rf(this,void 0,void 0,(function*(){const[n]=yield Promise.allSettled([this._decodeBuffer(e,t),this._createMaterial(t)]);if("fulfilled"===n.status&&n.value){const e=qm(t),i=this._createMesh(n.value,e),s=new qa;return s.add(i),s}}))}_decodeBuffer(e,t){return rf(this,void 0,void 0,(function*(){const n=yield this.store.getItem(`${t}_object`);if(n)return n;const[{data:i}]=yield Promise.all([this.workerPool.postMessage({type:"decode",data:e},[e])]);if(i){const{type:e,data:n}=null!=i?i:{};if("decode"===e&&n){const{buffer:{byteLength:e}}=n;return ig(e)&&e/1024/1024<=500&&ff((()=>{this.store.setItem(`${t}_object`,n)})),n}}}))}_initWorkerCreator(){if(!this.workerSourceURL){const e=VL.toString(),t=DL.toString(),n=BL.toString(),i=["/* dat decoder */",["/* pako */","\n\n(function (global, factory) {\n typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :\n typeof define === 'function' && define.amd ? define(['exports'], factory) :\n (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.pako = {}));\n}(this, (function (exports) { 'use strict';\n\n // Note: adler32 takes 12% for level 0 and 2% for level 6.\n // It isn't worth it to make additional optimizations as in original.\n // Small size is preferable.\n\n // (C) 1995-2013 Jean-loup Gailly and Mark Adler\n // (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n //\n // This software is provided 'as-is', without any express ofr implied\n // warranty. In no event will the authors be held liable for any damages\n // arising from the use of this software.\n //\n // Permission is granted to anyone to use this software for any purpose,\n // including commercial applications, and to alter it and redistribute it\n // freely, subject to the following restrictions:\n //\n // 1. The origin of this software must not be misrepresented; you must not\n // claim that you wrote the original software. If you use this software\n // in a product, an acknowledgment in the product documentation would be\n // appreciated but is not required.\n // 2. Altered source versions must be plainly marked as such, and must not be\n // misrepresented as being the original software.\n // 3. This notice may not be removed or altered from any source distribution.\n\n const adler32 = (adler, buf, len, pos) => {\n let s1 = (adler & 0xffff) |0,\n s2 = ((adler >>> 16) & 0xffff) |0,\n n = 0;\n\n while (len !== 0) {\n // Set limit ~ twice less than 5552, to keep\n // s2 in 31-bits, because we force signed ints.\n // in other case %= will fail.\n n = len > 2000 ? 2000 : len;\n len -= n;\n\n do {\n s1 = (s1 + buf[pos++]) |0;\n s2 = (s2 + s1) |0;\n } while (--n);\n\n s1 %= 65521;\n s2 %= 65521;\n }\n\n return (s1 | (s2 << 16)) |0;\n };\n\n\n var adler32_1 = adler32;\n\n // Note: we can't get significant speed boost here.\n // So write code to minimize size - no pregenerated tables\n // and array tools dependencies.\n\n // (C) 1995-2013 Jean-loup Gailly and Mark Adler\n // (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n //\n // This software is provided 'as-is', without any express or implied\n // warranty. In no event will the authors be held liable for any damages\n // arising from the use of this software.\n //\n // Permission is granted to anyone to use this software for any purpose,\n // including commercial applications, and to alter it and redistribute it\n // freely, subject to the following restrictions:\n //\n // 1. The origin of this software must not be misrepresented; you must not\n // claim that you wrote the original software. If you use this software\n // in a product, an acknowledgment in the product documentation would be\n // appreciated but is not required.\n // 2. Altered source versions must be plainly marked as such, and must not be\n // misrepresented as being the original software.\n // 3. This notice may not be removed or altered from any source distribution.\n\n // Use ordinary array, since untyped makes no boost here\n const makeTable = () => {\n let c, table = [];\n\n for (var n = 0; n < 256; n++) {\n c = n;\n for (var k = 0; k < 8; k++) {\n c = ((c & 1) ? (0xEDB88320 ^ (c >>> 1)) : (c >>> 1));\n }\n table[n] = c;\n }\n\n return table;\n };\n\n // Create table on load. Just 255 signed longs. Not a problem.\n const crcTable = new Uint32Array(makeTable());\n\n\n const crc32 = (crc, buf, len, pos) => {\n const t = crcTable;\n const end = pos + len;\n\n crc ^= -1;\n\n for (let i = pos; i < end; i++) {\n crc = (crc >>> 8) ^ t[(crc ^ buf[i]) & 0xFF];\n }\n\n return (crc ^ (-1)); // >>> 0;\n };\n\n\n var crc32_1 = crc32;\n\n // (C) 1995-2013 Jean-loup Gailly and Mark Adler\n // (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n //\n // This software is provided 'as-is', without any express or implied\n // warranty. In no event will the authors be held liable for any damages\n // arising from the use of this software.\n //\n // Permission is granted to anyone to use this software for any purpose,\n // including commercial applications, and to alter it and redistribute it\n // freely, subject to the following restrictions:\n //\n // 1. The origin of this software must not be misrepresented; you must not\n // claim that you wrote the original software. If you use this software\n // in a product, an acknowledgment in the product documentation would be\n // appreciated but is not required.\n // 2. Altered source versions must be plainly marked as such, and must not be\n // misrepresented as being the original software.\n // 3. This notice may not be removed or altered from any source distribution.\n\n // See state defs from inflate.js\n const BAD$1 = 30; /* got a data error -- remain here until reset */\n const TYPE$1 = 12; /* i: waiting for type bits, including last-flag bit */\n\n /*\n Decode literal, length, and distance codes and write out the resulting\n literal and match bytes until either not enough input or output is\n available, an end-of-block is encountered, or a data error is encountered.\n When large enough input and output buffers are supplied to inflate(), for\n example, a 16K input buffer and a 64K output buffer, more than 95% of the\n inflate execution time is spent in this routine.\n\n Entry assumptions:\n\n state.mode === LEN\n strm.avail_in >= 6\n strm.avail_out >= 258\n start >= strm.avail_out\n state.bits < 8\n\n On return, state.mode is one of:\n\n LEN -- ran out of enough output space or enough available input\n TYPE -- reached end of block code, inflate() to interpret next block\n BAD -- error in block data\n\n Notes:\n\n - The maximum input bits used by a length/distance pair is 15 bits for the\n length code, 5 bits for the length extra, 15 bits for the distance code,\n and 13 bits for the distance extra. This totals 48 bits, or six bytes.\n Therefore if strm.avail_in >= 6, then there is enough input to avoid\n checking for available input while decoding.\n\n - The maximum bytes that a single length/distance pair can output is 258\n bytes, which is the maximum length that can be coded. inflate_fast()\n requires strm.avail_out >= 258 for each loop to avoid checking for\n output space.\n */\n var inffast = function inflate_fast(strm, start) {\n let _in; /* local strm.input */\n let last; /* have enough input while in < last */\n let _out; /* local strm.output */\n let beg; /* inflate()'s initial strm.output */\n let end; /* while out < end, enough space available */\n //#ifdef INFLATE_STRICT\n let dmax; /* maximum distance from zlib header */\n //#endif\n let wsize; /* window size or zero if not using window */\n let whave; /* valid bytes in the window */\n let wnext; /* window write index */\n // Use `s_window` instead `window`, avoid conflict with instrumentation tools\n let s_window; /* allocated sliding window, if wsize != 0 */\n let hold; /* local strm.hold */\n let bits; /* local strm.bits */\n let lcode; /* local strm.lencode */\n let dcode; /* local strm.distcode */\n let lmask; /* mask for first level of length codes */\n let dmask; /* mask for first level of distance codes */\n let here; /* retrieved table entry */\n let op; /* code bits, operation, extra bits, or */\n /* window position, window bytes to copy */\n let len; /* match length, unused bytes */\n let dist; /* match distance */\n let from; /* where to copy match from */\n let from_source;\n\n\n let input, output; // JS specific, because we have no pointers\n\n /* copy state to local variables */\n const state = strm.state;\n //here = state.here;\n _in = strm.next_in;\n input = strm.input;\n last = _in + (strm.avail_in - 5);\n _out = strm.next_out;\n output = strm.output;\n beg = _out - (start - strm.avail_out);\n end = _out + (strm.avail_out - 257);\n //#ifdef INFLATE_STRICT\n dmax = state.dmax;\n //#endif\n wsize = state.wsize;\n whave = state.whave;\n wnext = state.wnext;\n s_window = state.window;\n hold = state.hold;\n bits = state.bits;\n lcode = state.lencode;\n dcode = state.distcode;\n lmask = (1 << state.lenbits) - 1;\n dmask = (1 << state.distbits) - 1;\n\n\n /* decode literals and length/distances until end-of-block or not enough\n input data or output space */\n\n top:\n do {\n if (bits < 15) {\n hold += input[_in++] << bits;\n bits += 8;\n hold += input[_in++] << bits;\n bits += 8;\n }\n\n here = lcode[hold & lmask];\n\n dolen:\n for (;;) { // Goto emulation\n op = here >>> 24/*here.bits*/;\n hold >>>= op;\n bits -= op;\n op = (here >>> 16) & 0xff/*here.op*/;\n if (op === 0) { /* literal */\n //Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ?\n // \"inflate: literal '%c'\" :\n // \"inflate: literal 0x%02x\", here.val));\n output[_out++] = here & 0xffff/*here.val*/;\n }\n else if (op & 16) { /* length base */\n len = here & 0xffff/*here.val*/;\n op &= 15; /* number of extra bits */\n if (op) {\n if (bits < op) {\n hold += input[_in++] << bits;\n bits += 8;\n }\n len += hold & ((1 << op) - 1);\n hold >>>= op;\n bits -= op;\n }\n //Tracevv((stderr, \"inflate: length %u\", len));\n if (bits < 15) {\n hold += input[_in++] << bits;\n bits += 8;\n hold += input[_in++] << bits;\n bits += 8;\n }\n here = dcode[hold & dmask];\n\n dodist:\n for (;;) { // goto emulation\n op = here >>> 24/*here.bits*/;\n hold >>>= op;\n bits -= op;\n op = (here >>> 16) & 0xff/*here.op*/;\n\n if (op & 16) { /* distance base */\n dist = here & 0xffff/*here.val*/;\n op &= 15; /* number of extra bits */\n if (bits < op) {\n hold += input[_in++] << bits;\n bits += 8;\n if (bits < op) {\n hold += input[_in++] << bits;\n bits += 8;\n }\n }\n dist += hold & ((1 << op) - 1);\n //#ifdef INFLATE_STRICT\n if (dist > dmax) {\n strm.msg = 'invalid distance too far back';\n state.mode = BAD$1;\n break top;\n }\n //#endif\n hold >>>= op;\n bits -= op;\n //Tracevv((stderr, \"inflate: distance %u\", dist));\n op = _out - beg; /* max distance in output */\n if (dist > op) { /* see if copy from window */\n op = dist - op; /* distance back in window */\n if (op > whave) {\n if (state.sane) {\n strm.msg = 'invalid distance too far back';\n state.mode = BAD$1;\n break top;\n }\n\n // (!) This block is disabled in zlib defaults,\n // don't enable it for binary compatibility\n //#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR\n // if (len <= op - whave) {\n // do {\n // output[_out++] = 0;\n // } while (--len);\n // continue top;\n // }\n // len -= op - whave;\n // do {\n // output[_out++] = 0;\n // } while (--op > whave);\n // if (op === 0) {\n // from = _out - dist;\n // do {\n // output[_out++] = output[from++];\n // } while (--len);\n // continue top;\n // }\n //#endif\n }\n from = 0; // window index\n from_source = s_window;\n if (wnext === 0) { /* very common case */\n from += wsize - op;\n if (op < len) { /* some from window */\n len -= op;\n do {\n output[_out++] = s_window[from++];\n } while (--op);\n from = _out - dist; /* rest from output */\n from_source = output;\n }\n }\n else if (wnext < op) { /* wrap around window */\n from += wsize + wnext - op;\n op -= wnext;\n if (op < len) { /* some from end of window */\n len -= op;\n do {\n output[_out++] = s_window[from++];\n } while (--op);\n from = 0;\n if (wnext < len) { /* some from start of window */\n op = wnext;\n len -= op;\n do {\n output[_out++] = s_window[from++];\n } while (--op);\n from = _out - dist; /* rest from output */\n from_source = output;\n }\n }\n }\n else { /* contiguous in window */\n from += wnext - op;\n if (op < len) { /* some from window */\n len -= op;\n do {\n output[_out++] = s_window[from++];\n } while (--op);\n from = _out - dist; /* rest from output */\n from_source = output;\n }\n }\n while (len > 2) {\n output[_out++] = from_source[from++];\n output[_out++] = from_source[from++];\n output[_out++] = from_source[from++];\n len -= 3;\n }\n if (len) {\n output[_out++] = from_source[from++];\n if (len > 1) {\n output[_out++] = from_source[from++];\n }\n }\n }\n else {\n from = _out - dist; /* copy direct from output */\n do { /* minimum length is three */\n output[_out++] = output[from++];\n output[_out++] = output[from++];\n output[_out++] = output[from++];\n len -= 3;\n } while (len > 2);\n if (len) {\n output[_out++] = output[from++];\n if (len > 1) {\n output[_out++] = output[from++];\n }\n }\n }\n }\n else if ((op & 64) === 0) { /* 2nd level distance code */\n here = dcode[(here & 0xffff)/*here.val*/ + (hold & ((1 << op) - 1))];\n continue dodist;\n }\n else {\n strm.msg = 'invalid distance code';\n state.mode = BAD$1;\n break top;\n }\n\n break; // need to emulate goto via \"continue\"\n }\n }\n else if ((op & 64) === 0) { /* 2nd level length code */\n here = lcode[(here & 0xffff)/*here.val*/ + (hold & ((1 << op) - 1))];\n continue dolen;\n }\n else if (op & 32) { /* end-of-block */\n //Tracevv((stderr, \"inflate: end of block\"));\n state.mode = TYPE$1;\n break top;\n }\n else {\n strm.msg = 'invalid literal/length code';\n state.mode = BAD$1;\n break top;\n }\n\n break; // need to emulate goto via \"continue\"\n }\n } while (_in < last && _out < end);\n\n /* return unused bytes (on entry, bits < 8, so in won't go too far back) */\n len = bits >> 3;\n _in -= len;\n bits -= len << 3;\n hold &= (1 << bits) - 1;\n\n /* update state and return */\n strm.next_in = _in;\n strm.next_out = _out;\n strm.avail_in = (_in < last ? 5 + (last - _in) : 5 - (_in - last));\n strm.avail_out = (_out < end ? 257 + (end - _out) : 257 - (_out - end));\n state.hold = hold;\n state.bits = bits;\n return;\n };\n\n // (C) 1995-2013 Jean-loup Gailly and Mark Adler\n // (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n //\n // This software is provided 'as-is', without any express or implied\n // warranty. In no event will the authors be held liable for any damages\n // arising from the use of this software.\n //\n // Permission is granted to anyone to use this software for any purpose,\n // including commercial applications, and to alter it and redistribute it\n // freely, subject to the following restrictions:\n //\n // 1. The origin of this software must not be misrepresented; you must not\n // claim that you wrote the original software. If you use this software\n // in a product, an acknowledgment in the product documentation would be\n // appreciated but is not required.\n // 2. Altered source versions must be plainly marked as such, and must not be\n // misrepresented as being the original software.\n // 3. This notice may not be removed or altered from any source distribution.\n\n const MAXBITS = 15;\n const ENOUGH_LENS$1 = 852;\n const ENOUGH_DISTS$1 = 592;\n //const ENOUGH = (ENOUGH_LENS+ENOUGH_DISTS);\n\n const CODES$1 = 0;\n const LENS$1 = 1;\n const DISTS$1 = 2;\n\n const lbase = new Uint16Array([ /* Length codes 257..285 base */\n 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31,\n 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0\n ]);\n\n const lext = new Uint8Array([ /* Length codes 257..285 extra */\n 16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18,\n 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 72, 78\n ]);\n\n const dbase = new Uint16Array([ /* Distance codes 0..29 base */\n 1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193,\n 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145,\n 8193, 12289, 16385, 24577, 0, 0\n ]);\n\n const dext = new Uint8Array([ /* Distance codes 0..29 extra */\n 16, 16, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22,\n 23, 23, 24, 24, 25, 25, 26, 26, 27, 27,\n 28, 28, 29, 29, 64, 64\n ]);\n\n const inflate_table = (type, lens, lens_index, codes, table, table_index, work, opts) =>\n {\n const bits = opts.bits;\n //here = opts.here; /* table entry for duplication */\n\n let len = 0; /* a code's length in bits */\n let sym = 0; /* index of code symbols */\n let min = 0, max = 0; /* minimum and maximum code lengths */\n let root = 0; /* number of index bits for root table */\n let curr = 0; /* number of index bits for current table */\n let drop = 0; /* code bits to drop for sub-table */\n let left = 0; /* number of prefix codes available */\n let used = 0; /* code entries in table used */\n let huff = 0; /* Huffman code */\n let incr; /* for incrementing code, index */\n let fill; /* index for replicating entries */\n let low; /* low bits for current root entry */\n let mask; /* mask for low root bits */\n let next; /* next available space in table */\n let base = null; /* base value table to use */\n let base_index = 0;\n // let shoextra; /* extra bits table to use */\n let end; /* use base and extra for symbol > end */\n const count = new Uint16Array(MAXBITS + 1); //[MAXBITS+1]; /* number of codes of each length */\n const offs = new Uint16Array(MAXBITS + 1); //[MAXBITS+1]; /* offsets in table for each length */\n let extra = null;\n let extra_index = 0;\n\n let here_bits, here_op, here_val;\n\n /*\n Process a set of code lengths to create a canonical Huffman code. The\n code lengths are lens[0..codes-1]. Each length corresponds to the\n symbols 0..codes-1. The Huffman code is generated by first sorting the\n symbols by length from short to long, and retaining the symbol order\n for codes with equal lengths. Then the code starts with all zero bits\n for the first code of the shortest length, and the codes are integer\n increments for the same length, and zeros are appended as the length\n increases. For the deflate format, these bits are stored backwards\n from their more natural integer increment ordering, and so when the\n decoding tables are built in the large loop below, the integer codes\n are incremented backwards.\n\n This routine assumes, but does not check, that all of the entries in\n lens[] are in the range 0..MAXBITS. The caller must assure this.\n 1..MAXBITS is interpreted as that code length. zero means that that\n symbol does not occur in this code.\n\n The codes are sorted by computing a count of codes for each length,\n creating from that a table of starting indices for each length in the\n sorted table, and then entering the symbols in order in the sorted\n table. The sorted table is work[], with that space being provided by\n the caller.\n\n The length counts are used for other purposes as well, i.e. finding\n the minimum and maximum length codes, determining if there are any\n codes at all, checking for a valid set of lengths, and looking ahead\n at length counts to determine sub-table sizes when building the\n decoding tables.\n */\n\n /* accumulate lengths for codes (assumes lens[] all in 0..MAXBITS) */\n for (len = 0; len <= MAXBITS; len++) {\n count[len] = 0;\n }\n for (sym = 0; sym < codes; sym++) {\n count[lens[lens_index + sym]]++;\n }\n\n /* bound code lengths, force root to be within code lengths */\n root = bits;\n for (max = MAXBITS; max >= 1; max--) {\n if (count[max] !== 0) { break; }\n }\n if (root > max) {\n root = max;\n }\n if (max === 0) { /* no symbols to code at all */\n //table.op[opts.table_index] = 64; //here.op = (var char)64; /* invalid code marker */\n //table.bits[opts.table_index] = 1; //here.bits = (var char)1;\n //table.val[opts.table_index++] = 0; //here.val = (var short)0;\n table[table_index++] = (1 << 24) | (64 << 16) | 0;\n\n\n //table.op[opts.table_index] = 64;\n //table.bits[opts.table_index] = 1;\n //table.val[opts.table_index++] = 0;\n table[table_index++] = (1 << 24) | (64 << 16) | 0;\n\n opts.bits = 1;\n return 0; /* no symbols, but wait for decoding to report error */\n }\n for (min = 1; min < max; min++) {\n if (count[min] !== 0) { break; }\n }\n if (root < min) {\n root = min;\n }\n\n /* check for an over-subscribed or incomplete set of lengths */\n left = 1;\n for (len = 1; len <= MAXBITS; len++) {\n left <<= 1;\n left -= count[len];\n if (left < 0) {\n return -1;\n } /* over-subscribed */\n }\n if (left > 0 && (type === CODES$1 || max !== 1)) {\n return -1; /* incomplete set */\n }\n\n /* generate offsets into symbol table for each length for sorting */\n offs[1] = 0;\n for (len = 1; len < MAXBITS; len++) {\n offs[len + 1] = offs[len] + count[len];\n }\n\n /* sort symbols by length, by symbol order within each length */\n for (sym = 0; sym < codes; sym++) {\n if (lens[lens_index + sym] !== 0) {\n work[offs[lens[lens_index + sym]]++] = sym;\n }\n }\n\n /*\n Create and fill in decoding tables. In this loop, the table being\n filled is at next and has curr index bits. The code being used is huff\n with length len. That code is converted to an index by dropping drop\n bits off of the bottom. For codes where len is less than drop + curr,\n those top drop + curr - len bits are incremented through all values to\n fill the table with replicated entries.\n\n root is the number of index bits for the root table. When len exceeds\n root, sub-tables are created pointed to by the root entry with an index\n of the low root bits of huff. This is saved in low to check for when a\n new sub-table should be started. drop is zero when the root table is\n being filled, and drop is root when sub-tables are being filled.\n\n When a new sub-table is needed, it is necessary to look ahead in the\n code lengths to determine what size sub-table is needed. The length\n counts are used for this, and so count[] is decremented as codes are\n entered in the tables.\n\n used keeps track of how many table entries have been allocated from the\n provided *table space. It is checked for LENS and DIST tables against\n the constants ENOUGH_LENS and ENOUGH_DISTS to guard against changes in\n the initial root table size constants. See the comments in inftrees.h\n for more information.\n\n sym increments through all symbols, and the loop terminates when\n all codes of length max, i.e. all codes, have been processed. This\n routine permits incomplete codes, so another loop after this one fills\n in the rest of the decoding tables with invalid code markers.\n */\n\n /* set up for code type */\n // poor man optimization - use if-else instead of switch,\n // to avoid deopts in old v8\n if (type === CODES$1) {\n base = extra = work; /* dummy value--not used */\n end = 19;\n\n } else if (type === LENS$1) {\n base = lbase;\n base_index -= 257;\n extra = lext;\n extra_index -= 257;\n end = 256;\n\n } else { /* DISTS */\n base = dbase;\n extra = dext;\n end = -1;\n }\n\n /* initialize opts for loop */\n huff = 0; /* starting code */\n sym = 0; /* starting code symbol */\n len = min; /* starting code length */\n next = table_index; /* current table to fill in */\n curr = root; /* current table index bits */\n drop = 0; /* current bits to drop from code for index */\n low = -1; /* trigger new sub-table when len > root */\n used = 1 << root; /* use root table entries */\n mask = used - 1; /* mask for comparing low */\n\n /* check available table space */\n if ((type === LENS$1 && used > ENOUGH_LENS$1) ||\n (type === DISTS$1 && used > ENOUGH_DISTS$1)) {\n return 1;\n }\n\n /* process all codes and make table entries */\n for (;;) {\n /* create table entry */\n here_bits = len - drop;\n if (work[sym] < end) {\n here_op = 0;\n here_val = work[sym];\n }\n else if (work[sym] > end) {\n here_op = extra[extra_index + work[sym]];\n here_val = base[base_index + work[sym]];\n }\n else {\n here_op = 32 + 64; /* end of block */\n here_val = 0;\n }\n\n /* replicate for those indices with low len bits equal to huff */\n incr = 1 << (len - drop);\n fill = 1 << curr;\n min = fill; /* save offset to next table */\n do {\n fill -= incr;\n table[next + (huff >> drop) + fill] = (here_bits << 24) | (here_op << 16) | here_val |0;\n } while (fill !== 0);\n\n /* backwards increment the len-bit code huff */\n incr = 1 << (len - 1);\n while (huff & incr) {\n incr >>= 1;\n }\n if (incr !== 0) {\n huff &= incr - 1;\n huff += incr;\n } else {\n huff = 0;\n }\n\n /* go to next symbol, update count, len */\n sym++;\n if (--count[len] === 0) {\n if (len === max) { break; }\n len = lens[lens_index + work[sym]];\n }\n\n /* create new sub-table if needed */\n if (len > root && (huff & mask) !== low) {\n /* if first time, transition to sub-tables */\n if (drop === 0) {\n drop = root;\n }\n\n /* increment past last table */\n next += min; /* here min is 1 << curr */\n\n /* determine length of next table */\n curr = len - drop;\n left = 1 << curr;\n while (curr + drop < max) {\n left -= count[curr + drop];\n if (left <= 0) { break; }\n curr++;\n left <<= 1;\n }\n\n /* check for enough space */\n used += 1 << curr;\n if ((type === LENS$1 && used > ENOUGH_LENS$1) ||\n (type === DISTS$1 && used > ENOUGH_DISTS$1)) {\n return 1;\n }\n\n /* point entry in root table to sub-table */\n low = huff & mask;\n /*table.op[low] = curr;\n table.bits[low] = root;\n table.val[low] = next - opts.table_index;*/\n table[low] = (root << 24) | (curr << 16) | (next - table_index) |0;\n }\n }\n\n /* fill in remaining table entry if code is incomplete (guaranteed to have\n at most one remaining entry, since if the code is incomplete, the\n maximum code length that was allowed to get this far is one bit) */\n if (huff !== 0) {\n //table.op[next + huff] = 64; /* invalid code marker */\n //table.bits[next + huff] = len - drop;\n //table.val[next + huff] = 0;\n table[next + huff] = ((len - drop) << 24) | (64 << 16) |0;\n }\n\n /* set return parameters */\n //opts.table_index += used;\n opts.bits = root;\n return 0;\n };\n\n\n var inftrees = inflate_table;\n\n // (C) 1995-2013 Jean-loup Gailly and Mark Adler\n // (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n //\n // This software is provided 'as-is', without any express or implied\n // warranty. In no event will the authors be held liable for any damages\n // arising from the use of this software.\n //\n // Permission is granted to anyone to use this software for any purpose,\n // including commercial applications, and to alter it and redistribute it\n // freely, subject to the following restrictions:\n //\n // 1. The origin of this software must not be misrepresented; you must not\n // claim that you wrote the original software. If you use this software\n // in a product, an acknowledgment in the product documentation would be\n // appreciated but is not required.\n // 2. Altered source versions must be plainly marked as such, and must not be\n // misrepresented as being the original software.\n // 3. This notice may not be removed or altered from any source distribution.\n\n var constants$1 = {\n\n /* Allowed flush values; see deflate() and inflate() below for details */\n Z_NO_FLUSH: 0,\n Z_PARTIAL_FLUSH: 1,\n Z_SYNC_FLUSH: 2,\n Z_FULL_FLUSH: 3,\n Z_FINISH: 4,\n Z_BLOCK: 5,\n Z_TREES: 6,\n\n /* Return codes for the compression/decompression functions. Negative values\n * are errors, positive values are used for special but normal events.\n */\n Z_OK: 0,\n Z_STREAM_END: 1,\n Z_NEED_DICT: 2,\n Z_ERRNO: -1,\n Z_STREAM_ERROR: -2,\n Z_DATA_ERROR: -3,\n Z_MEM_ERROR: -4,\n Z_BUF_ERROR: -5,\n //Z_VERSION_ERROR: -6,\n\n /* compression levels */\n Z_NO_COMPRESSION: 0,\n Z_BEST_SPEED: 1,\n Z_BEST_COMPRESSION: 9,\n Z_DEFAULT_COMPRESSION: -1,\n\n\n Z_FILTERED: 1,\n Z_HUFFMAN_ONLY: 2,\n Z_RLE: 3,\n Z_FIXED: 4,\n Z_DEFAULT_STRATEGY: 0,\n\n /* Possible values of the data_type field (though see inflate()) */\n Z_BINARY: 0,\n Z_TEXT: 1,\n //Z_ASCII: 1, // = Z_TEXT (deprecated)\n Z_UNKNOWN: 2,\n\n /* The deflate compression method */\n Z_DEFLATED: 8\n //Z_NULL: null // Use -1 or null inline, depending on var type\n };\n\n // (C) 1995-2013 Jean-loup Gailly and Mark Adler\n // (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n //\n // This software is provided 'as-is', without any express or implied\n // warranty. In no event will the authors be held liable for any damages\n // arising from the use of this software.\n //\n // Permission is granted to anyone to use this software for any purpose,\n // including commercial applications, and to alter it and redistribute it\n // freely, subject to the following restrictions:\n //\n // 1. The origin of this software must not be misrepresented; you must not\n // claim that you wrote the original software. If you use this software\n // in a product, an acknowledgment in the product documentation would be\n // appreciated but is not required.\n // 2. Altered source versions must be plainly marked as such, and must not be\n // misrepresented as being the original software.\n // 3. This notice may not be removed or altered from any source distribution.\n\n\n\n\n\n\n const CODES = 0;\n const LENS = 1;\n const DISTS = 2;\n\n /* Public constants ==========================================================*/\n /* ===========================================================================*/\n\n const {\n Z_FINISH: Z_FINISH$1, Z_BLOCK, Z_TREES,\n Z_OK: Z_OK$1, Z_STREAM_END: Z_STREAM_END$1, Z_NEED_DICT: Z_NEED_DICT$1, Z_STREAM_ERROR: Z_STREAM_ERROR$1, Z_DATA_ERROR: Z_DATA_ERROR$1, Z_MEM_ERROR: Z_MEM_ERROR$1, Z_BUF_ERROR,\n Z_DEFLATED\n } = constants$1;\n\n\n /* STATES ====================================================================*/\n /* ===========================================================================*/\n\n\n const HEAD = 1; /* i: waiting for magic header */\n const FLAGS = 2; /* i: waiting for method and flags (gzip) */\n const TIME = 3; /* i: waiting for modification time (gzip) */\n const OS = 4; /* i: waiting for extra flags and operating system (gzip) */\n const EXLEN = 5; /* i: waiting for extra length (gzip) */\n const EXTRA = 6; /* i: waiting for extra bytes (gzip) */\n const NAME = 7; /* i: waiting for end of file name (gzip) */\n const COMMENT = 8; /* i: waiting for end of comment (gzip) */\n const HCRC = 9; /* i: waiting for header crc (gzip) */\n const DICTID = 10; /* i: waiting for dictionary check value */\n const DICT = 11; /* waiting for inflateSetDictionary() call */\n const TYPE = 12; /* i: waiting for type bits, including last-flag bit */\n const TYPEDO = 13; /* i: same, but skip check to exit inflate on new block */\n const STORED = 14; /* i: waiting for stored size (length and complement) */\n const COPY_ = 15; /* i/o: same as COPY below, but only first time in */\n const COPY = 16; /* i/o: waiting for input or output to copy stored block */\n const TABLE = 17; /* i: waiting for dynamic block table lengths */\n const LENLENS = 18; /* i: waiting for code length code lengths */\n const CODELENS = 19; /* i: waiting for length/lit and distance code lengths */\n const LEN_ = 20; /* i: same as LEN below, but only first time in */\n const LEN = 21; /* i: waiting for length/lit/eob code */\n const LENEXT = 22; /* i: waiting for length extra bits */\n const DIST = 23; /* i: waiting for distance code */\n const DISTEXT = 24; /* i: waiting for distance extra bits */\n const MATCH = 25; /* o: waiting for output space to copy string */\n const LIT = 26; /* o: waiting for output space to write literal */\n const CHECK = 27; /* i: waiting for 32-bit check value */\n const LENGTH = 28; /* i: waiting for 32-bit length (gzip) */\n const DONE = 29; /* finished check, done -- remain here until reset */\n const BAD = 30; /* got a data error -- remain here until reset */\n const MEM = 31; /* got an inflate() memory error -- remain here until reset */\n const SYNC = 32; /* looking for synchronization bytes to restart inflate() */\n\n /* ===========================================================================*/\n\n\n\n const ENOUGH_LENS = 852;\n const ENOUGH_DISTS = 592;\n //const ENOUGH = (ENOUGH_LENS+ENOUGH_DISTS);\n\n const MAX_WBITS = 15;\n /* 32K LZ77 window */\n const DEF_WBITS = MAX_WBITS;\n\n\n const zswap32 = (q) => {\n\n return (((q >>> 24) & 0xff) +\n ((q >>> 8) & 0xff00) +\n ((q & 0xff00) << 8) +\n ((q & 0xff) << 24));\n };\n\n\n function InflateState() {\n this.mode = 0; /* current inflate mode */\n this.last = false; /* true if processing last block */\n this.wrap = 0; /* bit 0 true for zlib, bit 1 true for gzip */\n this.havedict = false; /* true if dictionary provided */\n this.flags = 0; /* gzip header method and flags (0 if zlib) */\n this.dmax = 0; /* zlib header max distance (INFLATE_STRICT) */\n this.check = 0; /* protected copy of check value */\n this.total = 0; /* protected copy of output count */\n // TODO: may be {}\n this.head = null; /* where to save gzip header information */\n\n /* sliding window */\n this.wbits = 0; /* log base 2 of requested window size */\n this.wsize = 0; /* window size or zero if not using window */\n this.whave = 0; /* valid bytes in the window */\n this.wnext = 0; /* window write index */\n this.window = null; /* allocated sliding window, if needed */\n\n /* bit accumulator */\n this.hold = 0; /* input bit accumulator */\n this.bits = 0; /* number of bits in \"in\" */\n\n /* for string and stored block copying */\n this.length = 0; /* literal or length of data to copy */\n this.offset = 0; /* distance back to copy string from */\n\n /* for table and code decoding */\n this.extra = 0; /* extra bits needed */\n\n /* fixed and dynamic code tables */\n this.lencode = null; /* starting table for length/literal codes */\n this.distcode = null; /* starting table for distance codes */\n this.lenbits = 0; /* index bits for lencode */\n this.distbits = 0; /* index bits for distcode */\n\n /* dynamic table building */\n this.ncode = 0; /* number of code length code lengths */\n this.nlen = 0; /* number of length code lengths */\n this.ndist = 0; /* number of distance code lengths */\n this.have = 0; /* number of code lengths in lens[] */\n this.next = null; /* next available space in codes[] */\n\n this.lens = new Uint16Array(320); /* temporary storage for code lengths */\n this.work = new Uint16Array(288); /* work area for code table building */\n\n /*\n because we don't have pointers in js, we use lencode and distcode directly\n as buffers so we don't need codes\n */\n //this.codes = new Int32Array(ENOUGH); /* space for code tables */\n this.lendyn = null; /* dynamic table for length/literal codes (JS specific) */\n this.distdyn = null; /* dynamic table for distance codes (JS specific) */\n this.sane = 0; /* if false, allow invalid distance too far */\n this.back = 0; /* bits back of last unprocessed length/lit */\n this.was = 0; /* initial length of match */\n }\n\n\n const inflateResetKeep = (strm) => {\n\n if (!strm || !strm.state) { return Z_STREAM_ERROR$1; }\n const state = strm.state;\n strm.total_in = strm.total_out = state.total = 0;\n strm.msg = ''; /*Z_NULL*/\n if (state.wrap) { /* to support ill-conceived Java test suite */\n strm.adler = state.wrap & 1;\n }\n state.mode = HEAD;\n state.last = 0;\n state.havedict = 0;\n state.dmax = 32768;\n state.head = null/*Z_NULL*/;\n state.hold = 0;\n state.bits = 0;\n //state.lencode = state.distcode = state.next = state.codes;\n state.lencode = state.lendyn = new Int32Array(ENOUGH_LENS);\n state.distcode = state.distdyn = new Int32Array(ENOUGH_DISTS);\n\n state.sane = 1;\n state.back = -1;\n //Tracev((stderr, \"inflate: reset\"));\n return Z_OK$1;\n };\n\n\n const inflateReset = (strm) => {\n\n if (!strm || !strm.state) { return Z_STREAM_ERROR$1; }\n const state = strm.state;\n state.wsize = 0;\n state.whave = 0;\n state.wnext = 0;\n return inflateResetKeep(strm);\n\n };\n\n\n const inflateReset2 = (strm, windowBits) => {\n let wrap;\n\n /* get the state */\n if (!strm || !strm.state) { return Z_STREAM_ERROR$1; }\n const state = strm.state;\n\n /* extract wrap request from windowBits parameter */\n if (windowBits < 0) {\n wrap = 0;\n windowBits = -windowBits;\n }\n else {\n wrap = (windowBits >> 4) + 1;\n if (windowBits < 48) {\n windowBits &= 15;\n }\n }\n\n /* set number of window bits, free window if different */\n if (windowBits && (windowBits < 8 || windowBits > 15)) {\n return Z_STREAM_ERROR$1;\n }\n if (state.window !== null && state.wbits !== windowBits) {\n state.window = null;\n }\n\n /* update state and reset the rest of it */\n state.wrap = wrap;\n state.wbits = windowBits;\n return inflateReset(strm);\n };\n\n\n const inflateInit2 = (strm, windowBits) => {\n\n if (!strm) { return Z_STREAM_ERROR$1; }\n //strm.msg = Z_NULL; /* in case we return an error */\n\n const state = new InflateState();\n\n //if (state === Z_NULL) return Z_MEM_ERROR;\n //Tracev((stderr, \"inflate: allocated\"));\n strm.state = state;\n state.window = null/*Z_NULL*/;\n const ret = inflateReset2(strm, windowBits);\n if (ret !== Z_OK$1) {\n strm.state = null/*Z_NULL*/;\n }\n return ret;\n };\n\n\n const inflateInit = (strm) => {\n\n return inflateInit2(strm, DEF_WBITS);\n };\n\n\n /*\n Return state with length and distance decoding tables and index sizes set to\n fixed code decoding. Normally this returns fixed tables from inffixed.h.\n If BUILDFIXED is defined, then instead this routine builds the tables the\n first time it's called, and returns those tables the first time and\n thereafter. This reduces the size of the code by about 2K bytes, in\n exchange for a little execution time. However, BUILDFIXED should not be\n used for threaded applications, since the rewriting of the tables and virgin\n may not be thread-safe.\n */\n let virgin = true;\n\n let lenfix, distfix; // We have no pointers in JS, so keep tables separate\n\n\n const fixedtables = (state) => {\n\n /* build fixed huffman tables if first call (may not be thread safe) */\n if (virgin) {\n lenfix = new Int32Array(512);\n distfix = new Int32Array(32);\n\n /* literal/length table */\n let sym = 0;\n while (sym < 144) { state.lens[sym++] = 8; }\n while (sym < 256) { state.lens[sym++] = 9; }\n while (sym < 280) { state.lens[sym++] = 7; }\n while (sym < 288) { state.lens[sym++] = 8; }\n\n inftrees(LENS, state.lens, 0, 288, lenfix, 0, state.work, { bits: 9 });\n\n /* distance table */\n sym = 0;\n while (sym < 32) { state.lens[sym++] = 5; }\n\n inftrees(DISTS, state.lens, 0, 32, distfix, 0, state.work, { bits: 5 });\n\n /* do this just once */\n virgin = false;\n }\n\n state.lencode = lenfix;\n state.lenbits = 9;\n state.distcode = distfix;\n state.distbits = 5;\n };\n\n\n /*\n Update the window with the last wsize (normally 32K) bytes written before\n returning. If window does not exist yet, create it. This is only called\n when a window is already in use, or when output has been written during this\n inflate call, but the end of the deflate stream has not been reached yet.\n It is also called to create a window for dictionary data when a dictionary\n is loaded.\n\n Providing output buffers larger than 32K to inflate() should provide a speed\n advantage, since only the last 32K of output is copied to the sliding window\n upon return from inflate(), and since all distances after the first 32K of\n output will fall in the output data, making match copies simpler and faster.\n The advantage may be dependent on the size of the processor's data caches.\n */\n const updatewindow = (strm, src, end, copy) => {\n\n let dist;\n const state = strm.state;\n\n /* if it hasn't been done already, allocate space for the window */\n if (state.window === null) {\n state.wsize = 1 << state.wbits;\n state.wnext = 0;\n state.whave = 0;\n\n state.window = new Uint8Array(state.wsize);\n }\n\n /* copy state->wsize or less output bytes into the circular window */\n if (copy >= state.wsize) {\n state.window.set(src.subarray(end - state.wsize, end), 0);\n state.wnext = 0;\n state.whave = state.wsize;\n }\n else {\n dist = state.wsize - state.wnext;\n if (dist > copy) {\n dist = copy;\n }\n //zmemcpy(state->window + state->wnext, end - copy, dist);\n state.window.set(src.subarray(end - copy, end - copy + dist), state.wnext);\n copy -= dist;\n if (copy) {\n //zmemcpy(state->window, end - copy, copy);\n state.window.set(src.subarray(end - copy, end), 0);\n state.wnext = copy;\n state.whave = state.wsize;\n }\n else {\n state.wnext += dist;\n if (state.wnext === state.wsize) { state.wnext = 0; }\n if (state.whave < state.wsize) { state.whave += dist; }\n }\n }\n return 0;\n };\n\n\n const inflate$1 = (strm, flush) => {\n\n let state;\n let input, output; // input/output buffers\n let next; /* next input INDEX */\n let put; /* next output INDEX */\n let have, left; /* available input and output */\n let hold; /* bit buffer */\n let bits; /* bits in bit buffer */\n let _in, _out; /* save starting available input and output */\n let copy; /* number of stored or match bytes to copy */\n let from; /* where to copy match bytes from */\n let from_source;\n let here = 0; /* current decoding table entry */\n let here_bits, here_op, here_val; // paked \"here\" denormalized (JS specific)\n //let last; /* parent table entry */\n let last_bits, last_op, last_val; // paked \"last\" denormalized (JS specific)\n let len; /* length to copy for repeats, bits to drop */\n let ret; /* return code */\n const hbuf = new Uint8Array(4); /* buffer for gzip header crc calculation */\n let opts;\n\n let n; // temporary variable for NEED_BITS\n\n const order = /* permutation of code lengths */\n new Uint8Array([ 16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15 ]);\n\n\n if (!strm || !strm.state || !strm.output ||\n (!strm.input && strm.avail_in !== 0)) {\n return Z_STREAM_ERROR$1;\n }\n\n state = strm.state;\n if (state.mode === TYPE) { state.mode = TYPEDO; } /* skip check */\n\n\n //--- LOAD() ---\n put = strm.next_out;\n output = strm.output;\n left = strm.avail_out;\n next = strm.next_in;\n input = strm.input;\n have = strm.avail_in;\n hold = state.hold;\n bits = state.bits;\n //---\n\n _in = have;\n _out = left;\n ret = Z_OK$1;\n\n inf_leave: // goto emulation\n for (;;) {\n switch (state.mode) {\n case HEAD:\n if (state.wrap === 0) {\n state.mode = TYPEDO;\n break;\n }\n //=== NEEDBITS(16);\n while (bits < 16) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n if ((state.wrap & 2) && hold === 0x8b1f) { /* gzip header */\n state.check = 0/*crc32(0L, Z_NULL, 0)*/;\n //=== CRC2(state.check, hold);\n hbuf[0] = hold & 0xff;\n hbuf[1] = (hold >>> 8) & 0xff;\n state.check = crc32_1(state.check, hbuf, 2, 0);\n //===//\n\n //=== INITBITS();\n hold = 0;\n bits = 0;\n //===//\n state.mode = FLAGS;\n break;\n }\n state.flags = 0; /* expect zlib header */\n if (state.head) {\n state.head.done = false;\n }\n if (!(state.wrap & 1) || /* check if zlib header allowed */\n (((hold & 0xff)/*BITS(8)*/ << 8) + (hold >> 8)) % 31) {\n strm.msg = 'incorrect header check';\n state.mode = BAD;\n break;\n }\n if ((hold & 0x0f)/*BITS(4)*/ !== Z_DEFLATED) {\n strm.msg = 'unknown compression method';\n state.mode = BAD;\n break;\n }\n //--- DROPBITS(4) ---//\n hold >>>= 4;\n bits -= 4;\n //---//\n len = (hold & 0x0f)/*BITS(4)*/ + 8;\n if (state.wbits === 0) {\n state.wbits = len;\n }\n else if (len > state.wbits) {\n strm.msg = 'invalid window size';\n state.mode = BAD;\n break;\n }\n\n // !!! pako patch. Force use `options.windowBits` if passed.\n // Required to always use max window size by default.\n state.dmax = 1 << state.wbits;\n //state.dmax = 1 << len;\n\n //Tracev((stderr, \"inflate: zlib header ok\"));\n strm.adler = state.check = 1/*adler32(0L, Z_NULL, 0)*/;\n state.mode = hold & 0x200 ? DICTID : TYPE;\n //=== INITBITS();\n hold = 0;\n bits = 0;\n //===//\n break;\n case FLAGS:\n //=== NEEDBITS(16); */\n while (bits < 16) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n state.flags = hold;\n if ((state.flags & 0xff) !== Z_DEFLATED) {\n strm.msg = 'unknown compression method';\n state.mode = BAD;\n break;\n }\n if (state.flags & 0xe000) {\n strm.msg = 'unknown header flags set';\n state.mode = BAD;\n break;\n }\n if (state.head) {\n state.head.text = ((hold >> 8) & 1);\n }\n if (state.flags & 0x0200) {\n //=== CRC2(state.check, hold);\n hbuf[0] = hold & 0xff;\n hbuf[1] = (hold >>> 8) & 0xff;\n state.check = crc32_1(state.check, hbuf, 2, 0);\n //===//\n }\n //=== INITBITS();\n hold = 0;\n bits = 0;\n //===//\n state.mode = TIME;\n /* falls through */\n case TIME:\n //=== NEEDBITS(32); */\n while (bits < 32) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n if (state.head) {\n state.head.time = hold;\n }\n if (state.flags & 0x0200) {\n //=== CRC4(state.check, hold)\n hbuf[0] = hold & 0xff;\n hbuf[1] = (hold >>> 8) & 0xff;\n hbuf[2] = (hold >>> 16) & 0xff;\n hbuf[3] = (hold >>> 24) & 0xff;\n state.check = crc32_1(state.check, hbuf, 4, 0);\n //===\n }\n //=== INITBITS();\n hold = 0;\n bits = 0;\n //===//\n state.mode = OS;\n /* falls through */\n case OS:\n //=== NEEDBITS(16); */\n while (bits < 16) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n if (state.head) {\n state.head.xflags = (hold & 0xff);\n state.head.os = (hold >> 8);\n }\n if (state.flags & 0x0200) {\n //=== CRC2(state.check, hold);\n hbuf[0] = hold & 0xff;\n hbuf[1] = (hold >>> 8) & 0xff;\n state.check = crc32_1(state.check, hbuf, 2, 0);\n //===//\n }\n //=== INITBITS();\n hold = 0;\n bits = 0;\n //===//\n state.mode = EXLEN;\n /* falls through */\n case EXLEN:\n if (state.flags & 0x0400) {\n //=== NEEDBITS(16); */\n while (bits < 16) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n state.length = hold;\n if (state.head) {\n state.head.extra_len = hold;\n }\n if (state.flags & 0x0200) {\n //=== CRC2(state.check, hold);\n hbuf[0] = hold & 0xff;\n hbuf[1] = (hold >>> 8) & 0xff;\n state.check = crc32_1(state.check, hbuf, 2, 0);\n //===//\n }\n //=== INITBITS();\n hold = 0;\n bits = 0;\n //===//\n }\n else if (state.head) {\n state.head.extra = null/*Z_NULL*/;\n }\n state.mode = EXTRA;\n /* falls through */\n case EXTRA:\n if (state.flags & 0x0400) {\n copy = state.length;\n if (copy > have) { copy = have; }\n if (copy) {\n if (state.head) {\n len = state.head.extra_len - state.length;\n if (!state.head.extra) {\n // Use untyped array for more convenient processing later\n state.head.extra = new Uint8Array(state.head.extra_len);\n }\n state.head.extra.set(\n input.subarray(\n next,\n // extra field is limited to 65536 bytes\n // - no need for additional size check\n next + copy\n ),\n /*len + copy > state.head.extra_max - len ? state.head.extra_max : copy,*/\n len\n );\n //zmemcpy(state.head.extra + len, next,\n // len + copy > state.head.extra_max ?\n // state.head.extra_max - len : copy);\n }\n if (state.flags & 0x0200) {\n state.check = crc32_1(state.check, input, copy, next);\n }\n have -= copy;\n next += copy;\n state.length -= copy;\n }\n if (state.length) { break inf_leave; }\n }\n state.length = 0;\n state.mode = NAME;\n /* falls through */\n case NAME:\n if (state.flags & 0x0800) {\n if (have === 0) { break inf_leave; }\n copy = 0;\n do {\n // TODO: 2 or 1 bytes?\n len = input[next + copy++];\n /* use constant limit because in js we should not preallocate memory */\n if (state.head && len &&\n (state.length < 65536 /*state.head.name_max*/)) {\n state.head.name += String.fromCharCode(len);\n }\n } while (len && copy < have);\n\n if (state.flags & 0x0200) {\n state.check = crc32_1(state.check, input, copy, next);\n }\n have -= copy;\n next += copy;\n if (len) { break inf_leave; }\n }\n else if (state.head) {\n state.head.name = null;\n }\n state.length = 0;\n state.mode = COMMENT;\n /* falls through */\n case COMMENT:\n if (state.flags & 0x1000) {\n if (have === 0) { break inf_leave; }\n copy = 0;\n do {\n len = input[next + copy++];\n /* use constant limit because in js we should not preallocate memory */\n if (state.head && len &&\n (state.length < 65536 /*state.head.comm_max*/)) {\n state.head.comment += String.fromCharCode(len);\n }\n } while (len && copy < have);\n if (state.flags & 0x0200) {\n state.check = crc32_1(state.check, input, copy, next);\n }\n have -= copy;\n next += copy;\n if (len) { break inf_leave; }\n }\n else if (state.head) {\n state.head.comment = null;\n }\n state.mode = HCRC;\n /* falls through */\n case HCRC:\n if (state.flags & 0x0200) {\n //=== NEEDBITS(16); */\n while (bits < 16) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n if (hold !== (state.check & 0xffff)) {\n strm.msg = 'header crc mismatch';\n state.mode = BAD;\n break;\n }\n //=== INITBITS();\n hold = 0;\n bits = 0;\n //===//\n }\n if (state.head) {\n state.head.hcrc = ((state.flags >> 9) & 1);\n state.head.done = true;\n }\n strm.adler = state.check = 0;\n state.mode = TYPE;\n break;\n case DICTID:\n //=== NEEDBITS(32); */\n while (bits < 32) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n strm.adler = state.check = zswap32(hold);\n //=== INITBITS();\n hold = 0;\n bits = 0;\n //===//\n state.mode = DICT;\n /* falls through */\n case DICT:\n if (state.havedict === 0) {\n //--- RESTORE() ---\n strm.next_out = put;\n strm.avail_out = left;\n strm.next_in = next;\n strm.avail_in = have;\n state.hold = hold;\n state.bits = bits;\n //---\n return Z_NEED_DICT$1;\n }\n strm.adler = state.check = 1/*adler32(0L, Z_NULL, 0)*/;\n state.mode = TYPE;\n /* falls through */\n case TYPE:\n if (flush === Z_BLOCK || flush === Z_TREES) { break inf_leave; }\n /* falls through */\n case TYPEDO:\n if (state.last) {\n //--- BYTEBITS() ---//\n hold >>>= bits & 7;\n bits -= bits & 7;\n //---//\n state.mode = CHECK;\n break;\n }\n //=== NEEDBITS(3); */\n while (bits < 3) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n state.last = (hold & 0x01)/*BITS(1)*/;\n //--- DROPBITS(1) ---//\n hold >>>= 1;\n bits -= 1;\n //---//\n\n switch ((hold & 0x03)/*BITS(2)*/) {\n case 0: /* stored block */\n //Tracev((stderr, \"inflate: stored block%s\",\n // state.last ? \" (last)\" : \"\"));\n state.mode = STORED;\n break;\n case 1: /* fixed block */\n fixedtables(state);\n //Tracev((stderr, \"inflate: fixed codes block%s\",\n // state.last ? \" (last)\" : \"\"));\n state.mode = LEN_; /* decode codes */\n if (flush === Z_TREES) {\n //--- DROPBITS(2) ---//\n hold >>>= 2;\n bits -= 2;\n //---//\n break inf_leave;\n }\n break;\n case 2: /* dynamic block */\n //Tracev((stderr, \"inflate: dynamic codes block%s\",\n // state.last ? \" (last)\" : \"\"));\n state.mode = TABLE;\n break;\n case 3:\n strm.msg = 'invalid block type';\n state.mode = BAD;\n }\n //--- DROPBITS(2) ---//\n hold >>>= 2;\n bits -= 2;\n //---//\n break;\n case STORED:\n //--- BYTEBITS() ---// /* go to byte boundary */\n hold >>>= bits & 7;\n bits -= bits & 7;\n //---//\n //=== NEEDBITS(32); */\n while (bits < 32) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n if ((hold & 0xffff) !== ((hold >>> 16) ^ 0xffff)) {\n strm.msg = 'invalid stored block lengths';\n state.mode = BAD;\n break;\n }\n state.length = hold & 0xffff;\n //Tracev((stderr, \"inflate: stored length %u\",\n // state.length));\n //=== INITBITS();\n hold = 0;\n bits = 0;\n //===//\n state.mode = COPY_;\n if (flush === Z_TREES) { break inf_leave; }\n /* falls through */\n case COPY_:\n state.mode = COPY;\n /* falls through */\n case COPY:\n copy = state.length;\n if (copy) {\n if (copy > have) { copy = have; }\n if (copy > left) { copy = left; }\n if (copy === 0) { break inf_leave; }\n //--- zmemcpy(put, next, copy); ---\n output.set(input.subarray(next, next + copy), put);\n //---//\n have -= copy;\n next += copy;\n left -= copy;\n put += copy;\n state.length -= copy;\n break;\n }\n //Tracev((stderr, \"inflate: stored end\"));\n state.mode = TYPE;\n break;\n case TABLE:\n //=== NEEDBITS(14); */\n while (bits < 14) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n state.nlen = (hold & 0x1f)/*BITS(5)*/ + 257;\n //--- DROPBITS(5) ---//\n hold >>>= 5;\n bits -= 5;\n //---//\n state.ndist = (hold & 0x1f)/*BITS(5)*/ + 1;\n //--- DROPBITS(5) ---//\n hold >>>= 5;\n bits -= 5;\n //---//\n state.ncode = (hold & 0x0f)/*BITS(4)*/ + 4;\n //--- DROPBITS(4) ---//\n hold >>>= 4;\n bits -= 4;\n //---//\n //#ifndef PKZIP_BUG_WORKAROUND\n if (state.nlen > 286 || state.ndist > 30) {\n strm.msg = 'too many length or distance symbols';\n state.mode = BAD;\n break;\n }\n //#endif\n //Tracev((stderr, \"inflate: table sizes ok\"));\n state.have = 0;\n state.mode = LENLENS;\n /* falls through */\n case LENLENS:\n while (state.have < state.ncode) {\n //=== NEEDBITS(3);\n while (bits < 3) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n state.lens[order[state.have++]] = (hold & 0x07);//BITS(3);\n //--- DROPBITS(3) ---//\n hold >>>= 3;\n bits -= 3;\n //---//\n }\n while (state.have < 19) {\n state.lens[order[state.have++]] = 0;\n }\n // We have separate tables & no pointers. 2 commented lines below not needed.\n //state.next = state.codes;\n //state.lencode = state.next;\n // Switch to use dynamic table\n state.lencode = state.lendyn;\n state.lenbits = 7;\n\n opts = { bits: state.lenbits };\n ret = inftrees(CODES, state.lens, 0, 19, state.lencode, 0, state.work, opts);\n state.lenbits = opts.bits;\n\n if (ret) {\n strm.msg = 'invalid code lengths set';\n state.mode = BAD;\n break;\n }\n //Tracev((stderr, \"inflate: code lengths ok\"));\n state.have = 0;\n state.mode = CODELENS;\n /* falls through */\n case CODELENS:\n while (state.have < state.nlen + state.ndist) {\n for (;;) {\n here = state.lencode[hold & ((1 << state.lenbits) - 1)];/*BITS(state.lenbits)*/\n here_bits = here >>> 24;\n here_op = (here >>> 16) & 0xff;\n here_val = here & 0xffff;\n\n if ((here_bits) <= bits) { break; }\n //--- PULLBYTE() ---//\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n //---//\n }\n if (here_val < 16) {\n //--- DROPBITS(here.bits) ---//\n hold >>>= here_bits;\n bits -= here_bits;\n //---//\n state.lens[state.have++] = here_val;\n }\n else {\n if (here_val === 16) {\n //=== NEEDBITS(here.bits + 2);\n n = here_bits + 2;\n while (bits < n) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n //--- DROPBITS(here.bits) ---//\n hold >>>= here_bits;\n bits -= here_bits;\n //---//\n if (state.have === 0) {\n strm.msg = 'invalid bit length repeat';\n state.mode = BAD;\n break;\n }\n len = state.lens[state.have - 1];\n copy = 3 + (hold & 0x03);//BITS(2);\n //--- DROPBITS(2) ---//\n hold >>>= 2;\n bits -= 2;\n //---//\n }\n else if (here_val === 17) {\n //=== NEEDBITS(here.bits + 3);\n n = here_bits + 3;\n while (bits < n) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n //--- DROPBITS(here.bits) ---//\n hold >>>= here_bits;\n bits -= here_bits;\n //---//\n len = 0;\n copy = 3 + (hold & 0x07);//BITS(3);\n //--- DROPBITS(3) ---//\n hold >>>= 3;\n bits -= 3;\n //---//\n }\n else {\n //=== NEEDBITS(here.bits + 7);\n n = here_bits + 7;\n while (bits < n) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n //--- DROPBITS(here.bits) ---//\n hold >>>= here_bits;\n bits -= here_bits;\n //---//\n len = 0;\n copy = 11 + (hold & 0x7f);//BITS(7);\n //--- DROPBITS(7) ---//\n hold >>>= 7;\n bits -= 7;\n //---//\n }\n if (state.have + copy > state.nlen + state.ndist) {\n strm.msg = 'invalid bit length repeat';\n state.mode = BAD;\n break;\n }\n while (copy--) {\n state.lens[state.have++] = len;\n }\n }\n }\n\n /* handle error breaks in while */\n if (state.mode === BAD) { break; }\n\n /* check for end-of-block code (better have one) */\n if (state.lens[256] === 0) {\n strm.msg = 'invalid code -- missing end-of-block';\n state.mode = BAD;\n break;\n }\n\n /* build code tables -- note: do not change the lenbits or distbits\n values here (9 and 6) without reading the comments in inftrees.h\n concerning the ENOUGH constants, which depend on those values */\n state.lenbits = 9;\n\n opts = { bits: state.lenbits };\n ret = inftrees(LENS, state.lens, 0, state.nlen, state.lencode, 0, state.work, opts);\n // We have separate tables & no pointers. 2 commented lines below not needed.\n // state.next_index = opts.table_index;\n state.lenbits = opts.bits;\n // state.lencode = state.next;\n\n if (ret) {\n strm.msg = 'invalid literal/lengths set';\n state.mode = BAD;\n break;\n }\n\n state.distbits = 6;\n //state.distcode.copy(state.codes);\n // Switch to use dynamic table\n state.distcode = state.distdyn;\n opts = { bits: state.distbits };\n ret = inftrees(DISTS, state.lens, state.nlen, state.ndist, state.distcode, 0, state.work, opts);\n // We have separate tables & no pointers. 2 commented lines below not needed.\n // state.next_index = opts.table_index;\n state.distbits = opts.bits;\n // state.distcode = state.next;\n\n if (ret) {\n strm.msg = 'invalid distances set';\n state.mode = BAD;\n break;\n }\n //Tracev((stderr, 'inflate: codes ok'));\n state.mode = LEN_;\n if (flush === Z_TREES) { break inf_leave; }\n /* falls through */\n case LEN_:\n state.mode = LEN;\n /* falls through */\n case LEN:\n if (have >= 6 && left >= 258) {\n //--- RESTORE() ---\n strm.next_out = put;\n strm.avail_out = left;\n strm.next_in = next;\n strm.avail_in = have;\n state.hold = hold;\n state.bits = bits;\n //---\n inffast(strm, _out);\n //--- LOAD() ---\n put = strm.next_out;\n output = strm.output;\n left = strm.avail_out;\n next = strm.next_in;\n input = strm.input;\n have = strm.avail_in;\n hold = state.hold;\n bits = state.bits;\n //---\n\n if (state.mode === TYPE) {\n state.back = -1;\n }\n break;\n }\n state.back = 0;\n for (;;) {\n here = state.lencode[hold & ((1 << state.lenbits) - 1)]; /*BITS(state.lenbits)*/\n here_bits = here >>> 24;\n here_op = (here >>> 16) & 0xff;\n here_val = here & 0xffff;\n\n if (here_bits <= bits) { break; }\n //--- PULLBYTE() ---//\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n //---//\n }\n if (here_op && (here_op & 0xf0) === 0) {\n last_bits = here_bits;\n last_op = here_op;\n last_val = here_val;\n for (;;) {\n here = state.lencode[last_val +\n ((hold & ((1 << (last_bits + last_op)) - 1))/*BITS(last.bits + last.op)*/ >> last_bits)];\n here_bits = here >>> 24;\n here_op = (here >>> 16) & 0xff;\n here_val = here & 0xffff;\n\n if ((last_bits + here_bits) <= bits) { break; }\n //--- PULLBYTE() ---//\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n //---//\n }\n //--- DROPBITS(last.bits) ---//\n hold >>>= last_bits;\n bits -= last_bits;\n //---//\n state.back += last_bits;\n }\n //--- DROPBITS(here.bits) ---//\n hold >>>= here_bits;\n bits -= here_bits;\n //---//\n state.back += here_bits;\n state.length = here_val;\n if (here_op === 0) {\n //Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ?\n // \"inflate: literal '%c'\" :\n // \"inflate: literal 0x%02x\", here.val));\n state.mode = LIT;\n break;\n }\n if (here_op & 32) {\n //Tracevv((stderr, \"inflate: end of block\"));\n state.back = -1;\n state.mode = TYPE;\n break;\n }\n if (here_op & 64) {\n strm.msg = 'invalid literal/length code';\n state.mode = BAD;\n break;\n }\n state.extra = here_op & 15;\n state.mode = LENEXT;\n /* falls through */\n case LENEXT:\n if (state.extra) {\n //=== NEEDBITS(state.extra);\n n = state.extra;\n while (bits < n) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n state.length += hold & ((1 << state.extra) - 1)/*BITS(state.extra)*/;\n //--- DROPBITS(state.extra) ---//\n hold >>>= state.extra;\n bits -= state.extra;\n //---//\n state.back += state.extra;\n }\n //Tracevv((stderr, \"inflate: length %u\", state.length));\n state.was = state.length;\n state.mode = DIST;\n /* falls through */\n case DIST:\n for (;;) {\n here = state.distcode[hold & ((1 << state.distbits) - 1)];/*BITS(state.distbits)*/\n here_bits = here >>> 24;\n here_op = (here >>> 16) & 0xff;\n here_val = here & 0xffff;\n\n if ((here_bits) <= bits) { break; }\n //--- PULLBYTE() ---//\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n //---//\n }\n if ((here_op & 0xf0) === 0) {\n last_bits = here_bits;\n last_op = here_op;\n last_val = here_val;\n for (;;) {\n here = state.distcode[last_val +\n ((hold & ((1 << (last_bits + last_op)) - 1))/*BITS(last.bits + last.op)*/ >> last_bits)];\n here_bits = here >>> 24;\n here_op = (here >>> 16) & 0xff;\n here_val = here & 0xffff;\n\n if ((last_bits + here_bits) <= bits) { break; }\n //--- PULLBYTE() ---//\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n //---//\n }\n //--- DROPBITS(last.bits) ---//\n hold >>>= last_bits;\n bits -= last_bits;\n //---//\n state.back += last_bits;\n }\n //--- DROPBITS(here.bits) ---//\n hold >>>= here_bits;\n bits -= here_bits;\n //---//\n state.back += here_bits;\n if (here_op & 64) {\n strm.msg = 'invalid distance code';\n state.mode = BAD;\n break;\n }\n state.offset = here_val;\n state.extra = (here_op) & 15;\n state.mode = DISTEXT;\n /* falls through */\n case DISTEXT:\n if (state.extra) {\n //=== NEEDBITS(state.extra);\n n = state.extra;\n while (bits < n) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n state.offset += hold & ((1 << state.extra) - 1)/*BITS(state.extra)*/;\n //--- DROPBITS(state.extra) ---//\n hold >>>= state.extra;\n bits -= state.extra;\n //---//\n state.back += state.extra;\n }\n //#ifdef INFLATE_STRICT\n if (state.offset > state.dmax) {\n strm.msg = 'invalid distance too far back';\n state.mode = BAD;\n break;\n }\n //#endif\n //Tracevv((stderr, \"inflate: distance %u\", state.offset));\n state.mode = MATCH;\n /* falls through */\n case MATCH:\n if (left === 0) { break inf_leave; }\n copy = _out - left;\n if (state.offset > copy) { /* copy from window */\n copy = state.offset - copy;\n if (copy > state.whave) {\n if (state.sane) {\n strm.msg = 'invalid distance too far back';\n state.mode = BAD;\n break;\n }\n // (!) This block is disabled in zlib defaults,\n // don't enable it for binary compatibility\n //#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR\n // Trace((stderr, \"inflate.c too far\"));\n // copy -= state.whave;\n // if (copy > state.length) { copy = state.length; }\n // if (copy > left) { copy = left; }\n // left -= copy;\n // state.length -= copy;\n // do {\n // output[put++] = 0;\n // } while (--copy);\n // if (state.length === 0) { state.mode = LEN; }\n // break;\n //#endif\n }\n if (copy > state.wnext) {\n copy -= state.wnext;\n from = state.wsize - copy;\n }\n else {\n from = state.wnext - copy;\n }\n if (copy > state.length) { copy = state.length; }\n from_source = state.window;\n }\n else { /* copy from output */\n from_source = output;\n from = put - state.offset;\n copy = state.length;\n }\n if (copy > left) { copy = left; }\n left -= copy;\n state.length -= copy;\n do {\n output[put++] = from_source[from++];\n } while (--copy);\n if (state.length === 0) { state.mode = LEN; }\n break;\n case LIT:\n if (left === 0) { break inf_leave; }\n output[put++] = state.length;\n left--;\n state.mode = LEN;\n break;\n case CHECK:\n if (state.wrap) {\n //=== NEEDBITS(32);\n while (bits < 32) {\n if (have === 0) { break inf_leave; }\n have--;\n // Use '|' instead of '+' to make sure that result is signed\n hold |= input[next++] << bits;\n bits += 8;\n }\n //===//\n _out -= left;\n strm.total_out += _out;\n state.total += _out;\n if (_out) {\n strm.adler = state.check =\n /*UPDATE(state.check, put - _out, _out);*/\n (state.flags ? crc32_1(state.check, output, _out, put - _out) : adler32_1(state.check, output, _out, put - _out));\n\n }\n _out = left;\n // NB: crc32 stored as signed 32-bit int, zswap32 returns signed too\n if ((state.flags ? hold : zswap32(hold)) !== state.check) {\n strm.msg = 'incorrect data check';\n state.mode = BAD;\n break;\n }\n //=== INITBITS();\n hold = 0;\n bits = 0;\n //===//\n //Tracev((stderr, \"inflate: check matches trailer\"));\n }\n state.mode = LENGTH;\n /* falls through */\n case LENGTH:\n if (state.wrap && state.flags) {\n //=== NEEDBITS(32);\n while (bits < 32) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n if (hold !== (state.total & 0xffffffff)) {\n strm.msg = 'incorrect length check';\n state.mode = BAD;\n break;\n }\n //=== INITBITS();\n hold = 0;\n bits = 0;\n //===//\n //Tracev((stderr, \"inflate: length matches trailer\"));\n }\n state.mode = DONE;\n /* falls through */\n case DONE:\n ret = Z_STREAM_END$1;\n break inf_leave;\n case BAD:\n ret = Z_DATA_ERROR$1;\n break inf_leave;\n case MEM:\n return Z_MEM_ERROR$1;\n case SYNC:\n /* falls through */\n default:\n return Z_STREAM_ERROR$1;\n }\n }\n\n // inf_leave <- here is real place for \"goto inf_leave\", emulated via \"break inf_leave\"\n\n /*\n Return from inflate(), updating the total counts and the check value.\n If there was no progress during the inflate() call, return a buffer\n error. Call updatewindow() to create and/or update the window state.\n Note: a memory error from inflate() is non-recoverable.\n */\n\n //--- RESTORE() ---\n strm.next_out = put;\n strm.avail_out = left;\n strm.next_in = next;\n strm.avail_in = have;\n state.hold = hold;\n state.bits = bits;\n //---\n\n if (state.wsize || (_out !== strm.avail_out && state.mode < BAD &&\n (state.mode < CHECK || flush !== Z_FINISH$1))) {\n if (updatewindow(strm, strm.output, strm.next_out, _out - strm.avail_out)) ;\n }\n _in -= strm.avail_in;\n _out -= strm.avail_out;\n strm.total_in += _in;\n strm.total_out += _out;\n state.total += _out;\n if (state.wrap && _out) {\n strm.adler = state.check = /*UPDATE(state.check, strm.next_out - _out, _out);*/\n (state.flags ? crc32_1(state.check, output, _out, strm.next_out - _out) : adler32_1(state.check, output, _out, strm.next_out - _out));\n }\n strm.data_type = state.bits + (state.last ? 64 : 0) +\n (state.mode === TYPE ? 128 : 0) +\n (state.mode === LEN_ || state.mode === COPY_ ? 256 : 0);\n if (((_in === 0 && _out === 0) || flush === Z_FINISH$1) && ret === Z_OK$1) {\n ret = Z_BUF_ERROR;\n }\n return ret;\n };\n\n\n const inflateEnd = (strm) => {\n\n if (!strm || !strm.state /*|| strm->zfree == (free_func)0*/) {\n return Z_STREAM_ERROR$1;\n }\n\n let state = strm.state;\n if (state.window) {\n state.window = null;\n }\n strm.state = null;\n return Z_OK$1;\n };\n\n\n const inflateGetHeader = (strm, head) => {\n\n /* check state */\n if (!strm || !strm.state) { return Z_STREAM_ERROR$1; }\n const state = strm.state;\n if ((state.wrap & 2) === 0) { return Z_STREAM_ERROR$1; }\n\n /* save header structure */\n state.head = head;\n head.done = false;\n return Z_OK$1;\n };\n\n\n const inflateSetDictionary = (strm, dictionary) => {\n const dictLength = dictionary.length;\n\n let state;\n let dictid;\n let ret;\n\n /* check state */\n if (!strm /* == Z_NULL */ || !strm.state /* == Z_NULL */) { return Z_STREAM_ERROR$1; }\n state = strm.state;\n\n if (state.wrap !== 0 && state.mode !== DICT) {\n return Z_STREAM_ERROR$1;\n }\n\n /* check for correct dictionary identifier */\n if (state.mode === DICT) {\n dictid = 1; /* adler32(0, null, 0)*/\n /* dictid = adler32(dictid, dictionary, dictLength); */\n dictid = adler32_1(dictid, dictionary, dictLength, 0);\n if (dictid !== state.check) {\n return Z_DATA_ERROR$1;\n }\n }\n /* copy dictionary to window using updatewindow(), which will amend the\n existing dictionary if appropriate */\n ret = updatewindow(strm, dictionary, dictLength, dictLength);\n if (ret) {\n state.mode = MEM;\n return Z_MEM_ERROR$1;\n }\n state.havedict = 1;\n // Tracev((stderr, \"inflate: dictionary set\"));\n return Z_OK$1;\n };\n\n\n var inflateReset_1 = inflateReset;\n var inflateReset2_1 = inflateReset2;\n var inflateResetKeep_1 = inflateResetKeep;\n var inflateInit_1 = inflateInit;\n var inflateInit2_1 = inflateInit2;\n var inflate_2$1 = inflate$1;\n var inflateEnd_1 = inflateEnd;\n var inflateGetHeader_1 = inflateGetHeader;\n var inflateSetDictionary_1 = inflateSetDictionary;\n var inflateInfo = 'pako inflate (from Nodeca project)';\n\n /* Not implemented\n module.exports.inflateCopy = inflateCopy;\n module.exports.inflateGetDictionary = inflateGetDictionary;\n module.exports.inflateMark = inflateMark;\n module.exports.inflatePrime = inflatePrime;\n module.exports.inflateSync = inflateSync;\n module.exports.inflateSyncPoint = inflateSyncPoint;\n module.exports.inflateUndermine = inflateUndermine;\n */\n\n var inflate_1$1 = {\n \tinflateReset: inflateReset_1,\n \tinflateReset2: inflateReset2_1,\n \tinflateResetKeep: inflateResetKeep_1,\n \tinflateInit: inflateInit_1,\n \tinflateInit2: inflateInit2_1,\n \tinflate: inflate_2$1,\n \tinflateEnd: inflateEnd_1,\n \tinflateGetHeader: inflateGetHeader_1,\n \tinflateSetDictionary: inflateSetDictionary_1,\n \tinflateInfo: inflateInfo\n };\n\n const _has = (obj, key) => {\n return Object.prototype.hasOwnProperty.call(obj, key);\n };\n\n var assign = function (obj /*from1, from2, from3, ...*/) {\n const sources = Array.prototype.slice.call(arguments, 1);\n while (sources.length) {\n const source = sources.shift();\n if (!source) { continue; }\n\n if (typeof source !== 'object') {\n throw new TypeError(source + 'must be non-object');\n }\n\n for (const p in source) {\n if (_has(source, p)) {\n obj[p] = source[p];\n }\n }\n }\n\n return obj;\n };\n\n\n // Join array of chunks to single array.\n var flattenChunks = (chunks) => {\n // calculate data length\n let len = 0;\n\n for (let i = 0, l = chunks.length; i < l; i++) {\n len += chunks[i].length;\n }\n\n // join chunks\n const result = new Uint8Array(len);\n\n for (let i = 0, pos = 0, l = chunks.length; i < l; i++) {\n let chunk = chunks[i];\n result.set(chunk, pos);\n pos += chunk.length;\n }\n\n return result;\n };\n\n var common = {\n \tassign: assign,\n \tflattenChunks: flattenChunks\n };\n\n // String encode/decode helpers\n\n\n // Quick check if we can use fast array to bin string conversion\n //\n // - apply(Array) can fail on Android 2.2\n // - apply(Uint8Array) can fail on iOS 5.1 Safari\n //\n let STR_APPLY_UIA_OK = true;\n\n try { String.fromCharCode.apply(null, new Uint8Array(1)); } catch (__) { STR_APPLY_UIA_OK = false; }\n\n\n // Table with utf8 lengths (calculated by first byte of sequence)\n // Note, that 5 & 6-byte values and some 4-byte values can not be represented in JS,\n // because max possible codepoint is 0x10ffff\n const _utf8len = new Uint8Array(256);\n for (let q = 0; q < 256; q++) {\n _utf8len[q] = (q >= 252 ? 6 : q >= 248 ? 5 : q >= 240 ? 4 : q >= 224 ? 3 : q >= 192 ? 2 : 1);\n }\n _utf8len[254] = _utf8len[254] = 1; // Invalid sequence start\n\n\n // convert string to array (typed, when possible)\n var string2buf = (str) => {\n if (typeof TextEncoder === 'function' && TextEncoder.prototype.encode) {\n return new TextEncoder().encode(str);\n }\n\n let buf, c, c2, m_pos, i, str_len = str.length, buf_len = 0;\n\n // count binary size\n for (m_pos = 0; m_pos < str_len; m_pos++) {\n c = str.charCodeAt(m_pos);\n if ((c & 0xfc00) === 0xd800 && (m_pos + 1 < str_len)) {\n c2 = str.charCodeAt(m_pos + 1);\n if ((c2 & 0xfc00) === 0xdc00) {\n c = 0x10000 + ((c - 0xd800) << 10) + (c2 - 0xdc00);\n m_pos++;\n }\n }\n buf_len += c < 0x80 ? 1 : c < 0x800 ? 2 : c < 0x10000 ? 3 : 4;\n }\n\n // allocate buffer\n buf = new Uint8Array(buf_len);\n\n // convert\n for (i = 0, m_pos = 0; i < buf_len; m_pos++) {\n c = str.charCodeAt(m_pos);\n if ((c & 0xfc00) === 0xd800 && (m_pos + 1 < str_len)) {\n c2 = str.charCodeAt(m_pos + 1);\n if ((c2 & 0xfc00) === 0xdc00) {\n c = 0x10000 + ((c - 0xd800) << 10) + (c2 - 0xdc00);\n m_pos++;\n }\n }\n if (c < 0x80) {\n /* one byte */\n buf[i++] = c;\n } else if (c < 0x800) {\n /* two bytes */\n buf[i++] = 0xC0 | (c >>> 6);\n buf[i++] = 0x80 | (c & 0x3f);\n } else if (c < 0x10000) {\n /* three bytes */\n buf[i++] = 0xE0 | (c >>> 12);\n buf[i++] = 0x80 | (c >>> 6 & 0x3f);\n buf[i++] = 0x80 | (c & 0x3f);\n } else {\n /* four bytes */\n buf[i++] = 0xf0 | (c >>> 18);\n buf[i++] = 0x80 | (c >>> 12 & 0x3f);\n buf[i++] = 0x80 | (c >>> 6 & 0x3f);\n buf[i++] = 0x80 | (c & 0x3f);\n }\n }\n\n return buf;\n };\n\n // Helper\n const buf2binstring = (buf, len) => {\n // On Chrome, the arguments in a function call that are allowed is `65534`.\n // If the length of the buffer is smaller than that, we can use this optimization,\n // otherwise we will take a slower path.\n if (len < 65534) {\n if (buf.subarray && STR_APPLY_UIA_OK) {\n return String.fromCharCode.apply(null, buf.length === len ? buf : buf.subarray(0, len));\n }\n }\n\n let result = '';\n for (let i = 0; i < len; i++) {\n result += String.fromCharCode(buf[i]);\n }\n return result;\n };\n\n\n // convert array to string\n var buf2string = (buf, max) => {\n const len = max || buf.length;\n\n if (typeof TextDecoder === 'function' && TextDecoder.prototype.decode) {\n return new TextDecoder().decode(buf.subarray(0, max));\n }\n\n let i, out;\n\n // Reserve max possible length (2 words per char)\n // NB: by unknown reasons, Array is significantly faster for\n // String.fromCharCode.apply than Uint16Array.\n const utf16buf = new Array(len * 2);\n\n for (out = 0, i = 0; i < len;) {\n let c = buf[i++];\n // quick process ascii\n if (c < 0x80) { utf16buf[out++] = c; continue; }\n\n let c_len = _utf8len[c];\n // skip 5 & 6 byte codes\n if (c_len > 4) { utf16buf[out++] = 0xfffd; i += c_len - 1; continue; }\n\n // apply mask on first byte\n c &= c_len === 2 ? 0x1f : c_len === 3 ? 0x0f : 0x07;\n // join the rest\n while (c_len > 1 && i < len) {\n c = (c << 6) | (buf[i++] & 0x3f);\n c_len--;\n }\n\n // terminated by end of string?\n if (c_len > 1) { utf16buf[out++] = 0xfffd; continue; }\n\n if (c < 0x10000) {\n utf16buf[out++] = c;\n } else {\n c -= 0x10000;\n utf16buf[out++] = 0xd800 | ((c >> 10) & 0x3ff);\n utf16buf[out++] = 0xdc00 | (c & 0x3ff);\n }\n }\n\n return buf2binstring(utf16buf, out);\n };\n\n\n // Calculate max possible position in utf8 buffer,\n // that will not break sequence. If that's not possible\n // - (very small limits) return max size as is.\n //\n // buf[] - utf8 bytes array\n // max - length limit (mandatory);\n var utf8border = (buf, max) => {\n\n max = max || buf.length;\n if (max > buf.length) { max = buf.length; }\n\n // go back from last position, until start of sequence found\n let pos = max - 1;\n while (pos >= 0 && (buf[pos] & 0xC0) === 0x80) { pos--; }\n\n // Very small and broken sequence,\n // return max, because we should return something anyway.\n if (pos < 0) { return max; }\n\n // If we came to start of buffer - that means buffer is too small,\n // return max too.\n if (pos === 0) { return max; }\n\n return (pos + _utf8len[buf[pos]] > max) ? pos : max;\n };\n\n var strings = {\n \tstring2buf: string2buf,\n \tbuf2string: buf2string,\n \tutf8border: utf8border\n };\n\n // (C) 1995-2013 Jean-loup Gailly and Mark Adler\n // (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n //\n // This software is provided 'as-is', without any express or implied\n // warranty. In no event will the authors be held liable for any damages\n // arising from the use of this software.\n //\n // Permission is granted to anyone to use this software for any purpose,\n // including commercial applications, and to alter it and redistribute it\n // freely, subject to the following restrictions:\n //\n // 1. The origin of this software must not be misrepresented; you must not\n // claim that you wrote the original software. If you use this software\n // in a product, an acknowledgment in the product documentation would be\n // appreciated but is not required.\n // 2. Altered source versions must be plainly marked as such, and must not be\n // misrepresented as being the original software.\n // 3. This notice may not be removed or altered from any source distribution.\n\n var messages = {\n 2: 'need dictionary', /* Z_NEED_DICT 2 */\n 1: 'stream end', /* Z_STREAM_END 1 */\n 0: '', /* Z_OK 0 */\n '-1': 'file error', /* Z_ERRNO (-1) */\n '-2': 'stream error', /* Z_STREAM_ERROR (-2) */\n '-3': 'data error', /* Z_DATA_ERROR (-3) */\n '-4': 'insufficient memory', /* Z_MEM_ERROR (-4) */\n '-5': 'buffer error', /* Z_BUF_ERROR (-5) */\n '-6': 'incompatible version' /* Z_VERSION_ERROR (-6) */\n };\n\n // (C) 1995-2013 Jean-loup Gailly and Mark Adler\n // (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n //\n // This software is provided 'as-is', without any express or implied\n // warranty. In no event will the authors be held liable for any damages\n // arising from the use of this software.\n //\n // Permission is granted to anyone to use this software for any purpose,\n // including commercial applications, and to alter it and redistribute it\n // freely, subject to the following restrictions:\n //\n // 1. The origin of this software must not be misrepresented; you must not\n // claim that you wrote the original software. If you use this software\n // in a product, an acknowledgment in the product documentation would be\n // appreciated but is not required.\n // 2. Altered source versions must be plainly marked as such, and must not be\n // misrepresented as being the original software.\n // 3. This notice may not be removed or altered from any source distribution.\n\n function ZStream() {\n /* next input byte */\n this.input = null; // JS specific, because we have no pointers\n this.next_in = 0;\n /* number of bytes available at input */\n this.avail_in = 0;\n /* total number of input bytes read so far */\n this.total_in = 0;\n /* next output byte should be put there */\n this.output = null; // JS specific, because we have no pointers\n this.next_out = 0;\n /* remaining free space at output */\n this.avail_out = 0;\n /* total number of bytes output so far */\n this.total_out = 0;\n /* last error message, NULL if no error */\n this.msg = ''/*Z_NULL*/;\n /* not visible by applications */\n this.state = null;\n /* best guess about the data type: binary or text */\n this.data_type = 2/*Z_UNKNOWN*/;\n /* adler32 value of the uncompressed data */\n this.adler = 0;\n }\n\n var zstream = ZStream;\n\n // (C) 1995-2013 Jean-loup Gailly and Mark Adler\n // (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n //\n // This software is provided 'as-is', without any express or implied\n // warranty. In no event will the authors be held liable for any damages\n // arising from the use of this software.\n //\n // Permission is granted to anyone to use this software for any purpose,\n // including commercial applications, and to alter it and redistribute it\n // freely, subject to the following restrictions:\n //\n // 1. The origin of this software must not be misrepresented; you must not\n // claim that you wrote the original software. If you use this software\n // in a product, an acknowledgment in the product documentation would be\n // appreciated but is not required.\n // 2. Altered source versions must be plainly marked as such, and must not be\n // misrepresented as being the original software.\n // 3. This notice may not be removed or altered from any source distribution.\n\n function GZheader() {\n /* true if compressed data believed to be text */\n this.text = 0;\n /* modification time */\n this.time = 0;\n /* extra flags (not used when writing a gzip file) */\n this.xflags = 0;\n /* operating system */\n this.os = 0;\n /* pointer to extra field or Z_NULL if none */\n this.extra = null;\n /* extra field length (valid if extra != Z_NULL) */\n this.extra_len = 0; // Actually, we don't need it in JS,\n // but leave for few code modifications\n\n //\n // Setup limits is not necessary because in js we should not preallocate memory\n // for inflate use constant limit in 65536 bytes\n //\n\n /* space at extra (only when reading header) */\n // this.extra_max = 0;\n /* pointer to zero-terminated file name or Z_NULL */\n this.name = '';\n /* space at name (only when reading header) */\n // this.name_max = 0;\n /* pointer to zero-terminated comment or Z_NULL */\n this.comment = '';\n /* space at comment (only when reading header) */\n // this.comm_max = 0;\n /* true if there was or will be a header crc */\n this.hcrc = 0;\n /* true when done reading gzip header (not used when writing a gzip file) */\n this.done = false;\n }\n\n var gzheader = GZheader;\n\n const toString = Object.prototype.toString;\n\n /* Public constants ==========================================================*/\n /* ===========================================================================*/\n\n const {\n Z_NO_FLUSH, Z_FINISH,\n Z_OK, Z_STREAM_END, Z_NEED_DICT, Z_STREAM_ERROR, Z_DATA_ERROR, Z_MEM_ERROR\n } = constants$1;\n\n /* ===========================================================================*/\n\n\n /**\n * class Inflate\n *\n * Generic JS-style wrapper for zlib calls. If you don't need\n * streaming behaviour - use more simple functions: [[inflate]]\n * and [[inflateRaw]].\n **/\n\n /* internal\n * inflate.chunks -> Array\n *\n * Chunks of output data, if [[Inflate#onData]] not overridden.\n **/\n\n /**\n * Inflate.result -> Uint8Array|String\n *\n * Uncompressed result, generated by default [[Inflate#onData]]\n * and [[Inflate#onEnd]] handlers. Filled after you push last chunk\n * (call [[Inflate#push]] with `Z_FINISH` / `true` param).\n **/\n\n /**\n * Inflate.err -> Number\n *\n * Error code after inflate finished. 0 (Z_OK) on success.\n * Should be checked if broken data possible.\n **/\n\n /**\n * Inflate.msg -> String\n *\n * Error message, if [[Inflate.err]] != 0\n **/\n\n\n /**\n * new Inflate(options)\n * - options (Object): zlib inflate options.\n *\n * Creates new inflator instance with specified params. Throws exception\n * on bad params. Supported options:\n *\n * - `windowBits`\n * - `dictionary`\n *\n * [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced)\n * for more information on these.\n *\n * Additional options, for internal needs:\n *\n * - `chunkSize` - size of generated data chunks (16K by default)\n * - `raw` (Boolean) - do raw inflate\n * - `to` (String) - if equal to 'string', then result will be converted\n * from utf8 to utf16 (javascript) string. When string output requested,\n * chunk length can differ from `chunkSize`, depending on content.\n *\n * By default, when no options set, autodetect deflate/gzip data format via\n * wrapper header.\n *\n * ##### Example:\n *\n * ```javascript\n * const pako = require('pako')\n * const chunk1 = new Uint8Array([1,2,3,4,5,6,7,8,9])\n * const chunk2 = new Uint8Array([10,11,12,13,14,15,16,17,18,19]);\n *\n * const inflate = new pako.Inflate({ level: 3});\n *\n * inflate.push(chunk1, false);\n * inflate.push(chunk2, true); // true -> last chunk\n *\n * if (inflate.err) { throw new Error(inflate.err); }\n *\n * console.log(inflate.result);\n * ```\n **/\n function Inflate(options) {\n this.options = common.assign({\n chunkSize: 1024 * 64,\n windowBits: 15,\n to: ''\n }, options || {});\n\n const opt = this.options;\n\n // Force window size for `raw` data, if not set directly,\n // because we have no header for autodetect.\n if (opt.raw && (opt.windowBits >= 0) && (opt.windowBits < 16)) {\n opt.windowBits = -opt.windowBits;\n if (opt.windowBits === 0) { opt.windowBits = -15; }\n }\n\n // If `windowBits` not defined (and mode not raw) - set autodetect flag for gzip/deflate\n if ((opt.windowBits >= 0) && (opt.windowBits < 16) &&\n !(options && options.windowBits)) {\n opt.windowBits += 32;\n }\n\n // Gzip header has no info about windows size, we can do autodetect only\n // for deflate. So, if window size not set, force it to max when gzip possible\n if ((opt.windowBits > 15) && (opt.windowBits < 48)) {\n // bit 3 (16) -> gzipped data\n // bit 4 (32) -> autodetect gzip/deflate\n if ((opt.windowBits & 15) === 0) {\n opt.windowBits |= 15;\n }\n }\n\n this.err = 0; // error code, if happens (0 = Z_OK)\n this.msg = ''; // error message\n this.ended = false; // used to avoid multiple onEnd() calls\n this.chunks = []; // chunks of compressed data\n\n this.strm = new zstream();\n this.strm.avail_out = 0;\n\n let status = inflate_1$1.inflateInit2(\n this.strm,\n opt.windowBits\n );\n\n if (status !== Z_OK) {\n throw new Error(messages[status]);\n }\n\n this.header = new gzheader();\n\n inflate_1$1.inflateGetHeader(this.strm, this.header);\n\n // Setup dictionary\n if (opt.dictionary) {\n // Convert data if needed\n if (typeof opt.dictionary === 'string') {\n opt.dictionary = strings.string2buf(opt.dictionary);\n } else if (toString.call(opt.dictionary) === '[object ArrayBuffer]') {\n opt.dictionary = new Uint8Array(opt.dictionary);\n }\n if (opt.raw) { //In raw mode we need to set the dictionary early\n status = inflate_1$1.inflateSetDictionary(this.strm, opt.dictionary);\n if (status !== Z_OK) {\n throw new Error(messages[status]);\n }\n }\n }\n }\n\n /**\n * Inflate#push(data[, flush_mode]) -> Boolean\n * - data (Uint8Array|ArrayBuffer): input data\n * - flush_mode (Number|Boolean): 0..6 for corresponding Z_NO_FLUSH..Z_TREE\n * flush modes. See constants. Skipped or `false` means Z_NO_FLUSH,\n * `true` means Z_FINISH.\n *\n * Sends input data to inflate pipe, generating [[Inflate#onData]] calls with\n * new output chunks. Returns `true` on success. If end of stream detected,\n * [[Inflate#onEnd]] will be called.\n *\n * `flush_mode` is not needed for normal operation, because end of stream\n * detected automatically. You may try to use it for advanced things, but\n * this functionality was not tested.\n *\n * On fail call [[Inflate#onEnd]] with error code and return false.\n *\n * ##### Example\n *\n * ```javascript\n * push(chunk, false); // push one of data chunks\n * ...\n * push(chunk, true); // push last chunk\n * ```\n **/\n Inflate.prototype.push = function (data, flush_mode) {\n const strm = this.strm;\n const chunkSize = this.options.chunkSize;\n const dictionary = this.options.dictionary;\n let status, _flush_mode, last_avail_out;\n\n if (this.ended) return false;\n\n if (flush_mode === ~~flush_mode) _flush_mode = flush_mode;\n else _flush_mode = flush_mode === true ? Z_FINISH : Z_NO_FLUSH;\n\n // Convert data if needed\n if (toString.call(data) === '[object ArrayBuffer]') {\n strm.input = new Uint8Array(data);\n } else {\n strm.input = data;\n }\n\n strm.next_in = 0;\n strm.avail_in = strm.input.length;\n\n for (;;) {\n if (strm.avail_out === 0) {\n strm.output = new Uint8Array(chunkSize);\n strm.next_out = 0;\n strm.avail_out = chunkSize;\n }\n\n status = inflate_1$1.inflate(strm, _flush_mode);\n\n if (status === Z_NEED_DICT && dictionary) {\n status = inflate_1$1.inflateSetDictionary(strm, dictionary);\n\n if (status === Z_OK) {\n status = inflate_1$1.inflate(strm, _flush_mode);\n } else if (status === Z_DATA_ERROR) {\n // Replace code with more verbose\n status = Z_NEED_DICT;\n }\n }\n\n // Skip snyc markers if more data follows and not raw mode\n while (strm.avail_in > 0 &&\n status === Z_STREAM_END &&\n strm.state.wrap > 0 &&\n data[strm.next_in] !== 0)\n {\n inflate_1$1.inflateReset(strm);\n status = inflate_1$1.inflate(strm, _flush_mode);\n }\n\n switch (status) {\n case Z_STREAM_ERROR:\n case Z_DATA_ERROR:\n case Z_NEED_DICT:\n case Z_MEM_ERROR:\n this.onEnd(status);\n this.ended = true;\n return false;\n }\n\n // Remember real `avail_out` value, because we may patch out buffer content\n // to align utf8 strings boundaries.\n last_avail_out = strm.avail_out;\n\n if (strm.next_out) {\n if (strm.avail_out === 0 || status === Z_STREAM_END) {\n\n if (this.options.to === 'string') {\n\n let next_out_utf8 = strings.utf8border(strm.output, strm.next_out);\n\n let tail = strm.next_out - next_out_utf8;\n let utf8str = strings.buf2string(strm.output, next_out_utf8);\n\n // move tail & realign counters\n strm.next_out = tail;\n strm.avail_out = chunkSize - tail;\n if (tail) strm.output.set(strm.output.subarray(next_out_utf8, next_out_utf8 + tail), 0);\n\n this.onData(utf8str);\n\n } else {\n this.onData(strm.output.length === strm.next_out ? strm.output : strm.output.subarray(0, strm.next_out));\n }\n }\n }\n\n // Must repeat iteration if out buffer is full\n if (status === Z_OK && last_avail_out === 0) continue;\n\n // Finalize if end of stream reached.\n if (status === Z_STREAM_END) {\n status = inflate_1$1.inflateEnd(this.strm);\n this.onEnd(status);\n this.ended = true;\n return true;\n }\n\n if (strm.avail_in === 0) break;\n }\n\n return true;\n };\n\n\n /**\n * Inflate#onData(chunk) -> Void\n * - chunk (Uint8Array|String): output data. When string output requested,\n * each chunk will be string.\n *\n * By default, stores data blocks in `chunks[]` property and glue\n * those in `onEnd`. Override this handler, if you need another behaviour.\n **/\n Inflate.prototype.onData = function (chunk) {\n this.chunks.push(chunk);\n };\n\n\n /**\n * Inflate#onEnd(status) -> Void\n * - status (Number): inflate status. 0 (Z_OK) on success,\n * other if not.\n *\n * Called either after you tell inflate that the input stream is\n * complete (Z_FINISH). By default - join collected chunks,\n * free memory and fill `results` / `err` properties.\n **/\n Inflate.prototype.onEnd = function (status) {\n // On success - join\n if (status === Z_OK) {\n if (this.options.to === 'string') {\n this.result = this.chunks.join('');\n } else {\n this.result = common.flattenChunks(this.chunks);\n }\n }\n this.chunks = [];\n this.err = status;\n this.msg = this.strm.msg;\n };\n\n\n /**\n * inflate(data[, options]) -> Uint8Array|String\n * - data (Uint8Array): input data to decompress.\n * - options (Object): zlib inflate options.\n *\n * Decompress `data` with inflate/ungzip and `options`. Autodetect\n * format via wrapper header by default. That's why we don't provide\n * separate `ungzip` method.\n *\n * Supported options are:\n *\n * - windowBits\n *\n * [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced)\n * for more information.\n *\n * Sugar (options):\n *\n * - `raw` (Boolean) - say that we work with raw stream, if you don't wish to specify\n * negative windowBits implicitly.\n * - `to` (String) - if equal to 'string', then result will be converted\n * from utf8 to utf16 (javascript) string. When string output requested,\n * chunk length can differ from `chunkSize`, depending on content.\n *\n *\n * ##### Example:\n *\n * ```javascript\n * const pako = require('pako');\n * const input = pako.deflate(new Uint8Array([1,2,3,4,5,6,7,8,9]));\n * let output;\n *\n * try {\n * output = pako.inflate(input);\n * } catch (err) {\n * console.log(err);\n * }\n * ```\n **/\n function inflate(input, options) {\n const inflator = new Inflate(options);\n\n inflator.push(input);\n\n // That will never happens, if you don't cheat with options :)\n if (inflator.err) throw inflator.msg || messages[inflator.err];\n\n return inflator.result;\n }\n\n\n /**\n * inflateRaw(data[, options]) -> Uint8Array|String\n * - data (Uint8Array): input data to decompress.\n * - options (Object): zlib inflate options.\n *\n * The same as [[inflate]], but creates raw data, without wrapper\n * (header and adler32 crc).\n **/\n function inflateRaw(input, options) {\n options = options || {};\n options.raw = true;\n return inflate(input, options);\n }\n\n\n /**\n * ungzip(data[, options]) -> Uint8Array|String\n * - data (Uint8Array): input data to decompress.\n * - options (Object): zlib inflate options.\n *\n * Just shortcut to [[inflate]], because it autodetects format\n * by header.content. Done for convenience.\n **/\n\n\n var Inflate_1 = Inflate;\n var inflate_2 = inflate;\n var inflateRaw_1 = inflateRaw;\n var ungzip = inflate;\n var constants = constants$1;\n\n var inflate_1 = {\n \tInflate: Inflate_1,\n \tinflate: inflate_2,\n \tinflateRaw: inflateRaw_1,\n \tungzip: ungzip,\n \tconstants: constants\n };\n\n exports.Inflate = Inflate_1;\n exports.constants = constants;\n exports['default'] = inflate_1;\n exports.inflate = inflate_2;\n exports.inflateRaw = inflateRaw_1;\n exports.ungzip = ungzip;\n\n Object.defineProperty(exports, '__esModule', { value: true });\n\n})));\n\n","/* noCompress */",e.substring(e.indexOf("{")+1,e.lastIndexOf("}")),"/* gzipCompress */",t.substring(t.indexOf("{")+1,t.lastIndexOf("}")),"/* parseChunk */",n.substring(n.indexOf("{")+1,n.lastIndexOf("}"))].join("\n"),"","/* worker */",HL].join("\n");this.workerSourceURL=URL.createObjectURL(new Blob([i]))}return()=>new Worker(this.workerSourceURL)}_createMesh(e,t){const{buffer:n,position:i,normal:s,texcoord:r,indice:o,sub_mesh:a}=e,l=new Uint32Array(n,o.byteOffset,o.length),c=new Float32Array(n,i.byteOffset,i.length),h=new Int8Array(n,s.byteOffset,s.length),d=new Float32Array(n,r.byteOffset,r.length),u=new Hs;u.setIndex(new Ts(l,1)),u.setAttribute("position",new Ts(c,3)),u.setAttribute("normal",new Ts(h,3,!0)),u.setAttribute("uv",new Ts(d,2));for(let e=0;e<a.length;e++){const{uuid:n,start:i,count:s}=a[e],r=this.loadedMaterialsMap.get(n);if(r){const{materialIndex:e}=r;u.addGroup(i,s,e)}else u.addGroup(i,s,0),Vm(`sbmx material: not found uuid: ${n} in file: ${t+"textureIndex.json"}`)}Yy.generate(u).then((e=>{u.boundsTree=e}));const p=new or(u,this.loadedMaterials);return p.castShadow=!0,p.receiveShadow=!0,p}_createMaterial(e){return rf(this,void 0,void 0,(function*(){const t=qm(e),n=t+"textureIndex.json",i=this.loadedTextures.get(n);if(i)return i;const s=yield this.store.getItem(`${e}_texture`);let r;if(s)r=s,this.loadedTextures.set(n,Promise.resolve(r));else{const t=this.loadedTextures.get(n);if(t)return t;const i=mf(n).then((e=>e.json()));this.loadedTextures.set(n,i),r=yield i,ff((()=>{this.store.setItem(`${e}_texture`,r)}))}Object.entries(r).forEach((e=>{let[n,i]=e;if(this.loadedMaterialsMap.has(n))return;const{name:s,base_map:r,nor_map:o,alphamode:a,color:l={r:1,g:1,b:1,a:1},metallic:c=.5,roughness:h=.5}=i,{r:d,g:u,b:p,a:m}=l,f=0!==a,g=new kh({name:s,color:new Fn(d,u,p),side:0,metalness:c,roughness:h,opacity:m,transparent:f,depthWrite:!f});if(r){const e=t+r;(new Md).load(e,(e=>{e.flipY=!0,e.encoding=3001,e.wrapS=1e3,e.wrapT=1e3,e.minFilter=1008,e.magFilter=1006,e.needsUpdate=!0,g.map=e,g.needsUpdate=!0,gS.needsUpdate=!0}))}if(o){const e=t+o;(new Md).load(e,(e=>{e.flipY=!0,e.encoding=3001,e.wrapS=1e3,e.wrapT=1e3,e.needsUpdate=!0,g.normalMap=e,g.needsUpdate=!0,gS.needsUpdate=!0}))}const y=this.loadedMaterials.push(g)-1;this.loadedMaterialsMap.set(n,{material:g,materialIndex:y})}))}))}dispose(){this.workerPool.dispose(),URL.revokeObjectURL(this.workerSourceURL)}}const FL=new Map,UL=e=>{var t;return null!==(t=null==e?void 0:e.toLowerCase().endsWith(".png"))&&void 0!==t&&t},OL=e=>{if(FL.has(e))return FL.get(e);const t=new Jn;return FL.set(e,t),(new xd).load(e,(e=>{t.image=e,t.needsUpdate=!0,gS.needsUpdate=!0})),t.encoding=3001,t.wrapS=1e3,t.wrapT=1e3,t.flipY=!1,t.anisotropy=16,t.mipmaps=[],t.generateMipmaps=!0,t},YL=(e,t,n,i)=>{const[s,r,o,a,l]=t,c=i||a<1;return new kh({name:e,color:new Fn(s,r,o),opacity:a,transparent:c,depthWrite:!c,alphaTest:.01,map:n,side:l})};class KL extends DataView{constructor(e,t){super(e),this.isLE=!0,this.appKeys=t}byteRevers(e,t){const n=t%this.appKeys.length;return e^this.appKeys[n]}getSoonUint8(e){return this.byteRevers(this.getUint8(e),e)}getSoonUint16(e){const t=new DataView(new Uint8Array(2).buffer);for(let n=0;n<2;n++)t.setUint8(n,this.getSoonUint8(e+n));return t.getUint16(0,this.isLE)}getSoonUint32(e){const t=new DataView(new Uint8Array(4).buffer);for(let n=0;n<4;n++)t.setUint8(n,this.getSoonUint8(e+n));return t.getUint32(0,this.isLE)}getSoonFloat32(e){const t=new DataView(new Uint8Array(4).buffer);for(let n=0;n<4;n++)t.setUint8(n,this.getSoonUint8(e+n));return t.getFloat32(0,this.isLE)}}const jL=new TextDecoder;new TextDecoder;class JL{constructor(){this.materials=new Map}parseObject(e,t){const n=new LS(Object.assign(Object.assign({},t),{format:"sbm"})),i=new MS({id:cg()});n.add(i);const{materialsCache:s,meshsCache:r}=e;for(const[e,t]of Object.entries(s)){if(this.materials.has(e))continue;const{textureUrl:n,materialInfo:i}=t;let s=null;n&&(s=OL(n));const r=YL(e,i,s,UL(n));this.materials.set(e,r)}for(const[e,t]of Object.entries(r)){const{meshName:n,materialId:s,position:r,uv:o}=t,a=this.materials.get(s.toString());if(a){const t=new Hs,s=new Float32Array(r),l=new Float32Array(o);s.length>0&&t.setAttribute("position",new Ts(s,3)),l.length>0&&t.setAttribute("uv",new Ts(l,2)),t.computeVertexNormals(),Yy.generate(t).then((e=>{t.boundsTree=e}));const c=new xS(t,a,{id:`${e}_${cg()}`,name:n||e});i.add(c)}}return n}}var QL=class{constructor(){this.materials=new Map,this.sbmInfo=null}parseBuffer(e,t,n){return rf(this,void 0,void 0,(function*(){this.sbmInfo=t;const i=new DataView(e);let s=0;const r=[];for(let e=0;e<8;e++)r.push(i.getUint8(s)),s+=1;if("SBK-----"!==String.fromCharCode(...r))return Promise.reject(`In soonspacejs: sbm 资源模型(${this.sbmInfo.url})格式或数据错误!`);const o=[],a=[],l=[];for(let e=0;e<32;e++)o.push(i.getUint8(s)),s+=1;const c=i.getUint8(s);s+=1;const h=i.getUint8(s);s+=1;for(let e=0;e<32;e++)a.push(i.getUint8(s)),s+=1;for(let e=0;e<64;e++)l.push(i.getUint8(s)),s+=1;const d=[...a,...l,...o],u=[];for(let e=0;e<d.length;e++)(e<=7||e>23&&e<=31||e>39&&e<=55||e>63&&e<=87||e>95&&e<=103)&&u.push(d[e]);if(64!==u.length)return Promise.reject(`In soonspacejs: sbm 资源模型(${this.sbmInfo.url} 数据错误!`);if(1===c){const e=i.buffer.slice(s,i.buffer.byteLength),t=new KL(e,u);return 1===h||2===h?this._parseV2(t,n):3===h?this._parseV3(t,n):Promise.reject(`In soonspacejs: sbm 资源模型(${this.sbmInfo.url})版本错误!`)}return Promise.reject(`In soonspacejs: sbm 资源模型(${this.sbmInfo.url})key 错误!`)}))}_parseV2(e,t){let n=0;const i=performance.now();n+=66;const s={total:0,loaded:0,timeStamp:0};if(!this.sbmInfo)return Promise.reject("In soonspacejs: sbm 模型资源解析时 'sbmInfo' 缺失!");const r=new LS(Object.assign(Object.assign({},this.sbmInfo),{format:"sbm"})),o=new MS({id:cg()});r.add(o);const a=e.getSoonUint16(n);n+=2;const l=e.getSoonUint16(n);n+=2,s.total=l;const c={};for(let t=0;t<a;++t){const t=e.getSoonUint16(n).toString();n+=2,c[t]={materialInfo:[]},n+=4,n+=4,n+=4,n+=4;const i=e.getSoonFloat32(n);n+=4;const s=e.getSoonFloat32(n);n+=4;const r=e.getSoonFloat32(n);n+=4;const o=e.getSoonFloat32(n);n+=4,n+=4,n+=4,n+=4,n+=4;let a=e.getSoonUint8(n);n+=1,0===a?a=0:1===a?a=1:2===a&&(a=2);const l=e.getSoonUint16(n);n+=2;let h=null;if(l>0){let i="",s="";for(let t=0;t<l;t++){const t=e.getSoonUint8(n);t>127?s=s+"%"+t.toString(16).toUpperCase():s.length>0?(i+=decodeURIComponent(s)+String.fromCharCode(t),s=""):i+=String.fromCharCode(t),n+=1}i=i.replace("\\","/");const{url:r,isPlatform:o}=this.sbmInfo,a=this.getTextureUrl(r,i,o);c[t].textureUrl=a,h=OL(a)}if(!this.materials.has(t)){const e=[i,s,r,o,a],n=YL(t,e,h,UL(c[t].textureUrl));this.materials.set(t,n),c[t].materialInfo=e}}const h={};for(let r=0;r<l;++r){const r=e.getSoonUint16(n);n+=2;const a=e.getSoonUint16(n).toString();n+=2,h[r]={materialId:a,position:new ArrayBuffer(0),uv:new ArrayBuffer(0)};const l=[],c=[],d=[],u=[],p=e.getSoonUint16(n);if(n+=2,p>0)for(let t=0;t<p;t++){const t=new ri;t.setX(e.getSoonFloat32(n)),n+=4,t.setY(e.getSoonFloat32(n)),n+=4,t.setZ(e.getSoonFloat32(n)),n+=4,l.push(t)}const m=e.getSoonUint16(n);if(n+=2,m>0)for(let t=0;t<m;t++){const t=new ri;t.setX(e.getSoonFloat32(n)),n+=4,t.setY(e.getSoonFloat32(n)),n+=4,t.setZ(e.getSoonFloat32(n)),n+=4}const f=e.getSoonUint16(n);if(n+=2,f>0)for(let t=0;t<f;t++){const t=new Gn;t.setX(e.getSoonFloat32(n)),n+=4,t.setY(e.getSoonFloat32(n)),n+=4,c.push(t)}const g=e.getSoonUint16(n);if(n+=2,g>0)for(let t=0;t<g;t++){const t=e.getSoonUint16(n);n+=2;const i=e.getSoonUint16(n);n+=2;const s=e.getSoonUint16(n);n+=2;const r=[t,i,s];d.push(r),c.length>0&&u.push([c[r[0]],c[r[1]],c[r[2]]])}const y=[],b=[];for(let e=0;e<d.length;e++){const t=d[e],n=l[t[0]],i=l[t[1]],s=l[t[2]];y.push(...n.toArray(),...i.toArray(),...s.toArray());let r=new Gn,o=new Gn,a=new Gn;const c=u[e];void 0!==c&&(r=c[0],o=c[1],a=c[2]),b.push(...r.toArray(),...o.toArray(),...a.toArray())}const v=new Float32Array(y),x=new Float32Array(b);h[r].position=v.buffer,h[r].uv=x.buffer;const w=new Hs;v.length>0&&w.setAttribute("position",new Ts(v,3)),x.length>0&&w.setAttribute("uv",new Ts(x,2)),w.computeVertexNormals(),Yy.generate(w).then((e=>{w.boundsTree=e}));const S=this.materials.get(a);if(S){const e=new xS(w,S,{id:`${r}_${cg()}`,name:r.toString()});o.add(e)}s.loaded++,s.timeStamp=performance.now()-i,null==t||t(s)}const d={materialsCache:c,meshsCache:h};return Promise.resolve({model:r,caches:d})}_parseV3(e,t){let n=0;n+=66;const i=performance.now(),s={total:0,loaded:0,timeStamp:0};if(!this.sbmInfo)return Promise.reject("In soonspacejs: sbm 模型资源解析时 'sbmInfo' 缺失!");const r=new LS(Object.assign(Object.assign({},this.sbmInfo),{format:"sbm"})),o=new MS({id:cg()});r.add(o);const a=e.getSoonUint16(n);n+=2;const l=e.getSoonUint16(n);n+=2,s.total=l;const c={};for(let t=0;t<a;++t){const t=e.getSoonUint16(n).toString();n+=2,c[t]={materialInfo:[]},n+=4,n+=4,n+=4,n+=4;const i=e.getSoonFloat32(n);n+=4;const s=e.getSoonFloat32(n);n+=4;const r=e.getSoonFloat32(n);n+=4;const o=e.getSoonFloat32(n);n+=4,n+=4,n+=4,n+=4,n+=4;let a=e.getSoonUint8(n);n+=1,0===a?a=0:1===a?a=1:2===a&&(a=2);const l=e.getSoonUint16(n);n+=2;let h=null;if(l>0){let i="",s="";for(let t=0;t<l;t++){const t=e.getSoonUint8(n);t>127?s=s+"%"+t.toString(16).toUpperCase():s.length>0?(i+=decodeURIComponent(s)+String.fromCharCode(t),s=""):i+=String.fromCharCode(t),n+=1}i=i.replace("\\","/");const{url:r,isPlatform:o}=this.sbmInfo,a=this.getTextureUrl(r,i,o);c[t].textureUrl=a,h=OL(a)}if(!this.materials.has(t)){const e=[i,s,r,o,a],n=YL(t,e,h,UL(c[t].textureUrl));this.materials.set(t,n),c[t].materialInfo=e}}const h={};for(let r=0;r<l;++r){const r=e.getSoonUint16(n).toString();n+=2;const a=e.getSoonUint16(n);n+=2;let l="";if(a>0){const t=[];for(let i=0;i<a;i++){const i=e.getSoonUint8(n);t.push(i),n+=1}const i=new Uint8Array(t);l=jL.decode(i)}const c=e.getSoonUint16(n).toString();n+=2,h[r]={meshName:l,materialId:c,position:new ArrayBuffer(0),uv:new ArrayBuffer(0)};const d=[],u=[],p=[],m=[],f=e.getSoonUint32(n);if(n+=4,f>0)for(let t=0;t<f;t++){const t=new ri;t.setX(e.getSoonFloat32(n)),n+=4,t.setY(e.getSoonFloat32(n)),n+=4,t.setZ(e.getSoonFloat32(n)),n+=4,d.push(t)}const g=e.getSoonUint32(n);if(n+=4,g>0)for(let t=0;t<g;t++){const t=new ri;t.setX(e.getSoonFloat32(n)),n+=4,t.setY(e.getSoonFloat32(n)),n+=4,t.setZ(e.getSoonFloat32(n)),n+=4}const y=e.getSoonUint32(n);if(n+=4,y>0)for(let t=0;t<y;t++){const t=new Gn;t.setX(e.getSoonFloat32(n)),n+=4,t.setY(e.getSoonFloat32(n)),n+=4,u.push(t)}const b=e.getSoonUint32(n);if(n+=4,b>0)for(let t=0;t<b;t++){const t=e.getSoonUint32(n);n+=4;const i=e.getSoonUint32(n);n+=4;const s=e.getSoonUint32(n);n+=4;const r=[t,i,s];p.push(r),u.length>0&&m.push([u[r[0]],u[r[1]],u[r[2]]])}const v=[],x=[];for(let e=0;e<p.length;e++){const t=p[e],n=d[t[0]],i=d[t[1]],s=d[t[2]];v.push(...n.toArray(),...i.toArray(),...s.toArray());let r=new Gn,o=new Gn,a=new Gn;const l=m[e];void 0!==l&&(r=l[0],o=l[1],a=l[2]),x.push(...r.toArray(),...o.toArray(),...a.toArray())}const w=new Float32Array(v),S=new Float32Array(x);h[r].position=w.buffer,h[r].uv=S.buffer;const M=new Hs;if(w.length>0&&M.setAttribute("position",new Ts(w,3)),S.length>0&&M.setAttribute("uv",new Ts(S,2)),M.computeVertexNormals(),Yy.generate(M).then((e=>{M.boundsTree=e})),this.materials.has(c)){const e=new xS(M,this.materials.get(c),{id:`${r}_${cg()}`,name:l});o.add(e)}s.loaded++,s.timeStamp=performance.now()-i,null==t||t(s)}const d={materialsCache:c,meshsCache:h};return Promise.resolve({model:r,caches:d})}getTextureUrl(e,t,n){let i="",s=t;const r=s.lastIndexOf("/");if(-1!==r&&(s=s.substring(r+1)),i=e,n){const e=i.split("/");e.length>1&&(e.splice(e.length-3,e.length),i=e.join("/")+"/Maps/"+s)}else{const e=i.lastIndexOf("/");-1!==e&&(i=i.substring(0,e+1)+"Maps/"+s)}return i}};class qL extends HS{constructor(e,t){super("Model",e,t),this.viewport=e,this.isDisposed=!1,this.modelsPromiseMap=new Map,this.modelsMap=new Map,this.store=ZL.createInstance({name:"soonspace",storeName:"modelData"}),this.cacheStore=ZL.createInstance({name:"soonspace",storeName:"modelCache"}),this.loadingManager=new pd,this.datLoader=new kL(this.cacheStore),this.gltfLoader=new EC(this.loadingManager),this.fbxLoader=new uC(this.loadingManager),this.dracoDecoderPath=null,this.gltfLoader.register((e=>new NL(e))),this._initLoadingManager(this.loadingManager)}setDracoDecoderPath(e){this.dracoDecoderPath=e;const t=new PL;t.setDecoderPath(e),this.gltfLoader.setDRACOLoader(t),this.datLoader.dracoDecoderPath=e}load(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:this.scene;return rf(this,void 0,void 0,(function*(){const{url:n}=e,i=this.modelsPromiseMap.get(n);if(i){if(yield i,this.isDisposed)return this.dispose(),null;const s=this.modelsMap.get(n);return s?this.clone(s,e,t):null}const s=this._innerLoad(e,t);return this.modelsPromiseMap.set(n,s),s}))}parse(e){return rf(this,void 0,void 0,(function*(){const{url:t,id:n}=e;if(!t)return Vm(`id: ${n} url: ${t} is empty`),null;switch(t.slice(t.lastIndexOf(".")+1).toLocaleUpperCase()){case"SBM":return this._parseSbm(e);case"SBMX":return this._parseSbmx(e);case"DAT":return this._parseDat(e);case"GLB":case"GLTF":return this._parseGltf(e);case"FBX":return this._parseFbx(e);default:return Vm(`模型资源( id: ${n}, url: ${t} )格式错误,当前格式支持 sbm、sbmx、fbx、gltf、glb !`),null}}))}clone(e,t,n){return new Promise(((i,s)=>{var r;"Model"!==e.stype&&s("In soonspacejs: 方法 cloneModel 参入对象类型错误!");const{id:o,name:a,level:l,visible:c,position:h,rotation:d,scale:u,onClick:p,onDblClick:m,onRightClick:f,onLoad:g,userData:y}=t;function b(e,t,n){n(e,t);for(let i=0;i<e.children.length;i++)b(e.children[i],t.children[i],n)}const v=function(e){const t=new Map,n=new Map,i=e.sClone();return b(e,i,(function(e,i){t.set(i,e),n.set(e,i)})),i.traverse((function(e){if(e instanceof Zl){const i=e,s=t.get(e),r=s.skeleton.bones;i.skeleton=s.skeleton.clone(),i.bindMatrix.copy(s.bindMatrix),i.skeleton.bones=r.map((function(e){return n.get(e)})),i.bind(i.skeleton,i.bindMatrix)}})),i}(e);v.animations=v.animations.map((e=>e.clone())),o&&(v.sid=o),a&&(v.name=a),l&&(v.level=l),!1===c&&v.hide(),h&&v.position.set(h.x,h.y,h.z),d&&v.rotation.set(d.x,d.y,d.z),u&&v.scale.set(u.x,u.y,u.z),v.onClick=p?p.bind(v):null,v.onDblClick=m?m.bind(v):null,v.onRightClick=f?f.bind(v):null,v.onLoad=g?g.bind(v):null,null===(r=v.onLoad)||void 0===r||r.call(v,v),y&&(v.userData=y),null!==n&&this.viewport.scener.addObject(v,n||this.scene||e.parent),i(v)}))}loadToGroup(e,t){return rf(this,void 0,void 0,(function*(){const n=this.createGroup(e,null);return yield Promise.allSettled(t.map((e=>this.load(e,null).then((e=>e&&n.add(e))).catch(console.error)))),this.viewport.scener.addObject(n,this.scene),n}))}addForGroup(e,t){return rf(this,void 0,void 0,(function*(){return e&&(yield Promise.allSettled(t.map((t=>rf(this,void 0,void 0,(function*(){return this.load(t,null).then((t=>t&&this.viewport.scener.addObject(t,e))).catch(console.error)})))))),e}))}clearIdb(){return rf(this,void 0,void 0,(function*(){yield this.store.clear(),yield this.cacheStore.clear()}))}dispose(){var e;this.isDisposed=!0,this.modelsPromiseMap.clear(),this.modelsMap.clear(),null===(e=this.gltfLoader.dracoLoader)||void 0===e||e.dispose(),this.datLoader.dispose()}_initLoadingManager(e){e.addHandler(/\.tga$/i,new IC)}_setModelsMap(e,t){this.modelsMap.has(e)||this.modelsMap.set(e,t)}_parseSbm(e){return rf(this,void 0,void 0,(function*(){const{useIndexedDB:t}=this.viewport.options,{url:n}=e,i=t=>rf(this,void 0,void 0,(function*(){const i=yield(new QL).parseBuffer(t,e),{model:s,caches:r}=i;return r&&ff((()=>{this.cacheStore.setItem(n,r)})),s})),s=e=>{var t;null===(t=e.onLoad)||void 0===t||t.call(e,e)};if(t){const t=yield this.cacheStore.getItem(n);if(t){const n=(new JL).parseObject(t,e);return s(n),n}{const e=(yield this.store.getItem(n))||(yield this._fetchBuffer(n)),t=yield i(e);return s(t),t}}{const e=yield this._fetchBuffer(n),t=yield i(e);return s(t),t}}))}_parseSbmx(e){return rf(this,void 0,void 0,(function*(){const{url:t}=e,n=yield this._getBuffer(t),i=lg(n,0,8),s=new DataView(n.slice(8));switch(i){case"SBMG----":for(let e=0;e<s.byteLength;e++){const t=s.getUint8(e),n=(t>>4&15)+(t<<4&240);s.setUint8(e,n)}return this._parseGltf(e,s.buffer);case"SBMD----":return this._parseDat(e,s.buffer);default:return this._parseGltf(e,s.buffer)}}))}_parseDat(e,t){return rf(this,void 0,void 0,(function*(){const{url:n}=e,i=t||(yield this._getBuffer(n)),s=new LS(Object.assign(Object.assign({},e),{format:"dat"})),r=yield this.datLoader.parseAsync(i,n);return r&&s.add(r),s}))}_parseGltf(e,t){return rf(this,void 0,void 0,(function*(){const{url:n}=e,i=qm(n),s=t||(yield this._getBuffer(n)),r=new LS(Object.assign(Object.assign({},e),{format:"gltf"})),o=yield this.gltfLoader.parseAsync(s,i),{animations:a}=o;return a&&a.length>0&&(r.animations=a),o.scene.traverse((e=>{"AmbientLight"!==e.type&&"DirectionalLight"!==e.type||(e.visible=!1),e.castShadow=!0,e.receiveShadow=!0,e instanceof or&&Yy.generate(e.geometry).then((t=>{e.geometry.boundsTree=t}))})),r.add(o.scene),r}))}_parseFbx(e){return rf(this,void 0,void 0,(function*(){const{url:t}=e,n=qm(t),i=yield this._getBuffer(t),s=new LS(Object.assign(Object.assign({},e),{format:"gltf"})),r=this.fbxLoader.parse(i,n),{animations:o}=r;return o&&o.length>0&&(s.animations=o),r.traverse((e=>{"AmbientLight"!==e.type&&"DirectionalLight"!==e.type||(e.visible=!1),e.castShadow=!0,e.receiveShadow=!0,e instanceof or&&Yy.generate(e.geometry).then((t=>{e.geometry.boundsTree=t}))})),s.add(r),s}))}_innerLoad(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:this.scene;var n;return rf(this,void 0,void 0,(function*(){const{url:i}=e,s=yield this.parse(e);return s?(null===(n=s.onLoad)||void 0===n||n.call(s,s),this._setModelsMap(i,s),null!==t&&this.viewport.scener.addObject(s,t),s):null}))}_fetchBuffer(e){return rf(this,void 0,void 0,(function*(){const{useIndexedDB:t}=this.viewport.options,n=yield mf(e),i=yield n.arrayBuffer();return t&&this.store.setItem(e,i),i}))}_getBuffer(e){return rf(this,void 0,void 0,(function*(){const{useIndexedDB:t}=this.viewport.options;if(t){const t=yield this.store.getItem(e);return t||this._fetchBuffer(e)}return this._fetchBuffer(e)}))}}class $L extends HS{constructor(e,t){super("Poi",e,t),this.materials=new Map}create(e){const t=this._createMaterial(e.url),n=new AS(t,e);return this.viewport.scener.addObject(n,this.scene),n}clone(e,t,n){"Poi"!==e.stype&&console.error("In soonspacejs: 方法 clonePoi 参入对象类型错误!");const{id:i,type:s,name:r,level:o,visible:a,position:l,rotation:c,scale:h,onClick:d,onDblClick:u,onRightClick:p,userData:m}=t,f=e.sClone(!1,s);return this._copyMaterial(f),i&&(f.sid=i),r&&(f.name=r),o&&(f.level=o),ng(a)&&(f.visible=a),l&&f.position.set(l.x,l.y,l.z),c&&f.rotation.set(c.x,c.y,c.z),h&&f.scale.set(h.x,h.y,h.z),f.onClick=d?d.bind(f):null,f.onDblClick=u?u.bind(f):null,f.onRightClick=p?p.bind(f):null,m&&(f.userData=m),null!==n&&this.viewport.scener.addObject(f,n||this.scene||e.parent),f}createToGroup(e,t){const n=this.createGroup(e,null);return t.forEach((e=>{const t=this._createMaterial(e.url),i=new AS(t,e);n.add(i)})),this.viewport.scener.addObject(n,this.scene),n}addForGroup(e,t){return e&&(t.forEach((t=>{const n=this._createMaterial(t.url),i=new AS(n,t);e.add(i)})),this.viewport.scener.addObject(e,this.scene)),e}_createMaterial(e){const t=this.materials.get(e);if(!t){const t=(new Md).load(e);t.flipY=!0;const n=new pl({map:t,color:16777215});return this.materials.set(e,n),n}return t}_copyMaterial(e){e.traverse((e=>{(e instanceof or||e instanceof Rl)&&(sg(e.material)?e.material=e.material.map((e=>e.clone())):e.material instanceof xs&&(e.material=e.material.clone()))}))}}class eR extends HS{constructor(e,t){super("PoiNode",e,t)}create(e){this._openEnableRenderCss(e);const t=new CS(e);return this.viewport.scener.addObject(t,this.scene),t}createToGroup(e,t){const n=this.createGroup(e,null);return t.forEach((e=>{this._openEnableRenderCss(e);const t=new CS(e);n.add(t)})),this.viewport.scener.addObject(n,this.scene),n}addForGroup(e,t){return e&&(t.forEach((t=>{this._openEnableRenderCss(t);const n=new CS(t);e.add(n)})),this.viewport.scener.addObject(e,this.scene)),e}_openEnableRenderCss(e){switch(e.type){case"2d":case"2D":this.viewport.rendererManager.setInternalState("enableRenderCss2D",!0);break;case"2.5d":case"2.5D":this.viewport.rendererManager.setInternalState("enableRenderCss2DHalf",!0);break;case"3d":case"3D":this.viewport.rendererManager.setInternalState("enableRenderCss3D",!0)}}}class tR extends HS{constructor(e,t){super("Canvas3D",e,t)}create(e){const t=new VS(e);return this.viewport.scener.addObject(t,this.scene),t}createToGroup(e,t){const n=this.createGroup(e,null);return t.forEach((e=>{const t=new VS(e);n.add(t)})),this.viewport.scener.addObject(n,this.scene),n}addForGroup(e,t){return e&&(t.forEach((t=>{const n=new VS(t);e.add(n)})),this.viewport.scener.addObject(e,this.scene)),e}}class nR{constructor(){this.graph=new Map,this.queue=null,this.previous=new Map}setGraph(e){if(!(e.length<1))for(const t of e){const[e,n]=t;this.graph.set(e,new Map);for(const t of n){const[n,i]=t,s=this.graph.get(e);null==s||s.set(n,i)}}}getPath(e,t){var n;if(e===t)return[];const i=this.queue=new jm;i.add(e,0),this.previous.set(e,null);let s=null;for(;s=i.shift();){if(s===t){const e=[];for(;null!==s&&null!==this.previous.get(s);)e.unshift(s),s=null!==(n=this.previous.get(s))&&void 0!==n?n:null;return e}const e=i.getDistance(s);if(e===1/0)return[];const r=this.graph.get(s);r&&r.forEach(((t,n)=>{const r=i.getDistance(n),o=e+t;o<r&&(i.update(n,o),this.previous.set(n,s))}))}return[]}}class iR extends HS{constructor(e,t){super("Topology",e,t),this.dijkstra=new nR}createFromGml(e){return rf(this,void 0,void 0,(function*(){const{url:t,linkWidth:n=20,linkColor:i=65280,renderNode:s=!0,nodeColor:r=255}=e;return yf(t).then((t=>{if(!t||!t.MultiLayeredGraph)return Promise.reject('In soonspace: createTopologyFromGml "url" path error!');const o=[],a=new Map;let l=[],c=[];const h=t.MultiLayeredGraph.SpaceLayerMember.SpaceLayer.X_floor;sg(h)?h.forEach((e=>{l=[...l,...e.state],c=[...c,...e.transition]})):(l=[...l,...h.state],c=[...c,...h.transition]),l.forEach(((e,t)=>{const n=e.State._attributes["gml:id"],i=e.State.topoNode["gml:Node"].node_name;o.push({id:tg(n)?n:"",name:tg(i)?i:"",position:{x:Number(e.State.topoNode["gml:Node"].xcoord["#text"]),y:Number(e.State.topoNode["gml:Node"].zcoord["#text"]),z:-1*Number(e.State.topoNode["gml:Node"].ycoord["#text"])},graphs:[]}),a.set(n,t)})),c.forEach((e=>{const t=e.Transition.topoEdge["gml:Edge"]["gml:directedNode"][0]._attributes["xlink:href"],n=e.Transition.topoEdge["gml:Edge"]["gml:directedNode"][1]._attributes["xlink:href"],i=e.Transition.topoEdge["gml:Edge"].restrict["#text"],s=e.Transition.topoEdge["gml:Edge"].passable["#text"],r=a.get(t),l=a.get(n),c=e.Transition._attributes["gml:id"],h=e.Transition.topoEdge["gml:Edge"].link_name["#text"];void 0!==r&&void 0!==l&&("2"!==s&&"3"!==s&&o[r].graphs.push({targetNodeId:n,linkInfo:{id:c,name:h},enable:!0,restrict:parseInt(i),passable:parseInt(s)}),"1"!==s&&"3"!==s&&o[l].graphs.push({targetNodeId:t,linkInfo:{id:c,name:h},enable:!0,restrict:parseInt(i),passable:parseInt(s)}))}));const d=new zS(Object.assign(Object.assign({},e),{type:"network",nodes:o,linkWidth:n,renderLink:!0,linkColor:i,renderNode:s,nodeColor:r}));return this.setDijkstraGraph(d.nodes),this.viewport.scener.addObject(d,this.scene),Promise.resolve(d)}))}))}create(e){const t=this.generateLineTopologyInfoNodeGraphs(e),n=new zS(t);return this.setDijkstraGraph(n.nodes),this.viewport.scener.addObject(n,this.scene),n}resetNodes(e,t){const n=this.generateLineTopologyInfoNodeGraphs(Object.assign(Object.assign({},e.info),{nodes:t}));return e.resetNodes(n.nodes),this.viewport.signals.objectChanged.dispatch(),e}createToGroup(e,t){const n=this.createGroup(e,null);return t.forEach((e=>{const t=this.generateLineTopologyInfoNodeGraphs(e),i=new zS(t);this.setDijkstraGraph(i.nodes),n.add(i)})),this.viewport.scener.addObject(n,this.scene),n}addForGroup(e,t){return e&&t.forEach((t=>{const n=this.generateLineTopologyInfoNodeGraphs(t),i=new zS(n);this.setDijkstraGraph(i.nodes),e.add(i)})),e}getShortestPath(e,t){const n=$m(e.info.nodes),i=Dm(t.start),s=Dm(t.end);let r=null,o=1/0,a=null,l=1/0;for(let t=0;t<n.length;t++){const c=n[t];if(0===c.graphs.length)continue;const h=e.nodes.find((e=>e.sid===c.id));if(!h)continue;const d=h.getWorldPosition(new ri),u=d.distanceTo(i),p=d.distanceTo(s);u<o&&(o=u,r=c),p<l&&(l=p,a=c)}if(!r||!a||r.id===a.id)return null;const c=r.id,h=a.id,d=this.dijkstra.getPath(c,h);if(0===d.length)return null;d.unshift(r.id);const u=[];for(let e=0;e<d.length;e++){const t=n.find((t=>t.id==d[e]));t&&(t.id+=cg(),t.position.y+=.01,u.push(t))}const p=Object.assign(Object.assign(Object.assign({},t),{type:"line",nodes:u}),e.getSpaceAttribute(!0));this.generateLineTopologyInfoNodeGraphs(p);const m=new zS(p);return this.viewport.scener.addObject(m,this.scene),m}getShortestPathByMultipleStartPoints(e,t){const{nodes:n}=e.info,i=[];t.start.forEach((e=>{const s=Dm(e),r=Dm(t.end);let o=null,a=1/0,l=null,c=1/0;if(n.forEach((e=>{if(e.graphs.length>0){const t=Dm(e.position),n=t.distanceTo(s),i=t.distanceTo(r);n<a&&(a=n,o=e.id),i<c&&(c=i,l=e.id)}})),o&&l){let e=0;const t=this.dijkstra.getPath(o,l);if(t.length>0){const o=[{id:"startPoint",position:s,graphs:[]}];t.forEach(((t,i)=>{const r=n.find((e=>e.id==t));r&&(e+=0===i?Dm(r.position).distanceTo(s):Dm(r.position).distanceTo(Dm(o[o.length-1].position)),o.push(r))})),o.push({id:"endPoint",position:r,graphs:[]}),e+=r.distanceTo(Dm(o[o.length-1].position)),i.push({nodeInfo:o,pathLength:e})}}}));let s=[],r=1/0;if(i.forEach((e=>{let{nodeInfo:t,pathLength:n}=e;n<r&&(r=n,s=t)})),s.length){for(let e=0;e<s.length;e++)s[e].position.y+=.01;const n=Object.assign(Object.assign({},t),{type:"line",nodes:s,position:e.getWorldPosition(new ri),rotation:(new Oi).setFromQuaternion(e.getWorldQuaternion(new si)),scale:e.getWorldScale(new ri)});this.generateLineTopologyInfoNodeGraphs(n);const i=new zS(n);return this.viewport.scener.addObject(i,this.scene),i}return null}getShortestPathByMultipleEndPoints(e,t){const{nodes:n}=e.info,i=[];t.end.forEach((e=>{const s=Dm(t.start),r=Dm(e);let o=null,a=1/0,l=null,c=1/0;if(n.forEach((e=>{if(e.graphs.length>0){const t=Dm(e.position),n=t.distanceTo(s),i=t.distanceTo(r);n<a&&(a=n,o=e.id),i<c&&(c=i,l=e.id)}})),o&&l){let e=0;const t=this.dijkstra.getPath(o,l);if(t.length>0){const o=[{id:"startPoint",position:s,graphs:[]}];t.forEach(((t,i)=>{const r=n.find((e=>e.id==t));r&&(e+=0===i?Dm(r.position).distanceTo(s):Dm(r.position).distanceTo(Dm(o[o.length-1].position)),o.push(r))})),o.push({id:"endPoint",position:r,graphs:[]}),e+=r.distanceTo(Dm(o[o.length-1].position)),i.push({nodeInfo:o,pathLength:e})}}}));let s=[],r=1/0;if(i.forEach((e=>{let{nodeInfo:t,pathLength:n}=e;n<r&&(r=n,s=t)})),s.length){for(let e=0;e<s.length;e++)s[e].position.y+=.01;const n=Object.assign(Object.assign({},t),{type:"line",nodes:s,position:e.getWorldPosition(new ri),rotation:(new Oi).setFromQuaternion(e.getWorldQuaternion(new si)),scale:e.getWorldScale(new ri)});this.generateLineTopologyInfoNodeGraphs(n);const i=new zS(n);return this.viewport.scener.addObject(i,this.scene),i}return null}setDijkstraGraph(e){const t=[];for(let n=0;n<e.length;n++){const i=e[n];if(0===i.graphs.length)continue;const s=[];for(let t=0;t<i.graphs.length;t++){const n=i.graphs[t],r=e.find((e=>e.sid===n.targetNodeId));if(!r)continue;const o=i.getWorldPosition(new ri),a=r.getWorldPosition(new ri);s.push([n.targetNodeId,o.distanceTo(a)])}t.push([i.sid,s])}t.length>0&&this.dijkstra.setGraph(t)}generateLineTopologyInfoNodeGraphs(e){const{type:t,nodes:n}=e;if("line"===t)for(let t=0;t<n.length;t++)if(t===n.length-1)n[t].graphs=[];else{const i=e.nodes[t],s=e.nodes[t+1];n[t].graphs=[{targetNodeId:s.id,linkInfo:{id:`${i.id}_to_${s.id}`,name:`${i.name||i.id}_to_${s.name||s.id}`},enable:!0,restrict:0,passable:0}]}return Object.assign(Object.assign({},e),{nodes:n})}}class sR extends tc{constructor(e,t){const n=new Hs;n.setAttribute("position",new Xs([1,1,0,-1,1,0,-1,-1,0,1,-1,0,1,1,0],3)),n.computeBoundingSphere();super(n,new jl({fog:!1})),this.light=e,this.color=t,this.type="RectAreaLightHelper";const i=new Hs;i.setAttribute("position",new Xs([1,1,0,-1,1,0,-1,-1,0,1,1,0,-1,-1,0,1,-1,0],3)),i.computeBoundingSphere(),this.add(new or(i,new ws({side:1,fog:!1})))}updateMatrixWorld(){if(this.scale.set(.5*this.light.width,.5*this.light.height,1),void 0!==this.color)this.material.color.set(this.color),this.children[0].material.color.set(this.color);else{this.material.color.copy(this.light.color).multiplyScalar(this.light.intensity);const e=this.material.color,t=Math.max(e.r,e.g,e.b);t>1&&e.multiplyScalar(1/t),this.children[0].material.color.copy(this.material.color)}this.matrixWorld.extractRotation(this.light.matrixWorld).scale(this.scale).copyPosition(this.light.matrixWorld),this.children[0].matrixWorld.copy(this.matrixWorld)}dispose(){this.geometry.dispose(),this.material.dispose(),this.children[0].geometry.dispose(),this.children[0].material.dispose()}}class rR extends HS{constructor(e,t){super("Helper",e,t)}addGridHelper(e){const{id:t,size:n=1e3,divisions:i=20,color:s="#fff",position:r={x:0,y:0,z:0},rotation:o={x:0,y:0,z:0},scale:a={x:1,y:1,z:1}}=e,l=new np(n,i,s,s);return l.position.set(r.x,r.y,r.z),l.rotation.set(o.x,o.y,o.z),l.scale.set(a.x,a.y,a.z),l.userData.sid=t,l.userData.stype="Helper",this.viewport.scener.addObject(l,this.scene),l}addAxesHelper(e){const{id:t,axesLength:n=1e3}=e,i=new xp(n);return i.userData.sid=t,i.userData.stype="Helper",this.viewport.scener.addObject(i,this.scene),i}addBoxHelper(e){const{id:t,box:n,color:i="#00ff00"}=e,s=new mp(n,new Fn(i));return s.userData.sid=t,s.userData.stype="Helper",this.viewport.scener.addObject(s,this.scene),s}addPlaneHelper(e){const{id:t,width:n=500,height:i=500,color:s="#00ff00",opacity:r=.2,position:o={x:0,y:0,z:0},rotation:a={x:0,y:0,z:0},scale:l={x:1,y:1,z:1}}=e,c=new xS(new Rr(n,i),new ws({color:s,opacity:r,transparent:r<1,side:2}),{id:t,position:o,rotation:a,scale:l});return c.userData.sid=t,c.userData.stype="Helper",this.viewport.scener.addObject(c,this.scene),c}addGroundHelper(e){const{imgUrl:t,id:n,width:i=500,height:s=500,opacity:r=1,position:o={x:0,y:0,z:0},rotation:a={x:0,y:0,z:0},scale:l={x:1,y:1,z:1},repeat:c={x:10,y:10}}=e,h=(new Md).load(t),d=new Rr(i,s);d.computeBoundingBox();const u=new kh({side:2,map:h,transparent:r<1,opacity:r,roughness:.8});u.map&&(u.map.repeat.set(c.x,c.x),u.map.wrapS=1e3,u.map.wrapT=1e3,u.map.version++),a.x-=Math.PI/2,u.version++;const p=new DS(d,u,{id:n,position:o,rotation:a,scale:l});return p.userData.sid=n,p.userData.stype="Helper",this.viewport.scener.addObject(p,this.scene),p}addDirectionalLightHelper(e){const{id:t,light:n,color:i,size:s=50}=e,r=new ap(n,s,i);return r.userData.sid=t,r.userData.stype="Helper",this.viewport.scener.addObject(r,this.scene),r}addHemisphereLightHelper(e){const{id:t,light:n,color:i,size:s=20}=e,r=new tp(n,s,i);return r.userData.sid=t,r.userData.stype="Helper",this.viewport.scener.addObject(r,this.scene),r}addSpotLightHelper(e){const{id:t,light:n,color:i}=e,s=new Uu(n,i);return s.userData.sid=t,s.userData.stype="Helper",this.viewport.scener.addObject(s,this.scene),s}addPointLightHelper(e){const{id:t,light:n,color:i,size:s=20}=e,r=new Qu(n,s,i);return r.userData.sid=t,r.userData.stype="Helper",this.viewport.scener.addObject(r,this.scene),r}addRectAreaLightHelper(e){const{id:t,light:n,color:i}=e,s=new sR(n,i);return s.userData.sid=t,s.userData.stype="Helper",this.viewport.scener.addObject(s,this.scene),s}}class oR extends HS{constructor(e,t){super("PluginObject",e,t)}createObject(e,t){const n=new TS(e);return t&&n.add(t),this.viewport.scener.addObject(n,this.scene),n}addToObject(e,t){return e?(this.viewport.scener.addObject(t,e),e):null}}class aR extends HS{constructor(e,t){super("Group",e,t)}}class lR{constructor(e){this.viewport=e,this.cache={objects:new Map},this.scene=e.scene,this.store={groupManager:new aR(e,this.scene),lightManager:new kS(e,this.scene),modelManager:new qL(e,this.scene),poiManager:new $L(e,this.scene),poiNodeManager:new eR(e,this.scene),canvas3DManager:new tR(e,this.scene),topologyManager:new iR(e,this.scene),helperManager:new rR(e,this.scene),pluginObjectManager:new oR(e,this.scene)},e.postUpdate.set("ManagerRender",this.update.bind(this)),e.signals.objectAdded.add(this.setObjectCache.bind(this)),e.signals.objectRemoved.add(this.deleteObjectCache.bind(this))}levelUpdate(){const e=(e,t)=>{e.visible!==t&&(e.visible=t,e.matrixAutoUpdate=t,e.autoUpdate=!0)},t=t=>{const{level:n,handleHide:i,autoUpdate:s}=t,{max:r=null,min:o=null}=n;if(s)t.autoUpdate=!1,this.viewport.signals.objectChanged.dispatch();else if(!i&&(ig(r)||ig(o))){const n=this.viewport.camera.position.distanceTo(t.position);ig(r)&&n>r||ig(o)&&n<o?e(t,!1):e(t,!0)}};this.scene.traverse((e=>{(e instanceof SS||e instanceof xS)&&t(e)}))}update(){if(0===this.scene.children.length)return;const e=performance.now();this.viewport.options.levelEnabled&&this.levelUpdate(),this.viewport.signals.loadRendered.dispatch(performance.now()-e)}isObjectInScene(e){let t=!1;return e.traverseAncestors((e=>{e===this.scene&&(t=!0)})),t}getObjectById(e){const t=this.getObjectCache(e);if(t){if(this.isObjectInScene(t))return t}return null}getObjectByName(e){return this._getObjectByProps("name",e)}getObjectByUserDataProperty(e,t){const n=[];return this.cache.objects.forEach((i=>{this.isObjectInScene(i)&&rg(i)&&(i instanceof SS||i instanceof xS||i.userData.stype)&&(og(e)&&e(i.userData)||tg(e)&&i.userData[e]===t)&&n.push(i)})),n}removeObjectById(e){const t=this.getObjectById(e);return!!t&&(this.viewport.scener.removeObject(t),!0)}_getObjectByProps(e,t){const n=[];return this.cache.objects.forEach((i=>{this.isObjectInScene(i)&&((i instanceof SS||i instanceof xS)&&rg(i)&&i[e]===t||rg(i)&&i.userData.stype&&("name"===e&&i.name===t||"sid"===e&&i.userData.sid===t))&&n.push(i)})),n}getObjectCache(e){return this.cache.objects.get(e)}setObjectCache(e){const t=(e,t)=>{const n=this.cache.objects.get(t);n&&n!==e&&Vm(`object id ${t} already exists in scene`)};null==e||e.traverse((n=>{if(n instanceof SS||n instanceof xS){if("string"==typeof n.sid&&n.sid.startsWith("[soonspacejs]: "))return;t(n,n.sid),this.cache.objects.set(n.sid,n)}else n.userData.sid&&e.userData.stype&&(t(n,n.userData.sid),this.cache.objects.set(n.userData.sid,n))}))}deleteObjectCache(e){null==e||e.traverse((t=>{t instanceof SS||t instanceof xS?this.cache.objects.delete(t.sid):t.userData.sid&&e.userData.stype&&this.cache.objects.delete(t.userData.sid)}))}clearObject(){this.store.modelManager.clear(),this.store.poiManager.clear(),this.store.poiNodeManager.clear(),this.store.canvas3DManager.clear(),this.store.topologyManager.clear(),this.store.helperManager.clear(),this.store.pluginObjectManager.clear()}clear(){this.clearObject(),this.store.lightManager.clear()}dispose(){this.store.modelManager.dispose(),this.cache.objects.clear(),this.clear()}}function cR(e){const t=hR(e),n=new Wi;n.setFromMatrix3(t);const i=e[0],s=n.clone();s.setPosition(i);const r=s.clone().invert(),o=e.map((e=>{const t=e.clone().applyMatrix4(r);return new Gn(t.x,t.y)})),a=new Qc(o),l=new Eh(a),c=new Du;c.setFromPoints(o);const h=dR(c);return l.getAttribute("uv").applyMatrix3(h),l.applyMatrix4(n),{geometry:l,polygonBox:c,modelMatrix:n,planeMatrix:s,projectionMatrix:r,position:i}}function hR(e){const[t,n,i]=e,s=new wr;s.setFromCoplanarPoints(n,t,i);const r=s.normal,o=r.clone().cross(new ri(0,0,1));o.equals(new ri)&&o.set(1,0,0);const a=r.clone().cross(o);o.normalize(),a.normalize(),r.normalize();const l=new An;return l.elements=[o.x,o.y,o.z,a.x,a.y,a.z,r.x,r.y,r.z],l}function dR(e){const t=e.min,n=e.getSize(new Gn),i=new An;return i.elements=[n.x,0,0,0,n.y,0,t.x,t.y,1],i.invert()}function uR(e,t){const n=pR(t);return e.intersectsBox(n)}function pR(e){const t=new li,n=t.min.clone(),i=t.max.clone();if(t.setFromObject(e),t.min.equals(n)&&t.max.equals(i)){const n=new ri;e.getWorldPosition(n),t.min.copy(n),t.max.copy(n)}if(e.isInstancedMesh){const{count:n,matrixWorld:i,geometry:s}=e;let r=s.boundingBox;if(r||(s.computeBoundingBox(),r=s.boundingBox),r){const s=i.clone();for(let i=0;i<n;i++){const n=new Wi;e.getMatrixAt(i,n),n.premultiply(s);const o=r.clone();o.applyMatrix4(s),t.union(o)}}}return t}function mR(e,t,n){if("string"==typeof e){let i=t?null==n?void 0:n.get(e):null;if(!i){i=(new Md).load(e),null==n||n.set(e,i)}return i}return e instanceof HTMLImageElement?new Jn(e):e instanceof HTMLCanvasElement?new gc(e):new pc(e)}function fR(e,t,n,i){const s=e.map,r=mR(t,n,i);if(!s)return e.map=s,s;const o=r.source;return r.copy(s),r.source=o,e.map=r,r}function gR(e,t){const{top:n,left:i,bottom:s,right:r,front:o,back:a}=e,l=new ri(r,n,o),c=new ri(i,s,a),h=new li;return function(e){return h.max.addVectors(e,l),h.min.subVectors(e,c),t.filter((e=>uR(h,e)))}}function yR(e,t){const n=new Ri(new ri,e);return function(e){return n.center.copy(e),t.filter((e=>uR(n,e)))}}function bR(e,t){const n=e.length-1,i=[];for(let t=0;t<n;t++){const n=e[t],s=e[t+1],r=new ku(n,s);i.push(r)}const s=new Ri(new ri,t);return function(e){return e.filter((e=>{const t=pR(e),n=new ri;t.getCenter(n);const r=i.filter((e=>{const t=e.closestPointToPointParameter(n);return 0<=t||t>=1}));if(0===r.length)return!1;let o=1/0,a=n;for(const e of r){const t=e.closestPointToPoint(n,!0,new ri),i=n.distanceToSquared(t);i<o&&(o=i,a=t)}return s.center.copy(a),s.intersectsBox(t)}))}}function vR(e,t){const{image:n,color:i,width:s,height:r,position:o,rotation:a,needLight:l,id:c,name:h,userData:d,level:u,visible:p,cache:m}=e,f=sf(e,["image","color","width","height","position","rotation","needLight","id","name","userData","level","visible","cache"]),g=new Rr(s,r),y=n?Object.assign(Object.assign({transparent:!0},f),{map:mR(n,null==m||m,t)}):f,b=l?new Uh(y):new ws(y),v=new xS(g,b,{id:c,name:h,userData:d,level:u,visible:p});return o&&v.position.set(o.x,o.y,o.z),a&&v.rotation.set(a.x,a.y,a.z),v}function xR(e,t){const{points:n,image:i,color:s,needLight:r,id:o,name:a,userData:l,level:c,visible:h,cache:d}=e,u=sf(e,["points","image","color","needLight","id","name","userData","level","visible","cache"]),p=n.map((e=>new ri(e.x,e.y,e.z))),m=i?Object.assign(Object.assign({transparent:!0},u),{map:mR(i,null==d||d,t)}):u,f=r?new Uh(m):new ws(m),{geometry:g,position:y}=cR(p),b=new xS(g,f,{id:o,name:a,userData:l,level:c,visible:h});return b.position.copy(y),b}class wR{constructor(e){this.THREE=Vp,this.TWEEN=Zm,this.utils=hg,this.THREE_PLUGINS={TransformControls:jp,Reflector:bm,mergeBufferGeometries:vm},this.version=t,this.animation=ug,this.library=BS,this.plugins={},this.textureCache=new Map;const{el:n,options:i={},events:s={}}=e;if(this.domElement=document.querySelector(n),this.options=Object.assign(Object.assign({},{showInfo:!1,showStats:!1,showViewHelper:!1,showGrid:!1,background:{color:11459572,alpha:!1},fog:!1,controls:{type:"free"},hoverEnabled:!1,levelEnabled:!1,closeInfoLog:!1,closeWarnLog:!1,useIndexedDB:!0,logarithmicDepthBuffer:!0}),i),this.viewport=new vS(this.options),this.signals=this.viewport.signals,this.manager=new lR(this.viewport),!this.domElement)throw new Error(`In SoonSpace: Can't find element by "${n}"!`);this.domElement.appendChild(this.viewport.container),this._init(),this._initEvents(s),this._initDefaultSettings()}_init(){const{showGrid:t,background:n,fog:i,controls:s,closeInfoLog:r,closeWarnLog:o,useIndexedDB:a}=this.options;if(!r){Nm(" ____ ____ _ \n / ___| ___ ___ _ __ / ___| _ __ __ _ ___ ___ (_)___ \n \\___ \\ / _ \\ / _ \\| '_ \\\\___ \\| '_ \\ / _` |/ __/ _ \\ | / __| \n ___) | (_) | (_) | | | |___) | |_) | (_| | (_| __/_ | \\__ \\ \n |____/ \\___/ \\___/|_| |_|____/| .__/ \\__,_|\\___\\___(_)/ |___/ \n |_| |__/ \n",{color:"#3eaf7c"}),Nm(e,{color:"#3eaf7c","font-size":"24px"}),Nm(`当前版本: ${this.version}`,{color:"#3eaf7c","font-size":"12px"}),Nm("文档: http://www.xwbuilders.com:8800",{color:"#3eaf7c","font-size":"12px"}),Nm("样例: http://www.xwbuilders.com:8800/examples",{color:"#3eaf7c","font-size":"12px"}),Nm("GitHub: https://github.com/soonspacejs",{color:"#3eaf7c","font-size":"12px"})}t&&this.addGridHelper(!0===t?{id:"defaultGridHelper"}:t),(null==n?void 0:n.skyBox)?tg(null==n?void 0:n.skyBox)?this.setSphereSkyBackground(null==n?void 0:n.skyBox):rg(null==n?void 0:n.skyBox)&&this.setSkyBackground(n.skyBox.dirPath,n.skyBox.fileNames):(null==n?void 0:n.img)?this.setBackgroundImage(n.img):(null==n?void 0:n.color)&&this.setBackgroundColor(n.color),i&&this.openSceneFog(!0===i?void 0:i),s&&this.setControlsOptions(s),o&&(window.console.warn=function(){}),a&&!window.indexedDB&&(this.options.useIndexedDB=!1,window.console.warn("Your browser doesn't support a stable version of IndexedDB. Such and such feature will not be available."))}_initEvents(e){const{modelHover:t,modelUnHover:n,modelClick:i,modelRightClick:s,modelDblClick:r,poiHover:o,poiUnHover:a,poiClick:l,poiRightClick:c,poiDblClick:h,selectPosition:d,sceneClick:u,resize:p}=e;t&&this.signals.modelHover.add(t),n&&this.signals.modelUnHover.add(n),i&&this.signals.modelClick.add(i),s&&this.signals.modelRightClick.add(s),r&&this.signals.modelDblClick.add(r),o&&this.signals.poiHover.add(o),a&&this.signals.poiUnHover.add(a),l&&this.signals.poiClick.add(l),c&&this.signals.poiRightClick.add(c),h&&this.signals.poiDblClick.add(h),d&&this.signals.selectPosition.add(d),u&&this.signals.sceneClick.add(u),p&&this.signals.windowResize.add(p),this.signals.windowResize.dispatch(),window.addEventListener("resize",(()=>this.signals.windowResize.dispatch()),!1)}_initDefaultSettings(){this.setEnvironment(),this.setColorSpace("sRGB"),this.setToneMapping({type:"ACESFilmic",exposure:.8})}registerPlugin(e,t){const n=new e(this);return this.plugins[t]=n,n}getPlugin(e){return this.plugins[e]?this.plugins[e]:null}createPluginObject(e,t){return this.manager.store.pluginObjectManager.createObject(e,t)}addToPluginObject(e,t){const n=this.getObjectById(e);return this.manager.store.pluginObjectManager.addToObject(n,t)}getPluginObjectById(e){return Vm("getPluginObjectById is deprecated, use getObjectById instead"),this.getObjectById(e)}getPluginObjectByName(e){return Vm("getPluginObjectByName is deprecated, use getObjectByName instead"),this.getObjectByName(e)}removePluginObjectById(e){return Vm("removePluginObjectById is deprecated, use removeObjectById instead"),this.removeObjectById(e)}setSSR(e){this.viewport.setSSR(e)}setBloom(e){this.viewport.setBloom(e)}setSSAO(e){this.viewport.setSSAO(e)}setColorSpace(e){this.viewport.setColorSpace(e)}setToneMapping(e){this.viewport.setToneMapping(e)}setHoverEnabled(e){this.viewport.setHoverEnabled(e)}setBackgroundColor(e){this.viewport.setBackgroundColor(e)}setBackgroundImage(e){this.viewport.setBackgroundImage(e)}setSphereSkyBackground(e){this.viewport.setSphereSkyBackground(e)}setSkyBackground(e,t){this.viewport.setSkyBackground(e,t)}setEnvironment(){return this.viewport.setEnvironment()}playModelAnimation(e,t){return this.viewport.playModelAnimation(e,t)}stopModelAnimation(e,t){this.viewport.stopModelAnimation(e,t)}getOffsetByPosition(e){return this.viewport.getOffsetByPosition(e)}getPositionByOffset(e,t){return this.viewport.getPositionByOffset(e,t)}render(e){return this.viewport.render(e)}clearSignals(){this.viewport.clearSignals()}dispose(){this.manager.dispose(),this.viewport.dispose()}getCameraViewpoint(){return this.viewport.cameraManager.getCameraViewpoint()}setCameraViewpoint(e){this.viewport.cameraManager.setCameraViewpoint(e)}getCameraTargetView(){return this.viewport.cameraManager.getCameraViewpoint()}setCameraTargetView(e){this.viewport.cameraManager.setCameraViewpoint(e)}flyTo(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"frontTop",n=arguments.length>2?arguments[2]:void 0;return"orbit"===this.viewport.controls.options.type&&this.utils.warn("flyTo 方法不适用于 orbit 控制器"),this.viewport.cameraManager.flyTo(e,t,n)}flyToBoundingBox(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"frontTop",n=arguments.length>2?arguments[2]:void 0;return this.viewport.cameraManager.flyToBoundingBox(e,t,n)}flyToObj(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"frontTop",n=arguments.length>2?arguments[2]:void 0;return this.viewport.cameraManager.flyToObj(e,t,n)}flyMainViewpoint(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"frontTop",t=arguments.length>1?arguments[1]:void 0;return this.flyToObj(this.manager.scene,e,t)}surroundOnTarget(e,t){return this.viewport.cameraManager.surroundOnTarget(e,t)}surroundOnObject(e,t){return this.viewport.cameraManager.surroundOnObject(e,t)}getObjectLabelPos(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"frontTop",n=arguments.length>2?arguments[2]:void 0;return this.viewport.cameraManager.getObjectLabelPos(e,t,n)}setControlsOptions(e){return this.viewport.controls.setOptions(e)}addObject(e,t){this.viewport.scener.addObject(e,t)}removeObject(e){this.viewport.scener.removeObject(e)}openSceneFog(e){this.viewport.scener.openSceneFog(e)}closeSceneFog(){this.viewport.scener.closeSceneFog()}setSky(e){return this.viewport.setSky(e)}getScreenshot(){return this.screenshot()}screenshot(){return this.viewport.screenshot()}edgeShow(e,t){return this.viewport.scener.edgeShow(e,t)}unEdgeShow(e){return this.viewport.scener.unEdgeShow(e)}strokeShow(e,t){return this.viewport.scener.strokeShow(e,t)}unStrokeShow(e){return this.viewport.scener.unStrokeShow(e)}opacityShow(e,t){return this.viewport.scener.opacityShow(e,t)}unOpacityShow(e){return this.viewport.scener.unOpacityShow(e)}highlightShow(e,t){return this.viewport.scener.highlightShow(e,t)}unHighlightShow(e){return this.viewport.scener.unHighlightShow(e)}emissiveShow(e,t){return this.viewport.scener.emissiveShow(e,t)}unEmissiveShow(e){return this.viewport.scener.unEmissiveShow(e)}clearObject(){this.manager.clearObject()}clear(){this.manager.clear()}createAmbientLight(e){return this.manager.store.lightManager.createAmbientLight(e)}setAmbientLight(e){const t=this.getObjectById(e.id);return this.manager.store.lightManager.setAmbientLight(t,e)}createDirectionalLight(e){return this.manager.store.lightManager.createDirectionalLight(e)}setDirectionalLight(e){const t=this.getObjectById(e.id);return this.manager.store.lightManager.setDirectionalLight(t,e)}createHemisphereLight(e){return this.manager.store.lightManager.createHemisphereLight(e)}setHemisphereLight(e){const t=this.getObjectById(e.id);return this.manager.store.lightManager.setHemisphereLight(t,e)}createSpotLight(e){return this.manager.store.lightManager.createSpotLight(e)}setSpotLight(e){const t=this.getObjectById(e.id);return this.manager.store.lightManager.setSpotLight(t,e)}createPointLight(e){return this.manager.store.lightManager.createPointLight(e)}setPointLight(e){const t=this.getObjectById(e.id);return this.manager.store.lightManager.setPointLight(t,e)}createRectAreaLight(e){return this.manager.store.lightManager.createRectAreaLight(e)}setRectAreaLight(e){const t=this.getObjectById(e.id);return this.manager.store.lightManager.setRectAreaLight(t,e)}getLightById(e){return Vm("getLightById is deprecated, use getObjectById instead"),this.getObjectById(e)}removeLightById(e){return Vm("removeLightById is deprecated, use removeObjectById instead"),this.removeObjectById(e)}getAllLight(){return this.manager.store.lightManager.getAll()}clearLight(){return this.manager.store.lightManager.clear()}showAllLight(){return this.manager.store.lightManager.showAll()}hideAllLight(){return this.manager.store.lightManager.hideAll()}updateAllShadow(){return this.manager.store.lightManager.updateAllShadow()}getObjectById(e){return this.manager.getObjectById(e)}getObjectByName(e){return this.manager.getObjectByName(e)}getObjectByUserDataProperty(e,t){return this.manager.getObjectByUserDataProperty(e,t)}removeObjectById(e){return this.manager.removeObjectById(e)}createGroup(e){return this.manager.store.groupManager.createGroup(e)}getGroupById(e){return Vm("getGroupById is deprecated, use getObjectById instead"),this.getObjectById(e)}getGroupByName(e){return Vm("getGroupByName is deprecated, use getObjectByName instead"),this.getObjectByName(e)}getAllGroup(){return this.manager.store.groupManager.getAll()}showAllGroup(){return this.manager.store.groupManager.showAll()}hideAllGroup(){return this.manager.store.groupManager.hideAll()}removeGroupById(e){return Vm("removeGroupById is deprecated, use removeObjectById instead"),this.removeObjectById(e)}loadSbm(e){return Vm("loadSbm is deprecated, use loadModel instead"),this.loadModel(e)}parseSbm(){Vm("parseSbm is deprecated!")}cloneSbm(e,t,n){return Vm("cloneSbm is deprecated, use cloneModel instead"),this.cloneModel(e,t,n)}getSbmById(e){return Vm("getSbmById is deprecated, use getObjectById instead"),this.getObjectById(e)}getSbmByName(e){return Vm("getSbmByName is deprecated, use getObjectByName instead"),this.getObjectByName(e)}getSbmByUserDataProperty(e,t){return Vm("getSbmByUserDataProperty is deprecated, use getObjectByUserDataProperty instead"),this.getObjectByUserDataProperty(e,t)}removeSbmById(e){return Vm("removeSbmById is deprecated, use removeObjectById instead"),this.removeObjectById(e)}createGroupForSbm(e){return Vm("createGroupForSbm is deprecated, use createGroup instead"),this.createGroup(e)}loadSbmToGroup(e,t){return Vm("loadSbmToGroup is deprecated, use loadModelToGroup instead"),this.loadModelToGroup(e,t)}addSbmForGroup(e,t){return Vm("addSbmForGroup is deprecated, use addModelForGroup instead"),this.addModelForGroup(e,t)}createSbmGroupFromXml(){Vm("createGroupForSbm is deprecated!")}getSbmGroupById(e){return Vm("getSbmGroupById is deprecated, use getObjectById instead"),this.getObjectById(e)}getSbmGroupByName(e){return Vm("getSbmGroupByName is deprecated, use getObjectByName instead"),this.getObjectByName(e)}getAllSbmGroup(){return Vm("getAllSbmGroup is deprecated, use getAllGroup instead"),this.getAllGroup()}removeSbmGroupById(e){return Vm("removeSbmGroupById is deprecated, use removeObjectById instead"),this.removeObjectById(e)}clearSbm(){return Vm("clearSbm is deprecated, use clearModel instead"),this.clearModel()}getAllSbm(){return Vm("getAllSbm is deprecated, use getAllModel instead"),this.getAllModel()}showAllSbm(){return Vm("showAllSbm is deprecated, use showAllModel instead"),this.showAllModel()}hideAllSbm(){return Vm("hideAllSbm is deprecated, use hideAllModel instead"),this.hideAllModel()}getSbmModelMaps(){return Vm("getSbmModelMaps is deprecated, use getModelsMap instead"),this.getModelsMap()}setSbmModelMaps(e){return Vm("setSbmModelMaps is deprecated, use setModelsMap instead"),this.setModelsMap(e)}setModelDracoDecoderPath(e){return this.manager.store.modelManager.setDracoDecoderPath(e)}loadModel(e){return this.manager.store.modelManager.load(e)}cloneModel(e,t,n){return this.manager.store.modelManager.clone(e,t,n)}getModelById(e){return Vm("getModelById is deprecated, use getObjectById instead"),this.getObjectById(e)}getModelByName(e){return Vm("getModelByName is deprecated, use getObjectByName instead"),this.getObjectByName(e)}getModelByUserDataProperty(e,t){return Vm("getModelByUserDataProperty is deprecated, use getObjectByUserDataProperty instead"),this.getObjectByUserDataProperty(e,t)}removeModelById(e){return Vm("removeModelById is deprecated, use removeObjectById instead"),this.removeObjectById(e)}createGroupForModel(e){return Vm("createGroupForModel is deprecated, use createGroup instead"),this.createGroup(e)}loadModelToGroup(e,t){return this.manager.store.modelManager.loadToGroup(e,t)}addModelForGroup(e,t){const n=this.getObjectById(e);return this.manager.store.modelManager.addForGroup(n,t)}getModelGroupById(e){return Vm("getModelGroupById is deprecated, use getObjectById instead"),this.getObjectById(e)}getModelGroupByName(e){return Vm("getModelGroupByName is deprecated, use getObjectByName instead"),this.getObjectByName(e)}getAllModelGroup(){return Vm("getAllModelGroup is deprecated, use getAllGroup instead"),this.getAllGroup()}removeModelGroupById(e){return Vm("removeModelGroupById is deprecated, use removeObjectById instead"),this.removeObjectById(e)}clearModel(){return this.manager.store.modelManager.clear()}getAllModel(){return this.manager.store.modelManager.getAll()}showAllModel(){return this.manager.store.modelManager.showAll()}hideAllModel(){return this.manager.store.modelManager.hideAll()}clearIdb(){return this.manager.store.modelManager.clearIdb()}getModelsMap(){return this.manager.store.modelManager.modelsMap}setModelsMap(e){this.manager.store.modelManager.modelsMap=e}createPoi(e){return this.manager.store.poiManager.create(e)}clonePoi(e,t,n){return this.manager.store.poiManager.clone(e,t,n)}getPoiById(e){return Vm("getPoiById is deprecated, use getObjectById instead"),this.getObjectById(e)}getPoiByName(e){return Vm("getPoiByName is deprecated, use getObjectByName instead"),this.getObjectByName(e)}getPoiByUserDataProperty(e,t){return Vm("getPoiByUserDataProperty is deprecated, use getObjectByUserDataProperty instead"),this.getObjectByUserDataProperty(e,t)}removePoiById(e){return Vm("removePoiById is deprecated, use removeObjectById instead"),this.removeObjectById(e)}createGroupForPoi(e){return Vm("createGroupForPoi is deprecated, use createGroup instead"),this.createGroup(e)}createPoiToGroup(e,t){return this.manager.store.poiManager.createToGroup(e,t)}addPoiForGroup(e,t){const n=this.getObjectById(e);return this.manager.store.poiManager.addForGroup(n,t)}getPoiGroupById(e){return Vm("getPoiGroupById is deprecated, use getObjectById instead"),this.getObjectById(e)}getPoiGroupByName(e){return Vm("getPoiGroupByName is deprecated, use getObjectByName instead"),this.getObjectByName(e)}getAllPoiGroup(){return Vm("getAllPoiGroup is deprecated, use getAllGroup instead"),this.getAllGroup()}removePoiGroupById(e){return Vm("removePoiGroupById is deprecated, use removeObjectById instead"),this.removeObjectById(e)}clearPoi(){return this.manager.store.poiManager.clear()}getAllPoi(){return this.manager.store.poiManager.getAll()}showAllPoi(){return this.manager.store.poiManager.showAll()}hideAllPoi(){return this.manager.store.poiManager.hideAll()}createPoiNode(e){return this.manager.store.poiNodeManager.create(e)}getPoiNodeById(e){return Vm("getPoiNodeById is deprecated, use getObjectById instead"),this.getObjectById(e)}getPoiNodeByName(e){return Vm("getPoiNodeByName is deprecated, use getObjectByName instead"),this.getObjectByName(e)}getPoiNodeByUserDataProperty(e,t){return Vm("getPoiNodeByUserDataProperty is deprecated, use getObjectByUserDataProperty instead"),this.getObjectByUserDataProperty(e,t)}removePoiNodeById(e){return Vm("removePoiNodeById is deprecated, use removeObjectById instead"),this.removeObjectById(e)}createGroupForPoiNode(e){return Vm("createGroupForPoiNode is deprecated, use createGroup instead"),this.createGroup(e)}createPoiNodeToGroup(e,t){return this.manager.store.poiNodeManager.createToGroup(e,t)}addPoiNodeForGroup(e,t){const n=this.getObjectById(e);return this.manager.store.poiNodeManager.addForGroup(n,t)}getPoiNodeGroupById(e){return Vm("getPoiNodeGroupById is deprecated, use getObjectById instead"),this.getObjectById(e)}getPoiNodeGroupByName(e){return Vm("getPoiNodeGroupByName is deprecated, use getObjectByName instead"),this.getObjectByName(e)}getAllPoiNodeGroup(){return Vm("getAllPoiNodeGroup is deprecated, use getAllGroup instead"),this.getAllGroup()}removePoiNodeGroupById(e){return Vm("removePoiNodeGroupById is deprecated, use removeObjectById instead"),this.removeObjectById(e)}clearPoiNode(){return this.manager.store.poiNodeManager.clear()}getAllPoiNode(){return this.manager.store.poiNodeManager.getAll()}showAllPoiNode(){return this.manager.store.poiNodeManager.showAll()}hideAllPoiNode(){return this.manager.store.poiNodeManager.hideAll()}createPoiMesh(e){const t=vR(e,this.textureCache);return this.addObject(t),t}createPolygonPoiMesh(e){const t=xR(e,this.textureCache);return this.addObject(t),t}setTexture(e,t,n){const{cache:i=!0,independ:s}=n||{};let r=e.material;s&&(r=r.clone(),e.material=r);return fR(r,t,i,this.textureCache)}createCanvas3D(e){return this.manager.store.canvas3DManager.create(e)}getCanvas3DById(e){return Vm("getCanvas3DById is deprecated, use getObjectById instead"),this.getObjectById(e)}getCanvas3DByName(e){return Vm("getCanvas3DByName is deprecated, use getObjectByName instead"),this.getObjectByName(e)}getCanvas3DByUserDataProperty(e,t){return Vm("getCanvas3DByUserDataProperty is deprecated, use getObjectByUserDataProperty instead"),this.getObjectByUserDataProperty(e,t)}removeCanvas3DById(e){return Vm("removeCanvas3DById is deprecated, use removeObjectById instead"),this.removeObjectById(e)}createGroupForCanvas3D(e){return Vm("createGroupForCanvas3D is deprecated, use createGroup instead"),this.createGroup(e)}createCanvas3DToGroup(e,t){return this.manager.store.canvas3DManager.createToGroup(e,t)}addCanvas3DForGroup(e,t){const n=this.getObjectById(e);return this.manager.store.canvas3DManager.addForGroup(n,t)}getCanvas3DGroupById(e){return Vm("getCanvas3DGroupById is deprecated, use getObjectById instead"),this.getObjectById(e)}getCanvas3DGroupByName(e){return Vm("getCanvas3DGroupByName is deprecated, use getObjectByName instead"),this.getObjectByName(e)}getAllCanvas3DGroup(){return Vm("getAllCanvas3DGroup is deprecated, use getAllGroup instead"),this.getAllGroup()}removeCanvas3DGroupById(e){return Vm("removeCanvas3DGroupById is deprecated, use removeObjectById instead"),this.removeObjectById(e)}clearCanvas3D(){return this.manager.store.canvas3DManager.clear()}getAllCanvas3D(){return this.manager.store.canvas3DManager.getAll()}showAllCanvas3D(){return this.manager.store.canvas3DManager.showAll()}hideAllCanvas3D(){return this.manager.store.canvas3DManager.hideAll()}getShortestPath(e,t){return this.manager.store.topologyManager.getShortestPath(e,t)}getShortestPathByMultipleStartPoints(e,t){return this.manager.store.topologyManager.getShortestPathByMultipleStartPoints(e,t)}getShortestPathByMultipleEndPoints(e,t){return this.manager.store.topologyManager.getShortestPathByMultipleEndPoints(e,t)}createTopologyFromGml(e){return this.manager.store.topologyManager.createFromGml(e)}createTopology(e){return this.manager.store.topologyManager.create(e)}resetTopologyNodes(e,t){return this.manager.store.topologyManager.resetNodes(e,t)}getTopologyById(e){return Vm("getTopologyById is deprecated, use getObjectById instead"),this.getObjectById(e)}getTopologyByName(e){return Vm("getTopologyByName is deprecated, use getObjectByName instead"),this.getObjectByName(e)}getTopologyByUserDataProperty(e,t){return Vm("getTopologyByUserDataProperty is deprecated, use getObjectByUserDataProperty instead"),this.getObjectByUserDataProperty(e,t)}removeTopologyById(e){return Vm("removeTopologyById is deprecated, use removeObjectById instead"),this.removeObjectById(e)}createGroupForTopology(e){return Vm("createGroupForTopology is deprecated, use createGroup instead"),this.createGroup(e)}createTopologyToGroup(e,t){return this.manager.store.topologyManager.createToGroup(e,t)}addTopologyForGroup(e,t){const n=this.getObjectById(e);return this.manager.store.topologyManager.addForGroup(n,t)}getTopologyGroupById(e){return Vm("getTopologyGroupById is deprecated, use getObjectById instead"),this.getObjectById(e)}getTopologyGroupByName(e){return Vm("getTopologyGroupByName is deprecated, use getObjectByName instead"),this.getObjectByName(e)}getAllTopologyGroup(){return Vm("getAllTopologyGroup is deprecated, use getAllGroups instead"),this.getAllGroup()}removeTopologyGroupById(e){return Vm("removeTopologyGroupById is deprecated, use removeObjectById instead"),this.removeObjectById(e)}clearTopology(){return this.manager.store.topologyManager.clear()}getAllTopology(){return this.manager.store.topologyManager.getAll()}showAllTopology(){return this.manager.store.topologyManager.showAll()}hideAllTopology(){return this.manager.store.topologyManager.hideAll()}addGridHelper(e){return this.manager.store.helperManager.addGridHelper(e)}addAxesHelper(e){return this.manager.store.helperManager.addAxesHelper(e)}addBoxHelper(e){return this.manager.store.helperManager.addBoxHelper(e)}addPlaneHelper(e){return this.manager.store.helperManager.addPlaneHelper(e)}createGround(e){return Vm("In soonspacejs: 'createGround' 已弃用,请使用 'addGroundHelper'!"),this.addGroundHelper(e)}addGroundHelper(e){return this.manager.store.helperManager.addGroundHelper(e)}addDirectionalLightHelper(e){return this.manager.store.helperManager.addDirectionalLightHelper(e)}addHemisphereLightHelper(e){return this.manager.store.helperManager.addHemisphereLightHelper(e)}addSpotLightHelper(e){return this.manager.store.helperManager.addSpotLightHelper(e)}addPointLightHelper(e){return this.manager.store.helperManager.addPointLightHelper(e)}addRectAreaLightHelper(e){return this.manager.store.helperManager.addRectAreaLightHelper(e)}getHelperById(e){return Vm("getHelperById is deprecated, use getObjectById instead"),this.getObjectById(e)}removeHelperById(e){return Vm("removeHelperById is deprecated, use removeObjectById instead"),this.removeObjectById(e)}clearHelper(){return this.manager.store.helperManager.clear()}showAllHelper(){return this.manager.store.helperManager.showAll()}hideAllHelper(){return this.manager.store.helperManager.hideAll()}createFindObjectsInBoxNearPosition(e,t){return gR(e,t)}createFindObjectsInSphereNearPosition(e,t){return yR(e,t)}createFindObjectsNearPath(e,t){return bR(e,t)}}wR.THREE=Vp,wR.TWEEN=Zm,wR.utils=hg;export{te as ACESFilmicToneMapping,T as AddEquation,J as AddOperation,Rt as AdditiveAnimationBlendMode,x as AdditiveBlending,Xe as AlphaFormat,B as AlwaysDepth,tn as AlwaysStencilFunc,Vd as AmbientLight,nu as AmbientLightProbe,hd as AnimationClip,bd as AnimationLoader,_u as AnimationMixer,Ru as AnimationObjectGroup,Qh as AnimationUtils,vc as ArcCurve,Qa as ArrayCamera,vp as ArrowHelper,mu as Audio,xu as AudioAnalyser,$d as AudioContext,pu as AudioListener,eu as AudioLoader,xp as AxesHelper,m as BackSide,Xt as BasicDepthPacking,c as BasicShadowMap,Nl as Bone,id as BooleanKeyframeTrack,Du as Box2,li as Box3,mp as Box3Helper,lr as BoxBufferGeometry,lr as BoxGeometry,pp as BoxHelper,Ts as BufferAttribute,Hs as BufferGeometry,Od as BufferGeometryLoader,Me as ByteType,ud as Cache,pr as Camera,hp as CameraHelper,gc as CanvasTexture,Dc as CapsuleBufferGeometry,Dc as CapsuleGeometry,Cc as CatmullRomCurve3,ee as CineonToneMapping,Bc as CircleBufferGeometry,Bc as CircleGeometry,he as ClampToEdgeWrapping,au as Clock,Fn as Color,sd as ColorKeyframeTrack,Zn as ColorManagement,fc as CompressedTexture,vd as CompressedTextureLoader,kc as ConeBufferGeometry,kc as ConeGeometry,fr as CubeCamera,se as CubeReflectionMapping,re as CubeRefractionMapping,gr as CubeTexture,wd as CubeTextureLoader,le as CubeUVReflectionMapping,Ac as CubicBezierCurve,_c as CubicBezierCurve3,$h as CubicInterpolant,o as CullFaceBack,a as CullFaceFront,l as CullFaceFrontBack,r as CullFaceNone,yc as Curve,Zc as CurvePath,M as CustomBlending,ne as CustomToneMapping,Hc as CylinderBufferGeometry,Hc as CylinderGeometry,Nu as Cylindrical,ti as Data3DTexture,$n as DataArrayTexture,Vl as DataTexture,Zp as DataTexture2DArray,Np as DataTexture3D,Sd as DataTextureLoader,_p as DataUtils,Ft as DecrementStencilOp,Ot as DecrementWrapStencilOp,md as DefaultLoadingManager,Ne as DepthFormat,Ve as DepthStencilFormat,tl as DepthTexture,Nd as DirectionalLight,ap as DirectionalLightHelper,td as DiscreteInterpolant,Uc as DodecahedronBufferGeometry,Uc as DodecahedronGeometry,f as DoubleSide,P as DstAlphaFactor,Z as DstColorFactor,hn as DynamicCopyUsage,sn as DynamicDrawUsage,an as DynamicReadUsage,Jc as EdgesGeometry,bc as EllipseCurve,F as EqualDepth,Jt as EqualStencilFunc,oe as EquirectangularReflectionMapping,ae as EquirectangularRefractionMapping,Oi as Euler,fn as EventDispatcher,Rh as ExtrudeBufferGeometry,Rh as ExtrudeGeometry,yd as FileLoader,g as FlatShading,Es as Float16BufferAttribute,Xs as Float32BufferAttribute,zs as Float64BufferAttribute,Ge as FloatType,ll as Fog,al as FogExp2,zp as Font,Xp as FontLoader,mc as FramebufferTexture,p as FrontSide,Tr as Frustum,Xu as GLBufferAttribute,un as GLSL1,pn as GLSL3,O as GreaterDepth,U as GreaterEqualDepth,en as GreaterEqualStencilFunc,qt as GreaterStencilFunc,np as GridHelper,qa as Group,Ae as HalfFloatType,Cd as HemisphereLight,tp as HemisphereLightHelper,tu as HemisphereLightProbe,Ah as IcosahedronBufferGeometry,Ah as IcosahedronGeometry,Qd as ImageBitmapLoader,xd as ImageLoader,On as ImageUtils,Pp as ImmediateRenderObject,kt as IncrementStencilOp,Ut as IncrementWrapStencilOp,kl as InstancedBufferAttribute,Ud as InstancedBufferGeometry,Eu as InstancedInterleavedBuffer,Kl as InstancedMesh,Gs as Int16BufferAttribute,_s as Int32BufferAttribute,Cs as Int8BufferAttribute,Le as IntType,hl as InterleavedBuffer,ul as InterleavedBufferAttribute,qh as Interpolant,xt as InterpolateDiscrete,wt as InterpolateLinear,St as InterpolateSmooth,Yt as InvertStencilOp,Bt as KeepStencilOp,nd as KeyframeTrack,Il as LOD,Vc as LatheBufferGeometry,Vc as LatheGeometry,Yi as Layers,H as LessDepth,k as LessEqualDepth,Qt as LessEqualStencilFunc,jt as LessStencilFunc,Td as Light,Hd as LightProbe,tc as Line,ku as Line3,jl as LineBasicMaterial,Ic as LineCurve,Ec as LineCurve3,Jh as LineDashedMaterial,rc as LineLoop,sc as LineSegments,It as LinearEncoding,ye as LinearFilter,ed as LinearInterpolant,we as LinearMipMapLinearFilter,ve as LinearMipMapNearestFilter,xe as LinearMipmapLinearFilter,be as LinearMipmapNearestFilter,Vt as LinearSRGBColorSpace,q as LinearToneMapping,fd as Loader,Fd as LoaderUtils,pd as LoadingManager,yt as LoopOnce,vt as LoopPingPong,bt as LoopRepeat,Ze as LuminanceAlphaFormat,We as LuminanceFormat,i as MOUSE,xs as Material,kd as MaterialLoader,Rn as MathUtils,An as Matrix3,Wi as Matrix4,G as MaxEquation,or as Mesh,ws as MeshBasicMaterial,Ua as MeshDepthMaterial,Oa as MeshDistanceMaterial,Kh as MeshLambertMaterial,jh as MeshMatcapMaterial,Yh as MeshNormalMaterial,Uh as MeshPhongMaterial,Fh as MeshPhysicalMaterial,kh as MeshStandardMaterial,Oh as MeshToonMaterial,R as MinEquation,de as MirroredRepeatWrapping,j as MixOperation,S as MultiplyBlending,K as MultiplyOperation,ue as NearestFilter,ge as NearestMipMapLinearFilter,me as NearestMipMapNearestFilter,fe as NearestMipmapLinearFilter,pe as NearestMipmapNearestFilter,D as NeverDepth,Kt as NeverStencilFunc,b as NoBlending,Zt as NoColorSpace,Q as NoToneMapping,Lt as NormalAnimationBlendMode,v as NormalBlending,Y as NotEqualDepth,$t as NotEqualStencilFunc,rd as NumberKeyframeTrack,as as Object3D,Yd as ObjectLoader,Wt as ObjectSpaceNormalMap,_h as OctahedronBufferGeometry,_h as OctahedronGeometry,_ as OneFactor,W as OneMinusDstAlphaFactor,N as OneMinusDstColorFactor,z as OneMinusSrcAlphaFactor,E as OneMinusSrcColorFactor,Zr as OrthographicCamera,h as PCFShadowMap,d as PCFSoftShadowMap,Ur as PMREMGenerator,Ip as ParametricGeometry,Nc as Path,mr as PerspectiveCamera,wr as Plane,Rr as PlaneBufferGeometry,Rr as PlaneGeometry,fp as PlaneHelper,Wd as PointLight,Qu as PointLightHelper,dc as Points,oc as PointsMaterial,ip as PolarGridHelper,Fc as PolyhedronBufferGeometry,Fc as PolyhedronGeometry,vu as PositionalAudio,Lu as PropertyBinding,wu as PropertyMixer,Xc as QuadraticBezierCurve,zc as QuadraticBezierCurve3,si as Quaternion,ad as QuaternionKeyframeTrack,od as QuaternionLinearInterpolant,n as REVISION,zt as RGBADepthPacking,Pe as RGBAFormat,Fe as RGBAIntegerFormat,pt as RGBA_ASTC_10x10_Format,ht as RGBA_ASTC_10x5_Format,dt as RGBA_ASTC_10x6_Format,ut as RGBA_ASTC_10x8_Format,mt as RGBA_ASTC_12x10_Format,ft as RGBA_ASTC_12x12_Format,nt as RGBA_ASTC_4x4_Format,it as RGBA_ASTC_5x4_Format,st as RGBA_ASTC_5x5_Format,rt as RGBA_ASTC_6x5_Format,ot as RGBA_ASTC_6x6_Format,at as RGBA_ASTC_8x5_Format,lt as RGBA_ASTC_8x6_Format,ct as RGBA_ASTC_8x8_Format,gt as RGBA_BPTC_Format,tt as RGBA_ETC2_EAC_Format,qe as RGBA_PVRTC_2BPPV1_Format,Qe as RGBA_PVRTC_4BPPV1_Format,Oe as RGBA_S3TC_DXT1_Format,Ye as RGBA_S3TC_DXT3_Format,Ke as RGBA_S3TC_DXT5_Format,ze as RGBFormat,$e as RGB_ETC1_Format,et as RGB_ETC2_Format,Je as RGB_PVRTC_2BPPV1_Format,je as RGB_PVRTC_4BPPV1_Format,Ue as RGB_S3TC_DXT1_Format,He as RGFormat,ke as RGIntegerFormat,Hh as RawShaderMaterial,Pi as Ray,zu as Raycaster,Dd as RectAreaLight,De as RedFormat,Be as RedIntegerFormat,$ as ReinhardToneMapping,ce as RepeatWrapping,Ht as ReplaceStencilOp,L as ReverseSubtractEquation,Ih as RingBufferGeometry,Ih as RingGeometry,Nt as SRGBColorSpace,cl as Scene,Gr as ShaderChunk,_r as ShaderLib,ur as ShaderMaterial,Bh as ShadowMaterial,Qc as Shape,Eh as ShapeBufferGeometry,Eh as ShapeGeometry,wp as ShapePath,Th as ShapeUtils,Te as ShortType,Hl as Skeleton,ju as SkeletonHelper,Zl as SkinnedMesh,y as SmoothShading,wR as SoonSpace,Yn as Source,Ri as Sphere,Xh as SphereBufferGeometry,Xh as SphereGeometry,Zu as Spherical,Bd as SphericalHarmonics3,Pc as SplineCurve,Id as SpotLight,Uu as SpotLightHelper,Rl as Sprite,pl as SpriteMaterial,X as SrcAlphaFactor,V as SrcAlphaSaturateFactor,I as SrcColorFactor,cn as StaticCopyUsage,nn as StaticDrawUsage,on as StaticReadUsage,ou as StereoCamera,dn as StreamCopyUsage,rn as StreamDrawUsage,ln as StreamReadUsage,ld as StringKeyframeTrack,C as SubtractEquation,w as SubtractiveBlending,s as TOUCH,Pt as TangentSpaceNormalMap,zh as TetrahedronBufferGeometry,zh as TetrahedronGeometry,Ep as TextGeometry,Jn as Texture,Md as TextureLoader,Ph as TorusBufferGeometry,Ph as TorusGeometry,Wh as TorusKnotBufferGeometry,Wh as TorusKnotGeometry,bs as Triangle,_t as TriangleFanDrawMode,At as TriangleStripDrawMode,Gt as TrianglesDrawMode,Zh as TubeBufferGeometry,Zh as TubeGeometry,ie as UVMapping,As as Uint16BufferAttribute,Is as Uint32BufferAttribute,Ls as Uint8BufferAttribute,Rs as Uint8ClampedBufferAttribute,Iu as Uniform,Ar as UniformsLib,dr as UniformsUtils,Se as UnsignedByteType,Ee as UnsignedInt248Type,Re as UnsignedIntType,_e as UnsignedShort4444Type,Ie as UnsignedShort5551Type,Ce as UnsignedShortType,u as VSMShadowMap,Gn as Vector2,ri as Vector3,Qn as Vector4,cd as VectorKeyframeTrack,pc as VideoTexture,ol as WebGL1Renderer,ni as WebGL3DRenderTarget,ei as WebGLArrayRenderTarget,yr as WebGLCubeRenderTarget,ii as WebGLMultipleRenderTargets,Wp as WebGLMultisampleRenderTarget,qn as WebGLRenderTarget,rl as WebGLRenderer,Ja as WebGLUtils,Nh as WireframeGeometry,Ct as WrapAroundEnding,Mt as ZeroCurvatureEnding,A as ZeroFactor,Tt as ZeroSlopeEnding,Dt as ZeroStencilOp,mn as _SRGBAFormat,uR as boundingIsIntersected,gR as createFindObjectsInBoxNearPosition,yR as createFindObjectsInSphereNearPosition,bR as createFindObjectsNearPath,hR as createPlaneMatrix,vR as createPoiMesh,xR as createPolygonPoiMesh,mR as createTexture,dR as createUVMatrix,wR as default,pR as getBoundingBox,cR as getPolygonGeometryInfo,Et as sRGBEncoding,fR as setTexture};