mars3d-cesium
Version:
CesiumJS是一个JavaScript库,用于在web浏览器中无需插件创建3D地球仪和2D地图,mars3d-cesium是mars3d团队修改版本的CesiumJS。
26 lines (25 loc) • 5.9 MB
JavaScript
/**
* @license
* Cesium - https://github.com/CesiumGS/cesium
* Version 1.142.1
*
* Copyright 2011-2022 Cesium Contributors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
* Columbus View (Pat. Pend.)
*
* Portions licensed separately.
* See https://github.com/CesiumGS/cesium/blob/main/LICENSE.md for full licensing details.
*/
"use strict";var Cesium=(()=>{var Ive=Object.create;var FR=Object.defineProperty;var Pve=Object.getOwnPropertyDescriptor;var Xve=Object.getOwnPropertyNames;var Nve=Object.getPrototypeOf,Yve=Object.prototype.hasOwnProperty;var wve=(e,t,n)=>t in e?FR(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n;var yU=(e=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(e,{get:(t,n)=>(typeof require<"u"?require:t)[n]}):e)(function(e){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+e+'" is not supported')});var im=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports),Mve=(e,t)=>{for(var n in t)FR(e,n,{get:t[n],enumerable:!0})},are=(e,t,n,i)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of Xve(t))!Yve.call(e,o)&&o!==n&&FR(e,o,{get:()=>t[o],enumerable:!(i=Pve(t,o))||i.enumerable});return e};var x=(e,t,n)=>(n=e!=null?Ive(Nve(e)):{},are(t||!e||!e.__esModule?FR(n,"default",{value:e,enumerable:!0}):n,e)),kve=e=>are(FR({},"__esModule",{value:!0}),e);var ut=(e,t,n)=>wve(e,typeof t!="symbol"?t+"":t,n);var T=im(()=>{"use strict";globalThis.CESIUM_WORKERS=atob("dmFyIENlc2l1bVdvcmtlcnM9KCgpPT57dmFyIE1TPU9iamVjdC5jcmVhdGU7dmFyIGZmPU9iamVjdC5kZWZpbmVQcm9wZXJ0eTt2YXIgTlM9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjt2YXIgSVM9T2JqZWN0LmdldE93blByb3BlcnR5TmFtZXM7dmFyIFBTPU9iamVjdC5nZXRQcm90b3R5cGVPZixrUz1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O3ZhciB2Uz0obixlLHQpPT5lIGluIG4/ZmYobixlLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTp0fSk6bltlXT10O3ZhciBsYT0obj0+dHlwZW9mIHJlcXVpcmU8InUiP3JlcXVpcmU6dHlwZW9mIFByb3h5PCJ1Ij9uZXcgUHJveHkobix7Z2V0OihlLHQpPT4odHlwZW9mIHJlcXVpcmU8InUiP3JlcXVpcmU6ZSlbdF19KTpuKShmdW5jdGlvbihuKXtpZih0eXBlb2YgcmVxdWlyZTwidSIpcmV0dXJuIHJlcXVpcmUuYXBwbHkodGhpcyxhcmd1bWVudHMpO3Rocm93IEVycm9yKCdEeW5hbWljIHJlcXVpcmUgb2YgIicrbisnIiBpcyBub3Qgc3VwcG9ydGVkJyl9KSxmMT1uPT5lPT57dmFyIHQ9bltlXTtpZih0KXJldHVybiB0KCk7dGhyb3cgbmV3IEVycm9yKCJNb2R1bGUgbm90IGZvdW5kIGluIGJ1bmRsZTogIitlKX07dmFyIFg9KG4sZSk9PigpPT4obiYmKGU9bihuPTApKSxlKTt2YXIgWW49KG4sZSk9PigpPT4oZXx8bigoZT17ZXhwb3J0czp7fX0pLmV4cG9ydHMsZSksZS5leHBvcnRzKSwkZT0obixlKT0+e2Zvcih2YXIgdCBpbiBlKWZmKG4sdCx7Z2V0OmVbdF0sZW51bWVyYWJsZTohMH0pfSxkMT0obixlLHQsbyk9PntpZihlJiZ0eXBlb2YgZT09Im9iamVjdCJ8fHR5cGVvZiBlPT0iZnVuY3Rpb24iKWZvcihsZXQgYSBvZiBJUyhlKSkha1MuY2FsbChuLGEpJiZhIT09dCYmZmYobixhLHtnZXQ6KCk9PmVbYV0sZW51bWVyYWJsZTohKG89TlMoZSxhKSl8fG8uZW51bWVyYWJsZX0pO3JldHVybiBufTt2YXIgYWE9KG4sZSx0KT0+KHQ9biE9bnVsbD9NUyhQUyhuKSk6e30sZDEoZXx8IW58fCFuLl9fZXNNb2R1bGU/ZmYodCwiZGVmYXVsdCIse3ZhbHVlOm4sZW51bWVyYWJsZTohMH0pOnQsbikpLEZTPW49PmQxKGZmKHt9LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSxuKTt2YXIgWXU9KG4sZSx0KT0+dlMobix0eXBlb2YgZSE9InN5bWJvbCI/ZSsiIjplLHQpO2Z1bmN0aW9uIERTKG4pe3JldHVybiBuIT1udWxsfXZhciBnLHNlPVgoKCk9PntnPURTfSk7ZnVuY3Rpb24gS2kobil7dGhpcy5uYW1lPSJEZXZlbG9wZXJFcnJvciIsdGhpcy5tZXNzYWdlPW47bGV0IGU7dHJ5e3Rocm93IG5ldyBFcnJvcn1jYXRjaCh0KXtlPXQuc3RhY2t9dGhpcy5zdGFjaz1lfXZhciBWdCxxaT1YKCgpPT57c2UoKTtnKE9iamVjdC5jcmVhdGUpJiYoS2kucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoRXJyb3IucHJvdG90eXBlKSxLaS5wcm90b3R5cGUuY29uc3RydWN0b3I9S2kpO0tpLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe2xldCBuPWAke3RoaXMubmFtZX06ICR7dGhpcy5tZXNzYWdlfWA7cmV0dXJuIGcodGhpcy5zdGFjaykmJihuKz1gCiR7dGhpcy5zdGFjay50b1N0cmluZygpfWApLG59O0tpLnRocm93SW5zdGFudGlhdGlvbkVycm9yPWZ1bmN0aW9uKCl7dGhyb3cgbmV3IEtpKCJUaGlzIGZ1bmN0aW9uIGRlZmluZXMgYW4gaW50ZXJmYWNlIGFuZCBzaG91bGQgbm90IGJlIGNhbGxlZCBkaXJlY3RseS4iKX07VnQ9S2l9KTtmdW5jdGlvbiBCUyhuKXtyZXR1cm5gJHtufSBpcyByZXF1aXJlZCwgYWN0dWFsIHZhbHVlIHdhcyB1bmRlZmluZWRgfWZ1bmN0aW9uIEdjKG4sZSx0KXtyZXR1cm5gRXhwZWN0ZWQgJHt0fSB0byBiZSB0eXBlb2YgJHtlfSwgYWN0dWFsIHR5cGVvZiB3YXMgJHtufWB9dmFyIEpuLFJuLFVtPVgoKCk9PntzZSgpO3FpKCk7Sm49e307Sm4udHlwZU9mPXt9O0puLmRlZmluZWQ9ZnVuY3Rpb24obixlKXtpZighZyhlKSl0aHJvdyBuZXcgVnQoQlMobikpfTtKbi50eXBlT2YuZnVuYz1mdW5jdGlvbihuLGUpe2lmKHR5cGVvZiBlIT0iZnVuY3Rpb24iKXRocm93IG5ldyBWdChHYyh0eXBlb2YgZSwiZnVuY3Rpb24iLG4pKX07Sm4udHlwZU9mLnN0cmluZz1mdW5jdGlvbihuLGUpe2lmKHR5cGVvZiBlIT0ic3RyaW5nIil0aHJvdyBuZXcgVnQoR2ModHlwZW9mIGUsInN0cmluZyIsbikpfTtKbi50eXBlT2YubnVtYmVyPWZ1bmN0aW9uKG4sZSl7aWYodHlwZW9mIGUhPSJudW1iZXIiKXRocm93IG5ldyBWdChHYyh0eXBlb2YgZSwibnVtYmVyIixuKSl9O0puLnR5cGVPZi5udW1iZXIubGVzc1RoYW49ZnVuY3Rpb24obixlLHQpe2lmKEpuLnR5cGVPZi5udW1iZXIobixlKSxlPj10KXRocm93IG5ldyBWdChgRXhwZWN0ZWQgJHtufSB0byBiZSBsZXNzIHRoYW4gJHt0fSwgYWN0dWFsIHZhbHVlIHdhcyAke2V9YCl9O0puLnR5cGVPZi5udW1iZXIubGVzc1RoYW5PckVxdWFscz1mdW5jdGlvbihuLGUsdCl7aWYoSm4udHlwZU9mLm51bWJlcihuLGUpLGU+dCl0aHJvdyBuZXcgVnQoYEV4cGVjdGVkICR7bn0gdG8gYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICR7dH0sIGFjdHVhbCB2YWx1ZSB3YXMgJHtlfWApfTtKbi50eXBlT2YubnVtYmVyLmdyZWF0ZXJUaGFuPWZ1bmN0aW9uKG4sZSx0KXtpZihKbi50eXBlT2YubnVtYmVyKG4sZSksZTw9dCl0aHJvdyBuZXcgVnQoYEV4cGVjdGVkICR7bn0gdG8gYmUgZ3JlYXRlciB0aGFuICR7dH0sIGFjdHVhbCB2YWx1ZSB3YXMgJHtlfWApfTtKbi50eXBlT2YubnVtYmVyLmdyZWF0ZXJUaGFuT3JFcXVhbHM9ZnVuY3Rpb24obixlLHQpe2lmKEpuLnR5cGVPZi5udW1iZXIobixlKSxlPHQpdGhyb3cgbmV3IFZ0KGBFeHBlY3RlZCAke259IHRvIGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAke3R9LCBhY3R1YWwgdmFsdWUgd2FzICR7ZX1gKX07Sm4udHlwZU9mLm9iamVjdD1mdW5jdGlvbihuLGUpe2lmKHR5cGVvZiBlIT0ib2JqZWN0Iil0aHJvdyBuZXcgVnQoR2ModHlwZW9mIGUsIm9iamVjdCIsbikpfTtKbi50eXBlT2YuYm9vbD1mdW5jdGlvbihuLGUpe2lmKHR5cGVvZiBlIT0iYm9vbGVhbiIpdGhyb3cgbmV3IFZ0KEdjKHR5cGVvZiBlLCJib29sZWFuIixuKSl9O0puLnR5cGVPZi5iaWdpbnQ9ZnVuY3Rpb24obixlKXtpZih0eXBlb2YgZSE9ImJpZ2ludCIpdGhyb3cgbmV3IFZ0KEdjKHR5cGVvZiBlLCJiaWdpbnQiLG4pKX07Sm4udHlwZU9mLm51bWJlci5lcXVhbHM9ZnVuY3Rpb24obixlLHQsbyl7aWYoSm4udHlwZU9mLm51bWJlcihuLHQpLEpuLnR5cGVPZi5udW1iZXIoZSxvKSx0IT09byl0aHJvdyBuZXcgVnQoYCR7bn0gbXVzdCBiZSBlcXVhbCB0byAke2V9LCB0aGUgYWN0dWFsIHZhbHVlcyBhcmUgJHt0fSBhbmQgJHtvfWApfTtSbj1Kbn0pO3ZhciBsMT1ZbigoUkcsdTEpPT57dmFyIE5yPWZ1bmN0aW9uKG4pe249PW51bGwmJihuPW5ldyBEYXRlKCkuZ2V0VGltZSgpKSx0aGlzLk49NjI0LHRoaXMuTT0zOTcsdGhpcy5NQVRSSVhfQT0yNTY3NDgzNjE1LHRoaXMuVVBQRVJfTUFTSz0yMTQ3NDgzNjQ4LHRoaXMuTE9XRVJfTUFTSz0yMTQ3NDgzNjQ3LHRoaXMubXQ9bmV3IEFycmF5KHRoaXMuTiksdGhpcy5tdGk9dGhpcy5OKzEsbi5jb25zdHJ1Y3Rvcj09QXJyYXk/dGhpcy5pbml0X2J5X2FycmF5KG4sbi5sZW5ndGgpOnRoaXMuaW5pdF9zZWVkKG4pfTtOci5wcm90b3R5cGUuaW5pdF9zZWVkPWZ1bmN0aW9uKG4pe2Zvcih0aGlzLm10WzBdPW4+Pj4wLHRoaXMubXRpPTE7dGhpcy5tdGk8dGhpcy5OO3RoaXMubXRpKyspe3ZhciBuPXRoaXMubXRbdGhpcy5tdGktMV1edGhpcy5tdFt0aGlzLm10aS0xXT4+PjMwO3RoaXMubXRbdGhpcy5tdGldPSgoKG4mNDI5NDkwMTc2MCk+Pj4xNikqMTgxMjQzMzI1Mzw8MTYpKyhuJjY1NTM1KSoxODEyNDMzMjUzK3RoaXMubXRpLHRoaXMubXRbdGhpcy5tdGldPj4+PTB9fTtOci5wcm90b3R5cGUuaW5pdF9ieV9hcnJheT1mdW5jdGlvbihuLGUpe3ZhciB0LG8sYTtmb3IodGhpcy5pbml0X3NlZWQoMTk2NTAyMTgpLHQ9MSxvPTAsYT10aGlzLk4+ZT90aGlzLk46ZTthO2EtLSl7dmFyIHI9dGhpcy5tdFt0LTFdXnRoaXMubXRbdC0xXT4+PjMwO3RoaXMubXRbdF09KHRoaXMubXRbdF1eKCgociY0Mjk0OTAxNzYwKT4+PjE2KSoxNjY0NTI1PDwxNikrKHImNjU1MzUpKjE2NjQ1MjUpK25bb10rbyx0aGlzLm10W3RdPj4+PTAsdCsrLG8rKyx0Pj10aGlzLk4mJih0aGlzLm10WzBdPXRoaXMubXRbdGhpcy5OLTFdLHQ9MSksbz49ZSYmKG89MCl9Zm9yKGE9dGhpcy5OLTE7YTthLS0pe3ZhciByPXRoaXMubXRbdC0xXV50aGlzLm10W3QtMV0+Pj4zMDt0aGlzLm10W3RdPSh0aGlzLm10W3RdXigoKHImNDI5NDkwMTc2MCk+Pj4xNikqMTU2NjA4Mzk0MTw8MTYpKyhyJjY1NTM1KSoxNTY2MDgzOTQxKS10LHRoaXMubXRbdF0+Pj49MCx0KyssdD49dGhpcy5OJiYodGhpcy5tdFswXT10aGlzLm10W3RoaXMuTi0xXSx0PTEpfXRoaXMubXRbMF09MjE0NzQ4MzY0OH07TnIucHJvdG90eXBlLnJhbmRvbV9pbnQ9ZnVuY3Rpb24oKXt2YXIgbixlPW5ldyBBcnJheSgwLHRoaXMuTUFUUklYX0EpO2lmKHRoaXMubXRpPj10aGlzLk4pe3ZhciB0O2Zvcih0aGlzLm10aT09dGhpcy5OKzEmJnRoaXMuaW5pdF9zZWVkKDU0ODkpLHQ9MDt0PHRoaXMuTi10aGlzLk07dCsrKW49dGhpcy5tdFt0XSZ0aGlzLlVQUEVSX01BU0t8dGhpcy5tdFt0KzFdJnRoaXMuTE9XRVJfTUFTSyx0aGlzLm10W3RdPXRoaXMubXRbdCt0aGlzLk1dXm4+Pj4xXmVbbiYxXTtmb3IoO3Q8dGhpcy5OLTE7dCsrKW49dGhpcy5tdFt0XSZ0aGlzLlVQUEVSX01BU0t8dGhpcy5tdFt0KzFdJnRoaXMuTE9XRVJfTUFTSyx0aGlzLm10W3RdPXRoaXMubXRbdCsodGhpcy5NLXRoaXMuTildXm4+Pj4xXmVbbiYxXTtuPXRoaXMubXRbdGhpcy5OLTFdJnRoaXMuVVBQRVJfTUFTS3x0aGlzLm10WzBdJnRoaXMuTE9XRVJfTUFTSyx0aGlzLm10W3RoaXMuTi0xXT10aGlzLm10W3RoaXMuTS0xXV5uPj4+MV5lW24mMV0sdGhpcy5tdGk9MH1yZXR1cm4gbj10aGlzLm10W3RoaXMubXRpKytdLG5ePW4+Pj4xMSxuXj1uPDw3JjI2MzY5Mjg2NDAsbl49bjw8MTUmNDAyMjczMDc1MixuXj1uPj4+MTgsbj4+PjB9O05yLnByb3RvdHlwZS5yYW5kb21faW50MzE9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yYW5kb21faW50KCk+Pj4xfTtOci5wcm90b3R5cGUucmFuZG9tX2luY2w9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yYW5kb21faW50KCkqKDEvNDI5NDk2NzI5NSl9O05yLnByb3RvdHlwZS5yYW5kb209ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yYW5kb21faW50KCkqKDEvNDI5NDk2NzI5Nil9O05yLnByb3RvdHlwZS5yYW5kb21fZXhjbD1mdW5jdGlvbigpe3JldHVybih0aGlzLnJhbmRvbV9pbnQoKSsuNSkqKDEvNDI5NDk2NzI5Nil9O05yLnByb3RvdHlwZS5yYW5kb21fbG9uZz1mdW5jdGlvbigpe3ZhciBuPXRoaXMucmFuZG9tX2ludCgpPj4+NSxlPXRoaXMucmFuZG9tX2ludCgpPj4+NjtyZXR1cm4obio2NzEwODg2NCtlKSooMS85MDA3MTk5MjU0NzQwOTkyKX07dTEuZXhwb3J0cz1Ocn0pO3ZhciBMbSxSZSxKdSxoMSxrLExlPVgoKCk9PntMbT1hYShsMSgpLDEpLFJlPXt9O1JlLkVQU0lMT04xPS4xO1JlLkVQU0lMT04yPS4wMTtSZS5FUFNJTE9OMz0uMDAxO1JlLkVQU0lMT040PTFlLTQ7UmUuRVBTSUxPTjU9MWUtNTtSZS5FUFNJTE9ONj0xZS02O1JlLkVQU0lMT043PTFlLTc7UmUuRVBTSUxPTjg9MWUtODtSZS5FUFNJTE9OOT0xZS05O1JlLkVQU0lMT04xMD0xZS0xMDtSZS5FUFNJTE9OMTE9MWUtMTE7UmUuRVBTSUxPTjEyPTFlLTEyO1JlLkVQU0lMT04xMz0xZS0xMztSZS5FUFNJTE9OMTQ9MWUtMTQ7UmUuRVBTSUxPTjE1PTFlLTE1O1JlLkVQU0lMT04xNj0xZS0xNjtSZS5FUFNJTE9OMTc9MWUtMTc7UmUuRVBTSUxPTjE4PTFlLTE4O1JlLkVQU0lMT04xOT0xZS0xOTtSZS5FUFNJTE9OMjA9MWUtMjA7UmUuRVBTSUxPTjIxPTFlLTIxO1JlLkdSQVZJVEFUSU9OQUxQQVJBTUVURVI9Mzk4NjAwNDQxOGU1O1JlLlNPTEFSX1JBRElVUz02OTU1ZTU7UmUuTFVOQVJfUkFESVVTPTE3Mzc0MDA7UmUuU0lYVFlfRk9VUl9LSUxPQllURVM9NjQqMTAyNDtSZS5GT1VSX0dJR0FCWVRFUz00KjEwMjQqMTAyNCoxMDI0O1JlLnNpZ249TWF0aC5zaWduPz9mdW5jdGlvbihlKXtyZXR1cm4gZT0rZSxlPT09MHx8ZSE9PWU/ZTplPjA/MTotMX07UmUuc2lnbk5vdFplcm89ZnVuY3Rpb24obil7cmV0dXJuIG48MD8tMToxfTtSZS50b1NOb3JtPWZ1bmN0aW9uKG4sZSl7cmV0dXJuIGU9ZT8/MjU1LE1hdGgucm91bmQoKFJlLmNsYW1wKG4sLTEsMSkqLjUrLjUpKmUpfTtSZS5mcm9tU05vcm09ZnVuY3Rpb24obixlKXtyZXR1cm4gZT1lPz8yNTUsUmUuY2xhbXAobiwwLGUpL2UqMi0xfTtSZS5ub3JtYWxpemU9ZnVuY3Rpb24obixlLHQpe3JldHVybiB0PU1hdGgubWF4KHQtZSwwKSx0PT09MD8wOlJlLmNsYW1wKChuLWUpL3QsMCwxKX07UmUuc2luaD1NYXRoLnNpbmg/P2Z1bmN0aW9uKGUpe3JldHVybihNYXRoLmV4cChlKS1NYXRoLmV4cCgtZSkpLzJ9O1JlLmNvc2g9TWF0aC5jb3NoPz9mdW5jdGlvbihlKXtyZXR1cm4oTWF0aC5leHAoZSkrTWF0aC5leHAoLWUpKS8yfTtSZS5sZXJwPWZ1bmN0aW9uKG4sZSx0KXtyZXR1cm4oMS10KSpuK3QqZX07UmUuUEk9TWF0aC5QSTtSZS5PTkVfT1ZFUl9QST0xL01hdGguUEk7UmUuUElfT1ZFUl9UV089TWF0aC5QSS8yO1JlLlBJX09WRVJfVEhSRUU9TWF0aC5QSS8zO1JlLlBJX09WRVJfRk9VUj1NYXRoLlBJLzQ7UmUuUElfT1ZFUl9TSVg9TWF0aC5QSS82O1JlLlRIUkVFX1BJX09WRVJfVFdPPTMqTWF0aC5QSS8yO1JlLlRXT19QST0yKk1hdGguUEk7UmUuT05FX09WRVJfVFdPX1BJPTEvKDIqTWF0aC5QSSk7UmUuUkFESUFOU19QRVJfREVHUkVFPU1hdGguUEkvMTgwO1JlLkRFR1JFRVNfUEVSX1JBRElBTj0xODAvTWF0aC5QSTtSZS5SQURJQU5TX1BFUl9BUkNTRUNPTkQ9UmUuUkFESUFOU19QRVJfREVHUkVFLzM2MDA7UmUudG9SYWRpYW5zPWZ1bmN0aW9uKG4pe3JldHVybiBuKlJlLlJBRElBTlNfUEVSX0RFR1JFRX07UmUudG9EZWdyZWVzPWZ1bmN0aW9uKG4pe3JldHVybiBuKlJlLkRFR1JFRVNfUEVSX1JBRElBTn07UmUuY29udmVydExvbmdpdHVkZVJhbmdlPWZ1bmN0aW9uKG4pe2xldCBlPVJlLlRXT19QSSx0PW4tTWF0aC5mbG9vcihuL2UpKmU7cmV0dXJuIHQ8LU1hdGguUEk/dCtlOnQ+PU1hdGguUEk/dC1lOnR9O1JlLmNsYW1wVG9MYXRpdHVkZVJhbmdlPWZ1bmN0aW9uKG4pe3JldHVybiBSZS5jbGFtcChuLC0xKlJlLlBJX09WRVJfVFdPLFJlLlBJX09WRVJfVFdPKX07UmUubmVnYXRpdmVQaVRvUGk9ZnVuY3Rpb24obil7cmV0dXJuIG4+PS1SZS5QSSYmbjw9UmUuUEk/bjpSZS56ZXJvVG9Ud29QaShuK1JlLlBJKS1SZS5QSX07UmUuemVyb1RvVHdvUGk9ZnVuY3Rpb24obil7aWYobj49MCYmbjw9UmUuVFdPX1BJKXJldHVybiBuO2xldCBlPVJlLm1vZChuLFJlLlRXT19QSSk7cmV0dXJuIE1hdGguYWJzKGUpPFJlLkVQU0lMT04xNCYmTWF0aC5hYnMobik+UmUuRVBTSUxPTjE0P1JlLlRXT19QSTplfTtSZS5tb2Q9ZnVuY3Rpb24obixlKXtyZXR1cm4gUmUuc2lnbihuKT09PVJlLnNpZ24oZSkmJk1hdGguYWJzKG4pPE1hdGguYWJzKGUpP246KG4lZStlKSVlfTtSZS5lcXVhbHNFcHNpbG9uPWZ1bmN0aW9uKG4sZSx0LG8pe3Q9dD8/MCxvPW8/P3Q7bGV0IGE9TWF0aC5hYnMobi1lKTtyZXR1cm4gYTw9b3x8YTw9dCpNYXRoLm1heChNYXRoLmFicyhuKSxNYXRoLmFicyhlKSl9O1JlLmxlc3NUaGFuPWZ1bmN0aW9uKG4sZSx0KXtyZXR1cm4gbi1lPC10fTtSZS5sZXNzVGhhbk9yRXF1YWxzPWZ1bmN0aW9uKG4sZSx0KXtyZXR1cm4gbi1lPHR9O1JlLmdyZWF0ZXJUaGFuPWZ1bmN0aW9uKG4sZSx0KXtyZXR1cm4gbi1lPnR9O1JlLmdyZWF0ZXJUaGFuT3JFcXVhbHM9ZnVuY3Rpb24obixlLHQpe3JldHVybiBuLWU+LXR9O0p1PVsxXTtSZS5mYWN0b3JpYWw9ZnVuY3Rpb24obil7bGV0IGU9SnUubGVuZ3RoO2lmKG4+PWUpe2xldCB0PUp1W2UtMV07Zm9yKGxldCBvPWU7bzw9bjtvKyspe2xldCBhPXQqbztKdS5wdXNoKGEpLHQ9YX19cmV0dXJuIEp1W25dfTtSZS5pbmNyZW1lbnRXcmFwPWZ1bmN0aW9uKG4sZSx0KXtyZXR1cm4gdD10Pz8wLCsrbixuPmUmJihuPXQpLG59O1JlLmlzUG93ZXJPZlR3bz1mdW5jdGlvbihuKXtyZXR1cm4gbiE9PTAmJihuJm4tMSk9PT0wfTtSZS5uZXh0UG93ZXJPZlR3bz1mdW5jdGlvbihuKXtyZXR1cm4tLW4sbnw9bj4+MSxufD1uPj4yLG58PW4+PjQsbnw9bj4+OCxufD1uPj4xNiwrK24sbn07UmUucHJldmlvdXNQb3dlck9mVHdvPWZ1bmN0aW9uKG4pe3JldHVybiBufD1uPj4xLG58PW4+PjIsbnw9bj4+NCxufD1uPj44LG58PW4+PjE2LG58PW4+PjMyLG49KG4+Pj4wKS0obj4+PjEpLG59O1JlLmNsYW1wPWZ1bmN0aW9uKG4sZSx0KXtyZXR1cm4gbjxlP2U6bj50P3Q6bn07aDE9bmV3IExtLmRlZmF1bHQ7UmUuc2V0UmFuZG9tTnVtYmVyU2VlZD1mdW5jdGlvbihuKXtoMT1uZXcgTG0uZGVmYXVsdChuKX07UmUubmV4dFJhbmRvbU51bWJlcj1mdW5jdGlvbigpe3JldHVybiBoMS5yYW5kb20oKX07UmUucmFuZG9tQmV0d2Vlbj1mdW5jdGlvbihuLGUpe3JldHVybiBSZS5uZXh0UmFuZG9tTnVtYmVyKCkqKGUtbikrbn07UmUuYWNvc0NsYW1wZWQ9ZnVuY3Rpb24obil7cmV0dXJuIE1hdGguYWNvcyhSZS5jbGFtcChuLC0xLDEpKX07UmUuYXNpbkNsYW1wZWQ9ZnVuY3Rpb24obil7cmV0dXJuIE1hdGguYXNpbihSZS5jbGFtcChuLC0xLDEpKX07UmUuY2hvcmRMZW5ndGg9ZnVuY3Rpb24obixlKXtyZXR1cm4gMiplKk1hdGguc2luKG4qLjUpfTtSZS5sb2dCYXNlPWZ1bmN0aW9uKG4sZSl7cmV0dXJuIE1hdGgubG9nKG4pL01hdGgubG9nKGUpfTtSZS5jYnJ0PU1hdGguY2JydD8/ZnVuY3Rpb24oZSl7bGV0IHQ9TWF0aC5wb3coTWF0aC5hYnMoZSksLjMzMzMzMzMzMzMzMzMzMzMpO3JldHVybiBlPDA/LXQ6dH07UmUubG9nMj1NYXRoLmxvZzI/P2Z1bmN0aW9uKGUpe3JldHVybiBNYXRoLmxvZyhlKSpNYXRoLkxPRzJFfTtSZS5mb2c9ZnVuY3Rpb24obixlKXtsZXQgdD1uKmU7cmV0dXJuIDEtTWF0aC5leHAoLSh0KnQpKX07UmUuZmFzdEFwcHJveGltYXRlQXRhbj1mdW5jdGlvbihuKXtyZXR1cm4gbiooLS4xNzg0Kk1hdGguYWJzKG4pLS4wNjYzKm4qbisxLjAzMDEpfTtSZS5mYXN0QXBwcm94aW1hdGVBdGFuMj1mdW5jdGlvbihuLGUpe2xldCB0LG89TWF0aC5hYnMobik7dD1NYXRoLmFicyhlKTtsZXQgYT1NYXRoLm1heChvLHQpO3Q9TWF0aC5taW4obyx0KTtsZXQgcj10L2E7cmV0dXJuIG89UmUuZmFzdEFwcHJveGltYXRlQXRhbihyKSxvPU1hdGguYWJzKGUpPk1hdGguYWJzKG4pP1JlLlBJX09WRVJfVFdPLW86byxvPW48MD9SZS5QSS1vOm8sbz1lPDA/LW86byxvfTtrPVJlfSk7dmFyIGZuLFp1LG0xLFF1LGptLFVTLGhhLFZjLHMsTWU9WCgoKT0+e3NlKCk7TGUoKTtmbj1jbGFzcyBue2NvbnN0cnVjdG9yKGUsdCxvKXt0aGlzLng9ZT8/MCx0aGlzLnk9dD8/MCx0aGlzLno9bz8/MH1zdGF0aWMgZnJvbVNwaGVyaWNhbChlLHQpe2codCl8fCh0PW5ldyBuKTtsZXQgbz1lLmNsb2NrLGE9ZS5jb25lLHI9ZS5tYWduaXR1ZGU/PzEsaT1yKk1hdGguc2luKGEpO3JldHVybiB0Lng9aSpNYXRoLmNvcyhvKSx0Lnk9aSpNYXRoLnNpbihvKSx0Lno9cipNYXRoLmNvcyhhKSx0fXN0YXRpYyBmcm9tRWxlbWVudHMoZSx0LG8sYSl7cmV0dXJuIGcoYSk/KGEueD1lLGEueT10LGEuej1vLGEpOm5ldyBuKGUsdCxvKX1zdGF0aWMgY2xvbmUoZSx0KXtpZihnKGUpKXJldHVybiBnKHQpPyh0Lng9ZS54LHQueT1lLnksdC56PWUueix0KTpuZXcgbihlLngsZS55LGUueil9c3RhdGljIHBhY2soZSx0LG8pe3JldHVybiBvPW8/PzAsdFtvKytdPWUueCx0W28rK109ZS55LHRbb109ZS56LHR9c3RhdGljIHVucGFjayhlLHQsbyl7cmV0dXJuIHQ9dD8/MCxnKG8pfHwobz1uZXcgbiksby54PWVbdCsrXSxvLnk9ZVt0KytdLG8uej1lW3RdLG99c3RhdGljIHBhY2tBcnJheShlLHQpe2xldCBvPWUubGVuZ3RoLGE9byozO2codCk/IUFycmF5LmlzQXJyYXkodCkmJnQubGVuZ3RoIT09YXx8dC5sZW5ndGghPT1hJiYodC5sZW5ndGg9YSk6dD1uZXcgQXJyYXkoYSk7Zm9yKGxldCByPTA7cjxvOysrciluLnBhY2soZVtyXSx0LHIqMyk7cmV0dXJuIHR9c3RhdGljIHVucGFja0FycmF5KGUsdCl7bGV0IG89ZS5sZW5ndGg7Zyh0KT90Lmxlbmd0aD1vLzM6dD1uZXcgQXJyYXkoby8zKTtmb3IobGV0IGE9MDthPG87YSs9Myl7bGV0IHI9YS8zO3Rbcl09bi51bnBhY2soZSxhLHRbcl0pfXJldHVybiB0fXN0YXRpYyBtYXhpbXVtQ29tcG9uZW50KGUpe3JldHVybiBNYXRoLm1heChlLngsZS55LGUueil9c3RhdGljIG1pbmltdW1Db21wb25lbnQoZSl7cmV0dXJuIE1hdGgubWluKGUueCxlLnksZS56KX1zdGF0aWMgbWluaW11bUJ5Q29tcG9uZW50KGUsdCxvKXtyZXR1cm4gby54PU1hdGgubWluKGUueCx0LngpLG8ueT1NYXRoLm1pbihlLnksdC55KSxvLno9TWF0aC5taW4oZS56LHQueiksb31zdGF0aWMgbWF4aW11bUJ5Q29tcG9uZW50KGUsdCxvKXtyZXR1cm4gby54PU1hdGgubWF4KGUueCx0LngpLG8ueT1NYXRoLm1heChlLnksdC55KSxvLno9TWF0aC5tYXgoZS56LHQueiksb31zdGF0aWMgY2xhbXAoZSx0LG8sYSl7bGV0IHI9ay5jbGFtcChlLngsdC54LG8ueCksaT1rLmNsYW1wKGUueSx0Lnksby55KSxmPWsuY2xhbXAoZS56LHQueixvLnopO3JldHVybiBhLng9cixhLnk9aSxhLno9ZixhfXN0YXRpYyBtYWduaXR1ZGVTcXVhcmVkKGUpe3JldHVybiBlLngqZS54K2UueSplLnkrZS56KmUuen1zdGF0aWMgbWFnbml0dWRlKGUpe3JldHVybiBNYXRoLnNxcnQobi5tYWduaXR1ZGVTcXVhcmVkKGUpKX1zdGF0aWMgZGlzdGFuY2UoZSx0KXtyZXR1cm4gbi5zdWJ0cmFjdChlLHQsWnUpLG4ubWFnbml0dWRlKFp1KX1zdGF0aWMgZGlzdGFuY2VTcXVhcmVkKGUsdCl7cmV0dXJuIG4uc3VidHJhY3QoZSx0LFp1KSxuLm1hZ25pdHVkZVNxdWFyZWQoWnUpfXN0YXRpYyBub3JtYWxpemUoZSx0KXtsZXQgbz1uLm1hZ25pdHVkZShlKTtyZXR1cm4gdC54PWUueC9vLHQueT1lLnkvbyx0Lno9ZS56L28sdH1zdGF0aWMgZG90KGUsdCl7cmV0dXJuIGUueCp0LngrZS55KnQueStlLnoqdC56fXN0YXRpYyBtdWx0aXBseUNvbXBvbmVudHMoZSx0LG8pe3JldHVybiBvLng9ZS54KnQueCxvLnk9ZS55KnQueSxvLno9ZS56KnQueixvfXN0YXRpYyBkaXZpZGVDb21wb25lbnRzKGUsdCxvKXtyZXR1cm4gby54PWUueC90Lngsby55PWUueS90Lnksby56PWUuei90Lnosb31zdGF0aWMgYWRkKGUsdCxvKXtyZXR1cm4gby54PWUueCt0Lngsby55PWUueSt0Lnksby56PWUueit0Lnosb31zdGF0aWMgc3VidHJhY3QoZSx0LG8pe3JldHVybiBvLng9ZS54LXQueCxvLnk9ZS55LXQueSxvLno9ZS56LXQueixvfXN0YXRpYyBtdWx0aXBseUJ5U2NhbGFyKGUsdCxvKXtyZXR1cm4gby54PWUueCp0LG8ueT1lLnkqdCxvLno9ZS56KnQsb31zdGF0aWMgZGl2aWRlQnlTY2FsYXIoZSx0LG8pe3JldHVybiBvLng9ZS54L3Qsby55PWUueS90LG8uej1lLnovdCxvfXN0YXRpYyBuZWdhdGUoZSx0KXtyZXR1cm4gdC54PS1lLngsdC55PS1lLnksdC56PS1lLnosdH1zdGF0aWMgYWJzKGUsdCl7cmV0dXJuIHQueD1NYXRoLmFicyhlLngpLHQueT1NYXRoLmFicyhlLnkpLHQuej1NYXRoLmFicyhlLnopLHR9c3RhdGljIGxlcnAoZSx0LG8sYSl7cmV0dXJuIG4ubXVsdGlwbHlCeVNjYWxhcih0LG8sbTEpLGE9bi5tdWx0aXBseUJ5U2NhbGFyKGUsMS1vLGEpLG4uYWRkKG0xLGEsYSl9c3RhdGljIGFuZ2xlQmV0d2VlbihlLHQpe24ubm9ybWFsaXplKGUsUXUpLG4ubm9ybWFsaXplKHQsam0pO2xldCBvPW4uZG90KFF1LGptKSxhPW4ubWFnbml0dWRlKG4uY3Jvc3MoUXUsam0sUXUpKTtyZXR1cm4gTWF0aC5hdGFuMihhLG8pfXN0YXRpYyBtb3N0T3J0aG9nb25hbEF4aXMoZSx0KXtsZXQgbz1uLm5vcm1hbGl6ZShlLFVTKTtyZXR1cm4gbi5hYnMobyxvKSxvLng8PW8ueT9vLng8PW8uej90PW4uY2xvbmUobi5VTklUX1gsdCk6dD1uLmNsb25lKG4uVU5JVF9aLHQpOm8ueTw9by56P3Q9bi5jbG9uZShuLlVOSVRfWSx0KTp0PW4uY2xvbmUobi5VTklUX1osdCksdH1zdGF0aWMgcHJvamVjdFZlY3RvcihlLHQsbyl7bGV0IGE9bi5kb3QoZSx0KS9uLmRvdCh0LHQpO3JldHVybiBuLm11bHRpcGx5QnlTY2FsYXIodCxhLG8pfXN0YXRpYyBlcXVhbHMoZSx0KXtyZXR1cm4gZT09PXR8fGcoZSkmJmcodCkmJmUueD09PXQueCYmZS55PT09dC55JiZlLno9PT10Lnp9c3RhdGljIGVxdWFsc0FycmF5KGUsdCxvKXtyZXR1cm4gZS54PT09dFtvXSYmZS55PT09dFtvKzFdJiZlLno9PT10W28rMl19c3RhdGljIGVxdWFsc0Vwc2lsb24oZSx0LG8sYSl7cmV0dXJuIGU9PT10fHxnKGUpJiZnKHQpJiZrLmVxdWFsc0Vwc2lsb24oZS54LHQueCxvLGEpJiZrLmVxdWFsc0Vwc2lsb24oZS55LHQueSxvLGEpJiZrLmVxdWFsc0Vwc2lsb24oZS56LHQueixvLGEpfXN0YXRpYyBjcm9zcyhlLHQsbyl7bGV0IGE9ZS54LHI9ZS55LGk9ZS56LGY9dC54LGQ9dC55LGM9dC56LHU9cipjLWkqZCxsPWkqZi1hKmMsaD1hKmQtcipmO3JldHVybiBvLng9dSxvLnk9bCxvLno9aCxvfXN0YXRpYyBtaWRwb2ludChlLHQsbyl7cmV0dXJuIG8ueD0oZS54K3QueCkqLjUsby55PShlLnkrdC55KSouNSxvLno9KGUueit0LnopKi41LG99c3RhdGljIGZyb21EZWdyZWVzKGUsdCxvLGEscil7cmV0dXJuIGU9ay50b1JhZGlhbnMoZSksdD1rLnRvUmFkaWFucyh0KSxuLmZyb21SYWRpYW5zKGUsdCxvLGEscil9c3RhdGljIGZyb21SYWRpYW5zKGUsdCxvLGEscil7bz1vPz8wO2xldCBpPWcoYSk/YS5yYWRpaVNxdWFyZWQ6bi5fZWxsaXBzb2lkUmFkaWlTcXVhcmVkLGY9TWF0aC5jb3ModCk7aGEueD1mKk1hdGguY29zKGUpLGhhLnk9ZipNYXRoLnNpbihlKSxoYS56PU1hdGguc2luKHQpLGhhPW4ubm9ybWFsaXplKGhhLGhhKSxuLm11bHRpcGx5Q29tcG9uZW50cyhpLGhhLFZjKTtsZXQgZD1NYXRoLnNxcnQobi5kb3QoaGEsVmMpKTtyZXR1cm4gVmM9bi5kaXZpZGVCeVNjYWxhcihWYyxkLFZjKSxoYT1uLm11bHRpcGx5QnlTY2FsYXIoaGEsbyxoYSksZyhyKXx8KHI9bmV3IG4pLG4uYWRkKFZjLGhhLHIpfXN0YXRpYyBmcm9tRGVncmVlc0FycmF5KGUsdCxvKXtsZXQgYT1lLmxlbmd0aDtnKG8pP28ubGVuZ3RoPWEvMjpvPW5ldyBBcnJheShhLzIpO2ZvcihsZXQgcj0wO3I8YTtyKz0yKXtsZXQgaT1lW3JdLGY9ZVtyKzFdLGQ9ci8yO29bZF09bi5mcm9tRGVncmVlcyhpLGYsMCx0LG9bZF0pfXJldHVybiBvfXN0YXRpYyBmcm9tUmFkaWFuc0FycmF5KGUsdCxvKXtsZXQgYT1lLmxlbmd0aDtnKG8pP28ubGVuZ3RoPWEvMjpvPW5ldyBBcnJheShhLzIpO2ZvcihsZXQgcj0wO3I8YTtyKz0yKXtsZXQgaT1lW3JdLGY9ZVtyKzFdLGQ9ci8yO29bZF09bi5mcm9tUmFkaWFucyhpLGYsMCx0LG9bZF0pfXJldHVybiBvfXN0YXRpYyBmcm9tRGVncmVlc0FycmF5SGVpZ2h0cyhlLHQsbyl7bGV0IGE9ZS5sZW5ndGg7ZyhvKT9vLmxlbmd0aD1hLzM6bz1uZXcgQXJyYXkoYS8zKTtmb3IobGV0IHI9MDtyPGE7cis9Myl7bGV0IGk9ZVtyXSxmPWVbcisxXSxkPWVbcisyXSxjPXIvMztvW2NdPW4uZnJvbURlZ3JlZXMoaSxmLGQsdCxvW2NdKX1yZXR1cm4gb31zdGF0aWMgZnJvbVJhZGlhbnNBcnJheUhlaWdodHMoZSx0LG8pe2xldCBhPWUubGVuZ3RoO2cobyk/by5sZW5ndGg9YS8zOm89bmV3IEFycmF5KGEvMyk7Zm9yKGxldCByPTA7cjxhO3IrPTMpe2xldCBpPWVbcl0sZj1lW3IrMV0sZD1lW3IrMl0sYz1yLzM7b1tjXT1uLmZyb21SYWRpYW5zKGksZixkLHQsb1tjXSl9cmV0dXJuIG99Y2xvbmUoZSl7cmV0dXJuIG4uY2xvbmUodGhpcyxlKX1lcXVhbHMoZSl7cmV0dXJuIG4uZXF1YWxzKHRoaXMsZSl9ZXF1YWxzRXBzaWxvbihlLHQsbyl7cmV0dXJuIG4uZXF1YWxzRXBzaWxvbih0aGlzLGUsdCxvKX10b1N0cmluZygpe3JldHVybmAoJHt0aGlzLnh9LCAke3RoaXMueX0sICR7dGhpcy56fSlgfX07Zm4uZnJvbUNhcnRlc2lhbjQ9Zm4uY2xvbmU7Zm4ucGFja2VkTGVuZ3RoPTM7Zm4uZnJvbUFycmF5PWZuLnVucGFjaztadT1uZXcgZm4sbTE9bmV3IGZuLFF1PW5ldyBmbixqbT1uZXcgZm4sVVM9bmV3IGZuLGhhPW5ldyBmbixWYz1uZXcgZm47Zm4uX2VsbGlwc29pZFJhZGlpU3F1YXJlZD1uZXcgZm4oNjM3ODEzNyo2Mzc4MTM3LDYzNzgxMzcqNjM3ODEzNyw2MzU2NzUyMzE0MjQ1MTc5ZS05KjYzNTY3NTIzMTQyNDUxNzllLTkpO2ZuLlpFUk89T2JqZWN0LmZyZWV6ZShuZXcgZm4oMCwwLDApKTtmbi5PTkU9T2JqZWN0LmZyZWV6ZShuZXcgZm4oMSwxLDEpKTtmbi5VTklUX1g9T2JqZWN0LmZyZWV6ZShuZXcgZm4oMSwwLDApKTtmbi5VTklUX1k9T2JqZWN0LmZyZWV6ZShuZXcgZm4oMCwxLDApKTtmbi5VTklUX1o9T2JqZWN0LmZyZWV6ZShuZXcgZm4oMCwwLDEpKTtzPWZufSk7ZnVuY3Rpb24gelMobixlLHQsbyxhKXtsZXQgcj1uLngsaT1uLnksZj1uLnosZD1lLngsYz1lLnksdT1lLnosbD1yKnIqZCpkLGg9aSppKmMqYyxtPWYqZip1KnUsYj1sK2grbSxwPU1hdGguc3FydCgxL2IpLHk9cy5tdWx0aXBseUJ5U2NhbGFyKG4scCxMUyk7aWYoYjxvKXJldHVybiBpc0Zpbml0ZShwKT9zLmNsb25lKHksYSk6dm9pZCAwO2xldCBFPXQueCxfPXQueSxUPXQueix3PWpTO3cueD15LngqRSoyLHcueT15LnkqXyoyLHcuej15LnoqVCoyO2xldCBSPSgxLXApKnMubWFnbml0dWRlKG4pLyguNSpzLm1hZ25pdHVkZSh3KSksUz0wLE0sSSxOLFAsdixBLHgsQyxGLFUsejtkb3tSLT1TLE49MS8oMStSKkUpLFA9MS8oMStSKl8pLHY9MS8oMStSKlQpLEE9TipOLHg9UCpQLEM9dip2LEY9QSpOLFU9eCpQLHo9Qyp2LE09bCpBK2gqeCttKkMtMSxJPWwqRipFK2gqVSpfK20qeipUO2xldCBEPS0yKkk7Uz1NL0R9d2hpbGUoTWF0aC5hYnMoTSk+ay5FUFNJTE9OMTIpO3JldHVybiBnKGEpPyhhLng9cipOLGEueT1pKlAsYS56PWYqdixhKTpuZXcgcyhyKk4saSpQLGYqdil9dmFyIExTLGpTLCR1LHptPVgoKCk9PntNZSgpO3NlKCk7TGUoKTtMUz1uZXcgcyxqUz1uZXcgczskdT16U30pO3ZhciB2byxkZixHUyxWUyxIUyxyZSxndD1YKCgpPT57TWUoKTtzZSgpO0xlKCk7em0oKTt2bz1jbGFzcyB2b3tjb25zdHJ1Y3RvcihlLHQsbyl7dGhpcy5sb25naXR1ZGU9ZT8/MCx0aGlzLmxhdGl0dWRlPXQ/PzAsdGhpcy5oZWlnaHQ9bz8/MH1zdGF0aWMgZnJvbVJhZGlhbnMoZSx0LG8sYSl7cmV0dXJuIG89bz8/MCxnKGEpPyhhLmxvbmdpdHVkZT1lLGEubGF0aXR1ZGU9dCxhLmhlaWdodD1vLGEpOm5ldyB2byhlLHQsbyl9c3RhdGljIGZyb21EZWdyZWVzKGUsdCxvLGEpe3JldHVybiBlPWsudG9SYWRpYW5zKGUpLHQ9ay50b1JhZGlhbnModCksdm8uZnJvbVJhZGlhbnMoZSx0LG8sYSl9c3RhdGljIGZyb21DYXJ0ZXNpYW4oZSx0LG8pe2xldCBhPWcodCk/dC5vbmVPdmVyUmFkaWk6dm8uX2VsbGlwc29pZE9uZU92ZXJSYWRpaSxyPWcodCk/dC5vbmVPdmVyUmFkaWlTcXVhcmVkOnZvLl9lbGxpcHNvaWRPbmVPdmVyUmFkaWlTcXVhcmVkLGk9Zyh0KT90Ll9jZW50ZXJUb2xlcmFuY2VTcXVhcmVkOnZvLl9lbGxpcHNvaWRDZW50ZXJUb2xlcmFuY2VTcXVhcmVkLGY9JHUoZSxhLHIsaSxWUyk7aWYoIWcoZikpcmV0dXJuO2xldCBkPXMubXVsdGlwbHlDb21wb25lbnRzKGYscixHUyk7ZD1zLm5vcm1hbGl6ZShkLGQpO2xldCBjPXMuc3VidHJhY3QoZSxmLEhTKSx1PU1hdGguYXRhbjIoZC55LGQueCksbD1NYXRoLmFzaW4oZC56KSxoPWsuc2lnbihzLmRvdChjLGUpKSpzLm1hZ25pdHVkZShjKTtyZXR1cm4gZyhvKT8oby5sb25naXR1ZGU9dSxvLmxhdGl0dWRlPWwsby5oZWlnaHQ9aCxvKTpuZXcgdm8odSxsLGgpfXN0YXRpYyB0b0NhcnRlc2lhbihlLHQsbyl7cmV0dXJuIHMuZnJvbVJhZGlhbnMoZS5sb25naXR1ZGUsZS5sYXRpdHVkZSxlLmhlaWdodCx0LG8pfXN0YXRpYyBjbG9uZShlLHQpe2lmKGcoZSkpcmV0dXJuIGcodCk/KHQubG9uZ2l0dWRlPWUubG9uZ2l0dWRlLHQubGF0aXR1ZGU9ZS5sYXRpdHVkZSx0LmhlaWdodD1lLmhlaWdodCx0KTpuZXcgdm8oZS5sb25naXR1ZGUsZS5sYXRpdHVkZSxlLmhlaWdodCl9c3RhdGljIGVxdWFscyhlLHQpe3JldHVybiBlPT09dHx8ZyhlKSYmZyh0KSYmZS5sb25naXR1ZGU9PT10LmxvbmdpdHVkZSYmZS5sYXRpdHVkZT09PXQubGF0aXR1ZGUmJmUuaGVpZ2h0PT09dC5oZWlnaHR9c3RhdGljIGVxdWFsc0Vwc2lsb24oZSx0LG8pe3JldHVybiBvPW8/PzAsZT09PXR8fGcoZSkmJmcodCkmJk1hdGguYWJzKGUubG9uZ2l0dWRlLXQubG9uZ2l0dWRlKTw9byYmTWF0aC5hYnMoZS5sYXRpdHVkZS10LmxhdGl0dWRlKTw9byYmTWF0aC5hYnMoZS5oZWlnaHQtdC5oZWlnaHQpPD1vfWNsb25lKGUpe3JldHVybiB2by5jbG9uZSh0aGlzLGUpfWVxdWFscyhlKXtyZXR1cm4gdm8uZXF1YWxzKHRoaXMsZSl9ZXF1YWxzRXBzaWxvbihlLHQpe3JldHVybiB2by5lcXVhbHNFcHNpbG9uKHRoaXMsZSx0KX10b1N0cmluZygpe3JldHVybmAoJHt0aGlzLmxvbmdpdHVkZX0sICR7dGhpcy5sYXRpdHVkZX0sICR7dGhpcy5oZWlnaHR9KWB9fTtZdSh2bywiX2VsbGlwc29pZE9uZU92ZXJSYWRpaSIsbmV3IHMoMS82Mzc4MTM3LDEvNjM3ODEzNywxLzYzNTY3NTIzMTQyNDUxNzllLTkpKSxZdSh2bywiX2VsbGlwc29pZE9uZU92ZXJSYWRpaVNxdWFyZWQiLG5ldyBzKDEvKDYzNzgxMzcqNjM3ODEzNyksMS8oNjM3ODEzNyo2Mzc4MTM3KSwxLyg2MzU2NzUyMzE0MjQ1MTc5ZS05KjYzNTY3NTIzMTQyNDUxNzllLTkpKSksWXUodm8sIl9lbGxpcHNvaWRDZW50ZXJUb2xlcmFuY2VTcXVhcmVkIixrLkVQU0lMT04xKTtkZj12bztkZi5aRVJPPU9iamVjdC5mcmVlemUobmV3IGRmKDAsMCwwKSk7R1M9bmV3IHMsVlM9bmV3IHMsSFM9bmV3IHMscmU9ZGZ9KTt2YXIgTm4sZWwsYjEscDEsZzEsS1MsWSx2dD1YKCgpPT57c2UoKTtMZSgpO05uPWNsYXNzIG57Y29uc3RydWN0b3IoZSx0KXt0aGlzLng9ZT8/MCx0aGlzLnk9dD8/MH1zdGF0aWMgZnJvbUVsZW1lbnRzKGUsdCxvKXtyZXR1cm4gZyhvKT8oby54PWUsby55PXQsbyk6bmV3IG4oZSx0KX1zdGF0aWMgY2xvbmUoZSx0KXtpZihnKGUpKXJldHVybiBnKHQpPyh0Lng9ZS54LHQueT1lLnksdCk6bmV3IG4oZS54LGUueSl9c3RhdGljIHBhY2soZSx0LG8pe3JldHVybiBvPW8/PzAsdFtvKytdPWUueCx0W29dPWUueSx0fXN0YXRpYyB1bnBhY2soZSx0LG8pe3JldHVybiB0PXQ/PzAsZyhvKXx8KG89bmV3IG4pLG8ueD1lW3QrK10sby55PWVbdF0sb31zdGF0aWMgcGFja0FycmF5KGUsdCl7bGV0IG89ZS5sZW5ndGgsYT1vKjI7Zyh0KT8hQXJyYXkuaXNBcnJheSh0KSYmdC5sZW5ndGghPT1hfHx0Lmxlbmd0aCE9PWEmJih0Lmxlbmd0aD1hKTp0PW5ldyBBcnJheShhKTtmb3IobGV0IHI9MDtyPG87KytyKW4ucGFjayhlW3JdLHQscioyKTtyZXR1cm4gdH1zdGF0aWMgdW5wYWNrQXJyYXkoZSx0KXtsZXQgbz1lLmxlbmd0aDtnKHQpP3QubGVuZ3RoPW8vMjp0PW5ldyBBcnJheShvLzIpO2ZvcihsZXQgYT0wO2E8bzthKz0yKXtsZXQgcj1hLzI7dFtyXT1uLnVucGFjayhlLGEsdFtyXSl9cmV0dXJuIHR9c3RhdGljIG1heGltdW1Db21wb25lbnQoZSl7cmV0dXJuIE1hdGgubWF4KGUueCxlLnkpfXN0YXRpYyBtaW5pbXVtQ29tcG9uZW50KGUpe3JldHVybiBNYXRoLm1pbihlLngsZS55KX1zdGF0aWMgbWluaW11bUJ5Q29tcG9uZW50KGUsdCxvKXtyZXR1cm4gby54PU1hdGgubWluKGUueCx0LngpLG8ueT1NYXRoLm1pbihlLnksdC55KSxvfXN0YXRpYyBtYXhpbXVtQnlDb21wb25lbnQoZSx0LG8pe3JldHVybiBvLng9TWF0aC5tYXgoZS54LHQueCksby55PU1hdGgubWF4KGUueSx0LnkpLG99c3RhdGljIGNsYW1wKGUsdCxvLGEpe2xldCByPWsuY2xhbXAoZS54LHQueCxvLngpLGk9ay5jbGFtcChlLnksdC55LG8ueSk7cmV0dXJuIGEueD1yLGEueT1pLGF9c3RhdGljIG1hZ25pdHVkZVNxdWFyZWQoZSl7cmV0dXJuIGUueCplLngrZS55KmUueX1zdGF0aWMgbWFnbml0dWRlKGUpe3JldHVybiBNYXRoLnNxcnQobi5tYWduaXR1ZGVTcXVhcmVkKGUpKX1zdGF0aWMgZGlzdGFuY2UoZSx0KXtyZXR1cm4gbi5zdWJ0cmFjdChlLHQsZWwpLG4ubWFnbml0dWRlKGVsKX1zdGF0aWMgZGlzdGFuY2VTcXVhcmVkKGUsdCl7cmV0dXJuIG4uc3VidHJhY3QoZSx0LGVsKSxuLm1hZ25pdHVkZVNxdWFyZWQoZWwpfXN0YXRpYyBub3JtYWxpemUoZSx0KXtsZXQgbz1uLm1hZ25pdHVkZShlKTtyZXR1cm4gdC54PWUueC9vLHQueT1lLnkvbyx0fXN0YXRpYyBkb3QoZSx0KXtyZXR1cm4gZS54KnQueCtlLnkqdC55fXN0YXRpYyBjcm9zcyhlLHQpe3JldHVybiBlLngqdC55LWUueSp0Lnh9c3RhdGljIG11bHRpcGx5Q29tcG9uZW50cyhlLHQsbyl7cmV0dXJuIG8ueD1lLngqdC54LG8ueT1lLnkqdC55LG99c3RhdGljIGRpdmlkZUNvbXBvbmVudHMoZSx0LG8pe3JldHVybiBvLng9ZS54L3QueCxvLnk9ZS55L3QueSxvfXN0YXRpYyBhZGQoZSx0LG8pe3JldHVybiBvLng9ZS54K3QueCxvLnk9ZS55K3QueSxvfXN0YXRpYyBzdWJ0cmFjdChlLHQsbyl7cmV0dXJuIG8ueD1lLngtdC54LG8ueT1lLnktdC55LG99c3RhdGljIG11bHRpcGx5QnlTY2FsYXIoZSx0LG8pe3JldHVybiBvLng9ZS54KnQsby55PWUueSp0LG99c3RhdGljIGRpdmlkZUJ5U2NhbGFyKGUsdCxvKXtyZXR1cm4gby54PWUueC90LG8ueT1lLnkvdCxvfXN0YXRpYyBuZWdhdGUoZSx0KXtyZXR1cm4gdC54PS1lLngsdC55PS1lLnksdH1zdGF0aWMgYWJzKGUsdCl7cmV0dXJuIHQueD1NYXRoLmFicyhlLngpLHQueT1NYXRoLmFicyhlLnkpLHR9c3RhdGljIGxlcnAoZSx0LG8sYSl7cmV0dXJuIG4ubXVsdGlwbHlCeVNjYWxhcih0LG8sYjEpLGE9bi5tdWx0aXBseUJ5U2NhbGFyKGUsMS1vLGEpLG4uYWRkKGIxLGEsYSl9c3RhdGljIGFuZ2xlQmV0d2VlbihlLHQpe3JldHVybiBuLm5vcm1hbGl6ZShlLHAxKSxuLm5vcm1hbGl6ZSh0LGcxKSxrLmFjb3NDbGFtcGVkKG4uZG90KHAxLGcxKSl9c3RhdGljIG1vc3RPcnRob2dvbmFsQXhpcyhlLHQpe2xldCBvPW4ubm9ybWFsaXplKGUsS1MpO3JldHVybiBuLmFicyhvLG8pLG8ueDw9by55P3Q9bi5jbG9uZShuLlVOSVRfWCx0KTp0PW4uY2xvbmUobi5VTklUX1ksdCksdH1zdGF0aWMgZXF1YWxzKGUsdCl7cmV0dXJuIGU9PT10fHxnKGUpJiZnKHQpJiZlLng9PT10LngmJmUueT09PXQueX1zdGF0aWMgZXF1YWxzQXJyYXkoZSx0LG8pe3JldHVybiBlLng9PT10W29dJiZlLnk9PT10W28rMV19c3RhdGljIGVxdWFsc0Vwc2lsb24oZSx0LG8sYSl7cmV0dXJuIGU9PT10fHxnKGUpJiZnKHQpJiZrLmVxdWFsc0Vwc2lsb24oZS54LHQueCxvLGEpJiZrLmVxdWFsc0Vwc2lsb24oZS55LHQueSxvLGEpfWNsb25lKGUpe3JldHVybiBuLmNsb25lKHRoaXMsZSl9ZXF1YWxzKGUpe3JldHVybiBuLmVxdWFscyh0aGlzLGUpfWVxdWFsc0Vwc2lsb24oZSx0LG8pe3JldHVybiBuLmVxdWFsc0Vwc2lsb24odGhpcyxlLHQsbyl9dG9TdHJpbmcoKXtyZXR1cm5gKCR7dGhpcy54fSwgJHt0aGlzLnl9KWB9fTtObi5mcm9tQ2FydGVzaWFuMz1Obi5jbG9uZTtObi5mcm9tQ2FydGVzaWFuND1Obi5jbG9uZTtObi5wYWNrZWRMZW5ndGg9MjtObi5mcm9tQXJyYXk9Tm4udW5wYWNrO2VsPW5ldyBObixiMT1uZXcgTm4scDE9bmV3IE5uLGcxPW5ldyBObixLUz1uZXcgTm47Tm4uWkVSTz1PYmplY3QuZnJlZXplKG5ldyBObigwLDApKTtObi5PTkU9T2JqZWN0LmZyZWV6ZShuZXcgTm4oMSwxKSk7Tm4uVU5JVF9YPU9iamVjdC5mcmVlemUobmV3IE5uKDEsMCkpO05uLlVOSVRfWT1PYmplY3QuZnJlZXplKG5ldyBObigwLDEpKTtZPU5ufSk7ZnVuY3Rpb24gXzEobixlLHQsbyl7ZT1lPz8wLHQ9dD8/MCxvPW8/PzAsbi5fcmFkaWk9bmV3IHMoZSx0LG8pLG4uX3JhZGlpU3F1YXJlZD1uZXcgcyhlKmUsdCp0LG8qbyksbi5fcmFkaWlUb1RoZUZvdXJ0aD1uZXcgcyhlKmUqZSplLHQqdCp0KnQsbypvKm8qbyksbi5fb25lT3ZlclJhZGlpPW5ldyBzKGU9PT0wPzA6MS9lLHQ9PT0wPzA6MS90LG89PT0wPzA6MS9vKSxuLl9vbmVPdmVyUmFkaWlTcXVhcmVkPW5ldyBzKGU9PT0wPzA6MS8oZSplKSx0PT09MD8wOjEvKHQqdCksbz09PTA/MDoxLyhvKm8pKSxuLl9taW5pbXVtUmFkaXVzPU1hdGgubWluKGUsdCxvKSxuLl9tYXhpbXVtUmFkaXVzPU1hdGgubWF4KGUsdCxvKSxuLl9jZW50ZXJUb2xlcmFuY2VTcXVhcmVkPWsuRVBTSUxPTjEsbi5fcmFkaWlTcXVhcmVkLnohPT0wJiYobi5fc3F1YXJlZFhPdmVyU3F1YXJlZFo9bi5fcmFkaWlTcXVhcmVkLngvbi5fcmFkaWlTcXVhcmVkLnopfWZ1bmN0aW9uIHkxKG4sZSx0KXtsZXQgbz0uNSooZStuKSxhPS41KihlLW4pLHI9MDtmb3IobGV0IGk9MDtpPDU7aSsrKXtsZXQgZj1hKlFTW2ldO3IrPSRTW2ldKih0KG8rZikrdChvLWYpKX1yZXR1cm4gcio9YSxyfXZhciBGbyxxUyxXUyxYUyxZUyxKUyxaUyxRUywkUyxLLFZlPVgoKCk9Pnt2dCgpO01lKCk7Z3QoKTtzZSgpO0xlKCk7em0oKTtGbz1jbGFzcyBue2NvbnN0cnVjdG9yKGUsdCxvKXt0aGlzLl9yYWRpaT12b2lkIDAsdGhpcy5fcmFkaWlTcXVhcmVkPXZvaWQgMCx0aGlzLl9yYWRpaVRvVGhlRm91cnRoPXZvaWQgMCx0aGlzLl9vbmVPdmVyUmFkaWk9dm9pZCAwLHRoaXMuX29uZU92ZXJSYWRpaVNxdWFyZWQ9dm9pZCAwLHRoaXMuX21pbmltdW1SYWRpdXM9dm9pZCAwLHRoaXMuX21heGltdW1SYWRpdXM9dm9pZCAwLHRoaXMuX2NlbnRlclRvbGVyYW5jZVNxdWFyZWQ9dm9pZCAwLHRoaXMuX3NxdWFyZWRYT3ZlclNxdWFyZWRaPXZvaWQgMCxfMSh0aGlzLGUsdCxvKX1nZXQgcmFkaWkoKXtyZXR1cm4gdGhpcy5fcmFkaWl9Z2V0IHJhZGlpU3F1YXJlZCgpe3JldHVybiB0aGlzLl9yYWRpaVNxdWFyZWR9Z2V0IHJhZGlpVG9UaGVGb3VydGgoKXtyZXR1cm4gdGhpcy5fcmFkaWlUb1RoZUZvdXJ0aH1nZXQgb25lT3ZlclJhZGlpKCl7cmV0dXJuIHRoaXMuX29uZU92ZXJSYWRpaX1nZXQgb25lT3ZlclJhZGlpU3F1YXJlZCgpe3JldHVybiB0aGlzLl9vbmVPdmVyUmFkaWlTcXVhcmVkfWdldCBtaW5pbXVtUmFkaXVzKCl7cmV0dXJuIHRoaXMuX21pbmltdW1SYWRpdXN9Z2V0IG1heGltdW1SYWRpdXMoKXtyZXR1cm4gdGhpcy5fbWF4aW11bVJhZGl1c31zdGF0aWMgY2xvbmUoZSx0KXtpZighZyhlKSlyZXR1cm47bGV0IG89ZS5fcmFkaWk7cmV0dXJuIGcodCk/KHMuY2xvbmUobyx0Ll9yYWRpaSkscy5jbG9uZShlLl9yYWRpaVNxdWFyZWQsdC5fcmFkaWlTcXVhcmVkKSxzLmNsb25lKGUuX3JhZGlpVG9UaGVGb3VydGgsdC5fcmFkaWlUb1RoZUZvdXJ0aCkscy5jbG9uZShlLl9vbmVPdmVyUmFkaWksdC5fb25lT3ZlclJhZGlpKSxzLmNsb25lKGUuX29uZU92ZXJSYWRpaVNxdWFyZWQsdC5fb25lT3ZlclJhZGlpU3F1YXJlZCksdC5fbWluaW11bVJhZGl1cz1lLl9taW5pbXVtUmFkaXVzLHQuX21heGltdW1SYWRpdXM9ZS5fbWF4aW11bVJhZGl1cyx0Ll9jZW50ZXJUb2xlcmFuY2VTcXVhcmVkPWUuX2NlbnRlclRvbGVyYW5jZVNxdWFyZWQsdCk6bmV3IG4oby54LG8ueSxvLnopfXN0YXRpYyBmcm9tQ2FydGVzaWFuMyhlLHQpe3JldHVybiBnKHQpfHwodD1uZXcgbiksZyhlKSYmXzEodCxlLngsZS55LGUueiksdH1zdGF0aWMgZ2V0IGRlZmF1bHQoKXtyZXR1cm4gbi5fZGVmYXVsdH1zdGF0aWMgc2V0IGRlZmF1bHQoZSl7bi5fZGVmYXVsdD1lLHMuX2VsbGlwc29pZFJhZGlpU3F1YXJlZD1lLnJhZGlpU3F1YXJlZCxyZS5fZWxsaXBzb2lkT25lT3ZlclJhZGlpPWUub25lT3ZlclJhZGlpLHJlLl9lbGxpcHNvaWRPbmVPdmVyUmFkaWlTcXVhcmVkPWUub25lT3ZlclJhZGlpU3F1YXJlZCxyZS5fZWxsaXBzb2lkQ2VudGVyVG9sZXJhbmNlU3F1YXJlZD1lLl9jZW50ZXJUb2xlcmFuY2VTcXVhcmVkfWNsb25lKGUpe3JldHVybiBuLmNsb25lKHRoaXMsZSl9c3RhdGljIHBhY2soZSx0LG8pe3JldHVybiBvPW8/PzAscy5wYWNrKGUuX3JhZGlpLHQsbyksdH1zdGF0aWMgdW5wYWNrKGUsdCxvKXt0PXQ/PzA7bGV0IGE9cy51bnBhY2soZSx0KTtyZXR1cm4gbi5mcm9tQ2FydGVzaWFuMyhhLG8pfWdlb2RldGljU3VyZmFjZU5vcm1hbENhcnRvZ3JhcGhpYyhlLHQpe2xldCBvPWUubG9uZ2l0dWRlLGE9ZS5sYXRpdHVkZSxyPU1hdGguY29zKGEpLGk9cipNYXRoLmNvcyhvKSxmPXIqTWF0aC5zaW4obyksZD1NYXRoLnNpbihhKTtyZXR1cm4gZyh0KXx8KHQ9bmV3IHMpLHQueD1pLHQueT1mLHQuej1kLHMubm9ybWFsaXplKHQsdCl9Z2VvZGV0aWNTdXJmYWNlTm9ybWFsKGUsdCl7aWYoIXMuZXF1YWxzRXBzaWxvbihlLHMuWkVSTyxrLkVQU0lMT04xNCkpcmV0dXJuIGcodCl8fCh0PW5ldyBzKSx0PXMubXVsdGlwbHlDb21wb25lbnRzKGUsdGhpcy5fb25lT3ZlclJhZGlpU3F1YXJlZCx0KSxzLm5vcm1hbGl6ZSh0LHQpfWNhcnRvZ3JhcGhpY1RvQ2FydGVzaWFuKGUsdCl7bGV0IG89cVMsYT1XUzt0aGlzLmdlb2RldGljU3VyZmFjZU5vcm1hbENhcnRvZ3JhcGhpYyhlLG8pLHMubXVsdGlwbHlDb21wb25lbnRzKHRoaXMuX3JhZGlpU3F1YXJlZCxvLGEpO2xldCByPU1hdGguc3FydChzLmRvdChvLGEpKTtyZXR1cm4gcy5kaXZpZGVCeVNjYWxhcihhLHIsYSkscy5tdWx0aXBseUJ5U2NhbGFyKG8sZS5oZWlnaHQsbyksZyh0KXx8KHQ9bmV3IHMpLHMuYWRkKGEsbyx0KX1jYXJ0b2dyYXBoaWNBcnJheVRvQ2FydGVzaWFuQXJyYXkoZSx0KXtsZXQgbz1lLmxlbmd0aDtnKHQpP3QubGVuZ3RoPW86dD1uZXcgQXJyYXkobyk7Zm9yKGxldCBhPTA7YTxvO2ErKyl0W2FdPXRoaXMuY2FydG9ncmFwaGljVG9DYXJ0ZXNpYW4oZVthXSx0W2FdKTtyZXR1cm4gdH1jYXJ0ZXNpYW5Ub0NhcnRvZ3JhcGhpYyhlLHQpe2xldCBvPXRoaXMuc2NhbGVUb0dlb2RldGljU3VyZmFjZShlLFlTKTtpZighZyhvKSlyZXR1cm47bGV0IGE9dGhpcy5nZW9kZXRpY1N1cmZhY2VOb3JtYWwobyxYUykscj1zLnN1YnRyYWN0KGUsbyxKUyksaT1NYXRoLmF0YW4yKGEueSxhLngpLGY9TWF0aC5hc2luKGEueiksZD1rLnNpZ24ocy5kb3QocixlKSkqcy5tYWduaXR1ZGUocik7cmV0dXJuIGcodCk/KHQubG9uZ2l0dWRlPWksdC5sYXRpdHVkZT1mLHQuaGVpZ2h0PWQsdCk6bmV3IHJlKGksZixkKX1jYXJ0ZXNpYW5BcnJheVRvQ2FydG9ncmFwaGljQXJyYXkoZSx0KXtsZXQgbz1lLmxlbmd0aDtnKHQpP3QubGVuZ3RoPW86dD1uZXcgQXJyYXkobyk7Zm9yKGxldCBhPTA7YTxvOysrYSl0W2FdPXRoaXMuY2FydGVzaWFuVG9DYXJ0b2dyYXBoaWMoZVthXSx0W2FdKTtyZXR1cm4gdH1zY2FsZVRvR2VvZGV0aWNTdXJmYWNlKGUsdCl7cmV0dXJuICR1KGUsdGhpcy5fb25lT3ZlclJhZGlpLHRoaXMuX29uZU92ZXJSYWRpaVNxdWFyZWQsdGhpcy5fY2VudGVyVG9sZXJhbmNlU3F1YXJlZCx0KX1zY2FsZVRvR2VvY2VudHJpY1N1cmZhY2UoZSx0KXtnKHQpfHwodD1uZXcgcyk7bGV0IG89ZS54LGE9ZS55LHI9ZS56LGk9dGhpcy5fb25lT3ZlclJhZGlpU3F1YXJlZCxmPTEvTWF0aC5zcXJ0KG8qbyppLngrYSphKmkueStyKnIqaS56KTtyZXR1cm4gcy5tdWx0aXBseUJ5U2NhbGFyKGUsZix0KX10cmFuc2Zvcm1Qb3NpdGlvblRvU2NhbGVkU3BhY2UoZSx0KXtyZXR1cm4gZyh0KXx8KHQ9bmV3IHMpLHMubXVsdGlwbHlDb21wb25lbnRzKGUsdGhpcy5fb25lT3ZlclJhZGlpLHQpfXRyYW5zZm9ybVBvc2l0aW9uRnJvbVNjYWxlZFNwYWNlKGUsdCl7cmV0dXJuIGcodCl8fCh0PW5ldyBzKSxzLm11bHRpcGx5Q29tcG9uZW50cyhlLHRoaXMuX3JhZGlpLHQpfWVxdWFscyhlKXtyZXR1cm4gdGhpcz09PWV8fGcoZSkmJnMuZXF1YWxzKHRoaXMuX3JhZGlpLGUuX3JhZGlpKX10b1N0cmluZygpe3JldHVybiB0aGlzLl9yYWRpaS50b1N0cmluZygpfWdldFN1cmZhY2VOb3JtYWxJbnRlcnNlY3Rpb25XaXRoWkF4aXMoZSx0LG8pe3Q9dD8/MDtsZXQgYT10aGlzLl9zcXVhcmVkWE92ZXJTcXVhcmVkWjtpZihnKG8pfHwobz1uZXcgcyksby54PTAsby55PTAsby56PWUueiooMS1hKSwhKE1hdGguYWJzKG8ueik+PXRoaXMuX3JhZGlpLnotdCkpcmV0dXJuIG99Z2V0TG9jYWxDdXJ2YXR1cmUoZSx0KXtnKHQpfHwodD1uZXcgWSk7bGV0IG89dGhpcy5nZXRTdXJmYWNlTm9ybWFsSW50ZXJzZWN0aW9uV2l0aFpBeGlzKGUsMCxaUyksYT1zLmRpc3RhbmNlKGUsbykscj10aGlzLm1pbmltdW1SYWRpdXMqYS90aGlzLm1heGltdW1SYWRpdXMqKjIsaT1hKnIqKjI7cmV0dXJuIFkuZnJvbUVsZW1lbnRzKDEvYSwxL2ksdCl9c3VyZmFjZUFyZWEoZSl7bGV0IHQ9ZS53ZXN0LG89ZS5lYXN0LGE9ZS5zb3V0aCxyPWUubm9ydGg7Zm9yKDtvPHQ7KW8rPWsuVFdPX1BJO2xldCBpPXRoaXMuX3JhZGlpU3F1YXJlZCxmPWkueCxkPWkueSxjPWkueix1PWYqZDtyZXR1cm4geTEoYSxyLGZ1bmN0aW9uKGwpe2xldCBoPU1hdGguY29zKGwpLG09TWF0aC5zaW4obCk7cmV0dXJuIE1hdGguY29zKGwpKnkxKHQsbyxmdW5jdGlvbihiKXtsZXQgcD1NYXRoLmNvcyhiKSx5PU1hdGguc2luKGIpO3JldHVybiBNYXRoLnNxcnQodSptKm0rYyooZCpwKnArZip5KnkpKmgqaCl9KX0pfX07Rm8uV0dTODQ9T2JqZWN0LmZyZWV6ZShuZXcgRm8oNjM3ODEzNyw2Mzc4MTM3LDYzNTY3NTIzMTQyNDUxNzllLTkpKTtGby5VTklUX1NQSEVSRT1PYmplY3QuZnJlZXplKG5ldyBGbygxLDEsMSkpO0ZvLk1PT049T2JqZWN0LmZyZWV6ZShuZXcgRm8oay5MVU5BUl9SQURJVVMsay5MVU5BUl9SQURJVVMsay5MVU5BUl9SQURJVVMpKTtGby5NQVJTPU9iamVjdC5mcmVlemUobmV3IEZvKDMzOTYxOTAsMzM5NjE5MCwzMzc2MjAwKSk7Rm8uX2RlZmF1bHQ9Rm8uV0dTODQ7Rm8ucGFja2VkTGVuZ3RoPXMucGFja2VkTGVuZ3RoO0ZvLnByb3RvdHlwZS5nZW9jZW50cmljU3VyZmFjZU5vcm1hbD1zLm5vcm1hbGl6ZTtxUz1uZXcgcyxXUz1uZXcgcyxYUz1uZXcgcyxZUz1uZXcgcyxKUz1uZXcgcyxaUz1uZXcgcyxRUz1bLjE0ODg3NDMzODk4MTYzLC40MzMzOTUzOTQxMjkyNSwuNjc5NDA5NTY4Mjk5MDIsLjg2NTA2MzM2NjY4ODk4LC45NzM5MDY1Mjg1MTcxNywwXSwkUz1bLjI5NTUyNDIyNDcxNDc1LC4yNjkyNjY3MTkzMDk5OSwuMjE5MDg2MzYyNTE1OTgsLjE0OTQ1MTM0OTE1MDU4LC4wNjY2NzEzNDQzMDg2ODQsMF07Sz1Gb30pO3ZhciBHbSxubyxJcj1YKCgpPT57TWUoKTtndCgpO3NlKCk7VmUoKTtHbT1jbGFzc3tjb25zdHJ1Y3RvcihlKXt0aGlzLl9lbGxpcHNvaWQ9ZT8/Sy5kZWZhdWx0LHRoaXMuX3NlbWltYWpvckF4aXM9dGhpcy5fZWxsaXBzb2lkLm1heGltdW1SYWRpdXMsdGhpcy5fb25lT3ZlclNlbWltYWpvckF4aXM9MS90aGlzLl9zZW1pbWFqb3JBeGlzfWdldCBlbGxpcHNvaWQoKXtyZXR1cm4gdGhpcy5fZWxsaXBzb2lkfXByb2plY3QoZSx0KXtsZXQgbz10aGlzLl9zZW1pbWFqb3JBeGlzLGE9ZS5sb25naXR1ZGUqbyxyPWUubGF0aXR1ZGUqbyxpPWUuaGVpZ2h0O3JldHVybiBnKHQpPyh0Lng9YSx0Lnk9cix0Lno9aSx0KTpuZXcgcyhhLHIsaSl9dW5wcm9qZWN0KGUsdCl7bGV0IG89dGhpcy5fb25lT3ZlclNlbWltYWpvckF4aXMsYT1lLngqbyxyPWUueSpvLGk9ZS56O3JldHVybiBnKHQpPyh0LmxvbmdpdHVkZT1hLHQubGF0aXR1ZGU9cix0LmhlaWdodD1pLHQpOm5ldyByZShhLHIsaSl9fSxubz1HbX0pO3ZhciBBMSxFbixXaT1YKCgpPT57QTE9e09VVFNJREU6LTEsSU5URVJTRUNUSU5HOjAsSU5TSURFOjF9O09iamVjdC5mcmVlemUoQTEpO0VuPUExfSk7ZnVuY3Rpb24gZUMobixlKXt0aGlzLnN0YXJ0PW4/PzAsdGhpcy5zdG9wPWU/PzB9dmFyIF9vLHVmPVgoKCk9Pntfbz1lQ30pO2Z1bmN0aW9uIGlDKG4pe2xldCBlPTA7Zm9yKGxldCB0PTA7dDw5OysrdCl7bGV0IG89blt0XTtlKz1vKm99cmV0dXJuIE1hdGguc3FydChlKX1mdW5jdGlvbiBjQyhuKXtsZXQgZT0wO2ZvcihsZXQgdD0wO3Q8MzsrK3Qpe2xldCBvPW5bQnQuZ2V0RWxlbWVudEluZGV4KEttW3RdLEhtW3RdKV07ZSs9MipvKm99cmV0dXJuIE1hdGguc3FydChlKX1mdW5jdGlvbiBzQyhuLGUpe2xldCB0PWsuRVBTSUxPTjE1LG89MCxhPTE7Zm9yKGxldCBjPTA7YzwzOysrYyl7bGV0IHU9TWF0aC5hYnMobltCdC5nZXRFbGVtZW50SW5kZXgoS21bY10sSG1bY10pXSk7dT5vJiYoYT1jLG89dSl9bGV0IHI9MSxpPTAsZj1IbVthXSxkPUttW2FdO2lmKE1hdGguYWJzKG5bQnQuZ2V0RWxlbWVudEluZGV4KGQsZildKT50KXtsZXQgYz1uW0J0LmdldEVsZW1lbnRJbmRleChkLGQpXSx1PW5bQnQuZ2V0RWxlbWVudEluZGV4KGYsZildLGw9bltCdC5nZXRFbGVtZW50SW5kZXgoZCxmKV0saD0oYy11KS8yL2wsbTtoPDA/bT0tMS8oLWgrTWF0aC5zcXJ0KDEraCpoKSk6bT0xLyhoK01hdGguc3FydCgxK2gqaCkpLHI9MS9NYXRoLnNxcnQoMSttKm0pLGk9bSpyfXJldHVybiBlPUJ0LmNsb25lKEJ0LklERU5USVRZLGUpLGVbQnQuZ2V0RWxlbWVudEluZGV4KGYsZildPWVbQnQuZ2V0RWxlbWVudEluZGV4KGQsZCldPXIsZVtCdC5nZXRFbGVtZW50SW5kZXgoZCxmKV09aSxlW0J0LmdldEVsZW1lbnRJbmRleChmLGQpXT0taSxlfXZhciBCdCx0QyxuQyxWbSx3MSxvQyxhQyx0bCxFMSxyQyxIbSxLbSxKLEluPVgoKCk9PntNZSgpO3NlKCk7TGUoKTtCdD1jbGFzcyBue2NvbnN0cnVjdG9yKGUsdCxvLGEscixpLGYsZCxjKXt0aGlzWzBdPWU/PzAsdGhpc1sxXT1hPz8wLHRoaXNbMl09Zj8/MCx0aGlzWzNdPXQ/PzAsdGhpc1s0XT1yPz8wLHRoaXNbNV09ZD8/MCx0aGlzWzZdPW8/PzAsdGhpc1s3XT1pPz8wLHRoaXNbOF09Yz8/MH1zdGF0aWMgcGFjayhlLHQsbyl7cmV0dXJuIG89bz8/MCx0W28rK109ZVswXSx0W28rK109ZVsxXSx0W28rK109ZVsyXSx0W28rK109ZVszXSx0W28rK109ZVs0XSx0W28rK109ZVs1XSx0W28rK109ZVs2XSx0W28rK109ZVs3XSx0W28rK109ZVs4XSx0fXN0YXRpYyB1bnBhY2soZSx0LG8pe3JldHVybiB0PXQ/PzAsZyhvKXx8KG89bmV3IG4pLG9bMF09ZVt0KytdLG9bMV09ZVt0KytdLG9bMl09ZVt0KytdLG9bM109ZVt0KytdLG9bNF09ZVt0KytdLG9bNV09ZVt0KytdLG9bNl09ZVt0KytdLG9bN109ZVt0KytdLG9bOF09ZVt0KytdLG99c3RhdGljIHBhY2tBcnJheShlLHQpe2xldCBvPWUubGVuZ3RoLGE9byo5O2codCk/IUFycmF5LmlzQXJyYXkodCkmJnQubGVuZ3RoIT09YXx8dC5sZW5ndGghPT1hJiYodC5sZW5ndGg9YSk6dD1uZXcgQXJyYXkoYSk7Zm9yKGxldCByPTA7cjxvOysrciluLnBhY2soZVtyXSx0LHIqOSk7cmV0dXJuIHR9c3RhdGljIHVucGFja0FycmF5KGUsdCl7bGV0IG89ZS5sZW5ndGg7Zyh0KT90Lmxlbmd0aD1vLzk6dD1uZXcgQXJyYXkoby85KTtmb3IobGV0IGE9MDthPG87YSs9OSl7bGV0IHI9YS85O3Rbcl09bi51bnBhY2soZSxhLHRbcl0pfXJldHVybiB0fXN0YXRpYyBjbG9uZShlLHQpe2lmKGcoZSkpcmV0dXJuIGcodCk/KHRbMF09ZVswXSx0WzFdPWVbMV0sdFsyXT1lWzJdLHRbM109ZVszXSx0WzRdPWVbNF0sdFs1XT1lWzVdLHRbNl09ZVs2XSx0WzddPWVbN10sdFs4XT1lWzhdLHQpOm5ldyBuKGVbMF0sZVszXSxlWzZdLGVbMV0sZVs0XSxlWzddLGVbMl0sZVs1XSxlWzhdKX1zdGF0aWMgZnJvbUNvbHVtbk1ham9yQXJyYXkoZSx0KXtyZXR1cm4gbi5jbG9uZShlLHQpfXN0YXRpYyBmcm9tUm93TWFqb3JBcnJheShlLHQpe3JldHVybiBnKHQpPyh0WzBdPWVbMF0sdFsxXT1lWzNdLHRbMl09ZVs2XSx0WzNdPWVbMV0sdFs0XT1lWzRdLHRbNV09ZVs3XSx0WzZdPWVbMl0sdFs3XT1lWzVdLHRbOF09ZVs4XSx0KTpuZXcgbihlWzBdLGVbMV0sZVsyXSxlWzNdLGVbNF0sZVs1XSxlWzZdLGVbN10sZVs4XSl9c3RhdGljIGZyb21RdWF0ZXJuaW9uKGUsdCl7bGV0IG89ZS54KmUueCxhPWUueCplLnkscj1lLngqZS56LGk9ZS54KmUudyxmPWUueSplLnksZD1lLnkqZS56LGM9ZS55KmUudyx1PWUueiplLnosbD1lLnoqZS53LGg9ZS53KmUudyxtPW8tZi11K2gsYj0yKihhLWwpLHA9MioocitjKSx5PTIqKGErbCksRT0tbytmLXUraCxfPTIqKGQtaSksVD0yKihyLWMpLHc9MiooZCtpKSxSPS1vLWYrdStoO3JldHVybiBnKHQpPyh0WzBdPW0sdFsxXT15LHRbMl09VCx0WzNdPWIsdFs0XT1FLHRbNV09dyx0WzZdPXAsdFs3XT1fLHRbOF09Uix0KTpuZXcgbihtLGIscCx5LEUsXyxULHcsUil9c3RhdGljIGZyb21IZWFkaW5nUGl0Y2hSb2xsKGUsdCl7bGV0IG89TWF0aC5jb3MoLWUucGl0Y2gpLGE9TWF0aC5jb3MoLWUuaGVhZGluZykscj1NYXRoLmNvcyhlLnJvbGwpLGk9TWF0aC5zaW4oLWUucGl0Y2gpLGY9TWF0aC5zaW4oLWUuaGVhZGluZyksZD1NYXRoLnNpbihlLnJvbGwpLGM9byphLHU9LXIqZitkKmkqYSxsPWQqZityKmkqYSxoPW8qZixtPXIqYStkKmkqZixiPS1kKmErcippKmYscD0taSx5PWQqbyxFPXIqbztyZXR1cm4gZyh0KT8odFswXT1jLHRbMV09aCx0WzJdPXAsdFszXT11LHRbNF09bSx0WzVdPXksdFs2XT1sLHRbN109Yix0WzhdPUUsdCk6bmV3IG4oYyx1LGwsaCxtLGIscCx5LEUpfXN0YXRpYyBmcm9tU2NhbGUoZSx0KXtyZXR1cm4gZyh0KT8odFswXT1lLngsdFsxXT0wLHRbMl09MCx0WzNdPTAsdFs0XT1lLnksdFs1XT0wLHRbNl09MCx0WzddPTAsdFs4XT1lLnosdCk6bmV3IG4oZS54LDAsMCwwLGUueSwwLDAsMCxlLnopfXN0YXRpYyBmcm9tVW5pZm9ybVNjYWxlKGUsdCl7cmV0dXJuIGcodCk/KHRbMF09ZSx0WzFdPTAsdFsyXT0wLHRbM109MCx0WzRdPWUsdFs1XT0wLHRbNl09MCx0WzddPTAsdFs4XT1lLHQpOm5ldyBuKGUsMCwwLDAsZSwwLDAsMCxlKX1zdGF0aWMgZnJvbUNyb3NzUHJvZHVjdChlLHQpe3JldHVybiBnKHQpPyh0WzBdPTAsdFsxXT1lLnosdFsyXT0tZS55LHRbM109LWUueix0WzRdPTAsdFs1XT1lLngsdFs2XT1lLnksdFs3XT0tZS54LHRbOF09MCx0KTpuZXcgbigwLC1lLnosZS55LGUueiwwLC1lLngsLWUueSxlLngsMCl9c3RhdGljIGZyb21Sb3RhdGlvblgoZSx0KXtsZXQgbz1NYXRoLmNvcyhlKSxhPU1hdGguc2luKGUpO3JldHVybiBnKHQpPyh0WzBdPTEsdFsxXT0wLHRbMl09MCx0WzNdPTAsdFs0XT1vLHRbNV09YSx0WzZdPTAsdFs3XT0tYSx0WzhdPW8sdCk6bmV3IG4oMSwwLDAsMCxvLC1hLDAsYSxvKX1zdGF0aWMgZnJvbVJvdGF0aW9uWShlLHQpe2xldCBvPU1hdGguY29zKGUpLGE9TWF0aC5zaW4oZSk7cmV0dXJuIGcodCk/KHRbMF09byx0WzFdPTAsdFsyXT0tYSx0WzNdPTAsdFs0XT0xLHRbNV09MCx0WzZdPWEsdFs3XT0wLHRbOF09byx0KTpuZXcgbihvLDAsYSwwLDEsMCwtYSwwLG8pfXN0YXRpYyBmcm9tUm90YXRpb25aKGUsdCl7bGV0IG89TWF0aC5jb3MoZSksYT1NYXRoLnNpbihlKTtyZXR1cm4gZyh0KT8odFswXT1vLHRbMV09YSx0WzJdPTAsdFszXT0tYSx0WzRdPW8sdFs1XT0wLHRbNl09MCx0WzddPTAsdFs4XT0xLHQpOm5ldyBuKG8sLWEsMCxhLG8sMCwwLDAsMSl9c3RhdGljIHRvQXJyYXkoZSx0KXtyZXR1cm4gZyh0KT8odFswXT1lWzBdLHRbMV09ZVsxXSx0WzJdPWVbMl0sdFszXT1lWzNdLHRbNF09ZVs0XSx0WzVdPWVbNV0sdFs2XT1lWzZdLHRbN109ZVs3XSx0WzhdPWVbOF0sdCk6W2VbMF0sZVsxXSxlWzJdLGVbM10sZVs0XSxlWzVdLGVbNl0sZVs3XSxlWzhdXX1zdGF0aWMgZ2V0RWxlbWVudEluZGV4KGUsdCl7cmV0dXJuIGUqMyt0fXN0YXRpYyBnZXRDb2x1bW4oZSx0LG8pe2xldCBhPXQqMyxyPWVbYV0saT1lW2ErMV0sZj1lW2ErMl07cmV0dXJuIG8ueD1yLG8ueT1pLG8uej1mLG99c3RhdGljIHNldENvbHVtbihlLHQsbyxhKXthPW4uY2xvbmUoZSxhKTtsZXQgcj10KjM7cmV0dXJuIGFbcl09by54LGFbcisxXT1vLnksYVtyKzJdPW8ueixhfXN0YXRpYyBnZXRSb3coZSx0LG8pe2xldCBhPWVbdF0scj1lW3QrM10saT1lW3QrNl07cmV0dXJuIG8ueD1hLG8ueT1yLG8uej1pLG99c3RhdGljIHNldFJvdyhlLHQsbyxhKXtyZXR1cm4gYT1uLmNsb25lKGUsYSksYVt0XT1vLngsYVt0KzNdPW8ueSxhW3QrNl09by56LGF9c3RhdGljIHNldFNjYWxlKGUsdCxvKXtsZXQgYT1uLmdldFNjYWxlKGUsdEMpLHI9dC54L2EueCxpPXQueS9hLnksZj10LnovYS56O3JldHVybiBvWzBdPWVbMF0qcixvWzFdPWVbMV0qcixvWzJdPWVbMl0qcixvWzNdPWVbM10qaSxvWzRdPWVbNF0qaSxvWzVdPWVbNV0qaSxvWzZdPWVbNl0qZixvWzddPWVbN10qZixvWzhdPWVbOF0qZixvfXN0YXRpYyBzZXRVbmlmb3JtU2NhbGUoZSx0LG8pe2xldCBhPW4uZ2V0U2NhbGUoZSxuQykscj10L2EueCxpPXQvYS55LGY9dC9hLno7cmV0dXJuIG9bMF09ZVswXSpyLG9bMV09ZVsxXSpyLG9bMl09ZVsyXSpyLG9bM109ZVszXSppLG9bNF09ZVs0XSppLG9bNV09ZVs1XSppLG9bNl09ZVs2XSpmLG9bN109ZVs3XSpmLG9bOF09ZVs4XSpmLG99c3RhdGljIGdldFNjYWxlKGUsdCl7cmV0dXJuIHQueD1zLm1hZ25pdHVkZShzLmZyb21FbGVtZW50cyhlWzBdLGVbMV0sZVsyXSxWbSkpLHQueT1zLm1hZ25pdHVkZShzLmZyb21FbGVtZW50cyhlWzNdLGVbNF0sZVs1XSxWbSkpLHQuej1zLm1hZ25pdHVkZShzLmZyb21FbGVtZW50cyhlWzZdLGVbN10sZVs4XSxWbSkpLHR9c3RhdGljIGdldE1heGltdW1TY2FsZShlKXtyZXR1cm4gbi5nZXRTY2FsZShlLHcxKSxzLm1heGltdW1Db21wb25lbnQodzEpfXN0YXRpYyBzZXRSb3RhdGlvbihlLHQsbyl7bGV0IGE9bi5nZXRTY2FsZShlLG9DKTtyZXR1cm4gb1swXT10WzBdKmEueCxvWzFdPXRbMV0qYS54LG9bMl09dFsyXSphLngsb1szXT10WzNdKmEueSxvWzRdPXRbNF0qYS55LG9bNV09dFs1XSphLnksb1s2XT10WzZdKmEueixvWzddPXRbN10qYS56LG9bOF09dFs4XSphLnosb31zdGF0aWMgZ2V0Um90YXRpb24oZSx0KXtsZXQgbz1uLmdldFNjYWxlKGUsYUMpO3JldHVybiB0WzBdPWVbMF0vby54LHRbMV09ZVsxXS9vLngsdFsyXT1lWzJdL28ueCx0WzNdPWVbM10vby55LHRbNF09ZVs0XS9vLnksdFs1XT1lWzVdL28ueSx0WzZdPWVbNl0vby56LHRbN109ZVs3XS9vLnosdFs4XT1lWzhdL28ueix0fXN0YXRpYyBtdWx0aXBseShlLHQsbyl7bGV0IGE9ZVswXSp0WzBdK2VbM10qdFsxXStlWzZdKnRbMl0scj1lWzFdKnRbMF0rZVs0XSp0WzFdK2VbN10qdFsyXSxpPWVbMl0qdFswXStlWzVdKnRbMV0rZVs4XSp0WzJdLGY9ZVswXSp0WzNdK2VbM10qdFs0XStlWzZdKnRbNV0sZD1lWzFdKnRbM10rZVs0XSp0WzRdK2VbN10qdFs1XSxjPWVbMl0qdFszXStlWzVdKnRbNF0rZVs4XSp0WzVdLHU9ZVswXSp0WzZdK2VbM10qdFs3XStlWzZdKnRbOF0sbD1lWzFdKnRbNl0rZVs0XSp0WzddK2VbN10qdFs4XSxoPWVbMl0qdFs2XStlWzVdKnRbN10rZVs4XSp0WzhdO3JldHVybiBvWzBdPWEsb1sxXT1yLG9bMl09aSxvWzNdPWYsb1s0XT1kLG9bNV09YyxvWzZdPXUsb1s3XT1sLG9bOF09aCxvfXN0YXRpYyBhZGQoZSx0LG8pe3JldHVybiBvWzBdPWVbMF0rdFswXSxvWzFdPWVbMV0rdFsxXSxvWzJdPWVbMl0rdFsyXSxvWzNdPWVbM10rdFszXSxvWzRdPWVbNF0rdFs0XSxvWzVdPWVbNV0rdFs1XSxvWzZdPWVbNl0rdFs2XSxvWzddPWVbN10rdFs3XSxvWzhdPWVbOF0rdFs4XSxvfXN0YXRpYyBzdWJ0cmFjdChlLHQsbyl7cmV0dXJuIG9bMF09ZVswXS10WzBdLG9bMV09ZVsxXS10WzFdLG9bMl09ZVsyXS10WzJdLG9bM109ZVszXS10WzNdLG9bNF09ZVs0XS10WzRdLG9bNV09ZVs1XS10WzVdLG9bNl09ZVs2XS10WzZdLG9bN109ZVs3XS10WzddLG9bOF09ZVs4XS10WzhdLG99c3RhdGljIG11bHRpcGx5QnlWZWN0b3IoZSx0LG8pe2xldCBhPXQueCxyPXQueSxpPXQueixmPWVbMF0qYStlWzNdKnIrZVs2XSppLGQ9ZVsxXSphK2VbNF0qcitlWzddKmksYz1lWzJdKmErZVs1XSpyK2VbOF0qaTtyZXR1cm4gby54PWYsby55PWQsby56PWMsb31zdGF0aWMgbXVsdGlwbHlCeVNjYWxhcihlLHQsbyl7cmV0dXJuIG9bMF09ZVswXSp0LG9bMV09ZVsxXSp0LG9bMl09ZVsyXSp0LG9bM109ZVszXSp0LG9bNF09ZVs0XSp0LG9bNV09ZVs1XSp0LG9bNl09ZVs2XSp0LG9bN109ZVs3XSp0LG9bOF09ZVs4XSp0LG99c3RhdGljIG11bHRpcGx5QnlTY2FsZShlLHQsbyl7cmV0dXJuIG9bMF09ZVswXSp0Lngsb1sxXT1lWzFdKnQueCxvWzJdPWVbMl0qdC54LG9bM109ZVszXSp0Lnksb1s0XT1lWzRdKnQueSxvWzVdPWVbNV0qdC55LG9bNl09ZVs2XSp0Lnosb1s3XT1lWzddKnQueixvWzhdPWVbOF0qdC56LG99c3RhdGljIG11bHRpcGx5QnlVbmlmb3JtU2NhbGUoZSx0LG8pe3JldHVybiBvWzBdPWVbMF0qdCxvWzFdPWVbMV0qdCxvWzJdPWVbMl0qdCxvWzNdPWVbM10qdCxvWzRdPWVbNF0qdCxvWzVdPWVbNV0qdCxvWzZdPWVbNl0qdCxvWzddPWVbN10qdCxvWzhdPWVbOF0qdCxvfXN0YXRpYyBuZWdhdGUoZSx0KXtyZXR1cm4gdFswXT0tZVswXSx0WzFdPS1lWzFdLHRbMl09LWVbMl0sdFszXT0tZVszXSx0WzRdPS1lWzRdLHRbNV09LWVbNV0sdFs2XT0tZVs2XSx0WzddPS1lWzddLHRbOF09LWVbOF0sdH1zdGF0aWMgdHJhbnNwb3NlKGUsdCl7bGV0IG89ZVswXSxhPWVbM10scj1lWzZdLGk9ZVsxXSxmPWVbNF0sZD1lWzddLGM9ZVsyXSx1PWVbNV0sbD1lWzhdO3JldHVybiB0WzBdPW8sdFsxXT1hLHRbMl09cix0WzNdPWksdFs0XT1mLHRbNV09ZCx0WzZdPWMsdFs3XT11LHRbOF09bCx0fXN0YXRpYyBjb21wdXRlRWlnZW5EZWNvbXBvc2l0aW9uKGUsdCl7bGV0IG89ay5FUFNJTE9OMjAsYT0xMCxyPTAsaT0wO2codCl8fCh0PXt9KTtsZXQgZj10LnVuaXRhcnk9bi5jbG9uZShuLklERU5USVRZLHQudW5pdGFyeSksZD10LmRpYWdvbmFsPW4uY2xvbmUoZSx0LmRpYWdvbmFsKSxjPW8qaUMoZCk7Zm9yKDtpPGEmJmNDKGQpPmM7KXNDKGQsdGwpLG4udHJhbnNwb3NlKHRsLEUxKSxuLm11bHRpcGx5KGQsdGwsZCksbi5tdWx0aXBseShFMSxkLGQpLG4ubXVsdGlwbHkoZix0bCxmKSwrK3I+MiYmKCsraSxyPTApO3JldHVybiB0fXN0YXRpYyBhYnMoZSx0KXtyZXR1cm4gdFswXT1NYXRoLmFicyhlWzBdKSx0WzFdPU1hdGguYWJzKGVbMV0pLHRbMl09TWF0aC5hYnMoZVsyXSksdFszXT1NYXRoLmFicyhlWzNdKSx0WzRdPU1hdGguYWJzKGVbNF0pLHRbNV09TWF0aC5hYnMoZVs1XSksdFs2XT1NYXRoLmFicyhlWzZdKSx0WzddPU1hdGguYWJzKGVbN10pLHRbOF09TWF0aC5hYnMoZVs4XSksdH1zdGF0aWMgZGV0ZXJtaW5hbnQoZSl7bGV0IHQ9ZVswXSxvPWVbM10sYT1lWzZdLHI9ZVsxXSxpPWVbNF0sZj1lWzddLGQ9ZVsyXSxjPWVbNV0sdT1lWzhdO3JldHVybiB0KihpKnUtYypmKStyKihjKmEtbyp1KStkKihvKmYtaSphKX1zdGF0aWMgaW52ZXJzZShlLHQpe2xldCBvPWVbMF0sYT1lWzFdLHI9ZVsyXSxpPWVbM10sZj1lWzRdLGQ9ZVs1XSxjPWVbNl0sdT1lWzddLGw9ZVs4XSxoPW4uZGV0ZXJtaW5hbnQoZSk7dFswXT1mKmwtdSpkLHRbMV09dSpyLWEqbCx0WzJdPWEqZC1mKnIsdFszXT1jKmQtaSpsLHRbNF09bypsLWMqcix0WzVdPWkqci1vKmQsdFs2XT1pKnUtYypmLHRbN109YyphLW8qdSx0WzhdPW8qZi1pKmE7bGV0IG09MS9oO3JldHVybiBuLm11bHRpcGx5QnlTY2FsYXIodCxtLHQpfXN0YXRpYyBpbnZlcnNlVHJhbnNwb3NlKGUsdCl7cmV0dXJuIG4uaW52ZXJzZShuLnRyYW5zcG9zZShlLHJDKSx0KX1zdGF0aWMgZXF1YWxzKGUsdCl7cmV0dXJuIGU9PT10fHxnKGUpJiZnKHQpJiZlWzBdPT09dFswXSYmZVsxXT09PXRbMV0mJmVbMl09PT10WzJdJiZlWzNdPT09dFszXSYmZVs0XT09PXRbNF0mJmVbNV09PT10WzVdJiZlWzZdPT09dFs2XSYmZVs3XT09PXRbN10mJmVbOF09PT10WzhdfXN0YXRpYyBlcXVhbHNFcHNpbG9uKGUsdCxvKXtyZXR1cm4gbz1vPz8wLGU9PT10fHxnKGUpJiZnKHQpJiZNYXRoLmFicyhlWzBdLXRbMF0pPD1vJiZNYXRoLmFicyhlWzFdLXRbMV0pPD1vJiZNYXRoLmFicyhlWzJdLXRbMl0pPD1vJiZNYXRoLmFicyhlWzNdLXRbM10pPD1vJiZNYXRoLmFicyhlWzRdLXRbNF0pPD1vJiZNYXRoLmFicyhlWzVdLXRbNV0pPD1vJiZNYXRoLmFicyhlWzZdLXRbNl0pPD1vJiZNYXRoLmFicyhlWzddLXRbN10pPD1vJiZNYXRoLmFicyhlWzhdLXRbOF0pPD1vfWdldCBsZW5ndGgoKXtyZXR1cm4gbi5wYWNrZWRMZW5ndGh9Y2xvbmUoZSl7cmV0dXJuIG4uY2xvbmUodGhpcyxlKX1lcXVhbHMoZSl7cmV0dXJuIG4uZXF1YWxzKHRoaXMsZSl9c3RhdGljIGVxdWFsc0FycmF5KGUsdCxvKXtyZXR1cm4gZVswXT09PXRbb10mJmVbMV09PT10W28rMV0mJmVbMl09PT10W28rMl0mJmVbM109PT10W28rM10mJmVbNF09PT10W28rNF0mJmVbNV09PT10W28rNV0mJmVbNl09PT10W28rNl0mJmVbN109PT10W28rN10mJmVbOF09PT10W28rOF19ZXF1YWxzRXBzaWxvbihlLHQpe3JldHVybiBuLmVxdWFsc0Vwc2lsb24odGhpcyxlLHQpfXRvU3RyaW5nKCl7cmV0dXJuYCgke3RoaXNbMF19LCAke3RoaXNbM119LCAke3RoaXNbNl19KQooJHt0aGlzWzFdfSwgJHt0aGlzWzRdfSwgJHt0aGlzWzddfSkKKCR7dGhpc1syXX0sICR7dGhpc1s1XX0sICR7dGhpc1s4XX0pYH19O0J0LnBhY2tlZExlbmd0aD05O0J0LmZyb21BcnJheT1CdC51bnBhY2s7QnQuSURFTlRJVFk9T2JqZWN0LmZyZWV6ZShuZXcgQnQoMSwwLDAsMCwxLDAsMCwwLDEpKTtCdC5aRVJPPU9iamVjdC5mcmVlemUobmV3IEJ0KDAsMCwwLDAsMCwwLDAsMCwwKSk7QnQuQ09MVU1OMFJPVzA9MDtCdC5DT0xVTU4wUk9XMT0xO0J0LkNPTFVNTjBST1cyPTI7QnQuQ09MVU1OMVJPVzA9MztCdC5DT0xVTU4xUk9XMT00O0J0LkNPTFVNTjFST1cyPTU7QnQuQ09MVU1OMlJPVzA9NjtCdC5DT0xVTU4yUk9XMT03O0J0LkNPTFVNTjJST1cyPTg7dEM9bmV3IHMsbkM9bmV3IHMsVm09bmV3IHMsdzE9bmV3IHMsb0M9bmV3IHMsYUM9bmV3IHMsdGw9bmV3IEJ0LEUxPW5ldyBCdCxyQz1uZXcgQnQ7SG09WzEsMCwwXSxLbT1bMiwyLDFdO0o9QnR9KTt2YXIgSG4sbmwsVDEsZkMscW0seG8sZEMsdUMsUjEscnQsbWE9WCgoKT0+e3NlKCk7TGUoKTtIbj1jbGFzcyBue2NvbnN0cnVjdG9yKGUsdCxvLGEpe3RoaXMueD1lPz8wLHRoaXMueT10Pz8wLHRoaXMuej1vPz8wLHRoaXMudz1hPz8wfXN0YXRpYyBmcm9tRWxlbWVudHMoZSx0LG8sYSxyKXtyZXR1cm4gZyhyKT8oci54PWUsci55PXQsci56PW8sci53PWEscik6bmV3IG4oZSx0LG8sYSl9c3RhdGljIGZyb21Db2xvcihlLHQpe3JldHVybiBnKHQpPyh0Lng9ZS5yZWQsdC55PWUuZ3JlZW4sdC56PWUuYmx1ZSx0Lnc9ZS5hbHBoYSx0KTpuZXcgbihlLnJlZCxlLmdyZWVuLGUuYmx1ZSxlLmFscGhhKX1zdGF0aWMgY2xvbmUoZSx0KXtpZihnKGUpKXJldHVybiBnKHQpPyh0Lng9ZS54LHQueT1lLnksdC56PWUueix0Lnc9ZS53LHQpOm5ldyBuKGUueCxlLnksZS56LGUudyl9c3RhdGljIHBhY2soZSx0LG8pe3JldHVybiBvPW8/PzAsdFtvKytdPWUueCx0W28rK109ZS55LHRbbysrXT1lLnosdFtvXT1lLncsdH1zdGF0aWMgdW5wYWNrKGUsdCxvKXtyZXR1cm4gdD10Pz8wLGcobyl8fChvPW5ldyBuKSxvLng9ZVt0KytdLG8ueT1lW3QrK10sby56PWVbdCsrXSxvLnc9ZVt0XSxvfXN0YXRpYyBwYWNrQXJyYXkoZSx0KXtsZXQgbz1lLmxlbmd0aCxhPW8qNDtnKHQpPyFBcnJheS5pc0FycmF5KHQpJiZ0Lmxlbmd0aCE9PWF8fHQubGVuZ3RoIT09YSYmKHQubGVuZ3RoPWEpOnQ9bmV3IEFycmF5KGEpO2ZvcihsZXQgcj0wO3I8bzsrK3Ipbi5wYWNrKGVbcl0sdCxyKjQpO3JldHVybiB0fXN0YXRpYyB1bnBhY2tBcnJheShlLHQpe2xldCBvPWUubGVuZ3RoO2codCk/dC5sZW5ndGg9by80OnQ9bmV3IEFycmF5KG8vNCk7Zm9yKGxldCBhPTA7YTxvO2ErPTQpe2xldCByPWEvNDt0W3JdPW4udW5wYWNrKGUsYSx0W3JdKX1yZXR1cm4gdH1zdGF0aWMgbWF4aW11bUNvbXBvbmVudChlKXtyZXR1cm4gTWF0aC5tYXgoZS54LGUueSxlLnosZS53KX1zdGF0aWMgbWluaW11bUNvbXBvbmVudChlKXtyZXR1cm4gTWF0aC5taW4oZS54LGUueSxlLnosZS53KX1zdGF0aWMgbWluaW11bUJ5Q29tcG9uZW50KGUsdCxvKXtyZXR1cm4gby54PU1hdGgubWluKGUueCx0LngpLG8ueT1NYXRoLm1pbihlLnksdC55KSxvLno9TWF0aC5taW4oZS56LHQueiksby53PU1hd