/** * @license * Cesium - https://github.com/CesiumGS/cesium * Version 1.127 * * 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. */ var Cesium=(()=>{var x1e=Object.create;var lN=Object.defineProperty;var _1e=Object.getOwnPropertyDescriptor;var T1e=Object.getOwnPropertyNames;var S1e=Object.getPrototypeOf,C1e=Object.prototype.hasOwnProperty;var dN=(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 dd=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports),V1e=(e,t)=>{for(var n in t)lN(e,n,{get:t[n],enumerable:!0})},Wq=(e,t,n,i)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of T1e(t))!C1e.call(e,o)&&o!==n&&lN(e,o,{get:()=>t[o],enumerable:!(i=_1e(t,o))||i.enumerable});return e};var T=(e,t,n)=>(n=e!=null?x1e(S1e(e)):{},Wq(t||!e||!e.__esModule?lN(n,"default",{value:e,enumerable:!0}):n,e)),L1e=e=>Wq(lN({},"__esModule",{value:!0}),e);var S=dd(()=>{globalThis.CESIUM_WORKERS=atob("dmFyIENlc2l1bVdvcmtlcnM9KCgpPT57dmFyIFhTPU9iamVjdC5jcmVhdGU7dmFyIEJsPU9iamVjdC5kZWZpbmVQcm9wZXJ0eTt2YXIgWVM9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjt2YXIgJFM9T2JqZWN0LmdldE93blByb3BlcnR5TmFtZXM7dmFyIFpTPU9iamVjdC5nZXRQcm90b3R5cGVPZixRUz1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O3ZhciBwcj0odD0+dHlwZW9mIHJlcXVpcmU8InUiP3JlcXVpcmU6dHlwZW9mIFByb3h5PCJ1Ij9uZXcgUHJveHkodCx7Z2V0OihlLG4pPT4odHlwZW9mIHJlcXVpcmU8InUiP3JlcXVpcmU6ZSlbbl19KTp0KShmdW5jdGlvbih0KXtpZih0eXBlb2YgcmVxdWlyZTwidSIpcmV0dXJuIHJlcXVpcmUuYXBwbHkodGhpcyxhcmd1bWVudHMpO3Rocm93IEVycm9yKCdEeW5hbWljIHJlcXVpcmUgb2YgIicrdCsnIiBpcyBub3Qgc3VwcG9ydGVkJyl9KSxwMT10PT5lPT57dmFyIG49dFtlXTtpZihuKXJldHVybiBuKCk7dGhyb3cgbmV3IEVycm9yKCJNb2R1bGUgbm90IGZvdW5kIGluIGJ1bmRsZTogIitlKX07dmFyIFo9KHQsZSk9PigpPT4odCYmKGU9dCh0PTApKSxlKTt2YXIgWG49KHQsZSk9PigpPT4oZXx8dCgoZT17ZXhwb3J0czp7fX0pLmV4cG9ydHMsZSksZS5leHBvcnRzKSxkZT0odCxlKT0+e2Zvcih2YXIgbiBpbiBlKUJsKHQsbix7Z2V0OmVbbl0sZW51bWVyYWJsZTohMH0pfSxkMT0odCxlLG4sbyk9PntpZihlJiZ0eXBlb2YgZT09Im9iamVjdCJ8fHR5cGVvZiBlPT0iZnVuY3Rpb24iKWZvcihsZXQgciBvZiAkUyhlKSkhUVMuY2FsbCh0LHIpJiZyIT09biYmQmwodCxyLHtnZXQ6KCk9PmVbcl0sZW51bWVyYWJsZTohKG89WVMoZSxyKSl8fG8uZW51bWVyYWJsZX0pO3JldHVybiB0fTt2YXIgZHI9KHQsZSxuKT0+KG49dCE9bnVsbD9YUyhaUyh0KSk6e30sZDEoZXx8IXR8fCF0Ll9fZXNNb2R1bGU/QmwobiwiZGVmYXVsdCIse3ZhbHVlOnQsZW51bWVyYWJsZTohMH0pOm4sdCkpLEpTPXQ9PmQxKEJsKHt9LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0KTtmdW5jdGlvbiB0Qyh0KXtyZXR1cm4gdCE9bnVsbH12YXIgaCxmdD1aKCgpPT57aD10Q30pO2Z1bmN0aW9uIFZzKHQpe3RoaXMubmFtZT0iRGV2ZWxvcGVyRXJyb3IiLHRoaXMubWVzc2FnZT10O2xldCBlO3RyeXt0aHJvdyBuZXcgRXJyb3J9Y2F0Y2gobil7ZT1uLnN0YWNrfXRoaXMuc3RhY2s9ZX12YXIgQixIdD1aKCgpPT57ZnQoKTtoKE9iamVjdC5jcmVhdGUpJiYoVnMucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoRXJyb3IucHJvdG90eXBlKSxWcy5wcm90b3R5cGUuY29uc3RydWN0b3I9VnMpO1ZzLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe2xldCB0PWAke3RoaXMubmFtZX06ICR7dGhpcy5tZXNzYWdlfWA7cmV0dXJuIGgodGhpcy5zdGFjaykmJih0Kz1gCiR7dGhpcy5zdGFjay50b1N0cmluZygpfWApLHR9O1ZzLnRocm93SW5zdGFudGlhdGlvbkVycm9yPWZ1bmN0aW9uKCl7dGhyb3cgbmV3IFZzKCJUaGlzIGZ1bmN0aW9uIGRlZmluZXMgYW4gaW50ZXJmYWNlIGFuZCBzaG91bGQgbm90IGJlIGNhbGxlZCBkaXJlY3RseS4iKX07Qj1Wc30pO2Z1bmN0aW9uIGVDKHQpe3JldHVybmAke3R9IGlzIHJlcXVpcmVkLCBhY3R1YWwgdmFsdWUgd2FzIHVuZGVmaW5lZGB9ZnVuY3Rpb24gemModCxlLG4pe3JldHVybmBFeHBlY3RlZCAke259IHRvIGJlIHR5cGVvZiAke2V9LCBhY3R1YWwgdHlwZW9mIHdhcyAke3R9YH12YXIgWW4seSxYdD1aKCgpPT57ZnQoKTtIdCgpO1luPXt9O1luLnR5cGVPZj17fTtZbi5kZWZpbmVkPWZ1bmN0aW9uKHQsZSl7aWYoIWgoZSkpdGhyb3cgbmV3IEIoZUModCkpfTtZbi50eXBlT2YuZnVuYz1mdW5jdGlvbih0LGUpe2lmKHR5cGVvZiBlIT0iZnVuY3Rpb24iKXRocm93IG5ldyBCKHpjKHR5cGVvZiBlLCJmdW5jdGlvbiIsdCkpfTtZbi50eXBlT2Yuc3RyaW5nPWZ1bmN0aW9uKHQsZSl7aWYodHlwZW9mIGUhPSJzdHJpbmciKXRocm93IG5ldyBCKHpjKHR5cGVvZiBlLCJzdHJpbmciLHQpKX07WW4udHlwZU9mLm51bWJlcj1mdW5jdGlvbih0LGUpe2lmKHR5cGVvZiBlIT0ibnVtYmVyIil0aHJvdyBuZXcgQih6Yyh0eXBlb2YgZSwibnVtYmVyIix0KSl9O1luLnR5cGVPZi5udW1iZXIubGVzc1RoYW49ZnVuY3Rpb24odCxlLG4pe2lmKFluLnR5cGVPZi5udW1iZXIodCxlKSxlPj1uKXRocm93IG5ldyBCKGBFeHBlY3RlZCAke3R9IHRvIGJlIGxlc3MgdGhhbiAke259LCBhY3R1YWwgdmFsdWUgd2FzICR7ZX1gKX07WW4udHlwZU9mLm51bWJlci5sZXNzVGhhbk9yRXF1YWxzPWZ1bmN0aW9uKHQsZSxuKXtpZihZbi50eXBlT2YubnVtYmVyKHQsZSksZT5uKXRocm93IG5ldyBCKGBFeHBlY3RlZCAke3R9IHRvIGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byAke259LCBhY3R1YWwgdmFsdWUgd2FzICR7ZX1gKX07WW4udHlwZU9mLm51bWJlci5ncmVhdGVyVGhhbj1mdW5jdGlvbih0LGUsbil7aWYoWW4udHlwZU9mLm51bWJlcih0LGUpLGU8PW4pdGhyb3cgbmV3IEIoYEV4cGVjdGVkICR7dH0gdG8gYmUgZ3JlYXRlciB0aGFuICR7bn0sIGFjdHVhbCB2YWx1ZSB3YXMgJHtlfWApfTtZbi50eXBlT2YubnVtYmVyLmdyZWF0ZXJUaGFuT3JFcXVhbHM9ZnVuY3Rpb24odCxlLG4pe2lmKFluLnR5cGVPZi5udW1iZXIodCxlKSxlPG4pdGhyb3cgbmV3IEIoYEV4cGVjdGVkICR7dH0gdG8gYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICR7bn0sIGFjdHVhbCB2YWx1ZSB3YXMgJHtlfWApfTtZbi50eXBlT2Yub2JqZWN0PWZ1bmN0aW9uKHQsZSl7aWYodHlwZW9mIGUhPSJvYmplY3QiKXRocm93IG5ldyBCKHpjKHR5cGVvZiBlLCJvYmplY3QiLHQpKX07WW4udHlwZU9mLmJvb2w9ZnVuY3Rpb24odCxlKXtpZih0eXBlb2YgZSE9ImJvb2xlYW4iKXRocm93IG5ldyBCKHpjKHR5cGVvZiBlLCJib29sZWFuIix0KSl9O1luLnR5cGVPZi5iaWdpbnQ9ZnVuY3Rpb24odCxlKXtpZih0eXBlb2YgZSE9ImJpZ2ludCIpdGhyb3cgbmV3IEIoemModHlwZW9mIGUsImJpZ2ludCIsdCkpfTtZbi50eXBlT2YubnVtYmVyLmVxdWFscz1mdW5jdGlvbih0LGUsbixvKXtpZihZbi50eXBlT2YubnVtYmVyKHQsbiksWW4udHlwZU9mLm51bWJlcihlLG8pLG4hPT1vKXRocm93IG5ldyBCKGAke3R9IG11c3QgYmUgZXF1YWwgdG8gJHtlfSwgdGhlIGFjdHVhbCB2YWx1ZXMgYXJlICR7bn0gYW5kICR7b31gKX07eT1Zbn0pO2Z1bmN0aW9uIG0xKHQsZSl7cmV0dXJuIHQhPW51bGw/dDplfXZhciB4LEl0PVooKCk9PnttMS5FTVBUWV9PQkpFQ1Q9T2JqZWN0LmZyZWV6ZSh7fSk7eD1tMX0pO3ZhciBfMT1YbigocVYsaDEpPT57dmFyIFJpPWZ1bmN0aW9uKHQpe3Q9PW51bGwmJih0PW5ldyBEYXRlKCkuZ2V0VGltZSgpKSx0aGlzLk49NjI0LHRoaXMuTT0zOTcsdGhpcy5NQVRSSVhfQT0yNTY3NDgzNjE1LHRoaXMuVVBQRVJfTUFTSz0yMTQ3NDgzNjQ4LHRoaXMuTE9XRVJfTUFTSz0yMTQ3NDgzNjQ3LHRoaXMubXQ9bmV3IEFycmF5KHRoaXMuTiksdGhpcy5tdGk9dGhpcy5OKzEsdC5jb25zdHJ1Y3Rvcj09QXJyYXk/dGhpcy5pbml0X2J5X2FycmF5KHQsdC5sZW5ndGgpOnRoaXMuaW5pdF9zZWVkKHQpfTtSaS5wcm90b3R5cGUuaW5pdF9zZWVkPWZ1bmN0aW9uKHQpe2Zvcih0aGlzLm10WzBdPXQ+Pj4wLHRoaXMubXRpPTE7dGhpcy5tdGk8dGhpcy5OO3RoaXMubXRpKyspe3ZhciB0PXRoaXMubXRbdGhpcy5tdGktMV1edGhpcy5tdFt0aGlzLm10aS0xXT4+PjMwO3RoaXMubXRbdGhpcy5tdGldPSgoKHQmNDI5NDkwMTc2MCk+Pj4xNikqMTgxMjQzMzI1Mzw8MTYpKyh0JjY1NTM1KSoxODEyNDMzMjUzK3RoaXMubXRpLHRoaXMubXRbdGhpcy5tdGldPj4+PTB9fTtSaS5wcm90b3R5cGUuaW5pdF9ieV9hcnJheT1mdW5jdGlvbih0LGUpe3ZhciBuLG8scjtmb3IodGhpcy5pbml0X3NlZWQoMTk2NTAyMTgpLG49MSxvPTAscj10aGlzLk4+ZT90aGlzLk46ZTtyO3ItLSl7dmFyIGk9dGhpcy5tdFtuLTFdXnRoaXMubXRbbi0xXT4+PjMwO3RoaXMubXRbbl09KHRoaXMubXRbbl1eKCgoaSY0Mjk0OTAxNzYwKT4+PjE2KSoxNjY0NTI1PDwxNikrKGkmNjU1MzUpKjE2NjQ1MjUpK3Rbb10rbyx0aGlzLm10W25dPj4+PTAsbisrLG8rKyxuPj10aGlzLk4mJih0aGlzLm10WzBdPXRoaXMubXRbdGhpcy5OLTFdLG49MSksbz49ZSYmKG89MCl9Zm9yKHI9dGhpcy5OLTE7cjtyLS0pe3ZhciBpPXRoaXMubXRbbi0xXV50aGlzLm10W24tMV0+Pj4zMDt0aGlzLm10W25dPSh0aGlzLm10W25dXigoKGkmNDI5NDkwMTc2MCk+Pj4xNikqMTU2NjA4Mzk0MTw8MTYpKyhpJjY1NTM1KSoxNTY2MDgzOTQxKS1uLHRoaXMubXRbbl0+Pj49MCxuKyssbj49dGhpcy5OJiYodGhpcy5tdFswXT10aGlzLm10W3RoaXMuTi0xXSxuPTEpfXRoaXMubXRbMF09MjE0NzQ4MzY0OH07UmkucHJvdG90eXBlLnJhbmRvbV9pbnQ9ZnVuY3Rpb24oKXt2YXIgdCxlPW5ldyBBcnJheSgwLHRoaXMuTUFUUklYX0EpO2lmKHRoaXMubXRpPj10aGlzLk4pe3ZhciBuO2Zvcih0aGlzLm10aT09dGhpcy5OKzEmJnRoaXMuaW5pdF9zZWVkKDU0ODkpLG49MDtuPHRoaXMuTi10aGlzLk07bisrKXQ9dGhpcy5tdFtuXSZ0aGlzLlVQUEVSX01BU0t8dGhpcy5tdFtuKzFdJnRoaXMuTE9XRVJfTUFTSyx0aGlzLm10W25dPXRoaXMubXRbbit0aGlzLk1dXnQ+Pj4xXmVbdCYxXTtmb3IoO248dGhpcy5OLTE7bisrKXQ9dGhpcy5tdFtuXSZ0aGlzLlVQUEVSX01BU0t8dGhpcy5tdFtuKzFdJnRoaXMuTE9XRVJfTUFTSyx0aGlzLm10W25dPXRoaXMubXRbbisodGhpcy5NLXRoaXMuTildXnQ+Pj4xXmVbdCYxXTt0PXRoaXMubXRbdGhpcy5OLTFdJnRoaXMuVVBQRVJfTUFTS3x0aGlzLm10WzBdJnRoaXMuTE9XRVJfTUFTSyx0aGlzLm10W3RoaXMuTi0xXT10aGlzLm10W3RoaXMuTS0xXV50Pj4+MV5lW3QmMV0sdGhpcy5tdGk9MH1yZXR1cm4gdD10aGlzLm10W3RoaXMubXRpKytdLHRePXQ+Pj4xMSx0Xj10PDw3JjI2MzY5Mjg2NDAsdF49dDw8MTUmNDAyMjczMDc1Mix0Xj10Pj4+MTgsdD4+PjB9O1JpLnByb3RvdHlwZS5yYW5kb21faW50MzE9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yYW5kb21faW50KCk+Pj4xfTtSaS5wcm90b3R5cGUucmFuZG9tX2luY2w9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yYW5kb21faW50KCkqKDEvNDI5NDk2NzI5NSl9O1JpLnByb3RvdHlwZS5yYW5kb209ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yYW5kb21faW50KCkqKDEvNDI5NDk2NzI5Nil9O1JpLnByb3RvdHlwZS5yYW5kb21fZXhjbD1mdW5jdGlvbigpe3JldHVybih0aGlzLnJhbmRvbV9pbnQoKSsuNSkqKDEvNDI5NDk2NzI5Nil9O1JpLnByb3RvdHlwZS5yYW5kb21fbG9uZz1mdW5jdGlvbigpe3ZhciB0PXRoaXMucmFuZG9tX2ludCgpPj4+NSxlPXRoaXMucmFuZG9tX2ludCgpPj4+NjtyZXR1cm4odCo2NzEwODg2NCtlKSooMS85MDA3MTk5MjU0NzQwOTkyKX07aDEuZXhwb3J0cz1SaX0pO3ZhciBPbSx4dCxVbCx5MSxNLFd0PVooKCk9PntPbT1kcihfMSgpLDEpO1h0KCk7SXQoKTtmdCgpO0h0KCk7eHQ9e307eHQuRVBTSUxPTjE9LjE7eHQuRVBTSUxPTjI9LjAxO3h0LkVQU0lMT04zPS4wMDE7eHQuRVBTSUxPTjQ9MWUtNDt4dC5FUFNJTE9ONT0xZS01O3h0LkVQU0lMT042PTFlLTY7eHQuRVBTSUxPTjc9MWUtNzt4dC5FUFNJTE9OOD0xZS04O3h0LkVQU0lMT045PTFlLTk7eHQuRVBTSUxPTjEwPTFlLTEwO3h0LkVQU0lMT04xMT0xZS0xMTt4dC5FUFNJTE9OMTI9MWUtMTI7eHQuRVBTSUxPTjEzPTFlLTEzO3h0LkVQU0lMT04xND0xZS0xNDt4dC5FUFNJTE9OMTU9MWUtMTU7eHQuRVBTSUxPTjE2PTFlLTE2O3h0LkVQU0lMT04xNz0xZS0xNzt4dC5FUFNJTE9OMTg9MWUtMTg7eHQuRVBTSUxPTjE5PTFlLTE5O3h0LkVQU0lMT04yMD0xZS0yMDt4dC5FUFNJTE9OMjE9MWUtMjE7eHQuR1JBVklUQVRJT05BTFBBUkFNRVRFUj0zOTg2MDA0NDE4ZTU7eHQuU09MQVJfUkFESVVTPTY5NTVlNTt4dC5MVU5BUl9SQURJVVM9MTczNzQwMDt4dC5TSVhUWV9GT1VSX0tJTE9CWVRFUz02NCoxMDI0O3h0LkZPVVJfR0lHQUJZVEVTPTQqMTAyNCoxMDI0KjEwMjQ7eHQuc2lnbj14KE1hdGguc2lnbixmdW5jdGlvbihlKXtyZXR1cm4gZT0rZSxlPT09MHx8ZSE9PWU/ZTplPjA/MTotMX0pO3h0LnNpZ25Ob3RaZXJvPWZ1bmN0aW9uKHQpe3JldHVybiB0PDA/LTE6MX07eHQudG9TTm9ybT1mdW5jdGlvbih0LGUpe3JldHVybiBlPXgoZSwyNTUpLE1hdGgucm91bmQoKHh0LmNsYW1wKHQsLTEsMSkqLjUrLjUpKmUpfTt4dC5mcm9tU05vcm09ZnVuY3Rpb24odCxlKXtyZXR1cm4gZT14KGUsMjU1KSx4dC5jbGFtcCh0LDAsZSkvZSoyLTF9O3h0Lm5vcm1hbGl6ZT1mdW5jdGlvbih0LGUsbil7cmV0dXJuIG49TWF0aC5tYXgobi1lLDApLG49PT0wPzA6eHQuY2xhbXAoKHQtZSkvbiwwLDEpfTt4dC5zaW5oPXgoTWF0aC5zaW5oLGZ1bmN0aW9uKGUpe3JldHVybihNYXRoLmV4cChlKS1NYXRoLmV4cCgtZSkpLzJ9KTt4dC5jb3NoPXgoTWF0aC5jb3NoLGZ1bmN0aW9uKGUpe3JldHVybihNYXRoLmV4cChlKStNYXRoLmV4cCgtZSkpLzJ9KTt4dC5sZXJwPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4oMS1uKSp0K24qZX07eHQuUEk9TWF0aC5QSTt4dC5PTkVfT1ZFUl9QST0xL01hdGguUEk7eHQuUElfT1ZFUl9UV089TWF0aC5QSS8yO3h0LlBJX09WRVJfVEhSRUU9TWF0aC5QSS8zO3h0LlBJX09WRVJfRk9VUj1NYXRoLlBJLzQ7eHQuUElfT1ZFUl9TSVg9TWF0aC5QSS82O3h0LlRIUkVFX1BJX09WRVJfVFdPPTMqTWF0aC5QSS8yO3h0LlRXT19QST0yKk1hdGguUEk7eHQuT05FX09WRVJfVFdPX1BJPTEvKDIqTWF0aC5QSSk7eHQuUkFESUFOU19QRVJfREVHUkVFPU1hdGguUEkvMTgwO3h0LkRFR1JFRVNfUEVSX1JBRElBTj0xODAvTWF0aC5QSTt4dC5SQURJQU5TX1BFUl9BUkNTRUNPTkQ9eHQuUkFESUFOU19QRVJfREVHUkVFLzM2MDA7eHQudG9SYWRpYW5zPWZ1bmN0aW9uKHQpe2lmKCFoKHQpKXRocm93IG5ldyBCKCJkZWdyZWVzIGlzIHJlcXVpcmVkLiIpO3JldHVybiB0Knh0LlJBRElBTlNfUEVSX0RFR1JFRX07eHQudG9EZWdyZWVzPWZ1bmN0aW9uKHQpe2lmKCFoKHQpKXRocm93IG5ldyBCKCJyYWRpYW5zIGlzIHJlcXVpcmVkLiIpO3JldHVybiB0Knh0LkRFR1JFRVNfUEVSX1JBRElBTn07eHQuY29udmVydExvbmdpdHVkZVJhbmdlPWZ1bmN0aW9uKHQpe2lmKCFoKHQpKXRocm93IG5ldyBCKCJhbmdsZSBpcyByZXF1aXJlZC4iKTtsZXQgZT14dC5UV09fUEksbj10LU1hdGguZmxvb3IodC9lKSplO3JldHVybiBuPC1NYXRoLlBJP24rZTpuPj1NYXRoLlBJP24tZTpufTt4dC5jbGFtcFRvTGF0aXR1ZGVSYW5nZT1mdW5jdGlvbih0KXtpZighaCh0KSl0aHJvdyBuZXcgQigiYW5nbGUgaXMgcmVxdWlyZWQuIik7cmV0dXJuIHh0LmNsYW1wKHQsLTEqeHQuUElfT1ZFUl9UV08seHQuUElfT1ZFUl9UV08pfTt4dC5uZWdhdGl2ZVBpVG9QaT1mdW5jdGlvbih0KXtpZighaCh0KSl0aHJvdyBuZXcgQigiYW5nbGUgaXMgcmVxdWlyZWQuIik7cmV0dXJuIHQ+PS14dC5QSSYmdDw9eHQuUEk/dDp4dC56ZXJvVG9Ud29QaSh0K3h0LlBJKS14dC5QSX07eHQuemVyb1RvVHdvUGk9ZnVuY3Rpb24odCl7aWYoIWgodCkpdGhyb3cgbmV3IEIoImFuZ2xlIGlzIHJlcXVpcmVkLiIpO2lmKHQ+PTAmJnQ8PXh0LlRXT19QSSlyZXR1cm4gdDtsZXQgZT14dC5tb2QodCx4dC5UV09fUEkpO3JldHVybiBNYXRoLmFicyhlKTx4dC5FUFNJTE9OMTQmJk1hdGguYWJzKHQpPnh0LkVQU0lMT04xND94dC5UV09fUEk6ZX07eHQubW9kPWZ1bmN0aW9uKHQsZSl7aWYoIWgodCkpdGhyb3cgbmV3IEIoIm0gaXMgcmVxdWlyZWQuIik7aWYoIWgoZSkpdGhyb3cgbmV3IEIoIm4gaXMgcmVxdWlyZWQuIik7aWYoZT09PTApdGhyb3cgbmV3IEIoImRpdmlzb3IgY2Fubm90IGJlIDAuIik7cmV0dXJuIHh0LnNpZ24odCk9PT14dC5zaWduKGUpJiZNYXRoLmFicyh0KTxNYXRoLmFicyhlKT90Oih0JWUrZSklZX07eHQuZXF1YWxzRXBzaWxvbj1mdW5jdGlvbih0LGUsbixvKXtpZighaCh0KSl0aHJvdyBuZXcgQigibGVmdCBpcyByZXF1aXJlZC4iKTtpZighaChlKSl0aHJvdyBuZXcgQigicmlnaHQgaXMgcmVxdWlyZWQuIik7bj14KG4sMCksbz14KG8sbik7bGV0IHI9TWF0aC5hYnModC1lKTtyZXR1cm4gcjw9b3x8cjw9bipNYXRoLm1heChNYXRoLmFicyh0KSxNYXRoLmFicyhlKSl9O3h0Lmxlc3NUaGFuPWZ1bmN0aW9uKHQsZSxuKXtpZighaCh0KSl0aHJvdyBuZXcgQigiZmlyc3QgaXMgcmVxdWlyZWQuIik7aWYoIWgoZSkpdGhyb3cgbmV3IEIoInNlY29uZCBpcyByZXF1aXJlZC4iKTtpZighaChuKSl0aHJvdyBuZXcgQigiYWJzb2x1dGVFcHNpbG9uIGlzIHJlcXVpcmVkLiIpO3JldHVybiB0LWU8LW59O3h0Lmxlc3NUaGFuT3JFcXVhbHM9ZnVuY3Rpb24odCxlLG4pe2lmKCFoKHQpKXRocm93IG5ldyBCKCJmaXJzdCBpcyByZXF1aXJlZC4iKTtpZighaChlKSl0aHJvdyBuZXcgQigic2Vjb25kIGlzIHJlcXVpcmVkLiIpO2lmKCFoKG4pKXRocm93IG5ldyBCKCJhYnNvbHV0ZUVwc2lsb24gaXMgcmVxdWlyZWQuIik7cmV0dXJuIHQtZTxufTt4dC5ncmVhdGVyVGhhbj1mdW5jdGlvbih0LGUsbil7aWYoIWgodCkpdGhyb3cgbmV3IEIoImZpcnN0IGlzIHJlcXVpcmVkLiIpO2lmKCFoKGUpKXRocm93IG5ldyBCKCJzZWNvbmQgaXMgcmVxdWlyZWQuIik7aWYoIWgobikpdGhyb3cgbmV3IEIoImFic29sdXRlRXBzaWxvbiBpcyByZXF1aXJlZC4iKTtyZXR1cm4gdC1lPm59O3h0LmdyZWF0ZXJUaGFuT3JFcXVhbHM9ZnVuY3Rpb24odCxlLG4pe2lmKCFoKHQpKXRocm93IG5ldyBCKCJmaXJzdCBpcyByZXF1aXJlZC4iKTtpZighaChlKSl0aHJvdyBuZXcgQigic2Vjb25kIGlzIHJlcXVpcmVkLiIpO2lmKCFoKG4pKXRocm93IG5ldyBCKCJhYnNvbHV0ZUVwc2lsb24gaXMgcmVxdWlyZWQuIik7cmV0dXJuIHQtZT4tbn07VWw9WzFdO3h0LmZhY3RvcmlhbD1mdW5jdGlvbih0KXtpZih0eXBlb2YgdCE9Im51bWJlciJ8fHQ8MCl0aHJvdyBuZXcgQigiQSBudW1iZXIgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIDAgaXMgcmVxdWlyZWQuIik7bGV0IGU9VWwubGVuZ3RoO2lmKHQ+PWUpe2xldCBuPVVsW2UtMV07Zm9yKGxldCBvPWU7bzw9dDtvKyspe2xldCByPW4qbztVbC5wdXNoKHIpLG49cn19cmV0dXJuIFVsW3RdfTt4dC5pbmNyZW1lbnRXcmFwPWZ1bmN0aW9uKHQsZSxuKXtpZihuPXgobiwwKSwhaCh0KSl0aHJvdyBuZXcgQigibiBpcyByZXF1aXJlZC4iKTtpZihlPD1uKXRocm93IG5ldyBCKCJtYXhpbXVtVmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gbWluaW11bVZhbHVlLiIpO3JldHVybisrdCx0PmUmJih0PW4pLHR9O3h0LmlzUG93ZXJPZlR3bz1mdW5jdGlvbih0KXtpZih0eXBlb2YgdCE9Im51bWJlciJ8fHQ8MHx8dD40Mjk0OTY3Mjk1KXRocm93IG5ldyBCKCJBIG51bWJlciBiZXR3ZWVuIDAgYW5kICgyXjMyKS0xIGlzIHJlcXVpcmVkLiIpO3JldHVybiB0IT09MCYmKHQmdC0xKT09PTB9O3h0Lm5leHRQb3dlck9mVHdvPWZ1bmN0aW9uKHQpe2lmKHR5cGVvZiB0IT0ibnVtYmVyInx8dDwwfHx0PjIxNDc0ODM2NDgpdGhyb3cgbmV3IEIoIkEgbnVtYmVyIGJldHdlZW4gMCBhbmQgMl4zMSBpcyByZXF1aXJlZC4iKTtyZXR1cm4tLXQsdHw9dD4+MSx0fD10Pj4yLHR8PXQ+PjQsdHw9dD4+OCx0fD10Pj4xNiwrK3QsdH07eHQucHJldmlvdXNQb3dlck9mVHdvPWZ1bmN0aW9uKHQpe2lmKHR5cGVvZiB0IT0ibnVtYmVyInx8dDwwfHx0PjQyOTQ5NjcyOTUpdGhyb3cgbmV3IEIoIkEgbnVtYmVyIGJldHdlZW4gMCBhbmQgKDJeMzIpLTEgaXMgcmVxdWlyZWQuIik7cmV0dXJuIHR8PXQ+PjEsdHw9dD4+Mix0fD10Pj40LHR8PXQ+PjgsdHw9dD4+MTYsdHw9dD4+MzIsdD0odD4+PjApLSh0Pj4+MSksdH07eHQuY2xhbXA9ZnVuY3Rpb24odCxlLG4pe3JldHVybiB5LnR5cGVPZi5udW1iZXIoInZhbHVlIix0KSx5LnR5cGVPZi5udW1iZXIoIm1pbiIsZSkseS50eXBlT2YubnVtYmVyKCJtYXgiLG4pLHQ8ZT9lOnQ+bj9uOnR9O3kxPW5ldyBPbS5kZWZhdWx0O3h0LnNldFJhbmRvbU51bWJlclNlZWQ9ZnVuY3Rpb24odCl7aWYoIWgodCkpdGhyb3cgbmV3IEIoInNlZWQgaXMgcmVxdWlyZWQuIik7eTE9bmV3IE9tLmRlZmF1bHQodCl9O3h0Lm5leHRSYW5kb21OdW1iZXI9ZnVuY3Rpb24oKXtyZXR1cm4geTEucmFuZG9tKCl9O3h0LnJhbmRvbUJldHdlZW49ZnVuY3Rpb24odCxlKXtyZXR1cm4geHQubmV4dFJhbmRvbU51bWJlcigpKihlLXQpK3R9O3h0LmFjb3NDbGFtcGVkPWZ1bmN0aW9uKHQpe2lmKCFoKHQpKXRocm93IG5ldyBCKCJ2YWx1ZSBpcyByZXF1aXJlZC4iKTtyZXR1cm4gTWF0aC5hY29zKHh0LmNsYW1wKHQsLTEsMSkpfTt4dC5hc2luQ2xhbXBlZD1mdW5jdGlvbih0KXtpZighaCh0KSl0aHJvdyBuZXcgQigidmFsdWUgaXMgcmVxdWlyZWQuIik7cmV0dXJuIE1hdGguYXNpbih4dC5jbGFtcCh0LC0xLDEpKX07eHQuY2hvcmRMZW5ndGg9ZnVuY3Rpb24odCxlKXtpZighaCh0KSl0aHJvdyBuZXcgQigiYW5nbGUgaXMgcmVxdWlyZWQuIik7aWYoIWgoZSkpdGhyb3cgbmV3IEIoInJhZGl1cyBpcyByZXF1aXJlZC4iKTtyZXR1cm4gMiplKk1hdGguc2luKHQqLjUpfTt4dC5sb2dCYXNlPWZ1bmN0aW9uKHQsZSl7aWYoIWgodCkpdGhyb3cgbmV3IEIoIm51bWJlciBpcyByZXF1aXJlZC4iKTtpZighaChlKSl0aHJvdyBuZXcgQigiYmFzZSBpcyByZXF1aXJlZC4iKTtyZXR1cm4gTWF0aC5sb2codCkvTWF0aC5sb2coZSl9O3h0LmNicnQ9eChNYXRoLmNicnQsZnVuY3Rpb24oZSl7bGV0IG49TWF0aC5wb3coTWF0aC5hYnMoZSksLjMzMzMzMzMzMzMzMzMzMzMpO3JldHVybiBlPDA/LW46bn0pO3h0LmxvZzI9eChNYXRoLmxvZzIsZnVuY3Rpb24oZSl7cmV0dXJuIE1hdGgubG9nKGUpKk1hdGguTE9HMkV9KTt4dC5mb2c9ZnVuY3Rpb24odCxlKXtsZXQgbj10KmU7cmV0dXJuIDEtTWF0aC5leHAoLShuKm4pKX07eHQuZmFzdEFwcHJveGltYXRlQXRhbj1mdW5jdGlvbih0KXtyZXR1cm4geS50eXBlT2YubnVtYmVyKCJ4Iix0KSx0KigtLjE3ODQqTWF0aC5hYnModCktLjA2NjMqdCp0KzEuMDMwMSl9O3h0LmZhc3RBcHByb3hpbWF0ZUF0YW4yPWZ1bmN0aW9uKHQsZSl7eS50eXBlT2YubnVtYmVyKCJ4Iix0KSx5LnR5cGVPZi5udW1iZXIoInkiLGUpO2xldCBuLG89TWF0aC5hYnModCk7bj1NYXRoLmFicyhlKTtsZXQgcj1NYXRoLm1heChvLG4pO249TWF0aC5taW4obyxuKTtsZXQgaT1uL3I7aWYoaXNOYU4oaSkpdGhyb3cgbmV3IEIoImVpdGhlciB4IG9yIHkgbXVzdCBiZSBub256ZXJvIik7cmV0dXJuIG89eHQuZmFzdEFwcHJveGltYXRlQXRhbihpKSxvPU1hdGguYWJzKGUpPk1hdGguYWJzKHQpP3h0LlBJX09WRVJfVFdPLW86byxvPXQ8MD94dC5QSS1vOm8sbz1lPDA/LW86byxvfTtNPXh0fSk7ZnVuY3Rpb24gYnQodCxlLG4pe3RoaXMueD14KHQsMCksdGhpcy55PXgoZSwwKSx0aGlzLno9eChuLDApfXZhciBrbCxnMSxWbCxFbSxuQyxtcixqYyxhLEZ0PVooKCk9PntYdCgpO0l0KCk7ZnQoKTtIdCgpO1d0KCk7YnQuZnJvbVNwaGVyaWNhbD1mdW5jdGlvbih0LGUpe3kudHlwZU9mLm9iamVjdCgic3BoZXJpY2FsIix0KSxoKGUpfHwoZT1uZXcgYnQpO2xldCBuPXQuY2xvY2ssbz10LmNvbmUscj14KHQubWFnbml0dWRlLDEpLGk9cipNYXRoLnNpbihvKTtyZXR1cm4gZS54PWkqTWF0aC5jb3MobiksZS55PWkqTWF0aC5zaW4obiksZS56PXIqTWF0aC5jb3MobyksZX07YnQuZnJvbUVsZW1lbnRzPWZ1bmN0aW9uKHQsZSxuLG8pe3JldHVybiBoKG8pPyhvLng9dCxvLnk9ZSxvLno9bixvKTpuZXcgYnQodCxlLG4pfTtidC5jbG9uZT1mdW5jdGlvbih0LGUpe2lmKGgodCkpcmV0dXJuIGgoZSk/KGUueD10LngsZS55PXQueSxlLno9dC56LGUpOm5ldyBidCh0LngsdC55LHQueil9O2J0LmZyb21DYXJ0ZXNpYW40PWJ0LmNsb25lO2J0LnBhY2tlZExlbmd0aD0zO2J0LnBhY2s9ZnVuY3Rpb24odCxlLG4pe3JldHVybiB5LnR5cGVPZi5vYmplY3QoInZhbHVlIix0KSx5LmRlZmluZWQoImFycmF5IixlKSxuPXgobiwwKSxlW24rK109dC54LGVbbisrXT10LnksZVtuXT10LnosZX07YnQudW5wYWNrPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4geS5kZWZpbmVkKCJhcnJheSIsdCksZT14KGUsMCksaChuKXx8KG49bmV3IGJ0KSxuLng9dFtlKytdLG4ueT10W2UrK10sbi56PXRbZV0sbn07YnQucGFja0FycmF5PWZ1bmN0aW9uKHQsZSl7eS5kZWZpbmVkKCJhcnJheSIsdCk7bGV0IG49dC5sZW5ndGgsbz1uKjM7aWYoIWgoZSkpZT1uZXcgQXJyYXkobyk7ZWxzZXtpZighQXJyYXkuaXNBcnJheShlKSYmZS5sZW5ndGghPT1vKXRocm93IG5ldyBCKCJJZiByZXN1bHQgaXMgYSB0eXBlZCBhcnJheSwgaXQgbXVzdCBoYXZlIGV4YWN0bHkgYXJyYXkubGVuZ3RoICogMyBlbGVtZW50cyIpO2UubGVuZ3RoIT09byYmKGUubGVuZ3RoPW8pfWZvcihsZXQgcj0wO3I8bjsrK3IpYnQucGFjayh0W3JdLGUsciozKTtyZXR1cm4gZX07YnQudW5wYWNrQXJyYXk9ZnVuY3Rpb24odCxlKXtpZih5LmRlZmluZWQoImFycmF5Iix0KSx5LnR5cGVPZi5udW1iZXIuZ3JlYXRlclRoYW5PckVxdWFscygiYXJyYXkubGVuZ3RoIix0Lmxlbmd0aCwzKSx0Lmxlbmd0aCUzIT09MCl0aHJvdyBuZXcgQigiYXJyYXkgbGVuZ3RoIG11c3QgYmUgYSBtdWx0aXBsZSBvZiAzLiIpO2xldCBuPXQubGVuZ3RoO2goZSk/ZS5sZW5ndGg9bi8zOmU9bmV3IEFycmF5KG4vMyk7Zm9yKGxldCBvPTA7bzxuO28rPTMpe2xldCByPW8vMztlW3JdPWJ0LnVucGFjayh0LG8sZVtyXSl9cmV0dXJuIGV9O2J0LmZyb21BcnJheT1idC51bnBhY2s7YnQubWF4aW11bUNvbXBvbmVudD1mdW5jdGlvbih0KXtyZXR1cm4geS50eXBlT2Yub2JqZWN0KCJjYXJ0ZXNpYW4iLHQpLE1hdGgubWF4KHQueCx0LnksdC56KX07YnQubWluaW11bUNvbXBvbmVudD1mdW5jdGlvbih0KXtyZXR1cm4geS50eXBlT2Yub2JqZWN0KCJjYXJ0ZXNpYW4iLHQpLE1hdGgubWluKHQueCx0LnksdC56KX07YnQubWluaW11bUJ5Q29tcG9uZW50PWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4geS50eXBlT2Yub2JqZWN0KCJmaXJzdCIsdCkseS50eXBlT2Yub2JqZWN0KCJzZWNvbmQiLGUpLHkudHlwZU9mLm9iamVjdCgicmVzdWx0IixuKSxuLng9TWF0aC5taW4odC54LGUueCksbi55PU1hdGgubWluKHQueSxlLnkpLG4uej1NYXRoLm1pbih0LnosZS56KSxufTtidC5tYXhpbXVtQnlDb21wb25lbnQ9ZnVuY3Rpb24odCxlLG4pe3JldHVybiB5LnR5cGVPZi5vYmplY3QoImZpcnN0Iix0KSx5LnR5cGVPZi5vYmplY3QoInNlY29uZCIsZSkseS50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLG4pLG4ueD1NYXRoLm1heCh0LngsZS54KSxuLnk9TWF0aC5tYXgodC55LGUueSksbi56PU1hdGgubWF4KHQueixlLnopLG59O2J0LmNsYW1wPWZ1bmN0aW9uKHQsZSxuLG8pe3kudHlwZU9mLm9iamVjdCgidmFsdWUiLHQpLHkudHlwZU9mLm9iamVjdCgibWluIixlKSx5LnR5cGVPZi5vYmplY3QoIm1heCIsbikseS50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLG8pO2xldCByPU0uY2xhbXAodC54LGUueCxuLngpLGk9TS5jbGFtcCh0LnksZS55LG4ueSkscz1NLmNsYW1wKHQueixlLnosbi56KTtyZXR1cm4gby54PXIsby55PWksby56PXMsb307YnQubWFnbml0dWRlU3F1YXJlZD1mdW5jdGlvbih0KXtyZXR1cm4geS50eXBlT2Yub2JqZWN0KCJjYXJ0ZXNpYW4iLHQpLHQueCp0LngrdC55KnQueSt0LnoqdC56fTtidC5tYWduaXR1ZGU9ZnVuY3Rpb24odCl7cmV0dXJuIE1hdGguc3FydChidC5tYWduaXR1ZGVTcXVhcmVkKHQpKX07a2w9bmV3IGJ0O2J0LmRpc3RhbmNlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHkudHlwZU9mLm9iamVjdCgibGVmdCIsdCkseS50eXBlT2Yub2JqZWN0KCJyaWdodCIsZSksYnQuc3VidHJhY3QodCxlLGtsKSxidC5tYWduaXR1ZGUoa2wpfTtidC5kaXN0YW5jZVNxdWFyZWQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4geS50eXBlT2Yub2JqZWN0KCJsZWZ0Iix0KSx5LnR5cGVPZi5vYmplY3QoInJpZ2h0IixlKSxidC5zdWJ0cmFjdCh0LGUsa2wpLGJ0Lm1hZ25pdHVkZVNxdWFyZWQoa2wpfTtidC5ub3JtYWxpemU9ZnVuY3Rpb24odCxlKXt5LnR5cGVPZi5vYmplY3QoImNhcnRlc2lhbiIsdCkseS50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLGUpO2xldCBuPWJ0Lm1hZ25pdHVkZSh0KTtpZihlLng9dC54L24sZS55PXQueS9uLGUuej10Lnovbixpc05hTihlLngpfHxpc05hTihlLnkpfHxpc05hTihlLnopKXRocm93IG5ldyBCKCJub3JtYWxpemVkIHJlc3VsdCBpcyBub3QgYSBudW1iZXIiKTtyZXR1cm4gZX07YnQuZG90PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHkudHlwZU9mLm9iamVjdCgibGVmdCIsdCkseS50eXBlT2Yub2JqZWN0KCJyaWdodCIsZSksdC54KmUueCt0LnkqZS55K3QueiplLnp9O2J0Lm11bHRpcGx5Q29tcG9uZW50cz1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHkudHlwZU9mLm9iamVjdCgibGVmdCIsdCkseS50eXBlT2Yub2JqZWN0KCJyaWdodCIsZSkseS50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLG4pLG4ueD10LngqZS54LG4ueT10LnkqZS55LG4uej10LnoqZS56LG59O2J0LmRpdmlkZUNvbXBvbmVudHM9ZnVuY3Rpb24odCxlLG4pe3JldHVybiB5LnR5cGVPZi5vYmplY3QoImxlZnQiLHQpLHkudHlwZU9mLm9iamVjdCgicmlnaHQiLGUpLHkudHlwZU9mLm9iamVjdCgicmVzdWx0IixuKSxuLng9dC54L2UueCxuLnk9dC55L2UueSxuLno9dC56L2UueixufTtidC5hZGQ9ZnVuY3Rpb24odCxlLG4pe3JldHVybiB5LnR5cGVPZi5vYmplY3QoImxlZnQiLHQpLHkudHlwZU9mLm9iamVjdCgicmlnaHQiLGUpLHkudHlwZU9mLm9iamVjdCgicmVzdWx0IixuKSxuLng9dC54K2UueCxuLnk9dC55K2UueSxuLno9dC56K2UueixufTtidC5zdWJ0cmFjdD1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHkudHlwZU9mLm9iamVjdCgibGVmdCIsdCkseS50eXBlT2Yub2JqZWN0KCJyaWdodCIsZSkseS50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLG4pLG4ueD10LngtZS54LG4ueT10LnktZS55LG4uej10LnotZS56LG59O2J0Lm11bHRpcGx5QnlTY2FsYXI9ZnVuY3Rpb24odCxlLG4pe3JldHVybiB5LnR5cGVPZi5vYmplY3QoImNhcnRlc2lhbiIsdCkseS50eXBlT2YubnVtYmVyKCJzY2FsYXIiLGUpLHkudHlwZU9mLm9iamVjdCgicmVzdWx0IixuKSxuLng9dC54KmUsbi55PXQueSplLG4uej10LnoqZSxufTtidC5kaXZpZGVCeVNjYWxhcj1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHkudHlwZU9mLm9iamVjdCgiY2FydGVzaWFuIix0KSx5LnR5cGVPZi5udW1iZXIoInNjYWxhciIsZSkseS50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLG4pLG4ueD10LngvZSxuLnk9dC55L2Usbi56PXQuei9lLG59O2J0Lm5lZ2F0ZT1mdW5jdGlvbih0LGUpe3JldHVybiB5LnR5cGVPZi5vYmplY3QoImNhcnRlc2lhbiIsdCkseS50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLGUpLGUueD0tdC54LGUueT0tdC55LGUuej0tdC56LGV9O2J0LmFicz1mdW5jdGlvbih0LGUpe3JldHVybiB5LnR5cGVPZi5vYmplY3QoImNhcnRlc2lhbiIsdCkseS50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLGUpLGUueD1NYXRoLmFicyh0LngpLGUueT1NYXRoLmFicyh0LnkpLGUuej1NYXRoLmFicyh0LnopLGV9O2cxPW5ldyBidDtidC5sZXJwPWZ1bmN0aW9uKHQsZSxuLG8pe3JldHVybiB5LnR5cGVPZi5vYmplY3QoInN0YXJ0Iix0KSx5LnR5cGVPZi5vYmplY3QoImVuZCIsZSkseS50eXBlT2YubnVtYmVyKCJ0IixuKSx5LnR5cGVPZi5vYmplY3QoInJlc3VsdCIsbyksYnQubXVsdGlwbHlCeVNjYWxhcihlLG4sZzEpLG89YnQubXVsdGlwbHlCeVNjYWxhcih0LDEtbixvKSxidC5hZGQoZzEsbyxvKX07Vmw9bmV3IGJ0LEVtPW5ldyBidDtidC5hbmdsZUJldHdlZW49ZnVuY3Rpb24odCxlKXt5LnR5cGVPZi5vYmplY3QoImxlZnQiLHQpLHkudHlwZU9mLm9iamVjdCgicmlnaHQiLGUpLGJ0Lm5vcm1hbGl6ZSh0LFZsKSxidC5ub3JtYWxpemUoZSxFbSk7bGV0IG49YnQuZG90KFZsLEVtKSxvPWJ0Lm1hZ25pdHVkZShidC5jcm9zcyhWbCxFbSxWbCkpO3JldHVybiBNYXRoLmF0YW4yKG8sbil9O25DPW5ldyBidDtidC5tb3N0T3J0aG9nb25hbEF4aXM9ZnVuY3Rpb24odCxlKXt5LnR5cGVPZi5vYmplY3QoImNhcnRlc2lhbiIsdCkseS50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLGUpO2xldCBuPWJ0Lm5vcm1hbGl6ZSh0LG5DKTtyZXR1cm4gYnQuYWJzKG4sbiksbi54PD1uLnk/bi54PD1uLno/ZT1idC5jbG9uZShidC5VTklUX1gsZSk6ZT1idC5jbG9uZShidC5VTklUX1osZSk6bi55PD1uLno/ZT1idC5jbG9uZShidC5VTklUX1ksZSk6ZT1idC5jbG9uZShidC5VTklUX1osZSksZX07YnQucHJvamVjdFZlY3Rvcj1mdW5jdGlvbih0LGUsbil7eS5kZWZpbmVkKCJhIix0KSx5LmRlZmluZWQoImIiLGUpLHkuZGVmaW5lZCgicmVzdWx0IixuKTtsZXQgbz1idC5kb3QodCxlKS9idC5kb3QoZSxlKTtyZXR1cm4gYnQubXVsdGlwbHlCeVNjYWxhcihlLG8sbil9O2J0LmVxdWFscz1mdW5jdGlvbih0LGUpe3JldHVybiB0PT09ZXx8aCh0KSYmaChlKSYmdC54PT09ZS54JiZ0Lnk9PT1lLnkmJnQuej09PWUuen07YnQuZXF1YWxzQXJyYXk9ZnVuY3Rpb24odCxlLG4pe3JldHVybiB0Lng9PT1lW25dJiZ0Lnk9PT1lW24rMV0mJnQuej09PWVbbisyXX07YnQuZXF1YWxzRXBzaWxvbj1mdW5jdGlvbih0LGUsbixvKXtyZXR1cm4gdD09PWV8fGgodCkmJmgoZSkmJk0uZXF1YWxzRXBzaWxvbih0LngsZS54LG4sbykmJk0uZXF1YWxzRXBzaWxvbih0LnksZS55LG4sbykmJk0uZXF1YWxzRXBzaWxvbih0LnosZS56LG4sbyl9O2J0LmNyb3NzPWZ1bmN0aW9uKHQsZSxuKXt5LnR5cGVPZi5vYmplY3QoImxlZnQiLHQpLHkudHlwZU9mLm9iamVjdCgicmlnaHQiLGUpLHkudHlwZU9mLm9iamVjdCgicmVzdWx0IixuKTtsZXQgbz10Lngscj10LnksaT10Lnoscz1lLngsZj1lLnksdT1lLnosYz1yKnUtaSpmLGw9aSpzLW8qdSxwPW8qZi1yKnM7cmV0dXJuIG4ueD1jLG4ueT1sLG4uej1wLG59O2J0Lm1pZHBvaW50PWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4geS50eXBlT2Yub2JqZWN0KCJsZWZ0Iix0KSx5LnR5cGVPZi5vYmplY3QoInJpZ2h0IixlKSx5LnR5cGVPZi5vYmplY3QoInJlc3VsdCIsbiksbi54PSh0LngrZS54KSouNSxuLnk9KHQueStlLnkpKi41LG4uej0odC56K2UueikqLjUsbn07YnQuZnJvbURlZ3JlZXM9ZnVuY3Rpb24odCxlLG4sbyxyKXtyZXR1cm4geS50eXBlT2YubnVtYmVyKCJsb25naXR1ZGUiLHQpLHkudHlwZU9mLm51bWJlcigibGF0aXR1ZGUiLGUpLHQ9TS50b1JhZGlhbnModCksZT1NLnRvUmFkaWFucyhlKSxidC5mcm9tUmFkaWFucyh0LGUsbixvLHIpfTttcj1uZXcgYnQsamM9bmV3IGJ0O2J0Ll9lbGxpcHNvaWRSYWRpaVNxdWFyZWQ9bmV3IGJ0KDYzNzgxMzcqNjM3ODEzNyw2Mzc4MTM3KjYzNzgxMzcsNjM1Njc1MjMxNDI0NTE3OWUtOSo2MzU2NzUyMzE0MjQ1MTc5ZS05KTtidC5mcm9tUmFkaWFucz1mdW5jdGlvbih0LGUsbixvLHIpe3kudHlwZU9mLm51bWJlcigibG9uZ2l0dWRlIix0KSx5LnR5cGVPZi5udW1iZXIoImxhdGl0dWRlIixlKSxuPXgobiwwKTtsZXQgaT1oKG8pP28ucmFkaWlTcXVhcmVkOmJ0Ll9lbGxpcHNvaWRSYWRpaVNxdWFyZWQscz1NYXRoLmNvcyhlKTttci54PXMqTWF0aC5jb3ModCksbXIueT1zKk1hdGguc2luKHQpLG1yLno9TWF0aC5zaW4oZSksbXI9YnQubm9ybWFsaXplKG1yLG1yKSxidC5tdWx0aXBseUNvbXBvbmVudHMoaSxtcixqYyk7bGV0IGY9TWF0aC5zcXJ0KGJ0LmRvdChtcixqYykpO3JldHVybiBqYz1idC5kaXZpZGVCeVNjYWxhcihqYyxmLGpjKSxtcj1idC5tdWx0aXBseUJ5U2NhbGFyKG1yLG4sbXIpLGgocil8fChyPW5ldyBidCksYnQuYWRkKGpjLG1yLHIpfTtidC5mcm9tRGVncmVlc0FycmF5PWZ1bmN0aW9uKHQsZSxuKXtpZih5LmRlZmluZWQoImNvb3JkaW5hdGVzIix0KSx0Lmxlbmd0aDwyfHx0Lmxlbmd0aCUyIT09MCl0aHJvdyBuZXcgQigidGhlIG51bWJlciBvZiBjb29yZGluYXRlcyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMiBhbmQgYXQgbGVhc3QgMiIpO2xldCBvPXQubGVuZ3RoO2gobik/bi5sZW5ndGg9by8yOm49bmV3IEFycmF5KG8vMik7Zm9yKGxldCByPTA7cjxvO3IrPTIpe2xldCBpPXRbcl0scz10W3IrMV0sZj1yLzI7bltmXT1idC5mcm9tRGVncmVlcyhpLHMsMCxlLG5bZl0pfXJldHVybiBufTtidC5mcm9tUmFkaWFuc0FycmF5PWZ1bmN0aW9uKHQsZSxuKXtpZih5LmRlZmluZWQoImNvb3JkaW5hdGVzIix0KSx0Lmxlbmd0aDwyfHx0Lmxlbmd0aCUyIT09MCl0aHJvdyBuZXcgQigidGhlIG51bWJlciBvZiBjb29yZGluYXRlcyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMiBhbmQgYXQgbGVhc3QgMiIpO2xldCBvPXQubGVuZ3RoO2gobik/bi5sZW5ndGg9by8yOm49bmV3IEFycmF5KG8vMik7Zm9yKGxldCByPTA7cjxvO3IrPTIpe2xldCBpPXRbcl0scz10W3IrMV0sZj1yLzI7bltmXT1idC5mcm9tUmFkaWFucyhpLHMsMCxlLG5bZl0pfXJldHVybiBufTtidC5mcm9tRGVncmVlc0FycmF5SGVpZ2h0cz1mdW5jdGlvbih0LGUsbil7aWYoeS5kZWZpbmVkKCJjb29yZGluYXRlcyIsdCksdC5sZW5ndGg8M3x8dC5sZW5ndGglMyE9PTApdGhyb3cgbmV3IEIoInRoZSBudW1iZXIgb2YgY29vcmRpbmF0ZXMgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDMgYW5kIGF0IGxlYXN0IDMiKTtsZXQgbz10Lmxlbmd0aDtoKG4pP24ubGVuZ3RoPW8vMzpuPW5ldyBBcnJheShvLzMpO2ZvcihsZXQgcj0wO3I8bztyKz0zKXtsZXQgaT10W3JdLHM9dFtyKzFdLGY9dFtyKzJdLHU9ci8zO25bdV09YnQuZnJvbURlZ3JlZXMoaSxzLGYsZSxuW3VdKX1yZXR1cm4gbn07YnQuZnJvbVJhZGlhbnNBcnJheUhlaWdodHM9ZnVuY3Rpb24odCxlLG4pe2lmKHkuZGVmaW5lZCgiY29vcmRpbmF0ZXMiLHQpLHQubGVuZ3RoPDN8fHQubGVuZ3RoJTMhPT0wKXRocm93IG5ldyBCKCJ0aGUgbnVtYmVyIG9mIGNvb3JkaW5hdGVzIG11c3QgYmUgYSBtdWx0aXBsZSBvZiAzIGFuZCBhdCBsZWFzdCAzIik7bGV0IG89dC5sZW5ndGg7aChuKT9uLmxlbmd0aD1vLzM6bj1uZXcgQXJyYXkoby8zKTtmb3IobGV0IHI9MDtyPG87cis9Myl7bGV0IGk9dFtyXSxzPXRbcisxXSxmPXRbcisyXSx1PXIvMztuW3VdPWJ0LmZyb21SYWRpYW5zKGkscyxmLGUsblt1XSl9cmV0dXJuIG59O2J0LlpFUk89T2JqZWN0LmZyZWV6ZShuZXcgYnQoMCwwLDApKTtidC5PTkU9T2JqZWN0LmZyZWV6ZShuZXcgYnQoMSwxLDEpKTtidC5VTklUX1g9T2JqZWN0LmZyZWV6ZShuZXcgYnQoMSwwLDApKTtidC5VTklUX1k9T2JqZWN0LmZyZWV6ZShuZXcgYnQoMCwxLDApKTtidC5VTklUX1o9T2JqZWN0LmZyZWV6ZShuZXcgYnQoMCwwLDEpKTtidC5wcm90b3R5cGUuY2xvbmU9ZnVuY3Rpb24odCl7cmV0dXJuIGJ0LmNsb25lKHRoaXMsdCl9O2J0LnByb3RvdHlwZS5lcXVhbHM9ZnVuY3Rpb24odCl7cmV0dXJuIGJ0LmVxdWFscyh0aGlzLHQpfTtidC5wcm90b3R5cGUuZXF1YWxzRXBzaWxvbj1mdW5jdGlvbih0LGUsbil7cmV0dXJuIGJ0LmVxdWFsc0Vwc2lsb24odGhpcyx0LGUsbil9O2J0LnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybmAoJHt0aGlzLnh9LCAke3RoaXMueX0sICR7dGhpcy56fSlgfTthPWJ0fSk7ZnVuY3Rpb24gaUModCxlLG4sbyxyKXtpZighaCh0KSl0aHJvdyBuZXcgQigiY2FydGVzaWFuIGlzIHJlcXVpcmVkLiIpO2lmKCFoKGUpKXRocm93IG5ldyBCKCJvbmVPdmVyUmFkaWkgaXMgcmVxdWlyZWQuIik7aWYoIWgobikpdGhyb3cgbmV3IEIoIm9uZU92ZXJSYWRpaVNxdWFyZWQgaXMgcmVxdWlyZWQuIik7aWYoIWgobykpdGhyb3cgbmV3IEIoImNlbnRlclRvbGVyYW5jZVNxdWFyZWQgaXMgcmVxdWlyZWQuIik7bGV0IGk9dC54LHM9dC55LGY9dC56LHU9ZS54LGM9ZS55LGw9ZS56LHA9aSppKnUqdSxkPXMqcypjKmMsbT1mKmYqbCpsLF89cCtkK20sZz1NYXRoLnNxcnQoMS9fKSxiPWEubXVsdGlwbHlCeVNjYWxhcih0LGcsb0MpO2lmKF88bylyZXR1cm4gaXNGaW5pdGUoZyk/YS5jbG9uZShiLHIpOnZvaWQgMDtsZXQgVD1uLngsTz1uLnksRT1uLnosdz1yQzt3Lng9Yi54KlQqMix3Lnk9Yi55Kk8qMix3Lno9Yi56KkUqMjtsZXQgQz0oMS1nKSphLm1hZ25pdHVkZSh0KS8oLjUqYS5tYWduaXR1ZGUodykpLE49MCxJLEQsdixMLFUsQSxTLFAsRixqLEg7ZG97Qy09Tix2PTEvKDErQypUKSxMPTEvKDErQypPKSxVPTEvKDErQypFKSxBPXYqdixTPUwqTCxQPVUqVSxGPUEqdixqPVMqTCxIPVAqVSxJPXAqQStkKlMrbSpQLTEsRD1wKkYqVCtkKmoqTyttKkgqRTtsZXQgaz0tMipEO049SS9rfXdoaWxlKE1hdGguYWJzKEkpPk0uRVBTSUxPTjEyKTtyZXR1cm4gaChyKT8oci54PWkqdixyLnk9cypMLHIuej1mKlUscik6bmV3IGEoaSp2LHMqTCxmKlUpfXZhciBvQyxyQyxHbCxSbT1aKCgpPT57RnQoKTtmdCgpO0h0KCk7V3QoKTtvQz1uZXcgYSxyQz1uZXcgYTtHbD1pQ30pO2Z1bmN0aW9uIF9uKHQsZSxuKXt0aGlzLmxvbmdpdHVkZT14KHQsMCksdGhpcy5sYXRpdHVkZT14KGUsMCksdGhpcy5oZWlnaHQ9eChuLDApfXZhciBzQyxjQyxhQyxjdCxJZT1aKCgpPT57RnQoKTtYdCgpO0l0KCk7ZnQoKTtXdCgpO1JtKCk7X24uZnJvbVJhZGlhbnM9ZnVuY3Rpb24odCxlLG4sbyl7cmV0dXJuIHkudHlwZU9mLm51bWJlcigibG9uZ2l0dWRlIix0KSx5LnR5cGVPZi5udW1iZXIoImxhdGl0dWRlIixlKSxuPXgobiwwKSxoKG8pPyhvLmxvbmdpdHVkZT10LG8ubGF0aXR1ZGU9ZSxvLmhlaWdodD1uLG8pOm5ldyBfbih0LGUsbil9O19uLmZyb21EZWdyZWVzPWZ1bmN0aW9uKHQsZSxuLG8pe3JldHVybiB5LnR5cGVPZi5udW1iZXIoImxvbmdpdHVkZSIsdCkseS50eXBlT2YubnVtYmVyKCJsYXRpdHVkZSIsZSksdD1NLnRvUmFkaWFucyh0KSxlPU0udG9SYWRpYW5zKGUpLF9uLmZyb21SYWRpYW5zKHQsZSxuLG8pfTtzQz1uZXcgYSxjQz1uZXcgYSxhQz1uZXcgYTtfbi5fZWxsaXBzb2lkT25lT3ZlclJhZGlpPW5ldyBhKDEvNjM3ODEzNywxLzYzNzgxMzcsMS82MzU2NzUyMzE0MjQ1MTc5ZS05KTtfbi5fZWxsaXBzb2lkT25lT3ZlclJhZGlpU3F1YXJlZD1uZXcgYSgxLyg2Mzc4MTM3KjYzNzgxMzcpLDEvKDYzNzgxMzcqNjM3ODEzNyksMS8oNjM1Njc1MjMxNDI0NTE3OWUtOSo2MzU2NzUyMzE0MjQ1MTc5ZS05KSk7X24uX2VsbGlwc29pZENlbnRlclRvbGVyYW5jZVNxdWFyZWQ9TS5FUFNJTE9OMTtfbi5mcm9tQ2FydGVzaWFuPWZ1bmN0aW9uKHQsZSxuKXtsZXQgbz1oKGUpP2Uub25lT3ZlclJhZGlpOl9uLl9lbGxpcHNvaWRPbmVPdmVyUmFkaWkscj1oKGUpP2Uub25lT3ZlclJhZGlpU3F1YXJlZDpfbi5fZWxsaXBzb2lkT25lT3ZlclJhZGlpU3F1YXJlZCxpPWgoZSk/ZS5fY2VudGVyVG9sZXJhbmNlU3F1YXJlZDpfbi5fZWxsaXBzb2lkQ2VudGVyVG9sZXJhbmNlU3F1YXJlZCxzPUdsKHQsbyxyLGksY0MpO2lmKCFoKHMpKXJldHVybjtsZXQgZj1hLm11bHRpcGx5Q29tcG9uZW50cyhzLHIsc0MpO2Y9YS5ub3JtYWxpemUoZixmKTtsZXQgdT1hLnN1YnRyYWN0KHQscyxhQyksYz1NYXRoLmF0YW4yKGYueSxmLngpLGw9TWF0aC5hc2luKGYueikscD1NLnNpZ24oYS5kb3QodSx0KSkqYS5tYWduaXR1ZGUodSk7cmV0dXJuIGgobik/KG4ubG9uZ2l0dWRlPWMsbi5sYXRpdHVkZT1sLG4uaGVpZ2h0PXAsbik6bmV3IF9uKGMsbCxwKX07X24udG9DYXJ0ZXNpYW49ZnVuY3Rpb24odCxlLG4pe3JldHVybiB5LmRlZmluZWQoImNhcnRvZ3JhcGhpYyIsdCksYS5mcm9tUmFkaWFucyh0LmxvbmdpdHVkZSx0LmxhdGl0dWRlLHQuaGVpZ2h0LGUsbil9O19uLmNsb25lPWZ1bmN0aW9uKHQsZSl7aWYoaCh0KSlyZXR1cm4gaChlKT8oZS5sb25naXR1ZGU9dC5sb25naXR1ZGUsZS5sYXRpdHVkZT10LmxhdGl0dWRlLGUuaGVpZ2h0PXQuaGVpZ2h0LGUpOm5ldyBfbih0LmxvbmdpdHVkZSx0LmxhdGl0dWRlLHQuaGVpZ2h0KX07X24uZXF1YWxzPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQ9PT1lfHxoKHQpJiZoKGUpJiZ0LmxvbmdpdHVkZT09PWUubG9uZ2l0dWRlJiZ0LmxhdGl0dWRlPT09ZS5sYXRpdHVkZSYmdC5oZWlnaHQ9PT1lLmhlaWdodH07X24uZXF1YWxzRXBzaWxvbj1mdW5jdGlvbih0LGUsbil7cmV0dXJuIG49eChuLDApLHQ9PT1lfHxoKHQpJiZoKGUpJiZNYXRoLmFicyh0LmxvbmdpdHVkZS1lLmxvbmdpdHVkZSk8PW4mJk1hdGguYWJzKHQubGF0aXR1ZGUtZS5sYXRpdHVkZSk8PW4mJk1hdGguYWJzKHQuaGVpZ2h0LWUuaGVpZ2h0KTw9bn07X24uWkVSTz1PYmplY3QuZnJlZXplKG5ldyBfbigwLDAsMCkpO19uLnByb3RvdHlwZS5jbG9uZT1mdW5jdGlvbih0KXtyZXR1cm4gX24uY2xvbmUodGhpcyx0KX07X24ucHJvdG90eXBlLmVxdWFscz1mdW5jdGlvbih0KXtyZXR1cm4gX24uZXF1YWxzKHRoaXMsdCl9O19uLnByb3RvdHlwZS5lcXVhbHNFcHNpbG9uPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIF9uLmVxdWFsc0Vwc2lsb24odGhpcyx0LGUpfTtfbi5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm5gKCR7dGhpcy5sb25naXR1ZGV9LCAke3RoaXMubGF0aXR1ZGV9LCAke3RoaXMuaGVpZ2h0fSlgfTtjdD1fbn0pO2Z1bmN0aW9uIGp0KHQsZSl7dGhpcy54PXgodCwwKSx0aGlzLnk9eChlLDApfXZhciB6bCxBMSxiMSxUMSxmQyx0dCxVZT1aKCgpPT57WHQoKTtJdCgpO2Z0KCk7SHQoKTtXdCgpO2p0LmZyb21FbGVtZW50cz1mdW5jdGlvbih0LGUsbil7cmV0dXJuIGgobik/KG4ueD10LG4ueT1lLG4pOm5ldyBqdCh0LGUpfTtqdC5jbG9uZT1mdW5jdGlvbih0LGUpe2lmKGgodCkpcmV0dXJuIGgoZSk/KGUueD10LngsZS55PXQueSxlKTpuZXcganQodC54LHQueSl9O2p0LmZyb21DYXJ0ZXNpYW4zPWp0LmNsb25lO2p0LmZyb21DYXJ0ZXNpYW40PWp0LmNsb25lO2p0LnBhY2tlZExlbmd0aD0yO2p0LnBhY2s9ZnVuY3Rpb24odCxlLG4pe3JldHVybiB5LnR5cGVPZi5vYmplY3QoInZhbHVlIix0KSx5LmRlZmluZWQoImFycmF5IixlKSxuPXgobiwwKSxlW24rK109dC54LGVbbl09dC55LGV9O2p0LnVucGFjaz1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHkuZGVmaW5lZCgiYXJyYXkiLHQpLGU9eChlLDApLGgobil8fChuPW5ldyBqdCksbi54PXRbZSsrXSxuLnk9dFtlXSxufTtqdC5wYWNrQXJyYXk9ZnVuY3Rpb24odCxlKXt5LmRlZmluZWQoImFycmF5Iix0KTtsZXQgbj10Lmxlbmd0aCxvPW4qMjtpZighaChlKSllPW5ldyBBcnJheShvKTtlbHNle2lmKCFBcnJheS5pc0FycmF5KGUpJiZlLmxlbmd0aCE9PW8pdGhyb3cgbmV3IEIoIklmIHJlc3VsdCBpcyBhIHR5cGVkIGFycmF5LCBpdCBtdXN0IGhhdmUgZXhhY3RseSBhcnJheS5sZW5ndGggKiAyIGVsZW1lbnRzIik7ZS5sZW5ndGghPT1vJiYoZS5sZW5ndGg9byl9Zm9yKGxldCByPTA7cjxuOysrcilqdC5wYWNrKHRbcl0sZSxyKjIpO3JldHVybiBlfTtqdC51bnBhY2tBcnJheT1mdW5jdGlvbih0LGUpe2lmKHkuZGVmaW5lZCgiYXJyYXkiLHQpLHkudHlwZU9mLm51bWJlci5ncmVhdGVyVGhhbk9yRXF1YWxzKCJhcnJheS5sZW5ndGgiLHQubGVuZ3RoLDIpLHQubGVuZ3RoJTIhPT0wKXRocm93IG5ldyBCKCJhcnJheSBsZW5ndGggbXVzdCBiZSBhIG11bHRpcGxlIG9mIDIuIik7bGV0IG49dC5sZW5ndGg7aChlKT9lLmxlbmd0aD1uLzI6ZT1uZXcgQXJyYXkobi8yKTtmb3IobGV0IG89MDtvPG47bys9Mil7bGV0IHI9by8yO2Vbcl09anQudW5wYWNrKHQsbyxlW3JdKX1yZXR1cm4gZX07anQuZnJvbUFycmF5PWp0LnVucGFjaztqdC5tYXhpbXVtQ29tcG9uZW50PWZ1bmN0aW9uKHQpe3JldHVybiB5LnR5cGVPZi5vYmplY3QoImNhcnRlc2lhbiIsdCksTWF0aC5tYXgodC54LHQueSl9O2p0Lm1pbmltdW1Db21wb25lbnQ9ZnVuY3Rpb24odCl7cmV0dXJuIHkudHlwZU9mLm9iamVjdCgiY2FydGVzaWFuIix0KSxNYXRoLm1pbih0LngsdC55KX07anQubWluaW11bUJ5Q29tcG9uZW50PWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4geS50eXBlT2Yub2JqZWN0KCJmaXJzdCIsdCkseS50eXBlT2Yub2JqZWN0KCJzZWNvbmQiLGUpLHkudHlwZU9mLm9iamVjdCgicmVzdWx0IixuKSxuLng9TWF0aC5taW4odC54LGUueCksbi55PU1hdGgubWluKHQueSxlLnkpLG59O2p0Lm1heGltdW1CeUNvbXBvbmVudD1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHkudHlwZU9mLm9iamVjdCgiZmlyc3QiLHQpLHkudHlwZU9mLm9iamVjdCgic2Vjb25kIixlKSx5LnR5cGVPZi5vYmplY3QoInJlc3VsdCIsbiksbi54PU1hdGgubWF4KHQueCxlLngpLG4ueT1NYXRoLm1heCh0LnksZS55KSxufTtqdC5jbGFtcD1mdW5jdGlvbih0LGUsbixvKXt5LnR5cGVPZi5vYmplY3QoInZhbHVlIix0KSx5LnR5cGVPZi5vYmplY3QoIm1pbiIsZSkseS50eXBlT2Yub2JqZWN0KCJtYXgiLG4pLHkudHlwZU9mLm9iamVjdCgicmVzdWx0IixvKTtsZXQgcj1NLmNsYW1wKHQueCxlLngsbi54KSxpPU0uY2xhbXAodC55LGUueSxuLnkpO3JldHVybiBvLng9cixvLnk9aSxvfTtqdC5tYWduaXR1ZGVTcXVhcmVkPWZ1bmN0aW9uKHQpe3JldHVybiB5LnR5cGVPZi5vYmplY3QoImNhcnRlc2lhbiIsdCksdC54KnQueCt0LnkqdC55fTtqdC5tYWduaXR1ZGU9ZnVuY3Rpb24odCl7cmV0dXJuIE1hdGguc3FydChqdC5tYWduaXR1ZGVTcXVhcmVkKHQpKX07emw9bmV3IGp0O2p0LmRpc3RhbmNlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHkudHlwZU9mLm9iamVjdCgibGVmdCIsdCkseS50eXBlT2Yub2JqZWN0KCJyaWdodCIsZSksanQuc3VidHJhY3QodCxlLHpsKSxqdC5tYWduaXR1ZGUoemwpfTtqdC5kaXN0YW5jZVNxdWFyZWQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4geS50eXBlT2Yub2JqZWN0KCJsZWZ0Iix0KSx5LnR5cGVPZi5vYmplY3QoInJpZ2h0IixlKSxqdC5zdWJ0cmFjdCh0LGUsemwpLGp0Lm1hZ25pdHVkZVNxdWFyZWQoemwpfTtqdC5ub3JtYWxpemU9ZnVuY3Rpb24odCxlKXt5LnR5cGVPZi5vYmplY3QoImNhcnRlc2lhbiIsdCkseS50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLGUpO2xldCBuPWp0Lm1hZ25pdHVkZSh0KTtpZihlLng9dC54L24sZS55PXQueS9uLGlzTmFOKGUueCl8fGlzTmFOKGUueSkpdGhyb3cgbmV3IEIoIm5vcm1hbGl6ZWQgcmVzdWx0IGlzIG5vdCBhIG51bWJlciIpO3JldHVybiBlfTtqdC5kb3Q9ZnVuY3Rpb24odCxlKXtyZXR1cm4geS50eXBlT2Yub2JqZWN0KCJsZWZ0Iix0KSx5LnR5cGVPZi5vYmplY3QoInJpZ2h0IixlKSx0LngqZS54K3QueSplLnl9O2p0LmNyb3NzPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHkudHlwZU9mLm9iamVjdCgibGVmdCIsdCkseS50eXBlT2Yub2JqZWN0KCJyaWdodCIsZSksdC54KmUueS10LnkqZS54fTtqdC5tdWx0aXBseUNvbXBvbmVudHM9ZnVuY3Rpb24odCxlLG4pe3JldHVybiB5LnR5cGVPZi5vYmplY3QoImxlZnQiLHQpLHkudHlwZU9mLm9iamVjdCgicmlnaHQiLGUpLHkudHlwZU9mLm9iamVjdCgicmVzdWx0IixuKSxuLng9dC54KmUueCxuLnk9dC55KmUueSxufTtqdC5kaXZpZGVDb21wb25lbnRzPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4geS50eXBlT2Yub2JqZWN0KCJsZWZ0Iix0KSx5LnR5cGVPZi5vYmplY3QoInJpZ2h0IixlKSx5LnR5cGVPZi5vYmplY3QoInJlc3VsdCIsbiksbi54PXQueC9lLngsbi55PXQueS9lLnksbn07anQuYWRkPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4geS50eXBlT2Yub2JqZWN0KCJsZWZ0Iix0KSx5LnR5cGVPZi5vYmplY3QoInJpZ2h0IixlKSx5LnR5cGVPZi5vYmplY3QoInJlc3VsdCIsbiksbi54PXQueCtlLngsbi55PXQueStlLnksbn07anQuc3VidHJhY3Q9ZnVuY3Rpb24odCxlLG4pe3JldHVybiB5LnR5cGVPZi5vYmplY3QoImxlZnQiLHQpLHkudHlwZU9mLm9iamVjdCgicmlnaHQiLGUpLHkudHlwZU9mLm9iamVjdCgicmVzdWx0IixuKSxuLng9dC54LWUueCxuLnk9dC55LWUueSxufTtqdC5tdWx0aXBseUJ5U2NhbGFyPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4geS50eXBlT2Yub2JqZWN0KCJjYXJ0ZXNpYW4iLHQpLHkudHlwZU9mLm51bWJlcigic2NhbGFyIixlKSx5LnR5cGVPZi5vYmplY3QoInJlc3VsdCIsbiksbi54PXQueCplLG4ueT10LnkqZSxufTtqdC5kaXZpZGVCeVNjYWxhcj1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHkudHlwZU9mLm9iamVjdCgiY2FydGVzaWFuIix0KSx5LnR5cGVPZi5udW1iZXIoInNjYWxhciIsZSkseS50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLG4pLG4ueD10LngvZSxuLnk9dC55L2Usbn07anQubmVnYXRlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHkudHlwZU9mLm9iamVjdCgiY2FydGVzaWFuIix0KSx5LnR5cGVPZi5vYmplY3QoInJlc3VsdCIsZSksZS54PS10LngsZS55PS10LnksZX07anQuYWJzPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHkudHlwZU9mLm9iamVjdCgiY2FydGVzaWFuIix0KSx5LnR5cGVPZi5vYmplY3QoInJlc3VsdCIsZSksZS54PU1hdGguYWJzKHQueCksZS55PU1hdGguYWJzKHQueSksZX07QTE9bmV3IGp0O2p0LmxlcnA9ZnVuY3Rpb24odCxlLG4sbyl7cmV0dXJuIHkudHlwZU9mLm9iamVjdCgic3RhcnQiLHQpLHkudHlwZU9mLm9iamVjdCgiZW5kIixlKSx5LnR5cGVPZi5udW1iZXIoInQiLG4pLHkudHlwZU9mLm9iamVjdCgicmVzdWx0IixvKSxqdC5tdWx0aXBseUJ5U2NhbGFyKGUsbixBMSksbz1qdC5tdWx0aXBseUJ5U2NhbGFyKHQsMS1uLG8pLGp0LmFkZChBMSxvLG8pfTtiMT1uZXcganQsVDE9bmV3IGp0O2p0LmFuZ2xlQmV0d2Vlbj1mdW5jdGlvbih0LGUpe3JldHVybiB5LnR5cGVPZi5vYmplY3QoImxlZnQiLHQpLHkudHlwZU9mLm9iamVjdCgicmlnaHQiLGUpLGp0Lm5vcm1hbGl6ZSh0LGIxKSxqdC5ub3JtYWxpemUoZSxUMSksTS5hY29zQ2xhbXBlZChqdC5kb3QoYjEsVDEpKX07ZkM9bmV3IGp0O2p0Lm1vc3RPcnRob2dvbmFsQXhpcz1mdW5jdGlvbih0LGUpe3kudHlwZU9mLm9iamVjdCgiY2FydGVzaWFuIix0KSx5LnR5cGVPZi5vYmplY3QoInJlc3VsdCIsZSk7bGV0IG49anQubm9ybWFsaXplKHQsZkMpO3JldHVybiBqdC5hYnMobixuKSxuLng8PW4ueT9lPWp0LmNsb25lKGp0LlVOSVRfWCxlKTplPWp0LmNsb25lKGp0LlVOSVRfWSxlKSxlfTtqdC5lcXVhbHM9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdD09PWV8fGgodCkmJmgoZSkmJnQueD09PWUueCYmdC55PT09ZS55fTtqdC5lcXVhbHNBcnJheT1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHQueD09PWVbbl0mJnQueT09PWVbbisxXX07anQuZXF1YWxzRXBzaWxvbj1mdW5jdGlvbih0LGUsbixvKXtyZXR1cm4gdD09PWV8fGgodCkmJmgoZSkmJk0uZXF1YWxzRXBzaWxvbih0LngsZS54LG4sbykmJk0uZXF1YWxzRXBzaWxvbih0LnksZS55LG4sbyl9O2p0LlpFUk89T2JqZWN0LmZyZWV6ZShuZXcganQoMCwwKSk7anQuT05FPU9iamVjdC5mcmVlemUobmV3IGp0KDEsMSkpO2p0LlVOSVRfWD1PYmplY3QuZnJlZXplKG5ldyBqdCgxLDApKTtqdC5VTklUX1k9T2JqZWN0LmZyZWV6ZShuZXcganQoMCwxKSk7anQucHJvdG90eXBlLmNsb25lPWZ1bmN0aW9uKHQpe3JldHVybiBqdC5jbG9uZSh0aGlzLHQpfTtqdC5wcm90b3R5cGUuZXF1YWxzPWZ1bmN0aW9uKHQpe3JldHVybiBqdC5lcXVhbHModGhpcyx0KX07anQucHJvdG90eXBlLmVxdWFsc0Vwc2lsb249ZnVuY3Rpb24odCxlLG4pe3JldHVybiBqdC5lcXVhbHNFcHNpbG9uKHRoaXMsdCxlLG4pfTtqdC5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm5gKCR7dGhpcy54fSwgJHt0aGlzLnl9KWB9O3R0PWp0fSk7ZnVuY3Rpb24gTzEodCxlLG4sbyl7ZT14KGUsMCksbj14KG4sMCksbz14KG8sMCkseS50eXBlT2YubnVtYmVyLmdyZWF0ZXJUaGFuT3JFcXVhbHMoIngiLGUsMCkseS50eXBlT2YubnVtYmVyLmdyZWF0ZXJUaGFuT3JFcXVhbHMoInkiLG4sMCkseS50eXBlT2YubnVtYmVyLmdyZWF0ZXJUaGFuT3JFcXVhbHMoInoiLG8sMCksdC5fcmFkaWk9bmV3IGEoZSxuLG8pLHQuX3JhZGlpU3F1YXJlZD1uZXcgYShlKmUsbipuLG8qbyksdC5fcmFkaWlUb1RoZUZvdXJ0aD1uZXcgYShlKmUqZSplLG4qbipuKm4sbypvKm8qbyksdC5fb25lT3ZlclJhZGlpPW5ldyBhKGU9PT0wPzA6MS9lLG49PT0wPzA6MS9uLG89PT0wPzA6MS9vKSx0Ll9vbmVPdmVyUmFkaWlTcXVhcmVkPW5ldyBhKGU9PT0wPzA6MS8oZSplKSxuPT09MD8wOjEvKG4qbiksbz09PTA/MDoxLyhvKm8pKSx0Ll9taW5pbXVtUmFkaXVzPU1hdGgubWluKGUsbixvKSx0Ll9tYXhpbXVtUmFkaXVzPU1hdGgubWF4KGUsbixvKSx0Ll9jZW50ZXJUb2xlcmFuY2VTcXVhcmVkPU0uRVBTSUxPTjEsdC5fcmFkaWlTcXVhcmVkLnohPT0wJiYodC5fc3F1YXJlZFhPdmVyU3F1YXJlZFo9dC5fcmFkaWlTcXVhcmVkLngvdC5fcmFkaWlTcXVhcmVkLnopfWZ1bmN0aW9uIHhlKHQsZSxuKXt0aGlzLl9yYWRpaT12b2lkIDAsdGhpcy5fcmFkaWlTcXVhcmVkPXZvaWQgMCx0aGlzLl9yYWRpaVRvVGhlRm91cnRoPXZvaWQgMCx0aGlzLl9vbmVPdmVyUmFkaWk9dm9pZCAwLHRoaXMuX29uZU92ZXJSYWRpaVNxdWFyZWQ9dm9pZCAwLHRoaXMuX21pbmltdW1SYWRpdXM9dm9pZCAwLHRoaXMuX21heGltdW1SYWRpdXM9dm9pZCAwLHRoaXMuX2NlbnRlclRvbGVyYW5jZVNxdWFyZWQ9dm9pZCAwLHRoaXMuX3NxdWFyZWRYT3ZlclNxdWFyZWRaPXZvaWQgMCxPMSh0aGlzLHQsZSxuKX1mdW5jdGlvbiB3MSh0LGUsbil7eS50eXBlT2YubnVtYmVyKCJhIix0KSx5LnR5cGVPZi5udW1iZXIoImIiLGUpLHkudHlwZU9mLmZ1bmMoImZ1bmMiLG4pO2xldCBvPS41KihlK3QpLHI9LjUqKGUtdCksaT0wO2ZvcihsZXQgcz0wO3M8NTtzKyspe2xldCBmPXIqX0Nbc107aSs9eUNbc10qKG4obytmKStuKG8tZikpfXJldHVybiBpKj1yLGl9dmFyIHVDLGxDLHBDLGRDLG1DLGhDLF9DLHlDLCQsWnQ9WigoKT0+e1VlKCk7RnQoKTtJZSgpO1h0KCk7SXQoKTtmdCgpO0h0KCk7V3QoKTtSbSgpO09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHhlLnByb3RvdHlwZSx7cmFkaWk6e2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9yYWRpaX19LHJhZGlpU3F1YXJlZDp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3JhZGlpU3F1YXJlZH19LHJhZGlpVG9UaGVGb3VydGg6e2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9yYWRpaVRvVGhlRm91cnRofX0sb25lT3ZlclJhZGlpOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fb25lT3ZlclJhZGlpfX0sb25lT3ZlclJhZGlpU3F1YXJlZDp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX29uZU92ZXJSYWRpaVNxdWFyZWR9fSxtaW5pbXVtUmFkaXVzOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbWluaW11bVJhZGl1c319LG1heGltdW1SYWRpdXM6e2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9tYXhpbXVtUmFkaXVzfX19KTt4ZS5jbG9uZT1mdW5jdGlvbih0LGUpe2lmKCFoKHQpKXJldHVybjtsZXQgbj10Ll9yYWRpaTtyZXR1cm4gaChlKT8oYS5jbG9uZShuLGUuX3JhZGlpKSxhLmNsb25lKHQuX3JhZGlpU3F1YXJlZCxlLl9yYWRpaVNxdWFyZWQpLGEuY2xvbmUodC5fcmFkaWlUb1RoZUZvdXJ0aCxlLl9yYWRpaVRvVGhlRm91cnRoKSxhLmNsb25lKHQuX29uZU92ZXJSYWRpaSxlLl9vbmVPdmVyUmFkaWkpLGEuY2xvbmUodC5fb25lT3ZlclJhZGlpU3F1YXJlZCxlLl9vbmVPdmVyUmFkaWlTcXVhcmVkKSxlLl9taW5pbXVtUmFkaXVzPXQuX21pbmltdW1SYWRpdXMsZS5fbWF4aW11bVJhZGl1cz10Ll9tYXhpbXVtUmFkaXVzLGUuX2NlbnRlclRvbGVyYW5jZVNxdWFyZWQ9dC5fY2VudGVyVG9sZXJhbmNlU3F1YXJlZCxlKTpuZXcgeGUobi54LG4ueSxuLnopfTt4ZS5mcm9tQ2FydGVzaWFuMz1mdW5jdGlvbih0LGUpe3JldHVybiBoKGUpfHwoZT1uZXcgeGUpLGgodCkmJk8xKGUsdC54LHQueSx0LnopLGV9O3hlLldHUzg0PU9iamVjdC5mcmVlemUobmV3IHhlKDYzNzgxMzcsNjM3ODEzNyw2MzU2NzUyMzE0MjQ1MTc5ZS05KSk7eGUuVU5JVF9TUEhFUkU9T2JqZWN0LmZyZWV6ZShuZXcgeGUoMSwxLDEpKTt4ZS5NT09OPU9iamVjdC5mcmVlemUobmV3IHhlKE0uTFVOQVJfUkFESVVTLE0uTFVOQVJfUkFESVVTLE0uTFVOQVJfUkFESVVTKSk7eGUuX2RlZmF1bHQ9eGUuV0dTODQ7T2JqZWN0LmRlZmluZVByb3BlcnRpZXMoeGUse2RlZmF1bHQ6e2dldDpmdW5jdGlvbigpe3JldHVybiB4ZS5fZGVmYXVsdH0sc2V0OmZ1bmN0aW9uKHQpe3kudHlwZU9mLm9iamVjdCgidmFsdWUiLHQpLHhlLl9kZWZhdWx0PXQsYS5fZWxsaXBzb2lkUmFkaWlTcXVhcmVkPXQucmFkaWlTcXVhcmVkLGN0Ll9lbGxpcHNvaWRPbmVPdmVyUmFkaWk9dC5vbmVPdmVyUmFkaWksY3QuX2VsbGlwc29pZE9uZU92ZXJSYWRpaVNxdWFyZWQ9dC5vbmVPdmVyUmFkaWlTcXVhcmVkLGN0Ll9lbGxpcHNvaWRDZW50ZXJUb2xlcmFuY2VTcXVhcmVkPXQuX2NlbnRlclRvbGVyYW5jZVNxdWFyZWR9fX0pO3hlLnByb3RvdHlwZS5jbG9uZT1mdW5jdGlvbih0KXtyZXR1cm4geGUuY2xvbmUodGhpcyx0KX07eGUucGFja2VkTGVuZ3RoPWEucGFja2VkTGVuZ3RoO3hlLnBhY2s9ZnVuY3Rpb24odCxlLG4pe3JldHVybiB5LnR5cGVPZi5vYmplY3QoInZhbHVlIix0KSx5LmRlZmluZWQoImFycmF5IixlKSxuPXgobiwwKSxhLnBhY2sodC5fcmFkaWksZSxuKSxlfTt4ZS51bnBhY2s9ZnVuY3Rpb24odCxlLG4pe3kuZGVmaW5lZCgiYXJyYXkiLHQpLGU9eChlLDApO2xldCBvPWEudW5wYWNrKHQsZSk7cmV0dXJuIHhlLmZyb21DYXJ0ZXNpYW4zKG8sbil9O3hlLnByb3RvdHlwZS5nZW9jZW50cmljU3VyZmFjZU5vcm1hbD1hLm5vcm1hbGl6ZTt4ZS5wcm90b3R5cGUuZ2VvZGV0aWNTdXJmYWNlTm9ybWFsQ2FydG9ncmFwaGljPWZ1bmN0aW9uKHQsZSl7eS50eXBlT2Yub2JqZWN0KCJjYXJ0b2dyYXBoaWMiLHQpO2xldCBuPXQubG9uZ2l0dWRlLG89dC5sYXRpdHVkZSxyPU1hdGguY29zKG8pLGk9cipNYXRoLmNvcyhuKSxzPXIqTWF0aC5zaW4obiksZj1NYXRoLnNpbihvKTtyZXR1cm4gaChlKXx8KGU9bmV3IGEpLGUueD1pLGUueT1zLGUuej1mLGEubm9ybWFsaXplKGUsZSl9O3hlLnByb3RvdHlwZS5nZW9kZXRpY1N1cmZhY2VOb3JtYWw9ZnVuY3Rpb24odCxlKXtpZih5LnR5cGVPZi5vYmplY3QoImNhcnRlc2lhbiIsdCksaXNOYU4odC54KXx8aXNOYU4odC55KXx8aXNOYU4odC56KSl0aHJvdyBuZXcgQigiY2FydGVzaWFuIGhhcyBhIE5hTiBjb21wb25lbnQiKTtpZighYS5lcXVhbHNFcHNpbG9uKHQsYS5aRVJPLE0uRVBTSUxPTjE0KSlyZXR1cm4gaChlKXx8KGU9bmV3IGEpLGU9YS5tdWx0aXBseUNvbXBvbmVudHModCx0aGlzLl9vbmVPdmVyUmFkaWlTcXVhcmVkLGUpLGEubm9ybWFsaXplKGUsZSl9O3VDPW5ldyBhLGxDPW5ldyBhO3hlLnByb3RvdHlwZS5jYXJ0b2dyYXBoaWNUb0NhcnRlc2lhbj1mdW5jdGlvbih0LGUpe2xldCBuPXVDLG89bEM7dGhpcy5nZW9kZXRpY1N1cmZhY2VOb3JtYWxDYXJ0b2dyYXBoaWModCxuKSxhLm11bHRpcGx5Q29tcG9uZW50cyh0aGlzLl9yYWRpaVNxdWFyZWQsbixvKTtsZXQgcj1NYXRoLnNxcnQoYS5kb3QobixvKSk7cmV0dXJuIGEuZGl2aWRlQnlTY2FsYXIobyxyLG8pLGEubXVsdGlwbHlCeVNjYWxhcihuLHQuaGVpZ2h0LG4pLGgoZSl8fChlPW5ldyBhKSxhLmFkZChvLG4sZSl9O3hlLnByb3RvdHlwZS5jYXJ0b2dyYXBoaWNBcnJheVRvQ2FydGVzaWFuQXJyYXk9ZnVuY3Rpb24odCxlKXt5LmRlZmluZWQoImNhcnRvZ3JhcGhpY3MiLHQpO2xldCBuPXQubGVuZ3RoO2goZSk/ZS5sZW5ndGg9bjplPW5ldyBBcnJheShuKTtmb3IobGV0IG89MDtvPG47bysrKWVbb109dGhpcy5jYXJ0b2dyYXBoaWNUb0NhcnRlc2lhbih0W29dLGVbb10pO3JldHVybiBlfTtwQz1uZXcgYSxkQz1uZXcgYSxtQz1uZXcgYTt4ZS5wcm90b3R5cGUuY2FydGVzaWFuVG9DYXJ0b2dyYXBoaWM9ZnVuY3Rpb24odCxlKXtsZXQgbj10aGlzLnNjYWxlVG9HZW9kZXRpY1N1cmZhY2UodCxkQyk7aWYoIWgobikpcmV0dXJuO2xldCBvPXRoaXMuZ2VvZGV0aWNTdXJmYWNlTm9ybWFsKG4scEMpLHI9YS5zdWJ0cmFjdCh0LG4sbUMpLGk9TWF0aC5hdGFuMihvLnksby54KSxzPU1hdGguYXNpbihvLnopLGY9TS5zaWduKGEuZG90KHIsdCkpKmEubWFnbml0dWRlKHIpO3JldHVybiBoKGUpPyhlLmxvbmdpdHVkZT1pLGUubGF0aXR1ZGU9cyxlLmhlaWdodD1mLGUpOm5ldyBjdChpLHMsZil9O3hlLnByb3RvdHlwZS5jYXJ0ZXNpYW5BcnJheVRvQ2FydG9ncmFwaGljQXJyYXk9ZnVuY3Rpb24odCxlKXt5LmRlZmluZWQoImNhcnRlc2lhbnMiLHQpO2xldCBuPXQubGVuZ3RoO2goZSk/ZS5sZW5ndGg9bjplPW5ldyBBcnJheShuKTtmb3IobGV0IG89MDtvPG47KytvKWVbb109dGhpcy5jYXJ0ZXNpYW5Ub0NhcnRvZ3JhcGhpYyh0W29dLGVbb10pO3JldHVybiBlfTt4ZS5wcm90b3R5cGUuc2NhbGVUb0dlb2RldGljU3VyZmFjZT1mdW5jdGlvbih0LGUpe3JldHVybiBHbCh0LHRoaXMuX29uZU92ZXJSYWRpaSx0aGlzLl9vbmVPdmVyUmFkaWlTcXVhcmVkLHRoaXMuX2NlbnRlclRvbGVyYW5jZVNxdWFyZWQsZSl9O3hlLnByb3RvdHlwZS5zY2FsZVRvR2VvY2VudHJpY1N1cmZhY2U9ZnVuY3Rpb24odCxlKXt5LnR5cGVPZi5vYmplY3QoImNhcnRlc2lhbiIsdCksaChlKXx8KGU9bmV3IGEpO2xldCBuPXQueCxvPXQueSxyPXQueixpPXRoaXMuX29uZU92ZXJSYWRpaVNxdWFyZWQscz0xL01hdGguc3FydChuKm4qaS54K28qbyppLnkrcipyKmkueik7cmV0dXJuIGEubXVsdGlwbHlCeVNjYWxhcih0LHMsZSl9O3hlLnByb3RvdHlwZS50cmFuc2Zvcm1Qb3NpdGlvblRvU2NhbGVkU3BhY2U9ZnVuY3Rpb24odCxlKXtyZXR1cm4gaChlKXx8KGU9bmV3IGEpLGEubXVsdGlwbHlDb21wb25lbnRzKHQsdGhpcy5fb25lT3ZlclJhZGlpLGUpfTt4ZS5wcm90b3R5cGUudHJhbnNmb3JtUG9zaXRpb25Gcm9tU2NhbGVkU3BhY2U9ZnVuY3Rpb24odCxlKXtyZXR1cm4gaChlKXx8KGU9bmV3IGEpLGEubXVsdGlwbHlDb21wb25lbnRzKHQsdGhpcy5fcmFkaWksZSl9O3hlLnByb3RvdHlwZS5lcXVhbHM9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXM9PT10fHxoKHQpJiZhLmVxdWFscyh0aGlzLl9yYWRpaSx0Ll9yYWRpaSl9O3hlLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9yYWRpaS50b1N0cmluZygpfTt4ZS5wcm90b3R5cGUuZ2V0U3VyZmFjZU5vcm1hbEludGVyc2VjdGlvbldpdGhaQXhpcz1mdW5jdGlvbih0LGUsbil7aWYoeS50eXBlT2Yub2JqZWN0KCJwb3NpdGlvbiIsdCksIU0uZXF1YWxzRXBzaWxvbih0aGlzLl9yYWRpaS54LHRoaXMuX3JhZGlpLnksTS5FUFNJTE9OMTUpKXRocm93IG5ldyBCKCJFbGxpcHNvaWQgbXVzdCBiZSBhbiBlbGxpcHNvaWQgb2YgcmV2b2x1dGlvbiAocmFkaWkueCA9PSByYWRpaS55KSIpO3kudHlwZU9mLm51bWJlci5ncmVhdGVyVGhhbigiRWxsaXBzb2lkLnJhZGlpLnoiLHRoaXMuX3JhZGlpLnosMCksZT14KGUsMCk7bGV0IG89dGhpcy5fc3F1YXJlZFhPdmVyU3F1YXJlZFo7aWYoaChuKXx8KG49bmV3IGEpLG4ueD0wLG4ueT0wLG4uej10LnoqKDEtbyksIShNYXRoLmFicyhuLnopPj10aGlzLl9yYWRpaS56LWUpKXJldHVybiBufTtoQz1uZXcgYTt4ZS5wcm90b3R5cGUuZ2V0TG9jYWxDdXJ2YXR1cmU9ZnVuY3Rpb24odCxlKXt5LnR5cGVPZi5vYmplY3QoInN1cmZhY2VQb3NpdGlvbiIsdCksaChlKXx8KGU9bmV3IHR0KTtsZXQgbj10aGlzLmdldFN1cmZhY2VOb3JtYWxJbnRlcnNlY3Rpb25XaXRoWkF4aXModCwwLGhDKSxvPWEuZGlzdGFuY2UodCxuKSxyPXRoaXMubWluaW11bVJhZGl1cypvL3RoaXMubWF4aW11bVJhZGl1cyoqMixpPW8qcioqMjtyZXR1cm4gdHQuZnJvbUVsZW1lbnRzKDEvbywxL2ksZSl9O19DPVsuMTQ4ODc0MzM4OTgxNjMsLjQzMzM5NTM5NDEyOTI1LC42Nzk0MDk1NjgyOTkwMiwuODY1MDYzMzY2Njg4OTgsLjk3MzkwNjUyODUxNzE3LDBdLHlDPVsuMjk1NTI0MjI0NzE0NzUsLjI2OTI2NjcxOTMwOTk5LC4yMTkwODYzNjI1MTU5OCwuMTQ5NDUxMzQ5MTUwNTgsLjA2NjY3MTM0NDMwODY4NCwwXTt4ZS5wcm90b3R5cGUuc3VyZmFjZUFyZWE9ZnVuY3Rpb24odCl7eS50eXBlT2Yub2JqZWN0KCJyZWN0YW5nbGUiLHQpO2xldCBlPXQud2VzdCxuPXQuZWFzdCxvPXQuc291dGgscj10Lm5vcnRoO2Zvcig7bjxlOyluKz1NLlRXT19QSTtsZXQgaT10aGlzLl9yYWRpaVNxdWFyZWQscz1pLngsZj1pLnksdT1pLnosYz1zKmY7cmV0dXJuIHcxKG8scixmdW5jdGlvbihsKXtsZXQgcD1NYXRoLmNvcyhsKSxkPU1hdGguc2luKGwpO3JldHVybiBNYXRoLmNvcyhsKSp3MShlLG4sZnVuY3Rpb24obSl7bGV0IF89TWF0aC5jb3MobSksZz1NYXRoLnNpbihtKTtyZXR1cm4gTWF0aC5zcXJ0KGMqZCpkK3UqKGYqXypfK3MqZypnKSpwKnApfSl9KX07JD14ZX0pO2Z1bmN0aW9uIGpsKHQpe3RoaXMuX2VsbGlwc29pZD14KHQsJC5kZWZhdWx0KSx0aGlzLl9zZW1pbWFqb3JBeGlzPXRoaXMuX2VsbGlwc29pZC5tYXhpbXVtUmFkaXVzLHRoaXMuX29uZU92ZXJTZW1pbWFqb3JBeGlzPTEvdGhpcy5fc2VtaW1ham9yQXhpc312YXIgSm4sU2k9WigoKT0+e0Z0KCk7SWUoKTtJdCgpO2Z0KCk7SHQoKTtadCgpO09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGpsLnByb3RvdHlwZSx7ZWxsaXBzb2lkOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZWxsaXBzb2lkfX19KTtqbC5wcm90b3R5cGUucHJvamVjdD1mdW5jdGlvbih0LGUpe2xldCBuPXRoaXMuX3NlbWltYWpvckF4aXMsbz10LmxvbmdpdHVkZSpuLHI9dC5sYXRpdHVkZSpuLGk9dC5oZWlnaHQ7cmV0dXJuIGgoZSk/KGUueD1vLGUueT1yLGUuej1pLGUpOm5ldyBhKG8scixpKX07amwucHJvdG90eXBlLnVucHJvamVjdD1mdW5jdGlvbih0LGUpe2lmKCFoKHQpKXRocm93IG5ldyBCKCJjYXJ0ZXNpYW4gaXMgcmVxdWlyZWQiKTtsZXQgbj10aGlzLl9vbmVPdmVyU2VtaW1ham9yQXhpcyxvPXQueCpuLHI9dC55Km4saT10Lno7cmV0dXJuIGgoZSk/KGUubG9uZ2l0dWRlPW8sZS5sYXRpdHVkZT1yLGUuaGVpZ2h0PWksZSk6bmV3IGN0KG8scixpKX07Sm49amx9KTt2YXIgZ0MsU24sa3M9WigoKT0+e2dDPXtPVVRTSURFOi0xLElOVEVSU0VDVElORzowLElOU0lERToxfSxTbj1PYmplY3QuZnJlZXplKGdDKX0pO2Z1bmN0aW9uIEFDKHQsZSl7dGhpcy5zdGFydD14KHQsMCksdGhpcy5zdG9wPXgoZSwwKX12YXIgUXIsSGw9WigoKT0+e0l0KCk7UXI9QUN9KTtmdW5jdGlvbiB3dCh0LGUsbixvLHIsaSxzLGYsdSl7dGhpc1swXT14KHQsMCksdGhpc1sxXT14KG8sMCksdGhpc1syXT14KHMsMCksdGhpc1szXT14KGUsMCksdGhpc1s0XT14KHIsMCksdGhpc1s1XT14KGYsMCksdGhpc1s2XT14KG4sMCksdGhpc1s3XT14KGksMCksdGhpc1s4XT14KHUsMCl9ZnVuY3Rpb24gRUModCl7bGV0IGU9MDtmb3IobGV0IG49MDtuPDk7KytuKXtsZXQgbz10W25dO2UrPW8qb31yZXR1cm4gTWF0aC5zcXJ0KGUpfWZ1bmN0aW9uIFJDKHQpe2xldCBlPTA7Zm9yKGxldCBuPTA7bjwzOysrbil7bGV0IG89dFt3dC5nZXRFbGVtZW50SW5kZXgoeG1bbl0sQ21bbl0pXTtlKz0yKm8qb31yZXR1cm4gTWF0aC5zcXJ0KGUpfWZ1bmN0aW9uIFNDKHQsZSl7bGV0IG49TS5FUFNJTE9OMTUsbz0wLHI9MTtmb3IobGV0IGM9MDtjPDM7KytjKXtsZXQgbD1NYXRoLmFicyh0W3d0LmdldEVsZW1lbnRJbmRleCh4bVtjXSxDbVtjXSldKTtsPm8mJihyPWMsbz1sKX1sZXQgaT0xLHM9MCxmPUNtW3JdLHU9eG1bcl07aWYoTWF0aC5hYnModFt3dC5nZXRFbGVtZW50SW5kZXgodSxmKV0pPm4pe2xldCBjPXRbd3QuZ2V0RWxlbWVudEluZGV4KHUsdSldLGw9dFt3dC5nZXRFbGVtZW50SW5kZXgoZixmKV0scD10W3d0LmdldEVsZW1lbnRJbmRleCh1LGYpXSxkPShjLWwpLzIvcCxtO2Q8MD9tPS0xLygtZCtNYXRoLnNxcnQoMStkKmQpKTptPTEvKGQrTWF0aC5zcXJ0KDErZCpkKSksaT0xL01hdGguc3FydCgxK20qbSkscz1tKml9cmV0dXJuIGU9d3QuY2xvbmUod3QuSURFTlRJVFksZSksZVt3dC5nZXRFbGVtZW50SW5kZXgoZixmKV09ZVt3dC5nZXRFbGVtZW50SW5kZXgodSx1KV09aSxlW3d0LmdldEVsZW1lbnRJbmRleCh1LGYpXT1zLGVbd3QuZ2V0RWxlbWVudEluZGV4KGYsdSldPS1zLGV9dmFyIGJDLFRDLFNtLEUxLHdDLE9DLENtLHhtLHFsLFIxLENDLFEsQm49WigoKT0+e0Z0KCk7WHQoKTtJdCgpO2Z0KCk7SHQoKTtXdCgpO3d0LnBhY2tlZExlbmd0aD05O3d0LnBhY2s9ZnVuY3Rpb24odCxlLG4pe3JldHVybiB5LnR5cGVPZi5vYmplY3QoInZhbHVlIix0KSx5LmRlZmluZWQoImFycmF5IixlKSxuPXgobiwwKSxlW24rK109dFswXSxlW24rK109dFsxXSxlW24rK109dFsyXSxlW24rK109dFszXSxlW24rK109dFs0XSxlW24rK109dFs1XSxlW24rK109dFs2XSxlW24rK109dFs3XSxlW24rK109dFs4XSxlfTt3dC51bnBhY2s9ZnVuY3Rpb24odCxlLG4pe3JldHVybiB5LmRlZmluZWQoImFycmF5Iix0KSxlPXgoZSwwKSxoKG4pfHwobj1uZXcgd3QpLG5bMF09dFtlKytdLG5bMV09dFtlKytdLG5bMl09dFtlKytdLG5bM109dFtlKytdLG5bNF09dFtlKytdLG5bNV09dFtlKytdLG5bNl09dFtlKytdLG5bN109dFtlKytdLG5bOF09dFtlKytdLG59O3d0LnBhY2tBcnJheT1mdW5jdGlvbih0LGUpe3kuZGVmaW5lZCgiYXJyYXkiLHQpO2xldCBuPXQubGVuZ3RoLG89bio5O2lmKCFoKGUpKWU9bmV3IEFycmF5KG8pO2Vsc2V7aWYoIUFycmF5LmlzQXJyYXkoZSkmJmUubGVuZ3RoIT09byl0aHJvdyBuZXcgQigiSWYgcmVzdWx0IGlzIGEgdHlwZWQgYXJyYXksIGl0IG11c3QgaGF2ZSBleGFjdGx5IGFycmF5Lmxlbmd0aCAqIDkgZWxlbWVudHMiKTtlLmxlbmd0aCE9PW8mJihlLmxlbmd0aD1vKX1mb3IobGV0IHI9MDtyPG47KytyKXd0LnBhY2sodFtyXSxlLHIqOSk7cmV0dXJuIGV9O3d0LnVucGFja0FycmF5PWZ1bmN0aW9uKHQsZSl7aWYoeS5kZWZpbmVkKCJhcnJheSIsdCkseS50eXBlT2YubnVtYmVyLmdyZWF0ZXJUaGFuT3JFcXVhbHMoImFycmF5Lmxlbmd0aCIsdC5sZW5ndGgsOSksdC5sZW5ndGglOSE9PTApdGhyb3cgbmV3IEIoImFycmF5IGxlbmd0aCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgOS4iKTtsZXQgbj10Lmxlbmd0aDtoKGUpP2UubGVuZ3RoPW4vOTplPW5ldyBBcnJheShuLzkpO2ZvcihsZXQgbz0wO288bjtvKz05KXtsZXQgcj1vLzk7ZVtyXT13dC51bnBhY2sodCxvLGVbcl0pfXJldHVybiBlfTt3dC5jbG9uZT1mdW5jdGlvbih0LGUpe2lmKGgodCkpcmV0dXJuIGgoZSk/KGVbMF09dFswXSxlWzFdPXRbMV0sZVsyXT10WzJdLGVbM109dFszXSxlWzRdPXRbNF0sZVs1XT10WzVdLGVbNl09dFs2XSxlWzddPXRbN10sZVs4XT10WzhdLGUpOm5ldyB3dCh0WzBdLHRbM10sdFs2XSx0WzFdLHRbNF0sdFs3XSx0WzJdLHRbNV0sdFs4XSl9O3d0LmZyb21BcnJheT13dC51bnBhY2s7d3QuZnJvbUNvbHVtbk1ham9yQXJyYXk9ZnVuY3Rpb24odCxlKXtyZXR1cm4geS5kZWZpbmVkKCJ2YWx1ZXMiLHQpLHd0LmNsb25lKHQsZSl9O3d0LmZyb21Sb3dNYWpvckFycmF5PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHkuZGVmaW5lZCgidmFsdWVzIix0KSxoKGUpPyhlWzBdPXRbMF0sZVsxXT10WzNdLGVbMl09dFs2XSxlWzNdPXRbMV0sZVs0XT10WzRdLGVbNV09dFs3XSxlWzZdPXRbMl0sZVs3XT10WzVdLGVbOF09dFs4XSxlKTpuZXcgd3QodFswXSx0WzFdLHRbMl0sdFszXSx0WzRdLHRbNV0sdFs2XSx0WzddLHRbOF0pfTt3dC5mcm9tUXVhdGVybmlvbj1mdW5jdGlvbih0LGUpe3kudHlwZU9mLm9iamVjdCgicXVhdGVybmlvbiIsdCk7bGV0IG49dC54KnQueCxvPXQueCp0Lnkscj10LngqdC56LGk9dC54KnQudyxzPXQueSp0LnksZj10LnkqdC56LHU9dC55KnQudyxjPXQueip0LnosbD10LnoqdC53LHA9dC53KnQudyxkPW4tcy1jK3AsbT0yKihvLWwpLF89Mioocit1KSxnPTIqKG8rbCksYj0tbitzLWMrcCxUPTIqKGYtaSksTz0yKihyLXUpLEU9MiooZitpKSx3PS1uLXMrYytwO3JldHVybiBoKGUpPyhlWzBdPWQsZVsxXT1nLGVbMl09TyxlWzNdPW0sZVs0XT1iLGVbNV09RSxlWzZdPV8sZVs3XT1ULGVbOF09dyxlKTpuZXcgd3QoZCxtLF8sZyxiLFQsTyxFLHcpfTt3dC5mcm9tSGVhZGluZ1BpdGNoUm9sbD1mdW5jdGlvbih0LGUpe3kudHlwZU9mLm9iamVjdCgiaGVhZGluZ1BpdGNoUm9sbCIsdCk7bGV0IG49TWF0aC5jb3MoLXQucGl0Y2gpLG89TWF0aC5jb3MoLXQuaGVhZGluZykscj1NYXRoLmNvcyh0LnJvbGwpLGk9TWF0aC5zaW4oLXQucGl0Y2gpLHM9TWF0aC5zaW4oLXQuaGVhZGluZyksZj1NYXRoLnNpbih0LnJvbGwpLHU9bipvLGM9LXIqcytmKmkqbyxsPWYqcytyKmkqbyxwPW4qcyxkPXIqbytmKmkqcyxtPS1mKm8rcippKnMsXz0taSxnPWYqbixiPXIqbjtyZXR1cm4gaChlKT8oZVswXT11LGVbMV09cCxlWzJdPV8sZVszXT1jLGVbNF09ZCxlWzVdPWcsZVs2XT1sLGVbN109bSxlWzhdPWIsZSk6bmV3IHd0KHUsYyxsLHAsZCxtLF8sZyxiKX07d3QuZnJvbVNjYWxlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHkudHlwZU9mLm9iamVjdCgic2NhbGUiLHQpLGgoZSk/KGVbMF09dC54LGVbMV09MCxlWzJdPTAsZVszXT0wLGVbNF09dC55LGVbNV09MCxlWzZdPTAsZVs3XT0wLGVbOF09dC56LGUpOm5ldyB3dCh0LngsMCwwLDAsdC55LDAsMCwwLHQueil9O3d0LmZyb21Vbmlmb3JtU2NhbGU9ZnVuY3Rpb24odCxlKXtyZXR1cm4geS50eXBlT2YubnVtYmVyKCJzY2FsZSIsdCksaChlKT8oZVswXT10LGVbMV09MCxlWzJdPTAsZVszXT0wLGVbNF09dCxlWzVdPTAsZVs2XT0wLGVbN109MCxlWzhdPXQsZSk6bmV3IHd0KHQsMCwwLDAsdCwwLDAsMCx0KX07d3QuZnJvbUNyb3NzUHJvZHVjdD1mdW5jdGlvbih0LGUpe3JldHVybiB5LnR5cGVPZi5vYmplY3QoInZlY3RvciIsdCksaChlKT8oZVswXT0wLGVbMV09dC56LGVbMl09LXQueSxlWzNdPS10LnosZVs0XT0wLGVbNV09dC54LGVbNl09dC55LGVbN109LXQueCxlWzhdPTAsZSk6bmV3IHd0KDAsLXQueix0LnksdC56LDAsLXQueCwtdC55LHQueCwwKX07d3QuZnJvbVJvdGF0aW9uWD1mdW5jdGlvbih0LGUpe3kudHlwZU9mLm51bWJlcigiYW5nbGUiLHQpO2xldCBuPU1hdGguY29zKHQpLG89TWF0aC5zaW4odCk7cmV0dXJuIGgoZSk/KGVbMF09MSxlWzFdPTAsZVsyXT0wLGVbM109MCxlWzRdPW4sZVs1XT1vLGVbNl09MCxlWzddPS1vLGVbOF09bixlKTpuZXcgd3QoMSwwLDAsMCxuLC1vLDAsbyxuKX07d3QuZnJvbVJvdGF0aW9uWT1mdW5jdGlvbih0LGUpe3kudHlwZU9mLm51bWJlcigiYW5nbGUiLHQpO2xldCBuPU1hdGguY29zKHQpLG89TWF0aC5zaW4odCk7cmV0dXJuIGgoZSk/KGVbMF09bixlWzFdPTAsZVsyXT0tbyxlWzNdPTAsZVs0XT0xLGVbNV09MCxlWzZdPW8sZVs3XT0wLGVbOF09bixlKTpuZXcgd3QobiwwLG8sMCwxLDAsLW8sMCxuKX07d3QuZnJvbVJvdGF0aW9uWj1mdW5jdGlvbih0LGUpe3kudHlwZU9mLm51bWJlcigiYW5nbGUiLHQpO2xldCBuPU1hdGguY29zKHQpLG89TWF0aC5zaW4odCk7cmV0dXJuIGgoZSk/KGVbMF09bixlWzFdPW8sZVsyXT0wLGVbM109LW8sZVs0XT1uLGVbNV09MCxlWzZdPTAsZVs3XT0wLGVbOF09MSxlKTpuZXcgd3QobiwtbywwLG8sbiwwLDAsMCwxKX07d3QudG9BcnJheT1mdW5jdGlvbih0LGUpe3JldHVybiB5LnR5cGVPZi5vYmplY3QoIm1hdHJpeCIsdCksaChlKT8oZVswXT10WzBdLGVbMV09dFsxXSxlWzJdPXRbMl0sZVszXT10WzNdLGVbNF09dFs0XSxlWzVdPXRbNV0sZVs2XT10WzZdLGVbN109dFs3XSxlWzhdPXRbOF0sZSk6W3RbMF0sdFsxXSx0WzJdLHRbM10sdFs0XSx0WzVdLHRbNl0sdFs3XSx0WzhdXX07d3QuZ2V0RWxlbWVudEluZGV4PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHkudHlwZU9mLm51bWJlci5ncmVhdGVyVGhhbk9yRXF1YWxzKCJyb3ciLGUsMCkseS50eXBlT2YubnVtYmVyLmxlc3NUaGFuT3JFcXVhbHMoInJvdyIsZSwyKSx5LnR5cGVPZi5udW1iZXIuZ3JlYXRlclRoYW5PckVxdWFscygiY29sdW1uIix0LDApLHkudHlwZU9mLm51bWJlci5sZXNzVGhhbk9yRXF1YWxzKCJjb2x1bW4iLHQsMiksdCozK2V9O3d0LmdldENvbHVtbj1mdW5jdGlvbih0LGUsbil7eS50eXBlT2Yub2JqZWN0KCJtYXRyaXgiLHQpLHkudHlwZU9mLm51bWJlci5ncmVhdGVyVGhhbk9yRXF1YWxzKCJpbmRleCIsZSwwKSx5LnR5cGVPZi5udW1iZXIubGVzc1RoYW5PckVxdWFscygiaW5kZXgiLGUsMikseS50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLG4pO2xldCBvPWUqMyxyPXRbb10saT10W28rMV0scz10W28rMl07cmV0dXJuIG4ueD1yLG4ueT1pLG4uej1zLG59O3d0LnNldENvbHVtbj1mdW5jdGlvbih0LGUsbixvKXt5LnR5cGVPZi5vYmplY3QoIm1hdHJpeCIsdCkseS50eXBlT2YubnVtYmVyLmdyZWF0ZXJUaGFuT3JFcXVhbHMoImluZGV4IixlLDApLHkudHlwZU9mLm51bWJlci5sZXNzVGhhbk9yRXF1YWxzKCJpbmRleCIsZSwyKSx5LnR5cGVPZi5vYmplY3QoImNhcnRlc2lhbiIsbikseS50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLG8pLG89d3QuY2xvbmUodCxvKTtsZXQgcj1lKjM7cmV0dXJuIG9bcl09bi54LG9bcisxXT1uLnksb1tyKzJdPW4ueixvfTt3dC5nZXRSb3c9ZnVuY3Rpb24odCxlLG4pe3kudHlwZU9mLm9iamVjdCgibWF0cml4Iix0KSx5LnR5cGVPZi5udW1iZXIuZ3JlYXRlclRoYW5PckVxdWFscygiaW5kZXgiLGUsMCkseS50eXBlT2YubnVtYmVyLmxlc3NUaGFuT3JFcXVhbHMoImluZGV4IixlLDIpLHkudHlwZU9mLm9iamVjdCgicmVzdWx0IixuKTtsZXQgbz10W2VdLHI9dFtlKzNdLGk9dFtlKzZdO3JldHVybiBuLng9byxuLnk9cixuLno9aSxufTt3dC5zZXRSb3c9ZnVuY3Rpb24odCxlLG4sbyl7cmV0dXJuIHkudHlwZU9mLm9iamVjdCgibWF0cml4Iix0KSx5LnR5cGVPZi5udW1iZXIuZ3JlYXRlclRoYW5PckVxdWFscygiaW5kZXgiLGUsMCkseS50eXBlT2YubnVtYmVyLmxlc3NUaGFuT3JFcXVhbHMoImluZGV4IixlLDIpLHkudHlwZU9mLm9iamVjdCgiY2FydGVzaWFuIixuKSx5LnR5cGVPZi5vYmplY3QoInJlc3VsdCIsbyksbz13dC5jbG9uZSh0LG8pLG9bZV09bi54LG9bZSszXT1uLnksb1tlKzZdPW4ueixvfTtiQz1uZXcgYTt3dC5zZXRTY2FsZT1mdW5jdGlvbih0LGUsbil7eS50eXBlT2Yub2JqZWN0KCJtYXRyaXgiLHQpLHkudHlwZU9mLm9iamVjdCgic2NhbGUiLGUpLHkudHlwZU9mLm9iamVjdCgicmVzdWx0IixuKTtsZXQgbz13dC5nZXRTY2FsZSh0LGJDKSxyPWUueC9vLngsaT1lLnkvby55LHM9ZS56L28uejtyZXR1cm4gblswXT10WzBdKnIsblsxXT10WzFdKnIsblsyXT10WzJdKnIsblszXT10WzNdKmksbls0XT10WzRdKmksbls1XT10WzVdKmksbls2XT10WzZdKnMsbls3XT10WzddKnMsbls4XT10WzhdKnMsbn07VEM9bmV3IGE7d3Quc2V0VW5pZm9ybVNjYWxlPWZ1bmN0aW9uKHQsZSxuKXt5LnR5cGVPZi5vYmplY3QoIm1hdHJpeCIsdCkseS50eXBlT2YubnVtYmVyKCJzY2FsZSIsZSkseS50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLG4pO2xldCBvPXd0LmdldFNjYWxlKHQsVEMpLHI9ZS9vLngsaT1lL28ueSxzPWUvby56O3JldHVybiBuWzBdPXRbMF0qcixuWzFdPXRbMV0qcixuWzJdPXRbMl0qcixuWzNdPXRbM10qaSxuWzRdPXRbNF0qaSxuWzVdPXRbNV0qaSxuWzZdPXRbNl0qcyxuWzddPXRbN10qcyxuWzhdPXRbOF0qcyxufTtTbT1uZXcgYTt3dC5nZXRTY2FsZT1mdW5jdGlvbih0LGUpe3JldHVybiB5LnR5cGVPZi5vYmplY3QoIm1hdHJpeCIsdCkseS50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLGUpLGUueD1hLm1hZ25pdHVkZShhLmZyb21FbGVtZW50cyh0WzBdLHRbMV0sdFsyXSxTbSkpLGUueT1hLm1hZ25pdHVkZShhLmZyb21FbGVtZW50cyh0WzNdLHRbNF0sdFs1XSxTbSkpLGUuej1hLm1hZ25pdHVkZShhLmZyb21FbGVtZW50cyh0WzZdLHRbN10sdFs4XSxTbSkpLGV9O0UxPW5ldyBhO3d0LmdldE1heGltdW1TY2FsZT1mdW5jdGlvbih0KXtyZXR1cm4gd3QuZ2V0U2NhbGUodCxFMSksYS5tYXhpbXVtQ29tcG9uZW50KEUxKX07d0M9bmV3IGE7d3Quc2V0Um90YXRpb249ZnVuY3Rpb24odCxlLG4pe3kudHlwZU9mLm9iamVjdCgibWF0cml4Iix0KSx5LnR5cGVPZi5vYmplY3QoInJlc3VsdCIsbik7bGV0IG89d3QuZ2V0U2NhbGUodCx3Qyk7cmV0dXJuIG5bMF09ZVswXSpvLngsblsxXT1lWzFdKm8ueCxuWzJdPWVbMl0qby54LG5bM109ZVszXSpvLnksbls0XT1lWzRdKm8ueSxuWzVdPWVbNV0qby55LG5bNl09ZVs2XSpvLnosbls3XT1lWzddKm8ueixuWzhdPWVbOF0qby56LG59O09DPW5ldyBhO3d0LmdldFJvdGF0aW9uPWZ1bmN0aW9uKHQsZSl7eS50eXBlT2Yub2JqZWN0KCJtYXRyaXgiLHQpLHkudHlwZU9mLm9iamVjdCgicmVzdWx0IixlKTtsZXQgbj13dC5nZXRTY2FsZSh0LE9DKTtyZXR1cm4gZVswXT10WzBdL24ueCxlWzFdPXRbMV0vbi54LGVbMl09dFsyXS9uLngsZVszXT10WzNdL24ueSxlWzRdPXRbNF0vbi55LGVbNV09dFs1XS9uLnksZVs2XT10WzZdL24ueixlWzddPXRbN10vbi56LGVbOF09dFs4XS9uLnosZX07d3QubXVsdGlwbHk9ZnVuY3Rpb24odCxlLG4pe3kudHlwZU9mLm9iamVjdCgibGVmdCIsdCkseS50eXBlT2Yub2JqZWN0KCJyaWdodCIsZSkseS50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLG4pO2xldCBvPXRbMF0qZVswXSt0WzNdKmVbMV0rdFs2XSplWzJdLHI9dFsxXSplWzBdK3RbNF0qZVsxXSt0WzddKmVbMl0saT10WzJdKmVbMF0rdFs1XSplWzFdK3RbOF0qZVsyXSxzPXRbMF0qZVszXSt0WzNdKmVbNF0rdFs2XSplWzVdLGY9dFsxXSplWzNdK3RbNF0qZVs0XSt0WzddKmVbNV0sdT10WzJdKmVbM10rdFs1XSplWzRdK3RbOF0qZVs1XSxjPXRbMF0qZVs2XSt0WzNdKmVbN10rdFs2XSplWzhdLGw9dFsxXSplWzZdK3RbNF0qZVs3XSt0WzddKmVbOF0scD10WzJdKmVbNl0rdFs1XSplWzddK3RbOF0qZVs4XTtyZXR1cm4gblswXT1vLG5bMV09cixuWzJdPWksblszXT1zLG5bNF09ZixuWzVdPXUsbls2XT1jLG5bN109bCxuWzhdPXAsbn07d3QuYWRkPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4geS50eXBlT2Yub2JqZWN0KCJsZWZ0Iix0KSx5LnR5cGVPZi5vYmplY3QoInJpZ2h0IixlKSx5LnR5cGVPZi5vYmplY3QoInJlc3VsdCIsbiksblswXT10WzBdK2VbMF0sblsxXT10WzFdK2VbMV0sblsyXT10WzJdK2VbMl0sblszXT10WzNdK2VbM10sbls0XT10WzRdK2VbNF0sbls1XT10WzVdK2VbNV0sbls2XT10WzZdK2VbNl0sbls3XT10WzddK2VbN10sbls4XT10WzhdK2VbOF0sbn07d3Quc3VidHJhY3Q9ZnVuY3Rpb24odCxlLG4pe3JldHVybiB5LnR5cGVPZi5vYmplY3QoImxlZnQiLHQpLHkudHlwZU9mLm9iamVjdCgicmlnaHQiLGUpLHkudHlwZU9mLm9iamVjdCgicmVzdWx0IixuKSxuWzBdPXRbMF0tZVswXSxuWzFdPXRbMV0tZVsxXSxuWzJdPXRbMl0tZVsyXSxuWzNdPXRbM10tZVszXSxuWzRdPXRbNF0tZVs0XSxuWzVdPXRbNV0tZVs1XSxuWzZdPXRbNl0tZVs2XSxuWzddPXRbN10tZVs3XSxuWzhdPXRbOF0tZVs4XSxufTt3dC5tdWx0aXBseUJ5VmVjdG9yPWZ1bmN0aW9uKHQsZSxuKXt5LnR5cGVPZi5vYmplY3QoIm1hdHJpeCIsdCkseS50eXBlT2Yub2JqZWN0KCJjYXJ0ZXNpYW4iLGUpLHkudHlwZU9mLm9iamVjdCgicmVzdWx0IixuKTtsZXQgbz1lLngscj1lLnksaT1lLnoscz10WzBdKm8rdFszXSpyK3RbNl0qaSxmPXRbMV0qbyt0WzRdKnIrdFs3XSppLHU9dFsyXSpvK3RbNV0qcit0WzhdKmk7cmV0dXJuIG4ueD1zLG4ueT1mLG4uej11LG59O3d0Lm11bHRpcGx5QnlTY2FsYXI9ZnVuY3Rpb24odCxlLG4pe3JldHVybiB5LnR5cGVPZi5vYmplY3QoIm1hdHJpeCIsdCkseS50eXBlT2YubnVtYmVyKCJzY2FsYXIiLGUpLHkudHlwZU9mLm9iamVjdCgicmVzdWx0IixuKSxuWzBdPXRbMF0qZSxuWzFdPXRbMV0qZSxuWzJdPXRbMl0qZSxuWzNdPXRbM10qZSxuWzRdPXRbNF0qZSxuWzVdPXRbNV0qZSxuWzZdPXRbNl0qZSxuWzddPXRbN10qZSxuWzhdPXRbOF0qZSxufTt3dC5tdWx0aXBseUJ5U2NhbGU9ZnVuY3Rpb24odCxlLG4pe3JldHVybiB5LnR5cGVPZi5vYmplY3QoIm1hdHJpeCIsdCkseS50eXBlT2Yub2JqZWN0KCJzY2FsZSIsZSkseS50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLG4pLG5bMF09dFswXSplLngsblsxXT10WzFdKmUueCxuWzJdPXRbMl0qZS54LG5bM109dFszXSplLnksbls0XT10WzRdKmUueSxuWzVdPXRbNV0qZS55LG5bNl09dFs2XSplLnosbls3XT10WzddKmUueixuWzhdPXRbOF0qZS56LG59O3d0Lm11bHRpcGx5QnlVbmlmb3JtU2NhbGU9ZnVuY3Rpb24odCxlLG4pe3JldHVybiB5LnR5cGVPZi5vYmplY3QoIm1hdHJpeCIsdCkseS50eXBlT2YubnVtYmVyKCJzY2FsZSIsZSkseS50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLG4pLG5bMF09dFswXSplLG5bMV09dFsxXSplLG5bMl09dFsyXSplLG5bM109dFszXSplLG5bNF09dFs0XSplLG5bNV09dFs1XSplLG5bNl09dFs2XSplLG5bN109dFs3XSplLG5bOF09dFs4XSplLG59O3d0Lm5lZ2F0ZT1mdW5jdGlvbih0LGUpe3JldHVybiB5LnR5cGVPZi5vYmplY3QoIm1hdHJpeCIsdCkseS50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLGUpLGVbMF09LXRbMF0sZVsxXT0tdFsxXSxlWzJdPS10WzJdLGVbM109LXRbM10sZVs0XT0tdFs0XSxlWzVdPS10WzVdLGVbNl09LXRbNl0sZVs3XT0tdFs3XSxlWzhdPS10WzhdLGV9O3d0LnRyYW5zcG9zZT1mdW5jdGlvbih0LGUpe3kudHlwZU9mLm9iamVjdCgibWF0cml4Iix0KSx5LnR5cGVPZi5vYmplY3QoInJlc3VsdCIsZSk7bGV0IG49dFswXSxvPXRbM10scj10WzZdLGk9dFsxXSxzPXRbNF0sZj10WzddLHU9dFsyXSxjPXRbNV0sbD10WzhdO3JldHVybiBlWzBdPW4sZVsxXT1vLGVbMl09cixlWzNdPWksZVs0XT1zLGVbNV09ZixlWzZdPXUsZVs3XT1jLGVbOF09bCxlfTtDbT1bMSwwLDBdLHhtPVsyLDIsMV07cWw9bmV3IHd0LFIxPW5ldyB3dDt3dC5jb21wdXRlRWlnZW5EZWNvbXBvc2l0aW9uPWZ1bmN0aW9uKHQsZSl7eS50eXBlT2Yub2JqZWN0KCJtYXRyaXgiLHQpO2xldCBuPU0uRVBTSUxPTjIwLG89MTAscj0wLGk9MDtoKGUpfHwoZT17fSk7bGV0IHM9ZS51bml0YXJ5PXd0LmNsb25lKHd0LklERU5USVRZLGUudW5pdGFyeSksZj1lLmRpYWdvbmFsPXd0LmNsb25lKHQsZS5kaWFnb25hbCksdT1uKkVDKGYpO2Zvcig7aTxvJiZSQyhmKT51OylTQyhmLHFsKSx3dC50cmFuc3Bvc2UocWwsUjEpLHd0Lm11bHRpcGx5KGYscWwsZiksd3QubXVsdGlwbHkoUjEsZixmKSx3dC5tdWx0aXBseShzLHFsLHMpLCsrcj4yJiYoKytpLHI9MCk7cmV0dXJuIGV9O3d0LmFicz1mdW5jdGlvbih0LGUpe3JldHVybiB5LnR5cGVPZi5vYmplY3QoIm1hdHJpeCIsdCkseS50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLGUpLGVbMF09TWF0aC5hYnModFswXSksZVsxXT1NYXRoLmFicyh0WzFdKSxlWzJdPU1hdGguYWJzKHRbMl0pLGVbM109TWF0aC5hYnModFszXSksZVs0XT1NYXRoLmFicyh0WzRdKSxlWzVdPU1hdGguYWJzKHRbNV0pLGVbNl09TWF0aC5hYnModFs2XSksZVs3XT1NYXRoLmFicyh0WzddKSxlWzhdPU1hdGguYWJzKHRbOF0pLGV9O3d0LmRldGVybWluYW50PWZ1bmN0aW9uKHQpe3kudHlwZU9mLm9iamVjdCgibWF0cml4Iix0KTtsZXQgZT10WzBdLG49dFszXSxvPXRbNl0scj10WzFdLGk9dFs0XSxzPXRbN10sZj10WzJdLHU9dFs1XSxjPXRbOF07cmV0dXJuIGUqKGkqYy11KnMpK3IqKHUqby1uKmMpK2YqKG4qcy1pKm8pfTt3dC5pbnZlcnNlPWZ1bmN0aW9uKHQsZSl7eS50eXBlT2Yub2JqZWN0KCJtYXRyaXgiLHQpLHkudHlwZU9mLm9iamVjdCgicmVzdWx0IixlKTtsZXQgbj10WzBdLG89dFsxXSxyPXRbMl0saT10WzNdLHM9dFs0XSxmPXRbNV0sdT10WzZdLGM9dFs3XSxsPXRbOF0scD13dC5kZXRlcm1pbmFudCh0KTtpZihNYXRoLmFicyhwKTw9TS5FUFNJTE9OMTUpdGhyb3cgbmV3IEIoIm1hdHJpeCBpcyBub3QgaW52ZXJ0aWJsZSIpO2VbMF09cypsLWMqZixlWzFdPWMqci1vKmwsZVsyXT1vKmYtcypyLGVbM109dSpmLWkqbCxlWzRdPW4qbC11KnIsZVs1XT1pKnItbipmLGVbNl09aSpjLXUqcyxlWzddPXUqby1uKmMsZVs4XT1uKnMtaSpvO2xldCBkPTEvcDtyZXR1cm4gd3QubXVsdGlwbHlCeVNjYWxhcihlLGQsZSl9O0NDPW5ldyB3dDt3dC5pbnZlcnNlVHJhbnNwb3NlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHkudHlwZU9mLm9iamVjdCgibWF0cml4Iix0KSx5LnR5cGVPZi5vYmplY3QoInJlc3VsdCIsZSksd3QuaW52ZXJzZSh3dC50cmFuc3Bvc2UodCxDQyksZSl9O3d0LmVxdWFscz1mdW5jdGlvbih0LGUpe3JldHVybiB0PT09ZXx8aCh0KSYmaChlKSYmdFswXT09PWVbMF0mJnRbMV09PT1lWzFdJiZ0WzJdPT09ZVsyXSYmdFszXT09PWVbM10mJnRbNF09PT1lWzRdJiZ0WzVdPT09ZVs1XSYmdFs2XT09PWVbNl0mJnRbN109PT1lWzddJiZ0WzhdPT09ZVs4XX07d3QuZXF1YWxzRXBzaWxvbj1mdW5jdGlvbih0LGUsbil7cmV0dXJuIG49eChuLDApLHQ9PT1lfHxoKHQpJiZoKGUpJiZNYXRoLmFicyh0WzBdLWVbMF0pPD1uJiZNYXRoLmFicyh0WzFdLWVbMV0pPD1uJiZNYXRoLmFicyh0WzJdLWVbMl0pPD1uJiZNYXRoLmFicyh0WzNdLWVbM10pPD1uJiZNYXRoLmFicyh0WzRdLWVbNF0pPD1uJiZNYXRoLmFicyh0WzVdLWVbNV0pPD1uJiZNYXRoLmFicyh0WzZdLWVbNl0pPD1uJiZNYXRoLmFicyh0WzddLWVbN10pPD1uJiZNYXRoLmFicyh0WzhdLWVbOF0pPD1ufTt3dC5JREVOVElUWT1PYmplY3QuZnJlZXplKG5ldyB3dCgxLDAsMCwwLDEsMCwwLDAsMSkpO3d0LlpFUk89T2JqZWN0LmZyZWV6ZShuZXcgd3QoMCwwLDAsMCwwLDAsMCwwLDApKTt3dC5DT0xVTU4wUk9XMD0wO3d0LkNPTFVNTjBST1cxPTE7d3QuQ09MVU1OMFJPVzI9Mjt3dC5DT0xVTU4xUk9XMD0zO3d0LkNPTFVNTjFST1cxPTQ7d3QuQ09MVU1OMVJPVzI9NTt3dC5DT0xVTU4yUk9XMD02O3d0LkNPTFVNTjJST1cxPTc7d3QuQ09MVU1OMlJPVzI9ODtPYmplY3QuZGVmaW5lUHJvcGVydGllcyh3dC5wcm90b3R5cGUse2xlbmd0aDp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHd0LnBhY2tlZExlbmd0aH19fSk7d3QucHJvdG90eXBlLmNsb25lPWZ1bmN0aW9uKHQpe3JldHVybiB3dC5jbG9uZSh0aGlzLHQpfTt3dC5wcm90b3R5cGUuZXF1YWxzPWZ1bmN0aW9uKHQpe3JldHVybiB3dC5lcXVhbHModGhpcyx0KX07d3QuZXF1YWxzQXJyYXk9ZnVuY3Rpb24odCxlLG4pe3JldHVybiB0WzBdPT09ZVtuXSYmdFsxXT09PWVbbisxXSYmdFsyXT09PWVbbisyXSYmdFszXT09PWVbbiszXSYmdFs0XT09PWVbbis0XSYmdFs1XT09PWVbbis1XSYmdFs2XT09PWVbbis2XSYmdFs3XT09PWVbbis3XSYmdFs4XT09PWVbbis4XX07d3QucHJvdG90eXBlLmVxdWFsc0Vwc2lsb249ZnVuY3Rpb24odCxlKXtyZXR1cm4gd3QuZXF1YWxzRXBzaWxvbih0aGlzLHQsZSl9O3d0LnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybmAoJHt0aGlzWzBdfSwgJHt0aGlzWzNdfSwgJHt0aGlzWzZdfSkKKCR7dGhpc1sxXX0sICR7dGhpc1s0XX0sICR7dGhpc1s3XX0pCigke3RoaXNbMl19LCAke3RoaXNbNV19LCAke3RoaXNbOF19KWB9O1E9d3R9KTtmdW5jdGlvbiBMdCh0LGUsbixvKXt0aGlzLng9eCh0LDApLHRoaXMueT14KGUsMCksdGhpcy56PXgobiwwKSx0aGlzLnc9eChvLDApfXZhciBLbCxTMSx4QyxQbSxibyxQQyxNQyxDMSxoZSxocj1aKCgpPT57WHQoKTtJdCgpO2Z0KCk7SHQoKTtXdCgpO0x0LmZyb21FbGVtZW50cz1mdW5jdGlvbih0LGUsbixvLHIpe3JldHVybiBoKHIpPyhyLng9dCxyLnk9ZSxyLno9bixyLnc9byxyKTpuZXcgTHQodCxlLG4sbyl9O0x0LmZyb21Db2xvcj1mdW5jdGlvbih0LGUpe3JldHVybiB5LnR5cGVPZi5vYmplY3QoImNvbG9yIix0KSxoKGUpPyhlLng9dC5yZWQsZS55PXQuZ3JlZW4sZS56PXQuYmx1ZSxlLnc9dC5hbHBoYSxlKTpuZXcgTHQodC5yZWQsdC5ncmVlbix0LmJsdWUsdC5hbHBoYSl9O0x0LmNsb25lPWZ1bmN0aW9uKHQsZSl7aWYoaCh0KSlyZXR1cm4gaChlKT8oZS54PXQueCxlLnk9dC55LGUuej10LnosZS53PXQudyxlKTpuZXcgTHQodC54LHQueSx0LnosdC53KX07THQucGFja2VkTGVuZ3RoPTQ7THQucGFjaz1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHkudHlwZU9mLm9iamVjdCgidmFsdWUiLHQpLHkuZGVmaW5lZCgiYXJyYXkiLGUpLG49eChuLDApLGVbbisrXT10LngsZVtuKytdPXQueSxlW24rK109dC56LGVbbl09dC53LGV9O0x0LnVucGFjaz1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHkuZGVmaW5lZCgiYXJyYXkiLHQpLGU9eChlLDApLGgobil8fChuPW5ldyBMdCksbi54PXRbZSsrXSxuLnk9dFtlKytdLG4uej10W2UrK10sbi53PXRbZV0sbn07THQucGFja0FycmF5PWZ1bmN0aW9uKHQsZSl7eS5kZWZpbmVkKCJhcnJheSIsdCk7bGV0IG49dC5sZW5ndGgsbz1uKjQ7aWYoIWgoZSkpZT1uZXcgQXJyYXkobyk7ZWxzZXtpZighQXJyYXkuaXNBcnJheShlKSYmZS5sZW5ndGghPT1vKXRocm93IG5ldyBCKCJJZiByZXN1bHQgaXMgYSB0eXBlZCBhcnJheSwgaXQgbXVzdCBoYXZlIGV4YWN0bHkgYXJyYXkubGVuZ3RoICogNCBlbGVtZW50cyIpO2UubGVuZ3RoIT09byYmKGUubGVuZ3RoPW8pfWZvcihsZXQgcj0wO3I8bjsrK3IpTHQucGFjayh0W3JdLGUscio0KTtyZXR1cm4gZX07THQudW5wYWNrQXJyYXk9ZnVuY3Rpb24odCxlKXtpZih5LmRlZmluZWQoImFycmF5Iix0KSx5LnR5cGVPZi5udW1iZXIuZ3JlYXRlclRoYW5PckVxdWFscygiYXJyYXkubGVuZ3RoIix0Lmxlbmd0aCw0KSx0Lmxlbmd0aCU0IT09MCl0aHJvdyBuZXcgQigiYXJyYXkgbGVuZ3RoIG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0LiIpO2xldCBuPXQubGVuZ3RoO2goZSk/ZS5sZW5ndGg9bi80OmU9bmV3IEFycmF5KG4vNCk7Zm9yKGxldCBvPTA7bzxuO28rPTQpe2xldCByPW8vNDtlW3JdPUx0LnVucGFjayh0LG8sZVtyXSl9cmV0dXJuIGV9O0x0LmZyb21BcnJheT1MdC51bnBhY2s7THQubWF4aW11bUNvbXBvbmVudD1mdW5jdGlvbih0KXtyZXR1cm4geS50eXBlT2Yub2JqZWN0KCJjYXJ0ZXNpYW4iLHQpLE1hdGgubWF4KHQueCx0LnksdC56LHQudyl9O0x0Lm1pbmltdW1Db21wb25lbnQ9ZnVuY3Rpb24odCl7cmV0dXJuIHkudHlwZU9mLm9iamVjdCgiY2FydGVzaWFuIix0KSxNYXRoLm1pbih0LngsdC55LHQueix0LncpfTtMdC5taW5pbXVtQnlDb21wb25lbnQ9ZnVuY3Rpb24odCxlLG4pe3JldHVybiB5LnR5cGVPZi5vYmplY3QoImZpcnN0Iix0KSx5LnR5cGVPZi5vYmplY3QoInNlY29uZCIsZSkseS50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLG4pLG4ueD1NYXRoLm1pbih0LngsZS54KSxuLnk9TWF0aC5taW4odC55LGUueSksbi56PU1hdGgubWluKHQueixlLnopLG4udz1NYXRoLm1pbih0LncsZS53KSxufTtMdC5tYXhpbXVtQnlDb21wb25lbnQ9ZnVuY3Rpb24odCxlLG4pe3JldHVybiB5LnR5cGVPZi5vYmplY3QoImZpcnN0Iix0KSx5LnR5cGVPZi5vYmplY3QoInNlY29uZCIsZSkseS50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLG4pLG4ueD1NYXRoLm1heCh0LngsZS54KSxuLnk9TWF0aC5tYXgodC55LGUueSksbi56PU1hdGgubWF4KHQueixlLnopLG4udz1NYXRoLm1heCh0LncsZS53KSxufTtMdC5jbGFtcD1mdW5jdGlvbih0LGUsbixvKXt5LnR5cGVPZi5vYmplY3QoInZhbHVlIix0KSx5LnR5cGVPZi5vYmplY3QoIm1pbiIsZSkseS50eXBlT2Yub2JqZWN0KCJtYXgiLG4pLHkudHlwZU9mLm9iamVjdCgicmVzdWx0IixvKTtsZXQgcj1NLmNsYW1wKHQueCxlLngsbi54KSxpPU0uY2xhbXAodC55LGUueSxuLnkpLHM9TS5jbGFtcCh0LnosZS56LG4ueiksZj1NLmNsYW1wKHQudyxlLncsbi53KTtyZXR1cm4gby54PXIsby55PWksby56PXMsby53PWYsb307THQubWFnbml0dWRlU3F1YXJlZD1mdW5jdGlvbih0KXtyZXR1cm4geS50eXBlT2Yub2JqZWN0KCJjYXJ0ZXNpYW4iLHQpLHQueCp0LngrdC55KnQueSt0LnoqdC56K3Qudyp0Lnd9O0x0Lm1hZ25pdHVkZT1mdW5jdGlvbih0KXtyZXR1cm4gTWF0aC5zcXJ0KEx0Lm1hZ25pdHVkZVNxdWFyZWQodCkpfTtLbD1uZXcgTHQ7THQuZGlzdGFuY2U9ZnVuY3Rpb24odCxlKXtyZXR1cm4geS50eXBlT2Yub2JqZWN0KCJsZWZ0Iix0KSx5LnR5cGVPZi5vYmplY3QoInJpZ2h0IixlKSxMdC5zdWJ0cmFjdCh0LGUsS2wpLEx0Lm1hZ25pdHVkZShLbCl9O0x0LmRpc3RhbmNlU3F1YXJlZD1mdW5jdGlvbih0LGUpe3JldHVybiB5LnR5cGVPZi5vYmplY3QoImxlZnQiLHQpLHkudHlwZU9mLm9iamVjdCgicmlnaHQiLGUpLEx0LnN1YnRyYWN0KHQsZSxLbCksTHQubWFnbml0dWRlU3F1YXJlZChLbCl9O0x0Lm5vcm1hbGl6ZT1mdW5jdGlvbih0LGUpe3kudHlwZU9mLm9iamVjdCgiY2FydGVzaWFuIix0KSx5LnR5cGVPZi5vYmplY3QoInJlc3VsdCIsZSk7bGV0IG49THQubWFnbml0dWRlKHQpO2lmKGUueD10LngvbixlLnk9dC55L24sZS56PXQuei9uLGUudz10Lncvbixpc05hTihlLngpfHxpc05hTihlLnkpfHxpc05hTihlLnopfHxpc05hTihlLncpKXRocm93IG5ldyBCKCJub3JtYWxpemVkIHJlc3VsdCBpcyBub3QgYSBudW1iZXIiKTtyZXR1cm4gZX07THQuZG90PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHkudHlwZU9mLm9iamVjdCgibGVmdCIsdCkseS50eXBlT2Yub2JqZWN0KCJyaWdodCIsZSksdC54KmUueCt0LnkqZS55K3QueiplLnordC53KmUud307THQubXVsdGlwbHlDb21wb25lbnRzPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4geS50eXBlT2Yub2JqZWN0KCJsZWZ0Iix0KSx5LnR5cGVPZi5vYmplY3QoInJpZ2h0IixlKSx5LnR5cGVPZi5vYmplY3QoInJlc3VsdCIsbiksbi54PXQueCplLngsbi55PXQueSplLnksbi56PXQueiplLnosbi53PXQudyplLncsbn07THQuZGl2aWRlQ29tcG9uZW50cz1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHkudHlwZU9mLm9iamVjdCgibGVmdCIsdCkseS50eXBlT2Yub2JqZWN0KCJyaWdodCIsZSkseS50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLG4pLG4ueD10LngvZS54LG4ueT10LnkvZS55LG4uej10LnovZS56LG4udz10LncvZS53LG59O0x0LmFkZD1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHkudHlwZU9mLm9iamVjdCgibGVmdCIsdCkseS50eXBlT2Yub2JqZWN0KCJyaWdodCIsZSkseS50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLG4pLG4ueD10LngrZS54LG4ueT10LnkrZS55LG4uej10LnorZS56LG4udz10LncrZS53LG59O0x0LnN1YnRyYWN0PWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4geS50eXBlT2Yub2JqZWN0KCJsZWZ0Iix0KSx5LnR5cGVPZi5vYmplY3QoInJpZ2h0IixlKSx5LnR5cGVPZi5vYmplY3QoInJlc3VsdCIsbiksbi54PXQueC1lLngsbi55PXQueS1lLnksbi56PXQuei1lLnosbi53PXQudy1lLncsbn07THQubXVsdGlwbHlCeVNjYWxhcj1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHkudHlwZU9mLm9iamVjdCgiY2FydGVzaWFuIix0KSx5LnR5cGVPZi5udW1iZXIoInNjYWxhciIsZSkseS50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLG4pLG4ueD10LngqZSxuLnk9dC55KmUsbi56PXQueiplLG4udz10LncqZSxufTtMdC5kaXZpZGVCeVNjYWxhcj1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHkudHlwZU9mLm9iamVjdCgiY2FydGVzaWFuIix0KSx5LnR5cGVPZi5udW1iZXIoInNjYWxhciIsZSkseS50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLG4pLG4ueD10LngvZSxuLnk9dC55L2Usbi56PXQuei9lLG4udz10LncvZSxufTtMdC5uZWdhdGU9ZnVuY3Rpb24odCxlKXtyZXR1cm4geS50eXBlT2Yub2JqZWN0KCJjYXJ0ZXNpYW4iLHQpLHkudHlwZU9mLm9iamVjdCgicmVzdWx0IixlKSxlLng9LXQueCxlLnk9LXQueSxlLno9LXQueixlLnc9LXQudyxlfTtMdC5hYnM9ZnVuY3Rpb24odCxlKXtyZXR1cm4geS50eXBlT2Yub2JqZWN0KCJjYXJ0ZXNpYW4iLHQpLHkudHlwZU9mLm9iamVjdCgicmVzdWx0IixlKSxlLng9TWF0aC5hYnModC54KSxlLnk9TWF0aC5hYnModC55KSxlLno9TWF0aC5hYnModC56KSxlLnc9TWF0aC5hYnModC53KSxlfTtTMT1uZXcgTHQ7THQubGVycD1mdW5jdGlvbih0LGUsbixvKXtyZXR1cm4geS50eXBlT2Yub2JqZWN0KCJzdGFydCIsdCkseS50eXBlT2Yub2JqZWN0KCJlbmQiLGUpLHkudHlwZU9mLm51bWJlcigidCIsbikseS50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLG8pLEx0Lm11bHRpcGx5QnlTY2FsYXIoZSxuLFMxKSxvPUx0Lm11bHRpcGx5QnlTY2FsYXIodCwxLW4sbyksTHQuYWRkKFMxLG8sbyl9O3hDPW5ldyBMdDtMdC5tb3N0T3J0aG9nb25hbEF4aXM9ZnVuY3Rpb24odCxlKXt5LnR5cGVPZi5vYmplY3QoImNhcnRlc2lhbiIsdCkseS50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLGUpO2xldCBuPUx0Lm5vcm1hbGl6ZSh0LHhDKTtyZXR1cm4gTHQuYWJzKG4sbiksbi54PD1uLnk/bi54PD1uLno/bi54PD1uLnc/ZT1MdC5jbG9uZShMdC5VTklUX1gsZSk6ZT1MdC5jbG9uZShMdC5VTklUX1csZSk6bi56PD1uLnc/ZT1MdC5jbG9uZShMdC5VTklUX1osZSk6ZT1MdC5jbG9uZShMdC5VTklUX1csZSk6bi55PD1uLno/bi55PD1uLnc/ZT1MdC5jbG9uZShMdC5VTklUX1ksZSk6ZT1MdC5jbG9uZShMdC5VTklUX1csZSk6bi56PD1uLnc/ZT1MdC5jbG9uZShMdC5VTklUX1osZSk6ZT1MdC5jbG9uZShMdC5VTklUX1csZSksZX07THQuZXF1YWxzPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQ9PT1lfHxoKHQpJiZoKGUpJiZ0Lng9PT1lLngmJnQueT09PWUueSYmdC56PT09ZS56JiZ0Lnc9PT1lLnd9O0x0LmVxdWFsc0FycmF5PWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gdC54PT09ZVtuXSYmdC55PT09ZVtuKzFdJiZ0Lno9PT1lW24rMl0mJnQudz09PWVbbiszXX07THQuZXF1YWxzRXBzaWxvbj1mdW5jdGlvbih0LGUsbixvKXtyZXR1cm4gdD09PWV8fGgodCkmJmgoZSkmJk0uZXF1YWxzRXBzaWxvbih0LngsZS54LG4sbykmJk0uZXF1YWxzRXBzaWxvbih0LnksZS55LG4sbykmJk0uZXF1YWxzRXBzaWxvbih0LnosZS56LG4sbykmJk0uZXF1YWxzRXBzaWxvbih0LncsZS53LG4sbyl9O0x0LlpFUk89T2JqZWN0LmZyZWV6ZShuZXcgTHQoMCwwLDAsMCkpO0x0Lk9ORT1PYmplY3QuZnJlZXplKG5ldyBMdCgxLDEsMSwxKSk7THQuVU5JVF9YPU9iamVjdC5mcmVlemUobmV3IEx0KDEsMCwwLDApKTtMdC5VTklUX1k9T2JqZWN0LmZyZWV6ZShuZXcgTHQoMCwxLDAsMCkpO0x0LlVOSVRfWj1PYmplY3QuZnJlZXplKG5ldyBMdCgwLDAsMSwwKSk7THQuVU5JVF9XPU9iamVjdC5mcmVlemUobmV3IEx0KDAsMCwwLDEpKTtMdC5wcm90b3R5cGUuY2xvbmU9ZnVuY3Rpb24odCl7cmV0dXJuIEx0LmNsb25lKHRoaXMsdCl9O0x0LnByb3RvdHlwZS5lcXVhbHM9ZnVuY3Rpb24odCl7cmV0dXJuIEx0LmVxdWFscyh0aGlzLHQpfTtMdC5wcm90b3R5cGUuZXF1YWxzRXBzaWxvbj1mdW5jdGlvbih0LGUsbil7cmV0dXJuIEx0LmVxdWFsc0Vwc2lsb24odGhpcyx0LGUsbil9O0x0LnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybmAoJHt0aGlzLnh9LCAke3RoaXMueX0sICR7dGhpcy56fSwgJHt0aGlzLnd9KWB9O1BtPW5ldyBGbG9hdDMyQXJyYXkoMSksYm89bmV3IFVpbnQ4QXJyYXkoUG0uYnVmZmVyKSxQQz1uZXcgVWludDMyQXJyYXkoWzI4NzQ1NDAyMF0pLE1DPW5ldyBVaW50OEFycmF5KFBDLmJ1ZmZlciksQzE9TUNbMF09PT02ODtMdC5wYWNrRmxvYXQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4geS50eXBlT2YubnVtYmVyKCJ2YWx1ZSIsdCksaChlKXx8KGU9bmV3IEx0KSxQbVswXT10LEMxPyhlLng9Ym9bMF0sZS55PWJvWzFdLGUuej1ib1syXSxlLnc9Ym9bM10pOihlLng9Ym9bM10sZS55PWJvWzJdLGUuej1ib1sxXSxlLnc9Ym9bMF0pLGV9O0x0LnVucGFja0Zsb2F0PWZ1bmN0aW9uKHQpe3JldHVybiB5LnR5cGVPZi5vYmplY3QoInBhY2tlZEZsb2F0Iix0KSxDMT8oYm9bMF09dC54LGJvWzFdPXQueSxib1syXT10LnosYm9bM109dC53KTooYm9bMF09dC53LGJvWzFdPXQueixib1syXT10LnksYm9bM109dC54KSxQbVswXX07aGU9THR9KTtmdW5jdGlvbiByZih0KXt0aGlzLm5hbWU9IlJ1bnRpbWVFcnJvciIsdGhpcy5tZXNzYWdlPXQ7bGV0IGU7dHJ5e3Rocm93IG5ldyBFcnJvcn1jYXRjaChuKXtlPW4uc3RhY2t9dGhpcy5zdGFjaz1lfXZhciBBZSxKcj1aKCgpPT57ZnQoKTtoKE9iamVjdC5jcmVhdGUpJiYocmYucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoRXJyb3IucHJvdG90eXBlKSxyZi5wcm90b3R5cGUuY29uc3RydWN0b3I9cmYpO3JmLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe2xldCB0PWAke3RoaXMubmFtZX06ICR7dGhpcy5tZXNzYWdlfWA7cmV0dXJuIGgodGhpcy5zdGFjaykmJih0Kz1gCiR7dGhpcy5zdGFjay50b1N0cmluZygpfWApLHR9O0FlPXJmfSk7ZnVuY3Rpb24gVHQodCxlLG4sbyxyLGkscyxmLHUsYyxsLHAsZCxtLF8sZyl7dGhpc1swXT14KHQsMCksdGhpc1sxXT14KHIsMCksdGhpc1syXT14KHUsMCksdGhpc1szXT14KGQsMCksdGhpc1s0XT14KGUsMCksdGhpc1s1XT14KGksMCksdGhpc1s2XT14KGMsMCksdGhpc1s3XT14KG0sMCksdGhpc1s4XT14KG4sMCksdGhpc1s5XT14KHMsMCksdGhpc1sxMF09eChsLDApLHRoaXNbMTFdPXgoXywwKSx0aGlzWzEyXT14KG8sMCksdGhpc1sxM109eChmLDApLHRoaXNbMTRdPXgocCwwKSx0aGlzWzE1XT14KGcsMCl9dmFyIEhjLHFjLHNmLE5DLElDLE1tLHgxLHZDLExDLERDLEZDLEJDLFVDLFZDLHN0LFVuPVooKCk9PntGdCgpO2hyKCk7WHQoKTtJdCgpO2Z0KCk7SHQoKTtXdCgpO0JuKCk7SnIoKTtUdC5wYWNrZWRMZW5ndGg9MTY7VHQucGFjaz1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHkudHlwZU9mLm9iamVjdCgidmFsdWUiLHQpLHkuZGVmaW5lZCgiYXJyYXkiLGUpLG49eChuLDApLGVbbisrXT10WzBdLGVbbisrXT10WzFdLGVbbisrXT10WzJdLGVbbisrXT10WzNdLGVbbisrXT10WzRdLGVbbisrXT10WzVdLGVbbisrXT10WzZdLGVbbisrXT10WzddLGVbbisrXT10WzhdLGVbbisrXT10WzldLGVbbisrXT10WzEwXSxlW24rK109dFsxMV0sZVtuKytdPXRbMTJdLGVbbisrXT10WzEzXSxlW24rK109dFsxNF0sZVtuXT10WzE1XSxlfTtUdC51bnBhY2s9ZnVuY3Rpb24odCxlLG4pe3JldHVybiB5LmRlZmluZWQoImFycmF5Iix0KSxlPXgoZSwwKSxoKG4pfHwobj1uZXcgVHQpLG5bMF09dFtlKytdLG5bMV09dFtlKytdLG5bMl09dFtlKytdLG5bM109dFtlKytdLG5bNF09dFtlKytdLG5bNV09dFtlKytdLG5bNl09dFtlKytdLG5bN109dFtlKytdLG5bOF09dFtlKytdLG5bOV09dFtlKytdLG5bMTBdPXRbZSsrXSxuWzExXT10W2UrK10sblsxMl09dFtlKytdLG5bMTNdPXRbZSsrXSxuWzE0XT10W2UrK10sblsxNV09dFtlXSxufTtUdC5wYWNrQXJyYXk9ZnVuY3Rpb24odCxlKXt5LmRlZmluZWQoImFycmF5Iix0KTtsZXQgbj10Lmxlbmd0aCxvPW4qMTY7aWYoIWgoZSkpZT1uZXcgQXJyYXkobyk7ZWxzZXtpZighQXJyYXkuaXNBcnJheShlKSYmZS5sZW5ndGghPT1vKXRocm93IG5ldyBCKCJJZiByZXN1bHQgaXMgYSB0eXBlZCBhcnJheSwgaXQgbXVzdCBoYXZlIGV4YWN0bHkgYXJyYXkubGVuZ3RoICogMTYgZWxlbWVudHMiKTtlLmxlbmd0aCE9PW8mJihlLmxlbmd0aD1vKX1mb3IobGV0IHI9MDtyPG47KytyKVR0LnBhY2sodFtyXSxlLHIqMTYpO3JldHVybiBlfTtUdC51bnBhY2tBcnJheT1mdW5jdGlvbih0LGUpe2lmKHkuZGVmaW5lZCgiYXJyYXkiLHQpLHkudHlwZU9mLm51bWJlci5ncmVhdGVyVGhhbk9yRXF1YWxzKCJhcnJheS5sZW5ndGgiLHQubGVuZ3RoLDE2KSx0Lmxlbmd0aCUxNiE9PTApdGhyb3cgbmV3IEIoImFycmF5IGxlbmd0aCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMTYuIik7bGV0IG49dC5sZW5ndGg7aChlKT9lLmxlbmd0aD1uLzE2OmU9bmV3IEFycmF5KG4vMTYpO2ZvcihsZXQgbz0wO288bjtvKz0xNil7bGV0IHI9by8xNjtlW3JdPVR0LnVucGFjayh0LG8sZVtyXSl9cmV0dXJuIGV9O1R0LmNsb25lPWZ1bmN0aW9uKHQsZSl7aWYoaCh0KSlyZXR1cm4gaChlKT8oZVswXT10WzBdLGVbMV09dFsxXSxlWzJdPXRbMl0sZVszXT10WzNdLGVbNF09dFs0XSxlWzVdPXRbNV0sZVs2XT10WzZdLGVbN109dFs3XSxlWzhdPXRbOF0sZVs5XT10WzldLGVbMTBdPXRbMTBdLGVbMTFdPXRbMTFdLGVbMTJdPXRbMTJdLGVbMTNdPXRbMTNdLGVbMTRdPXRbMTRdLGVbMTVdPXRbMTVdLGUpOm5ldyBUdCh0WzBdLHRbNF0sdFs4XSx0WzEyXSx0WzFdLHRbNV0sdFs5XSx0WzEzXSx0WzJdLHRbNl0sdFsxMF0sdFsxNF0sdFszXSx0WzddLHRbMTFdLHRbMTVdKX07VHQuZnJvbUFycmF5PVR0LnVucGFjaztUdC5mcm9tQ29sdW1uTWFqb3JBcnJheT1mdW5jdGlvbih0LGUpe3JldHVybiB5LmRlZmluZWQoInZhbHVlcyIsdCksVHQuY2xvbmUodCxlKX07VHQuZnJvbVJvd01ham9yQXJyYXk9ZnVuY3Rpb24odCxlKXtyZXR1cm4geS5kZWZpbmVkKCJ2YWx1ZXMiLHQpLGgoZSk/KGVbMF09dFswXSxlWzFdPXRbNF0sZVsyXT10WzhdLGVbM109dFsxMl0sZVs0XT10WzFdLGVbNV09dFs1XSxlWzZdPXRbOV0sZVs3XT10WzEzXSxlWzhdPXRbMl0sZVs5XT10WzZdLGVbMTBdPXRbMTBdLGVbMTFdPXRbMTRdLGVbMTJdPXRbM10sZVsxM109dFs3XSxlWzE0XT10WzExXSxlWzE1XT10WzE1XSxlKTpuZXcgVHQodFswXSx0WzFdLHRbMl0sdFszXSx0WzRdLHRbNV0sdFs2XSx0WzddLHRbOF0sdFs5XSx0WzEwXSx0WzExXSx0WzEyXSx0WzEzXSx0WzE0XSx0WzE1XSl9O1R0LmZyb21Sb3RhdGlvblRyYW5zbGF0aW9uPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4geS50eXBlT2Yub2JqZWN0KCJyb3RhdGlvbiIsdCksZT14KGUsYS5aRVJPKSxoKG4pPyhuWzBdPXRbMF0sblsxXT10WzFdLG5bMl09dFsyXSxuWzNdPTAsbls0XT10WzNdLG5bNV09dFs0XSxuWzZdPXRbNV0sbls3XT0wLG5bOF09dFs2XSxuWzldPXRbN10sblsxMF09dFs4XSxuWzExXT0wLG5bMTJdPWUueCxuWzEzXT1lLnksblsxNF09ZS56LG5bMTVdPTEsbik6bmV3IFR0KHRbMF0sdFszXSx0WzZdLGUueCx0WzFdLHRbNF0sdFs3XSxlLnksdFsyXSx0WzVdLHRbOF0sZS56LDAsMCwwLDEpfTtUdC5mcm9tVHJhbnNsYXRpb25RdWF0ZXJuaW9uUm90YXRpb25TY2FsZT1mdW5jdGlvbih0LGUsbixvKXt5LnR5cGVPZi5vYmplY3QoInRyYW5zbGF0aW9uIix0KSx5LnR5cGVPZi5vYmplY3QoInJvdGF0aW9uIixlKSx5LnR5cGVPZi5vYmplY3QoInNjYWxlIixuKSxoKG8pfHwobz1uZXcgVHQpO2xldCByPW4ueCxpPW4ueSxzPW4ueixmPWUueCplLngsdT1lLngqZS55LGM9ZS54KmUueixsPWUueCplLncscD1lLnkqZS55LGQ9ZS55KmUueixtPWUueSplLncsXz1lLnoqZS56LGc9ZS56KmUudyxiPWUudyplLncsVD1mLXAtXytiLE89MioodS1nKSxFPTIqKGMrbSksdz0yKih1K2cpLEM9LWYrcC1fK2IsTj0yKihkLWwpLEk9MiooYy1tKSxEPTIqKGQrbCksdj0tZi1wK18rYjtyZXR1cm4gb1swXT1UKnIsb1sxXT13KnIsb1syXT1JKnIsb1szXT0wLG9bNF09TyppLG9bNV09QyppLG9bNl09RCppLG9bN109MCxvWzhdPUUqcyxvWzldPU4qcyxvWzEwXT12KnMsb1sxMV09MCxvWzEyXT10Lngsb1sxM109dC55LG9bMTRdPXQueixvWzE1XT0xLG99O1R0LmZyb21UcmFuc2xhdGlvblJvdGF0aW9uU2NhbGU9ZnVuY3Rpb24odCxlKXtyZXR1cm4geS50eXBlT2Yub2JqZWN0KCJ0cmFuc2xhdGlvblJvdGF0aW9uU2NhbGUiLHQpLFR0LmZyb21UcmFuc2xhdGlvblF1YXRlcm5pb25Sb3RhdGlvblNjYWxlKHQudHJhbnNsYXRpb24sdC5yb3RhdGlvbix0LnNjYWxlLGUpfTtUdC5mcm9tVHJhbnNsYXRpb249ZnVuY3Rpb24odCxlKXtyZXR1cm4geS50eXBlT2Yub2JqZWN0KCJ0cmFuc2xhdGlvbiIsdCksVHQuZnJvbVJvdGF0aW9uVHJhbnNsYXRpb24oUS5JREVOVElUWSx0LGUpfTtUdC5mcm9tU2NhbGU9ZnVuY3Rpb24odCxlKXtyZXR1cm4geS50eXBlT2Yub2JqZWN0KCJzY2FsZSIsdCksaChlKT8oZVswXT10LngsZVsxXT0wLGVbMl09MCxlWzNdPTAsZVs0XT0wLGVbNV09dC55LGVbNl09MCxlWzddPTAsZVs4XT0wLGVbOV09MCxlWzEwXT10LnosZVsxMV09MCxlWzEyXT0wLGVbMTNdPTAsZVsxNF09MCxlWzE1XT0xLGUpOm5ldyBUdCh0LngsMCwwLDAsMCx0LnksMCwwLDAsMCx0LnosMCwwLDAsMCwxKX07VHQuZnJvbVVuaWZvcm1TY2FsZT1mdW5jdGlvbih0LGUpe3JldHVybiB5LnR5cGVPZi5udW1iZXIoInNjYWxlIix0KSxoKGUpPyhlWzBdPXQsZVsxXT0wLGVbMl09MCxlWzNdPTAsZVs0XT0wLGVbNV09dCxlWzZdPTAsZVs3XT0wLGVbOF09MCxlWzldPTAsZVsxMF09dCxlWzExXT0wLGVbMTJdPTAsZVsxM109MCxlWzE0XT0wLGVbMTVdPTEsZSk6bmV3IFR0KHQsMCwwLDAsMCx0LDAsMCwwLDAsdCwwLDAsMCwwLDEpfTtUdC5mcm9tUm90YXRpb249ZnVuY3Rpb24odCxlKXtyZXR1cm4geS50eXBlT2Yub2JqZWN0KCJyb3RhdGlvbiIsdCksaChlKXx8KGU9bmV3IFR0KSxlWzBdPXRbMF0sZVsxXT10WzFdLGVbMl09dFsyXSxlWzNdPTAsZVs0XT10WzNdLGVbNV09dFs0XSxlWzZdPXRbNV0sZVs3XT0wLGVbOF09dFs2XSxlWzldPXRbN10sZVsxMF09dFs4XSxlWzExXT0wLGVbMTJdPTAsZVsxM109MCxlWzE0XT0wLGVbMTVdPTEsZX07SGM9bmV3IGEscWM9bmV3IGEsc2Y9bmV3IGE7VHQuZnJvbUNhbWVyYT1mdW5jdGlvbih0LGUpe3kudHlwZU9mLm9iamVjdCgiY2FtZXJhIix0KTtsZXQgbj10LnBvc2l0aW9uLG89dC5kaXJlY3Rpb24scj10LnVwO3kudHlwZU9mLm9iamVjdCgiY2FtZXJhLnBvc2l0aW9uIixuKSx5LnR5cGVPZi5vYmplY3QoImNhbWVyYS5kaXJlY3Rpb24iLG8pLHkudHlwZU9mLm9iamVjdCgiY2FtZXJhLnVwIixyKSxhLm5vcm1hbGl6ZShvLEhjKSxhLm5vcm1hbGl6ZShhLmNyb3NzKEhjLHIscWMpLHFjKSxhLm5vcm1hbGl6ZShhLmNyb3NzKHFjLEhjLHNmKSxzZik7bGV0IGk9cWMueCxzPXFjLnksZj1xYy56LHU9SGMueCxjPUhjLnksbD1IYy56LHA9c2YueCxkPXNmLnksbT1zZi56LF89bi54LGc9bi55LGI9bi56LFQ9aSotXytzKi1nK2YqLWIsTz1wKi1fK2QqLWcrbSotYixFPXUqXytjKmcrbCpiO3JldHVybiBoKGUpPyhlWzBdPWksZVsxXT1wLGVbMl09LXUsZVszXT0wLGVbNF09cyxlWzVdPWQsZVs2XT0tYyxlWzddPTAsZVs4XT1mLGVbOV09bSxlWzEwXT0tbCxlWzExXT0wLGVbMTJdPVQsZVsxM109TyxlWzE0XT1FLGVbMTVdPTEsZSk6bmV3IFR0KGkscyxmLFQscCxkLG0sTywtdSwtYywtbCxFLDAsMCwwLDEpfTtUdC5jb21wdXRlUGVyc3BlY3RpdmVGaWVsZE9mVmlldz1mdW5jdGlvbih0LGUsbixvLHIpe3kudHlwZU9mLm51bWJlci5ncmVhdGVyVGhhbigiZm92WSIsdCwwKSx5LnR5cGVPZi5udW1iZXIubGVzc1RoYW4oImZvdlkiLHQsTWF0aC5QSSkseS50eXBlT2YubnVtYmVyLmdyZWF0ZXJUaGFuKCJuZWFyIixuLDApLHkudHlwZU9mLm51bWJlci5ncmVhdGVyVGhhbigiZmFyIixvLDApLHkudHlwZU9mLm9iamVjdCgicmVzdWx0IixyKTtsZXQgcz0xL01hdGgudGFuKHQqLjUpLGY9cy9lLHU9KG8rbikvKG4tbyksYz0yKm8qbi8obi1vKTtyZXR1cm4gclswXT1mLHJbMV09MCxyWzJdPTAsclszXT0wLHJbNF09MCxyWzVdPXMscls2XT0wLHJbN109MCxyWzhdPTAscls5XT0wLHJbMTBdPXUsclsxMV09LTEsclsxMl09MCxyWzEzXT0wLHJbMTRdPWMsclsxNV09MCxyfTtUdC5jb21wdXRlT3J0aG9ncmFwaGljT2ZmQ2VudGVyPWZ1bmN0aW9uKHQsZSxuLG8scixpLHMpe3kudHlwZU9mLm51bWJlcigibGVmdCIsdCkseS50eXBlT2YubnVtYmVyKCJyaWdodCIsZSkseS50eXBlT2YubnVtYmVyKCJib3R0b20iLG4pLHkudHlwZU9mLm51bWJlcigidG9wIixvKSx5LnR5cGVPZi5udW1iZXIoIm5lYXIiLHIpLHkudHlwZU9mLm51bWJlcigiZmFyIixpKSx5LnR5cGVPZi5vYmplY3QoInJlc3VsdCIscyk7bGV0IGY9MS8oZS10KSx1PTEvKG8tbiksYz0xLyhpLXIpLGw9LShlK3QpKmYscD0tKG8rbikqdSxkPS0oaStyKSpjO3JldHVybiBmKj0yLHUqPTIsYyo9LTIsc1swXT1mLHNbMV09MCxzWzJdPTAsc1szXT0wLHNbNF09MCxzWzVdPXUsc1s2XT0wLHNbN109MCxzWzhdPTAsc1s5XT0wLHNbMTBdPWMsc1sxMV09MCxzWzEyXT1sLHNbMTNdPXAsc1sxNF09ZCxzWzE1XT0xLHN9O1R0LmNvbXB1dGVQZXJzcGVjdGl2ZU9mZkNlbnRlcj1mdW5jdGlvbih0LGUsbixvLHIsaSxzKXt5LnR5cGVPZi5udW1iZXIoImxlZnQiLHQpLHkudHlwZU9mLm51bWJlcigicmlnaHQiLGUpLHkudHlwZU9mLm51bWJlcigiYm90dG9tIixuKSx5LnR5cGVPZi5udW1iZXIoInRvcCIsbykseS50eXBlT2YubnVtYmVyKCJuZWFyIixyKSx5LnR5cGVPZi5udW1iZXIoImZhciIsaSkseS50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLHMpO2xldCBmPTIqci8oZS10KSx1PTIqci8oby1uKSxjPShlK3QpLyhlLXQpLGw9KG8rbikvKG8tbikscD0tKGkrcikvKGktciksZD0tMSxtPS0yKmkqci8oaS1yKTtyZXR1cm4gc1swXT1mLHNbMV09MCxzWzJdPTAsc1szXT0wLHNbNF09MCxzWzVdPXUsc1s2XT0wLHNbN109MCxzWzhdPWMsc1s5XT1sLHNbMTBdPXAsc1sxMV09ZCxzWzEyXT0wLHNbMTNdPTAsc1sxNF09bSxzWzE1XT0wLHN9O1R0LmNvbXB1dGVJbmZpbml0ZVBlcnNwZWN0aXZlT2ZmQ2VudGVyPWZ1bmN0aW9uKHQsZSxuLG8scixpKXt5LnR5cGVPZi5udW1iZXIoImxlZnQiLHQpLHkudHlwZU9mLm51bWJlcigicmlnaHQiLGUpLHkudHlwZU9mLm51bWJlcigiYm90dG9tIixuKSx5LnR5cGVPZi5udW1iZXIoInRvcCIsbykseS50eXBlT2YubnVtYmVyKCJuZWFyIixyKSx5LnR5cGVPZi5vYmplY3QoInJlc3VsdCIsaSk7bGV0IHM9MipyLyhlLXQpLGY9MipyLyhvLW4pLHU9KGUrdCkvKGUtdCksYz0obytuKS8oby1uKSxsPS0xLHA9LTEsZD0tMipyO3JldHVybiBpWzBdPXMsaVsxXT0wLGlbMl09MCxpWzNdPTAsaVs0XT0wLGlbNV09ZixpWzZdPTAsaVs3XT0wLGlbOF09dSxpWzldPWMsaVsxMF09bCxpWzExXT1wLGlbMTJdPTAsaVsxM109MCxpWzE0XT1kLGlbMTVdPTAsaX07VHQuY29tcHV0ZVZpZXdwb3J0VHJhbnNmb3JtYXRpb249ZnVuY3Rpb24odCxlLG4sbyl7aChvKXx8KG89bmV3IFR0KSx0PXgodCx4LkVNUFRZX09CSkVDVCk7bGV0IHI9eCh0LngsMCksaT14KHQueSwwKSxzPXgodC53aWR0aCwwKSxmPXgodC5oZWlnaHQsMCk7ZT14KGUsMCksbj14KG4sMSk7bGV0IHU9cyouNSxjPWYqLjUsbD0obi1lKSouNSxwPXUsZD1jLG09bCxfPXIrdSxnPWkrYyxiPWUrbCxUPTE7cmV0dXJuIG9bMF09cCxvWzFdPTAsb1syXT0wLG9bM109MCxvWzRdPTAsb1s1XT1kLG9bNl09MCxvWzddPTAsb1s4XT0wLG9bOV09MCxvWzEwXT1tLG9bMTFdPTAsb1sxMl09XyxvWzEzXT1nLG9bMTRdPWIsb1sxNV09VCxvfTtUdC5jb21wdXRlVmlldz1mdW5jdGlvbih0LGUsbixvLHIpe3JldHVybiB5LnR5cGVPZi5vYmplY3QoInBvc2l0aW9uIix0KSx5LnR5cGVPZi5vYmplY3QoImRpcmVjdGlvbiIsZSkseS50eXBlT2Yub2JqZWN0KCJ1cCIsbikseS50eXBlT2Yub2JqZWN0KCJyaWdodCIsbykseS50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLHIpLHJbMF09by54LHJbMV09bi54LHJbMl09LWUueCxyWzNdPTAscls0XT1vLnkscls1XT1uLnkscls2XT0tZS55LHJbN109MCxyWzhdPW8ueixyWzldPW4ueixyWzEwXT0tZS56LHJbMTFdPTAsclsxMl09LWEuZG90KG8sdCksclsxM109LWEuZG90KG4sdCksclsxNF09YS5kb3QoZSx0KSxyWzE1XT0xLHJ9O1R0LnRvQXJyYXk9ZnVuY3Rpb24odCxlKXtyZXR1cm4geS50eXBlT2Yub2JqZWN0KCJtYXRyaXgiLHQpLGgoZSk/KGVbMF09dFswXSxlWzFdPXRbMV0sZVsyXT10WzJdLGVbM109dFszXSxlWzRdPXRbNF0sZVs1XT10WzVdLGVbNl09dFs2XSxlWzddPXRbN10sZVs4XT10WzhdLGVbOV09dFs5XSxlWzEwXT10WzEwXSxlWzExXT10WzExXSxlWzEyXT10WzEyXSxlWzEzXT10WzEzXSxlWzE0XT10WzE0XSxlWzE1XT10WzE1XSxlKTpbdFswXSx0WzFdLHRbMl0sdFszXSx0WzRdLHRbNV0sdFs2XSx0WzddLHRbOF0sdFs5XSx0WzEwXSx0WzExXSx0WzEyXSx0WzEzXSx0WzE0XSx0WzE1XV19O1R0LmdldEVsZW1lbnRJbmRleD1mdW5jdGlvbih0LGUpe3JldHVybiB5LnR5cGVPZi5udW1iZXIuZ3JlYXRlclRoYW5PckVxdWFscygicm93IixlLDApLHkudHlwZU9mLm51bWJlci5sZXNzVGhhbk9yRXF1YWxzKCJyb3ciLGUsMykseS50eXBlT2YubnVtYmVyLmdyZWF0ZXJUaGFuT3JFcXVhbHMoImNvbHVtbiIsdCwwKSx5LnR5cGVPZi5udW1iZXIubGVzc1RoYW5PckVxdWFscygiY29sdW1uIix0LDMpLHQqNCtlfTtUdC5nZXRDb2x1bW49ZnVuY3Rpb24odCxlLG4pe3kudHlwZU9mLm9iamVjdCgibWF0cml4Iix0KSx5LnR5cGVPZi5udW1iZXIuZ3JlYXRlclRoYW5PckVxdWFscygiaW5kZXgiLGUsMCkseS50eXBlT2YubnVtYmVyLmxlc3NUaGFuT3JFcXVhbHMoImluZGV4IixlLDMpLHkudHlwZU9mLm9iamVjdCgicmVzdWx0IixuKTtsZXQgbz1lKjQscj10W29dLGk9dFtvKzFdLHM9dFtvKzJdLGY9dFtvKzNdO3JldHVybiBuLng9cixuLnk9aSxuLno9cyxuLnc9ZixufTtUdC5zZXRDb2x1bW49ZnVuY3Rpb24odCxlLG4sbyl7eS50eXBlT2Yub2JqZWN0KCJtYXRyaXgiLHQpLHkudHlwZU9mLm51bWJlci5ncmVhdGVyVGhhbk9yRXF1YWxzKCJpbmRleCIsZSwwKSx5LnR5cGVPZi5udW1iZXIubGVzc1RoYW5PckVxdWFscygiaW5kZXgiLGUsMykseS50eXBlT2Yub2JqZWN0KCJjYXJ0ZXNpYW4iLG4pLHkudHlwZU9mLm9iamVjdCgicmVzdWx0IixvKSxvPVR0LmNsb25lKHQsbyk7bGV0IHI9ZSo0O3JldHVybiBvW3JdPW4ueCxvW3IrMV09bi55LG9bcisyXT1uLnosb1tyKzNdPW4udyxvfTtUdC5nZXRSb3c9ZnVuY3Rpb24odCxlLG4pe3kudHlwZU9mLm9iamVjdCgibWF0cml4Iix0KSx5LnR5cGVPZi5udW1iZXIuZ3JlYXRlclRoYW5PckVxdWFscygiaW5kZXgiLGUsMCkseS50eXBlT2YubnVtYmVyLmxlc3NUaGFuT3JFcXVhbHMoImluZGV4IixlLDMpLHkudHlwZU9mLm9iamVjdCgicmVzdWx0IixuKTtsZXQgbz10W2VdLHI9dFtlKzRdLGk9dFtlKzhdLHM9dFtlKzEyXTtyZXR1cm4gbi54PW8sbi55PXIsbi56PWksbi53PXMsbn07VHQuc2V0Um93PWZ1bmN0aW9uKHQsZSxuLG8pe3JldHVybiB5LnR5cGVPZi5vYmplY3QoIm1hdHJpeCIsdCkseS50eXBlT2YubnVtYmVyLmdyZWF0ZXJUaGFuT3JFcXVhbHMoImluZGV4IixlLDApLHkudHlwZU9mLm51bWJlci5sZXNzVGhhbk9yRXF1YWxzKCJpbmRleCIsZSwzKSx5LnR5cGVPZi5vYmplY3QoImNhcnRlc2lhbiIsbikseS50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLG8pLG89VHQuY2xvbmUodCxvKSxvW2VdPW4ueCxvW2UrNF09bi55LG9bZSs4XT1uLnosb1tlKzEyXT1uLncsb307VHQuc2V0VHJhbnNsYXRpb249ZnVuY3Rpb24odCxlLG4pe3JldHVybiB5LnR5cGVPZi5vYmplY3QoIm1hdHJpeCIsdCkseS50eXBlT2Yub2JqZWN0KCJ0cmFuc2xhdGlvbiIsZSkseS50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLG4pLG5bMF09dFswXSxuWzFdPXRbMV0sblsyXT10WzJdLG5bM109dFszXSxuWzRdPXRbNF0sbls1XT10WzVdLG5bNl09dFs2XSxuWzddPXRbN10sbls4XT10WzhdLG5bOV09dFs5XSxuWzEwXT10WzEwXSxuWzExXT10WzExXSxuWzEyXT1lLngsblsxM109ZS55LG5bMTRdPWUueixuWzE1XT10WzE1XSxufTtOQz1uZXcgYTtUdC5zZXRTY2FsZT1mdW5jdGlvbih0LGUsbil7eS50eXBlT2Yub2JqZWN0KCJtYXRyaXgiLHQpLHkudHlwZU9mLm9iamVjdCgic2NhbGUiLGUpLHkudHlwZU9mLm9iamVjdCgicmVzdWx0IixuKTtsZXQgbz1UdC5nZXRTY2FsZSh0LE5DKSxyPWUueC9vLngsaT1lLnkvby55LHM9ZS56L28uejtyZXR1cm4gblswXT10WzBdKnIsblsxXT10WzFdKnIsblsyXT10WzJdKnIsblszXT10WzNdLG5bNF09dFs0XSppLG5bNV09dFs1XSppLG5bNl09dFs2XSppLG5bN109dFs3XSxuWzhdPXRbOF0qcyxuWzldPXRbOV0qcyxuWzEwXT10WzEwXSpzLG5bMTFdPXRbMTFdLG5bMTJdPXRbMTJdLG5bMTNdPXRbMTNdLG5bMTRdPXRbMTRdLG5bMTVdPXRbMTVdLG59O0lDPW5ldyBhO1R0LnNldFVuaWZvcm1TY2FsZT1mdW5jdGlvbih0LGUsbil7eS50eXBlT2Yub2JqZWN0KCJtYXRyaXgiLHQpLHkudHlwZU9mLm51bWJlcigic2NhbGUiLGUpLHkudHlwZU9mLm9iamVjdCgicmVzdWx0IixuKTtsZXQgbz1UdC5nZXRTY2FsZSh0LElDKSxyPWUvby54LGk9ZS9vLnkscz1lL28uejtyZXR1cm4gblswXT10WzBdKnIsblsxXT10WzFdKnIsblsyXT10WzJdKnIsblszXT10WzNdLG5bNF09dFs0XSppLG5bNV09dFs1XSppLG5bNl09dFs2XSppLG5bN109dFs3XSxuWzhdPXRbOF0qcyxuWzldPXRbOV0qcyxuWzEwXT10WzEwXSpzLG5bMTFdPXRbMTFdLG5bMTJdPXRbMTJdLG5bMTNdPXRbMTNdLG5bMTRdPXRbMTRdLG5bMTVdPXRbMTVdLG59O01tPW5ldyBhO1R0LmdldFNjYWxlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHkudHlwZU9mLm9iamVjdCgibWF0cml4Iix0KSx5LnR5cGVPZi5vYmplY3QoInJlc3VsdCIsZSksZS54PWEubWFnbml0dWRlKGEuZnJvbUVsZW1lbnRzKHRbMF0sdFsxXSx0WzJdLE1tKSksZS55PWEubWFnbml0dWRlKGEuZnJvbUVsZW1lbnRzKHRbNF0sdFs1XSx0WzZdLE1tKSksZS56PWEubWFnbml0dWRlKGEuZnJvbUVsZW1lbnRzKHRbOF0sdFs5XSx0WzEwXSxNbSkpLGV9O3gxPW5ldyBhO1R0LmdldE1heGltdW1TY2FsZT1mdW5jdGlvbih0KXtyZXR1cm4gVHQuZ2V0U2NhbGUodCx4MSksYS5tYXhpbXVtQ29tcG9uZW50KHgxKX07dkM9bmV3IGE7VHQuc2V0Um90YXRpb249ZnVuY3Rpb24odCxlLG4pe3kudHlwZU9mLm9iamVjdCgibWF0cml4Iix0KSx5LnR5cGVPZi5vYmplY3QoInJlc3VsdCIsbik7bGV0IG89VHQuZ2V0U2NhbGUodCx2Qyk7cmV0dXJuIG5bMF09ZVswXSpvLngsblsxXT1lWzFdKm8ueCxuWzJdPWVbMl0qby54LG5bM109dFszXSxuWzRdPWVbM10qby55LG5bNV09ZVs0XSpvLnksbls2XT1lWzVdKm8ueSxuWzddPXRbN10sbls4XT1lWzZdKm8ueixuWzldPWVbN10qby56LG5bMTBdPWVbOF0qby56LG5bMTFdPXRbMTFdLG5bMTJdPXRbMTJdLG5bMTNdPXRbMTNdLG5bMTRdPXRbMTRdLG5bMTVdPXRbMTVdLG59O0xDPW5ldyBhO1R0LmdldFJvdGF0aW9uPWZ1bmN0aW9uKHQsZSl7eS50eXBlT2Yub2JqZWN0KCJtYXRyaXgiLHQpLHkudHlwZU9mLm9iamVjdCgicmVzdWx0IixlKTtsZXQgbj1UdC5nZXRTY2FsZSh0LExDKTtyZXR1cm4gZVswXT10WzBdL24ueCxlWzFdPXRbMV0vbi54LGVbMl09dFsyXS9uLngsZVszXT10WzRdL24ueSxlWzRdPXRbNV0vbi55LGVbNV09dFs2XS9uLnksZVs2XT10WzhdL24ueixlWzddPXRbOV0vbi56LGVbOF09dFsxMF0vbi56LGV9O1R0Lm11bHRpcGx5PWZ1bmN0aW9uKHQsZSxuKXt5LnR5cGVPZi5vYmplY3QoImxlZnQiLHQpLHkudHlwZU9mLm9iamVjdCgicmlnaHQiLGUpLHkudHlwZU9mLm9iamVjdCgicmVzdWx0IixuKTtsZXQgbz10WzBdLHI9dFsxXSxpPXRbMl0scz10WzNdLGY9dFs0XSx1PXRbNV0sYz10WzZdLGw9dFs3XSxwPXRbOF0sZD10WzldLG09dFsxMF0sXz10WzExXSxnPXRbMTJdLGI9dFsxM10sVD10WzE0XSxPPXRbMTVdLEU9ZVswXSx3PWVbMV0sQz1lWzJdLE49ZVszXSxJPWVbNF0sRD1lWzVdLHY9ZVs2XSxMPWVbN10sVT1lWzhdLEE9ZVs5XSxTPWVbMTBdLFA9ZVsxMV0sRj1lWzEyXSxqPWVbMTNdLEg9ZVsxNF0saz1lWzE1XSxLPW8qRStmKncrcCpDK2cqTixYPXIqRSt1KncrZCpDK2IqTixSPWkqRStjKncrbSpDK1QqTixvdD1zKkUrbCp3K18qQytPKk4sYXQ9bypJK2YqRCtwKnYrZypMLHB0PXIqSSt1KkQrZCp2K2IqTCx5dD1pKkkrYypEK20qditUKkwscnQ9cypJK2wqRCtfKnYrTypMLFB0PW8qVStmKkErcCpTK2cqUCxndD1yKlUrdSpBK2QqUytiKlAsQ3Q9aSpVK2MqQSttKlMrVCpQLG10PXMqVStsKkErXypTK08qUCx1dD1vKkYrZipqK3AqSCtnKmssdnQ9cipGK3UqaitkKkgrYiprLHp0PWkqRitjKmorbSpIK1QqayxtZT1zKkYrbCpqK18qSCtPKms7cmV0dXJuIG5bMF09SyxuWzFdPVgsblsyXT1SLG5bM109b3Qsbls0XT1hdCxuWzVdPXB0LG5bNl09eXQsbls3XT1ydCxuWzhdPVB0LG5bOV09Z3QsblsxMF09Q3QsblsxMV09bXQsblsxMl09dXQsblsxM109dnQsblsxNF09enQsblsxNV09bWUsbn07VHQuYWRkPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4geS50eXBlT2Yub2JqZWN0KCJsZWZ0Iix0KSx5LnR5cGVPZi5vYmplY3QoInJpZ2h0IixlKSx5LnR5cGVPZi5vYmplY3QoInJlc3VsdCIsbiksblswXT10WzBdK2VbMF0sblsxXT10WzFdK2VbMV0sblsyXT10WzJdK2VbMl0sblszXT10WzNdK2VbM10sbls0XT10WzRdK2VbNF0sbls1XT10WzVdK2VbNV0sbls2XT10WzZdK2VbNl0sbls3XT10WzddK2VbN10sbls4XT10WzhdK2VbOF0sbls5XT10WzldK2VbOV0sblsxMF09dFsxMF0rZVsxMF0sblsxMV09dFsxMV0rZVsxMV0sblsxMl09dFsxMl0rZVsxMl0sblsxM109dFsxM10rZVsxM10sblsxNF09dFsxNF0rZVsxNF0sblsxNV09dFsxNV0rZVsxNV0sbn07VHQuc3VidHJhY3Q9ZnVuY3Rpb24odCxlLG4pe3JldHVybiB5LnR5cGVPZi5vYmplY3QoImxlZnQiLHQpLHkudHlwZU9mLm9iamVjdCgicmlnaHQiLGUpLHkudHlwZU9mLm9iamVjdCgicmVzdWx0IixuKSxuWzBdPXRbMF0tZVswXSxuWzFdPXRbMV0tZVsxXSxuWzJdPXRbMl0tZVsyXSxuWzNdPXRbM10tZVszXSxuWzRdPXRbNF0tZVs0XSxuWzVdPXRbNV0tZVs1XSxuWzZdPXRbNl0tZVs2XSxuWzddPXRbN10tZVs3XSxuWzhdPXRbOF0tZVs4XSxuWzldPXRbOV0tZVs5XSxuWzEwXT10WzEwXS1lWzEwXSxuWzExXT10WzExXS1lWzExXSxuWzEyXT10WzEyXS1lWzEyXSxuWzEzXT10WzEzXS1lWzEzXSxuWzE0XT10WzE0XS1lWzE0XSxuWzE1XT10WzE1XS1lWzE1XSxufTtUdC5tdWx0aXBseVRyYW5zZm9ybWF0aW9uPWZ1bmN0aW9uKHQsZSxuKXt5LnR5cGVPZi5vYmplY3QoImxlZnQiLHQpLHkudHlwZU9mLm9iamVjdCgicmlnaHQiLGUpLHkudHlwZU9mLm9iamVjdCgicmVzdWx0IixuKTtsZXQgbz10WzBdLHI9dFsxXSxpPXRbMl0scz10WzRdLGY9dFs1XSx1PXRbNl0sYz10WzhdLGw9dFs5XSxwPXRbMTBdLGQ9dFsxMl0sbT10WzEzXSxfPXRbMTRdLGc9ZVswXSxiPWVbMV0sVD1lWzJdLE89ZVs0XSxFPWVbNV0sdz1lWzZdLEM9ZVs4XSxOPWVbOV0sST1lWzEwXSxEPWVbMTJdLHY9ZVsxM10sTD1lWzE0XSxVPW8qZytzKmIrYypULEE9cipnK2YqYitsKlQsUz1pKmcrdSpiK3AqVCxQPW8qTytzKkUrYyp3LEY9cipPK2YqRStsKncsaj1pKk8rdSpFK3AqdyxIPW8qQytzKk4rYypJLGs9cipDK2YqTitsKkksSz1pKkMrdSpOK3AqSSxYPW8qRCtzKnYrYypMK2QsUj1yKkQrZip2K2wqTCttLG90PWkqRCt1KnYrcCpMK187cmV0dXJuIG5bMF09VSxuWzFdPUEsblsyXT1TLG5bM109MCxuWzRdPVAsbls1XT1GLG5bNl09aixuWzddPTAsbls4XT1ILG5bOV09ayxuWzEwXT1LLG5bMTFdPTAsblsxMl09WCxuWzEzXT1SLG5bMTRdPW90LG5bMTVdPTEsbn07VHQubXVsdGlwbHlCeU1hdHJpeDM9ZnVuY3Rpb24odCxlLG4pe3kudHlwZU9mLm9iamVjdCgibWF0cml4Iix0KSx5LnR5cGVPZi5vYmplY3QoInJvdGF0aW9uIixlKSx5LnR5cGVPZi5vYmplY3QoInJlc3VsdCIsbik7bGV0IG89dFswXSxyPXRbMV0saT10WzJdLHM9dFs0XSxmPXRbNV0sdT10WzZdLGM9dFs4XSxsPXRbOV0scD10WzEwXSxkPWVbMF0sbT1lWzFdLF89ZVsyXSxnPWVbM10sYj1lWzRdLFQ9ZVs1XSxPPWVbNl0sRT1lWzddLHc9ZVs4XSxDPW8qZCtzKm0rYypfLE49cipkK2YqbStsKl8sST1pKmQrdSptK3AqXyxEPW8qZytzKmIrYypULHY9cipnK2YqYitsKlQsTD1pKmcrdSpiK3AqVCxVPW8qTytzKkUrYyp3LEE9cipPK2YqRStsKncsUz1pKk8rdSpFK3AqdztyZXR1cm4gblswXT1DLG5bMV09TixuWzJdPUksblszXT0wLG5bNF09RCxuWzVdPXYsbls2XT1MLG5bN109MCxuWzhdPVUsbls5XT1BLG5bMTBdPVMsblsxMV09MCxuWzEyXT10WzEyXSxuWzEzXT10WzEzXSxuWzE0XT10WzE0XSxuWzE1XT10WzE1XSxufTtUdC5tdWx0aXBseUJ5VHJhbnNsYXRpb249ZnVuY3Rpb24odCxlLG4pe3kudHlwZU9mLm9iamVjdCgibWF0cml4Iix0KSx5LnR5cGVPZi5vYmplY3QoInRyYW5zbGF0aW9uIixlKSx5LnR5cGVPZi5vYmplY3QoInJlc3VsdCIsbik7bGV0IG89ZS54LHI9ZS55LGk9ZS56LHM9byp0WzBdK3IqdFs0XStpKnRbOF0rdFsxMl0sZj1vKnRbMV0rcip0WzVdK2kqdFs5XSt0WzEzXSx1PW8qdFsyXStyKnRbNl0raSp0WzEwXSt0WzE0XTtyZXR1cm4gblswXT10WzBdLG5bMV09dFsxXSxuWzJdPXRbMl0sblszXT10WzNdLG5bNF09dFs0XSxuWzVdPXRbNV0sbls2XT10WzZdLG5bN109dFs3XSxuWzhdPXRbOF0sbls5XT10WzldLG5bMTBdPXRbMTBdLG5bMTFdPXRbMTFdLG5bMTJdPXMsblsxM109ZixuWzE0XT11LG5bMTVdPXRbMTVdLG59O1R0Lm11bHRpcGx5QnlTY2FsZT1mdW5jdGlvbih0LGUsbil7eS50eXBlT2Yub2JqZWN0KCJtYXRyaXgiLHQpLHkudHlwZU9mLm9iamVjdCgic2NhbGUiLGUpLHkudHlwZU9mLm9iamVjdCgicmVzdWx0IixuKTtsZXQgbz1lLngscj1lLnksaT1lLno7cmV0dXJuIG89PT0xJiZyPT09MSYmaT09PTE/VHQuY2xvbmUodCxuKTooblswXT1vKnRbMF0sblsxXT1vKnRbMV0sblsyXT1vKnRbMl0sblszXT10WzNdLG5bNF09cip0WzRdLG5bNV09cip0WzVdLG5bNl09cip0WzZdLG5bN109dFs3XSxuWzhdPWkqdFs4XSxuWzldPWkqdFs5XSxuWzEwXT1pKnRbMTBdLG5bMTFdPXRbMTFdLG5bMTJdPXRbMTJdLG5bMTNdPXRbMTNdLG5bMTRdPXRbMTRdLG5bMTVdPXRbMTVdLG4pfTtUdC5tdWx0aXBseUJ5VW5pZm9ybVNjYWxlPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4geS50eXBlT2Yub2JqZWN0KCJtYXRyaXgiLHQpLHkudHlwZU9mLm51bWJlcigic2NhbGUiLGUpLHkudHlwZU9mLm9iamVjdCgicmVzdWx0IixuKSxuWzBdPXRbMF0qZSxuWzFdPXRbMV0qZSxuWzJdPXRbMl0qZSxuWzNdPXRbM10sbls0XT10WzRdKmUsbls1XT10WzVdKmUsbls2XT10WzZdKmUsbls3XT10WzddLG5bOF09dFs4XSplLG5bOV09dFs5XSplLG5bMTBdPXRbMTBdKmUsblsxMV09dFsxMV0sblsxMl09dFsxMl0sblsxM109dFsxM10sblsxNF09dFsxNF0sblsxNV09dFsxNV0sbn07VHQubXVsdGlwbHlCeVZlY3Rvcj1mdW5jdGlvbih0LGUsbil7eS50eXBlT2Yub2JqZWN0KCJtYXRyaXgiLHQpLHkudHlwZU9mLm9iamVjdCgiY2FydGVzaWFuIixlKSx5LnR5cGVPZi5vYmplY3QoInJlc3VsdCIsbik7bGV0IG89ZS54LHI9ZS55LGk9ZS56LHM9ZS53LGY9dFswXSpvK3RbNF0qcit0WzhdKmkrdFsxMl0qcyx1PXRbMV0qbyt0WzVdKnIrdFs5XSppK3RbMTNdKnMsYz10WzJdKm8rdFs2XSpyK3RbMTBdKmkrdFsxNF0qcyxsPXRbM10qbyt0WzddKnIrdFsxMV0qaSt0WzE1XSpzO3JldHVybiBuLng9ZixuLnk9dSxuLno9YyxuLnc9bCxufTtUdC5tdWx0aXBseUJ5UG9pbnRBc1ZlY3Rvcj1mdW5jdGlvbih0LGUsbil7eS50eXBlT2Yub2JqZWN0KCJtYXRyaXgiLHQpLHkudHlwZU9mLm9iamVjdCgiY2FydGVzaWFuIixlKSx5LnR5cGVPZi5vYmplY3QoInJlc3VsdCIsbik7bGV0IG89ZS54LHI9ZS55LGk9ZS56LHM9dFswXSpvK3RbNF0qcit0WzhdKmksZj10WzFdKm8rdFs1XSpyK3RbOV0qaSx1PXRbMl0qbyt0WzZdKnIrdFsxMF0qaTtyZXR1cm4gbi54PXMsbi55PWYsbi56PXUsbn07VHQubXVsdGlwbHlCeVBvaW50PWZ1bmN0aW9uKHQsZSxuKXt5LnR5cGVPZi5vYmplY3QoIm1hdHJpeCIsdCkseS50eXBlT2Yub2JqZWN0KCJjYXJ0ZXNpYW4iLGUpLHkudHlwZU9mLm9iamVjdCgicmVzdWx0IixuKTtsZXQgbz1lLngscj1lLnksaT1lLnoscz10WzBdKm8rdFs0XSpyK3RbOF0qaSt0WzEyXSxmPXRbMV0qbyt0WzVdKnIrdFs5XSppK3RbMTNdLHU9dFsyXSpvK3RbNl0qcit0WzEwXSppK3RbMTRdO3JldHVybiBuLng9cyxuLnk9ZixuLno9dSxufTtUdC5tdWx0aXBseUJ5U2NhbGFyPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4geS50eXBlT2Yub2JqZWN0KCJtYXRyaXgiLHQpLHkudHlwZU9mLm51bWJlcigic2NhbGFyIixlKSx5LnR5cGVPZi5vYmplY3QoInJlc3VsdCIsbiksblswXT10WzBdKmUsblsxXT10WzFdKmUsblsyXT10WzJdKmUsblszXT10WzNdKmUsbls0XT10WzRdKmUsbls1XT10WzVdKmUsbls2XT10WzZdKmUsbls3XT10WzddKmUsbls4XT10WzhdKmUsbls5XT10WzldKmUsblsxMF09dFsxMF0qZSxuWzExXT10WzExXSplLG5bMTJdPXRbMTJdKmUsblsxM109dFsxM10qZSxuWzE0XT10WzE0XSplLG5bMTVdPXRbMTVdKmUsbn07VHQubmVnYXRlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHkudHlwZU9mLm9iamVjdCgibWF0cml4Iix0KSx5LnR5cGVPZi5vYmplY3QoInJlc3VsdCIsZSksZVswXT0tdFswXSxlWzFdPS10WzFdLGVbMl09LXRbMl0sZVszXT0tdFszXSxlWzRdPS10WzRdLGVbNV09LXRbNV0sZVs2XT0tdFs2XSxlWzddPS10WzddLGVbOF09LXRbOF0sZVs5XT0tdFs5XSxlWzEwXT0tdFsxMF0sZVsxMV09LXRbMTFdLGVbMTJdPS10WzEyXSxlWzEzXT0tdFsxM10sZVsxNF09LXRbMTRdLGVbMTVdPS10WzE1XSxlfTtUdC50cmFuc3Bvc2U9ZnVuY3Rpb24odCxlKXt5LnR5cGVPZi5vYmplY3QoIm1hdHJpeCIsdCkseS50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLGUpO2xldCBuPXRbMV0sbz10WzJdLHI9dFszXSxpPXRbNl0scz10WzddLGY9dFsxMV07cmV0dXJuIGVbMF09dFswXSxlWzFdPXRbNF0sZVsyXT10WzhdLGVbM109dFsxMl0sZVs0XT1uLGVbNV09dFs1XSxlWzZdPXRbOV0sZVs3XT10WzEzXSxlWzhdPW8sZVs5XT1pLGVbMTBdPXRbMTBdLGVbMTFdPXRbMTRdLGVbMTJdPXIsZVsxM109cyxlWzE0XT1mLGVbMTVdPXRbMTVdLGV9O1R0LmFicz1mdW5jdGlvbih0LGUpe3JldHVybiB5LnR5cGVPZi5vYmplY3QoIm1hdHJpeCIsdCkseS50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLGUpLGVbMF09TWF0aC5hYnModFswXSksZVsxXT1NYXRoLmFicyh0WzFdKSxlWzJdPU1hdGguYWJzKHRbMl0pLGVbM109TWF0aC5hYnModFszXSksZVs0XT1NYXRoLmFicyh0WzRdKSxlWzVdPU1hdGguYWJzKHRbNV0pLGVbNl09TWF0aC5hYnModFs2XSksZVs3XT1NYXRoLmFicyh0WzddKSxlWzhdPU1hdGguYWJzKHRbOF0pLGVbOV09TWF0aC5hYnModFs5XSksZVsxMF09TWF0aC5hYnModFsxMF0pLGVbMTFdPU1hdGguYWJzKHRbMTFdKSxlWzEyXT1NYXRoLmFicyh0WzEyXSksZVsxM109TWF0aC5hYnModFsxM10pLGVbMTRdPU1hdGguYWJzKHRbMTRdKSxlWzE1XT1NYXRoLmFicyh0WzE1XSksZX07VHQuZXF1YWxzPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQ9PT1lfHxoKHQpJiZoKGUpJiZ0WzEyXT09PWVbMTJdJiZ0WzEzXT09PWVbMTNdJiZ0WzE0XT09PWVbMTRdJiZ0WzBdPT09ZVswXSYmdFsxXT09PWVbMV0mJnRbMl09PT1lWzJdJiZ0WzRdPT09ZVs0XSYmdFs1XT09PWVbNV0mJnRbNl09PT1lWzZdJiZ0WzhdPT09ZVs4XSYmdFs5XT09PWVbOV0mJnRbMTBdPT09ZVsxMF0mJnRbM109PT1lWzNdJiZ0WzddPT09ZVs3XSYmdFsxMV09PT1lWzExXSYmdFsxNV09PT1lWzE1XX07VHQuZXF1YWxzRXBzaWxvbj1mdW5jdGlvbih0LGUsbil7cmV0dXJuIG49eChuLDApLHQ9PT1lfHxoKHQpJiZoKGUpJiZNYXRoLmFicyh0WzBdLWVbMF0pPD1uJiZNYXRoLmFicyh0WzFdLWVbMV0pPD1uJiZNYXRoLmFicyh0WzJdLWVbMl0pPD1uJiZNYXRoLmFicyh0WzNdLWVbM10pPD1uJiZNYXRoLmFicyh0WzRdLWVbNF0pPD1uJiZNYXRoLmFicyh0WzVdLWVbNV0pPD1uJiZNYXRoLmFicyh0WzZdLWVbNl0pPD1uJiZNYXRoLmFicyh0WzddLWVbN10pPD1uJiZNYXRoLmFicyh0WzhdLWVbOF0pPD1uJiZNYXRoLmFicyh0WzldLWVbOV0pPD1uJiZNYXRoLmFicyh0WzEwXS1lWzEwXSk8PW4mJk1hdGguYWJzKHRbMTFdLWVbMTFdKTw9biYmTWF0aC5hYnModFsxMl0tZVsxMl0pPD1uJiZNYXRoLmFicyh0WzEzXS1lWzEzXSk8PW4mJk1hdGguYWJzKHRbMTRdLWVbMTRdKTw9biYmTWF0aC5hYnModFsxNV0tZVsxNV0pPD1ufTtUdC5nZXRUcmFuc2xhdGlvbj1mdW5jdGlvbih0LGUpe3JldHVybiB5LnR5cGVPZi5vYmplY3QoIm1hdHJpeCIsdCkseS50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLGUpLGUueD10WzEyXSxlLnk9dFsxM10sZS56PXRbMTRdLGV9O1R0LmdldE1hdHJpeDM9ZnVuY3Rpb24odCxlKXtyZXR1cm4geS50eXBlT2Yub2JqZWN0KCJtYXRyaXgiLHQpLHkudHlwZU9mLm9iamVjdCgicmVzdWx0IixlKSxlWzBdPXRbMF0sZVsxXT10WzFdLGVbMl09dFsyXSxlWzNdPXRbNF0sZVs0XT10WzVdLGVbNV09dFs2XSxlWzZdPXRbOF0sZVs3XT10WzldLGVbOF09dFsxMF0sZX07REM9bmV3IFEsRkM9bmV3IFEsQkM9bmV3IGhlLFVDPW5ldyBoZSgwLDAsMCwxKTtUdC5pbnZlcnNlPWZ1bmN0aW9uKHQsZSl7eS50eXBlT2Yub2JqZWN0KCJtYXRyaXgiLHQpLHkudHlwZU9mLm9iamVjdCgicmVzdWx0IixlKTtsZXQgbj10WzBdLG89dFs0XSxyPXRbOF0saT10WzEyXSxzPXRbMV0sZj10WzVdLHU9dFs5XSxjPXRbMTNdLGw9dFsyXSxwPXRbNl0sZD10WzEwXSxtPXRbMTRdLF89dFszXSxnPXRbN10sYj10WzExXSxUPXRbMTVdLE89ZCpULEU9bSpiLHc9cCpULEM9bSpnLE49cCpiLEk9ZCpnLEQ9bCpULHY9bSpfLEw9bCpiLFU9ZCpfLEE9bCpnLFM9cCpfLFA9TypmK0MqdStOKmMtKEUqZit3KnUrSSpjKSxGPUUqcytEKnUrVSpjLShPKnMrdip1K0wqYyksaj13KnMrdipmK0EqYy0oQypzK0QqZitTKmMpLEg9SSpzK0wqZitTKnUtKE4qcytVKmYrQSp1KSxrPUUqbyt3KnIrSSppLShPKm8rQypyK04qaSksSz1PKm4rdipyK0wqaS0oRSpuK0QqcitVKmkpLFg9QypuK0QqbytTKmktKHcqbit2Km8rQSppKSxSPU4qbitVKm8rQSpyLShJKm4rTCpvK1Mqcik7Tz1yKmMsRT1pKnUsdz1vKmMsQz1pKmYsTj1vKnUsST1yKmYsRD1uKmMsdj1pKnMsTD1uKnUsVT1yKnMsQT1uKmYsUz1vKnM7bGV0IG90PU8qZytDKmIrTipULShFKmcrdypiK0kqVCksYXQ9RSpfK0QqYitVKlQtKE8qXyt2KmIrTCpUKSxwdD13Kl8rdipnK0EqVC0oQypfK0QqZytTKlQpLHl0PUkqXytMKmcrUypiLShOKl8rVSpnK0EqYikscnQ9dypkK0kqbStFKnAtKE4qbStPKnArQypkKSxQdD1MKm0rTypsK3YqZC0oRCpkK1UqbStFKmwpLGd0PUQqcCtTKm0rQypsLShBKm0rdypsK3YqcCksQ3Q9QSpkK04qbCtVKnAtKEwqcCtTKmQrSSpsKSxtdD1uKlArbypGK3IqaitpKkg7aWYoTWF0aC5hYnMobXQpPE0uRVBTSUxPTjIxKXtpZihRLmVxdWFsc0Vwc2lsb24oVHQuZ2V0TWF0cml4Myh0LERDKSxGQyxNLkVQU0lMT043KSYmaGUuZXF1YWxzKFR0LmdldFJvdyh0LDMsQkMpLFVDKSlyZXR1cm4gZVswXT0wLGVbMV09MCxlWzJdPTAsZVszXT0wLGVbNF09MCxlWzVdPTAsZVs2XT0wLGVbN109MCxlWzhdPTAsZVs5XT0wLGVbMTBdPTAsZVsxMV09MCxlWzEyXT0tdFsxMl0sZVsxM109LXRbMTNdLGVbMTRdPS10WzE0XSxlWzE1XT0xLGU7dGhyb3cgbmV3IEFlKCJtYXRyaXggaXMgbm90IGludmVydGlibGUgYmVjYXVzZSBpdHMgZGV0ZXJtaW5hdGUgaXMgemVyby4iKX1yZXR1cm4gbXQ9MS9tdCxlWzBdPVAqbXQsZVsxXT1GKm10LGVbMl09aiptdCxlWzNdPUgqbXQsZVs0XT1rKm10LGVbNV09SyptdCxlWzZdPVgqbXQsZVs3XT1SKm10LGVbOF09b3QqbXQsZVs5XT1hdCptdCxlWzEwXT1wdCptdCxlWzExXT15dCptdCxlWzEyXT1ydCptdCxlWzEzXT1QdCptdCxlWzE0XT1ndCptdCxlWzE1XT1DdCptdCxlfTtUdC5pbnZlcnNlVHJhbnNmb3JtYXRpb249ZnVuY3Rpb24odCxlKXt5LnR5cGVPZi5vYmplY3QoIm1hdHJpeCIsdCkseS50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLGUpO2xldCBuPXRbMF0sbz10WzFdLHI9dFsyXSxpPXRbNF0scz10WzVdLGY9dFs2XSx1PXRbOF0sYz10WzldLGw9dFsxMF0scD10WzEyXSxkPXRbMTNdLG09dFsxNF0sXz0tbipwLW8qZC1yKm0sZz0taSpwLXMqZC1mKm0sYj0tdSpwLWMqZC1sKm07cmV0dXJuIGVbMF09bixlWzFdPWksZVsyXT11LGVbM109MCxlWzRdPW8sZVs1XT1zLGVbNl09YyxlWzddPTAsZVs4XT1yLGVbOV09ZixlWzEwXT1sLGVbMTFdPTAsZVsxMl09XyxlWzEzXT1nLGVbMTRdPWIsZVsxNV09MSxlfTtWQz1uZXcgVHQ7VHQuaW52ZXJzZVRyYW5zcG9zZT1mdW5jdGlvbih0LGUpe3JldHVybiB5LnR5cGVPZi5vYmplY3QoIm1hdHJpeCIsdCkseS50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLGUpLFR0LmludmVyc2UoVHQudHJhbnNwb3NlKHQsVkMpLGUpfTtUdC5JREVOVElUWT1PYmplY3QuZnJlZXplKG5ldyBUdCgxLDAsMCwwLDAsMSwwLDAsMCwwLDEsMCwwLDAsMCwxKSk7VHQuWkVSTz1PYmplY3QuZnJlZXplKG5ldyBUdCgwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwKSk7VHQuQ09MVU1OMFJPVzA9MDtUdC5DT0xVTU4wUk9XMT0xO1R0LkNPTFVNTjBST1cyPTI7VHQuQ09MVU1OMFJPVzM9MztUdC5DT0xVTU4xUk9XMD00O1R0LkNPTFVNTjFST1cxPTU7VHQuQ09MVU1OMVJPVzI9NjtUdC5DT0xVTU4xUk9XMz03O1R0LkNPTFVNTjJST1cwPTg7VHQuQ09MVU1OMlJPVzE9OTtUdC5DT0xVTU4yUk9XMj0xMDtUdC5DT0xVTU4yUk9XMz0xMTtUdC5DT0xVTU4zUk9XMD0xMjtUdC5DT0xVTU4zUk9XMT0xMztUdC5DT0xVTU4zUk9XMj0xNDtUdC5DT0xVTU4zUk9XMz0xNTtPYmplY3QuZGVmaW5lUHJvcGVydGllcyhUdC5wcm90b3R5cGUse2xlbmd0aDp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIFR0LnBhY2tlZExlbmd0aH19fSk7VHQucHJvdG90eXBlLmNsb25lPWZ1bmN0aW9uKHQpe3JldHVybiBUdC5jbG9uZSh0aGlzLHQpfTtUdC5wcm90b3R5cGUuZXF1YWxzPWZ1bmN0aW9uKHQpe3JldHVybiBUdC5lcXVhbHModGhpcyx0KX07VHQuZXF1YWxzQXJyYXk9ZnVuY3Rpb24odCxlLG4pe3JldHVybiB0WzBdPT09ZVtuXSYmdFsxXT09PWVbbisxXSYmdFsyXT09PWVbbisyXSYmdFszXT09PWVbbiszXSYmdFs0XT09PWVbbis0XSYmdFs1XT09PWVbbis1XSYmdFs2XT09PWVbbis2XSYmdFs3XT09PWVbbis3XSYmdFs4XT09PWVbbis4XSYmdFs5XT09PWVbbis5XSYmdFsxMF09PT1lW24rMTBdJiZ0WzExXT09PWVbbisxMV0mJnRbMTJdPT09ZVtuKzEyXSYmdFsxM109PT1lW24rMTNdJiZ0WzE0XT09PWVbbisxNF0mJnRbMTVdPT09ZVtuKzE1XX07VHQucHJvdG90eXBlLmVxdWFsc0Vwc2lsb249ZnVuY3Rpb24odCxlKXtyZXR1cm4gVHQuZXF1YWxzRXBzaWxvbih0aGlzLHQsZSl9O1R0LnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybmAoJHt0aGlzWzBdfSwgJHt0aGlzWzRdfSwgJHt0aGlzWzhdfSwgJHt0aGlzWzEyXX0pCigke3RoaXNbMV19LCAke3RoaXNbNV19LCAke3RoaXNbOV19LCAke3RoaXNbMTNdfSkKKCR7dGhpc1syXX0sICR7dGhpc1s2XX0sICR7dGhpc1sxMF19LCAke3RoaXNbMTRdfSkKKCR7dGhpc1szXX0sICR7dGhpc1s3XX0sICR7dGhpc1sxMV19LCAke3RoaXNbMTVdfSlgfTtzdD1UdH0pO2Z1bmN0aW9uIGtDKHQsZSxuKXt5LmRlZmluZWQoImFycmF5Iix0KSx5LmRlZmluZWQoIml0ZW1Ub0ZpbmQiLGUpLHkuZGVmaW5lZCgiY29tcGFyYXRvciIsbik7bGV0IG89MCxyPXQubGVuZ3RoLTEsaSxzO2Zvcig7bzw9cjspe2lmKGk9fn4oKG8rcikvMikscz1uKHRbaV0sZSksczwwKXtvPWkrMTtjb250aW51ZX1pZihzPjApe3I9aS0xO2NvbnRpbnVlfXJldHVybiBpfXJldHVybn4ocisxKX12YXIgR3MsTm09WigoKT0+e1h0KCk7R3M9a0N9KTtmdW5jdGlvbiBHQyh0LGUsbixvLHIpe3RoaXMueFBvbGVXYW5kZXI9dCx0aGlzLnlQb2xlV2FuZGVyPWUsdGhpcy54UG9sZU9mZnNldD1uLHRoaXMueVBvbGVPZmZzZXQ9byx0aGlzLnV0MU1pbnVzVXRjPXJ9dmFyIGNmLEltPVooKCk9PntjZj1HQ30pO2Z1bmN0aW9uIHpDKHQpe2lmKHQ9PT1udWxsfHxpc05hTih0KSl0aHJvdyBuZXcgQigieWVhciBpcyByZXF1aXJlZCBhbmQgbXVzdCBiZSBhIG51bWJlci4iKTtyZXR1cm4gdCU0PT09MCYmdCUxMDAhPT0wfHx0JTQwMD09PTB9dmFyIGFmLHZtPVooKCk9PntIdCgpO2FmPXpDfSk7ZnVuY3Rpb24gakModCxlLG4sbyxyLGkscyxmKXt0PXgodCwxKSxlPXgoZSwxKSxuPXgobiwxKSxvPXgobywwKSxyPXgociwwKSxpPXgoaSwwKSxzPXgocywwKSxmPXgoZiwhMSksZygpLGIoKSx0aGlzLnllYXI9dCx0aGlzLm1vbnRoPWUsdGhpcy5kYXk9bix0aGlzLmhvdXI9byx0aGlzLm1pbnV0ZT1yLHRoaXMuc2Vjb25kPWksdGhpcy5taWxsaXNlY29uZD1zLHRoaXMuaXNMZWFwU2Vjb25kPWY7ZnVuY3Rpb24gZygpe3kudHlwZU9mLm51bWJlci5ncmVhdGVyVGhhbk9yRXF1YWxzKCJZZWFyIix0LDEpLHkudHlwZU9mLm51bWJlci5sZXNzVGhhbk9yRXF1YWxzKCJZZWFyIix0LDk5OTkpLHkudHlwZU9mLm51bWJlci5ncmVhdGVyVGhhbk9yRXF1YWxzKCJNb250aCIsZSwxKSx5LnR5cGVPZi5udW1iZXIubGVzc1RoYW5PckVxdWFscygiTW9udGgiLGUsMTIpLHkudHlwZU9mLm51bWJlci5ncmVhdGVyVGhhbk9yRXF1YWxzKCJEYXkiLG4sMSkseS50eXBlT2YubnVtYmVyLmxlc3NUaGFuT3JFcXVhbHMoIkRheSIsbiwzMSkseS50eXBlT2YubnVtYmVyLmdyZWF0ZXJUaGFuT3JFcXVhbHMoIkhvdXIiLG8sMCkseS50eXBlT2YubnVtYmVyLmxlc3NUaGFuT3JFcXVhbHMoIkhvdXIiLG8sMjMpLHkudHlwZU9mLm51bWJlci5ncmVhdGVyVGhhbk9yRXF1YWxzKCJNaW51dGUiLHIsMCkseS50eXBlT2YubnVtYmVyLmxlc3NUaGFuT3JFcXVhbHMoIk1pbnV0ZSIsciw1OSkseS50eXBlT2YuYm9vbCgiSXNMZWFwU2Vjb25kIixmKSx5LnR5cGVPZi5udW1iZXIuZ3JlYXRlclRoYW5PckVxdWFscygiU2Vjb25kIixpLDApLHkudHlwZU9mLm51bWJlci5sZXNzVGhhbk9yRXF1YWxzKCJTZWNvbmQiLGksZj82MDo1OSkseS50eXBlT2YubnVtYmVyLmdyZWF0ZXJUaGFuT3JFcXVhbHMoIk1pbGxpc2Vjb25kIixzLDApLHkudHlwZU9mLm51bWJlci5sZXNzVGhhbigiTWlsbGlzZWNvbmQiLHMsMWUzKX1mdW5jdGlvbiBiKCl7bGV0IFQ9ZT09PTImJmFmKHQpP1AxW2UtMV0rMTpQMVtlLTFdO2lmKG4+VCl0aHJvdyBuZXcgQigiTW9udGggYW5kIERheSByZXByZXNlbnRzIGludmFsaWQgZGF0ZSIpfX12YXIgUDEsV2wsTTE9WigoKT0+e1h0KCk7SXQoKTtIdCgpO3ZtKCk7UDE9WzMxLDI4LDMxLDMwLDMxLDMwLDMxLDMxLDMwLDMxLDMwLDMxXTtXbD1qQ30pO2Z1bmN0aW9uIEhDKHQsZSl7dGhpcy5qdWxpYW5EYXRlPXQsdGhpcy5vZmZzZXQ9ZX12YXIgV2UsTG09WigoKT0+e1dlPUhDfSk7dmFyIHFDLHluLFhsPVooKCk9PntxQz17U0VDT05EU19QRVJfTUlMTElTRUNPTkQ6LjAwMSxTRUNPTkRTX1BFUl9NSU5VVEU6NjAsTUlOVVRFU19QRVJfSE9VUjo2MCxIT1VSU19QRVJfREFZOjI0LFNFQ09ORFNfUEVSX0hPVVI6MzYwMCxNSU5VVEVTX1BFUl9EQVk6MTQ0MCxTRUNPTkRTX1BFUl9EQVk6ODY0MDAsREFZU19QRVJfSlVMSUFOX0NFTlRVUlk6MzY1MjUsUElDT1NFQ09ORDoxZS05LE1PRElGSUVEX0pVTElBTl9EQVRFX0RJRkZFUkVOQ0U6MjQwMDAwMDVlLTF9LHluPU9iamVjdC5mcmVlemUocUMpfSk7dmFyIEtDLE9lLFlsPVooKCk9PntLQz17VVRDOjAsVEFJOjF9LE9lPU9iamVjdC5mcmVlemUoS0MpfSk7ZnVuY3Rpb24gRG0odCxlKXtyZXR1cm4gR3QuY29tcGFyZSh0Lmp1bGlhbkRhdGUsZS5qdWxpYW5EYXRlKX1mdW5jdGlvbiBKbCh0KXtLYy5qdWxpYW5EYXRlPXQ7bGV0IGU9R3QubGVhcFNlY29uZHMsbj1HcyhlLEtjLERtKTtuPDAmJihuPX5uKSxuPj1lLmxlbmd0aCYmKG49ZS5sZW5ndGgtMSk7bGV0IG89ZVtuXS5vZmZzZXQ7bj4wJiZHdC5zZWNvbmRzRGlmZmVyZW5jZShlW25dLmp1bGlhbkRhdGUsdCk+byYmKG4tLSxvPWVbbl0ub2Zmc2V0KSxHdC5hZGRTZWNvbmRzKHQsbyx0KX1mdW5jdGlvbiBOMSh0LGUpe0tjLmp1bGlhbkRhdGU9dDtsZXQgbj1HdC5sZWFwU2Vjb25kcyxvPUdzKG4sS2MsRG0pO2lmKG88MCYmKG89fm8pLG89PT0wKXJldHVybiBHdC5hZGRTZWNvbmRzKHQsLW5bMF0ub2Zmc2V0LGUpO2lmKG8+PW4ubGVuZ3RoKXJldHVybiBHdC5hZGRTZWNvbmRzKHQsLW5bby0xXS5vZmZzZXQsZSk7bGV0IHI9R3Quc2Vjb25kc0RpZmZlcmVuY2UobltvXS5qdWxpYW5EYXRlLHQpO2lmKHI9PT0wKXJldHVybiBHdC5hZGRTZWNvbmRzKHQsLW5bb10ub2Zmc2V0LGUpO2lmKCEocjw9MSkpcmV0dXJuIEd0LmFkZFNlY29uZHModCwtblstLW9dLm9mZnNldCxlKX1mdW5jdGlvbiBucyh0LGUsbil7bGV0IG89ZS95bi5TRUNPTkRTX1BFUl9EQVl8MDtyZXR1cm4gdCs9byxlLT15bi5TRUNPTkRTX1BFUl9EQVkqbyxlPDAmJih0LS0sZSs9eW4uU0VDT05EU19QRVJfREFZKSxuLmRheU51bWJlcj10LG4uc2Vjb25kc09mRGF5PWUsbn1mdW5jdGlvbiBGbSh0LGUsbixvLHIsaSxzKXtsZXQgZj0oZS0xNCkvMTJ8MCx1PXQrNDgwMCtmLGM9KDE0NjEqdS80fDApKygzNjcqKGUtMi0xMipmKS8xMnwwKS0oMyooKHUrMTAwKS8xMDB8MCkvNHwwKStuLTMyMDc1O289by0xMixvPDAmJihvKz0yNCk7bGV0IGw9aSsobyp5bi5TRUNPTkRTX1BFUl9IT1VSK3IqeW4uU0VDT05EU19QRVJfTUlOVVRFK3MqeW4uU0VDT05EU19QRVJfTUlMTElTRUNPTkQpO3JldHVybiBsPj00MzIwMCYmKGMtPTEpLFtjLGxdfWZ1bmN0aW9uIEd0KHQsZSxuKXt0aGlzLmRheU51bWJlcj12b2lkIDAsdGhpcy5zZWNvbmRzT2ZEYXk9dm9pZCAwLHQ9eCh0LDApLGU9eChlLDApLG49eChuLE9lLlVUQyk7bGV0IG89dHwwO2U9ZSsodC1vKSp5bi5TRUNPTkRTX1BFUl9EQVksbnMobyxlLHRoaXMpLG49PT1PZS5VVEMmJkpsKHRoaXMpfXZhciBJMSwkbCxabCxLYyxXQyxYQyxZQywkQyxaQyxCbSxRQyxKQyx0eCxEcixRbCxrbix0cD1aKCgpPT57Tm0oKTtJdCgpO2Z0KCk7SHQoKTtNMSgpO3ZtKCk7TG0oKTtYbCgpO1lsKCk7STE9bmV3IFdsLCRsPVszMSwyOCwzMSwzMCwzMSwzMCwzMSwzMSwzMCwzMSwzMCwzMV0sWmw9Mjk7S2M9bmV3IFdlO1dDPS9eKFxkezR9KSQvLFhDPS9eKFxkezR9KS0oXGR7Mn0pJC8sWUM9L14oXGR7NH0pLT8oXGR7M30pJC8sJEM9L14oXGR7NH0pLT9XKFxkezJ9KS0/KFxkezF9KT8kLyxaQz0vXihcZHs0fSktPyhcZHsyfSktPyhcZHsyfSkkLyxCbT0vKFtaK1wtXSk/KFxkezJ9KT86PyhcZHsyfSk/JC8sUUM9L14oXGR7Mn0pKFwuXGQrKT8vLnNvdXJjZStCbS5zb3VyY2UsSkM9L14oXGR7Mn0pOj8oXGR7Mn0pKFwuXGQrKT8vLnNvdXJjZStCbS5zb3VyY2UsdHg9L14oXGR7Mn0pOj8oXGR7Mn0pOj8oXGR7Mn0pKFwuXGQrKT8vLnNvdXJjZStCbS5zb3VyY2UsRHI9IkludmFsaWQgSVNPIDg2MDEgZGF0ZS4iO0d0LmZyb21HcmVnb3JpYW5EYXRlPWZ1bmN0aW9uKHQsZSl7aWYoISh0IGluc3RhbmNlb2YgV2wpKXRocm93IG5ldyBCKCJkYXRlIG11c3QgYmUgYSB2YWxpZCBHcmVnb3JpYW5EYXRlLiIpO2xldCBuPUZtKHQueWVhcix0Lm1vbnRoLHQuZGF5LHQuaG91cix0Lm1pbnV0ZSx0LnNlY29uZCx0Lm1pbGxpc2Vjb25kKTtyZXR1cm4gaChlKT8obnMoblswXSxuWzFdLGUpLEpsKGUpLGUpOm5ldyBHdChuWzBdLG5bMV0sT2UuVVRDKX07R3QuZnJvbURhdGU9ZnVuY3Rpb24odCxlKXtpZighKHQgaW5zdGFuY2VvZiBEYXRlKXx8aXNOYU4odC5nZXRUaW1lKCkpKXRocm93IG5ldyBCKCJkYXRlIG11c3QgYmUgYSB2YWxpZCBKYXZhU2NyaXB0IERhdGUuIik7bGV0IG49Rm0odC5nZXRVVENGdWxsWWVhcigpLHQuZ2V0VVRDTW9udGgoKSsxLHQuZ2V0VVRDRGF0ZSgpLHQuZ2V0VVRDSG91cnMoKSx0LmdldFVUQ01pbnV0ZXMoKSx0LmdldFVUQ1NlY29uZHMoKSx0LmdldFVUQ01pbGxpc2Vjb25kcygpKTtyZXR1cm4gaChlKT8obnMoblswXSxuWzFdLGUpLEpsKGUpLGUpOm5ldyBHdChuWzBdLG5bMV0sT2UuVVRDKX07R3QuZnJvbUlzbzg2MDE9ZnVuY3Rpb24odCxlKXtpZih0eXBlb2YgdCE9InN0cmluZyIpdGhyb3cgbmV3IEIoRHIpO3Q9dC5yZXBsYWNlKCIsIiwiLiIpO2xldCBuPXQuc3BsaXQoIlQiKSxvLHI9MSxpPTEscz0wLGY9MCx1PTAsYz0wLGw9blswXSxwPW5bMV0sZCxtO2lmKCFoKGwpKXRocm93IG5ldyBCKERyKTtsZXQgXztpZihuPWwubWF0Y2goWkMpLG4hPT1udWxsKXtpZihfPWwuc3BsaXQoIi0iKS5sZW5ndGgtMSxfPjAmJl8hPT0yKXRocm93IG5ldyBCKERyKTtvPStuWzFdLHI9K25bMl0saT0rblszXX1lbHNlIGlmKG49bC5tYXRjaChYQyksbiE9PW51bGwpbz0rblsxXSxyPStuWzJdO2Vsc2UgaWYobj1sLm1hdGNoKFdDKSxuIT09bnVsbClvPStuWzFdO2Vsc2V7bGV0IE87aWYobj1sLm1hdGNoKFlDKSxuIT09bnVsbCl7aWYobz0rblsxXSxPPStuWzJdLG09YWYobyksTzwxfHxtJiZPPjM2Nnx8IW0mJk8+MzY1KXRocm93IG5ldyBCKERyKX1lbHNlIGlmKG49bC5tYXRjaCgkQyksbiE9PW51bGwpe289K25bMV07bGV0IEU9K25bMl0sdz0rblszXXx8MDtpZihfPWwuc3BsaXQoIi0iKS5sZW5ndGgtMSxfPjAmJighaChuWzNdKSYmXyE9PTF8fGgoblszXSkmJl8hPT0yKSl0aHJvdyBuZXcgQihEcik7bGV0IEM9bmV3IERhdGUoRGF0ZS5VVEMobywwLDQpKTtPPUUqNyt3LUMuZ2V0VVRDRGF5KCktM31lbHNlIHRocm93IG5ldyBCKERyKTtkPW5ldyBEYXRlKERhdGUuVVRDKG8sMCwxKSksZC5zZXRVVENEYXRlKE8pLHI9ZC5nZXRVVENNb250aCgpKzEsaT1kLmdldFVUQ0RhdGUoKX1pZihtPWFmKG8pLHI8MXx8cj4xMnx8aTwxfHwociE9PTJ8fCFtKSYmaT4kbFtyLTFdfHxtJiZyPT09MiYmaT5abCl0aHJvdyBuZXcgQihEcik7bGV0IGc7aWYoaChwKSl7aWYobj1wLm1hdGNoKHR4KSxuIT09bnVsbCl7aWYoXz1wLnNwbGl0KCI6IikubGVuZ3RoLTEsXz4wJiZfIT09MiYmXyE9PTMpdGhyb3cgbmV3IEIoRHIpO3M9K25bMV0sZj0rblsyXSx1PStuWzNdLGM9KyhuWzRdfHwwKSoxZTMsZz01fWVsc2UgaWYobj1wLm1hdGNoKEpDKSxuIT09bnVsbCl7aWYoXz1wLnNwbGl0KCI6IikubGVuZ3RoLTEsXz4yKXRocm93IG5ldyBCKERyKTtzPStuWzFdLGY9K25bMl0sdT0rKG5bM118fDApKjYwLGc9NH1lbHNlIGlmKG49cC5tYXRjaChRQyksbiE9PW51bGwpcz0rblsxXSxmPSsoblsyXXx8MCkqNjAsZz0zO2Vsc2UgdGhyb3cgbmV3IEIoRHIpO2lmKGY+PTYwfHx1Pj02MXx8cz4yNHx8cz09PTI0JiYoZj4wfHx1PjB8fGM+MCkpdGhyb3cgbmV3IEIoRHIpO2xldCBPPW5bZ10sRT0rbltnKzFdLHc9KyhuW2crMl18fDApO3N3aXRjaChPKXtjYXNlIisiOnM9cy1FLGY9Zi13O2JyZWFrO2Nhc2UiLSI6cz1zK0UsZj1mK3c7YnJlYWs7Y2FzZSJaIjpicmVhaztkZWZhdWx0OmY9ZituZXcgRGF0ZShEYXRlLlVUQyhvLHItMSxpLHMsZikpLmdldFRpbWV6b25lT2Zmc2V0KCk7YnJlYWt9fWxldCBiPXU9PT02MDtmb3IoYiYmdS0tO2Y+PTYwOylmLT02MCxzKys7Zm9yKDtzPj0yNDspcy09MjQsaSsrO2ZvcihkPW0mJnI9PT0yP1psOiRsW3ItMV07aT5kOylpLT1kLHIrKyxyPjEyJiYoci09MTIsbysrKSxkPW0mJnI9PT0yP1psOiRsW3ItMV07Zm9yKDtmPDA7KWYrPTYwLHMtLTtmb3IoO3M8MDspcys9MjQsaS0tO2Zvcig7aTwxOylyLS0scjwxJiYocis9MTIsby0tKSxkPW0mJnI9PT0yP1psOiRsW3ItMV0saSs9ZDtsZXQgVD1GbShvLHIsaSxzLGYsdSxjKTtyZXR1cm4gaChlKT8obnMoVFswXSxUWzFdLGUpLEpsKGUpKTplPW5ldyBHdChUWzBdLFRbMV0sT2UuVVRDKSxiJiZHdC5hZGRTZWNvbmRzKGUsMSxlKSxlfTtHdC5ub3c9ZnVuY3Rpb24odCl7cmV0dXJuIEd0LmZyb21EYXRlKG5ldyBEYXRlLHQpfTtRbD1uZXcgR3QoMCwwLE9lLlRBSSk7R3QudG9HcmVnb3JpYW5EYXRlPWZ1bmN0aW9uKHQsZSl7aWYoIWgodCkpdGhyb3cgbmV3IEIoImp1bGlhbkRhdGUgaXMgcmVxdWlyZWQuIik7bGV0IG49ITEsbz1OMSh0LFFsKTtoKG8pfHwoR3QuYWRkU2Vjb25kcyh0LC0xLFFsKSxvPU4xKFFsLFFsKSxuPSEwKTtsZXQgcj1vLmRheU51bWJlcixpPW8uc2Vjb25kc09mRGF5O2k+PTQzMjAwJiYocis9MSk7bGV0IHM9cis2ODU2OXwwLGY9NCpzLzE0NjA5N3wwO3M9cy0oKDE0NjA5NypmKzMpLzR8MCl8MDtsZXQgdT00ZTMqKHMrMSkvMTQ2MTAwMXwwO3M9cy0oMTQ2MSp1LzR8MCkrMzF8MDtsZXQgYz04MCpzLzI0NDd8MCxsPXMtKDI0NDcqYy84MHwwKXwwO3M9Yy8xMXwwO2xldCBwPWMrMi0xMipzfDAsZD0xMDAqKGYtNDkpK3Urc3wwLG09aS95bi5TRUNPTkRTX1BFUl9IT1VSfDAsXz1pLW0qeW4uU0VDT05EU19QRVJfSE9VUixnPV8veW4uU0VDT05EU19QRVJfTUlOVVRFfDA7Xz1fLWcqeW4uU0VDT05EU19QRVJfTUlOVVRFO2xldCBiPV98MCxUPShfLWIpL3luLlNFQ09ORFNfUEVSX01JTExJU0VDT05EO3JldHVybiBtKz0xMixtPjIzJiYobS09MjQpLG4mJihiKz0xKSxoKGUpPyhlLnllYXI9ZCxlLm1vbnRoPXAsZS5kYXk9bCxlLmhvdXI9bSxlLm1pbnV0ZT1nLGUuc2Vjb25kPWIsZS5taWxsaXNlY29uZD1ULGUuaXNMZWFwU2Vjb25kPW4sZSk6bmV3IFdsKGQscCxsLG0sZyxiLFQsbil9O0d0LnRvRGF0ZT1mdW5jdGlvbih0KXtpZighaCh0KSl0aHJvdyBuZXcgQigianVsaWFuRGF0ZSBpcyByZXF1aXJlZC4iKTtsZXQgZT1HdC50b0dyZWdvcmlhbkRhdGUodCxJMSksbj1lLnNlY29uZDtyZXR1cm4gZS5pc0xlYXBTZWNvbmQmJihuLT0xKSxuZXcgRGF0ZShEYXRlLlVUQyhlLnllYXIsZS5tb250aC0xLGUuZGF5LGUuaG91cixlLm1pbnV0ZSxuLGUubWlsbGlzZWNvbmQpKX07R3QudG9Jc284NjAxPWZ1bmN0aW9uKHQsZSl7aWYoIWgodCkpdGhyb3cgbmV3IEIoImp1bGlhbkRhdGUgaXMgcmVxdWlyZWQuIik7bGV0IG49R3QudG9HcmVnb3JpYW5EYXRlKHQsSTEpLG89bi55ZWFyLHI9bi5tb250aCxpPW4uZGF5LHM9bi5ob3VyLGY9bi5taW51dGUsdT1uLnNlY29uZCxjPW4ubWlsbGlzZWNvbmQ7bz09PTFlNCYmcj09PTEmJmk9PT0xJiZzPT09MCYmZj09PTAmJnU9PT0wJiZjPT09MCYmKG89OTk5OSxyPTEyLGk9MzEscz0yNCk7bGV0IGw7aWYoIWgoZSkmJmMhPT0wKXtsZXQgcD1jKi4wMTtyZXR1cm4gbD1wPDFlLTY/cC50b0ZpeGVkKDIwKS5yZXBsYWNlKCIuIiwiIikucmVwbGFjZSgvMCskLywiIik6cC50b1N0cmluZygpLnJlcGxhY2UoIi4iLCIiKSxgJHtvLnRvU3RyaW5nKCkucGFkU3RhcnQoNCwiMCIpfS0ke3IudG9TdHJpbmcoKS5wYWRTdGFydCgyLCIwIil9LSR7aS50b1N0cmluZygpLnBhZFN0YXJ0KDIsIjAiKX1UJHtzLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwiMCIpfToke2YudG9TdHJpbmcoKS5wYWRTdGFydCgyLCIwIil9OiR7dS50b1N0cmluZygpLnBhZFN0YXJ0KDIsIjAiKX0uJHtsfVpgfXJldHVybiFoKGUpfHxlPT09MD9gJHtvLnRvU3RyaW5nKCkucGFkU3RhcnQoNCwiMCIpfS0ke3IudG9TdHJpbmcoKS5wYWRTdGFydCgyLCIwIil9LSR7aS50b1N0cmluZygpLnBhZFN0YXJ0KDIsIjAiKX1UJHtzLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwiMCIpfToke2YudG9TdHJpbmcoKS5wYWRTdGFydCgyLCIwIil9OiR7dS50b1N0cmluZygpLnBhZFN0YXJ0KDIsIjAiKX1aYDoobD0oYyouMDEpLnRvRml4ZWQoZSkucmVwbGFjZSgiLiIsIiIpLnNsaWNlKDAsZSksYCR7by50b1N0cmluZygpLnBhZFN0YXJ0KDQsIjAiKX0tJHtyLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwiMCIpfS0ke2kudG9TdHJpbmcoKS5wYWRTdGFydCgyLCIwIil9VCR7cy50b1N0cmluZygpLnBhZFN0YXJ0KDIsIjAiKX06JHtmLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwiMCIpfToke3UudG9TdHJpbmcoKS5wYWRTdGFydCgyLCIwIil9LiR7bH1aYCl9O0d0LmNsb25lPWZ1bmN0aW9uKHQsZSl7aWYoaCh0KSlyZXR1cm4gaChlKT8oZS5kYXlOdW1iZXI9dC5kYXlOdW1iZXIsZS5zZWNvbmRzT2ZEYXk9dC5zZWNvbmRzT2ZEYXksZSk6bmV3IEd0KHQuZGF5TnVtYmVyLHQuc2Vjb25kc09mRGF5LE9lLlRBSSl9O0d0LmNvbXBhcmU9ZnVuY3Rpb24odCxlKXtpZighaCh0KSl0aHJvdyBuZXcgQigibGVmdCBpcyByZXF1aXJlZC4iKTtpZighaChlKSl0aHJvdyBuZXcgQigicmlnaHQgaXMgcmVxdWlyZWQuIik7bGV0IG49dC5kYXlOdW1iZXItZS5kYXlOdW1iZXI7cmV0dXJuIG4hPT0wP246dC5zZWNvbmRzT2ZEYXktZS5zZWNvbmRzT2ZEYXl9O0d0LmVxdWFscz1mdW5jdGlvbih0LGUpe3JldHVybiB0PT09ZXx8aCh0KSYmaChlKSYmdC5kYXlOdW1iZXI9PT1lLmRheU51bWJlciYmdC5zZWNvbmRzT2ZEYXk9PT1lLnNlY29uZHNPZkRheX07R3QuZXF1YWxzRXBzaWxvbj1mdW5jdGlvbih0LGUsbil7cmV0dXJuIG49eChuLDApLHQ9PT1lfHxoKHQpJiZoKGUpJiZNYXRoLmFicyhHdC5zZWNvbmRzRGlmZmVyZW5jZSh0LGUpKTw9bn07R3QudG90YWxEYXlzPWZ1bmN0aW9uKHQpe2lmKCFoKHQpKXRocm93IG5ldyBCKCJqdWxpYW5EYXRlIGlzIHJlcXVpcmVkLiIpO3JldHVybiB0LmRheU51bWJlcit0LnNlY29uZHNPZkRheS95bi5TRUNPTkRTX1BFUl9EQVl9O0d0LnNlY29uZHNEaWZmZXJlbmNlPWZ1bmN0aW9uKHQsZSl7aWYoIWgodCkpdGhyb3cgbmV3IEIoImxlZnQgaXMgcmVxdWlyZWQuIik7aWYoIWgoZSkpdGhyb3cgbmV3IEIoInJpZ2h0IGlzIHJlcXVpcmVkLiIpO3JldHVybih0LmRheU51bWJlci1lLmRheU51bWJlcikqeW4uU0VDT05EU19QRVJfREFZKyh0LnNlY29uZHNPZkRheS1lLnNlY29uZHNPZkRheSl9O0d0LmRheXNEaWZmZXJlbmNlPWZ1bmN0aW9uKHQsZSl7aWYoIWgodCkpdGhyb3cgbmV3IEIoImxlZnQgaXMgcmVxdWlyZWQuIik7aWYoIWgoZSkpdGhyb3cgbmV3IEIoInJpZ2h0IGlzIHJlcXVpcmVkLiIpO2xldCBuPXQuZGF5TnVtYmVyLWUuZGF5TnVtYmVyLG89KHQuc2Vjb25kc09mRGF5LWUuc2Vjb25kc09mRGF5KS95bi5TRUNPTkRTX1BFUl9EQVk7cmV0dXJuIG4rb307R3QuY29tcHV0ZVRhaU1pbnVzVXRjPWZ1bmN0aW9uKHQpe0tjLmp1bGlhbkRhdGU9dDtsZXQgZT1HdC5sZWFwU2Vjb25kcyxuPUdzKGUsS2MsRG0pO3JldHVybiBuPDAmJihuPX5uLC0tbixuPDAmJihuPTApKSxlW25dLm9mZnNldH07R3QuYWRkU2Vjb25kcz1mdW5jdGlvbih0LGUsbil7aWYoIWgodCkpdGhyb3cgbmV3IEIoImp1bGlhbkRhdGUgaXMgcmVxdWlyZWQuIik7aWYoIWgoZSkpdGhyb3cgbmV3IEIoInNlY29uZHMgaXMgcmVxdWlyZWQuIik7aWYoIWgobikpdGhyb3cgbmV3IEIoInJlc3VsdCBpcyByZXF1aXJlZC4iKTtyZXR1cm4gbnModC5kYXlOdW1iZXIsdC5zZWNvbmRzT2ZEYXkrZSxuKX07R3QuYWRkTWludXRlcz1mdW5jdGlvbih0LGUsbil7aWYoIWgodCkpdGhyb3cgbmV3IEIoImp1bGlhbkRhdGUgaXMgcmVxdWlyZWQuIik7aWYoIWgoZSkpdGhyb3cgbmV3IEIoIm1pbnV0ZXMgaXMgcmVxdWlyZWQuIik7aWYoIWgobikpdGhyb3cgbmV3IEIoInJlc3VsdCBpcyByZXF1aXJlZC4iKTtsZXQgbz10LnNlY29uZHNPZkRheStlKnluLlNFQ09ORFNfUEVSX01JTlVURTtyZXR1cm4gbnModC5kYXlOdW1iZXIsbyxuKX07R3QuYWRkSG91cnM9ZnVuY3Rpb24odCxlLG4pe2lmKCFoKHQpKXRocm93IG5ldyBCKCJqdWxpYW5EYXRlIGlzIHJlcXVpcmVkLiIpO2lmKCFoKGUpKXRocm93IG5ldyBCKCJob3VycyBpcyByZXF1aXJlZC4iKTtpZighaChuKSl0aHJvdyBuZXcgQigicmVzdWx0IGlzIHJlcXVpcmVkLiIpO2xldCBvPXQuc2Vjb25kc09mRGF5K2UqeW4uU0VDT05EU19QRVJfSE9VUjtyZXR1cm4gbnModC5kYXlOdW1iZXIsbyxuKX07R3QuYWRkRGF5cz1mdW5jdGlvbih0LGUsbil7aWYoIWgodCkpdGhyb3cgbmV3IEIoImp1bGlhbkRhdGUgaXMgcmVxdWlyZWQuIik7aWYoIWgoZSkpdGhyb3cgbmV3IEIoImRheXMgaXMgcmVxdWlyZWQuIik7aWYoIWgobikpdGhyb3cgbmV3IEIoInJlc3VsdCBpcyByZXF1aXJlZC4iKTtsZXQgbz10LmRheU51bWJlcitlO3JldHVybiBucyhvLHQuc2Vjb25kc09mRGF5LG4pfTtHdC5sZXNzVGhhbj1mdW5jdGlvbih0LGUpe3JldHVybiBHdC5jb21wYXJlKHQsZSk8MH07R3QubGVzc1RoYW5PckVxdWFscz1mdW5jdGlvbih0LGUpe3JldHVybiBHdC5jb21wYXJlKHQsZSk8PTB9O0d0LmdyZWF0ZXJUaGFuPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIEd0LmNvbXBhcmUodCxlKT4wfTtHdC5ncmVhdGVyVGhhbk9yRXF1YWxzPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIEd0LmNvbXBhcmUodCxlKT49MH07R3QucHJvdG90eXBlLmNsb25lPWZ1bmN0aW9uKHQpe3JldHVybiBHdC5jbG9uZSh0aGlzLHQpfTtHdC5wcm90b3R5cGUuZXF1YWxzPWZ1bmN0aW9uKHQpe3JldHVybiBHdC5lcXVhbHModGhpcyx0KX07R3QucHJvdG90eXBlLmVxdWFsc0Vwc2lsb249ZnVuY3Rpb24odCxlKXtyZXR1cm4gR3QuZXF1YWxzRXBzaWxvbih0aGlzLHQsZSl9O0d0LnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiBHdC50b0lzbzg2MDEodGhpcyl9O0d0LmxlYXBTZWNvbmRzPVtuZXcgV2UobmV3IEd0KDI0NDEzMTcsNDMyMTAsT2UuVEFJKSwxMCksbmV3IFdlKG5ldyBHdCgyNDQxNDk5LDQzMjExLE9lLlRBSSksMTEpLG5ldyBXZShuZXcgR3QoMjQ0MTY4Myw0MzIxMixPZS5UQUkpLDEyKSxuZXcgV2UobmV3IEd0KDI0NDIwNDgsNDMyMTMsT2UuVEFJKSwxMyksbmV3IFdlKG5ldyBHdCgyNDQyNDEzLDQzMjE0LE9lLlRBSSksMTQpLG5ldyBXZShuZXcgR3QoMjQ0Mjc3OCw0MzIxNSxPZS5UQUkpLDE1KSxuZXcgV2UobmV3IEd0KDI0NDMxNDQsNDMyMTYsT2UuVEFJKSwxNiksbmV3IFdlKG5ldyBHdCgyNDQzNTA5LDQzMjE3LE9lLlRBSSksMTcpLG5ldyBXZShuZXcgR3QoMjQ0Mzg3NCw0MzIxOCxPZS5UQUkpLDE4KSxuZXcgV2UobmV3IEd0KDI0NDQyMzksNDMyMTksT2UuVEFJKSwxOSksbmV3IFdlKG5ldyBHdCgyNDQ0Nzg2LDQzMjIwLE9lLlRBSSksMjApLG5ldyBXZShuZXcgR3QoMjQ0NTE1MSw0MzIyMSxPZS5UQUkpLDIxKSxuZXcgV2UobmV3IEd0KDI0NDU1MTYsNDMyMjIsT2UuVEFJKSwyMiksbmV3IFdlKG5ldyBHdCgyNDQ2MjQ3LDQzMjIzLE9lLlRBSSksMjMpLG5ldyBXZShuZXcgR3QoMjQ0NzE2MSw0MzIyNCxPZS5UQUkpLDI0KSxuZXcgV2UobmV3IEd0KDI0NDc4OTIsNDMyMjUsT2UuVEFJKSwyNSksbmV3IFdlKG5ldyBHdCgyNDQ4MjU3LDQzMjI2LE9lLlRBSSksMjYpLG5ldyBXZShuZXcgR3QoMjQ0ODgwNCw0MzIyNyxPZS5UQUkpLDI3KSxuZXcgV2UobmV3IEd0KDI0NDkxNjksNDMyMjgsT2UuVEFJKSwyOCksbmV3IFdlKG5ldyBHdCgyNDQ5NTM0LDQzMjI5LE9lLlRBSSksMjkpLG5ldyBXZShuZXcgR3QoMjQ1MDA4Myw0MzIzMCxPZS5UQUkpLDMwKSxuZXcgV2UobmV3IEd0KDI0NTA2MzAsNDMyMzEsT2UuVEFJKSwzMSksbmV3IFdlKG5ldyBHdCgyNDUxMTc5LDQzMjMyLE9lLlRBSSksMzIpLG5ldyBXZShuZXcgR3QoMjQ1MzczNiw0MzIzMyxPZS5UQUkpLDMzKSxuZXcgV2UobmV3IEd0KDI0NTQ4MzIsNDMyMzQsT2UuVEFJKSwzNCksbmV3IFdlKG5ldyBHdCgyNDU2MTA5LDQzMjM1LE9lLlRBSSksMzUpLG5ldyBXZShuZXcgR3QoMjQ1NzIwNCw0MzIzNixPZS5UQUkpLDM2KSxuZXcgV2UobmV3IEd0KDI0NTc3NTQsNDMyMzcsT2UuVEFJKSwzNyldO2tuPUd0fSk7dmFyIHYxPVhuKChXYyxYYyk9PnsvKiEgaHR0cHM6Ly9tdGhzLmJlL3B1bnljb2RlIHYxLjQuMCBieSBAbWF0aGlhcyAqLyhmdW5jdGlvbih0KXt2YXIgZT10eXBlb2YgV2M9PSJvYmplY3QiJiZXYyYmIVdjLm5vZGVUeXBlJiZXYyxuPXR5cGVvZiBYYz09Im9iamVjdCImJlhjJiYhWGMubm9kZVR5cGUmJlhjLG89dHlwZW9mIGdsb2JhbD09Im9iamVjdCImJmdsb2JhbDsoby5nbG9iYWw9PT1vfHxvLndpbmRvdz09PW98fG8uc2VsZj09PW8pJiYodD1vKTt2YXIgcixpPTIxNDc0ODM2NDcscz0zNixmPTEsdT0yNixjPTM4LGw9NzAwLHA9NzIsZD0xMjgsbT0iLSIsXz0vXnhuLS0vLGc9L1teXHgyMC1ceDdFXS8sYj0vW1x4MkVcdTMwMDJcdUZGMEVcdUZGNjFdL2csVD17b3ZlcmZsb3c6Ik92ZXJmbG93OiBpbnB1dCBuZWVkcyB3aWRlciBpbnRlZ2VycyB0byBwcm9jZXNzIiwibm90LWJhc2ljIjoiSWxsZWdhbCBpbnB1dCA+PSAweDgwIChub3QgYSBiYXNpYyBjb2RlIHBvaW50KSIsImludmFsaWQtaW5wdXQiOiJJbnZhbGlkIGlucHV0In0sTz1zLWYsRT1NYXRoLmZsb29yLHc9U3RyaW5nLmZyb21DaGFyQ29kZSxDO2Z1bmN0aW9uIE4oayl7dGhyb3cgbmV3IFJhbmdlRXJyb3IoVFtrXSl9ZnVuY3Rpb24gSShrLEspe2Zvcih2YXIgWD1rLmxlbmd0aCxSPVtdO1gtLTspUltYXT1LKGtbWF0pO3JldHVybiBSfWZ1bmN0aW9uIEQoayxLKXt2YXIgWD1rLnNwbGl0KCJAIiksUj0iIjtYLmxlbmd0aD4xJiYoUj1YWzBdKyJAIixrPVhbMV0pLGs9ay5yZXBsYWNlKGIsIi4iKTt2YXIgb3Q9ay5zcGxpdCgiLiIpLGF0PUkob3QsSykuam9pbigiLiIpO3JldHVybiBSK2F0fWZ1bmN0aW9uIHYoayl7Zm9yKHZhciBLPVtdLFg9MCxSPWsubGVuZ3RoLG90LGF0O1g8Ujspb3Q9ay5jaGFyQ29kZUF0KFgrKyksb3Q+PTU1Mjk2JiZvdDw9NTYzMTkmJlg8Uj8oYXQ9ay5jaGFyQ29kZUF0KFgrKyksKGF0JjY0NTEyKT09NTYzMjA/Sy5wdXNoKCgob3QmMTAyMyk8PDEwKSsoYXQmMTAyMykrNjU1MzYpOihLLnB1c2gob3QpLFgtLSkpOksucHVzaChvdCk7cmV0dXJuIEt9ZnVuY3Rpb24gTChrKXtyZXR1cm4gSShrLGZ1bmN0aW9uKEspe3ZhciBYPSIiO3JldHVybiBLPjY1NTM1JiYoSy09NjU1MzYsWCs9dyhLPj4+MTAmMTAyM3w1NTI5NiksSz01NjMyMHxLJjEwMjMpLFgrPXcoSyksWH0pLmpvaW4oIiIpfWZ1bmN0aW9uIFUoayl7cmV0dXJuIGstNDg8MTA/ay0yMjprLTY1PDI2P2stNjU6ay05NzwyNj9rLTk3OnN9ZnVuY3Rpb24gQShrLEspe3JldHVybiBrKzIyKzc1KihrPDI2KS0oKEshPTApPDw1KX1mdW5jdGlvbiBTKGssSyxYKXt2YXIgUj0wO2ZvcihrPVg/RShrL2wpOms+PjEsays9RShrL0spO2s+Typ1Pj4xO1IrPXMpaz1FKGsvTyk7cmV0dXJuIEUoUisoTysxKSprLyhrK2MpKX1mdW5jdGlvbiBQKGspe3ZhciBLPVtdLFg9ay5sZW5ndGgsUixvdD0wLGF0PWQscHQ9cCx5dCxydCxQdCxndCxDdCxtdCx1dCx2dCx6dDtmb3IoeXQ9ay5sYXN0SW5kZXhPZihtKSx5dDwwJiYoeXQ9MCkscnQ9MDtydDx5dDsrK3J0KWsuY2hhckNvZGVBdChydCk+PTEyOCYmTigibm90LWJhc2ljIiksSy5wdXNoKGsuY2hhckNvZGVBdChydCkpO2ZvcihQdD15dD4wP3l0KzE6MDtQdDxYOyl7Zm9yKGd0PW90LEN0PTEsbXQ9cztQdD49WCYmTigiaW52YWxpZC1pbnB1dCIpLHV0PVUoay5jaGFyQ29kZUF0KFB0KyspKSwodXQ+PXN8fHV0PkUoKGktb3QpL0N0KSkmJk4oIm92ZXJmbG93Iiksb3QrPXV0KkN0LHZ0PW10PD1wdD9mOm10Pj1wdCt1P3U6bXQtcHQsISh1dDx2dCk7bXQrPXMpenQ9cy12dCxDdD5FKGkvenQpJiZOKCJvdmVyZmxvdyIpLEN0Kj16dDtSPUsubGVuZ3RoKzEscHQ9UyhvdC1ndCxSLGd0PT0wKSxFKG90L1IpPmktYXQmJk4oIm92ZXJmbG93IiksYXQrPUUob3QvUiksb3QlPVIsSy5zcGxpY2Uob3QrKywwLGF0KX1yZXR1cm4gTChLKX1mdW5jdGlvbiBGKGspe3ZhciBLLFgsUixvdCxhdCxwdCx5dCxydCxQdCxndCxDdCxtdD1bXSx1dCx2dCx6dCxtZTtmb3Ioaz12KGspLHV0PWsubGVuZ3RoLEs9ZCxYPTAsYXQ9cCxwdD0wO3B0PHV0OysrcHQpQ3Q9a1twdF0sQ3Q8MTI4JiZtdC5wdXNoKHcoQ3QpKTtmb3IoUj1vdD1tdC5sZW5ndGgsb3QmJm10LnB1c2gobSk7Ujx1dDspe2Zvcih5dD1pLHB0PTA7cHQ8dXQ7KytwdClDdD1rW3B0XSxDdD49SyYmQ3Q8eXQmJih5dD1DdCk7Zm9yKHZ0PVIrMSx5dC1LPkUoKGktWCkvdnQpJiZOKCJvdmVyZmxvdyIpLFgrPSh5dC1LKSp2dCxLPXl0LHB0PTA7cHQ8dXQ7KytwdClpZihDdD1rW3B0XSxDdDxLJiYrK1g+aSYmTigib3ZlcmZsb3ciKSxDdD09Syl7Zm9yKHJ0PVgsUHQ9cztndD1QdDw9YXQ/ZjpQdD49YXQrdT91OlB0LWF0LCEocnQ8Z3QpO1B0Kz1zKW1lPXJ0LWd0LHp0PXMtZ3QsbXQucHVzaCh3KEEoZ3QrbWUlenQsMCkpKSxydD1FKG1lL3p0KTttdC5wdXNoKHcoQShydCwwKSkpLGF0PVMoWCx2dCxSPT1vdCksWD0wLCsrUn0rK1gsKytLfXJldHVybiBtdC5qb2luKCIiKX1mdW5jdGlvbiBqKGspe3JldHVybiBEKGssZnVuY3Rpb24oSyl7cmV0dXJuIF8udGVzdChLKT9QKEsuc2xpY2UoNCkudG9Mb3dlckNhc2UoKSk6S30pfWZ1bmN0aW9uIEgoayl7cmV0dXJuIEQoayxmdW5jdGlvbihLKXtyZXR1cm4gZy50ZXN0KEspPyJ4bi0tIitGKEspOkt9KX1pZihyPXt2ZXJzaW9uOiIxLjMuMiIsdWNzMjp7ZGVjb2RlOnYsZW5jb2RlOkx9LGRlY29kZTpQLGVuY29kZTpGLHRvQVNDSUk6SCx0b1VuaWNvZGU6an0sdHlwZW9mIGRlZmluZT09ImZ1bmN0aW9uIiYmdHlwZW9mIGRlZmluZS5hbWQ9PSJvYmplY3QiJiZkZWZpbmUuYW1kKWRlZmluZSgicHVueWNvZGUiLGZ1bmN0aW9uKCl7cmV0dXJuIHJ9KTtlbHNlIGlmKGUmJm4paWYoWGMuZXhwb3J0cz09ZSluLmV4cG9ydHM9cjtlbHNlIGZvcihDIGluIHIpci5oYXNPd25Qcm9wZXJ0eShDKSYmKGVbQ109cltDXSk7ZWxzZSB0LnB1bnljb2RlPXJ9KShXYyl9KTt2YXIgRDE9WG4oKEwxLGVwKT0+ey8qIQogKiBVUkkuanMgLSBNdXRhdGluZyBVUkxzCiAqIElQdjYgU3VwcG9ydAogKgogKiBWZXJzaW9uOiAxLjE5LjExCiAqCiAqIEF1dGhvcjogUm9kbmV5IFJlaG0KICogV2ViOiBodHRwOi8vbWVkaWFsaXplLmdpdGh1Yi5pby9VUkkuanMvCiAqCiAqIExpY2Vuc2VkIHVuZGVyCiAqICAgTUlUIExpY2Vuc2UgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9taXQtbGljZW5zZQogKgogKi8oZnVuY3Rpb24odCxlKXsidXNlIHN0cmljdCI7dHlwZW9mIGVwPT0ib2JqZWN0IiYmZXAuZXhwb3J0cz9lcC5leHBvcnRzPWUoKTp0eXBlb2YgZGVmaW5lPT0iZnVuY3Rpb24iJiZkZWZpbmUuYW1kP2RlZmluZShlKTp0LklQdjY9ZSh0KX0pKEwxLGZ1bmN0aW9uKHQpeyJ1c2Ugc3RyaWN0Ijt2YXIgZT10JiZ0LklQdjY7ZnVuY3Rpb24gbihyKXt2YXIgaT1yLnRvTG93ZXJDYXNlKCkscz1pLnNwbGl0KCI6IiksZj1zLmxlbmd0aCx1PTg7c1swXT09PSIiJiZzWzFdPT09IiImJnNbMl09PT0iIj8ocy5zaGlmdCgpLHMuc2hpZnQoKSk6c1swXT09PSIiJiZzWzFdPT09IiI/cy5zaGlmdCgpOnNbZi0xXT09PSIiJiZzW2YtMl09PT0iIiYmcy5wb3AoKSxmPXMubGVuZ3RoLHNbZi0xXS5pbmRleE9mKCIuIikhPT0tMSYmKHU9Nyk7dmFyIGM7Zm9yKGM9MDtjPGYmJnNbY10hPT0iIjtjKyspO2lmKGM8dSlmb3Iocy5zcGxpY2UoYywxLCIwMDAwIik7cy5sZW5ndGg8dTspcy5zcGxpY2UoYywwLCIwMDAwIik7Zm9yKHZhciBsLHA9MDtwPHU7cCsrKXtsPXNbcF0uc3BsaXQoIiIpO2Zvcih2YXIgZD0wO2Q8MyYmKGxbMF09PT0iMCImJmwubGVuZ3RoPjEpO2QrKylsLnNwbGljZSgwLDEpO3NbcF09bC5qb2luKCIiKX12YXIgbT0tMSxfPTAsZz0wLGI9LTEsVD0hMTtmb3IocD0wO3A8dTtwKyspVD9zW3BdPT09IjAiP2crPTE6KFQ9ITEsZz5fJiYobT1iLF89ZykpOnNbcF09PT0iMCImJihUPSEwLGI9cCxnPTEpO2c+XyYmKG09YixfPWcpLF8+MSYmcy5zcGxpY2UobSxfLCIiKSxmPXMubGVuZ3RoO3ZhciBPPSIiO2ZvcihzWzBdPT09IiImJihPPSI6IikscD0wO3A8ZiYmKE8rPXNbcF0scCE9PWYtMSk7cCsrKU8rPSI6IjtyZXR1cm4gc1tmLTFdPT09IiImJihPKz0iOiIpLE99ZnVuY3Rpb24gbygpe3JldHVybiB0LklQdjY9PT10aGlzJiYodC5JUHY2PWUpLHRoaXN9cmV0dXJue2Jlc3Q6bixub0NvbmZsaWN0Om99fSl9KTt2YXIgQjE9WG4oKEYxLG5wKT0+ey8qIQogKiBVUkkuanMgLSBNdXRhdGluZyBVUkxzCiAqIFNlY29uZCBMZXZlbCBEb21haW4gKFNMRCkgU3VwcG9ydAogKgogKiBWZXJzaW9uOiAxLjE5LjExCiAqCiAqIEF1dGhvcjogUm9kbmV5IFJlaG0KICogV2ViOiBodHRwOi8vbWVkaWFsaXplLmdpdGh1Yi5pby9VUkkuanMvCiAqCiAqIExpY2Vuc2VkIHVuZGVyCiAqICAgTUlUIExpY2Vuc2UgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9taXQtbGljZW5zZQogKgogKi8oZnVuY3Rpb24odCxlKXsidXNlIHN0cmljdCI7dHlwZW9mIG5wPT0ib2JqZWN0IiYmbnAuZXhwb3J0cz9ucC5leHBvcnRzPWUoKTp0eXBlb2YgZGVmaW5lPT0iZnVuY3Rpb24iJiZkZWZpbmUuYW1kP2RlZmluZShlKTp0LlNlY29uZExldmVsRG9tYWlucz1lKHQpfSkoRjEsZnVuY3Rpb24odCl7InVzZSBzdHJpY3QiO3ZhciBlPXQmJnQuU2Vjb25kTGV2ZWxEb21haW5zLG49e2xpc3Q6e2FjOiIgY29tIGdvdiBtaWwgbmV0IG9yZyAiLGFlOiIgYWMgY28gZ292IG1pbCBuYW1lIG5ldCBvcmcgcHJvIHNjaCAiLGFmOiIgY29tIGVkdSBnb3YgbmV0IG9yZyAiLGFsOiIgY29tIGVkdSBnb3YgbWlsIG5ldCBvcmcgIixhbzoiIGNvIGVkIGd2IGl0IG9nIHBiICIsYXI6IiBjb20gZWR1IGdvYiBnb3YgaW50IG1pbCBuZXQgb3JnIHR1ciAiLGF0OiIgYWMgY28gZ3Ygb3IgIixhdToiIGFzbiBjb20gY3Npcm8gZWR1IGdvdiBpZCBuZXQgb3JnICIsYmE6IiBjbyBjb20gZWR1IGdvdiBtaWwgbmV0IG9yZyBycyB1bmJpIHVubW8gdW5zYSB1bnR6IHVuemUgIixiYjoiIGJpeiBjbyBjb20gZWR1IGdvdiBpbmZvIG5ldCBvcmcgc3RvcmUgdHYgIixiaDoiIGJpeiBjYyBjb20gZWR1IGdvdiBpbmZvIG5ldCBvcmcgIixibjoiIGNvbSBlZHUgZ292IG5ldCBvcmcgIixibzoiIGNvbSBlZHUgZ29iIGdvdiBpbnQgbWlsIG5ldCBvcmcgdHYgIixicjoiIGFkbSBhZHYgYWdyIGFtIGFycSBhcnQgYXRvIGIgYmlvIGJsb2cgYm1kIGNpbSBjbmcgY250IGNvbSBjb29wIGVjbiBlZHUgZW5nIGVzcCBldGMgZXRpIGZhciBmbG9nIGZtIGZuZCBmb3QgZnN0IGcxMiBnZ2YgZ292IGltYiBpbmQgaW5mIGpvciBqdXMgbGVsIG1hdCBtZWQgbWlsIG11cyBuZXQgbm9tIG5vdCBudHIgb2RvIG9yZyBwcGcgcHJvIHBzYyBwc2kgcXNsIHJlYyBzbGcgc3J2IHRtcCB0cmQgdHVyIHR2IHZldCB2bG9nIHdpa2kgemxnICIsYnM6IiBjb20gZWR1IGdvdiBuZXQgb3JnICIsYno6IiBkdSBldCBvbSBvdiByZyAiLGNhOiIgYWIgYmMgbWIgbmIgbmYgbmwgbnMgbnQgbnUgb24gcGUgcWMgc2sgeWsgIixjazoiIGJpeiBjbyBlZHUgZ2VuIGdvdiBpbmZvIG5ldCBvcmcgIixjbjoiIGFjIGFoIGJqIGNvbSBjcSBlZHUgZmogZ2QgZ292IGdzIGd4IGd6IGhhIGhiIGhlIGhpIGhsIGhuIGpsIGpzIGp4IGxuIG1pbCBuZXQgbm0gbnggb3JnIHFoIHNjIHNkIHNoIHNuIHN4IHRqIHR3IHhqIHh6IHluIHpqICIsY286IiBjb20gZWR1IGdvdiBtaWwgbmV0IG5vbSBvcmcgIixjcjoiIGFjIGMgY28gZWQgZmkgZ28gb3Igc2EgIixjeToiIGFjIGJpeiBjb20gZWtsb2dlcyBnb3YgbHRkIG5hbWUgbmV0IG9yZyBwYXJsaWFtZW50IHByZXNzIHBybyB0bSAiLGRvOiIgYXJ0IGNvbSBlZHUgZ29iIGdvdiBtaWwgbmV0IG9yZyBzbGQgd2ViICIsZHo6IiBhcnQgYXNzbyBjb20gZWR1IGdvdiBuZXQgb3JnIHBvbCAiLGVjOiIgY29tIGVkdSBmaW4gZ292IGluZm8gbWVkIG1pbCBuZXQgb3JnIHBybyAiLGVnOiIgY29tIGVkdSBldW4gZ292IG1pbCBuYW1lIG5ldCBvcmcgc2NpICIsZXI6IiBjb20gZWR1IGdvdiBpbmQgbWlsIG5ldCBvcmcgcm9jaGVzdCB3ICIsZXM6IiBjb20gZWR1IGdvYiBub20gb3JnICIsZXQ6IiBiaXogY29tIGVkdSBnb3YgaW5mbyBuYW1lIG5ldCBvcmcgIixmajoiIGFjIGJpeiBjb20gaW5mbyBtaWwgbmFtZSBuZXQgb3JnIHBybyAiLGZrOiIgYWMgY28gZ292IG5ldCBub20gb3JnICIsZnI6IiBhc3NvIGNvbSBmIGdvdXYgbm9tIHByZCBwcmVzc2UgdG0gIixnZzoiIGNvIG5ldCBvcmcgIixnaDoiIGNvbSBlZHUgZ292IG1pbCBvcmcgIixnbjoiIGFjIGNvbSBnb3YgbmV0IG9yZyAiLGdyOiIgY29tIGVkdSBnb3YgbWlsIG5ldCBvcmcgIixndDoiIGNvbSBlZHUgZ29iIGluZCBtaWwgbmV0IG9yZyAiLGd1OiIgY29tIGVkdSBnb3YgbmV0IG9yZyAiLGhrOiIgY29tIGVkdSBnb3YgaWR2IG5ldCBvcmcgIixodToiIDIwMDAgYWdyYXIgYm9sdCBjYXNpbm8gY2l0eSBjbyBlcm90aWNhIGVyb3Rpa2EgZmlsbSBmb3J1bSBnYW1lcyBob3RlbCBpbmZvIGluZ2F0bGFuIGpvZ2FzeiBrb255dmVsbyBsYWthcyBtZWRpYSBuZXdzIG9yZyBwcml2IHJla2xhbSBzZXggc2hvcCBzcG9ydCBzdWxpIHN6ZXggdG0gdG96c2RlIHV0YXphcyB2aWRlbyAiLGlkOiIgYWMgY28gZ28gbWlsIG5ldCBvciBzY2ggd2ViICIsaWw6IiBhYyBjbyBnb3YgaWRmIGsxMiBtdW5pIG5ldCBvcmcgIixpbjoiIGFjIGNvIGVkdSBlcm5ldCBmaXJtIGdlbiBnb3YgaSBpbmQgbWlsIG5ldCBuaWMgb3JnIHJlcyAiLGlxOiIgY29tIGVkdSBnb3YgaSBtaWwgbmV0IG9yZyAiLGlyOiIgYWMgY28gZG5zc2VjIGdvdiBpIGlkIG5ldCBvcmcgc2NoICIsaXQ6IiBlZHUgZ292ICIsamU6IiBjbyBuZXQgb3JnICIsam86IiBjb20gZWR1IGdvdiBtaWwgbmFtZSBuZXQgb3JnIHNjaCAiLGpwOiIgYWMgYWQgY28gZWQgZ28gZ3IgbGcgbmUgb3IgIixrZToiIGFjIGNvIGdvIGluZm8gbWUgbW9iaSBuZSBvciBzYyAiLGtoOiIgY29tIGVkdSBnb3YgbWlsIG5ldCBvcmcgcGVyICIsa2k6IiBiaXogY29tIGRlIGVkdSBnb3YgaW5mbyBtb2IgbmV0IG9yZyB0ZWwgIixrbToiIGFzc28gY29tIGNvb3AgZWR1IGdvdXYgayBtZWRlY2luIG1pbCBub20gbm90YWlyZXMgcGhhcm1hY2llbnMgcHJlc3NlIHRtIHZldGVyaW5haXJlICIsa246IiBlZHUgZ292IG5ldCBvcmcgIixrcjoiIGFjIGJ1c2FuIGNodW5nYnVrIGNodW5nbmFtIGNvIGRhZWd1IGRhZWplb24gZXMgZ2FuZ3dvbiBnbyBnd2FuZ2p1IGd5ZW9uZ2J1ayBneWVvbmdnaSBneWVvbmduYW0gaHMgaW5jaGVvbiBqZWp1IGplb25idWsgamVvbm5hbSBrIGtnIG1pbCBtcyBuZSBvciBwZSByZSBzYyBzZW91bCB1bHNhbiAiLGt3OiIgY29tIGVkdSBnb3YgbmV0IG9yZyAiLGt5OiIgY29tIGVkdSBnb3YgbmV0IG9yZyAiLGt6OiIgY29tIGVkdSBnb3YgbWlsIG5ldCBvcmcgIixsYjoiIGNvbSBlZHUgZ292IG5ldCBvcmcgIixsazoiIGFzc24gY29tIGVkdSBnb3YgZ3JwIGhvdGVsIGludCBsdGQgbmV0IG5nbyBvcmcgc2NoIHNvYyB3ZWIgIixscjoiIGNvbSBlZHUgZ292IG5ldCBvcmcgIixsdjoiIGFzbiBjb20gY29uZiBlZHUgZ292IGlkIG1pbCBuZXQgb3JnICIsbHk6IiBjb20gZWR1IGdvdiBpZCBtZWQgbmV0IG9yZyBwbGMgc2NoICIsbWE6IiBhYyBjbyBnb3YgbSBuZXQgb3JnIHByZXNzICIsbWM6IiBhc3NvIHRtICIsbWU6IiBhYyBjbyBlZHUgZ292IGl0cyBuZXQgb3JnIHByaXYgIixtZzoiIGNvbSBlZHUgZ292IG1pbCBub20gb3JnIHByZCB0bSAiLG1rOiIgY29tIGVkdSBnb3YgaW5mIG5hbWUgbmV0IG9yZyBwcm8gIixtbDoiIGNvbSBlZHUgZ292IG5ldCBvcmcgcHJlc3NlICIsbW46IiBlZHUgZ292IG9yZyAiLG1vOiIgY29tIGVkdSBnb3YgbmV0IG9yZyAiLG10OiIgY29tIGVkdSBnb3YgbmV0IG9yZyAiLG12OiIgYWVybyBiaXogY29tIGNvb3AgZWR1IGdvdiBpbmZvIGludCBtaWwgbXVzZXVtIG5hbWUgbmV0IG9yZyBwcm8gIixtdzoiIGFjIGNvIGNvbSBjb29wIGVkdSBnb3YgaW50IG11c2V1bSBuZXQgb3JnICIsbXg6IiBjb20gZWR1IGdvYiBuZXQgb3JnICIsbXk6IiBjb20gZWR1IGdvdiBtaWwgbmFtZSBuZXQgb3JnIHNjaCAiLG5mOiIgYXJ0cyBjb20gZmlybSBpbmZvIG5ldCBvdGhlciBwZXIgcmVjIHN0b3JlIHdlYiAiLG5nOiIgYml6IGNvbSBlZHUgZ292IG1pbCBtb2JpIG5hbWUgbmV0IG9yZyBzY2ggIixuaToiIGFjIGNvIGNvbSBlZHUgZ29iIG1pbCBuZXQgbm9tIG9yZyAiLG5wOiIgY29tIGVkdSBnb3YgbWlsIG5ldCBvcmcgIixucjoiIGJpeiBjb20gZWR1IGdvdiBpbmZvIG5ldCBvcmcgIixvbToiIGFjIGJpeiBjbyBjb20gZWR1IGdvdiBtZWQgbWlsIG11c2V1bSBuZXQgb3JnIHBybyBzY2ggIixwZToiIGNvbSBlZHUgZ29iIG1pbCBuZXQgbm9tIG9yZyBzbGQgIixwaDoiIGNvbSBlZHUgZ292IGkgbWlsIG5ldCBuZ28gb3JnICIscGs6IiBiaXogY29tIGVkdSBmYW0gZ29iIGdvayBnb24gZ29wIGdvcyBnb3YgbmV0IG9yZyB3ZWIgIixwbDoiIGFydCBiaWFseXN0b2sgYml6IGNvbSBlZHUgZ2RhIGdkYW5zayBnb3J6b3cgZ292IGluZm8ga2F0b3dpY2Uga3Jha293IGxvZHogbHVibGluIG1pbCBuZXQgbmdvIG9sc3p0eW4gb3JnIHBvem5hbiBwd3IgcmFkb20gc2x1cHNrIHN6Y3plY2luIHRvcnVuIHdhcnN6YXdhIHdhdyB3cm9jIHdyb2NsYXcgemdvcmEgIixwcjoiIGFjIGJpeiBjb20gZWR1IGVzdCBnb3YgaW5mbyBpc2xhIG5hbWUgbmV0IG9yZyBwcm8gcHJvZiAiLHBzOiIgY29tIGVkdSBnb3YgbmV0IG9yZyBwbG8gc2VjICIscHc6IiBiZWxhdSBjbyBlZCBnbyBuZSBvciAiLHJvOiIgYXJ0cyBjb20gZmlybSBpbmZvIG5vbSBudCBvcmcgcmVjIHN0b3JlIHRtIHd3dyAiLHJzOiIgYWMgY28gZWR1IGdvdiBpbiBvcmcgIixzYjoiIGNvbSBlZHUgZ292IG5ldCBvcmcgIixzYzoiIGNvbSBlZHUgZ292IG5ldCBvcmcgIixzaDoiIGNvIGNvbSBlZHUgZ292IG5ldCBub20gb3JnICIsc2w6IiBjb20gZWR1IGdvdiBuZXQgb3JnICIsc3Q6IiBjbyBjb20gY29uc3VsYWRvIGVkdSBlbWJhaXhhZGEgZ292IG1pbCBuZXQgb3JnIHByaW5jaXBlIHNhb3RvbWUgc3RvcmUgIixzdjoiIGNvbSBlZHUgZ29iIG9yZyByZWQgIixzejoiIGFjIGNvIG9yZyAiLHRyOiIgYXYgYmJzIGJlbCBiaXogY29tIGRyIGVkdSBnZW4gZ292IGluZm8gazEyIG5hbWUgbmV0IG9yZyBwb2wgdGVsIHRzayB0diB3ZWIgIix0dDoiIGFlcm8gYml6IGNhdCBjbyBjb20gY29vcCBlZHUgZ292IGluZm8gaW50IGpvYnMgbWlsIG1vYmkgbXVzZXVtIG5hbWUgbmV0IG9yZyBwcm8gdGVsIHRyYXZlbCAiLHR3OiIgY2x1YiBjb20gZWJpeiBlZHUgZ2FtZSBnb3YgaWR2IG1pbCBuZXQgb3JnICIsbXU6IiBhYyBjbyBjb20gZ292IG5ldCBvciBvcmcgIixtejoiIGFjIGNvIGVkdSBnb3Ygb3JnICIsbmE6IiBjbyBjb20gIixuejoiIGFjIGNvIGNyaSBnZWVrIGdlbiBnb3Z0IGhlYWx0aCBpd2kgbWFvcmkgbWlsIG5ldCBvcmcgcGFybGlhbWVudCBzY2hvb2wgIixwYToiIGFibyBhYyBjb20gZWR1IGdvYiBpbmcgbWVkIG5ldCBub20gb3JnIHNsZCAiLHB0OiIgY29tIGVkdSBnb3YgaW50IG5ldCBub21lIG9yZyBwdWJsICIscHk6IiBjb20gZWR1IGdvdiBtaWwgbmV0IG9yZyAiLHFhOiIgY29tIGVkdSBnb3YgbWlsIG5ldCBvcmcgIixyZToiIGFzc28gY29tIG5vbSAiLHJ1OiIgYWMgYWR5Z2V5YSBhbHRhaSBhbXVyIGFya2hhbmdlbHNrIGFzdHJha2hhbiBiYXNoa2lyaWEgYmVsZ29yb2QgYmlyIGJyeWFuc2sgYnVyeWF0aWEgY2JnIGNoZWwgY2hlbHlhYmluc2sgY2hpdGEgY2h1a290a2EgY2h1dmFzaGlhIGNvbSBkYWdlc3RhbiBlLWJ1cmcgZWR1IGdvdiBncm96bnkgaW50IGlya3V0c2sgaXZhbm92byBpemhldnNrIGphciBqb3Noa2FyLW9sYSBrYWxteWtpYSBrYWx1Z2Ega2FtY2hhdGthIGthcmVsaWEga2F6YW4ga2NociBrZW1lcm92byBraGFiYXJvdnNrIGtoYWthc3NpYSBraHYga2lyb3Yga29lbmlnIGtvbWkga29zdHJvbWEga3Jhbm95YXJzayBrdWJhbiBrdXJnYW4ga3Vyc2sgbGlwZXRzayBtYWdhZGFuIG1hcmkgbWFyaS1lbCBtYXJpbmUgbWlsIG1vcmRvdmlhIG1vc3JlZyBtc2sgbXVybWFuc2sgbmFsY2hpayBuZXQgbm5vdiBub3Ygbm92b3NpYmlyc2sgbnNrIG9tc2sgb3JlbmJ1cmcgb3JnIG9yeW9sIHBlbnphIHBlcm0gcHAgcHNrb3YgcHR6IHJuZCByeWF6YW4gc2FraGFsaW4gc2FtYXJhIHNhcmF0b3Ygc2ltYmlyc2sgc21vbGVuc2sgc3BiIHN0YXZyb3BvbCBzdHYgc3VyZ3V0IHRhbWJvdiB0YXRhcnN0YW4gdG9tIHRvbXNrIHRzYXJpdHN5biB0c2sgdHVsYSB0dXZhIHR2ZXIgdHl1bWVuIHVkbSB1ZG11cnRpYSB1bGFuLXVkZSB2bGFkaWthdmtheiB2bGFkaW1pciB2bGFkaXZvc3RvayB2b2xnb2dyYWQgdm9sb2dkYSB2b3JvbmV6aCB2cm4gdnlhdGthIHlha3V0aWEgeWFtYWwgeWVrYXRlcmluYnVyZyB5dXpobm8tc2FraGFsaW5zayAiLHJ3OiIgYWMgY28gY29tIGVkdSBnb3V2IGdvdiBpbnQgbWlsIG5ldCAiLHNhOiIgY29tIGVkdSBnb3YgbWVkIG5ldCBvcmcgcHViIHNjaCAiLHNkOiIgY29tIGVkdSBnb3YgaW5mbyBtZWQgbmV0IG9yZyB0diAiLHNlOiIgYSBhYyBiIGJkIGMgZCBlIGYgZyBoIGkgayBsIG0gbiBvIG9yZyBwIHBhcnRpIHBwIHByZXNzIHIgcyB0IHRtIHUgdyB4IHkgeiAiLHNnOiIgY29tIGVkdSBnb3YgaWRuIG5ldCBvcmcgcGVyICIsc246IiBhcnQgY29tIGVkdSBnb3V2IG9yZyBwZXJzbyB1bml2ICIsc3k6IiBjb20gZWR1IGdvdiBtaWwgbmV0IG5ld3Mgb3JnICIsdGg6IiBhYyBjbyBnbyBpbiBtaSBuZXQgb3IgIix0ajoiIGFjIGJpeiBjbyBjb20gZWR1IGdvIGdvdiBpbmZvIGludCBtaWwgbmFtZSBuZXQgbmljIG9yZyB0ZXN0IHdlYiAiLHRuOiIgYWdyaW5ldCBjb20gZGVmZW5zZSBlZHVuZXQgZW5zIGZpbiBnb3YgaW5kIGluZm8gaW50bCBtaW5jb20gbmF0IG5ldCBvcmcgcGVyc28gcm5ydCBybnMgcm51IHRvdXJpc20gIix0ejoiIGFjIGNvIGdvIG5lIG9yICIsdWE6IiBiaXogY2hlcmthc3N5IGNoZXJuaWdvdiBjaGVybm92dHN5IGNrIGNuIGNvIGNvbSBjcmltZWEgY3YgZG4gZG5lcHJvcGV0cm92c2sgZG9uZXRzayBkcCBlZHUgZ292IGlmIGluIGl2YW5vLWZyYW5raXZzayBraCBraGFya292IGtoZXJzb24ga2htZWxuaXRza2l5IGtpZXYga2lyb3ZvZ3JhZCBrbSBrciBrcyBrdiBsZyBsdWdhbnNrIGx1dHNrIGx2aXYgbWUgbWsgbmV0IG5pa29sYWV2IG9kIG9kZXNzYSBvcmcgcGwgcG9sdGF2YSBwcCByb3ZubyBydiBzZWJhc3RvcG9sIHN1bXkgdGUgdGVybm9waWwgdXpoZ29yb2QgdmlubmljYSB2biB6YXBvcml6aHpoZSB6aGl0b21pciB6cCB6dCAiLHVnOiIgYWMgY28gZ28gbmUgb3Igb3JnIHNjICIsdWs6IiBhYyBibCBicml0aXNoLWxpYnJhcnkgY28gY3ltIGdvdiBnb3Z0IGljbmV0IGpldCBsZWEgbHRkIG1lIG1pbCBtb2QgbmF0aW9uYWwtbGlicmFyeS1zY290bGFuZCBuZWwgbmV0IG5ocyBuaWMgbmxzIG9yZyBvcmduIHBhcmxpYW1lbnQgcGxjIHBvbGljZSBzY2ggc2NvdCBzb2MgIix1czoiIGRuaSBmZWQgaXNhIGtpZHMgbnNuICIsdXk6IiBjb20gZWR1IGd1YiBtaWwgbmV0IG9yZyAiLHZlOiIgY28gY29tIGVkdSBnb2IgaW5mbyBtaWwgbmV0IG9yZyB3ZWIgIix2aToiIGNvIGNvbSBrMTIgbmV0IG9yZyAiLHZuOiIgYWMgYml6IGNvbSBlZHUgZ292IGhlYWx0aCBpbmZvIGludCBuYW1lIG5ldCBvcmcgcHJvICIseWU6IiBjbyBjb20gZ292IGx0ZCBtZSBuZXQgb3JnIHBsYyAiLHl1OiIgYWMgY28gZWR1IGdvdiBvcmcgIix6YToiIGFjIGFncmljIGFsdCBib3Vyc2UgY2l0eSBjbyBjeWJlcm5ldCBkYiBlZHUgZ292IGdyb25kYXIgaWFjY2VzcyBpbXQgaW5jYSBsYW5kZXNpZ24gbGF3IG1pbCBuZXQgbmdvIG5pcyBub20gb2xpdmV0dGkgb3JnIHBpeCBzY2hvb2wgdG0gd2ViICIsem06IiBhYyBjbyBjb20gZWR1IGdvdiBuZXQgb3JnIHNjaCAiLGNvbToiYXIgYnIgY24gZGUgZXUgZ2IgZ3IgaHUganBuIGtyIG5vIHFjIHJ1IHNhIHNlIHVrIHVzIHV5IHphICIsbmV0OiJnYiBqcCBzZSB1ayAiLG9yZzoiYWUiLGRlOiJjb20gIn0saGFzOmZ1bmN0aW9uKG8pe3ZhciByPW8ubGFzdEluZGV4T2YoIi4iKTtpZihyPD0wfHxyPj1vLmxlbmd0aC0xKXJldHVybiExO3ZhciBpPW8ubGFzdEluZGV4T2YoIi4iLHItMSk7aWYoaTw9MHx8aT49ci0xKXJldHVybiExO3ZhciBzPW4ubGlzdFtvLnNsaWNlKHIrMSldO3JldHVybiBzP3MuaW5kZXhPZigiICIrby5zbGljZShpKzEscikrIiAiKT49MDohMX0saXM6ZnVuY3Rpb24obyl7dmFyIHI9by5sYXN0SW5kZXhPZigiLiIpO2lmKHI8PTB8fHI+PW8ubGVuZ3RoLTEpcmV0dXJuITE7dmFyIGk9by5sYXN0SW5kZXhPZigiLiIsci0xKTtpZihpPj0wKXJldHVybiExO3ZhciBzPW4ubGlzdFtvLnNsaWNlKHIrMSldO3JldHVybiBzP3MuaW5kZXhPZigiICIrby5zbGljZSgwLHIpKyIgIik+PTA6ITF9LGdldDpmdW5jdGlvbihvKXt2YXIgcj1vLmxhc3RJbmRleE9mKCIuIik7aWYocjw9MHx8cj49by5sZW5ndGgtMSlyZXR1cm4gbnVsbDt2YXIgaT1vLmxhc3RJbmRleE9mKCIuIixyLTEpO2lmKGk8PTB8fGk+PXItMSlyZXR1cm4gbnVsbDt2YXIgcz1uLmxpc3Rbby5zbGljZShyKzEpXTtyZXR1cm4hc3x8cy5pbmRleE9mKCIgIitvLnNsaWNlKGkrMSxyKSsiICIpPDA/bnVsbDpvLnNsaWNlKGkrMSl9LG5vQ29uZmxpY3Q6ZnVuY3Rpb24oKXtyZXR1cm4gdC5TZWNvbmRMZXZlbERvbWFpbnM9PT10aGlzJiYodC5TZWNvbmRMZXZlbERvbWFpbnM9ZSksdGhpc319O3JldHVybiBufSl9KTt2YXIgenM9WG4oKFUxLG9wKT0+ey8qIQogKiBVUkkuanMgLSBNdXRhdGluZyBVUkxzCiAqCiAqIFZlcnNpb246IDEuMTkuMTEKICoKICogQXV0aG9yOiBSb2RuZXkgUmVobQogKiBXZWI6IGh0dHA6Ly9tZWRpYWxpemUuZ2l0aHViLmlvL1VSSS5qcy8KICoKICogTGljZW5zZWQgdW5kZXIKICogICBNSVQgTGljZW5zZSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL21pdC1saWNlbnNlCiAqCiAqLyhmdW5jdGlvbih0LGUpeyJ1c2Ugc3RyaWN0Ijt0eXBlb2Ygb3A9PSJvYmplY3QiJiZvcC5leHBvcnRzP29wLmV4cG9ydHM9ZSh2MSgpLEQxKCksQjEoKSk6dHlwZW9mIGRlZmluZT09ImZ1bmN0aW9uIiYmZGVmaW5lLmFtZD9kZWZpbmUoWyIuL3B1bnljb2RlIiwiLi9JUHY2IiwiLi9TZWNvbmRMZXZlbERvbWFpbnMiXSxlKTp0LlVSST1lKHQucHVueWNvZGUsdC5JUHY2LHQuU2Vjb25kTGV2ZWxEb21haW5zLHQpfSkoVTEsZnVuY3Rpb24odCxlLG4sbyl7InVzZSBzdHJpY3QiO3ZhciByPW8mJm8uVVJJO2Z1bmN0aW9uIGkoQSxTKXt2YXIgUD1hcmd1bWVudHMubGVuZ3RoPj0xLEY9YXJndW1lbnRzLmxlbmd0aD49MjtpZighKHRoaXMgaW5zdGFuY2VvZiBpKSlyZXR1cm4gUD9GP25ldyBpKEEsUyk6bmV3IGkoQSk6bmV3IGk7aWYoQT09PXZvaWQgMCl7aWYoUCl0aHJvdyBuZXcgVHlwZUVycm9yKCJ1bmRlZmluZWQgaXMgbm90IGEgdmFsaWQgYXJndW1lbnQgZm9yIFVSSSIpO3R5cGVvZiBsb2NhdGlvbjwidSI/QT1sb2NhdGlvbi5ocmVmKyIiOkE9IiJ9aWYoQT09PW51bGwmJlApdGhyb3cgbmV3IFR5cGVFcnJvcigibnVsbCBpcyBub3QgYSB2YWxpZCBhcmd1bWVudCBmb3IgVVJJIik7cmV0dXJuIHRoaXMuaHJlZihBKSxTIT09dm9pZCAwP3RoaXMuYWJzb2x1dGVUbyhTKTp0aGlzfWZ1bmN0aW9uIHMoQSl7cmV0dXJuL15bMC05XSskLy50ZXN0KEEpfWkudmVyc2lvbj0iMS4xOS4xMSI7dmFyIGY9aS5wcm90b3R5cGUsdT1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O2Z1bmN0aW9uIGMoQSl7cmV0dXJuIEEucmVwbGFjZSgvKFsuKis/Xj0hOiR7fSgpfFtcXVwvXFxdKS9nLCJcXCQxIil9ZnVuY3Rpb24gbChBKXtyZXR1cm4gQT09PXZvaWQgMD8iVW5kZWZpbmVkIjpTdHJpbmcoT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKEEpKS5zbGljZSg4LC0xKX1mdW5jdGlvbiBwKEEpe3JldHVybiBsKEEpPT09IkFycmF5In1mdW5jdGlvbiBkKEEsUyl7dmFyIFA9e30sRixqO2lmKGwoUyk9PT0iUmVnRXhwIilQPW51bGw7ZWxzZSBpZihwKFMpKWZvcihGPTAsaj1TLmxlbmd0aDtGPGo7RisrKVBbU1tGXV09ITA7ZWxzZSBQW1NdPSEwO2ZvcihGPTAsaj1BLmxlbmd0aDtGPGo7RisrKXt2YXIgSD1QJiZQW0FbRl1dIT09dm9pZCAwfHwhUCYmUy50ZXN0KEFbRl0pO0gmJihBLnNwbGljZShGLDEpLGotLSxGLS0pfXJldHVybiBBfWZ1bmN0aW9uIG0oQSxTKXt2YXIgUCxGO2lmKHAoUykpe2ZvcihQPTAsRj1TLmxlbmd0aDtQPEY7UCsrKWlmKCFtKEEsU1tQXSkpcmV0dXJuITE7cmV0dXJuITB9dmFyIGo9bChTKTtmb3IoUD0wLEY9QS5sZW5ndGg7UDxGO1ArKylpZihqPT09IlJlZ0V4cCIpe2lmKHR5cGVvZiBBW1BdPT0ic3RyaW5nIiYmQVtQXS5tYXRjaChTKSlyZXR1cm4hMH1lbHNlIGlmKEFbUF09PT1TKXJldHVybiEwO3JldHVybiExfWZ1bmN0aW9uIF8oQSxTKXtpZighcChBKXx8IXAoUyl8fEEubGVuZ3RoIT09Uy5sZW5ndGgpcmV0dXJuITE7QS5zb3J0KCksUy5zb3J0KCk7Zm9yKHZhciBQPTAsRj1BLmxlbmd0aDtQPEY7UCsrKWlmKEFbUF0hPT1TW1BdKXJldHVybiExO3JldHVybiEwfWZ1bmN0aW9uIGcoQSl7dmFyIFM9L15cLyt8XC8rJC9nO3JldHVybiBBLnJlcGxhY2UoUywiIil9aS5fcGFydHM9ZnVuY3Rpb24oKXtyZXR1cm57cHJvdG9jb2w6bnVsbCx1c2VybmFtZTpudWxsLHBhc3N3b3JkOm51bGwsaG9zdG5hbWU6bnVsbCx1cm46bnVsbCxwb3J0Om51bGwscGF0aDpudWxsLHF1ZXJ5Om51bGwsZnJhZ21lbnQ6bnVsbCxwcmV2ZW50SW52YWxpZEhvc3RuYW1lOmkucHJldmVudEludmFsaWRIb3N0bmFtZSxkdXBsaWNhdGVRdWVyeVBhcmFtZXRlcnM6aS5kdXBsaWNhdGVRdWVyeVBhcmFtZXRlcnMsZXNjYXBlUXVlcnlTcGFjZTppLmVzY2FwZVF1ZXJ5U3BhY2V9fSxpLnByZXZlbnRJbnZhbGlkSG9zdG5hbWU9ITEsaS5kdXBsaWNhdGVRdWVyeVBhcmFtZXRlcnM9ITEsaS5lc2NhcGVRdWVyeVNwYWNlPSEwLGkucHJvdG9jb2xfZXhwcmVzc2lvbj0vXlthLXpdW2EtejAtOS4rLV0qJC9pLGkuaWRuX2V4cHJlc3Npb249L1teYS16MC05XC5fLV0vaSxpLnB1bnljb2RlX2V4cHJlc3Npb249Lyh4bi0tKS9pLGkuaXA0X2V4cHJlc3Npb249L15cZHsxLDN9XC5cZHsxLDN9XC5cZHsxLDN9XC5cZHsxLDN9JC8saS5pcDZfZXhwcmVzc2lvbj0vXlxzKigoKFswLTlBLUZhLWZdezEsNH06KXs3fShbMC05QS1GYS1mXXsxLDR9fDopKXwoKFswLTlBLUZhLWZdezEsNH06KXs2fSg6WzAtOUEtRmEtZl17MSw0fXwoKDI1WzAtNV18MlswLTRdXGR8MVxkXGR8WzEtOV0/XGQpKFwuKDI1WzAtNV18MlswLTRdXGR8MVxkXGR8WzEtOV0/XGQpKXszfSl8OikpfCgoWzAtOUEtRmEtZl17MSw0fTopezV9KCgoOlswLTlBLUZhLWZdezEsNH0pezEsMn0pfDooKDI1WzAtNV18MlswLTRdXGR8MVxkXGR8WzEtOV0/XGQpKFwuKDI1WzAtNV18MlswLTRdXGR8MVxkXGR8WzEtOV0/XGQpKXszfSl8OikpfCgoWzAtOUEtRmEtZl17MSw0fTopezR9KCgoOlswLTlBLUZhLWZdezEsNH0pezEsM30pfCgoOlswLTlBLUZhLWZdezEsNH0pPzooKDI1WzAtNV18MlswLTRdXGR8MVxkXGR8WzEtOV0/XGQpKFwuKDI1WzAtNV18MlswLTRdXGR8MVxkXGR8WzEtOV0/XGQpKXszfSkpfDopKXwoKFswLTlBLUZhLWZdezEsNH06KXszfSgoKDpbMC05QS1GYS1mXXsxLDR9KXsxLDR9KXwoKDpbMC05QS1GYS1mXXsxLDR9KXswLDJ9OigoMjVbMC01XXwyWzAtNF1cZHwxXGRcZHxbMS05XT9cZCkoXC4oMjVbMC01XXwyWzAtNF1cZHwxXGRcZHxbMS05XT9cZCkpezN9KSl8OikpfCgoWzAtOUEtRmEtZl17MSw0fTopezJ9KCgoOlswLTlBLUZhLWZdezEsNH0pezEsNX0pfCgoOlswLTlBLUZhLWZdezEsNH0pezAsM306KCgyNVswLTVdfDJbMC00XVxkfDFcZFxkfFsxLTldP1xkKShcLigyNVswLTVdfDJbMC00XVxkfDFcZFxkfFsxLTldP1xkKSl7M30pKXw6KSl8KChbMC05QS1GYS1mXXsxLDR9Oil7MX0oKCg6WzAtOUEtRmEtZl17MSw0fSl7MSw2fSl8KCg6WzAtOUEtRmEtZl17MSw0fSl7MCw0fTooKDI1WzAtNV18MlswLTRdXGR8MVxkXGR8WzEtOV0/XGQpKFwuKDI1WzAtNV18MlswLTRdXGR8MVxkXGR8WzEtOV0/XGQpKXszfSkpfDopKXwoOigoKDpbMC05QS1GYS1mXXsxLDR9KXsxLDd9KXwoKDpbMC05QS1GYS1mXXsxLDR9KXswLDV9OigoMjVbMC01XXwyWzAtNF1cZHwxXGRcZHxbMS05XT9cZCkoXC4oMjVbMC01XXwyWzAtNF1cZHwxXGRcZHxbMS05XT9cZCkpezN9KSl8OikpKSglLispP1xzKiQvLGkuZmluZF91cmlfZXhwcmVzc2lvbj0vXGIoKD86W2Etel1bXHctXSs6KD86XC97MSwzfXxbYS16MC05JV0pfHd3d1xkezAsM31bLl18W2EtejAtOS5cLV0rWy5dW2Etel17Miw0fVwvKSg/OlteXHMoKTw+XSt8XCgoW15ccygpPD5dK3woXChbXlxzKCk8Pl0rXCkpKSpcKSkrKD86XCgoW15ccygpPD5dK3woXChbXlxzKCk8Pl0rXCkpKSpcKXxbXlxzYCEoKVxbXF17fTs6JyIuLDw+P8KrwrvigJzigJ3igJjigJldKSkvaWcsaS5maW5kVXJpPXtzdGFydDovXGIoPzooW2Etel1bYS16MC05ListXSo6XC9cLyl8d3d3XC4pL2dpLGVuZDovW1xzXHJcbl18JC8sdHJpbTovW2AhKClcW1xde307OiciLiw8Pj/Cq8K74oCc4oCd4oCe4oCY4oCZXSskLyxwYXJlbnM6LyhcKFteXCldKlwpfFxbW15cXV0qXF18XHtbXn1dKlx9fDxbXj5dKj4pL2d9LGkubGVhZGluZ193aGl0ZXNwYWNlX2V4cHJlc3Npb249L15bXHgwMC1ceDIwXHUwMGEwXHUxNjgwXHUyMDAwLVx1MjAwYVx1MjAyOFx1MjAyOVx1MjAyZlx1MjA1Zlx1MzAwMFx1ZmVmZl0rLyxpLmFzY2lpX3RhYl93aGl0ZXNwYWNlPS9bXHUwMDA5XHUwMDBBXHUwMDBEXSsvZyxpLmRlZmF1bHRQb3J0cz17aHR0cDoiODAiLGh0dHBzOiI0NDMiLGZ0cDoiMjEiLGdvcGhlcjoiNzAiLHdzOiI4MCIsd3NzOiI0NDMifSxpLmhvc3RQcm90b2NvbHM9WyJodHRwIiwiaHR0cHMiXSxpLmludmFsaWRfaG9zdG5hbWVfY2hhcmFjdGVycz0vW15hLXpBLVowLTlcLlwtOl9dLyxpLmRvbUF0dHJpYnV0ZXM9e2E6ImhyZWYiLGJsb2NrcXVvdGU6ImNpdGUiLGxpbms6ImhyZWYiLGJhc2U6ImhyZWYiLHNjcmlwdDoic3JjIixmb3JtOiJhY3Rpb24iLGltZzoic3JjIixhcmVhOiJocmVmIixpZnJhbWU6InNyYyIsZW1iZWQ6InNyYyIsc291cmNlOiJzcmMiLHRyYWNrOiJzcmMiLGlucHV0OiJzcmMiLGF1ZGlvOiJzcmMiLHZpZGVvOiJzcmMifSxpLmdldERvbUF0dHJpYnV0ZT1mdW5jdGlvbihBKXtpZighKCFBfHwhQS5ub2RlTmFtZSkpe3ZhciBTPUEubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtpZighKFM9PT0iaW5wdXQiJiZBLnR5cGUhPT0iaW1hZ2UiKSlyZXR1cm4gaS5kb21BdHRyaWJ1dGVzW1NdfX07ZnVuY3Rpb24gYihBKXtyZXR1cm4gZXNjYXBlKEEpfWZ1bmN0aW9uIFQoQSl7cmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudChBKS5yZXBsYWNlKC9bIScoKSpdL2csYikucmVwbGFjZSgvXCovZywiJTJBIil9aS5lbmNvZGU9VCxpLmRlY29kZT1kZWNvZGVVUklDb21wb25lbnQsaS5pc284ODU5PWZ1bmN0aW9uKCl7aS5lbmNvZGU9ZXNjYXBlLGkuZGVjb2RlPXVuZXNjYXBlfSxpLnVuaWNvZGU9ZnVuY3Rpb24oKXtpLmVuY29kZT1ULGkuZGVjb2RlPWRlY29kZVVSSUNvbXBvbmVudH0saS5jaGFyYWN0ZXJzPXtwYXRobmFtZTp7ZW5jb2RlOntleHByZXNzaW9uOi8lKDI0fDI2fDJCfDJDfDNCfDNEfDNBfDQwKS9pZyxtYXA6eyIlMjQiOiIkIiwiJTI2IjoiJiIsIiUyQiI6IisiLCIlMkMiOiIsIiwiJTNCIjoiOyIsIiUzRCI6Ij0iLCIlM0EiOiI6IiwiJTQwIjoiQCJ9fSxkZWNvZGU6e2V4cHJlc3Npb246L1tcL1w/I10vZyxtYXA6eyIvIjoiJTJGIiwiPyI6IiUzRiIsIiMiOiIlMjMifX19LHJlc2VydmVkOntlbmNvZGU6e2V4cHJlc3Npb246LyUoMjF8MjN8MjR8MjZ8Mjd8Mjh8Mjl8MkF8MkJ8MkN8MkZ8M0F8M0J8M0R8M0Z8NDB8NUJ8NUQpL2lnLG1hcDp7IiUzQSI6IjoiLCIlMkYiOiIvIiwiJTNGIjoiPyIsIiUyMyI6IiMiLCIlNUIiOiJbIiwiJTVEIjoiXSIsIiU0MCI6IkAiLCIlMjEiOiIhIiwiJTI0IjoiJCIsIiUyNiI6IiYiLCIlMjciOiInIiwiJTI4IjoiKCIsIiUyOSI6IikiLCIlMkEiOiIqIiwiJTJCIjoiKyIsIiUyQyI6IiwiLCIlM0IiOiI7IiwiJTNEIjoiPSJ9fX0sdXJucGF0aDp7ZW5jb2RlOntleHByZXNzaW9uOi8lKDIxfDI0fDI3fDI4fDI5fDJBfDJCfDJDfDNCfDNEfDQwKS9pZyxtYXA6eyIlMjEiOiIhIiwiJTI0IjoiJCIsIiUyNyI6IiciLCIlMjgiOiIoIiwiJTI5IjoiKSIsIiUyQSI6IioiLCIlMkIiOiIrIiwiJTJDIjoiLCIsIiUzQiI6IjsiLCIlM0QiOiI9IiwiJTQwIjoiQCJ9fSxkZWNvZGU6e2V4cHJlc3Npb246L1tcL1w/IzpdL2csbWFwOnsiLyI6IiUyRiIsIj8iOiIlM0YiLCIjIjoiJTIzIiwiOiI6IiUzQSJ9fX19LGkuZW5jb2RlUXVlcnk9ZnVuY3Rpb24oQSxTKXt2YXIgUD1pLmVuY29kZShBKyIiKTtyZXR1cm4gUz09PXZvaWQgMCYmKFM9aS5lc2NhcGVRdWVyeVNwYWNlKSxTP1AucmVwbGFjZSgvJTIwL2csIisiKTpQfSxpLmRlY29kZVF1ZXJ5PWZ1bmN0aW9uKEEsUyl7QSs9IiIsUz09PXZvaWQgMCYmKFM9aS5lc2NhcGVRdWVyeVNwYWNlKTt0cnl7cmV0dXJuIGkuZGVjb2RlKFM/QS5yZXBsYWNlKC9cKy9nLCIlMjAiKTpBKX1jYXRjaHtyZXR1cm4gQX19O3ZhciBPPXtlbmNvZGU6ImVuY29kZSIsZGVjb2RlOiJkZWNvZGUifSxFLHc9ZnVuY3Rpb24oQSxTKXtyZXR1cm4gZnVuY3Rpb24oUCl7dHJ5e3JldHVybiBpW1NdKFArIiIpLnJlcGxhY2UoaS5jaGFyYWN0ZXJzW0FdW1NdLmV4cHJlc3Npb24sZnVuY3Rpb24oRil7cmV0dXJuIGkuY2hhcmFjdGVyc1tBXVtTXS5tYXBbRl19KX1jYXRjaHtyZXR1cm4gUH19fTtmb3IoRSBpbiBPKWlbRSsiUGF0aFNlZ21lbnQiXT13KCJwYXRobmFtZSIsT1tFXSksaVtFKyJVcm5QYXRoU2VnbWVudCJdPXcoInVybnBhdGgiLE9bRV0pO3ZhciBDPWZ1bmN0aW9uKEEsUyxQKXtyZXR1cm4gZnVuY3Rpb24oRil7dmFyIGo7UD9qPWZ1bmN0aW9uKFgpe3JldHVybiBpW1NdKGlbUF0oWCkpfTpqPWlbU107Zm9yKHZhciBIPShGKyIiKS5zcGxpdChBKSxrPTAsSz1ILmxlbmd0aDtrPEs7aysrKUhba109aihIW2tdKTtyZXR1cm4gSC5qb2luKEEpfX07aS5kZWNvZGVQYXRoPUMoIi8iLCJkZWNvZGVQYXRoU2VnbWVudCIpLGkuZGVjb2RlVXJuUGF0aD1DKCI6IiwiZGVjb2RlVXJuUGF0aFNlZ21lbnQiKSxpLnJlY29kZVBhdGg9QygiLyIsImVuY29kZVBhdGhTZWdtZW50IiwiZGVjb2RlIiksaS5yZWNvZGVVcm5QYXRoPUMoIjoiLCJlbmNvZGVVcm5QYXRoU2VnbWVudCIsImRlY29kZSIpLGkuZW5jb2RlUmVzZXJ2ZWQ9dygicmVzZXJ2ZWQiLCJlbmNvZGUiKSxpLnBhcnNlPWZ1bmN0aW9uKEEsUyl7dmFyIFA7cmV0dXJuIFN8fChTPXtwcmV2ZW50SW52YWxpZEhvc3RuYW1lOmkucHJldmVudEludmFsaWRIb3N0bmFtZX0pLEE9QS5yZXBsYWNlKGkubGVhZGluZ193aGl0ZXNwYWNlX2V4cHJlc3Npb24sIiIpLEE9QS5yZXBsYWNlKGkuYXNjaWlfdGFiX3doaXRlc3BhY2UsIiIpLFA9QS5pbmRleE9mKCIjIiksUD4tMSYmKFMuZnJhZ21lbnQ9QS5zdWJzdHJpbmcoUCsxKXx8bnVsbCxBPUEuc3Vic3RyaW5nKDAsUCkpLFA9QS5pbmRleE9mKCI/IiksUD4tMSYmKFMucXVlcnk9QS5zdWJzdHJpbmcoUCsxKXx8bnVsbCxBPUEuc3Vic3RyaW5nKDAsUCkpLEE9QS5yZXBsYWNlKC9eKGh0dHBzP3xmdHB8d3NzPyk/OitbL1xcXSovaSwiJDE6Ly8iKSxBPUEucmVwbGFjZSgvXlsvXFxdezIsfS9pLCIvLyIpLEEuc3Vic3RyaW5nKDAsMik9PT0iLy8iPyhTLnByb3RvY29sPW51bGwsQT1BLnN1YnN0cmluZygyKSxBPWkucGFyc2VBdXRob3JpdHkoQSxTKSk6KFA9QS5pbmRleE9mKCI6IiksUD4tMSYmKFMucHJvdG9jb2w9QS5zdWJzdHJpbmcoMCxQKXx8bnVsbCxTLnByb3RvY29sJiYhUy5wcm90b2NvbC5tYXRjaChpLnByb3RvY29sX2V4cHJlc3Npb24pP1MucHJvdG9jb2w9dm9pZCAwOkEuc3Vic3RyaW5nKFArMSxQKzMpLnJlcGxhY2UoL1xcL2csIi8iKT09PSIvLyI/KEE9QS5zdWJzdHJpbmcoUCszKSxBPWkucGFyc2VBdXRob3JpdHkoQSxTKSk6KEE9QS5zdWJzdHJpbmcoUCsxKSxTLnVybj0hMCkpKSxTLnBhdGg9QSxTfSxpLnBhcnNlSG9zdD1mdW5jdGlvbihBLFMpe0F8fChBPSIiKSxBPUEucmVwbGFjZSgvXFwvZywiLyIpO3ZhciBQPUEuaW5kZXhPZigiLyIpLEYsajtpZihQPT09LTEmJihQPUEubGVuZ3RoKSxBLmNoYXJBdCgwKT09PSJbIilGPUEuaW5kZXhPZigiXSIpLFMuaG9zdG5hbWU9QS5zdWJzdHJpbmcoMSxGKXx8bnVsbCxTLnBvcnQ9QS5zdWJzdHJpbmcoRisyLFApfHxudWxsLFMucG9ydD09PSIvIiYmKFMucG9ydD1udWxsKTtlbHNle3ZhciBIPUEuaW5kZXhPZigiOiIpLGs9QS5pbmRleE9mKCIvIiksSz1BLmluZGV4T2YoIjoiLEgrMSk7SyE9PS0xJiYoaz09PS0xfHxLPGspPyhTLmhvc3RuYW1lPUEuc3Vic3RyaW5nKDAsUCl8fG51bGwsUy5wb3J0PW51bGwpOihqPUEuc3Vic3RyaW5nKDAsUCkuc3BsaXQoIjoiKSxTLmhvc3RuYW1lPWpbMF18fG51bGwsUy5wb3J0PWpbMV18fG51bGwpfXJldHVybiBTLmhvc3RuYW1lJiZBLnN1YnN0cmluZyhQKS5jaGFyQXQoMCkhPT0iLyImJihQKyssQT0iLyIrQSksUy5wcmV2ZW50SW52YWxpZEhvc3RuYW1lJiZpLmVuc3VyZVZhbGlkSG9zdG5hbWUoUy5ob3N0bmFtZSxTLnByb3RvY29sKSxTLnBvcnQmJmkuZW5zdXJlVmFsaWRQb3J0KFMucG9ydCksQS5zdWJzdHJpbmcoUCl8fCIvIn0saS5wYXJzZUF1dGhvcml0eT1mdW5jdGlvbihBLFMpe3JldHVybiBBPWkucGFyc2VVc2VyaW5mbyhBLFMpLGkucGFyc2VIb3N0KEEsUyl9LGkucGFyc2VVc2VyaW5mbz1mdW5jdGlvbihBLFMpe3ZhciBQPUEsRj1BLmluZGV4T2YoIlxcIik7RiE9PS0xJiYoQT1BLnJlcGxhY2UoL1xcL2csIi8iKSk7dmFyIGo9QS5pbmRleE9mKCIvIiksSD1BLmxhc3RJbmRleE9mKCJAIixqPi0xP2o6QS5sZW5ndGgtMSksaztyZXR1cm4gSD4tMSYmKGo9PT0tMXx8SDxqKT8oaz1BLnN1YnN0cmluZygwLEgpLnNwbGl0KCI6IiksUy51c2VybmFtZT1rWzBdP2kuZGVjb2RlKGtbMF0pOm51bGwsay5zaGlmdCgpLFMucGFzc3dvcmQ9a1swXT9pLmRlY29kZShrLmpvaW4oIjoiKSk6bnVsbCxBPVAuc3Vic3RyaW5nKEgrMSkpOihTLnVzZXJuYW1lPW51bGwsUy5wYXNzd29yZD1udWxsKSxBfSxpLnBhcnNlUXVlcnk9ZnVuY3Rpb24oQSxTKXtpZighQSlyZXR1cm57fTtpZihBPUEucmVwbGFjZSgvJisvZywiJiIpLnJlcGxhY2UoL15cPyomKnwmKyQvZywiIiksIUEpcmV0dXJue307Zm9yKHZhciBQPXt9LEY9QS5zcGxpdCgiJiIpLGo9Ri5sZW5ndGgsSCxrLEssWD0wO1g8ajtYKyspSD1GW1hdLnNwbGl0KCI9Iiksaz1pLmRlY29kZVF1ZXJ5KEguc2hpZnQoKSxTKSxLPUgubGVuZ3RoP2kuZGVjb2RlUXVlcnkoSC5qb2luKCI9IiksUyk6bnVsbCxrIT09Il9fcHJvdG9fXyImJih1LmNhbGwoUCxrKT8oKHR5cGVvZiBQW2tdPT0ic3RyaW5nInx8UFtrXT09PW51bGwpJiYoUFtrXT1bUFtrXV0pLFBba10ucHVzaChLKSk6UFtrXT1LKTtyZXR1cm4gUH0saS5idWlsZD1mdW5jdGlvbihBKXt2YXIgUz0iIixQPSExO3JldHVybiBBLnByb3RvY29sJiYoUys9QS5wcm90b2NvbCsiOiIpLCFBLnVybiYmKFN8fEEuaG9zdG5hbWUpJiYoUys9Ii8vIixQPSEwKSxTKz1pLmJ1aWxkQXV0aG9yaXR5KEEpfHwiIix0eXBlb2YgQS5wYXRoPT0ic3RyaW5nIiYmKEEucGF0aC5jaGFyQXQoMCkhPT0iLyImJlAmJihTKz0iLyIpLFMrPUEucGF0aCksdHlwZW9mIEEucXVlcnk9PSJzdHJpbmciJiZBLnF1ZXJ5JiYoUys9Ij8iK0EucXVlcnkpLHR5cGVvZiBBLmZyYWdtZW50PT0ic3RyaW5nIiYmQS5mcmFnbWVudCYmKFMrPSIjIitBLmZyYWdtZW50KSxTfSxpLmJ1aWxkSG9zdD1mdW5jdGlvbihBKXt2YXIgUz0iIjtpZihBLmhvc3RuYW1lKWkuaXA2X2V4cHJlc3Npb24udGVzdChBLmhvc3RuYW1lKT9TKz0iWyIrQS5ob3N0bmFtZSsiXSI6Uys9QS5ob3N0bmFtZTtlbHNlIHJldHVybiIiO3JldHVybiBBLnBvcnQmJihTKz0iOiIrQS5wb3J0KSxTfSxpLmJ1aWxkQXV0aG9yaXR5PWZ1bmN0aW9uKEEpe3JldHVybiBpLmJ1aWxkVXNlcmluZm8oQSkraS5idWlsZEhvc3QoQSl9LGkuYnVpbGRVc2VyaW5mbz1mdW5jdGlvbihBKXt2YXIgUz0iIjtyZXR1cm4gQS51c2VybmFtZSYmKFMrPWkuZW5jb2RlKEEudXNlcm5hbWUpKSxBLnBhc3N3b3JkJiYoUys9IjoiK2kuZW5jb2RlKEEucGFzc3dvcmQpKSxTJiYoUys9IkAiKSxTfSxpLmJ1aWxkUXVlcnk9ZnVuY3Rpb24oQSxTLFApe3ZhciBGPSIiLGosSCxrLEs7Zm9yKEggaW4gQSlpZihIIT09Il9fcHJvdG9fXyImJnUuY2FsbChBLEgpKWlmKHAoQVtIXSkpZm9yKGo9e30saz0wLEs9QVtIXS5sZW5ndGg7azxLO2srKylBW0hdW2tdIT09dm9pZCAwJiZqW0FbSF1ba10rIiJdPT09dm9pZCAwJiYoRis9IiYiK2kuYnVpbGRRdWVyeVBhcmFtZXRlcihILEFbSF1ba10sUCksUyE9PSEwJiYoaltBW0hdW2tdKyIiXT0hMCkpO2Vsc2UgQVtIXSE9PXZvaWQgMCYmKEYrPSImIitpLmJ1aWxkUXVlcnlQYXJhbWV0ZXIoSCxBW0hdLFApKTtyZXR1cm4gRi5zdWJzdHJpbmcoMSl9LGkuYnVpbGRRdWVyeVBhcmFtZXRlcj1mdW5jdGlvbihBLFMsUCl7cmV0dXJuIGkuZW5jb2RlUXVlcnkoQSxQKSsoUyE9PW51bGw/Ij0iK2kuZW5jb2RlUXVlcnkoUyxQKToiIil9LGkuYWRkUXVlcnk9ZnVuY3Rpb24oQSxTLFApe2lmKHR5cGVvZiBTPT0ib2JqZWN0Iilmb3IodmFyIEYgaW4gUyl1LmNhbGwoUyxGKSYmaS5hZGRRdWVyeShBLEYsU1tGXSk7ZWxzZSBpZih0eXBlb2YgUz09InN0cmluZyIpe2lmKEFbU109PT12b2lkIDApe0FbU109UDtyZXR1cm59ZWxzZSB0eXBlb2YgQVtTXT09InN0cmluZyImJihBW1NdPVtBW1NdXSk7cChQKXx8KFA9W1BdKSxBW1NdPShBW1NdfHxbXSkuY29uY2F0KFApfWVsc2UgdGhyb3cgbmV3IFR5cGVFcnJvcigiVVJJLmFkZFF1ZXJ5KCkgYWNjZXB0cyBhbiBvYmplY3QsIHN0cmluZyBhcyB0aGUgbmFtZSBwYXJhbWV0ZXIiKX0saS5zZXRRdWVyeT1mdW5jdGlvbihBLFMsUCl7aWYodHlwZW9mIFM9PSJvYmplY3QiKWZvcih2YXIgRiBpbiBTKXUuY2FsbChTLEYpJiZpLnNldFF1ZXJ5KEEsRixTW0ZdKTtlbHNlIGlmKHR5cGVvZiBTPT0ic3RyaW5nIilBW1NdPVA9PT12b2lkIDA/bnVsbDpQO2Vsc2UgdGhyb3cgbmV3IFR5cGVFcnJvcigiVVJJLnNldFF1ZXJ5KCkgYWNjZXB0cyBhbiBvYmplY3QsIHN0cmluZyBhcyB0aGUgbmFtZSBwYXJhbWV0ZXIiKX0saS5yZW1vdmVRdWVyeT1mdW5jdGlvbihBLFMsUCl7dmFyIEYsaixIO2lmKHAoUykpZm9yKEY9MCxqPVMubGVuZ3RoO0Y8ajtGKyspQVtTW0ZdXT12b2lkIDA7ZWxzZSBpZihsKFMpPT09IlJlZ0V4cCIpZm9yKEggaW4gQSlTLnRlc3QoSCkmJihBW0hdPXZvaWQgMCk7ZWxzZSBpZih0eXBlb2YgUz09Im9iamVjdCIpZm9yKEggaW4gUyl1LmNhbGwoUyxIKSYmaS5yZW1vdmVRdWVyeShBLEgsU1tIXSk7ZWxzZSBpZih0eXBlb2YgUz09InN0cmluZyIpUCE9PXZvaWQgMD9sKFApPT09IlJlZ0V4cCI/IXAoQVtTXSkmJlAudGVzdChBW1NdKT9BW1NdPXZvaWQgMDpBW1NdPWQoQVtTXSxQKTpBW1NdPT09U3RyaW5nKFApJiYoIXAoUCl8fFAubGVuZ3RoPT09MSk/QVtTXT12b2lkIDA6cChBW1NdKSYmKEFbU109ZChBW1NdLFApKTpBW1NdPXZvaWQgMDtlbHNlIHRocm93IG5ldyBUeXBlRXJyb3IoIlVSSS5yZW1vdmVRdWVyeSgpIGFjY2VwdHMgYW4gb2JqZWN0LCBzdHJpbmcsIFJlZ0V4cCBhcyB0aGUgZmlyc3QgcGFyYW1ldGVyIil9LGkuaGFzUXVlcnk9ZnVuY3Rpb24oQSxTLFAsRil7c3dpdGNoKGwoUykpe2Nhc2UiU3RyaW5nIjpicmVhaztjYXNlIlJlZ0V4cCI6Zm9yKHZhciBqIGluIEEpaWYodS5jYWxsKEEsaikmJlMudGVzdChqKSYmKFA9PT12b2lkIDB8fGkuaGFzUXVlcnkoQSxqLFApKSlyZXR1cm4hMDtyZXR1cm4hMTtjYXNlIk9iamVjdCI6Zm9yKHZhciBIIGluIFMpaWYodS5jYWxsKFMsSCkmJiFpLmhhc1F1ZXJ5KEEsSCxTW0hdKSlyZXR1cm4hMTtyZXR1cm4hMDtkZWZhdWx0OnRocm93IG5ldyBUeXBlRXJyb3IoIlVSSS5oYXNRdWVyeSgpIGFjY2VwdHMgYSBzdHJpbmcsIHJlZ3VsYXIgZXhwcmVzc2lvbiBvciBvYmplY3QgYXMgdGhlIG5hbWUgcGFyYW1ldGVyIil9c3dpdGNoKGwoUCkpe2Nhc2UiVW5kZWZpbmVkIjpyZXR1cm4gUyBpbiBBO2Nhc2UiQm9vbGVhbiI6dmFyIGs9ISEocChBW1NdKT9BW1NdLmxlbmd0aDpBW1NdKTtyZXR1cm4gUD09PWs7Y2FzZSJGdW5jdGlvbiI6cmV0dXJuISFQKEFbU10sUyxBKTtjYXNlIkFycmF5IjppZighcChBW1NdKSlyZXR1cm4hMTt2YXIgSz1GP206XztyZXR1cm4gSyhBW1NdLFApO2Nhc2UiUmVnRXhwIjpyZXR1cm4gcChBW1NdKT9GP20oQVtTXSxQKTohMTohIShBW1NdJiZBW1NdLm1hdGNoKFApKTtjYXNlIk51bWJlciI6UD1TdHJpbmcoUCk7Y2FzZSJTdHJpbmciOnJldHVybiBwKEFbU10pP0Y/bShBW1NdLFApOiExOkFbU109PT1QO2RlZmF1bHQ6dGhyb3cgbmV3IFR5cGVFcnJvcigiVVJJLmhhc1F1ZXJ5KCkgYWNjZXB0cyB1bmRlZmluZWQsIGJvb2xlYW4sIHN0cmluZywgbnVtYmVyLCBSZWdFeHAsIEZ1bmN0aW9uIGFzIHRoZSB2YWx1ZSBwYXJhbWV0ZXIiKX19LGkuam9pblBhdGhzPWZ1bmN0aW9uKCl7Zm9yKHZhciBBPVtdLFM9W10sUD0wLEY9MDtGPGFyZ3VtZW50cy5sZW5ndGg7RisrKXt2YXIgaj1uZXcgaShhcmd1bWVudHNbRl0pO0EucHVzaChqKTtmb3IodmFyIEg9ai5zZWdtZW50KCksaz0wO2s8SC5sZW5ndGg7aysrKXR5cGVvZiBIW2tdPT0ic3RyaW5nIiYmUy5wdXNoKEhba10pLEhba10mJlArK31pZighUy5sZW5ndGh8fCFQKXJldHVybiBuZXcgaSgiIik7dmFyIEs9bmV3IGkoIiIpLnNlZ21lbnQoUyk7cmV0dXJuKEFbMF0ucGF0aCgpPT09IiJ8fEFbMF0ucGF0aCgpLnNsaWNlKDAsMSk9PT0iLyIpJiZLLnBhdGgoIi8iK0sucGF0aCgpKSxLLm5vcm1hbGl6ZSgpfSxpLmNvbW1vblBhdGg9ZnVuY3Rpb24oQSxTKXt2YXIgUD1NYXRoLm1pbihBLmxlbmd0aCxTLmxlbmd0aCksRjtmb3IoRj0wO0Y8UDtGKyspaWYoQS5jaGFyQXQoRikhPT1TLmNoYXJBdChGKSl7Ri0tO2JyZWFrfXJldHVybiBGPDE/QS5jaGFyQXQoMCk9PT1TLmNoYXJBdCgwKSYmQS5jaGFyQXQoMCk9PT0iLyI/Ii8iOiIiOigoQS5jaGFyQXQoRikhPT0iLyJ8fFMuY2hhckF0KEYpIT09Ii8iKSYmKEY9QS5zdWJzdHJpbmcoMCxGKS5sYXN0SW5kZXhPZigiLyIpKSxBLnN1YnN0cmluZygwLEYrMSkpfSxpLndpdGhpblN0cmluZz1mdW5jdGlvbihBLFMsUCl7UHx8KFA9e30pO3ZhciBGPVAuc3RhcnR8fGkuZmluZFVyaS5zdGFydCxqPVAuZW5kfHxpLmZpbmRVcmkuZW5kLEg9UC50cmltfHxpLmZpbmRVcmkudHJpbSxrPVAucGFyZW5zfHxpLmZpbmRVcmkucGFyZW5zLEs9L1thLXowLTktXT1bIiddPyQvaTtmb3IoRi5sYXN0SW5kZXg9MDs7KXt2YXIgWD1GLmV4ZWMoQSk7aWYoIVgpYnJlYWs7dmFyIFI9WC5pbmRleDtpZihQLmlnbm9yZUh0bWwpe3ZhciBvdD1BLnNsaWNlKE1hdGgubWF4KFItMywwKSxSKTtpZihvdCYmSy50ZXN0KG90KSljb250aW51ZX1mb3IodmFyIGF0PVIrQS5zbGljZShSKS5zZWFyY2goaikscHQ9QS5zbGljZShSLGF0KSx5dD0tMTs7KXt2YXIgcnQ9ay5leGVjKHB0KTtpZighcnQpYnJlYWs7dmFyIFB0PXJ0LmluZGV4K3J0WzBdLmxlbmd0aDt5dD1NYXRoLm1heCh5dCxQdCl9aWYoeXQ+LTE/cHQ9cHQuc2xpY2UoMCx5dCkrcHQuc2xpY2UoeXQpLnJlcGxhY2UoSCwiIik6cHQ9cHQucmVwbGFjZShILCIiKSwhKHB0Lmxlbmd0aDw9WFswXS5sZW5ndGgpJiYhKFAuaWdub3JlJiZQLmlnbm9yZS50ZXN0KHB0KSkpe2F0PVIrcHQubGVuZ3RoO3ZhciBndD1TKHB0LFIsYXQsQSk7aWYoZ3Q9PT12b2lkIDApe0YubGFzdEluZGV4PWF0O2NvbnRpbnVlfWd0PVN0cmluZyhndCksQT1BLnNsaWNlKDAsUikrZ3QrQS5zbGljZShhdCksRi5sYXN0SW5kZXg9UitndC5sZW5ndGh9fXJldHVybiBGLmxhc3RJbmRleD0wLEF9LGkuZW5zdXJlVmFsaWRIb3N0bmFtZT1mdW5jdGlvbihBLFMpe3ZhciBQPSEhQSxGPSEhUyxqPSExO2lmKEYmJihqPW0oaS5ob3N0UHJvdG9jb2xzLFMpKSxqJiYhUCl0aHJvdyBuZXcgVHlwZUVycm9yKCJIb3N0bmFtZSBjYW5ub3QgYmUgZW1wdHksIGlmIHByb3RvY29sIGlzICIrUyk7aWYoQSYmQS5tYXRjaChpLmludmFsaWRfaG9zdG5hbWVfY2hhcmFjdGVycykpe2lmKCF0KXRocm93IG5ldyBUeXBlRXJyb3IoJ0hvc3RuYW1lICInK0ErJyIgY29udGFpbnMgY2hhcmFjdGVycyBvdGhlciB0aGFuIFtBLVowLTkuLTpfXSBhbmQgUHVueWNvZGUuanMgaXMgbm90IGF2YWlsYWJsZScpO2lmKHQudG9BU0NJSShBKS5tYXRjaChpLmludmFsaWRfaG9zdG5hbWVfY2hhcmFjdGVycykpdGhyb3cgbmV3IFR5cGVFcnJvcignSG9zdG5hbWUgIicrQSsnIiBjb250YWlucyBjaGFyYWN0ZXJzIG90aGVyIHRoYW4gW0EtWjAtOS4tOl9dJyl9fSxpLmVuc3VyZVZhbGlkUG9ydD1mdW5jdGlvbihBKXtpZihBKXt2YXIgUz1OdW1iZXIoQSk7aWYoIShzKFMpJiZTPjAmJlM8NjU1MzYpKXRocm93IG5ldyBUeXBlRXJyb3IoJ1BvcnQgIicrQSsnIiBpcyBub3QgYSB2YWxpZCBwb3J0Jyl9fSxpLm5vQ29uZmxpY3Q9ZnVuY3Rpb24oQSl7aWYoQSl7dmFyIFM9e1VSSTp0aGlzLm5vQ29uZmxpY3QoKX07cmV0dXJuIG8uVVJJVGVtcGxhdGUmJnR5cGVvZiBvLlVSSVRlbXBsYXRlLm5vQ29uZmxpY3Q9PSJmdW5jdGlvbiImJihTLlVSSVRlbXBsYXRlPW8uVVJJVGVtcGxhdGUubm9Db25mbGljdCgpKSxvLklQdjYmJnR5cGVvZiBvLklQdjYubm9Db25mbGljdD09ImZ1bmN0aW9uIiYmKFMuSVB2Nj1vLklQdjYubm9Db25mbGljdCgpKSxvLlNlY29uZExldmVsRG9tYWlucyYmdHlwZW9mIG8uU2Vjb25kTGV2ZWxEb21haW5zLm5vQ29uZmxpY3Q9PSJmdW5jdGlvbiImJihTLlNlY29uZExldmVsRG9tYWlucz1vLlNlY29uZExldmVsRG9tYWlucy5ub0NvbmZsaWN0KCkpLFN9ZWxzZSBvLlVSST09PXRoaXMmJihvLlVSST1yKTtyZXR1cm4gdGhpc30sZi5idWlsZD1mdW5jdGlvbihBKXtyZXR1cm4gQT09PSEwP3RoaXMuX2RlZmVycmVkX2J1aWxkPSEwOihBPT09dm9pZCAwfHx0aGlzLl9kZWZlcnJlZF9idWlsZCkmJih0aGlzLl9zdHJpbmc9aS5idWlsZCh0aGlzLl9wYXJ0cyksdGhpcy5fZGVmZXJyZWRfYnVpbGQ9ITEpLHRoaXN9LGYuY2xvbmU9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IGkodGhpcyl9LGYudmFsdWVPZj1mLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYnVpbGQoITEpLl9zdHJpbmd9O2Z1bmN0aW9uIE4oQSl7cmV0dXJuIGZ1bmN0aW9uKFMsUCl7cmV0dXJuIFM9PT12b2lkIDA/dGhpcy5fcGFydHNbQV18fCIiOih0aGlzLl9wYXJ0c1tBXT1TfHxudWxsLHRoaXMuYnVpbGQoIVApLHRoaXMpfX1mdW5jdGlvbiBJKEEsUyl7cmV0dXJuIGZ1bmN0aW9uKFAsRil7cmV0dXJuIFA9PT12b2lkIDA/dGhpcy5fcGFydHNbQV18fCIiOihQIT09bnVsbCYmKFA9UCsiIixQLmNoYXJBdCgwKT09PVMmJihQPVAuc3Vic3RyaW5nKDEpKSksdGhpcy5fcGFydHNbQV09UCx0aGlzLmJ1aWxkKCFGKSx0aGlzKX19Zi5wcm90b2NvbD1OKCJwcm90b2NvbCIpLGYudXNlcm5hbWU9TigidXNlcm5hbWUiKSxmLnBhc3N3b3JkPU4oInBhc3N3b3JkIiksZi5ob3N0bmFtZT1OKCJob3N0bmFtZSIpLGYucG9ydD1OKCJwb3J0IiksZi5xdWVyeT1JKCJxdWVyeSIsIj8iKSxmLmZyYWdtZW50PUkoImZyYWdtZW50IiwiIyIpLGYuc2VhcmNoPWZ1bmN0aW9uKEEsUyl7dmFyIFA9dGhpcy5xdWVyeShBLFMpO3JldHVybiB0eXBlb2YgUD09InN0cmluZyImJlAubGVuZ3RoPyI/IitQOlB9LGYuaGFzaD1mdW5jdGlvbihBLFMpe3ZhciBQPXRoaXMuZnJhZ21lbnQoQSxTKTtyZXR1cm4gdHlwZW9mIFA9PSJzdHJpbmciJiZQLmxlbmd0aD8iIyIrUDpQfSxmLnBhdGhuYW1lPWZ1bmN0aW9uKEEsUyl7aWYoQT09PXZvaWQgMHx8QT09PSEwKXt2YXIgUD10aGlzLl9wYXJ0cy5wYXRofHwodGhpcy5fcGFydHMuaG9zdG5hbWU/Ii8iOiIiKTtyZXR1cm4gQT8odGhpcy5fcGFydHMudXJuP2kuZGVjb2RlVXJuUGF0aDppLmRlY29kZVBhdGgpKFApOlB9ZWxzZSByZXR1cm4gdGhpcy5fcGFydHMudXJuP3RoaXMuX3BhcnRzLnBhdGg9QT9pLnJlY29kZVVyblBhdGgoQSk6IiI6dGhpcy5fcGFydHMucGF0aD1BP2kucmVjb2RlUGF0aChBKToiLyIsdGhpcy5idWlsZCghUyksdGhpc30sZi5wYXRoPWYucGF0aG5hbWUsZi5ocmVmPWZ1bmN0aW9uKEEsUyl7dmFyIFA7aWYoQT09PXZvaWQgMClyZXR1cm4gdGhpcy50b1N0cmluZygpO3RoaXMuX3N0cmluZz0iIix0aGlzLl9wYXJ0cz1pLl9wYXJ0cygpO3ZhciBGPUEgaW5zdGFuY2VvZiBpLGo9dHlwZW9mIEE9PSJvYmplY3QiJiYoQS5ob3N0bmFtZXx8QS5wYXRofHxBLnBhdGhuYW1lKTtpZihBLm5vZGVOYW1lKXt2YXIgSD1pLmdldERvbUF0dHJpYnV0ZShBKTtBPUFbSF18fCIiLGo9ITF9aWYoIUYmJmomJkEucGF0aG5hbWUhPT12b2lkIDAmJihBPUEudG9TdHJpbmcoKSksdHlwZW9mIEE9PSJzdHJpbmcifHxBIGluc3RhbmNlb2YgU3RyaW5nKXRoaXMuX3BhcnRzPWkucGFyc2UoU3RyaW5nKEEpLHRoaXMuX3BhcnRzKTtlbHNlIGlmKEZ8fGope3ZhciBrPUY/QS5fcGFydHM6QTtmb3IoUCBpbiBrKVAhPT0icXVlcnkiJiZ1LmNhbGwodGhpcy5fcGFydHMsUCkmJih0aGlzLl9wYXJ0c1tQXT1rW1BdKTtrLnF1ZXJ5JiZ0aGlzLnF1ZXJ5KGsucXVlcnksITEpfWVsc2UgdGhyb3cgbmV3IFR5cGVFcnJvcigiaW52YWxpZCBpbnB1dCIpO3JldHVybiB0aGlzLmJ1aWxkKCFTKSx0aGlzfSxmLmlzPWZ1bmN0aW9uKEEpe3ZhciBTPSExLFA9ITEsRj0hMSxqPSExLEg9ITEsaz0hMSxLPSExLFg9IXRoaXMuX3BhcnRzLnVybjtzd2l0Y2godGhpcy5fcGFydHMuaG9zdG5hbWUmJihYPSExLFA9aS5pcDRfZXhwcmVzc2lvbi50ZXN0KHRoaXMuX3BhcnRzLmhvc3RuYW1lKSxGPWkuaXA2X2V4cHJlc3Npb24udGVzdCh0aGlzLl9wYXJ0cy5ob3N0bmFtZSksUz1QfHxGLGo9IVMsSD1qJiZuJiZuLmhhcyh0aGlzLl9wYXJ0cy5ob3N0bmFtZSksaz1qJiZpLmlkbl9leHByZXNzaW9uLnRlc3QodGhpcy5fcGFydHMuaG9zdG5hbWUpLEs9aiYmaS5wdW55Y29kZV9leHByZXNzaW9uLnRlc3QodGhpcy5fcGFydHMuaG9zdG5hbWUpKSxBLnRvTG93ZXJDYXNlKCkpe2Nhc2UicmVsYXRpdmUiOnJldHVybiBYO2Nhc2UiYWJzb2x1dGUiOnJldHVybiFYO2Nhc2UiZG9tYWluIjpjYXNlIm5hbWUiOnJldHVybiBqO2Nhc2Uic2xkIjpyZXR1cm4gSDtjYXNlImlwIjpyZXR1cm4gUztjYXNlImlwNCI6Y2FzZSJpcHY0IjpjYXNlImluZXQ0IjpyZXR1cm4gUDtjYXNlImlwNiI6Y2FzZSJpcHY2IjpjYXNlImluZXQ2IjpyZXR1cm4gRjtjYXNlImlkbiI6cmV0dXJuIGs7Y2FzZSJ1cmwiOnJldHVybiF0aGlzLl9wYXJ0cy51cm47Y2FzZSJ1cm4iOnJldHVybiEhdGhpcy5fcGFydHMudXJuO2Nhc2UicHVueWNvZGUiOnJldHVybiBLfXJldHVybiBudWxsfTt2YXIgRD1mLnByb3RvY29sLHY9Zi5wb3J0LEw9Zi5ob3N0bmFtZTtmLnByb3RvY29sPWZ1bmN0aW9uKEEsUyl7aWYoQSYmKEE9QS5yZXBsYWNlKC86KFwvXC8pPyQvLCIiKSwhQS5tYXRjaChpLnByb3RvY29sX2V4cHJlc3Npb24pKSl0aHJvdyBuZXcgVHlwZUVycm9yKCdQcm90b2NvbCAiJytBK2AiIGNvbnRhaW5zIGNoYXJhY3RlcnMgb3RoZXIgdGhhbiBbQS1aMC05ListXSBvciBkb2Vzbid0IHN0YXJ0IHdpdGggW0EtWl1gKTtyZXR1cm4gRC5jYWxsKHRoaXMsQSxTKX0sZi5zY2hlbWU9Zi5wcm90b2NvbCxmLnBvcnQ9ZnVuY3Rpb24oQSxTKXtyZXR1cm4gdGhpcy5fcGFydHMudXJuP0E9PT12b2lkIDA/IiI6dGhpczooQSE9PXZvaWQgMCYmKEE9PT0wJiYoQT1udWxsKSxBJiYoQSs9IiIsQS5jaGFyQXQoMCk9PT0iOiImJihBPUEuc3Vic3RyaW5nKDEpKSxpLmVuc3VyZVZhbGlkUG9ydChBKSkpLHYuY2FsbCh0aGlzLEEsUykpfSxmLmhvc3RuYW1lPWZ1bmN0aW9uKEEsUyl7aWYodGhpcy5fcGFydHMudXJuKXJldHVybiBBPT09dm9pZCAwPyIiOnRoaXM7aWYoQSE9PXZvaWQgMCl7dmFyIFA9e3ByZXZlbnRJbnZhbGlkSG9zdG5hbWU6dGhpcy5fcGFydHMucHJldmVudEludmFsaWRIb3N0bmFtZX0sRj1pLnBhcnNlSG9zdChBLFApO2lmKEYhPT0iLyIpdGhyb3cgbmV3IFR5cGVFcnJvcignSG9zdG5hbWUgIicrQSsnIiBjb250YWlucyBjaGFyYWN0ZXJzIG90aGVyIHRoYW4gW0EtWjAtOS4tXScpO0E9UC5ob3N0bmFtZSx0aGlzLl9wYXJ0cy5wcmV2ZW50SW52YWxpZEhvc3RuYW1lJiZpLmVuc3VyZVZhbGlkSG9zdG5hbWUoQSx0aGlzLl9wYXJ0cy5wcm90b2NvbCl9cmV0dXJuIEwuY2FsbCh0aGlzLEEsUyl9LGYub3JpZ2luPWZ1bmN0aW9uKEEsUyl7aWYodGhpcy5fcGFydHMudXJuKXJldHVybiBBPT09dm9pZCAwPyIiOnRoaXM7aWYoQT09PXZvaWQgMCl7dmFyIFA9dGhpcy5wcm90b2NvbCgpLEY9dGhpcy5hdXRob3JpdHkoKTtyZXR1cm4gRj8oUD9QKyI6Ly8iOiIiKSt0aGlzLmF1dGhvcml0eSgpOiIifWVsc2V7dmFyIGo9aShBKTtyZXR1cm4gdGhpcy5wcm90b2NvbChqLnByb3RvY29sKCkpLmF1dGhvcml0eShqLmF1dGhvcml0eSgpKS5idWlsZCghUyksdGhpc319LGYuaG9zdD1mdW5jdGlvbihBLFMpe2lmKHRoaXMuX3BhcnRzLnVybilyZXR1cm4gQT09PXZvaWQgMD8iIjp0aGlzO2lmKEE9PT12b2lkIDApcmV0dXJuIHRoaXMuX3BhcnRzLmhvc3RuYW1lP2kuYnVpbGRIb3N0KHRoaXMuX3BhcnRzKToiIjt2YXIgUD1pLnBhcnNlSG9zdChBLHRoaXMuX3BhcnRzKTtpZihQIT09Ii8iKXRocm93IG5ldyBUeXBlRXJyb3IoJ0hvc3RuYW1lICInK0ErJyIgY29udGFpbnMgY2hhcmFjdGVycyBvdGhlciB0aGFuIFtBLVowLTkuLV0nKTtyZXR1cm4gdGhpcy5idWlsZCghUyksdGhpc30sZi5hdXRob3JpdHk9ZnVuY3Rpb24oQSxTKXtpZih0aGlzLl9wYXJ0cy51cm4pcmV0dXJuIEE9PT12b2lkIDA/IiI6dGhpcztpZihBPT09dm9pZCAwKXJldHVybiB0aGlzLl9wYXJ0cy5ob3N0bmFtZT9pLmJ1aWxkQXV0aG9yaXR5KHRoaXMuX3BhcnRzKToiIjt2YXIgUD1pLnBhcnNlQXV0aG9yaXR5KEEsdGhpcy5fcGFydHMpO2lmKFAhPT0iLyIpdGhyb3cgbmV3IFR5cGVFcnJvcignSG9zdG5hbWUgIicrQSsnIiBjb250YWlucyBjaGFyYWN0ZXJzIG90aGVyIHRoYW4gW0EtWjAtOS4tXScpO3JldHVybiB0aGlzLmJ1aWxkKCFTKSx0aGlzfSxmLnVzZXJpbmZvPWZ1bmN0aW9uKEEsUyl7aWYodGhpcy5fcGFydHMudXJuKXJldHVybiBBPT09dm9pZCAwPyIiOnRoaXM7aWYoQT09PXZvaWQgMCl7dmFyIFA9aS5idWlsZFVzZXJpbmZvKHRoaXMuX3BhcnRzKTtyZXR1cm4gUCYmUC5zdWJzdHJpbmcoMCxQLmxlbmd0aC0xKX1lbHNlIHJldHVybiBBW0EubGVuZ3RoLTFdIT09IkAiJiYoQSs9IkAiKSxpLnBhcnNlVXNlcmluZm8oQSx0aGlzLl9wYXJ0cyksdGhpcy5idWlsZCghUyksdGhpc30sZi5yZXNvdXJjZT1mdW5jdGlvbihBLFMpe3ZhciBQO3JldHVybiBBPT09dm9pZCAwP3RoaXMucGF0aCgpK3RoaXMuc2VhcmNoKCkrdGhpcy5oYXNoKCk6KFA9aS5wYXJzZShBKSx0aGlzLl9wYXJ0cy5wYXRoPVAucGF0aCx0aGlzLl9wYXJ0cy5xdWVyeT1QLnF1ZXJ5LHRoaXMuX3BhcnRzLmZyYWdtZW50PVAuZnJhZ21lbnQsdGhpcy5idWlsZCghUyksdGhpcyl9LGYuc3ViZG9tYWluPWZ1bmN0aW9uKEEsUyl7aWYodGhpcy5fcGFydHMudXJuKXJldHVybiBBPT09dm9pZCAwPyIiOnRoaXM7aWYoQT09PXZvaWQgMCl7aWYoIXRoaXMuX3BhcnRzLmhvc3RuYW1lfHx0aGlzLmlzKCJJUCIpKXJldHVybiIiO3ZhciBQPXRoaXMuX3BhcnRzLmhvc3RuYW1lLmxlbmd0aC10aGlzLmRvbWFpbigpLmxlbmd0aC0xO3JldHVybiB0aGlzLl9wYXJ0cy5ob3N0bmFtZS5zdWJzdHJpbmcoMCxQKXx8IiJ9ZWxzZXt2YXIgRj10aGlzLl9wYXJ0cy5ob3N0bmFtZS5sZW5ndGgtdGhpcy5kb21haW4oKS5sZW5ndGgsaj10aGlzLl9wYXJ0cy5ob3N0bmFtZS5zdWJzdHJpbmcoMCxGKSxIPW5ldyBSZWdFeHAoIl4iK2MoaikpO2lmKEEmJkEuY2hhckF0KEEubGVuZ3RoLTEpIT09Ii4iJiYoQSs9Ii4iKSxBLmluZGV4T2YoIjoiKSE9PS0xKXRocm93IG5ldyBUeXBlRXJyb3IoIkRvbWFpbnMgY2Fubm90IGNvbnRhaW4gY29sb25zIik7cmV0dXJuIEEmJmkuZW5zdXJlVmFsaWRIb3N0bmFtZShBLHRoaXMuX3BhcnRzLnByb3RvY29sKSx0aGlzLl9wYXJ0cy5ob3N0bmFtZT10aGlzLl9wYXJ0cy5ob3N0bmFtZS5yZXBsYWNlKEgsQSksdGhpcy5idWlsZCghUyksdGhpc319LGYuZG9tYWluPWZ1bmN0aW9uKEEsUyl7aWYodGhpcy5fcGFydHMudXJuKXJldHVybiBBPT09dm9pZCAwPyIiOnRoaXM7aWYodHlwZW9mIEE9PSJib29sZWFuIiYmKFM9QSxBPXZvaWQgMCksQT09PXZvaWQgMCl7aWYoIXRoaXMuX3BhcnRzLmhvc3RuYW1lfHx0aGlzLmlzKCJJUCIpKXJldHVybiIiO3ZhciBQPXRoaXMuX3BhcnRzLmhvc3RuYW1lLm1hdGNoKC9cLi9nKTtpZihQJiZQLmxlbmd0aDwyKXJldHVybiB0aGlzLl9wYXJ0cy5ob3N0bmFtZTt2YXIgRj10aGlzLl9wYXJ0cy5ob3N0bmFtZS5sZW5ndGgtdGhpcy50bGQoUykubGVuZ3RoLTE7cmV0dXJuIEY9dGhpcy5fcGFydHMuaG9zdG5hbWUubGFzdEluZGV4T2YoIi4iLEYtMSkrMSx0aGlzLl9wYXJ0cy5ob3N0bmFtZS5zdWJzdHJpbmcoRil8fCIifWVsc2V7aWYoIUEpdGhyb3cgbmV3IFR5cGVFcnJvcigiY2Fubm90IHNldCBkb21haW4gZW1wdHkiKTtpZihBLmluZGV4T2YoIjoiKSE9PS0xKXRocm93IG5ldyBUeXBlRXJyb3IoIkRvbWFpbnMgY2Fubm90IGNvbnRhaW4gY29sb25zIik7aWYoaS5lbnN1cmVWYWxpZEhvc3RuYW1lKEEsdGhpcy5fcGFydHMucHJvdG9jb2wpLCF0aGlzLl9wYXJ0cy5ob3N0bmFtZXx8dGhpcy5pcygiSVAiKSl0aGlzLl9wYXJ0cy5ob3N0bmFtZT1BO2Vsc2V7dmFyIGo9bmV3IFJlZ0V4cChjKHRoaXMuZG9tYWluKCkpKyIkIik7dGhpcy5fcGFydHMuaG9zdG5hbWU9dGhpcy5fcGFydHMuaG9zdG5hbWUucmVwbGFjZShqLEEpfXJldHVybiB0aGlzLmJ1aWxkKCFTKSx0aGlzfX0sZi50bGQ9ZnVuY3Rpb24oQSxTKXtpZih0aGlzLl9wYXJ0cy51cm4pcmV0dXJuIEE9PT12b2lkIDA/IiI6dGhpcztpZih0eXBlb2YgQT09ImJvb2xlYW4iJiYoUz1BLEE9dm9pZCAwKSxBPT09dm9pZCAwKXtpZighdGhpcy5fcGFydHMuaG9zdG5hbWV8fHRoaXMuaXMoIklQIikpcmV0dXJuIiI7dmFyIFA9dGhpcy5fcGFydHMuaG9zdG5hbWUubGFzdEluZGV4T2YoIi4iKSxGPXRoaXMuX3BhcnRzLmhvc3RuYW1lLnN1YnN0cmluZyhQKzEpO3JldHVybiBTIT09ITAmJm4mJm4ubGlzdFtGLnRvTG93ZXJDYXNlKCldJiZuLmdldCh0aGlzLl9wYXJ0cy5ob3N0bmFtZSl8fEZ9ZWxzZXt2YXIgajtpZihBKWlmKEEubWF0Y2goL1teYS16QS1aMC05LV0vKSlpZihuJiZuLmlzKEEpKWo9bmV3IFJlZ0V4cChjKHRoaXMudGxkKCkpKyIkIiksdGhpcy5fcGFydHMuaG9zdG5hbWU9dGhpcy5fcGFydHMuaG9zdG5hbWUucmVwbGFjZShqLEEpO2Vsc2UgdGhyb3cgbmV3IFR5cGVFcnJvcignVExEICInK0ErJyIgY29udGFpbnMgY2hhcmFjdGVycyBvdGhlciB0aGFuIFtBLVowLTldJyk7ZWxzZXtpZighdGhpcy5fcGFydHMuaG9zdG5hbWV8fHRoaXMuaXMoIklQIikpdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKCJjYW5ub3Qgc2V0IFRMRCBvbiBub24tZG9tYWluIGhvc3QiKTtqPW5ldyBSZWdFeHAoYyh0aGlzLnRsZCgpKSsiJCIpLHRoaXMuX3BhcnRzLmhvc3RuYW1lPXRoaXMuX3BhcnRzLmhvc3RuYW1lLnJlcGxhY2UoaixBKX1lbHNlIHRocm93IG5ldyBUeXBlRXJyb3IoImNhbm5vdCBzZXQgVExEIGVtcHR5Iik7cmV0dXJuIHRoaXMuYnVpbGQoIVMpLHRoaXN9fSxmLmRpcmVjdG9yeT1mdW5jdGlvbihBLFMpe2lmKHRoaXMuX3BhcnRzLnVybilyZXR1cm4gQT09PXZvaWQgMD8iIjp0aGlzO2lmKEE9PT12b2lkIDB8fEE9PT0hMCl7aWYoIXRoaXMuX3BhcnRzLnBhdGgmJiF0aGlzLl9wYXJ0cy5ob3N0bmFtZSlyZXR1cm4iIjtpZih0aGlzLl9wYXJ0cy5wYXRoPT09Ii8iKXJldHVybiIvIjt2YXIgUD10aGlzLl9wYXJ0cy5wYXRoLmxlbmd0aC10aGlzLmZpbGVuYW1lKCkubGVuZ3RoLTEsRj10aGlzLl9wYXJ0cy5wYXRoLnN1YnN0cmluZygwLFApfHwodGhpcy5fcGFydHMuaG9zdG5hbWU/Ii8iOiIiKTtyZXR1cm4gQT9pLmRlY29kZVBhdGgoRik6Rn1lbHNle3ZhciBqPXRoaXMuX3BhcnRzLnBhdGgubGVuZ3RoLXRoaXMuZmlsZW5hbWUoKS5sZW5ndGgsSD10aGlzLl9wYXJ0cy5wYXRoLnN1YnN0cmluZygwLGopLGs9bmV3IFJlZ0V4cCgiXiIrYyhIKSk7cmV0dXJuIHRoaXMuaXMoInJlbGF0aXZlIil8fChBfHwoQT0iLyIpLEEuY2hhckF0KDApIT09Ii8iJiYoQT0iLyIrQSkpLEEmJkEuY2hhckF0KEEubGVuZ3RoLTEpIT09Ii8iJiYoQSs9Ii8iKSxBPWkucmVjb2RlUGF0aChBKSx0aGlzLl9wYXJ0cy5wYXRoPXRoaXMuX3BhcnRzLnBhdGgucmVwbGFjZShrLEEpLHRoaXMuYnVpbGQoIVMpLHRoaXN9fSxmLmZpbGVuYW1lPWZ1bmN0aW9uKEEsUyl7aWYodGhpcy5fcGFydHMudXJuKXJldHVybiBBPT09dm9pZCAwPyIiOnRoaXM7aWYodHlwZW9mIEEhPSJzdHJpbmciKXtpZighdGhpcy5fcGFydHMucGF0aHx8dGhpcy5fcGFydHMucGF0aD09PSIvIilyZXR1cm4iIjt2YXIgUD10aGlzLl9wYXJ0cy5wYXRoLmxhc3RJbmRleE9mKCIvIiksRj10aGlzLl9wYXJ0cy5wYXRoLnN1YnN0cmluZyhQKzEpO3JldHVybiBBP2kuZGVjb2RlUGF0aFNlZ21lbnQoRik6Rn1lbHNle3ZhciBqPSExO0EuY2hhckF0KDApPT09Ii8iJiYoQT1BLnN1YnN0cmluZygxKSksQS5tYXRjaCgvXC4/XC8vKSYmKGo9ITApO3ZhciBIPW5ldyBSZWdFeHAoYyh0aGlzLmZpbGVuYW1lKCkpKyIkIik7cmV0dXJuIEE9aS5yZWNvZGVQYXRoKEEpLHRoaXMuX3BhcnRzLnBhdGg9dGhpcy5fcGFydHMucGF0aC5yZXBsYWNlKEgsQSksaj90aGlzLm5vcm1hbGl6ZVBhdGgoUyk6dGhpcy5idWlsZCghUyksdGhpc319LGYuc3VmZml4PWZ1bmN0aW9uKEEsUyl7aWYodGhpcy5fcGFydHMudXJuKXJldHVybiBBPT09dm9pZCAwPyIiOnRoaXM7aWYoQT09PXZvaWQgMHx8QT09PSEwKXtpZighdGhpcy5fcGFydHMucGF0aHx8dGhpcy5fcGFydHMucGF0aD09PSIvIilyZXR1cm4iIjt2YXIgUD10aGlzLmZpbGVuYW1lKCksRj1QLmxhc3RJbmRleE9mKCIuIiksaixIO3JldHVybiBGPT09LTE/IiI6KGo9UC5zdWJzdHJpbmcoRisxKSxIPS9eW2EtejAtOSVdKyQvaS50ZXN0KGopP2o6IiIsQT9pLmRlY29kZVBhdGhTZWdtZW50KEgpOkgpfWVsc2V7QS5jaGFyQXQoMCk9PT0iLiImJihBPUEuc3Vic3RyaW5nKDEpKTt2YXIgaz10aGlzLnN1ZmZpeCgpLEs7aWYoaylBP0s9bmV3IFJlZ0V4cChjKGspKyIkIik6Sz1uZXcgUmVnRXhwKGMoIi4iK2spKyIkIik7ZWxzZXtpZighQSlyZXR1cm4gdGhpczt0aGlzLl9wYXJ0cy5wYXRoKz0iLiIraS5yZWNvZGVQYXRoKEEpfXJldHVybiBLJiYoQT1pLnJlY29kZVBhdGgoQSksdGhpcy5fcGFydHMucGF0aD10aGlzLl9wYXJ0cy5wYXRoLnJlcGxhY2UoSyxBKSksdGhpcy5idWlsZCghUyksdGhpc319LGYuc2VnbWVudD1mdW5jdGlvbihBLFMsUCl7dmFyIEY9dGhpcy5fcGFydHMudXJuPyI6IjoiLyIsaj10aGlzLnBhdGgoKSxIPWouc3Vic3RyaW5nKDAsMSk9PT0iLyIsaz1qLnNwbGl0KEYpO2lmKEEhPT12b2lkIDAmJnR5cGVvZiBBIT0ibnVtYmVyIiYmKFA9UyxTPUEsQT12b2lkIDApLEEhPT12b2lkIDAmJnR5cGVvZiBBIT0ibnVtYmVyIil0aHJvdyBuZXcgRXJyb3IoJ0JhZCBzZWdtZW50ICInK0ErJyIsIG11c3QgYmUgMC1iYXNlZCBpbnRlZ2VyJyk7aWYoSCYmay5zaGlmdCgpLEE8MCYmKEE9TWF0aC5tYXgoay5sZW5ndGgrQSwwKSksUz09PXZvaWQgMClyZXR1cm4gQT09PXZvaWQgMD9rOmtbQV07aWYoQT09PW51bGx8fGtbQV09PT12b2lkIDApaWYocChTKSl7az1bXTtmb3IodmFyIEs9MCxYPVMubGVuZ3RoO0s8WDtLKyspIVNbS10ubGVuZ3RoJiYoIWsubGVuZ3RofHwha1trLmxlbmd0aC0xXS5sZW5ndGgpfHwoay5sZW5ndGgmJiFrW2subGVuZ3RoLTFdLmxlbmd0aCYmay5wb3AoKSxrLnB1c2goZyhTW0tdKSkpfWVsc2UoU3x8dHlwZW9mIFM9PSJzdHJpbmciKSYmKFM9ZyhTKSxrW2subGVuZ3RoLTFdPT09IiI/a1trLmxlbmd0aC0xXT1TOmsucHVzaChTKSk7ZWxzZSBTP2tbQV09ZyhTKTprLnNwbGljZShBLDEpO3JldHVybiBIJiZrLnVuc2hpZnQoIiIpLHRoaXMucGF0aChrLmpvaW4oRiksUCl9LGYuc2VnbWVudENvZGVkPWZ1bmN0aW9uKEEsUyxQKXt2YXIgRixqLEg7aWYodHlwZW9mIEEhPSJudW1iZXIiJiYoUD1TLFM9QSxBPXZvaWQgMCksUz09PXZvaWQgMCl7aWYoRj10aGlzLnNlZ21lbnQoQSxTLFApLCFwKEYpKUY9RiE9PXZvaWQgMD9pLmRlY29kZShGKTp2b2lkIDA7ZWxzZSBmb3Ioaj0wLEg9Ri5sZW5ndGg7ajxIO2orKylGW2pdPWkuZGVjb2RlKEZbal0pO3JldHVybiBGfWlmKCFwKFMpKVM9dHlwZW9mIFM9PSJzdHJpbmcifHxTIGluc3RhbmNlb2YgU3RyaW5nP2kuZW5jb2RlKFMpOlM7ZWxzZSBmb3Ioaj0wLEg9Uy5sZW5ndGg7ajxIO2orKylTW2pdPWkuZW5jb2RlKFNbal0pO3JldHVybiB0aGlzLnNlZ21lbnQoQSxTLFApfTt2YXIgVT1mLnF1ZXJ5O3JldHVybiBmLnF1ZXJ5PWZ1bmN0aW9uKEEsUyl7aWYoQT09PSEwKXJldHVybiBpLnBhcnNlUXVlcnkodGhpcy5fcGFydHMucXVlcnksdGhpcy5fcGFydHMuZXNjYXBlUXVlcnlTcGFjZSk7aWYodHlwZW9mIEE9PSJmdW5jdGlvbiIpe3ZhciBQPWkucGFyc2VRdWVyeSh0aGlzLl9wYXJ0cy5xdWVyeSx0aGlzLl9wYXJ0cy5lc2NhcGVRdWVyeVNwYWNlKSxGPUEuY2FsbCh0aGlzLFApO3JldHVybiB0aGlzLl9wYXJ0cy5xdWVyeT1pLmJ1aWxkUXVlcnkoRnx8UCx0aGlzLl9wYXJ0cy5kdXBsaWNhdGVRdWVyeVBhcmFtZXRlcnMsdGhpcy5fcGFydHMuZXNjYXBlUXVlcnlTcGFjZSksdGhpcy5idWlsZCghUyksdGhpc31lbHNlIHJldHVybiBBIT09dm9pZCAwJiZ0eXBlb2YgQSE9InN0cmluZyI/KHRoaXMuX3BhcnRzLnF1ZXJ5PWkuYnVpbGRRdWVyeShBLHRoaXMuX3BhcnRzLmR1cGxpY2F0ZVF1ZXJ5UGFyYW1ldGVycyx0aGlzLl9wYXJ0cy5lc2NhcGVRdWVyeVNwYWNlKSx0aGlzLmJ1aWxkKCFTKSx0aGlzKTpVLmNhbGwodGhpcyxBLFMpfSxmLnNldFF1ZXJ5PWZ1bmN0aW9uKEEsUyxQKXt2YXIgRj1pLnBhcnNlUXVlcnkodGhpcy5fcGFydHMucXVlcnksdGhpcy5fcGFydHMuZXNjYXBlUXVlcnlTcGFjZSk7aWYodHlwZW9mIEE9PSJzdHJpbmcifHxBIGluc3RhbmNlb2YgU3RyaW5nKUZbQV09UyE9PXZvaWQgMD9TOm51bGw7ZWxzZSBpZih0eXBlb2YgQT09Im9iamVjdCIpZm9yKHZhciBqIGluIEEpdS5jYWxsKEEsaikmJihGW2pdPUFbal0pO2Vsc2UgdGhyb3cgbmV3IFR5cGVFcnJvcigiVVJJLmFkZFF1ZXJ5KCkgYWNjZXB0cyBhbiBvYmplY3QsIHN0cmluZyBhcyB0aGUgbmFtZSBwYXJhbWV0ZXIiKTtyZXR1cm4gdGhpcy5fcGFydHMucXVlcnk9aS5idWlsZFF1ZXJ5KEYsdGhpcy5fcGFydHMuZHVwbGljYXRlUXVlcnlQYXJhbWV0ZXJzLHRoaXMuX3BhcnRzLmVzY2FwZVF1ZXJ5U3BhY2UpLHR5cGVvZiBBIT0ic3RyaW5nIiYmKFA9UyksdGhpcy5idWlsZCghUCksdGhpc30sZi5hZGRRdWVyeT1mdW5jdGlvbihBLFMsUCl7dmFyIEY9aS5wYXJzZVF1ZXJ5KHRoaXMuX3BhcnRzLnF1ZXJ5LHRoaXMuX3BhcnRzLmVzY2FwZVF1ZXJ5U3BhY2UpO3JldHVybiBpLmFkZFF1ZXJ5KEYsQSxTPT09dm9pZCAwP251bGw6UyksdGhpcy5fcGFydHMucXVlcnk9aS5idWlsZFF1ZXJ5KEYsdGhpcy5fcGFydHMuZHVwbGljYXRlUXVlcnlQYXJhbWV0ZXJzLHRoaXMuX3BhcnRzLmVzY2FwZVF1ZXJ5U3BhY2UpLHR5cGVvZiBBIT0ic3RyaW5nIiYmKFA9UyksdGhpcy5idWlsZCghUCksdGhpc30sZi5yZW1vdmVRdWVyeT1mdW5jdGlvbihBLFMsUCl7dmFyIEY9aS5wYXJzZVF1ZXJ5KHRoaXMuX3BhcnRzLnF1ZXJ5LHRoaXMuX3BhcnRzLmVzY2FwZVF1ZXJ5U3BhY2UpO3JldHVybiBpLnJlbW92ZVF1ZXJ5KEYsQSxTKSx0aGlzLl9wYXJ0cy5xdWVyeT1pLmJ1aWxkUXVlcnkoRix0aGlzLl9wYXJ0cy5kdXBsaWNhdGVRdWVyeVBhcmFtZXRlcnMsdGhpcy5fcGFydHMuZXNjYXBlUXVlcnlTcGFjZSksdHlwZW9mIEEhPSJzdHJpbmciJiYoUD1TKSx0aGlzLmJ1aWxkKCFQKSx0aGlzfSxmLmhhc1F1ZXJ5PWZ1bmN0aW9uKEEsUyxQKXt2YXIgRj1pLnBhcnNlUXVlcnkodGhpcy5fcGFydHMucXVlcnksdGhpcy5fcGFydHMuZXNjYXBlUXVlcnlTcGFjZSk7cmV0dXJuIGkuaGFzUXVlcnkoRixBLFMsUCl9LGYuc2V0U2VhcmNoPWYuc2V0UXVlcnksZi5hZGRTZWFyY2g9Zi5hZGRRdWVyeSxmLnJlbW92ZVNlYXJjaD1mLnJlbW92ZVF1ZXJ5LGYuaGFzU2VhcmNoPWYuaGFzUXVlcnksZi5ub3JtYWxpemU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcGFydHMudXJuP3RoaXMubm9ybWFsaXplUHJvdG9jb2woITEpLm5vcm1hbGl6ZVBhdGgoITEpLm5vcm1hbGl6ZVF1ZXJ5KCExKS5ub3JtYWxpemVGcmFnbWVudCghMSkuYnVpbGQoKTp0aGlzLm5vcm1hbGl6ZVByb3RvY29sKCExKS5ub3JtYWxpemVIb3N0bmFtZSghMSkubm9ybWFsaXplUG9ydCghMSkubm9ybWFsaXplUGF0aCghMSkubm9ybWFsaXplUXVlcnkoITEpLm5vcm1hbGl6ZUZyYWdtZW50KCExKS5idWlsZCgpfSxmLm5vcm1hbGl6ZVByb3RvY29sPWZ1bmN0aW9uKEEpe3JldHVybiB0eXBlb2YgdGhpcy5fcGFydHMucHJvdG9jb2w9PSJzdHJpbmciJiYodGhpcy5fcGFydHMucHJvdG9jb2w9dGhpcy5fcGFydHMucHJvdG9jb2wudG9Mb3dlckNhc2UoKSx0aGlzLmJ1aWxkKCFBKSksdGhpc30sZi5ub3JtYWxpemVIb3N0bmFtZT1mdW5jdGlvbihBKXtyZXR1cm4gdGhpcy5fcGFydHMuaG9zdG5hbWUmJih0aGlzLmlzKCJJRE4iKSYmdD90aGlzLl9wYXJ0cy5ob3N0bmFtZT10LnRvQVNDSUkodGhpcy5fcGFydHMuaG9zdG5hbWUpOnRoaXMuaXMoIklQdjYiKSYmZSYmKHRoaXMuX3BhcnRzLmhvc3RuYW1lPWUuYmVzdCh0aGlzLl9wYXJ0cy5ob3N0bmFtZSkpLHRoaXMuX3BhcnRzLmhvc3RuYW1lPXRoaXMuX3BhcnRzLmhvc3RuYW1lLnRvTG93ZXJDYXNlKCksdGhpcy5idWlsZCghQSkpLHRoaXN9LGYubm9ybWFsaXplUG9ydD1mdW5jdGlvbihBKXtyZXR1cm4gdHlwZW9mIHRoaXMuX3BhcnRzLnByb3RvY29sPT0ic3RyaW5nIiYmdGhpcy5fcGFydHMucG9ydD09PWkuZGVmYXVsdFBvcnRzW3RoaXMuX3BhcnRzLnByb3RvY29sXSYmKHRoaXMuX3BhcnRzLnBvcnQ9bnVsbCx0aGlzLmJ1aWxkKCFBKSksdGhpc30sZi5ub3JtYWxpemVQYXRoPWZ1bmN0aW9uKEEpe3ZhciBTPXRoaXMuX3BhcnRzLnBhdGg7aWYoIVMpcmV0dXJuIHRoaXM7aWYodGhpcy5fcGFydHMudXJuKXJldHVybiB0aGlzLl9wYXJ0cy5wYXRoPWkucmVjb2RlVXJuUGF0aCh0aGlzLl9wYXJ0cy5wYXRoKSx0aGlzLmJ1aWxkKCFBKSx0aGlzO2lmKHRoaXMuX3BhcnRzLnBhdGg9PT0iLyIpcmV0dXJuIHRoaXM7Uz1pLnJlY29kZVBhdGgoUyk7dmFyIFAsRj0iIixqLEg7Zm9yKFMuY2hhckF0KDApIT09Ii8iJiYoUD0hMCxTPSIvIitTKSwoUy5zbGljZSgtMyk9PT0iLy4uInx8Uy5zbGljZSgtMik9PT0iLy4iKSYmKFMrPSIvIiksUz1TLnJlcGxhY2UoLyhcLyhcLlwvKSspfChcL1wuJCkvZywiLyIpLnJlcGxhY2UoL1wvezIsfS9nLCIvIiksUCYmKEY9Uy5zdWJzdHJpbmcoMSkubWF0Y2goL14oXC5cLlwvKSsvKXx8IiIsRiYmKEY9RlswXSkpO2o9Uy5zZWFyY2goL1wvXC5cLihcL3wkKS8pLGohPT0tMTspe2lmKGo9PT0wKXtTPVMuc3Vic3RyaW5nKDMpO2NvbnRpbnVlfUg9Uy5zdWJzdHJpbmcoMCxqKS5sYXN0SW5kZXhPZigiLyIpLEg9PT0tMSYmKEg9aiksUz1TLnN1YnN0cmluZygwLEgpK1Muc3Vic3RyaW5nKGorMyl9cmV0dXJuIFAmJnRoaXMuaXMoInJlbGF0aXZlIikmJihTPUYrUy5zdWJzdHJpbmcoMSkpLHRoaXMuX3BhcnRzLnBhdGg9Uyx0aGlzLmJ1aWxkKCFBKSx0aGlzfSxmLm5vcm1hbGl6ZVBhdGhuYW1lPWYubm9ybWFsaXplUGF0aCxmLm5vcm1hbGl6ZVF1ZXJ5PWZ1bmN0aW9uKEEpe3JldHVybiB0eXBlb2YgdGhpcy5fcGFydHMucXVlcnk9PSJzdHJpbmciJiYodGhpcy5fcGFydHMucXVlcnkubGVuZ3RoP3RoaXMucXVlcnkoaS5wYXJzZVF1ZXJ5KHRoaXMuX3BhcnRzLnF1ZXJ5LHRoaXMuX3BhcnRzLmVzY2FwZVF1ZXJ5U3BhY2UpKTp0aGlzLl9wYXJ0cy5xdWVyeT1udWxsLHRoaXMuYnVpbGQoIUEpKSx0aGlzfSxmLm5vcm1hbGl6ZUZyYWdtZW50PWZ1bmN0aW9uKEEpe3JldHVybiB0aGlzLl9wYXJ0cy5mcmFnbWVudHx8KHRoaXMuX3BhcnRzLmZyYWdtZW50PW51bGwsdGhpcy5idWlsZCghQSkpLHRoaXN9LGYubm9ybWFsaXplU2VhcmNoPWYubm9ybWFsaXplUXVlcnksZi5ub3JtYWxpemVIYXNoPWYubm9ybWFsaXplRnJhZ21lbnQsZi5pc284ODU5PWZ1bmN0aW9uKCl7dmFyIEE9aS5lbmNvZGUsUz1pLmRlY29kZTtpLmVuY29kZT1lc2NhcGUsaS5kZWNvZGU9ZGVjb2RlVVJJQ29tcG9uZW50O3RyeXt0aGlzLm5vcm1hbGl6ZSgpfWZpbmFsbHl7aS5lbmNvZGU9QSxpLmRlY29kZT1TfXJldHVybiB0aGlzfSxmLnVuaWNvZGU9ZnVuY3Rpb24oKXt2YXIgQT1pLmVuY29kZSxTPWkuZGVjb2RlO2kuZW5jb2RlPVQsaS5kZWNvZGU9dW5lc2NhcGU7dHJ5e3RoaXMubm9ybWFsaXplKCl9ZmluYWxseXtpLmVuY29kZT1BLGkuZGVjb2RlPVN9cmV0dXJuIHRoaXN9LGYucmVhZGFibGU9ZnVuY3Rpb24oKXt2YXIgQT10aGlzLmNsb25lKCk7QS51c2VybmFtZSgiIikucGFzc3dvcmQoIiIpLm5vcm1hbGl6ZSgpO3ZhciBTPSIiO2lmKEEuX3BhcnRzLnByb3RvY29sJiYoUys9QS5fcGFydHMucHJvdG9jb2wrIjovLyIpLEEuX3BhcnRzLmhvc3RuYW1lJiYoQS5pcygicHVueWNvZGUiKSYmdD8oUys9dC50b1VuaWNvZGUoQS5fcGFydHMuaG9zdG5hbWUpLEEuX3BhcnRzLnBvcnQmJihTKz0iOiIrQS5fcGFydHMucG9ydCkpOlMrPUEuaG9zdCgpKSxBLl9wYXJ0cy5ob3N0bmFtZSYmQS5fcGFydHMucGF0aCYmQS5fcGFydHMucGF0aC5jaGFyQXQoMCkhPT0iLyImJihTKz0iLyIpLFMrPUEucGF0aCghMCksQS5fcGFydHMucXVlcnkpe2Zvcih2YXIgUD0iIixGPTAsaj1BLl9wYXJ0cy5xdWVyeS5zcGxpdCgiJiIpLEg9ai5sZW5ndGg7RjxIO0YrKyl7dmFyIGs9KGpbRl18fCIiKS5zcGxpdCgiPSIpO1ArPSImIitpLmRlY29kZVF1ZXJ5KGtbMF0sdGhpcy5fcGFydHMuZXNjYXBlUXVlcnlTcGFjZSkucmVwbGFjZSgvJi9nLCIlMjYiKSxrWzFdIT09dm9pZCAwJiYoUCs9Ij0iK2kuZGVjb2RlUXVlcnkoa1sxXSx0aGlzLl9wYXJ0cy5lc2NhcGVRdWVyeVNwYWNlKS5yZXBsYWNlKC8mL2csIiUyNiIpKX1TKz0iPyIrUC5zdWJzdHJpbmcoMSl9cmV0dXJuIFMrPWkuZGVjb2RlUXVlcnkoQS5oYXNoKCksITApLFN9LGYuYWJzb2x1dGVUbz1mdW5jdGlvbihBKXt2YXIgUz10aGlzLmNsb25lKCksUD1bInByb3RvY29sIiwidXNlcm5hbWUiLCJwYXNzd29yZCIsImhvc3RuYW1lIiwicG9ydCJdLEYsaixIO2lmKHRoaXMuX3BhcnRzLnVybil0aHJvdyBuZXcgRXJyb3IoIlVSTnMgZG8gbm90IGhhdmUgYW55IGdlbmVyYWxseSBkZWZpbmVkIGhpZXJhcmNoaWNhbCBjb21wb25lbnRzIik7aWYoQSBpbnN0YW5jZW9mIGl8fChBPW5ldyBpKEEpKSxTLl9wYXJ0cy5wcm90b2NvbHx8KFMuX3BhcnRzLnByb3RvY29sPUEuX3BhcnRzLnByb3RvY29sLHRoaXMuX3BhcnRzLmhvc3RuYW1lKSlyZXR1cm4gUztmb3Ioaj0wO0g9UFtqXTtqKyspUy5fcGFydHNbSF09QS5fcGFydHNbSF07cmV0dXJuIFMuX3BhcnRzLnBhdGg/KFMuX3BhcnRzLnBhdGguc3Vic3RyaW5nKC0yKT09PSIuLiImJihTLl9wYXJ0cy5wYXRoKz0iLyIpLFMucGF0aCgpLmNoYXJBdCgwKSE9PSIvIiYmKEY9QS5kaXJlY3RvcnkoKSxGPUZ8fChBLnBhdGgoKS5pbmRleE9mKCIvIik9PT0wPyIvIjoiIiksUy5fcGFydHMucGF0aD0oRj9GKyIvIjoiIikrUy5fcGFydHMucGF0aCxTLm5vcm1hbGl6ZVBhdGgoKSkpOihTLl9wYXJ0cy5wYXRoPUEuX3BhcnRzLnBhdGgsUy5fcGFydHMucXVlcnl8fChTLl9wYXJ0cy5xdWVyeT1BLl9wYXJ0cy5xdWVyeSkpLFMuYnVpbGQoKSxTfSxmLnJlbGF0aXZlVG89ZnVuY3Rpb24oQSl7dmFyIFM9dGhpcy5jbG9uZSgpLm5vcm1hbGl6ZSgpLFAsRixqLEgsaztpZihTLl9wYXJ0cy51cm4pdGhyb3cgbmV3IEVycm9yKCJVUk5zIGRvIG5vdCBoYXZlIGFueSBnZW5lcmFsbHkgZGVmaW5lZCBoaWVyYXJjaGljYWwgY29tcG9uZW50cyIpO2lmKEE9bmV3IGkoQSkubm9ybWFsaXplKCksUD1TLl9wYXJ0cyxGPUEuX3BhcnRzLEg9Uy5wYXRoKCksaz1BLnBhdGgoKSxILmNoYXJBdCgwKSE9PSIvIil0aHJvdyBuZXcgRXJyb3IoIlVSSSBpcyBhbHJlYWR5IHJlbGF0aXZlIik7aWYoay5jaGFyQXQoMCkhPT0iLyIpdGhyb3cgbmV3IEVycm9yKCJDYW5ub3QgY2FsY3VsYXRlIGEgVVJJIHJlbGF0aXZlIHRvIGFub3RoZXIgcmVsYXRpdmUgVVJJIik7aWYoUC5wcm90b2NvbD09PUYucHJvdG9jb2wmJihQLnByb3RvY29sPW51bGwpLFAudXNlcm5hbWUhPT1GLnVzZXJuYW1lfHxQLnBhc3N3b3JkIT09Ri5wYXNzd29yZHx8UC5wcm90b2NvbCE9PW51bGx8fFAudXNlcm5hbWUhPT1udWxsfHxQLnBhc3N3b3JkIT09bnVsbClyZXR1cm4gUy5idWlsZCgpO2lmKFAuaG9zdG5hbWU9PT1GLmhvc3RuYW1lJiZQLnBvcnQ9PT1GLnBvcnQpUC5ob3N0bmFtZT1udWxsLFAucG9ydD1udWxsO2Vsc2UgcmV0dXJuIFMuYnVpbGQoKTtpZihIPT09aylyZXR1cm4gUC5wYXRoPSIiLFMuYnVpbGQoKTtpZihqPWkuY29tbW9uUGF0aChILGspLCFqKXJldHVybiBTLmJ1aWxkKCk7dmFyIEs9Ri5wYXRoLnN1YnN0cmluZyhqLmxlbmd0aCkucmVwbGFjZSgvW15cL10qJC8sIiIpLnJlcGxhY2UoLy4qP1wvL2csIi4uLyIpO3JldHVybiBQLnBhdGg9SytQLnBhdGguc3Vic3RyaW5nKGoubGVuZ3RoKXx8Ii4vIixTLmJ1aWxkKCl9LGYuZXF1YWxzPWZ1bmN0aW9uKEEpe3ZhciBTPXRoaXMuY2xvbmUoKSxQPW5ldyBpKEEpLEY9e30saj17fSxIPXt9LGssSyxYO2lmKFMubm9ybWFsaXplKCksUC5ub3JtYWxpemUoKSxTLnRvU3RyaW5nKCk9PT1QLnRvU3RyaW5nKCkpcmV0dXJuITA7aWYoaz1TLnF1ZXJ5KCksSz1QLnF1ZXJ5KCksUy5xdWVyeSgiIiksUC5xdWVyeSgiIiksUy50b1N0cmluZygpIT09UC50b1N0cmluZygpfHxrLmxlbmd0aCE9PUsubGVuZ3RoKXJldHVybiExO0Y9aS5wYXJzZVF1ZXJ5KGssdGhpcy5fcGFydHMuZXNjYXBlUXVlcnlTcGFjZSksaj1pLnBhcnNlUXVlcnkoSyx0aGlzLl9wYXJ0cy5lc2NhcGVRdWVyeVNwYWNlKTtmb3IoWCBpbiBGKWlmKHUuY2FsbChGLFgpKXtpZihwKEZbWF0pKXtpZighXyhGW1hdLGpbWF0pKXJldHVybiExfWVsc2UgaWYoRltYXSE9PWpbWF0pcmV0dXJuITE7SFtYXT0hMH1mb3IoWCBpbiBqKWlmKHUuY2FsbChqLFgpJiYhSFtYXSlyZXR1cm4hMTtyZXR1cm4hMH0sZi5wcmV2ZW50SW52YWxpZEhvc3RuYW1lPWZ1bmN0aW9uKEEpe3JldHVybiB0aGlzLl9wYXJ0cy5wcmV2ZW50SW52YWxpZEhvc3RuYW1lPSEhQSx0aGlzfSxmLmR1cGxpY2F0ZVF1ZXJ5UGFyYW1ldGVycz1mdW5jdGlvbihBKXtyZXR1cm4gdGhpcy5fcGFydHMuZHVwbGljYXRlUXVlcnlQYXJhbWV0ZXJzPSEhQSx0aGlzfSxmLmVzY2FwZVF1ZXJ5U3BhY2U9ZnVuY3Rpb24oQSl7cmV0dXJuIHRoaXMuX3BhcnRzLmVzY2FwZVF1ZXJ5U3BhY2U9ISFBLHRoaXN9LGl9KX0pO2Z1bmN0aW9uIGV4KHQpe3JldHVybih0Lmxlbmd0aD09PTB8fHRbdC5sZW5ndGgtMV0hPT0iLyIpJiYodD1gJHt0fS9gKSx0fXZhciBWMSxrMT1aKCgpPT57VjE9ZXh9KTtmdW5jdGlvbiBHMSh0LGUpe2lmKHQ9PT1udWxsfHx0eXBlb2YgdCE9Im9iamVjdCIpcmV0dXJuIHQ7ZT14KGUsITEpO2xldCBuPW5ldyB0LmNvbnN0cnVjdG9yO2ZvcihsZXQgbyBpbiB0KWlmKHQuaGFzT3duUHJvcGVydHkobykpe2xldCByPXRbb107ZSYmKHI9RzEocixlKSksbltvXT1yfXJldHVybiBufXZhciBZYyx6MT1aKCgpPT57SXQoKTtZYz1HMX0pO2Z1bmN0aW9uIGoxKHQsZSxuKXtuPXgobiwhMSk7bGV0IG89e30scj1oKHQpLGk9aChlKSxzLGYsdTtpZihyKWZvcihzIGluIHQpdC5oYXNPd25Qcm9wZXJ0eShzKSYmKGY9dFtzXSxpJiZuJiZ0eXBlb2YgZj09Im9iamVjdCImJmUuaGFzT3duUHJvcGVydHkocyk/KHU9ZVtzXSx0eXBlb2YgdT09Im9iamVjdCI/b1tzXT1qMShmLHUsbik6b1tzXT1mKTpvW3NdPWYpO2lmKGkpZm9yKHMgaW4gZSllLmhhc093blByb3BlcnR5KHMpJiYhby5oYXNPd25Qcm9wZXJ0eShzKSYmKHU9ZVtzXSxvW3NdPXUpO3JldHVybiBvfXZhciBfcixycD1aKCgpPT57SXQoKTtmdCgpO19yPWoxfSk7ZnVuY3Rpb24gbngoKXtsZXQgdCxlLG49bmV3IFByb21pc2UoZnVuY3Rpb24obyxyKXt0PW8sZT1yfSk7cmV0dXJue3Jlc29sdmU6dCxyZWplY3Q6ZSxwcm9taXNlOm59fXZhciBqcyxVbT1aKCgpPT57anM9bnh9KTtmdW5jdGlvbiBWbSh0LGUpe2xldCBuO3JldHVybiB0eXBlb2YgZG9jdW1lbnQ8InUiJiYobj1kb2N1bWVudCksVm0uX2ltcGxlbWVudGF0aW9uKHQsZSxuKX12YXIgSDEsZmYsa209WigoKT0+e0gxPWRyKHpzKCksMSk7SXQoKTtmdCgpO0h0KCk7Vm0uX2ltcGxlbWVudGF0aW9uPWZ1bmN0aW9uKHQsZSxuKXtpZighaCh0KSl0aHJvdyBuZXcgQigicmVsYXRpdmUgdXJpIGlzIHJlcXVpcmVkLiIpO2lmKCFoKGUpKXtpZih0eXBlb2Ygbj4idSIpcmV0dXJuIHQ7ZT14KG4uYmFzZVVSSSxuLmxvY2F0aW9uLmhyZWYpfWxldCBvPW5ldyBIMS5kZWZhdWx0KHQpO3JldHVybiBvLnNjaGVtZSgpIT09IiI/by50b1N0cmluZygpOm8uYWJzb2x1dGVUbyhlKS50b1N0cmluZygpfTtmZj1WbX0pO2Z1bmN0aW9uIG94KHQsZSl7aWYoIWgodCkpdGhyb3cgbmV3IEIoInVyaSBpcyByZXF1aXJlZC4iKTtsZXQgbj0iIixvPXQubGFzdEluZGV4T2YoIi8iKTtyZXR1cm4gbyE9PS0xJiYobj10LnN1YnN0cmluZygwLG8rMSkpLGUmJih0PW5ldyBxMS5kZWZhdWx0KHQpLHQucXVlcnkoKS5sZW5ndGghPT0wJiYobis9YD8ke3QucXVlcnkoKX1gKSx0LmZyYWdtZW50KCkubGVuZ3RoIT09MCYmKG4rPWAjJHt0LmZyYWdtZW50KCl9YCkpLG59dmFyIHExLEsxLFcxPVooKCk9PntxMT1kcih6cygpLDEpO2Z0KCk7SHQoKTtLMT1veH0pO2Z1bmN0aW9uIHJ4KHQpe2lmKCFoKHQpKXRocm93IG5ldyBCKCJ1cmkgaXMgcmVxdWlyZWQuIik7bGV0IGU9bmV3IFgxLmRlZmF1bHQodCk7ZS5ub3JtYWxpemUoKTtsZXQgbj1lLnBhdGgoKSxvPW4ubGFzdEluZGV4T2YoIi8iKTtyZXR1cm4gbyE9PS0xJiYobj1uLnN1YnN0cihvKzEpKSxvPW4ubGFzdEluZGV4T2YoIi4iKSxvPT09LTE/bj0iIjpuPW4uc3Vic3RyKG8rMSksbn12YXIgWDEsWTEsJDE9WigoKT0+e1gxPWRyKHpzKCksMSk7ZnQoKTtIdCgpO1kxPXJ4fSk7ZnVuY3Rpb24gaXgodCxlLG4pe2goZSl8fChlPXQud2lkdGgpLGgobil8fChuPXQuaGVpZ2h0KTtsZXQgbz1aMVtlXTtoKG8pfHwobz17fSxaMVtlXT1vKTtsZXQgcj1vW25dO2lmKCFoKHIpKXtsZXQgaT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJjYW52YXMiKTtpLndpZHRoPWUsaS5oZWlnaHQ9bixyPWkuZ2V0Q29udGV4dCgiMmQiLHt3aWxsUmVhZEZyZXF1ZW50bHk6ITB9KSxyLmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbj0iY29weSIsb1tuXT1yfXJldHVybiByLmRyYXdJbWFnZSh0LDAsMCxlLG4pLHIuZ2V0SW1hZ2VEYXRhKDAsMCxlLG4pLmRhdGF9dmFyIFoxLEdtLFExPVooKCk9PntmdCgpO1oxPXt9O0dtPWl4fSk7ZnVuY3Rpb24gY3godCl7cmV0dXJuIHkudHlwZU9mLnN0cmluZygidXJpIix0KSxzeC50ZXN0KHQpfXZhciBzeCxpcCx6bT1aKCgpPT57WHQoKTtzeD0vXmJsb2I6L2k7aXA9Y3h9KTtmdW5jdGlvbiBheCh0KXtoKHRpKXx8KHRpPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImEiKSksdGkuaHJlZj13aW5kb3cubG9jYXRpb24uaHJlZjtsZXQgZT10aS5ob3N0LG49dGkucHJvdG9jb2w7cmV0dXJuIHRpLmhyZWY9dCx0aS5ocmVmPXRpLmhyZWYsbiE9PXRpLnByb3RvY29sfHxlIT09dGkuaG9zdH12YXIgdGksSjEsdEE9WigoKT0+e2Z0KCk7SjE9YXh9KTtmdW5jdGlvbiB1eCh0KXtyZXR1cm4geS50eXBlT2Yuc3RyaW5nKCJ1cmkiLHQpLGZ4LnRlc3QodCl9dmFyIGZ4LHNwLGptPVooKCk9PntYdCgpO2Z4PS9eZGF0YTovaTtzcD11eH0pO2Z1bmN0aW9uIGx4KHQpe2xldCBlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO3JldHVybiBlLmFzeW5jPSEwLGUuc3JjPXQsbmV3IFByb21pc2UoKG4sbyk9Pnt3aW5kb3cuY3Jvc3NPcmlnaW5Jc29sYXRlZCYmZS5zZXRBdHRyaWJ1dGUoImNyb3Nzb3JpZ2luIiwiYW5vbnltb3VzIik7bGV0IHI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImhlYWQiKVswXTtlLm9ubG9hZD1mdW5jdGlvbigpe2Uub25sb2FkPXZvaWQgMCxyLnJlbW92ZUNoaWxkKGUpLG4oKX0sZS5vbmVycm9yPWZ1bmN0aW9uKGkpe28oaSl9LHIuYXBwZW5kQ2hpbGQoZSl9KX12YXIgZUEsbkE9WigoKT0+e2VBPWx4fSk7ZnVuY3Rpb24gcHgodCl7aWYoIWgodCkpdGhyb3cgbmV3IEIoIm9iaiBpcyByZXF1aXJlZC4iKTtsZXQgZT0iIjtmb3IobGV0IG4gaW4gdClpZih0Lmhhc093blByb3BlcnR5KG4pKXtsZXQgbz10W25dLHI9YCR7ZW5jb2RlVVJJQ29tcG9uZW50KG4pfT1gO2lmKEFycmF5LmlzQXJyYXkobykpZm9yKGxldCBpPTAscz1vLmxlbmd0aDtpPHM7KytpKWUrPWAke3IrZW5jb2RlVVJJQ29tcG9uZW50KG9baV0pfSZgO2Vsc2UgZSs9YCR7citlbmNvZGVVUklDb21wb25lbnQobyl9JmB9cmV0dXJuIGU9ZS5zbGljZSgwLC0xKSxlfXZhciBvQSxyQT1aKCgpPT57ZnQoKTtIdCgpO29BPXB4fSk7ZnVuY3Rpb24gZHgodCl7aWYoIWgodCkpdGhyb3cgbmV3IEIoInF1ZXJ5U3RyaW5nIGlzIHJlcXVpcmVkLiIpO2xldCBlPXt9O2lmKHQ9PT0iIilyZXR1cm4gZTtsZXQgbj10LnJlcGxhY2UoL1wrL2csIiUyMCIpLnNwbGl0KC9bJjtdLyk7Zm9yKGxldCBvPTAscj1uLmxlbmd0aDtvPHI7KytvKXtsZXQgaT1uW29dLnNwbGl0KCI9Iikscz1kZWNvZGVVUklDb21wb25lbnQoaVswXSksZj1pWzFdO2goZik/Zj1kZWNvZGVVUklDb21wb25lbnQoZik6Zj0iIjtsZXQgdT1lW3NdO3R5cGVvZiB1PT0ic3RyaW5nIj9lW3NdPVt1LGZdOkFycmF5LmlzQXJyYXkodSk/dS5wdXNoKGYpOmVbc109Zn1yZXR1cm4gZX12YXIgaUEsc0E9WigoKT0+e2Z0KCk7SHQoKTtpQT1keH0pO3ZhciBteCxDbixjcD1aKCgpPT57bXg9e1VOSVNTVUVEOjAsSVNTVUVEOjEsQUNUSVZFOjIsUkVDRUlWRUQ6MyxDQU5DRUxMRUQ6NCxGQUlMRUQ6NX0sQ249T2JqZWN0LmZyZWV6ZShteCl9KTt2YXIgaHgsY0EsYUE9WigoKT0+e2h4PXtURVJSQUlOOjAsSU1BR0VSWToxLFRJTEVTM0Q6MixPVEhFUjozfSxjQT1PYmplY3QuZnJlZXplKGh4KX0pO2Z1bmN0aW9uIGFwKHQpe3Q9eCh0LHguRU1QVFlfT0JKRUNUKTtsZXQgZT14KHQudGhyb3R0bGVCeVNlcnZlciwhMSksbj14KHQudGhyb3R0bGUsITEpO3RoaXMudXJsPXQudXJsLHRoaXMucmVxdWVzdEZ1bmN0aW9uPXQucmVxdWVzdEZ1bmN0aW9uLHRoaXMuY2FuY2VsRnVuY3Rpb249dC5jYW5jZWxGdW5jdGlvbix0aGlzLnByaW9yaXR5RnVuY3Rpb249dC5wcmlvcml0eUZ1bmN0aW9uLHRoaXMucHJpb3JpdHk9eCh0LnByaW9yaXR5LDApLHRoaXMudGhyb3R0bGU9bix0aGlzLnRocm90dGxlQnlTZXJ2ZXI9ZSx0aGlzLnR5cGU9eCh0LnR5cGUsY0EuT1RIRVIpLHRoaXMuc2VydmVyS2V5PXQuc2VydmVyS2V5LHRoaXMuc3RhdGU9Q24uVU5JU1NVRUQsdGhpcy5kZWZlcnJlZD12b2lkIDAsdGhpcy5jYW5jZWxsZWQ9ITF9dmFyIGZBLHVBPVooKCk9PntJdCgpO2Z0KCk7Y3AoKTthQSgpO2FwLnByb3RvdHlwZS5jYW5jZWw9ZnVuY3Rpb24oKXt0aGlzLmNhbmNlbGxlZD0hMH07YXAucHJvdG90eXBlLmNsb25lPWZ1bmN0aW9uKHQpe3JldHVybiBoKHQpPyh0LnVybD10aGlzLnVybCx0LnJlcXVlc3RGdW5jdGlvbj10aGlzLnJlcXVlc3RGdW5jdGlvbix0LmNhbmNlbEZ1bmN0aW9uPXRoaXMuY2FuY2VsRnVuY3Rpb24sdC5wcmlvcml0eUZ1bmN0aW9uPXRoaXMucHJpb3JpdHlGdW5jdGlvbix0LnByaW9yaXR5PXRoaXMucHJpb3JpdHksdC50aHJvdHRsZT10aGlzLnRocm90dGxlLHQudGhyb3R0bGVCeVNlcnZlcj10aGlzLnRocm90dGxlQnlTZXJ2ZXIsdC50eXBlPXRoaXMudHlwZSx0LnNlcnZlcktleT10aGlzLnNlcnZlcktleSx0LnN0YXRlPUNuLlVOSVNTVUVELHQuZGVmZXJyZWQ9dm9pZCAwLHQuY2FuY2VsbGVkPSExLHQpOm5ldyBhcCh0aGlzKX07ZkE9YXB9KTtmdW5jdGlvbiBfeCh0KXtsZXQgZT17fTtpZighdClyZXR1cm4gZTtsZXQgbj10LnNwbGl0KGBccgpgKTtmb3IobGV0IG89MDtvPG4ubGVuZ3RoOysrbyl7bGV0IHI9bltvXSxpPXIuaW5kZXhPZigiOiAiKTtpZihpPjApe2xldCBzPXIuc3Vic3RyaW5nKDAsaSksZj1yLnN1YnN0cmluZyhpKzIpO2Vbc109Zn19cmV0dXJuIGV9dmFyIGxBLHBBPVooKCk9PntsQT1feH0pO2Z1bmN0aW9uIGRBKHQsZSxuKXt0aGlzLnN0YXR1c0NvZGU9dCx0aGlzLnJlc3BvbnNlPWUsdGhpcy5yZXNwb25zZUhlYWRlcnM9bix0eXBlb2YgdGhpcy5yZXNwb25zZUhlYWRlcnM9PSJzdHJpbmciJiYodGhpcy5yZXNwb25zZUhlYWRlcnM9bEEodGhpcy5yZXNwb25zZUhlYWRlcnMpKX12YXIgdWYsbUE9WigoKT0+e2Z0KCk7cEEoKTtkQS5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtsZXQgdD0iUmVxdWVzdCBoYXMgZmFpbGVkLiI7cmV0dXJuIGgodGhpcy5zdGF0dXNDb2RlKSYmKHQrPWAgU3RhdHVzIENvZGU6ICR7dGhpcy5zdGF0dXNDb2RlfWApLHR9O3VmPWRBfSk7ZnVuY3Rpb24gbGYoKXt0aGlzLl9saXN0ZW5lcnM9W10sdGhpcy5fc2NvcGVzPVtdLHRoaXMuX3RvUmVtb3ZlPVtdLHRoaXMuX2luc2lkZVJhaXNlRXZlbnQ9ITF9ZnVuY3Rpb24geXgodCxlKXtyZXR1cm4gZS10fXZhciBoQSxfQT1aKCgpPT57WHQoKTtmdCgpO09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGxmLnByb3RvdHlwZSx7bnVtYmVyT2ZMaXN0ZW5lcnM6e2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9saXN0ZW5lcnMubGVuZ3RoLXRoaXMuX3RvUmVtb3ZlLmxlbmd0aH19fSk7bGYucHJvdG90eXBlLmFkZEV2ZW50TGlzdGVuZXI9ZnVuY3Rpb24odCxlKXt5LnR5cGVPZi5mdW5jKCJsaXN0ZW5lciIsdCksdGhpcy5fbGlzdGVuZXJzLnB1c2godCksdGhpcy5fc2NvcGVzLnB1c2goZSk7bGV0IG49dGhpcztyZXR1cm4gZnVuY3Rpb24oKXtuLnJlbW92ZUV2ZW50TGlzdGVuZXIodCxlKX19O2xmLnByb3RvdHlwZS5yZW1vdmVFdmVudExpc3RlbmVyPWZ1bmN0aW9uKHQsZSl7eS50eXBlT2YuZnVuYygibGlzdGVuZXIiLHQpO2xldCBuPXRoaXMuX2xpc3RlbmVycyxvPXRoaXMuX3Njb3BlcyxyPS0xO2ZvcihsZXQgaT0wO2k8bi5sZW5ndGg7aSsrKWlmKG5baV09PT10JiZvW2ldPT09ZSl7cj1pO2JyZWFrfXJldHVybiByIT09LTE/KHRoaXMuX2luc2lkZVJhaXNlRXZlbnQ/KHRoaXMuX3RvUmVtb3ZlLnB1c2gociksbltyXT12b2lkIDAsb1tyXT12b2lkIDApOihuLnNwbGljZShyLDEpLG8uc3BsaWNlKHIsMSkpLCEwKTohMX07bGYucHJvdG90eXBlLnJhaXNlRXZlbnQ9ZnVuY3Rpb24oKXt0aGlzLl9pbnNpZGVSYWlzZUV2ZW50PSEwO2xldCB0LGU9dGhpcy5fbGlzdGVuZXJzLG49dGhpcy5fc2NvcGVzLG89ZS5sZW5ndGg7Zm9yKHQ9MDt0PG87dCsrKXtsZXQgaT1lW3RdO2goaSkmJmVbdF0uYXBwbHkoblt0XSxhcmd1bWVudHMpfWxldCByPXRoaXMuX3RvUmVtb3ZlO2lmKG89ci5sZW5ndGgsbz4wKXtmb3Ioci5zb3J0KHl4KSx0PTA7dDxvO3QrKyl7bGV0IGk9clt0XTtlLnNwbGljZShpLDEpLG4uc3BsaWNlKGksMSl9ci5sZW5ndGg9MH10aGlzLl9pbnNpZGVSYWlzZUV2ZW50PSExfTtoQT1sZn0pO2Z1bmN0aW9uIEhzKHQpe3kudHlwZU9mLm9iamVjdCgib3B0aW9ucyIsdCkseS5kZWZpbmVkKCJvcHRpb25zLmNvbXBhcmF0b3IiLHQuY29tcGFyYXRvciksdGhpcy5fY29tcGFyYXRvcj10LmNvbXBhcmF0b3IsdGhpcy5fYXJyYXk9W10sdGhpcy5fbGVuZ3RoPTAsdGhpcy5fbWF4aW11bUxlbmd0aD12b2lkIDB9ZnVuY3Rpb24gSG0odCxlLG4pe2xldCBvPXRbZV07dFtlXT10W25dLHRbbl09b312YXIgeUEsZ0E9WigoKT0+e1h0KCk7SXQoKTtmdCgpO09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKEhzLnByb3RvdHlwZSx7bGVuZ3RoOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbGVuZ3RofX0saW50ZXJuYWxBcnJheTp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2FycmF5fX0sbWF4aW11bUxlbmd0aDp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX21heGltdW1MZW5ndGh9LHNldDpmdW5jdGlvbih0KXt5LnR5cGVPZi5udW1iZXIuZ3JlYXRlclRoYW5PckVxdWFscygibWF4aW11bUxlbmd0aCIsdCwwKTtsZXQgZT10aGlzLl9sZW5ndGg7aWYodDxlKXtsZXQgbj10aGlzLl9hcnJheTtmb3IobGV0IG89dDtvPGU7KytvKW5bb109dm9pZCAwO3RoaXMuX2xlbmd0aD10LG4ubGVuZ3RoPXR9dGhpcy5fbWF4aW11bUxlbmd0aD10fX0sY29tcGFyYXRvcjp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2NvbXBhcmF0b3J9fX0pO0hzLnByb3RvdHlwZS5yZXNlcnZlPWZ1bmN0aW9uKHQpe3Q9eCh0LHRoaXMuX2xlbmd0aCksdGhpcy5fYXJyYXkubGVuZ3RoPXR9O0hzLnByb3RvdHlwZS5oZWFwaWZ5PWZ1bmN0aW9uKHQpe3Q9eCh0LDApO2xldCBlPXRoaXMuX2xlbmd0aCxuPXRoaXMuX2NvbXBhcmF0b3Isbz10aGlzLl9hcnJheSxyPS0xLGk9ITA7Zm9yKDtpOyl7bGV0IHM9MioodCsxKSxmPXMtMTtmPGUmJm4ob1tmXSxvW3RdKTwwP3I9ZjpyPXQsczxlJiZuKG9bc10sb1tyXSk8MCYmKHI9cyksciE9PXQ/KEhtKG8scix0KSx0PXIpOmk9ITF9fTtIcy5wcm90b3R5cGUucmVzb3J0PWZ1bmN0aW9uKCl7bGV0IHQ9dGhpcy5fbGVuZ3RoO2ZvcihsZXQgZT1NYXRoLmNlaWwodC8yKTtlPj0wOy0tZSl0aGlzLmhlYXBpZnkoZSl9O0hzLnByb3RvdHlwZS5pbnNlcnQ9ZnVuY3Rpb24odCl7eS5kZWZpbmVkKCJlbGVtZW50Iix0KTtsZXQgZT10aGlzLl9hcnJheSxuPXRoaXMuX2NvbXBhcmF0b3Isbz10aGlzLl9tYXhpbXVtTGVuZ3RoLHI9dGhpcy5fbGVuZ3RoKys7Zm9yKHI8ZS5sZW5ndGg/ZVtyXT10OmUucHVzaCh0KTtyIT09MDspe2xldCBzPU1hdGguZmxvb3IoKHItMSkvMik7aWYobihlW3JdLGVbc10pPDApSG0oZSxyLHMpLHI9cztlbHNlIGJyZWFrfWxldCBpO3JldHVybiBoKG8pJiZ0aGlzLl9sZW5ndGg+byYmKGk9ZVtvXSx0aGlzLl9sZW5ndGg9byksaX07SHMucHJvdG90eXBlLnBvcD1mdW5jdGlvbih0KXtpZih0PXgodCwwKSx0aGlzLl9sZW5ndGg9PT0wKXJldHVybjt5LnR5cGVPZi5udW1iZXIubGVzc1RoYW4oImluZGV4Iix0LHRoaXMuX2xlbmd0aCk7bGV0IGU9dGhpcy5fYXJyYXksbj1lW3RdO3JldHVybiBIbShlLHQsLS10aGlzLl9sZW5ndGgpLHRoaXMuaGVhcGlmeSh0KSxlW3RoaXMuX2xlbmd0aF09dm9pZCAwLG59O3lBPUhzfSk7ZnVuY3Rpb24gZ3godCxlKXtyZXR1cm4gdC5wcmlvcml0eS1lLnByaW9yaXR5fWZ1bmN0aW9uIFRuKCl7fWZ1bmN0aW9uIEFBKHQpe2godC5wcmlvcml0eUZ1bmN0aW9uKSYmKHQucHJpb3JpdHk9dC5wcmlvcml0eUZ1bmN0aW9uKCkpfWZ1bmN0aW9uIGJBKHQpe3JldHVybiB0LnN0YXRlPT09Q24uVU5JU1NVRUQmJih0LnN0YXRlPUNuLklTU1VFRCx0LmRlZmVycmVkPWpzKCkpLHQuZGVmZXJyZWQucHJvbWlzZX1mdW5jdGlvbiBieCh0KXtyZXR1cm4gZnVuY3Rpb24oZSl7aWYodC5zdGF0ZT09PUNuLkNBTkNFTExFRClyZXR1cm47bGV0IG49dC5kZWZlcnJlZDstLWplLm51bWJlck9mQWN0aXZlUmVxdWVzdHMsLS1DaVt0LnNlcnZlcktleV0sdXAucmFpc2VFdmVudCgpLHQuc3RhdGU9Q24uUkVDRUlWRUQsdC5kZWZlcnJlZD12b2lkIDAsbi5yZXNvbHZlKGUpfX1mdW5jdGlvbiBUeCh0KXtyZXR1cm4gZnVuY3Rpb24oZSl7dC5zdGF0ZSE9PUNuLkNBTkNFTExFRCYmKCsramUubnVtYmVyT2ZGYWlsZWRSZXF1ZXN0cywtLWplLm51bWJlck9mQWN0aXZlUmVxdWVzdHMsLS1DaVt0LnNlcnZlcktleV0sdXAucmFpc2VFdmVudChlKSx0LnN0YXRlPUNuLkZBSUxFRCx0LmRlZmVycmVkLnJlamVjdChlKSl9fWZ1bmN0aW9uIFRBKHQpe2xldCBlPWJBKHQpO3JldHVybiB0LnN0YXRlPUNuLkFDVElWRSxlaS5wdXNoKHQpLCsramUubnVtYmVyT2ZBY3RpdmVSZXF1ZXN0cywrK2plLm51bWJlck9mQWN0aXZlUmVxdWVzdHNFdmVyLCsrQ2lbdC5zZXJ2ZXJLZXldLHQucmVxdWVzdEZ1bmN0aW9uKCkudGhlbihieCh0KSkuY2F0Y2goVHgodCkpLGV9ZnVuY3Rpb24gcXModCl7bGV0IGU9dC5zdGF0ZT09PUNuLkFDVElWRTtpZih0LnN0YXRlPUNuLkNBTkNFTExFRCwrK2plLm51bWJlck9mQ2FuY2VsbGVkUmVxdWVzdHMsaCh0LmRlZmVycmVkKSl7bGV0IG49dC5kZWZlcnJlZDt0LmRlZmVycmVkPXZvaWQgMCxuLnJlamVjdCgpfWUmJigtLWplLm51bWJlck9mQWN0aXZlUmVxdWVzdHMsLS1DaVt0LnNlcnZlcktleV0sKytqZS5udW1iZXJPZkNhbmNlbGxlZEFjdGl2ZVJlcXVlc3RzKSxoKHQuY2FuY2VsRnVuY3Rpb24pJiZ0LmNhbmNlbEZ1bmN0aW9uKCl9ZnVuY3Rpb24gd3goKXtUbi5kZWJ1Z1Nob3dTdGF0aXN0aWNzJiYoamUubnVtYmVyT2ZBY3RpdmVSZXF1ZXN0cz09PTAmJmplLmxhc3ROdW1iZXJPZkFjdGl2ZVJlcXVlc3RzPjAmJihqZS5udW1iZXJPZkF0dGVtcHRlZFJlcXVlc3RzPjAmJihjb25zb2xlLmxvZyhgTnVtYmVyIG9mIGF0dGVtcHRlZCByZXF1ZXN0czogJHtqZS5udW1iZXJPZkF0dGVtcHRlZFJlcXVlc3RzfWApLGplLm51bWJlck9mQXR0ZW1wdGVkUmVxdWVzdHM9MCksamUubnVtYmVyT2ZDYW5jZWxsZWRSZXF1ZXN0cz4wJiYoY29uc29sZS5sb2coYE51bWJlciBvZiBjYW5jZWxsZWQgcmVxdWVzdHM6ICR7amUubnVtYmVyT2ZDYW5jZWxsZWRSZXF1ZXN0c31gKSxqZS5udW1iZXJPZkNhbmNlbGxlZFJlcXVlc3RzPTApLGplLm51bWJlck9mQ2FuY2VsbGVkQWN0aXZlUmVxdWVzdHM+MCYmKGNvbnNvbGUubG9nKGBOdW1iZXIgb2YgY2FuY2VsbGVkIGFjdGl2ZSByZXF1ZXN0czogJHtqZS5udW1iZXJPZkNhbmNlbGxlZEFjdGl2ZVJlcXVlc3RzfWApLGplLm51bWJlck9mQ2FuY2VsbGVkQWN0aXZlUmVxdWVzdHM9MCksamUubnVtYmVyT2ZGYWlsZWRSZXF1ZXN0cz4wJiYoY29uc29sZS5sb2coYE51bWJlciBvZiBmYWlsZWQgcmVxdWVzdHM6ICR7amUubnVtYmVyT2ZGYWlsZWRSZXF1ZXN0c31gKSxqZS5udW1iZXJPZkZhaWxlZFJlcXVlc3RzPTApKSxqZS5sYXN0TnVtYmVyT2ZBY3RpdmVSZXF1ZXN0cz1qZS5udW1iZXJPZkFjdGl2ZVJlcXVlc3RzKX12YXIgZnAsamUsJGMsVG8sZWksQ2ksQXgsdXAsbHAsd0E9WigoKT0+e2ZwPWRyKHpzKCksMSk7WHQoKTtJdCgpO1VtKCk7ZnQoKTtfQSgpO2dBKCk7em0oKTtqbSgpO2NwKCk7amU9e251bWJlck9mQXR0ZW1wdGVkUmVxdWVzdHM6MCxudW1iZXJPZkFjdGl2ZVJlcXVlc3RzOjAsbnVtYmVyT2ZDYW5jZWxsZWRSZXF1ZXN0czowLG51bWJlck9mQ2FuY2VsbGVkQWN0aXZlUmVxdWVzdHM6MCxudW1iZXJPZkZhaWxlZFJlcXVlc3RzOjAsbnVtYmVyT2ZBY3RpdmVSZXF1ZXN0c0V2ZXI6MCxsYXN0TnVtYmVyT2ZBY3RpdmVSZXF1ZXN0czowfSwkYz0yMCxUbz1uZXcgeUEoe2NvbXBhcmF0b3I6Z3h9KTtUby5tYXhpbXVtTGVuZ3RoPSRjO1RvLnJlc2VydmUoJGMpO2VpPVtdLENpPXt9LEF4PXR5cGVvZiBkb2N1bWVudDwidSI/bmV3IGZwLmRlZmF1bHQoZG9jdW1lbnQubG9jYXRpb24uaHJlZik6bmV3IGZwLmRlZmF1bHQsdXA9bmV3IGhBO1RuLm1heGltdW1SZXF1ZXN0cz01MDtUbi5tYXhpbXVtUmVxdWVzdHNQZXJTZXJ2ZXI9MTg7VG4ucmVxdWVzdHNCeVNlcnZlcj17fTtUbi50aHJvdHRsZVJlcXVlc3RzPSEwO1RuLmRlYnVnU2hvd1N0YXRpc3RpY3M9ITE7VG4ucmVxdWVzdENvbXBsZXRlZEV2ZW50PXVwO09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKFRuLHtzdGF0aXN0aWNzOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gamV9fSxwcmlvcml0eUhlYXBMZW5ndGg6e2dldDpmdW5jdGlvbigpe3JldHVybiAkY30sc2V0OmZ1bmN0aW9uKHQpe2lmKHQ8JGMpZm9yKDtUby5sZW5ndGg+dDspe2xldCBlPVRvLnBvcCgpO3FzKGUpfSRjPXQsVG8ubWF4aW11bUxlbmd0aD10LFRvLnJlc2VydmUodCl9fX0pO1RuLnNlcnZlckhhc09wZW5TbG90cz1mdW5jdGlvbih0LGUpe2U9eChlLDEpO2xldCBuPXgoVG4ucmVxdWVzdHNCeVNlcnZlclt0XSxUbi5tYXhpbXVtUmVxdWVzdHNQZXJTZXJ2ZXIpO3JldHVybiBDaVt0XStlPD1ufTtUbi5oZWFwSGFzT3BlblNsb3RzPWZ1bmN0aW9uKHQpe3JldHVybiBUby5sZW5ndGgrdDw9JGN9O1RuLnVwZGF0ZT1mdW5jdGlvbigpe2xldCB0LGUsbj0wLG89ZWkubGVuZ3RoO2Zvcih0PTA7dDxvOysrdCl7aWYoZT1laVt0XSxlLmNhbmNlbGxlZCYmcXMoZSksZS5zdGF0ZSE9PUNuLkFDVElWRSl7KytuO2NvbnRpbnVlfW4+MCYmKGVpW3Qtbl09ZSl9ZWkubGVuZ3RoLT1uO2xldCByPVRvLmludGVybmFsQXJyYXksaT1Uby5sZW5ndGg7Zm9yKHQ9MDt0PGk7Kyt0KUFBKHJbdF0pO1RvLnJlc29ydCgpO2xldCBzPU1hdGgubWF4KFRuLm1heGltdW1SZXF1ZXN0cy1laS5sZW5ndGgsMCksZj0wO2Zvcig7ZjxzJiZUby5sZW5ndGg+MDspe2lmKGU9VG8ucG9wKCksZS5jYW5jZWxsZWQpe3FzKGUpO2NvbnRpbnVlfWlmKGUudGhyb3R0bGVCeVNlcnZlciYmIVRuLnNlcnZlckhhc09wZW5TbG90cyhlLnNlcnZlcktleSkpe3FzKGUpO2NvbnRpbnVlfVRBKGUpLCsrZn13eCgpfTtUbi5nZXRTZXJ2ZXJLZXk9ZnVuY3Rpb24odCl7eS50eXBlT2Yuc3RyaW5nKCJ1cmwiLHQpO2xldCBlPW5ldyBmcC5kZWZhdWx0KHQpO2Uuc2NoZW1lKCk9PT0iIiYmKGU9ZS5hYnNvbHV0ZVRvKEF4KSxlLm5vcm1hbGl6ZSgpKTtsZXQgbj1lLmF1dGhvcml0eSgpOy86Ly50ZXN0KG4pfHwobj1gJHtufToke2Uuc2NoZW1lKCk9PT0iaHR0cHMiPyI0NDMiOiI4MCJ9YCk7bGV0IG89Q2lbbl07cmV0dXJuIGgobyl8fChDaVtuXT0wKSxufTtUbi5yZXF1ZXN0PWZ1bmN0aW9uKHQpe2lmKHkudHlwZU9mLm9iamVjdCgicmVxdWVzdCIsdCkseS50eXBlT2Yuc3RyaW5nKCJyZXF1ZXN0LnVybCIsdC51cmwpLHkudHlwZU9mLmZ1bmMoInJlcXVlc3QucmVxdWVzdEZ1bmN0aW9uIix0LnJlcXVlc3RGdW5jdGlvbiksc3AodC51cmwpfHxpcCh0LnVybCkpcmV0dXJuIHVwLnJhaXNlRXZlbnQoKSx0LnN0YXRlPUNuLlJFQ0VJVkVELHQucmVxdWVzdEZ1bmN0aW9uKCk7aWYoKytqZS5udW1iZXJPZkF0dGVtcHRlZFJlcXVlc3RzLGgodC5zZXJ2ZXJLZXkpfHwodC5zZXJ2ZXJLZXk9VG4uZ2V0U2VydmVyS2V5KHQudXJsKSksVG4udGhyb3R0bGVSZXF1ZXN0cyYmdC50aHJvdHRsZUJ5U2VydmVyJiYhVG4uc2VydmVySGFzT3BlblNsb3RzKHQuc2VydmVyS2V5KSlyZXR1cm47aWYoIVRuLnRocm90dGxlUmVxdWVzdHN8fCF0LnRocm90dGxlKXJldHVybiBUQSh0KTtpZihlaS5sZW5ndGg+PVRuLm1heGltdW1SZXF1ZXN0cylyZXR1cm47QUEodCk7bGV0IGU9VG8uaW5zZXJ0KHQpO2lmKGgoZSkpe2lmKGU9PT10KXJldHVybjtxcyhlKX1yZXR1cm4gYkEodCl9O1RuLmNsZWFyRm9yU3BlY3M9ZnVuY3Rpb24oKXtmb3IoO1RvLmxlbmd0aD4wOyl7bGV0IGU9VG8ucG9wKCk7cXMoZSl9bGV0IHQ9ZWkubGVuZ3RoO2ZvcihsZXQgZT0wO2U8dDsrK2UpcXMoZWlbZV0pO2VpLmxlbmd0aD0wLENpPXt9LGplLm51bWJlck9mQXR0ZW1wdGVkUmVxdWVzdHM9MCxqZS5udW1iZXJPZkFjdGl2ZVJlcXVlc3RzPTAsamUubnVtYmVyT2ZDYW5jZWxsZWRSZXF1ZXN0cz0wLGplLm51bWJlck9mQ2FuY2VsbGVkQWN0aXZlUmVxdWVzdHM9MCxqZS5udW1iZXJPZkZhaWxlZFJlcXVlc3RzPTAsamUubnVtYmVyT2ZBY3RpdmVSZXF1ZXN0c0V2ZXI9MCxqZS5sYXN0TnVtYmVyT2ZBY3RpdmVSZXF1ZXN0cz0wfTtUbi5udW1iZXJPZkFjdGl2ZVJlcXVlc3RzQnlTZXJ2ZXI9ZnVuY3Rpb24odCl7cmV0dXJuIENpW3RdfTtUbi5yZXF1ZXN0SGVhcD1UbztscD1Ubn0pO2Z1bmN0aW9uIE94KHQpe2xldCBlPW5ldyBPQS5kZWZhdWx0KHQpO2Uubm9ybWFsaXplKCk7bGV0IG49ZS5hdXRob3JpdHkoKTtpZihuLmxlbmd0aCE9PTApe2lmKGUuYXV0aG9yaXR5KG4pLG4uaW5kZXhPZigiQCIpIT09LTEmJihuPW4uc3BsaXQoIkAiKVsxXSksbi5pbmRleE9mKCI6Iik9PT0tMSl7bGV0IG89ZS5zY2hlbWUoKTtpZihvLmxlbmd0aD09PTAmJihvPXdpbmRvdy5sb2NhdGlvbi5wcm90b2NvbCxvPW8uc3Vic3RyaW5nKDAsby5sZW5ndGgtMSkpLG89PT0iaHR0cCIpbis9Ijo4MCI7ZWxzZSBpZihvPT09Imh0dHBzIiluKz0iOjQ0MyI7ZWxzZSByZXR1cm59cmV0dXJuIG59fXZhciBPQSxwZixaYyxxbSxFQT1aKCgpPT57T0E9ZHIoenMoKSwxKTtmdCgpO0h0KCk7cGY9e30sWmM9e307cGYuYWRkPWZ1bmN0aW9uKHQsZSl7aWYoIWgodCkpdGhyb3cgbmV3IEIoImhvc3QgaXMgcmVxdWlyZWQuIik7aWYoIWgoZSl8fGU8PTApdGhyb3cgbmV3IEIoInBvcnQgaXMgcmVxdWlyZWQgdG8gYmUgZ3JlYXRlciB0aGFuIDAuIik7bGV0IG49YCR7dC50b0xvd2VyQ2FzZSgpfToke2V9YDtoKFpjW25dKXx8KFpjW25dPSEwKX07cGYucmVtb3ZlPWZ1bmN0aW9uKHQsZSl7aWYoIWgodCkpdGhyb3cgbmV3IEIoImhvc3QgaXMgcmVxdWlyZWQuIik7aWYoIWgoZSl8fGU8PTApdGhyb3cgbmV3IEIoInBvcnQgaXMgcmVxdWlyZWQgdG8gYmUgZ3JlYXRlciB0aGFuIDAuIik7bGV0IG49YCR7dC50b0xvd2VyQ2FzZSgpfToke2V9YDtoKFpjW25dKSYmZGVsZXRlIFpjW25dfTtwZi5jb250YWlucz1mdW5jdGlvbih0KXtpZighaCh0KSl0aHJvdyBuZXcgQigidXJsIGlzIHJlcXVpcmVkLiIpO2xldCBlPU94KHQpO3JldHVybiEhKGgoZSkmJmgoWmNbZV0pKX07cGYuY2xlYXI9ZnVuY3Rpb24oKXtaYz17fX07cW09cGZ9KTtmdW5jdGlvbiBrdCh0KXt0PXgodCx4LkVNUFRZX09CSkVDVCksdHlwZW9mIHQ9PSJzdHJpbmciJiYodD17dXJsOnR9KSx5LnR5cGVPZi5zdHJpbmcoIm9wdGlvbnMudXJsIix0LnVybCksdGhpcy5fdXJsPXZvaWQgMCx0aGlzLl90ZW1wbGF0ZVZhbHVlcz1uaSh0LnRlbXBsYXRlVmFsdWVzLHt9KSx0aGlzLl9xdWVyeVBhcmFtZXRlcnM9bmkodC5xdWVyeVBhcmFtZXRlcnMse30pLHRoaXMuaGVhZGVycz1uaSh0LmhlYWRlcnMse30pLHRoaXMucmVxdWVzdD14KHQucmVxdWVzdCxuZXcgZkEpLHRoaXMucHJveHk9dC5wcm94eSx0aGlzLnJldHJ5Q2FsbGJhY2s9dC5yZXRyeUNhbGxiYWNrLHRoaXMucmV0cnlBdHRlbXB0cz14KHQucmV0cnlBdHRlbXB0cywwKSx0aGlzLl9yZXRyeUNvdW50PTAseCh0LnBhcnNlVXJsLCEwKT90aGlzLnBhcnNlVXJsKHQudXJsLCEwLCEwKTp0aGlzLl91cmw9dC51cmwsdGhpcy5fY3JlZGl0cz10LmNyZWRpdHN9ZnVuY3Rpb24gbmkodCxlKXtyZXR1cm4gaCh0KT9ZYyh0KTplfWZ1bmN0aW9uIEV4KHQpe3JldHVybiB0Lmxlbmd0aD09PTA/e306dC5pbmRleE9mKCI9Iik9PT0tMT97W3RdOnZvaWQgMH06aUEodCl9ZnVuY3Rpb24gZHAodCxlLG4pe2lmKCFuKXJldHVybiBfcih0LGUpO2xldCBvPVljKHQsITApO2ZvcihsZXQgciBpbiBlKWlmKGUuaGFzT3duUHJvcGVydHkocikpe2xldCBpPW9bcl0scz1lW3JdO2goaSk/KEFycmF5LmlzQXJyYXkoaSl8fChpPW9bcl09W2ldKSxvW3JdPWkuY29uY2F0KHMpKTpvW3JdPUFycmF5LmlzQXJyYXkocyk/cy5zbGljZSgpOnN9cmV0dXJuIG99ZnVuY3Rpb24gUngodCl7bGV0IGU9T2JqZWN0LmtleXModCk7cmV0dXJuIGUubGVuZ3RoPT09MD8iIjplLmxlbmd0aD09PTEmJiFoKHRbZVswXV0pP2A/JHtlWzBdfWA6YD8ke29BKHQpfWB9ZnVuY3Rpb24gS20odCl7bGV0IGU9dC5yZXNvdXJjZSxuPXQuZmxpcFksbz10LnNraXBDb2xvclNwYWNlQ29udmVyc2lvbixyPXQucHJlZmVySW1hZ2VCaXRtYXAsaT1lLnJlcXVlc3Q7aS51cmw9ZS51cmwsaS5yZXF1ZXN0RnVuY3Rpb249ZnVuY3Rpb24oKXtsZXQgZj0hMTshZS5pc0RhdGFVcmkmJiFlLmlzQmxvYlVyaSYmKGY9ZS5pc0Nyb3NzT3JpZ2luVXJsKTtsZXQgdT1qcygpO3JldHVybiBrdC5fSW1wbGVtZW50YXRpb25zLmNyZWF0ZUltYWdlKGksZix1LG4sbyxyKSx1LnByb21pc2V9O2xldCBzPWxwLnJlcXVlc3QoaSk7aWYoaChzKSlyZXR1cm4gcy5jYXRjaChmdW5jdGlvbihmKXtyZXR1cm4gaS5zdGF0ZSE9PUNuLkZBSUxFRD9Qcm9taXNlLnJlamVjdChmKTplLnJldHJ5T25FcnJvcihmKS50aGVuKGZ1bmN0aW9uKHUpe3JldHVybiB1PyhpLnN0YXRlPUNuLlVOSVNTVUVELGkuZGVmZXJyZWQ9dm9pZCAwLEttKHtyZXNvdXJjZTplLGZsaXBZOm4sc2tpcENvbG9yU3BhY2VDb252ZXJzaW9uOm8scHJlZmVySW1hZ2VCaXRtYXA6cn0pKTpQcm9taXNlLnJlamVjdChmKX0pfSl9ZnVuY3Rpb24geEEodCxlLG4pe2xldCBvPXt9O29bZV09bix0LnNldFF1ZXJ5UGFyYW1ldGVycyhvKTtsZXQgcj10LnJlcXVlc3QsaT10LnVybDtyLnVybD1pLHIucmVxdWVzdEZ1bmN0aW9uPWZ1bmN0aW9uKCl7bGV0IGY9anMoKTtyZXR1cm4gd2luZG93W25dPWZ1bmN0aW9uKHUpe2YucmVzb2x2ZSh1KTt0cnl7ZGVsZXRlIHdpbmRvd1tuXX1jYXRjaHt3aW5kb3dbbl09dm9pZCAwfX0sa3QuX0ltcGxlbWVudGF0aW9ucy5sb2FkQW5kRXhlY3V0ZVNjcmlwdChpLG4sZiksZi5wcm9taXNlfTtsZXQgcz1scC5yZXF1ZXN0KHIpO2lmKGgocykpcmV0dXJuIHMuY2F0Y2goZnVuY3Rpb24oZil7cmV0dXJuIHIuc3RhdGUhPT1Dbi5GQUlMRUQ/UHJvbWlzZS5yZWplY3QoZik6dC5yZXRyeU9uRXJyb3IoZikudGhlbihmdW5jdGlvbih1KXtyZXR1cm4gdT8oci5zdGF0ZT1Dbi5VTklTU1VFRCxyLmRlZmVycmVkPXZvaWQgMCx4QSh0LGUsbikpOlByb21pc2UucmVqZWN0KGYpfSl9KX1mdW5jdGlvbiBXbSh0KXtpZih0LnN0YXRlPT09Q24uSVNTVUVEfHx0LnN0YXRlPT09Q24uQUNUSVZFKXRocm93IG5ldyBBZSgiVGhlIFJlc291cmNlIGlzIGFscmVhZHkgYmVpbmcgZmV0Y2hlZC4iKTt0LnN0YXRlPUNuLlVOSVNTVUVELHQuZGVmZXJyZWQ9dm9pZCAwfWZ1bmN0aW9uIHBwKHQsZSl7bGV0IG49ZGVjb2RlVVJJQ29tcG9uZW50KGUpO3JldHVybiB0P2F0b2Iobik6bn1mdW5jdGlvbiBSQSh0LGUpe2xldCBuPXBwKHQsZSksbz1uZXcgQXJyYXlCdWZmZXIobi5sZW5ndGgpLHI9bmV3IFVpbnQ4QXJyYXkobyk7Zm9yKGxldCBpPTA7aTxuLmxlbmd0aDtpKyspcltpXT1uLmNoYXJDb2RlQXQoaSk7cmV0dXJuIG99ZnVuY3Rpb24gQ3godCxlKXtlPXgoZSwiIik7bGV0IG49dFsxXSxvPSEhdFsyXSxyPXRbM10saSxzO3N3aXRjaChlKXtjYXNlIiI6Y2FzZSJ0ZXh0IjpyZXR1cm4gcHAobyxyKTtjYXNlImFycmF5YnVmZmVyIjpyZXR1cm4gUkEobyxyKTtjYXNlImJsb2IiOnJldHVybiBpPVJBKG8sciksbmV3IEJsb2IoW2ldLHt0eXBlOm59KTtjYXNlImRvY3VtZW50IjpyZXR1cm4gcz1uZXcgRE9NUGFyc2VyLHMucGFyc2VGcm9tU3RyaW5nKHBwKG8sciksbik7Y2FzZSJqc29uIjpyZXR1cm4gSlNPTi5wYXJzZShwcChvLHIpKTtkZWZhdWx0OnRocm93IG5ldyBCKGBVbmhhbmRsZWQgcmVzcG9uc2VUeXBlOiAke2V9YCl9fWZ1bmN0aW9uIHh4KHQsZSxuLG8scixpLHMpe2ZldGNoKHQse21ldGhvZDpuLGhlYWRlcnM6cn0pLnRoZW4oYXN5bmMgZj0+e2lmKCFmLm9rKXtsZXQgdT17fTtmLmhlYWRlcnMuZm9yRWFjaCgoYyxsKT0+e3VbbF09Y30pLGkucmVqZWN0KG5ldyB1ZihmLnN0YXR1cyxmLHUpKTtyZXR1cm59c3dpdGNoKGUpe2Nhc2UidGV4dCI6aS5yZXNvbHZlKGYudGV4dCgpKTticmVhaztjYXNlImpzb24iOmkucmVzb2x2ZShmLmpzb24oKSk7YnJlYWs7ZGVmYXVsdDppLnJlc29sdmUobmV3IFVpbnQ4QXJyYXkoYXdhaXQgZi5hcnJheUJ1ZmZlcigpKS5idWZmZXIpO2JyZWFrfX0pLmNhdGNoKCgpPT57aS5yZWplY3QobmV3IHVmKX0pfXZhciBTQSxDQSxRYyxTeCxQeCxvaSxkZj1aKCgpPT57U0E9ZHIoenMoKSwxKTtrMSgpO1h0KCk7ejEoKTtycCgpO0l0KCk7VW0oKTtmdCgpO0h0KCk7a20oKTtXMSgpOyQxKCk7UTEoKTt6bSgpO3RBKCk7am0oKTtuQSgpO1d0KCk7ckEoKTtzQSgpO3VBKCk7bUEoKTt3QSgpO2NwKCk7SnIoKTtFQSgpO0NBPWZ1bmN0aW9uKCl7dHJ5e2xldCB0PW5ldyBYTUxIdHRwUmVxdWVzdDtyZXR1cm4gdC5vcGVuKCJHRVQiLCIjIiwhMCksdC5yZXNwb25zZVR5cGU9ImJsb2IiLHQucmVzcG9uc2VUeXBlPT09ImJsb2IifWNhdGNoe3JldHVybiExfX0oKTtrdC5jcmVhdGVJZk5lZWRlZD1mdW5jdGlvbih0KXtyZXR1cm4gdCBpbnN0YW5jZW9mIGt0P3QuZ2V0RGVyaXZlZFJlc291cmNlKHtyZXF1ZXN0OnQucmVxdWVzdH0pOnR5cGVvZiB0IT0ic3RyaW5nIj90Om5ldyBrdCh7dXJsOnR9KX07a3Quc3VwcG9ydHNJbWFnZUJpdG1hcE9wdGlvbnM9ZnVuY3Rpb24oKXtyZXR1cm4gaChRYyk/UWM6dHlwZW9mIGNyZWF0ZUltYWdlQml0bWFwIT0iZnVuY3Rpb24iPyhRYz1Qcm9taXNlLnJlc29sdmUoITEpLFFjKTooUWM9a3QuZmV0Y2hCbG9iKHt1cmw6ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQUVBQUFBQkNBSUFBQUNRZDFQZUFBQUFCR2RCVFVFQUFFNGczckVpRGdBQUFDQmpTRkpOQUFCNkpnQUFnSVFBQVBvQUFBQ0E2QUFBZFRBQUFPcGdBQUE2bUFBQUYzQ2N1bEU4QUFBQURFbEVRVlFJMTJOZzZHQUFBQUVVQUluZ0UzWmlBQUFBQUVsRlRrU3VRbUNDIn0pLnRoZW4oZnVuY3Rpb24oZSl7bGV0IG49e2ltYWdlT3JpZW50YXRpb246ImZsaXBZIixwcmVtdWx0aXBseUFscGhhOiJub25lIixjb2xvclNwYWNlQ29udmVyc2lvbjoibm9uZSJ9O3JldHVybiBQcm9taXNlLmFsbChbY3JlYXRlSW1hZ2VCaXRtYXAoZSxuKSxjcmVhdGVJbWFnZUJpdG1hcChlKV0pfSkudGhlbihmdW5jdGlvbihlKXtsZXQgbj1HbShlWzBdKSxvPUdtKGVbMV0pO3JldHVybiBuWzFdIT09b1sxXX0pLmNhdGNoKGZ1bmN0aW9uKCl7cmV0dXJuITF9KSxRYyl9O09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGt0LHtpc0Jsb2JTdXBwb3J0ZWQ6e2dldDpmdW5jdGlvbigpe3JldHVybiBDQX19fSk7T2JqZWN0LmRlZmluZVByb3BlcnRpZXMoa3QucHJvdG90eXBlLHtxdWVyeVBhcmFtZXRlcnM6e2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9xdWVyeVBhcmFtZXRlcnN9fSx0ZW1wbGF0ZVZhbHVlczp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3RlbXBsYXRlVmFsdWVzfX0sdXJsOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRVcmxDb21wb25lbnQoITAsITApfSxzZXQ6ZnVuY3Rpb24odCl7dGhpcy5wYXJzZVVybCh0LCExLCExKX19LGV4dGVuc2lvbjp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIFkxKHRoaXMuX3VybCl9fSxpc0RhdGFVcmk6e2dldDpmdW5jdGlvbigpe3JldHVybiBzcCh0aGlzLl91cmwpfX0saXNCbG9iVXJpOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gaXAodGhpcy5fdXJsKX19LGlzQ3Jvc3NPcmlnaW5Vcmw6e2dldDpmdW5jdGlvbigpe3JldHVybiBKMSh0aGlzLl91cmwpfX0saGFzSGVhZGVyczp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIE9iamVjdC5rZXlzKHRoaXMuaGVhZGVycykubGVuZ3RoPjB9fSxjcmVkaXRzOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fY3JlZGl0c319fSk7a3QucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0VXJsQ29tcG9uZW50KCEwLCEwKX07a3QucHJvdG90eXBlLnBhcnNlVXJsPWZ1bmN0aW9uKHQsZSxuLG8pe2xldCByPW5ldyBTQS5kZWZhdWx0KHQpLGk9RXgoci5xdWVyeSgpKTt0aGlzLl9xdWVyeVBhcmFtZXRlcnM9ZT9kcChpLHRoaXMucXVlcnlQYXJhbWV0ZXJzLG4pOmksci5zZWFyY2goIiIpLHIuZnJhZ21lbnQoIiIpLGgobykmJnIuc2NoZW1lKCk9PT0iIiYmKHI9ci5hYnNvbHV0ZVRvKGZmKG8pKSksdGhpcy5fdXJsPXIudG9TdHJpbmcoKX07a3QucHJvdG90eXBlLmdldFVybENvbXBvbmVudD1mdW5jdGlvbih0LGUpe2lmKHRoaXMuaXNEYXRhVXJpKXJldHVybiB0aGlzLl91cmw7bGV0IG49dGhpcy5fdXJsO3QmJihuPWAke259JHtSeCh0aGlzLnF1ZXJ5UGFyYW1ldGVycyl9YCksbj1uLnJlcGxhY2UoLyU3Qi9nLCJ7IikucmVwbGFjZSgvJTdEL2csIn0iKTtsZXQgbz10aGlzLl90ZW1wbGF0ZVZhbHVlcztyZXR1cm4gT2JqZWN0LmtleXMobykubGVuZ3RoPjAmJihuPW4ucmVwbGFjZSgveyguKj8pfS9nLGZ1bmN0aW9uKHIsaSl7bGV0IHM9b1tpXTtyZXR1cm4gaChzKT9lbmNvZGVVUklDb21wb25lbnQocyk6cn0pKSxlJiZoKHRoaXMucHJveHkpJiYobj10aGlzLnByb3h5LmdldFVSTChuKSksbn07a3QucHJvdG90eXBlLnNldFF1ZXJ5UGFyYW1ldGVycz1mdW5jdGlvbih0LGUpe2U/dGhpcy5fcXVlcnlQYXJhbWV0ZXJzPWRwKHRoaXMuX3F1ZXJ5UGFyYW1ldGVycyx0LCExKTp0aGlzLl9xdWVyeVBhcmFtZXRlcnM9ZHAodCx0aGlzLl9xdWVyeVBhcmFtZXRlcnMsITEpfTtrdC5wcm90b3R5cGUuYXBwZW5kUXVlcnlQYXJhbWV0ZXJzPWZ1bmN0aW9uKHQpe3RoaXMuX3F1ZXJ5UGFyYW1ldGVycz1kcCh0LHRoaXMuX3F1ZXJ5UGFyYW1ldGVycywhMCl9O2t0LnByb3RvdHlwZS5zZXRUZW1wbGF0ZVZhbHVlcz1mdW5jdGlvbih0LGUpe2U/dGhpcy5fdGVtcGxhdGVWYWx1ZXM9X3IodGhpcy5fdGVtcGxhdGVWYWx1ZXMsdCk6dGhpcy5fdGVtcGxhdGVWYWx1ZXM9X3IodCx0aGlzLl90ZW1wbGF0ZVZhbHVlcyl9O2t0LnByb3RvdHlwZS5nZXREZXJpdmVkUmVzb3VyY2U9ZnVuY3Rpb24odCl7bGV0IGU9dGhpcy5jbG9uZSgpO2lmKGUuX3JldHJ5Q291bnQ9MCxoKHQudXJsKSl7bGV0IG49eCh0LnByZXNlcnZlUXVlcnlQYXJhbWV0ZXJzLCExKTtlLnBhcnNlVXJsKHQudXJsLCEwLG4sdGhpcy5fdXJsKX1yZXR1cm4gaCh0LnF1ZXJ5UGFyYW1ldGVycykmJihlLl9xdWVyeVBhcmFtZXRlcnM9X3IodC5xdWVyeVBhcmFtZXRlcnMsZS5xdWVyeVBhcmFtZXRlcnMpKSxoKHQudGVtcGxhdGVWYWx1ZXMpJiYoZS5fdGVtcGxhdGVWYWx1ZXM9X3IodC50ZW1wbGF0ZVZhbHVlcyxlLnRlbXBsYXRlVmFsdWVzKSksaCh0LmhlYWRlcnMpJiYoZS5oZWFkZXJzPV9yKHQuaGVhZGVycyxlLmhlYWRlcnMpKSxoKHQucHJveHkpJiYoZS5wcm94eT10LnByb3h5KSxoKHQucmVxdWVzdCkmJihlLnJlcXVlc3Q9dC5yZXF1ZXN0KSxoKHQucmV0cnlDYWxsYmFjaykmJihlLnJldHJ5Q2FsbGJhY2s9dC5yZXRyeUNhbGxiYWNrKSxoKHQucmV0cnlBdHRlbXB0cykmJihlLnJldHJ5QXR0ZW1wdHM9dC5yZXRyeUF0dGVtcHRzKSxlfTtrdC5wcm90b3R5cGUucmV0cnlPbkVycm9yPWZ1bmN0aW9uKHQpe2xldCBlPXRoaXMucmV0cnlDYWxsYmFjaztpZih0eXBlb2YgZSE9ImZ1bmN0aW9uInx8dGhpcy5fcmV0cnlDb3VudD49dGhpcy5yZXRyeUF0dGVtcHRzKXJldHVybiBQcm9taXNlLnJlc29sdmUoITEpO2xldCBuPXRoaXM7cmV0dXJuIFByb21pc2UucmVzb2x2ZShlKHRoaXMsdCkpLnRoZW4oZnVuY3Rpb24obyl7cmV0dXJuKytuLl9yZXRyeUNvdW50LG99KX07a3QucHJvdG90eXBlLmNsb25lPWZ1bmN0aW9uKHQpe3JldHVybiBoKHQpPyh0Ll91cmw9dGhpcy5fdXJsLHQuX3F1ZXJ5UGFyYW1ldGVycz1ZYyh0aGlzLl9xdWVyeVBhcmFtZXRlcnMpLHQuX3RlbXBsYXRlVmFsdWVzPVljKHRoaXMuX3RlbXBsYXRlVmFsdWVzKSx0LmhlYWRlcnM9WWModGhpcy5oZWFkZXJzKSx0LnByb3h5PXRoaXMucHJveHksdC5yZXRyeUNhbGxiYWNrPXRoaXMucmV0cnlDYWxsYmFjayx0LnJldHJ5QXR0ZW1wdHM9dGhpcy5yZXRyeUF0dGVtcHRzLHQuX3JldHJ5Q291bnQ9MCx0LnJlcXVlc3Q9dGhpcy5yZXF1ZXN0LmNsb25lKCksdCk6bmV3IGt0KHt1cmw6dGhpcy5fdXJsLHF1ZXJ5UGFyYW1ldGVyczp0aGlzLnF1ZXJ5UGFyYW1ldGVycyx0ZW1wbGF0ZVZhbHVlczp0aGlzLnRlbXBsYXRlVmFsdWVzLGhlYWRlcnM6dGhpcy5oZWFkZXJzLHByb3h5OnRoaXMucHJveHkscmV0cnlDYWxsYmFjazp0aGlzLnJldHJ5Q2FsbGJhY2sscmV0cnlBdHRlbXB0czp0aGlzLnJldHJ5QXR0ZW1wdHMscmVxdWVzdDp0aGlzLnJlcXVlc3QuY2xvbmUoKSxwYXJzZVVybDohMSxjcmVkaXRzOmgodGhpcy5jcmVkaXRzKT90aGlzLmNyZWRpdHMuc2xpY2UoKTp2b2lkIDB9KX07a3QucHJvdG90eXBlLmdldEJhc2VVcmk9ZnVuY3Rpb24odCl7cmV0dXJuIEsxKHRoaXMuZ2V0VXJsQ29tcG9uZW50KHQpLHQpfTtrdC5wcm90b3R5cGUuYXBwZW5kRm9yd2FyZFNsYXNoPWZ1bmN0aW9uKCl7dGhpcy5fdXJsPVYxKHRoaXMuX3VybCl9O2t0LnByb3RvdHlwZS5mZXRjaEFycmF5QnVmZmVyPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZmV0Y2goe3Jlc3BvbnNlVHlwZToiYXJyYXlidWZmZXIifSl9O2t0LmZldGNoQXJyYXlCdWZmZXI9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBrdCh0KS5mZXRjaEFycmF5QnVmZmVyKCl9O2t0LnByb3RvdHlwZS5mZXRjaEJsb2I9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5mZXRjaCh7cmVzcG9uc2VUeXBlOiJibG9iIn0pfTtrdC5mZXRjaEJsb2I9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBrdCh0KS5mZXRjaEJsb2IoKX07a3QucHJvdG90eXBlLmZldGNoSW1hZ2U9ZnVuY3Rpb24odCl7dD14KHQseC5FTVBUWV9PQkpFQ1QpO2xldCBlPXgodC5wcmVmZXJJbWFnZUJpdG1hcCwhMSksbj14KHQucHJlZmVyQmxvYiwhMSksbz14KHQuZmxpcFksITEpLHI9eCh0LnNraXBDb2xvclNwYWNlQ29udmVyc2lvbiwhMSk7aWYoV20odGhpcy5yZXF1ZXN0KSwhQ0F8fHRoaXMuaXNEYXRhVXJpfHx0aGlzLmlzQmxvYlVyaXx8IXRoaXMuaGFzSGVhZGVycyYmIW4pcmV0dXJuIEttKHtyZXNvdXJjZTp0aGlzLGZsaXBZOm8sc2tpcENvbG9yU3BhY2VDb252ZXJzaW9uOnIscHJlZmVySW1hZ2VCaXRtYXA6ZX0pO2xldCBpPXRoaXMuZmV0Y2hCbG9iKCk7aWYoIWgoaSkpcmV0dXJuO2xldCBzLGYsdSxjO3JldHVybiBrdC5zdXBwb3J0c0ltYWdlQml0bWFwT3B0aW9ucygpLnRoZW4oZnVuY3Rpb24obCl7cmV0dXJuIHM9bCxmPXMmJmUsaX0pLnRoZW4oZnVuY3Rpb24obCl7aWYoIWgobCkpcmV0dXJuO2lmKGM9bCxmKXJldHVybiBrdC5jcmVhdGVJbWFnZUJpdG1hcEZyb21CbG9iKGwse2ZsaXBZOm8scHJlbXVsdGlwbHlBbHBoYTohMSxza2lwQ29sb3JTcGFjZUNvbnZlcnNpb246cn0pO2xldCBwPXdpbmRvdy5VUkwuY3JlYXRlT2JqZWN0VVJMKGwpO3JldHVybiB1PW5ldyBrdCh7dXJsOnB9KSxLbSh7cmVzb3VyY2U6dSxmbGlwWTpvLHNraXBDb2xvclNwYWNlQ29udmVyc2lvbjpyLHByZWZlckltYWdlQml0bWFwOiExfSl9KS50aGVuKGZ1bmN0aW9uKGwpe2lmKGgobCkpcmV0dXJuIGwuYmxvYj1jLGZ8fHdpbmRvdy5VUkwucmV2b2tlT2JqZWN0VVJMKHUudXJsKSxsfSkuY2F0Y2goZnVuY3Rpb24obCl7cmV0dXJuIGgodSkmJndpbmRvdy5VUkwucmV2b2tlT2JqZWN0VVJMKHUudXJsKSxsLmJsb2I9YyxQcm9taXNlLnJlamVjdChsKX0pfTtrdC5mZXRjaEltYWdlPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcga3QodCkuZmV0Y2hJbWFnZSh7ZmxpcFk6dC5mbGlwWSxza2lwQ29sb3JTcGFjZUNvbnZlcnNpb246dC5za2lwQ29sb3JTcGFjZUNvbnZlcnNpb24scHJlZmVyQmxvYjp0LnByZWZlckJsb2IscHJlZmVySW1hZ2VCaXRtYXA6dC5wcmVmZXJJbWFnZUJpdG1hcH0pfTtrdC5wcm90b3R5cGUuZmV0Y2hUZXh0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZmV0Y2goe3Jlc3BvbnNlVHlwZToidGV4dCJ9KX07a3QuZmV0Y2hUZXh0PWZ1bmN0aW9uKHQpe3JldHVybiBuZXcga3QodCkuZmV0Y2hUZXh0KCl9O2t0LnByb3RvdHlwZS5mZXRjaEpzb249ZnVuY3Rpb24oKXtsZXQgdD10aGlzLmZldGNoKHtyZXNwb25zZVR5cGU6InRleHQiLGhlYWRlcnM6e0FjY2VwdDoiYXBwbGljYXRpb24vanNvbiwqLyo7cT0wLjAxIn19KTtpZihoKHQpKXJldHVybiB0LnRoZW4oZnVuY3Rpb24oZSl7aWYoaChlKSlyZXR1cm4gSlNPTi5wYXJzZShlKX0pfTtrdC5mZXRjaEpzb249ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBrdCh0KS5mZXRjaEpzb24oKX07a3QucHJvdG90eXBlLmZldGNoWE1MPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZmV0Y2goe3Jlc3BvbnNlVHlwZToiZG9jdW1lbnQiLG92ZXJyaWRlTWltZVR5cGU6InRleHQveG1sIn0pfTtrdC5mZXRjaFhNTD1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGt0KHQpLmZldGNoWE1MKCl9O2t0LnByb3RvdHlwZS5mZXRjaEpzb25wPWZ1bmN0aW9uKHQpe3Q9eCh0LCJjYWxsYmFjayIpLFdtKHRoaXMucmVxdWVzdCk7bGV0IGU7ZG8gZT1gbG9hZEpzb25wJHtNLm5leHRSYW5kb21OdW1iZXIoKS50b1N0cmluZygpLnN1YnN0cmluZygyLDgpfWA7d2hpbGUoaCh3aW5kb3dbZV0pKTtyZXR1cm4geEEodGhpcyx0LGUpfTtrdC5mZXRjaEpzb25wPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcga3QodCkuZmV0Y2hKc29ucCh0LmNhbGxiYWNrUGFyYW1ldGVyTmFtZSl9O2t0LnByb3RvdHlwZS5fbWFrZVJlcXVlc3Q9ZnVuY3Rpb24odCl7bGV0IGU9dGhpcztXbShlLnJlcXVlc3QpO2xldCBuPWUucmVxdWVzdCxvPWUudXJsO24udXJsPW8sbi5yZXF1ZXN0RnVuY3Rpb249ZnVuY3Rpb24oKXtsZXQgaT10LnJlc3BvbnNlVHlwZSxzPV9yKHQuaGVhZGVycyxlLmhlYWRlcnMpLGY9dC5vdmVycmlkZU1pbWVUeXBlLHU9dC5tZXRob2QsYz10LmRhdGEsbD1qcygpLHA9a3QuX0ltcGxlbWVudGF0aW9ucy5sb2FkV2l0aFhocihvLGksdSxjLHMsbCxmKTtyZXR1cm4gaChwKSYmaChwLmFib3J0KSYmKG4uY2FuY2VsRnVuY3Rpb249ZnVuY3Rpb24oKXtwLmFib3J0KCl9KSxsLnByb21pc2V9O2xldCByPWxwLnJlcXVlc3Qobik7aWYoaChyKSlyZXR1cm4gci50aGVuKGZ1bmN0aW9uKGkpe3JldHVybiBuLmNhbmNlbEZ1bmN0aW9uPXZvaWQgMCxpfSkuY2F0Y2goZnVuY3Rpb24oaSl7cmV0dXJuIG4uY2FuY2VsRnVuY3Rpb249dm9pZCAwLG4uc3RhdGUhPT1Dbi5GQUlMRUQ/UHJvbWlzZS5yZWplY3QoaSk6ZS5yZXRyeU9uRXJyb3IoaSkudGhlbihmdW5jdGlvbihzKXtyZXR1cm4gcz8obi5zdGF0ZT1Dbi5VTklTU1VFRCxuLmRlZmVycmVkPXZvaWQgMCxlLmZldGNoKHQpKTpQcm9taXNlLnJlamVjdChpKX0pfSl9O1N4PS9eZGF0YTooLio/KSg7YmFzZTY0KT8sKC4qKSQvO2t0LnByb3RvdHlwZS5mZXRjaD1mdW5jdGlvbih0KXtyZXR1cm4gdD1uaSh0LHt9KSx0Lm1ldGhvZD0iR0VUIix0aGlzLl9tYWtlUmVxdWVzdCh0KX07a3QuZmV0Y2g9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBrdCh0KS5mZXRjaCh7cmVzcG9uc2VUeXBlOnQucmVzcG9uc2VUeXBlLG92ZXJyaWRlTWltZVR5cGU6dC5vdmVycmlkZU1pbWVUeXBlfSl9O2t0LnByb3RvdHlwZS5kZWxldGU9ZnVuY3Rpb24odCl7cmV0dXJuIHQ9bmkodCx7fSksdC5tZXRob2Q9IkRFTEVURSIsdGhpcy5fbWFrZVJlcXVlc3QodCl9O2t0LmRlbGV0ZT1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGt0KHQpLmRlbGV0ZSh7cmVzcG9uc2VUeXBlOnQucmVzcG9uc2VUeXBlLG92ZXJyaWRlTWltZVR5cGU6dC5vdmVycmlkZU1pbWVUeXBlLGRhdGE6dC5kYXRhfSl9O2t0LnByb3RvdHlwZS5oZWFkPWZ1bmN0aW9uKHQpe3JldHVybiB0PW5pKHQse30pLHQubWV0aG9kPSJIRUFEIix0aGlzLl9tYWtlUmVxdWVzdCh0KX07a3QuaGVhZD1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGt0KHQpLmhlYWQoe3Jlc3BvbnNlVHlwZTp0LnJlc3BvbnNlVHlwZSxvdmVycmlkZU1pbWVUeXBlOnQub3ZlcnJpZGVNaW1lVHlwZX0pfTtrdC5wcm90b3R5cGUub3B0aW9ucz1mdW5jdGlvbih0KXtyZXR1cm4gdD1uaSh0LHt9KSx0Lm1ldGhvZD0iT1BUSU9OUyIsdGhpcy5fbWFrZVJlcXVlc3QodCl9O2t0Lm9wdGlvbnM9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBrdCh0KS5vcHRpb25zKHtyZXNwb25zZVR5cGU6dC5yZXNwb25zZVR5cGUsb3ZlcnJpZGVNaW1lVHlwZTp0Lm92ZXJyaWRlTWltZVR5cGV9KX07a3QucHJvdG90eXBlLnBvc3Q9ZnVuY3Rpb24odCxlKXtyZXR1cm4geS5kZWZpbmVkKCJkYXRhIix0KSxlPW5pKGUse30pLGUubWV0aG9kPSJQT1NUIixlLmRhdGE9dCx0aGlzLl9tYWtlUmVxdWVzdChlKX07a3QucG9zdD1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGt0KHQpLnBvc3QodC5kYXRhLHtyZXNwb25zZVR5cGU6dC5yZXNwb25zZVR5cGUsb3ZlcnJpZGVNaW1lVHlwZTp0Lm92ZXJyaWRlTWltZVR5cGV9KX07a3QucHJvdG90eXBlLnB1dD1mdW5jdGlvbih0LGUpe3JldHVybiB5LmRlZmluZWQoImRhdGEiLHQpLGU9bmkoZSx7fSksZS5tZXRob2Q9IlBVVCIsZS5kYXRhPXQsdGhpcy5fbWFrZVJlcXVlc3QoZSl9O2t0LnB1dD1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGt0KHQpLnB1dCh0LmRhdGEse3Jlc3BvbnNlVHlwZTp0LnJlc3BvbnNlVHlwZSxvdmVycmlkZU1pbWVUeXBlOnQub3ZlcnJpZGVNaW1lVHlwZX0pfTtrdC5wcm90b3R5cGUucGF0Y2g9ZnVuY3Rpb24odCxlKXtyZXR1cm4geS5kZWZpbmVkKCJkYXRhIix0KSxlPW5pKGUse30pLGUubWV0aG9kPSJQQVRDSCIsZS5kYXRhPXQsdGhpcy5fbWFrZVJlcXVlc3QoZSl9O2t0LnBhdGNoPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcga3QodCkucGF0Y2godC5kYXRhLHtyZXNwb25zZVR5cGU6dC5yZXNwb25zZVR5cGUsb3ZlcnJpZGVNaW1lVHlwZTp0Lm92ZXJyaWRlTWltZVR5cGV9KX07a3QuX0ltcGxlbWVudGF0aW9ucz17fTtrdC5fSW1wbGVtZW50YXRpb25zLmxvYWRJbWFnZUVsZW1lbnQ9ZnVuY3Rpb24odCxlLG4pe2xldCBvPW5ldyBJbWFnZTtvLm9ubG9hZD1mdW5jdGlvbigpe28ubmF0dXJhbFdpZHRoPT09MCYmby5uYXR1cmFsSGVpZ2h0PT09MCYmby53aWR0aD09PTAmJm8uaGVpZ2h0PT09MCYmKG8ud2lkdGg9MzAwLG8uaGVpZ2h0PTE1MCksbi5yZXNvbHZlKG8pfSxvLm9uZXJyb3I9ZnVuY3Rpb24ocil7bi5yZWplY3Qocil9LGUmJihxbS5jb250YWlucyh0KT9vLmNyb3NzT3JpZ2luPSJ1c2UtY3JlZGVudGlhbHMiOm8uY3Jvc3NPcmlnaW49IiIpLG8uc3JjPXR9O2t0Ll9JbXBsZW1lbnRhdGlvbnMuY3JlYXRlSW1hZ2U9ZnVuY3Rpb24odCxlLG4sbyxyLGkpe2xldCBzPXQudXJsO2t0LnN1cHBvcnRzSW1hZ2VCaXRtYXBPcHRpb25zKCkudGhlbihmdW5jdGlvbihmKXtpZighKGYmJmkpKXtrdC5fSW1wbGVtZW50YXRpb25zLmxvYWRJbWFnZUVsZW1lbnQocyxlLG4pO3JldHVybn1sZXQgdT0iYmxvYiIsYz0iR0VUIixsPWpzKCkscD1rdC5fSW1wbGVtZW50YXRpb25zLmxvYWRXaXRoWGhyKHMsdSxjLHZvaWQgMCx2b2lkIDAsbCx2b2lkIDAsdm9pZCAwLHZvaWQgMCk7cmV0dXJuIGgocCkmJmgocC5hYm9ydCkmJih0LmNhbmNlbEZ1bmN0aW9uPWZ1bmN0aW9uKCl7cC5hYm9ydCgpfSksbC5wcm9taXNlLnRoZW4oZnVuY3Rpb24oZCl7aWYoIWgoZCkpe24ucmVqZWN0KG5ldyBBZShgU3VjY2Vzc2Z1bGx5IHJldHJpZXZlZCAke3N9IGJ1dCBpdCBjb250YWluZWQgbm8gY29udGVudC5gKSk7cmV0dXJufXJldHVybiBrdC5jcmVhdGVJbWFnZUJpdG1hcEZyb21CbG9iKGQse2ZsaXBZOm8scHJlbXVsdGlwbHlBbHBoYTohMSxza2lwQ29sb3JTcGFjZUNvbnZlcnNpb246cn0pfSkudGhlbihmdW5jdGlvbihkKXtuLnJlc29sdmUoZCl9KX0pLmNhdGNoKGZ1bmN0aW9uKGYpe24ucmVqZWN0KGYpfSl9O2t0LmNyZWF0ZUltYWdlQml0bWFwRnJvbUJsb2I9ZnVuY3Rpb24odCxlKXtyZXR1cm4geS5kZWZpbmVkKCJvcHRpb25zIixlKSx5LnR5cGVPZi5ib29sKCJvcHRpb25zLmZsaXBZIixlLmZsaXBZKSx5LnR5cGVPZi5ib29sKCJvcHRpb25zLnByZW11bHRpcGx5QWxwaGEiLGUucHJlbXVsdGlwbHlBbHBoYSkseS50eXBlT2YuYm9vbCgib3B0aW9ucy5za2lwQ29sb3JTcGFjZUNvbnZlcnNpb24iLGUuc2tpcENvbG9yU3BhY2VDb252ZXJzaW9uKSxjcmVhdGVJbWFnZUJpdG1hcCh0LHtpbWFnZU9yaWVudGF0aW9uOmUuZmxpcFk/ImZsaXBZIjoibm9uZSIscHJlbXVsdGlwbHlBbHBoYTplLnByZW11bHRpcGx5QWxwaGE/InByZW11bHRpcGx5Ijoibm9uZSIsY29sb3JTcGFjZUNvbnZlcnNpb246ZS5za2lwQ29sb3JTcGFjZUNvbnZlcnNpb24/Im5vbmUiOiJkZWZhdWx0In0pfTtQeD10eXBlb2YgWE1MSHR0cFJlcXVlc3Q+InUiO2t0Ll9JbXBsZW1lbnRhdGlvbnMubG9hZFdpdGhYaHI9ZnVuY3Rpb24odCxlLG4sbyxyLGkscyl7bGV0IGY9U3guZXhlYyh0KTtpZihmIT09bnVsbCl7aS5yZXNvbHZlKEN4KGYsZSkpO3JldHVybn1pZihQeCl7eHgodCxlLG4sbyxyLGkscyk7cmV0dXJufWxldCB1PW5ldyBYTUxIdHRwUmVxdWVzdDtpZihxbS5jb250YWlucyh0KSYmKHUud2l0aENyZWRlbnRpYWxzPSEwKSx1Lm9wZW4obix0LCEwKSxoKHMpJiZoKHUub3ZlcnJpZGVNaW1lVHlwZSkmJnUub3ZlcnJpZGVNaW1lVHlwZShzKSxoKHIpKWZvcihsZXQgbCBpbiByKXIuaGFzT3duUHJvcGVydHkobCkmJnUuc2V0UmVxdWVzdEhlYWRlcihsLHJbbF0pO2goZSkmJih1LnJlc3BvbnNlVHlwZT1lKTtsZXQgYz0hMTtyZXR1cm4gdHlwZW9mIHQ9PSJzdHJpbmciJiYoYz10LmluZGV4T2YoImZpbGU6Ly8iKT09PTB8fHR5cGVvZiB3aW5kb3c8InUiJiZ3aW5kb3cubG9jYXRpb24ub3JpZ2luPT09ImZpbGU6Ly8iKSx1Lm9ubG9hZD1mdW5jdGlvbigpe2lmKCh1LnN0YXR1czwyMDB8fHUuc3RhdHVzPj0zMDApJiYhKGMmJnUuc3RhdHVzPT09MCkpe2kucmVqZWN0KG5ldyB1Zih1LnN0YXR1cyx1LnJlc3BvbnNlLHUuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKCkpKTtyZXR1cm59bGV0IGw9dS5yZXNwb25zZSxwPXUucmVzcG9uc2VUeXBlO2lmKG49PT0iSEVBRCJ8fG49PT0iT1BUSU9OUyIpe2xldCBtPXUuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKCkudHJpbSgpLnNwbGl0KC9bXHJcbl0rLyksXz17fTttLmZvckVhY2goZnVuY3Rpb24oZyl7bGV0IGI9Zy5zcGxpdCgiOiAiKSxUPWIuc2hpZnQoKTtfW1RdPWIuam9pbigiOiAiKX0pLGkucmVzb2x2ZShfKTtyZXR1cm59aWYodS5zdGF0dXM9PT0yMDQpaS5yZXNvbHZlKHZvaWQgMCk7ZWxzZSBpZihoKGwpJiYoIWgoZSl8fHA9PT1lKSlpLnJlc29sdmUobCk7ZWxzZSBpZihlPT09Impzb24iJiZ0eXBlb2YgbD09InN0cmluZyIpdHJ5e2kucmVzb2x2ZShKU09OLnBhcnNlKGwpKX1jYXRjaChkKXtpLnJlamVjdChkKX1lbHNlKHA9PT0iInx8cD09PSJkb2N1bWVudCIpJiZoKHUucmVzcG9uc2VYTUwpJiZ1LnJlc3BvbnNlWE1MLmhhc0NoaWxkTm9kZXMoKT9pLnJlc29sdmUodS5yZXNwb25zZVhNTCk6KHA9PT0iInx8cD09PSJ0ZXh0IikmJmgodS5yZXNwb25zZVRleHQpP2kucmVzb2x2ZSh1LnJlc3BvbnNlVGV4dCk6aS5yZWplY3QobmV3IEFlKCJJbnZhbGlkIFhNTEh0dHBSZXF1ZXN0IHJlc3BvbnNlIHR5cGUuIikpfSx1Lm9uZXJyb3I9ZnVuY3Rpb24obCl7aS5yZWplY3QobmV3IHVmKX0sdS5zZW5kKG8pLHV9O2t0Ll9JbXBsZW1lbnRhdGlvbnMubG9hZEFuZEV4ZWN1dGVTY3JpcHQ9ZnVuY3Rpb24odCxlLG4pe3JldHVybiBlQSh0LGUpLmNhdGNoKGZ1bmN0aW9uKG8pe24ucmVqZWN0KG8pfSl9O2t0Ll9EZWZhdWx0SW1wbGVtZW50YXRpb25zPXt9O2t0Ll9EZWZhdWx0SW1wbGVtZW50YXRpb25zLmNyZWF0ZUltYWdlPWt0Ll9JbXBsZW1lbnRhdGlvbnMuY3JlYXRlSW1hZ2U7a3QuX0RlZmF1bHRJbXBsZW1lbnRhdGlvbnMubG9hZFdpdGhYaHI9a3QuX0ltcGxlbWVudGF0aW9ucy5sb2FkV2l0aFhocjtrdC5fRGVmYXVsdEltcGxlbWVudGF0aW9ucy5sb2FkQW5kRXhlY3V0ZVNjcmlwdD1rdC5fSW1wbGVtZW50YXRpb25zLmxvYWRBbmRFeGVjdXRlU2NyaXB0O2t0LkRFRkFVTFQ9T2JqZWN0LmZyZWV6ZShuZXcga3Qoe3VybDp0eXBlb2YgZG9jdW1lbnQ+InUiPyIiOmRvY3VtZW50LmxvY2F0aW9uLmhyZWYuc3BsaXQoIj8iKVswXX0pKTtvaT1rdH0pO2Z1bmN0aW9uIGhmKHQpe3Q9eCh0LHguRU1QVFlfT0JKRUNUKSx0aGlzLl9kYXRlcz12b2lkIDAsdGhpcy5fc2FtcGxlcz12b2lkIDAsdGhpcy5fZGF0ZUNvbHVtbj0tMSx0aGlzLl94UG9sZVdhbmRlclJhZGlhbnNDb2x1bW49LTEsdGhpcy5feVBvbGVXYW5kZXJSYWRpYW5zQ29sdW1uPS0xLHRoaXMuX3V0MU1pbnVzVXRjU2Vjb25kc0NvbHVtbj0tMSx0aGlzLl94Q2VsZXN0aWFsUG9sZU9mZnNldFJhZGlhbnNDb2x1bW49LTEsdGhpcy5feUNlbGVzdGlhbFBvbGVPZmZzZXRSYWRpYW5zQ29sdW1uPS0xLHRoaXMuX3RhaU1pbnVzVXRjU2Vjb25kc0NvbHVtbj0tMSx0aGlzLl9jb2x1bW5Db3VudD0wLHRoaXMuX2xhc3RJbmRleD0tMSx0aGlzLl9hZGROZXdMZWFwU2Vjb25kcz14KHQuYWRkTmV3TGVhcFNlY29uZHMsITApLGgodC5kYXRhKT9QQSh0aGlzLHQuZGF0YSk6UEEodGhpcyx7Y29sdW1uTmFtZXM6WyJkYXRlSXNvODYwMSIsIm1vZGlmaWVkSnVsaWFuRGF0ZVV0YyIsInhQb2xlV2FuZGVyUmFkaWFucyIsInlQb2xlV2FuZGVyUmFkaWFucyIsInV0MU1pbnVzVXRjU2Vjb25kcyIsImxlbmd0aE9mRGF5Q29ycmVjdGlvblNlY29uZHMiLCJ4Q2VsZXN0aWFsUG9sZU9mZnNldFJhZGlhbnMiLCJ5Q2VsZXN0aWFsUG9sZU9mZnNldFJhZGlhbnMiLCJ0YWlNaW51c1V0Y1NlY29uZHMiXSxzYW1wbGVzOltdfSl9ZnVuY3Rpb24gTXgodCxlKXtyZXR1cm4ga24uY29tcGFyZSh0Lmp1bGlhbkRhdGUsZSl9ZnVuY3Rpb24gUEEodCxlKXtpZighaChlLmNvbHVtbk5hbWVzKSl0aHJvdyBuZXcgQWUoIkVycm9yIGluIGxvYWRlZCBFT1AgZGF0YTogVGhlIGNvbHVtbk5hbWVzIHByb3BlcnR5IGlzIHJlcXVpcmVkLiIpO2lmKCFoKGUuc2FtcGxlcykpdGhyb3cgbmV3IEFlKCJFcnJvciBpbiBsb2FkZWQgRU9QIGRhdGE6IFRoZSBzYW1wbGVzIHByb3BlcnR5IGlzIHJlcXVpcmVkLiIpO2xldCBuPWUuY29sdW1uTmFtZXMuaW5kZXhPZigibW9kaWZpZWRKdWxpYW5EYXRlVXRjIiksbz1lLmNvbHVtbk5hbWVzLmluZGV4T2YoInhQb2xlV2FuZGVyUmFkaWFucyIpLHI9ZS5jb2x1bW5OYW1lcy5pbmRleE9mKCJ5UG9sZVdhbmRlclJhZGlhbnMiKSxpPWUuY29sdW1uTmFtZXMuaW5kZXhPZigidXQxTWludXNVdGNTZWNvbmRzIikscz1lLmNvbHVtbk5hbWVzLmluZGV4T2YoInhDZWxlc3RpYWxQb2xlT2Zmc2V0UmFkaWFucyIpLGY9ZS5jb2x1bW5OYW1lcy5pbmRleE9mKCJ5Q2VsZXN0aWFsUG9sZU9mZnNldFJhZGlhbnMiKSx1PWUuY29sdW1uTmFtZXMuaW5kZXhPZigidGFpTWludXNVdGNTZWNvbmRzIik7aWYobjwwfHxvPDB8fHI8MHx8aTwwfHxzPDB8fGY8MHx8dTwwKXRocm93IG5ldyBBZSgiRXJyb3IgaW4gbG9hZGVkIEVPUCBkYXRhOiBUaGUgY29sdW1uTmFtZXMgcHJvcGVydHkgbXVzdCBpbmNsdWRlIG1vZGlmaWVkSnVsaWFuRGF0ZVV0YywgeFBvbGVXYW5kZXJSYWRpYW5zLCB5UG9sZVdhbmRlclJhZGlhbnMsIHV0MU1pbnVzVXRjU2Vjb25kcywgeENlbGVzdGlhbFBvbGVPZmZzZXRSYWRpYW5zLCB5Q2VsZXN0aWFsUG9sZU9mZnNldFJhZGlhbnMsIGFuZCB0YWlNaW51c1V0Y1NlY29uZHMgY29sdW1ucyIpO2xldCBjPXQuX3NhbXBsZXM9ZS5zYW1wbGVzLGw9dC5fZGF0ZXM9W107dC5fZGF0ZUNvbHVtbj1uLHQuX3hQb2xlV2FuZGVyUmFkaWFuc0NvbHVtbj1vLHQuX3lQb2xlV2FuZGVyUmFkaWFuc0NvbHVtbj1yLHQuX3V0MU1pbnVzVXRjU2Vjb25kc0NvbHVtbj1pLHQuX3hDZWxlc3RpYWxQb2xlT2Zmc2V0UmFkaWFuc0NvbHVtbj1zLHQuX3lDZWxlc3RpYWxQb2xlT2Zmc2V0UmFkaWFuc0NvbHVtbj1mLHQuX3RhaU1pbnVzVXRjU2Vjb25kc0NvbHVtbj11LHQuX2NvbHVtbkNvdW50PWUuY29sdW1uTmFtZXMubGVuZ3RoLHQuX2xhc3RJbmRleD12b2lkIDA7bGV0IHAsZD10Ll9hZGROZXdMZWFwU2Vjb25kcztmb3IobGV0IG09MCxfPWMubGVuZ3RoO208XzttKz10Ll9jb2x1bW5Db3VudCl7bGV0IGc9Y1ttK25dLGI9Y1ttK3VdLFQ9Zyt5bi5NT0RJRklFRF9KVUxJQU5fREFURV9ESUZGRVJFTkNFLE89bmV3IGtuKFQsYixPZS5UQUkpO2lmKGwucHVzaChPKSxkKXtpZihiIT09cCYmaChwKSl7bGV0IEU9a24ubGVhcFNlY29uZHMsdz1HcyhFLE8sTXgpO2lmKHc8MCl7bGV0IEM9bmV3IFdlKE8sYik7RS5zcGxpY2UofncsMCxDKX19cD1ifX19ZnVuY3Rpb24gTUEodCxlLG4sbyxyKXtsZXQgaT1uKm87ci54UG9sZVdhbmRlcj1lW2krdC5feFBvbGVXYW5kZXJSYWRpYW5zQ29sdW1uXSxyLnlQb2xlV2FuZGVyPWVbaSt0Ll95UG9sZVdhbmRlclJhZGlhbnNDb2x1bW5dLHIueFBvbGVPZmZzZXQ9ZVtpK3QuX3hDZWxlc3RpYWxQb2xlT2Zmc2V0UmFkaWFuc0NvbHVtbl0sci55UG9sZU9mZnNldD1lW2krdC5feUNlbGVzdGlhbFBvbGVPZmZzZXRSYWRpYW5zQ29sdW1uXSxyLnV0MU1pbnVzVXRjPWVbaSt0Ll91dDFNaW51c1V0Y1NlY29uZHNDb2x1bW5dfWZ1bmN0aW9uIG1mKHQsZSxuKXtyZXR1cm4gZSt0KihuLWUpfWZ1bmN0aW9uIE5BKHQsZSxuLG8scixpLHMpe2xldCBmPXQuX2NvbHVtbkNvdW50O2lmKGk+ZS5sZW5ndGgtMSlyZXR1cm4gcy54UG9sZVdhbmRlcj0wLHMueVBvbGVXYW5kZXI9MCxzLnhQb2xlT2Zmc2V0PTAscy55UG9sZU9mZnNldD0wLHMudXQxTWludXNVdGM9MCxzO2xldCB1PWVbcl0sYz1lW2ldO2lmKHUuZXF1YWxzKGMpfHxvLmVxdWFscyh1KSlyZXR1cm4gTUEodCxuLHIsZixzKSxzO2lmKG8uZXF1YWxzKGMpKXJldHVybiBNQSh0LG4saSxmLHMpLHM7bGV0IGw9a24uc2Vjb25kc0RpZmZlcmVuY2Uobyx1KS9rbi5zZWNvbmRzRGlmZmVyZW5jZShjLHUpLHA9cipmLGQ9aSpmLG09bltwK3QuX3V0MU1pbnVzVXRjU2Vjb25kc0NvbHVtbl0sXz1uW2QrdC5fdXQxTWludXNVdGNTZWNvbmRzQ29sdW1uXSxnPV8tbTtpZihnPi41fHxnPC0uNSl7bGV0IGI9bltwK3QuX3RhaU1pbnVzVXRjU2Vjb25kc0NvbHVtbl0sVD1uW2QrdC5fdGFpTWludXNVdGNTZWNvbmRzQ29sdW1uXTtiIT09VCYmKGMuZXF1YWxzKG8pP209XzpfLT1ULWIpfXJldHVybiBzLnhQb2xlV2FuZGVyPW1mKGwsbltwK3QuX3hQb2xlV2FuZGVyUmFkaWFuc0NvbHVtbl0sbltkK3QuX3hQb2xlV2FuZGVyUmFkaWFuc0NvbHVtbl0pLHMueVBvbGVXYW5kZXI9bWYobCxuW3ArdC5feVBvbGVXYW5kZXJSYWRpYW5zQ29sdW1uXSxuW2QrdC5feVBvbGVXYW5kZXJSYWRpYW5zQ29sdW1uXSkscy54UG9sZU9mZnNldD1tZihsLG5bcCt0Ll94Q2VsZXN0aWFsUG9sZU9mZnNldFJhZGlhbnNDb2x1bW5dLG5bZCt0Ll94Q2VsZXN0aWFsUG9sZU9mZnNldFJhZGlhbnNDb2x1bW5dKSxzLnlQb2xlT2Zmc2V0PW1mKGwsbltwK3QuX3lDZWxlc3RpYWxQb2xlT2Zmc2V0UmFkaWFuc0NvbHVtbl0sbltkK3QuX3lDZWxlc3RpYWxQb2xlT2Zmc2V0UmFkaWFuc0NvbHVtbl0pLHMudXQxTWludXNVdGM9bWYobCxtLF8pLHN9dmFyIElBLHZBPVooKCk9PntObSgpO1h0KCk7SXQoKTtmdCgpO0ltKCk7dHAoKTtMbSgpO2RmKCk7SnIoKTtYbCgpO1lsKCk7aGYuZnJvbVVybD1hc3luYyBmdW5jdGlvbih0LGUpe3kuZGVmaW5lZCgidXJsIix0KSxlPXgoZSx4LkVNUFRZX09CSkVDVCk7bGV0IG49b2kuY3JlYXRlSWZOZWVkZWQodCksbzt0cnl7bz1hd2FpdCBuLmZldGNoSnNvbigpfWNhdGNoe3Rocm93IG5ldyBBZShgQW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgcmV0cmlldmluZyB0aGUgRU9QIGRhdGEgZnJvbSB0aGUgVVJMICR7bi51cmx9LmApfXJldHVybiBuZXcgaGYoe2FkZE5ld0xlYXBTZWNvbmRzOmUuYWRkTmV3TGVhcFNlY29uZHMsZGF0YTpvfSl9O2hmLk5PTkU9T2JqZWN0LmZyZWV6ZSh7Y29tcHV0ZTpmdW5jdGlvbih0LGUpe3JldHVybiBoKGUpPyhlLnhQb2xlV2FuZGVyPTAsZS55UG9sZVdhbmRlcj0wLGUueFBvbGVPZmZzZXQ9MCxlLnlQb2xlT2Zmc2V0PTAsZS51dDFNaW51c1V0Yz0wKTplPW5ldyBjZigwLDAsMCwwLDApLGV9fSk7aGYucHJvdG90eXBlLmNvbXB1dGU9ZnVuY3Rpb24odCxlKXtpZighaCh0aGlzLl9zYW1wbGVzKSlyZXR1cm47aWYoaChlKXx8KGU9bmV3IGNmKDAsMCwwLDAsMCkpLHRoaXMuX3NhbXBsZXMubGVuZ3RoPT09MClyZXR1cm4gZS54UG9sZVdhbmRlcj0wLGUueVBvbGVXYW5kZXI9MCxlLnhQb2xlT2Zmc2V0PTAsZS55UG9sZU9mZnNldD0wLGUudXQxTWludXNVdGM9MCxlO2xldCBuPXRoaXMuX2RhdGVzLG89dGhpcy5fbGFzdEluZGV4LHI9MCxpPTA7aWYoaChvKSl7bGV0IGY9bltvXSx1PW5bbysxXSxjPWtuLmxlc3NUaGFuT3JFcXVhbHMoZix0KSxsPSFoKHUpLHA9bHx8a24uZ3JlYXRlclRoYW5PckVxdWFscyh1LHQpO2lmKGMmJnApcmV0dXJuIHI9bywhbCYmdS5lcXVhbHModCkmJisrcixpPXIrMSxOQSh0aGlzLG4sdGhpcy5fc2FtcGxlcyx0LHIsaSxlKSxlfWxldCBzPUdzKG4sdCxrbi5jb21wYXJlLHRoaXMuX2RhdGVDb2x1bW4pO3JldHVybiBzPj0wPyhzPG4ubGVuZ3RoLTEmJm5bcysxXS5lcXVhbHModCkmJisrcyxyPXMsaT1zKTooaT1+cyxyPWktMSxyPDAmJihyPTApKSx0aGlzLl9sYXN0SW5kZXg9cixOQSh0aGlzLG4sdGhpcy5fc2FtcGxlcyx0LHIsaSxlKSxlfTtJQT1oZn0pO2Z1bmN0aW9uIHdvKHQsZSxuKXt0aGlzLmhlYWRpbmc9eCh0LDApLHRoaXMucGl0Y2g9eChlLDApLHRoaXMucm9sbD14KG4sMCl9dmFyIG1wLExBPVooKCk9PntJdCgpO2Z0KCk7SHQoKTtXdCgpO3dvLmZyb21RdWF0ZXJuaW9uPWZ1bmN0aW9uKHQsZSl7aWYoIWgodCkpdGhyb3cgbmV3IEIoInF1YXRlcm5pb24gaXMgcmVxdWlyZWQiKTtoKGUpfHwoZT1uZXcgd28pO2xldCBuPTIqKHQudyp0LnktdC56KnQueCksbz0xLTIqKHQueCp0LngrdC55KnQueSkscj0yKih0LncqdC54K3QueSp0LnopLGk9MS0yKih0LnkqdC55K3Queip0LnopLHM9MioodC53KnQueit0LngqdC55KTtyZXR1cm4gZS5oZWFkaW5nPS1NYXRoLmF0YW4yKHMsaSksZS5yb2xsPU1hdGguYXRhbjIocixvKSxlLnBpdGNoPS1NLmFzaW5DbGFtcGVkKG4pLGV9O3dvLmZyb21EZWdyZWVzPWZ1bmN0aW9uKHQsZSxuLG8pe2lmKCFoKHQpKXRocm93IG5ldyBCKCJoZWFkaW5nIGlzIHJlcXVpcmVkIik7aWYoIWgoZSkpdGhyb3cgbmV3IEIoInBpdGNoIGlzIHJlcXVpcmVkIik7aWYoIWgobikpdGhyb3cgbmV3IEIoInJvbGwgaXMgcmVxdWlyZWQiKTtyZXR1cm4gaChvKXx8KG89bmV3IHdvKSxvLmhlYWRpbmc9dCpNLlJBRElBTlNfUEVSX0RFR1JFRSxvLnBpdGNoPWUqTS5SQURJQU5TX1BFUl9ERUdSRUUsby5yb2xsPW4qTS5SQURJQU5TX1BFUl9ERUdSRUUsb307d28uY2xvbmU9ZnVuY3Rpb24odCxlKXtpZihoKHQpKXJldHVybiBoKGUpPyhlLmhlYWRpbmc9dC5oZWFkaW5nLGUucGl0Y2g9dC5waXRjaCxlLnJvbGw9dC5yb2xsLGUpOm5ldyB3byh0LmhlYWRpbmcsdC5waXRjaCx0LnJvbGwpfTt3by5lcXVhbHM9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdD09PWV8fGgodCkmJmgoZSkmJnQuaGVhZGluZz09PWUuaGVhZGluZyYmdC5waXRjaD09PWUucGl0Y2gmJnQucm9sbD09PWUucm9sbH07d28uZXF1YWxzRXBzaWxvbj1mdW5jdGlvbih0LGUsbixvKXtyZXR1cm4gdD09PWV8fGgodCkmJmgoZSkmJk0uZXF1YWxzRXBzaWxvbih0LmhlYWRpbmcsZS5oZWFkaW5nLG4sbykmJk0uZXF1YWxzRXBzaWxvbih0LnBpdGNoLGUucGl0Y2gsbixvKSYmTS5lcXVhbHNFcHNpbG9uKHQucm9sbCxlLnJvbGwsbixvKX07d28ucHJvdG90eXBlLmNsb25lPWZ1bmN0aW9uKHQpe3JldHVybiB3by5jbG9uZSh0aGlzLHQpfTt3by5wcm90b3R5cGUuZXF1YWxzPWZ1bmN0aW9uKHQpe3JldHVybiB3by5lcXVhbHModGhpcyx0KX07d28ucHJvdG90eXBlLmVxdWFsc0Vwc2lsb249ZnVuY3Rpb24odCxlLG4pe3JldHVybiB3by5lcXVhbHNFcHNpbG9uKHRoaXMsdCxlLG4pfTt3by5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm5gKCR7dGhpcy5oZWFkaW5nfSwgJHt0aGlzLnBpdGNofSwgJHt0aGlzLnJvbGx9KWB9O21wPXdvfSk7ZnVuY3Rpb24gTngoKXtsZXQgdD1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgic2NyaXB0Iik7Zm9yKGxldCBlPTAsbj10Lmxlbmd0aDtlPG47KytlKXtsZXQgbz10W2VdLmdldEF0dHJpYnV0ZSgic3JjIikscj1EQS5leGVjKG8pO2lmKHIhPT1udWxsKXJldHVybiByWzFdfX1mdW5jdGlvbiBGQSh0KXtyZXR1cm4gdHlwZW9mIGRvY3VtZW50PiJ1Ij90OihoKGhwKXx8KGhwPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImEiKSksaHAuaHJlZj10LGhwLmhyZWYpfWZ1bmN0aW9uIEJBKCl7aWYoaChLcykpcmV0dXJuIEtzO2xldCB0O2lmKHR5cGVvZiBDRVNJVU1fQkFTRV9VUkw8InUiP3Q9Q0VTSVVNX0JBU0VfVVJMOmgoeXA9PW51bGw/dm9pZCAwOnlwLnVybCk/dD1mZigiLiIseXAudXJsKTp0eXBlb2YgZGVmaW5lPT0ib2JqZWN0IiYmaChkZWZpbmUuYW1kKSYmIWRlZmluZS5hbWQudG9VcmxVbmRlZmluZWQmJmgocHIudG9VcmwpP3Q9ZmYoIi4uIixXcygiQ29yZS9idWlsZE1vZHVsZVVybC5qcyIpKTp0PU54KCksIWgodCkpdGhyb3cgbmV3IEIoIlVuYWJsZSB0byBkZXRlcm1pbmUgQ2VzaXVtIGJhc2UgVVJMIGF1dG9tYXRpY2FsbHksIHRyeSBkZWZpbmluZyBhIGdsb2JhbCB2YXJpYWJsZSBjYWxsZWQgQ0VTSVVNX0JBU0VfVVJMLiIpO3JldHVybiBLcz1uZXcgb2koe3VybDpGQSh0KX0pLEtzLmFwcGVuZEZvcndhcmRTbGFzaCgpLEtzfWZ1bmN0aW9uIEl4KHQpe3JldHVybiBGQShwci50b1VybChgLi4vJHt0fWApKX1mdW5jdGlvbiBVQSh0KXtyZXR1cm4gQkEoKS5nZXREZXJpdmVkUmVzb3VyY2Uoe3VybDp0fSkudXJsfWZ1bmN0aW9uIFdzKHQpe3JldHVybiBoKF9wKXx8KHR5cGVvZiBkZWZpbmU9PSJvYmplY3QiJiZoKGRlZmluZS5hbWQpJiYhZGVmaW5lLmFtZC50b1VybFVuZGVmaW5lZCYmaChwci50b1VybCk/X3A9SXg6X3A9VUEpLF9wKHQpfXZhciB5cCxEQSxocCxLcyxfcCxncCxYbT1aKCgpPT57ZnQoKTtIdCgpO2ttKCk7ZGYoKTt5cD17fSxEQT0vKCg/Oi4qXC8pfF4pQ2VzaXVtXC5qcyg/Olw/fFwjfCQpLztXcy5fY2VzaXVtU2NyaXB0UmVnZXg9REE7V3MuX2J1aWxkTW9kdWxlVXJsRnJvbUJhc2VVcmw9VUE7V3MuX2NsZWFyQmFzZVJlc291cmNlPWZ1bmN0aW9uKCl7S3M9dm9pZCAwfTtXcy5zZXRCYXNlVXJsPWZ1bmN0aW9uKHQpe0tzPW9pLkRFRkFVTFQuZ2V0RGVyaXZlZFJlc291cmNlKHt1cmw6dH0pfTtXcy5nZXRDZXNpdW1CYXNlVXJsPUJBO2dwPVdzfSk7ZnVuY3Rpb24gdngodCxlLG4pe3RoaXMueD10LHRoaXMueT1lLHRoaXMucz1ufXZhciBBcCxZbT1aKCgpPT57QXA9dnh9KTtmdW5jdGlvbiBRbSh0KXt0PXgodCx4LkVNUFRZX09CSkVDVCksdGhpcy5feHlzRmlsZVVybFRlbXBsYXRlPW9pLmNyZWF0ZUlmTmVlZGVkKHQueHlzRmlsZVVybFRlbXBsYXRlKSx0aGlzLl9pbnRlcnBvbGF0aW9uT3JkZXI9eCh0LmludGVycG9sYXRpb25PcmRlciw5KSx0aGlzLl9zYW1wbGVaZXJvSnVsaWFuRXBoZW1lcmlzRGF0ZT14KHQuc2FtcGxlWmVyb0p1bGlhbkVwaGVtZXJpc0RhdGUsMjQ0MjM5NjVlLTEpLHRoaXMuX3NhbXBsZVplcm9EYXRlVFQ9bmV3IGtuKHRoaXMuX3NhbXBsZVplcm9KdWxpYW5FcGhlbWVyaXNEYXRlLDAsT2UuVEFJKSx0aGlzLl9zdGVwU2l6ZURheXM9eCh0LnN0ZXBTaXplRGF5cywxKSx0aGlzLl9zYW1wbGVzUGVyWHlzRmlsZT14KHQuc2FtcGxlc1Blclh5c0ZpbGUsMWUzKSx0aGlzLl90b3RhbFNhbXBsZXM9eCh0LnRvdGFsU2FtcGxlcywyNzQyNiksdGhpcy5fc2FtcGxlcz1uZXcgQXJyYXkodGhpcy5fdG90YWxTYW1wbGVzKjMpLHRoaXMuX2NodW5rRG93bmxvYWRzSW5Qcm9ncmVzcz1bXTtsZXQgZT10aGlzLl9pbnRlcnBvbGF0aW9uT3JkZXIsbj10aGlzLl9kZW5vbWluYXRvcnM9bmV3IEFycmF5KGUrMSksbz10aGlzLl94VGFibGU9bmV3IEFycmF5KGUrMSkscj1NYXRoLnBvdyh0aGlzLl9zdGVwU2l6ZURheXMsZSk7Zm9yKGxldCBpPTA7aTw9ZTsrK2kpe25baV09cixvW2ldPWkqdGhpcy5fc3RlcFNpemVEYXlzO2ZvcihsZXQgcz0wO3M8PWU7KytzKXMhPT1pJiYobltpXSo9aS1zKTtuW2ldPTEvbltpXX10aGlzLl93b3JrPW5ldyBBcnJheShlKzEpLHRoaXMuX2NvZWY9bmV3IEFycmF5KGUrMSl9ZnVuY3Rpb24gJG0odCxlLG4pe2xldCBvPUx4O3JldHVybiBvLmRheU51bWJlcj1lLG8uc2Vjb25kc09mRGF5PW4sa24uZGF5c0RpZmZlcmVuY2Uobyx0Ll9zYW1wbGVaZXJvRGF0ZVRUKX1mdW5jdGlvbiBabSh0LGUpe2lmKHQuX2NodW5rRG93bmxvYWRzSW5Qcm9ncmVzc1tlXSlyZXR1cm4gdC5fY2h1bmtEb3dubG9hZHNJblByb2dyZXNzW2VdO2xldCBuLG89dC5feHlzRmlsZVVybFRlbXBsYXRlO2gobyk/bj1vLmdldERlcml2ZWRSZXNvdXJjZSh7dGVtcGxhdGVWYWx1ZXM6ezA6ZX19KTpuPW5ldyBvaSh7dXJsOmdwKGBBc3NldHMvSUFVMjAwNl9YWVMvSUFVMjAwNl9YWVNfJHtlfS5qc29uYCl9KTtsZXQgcj1uLmZldGNoSnNvbigpLnRoZW4oZnVuY3Rpb24oaSl7dC5fY2h1bmtEb3dubG9hZHNJblByb2dyZXNzW2VdPSExO2xldCBzPXQuX3NhbXBsZXMsZj1pLnNhbXBsZXMsdT1lKnQuX3NhbXBsZXNQZXJYeXNGaWxlKjM7Zm9yKGxldCBjPTAsbD1mLmxlbmd0aDtjPGw7KytjKXNbdStjXT1mW2NdfSk7cmV0dXJuIHQuX2NodW5rRG93bmxvYWRzSW5Qcm9ncmVzc1tlXT1yLHJ9dmFyIEx4LFZBLGtBPVooKCk9PntYbSgpO0l0KCk7ZnQoKTtZbSgpO3RwKCk7ZGYoKTtZbCgpO0x4PW5ldyBrbigwLDAsT2UuVEFJKTtRbS5wcm90b3R5cGUucHJlbG9hZD1mdW5jdGlvbih0LGUsbixvKXtsZXQgcj0kbSh0aGlzLHQsZSksaT0kbSh0aGlzLG4sbykscz1yL3RoaXMuX3N0ZXBTaXplRGF5cy10aGlzLl9pbnRlcnBvbGF0aW9uT3JkZXIvMnwwO3M8MCYmKHM9MCk7bGV0IGY9aS90aGlzLl9zdGVwU2l6ZURheXMtdGhpcy5faW50ZXJwb2xhdGlvbk9yZGVyLzJ8MCt0aGlzLl9pbnRlcnBvbGF0aW9uT3JkZXI7Zj49dGhpcy5fdG90YWxTYW1wbGVzJiYoZj10aGlzLl90b3RhbFNhbXBsZXMtMSk7bGV0IHU9cy90aGlzLl9zYW1wbGVzUGVyWHlzRmlsZXwwLGM9Zi90aGlzLl9zYW1wbGVzUGVyWHlzRmlsZXwwLGw9W107Zm9yKGxldCBwPXU7cDw9YzsrK3ApbC5wdXNoKFptKHRoaXMscCkpO3JldHVybiBQcm9taXNlLmFsbChsKX07UW0ucHJvdG90eXBlLmNvbXB1dGVYeXNSYWRpYW5zPWZ1bmN0aW9uKHQsZSxuKXtsZXQgbz0kbSh0aGlzLHQsZSk7aWYobzwwKXJldHVybjtsZXQgcj1vL3RoaXMuX3N0ZXBTaXplRGF5c3wwO2lmKHI+PXRoaXMuX3RvdGFsU2FtcGxlcylyZXR1cm47bGV0IGk9dGhpcy5faW50ZXJwb2xhdGlvbk9yZGVyLHM9ci0oaS8yfDApO3M8MCYmKHM9MCk7bGV0IGY9cytpO2Y+PXRoaXMuX3RvdGFsU2FtcGxlcyYmKGY9dGhpcy5fdG90YWxTYW1wbGVzLTEscz1mLWksczwwJiYocz0wKSk7bGV0IHU9ITEsYz10aGlzLl9zYW1wbGVzO2lmKGgoY1tzKjNdKXx8KFptKHRoaXMscy90aGlzLl9zYW1wbGVzUGVyWHlzRmlsZXwwKSx1PSEwKSxoKGNbZiozXSl8fChabSh0aGlzLGYvdGhpcy5fc2FtcGxlc1Blclh5c0ZpbGV8MCksdT0hMCksdSlyZXR1cm47aChuKT8obi54PTAsbi55PTAsbi5zPTApOm49bmV3IEFwKDAsMCwwKTtsZXQgbD1vLXMqdGhpcy5fc3RlcFNpemVEYXlzLHA9dGhpcy5fd29yayxkPXRoaXMuX2Rlbm9taW5hdG9ycyxtPXRoaXMuX2NvZWYsXz10aGlzLl94VGFibGUsZyxiO2ZvcihnPTA7Zzw9aTsrK2cpcFtnXT1sLV9bZ107Zm9yKGc9MDtnPD1pOysrZyl7Zm9yKG1bZ109MSxiPTA7Yjw9aTsrK2IpYiE9PWcmJihtW2ddKj1wW2JdKTttW2ddKj1kW2ddO2xldCBUPShzK2cpKjM7bi54Kz1tW2ddKmNbVCsrXSxuLnkrPW1bZ10qY1tUKytdLG4ucys9bVtnXSpjW1RdfXJldHVybiBufTtWQT1RbX0pO3ZhciBvcyxObixxbyxHQSx6QT1aKCgpPT57ZnQoKTtObj17cmVxdWVzdEZ1bGxzY3JlZW46dm9pZCAwLGV4aXRGdWxsc2NyZWVuOnZvaWQgMCxmdWxsc2NyZWVuRW5hYmxlZDp2b2lkIDAsZnVsbHNjcmVlbkVsZW1lbnQ6dm9pZCAwLGZ1bGxzY3JlZW5jaGFuZ2U6dm9pZCAwLGZ1bGxzY3JlZW5lcnJvcjp2b2lkIDB9LHFvPXt9O09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHFvLHtlbGVtZW50OntnZXQ6ZnVuY3Rpb24oKXtpZihxby5zdXBwb3J0c0Z1bGxzY3JlZW4oKSlyZXR1cm4gZG9jdW1lbnRbTm4uZnVsbHNjcmVlbkVsZW1lbnRdfX0sY2hhbmdlRXZlbnROYW1lOntnZXQ6ZnVuY3Rpb24oKXtpZihxby5zdXBwb3J0c0Z1bGxzY3JlZW4oKSlyZXR1cm4gTm4uZnVsbHNjcmVlbmNoYW5nZX19LGVycm9yRXZlbnROYW1lOntnZXQ6ZnVuY3Rpb24oKXtpZihxby5zdXBwb3J0c0Z1bGxzY3JlZW4oKSlyZXR1cm4gTm4uZnVsbHNjcmVlbmVycm9yfX0sZW5hYmxlZDp7Z2V0OmZ1bmN0aW9uKCl7aWYocW8uc3VwcG9ydHNGdWxsc2NyZWVuKCkpcmV0dXJuIGRvY3VtZW50W05uLmZ1bGxzY3JlZW5FbmFibGVkXX19LGZ1bGxzY3JlZW46e2dldDpmdW5jdGlvbigpe2lmKHFvLnN1cHBvcnRzRnVsbHNjcmVlbigpKXJldHVybiBxby5lbGVtZW50IT09bnVsbH19fSk7cW8uc3VwcG9ydHNGdWxsc2NyZWVuPWZ1bmN0aW9uKCl7aWYoaChvcykpcmV0dXJuIG9zO29zPSExO2xldCB0PWRvY3VtZW50LmJvZHk7aWYodHlwZW9mIHQucmVxdWVzdEZ1bGxzY3JlZW49PSJmdW5jdGlvbiIpcmV0dXJuIE5uLnJlcXVlc3RGdWxsc2NyZWVuPSJyZXF1ZXN0RnVsbHNjcmVlbiIsTm4uZXhpdEZ1bGxzY3JlZW49ImV4aXRGdWxsc2NyZWVuIixObi5mdWxsc2NyZWVuRW5hYmxlZD0iZnVsbHNjcmVlbkVuYWJsZWQiLE5uLmZ1bGxzY3JlZW5FbGVtZW50PSJmdWxsc2NyZWVuRWxlbWVudCIsTm4uZnVsbHNjcmVlbmNoYW5nZT0iZnVsbHNjcmVlbmNoYW5nZSIsTm4uZnVsbHNjcmVlbmVycm9yPSJmdWxsc2NyZWVuZXJyb3IiLG9zPSEwLG9zO2xldCBlPVsid2Via2l0IiwibW96IiwibyIsIm1zIiwia2h0bWwiXSxuO2ZvcihsZXQgbz0wLHI9ZS5sZW5ndGg7bzxyOysrbyl7bGV0IGk9ZVtvXTtuPWAke2l9UmVxdWVzdEZ1bGxzY3JlZW5gLHR5cGVvZiB0W25dPT0iZnVuY3Rpb24iPyhObi5yZXF1ZXN0RnVsbHNjcmVlbj1uLG9zPSEwKToobj1gJHtpfVJlcXVlc3RGdWxsU2NyZWVuYCx0eXBlb2YgdFtuXT09ImZ1bmN0aW9uIiYmKE5uLnJlcXVlc3RGdWxsc2NyZWVuPW4sb3M9ITApKSxuPWAke2l9RXhpdEZ1bGxzY3JlZW5gLHR5cGVvZiBkb2N1bWVudFtuXT09ImZ1bmN0aW9uIj9Obi5leGl0RnVsbHNjcmVlbj1uOihuPWAke2l9Q2FuY2VsRnVsbFNjcmVlbmAsdHlwZW9mIGRvY3VtZW50W25dPT0iZnVuY3Rpb24iJiYoTm4uZXhpdEZ1bGxzY3JlZW49bikpLG49YCR7aX1GdWxsc2NyZWVuRW5hYmxlZGAsZG9jdW1lbnRbbl0hPT12b2lkIDA/Tm4uZnVsbHNjcmVlbkVuYWJsZWQ9bjoobj1gJHtpfUZ1bGxTY3JlZW5FbmFibGVkYCxkb2N1bWVudFtuXSE9PXZvaWQgMCYmKE5uLmZ1bGxzY3JlZW5FbmFibGVkPW4pKSxuPWAke2l9RnVsbHNjcmVlbkVsZW1lbnRgLGRvY3VtZW50W25dIT09dm9pZCAwP05uLmZ1bGxzY3JlZW5FbGVtZW50PW46KG49YCR7aX1GdWxsU2NyZWVuRWxlbWVudGAsZG9jdW1lbnRbbl0hPT12b2lkIDAmJihObi5mdWxsc2NyZWVuRWxlbWVudD1uKSksbj1gJHtpfWZ1bGxzY3JlZW5jaGFuZ2VgLGRvY3VtZW50W2BvbiR7bn1gXSE9PXZvaWQgMCYmKGk9PT0ibXMiJiYobj0iTVNGdWxsc2NyZWVuQ2hhbmdlIiksTm4uZnVsbHNjcmVlbmNoYW5nZT1uKSxuPWAke2l9ZnVsbHNjcmVlbmVycm9yYCxkb2N1bWVudFtgb24ke259YF0hPT12b2lkIDAmJihpPT09Im1zIiYmKG49Ik1TRnVsbHNjcmVlbkVycm9yIiksTm4uZnVsbHNjcmVlbmVycm9yPW4pfXJldHVybiBvc307cW8ucmVxdWVzdEZ1bGxzY3JlZW49ZnVuY3Rpb24odCxlKXtxby5zdXBwb3J0c0Z1bGxzY3JlZW4oKSYmdFtObi5yZXF1ZXN0RnVsbHNjcmVlbl0oe3ZyRGlzcGxheTplfSl9O3FvLmV4aXRGdWxsc2NyZWVuPWZ1bmN0aW9uKCl7cW8uc3VwcG9ydHNGdWxsc2NyZWVuKCkmJmRvY3VtZW50W05uLmV4aXRGdWxsc2NyZWVuXSgpfTtxby5fbmFtZXM9Tm47R0E9cW99KTtmdW5jdGlvbiBYcyh0KXtsZXQgZT10LnNwbGl0KCIuIik7Zm9yKGxldCBuPTAsbz1lLmxlbmd0aDtuPG87KytuKWVbbl09cGFyc2VJbnQoZVtuXSwxMCk7cmV0dXJuIGV9ZnVuY3Rpb24gcmgoKXtpZighaChicCkmJihicD0hMSwhU3AoKSkpe2xldCB0PS8gQ2hyb21lXC8oW1wuMC05XSspLy5leGVjKEVvLnVzZXJBZ2VudCk7dCE9PW51bGwmJihicD0hMCxqQT1Ycyh0WzFdKSl9cmV0dXJuIGJwfWZ1bmN0aW9uIER4KCl7cmV0dXJuIHJoKCkmJmpBfWZ1bmN0aW9uIHFBKCl7aWYoIWgoVHApJiYoVHA9ITEsIXJoKCkmJiFTcCgpJiYvIFNhZmFyaVwvW1wuMC05XSsvLnRlc3QoRW8udXNlckFnZW50KSkpe2xldCB0PS8gVmVyc2lvblwvKFtcLjAtOV0rKS8uZXhlYyhFby51c2VyQWdlbnQpO3QhPT1udWxsJiYoVHA9ITAsSEE9WHModFsxXSkpfXJldHVybiBUcH1mdW5jdGlvbiBGeCgpe3JldHVybiBxQSgpJiZIQX1mdW5jdGlvbiBLQSgpe2lmKCFoKHdwKSl7d3A9ITE7bGV0IHQ9LyBBcHBsZVdlYktpdFwvKFtcLjAtOV0rKShcKz8pLy5leGVjKEVvLnVzZXJBZ2VudCk7dCE9PW51bGwmJih3cD0hMCxuaD1Ycyh0WzFdKSxuaC5pc05pZ2h0bHk9ISF0WzJdKX1yZXR1cm4gd3B9ZnVuY3Rpb24gQngoKXtyZXR1cm4gS0EoKSYmbmh9ZnVuY3Rpb24gV0EoKXtpZighaChfZikpe19mPSExO2xldCB0O0VvLmFwcE5hbWU9PT0iTWljcm9zb2Z0IEludGVybmV0IEV4cGxvcmVyIj8odD0vTVNJRSAoWzAtOV17MSx9W1wuMC05XXswLH0pLy5leGVjKEVvLnVzZXJBZ2VudCksdCE9PW51bGwmJihfZj0hMCxvaD1Ycyh0WzFdKSkpOkVvLmFwcE5hbWU9PT0iTmV0c2NhcGUiJiYodD0vVHJpZGVudFwvLipydjooWzAtOV17MSx9W1wuMC05XXswLH0pLy5leGVjKEVvLnVzZXJBZ2VudCksdCE9PW51bGwmJihfZj0hMCxvaD1Ycyh0WzFdKSkpfXJldHVybiBfZn1mdW5jdGlvbiBVeCgpe3JldHVybiBXQSgpJiZvaH1mdW5jdGlvbiBTcCgpe2lmKCFoKE9wKSl7T3A9ITE7bGV0IHQ9LyBFZGdcLyhbXC4wLTldKykvLmV4ZWMoRW8udXNlckFnZW50KTt0IT09bnVsbCYmKE9wPSEwLFhBPVhzKHRbMV0pKX1yZXR1cm4gT3B9ZnVuY3Rpb24gVngoKXtyZXR1cm4gU3AoKSYmWEF9ZnVuY3Rpb24gQ3AoKXtpZighaChFcCkpe0VwPSExO2xldCB0PS9GaXJlZm94XC8oW1wuMC05XSspLy5leGVjKEVvLnVzZXJBZ2VudCk7dCE9PW51bGwmJihFcD0hMCxpaD1Ycyh0WzFdKSl9cmV0dXJuIEVwfWZ1bmN0aW9uIGt4KCl7cmV0dXJuIGgoSm0pfHwoSm09L1dpbmRvd3MvaS50ZXN0KEVvLmFwcFZlcnNpb24pKSxKbX1mdW5jdGlvbiBHeCgpe3JldHVybiBoKHRoKXx8KHRoPW5hdmlnYXRvci5wbGF0Zm9ybT09PSJpUGhvbmUifHxuYXZpZ2F0b3IucGxhdGZvcm09PT0iaVBvZCJ8fG5hdmlnYXRvci5wbGF0Zm9ybT09PSJpUGFkIiksdGh9ZnVuY3Rpb24gengoKXtyZXR1cm4gQ3AoKSYmaWh9ZnVuY3Rpb24gangoKXtyZXR1cm4gaChlaCl8fChlaD0hQ3AoKSYmdHlwZW9mIFBvaW50ZXJFdmVudDwidSImJighaChFby5wb2ludGVyRW5hYmxlZCl8fEVvLnBvaW50ZXJFbmFibGVkKSksZWh9ZnVuY3Rpb24gJEEoKXtpZighaChScCkpe2xldCB0PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImNhbnZhcyIpO3Quc2V0QXR0cmlidXRlKCJzdHlsZSIsImltYWdlLXJlbmRlcmluZzogLW1vei1jcmlzcC1lZGdlcztpbWFnZS1yZW5kZXJpbmc6IHBpeGVsYXRlZDsiKTtsZXQgZT10LnN0eWxlLmltYWdlUmVuZGVyaW5nO1JwPWgoZSkmJmUhPT0iIixScCYmKFlBPWUpfXJldHVybiBScH1mdW5jdGlvbiBIeCgpe3JldHVybiAkQSgpP1lBOnZvaWQgMH1mdW5jdGlvbiBPbygpe2lmKCFPby5pbml0aWFsaXplZCl0aHJvdyBuZXcgQigiWW91IG11c3QgY2FsbCBGZWF0dXJlRGV0ZWN0aW9uLnN1cHBvcnRzV2ViUC5pbml0aWFsaXplIGFuZCB3YWl0IGZvciB0aGUgcHJvbWlzZSB0byByZXNvbHZlIGJlZm9yZSBjYWxsaW5nIEZlYXR1cmVEZXRlY3Rpb24uc3VwcG9ydHNXZWJQIik7cmV0dXJuIE9vLl9yZXN1bHR9dmFyIEVvLGJwLGpBLFRwLEhBLHdwLG5oLF9mLG9oLE9wLFhBLEVwLGloLEptLHRoLGVoLFlBLFJwLEpjLHlyLFlzLHNoPVooKCk9PntYdCgpO0l0KCk7ZnQoKTtIdCgpO3pBKCk7dHlwZW9mIG5hdmlnYXRvcjwidSI/RW89bmF2aWdhdG9yOkVvPXt9O09vLl9wcm9taXNlPXZvaWQgMDtPby5fcmVzdWx0PXZvaWQgMDtPby5pbml0aWFsaXplPWZ1bmN0aW9uKCl7cmV0dXJuIGgoT28uX3Byb21pc2UpfHwoT28uX3Byb21pc2U9bmV3IFByb21pc2UodD0+e2xldCBlPW5ldyBJbWFnZTtlLm9ubG9hZD1mdW5jdGlvbigpe09vLl9yZXN1bHQ9ZS53aWR0aD4wJiZlLmhlaWdodD4wLHQoT28uX3Jlc3VsdCl9LGUub25lcnJvcj1mdW5jdGlvbigpe09vLl9yZXN1bHQ9ITEsdChPby5fcmVzdWx0KX0sZS5zcmM9ImRhdGE6aW1hZ2Uvd2VicDtiYXNlNjQsVWtsR1JpSUFBQUJYUlVKUVZsQTRJQllBQUFBd0FRQ2RBU29CQUFFQURzRCtKYVFBQTNBQUFBQUEifSkpLE9vLl9wcm9taXNlfTtPYmplY3QuZGVmaW5lUHJvcGVydGllcyhPbyx7aW5pdGlhbGl6ZWQ6e2dldDpmdW5jdGlvbigpe3JldHVybiBoKE9vLl9yZXN1bHQpfX19KTtKYz1bXTt0eXBlb2YgQXJyYXlCdWZmZXI8InUiJiYoSmMucHVzaChJbnQ4QXJyYXksVWludDhBcnJheSxJbnQxNkFycmF5LFVpbnQxNkFycmF5LEludDMyQXJyYXksVWludDMyQXJyYXksRmxvYXQzMkFycmF5LEZsb2F0NjRBcnJheSksdHlwZW9mIFVpbnQ4Q2xhbXBlZEFycmF5PCJ1IiYmSmMucHVzaChVaW50OENsYW1wZWRBcnJheSksdHlwZW9mIFVpbnQ4Q2xhbXBlZEFycmF5PCJ1IiYmSmMucHVzaChVaW50OENsYW1wZWRBcnJheSksdHlwZW9mIEJpZ0ludDY0QXJyYXk8InUiJiZKYy5wdXNoKEJpZ0ludDY0QXJyYXkpLHR5cGVvZiBCaWdVaW50NjRBcnJheTwidSImJkpjLnB1c2goQmlnVWludDY0QXJyYXkpKTt5cj17aXNDaHJvbWU6cmgsY2hyb21lVmVyc2lvbjpEeCxpc1NhZmFyaTpxQSxzYWZhcmlWZXJzaW9uOkZ4LGlzV2Via2l0OktBLHdlYmtpdFZlcnNpb246QngsaXNJbnRlcm5ldEV4cGxvcmVyOldBLGludGVybmV0RXhwbG9yZXJWZXJzaW9uOlV4LGlzRWRnZTpTcCxlZGdlVmVyc2lvbjpWeCxpc0ZpcmVmb3g6Q3AsZmlyZWZveFZlcnNpb246engsaXNXaW5kb3dzOmt4LGlzSVBhZE9ySU9TOkd4LGhhcmR3YXJlQ29uY3VycmVuY3k6eChFby5oYXJkd2FyZUNvbmN1cnJlbmN5LDMpLHN1cHBvcnRzUG9pbnRlckV2ZW50czpqeCxzdXBwb3J0c0ltYWdlUmVuZGVyaW5nUGl4ZWxhdGVkOiRBLHN1cHBvcnRzV2ViUDpPbyxpbWFnZVJlbmRlcmluZ1ZhbHVlOkh4LHR5cGVkQXJyYXlUeXBlczpKY307eXIuc3VwcG9ydHNCYXNpcz1mdW5jdGlvbih0KXtyZXR1cm4geXIuc3VwcG9ydHNXZWJBc3NlbWJseSgpJiZ0LmNvbnRleHQuc3VwcG9ydHNCYXNpc307eXIuc3VwcG9ydHNGdWxsc2NyZWVuPWZ1bmN0aW9uKCl7cmV0dXJuIEdBLnN1cHBvcnRzRnVsbHNjcmVlbigpfTt5ci5zdXBwb3J0c1R5cGVkQXJyYXlzPWZ1bmN0aW9uKCl7cmV0dXJuIHR5cGVvZiBBcnJheUJ1ZmZlcjwidSJ9O3lyLnN1cHBvcnRzQmlnSW50NjRBcnJheT1mdW5jdGlvbigpe3JldHVybiB0eXBlb2YgQmlnSW50NjRBcnJheTwidSJ9O3lyLnN1cHBvcnRzQmlnVWludDY0QXJyYXk9ZnVuY3Rpb24oKXtyZXR1cm4gdHlwZW9mIEJpZ1VpbnQ2NEFycmF5PCJ1In07eXIuc3VwcG9ydHNCaWdJbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gdHlwZW9mIEJpZ0ludDwidSJ9O3lyLnN1cHBvcnRzV2ViV29ya2Vycz1mdW5jdGlvbigpe3JldHVybiB0eXBlb2YgV29ya2VyPCJ1In07eXIuc3VwcG9ydHNXZWJBc3NlbWJseT1mdW5jdGlvbigpe3JldHVybiB0eXBlb2YgV2ViQXNzZW1ibHk8InUifTt5ci5zdXBwb3J0c1dlYmdsMj1mdW5jdGlvbih0KXtyZXR1cm4geS5kZWZpbmVkKCJzY2VuZSIsdCksdC5jb250ZXh0LndlYmdsMn07eXIuc3VwcG9ydHNFc21XZWJXb3JrZXJzPWZ1bmN0aW9uKCl7cmV0dXJuIUNwKCl8fHBhcnNlSW50KGloKT49MTE0fTtZcz15cn0pO2Z1bmN0aW9uIEV0KHQsZSxuLG8pe3RoaXMueD14KHQsMCksdGhpcy55PXgoZSwwKSx0aGlzLno9eChuLDApLHRoaXMudz14KG8sMCl9dmFyIHlmLHF4LEt4LFpBLFFBLGNoLEpBLHhwLGFoLEZyLHRiLFBwLGZoLGViLHVoLGxoLFd4LFh4LGdmLHRhLFl4LG5iLE1wLE5wLHhpLFBpLGVlLEtvPVooKCk9PntGdCgpO1h0KCk7SXQoKTtmdCgpO3NoKCk7V3QoKTtCbigpO3lmPW5ldyBhO0V0LmZyb21BeGlzQW5nbGU9ZnVuY3Rpb24odCxlLG4pe3kudHlwZU9mLm9iamVjdCgiYXhpcyIsdCkseS50eXBlT2YubnVtYmVyKCJhbmdsZSIsZSk7bGV0IG89ZS8yLHI9TWF0aC5zaW4obyk7eWY9YS5ub3JtYWxpemUodCx5Zik7bGV0IGk9eWYueCpyLHM9eWYueSpyLGY9eWYueipyLHU9TWF0aC5jb3Mobyk7cmV0dXJuIGgobik/KG4ueD1pLG4ueT1zLG4uej1mLG4udz11LG4pOm5ldyBFdChpLHMsZix1KX07cXg9WzEsMiwwXSxLeD1uZXcgQXJyYXkoMyk7RXQuZnJvbVJvdGF0aW9uTWF0cml4PWZ1bmN0aW9uKHQsZSl7eS50eXBlT2Yub2JqZWN0KCJtYXRyaXgiLHQpO2xldCBuLG8scixpLHMsZj10W1EuQ09MVU1OMFJPVzBdLHU9dFtRLkNPTFVNTjFST1cxXSxjPXRbUS5DT0xVTU4yUk9XMl0sbD1mK3UrYztpZihsPjApbj1NYXRoLnNxcnQobCsxKSxzPS41Km4sbj0uNS9uLG89KHRbUS5DT0xVTU4xUk9XMl0tdFtRLkNPTFVNTjJST1cxXSkqbixyPSh0W1EuQ09MVU1OMlJPVzBdLXRbUS5DT0xVTU4wUk9XMl0pKm4saT0odFtRLkNPTFVNTjBST1cxXS10W1EuQ09MVU1OMVJPVzBdKSpuO2Vsc2V7bGV0IHA9cXgsZD0wO3U+ZiYmKGQ9MSksYz5mJiZjPnUmJihkPTIpO2xldCBtPXBbZF0sXz1wW21dO249TWF0aC5zcXJ0KHRbUS5nZXRFbGVtZW50SW5kZXgoZCxkKV0tdFtRLmdldEVsZW1lbnRJbmRleChtLG0pXS10W1EuZ2V0RWxlbWVudEluZGV4KF8sXyldKzEpO2xldCBnPUt4O2dbZF09LjUqbixuPS41L24scz0odFtRLmdldEVsZW1lbnRJbmRleChfLG0pXS10W1EuZ2V0RWxlbWVudEluZGV4KG0sXyldKSpuLGdbbV09KHRbUS5nZXRFbGVtZW50SW5kZXgobSxkKV0rdFtRLmdldEVsZW1lbnRJbmRleChkLG0pXSkqbixnW19dPSh0W1EuZ2V0RWxlbWVudEluZGV4KF8sZCldK3RbUS5nZXRFbGVtZW50SW5kZXgoZCxfKV0pKm4sbz0tZ1swXSxyPS1nWzFdLGk9LWdbMl19cmV0dXJuIGgoZSk/KGUueD1vLGUueT1yLGUuej1pLGUudz1zLGUpOm5ldyBFdChvLHIsaSxzKX07WkE9bmV3IEV0LFFBPW5ldyBFdCxjaD1uZXcgRXQsSkE9bmV3IEV0O0V0LmZyb21IZWFkaW5nUGl0Y2hSb2xsPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHkudHlwZU9mLm9iamVjdCgiaGVhZGluZ1BpdGNoUm9sbCIsdCksSkE9RXQuZnJvbUF4aXNBbmdsZShhLlVOSVRfWCx0LnJvbGwsWkEpLGNoPUV0LmZyb21BeGlzQW5nbGUoYS5VTklUX1ksLXQucGl0Y2gsZSksZT1FdC5tdWx0aXBseShjaCxKQSxjaCksUUE9RXQuZnJvbUF4aXNBbmdsZShhLlVOSVRfWiwtdC5oZWFkaW5nLFpBKSxFdC5tdWx0aXBseShRQSxlLGUpfTt4cD1uZXcgYSxhaD1uZXcgYSxGcj1uZXcgRXQsdGI9bmV3IEV0LFBwPW5ldyBFdDtFdC5wYWNrZWRMZW5ndGg9NDtFdC5wYWNrPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4geS50eXBlT2Yub2JqZWN0KCJ2YWx1ZSIsdCkseS5kZWZpbmVkKCJhcnJheSIsZSksbj14KG4sMCksZVtuKytdPXQueCxlW24rK109dC55LGVbbisrXT10LnosZVtuXT10LncsZX07RXQudW5wYWNrPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4geS5kZWZpbmVkKCJhcnJheSIsdCksZT14KGUsMCksaChuKXx8KG49bmV3IEV0KSxuLng9dFtlXSxuLnk9dFtlKzFdLG4uej10W2UrMl0sbi53PXRbZSszXSxufTtFdC5wYWNrZWRJbnRlcnBvbGF0aW9uTGVuZ3RoPTM7RXQuY29udmVydFBhY2tlZEFycmF5Rm9ySW50ZXJwb2xhdGlvbj1mdW5jdGlvbih0LGUsbixvKXtFdC51bnBhY2sodCxuKjQsUHApLEV0LmNvbmp1Z2F0ZShQcCxQcCk7Zm9yKGxldCByPTAsaT1uLWUrMTtyPGk7cisrKXtsZXQgcz1yKjM7RXQudW5wYWNrKHQsKGUrcikqNCxGciksRXQubXVsdGlwbHkoRnIsUHAsRnIpLEZyLnc8MCYmRXQubmVnYXRlKEZyLEZyKSxFdC5jb21wdXRlQXhpcyhGcix4cCk7bGV0IGY9RXQuY29tcHV0ZUFuZ2xlKEZyKTtoKG8pfHwobz1bXSksb1tzXT14cC54KmYsb1tzKzFdPXhwLnkqZixvW3MrMl09eHAueipmfX07RXQudW5wYWNrSW50ZXJwb2xhdGlvblJlc3VsdD1mdW5jdGlvbih0LGUsbixvLHIpe2gocil8fChyPW5ldyBFdCksYS5mcm9tQXJyYXkodCwwLGFoKTtsZXQgaT1hLm1hZ25pdHVkZShhaCk7cmV0dXJuIEV0LnVucGFjayhlLG8qNCx0YiksaT09PTA/RXQuY2xvbmUoRXQuSURFTlRJVFksRnIpOkV0LmZyb21BeGlzQW5nbGUoYWgsaSxGciksRXQubXVsdGlwbHkoRnIsdGIscil9O0V0LmNsb25lPWZ1bmN0aW9uKHQsZSl7aWYoaCh0KSlyZXR1cm4gaChlKT8oZS54PXQueCxlLnk9dC55LGUuej10LnosZS53PXQudyxlKTpuZXcgRXQodC54LHQueSx0LnosdC53KX07RXQuY29uanVnYXRlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHkudHlwZU9mLm9iamVjdCgicXVhdGVybmlvbiIsdCkseS50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLGUpLGUueD0tdC54LGUueT0tdC55LGUuej0tdC56LGUudz10LncsZX07RXQubWFnbml0dWRlU3F1YXJlZD1mdW5jdGlvbih0KXtyZXR1cm4geS50eXBlT2Yub2JqZWN0KCJxdWF0ZXJuaW9uIix0KSx0LngqdC54K3QueSp0LnkrdC56KnQueit0LncqdC53fTtFdC5tYWduaXR1ZGU9ZnVuY3Rpb24odCl7cmV0dXJuIE1hdGguc3FydChFdC5tYWduaXR1ZGVTcXVhcmVkKHQpKX07RXQubm9ybWFsaXplPWZ1bmN0aW9uKHQsZSl7eS50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLGUpO2xldCBuPTEvRXQubWFnbml0dWRlKHQpLG89dC54Km4scj10LnkqbixpPXQueipuLHM9dC53Km47cmV0dXJuIGUueD1vLGUueT1yLGUuej1pLGUudz1zLGV9O0V0LmludmVyc2U9ZnVuY3Rpb24odCxlKXt5LnR5cGVPZi5vYmplY3QoInJlc3VsdCIsZSk7bGV0IG49RXQubWFnbml0dWRlU3F1YXJlZCh0KTtyZXR1cm4gZT1FdC5jb25qdWdhdGUodCxlKSxFdC5tdWx0aXBseUJ5U2NhbGFyKGUsMS9uLGUpfTtFdC5hZGQ9ZnVuY3Rpb24odCxlLG4pe3JldHVybiB5LnR5cGVPZi5vYmplY3QoImxlZnQiLHQpLHkudHlwZU9mLm9iamVjdCgicmlnaHQiLGUpLHkudHlwZU9mLm9iamVjdCgicmVzdWx0IixuKSxuLng9dC54K2UueCxuLnk9dC55K2UueSxuLno9dC56K2UueixuLnc9dC53K2UudyxufTtFdC5zdWJ0cmFjdD1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHkudHlwZU9mLm9iamVjdCgibGVmdCIsdCkseS50eXBlT2Yub2JqZWN0KCJyaWdodCIsZSkseS50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLG4pLG4ueD10LngtZS54LG4ueT10LnktZS55LG4uej10LnotZS56LG4udz10LnctZS53LG59O0V0Lm5lZ2F0ZT1mdW5jdGlvbih0LGUpe3JldHVybiB5LnR5cGVPZi5vYmplY3QoInF1YXRlcm5pb24iLHQpLHkudHlwZU9mLm9iamVjdCgicmVzdWx0IixlKSxlLng9LXQueCxlLnk9LXQueSxlLno9LXQueixlLnc9LXQudyxlfTtFdC5kb3Q9ZnVuY3Rpb24odCxlKXtyZXR1cm4geS50eXBlT2Yub2JqZWN0KCJsZWZ0Iix0KSx5LnR5cGVPZi5vYmplY3QoInJpZ2h0IixlKSx0LngqZS54K3QueSplLnkrdC56KmUueit0LncqZS53fTtFdC5tdWx0aXBseT1mdW5jdGlvbih0LGUsbil7eS50eXBlT2Yub2JqZWN0KCJsZWZ0Iix0KSx5LnR5cGVPZi5vYmplY3QoInJpZ2h0IixlKSx5LnR5cGVPZi5vYmplY3QoInJlc3VsdCIsbik7bGV0IG89dC54LHI9dC55LGk9dC56LHM9dC53LGY9ZS54LHU9ZS55LGM9ZS56LGw9ZS53LHA9cypmK28qbCtyKmMtaSp1LGQ9cyp1LW8qYytyKmwraSpmLG09cypjK28qdS1yKmYraSpsLF89cypsLW8qZi1yKnUtaSpjO3JldHVybiBuLng9cCxuLnk9ZCxuLno9bSxuLnc9XyxufTtFdC5tdWx0aXBseUJ5U2NhbGFyPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4geS50eXBlT2Yub2JqZWN0KCJxdWF0ZXJuaW9uIix0KSx5LnR5cGVPZi5udW1iZXIoInNjYWxhciIsZSkseS50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLG4pLG4ueD10LngqZSxuLnk9dC55KmUsbi56PXQueiplLG4udz10LncqZSxufTtFdC5kaXZpZGVCeVNjYWxhcj1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHkudHlwZU9mLm9iamVjdCgicXVhdGVybmlvbiIsdCkseS50eXBlT2YubnVtYmVyKCJzY2FsYXIiLGUpLHkudHlwZU9mLm9iamVjdCgicmVzdWx0IixuKSxuLng9dC54L2Usbi55PXQueS9lLG4uej10LnovZSxuLnc9dC53L2Usbn07RXQuY29tcHV0ZUF4aXM9ZnVuY3Rpb24odCxlKXt5LnR5cGVPZi5vYmplY3QoInF1YXRlcm5pb24iLHQpLHkudHlwZU9mLm9iamVjdCgicmVzdWx0IixlKTtsZXQgbj10Lnc7aWYoTWF0aC5hYnMobi0xKTxNLkVQU0lMT042fHxNYXRoLmFicyhuKzEpPE0uRVBTSUxPTjYpcmV0dXJuIGUueD0xLGUueT1lLno9MCxlO2xldCBvPTEvTWF0aC5zcXJ0KDEtbipuKTtyZXR1cm4gZS54PXQueCpvLGUueT10LnkqbyxlLno9dC56Km8sZX07RXQuY29tcHV0ZUFuZ2xlPWZ1bmN0aW9uKHQpe3JldHVybiB5LnR5cGVPZi5vYmplY3QoInF1YXRlcm5pb24iLHQpLE1hdGguYWJzKHQudy0xKTxNLkVQU0lMT042PzA6MipNYXRoLmFjb3ModC53KX07Zmg9bmV3IEV0O0V0LmxlcnA9ZnVuY3Rpb24odCxlLG4sbyl7cmV0dXJuIHkudHlwZU9mLm9iamVjdCgic3RhcnQiLHQpLHkudHlwZU9mLm9iamVjdCgiZW5kIixlKSx5LnR5cGVPZi5udW1iZXIoInQiLG4pLHkudHlwZU9mLm9iamVjdCgicmVzdWx0IixvKSxmaD1FdC5tdWx0aXBseUJ5U2NhbGFyKGUsbixmaCksbz1FdC5tdWx0aXBseUJ5U2NhbGFyKHQsMS1uLG8pLEV0LmFkZChmaCxvLG8pfTtlYj1uZXcgRXQsdWg9bmV3IEV0LGxoPW5ldyBFdDtFdC5zbGVycD1mdW5jdGlvbih0LGUsbixvKXt5LnR5cGVPZi5vYmplY3QoInN0YXJ0Iix0KSx5LnR5cGVPZi5vYmplY3QoImVuZCIsZSkseS50eXBlT2YubnVtYmVyKCJ0IixuKSx5LnR5cGVPZi5vYmplY3QoInJlc3VsdCIsbyk7bGV0IHI9RXQuZG90KHQsZSksaT1lO2lmKHI8MCYmKHI9LXIsaT1lYj1FdC5uZWdhdGUoZSxlYikpLDEtcjxNLkVQU0lMT042KXJldHVybiBFdC5sZXJwKHQsaSxuLG8pO2xldCBzPU1hdGguYWNvcyhyKTtyZXR1cm4gdWg9RXQubXVsdGlwbHlCeVNjYWxhcih0LE1hdGguc2luKCgxLW4pKnMpLHVoKSxsaD1FdC5tdWx0aXBseUJ5U2NhbGFyKGksTWF0aC5zaW4obipzKSxsaCksbz1FdC5hZGQodWgsbGgsbyksRXQubXVsdGlwbHlCeVNjYWxhcihvLDEvTWF0aC5zaW4ocyksbyl9O0V0LmxvZz1mdW5jdGlvbih0LGUpe3kudHlwZU9mLm9iamVjdCgicXVhdGVybmlvbiIsdCkseS50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLGUpO2xldCBuPU0uYWNvc0NsYW1wZWQodC53KSxvPTA7cmV0dXJuIG4hPT0wJiYobz1uL01hdGguc2luKG4pKSxhLm11bHRpcGx5QnlTY2FsYXIodCxvLGUpfTtFdC5leHA9ZnVuY3Rpb24odCxlKXt5LnR5cGVPZi5vYmplY3QoImNhcnRlc2lhbiIsdCkseS50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLGUpO2xldCBuPWEubWFnbml0dWRlKHQpLG89MDtyZXR1cm4gbiE9PTAmJihvPU1hdGguc2luKG4pL24pLGUueD10LngqbyxlLnk9dC55Km8sZS56PXQueipvLGUudz1NYXRoLmNvcyhuKSxlfTtXeD1uZXcgYSxYeD1uZXcgYSxnZj1uZXcgRXQsdGE9bmV3IEV0O0V0LmNvbXB1dGVJbm5lclF1YWRyYW5nbGU9ZnVuY3Rpb24odCxlLG4sbyl7eS50eXBlT2Yub2JqZWN0KCJxMCIsdCkseS50eXBlT2Yub2JqZWN0KCJxMSIsZSkseS50eXBlT2Yub2JqZWN0KCJxMiIsbikseS50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLG8pO2xldCByPUV0LmNvbmp1Z2F0ZShlLGdmKTtFdC5tdWx0aXBseShyLG4sdGEpO2xldCBpPUV0LmxvZyh0YSxXeCk7RXQubXVsdGlwbHkocix0LHRhKTtsZXQgcz1FdC5sb2codGEsWHgpO3JldHVybiBhLmFkZChpLHMsaSksYS5tdWx0aXBseUJ5U2NhbGFyKGksLjI1LGkpLGEubmVnYXRlKGksaSksRXQuZXhwKGksZ2YpLEV0Lm11bHRpcGx5KGUsZ2Ysbyl9O0V0LnNxdWFkPWZ1bmN0aW9uKHQsZSxuLG8scixpKXt5LnR5cGVPZi5vYmplY3QoInEwIix0KSx5LnR5cGVPZi5vYmplY3QoInExIixlKSx5LnR5cGVPZi5vYmplY3QoInMwIixuKSx5LnR5cGVPZi5vYmplY3QoInMxIixvKSx5LnR5cGVPZi5udW1iZXIoInQiLHIpLHkudHlwZU9mLm9iamVjdCgicmVzdWx0IixpKTtsZXQgcz1FdC5zbGVycCh0LGUscixnZiksZj1FdC5zbGVycChuLG8scix0YSk7cmV0dXJuIEV0LnNsZXJwKHMsZiwyKnIqKDEtciksaSl9O1l4PW5ldyBFdCxuYj0xLjkwMTEwNzQ1MzUxNzMwMDMsTXA9WXMuc3VwcG9ydHNUeXBlZEFycmF5cygpP25ldyBGbG9hdDMyQXJyYXkoOCk6W10sTnA9WXMuc3VwcG9ydHNUeXBlZEFycmF5cygpP25ldyBGbG9hdDMyQXJyYXkoOCk6W10seGk9WXMuc3VwcG9ydHNUeXBlZEFycmF5cygpP25ldyBGbG9hdDMyQXJyYXkoOCk6W10sUGk9WXMuc3VwcG9ydHNUeXBlZEFycmF5cygpP25ldyBGbG9hdDMyQXJyYXkoOCk6W107Zm9yKGxldCB0PTA7dDw3OysrdCl7bGV0IGU9dCsxLG49MiplKzE7TXBbdF09MS8oZSpuKSxOcFt0XT1lL259TXBbN109bmIvKDgqMTcpO05wWzddPW5iKjgvMTc7RXQuZmFzdFNsZXJwPWZ1bmN0aW9uKHQsZSxuLG8pe3kudHlwZU9mLm9iamVjdCgic3RhcnQiLHQpLHkudHlwZU9mLm9iamVjdCgiZW5kIixlKSx5LnR5cGVPZi5udW1iZXIoInQiLG4pLHkudHlwZU9mLm9iamVjdCgicmVzdWx0IixvKTtsZXQgcj1FdC5kb3QodCxlKSxpO3I+PTA/aT0xOihpPS0xLHI9LXIpO2xldCBzPXItMSxmPTEtbix1PW4qbixjPWYqZjtmb3IobGV0IG09NzttPj0wOy0tbSl4aVttXT0oTXBbbV0qdS1OcFttXSkqcyxQaVttXT0oTXBbbV0qYy1OcFttXSkqcztsZXQgbD1pKm4qKDEreGlbMF0qKDEreGlbMV0qKDEreGlbMl0qKDEreGlbM10qKDEreGlbNF0qKDEreGlbNV0qKDEreGlbNl0qKDEreGlbN10pKSkpKSkpKSxwPWYqKDErUGlbMF0qKDErUGlbMV0qKDErUGlbMl0qKDErUGlbM10qKDErUGlbNF0qKDErUGlbNV0qKDErUGlbNl0qKDErUGlbN10pKSkpKSkpKSxkPUV0Lm11bHRpcGx5QnlTY2FsYXIodCxwLFl4KTtyZXR1cm4gRXQubXVsdGlwbHlCeVNjYWxhcihlLGwsbyksRXQuYWRkKGQsbyxvKX07RXQuZmFzdFNxdWFkPWZ1bmN0aW9uKHQsZSxuLG8scixpKXt5LnR5cGVPZi5vYmplY3QoInEwIix0KSx5LnR5cGVPZi5vYmplY3QoInExIixlKSx5LnR5cGVPZi5vYmplY3QoInMwIixuKSx5LnR5cGVPZi5vYmplY3QoInMxIixvKSx5LnR5cGVPZi5udW1iZXIoInQiLHIpLHkudHlwZU9mLm9iamVjdCgicmVzdWx0IixpKTtsZXQgcz1FdC5mYXN0U2xlcnAodCxlLHIsZ2YpLGY9RXQuZmFzdFNsZXJwKG4sbyxyLHRhKTtyZXR1cm4gRXQuZmFzdFNsZXJwKHMsZiwyKnIqKDEtciksaSl9O0V0LmVxdWFscz1mdW5jdGlvbih0LGUpe3JldHVybiB0PT09ZXx8aCh0KSYmaChlKSYmdC54PT09ZS54JiZ0Lnk9PT1lLnkmJnQuej09PWUueiYmdC53PT09ZS53fTtFdC5lcXVhbHNFcHNpbG9uPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gbj14KG4sMCksdD09PWV8fGgodCkmJmgoZSkmJk1hdGguYWJzKHQueC1lLngpPD1uJiZNYXRoLmFicyh0LnktZS55KTw9biYmTWF0aC5hYnModC56LWUueik8PW4mJk1hdGguYWJzKHQudy1lLncpPD1ufTtFdC5aRVJPPU9iamVjdC5mcmVlemUobmV3IEV0KDAsMCwwLDApKTtFdC5JREVOVElUWT1PYmplY3QuZnJlZXplKG5ldyBFdCgwLDAsMCwxKSk7RXQucHJvdG90eXBlLmNsb25lPWZ1bmN0aW9uKHQpe3JldHVybiBFdC5jbG9uZSh0aGlzLHQpfTtFdC5wcm90b3R5cGUuZXF1YWxzPWZ1bmN0aW9uKHQpe3JldHVybiBFdC5lcXVhbHModGhpcyx0KX07RXQucHJvdG90eXBlLmVxdWFsc0Vwc2lsb249ZnVuY3Rpb24odCxlKXtyZXR1cm4gRXQuZXF1YWxzRXBzaWxvbih0aGlzLHQsZSl9O0V0LnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybmAoJHt0aGlzLnh9LCAke3RoaXMueX0sICR7dGhpcy56fSwgJHt0aGlzLnd9KWB9O2VlPUV0fSk7dmFyIFJlLHBoLGVhLGRoLFdvLHJzLGlzLHNzLCR4LFp4LFF4LEp4LHQzLGUzLG4zLG9iLG8zLHIzLGkzLHMzLGMzLGEzLGYzLHUzLGwzLHAzLElwLF9oLGQzLG0zLGgzLHZwLF8zLHkzLGczLEEzLG1oLGhoLGIzLFQzLHczLE8zLHJiLGliLHloLEUzLFIzLGdoLHNiLFhvLGNzPVooKCk9PntVZSgpO0Z0KCk7aHIoKTtJZSgpO1h0KCk7SXQoKTtmdCgpO0h0KCk7dkEoKTtJbSgpO1p0KCk7TEEoKTtrQSgpO1ltKCk7dHAoKTtXdCgpO0JuKCk7VW4oKTtLbygpO1hsKCk7UmU9e30scGg9e3VwOntzb3V0aDoiZWFzdCIsbm9ydGg6Indlc3QiLHdlc3Q6InNvdXRoIixlYXN0OiJub3J0aCJ9LGRvd246e3NvdXRoOiJ3ZXN0Iixub3J0aDoiZWFzdCIsd2VzdDoibm9ydGgiLGVhc3Q6InNvdXRoIn0sc291dGg6e3VwOiJ3ZXN0Iixkb3duOiJlYXN0Iix3ZXN0OiJkb3duIixlYXN0OiJ1cCJ9LG5vcnRoOnt1cDoiZWFzdCIsZG93bjoid2VzdCIsd2VzdDoidXAiLGVhc3Q6ImRvd24ifSx3ZXN0Ont1cDoibm9ydGgiLGRvd246InNvdXRoIixub3J0aDoiZG93biIsc291dGg6InVwIn0sZWFzdDp7dXA6InNvdXRoIixkb3duOiJub3J0aCIsbm9ydGg6InVwIixzb3V0aDoiZG93biJ9fSxlYT17bm9ydGg6Wy0xLDAsMF0sZWFzdDpbMCwxLDBdLHVwOlswLDAsMV0sc291dGg6WzEsMCwwXSx3ZXN0OlswLC0xLDBdLGRvd246WzAsMCwtMV19LGRoPXt9LFdvPXtlYXN0Om5ldyBhLG5vcnRoOm5ldyBhLHVwOm5ldyBhLHdlc3Q6bmV3IGEsc291dGg6bmV3IGEsZG93bjpuZXcgYX0scnM9bmV3IGEsaXM9bmV3IGEsc3M9bmV3IGE7UmUubG9jYWxGcmFtZVRvRml4ZWRGcmFtZUdlbmVyYXRvcj1mdW5jdGlvbih0LGUpe2lmKCFwaC5oYXNPd25Qcm9wZXJ0eSh0KXx8IXBoW3RdLmhhc093blByb3BlcnR5KGUpKXRocm93IG5ldyBCKCJmaXJzdEF4aXMgYW5kIHNlY29uZEF4aXMgbXVzdCBiZSBlYXN0LCBub3J0aCwgdXAsIHdlc3QsIHNvdXRoIG9yIGRvd24uIik7bGV0IG49cGhbdF1bZV0sbyxyPXQrZTtyZXR1cm4gaChkaFtyXSk/bz1kaFtyXToobz1mdW5jdGlvbihpLHMsZil7aWYoIWgoaSkpdGhyb3cgbmV3IEIoIm9yaWdpbiBpcyByZXF1aXJlZC4iKTtpZihpc05hTihpLngpfHxpc05hTihpLnkpfHxpc05hTihpLnopKXRocm93IG5ldyBCKCJvcmlnaW4gaGFzIGEgTmFOIGNvbXBvbmVudCIpO2lmKGgoZil8fChmPW5ldyBzdCksYS5lcXVhbHNFcHNpbG9uKGksYS5aRVJPLE0uRVBTSUxPTjE0KSlhLnVucGFjayhlYVt0XSwwLHJzKSxhLnVucGFjayhlYVtlXSwwLGlzKSxhLnVucGFjayhlYVtuXSwwLHNzKTtlbHNlIGlmKE0uZXF1YWxzRXBzaWxvbihpLngsMCxNLkVQU0lMT04xNCkmJk0uZXF1YWxzRXBzaWxvbihpLnksMCxNLkVQU0lMT04xNCkpe2xldCB1PU0uc2lnbihpLnopO2EudW5wYWNrKGVhW3RdLDAscnMpLHQhPT0iZWFzdCImJnQhPT0id2VzdCImJmEubXVsdGlwbHlCeVNjYWxhcihycyx1LHJzKSxhLnVucGFjayhlYVtlXSwwLGlzKSxlIT09ImVhc3QiJiZlIT09Indlc3QiJiZhLm11bHRpcGx5QnlTY2FsYXIoaXMsdSxpcyksYS51bnBhY2soZWFbbl0sMCxzcyksbiE9PSJlYXN0IiYmbiE9PSJ3ZXN0IiYmYS5tdWx0aXBseUJ5U2NhbGFyKHNzLHUsc3MpfWVsc2V7cz14KHMsJC5kZWZhdWx0KSxzLmdlb2RldGljU3VyZmFjZU5vcm1hbChpLFdvLnVwKTtsZXQgdT1Xby51cCxjPVdvLmVhc3Q7Yy54PS1pLnksYy55PWkueCxjLno9MCxhLm5vcm1hbGl6ZShjLFdvLmVhc3QpLGEuY3Jvc3ModSxjLFdvLm5vcnRoKSxhLm11bHRpcGx5QnlTY2FsYXIoV28udXAsLTEsV28uZG93biksYS5tdWx0aXBseUJ5U2NhbGFyKFdvLmVhc3QsLTEsV28ud2VzdCksYS5tdWx0aXBseUJ5U2NhbGFyKFdvLm5vcnRoLC0xLFdvLnNvdXRoKSxycz1Xb1t0XSxpcz1Xb1tlXSxzcz1Xb1tuXX1yZXR1cm4gZlswXT1ycy54LGZbMV09cnMueSxmWzJdPXJzLnosZlszXT0wLGZbNF09aXMueCxmWzVdPWlzLnksZls2XT1pcy56LGZbN109MCxmWzhdPXNzLngsZls5XT1zcy55LGZbMTBdPXNzLnosZlsxMV09MCxmWzEyXT1pLngsZlsxM109aS55LGZbMTRdPWkueixmWzE1XT0xLGZ9LGRoW3JdPW8pLG99O1JlLmVhc3ROb3J0aFVwVG9GaXhlZEZyYW1lPVJlLmxvY2FsRnJhbWVUb0ZpeGVkRnJhbWVHZW5lcmF0b3IoImVhc3QiLCJub3J0aCIpO1JlLm5vcnRoRWFzdERvd25Ub0ZpeGVkRnJhbWU9UmUubG9jYWxGcmFtZVRvRml4ZWRGcmFtZUdlbmVyYXRvcigibm9ydGgiLCJlYXN0Iik7UmUubm9ydGhVcEVhc3RUb0ZpeGVkRnJhbWU9UmUubG9jYWxGcmFtZVRvRml4ZWRGcmFtZUdlbmVyYXRvcigibm9ydGgiLCJ1cCIpO1JlLm5vcnRoV2VzdFVwVG9GaXhlZEZyYW1lPVJlLmxvY2FsRnJhbWVUb0ZpeGVkRnJhbWVHZW5lcmF0b3IoIm5vcnRoIiwid2VzdCIpOyR4PW5ldyBlZSxaeD1uZXcgYSgxLDEsMSksUXg9bmV3IHN0O1JlLmhlYWRpbmdQaXRjaFJvbGxUb0ZpeGVkRnJhbWU9ZnVuY3Rpb24odCxlLG4sbyxyKXt5LnR5cGVPZi5vYmplY3QoIkhlYWRpbmdQaXRjaFJvbGwiLGUpLG89eChvLFJlLmVhc3ROb3J0aFVwVG9GaXhlZEZyYW1lKTtsZXQgaT1lZS5mcm9tSGVhZGluZ1BpdGNoUm9sbChlLCR4KSxzPXN0LmZyb21UcmFuc2xhdGlvblF1YXRlcm5pb25Sb3RhdGlvblNjYWxlKGEuWkVSTyxpLFp4LFF4KTtyZXR1cm4gcj1vKHQsbixyKSxzdC5tdWx0aXBseShyLHMscil9O0p4PW5ldyBzdCx0Mz1uZXcgUTtSZS5oZWFkaW5nUGl0Y2hSb2xsUXVhdGVybmlvbj1mdW5jdGlvbih0LGUsbixvLHIpe3kudHlwZU9mLm9iamVjdCgiSGVhZGluZ1BpdGNoUm9sbCIsZSk7bGV0IGk9UmUuaGVhZGluZ1BpdGNoUm9sbFRvRml4ZWRGcmFtZSh0LGUsbixvLEp4KSxzPXN0LmdldE1hdHJpeDMoaSx0Myk7cmV0dXJuIGVlLmZyb21Sb3RhdGlvbk1hdHJpeChzLHIpfTtlMz1uZXcgYSgxLDEsMSksbjM9bmV3IGEsb2I9bmV3IHN0LG8zPW5ldyBzdCxyMz1uZXcgUSxpMz1uZXcgZWU7UmUuZml4ZWRGcmFtZVRvSGVhZGluZ1BpdGNoUm9sbD1mdW5jdGlvbih0LGUsbixvKXt5LmRlZmluZWQoInRyYW5zZm9ybSIsdCksZT14KGUsJC5kZWZhdWx0KSxuPXgobixSZS5lYXN0Tm9ydGhVcFRvRml4ZWRGcmFtZSksaChvKXx8KG89bmV3IG1wKTtsZXQgcj1zdC5nZXRUcmFuc2xhdGlvbih0LG4zKTtpZihhLmVxdWFscyhyLGEuWkVSTykpcmV0dXJuIG8uaGVhZGluZz0wLG8ucGl0Y2g9MCxvLnJvbGw9MCxvO2xldCBpPXN0LmludmVyc2VUcmFuc2Zvcm1hdGlvbihuKHIsZSxvYiksb2IpLHM9c3Quc2V0U2NhbGUodCxlMyxvMyk7cz1zdC5zZXRUcmFuc2xhdGlvbihzLGEuWkVSTyxzKSxpPXN0Lm11bHRpcGx5KGkscyxpKTtsZXQgZj1lZS5mcm9tUm90YXRpb25NYXRyaXgoc3QuZ2V0TWF0cml4MyhpLHIzKSxpMyk7cmV0dXJuIGY9ZWUubm9ybWFsaXplKGYsZiksbXAuZnJvbVF1YXRlcm5pb24oZixvKX07czM9NiozNjAwKzQxKjYwKzUwLjU0ODQxLGMzPTg2NDAxODQ4MTI4NjZlLTYsYTM9LjA5MzEwNCxmMz0tNjJlLTcsdTM9MTE3NzI3NTgzODQ2NjhlLTMyLGwzPTcyOTIxMTU4NTUzZS0xNSxwMz1NLlRXT19QSS84NjQwMCxJcD1uZXcga247UmUuY29tcHV0ZUljcmZUb0NlbnRyYWxCb2R5Rml4ZWRNYXRyaXg9ZnVuY3Rpb24odCxlKXtsZXQgbj1SZS5jb21wdXRlSWNyZlRvRml4ZWRNYXRyaXgodCxlKTtyZXR1cm4gaChuKXx8KG49UmUuY29tcHV0ZVRlbWVUb1BzZXVkb0ZpeGVkTWF0cml4KHQsZSkpLG59O1JlLmNvbXB1dGVUZW1lVG9Qc2V1ZG9GaXhlZE1hdHJpeD1mdW5jdGlvbih0LGUpe2lmKCFoKHQpKXRocm93IG5ldyBCKCJkYXRlIGlzIHJlcXVpcmVkLiIpO0lwPWtuLmFkZFNlY29uZHModCwta24uY29tcHV0ZVRhaU1pbnVzVXRjKHQpLElwKTtsZXQgbj1JcC5kYXlOdW1iZXIsbz1JcC5zZWNvbmRzT2ZEYXkscixpPW4tMjQ1MTU0NTtvPj00MzIwMD9yPShpKy41KS95bi5EQVlTX1BFUl9KVUxJQU5fQ0VOVFVSWTpyPShpLS41KS95bi5EQVlTX1BFUl9KVUxJQU5fQ0VOVFVSWTtsZXQgZj0oczMrciooYzMrciooYTMrcipmMykpKSpwMyVNLlRXT19QSSx1PWwzK3UzKihuLTI0NTE1NDU1ZS0xKSxjPShvK3luLlNFQ09ORFNfUEVSX0RBWSouNSkleW4uU0VDT05EU19QRVJfREFZLGw9Zit1KmMscD1NYXRoLmNvcyhsKSxkPU1hdGguc2luKGwpO3JldHVybiBoKGUpPyhlWzBdPXAsZVsxXT0tZCxlWzJdPTAsZVszXT1kLGVbNF09cCxlWzVdPTAsZVs2XT0wLGVbN109MCxlWzhdPTEsZSk6bmV3IFEocCxkLDAsLWQscCwwLDAsMCwxKX07UmUuaWF1MjAwNlh5c0RhdGE9bmV3IFZBO1JlLmVhcnRoT3JpZW50YXRpb25QYXJhbWV0ZXJzPUlBLk5PTkU7X2g9MzIuMTg0LGQzPTI0NTE1NDU7UmUucHJlbG9hZEljcmZGaXhlZD1mdW5jdGlvbih0KXtsZXQgZT10LnN0YXJ0LmRheU51bWJlcixuPXQuc3RhcnQuc2Vjb25kc09mRGF5K19oLG89dC5zdG9wLmRheU51bWJlcixyPXQuc3RvcC5zZWNvbmRzT2ZEYXkrX2g7cmV0dXJuIFJlLmlhdTIwMDZYeXNEYXRhLnByZWxvYWQoZSxuLG8scil9O1JlLmNvbXB1dGVJY3JmVG9GaXhlZE1hdHJpeD1mdW5jdGlvbih0LGUpe2lmKCFoKHQpKXRocm93IG5ldyBCKCJkYXRlIGlzIHJlcXVpcmVkLiIpO2goZSl8fChlPW5ldyBRKTtsZXQgbj1SZS5jb21wdXRlRml4ZWRUb0ljcmZNYXRyaXgodCxlKTtpZihoKG4pKXJldHVybiBRLnRyYW5zcG9zZShuLGUpfTttMz0zMi4xODQsaDM9MjQ1MTU0NSx2cD1uZXcgbXAsXzM9bmV3IFEseTM9bmV3IGtuO1JlLmNvbXB1dGVNb29uRml4ZWRUb0ljcmZNYXRyaXg9ZnVuY3Rpb24odCxlKXtpZighaCh0KSl0aHJvdyBuZXcgQigiZGF0ZSBpcyByZXF1aXJlZC4iKTtoKGUpfHwoZT1uZXcgUSk7bGV0IG49a24uYWRkU2Vjb25kcyh0LG0zLHkzKSxvPWtuLnRvdGFsRGF5cyhuKS1oMyxyPU0udG9SYWRpYW5zKDEyLjExMiktTS50b1JhZGlhbnMoLjA1Mjk5MikqbyxpPU0udG9SYWRpYW5zKDI0LjIyNCktTS50b1JhZGlhbnMoLjEwNTk4NCkqbyxzPU0udG9SYWRpYW5zKDIyNy42NDUpK00udG9SYWRpYW5zKDEzLjAxMikqbyxmPU0udG9SYWRpYW5zKDI2MS4xMDUpK00udG9SYWRpYW5zKDEzLjM0MDcxNikqbyx1PU0udG9SYWRpYW5zKDM1OCkrTS50b1JhZGlhbnMoLjk4NTYpKm87cmV0dXJuIHZwLnBpdGNoPU0udG9SYWRpYW5zKDE4MCktTS50b1JhZGlhbnMoMy44NzgpKk1hdGguc2luKHIpLU0udG9SYWRpYW5zKC4xMikqTWF0aC5zaW4oaSkrTS50b1JhZGlhbnMoLjA3KSpNYXRoLnNpbihzKS1NLnRvUmFkaWFucyguMDE3KSpNYXRoLnNpbihmKSx2cC5yb2xsPU0udG9SYWRpYW5zKDY2LjUzLTkwKStNLnRvUmFkaWFucygxLjU0MykqTWF0aC5jb3MocikrTS50b1JhZGlhbnMoLjI0KSpNYXRoLmNvcyhpKS1NLnRvUmFkaWFucyguMDI4KSpNYXRoLmNvcyhzKStNLnRvUmFkaWFucyguMDA3KSpNYXRoLmNvcyhmKSx2cC5oZWFkaW5nPU0udG9SYWRpYW5zKDI0NC4zNzUtOTApK00udG9SYWRpYW5zKDEzLjE3NjM1ODMxKSpvK00udG9SYWRpYW5zKDMuNTU4KSpNYXRoLnNpbihyKStNLnRvUmFkaWFucyguMTIxKSpNYXRoLnNpbihpKS1NLnRvUmFkaWFucyguMDY0KSpNYXRoLnNpbihzKStNLnRvUmFkaWFucyguMDE2KSpNYXRoLnNpbihmKStNLnRvUmFkaWFucyguMDI1KSpNYXRoLnNpbih1KSxRLmZyb21IZWFkaW5nUGl0Y2hSb2xsKHZwLF8zKX07UmUuY29tcHV0ZUljcmZUb01vb25GaXhlZE1hdHJpeD1mdW5jdGlvbih0LGUpe2lmKCFoKHQpKXRocm93IG5ldyBCKCJkYXRlIGlzIHJlcXVpcmVkLiIpO2goZSl8fChlPW5ldyBRKTtsZXQgbj1SZS5jb21wdXRlTW9vbkZpeGVkVG9JY3JmTWF0cml4KHQsZSk7aWYoaChuKSlyZXR1cm4gUS50cmFuc3Bvc2UobixlKX07ZzM9bmV3IEFwKDAsMCwwKSxBMz1uZXcgY2YoMCwwLDAsMCwwLDApLG1oPW5ldyBRLGhoPW5ldyBRO1JlLmNvbXB1dGVGaXhlZFRvSWNyZk1hdHJpeD1mdW5jdGlvbih0LGUpe2lmKCFoKHQpKXRocm93IG5ldyBCKCJkYXRlIGlzIHJlcXVpcmVkLiIpO2goZSl8fChlPW5ldyBRKTtsZXQgbj1SZS5lYXJ0aE9yaWVudGF0aW9uUGFyYW1ldGVycy5jb21wdXRlKHQsQTMpO2lmKCFoKG4pKXJldHVybjtsZXQgbz10LmRheU51bWJlcixyPXQuc2Vjb25kc09mRGF5K19oLGk9UmUuaWF1MjAwNlh5c0RhdGEuY29tcHV0ZVh5c1JhZGlhbnMobyxyLGczKTtpZighaChpKSlyZXR1cm47bGV0IHM9aS54K24ueFBvbGVPZmZzZXQsZj1pLnkrbi55UG9sZU9mZnNldCx1PTEvKDErTWF0aC5zcXJ0KDEtcypzLWYqZikpLGM9bWg7Y1swXT0xLXUqcypzLGNbM109LXUqcypmLGNbNl09cyxjWzFdPS11KnMqZixjWzRdPTEtdSpmKmYsY1s3XT1mLGNbMl09LXMsY1s1XT0tZixjWzhdPTEtdSoocypzK2YqZik7bGV0IGw9US5mcm9tUm90YXRpb25aKC1pLnMsaGgpLHA9US5tdWx0aXBseShjLGwsbWgpLGQ9dC5kYXlOdW1iZXIsbT10LnNlY29uZHNPZkRheS1rbi5jb21wdXRlVGFpTWludXNVdGModCkrbi51dDFNaW51c1V0YyxfPWQtMjQ1MTU0NSxnPW0veW4uU0VDT05EU19QRVJfREFZLGI9Ljc3OTA1NzI3MzI2NCtnKy4wMDI3Mzc4MTE5MTEzNTQ0OCooXytnKTtiPWIlMSpNLlRXT19QSTtsZXQgVD1RLmZyb21Sb3RhdGlvblooYixoaCksTz1RLm11bHRpcGx5KHAsVCxtaCksRT1NYXRoLmNvcyhuLnhQb2xlV2FuZGVyKSx3PU1hdGguY29zKG4ueVBvbGVXYW5kZXIpLEM9TWF0aC5zaW4obi54UG9sZVdhbmRlciksTj1NYXRoLnNpbihuLnlQb2xlV2FuZGVyKSxJPW8tZDMrci95bi5TRUNPTkRTX1BFUl9EQVk7SS89MzY1MjU7bGV0IEQ9LTQ3ZS02KkkqTS5SQURJQU5TX1BFUl9ERUdSRUUvMzYwMCx2PU1hdGguY29zKEQpLEw9TWF0aC5zaW4oRCksVT1oaDtyZXR1cm4gVVswXT1FKnYsVVsxXT1FKkwsVVsyXT1DLFVbM109LXcqTCtOKkMqdixVWzRdPXcqditOKkMqTCxVWzVdPS1OKkUsVVs2XT0tTipMLXcqQyp2LFVbN109Tip2LXcqQypMLFVbOF09dypFLFEubXVsdGlwbHkoTyxVLGUpfTtiMz1uZXcgaGU7UmUucG9pbnRUb1dpbmRvd0Nvb3JkaW5hdGVzPWZ1bmN0aW9uKHQsZSxuLG8pe3JldHVybiBvPVJlLnBvaW50VG9HTFdpbmRvd0Nvb3JkaW5hdGVzKHQsZSxuLG8pLG8ueT0yKmVbNV0tby55LG99O1JlLnBvaW50VG9HTFdpbmRvd0Nvb3JkaW5hdGVzPWZ1bmN0aW9uKHQsZSxuLG8pe2lmKCFoKHQpKXRocm93IG5ldyBCKCJtb2RlbFZpZXdQcm9qZWN0aW9uTWF0cml4IGlzIHJlcXVpcmVkLiIpO2lmKCFoKGUpKXRocm93IG5ldyBCKCJ2aWV3cG9ydFRyYW5zZm9ybWF0aW9uIGlzIHJlcXVpcmVkLiIpO2lmKCFoKG4pKXRocm93IG5ldyBCKCJwb2ludCBpcyByZXF1aXJlZC4iKTtoKG8pfHwobz1uZXcgdHQpO2xldCByPWIzO3JldHVybiBzdC5tdWx0aXBseUJ5VmVjdG9yKHQsaGUuZnJvbUVsZW1lbnRzKG4ueCxuLnksbi56LDEsciksciksaGUubXVsdGlwbHlCeVNjYWxhcihyLDEvci53LHIpLHN0Lm11bHRpcGx5QnlWZWN0b3IoZSxyLHIpLHR0LmZyb21DYXJ0ZXNpYW40KHIsbyl9O1QzPW5ldyBhLHczPW5ldyBhLE8zPW5ldyBhO1JlLnJvdGF0aW9uTWF0cml4RnJvbVBvc2l0aW9uVmVsb2NpdHk9ZnVuY3Rpb24odCxlLG4sbyl7aWYoIWgodCkpdGhyb3cgbmV3IEIoInBvc2l0aW9uIGlzIHJlcXVpcmVkLiIpO2lmKCFoKGUpKXRocm93IG5ldyBCKCJ2ZWxvY2l0eSBpcyByZXF1aXJlZC4iKTtsZXQgcj14KG4sJC5kZWZhdWx0KS5nZW9kZXRpY1N1cmZhY2VOb3JtYWwodCxUMyksaT1hLmNyb3NzKGUscix3Myk7YS5lcXVhbHNFcHNpbG9uKGksYS5aRVJPLE0uRVBTSUxPTjYpJiYoaT1hLmNsb25lKGEuVU5JVF9YLGkpKTtsZXQgcz1hLmNyb3NzKGksZSxPMyk7cmV0dXJuIGEubm9ybWFsaXplKHMscyksYS5jcm9zcyhlLHMsaSksYS5uZWdhdGUoaSxpKSxhLm5vcm1hbGl6ZShpLGkpLGgobyl8fChvPW5ldyBRKSxvWzBdPWUueCxvWzFdPWUueSxvWzJdPWUueixvWzNdPWkueCxvWzRdPWkueSxvWzVdPWkueixvWzZdPXMueCxvWzddPXMueSxvWzhdPXMueixvfTtyYj1uZXcgc3QoMCwwLDEsMCwxLDAsMCwwLDAsMSwwLDAsMCwwLDAsMSksaWI9bmV3IGN0LHloPW5ldyBhLEUzPW5ldyBhLFIzPW5ldyBRLGdoPW5ldyBzdCxzYj1uZXcgc3Q7UmUuYmFzaXNUbzJEPWZ1bmN0aW9uKHQsZSxuKXtpZighaCh0KSl0aHJvdyBuZXcgQigicHJvamVjdGlvbiBpcyByZXF1aXJlZC4iKTtpZighaChlKSl0aHJvdyBuZXcgQigibWF0cml4IGlzIHJlcXVpcmVkLiIpO2lmKCFoKG4pKXRocm93IG5ldyBCKCJyZXN1bHQgaXMgcmVxdWlyZWQuIik7bGV0IG89c3QuZ2V0VHJhbnNsYXRpb24oZSxFMykscj10LmVsbGlwc29pZCxpO2lmKGEuZXF1YWxzKG8sYS5aRVJPKSlpPWEuY2xvbmUoYS5aRVJPLHloKTtlbHNle2xldCBsPXIuY2FydGVzaWFuVG9DYXJ0b2dyYXBoaWMobyxpYik7aT10LnByb2plY3QobCx5aCksYS5mcm9tRWxlbWVudHMoaS56LGkueCxpLnksaSl9bGV0IHM9UmUuZWFzdE5vcnRoVXBUb0ZpeGVkRnJhbWUobyxyLGdoKSxmPXN0LmludmVyc2VUcmFuc2Zvcm1hdGlvbihzLHNiKSx1PXN0LmdldE1hdHJpeDMoZSxSMyksYz1zdC5tdWx0aXBseUJ5TWF0cml4MyhmLHUsbik7cmV0dXJuIHN0Lm11bHRpcGx5KHJiLGMsbiksc3Quc2V0VHJhbnNsYXRpb24obixpLG4pLG59O1JlLmVsbGlwc29pZFRvMkRNb2RlbE1hdHJpeD1mdW5jdGlvbih0LGUsbil7aWYoIWgodCkpdGhyb3cgbmV3IEIoInByb2plY3Rpb24gaXMgcmVxdWlyZWQuIik7aWYoIWgoZSkpdGhyb3cgbmV3IEIoImNlbnRlciBpcyByZXF1aXJlZC4iKTtpZighaChuKSl0aHJvdyBuZXcgQigicmVzdWx0IGlzIHJlcXVpcmVkLiIpO2xldCBvPXQuZWxsaXBzb2lkLHI9UmUuZWFzdE5vcnRoVXBUb0ZpeGVkRnJhbWUoZSxvLGdoKSxpPXN0LmludmVyc2VUcmFuc2Zvcm1hdGlvbihyLHNiKSxzPW8uY2FydGVzaWFuVG9DYXJ0b2dyYXBoaWMoZSxpYiksZj10LnByb2plY3Qocyx5aCk7YS5mcm9tRWxlbWVudHMoZi56LGYueCxmLnksZik7bGV0IHU9c3QuZnJvbVRyYW5zbGF0aW9uKGYsZ2gpO3JldHVybiBzdC5tdWx0aXBseShyYixpLG4pLHN0Lm11bHRpcGx5KHUsbixuKSxufTtYbz1SZX0pO2Z1bmN0aW9uIGFlKHQsZSxuLG8pe3RoaXMud2VzdD14KHQsMCksdGhpcy5zb3V0aD14KGUsMCksdGhpcy5lYXN0PXgobiwwKSx0aGlzLm5vcnRoPXgobywwKX12YXIgUzMsQzMseDMsUDMsTTMsQWgsTjMsTnQsd249WigoKT0+e0Z0KCk7SWUoKTtYdCgpO0l0KCk7ZnQoKTtadCgpO1d0KCk7Y3MoKTtVbigpO09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGFlLnByb3RvdHlwZSx7d2lkdGg6e2dldDpmdW5jdGlvbigpe3JldHVybiBhZS5jb21wdXRlV2lkdGgodGhpcyl9fSxoZWlnaHQ6e2dldDpmdW5jdGlvbigpe3JldHVybiBhZS5jb21wdXRlSGVpZ2h0KHRoaXMpfX19KTthZS5wYWNrZWRMZW5ndGg9NDthZS5wYWNrPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4geS50eXBlT2Yub2JqZWN0KCJ2YWx1ZSIsdCkseS5kZWZpbmVkKCJhcnJheSIsZSksbj14KG4sMCksZVtuKytdPXQud2VzdCxlW24rK109dC5zb3V0aCxlW24rK109dC5lYXN0LGVbbl09dC5ub3J0aCxlfTthZS51bnBhY2s9ZnVuY3Rpb24odCxlLG4pe3JldHVybiB5LmRlZmluZWQoImFycmF5Iix0KSxlPXgoZSwwKSxoKG4pfHwobj1uZXcgYWUpLG4ud2VzdD10W2UrK10sbi5zb3V0aD10W2UrK10sbi5lYXN0PXRbZSsrXSxuLm5vcnRoPXRbZV0sbn07YWUuY29tcHV0ZVdpZHRoPWZ1bmN0aW9uKHQpe3kudHlwZU9mLm9iamVjdCgicmVjdGFuZ2xlIix0KTtsZXQgZT10LmVhc3Qsbj10Lndlc3Q7cmV0dXJuIGU8biYmKGUrPU0uVFdPX1BJKSxlLW59O2FlLmNvbXB1dGVIZWlnaHQ9ZnVuY3Rpb24odCl7cmV0dXJuIHkudHlwZU9mLm9iamVjdCgicmVjdGFuZ2xlIix0KSx0Lm5vcnRoLXQuc291dGh9O2FlLmZyb21EZWdyZWVzPWZ1bmN0aW9uKHQsZSxuLG8scil7cmV0dXJuIHQ9TS50b1JhZGlhbnMoeCh0LDApKSxlPU0udG9SYWRpYW5zKHgoZSwwKSksbj1NLnRvUmFkaWFucyh4KG4sMCkpLG89TS50b1JhZGlhbnMoeChvLDApKSxoKHIpPyhyLndlc3Q9dCxyLnNvdXRoPWUsci5lYXN0PW4sci5ub3J0aD1vLHIpOm5ldyBhZSh0LGUsbixvKX07YWUuZnJvbVJhZGlhbnM9ZnVuY3Rpb24odCxlLG4sbyxyKXtyZXR1cm4gaChyKT8oci53ZXN0PXgodCwwKSxyLnNvdXRoPXgoZSwwKSxyLmVhc3Q9eChuLDApLHIubm9ydGg9eChvLDApLHIpOm5ldyBhZSh0LGUsbixvKX07YWUuZnJvbUNhcnRvZ3JhcGhpY0FycmF5PWZ1bmN0aW9uKHQsZSl7eS5kZWZpbmVkKCJjYXJ0b2dyYXBoaWNzIix0KTtsZXQgbj1OdW1iZXIuTUFYX1ZBTFVFLG89LU51bWJlci5NQVhfVkFMVUUscj1OdW1iZXIuTUFYX1ZBTFVFLGk9LU51bWJlci5NQVhfVkFMVUUscz1OdW1iZXIuTUFYX1ZBTFVFLGY9LU51bWJlci5NQVhfVkFMVUU7Zm9yKGxldCB1PTAsYz10Lmxlbmd0aDt1PGM7dSsrKXtsZXQgbD10W3VdO249TWF0aC5taW4obixsLmxvbmdpdHVkZSksbz1NYXRoLm1heChvLGwubG9uZ2l0dWRlKSxzPU1hdGgubWluKHMsbC5sYXRpdHVkZSksZj1NYXRoLm1heChmLGwubGF0aXR1ZGUpO2xldCBwPWwubG9uZ2l0dWRlPj0wP2wubG9uZ2l0dWRlOmwubG9uZ2l0dWRlK00uVFdPX1BJO3I9TWF0aC5taW4ocixwKSxpPU1hdGgubWF4KGkscCl9cmV0dXJuIG8tbj5pLXImJihuPXIsbz1pLG8+TS5QSSYmKG89by1NLlRXT19QSSksbj5NLlBJJiYobj1uLU0uVFdPX1BJKSksaChlKT8oZS53ZXN0PW4sZS5zb3V0aD1zLGUuZWFzdD1vLGUubm9ydGg9ZixlKTpuZXcgYWUobixzLG8sZil9O2FlLmZyb21DYXJ0ZXNpYW5BcnJheT1mdW5jdGlvbih0LGUsbil7eS5kZWZpbmVkKCJjYXJ0ZXNpYW5zIix0KSxlPXgoZSwkLmRlZmF1bHQpO2xldCBvPU51bWJlci5NQVhfVkFMVUUscj0tTnVtYmVyLk1BWF9WQUxVRSxpPU51bWJlci5NQVhfVkFMVUUscz0tTnVtYmVyLk1BWF9WQUxVRSxmPU51bWJlci5NQVhfVkFMVUUsdT0tTnVtYmVyLk1BWF9WQUxVRTtmb3IobGV0IGM9MCxsPXQubGVuZ3RoO2M8bDtjKyspe2xldCBwPWUuY2FydGVzaWFuVG9DYXJ0b2dyYXBoaWModFtjXSk7bz1NYXRoLm1pbihvLHAubG9uZ2l0dWRlKSxyPU1hdGgubWF4KHIscC5sb25naXR1ZGUpLGY9TWF0aC5taW4oZixwLmxhdGl0dWRlKSx1PU1hdGgubWF4KHUscC5sYXRpdHVkZSk7bGV0IGQ9cC5sb25naXR1ZGU+PTA/cC5sb25naXR1ZGU6cC5sb25naXR1ZGUrTS5UV09fUEk7aT1NYXRoLm1pbihpLGQpLHM9TWF0aC5tYXgocyxkKX1yZXR1cm4gci1vPnMtaSYmKG89aSxyPXMscj5NLlBJJiYocj1yLU0uVFdPX1BJKSxvPk0uUEkmJihvPW8tTS5UV09fUEkpKSxoKG4pPyhuLndlc3Q9byxuLnNvdXRoPWYsbi5lYXN0PXIsbi5ub3J0aD11LG4pOm5ldyBhZShvLGYscix1KX07UzM9bmV3IGEsQzM9bmV3IGEseDM9bmV3IGEsUDM9bmV3IGEsTTM9bmV3IGEsQWg9bmV3IEFycmF5KDUpO2ZvcihsZXQgdD0wO3Q8QWgubGVuZ3RoOysrdClBaFt0XT1uZXcgYTthZS5mcm9tQm91bmRpbmdTcGhlcmU9ZnVuY3Rpb24odCxlLG4pe3kudHlwZU9mLm9iamVjdCgiYm91bmRpbmdTcGhlcmUiLHQpO2xldCBvPXQuY2VudGVyLHI9dC5yYWRpdXM7aWYoaChlKXx8KGU9JC5kZWZhdWx0KSxoKG4pfHwobj1uZXcgYWUpLGEuZXF1YWxzKG8sYS5aRVJPKSlyZXR1cm4gYWUuY2xvbmUoYWUuTUFYX1ZBTFVFLG4pLG47bGV0IGk9WG8uZWFzdE5vcnRoVXBUb0ZpeGVkRnJhbWUobyxlLFMzKSxzPXN0Lm11bHRpcGx5QnlQb2ludEFzVmVjdG9yKGksYS5VTklUX1gsQzMpO2Eubm9ybWFsaXplKHMscyk7bGV0IGY9c3QubXVsdGlwbHlCeVBvaW50QXNWZWN0b3IoaSxhLlVOSVRfWSx4Myk7YS5ub3JtYWxpemUoZixmKSxhLm11bHRpcGx5QnlTY2FsYXIoZixyLGYpLGEubXVsdGlwbHlCeVNjYWxhcihzLHIscyk7bGV0IHU9YS5uZWdhdGUoZixNMyksYz1hLm5lZ2F0ZShzLFAzKSxsPUFoLHA9bFswXTtyZXR1cm4gYS5hZGQobyxmLHApLHA9bFsxXSxhLmFkZChvLGMscCkscD1sWzJdLGEuYWRkKG8sdSxwKSxwPWxbM10sYS5hZGQobyxzLHApLGxbNF09byxhZS5mcm9tQ2FydGVzaWFuQXJyYXkobCxlLG4pfTthZS5jbG9uZT1mdW5jdGlvbih0LGUpe2lmKGgodCkpcmV0dXJuIGgoZSk/KGUud2VzdD10Lndlc3QsZS5zb3V0aD10LnNvdXRoLGUuZWFzdD10LmVhc3QsZS5ub3J0aD10Lm5vcnRoLGUpOm5ldyBhZSh0Lndlc3QsdC5zb3V0aCx0LmVhc3QsdC5ub3J0aCl9O2FlLmVxdWFsc0Vwc2lsb249ZnVuY3Rpb24odCxlLG4pe3JldHVybiBuPXgobiwwKSx0PT09ZXx8aCh0KSYmaChlKSYmTWF0aC5hYnModC53ZXN0LWUud2VzdCk8PW4mJk1hdGguYWJzKHQuc291dGgtZS5zb3V0aCk8PW4mJk1hdGguYWJzKHQuZWFzdC1lLmVhc3QpPD1uJiZNYXRoLmFicyh0Lm5vcnRoLWUubm9ydGgpPD1ufTthZS5wcm90b3R5cGUuY2xvbmU9ZnVuY3Rpb24odCl7cmV0dXJuIGFlLmNsb25lKHRoaXMsdCl9O2FlLnByb3RvdHlwZS5lcXVhbHM9ZnVuY3Rpb24odCl7cmV0dXJuIGFlLmVxdWFscyh0aGlzLHQpfTthZS5lcXVhbHM9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdD09PWV8fGgodCkmJmgoZSkmJnQud2VzdD09PWUud2VzdCYmdC5zb3V0aD09PWUuc291dGgmJnQuZWFzdD09PWUuZWFzdCYmdC5ub3J0aD09PWUubm9ydGh9O2FlLnByb3RvdHlwZS5lcXVhbHNFcHNpbG9uPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGFlLmVxdWFsc0Vwc2lsb24odGhpcyx0LGUpfTthZS5fdmFsaWRhdGU9ZnVuY3Rpb24odCl7eS50eXBlT2Yub2JqZWN0KCJyZWN0YW5nbGUiLHQpO2xldCBlPXQubm9ydGg7eS50eXBlT2YubnVtYmVyLmdyZWF0ZXJUaGFuT3JFcXVhbHMoIm5vcnRoIixlLC1NLlBJX09WRVJfVFdPKSx5LnR5cGVPZi5udW1iZXIubGVzc1RoYW5PckVxdWFscygibm9ydGgiLGUsTS5QSV9PVkVSX1RXTyk7bGV0IG49dC5zb3V0aDt5LnR5cGVPZi5udW1iZXIuZ3JlYXRlclRoYW5PckVxdWFscygic291dGgiLG4sLU0uUElfT1ZFUl9UV08pLHkudHlwZU9mLm51bWJlci5sZXNzVGhhbk9yRXF1YWxzKCJzb3V0aCIsbixNLlBJX09WRVJfVFdPKTtsZXQgbz10Lndlc3Q7eS50eXBlT2YubnVtYmVyLmdyZWF0ZXJUaGFuT3JFcXVhbHMoIndlc3QiLG8sLU1hdGguUEkpLHkudHlwZU9mLm51bWJlci5sZXNzVGhhbk9yRXF1YWxzKCJ3ZXN0IixvLE1hdGguUEkpO2xldCByPXQuZWFzdDt5LnR5cGVPZi5udW1iZXIuZ3JlYXRlclRoYW5PckVxdWFscygiZWFzdCIsciwtTWF0aC5QSSkseS50eXBlT2YubnVtYmVyLmxlc3NUaGFuT3JFcXVhbHMoImVhc3QiLHIsTWF0aC5QSSl9O2FlLnNvdXRod2VzdD1mdW5jdGlvbih0LGUpe3JldHVybiB5LnR5cGVPZi5vYmplY3QoInJlY3RhbmdsZSIsdCksaChlKT8oZS5sb25naXR1ZGU9dC53ZXN0LGUubGF0aXR1ZGU9dC5zb3V0aCxlLmhlaWdodD0wLGUpOm5ldyBjdCh0Lndlc3QsdC5zb3V0aCl9O2FlLm5vcnRod2VzdD1mdW5jdGlvbih0LGUpe3JldHVybiB5LnR5cGVPZi5vYmplY3QoInJlY3RhbmdsZSIsdCksaChlKT8oZS5sb25naXR1ZGU9dC53ZXN0LGUubGF0aXR1ZGU9dC5ub3J0aCxlLmhlaWdodD0wLGUpOm5ldyBjdCh0Lndlc3QsdC5ub3J0aCl9O2FlLm5vcnRoZWFzdD1mdW5jdGlvbih0LGUpe3JldHVybiB5LnR5cGVPZi5vYmplY3QoInJlY3RhbmdsZSIsdCksaChlKT8oZS5sb25naXR1ZGU9dC5lYXN0LGUubGF0aXR1ZGU9dC5ub3J0aCxlLmhlaWdodD0wLGUpOm5ldyBjdCh0LmVhc3QsdC5ub3J0aCl9O2FlLnNvdXRoZWFzdD1mdW5jdGlvbih0LGUpe3JldHVybiB5LnR5cGVPZi5vYmplY3QoInJlY3RhbmdsZSIsdCksaChlKT8oZS5sb25naXR1ZGU9dC5lYXN0LGUubGF0aXR1ZGU9dC5zb3V0aCxlLmhlaWdodD0wLGUpOm5ldyBjdCh0LmVhc3QsdC5zb3V0aCl9O2FlLmNlbnRlcj1mdW5jdGlvbih0LGUpe3kudHlwZU9mLm9iamVjdCgicmVjdGFuZ2xlIix0KTtsZXQgbj10LmVhc3Qsbz10Lndlc3Q7bjxvJiYobis9TS5UV09fUEkpO2xldCByPU0ubmVnYXRpdmVQaVRvUGkoKG8rbikqLjUpLGk9KHQuc291dGgrdC5ub3J0aCkqLjU7cmV0dXJuIGgoZSk/KGUubG9uZ2l0dWRlPXIsZS5sYXRpdHVkZT1pLGUuaGVpZ2h0PTAsZSk6bmV3IGN0KHIsaSl9O2FlLmludGVyc2VjdGlvbj1mdW5jdGlvbih0LGUsbil7eS50eXBlT2Yub2JqZWN0KCJyZWN0YW5nbGUiLHQpLHkudHlwZU9mLm9iamVjdCgib3RoZXJSZWN0YW5nbGUiLGUpO2xldCBvPXQuZWFzdCxyPXQud2VzdCxpPWUuZWFzdCxzPWUud2VzdDtvPHImJmk+MD9vKz1NLlRXT19QSTppPHMmJm8+MCYmKGkrPU0uVFdPX1BJKSxvPHImJnM8MD9zKz1NLlRXT19QSTppPHMmJnI8MCYmKHIrPU0uVFdPX1BJKTtsZXQgZj1NLm5lZ2F0aXZlUGlUb1BpKE1hdGgubWF4KHIscykpLHU9TS5uZWdhdGl2ZVBpVG9QaShNYXRoLm1pbihvLGkpKTtpZigodC53ZXN0PHQuZWFzdHx8ZS53ZXN0PGUuZWFzdCkmJnU8PWYpcmV0dXJuO2xldCBjPU1hdGgubWF4KHQuc291dGgsZS5zb3V0aCksbD1NYXRoLm1pbih0Lm5vcnRoLGUubm9ydGgpO2lmKCEoYz49bCkpcmV0dXJuIGgobik/KG4ud2VzdD1mLG4uc291dGg9YyxuLmVhc3Q9dSxuLm5vcnRoPWwsbik6bmV3IGFlKGYsYyx1LGwpfTthZS5zaW1wbGVJbnRlcnNlY3Rpb249ZnVuY3Rpb24odCxlLG4pe3kudHlwZU9mLm9iamVjdCgicmVjdGFuZ2xlIix0KSx5LnR5cGVPZi5vYmplY3QoIm90aGVyUmVjdGFuZ2xlIixlKTtsZXQgbz1NYXRoLm1heCh0Lndlc3QsZS53ZXN0KSxyPU1hdGgubWF4KHQuc291dGgsZS5zb3V0aCksaT1NYXRoLm1pbih0LmVhc3QsZS5lYXN0KSxzPU1hdGgubWluKHQubm9ydGgsZS5ub3J0aCk7aWYoIShyPj1zfHxvPj1pKSlyZXR1cm4gaChuKT8obi53ZXN0PW8sbi5zb3V0aD1yLG4uZWFzdD1pLG4ubm9ydGg9cyxuKTpuZXcgYWUobyxyLGkscyl9O2FlLnVuaW9uPWZ1bmN0aW9uKHQsZSxuKXt5LnR5cGVPZi5vYmplY3QoInJlY3RhbmdsZSIsdCkseS50eXBlT2Yub2JqZWN0KCJvdGhlclJlY3RhbmdsZSIsZSksaChuKXx8KG49bmV3IGFlKTtsZXQgbz10LmVhc3Qscj10Lndlc3QsaT1lLmVhc3Qscz1lLndlc3Q7bzxyJiZpPjA/bys9TS5UV09fUEk6aTxzJiZvPjAmJihpKz1NLlRXT19QSSksbzxyJiZzPDA/cys9TS5UV09fUEk6aTxzJiZyPDAmJihyKz1NLlRXT19QSSk7bGV0IGY9TS5uZWdhdGl2ZVBpVG9QaShNYXRoLm1pbihyLHMpKSx1PU0ubmVnYXRpdmVQaVRvUGkoTWF0aC5tYXgobyxpKSk7cmV0dXJuIG4ud2VzdD1mLG4uc291dGg9TWF0aC5taW4odC5zb3V0aCxlLnNvdXRoKSxuLmVhc3Q9dSxuLm5vcnRoPU1hdGgubWF4KHQubm9ydGgsZS5ub3J0aCksbn07YWUuZXhwYW5kPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4geS50eXBlT2Yub2JqZWN0KCJyZWN0YW5nbGUiLHQpLHkudHlwZU9mLm9iamVjdCgiY2FydG9ncmFwaGljIixlKSxoKG4pfHwobj1uZXcgYWUpLG4ud2VzdD1NYXRoLm1pbih0Lndlc3QsZS5sb25naXR1ZGUpLG4uc291dGg9TWF0aC5taW4odC5zb3V0aCxlLmxhdGl0dWRlKSxuLmVhc3Q9TWF0aC5tYXgodC5lYXN0LGUubG9uZ2l0dWRlKSxuLm5vcnRoPU1hdGgubWF4KHQubm9ydGgsZS5sYXRpdHVkZSksbn07YWUuY29udGFpbnM9ZnVuY3Rpb24odCxlKXt5LnR5cGVPZi5vYmplY3QoInJlY3RhbmdsZSIsdCkseS50eXBlT2Yub2JqZWN0KCJjYXJ0b2dyYXBoaWMiLGUpO2xldCBuPWUubG9uZ2l0dWRlLG89ZS5sYXRpdHVkZSxyPXQud2VzdCxpPXQuZWFzdDtyZXR1cm4gaTxyJiYoaSs9TS5UV09fUEksbjwwJiYobis9TS5UV09fUEkpKSwobj5yfHxNLmVxdWFsc0Vwc2lsb24obixyLE0uRVBTSUxPTjE0KSkmJihuPGl8fE0uZXF1YWxzRXBzaWxvbihuLGksTS5FUFNJTE9OMTQpKSYmbz49dC5zb3V0aCYmbzw9dC5ub3J0aH07TjM9bmV3IGN0O2FlLnN1YnNhbXBsZT1mdW5jdGlvbih0LGUsbixvKXt5LnR5cGVPZi5vYmplY3QoInJlY3RhbmdsZSIsdCksZT14KGUsJC5kZWZhdWx0KSxuPXgobiwwKSxoKG8pfHwobz1bXSk7bGV0IHI9MCxpPXQubm9ydGgscz10LnNvdXRoLGY9dC5lYXN0LHU9dC53ZXN0LGM9TjM7Yy5oZWlnaHQ9bixjLmxvbmdpdHVkZT11LGMubGF0aXR1ZGU9aSxvW3JdPWUuY2FydG9ncmFwaGljVG9DYXJ0ZXNpYW4oYyxvW3JdKSxyKyssYy5sb25naXR1ZGU9ZixvW3JdPWUuY2FydG9ncmFwaGljVG9DYXJ0ZXNpYW4oYyxvW3JdKSxyKyssYy5sYXRpdHVkZT1zLG9bcl09ZS5jYXJ0b2dyYXBoaWNUb0NhcnRlc2lhbihjLG9bcl0pLHIrKyxjLmxvbmdpdHVkZT11LG9bcl09ZS5jYXJ0b2dyYXBoaWNUb0NhcnRlc2lhbihjLG9bcl0pLHIrKyxpPDA/Yy5sYXRpdHVkZT1pOnM+MD9jLmxhdGl0dWRlPXM6Yy5sYXRpdHVkZT0wO2ZvcihsZXQgbD0xO2w8ODsrK2wpYy5sb25naXR1ZGU9LU1hdGguUEkrbCpNLlBJX09WRVJfVFdPLGFlLmNvbnRhaW5zKHQsYykmJihvW3JdPWUuY2FydG9ncmFwaGljVG9DYXJ0ZXNpYW4oYyxvW3JdKSxyKyspO3JldHVybiBjLmxhdGl0dWRlPT09MCYmKGMubG9uZ2l0dWRlPXUsb1tyXT1lLmNhcnRvZ3JhcGhpY1RvQ2FydGVzaWFuKGMsb1tyXSkscisrLGMubG9uZ2l0dWRlPWYsb1tyXT1lLmNhcnRvZ3JhcGhpY1RvQ2FydGVzaWFuKGMsb1tyXSkscisrKSxvLmxlbmd0aD1yLG99O2FlLnN1YnNlY3Rpb249ZnVuY3Rpb24odCxlLG4sbyxyLGkpe2lmKHkudHlwZU9mLm9iamVjdCgicmVjdGFuZ2xlIix0KSx5LnR5cGVPZi5udW1iZXIuZ3JlYXRlclRoYW5PckVxdWFscygid2VzdExlcnAiLGUsMCkseS50eXBlT2YubnVtYmVyLmxlc3NUaGFuT3JFcXVhbHMoIndlc3RMZXJwIixlLDEpLHkudHlwZU9mLm51bWJlci5ncmVhdGVyVGhhbk9yRXF1YWxzKCJzb3V0aExlcnAiLG4sMCkseS50eXBlT2YubnVtYmVyLmxlc3NUaGFuT3JFcXVhbHMoInNvdXRoTGVycCIsbiwxKSx5LnR5cGVPZi5udW1iZXIuZ3JlYXRlclRoYW5PckVxdWFscygiZWFzdExlcnAiLG8sMCkseS50eXBlT2YubnVtYmVyLmxlc3NUaGFuT3JFcXVhbHMoImVhc3RMZXJwIixvLDEpLHkudHlwZU9mLm51bWJlci5ncmVhdGVyVGhhbk9yRXF1YWxzKCJub3J0aExlcnAiLHIsMCkseS50eXBlT2YubnVtYmVyLmxlc3NUaGFuT3JFcXVhbHMoIm5vcnRoTGVycCIsciwxKSx5LnR5cGVPZi5udW1iZXIubGVzc1RoYW5PckVxdWFscygid2VzdExlcnAiLGUsbykseS50eXBlT2YubnVtYmVyLmxlc3NUaGFuT3JFcXVhbHMoInNvdXRoTGVycCIsbixyKSxoKGkpfHwoaT1uZXcgYWUpLHQud2VzdDw9dC5lYXN0KXtsZXQgZj10LmVhc3QtdC53ZXN0O2kud2VzdD10Lndlc3QrZSpmLGkuZWFzdD10Lndlc3QrbypmfWVsc2V7bGV0IGY9TS5UV09fUEkrdC5lYXN0LXQud2VzdDtpLndlc3Q9TS5uZWdhdGl2ZVBpVG9QaSh0Lndlc3QrZSpmKSxpLmVhc3Q9TS5uZWdhdGl2ZVBpVG9QaSh0Lndlc3QrbypmKX1sZXQgcz10Lm5vcnRoLXQuc291dGg7cmV0dXJuIGkuc291dGg9dC5zb3V0aCtuKnMsaS5ub3J0aD10LnNvdXRoK3IqcyxlPT09MSYmKGkud2VzdD10LmVhc3QpLG89PT0xJiYoaS5lYXN0PXQuZWFzdCksbj09PTEmJihpLnNvdXRoPXQubm9ydGgpLHI9PT0xJiYoaS5ub3J0aD10Lm5vcnRoKSxpfTthZS5NQVhfVkFMVUU9T2JqZWN0LmZyZWV6ZShuZXcgYWUoLU1hdGguUEksLU0uUElfT1ZFUl9UV08sTWF0aC5QSSxNLlBJX09WRVJfVFdPKSk7TnQ9YWV9KTtmdW5jdGlvbiBuZSh0LGUpe3RoaXMuY2VudGVyPWEuY2xvbmUoeCh0LGEuWkVSTykpLHRoaXMucmFkaXVzPXgoZSwwKX12YXIgd2gsT2gsRWgsUmgsU2gsQ2gseGgsaW8sUGgsTWgsTmgsSWgsSTMsY2IsdjMsTDMsYmgsVGgsRDMsRjMsQjMsVTMsVjMsazMsRzMsejMsajMsSDMscTMsSzMsYWIsVzMsWDMsWTMsJDMsWjMsdWIsZmIsQXQsdmU9WigoKT0+e0Z0KCk7SWUoKTtYdCgpO0l0KCk7ZnQoKTtadCgpO1NpKCk7a3MoKTtIbCgpO1d0KCk7Qm4oKTtVbigpO3duKCk7d2g9bmV3IGEsT2g9bmV3IGEsRWg9bmV3IGEsUmg9bmV3IGEsU2g9bmV3IGEsQ2g9bmV3IGEseGg9bmV3IGEsaW89bmV3IGEsUGg9bmV3IGEsTWg9bmV3IGEsTmg9bmV3IGEsSWg9bmV3IGEsSTM9NC8zKk0uUEk7bmUuZnJvbVBvaW50cz1mdW5jdGlvbih0LGUpe2lmKGgoZSl8fChlPW5ldyBuZSksIWgodCl8fHQubGVuZ3RoPT09MClyZXR1cm4gZS5jZW50ZXI9YS5jbG9uZShhLlpFUk8sZS5jZW50ZXIpLGUucmFkaXVzPTAsZTtsZXQgbj1hLmNsb25lKHRbMF0seGgpLG89YS5jbG9uZShuLHdoKSxyPWEuY2xvbmUobixPaCksaT1hLmNsb25lKG4sRWgpLHM9YS5jbG9uZShuLFJoKSxmPWEuY2xvbmUobixTaCksdT1hLmNsb25lKG4sQ2gpLGM9dC5sZW5ndGgsbDtmb3IobD0xO2w8YztsKyspe2EuY2xvbmUodFtsXSxuKTtsZXQgRD1uLngsdj1uLnksTD1uLno7RDxvLngmJmEuY2xvbmUobixvKSxEPnMueCYmYS5jbG9uZShuLHMpLHY8ci55JiZhLmNsb25lKG4sciksdj5mLnkmJmEuY2xvbmUobixmKSxMPGkueiYmYS5jbG9uZShuLGkpLEw+dS56JiZhLmNsb25lKG4sdSl9bGV0IHA9YS5tYWduaXR1ZGVTcXVhcmVkKGEuc3VidHJhY3QocyxvLGlvKSksZD1hLm1hZ25pdHVkZVNxdWFyZWQoYS5zdWJ0cmFjdChmLHIsaW8pKSxtPWEubWFnbml0dWRlU3F1YXJlZChhLnN1YnRyYWN0KHUsaSxpbykpLF89byxnPXMsYj1wO2Q+YiYmKGI9ZCxfPXIsZz1mKSxtPmImJihiPW0sXz1pLGc9dSk7bGV0IFQ9UGg7VC54PShfLngrZy54KSouNSxULnk9KF8ueStnLnkpKi41LFQuej0oXy56K2cueikqLjU7bGV0IE89YS5tYWduaXR1ZGVTcXVhcmVkKGEuc3VidHJhY3QoZyxULGlvKSksRT1NYXRoLnNxcnQoTyksdz1NaDt3Lng9by54LHcueT1yLnksdy56PWkuejtsZXQgQz1OaDtDLng9cy54LEMueT1mLnksQy56PXUuejtsZXQgTj1hLm1pZHBvaW50KHcsQyxJaCksST0wO2ZvcihsPTA7bDxjO2wrKyl7YS5jbG9uZSh0W2xdLG4pO2xldCBEPWEubWFnbml0dWRlKGEuc3VidHJhY3QobixOLGlvKSk7RD5JJiYoST1EKTtsZXQgdj1hLm1hZ25pdHVkZVNxdWFyZWQoYS5zdWJ0cmFjdChuLFQsaW8pKTtpZih2Pk8pe2xldCBMPU1hdGguc3FydCh2KTtFPShFK0wpKi41LE89RSpFO2xldCBVPUwtRTtULng9KEUqVC54K1Uqbi54KS9MLFQueT0oRSpULnkrVSpuLnkpL0wsVC56PShFKlQueitVKm4ueikvTH19cmV0dXJuIEU8ST8oYS5jbG9uZShULGUuY2VudGVyKSxlLnJhZGl1cz1FKTooYS5jbG9uZShOLGUuY2VudGVyKSxlLnJhZGl1cz1JKSxlfTtjYj1uZXcgSm4sdjM9bmV3IGEsTDM9bmV3IGEsYmg9bmV3IGN0LFRoPW5ldyBjdDtuZS5mcm9tUmVjdGFuZ2xlMkQ9ZnVuY3Rpb24odCxlLG4pe3JldHVybiBuZS5mcm9tUmVjdGFuZ2xlV2l0aEhlaWdodHMyRCh0LGUsMCwwLG4pfTtuZS5mcm9tUmVjdGFuZ2xlV2l0aEhlaWdodHMyRD1mdW5jdGlvbih0LGUsbixvLHIpe2lmKGgocil8fChyPW5ldyBuZSksIWgodCkpcmV0dXJuIHIuY2VudGVyPWEuY2xvbmUoYS5aRVJPLHIuY2VudGVyKSxyLnJhZGl1cz0wLHI7Y2IuX2VsbGlwc29pZD0kLmRlZmF1bHQsZT14KGUsY2IpLE50LnNvdXRod2VzdCh0LGJoKSxiaC5oZWlnaHQ9bixOdC5ub3J0aGVhc3QodCxUaCksVGguaGVpZ2h0PW87bGV0IGk9ZS5wcm9qZWN0KGJoLHYzKSxzPWUucHJvamVjdChUaCxMMyksZj1zLngtaS54LHU9cy55LWkueSxjPXMuei1pLno7ci5yYWRpdXM9TWF0aC5zcXJ0KGYqZit1KnUrYypjKSouNTtsZXQgbD1yLmNlbnRlcjtyZXR1cm4gbC54PWkueCtmKi41LGwueT1pLnkrdSouNSxsLno9aS56K2MqLjUscn07RDM9W107bmUuZnJvbVJlY3RhbmdsZTNEPWZ1bmN0aW9uKHQsZSxuLG8pe2lmKGU9eChlLCQuZGVmYXVsdCksbj14KG4sMCksaChvKXx8KG89bmV3IG5lKSwhaCh0KSlyZXR1cm4gby5jZW50ZXI9YS5jbG9uZShhLlpFUk8sby5jZW50ZXIpLG8ucmFkaXVzPTAsbztsZXQgcj1OdC5zdWJzYW1wbGUodCxlLG4sRDMpO3JldHVybiBuZS5mcm9tUG9pbnRzKHIsbyl9O25lLmZyb21WZXJ0aWNlcz1mdW5jdGlvbih0LGUsbixvKXtpZihoKG8pfHwobz1uZXcgbmUpLCFoKHQpfHx0Lmxlbmd0aD09PTApcmV0dXJuIG8uY2VudGVyPWEuY2xvbmUoYS5aRVJPLG8uY2VudGVyKSxvLnJhZGl1cz0wLG87ZT14KGUsYS5aRVJPKSxuPXgobiwzKSx5LnR5cGVPZi5udW1iZXIuZ3JlYXRlclRoYW5PckVxdWFscygic3RyaWRlIixuLDMpO2xldCByPXhoO3IueD10WzBdK2UueCxyLnk9dFsxXStlLnksci56PXRbMl0rZS56O2xldCBpPWEuY2xvbmUocix3aCkscz1hLmNsb25lKHIsT2gpLGY9YS5jbG9uZShyLEVoKSx1PWEuY2xvbmUocixSaCksYz1hLmNsb25lKHIsU2gpLGw9YS5jbG9uZShyLENoKSxwPXQubGVuZ3RoLGQ7Zm9yKGQ9MDtkPHA7ZCs9bil7bGV0IEw9dFtkXStlLngsVT10W2QrMV0rZS55LEE9dFtkKzJdK2UuejtyLng9TCxyLnk9VSxyLno9QSxMPGkueCYmYS5jbG9uZShyLGkpLEw+dS54JiZhLmNsb25lKHIsdSksVTxzLnkmJmEuY2xvbmUocixzKSxVPmMueSYmYS5jbG9uZShyLGMpLEE8Zi56JiZhLmNsb25lKHIsZiksQT5sLnomJmEuY2xvbmUocixsKX1sZXQgbT1hLm1hZ25pdHVkZVNxdWFyZWQoYS5zdWJ0cmFjdCh1LGksaW8pKSxfPWEubWFnbml0dWRlU3F1YXJlZChhLnN1YnRyYWN0KGMscyxpbykpLGc9YS5tYWduaXR1ZGVTcXVhcmVkKGEuc3VidHJhY3QobCxmLGlvKSksYj1pLFQ9dSxPPW07Xz5PJiYoTz1fLGI9cyxUPWMpLGc+TyYmKE89ZyxiPWYsVD1sKTtsZXQgRT1QaDtFLng9KGIueCtULngpKi41LEUueT0oYi55K1QueSkqLjUsRS56PShiLnorVC56KSouNTtsZXQgdz1hLm1hZ25pdHVkZVNxdWFyZWQoYS5zdWJ0cmFjdChULEUsaW8pKSxDPU1hdGguc3FydCh3KSxOPU1oO04ueD1pLngsTi55PXMueSxOLno9Zi56O2xldCBJPU5oO0kueD11LngsSS55PWMueSxJLno9bC56O2xldCBEPWEubWlkcG9pbnQoTixJLEloKSx2PTA7Zm9yKGQ9MDtkPHA7ZCs9bil7ci54PXRbZF0rZS54LHIueT10W2QrMV0rZS55LHIuej10W2QrMl0rZS56O2xldCBMPWEubWFnbml0dWRlKGEuc3VidHJhY3QocixELGlvKSk7TD52JiYodj1MKTtsZXQgVT1hLm1hZ25pdHVkZVNxdWFyZWQoYS5zdWJ0cmFjdChyLEUsaW8pKTtpZihVPncpe2xldCBBPU1hdGguc3FydChVKTtDPShDK0EpKi41LHc9QypDO2xldCBTPUEtQztFLng9KEMqRS54K1Mqci54KS9BLEUueT0oQypFLnkrUypyLnkpL0EsRS56PShDKkUueitTKnIueikvQX19cmV0dXJuIEM8dj8oYS5jbG9uZShFLG8uY2VudGVyKSxvLnJhZGl1cz1DKTooYS5jbG9uZShELG8uY2VudGVyKSxvLnJhZGl1cz12KSxvfTtuZS5mcm9tRW5jb2RlZENhcnRlc2lhblZlcnRpY2VzPWZ1bmN0aW9uKHQsZSxuKXtpZihoKG4pfHwobj1uZXcgbmUpLCFoKHQpfHwhaChlKXx8dC5sZW5ndGghPT1lLmxlbmd0aHx8dC5sZW5ndGg9PT0wKXJldHVybiBuLmNlbnRlcj1hLmNsb25lKGEuWkVSTyxuLmNlbnRlciksbi5yYWRpdXM9MCxuO2xldCBvPXhoO28ueD10WzBdK2VbMF0sby55PXRbMV0rZVsxXSxvLno9dFsyXStlWzJdO2xldCByPWEuY2xvbmUobyx3aCksaT1hLmNsb25lKG8sT2gpLHM9YS5jbG9uZShvLEVoKSxmPWEuY2xvbmUobyxSaCksdT1hLmNsb25lKG8sU2gpLGM9YS5jbG9uZShvLENoKSxsPXQubGVuZ3RoLHA7Zm9yKHA9MDtwPGw7cCs9Myl7bGV0IHY9dFtwXStlW3BdLEw9dFtwKzFdK2VbcCsxXSxVPXRbcCsyXStlW3ArMl07by54PXYsby55PUwsby56PVUsdjxyLngmJmEuY2xvbmUobyxyKSx2PmYueCYmYS5jbG9uZShvLGYpLEw8aS55JiZhLmNsb25lKG8saSksTD51LnkmJmEuY2xvbmUobyx1KSxVPHMueiYmYS5jbG9uZShvLHMpLFU+Yy56JiZhLmNsb25lKG8sYyl9bGV0IGQ9YS5tYWduaXR1ZGVTcXVhcmVkKGEuc3VidHJhY3QoZixyLGlvKSksbT1hLm1hZ25pdHVkZVNxdWFyZWQoYS5zdWJ0cmFjdCh1LGksaW8pKSxfPWEubWFnbml0dWRlU3F1YXJlZChhLnN1YnRyYWN0KGMscyxpbykpLGc9cixiPWYsVD1kO20+VCYmKFQ9bSxnPWksYj11KSxfPlQmJihUPV8sZz1zLGI9Yyk7bGV0IE89UGg7Ty54PShnLngrYi54KSouNSxPLnk9KGcueStiLnkpKi41LE8uej0oZy56K2IueikqLjU7bGV0IEU9YS5tYWduaXR1ZGVTcXVhcmVkKGEuc3VidHJhY3QoYixPLGlvKSksdz1NYXRoLnNxcnQoRSksQz1NaDtDLng9ci54LEMueT1pLnksQy56PXMuejtsZXQgTj1OaDtOLng9Zi54LE4ueT11LnksTi56PWMuejtsZXQgST1hLm1pZHBvaW50KEMsTixJaCksRD0wO2ZvcihwPTA7cDxsO3ArPTMpe28ueD10W3BdK2VbcF0sby55PXRbcCsxXStlW3ArMV0sby56PXRbcCsyXStlW3ArMl07bGV0IHY9YS5tYWduaXR1ZGUoYS5zdWJ0cmFjdChvLEksaW8pKTt2PkQmJihEPXYpO2xldCBMPWEubWFnbml0dWRlU3F1YXJlZChhLnN1YnRyYWN0KG8sTyxpbykpO2lmKEw+RSl7bGV0IFU9TWF0aC5zcXJ0KEwpO3c9KHcrVSkqLjUsRT13Knc7bGV0IEE9VS13O08ueD0odypPLngrQSpvLngpL1UsTy55PSh3Kk8ueStBKm8ueSkvVSxPLno9KHcqTy56K0Eqby56KS9VfX1yZXR1cm4gdzxEPyhhLmNsb25lKE8sbi5jZW50ZXIpLG4ucmFkaXVzPXcpOihhLmNsb25lKEksbi5jZW50ZXIpLG4ucmFkaXVzPUQpLG59O25lLmZyb21Db3JuZXJQb2ludHM9ZnVuY3Rpb24odCxlLG4pe3kudHlwZU9mLm9iamVjdCgiY29ybmVyIix0KSx5LnR5cGVPZi5vYmplY3QoIm9wcG9zaXRlQ29ybmVyIixlKSxoKG4pfHwobj1uZXcgbmUpO2xldCBvPWEubWlkcG9pbnQodCxlLG4uY2VudGVyKTtyZXR1cm4gbi5yYWRpdXM9YS5kaXN0YW5jZShvLGUpLG59O25lLmZyb21FbGxpcHNvaWQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4geS50eXBlT2Yub2JqZWN0KCJlbGxpcHNvaWQiLHQpLGgoZSl8fChlPW5ldyBuZSksYS5jbG9uZShhLlpFUk8sZS5jZW50ZXIpLGUucmFkaXVzPXQubWF4aW11bVJhZGl1cyxlfTtGMz1uZXcgYTtuZS5mcm9tQm91bmRpbmdTcGhlcmVzPWZ1bmN0aW9uKHQsZSl7aWYoaChlKXx8KGU9bmV3IG5lKSwhaCh0KXx8dC5sZW5ndGg9PT0wKXJldHVybiBlLmNlbnRlcj1hLmNsb25lKGEuWkVSTyxlLmNlbnRlciksZS5yYWRpdXM9MCxlO2xldCBuPXQubGVuZ3RoO2lmKG49PT0xKXJldHVybiBuZS5jbG9uZSh0WzBdLGUpO2lmKG49PT0yKXJldHVybiBuZS51bmlvbih0WzBdLHRbMV0sZSk7bGV0IG89W10scjtmb3Iocj0wO3I8bjtyKyspby5wdXNoKHRbcl0uY2VudGVyKTtlPW5lLmZyb21Qb2ludHMobyxlKTtsZXQgaT1lLmNlbnRlcixzPWUucmFkaXVzO2ZvcihyPTA7cjxuO3IrKyl7bGV0IGY9dFtyXTtzPU1hdGgubWF4KHMsYS5kaXN0YW5jZShpLGYuY2VudGVyLEYzKStmLnJhZGl1cyl9cmV0dXJuIGUucmFkaXVzPXMsZX07QjM9bmV3IGEsVTM9bmV3IGEsVjM9bmV3IGE7bmUuZnJvbU9yaWVudGVkQm91bmRpbmdCb3g9ZnVuY3Rpb24odCxlKXt5LmRlZmluZWQoIm9yaWVudGVkQm91bmRpbmdCb3giLHQpLGgoZSl8fChlPW5ldyBuZSk7bGV0IG49dC5oYWxmQXhlcyxvPVEuZ2V0Q29sdW1uKG4sMCxCMykscj1RLmdldENvbHVtbihuLDEsVTMpLGk9US5nZXRDb2x1bW4obiwyLFYzKTtyZXR1cm4gYS5hZGQobyxyLG8pLGEuYWRkKG8saSxvKSxlLmNlbnRlcj1hLmNsb25lKHQuY2VudGVyLGUuY2VudGVyKSxlLnJhZGl1cz1hLm1hZ25pdHVkZShvKSxlfTtrMz1uZXcgYSxHMz1uZXcgYTtuZS5mcm9tVHJhbnNmb3JtYXRpb249ZnVuY3Rpb24odCxlKXt5LnR5cGVPZi5vYmplY3QoInRyYW5zZm9ybWF0aW9uIix0KSxoKGUpfHwoZT1uZXcgbmUpO2xldCBuPXN0LmdldFRyYW5zbGF0aW9uKHQsazMpLG89c3QuZ2V0U2NhbGUodCxHMykscj0uNSphLm1hZ25pdHVkZShvKTtyZXR1cm4gZS5jZW50ZXI9YS5jbG9uZShuLGUuY2VudGVyKSxlLnJhZGl1cz1yLGV9O25lLmNsb25lPWZ1bmN0aW9uKHQsZSl7aWYoaCh0KSlyZXR1cm4gaChlKT8oZS5jZW50ZXI9YS5jbG9uZSh0LmNlbnRlcixlLmNlbnRlciksZS5yYWRpdXM9dC5yYWRpdXMsZSk6bmV3IG5lKHQuY2VudGVyLHQucmFkaXVzKX07bmUucGFja2VkTGVuZ3RoPTQ7bmUucGFjaz1mdW5jdGlvbih0LGUsbil7eS50eXBlT2Yub2JqZWN0KCJ2YWx1ZSIsdCkseS5kZWZpbmVkKCJhcnJheSIsZSksbj14KG4sMCk7bGV0IG89dC5jZW50ZXI7cmV0dXJuIGVbbisrXT1vLngsZVtuKytdPW8ueSxlW24rK109by56LGVbbl09dC5yYWRpdXMsZX07bmUudW5wYWNrPWZ1bmN0aW9uKHQsZSxuKXt5LmRlZmluZWQoImFycmF5Iix0KSxlPXgoZSwwKSxoKG4pfHwobj1uZXcgbmUpO2xldCBvPW4uY2VudGVyO3JldHVybiBvLng9dFtlKytdLG8ueT10W2UrK10sby56PXRbZSsrXSxuLnJhZGl1cz10W2VdLG59O3ozPW5ldyBhLGozPW5ldyBhO25lLnVuaW9uPWZ1bmN0aW9uKHQsZSxuKXt5LnR5cGVPZi5vYmplY3QoImxlZnQiLHQpLHkudHlwZU9mLm9iamVjdCgicmlnaHQiLGUpLGgobil8fChuPW5ldyBuZSk7bGV0IG89dC5jZW50ZXIscj10LnJhZGl1cyxpPWUuY2VudGVyLHM9ZS5yYWRpdXMsZj1hLnN1YnRyYWN0KGksbyx6MyksdT1hLm1hZ25pdHVkZShmKTtpZihyPj11K3MpcmV0dXJuIHQuY2xvbmUobiksbjtpZihzPj11K3IpcmV0dXJuIGUuY2xvbmUobiksbjtsZXQgYz0ocit1K3MpKi41LGw9YS5tdWx0aXBseUJ5U2NhbGFyKGYsKC1yK2MpL3UsajMpO3JldHVybiBhLmFkZChsLG8sbCksYS5jbG9uZShsLG4uY2VudGVyKSxuLnJhZGl1cz1jLG59O0gzPW5ldyBhO25lLmV4cGFuZD1mdW5jdGlvbih0LGUsbil7eS50eXBlT2Yub2JqZWN0KCJzcGhlcmUiLHQpLHkudHlwZU9mLm9iamVjdCgicG9pbnQiLGUpLG49bmUuY2xvbmUodCxuKTtsZXQgbz1hLm1hZ25pdHVkZShhLnN1YnRyYWN0KGUsbi5jZW50ZXIsSDMpKTtyZXR1cm4gbz5uLnJhZGl1cyYmKG4ucmFkaXVzPW8pLG59O25lLmludGVyc2VjdFBsYW5lPWZ1bmN0aW9uKHQsZSl7eS50eXBlT2Yub2JqZWN0KCJzcGhlcmUiLHQpLHkudHlwZU9mLm9iamVjdCgicGxhbmUiLGUpO2xldCBuPXQuY2VudGVyLG89dC5yYWRpdXMscj1lLm5vcm1hbCxpPWEuZG90KHIsbikrZS5kaXN0YW5jZTtyZXR1cm4gaTwtbz9Tbi5PVVRTSURFOmk8bz9Tbi5JTlRFUlNFQ1RJTkc6U24uSU5TSURFfTtuZS50cmFuc2Zvcm09ZnVuY3Rpb24odCxlLG4pe3JldHVybiB5LnR5cGVPZi5vYmplY3QoInNwaGVyZSIsdCkseS50eXBlT2Yub2JqZWN0KCJ0cmFuc2Zvcm0iLGUpLGgobil8fChuPW5ldyBuZSksbi5jZW50ZXI9c3QubXVsdGlwbHlCeVBvaW50KGUsdC5jZW50ZXIsbi5jZW50ZXIpLG4ucmFkaXVzPXN0LmdldE1heGltdW1TY2FsZShlKSp0LnJhZGl1cyxufTtxMz1uZXcgYTtuZS5kaXN0YW5jZVNxdWFyZWRUbz1mdW5jdGlvbih0LGUpe3kudHlwZU9mLm9iamVjdCgic3BoZXJlIix0KSx5LnR5cGVPZi5vYmplY3QoImNhcnRlc2lhbiIsZSk7bGV0IG49YS5zdWJ0cmFjdCh0LmNlbnRlcixlLHEzKSxvPWEubWFnbml0dWRlKG4pLXQucmFkaXVzO3JldHVybiBvPD0wPzA6bypvfTtuZS50cmFuc2Zvcm1XaXRob3V0U2NhbGU9ZnVuY3Rpb24odCxlLG4pe3JldHVybiB5LnR5cGVPZi5vYmplY3QoInNwaGVyZSIsdCkseS50eXBlT2Yub2JqZWN0KCJ0cmFuc2Zvcm0iLGUpLGgobil8fChuPW5ldyBuZSksbi5jZW50ZXI9c3QubXVsdGlwbHlCeVBvaW50KGUsdC5jZW50ZXIsbi5jZW50ZXIpLG4ucmFkaXVzPXQucmFkaXVzLG59O0szPW5ldyBhO25lLmNvbXB1dGVQbGFuZURpc3RhbmNlcz1mdW5jdGlvbih0LGUsbixvKXt5LnR5cGVPZi5vYmplY3QoInNwaGVyZSIsdCkseS50eXBlT2Yub2JqZWN0KCJwb3NpdGlvbiIsZSkseS50eXBlT2Yub2JqZWN0KCJkaXJlY3Rpb24iLG4pLGgobyl8fChvPW5ldyBRcik7bGV0IHI9YS5zdWJ0cmFjdCh0LmNlbnRlcixlLEszKSxpPWEuZG90KG4scik7cmV0dXJuIG8uc3RhcnQ9aS10LnJhZGl1cyxvLnN0b3A9aSt0LnJhZGl1cyxvfTthYj1uZXcgYSxXMz1uZXcgYSxYMz1uZXcgYSxZMz1uZXcgYSwkMz1uZXcgYSxaMz1uZXcgY3QsdWI9bmV3IEFycmF5KDgpO2ZvcihsZXQgdD0wO3Q8ODsrK3QpdWJbdF09bmV3IGE7ZmI9bmV3IEpuO25lLnByb2plY3RUbzJEPWZ1bmN0aW9uKHQsZSxuKXt5LnR5cGVPZi5vYmplY3QoInNwaGVyZSIsdCksZmIuX2VsbGlwc29pZD0kLmRlZmF1bHQsZT14KGUsZmIpO2xldCBvPWUuZWxsaXBzb2lkLHI9dC5jZW50ZXIsaT10LnJhZGl1cyxzO2EuZXF1YWxzKHIsYS5aRVJPKT9zPWEuY2xvbmUoYS5VTklUX1gsYWIpOnM9by5nZW9kZXRpY1N1cmZhY2VOb3JtYWwocixhYik7bGV0IGY9YS5jcm9zcyhhLlVOSVRfWixzLFczKTthLm5vcm1hbGl6ZShmLGYpO2xldCB1PWEuY3Jvc3MocyxmLFgzKTthLm5vcm1hbGl6ZSh1LHUpLGEubXVsdGlwbHlCeVNjYWxhcihzLGkscyksYS5tdWx0aXBseUJ5U2NhbGFyKHUsaSx1KSxhLm11bHRpcGx5QnlTY2FsYXIoZixpLGYpO2xldCBjPWEubmVnYXRlKHUsJDMpLGw9YS5uZWdhdGUoZixZMykscD11YixkPXBbMF07YS5hZGQocyx1LGQpLGEuYWRkKGQsZixkKSxkPXBbMV0sYS5hZGQocyx1LGQpLGEuYWRkKGQsbCxkKSxkPXBbMl0sYS5hZGQocyxjLGQpLGEuYWRkKGQsbCxkKSxkPXBbM10sYS5hZGQocyxjLGQpLGEuYWRkKGQsZixkKSxhLm5lZ2F0ZShzLHMpLGQ9cFs0XSxhLmFkZChzLHUsZCksYS5hZGQoZCxmLGQpLGQ9cFs1XSxhLmFkZChzLHUsZCksYS5hZGQoZCxsLGQpLGQ9cFs2XSxhLmFkZChzLGMsZCksYS5hZGQoZCxsLGQpLGQ9cFs3XSxhLmFkZChzLGMsZCksYS5hZGQoZCxmLGQpO2xldCBtPXAubGVuZ3RoO2ZvcihsZXQgVD0wO1Q8bTsrK1Qpe2xldCBPPXBbVF07YS5hZGQocixPLE8pO2xldCBFPW8uY2FydGVzaWFuVG9DYXJ0b2dyYXBoaWMoTyxaMyk7ZS5wcm9qZWN0KEUsTyl9bj1uZS5mcm9tUG9pbnRzKHAsbikscj1uLmNlbnRlcjtsZXQgXz1yLngsZz1yLnksYj1yLno7cmV0dXJuIHIueD1iLHIueT1fLHIuej1nLG59O25lLmlzT2NjbHVkZWQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4geS50eXBlT2Yub2JqZWN0KCJzcGhlcmUiLHQpLHkudHlwZU9mLm9iamVjdCgib2NjbHVkZXIiLGUpLCFlLmlzQm91bmRpbmdTcGhlcmVWaXNpYmxlKHQpfTtuZS5lcXVhbHM9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdD09PWV8fGgodCkmJmgoZSkmJmEuZXF1YWxzKHQuY2VudGVyLGUuY2VudGVyKSYmdC5yYWRpdXM9PT1lLnJhZGl1c307bmUucHJvdG90eXBlLmludGVyc2VjdFBsYW5lPWZ1bmN0aW9uKHQpe3JldHVybiBuZS5pbnRlcnNlY3RQbGFuZSh0aGlzLHQpfTtuZS5wcm90b3R5cGUuZGlzdGFuY2VTcXVhcmVkVG89ZnVuY3Rpb24odCl7cmV0dXJuIG5lLmRpc3RhbmNlU3F1YXJlZFRvKHRoaXMsdCl9O25lLnByb3RvdHlwZS5jb21wdXRlUGxhbmVEaXN0YW5jZXM9ZnVuY3Rpb24odCxlLG4pe3JldHVybiBuZS5jb21wdXRlUGxhbmVEaXN0YW5jZXModGhpcyx0LGUsbil9O25lLnByb3RvdHlwZS5pc09jY2x1ZGVkPWZ1bmN0aW9uKHQpe3JldHVybiBuZS5pc09jY2x1ZGVkKHRoaXMsdCl9O25lLnByb3RvdHlwZS5lcXVhbHM9ZnVuY3Rpb24odCl7cmV0dXJuIG5lLmVxdWFscyh0aGlzLHQpfTtuZS5wcm90b3R5cGUuY2xvbmU9ZnVuY3Rpb24odCl7cmV0dXJuIG5lLmNsb25lKHRoaXMsdCl9O25lLnByb3RvdHlwZS52b2x1bWU9ZnVuY3Rpb24oKXtsZXQgdD10aGlzLnJhZGl1cztyZXR1cm4gSTMqdCp0KnR9O0F0PW5lfSk7dmFyIFEzLHF0LCRzPVooKCk9PntRMz17REVQVEhfQlVGRkVSX0JJVDoyNTYsU1RFTkNJTF9CVUZGRVJfQklUOjEwMjQsQ09MT1JfQlVGRkVSX0JJVDoxNjM4NCxQT0lOVFM6MCxMSU5FUzoxLExJTkVfTE9PUDoyLExJTkVfU1RSSVA6MyxUUklBTkdMRVM6NCxUUklBTkdMRV9TVFJJUDo1LFRSSUFOR0xFX0ZBTjo2LFpFUk86MCxPTkU6MSxTUkNfQ09MT1I6NzY4LE9ORV9NSU5VU19TUkNfQ09MT1I6NzY5LFNSQ19BTFBIQTo3NzAsT05FX01JTlVTX1NSQ19BTFBIQTo3NzEsRFNUX0FMUEhBOjc3MixPTkVfTUlOVVNfRFNUX0FMUEhBOjc3MyxEU1RfQ09MT1I6Nzc0LE9ORV9NSU5VU19EU1RfQ09MT1I6Nzc1LFNSQ19BTFBIQV9TQVRVUkFURTo3NzYsRlVOQ19BREQ6MzI3NzQsQkxFTkRfRVFVQVRJT046MzI3NzcsQkxFTkRfRVFVQVRJT05fUkdCOjMyNzc3LEJMRU5EX0VRVUFUSU9OX0FMUEhBOjM0ODc3LEZVTkNfU1VCVFJBQ1Q6MzI3NzgsRlVOQ19SRVZFUlNFX1NVQlRSQUNUOjMyNzc5LEJMRU5EX0RTVF9SR0I6MzI5NjgsQkxFTkRfU1JDX1JHQjozMjk2OSxCTEVORF9EU1RfQUxQSEE6MzI5NzAsQkxFTkRfU1JDX0FMUEhBOjMyOTcxLENPTlNUQU5UX0NPTE9SOjMyNzY5LE9ORV9NSU5VU19DT05TVEFOVF9DT0xPUjozMjc3MCxDT05TVEFOVF9BTFBIQTozMjc3MSxPTkVfTUlOVVNfQ09OU1RBTlRfQUxQSEE6MzI3NzIsQkxFTkRfQ09MT1I6MzI3NzMsQVJSQVlfQlVGRkVSOjM0OTYyLEVMRU1FTlRfQVJSQVlfQlVGRkVSOjM0OTYzLEFSUkFZX0JVRkZFUl9CSU5ESU5HOjM0OTY0LEVMRU1FTlRfQVJSQVlfQlVGRkVSX0JJTkRJTkc6MzQ5NjUsU1RSRUFNX0RSQVc6MzUwNDAsU1RBVElDX0RSQVc6MzUwNDQsRFlOQU1JQ19EUkFXOjM1MDQ4LEJVRkZFUl9TSVpFOjM0NjYwLEJVRkZFUl9VU0FHRTozNDY2MSxDVVJSRU5UX1ZFUlRFWF9BVFRSSUI6MzQzNDIsRlJPTlQ6MTAyOCxCQUNLOjEwMjksRlJPTlRfQU5EX0JBQ0s6MTAzMixDVUxMX0ZBQ0U6Mjg4NCxCTEVORDozMDQyLERJVEhFUjozMDI0LFNURU5DSUxfVEVTVDoyOTYwLERFUFRIX1RFU1Q6MjkyOSxTQ0lTU09SX1RFU1Q6MzA4OSxQT0xZR09OX09GRlNFVF9GSUxMOjMyODIzLFNBTVBMRV9BTFBIQV9UT19DT1ZFUkFHRTozMjkyNixTQU1QTEVfQ09WRVJBR0U6MzI5MjgsTk9fRVJST1I6MCxJTlZBTElEX0VOVU06MTI4MCxJTlZBTElEX1ZBTFVFOjEyODEsSU5WQUxJRF9PUEVSQVRJT046MTI4MixPVVRfT0ZfTUVNT1JZOjEyODUsQ1c6MjMwNCxDQ1c6MjMwNSxMSU5FX1dJRFRIOjI4NDksQUxJQVNFRF9QT0lOVF9TSVpFX1JBTkdFOjMzOTAxLEFMSUFTRURfTElORV9XSURUSF9SQU5HRTozMzkwMixDVUxMX0ZBQ0VfTU9ERToyODg1LEZST05UX0ZBQ0U6Mjg4NixERVBUSF9SQU5HRToyOTI4LERFUFRIX1dSSVRFTUFTSzoyOTMwLERFUFRIX0NMRUFSX1ZBTFVFOjI5MzEsREVQVEhfRlVOQzoyOTMyLFNURU5DSUxfQ0xFQVJfVkFMVUU6Mjk2MSxTVEVOQ0lMX0ZVTkM6Mjk2MixTVEVOQ0lMX0ZBSUw6Mjk2NCxTVEVOQ0lMX1BBU1NfREVQVEhfRkFJTDoyOTY1LFNURU5DSUxfUEFTU19ERVBUSF9QQVNTOjI5NjYsU1RFTkNJTF9SRUY6Mjk2NyxTVEVOQ0lMX1ZBTFVFX01BU0s6Mjk2MyxTVEVOQ0lMX1dSSVRFTUFTSzoyOTY4LFNURU5DSUxfQkFDS19GVU5DOjM0ODE2LFNURU5DSUxfQkFDS19GQUlMOjM0ODE3LFNURU5DSUxfQkFDS19QQVNTX0RFUFRIX0ZBSUw6MzQ4MTgsU1RFTkNJTF9CQUNLX1BBU1NfREVQVEhfUEFTUzozNDgxOSxTVEVOQ0lMX0JBQ0tfUkVGOjM2MDAzLFNURU5DSUxfQkFDS19WQUxVRV9NQVNLOjM2MDA0LFNURU5DSUxfQkFDS19XUklURU1BU0s6MzYwMDUsVklFV1BPUlQ6Mjk3OCxTQ0lTU09SX0JPWDozMDg4LENPTE9SX0NMRUFSX1ZBTFVFOjMxMDYsQ09MT1JfV1JJVEVNQVNLOjMxMDcsVU5QQUNLX0FMSUdOTUVOVDozMzE3LFBBQ0tfQUxJR05NRU5UOjMzMzMsTUFYX1RFWFRVUkVfU0laRTozMzc5LE1BWF9WSUVXUE9SVF9ESU1TOjMzODYsU1VCUElYRUxfQklUUzozNDA4LFJFRF9CSVRTOjM0MTAsR1JFRU5fQklUUzozNDExLEJMVUVfQklUUzozNDEyLEFMUEhBX0JJVFM6MzQxMyxERVBUSF9CSVRTOjM0MTQsU1RFTkNJTF9CSVRTOjM0MTUsUE9MWUdPTl9PRkZTRVRfVU5JVFM6MTA3NTIsUE9MWUdPTl9PRkZTRVRfRkFDVE9SOjMyODI0LFRFWFRVUkVfQklORElOR18yRDozMjg3MyxTQU1QTEVfQlVGRkVSUzozMjkzNixTQU1QTEVTOjMyOTM3LFNBTVBMRV9DT1ZFUkFHRV9WQUxVRTozMjkzOCxTQU1QTEVfQ09WRVJBR0VfSU5WRVJUOjMyOTM5LENPTVBSRVNTRURfVEVYVFVSRV9GT1JNQVRTOjM0NDY3LERPTlRfQ0FSRTo0MzUyLEZBU1RFU1Q6NDM1MyxOSUNFU1Q6NDM1NCxHRU5FUkFURV9NSVBNQVBfSElOVDozMzE3MCxCWVRFOjUxMjAsVU5TSUdORURfQllURTo1MTIxLFNIT1JUOjUxMjIsVU5TSUdORURfU0hPUlQ6NTEyMyxJTlQ6NTEyNCxVTlNJR05FRF9JTlQ6NTEyNSxGTE9BVDo1MTI2LERFUFRIX0NPTVBPTkVOVDo2NDAyLEFMUEhBOjY0MDYsUkdCOjY0MDcsUkdCQTo2NDA4LExVTUlOQU5DRTo2NDA5LExVTUlOQU5DRV9BTFBIQTo2NDEwLFVOU0lHTkVEX1NIT1JUXzRfNF80XzQ6MzI4MTksVU5TSUdORURfU0hPUlRfNV81XzVfMTozMjgyMCxVTlNJR05FRF9TSE9SVF81XzZfNTozMzYzNSxGUkFHTUVOVF9TSEFERVI6MzU2MzIsVkVSVEVYX1NIQURFUjozNTYzMyxNQVhfVkVSVEVYX0FUVFJJQlM6MzQ5MjEsTUFYX1ZFUlRFWF9VTklGT1JNX1ZFQ1RPUlM6MzYzNDcsTUFYX1ZBUllJTkdfVkVDVE9SUzozNjM0OCxNQVhfQ09NQklORURfVEVYVFVSRV9JTUFHRV9VTklUUzozNTY2MSxNQVhfVkVSVEVYX1RFWFRVUkVfSU1BR0VfVU5JVFM6MzU2NjAsTUFYX1RFWFRVUkVfSU1BR0VfVU5JVFM6MzQ5MzAsTUFYX0ZSQUdNRU5UX1VOSUZPUk1fVkVDVE9SUzozNjM0OSxTSEFERVJfVFlQRTozNTY2MyxERUxFVEVfU1RBVFVTOjM1NzEyLExJTktfU1RBVFVTOjM1NzE0LFZBTElEQVRFX1NUQVRVUzozNTcxNSxBVFRBQ0hFRF9TSEFERVJTOjM1NzE3LEFDVElWRV9VTklGT1JNUzozNTcxOCxBQ1RJVkVfQVRUUklCVVRFUzozNTcyMSxTSEFESU5HX0xBTkdVQUdFX1ZFUlNJT046MzU3MjQsQ1VSUkVOVF9QUk9HUkFNOjM1NzI1LE5FVkVSOjUxMixMRVNTOjUxMyxFUVVBTDo1MTQsTEVRVUFMOjUxNSxHUkVBVEVSOjUxNixOT1RFUVVBTDo1MTcsR0VRVUFMOjUxOCxBTFdBWVM6NTE5LEtFRVA6NzY4MCxSRVBMQUNFOjc2ODEsSU5DUjo3NjgyLERFQ1I6NzY4MyxJTlZFUlQ6NTM4NixJTkNSX1dSQVA6MzQwNTUsREVDUl9XUkFQOjM0MDU2LFZFTkRPUjo3OTM2LFJFTkRFUkVSOjc5MzcsVkVSU0lPTjo3OTM4LE5FQVJFU1Q6OTcyOCxMSU5FQVI6OTcyOSxORUFSRVNUX01JUE1BUF9ORUFSRVNUOjk5ODQsTElORUFSX01JUE1BUF9ORUFSRVNUOjk5ODUsTkVBUkVTVF9NSVBNQVBfTElORUFSOjk5ODYsTElORUFSX01JUE1BUF9MSU5FQVI6OTk4NyxURVhUVVJFX01BR19GSUxURVI6MTAyNDAsVEVYVFVSRV9NSU5fRklMVEVSOjEwMjQxLFRFWFRVUkVfV1JBUF9TOjEwMjQyLFRFWFRVUkVfV1JBUF9UOjEwMjQzLFRFWFRVUkVfMkQ6MzU1MyxURVhUVVJFOjU4OTAsVEVYVFVSRV9DVUJFX01BUDozNDA2NyxURVhUVVJFX0JJTkRJTkdfQ1VCRV9NQVA6MzQwNjgsVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9YOjM0MDY5LFRFWFRVUkVfQ1VCRV9NQVBfTkVHQVRJVkVfWDozNDA3MCxURVhUVVJFX0NVQkVfTUFQX1BPU0lUSVZFX1k6MzQwNzEsVEVYVFVSRV9DVUJFX01BUF9ORUdBVElWRV9ZOjM0MDcyLFRFWFRVUkVfQ1VCRV9NQVBfUE9TSVRJVkVfWjozNDA3MyxURVhUVVJFX0NVQkVfTUFQX05FR0FUSVZFX1o6MzQwNzQsTUFYX0NVQkVfTUFQX1RFWFRVUkVfU0laRTozNDA3NixURVhUVVJFMDozMzk4NCxURVhUVVJFMTozMzk4NSxURVhUVVJFMjozMzk4NixURVhUVVJFMzozMzk4NyxURVhUVVJFNDozMzk4OCxURVhUVVJFNTozMzk4OSxURVhUVVJFNjozMzk5MCxURVhUVVJFNzozMzk5MSxURVhUVVJFODozMzk5MixURVhUVVJFOTozMzk5MyxURVhUVVJFMTA6MzM5OTQsVEVYVFVSRTExOjMzOTk1LFRFWFRVUkUxMjozMzk5NixURVhUVVJFMTM6MzM5OTcsVEVYVFVSRTE0OjMzOTk4LFRFWFRVUkUxNTozMzk5OSxURVhUVVJFMTY6MzRlMyxURVhUVVJFMTc6MzQwMDEsVEVYVFVSRTE4OjM0MDAyLFRFWFRVUkUxOTozNDAwMyxURVhUVVJFMjA6MzQwMDQsVEVYVFVSRTIxOjM0MDA1LFRFWFRVUkUyMjozNDAwNixURVhUVVJFMjM6MzQwMDcsVEVYVFVSRTI0OjM0MDA4LFRFWFRVUkUyNTozNDAwOSxURVhUVVJFMjY6MzQwMTAsVEVYVFVSRTI3OjM0MDExLFRFWFRVUkUyODozNDAxMixURVhUVVJFMjk6MzQwMTMsVEVYVFVSRTMwOjM0MDE0LFRFWFRVUkUzMTozNDAxNSxBQ1RJVkVfVEVYVFVSRTozNDAxNixSRVBFQVQ6MTA0OTcsQ0xBTVBfVE9fRURHRTozMzA3MSxNSVJST1JFRF9SRVBFQVQ6MzM2NDgsRkxPQVRfVkVDMjozNTY2NCxGTE9BVF9WRUMzOjM1NjY1LEZMT0FUX1ZFQzQ6MzU2NjYsSU5UX1ZFQzI6MzU2NjcsSU5UX1ZFQzM6MzU2NjgsSU5UX1ZFQzQ6MzU2NjksQk9PTDozNTY3MCxCT09MX1ZFQzI6MzU2NzEsQk9PTF9WRUMzOjM1NjcyLEJPT0xfVkVDNDozNTY3MyxGTE9BVF9NQVQyOjM1Njc0LEZMT0FUX01BVDM6MzU2NzUsRkxPQVRfTUFUNDozNTY3NixTQU1QTEVSXzJEOjM1Njc4LFNBTVBMRVJfQ1VCRTozNTY4MCxWRVJURVhfQVRUUklCX0FSUkFZX0VOQUJMRUQ6MzQzMzgsVkVSVEVYX0FUVFJJQl9BUlJBWV9TSVpFOjM0MzM5LFZFUlRFWF9BVFRSSUJfQVJSQVlfU1RSSURFOjM0MzQwLFZFUlRFWF9BVFRSSUJfQVJSQVlfVFlQRTozNDM0MSxWRVJURVhfQVRUUklCX0FSUkFZX05PUk1BTElaRUQ6MzQ5MjIsVkVSVEVYX0FUVFJJQl9BUlJBWV9QT0lOVEVSOjM0MzczLFZFUlRFWF9BVFRSSUJfQVJSQVlfQlVGRkVSX0JJTkRJTkc6MzQ5NzUsSU1QTEVNRU5UQVRJT05fQ09MT1JfUkVBRF9UWVBFOjM1NzM4LElNUExFTUVOVEFUSU9OX0NPTE9SX1JFQURfRk9STUFUOjM1NzM5LENPTVBJTEVfU1RBVFVTOjM1NzEzLExPV19GTE9BVDozNjMzNixNRURJVU1fRkxPQVQ6MzYzMzcsSElHSF9GTE9BVDozNjMzOCxMT1dfSU5UOjM2MzM5LE1FRElVTV9JTlQ6MzYzNDAsSElHSF9JTlQ6MzYzNDEsRlJBTUVCVUZGRVI6MzYxNjAsUkVOREVSQlVGRkVSOjM2MTYxLFJHQkE0OjMyODU0LFJHQjVfQTE6MzI4NTUsUkdCNTY1OjM2MTk0LERFUFRIX0NPTVBPTkVOVDE2OjMzMTg5LFNURU5DSUxfSU5ERVg6NjQwMSxTVEVOQ0lMX0lOREVYODozNjE2OCxERVBUSF9TVEVOQ0lMOjM0MDQxLFJFTkRFUkJVRkZFUl9XSURUSDozNjE2MixSRU5ERVJCVUZGRVJfSEVJR0hUOjM2MTYzLFJFTkRFUkJVRkZFUl9JTlRFUk5BTF9GT1JNQVQ6MzYxNjQsUkVOREVSQlVGRkVSX1JFRF9TSVpFOjM2MTc2LFJFTkRFUkJVRkZFUl9HUkVFTl9TSVpFOjM2MTc3LFJFTkRFUkJVRkZFUl9CTFVFX1NJWkU6MzYxNzgsUkVOREVSQlVGRkVSX0FMUEhBX1NJWkU6MzYxNzksUkVOREVSQlVGRkVSX0RFUFRIX1NJWkU6MzYxODAsUkVOREVSQlVGRkVSX1NURU5DSUxfU0laRTozNjE4MSxGUkFNRUJVRkZFUl9BVFRBQ0hNRU5UX09CSkVDVF9UWVBFOjM2MDQ4LEZSQU1FQlVGRkVSX0FUVEFDSE1FTlRfT0JKRUNUX05BTUU6MzYwNDksRlJBTUVCVUZGRVJfQVRUQUNITUVOVF9URVhUVVJFX0xFVkVMOjM2MDUwLEZSQU1FQlVGRkVSX0FUVEFDSE1FTlRfVEVYVFVSRV9DVUJFX01BUF9GQUNFOjM2MDUxLENPTE9SX0FUVEFDSE1FTlQwOjM2MDY0LERFUFRIX0FUVEFDSE1FTlQ6MzYwOTYsU1RFTkNJTF9BVFRBQ0hNRU5UOjM2MTI4LERFUFRIX1NURU5DSUxfQVRUQUNITUVOVDozMzMwNixOT05FOjAsRlJBTUVCVUZGRVJfQ09NUExFVEU6MzYwNTMsRlJBTUVCVUZGRVJfSU5DT01QTEVURV9BVFRBQ0hNRU5UOjM2MDU0LEZSQU1FQlVGRkVSX0lOQ09NUExFVEVfTUlTU0lOR19BVFRBQ0hNRU5UOjM2MDU1LEZSQU1FQlVGRkVSX0lOQ09NUExFVEVfRElNRU5TSU9OUzozNjA1NyxGUkFNRUJVRkZFUl9VTlNVUFBPUlRFRDozNjA2MSxGUkFNRUJVRkZFUl9CSU5ESU5HOjM2MDA2LFJFTkRFUkJVRkZFUl9CSU5ESU5HOjM2MDA3LE1BWF9SRU5ERVJCVUZGRVJfU0laRTozNDAyNCxJTlZBTElEX0ZSQU1FQlVGRkVSX09QRVJBVElPTjoxMjg2LFVOUEFDS19GTElQX1lfV0VCR0w6Mzc0NDAsVU5QQUNLX1BSRU1VTFRJUExZX0FMUEhBX1dFQkdMOjM3NDQxLENPTlRFWFRfTE9TVF9XRUJHTDozNzQ0MixVTlBBQ0tfQ09MT1JTUEFDRV9DT05WRVJTSU9OX1dFQkdMOjM3NDQzLEJST1dTRVJfREVGQVVMVF9XRUJHTDozNzQ0NCxDT01QUkVTU0VEX1JHQl9TM1RDX0RYVDFfRVhUOjMzNzc2LENPTVBSRVNTRURfUkdCQV9TM1RDX0RYVDFfRVhUOjMzNzc3LENPTVBSRVNTRURfUkdCQV9TM1RDX0RYVDNfRVhUOjMzNzc4LENPTVBSRVNTRURfUkdCQV9TM1RDX0RYVDVfRVhUOjMzNzc5LENPTVBSRVNTRURfUkdCX1BWUlRDXzRCUFBWMV9JTUc6MzU4NDAsQ09NUFJFU1NFRF9SR0JfUFZSVENfMkJQUFYxX0lNRzozNTg0MSxDT01QUkVTU0VEX1JHQkFfUFZSVENfNEJQUFYxX0lNRzozNTg0MixDT01QUkVTU0VEX1JHQkFfUFZSVENfMkJQUFYxX0lNRzozNTg0MyxDT01QUkVTU0VEX1JHQkFfQVNUQ180eDRfV0VCR0w6Mzc4MDgsQ09NUFJFU1NFRF9SR0JfRVRDMV9XRUJHTDozNjE5NixDT01QUkVTU0VEX1JHQkFfQlBUQ19VTk9STTozNjQ5MixIQUxGX0ZMT0FUX09FUzozNjE5MyxET1VCTEU6NTEzMCxSRUFEX0JVRkZFUjozMDc0LFVOUEFDS19ST1dfTEVOR1RIOjMzMTQsVU5QQUNLX1NLSVBfUk9XUzozMzE1LFVOUEFDS19TS0lQX1BJWEVMUzozMzE2LFBBQ0tfUk9XX0xFTkdUSDozMzMwLFBBQ0tfU0tJUF9ST1dTOjMzMzEsUEFDS19TS0lQX1BJWEVMUzozMzMyLENPTE9SOjYxNDQsREVQVEg6NjE0NSxTVEVOQ0lMOjYxNDYsUkVEOjY0MDMsUkdCODozMjg0OSxSR0JBODozMjg1NixSR0IxMF9BMjozMjg1NyxURVhUVVJFX0JJTkRJTkdfM0Q6MzI4NzQsVU5QQUNLX1NLSVBfSU1BR0VTOjMyODc3LFVOUEFDS19JTUFHRV9IRUlHSFQ6MzI4NzgsVEVYVFVSRV8zRDozMjg3OSxURVhUVVJFX1dSQVBfUjozMjg4MixNQVhfM0RfVEVYVFVSRV9TSVpFOjMyODgzLFVOU0lHTkVEX0lOVF8yXzEwXzEwXzEwX1JFVjozMzY0MCxNQVhfRUxFTUVOVFNfVkVSVElDRVM6MzNlMyxNQVhfRUxFTUVOVFNfSU5ESUNFUzozMzAwMSxURVhUVVJFX01JTl9MT0Q6MzMwODIsVEVYVFVSRV9NQVhfTE9EOjMzMDgzLFRFWFRVUkVfQkFTRV9MRVZFTDozMzA4NCxURVhUVVJFX01BWF9MRVZFTDozMzA4NSxNSU46MzI3NzUsTUFYOjMyNzc2LERFUFRIX0NPTVBPTkVOVDI0OjMzMTkwLE1BWF9URVhUVVJFX0xPRF9CSUFTOjM0MDQ1LFRFWFRVUkVfQ09NUEFSRV9NT0RFOjM0ODkyLFRFWFRVUkVfQ09NUEFSRV9GVU5DOjM0ODkzLENVUlJFTlRfUVVFUlk6MzQ5MTcsUVVFUllfUkVTVUxUOjM0OTE4LFFVRVJZX1JFU1VMVF9BVkFJTEFCTEU6MzQ5MTksU1RSRUFNX1JFQUQ6MzUwNDEsU1RSRUFNX0NPUFk6MzUwNDIsU1RBVElDX1JFQUQ6MzUwNDUsU1RBVElDX0NPUFk6MzUwNDYsRFlOQU1JQ19SRUFEOjM1MDQ5LERZTkFNSUNfQ09QWTozNTA1MCxNQVhfRFJBV19CVUZGRVJTOjM0ODUyLERSQVdfQlVGRkVSMDozNDg1MyxEUkFXX0JVRkZFUjE6MzQ4NTQsRFJBV19CVUZGRVIyOjM0ODU1LERSQVdfQlVGRkVSMzozNDg1NixEUkFXX0JVRkZFUjQ6MzQ4NTcsRFJBV19CVUZGRVI1OjM0ODU4LERSQVdfQlVGRkVSNjozNDg1OSxEUkFXX0JVRkZFUjc6MzQ4NjAsRFJBV19CVUZGRVI4OjM0ODYxLERSQVdfQlVGRkVSOTozNDg2MixEUkFXX0JVRkZFUjEwOjM0ODYzLERSQVdfQlVGRkVSMTE6MzQ4NjQsRFJBV19CVUZGRVIxMjozNDg2NSxEUkFXX0JVRkZFUjEzOjM0ODY2LERSQVdfQlVGRkVSMTQ6MzQ4NjcsRFJBV19CVUZGRVIxNTozNDg2OCxNQVhfRlJBR01FTlRfVU5JRk9STV9DT01QT05FTlRTOjM1NjU3LE1BWF9WRVJURVhfVU5JRk9STV9DT01QT05FTlRTOjM1NjU4LFNBTVBMRVJfM0Q6MzU2NzksU0FNUExFUl8yRF9TSEFET1c6MzU2ODIsRlJBR01FTlRfU0hBREVSX0RFUklWQVRJVkVfSElOVDozNTcyMyxQSVhFTF9QQUNLX0JVRkZFUjozNTA1MSxQSVhFTF9VTlBBQ0tfQlVGRkVSOjM1MDUyLFBJWEVMX1BBQ0tfQlVGRkVSX0JJTkRJTkc6MzUwNTMsUElYRUxfVU5QQUNLX0JVRkZFUl9CSU5ESU5HOjM1MDU1LEZMT0FUX01BVDJ4MzozNTY4NSxGTE9BVF9NQVQyeDQ6MzU2ODYsRkxPQVRfTUFUM3gyOjM1Njg3LEZMT0FUX01BVDN4NDozNTY4OCxGTE9BVF9NQVQ0eDI6MzU2ODksRkxPQVRfTUFUNHgzOjM1NjkwLFNSR0I6MzU5MDQsU1JHQjg6MzU5MDUsU1JHQjhfQUxQSEE4OjM1OTA3LENPTVBBUkVfUkVGX1RPX1RFWFRVUkU6MzQ4OTQsUkdCQTMyRjozNDgzNixSR0IzMkY6MzQ4MzcsUkdCQTE2RjozNDg0MixSR0IxNkY6MzQ4NDMsVkVSVEVYX0FUVFJJQl9BUlJBWV9JTlRFR0VSOjM1MDY5LE1BWF9BUlJBWV9URVhUVVJFX0xBWUVSUzozNTA3MSxNSU5fUFJPR1JBTV9URVhFTF9PRkZTRVQ6MzUwNzYsTUFYX1BST0dSQU1fVEVYRUxfT0ZGU0VUOjM1MDc3LE1BWF9WQVJZSU5HX0NPTVBPTkVOVFM6MzU2NTksVEVYVFVSRV8yRF9BUlJBWTozNTg2NixURVhUVVJFX0JJTkRJTkdfMkRfQVJSQVk6MzU4NjksUjExRl9HMTFGX0IxMEY6MzU4OTgsVU5TSUdORURfSU5UXzEwRl8xMUZfMTFGX1JFVjozNTg5OSxSR0I5X0U1OjM1OTAxLFVOU0lHTkVEX0lOVF81XzlfOV85X1JFVjozNTkwMixUUkFOU0ZPUk1fRkVFREJBQ0tfQlVGRkVSX01PREU6MzU5NjcsTUFYX1RSQU5TRk9STV9GRUVEQkFDS19TRVBBUkFURV9DT01QT05FTlRTOjM1OTY4LFRSQU5TRk9STV9GRUVEQkFDS19WQVJZSU5HUzozNTk3MSxUUkFOU0ZPUk1fRkVFREJBQ0tfQlVGRkVSX1NUQVJUOjM1OTcyLFRSQU5TRk9STV9GRUVEQkFDS19CVUZGRVJfU0laRTozNTk3MyxUUkFOU0ZPUk1fRkVFREJBQ0tfUFJJTUlUSVZFU19XUklUVEVOOjM1OTc2LFJBU1RFUklaRVJfRElTQ0FSRDozNTk3NyxNQVhfVFJBTlNGT1JNX0ZFRURCQUNLX0lOVEVSTEVBVkVEX0NPTVBPTkVOVFM6MzU5NzgsTUFYX1RSQU5TRk9STV9GRUVEQkFDS19TRVBBUkFURV9BVFRSSUJTOjM1OTc5LElOVEVSTEVBVkVEX0FUVFJJQlM6MzU5ODAsU0VQQVJBVEVfQVRUUklCUzozNTk4MSxUUkFOU0ZPUk1fRkVFREJBQ0tfQlVGRkVSOjM1OTgyLFRSQU5TRk9STV9GRUVEQkFDS19CVUZGRVJfQklORElORzozNTk4MyxSR0JBMzJVSTozNjIwOCxSR0IzMlVJOjM2MjA5LFJHQkExNlVJOjM2MjE0LFJHQjE2VUk6MzYyMTUsUkdCQThVSTozNjIyMCxSR0I4VUk6MzYyMjEsUkdCQTMySTozNjIyNixSR0IzMkk6MzYyMjcsUkdCQTE2STozNjIzMixSR0IxNkk6MzYyMzMsUkdCQThJOjM2MjM4LFJHQjhJOjM2MjM5LFJFRF9JTlRFR0VSOjM2MjQ0LFJHQl9JTlRFR0VSOjM2MjQ4LFJHQkFfSU5URUdFUjozNjI0OSxTQU1QTEVSXzJEX0FSUkFZOjM2Mjg5LFNBTVBMRVJfMkRfQVJSQVlfU0hBRE9XOjM2MjkyLFNBTVBMRVJfQ1VCRV9TSEFET1c6MzYyOTMsVU5TSUdORURfSU5UX1ZFQzI6MzYyOTQsVU5TSUdORURfSU5UX1ZFQzM6MzYyOTUsVU5TSUdORURfSU5UX1ZFQzQ6MzYyOTYsSU5UX1NBTVBMRVJfMkQ6MzYyOTgsSU5UX1NBTVBMRVJfM0Q6MzYyOTksSU5UX1NBTVBMRVJfQ1VCRTozNjMwMCxJTlRfU0FNUExFUl8yRF9BUlJBWTozNjMwMyxVTlNJR05FRF9JTlRfU0FNUExFUl8yRDozNjMwNixVTlNJR05FRF9JTlRfU0FNUExFUl8zRDozNjMwNyxVTlNJR05FRF9JTlRfU0FNUExFUl9DVUJFOjM2MzA4LFVOU0lHTkVEX0lOVF9TQU1QTEVSXzJEX0FSUkFZOjM2MzExLERFUFRIX0NPTVBPTkVOVDMyRjozNjAxMixERVBUSDMyRl9TVEVOQ0lMODozNjAxMyxGTE9BVF8zMl9VTlNJR05FRF9JTlRfMjRfOF9SRVY6MzYyNjksRlJBTUVCVUZGRVJfQVRUQUNITUVOVF9DT0xPUl9FTkNPRElORzozMzI5NixGUkFNRUJVRkZFUl9BVFRBQ0hNRU5UX0NPTVBPTkVOVF9UWVBFOjMzMjk3LEZSQU1FQlVGRkVSX0FUVEFDSE1FTlRfUkVEX1NJWkU6MzMyOTgsRlJBTUVCVUZGRVJfQVRUQUNITUVOVF9HUkVFTl9TSVpFOjMzMjk5LEZSQU1FQlVGRkVSX0FUVEFDSE1FTlRfQkxVRV9TSVpFOjMzMzAwLEZSQU1FQlVGRkVSX0FUVEFDSE1FTlRfQUxQSEFfU0laRTozMzMwMSxGUkFNRUJVRkZFUl9BVFRBQ0hNRU5UX0RFUFRIX1NJWkU6MzMzMDIsRlJBTUVCVUZGRVJfQVRUQUNITUVOVF9TVEVOQ0lMX1NJWkU6MzMzMDMsRlJBTUVCVUZGRVJfREVGQVVMVDozMzMwNCxVTlNJR05FRF9JTlRfMjRfODozNDA0MixERVBUSDI0X1NURU5DSUw4OjM1MDU2LFVOU0lHTkVEX05PUk1BTElaRUQ6MzU4NjMsRFJBV19GUkFNRUJVRkZFUl9CSU5ESU5HOjM2MDA2LFJFQURfRlJBTUVCVUZGRVI6MzYwMDgsRFJBV19GUkFNRUJVRkZFUjozNjAwOSxSRUFEX0ZSQU1FQlVGRkVSX0JJTkRJTkc6MzYwMTAsUkVOREVSQlVGRkVSX1NBTVBMRVM6MzYwMTEsRlJBTUVCVUZGRVJfQVRUQUNITUVOVF9URVhUVVJFX0xBWUVSOjM2MDUyLE1BWF9DT0xPUl9BVFRBQ0hNRU5UUzozNjA2MyxDT0xPUl9BVFRBQ0hNRU5UMTozNjA2NSxDT0xPUl9BVFRBQ0hNRU5UMjozNjA2NixDT0xPUl9BVFRBQ0hNRU5UMzozNjA2NyxDT0xPUl9BVFRBQ0hNRU5UNDozNjA2OCxDT0xPUl9BVFRBQ0hNRU5UNTozNjA2OSxDT0xPUl9BVFRBQ0hNRU5UNjozNjA3MCxDT0xPUl9BVFRBQ0hNRU5UNzozNjA3MSxDT0xPUl9BVFRBQ0hNRU5UODozNjA3MixDT0xPUl9BVFRBQ0hNRU5UOTozNjA3MyxDT0xPUl9BVFRBQ0hNRU5UMTA6MzYwNzQsQ09MT1JfQVRUQUNITUVOVDExOjM2MDc1LENPTE9SX0FUVEFDSE1FTlQxMjozNjA3NixDT0xPUl9BVFRBQ0hNRU5UMTM6MzYwNzcsQ09MT1JfQVRUQUNITUVOVDE0OjM2MDc4LENPTE9SX0FUVEFDSE1FTlQxNTozNjA3OSxGUkFNRUJVRkZFUl9JTkNPTVBMRVRFX01VTFRJU0FNUExFOjM2MTgyLE1BWF9TQU1QTEVTOjM2MTgzLEhBTEZfRkxPQVQ6NTEzMSxSRzozMzMxOSxSR19JTlRFR0VSOjMzMzIwLFI4OjMzMzIxLFJHODozMzMyMyxSMTZGOjMzMzI1LFIzMkY6MzMzMjYsUkcxNkY6MzMzMjcsUkczMkY6MzMzMjgsUjhJOjMzMzI5LFI4VUk6MzMzMzAsUjE2STozMzMzMSxSMTZVSTozMzMzMixSMzJJOjMzMzMzLFIzMlVJOjMzMzM0LFJHOEk6MzMzMzUsUkc4VUk6MzMzMzYsUkcxNkk6MzMzMzcsUkcxNlVJOjMzMzM4LFJHMzJJOjMzMzM5LFJHMzJVSTozMzM0MCxWRVJURVhfQVJSQVlfQklORElORzozNDIyOSxSOF9TTk9STTozNjc1NixSRzhfU05PUk06MzY3NTcsUkdCOF9TTk9STTozNjc1OCxSR0JBOF9TTk9STTozNjc1OSxTSUdORURfTk9STUFMSVpFRDozNjc2NCxDT1BZX1JFQURfQlVGRkVSOjM2NjYyLENPUFlfV1JJVEVfQlVGRkVSOjM2NjYzLENPUFlfUkVBRF9CVUZGRVJfQklORElORzozNjY2MixDT1BZX1dSSVRFX0JVRkZFUl9CSU5ESU5HOjM2NjYzLFVOSUZPUk1fQlVGRkVSOjM1MzQ1LFVOSUZPUk1fQlVGRkVSX0JJTkRJTkc6MzUzNjgsVU5JRk9STV9CVUZGRVJfU1RBUlQ6MzUzNjksVU5JRk9STV9CVUZGRVJfU0laRTozNTM3MCxNQVhfVkVSVEVYX1VOSUZPUk1fQkxPQ0tTOjM1MzcxLE1BWF9GUkFHTUVOVF9VTklGT1JNX0JMT0NLUzozNTM3MyxNQVhfQ09NQklORURfVU5JRk9STV9CTE9DS1M6MzUzNzQsTUFYX1VOSUZPUk1fQlVGRkVSX0JJTkRJTkdTOjM1Mzc1LE1BWF9VTklGT1JNX0JMT0NLX1NJWkU6MzUzNzYsTUFYX0NPTUJJTkVEX1ZFUlRFWF9VTklGT1JNX0NPTVBPTkVOVFM6MzUzNzcsTUFYX0NPTUJJTkVEX0ZSQUdNRU5UX1VOSUZPUk1fQ09NUE9ORU5UUzozNTM3OSxVTklGT1JNX0JVRkZFUl9PRkZTRVRfQUxJR05NRU5UOjM1MzgwLEFDVElWRV9VTklGT1JNX0JMT0NLUzozNTM4MixVTklGT1JNX1RZUEU6MzUzODMsVU5JRk9STV9TSVpFOjM1Mzg0LFVOSUZPUk1fQkxPQ0tfSU5ERVg6MzUzODYsVU5JRk9STV9PRkZTRVQ6MzUzODcsVU5JRk9STV9BUlJBWV9TVFJJREU6MzUzODgsVU5JRk9STV9NQVRSSVhfU1RSSURFOjM1Mzg5LFVOSUZPUk1fSVNfUk9XX01BSk9SOjM1MzkwLFVOSUZPUk1fQkxPQ0tfQklORElORzozNTM5MSxVTklGT1JNX0JMT0NLX0RBVEFfU0laRTozNTM5MixVTklGT1JNX0JMT0NLX0FDVElWRV9VTklGT1JNUzozNTM5NCxVTklGT1JNX0JMT0NLX0FDVElWRV9VTklGT1JNX0lORElDRVM6MzUzOTUsVU5JRk9STV9CTE9DS19SRUZFUkVOQ0VEX0JZX1ZFUlRFWF9TSEFERVI6MzUzOTYsVU5JRk9STV9CTE9DS19SRUZFUkVOQ0VEX0JZX0ZSQUdNRU5UX1NIQURFUjozNTM5OCxJTlZBTElEX0lOREVYOjQyOTQ5NjcyOTUsTUFYX1ZFUlRFWF9PVVRQVVRfQ09NUE9ORU5UUzozNzE1NCxNQVhfRlJBR01FTlRfSU5QVVRfQ09NUE9ORU5UUzozNzE1NyxNQVhfU0VSVkVSX1dBSVRfVElNRU9VVDozNzEzNyxPQkpFQ1RfVFlQRTozNzEzOCxTWU5DX0NPTkRJVElPTjozNzEzOSxTWU5DX1NUQVRVUzozNzE0MCxTWU5DX0ZMQUdTOjM3MTQxLFNZTkNfRkVOQ0U6MzcxNDIsU1lOQ19HUFVfQ09NTUFORFNfQ09NUExFVEU6MzcxNDMsVU5TSUdOQUxFRDozNzE0NCxTSUdOQUxFRDozNzE0NSxBTFJFQURZX1NJR05BTEVEOjM3MTQ2LFRJTUVPVVRfRVhQSVJFRDozNzE0NyxDT05ESVRJT05fU0FUSVNGSUVEOjM3MTQ4LFdBSVRfRkFJTEVEOjM3MTQ5LFNZTkNfRkxVU0hfQ09NTUFORFNfQklUOjEsVkVSVEVYX0FUVFJJQl9BUlJBWV9ESVZJU09SOjM1MDcwLEFOWV9TQU1QTEVTX1BBU1NFRDozNTg4NyxBTllfU0FNUExFU19QQVNTRURfQ09OU0VSVkFUSVZFOjM2MjAyLFNBTVBMRVJfQklORElORzozNTA5NyxSR0IxMF9BMlVJOjM2OTc1LElOVF8yXzEwXzEwXzEwX1JFVjozNjI1NSxUUkFOU0ZPUk1fRkVFREJBQ0s6MzYzODYsVFJBTlNGT1JNX0ZFRURCQUNLX1BBVVNFRDozNjM4NyxUUkFOU0ZPUk1fRkVFREJBQ0tfQUNUSVZFOjM2Mzg4LFRSQU5TRk9STV9GRUVEQkFDS19CSU5ESU5HOjM2Mzg5LENPTVBSRVNTRURfUjExX0VBQzozNzQ4OCxDT01QUkVTU0VEX1NJR05FRF9SMTFfRUFDOjM3NDg5LENPTVBSRVNTRURfUkcxMV9FQUM6Mzc0OTAsQ09NUFJFU1NFRF9TSUdORURfUkcxMV9FQUM6Mzc0OTEsQ09NUFJFU1NFRF9SR0I4X0VUQzI6Mzc0OTIsQ09NUFJFU1NFRF9TUkdCOF9FVEMyOjM3NDkzLENPTVBSRVNTRURfUkdCOF9QVU5DSFRIUk9VR0hfQUxQSEExX0VUQzI6Mzc0OTQsQ09NUFJFU1NFRF9TUkdCOF9QVU5DSFRIUk9VR0hfQUxQSEExX0VUQzI6Mzc0OTUsQ09NUFJFU1NFRF9SR0JBOF9FVEMyX0VBQzozNzQ5NixDT01QUkVTU0VEX1NSR0I4X0FMUEhBOF9FVEMyX0VBQzozNzQ5NyxURVhUVVJFX0lNTVVUQUJMRV9GT1JNQVQ6MzcxNjcsTUFYX0VMRU1FTlRfSU5ERVg6MzYyMDMsVEVYVFVSRV9JTU1VVEFCTEVfTEVWRUxTOjMzNTAzLE1BWF9URVhUVVJFX01BWF9BTklTT1RST1BZX0VYVDozNDA0N30scXQ9T2JqZWN0LmZyZWV6ZShRMyl9KTt2YXIgc2UsbnQsRmU9WigoKT0+e0l0KCk7ZnQoKTtIdCgpOyRzKCk7c2U9e0JZVEU6cXQuQllURSxVTlNJR05FRF9CWVRFOnF0LlVOU0lHTkVEX0JZVEUsU0hPUlQ6cXQuU0hPUlQsVU5TSUdORURfU0hPUlQ6cXQuVU5TSUdORURfU0hPUlQsSU5UOnF0LklOVCxVTlNJR05FRF9JTlQ6cXQuVU5TSUdORURfSU5ULEZMT0FUOnF0LkZMT0FULERPVUJMRTpxdC5ET1VCTEV9O3NlLmdldFNpemVJbkJ5dGVzPWZ1bmN0aW9uKHQpe2lmKCFoKHQpKXRocm93IG5ldyBCKCJ2YWx1ZSBpcyByZXF1aXJlZC4iKTtzd2l0Y2godCl7Y2FzZSBzZS5CWVRFOnJldHVybiBJbnQ4QXJyYXkuQllURVNfUEVSX0VMRU1FTlQ7Y2FzZSBzZS5VTlNJR05FRF9CWVRFOnJldHVybiBVaW50OEFycmF5LkJZVEVTX1BFUl9FTEVNRU5UO2Nhc2Ugc2UuU0hPUlQ6cmV0dXJuIEludDE2QXJyYXkuQllURVNfUEVSX0VMRU1FTlQ7Y2FzZSBzZS5VTlNJR05FRF9TSE9SVDpyZXR1cm4gVWludDE2QXJyYXkuQllURVNfUEVSX0VMRU1FTlQ7Y2FzZSBzZS5JTlQ6cmV0dXJuIEludDMyQXJyYXkuQllURVNfUEVSX0VMRU1FTlQ7Y2FzZSBzZS5VTlNJR05FRF9JTlQ6cmV0dXJuIFVpbnQzMkFycmF5LkJZVEVTX1BFUl9FTEVNRU5UO2Nhc2Ugc2UuRkxPQVQ6cmV0dXJuIEZsb2F0MzJBcnJheS5CWVRFU19QRVJfRUxFTUVOVDtjYXNlIHNlLkRPVUJMRTpyZXR1cm4gRmxvYXQ2NEFycmF5LkJZVEVTX1BFUl9FTEVNRU5UO2RlZmF1bHQ6dGhyb3cgbmV3IEIoImNvbXBvbmVudERhdGF0eXBlIGlzIG5vdCBhIHZhbGlkIHZhbHVlLiIpfX07c2UuZnJvbVR5cGVkQXJyYXk9ZnVuY3Rpb24odCl7aWYodCBpbnN0YW5jZW9mIEludDhBcnJheSlyZXR1cm4gc2UuQllURTtpZih0IGluc3RhbmNlb2YgVWludDhBcnJheSlyZXR1cm4gc2UuVU5TSUdORURfQllURTtpZih0IGluc3RhbmNlb2YgSW50MTZBcnJheSlyZXR1cm4gc2UuU0hPUlQ7aWYodCBpbnN0YW5jZW9mIFVpbnQxNkFycmF5KXJldHVybiBzZS5VTlNJR05FRF9TSE9SVDtpZih0IGluc3RhbmNlb2YgSW50MzJBcnJheSlyZXR1cm4gc2UuSU5UO2lmKHQgaW5zdGFuY2VvZiBVaW50MzJBcnJheSlyZXR1cm4gc2UuVU5TSUdORURfSU5UO2lmKHQgaW5zdGFuY2VvZiBGbG9hdDMyQXJyYXkpcmV0dXJuIHNlLkZMT0FUO2lmKHQgaW5zdGFuY2VvZiBGbG9hdDY0QXJyYXkpcmV0dXJuIHNlLkRPVUJMRTt0aHJvdyBuZXcgQigiYXJyYXkgbXVzdCBiZSBhbiBJbnQ4QXJyYXksIFVpbnQ4QXJyYXksIEludDE2QXJyYXksIFVpbnQxNkFycmF5LCBJbnQzMkFycmF5LCBVaW50MzJBcnJheSwgRmxvYXQzMkFycmF5LCBvciBGbG9hdDY0QXJyYXkuIil9O3NlLnZhbGlkYXRlPWZ1bmN0aW9uKHQpe3JldHVybiBoKHQpJiYodD09PXNlLkJZVEV8fHQ9PT1zZS5VTlNJR05FRF9CWVRFfHx0PT09c2UuU0hPUlR8fHQ9PT1zZS5VTlNJR05FRF9TSE9SVHx8dD09PXNlLklOVHx8dD09PXNlLlVOU0lHTkVEX0lOVHx8dD09PXNlLkZMT0FUfHx0PT09c2UuRE9VQkxFKX07c2UuY3JlYXRlVHlwZWRBcnJheT1mdW5jdGlvbih0LGUpe2lmKCFoKHQpKXRocm93IG5ldyBCKCJjb21wb25lbnREYXRhdHlwZSBpcyByZXF1aXJlZC4iKTtpZighaChlKSl0aHJvdyBuZXcgQigidmFsdWVzT3JMZW5ndGggaXMgcmVxdWlyZWQuIik7c3dpdGNoKHQpe2Nhc2Ugc2UuQllURTpyZXR1cm4gbmV3IEludDhBcnJheShlKTtjYXNlIHNlLlVOU0lHTkVEX0JZVEU6cmV0dXJuIG5ldyBVaW50OEFycmF5KGUpO2Nhc2Ugc2UuU0hPUlQ6cmV0dXJuIG5ldyBJbnQxNkFycmF5KGUpO2Nhc2Ugc2UuVU5TSUdORURfU0hPUlQ6cmV0dXJuIG5ldyBVaW50MTZBcnJheShlKTtjYXNlIHNlLklOVDpyZXR1cm4gbmV3IEludDMyQXJyYXkoZSk7Y2FzZSBzZS5VTlNJR05FRF9JTlQ6cmV0dXJuIG5ldyBVaW50MzJBcnJheShlKTtjYXNlIHNlLkZMT0FUOnJldHVybiBuZXcgRmxvYXQzMkFycmF5KGUpO2Nhc2Ugc2UuRE9VQkxFOnJldHVybiBuZXcgRmxvYXQ2NEFycmF5KGUpO2RlZmF1bHQ6dGhyb3cgbmV3IEIoImNvbXBvbmVudERhdGF0eXBlIGlzIG5vdCBhIHZhbGlkIHZhbHVlLiIpfX07c2UuY3JlYXRlQXJyYXlCdWZmZXJWaWV3PWZ1bmN0aW9uKHQsZSxuLG8pe2lmKCFoKHQpKXRocm93IG5ldyBCKCJjb21wb25lbnREYXRhdHlwZSBpcyByZXF1aXJlZC4iKTtpZighaChlKSl0aHJvdyBuZXcgQigiYnVmZmVyIGlzIHJlcXVpcmVkLiIpO3N3aXRjaChuPXgobiwwKSxvPXgobywoZS5ieXRlTGVuZ3RoLW4pL3NlLmdldFNpemVJbkJ5dGVzKHQpKSx0KXtjYXNlIHNlLkJZVEU6cmV0dXJuIG5ldyBJbnQ4QXJyYXkoZSxuLG8pO2Nhc2Ugc2UuVU5TSUdORURfQllURTpyZXR1cm4gbmV3IFVpbnQ4QXJyYXkoZSxuLG8pO2Nhc2Ugc2UuU0hPUlQ6cmV0dXJuIG5ldyBJbnQxNkFycmF5KGUsbixvKTtjYXNlIHNlLlVOU0lHTkVEX1NIT1JUOnJldHVybiBuZXcgVWludDE2QXJyYXkoZSxuLG8pO2Nhc2Ugc2UuSU5UOnJldHVybiBuZXcgSW50MzJBcnJheShlLG4sbyk7Y2FzZSBzZS5VTlNJR05FRF9JTlQ6cmV0dXJuIG5ldyBVaW50MzJBcnJheShlLG4sbyk7Y2FzZSBzZS5GTE9BVDpyZXR1cm4gbmV3IEZsb2F0MzJBcnJheShlLG4sbyk7Y2FzZSBzZS5ET1VCTEU6cmV0dXJuIG5ldyBGbG9hdDY0QXJyYXkoZSxuLG8pO2RlZmF1bHQ6dGhyb3cgbmV3IEIoImNvbXBvbmVudERhdGF0eXBlIGlzIG5vdCBhIHZhbGlkIHZhbHVlLiIpfX07c2UuZnJvbU5hbWU9ZnVuY3Rpb24odCl7c3dpdGNoKHQpe2Nhc2UiQllURSI6cmV0dXJuIHNlLkJZVEU7Y2FzZSJVTlNJR05FRF9CWVRFIjpyZXR1cm4gc2UuVU5TSUdORURfQllURTtjYXNlIlNIT1JUIjpyZXR1cm4gc2UuU0hPUlQ7Y2FzZSJVTlNJR05FRF9TSE9SVCI6cmV0dXJuIHNlLlVOU0lHTkVEX1NIT1JUO2Nhc2UiSU5UIjpyZXR1cm4gc2UuSU5UO2Nhc2UiVU5TSUdORURfSU5UIjpyZXR1cm4gc2UuVU5TSUdORURfSU5UO2Nhc2UiRkxPQVQiOnJldHVybiBzZS5GTE9BVDtjYXNlIkRPVUJMRSI6cmV0dXJuIHNlLkRPVUJMRTtkZWZhdWx0OnRocm93IG5ldyBCKCJuYW1lIGlzIG5vdCBhIHZhbGlkIHZhbHVlLiIpfX07bnQ9T2JqZWN0LmZyZWV6ZShzZSl9KTt2YXIgSjMsTWksTHA9WigoKT0+e0ozPXtOT05FOjAsVFJJQU5HTEVTOjEsTElORVM6MixQT0xZTElORVM6M30sTWk9T2JqZWN0LmZyZWV6ZShKMyl9KTtmdW5jdGlvbiBZdCh0LGUsbixvKXt0aGlzWzBdPXgodCwwKSx0aGlzWzFdPXgobiwwKSx0aGlzWzJdPXgoZSwwKSx0aGlzWzNdPXgobywwKX12YXIgdFAsZVAsbGIscGIsblAsb1AsWW8sQWY9WigoKT0+e1VlKCk7WHQoKTtJdCgpO2Z0KCk7SHQoKTtZdC5wYWNrZWRMZW5ndGg9NDtZdC5wYWNrPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4geS50eXBlT2Yub2JqZWN0KCJ2YWx1ZSIsdCkseS5kZWZpbmVkKCJhcnJheSIsZSksbj14KG4sMCksZVtuKytdPXRbMF0sZVtuKytdPXRbMV0sZVtuKytdPXRbMl0sZVtuKytdPXRbM10sZX07WXQudW5wYWNrPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4geS5kZWZpbmVkKCJhcnJheSIsdCksZT14KGUsMCksaChuKXx8KG49bmV3IFl0KSxuWzBdPXRbZSsrXSxuWzFdPXRbZSsrXSxuWzJdPXRbZSsrXSxuWzNdPXRbZSsrXSxufTtZdC5wYWNrQXJyYXk9ZnVuY3Rpb24odCxlKXt5LmRlZmluZWQoImFycmF5Iix0KTtsZXQgbj10Lmxlbmd0aCxvPW4qNDtpZighaChlKSllPW5ldyBBcnJheShvKTtlbHNle2lmKCFBcnJheS5pc0FycmF5KGUpJiZlLmxlbmd0aCE9PW8pdGhyb3cgbmV3IEIoIklmIHJlc3VsdCBpcyBhIHR5cGVkIGFycmF5LCBpdCBtdXN0IGhhdmUgZXhhY3RseSBhcnJheS5sZW5ndGggKiA0IGVsZW1lbnRzIik7ZS5sZW5ndGghPT1vJiYoZS5sZW5ndGg9byl9Zm9yKGxldCByPTA7cjxuOysrcilZdC5wYWNrKHRbcl0sZSxyKjQpO3JldHVybiBlfTtZdC51bnBhY2tBcnJheT1mdW5jdGlvbih0LGUpe2lmKHkuZGVmaW5lZCgiYXJyYXkiLHQpLHkudHlwZU9mLm51bWJlci5ncmVhdGVyVGhhbk9yRXF1YWxzKCJhcnJheS5sZW5ndGgiLHQubGVuZ3RoLDQpLHQubGVuZ3RoJTQhPT0wKXRocm93IG5ldyBCKCJhcnJheSBsZW5ndGggbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQuIik7bGV0IG49dC5sZW5ndGg7aChlKT9lLmxlbmd0aD1uLzQ6ZT1uZXcgQXJyYXkobi80KTtmb3IobGV0IG89MDtvPG47bys9NCl7bGV0IHI9by80O2Vbcl09WXQudW5wYWNrKHQsbyxlW3JdKX1yZXR1cm4gZX07WXQuY2xvbmU9ZnVuY3Rpb24odCxlKXtpZihoKHQpKXJldHVybiBoKGUpPyhlWzBdPXRbMF0sZVsxXT10WzFdLGVbMl09dFsyXSxlWzNdPXRbM10sZSk6bmV3IFl0KHRbMF0sdFsyXSx0WzFdLHRbM10pfTtZdC5mcm9tQXJyYXk9WXQudW5wYWNrO1l0LmZyb21Db2x1bW5NYWpvckFycmF5PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHkuZGVmaW5lZCgidmFsdWVzIix0KSxZdC5jbG9uZSh0LGUpfTtZdC5mcm9tUm93TWFqb3JBcnJheT1mdW5jdGlvbih0LGUpe3JldHVybiB5LmRlZmluZWQoInZhbHVlcyIsdCksaChlKT8oZVswXT10WzBdLGVbMV09dFsyXSxlWzJdPXRbMV0sZVszXT10WzNdLGUpOm5ldyBZdCh0WzBdLHRbMV0sdFsyXSx0WzNdKX07WXQuZnJvbVNjYWxlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHkudHlwZU9mLm9iamVjdCgic2NhbGUiLHQpLGgoZSk/KGVbMF09dC54LGVbMV09MCxlWzJdPTAsZVszXT10LnksZSk6bmV3IFl0KHQueCwwLDAsdC55KX07WXQuZnJvbVVuaWZvcm1TY2FsZT1mdW5jdGlvbih0LGUpe3JldHVybiB5LnR5cGVPZi5udW1iZXIoInNjYWxlIix0KSxoKGUpPyhlWzBdPXQsZVsxXT0wLGVbMl09MCxlWzNdPXQsZSk6bmV3IFl0KHQsMCwwLHQpfTtZdC5mcm9tUm90YXRpb249ZnVuY3Rpb24odCxlKXt5LnR5cGVPZi5udW1iZXIoImFuZ2xlIix0KTtsZXQgbj1NYXRoLmNvcyh0KSxvPU1hdGguc2luKHQpO3JldHVybiBoKGUpPyhlWzBdPW4sZVsxXT1vLGVbMl09LW8sZVszXT1uLGUpOm5ldyBZdChuLC1vLG8sbil9O1l0LnRvQXJyYXk9ZnVuY3Rpb24odCxlKXtyZXR1cm4geS50eXBlT2Yub2JqZWN0KCJtYXRyaXgiLHQpLGgoZSk/KGVbMF09dFswXSxlWzFdPXRbMV0sZVsyXT10WzJdLGVbM109dFszXSxlKTpbdFswXSx0WzFdLHRbMl0sdFszXV19O1l0LmdldEVsZW1lbnRJbmRleD1mdW5jdGlvbih0LGUpe3JldHVybiB5LnR5cGVPZi5udW1iZXIuZ3JlYXRlclRoYW5PckVxdWFscygicm93IixlLDApLHkudHlwZU9mLm51bWJlci5sZXNzVGhhbk9yRXF1YWxzKCJyb3ciLGUsMSkseS50eXBlT2YubnVtYmVyLmdyZWF0ZXJUaGFuT3JFcXVhbHMoImNvbHVtbiIsdCwwKSx5LnR5cGVPZi5udW1iZXIubGVzc1RoYW5PckVxdWFscygiY29sdW1uIix0LDEpLHQqMitlfTtZdC5nZXRDb2x1bW49ZnVuY3Rpb24odCxlLG4pe3kudHlwZU9mLm9iamVjdCgibWF0cml4Iix0KSx5LnR5cGVPZi5udW1iZXIuZ3JlYXRlclRoYW5PckVxdWFscygiaW5kZXgiLGUsMCkseS50eXBlT2YubnVtYmVyLmxlc3NUaGFuT3JFcXVhbHMoImluZGV4IixlLDEpLHkudHlwZU9mLm9iamVjdCgicmVzdWx0IixuKTtsZXQgbz1lKjIscj10W29dLGk9dFtvKzFdO3JldHVybiBuLng9cixuLnk9aSxufTtZdC5zZXRDb2x1bW49ZnVuY3Rpb24odCxlLG4sbyl7eS50eXBlT2Yub2JqZWN0KCJtYXRyaXgiLHQpLHkudHlwZU9mLm51bWJlci5ncmVhdGVyVGhhbk9yRXF1YWxzKCJpbmRleCIsZSwwKSx5LnR5cGVPZi5udW1iZXIubGVzc1RoYW5PckVxdWFscygiaW5kZXgiLGUsMSkseS50eXBlT2Yub2JqZWN0KCJjYXJ0ZXNpYW4iLG4pLHkudHlwZU9mLm9iamVjdCgicmVzdWx0IixvKSxvPVl0LmNsb25lKHQsbyk7bGV0IHI9ZSoyO3JldHVybiBvW3JdPW4ueCxvW3IrMV09bi55LG99O1l0LmdldFJvdz1mdW5jdGlvbih0LGUsbil7eS50eXBlT2Yub2JqZWN0KCJtYXRyaXgiLHQpLHkudHlwZU9mLm51bWJlci5ncmVhdGVyVGhhbk9yRXF1YWxzKCJpbmRleCIsZSwwKSx5LnR5cGVPZi5udW1iZXIubGVzc1RoYW5PckVxdWFscygiaW5kZXgiLGUsMSkseS50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLG4pO2xldCBvPXRbZV0scj10W2UrMl07cmV0dXJuIG4ueD1vLG4ueT1yLG59O1l0LnNldFJvdz1mdW5jdGlvbih0LGUsbixvKXtyZXR1cm4geS50eXBlT2Yub2JqZWN0KCJtYXRyaXgiLHQpLHkudHlwZU9mLm51bWJlci5ncmVhdGVyVGhhbk9yRXF1YWxzKCJpbmRleCIsZSwwKSx5LnR5cGVPZi5udW1iZXIubGVzc1RoYW5PckVxdWFscygiaW5kZXgiLGUsMSkseS50eXBlT2Yub2JqZWN0KCJjYXJ0ZXNpYW4iLG4pLHkudHlwZU9mLm9iamVjdCgicmVzdWx0IixvKSxvPVl0LmNsb25lKHQsbyksb1tlXT1uLngsb1tlKzJdPW4ueSxvfTt0UD1uZXcgdHQ7WXQuc2V0U2NhbGU9ZnVuY3Rpb24odCxlLG4pe3kudHlwZU9mLm9iamVjdCgibWF0cml4Iix0KSx5LnR5cGVPZi5vYmplY3QoInNjYWxlIixlKSx5LnR5cGVPZi5vYmplY3QoInJlc3VsdCIsbik7bGV0IG89WXQuZ2V0U2NhbGUodCx0UCkscj1lLngvby54LGk9ZS55L28ueTtyZXR1cm4gblswXT10WzBdKnIsblsxXT10WzFdKnIsblsyXT10WzJdKmksblszXT10WzNdKmksbn07ZVA9bmV3IHR0O1l0LnNldFVuaWZvcm1TY2FsZT1mdW5jdGlvbih0LGUsbil7eS50eXBlT2Yub2JqZWN0KCJtYXRyaXgiLHQpLHkudHlwZU9mLm51bWJlcigic2NhbGUiLGUpLHkudHlwZU9mLm9iamVjdCgicmVzdWx0IixuKTtsZXQgbz1ZdC5nZXRTY2FsZSh0LGVQKSxyPWUvby54LGk9ZS9vLnk7cmV0dXJuIG5bMF09dFswXSpyLG5bMV09dFsxXSpyLG5bMl09dFsyXSppLG5bM109dFszXSppLG59O2xiPW5ldyB0dDtZdC5nZXRTY2FsZT1mdW5jdGlvbih0LGUpe3JldHVybiB5LnR5cGVPZi5vYmplY3QoIm1hdHJpeCIsdCkseS50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLGUpLGUueD10dC5tYWduaXR1ZGUodHQuZnJvbUVsZW1lbnRzKHRbMF0sdFsxXSxsYikpLGUueT10dC5tYWduaXR1ZGUodHQuZnJvbUVsZW1lbnRzKHRbMl0sdFszXSxsYikpLGV9O3BiPW5ldyB0dDtZdC5nZXRNYXhpbXVtU2NhbGU9ZnVuY3Rpb24odCl7cmV0dXJuIFl0LmdldFNjYWxlKHQscGIpLHR0Lm1heGltdW1Db21wb25lbnQocGIpfTtuUD1uZXcgdHQ7WXQuc2V0Um90YXRpb249ZnVuY3Rpb24odCxlLG4pe3kudHlwZU9mLm9iamVjdCgibWF0cml4Iix0KSx5LnR5cGVPZi5vYmplY3QoInJlc3VsdCIsbik7bGV0IG89WXQuZ2V0U2NhbGUodCxuUCk7cmV0dXJuIG5bMF09ZVswXSpvLngsblsxXT1lWzFdKm8ueCxuWzJdPWVbMl0qby55LG5bM109ZVszXSpvLnksbn07b1A9bmV3IHR0O1l0LmdldFJvdGF0aW9uPWZ1bmN0aW9uKHQsZSl7eS50eXBlT2Yub2JqZWN0KCJtYXRyaXgiLHQpLHkudHlwZU9mLm9iamVjdCgicmVzdWx0IixlKTtsZXQgbj1ZdC5nZXRTY2FsZSh0LG9QKTtyZXR1cm4gZVswXT10WzBdL24ueCxlWzFdPXRbMV0vbi54LGVbMl09dFsyXS9uLnksZVszXT10WzNdL24ueSxlfTtZdC5tdWx0aXBseT1mdW5jdGlvbih0LGUsbil7eS50eXBlT2Yub2JqZWN0KCJsZWZ0Iix0KSx5LnR5cGVPZi5vYmplY3QoInJpZ2h0IixlKSx5LnR5cGVPZi5vYmplY3QoInJlc3VsdCIsbik7bGV0IG89dFswXSplWzBdK3RbMl0qZVsxXSxyPXRbMF0qZVsyXSt0WzJdKmVbM10saT10WzFdKmVbMF0rdFszXSplWzFdLHM9dFsxXSplWzJdK3RbM10qZVszXTtyZXR1cm4gblswXT1vLG5bMV09aSxuWzJdPXIsblszXT1zLG59O1l0LmFkZD1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHkudHlwZU9mLm9iamVjdCgibGVmdCIsdCkseS50eXBlT2Yub2JqZWN0KCJyaWdodCIsZSkseS50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLG4pLG5bMF09dFswXStlWzBdLG5bMV09dFsxXStlWzFdLG5bMl09dFsyXStlWzJdLG5bM109dFszXStlWzNdLG59O1l0LnN1YnRyYWN0PWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4geS50eXBlT2Yub2JqZWN0KCJsZWZ0Iix0KSx5LnR5cGVPZi5vYmplY3QoInJpZ2h0IixlKSx5LnR5cGVPZi5vYmplY3QoInJlc3VsdCIsbiksblswXT10WzBdLWVbMF0sblsxXT10WzFdLWVbMV0sblsyXT10WzJdLWVbMl0sblszXT10WzNdLWVbM10sbn07WXQubXVsdGlwbHlCeVZlY3Rvcj1mdW5jdGlvbih0LGUsbil7eS50eXBlT2Yub2JqZWN0KCJtYXRyaXgiLHQpLHkudHlwZU9mLm9iamVjdCgiY2FydGVzaWFuIixlKSx5LnR5cGVPZi5vYmplY3QoInJlc3VsdCIsbik7bGV0IG89dFswXSplLngrdFsyXSplLnkscj10WzFdKmUueCt0WzNdKmUueTtyZXR1cm4gbi54PW8sbi55PXIsbn07WXQubXVsdGlwbHlCeVNjYWxhcj1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHkudHlwZU9mLm9iamVjdCgibWF0cml4Iix0KSx5LnR5cGVPZi5udW1iZXIoInNjYWxhciIsZSkseS50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLG4pLG5bMF09dFswXSplLG5bMV09dFsxXSplLG5bMl09dFsyXSplLG5bM109dFszXSplLG59O1l0Lm11bHRpcGx5QnlTY2FsZT1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHkudHlwZU9mLm9iamVjdCgibWF0cml4Iix0KSx5LnR5cGVPZi5vYmplY3QoInNjYWxlIixlKSx5LnR5cGVPZi5vYmplY3QoInJlc3VsdCIsbiksblswXT10WzBdKmUueCxuWzFdPXRbMV0qZS54LG5bMl09dFsyXSplLnksblszXT10WzNdKmUueSxufTtZdC5tdWx0aXBseUJ5VW5pZm9ybVNjYWxlPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4geS50eXBlT2Yub2JqZWN0KCJtYXRyaXgiLHQpLHkudHlwZU9mLm51bWJlcigic2NhbGUiLGUpLHkudHlwZU9mLm9iamVjdCgicmVzdWx0IixuKSxuWzBdPXRbMF0qZSxuWzFdPXRbMV0qZSxuWzJdPXRbMl0qZSxuWzNdPXRbM10qZSxufTtZdC5uZWdhdGU9ZnVuY3Rpb24odCxlKXtyZXR1cm4geS50eXBlT2Yub2JqZWN0KCJtYXRyaXgiLHQpLHkudHlwZU9mLm9iamVjdCgicmVzdWx0IixlKSxlWzBdPS10WzBdLGVbMV09LXRbMV0sZVsyXT0tdFsyXSxlWzNdPS10WzNdLGV9O1l0LnRyYW5zcG9zZT1mdW5jdGlvbih0LGUpe3kudHlwZU9mLm9iamVjdCgibWF0cml4Iix0KSx5LnR5cGVPZi5vYmplY3QoInJlc3VsdCIsZSk7bGV0IG49dFswXSxvPXRbMl0scj10WzFdLGk9dFszXTtyZXR1cm4gZVswXT1uLGVbMV09byxlWzJdPXIsZVszXT1pLGV9O1l0LmFicz1mdW5jdGlvbih0LGUpe3JldHVybiB5LnR5cGVPZi5vYmplY3QoIm1hdHJpeCIsdCkseS50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLGUpLGVbMF09TWF0aC5hYnModFswXSksZVsxXT1NYXRoLmFicyh0WzFdKSxlWzJdPU1hdGguYWJzKHRbMl0pLGVbM109TWF0aC5hYnModFszXSksZX07WXQuZXF1YWxzPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQ9PT1lfHxoKHQpJiZoKGUpJiZ0WzBdPT09ZVswXSYmdFsxXT09PWVbMV0mJnRbMl09PT1lWzJdJiZ0WzNdPT09ZVszXX07WXQuZXF1YWxzQXJyYXk9ZnVuY3Rpb24odCxlLG4pe3JldHVybiB0WzBdPT09ZVtuXSYmdFsxXT09PWVbbisxXSYmdFsyXT09PWVbbisyXSYmdFszXT09PWVbbiszXX07WXQuZXF1YWxzRXBzaWxvbj1mdW5jdGlvbih0LGUsbil7cmV0dXJuIG49eChuLDApLHQ9PT1lfHxoKHQpJiZoKGUpJiZNYXRoLmFicyh0WzBdLWVbMF0pPD1uJiZNYXRoLmFicyh0WzFdLWVbMV0pPD1uJiZNYXRoLmFicyh0WzJdLWVbMl0pPD1uJiZNYXRoLmFicyh0WzNdLWVbM10pPD1ufTtZdC5JREVOVElUWT1PYmplY3QuZnJlZXplKG5ldyBZdCgxLDAsMCwxKSk7WXQuWkVSTz1PYmplY3QuZnJlZXplKG5ldyBZdCgwLDAsMCwwKSk7WXQuQ09MVU1OMFJPVzA9MDtZdC5DT0xVTU4wUk9XMT0xO1l0LkNPTFVNTjFST1cwPTI7WXQuQ09MVU1OMVJPVzE9MztPYmplY3QuZGVmaW5lUHJvcGVydGllcyhZdC5wcm90b3R5cGUse2xlbmd0aDp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIFl0LnBhY2tlZExlbmd0aH19fSk7WXQucHJvdG90eXBlLmNsb25lPWZ1bmN0aW9uKHQpe3JldHVybiBZdC5jbG9uZSh0aGlzLHQpfTtZdC5wcm90b3R5cGUuZXF1YWxzPWZ1bmN0aW9uKHQpe3JldHVybiBZdC5lcXVhbHModGhpcyx0KX07WXQucHJvdG90eXBlLmVxdWFsc0Vwc2lsb249ZnVuY3Rpb24odCxlKXtyZXR1cm4gWXQuZXF1YWxzRXBzaWxvbih0aGlzLHQsZSl9O1l0LnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybmAoJHt0aGlzWzBdfSwgJHt0aGlzWzJdfSkKKCR7dGhpc1sxXX0sICR7dGhpc1szXX0pYH07WW89WXR9KTt2YXIgbW8sQnQsdG49WigoKT0+eyRzKCk7bW89e1BPSU5UUzpxdC5QT0lOVFMsTElORVM6cXQuTElORVMsTElORV9MT09QOnF0LkxJTkVfTE9PUCxMSU5FX1NUUklQOnF0LkxJTkVfU1RSSVAsVFJJQU5HTEVTOnF0LlRSSUFOR0xFUyxUUklBTkdMRV9TVFJJUDpxdC5UUklBTkdMRV9TVFJJUCxUUklBTkdMRV9GQU46cXQuVFJJQU5HTEVfRkFOfTttby5pc0xpbmVzPWZ1bmN0aW9uKHQpe3JldHVybiB0PT09bW8uTElORVN8fHQ9PT1tby5MSU5FX0xPT1B8fHQ9PT1tby5MSU5FX1NUUklQfTttby5pc1RyaWFuZ2xlcz1mdW5jdGlvbih0KXtyZXR1cm4gdD09PW1vLlRSSUFOR0xFU3x8dD09PW1vLlRSSUFOR0xFX1NUUklQfHx0PT09bW8uVFJJQU5HTEVfRkFOfTttby52YWxpZGF0ZT1mdW5jdGlvbih0KXtyZXR1cm4gdD09PW1vLlBPSU5UU3x8dD09PW1vLkxJTkVTfHx0PT09bW8uTElORV9MT09QfHx0PT09bW8uTElORV9TVFJJUHx8dD09PW1vLlRSSUFOR0xFU3x8dD09PW1vLlRSSUFOR0xFX1NUUklQfHx0PT09bW8uVFJJQU5HTEVfRkFOfTtCdD1PYmplY3QuZnJlZXplKG1vKX0pO2Z1bmN0aW9uIHZoKHQpe3Q9eCh0LHguRU1QVFlfT0JKRUNUKSx5LnR5cGVPZi5vYmplY3QoIm9wdGlvbnMuYXR0cmlidXRlcyIsdC5hdHRyaWJ1dGVzKSx0aGlzLmF0dHJpYnV0ZXM9dC5hdHRyaWJ1dGVzLHRoaXMuaW5kaWNlcz10LmluZGljZXMsdGhpcy5wcmltaXRpdmVUeXBlPXgodC5wcmltaXRpdmVUeXBlLEJ0LlRSSUFOR0xFUyksdGhpcy5ib3VuZGluZ1NwaGVyZT10LmJvdW5kaW5nU3BoZXJlLHRoaXMuZ2VvbWV0cnlUeXBlPXgodC5nZW9tZXRyeVR5cGUsTWkuTk9ORSksdGhpcy5ib3VuZGluZ1NwaGVyZUNWPXQuYm91bmRpbmdTcGhlcmVDVix0aGlzLm9mZnNldEF0dHJpYnV0ZT10Lm9mZnNldEF0dHJpYnV0ZX12YXIgclAsaVAsZGIsc1AsY1AsYVAsZlAsdVAsbFAscFAsVXQsWGU9WigoKT0+e1VlKCk7RnQoKTtJZSgpO1h0KCk7SXQoKTtmdCgpO0h0KCk7THAoKTtBZigpO0JuKCk7VW4oKTt0bigpO0tvKCk7d24oKTtjcygpO3ZoLmNvbXB1dGVOdW1iZXJPZlZlcnRpY2VzPWZ1bmN0aW9uKHQpe3kudHlwZU9mLm9iamVjdCgiZ2VvbWV0cnkiLHQpO2xldCBlPS0xO2ZvcihsZXQgbiBpbiB0LmF0dHJpYnV0ZXMpaWYodC5hdHRyaWJ1dGVzLmhhc093blByb3BlcnR5KG4pJiZoKHQuYXR0cmlidXRlc1tuXSkmJmgodC5hdHRyaWJ1dGVzW25dLnZhbHVlcykpe2xldCBvPXQuYXR0cmlidXRlc1tuXSxyPW8udmFsdWVzLmxlbmd0aC9vLmNvbXBvbmVudHNQZXJBdHRyaWJ1dGU7aWYoZSE9PXImJmUhPT0tMSl0aHJvdyBuZXcgQigiQWxsIGF0dHJpYnV0ZSBsaXN0cyBtdXN0IGhhdmUgdGhlIHNhbWUgbnVtYmVyIG9mIGF0dHJpYnV0ZXMuIik7ZT1yfXJldHVybiBlfTtyUD1uZXcgY3QsaVA9bmV3IGEsZGI9bmV3IHN0LHNQPVtuZXcgY3QsbmV3IGN0LG5ldyBjdF0sY1A9W25ldyB0dCxuZXcgdHQsbmV3IHR0XSxhUD1bbmV3IHR0LG5ldyB0dCxuZXcgdHRdLGZQPW5ldyBhLHVQPW5ldyBlZSxsUD1uZXcgc3QscFA9bmV3IFlvO3ZoLl90ZXh0dXJlQ29vcmRpbmF0ZVJvdGF0aW9uUG9pbnRzPWZ1bmN0aW9uKHQsZSxuLG8pe2xldCByLGk9TnQuY2VudGVyKG8sclApLHM9Y3QudG9DYXJ0ZXNpYW4oaSxuLGlQKSxmPVhvLmVhc3ROb3J0aFVwVG9GaXhlZEZyYW1lKHMsbixkYiksdT1zdC5pbnZlcnNlKGYsZGIpLGM9Y1AsbD1zUDtsWzBdLmxvbmdpdHVkZT1vLndlc3QsbFswXS5sYXRpdHVkZT1vLnNvdXRoLGxbMV0ubG9uZ2l0dWRlPW8ud2VzdCxsWzFdLmxhdGl0dWRlPW8ubm9ydGgsbFsyXS5sb25naXR1ZGU9by5lYXN0LGxbMl0ubGF0aXR1ZGU9by5zb3V0aDtsZXQgcD1mUDtmb3Iocj0wO3I8MztyKyspY3QudG9DYXJ0ZXNpYW4obFtyXSxuLHApLHA9c3QubXVsdGlwbHlCeVBvaW50QXNWZWN0b3IodSxwLHApLGNbcl0ueD1wLngsY1tyXS55PXAueTtsZXQgZD1lZS5mcm9tQXhpc0FuZ2xlKGEuVU5JVF9aLC1lLHVQKSxtPVEuZnJvbVF1YXRlcm5pb24oZCxsUCksXz10Lmxlbmd0aCxnPU51bWJlci5QT1NJVElWRV9JTkZJTklUWSxiPU51bWJlci5QT1NJVElWRV9JTkZJTklUWSxUPU51bWJlci5ORUdBVElWRV9JTkZJTklUWSxPPU51bWJlci5ORUdBVElWRV9JTkZJTklUWTtmb3Iocj0wO3I8XztyKyspcD1zdC5tdWx0aXBseUJ5UG9pbnRBc1ZlY3Rvcih1LHRbcl0scCkscD1RLm11bHRpcGx5QnlWZWN0b3IobSxwLHApLGc9TWF0aC5taW4oZyxwLngpLGI9TWF0aC5taW4oYixwLnkpLFQ9TWF0aC5tYXgoVCxwLngpLE89TWF0aC5tYXgoTyxwLnkpO2xldCBFPVlvLmZyb21Sb3RhdGlvbihlLHBQKSx3PWFQO3dbMF0ueD1nLHdbMF0ueT1iLHdbMV0ueD1nLHdbMV0ueT1PLHdbMl0ueD1ULHdbMl0ueT1iO2xldCBDPWNbMF0sTj1jWzJdLngtQy54LEk9Y1sxXS55LUMueTtmb3Iocj0wO3I8MztyKyspe2xldCBBPXdbcl07WW8ubXVsdGlwbHlCeVZlY3RvcihFLEEsQSksQS54PShBLngtQy54KS9OLEEueT0oQS55LUMueSkvSX1sZXQgRD13WzBdLHY9d1sxXSxMPXdbMl0sVT1uZXcgQXJyYXkoNik7cmV0dXJuIHR0LnBhY2soRCxVKSx0dC5wYWNrKHYsVSwyKSx0dC5wYWNrKEwsVSw0KSxVfTtVdD12aH0pO2Z1bmN0aW9uIGRQKHQpe2lmKHQ9eCh0LHguRU1QVFlfT0JKRUNUKSwhaCh0LmNvbXBvbmVudERhdGF0eXBlKSl0aHJvdyBuZXcgQigib3B0aW9ucy5jb21wb25lbnREYXRhdHlwZSBpcyByZXF1aXJlZC4iKTtpZighaCh0LmNvbXBvbmVudHNQZXJBdHRyaWJ1dGUpKXRocm93IG5ldyBCKCJvcHRpb25zLmNvbXBvbmVudHNQZXJBdHRyaWJ1dGUgaXMgcmVxdWlyZWQuIik7aWYodC5jb21wb25lbnRzUGVyQXR0cmlidXRlPDF8fHQuY29tcG9uZW50c1BlckF0dHJpYnV0ZT40KXRocm93IG5ldyBCKCJvcHRpb25zLmNvbXBvbmVudHNQZXJBdHRyaWJ1dGUgbXVzdCBiZSBiZXR3ZWVuIDEgYW5kIDQuIik7aWYoIWgodC52YWx1ZXMpKXRocm93IG5ldyBCKCJvcHRpb25zLnZhbHVlcyBpcyByZXF1aXJlZC4iKTt0aGlzLmNvbXBvbmVudERhdGF0eXBlPXQuY29tcG9uZW50RGF0YXR5cGUsdGhpcy5jb21wb25lbnRzUGVyQXR0cmlidXRlPXQuY29tcG9uZW50c1BlckF0dHJpYnV0ZSx0aGlzLm5vcm1hbGl6ZT14KHQubm9ybWFsaXplLCExKSx0aGlzLnZhbHVlcz10LnZhbHVlc312YXIgaXQsWWU9WigoKT0+e0l0KCk7ZnQoKTtIdCgpO2l0PWRQfSk7ZnVuY3Rpb24gbVAodCl7dD14KHQseC5FTVBUWV9PQkpFQ1QpLHRoaXMucG9zaXRpb249dC5wb3NpdGlvbix0aGlzLm5vcm1hbD10Lm5vcm1hbCx0aGlzLnN0PXQuc3QsdGhpcy5iaXRhbmdlbnQ9dC5iaXRhbmdlbnQsdGhpcy50YW5nZW50PXQudGFuZ2VudCx0aGlzLmNvbG9yPXQuY29sb3J9dmFyIGllLGFuPVooKCk9PntJdCgpO2llPW1QfSk7dmFyIEhlLG1iLGhiPVooKCk9PntVZSgpO0Z0KCk7aHIoKTtYdCgpO0h0KCk7QWYoKTtCbigpO1VuKCk7SGU9e1NDQUxBUjoiU0NBTEFSIixWRUMyOiJWRUMyIixWRUMzOiJWRUMzIixWRUM0OiJWRUM0IixNQVQyOiJNQVQyIixNQVQzOiJNQVQzIixNQVQ0OiJNQVQ0In07SGUuZ2V0TWF0aFR5cGU9ZnVuY3Rpb24odCl7c3dpdGNoKHQpe2Nhc2UgSGUuU0NBTEFSOnJldHVybiBOdW1iZXI7Y2FzZSBIZS5WRUMyOnJldHVybiB0dDtjYXNlIEhlLlZFQzM6cmV0dXJuIGE7Y2FzZSBIZS5WRUM0OnJldHVybiBoZTtjYXNlIEhlLk1BVDI6cmV0dXJuIFlvO2Nhc2UgSGUuTUFUMzpyZXR1cm4gUTtjYXNlIEhlLk1BVDQ6cmV0dXJuIHN0O2RlZmF1bHQ6dGhyb3cgbmV3IEIoImF0dHJpYnV0ZVR5cGUgaXMgbm90IGEgdmFsaWQgdmFsdWUuIil9fTtIZS5nZXROdW1iZXJPZkNvbXBvbmVudHM9ZnVuY3Rpb24odCl7c3dpdGNoKHQpe2Nhc2UgSGUuU0NBTEFSOnJldHVybiAxO2Nhc2UgSGUuVkVDMjpyZXR1cm4gMjtjYXNlIEhlLlZFQzM6cmV0dXJuIDM7Y2FzZSBIZS5WRUM0OmNhc2UgSGUuTUFUMjpyZXR1cm4gNDtjYXNlIEhlLk1BVDM6cmV0dXJuIDk7Y2FzZSBIZS5NQVQ0OnJldHVybiAxNjtkZWZhdWx0OnRocm93IG5ldyBCKCJhdHRyaWJ1dGVUeXBlIGlzIG5vdCBhIHZhbGlkIHZhbHVlLiIpfX07SGUuZ2V0QXR0cmlidXRlTG9jYXRpb25Db3VudD1mdW5jdGlvbih0KXtzd2l0Y2godCl7Y2FzZSBIZS5TQ0FMQVI6Y2FzZSBIZS5WRUMyOmNhc2UgSGUuVkVDMzpjYXNlIEhlLlZFQzQ6cmV0dXJuIDE7Y2FzZSBIZS5NQVQyOnJldHVybiAyO2Nhc2UgSGUuTUFUMzpyZXR1cm4gMztjYXNlIEhlLk1BVDQ6cmV0dXJuIDQ7ZGVmYXVsdDp0aHJvdyBuZXcgQigiYXR0cmlidXRlVHlwZSBpcyBub3QgYSB2YWxpZCB2YWx1ZS4iKX19O0hlLmdldEdsc2xUeXBlPWZ1bmN0aW9uKHQpe3N3aXRjaCh5LnR5cGVPZi5zdHJpbmcoImF0dHJpYnV0ZVR5cGUiLHQpLHQpe2Nhc2UgSGUuU0NBTEFSOnJldHVybiJmbG9hdCI7Y2FzZSBIZS5WRUMyOnJldHVybiJ2ZWMyIjtjYXNlIEhlLlZFQzM6cmV0dXJuInZlYzMiO2Nhc2UgSGUuVkVDNDpyZXR1cm4idmVjNCI7Y2FzZSBIZS5NQVQyOnJldHVybiJtYXQyIjtjYXNlIEhlLk1BVDM6cmV0dXJuIm1hdDMiO2Nhc2UgSGUuTUFUNDpyZXR1cm4ibWF0NCI7ZGVmYXVsdDp0aHJvdyBuZXcgQigiYXR0cmlidXRlVHlwZSBpcyBub3QgYSB2YWxpZCB2YWx1ZS4iKX19O21iPU9iamVjdC5mcmVlemUoSGUpfSk7ZnVuY3Rpb24gRHAodCl7cmV0dXJuIGdiWzBdPXQsZ2JbMF19ZnVuY3Rpb24gTGgodCl7cmV0dXJuIHQ+PjFeLSh0JjEpfXZhciBfYix5YixlbixiZixnYixEaCxubixhcz1aKCgpPT57VWUoKTtGdCgpO0ZlKCk7WHQoKTtmdCgpO0h0KCk7V3QoKTtoYigpO19iPTEvMjU2LHliPTI1Nixlbj17fTtlbi5vY3RFbmNvZGVJblJhbmdlPWZ1bmN0aW9uKHQsZSxuKXt5LmRlZmluZWQoInZlY3RvciIsdCkseS5kZWZpbmVkKCJyZXN1bHQiLG4pO2xldCBvPWEubWFnbml0dWRlU3F1YXJlZCh0KTtpZihNYXRoLmFicyhvLTEpPk0uRVBTSUxPTjYpdGhyb3cgbmV3IEIoInZlY3RvciBtdXN0IGJlIG5vcm1hbGl6ZWQuIik7aWYobi54PXQueC8oTWF0aC5hYnModC54KStNYXRoLmFicyh0LnkpK01hdGguYWJzKHQueikpLG4ueT10LnkvKE1hdGguYWJzKHQueCkrTWF0aC5hYnModC55KStNYXRoLmFicyh0LnopKSx0Lno8MCl7bGV0IHI9bi54LGk9bi55O24ueD0oMS1NYXRoLmFicyhpKSkqTS5zaWduTm90WmVybyhyKSxuLnk9KDEtTWF0aC5hYnMocikpKk0uc2lnbk5vdFplcm8oaSl9cmV0dXJuIG4ueD1NLnRvU05vcm0obi54LGUpLG4ueT1NLnRvU05vcm0obi55LGUpLG59O2VuLm9jdEVuY29kZT1mdW5jdGlvbih0LGUpe3JldHVybiBlbi5vY3RFbmNvZGVJblJhbmdlKHQsMjU1LGUpfTtiZj1uZXcgdHQsZ2I9bmV3IFVpbnQ4QXJyYXkoMSk7ZW4ub2N0RW5jb2RlVG9DYXJ0ZXNpYW40PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGVuLm9jdEVuY29kZUluUmFuZ2UodCw2NTUzNSxiZiksZS54PURwKGJmLngqX2IpLGUueT1EcChiZi54KSxlLno9RHAoYmYueSpfYiksZS53PURwKGJmLnkpLGV9O2VuLm9jdERlY29kZUluUmFuZ2U9ZnVuY3Rpb24odCxlLG4sbyl7aWYoeS5kZWZpbmVkKCJyZXN1bHQiLG8pLHQ8MHx8dD5ufHxlPDB8fGU+bil0aHJvdyBuZXcgQihgeCBhbmQgeSBtdXN0IGJlIHVuc2lnbmVkIG5vcm1hbGl6ZWQgaW50ZWdlcnMgYmV0d2VlbiAwIGFuZCAke259YCk7aWYoby54PU0uZnJvbVNOb3JtKHQsbiksby55PU0uZnJvbVNOb3JtKGUsbiksby56PTEtKE1hdGguYWJzKG8ueCkrTWF0aC5hYnMoby55KSksby56PDApe2xldCByPW8ueDtvLng9KDEtTWF0aC5hYnMoby55KSkqTS5zaWduTm90WmVybyhyKSxvLnk9KDEtTWF0aC5hYnMocikpKk0uc2lnbk5vdFplcm8oby55KX1yZXR1cm4gYS5ub3JtYWxpemUobyxvKX07ZW4ub2N0RGVjb2RlPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gZW4ub2N0RGVjb2RlSW5SYW5nZSh0LGUsMjU1LG4pfTtlbi5vY3REZWNvZGVGcm9tQ2FydGVzaWFuND1mdW5jdGlvbih0LGUpe3kudHlwZU9mLm9iamVjdCgiZW5jb2RlZCIsdCkseS50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLGUpO2xldCBuPXQueCxvPXQueSxyPXQueixpPXQudztpZihuPDB8fG4+MjU1fHxvPDB8fG8+MjU1fHxyPDB8fHI+MjU1fHxpPDB8fGk+MjU1KXRocm93IG5ldyBCKCJ4LCB5LCB6LCBhbmQgdyBtdXN0IGJlIHVuc2lnbmVkIG5vcm1hbGl6ZWQgaW50ZWdlcnMgYmV0d2VlbiAwIGFuZCAyNTUiKTtsZXQgcz1uKnliK28sZj1yKnliK2k7cmV0dXJuIGVuLm9jdERlY29kZUluUmFuZ2UocyxmLDY1NTM1LGUpfTtlbi5vY3RQYWNrRmxvYXQ9ZnVuY3Rpb24odCl7cmV0dXJuIHkuZGVmaW5lZCgiZW5jb2RlZCIsdCksMjU2KnQueCt0Lnl9O0RoPW5ldyB0dDtlbi5vY3RFbmNvZGVGbG9hdD1mdW5jdGlvbih0KXtyZXR1cm4gZW4ub2N0RW5jb2RlKHQsRGgpLGVuLm9jdFBhY2tGbG9hdChEaCl9O2VuLm9jdERlY29kZUZsb2F0PWZ1bmN0aW9uKHQsZSl7eS5kZWZpbmVkKCJ2YWx1ZSIsdCk7bGV0IG49dC8yNTYsbz1NYXRoLmZsb29yKG4pLHI9KG4tbykqMjU2O3JldHVybiBlbi5vY3REZWNvZGUobyxyLGUpfTtlbi5vY3RQYWNrPWZ1bmN0aW9uKHQsZSxuLG8pe3kuZGVmaW5lZCgidjEiLHQpLHkuZGVmaW5lZCgidjIiLGUpLHkuZGVmaW5lZCgidjMiLG4pLHkuZGVmaW5lZCgicmVzdWx0IixvKTtsZXQgcj1lbi5vY3RFbmNvZGVGbG9hdCh0KSxpPWVuLm9jdEVuY29kZUZsb2F0KGUpLHM9ZW4ub2N0RW5jb2RlKG4sRGgpO3JldHVybiBvLng9NjU1MzYqcy54K3Isby55PTY1NTM2KnMueStpLG99O2VuLm9jdFVucGFjaz1mdW5jdGlvbih0LGUsbixvKXt5LmRlZmluZWQoInBhY2tlZCIsdCkseS5kZWZpbmVkKCJ2MSIsZSkseS5kZWZpbmVkKCJ2MiIsbikseS5kZWZpbmVkKCJ2MyIsbyk7bGV0IHI9dC54LzY1NTM2LGk9TWF0aC5mbG9vcihyKSxzPShyLWkpKjY1NTM2O3I9dC55LzY1NTM2O2xldCBmPU1hdGguZmxvb3IociksdT0oci1mKSo2NTUzNjtlbi5vY3REZWNvZGVGbG9hdChzLGUpLGVuLm9jdERlY29kZUZsb2F0KHUsbiksZW4ub2N0RGVjb2RlKGksZixvKX07ZW4uY29tcHJlc3NUZXh0dXJlQ29vcmRpbmF0ZXM9ZnVuY3Rpb24odCl7eS5kZWZpbmVkKCJ0ZXh0dXJlQ29vcmRpbmF0ZXMiLHQpO2xldCBlPXQueCo0MDk1fDAsbj10LnkqNDA5NXwwO3JldHVybiA0MDk2KmUrbn07ZW4uZGVjb21wcmVzc1RleHR1cmVDb29yZGluYXRlcz1mdW5jdGlvbih0LGUpe3kuZGVmaW5lZCgiY29tcHJlc3NlZCIsdCkseS5kZWZpbmVkKCJyZXN1bHQiLGUpO2xldCBuPXQvNDA5NixvPU1hdGguZmxvb3Iobik7cmV0dXJuIGUueD1vLzQwOTUsZS55PSh0LW8qNDA5NikvNDA5NSxlfTtlbi56aWdaYWdEZWx0YURlY29kZT1mdW5jdGlvbih0LGUsbil7eS5kZWZpbmVkKCJ1QnVmZmVyIix0KSx5LmRlZmluZWQoInZCdWZmZXIiLGUpLHkudHlwZU9mLm51bWJlci5lcXVhbHMoInVCdWZmZXIubGVuZ3RoIiwidkJ1ZmZlci5sZW5ndGgiLHQubGVuZ3RoLGUubGVuZ3RoKSxoKG4pJiZ5LnR5cGVPZi5udW1iZXIuZXF1YWxzKCJ1QnVmZmVyLmxlbmd0aCIsImhlaWdodEJ1ZmZlci5sZW5ndGgiLHQubGVuZ3RoLG4ubGVuZ3RoKTtsZXQgbz10Lmxlbmd0aCxyPTAsaT0wLHM9MDtmb3IobGV0IGY9MDtmPG87KytmKXIrPUxoKHRbZl0pLGkrPUxoKGVbZl0pLHRbZl09cixlW2ZdPWksaChuKSYmKHMrPUxoKG5bZl0pLG5bZl09cyl9O2VuLmRlcXVhbnRpemU9ZnVuY3Rpb24odCxlLG4sbyl7eS5kZWZpbmVkKCJ0eXBlZEFycmF5Iix0KSx5LmRlZmluZWQoImNvbXBvbmVudERhdGF0eXBlIixlKSx5LmRlZmluZWQoInR5cGUiLG4pLHkuZGVmaW5lZCgiY291bnQiLG8pO2xldCByPW1iLmdldE51bWJlck9mQ29tcG9uZW50cyhuKSxpO3N3aXRjaChlKXtjYXNlIG50LkJZVEU6aT0xMjc7YnJlYWs7Y2FzZSBudC5VTlNJR05FRF9CWVRFOmk9MjU1O2JyZWFrO2Nhc2UgbnQuU0hPUlQ6aT0zMjc2NzticmVhaztjYXNlIG50LlVOU0lHTkVEX1NIT1JUOmk9NjU1MzU7YnJlYWs7Y2FzZSBudC5JTlQ6aT0yMTQ3NDgzNjQ3O2JyZWFrO2Nhc2UgbnQuVU5TSUdORURfSU5UOmk9NDI5NDk2NzI5NTticmVhaztkZWZhdWx0OnRocm93IG5ldyBCKGBDYW5ub3QgZGVxdWFudGl6ZSBjb21wb25lbnQgZGF0YXR5cGU6ICR7ZX1gKX1sZXQgcz1uZXcgRmxvYXQzMkFycmF5KG8qcik7Zm9yKGxldCBmPTA7ZjxvO2YrKylmb3IobGV0IHU9MDt1PHI7dSsrKXtsZXQgYz1mKnIrdTtzW2NdPU1hdGgubWF4KHRbY10vaSwtMSl9cmV0dXJuIHN9O2VuLmRlY29kZVJHQjU2NT1mdW5jdGlvbih0LGUpe3kuZGVmaW5lZCgidHlwZWRBcnJheSIsdCk7bGV0IG49dC5sZW5ndGgqMztoKGUpJiZ5LnR5cGVPZi5udW1iZXIuZXF1YWxzKCJyZXN1bHQubGVuZ3RoIiwidHlwZWRBcnJheS5sZW5ndGggKiAzIixlLmxlbmd0aCxuKTtsZXQgbz10Lmxlbmd0aDtoKGUpfHwoZT1uZXcgRmxvYXQzMkFycmF5KG8qMykpO2xldCByPTMxLGk9NjMscz0xLzMxLGY9MS82Mztmb3IobGV0IHU9MDt1PG87dSsrKXtsZXQgYz10W3VdLGw9Yz4+MTEscD1jPj41JmksZD1jJnIsbT0zKnU7ZVttXT1sKnMsZVttKzFdPXAqZixlW20rMl09ZCpzfXJldHVybiBlfTtubj1lbn0pO2Z1bmN0aW9uIGhQKHQsZSxuLG8scil7eS5kZWZpbmVkKCJwb2ludCIsdCkseS5kZWZpbmVkKCJwMCIsZSkseS5kZWZpbmVkKCJwMSIsbikseS5kZWZpbmVkKCJwMiIsbyksaChyKXx8KHI9bmV3IGEpO2xldCBpLHMsZix1LGMsbCxwLGQ7aWYoaChlLnopKXtpZihhLmVxdWFsc0Vwc2lsb24odCxlLE0uRVBTSUxPTjE0KSlyZXR1cm4gYS5jbG9uZShhLlVOSVRfWCxyKTtpZihhLmVxdWFsc0Vwc2lsb24odCxuLE0uRVBTSUxPTjE0KSlyZXR1cm4gYS5jbG9uZShhLlVOSVRfWSxyKTtpZihhLmVxdWFsc0Vwc2lsb24odCxvLE0uRVBTSUxPTjE0KSlyZXR1cm4gYS5jbG9uZShhLlVOSVRfWixyKTtpPWEuc3VidHJhY3QobixlLEFiKSxzPWEuc3VidHJhY3QobyxlLGJiKSxmPWEuc3VidHJhY3QodCxlLFRiKSx1PWEuZG90KGksaSksYz1hLmRvdChpLHMpLGw9YS5kb3QoaSxmKSxwPWEuZG90KHMscyksZD1hLmRvdChzLGYpfWVsc2V7aWYodHQuZXF1YWxzRXBzaWxvbih0LGUsTS5FUFNJTE9OMTQpKXJldHVybiBhLmNsb25lKGEuVU5JVF9YLHIpO2lmKHR0LmVxdWFsc0Vwc2lsb24odCxuLE0uRVBTSUxPTjE0KSlyZXR1cm4gYS5jbG9uZShhLlVOSVRfWSxyKTtpZih0dC5lcXVhbHNFcHNpbG9uKHQsbyxNLkVQU0lMT04xNCkpcmV0dXJuIGEuY2xvbmUoYS5VTklUX1oscik7aT10dC5zdWJ0cmFjdChuLGUsQWIpLHM9dHQuc3VidHJhY3QobyxlLGJiKSxmPXR0LnN1YnRyYWN0KHQsZSxUYiksdT10dC5kb3QoaSxpKSxjPXR0LmRvdChpLHMpLGw9dHQuZG90KGksZikscD10dC5kb3QocyxzKSxkPXR0LmRvdChzLGYpfXIueT1wKmwtYypkLHIuej11KmQtYypsO2xldCBtPXUqcC1jKmM7aWYobSE9PTApcmV0dXJuIHIueS89bSxyLnovPW0sci54PTEtci55LXIueixyfXZhciBBYixiYixUYix3YixPYj1aKCgpPT57VWUoKTtGdCgpO1h0KCk7ZnQoKTtXdCgpO0FiPW5ldyBhLGJiPW5ldyBhLFRiPW5ldyBhO3diPWhQfSk7ZnVuY3Rpb24gcmkoKXt0aGlzLmhpZ2g9YS5jbG9uZShhLlpFUk8pLHRoaXMubG93PWEuY2xvbmUoYS5aRVJPKX12YXIgTmksRmgsWnMsQmg9WigoKT0+e0Z0KCk7WHQoKTtmdCgpO3JpLmVuY29kZT1mdW5jdGlvbih0LGUpe3kudHlwZU9mLm51bWJlcigidmFsdWUiLHQpLGgoZSl8fChlPXtoaWdoOjAsbG93OjB9KTtsZXQgbjtyZXR1cm4gdD49MD8obj1NYXRoLmZsb29yKHQvNjU1MzYpKjY1NTM2LGUuaGlnaD1uLGUubG93PXQtbik6KG49TWF0aC5mbG9vcigtdC82NTUzNikqNjU1MzYsZS5oaWdoPS1uLGUubG93PXQrbiksZX07Tmk9e2hpZ2g6MCxsb3c6MH07cmkuZnJvbUNhcnRlc2lhbj1mdW5jdGlvbih0LGUpe3kudHlwZU9mLm9iamVjdCgiY2FydGVzaWFuIix0KSxoKGUpfHwoZT1uZXcgcmkpO2xldCBuPWUuaGlnaCxvPWUubG93O3JldHVybiByaS5lbmNvZGUodC54LE5pKSxuLng9TmkuaGlnaCxvLng9TmkubG93LHJpLmVuY29kZSh0LnksTmkpLG4ueT1OaS5oaWdoLG8ueT1OaS5sb3cscmkuZW5jb2RlKHQueixOaSksbi56PU5pLmhpZ2gsby56PU5pLmxvdyxlfTtGaD1uZXcgcmk7cmkud3JpdGVFbGVtZW50cz1mdW5jdGlvbih0LGUsbil7eS5kZWZpbmVkKCJjYXJ0ZXNpYW5BcnJheSIsZSkseS50eXBlT2YubnVtYmVyKCJpbmRleCIsbikseS50eXBlT2YubnVtYmVyLmdyZWF0ZXJUaGFuT3JFcXVhbHMoImluZGV4IixuLDApLHJpLmZyb21DYXJ0ZXNpYW4odCxGaCk7bGV0IG89RmguaGlnaCxyPUZoLmxvdztlW25dPW8ueCxlW24rMV09by55LGVbbisyXT1vLnosZVtuKzNdPXIueCxlW24rNF09ci55LGVbbis1XT1yLnp9O1pzPXJpfSk7dmFyIHRvLER0LCRlPVooKCk9PntmdCgpO0h0KCk7V3QoKTskcygpO3RvPXtVTlNJR05FRF9CWVRFOnF0LlVOU0lHTkVEX0JZVEUsVU5TSUdORURfU0hPUlQ6cXQuVU5TSUdORURfU0hPUlQsVU5TSUdORURfSU5UOnF0LlVOU0lHTkVEX0lOVH07dG8uZ2V0U2l6ZUluQnl0ZXM9ZnVuY3Rpb24odCl7c3dpdGNoKHQpe2Nhc2UgdG8uVU5TSUdORURfQllURTpyZXR1cm4gVWludDhBcnJheS5CWVRFU19QRVJfRUxFTUVOVDtjYXNlIHRvLlVOU0lHTkVEX1NIT1JUOnJldHVybiBVaW50MTZBcnJheS5CWVRFU19QRVJfRUxFTUVOVDtjYXNlIHRvLlVOU0lHTkVEX0lOVDpyZXR1cm4gVWludDMyQXJyYXkuQllURVNfUEVSX0VMRU1FTlR9dGhyb3cgbmV3IEIoImluZGV4RGF0YXR5cGUgaXMgcmVxdWlyZWQgYW5kIG11c3QgYmUgYSB2YWxpZCBJbmRleERhdGF0eXBlIGNvbnN0YW50LiIpfTt0by5mcm9tU2l6ZUluQnl0ZXM9ZnVuY3Rpb24odCl7c3dpdGNoKHQpe2Nhc2UgMjpyZXR1cm4gdG8uVU5TSUdORURfU0hPUlQ7Y2FzZSA0OnJldHVybiB0by5VTlNJR05FRF9JTlQ7Y2FzZSAxOnJldHVybiB0by5VTlNJR05FRF9CWVRFO2RlZmF1bHQ6dGhyb3cgbmV3IEIoIlNpemUgaW4gYnl0ZXMgY2Fubm90IGJlIG1hcHBlZCB0byBhbiBJbmRleERhdGF0eXBlIil9fTt0by52YWxpZGF0ZT1mdW5jdGlvbih0KXtyZXR1cm4gaCh0KSYmKHQ9PT10by5VTlNJR05FRF9CWVRFfHx0PT09dG8uVU5TSUdORURfU0hPUlR8fHQ9PT10by5VTlNJR05FRF9JTlQpfTt0by5jcmVhdGVUeXBlZEFycmF5PWZ1bmN0aW9uKHQsZSl7aWYoIWgodCkpdGhyb3cgbmV3IEIoIm51bWJlck9mVmVydGljZXMgaXMgcmVxdWlyZWQuIik7cmV0dXJuIHQ+PU0uU0lYVFlfRk9VUl9LSUxPQllURVM/bmV3IFVpbnQzMkFycmF5KGUpOm5ldyBVaW50MTZBcnJheShlKX07dG8uY3JlYXRlVHlwZWRBcnJheUZyb21BcnJheUJ1ZmZlcj1mdW5jdGlvbih0LGUsbixvKXtpZighaCh0KSl0aHJvdyBuZXcgQigibnVtYmVyT2ZWZXJ0aWNlcyBpcyByZXF1aXJlZC4iKTtpZighaChlKSl0aHJvdyBuZXcgQigic291cmNlQXJyYXkgaXMgcmVxdWlyZWQuIik7aWYoIWgobikpdGhyb3cgbmV3IEIoImJ5dGVPZmZzZXQgaXMgcmVxdWlyZWQuIik7cmV0dXJuIHQ+PU0uU0lYVFlfRk9VUl9LSUxPQllURVM/bmV3IFVpbnQzMkFycmF5KGUsbixvKTpuZXcgVWludDE2QXJyYXkoZSxuLG8pfTt0by5mcm9tVHlwZWRBcnJheT1mdW5jdGlvbih0KXtpZih0IGluc3RhbmNlb2YgVWludDhBcnJheSlyZXR1cm4gdG8uVU5TSUdORURfQllURTtpZih0IGluc3RhbmNlb2YgVWludDE2QXJyYXkpcmV0dXJuIHRvLlVOU0lHTkVEX1NIT1JUO2lmKHQgaW5zdGFuY2VvZiBVaW50MzJBcnJheSlyZXR1cm4gdG8uVU5TSUdORURfSU5UO3Rocm93IG5ldyBCKCJhcnJheSBtdXN0IGJlIGEgVWludDhBcnJheSwgVWludDE2QXJyYXksIG9yIFVpbnQzMkFycmF5LiIpfTtEdD1PYmplY3QuZnJlZXplKHRvKX0pO2Z1bmN0aW9uIEViKHQsZSxuKXtsZXQgbz10K2U7cmV0dXJuIE0uc2lnbih0KSE9PU0uc2lnbihlKSYmTWF0aC5hYnMoby9NYXRoLm1heChNYXRoLmFicyh0KSxNYXRoLmFicyhlKSkpPG4/MDpvfXZhciBVaCxncixGcD1aKCgpPT57SHQoKTtXdCgpO1VoPXt9O1VoLmNvbXB1dGVEaXNjcmltaW5hbnQ9ZnVuY3Rpb24odCxlLG4pe2lmKHR5cGVvZiB0IT0ibnVtYmVyIil0aHJvdyBuZXcgQigiYSBpcyBhIHJlcXVpcmVkIG51bWJlci4iKTtpZih0eXBlb2YgZSE9Im51bWJlciIpdGhyb3cgbmV3IEIoImIgaXMgYSByZXF1aXJlZCBudW1iZXIuIik7aWYodHlwZW9mIG4hPSJudW1iZXIiKXRocm93IG5ldyBCKCJjIGlzIGEgcmVxdWlyZWQgbnVtYmVyLiIpO3JldHVybiBlKmUtNCp0Km59O1VoLmNvbXB1dGVSZWFsUm9vdHM9ZnVuY3Rpb24odCxlLG4pe2lmKHR5cGVvZiB0IT0ibnVtYmVyIil0aHJvdyBuZXcgQigiYSBpcyBhIHJlcXVpcmVkIG51bWJlci4iKTtpZih0eXBlb2YgZSE9Im51bWJlciIpdGhyb3cgbmV3IEIoImIgaXMgYSByZXF1aXJlZCBudW1iZXIuIik7aWYodHlwZW9mIG4hPSJudW1iZXIiKXRocm93IG5ldyBCKCJjIGlzIGEgcmVxdWlyZWQgbnVtYmVyLiIpO2xldCBvO2lmKHQ9PT0wKXJldHVybiBlPT09MD9bXTpbLW4vZV07aWYoZT09PTApe2lmKG49PT0wKXJldHVyblswLDBdO2xldCB1PU1hdGguYWJzKG4pLGM9TWF0aC5hYnModCk7aWYodTxjJiZ1L2M8TS5FUFNJTE9OMTQpcmV0dXJuWzAsMF07aWYodT5jJiZjL3U8TS5FUFNJTE9OMTQpcmV0dXJuW107aWYobz0tbi90LG88MClyZXR1cm5bXTtsZXQgbD1NYXRoLnNxcnQobyk7cmV0dXJuWy1sLGxdfWVsc2UgaWYobj09PTApcmV0dXJuIG89LWUvdCxvPDA/W28sMF06WzAsb107bGV0IHI9ZSplLGk9NCp0Km4scz1FYihyLC1pLE0uRVBTSUxPTjE0KTtpZihzPDApcmV0dXJuW107bGV0IGY9LS41KkViKGUsTS5zaWduKGUpKk1hdGguc3FydChzKSxNLkVQU0lMT04xNCk7cmV0dXJuIGU+MD9bZi90LG4vZl06W24vZixmL3RdfTtncj1VaH0pO2Z1bmN0aW9uIFZoKHQsZSxuLG8pe2xldCByPXQsaT1lLzMscz1uLzMsZj1vLHU9cipzLGM9aSpmLGw9aSppLHA9cypzLGQ9cipzLWwsbT1yKmYtaSpzLF89aSpmLXAsZz00KmQqXy1tKm0sYixUO2lmKGc8MCl7bGV0IFIsb3QsYXQ7bCpjPj11KnA/KFI9cixvdD1kLGF0PS0yKmkqZCtyKm0pOihSPWYsb3Q9XyxhdD0tZiptKzIqcypfKTtsZXQgeXQ9LShhdDwwPy0xOjEpKk1hdGguYWJzKFIpKk1hdGguc3FydCgtZyk7VD0tYXQreXQ7bGV0IHJ0PVQvMixQdD1ydDwwPy1NYXRoLnBvdygtcnQsMS8zKTpNYXRoLnBvdyhydCwxLzMpLGd0PVQ9PT15dD8tUHQ6LW90L1B0O3JldHVybiBiPW90PD0wP1B0K2d0Oi1hdC8oUHQqUHQrZ3QqZ3Qrb3QpLGwqYz49dSpwP1soYi1pKS9yXTpbLWYvKGIrcyldfWxldCBPPWQsRT0tMippKmQrciptLHc9XyxDPS1mKm0rMipzKl8sTj1NYXRoLnNxcnQoZyksST1NYXRoLnNxcnQoMykvMixEPU1hdGguYWJzKE1hdGguYXRhbjIocipOLC1FKS8zKTtiPTIqTWF0aC5zcXJ0KC1PKTtsZXQgdj1NYXRoLmNvcyhEKTtUPWIqdjtsZXQgTD1iKigtdi8yLUkqTWF0aC5zaW4oRCkpLFU9VCtMPjIqaT9ULWk6TC1pLEE9cixTPVUvQTtEPU1hdGguYWJzKE1hdGguYXRhbjIoZipOLC1DKS8zKSxiPTIqTWF0aC5zcXJ0KC13KSx2PU1hdGguY29zKEQpLFQ9Yip2LEw9YiooLXYvMi1JKk1hdGguc2luKEQpKTtsZXQgUD0tZixGPVQrTDwyKnM/VCtzOkwrcyxqPVAvRixIPUEqRixrPS1VKkYtQSpQLEs9VSpQLFg9KHMqay1pKkspLygtaSprK3MqSCk7cmV0dXJuIFM8PVg/Uzw9aj9YPD1qP1tTLFgsal06W1MsaixYXTpbaixTLFhdOlM8PWo/W1gsUyxqXTpYPD1qP1tYLGosU106W2osWCxTXX12YXIga2gsQnAsUmI9WigoKT0+e0h0KCk7RnAoKTtraD17fTtraC5jb21wdXRlRGlzY3JpbWluYW50PWZ1bmN0aW9uKHQsZSxuLG8pe2lmKHR5cGVvZiB0IT0ibnVtYmVyIil0aHJvdyBuZXcgQigiYSBpcyBhIHJlcXVpcmVkIG51bWJlci4iKTtpZih0eXBlb2YgZSE9Im51bWJlciIpdGhyb3cgbmV3IEIoImIgaXMgYSByZXF1aXJlZCBudW1iZXIuIik7aWYodHlwZW9mIG4hPSJudW1iZXIiKXRocm93IG5ldyBCKCJjIGlzIGEgcmVxdWlyZWQgbnVtYmVyLiIpO2lmKHR5cGVvZiBvIT0ibnVtYmVyIil0aHJvdyBuZXcgQigiZCBpcyBhIHJlcXVpcmVkIG51bWJlci4iKTtsZXQgcj10KnQsaT1lKmUscz1uKm4sZj1vKm87cmV0dXJuIDE4KnQqZSpuKm8raSpzLTI3KnIqZi00Kih0KnMqbitpKmUqbyl9O2toLmNvbXB1dGVSZWFsUm9vdHM9ZnVuY3Rpb24odCxlLG4sbyl7aWYodHlwZW9mIHQhPSJudW1iZXIiKXRocm93IG5ldyBCKCJhIGlzIGEgcmVxdWlyZWQgbnVtYmVyLiIpO2lmKHR5cGVvZiBlIT0ibnVtYmVyIil0aHJvdyBuZXcgQigiYiBpcyBhIHJlcXVpcmVkIG51bWJlci4iKTtpZih0eXBlb2YgbiE9Im51bWJlciIpdGhyb3cgbmV3IEIoImMgaXMgYSByZXF1aXJlZCBudW1iZXIuIik7aWYodHlwZW9mIG8hPSJudW1iZXIiKXRocm93IG5ldyBCKCJkIGlzIGEgcmVxdWlyZWQgbnVtYmVyLiIpO2xldCByLGk7aWYodD09PTApcmV0dXJuIGdyLmNvbXB1dGVSZWFsUm9vdHMoZSxuLG8pO2lmKGU9PT0wKXtpZihuPT09MCl7aWYobz09PTApcmV0dXJuWzAsMCwwXTtpPS1vL3Q7bGV0IHM9aTwwPy1NYXRoLnBvdygtaSwxLzMpOk1hdGgucG93KGksMS8zKTtyZXR1cm5bcyxzLHNdfWVsc2UgaWYobz09PTApcmV0dXJuIHI9Z3IuY29tcHV0ZVJlYWxSb290cyh0LDAsbiksci5MZW5ndGg9PT0wP1swXTpbclswXSwwLHJbMV1dO3JldHVybiBWaCh0LDAsbixvKX1lbHNle2lmKG49PT0wKXJldHVybiBvPT09MD8oaT0tZS90LGk8MD9baSwwLDBdOlswLDAsaV0pOlZoKHQsZSwwLG8pO2lmKG89PT0wKXJldHVybiByPWdyLmNvbXB1dGVSZWFsUm9vdHModCxlLG4pLHIubGVuZ3RoPT09MD9bMF06clsxXTw9MD9bclswXSxyWzFdLDBdOnJbMF0+PTA/WzAsclswXSxyWzFdXTpbclswXSwwLHJbMV1dfXJldHVybiBWaCh0LGUsbixvKX07QnA9a2h9KTtmdW5jdGlvbiBCcih0LGUsbixvKXtsZXQgcj10KnQsaT1lLTMqci84LHM9bi1lKnQvMityKnQvOCxmPW8tbip0LzQrZSpyLzE2LTMqcipyLzI1Nix1PUJwLmNvbXB1dGVSZWFsUm9vdHMoMSwyKmksaSppLTQqZiwtcypzKTtpZih1Lmxlbmd0aD4wKXtsZXQgYz0tdC80LGw9dVt1Lmxlbmd0aC0xXTtpZihNYXRoLmFicyhsKTxNLkVQU0lMT04xNCl7bGV0IHA9Z3IuY29tcHV0ZVJlYWxSb290cygxLGksZik7aWYocC5sZW5ndGg9PT0yKXtsZXQgZD1wWzBdLG09cFsxXSxfO2lmKGQ+PTAmJm0+PTApe2xldCBnPU1hdGguc3FydChkKSxiPU1hdGguc3FydChtKTtyZXR1cm5bYy1iLGMtZyxjK2csYytiXX1lbHNle2lmKGQ+PTAmJm08MClyZXR1cm4gXz1NYXRoLnNxcnQoZCksW2MtXyxjK19dO2lmKGQ8MCYmbT49MClyZXR1cm4gXz1NYXRoLnNxcnQobSksW2MtXyxjK19dfX1yZXR1cm5bXX1lbHNlIGlmKGw+MCl7bGV0IHA9TWF0aC5zcXJ0KGwpLGQ9KGkrbC1zL3ApLzIsbT0oaStsK3MvcCkvMixfPWdyLmNvbXB1dGVSZWFsUm9vdHMoMSxwLGQpLGc9Z3IuY29tcHV0ZVJlYWxSb290cygxLC1wLG0pO3JldHVybiBfLmxlbmd0aCE9PTA/KF9bMF0rPWMsX1sxXSs9YyxnLmxlbmd0aCE9PTA/KGdbMF0rPWMsZ1sxXSs9YyxfWzFdPD1nWzBdP1tfWzBdLF9bMV0sZ1swXSxnWzFdXTpnWzFdPD1fWzBdP1tnWzBdLGdbMV0sX1swXSxfWzFdXTpfWzBdPj1nWzBdJiZfWzFdPD1nWzFdP1tnWzBdLF9bMF0sX1sxXSxnWzFdXTpnWzBdPj1fWzBdJiZnWzFdPD1fWzFdP1tfWzBdLGdbMF0sZ1sxXSxfWzFdXTpfWzBdPmdbMF0mJl9bMF08Z1sxXT9bZ1swXSxfWzBdLGdbMV0sX1sxXV06W19bMF0sZ1swXSxfWzFdLGdbMV1dKTpfKTpnLmxlbmd0aCE9PTA/KGdbMF0rPWMsZ1sxXSs9YyxnKTpbXX19cmV0dXJuW119ZnVuY3Rpb24gVGYodCxlLG4sbyl7bGV0IHI9bipuLGk9ZSplLHM9dCp0LGY9LTIqZSx1PW4qdCtpLTQqbyxjPXMqby1uKmUqdCtyLGw9QnAuY29tcHV0ZVJlYWxSb290cygxLGYsdSxjKTtpZihsLmxlbmd0aD4wKXtsZXQgcD1sWzBdLGQ9ZS1wLG09ZCpkLF89dC8yLGc9ZC8yLGI9bS00Km8sVD1tKzQqTWF0aC5hYnMobyksTz1zLTQqcCxFPXMrNCpNYXRoLmFicyhwKSx3LEM7aWYocDwwfHxiKkU8TypUKXtsZXQgQT1NYXRoLnNxcnQoTyk7dz1BLzIsQz1BPT09MD8wOih0KmctbikvQX1lbHNle2xldCBBPU1hdGguc3FydChiKTt3PUE9PT0wPzA6KHQqZy1uKS9BLEM9QS8yfWxldCBOLEk7Xz09PTAmJnc9PT0wPyhOPTAsST0wKTpNLnNpZ24oXyk9PT1NLnNpZ24odyk/KE49Xyt3LEk9cC9OKTooST1fLXcsTj1wL0kpO2xldCBELHY7Zz09PTAmJkM9PT0wPyhEPTAsdj0wKTpNLnNpZ24oZyk9PT1NLnNpZ24oQyk/KEQ9ZytDLHY9by9EKToodj1nLUMsRD1vL3YpO2xldCBMPWdyLmNvbXB1dGVSZWFsUm9vdHMoMSxOLEQpLFU9Z3IuY29tcHV0ZVJlYWxSb290cygxLEksdik7aWYoTC5sZW5ndGghPT0wKXJldHVybiBVLmxlbmd0aCE9PTA/TFsxXTw9VVswXT9bTFswXSxMWzFdLFVbMF0sVVsxXV06VVsxXTw9TFswXT9bVVswXSxVWzFdLExbMF0sTFsxXV06TFswXT49VVswXSYmTFsxXTw9VVsxXT9bVVswXSxMWzBdLExbMV0sVVsxXV06VVswXT49TFswXSYmVVsxXTw9TFsxXT9bTFswXSxVWzBdLFVbMV0sTFsxXV06TFswXT5VWzBdJiZMWzBdPFVbMV0/W1VbMF0sTFswXSxVWzFdLExbMV1dOltMWzBdLFVbMF0sTFsxXSxVWzFdXTpMO2lmKFUubGVuZ3RoIT09MClyZXR1cm4gVX1yZXR1cm5bXX12YXIgR2gsU2IsQ2I9WigoKT0+e1JiKCk7SHQoKTtXdCgpO0ZwKCk7R2g9e307R2guY29tcHV0ZURpc2NyaW1pbmFudD1mdW5jdGlvbih0LGUsbixvLHIpe2lmKHR5cGVvZiB0IT0ibnVtYmVyIil0aHJvdyBuZXcgQigiYSBpcyBhIHJlcXVpcmVkIG51bWJlci4iKTtpZih0eXBlb2YgZSE9Im51bWJlciIpdGhyb3cgbmV3IEIoImIgaXMgYSByZXF1aXJlZCBudW1iZXIuIik7aWYodHlwZW9mIG4hPSJudW1iZXIiKXRocm93IG5ldyBCKCJjIGlzIGEgcmVxdWlyZWQgbnVtYmVyLiIpO2lmKHR5cGVvZiBvIT0ibnVtYmVyIil0aHJvdyBuZXcgQigiZCBpcyBhIHJlcXVpcmVkIG51bWJlci4iKTtpZih0eXBlb2YgciE9Im51bWJlciIpdGhyb3cgbmV3IEIoImUgaXMgYSByZXF1aXJlZCBudW1iZXIuIik7bGV0IGk9dCp0LHM9aSp0LGY9ZSplLHU9ZiplLGM9bipuLGw9YypuLHA9bypvLGQ9cCpvLG09cipyLF89bSpyO3JldHVybiBmKmMqcC00KnUqZC00KnQqbCpwKzE4KnQqZSpuKmQtMjcqaSpwKnArMjU2KnMqXytyKigxOCp1Km4qby00KmYqbCsxNip0KmMqYy04MCp0KmUqYypvLTYqdCpmKnArMTQ0KmkqbipwKSttKigxNDQqdCpmKm4tMjcqZipmLTEyOCppKmMtMTkyKmkqZSpvKX07R2guY29tcHV0ZVJlYWxSb290cz1mdW5jdGlvbih0LGUsbixvLHIpe2lmKHR5cGVvZiB0IT0ibnVtYmVyIil0aHJvdyBuZXcgQigiYSBpcyBhIHJlcXVpcmVkIG51bWJlci4iKTtpZih0eXBlb2YgZSE9Im51bWJlciIpdGhyb3cgbmV3IEIoImIgaXMgYSByZXF1aXJlZCBudW1iZXIuIik7aWYodHlwZW9mIG4hPSJudW1iZXIiKXRocm93IG5ldyBCKCJjIGlzIGEgcmVxdWlyZWQgbnVtYmVyLiIpO2lmKHR5cGVvZiBvIT0ibnVtYmVyIil0aHJvdyBuZXcgQigiZCBpcyBhIHJlcXVpcmVkIG51bWJlci4iKTtpZih0eXBlb2YgciE9Im51bWJlciIpdGhyb3cgbmV3IEIoImUgaXMgYSByZXF1aXJlZCBudW1iZXIuIik7aWYoTWF0aC5hYnModCk8TS5FUFNJTE9OMTUpcmV0dXJuIEJwLmNvbXB1dGVSZWFsUm9vdHMoZSxuLG8scik7bGV0IGk9ZS90LHM9bi90LGY9by90LHU9ci90LGM9aTwwPzE6MDtzd2l0Y2goYys9czwwP2MrMTpjLGMrPWY8MD9jKzE6YyxjKz11PDA/YysxOmMsYyl7Y2FzZSAwOnJldHVybiBCcihpLHMsZix1KTtjYXNlIDE6cmV0dXJuIFRmKGkscyxmLHUpO2Nhc2UgMjpyZXR1cm4gVGYoaSxzLGYsdSk7Y2FzZSAzOnJldHVybiBCcihpLHMsZix1KTtjYXNlIDQ6cmV0dXJuIEJyKGkscyxmLHUpO2Nhc2UgNTpyZXR1cm4gVGYoaSxzLGYsdSk7Y2FzZSA2OnJldHVybiBCcihpLHMsZix1KTtjYXNlIDc6cmV0dXJuIEJyKGkscyxmLHUpO2Nhc2UgODpyZXR1cm4gVGYoaSxzLGYsdSk7Y2FzZSA5OnJldHVybiBCcihpLHMsZix1KTtjYXNlIDEwOnJldHVybiBCcihpLHMsZix1KTtjYXNlIDExOnJldHVybiBUZihpLHMsZix1KTtjYXNlIDEyOnJldHVybiBCcihpLHMsZix1KTtjYXNlIDEzOnJldHVybiBCcihpLHMsZix1KTtjYXNlIDE0OnJldHVybiBCcihpLHMsZix1KTtjYXNlIDE1OnJldHVybiBCcihpLHMsZix1KTtkZWZhdWx0OnJldHVybn19O1NiPUdofSk7ZnVuY3Rpb24gVXAodCxlKXtlPWEuY2xvbmUoeChlLGEuWkVSTykpLGEuZXF1YWxzKGUsYS5aRVJPKXx8YS5ub3JtYWxpemUoZSxlKSx0aGlzLm9yaWdpbj1hLmNsb25lKHgodCxhLlpFUk8pKSx0aGlzLmRpcmVjdGlvbj1lfXZhciBRcyxWcD1aKCgpPT57RnQoKTtYdCgpO0l0KCk7ZnQoKTtVcC5jbG9uZT1mdW5jdGlvbih0LGUpe2lmKGgodCkpcmV0dXJuIGgoZSk/KGUub3JpZ2luPWEuY2xvbmUodC5vcmlnaW4pLGUuZGlyZWN0aW9uPWEuY2xvbmUodC5kaXJlY3Rpb24pLGUpOm5ldyBVcCh0Lm9yaWdpbix0LmRpcmVjdGlvbil9O1VwLmdldFBvaW50PWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4geS50eXBlT2Yub2JqZWN0KCJyYXkiLHQpLHkudHlwZU9mLm51bWJlcigidCIsZSksaChuKXx8KG49bmV3IGEpLG49YS5tdWx0aXBseUJ5U2NhbGFyKHQuZGlyZWN0aW9uLGUsbiksYS5hZGQodC5vcmlnaW4sbixuKX07UXM9VXB9KTtmdW5jdGlvbiBBUCh0LGUsbixvKXtsZXQgcj1lKmUtNCp0Km47aWYocjwwKXJldHVybjtpZihyPjApe2xldCBzPTEvKDIqdCksZj1NYXRoLnNxcnQociksdT0oLWUrZikqcyxjPSgtZS1mKSpzO3JldHVybiB1PGM/KG8ucm9vdDA9dSxvLnJvb3QxPWMpOihvLnJvb3QwPWMsby5yb290MT11KSxvfWxldCBpPS1lLygyKnQpO2lmKGkhPT0wKXJldHVybiBvLnJvb3QwPW8ucm9vdDE9aSxvfWZ1bmN0aW9uIEZiKHQsZSxuKXtoKG4pfHwobj1uZXcgUXIpO2xldCBvPXQub3JpZ2luLHI9dC5kaXJlY3Rpb24saT1lLmNlbnRlcixzPWUucmFkaXVzKmUucmFkaXVzLGY9YS5zdWJ0cmFjdChvLGksRGIpLHU9YS5kb3QocixyKSxjPTIqYS5kb3QocixmKSxsPWEubWFnbml0dWRlU3F1YXJlZChmKS1zLHA9QVAodSxjLGwsYlApO2lmKGgocCkpcmV0dXJuIG4uc3RhcnQ9cC5yb290MCxuLnN0b3A9cC5yb290MSxufWZ1bmN0aW9uIEpzKHQsZSxuKXtsZXQgbz10K2U7cmV0dXJuIE0uc2lnbih0KSE9PU0uc2lnbihlKSYmTWF0aC5hYnMoby9NYXRoLm1heChNYXRoLmFicyh0KSxNYXRoLmFicyhlKSkpPG4/MDpvfXZhciBnbixfUCx5UCxEYix4YixQYixnUCxiUCxUUCx3UCxPUCx6aCxNYixOYixrcCxFUCxSUCxTUCxDUCx4UCxQUCxJYix2YixMYixNUCxOUCxJUCxobyx0Yz1aKCgpPT57RnQoKTtJZSgpO0l0KCk7ZnQoKTtIdCgpO0hsKCk7V3QoKTtCbigpO0ZwKCk7Q2IoKTtWcCgpO2duPXt9O2duLnJheVBsYW5lPWZ1bmN0aW9uKHQsZSxuKXtpZighaCh0KSl0aHJvdyBuZXcgQigicmF5IGlzIHJlcXVpcmVkLiIpO2lmKCFoKGUpKXRocm93IG5ldyBCKCJwbGFuZSBpcyByZXF1aXJlZC4iKTtoKG4pfHwobj1uZXcgYSk7bGV0IG89dC5vcmlnaW4scj10LmRpcmVjdGlvbixpPWUubm9ybWFsLHM9YS5kb3QoaSxyKTtpZihNYXRoLmFicyhzKTxNLkVQU0lMT04xNSlyZXR1cm47bGV0IGY9KC1lLmRpc3RhbmNlLWEuZG90KGksbykpL3M7aWYoIShmPDApKXJldHVybiBuPWEubXVsdGlwbHlCeVNjYWxhcihyLGYsbiksYS5hZGQobyxuLG4pfTtfUD1uZXcgYSx5UD1uZXcgYSxEYj1uZXcgYSx4Yj1uZXcgYSxQYj1uZXcgYTtnbi5yYXlUcmlhbmdsZVBhcmFtZXRyaWM9ZnVuY3Rpb24odCxlLG4sbyxyKXtpZighaCh0KSl0aHJvdyBuZXcgQigicmF5IGlzIHJlcXVpcmVkLiIpO2lmKCFoKGUpKXRocm93IG5ldyBCKCJwMCBpcyByZXF1aXJlZC4iKTtpZighaChuKSl0aHJvdyBuZXcgQigicDEgaXMgcmVxdWlyZWQuIik7aWYoIWgobykpdGhyb3cgbmV3IEIoInAyIGlzIHJlcXVpcmVkLiIpO3I9eChyLCExKTtsZXQgaT10Lm9yaWdpbixzPXQuZGlyZWN0aW9uLGY9YS5zdWJ0cmFjdChuLGUsX1ApLHU9YS5zdWJ0cmFjdChvLGUseVApLGM9YS5jcm9zcyhzLHUsRGIpLGw9YS5kb3QoZixjKSxwLGQsbSxfLGc7aWYocil7aWYobDxNLkVQU0lMT042fHwocD1hLnN1YnRyYWN0KGksZSx4YiksbT1hLmRvdChwLGMpLG08MHx8bT5sKXx8KGQ9YS5jcm9zcyhwLGYsUGIpLF89YS5kb3QocyxkKSxfPDB8fG0rXz5sKSlyZXR1cm47Zz1hLmRvdCh1LGQpL2x9ZWxzZXtpZihNYXRoLmFicyhsKTxNLkVQU0lMT042KXJldHVybjtsZXQgYj0xL2w7aWYocD1hLnN1YnRyYWN0KGksZSx4YiksbT1hLmRvdChwLGMpKmIsbTwwfHxtPjF8fChkPWEuY3Jvc3MocCxmLFBiKSxfPWEuZG90KHMsZCkqYixfPDB8fG0rXz4xKSlyZXR1cm47Zz1hLmRvdCh1LGQpKmJ9cmV0dXJuIGd9O2duLnJheVRyaWFuZ2xlPWZ1bmN0aW9uKHQsZSxuLG8scixpKXtsZXQgcz1nbi5yYXlUcmlhbmdsZVBhcmFtZXRyaWModCxlLG4sbyxyKTtpZighKCFoKHMpfHxzPDApKXJldHVybiBoKGkpfHwoaT1uZXcgYSksYS5tdWx0aXBseUJ5U2NhbGFyKHQuZGlyZWN0aW9uLHMsaSksYS5hZGQodC5vcmlnaW4saSxpKX07Z1A9bmV3IFFzO2duLmxpbmVTZWdtZW50VHJpYW5nbGU9ZnVuY3Rpb24odCxlLG4sbyxyLGkscyl7aWYoIWgodCkpdGhyb3cgbmV3IEIoInYwIGlzIHJlcXVpcmVkLiIpO2lmKCFoKGUpKXRocm93IG5ldyBCKCJ2MSBpcyByZXF1aXJlZC4iKTtpZighaChuKSl0aHJvdyBuZXcgQigicDAgaXMgcmVxdWlyZWQuIik7aWYoIWgobykpdGhyb3cgbmV3IEIoInAxIGlzIHJlcXVpcmVkLiIpO2lmKCFoKHIpKXRocm93IG5ldyBCKCJwMiBpcyByZXF1aXJlZC4iKTtsZXQgZj1nUDthLmNsb25lKHQsZi5vcmlnaW4pLGEuc3VidHJhY3QoZSx0LGYuZGlyZWN0aW9uKSxhLm5vcm1hbGl6ZShmLmRpcmVjdGlvbixmLmRpcmVjdGlvbik7bGV0IHU9Z24ucmF5VHJpYW5nbGVQYXJhbWV0cmljKGYsbixvLHIsaSk7aWYoISghaCh1KXx8dTwwfHx1PmEuZGlzdGFuY2UodCxlKSkpcmV0dXJuIGgocyl8fChzPW5ldyBhKSxhLm11bHRpcGx5QnlTY2FsYXIoZi5kaXJlY3Rpb24sdSxzKSxhLmFkZChmLm9yaWdpbixzLHMpfTtiUD17cm9vdDA6MCxyb290MTowfTtnbi5yYXlTcGhlcmU9ZnVuY3Rpb24odCxlLG4pe2lmKCFoKHQpKXRocm93IG5ldyBCKCJyYXkgaXMgcmVxdWlyZWQuIik7aWYoIWgoZSkpdGhyb3cgbmV3IEIoInNwaGVyZSBpcyByZXF1aXJlZC4iKTtpZihuPUZiKHQsZSxuKSwhKCFoKG4pfHxuLnN0b3A8MCkpcmV0dXJuIG4uc3RhcnQ9TWF0aC5tYXgobi5zdGFydCwwKSxufTtUUD1uZXcgUXM7Z24ubGluZVNlZ21lbnRTcGhlcmU9ZnVuY3Rpb24odCxlLG4sbyl7aWYoIWgodCkpdGhyb3cgbmV3IEIoInAwIGlzIHJlcXVpcmVkLiIpO2lmKCFoKGUpKXRocm93IG5ldyBCKCJwMSBpcyByZXF1aXJlZC4iKTtpZighaChuKSl0aHJvdyBuZXcgQigic3BoZXJlIGlzIHJlcXVpcmVkLiIpO2xldCByPVRQO2EuY2xvbmUodCxyLm9yaWdpbik7bGV0IGk9YS5zdWJ0cmFjdChlLHQsci5kaXJlY3Rpb24pLHM9YS5tYWduaXR1ZGUoaSk7aWYoYS5ub3JtYWxpemUoaSxpKSxvPUZiKHIsbixvKSwhKCFoKG8pfHxvLnN0b3A8MHx8by5zdGFydD5zKSlyZXR1cm4gby5zdGFydD1NYXRoLm1heChvLnN0YXJ0LDApLG8uc3RvcD1NYXRoLm1pbihvLnN0b3Ascyksb307d1A9bmV3IGEsT1A9bmV3IGE7Z24ucmF5RWxsaXBzb2lkPWZ1bmN0aW9uKHQsZSl7aWYoIWgodCkpdGhyb3cgbmV3IEIoInJheSBpcyByZXF1aXJlZC4iKTtpZighaChlKSl0aHJvdyBuZXcgQigiZWxsaXBzb2lkIGlzIHJlcXVpcmVkLiIpO2xldCBuPWUub25lT3ZlclJhZGlpLG89YS5tdWx0aXBseUNvbXBvbmVudHMobix0Lm9yaWdpbix3UCkscj1hLm11bHRpcGx5Q29tcG9uZW50cyhuLHQuZGlyZWN0aW9uLE9QKSxpPWEubWFnbml0dWRlU3F1YXJlZChvKSxzPWEuZG90KG8sciksZix1LGMsbCxwO2lmKGk+MSl7aWYocz49MClyZXR1cm47bGV0IGQ9cypzO2lmKGY9aS0xLHU9YS5tYWduaXR1ZGVTcXVhcmVkKHIpLGM9dSpmLGQ8YylyZXR1cm47aWYoZD5jKXtsPXMqcy1jLHA9LXMrTWF0aC5zcXJ0KGwpO2xldCBfPXAvdSxnPWYvcDtyZXR1cm4gXzxnP25ldyBRcihfLGcpOntzdGFydDpnLHN0b3A6X319bGV0IG09TWF0aC5zcXJ0KGYvdSk7cmV0dXJuIG5ldyBRcihtLG0pfWVsc2UgaWYoaTwxKXJldHVybiBmPWktMSx1PWEubWFnbml0dWRlU3F1YXJlZChyKSxjPXUqZixsPXMqcy1jLHA9LXMrTWF0aC5zcXJ0KGwpLG5ldyBRcigwLHAvdSk7aWYoczwwKXJldHVybiB1PWEubWFnbml0dWRlU3F1YXJlZChyKSxuZXcgUXIoMCwtcy91KX07Z24ucXVhZHJhdGljVmVjdG9yRXhwcmVzc2lvbj1mdW5jdGlvbih0LGUsbixvLHIpe2xldCBpPW8qbyxzPXIqcixmPSh0W1EuQ09MVU1OMVJPVzFdLXRbUS5DT0xVTU4yUk9XMl0pKnMsdT1yKihvKkpzKHRbUS5DT0xVTU4xUk9XMF0sdFtRLkNPTFVNTjBST1cxXSxNLkVQU0lMT04xNSkrZS55KSxjPXRbUS5DT0xVTU4wUk9XMF0qaSt0W1EuQ09MVU1OMlJPVzJdKnMrbyplLngrbixsPXMqSnModFtRLkNPTFVNTjJST1cxXSx0W1EuQ09MVU1OMVJPVzJdLE0uRVBTSUxPTjE1KSxwPXIqKG8qSnModFtRLkNPTFVNTjJST1cwXSx0W1EuQ09MVU1OMFJPVzJdKStlLnopLGQsbT1bXTtpZihwPT09MCYmbD09PTApe2lmKGQ9Z3IuY29tcHV0ZVJlYWxSb290cyhmLHUsYyksZC5sZW5ndGg9PT0wKXJldHVybiBtO2xldCBEPWRbMF0sdj1NYXRoLnNxcnQoTWF0aC5tYXgoMS1EKkQsMCkpO2lmKG0ucHVzaChuZXcgYShvLHIqRCxyKi12KSksbS5wdXNoKG5ldyBhKG8scipELHIqdikpLGQubGVuZ3RoPT09Mil7bGV0IEw9ZFsxXSxVPU1hdGguc3FydChNYXRoLm1heCgxLUwqTCwwKSk7bS5wdXNoKG5ldyBhKG8scipMLHIqLVUpKSxtLnB1c2gobmV3IGEobyxyKkwscipVKSl9cmV0dXJuIG19bGV0IF89cCpwLGc9bCpsLGI9ZipmLFQ9cCpsLE89YitnLEU9MioodSpmK1QpLHc9MipjKmYrdSp1LWcrXyxDPTIqKGMqdS1UKSxOPWMqYy1fO2lmKE89PT0wJiZFPT09MCYmdz09PTAmJkM9PT0wKXJldHVybiBtO2Q9U2IuY29tcHV0ZVJlYWxSb290cyhPLEUsdyxDLE4pO2xldCBJPWQubGVuZ3RoO2lmKEk9PT0wKXJldHVybiBtO2ZvcihsZXQgRD0wO0Q8STsrK0Qpe2xldCB2PWRbRF0sTD12KnYsVT1NYXRoLm1heCgxLUwsMCksQT1NYXRoLnNxcnQoVSksUztNLnNpZ24oZik9PT1NLnNpZ24oYyk/Uz1KcyhmKkwrYyx1KnYsTS5FUFNJTE9OMTIpOk0uc2lnbihjKT09PU0uc2lnbih1KnYpP1M9SnMoZipMLHUqditjLE0uRVBTSUxPTjEyKTpTPUpzKGYqTCt1KnYsYyxNLkVQU0lMT04xMik7bGV0IFA9SnMobCp2LHAsTS5FUFNJTE9OMTUpLEY9UypQO0Y8MD9tLnB1c2gobmV3IGEobyxyKnYscipBKSk6Rj4wP20ucHVzaChuZXcgYShvLHIqdixyKi1BKSk6QSE9PTA/KG0ucHVzaChuZXcgYShvLHIqdixyKi1BKSksbS5wdXNoKG5ldyBhKG8scip2LHIqQSkpLCsrRCk6bS5wdXNoKG5ldyBhKG8scip2LHIqQSkpfXJldHVybiBtfTt6aD1uZXcgYSxNYj1uZXcgYSxOYj1uZXcgYSxrcD1uZXcgYSxFUD1uZXcgYSxSUD1uZXcgUSxTUD1uZXcgUSxDUD1uZXcgUSx4UD1uZXcgUSxQUD1uZXcgUSxJYj1uZXcgUSx2Yj1uZXcgUSxMYj1uZXcgYSxNUD1uZXcgYSxOUD1uZXcgY3Q7Z24uZ3JhemluZ0FsdGl0dWRlTG9jYXRpb249ZnVuY3Rpb24odCxlKXtpZighaCh0KSl0aHJvdyBuZXcgQigicmF5IGlzIHJlcXVpcmVkLiIpO2lmKCFoKGUpKXRocm93IG5ldyBCKCJlbGxpcHNvaWQgaXMgcmVxdWlyZWQuIik7bGV0IG49dC5vcmlnaW4sbz10LmRpcmVjdGlvbjtpZighYS5lcXVhbHMobixhLlpFUk8pKXtsZXQgTj1lLmdlb2RldGljU3VyZmFjZU5vcm1hbChuLHpoKTtpZihhLmRvdChvLE4pPj0wKXJldHVybiBufWxldCByPWgodGhpcy5yYXlFbGxpcHNvaWQodCxlKSksaT1lLnRyYW5zZm9ybVBvc2l0aW9uVG9TY2FsZWRTcGFjZShvLHpoKSxzPWEubm9ybWFsaXplKGksaSksZj1hLm1vc3RPcnRob2dvbmFsQXhpcyhpLGtwKSx1PWEubm9ybWFsaXplKGEuY3Jvc3MoZixzLE1iKSxNYiksYz1hLm5vcm1hbGl6ZShhLmNyb3NzKHMsdSxOYiksTmIpLGw9UlA7bFswXT1zLngsbFsxXT1zLnksbFsyXT1zLnosbFszXT11LngsbFs0XT11LnksbFs1XT11LnosbFs2XT1jLngsbFs3XT1jLnksbFs4XT1jLno7bGV0IHA9US50cmFuc3Bvc2UobCxTUCksZD1RLmZyb21TY2FsZShlLnJhZGlpLENQKSxtPVEuZnJvbVNjYWxlKGUub25lT3ZlclJhZGlpLHhQKSxfPVBQO19bMF09MCxfWzFdPS1vLnosX1syXT1vLnksX1szXT1vLnosX1s0XT0wLF9bNV09LW8ueCxfWzZdPS1vLnksX1s3XT1vLngsX1s4XT0wO2xldCBnPVEubXVsdGlwbHkoUS5tdWx0aXBseShwLG0sSWIpLF8sSWIpLGI9US5tdWx0aXBseShRLm11bHRpcGx5KGcsZCx2YiksbCx2YiksVD1RLm11bHRpcGx5QnlWZWN0b3IoZyxuLEVQKSxPPWduLnF1YWRyYXRpY1ZlY3RvckV4cHJlc3Npb24oYixhLm5lZ2F0ZShULHpoKSwwLDAsMSksRSx3LEM9Ty5sZW5ndGg7aWYoQz4wKXtsZXQgTj1hLmNsb25lKGEuWkVSTyxNUCksST1OdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFk7Zm9yKGxldCB2PTA7djxDOysrdil7RT1RLm11bHRpcGx5QnlWZWN0b3IoZCxRLm11bHRpcGx5QnlWZWN0b3IobCxPW3ZdLExiKSxMYik7bGV0IEw9YS5ub3JtYWxpemUoYS5zdWJ0cmFjdChFLG4sa3ApLGtwKSxVPWEuZG90KEwsbyk7VT5JJiYoST1VLE49YS5jbG9uZShFLE4pKX1sZXQgRD1lLmNhcnRlc2lhblRvQ2FydG9ncmFwaGljKE4sTlApO3JldHVybiBJPU0uY2xhbXAoSSwwLDEpLHc9YS5tYWduaXR1ZGUoYS5zdWJ0cmFjdChOLG4sa3ApKSpNYXRoLnNxcnQoMS1JKkkpLHc9cj8tdzp3LEQuaGVpZ2h0PXcsZS5jYXJ0b2dyYXBoaWNUb0NhcnRlc2lhbihELG5ldyBhKX19O0lQPW5ldyBhO2duLmxpbmVTZWdtZW50UGxhbmU9ZnVuY3Rpb24odCxlLG4sbyl7aWYoIWgodCkpdGhyb3cgbmV3IEIoImVuZFBvaW50MCBpcyByZXF1aXJlZC4iKTtpZighaChlKSl0aHJvdyBuZXcgQigiZW5kUG9pbnQxIGlzIHJlcXVpcmVkLiIpO2lmKCFoKG4pKXRocm93IG5ldyBCKCJwbGFuZSBpcyByZXF1aXJlZC4iKTtoKG8pfHwobz1uZXcgYSk7bGV0IHI9YS5zdWJ0cmFjdChlLHQsSVApLGk9bi5ub3JtYWwscz1hLmRvdChpLHIpO2lmKE1hdGguYWJzKHMpPE0uRVBTSUxPTjYpcmV0dXJuO2xldCBmPWEuZG90KGksdCksdT0tKG4uZGlzdGFuY2UrZikvcztpZighKHU8MHx8dT4xKSlyZXR1cm4gYS5tdWx0aXBseUJ5U2NhbGFyKHIsdSxvKSxhLmFkZCh0LG8sbyksb307Z24udHJpYW5nbGVQbGFuZUludGVyc2VjdGlvbj1mdW5jdGlvbih0LGUsbixvKXtpZighaCh0KXx8IWgoZSl8fCFoKG4pfHwhaChvKSl0aHJvdyBuZXcgQigicDAsIHAxLCBwMiwgYW5kIHBsYW5lIGFyZSByZXF1aXJlZC4iKTtsZXQgcj1vLm5vcm1hbCxpPW8uZGlzdGFuY2Uscz1hLmRvdChyLHQpK2k8MCxmPWEuZG90KHIsZSkraTwwLHU9YS5kb3QocixuKStpPDAsYz0wO2MrPXM/MTowLGMrPWY/MTowLGMrPXU/MTowO2xldCBsLHA7aWYoKGM9PT0xfHxjPT09MikmJihsPW5ldyBhLHA9bmV3IGEpLGM9PT0xKXtpZihzKXJldHVybiBnbi5saW5lU2VnbWVudFBsYW5lKHQsZSxvLGwpLGduLmxpbmVTZWdtZW50UGxhbmUodCxuLG8scCkse3Bvc2l0aW9uczpbdCxlLG4sbCxwXSxpbmRpY2VzOlswLDMsNCwxLDIsNCwxLDQsM119O2lmKGYpcmV0dXJuIGduLmxpbmVTZWdtZW50UGxhbmUoZSxuLG8sbCksZ24ubGluZVNlZ21lbnRQbGFuZShlLHQsbyxwKSx7cG9zaXRpb25zOlt0LGUsbixsLHBdLGluZGljZXM6WzEsMyw0LDIsMCw0LDIsNCwzXX07aWYodSlyZXR1cm4gZ24ubGluZVNlZ21lbnRQbGFuZShuLHQsbyxsKSxnbi5saW5lU2VnbWVudFBsYW5lKG4sZSxvLHApLHtwb3NpdGlvbnM6W3QsZSxuLGwscF0saW5kaWNlczpbMiwzLDQsMCwxLDQsMCw0LDNdfX1lbHNlIGlmKGM9PT0yKWlmKHMpaWYoZil7aWYoIXUpcmV0dXJuIGduLmxpbmVTZWdtZW50UGxhbmUodCxuLG8sbCksZ24ubGluZVNlZ21lbnRQbGFuZShlLG4sbyxwKSx7cG9zaXRpb25zOlt0LGUsbixsLHBdLGluZGljZXM6WzAsMSw0LDAsNCwzLDIsMyw0XX19ZWxzZSByZXR1cm4gZ24ubGluZVNlZ21lbnRQbGFuZShuLGUsbyxsKSxnbi5saW5lU2VnbWVudFBsYW5lKHQsZSxvLHApLHtwb3NpdGlvbnM6W3QsZSxuLGwscF0saW5kaWNlczpbMiwwLDQsMiw0LDMsMSwzLDRdfTtlbHNlIHJldHVybiBnbi5saW5lU2VnbWVudFBsYW5lKGUsdCxvLGwpLGduLmxpbmVTZWdtZW50UGxhbmUobix0LG8scCkse3Bvc2l0aW9uczpbdCxlLG4sbCxwXSxpbmRpY2VzOlsxLDIsNCwxLDQsMywwLDMsNF19fTtobz1nbn0pO2Z1bmN0aW9uIGVvKHQsZSl7aWYoeS50eXBlT2Yub2JqZWN0KCJub3JtYWwiLHQpLCFNLmVxdWFsc0Vwc2lsb24oYS5tYWduaXR1ZGUodCksMSxNLkVQU0lMT042KSl0aHJvdyBuZXcgQigibm9ybWFsIG11c3QgYmUgbm9ybWFsaXplZC4iKTt5LnR5cGVPZi5udW1iZXIoImRpc3RhbmNlIixlKSx0aGlzLm5vcm1hbD1hLmNsb25lKHQpLHRoaXMuZGlzdGFuY2U9ZX12YXIgdlAsTFAsRFAsRlAsQlAsb24sZnM9WigoKT0+e0Z0KCk7aHIoKTtYdCgpO2Z0KCk7SHQoKTtXdCgpO1VuKCk7ZW8uZnJvbVBvaW50Tm9ybWFsPWZ1bmN0aW9uKHQsZSxuKXtpZih5LnR5cGVPZi5vYmplY3QoInBvaW50Iix0KSx5LnR5cGVPZi5vYmplY3QoIm5vcm1hbCIsZSksIU0uZXF1YWxzRXBzaWxvbihhLm1hZ25pdHVkZShlKSwxLE0uRVBTSUxPTjYpKXRocm93IG5ldyBCKCJub3JtYWwgbXVzdCBiZSBub3JtYWxpemVkLiIpO2xldCBvPS1hLmRvdChlLHQpO3JldHVybiBoKG4pPyhhLmNsb25lKGUsbi5ub3JtYWwpLG4uZGlzdGFuY2U9byxuKTpuZXcgZW8oZSxvKX07dlA9bmV3IGE7ZW8uZnJvbUNhcnRlc2lhbjQ9ZnVuY3Rpb24odCxlKXt5LnR5cGVPZi5vYmplY3QoImNvZWZmaWNpZW50cyIsdCk7bGV0IG49YS5mcm9tQ2FydGVzaWFuNCh0LHZQKSxvPXQudztpZighTS5lcXVhbHNFcHNpbG9uKGEubWFnbml0dWRlKG4pLDEsTS5FUFNJTE9ONikpdGhyb3cgbmV3IEIoIm5vcm1hbCBtdXN0IGJlIG5vcm1hbGl6ZWQuIik7cmV0dXJuIGgoZSk/KGEuY2xvbmUobixlLm5vcm1hbCksZS5kaXN0YW5jZT1vLGUpOm5ldyBlbyhuLG8pfTtlby5nZXRQb2ludERpc3RhbmNlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHkudHlwZU9mLm9iamVjdCgicGxhbmUiLHQpLHkudHlwZU9mLm9iamVjdCgicG9pbnQiLGUpLGEuZG90KHQubm9ybWFsLGUpK3QuZGlzdGFuY2V9O0xQPW5ldyBhO2VvLnByb2plY3RQb2ludE9udG9QbGFuZT1mdW5jdGlvbih0LGUsbil7eS50eXBlT2Yub2JqZWN0KCJwbGFuZSIsdCkseS50eXBlT2Yub2JqZWN0KCJwb2ludCIsZSksaChuKXx8KG49bmV3IGEpO2xldCBvPWVvLmdldFBvaW50RGlzdGFuY2UodCxlKSxyPWEubXVsdGlwbHlCeVNjYWxhcih0Lm5vcm1hbCxvLExQKTtyZXR1cm4gYS5zdWJ0cmFjdChlLHIsbil9O0RQPW5ldyBzdCxGUD1uZXcgaGUsQlA9bmV3IGE7ZW8udHJhbnNmb3JtPWZ1bmN0aW9uKHQsZSxuKXt5LnR5cGVPZi5vYmplY3QoInBsYW5lIix0KSx5LnR5cGVPZi5vYmplY3QoInRyYW5zZm9ybSIsZSk7bGV0IG89dC5ub3JtYWwscj10LmRpc3RhbmNlLGk9c3QuaW52ZXJzZVRyYW5zcG9zZShlLERQKSxzPWhlLmZyb21FbGVtZW50cyhvLngsby55LG8ueixyLEZQKTtzPXN0Lm11bHRpcGx5QnlWZWN0b3IoaSxzLHMpO2xldCBmPWEuZnJvbUNhcnRlc2lhbjQocyxCUCk7cmV0dXJuIHM9aGUuZGl2aWRlQnlTY2FsYXIocyxhLm1hZ25pdHVkZShmKSxzKSxlby5mcm9tQ2FydGVzaWFuNChzLG4pfTtlby5jbG9uZT1mdW5jdGlvbih0LGUpe3JldHVybiB5LnR5cGVPZi5vYmplY3QoInBsYW5lIix0KSxoKGUpPyhhLmNsb25lKHQubm9ybWFsLGUubm9ybWFsKSxlLmRpc3RhbmNlPXQuZGlzdGFuY2UsZSk6bmV3IGVvKHQubm9ybWFsLHQuZGlzdGFuY2UpfTtlby5lcXVhbHM9ZnVuY3Rpb24odCxlKXtyZXR1cm4geS50eXBlT2Yub2JqZWN0KCJsZWZ0Iix0KSx5LnR5cGVPZi5vYmplY3QoInJpZ2h0IixlKSx0LmRpc3RhbmNlPT09ZS5kaXN0YW5jZSYmYS5lcXVhbHModC5ub3JtYWwsZS5ub3JtYWwpfTtlby5PUklHSU5fWFlfUExBTkU9T2JqZWN0LmZyZWV6ZShuZXcgZW8oYS5VTklUX1osMCkpO2VvLk9SSUdJTl9ZWl9QTEFORT1PYmplY3QuZnJlZXplKG5ldyBlbyhhLlVOSVRfWCwwKSk7ZW8uT1JJR0lOX1pYX1BMQU5FPU9iamVjdC5mcmVlemUobmV3IGVvKGEuVU5JVF9ZLDApKTtvbj1lb30pO3ZhciBqaCxCYixVYj1aKCgpPT57SXQoKTtmdCgpO0h0KCk7amg9e307amguY2FsY3VsYXRlQUNNUj1mdW5jdGlvbih0KXt0PXgodCx4LkVNUFRZX09CSkVDVCk7bGV0IGU9dC5pbmRpY2VzLG49dC5tYXhpbXVtSW5kZXgsbz14KHQuY2FjaGVTaXplLDI0KTtpZighaChlKSl0aHJvdyBuZXcgQigiaW5kaWNlcyBpcyByZXF1aXJlZC4iKTtsZXQgcj1lLmxlbmd0aDtpZihyPDN8fHIlMyE9PTApdGhyb3cgbmV3IEIoImluZGljZXMgbGVuZ3RoIG11c3QgYmUgYSBtdWx0aXBsZSBvZiB0aHJlZS4iKTtpZihuPD0wKXRocm93IG5ldyBCKCJtYXhpbXVtSW5kZXggbXVzdCBiZSBncmVhdGVyIHRoYW4gemVyby4iKTtpZihvPDMpdGhyb3cgbmV3IEIoImNhY2hlU2l6ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiB0d28uIik7aWYoIWgobikpe249MDtsZXQgZj0wLHU9ZVtmXTtmb3IoO2Y8cjspdT5uJiYobj11KSwrK2YsdT1lW2ZdfWxldCBpPVtdO2ZvcihsZXQgZj0wO2Y8bisxO2YrKylpW2ZdPTA7bGV0IHM9bysxO2ZvcihsZXQgZj0wO2Y8cjsrK2Ypcy1pW2VbZl1dPm8mJihpW2VbZl1dPXMsKytzKTtyZXR1cm4ocy1vKzEpLyhyLzMpfTtqaC50aXBzaWZ5PWZ1bmN0aW9uKHQpe3Q9eCh0LHguRU1QVFlfT0JKRUNUKTtsZXQgZT10LmluZGljZXMsbj10Lm1heGltdW1JbmRleCxvPXgodC5jYWNoZVNpemUsMjQpLHI7ZnVuY3Rpb24gaShVLEEsUyxQKXtmb3IoO0EubGVuZ3RoPj0xOyl7bGV0IEY9QVtBLmxlbmd0aC0xXTtpZihBLnNwbGljZShBLmxlbmd0aC0xLDEpLFVbRl0ubnVtTGl2ZVRyaWFuZ2xlcz4wKXJldHVybiBGfWZvcig7cjxQOyl7aWYoVVtyXS5udW1MaXZlVHJpYW5nbGVzPjApcmV0dXJuKytyLHItMTsrK3J9cmV0dXJuLTF9ZnVuY3Rpb24gcyhVLEEsUyxQLEYsaixIKXtsZXQgaz0tMSxLLFg9LTEsUj0wO2Zvcig7UjxTLmxlbmd0aDspe2xldCBvdD1TW1JdO1Bbb3RdLm51bUxpdmVUcmlhbmdsZXMmJihLPTAsRi1QW290XS50aW1lU3RhbXArMipQW290XS5udW1MaXZlVHJpYW5nbGVzPD1BJiYoSz1GLVBbb3RdLnRpbWVTdGFtcCksKEs+WHx8WD09PS0xKSYmKFg9SyxrPW90KSksKytSfXJldHVybiBrPT09LTE/aShQLGosVSxIKTprfWlmKCFoKGUpKXRocm93IG5ldyBCKCJpbmRpY2VzIGlzIHJlcXVpcmVkLiIpO2xldCBmPWUubGVuZ3RoO2lmKGY8M3x8ZiUzIT09MCl0aHJvdyBuZXcgQigiaW5kaWNlcyBsZW5ndGggbXVzdCBiZSBhIG11bHRpcGxlIG9mIHRocmVlLiIpO2lmKG48PTApdGhyb3cgbmV3IEIoIm1heGltdW1JbmRleCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiB6ZXJvLiIpO2lmKG88Myl0aHJvdyBuZXcgQigiY2FjaGVTaXplIG11c3QgYmUgZ3JlYXRlciB0aGFuIHR3by4iKTtsZXQgdT0wLGM9MCxsPWVbY10scD1mO2lmKGgobikpdT1uKzE7ZWxzZXtmb3IoO2M8cDspbD51JiYodT1sKSwrK2MsbD1lW2NdO2lmKHU9PT0tMSlyZXR1cm4gMDsrK3V9bGV0IGQ9W10sbTtmb3IobT0wO208dTttKyspZFttXT17bnVtTGl2ZVRyaWFuZ2xlczowLHRpbWVTdGFtcDowLHZlcnRleFRyaWFuZ2xlczpbXX07Yz0wO2xldCBfPTA7Zm9yKDtjPHA7KWRbZVtjXV0udmVydGV4VHJpYW5nbGVzLnB1c2goXyksKytkW2VbY11dLm51bUxpdmVUcmlhbmdsZXMsZFtlW2MrMV1dLnZlcnRleFRyaWFuZ2xlcy5wdXNoKF8pLCsrZFtlW2MrMV1dLm51bUxpdmVUcmlhbmdsZXMsZFtlW2MrMl1dLnZlcnRleFRyaWFuZ2xlcy5wdXNoKF8pLCsrZFtlW2MrMl1dLm51bUxpdmVUcmlhbmdsZXMsKytfLGMrPTM7bGV0IGc9MCxiPW8rMTtyPTE7bGV0IFQ9W10sTz1bXSxFLHcsQz0wLE49W10sST1mLzMsRD1bXTtmb3IobT0wO208STttKyspRFttXT0hMTtsZXQgdixMO2Zvcig7ZyE9PS0xOyl7VD1bXSx3PWRbZ10sTD13LnZlcnRleFRyaWFuZ2xlcy5sZW5ndGg7Zm9yKGxldCBVPTA7VTxMOysrVSlpZihfPXcudmVydGV4VHJpYW5nbGVzW1VdLCFEW19dKXtEW19dPSEwLGM9XytfK187Zm9yKGxldCBBPTA7QTwzOysrQSl2PWVbY10sVC5wdXNoKHYpLE8ucHVzaCh2KSxOW0NdPXYsKytDLEU9ZFt2XSwtLUUubnVtTGl2ZVRyaWFuZ2xlcyxiLUUudGltZVN0YW1wPm8mJihFLnRpbWVTdGFtcD1iLCsrYiksKytjfWc9cyhlLG8sVCxkLGIsTyx1KX1yZXR1cm4gTn07QmI9amh9KTtmdW5jdGlvbiBXcCh0LGUsbixvLHIpe3RbZSsrXT1uLHRbZSsrXT1vLHRbZSsrXT1vLHRbZSsrXT1yLHRbZSsrXT1yLHRbZV09bn1mdW5jdGlvbiBVUCh0KXtsZXQgZT10Lmxlbmd0aCxuPWUvMyo2LG89RHQuY3JlYXRlVHlwZWRBcnJheShlLG4pLHI9MDtmb3IobGV0IGk9MDtpPGU7aSs9MyxyKz02KVdwKG8scix0W2ldLHRbaSsxXSx0W2krMl0pO3JldHVybiBvfWZ1bmN0aW9uIFZQKHQpe2xldCBlPXQubGVuZ3RoO2lmKGU+PTMpe2xldCBuPShlLTIpKjYsbz1EdC5jcmVhdGVUeXBlZEFycmF5KGUsbik7V3AobywwLHRbMF0sdFsxXSx0WzJdKTtsZXQgcj02O2ZvcihsZXQgaT0zO2k8ZTsrK2kscis9NilXcChvLHIsdFtpLTFdLHRbaV0sdFtpLTJdKTtyZXR1cm4gb31yZXR1cm4gbmV3IFVpbnQxNkFycmF5fWZ1bmN0aW9uIGtQKHQpe2lmKHQubGVuZ3RoPjApe2xldCBlPXQubGVuZ3RoLTEsbj0oZS0xKSo2LG89RHQuY3JlYXRlVHlwZWRBcnJheShlLG4pLHI9dFswXSxpPTA7Zm9yKGxldCBzPTE7czxlOysrcyxpKz02KVdwKG8saSxyLHRbc10sdFtzKzFdKTtyZXR1cm4gb31yZXR1cm4gbmV3IFVpbnQxNkFycmF5fWZ1bmN0aW9uIFZiKHQpe2xldCBlPXt9O2ZvcihsZXQgbiBpbiB0KWlmKHQuaGFzT3duUHJvcGVydHkobikmJmgodFtuXSkmJmgodFtuXS52YWx1ZXMpKXtsZXQgbz10W25dO2Vbbl09bmV3IGl0KHtjb21wb25lbnREYXRhdHlwZTpvLmNvbXBvbmVudERhdGF0eXBlLGNvbXBvbmVudHNQZXJBdHRyaWJ1dGU6by5jb21wb25lbnRzUGVyQXR0cmlidXRlLG5vcm1hbGl6ZTpvLm5vcm1hbGl6ZSx2YWx1ZXM6W119KX1yZXR1cm4gZX1mdW5jdGlvbiBHUCh0LGUsbil7Zm9yKGxldCBvIGluIGUpaWYoZS5oYXNPd25Qcm9wZXJ0eShvKSYmaChlW29dKSYmaChlW29dLnZhbHVlcykpe2xldCByPWVbb107Zm9yKGxldCBpPTA7aTxyLmNvbXBvbmVudHNQZXJBdHRyaWJ1dGU7KytpKXRbb10udmFsdWVzLnB1c2goci52YWx1ZXNbbipyLmNvbXBvbmVudHNQZXJBdHRyaWJ1dGUraV0pfX1mdW5jdGlvbiBxaCh0LGUpe2lmKGgoZSkpe2xldCBuPWUudmFsdWVzLG89bi5sZW5ndGg7Zm9yKGxldCByPTA7cjxvO3IrPTMpYS51bnBhY2sobixyLFZyKSxzdC5tdWx0aXBseUJ5UG9pbnQodCxWcixWciksYS5wYWNrKFZyLG4scil9fWZ1bmN0aW9uIEtoKHQsZSl7aWYoaChlKSl7bGV0IG49ZS52YWx1ZXMsbz1uLmxlbmd0aDtmb3IobGV0IHI9MDtyPG87cis9MylhLnVucGFjayhuLHIsVnIpLFEubXVsdGlwbHlCeVZlY3Rvcih0LFZyLFZyKSxWcj1hLm5vcm1hbGl6ZShWcixWciksYS5wYWNrKFZyLG4scil9fWZ1bmN0aW9uIGpQKHQsZSl7bGV0IG49dC5sZW5ndGgsbz17fSxyPXRbMF1bZV0uYXR0cmlidXRlcyxpO2ZvcihpIGluIHIpaWYoci5oYXNPd25Qcm9wZXJ0eShpKSYmaChyW2ldKSYmaChyW2ldLnZhbHVlcykpe2xldCBzPXJbaV0sZj1zLnZhbHVlcy5sZW5ndGgsdT0hMDtmb3IobGV0IGM9MTtjPG47KytjKXtsZXQgbD10W2NdW2VdLmF0dHJpYnV0ZXNbaV07aWYoIWgobCl8fHMuY29tcG9uZW50RGF0YXR5cGUhPT1sLmNvbXBvbmVudERhdGF0eXBlfHxzLmNvbXBvbmVudHNQZXJBdHRyaWJ1dGUhPT1sLmNvbXBvbmVudHNQZXJBdHRyaWJ1dGV8fHMubm9ybWFsaXplIT09bC5ub3JtYWxpemUpe3U9ITE7YnJlYWt9Zis9bC52YWx1ZXMubGVuZ3RofXUmJihvW2ldPW5ldyBpdCh7Y29tcG9uZW50RGF0YXR5cGU6cy5jb21wb25lbnREYXRhdHlwZSxjb21wb25lbnRzUGVyQXR0cmlidXRlOnMuY29tcG9uZW50c1BlckF0dHJpYnV0ZSxub3JtYWxpemU6cy5ub3JtYWxpemUsdmFsdWVzOm50LmNyZWF0ZVR5cGVkQXJyYXkocy5jb21wb25lbnREYXRhdHlwZSxmKX0pKX1yZXR1cm4gb31mdW5jdGlvbiBXaCh0LGUpe2xldCBuPXQubGVuZ3RoLG8scixpLHMsZj10WzBdLm1vZGVsTWF0cml4LHU9aCh0WzBdW2VdLmluZGljZXMpLGM9dFswXVtlXS5wcmltaXRpdmVUeXBlO2ZvcihyPTE7cjxuOysrcil7aWYoIXN0LmVxdWFscyh0W3JdLm1vZGVsTWF0cml4LGYpKXRocm93IG5ldyBCKCJBbGwgaW5zdGFuY2VzIG11c3QgaGF2ZSB0aGUgc2FtZSBtb2RlbE1hdHJpeC4iKTtpZihoKHRbcl1bZV0uaW5kaWNlcykhPT11KXRocm93IG5ldyBCKCJBbGwgaW5zdGFuY2UgZ2VvbWV0cmllcyBtdXN0IGhhdmUgYW4gaW5kaWNlcyBvciBub3QgaGF2ZSBvbmUuIik7aWYodFtyXVtlXS5wcmltaXRpdmVUeXBlIT09Yyl0aHJvdyBuZXcgQigiQWxsIGluc3RhbmNlIGdlb21ldHJpZXMgbXVzdCBoYXZlIHRoZSBzYW1lIHByaW1pdGl2ZVR5cGUuIil9bGV0IGw9alAodCxlKSxwLGQsbTtmb3IobyBpbiBsKWlmKGwuaGFzT3duUHJvcGVydHkobykpZm9yKHA9bFtvXS52YWx1ZXMscz0wLHI9MDtyPG47KytyKWZvcihkPXRbcl1bZV0uYXR0cmlidXRlc1tvXS52YWx1ZXMsbT1kLmxlbmd0aCxpPTA7aTxtOysraSlwW3MrK109ZFtpXTtsZXQgXztpZih1KXtsZXQgTz0wO2ZvcihyPTA7cjxuOysrcilPKz10W3JdW2VdLmluZGljZXMubGVuZ3RoO2xldCBFPVV0LmNvbXB1dGVOdW1iZXJPZlZlcnRpY2VzKG5ldyBVdCh7YXR0cmlidXRlczpsLHByaW1pdGl2ZVR5cGU6QnQuUE9JTlRTfSkpLHc9RHQuY3JlYXRlVHlwZWRBcnJheShFLE8pLEM9MCxOPTA7Zm9yKHI9MDtyPG47KytyKXtsZXQgST10W3JdW2VdLmluZGljZXMsRD1JLmxlbmd0aDtmb3Iocz0wO3M8RDsrK3Mpd1tDKytdPU4rSVtzXTtOKz1VdC5jb21wdXRlTnVtYmVyT2ZWZXJ0aWNlcyh0W3JdW2VdKX1fPXd9bGV0IGc9bmV3IGEsYj0wLFQ7Zm9yKHI9MDtyPG47KytyKXtpZihUPXRbcl1bZV0uYm91bmRpbmdTcGhlcmUsIWgoVCkpe2c9dm9pZCAwO2JyZWFrfWEuYWRkKFQuY2VudGVyLGcsZyl9aWYoaChnKSlmb3IoYS5kaXZpZGVCeVNjYWxhcihnLG4sZykscj0wO3I8bjsrK3Ipe1Q9dFtyXVtlXS5ib3VuZGluZ1NwaGVyZTtsZXQgTz1hLm1hZ25pdHVkZShhLnN1YnRyYWN0KFQuY2VudGVyLGcsSFApKStULnJhZGl1cztPPmImJihiPU8pfXJldHVybiBuZXcgVXQoe2F0dHJpYnV0ZXM6bCxpbmRpY2VzOl8scHJpbWl0aXZlVHlwZTpjLGJvdW5kaW5nU3BoZXJlOmgoZyk/bmV3IEF0KGcsYik6dm9pZCAwfSl9ZnVuY3Rpb24gV1AodCl7aWYoaCh0LmluZGljZXMpKXJldHVybiB0O2xldCBlPVV0LmNvbXB1dGVOdW1iZXJPZlZlcnRpY2VzKHQpO2lmKGU8Myl0aHJvdyBuZXcgQigiVGhlIG51bWJlciBvZiB2ZXJ0aWNlcyBtdXN0IGJlIGF0IGxlYXN0IHRocmVlLiIpO2lmKGUlMyE9PTApdGhyb3cgbmV3IEIoIlRoZSBudW1iZXIgb2YgdmVydGljZXMgbXVzdCBiZSBhIG11bHRpcGxlIG9mIHRocmVlLiIpO2xldCBuPUR0LmNyZWF0ZVR5cGVkQXJyYXkoZSxlKTtmb3IobGV0IG89MDtvPGU7KytvKW5bb109bztyZXR1cm4gdC5pbmRpY2VzPW4sdH1mdW5jdGlvbiBYUCh0KXtsZXQgZT1VdC5jb21wdXRlTnVtYmVyT2ZWZXJ0aWNlcyh0KTtpZihlPDMpdGhyb3cgbmV3IEIoIlRoZSBudW1iZXIgb2YgdmVydGljZXMgbXVzdCBiZSBhdCBsZWFzdCB0aHJlZS4iKTtsZXQgbj1EdC5jcmVhdGVUeXBlZEFycmF5KGUsKGUtMikqMyk7blswXT0xLG5bMV09MCxuWzJdPTI7bGV0IG89Mztmb3IobGV0IHI9MztyPGU7KytyKW5bbysrXT1yLTEsbltvKytdPTAsbltvKytdPXI7cmV0dXJuIHQuaW5kaWNlcz1uLHQucHJpbWl0aXZlVHlwZT1CdC5UUklBTkdMRVMsdH1mdW5jdGlvbiBZUCh0KXtsZXQgZT1VdC5jb21wdXRlTnVtYmVyT2ZWZXJ0aWNlcyh0KTtpZihlPDMpdGhyb3cgbmV3IEIoIlRoZSBudW1iZXIgb2YgdmVydGljZXMgbXVzdCBiZSBhdCBsZWFzdCAzLiIpO2xldCBuPUR0LmNyZWF0ZVR5cGVkQXJyYXkoZSwoZS0yKSozKTtuWzBdPTAsblsxXT0xLG5bMl09MixlPjMmJihuWzNdPTAsbls0XT0yLG5bNV09Myk7bGV0IG89Njtmb3IobGV0IHI9MztyPGUtMTtyKz0yKW5bbysrXT1yLG5bbysrXT1yLTEsbltvKytdPXIrMSxyKzI8ZSYmKG5bbysrXT1yLG5bbysrXT1yKzEsbltvKytdPXIrMik7cmV0dXJuIHQuaW5kaWNlcz1uLHQucHJpbWl0aXZlVHlwZT1CdC5UUklBTkdMRVMsdH1mdW5jdGlvbiAkUCh0KXtpZihoKHQuaW5kaWNlcykpcmV0dXJuIHQ7bGV0IGU9VXQuY29tcHV0ZU51bWJlck9mVmVydGljZXModCk7aWYoZTwyKXRocm93IG5ldyBCKCJUaGUgbnVtYmVyIG9mIHZlcnRpY2VzIG11c3QgYmUgYXQgbGVhc3QgdHdvLiIpO2lmKGUlMiE9PTApdGhyb3cgbmV3IEIoIlRoZSBudW1iZXIgb2YgdmVydGljZXMgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDIuIik7bGV0IG49RHQuY3JlYXRlVHlwZWRBcnJheShlLGUpO2ZvcihsZXQgbz0wO288ZTsrK28pbltvXT1vO3JldHVybiB0LmluZGljZXM9bix0fWZ1bmN0aW9uIFpQKHQpe2xldCBlPVV0LmNvbXB1dGVOdW1iZXJPZlZlcnRpY2VzKHQpO2lmKGU8Mil0aHJvdyBuZXcgQigiVGhlIG51bWJlciBvZiB2ZXJ0aWNlcyBtdXN0IGJlIGF0IGxlYXN0IHR3by4iKTtsZXQgbj1EdC5jcmVhdGVUeXBlZEFycmF5KGUsKGUtMSkqMik7blswXT0wLG5bMV09MTtsZXQgbz0yO2ZvcihsZXQgcj0yO3I8ZTsrK3IpbltvKytdPXItMSxuW28rK109cjtyZXR1cm4gdC5pbmRpY2VzPW4sdC5wcmltaXRpdmVUeXBlPUJ0LkxJTkVTLHR9ZnVuY3Rpb24gUVAodCl7bGV0IGU9VXQuY29tcHV0ZU51bWJlck9mVmVydGljZXModCk7aWYoZTwyKXRocm93IG5ldyBCKCJUaGUgbnVtYmVyIG9mIHZlcnRpY2VzIG11c3QgYmUgYXQgbGVhc3QgdHdvLiIpO2xldCBuPUR0LmNyZWF0ZVR5cGVkQXJyYXkoZSxlKjIpO25bMF09MCxuWzFdPTE7bGV0IG89Mjtmb3IobGV0IHI9MjtyPGU7KytyKW5bbysrXT1yLTEsbltvKytdPXI7cmV0dXJuIG5bbysrXT1lLTEsbltvXT0wLHQuaW5kaWNlcz1uLHQucHJpbWl0aXZlVHlwZT1CdC5MSU5FUyx0fWZ1bmN0aW9uIEpQKHQpe3N3aXRjaCh0LnByaW1pdGl2ZVR5cGUpe2Nhc2UgQnQuVFJJQU5HTEVfRkFOOnJldHVybiBYUCh0KTtjYXNlIEJ0LlRSSUFOR0xFX1NUUklQOnJldHVybiBZUCh0KTtjYXNlIEJ0LlRSSUFOR0xFUzpyZXR1cm4gV1AodCk7Y2FzZSBCdC5MSU5FX1NUUklQOnJldHVybiBaUCh0KTtjYXNlIEJ0LkxJTkVfTE9PUDpyZXR1cm4gUVAodCk7Y2FzZSBCdC5MSU5FUzpyZXR1cm4gJFAodCl9cmV0dXJuIHR9ZnVuY3Rpb24gdXModCxlKXtNYXRoLmFicyh0LnkpPE0uRVBTSUxPTjYmJihlP3QueT0tTS5FUFNJTE9ONjp0Lnk9TS5FUFNJTE9ONil9ZnVuY3Rpb24gdE0odCxlLG4pe2lmKHQueSE9PTAmJmUueSE9PTAmJm4ueSE9PTApe3VzKHQsdC55PDApLHVzKGUsZS55PDApLHVzKG4sbi55PDApO3JldHVybn1sZXQgbz1NYXRoLmFicyh0LnkpLHI9TWF0aC5hYnMoZS55KSxpPU1hdGguYWJzKG4ueSkscztvPnI/bz5pP3M9TS5zaWduKHQueSk6cz1NLnNpZ24obi55KTpyPmk/cz1NLnNpZ24oZS55KTpzPU0uc2lnbihuLnkpO2xldCBmPXM8MDt1cyh0LGYpLHVzKGUsZiksdXMobixmKX1mdW5jdGlvbiBicih0LGUsbixvKXthLmFkZCh0LGEubXVsdGlwbHlCeVNjYWxhcihhLnN1YnRyYWN0KGUsdCxIYiksdC55Lyh0LnktZS55KSxIYiksbiksYS5jbG9uZShuLG8pLHVzKG4sITApLHVzKG8sITEpfWZ1bmN0aW9uIGVNKHQsZSxuKXtpZih0Lng+PTB8fGUueD49MHx8bi54Pj0wKXJldHVybjt0TSh0LGUsbik7bGV0IG89dC55PDAscj1lLnk8MCxpPW4ueTwwLHM9MDtzKz1vPzE6MCxzKz1yPzE6MCxzKz1pPzE6MDtsZXQgZj1YaC5pbmRpY2VzO3M9PT0xPyhmWzFdPTMsZlsyXT00LGZbNV09NixmWzddPTYsZls4XT01LG8/KGJyKHQsZSxlYyxvYyksYnIodCxuLG5jLHJjKSxmWzBdPTAsZlszXT0xLGZbNF09MixmWzZdPTEpOnI/KGJyKGUsbixlYyxvYyksYnIoZSx0LG5jLHJjKSxmWzBdPTEsZlszXT0yLGZbNF09MCxmWzZdPTIpOmkmJihicihuLHQsZWMsb2MpLGJyKG4sZSxuYyxyYyksZlswXT0yLGZbM109MCxmWzRdPTEsZls2XT0wKSk6cz09PTImJihmWzJdPTQsZls0XT00LGZbNV09MyxmWzddPTUsZls4XT02LG8/cj9pfHwoYnIobix0LGVjLG9jKSxicihuLGUsbmMscmMpLGZbMF09MCxmWzFdPTEsZlszXT0wLGZbNl09Mik6KGJyKGUsbixlYyxvYyksYnIoZSx0LG5jLHJjKSxmWzBdPTIsZlsxXT0wLGZbM109MixmWzZdPTEpOihicih0LGUsZWMsb2MpLGJyKHQsbixuYyxyYyksZlswXT0xLGZbMV09MixmWzNdPTEsZls2XT0wKSk7bGV0IHU9WGgucG9zaXRpb25zO3JldHVybiB1WzBdPXQsdVsxXT1lLHVbMl09bix1Lmxlbmd0aD0zLChzPT09MXx8cz09PTIpJiYodVszXT1lYyx1WzRdPW5jLHVbNV09b2MsdVs2XT1yYyx1Lmxlbmd0aD03KSxYaH1mdW5jdGlvbiBxYih0LGUpe2xldCBuPXQuYXR0cmlidXRlcztpZihuLnBvc2l0aW9uLnZhbHVlcy5sZW5ndGg9PT0wKXJldHVybjtmb3IobGV0IHIgaW4gbilpZihuLmhhc093blByb3BlcnR5KHIpJiZoKG5bcl0pJiZoKG5bcl0udmFsdWVzKSl7bGV0IGk9bltyXTtpLnZhbHVlcz1udC5jcmVhdGVUeXBlZEFycmF5KGkuY29tcG9uZW50RGF0YXR5cGUsaS52YWx1ZXMpfWxldCBvPVV0LmNvbXB1dGVOdW1iZXJPZlZlcnRpY2VzKHQpO3JldHVybiB0LmluZGljZXM9RHQuY3JlYXRlVHlwZWRBcnJheShvLHQuaW5kaWNlcyksZSYmKHQuYm91bmRpbmdTcGhlcmU9QXQuZnJvbVZlcnRpY2VzKG4ucG9zaXRpb24udmFsdWVzKSksdH1mdW5jdGlvbiBpYSh0KXtsZXQgZT10LmF0dHJpYnV0ZXMsbj17fTtmb3IobGV0IG8gaW4gZSlpZihlLmhhc093blByb3BlcnR5KG8pJiZoKGVbb10pJiZoKGVbb10udmFsdWVzKSl7bGV0IHI9ZVtvXTtuW29dPW5ldyBpdCh7Y29tcG9uZW50RGF0YXR5cGU6ci5jb21wb25lbnREYXRhdHlwZSxjb21wb25lbnRzUGVyQXR0cmlidXRlOnIuY29tcG9uZW50c1BlckF0dHJpYnV0ZSxub3JtYWxpemU6ci5ub3JtYWxpemUsdmFsdWVzOltdfSl9cmV0dXJuIG5ldyBVdCh7YXR0cmlidXRlczpuLGluZGljZXM6W10scHJpbWl0aXZlVHlwZTp0LnByaW1pdGl2ZVR5cGV9KX1mdW5jdGlvbiBRaCh0LGUsbil7bGV0IG89aCh0Lmdlb21ldHJ5LmJvdW5kaW5nU3BoZXJlKTtlPXFiKGUsbyksbj1xYihuLG8pLGgobikmJiFoKGUpP3QuZ2VvbWV0cnk9bjohaChuKSYmaChlKT90Lmdlb21ldHJ5PWU6KHQud2VzdEhlbWlzcGhlcmVHZW9tZXRyeT1lLHQuZWFzdEhlbWlzcGhlcmVHZW9tZXRyeT1uLHQuZ2VvbWV0cnk9dm9pZCAwKX1mdW5jdGlvbiBKaCh0LGUpe2xldCBuPW5ldyB0LG89bmV3IHQscj1uZXcgdDtyZXR1cm4gZnVuY3Rpb24oaSxzLGYsdSxjLGwscCxkKXtsZXQgbT10LmZyb21BcnJheShjLGkqZSxuKSxfPXQuZnJvbUFycmF5KGMscyplLG8pLGc9dC5mcm9tQXJyYXkoYyxmKmUscik7dC5tdWx0aXBseUJ5U2NhbGFyKG0sdS54LG0pLHQubXVsdGlwbHlCeVNjYWxhcihfLHUueSxfKSx0Lm11bHRpcGx5QnlTY2FsYXIoZyx1LnosZyk7bGV0IGI9dC5hZGQobSxfLG0pO3QuYWRkKGIsZyxiKSxkJiZ0Lm5vcm1hbGl6ZShiLGIpLHQucGFjayhiLGwscCplKX19ZnVuY3Rpb24gSHAodCxlLG4sbyxyLGkscyxmLHUsYyxsLHAsZCxtLF8sZyl7aWYoIWgoaSkmJiFoKHMpJiYhaChmKSYmIWgodSkmJiFoKGMpJiZtPT09MClyZXR1cm47bGV0IGI9YS5mcm9tQXJyYXkocix0KjMsRWYpLFQ9YS5mcm9tQXJyYXkocixlKjMsWWgpLE89YS5mcm9tQXJyYXkocixuKjMsJGgpLEU9d2IobyxiLFQsTyxyTSk7aWYoaChFKSl7aWYoaChpKSYmS3AodCxlLG4sRSxpLHAubm9ybWFsLnZhbHVlcyxnLCEwKSxoKGMpKXtsZXQgdz1hLmZyb21BcnJheShjLHQqMyxFZiksQz1hLmZyb21BcnJheShjLGUqMyxZaCksTj1hLmZyb21BcnJheShjLG4qMywkaCk7YS5tdWx0aXBseUJ5U2NhbGFyKHcsRS54LHcpLGEubXVsdGlwbHlCeVNjYWxhcihDLEUueSxDKSxhLm11bHRpcGx5QnlTY2FsYXIoTixFLnosTik7bGV0IEk7IWEuZXF1YWxzKHcsYS5aRVJPKXx8IWEuZXF1YWxzKEMsYS5aRVJPKXx8IWEuZXF1YWxzKE4sYS5aRVJPKT8oST1hLmFkZCh3LEMsdyksYS5hZGQoSSxOLEkpLGEubm9ybWFsaXplKEksSSkpOihJPUVmLEkueD0wLEkueT0wLEkuej0wKSxhLnBhY2soSSxwLmV4dHJ1ZGVEaXJlY3Rpb24udmFsdWVzLGcqMyl9aWYoaChsKSYmb00odCxlLG4sRSxsLHAuYXBwbHlPZmZzZXQudmFsdWVzLGcpLGgocykmJktwKHQsZSxuLEUscyxwLnRhbmdlbnQudmFsdWVzLGcsITApLGgoZikmJktwKHQsZSxuLEUsZixwLmJpdGFuZ2VudC52YWx1ZXMsZywhMCksaCh1KSYmWmIodCxlLG4sRSx1LHAuc3QudmFsdWVzLGcpLG0+MClmb3IobGV0IHc9MDt3PG07dysrKXtsZXQgQz1kW3ddO2lNKHQsZSxuLEUsZyxfW0NdLHBbQ10pfX19ZnVuY3Rpb24gaU0odCxlLG4sbyxyLGkscyl7bGV0IGY9aS5jb21wb25lbnRzUGVyQXR0cmlidXRlLHU9aS52YWx1ZXMsYz1zLnZhbHVlcztzd2l0Y2goZil7Y2FzZSA0Om5NKHQsZSxuLG8sdSxjLHIsITEpO2JyZWFrO2Nhc2UgMzpLcCh0LGUsbixvLHUsYyxyLCExKTticmVhaztjYXNlIDI6WmIodCxlLG4sbyx1LGMsciwhMSk7YnJlYWs7ZGVmYXVsdDpjW3JdPXVbdF0qby54K3VbZV0qby55K3Vbbl0qby56fX1mdW5jdGlvbiBpaSh0LGUsbixvLHIsaSl7bGV0IHM9dC5wb3NpdGlvbi52YWx1ZXMubGVuZ3RoLzM7aWYociE9PS0xKXtsZXQgZj1vW3JdLHU9bltmXTtyZXR1cm4gdT09PS0xPyhuW2ZdPXMsdC5wb3NpdGlvbi52YWx1ZXMucHVzaChpLngsaS55LGkueiksZS5wdXNoKHMpLHMpOihlLnB1c2godSksdSl9cmV0dXJuIHQucG9zaXRpb24udmFsdWVzLnB1c2goaS54LGkueSxpLnopLGUucHVzaChzKSxzfWZ1bmN0aW9uIEtiKHQpe2xldCBlPXQuZ2VvbWV0cnksbj1lLmF0dHJpYnV0ZXMsbz1uLnBvc2l0aW9uLnZhbHVlcyxyPWgobi5ub3JtYWwpP24ubm9ybWFsLnZhbHVlczp2b2lkIDAsaT1oKG4uYml0YW5nZW50KT9uLmJpdGFuZ2VudC52YWx1ZXM6dm9pZCAwLHM9aChuLnRhbmdlbnQpP24udGFuZ2VudC52YWx1ZXM6dm9pZCAwLGY9aChuLnN0KT9uLnN0LnZhbHVlczp2b2lkIDAsdT1oKG4uZXh0cnVkZURpcmVjdGlvbik/bi5leHRydWRlRGlyZWN0aW9uLnZhbHVlczp2b2lkIDAsYz1oKG4uYXBwbHlPZmZzZXQpP24uYXBwbHlPZmZzZXQudmFsdWVzOnZvaWQgMCxsPWUuaW5kaWNlcyxwPVtdO2ZvcihsZXQgSSBpbiBuKW4uaGFzT3duUHJvcGVydHkoSSkmJiFzTVtJXSYmaChuW0ldKSYmcC5wdXNoKEkpO2xldCBkPXAubGVuZ3RoLG09aWEoZSksXz1pYShlKSxnLGIsVCxPLEUsdz1bXTt3Lmxlbmd0aD1vLmxlbmd0aC8zO2xldCBDPVtdO2ZvcihDLmxlbmd0aD1vLmxlbmd0aC8zLEU9MDtFPHcubGVuZ3RoOysrRSl3W0VdPS0xLENbRV09LTE7bGV0IE49bC5sZW5ndGg7Zm9yKEU9MDtFPE47RSs9Myl7bGV0IEk9bFtFXSxEPWxbRSsxXSx2PWxbRSsyXSxMPWEuZnJvbUFycmF5KG8sSSozKSxVPWEuZnJvbUFycmF5KG8sRCozKSxBPWEuZnJvbUFycmF5KG8sdiozKSxTPWVNKEwsVSxBKTtpZihoKFMpJiZTLnBvc2l0aW9ucy5sZW5ndGg+Myl7bGV0IFA9Uy5wb3NpdGlvbnMsRj1TLmluZGljZXMsaj1GLmxlbmd0aDtmb3IobGV0IEg9MDtIPGo7KytIKXtsZXQgaz1GW0hdLEs9UFtrXTtLLnk8MD8oZz1fLmF0dHJpYnV0ZXMsYj1fLmluZGljZXMsVD13KTooZz1tLmF0dHJpYnV0ZXMsYj1tLmluZGljZXMsVD1DKSxPPWlpKGcsYixULGwsazwzP0UrazotMSxLKSxIcChJLEQsdixLLG8scixzLGksZix1LGMsZyxwLGQsbixPKX19ZWxzZSBoKFMpJiYoTD1TLnBvc2l0aW9uc1swXSxVPVMucG9zaXRpb25zWzFdLEE9Uy5wb3NpdGlvbnNbMl0pLEwueTwwPyhnPV8uYXR0cmlidXRlcyxiPV8uaW5kaWNlcyxUPXcpOihnPW0uYXR0cmlidXRlcyxiPW0uaW5kaWNlcyxUPUMpLE89aWkoZyxiLFQsbCxFLEwpLEhwKEksRCx2LEwsbyxyLHMsaSxmLHUsYyxnLHAsZCxuLE8pLE89aWkoZyxiLFQsbCxFKzEsVSksSHAoSSxELHYsVSxvLHIscyxpLGYsdSxjLGcscCxkLG4sTyksTz1paShnLGIsVCxsLEUrMixBKSxIcChJLEQsdixBLG8scixzLGksZix1LGMsZyxwLGQsbixPKX1RaCh0LF8sbSl9ZnVuY3Rpb24gcmEodCxlLG4sbyxyLGkscyl7aWYoIWgocykpcmV0dXJuO2xldCBmPWEuZnJvbUFycmF5KG8sdCozLEVmKTthLmVxdWFsc0Vwc2lsb24oZixuLE0uRVBTSUxPTjEwKT9pLmFwcGx5T2Zmc2V0LnZhbHVlc1tyXT1zW3RdOmkuYXBwbHlPZmZzZXQudmFsdWVzW3JdPXNbZV19ZnVuY3Rpb24gV2IodCl7bGV0IGU9dC5nZW9tZXRyeSxuPWUuYXR0cmlidXRlcyxvPW4ucG9zaXRpb24udmFsdWVzLHI9aChuLmFwcGx5T2Zmc2V0KT9uLmFwcGx5T2Zmc2V0LnZhbHVlczp2b2lkIDAsaT1lLmluZGljZXMscz1pYShlKSxmPWlhKGUpLHUsYz1pLmxlbmd0aCxsPVtdO2wubGVuZ3RoPW8ubGVuZ3RoLzM7bGV0IHA9W107Zm9yKHAubGVuZ3RoPW8ubGVuZ3RoLzMsdT0wO3U8bC5sZW5ndGg7Kyt1KWxbdV09LTEscFt1XT0tMTtmb3IodT0wO3U8Yzt1Kz0yKXtsZXQgZD1pW3VdLG09aVt1KzFdLF89YS5mcm9tQXJyYXkobyxkKjMsRWYpLGc9YS5mcm9tQXJyYXkobyxtKjMsWWgpLGI7TWF0aC5hYnMoXy55KTxNLkVQU0lMT042JiYoXy55PDA/Xy55PS1NLkVQU0lMT042Ol8ueT1NLkVQU0lMT042KSxNYXRoLmFicyhnLnkpPE0uRVBTSUxPTjYmJihnLnk8MD9nLnk9LU0uRVBTSUxPTjY6Zy55PU0uRVBTSUxPTjYpO2xldCBUPXMuYXR0cmlidXRlcyxPPXMuaW5kaWNlcyxFPXAsdz1mLmF0dHJpYnV0ZXMsQz1mLmluZGljZXMsTj1sLEk9aG8ubGluZVNlZ21lbnRQbGFuZShfLGcsUWIsJGgpO2lmKGgoSSkpe2xldCBEPWEubXVsdGlwbHlCeVNjYWxhcihhLlVOSVRfWSw1Kk0uRVBTSUxPTjksY00pO18ueTwwJiYoYS5uZWdhdGUoRCxEKSxUPWYuYXR0cmlidXRlcyxPPWYuaW5kaWNlcyxFPWwsdz1zLmF0dHJpYnV0ZXMsQz1zLmluZGljZXMsTj1wKTtsZXQgdj1hLmFkZChJLEQsYU0pO2I9aWkoVCxPLEUsaSx1LF8pLHJhKGQsbSxfLG8sYixULHIpLGI9aWkoVCxPLEUsaSwtMSx2KSxyYShkLG0sdixvLGIsVCxyKSxhLm5lZ2F0ZShELEQpLGEuYWRkKEksRCx2KSxiPWlpKHcsQyxOLGksLTEsdikscmEoZCxtLHYsbyxiLHcsciksYj1paSh3LEMsTixpLHUrMSxnKSxyYShkLG0sZyxvLGIsdyxyKX1lbHNle2xldCBELHYsTDtfLnk8MD8oRD1mLmF0dHJpYnV0ZXMsdj1mLmluZGljZXMsTD1sKTooRD1zLmF0dHJpYnV0ZXMsdj1zLmluZGljZXMsTD1wKSxiPWlpKEQsdixMLGksdSxfKSxyYShkLG0sXyxvLGIsRCxyKSxiPWlpKEQsdixMLGksdSsxLGcpLHJhKGQsbSxnLG8sYixELHIpfX1RaCh0LGYscyl9ZnVuY3Rpb24gJGIodCl7bGV0IGU9dC5hdHRyaWJ1dGVzLG49ZS5wb3NpdGlvbi52YWx1ZXMsbz1lLnByZXZQb3NpdGlvbi52YWx1ZXMscj1lLm5leHRQb3NpdGlvbi52YWx1ZXMsaT1uLmxlbmd0aDtmb3IobGV0IHM9MDtzPGk7cys9Myl7bGV0IGY9YS51bnBhY2sobixzLEpiKTtpZihmLng+MCljb250aW51ZTtsZXQgdT1hLnVucGFjayhvLHMsdFQpOyhmLnk8MCYmdS55PjB8fGYueT4wJiZ1Lnk8MCkmJihzLTM+MD8ob1tzXT1uW3MtM10sb1tzKzFdPW5bcy0yXSxvW3MrMl09bltzLTFdKTphLnBhY2soZixvLHMpKTtsZXQgYz1hLnVucGFjayhyLHMsWmgpOyhmLnk8MCYmYy55PjB8fGYueT4wJiZjLnk8MCkmJihzKzM8aT8ocltzXT1uW3MrM10scltzKzFdPW5bcys0XSxyW3MrMl09bltzKzVdKTphLnBhY2soZixyLHMpKX19ZnVuY3Rpb24gbU0odCl7bGV0IGU9dC5nZW9tZXRyeSxuPWUuYXR0cmlidXRlcyxvPW4ucG9zaXRpb24udmFsdWVzLHI9bi5wcmV2UG9zaXRpb24udmFsdWVzLGk9bi5uZXh0UG9zaXRpb24udmFsdWVzLHM9bi5leHBhbmRBbmRXaWR0aC52YWx1ZXMsZj1oKG4uc3QpP24uc3QudmFsdWVzOnZvaWQgMCx1PWgobi5jb2xvcik/bi5jb2xvci52YWx1ZXM6dm9pZCAwLGM9aWEoZSksbD1pYShlKSxwLGQsbSxfPSExLGc9by5sZW5ndGgvMztmb3IocD0wO3A8ZztwKz00KXtsZXQgYj1wLFQ9cCsyLE89YS5mcm9tQXJyYXkobyxiKjMsSmIpLEU9YS5mcm9tQXJyYXkobyxUKjMsdFQpO2lmKE1hdGguYWJzKE8ueSk8cXApZm9yKE8ueT1xcCooRS55PDA/LTE6MSksb1twKjMrMV09Ty55LG9bKHArMSkqMysxXT1PLnksZD1iKjM7ZDxiKjMrNCozO2QrPTMpcltkXT1vW3AqM10scltkKzFdPW9bcCozKzFdLHJbZCsyXT1vW3AqMysyXTtpZihNYXRoLmFicyhFLnkpPHFwKWZvcihFLnk9cXAqKE8ueTwwPy0xOjEpLG9bKHArMikqMysxXT1FLnksb1socCszKSozKzFdPUUueSxkPWIqMztkPGIqMys0KjM7ZCs9MylpW2RdPW9bKHArMikqM10saVtkKzFdPW9bKHArMikqMysxXSxpW2QrMl09b1socCsyKSozKzJdO2xldCB3PWMuYXR0cmlidXRlcyxDPWMuaW5kaWNlcyxOPWwuYXR0cmlidXRlcyxJPWwuaW5kaWNlcyxEPWhvLmxpbmVTZWdtZW50UGxhbmUoTyxFLFFiLHVNKTtpZihoKEQpKXtfPSEwO2xldCB2PWEubXVsdGlwbHlCeVNjYWxhcihhLlVOSVRfWSxkTSxsTSk7Ty55PDAmJihhLm5lZ2F0ZSh2LHYpLHc9bC5hdHRyaWJ1dGVzLEM9bC5pbmRpY2VzLE49Yy5hdHRyaWJ1dGVzLEk9Yy5pbmRpY2VzKTtsZXQgTD1hLmFkZChELHYscE0pO3cucG9zaXRpb24udmFsdWVzLnB1c2goTy54LE8ueSxPLnosTy54LE8ueSxPLnopLHcucG9zaXRpb24udmFsdWVzLnB1c2goTC54LEwueSxMLnopLHcucG9zaXRpb24udmFsdWVzLnB1c2goTC54LEwueSxMLnopLHcucHJldlBvc2l0aW9uLnZhbHVlcy5wdXNoKHJbYiozXSxyW2IqMysxXSxyW2IqMysyXSksdy5wcmV2UG9zaXRpb24udmFsdWVzLnB1c2gocltiKjMrM10scltiKjMrNF0scltiKjMrNV0pLHcucHJldlBvc2l0aW9uLnZhbHVlcy5wdXNoKE8ueCxPLnksTy56LE8ueCxPLnksTy56KSx3Lm5leHRQb3NpdGlvbi52YWx1ZXMucHVzaChMLngsTC55LEwueiksdy5uZXh0UG9zaXRpb24udmFsdWVzLnB1c2goTC54LEwueSxMLnopLHcubmV4dFBvc2l0aW9uLnZhbHVlcy5wdXNoKEwueCxMLnksTC56KSx3Lm5leHRQb3NpdGlvbi52YWx1ZXMucHVzaChMLngsTC55LEwueiksYS5uZWdhdGUodix2KSxhLmFkZChELHYsTCksTi5wb3NpdGlvbi52YWx1ZXMucHVzaChMLngsTC55LEwueiksTi5wb3NpdGlvbi52YWx1ZXMucHVzaChMLngsTC55LEwueiksTi5wb3NpdGlvbi52YWx1ZXMucHVzaChFLngsRS55LEUueixFLngsRS55LEUueiksTi5wcmV2UG9zaXRpb24udmFsdWVzLnB1c2goTC54LEwueSxMLnopLE4ucHJldlBvc2l0aW9uLnZhbHVlcy5wdXNoKEwueCxMLnksTC56KSxOLnByZXZQb3NpdGlvbi52YWx1ZXMucHVzaChMLngsTC55LEwueiksTi5wcmV2UG9zaXRpb24udmFsdWVzLnB1c2goTC54LEwueSxMLnopLE4ubmV4dFBvc2l0aW9uLnZhbHVlcy5wdXNoKEUueCxFLnksRS56LEUueCxFLnksRS56KSxOLm5leHRQb3NpdGlvbi52YWx1ZXMucHVzaChpW1QqM10saVtUKjMrMV0saVtUKjMrMl0pLE4ubmV4dFBvc2l0aW9uLnZhbHVlcy5wdXNoKGlbVCozKzNdLGlbVCozKzRdLGlbVCozKzVdKTtsZXQgVT10dC5mcm9tQXJyYXkocyxiKjIsWGIpLEE9TWF0aC5hYnMoVS55KTt3LmV4cGFuZEFuZFdpZHRoLnZhbHVlcy5wdXNoKC0xLEEsMSxBKSx3LmV4cGFuZEFuZFdpZHRoLnZhbHVlcy5wdXNoKC0xLC1BLDEsLUEpLE4uZXhwYW5kQW5kV2lkdGgudmFsdWVzLnB1c2goLTEsQSwxLEEpLE4uZXhwYW5kQW5kV2lkdGgudmFsdWVzLnB1c2goLTEsLUEsMSwtQSk7bGV0IFM9YS5tYWduaXR1ZGVTcXVhcmVkKGEuc3VidHJhY3QoRCxPLFpoKSk7aWYoUy89YS5tYWduaXR1ZGVTcXVhcmVkKGEuc3VidHJhY3QoRSxPLFpoKSksaCh1KSl7bGV0IFA9aGUuZnJvbUFycmF5KHUsYio0LFliKSxGPWhlLmZyb21BcnJheSh1LFQqNCxZYiksaj1NLmxlcnAoUC54LEYueCxTKSxIPU0ubGVycChQLnksRi55LFMpLGs9TS5sZXJwKFAueixGLnosUyksSz1NLmxlcnAoUC53LEYudyxTKTtmb3IoZD1iKjQ7ZDxiKjQrMio0OysrZCl3LmNvbG9yLnZhbHVlcy5wdXNoKHVbZF0pO2Zvcih3LmNvbG9yLnZhbHVlcy5wdXNoKGosSCxrLEspLHcuY29sb3IudmFsdWVzLnB1c2goaixILGssSyksTi5jb2xvci52YWx1ZXMucHVzaChqLEgsayxLKSxOLmNvbG9yLnZhbHVlcy5wdXNoKGosSCxrLEspLGQ9VCo0O2Q8VCo0KzIqNDsrK2QpTi5jb2xvci52YWx1ZXMucHVzaCh1W2RdKX1pZihoKGYpKXtsZXQgUD10dC5mcm9tQXJyYXkoZixiKjIsWGIpLEY9dHQuZnJvbUFycmF5KGYsKHArMykqMixmTSksaj1NLmxlcnAoUC54LEYueCxTKTtmb3IoZD1iKjI7ZDxiKjIrMioyOysrZCl3LnN0LnZhbHVlcy5wdXNoKGZbZF0pO2Zvcih3LnN0LnZhbHVlcy5wdXNoKGosUC55KSx3LnN0LnZhbHVlcy5wdXNoKGosRi55KSxOLnN0LnZhbHVlcy5wdXNoKGosUC55KSxOLnN0LnZhbHVlcy5wdXNoKGosRi55KSxkPVQqMjtkPFQqMisyKjI7KytkKU4uc3QudmFsdWVzLnB1c2goZltkXSl9bT13LnBvc2l0aW9uLnZhbHVlcy5sZW5ndGgvMy00LEMucHVzaChtLG0rMixtKzEpLEMucHVzaChtKzEsbSsyLG0rMyksbT1OLnBvc2l0aW9uLnZhbHVlcy5sZW5ndGgvMy00LEkucHVzaChtLG0rMixtKzEpLEkucHVzaChtKzEsbSsyLG0rMyl9ZWxzZXtsZXQgdixMO2ZvcihPLnk8MD8odj1sLmF0dHJpYnV0ZXMsTD1sLmluZGljZXMpOih2PWMuYXR0cmlidXRlcyxMPWMuaW5kaWNlcyksdi5wb3NpdGlvbi52YWx1ZXMucHVzaChPLngsTy55LE8ueiksdi5wb3NpdGlvbi52YWx1ZXMucHVzaChPLngsTy55LE8ueiksdi5wb3NpdGlvbi52YWx1ZXMucHVzaChFLngsRS55LEUueiksdi5wb3NpdGlvbi52YWx1ZXMucHVzaChFLngsRS55LEUueiksZD1wKjM7ZDxwKjMrNCozOysrZCl2LnByZXZQb3NpdGlvbi52YWx1ZXMucHVzaChyW2RdKSx2Lm5leHRQb3NpdGlvbi52YWx1ZXMucHVzaChpW2RdKTtmb3IoZD1wKjI7ZDxwKjIrNCoyOysrZCl2LmV4cGFuZEFuZFdpZHRoLnZhbHVlcy5wdXNoKHNbZF0pLGgoZikmJnYuc3QudmFsdWVzLnB1c2goZltkXSk7aWYoaCh1KSlmb3IoZD1wKjQ7ZDxwKjQrNCo0OysrZCl2LmNvbG9yLnZhbHVlcy5wdXNoKHVbZF0pO209di5wb3NpdGlvbi52YWx1ZXMubGVuZ3RoLzMtNCxMLnB1c2gobSxtKzIsbSsxKSxMLnB1c2gobSsxLG0rMixtKzMpfX1fJiYoJGIobCksJGIoYykpLFFoKHQsbCxjKX12YXIgdm8sa2IselAsSGgsVnIsR3AsenAsSFAsQXIsd2YsbmEsb2EscVAsR2IsS1AsT2YsVXIsemIsamIsanAsSGIsZWMsbmMsb2MscmMsWGgsbk0sS3AsWmIsb00sRWYsWWgsJGgsck0sc00sUWIsY00sYU0sWGIsZk0sSmIsdFQsWmgsdU0sbE0scE0sWWIsZE0scXAsVmUsc2k9WigoKT0+e2FzKCk7T2IoKTt2ZSgpO1VlKCk7RnQoKTtocigpO0llKCk7RmUoKTtJdCgpO2Z0KCk7SHQoKTtCaCgpO1NpKCk7WGUoKTtZZSgpO0xwKCk7JGUoKTtrcygpO3RjKCk7V3QoKTtCbigpO1VuKCk7ZnMoKTt0bigpO1ViKCk7dm89e307dm8udG9XaXJlZnJhbWU9ZnVuY3Rpb24odCl7aWYoIWgodCkpdGhyb3cgbmV3IEIoImdlb21ldHJ5IGlzIHJlcXVpcmVkLiIpO2xldCBlPXQuaW5kaWNlcztpZihoKGUpKXtzd2l0Y2godC5wcmltaXRpdmVUeXBlKXtjYXNlIEJ0LlRSSUFOR0xFUzp0LmluZGljZXM9VVAoZSk7YnJlYWs7Y2FzZSBCdC5UUklBTkdMRV9TVFJJUDp0LmluZGljZXM9VlAoZSk7YnJlYWs7Y2FzZSBCdC5UUklBTkdMRV9GQU46dC5pbmRpY2VzPWtQKGUpO2JyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IEIoImdlb21ldHJ5LnByaW1pdGl2ZVR5cGUgbXVzdCBiZSBUUklBTkdMRVMsIFRSSUFOR0xFX1NUUklQLCBvciBUUklBTkdMRV9GQU4uIil9dC5wcmltaXRpdmVUeXBlPUJ0LkxJTkVTfXJldHVybiB0fTt2by5jcmVhdGVMaW5lU2VnbWVudHNGb3JWZWN0b3JzPWZ1bmN0aW9uKHQsZSxuKXtpZihlPXgoZSwibm9ybWFsIiksIWgodCkpdGhyb3cgbmV3IEIoImdlb21ldHJ5IGlzIHJlcXVpcmVkLiIpO2lmKCFoKHQuYXR0cmlidXRlcy5wb3NpdGlvbikpdGhyb3cgbmV3IEIoImdlb21ldHJ5LmF0dHJpYnV0ZXMucG9zaXRpb24gaXMgcmVxdWlyZWQuIik7aWYoIWgodC5hdHRyaWJ1dGVzW2VdKSl0aHJvdyBuZXcgQihgZ2VvbWV0cnkuYXR0cmlidXRlcyBtdXN0IGhhdmUgYW4gYXR0cmlidXRlIHdpdGggdGhlIHNhbWUgbmFtZSBhcyB0aGUgYXR0cmlidXRlTmFtZSBwYXJhbWV0ZXIsICR7ZX0uYCk7bj14KG4sMWU0KTtsZXQgbz10LmF0dHJpYnV0ZXMucG9zaXRpb24udmFsdWVzLHI9dC5hdHRyaWJ1dGVzW2VdLnZhbHVlcyxpPW8ubGVuZ3RoLHM9bmV3IEZsb2F0NjRBcnJheSgyKmkpLGY9MDtmb3IobGV0IGw9MDtsPGk7bCs9MylzW2YrK109b1tsXSxzW2YrK109b1tsKzFdLHNbZisrXT1vW2wrMl0sc1tmKytdPW9bbF0rcltsXSpuLHNbZisrXT1vW2wrMV0rcltsKzFdKm4sc1tmKytdPW9bbCsyXStyW2wrMl0qbjtsZXQgdSxjPXQuYm91bmRpbmdTcGhlcmU7cmV0dXJuIGgoYykmJih1PW5ldyBBdChjLmNlbnRlcixjLnJhZGl1cytuKSksbmV3IFV0KHthdHRyaWJ1dGVzOntwb3NpdGlvbjpuZXcgaXQoe2NvbXBvbmVudERhdGF0eXBlOm50LkRPVUJMRSxjb21wb25lbnRzUGVyQXR0cmlidXRlOjMsdmFsdWVzOnN9KX0scHJpbWl0aXZlVHlwZTpCdC5MSU5FUyxib3VuZGluZ1NwaGVyZTp1fSl9O3ZvLmNyZWF0ZUF0dHJpYnV0ZUxvY2F0aW9ucz1mdW5jdGlvbih0KXtpZighaCh0KSl0aHJvdyBuZXcgQigiZ2VvbWV0cnkgaXMgcmVxdWlyZWQuIik7bGV0IGU9WyJwb3NpdGlvbiIsInBvc2l0aW9uSGlnaCIsInBvc2l0aW9uTG93IiwicG9zaXRpb24zREhpZ2giLCJwb3NpdGlvbjNETG93IiwicG9zaXRpb24yREhpZ2giLCJwb3NpdGlvbjJETG93IiwicGlja0NvbG9yIiwibm9ybWFsIiwic3QiLCJ0YW5nZW50IiwiYml0YW5nZW50IiwiZXh0cnVkZURpcmVjdGlvbiIsImNvbXByZXNzZWRBdHRyaWJ1dGVzIl0sbj10LmF0dHJpYnV0ZXMsbz17fSxyPTAsaSxzPWUubGVuZ3RoO2ZvcihpPTA7aTxzOysraSl7bGV0IGY9ZVtpXTtoKG5bZl0pJiYob1tmXT1yKyspfWZvcihsZXQgZiBpbiBuKW4uaGFzT3duUHJvcGVydHkoZikmJiFoKG9bZl0pJiYob1tmXT1yKyspO3JldHVybiBvfTt2by5yZW9yZGVyRm9yUHJlVmVydGV4Q2FjaGU9ZnVuY3Rpb24odCl7aWYoIWgodCkpdGhyb3cgbmV3IEIoImdlb21ldHJ5IGlzIHJlcXVpcmVkLiIpO2xldCBlPVV0LmNvbXB1dGVOdW1iZXJPZlZlcnRpY2VzKHQpLG49dC5pbmRpY2VzO2lmKGgobikpe2xldCBvPW5ldyBJbnQzMkFycmF5KGUpO2ZvcihsZXQgZD0wO2Q8ZTtkKyspb1tkXT0tMTtsZXQgcj1uLGk9ci5sZW5ndGgscz1EdC5jcmVhdGVUeXBlZEFycmF5KGUsaSksZj0wLHU9MCxjPTAsbDtmb3IoO2Y8aTspbD1vW3JbZl1dLGwhPT0tMT9zW3VdPWw6KGw9cltmXSxvW2xdPWMsc1t1XT1jLCsrYyksKytmLCsrdTt0LmluZGljZXM9cztsZXQgcD10LmF0dHJpYnV0ZXM7Zm9yKGxldCBkIGluIHApaWYocC5oYXNPd25Qcm9wZXJ0eShkKSYmaChwW2RdKSYmaChwW2RdLnZhbHVlcykpe2xldCBtPXBbZF0sXz1tLnZhbHVlcyxnPTAsYj1tLmNvbXBvbmVudHNQZXJBdHRyaWJ1dGUsVD1udC5jcmVhdGVUeXBlZEFycmF5KG0uY29tcG9uZW50RGF0YXR5cGUsYypiKTtmb3IoO2c8ZTspe2xldCBPPW9bZ107aWYoTyE9PS0xKWZvcihsZXQgRT0wO0U8YjtFKyspVFtiKk8rRV09X1tiKmcrRV07KytnfW0udmFsdWVzPVR9fXJldHVybiB0fTt2by5yZW9yZGVyRm9yUG9zdFZlcnRleENhY2hlPWZ1bmN0aW9uKHQsZSl7aWYoIWgodCkpdGhyb3cgbmV3IEIoImdlb21ldHJ5IGlzIHJlcXVpcmVkLiIpO2xldCBuPXQuaW5kaWNlcztpZih0LnByaW1pdGl2ZVR5cGU9PT1CdC5UUklBTkdMRVMmJmgobikpe2xldCBvPW4ubGVuZ3RoLHI9MDtmb3IobGV0IGk9MDtpPG87aSsrKW5baV0+ciYmKHI9bltpXSk7dC5pbmRpY2VzPUJiLnRpcHNpZnkoe2luZGljZXM6bixtYXhpbXVtSW5kZXg6cixjYWNoZVNpemU6ZX0pfXJldHVybiB0fTt2by5maXRUb1Vuc2lnbmVkU2hvcnRJbmRpY2VzPWZ1bmN0aW9uKHQpe2lmKCFoKHQpKXRocm93IG5ldyBCKCJnZW9tZXRyeSBpcyByZXF1aXJlZC4iKTtpZihoKHQuaW5kaWNlcykmJnQucHJpbWl0aXZlVHlwZSE9PUJ0LlRSSUFOR0xFUyYmdC5wcmltaXRpdmVUeXBlIT09QnQuTElORVMmJnQucHJpbWl0aXZlVHlwZSE9PUJ0LlBPSU5UUyl0aHJvdyBuZXcgQigiZ2VvbWV0cnkucHJpbWl0aXZlVHlwZSBtdXN0IGVxdWFsIHRvIFByaW1pdGl2ZVR5cGUuVFJJQU5HTEVTLCBQcmltaXRpdmVUeXBlLkxJTkVTLCBvciBQcmltaXRpdmVUeXBlLlBPSU5UUy4iKTtsZXQgZT1bXSxuPVV0LmNvbXB1dGVOdW1iZXJPZlZlcnRpY2VzKHQpO2lmKGgodC5pbmRpY2VzKSYmbj49TS5TSVhUWV9GT1VSX0tJTE9CWVRFUyl7bGV0IG89W10scj1bXSxpPTAscz1WYih0LmF0dHJpYnV0ZXMpLGY9dC5pbmRpY2VzLHU9Zi5sZW5ndGgsYzt0LnByaW1pdGl2ZVR5cGU9PT1CdC5UUklBTkdMRVM/Yz0zOnQucHJpbWl0aXZlVHlwZT09PUJ0LkxJTkVTP2M9Mjp0LnByaW1pdGl2ZVR5cGU9PT1CdC5QT0lOVFMmJihjPTEpO2ZvcihsZXQgbD0wO2w8dTtsKz1jKXtmb3IobGV0IHA9MDtwPGM7KytwKXtsZXQgZD1mW2wrcF0sbT1vW2RdO2gobSl8fChtPWkrKyxvW2RdPW0sR1Aocyx0LmF0dHJpYnV0ZXMsZCkpLHIucHVzaChtKX1pK2M+PU0uU0lYVFlfRk9VUl9LSUxPQllURVMmJihlLnB1c2gobmV3IFV0KHthdHRyaWJ1dGVzOnMsaW5kaWNlczpyLHByaW1pdGl2ZVR5cGU6dC5wcmltaXRpdmVUeXBlLGJvdW5kaW5nU3BoZXJlOnQuYm91bmRpbmdTcGhlcmUsYm91bmRpbmdTcGhlcmVDVjp0LmJvdW5kaW5nU3BoZXJlQ1Z9KSksbz1bXSxyPVtdLGk9MCxzPVZiKHQuYXR0cmlidXRlcykpfXIubGVuZ3RoIT09MCYmZS5wdXNoKG5ldyBVdCh7YXR0cmlidXRlczpzLGluZGljZXM6cixwcmltaXRpdmVUeXBlOnQucHJpbWl0aXZlVHlwZSxib3VuZGluZ1NwaGVyZTp0LmJvdW5kaW5nU3BoZXJlLGJvdW5kaW5nU3BoZXJlQ1Y6dC5ib3VuZGluZ1NwaGVyZUNWfSkpfWVsc2UgZS5wdXNoKHQpO3JldHVybiBlfTtrYj1uZXcgYSx6UD1uZXcgY3Q7dm8ucHJvamVjdFRvMkQ9ZnVuY3Rpb24odCxlLG4sbyxyKXtpZighaCh0KSl0aHJvdyBuZXcgQigiZ2VvbWV0cnkgaXMgcmVxdWlyZWQuIik7aWYoIWgoZSkpdGhyb3cgbmV3IEIoImF0dHJpYnV0ZU5hbWUgaXMgcmVxdWlyZWQuIik7aWYoIWgobikpdGhyb3cgbmV3IEIoImF0dHJpYnV0ZU5hbWUzRCBpcyByZXF1aXJlZC4iKTtpZighaChvKSl0aHJvdyBuZXcgQigiYXR0cmlidXRlTmFtZTJEIGlzIHJlcXVpcmVkLiIpO2lmKCFoKHQuYXR0cmlidXRlc1tlXSkpdGhyb3cgbmV3IEIoYGdlb21ldHJ5IG11c3QgaGF2ZSBhdHRyaWJ1dGUgbWF0Y2hpbmcgdGhlIGF0dHJpYnV0ZU5hbWUgYXJndW1lbnQ6ICR7ZX0uYCk7aWYodC5hdHRyaWJ1dGVzW2VdLmNvbXBvbmVudERhdGF0eXBlIT09bnQuRE9VQkxFKXRocm93IG5ldyBCKCJUaGUgYXR0cmlidXRlIGNvbXBvbmVudERhdGF0eXBlIG11c3QgYmUgQ29tcG9uZW50RGF0YXR5cGUuRE9VQkxFLiIpO2xldCBpPXQuYXR0cmlidXRlc1tlXTtyPWgocik/cjpuZXcgSm47bGV0IHM9ci5lbGxpcHNvaWQsZj1pLnZhbHVlcyx1PW5ldyBGbG9hdDY0QXJyYXkoZi5sZW5ndGgpLGM9MDtmb3IobGV0IGw9MDtsPGYubGVuZ3RoO2wrPTMpe2xldCBwPWEuZnJvbUFycmF5KGYsbCxrYiksZD1zLmNhcnRlc2lhblRvQ2FydG9ncmFwaGljKHAselApO2lmKCFoKGQpKXRocm93IG5ldyBCKGBDb3VsZCBub3QgcHJvamVjdCBwb2ludCAoJHtwLnh9LCAke3AueX0sICR7cC56fSkgdG8gMkQuYCk7bGV0IG09ci5wcm9qZWN0KGQsa2IpO3VbYysrXT1tLngsdVtjKytdPW0ueSx1W2MrK109bS56fXJldHVybiB0LmF0dHJpYnV0ZXNbbl09aSx0LmF0dHJpYnV0ZXNbb109bmV3IGl0KHtjb21wb25lbnREYXRhdHlwZTpudC5ET1VCTEUsY29tcG9uZW50c1BlckF0dHJpYnV0ZTozLHZhbHVlczp1fSksZGVsZXRlIHQuYXR0cmlidXRlc1tlXSx0fTtIaD17aGlnaDowLGxvdzowfTt2by5lbmNvZGVBdHRyaWJ1dGU9ZnVuY3Rpb24odCxlLG4sbyl7aWYoIWgodCkpdGhyb3cgbmV3IEIoImdlb21ldHJ5IGlzIHJlcXVpcmVkLiIpO2lmKCFoKGUpKXRocm93IG5ldyBCKCJhdHRyaWJ1dGVOYW1lIGlzIHJlcXVpcmVkLiIpO2lmKCFoKG4pKXRocm93IG5ldyBCKCJhdHRyaWJ1dGVIaWdoTmFtZSBpcyByZXF1aXJlZC4iKTtpZighaChvKSl0aHJvdyBuZXcgQigiYXR0cmlidXRlTG93TmFtZSBpcyByZXF1aXJlZC4iKTtpZighaCh0LmF0dHJpYnV0ZXNbZV0pKXRocm93IG5ldyBCKGBnZW9tZXRyeSBtdXN0IGhhdmUgYXR0cmlidXRlIG1hdGNoaW5nIHRoZSBhdHRyaWJ1dGVOYW1lIGFyZ3VtZW50OiAke2V9LmApO2lmKHQuYXR0cmlidXRlc1tlXS5jb21wb25lbnREYXRhdHlwZSE9PW50LkRPVUJMRSl0aHJvdyBuZXcgQigiVGhlIGF0dHJpYnV0ZSBjb21wb25lbnREYXRhdHlwZSBtdXN0IGJlIENvbXBvbmVudERhdGF0eXBlLkRPVUJMRS4iKTtsZXQgcj10LmF0dHJpYnV0ZXNbZV0saT1yLnZhbHVlcyxzPWkubGVuZ3RoLGY9bmV3IEZsb2F0MzJBcnJheShzKSx1PW5ldyBGbG9hdDMyQXJyYXkocyk7Zm9yKGxldCBsPTA7bDxzOysrbClacy5lbmNvZGUoaVtsXSxIaCksZltsXT1IaC5oaWdoLHVbbF09SGgubG93O2xldCBjPXIuY29tcG9uZW50c1BlckF0dHJpYnV0ZTtyZXR1cm4gdC5hdHRyaWJ1dGVzW25dPW5ldyBpdCh7Y29tcG9uZW50RGF0YXR5cGU6bnQuRkxPQVQsY29tcG9uZW50c1BlckF0dHJpYnV0ZTpjLHZhbHVlczpmfSksdC5hdHRyaWJ1dGVzW29dPW5ldyBpdCh7Y29tcG9uZW50RGF0YXR5cGU6bnQuRkxPQVQsY29tcG9uZW50c1BlckF0dHJpYnV0ZTpjLHZhbHVlczp1fSksZGVsZXRlIHQuYXR0cmlidXRlc1tlXSx0fTtWcj1uZXcgYTtHcD1uZXcgc3QsenA9bmV3IFE7dm8udHJhbnNmb3JtVG9Xb3JsZENvb3JkaW5hdGVzPWZ1bmN0aW9uKHQpe2lmKCFoKHQpKXRocm93IG5ldyBCKCJpbnN0YW5jZSBpcyByZXF1aXJlZC4iKTtsZXQgZT10Lm1vZGVsTWF0cml4O2lmKHN0LmVxdWFscyhlLHN0LklERU5USVRZKSlyZXR1cm4gdDtsZXQgbj10Lmdlb21ldHJ5LmF0dHJpYnV0ZXM7cWgoZSxuLnBvc2l0aW9uKSxxaChlLG4ucHJldlBvc2l0aW9uKSxxaChlLG4ubmV4dFBvc2l0aW9uKSwoaChuLm5vcm1hbCl8fGgobi50YW5nZW50KXx8aChuLmJpdGFuZ2VudCkpJiYoc3QuaW52ZXJzZShlLEdwKSxzdC50cmFuc3Bvc2UoR3AsR3ApLHN0LmdldE1hdHJpeDMoR3AsenApLEtoKHpwLG4ubm9ybWFsKSxLaCh6cCxuLnRhbmdlbnQpLEtoKHpwLG4uYml0YW5nZW50KSk7bGV0IG89dC5nZW9tZXRyeS5ib3VuZGluZ1NwaGVyZTtyZXR1cm4gaChvKSYmKHQuZ2VvbWV0cnkuYm91bmRpbmdTcGhlcmU9QXQudHJhbnNmb3JtKG8sZSxvKSksdC5tb2RlbE1hdHJpeD1zdC5jbG9uZShzdC5JREVOVElUWSksdH07SFA9bmV3IGE7dm8uY29tYmluZUluc3RhbmNlcz1mdW5jdGlvbih0KXtpZighaCh0KXx8dC5sZW5ndGg8MSl0aHJvdyBuZXcgQigiaW5zdGFuY2VzIGlzIHJlcXVpcmVkIGFuZCBtdXN0IGhhdmUgbGVuZ3RoIGdyZWF0ZXIgdGhhbiB6ZXJvLiIpO2xldCBlPVtdLG49W10sbz10Lmxlbmd0aDtmb3IobGV0IGk9MDtpPG87KytpKXtsZXQgcz10W2ldO2gocy5nZW9tZXRyeSk/ZS5wdXNoKHMpOmgocy53ZXN0SGVtaXNwaGVyZUdlb21ldHJ5KSYmaChzLmVhc3RIZW1pc3BoZXJlR2VvbWV0cnkpJiZuLnB1c2gocyl9bGV0IHI9W107cmV0dXJuIGUubGVuZ3RoPjAmJnIucHVzaChXaChlLCJnZW9tZXRyeSIpKSxuLmxlbmd0aD4wJiYoci5wdXNoKFdoKG4sIndlc3RIZW1pc3BoZXJlR2VvbWV0cnkiKSksci5wdXNoKFdoKG4sImVhc3RIZW1pc3BoZXJlR2VvbWV0cnkiKSkpLHJ9O0FyPW5ldyBhLHdmPW5ldyBhLG5hPW5ldyBhLG9hPW5ldyBhO3ZvLmNvbXB1dGVOb3JtYWw9ZnVuY3Rpb24odCl7aWYoIWgodCkpdGhyb3cgbmV3IEIoImdlb21ldHJ5IGlzIHJlcXVpcmVkLiIpO2lmKCFoKHQuYXR0cmlidXRlcy5wb3NpdGlvbil8fCFoKHQuYXR0cmlidXRlcy5wb3NpdGlvbi52YWx1ZXMpKXRocm93IG5ldyBCKCJnZW9tZXRyeS5hdHRyaWJ1dGVzLnBvc2l0aW9uLnZhbHVlcyBpcyByZXF1aXJlZC4iKTtpZighaCh0LmluZGljZXMpKXRocm93IG5ldyBCKCJnZW9tZXRyeS5pbmRpY2VzIGlzIHJlcXVpcmVkLiIpO2lmKHQuaW5kaWNlcy5sZW5ndGg8Mnx8dC5pbmRpY2VzLmxlbmd0aCUzIT09MCl0aHJvdyBuZXcgQigiZ2VvbWV0cnkuaW5kaWNlcyBsZW5ndGggbXVzdCBiZSBncmVhdGVyIHRoYW4gMCBhbmQgYmUgYSBtdWx0aXBsZSBvZiAzLiIpO2lmKHQucHJpbWl0aXZlVHlwZSE9PUJ0LlRSSUFOR0xFUyl0aHJvdyBuZXcgQigiZ2VvbWV0cnkucHJpbWl0aXZlVHlwZSBtdXN0IGJlIFByaW1pdGl2ZVR5cGUuVFJJQU5HTEVTLiIpO2xldCBlPXQuaW5kaWNlcyxuPXQuYXR0cmlidXRlcyxvPW4ucG9zaXRpb24udmFsdWVzLHI9bi5wb3NpdGlvbi52YWx1ZXMubGVuZ3RoLzMsaT1lLmxlbmd0aCxzPW5ldyBBcnJheShyKSxmPW5ldyBBcnJheShpLzMpLHU9bmV3IEFycmF5KGkpLGM7Zm9yKGM9MDtjPHI7YysrKXNbY109e2luZGV4T2Zmc2V0OjAsY291bnQ6MCxjdXJyZW50Q291bnQ6MH07bGV0IGw9MDtmb3IoYz0wO2M8aTtjKz0zKXtsZXQgXz1lW2NdLGc9ZVtjKzFdLGI9ZVtjKzJdLFQ9XyozLE89ZyozLEU9YiozO3dmLng9b1tUXSx3Zi55PW9bVCsxXSx3Zi56PW9bVCsyXSxuYS54PW9bT10sbmEueT1vW08rMV0sbmEuej1vW08rMl0sb2EueD1vW0VdLG9hLnk9b1tFKzFdLG9hLno9b1tFKzJdLHNbX10uY291bnQrKyxzW2ddLmNvdW50Kyssc1tiXS5jb3VudCsrLGEuc3VidHJhY3QobmEsd2YsbmEpLGEuc3VidHJhY3Qob2Esd2Ysb2EpLGZbbF09YS5jcm9zcyhuYSxvYSxuZXcgYSksbCsrfWxldCBwPTA7Zm9yKGM9MDtjPHI7YysrKXNbY10uaW5kZXhPZmZzZXQrPXAscCs9c1tjXS5jb3VudDtsPTA7bGV0IGQ7Zm9yKGM9MDtjPGk7Yys9Myl7ZD1zW2VbY11dO2xldCBfPWQuaW5kZXhPZmZzZXQrZC5jdXJyZW50Q291bnQ7dVtfXT1sLGQuY3VycmVudENvdW50KyssZD1zW2VbYysxXV0sXz1kLmluZGV4T2Zmc2V0K2QuY3VycmVudENvdW50LHVbX109bCxkLmN1cnJlbnRDb3VudCsrLGQ9c1tlW2MrMl1dLF89ZC5pbmRleE9mZnNldCtkLmN1cnJlbnRDb3VudCx1W19dPWwsZC5jdXJyZW50Q291bnQrKyxsKyt9bGV0IG09bmV3IEZsb2F0MzJBcnJheShyKjMpO2ZvcihjPTA7YzxyO2MrKyl7bGV0IF89YyozO2lmKGQ9c1tjXSxhLmNsb25lKGEuWkVSTyxBciksZC5jb3VudD4wKXtmb3IobD0wO2w8ZC5jb3VudDtsKyspYS5hZGQoQXIsZlt1W2QuaW5kZXhPZmZzZXQrbF1dLEFyKTthLmVxdWFsc0Vwc2lsb24oYS5aRVJPLEFyLE0uRVBTSUxPTjEwKSYmYS5jbG9uZShmW3VbZC5pbmRleE9mZnNldF1dLEFyKX1hLmVxdWFsc0Vwc2lsb24oYS5aRVJPLEFyLE0uRVBTSUxPTjEwKSYmKEFyLno9MSksYS5ub3JtYWxpemUoQXIsQXIpLG1bX109QXIueCxtW18rMV09QXIueSxtW18rMl09QXIuen1yZXR1cm4gdC5hdHRyaWJ1dGVzLm5vcm1hbD1uZXcgaXQoe2NvbXBvbmVudERhdGF0eXBlOm50LkZMT0FULGNvbXBvbmVudHNQZXJBdHRyaWJ1dGU6Myx2YWx1ZXM6bX0pLHR9O3FQPW5ldyBhLEdiPW5ldyBhLEtQPW5ldyBhO3ZvLmNvbXB1dGVUYW5nZW50QW5kQml0YW5nZW50PWZ1bmN0aW9uKHQpe2lmKCFoKHQpKXRocm93IG5ldyBCKCJnZW9tZXRyeSBpcyByZXF1aXJlZC4iKTtsZXQgZT10LmF0dHJpYnV0ZXMsbj10LmluZGljZXM7aWYoIWgoZS5wb3NpdGlvbil8fCFoKGUucG9zaXRpb24udmFsdWVzKSl0aHJvdyBuZXcgQigiZ2VvbWV0cnkuYXR0cmlidXRlcy5wb3NpdGlvbi52YWx1ZXMgaXMgcmVxdWlyZWQuIik7aWYoIWgoZS5ub3JtYWwpfHwhaChlLm5vcm1hbC52YWx1ZXMpKXRocm93IG5ldyBCKCJnZW9tZXRyeS5hdHRyaWJ1dGVzLm5vcm1hbC52YWx1ZXMgaXMgcmVxdWlyZWQuIik7aWYoIWgoZS5zdCl8fCFoKGUuc3QudmFsdWVzKSl0aHJvdyBuZXcgQigiZ2VvbWV0cnkuYXR0cmlidXRlcy5zdC52YWx1ZXMgaXMgcmVxdWlyZWQuIik7aWYoIWgobikpdGhyb3cgbmV3IEIoImdlb21ldHJ5LmluZGljZXMgaXMgcmVxdWlyZWQuIik7aWYobi5sZW5ndGg8Mnx8bi5sZW5ndGglMyE9PTApdGhyb3cgbmV3IEIoImdlb21ldHJ5LmluZGljZXMgbGVuZ3RoIG11c3QgYmUgZ3JlYXRlciB0aGFuIDAgYW5kIGJlIGEgbXVsdGlwbGUgb2YgMy4iKTtpZih0LnByaW1pdGl2ZVR5cGUhPT1CdC5UUklBTkdMRVMpdGhyb3cgbmV3IEIoImdlb21ldHJ5LnByaW1pdGl2ZVR5cGUgbXVzdCBiZSBQcmltaXRpdmVUeXBlLlRSSUFOR0xFUy4iKTtsZXQgbz10LmF0dHJpYnV0ZXMucG9zaXRpb24udmFsdWVzLHI9dC5hdHRyaWJ1dGVzLm5vcm1hbC52YWx1ZXMsaT10LmF0dHJpYnV0ZXMuc3QudmFsdWVzLHM9dC5hdHRyaWJ1dGVzLnBvc2l0aW9uLnZhbHVlcy5sZW5ndGgvMyxmPW4ubGVuZ3RoLHU9bmV3IEFycmF5KHMqMyksYztmb3IoYz0wO2M8dS5sZW5ndGg7YysrKXVbY109MDtsZXQgbCxwLGQ7Zm9yKGM9MDtjPGY7Yys9Myl7bGV0IGc9bltjXSxiPW5bYysxXSxUPW5bYysyXTtsPWcqMyxwPWIqMyxkPVQqMztsZXQgTz1nKjIsRT1iKjIsdz1UKjIsQz1vW2xdLE49b1tsKzFdLEk9b1tsKzJdLEQ9aVtPXSx2PWlbTysxXSxMPWlbRSsxXS12LFU9aVt3KzFdLXYsQT0xLygoaVtFXS1EKSpVLShpW3ddLUQpKkwpLFM9KFUqKG9bcF0tQyktTCoob1tkXS1DKSkqQSxQPShVKihvW3ArMV0tTiktTCoob1tkKzFdLU4pKSpBLEY9KFUqKG9bcCsyXS1JKS1MKihvW2QrMl0tSSkpKkE7dVtsXSs9Uyx1W2wrMV0rPVAsdVtsKzJdKz1GLHVbcF0rPVMsdVtwKzFdKz1QLHVbcCsyXSs9Rix1W2RdKz1TLHVbZCsxXSs9UCx1W2QrMl0rPUZ9bGV0IG09bmV3IEZsb2F0MzJBcnJheShzKjMpLF89bmV3IEZsb2F0MzJBcnJheShzKjMpO2ZvcihjPTA7YzxzO2MrKyl7bD1jKjMscD1sKzEsZD1sKzI7bGV0IGc9YS5mcm9tQXJyYXkocixsLHFQKSxiPWEuZnJvbUFycmF5KHUsbCxLUCksVD1hLmRvdChnLGIpO2EubXVsdGlwbHlCeVNjYWxhcihnLFQsR2IpLGEubm9ybWFsaXplKGEuc3VidHJhY3QoYixHYixiKSxiKSxtW2xdPWIueCxtW3BdPWIueSxtW2RdPWIueixhLm5vcm1hbGl6ZShhLmNyb3NzKGcsYixiKSxiKSxfW2xdPWIueCxfW3BdPWIueSxfW2RdPWIuen1yZXR1cm4gdC5hdHRyaWJ1dGVzLnRhbmdlbnQ9bmV3IGl0KHtjb21wb25lbnREYXRhdHlwZTpudC5GTE9BVCxjb21wb25lbnRzUGVyQXR0cmlidXRlOjMsdmFsdWVzOm19KSx0LmF0dHJpYnV0ZXMuYml0YW5nZW50PW5ldyBpdCh7Y29tcG9uZW50RGF0YXR5cGU6bnQuRkxPQVQsY29tcG9uZW50c1BlckF0dHJpYnV0ZTozLHZhbHVlczpffSksdH07T2Y9bmV3IHR0LFVyPW5ldyBhLHpiPW5ldyBhLGpiPW5ldyBhLGpwPW5ldyB0dDt2by5jb21wcmVzc1ZlcnRpY2VzPWZ1bmN0aW9uKHQpe2lmKCFoKHQpKXRocm93IG5ldyBCKCJnZW9tZXRyeSBpcyByZXF1aXJlZC4iKTtsZXQgZT10LmF0dHJpYnV0ZXMuZXh0cnVkZURpcmVjdGlvbixuLG87aWYoaChlKSl7bGV0IE49ZS52YWx1ZXM7bz1OLmxlbmd0aC8zO2xldCBJPW5ldyBGbG9hdDMyQXJyYXkobyoyKSxEPTA7Zm9yKG49MDtuPG87KytuKXtpZihhLmZyb21BcnJheShOLG4qMyxVciksYS5lcXVhbHMoVXIsYS5aRVJPKSl7RCs9Mjtjb250aW51ZX1qcD1ubi5vY3RFbmNvZGVJblJhbmdlKFVyLDY1NTM1LGpwKSxJW0QrK109anAueCxJW0QrK109anAueX1yZXR1cm4gdC5hdHRyaWJ1dGVzLmNvbXByZXNzZWRBdHRyaWJ1dGVzPW5ldyBpdCh7Y29tcG9uZW50RGF0YXR5cGU6bnQuRkxPQVQsY29tcG9uZW50c1BlckF0dHJpYnV0ZToyLHZhbHVlczpJfSksZGVsZXRlIHQuYXR0cmlidXRlcy5leHRydWRlRGlyZWN0aW9uLHR9bGV0IHI9dC5hdHRyaWJ1dGVzLm5vcm1hbCxpPXQuYXR0cmlidXRlcy5zdCxzPWgociksZj1oKGkpO2lmKCFzJiYhZilyZXR1cm4gdDtsZXQgdT10LmF0dHJpYnV0ZXMudGFuZ2VudCxjPXQuYXR0cmlidXRlcy5iaXRhbmdlbnQsbD1oKHUpLHA9aChjKSxkLG0sXyxnO3MmJihkPXIudmFsdWVzKSxmJiYobT1pLnZhbHVlcyksbCYmKF89dS52YWx1ZXMpLHAmJihnPWMudmFsdWVzKSxvPShzP2QubGVuZ3RoOm0ubGVuZ3RoKS8ocz8zOjIpO2xldCBPPW8sRT1mJiZzPzI6MTtFKz1sfHxwPzE6MCxPKj1FO2xldCB3PW5ldyBGbG9hdDMyQXJyYXkoTyksQz0wO2ZvcihuPTA7bjxvOysrbil7ZiYmKHR0LmZyb21BcnJheShtLG4qMixPZiksd1tDKytdPW5uLmNvbXByZXNzVGV4dHVyZUNvb3JkaW5hdGVzKE9mKSk7bGV0IE49biozO3MmJmgoXykmJmgoZyk/KGEuZnJvbUFycmF5KGQsTixVciksYS5mcm9tQXJyYXkoXyxOLHpiKSxhLmZyb21BcnJheShnLE4samIpLG5uLm9jdFBhY2soVXIsemIsamIsT2YpLHdbQysrXT1PZi54LHdbQysrXT1PZi55KToocyYmKGEuZnJvbUFycmF5KGQsTixVciksd1tDKytdPW5uLm9jdEVuY29kZUZsb2F0KFVyKSksbCYmKGEuZnJvbUFycmF5KF8sTixVciksd1tDKytdPW5uLm9jdEVuY29kZUZsb2F0KFVyKSkscCYmKGEuZnJvbUFycmF5KGcsTixVciksd1tDKytdPW5uLm9jdEVuY29kZUZsb2F0KFVyKSkpfXJldHVybiB0LmF0dHJpYnV0ZXMuY29tcHJlc3NlZEF0dHJpYnV0ZXM9bmV3IGl0KHtjb21wb25lbnREYXRhdHlwZTpudC5GTE9BVCxjb21wb25lbnRzUGVyQXR0cmlidXRlOkUsdmFsdWVzOnd9KSxzJiZkZWxldGUgdC5hdHRyaWJ1dGVzLm5vcm1hbCxmJiZkZWxldGUgdC5hdHRyaWJ1dGVzLnN0LHAmJmRlbGV0ZSB0LmF0dHJpYnV0ZXMuYml0YW5nZW50LGwmJmRlbGV0ZSB0LmF0dHJpYnV0ZXMudGFuZ2VudCx0fTtIYj1uZXcgYTtlYz1uZXcgYSxuYz1uZXcgYSxvYz1uZXcgYSxyYz1uZXcgYSxYaD17cG9zaXRpb25zOm5ldyBBcnJheSg3KSxpbmRpY2VzOm5ldyBBcnJheSgzKjMpfTtuTT1KaChoZSw0KSxLcD1KaChhLDMpLFpiPUpoKHR0LDIpLG9NPWZ1bmN0aW9uKHQsZSxuLG8scixpLHMpe2xldCBmPXJbdF0qby54LHU9cltlXSpvLnksYz1yW25dKm8uejtpW3NdPWYrdStjPk0uRVBTSUxPTjY/MTowfSxFZj1uZXcgYSxZaD1uZXcgYSwkaD1uZXcgYSxyTT1uZXcgYTtzTT17cG9zaXRpb246ITAsbm9ybWFsOiEwLGJpdGFuZ2VudDohMCx0YW5nZW50OiEwLHN0OiEwLGV4dHJ1ZGVEaXJlY3Rpb246ITAsYXBwbHlPZmZzZXQ6ITB9O1FiPW9uLmZyb21Qb2ludE5vcm1hbChhLlpFUk8sYS5VTklUX1kpLGNNPW5ldyBhLGFNPW5ldyBhO1hiPW5ldyB0dCxmTT1uZXcgdHQsSmI9bmV3IGEsdFQ9bmV3IGEsWmg9bmV3IGEsdU09bmV3IGEsbE09bmV3IGEscE09bmV3IGEsWWI9bmV3IGhlO2RNPTUqTS5FUFNJTE9OOSxxcD1NLkVQU0lMT042O3ZvLnNwbGl0TG9uZ2l0dWRlPWZ1bmN0aW9uKHQpe2lmKCFoKHQpKXRocm93IG5ldyBCKCJpbnN0YW5jZSBpcyByZXF1aXJlZC4iKTtsZXQgZT10Lmdlb21ldHJ5LG49ZS5ib3VuZGluZ1NwaGVyZTtpZihoKG4pJiYobi5jZW50ZXIueC1uLnJhZGl1cz4wfHxBdC5pbnRlcnNlY3RQbGFuZShuLG9uLk9SSUdJTl9aWF9QTEFORSkhPT1Tbi5JTlRFUlNFQ1RJTkcpKXJldHVybiB0O2lmKGUuZ2VvbWV0cnlUeXBlIT09TWkuTk9ORSlzd2l0Y2goZS5nZW9tZXRyeVR5cGUpe2Nhc2UgTWkuUE9MWUxJTkVTOm1NKHQpO2JyZWFrO2Nhc2UgTWkuVFJJQU5HTEVTOktiKHQpO2JyZWFrO2Nhc2UgTWkuTElORVM6V2IodCk7YnJlYWt9ZWxzZSBKUChlKSxlLnByaW1pdGl2ZVR5cGU9PT1CdC5UUklBTkdMRVM/S2IodCk6ZS5wcmltaXRpdmVUeXBlPT09QnQuTElORVMmJldiKHQpO3JldHVybiB0fTtWZT12b30pO2Z1bmN0aW9uIFJmKHQsZSxuKXt0PXgodCwwKSxlPXgoZSwwKSxuPXgobiwwKSx0aGlzLnZhbHVlPW5ldyBGbG9hdDMyQXJyYXkoW3QsZSxuXSl9dmFyIGVULG5UPVooKCk9PntYdCgpO0ZlKCk7SXQoKTtmdCgpO09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKFJmLnByb3RvdHlwZSx7Y29tcG9uZW50RGF0YXR5cGU6e2dldDpmdW5jdGlvbigpe3JldHVybiBudC5GTE9BVH19LGNvbXBvbmVudHNQZXJBdHRyaWJ1dGU6e2dldDpmdW5jdGlvbigpe3JldHVybiAzfX0sbm9ybWFsaXplOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4hMX19fSk7UmYuZnJvbUNhcnRlc2lhbjM9ZnVuY3Rpb24odCl7cmV0dXJuIHkuZGVmaW5lZCgib2Zmc2V0Iix0KSxuZXcgUmYodC54LHQueSx0LnopfTtSZi50b1ZhbHVlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHkuZGVmaW5lZCgib2Zmc2V0Iix0KSxoKGUpfHwoZT1uZXcgRmxvYXQzMkFycmF5KFt0LngsdC55LHQuel0pKSxlWzBdPXQueCxlWzFdPXQueSxlWzJdPXQueixlfTtlVD1SZn0pO2Z1bmN0aW9uICRvKHQpe3RoaXMuX2VsbGlwc29pZD14KHQsJC5XR1M4NCksdGhpcy5fc2VtaW1ham9yQXhpcz10aGlzLl9lbGxpcHNvaWQubWF4aW11bVJhZGl1cyx0aGlzLl9vbmVPdmVyU2VtaW1ham9yQXhpcz0xL3RoaXMuX3NlbWltYWpvckF4aXN9dmFyIG5vLGljPVooKCk9PntGdCgpO0llKCk7SXQoKTtmdCgpO0h0KCk7WnQoKTtXdCgpO09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKCRvLnByb3RvdHlwZSx7ZWxsaXBzb2lkOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZWxsaXBzb2lkfX19KTskby5tZXJjYXRvckFuZ2xlVG9HZW9kZXRpY0xhdGl0dWRlPWZ1bmN0aW9uKHQpe3JldHVybiBNLlBJX09WRVJfVFdPLTIqTWF0aC5hdGFuKE1hdGguZXhwKC10KSl9OyRvLmdlb2RldGljTGF0aXR1ZGVUb01lcmNhdG9yQW5nbGU9ZnVuY3Rpb24odCl7dD4kby5NYXhpbXVtTGF0aXR1ZGU/dD0kby5NYXhpbXVtTGF0aXR1ZGU6dDwtJG8uTWF4aW11bUxhdGl0dWRlJiYodD0tJG8uTWF4aW11bUxhdGl0dWRlKTtsZXQgZT1NYXRoLnNpbih0KTtyZXR1cm4gLjUqTWF0aC5sb2coKDErZSkvKDEtZSkpfTskby5NYXhpbXVtTGF0aXR1ZGU9JG8ubWVyY2F0b3JBbmdsZVRvR2VvZGV0aWNMYXRpdHVkZShNYXRoLlBJKTskby5wcm90b3R5cGUucHJvamVjdD1mdW5jdGlvbih0LGUpe2xldCBuPXRoaXMuX3NlbWltYWpvckF4aXMsbz10LmxvbmdpdHVkZSpuLHI9JG8uZ2VvZGV0aWNMYXRpdHVkZVRvTWVyY2F0b3JBbmdsZSh0LmxhdGl0dWRlKSpuLGk9dC5oZWlnaHQ7cmV0dXJuIGgoZSk/KGUueD1vLGUueT1yLGUuej1pLGUpOm5ldyBhKG8scixpKX07JG8ucHJvdG90eXBlLnVucHJvamVjdD1mdW5jdGlvbih0LGUpe2lmKCFoKHQpKXRocm93IG5ldyBCKCJjYXJ0ZXNpYW4gaXMgcmVxdWlyZWQiKTtsZXQgbj10aGlzLl9vbmVPdmVyU2VtaW1ham9yQXhpcyxvPXQueCpuLHI9JG8ubWVyY2F0b3JBbmdsZVRvR2VvZGV0aWNMYXRpdHVkZSh0LnkqbiksaT10Lno7cmV0dXJuIGgoZSk/KGUubG9uZ2l0dWRlPW8sZS5sYXRpdHVkZT1yLGUuaGVpZ2h0PWksZSk6bmV3IGN0KG8scixpKX07bm89JG99KTtmdW5jdGlvbiBoTSh0LGUsbil7bGV0IG89IW4scj10Lmxlbmd0aCxpO2lmKCFvJiZyPjEpe2xldCBzPXRbMF0ubW9kZWxNYXRyaXg7Zm9yKGk9MTtpPHI7KytpKWlmKCFzdC5lcXVhbHMocyx0W2ldLm1vZGVsTWF0cml4KSl7bz0hMDticmVha319aWYobylmb3IoaT0wO2k8cjsrK2kpaCh0W2ldLmdlb21ldHJ5KSYmVmUudHJhbnNmb3JtVG9Xb3JsZENvb3JkaW5hdGVzKHRbaV0pO2Vsc2Ugc3QubXVsdGlwbHlUcmFuc2Zvcm1hdGlvbihlLHRbMF0ubW9kZWxNYXRyaXgsZSl9ZnVuY3Rpb24gdDAodCxlKXtsZXQgbj10LmF0dHJpYnV0ZXMsbz1uLnBvc2l0aW9uLHI9by52YWx1ZXMubGVuZ3RoL28uY29tcG9uZW50c1BlckF0dHJpYnV0ZTtuLmJhdGNoSWQ9bmV3IGl0KHtjb21wb25lbnREYXRhdHlwZTpudC5GTE9BVCxjb21wb25lbnRzUGVyQXR0cmlidXRlOjEsdmFsdWVzOm5ldyBGbG9hdDMyQXJyYXkocil9KTtsZXQgaT1uLmJhdGNoSWQudmFsdWVzO2ZvcihsZXQgcz0wO3M8cjsrK3MpaVtzXT1lfWZ1bmN0aW9uIF9NKHQpe2xldCBlPXQubGVuZ3RoO2ZvcihsZXQgbj0wO248ZTsrK24pe2xldCBvPXRbbl07aChvLmdlb21ldHJ5KT90MChvLmdlb21ldHJ5LG4pOmgoby53ZXN0SGVtaXNwaGVyZUdlb21ldHJ5KSYmaChvLmVhc3RIZW1pc3BoZXJlR2VvbWV0cnkpJiYodDAoby53ZXN0SGVtaXNwaGVyZUdlb21ldHJ5LG4pLHQwKG8uZWFzdEhlbWlzcGhlcmVHZW9tZXRyeSxuKSl9fWZ1bmN0aW9uIHlNKHQpe2xldCBlPXQuaW5zdGFuY2VzLG49dC5wcm9qZWN0aW9uLG89dC5lbGVtZW50SW5kZXhVaW50U3VwcG9ydGVkLHI9dC5zY2VuZTNET25seSxpPXQudmVydGV4Q2FjaGVPcHRpbWl6ZSxzPXQuY29tcHJlc3NWZXJ0aWNlcyxmPXQubW9kZWxNYXRyaXgsdSxjLGwscD1lLmxlbmd0aDtmb3IodT0wO3U8cDsrK3UpaWYoaChlW3VdLmdlb21ldHJ5KSl7bD1lW3VdLmdlb21ldHJ5LnByaW1pdGl2ZVR5cGU7YnJlYWt9Zm9yKHU9MTt1PHA7Kyt1KWlmKGgoZVt1XS5nZW9tZXRyeSkmJmVbdV0uZ2VvbWV0cnkucHJpbWl0aXZlVHlwZSE9PWwpdGhyb3cgbmV3IEIoIkFsbCBpbnN0YW5jZSBnZW9tZXRyaWVzIG11c3QgaGF2ZSB0aGUgc2FtZSBwcmltaXRpdmVUeXBlLiIpO2lmKGhNKGUsZixyKSwhcilmb3IodT0wO3U8cDsrK3UpaChlW3VdLmdlb21ldHJ5KSYmVmUuc3BsaXRMb25naXR1ZGUoZVt1XSk7aWYoX00oZSksaSlmb3IodT0wO3U8cDsrK3Upe2xldCBtPWVbdV07aChtLmdlb21ldHJ5KT8oVmUucmVvcmRlckZvclBvc3RWZXJ0ZXhDYWNoZShtLmdlb21ldHJ5KSxWZS5yZW9yZGVyRm9yUHJlVmVydGV4Q2FjaGUobS5nZW9tZXRyeSkpOmgobS53ZXN0SGVtaXNwaGVyZUdlb21ldHJ5KSYmaChtLmVhc3RIZW1pc3BoZXJlR2VvbWV0cnkpJiYoVmUucmVvcmRlckZvclBvc3RWZXJ0ZXhDYWNoZShtLndlc3RIZW1pc3BoZXJlR2VvbWV0cnkpLFZlLnJlb3JkZXJGb3JQcmVWZXJ0ZXhDYWNoZShtLndlc3RIZW1pc3BoZXJlR2VvbWV0cnkpLFZlLnJlb3JkZXJGb3JQb3N0VmVydGV4Q2FjaGUobS5lYXN0SGVtaXNwaGVyZUdlb21ldHJ5KSxWZS5yZW9yZGVyRm9yUHJlVmVydGV4Q2FjaGUobS5lYXN0SGVtaXNwaGVyZUdlb21ldHJ5KSl9bGV0IGQ9VmUuY29tYmluZUluc3RhbmNlcyhlKTtmb3IocD1kLmxlbmd0aCx1PTA7dTxwOysrdSl7Yz1kW3VdO2xldCBtPWMuYXR0cmlidXRlcztpZihyKWZvcihsZXQgXyBpbiBtKW0uaGFzT3duUHJvcGVydHkoXykmJm1bX10uY29tcG9uZW50RGF0YXR5cGU9PT1udC5ET1VCTEUmJlZlLmVuY29kZUF0dHJpYnV0ZShjLF8sYCR7X30zREhpZ2hgLGAke199M0RMb3dgKTtlbHNlIGZvcihsZXQgXyBpbiBtKWlmKG0uaGFzT3duUHJvcGVydHkoXykmJm1bX10uY29tcG9uZW50RGF0YXR5cGU9PT1udC5ET1VCTEUpe2xldCBnPWAke199M0RgLGI9YCR7X30yRGA7VmUucHJvamVjdFRvMkQoYyxfLGcsYixuKSxoKGMuYm91bmRpbmdTcGhlcmUpJiZfPT09InBvc2l0aW9uIiYmKGMuYm91bmRpbmdTcGhlcmVDVj1BdC5mcm9tVmVydGljZXMoYy5hdHRyaWJ1dGVzLnBvc2l0aW9uMkQudmFsdWVzKSksVmUuZW5jb2RlQXR0cmlidXRlKGMsZyxgJHtnfUhpZ2hgLGAke2d9TG93YCksVmUuZW5jb2RlQXR0cmlidXRlKGMsYixgJHtifUhpZ2hgLGAke2J9TG93YCl9cyYmVmUuY29tcHJlc3NWZXJ0aWNlcyhjKX1pZighbyl7bGV0IG09W107Zm9yKHA9ZC5sZW5ndGgsdT0wO3U8cDsrK3UpYz1kW3VdLG09bS5jb25jYXQoVmUuZml0VG9VbnNpZ25lZFNob3J0SW5kaWNlcyhjKSk7ZD1tfXJldHVybiBkfWZ1bmN0aW9uIGUwKHQsZSxuLG8pe2xldCByLGkscyxmPW8ubGVuZ3RoLTE7aWYoZj49MCl7bGV0IGM9b1tmXTtyPWMub2Zmc2V0K2MuY291bnQscz1jLmluZGV4LGk9bltzXS5pbmRpY2VzLmxlbmd0aH1lbHNlIHI9MCxzPTAsaT1uW3NdLmluZGljZXMubGVuZ3RoO2xldCB1PXQubGVuZ3RoO2ZvcihsZXQgYz0wO2M8dTsrK2Mpe2xldCBwPXRbY11bZV07aWYoIWgocCkpY29udGludWU7bGV0IGQ9cC5pbmRpY2VzLmxlbmd0aDtyK2Q+aSYmKHI9MCxpPW5bKytzXS5pbmRpY2VzLmxlbmd0aCksby5wdXNoKHtpbmRleDpzLG9mZnNldDpyLGNvdW50OmR9KSxyKz1kfX1mdW5jdGlvbiBnTSh0LGUpe2xldCBuPVtdO3JldHVybiBlMCh0LCJnZW9tZXRyeSIsZSxuKSxlMCh0LCJ3ZXN0SGVtaXNwaGVyZUdlb21ldHJ5IixlLG4pLGUwKHQsImVhc3RIZW1pc3BoZXJlR2VvbWV0cnkiLGUsbiksbn1mdW5jdGlvbiBBTSh0LGUpe2xldCBuPXQuYXR0cmlidXRlcztmb3IobGV0IG8gaW4gbilpZihuLmhhc093blByb3BlcnR5KG8pKXtsZXQgcj1uW29dO2gocikmJmgoci52YWx1ZXMpJiZlLnB1c2goci52YWx1ZXMuYnVmZmVyKX1oKHQuaW5kaWNlcykmJmUucHVzaCh0LmluZGljZXMuYnVmZmVyKX1mdW5jdGlvbiBiTSh0LGUpe2xldCBuPXQubGVuZ3RoO2ZvcihsZXQgbz0wO288bjsrK28pQU0odFtvXSxlKX1mdW5jdGlvbiBUTSh0KXtsZXQgZT0xLG49dC5sZW5ndGg7Zm9yKGxldCBvPTA7bzxuO28rKyl7bGV0IHI9dFtvXTtpZigrK2UsIWgocikpY29udGludWU7bGV0IGk9ci5hdHRyaWJ1dGVzO2UrPTcrMipBdC5wYWNrZWRMZW5ndGgrKGgoci5pbmRpY2VzKT9yLmluZGljZXMubGVuZ3RoOjApO2ZvcihsZXQgcyBpbiBpKWlmKGkuaGFzT3duUHJvcGVydHkocykmJmgoaVtzXSkpe2xldCBmPWlbc107ZSs9NStmLnZhbHVlcy5sZW5ndGh9fXJldHVybiBlfWZ1bmN0aW9uIHdNKHQsZSl7bGV0IG49dC5sZW5ndGgsbz1uZXcgRmxvYXQ2NEFycmF5KDErbioxOSkscj0wO29bcisrXT1uO2ZvcihsZXQgaT0wO2k8bjtpKyspe2xldCBzPXRbaV07aWYoc3QucGFjayhzLm1vZGVsTWF0cml4LG8scikscis9c3QucGFja2VkTGVuZ3RoLGgocy5hdHRyaWJ1dGVzKSYmaChzLmF0dHJpYnV0ZXMub2Zmc2V0KSl7bGV0IGY9cy5hdHRyaWJ1dGVzLm9mZnNldC52YWx1ZTtvW3JdPWZbMF0sb1tyKzFdPWZbMV0sb1tyKzJdPWZbMl19cis9M31yZXR1cm4gZS5wdXNoKG8uYnVmZmVyKSxvfWZ1bmN0aW9uIE9NKHQpe2xldCBlPXQsbj1uZXcgQXJyYXkoZVswXSksbz0wLHI9MTtmb3IoO3I8ZS5sZW5ndGg7KXtsZXQgaT1zdC51bnBhY2soZSxyKSxzO3IrPXN0LnBhY2tlZExlbmd0aCxoKGVbcl0pJiYocz17b2Zmc2V0Om5ldyBlVChlW3JdLGVbcisxXSxlW3IrMl0pfSkscis9MyxuW28rK109e21vZGVsTWF0cml4OmksYXR0cmlidXRlczpzfX1yZXR1cm4gbn1mdW5jdGlvbiBvVCh0KXtsZXQgZT10Lmxlbmd0aCxuPTErKEF0LnBhY2tlZExlbmd0aCsxKSplLG89bmV3IEZsb2F0MzJBcnJheShuKSxyPTA7b1tyKytdPWU7Zm9yKGxldCBpPTA7aTxlOysraSl7bGV0IHM9dFtpXTtoKHMpPyhvW3IrK109MSxBdC5wYWNrKHRbaV0sbyxyKSk6b1tyKytdPTAscis9QXQucGFja2VkTGVuZ3RofXJldHVybiBvfWZ1bmN0aW9uIHJUKHQpe2xldCBlPW5ldyBBcnJheSh0WzBdKSxuPTAsbz0xO2Zvcig7bzx0Lmxlbmd0aDspdFtvKytdPT09MSYmKGVbbl09QXQudW5wYWNrKHQsbykpLCsrbixvKz1BdC5wYWNrZWRMZW5ndGg7cmV0dXJuIGV9dmFyIElpLHNhLG4wPVooKCk9Pnt2ZSgpO0ZlKCk7SXQoKTtmdCgpO0h0KCk7WnQoKTtTaSgpO1hlKCk7WWUoKTthbigpO3NpKCk7JGUoKTtVbigpO25UKCk7aWMoKTtJaT17fTtJaS5jb21iaW5lR2VvbWV0cnk9ZnVuY3Rpb24odCl7bGV0IGUsbixvPXQuaW5zdGFuY2VzLHI9by5sZW5ndGgsaSxzLGY9ITE7cj4wJiYoZT15TSh0KSxlLmxlbmd0aD4wJiYobj1WZS5jcmVhdGVBdHRyaWJ1dGVMb2NhdGlvbnMoZVswXSksdC5jcmVhdGVQaWNrT2Zmc2V0cyYmKGk9Z00obyxlKSkpLGgob1swXS5hdHRyaWJ1dGVzKSYmaChvWzBdLmF0dHJpYnV0ZXMub2Zmc2V0KSYmKHM9bmV3IEFycmF5KHIpLGY9ITApKTtsZXQgdT1uZXcgQXJyYXkociksYz1uZXcgQXJyYXkocik7Zm9yKGxldCBsPTA7bDxyOysrbCl7bGV0IHA9b1tsXSxkPXAuZ2VvbWV0cnk7aChkKSYmKHVbbF09ZC5ib3VuZGluZ1NwaGVyZSxjW2xdPWQuYm91bmRpbmdTcGhlcmVDVixmJiYoc1tsXT1wLmdlb21ldHJ5Lm9mZnNldEF0dHJpYnV0ZSkpO2xldCBtPXAuZWFzdEhlbWlzcGhlcmVHZW9tZXRyeSxfPXAud2VzdEhlbWlzcGhlcmVHZW9tZXRyeTtoKG0pJiZoKF8pJiYoaChtLmJvdW5kaW5nU3BoZXJlKSYmaChfLmJvdW5kaW5nU3BoZXJlKSYmKHVbbF09QXQudW5pb24obS5ib3VuZGluZ1NwaGVyZSxfLmJvdW5kaW5nU3BoZXJlKSksaChtLmJvdW5kaW5nU3BoZXJlQ1YpJiZoKF8uYm91bmRpbmdTcGhlcmVDVikmJihjW2xdPUF0LnVuaW9uKG0uYm91bmRpbmdTcGhlcmVDVixfLmJvdW5kaW5nU3BoZXJlQ1YpKSl9cmV0dXJue2dlb21ldHJpZXM6ZSxtb2RlbE1hdHJpeDp0Lm1vZGVsTWF0cml4LGF0dHJpYnV0ZUxvY2F0aW9uczpuLHBpY2tPZmZzZXRzOmksb2Zmc2V0SW5zdGFuY2VFeHRlbmQ6cyxib3VuZGluZ1NwaGVyZXM6dSxib3VuZGluZ1NwaGVyZXNDVjpjfX07SWkucGFja0NyZWF0ZUdlb21ldHJ5UmVzdWx0cz1mdW5jdGlvbih0LGUpe2xldCBuPW5ldyBGbG9hdDY0QXJyYXkoVE0odCkpLG89W10scj17fSxpPXQubGVuZ3RoLHM9MDtuW3MrK109aTtmb3IobGV0IGY9MDtmPGk7ZisrKXtsZXQgdT10W2ZdLGM9aCh1KTtpZihuW3MrK109Yz8xOjAsIWMpY29udGludWU7bltzKytdPXUucHJpbWl0aXZlVHlwZSxuW3MrK109dS5nZW9tZXRyeVR5cGUsbltzKytdPXgodS5vZmZzZXRBdHRyaWJ1dGUsLTEpO2xldCBsPWgodS5ib3VuZGluZ1NwaGVyZSk/MTowO25bcysrXT1sLGwmJkF0LnBhY2sodS5ib3VuZGluZ1NwaGVyZSxuLHMpLHMrPUF0LnBhY2tlZExlbmd0aDtsZXQgcD1oKHUuYm91bmRpbmdTcGhlcmVDVik/MTowO25bcysrXT1wLHAmJkF0LnBhY2sodS5ib3VuZGluZ1NwaGVyZUNWLG4scykscys9QXQucGFja2VkTGVuZ3RoO2xldCBkPXUuYXR0cmlidXRlcyxtPVtdO2ZvcihsZXQgZyBpbiBkKWQuaGFzT3duUHJvcGVydHkoZykmJmgoZFtnXSkmJihtLnB1c2goZyksaChyW2ddKXx8KHJbZ109by5sZW5ndGgsby5wdXNoKGcpKSk7bltzKytdPW0ubGVuZ3RoO2ZvcihsZXQgZz0wO2c8bS5sZW5ndGg7ZysrKXtsZXQgYj1tW2ddLFQ9ZFtiXTtuW3MrK109cltiXSxuW3MrK109VC5jb21wb25lbnREYXRhdHlwZSxuW3MrK109VC5jb21wb25lbnRzUGVyQXR0cmlidXRlLG5bcysrXT1ULm5vcm1hbGl6ZT8xOjAsbltzKytdPVQudmFsdWVzLmxlbmd0aCxuLnNldChULnZhbHVlcyxzKSxzKz1ULnZhbHVlcy5sZW5ndGh9bGV0IF89aCh1LmluZGljZXMpP3UuaW5kaWNlcy5sZW5ndGg6MDtuW3MrK109XyxfPjAmJihuLnNldCh1LmluZGljZXMscykscys9Xyl9cmV0dXJuIGUucHVzaChuLmJ1ZmZlcikse3N0cmluZ1RhYmxlOm8scGFja2VkRGF0YTpufX07SWkudW5wYWNrQ3JlYXRlR2VvbWV0cnlSZXN1bHRzPWZ1bmN0aW9uKHQpe2xldCBlPXQuc3RyaW5nVGFibGUsbj10LnBhY2tlZERhdGEsbyxyPW5ldyBBcnJheShuWzBdKSxpPTAscz0xO2Zvcig7czxuLmxlbmd0aDspe2lmKCEobltzKytdPT09MSkpe3JbaSsrXT12b2lkIDA7Y29udGludWV9bGV0IHU9bltzKytdLGM9bltzKytdLGw9bltzKytdO2w9PT0tMSYmKGw9dm9pZCAwKTtsZXQgcCxkO25bcysrXT09PTEmJihwPUF0LnVucGFjayhuLHMpKSxzKz1BdC5wYWNrZWRMZW5ndGgsbltzKytdPT09MSYmKGQ9QXQudW5wYWNrKG4scykpLHMrPUF0LnBhY2tlZExlbmd0aDtsZXQgZyxiLFQsTz1uZXcgaWUsRT1uW3MrK107Zm9yKG89MDtvPEU7bysrKXtsZXQgQz1lW25bcysrXV0sTj1uW3MrK107VD1uW3MrK107bGV0IEk9bltzKytdIT09MDtnPW5bcysrXSxiPW50LmNyZWF0ZVR5cGVkQXJyYXkoTixnKTtmb3IobGV0IEQ9MDtEPGc7RCsrKWJbRF09bltzKytdO09bQ109bmV3IGl0KHtjb21wb25lbnREYXRhdHlwZTpOLGNvbXBvbmVudHNQZXJBdHRyaWJ1dGU6VCxub3JtYWxpemU6SSx2YWx1ZXM6Yn0pfWxldCB3O2lmKGc9bltzKytdLGc+MCl7bGV0IEM9Yi5sZW5ndGgvVDtmb3Iodz1EdC5jcmVhdGVUeXBlZEFycmF5KEMsZyksbz0wO288ZztvKyspd1tvXT1uW3MrK119cltpKytdPW5ldyBVdCh7cHJpbWl0aXZlVHlwZTp1LGdlb21ldHJ5VHlwZTpjLGJvdW5kaW5nU3BoZXJlOnAsYm91bmRpbmdTcGhlcmVDVjpkLGluZGljZXM6dyxhdHRyaWJ1dGVzOk8sb2Zmc2V0QXR0cmlidXRlOmx9KX1yZXR1cm4gcn07SWkucGFja0NvbWJpbmVHZW9tZXRyeVBhcmFtZXRlcnM9ZnVuY3Rpb24odCxlKXtsZXQgbj10LmNyZWF0ZUdlb21ldHJ5UmVzdWx0cyxvPW4ubGVuZ3RoO2ZvcihsZXQgcj0wO3I8bztyKyspZS5wdXNoKG5bcl0ucGFja2VkRGF0YS5idWZmZXIpO3JldHVybntjcmVhdGVHZW9tZXRyeVJlc3VsdHM6dC5jcmVhdGVHZW9tZXRyeVJlc3VsdHMscGFja2VkSW5zdGFuY2VzOndNKHQuaW5zdGFuY2VzLGUpLGVsbGlwc29pZDp0LmVsbGlwc29pZCxpc0dlb2dyYXBoaWM6dC5wcm9qZWN0aW9uIGluc3RhbmNlb2YgSm4sZWxlbWVudEluZGV4VWludFN1cHBvcnRlZDp0LmVsZW1lbnRJbmRleFVpbnRTdXBwb3J0ZWQsc2NlbmUzRE9ubHk6dC5zY2VuZTNET25seSx2ZXJ0ZXhDYWNoZU9wdGltaXplOnQudmVydGV4Q2FjaGVPcHRpbWl6ZSxjb21wcmVzc1ZlcnRpY2VzOnQuY29tcHJlc3NWZXJ0aWNlcyxtb2RlbE1hdHJpeDp0Lm1vZGVsTWF0cml4LGNyZWF0ZVBpY2tPZmZzZXRzOnQuY3JlYXRlUGlja09mZnNldHN9fTtJaS51bnBhY2tDb21iaW5lR2VvbWV0cnlQYXJhbWV0ZXJzPWZ1bmN0aW9uKHQpe2xldCBlPU9NKHQucGFja2VkSW5zdGFuY2VzKSxuPXQuY3JlYXRlR2VvbWV0cnlSZXN1bHRzLG89bi5sZW5ndGgscj0wO2ZvcihsZXQgZj0wO2Y8bztmKyspe2xldCB1PUlpLnVucGFja0NyZWF0ZUdlb21ldHJ5UmVzdWx0cyhuW2ZdKSxjPXUubGVuZ3RoO2ZvcihsZXQgbD0wO2w8YztsKyspe2xldCBwPXVbbF0sZD1lW3JdO2QuZ2VvbWV0cnk9cCwrK3J9fWxldCBpPSQuY2xvbmUodC5lbGxpcHNvaWQpLHM9dC5pc0dlb2dyYXBoaWM/bmV3IEpuKGkpOm5ldyBubyhpKTtyZXR1cm57aW5zdGFuY2VzOmUsZWxsaXBzb2lkOmkscHJvamVjdGlvbjpzLGVsZW1lbnRJbmRleFVpbnRTdXBwb3J0ZWQ6dC5lbGVtZW50SW5kZXhVaW50U3VwcG9ydGVkLHNjZW5lM0RPbmx5OnQuc2NlbmUzRE9ubHksdmVydGV4Q2FjaGVPcHRpbWl6ZTp0LnZlcnRleENhY2hlT3B0aW1pemUsY29tcHJlc3NWZXJ0aWNlczp0LmNvbXByZXNzVmVydGljZXMsbW9kZWxNYXRyaXg6c3QuY2xvbmUodC5tb2RlbE1hdHJpeCksY3JlYXRlUGlja09mZnNldHM6dC5jcmVhdGVQaWNrT2Zmc2V0c319O0lpLnBhY2tDb21iaW5lR2VvbWV0cnlSZXN1bHRzPWZ1bmN0aW9uKHQsZSl7aCh0Lmdlb21ldHJpZXMpJiZiTSh0Lmdlb21ldHJpZXMsZSk7bGV0IG49b1QodC5ib3VuZGluZ1NwaGVyZXMpLG89b1QodC5ib3VuZGluZ1NwaGVyZXNDVik7cmV0dXJuIGUucHVzaChuLmJ1ZmZlcixvLmJ1ZmZlcikse2dlb21ldHJpZXM6dC5nZW9tZXRyaWVzLGF0dHJpYnV0ZUxvY2F0aW9uczp0LmF0dHJpYnV0ZUxvY2F0aW9ucyxtb2RlbE1hdHJpeDp0Lm1vZGVsTWF0cml4LHBpY2tPZmZzZXRzOnQucGlja09mZnNldHMsb2Zmc2V0SW5zdGFuY2VFeHRlbmQ6dC5vZmZzZXRJbnN0YW5jZUV4dGVuZCxib3VuZGluZ1NwaGVyZXM6bixib3VuZGluZ1NwaGVyZXNDVjpvfX07SWkudW5wYWNrQ29tYmluZUdlb21ldHJ5UmVzdWx0cz1mdW5jdGlvbih0KXtyZXR1cm57Z2VvbWV0cmllczp0Lmdlb21ldHJpZXMsYXR0cmlidXRlTG9jYXRpb25zOnQuYXR0cmlidXRlTG9jYXRpb25zLG1vZGVsTWF0cml4OnQubW9kZWxNYXRyaXgscGlja09mZnNldHM6dC5waWNrT2Zmc2V0cyxvZmZzZXRJbnN0YW5jZUV4dGVuZDp0Lm9mZnNldEluc3RhbmNlRXh0ZW5kLGJvdW5kaW5nU3BoZXJlczpyVCh0LmJvdW5kaW5nU3BoZXJlcyksYm91bmRpbmdTcGhlcmVzQ1Y6clQodC5ib3VuZGluZ1NwaGVyZXNDVil9fTtzYT1JaX0pO2Z1bmN0aW9uIEVNKHQpe2xldCBlLG49dC5uYW1lLG89dC5tZXNzYWdlO2gobikmJmgobyk/ZT1gJHtufTogJHtvfWA6ZT10LnRvU3RyaW5nKCk7bGV0IHI9dC5zdGFjaztyZXR1cm4gaChyKSYmKGUrPWAKJHtyfWApLGV9dmFyIGlULHNUPVooKCk9PntmdCgpO2lUPUVNfSk7dmFyIG8wPXt9O2RlKG8wLHtkZWZhdWx0OigpPT5RZX0pO2Z1bmN0aW9uIFJNKHQpe2FzeW5jIGZ1bmN0aW9uIGUoe2RhdGE6b30pe2xldCByPVtdLGk9e2lkOm8uaWQscmVzdWx0OnZvaWQgMCxlcnJvcjp2b2lkIDB9O3NlbGYuQ0VTSVVNX0JBU0VfVVJMPW8uYmFzZVVybDt0cnl7bGV0IHM9YXdhaXQgdChvLnBhcmFtZXRlcnMscik7aS5yZXN1bHQ9c31jYXRjaChzKXtzIGluc3RhbmNlb2YgRXJyb3I/aS5lcnJvcj17bmFtZTpzLm5hbWUsbWVzc2FnZTpzLm1lc3NhZ2Usc3RhY2s6cy5zdGFja306aS5lcnJvcj1zfW8uY2FuVHJhbnNmZXJBcnJheUJ1ZmZlcnx8KHIubGVuZ3RoPTApO3RyeXtwb3N0TWVzc2FnZShpLHIpfWNhdGNoKHMpe2kucmVzdWx0PXZvaWQgMCxpLmVycm9yPWBwb3N0TWVzc2FnZSBmYWlsZWQgd2l0aCBlcnJvcjogJHtpVChzKX0KICB3aXRoIHJlc3BvbnNlTWVzc2FnZTogJHtKU09OLnN0cmluZ2lmeShpKX1gLHBvc3RNZXNzYWdlKGkpfX1mdW5jdGlvbiBuKG8pe3ZhciByO3Bvc3RNZXNzYWdlKHtpZDoocj1vLmRhdGEpPT1udWxsP3ZvaWQgMDpyLmlkLGVycm9yOmBwb3N0TWVzc2FnZSBmYWlsZWQgd2l0aCBlcnJvcjogJHtKU09OLnN0cmluZ2lmeShvKX1gfSl9cmV0dXJuIHNlbGYub25tZXNzYWdlPWUsc2VsZi5vbm1lc3NhZ2VlcnJvcj1uLHNlbGZ9dmFyIFFlLHNvPVooKCk9PntzVCgpO1FlPVJNfSk7dmFyIHIwPXt9O2RlKHIwLHtkZWZhdWx0OigpPT5DTX0pO2Z1bmN0aW9uIFNNKHQsZSl7bGV0IG49c2EudW5wYWNrQ29tYmluZUdlb21ldHJ5UGFyYW1ldGVycyh0KSxvPXNhLmNvbWJpbmVHZW9tZXRyeShuKTtyZXR1cm4gc2EucGFja0NvbWJpbmVHZW9tZXRyeVJlc3VsdHMobyxlKX12YXIgQ00saTA9WigoKT0+e24wKCk7c28oKTtDTT1RZShTTSl9KTt2YXIgeE0sZmUsTG89WigoKT0+e3hNPXtOT05FOjAsVE9QOjEsQUxMOjJ9LGZlPU9iamVjdC5mcmVlemUoeE0pfSk7ZnVuY3Rpb24gR24odCl7dD14KHQseC5FTVBUWV9PQkpFQ1QpLHRoaXMucG9zaXRpb249eCh0LnBvc2l0aW9uLCExKSx0aGlzLm5vcm1hbD14KHQubm9ybWFsLCExKSx0aGlzLnN0PXgodC5zdCwhMSksdGhpcy5iaXRhbmdlbnQ9eCh0LmJpdGFuZ2VudCwhMSksdGhpcy50YW5nZW50PXgodC50YW5nZW50LCExKSx0aGlzLmNvbG9yPXgodC5jb2xvciwhMSl9dmFyIGR0LFJvPVooKCk9PntJdCgpO2Z0KCk7SHQoKTtHbi5QT1NJVElPTl9PTkxZPU9iamVjdC5mcmVlemUobmV3IEduKHtwb3NpdGlvbjohMH0pKTtHbi5QT1NJVElPTl9BTkRfTk9STUFMPU9iamVjdC5mcmVlemUobmV3IEduKHtwb3NpdGlvbjohMCxub3JtYWw6ITB9KSk7R24uUE9TSVRJT05fTk9STUFMX0FORF9TVD1PYmplY3QuZnJlZXplKG5ldyBHbih7cG9zaXRpb246ITAsbm9ybWFsOiEwLHN0OiEwfSkpO0duLlBPU0lUSU9OX0FORF9TVD1PYmplY3QuZnJlZXplKG5ldyBHbih7cG9zaXRpb246ITAsc3Q6ITB9KSk7R24uUE9TSVRJT05fQU5EX0NPTE9SPU9iamVjdC5mcmVlemUobmV3IEduKHtwb3NpdGlvbjohMCxjb2xvcjohMH0pKTtHbi5BTEw9T2JqZWN0LmZyZWV6ZShuZXcgR24oe3Bvc2l0aW9uOiEwLG5vcm1hbDohMCxzdDohMCx0YW5nZW50OiEwLGJpdGFuZ2VudDohMH0pKTtHbi5ERUZBVUxUPUduLlBPU0lUSU9OX05PUk1BTF9BTkRfU1Q7R24ucGFja2VkTGVuZ3RoPTY7R24ucGFjaz1mdW5jdGlvbih0LGUsbil7aWYoIWgodCkpdGhyb3cgbmV3IEIoInZhbHVlIGlzIHJlcXVpcmVkIik7aWYoIWgoZSkpdGhyb3cgbmV3IEIoImFycmF5IGlzIHJlcXVpcmVkIik7cmV0dXJuIG49eChuLDApLGVbbisrXT10LnBvc2l0aW9uPzE6MCxlW24rK109dC5ub3JtYWw/MTowLGVbbisrXT10LnN0PzE6MCxlW24rK109dC50YW5nZW50PzE6MCxlW24rK109dC5iaXRhbmdlbnQ/MTowLGVbbl09dC5jb2xvcj8xOjAsZX07R24udW5wYWNrPWZ1bmN0aW9uKHQsZSxuKXtpZighaCh0KSl0aHJvdyBuZXcgQigiYXJyYXkgaXMgcmVxdWlyZWQiKTtyZXR1cm4gZT14KGUsMCksaChuKXx8KG49bmV3IEduKSxuLnBvc2l0aW9uPXRbZSsrXT09PTEsbi5ub3JtYWw9dFtlKytdPT09MSxuLnN0PXRbZSsrXT09PTEsbi50YW5nZW50PXRbZSsrXT09PTEsbi5iaXRhbmdlbnQ9dFtlKytdPT09MSxuLmNvbG9yPXRbZV09PT0xLG59O0duLmNsb25lPWZ1bmN0aW9uKHQsZSl7aWYoaCh0KSlyZXR1cm4gaChlKXx8KGU9bmV3IEduKSxlLnBvc2l0aW9uPXQucG9zaXRpb24sZS5ub3JtYWw9dC5ub3JtYWwsZS5zdD10LnN0LGUudGFuZ2VudD10LnRhbmdlbnQsZS5iaXRhbmdlbnQ9dC5iaXRhbmdlbnQsZS5jb2xvcj10LmNvbG9yLGV9O2R0PUdufSk7ZnVuY3Rpb24gcnIodCl7dD14KHQseC5FTVBUWV9PQkpFQ1QpO2xldCBlPXQubWluaW11bSxuPXQubWF4aW11bTtpZih5LnR5cGVPZi5vYmplY3QoIm1pbiIsZSkseS50eXBlT2Yub2JqZWN0KCJtYXgiLG4pLGgodC5vZmZzZXRBdHRyaWJ1dGUpJiZ0Lm9mZnNldEF0dHJpYnV0ZT09PWZlLlRPUCl0aHJvdyBuZXcgQigiR2VvbWV0cnlPZmZzZXRBdHRyaWJ1dGUuVE9QIGlzIG5vdCBhIHN1cHBvcnRlZCBvcHRpb25zLm9mZnNldEF0dHJpYnV0ZSBmb3IgdGhpcyBnZW9tZXRyeS4iKTtsZXQgbz14KHQudmVydGV4Rm9ybWF0LGR0LkRFRkFVTFQpO3RoaXMuX21pbmltdW09YS5jbG9uZShlKSx0aGlzLl9tYXhpbXVtPWEuY2xvbmUobiksdGhpcy5fdmVydGV4Rm9ybWF0PW8sdGhpcy5fb2Zmc2V0QXR0cmlidXRlPXQub2Zmc2V0QXR0cmlidXRlLHRoaXMuX3dvcmtlck5hbWU9ImNyZWF0ZUJveEdlb21ldHJ5In12YXIgUE0sYVQsZlQsdVQsY1QsczAsU2YsYzA9WigoKT0+e3ZlKCk7RnQoKTtYdCgpO0ZlKCk7SXQoKTtmdCgpO0h0KCk7WGUoKTtZZSgpO2FuKCk7TG8oKTt0bigpO1JvKCk7UE09bmV3IGE7cnIuZnJvbURpbWVuc2lvbnM9ZnVuY3Rpb24odCl7dD14KHQseC5FTVBUWV9PQkpFQ1QpO2xldCBlPXQuZGltZW5zaW9uczt5LnR5cGVPZi5vYmplY3QoImRpbWVuc2lvbnMiLGUpLHkudHlwZU9mLm51bWJlci5ncmVhdGVyVGhhbk9yRXF1YWxzKCJkaW1lbnNpb25zLngiLGUueCwwKSx5LnR5cGVPZi5udW1iZXIuZ3JlYXRlclRoYW5PckVxdWFscygiZGltZW5zaW9ucy55IixlLnksMCkseS50eXBlT2YubnVtYmVyLmdyZWF0ZXJUaGFuT3JFcXVhbHMoImRpbWVuc2lvbnMueiIsZS56LDApO2xldCBuPWEubXVsdGlwbHlCeVNjYWxhcihlLC41LG5ldyBhKTtyZXR1cm4gbmV3IHJyKHttaW5pbXVtOmEubmVnYXRlKG4sbmV3IGEpLG1heGltdW06bix2ZXJ0ZXhGb3JtYXQ6dC52ZXJ0ZXhGb3JtYXQsb2Zmc2V0QXR0cmlidXRlOnQub2Zmc2V0QXR0cmlidXRlfSl9O3JyLmZyb21BeGlzQWxpZ25lZEJvdW5kaW5nQm94PWZ1bmN0aW9uKHQpe3JldHVybiB5LnR5cGVPZi5vYmplY3QoImJvdW5kaW5nQm94Iix0KSxuZXcgcnIoe21pbmltdW06dC5taW5pbXVtLG1heGltdW06dC5tYXhpbXVtfSl9O3JyLnBhY2tlZExlbmd0aD0yKmEucGFja2VkTGVuZ3RoK2R0LnBhY2tlZExlbmd0aCsxO3JyLnBhY2s9ZnVuY3Rpb24odCxlLG4pe3JldHVybiB5LnR5cGVPZi5vYmplY3QoInZhbHVlIix0KSx5LmRlZmluZWQoImFycmF5IixlKSxuPXgobiwwKSxhLnBhY2sodC5fbWluaW11bSxlLG4pLGEucGFjayh0Ll9tYXhpbXVtLGUsbithLnBhY2tlZExlbmd0aCksZHQucGFjayh0Ll92ZXJ0ZXhGb3JtYXQsZSxuKzIqYS5wYWNrZWRMZW5ndGgpLGVbbisyKmEucGFja2VkTGVuZ3RoK2R0LnBhY2tlZExlbmd0aF09eCh0Ll9vZmZzZXRBdHRyaWJ1dGUsLTEpLGV9O2FUPW5ldyBhLGZUPW5ldyBhLHVUPW5ldyBkdCxjVD17bWluaW11bTphVCxtYXhpbXVtOmZULHZlcnRleEZvcm1hdDp1VCxvZmZzZXRBdHRyaWJ1dGU6dm9pZCAwfTtyci51bnBhY2s9ZnVuY3Rpb24odCxlLG4pe3kuZGVmaW5lZCgiYXJyYXkiLHQpLGU9eChlLDApO2xldCBvPWEudW5wYWNrKHQsZSxhVCkscj1hLnVucGFjayh0LGUrYS5wYWNrZWRMZW5ndGgsZlQpLGk9ZHQudW5wYWNrKHQsZSsyKmEucGFja2VkTGVuZ3RoLHVUKSxzPXRbZSsyKmEucGFja2VkTGVuZ3RoK2R0LnBhY2tlZExlbmd0aF07cmV0dXJuIGgobik/KG4uX21pbmltdW09YS5jbG9uZShvLG4uX21pbmltdW0pLG4uX21heGltdW09YS5jbG9uZShyLG4uX21heGltdW0pLG4uX3ZlcnRleEZvcm1hdD1kdC5jbG9uZShpLG4uX3ZlcnRleEZvcm1hdCksbi5fb2Zmc2V0QXR0cmlidXRlPXM9PT0tMT92b2lkIDA6cyxuKTooY1Qub2Zmc2V0QXR0cmlidXRlPXM9PT0tMT92b2lkIDA6cyxuZXcgcnIoY1QpKX07cnIuY3JlYXRlR2VvbWV0cnk9ZnVuY3Rpb24odCl7bGV0IGU9dC5fbWluaW11bSxuPXQuX21heGltdW0sbz10Ll92ZXJ0ZXhGb3JtYXQ7aWYoYS5lcXVhbHMoZSxuKSlyZXR1cm47bGV0IHI9bmV3IGllLGkscztpZihvLnBvc2l0aW9uJiYoby5zdHx8by5ub3JtYWx8fG8udGFuZ2VudHx8by5iaXRhbmdlbnQpKXtpZihvLnBvc2l0aW9uJiYocz1uZXcgRmxvYXQ2NEFycmF5KDYqNCozKSxzWzBdPWUueCxzWzFdPWUueSxzWzJdPW4ueixzWzNdPW4ueCxzWzRdPWUueSxzWzVdPW4ueixzWzZdPW4ueCxzWzddPW4ueSxzWzhdPW4ueixzWzldPWUueCxzWzEwXT1uLnksc1sxMV09bi56LHNbMTJdPWUueCxzWzEzXT1lLnksc1sxNF09ZS56LHNbMTVdPW4ueCxzWzE2XT1lLnksc1sxN109ZS56LHNbMThdPW4ueCxzWzE5XT1uLnksc1syMF09ZS56LHNbMjFdPWUueCxzWzIyXT1uLnksc1syM109ZS56LHNbMjRdPW4ueCxzWzI1XT1lLnksc1syNl09ZS56LHNbMjddPW4ueCxzWzI4XT1uLnksc1syOV09ZS56LHNbMzBdPW4ueCxzWzMxXT1uLnksc1szMl09bi56LHNbMzNdPW4ueCxzWzM0XT1lLnksc1szNV09bi56LHNbMzZdPWUueCxzWzM3XT1lLnksc1szOF09ZS56LHNbMzldPWUueCxzWzQwXT1uLnksc1s0MV09ZS56LHNbNDJdPWUueCxzWzQzXT1uLnksc1s0NF09bi56LHNbNDVdPWUueCxzWzQ2XT1lLnksc1s0N109bi56LHNbNDhdPWUueCxzWzQ5XT1uLnksc1s1MF09ZS56LHNbNTFdPW4ueCxzWzUyXT1uLnksc1s1M109ZS56LHNbNTRdPW4ueCxzWzU1XT1uLnksc1s1Nl09bi56LHNbNTddPWUueCxzWzU4XT1uLnksc1s1OV09bi56LHNbNjBdPWUueCxzWzYxXT1lLnksc1s2Ml09ZS56LHNbNjNdPW4ueCxzWzY0XT1lLnksc1s2NV09ZS56LHNbNjZdPW4ueCxzWzY3XT1lLnksc1s2OF09bi56LHNbNjldPWUueCxzWzcwXT1lLnksc1s3MV09bi56LHIucG9zaXRpb249bmV3IGl0KHtjb21wb25lbnREYXRhdHlwZTpudC5ET1VCTEUsY29tcG9uZW50c1BlckF0dHJpYnV0ZTozLHZhbHVlczpzfSkpLG8ubm9ybWFsKXtsZXQgYz1uZXcgRmxvYXQzMkFycmF5KDcyKTtjWzBdPTAsY1sxXT0wLGNbMl09MSxjWzNdPTAsY1s0XT0wLGNbNV09MSxjWzZdPTAsY1s3XT0wLGNbOF09MSxjWzldPTAsY1sxMF09MCxjWzExXT0xLGNbMTJdPTAsY1sxM109MCxjWzE0XT0tMSxjWzE1XT0wLGNbMTZdPTAsY1sxN109LTEsY1sxOF09MCxjWzE5XT0wLGNbMjBdPS0xLGNbMjFdPTAsY1syMl09MCxjWzIzXT0tMSxjWzI0XT0xLGNbMjVdPTAsY1syNl09MCxjWzI3XT0xLGNbMjhdPTAsY1syOV09MCxjWzMwXT0xLGNbMzFdPTAsY1szMl09MCxjWzMzXT0xLGNbMzRdPTAsY1szNV09MCxjWzM2XT0tMSxjWzM3XT0wLGNbMzhdPTAsY1szOV09LTEsY1s0MF09MCxjWzQxXT0wLGNbNDJdPS0xLGNbNDNdPTAsY1s0NF09MCxjWzQ1XT0tMSxjWzQ2XT0wLGNbNDddPTAsY1s0OF09MCxjWzQ5XT0xLGNbNTBdPTAsY1s1MV09MCxjWzUyXT0xLGNbNTNdPTAsY1s1NF09MCxjWzU1XT0xLGNbNTZdPTAsY1s1N109MCxjWzU4XT0xLGNbNTldPTAsY1s2MF09MCxjWzYxXT0tMSxjWzYyXT0wLGNbNjNdPTAsY1s2NF09LTEsY1s2NV09MCxjWzY2XT0wLGNbNjddPS0xLGNbNjhdPTAsY1s2OV09MCxjWzcwXT0tMSxjWzcxXT0wLHIubm9ybWFsPW5ldyBpdCh7Y29tcG9uZW50RGF0YXR5cGU6bnQuRkxPQVQsY29tcG9uZW50c1BlckF0dHJpYnV0ZTozLHZhbHVlczpjfSl9aWYoby5zdCl7bGV0IGM9bmV3IEZsb2F0MzJBcnJheSg0OCk7Y1swXT0wLGNbMV09MCxjWzJdPTEsY1szXT0wLGNbNF09MSxjWzVdPTEsY1s2XT0wLGNbN109MSxjWzhdPTEsY1s5XT0wLGNbMTBdPTAsY1sxMV09MCxjWzEyXT0wLGNbMTNdPTEsY1sxNF09MSxjWzE1XT0xLGNbMTZdPTAsY1sxN109MCxjWzE4XT0xLGNbMTldPTAsY1syMF09MSxjWzIxXT0xLGNbMjJdPTAsY1syM109MSxjWzI0XT0xLGNbMjVdPTAsY1syNl09MCxjWzI3XT0wLGNbMjhdPTAsY1syOV09MSxjWzMwXT0xLGNbMzFdPTEsY1szMl09MSxjWzMzXT0wLGNbMzRdPTAsY1szNV09MCxjWzM2XT0wLGNbMzddPTEsY1szOF09MSxjWzM5XT0xLGNbNDBdPTAsY1s0MV09MCxjWzQyXT0xLGNbNDNdPTAsY1s0NF09MSxjWzQ1XT0xLGNbNDZdPTAsY1s0N109MSxyLnN0PW5ldyBpdCh7Y29tcG9uZW50RGF0YXR5cGU6bnQuRkxPQVQsY29tcG9uZW50c1BlckF0dHJpYnV0ZToyLHZhbHVlczpjfSl9aWYoby50YW5nZW50KXtsZXQgYz1uZXcgRmxvYXQzMkFycmF5KDcyKTtjWzBdPTEsY1sxXT0wLGNbMl09MCxjWzNdPTEsY1s0XT0wLGNbNV09MCxjWzZdPTEsY1s3XT0wLGNbOF09MCxjWzldPTEsY1sxMF09MCxjWzExXT0wLGNbMTJdPS0xLGNbMTNdPTAsY1sxNF09MCxjWzE1XT0tMSxjWzE2XT0wLGNbMTddPTAsY1sxOF09LTEsY1sxOV09MCxjWzIwXT0wLGNbMjFdPS0xLGNbMjJdPTAsY1syM109MCxjWzI0XT0wLGNbMjVdPTEsY1syNl09MCxjWzI3XT0wLGNbMjhdPTEsY1syOV09MCxjWzMwXT0wLGNbMzFdPTEsY1szMl09MCxjWzMzXT0wLGNbMzRdPTEsY1szNV09MCxjWzM2XT0wLGNbMzddPS0xLGNbMzhdPTAsY1szOV09MCxjWzQwXT0tMSxjWzQxXT0wLGNbNDJdPTAsY1s0M109LTEsY1s0NF09MCxjWzQ1XT0wLGNbNDZdPS0xLGNbNDddPTAsY1s0OF09LTEsY1s0OV09MCxjWzUwXT0wLGNbNTFdPS0xLGNbNTJdPTAsY1s1M109MCxjWzU0XT0tMSxjWzU1XT0wLGNbNTZdPTAsY1s1N109LTEsY1s1OF09MCxjWzU5XT0wLGNbNjBdPTEsY1s2MV09MCxjWzYyXT0wLGNbNjNdPTEsY1s2NF09MCxjWzY1XT0wLGNbNjZdPTEsY1s2N109MCxjWzY4XT0wLGNbNjldPTEsY1s3MF09MCxjWzcxXT0wLHIudGFuZ2VudD1uZXcgaXQoe2NvbXBvbmVudERhdGF0eXBlOm50LkZMT0FULGNvbXBvbmVudHNQZXJBdHRyaWJ1dGU6Myx2YWx1ZXM6Y30pfWlmKG8uYml0YW5nZW50KXtsZXQgYz1uZXcgRmxvYXQzMkFycmF5KDcyKTtjWzBdPTAsY1sxXT0xLGNbMl09MCxjWzNdPTAsY1s0XT0xLGNbNV09MCxjWzZdPTAsY1s3XT0xLGNbOF09MCxjWzldPTAsY1sxMF09MSxjWzExXT0wLGNbMTJdPTAsY1sxM109MSxjWzE0XT0wLGNbMTVdPTAsY1sxNl09MSxjWzE3XT0wLGNbMThdPTAsY1sxOV09MSxjWzIwXT0wLGNbMjFdPTAsY1syMl09MSxjWzIzXT0wLGNbMjRdPTAsY1syNV09MCxjWzI2XT0xLGNbMjddPTAsY1syOF09MCxjWzI5XT0xLGNbMzBdPTAsY1szMV09MCxjWzMyXT0xLGNbMzNdPTAsY1szNF09MCxjWzM1XT0xLGNbMzZdPTAsY1szN109MCxjWzM4XT0xLGNbMzldPTAsY1s0MF09MCxjWzQxXT0xLGNbNDJdPTAsY1s0M109MCxjWzQ0XT0xLGNbNDVdPTAsY1s0Nl09MCxjWzQ3XT0xLGNbNDhdPTAsY1s0OV09MCxjWzUwXT0xLGNbNTFdPTAsY1s1Ml09MCxjWzUzXT0xLGNbNTRdPTAsY1s1NV09MCxjWzU2XT0xLGNbNTddPTAsY1s1OF09MCxjWzU5XT0xLGNbNjBdPTAsY1s2MV09MCxjWzYyXT0xLGNbNjNdPTAsY1s2NF09MCxjWzY1XT0xLGNbNjZdPTAsY1s2N109MCxjWzY4XT0xLGNbNjldPTAsY1s3MF09MCxjWzcxXT0xLHIuYml0YW5nZW50PW5ldyBpdCh7Y29tcG9uZW50RGF0YXR5cGU6bnQuRkxPQVQsY29tcG9uZW50c1BlckF0dHJpYnV0ZTozLHZhbHVlczpjfSl9aT1uZXcgVWludDE2QXJyYXkoNioyKjMpLGlbMF09MCxpWzFdPTEsaVsyXT0yLGlbM109MCxpWzRdPTIsaVs1XT0zLGlbNl09NixpWzddPTUsaVs4XT00LGlbOV09NyxpWzEwXT02LGlbMTFdPTQsaVsxMl09OCxpWzEzXT05LGlbMTRdPTEwLGlbMTVdPTgsaVsxNl09MTAsaVsxN109MTEsaVsxOF09MTQsaVsxOV09MTMsaVsyMF09MTIsaVsyMV09MTUsaVsyMl09MTQsaVsyM109MTIsaVsyNF09MTgsaVsyNV09MTcsaVsyNl09MTYsaVsyN109MTksaVsyOF09MTgsaVsyOV09MTYsaVszMF09MjAsaVszMV09MjEsaVszMl09MjIsaVszM109MjAsaVszNF09MjIsaVszNV09MjN9ZWxzZSBzPW5ldyBGbG9hdDY0QXJyYXkoOCozKSxzWzBdPWUueCxzWzFdPWUueSxzWzJdPWUueixzWzNdPW4ueCxzWzRdPWUueSxzWzVdPWUueixzWzZdPW4ueCxzWzddPW4ueSxzWzhdPWUueixzWzldPWUueCxzWzEwXT1uLnksc1sxMV09ZS56LHNbMTJdPWUueCxzWzEzXT1lLnksc1sxNF09bi56LHNbMTVdPW4ueCxzWzE2XT1lLnksc1sxN109bi56LHNbMThdPW4ueCxzWzE5XT1uLnksc1syMF09bi56LHNbMjFdPWUueCxzWzIyXT1uLnksc1syM109bi56LHIucG9zaXRpb249bmV3IGl0KHtjb21wb25lbnREYXRhdHlwZTpudC5ET1VCTEUsY29tcG9uZW50c1BlckF0dHJpYnV0ZTozLHZhbHVlczpzfSksaT1uZXcgVWludDE2QXJyYXkoNioyKjMpLGlbMF09NCxpWzFdPTUsaVsyXT02LGlbM109NCxpWzRdPTYsaVs1XT03LGlbNl09MSxpWzddPTAsaVs4XT0zLGlbOV09MSxpWzEwXT0zLGlbMTFdPTIsaVsxMl09MSxpWzEzXT02LGlbMTRdPTUsaVsxNV09MSxpWzE2XT0yLGlbMTddPTYsaVsxOF09MixpWzE5XT0zLGlbMjBdPTcsaVsyMV09MixpWzIyXT03LGlbMjNdPTYsaVsyNF09MyxpWzI1XT0wLGlbMjZdPTQsaVsyN109MyxpWzI4XT00LGlbMjldPTcsaVszMF09MCxpWzMxXT0xLGlbMzJdPTUsaVszM109MCxpWzM0XT01LGlbMzVdPTQ7bGV0IGY9YS5zdWJ0cmFjdChuLGUsUE0pLHU9YS5tYWduaXR1ZGUoZikqLjU7aWYoaCh0Ll9vZmZzZXRBdHRyaWJ1dGUpKXtsZXQgYz1zLmxlbmd0aCxsPXQuX29mZnNldEF0dHJpYnV0ZT09PWZlLk5PTkU/MDoxLHA9bmV3IFVpbnQ4QXJyYXkoYy8zKS5maWxsKGwpO3IuYXBwbHlPZmZzZXQ9bmV3IGl0KHtjb21wb25lbnREYXRhdHlwZTpudC5VTlNJR05FRF9CWVRFLGNvbXBvbmVudHNQZXJBdHRyaWJ1dGU6MSx2YWx1ZXM6cH0pfXJldHVybiBuZXcgVXQoe2F0dHJpYnV0ZXM6cixpbmRpY2VzOmkscHJpbWl0aXZlVHlwZTpCdC5UUklBTkdMRVMsYm91bmRpbmdTcGhlcmU6bmV3IEF0KGEuWkVSTyx1KSxvZmZzZXRBdHRyaWJ1dGU6dC5fb2Zmc2V0QXR0cmlidXRlfSl9O3JyLmdldFVuaXRCb3g9ZnVuY3Rpb24oKXtyZXR1cm4gaChzMCl8fChzMD1yci5jcmVhdGVHZW9tZXRyeShyci5mcm9tRGltZW5zaW9ucyh7ZGltZW5zaW9uczpuZXcgYSgxLDEsMSksdmVydGV4Rm9ybWF0OmR0LlBPU0lUSU9OX09OTFl9KSkpLHMwfTtTZj1ycn0pO3ZhciBhMD17fTtkZShhMCx7ZGVmYXVsdDooKT0+Tk19KTtmdW5jdGlvbiBNTSh0LGUpe3JldHVybiBoKGUpJiYodD1TZi51bnBhY2sodCxlKSksU2YuY3JlYXRlR2VvbWV0cnkodCl9dmFyIE5NLGYwPVooKCk9PntjMCgpO2Z0KCk7Tk09TU19KTtmdW5jdGlvbiBjaSh0KXt0PXgodCx4LkVNUFRZX09CSkVDVCk7bGV0IGU9dC5taW5pbXVtLG49dC5tYXhpbXVtO2lmKHkudHlwZU9mLm9iamVjdCgibWluIixlKSx5LnR5cGVPZi5vYmplY3QoIm1heCIsbiksaCh0Lm9mZnNldEF0dHJpYnV0ZSkmJnQub2Zmc2V0QXR0cmlidXRlPT09ZmUuVE9QKXRocm93IG5ldyBCKCJHZW9tZXRyeU9mZnNldEF0dHJpYnV0ZS5UT1AgaXMgbm90IGEgc3VwcG9ydGVkIG9wdGlvbnMub2Zmc2V0QXR0cmlidXRlIGZvciB0aGlzIGdlb21ldHJ5LiIpO3RoaXMuX21pbj1hLmNsb25lKGUpLHRoaXMuX21heD1hLmNsb25lKG4pLHRoaXMuX29mZnNldEF0dHJpYnV0ZT10Lm9mZnNldEF0dHJpYnV0ZSx0aGlzLl93b3JrZXJOYW1lPSJjcmVhdGVCb3hPdXRsaW5lR2VvbWV0cnkifXZhciBJTSxwVCxkVCxsVCx1MCxtVD1aKCgpPT57dmUoKTtGdCgpO1h0KCk7RmUoKTtJdCgpO2Z0KCk7SHQoKTtYZSgpO1llKCk7YW4oKTtMbygpO3RuKCk7SU09bmV3IGE7Y2kuZnJvbURpbWVuc2lvbnM9ZnVuY3Rpb24odCl7dD14KHQseC5FTVBUWV9PQkpFQ1QpO2xldCBlPXQuZGltZW5zaW9uczt5LnR5cGVPZi5vYmplY3QoImRpbWVuc2lvbnMiLGUpLHkudHlwZU9mLm51bWJlci5ncmVhdGVyVGhhbk9yRXF1YWxzKCJkaW1lbnNpb25zLngiLGUueCwwKSx5LnR5cGVPZi5udW1iZXIuZ3JlYXRlclRoYW5PckVxdWFscygiZGltZW5zaW9ucy55IixlLnksMCkseS50eXBlT2YubnVtYmVyLmdyZWF0ZXJUaGFuT3JFcXVhbHMoImRpbWVuc2lvbnMueiIsZS56LDApO2xldCBuPWEubXVsdGlwbHlCeVNjYWxhcihlLC41LG5ldyBhKTtyZXR1cm4gbmV3IGNpKHttaW5pbXVtOmEubmVnYXRlKG4sbmV3IGEpLG1heGltdW06bixvZmZzZXRBdHRyaWJ1dGU6dC5vZmZzZXRBdHRyaWJ1dGV9KX07Y2kuZnJvbUF4aXNBbGlnbmVkQm91bmRpbmdCb3g9ZnVuY3Rpb24odCl7cmV0dXJuIHkudHlwZU9mLm9iamVjdCgiYm91bmRpbmRCb3giLHQpLG5ldyBjaSh7bWluaW11bTp0Lm1pbmltdW0sbWF4aW11bTp0Lm1heGltdW19KX07Y2kucGFja2VkTGVuZ3RoPTIqYS5wYWNrZWRMZW5ndGgrMTtjaS5wYWNrPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4geS50eXBlT2Yub2JqZWN0KCJ2YWx1ZSIsdCkseS5kZWZpbmVkKCJhcnJheSIsZSksbj14KG4sMCksYS5wYWNrKHQuX21pbixlLG4pLGEucGFjayh0Ll9tYXgsZSxuK2EucGFja2VkTGVuZ3RoKSxlW24rYS5wYWNrZWRMZW5ndGgqMl09eCh0Ll9vZmZzZXRBdHRyaWJ1dGUsLTEpLGV9O3BUPW5ldyBhLGRUPW5ldyBhLGxUPXttaW5pbXVtOnBULG1heGltdW06ZFQsb2Zmc2V0QXR0cmlidXRlOnZvaWQgMH07Y2kudW5wYWNrPWZ1bmN0aW9uKHQsZSxuKXt5LmRlZmluZWQoImFycmF5Iix0KSxlPXgoZSwwKTtsZXQgbz1hLnVucGFjayh0LGUscFQpLHI9YS51bnBhY2sodCxlK2EucGFja2VkTGVuZ3RoLGRUKSxpPXRbZSthLnBhY2tlZExlbmd0aCoyXTtyZXR1cm4gaChuKT8obi5fbWluPWEuY2xvbmUobyxuLl9taW4pLG4uX21heD1hLmNsb25lKHIsbi5fbWF4KSxuLl9vZmZzZXRBdHRyaWJ1dGU9aT09PS0xP3ZvaWQgMDppLG4pOihsVC5vZmZzZXRBdHRyaWJ1dGU9aT09PS0xP3ZvaWQgMDppLG5ldyBjaShsVCkpfTtjaS5jcmVhdGVHZW9tZXRyeT1mdW5jdGlvbih0KXtsZXQgZT10Ll9taW4sbj10Ll9tYXg7aWYoYS5lcXVhbHMoZSxuKSlyZXR1cm47bGV0IG89bmV3IGllLHI9bmV3IFVpbnQxNkFycmF5KDEyKjIpLGk9bmV3IEZsb2F0NjRBcnJheSg4KjMpO2lbMF09ZS54LGlbMV09ZS55LGlbMl09ZS56LGlbM109bi54LGlbNF09ZS55LGlbNV09ZS56LGlbNl09bi54LGlbN109bi55LGlbOF09ZS56LGlbOV09ZS54LGlbMTBdPW4ueSxpWzExXT1lLnosaVsxMl09ZS54LGlbMTNdPWUueSxpWzE0XT1uLnosaVsxNV09bi54LGlbMTZdPWUueSxpWzE3XT1uLnosaVsxOF09bi54LGlbMTldPW4ueSxpWzIwXT1uLnosaVsyMV09ZS54LGlbMjJdPW4ueSxpWzIzXT1uLnosby5wb3NpdGlvbj1uZXcgaXQoe2NvbXBvbmVudERhdGF0eXBlOm50LkRPVUJMRSxjb21wb25lbnRzUGVyQXR0cmlidXRlOjMsdmFsdWVzOml9KSxyWzBdPTQsclsxXT01LHJbMl09NSxyWzNdPTYscls0XT02LHJbNV09NyxyWzZdPTcscls3XT00LHJbOF09MCxyWzldPTEsclsxMF09MSxyWzExXT0yLHJbMTJdPTIsclsxM109MyxyWzE0XT0zLHJbMTVdPTAsclsxNl09MCxyWzE3XT00LHJbMThdPTEsclsxOV09NSxyWzIwXT0yLHJbMjFdPTYsclsyMl09MyxyWzIzXT03O2xldCBzPWEuc3VidHJhY3QobixlLElNKSxmPWEubWFnbml0dWRlKHMpKi41O2lmKGgodC5fb2Zmc2V0QXR0cmlidXRlKSl7bGV0IHU9aS5sZW5ndGgsYz10Ll9vZmZzZXRBdHRyaWJ1dGU9PT1mZS5OT05FPzA6MSxsPW5ldyBVaW50OEFycmF5KHUvMykuZmlsbChjKTtvLmFwcGx5T2Zmc2V0PW5ldyBpdCh7Y29tcG9uZW50RGF0YXR5cGU6bnQuVU5TSUdORURfQllURSxjb21wb25lbnRzUGVyQXR0cmlidXRlOjEsdmFsdWVzOmx9KX1yZXR1cm4gbmV3IFV0KHthdHRyaWJ1dGVzOm8saW5kaWNlczpyLHByaW1pdGl2ZVR5cGU6QnQuTElORVMsYm91bmRpbmdTcGhlcmU6bmV3IEF0KGEuWkVSTyxmKSxvZmZzZXRBdHRyaWJ1dGU6dC5fb2Zmc2V0QXR0cmlidXRlfSl9O3UwPWNpfSk7dmFyIGwwPXt9O2RlKGwwLHtkZWZhdWx0OigpPT5MTX0pO2Z1bmN0aW9uIHZNKHQsZSl7cmV0dXJuIGgoZSkmJih0PXUwLnVucGFjayh0LGUpKSx1MC5jcmVhdGVHZW9tZXRyeSh0KX12YXIgTE0scDA9WigoKT0+e21UKCk7ZnQoKTtMTT12TX0pO2Z1bmN0aW9uIGNhKHQsZSxuLG8scixpLHMsZix1LGMpe2xldCBsPXQrZTthLm11bHRpcGx5QnlTY2FsYXIobyxNYXRoLmNvcyhsKSxYcCksYS5tdWx0aXBseUJ5U2NhbGFyKG4sTWF0aC5zaW4obCksaFQpLGEuYWRkKFhwLGhULFhwKTtsZXQgcD1NYXRoLmNvcyh0KTtwPXAqcDtsZXQgZD1NYXRoLnNpbih0KTtkPWQqZDtsZXQgXz1pL01hdGguc3FydChzKnArcipkKS9mO3JldHVybiBlZS5mcm9tQXhpc0FuZ2xlKFhwLF8sX1QpLFEuZnJvbVF1YXRlcm5pb24oX1QseVQpLFEubXVsdGlwbHlCeVZlY3Rvcih5VCx1LGMpLGEubm9ybWFsaXplKGMsYyksYS5tdWx0aXBseUJ5U2NhbGFyKGMsZixjKSxjfXZhciBtMCxYcCxoVCxfVCx5VCxnVCxBVCxkMCxETSxGTSxCTSxVTSxrcixoMD1aKCgpPT57RnQoKTtXdCgpO0JuKCk7S28oKTttMD17fSxYcD1uZXcgYSxoVD1uZXcgYSxfVD1uZXcgZWUseVQ9bmV3IFE7Z1Q9bmV3IGEsQVQ9bmV3IGEsZDA9bmV3IGEsRE09bmV3IGE7bTAucmFpc2VQb3NpdGlvbnNUb0hlaWdodD1mdW5jdGlvbih0LGUsbil7bGV0IG89ZS5lbGxpcHNvaWQscj1lLmhlaWdodCxpPWUuZXh0cnVkZWRIZWlnaHQscz1uP3QubGVuZ3RoLzMqMjp0Lmxlbmd0aC8zLGY9bmV3IEZsb2F0NjRBcnJheShzKjMpLHU9dC5sZW5ndGgsYz1uP3U6MDtmb3IobGV0IGw9MDtsPHU7bCs9Myl7bGV0IHA9bCsxLGQ9bCsyLG09YS5mcm9tQXJyYXkodCxsLGdUKTtvLnNjYWxlVG9HZW9kZXRpY1N1cmZhY2UobSxtKTtsZXQgXz1hLmNsb25lKG0sQVQpLGc9by5nZW9kZXRpY1N1cmZhY2VOb3JtYWwobSxETSksYj1hLm11bHRpcGx5QnlTY2FsYXIoZyxyLGQwKTthLmFkZChtLGIsbSksbiYmKGEubXVsdGlwbHlCeVNjYWxhcihnLGksYiksYS5hZGQoXyxiLF8pLGZbbCtjXT1fLngsZltwK2NdPV8ueSxmW2QrY109Xy56KSxmW2xdPW0ueCxmW3BdPW0ueSxmW2RdPW0uen1yZXR1cm4gZn07Rk09bmV3IGEsQk09bmV3IGEsVU09bmV3IGE7bTAuY29tcHV0ZUVsbGlwc2VQb3NpdGlvbnM9ZnVuY3Rpb24odCxlLG4pe2xldCBvPXQuc2VtaU1pbm9yQXhpcyxyPXQuc2VtaU1ham9yQXhpcyxpPXQucm90YXRpb24scz10LmNlbnRlcixmPXQuZ3JhbnVsYXJpdHkqOCx1PW8qbyxjPXIqcixsPXIqbyxwPWEubWFnbml0dWRlKHMpLGQ9YS5ub3JtYWxpemUocyxGTSksbT1hLmNyb3NzKGEuVU5JVF9aLHMsQk0pO209YS5ub3JtYWxpemUobSxtKTtsZXQgXz1hLmNyb3NzKGQsbSxVTSksZz0xK01hdGguY2VpbChNLlBJX09WRVJfVFdPL2YpLGI9TS5QSV9PVkVSX1RXTy8oZy0xKSxUPU0uUElfT1ZFUl9UV08tZypiO1Q8MCYmKGctPU1hdGguY2VpbChNYXRoLmFicyhUKS9iKSk7bGV0IE89MiooZyooZysyKSksRT1lP25ldyBBcnJheShPKjMpOnZvaWQgMCx3PTAsQz1nVCxOPUFULEk9Zyo0KjMsRD1JLTEsdj0wLEw9bj9uZXcgQXJyYXkoSSk6dm9pZCAwLFUsQSxTLFAsRjtmb3IoVD1NLlBJX09WRVJfVFdPLEM9Y2EoVCxpLF8sbSx1LGwsYyxwLGQsQyksZSYmKEVbdysrXT1DLngsRVt3KytdPUMueSxFW3crK109Qy56KSxuJiYoTFtELS1dPUMueixMW0QtLV09Qy55LExbRC0tXT1DLngpLFQ9TS5QSV9PVkVSX1RXTy1iLFU9MTtVPGcrMTsrK1Upe2lmKEM9Y2EoVCxpLF8sbSx1LGwsYyxwLGQsQyksTj1jYShNYXRoLlBJLVQsaSxfLG0sdSxsLGMscCxkLE4pLGUpe2ZvcihFW3crK109Qy54LEVbdysrXT1DLnksRVt3KytdPUMueixTPTIqVSsyLEE9MTtBPFMtMTsrK0EpUD1BLyhTLTEpLEY9YS5sZXJwKEMsTixQLGQwKSxFW3crK109Ri54LEVbdysrXT1GLnksRVt3KytdPUYuejtFW3crK109Ti54LEVbdysrXT1OLnksRVt3KytdPU4uen1uJiYoTFtELS1dPUMueixMW0QtLV09Qy55LExbRC0tXT1DLngsTFt2KytdPU4ueCxMW3YrK109Ti55LExbdisrXT1OLnopLFQ9TS5QSV9PVkVSX1RXTy0oVSsxKSpifWZvcihVPWc7VT4xOy0tVSl7aWYoVD1NLlBJX09WRVJfVFdPLShVLTEpKmIsQz1jYSgtVCxpLF8sbSx1LGwsYyxwLGQsQyksTj1jYShUK01hdGguUEksaSxfLG0sdSxsLGMscCxkLE4pLGUpe2ZvcihFW3crK109Qy54LEVbdysrXT1DLnksRVt3KytdPUMueixTPTIqKFUtMSkrMixBPTE7QTxTLTE7KytBKVA9QS8oUy0xKSxGPWEubGVycChDLE4sUCxkMCksRVt3KytdPUYueCxFW3crK109Ri55LEVbdysrXT1GLno7RVt3KytdPU4ueCxFW3crK109Ti55LEVbdysrXT1OLnp9biYmKExbRC0tXT1DLnosTFtELS1dPUMueSxMW0QtLV09Qy54LExbdisrXT1OLngsTFt2KytdPU4ueSxMW3YrK109Ti56KX1UPU0uUElfT1ZFUl9UV08sQz1jYSgtVCxpLF8sbSx1LGwsYyxwLGQsQyk7bGV0IGo9e307cmV0dXJuIGUmJihFW3crK109Qy54LEVbdysrXT1DLnksRVt3KytdPUMueixqLnBvc2l0aW9ucz1FLGoubnVtUHRzPWcpLG4mJihMW0QtLV09Qy56LExbRC0tXT1DLnksTFtELS1dPUMueCxqLm91dGVyUG9zaXRpb25zPUwpLGp9O2tyPW0wfSk7ZnVuY3Rpb24gVk0odCl7aWYodD14KHQseC5FTVBUWV9PQkpFQ1QpLCFoKHQuZ2VvbWV0cnkpKXRocm93IG5ldyBCKCJvcHRpb25zLmdlb21ldHJ5IGlzIHJlcXVpcmVkLiIpO3RoaXMuZ2VvbWV0cnk9dC5nZW9tZXRyeSx0aGlzLm1vZGVsTWF0cml4PXN0LmNsb25lKHgodC5tb2RlbE1hdHJpeCxzdC5JREVOVElUWSkpLHRoaXMuaWQ9dC5pZCx0aGlzLnBpY2tQcmltaXRpdmU9dC5waWNrUHJpbWl0aXZlLHRoaXMuYXR0cmlidXRlcz14KHQuYXR0cmlidXRlcyx7fSksdGhpcy53ZXN0SGVtaXNwaGVyZUdlb21ldHJ5PXZvaWQgMCx0aGlzLmVhc3RIZW1pc3BoZXJlR2VvbWV0cnk9dm9pZCAwfXZhciBjbyxzYz1aKCgpPT57SXQoKTtmdCgpO0h0KCk7VW4oKTtjbz1WTX0pO2Z1bmN0aW9uIHhUKHQsZSxuKXtsZXQgbz1lLnZlcnRleEZvcm1hdCxyPWUuY2VudGVyLGk9ZS5zZW1pTWFqb3JBeGlzLHM9ZS5zZW1pTWlub3JBeGlzLGY9ZS5lbGxpcHNvaWQsdT1lLnN0Um90YXRpb24sYz1uP3QubGVuZ3RoLzMqMjp0Lmxlbmd0aC8zLGw9ZS5zaGFkb3dWb2x1bWUscD1vLnN0P25ldyBGbG9hdDMyQXJyYXkoYyoyKTp2b2lkIDAsZD1vLm5vcm1hbD9uZXcgRmxvYXQzMkFycmF5KGMqMyk6dm9pZCAwLG09by50YW5nZW50P25ldyBGbG9hdDMyQXJyYXkoYyozKTp2b2lkIDAsXz1vLmJpdGFuZ2VudD9uZXcgRmxvYXQzMkFycmF5KGMqMyk6dm9pZCAwLGc9bD9uZXcgRmxvYXQzMkFycmF5KGMqMyk6dm9pZCAwLGI9MCxUPXdULE89T1QsRT1FVCx3PW5ldyBKbihmKSxDPXcucHJvamVjdChmLmNhcnRlc2lhblRvQ2FydG9ncmFwaGljKHIsWnApLFJUKSxOPWYuc2NhbGVUb0dlb2RldGljU3VyZmFjZShyLGFhKTtmLmdlb2RldGljU3VyZmFjZU5vcm1hbChOLE4pO2xldCBJPVRULEQ9a007aWYodSE9PTApe2xldCBGPWVlLmZyb21BeGlzQW5nbGUoTix1LGcwKTtJPVEuZnJvbVF1YXRlcm5pb24oRixJKSxGPWVlLmZyb21BeGlzQW5nbGUoTiwtdSxnMCksRD1RLmZyb21RdWF0ZXJuaW9uKEYsRCl9ZWxzZSBJPVEuY2xvbmUoUS5JREVOVElUWSxJKSxEPVEuY2xvbmUoUS5JREVOVElUWSxEKTtsZXQgdj10dC5mcm9tRWxlbWVudHMoTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZLE51bWJlci5QT1NJVElWRV9JTkZJTklUWSxTVCksTD10dC5mcm9tRWxlbWVudHMoTnVtYmVyLk5FR0FUSVZFX0lORklOSVRZLE51bWJlci5ORUdBVElWRV9JTkZJTklUWSxDVCksVT10Lmxlbmd0aCxBPW4/VTowLFM9QS8zKjI7Zm9yKGxldCBGPTA7RjxVO0YrPTMpe2xldCBqPUYrMSxIPUYrMixrPWEuZnJvbUFycmF5KHQsRixhYSk7aWYoby5zdCl7bGV0IEs9US5tdWx0aXBseUJ5VmVjdG9yKEksayxfMCksWD13LnByb2plY3QoZi5jYXJ0ZXNpYW5Ub0NhcnRvZ3JhcGhpYyhLLFpwKSx5MCk7YS5zdWJ0cmFjdChYLEMsWCksJG4ueD0oWC54K2kpLygyKmkpLCRuLnk9KFgueStzKS8oMipzKSx2Lng9TWF0aC5taW4oJG4ueCx2LngpLHYueT1NYXRoLm1pbigkbi55LHYueSksTC54PU1hdGgubWF4KCRuLngsTC54KSxMLnk9TWF0aC5tYXgoJG4ueSxMLnkpLG4mJihwW2IrU109JG4ueCxwW2IrMStTXT0kbi55KSxwW2IrK109JG4ueCxwW2IrK109JG4ueX0oby5ub3JtYWx8fG8udGFuZ2VudHx8by5iaXRhbmdlbnR8fGwpJiYoVD1mLmdlb2RldGljU3VyZmFjZU5vcm1hbChrLFQpLGwmJihnW0YrQV09LVQueCxnW2orQV09LVQueSxnW0grQV09LVQueiksKG8ubm9ybWFsfHxvLnRhbmdlbnR8fG8uYml0YW5nZW50KSYmKChvLnRhbmdlbnR8fG8uYml0YW5nZW50KSYmKE89YS5ub3JtYWxpemUoYS5jcm9zcyhhLlVOSVRfWixULE8pLE8pLFEubXVsdGlwbHlCeVZlY3RvcihELE8sTykpLG8ubm9ybWFsJiYoZFtGXT1ULngsZFtqXT1ULnksZFtIXT1ULnosbiYmKGRbRitBXT0tVC54LGRbaitBXT0tVC55LGRbSCtBXT0tVC56KSksby50YW5nZW50JiYobVtGXT1PLngsbVtqXT1PLnksbVtIXT1PLnosbiYmKG1bRitBXT0tTy54LG1baitBXT0tTy55LG1bSCtBXT0tTy56KSksby5iaXRhbmdlbnQmJihFPWEubm9ybWFsaXplKGEuY3Jvc3MoVCxPLEUpLEUpLF9bRl09RS54LF9bal09RS55LF9bSF09RS56LG4mJihfW0YrQV09RS54LF9baitBXT1FLnksX1tIK0FdPUUueikpKSl9aWYoby5zdCl7VT1wLmxlbmd0aDtmb3IobGV0IEY9MDtGPFU7Ris9MilwW0ZdPShwW0ZdLXYueCkvKEwueC12LngpLHBbRisxXT0ocFtGKzFdLXYueSkvKEwueS12LnkpfWxldCBQPW5ldyBpZTtpZihvLnBvc2l0aW9uKXtsZXQgRj1rci5yYWlzZVBvc2l0aW9uc1RvSGVpZ2h0KHQsZSxuKTtQLnBvc2l0aW9uPW5ldyBpdCh7Y29tcG9uZW50RGF0YXR5cGU6bnQuRE9VQkxFLGNvbXBvbmVudHNQZXJBdHRyaWJ1dGU6Myx2YWx1ZXM6Rn0pfWlmKG8uc3QmJihQLnN0PW5ldyBpdCh7Y29tcG9uZW50RGF0YXR5cGU6bnQuRkxPQVQsY29tcG9uZW50c1BlckF0dHJpYnV0ZToyLHZhbHVlczpwfSkpLG8ubm9ybWFsJiYoUC5ub3JtYWw9bmV3IGl0KHtjb21wb25lbnREYXRhdHlwZTpudC5GTE9BVCxjb21wb25lbnRzUGVyQXR0cmlidXRlOjMsdmFsdWVzOmR9KSksby50YW5nZW50JiYoUC50YW5nZW50PW5ldyBpdCh7Y29tcG9uZW50RGF0YXR5cGU6bnQuRkxPQVQsY29tcG9uZW50c1BlckF0dHJpYnV0ZTozLHZhbHVlczptfSkpLG8uYml0YW5nZW50JiYoUC5iaXRhbmdlbnQ9bmV3IGl0KHtjb21wb25lbnREYXRhdHlwZTpudC5GTE9BVCxjb21wb25lbnRzUGVyQXR0cmlidXRlOjMsdmFsdWVzOl99KSksbCYmKFAuZXh0cnVkZURpcmVjdGlvbj1uZXcgaXQoe2NvbXBvbmVudERhdGF0eXBlOm50LkZMT0FULGNvbXBvbmVudHNQZXJBdHRyaWJ1dGU6Myx2YWx1ZXM6Z30pKSxuJiZoKGUub2Zmc2V0QXR0cmlidXRlKSl7bGV0IEY9bmV3IFVpbnQ4QXJyYXkoYyk7aWYoZS5vZmZzZXRBdHRyaWJ1dGU9PT1mZS5UT1ApRj1GLmZpbGwoMSwwLGMvMik7ZWxzZXtsZXQgaj1lLm9mZnNldEF0dHJpYnV0ZT09PWZlLk5PTkU/MDoxO0Y9Ri5maWxsKGopfVAuYXBwbHlPZmZzZXQ9bmV3IGl0KHtjb21wb25lbnREYXRhdHlwZTpudC5VTlNJR05FRF9CWVRFLGNvbXBvbmVudHNQZXJBdHRyaWJ1dGU6MSx2YWx1ZXM6Rn0pfXJldHVybiBQfWZ1bmN0aW9uIFBUKHQpe2xldCBlPW5ldyBBcnJheSgxMioodCoodCsxKSktNiksbj0wLG8scixpLHMsZjtmb3Iobz0wLGk9MSxzPTA7czwzO3MrKyllW24rK109aSsrLGVbbisrXT1vLGVbbisrXT1pO2ZvcihzPTI7czx0KzE7KytzKXtmb3IoaT1zKihzKzEpLTEsbz0ocy0xKSpzLTEsZVtuKytdPWkrKyxlW24rK109byxlW24rK109aSxyPTIqcyxmPTA7ZjxyLTE7KytmKWVbbisrXT1pLGVbbisrXT1vKyssZVtuKytdPW8sZVtuKytdPWkrKyxlW24rK109byxlW24rK109aTtlW24rK109aSsrLGVbbisrXT1vLGVbbisrXT1pfWZvcihyPXQqMiwrK2ksKytvLHM9MDtzPHItMTsrK3MpZVtuKytdPWksZVtuKytdPW8rKyxlW24rK109byxlW24rK109aSsrLGVbbisrXT1vLGVbbisrXT1pO2ZvcihlW24rK109aSxlW24rK109bysrLGVbbisrXT1vLGVbbisrXT1pKyssZVtuKytdPW8rKyxlW24rK109bywrK28scz10LTE7cz4xOy0tcyl7Zm9yKGVbbisrXT1vKyssZVtuKytdPW8sZVtuKytdPWkscj0yKnMsZj0wO2Y8ci0xOysrZillW24rK109aSxlW24rK109bysrLGVbbisrXT1vLGVbbisrXT1pKyssZVtuKytdPW8sZVtuKytdPWk7ZVtuKytdPW8rKyxlW24rK109bysrLGVbbisrXT1pKyt9Zm9yKHM9MDtzPDM7cysrKWVbbisrXT1vKyssZVtuKytdPW8sZVtuKytdPWk7cmV0dXJuIGV9ZnVuY3Rpb24gR00odCl7bGV0IGU9dC5jZW50ZXI7Y2M9YS5tdWx0aXBseUJ5U2NhbGFyKHQuZWxsaXBzb2lkLmdlb2RldGljU3VyZmFjZU5vcm1hbChlLGNjKSx0LmhlaWdodCxjYyksY2M9YS5hZGQoZSxjYyxjYyk7bGV0IG49bmV3IEF0KGNjLHQuc2VtaU1ham9yQXhpcyksbz1rci5jb21wdXRlRWxsaXBzZVBvc2l0aW9ucyh0LCEwLCExKSxyPW8ucG9zaXRpb25zLGk9by5udW1QdHMscz14VChyLHQsITEpLGY9UFQoaSk7cmV0dXJuIGY9RHQuY3JlYXRlVHlwZWRBcnJheShyLmxlbmd0aC8zLGYpLHtib3VuZGluZ1NwaGVyZTpuLGF0dHJpYnV0ZXM6cyxpbmRpY2VzOmZ9fWZ1bmN0aW9uIHpNKHQsZSl7bGV0IG49ZS52ZXJ0ZXhGb3JtYXQsbz1lLmNlbnRlcixyPWUuc2VtaU1ham9yQXhpcyxpPWUuc2VtaU1pbm9yQXhpcyxzPWUuZWxsaXBzb2lkLGY9ZS5oZWlnaHQsdT1lLmV4dHJ1ZGVkSGVpZ2h0LGM9ZS5zdFJvdGF0aW9uLGw9dC5sZW5ndGgvMyoyLHA9bmV3IEZsb2F0NjRBcnJheShsKjMpLGQ9bi5zdD9uZXcgRmxvYXQzMkFycmF5KGwqMik6dm9pZCAwLG09bi5ub3JtYWw/bmV3IEZsb2F0MzJBcnJheShsKjMpOnZvaWQgMCxfPW4udGFuZ2VudD9uZXcgRmxvYXQzMkFycmF5KGwqMyk6dm9pZCAwLGc9bi5iaXRhbmdlbnQ/bmV3IEZsb2F0MzJBcnJheShsKjMpOnZvaWQgMCxiPWUuc2hhZG93Vm9sdW1lLFQ9Yj9uZXcgRmxvYXQzMkFycmF5KGwqMyk6dm9pZCAwLE89MCxFPXdULHc9T1QsQz1FVCxOPW5ldyBKbihzKSxJPU4ucHJvamVjdChzLmNhcnRlc2lhblRvQ2FydG9ncmFwaGljKG8sWnApLFJUKSxEPXMuc2NhbGVUb0dlb2RldGljU3VyZmFjZShvLGFhKTtzLmdlb2RldGljU3VyZmFjZU5vcm1hbChELEQpO2xldCB2PWVlLmZyb21BeGlzQW5nbGUoRCxjLGcwKSxMPVEuZnJvbVF1YXRlcm5pb24odixUVCksVT10dC5mcm9tRWxlbWVudHMoTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZLE51bWJlci5QT1NJVElWRV9JTkZJTklUWSxTVCksQT10dC5mcm9tRWxlbWVudHMoTnVtYmVyLk5FR0FUSVZFX0lORklOSVRZLE51bWJlci5ORUdBVElWRV9JTkZJTklUWSxDVCksUz10Lmxlbmd0aCxQPVMvMyoyO2ZvcihsZXQgaj0wO2o8UztqKz0zKXtsZXQgSD1qKzEsaz1qKzIsSz1hLmZyb21BcnJheSh0LGosYWEpLFg7aWYobi5zdCl7bGV0IG90PVEubXVsdGlwbHlCeVZlY3RvcihMLEssXzApLGF0PU4ucHJvamVjdChzLmNhcnRlc2lhblRvQ2FydG9ncmFwaGljKG90LFpwKSx5MCk7YS5zdWJ0cmFjdChhdCxJLGF0KSwkbi54PShhdC54K3IpLygyKnIpLCRuLnk9KGF0LnkraSkvKDIqaSksVS54PU1hdGgubWluKCRuLngsVS54KSxVLnk9TWF0aC5taW4oJG4ueSxVLnkpLEEueD1NYXRoLm1heCgkbi54LEEueCksQS55PU1hdGgubWF4KCRuLnksQS55KSxkW08rUF09JG4ueCxkW08rMStQXT0kbi55LGRbTysrXT0kbi54LGRbTysrXT0kbi55fUs9cy5zY2FsZVRvR2VvZGV0aWNTdXJmYWNlKEssSyksWD1hLmNsb25lKEssXzApLEU9cy5nZW9kZXRpY1N1cmZhY2VOb3JtYWwoSyxFKSxiJiYoVFtqK1NdPS1FLngsVFtIK1NdPS1FLnksVFtrK1NdPS1FLnopO2xldCBSPWEubXVsdGlwbHlCeVNjYWxhcihFLGYsYlQpO2lmKEs9YS5hZGQoSyxSLEspLFI9YS5tdWx0aXBseUJ5U2NhbGFyKEUsdSxSKSxYPWEuYWRkKFgsUixYKSxuLnBvc2l0aW9uJiYocFtqK1NdPVgueCxwW0grU109WC55LHBbaytTXT1YLnoscFtqXT1LLngscFtIXT1LLnkscFtrXT1LLnopLG4ubm9ybWFsfHxuLnRhbmdlbnR8fG4uYml0YW5nZW50KXtDPWEuY2xvbmUoRSxDKTtsZXQgb3Q9YS5mcm9tQXJyYXkodCwoaiszKSVTLGJUKTthLnN1YnRyYWN0KG90LEssb3QpO2xldCBhdD1hLnN1YnRyYWN0KFgsSyx5MCk7RT1hLm5vcm1hbGl6ZShhLmNyb3NzKGF0LG90LEUpLEUpLG4ubm9ybWFsJiYobVtqXT1FLngsbVtIXT1FLnksbVtrXT1FLnosbVtqK1NdPUUueCxtW0grU109RS55LG1baytTXT1FLnopLG4udGFuZ2VudCYmKHc9YS5ub3JtYWxpemUoYS5jcm9zcyhDLEUsdyksdyksX1tqXT13LngsX1tIXT13LnksX1trXT13LnosX1tqK1NdPXcueCxfW2orMStTXT13LnksX1tqKzIrU109dy56KSxuLmJpdGFuZ2VudCYmKGdbal09Qy54LGdbSF09Qy55LGdba109Qy56LGdbaitTXT1DLngsZ1tIK1NdPUMueSxnW2srU109Qy56KX19aWYobi5zdCl7Uz1kLmxlbmd0aDtmb3IobGV0IGo9MDtqPFM7ais9MilkW2pdPShkW2pdLVUueCkvKEEueC1VLngpLGRbaisxXT0oZFtqKzFdLVUueSkvKEEueS1VLnkpfWxldCBGPW5ldyBpZTtpZihuLnBvc2l0aW9uJiYoRi5wb3NpdGlvbj1uZXcgaXQoe2NvbXBvbmVudERhdGF0eXBlOm50LkRPVUJMRSxjb21wb25lbnRzUGVyQXR0cmlidXRlOjMsdmFsdWVzOnB9KSksbi5zdCYmKEYuc3Q9bmV3IGl0KHtjb21wb25lbnREYXRhdHlwZTpudC5GTE9BVCxjb21wb25lbnRzUGVyQXR0cmlidXRlOjIsdmFsdWVzOmR9KSksbi5ub3JtYWwmJihGLm5vcm1hbD1uZXcgaXQoe2NvbXBvbmVudERhdGF0eXBlOm50LkZMT0FULGNvbXBvbmVudHNQZXJBdHRyaWJ1dGU6Myx2YWx1ZXM6bX0pKSxuLnRhbmdlbnQmJihGLnRhbmdlbnQ9bmV3IGl0KHtjb21wb25lbnREYXRhdHlwZTpudC5GTE9BVCxjb21wb25lbnRzUGVyQXR0cmlidXRlOjMsdmFsdWVzOl99KSksbi5iaXRhbmdlbnQmJihGLmJpdGFuZ2VudD1uZXcgaXQoe2NvbXBvbmVudERhdGF0eXBlOm50LkZMT0FULGNvbXBvbmVudHNQZXJBdHRyaWJ1dGU6Myx2YWx1ZXM6Z30pKSxiJiYoRi5leHRydWRlRGlyZWN0aW9uPW5ldyBpdCh7Y29tcG9uZW50RGF0YXR5cGU6bnQuRkxPQVQsY29tcG9uZW50c1BlckF0dHJpYnV0ZTozLHZhbHVlczpUfSkpLGgoZS5vZmZzZXRBdHRyaWJ1dGUpKXtsZXQgaj1uZXcgVWludDhBcnJheShsKTtpZihlLm9mZnNldEF0dHJpYnV0ZT09PWZlLlRPUClqPWouZmlsbCgxLDAsbC8yKTtlbHNle2xldCBIPWUub2Zmc2V0QXR0cmlidXRlPT09ZmUuTk9ORT8wOjE7aj1qLmZpbGwoSCl9Ri5hcHBseU9mZnNldD1uZXcgaXQoe2NvbXBvbmVudERhdGF0eXBlOm50LlVOU0lHTkVEX0JZVEUsY29tcG9uZW50c1BlckF0dHJpYnV0ZToxLHZhbHVlczpqfSl9cmV0dXJuIEZ9ZnVuY3Rpb24gak0odCl7bGV0IGU9dC5sZW5ndGgvMyxuPUR0LmNyZWF0ZVR5cGVkQXJyYXkoZSxlKjYpLG89MDtmb3IobGV0IHI9MDtyPGU7cisrKXtsZXQgaT1yLHM9citlLGY9KGkrMSklZSx1PWYrZTtuW28rK109aSxuW28rK109cyxuW28rK109ZixuW28rK109ZixuW28rK109cyxuW28rK109dX1yZXR1cm4gbn1mdW5jdGlvbiBITSh0KXtsZXQgZT10LmNlbnRlcixuPXQuZWxsaXBzb2lkLG89dC5zZW1pTWFqb3JBeGlzLHI9YS5tdWx0aXBseUJ5U2NhbGFyKG4uZ2VvZGV0aWNTdXJmYWNlTm9ybWFsKGUsYWEpLHQuaGVpZ2h0LGFhKTtZcC5jZW50ZXI9YS5hZGQoZSxyLFlwLmNlbnRlciksWXAucmFkaXVzPW8scj1hLm11bHRpcGx5QnlTY2FsYXIobi5nZW9kZXRpY1N1cmZhY2VOb3JtYWwoZSxyKSx0LmV4dHJ1ZGVkSGVpZ2h0LHIpLCRwLmNlbnRlcj1hLmFkZChlLHIsJHAuY2VudGVyKSwkcC5yYWRpdXM9bztsZXQgaT1rci5jb21wdXRlRWxsaXBzZVBvc2l0aW9ucyh0LCEwLCEwKSxzPWkucG9zaXRpb25zLGY9aS5udW1QdHMsdT1pLm91dGVyUG9zaXRpb25zLGM9QXQudW5pb24oWXAsJHApLGw9eFQocyx0LCEwKSxwPVBUKGYpLGQ9cC5sZW5ndGg7cC5sZW5ndGg9ZCoyO2xldCBtPXMubGVuZ3RoLzM7Zm9yKGxldCB3PTA7dzxkO3crPTMpcFt3K2RdPXBbdysyXSttLHBbdysxK2RdPXBbdysxXSttLHBbdysyK2RdPXBbd10rbTtsZXQgXz1EdC5jcmVhdGVUeXBlZEFycmF5KG0qMi8zLHApLGc9bmV3IFV0KHthdHRyaWJ1dGVzOmwsaW5kaWNlczpfLHByaW1pdGl2ZVR5cGU6QnQuVFJJQU5HTEVTfSksYj16TSh1LHQpO3A9ak0odSk7bGV0IFQ9RHQuY3JlYXRlVHlwZWRBcnJheSh1Lmxlbmd0aCoyLzMscCksTz1uZXcgVXQoe2F0dHJpYnV0ZXM6YixpbmRpY2VzOlQscHJpbWl0aXZlVHlwZTpCdC5UUklBTkdMRVN9KSxFPVZlLmNvbWJpbmVJbnN0YW5jZXMoW25ldyBjbyh7Z2VvbWV0cnk6Z30pLG5ldyBjbyh7Z2VvbWV0cnk6T30pXSk7cmV0dXJue2JvdW5kaW5nU3BoZXJlOmMsYXR0cmlidXRlczpFWzBdLmF0dHJpYnV0ZXMsaW5kaWNlczpFWzBdLmluZGljZXN9fWZ1bmN0aW9uIE1UKHQsZSxuLG8scixpLHMpe2xldCB1PWtyLmNvbXB1dGVFbGxpcHNlUG9zaXRpb25zKHtjZW50ZXI6dCxzZW1pTWFqb3JBeGlzOmUsc2VtaU1pbm9yQXhpczpuLHJvdGF0aW9uOm8sZ3JhbnVsYXJpdHk6cn0sITEsITApLm91dGVyUG9zaXRpb25zLGM9dS5sZW5ndGgvMyxsPW5ldyBBcnJheShjKTtmb3IobGV0IGQ9MDtkPGM7KytkKWxbZF09YS5mcm9tQXJyYXkodSxkKjMpO2xldCBwPU50LmZyb21DYXJ0ZXNpYW5BcnJheShsLGkscyk7cmV0dXJuIHAud2lkdGg+TS5QSSYmKHAubm9ydGg9cC5ub3J0aD4wP00uUElfT1ZFUl9UV08tTS5FUFNJTE9ONzpwLm5vcnRoLHAuc291dGg9cC5zb3V0aDwwP00uRVBTSUxPTjctTS5QSV9PVkVSX1RXTzpwLnNvdXRoLHAuZWFzdD1NLlBJLHAud2VzdD0tTS5QSSkscH1mdW5jdGlvbiBmaSh0KXt0PXgodCx4LkVNUFRZX09CSkVDVCk7bGV0IGU9dC5jZW50ZXIsbj14KHQuZWxsaXBzb2lkLCQuZGVmYXVsdCksbz10LnNlbWlNYWpvckF4aXMscj10LnNlbWlNaW5vckF4aXMsaT14KHQuZ3JhbnVsYXJpdHksTS5SQURJQU5TX1BFUl9ERUdSRUUpLHM9eCh0LnZlcnRleEZvcm1hdCxkdC5ERUZBVUxUKTtpZih5LmRlZmluZWQoIm9wdGlvbnMuY2VudGVyIixlKSx5LnR5cGVPZi5udW1iZXIoIm9wdGlvbnMuc2VtaU1ham9yQXhpcyIsbykseS50eXBlT2YubnVtYmVyKCJvcHRpb25zLnNlbWlNaW5vckF4aXMiLHIpLG88cil0aHJvdyBuZXcgQigic2VtaU1ham9yQXhpcyBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB0aGUgc2VtaU1pbm9yQXhpcy4iKTtpZihpPD0wKXRocm93IG5ldyBCKCJncmFudWxhcml0eSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiB6ZXJvLiIpO2xldCBmPXgodC5oZWlnaHQsMCksdT14KHQuZXh0cnVkZWRIZWlnaHQsZik7dGhpcy5fY2VudGVyPWEuY2xvbmUoZSksdGhpcy5fc2VtaU1ham9yQXhpcz1vLHRoaXMuX3NlbWlNaW5vckF4aXM9cix0aGlzLl9lbGxpcHNvaWQ9JC5jbG9uZShuKSx0aGlzLl9yb3RhdGlvbj14KHQucm90YXRpb24sMCksdGhpcy5fc3RSb3RhdGlvbj14KHQuc3RSb3RhdGlvbiwwKSx0aGlzLl9oZWlnaHQ9TWF0aC5tYXgodSxmKSx0aGlzLl9ncmFudWxhcml0eT1pLHRoaXMuX3ZlcnRleEZvcm1hdD1kdC5jbG9uZShzKSx0aGlzLl9leHRydWRlZEhlaWdodD1NYXRoLm1pbih1LGYpLHRoaXMuX3NoYWRvd1ZvbHVtZT14KHQuc2hhZG93Vm9sdW1lLCExKSx0aGlzLl93b3JrZXJOYW1lPSJjcmVhdGVFbGxpcHNlR2VvbWV0cnkiLHRoaXMuX29mZnNldEF0dHJpYnV0ZT10Lm9mZnNldEF0dHJpYnV0ZSx0aGlzLl9yZWN0YW5nbGU9dm9pZCAwLHRoaXMuX3RleHR1cmVDb29yZGluYXRlUm90YXRpb25Qb2ludHM9dm9pZCAwfWZ1bmN0aW9uIHFNKHQpe2xldCBlPS10Ll9zdFJvdGF0aW9uO2lmKGU9PT0wKXJldHVyblswLDAsMCwxLDEsMF07bGV0IG89a3IuY29tcHV0ZUVsbGlwc2VQb3NpdGlvbnMoe2NlbnRlcjp0Ll9jZW50ZXIsc2VtaU1ham9yQXhpczp0Ll9zZW1pTWFqb3JBeGlzLHNlbWlNaW5vckF4aXM6dC5fc2VtaU1pbm9yQXhpcyxyb3RhdGlvbjp0Ll9yb3RhdGlvbixncmFudWxhcml0eTp0Ll9ncmFudWxhcml0eX0sITEsITApLm91dGVyUG9zaXRpb25zLHI9by5sZW5ndGgvMyxpPW5ldyBBcnJheShyKTtmb3IobGV0IHU9MDt1PHI7Kyt1KWlbdV09YS5mcm9tQXJyYXkobyx1KjMpO2xldCBzPXQuX2VsbGlwc29pZCxmPXQucmVjdGFuZ2xlO3JldHVybiBVdC5fdGV4dHVyZUNvb3JkaW5hdGVSb3RhdGlvblBvaW50cyhpLGUscyxmKX12YXIgYWEsXzAseTAsYlQsJG4sVFQsa00sZzAsd1QsT1QsRVQsWnAsUlQsU1QsQ1QsY2MsWXAsJHAsTlQsSVQsdlQsYWksR3IsQTA9WigoKT0+e3ZlKCk7VWUoKTtGdCgpO0llKCk7WHQoKTtGZSgpO0l0KCk7ZnQoKTtIdCgpO2gwKCk7WnQoKTtTaSgpO1hlKCk7WWUoKTthbigpO3NjKCk7TG8oKTtzaSgpOyRlKCk7V3QoKTtCbigpO3RuKCk7S28oKTt3bigpO1JvKCk7YWE9bmV3IGEsXzA9bmV3IGEseTA9bmV3IGEsYlQ9bmV3IGEsJG49bmV3IHR0LFRUPW5ldyBRLGtNPW5ldyBRLGcwPW5ldyBlZSx3VD1uZXcgYSxPVD1uZXcgYSxFVD1uZXcgYSxacD1uZXcgY3QsUlQ9bmV3IGEsU1Q9bmV3IHR0LENUPW5ldyB0dDtjYz1uZXcgYTtZcD1uZXcgQXQsJHA9bmV3IEF0O2ZpLnBhY2tlZExlbmd0aD1hLnBhY2tlZExlbmd0aCskLnBhY2tlZExlbmd0aCtkdC5wYWNrZWRMZW5ndGgrOTtmaS5wYWNrPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4geS5kZWZpbmVkKCJ2YWx1ZSIsdCkseS5kZWZpbmVkKCJhcnJheSIsZSksbj14KG4sMCksYS5wYWNrKHQuX2NlbnRlcixlLG4pLG4rPWEucGFja2VkTGVuZ3RoLCQucGFjayh0Ll9lbGxpcHNvaWQsZSxuKSxuKz0kLnBhY2tlZExlbmd0aCxkdC5wYWNrKHQuX3ZlcnRleEZvcm1hdCxlLG4pLG4rPWR0LnBhY2tlZExlbmd0aCxlW24rK109dC5fc2VtaU1ham9yQXhpcyxlW24rK109dC5fc2VtaU1pbm9yQXhpcyxlW24rK109dC5fcm90YXRpb24sZVtuKytdPXQuX3N0Um90YXRpb24sZVtuKytdPXQuX2hlaWdodCxlW24rK109dC5fZ3JhbnVsYXJpdHksZVtuKytdPXQuX2V4dHJ1ZGVkSGVpZ2h0LGVbbisrXT10Ll9zaGFkb3dWb2x1bWU/MTowLGVbbl09eCh0Ll9vZmZzZXRBdHRyaWJ1dGUsLTEpLGV9O05UPW5ldyBhLElUPW5ldyAkLHZUPW5ldyBkdCxhaT17Y2VudGVyOk5ULGVsbGlwc29pZDpJVCx2ZXJ0ZXhGb3JtYXQ6dlQsc2VtaU1ham9yQXhpczp2b2lkIDAsc2VtaU1pbm9yQXhpczp2b2lkIDAscm90YXRpb246dm9pZCAwLHN0Um90YXRpb246dm9pZCAwLGhlaWdodDp2b2lkIDAsZ3JhbnVsYXJpdHk6dm9pZCAwLGV4dHJ1ZGVkSGVpZ2h0OnZvaWQgMCxzaGFkb3dWb2x1bWU6dm9pZCAwLG9mZnNldEF0dHJpYnV0ZTp2b2lkIDB9O2ZpLnVucGFjaz1mdW5jdGlvbih0LGUsbil7eS5kZWZpbmVkKCJhcnJheSIsdCksZT14KGUsMCk7bGV0IG89YS51bnBhY2sodCxlLE5UKTtlKz1hLnBhY2tlZExlbmd0aDtsZXQgcj0kLnVucGFjayh0LGUsSVQpO2UrPSQucGFja2VkTGVuZ3RoO2xldCBpPWR0LnVucGFjayh0LGUsdlQpO2UrPWR0LnBhY2tlZExlbmd0aDtsZXQgcz10W2UrK10sZj10W2UrK10sdT10W2UrK10sYz10W2UrK10sbD10W2UrK10scD10W2UrK10sZD10W2UrK10sbT10W2UrK109PT0xLF89dFtlXTtyZXR1cm4gaChuKT8obi5fY2VudGVyPWEuY2xvbmUobyxuLl9jZW50ZXIpLG4uX2VsbGlwc29pZD0kLmNsb25lKHIsbi5fZWxsaXBzb2lkKSxuLl92ZXJ0ZXhGb3JtYXQ9ZHQuY2xvbmUoaSxuLl92ZXJ0ZXhGb3JtYXQpLG4uX3NlbWlNYWpvckF4aXM9cyxuLl9zZW1pTWlub3JBeGlzPWYsbi5fcm90YXRpb249dSxuLl9zdFJvdGF0aW9uPWMsbi5faGVpZ2h0PWwsbi5fZ3JhbnVsYXJpdHk9cCxuLl9leHRydWRlZEhlaWdodD1kLG4uX3NoYWRvd1ZvbHVtZT1tLG4uX29mZnNldEF0dHJpYnV0ZT1fPT09LTE/dm9pZCAwOl8sbik6KGFpLmhlaWdodD1sLGFpLmV4dHJ1ZGVkSGVpZ2h0PWQsYWkuZ3JhbnVsYXJpdHk9cCxhaS5zdFJvdGF0aW9uPWMsYWkucm90YXRpb249dSxhaS5zZW1pTWFqb3JBeGlzPXMsYWkuc2VtaU1pbm9yQXhpcz1mLGFpLnNoYWRvd1ZvbHVtZT1tLGFpLm9mZnNldEF0dHJpYnV0ZT1fPT09LTE/dm9pZCAwOl8sbmV3IGZpKGFpKSl9O2ZpLmNvbXB1dGVSZWN0YW5nbGU9ZnVuY3Rpb24odCxlKXt0PXgodCx4LkVNUFRZX09CSkVDVCk7bGV0IG49dC5jZW50ZXIsbz14KHQuZWxsaXBzb2lkLCQuZGVmYXVsdCkscj10LnNlbWlNYWpvckF4aXMsaT10LnNlbWlNaW5vckF4aXMscz14KHQuZ3JhbnVsYXJpdHksTS5SQURJQU5TX1BFUl9ERUdSRUUpLGY9eCh0LnJvdGF0aW9uLDApO2lmKHkuZGVmaW5lZCgib3B0aW9ucy5jZW50ZXIiLG4pLHkudHlwZU9mLm51bWJlcigib3B0aW9ucy5zZW1pTWFqb3JBeGlzIixyKSx5LnR5cGVPZi5udW1iZXIoIm9wdGlvbnMuc2VtaU1pbm9yQXhpcyIsaSkscjxpKXRocm93IG5ldyBCKCJzZW1pTWFqb3JBeGlzIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHRoZSBzZW1pTWlub3JBeGlzLiIpO2lmKHM8PTApdGhyb3cgbmV3IEIoImdyYW51bGFyaXR5IG11c3QgYmUgZ3JlYXRlciB0aGFuIHplcm8uIik7cmV0dXJuIE1UKG4scixpLGYscyxvLGUpfTtmaS5jcmVhdGVHZW9tZXRyeT1mdW5jdGlvbih0KXtpZih0Ll9zZW1pTWFqb3JBeGlzPD0wfHx0Ll9zZW1pTWlub3JBeGlzPD0wKXJldHVybjtsZXQgZT10Ll9oZWlnaHQsbj10Ll9leHRydWRlZEhlaWdodCxvPSFNLmVxdWFsc0Vwc2lsb24oZSxuLDAsTS5FUFNJTE9OMik7dC5fY2VudGVyPXQuX2VsbGlwc29pZC5zY2FsZVRvR2VvZGV0aWNTdXJmYWNlKHQuX2NlbnRlcix0Ll9jZW50ZXIpO2xldCByPXtjZW50ZXI6dC5fY2VudGVyLHNlbWlNYWpvckF4aXM6dC5fc2VtaU1ham9yQXhpcyxzZW1pTWlub3JBeGlzOnQuX3NlbWlNaW5vckF4aXMsZWxsaXBzb2lkOnQuX2VsbGlwc29pZCxyb3RhdGlvbjp0Ll9yb3RhdGlvbixoZWlnaHQ6ZSxncmFudWxhcml0eTp0Ll9ncmFudWxhcml0eSx2ZXJ0ZXhGb3JtYXQ6dC5fdmVydGV4Rm9ybWF0LHN0Um90YXRpb246dC5fc3RSb3RhdGlvbn0saTtpZihvKXIuZXh0cnVkZWRIZWlnaHQ9bixyLnNoYWRvd1ZvbHVtZT10Ll9zaGFkb3dWb2x1bWUsci5vZmZzZXRBdHRyaWJ1dGU9dC5fb2Zmc2V0QXR0cmlidXRlLGk9SE0ocik7ZWxzZSBpZihpPUdNKHIpLGgodC5fb2Zmc2V0QXR0cmlidXRlKSl7bGV0IHM9aS5hdHRyaWJ1dGVzLnBvc2l0aW9uLnZhbHVlcy5sZW5ndGgsZj10Ll9vZmZzZXRBdHRyaWJ1dGU9PT1mZS5OT05FPzA6MSx1PW5ldyBVaW50OEFycmF5KHMvMykuZmlsbChmKTtpLmF0dHJpYnV0ZXMuYXBwbHlPZmZzZXQ9bmV3IGl0KHtjb21wb25lbnREYXRhdHlwZTpudC5VTlNJR05FRF9CWVRFLGNvbXBvbmVudHNQZXJBdHRyaWJ1dGU6MSx2YWx1ZXM6dX0pfXJldHVybiBuZXcgVXQoe2F0dHJpYnV0ZXM6aS5hdHRyaWJ1dGVzLGluZGljZXM6aS5pbmRpY2VzLHByaW1pdGl2ZVR5cGU6QnQuVFJJQU5HTEVTLGJvdW5kaW5nU3BoZXJlOmkuYm91bmRpbmdTcGhlcmUsb2Zmc2V0QXR0cmlidXRlOnQuX29mZnNldEF0dHJpYnV0ZX0pfTtmaS5jcmVhdGVTaGFkb3dWb2x1bWU9ZnVuY3Rpb24odCxlLG4pe2xldCBvPXQuX2dyYW51bGFyaXR5LHI9dC5fZWxsaXBzb2lkLGk9ZShvLHIpLHM9bihvLHIpO3JldHVybiBuZXcgZmkoe2NlbnRlcjp0Ll9jZW50ZXIsc2VtaU1ham9yQXhpczp0Ll9zZW1pTWFqb3JBeGlzLHNlbWlNaW5vckF4aXM6dC5fc2VtaU1pbm9yQXhpcyxlbGxpcHNvaWQ6cixyb3RhdGlvbjp0Ll9yb3RhdGlvbixzdFJvdGF0aW9uOnQuX3N0Um90YXRpb24sZ3JhbnVsYXJpdHk6byxleHRydWRlZEhlaWdodDppLGhlaWdodDpzLHZlcnRleEZvcm1hdDpkdC5QT1NJVElPTl9PTkxZLHNoYWRvd1ZvbHVtZTohMH0pfTtPYmplY3QuZGVmaW5lUHJvcGVydGllcyhmaS5wcm90b3R5cGUse3JlY3RhbmdsZTp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGgodGhpcy5fcmVjdGFuZ2xlKXx8KHRoaXMuX3JlY3RhbmdsZT1NVCh0aGlzLl9jZW50ZXIsdGhpcy5fc2VtaU1ham9yQXhpcyx0aGlzLl9zZW1pTWlub3JBeGlzLHRoaXMuX3JvdGF0aW9uLHRoaXMuX2dyYW51bGFyaXR5LHRoaXMuX2VsbGlwc29pZCkpLHRoaXMuX3JlY3RhbmdsZX19LHRleHR1cmVDb29yZGluYXRlUm90YXRpb25Qb2ludHM6e2dldDpmdW5jdGlvbigpe3JldHVybiBoKHRoaXMuX3RleHR1cmVDb29yZGluYXRlUm90YXRpb25Qb2ludHMpfHwodGhpcy5fdGV4dHVyZUNvb3JkaW5hdGVSb3RhdGlvblBvaW50cz1xTSh0aGlzKSksdGhpcy5fdGV4dHVyZUNvb3JkaW5hdGVSb3RhdGlvblBvaW50c319fSk7R3I9Zml9KTtmdW5jdGlvbiB2aSh0KXt0PXgodCx4LkVNUFRZX09CSkVDVCk7bGV0IGU9dC5yYWRpdXM7eS50eXBlT2YubnVtYmVyKCJyYWRpdXMiLGUpO2xldCBuPXtjZW50ZXI6dC5jZW50ZXIsc2VtaU1ham9yQXhpczplLHNlbWlNaW5vckF4aXM6ZSxlbGxpcHNvaWQ6dC5lbGxpcHNvaWQsaGVpZ2h0OnQuaGVpZ2h0LGV4dHJ1ZGVkSGVpZ2h0OnQuZXh0cnVkZWRIZWlnaHQsZ3JhbnVsYXJpdHk6dC5ncmFudWxhcml0eSx2ZXJ0ZXhGb3JtYXQ6dC52ZXJ0ZXhGb3JtYXQsc3RSb3RhdGlvbjp0LnN0Um90YXRpb24sc2hhZG93Vm9sdW1lOnQuc2hhZG93Vm9sdW1lfTt0aGlzLl9lbGxpcHNlR2VvbWV0cnk9bmV3IEdyKG4pLHRoaXMuX3dvcmtlck5hbWU9ImNyZWF0ZUNpcmNsZUdlb21ldHJ5In12YXIgTFQsX28sYjAsRFQ9WigoKT0+e0Z0KCk7WHQoKTtJdCgpO2Z0KCk7QTAoKTtadCgpO1JvKCk7dmkucGFja2VkTGVuZ3RoPUdyLnBhY2tlZExlbmd0aDt2aS5wYWNrPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4geS50eXBlT2Yub2JqZWN0KCJ2YWx1ZSIsdCksR3IucGFjayh0Ll9lbGxpcHNlR2VvbWV0cnksZSxuKX07TFQ9bmV3IEdyKHtjZW50ZXI6bmV3IGEsc2VtaU1ham9yQXhpczoxLHNlbWlNaW5vckF4aXM6MX0pLF9vPXtjZW50ZXI6bmV3IGEscmFkaXVzOnZvaWQgMCxlbGxpcHNvaWQ6JC5jbG9uZSgkLmRlZmF1bHQpLGhlaWdodDp2b2lkIDAsZXh0cnVkZWRIZWlnaHQ6dm9pZCAwLGdyYW51bGFyaXR5OnZvaWQgMCx2ZXJ0ZXhGb3JtYXQ6bmV3IGR0LHN0Um90YXRpb246dm9pZCAwLHNlbWlNYWpvckF4aXM6dm9pZCAwLHNlbWlNaW5vckF4aXM6dm9pZCAwLHNoYWRvd1ZvbHVtZTp2b2lkIDB9O3ZpLnVucGFjaz1mdW5jdGlvbih0LGUsbil7bGV0IG89R3IudW5wYWNrKHQsZSxMVCk7cmV0dXJuIF9vLmNlbnRlcj1hLmNsb25lKG8uX2NlbnRlcixfby5jZW50ZXIpLF9vLmVsbGlwc29pZD0kLmNsb25lKG8uX2VsbGlwc29pZCxfby5lbGxpcHNvaWQpLF9vLmVsbGlwc29pZD0kLmNsb25lKG8uX2VsbGlwc29pZCxMVC5fZWxsaXBzb2lkKSxfby5oZWlnaHQ9by5faGVpZ2h0LF9vLmV4dHJ1ZGVkSGVpZ2h0PW8uX2V4dHJ1ZGVkSGVpZ2h0LF9vLmdyYW51bGFyaXR5PW8uX2dyYW51bGFyaXR5LF9vLnZlcnRleEZvcm1hdD1kdC5jbG9uZShvLl92ZXJ0ZXhGb3JtYXQsX28udmVydGV4Rm9ybWF0KSxfby5zdFJvdGF0aW9uPW8uX3N0Um90YXRpb24sX28uc2hhZG93Vm9sdW1lPW8uX3NoYWRvd1ZvbHVtZSxoKG4pPyhfby5zZW1pTWFqb3JBeGlzPW8uX3NlbWlNYWpvckF4aXMsX28uc2VtaU1pbm9yQXhpcz1vLl9zZW1pTWlub3JBeGlzLG4uX2VsbGlwc2VHZW9tZXRyeT1uZXcgR3IoX28pLG4pOihfby5yYWRpdXM9by5fc2VtaU1ham9yQXhpcyxuZXcgdmkoX28pKX07dmkuY3JlYXRlR2VvbWV0cnk9ZnVuY3Rpb24odCl7cmV0dXJuIEdyLmNyZWF0ZUdlb21ldHJ5KHQuX2VsbGlwc2VHZW9tZXRyeSl9O3ZpLmNyZWF0ZVNoYWRvd1ZvbHVtZT1mdW5jdGlvbih0LGUsbil7bGV0IG89dC5fZWxsaXBzZUdlb21ldHJ5Ll9ncmFudWxhcml0eSxyPXQuX2VsbGlwc2VHZW9tZXRyeS5fZWxsaXBzb2lkLGk9ZShvLHIpLHM9bihvLHIpO3JldHVybiBuZXcgdmkoe2NlbnRlcjp0Ll9lbGxpcHNlR2VvbWV0cnkuX2NlbnRlcixyYWRpdXM6dC5fZWxsaXBzZUdlb21ldHJ5Ll9zZW1pTWFqb3JBeGlzLGVsbGlwc29pZDpyLHN0Um90YXRpb246dC5fZWxsaXBzZUdlb21ldHJ5Ll9zdFJvdGF0aW9uLGdyYW51bGFyaXR5Om8sZXh0cnVkZWRIZWlnaHQ6aSxoZWlnaHQ6cyx2ZXJ0ZXhGb3JtYXQ6ZHQuUE9TSVRJT05fT05MWSxzaGFkb3dWb2x1bWU6ITB9KX07T2JqZWN0LmRlZmluZVByb3BlcnRpZXModmkucHJvdG90eXBlLHtyZWN0YW5nbGU6e2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9lbGxpcHNlR2VvbWV0cnkucmVjdGFuZ2xlfX0sdGV4dHVyZUNvb3JkaW5hdGVSb3RhdGlvblBvaW50czp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2VsbGlwc2VHZW9tZXRyeS50ZXh0dXJlQ29vcmRpbmF0ZVJvdGF0aW9uUG9pbnRzfX19KTtiMD12aX0pO3ZhciBUMD17fTtkZShUMCx7ZGVmYXVsdDooKT0+V019KTtmdW5jdGlvbiBLTSh0LGUpe3JldHVybiBoKGUpJiYodD1iMC51bnBhY2sodCxlKSksdC5fZWxsaXBzZUdlb21ldHJ5Ll9jZW50ZXI9YS5jbG9uZSh0Ll9lbGxpcHNlR2VvbWV0cnkuX2NlbnRlciksdC5fZWxsaXBzZUdlb21ldHJ5Ll9lbGxpcHNvaWQ9JC5jbG9uZSh0Ll9lbGxpcHNlR2VvbWV0cnkuX2VsbGlwc29pZCksYjAuY3JlYXRlR2VvbWV0cnkodCl9dmFyIFdNLHcwPVooKCk9PntGdCgpO0RUKCk7ZnQoKTtadCgpO1dNPUtNfSk7ZnVuY3Rpb24gWE0odCl7bGV0IGU9dC5jZW50ZXI7YWM9YS5tdWx0aXBseUJ5U2NhbGFyKHQuZWxsaXBzb2lkLmdlb2RldGljU3VyZmFjZU5vcm1hbChlLGFjKSx0LmhlaWdodCxhYyksYWM9YS5hZGQoZSxhYyxhYyk7bGV0IG49bmV3IEF0KGFjLHQuc2VtaU1ham9yQXhpcyksbz1rci5jb21wdXRlRWxsaXBzZVBvc2l0aW9ucyh0LCExLCEwKS5vdXRlclBvc2l0aW9ucyxyPW5ldyBpZSh7cG9zaXRpb246bmV3IGl0KHtjb21wb25lbnREYXRhdHlwZTpudC5ET1VCTEUsY29tcG9uZW50c1BlckF0dHJpYnV0ZTozLHZhbHVlczprci5yYWlzZVBvc2l0aW9uc1RvSGVpZ2h0KG8sdCwhMSl9KX0pLGk9by5sZW5ndGgvMyxzPUR0LmNyZWF0ZVR5cGVkQXJyYXkoaSxpKjIpLGY9MDtmb3IobGV0IHU9MDt1PGk7Kyt1KXNbZisrXT11LHNbZisrXT0odSsxKSVpO3JldHVybntib3VuZGluZ1NwaGVyZTpuLGF0dHJpYnV0ZXM6cixpbmRpY2VzOnN9fWZ1bmN0aW9uIFlNKHQpe2xldCBlPXQuY2VudGVyLG49dC5lbGxpcHNvaWQsbz10LnNlbWlNYWpvckF4aXMscj1hLm11bHRpcGx5QnlTY2FsYXIobi5nZW9kZXRpY1N1cmZhY2VOb3JtYWwoZSxGVCksdC5oZWlnaHQsRlQpO1FwLmNlbnRlcj1hLmFkZChlLHIsUXAuY2VudGVyKSxRcC5yYWRpdXM9byxyPWEubXVsdGlwbHlCeVNjYWxhcihuLmdlb2RldGljU3VyZmFjZU5vcm1hbChlLHIpLHQuZXh0cnVkZWRIZWlnaHQsciksSnAuY2VudGVyPWEuYWRkKGUscixKcC5jZW50ZXIpLEpwLnJhZGl1cz1vO2xldCBpPWtyLmNvbXB1dGVFbGxpcHNlUG9zaXRpb25zKHQsITEsITApLm91dGVyUG9zaXRpb25zLHM9bmV3IGllKHtwb3NpdGlvbjpuZXcgaXQoe2NvbXBvbmVudERhdGF0eXBlOm50LkRPVUJMRSxjb21wb25lbnRzUGVyQXR0cmlidXRlOjMsdmFsdWVzOmtyLnJhaXNlUG9zaXRpb25zVG9IZWlnaHQoaSx0LCEwKX0pfSk7aT1zLnBvc2l0aW9uLnZhbHVlcztsZXQgZj1BdC51bmlvbihRcCxKcCksdT1pLmxlbmd0aC8zO2lmKGgodC5vZmZzZXRBdHRyaWJ1dGUpKXtsZXQgXz1uZXcgVWludDhBcnJheSh1KTtpZih0Lm9mZnNldEF0dHJpYnV0ZT09PWZlLlRPUClfPV8uZmlsbCgxLDAsdS8yKTtlbHNle2xldCBnPXQub2Zmc2V0QXR0cmlidXRlPT09ZmUuTk9ORT8wOjE7Xz1fLmZpbGwoZyl9cy5hcHBseU9mZnNldD1uZXcgaXQoe2NvbXBvbmVudERhdGF0eXBlOm50LlVOU0lHTkVEX0JZVEUsY29tcG9uZW50c1BlckF0dHJpYnV0ZToxLHZhbHVlczpffSl9bGV0IGM9eCh0Lm51bWJlck9mVmVydGljYWxMaW5lcywxNik7Yz1NLmNsYW1wKGMsMCx1LzIpO2xldCBsPUR0LmNyZWF0ZVR5cGVkQXJyYXkodSx1KjIrYyoyKTt1Lz0yO2xldCBwPTAsZDtmb3IoZD0wO2Q8dTsrK2QpbFtwKytdPWQsbFtwKytdPShkKzEpJXUsbFtwKytdPWQrdSxsW3ArK109KGQrMSkldSt1O2xldCBtO2lmKGM+MCl7bGV0IF89TWF0aC5taW4oYyx1KTttPU1hdGgucm91bmQodS9fKTtsZXQgZz1NYXRoLm1pbihtKmMsdSk7Zm9yKGQ9MDtkPGc7ZCs9bSlsW3ArK109ZCxsW3ArK109ZCt1fXJldHVybntib3VuZGluZ1NwaGVyZTpmLGF0dHJpYnV0ZXM6cyxpbmRpY2VzOmx9fWZ1bmN0aW9uIGZhKHQpe3Q9eCh0LHguRU1QVFlfT0JKRUNUKTtsZXQgZT10LmNlbnRlcixuPXgodC5lbGxpcHNvaWQsJC5kZWZhdWx0KSxvPXQuc2VtaU1ham9yQXhpcyxyPXQuc2VtaU1pbm9yQXhpcyxpPXgodC5ncmFudWxhcml0eSxNLlJBRElBTlNfUEVSX0RFR1JFRSk7aWYoIWgoZSkpdGhyb3cgbmV3IEIoImNlbnRlciBpcyByZXF1aXJlZC4iKTtpZighaChvKSl0aHJvdyBuZXcgQigic2VtaU1ham9yQXhpcyBpcyByZXF1aXJlZC4iKTtpZighaChyKSl0aHJvdyBuZXcgQigic2VtaU1pbm9yQXhpcyBpcyByZXF1aXJlZC4iKTtpZihvPHIpdGhyb3cgbmV3IEIoInNlbWlNYWpvckF4aXMgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gdGhlIHNlbWlNaW5vckF4aXMuIik7aWYoaTw9MCl0aHJvdyBuZXcgQigiZ3JhbnVsYXJpdHkgbXVzdCBiZSBncmVhdGVyIHRoYW4gemVyby4iKTtsZXQgcz14KHQuaGVpZ2h0LDApLGY9eCh0LmV4dHJ1ZGVkSGVpZ2h0LHMpO3RoaXMuX2NlbnRlcj1hLmNsb25lKGUpLHRoaXMuX3NlbWlNYWpvckF4aXM9byx0aGlzLl9zZW1pTWlub3JBeGlzPXIsdGhpcy5fZWxsaXBzb2lkPSQuY2xvbmUobiksdGhpcy5fcm90YXRpb249eCh0LnJvdGF0aW9uLDApLHRoaXMuX2hlaWdodD1NYXRoLm1heChmLHMpLHRoaXMuX2dyYW51bGFyaXR5PWksdGhpcy5fZXh0cnVkZWRIZWlnaHQ9TWF0aC5taW4oZixzKSx0aGlzLl9udW1iZXJPZlZlcnRpY2FsTGluZXM9TWF0aC5tYXgoeCh0Lm51bWJlck9mVmVydGljYWxMaW5lcywxNiksMCksdGhpcy5fb2Zmc2V0QXR0cmlidXRlPXQub2Zmc2V0QXR0cmlidXRlLHRoaXMuX3dvcmtlck5hbWU9ImNyZWF0ZUVsbGlwc2VPdXRsaW5lR2VvbWV0cnkifXZhciBGVCxhYyxRcCxKcCxCVCxVVCxMaSx6cixPMD1aKCgpPT57dmUoKTtGdCgpO0ZlKCk7SXQoKTtmdCgpO0h0KCk7aDAoKTtadCgpO1hlKCk7WWUoKTthbigpO0xvKCk7JGUoKTtXdCgpO3RuKCk7RlQ9bmV3IGEsYWM9bmV3IGE7UXA9bmV3IEF0LEpwPW5ldyBBdDtmYS5wYWNrZWRMZW5ndGg9YS5wYWNrZWRMZW5ndGgrJC5wYWNrZWRMZW5ndGgrODtmYS5wYWNrPWZ1bmN0aW9uKHQsZSxuKXtpZighaCh0KSl0aHJvdyBuZXcgQigidmFsdWUgaXMgcmVxdWlyZWQiKTtpZighaChlKSl0aHJvdyBuZXcgQigiYXJyYXkgaXMgcmVxdWlyZWQiKTtyZXR1cm4gbj14KG4sMCksYS5wYWNrKHQuX2NlbnRlcixlLG4pLG4rPWEucGFja2VkTGVuZ3RoLCQucGFjayh0Ll9lbGxpcHNvaWQsZSxuKSxuKz0kLnBhY2tlZExlbmd0aCxlW24rK109dC5fc2VtaU1ham9yQXhpcyxlW24rK109dC5fc2VtaU1pbm9yQXhpcyxlW24rK109dC5fcm90YXRpb24sZVtuKytdPXQuX2hlaWdodCxlW24rK109dC5fZ3JhbnVsYXJpdHksZVtuKytdPXQuX2V4dHJ1ZGVkSGVpZ2h0LGVbbisrXT10Ll9udW1iZXJPZlZlcnRpY2FsTGluZXMsZVtuXT14KHQuX29mZnNldEF0dHJpYnV0ZSwtMSksZX07QlQ9bmV3IGEsVVQ9bmV3ICQsTGk9e2NlbnRlcjpCVCxlbGxpcHNvaWQ6VVQsc2VtaU1ham9yQXhpczp2b2lkIDAsc2VtaU1pbm9yQXhpczp2b2lkIDAscm90YXRpb246dm9pZCAwLGhlaWdodDp2b2lkIDAsZ3JhbnVsYXJpdHk6dm9pZCAwLGV4dHJ1ZGVkSGVpZ2h0OnZvaWQgMCxudW1iZXJPZlZlcnRpY2FsTGluZXM6dm9pZCAwLG9mZnNldEF0dHJpYnV0ZTp2b2lkIDB9O2ZhLnVucGFjaz1mdW5jdGlvbih0LGUsbil7aWYoIWgodCkpdGhyb3cgbmV3IEIoImFycmF5IGlzIHJlcXVpcmVkIik7ZT14KGUsMCk7bGV0IG89YS51bnBhY2sodCxlLEJUKTtlKz1hLnBhY2tlZExlbmd0aDtsZXQgcj0kLnVucGFjayh0LGUsVVQpO2UrPSQucGFja2VkTGVuZ3RoO2xldCBpPXRbZSsrXSxzPXRbZSsrXSxmPXRbZSsrXSx1PXRbZSsrXSxjPXRbZSsrXSxsPXRbZSsrXSxwPXRbZSsrXSxkPXRbZV07cmV0dXJuIGgobik/KG4uX2NlbnRlcj1hLmNsb25lKG8sbi5fY2VudGVyKSxuLl9lbGxpcHNvaWQ9JC5jbG9uZShyLG4uX2VsbGlwc29pZCksbi5fc2VtaU1ham9yQXhpcz1pLG4uX3NlbWlNaW5vckF4aXM9cyxuLl9yb3RhdGlvbj1mLG4uX2hlaWdodD11LG4uX2dyYW51bGFyaXR5PWMsbi5fZXh0cnVkZWRIZWlnaHQ9bCxuLl9udW1iZXJPZlZlcnRpY2FsTGluZXM9cCxuLl9vZmZzZXRBdHRyaWJ1dGU9ZD09PS0xP3ZvaWQgMDpkLG4pOihMaS5oZWlnaHQ9dSxMaS5leHRydWRlZEhlaWdodD1sLExpLmdyYW51bGFyaXR5PWMsTGkucm90YXRpb249ZixMaS5zZW1pTWFqb3JBeGlzPWksTGkuc2VtaU1pbm9yQXhpcz1zLExpLm51bWJlck9mVmVydGljYWxMaW5lcz1wLExpLm9mZnNldEF0dHJpYnV0ZT1kPT09LTE/dm9pZCAwOmQsbmV3IGZhKExpKSl9O2ZhLmNyZWF0ZUdlb21ldHJ5PWZ1bmN0aW9uKHQpe2lmKHQuX3NlbWlNYWpvckF4aXM8PTB8fHQuX3NlbWlNaW5vckF4aXM8PTApcmV0dXJuO2xldCBlPXQuX2hlaWdodCxuPXQuX2V4dHJ1ZGVkSGVpZ2h0LG89IU0uZXF1YWxzRXBzaWxvbihlLG4sMCxNLkVQU0lMT04yKTt0Ll9jZW50ZXI9dC5fZWxsaXBzb2lkLnNjYWxlVG9HZW9kZXRpY1N1cmZhY2UodC5fY2VudGVyLHQuX2NlbnRlcik7bGV0IHI9e2NlbnRlcjp0Ll9jZW50ZXIsc2VtaU1ham9yQXhpczp0Ll9zZW1pTWFqb3JBeGlzLHNlbWlNaW5vckF4aXM6dC5fc2VtaU1pbm9yQXhpcyxlbGxpcHNvaWQ6dC5fZWxsaXBzb2lkLHJvdGF0aW9uOnQuX3JvdGF0aW9uLGhlaWdodDplLGdyYW51bGFyaXR5OnQuX2dyYW51bGFyaXR5LG51bWJlck9mVmVydGljYWxMaW5lczp0Ll9udW1iZXJPZlZlcnRpY2FsTGluZXN9LGk7aWYobylyLmV4dHJ1ZGVkSGVpZ2h0PW4sci5vZmZzZXRBdHRyaWJ1dGU9dC5fb2Zmc2V0QXR0cmlidXRlLGk9WU0ocik7ZWxzZSBpZihpPVhNKHIpLGgodC5fb2Zmc2V0QXR0cmlidXRlKSl7bGV0IHM9aS5hdHRyaWJ1dGVzLnBvc2l0aW9uLnZhbHVlcy5sZW5ndGgsZj10Ll9vZmZzZXRBdHRyaWJ1dGU9PT1mZS5OT05FPzA6MSx1PW5ldyBVaW50OEFycmF5KHMvMykuZmlsbChmKTtpLmF0dHJpYnV0ZXMuYXBwbHlPZmZzZXQ9bmV3IGl0KHtjb21wb25lbnREYXRhdHlwZTpudC5VTlNJR05FRF9CWVRFLGNvbXBvbmVudHNQZXJBdHRyaWJ1dGU6MSx2YWx1ZXM6dX0pfXJldHVybiBuZXcgVXQoe2F0dHJpYnV0ZXM6aS5hdHRyaWJ1dGVzLGluZGljZXM6aS5pbmRpY2VzLHByaW1pdGl2ZVR5cGU6QnQuTElORVMsYm91bmRpbmdTcGhlcmU6aS5ib3VuZGluZ1NwaGVyZSxvZmZzZXRBdHRyaWJ1dGU6dC5fb2Zmc2V0QXR0cmlidXRlfSl9O3pyPWZhfSk7ZnVuY3Rpb24gdWEodCl7dD14KHQseC5FTVBUWV9PQkpFQ1QpO2xldCBlPXQucmFkaXVzO3kudHlwZU9mLm51bWJlcigicmFkaXVzIixlKTtsZXQgbj17Y2VudGVyOnQuY2VudGVyLHNlbWlNYWpvckF4aXM6ZSxzZW1pTWlub3JBeGlzOmUsZWxsaXBzb2lkOnQuZWxsaXBzb2lkLGhlaWdodDp0LmhlaWdodCxleHRydWRlZEhlaWdodDp0LmV4dHJ1ZGVkSGVpZ2h0LGdyYW51bGFyaXR5OnQuZ3JhbnVsYXJpdHksbnVtYmVyT2ZWZXJ0aWNhbExpbmVzOnQubnVtYmVyT2ZWZXJ0aWNhbExpbmVzfTt0aGlzLl9lbGxpcHNlR2VvbWV0cnk9bmV3IHpyKG4pLHRoaXMuX3dvcmtlck5hbWU9ImNyZWF0ZUNpcmNsZU91dGxpbmVHZW9tZXRyeSJ9dmFyICRNLGlyLEUwLFZUPVooKCk9PntGdCgpO1h0KCk7SXQoKTtmdCgpO08wKCk7WnQoKTt1YS5wYWNrZWRMZW5ndGg9enIucGFja2VkTGVuZ3RoO3VhLnBhY2s9ZnVuY3Rpb24odCxlLG4pe3JldHVybiB5LnR5cGVPZi5vYmplY3QoInZhbHVlIix0KSx6ci5wYWNrKHQuX2VsbGlwc2VHZW9tZXRyeSxlLG4pfTskTT1uZXcgenIoe2NlbnRlcjpuZXcgYSxzZW1pTWFqb3JBeGlzOjEsc2VtaU1pbm9yQXhpczoxfSksaXI9e2NlbnRlcjpuZXcgYSxyYWRpdXM6dm9pZCAwLGVsbGlwc29pZDokLmNsb25lKCQuVU5JVF9TUEhFUkUpLGhlaWdodDp2b2lkIDAsZXh0cnVkZWRIZWlnaHQ6dm9pZCAwLGdyYW51bGFyaXR5OnZvaWQgMCxudW1iZXJPZlZlcnRpY2FsTGluZXM6dm9pZCAwLHNlbWlNYWpvckF4aXM6dm9pZCAwLHNlbWlNaW5vckF4aXM6dm9pZCAwfTt1YS51bnBhY2s9ZnVuY3Rpb24odCxlLG4pe2xldCBvPXpyLnVucGFjayh0LGUsJE0pO3JldHVybiBpci5jZW50ZXI9YS5jbG9uZShvLl9jZW50ZXIsaXIuY2VudGVyKSxpci5lbGxpcHNvaWQ9JC5jbG9uZShvLl9lbGxpcHNvaWQsaXIuZWxsaXBzb2lkKSxpci5oZWlnaHQ9by5faGVpZ2h0LGlyLmV4dHJ1ZGVkSGVpZ2h0PW8uX2V4dHJ1ZGVkSGVpZ2h0LGlyLmdyYW51bGFyaXR5PW8uX2dyYW51bGFyaXR5LGlyLm51bWJlck9mVmVydGljYWxMaW5lcz1vLl9udW1iZXJPZlZlcnRpY2FsTGluZXMsaChuKT8oaXIuc2VtaU1ham9yQXhpcz1vLl9zZW1pTWFqb3JBeGlzLGlyLnNlbWlNaW5vckF4aXM9by5fc2VtaU1pbm9yQXhpcyxuLl9lbGxpcHNlR2VvbWV0cnk9bmV3IHpyKGlyKSxuKTooaXIucmFkaXVzPW8uX3NlbWlNYWpvckF4aXMsbmV3IHVhKGlyKSl9O3VhLmNyZWF0ZUdlb21ldHJ5PWZ1bmN0aW9uKHQpe3JldHVybiB6ci5jcmVhdGVHZW9tZXRyeSh0Ll9lbGxpcHNlR2VvbWV0cnkpfTtFMD11YX0pO3ZhciBSMD17fTtkZShSMCx7ZGVmYXVsdDooKT0+UU19KTtmdW5jdGlvbiBaTSh0LGUpe3JldHVybiBoKGUpJiYodD1FMC51bnBhY2sodCxlKSksdC5fZWxsaXBzZUdlb21ldHJ5Ll9jZW50ZXI9YS5jbG9uZSh0Ll9lbGxpcHNlR2VvbWV0cnkuX2NlbnRlciksdC5fZWxsaXBzZUdlb21ldHJ5Ll9lbGxpcHNvaWQ9JC5jbG9uZSh0Ll9lbGxpcHNlR2VvbWV0cnkuX2VsbGlwc29pZCksRTAuY3JlYXRlR2VvbWV0cnkodCl9dmFyIFFNLFMwPVooKCk9PntGdCgpO1ZUKCk7ZnQoKTtadCgpO1FNPVpNfSk7ZnVuY3Rpb24gSk0odCxlLG4sbyl7aWYoeS5kZWZpbmVkKCJlcXVhbHNFcHNpbG9uIixlKSwhaCh0KSlyZXR1cm47bj14KG4sITEpO2xldCByPWgobyksaT10Lmxlbmd0aDtpZihpPDIpcmV0dXJuIHQ7bGV0IHMsZj10WzBdLHUsYyxsPTAscD0tMTtmb3Iocz0xO3M8aTsrK3MpdT10W3NdLGUoZix1LGtUKT8oaChjKXx8KGM9dC5zbGljZSgwLHMpLGw9cy0xLHA9MCksciYmby5wdXNoKHMpKTooaChjKSYmKGMucHVzaCh1KSxsPXMsciYmKHA9by5sZW5ndGgpKSxmPXUpO3JldHVybiBuJiZlKHRbMF0sdFtpLTFdLGtUKSYmKHImJihoKGMpP28uc3BsaWNlKHAsMCxsKTpvLnB1c2goaS0xKSksaChjKT9jLmxlbmd0aC09MTpjPXQuc2xpY2UoMCwtMSkpLGgoYyk/Yzp0fXZhciBrVCx4bixqcj1aKCgpPT57WHQoKTtJdCgpO2Z0KCk7V3QoKTtrVD1NLkVQU0lMT04xMDt4bj1KTX0pO2Z1bmN0aW9uIEluKHQsZSxuLG8pe3RoaXMueD14KHQsMCksdGhpcy55PXgoZSwwKSx0aGlzLndpZHRoPXgobiwwKSx0aGlzLmhlaWdodD14KG8sMCl9dmFyIEdULHROLGVOLEhyLENmPVooKCk9PntVZSgpO0llKCk7WHQoKTtJdCgpO2Z0KCk7WnQoKTtTaSgpO2tzKCk7d24oKTtJbi5wYWNrZWRMZW5ndGg9NDtJbi5wYWNrPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4geS50eXBlT2Yub2JqZWN0KCJ2YWx1ZSIsdCkseS5kZWZpbmVkKCJhcnJheSIsZSksbj14KG4sMCksZVtuKytdPXQueCxlW24rK109dC55LGVbbisrXT10LndpZHRoLGVbbl09dC5oZWlnaHQsZX07SW4udW5wYWNrPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4geS5kZWZpbmVkKCJhcnJheSIsdCksZT14KGUsMCksaChuKXx8KG49bmV3IEluKSxuLng9dFtlKytdLG4ueT10W2UrK10sbi53aWR0aD10W2UrK10sbi5oZWlnaHQ9dFtlXSxufTtJbi5mcm9tUG9pbnRzPWZ1bmN0aW9uKHQsZSl7aWYoaChlKXx8KGU9bmV3IEluKSwhaCh0KXx8dC5sZW5ndGg9PT0wKXJldHVybiBlLng9MCxlLnk9MCxlLndpZHRoPTAsZS5oZWlnaHQ9MCxlO2xldCBuPXQubGVuZ3RoLG89dFswXS54LHI9dFswXS55LGk9dFswXS54LHM9dFswXS55O2ZvcihsZXQgZj0xO2Y8bjtmKyspe2xldCB1PXRbZl0sYz11LngsbD11Lnk7bz1NYXRoLm1pbihjLG8pLGk9TWF0aC5tYXgoYyxpKSxyPU1hdGgubWluKGwscikscz1NYXRoLm1heChsLHMpfXJldHVybiBlLng9byxlLnk9cixlLndpZHRoPWktbyxlLmhlaWdodD1zLXIsZX07R1Q9bmV3IEpuLHROPW5ldyBjdCxlTj1uZXcgY3Q7SW4uZnJvbVJlY3RhbmdsZT1mdW5jdGlvbih0LGUsbil7aWYoaChuKXx8KG49bmV3IEluKSwhaCh0KSlyZXR1cm4gbi54PTAsbi55PTAsbi53aWR0aD0wLG4uaGVpZ2h0PTAsbjtHVC5fZWxsaXBzb2lkPSQuZGVmYXVsdCxlPXgoZSxHVCk7bGV0IG89ZS5wcm9qZWN0KE50LnNvdXRod2VzdCh0LHROKSkscj1lLnByb2plY3QoTnQubm9ydGhlYXN0KHQsZU4pKTtyZXR1cm4gdHQuc3VidHJhY3QocixvLHIpLG4ueD1vLngsbi55PW8ueSxuLndpZHRoPXIueCxuLmhlaWdodD1yLnksbn07SW4uY2xvbmU9ZnVuY3Rpb24odCxlKXtpZihoKHQpKXJldHVybiBoKGUpPyhlLng9dC54LGUueT10LnksZS53aWR0aD10LndpZHRoLGUuaGVpZ2h0PXQuaGVpZ2h0LGUpOm5ldyBJbih0LngsdC55LHQud2lkdGgsdC5oZWlnaHQpfTtJbi51bmlvbj1mdW5jdGlvbih0LGUsbil7eS50eXBlT2Yub2JqZWN0KCJsZWZ0Iix0KSx5LnR5cGVPZi5vYmplY3QoInJpZ2h0IixlKSxoKG4pfHwobj1uZXcgSW4pO2xldCBvPU1hdGgubWluKHQueCxlLngpLHI9TWF0aC5taW4odC55LGUueSksaT1NYXRoLm1heCh0LngrdC53aWR0aCxlLngrZS53aWR0aCkscz1NYXRoLm1heCh0LnkrdC5oZWlnaHQsZS55K2UuaGVpZ2h0KTtyZXR1cm4gbi54PW8sbi55PXIsbi53aWR0aD1pLW8sbi5oZWlnaHQ9cy1yLG59O0luLmV4cGFuZD1mdW5jdGlvbih0LGUsbil7eS50eXBlT2Yub2JqZWN0KCJyZWN0YW5nbGUiLHQpLHkudHlwZU9mLm9iamVjdCgicG9pbnQiLGUpLG49SW4uY2xvbmUodCxuKTtsZXQgbz1lLngtbi54LHI9ZS55LW4ueTtyZXR1cm4gbz5uLndpZHRoP24ud2lkdGg9bzpvPDAmJihuLndpZHRoLT1vLG4ueD1lLngpLHI+bi5oZWlnaHQ/bi5oZWlnaHQ9cjpyPDAmJihuLmhlaWdodC09cixuLnk9ZS55KSxufTtJbi5pbnRlcnNlY3Q9ZnVuY3Rpb24odCxlKXt5LnR5cGVPZi5vYmplY3QoImxlZnQiLHQpLHkudHlwZU9mLm9iamVjdCgicmlnaHQiLGUpO2xldCBuPXQueCxvPXQueSxyPWUueCxpPWUueTtyZXR1cm4gbj5yK2Uud2lkdGh8fG4rdC53aWR0aDxyfHxvK3QuaGVpZ2h0PGl8fG8+aStlLmhlaWdodD9Tbi5PVVRTSURFOlNuLklOVEVSU0VDVElOR307SW4uZXF1YWxzPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQ9PT1lfHxoKHQpJiZoKGUpJiZ0Lng9PT1lLngmJnQueT09PWUueSYmdC53aWR0aD09PWUud2lkdGgmJnQuaGVpZ2h0PT09ZS5oZWlnaHR9O0luLnByb3RvdHlwZS5jbG9uZT1mdW5jdGlvbih0KXtyZXR1cm4gSW4uY2xvbmUodGhpcyx0KX07SW4ucHJvdG90eXBlLmludGVyc2VjdD1mdW5jdGlvbih0KXtyZXR1cm4gSW4uaW50ZXJzZWN0KHRoaXMsdCl9O0luLnByb3RvdHlwZS5lcXVhbHM9ZnVuY3Rpb24odCl7cmV0dXJuIEluLmVxdWFscyh0aGlzLHQpfTtIcj1Jbn0pO2Z1bmN0aW9uIERvKHQsZSxuKXt0aGlzLm1pbmltdW09YS5jbG9uZSh4KHQsYS5aRVJPKSksdGhpcy5tYXhpbXVtPWEuY2xvbmUoeChlLGEuWkVSTykpLGgobik/bj1hLmNsb25lKG4pOm49YS5taWRwb2ludCh0aGlzLm1pbmltdW0sdGhpcy5tYXhpbXVtLG5ldyBhKSx0aGlzLmNlbnRlcj1ufXZhciB0ZCxEaSx4Zj1aKCgpPT57RnQoKTtYdCgpO0l0KCk7ZnQoKTtrcygpO0RvLmZyb21Db3JuZXJzPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4geS5kZWZpbmVkKCJtaW5pbXVtIix0KSx5LmRlZmluZWQoIm1heGltdW0iLGUpLGgobil8fChuPW5ldyBEbyksbi5taW5pbXVtPWEuY2xvbmUodCxuLm1pbmltdW0pLG4ubWF4aW11bT1hLmNsb25lKGUsbi5tYXhpbXVtKSxuLmNlbnRlcj1hLm1pZHBvaW50KHQsZSxuLmNlbnRlciksbn07RG8uZnJvbVBvaW50cz1mdW5jdGlvbih0LGUpe2lmKGgoZSl8fChlPW5ldyBEbyksIWgodCl8fHQubGVuZ3RoPT09MClyZXR1cm4gZS5taW5pbXVtPWEuY2xvbmUoYS5aRVJPLGUubWluaW11bSksZS5tYXhpbXVtPWEuY2xvbmUoYS5aRVJPLGUubWF4aW11bSksZS5jZW50ZXI9YS5jbG9uZShhLlpFUk8sZS5jZW50ZXIpLGU7bGV0IG49dFswXS54LG89dFswXS55LHI9dFswXS56LGk9dFswXS54LHM9dFswXS55LGY9dFswXS56LHU9dC5sZW5ndGg7Zm9yKGxldCBwPTE7cDx1O3ArKyl7bGV0IGQ9dFtwXSxtPWQueCxfPWQueSxnPWQuejtuPU1hdGgubWluKG0sbiksaT1NYXRoLm1heChtLGkpLG89TWF0aC5taW4oXyxvKSxzPU1hdGgubWF4KF8scykscj1NYXRoLm1pbihnLHIpLGY9TWF0aC5tYXgoZyxmKX1sZXQgYz1lLm1pbmltdW07Yy54PW4sYy55PW8sYy56PXI7bGV0IGw9ZS5tYXhpbXVtO3JldHVybiBsLng9aSxsLnk9cyxsLno9ZixlLmNlbnRlcj1hLm1pZHBvaW50KGMsbCxlLmNlbnRlciksZX07RG8uY2xvbmU9ZnVuY3Rpb24odCxlKXtpZihoKHQpKXJldHVybiBoKGUpPyhlLm1pbmltdW09YS5jbG9uZSh0Lm1pbmltdW0sZS5taW5pbXVtKSxlLm1heGltdW09YS5jbG9uZSh0Lm1heGltdW0sZS5tYXhpbXVtKSxlLmNlbnRlcj1hLmNsb25lKHQuY2VudGVyLGUuY2VudGVyKSxlKTpuZXcgRG8odC5taW5pbXVtLHQubWF4aW11bSx0LmNlbnRlcil9O0RvLmVxdWFscz1mdW5jdGlvbih0LGUpe3JldHVybiB0PT09ZXx8aCh0KSYmaChlKSYmYS5lcXVhbHModC5jZW50ZXIsZS5jZW50ZXIpJiZhLmVxdWFscyh0Lm1pbmltdW0sZS5taW5pbXVtKSYmYS5lcXVhbHModC5tYXhpbXVtLGUubWF4aW11bSl9O3RkPW5ldyBhO0RvLmludGVyc2VjdFBsYW5lPWZ1bmN0aW9uKHQsZSl7eS5kZWZpbmVkKCJib3giLHQpLHkuZGVmaW5lZCgicGxhbmUiLGUpLHRkPWEuc3VidHJhY3QodC5tYXhpbXVtLHQubWluaW11bSx0ZCk7bGV0IG49YS5tdWx0aXBseUJ5U2NhbGFyKHRkLC41LHRkKSxvPWUubm9ybWFsLHI9bi54Kk1hdGguYWJzKG8ueCkrbi55Kk1hdGguYWJzKG8ueSkrbi56Kk1hdGguYWJzKG8ueiksaT1hLmRvdCh0LmNlbnRlcixvKStlLmRpc3RhbmNlO3JldHVybiBpLXI+MD9Tbi5JTlNJREU6aStyPDA/U24uT1VUU0lERTpTbi5JTlRFUlNFQ1RJTkd9O0RvLnByb3RvdHlwZS5jbG9uZT1mdW5jdGlvbih0KXtyZXR1cm4gRG8uY2xvbmUodGhpcyx0KX07RG8ucHJvdG90eXBlLmludGVyc2VjdFBsYW5lPWZ1bmN0aW9uKHQpe3JldHVybiBEby5pbnRlcnNlY3RQbGFuZSh0aGlzLHQpfTtEby5wcm90b3R5cGUuZXF1YWxzPWZ1bmN0aW9uKHQpe3JldHVybiBEby5lcXVhbHModGhpcyx0KX07RGk9RG99KTtmdW5jdGlvbiB1aSh0LGUpe2lmKHkuZGVmaW5lZCgib3JpZ2luIix0KSxlPXgoZSwkLmRlZmF1bHQpLHQ9ZS5zY2FsZVRvR2VvZGV0aWNTdXJmYWNlKHQpLCFoKHQpKXRocm93IG5ldyBCKCJvcmlnaW4gbXVzdCBub3QgYmUgYXQgdGhlIGNlbnRlciBvZiB0aGUgZWxsaXBzb2lkLiIpO2xldCBuPVhvLmVhc3ROb3J0aFVwVG9GaXhlZEZyYW1lKHQsZSk7dGhpcy5fZWxsaXBzb2lkPWUsdGhpcy5fb3JpZ2luPXQsdGhpcy5feEF4aXM9YS5mcm9tQ2FydGVzaWFuNChzdC5nZXRDb2x1bW4obiwwLEMwKSksdGhpcy5feUF4aXM9YS5mcm9tQ2FydGVzaWFuNChzdC5nZXRDb2x1bW4obiwxLEMwKSk7bGV0IG89YS5mcm9tQ2FydGVzaWFuNChzdC5nZXRDb2x1bW4obiwyLEMwKSk7dGhpcy5fcGxhbmU9b24uZnJvbVBvaW50Tm9ybWFsKHQsbyl9dmFyIEMwLG5OLHpULGVkLG9OLHlvLGxhPVooKCk9Pnt4ZigpO1VlKCk7RnQoKTtocigpO1h0KCk7SXQoKTtmdCgpO0h0KCk7WnQoKTt0YygpO1VuKCk7ZnMoKTtWcCgpO2NzKCk7QzA9bmV3IGhlO09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHVpLnByb3RvdHlwZSx7ZWxsaXBzb2lkOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZWxsaXBzb2lkfX0sb3JpZ2luOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fb3JpZ2lufX0scGxhbmU6e2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9wbGFuZX19LHhBeGlzOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5feEF4aXN9fSx5QXhpczp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3lBeGlzfX0sekF4aXM6e2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9wbGFuZS5ub3JtYWx9fX0pO25OPW5ldyBEaTt1aS5mcm9tUG9pbnRzPWZ1bmN0aW9uKHQsZSl7eS5kZWZpbmVkKCJjYXJ0ZXNpYW5zIix0KTtsZXQgbj1EaS5mcm9tUG9pbnRzKHQsbk4pO3JldHVybiBuZXcgdWkobi5jZW50ZXIsZSl9O3pUPW5ldyBRcyxlZD1uZXcgYTt1aS5wcm90b3R5cGUucHJvamVjdFBvaW50T250b1BsYW5lPWZ1bmN0aW9uKHQsZSl7eS5kZWZpbmVkKCJjYXJ0ZXNpYW4iLHQpO2xldCBuPXpUO24ub3JpZ2luPXQsYS5ub3JtYWxpemUodCxuLmRpcmVjdGlvbik7bGV0IG89aG8ucmF5UGxhbmUobix0aGlzLl9wbGFuZSxlZCk7aWYoaChvKXx8KGEubmVnYXRlKG4uZGlyZWN0aW9uLG4uZGlyZWN0aW9uKSxvPWhvLnJheVBsYW5lKG4sdGhpcy5fcGxhbmUsZWQpKSxoKG8pKXtsZXQgcj1hLnN1YnRyYWN0KG8sdGhpcy5fb3JpZ2luLG8pLGk9YS5kb3QodGhpcy5feEF4aXMscikscz1hLmRvdCh0aGlzLl95QXhpcyxyKTtyZXR1cm4gaChlKT8oZS54PWksZS55PXMsZSk6bmV3IHR0KGkscyl9fTt1aS5wcm90b3R5cGUucHJvamVjdFBvaW50c09udG9QbGFuZT1mdW5jdGlvbih0LGUpe3kuZGVmaW5lZCgiY2FydGVzaWFucyIsdCksaChlKXx8KGU9W10pO2xldCBuPTAsbz10Lmxlbmd0aDtmb3IobGV0IHI9MDtyPG87cisrKXtsZXQgaT10aGlzLnByb2plY3RQb2ludE9udG9QbGFuZSh0W3JdLGVbbl0pO2goaSkmJihlW25dPWksbisrKX1yZXR1cm4gZS5sZW5ndGg9bixlfTt1aS5wcm90b3R5cGUucHJvamVjdFBvaW50VG9OZWFyZXN0T25QbGFuZT1mdW5jdGlvbih0LGUpe3kuZGVmaW5lZCgiY2FydGVzaWFuIix0KSxoKGUpfHwoZT1uZXcgdHQpO2xldCBuPXpUO24ub3JpZ2luPXQsYS5jbG9uZSh0aGlzLl9wbGFuZS5ub3JtYWwsbi5kaXJlY3Rpb24pO2xldCBvPWhvLnJheVBsYW5lKG4sdGhpcy5fcGxhbmUsZWQpO2gobyl8fChhLm5lZ2F0ZShuLmRpcmVjdGlvbixuLmRpcmVjdGlvbiksbz1oby5yYXlQbGFuZShuLHRoaXMuX3BsYW5lLGVkKSk7bGV0IHI9YS5zdWJ0cmFjdChvLHRoaXMuX29yaWdpbixvKSxpPWEuZG90KHRoaXMuX3hBeGlzLHIpLHM9YS5kb3QodGhpcy5feUF4aXMscik7cmV0dXJuIGUueD1pLGUueT1zLGV9O3VpLnByb3RvdHlwZS5wcm9qZWN0UG9pbnRzVG9OZWFyZXN0T25QbGFuZT1mdW5jdGlvbih0LGUpe3kuZGVmaW5lZCgiY2FydGVzaWFucyIsdCksaChlKXx8KGU9W10pO2xldCBuPXQubGVuZ3RoO2UubGVuZ3RoPW47Zm9yKGxldCBvPTA7bzxuO28rKyllW29dPXRoaXMucHJvamVjdFBvaW50VG9OZWFyZXN0T25QbGFuZSh0W29dLGVbb10pO3JldHVybiBlfTtvTj1uZXcgYTt1aS5wcm90b3R5cGUucHJvamVjdFBvaW50T250b0VsbGlwc29pZD1mdW5jdGlvbih0LGUpe3kuZGVmaW5lZCgiY2FydGVzaWFuIix0KSxoKGUpfHwoZT1uZXcgYSk7bGV0IG49dGhpcy5fZWxsaXBzb2lkLG89dGhpcy5fb3JpZ2luLHI9dGhpcy5feEF4aXMsaT10aGlzLl95QXhpcyxzPW9OO3JldHVybiBhLm11bHRpcGx5QnlTY2FsYXIocix0LngscyksZT1hLmFkZChvLHMsZSksYS5tdWx0aXBseUJ5U2NhbGFyKGksdC55LHMpLGEuYWRkKGUscyxlKSxuLnNjYWxlVG9HZW9jZW50cmljU3VyZmFjZShlLGUpLGV9O3VpLnByb3RvdHlwZS5wcm9qZWN0UG9pbnRzT250b0VsbGlwc29pZD1mdW5jdGlvbih0LGUpe3kuZGVmaW5lZCgiY2FydGVzaWFucyIsdCk7bGV0IG49dC5sZW5ndGg7aChlKT9lLmxlbmd0aD1uOmU9bmV3IEFycmF5KG4pO2ZvcihsZXQgbz0wO288bjsrK28pZVtvXT10aGlzLnByb2plY3RQb2ludE9udG9FbGxpcHNvaWQodFtvXSxlW29dKTtyZXR1cm4gZX07eW89dWl9KTtmdW5jdGlvbiBCZSh0LGUpe3RoaXMuY2VudGVyPWEuY2xvbmUoeCh0LGEuWkVSTykpLHRoaXMuaGFsZkF4ZXM9US5jbG9uZSh4KGUsUS5aRVJPKSl9ZnVuY3Rpb24galQodCxlLG4sbyxyLGkscyxmLHUsYyxsKXtpZighaChyKXx8IWgoaSl8fCFoKHMpfHwhaChmKXx8IWgodSl8fCFoKGMpKXRocm93IG5ldyBCKCJhbGwgZXh0ZW50cyAobWluaW11bS9tYXhpbXVtIFgvWS9aKSBhcmUgcmVxdWlyZWQuIik7aChsKXx8KGw9bmV3IEJlKTtsZXQgcD1sLmhhbGZBeGVzO1Euc2V0Q29sdW1uKHAsMCxlLHApLFEuc2V0Q29sdW1uKHAsMSxuLHApLFEuc2V0Q29sdW1uKHAsMixvLHApO2xldCBkPVhUO2QueD0ocitpKS8yLGQueT0ocytmKS8yLGQuej0odStjKS8yO2xldCBtPXBOO20ueD0oaS1yKS8yLG0ueT0oZi1zKS8yLG0uej0oYy11KS8yO2xldCBfPWwuY2VudGVyO3JldHVybiBkPVEubXVsdGlwbHlCeVZlY3RvcihwLGQsZCksYS5hZGQodCxkLF8pLFEubXVsdGlwbHlCeVNjYWxlKHAsbSxwKSxsfXZhciByTixpTixzTixjTixhTixmTix1TixsTixYVCxwTixIVCxkTixtTixoTixfTix5TixnTixBTixxVCxiTixLVCxUTix3TixPTixFTixSTixTTixDTix4TixQTixNTixOTixJTix2TixMTixETixZVCwkVCxaVCxGTixXVCxCTixVTixWTixrTixHTix6TixqTixITixTbyxwYT1aKCgpPT57dmUoKTtVZSgpO0Z0KCk7SWUoKTtYdCgpO0l0KCk7ZnQoKTtIdCgpO1p0KCk7bGEoKTtrcygpO0hsKCk7V3QoKTtCbigpO1VuKCk7ZnMoKTt3bigpO0JlLnBhY2tlZExlbmd0aD1hLnBhY2tlZExlbmd0aCtRLnBhY2tlZExlbmd0aDtCZS5wYWNrPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4geS50eXBlT2Yub2JqZWN0KCJ2YWx1ZSIsdCkseS5kZWZpbmVkKCJhcnJheSIsZSksbj14KG4sMCksYS5wYWNrKHQuY2VudGVyLGUsbiksUS5wYWNrKHQuaGFsZkF4ZXMsZSxuK2EucGFja2VkTGVuZ3RoKSxlfTtCZS51bnBhY2s9ZnVuY3Rpb24odCxlLG4pe3JldHVybiB5LmRlZmluZWQoImFycmF5Iix0KSxlPXgoZSwwKSxoKG4pfHwobj1uZXcgQmUpLGEudW5wYWNrKHQsZSxuLmNlbnRlciksUS51bnBhY2sodCxlK2EucGFja2VkTGVuZ3RoLG4uaGFsZkF4ZXMpLG59O3JOPW5ldyBhLGlOPW5ldyBhLHNOPW5ldyBhLGNOPW5ldyBhLGFOPW5ldyBhLGZOPW5ldyBhLHVOPW5ldyBRLGxOPXt1bml0YXJ5Om5ldyBRLGRpYWdvbmFsOm5ldyBRfTtCZS5mcm9tUG9pbnRzPWZ1bmN0aW9uKHQsZSl7aWYoaChlKXx8KGU9bmV3IEJlKSwhaCh0KXx8dC5sZW5ndGg9PT0wKXJldHVybiBlLmhhbGZBeGVzPVEuWkVSTyxlLmNlbnRlcj1hLlpFUk8sZTtsZXQgbixvPXQubGVuZ3RoLHI9YS5jbG9uZSh0WzBdLHJOKTtmb3Iobj0xO248bztuKyspYS5hZGQocix0W25dLHIpO2xldCBpPTEvbzthLm11bHRpcGx5QnlTY2FsYXIocixpLHIpO2xldCBzPTAsZj0wLHU9MCxjPTAsbD0wLHA9MCxkO2ZvcihuPTA7bjxvO24rKylkPWEuc3VidHJhY3QodFtuXSxyLGlOKSxzKz1kLngqZC54LGYrPWQueCpkLnksdSs9ZC54KmQueixjKz1kLnkqZC55LGwrPWQueSpkLnoscCs9ZC56KmQuejtzKj1pLGYqPWksdSo9aSxjKj1pLGwqPWkscCo9aTtsZXQgbT11TjttWzBdPXMsbVsxXT1mLG1bMl09dSxtWzNdPWYsbVs0XT1jLG1bNV09bCxtWzZdPXUsbVs3XT1sLG1bOF09cDtsZXQgXz1RLmNvbXB1dGVFaWdlbkRlY29tcG9zaXRpb24obSxsTiksZz1RLmNsb25lKF8udW5pdGFyeSxlLmhhbGZBeGVzKSxiPVEuZ2V0Q29sdW1uKGcsMCxjTiksVD1RLmdldENvbHVtbihnLDEsYU4pLE89US5nZXRDb2x1bW4oZywyLGZOKSxFPS1OdW1iZXIuTUFYX1ZBTFVFLHc9LU51bWJlci5NQVhfVkFMVUUsQz0tTnVtYmVyLk1BWF9WQUxVRSxOPU51bWJlci5NQVhfVkFMVUUsST1OdW1iZXIuTUFYX1ZBTFVFLEQ9TnVtYmVyLk1BWF9WQUxVRTtmb3Iobj0wO248bztuKyspZD10W25dLEU9TWF0aC5tYXgoYS5kb3QoYixkKSxFKSx3PU1hdGgubWF4KGEuZG90KFQsZCksdyksQz1NYXRoLm1heChhLmRvdChPLGQpLEMpLE49TWF0aC5taW4oYS5kb3QoYixkKSxOKSxJPU1hdGgubWluKGEuZG90KFQsZCksSSksRD1NYXRoLm1pbihhLmRvdChPLGQpLEQpO2I9YS5tdWx0aXBseUJ5U2NhbGFyKGIsLjUqKE4rRSksYiksVD1hLm11bHRpcGx5QnlTY2FsYXIoVCwuNSooSSt3KSxUKSxPPWEubXVsdGlwbHlCeVNjYWxhcihPLC41KihEK0MpLE8pO2xldCB2PWEuYWRkKGIsVCxlLmNlbnRlcik7YS5hZGQodixPLHYpO2xldCBMPXNOO3JldHVybiBMLng9RS1OLEwueT13LUksTC56PUMtRCxhLm11bHRpcGx5QnlTY2FsYXIoTCwuNSxMKSxRLm11bHRpcGx5QnlTY2FsZShlLmhhbGZBeGVzLEwsZS5oYWxmQXhlcyksZX07WFQ9bmV3IGEscE49bmV3IGE7SFQ9bmV3IGN0LGROPW5ldyBhLG1OPW5ldyBjdCxoTj1uZXcgY3QsX049bmV3IGN0LHlOPW5ldyBjdCxnTj1uZXcgY3QsQU49bmV3IGEscVQ9bmV3IGEsYk49bmV3IGEsS1Q9bmV3IGEsVE49bmV3IGEsd049bmV3IHR0LE9OPW5ldyB0dCxFTj1uZXcgdHQsUk49bmV3IHR0LFNOPW5ldyB0dCxDTj1uZXcgYSx4Tj1uZXcgYSxQTj1uZXcgYSxNTj1uZXcgYSxOTj1uZXcgdHQsSU49bmV3IGEsdk49bmV3IGEsTE49bmV3IGEsRE49bmV3IG9uKGEuVU5JVF9YLDApO0JlLmZyb21SZWN0YW5nbGU9ZnVuY3Rpb24odCxlLG4sbyxyKXtpZighaCh0KSl0aHJvdyBuZXcgQigicmVjdGFuZ2xlIGlzIHJlcXVpcmVkIik7aWYodC53aWR0aDwwfHx0LndpZHRoPk0uVFdPX1BJKXRocm93IG5ldyBCKCJSZWN0YW5nbGUgd2lkdGggbXVzdCBiZSBiZXR3ZWVuIDAgYW5kIDIgKiBwaSIpO2lmKHQuaGVpZ2h0PDB8fHQuaGVpZ2h0Pk0uUEkpdGhyb3cgbmV3IEIoIlJlY3RhbmdsZSBoZWlnaHQgbXVzdCBiZSBiZXR3ZWVuIDAgYW5kIHBpIik7aWYoaChvKSYmIU0uZXF1YWxzRXBzaWxvbihvLnJhZGlpLngsby5yYWRpaS55LE0uRVBTSUxPTjE1KSl0aHJvdyBuZXcgQigiRWxsaXBzb2lkIG11c3QgYmUgYW4gZWxsaXBzb2lkIG9mIHJldm9sdXRpb24gKHJhZGlpLnggPT0gcmFkaWkueSkiKTtlPXgoZSwwKSxuPXgobiwwKSxvPXgobywkLmRlZmF1bHQpO2xldCBpLHMsZix1LGMsbCxwO2lmKHQud2lkdGg8PU0uUEkpe2xldCBJPU50LmNlbnRlcih0LEhUKSxEPW8uY2FydG9ncmFwaGljVG9DYXJ0ZXNpYW4oSSxkTiksdj1uZXcgeW8oRCxvKTtwPXYucGxhbmU7bGV0IEw9SS5sb25naXR1ZGUsVT10LnNvdXRoPDAmJnQubm9ydGg+MD8wOkkubGF0aXR1ZGUsQT1jdC5mcm9tUmFkaWFucyhMLHQubm9ydGgsbixtTiksUz1jdC5mcm9tUmFkaWFucyh0Lndlc3QsdC5ub3J0aCxuLGhOKSxQPWN0LmZyb21SYWRpYW5zKHQud2VzdCxVLG4sX04pLEY9Y3QuZnJvbVJhZGlhbnModC53ZXN0LHQuc291dGgsbix5Tiksaj1jdC5mcm9tUmFkaWFucyhMLHQuc291dGgsbixnTiksSD1vLmNhcnRvZ3JhcGhpY1RvQ2FydGVzaWFuKEEsQU4pLGs9by5jYXJ0b2dyYXBoaWNUb0NhcnRlc2lhbihTLHFUKSxLPW8uY2FydG9ncmFwaGljVG9DYXJ0ZXNpYW4oUCxiTiksWD1vLmNhcnRvZ3JhcGhpY1RvQ2FydGVzaWFuKEYsS1QpLFI9by5jYXJ0b2dyYXBoaWNUb0NhcnRlc2lhbihqLFROKSxvdD12LnByb2plY3RQb2ludFRvTmVhcmVzdE9uUGxhbmUoSCx3TiksYXQ9di5wcm9qZWN0UG9pbnRUb05lYXJlc3RPblBsYW5lKGssT04pLHB0PXYucHJvamVjdFBvaW50VG9OZWFyZXN0T25QbGFuZShLLEVOKSx5dD12LnByb2plY3RQb2ludFRvTmVhcmVzdE9uUGxhbmUoWCxSTikscnQ9di5wcm9qZWN0UG9pbnRUb05lYXJlc3RPblBsYW5lKFIsU04pO3JldHVybiBpPU1hdGgubWluKGF0LngscHQueCx5dC54KSxzPS1pLHU9TWF0aC5tYXgoYXQueSxvdC55KSxmPU1hdGgubWluKHl0LnkscnQueSksUy5oZWlnaHQ9Ri5oZWlnaHQ9ZSxrPW8uY2FydG9ncmFwaGljVG9DYXJ0ZXNpYW4oUyxxVCksWD1vLmNhcnRvZ3JhcGhpY1RvQ2FydGVzaWFuKEYsS1QpLGM9TWF0aC5taW4ob24uZ2V0UG9pbnREaXN0YW5jZShwLGspLG9uLmdldFBvaW50RGlzdGFuY2UocCxYKSksbD1uLGpUKHYub3JpZ2luLHYueEF4aXMsdi55QXhpcyx2LnpBeGlzLGkscyxmLHUsYyxsLHIpfWxldCBkPXQuc291dGg+MCxtPXQubm9ydGg8MCxfPWQ/dC5zb3V0aDptP3Qubm9ydGg6MCxnPU50LmNlbnRlcih0LEhUKS5sb25naXR1ZGUsYj1hLmZyb21SYWRpYW5zKGcsXyxuLG8sQ04pO2Iuej0wO2xldCBPPU1hdGguYWJzKGIueCk8TS5FUFNJTE9OMTAmJk1hdGguYWJzKGIueSk8TS5FUFNJTE9OMTA/YS5VTklUX1g6YS5ub3JtYWxpemUoYix4TiksRT1hLlVOSVRfWix3PWEuY3Jvc3MoTyxFLFBOKTtwPW9uLmZyb21Qb2ludE5vcm1hbChiLE8sRE4pO2xldCBDPWEuZnJvbVJhZGlhbnMoZytNLlBJX09WRVJfVFdPLF8sbixvLE1OKTtzPWEuZG90KG9uLnByb2plY3RQb2ludE9udG9QbGFuZShwLEMsTk4pLHcpLGk9LXMsdT1hLmZyb21SYWRpYW5zKDAsdC5ub3J0aCxtP2U6bixvLElOKS56LGY9YS5mcm9tUmFkaWFucygwLHQuc291dGgsZD9lOm4sbyx2TikuejtsZXQgTj1hLmZyb21SYWRpYW5zKHQuZWFzdCxfLG4sbyxMTik7cmV0dXJuIGM9b24uZ2V0UG9pbnREaXN0YW5jZShwLE4pLGw9MCxqVChiLHcsRSxPLGkscyxmLHUsYyxsLHIpfTtCZS5mcm9tVHJhbnNmb3JtYXRpb249ZnVuY3Rpb24odCxlKXtyZXR1cm4geS50eXBlT2Yub2JqZWN0KCJ0cmFuc2Zvcm1hdGlvbiIsdCksaChlKXx8KGU9bmV3IEJlKSxlLmNlbnRlcj1zdC5nZXRUcmFuc2xhdGlvbih0LGUuY2VudGVyKSxlLmhhbGZBeGVzPXN0LmdldE1hdHJpeDModCxlLmhhbGZBeGVzKSxlLmhhbGZBeGVzPVEubXVsdGlwbHlCeVNjYWxhcihlLmhhbGZBeGVzLC41LGUuaGFsZkF4ZXMpLGV9O0JlLmNsb25lPWZ1bmN0aW9uKHQsZSl7aWYoaCh0KSlyZXR1cm4gaChlKT8oYS5jbG9uZSh0LmNlbnRlcixlLmNlbnRlciksUS5jbG9uZSh0LmhhbGZBeGVzLGUuaGFsZkF4ZXMpLGUpOm5ldyBCZSh0LmNlbnRlcix0LmhhbGZBeGVzKX07QmUuaW50ZXJzZWN0UGxhbmU9ZnVuY3Rpb24odCxlKXtpZighaCh0KSl0aHJvdyBuZXcgQigiYm94IGlzIHJlcXVpcmVkLiIpO2lmKCFoKGUpKXRocm93IG5ldyBCKCJwbGFuZSBpcyByZXF1aXJlZC4iKTtsZXQgbj10LmNlbnRlcixvPWUubm9ybWFsLHI9dC5oYWxmQXhlcyxpPW8ueCxzPW8ueSxmPW8ueix1PU1hdGguYWJzKGkqcltRLkNPTFVNTjBST1cwXStzKnJbUS5DT0xVTU4wUk9XMV0rZipyW1EuQ09MVU1OMFJPVzJdKStNYXRoLmFicyhpKnJbUS5DT0xVTU4xUk9XMF0rcypyW1EuQ09MVU1OMVJPVzFdK2YqcltRLkNPTFVNTjFST1cyXSkrTWF0aC5hYnMoaSpyW1EuQ09MVU1OMlJPVzBdK3MqcltRLkNPTFVNTjJST1cxXStmKnJbUS5DT0xVTU4yUk9XMl0pLGM9YS5kb3QobyxuKStlLmRpc3RhbmNlO3JldHVybiBjPD0tdT9Tbi5PVVRTSURFOmM+PXU/U24uSU5TSURFOlNuLklOVEVSU0VDVElOR307WVQ9bmV3IGEsJFQ9bmV3IGEsWlQ9bmV3IGEsRk49bmV3IGEsV1Q9bmV3IGEsQk49bmV3IGE7QmUuZGlzdGFuY2VTcXVhcmVkVG89ZnVuY3Rpb24odCxlKXtpZighaCh0KSl0aHJvdyBuZXcgQigiYm94IGlzIHJlcXVpcmVkLiIpO2lmKCFoKGUpKXRocm93IG5ldyBCKCJjYXJ0ZXNpYW4gaXMgcmVxdWlyZWQuIik7bGV0IG49YS5zdWJ0cmFjdChlLHQuY2VudGVyLFhUKSxvPXQuaGFsZkF4ZXMscj1RLmdldENvbHVtbihvLDAsWVQpLGk9US5nZXRDb2x1bW4obywxLCRUKSxzPVEuZ2V0Q29sdW1uKG8sMixaVCksZj1hLm1hZ25pdHVkZShyKSx1PWEubWFnbml0dWRlKGkpLGM9YS5tYWduaXR1ZGUocyksbD0hMCxwPSEwLGQ9ITA7Zj4wP2EuZGl2aWRlQnlTY2FsYXIocixmLHIpOmw9ITEsdT4wP2EuZGl2aWRlQnlTY2FsYXIoaSx1LGkpOnA9ITEsYz4wP2EuZGl2aWRlQnlTY2FsYXIocyxjLHMpOmQ9ITE7bGV0IG09IWwrIXArIWQsXyxnLGI7aWYobT09PTEpe2xldCB3PXI7Xz1pLGc9cyxwP2R8fCh3PXMsZz1yKToodz1pLF89ciksYj1hLmNyb3NzKF8sZyxXVCksdz09PXI/cj1iOnc9PT1pP2k9Yjp3PT09cyYmKHM9Yil9ZWxzZSBpZihtPT09Mil7Xz1yLHA/Xz1pOmQmJihfPXMpO2xldCB3PWEuVU5JVF9ZO3cuZXF1YWxzRXBzaWxvbihfLE0uRVBTSUxPTjMpJiYodz1hLlVOSVRfWCksZz1hLmNyb3NzKF8sdyxGTiksYS5ub3JtYWxpemUoZyxnKSxiPWEuY3Jvc3MoXyxnLFdUKSxhLm5vcm1hbGl6ZShiLGIpLF89PT1yPyhpPWcscz1iKTpfPT09aT8ocz1nLHI9Yik6Xz09PXMmJihyPWcsaT1iKX1lbHNlIG09PT0zJiYocj1hLlVOSVRfWCxpPWEuVU5JVF9ZLHM9YS5VTklUX1opO2xldCBUPUJOO1QueD1hLmRvdChuLHIpLFQueT1hLmRvdChuLGkpLFQuej1hLmRvdChuLHMpO2xldCBPPTAsRTtyZXR1cm4gVC54PC1mPyhFPVQueCtmLE8rPUUqRSk6VC54PmYmJihFPVQueC1mLE8rPUUqRSksVC55PC11PyhFPVQueSt1LE8rPUUqRSk6VC55PnUmJihFPVQueS11LE8rPUUqRSksVC56PC1jPyhFPVQueitjLE8rPUUqRSk6VC56PmMmJihFPVQuei1jLE8rPUUqRSksT307VU49bmV3IGEsVk49bmV3IGE7QmUuY29tcHV0ZVBsYW5lRGlzdGFuY2VzPWZ1bmN0aW9uKHQsZSxuLG8pe2lmKCFoKHQpKXRocm93IG5ldyBCKCJib3ggaXMgcmVxdWlyZWQuIik7aWYoIWgoZSkpdGhyb3cgbmV3IEIoInBvc2l0aW9uIGlzIHJlcXVpcmVkLiIpO2lmKCFoKG4pKXRocm93IG5ldyBCKCJkaXJlY3Rpb24gaXMgcmVxdWlyZWQuIik7aChvKXx8KG89bmV3IFFyKTtsZXQgcj1OdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFksaT1OdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFkscz10LmNlbnRlcixmPXQuaGFsZkF4ZXMsdT1RLmdldENvbHVtbihmLDAsWVQpLGM9US5nZXRDb2x1bW4oZiwxLCRUKSxsPVEuZ2V0Q29sdW1uKGYsMixaVCkscD1hLmFkZCh1LGMsVU4pO2EuYWRkKHAsbCxwKSxhLmFkZChwLHMscCk7bGV0IGQ9YS5zdWJ0cmFjdChwLGUsVk4pLG09YS5kb3QobixkKTtyZXR1cm4gcj1NYXRoLm1pbihtLHIpLGk9TWF0aC5tYXgobSxpKSxhLmFkZChzLHUscCksYS5hZGQocCxjLHApLGEuc3VidHJhY3QocCxsLHApLGEuc3VidHJhY3QocCxlLGQpLG09YS5kb3QobixkKSxyPU1hdGgubWluKG0sciksaT1NYXRoLm1heChtLGkpLGEuYWRkKHMsdSxwKSxhLnN1YnRyYWN0KHAsYyxwKSxhLmFkZChwLGwscCksYS5zdWJ0cmFjdChwLGUsZCksbT1hLmRvdChuLGQpLHI9TWF0aC5taW4obSxyKSxpPU1hdGgubWF4KG0saSksYS5hZGQocyx1LHApLGEuc3VidHJhY3QocCxjLHApLGEuc3VidHJhY3QocCxsLHApLGEuc3VidHJhY3QocCxlLGQpLG09YS5kb3QobixkKSxyPU1hdGgubWluKG0sciksaT1NYXRoLm1heChtLGkpLGEuc3VidHJhY3Qocyx1LHApLGEuYWRkKHAsYyxwKSxhLmFkZChwLGwscCksYS5zdWJ0cmFjdChwLGUsZCksbT1hLmRvdChuLGQpLHI9TWF0aC5taW4obSxyKSxpPU1hdGgubWF4KG0saSksYS5zdWJ0cmFjdChzLHUscCksYS5hZGQocCxjLHApLGEuc3VidHJhY3QocCxsLHApLGEuc3VidHJhY3QocCxlLGQpLG09YS5kb3QobixkKSxyPU1hdGgubWluKG0sciksaT1NYXRoLm1heChtLGkpLGEuc3VidHJhY3Qocyx1LHApLGEuc3VidHJhY3QocCxjLHApLGEuYWRkKHAsbCxwKSxhLnN1YnRyYWN0KHAsZSxkKSxtPWEuZG90KG4sZCkscj1NYXRoLm1pbihtLHIpLGk9TWF0aC5tYXgobSxpKSxhLnN1YnRyYWN0KHMsdSxwKSxhLnN1YnRyYWN0KHAsYyxwKSxhLnN1YnRyYWN0KHAsbCxwKSxhLnN1YnRyYWN0KHAsZSxkKSxtPWEuZG90KG4sZCkscj1NYXRoLm1pbihtLHIpLGk9TWF0aC5tYXgobSxpKSxvLnN0YXJ0PXIsby5zdG9wPWksb307a049bmV3IGEsR049bmV3IGEsek49bmV3IGE7QmUuY29tcHV0ZUNvcm5lcnM9ZnVuY3Rpb24odCxlKXt5LnR5cGVPZi5vYmplY3QoImJveCIsdCksaChlKXx8KGU9W25ldyBhLG5ldyBhLG5ldyBhLG5ldyBhLG5ldyBhLG5ldyBhLG5ldyBhLG5ldyBhXSk7bGV0IG49dC5jZW50ZXIsbz10LmhhbGZBeGVzLHI9US5nZXRDb2x1bW4obywwLGtOKSxpPVEuZ2V0Q29sdW1uKG8sMSxHTikscz1RLmdldENvbHVtbihvLDIsek4pO3JldHVybiBhLmNsb25lKG4sZVswXSksYS5zdWJ0cmFjdChlWzBdLHIsZVswXSksYS5zdWJ0cmFjdChlWzBdLGksZVswXSksYS5zdWJ0cmFjdChlWzBdLHMsZVswXSksYS5jbG9uZShuLGVbMV0pLGEuc3VidHJhY3QoZVsxXSxyLGVbMV0pLGEuc3VidHJhY3QoZVsxXSxpLGVbMV0pLGEuYWRkKGVbMV0scyxlWzFdKSxhLmNsb25lKG4sZVsyXSksYS5zdWJ0cmFjdChlWzJdLHIsZVsyXSksYS5hZGQoZVsyXSxpLGVbMl0pLGEuc3VidHJhY3QoZVsyXSxzLGVbMl0pLGEuY2xvbmUobixlWzNdKSxhLnN1YnRyYWN0KGVbM10scixlWzNdKSxhLmFkZChlWzNdLGksZVszXSksYS5hZGQoZVszXSxzLGVbM10pLGEuY2xvbmUobixlWzRdKSxhLmFkZChlWzRdLHIsZVs0XSksYS5zdWJ0cmFjdChlWzRdLGksZVs0XSksYS5zdWJ0cmFjdChlWzRdLHMsZVs0XSksYS5jbG9uZShuLGVbNV0pLGEuYWRkKGVbNV0scixlWzVdKSxhLnN1YnRyYWN0KGVbNV0saSxlWzVdKSxhLmFkZChlWzVdLHMsZVs1XSksYS5jbG9uZShuLGVbNl0pLGEuYWRkKGVbNl0scixlWzZdKSxhLmFkZChlWzZdLGksZVs2XSksYS5zdWJ0cmFjdChlWzZdLHMsZVs2XSksYS5jbG9uZShuLGVbN10pLGEuYWRkKGVbN10scixlWzddKSxhLmFkZChlWzddLGksZVs3XSksYS5hZGQoZVs3XSxzLGVbN10pLGV9O2pOPW5ldyBRO0JlLmNvbXB1dGVUcmFuc2Zvcm1hdGlvbj1mdW5jdGlvbih0LGUpe3kudHlwZU9mLm9iamVjdCgiYm94Iix0KSxoKGUpfHwoZT1uZXcgc3QpO2xldCBuPXQuY2VudGVyLG89US5tdWx0aXBseUJ5VW5pZm9ybVNjYWxlKHQuaGFsZkF4ZXMsMixqTik7cmV0dXJuIHN0LmZyb21Sb3RhdGlvblRyYW5zbGF0aW9uKG8sbixlKX07SE49bmV3IEF0O0JlLmlzT2NjbHVkZWQ9ZnVuY3Rpb24odCxlKXtpZighaCh0KSl0aHJvdyBuZXcgQigiYm94IGlzIHJlcXVpcmVkLiIpO2lmKCFoKGUpKXRocm93IG5ldyBCKCJvY2NsdWRlciBpcyByZXF1aXJlZC4iKTtsZXQgbj1BdC5mcm9tT3JpZW50ZWRCb3VuZGluZ0JveCh0LEhOKTtyZXR1cm4hZS5pc0JvdW5kaW5nU3BoZXJlVmlzaWJsZShuKX07QmUucHJvdG90eXBlLmludGVyc2VjdFBsYW5lPWZ1bmN0aW9uKHQpe3JldHVybiBCZS5pbnRlcnNlY3RQbGFuZSh0aGlzLHQpfTtCZS5wcm90b3R5cGUuZGlzdGFuY2VTcXVhcmVkVG89ZnVuY3Rpb24odCl7cmV0dXJuIEJlLmRpc3RhbmNlU3F1YXJlZFRvKHRoaXMsdCl9O0JlLnByb3RvdHlwZS5jb21wdXRlUGxhbmVEaXN0YW5jZXM9ZnVuY3Rpb24odCxlLG4pe3JldHVybiBCZS5jb21wdXRlUGxhbmVEaXN0YW5jZXModGhpcyx0LGUsbil9O0JlLnByb3RvdHlwZS5jb21wdXRlQ29ybmVycz1mdW5jdGlvbih0KXtyZXR1cm4gQmUuY29tcHV0ZUNvcm5lcnModGhpcyx0KX07QmUucHJvdG90eXBlLmNvbXB1dGVUcmFuc2Zvcm1hdGlvbj1mdW5jdGlvbih0KXtyZXR1cm4gQmUuY29tcHV0ZVRyYW5zZm9ybWF0aW9uKHRoaXMsdCl9O0JlLnByb3RvdHlwZS5pc09jY2x1ZGVkPWZ1bmN0aW9uKHQpe3JldHVybiBCZS5pc09jY2x1ZGVkKHRoaXMsdCl9O0JlLmVxdWFscz1mdW5jdGlvbih0LGUpe3JldHVybiB0PT09ZXx8aCh0KSYmaChlKSYmYS5lcXVhbHModC5jZW50ZXIsZS5jZW50ZXIpJiZRLmVxdWFscyh0LmhhbGZBeGVzLGUuaGFsZkF4ZXMpfTtCZS5wcm90b3R5cGUuY2xvbmU9ZnVuY3Rpb24odCl7cmV0dXJuIEJlLmNsb25lKHRoaXMsdCl9O0JlLnByb3RvdHlwZS5lcXVhbHM9ZnVuY3Rpb24odCl7cmV0dXJuIEJlLmVxdWFscyh0aGlzLHQpfTtTbz1CZX0pO2Z1bmN0aW9uIG53KHQsZSxuLG8scil7bGV0IGk9YS5zdWJ0cmFjdCh0LGUscU4pLHM9YS5kb3QobixpKSxmPWEuZG90KG8saSk7cmV0dXJuIHR0LmZyb21FbGVtZW50cyhzLGYscil9dmFyIFBmLHFOLFFULEpULHR3LGV3LGRhLHgwPVooKCk9PntVZSgpO0Z0KCk7WHQoKTtCbigpO3BhKCk7UGY9e30scU49bmV3IGEsUVQ9bmV3IGEsSlQ9bmV3IGEsdHc9bmV3IGEsZXc9bmV3IFNvO1BmLnZhbGlkT3V0bGluZT1mdW5jdGlvbih0KXt5LmRlZmluZWQoInBvc2l0aW9ucyIsdCk7bGV0IG49U28uZnJvbVBvaW50cyh0LGV3KS5oYWxmQXhlcyxvPVEuZ2V0Q29sdW1uKG4sMCxRVCkscj1RLmdldENvbHVtbihuLDEsSlQpLGk9US5nZXRDb2x1bW4obiwyLHR3KSxzPWEubWFnbml0dWRlKG8pLGY9YS5tYWduaXR1ZGUociksdT1hLm1hZ25pdHVkZShpKTtyZXR1cm4hKHM9PT0wJiYoZj09PTB8fHU9PT0wKXx8Zj09PTAmJnU9PT0wKX07UGYuY29tcHV0ZVByb2plY3RUbzJEQXJndW1lbnRzPWZ1bmN0aW9uKHQsZSxuLG8pe3kuZGVmaW5lZCgicG9zaXRpb25zIix0KSx5LmRlZmluZWQoImNlbnRlclJlc3VsdCIsZSkseS5kZWZpbmVkKCJwbGFuZUF4aXMxUmVzdWx0IixuKSx5LmRlZmluZWQoInBsYW5lQXhpczJSZXN1bHQiLG8pO2xldCByPVNvLmZyb21Qb2ludHModCxldyksaT1yLmhhbGZBeGVzLHM9US5nZXRDb2x1bW4oaSwwLFFUKSxmPVEuZ2V0Q29sdW1uKGksMSxKVCksdT1RLmdldENvbHVtbihpLDIsdHcpLGM9YS5tYWduaXR1ZGUocyksbD1hLm1hZ25pdHVkZShmKSxwPWEubWFnbml0dWRlKHUpLGQ9TWF0aC5taW4oYyxsLHApO2lmKGM9PT0wJiYobD09PTB8fHA9PT0wKXx8bD09PTAmJnA9PT0wKXJldHVybiExO2xldCBtLF87cmV0dXJuKGQ9PT1sfHxkPT09cCkmJihtPXMpLGQ9PT1jP209ZjpkPT09cCYmKF89ZiksKGQ9PT1jfHxkPT09bCkmJihfPXUpLGEubm9ybWFsaXplKG0sbiksYS5ub3JtYWxpemUoXyxvKSxhLmNsb25lKHIuY2VudGVyLGUpLCEwfTtQZi5jcmVhdGVQcm9qZWN0UG9pbnRzVG8yREZ1bmN0aW9uPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gZnVuY3Rpb24obyl7bGV0IHI9bmV3IEFycmF5KG8ubGVuZ3RoKTtmb3IobGV0IGk9MDtpPG8ubGVuZ3RoO2krKylyW2ldPW53KG9baV0sdCxlLG4pO3JldHVybiByfX07UGYuY3JlYXRlUHJvamVjdFBvaW50VG8yREZ1bmN0aW9uPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gZnVuY3Rpb24obyxyKXtyZXR1cm4gbncobyx0LGUsbixyKX19O2RhPVBmfSk7dmFyIEtOLF9lLGZjPVooKCk9PntLTj17Tk9ORTowLEdFT0RFU0lDOjEsUkhVTUI6Mn0sX2U9T2JqZWN0LmZyZWV6ZShLTil9KTtmdW5jdGlvbiBNMCh0LGUsbil7aWYodD09PTApcmV0dXJuIGUqbjtsZXQgbz10KnQscj1vKm8saT1yKm8scz1pKm8sZj1zKm8sdT1mKm8sYz1uLGw9TWF0aC5zaW4oMipjKSxwPU1hdGguc2luKDQqYyksZD1NYXRoLnNpbig2KmMpLG09TWF0aC5zaW4oOCpjKSxfPU1hdGguc2luKDEwKmMpLGc9TWF0aC5zaW4oMTIqYyk7cmV0dXJuIGUqKCgxLW8vNC0zKnIvNjQtNSppLzI1Ni0xNzUqcy8xNjM4NC00NDEqZi82NTUzNi00ODUxKnUvMTA0ODU3NikqYy0oMypvLzgrMypyLzMyKzQ1KmkvMTAyNCsxMDUqcy80MDk2KzIyMDUqZi8xMzEwNzIrNjIzNyp1LzUyNDI4OCkqbCsoMTUqci8yNTYrNDUqaS8xMDI0KzUyNSpzLzE2Mzg0KzE1NzUqZi82NTUzNisxNTU5MjUqdS84Mzg4NjA4KSpwLSgzNSppLzMwNzIrMTc1KnMvMTIyODgrMzY3NSpmLzI2MjE0NCsxMzQ3NSp1LzEwNDg1NzYpKmQrKDMxNSpzLzEzMTA3MisyMjA1KmYvNTI0Mjg4KzQzNjU5KnUvODM4ODYwOCkqbS0oNjkzKmYvMTMxMDcyMCs2MjM3KnUvNTI0Mjg4MCkqXysxMDAxKnUvODM4ODYwOCpnKX1mdW5jdGlvbiBXTih0LGUsbil7bGV0IG89dC9uO2lmKGU9PT0wKXJldHVybiBvO2xldCByPW8qbyxpPXIqbyxzPWkqbyxmPWUsdT1mKmYsYz11KnUsbD1jKnUscD1sKnUsZD1wKnUsbT1kKnUsXz1NYXRoLnNpbigyKm8pLGc9TWF0aC5jb3MoMipvKSxiPU1hdGguc2luKDQqbyksVD1NYXRoLmNvcyg0Km8pLE89TWF0aC5zaW4oNipvKSxFPU1hdGguY29zKDYqbyksdz1NYXRoLnNpbig4Km8pLEM9TWF0aC5jb3MoOCpvKSxOPU1hdGguc2luKDEwKm8pLEk9TWF0aC5jb3MoMTAqbyksRD1NYXRoLnNpbigxMipvKTtyZXR1cm4gbytvKnUvNCs3Km8qYy82NCsxNSpvKmwvMjU2KzU3OSpvKnAvMTYzODQrMTUxNSpvKmQvNjU1MzYrMTY4MzcqbyptLzEwNDg1NzYrKDMqbypjLzE2KzQ1Km8qbC8yNTYtbyooMzIqci01NjEpKnAvNDA5Ni1vKigyMzIqci0xNjc3KSpkLzE2Mzg0K28qKDM5OTk4NS05MDU2MCpyKzUxMipzKSptLzUyNDI4ODApKmcrKDIxKm8qbC8yNTYrNDgzKm8qcC80MDk2LW8qKDIyNCpyLTE5NjkpKmQvMTYzODQtbyooMzMxNTIqci0xMTI1OTkpKm0vMTA0ODU3NikqVCsoMTUxKm8qcC80MDk2KzQ2ODEqbypkLzY1NTM2KzE0NzkqbyptLzE2Mzg0LTQ1MyppKm0vMzI3NjgpKkUrKDEwOTcqbypkLzY1NTM2KzQyNzgzKm8qbS8xMDQ4NTc2KSpDKzgwMTEqbyptLzEwNDg1NzYqSSsoMyp1LzgrMypjLzE2KzIxMypsLzIwNDgtMypyKmwvNjQrMjU1KnAvNDA5Ni0zMypyKnAvNTEyKzIwODYxKmQvNTI0Mjg4LTMzKnIqZC81MTIrcypkLzEwMjQrMjgyNzMqbS8xMDQ4NTc2LTQ3MSpyKm0vODE5Mis5KnMqbS80MDk2KSpfKygyMSpjLzI1NisyMSpsLzI1Nis1MzMqcC84MTkyLTIxKnIqcC81MTIrMTk3KmQvNDA5Ni0zMTUqcipkLzQwOTYrNTg0MDM5Km0vMTY3NzcyMTYtMTI1MTcqciptLzEzMTA3Mis3KnMqbS8yMDQ4KSpiKygxNTEqbC82MTQ0KzE1MSpwLzQwOTYrNTAxOSpkLzEzMTA3Mi00NTMqcipkLzE2Mzg0KzI2OTY1Km0vNzg2NDMyLTg2MDcqciptLzEzMTA3MikqTysoMTA5NypwLzEzMTA3MisxMDk3KmQvNjU1MzYrMjI1Nzk3Km0vMTA0ODU3NjAtMTA5NypyKm0vNjU1MzYpKncrKDgwMTEqZC8yNjIxNDQwKzgwMTEqbS8xMDQ4NTc2KSpOKzI5MzM5MyptLzI1MTY1ODI0MCpEfWZ1bmN0aW9uIG1hKHQsZSl7aWYodD09PTApcmV0dXJuIE1hdGgubG9nKE1hdGgudGFuKC41KihNLlBJX09WRVJfVFdPK2UpKSk7bGV0IG49dCpNYXRoLnNpbihlKTtyZXR1cm4gTWF0aC5sb2coTWF0aC50YW4oLjUqKE0uUElfT1ZFUl9UV08rZSkpKS10LzIqTWF0aC5sb2coKDErbikvKDEtbikpfWZ1bmN0aW9uIFhOKHQsZSxuLG8scil7bGV0IGk9bWEodC5fZWxsaXB0aWNpdHksbikscz1tYSh0Ll9lbGxpcHRpY2l0eSxyKTtyZXR1cm4gTWF0aC5hdGFuMihNLm5lZ2F0aXZlUGlUb1BpKG8tZSkscy1pKX1mdW5jdGlvbiBZTih0LGUsbixvLHIsaSxzKXtsZXQgZj10Ll9oZWFkaW5nLHU9aS1vLGM9MDtpZihNLmVxdWFsc0Vwc2lsb24oTWF0aC5hYnMoZiksTS5QSV9PVkVSX1RXTyxNLkVQU0lMT044KSlpZihlPT09biljPWUqTWF0aC5jb3MocikqTS5uZWdhdGl2ZVBpVG9QaSh1KTtlbHNle2xldCBsPU1hdGguc2luKHIpO2M9ZSpNYXRoLmNvcyhyKSpNLm5lZ2F0aXZlUGlUb1BpKHUpL01hdGguc3FydCgxLXQuX2VsbGlwdGljaXR5U3F1YXJlZCpsKmwpfWVsc2V7bGV0IGw9TTAodC5fZWxsaXB0aWNpdHksZSxyKTtjPShNMCh0Ll9lbGxpcHRpY2l0eSxlLHMpLWwpL01hdGguY29zKGYpfXJldHVybiBNYXRoLmFicyhjKX1mdW5jdGlvbiBvdyh0LGUsbixvKXtsZXQgcj1hLm5vcm1hbGl6ZShvLmNhcnRvZ3JhcGhpY1RvQ2FydGVzaWFuKGUsUDApLCROKSxpPWEubm9ybWFsaXplKG8uY2FydG9ncmFwaGljVG9DYXJ0ZXNpYW4obixQMCksUDApO3kudHlwZU9mLm51bWJlci5ncmVhdGVyVGhhbk9yRXF1YWxzKCJ2YWx1ZSIsTWF0aC5hYnMoTWF0aC5hYnMoYS5hbmdsZUJldHdlZW4ocixpKSktTWF0aC5QSSksLjAxMjUpO2xldCBzPW8ubWF4aW11bVJhZGl1cyxmPW8ubWluaW11bVJhZGl1cyx1PXMqcyxjPWYqZjt0Ll9lbGxpcHRpY2l0eVNxdWFyZWQ9KHUtYykvdSx0Ll9lbGxpcHRpY2l0eT1NYXRoLnNxcnQodC5fZWxsaXB0aWNpdHlTcXVhcmVkKSx0Ll9zdGFydD1jdC5jbG9uZShlLHQuX3N0YXJ0KSx0Ll9zdGFydC5oZWlnaHQ9MCx0Ll9lbmQ9Y3QuY2xvbmUobix0Ll9lbmQpLHQuX2VuZC5oZWlnaHQ9MCx0Ll9oZWFkaW5nPVhOKHQsZS5sb25naXR1ZGUsZS5sYXRpdHVkZSxuLmxvbmdpdHVkZSxuLmxhdGl0dWRlKSx0Ll9kaXN0YW5jZT1ZTih0LG8ubWF4aW11bVJhZGl1cyxvLm1pbmltdW1SYWRpdXMsZS5sb25naXR1ZGUsZS5sYXRpdHVkZSxuLmxvbmdpdHVkZSxuLmxhdGl0dWRlKX1mdW5jdGlvbiBydyh0LGUsbixvLHIsaSl7aWYobj09PTApcmV0dXJuIGN0LmNsb25lKHQsaSk7bGV0IHM9cipyLGYsdSxjO2lmKE1hdGguYWJzKE0uUElfT1ZFUl9UV08tTWF0aC5hYnMoZSkpPk0uRVBTSUxPTjgpe2xldCBsPU0wKHIsbyx0LmxhdGl0dWRlKSxwPW4qTWF0aC5jb3MoZSksZD1sK3A7aWYodT1XTihkLHIsbyksTWF0aC5hYnMoZSk8TS5FUFNJTE9OMTApZj1NLm5lZ2F0aXZlUGlUb1BpKHQubG9uZ2l0dWRlKTtlbHNle2xldCBtPW1hKHIsdC5sYXRpdHVkZSksXz1tYShyLHUpO2M9TWF0aC50YW4oZSkqKF8tbSksZj1NLm5lZ2F0aXZlUGlUb1BpKHQubG9uZ2l0dWRlK2MpfX1lbHNle3U9dC5sYXRpdHVkZTtsZXQgbDtpZihyPT09MClsPW8qTWF0aC5jb3ModC5sYXRpdHVkZSk7ZWxzZXtsZXQgcD1NYXRoLnNpbih0LmxhdGl0dWRlKTtsPW8qTWF0aC5jb3ModC5sYXRpdHVkZSkvTWF0aC5zcXJ0KDEtcypwKnApfWM9bi9sLGU+MD9mPU0ubmVnYXRpdmVQaVRvUGkodC5sb25naXR1ZGUrYyk6Zj1NLm5lZ2F0aXZlUGlUb1BpKHQubG9uZ2l0dWRlLWMpfXJldHVybiBoKGkpPyhpLmxvbmdpdHVkZT1mLGkubGF0aXR1ZGU9dSxpLmhlaWdodD0wLGkpOm5ldyBjdChmLHUsMCl9ZnVuY3Rpb24gRmkodCxlLG4pe2xldCBvPXgobiwkLmRlZmF1bHQpO3RoaXMuX2VsbGlwc29pZD1vLHRoaXMuX3N0YXJ0PW5ldyBjdCx0aGlzLl9lbmQ9bmV3IGN0LHRoaXMuX2hlYWRpbmc9dm9pZCAwLHRoaXMuX2Rpc3RhbmNlPXZvaWQgMCx0aGlzLl9lbGxpcHRpY2l0eT12b2lkIDAsdGhpcy5fZWxsaXB0aWNpdHlTcXVhcmVkPXZvaWQgMCxoKHQpJiZoKGUpJiZvdyh0aGlzLHQsZSxvKX12YXIgJE4sUDAsWm8sTWY9WigoKT0+e0Z0KCk7SWUoKTtYdCgpO0l0KCk7ZnQoKTtIdCgpO1p0KCk7V3QoKTskTj1uZXcgYSxQMD1uZXcgYTtPYmplY3QuZGVmaW5lUHJvcGVydGllcyhGaS5wcm90b3R5cGUse2VsbGlwc29pZDp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2VsbGlwc29pZH19LHN1cmZhY2VEaXN0YW5jZTp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHkuZGVmaW5lZCgiZGlzdGFuY2UiLHRoaXMuX2Rpc3RhbmNlKSx0aGlzLl9kaXN0YW5jZX19LHN0YXJ0OntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fc3RhcnR9fSxlbmQ6e2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9lbmR9fSxoZWFkaW5nOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4geS5kZWZpbmVkKCJkaXN0YW5jZSIsdGhpcy5fZGlzdGFuY2UpLHRoaXMuX2hlYWRpbmd9fX0pO0ZpLmZyb21TdGFydEhlYWRpbmdEaXN0YW5jZT1mdW5jdGlvbih0LGUsbixvLHIpe3kuZGVmaW5lZCgic3RhcnQiLHQpLHkuZGVmaW5lZCgiaGVhZGluZyIsZSkseS5kZWZpbmVkKCJkaXN0YW5jZSIsbikseS50eXBlT2YubnVtYmVyLmdyZWF0ZXJUaGFuKCJkaXN0YW5jZSIsbiwwKTtsZXQgaT14KG8sJC5kZWZhdWx0KSxzPWkubWF4aW11bVJhZGl1cyxmPWkubWluaW11bVJhZGl1cyx1PXMqcyxjPWYqZixsPU1hdGguc3FydCgodS1jKS91KTtlPU0ubmVnYXRpdmVQaVRvUGkoZSk7bGV0IHA9cncodCxlLG4saS5tYXhpbXVtUmFkaXVzLGwpO3JldHVybiFoKHIpfHxoKG8pJiYhby5lcXVhbHMoci5lbGxpcHNvaWQpP25ldyBGaSh0LHAsaSk6KHIuc2V0RW5kUG9pbnRzKHQscCkscil9O0ZpLnByb3RvdHlwZS5zZXRFbmRQb2ludHM9ZnVuY3Rpb24odCxlKXt5LmRlZmluZWQoInN0YXJ0Iix0KSx5LmRlZmluZWQoImVuZCIsZSksb3codGhpcyx0LGUsdGhpcy5fZWxsaXBzb2lkKX07RmkucHJvdG90eXBlLmludGVycG9sYXRlVXNpbmdGcmFjdGlvbj1mdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLmludGVycG9sYXRlVXNpbmdTdXJmYWNlRGlzdGFuY2UodCp0aGlzLl9kaXN0YW5jZSxlKX07RmkucHJvdG90eXBlLmludGVycG9sYXRlVXNpbmdTdXJmYWNlRGlzdGFuY2U9ZnVuY3Rpb24odCxlKXtpZih5LnR5cGVPZi5udW1iZXIoImRpc3RhbmNlIix0KSwhaCh0aGlzLl9kaXN0YW5jZSl8fHRoaXMuX2Rpc3RhbmNlPT09MCl0aHJvdyBuZXcgQigiRWxsaXBzb2lkUmh1bWJMaW5lIG11c3QgaGF2ZSBkaXN0aW5jdCBzdGFydCBhbmQgZW5kIHNldC4iKTtyZXR1cm4gcncodGhpcy5fc3RhcnQsdGhpcy5faGVhZGluZyx0LHRoaXMuX2VsbGlwc29pZC5tYXhpbXVtUmFkaXVzLHRoaXMuX2VsbGlwdGljaXR5LGUpfTtGaS5wcm90b3R5cGUuZmluZEludGVyc2VjdGlvbldpdGhMb25naXR1ZGU9ZnVuY3Rpb24odCxlKXtpZih5LnR5cGVPZi5udW1iZXIoImludGVyc2VjdGlvbkxvbmdpdHVkZSIsdCksIWgodGhpcy5fZGlzdGFuY2UpfHx0aGlzLl9kaXN0YW5jZT09PTApdGhyb3cgbmV3IEIoIkVsbGlwc29pZFJodW1iTGluZSBtdXN0IGhhdmUgZGlzdGluY3Qgc3RhcnQgYW5kIGVuZCBzZXQuIik7bGV0IG49dGhpcy5fZWxsaXB0aWNpdHksbz10aGlzLl9oZWFkaW5nLHI9TWF0aC5hYnMobyksaT10aGlzLl9zdGFydDtpZih0PU0ubmVnYXRpdmVQaVRvUGkodCksTS5lcXVhbHNFcHNpbG9uKE1hdGguYWJzKHQpLE1hdGguUEksTS5FUFNJTE9OMTQpJiYodD1NLnNpZ24oaS5sb25naXR1ZGUpKk1hdGguUEkpLGgoZSl8fChlPW5ldyBjdCksTWF0aC5hYnMoTS5QSV9PVkVSX1RXTy1yKTw9TS5FUFNJTE9OOClyZXR1cm4gZS5sb25naXR1ZGU9dCxlLmxhdGl0dWRlPWkubGF0aXR1ZGUsZS5oZWlnaHQ9MCxlO2lmKE0uZXF1YWxzRXBzaWxvbihNYXRoLmFicyhNLlBJX09WRVJfVFdPLXIpLE0uUElfT1ZFUl9UV08sTS5FUFNJTE9OOCkpcmV0dXJuIE0uZXF1YWxzRXBzaWxvbih0LGkubG9uZ2l0dWRlLE0uRVBTSUxPTjEyKT92b2lkIDA6KGUubG9uZ2l0dWRlPXQsZS5sYXRpdHVkZT1NLlBJX09WRVJfVFdPKk0uc2lnbihNLlBJX09WRVJfVFdPLW8pLGUuaGVpZ2h0PTAsZSk7bGV0IHM9aS5sYXRpdHVkZSxmPW4qTWF0aC5zaW4ocyksdT1NYXRoLnRhbiguNSooTS5QSV9PVkVSX1RXTytzKSkqTWF0aC5leHAoKHQtaS5sb25naXR1ZGUpL01hdGgudGFuKG8pKSxjPSgxK2YpLygxLWYpLGw9aS5sYXRpdHVkZSxwO2Rve3A9bDtsZXQgZD1uKk1hdGguc2luKHApLG09KDErZCkvKDEtZCk7bD0yKk1hdGguYXRhbih1Kk1hdGgucG93KG0vYyxuLzIpKS1NLlBJX09WRVJfVFdPfXdoaWxlKCFNLmVxdWFsc0Vwc2lsb24obCxwLE0uRVBTSUxPTjEyKSk7cmV0dXJuIGUubG9uZ2l0dWRlPXQsZS5sYXRpdHVkZT1sLGUuaGVpZ2h0PTAsZX07RmkucHJvdG90eXBlLmZpbmRJbnRlcnNlY3Rpb25XaXRoTGF0aXR1ZGU9ZnVuY3Rpb24odCxlKXtpZih5LnR5cGVPZi5udW1iZXIoImludGVyc2VjdGlvbkxhdGl0dWRlIix0KSwhaCh0aGlzLl9kaXN0YW5jZSl8fHRoaXMuX2Rpc3RhbmNlPT09MCl0aHJvdyBuZXcgQigiRWxsaXBzb2lkUmh1bWJMaW5lIG11c3QgaGF2ZSBkaXN0aW5jdCBzdGFydCBhbmQgZW5kIHNldC4iKTtsZXQgbj10aGlzLl9lbGxpcHRpY2l0eSxvPXRoaXMuX2hlYWRpbmcscj10aGlzLl9zdGFydDtpZihNLmVxdWFsc0Vwc2lsb24oTWF0aC5hYnMobyksTS5QSV9PVkVSX1RXTyxNLkVQU0lMT044KSlyZXR1cm47bGV0IGk9bWEobixyLmxhdGl0dWRlKSxzPW1hKG4sdCksZj1NYXRoLnRhbihvKSoocy1pKSx1PU0ubmVnYXRpdmVQaVRvUGkoci5sb25naXR1ZGUrZik7cmV0dXJuIGgoZSk/KGUubG9uZ2l0dWRlPXUsZS5sYXRpdHVkZT10LGUuaGVpZ2h0PTAsZSk6bmV3IGN0KHUsdCwwKX07Wm89Rml9KTtmdW5jdGlvbiBaTih0LGUpe3RoaXMucG9zaXRpb25zPWgodCk/dDpbXSx0aGlzLmhvbGVzPWgoZSk/ZTpbXX12YXIgaXcsc3c9WigoKT0+e2Z0KCk7aXc9Wk59KTtmdW5jdGlvbiB2MCh0LGUsbj0yKXtsZXQgbz1lJiZlLmxlbmd0aCxyPW8/ZVswXSpuOnQubGVuZ3RoLGk9YXcodCwwLHIsbiwhMCkscz1bXTtpZighaXx8aS5uZXh0PT09aS5wcmV2KXJldHVybiBzO2xldCBmLHUsYztpZihvJiYoaT1uSSh0LGUsaSxuKSksdC5sZW5ndGg+ODAqbil7Zj0xLzAsdT0xLzA7bGV0IGw9LTEvMCxwPS0xLzA7Zm9yKGxldCBkPW47ZDxyO2QrPW4pe2xldCBtPXRbZF0sXz10W2QrMV07bTxmJiYoZj1tKSxfPHUmJih1PV8pLG0+bCYmKGw9bSksXz5wJiYocD1fKX1jPU1hdGgubWF4KGwtZixwLXUpLGM9YyE9PTA/MzI3NjcvYzowfXJldHVybiBJZihpLHMsbixmLHUsYywwKSxzfWZ1bmN0aW9uIGF3KHQsZSxuLG8scil7bGV0IGk7aWYocj09PWRJKHQsZSxuLG8pPjApZm9yKGxldCBzPWU7czxuO3MrPW8paT1jdyhzL298MCx0W3NdLHRbcysxXSxpKTtlbHNlIGZvcihsZXQgcz1uLW87cz49ZTtzLT1vKWk9Y3cocy9vfDAsdFtzXSx0W3MrMV0saSk7cmV0dXJuIGkmJmhhKGksaS5uZXh0KSYmKExmKGkpLGk9aS5uZXh0KSxpfWZ1bmN0aW9uIHVjKHQsZSl7aWYoIXQpcmV0dXJuIHQ7ZXx8KGU9dCk7bGV0IG49dCxvO2RvIGlmKG89ITEsIW4uc3RlaW5lciYmKGhhKG4sbi5uZXh0KXx8dm4obi5wcmV2LG4sbi5uZXh0KT09PTApKXtpZihMZihuKSxuPWU9bi5wcmV2LG49PT1uLm5leHQpYnJlYWs7bz0hMH1lbHNlIG49bi5uZXh0O3doaWxlKG98fG4hPT1lKTtyZXR1cm4gZX1mdW5jdGlvbiBJZih0LGUsbixvLHIsaSxzKXtpZighdClyZXR1cm47IXMmJmkmJmNJKHQsbyxyLGkpO2xldCBmPXQ7Zm9yKDt0LnByZXYhPT10Lm5leHQ7KXtsZXQgdT10LnByZXYsYz10Lm5leHQ7aWYoaT9KTih0LG8scixpKTpRTih0KSl7ZS5wdXNoKHUuaSx0LmksYy5pKSxMZih0KSx0PWMubmV4dCxmPWMubmV4dDtjb250aW51ZX1pZih0PWMsdD09PWYpe3M/cz09PTE/KHQ9dEkodWModCksZSksSWYodCxlLG4sbyxyLGksMikpOnM9PT0yJiZlSSh0LGUsbixvLHIsaSk6SWYodWModCksZSxuLG8scixpLDEpO2JyZWFrfX19ZnVuY3Rpb24gUU4odCl7bGV0IGU9dC5wcmV2LG49dCxvPXQubmV4dDtpZih2bihlLG4sbyk+PTApcmV0dXJuITE7bGV0IHI9ZS54LGk9bi54LHM9by54LGY9ZS55LHU9bi55LGM9by55LGw9TWF0aC5taW4ocixpLHMpLHA9TWF0aC5taW4oZix1LGMpLGQ9TWF0aC5tYXgocixpLHMpLG09TWF0aC5tYXgoZix1LGMpLF89by5uZXh0O2Zvcig7XyE9PWU7KXtpZihfLng+PWwmJl8ueDw9ZCYmXy55Pj1wJiZfLnk8PW0mJk5mKHIsZixpLHUscyxjLF8ueCxfLnkpJiZ2bihfLnByZXYsXyxfLm5leHQpPj0wKXJldHVybiExO189Xy5uZXh0fXJldHVybiEwfWZ1bmN0aW9uIEpOKHQsZSxuLG8pe2xldCByPXQucHJldixpPXQscz10Lm5leHQ7aWYodm4ocixpLHMpPj0wKXJldHVybiExO2xldCBmPXIueCx1PWkueCxjPXMueCxsPXIueSxwPWkueSxkPXMueSxtPU1hdGgubWluKGYsdSxjKSxfPU1hdGgubWluKGwscCxkKSxnPU1hdGgubWF4KGYsdSxjKSxiPU1hdGgubWF4KGwscCxkKSxUPU4wKG0sXyxlLG4sbyksTz1OMChnLGIsZSxuLG8pLEU9dC5wcmV2Wix3PXQubmV4dFo7Zm9yKDtFJiZFLno+PVQmJncmJncuejw9Tzspe2lmKEUueD49bSYmRS54PD1nJiZFLnk+PV8mJkUueTw9YiYmRSE9PXImJkUhPT1zJiZOZihmLGwsdSxwLGMsZCxFLngsRS55KSYmdm4oRS5wcmV2LEUsRS5uZXh0KT49MHx8KEU9RS5wcmV2Wix3Lng+PW0mJncueDw9ZyYmdy55Pj1fJiZ3Lnk8PWImJnchPT1yJiZ3IT09cyYmTmYoZixsLHUscCxjLGQsdy54LHcueSkmJnZuKHcucHJldix3LHcubmV4dCk+PTApKXJldHVybiExO3c9dy5uZXh0Wn1mb3IoO0UmJkUuej49VDspe2lmKEUueD49bSYmRS54PD1nJiZFLnk+PV8mJkUueTw9YiYmRSE9PXImJkUhPT1zJiZOZihmLGwsdSxwLGMsZCxFLngsRS55KSYmdm4oRS5wcmV2LEUsRS5uZXh0KT49MClyZXR1cm4hMTtFPUUucHJldlp9Zm9yKDt3JiZ3Lno8PU87KXtpZih3Lng+PW0mJncueDw9ZyYmdy55Pj1fJiZ3Lnk8PWImJnchPT1yJiZ3IT09cyYmTmYoZixsLHUscCxjLGQsdy54LHcueSkmJnZuKHcucHJldix3LHcubmV4dCk+PTApcmV0dXJuITE7dz13Lm5leHRafXJldHVybiEwfWZ1bmN0aW9uIHRJKHQsZSl7bGV0IG49dDtkb3tsZXQgbz1uLnByZXYscj1uLm5leHQubmV4dDshaGEobyxyKSYmdXcobyxuLG4ubmV4dCxyKSYmdmYobyxyKSYmdmYocixvKSYmKGUucHVzaChvLmksbi5pLHIuaSksTGYobiksTGYobi5uZXh0KSxuPXQ9ciksbj1uLm5leHR9d2hpbGUobiE9PXQpO3JldHVybiB1YyhuKX1mdW5jdGlvbiBlSSh0LGUsbixvLHIsaSl7bGV0IHM9dDtkb3tsZXQgZj1zLm5leHQubmV4dDtmb3IoO2YhPT1zLnByZXY7KXtpZihzLmkhPT1mLmkmJnVJKHMsZikpe2xldCB1PWx3KHMsZik7cz11YyhzLHMubmV4dCksdT11Yyh1LHUubmV4dCksSWYocyxlLG4sbyxyLGksMCksSWYodSxlLG4sbyxyLGksMCk7cmV0dXJufWY9Zi5uZXh0fXM9cy5uZXh0fXdoaWxlKHMhPT10KX1mdW5jdGlvbiBuSSh0LGUsbixvKXtsZXQgcj1bXTtmb3IobGV0IGk9MCxzPWUubGVuZ3RoO2k8cztpKyspe2xldCBmPWVbaV0qbyx1PWk8cy0xP2VbaSsxXSpvOnQubGVuZ3RoLGM9YXcodCxmLHUsbywhMSk7Yz09PWMubmV4dCYmKGMuc3RlaW5lcj0hMCksci5wdXNoKGZJKGMpKX1yLnNvcnQob0kpO2ZvcihsZXQgaT0wO2k8ci5sZW5ndGg7aSsrKW49ckkocltpXSxuKTtyZXR1cm4gbn1mdW5jdGlvbiBvSSh0LGUpe2xldCBuPXQueC1lLng7aWYobj09PTAmJihuPXQueS1lLnksbj09PTApKXtsZXQgbz0odC5uZXh0LnktdC55KS8odC5uZXh0LngtdC54KSxyPShlLm5leHQueS1lLnkpLyhlLm5leHQueC1lLngpO249by1yfXJldHVybiBufWZ1bmN0aW9uIHJJKHQsZSl7bGV0IG49aUkodCxlKTtpZighbilyZXR1cm4gZTtsZXQgbz1sdyhuLHQpO3JldHVybiB1YyhvLG8ubmV4dCksdWMobixuLm5leHQpfWZ1bmN0aW9uIGlJKHQsZSl7bGV0IG49ZSxvPXQueCxyPXQueSxpPS0xLzAscztpZihoYSh0LG4pKXJldHVybiBuO2Rve2lmKGhhKHQsbi5uZXh0KSlyZXR1cm4gbi5uZXh0O2lmKHI8PW4ueSYmcj49bi5uZXh0LnkmJm4ubmV4dC55IT09bi55KXtsZXQgcD1uLngrKHItbi55KSoobi5uZXh0Lngtbi54KS8obi5uZXh0Lnktbi55KTtpZihwPD1vJiZwPmkmJihpPXAscz1uLng8bi5uZXh0Lng/bjpuLm5leHQscD09PW8pKXJldHVybiBzfW49bi5uZXh0fXdoaWxlKG4hPT1lKTtpZighcylyZXR1cm4gbnVsbDtsZXQgZj1zLHU9cy54LGM9cy55LGw9MS8wO249cztkb3tpZihvPj1uLngmJm4ueD49dSYmbyE9PW4ueCYmZncocjxjP286aSxyLHUsYyxyPGM/aTpvLHIsbi54LG4ueSkpe2xldCBwPU1hdGguYWJzKHItbi55KS8oby1uLngpO3ZmKG4sdCkmJihwPGx8fHA9PT1sJiYobi54PnMueHx8bi54PT09cy54JiZzSShzLG4pKSkmJihzPW4sbD1wKX1uPW4ubmV4dH13aGlsZShuIT09Zik7cmV0dXJuIHN9ZnVuY3Rpb24gc0kodCxlKXtyZXR1cm4gdm4odC5wcmV2LHQsZS5wcmV2KTwwJiZ2bihlLm5leHQsdCx0Lm5leHQpPDB9ZnVuY3Rpb24gY0kodCxlLG4sbyl7bGV0IHI9dDtkbyByLno9PT0wJiYoci56PU4wKHIueCxyLnksZSxuLG8pKSxyLnByZXZaPXIucHJldixyLm5leHRaPXIubmV4dCxyPXIubmV4dDt3aGlsZShyIT09dCk7ci5wcmV2Wi5uZXh0Wj1udWxsLHIucHJldlo9bnVsbCxhSShyKX1mdW5jdGlvbiBhSSh0KXtsZXQgZSxuPTE7ZG97bGV0IG89dCxyO3Q9bnVsbDtsZXQgaT1udWxsO2ZvcihlPTA7bzspe2UrKztsZXQgcz1vLGY9MDtmb3IobGV0IGM9MDtjPG4mJihmKysscz1zLm5leHRaLCEhcyk7YysrKTtsZXQgdT1uO2Zvcig7Zj4wfHx1PjAmJnM7KWYhPT0wJiYodT09PTB8fCFzfHxvLno8PXMueik/KHI9byxvPW8ubmV4dFosZi0tKToocj1zLHM9cy5uZXh0Wix1LS0pLGk/aS5uZXh0Wj1yOnQ9cixyLnByZXZaPWksaT1yO289c31pLm5leHRaPW51bGwsbio9Mn13aGlsZShlPjEpO3JldHVybiB0fWZ1bmN0aW9uIE4wKHQsZSxuLG8scil7cmV0dXJuIHQ9KHQtbikqcnwwLGU9KGUtbykqcnwwLHQ9KHR8dDw8OCkmMTY3MTE5MzUsdD0odHx0PDw0KSYyNTI2NDUxMzUsdD0odHx0PDwyKSY4NTg5OTM0NTksdD0odHx0PDwxKSYxNDMxNjU1NzY1LGU9KGV8ZTw8OCkmMTY3MTE5MzUsZT0oZXxlPDw0KSYyNTI2NDUxMzUsZT0oZXxlPDwyKSY4NTg5OTM0NTksZT0oZXxlPDwxKSYxNDMxNjU1NzY1LHR8ZTw8MX1mdW5jdGlvbiBmSSh0KXtsZXQgZT10LG49dDtkbyhlLng8bi54fHxlLng9PT1uLngmJmUueTxuLnkpJiYobj1lKSxlPWUubmV4dDt3aGlsZShlIT09dCk7cmV0dXJuIG59ZnVuY3Rpb24gZncodCxlLG4sbyxyLGkscyxmKXtyZXR1cm4oci1zKSooZS1mKT49KHQtcykqKGktZikmJih0LXMpKihvLWYpPj0obi1zKSooZS1mKSYmKG4tcykqKGktZik+PShyLXMpKihvLWYpfWZ1bmN0aW9uIE5mKHQsZSxuLG8scixpLHMsZil7cmV0dXJuISh0PT09cyYmZT09PWYpJiZmdyh0LGUsbixvLHIsaSxzLGYpfWZ1bmN0aW9uIHVJKHQsZSl7cmV0dXJuIHQubmV4dC5pIT09ZS5pJiZ0LnByZXYuaSE9PWUuaSYmIWxJKHQsZSkmJih2Zih0LGUpJiZ2ZihlLHQpJiZwSSh0LGUpJiYodm4odC5wcmV2LHQsZS5wcmV2KXx8dm4odCxlLnByZXYsZSkpfHxoYSh0LGUpJiZ2bih0LnByZXYsdCx0Lm5leHQpPjAmJnZuKGUucHJldixlLGUubmV4dCk+MCl9ZnVuY3Rpb24gdm4odCxlLG4pe3JldHVybihlLnktdC55KSoobi54LWUueCktKGUueC10LngpKihuLnktZS55KX1mdW5jdGlvbiBoYSh0LGUpe3JldHVybiB0Lng9PT1lLngmJnQueT09PWUueX1mdW5jdGlvbiB1dyh0LGUsbixvKXtsZXQgcj1vZCh2bih0LGUsbikpLGk9b2Qodm4odCxlLG8pKSxzPW9kKHZuKG4sbyx0KSksZj1vZCh2bihuLG8sZSkpO3JldHVybiEhKHIhPT1pJiZzIT09Znx8cj09PTAmJm5kKHQsbixlKXx8aT09PTAmJm5kKHQsbyxlKXx8cz09PTAmJm5kKG4sdCxvKXx8Zj09PTAmJm5kKG4sZSxvKSl9ZnVuY3Rpb24gbmQodCxlLG4pe3JldHVybiBlLng8PU1hdGgubWF4KHQueCxuLngpJiZlLng+PU1hdGgubWluKHQueCxuLngpJiZlLnk8PU1hdGgubWF4KHQueSxuLnkpJiZlLnk+PU1hdGgubWluKHQueSxuLnkpfWZ1bmN0aW9uIG9kKHQpe3JldHVybiB0PjA/MTp0PDA/LTE6MH1mdW5jdGlvbiBsSSh0LGUpe2xldCBuPXQ7ZG97aWYobi5pIT09dC5pJiZuLm5leHQuaSE9PXQuaSYmbi5pIT09ZS5pJiZuLm5leHQuaSE9PWUuaSYmdXcobixuLm5leHQsdCxlKSlyZXR1cm4hMDtuPW4ubmV4dH13aGlsZShuIT09dCk7cmV0dXJuITF9ZnVuY3Rpb24gdmYodCxlKXtyZXR1cm4gdm4odC5wcmV2LHQsdC5uZXh0KTwwP3ZuKHQsZSx0Lm5leHQpPj0wJiZ2bih0LHQucHJldixlKT49MDp2bih0LGUsdC5wcmV2KTwwfHx2bih0LHQubmV4dCxlKTwwfWZ1bmN0aW9uIHBJKHQsZSl7bGV0IG49dCxvPSExLHI9KHQueCtlLngpLzIsaT0odC55K2UueSkvMjtkbyBuLnk+aSE9bi5uZXh0Lnk+aSYmbi5uZXh0LnkhPT1uLnkmJnI8KG4ubmV4dC54LW4ueCkqKGktbi55KS8obi5uZXh0Lnktbi55KStuLngmJihvPSFvKSxuPW4ubmV4dDt3aGlsZShuIT09dCk7cmV0dXJuIG99ZnVuY3Rpb24gbHcodCxlKXtsZXQgbj1JMCh0LmksdC54LHQueSksbz1JMChlLmksZS54LGUueSkscj10Lm5leHQsaT1lLnByZXY7cmV0dXJuIHQubmV4dD1lLGUucHJldj10LG4ubmV4dD1yLHIucHJldj1uLG8ubmV4dD1uLG4ucHJldj1vLGkubmV4dD1vLG8ucHJldj1pLG99ZnVuY3Rpb24gY3codCxlLG4sbyl7bGV0IHI9STAodCxlLG4pO3JldHVybiBvPyhyLm5leHQ9by5uZXh0LHIucHJldj1vLG8ubmV4dC5wcmV2PXIsby5uZXh0PXIpOihyLnByZXY9cixyLm5leHQ9cikscn1mdW5jdGlvbiBMZih0KXt0Lm5leHQucHJldj10LnByZXYsdC5wcmV2Lm5leHQ9dC5uZXh0LHQucHJldlomJih0LnByZXZaLm5leHRaPXQubmV4dFopLHQubmV4dFomJih0Lm5leHRaLnByZXZaPXQucHJldlopfWZ1bmN0aW9uIEkwKHQsZSxuKXtyZXR1cm57aTp0LHg6ZSx5Om4scHJldjpudWxsLG5leHQ6bnVsbCx6OjAscHJldlo6bnVsbCxuZXh0WjpudWxsLHN0ZWluZXI6ITF9fWZ1bmN0aW9uIGRJKHQsZSxuLG8pe2xldCByPTA7Zm9yKGxldCBpPWUscz1uLW87aTxuO2krPW8pcis9KHRbc10tdFtpXSkqKHRbaSsxXSt0W3MrMV0pLHM9aTtyZXR1cm4gcn12YXIgcHc9WigoKT0+e30pO3ZhciByZCxDbyxsYz1aKCgpPT57JHMoKTtyZD17Q0xPQ0tXSVNFOnF0LkNXLENPVU5URVJfQ0xPQ0tXSVNFOnF0LkNDV307cmQudmFsaWRhdGU9ZnVuY3Rpb24odCl7cmV0dXJuIHQ9PT1yZC5DTE9DS1dJU0V8fHQ9PT1yZC5DT1VOVEVSX0NMT0NLV0lTRX07Q289T2JqZWN0LmZyZWV6ZShyZCl9KTt2YXIgbUksaEksbHMsX3cseXcsZ3csZHcsbXcsaHcsQmksQXcsYncsVHcsX2EsX0kseUksZ0ksTDAsUGUscXI9WigoKT0+e3B3KCk7VWUoKTtGdCgpO0llKCk7WHQoKTtGZSgpO0l0KCk7ZnQoKTtadCgpO01mKCk7WGUoKTtZZSgpO1d0KCk7dG4oKTtsYygpO21JPW5ldyBhLGhJPW5ldyBhLGxzPXt9O2xzLmNvbXB1dGVBcmVhMkQ9ZnVuY3Rpb24odCl7eS5kZWZpbmVkKCJwb3NpdGlvbnMiLHQpLHkudHlwZU9mLm51bWJlci5ncmVhdGVyVGhhbk9yRXF1YWxzKCJwb3NpdGlvbnMubGVuZ3RoIix0Lmxlbmd0aCwzKTtsZXQgZT10Lmxlbmd0aCxuPTA7Zm9yKGxldCBvPWUtMSxyPTA7cjxlO289cisrKXtsZXQgaT10W29dLHM9dFtyXTtuKz1pLngqcy55LXMueCppLnl9cmV0dXJuIG4qLjV9O2xzLmNvbXB1dGVXaW5kaW5nT3JkZXIyRD1mdW5jdGlvbih0KXtyZXR1cm4gbHMuY29tcHV0ZUFyZWEyRCh0KT4wP0NvLkNPVU5URVJfQ0xPQ0tXSVNFOkNvLkNMT0NLV0lTRX07bHMudHJpYW5ndWxhdGU9ZnVuY3Rpb24odCxlKXt5LmRlZmluZWQoInBvc2l0aW9ucyIsdCk7bGV0IG49dHQucGFja0FycmF5KHQpO3JldHVybiB2MChuLGUsMil9O193PW5ldyBhLHl3PW5ldyBhLGd3PW5ldyBhLGR3PW5ldyBhLG13PW5ldyBhLGh3PW5ldyBhLEJpPW5ldyBhLEF3PW5ldyB0dCxidz1uZXcgdHQsVHc9bmV3IHR0LF9hPW5ldyB0dDtscy5jb21wdXRlU3ViZGl2aXNpb249ZnVuY3Rpb24odCxlLG4sbyxyKXtyPXgocixNLlJBRElBTlNfUEVSX0RFR1JFRSk7bGV0IGk9aChvKTt5LnR5cGVPZi5vYmplY3QoImVsbGlwc29pZCIsdCkseS5kZWZpbmVkKCJwb3NpdGlvbnMiLGUpLHkuZGVmaW5lZCgiaW5kaWNlcyIsbikseS50eXBlT2YubnVtYmVyLmdyZWF0ZXJUaGFuT3JFcXVhbHMoImluZGljZXMubGVuZ3RoIixuLmxlbmd0aCwzKSx5LnR5cGVPZi5udW1iZXIuZXF1YWxzKCJpbmRpY2VzLmxlbmd0aCAlIDMiLCIwIixuLmxlbmd0aCUzLDApLHkudHlwZU9mLm51bWJlci5ncmVhdGVyVGhhbigiZ3JhbnVsYXJpdHkiLHIsMCk7bGV0IHM9bi5zbGljZSgwKSxmLHU9ZS5sZW5ndGgsYz1uZXcgQXJyYXkodSozKSxsPW5ldyBBcnJheSh1KjIpLHA9MCxkPTA7Zm9yKGY9MDtmPHU7ZisrKXtsZXQgRT1lW2ZdO2lmKGNbcCsrXT1FLngsY1twKytdPUUueSxjW3ArK109RS56LGkpe2xldCB3PW9bZl07bFtkKytdPXcueCxsW2QrK109dy55fX1sZXQgbT1bXSxfPXt9LGc9dC5tYXhpbXVtUmFkaXVzLGI9TS5jaG9yZExlbmd0aChyLGcpLFQ9YipiO2Zvcig7cy5sZW5ndGg+MDspe2xldCBFPXMucG9wKCksdz1zLnBvcCgpLEM9cy5wb3AoKSxOPWEuZnJvbUFycmF5KGMsQyozLF93KSxJPWEuZnJvbUFycmF5KGMsdyozLHl3KSxEPWEuZnJvbUFycmF5KGMsRSozLGd3KSx2LEwsVTtpJiYodj10dC5mcm9tQXJyYXkobCxDKjIsQXcpLEw9dHQuZnJvbUFycmF5KGwsdyoyLGJ3KSxVPXR0LmZyb21BcnJheShsLEUqMixUdykpO2xldCBBPWEubXVsdGlwbHlCeVNjYWxhcihhLm5vcm1hbGl6ZShOLGR3KSxnLGR3KSxTPWEubXVsdGlwbHlCeVNjYWxhcihhLm5vcm1hbGl6ZShJLG13KSxnLG13KSxQPWEubXVsdGlwbHlCeVNjYWxhcihhLm5vcm1hbGl6ZShELGh3KSxnLGh3KSxGPWEubWFnbml0dWRlU3F1YXJlZChhLnN1YnRyYWN0KEEsUyxCaSkpLGo9YS5tYWduaXR1ZGVTcXVhcmVkKGEuc3VidHJhY3QoUyxQLEJpKSksSD1hLm1hZ25pdHVkZVNxdWFyZWQoYS5zdWJ0cmFjdChQLEEsQmkpKSxrPU1hdGgubWF4KEYsaixIKSxLLFgsUjtrPlQ/Rj09PWs/KEs9YCR7TWF0aC5taW4oQyx3KX0gJHtNYXRoLm1heChDLHcpfWAsZj1fW0tdLGgoZil8fChYPWEuYWRkKE4sSSxCaSksYS5tdWx0aXBseUJ5U2NhbGFyKFgsLjUsWCksYy5wdXNoKFgueCxYLnksWC56KSxmPWMubGVuZ3RoLzMtMSxfW0tdPWYsaSYmKFI9dHQuYWRkKHYsTCxfYSksdHQubXVsdGlwbHlCeVNjYWxhcihSLC41LFIpLGwucHVzaChSLngsUi55KSkpLHMucHVzaChDLGYsRSkscy5wdXNoKGYsdyxFKSk6aj09PWs/KEs9YCR7TWF0aC5taW4odyxFKX0gJHtNYXRoLm1heCh3LEUpfWAsZj1fW0tdLGgoZil8fChYPWEuYWRkKEksRCxCaSksYS5tdWx0aXBseUJ5U2NhbGFyKFgsLjUsWCksYy5wdXNoKFgueCxYLnksWC56KSxmPWMubGVuZ3RoLzMtMSxfW0tdPWYsaSYmKFI9dHQuYWRkKEwsVSxfYSksdHQubXVsdGlwbHlCeVNjYWxhcihSLC41LFIpLGwucHVzaChSLngsUi55KSkpLHMucHVzaCh3LGYsQykscy5wdXNoKGYsRSxDKSk6SD09PWsmJihLPWAke01hdGgubWluKEUsQyl9ICR7TWF0aC5tYXgoRSxDKX1gLGY9X1tLXSxoKGYpfHwoWD1hLmFkZChELE4sQmkpLGEubXVsdGlwbHlCeVNjYWxhcihYLC41LFgpLGMucHVzaChYLngsWC55LFgueiksZj1jLmxlbmd0aC8zLTEsX1tLXT1mLGkmJihSPXR0LmFkZChVLHYsX2EpLHR0Lm11bHRpcGx5QnlTY2FsYXIoUiwuNSxSKSxsLnB1c2goUi54LFIueSkpKSxzLnB1c2goRSxmLHcpLHMucHVzaChmLEMsdykpOihtLnB1c2goQyksbS5wdXNoKHcpLG0ucHVzaChFKSl9bGV0IE89e2F0dHJpYnV0ZXM6e3Bvc2l0aW9uOm5ldyBpdCh7Y29tcG9uZW50RGF0YXR5cGU6bnQuRE9VQkxFLGNvbXBvbmVudHNQZXJBdHRyaWJ1dGU6Myx2YWx1ZXM6Y30pfSxpbmRpY2VzOm0scHJpbWl0aXZlVHlwZTpCdC5UUklBTkdMRVN9O3JldHVybiBpJiYoTy5hdHRyaWJ1dGVzLnN0PW5ldyBpdCh7Y29tcG9uZW50RGF0YXR5cGU6bnQuRkxPQVQsY29tcG9uZW50c1BlckF0dHJpYnV0ZToyLHZhbHVlczpsfSkpLG5ldyBVdChPKX07X0k9bmV3IGN0LHlJPW5ldyBjdCxnST1uZXcgY3QsTDA9bmV3IGN0O2xzLmNvbXB1dGVSaHVtYkxpbmVTdWJkaXZpc2lvbj1mdW5jdGlvbih0LGUsbixvLHIpe3I9eChyLE0uUkFESUFOU19QRVJfREVHUkVFKTtsZXQgaT1oKG8pO3kudHlwZU9mLm9iamVjdCgiZWxsaXBzb2lkIix0KSx5LmRlZmluZWQoInBvc2l0aW9ucyIsZSkseS5kZWZpbmVkKCJpbmRpY2VzIixuKSx5LnR5cGVPZi5udW1iZXIuZ3JlYXRlclRoYW5PckVxdWFscygiaW5kaWNlcy5sZW5ndGgiLG4ubGVuZ3RoLDMpLHkudHlwZU9mLm51bWJlci5lcXVhbHMoImluZGljZXMubGVuZ3RoICUgMyIsIjAiLG4ubGVuZ3RoJTMsMCkseS50eXBlT2YubnVtYmVyLmdyZWF0ZXJUaGFuKCJncmFudWxhcml0eSIsciwwKTtsZXQgcz1uLnNsaWNlKDApLGYsdT1lLmxlbmd0aCxjPW5ldyBBcnJheSh1KjMpLGw9bmV3IEFycmF5KHUqMikscD0wLGQ9MDtmb3IoZj0wO2Y8dTtmKyspe2xldCBDPWVbZl07aWYoY1twKytdPUMueCxjW3ArK109Qy55LGNbcCsrXT1DLnosaSl7bGV0IE49b1tmXTtsW2QrK109Ti54LGxbZCsrXT1OLnl9fWxldCBtPVtdLF89e30sZz10Lm1heGltdW1SYWRpdXMsYj1NLmNob3JkTGVuZ3RoKHIsZyksVD1uZXcgWm8odm9pZCAwLHZvaWQgMCx0KSxPPW5ldyBabyh2b2lkIDAsdm9pZCAwLHQpLEU9bmV3IFpvKHZvaWQgMCx2b2lkIDAsdCk7Zm9yKDtzLmxlbmd0aD4wOyl7bGV0IEM9cy5wb3AoKSxOPXMucG9wKCksST1zLnBvcCgpLEQ9YS5mcm9tQXJyYXkoYyxJKjMsX3cpLHY9YS5mcm9tQXJyYXkoYyxOKjMseXcpLEw9YS5mcm9tQXJyYXkoYyxDKjMsZ3cpLFUsQSxTO2kmJihVPXR0LmZyb21BcnJheShsLEkqMixBdyksQT10dC5mcm9tQXJyYXkobCxOKjIsYncpLFM9dHQuZnJvbUFycmF5KGwsQyoyLFR3KSk7bGV0IFA9dC5jYXJ0ZXNpYW5Ub0NhcnRvZ3JhcGhpYyhELF9JKSxGPXQuY2FydGVzaWFuVG9DYXJ0b2dyYXBoaWModix5SSksaj10LmNhcnRlc2lhblRvQ2FydG9ncmFwaGljKEwsZ0kpO1Quc2V0RW5kUG9pbnRzKFAsRik7bGV0IEg9VC5zdXJmYWNlRGlzdGFuY2U7Ty5zZXRFbmRQb2ludHMoRixqKTtsZXQgaz1PLnN1cmZhY2VEaXN0YW5jZTtFLnNldEVuZFBvaW50cyhqLFApO2xldCBLPUUuc3VyZmFjZURpc3RhbmNlLFg9TWF0aC5tYXgoSCxrLEspLFIsb3QsYXQscHQseXQ7WD5iP0g9PT1YPyhSPWAke01hdGgubWluKEksTil9ICR7TWF0aC5tYXgoSSxOKX1gLGY9X1tSXSxoKGYpfHwob3Q9VC5pbnRlcnBvbGF0ZVVzaW5nRnJhY3Rpb24oLjUsTDApLGF0PShQLmhlaWdodCtGLmhlaWdodCkqLjUscHQ9YS5mcm9tUmFkaWFucyhvdC5sb25naXR1ZGUsb3QubGF0aXR1ZGUsYXQsdCxCaSksYy5wdXNoKHB0LngscHQueSxwdC56KSxmPWMubGVuZ3RoLzMtMSxfW1JdPWYsaSYmKHl0PXR0LmFkZChVLEEsX2EpLHR0Lm11bHRpcGx5QnlTY2FsYXIoeXQsLjUseXQpLGwucHVzaCh5dC54LHl0LnkpKSkscy5wdXNoKEksZixDKSxzLnB1c2goZixOLEMpKTprPT09WD8oUj1gJHtNYXRoLm1pbihOLEMpfSAke01hdGgubWF4KE4sQyl9YCxmPV9bUl0saChmKXx8KG90PU8uaW50ZXJwb2xhdGVVc2luZ0ZyYWN0aW9uKC41LEwwKSxhdD0oRi5oZWlnaHQrai5oZWlnaHQpKi41LHB0PWEuZnJvbVJhZGlhbnMob3QubG9uZ2l0dWRlLG90LmxhdGl0dWRlLGF0LHQsQmkpLGMucHVzaChwdC54LHB0LnkscHQueiksZj1jLmxlbmd0aC8zLTEsX1tSXT1mLGkmJih5dD10dC5hZGQoQSxTLF9hKSx0dC5tdWx0aXBseUJ5U2NhbGFyKHl0LC41LHl0KSxsLnB1c2goeXQueCx5dC55KSkpLHMucHVzaChOLGYsSSkscy5wdXNoKGYsQyxJKSk6Sz09PVgmJihSPWAke01hdGgubWluKEMsSSl9ICR7TWF0aC5tYXgoQyxJKX1gLGY9X1tSXSxoKGYpfHwob3Q9RS5pbnRlcnBvbGF0ZVVzaW5nRnJhY3Rpb24oLjUsTDApLGF0PShqLmhlaWdodCtQLmhlaWdodCkqLjUscHQ9YS5mcm9tUmFkaWFucyhvdC5sb25naXR1ZGUsb3QubGF0aXR1ZGUsYXQsdCxCaSksYy5wdXNoKHB0LngscHQueSxwdC56KSxmPWMubGVuZ3RoLzMtMSxfW1JdPWYsaSYmKHl0PXR0LmFkZChTLFUsX2EpLHR0Lm11bHRpcGx5QnlTY2FsYXIoeXQsLjUseXQpLGwucHVzaCh5dC54LHl0LnkpKSkscy5wdXNoKEMsZixOKSxzLnB1c2goZixJLE4pKToobS5wdXNoKEkpLG0ucHVzaChOKSxtLnB1c2goQykpfWxldCB3PXthdHRyaWJ1dGVzOntwb3NpdGlvbjpuZXcgaXQoe2NvbXBvbmVudERhdGF0eXBlOm50LkRPVUJMRSxjb21wb25lbnRzUGVyQXR0cmlidXRlOjMsdmFsdWVzOmN9KX0saW5kaWNlczptLHByaW1pdGl2ZVR5cGU6QnQuVFJJQU5HTEVTfTtyZXR1cm4gaSYmKHcuYXR0cmlidXRlcy5zdD1uZXcgaXQoe2NvbXBvbmVudERhdGF0eXBlOm50LkZMT0FULGNvbXBvbmVudHNQZXJBdHRyaWJ1dGU6Mix2YWx1ZXM6bH0pKSxuZXcgVXQodyl9O2xzLnNjYWxlVG9HZW9kZXRpY0hlaWdodD1mdW5jdGlvbih0LGUsbixvKXtuPXgobiwkLmRlZmF1bHQpO2xldCByPW1JLGk9aEk7aWYoZT14KGUsMCksbz14KG8sITApLGgodCkpe2xldCBzPXQubGVuZ3RoO2ZvcihsZXQgZj0wO2Y8cztmKz0zKWEuZnJvbUFycmF5KHQsZixpKSxvJiYoaT1uLnNjYWxlVG9HZW9kZXRpY1N1cmZhY2UoaSxpKSksZSE9PTAmJihyPW4uZ2VvZGV0aWNTdXJmYWNlTm9ybWFsKGksciksYS5tdWx0aXBseUJ5U2NhbGFyKHIsZSxyKSxhLmFkZChpLHIsaSkpLHRbZl09aS54LHRbZisxXT1pLnksdFtmKzJdPWkuen1yZXR1cm4gdH07UGU9bHN9KTtmdW5jdGlvbiBwcygpe3RoaXMuX2FycmF5PVtdLHRoaXMuX29mZnNldD0wLHRoaXMuX2xlbmd0aD0wfXZhciBEMCx3dz1aKCgpPT57T2JqZWN0LmRlZmluZVByb3BlcnRpZXMocHMucHJvdG90eXBlLHtsZW5ndGg6e2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9sZW5ndGh9fX0pO3BzLnByb3RvdHlwZS5lbnF1ZXVlPWZ1bmN0aW9uKHQpe3RoaXMuX2FycmF5LnB1c2godCksdGhpcy5fbGVuZ3RoKyt9O3BzLnByb3RvdHlwZS5kZXF1ZXVlPWZ1bmN0aW9uKCl7aWYodGhpcy5fbGVuZ3RoPT09MClyZXR1cm47bGV0IHQ9dGhpcy5fYXJyYXksZT10aGlzLl9vZmZzZXQsbj10W2VdO3JldHVybiB0W2VdPXZvaWQgMCxlKyssZT4xMCYmZSoyPnQubGVuZ3RoJiYodGhpcy5fYXJyYXk9dC5zbGljZShlKSxlPTApLHRoaXMuX29mZnNldD1lLHRoaXMuX2xlbmd0aC0tLG59O3BzLnByb3RvdHlwZS5wZWVrPWZ1bmN0aW9uKCl7aWYodGhpcy5fbGVuZ3RoIT09MClyZXR1cm4gdGhpcy5fYXJyYXlbdGhpcy5fb2Zmc2V0XX07cHMucHJvdG90eXBlLmNvbnRhaW5zPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9hcnJheS5pbmRleE9mKHQpIT09LTF9O3BzLnByb3RvdHlwZS5jbGVhcj1mdW5jdGlvbigpe3RoaXMuX2FycmF5Lmxlbmd0aD10aGlzLl9vZmZzZXQ9dGhpcy5fbGVuZ3RoPTB9O3BzLnByb3RvdHlwZS5zb3J0PWZ1bmN0aW9uKHQpe3RoaXMuX29mZnNldD4wJiYodGhpcy5fYXJyYXk9dGhpcy5fYXJyYXkuc2xpY2UodGhpcy5fb2Zmc2V0KSx0aGlzLl9vZmZzZXQ9MCksdGhpcy5fYXJyYXkuc29ydCh0KX07RDA9cHN9KTtmdW5jdGlvbiBSdyh0LGUsbixvKXtyZXR1cm4gdHQuc3VidHJhY3QoZSx0LHBjKSx0dC5tdWx0aXBseUJ5U2NhbGFyKHBjLG4vbyxwYyksdHQuYWRkKHQscGMscGMpLFtwYy54LHBjLnldfWZ1bmN0aW9uIEFJKHQsZSxuLG8pe3JldHVybiBhLnN1YnRyYWN0KGUsdCxkcyksYS5tdWx0aXBseUJ5U2NhbGFyKGRzLG4vbyxkcyksYS5hZGQodCxkcyxkcyksW2RzLngsZHMueSxkcy56XX1mdW5jdGlvbiBDSSh0LGUsbil7bGV0IG89bi5jYXJ0ZXNpYW5Ub0NhcnRvZ3JhcGhpYyh0LHNkKSxyPW4uY2FydGVzaWFuVG9DYXJ0b2dyYXBoaWMoZSxjZCk7aWYoTWF0aC5zaWduKG8ubGF0aXR1ZGUpPT09TWF0aC5zaWduKHIubGF0aXR1ZGUpKXJldHVybjtpZC5zZXRFbmRQb2ludHMobyxyKTtsZXQgaT1pZC5maW5kSW50ZXJzZWN0aW9uV2l0aExhdGl0dWRlKDAsU0kpO2lmKCFoKGkpKXJldHVybjtsZXQgcz1NYXRoLm1pbihvLmxvbmdpdHVkZSxyLmxvbmdpdHVkZSksZj1NYXRoLm1heChvLmxvbmdpdHVkZSxyLmxvbmdpdHVkZSk7aWYoTWF0aC5hYnMoZi1zKT5NLlBJKXtsZXQgdT1zO3M9ZixmPXV9aWYoIShpLmxvbmdpdHVkZTxzfHxpLmxvbmdpdHVkZT5mKSlyZXR1cm4gbi5jYXJ0b2dyYXBoaWNUb0NhcnRlc2lhbihpKX1mdW5jdGlvbiB4SSh0LGUsbixvKXtpZihvPT09X2UuUkhVTUIpcmV0dXJuIENJKHQsZSxuKTtsZXQgcj1oby5saW5lU2VnbWVudFBsYW5lKHQsZSxvbi5PUklHSU5fWFlfUExBTkUpO2lmKGgocikpcmV0dXJuIG4uc2NhbGVUb0dlb2RldGljU3VyZmFjZShyLHIpfWZ1bmN0aW9uIE1JKHQsZSxuKXtsZXQgbz1bXSxyLGkscyxmLHUsYz0wO2Zvcig7Yzx0Lmxlbmd0aDspe3I9dFtjXSxpPXRbKGMrMSkldC5sZW5ndGhdLHM9TS5zaWduKHIueiksZj1NLnNpZ24oaS56KTtsZXQgbD1wPT5lLmNhcnRlc2lhblRvQ2FydG9ncmFwaGljKHAsUEkpLmxvbmdpdHVkZTtpZihzPT09MClvLnB1c2goe3Bvc2l0aW9uOmMsdHlwZTpzLHZpc2l0ZWQ6ITEsbmV4dDpmLHRoZXRhOmwocil9KTtlbHNlIGlmKGYhPT0wKXtpZih1PXhJKHIsaSxlLG4pLCsrYywhaCh1KSljb250aW51ZTt0LnNwbGljZShjLDAsdSksby5wdXNoKHtwb3NpdGlvbjpjLHR5cGU6cyx2aXNpdGVkOiExLG5leHQ6Zix0aGV0YTpsKHUpfSl9KytjfXJldHVybiBvfWZ1bmN0aW9uIFN3KHQsZSxuLG8scixpLHMpe2xldCBmPVtdLHU9aSxjPXA9PmQ9PmQucG9zaXRpb249PT1wLGw9W107ZG97bGV0IHA9blt1XTtmLnB1c2gocCk7bGV0IGQ9by5maW5kSW5kZXgoYyh1KSksbT1vW2RdO2lmKCFoKG0pKXsrK3U7Y29udGludWV9bGV0e3Zpc2l0ZWQ6Xyx0eXBlOmcsbmV4dDpifT1tO2lmKG0udmlzaXRlZD0hMCxnPT09MCl7aWYoYj09PTApe2xldCB3PW9bZC0ocz8xOi0xKV07aWYoKHc9PW51bGw/dm9pZCAwOncucG9zaXRpb24pPT09dSsxKXcudmlzaXRlZD0hMDtlbHNleysrdTtjb250aW51ZX19aWYoIV8mJnMmJmI+MHx8aT09PXUmJiFzJiZiPDApeysrdTtjb250aW51ZX19aWYoIShzP2c+PTA6Zzw9MCkpeysrdTtjb250aW51ZX1ffHxsLnB1c2godSk7bGV0IE89ZCsocz8xOi0xKSxFPW9bT107aWYoIWgoRSkpeysrdTtjb250aW51ZX11PUUucG9zaXRpb259d2hpbGUodTxuLmxlbmd0aCYmdT49MCYmdSE9PWkmJmYubGVuZ3RoPG4ubGVuZ3RoKTt0LnNwbGljZShlLHIsZik7Zm9yKGxldCBwIG9mIGwpZT1Tdyh0LCsrZSxuLG8sMCxwLCFzKTtyZXR1cm4gZX12YXIgT24scGMsZHMsc2QsY2QsYkksVEksaWQsd0ksT0ksRUksUkksU0ksUEksTkksSUksdkksTEksT3csRXcsREksRkkseWUsRGY9WigoKT0+e2ZjKCk7anIoKTtVZSgpO0Z0KCk7SWUoKTtGZSgpO0l0KCk7ZnQoKTtadCgpO01mKCk7WGUoKTtZZSgpO2FuKCk7c2koKTskZSgpO3RjKCk7V3QoKTtCbigpO2ZzKCk7c3coKTtxcigpO3RuKCk7S28oKTt3dygpO2xjKCk7T249e307T24uY29tcHV0ZUhpZXJhcmNoeVBhY2tlZExlbmd0aD1mdW5jdGlvbih0LGUpe2xldCBuPTAsbz1bdF07Zm9yKDtvLmxlbmd0aD4wOyl7bGV0IHI9by5wb3AoKTtpZighaChyKSljb250aW51ZTtuKz0yO2xldCBpPXIucG9zaXRpb25zLHM9ci5ob2xlcztpZihoKGkpJiZpLmxlbmd0aD4wJiYobis9aS5sZW5ndGgqZS5wYWNrZWRMZW5ndGgpLGgocykpe2xldCBmPXMubGVuZ3RoO2ZvcihsZXQgdT0wO3U8ZjsrK3Upby5wdXNoKHNbdV0pfX1yZXR1cm4gbn07T24ucGFja1BvbHlnb25IaWVyYXJjaHk9ZnVuY3Rpb24odCxlLG4sbyl7bGV0IHI9W3RdO2Zvcig7ci5sZW5ndGg+MDspe2xldCBpPXIucG9wKCk7aWYoIWgoaSkpY29udGludWU7bGV0IHM9aS5wb3NpdGlvbnMsZj1pLmhvbGVzO2lmKGVbbisrXT1oKHMpP3MubGVuZ3RoOjAsZVtuKytdPWgoZik/Zi5sZW5ndGg6MCxoKHMpKXtsZXQgdT1zLmxlbmd0aDtmb3IobGV0IGM9MDtjPHU7KytjLG4rPW8ucGFja2VkTGVuZ3RoKW8ucGFjayhzW2NdLGUsbil9aWYoaChmKSl7bGV0IHU9Zi5sZW5ndGg7Zm9yKGxldCBjPTA7Yzx1OysrYylyLnB1c2goZltjXSl9fXJldHVybiBufTtPbi51bnBhY2tQb2x5Z29uSGllcmFyY2h5PWZ1bmN0aW9uKHQsZSxuKXtsZXQgbz10W2UrK10scj10W2UrK10saT1uZXcgQXJyYXkobykscz1yPjA/bmV3IEFycmF5KHIpOnZvaWQgMDtmb3IobGV0IGY9MDtmPG87KytmLGUrPW4ucGFja2VkTGVuZ3RoKWlbZl09bi51bnBhY2sodCxlKTtmb3IobGV0IGY9MDtmPHI7KytmKXNbZl09T24udW5wYWNrUG9seWdvbkhpZXJhcmNoeSh0LGUsbiksZT1zW2ZdLnN0YXJ0aW5nSW5kZXgsZGVsZXRlIHNbZl0uc3RhcnRpbmdJbmRleDtyZXR1cm57cG9zaXRpb25zOmksaG9sZXM6cyxzdGFydGluZ0luZGV4OmV9fTtwYz1uZXcgdHQ7ZHM9bmV3IGE7T24uc3ViZGl2aWRlTGluZUNvdW50PWZ1bmN0aW9uKHQsZSxuKXtsZXQgcj1hLmRpc3RhbmNlKHQsZSkvbixpPU1hdGgubWF4KDAsTWF0aC5jZWlsKE0ubG9nMihyKSkpO3JldHVybiBNYXRoLnBvdygyLGkpfTtzZD1uZXcgY3QsY2Q9bmV3IGN0LGJJPW5ldyBjdCxUST1uZXcgYSxpZD1uZXcgWm87T24uc3ViZGl2aWRlUmh1bWJMaW5lQ291bnQ9ZnVuY3Rpb24odCxlLG4sbyl7bGV0IHI9dC5jYXJ0ZXNpYW5Ub0NhcnRvZ3JhcGhpYyhlLHNkKSxpPXQuY2FydGVzaWFuVG9DYXJ0b2dyYXBoaWMobixjZCksZj1uZXcgWm8ocixpLHQpLnN1cmZhY2VEaXN0YW5jZS9vLHU9TWF0aC5tYXgoMCxNYXRoLmNlaWwoTS5sb2cyKGYpKSk7cmV0dXJuIE1hdGgucG93KDIsdSl9O09uLnN1YmRpdmlkZVRleGNvb3JkTGluZT1mdW5jdGlvbih0LGUsbixvLHIsaSl7bGV0IHM9T24uc3ViZGl2aWRlTGluZUNvdW50KG4sbyxyKSxmPXR0LmRpc3RhbmNlKHQsZSksdT1mL3MsYz1pO2MubGVuZ3RoPXMqMjtsZXQgbD0wO2ZvcihsZXQgcD0wO3A8cztwKyspe2xldCBkPVJ3KHQsZSxwKnUsZik7Y1tsKytdPWRbMF0sY1tsKytdPWRbMV19cmV0dXJuIGN9O09uLnN1YmRpdmlkZUxpbmU9ZnVuY3Rpb24odCxlLG4sbyl7bGV0IHI9T24uc3ViZGl2aWRlTGluZUNvdW50KHQsZSxuKSxpPWEuZGlzdGFuY2UodCxlKSxzPWkvcjtoKG8pfHwobz1bXSk7bGV0IGY9bztmLmxlbmd0aD1yKjM7bGV0IHU9MDtmb3IobGV0IGM9MDtjPHI7YysrKXtsZXQgbD1BSSh0LGUsYypzLGkpO2ZbdSsrXT1sWzBdLGZbdSsrXT1sWzFdLGZbdSsrXT1sWzJdfXJldHVybiBmfTtPbi5zdWJkaXZpZGVUZXhjb29yZFJodW1iTGluZT1mdW5jdGlvbih0LGUsbixvLHIsaSxzKXtsZXQgZj1uLmNhcnRlc2lhblRvQ2FydG9ncmFwaGljKG8sc2QpLHU9bi5jYXJ0ZXNpYW5Ub0NhcnRvZ3JhcGhpYyhyLGNkKTtpZC5zZXRFbmRQb2ludHMoZix1KTtsZXQgYz1pZC5zdXJmYWNlRGlzdGFuY2UvaSxsPU1hdGgubWF4KDAsTWF0aC5jZWlsKE0ubG9nMihjKSkpLHA9TWF0aC5wb3coMixsKSxkPXR0LmRpc3RhbmNlKHQsZSksbT1kL3AsXz1zO18ubGVuZ3RoPXAqMjtsZXQgZz0wO2ZvcihsZXQgYj0wO2I8cDtiKyspe2xldCBUPVJ3KHQsZSxiKm0sZCk7X1tnKytdPVRbMF0sX1tnKytdPVRbMV19cmV0dXJuIF99O09uLnN1YmRpdmlkZVJodW1iTGluZT1mdW5jdGlvbih0LGUsbixvLHIpe2xldCBpPXQuY2FydGVzaWFuVG9DYXJ0b2dyYXBoaWMoZSxzZCkscz10LmNhcnRlc2lhblRvQ2FydG9ncmFwaGljKG4sY2QpLGY9bmV3IFpvKGkscyx0KTtpZihoKHIpfHwocj1bXSksZi5zdXJmYWNlRGlzdGFuY2U8PW8pcmV0dXJuIHIubGVuZ3RoPTMsclswXT1lLngsclsxXT1lLnksclsyXT1lLnoscjtsZXQgdT1mLnN1cmZhY2VEaXN0YW5jZS9vLGM9TWF0aC5tYXgoMCxNYXRoLmNlaWwoTS5sb2cyKHUpKSksbD1NYXRoLnBvdygyLGMpLHA9Zi5zdXJmYWNlRGlzdGFuY2UvbCxkPXI7ZC5sZW5ndGg9bCozO2xldCBtPTA7Zm9yKGxldCBfPTA7XzxsO18rKyl7bGV0IGc9Zi5pbnRlcnBvbGF0ZVVzaW5nU3VyZmFjZURpc3RhbmNlKF8qcCxiSSksYj10LmNhcnRvZ3JhcGhpY1RvQ2FydGVzaWFuKGcsVEkpO2RbbSsrXT1iLngsZFttKytdPWIueSxkW20rK109Yi56fXJldHVybiBkfTt3ST1uZXcgYSxPST1uZXcgYSxFST1uZXcgYSxSST1uZXcgYTtPbi5zY2FsZVRvR2VvZGV0aWNIZWlnaHRFeHRydWRlZD1mdW5jdGlvbih0LGUsbixvLHIpe289eChvLCQuZGVmYXVsdCk7bGV0IGk9d0kscz1PSSxmPUVJLHU9Ukk7aWYoaCh0KSYmaCh0LmF0dHJpYnV0ZXMpJiZoKHQuYXR0cmlidXRlcy5wb3NpdGlvbikpe2xldCBjPXQuYXR0cmlidXRlcy5wb3NpdGlvbi52YWx1ZXMsbD1jLmxlbmd0aC8yO2ZvcihsZXQgcD0wO3A8bDtwKz0zKWEuZnJvbUFycmF5KGMscCxmKSxvLmdlb2RldGljU3VyZmFjZU5vcm1hbChmLGkpLHU9by5zY2FsZVRvR2VvZGV0aWNTdXJmYWNlKGYsdSkscz1hLm11bHRpcGx5QnlTY2FsYXIoaSxuLHMpLHM9YS5hZGQodSxzLHMpLGNbcCtsXT1zLngsY1twKzErbF09cy55LGNbcCsyK2xdPXMueixyJiYodT1hLmNsb25lKGYsdSkpLHM9YS5tdWx0aXBseUJ5U2NhbGFyKGksZSxzKSxzPWEuYWRkKHUscyxzKSxjW3BdPXMueCxjW3ArMV09cy55LGNbcCsyXT1zLnp9cmV0dXJuIHR9O09uLnBvbHlnb25PdXRsaW5lc0Zyb21IaWVyYXJjaHk9ZnVuY3Rpb24odCxlLG4pe2xldCBvPVtdLHI9bmV3IEQwO3IuZW5xdWV1ZSh0KTtsZXQgaSxzLGY7Zm9yKDtyLmxlbmd0aCE9PTA7KXtsZXQgdT1yLmRlcXVldWUoKSxjPXUucG9zaXRpb25zO2lmKGUpZm9yKGY9Yy5sZW5ndGgsaT0wO2k8ZjtpKyspbi5zY2FsZVRvR2VvZGV0aWNTdXJmYWNlKGNbaV0sY1tpXSk7aWYoYz14bihjLGEuZXF1YWxzRXBzaWxvbiwhMCksYy5sZW5ndGg8Myljb250aW51ZTtsZXQgbD11LmhvbGVzP3UuaG9sZXMubGVuZ3RoOjA7Zm9yKGk9MDtpPGw7aSsrKXtsZXQgcD11LmhvbGVzW2ldLGQ9cC5wb3NpdGlvbnM7aWYoZSlmb3IoZj1kLmxlbmd0aCxzPTA7czxmOysrcyluLnNjYWxlVG9HZW9kZXRpY1N1cmZhY2UoZFtzXSxkW3NdKTtpZihkPXhuKGQsYS5lcXVhbHNFcHNpbG9uLCEwKSxkLmxlbmd0aDwzKWNvbnRpbnVlO28ucHVzaChkKTtsZXQgbT0wO2ZvcihoKHAuaG9sZXMpJiYobT1wLmhvbGVzLmxlbmd0aCkscz0wO3M8bTtzKyspci5lbnF1ZXVlKHAuaG9sZXNbc10pfW8ucHVzaChjKX1yZXR1cm4gb307U0k9bmV3IGN0O1BJPW5ldyBjdDtPbi5zcGxpdFBvbHlnb25zT25FcXVhdG9yPWZ1bmN0aW9uKHQsZSxuLG8pe2gobyl8fChvPVtdKSxvLnNwbGljZSgwLDAsLi4udCksby5sZW5ndGg9dC5sZW5ndGg7bGV0IHI9MDtmb3IoO3I8by5sZW5ndGg7KXtsZXQgaT1vW3JdLHM9aS5zbGljZSgpO2lmKGkubGVuZ3RoPDMpe29bcl09cywrK3I7Y29udGludWV9bGV0IGY9TUkocyxlLG4pO2lmKHMubGVuZ3RoPT09aS5sZW5ndGh8fGYubGVuZ3RoPD0xKXtvW3JdPXMsKytyO2NvbnRpbnVlfWYuc29ydCgoYyxsKT0+Yy50aGV0YS1sLnRoZXRhKTtsZXQgdT1zWzBdLno+PTA7cj1TdyhvLHIscyxmLDEsMCx1KX1yZXR1cm4gb307T24ucG9seWdvbnNGcm9tSGllcmFyY2h5PWZ1bmN0aW9uKHQsZSxuLG8scixpKXtsZXQgcz1bXSxmPVtdLHU9bmV3IEQwO3UuZW5xdWV1ZSh0KTtsZXQgYz1oKGkpO2Zvcig7dS5sZW5ndGghPT0wOyl7bGV0IGw9dS5kZXF1ZXVlKCkscD1sLnBvc2l0aW9ucyxkPWwuaG9sZXMsbSxfO2lmKG8pZm9yKF89cC5sZW5ndGgsbT0wO208XzttKyspci5zY2FsZVRvR2VvZGV0aWNTdXJmYWNlKHBbbV0scFttXSk7aWYoZXx8KHA9eG4ocCxhLmVxdWFsc0Vwc2lsb24sITApKSxwLmxlbmd0aDwzKWNvbnRpbnVlO2xldCBnPW4ocCk7aWYoIWgoZykpY29udGludWU7bGV0IGI9W10sVD1QZS5jb21wdXRlV2luZGluZ09yZGVyMkQoZyk7aWYoVD09PUNvLkNMT0NLV0lTRSYmKGcucmV2ZXJzZSgpLHA9cC5zbGljZSgpLnJldmVyc2UoKSksYyl7Yz0hMTtsZXQgTj1bcF07aWYoTj1pKE4sTiksTi5sZW5ndGg+MSl7Zm9yKGxldCBJIG9mIE4pdS5lbnF1ZXVlKG5ldyBpdyhJLGQpKTtjb250aW51ZX19bGV0IE89cC5zbGljZSgpLEU9aChkKT9kLmxlbmd0aDowLHc9W10sQztmb3IobT0wO208RTttKyspe2xldCBOPWRbbV0sST1OLnBvc2l0aW9ucztpZihvKWZvcihfPUkubGVuZ3RoLEM9MDtDPF87KytDKXIuc2NhbGVUb0dlb2RldGljU3VyZmFjZShJW0NdLElbQ10pO2lmKGV8fChJPXhuKEksYS5lcXVhbHNFcHNpbG9uLCEwKSksSS5sZW5ndGg8Myljb250aW51ZTtsZXQgRD1uKEkpO2lmKCFoKEQpKWNvbnRpbnVlO1Q9UGUuY29tcHV0ZVdpbmRpbmdPcmRlcjJEKEQpLFQ9PT1Dby5DTE9DS1dJU0UmJihELnJldmVyc2UoKSxJPUkuc2xpY2UoKS5yZXZlcnNlKCkpLHcucHVzaChJKSxiLnB1c2goTy5sZW5ndGgpLE89Ty5jb25jYXQoSSksZz1nLmNvbmNhdChEKTtsZXQgdj0wO2ZvcihoKE4uaG9sZXMpJiYodj1OLmhvbGVzLmxlbmd0aCksQz0wO0M8djtDKyspdS5lbnF1ZXVlKE4uaG9sZXNbQ10pfXMucHVzaCh7b3V0ZXJSaW5nOnAsaG9sZXM6d30pLGYucHVzaCh7cG9zaXRpb25zOk8scG9zaXRpb25zMkQ6Zyxob2xlczpifSl9cmV0dXJue2hpZXJhcmNoeTpzLHBvbHlnb25zOmZ9fTtOST1uZXcgdHQsSUk9bmV3IGEsdkk9bmV3IGVlLExJPW5ldyBRO09uLmNvbXB1dGVCb3VuZGluZ1JlY3RhbmdsZT1mdW5jdGlvbih0LGUsbixvLHIpe2xldCBpPWVlLmZyb21BeGlzQW5nbGUodCxvLHZJKSxzPVEuZnJvbVF1YXRlcm5pb24oaSxMSSksZj1OdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFksdT1OdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFksYz1OdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFksbD1OdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFkscD1uLmxlbmd0aDtmb3IobGV0IGQ9MDtkPHA7KytkKXtsZXQgbT1hLmNsb25lKG5bZF0sSUkpO1EubXVsdGlwbHlCeVZlY3RvcihzLG0sbSk7bGV0IF89ZShtLE5JKTtoKF8pJiYoZj1NYXRoLm1pbihmLF8ueCksdT1NYXRoLm1heCh1LF8ueCksYz1NYXRoLm1pbihjLF8ueSksbD1NYXRoLm1heChsLF8ueSkpfXJldHVybiByLng9ZixyLnk9YyxyLndpZHRoPXUtZixyLmhlaWdodD1sLWMscn07T24uY3JlYXRlR2VvbWV0cnlGcm9tUG9zaXRpb25zPWZ1bmN0aW9uKHQsZSxuLG8scixpLHMpe2xldCBmPVBlLnRyaWFuZ3VsYXRlKGUucG9zaXRpb25zMkQsZS5ob2xlcyk7Zi5sZW5ndGg8MyYmKGY9WzAsMSwyXSk7bGV0IHU9ZS5wb3NpdGlvbnMsYz1oKG4pLGw9Yz9uLnBvc2l0aW9uczp2b2lkIDA7aWYocil7bGV0IHA9dS5sZW5ndGgsZD1uZXcgQXJyYXkocCozKSxtPTA7Zm9yKGxldCBiPTA7YjxwO2IrKyl7bGV0IFQ9dVtiXTtkW20rK109VC54LGRbbSsrXT1ULnksZFttKytdPVQuen1sZXQgXz17YXR0cmlidXRlczp7cG9zaXRpb246bmV3IGl0KHtjb21wb25lbnREYXRhdHlwZTpudC5ET1VCTEUsY29tcG9uZW50c1BlckF0dHJpYnV0ZTozLHZhbHVlczpkfSl9LGluZGljZXM6ZixwcmltaXRpdmVUeXBlOkJ0LlRSSUFOR0xFU307YyYmKF8uYXR0cmlidXRlcy5zdD1uZXcgaXQoe2NvbXBvbmVudERhdGF0eXBlOm50LkZMT0FULGNvbXBvbmVudHNQZXJBdHRyaWJ1dGU6Mix2YWx1ZXM6dHQucGFja0FycmF5KGwpfSkpO2xldCBnPW5ldyBVdChfKTtyZXR1cm4gaS5ub3JtYWw/VmUuY29tcHV0ZU5vcm1hbChnKTpnfWlmKHM9PT1fZS5HRU9ERVNJQylyZXR1cm4gUGUuY29tcHV0ZVN1YmRpdmlzaW9uKHQsdSxmLGwsbyk7aWYocz09PV9lLlJIVU1CKXJldHVybiBQZS5jb21wdXRlUmh1bWJMaW5lU3ViZGl2aXNpb24odCx1LGYsbCxvKX07T3c9W10sRXc9W10sREk9bmV3IGEsRkk9bmV3IGE7T24uY29tcHV0ZVdhbGxHZW9tZXRyeT1mdW5jdGlvbih0LGUsbixvLHIsaSl7bGV0IHMsZix1LGMsbCxwLGQsbSxfLGc9dC5sZW5ndGgsYj0wLFQ9MCxPPWgoZSksRT1PP2UucG9zaXRpb25zOnZvaWQgMDtpZihyKWZvcihmPWcqMyoyLHM9bmV3IEFycmF5KGYqMiksTyYmKF89ZyoyKjIsbT1uZXcgQXJyYXkoXyoyKSksdT0wO3U8Zzt1KyspYz10W3VdLGw9dFsodSsxKSVnXSxzW2JdPXNbYitmXT1jLngsKytiLHNbYl09c1tiK2ZdPWMueSwrK2Isc1tiXT1zW2IrZl09Yy56LCsrYixzW2JdPXNbYitmXT1sLngsKytiLHNbYl09c1tiK2ZdPWwueSwrK2Isc1tiXT1zW2IrZl09bC56LCsrYixPJiYocD1FW3VdLGQ9RVsodSsxKSVnXSxtW1RdPW1bVCtfXT1wLngsKytULG1bVF09bVtUK19dPXAueSwrK1QsbVtUXT1tW1QrX109ZC54LCsrVCxtW1RdPW1bVCtfXT1kLnksKytUKTtlbHNle2xldCBEPU0uY2hvcmRMZW5ndGgobyxuLm1heGltdW1SYWRpdXMpLHY9MDtpZihpPT09X2UuR0VPREVTSUMpZm9yKHU9MDt1PGc7dSsrKXYrPU9uLnN1YmRpdmlkZUxpbmVDb3VudCh0W3VdLHRbKHUrMSklZ10sRCk7ZWxzZSBpZihpPT09X2UuUkhVTUIpZm9yKHU9MDt1PGc7dSsrKXYrPU9uLnN1YmRpdmlkZVJodW1iTGluZUNvdW50KG4sdFt1XSx0Wyh1KzEpJWddLEQpO2ZvcihmPSh2K2cpKjMscz1uZXcgQXJyYXkoZioyKSxPJiYoXz0oditnKSoyLG09bmV3IEFycmF5KF8qMikpLHU9MDt1PGc7dSsrKXtjPXRbdV0sbD10Wyh1KzEpJWddO2xldCBMLFU7TyYmKHA9RVt1XSxkPUVbKHUrMSklZ10pLGk9PT1fZS5HRU9ERVNJQz8oTD1Pbi5zdWJkaXZpZGVMaW5lKGMsbCxELEV3KSxPJiYoVT1Pbi5zdWJkaXZpZGVUZXhjb29yZExpbmUocCxkLGMsbCxELE93KSkpOmk9PT1fZS5SSFVNQiYmKEw9T24uc3ViZGl2aWRlUmh1bWJMaW5lKG4sYyxsLEQsRXcpLE8mJihVPU9uLnN1YmRpdmlkZVRleGNvb3JkUmh1bWJMaW5lKHAsZCxuLGMsbCxELE93KSkpO2xldCBBPUwubGVuZ3RoO2ZvcihsZXQgUz0wO1M8QTsrK1MsKytiKXNbYl09TFtTXSxzW2IrZl09TFtTXTtpZihzW2JdPWwueCxzW2IrZl09bC54LCsrYixzW2JdPWwueSxzW2IrZl09bC55LCsrYixzW2JdPWwueixzW2IrZl09bC56LCsrYixPKXtsZXQgUz1VLmxlbmd0aDtmb3IobGV0IFA9MDtQPFM7KytQLCsrVCltW1RdPVVbUF0sbVtUK19dPVVbUF07bVtUXT1kLngsbVtUK19dPWQueCwrK1QsbVtUXT1kLnksbVtUK19dPWQueSwrK1R9fX1nPXMubGVuZ3RoO2xldCB3PUR0LmNyZWF0ZVR5cGVkQXJyYXkoZy8zLGctdC5sZW5ndGgqNiksQz0wO2ZvcihnLz02LHU9MDt1PGc7dSsrKXtsZXQgRD11LHY9RCsxLEw9RCtnLFU9TCsxO2M9YS5mcm9tQXJyYXkocyxEKjMsREkpLGw9YS5mcm9tQXJyYXkocyx2KjMsRkkpLCFhLmVxdWFsc0Vwc2lsb24oYyxsLE0uRVBTSUxPTjEwLE0uRVBTSUxPTjEwKSYmKHdbQysrXT1ELHdbQysrXT1MLHdbQysrXT12LHdbQysrXT12LHdbQysrXT1MLHdbQysrXT1VKX1sZXQgTj17YXR0cmlidXRlczpuZXcgaWUoe3Bvc2l0aW9uOm5ldyBpdCh7Y29tcG9uZW50RGF0YXR5cGU6bnQuRE9VQkxFLGNvbXBvbmVudHNQZXJBdHRyaWJ1dGU6Myx2YWx1ZXM6c30pfSksaW5kaWNlczp3LHByaW1pdGl2ZVR5cGU6QnQuVFJJQU5HTEVTfTtyZXR1cm4gTyYmKE4uYXR0cmlidXRlcy5zdD1uZXcgaXQoe2NvbXBvbmVudERhdGF0eXBlOm50LkZMT0FULGNvbXBvbmVudHNQZXJBdHRyaWJ1dGU6Mix2YWx1ZXM6bX0pKSxuZXcgVXQoTil9O3llPU9ufSk7ZnVuY3Rpb24gWUkodCxlLG4sbyxyLGkscyxmLHUpe2xldCBjPXQucG9zaXRpb25zLGw9UGUudHJpYW5ndWxhdGUodC5wb3NpdGlvbnMyRCx0LmhvbGVzKTtsLmxlbmd0aDwzJiYobD1bMCwxLDJdKTtsZXQgcD1EdC5jcmVhdGVUeXBlZEFycmF5KGMubGVuZ3RoLGwubGVuZ3RoKTtwLnNldChsKTtsZXQgZD1LSTtpZihvIT09MCl7bGV0IFU9ZWUuZnJvbUF4aXNBbmdsZShzLG8sQ3cpO2lmKGQ9US5mcm9tUXVhdGVybmlvbihVLGQpLGUudGFuZ2VudHx8ZS5iaXRhbmdlbnQpe1U9ZWUuZnJvbUF4aXNBbmdsZShzLC1vLEN3KTtsZXQgQT1RLmZyb21RdWF0ZXJuaW9uKFUsV0kpO2Y9YS5ub3JtYWxpemUoUS5tdWx0aXBseUJ5VmVjdG9yKEEsZixmKSxmKSxlLmJpdGFuZ2VudCYmKHU9YS5ub3JtYWxpemUoYS5jcm9zcyhzLGYsdSksdSkpfX1lbHNlIGQ9US5jbG9uZShRLklERU5USVRZLGQpO2xldCBtPWtJO2Uuc3QmJihtLng9bi54LG0ueT1uLnkpO2xldCBfPWMubGVuZ3RoLGc9XyozLGI9bmV3IEZsb2F0NjRBcnJheShnKSxUPWUubm9ybWFsP25ldyBGbG9hdDMyQXJyYXkoZyk6dm9pZCAwLE89ZS50YW5nZW50P25ldyBGbG9hdDMyQXJyYXkoZyk6dm9pZCAwLEU9ZS5iaXRhbmdlbnQ/bmV3IEZsb2F0MzJBcnJheShnKTp2b2lkIDAsdz1lLnN0P25ldyBGbG9hdDMyQXJyYXkoXyoyKTp2b2lkIDAsQz0wLE49MCxJPTAsRD0wLHY9MDtmb3IobGV0IFU9MDtVPF87VSsrKXtsZXQgQT1jW1VdO2lmKGJbQysrXT1BLngsYltDKytdPUEueSxiW0MrK109QS56LGUuc3QpaWYoaChyKSYmci5wb3NpdGlvbnMubGVuZ3RoPT09Xyl3W3YrK109ci5wb3NpdGlvbnNbVV0ueCx3W3YrK109ci5wb3NpdGlvbnNbVV0ueTtlbHNle2xldCBTPVEubXVsdGlwbHlCeVZlY3RvcihkLEEsQkkpLFA9aShTLFZJKTt0dC5zdWJ0cmFjdChQLG0sUCk7bGV0IEY9TS5jbGFtcChQLngvbi53aWR0aCwwLDEpLGo9TS5jbGFtcChQLnkvbi5oZWlnaHQsMCwxKTt3W3YrK109Rix3W3YrK109an1lLm5vcm1hbCYmKFRbTisrXT1zLngsVFtOKytdPXMueSxUW04rK109cy56KSxlLnRhbmdlbnQmJihPW0QrK109Zi54LE9bRCsrXT1mLnksT1tEKytdPWYueiksZS5iaXRhbmdlbnQmJihFW0krK109dS54LEVbSSsrXT11LnksRVtJKytdPXUueil9bGV0IEw9bmV3IGllO3JldHVybiBlLnBvc2l0aW9uJiYoTC5wb3NpdGlvbj1uZXcgaXQoe2NvbXBvbmVudERhdGF0eXBlOm50LkRPVUJMRSxjb21wb25lbnRzUGVyQXR0cmlidXRlOjMsdmFsdWVzOmJ9KSksZS5ub3JtYWwmJihMLm5vcm1hbD1uZXcgaXQoe2NvbXBvbmVudERhdGF0eXBlOm50LkZMT0FULGNvbXBvbmVudHNQZXJBdHRyaWJ1dGU6Myx2YWx1ZXM6VH0pKSxlLnRhbmdlbnQmJihMLnRhbmdlbnQ9bmV3IGl0KHtjb21wb25lbnREYXRhdHlwZTpudC5GTE9BVCxjb21wb25lbnRzUGVyQXR0cmlidXRlOjMsdmFsdWVzOk99KSksZS5iaXRhbmdlbnQmJihMLmJpdGFuZ2VudD1uZXcgaXQoe2NvbXBvbmVudERhdGF0eXBlOm50LkZMT0FULGNvbXBvbmVudHNQZXJBdHRyaWJ1dGU6Myx2YWx1ZXM6RX0pKSxlLnN0JiYoTC5zdD1uZXcgaXQoe2NvbXBvbmVudERhdGF0eXBlOm50LkZMT0FULGNvbXBvbmVudHNQZXJBdHRyaWJ1dGU6Mix2YWx1ZXM6d30pKSxuZXcgVXQoe2F0dHJpYnV0ZXM6TCxpbmRpY2VzOnAscHJpbWl0aXZlVHlwZTpCdC5UUklBTkdMRVN9KX1mdW5jdGlvbiBkYyh0KXt0PXgodCx4LkVNUFRZX09CSkVDVCk7bGV0IGU9dC5wb2x5Z29uSGllcmFyY2h5LG49dC50ZXh0dXJlQ29vcmRpbmF0ZXM7eS5kZWZpbmVkKCJvcHRpb25zLnBvbHlnb25IaWVyYXJjaHkiLGUpO2xldCBvPXgodC52ZXJ0ZXhGb3JtYXQsZHQuREVGQVVMVCk7dGhpcy5fdmVydGV4Rm9ybWF0PWR0LmNsb25lKG8pLHRoaXMuX3BvbHlnb25IaWVyYXJjaHk9ZSx0aGlzLl9zdFJvdGF0aW9uPXgodC5zdFJvdGF0aW9uLDApLHRoaXMuX2VsbGlwc29pZD0kLmNsb25lKHgodC5lbGxpcHNvaWQsJC5kZWZhdWx0KSksdGhpcy5fd29ya2VyTmFtZT0iY3JlYXRlQ29wbGFuYXJQb2x5Z29uR2VvbWV0cnkiLHRoaXMuX3RleHR1cmVDb29yZGluYXRlcz1uLHRoaXMucGFja2VkTGVuZ3RoPXllLmNvbXB1dGVIaWVyYXJjaHlQYWNrZWRMZW5ndGgoZSxhKStkdC5wYWNrZWRMZW5ndGgrJC5wYWNrZWRMZW5ndGgrKGgobik/eWUuY29tcHV0ZUhpZXJhcmNoeVBhY2tlZExlbmd0aChuLHR0KToxKSsyfXZhciBCSSxVSSxWSSxrSSxHSSx6SSxqSSxGZixISSxxSSxDdyxLSSxXSSxYSSwkSSxaSSxRSSxGMCx4dz1aKCgpPT57anIoKTtDZigpO3ZlKCk7VWUoKTtGdCgpO1h0KCk7RmUoKTt4MCgpO0l0KCk7ZnQoKTtadCgpO1hlKCk7WWUoKTthbigpO3NjKCk7c2koKTskZSgpO1d0KCk7Qm4oKTtEZigpO3FyKCk7dG4oKTtLbygpO1JvKCk7Qkk9bmV3IGEsVUk9bmV3IEhyLFZJPW5ldyB0dCxrST1uZXcgdHQsR0k9bmV3IGEsekk9bmV3IGEsakk9bmV3IGEsRmY9bmV3IGEsSEk9bmV3IGEscUk9bmV3IGEsQ3c9bmV3IGVlLEtJPW5ldyBRLFdJPW5ldyBRLFhJPW5ldyBhO2RjLmZyb21Qb3NpdGlvbnM9ZnVuY3Rpb24odCl7dD14KHQseC5FTVBUWV9PQkpFQ1QpLHkuZGVmaW5lZCgib3B0aW9ucy5wb3NpdGlvbnMiLHQucG9zaXRpb25zKTtsZXQgZT17cG9seWdvbkhpZXJhcmNoeTp7cG9zaXRpb25zOnQucG9zaXRpb25zfSx2ZXJ0ZXhGb3JtYXQ6dC52ZXJ0ZXhGb3JtYXQsc3RSb3RhdGlvbjp0LnN0Um90YXRpb24sZWxsaXBzb2lkOnQuZWxsaXBzb2lkLHRleHR1cmVDb29yZGluYXRlczp0LnRleHR1cmVDb29yZGluYXRlc307cmV0dXJuIG5ldyBkYyhlKX07ZGMucGFjaz1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHkudHlwZU9mLm9iamVjdCgidmFsdWUiLHQpLHkuZGVmaW5lZCgiYXJyYXkiLGUpLG49eChuLDApLG49eWUucGFja1BvbHlnb25IaWVyYXJjaHkodC5fcG9seWdvbkhpZXJhcmNoeSxlLG4sYSksJC5wYWNrKHQuX2VsbGlwc29pZCxlLG4pLG4rPSQucGFja2VkTGVuZ3RoLGR0LnBhY2sodC5fdmVydGV4Rm9ybWF0LGUsbiksbis9ZHQucGFja2VkTGVuZ3RoLGVbbisrXT10Ll9zdFJvdGF0aW9uLGgodC5fdGV4dHVyZUNvb3JkaW5hdGVzKT9uPXllLnBhY2tQb2x5Z29uSGllcmFyY2h5KHQuX3RleHR1cmVDb29yZGluYXRlcyxlLG4sdHQpOmVbbisrXT0tMSxlW24rK109dC5wYWNrZWRMZW5ndGgsZX07JEk9JC5jbG9uZSgkLlVOSVRfU1BIRVJFKSxaST1uZXcgZHQsUUk9e3BvbHlnb25IaWVyYXJjaHk6e319O2RjLnVucGFjaz1mdW5jdGlvbih0LGUsbil7eS5kZWZpbmVkKCJhcnJheSIsdCksZT14KGUsMCk7bGV0IG89eWUudW5wYWNrUG9seWdvbkhpZXJhcmNoeSh0LGUsYSk7ZT1vLnN0YXJ0aW5nSW5kZXgsZGVsZXRlIG8uc3RhcnRpbmdJbmRleDtsZXQgcj0kLnVucGFjayh0LGUsJEkpO2UrPSQucGFja2VkTGVuZ3RoO2xldCBpPWR0LnVucGFjayh0LGUsWkkpO2UrPWR0LnBhY2tlZExlbmd0aDtsZXQgcz10W2UrK10sZj10W2VdPT09LTE/dm9pZCAwOnllLnVucGFja1BvbHlnb25IaWVyYXJjaHkodCxlLHR0KTtoKGYpPyhlPWYuc3RhcnRpbmdJbmRleCxkZWxldGUgZi5zdGFydGluZ0luZGV4KTplKys7bGV0IHU9dFtlKytdO3JldHVybiBoKG4pfHwobj1uZXcgZGMoUUkpKSxuLl9wb2x5Z29uSGllcmFyY2h5PW8sbi5fZWxsaXBzb2lkPSQuY2xvbmUocixuLl9lbGxpcHNvaWQpLG4uX3ZlcnRleEZvcm1hdD1kdC5jbG9uZShpLG4uX3ZlcnRleEZvcm1hdCksbi5fc3RSb3RhdGlvbj1zLG4uX3RleHR1cmVDb29yZGluYXRlcz1mLG4ucGFja2VkTGVuZ3RoPXUsbn07ZGMuY3JlYXRlR2VvbWV0cnk9ZnVuY3Rpb24odCl7bGV0IGU9dC5fdmVydGV4Rm9ybWF0LG49dC5fcG9seWdvbkhpZXJhcmNoeSxvPXQuX3N0Um90YXRpb24scj10Ll90ZXh0dXJlQ29vcmRpbmF0ZXMsaT1oKHIpLHM9bi5wb3NpdGlvbnM7aWYocz14bihzLGEuZXF1YWxzRXBzaWxvbiwhMCkscy5sZW5ndGg8MylyZXR1cm47bGV0IGY9R0ksdT16SSxjPWpJLGw9SEkscD1xSTtpZighZGEuY29tcHV0ZVByb2plY3RUbzJEQXJndW1lbnRzKHMsRmYsbCxwKSlyZXR1cm47aWYoZj1hLmNyb3NzKGwscCxmKSxmPWEubm9ybWFsaXplKGYsZiksIWEuZXF1YWxzRXBzaWxvbihGZixhLlpFUk8sTS5FUFNJTE9ONikpe2xldCB2PXQuX2VsbGlwc29pZC5nZW9kZXRpY1N1cmZhY2VOb3JtYWwoRmYsWEkpO2EuZG90KGYsdik8MCYmKGY9YS5uZWdhdGUoZixmKSxsPWEubmVnYXRlKGwsbCkpfWxldCBtPWRhLmNyZWF0ZVByb2plY3RQb2ludHNUbzJERnVuY3Rpb24oRmYsbCxwKSxfPWRhLmNyZWF0ZVByb2plY3RQb2ludFRvMkRGdW5jdGlvbihGZixsLHApO2UudGFuZ2VudCYmKHU9YS5jbG9uZShsLHUpKSxlLmJpdGFuZ2VudCYmKGM9YS5jbG9uZShwLGMpKTtsZXQgZz15ZS5wb2x5Z29uc0Zyb21IaWVyYXJjaHkobixpLG0sITEpLGI9Zy5oaWVyYXJjaHksVD1nLnBvbHlnb25zLE89ZnVuY3Rpb24odil7cmV0dXJuIHZ9LEU9aT95ZS5wb2x5Z29uc0Zyb21IaWVyYXJjaHkociwhMCxPLCExKS5wb2x5Z29uczp2b2lkIDA7aWYoYi5sZW5ndGg9PT0wKXJldHVybjtzPWJbMF0ub3V0ZXJSaW5nO2xldCB3PUF0LmZyb21Qb2ludHMocyksQz15ZS5jb21wdXRlQm91bmRpbmdSZWN0YW5nbGUoZixfLHMsbyxVSSksTj1bXTtmb3IobGV0IHY9MDt2PFQubGVuZ3RoO3YrKyl7bGV0IEw9bmV3IGNvKHtnZW9tZXRyeTpZSShUW3ZdLGUsQyxvLGk/RVt2XTp2b2lkIDAsXyxmLHUsYyl9KTtOLnB1c2goTCl9bGV0IEk9VmUuY29tYmluZUluc3RhbmNlcyhOKVswXTtJLmF0dHJpYnV0ZXMucG9zaXRpb24udmFsdWVzPW5ldyBGbG9hdDY0QXJyYXkoSS5hdHRyaWJ1dGVzLnBvc2l0aW9uLnZhbHVlcyksSS5pbmRpY2VzPUR0LmNyZWF0ZVR5cGVkQXJyYXkoSS5hdHRyaWJ1dGVzLnBvc2l0aW9uLnZhbHVlcy5sZW5ndGgvMyxJLmluZGljZXMpO2xldCBEPUkuYXR0cmlidXRlcztyZXR1cm4gZS5wb3NpdGlvbnx8ZGVsZXRlIEQucG9zaXRpb24sbmV3IFV0KHthdHRyaWJ1dGVzOkQsaW5kaWNlczpJLmluZGljZXMscHJpbWl0aXZlVHlwZTpJLnByaW1pdGl2ZVR5cGUsYm91bmRpbmdTcGhlcmU6d30pfTtGMD1kY30pO3ZhciBCMD17fTtkZShCMCx7ZGVmYXVsdDooKT0+dHZ9KTtmdW5jdGlvbiBKSSh0LGUpe3JldHVybiBoKGUpJiYodD1GMC51bnBhY2sodCxlKSksRjAuY3JlYXRlR2VvbWV0cnkodCl9dmFyIHR2LFUwPVooKCk9Pnt4dygpO2Z0KCk7dHY9Skl9KTtmdW5jdGlvbiBldih0KXtsZXQgZT10Lmxlbmd0aCxuPW5ldyBGbG9hdDY0QXJyYXkoZSozKSxvPUR0LmNyZWF0ZVR5cGVkQXJyYXkoZSxlKjIpLHI9MCxpPTA7Zm9yKGxldCBmPTA7ZjxlO2YrKyl7bGV0IHU9dFtmXTtuW3IrK109dS54LG5bcisrXT11LnksbltyKytdPXUueixvW2krK109ZixvW2krK109KGYrMSklZX1sZXQgcz1uZXcgaWUoe3Bvc2l0aW9uOm5ldyBpdCh7Y29tcG9uZW50RGF0YXR5cGU6bnQuRE9VQkxFLGNvbXBvbmVudHNQZXJBdHRyaWJ1dGU6Myx2YWx1ZXM6bn0pfSk7cmV0dXJuIG5ldyBVdCh7YXR0cmlidXRlczpzLGluZGljZXM6byxwcmltaXRpdmVUeXBlOkJ0LkxJTkVTfSl9ZnVuY3Rpb24gbWModCl7dD14KHQseC5FTVBUWV9PQkpFQ1QpO2xldCBlPXQucG9seWdvbkhpZXJhcmNoeTt5LmRlZmluZWQoIm9wdGlvbnMucG9seWdvbkhpZXJhcmNoeSIsZSksdGhpcy5fcG9seWdvbkhpZXJhcmNoeT1lLHRoaXMuX3dvcmtlck5hbWU9ImNyZWF0ZUNvcGxhbmFyUG9seWdvbk91dGxpbmVHZW9tZXRyeSIsdGhpcy5wYWNrZWRMZW5ndGg9eWUuY29tcHV0ZUhpZXJhcmNoeVBhY2tlZExlbmd0aChlLGEpKzF9dmFyIG52LFYwLFB3PVooKCk9PntqcigpO3ZlKCk7RnQoKTtYdCgpO0ZlKCk7eDAoKTtJdCgpO2Z0KCk7WGUoKTtZZSgpO2FuKCk7c2MoKTtzaSgpOyRlKCk7RGYoKTt0bigpO21jLmZyb21Qb3NpdGlvbnM9ZnVuY3Rpb24odCl7dD14KHQseC5FTVBUWV9PQkpFQ1QpLHkuZGVmaW5lZCgib3B0aW9ucy5wb3NpdGlvbnMiLHQucG9zaXRpb25zKTtsZXQgZT17cG9seWdvbkhpZXJhcmNoeTp7cG9zaXRpb25zOnQucG9zaXRpb25zfX07cmV0dXJuIG5ldyBtYyhlKX07bWMucGFjaz1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHkudHlwZU9mLm9iamVjdCgidmFsdWUiLHQpLHkuZGVmaW5lZCgiYXJyYXkiLGUpLG49eChuLDApLG49eWUucGFja1BvbHlnb25IaWVyYXJjaHkodC5fcG9seWdvbkhpZXJhcmNoeSxlLG4sYSksZVtuXT10LnBhY2tlZExlbmd0aCxlfTtudj17cG9seWdvbkhpZXJhcmNoeTp7fX07bWMudW5wYWNrPWZ1bmN0aW9uKHQsZSxuKXt5LmRlZmluZWQoImFycmF5Iix0KSxlPXgoZSwwKTtsZXQgbz15ZS51bnBhY2tQb2x5Z29uSGllcmFyY2h5KHQsZSxhKTtlPW8uc3RhcnRpbmdJbmRleCxkZWxldGUgby5zdGFydGluZ0luZGV4O2xldCByPXRbZV07cmV0dXJuIGgobil8fChuPW5ldyBtYyhudikpLG4uX3BvbHlnb25IaWVyYXJjaHk9byxuLnBhY2tlZExlbmd0aD1yLG59O21jLmNyZWF0ZUdlb21ldHJ5PWZ1bmN0aW9uKHQpe2xldCBlPXQuX3BvbHlnb25IaWVyYXJjaHksbj1lLnBvc2l0aW9ucztpZihuPXhuKG4sYS5lcXVhbHNFcHNpbG9uLCEwKSxuLmxlbmd0aDwzfHwhZGEudmFsaWRPdXRsaW5lKG4pKXJldHVybjtsZXQgcj15ZS5wb2x5Z29uT3V0bGluZXNGcm9tSGllcmFyY2h5KGUsITEpO2lmKHIubGVuZ3RoPT09MClyZXR1cm47bGV0IGk9W107Zm9yKGxldCB1PTA7dTxyLmxlbmd0aDt1Kyspe2xldCBjPW5ldyBjbyh7Z2VvbWV0cnk6ZXYoclt1XSl9KTtpLnB1c2goYyl9bGV0IHM9VmUuY29tYmluZUluc3RhbmNlcyhpKVswXSxmPUF0LmZyb21Qb2ludHMoZS5wb3NpdGlvbnMpO3JldHVybiBuZXcgVXQoe2F0dHJpYnV0ZXM6cy5hdHRyaWJ1dGVzLGluZGljZXM6cy5pbmRpY2VzLHByaW1pdGl2ZVR5cGU6cy5wcmltaXRpdmVUeXBlLGJvdW5kaW5nU3BoZXJlOmZ9KX07VjA9bWN9KTt2YXIgazA9e307ZGUoazAse2RlZmF1bHQ6KCk9PnJ2fSk7ZnVuY3Rpb24gb3YodCxlKXtyZXR1cm4gaChlKSYmKHQ9VjAudW5wYWNrKHQsZSkpLHQuX2VsbGlwc29pZD0kLmNsb25lKHQuX2VsbGlwc29pZCksVjAuY3JlYXRlR2VvbWV0cnkodCl9dmFyIHJ2LEcwPVooKCk9PntQdygpO2Z0KCk7WnQoKTtydj1vdn0pO3ZhciBpdixmbixoYz1aKCgpPT57aXY9e1JPVU5ERUQ6MCxNSVRFUkVEOjEsQkVWRUxFRDoyfSxmbj1PYmplY3QuZnJlZXplKGl2KX0pO2Z1bmN0aW9uIHN2KHQpe2xldCBlPXQuX3VTcXVhcmVkLG49dC5fZWxsaXBzb2lkLm1heGltdW1SYWRpdXMsbz10Ll9lbGxpcHNvaWQubWluaW11bVJhZGl1cyxyPShuLW8pL24saT1NYXRoLmNvcyh0Ll9zdGFydEhlYWRpbmcpLHM9TWF0aC5zaW4odC5fc3RhcnRIZWFkaW5nKSxmPSgxLXIpKk1hdGgudGFuKHQuX3N0YXJ0LmxhdGl0dWRlKSx1PTEvTWF0aC5zcXJ0KDErZipmKSxjPXUqZixsPU1hdGguYXRhbjIoZixpKSxwPXUqcyxkPXAqcCxtPTEtZCxfPU1hdGguc3FydChtKSxnPWUvNCxiPWcqZyxUPWIqZyxPPWIqYixFPTErZy0zKmIvNCs1KlQvNC0xNzUqTy82NCx3PTEtZysxNSpiLzgtMzUqVC84LEM9MS0zKmcrMzUqYi80LE49MS01KmcsST1FKmwtdypNYXRoLnNpbigyKmwpKmcvMi1DKk1hdGguc2luKDQqbCkqYi8xNi1OKk1hdGguc2luKDYqbCkqVC80OC1NYXRoLnNpbig4KmwpKjUqTy81MTIsRD10Ll9jb25zdGFudHM7RC5hPW4sRC5iPW8sRC5mPXIsRC5jb3NpbmVIZWFkaW5nPWksRC5zaW5lSGVhZGluZz1zLEQudGFuVT1mLEQuY29zaW5lVT11LEQuc2luZVU9YyxELnNpZ21hPWwsRC5zaW5lQWxwaGE9cCxELnNpbmVTcXVhcmVkQWxwaGE9ZCxELmNvc2luZVNxdWFyZWRBbHBoYT1tLEQuY29zaW5lQWxwaGE9XyxELnUyT3ZlcjQ9ZyxELnU0T3ZlcjE2PWIsRC51Nk92ZXI2ND1ULEQudThPdmVyMjU2PU8sRC5hMD1FLEQuYTE9dyxELmEyPUMsRC5hMz1OLEQuZGlzdGFuY2VSYXRpbz1JfWZ1bmN0aW9uIGN2KHQsZSl7cmV0dXJuIHQqZSooNCt0Kig0LTMqZSkpLzE2fWZ1bmN0aW9uIE13KHQsZSxuLG8scixpLHMpe2xldCBmPWN2KHQsbik7cmV0dXJuKDEtZikqdCplKihvK2YqcioocytmKmkqKDIqcypzLTEpKSl9ZnVuY3Rpb24gYXYodCxlLG4sbyxyLGkscyl7bGV0IGY9KGUtbikvZSx1PWktbyxjPU1hdGguYXRhbigoMS1mKSpNYXRoLnRhbihyKSksbD1NYXRoLmF0YW4oKDEtZikqTWF0aC50YW4ocykpLHA9TWF0aC5jb3MoYyksZD1NYXRoLnNpbihjKSxtPU1hdGguY29zKGwpLF89TWF0aC5zaW4obCksZz1wKm0sYj1wKl8sVD1kKl8sTz1kKm0sRT11LHc9TS5UV09fUEksQz1NYXRoLmNvcyhFKSxOPU1hdGguc2luKEUpLEksRCx2LEwsVTtkb3tDPU1hdGguY29zKEUpLE49TWF0aC5zaW4oRSk7bGV0IFg9Yi1PKkM7dj1NYXRoLnNxcnQobSptKk4qTitYKlgpLEQ9VCtnKkMsST1NYXRoLmF0YW4yKHYsRCk7bGV0IFI7dj09PTA/KFI9MCxMPTEpOihSPWcqTi92LEw9MS1SKlIpLHc9RSxVPUQtMipUL0wsaXNGaW5pdGUoVSl8fChVPTApLEU9dStNdyhmLFIsTCxJLHYsRCxVKX13aGlsZShNYXRoLmFicyhFLXcpPk0uRVBTSUxPTjEyKTtsZXQgQT1MKihlKmUtbipuKS8obipuKSxTPTErQSooNDA5NitBKihBKigzMjAtMTc1KkEpLTc2OCkpLzE2Mzg0LFA9QSooMjU2K0EqKEEqKDc0LTQ3KkEpLTEyOCkpLzEwMjQsRj1VKlUsaj1QKnYqKFUrUCooRCooMipGLTEpLVAqVSooNCp2KnYtMykqKDQqRi0zKS82KS80KSxIPW4qUyooSS1qKSxrPU1hdGguYXRhbjIobSpOLGItTypDKSxLPU1hdGguYXRhbjIocCpOLGIqQy1PKTt0Ll9kaXN0YW5jZT1ILHQuX3N0YXJ0SGVhZGluZz1rLHQuX2VuZEhlYWRpbmc9Syx0Ll91U3F1YXJlZD1BfWZ1bmN0aW9uIE53KHQsZSxuLG8pe2xldCByPWEubm9ybWFsaXplKG8uY2FydG9ncmFwaGljVG9DYXJ0ZXNpYW4oZSx6MCksZnYpLGk9YS5ub3JtYWxpemUoby5jYXJ0b2dyYXBoaWNUb0NhcnRlc2lhbihuLHowKSx6MCk7eS50eXBlT2YubnVtYmVyLmdyZWF0ZXJUaGFuT3JFcXVhbHMoInZhbHVlIixNYXRoLmFicyhNYXRoLmFicyhhLmFuZ2xlQmV0d2VlbihyLGkpKS1NYXRoLlBJKSwuMDEyNSksYXYodCxvLm1heGltdW1SYWRpdXMsby5taW5pbXVtUmFkaXVzLGUubG9uZ2l0dWRlLGUubGF0aXR1ZGUsbi5sb25naXR1ZGUsbi5sYXRpdHVkZSksdC5fc3RhcnQ9Y3QuY2xvbmUoZSx0Ll9zdGFydCksdC5fZW5kPWN0LmNsb25lKG4sdC5fZW5kKSx0Ll9zdGFydC5oZWlnaHQ9MCx0Ll9lbmQuaGVpZ2h0PTAsc3YodCl9ZnVuY3Rpb24gQmYodCxlLG4pe2xldCBvPXgobiwkLmRlZmF1bHQpO3RoaXMuX2VsbGlwc29pZD1vLHRoaXMuX3N0YXJ0PW5ldyBjdCx0aGlzLl9lbmQ9bmV3IGN0LHRoaXMuX2NvbnN0YW50cz17fSx0aGlzLl9zdGFydEhlYWRpbmc9dm9pZCAwLHRoaXMuX2VuZEhlYWRpbmc9dm9pZCAwLHRoaXMuX2Rpc3RhbmNlPXZvaWQgMCx0aGlzLl91U3F1YXJlZD12b2lkIDAsaCh0KSYmaChlKSYmTncodGhpcyx0LGUsbyl9dmFyIGZ2LHowLGFkLGowPVooKCk9PntGdCgpO0llKCk7WHQoKTtJdCgpO2Z0KCk7WnQoKTtXdCgpO2Z2PW5ldyBhLHowPW5ldyBhO09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKEJmLnByb3RvdHlwZSx7ZWxsaXBzb2lkOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZWxsaXBzb2lkfX0sc3VyZmFjZURpc3RhbmNlOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4geS5kZWZpbmVkKCJkaXN0YW5jZSIsdGhpcy5fZGlzdGFuY2UpLHRoaXMuX2Rpc3RhbmNlfX0sc3RhcnQ6e2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9zdGFydH19LGVuZDp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2VuZH19LHN0YXJ0SGVhZGluZzp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHkuZGVmaW5lZCgiZGlzdGFuY2UiLHRoaXMuX2Rpc3RhbmNlKSx0aGlzLl9zdGFydEhlYWRpbmd9fSxlbmRIZWFkaW5nOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4geS5kZWZpbmVkKCJkaXN0YW5jZSIsdGhpcy5fZGlzdGFuY2UpLHRoaXMuX2VuZEhlYWRpbmd9fX0pO0JmLnByb3RvdHlwZS5zZXRFbmRQb2ludHM9ZnVuY3Rpb24odCxlKXt5LmRlZmluZWQoInN0YXJ0Iix0KSx5LmRlZmluZWQoImVuZCIsZSksTncodGhpcyx0LGUsdGhpcy5fZWxsaXBzb2lkKX07QmYucHJvdG90eXBlLmludGVycG9sYXRlVXNpbmdGcmFjdGlvbj1mdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLmludGVycG9sYXRlVXNpbmdTdXJmYWNlRGlzdGFuY2UodGhpcy5fZGlzdGFuY2UqdCxlKX07QmYucHJvdG90eXBlLmludGVycG9sYXRlVXNpbmdTdXJmYWNlRGlzdGFuY2U9ZnVuY3Rpb24odCxlKXt5LmRlZmluZWQoImRpc3RhbmNlIix0aGlzLl9kaXN0YW5jZSk7bGV0IG49dGhpcy5fY29uc3RhbnRzLG89bi5kaXN0YW5jZVJhdGlvK3Qvbi5iLHI9TWF0aC5jb3MoMipvKSxpPU1hdGguY29zKDQqbykscz1NYXRoLmNvcyg2Km8pLGY9TWF0aC5zaW4oMipvKSx1PU1hdGguc2luKDQqbyksYz1NYXRoLnNpbig2Km8pLGw9TWF0aC5zaW4oOCpvKSxwPW8qbyxkPW8qcCxtPW4udThPdmVyMjU2LF89bi51Mk92ZXI0LGc9bi51Nk92ZXI2NCxiPW4udTRPdmVyMTYsVD0yKmQqbSpyLzMrbyooMS1fKzcqYi80LTE1KmcvNCs1NzkqbS82NC0oYi0xNSpnLzQrMTg3Km0vMTYpKnItKDUqZy80LTExNSptLzE2KSppLTI5Km0qcy8xNikrKF8vMi1iKzcxKmcvMzItODUqbS8xNikqZisoNSpiLzE2LTUqZy80KzM4MyptLzk2KSp1LXAqKChnLTExKm0vMikqZis1Km0qdS8yKSsoMjkqZy85Ni0yOSptLzE2KSpjKzUzOSptKmwvMTUzNixPPU1hdGguYXNpbihNYXRoLnNpbihUKSpuLmNvc2luZUFscGhhKSxFPU1hdGguYXRhbihuLmEvbi5iKk1hdGgudGFuKE8pKTtUPVQtbi5zaWdtYTtsZXQgdz1NYXRoLmNvcygyKm4uc2lnbWErVCksQz1NYXRoLnNpbihUKSxOPU1hdGguY29zKFQpLEk9bi5jb3NpbmVVKk4sRD1uLnNpbmVVKkMsTD1NYXRoLmF0YW4yKEMqbi5zaW5lSGVhZGluZyxJLUQqbi5jb3NpbmVIZWFkaW5nKS1NdyhuLmYsbi5zaW5lQWxwaGEsbi5jb3NpbmVTcXVhcmVkQWxwaGEsVCxDLE4sdyk7cmV0dXJuIGgoZSk/KGUubG9uZ2l0dWRlPXRoaXMuX3N0YXJ0LmxvbmdpdHVkZStMLGUubGF0aXR1ZGU9RSxlLmhlaWdodD0wLGUpOm5ldyBjdCh0aGlzLl9zdGFydC5sb25naXR1ZGUrTCxFLDApfTthZD1CZn0pO2Z1bmN0aW9uIER3KHQsZSxuKXtsZXQgbz1xMDtvLmxlbmd0aD10O2xldCByO2lmKGU9PT1uKXtmb3Iocj0wO3I8dDtyKyspb1tyXT1lO3JldHVybiBvfWxldCBzPShuLWUpL3Q7Zm9yKHI9MDtyPHQ7cisrKXtsZXQgZj1lK3IqcztvW3JdPWZ9cmV0dXJuIG99ZnVuY3Rpb24gZ3YodCxlLG4sbyxyLGkscyxmKXtsZXQgdT1vLnNjYWxlVG9HZW9kZXRpY1N1cmZhY2UodCxLMCksYz1vLnNjYWxlVG9HZW9kZXRpY1N1cmZhY2UoZSx5diksbD1Gby5udW1iZXJPZlBvaW50cyh0LGUsbikscD1vLmNhcnRlc2lhblRvQ2FydG9ncmFwaGljKHUsdWQpLGQ9by5jYXJ0ZXNpYW5Ub0NhcnRvZ3JhcGhpYyhjLGZkKSxtPUR3KGwscixpKTtIMC5zZXRFbmRQb2ludHMocCxkKTtsZXQgXz1IMC5zdXJmYWNlRGlzdGFuY2UvbCxnPWY7cC5oZWlnaHQ9cjtsZXQgYj1vLmNhcnRvZ3JhcGhpY1RvQ2FydGVzaWFuKHAsbXMpO2EucGFjayhiLHMsZyksZys9Mztmb3IobGV0IFQ9MTtUPGw7VCsrKXtsZXQgTz1IMC5pbnRlcnBvbGF0ZVVzaW5nU3VyZmFjZURpc3RhbmNlKFQqXyxmZCk7Ty5oZWlnaHQ9bVtUXSxiPW8uY2FydG9ncmFwaGljVG9DYXJ0ZXNpYW4oTyxtcyksYS5wYWNrKGIscyxnKSxnKz0zfXJldHVybiBnfWZ1bmN0aW9uIEF2KHQsZSxuLG8scixpLHMsZil7bGV0IHU9by5jYXJ0ZXNpYW5Ub0NhcnRvZ3JhcGhpYyh0LHVkKSxjPW8uY2FydGVzaWFuVG9DYXJ0b2dyYXBoaWMoZSxmZCksbD1Gby5udW1iZXJPZlBvaW50c1JodW1iTGluZSh1LGMsbik7dS5oZWlnaHQ9MCxjLmhlaWdodD0wO2xldCBwPUR3KGwscixpKTtVZi5lbGxpcHNvaWQuZXF1YWxzKG8pfHwoVWY9bmV3IFpvKHZvaWQgMCx2b2lkIDAsbykpLFVmLnNldEVuZFBvaW50cyh1LGMpO2xldCBkPVVmLnN1cmZhY2VEaXN0YW5jZS9sLG09Zjt1LmhlaWdodD1yO2xldCBfPW8uY2FydG9ncmFwaGljVG9DYXJ0ZXNpYW4odSxtcyk7YS5wYWNrKF8scyxtKSxtKz0zO2ZvcihsZXQgZz0xO2c8bDtnKyspe2xldCBiPVVmLmludGVycG9sYXRlVXNpbmdTdXJmYWNlRGlzdGFuY2UoZypkLGZkKTtiLmhlaWdodD1wW2ddLF89by5jYXJ0b2dyYXBoaWNUb0NhcnRlc2lhbihiLG1zKSxhLnBhY2soXyxzLG0pLG0rPTN9cmV0dXJuIG19dmFyIEZvLHV2LGx2LHB2LEl3LGR2LHZ3LG12LGh2LF92LHEwLHVkLGZkLG1zLEswLHl2LEgwLFVmLEx3LGJ2LEFuLHlhPVooKCk9PntGdCgpO0llKCk7SXQoKTtmdCgpO0h0KCk7WnQoKTtqMCgpO01mKCk7dGMoKTtXdCgpO1VuKCk7ZnMoKTtGbz17fTtGby5udW1iZXJPZlBvaW50cz1mdW5jdGlvbih0LGUsbil7bGV0IG89YS5kaXN0YW5jZSh0LGUpO3JldHVybiBNYXRoLmNlaWwoby9uKX07Rm8ubnVtYmVyT2ZQb2ludHNSaHVtYkxpbmU9ZnVuY3Rpb24odCxlLG4pe2xldCBvPU1hdGgucG93KHQubG9uZ2l0dWRlLWUubG9uZ2l0dWRlLDIpK01hdGgucG93KHQubGF0aXR1ZGUtZS5sYXRpdHVkZSwyKTtyZXR1cm4gTWF0aC5tYXgoMSxNYXRoLmNlaWwoTWF0aC5zcXJ0KG8vKG4qbikpKSl9O3V2PW5ldyBjdDtGby5leHRyYWN0SGVpZ2h0cz1mdW5jdGlvbih0LGUpe2xldCBuPXQubGVuZ3RoLG89bmV3IEFycmF5KG4pO2ZvcihsZXQgcj0wO3I8bjtyKyspe2xldCBpPXRbcl07b1tyXT1lLmNhcnRlc2lhblRvQ2FydG9ncmFwaGljKGksdXYpLmhlaWdodH1yZXR1cm4gb307bHY9bmV3IHN0LHB2PW5ldyBhLEl3PW5ldyBhLGR2PW5ldyBvbihhLlVOSVRfWCwwKSx2dz1uZXcgYSxtdj1uZXcgb24oYS5VTklUX1gsMCksaHY9bmV3IGEsX3Y9bmV3IGEscTA9W107dWQ9bmV3IGN0LGZkPW5ldyBjdCxtcz1uZXcgYSxLMD1uZXcgYSx5dj1uZXcgYSxIMD1uZXcgYWQsVWY9bmV3IFpvO0ZvLndyYXBMb25naXR1ZGU9ZnVuY3Rpb24odCxlKXtsZXQgbj1bXSxvPVtdO2lmKGgodCkmJnQubGVuZ3RoPjApe2U9eChlLHN0LklERU5USVRZKTtsZXQgcj1zdC5pbnZlcnNlVHJhbnNmb3JtYXRpb24oZSxsdiksaT1zdC5tdWx0aXBseUJ5UG9pbnQocixhLlpFUk8scHYpLHM9YS5ub3JtYWxpemUoc3QubXVsdGlwbHlCeVBvaW50QXNWZWN0b3IocixhLlVOSVRfWSxJdyksSXcpLGY9b24uZnJvbVBvaW50Tm9ybWFsKGkscyxkdiksdT1hLm5vcm1hbGl6ZShzdC5tdWx0aXBseUJ5UG9pbnRBc1ZlY3RvcihyLGEuVU5JVF9YLHZ3KSx2dyksYz1vbi5mcm9tUG9pbnROb3JtYWwoaSx1LG12KSxsPTE7bi5wdXNoKGEuY2xvbmUodFswXSkpO2xldCBwPW5bMF0sZD10Lmxlbmd0aDtmb3IobGV0IG09MTttPGQ7KyttKXtsZXQgXz10W21dO2lmKG9uLmdldFBvaW50RGlzdGFuY2UoYyxwKTwwfHxvbi5nZXRQb2ludERpc3RhbmNlKGMsXyk8MCl7bGV0IGc9aG8ubGluZVNlZ21lbnRQbGFuZShwLF8sZixodik7aWYoaChnKSl7bGV0IGI9YS5tdWx0aXBseUJ5U2NhbGFyKHMsNWUtOSxfdik7b24uZ2V0UG9pbnREaXN0YW5jZShmLHApPDAmJmEubmVnYXRlKGIsYiksbi5wdXNoKGEuYWRkKGcsYixuZXcgYSkpLG8ucHVzaChsKzEpLGEubmVnYXRlKGIsYiksbi5wdXNoKGEuYWRkKGcsYixuZXcgYSkpLGw9MX19bi5wdXNoKGEuY2xvbmUodFttXSkpLGwrKyxwPV99by5wdXNoKGwpfXJldHVybntwb3NpdGlvbnM6bixsZW5ndGhzOm99fTtGby5nZW5lcmF0ZUFyYz1mdW5jdGlvbih0KXtoKHQpfHwodD17fSk7bGV0IGU9dC5wb3NpdGlvbnM7aWYoIWgoZSkpdGhyb3cgbmV3IEIoIm9wdGlvbnMucG9zaXRpb25zIGlzIHJlcXVpcmVkLiIpO2xldCBuPWUubGVuZ3RoLG89eCh0LmVsbGlwc29pZCwkLmRlZmF1bHQpLHI9eCh0LmhlaWdodCwwKSxpPUFycmF5LmlzQXJyYXkocik7aWYobjwxKXJldHVybltdO2lmKG49PT0xKXtsZXQgZz1vLnNjYWxlVG9HZW9kZXRpY1N1cmZhY2UoZVswXSxLMCk7aWYocj1pP3JbMF06cixyIT09MCl7bGV0IGI9by5nZW9kZXRpY1N1cmZhY2VOb3JtYWwoZyxtcyk7YS5tdWx0aXBseUJ5U2NhbGFyKGIscixiKSxhLmFkZChnLGIsZyl9cmV0dXJuW2cueCxnLnksZy56XX1sZXQgcz10Lm1pbkRpc3RhbmNlO2lmKCFoKHMpKXtsZXQgZz14KHQuZ3JhbnVsYXJpdHksTS5SQURJQU5TX1BFUl9ERUdSRUUpO3M9TS5jaG9yZExlbmd0aChnLG8ubWF4aW11bVJhZGl1cyl9bGV0IGY9MCx1O2Zvcih1PTA7dTxuLTE7dSsrKWYrPUZvLm51bWJlck9mUG9pbnRzKGVbdV0sZVt1KzFdLHMpO2xldCBjPShmKzEpKjMsbD1uZXcgQXJyYXkoYykscD0wO2Zvcih1PTA7dTxuLTE7dSsrKXtsZXQgZz1lW3VdLGI9ZVt1KzFdLFQ9aT9yW3VdOnIsTz1pP3JbdSsxXTpyO3A9Z3YoZyxiLHMsbyxULE8sbCxwKX1xMC5sZW5ndGg9MDtsZXQgZD1lW24tMV0sbT1vLmNhcnRlc2lhblRvQ2FydG9ncmFwaGljKGQsdWQpO20uaGVpZ2h0PWk/cltuLTFdOnI7bGV0IF89by5jYXJ0b2dyYXBoaWNUb0NhcnRlc2lhbihtLG1zKTtyZXR1cm4gYS5wYWNrKF8sbCxjLTMpLGx9O0x3PW5ldyBjdCxidj1uZXcgY3Q7Rm8uZ2VuZXJhdGVSaHVtYkFyYz1mdW5jdGlvbih0KXtoKHQpfHwodD17fSk7bGV0IGU9dC5wb3NpdGlvbnM7aWYoIWgoZSkpdGhyb3cgbmV3IEIoIm9wdGlvbnMucG9zaXRpb25zIGlzIHJlcXVpcmVkLiIpO2xldCBuPWUubGVuZ3RoLG89eCh0LmVsbGlwc29pZCwkLmRlZmF1bHQpLHI9eCh0LmhlaWdodCwwKSxpPUFycmF5LmlzQXJyYXkocik7aWYobjwxKXJldHVybltdO2lmKG49PT0xKXtsZXQgVD1vLnNjYWxlVG9HZW9kZXRpY1N1cmZhY2UoZVswXSxLMCk7aWYocj1pP3JbMF06cixyIT09MCl7bGV0IE89by5nZW9kZXRpY1N1cmZhY2VOb3JtYWwoVCxtcyk7YS5tdWx0aXBseUJ5U2NhbGFyKE8scixPKSxhLmFkZChULE8sVCl9cmV0dXJuW1QueCxULnksVC56XX1sZXQgcz14KHQuZ3JhbnVsYXJpdHksTS5SQURJQU5TX1BFUl9ERUdSRUUpLGY9MCx1LGM9by5jYXJ0ZXNpYW5Ub0NhcnRvZ3JhcGhpYyhlWzBdLEx3KSxsO2Zvcih1PTA7dTxuLTE7dSsrKWw9by5jYXJ0ZXNpYW5Ub0NhcnRvZ3JhcGhpYyhlW3UrMV0sYnYpLGYrPUZvLm51bWJlck9mUG9pbnRzUmh1bWJMaW5lKGMsbCxzKSxjPWN0LmNsb25lKGwsTHcpO2xldCBwPShmKzEpKjMsZD1uZXcgQXJyYXkocCksbT0wO2Zvcih1PTA7dTxuLTE7dSsrKXtsZXQgVD1lW3VdLE89ZVt1KzFdLEU9aT9yW3VdOnIsdz1pP3JbdSsxXTpyO209QXYoVCxPLHMsbyxFLHcsZCxtKX1xMC5sZW5ndGg9MDtsZXQgXz1lW24tMV0sZz1vLmNhcnRlc2lhblRvQ2FydG9ncmFwaGljKF8sdWQpO2cuaGVpZ2h0PWk/cltuLTFdOnI7bGV0IGI9by5jYXJ0b2dyYXBoaWNUb0NhcnRlc2lhbihnLG1zKTtyZXR1cm4gYS5wYWNrKGIsZCxwLTMpLGR9O0ZvLmdlbmVyYXRlQ2FydGVzaWFuQXJjPWZ1bmN0aW9uKHQpe2xldCBlPUZvLmdlbmVyYXRlQXJjKHQpLG49ZS5sZW5ndGgvMyxvPW5ldyBBcnJheShuKTtmb3IobGV0IHI9MDtyPG47cisrKW9bcl09YS51bnBhY2soZSxyKjMpO3JldHVybiBvfTtGby5nZW5lcmF0ZUNhcnRlc2lhblJodW1iQXJjPWZ1bmN0aW9uKHQpe2xldCBlPUZvLmdlbmVyYXRlUmh1bWJBcmModCksbj1lLmxlbmd0aC8zLG89bmV3IEFycmF5KG4pO2ZvcihsZXQgcj0wO3I8bjtyKyspb1tyXT1hLnVucGFjayhlLHIqMyk7cmV0dXJuIG99O0FuPUZvfSk7ZnVuY3Rpb24gVmYodCxlKXtpZighaCh0KSl0aHJvdyBuZXcgQigiaWRlbnRpZmllciBpcyByZXF1aXJlZC4iKTtoKEZ3W3RdKXx8KEZ3W3RdPSEwLGNvbnNvbGUud2Fybih4KGUsdCkpKX12YXIgRncsbGQsVzA9WigoKT0+e0l0KCk7ZnQoKTtIdCgpO0Z3PXt9O1ZmLmdlb21ldHJ5T3V0bGluZXM9IkVudGl0eSBnZW9tZXRyeSBvdXRsaW5lcyBhcmUgdW5zdXBwb3J0ZWQgb24gdGVycmFpbi4gT3V0bGluZXMgd2lsbCBiZSBkaXNhYmxlZC4gVG8gZW5hYmxlIG91dGxpbmVzLCBkaXNhYmxlIGdlb21ldHJ5IHRlcnJhaW4gY2xhbXBpbmcgYnkgZXhwbGljaXRseSBzZXR0aW5nIGhlaWdodCB0byAwLiI7VmYuZ2VvbWV0cnlaSW5kZXg9IkVudGl0eSBnZW9tZXRyeSB3aXRoIHpJbmRleCBhcmUgdW5zdXBwb3J0ZWQgd2hlbiBoZWlnaHQgb3IgZXh0cnVkZWRIZWlnaHQgYXJlIGRlZmluZWQuICB6SW5kZXggd2lsbCBiZSBpZ25vcmVkIjtWZi5nZW9tZXRyeUhlaWdodFJlZmVyZW5jZT0iRW50aXR5IGNvcnJpZG9yLCBlbGxpcHNlLCBwb2x5Z29uIG9yIHJlY3RhbmdsZSB3aXRoIGhlaWdodFJlZmVyZW5jZSBtdXN0IGFsc28gaGF2ZSBhIGRlZmluZWQgaGVpZ2h0LiAgaGVpZ2h0UmVmZXJlbmNlIHdpbGwgYmUgaWdub3JlZCI7VmYuZ2VvbWV0cnlFeHRydWRlZEhlaWdodFJlZmVyZW5jZT0iRW50aXR5IGNvcnJpZG9yLCBlbGxpcHNlLCBwb2x5Z29uIG9yIHJlY3RhbmdsZSB3aXRoIGV4dHJ1ZGVkSGVpZ2h0UmVmZXJlbmNlIG11c3QgYWxzbyBoYXZlIGEgZGVmaW5lZCBleHRydWRlZEhlaWdodC4gIGV4dHJ1ZGVkSGVpZ2h0UmVmZXJlbmNlIHdpbGwgYmUgaWdub3JlZCI7bGQ9VmZ9KTtmdW5jdGlvbiBNdih0LGUpe2xldCBuPW5ldyBBcnJheSh0Lmxlbmd0aCk7Zm9yKGxldCBvPTA7bzx0Lmxlbmd0aDtvKyspe2xldCByPXRbb107WDA9ZS5jYXJ0ZXNpYW5Ub0NhcnRvZ3JhcGhpYyhyLFgwKSxuW29dPVgwLmhlaWdodCx0W29dPWUuc2NhbGVUb0dlb2RldGljU3VyZmFjZShyLHIpfXJldHVybiBufWZ1bmN0aW9uIFkwKHQsZSxuLG8pe2xldCByPXRbMF0saT10WzFdLHM9YS5hbmdsZUJldHdlZW4ocixpKSxmPU1hdGguY2VpbChzL28pLHU9bmV3IEFycmF5KGYpLGM7aWYoZT09PW4pe2ZvcihjPTA7YzxmO2MrKyl1W2NdPWU7cmV0dXJuIHUucHVzaChuKSx1fWxldCBwPShuLWUpL2Y7Zm9yKGM9MTtjPGY7YysrKXtsZXQgZD1lK2MqcDt1W2NdPWR9cmV0dXJuIHVbMF09ZSx1LnB1c2gobiksdX1mdW5jdGlvbiBOdih0LGUsbixvKXtsZXQgcj1uZXcgeW8obixvKSxpPXIucHJvamVjdFBvaW50T250b1BsYW5lKGEuYWRkKG4sdCxkZCksZGQpLHM9ci5wcm9qZWN0UG9pbnRPbnRvUGxhbmUoYS5hZGQobixlLG1kKSxtZCksZj10dC5hbmdsZUJldHdlZW4oaSxzKTtyZXR1cm4gcy54KmkueS1zLnkqaS54Pj0wPy1mOmZ9ZnVuY3Rpb24gVWkodCxlLG4sbyxyLGkscyxmKXtsZXQgdT1EdixjPUZ2O19jPVhvLmVhc3ROb3J0aFVwVG9GaXhlZEZyYW1lKHQscixfYyksdT1zdC5tdWx0aXBseUJ5UG9pbnRBc1ZlY3RvcihfYyxJdix1KSx1PWEubm9ybWFsaXplKHUsdSk7bGV0IGw9TnYodSxlLHQscik7JDA9US5mcm9tUm90YXRpb25aKGwsJDApLEJ3Lno9aSxfYz1zdC5tdWx0aXBseVRyYW5zZm9ybWF0aW9uKF9jLHN0LmZyb21Sb3RhdGlvblRyYW5zbGF0aW9uKCQwLEJ3LHZ2KSxfYyk7bGV0IHA9THY7cFswXT1zO2ZvcihsZXQgZD0wO2Q8ZjtkKyspZm9yKGxldCBtPTA7bTxuLmxlbmd0aDttKz0zKWM9YS5mcm9tQXJyYXkobixtLGMpLGM9US5tdWx0aXBseUJ5VmVjdG9yKHAsYyxjKSxjPXN0Lm11bHRpcGx5QnlQb2ludChfYyxjLGMpLG8ucHVzaChjLngsYy55LGMueik7cmV0dXJuIG99ZnVuY3Rpb24gWjAodCxlLG4sbyxyLGkscyl7Zm9yKGxldCBmPTA7Zjx0Lmxlbmd0aDtmKz0zKXtsZXQgdT1hLmZyb21BcnJheSh0LGYsQnYpO289VWkodSxlLG4sbyxyLGlbZi8zXSxzLDEpfXJldHVybiBvfWZ1bmN0aW9uIFV2KHQsZSl7bGV0IG49dC5sZW5ndGgsbz1uZXcgQXJyYXkobio2KSxyPTAsaT1lLngrZS53aWR0aC8yLHM9ZS55K2UuaGVpZ2h0LzIsZj10WzBdO29bcisrXT1mLngtaSxvW3IrK109MCxvW3IrK109Zi55LXM7Zm9yKGxldCB1PTE7dTxuO3UrKyl7Zj10W3VdO2xldCBjPWYueC1pLGw9Zi55LXM7b1tyKytdPWMsb1tyKytdPTAsb1tyKytdPWwsb1tyKytdPWMsb1tyKytdPTAsb1tyKytdPWx9cmV0dXJuIGY9dFswXSxvW3IrK109Zi54LWksb1tyKytdPTAsb1tyKytdPWYueS1zLG99ZnVuY3Rpb24gVXcodCxlKXtsZXQgbj10Lmxlbmd0aCxvPW5ldyBBcnJheShuKjMpLHI9MCxpPWUueCtlLndpZHRoLzIscz1lLnkrZS5oZWlnaHQvMjtmb3IobGV0IGY9MDtmPG47ZisrKW9bcisrXT10W2ZdLngtaSxvW3IrK109MCxvW3IrK109dFtmXS55LXM7cmV0dXJuIG99ZnVuY3Rpb24gencodCxlLG4sbyxyLGkscyxmLHUsYyl7bGV0IGw9YS5hbmdsZUJldHdlZW4oYS5zdWJ0cmFjdChlLHQsZ2EpLGEuc3VidHJhY3Qobix0LHBkKSkscD1vPT09Zm4uQkVWRUxFRD8wOk1hdGguY2VpbChsL00udG9SYWRpYW5zKDUpKSxkO3I/ZD1RLmZyb21RdWF0ZXJuaW9uKGVlLmZyb21BeGlzQW5nbGUoYS5uZWdhdGUodCxnYSksbC8ocCsxKSxWdyksR3cpOmQ9US5mcm9tUXVhdGVybmlvbihlZS5mcm9tQXhpc0FuZ2xlKHQsbC8ocCsxKSxWdyksR3cpO2xldCBtLF87aWYoZT1hLmNsb25lKGUsa3cpLHA+MCl7bGV0IGc9Yz8yOjE7Zm9yKGxldCBiPTA7YjxwO2IrKyllPVEubXVsdGlwbHlCeVZlY3RvcihkLGUsZSksbT1hLnN1YnRyYWN0KGUsdCxnYSksbT1hLm5vcm1hbGl6ZShtLG0pLHJ8fChtPWEubmVnYXRlKG0sbSkpLF89aS5zY2FsZVRvR2VvZGV0aWNTdXJmYWNlKGUscGQpLHM9VWkoXyxtLGYscyxpLHUsMSxnKX1lbHNlIG09YS5zdWJ0cmFjdChlLHQsZ2EpLG09YS5ub3JtYWxpemUobSxtKSxyfHwobT1hLm5lZ2F0ZShtLG0pKSxfPWkuc2NhbGVUb0dlb2RldGljU3VyZmFjZShlLHBkKSxzPVVpKF8sbSxmLHMsaSx1LDEsMSksbj1hLmNsb25lKG4sa3cpLG09YS5zdWJ0cmFjdChuLHQsZ2EpLG09YS5ub3JtYWxpemUobSxtKSxyfHwobT1hLm5lZ2F0ZShtLG0pKSxfPWkuc2NhbGVUb0dlb2RldGljU3VyZmFjZShuLHBkKSxzPVVpKF8sbSxmLHMsaSx1LDEsMSk7cmV0dXJuIHN9dmFyIGFvLFR2LHd2LE92LEV2LFJ2LFN2LEN2LHh2LFB2LGdhLHBkLGtmLFgwLGRkLG1kLEl2LF9jLHZ2LCQwLEx2LER2LEZ2LEJ3LEJ2LFZ3LGt3LEd3LFZ2LGt2LGhzLGhkPVooKCk9PntVZSgpO0Z0KCk7aHIoKTtJZSgpO2hjKCk7bGEoKTtXdCgpO0JuKCk7VW4oKTt5YSgpO0tvKCk7Y3MoKTtXMCgpO2FvPVtuZXcgYSxuZXcgYV0sVHY9bmV3IGEsd3Y9bmV3IGEsT3Y9bmV3IGEsRXY9bmV3IGEsUnY9bmV3IGEsU3Y9bmV3IGEsQ3Y9bmV3IGEseHY9bmV3IGEsUHY9bmV3IGEsZ2E9bmV3IGEscGQ9bmV3IGEsa2Y9e30sWDA9bmV3IGN0O2RkPW5ldyBhLG1kPW5ldyBhO0l2PW5ldyBhKC0xLDAsMCksX2M9bmV3IHN0LHZ2PW5ldyBzdCwkMD1uZXcgUSxMdj1RLklERU5USVRZLmNsb25lKCksRHY9bmV3IGEsRnY9bmV3IGhlLEJ3PW5ldyBhO0J2PW5ldyBhO1Z3PW5ldyBlZSxrdz1uZXcgYSxHdz1uZXcgUTtrZi5yZW1vdmVEdXBsaWNhdGVzRnJvbVNoYXBlPWZ1bmN0aW9uKHQpe2xldCBlPXQubGVuZ3RoLG49W107Zm9yKGxldCBvPWUtMSxyPTA7cjxlO289cisrKXtsZXQgaT10W29dLHM9dFtyXTt0dC5lcXVhbHMoaSxzKXx8bi5wdXNoKHMpfXJldHVybiBufTtrZi5hbmdsZUlzR3JlYXRlclRoYW5QaT1mdW5jdGlvbih0LGUsbixvKXtsZXQgcj1uZXcgeW8obixvKSxpPXIucHJvamVjdFBvaW50T250b1BsYW5lKGEuYWRkKG4sdCxkZCksZGQpLHM9ci5wcm9qZWN0UG9pbnRPbnRvUGxhbmUoYS5hZGQobixlLG1kKSxtZCk7cmV0dXJuIHMueCppLnktcy55KmkueD49MH07VnY9bmV3IGEsa3Y9bmV3IGE7a2YuY29tcHV0ZVBvc2l0aW9ucz1mdW5jdGlvbih0LGUsbixvLHIpe2xldCBpPW8uX2VsbGlwc29pZCxzPU12KHQsaSksZj1vLl9ncmFudWxhcml0eSx1PW8uX2Nvcm5lclR5cGUsYz1yP1V2KGUsbik6VXcoZSxuKSxsPXI/VXcoZSxuKTp2b2lkIDAscD1uLmhlaWdodC8yLGQ9bi53aWR0aC8yLG09dC5sZW5ndGgsXz1bXSxnPXI/W106dm9pZCAwLGI9VHYsVD13dixPPU92LEU9RXYsdz1SdixDPVN2LE49Q3YsST14dixEPVB2LHY9dFswXSxMPXRbMV07RT1pLmdlb2RldGljU3VyZmFjZU5vcm1hbCh2LEUpLGI9YS5zdWJ0cmFjdChMLHYsYiksYj1hLm5vcm1hbGl6ZShiLGIpLEk9YS5jcm9zcyhFLGIsSSksST1hLm5vcm1hbGl6ZShJLEkpO2xldCBVPXNbMF0sQT1zWzFdO3ImJihnPVVpKHYsSSxsLGcsaSxVK3AsMSwxKSksRD1hLmNsb25lKHYsRCksdj1MLFQ9YS5uZWdhdGUoYixUKTtsZXQgUyxQO2ZvcihsZXQgSD0xO0g8bS0xO0grKyl7bGV0IGs9cj8yOjE7aWYoTD10W0grMV0sdi5lcXVhbHMoTCkpe2xkKCJQb3NpdGlvbnMgYXJlIHRvbyBjbG9zZSBhbmQgYXJlIGNvbnNpZGVyZWQgZXF1aXZhbGVudCB3aXRoIHJvdW5kaW5nIGVycm9yLiIpO2NvbnRpbnVlfWI9YS5zdWJ0cmFjdChMLHYsYiksYj1hLm5vcm1hbGl6ZShiLGIpLEU9aS5nZW9kZXRpY1N1cmZhY2VOb3JtYWwodixFKTtsZXQgSz1hLm11bHRpcGx5QnlTY2FsYXIoRSxhLmRvdChiLEUpLFZ2KTthLnN1YnRyYWN0KGIsSyxLKSxhLm5vcm1hbGl6ZShLLEspO2xldCBYPWEubXVsdGlwbHlCeVNjYWxhcihFLGEuZG90KFQsRSksa3YpO2lmKGEuc3VidHJhY3QoVCxYLFgpLGEubm9ybWFsaXplKFgsWCksIU0uZXF1YWxzRXBzaWxvbihNYXRoLmFicyhhLmRvdChLLFgpKSwxLE0uRVBTSUxPTjcpKXtPPWEuYWRkKGIsVCxPKSxPPWEubm9ybWFsaXplKE8sTyksTz1hLmNyb3NzKE8sRSxPKSxPPWEuY3Jvc3MoRSxPLE8pLE89YS5ub3JtYWxpemUoTyxPKTtsZXQgb3Q9MS9NYXRoLm1heCguMjUsYS5tYWduaXR1ZGUoYS5jcm9zcyhPLFQsZ2EpKSksYXQ9a2YuYW5nbGVJc0dyZWF0ZXJUaGFuUGkoYixULHYsaSk7YXQ/KHc9YS5hZGQodixhLm11bHRpcGx5QnlTY2FsYXIoTyxvdCpkLE8pLHcpLEM9YS5hZGQodyxhLm11bHRpcGx5QnlTY2FsYXIoSSxkLEMpLEMpLGFvWzBdPWEuY2xvbmUoRCxhb1swXSksYW9bMV09YS5jbG9uZShDLGFvWzFdKSxTPVkwKGFvLFUrcCxBK3AsZiksUD1Bbi5nZW5lcmF0ZUFyYyh7cG9zaXRpb25zOmFvLGdyYW51bGFyaXR5OmYsZWxsaXBzb2lkOml9KSxfPVowKFAsSSxjLF8saSxTLDEpLEk9YS5jcm9zcyhFLGIsSSksST1hLm5vcm1hbGl6ZShJLEkpLE49YS5hZGQodyxhLm11bHRpcGx5QnlTY2FsYXIoSSxkLE4pLE4pLHU9PT1mbi5ST1VOREVEfHx1PT09Zm4uQkVWRUxFRD96dyh3LEMsTix1LGF0LGksXyxjLEErcCxyKTooTz1hLm5lZ2F0ZShPLE8pLF89VWkodixPLGMsXyxpLEErcCxvdCxrKSksRD1hLmNsb25lKE4sRCkpOih3PWEuYWRkKHYsYS5tdWx0aXBseUJ5U2NhbGFyKE8sb3QqZCxPKSx3KSxDPWEuYWRkKHcsYS5tdWx0aXBseUJ5U2NhbGFyKEksLWQsQyksQyksYW9bMF09YS5jbG9uZShELGFvWzBdKSxhb1sxXT1hLmNsb25lKEMsYW9bMV0pLFM9WTAoYW8sVStwLEErcCxmKSxQPUFuLmdlbmVyYXRlQXJjKHtwb3NpdGlvbnM6YW8sZ3JhbnVsYXJpdHk6ZixlbGxpcHNvaWQ6aX0pLF89WjAoUCxJLGMsXyxpLFMsMSksST1hLmNyb3NzKEUsYixJKSxJPWEubm9ybWFsaXplKEksSSksTj1hLmFkZCh3LGEubXVsdGlwbHlCeVNjYWxhcihJLC1kLE4pLE4pLHU9PT1mbi5ST1VOREVEfHx1PT09Zm4uQkVWRUxFRD96dyh3LEMsTix1LGF0LGksXyxjLEErcCxyKTpfPVVpKHYsTyxjLF8saSxBK3Asb3QsayksRD1hLmNsb25lKE4sRCkpLFQ9YS5uZWdhdGUoYixUKX1lbHNlIF89VWkoRCxJLGMsXyxpLFUrcCwxLDEpLEQ9djtVPUEsQT1zW0grMV0sdj1MfWFvWzBdPWEuY2xvbmUoRCxhb1swXSksYW9bMV09YS5jbG9uZSh2LGFvWzFdKSxTPVkwKGFvLFUrcCxBK3AsZiksUD1Bbi5nZW5lcmF0ZUFyYyh7cG9zaXRpb25zOmFvLGdyYW51bGFyaXR5OmYsZWxsaXBzb2lkOml9KSxfPVowKFAsSSxjLF8saSxTLDEpLHImJihnPVVpKHYsSSxsLGcsaSxBK3AsMSwxKSksbT1fLmxlbmd0aDtsZXQgRj1yP20rZy5sZW5ndGg6bSxqPW5ldyBGbG9hdDY0QXJyYXkoRik7cmV0dXJuIGouc2V0KF8pLHImJmouc2V0KGcsbSksan07aHM9a2Z9KTtmdW5jdGlvbiBfZCh0LGUsbixvLHIpe2xldCBpPWEuYW5nbGVCZXR3ZWVuKGEuc3VidHJhY3QoZSx0LEFhKSxhLnN1YnRyYWN0KG4sdCxXdykpLHM9bz09PWZuLkJFVkVMRUQ/MTpNYXRoLmNlaWwoaS9NLnRvUmFkaWFucyg1KSkrMSxmPXMqMyx1PW5ldyBBcnJheShmKTt1W2YtM109bi54LHVbZi0yXT1uLnksdVtmLTFdPW4uejtsZXQgYztyP2M9US5mcm9tUXVhdGVybmlvbihlZS5mcm9tQXhpc0FuZ2xlKGEubmVnYXRlKHQsQWEpLGkvcyxIdykscXcpOmM9US5mcm9tUXVhdGVybmlvbihlZS5mcm9tQXhpc0FuZ2xlKHQsaS9zLEh3KSxxdyk7bGV0IGw9MDtlPWEuY2xvbmUoZSxBYSk7Zm9yKGxldCBwPTA7cDxzO3ArKyllPVEubXVsdGlwbHlCeVZlY3RvcihjLGUsZSksdVtsKytdPWUueCx1W2wrK109ZS55LHVbbCsrXT1lLno7cmV0dXJuIHV9ZnVuY3Rpb24gWXYodCl7bGV0IGU9WHcsbj1ZdyxvPSR3LHI9dFsxXTtuPWEuZnJvbUFycmF5KHRbMV0sci5sZW5ndGgtMyxuKSxvPWEuZnJvbUFycmF5KHRbMF0sMCxvKSxlPWEubWlkcG9pbnQobixvLGUpO2xldCBpPV9kKGUsbixvLGZuLlJPVU5ERUQsITEpLHM9dC5sZW5ndGgtMSxmPXRbcy0xXTtyPXRbc10sbj1hLmZyb21BcnJheShmLGYubGVuZ3RoLTMsbiksbz1hLmZyb21BcnJheShyLDAsbyksZT1hLm1pZHBvaW50KG4sbyxlKTtsZXQgdT1fZChlLG4sbyxmbi5ST1VOREVELCExKTtyZXR1cm5baSx1XX1mdW5jdGlvbiBLdyh0LGUsbixvKXtsZXQgcj1BYTtyZXR1cm4gbz9yPWEuYWRkKHQsZSxyKTooZT1hLm5lZ2F0ZShlLGUpLHI9YS5hZGQodCxlLHIpKSxbci54LHIueSxyLnosbi54LG4ueSxuLnpdfWZ1bmN0aW9uIFEwKHQsZSxuLG8pe2xldCByPW5ldyBBcnJheSh0Lmxlbmd0aCksaT1uZXcgQXJyYXkodC5sZW5ndGgpLHM9YS5tdWx0aXBseUJ5U2NhbGFyKGUsbixBYSksZj1hLm5lZ2F0ZShzLFd3KSx1PTAsYz10Lmxlbmd0aC0xO2ZvcihsZXQgbD0wO2w8dC5sZW5ndGg7bCs9Myl7bGV0IHA9YS5mcm9tQXJyYXkodCxsLEd2KSxkPWEuYWRkKHAsZixqdyk7clt1KytdPWQueCxyW3UrK109ZC55LHJbdSsrXT1kLno7bGV0IG09YS5hZGQocCxzLGp3KTtpW2MtLV09bS56LGlbYy0tXT1tLnksaVtjLS1dPW0ueH1yZXR1cm4gby5wdXNoKHIsaSksb312YXIgSjAsQWEsV3csR3YsancsQm8sWHcsWXcsJHcsenYsanYsSHYscXYsS3YsV3YsWHYsSHcscXcsJHYsWnYscWUsdF89WigoKT0+e0Z0KCk7aGMoKTtmdCgpO1d0KCk7Qm4oKTt5YSgpO2hkKCk7S28oKTtKMD17fSxBYT1uZXcgYSxXdz1uZXcgYSxHdj1uZXcgYSxqdz1uZXcgYSxCbz1bbmV3IGEsbmV3IGFdLFh3PW5ldyBhLFl3PW5ldyBhLCR3PW5ldyBhLHp2PW5ldyBhLGp2PW5ldyBhLEh2PW5ldyBhLHF2PW5ldyBhLEt2PW5ldyBhLFd2PW5ldyBhLFh2PW5ldyBhLEh3PW5ldyBlZSxxdz1uZXcgUTtKMC5hZGRBdHRyaWJ1dGU9ZnVuY3Rpb24odCxlLG4sbyl7bGV0IHI9ZS54LGk9ZS55LHM9ZS56O2gobikmJih0W25dPXIsdFtuKzFdPWksdFtuKzJdPXMpLGgobykmJih0W29dPXMsdFtvLTFdPWksdFtvLTJdPXIpfTskdj1uZXcgYSxadj1uZXcgYTtKMC5jb21wdXRlUG9zaXRpb25zPWZ1bmN0aW9uKHQpe2xldCBlPXQuZ3JhbnVsYXJpdHksbj10LnBvc2l0aW9ucyxvPXQuZWxsaXBzb2lkLHI9dC53aWR0aC8yLGk9dC5jb3JuZXJUeXBlLHM9dC5zYXZlQXR0cmlidXRlcyxmPVh3LHU9WXcsYz0kdyxsPXp2LHA9anYsZD1IdixtPXF2LF89S3YsZz1XdixiPVh2LFQ9W10sTz1zP1tdOnZvaWQgMCxFPXM/W106dm9pZCAwLHc9blswXSxDPW5bMV07dT1hLm5vcm1hbGl6ZShhLnN1YnRyYWN0KEMsdyx1KSx1KSxmPW8uZ2VvZGV0aWNTdXJmYWNlTm9ybWFsKHcsZiksbD1hLm5vcm1hbGl6ZShhLmNyb3NzKGYsdSxsKSxsKSxzJiYoTy5wdXNoKGwueCxsLnksbC56KSxFLnB1c2goZi54LGYueSxmLnopKSxtPWEuY2xvbmUodyxtKSx3PUMsYz1hLm5lZ2F0ZSh1LGMpO2xldCBOLEk9W10sRCx2PW4ubGVuZ3RoO2ZvcihEPTE7RDx2LTE7RCsrKXtmPW8uZ2VvZGV0aWNTdXJmYWNlTm9ybWFsKHcsZiksQz1uW0QrMV0sdT1hLm5vcm1hbGl6ZShhLnN1YnRyYWN0KEMsdyx1KSx1KTtsZXQgVT1hLm11bHRpcGx5QnlTY2FsYXIoZixhLmRvdCh1LGYpLCR2KTthLnN1YnRyYWN0KHUsVSxVKSxhLm5vcm1hbGl6ZShVLFUpO2xldCBBPWEubXVsdGlwbHlCeVNjYWxhcihmLGEuZG90KGMsZiksWnYpO2lmKGEuc3VidHJhY3QoYyxBLEEpLGEubm9ybWFsaXplKEEsQSksIU0uZXF1YWxzRXBzaWxvbihNYXRoLmFicyhhLmRvdChVLEEpKSwxLE0uRVBTSUxPTjcpKXtwPWEubm9ybWFsaXplKGEuYWRkKHUsYyxwKSxwKSxwPWEuY3Jvc3MocCxmLHApLHA9YS5jcm9zcyhmLHAscCkscD1hLm5vcm1hbGl6ZShwLHApO2xldCBQPXIvTWF0aC5tYXgoLjI1LGEubWFnbml0dWRlKGEuY3Jvc3MocCxjLEFhKSkpLEY9aHMuYW5nbGVJc0dyZWF0ZXJUaGFuUGkodSxjLHcsbyk7cD1hLm11bHRpcGx5QnlTY2FsYXIocCxQLHApLEY/KF89YS5hZGQodyxwLF8pLGI9YS5hZGQoXyxhLm11bHRpcGx5QnlTY2FsYXIobCxyLGIpLGIpLGc9YS5hZGQoXyxhLm11bHRpcGx5QnlTY2FsYXIobCxyKjIsZyksZyksQm9bMF09YS5jbG9uZShtLEJvWzBdKSxCb1sxXT1hLmNsb25lKGIsQm9bMV0pLE49QW4uZ2VuZXJhdGVBcmMoe3Bvc2l0aW9uczpCbyxncmFudWxhcml0eTplLGVsbGlwc29pZDpvfSksVD1RMChOLGwscixUKSxzJiYoTy5wdXNoKGwueCxsLnksbC56KSxFLnB1c2goZi54LGYueSxmLnopKSxkPWEuY2xvbmUoZyxkKSxsPWEubm9ybWFsaXplKGEuY3Jvc3MoZix1LGwpLGwpLGc9YS5hZGQoXyxhLm11bHRpcGx5QnlTY2FsYXIobCxyKjIsZyksZyksbT1hLmFkZChfLGEubXVsdGlwbHlCeVNjYWxhcihsLHIsbSksbSksaT09PWZuLlJPVU5ERUR8fGk9PT1mbi5CRVZFTEVEP0kucHVzaCh7bGVmdFBvc2l0aW9uczpfZChfLGQsZyxpLEYpfSk6SS5wdXNoKHtsZWZ0UG9zaXRpb25zOkt3KHcsYS5uZWdhdGUocCxwKSxnLEYpfSkpOihnPWEuYWRkKHcscCxnKSxiPWEuYWRkKGcsYS5uZWdhdGUoYS5tdWx0aXBseUJ5U2NhbGFyKGwscixiKSxiKSxiKSxfPWEuYWRkKGcsYS5uZWdhdGUoYS5tdWx0aXBseUJ5U2NhbGFyKGwscioyLF8pLF8pLF8pLEJvWzBdPWEuY2xvbmUobSxCb1swXSksQm9bMV09YS5jbG9uZShiLEJvWzFdKSxOPUFuLmdlbmVyYXRlQXJjKHtwb3NpdGlvbnM6Qm8sZ3JhbnVsYXJpdHk6ZSxlbGxpcHNvaWQ6b30pLFQ9UTAoTixsLHIsVCkscyYmKE8ucHVzaChsLngsbC55LGwueiksRS5wdXNoKGYueCxmLnksZi56KSksZD1hLmNsb25lKF8sZCksbD1hLm5vcm1hbGl6ZShhLmNyb3NzKGYsdSxsKSxsKSxfPWEuYWRkKGcsYS5uZWdhdGUoYS5tdWx0aXBseUJ5U2NhbGFyKGwscioyLF8pLF8pLF8pLG09YS5hZGQoZyxhLm5lZ2F0ZShhLm11bHRpcGx5QnlTY2FsYXIobCxyLG0pLG0pLG0pLGk9PT1mbi5ST1VOREVEfHxpPT09Zm4uQkVWRUxFRD9JLnB1c2goe3JpZ2h0UG9zaXRpb25zOl9kKGcsZCxfLGksRil9KTpJLnB1c2goe3JpZ2h0UG9zaXRpb25zOkt3KHcscCxfLEYpfSkpLGM9YS5uZWdhdGUodSxjKX13PUN9Zj1vLmdlb2RldGljU3VyZmFjZU5vcm1hbCh3LGYpLEJvWzBdPWEuY2xvbmUobSxCb1swXSksQm9bMV09YS5jbG9uZSh3LEJvWzFdKSxOPUFuLmdlbmVyYXRlQXJjKHtwb3NpdGlvbnM6Qm8sZ3JhbnVsYXJpdHk6ZSxlbGxpcHNvaWQ6b30pLFQ9UTAoTixsLHIsVCkscyYmKE8ucHVzaChsLngsbC55LGwueiksRS5wdXNoKGYueCxmLnksZi56KSk7bGV0IEw7cmV0dXJuIGk9PT1mbi5ST1VOREVEJiYoTD1ZdihUKSkse3Bvc2l0aW9uczpULGNvcm5lcnM6SSxsZWZ0czpPLG5vcm1hbHM6RSxlbmRQb3NpdGlvbnM6TH19O3FlPUowfSk7ZnVuY3Rpb24gbk8odCxlKXtmb3IobGV0IG49MDtuPHQubGVuZ3RoO24rKyl0W25dPWUuc2NhbGVUb0dlb2RldGljU3VyZmFjZSh0W25dLHRbbl0pO3JldHVybiB0fWZ1bmN0aW9uIEtyKHQsZSxuLG8scixpKXtsZXQgcz10Lm5vcm1hbHMsZj10LnRhbmdlbnRzLHU9dC5iaXRhbmdlbnRzLGM9YS5ub3JtYWxpemUoYS5jcm9zcyhuLGUsX3MpLF9zKTtpLm5vcm1hbCYmcWUuYWRkQXR0cmlidXRlKHMsZSxvLHIpLGkudGFuZ2VudCYmcWUuYWRkQXR0cmlidXRlKGYsYyxvLHIpLGkuYml0YW5nZW50JiZxZS5hZGRBdHRyaWJ1dGUodSxuLG8scil9ZnVuY3Rpb24gb08odCxlLG4pe2xldCBvPXQucG9zaXRpb25zLHI9dC5jb3JuZXJzLGk9dC5lbmRQb3NpdGlvbnMscz10LmxlZnRzLGY9dC5ub3JtYWxzLHU9bmV3IGllLGMsbD0wLHA9MCxkLG09MCxfO2ZvcihkPTA7ZDxvLmxlbmd0aDtkKz0yKV89b1tkXS5sZW5ndGgtMyxsKz1fLG0rPV8qMixwKz1vW2QrMV0ubGVuZ3RoLTM7Zm9yKGwrPTMscCs9MyxkPTA7ZDxyLmxlbmd0aDtkKyspe2M9cltkXTtsZXQgcnQ9cltkXS5sZWZ0UG9zaXRpb25zO2gocnQpPyhfPXJ0Lmxlbmd0aCxsKz1fLG0rPV8pOihfPXJbZF0ucmlnaHRQb3NpdGlvbnMubGVuZ3RoLHArPV8sbSs9Xyl9bGV0IGc9aChpKSxiO2cmJihiPWlbMF0ubGVuZ3RoLTMsbCs9YixwKz1iLGIvPTMsbSs9Yio2KTtsZXQgVD1sK3AsTz1uZXcgRmxvYXQ2NEFycmF5KFQpLEU9ZS5ub3JtYWw/bmV3IEZsb2F0MzJBcnJheShUKTp2b2lkIDAsdz1lLnRhbmdlbnQ/bmV3IEZsb2F0MzJBcnJheShUKTp2b2lkIDAsQz1lLmJpdGFuZ2VudD9uZXcgRmxvYXQzMkFycmF5KFQpOnZvaWQgMCxOPXtub3JtYWxzOkUsdGFuZ2VudHM6dyxiaXRhbmdlbnRzOkN9LEk9MCxEPVQtMSx2LEwsVSxBLFM9SncsUD10TyxGLGosSD1iLzIsaz1EdC5jcmVhdGVUeXBlZEFycmF5KFQvMyxtKSxLPTA7aWYoZyl7aj15ZCxGPWdkO2xldCBydD1pWzBdO2ZvcihTPWEuZnJvbUFycmF5KGYsMCxTKSxQPWEuZnJvbUFycmF5KHMsMCxQKSxkPTA7ZDxIO2QrKylqPWEuZnJvbUFycmF5KHJ0LChILTEtZCkqMyxqKSxGPWEuZnJvbUFycmF5KHJ0LChIK2QpKjMsRikscWUuYWRkQXR0cmlidXRlKE8sRixJKSxxZS5hZGRBdHRyaWJ1dGUoTyxqLHZvaWQgMCxEKSxLcihOLFMsUCxJLEQsZSksTD1JLzMsQT1MKzEsdj0oRC0yKS8zLFU9di0xLGtbSysrXT12LGtbSysrXT1MLGtbSysrXT1VLGtbSysrXT1VLGtbSysrXT1MLGtbSysrXT1BLEkrPTMsRC09M31sZXQgWD0wLFI9MCxvdD1vW1grK10sYXQ9b1tYKytdO08uc2V0KG90LEkpLE8uc2V0KGF0LEQtYXQubGVuZ3RoKzEpLFA9YS5mcm9tQXJyYXkocyxSLFApO2xldCBwdCx5dDtmb3IoXz1hdC5sZW5ndGgtMyxkPTA7ZDxfO2QrPTMpcHQ9bi5nZW9kZXRpY1N1cmZhY2VOb3JtYWwoYS5mcm9tQXJyYXkob3QsZCxfcyksX3MpLHl0PW4uZ2VvZGV0aWNTdXJmYWNlTm9ybWFsKGEuZnJvbUFycmF5KGF0LF8tZCxiYSksYmEpLFM9YS5ub3JtYWxpemUoYS5hZGQocHQseXQsUyksUyksS3IoTixTLFAsSSxELGUpLEw9SS8zLEE9TCsxLHY9KEQtMikvMyxVPXYtMSxrW0srK109dixrW0srK109TCxrW0srK109VSxrW0srK109VSxrW0srK109TCxrW0srK109QSxJKz0zLEQtPTM7Zm9yKHB0PW4uZ2VvZGV0aWNTdXJmYWNlTm9ybWFsKGEuZnJvbUFycmF5KG90LF8sX3MpLF9zKSx5dD1uLmdlb2RldGljU3VyZmFjZU5vcm1hbChhLmZyb21BcnJheShhdCxfLGJhKSxiYSksUz1hLm5vcm1hbGl6ZShhLmFkZChwdCx5dCxTKSxTKSxSKz0zLGQ9MDtkPHIubGVuZ3RoO2QrKyl7bGV0IHJ0O2M9cltkXTtsZXQgUHQ9Yy5sZWZ0UG9zaXRpb25zLGd0PWMucmlnaHRQb3NpdGlvbnMsQ3QsbXQsdXQ9ZU8sdnQ9eWQsenQ9Z2Q7aWYoUz1hLmZyb21BcnJheShmLFIsUyksaChQdCkpe2ZvcihLcihOLFMsUCx2b2lkIDAsRCxlKSxELT0zLEN0PUEsbXQ9VSxydD0wO3J0PFB0Lmxlbmd0aC8zO3J0KyspdXQ9YS5mcm9tQXJyYXkoUHQscnQqMyx1dCksa1tLKytdPUN0LGtbSysrXT1tdC1ydC0xLGtbSysrXT1tdC1ydCxxZS5hZGRBdHRyaWJ1dGUoTyx1dCx2b2lkIDAsRCksdnQ9YS5mcm9tQXJyYXkoTywobXQtcnQtMSkqMyx2dCksenQ9YS5mcm9tQXJyYXkoTyxDdCozLHp0KSxQPWEubm9ybWFsaXplKGEuc3VidHJhY3QodnQsenQsUCksUCksS3IoTixTLFAsdm9pZCAwLEQsZSksRC09Mzt1dD1hLmZyb21BcnJheShPLEN0KjMsdXQpLHZ0PWEuc3VidHJhY3QoYS5mcm9tQXJyYXkoTyxtdCozLHZ0KSx1dCx2dCksenQ9YS5zdWJ0cmFjdChhLmZyb21BcnJheShPLChtdC1ydCkqMyx6dCksdXQsenQpLFA9YS5ub3JtYWxpemUoYS5hZGQodnQsenQsUCksUCksS3IoTixTLFAsSSx2b2lkIDAsZSksSSs9M31lbHNle2ZvcihLcihOLFMsUCxJLHZvaWQgMCxlKSxJKz0zLEN0PVUsbXQ9QSxydD0wO3J0PGd0Lmxlbmd0aC8zO3J0KyspdXQ9YS5mcm9tQXJyYXkoZ3QscnQqMyx1dCksa1tLKytdPUN0LGtbSysrXT1tdCtydCxrW0srK109bXQrcnQrMSxxZS5hZGRBdHRyaWJ1dGUoTyx1dCxJKSx2dD1hLmZyb21BcnJheShPLEN0KjMsdnQpLHp0PWEuZnJvbUFycmF5KE8sKG10K3J0KSozLHp0KSxQPWEubm9ybWFsaXplKGEuc3VidHJhY3QodnQsenQsUCksUCksS3IoTixTLFAsSSx2b2lkIDAsZSksSSs9Mzt1dD1hLmZyb21BcnJheShPLEN0KjMsdXQpLHZ0PWEuc3VidHJhY3QoYS5mcm9tQXJyYXkoTywobXQrcnQpKjMsdnQpLHV0LHZ0KSx6dD1hLnN1YnRyYWN0KGEuZnJvbUFycmF5KE8sbXQqMyx6dCksdXQsenQpLFA9YS5ub3JtYWxpemUoYS5uZWdhdGUoYS5hZGQoenQsdnQsUCksUCksUCksS3IoTixTLFAsdm9pZCAwLEQsZSksRC09M31mb3Iob3Q9b1tYKytdLGF0PW9bWCsrXSxvdC5zcGxpY2UoMCwzKSxhdC5zcGxpY2UoYXQubGVuZ3RoLTMsMyksTy5zZXQob3QsSSksTy5zZXQoYXQsRC1hdC5sZW5ndGgrMSksXz1hdC5sZW5ndGgtMyxSKz0zLFA9YS5mcm9tQXJyYXkocyxSLFApLHJ0PTA7cnQ8YXQubGVuZ3RoO3J0Kz0zKXB0PW4uZ2VvZGV0aWNTdXJmYWNlTm9ybWFsKGEuZnJvbUFycmF5KG90LHJ0LF9zKSxfcykseXQ9bi5nZW9kZXRpY1N1cmZhY2VOb3JtYWwoYS5mcm9tQXJyYXkoYXQsXy1ydCxiYSksYmEpLFM9YS5ub3JtYWxpemUoYS5hZGQocHQseXQsUyksUyksS3IoTixTLFAsSSxELGUpLEE9SS8zLEw9QS0xLFU9KEQtMikvMyx2PVUrMSxrW0srK109dixrW0srK109TCxrW0srK109VSxrW0srK109VSxrW0srK109TCxrW0srK109QSxJKz0zLEQtPTM7SS09MyxEKz0zfWlmKFM9YS5mcm9tQXJyYXkoZixmLmxlbmd0aC0zLFMpLEtyKE4sUyxQLEksRCxlKSxnKXtJKz0zLEQtPTMsaj15ZCxGPWdkO2xldCBydD1pWzFdO2ZvcihkPTA7ZDxIO2QrKylqPWEuZnJvbUFycmF5KHJ0LChiLWQtMSkqMyxqKSxGPWEuZnJvbUFycmF5KHJ0LGQqMyxGKSxxZS5hZGRBdHRyaWJ1dGUoTyxqLHZvaWQgMCxEKSxxZS5hZGRBdHRyaWJ1dGUoTyxGLEkpLEtyKE4sUyxQLEksRCxlKSxBPUkvMyxMPUEtMSxVPShELTIpLzMsdj1VKzEsa1tLKytdPXYsa1tLKytdPUwsa1tLKytdPVUsa1tLKytdPVUsa1tLKytdPUwsa1tLKytdPUEsSSs9MyxELT0zfWlmKHUucG9zaXRpb249bmV3IGl0KHtjb21wb25lbnREYXRhdHlwZTpudC5ET1VCTEUsY29tcG9uZW50c1BlckF0dHJpYnV0ZTozLHZhbHVlczpPfSksZS5zdCl7bGV0IHJ0PW5ldyBGbG9hdDMyQXJyYXkoVC8zKjIpLFB0LGd0LEN0PTA7aWYoZyl7bC89MyxwLz0zO2xldCBtdD1NYXRoLlBJLyhiKzEpO2d0PTEvKGwtYisxKSxQdD0xLyhwLWIrMSk7bGV0IHV0LHZ0PWIvMjtmb3IoZD12dCsxO2Q8YisxO2QrKyl1dD1NLlBJX09WRVJfVFdPK210KmQscnRbQ3QrK109UHQqKDErTWF0aC5jb3ModXQpKSxydFtDdCsrXT0uNSooMStNYXRoLnNpbih1dCkpO2ZvcihkPTE7ZDxwLWIrMTtkKyspcnRbQ3QrK109ZCpQdCxydFtDdCsrXT0wO2ZvcihkPWI7ZD52dDtkLS0pdXQ9TS5QSV9PVkVSX1RXTy1kKm10LHJ0W0N0KytdPTEtUHQqKDErTWF0aC5jb3ModXQpKSxydFtDdCsrXT0uNSooMStNYXRoLnNpbih1dCkpO2ZvcihkPXZ0O2Q+MDtkLS0pdXQ9TS5QSV9PVkVSX1RXTy1tdCpkLHJ0W0N0KytdPTEtZ3QqKDErTWF0aC5jb3ModXQpKSxydFtDdCsrXT0uNSooMStNYXRoLnNpbih1dCkpO2ZvcihkPWwtYjtkPjA7ZC0tKXJ0W0N0KytdPWQqZ3QscnRbQ3QrK109MTtmb3IoZD0xO2Q8dnQrMTtkKyspdXQ9TS5QSV9PVkVSX1RXTyttdCpkLHJ0W0N0KytdPWd0KigxK01hdGguY29zKHV0KSkscnRbQ3QrK109LjUqKDErTWF0aC5zaW4odXQpKX1lbHNle2ZvcihsLz0zLHAvPTMsZ3Q9MS8obC0xKSxQdD0xLyhwLTEpLGQ9MDtkPHA7ZCsrKXJ0W0N0KytdPWQqUHQscnRbQ3QrK109MDtmb3IoZD1sO2Q+MDtkLS0pcnRbQ3QrK109KGQtMSkqZ3QscnRbQ3QrK109MX11LnN0PW5ldyBpdCh7Y29tcG9uZW50RGF0YXR5cGU6bnQuRkxPQVQsY29tcG9uZW50c1BlckF0dHJpYnV0ZToyLHZhbHVlczpydH0pfXJldHVybiBlLm5vcm1hbCYmKHUubm9ybWFsPW5ldyBpdCh7Y29tcG9uZW50RGF0YXR5cGU6bnQuRkxPQVQsY29tcG9uZW50c1BlckF0dHJpYnV0ZTozLHZhbHVlczpOLm5vcm1hbHN9KSksZS50YW5nZW50JiYodS50YW5nZW50PW5ldyBpdCh7Y29tcG9uZW50RGF0YXR5cGU6bnQuRkxPQVQsY29tcG9uZW50c1BlckF0dHJpYnV0ZTozLHZhbHVlczpOLnRhbmdlbnRzfSkpLGUuYml0YW5nZW50JiYodS5iaXRhbmdlbnQ9bmV3IGl0KHtjb21wb25lbnREYXRhdHlwZTpudC5GTE9BVCxjb21wb25lbnRzUGVyQXR0cmlidXRlOjMsdmFsdWVzOk4uYml0YW5nZW50c30pKSx7YXR0cmlidXRlczp1LGluZGljZXM6a319ZnVuY3Rpb24gSnYodCxlKXtpZighZS5ub3JtYWwmJiFlLnRhbmdlbnQmJiFlLmJpdGFuZ2VudCYmIWUuc3QpcmV0dXJuIHQ7bGV0IG49dC5wb3NpdGlvbi52YWx1ZXMsbyxyOyhlLm5vcm1hbHx8ZS5iaXRhbmdlbnQpJiYobz10Lm5vcm1hbC52YWx1ZXMscj10LmJpdGFuZ2VudC52YWx1ZXMpO2xldCBpPXQucG9zaXRpb24udmFsdWVzLmxlbmd0aC8xOCxzPWkqMyxmPWkqMix1PXMqMixjO2lmKGUubm9ybWFsfHxlLmJpdGFuZ2VudHx8ZS50YW5nZW50KXtsZXQgbD1lLm5vcm1hbD9uZXcgRmxvYXQzMkFycmF5KHMqNik6dm9pZCAwLHA9ZS50YW5nZW50P25ldyBGbG9hdDMyQXJyYXkocyo2KTp2b2lkIDAsZD1lLmJpdGFuZ2VudD9uZXcgRmxvYXQzMkFycmF5KHMqNik6dm9pZCAwLG09SncsXz10TyxnPXlkLGI9Z2QsVD1RdixPPWVPLEU9dTtmb3IoYz0wO2M8cztjKz0zKXtsZXQgdz1FK3U7bT1hLmZyb21BcnJheShuLGMsbSksXz1hLmZyb21BcnJheShuLGMrcyxfKSxnPWEuZnJvbUFycmF5KG4sKGMrMyklcyxnKSxfPWEuc3VidHJhY3QoXyxtLF8pLGc9YS5zdWJ0cmFjdChnLG0sZyksYj1hLm5vcm1hbGl6ZShhLmNyb3NzKF8sZyxiKSxiKSxlLm5vcm1hbCYmKHFlLmFkZEF0dHJpYnV0ZShsLGIsdykscWUuYWRkQXR0cmlidXRlKGwsYix3KzMpLHFlLmFkZEF0dHJpYnV0ZShsLGIsRSkscWUuYWRkQXR0cmlidXRlKGwsYixFKzMpKSwoZS50YW5nZW50fHxlLmJpdGFuZ2VudCkmJihPPWEuZnJvbUFycmF5KG8sYyxPKSxlLmJpdGFuZ2VudCYmKHFlLmFkZEF0dHJpYnV0ZShkLE8sdykscWUuYWRkQXR0cmlidXRlKGQsTyx3KzMpLHFlLmFkZEF0dHJpYnV0ZShkLE8sRSkscWUuYWRkQXR0cmlidXRlKGQsTyxFKzMpKSxlLnRhbmdlbnQmJihUPWEubm9ybWFsaXplKGEuY3Jvc3MoTyxiLFQpLFQpLHFlLmFkZEF0dHJpYnV0ZShwLFQsdykscWUuYWRkQXR0cmlidXRlKHAsVCx3KzMpLHFlLmFkZEF0dHJpYnV0ZShwLFQsRSkscWUuYWRkQXR0cmlidXRlKHAsVCxFKzMpKSksRSs9Nn1pZihlLm5vcm1hbCl7Zm9yKGwuc2V0KG8pLGM9MDtjPHM7Yys9MylsW2Mrc109LW9bY10sbFtjK3MrMV09LW9bYysxXSxsW2MrcysyXT0tb1tjKzJdO3Qubm9ybWFsLnZhbHVlcz1sfWVsc2UgdC5ub3JtYWw9dm9pZCAwO2lmKGUuYml0YW5nZW50PyhkLnNldChyKSxkLnNldChyLHMpLHQuYml0YW5nZW50LnZhbHVlcz1kKTp0LmJpdGFuZ2VudD12b2lkIDAsZS50YW5nZW50KXtsZXQgdz10LnRhbmdlbnQudmFsdWVzO3Auc2V0KHcpLHAuc2V0KHcscyksdC50YW5nZW50LnZhbHVlcz1wfX1pZihlLnN0KXtsZXQgbD10LnN0LnZhbHVlcyxwPW5ldyBGbG9hdDMyQXJyYXkoZio2KTtwLnNldChsKSxwLnNldChsLGYpO2xldCBkPWYqMjtmb3IobGV0IG09MDttPDI7bSsrKXtmb3IocFtkKytdPWxbMF0scFtkKytdPWxbMV0sYz0yO2M8ZjtjKz0yKXtsZXQgXz1sW2NdLGc9bFtjKzFdO3BbZCsrXT1fLHBbZCsrXT1nLHBbZCsrXT1fLHBbZCsrXT1nfXBbZCsrXT1sWzBdLHBbZCsrXT1sWzFdfXQuc3QudmFsdWVzPXB9cmV0dXJuIHR9ZnVuY3Rpb24gZV8odCxlLG4pe25bZSsrXT10WzBdLG5bZSsrXT10WzFdLG5bZSsrXT10WzJdO2ZvcihsZXQgbz0zO288dC5sZW5ndGg7bys9Myl7bGV0IHI9dFtvXSxpPXRbbysxXSxzPXRbbysyXTtuW2UrK109cixuW2UrK109aSxuW2UrK109cyxuW2UrK109cixuW2UrK109aSxuW2UrK109c31yZXR1cm4gbltlKytdPXRbMF0sbltlKytdPXRbMV0sbltlKytdPXRbMl0sbn1mdW5jdGlvbiB0TCh0LGUpe2xldCBuPW5ldyBkdCh7cG9zaXRpb246ZS5wb3NpdGlvbixub3JtYWw6ZS5ub3JtYWx8fGUuYml0YW5nZW50fHx0LnNoYWRvd1ZvbHVtZSx0YW5nZW50OmUudGFuZ2VudCxiaXRhbmdlbnQ6ZS5ub3JtYWx8fGUuYml0YW5nZW50LHN0OmUuc3R9KSxvPXQuZWxsaXBzb2lkLHI9cWUuY29tcHV0ZVBvc2l0aW9ucyh0KSxpPW9PKHIsbixvKSxzPXQuaGVpZ2h0LGY9dC5leHRydWRlZEhlaWdodCx1PWkuYXR0cmlidXRlcyxjPWkuaW5kaWNlcyxsPXUucG9zaXRpb24udmFsdWVzLHA9bC5sZW5ndGgsZD1uZXcgRmxvYXQ2NEFycmF5KHAqNiksbT1uZXcgRmxvYXQ2NEFycmF5KHApO20uc2V0KGwpO2xldCBfPW5ldyBGbG9hdDY0QXJyYXkocCo0KTtsPVBlLnNjYWxlVG9HZW9kZXRpY0hlaWdodChsLHMsbyksXz1lXyhsLDAsXyksbT1QZS5zY2FsZVRvR2VvZGV0aWNIZWlnaHQobSxmLG8pLF89ZV8obSxwKjIsXyksZC5zZXQobCksZC5zZXQobSxwKSxkLnNldChfLHAqMiksdS5wb3NpdGlvbi52YWx1ZXM9ZCx1PUp2KHUsZSk7bGV0IGcsYj1wLzM7aWYodC5zaGFkb3dWb2x1bWUpe2xldCB2PXUubm9ybWFsLnZhbHVlcztwPXYubGVuZ3RoO2xldCBMPW5ldyBGbG9hdDMyQXJyYXkocCo2KTtmb3IoZz0wO2c8cDtnKyspdltnXT0tdltnXTtMLnNldCh2LHApLEw9ZV8odixwKjQsTCksdS5leHRydWRlRGlyZWN0aW9uPW5ldyBpdCh7Y29tcG9uZW50RGF0YXR5cGU6bnQuRkxPQVQsY29tcG9uZW50c1BlckF0dHJpYnV0ZTozLHZhbHVlczpMfSksZS5ub3JtYWx8fCh1Lm5vcm1hbD12b2lkIDApfWlmKGgodC5vZmZzZXRBdHRyaWJ1dGUpKXtsZXQgdj1uZXcgVWludDhBcnJheShiKjYpO2lmKHQub2Zmc2V0QXR0cmlidXRlPT09ZmUuVE9QKXY9di5maWxsKDEsMCxiKS5maWxsKDEsYioyLGIqNCk7ZWxzZXtsZXQgTD10Lm9mZnNldEF0dHJpYnV0ZT09PWZlLk5PTkU/MDoxO3Y9di5maWxsKEwpfXUuYXBwbHlPZmZzZXQ9bmV3IGl0KHtjb21wb25lbnREYXRhdHlwZTpudC5VTlNJR05FRF9CWVRFLGNvbXBvbmVudHNQZXJBdHRyaWJ1dGU6MSx2YWx1ZXM6dn0pfWxldCBUPWMubGVuZ3RoLE89YitiLEU9RHQuY3JlYXRlVHlwZWRBcnJheShkLmxlbmd0aC8zLFQqMitPKjMpO0Uuc2V0KGMpO2xldCB3PVQ7Zm9yKGc9MDtnPFQ7Zys9Myl7bGV0IHY9Y1tnXSxMPWNbZysxXSxVPWNbZysyXTtFW3crK109VStiLEVbdysrXT1MK2IsRVt3KytdPXYrYn1sZXQgQyxOLEksRDtmb3IoZz0wO2c8TztnKz0yKUM9ZytPLE49QytPLEk9QysxLEQ9TisxLEVbdysrXT1DLEVbdysrXT1OLEVbdysrXT1JLEVbdysrXT1JLEVbdysrXT1OLEVbdysrXT1EO3JldHVybnthdHRyaWJ1dGVzOnUsaW5kaWNlczpFfX1mdW5jdGlvbiBRdyh0LGUsbixvLHIsaSl7bGV0IHM9YS5zdWJ0cmFjdChlLHQsWncpO2Eubm9ybWFsaXplKHMscyk7bGV0IGY9bi5nZW9kZXRpY1N1cmZhY2VOb3JtYWwodCxHZiksdT1hLmNyb3NzKHMsZixadyk7YS5tdWx0aXBseUJ5U2NhbGFyKHUsbyx1KTtsZXQgYz1yLmxhdGl0dWRlLGw9ci5sb25naXR1ZGUscD1pLmxhdGl0dWRlLGQ9aS5sb25naXR1ZGU7YS5hZGQodCx1LEdmKSxuLmNhcnRlc2lhblRvQ2FydG9ncmFwaGljKEdmLHdyKTtsZXQgbT13ci5sYXRpdHVkZSxfPXdyLmxvbmdpdHVkZTtjPU1hdGgubWluKGMsbSksbD1NYXRoLm1pbihsLF8pLHA9TWF0aC5tYXgocCxtKSxkPU1hdGgubWF4KGQsXyksYS5zdWJ0cmFjdCh0LHUsR2YpLG4uY2FydGVzaWFuVG9DYXJ0b2dyYXBoaWMoR2Ysd3IpLG09d3IubGF0aXR1ZGUsXz13ci5sb25naXR1ZGUsYz1NYXRoLm1pbihjLG0pLGw9TWF0aC5taW4obCxfKSxwPU1hdGgubWF4KHAsbSksZD1NYXRoLm1heChkLF8pLHIubGF0aXR1ZGU9YyxyLmxvbmdpdHVkZT1sLGkubGF0aXR1ZGU9cCxpLmxvbmdpdHVkZT1kfWZ1bmN0aW9uIHJPKHQsZSxuLG8scil7dD1uTyh0LGUpO2xldCBpPXhuKHQsYS5lcXVhbHNFcHNpbG9uKSxzPWkubGVuZ3RoO2lmKHM8Mnx8bjw9MClyZXR1cm4gbmV3IE50O2xldCBmPW4qLjU7UW8ubGF0aXR1ZGU9TnVtYmVyLlBPU0lUSVZFX0lORklOSVRZLFFvLmxvbmdpdHVkZT1OdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFksSm8ubGF0aXR1ZGU9TnVtYmVyLk5FR0FUSVZFX0lORklOSVRZLEpvLmxvbmdpdHVkZT1OdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFk7bGV0IHUsYztpZihvPT09Zm4uUk9VTkRFRCl7bGV0IGQ9aVswXTthLnN1YnRyYWN0KGQsaVsxXSxUciksYS5ub3JtYWxpemUoVHIsVHIpLGEubXVsdGlwbHlCeVNjYWxhcihUcixmLFRyKSxhLmFkZChkLFRyLHpmKSxlLmNhcnRlc2lhblRvQ2FydG9ncmFwaGljKHpmLHdyKSx1PXdyLmxhdGl0dWRlLGM9d3IubG9uZ2l0dWRlLFFvLmxhdGl0dWRlPU1hdGgubWluKFFvLmxhdGl0dWRlLHUpLFFvLmxvbmdpdHVkZT1NYXRoLm1pbihRby5sb25naXR1ZGUsYyksSm8ubGF0aXR1ZGU9TWF0aC5tYXgoSm8ubGF0aXR1ZGUsdSksSm8ubG9uZ2l0dWRlPU1hdGgubWF4KEpvLmxvbmdpdHVkZSxjKX1mb3IobGV0IGQ9MDtkPHMtMTsrK2QpUXcoaVtkXSxpW2QrMV0sZSxmLFFvLEpvKTtsZXQgbD1pW3MtMV07YS5zdWJ0cmFjdChsLGlbcy0yXSxUciksYS5ub3JtYWxpemUoVHIsVHIpLGEubXVsdGlwbHlCeVNjYWxhcihUcixmLFRyKSxhLmFkZChsLFRyLHpmKSxRdyhsLHpmLGUsZixRbyxKbyksbz09PWZuLlJPVU5ERUQmJihlLmNhcnRlc2lhblRvQ2FydG9ncmFwaGljKHpmLHdyKSx1PXdyLmxhdGl0dWRlLGM9d3IubG9uZ2l0dWRlLFFvLmxhdGl0dWRlPU1hdGgubWluKFFvLmxhdGl0dWRlLHUpLFFvLmxvbmdpdHVkZT1NYXRoLm1pbihRby5sb25naXR1ZGUsYyksSm8ubGF0aXR1ZGU9TWF0aC5tYXgoSm8ubGF0aXR1ZGUsdSksSm8ubG9uZ2l0dWRlPU1hdGgubWF4KEpvLmxvbmdpdHVkZSxjKSk7bGV0IHA9aChyKT9yOm5ldyBOdDtyZXR1cm4gcC5ub3J0aD1Kby5sYXRpdHVkZSxwLnNvdXRoPVFvLmxhdGl0dWRlLHAuZWFzdD1Kby5sb25naXR1ZGUscC53ZXN0PVFvLmxvbmdpdHVkZSxwfWZ1bmN0aW9uIGtpKHQpe3Q9eCh0LHguRU1QVFlfT0JKRUNUKTtsZXQgZT10LnBvc2l0aW9ucyxuPXQud2lkdGg7eS5kZWZpbmVkKCJvcHRpb25zLnBvc2l0aW9ucyIsZSkseS5kZWZpbmVkKCJvcHRpb25zLndpZHRoIixuKTtsZXQgbz14KHQuaGVpZ2h0LDApLHI9eCh0LmV4dHJ1ZGVkSGVpZ2h0LG8pO3RoaXMuX3Bvc2l0aW9ucz1lLHRoaXMuX2VsbGlwc29pZD0kLmNsb25lKHgodC5lbGxpcHNvaWQsJC5kZWZhdWx0KSksdGhpcy5fdmVydGV4Rm9ybWF0PWR0LmNsb25lKHgodC52ZXJ0ZXhGb3JtYXQsZHQuREVGQVVMVCkpLHRoaXMuX3dpZHRoPW4sdGhpcy5faGVpZ2h0PU1hdGgubWF4KG8sciksdGhpcy5fZXh0cnVkZWRIZWlnaHQ9TWF0aC5taW4obyxyKSx0aGlzLl9jb3JuZXJUeXBlPXgodC5jb3JuZXJUeXBlLGZuLlJPVU5ERUQpLHRoaXMuX2dyYW51bGFyaXR5PXgodC5ncmFudWxhcml0eSxNLlJBRElBTlNfUEVSX0RFR1JFRSksdGhpcy5fc2hhZG93Vm9sdW1lPXgodC5zaGFkb3dWb2x1bWUsITEpLHRoaXMuX3dvcmtlck5hbWU9ImNyZWF0ZUNvcnJpZG9yR2VvbWV0cnkiLHRoaXMuX29mZnNldEF0dHJpYnV0ZT10Lm9mZnNldEF0dHJpYnV0ZSx0aGlzLl9yZWN0YW5nbGU9dm9pZCAwLHRoaXMucGFja2VkTGVuZ3RoPTErZS5sZW5ndGgqYS5wYWNrZWRMZW5ndGgrJC5wYWNrZWRMZW5ndGgrZHQucGFja2VkTGVuZ3RoKzd9dmFyIEp3LHRPLHlkLGdkLFF2LGVPLF9zLGJhLFp3LEdmLHdyLFRyLHpmLFFvLEpvLGlPLHNPLFZpLG5fLGNPPVooKCk9PntqcigpO3ZlKCk7RnQoKTtJZSgpO1h0KCk7RmUoKTtoYygpO3RfKCk7SXQoKTtmdCgpO1p0KCk7WGUoKTtZZSgpO2FuKCk7TG8oKTskZSgpO1d0KCk7cXIoKTt0bigpO3duKCk7Um8oKTtKdz1uZXcgYSx0Tz1uZXcgYSx5ZD1uZXcgYSxnZD1uZXcgYSxRdj1uZXcgYSxlTz1uZXcgYSxfcz1uZXcgYSxiYT1uZXcgYTtadz1uZXcgYSxHZj1uZXcgYSx3cj1uZXcgY3Q7VHI9bmV3IGEsemY9bmV3IGEsUW89bmV3IGN0LEpvPW5ldyBjdDtraS5wYWNrPWZ1bmN0aW9uKHQsZSxuKXt5LmRlZmluZWQoInZhbHVlIix0KSx5LmRlZmluZWQoImFycmF5IixlKSxuPXgobiwwKTtsZXQgbz10Ll9wb3NpdGlvbnMscj1vLmxlbmd0aDtlW24rK109cjtmb3IobGV0IGk9MDtpPHI7KytpLG4rPWEucGFja2VkTGVuZ3RoKWEucGFjayhvW2ldLGUsbik7cmV0dXJuICQucGFjayh0Ll9lbGxpcHNvaWQsZSxuKSxuKz0kLnBhY2tlZExlbmd0aCxkdC5wYWNrKHQuX3ZlcnRleEZvcm1hdCxlLG4pLG4rPWR0LnBhY2tlZExlbmd0aCxlW24rK109dC5fd2lkdGgsZVtuKytdPXQuX2hlaWdodCxlW24rK109dC5fZXh0cnVkZWRIZWlnaHQsZVtuKytdPXQuX2Nvcm5lclR5cGUsZVtuKytdPXQuX2dyYW51bGFyaXR5LGVbbisrXT10Ll9zaGFkb3dWb2x1bWU/MTowLGVbbl09eCh0Ll9vZmZzZXRBdHRyaWJ1dGUsLTEpLGV9O2lPPSQuY2xvbmUoJC5VTklUX1NQSEVSRSksc089bmV3IGR0LFZpPXtwb3NpdGlvbnM6dm9pZCAwLGVsbGlwc29pZDppTyx2ZXJ0ZXhGb3JtYXQ6c08sd2lkdGg6dm9pZCAwLGhlaWdodDp2b2lkIDAsZXh0cnVkZWRIZWlnaHQ6dm9pZCAwLGNvcm5lclR5cGU6dm9pZCAwLGdyYW51bGFyaXR5OnZvaWQgMCxzaGFkb3dWb2x1bWU6dm9pZCAwLG9mZnNldEF0dHJpYnV0ZTp2b2lkIDB9O2tpLnVucGFjaz1mdW5jdGlvbih0LGUsbil7eS5kZWZpbmVkKCJhcnJheSIsdCksZT14KGUsMCk7bGV0IG89dFtlKytdLHI9bmV3IEFycmF5KG8pO2ZvcihsZXQgXz0wO188bzsrK18sZSs9YS5wYWNrZWRMZW5ndGgpcltfXT1hLnVucGFjayh0LGUpO2xldCBpPSQudW5wYWNrKHQsZSxpTyk7ZSs9JC5wYWNrZWRMZW5ndGg7bGV0IHM9ZHQudW5wYWNrKHQsZSxzTyk7ZSs9ZHQucGFja2VkTGVuZ3RoO2xldCBmPXRbZSsrXSx1PXRbZSsrXSxjPXRbZSsrXSxsPXRbZSsrXSxwPXRbZSsrXSxkPXRbZSsrXT09PTEsbT10W2VdO3JldHVybiBoKG4pPyhuLl9wb3NpdGlvbnM9cixuLl9lbGxpcHNvaWQ9JC5jbG9uZShpLG4uX2VsbGlwc29pZCksbi5fdmVydGV4Rm9ybWF0PWR0LmNsb25lKHMsbi5fdmVydGV4Rm9ybWF0KSxuLl93aWR0aD1mLG4uX2hlaWdodD11LG4uX2V4dHJ1ZGVkSGVpZ2h0PWMsbi5fY29ybmVyVHlwZT1sLG4uX2dyYW51bGFyaXR5PXAsbi5fc2hhZG93Vm9sdW1lPWQsbi5fb2Zmc2V0QXR0cmlidXRlPW09PT0tMT92b2lkIDA6bSxuKTooVmkucG9zaXRpb25zPXIsVmkud2lkdGg9ZixWaS5oZWlnaHQ9dSxWaS5leHRydWRlZEhlaWdodD1jLFZpLmNvcm5lclR5cGU9bCxWaS5ncmFudWxhcml0eT1wLFZpLnNoYWRvd1ZvbHVtZT1kLFZpLm9mZnNldEF0dHJpYnV0ZT1tPT09LTE/dm9pZCAwOm0sbmV3IGtpKFZpKSl9O2tpLmNvbXB1dGVSZWN0YW5nbGU9ZnVuY3Rpb24odCxlKXt0PXgodCx4LkVNUFRZX09CSkVDVCk7bGV0IG49dC5wb3NpdGlvbnMsbz10LndpZHRoO3kuZGVmaW5lZCgib3B0aW9ucy5wb3NpdGlvbnMiLG4pLHkuZGVmaW5lZCgib3B0aW9ucy53aWR0aCIsbyk7bGV0IHI9eCh0LmVsbGlwc29pZCwkLmRlZmF1bHQpLGk9eCh0LmNvcm5lclR5cGUsZm4uUk9VTkRFRCk7cmV0dXJuIHJPKG4scixvLGksZSl9O2tpLmNyZWF0ZUdlb21ldHJ5PWZ1bmN0aW9uKHQpe2xldCBlPXQuX3Bvc2l0aW9ucyxuPXQuX3dpZHRoLG89dC5fZWxsaXBzb2lkO2U9bk8oZSxvKTtsZXQgcj14bihlLGEuZXF1YWxzRXBzaWxvbik7aWYoci5sZW5ndGg8Mnx8bjw9MClyZXR1cm47bGV0IGk9dC5faGVpZ2h0LHM9dC5fZXh0cnVkZWRIZWlnaHQsZj0hTS5lcXVhbHNFcHNpbG9uKGkscywwLE0uRVBTSUxPTjIpLHU9dC5fdmVydGV4Rm9ybWF0LGM9e2VsbGlwc29pZDpvLHBvc2l0aW9uczpyLHdpZHRoOm4sY29ybmVyVHlwZTp0Ll9jb3JuZXJUeXBlLGdyYW51bGFyaXR5OnQuX2dyYW51bGFyaXR5LHNhdmVBdHRyaWJ1dGVzOiEwfSxsO2lmKGYpYy5oZWlnaHQ9aSxjLmV4dHJ1ZGVkSGVpZ2h0PXMsYy5zaGFkb3dWb2x1bWU9dC5fc2hhZG93Vm9sdW1lLGMub2Zmc2V0QXR0cmlidXRlPXQuX29mZnNldEF0dHJpYnV0ZSxsPXRMKGMsdSk7ZWxzZXtsZXQgbT1xZS5jb21wdXRlUG9zaXRpb25zKGMpO2lmKGw9b08obSx1LG8pLGwuYXR0cmlidXRlcy5wb3NpdGlvbi52YWx1ZXM9UGUuc2NhbGVUb0dlb2RldGljSGVpZ2h0KGwuYXR0cmlidXRlcy5wb3NpdGlvbi52YWx1ZXMsaSxvKSxoKHQuX29mZnNldEF0dHJpYnV0ZSkpe2xldCBfPXQuX29mZnNldEF0dHJpYnV0ZT09PWZlLk5PTkU/MDoxLGc9bC5hdHRyaWJ1dGVzLnBvc2l0aW9uLnZhbHVlcy5sZW5ndGgsYj1uZXcgVWludDhBcnJheShnLzMpLmZpbGwoXyk7bC5hdHRyaWJ1dGVzLmFwcGx5T2Zmc2V0PW5ldyBpdCh7Y29tcG9uZW50RGF0YXR5cGU6bnQuVU5TSUdORURfQllURSxjb21wb25lbnRzUGVyQXR0cmlidXRlOjEsdmFsdWVzOmJ9KX19bGV0IHA9bC5hdHRyaWJ1dGVzLGQ9QXQuZnJvbVZlcnRpY2VzKHAucG9zaXRpb24udmFsdWVzLHZvaWQgMCwzKTtyZXR1cm4gdS5wb3NpdGlvbnx8KGwuYXR0cmlidXRlcy5wb3NpdGlvbi52YWx1ZXM9dm9pZCAwKSxuZXcgVXQoe2F0dHJpYnV0ZXM6cCxpbmRpY2VzOmwuaW5kaWNlcyxwcmltaXRpdmVUeXBlOkJ0LlRSSUFOR0xFUyxib3VuZGluZ1NwaGVyZTpkLG9mZnNldEF0dHJpYnV0ZTp0Ll9vZmZzZXRBdHRyaWJ1dGV9KX07a2kuY3JlYXRlU2hhZG93Vm9sdW1lPWZ1bmN0aW9uKHQsZSxuKXtsZXQgbz10Ll9ncmFudWxhcml0eSxyPXQuX2VsbGlwc29pZCxpPWUobyxyKSxzPW4obyxyKTtyZXR1cm4gbmV3IGtpKHtwb3NpdGlvbnM6dC5fcG9zaXRpb25zLHdpZHRoOnQuX3dpZHRoLGNvcm5lclR5cGU6dC5fY29ybmVyVHlwZSxlbGxpcHNvaWQ6cixncmFudWxhcml0eTpvLGV4dHJ1ZGVkSGVpZ2h0OmksaGVpZ2h0OnMsdmVydGV4Rm9ybWF0OmR0LlBPU0lUSU9OX09OTFksc2hhZG93Vm9sdW1lOiEwfSl9O09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGtpLnByb3RvdHlwZSx7cmVjdGFuZ2xlOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gaCh0aGlzLl9yZWN0YW5nbGUpfHwodGhpcy5fcmVjdGFuZ2xlPXJPKHRoaXMuX3Bvc2l0aW9ucyx0aGlzLl9lbGxpcHNvaWQsdGhpcy5fd2lkdGgsdGhpcy5fY29ybmVyVHlwZSkpLHRoaXMuX3JlY3RhbmdsZX19LHRleHR1cmVDb29yZGluYXRlUm90YXRpb25Qb2ludHM6e2dldDpmdW5jdGlvbigpe3JldHVyblswLDAsMCwxLDEsMF19fX0pO25fPWtpfSk7dmFyIG9fPXt9O2RlKG9fLHtkZWZhdWx0OigpPT5uTH0pO2Z1bmN0aW9uIGVMKHQsZSl7cmV0dXJuIGgoZSkmJih0PW5fLnVucGFjayh0LGUpKSx0Ll9lbGxpcHNvaWQ9JC5jbG9uZSh0Ll9lbGxpcHNvaWQpLG5fLmNyZWF0ZUdlb21ldHJ5KHQpfXZhciBuTCxyXz1aKCgpPT57Y08oKTtmdCgpO1p0KCk7bkw9ZUx9KTtmdW5jdGlvbiByTCh0LGUpe2ZvcihsZXQgbj0wO248dC5sZW5ndGg7bisrKXRbbl09ZS5zY2FsZVRvR2VvZGV0aWNTdXJmYWNlKHRbbl0sdFtuXSk7cmV0dXJuIHR9ZnVuY3Rpb24gdU8odCxlKXtsZXQgbj1bXSxvPXQucG9zaXRpb25zLHI9dC5jb3JuZXJzLGk9dC5lbmRQb3NpdGlvbnMscz1uZXcgaWUsZix1PTAsYz0wLGwscD0wLGQ7Zm9yKGw9MDtsPG8ubGVuZ3RoO2wrPTIpZD1vW2xdLmxlbmd0aC0zLHUrPWQscCs9ZC8zKjQsYys9b1tsKzFdLmxlbmd0aC0zO2Zvcih1Kz0zLGMrPTMsbD0wO2w8ci5sZW5ndGg7bCsrKXtmPXJbbF07bGV0IEY9cltsXS5sZWZ0UG9zaXRpb25zO2goRik/KGQ9Ri5sZW5ndGgsdSs9ZCxwKz1kLzMqMik6KGQ9cltsXS5yaWdodFBvc2l0aW9ucy5sZW5ndGgsYys9ZCxwKz1kLzMqMil9bGV0IG09aChpKSxfO20mJihfPWlbMF0ubGVuZ3RoLTMsdSs9XyxjKz1fLF8vPTMscCs9Xyo0KTtsZXQgZz11K2MsYj1uZXcgRmxvYXQ2NEFycmF5KGcpLFQ9MCxPPWctMSxFLHcsQyxOLEksRCx2PV8vMixMPUR0LmNyZWF0ZVR5cGVkQXJyYXkoZy8zLHArNCksVT0wO2lmKExbVSsrXT1ULzMsTFtVKytdPShPLTIpLzMsbSl7bi5wdXNoKFQvMyksRD1hTyxJPWZPO2xldCBGPWlbMF07Zm9yKGw9MDtsPHY7bCsrKUQ9YS5mcm9tQXJyYXkoRiwodi0xLWwpKjMsRCksST1hLmZyb21BcnJheShGLCh2K2wpKjMsSSkscWUuYWRkQXR0cmlidXRlKGIsSSxUKSxxZS5hZGRBdHRyaWJ1dGUoYixELHZvaWQgMCxPKSx3PVQvMyxOPXcrMSxFPShPLTIpLzMsQz1FLTEsTFtVKytdPUUsTFtVKytdPUMsTFtVKytdPXcsTFtVKytdPU4sVCs9MyxPLT0zfWxldCBBPTAsUz1vW0ErK10sUD1vW0ErK107Zm9yKGIuc2V0KFMsVCksYi5zZXQoUCxPLVAubGVuZ3RoKzEpLGQ9UC5sZW5ndGgtMyxuLnB1c2goVC8zLChPLTIpLzMpLGw9MDtsPGQ7bCs9Myl3PVQvMyxOPXcrMSxFPShPLTIpLzMsQz1FLTEsTFtVKytdPUUsTFtVKytdPUMsTFtVKytdPXcsTFtVKytdPU4sVCs9MyxPLT0zO2ZvcihsPTA7bDxyLmxlbmd0aDtsKyspe2xldCBGO2Y9cltsXTtsZXQgaj1mLmxlZnRQb3NpdGlvbnMsSD1mLnJpZ2h0UG9zaXRpb25zLGssSz1vTDtpZihoKGopKXtmb3IoTy09MyxrPUMsbi5wdXNoKE4pLEY9MDtGPGoubGVuZ3RoLzM7RisrKUs9YS5mcm9tQXJyYXkoaixGKjMsSyksTFtVKytdPWstRi0xLExbVSsrXT1rLUYscWUuYWRkQXR0cmlidXRlKGIsSyx2b2lkIDAsTyksTy09MztuLnB1c2goay1NYXRoLmZsb29yKGoubGVuZ3RoLzYpKSxlPT09Zm4uQkVWRUxFRCYmbi5wdXNoKChPLTIpLzMrMSksVCs9M31lbHNle2ZvcihUKz0zLGs9TixuLnB1c2goQyksRj0wO0Y8SC5sZW5ndGgvMztGKyspSz1hLmZyb21BcnJheShILEYqMyxLKSxMW1UrK109aytGLExbVSsrXT1rK0YrMSxxZS5hZGRBdHRyaWJ1dGUoYixLLFQpLFQrPTM7bi5wdXNoKGsrTWF0aC5mbG9vcihILmxlbmd0aC82KSksZT09PWZuLkJFVkVMRUQmJm4ucHVzaChULzMtMSksTy09M31mb3IoUz1vW0ErK10sUD1vW0ErK10sUy5zcGxpY2UoMCwzKSxQLnNwbGljZShQLmxlbmd0aC0zLDMpLGIuc2V0KFMsVCksYi5zZXQoUCxPLVAubGVuZ3RoKzEpLGQ9UC5sZW5ndGgtMyxGPTA7RjxQLmxlbmd0aDtGKz0zKU49VC8zLHc9Ti0xLEM9KE8tMikvMyxFPUMrMSxMW1UrK109RSxMW1UrK109QyxMW1UrK109dyxMW1UrK109TixUKz0zLE8tPTM7VC09MyxPKz0zLG4ucHVzaChULzMsKE8tMikvMyl9aWYobSl7VCs9MyxPLT0zLEQ9YU8sST1mTztsZXQgRj1pWzFdO2ZvcihsPTA7bDx2O2wrKylEPWEuZnJvbUFycmF5KEYsKF8tbC0xKSozLEQpLEk9YS5mcm9tQXJyYXkoRixsKjMsSSkscWUuYWRkQXR0cmlidXRlKGIsRCx2b2lkIDAsTykscWUuYWRkQXR0cmlidXRlKGIsSSxUKSxOPVQvMyx3PU4tMSxDPShPLTIpLzMsRT1DKzEsTFtVKytdPUUsTFtVKytdPUMsTFtVKytdPXcsTFtVKytdPU4sVCs9MyxPLT0zO24ucHVzaChULzMpfWVsc2Ugbi5wdXNoKFQvMywoTy0yKS8zKTtyZXR1cm4gTFtVKytdPVQvMyxMW1UrK109KE8tMikvMyxzLnBvc2l0aW9uPW5ldyBpdCh7Y29tcG9uZW50RGF0YXR5cGU6bnQuRE9VQkxFLGNvbXBvbmVudHNQZXJBdHRyaWJ1dGU6Myx2YWx1ZXM6Yn0pLHthdHRyaWJ1dGVzOnMsaW5kaWNlczpMLHdhbGxJbmRpY2VzOm59fWZ1bmN0aW9uIGlMKHQpe2xldCBlPXQuZWxsaXBzb2lkLG49cWUuY29tcHV0ZVBvc2l0aW9ucyh0KSxvPXVPKG4sdC5jb3JuZXJUeXBlKSxyPW8ud2FsbEluZGljZXMsaT10LmhlaWdodCxzPXQuZXh0cnVkZWRIZWlnaHQsZj1vLmF0dHJpYnV0ZXMsdT1vLmluZGljZXMsYz1mLnBvc2l0aW9uLnZhbHVlcyxsPWMubGVuZ3RoLHA9bmV3IEZsb2F0NjRBcnJheShsKTtwLnNldChjKTtsZXQgZD1uZXcgRmxvYXQ2NEFycmF5KGwqMik7aWYoYz1QZS5zY2FsZVRvR2VvZGV0aWNIZWlnaHQoYyxpLGUpLHA9UGUuc2NhbGVUb0dlb2RldGljSGVpZ2h0KHAscyxlKSxkLnNldChjKSxkLnNldChwLGwpLGYucG9zaXRpb24udmFsdWVzPWQsbC89MyxoKHQub2Zmc2V0QXR0cmlidXRlKSl7bGV0IEU9bmV3IFVpbnQ4QXJyYXkobCoyKTtpZih0Lm9mZnNldEF0dHJpYnV0ZT09PWZlLlRPUClFPUUuZmlsbCgxLDAsbCk7ZWxzZXtsZXQgdz10Lm9mZnNldEF0dHJpYnV0ZT09PWZlLk5PTkU/MDoxO0U9RS5maWxsKHcpfWYuYXBwbHlPZmZzZXQ9bmV3IGl0KHtjb21wb25lbnREYXRhdHlwZTpudC5VTlNJR05FRF9CWVRFLGNvbXBvbmVudHNQZXJBdHRyaWJ1dGU6MSx2YWx1ZXM6RX0pfWxldCBtLF89dS5sZW5ndGgsZz1EdC5jcmVhdGVUeXBlZEFycmF5KGQubGVuZ3RoLzMsKF8rci5sZW5ndGgpKjIpO2cuc2V0KHUpO2xldCBiPV87Zm9yKG09MDttPF87bSs9Mil7bGV0IEU9dVttXSx3PXVbbSsxXTtnW2IrK109RStsLGdbYisrXT13K2x9bGV0IFQsTztmb3IobT0wO208ci5sZW5ndGg7bSsrKVQ9clttXSxPPVQrbCxnW2IrK109VCxnW2IrK109TztyZXR1cm57YXR0cmlidXRlczpmLGluZGljZXM6Z319ZnVuY3Rpb24gamYodCl7dD14KHQseC5FTVBUWV9PQkpFQ1QpO2xldCBlPXQucG9zaXRpb25zLG49dC53aWR0aDt5LnR5cGVPZi5vYmplY3QoIm9wdGlvbnMucG9zaXRpb25zIixlKSx5LnR5cGVPZi5udW1iZXIoIm9wdGlvbnMud2lkdGgiLG4pO2xldCBvPXgodC5oZWlnaHQsMCkscj14KHQuZXh0cnVkZWRIZWlnaHQsbyk7dGhpcy5fcG9zaXRpb25zPWUsdGhpcy5fZWxsaXBzb2lkPSQuY2xvbmUoeCh0LmVsbGlwc29pZCwkLmRlZmF1bHQpKSx0aGlzLl93aWR0aD1uLHRoaXMuX2hlaWdodD1NYXRoLm1heChvLHIpLHRoaXMuX2V4dHJ1ZGVkSGVpZ2h0PU1hdGgubWluKG8sciksdGhpcy5fY29ybmVyVHlwZT14KHQuY29ybmVyVHlwZSxmbi5ST1VOREVEKSx0aGlzLl9ncmFudWxhcml0eT14KHQuZ3JhbnVsYXJpdHksTS5SQURJQU5TX1BFUl9ERUdSRUUpLHRoaXMuX29mZnNldEF0dHJpYnV0ZT10Lm9mZnNldEF0dHJpYnV0ZSx0aGlzLl93b3JrZXJOYW1lPSJjcmVhdGVDb3JyaWRvck91dGxpbmVHZW9tZXRyeSIsdGhpcy5wYWNrZWRMZW5ndGg9MStlLmxlbmd0aCphLnBhY2tlZExlbmd0aCskLnBhY2tlZExlbmd0aCs2fXZhciBhTyxmTyxvTCxsTyx5cyxpXyxwTz1aKCgpPT57anIoKTt2ZSgpO0Z0KCk7WHQoKTtGZSgpO2hjKCk7dF8oKTtJdCgpO2Z0KCk7WnQoKTtYZSgpO1llKCk7YW4oKTtMbygpOyRlKCk7V3QoKTtxcigpO3RuKCk7YU89bmV3IGEsZk89bmV3IGEsb0w9bmV3IGE7amYucGFjaz1mdW5jdGlvbih0LGUsbil7eS50eXBlT2Yub2JqZWN0KCJ2YWx1ZSIsdCkseS50eXBlT2Yub2JqZWN0KCJhcnJheSIsZSksbj14KG4sMCk7bGV0IG89dC5fcG9zaXRpb25zLHI9by5sZW5ndGg7ZVtuKytdPXI7Zm9yKGxldCBpPTA7aTxyOysraSxuKz1hLnBhY2tlZExlbmd0aClhLnBhY2sob1tpXSxlLG4pO3JldHVybiAkLnBhY2sodC5fZWxsaXBzb2lkLGUsbiksbis9JC5wYWNrZWRMZW5ndGgsZVtuKytdPXQuX3dpZHRoLGVbbisrXT10Ll9oZWlnaHQsZVtuKytdPXQuX2V4dHJ1ZGVkSGVpZ2h0LGVbbisrXT10Ll9jb3JuZXJUeXBlLGVbbisrXT10Ll9ncmFudWxhcml0eSxlW25dPXgodC5fb2Zmc2V0QXR0cmlidXRlLC0xKSxlfTtsTz0kLmNsb25lKCQuVU5JVF9TUEhFUkUpLHlzPXtwb3NpdGlvbnM6dm9pZCAwLGVsbGlwc29pZDpsTyx3aWR0aDp2b2lkIDAsaGVpZ2h0OnZvaWQgMCxleHRydWRlZEhlaWdodDp2b2lkIDAsY29ybmVyVHlwZTp2b2lkIDAsZ3JhbnVsYXJpdHk6dm9pZCAwLG9mZnNldEF0dHJpYnV0ZTp2b2lkIDB9O2pmLnVucGFjaz1mdW5jdGlvbih0LGUsbil7eS50eXBlT2Yub2JqZWN0KCJhcnJheSIsdCksZT14KGUsMCk7bGV0IG89dFtlKytdLHI9bmV3IEFycmF5KG8pO2ZvcihsZXQgZD0wO2Q8bzsrK2QsZSs9YS5wYWNrZWRMZW5ndGgpcltkXT1hLnVucGFjayh0LGUpO2xldCBpPSQudW5wYWNrKHQsZSxsTyk7ZSs9JC5wYWNrZWRMZW5ndGg7bGV0IHM9dFtlKytdLGY9dFtlKytdLHU9dFtlKytdLGM9dFtlKytdLGw9dFtlKytdLHA9dFtlXTtyZXR1cm4gaChuKT8obi5fcG9zaXRpb25zPXIsbi5fZWxsaXBzb2lkPSQuY2xvbmUoaSxuLl9lbGxpcHNvaWQpLG4uX3dpZHRoPXMsbi5faGVpZ2h0PWYsbi5fZXh0cnVkZWRIZWlnaHQ9dSxuLl9jb3JuZXJUeXBlPWMsbi5fZ3JhbnVsYXJpdHk9bCxuLl9vZmZzZXRBdHRyaWJ1dGU9cD09PS0xP3ZvaWQgMDpwLG4pOih5cy5wb3NpdGlvbnM9cix5cy53aWR0aD1zLHlzLmhlaWdodD1mLHlzLmV4dHJ1ZGVkSGVpZ2h0PXUseXMuY29ybmVyVHlwZT1jLHlzLmdyYW51bGFyaXR5PWwseXMub2Zmc2V0QXR0cmlidXRlPXA9PT0tMT92b2lkIDA6cCxuZXcgamYoeXMpKX07amYuY3JlYXRlR2VvbWV0cnk9ZnVuY3Rpb24odCl7bGV0IGU9dC5fcG9zaXRpb25zLG49dC5fd2lkdGgsbz10Ll9lbGxpcHNvaWQ7ZT1yTChlLG8pO2xldCByPXhuKGUsYS5lcXVhbHNFcHNpbG9uKTtpZihyLmxlbmd0aDwyfHxuPD0wKXJldHVybjtsZXQgaT10Ll9oZWlnaHQscz10Ll9leHRydWRlZEhlaWdodCxmPSFNLmVxdWFsc0Vwc2lsb24oaSxzLDAsTS5FUFNJTE9OMiksdT17ZWxsaXBzb2lkOm8scG9zaXRpb25zOnIsd2lkdGg6bixjb3JuZXJUeXBlOnQuX2Nvcm5lclR5cGUsZ3JhbnVsYXJpdHk6dC5fZ3JhbnVsYXJpdHksc2F2ZUF0dHJpYnV0ZXM6ITF9LGM7aWYoZil1LmhlaWdodD1pLHUuZXh0cnVkZWRIZWlnaHQ9cyx1Lm9mZnNldEF0dHJpYnV0ZT10Ll9vZmZzZXRBdHRyaWJ1dGUsYz1pTCh1KTtlbHNle2xldCBkPXFlLmNvbXB1dGVQb3NpdGlvbnModSk7aWYoYz11TyhkLHUuY29ybmVyVHlwZSksYy5hdHRyaWJ1dGVzLnBvc2l0aW9uLnZhbHVlcz1QZS5zY2FsZVRvR2VvZGV0aWNIZWlnaHQoYy5hdHRyaWJ1dGVzLnBvc2l0aW9uLnZhbHVlcyxpLG8pLGgodC5fb2Zmc2V0QXR0cmlidXRlKSl7bGV0IG09Yy5hdHRyaWJ1dGVzLnBvc2l0aW9uLnZhbHVlcy5sZW5ndGgsXz10Ll9vZmZzZXRBdHRyaWJ1dGU9PT1mZS5OT05FPzA6MSxnPW5ldyBVaW50OEFycmF5KG0vMykuZmlsbChfKTtjLmF0dHJpYnV0ZXMuYXBwbHlPZmZzZXQ9bmV3IGl0KHtjb21wb25lbnREYXRhdHlwZTpudC5VTlNJR05FRF9CWVRFLGNvbXBvbmVudHNQZXJBdHRyaWJ1dGU6MSx2YWx1ZXM6Z30pfX1sZXQgbD1jLmF0dHJpYnV0ZXMscD1BdC5mcm9tVmVydGljZXMobC5wb3NpdGlvbi52YWx1ZXMsdm9pZCAwLDMpO3JldHVybiBuZXcgVXQoe2F0dHJpYnV0ZXM6bCxpbmRpY2VzOmMuaW5kaWNlcyxwcmltaXRpdmVUeXBlOkJ0LkxJTkVTLGJvdW5kaW5nU3BoZXJlOnAsb2Zmc2V0QXR0cmlidXRlOnQuX29mZnNldEF0dHJpYnV0ZX0pfTtpXz1qZn0pO3ZhciBzXz17fTtkZShzXyx7ZGVmYXVsdDooKT0+Y0x9KTtmdW5jdGlvbiBzTCh0LGUpe3JldHVybiBoKGUpJiYodD1pXy51bnBhY2sodCxlKSksdC5fZWxsaXBzb2lkPSQuY2xvbmUodC5fZWxsaXBzb2lkKSxpXy5jcmVhdGVHZW9tZXRyeSh0KX12YXIgY0wsY189WigoKT0+e3BPKCk7ZnQoKTtadCgpO2NMPXNMfSk7dmFyIGRPLEFkLGFfPVooKCk9PntXdCgpO2RPPXt9O2RPLmNvbXB1dGVQb3NpdGlvbnM9ZnVuY3Rpb24odCxlLG4sbyxyKXtsZXQgaT10Ki41LHM9LWksZj1vK28sdT1yPzIqZjpmLGM9bmV3IEZsb2F0NjRBcnJheSh1KjMpLGwscD0wLGQ9MCxtPXI/ZiozOjAsXz1yPyhmK28pKjM6byozO2ZvcihsPTA7bDxvO2wrKyl7bGV0IGc9bC9vKk0uVFdPX1BJLGI9TWF0aC5jb3MoZyksVD1NYXRoLnNpbihnKSxPPWIqbixFPVQqbix3PWIqZSxDPVQqZTtjW2QrbV09TyxjW2QrbSsxXT1FLGNbZCttKzJdPXMsY1tkK19dPXcsY1tkK18rMV09QyxjW2QrXysyXT1pLGQrPTMsciYmKGNbcCsrXT1PLGNbcCsrXT1FLGNbcCsrXT1zLGNbcCsrXT13LGNbcCsrXT1DLGNbcCsrXT1pKX1yZXR1cm4gY307QWQ9ZE99KTtmdW5jdGlvbiBHaSh0KXt0PXgodCx4LkVNUFRZX09CSkVDVCk7bGV0IGU9dC5sZW5ndGgsbj10LnRvcFJhZGl1cyxvPXQuYm90dG9tUmFkaXVzLHI9eCh0LnZlcnRleEZvcm1hdCxkdC5ERUZBVUxUKSxpPXgodC5zbGljZXMsMTI4KTtpZighaChlKSl0aHJvdyBuZXcgQigib3B0aW9ucy5sZW5ndGggbXVzdCBiZSBkZWZpbmVkLiIpO2lmKCFoKG4pKXRocm93IG5ldyBCKCJvcHRpb25zLnRvcFJhZGl1cyBtdXN0IGJlIGRlZmluZWQuIik7aWYoIWgobykpdGhyb3cgbmV3IEIoIm9wdGlvbnMuYm90dG9tUmFkaXVzIG11c3QgYmUgZGVmaW5lZC4iKTtpZihpPDMpdGhyb3cgbmV3IEIoIm9wdGlvbnMuc2xpY2VzIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIDMuIik7aWYoaCh0Lm9mZnNldEF0dHJpYnV0ZSkmJnQub2Zmc2V0QXR0cmlidXRlPT09ZmUuVE9QKXRocm93IG5ldyBCKCJHZW9tZXRyeU9mZnNldEF0dHJpYnV0ZS5UT1AgaXMgbm90IGEgc3VwcG9ydGVkIG9wdGlvbnMub2Zmc2V0QXR0cmlidXRlIGZvciB0aGlzIGdlb21ldHJ5LiIpO3RoaXMuX2xlbmd0aD1lLHRoaXMuX3RvcFJhZGl1cz1uLHRoaXMuX2JvdHRvbVJhZGl1cz1vLHRoaXMuX3ZlcnRleEZvcm1hdD1kdC5jbG9uZShyKSx0aGlzLl9zbGljZXM9aSx0aGlzLl9vZmZzZXRBdHRyaWJ1dGU9dC5vZmZzZXRBdHRyaWJ1dGUsdGhpcy5fd29ya2VyTmFtZT0iY3JlYXRlQ3lsaW5kZXJHZW9tZXRyeSJ9dmFyIGZfLGFMLGZMLHVMLGxMLG1PLFRhLHVfLEhmLGxfPVooKCk9Pnt2ZSgpO1VlKCk7RnQoKTtGZSgpO2FfKCk7SXQoKTtmdCgpO0h0KCk7WGUoKTtZZSgpO2FuKCk7TG8oKTskZSgpO1d0KCk7dG4oKTtSbygpO2ZfPW5ldyB0dCxhTD1uZXcgYSxmTD1uZXcgYSx1TD1uZXcgYSxsTD1uZXcgYTtHaS5wYWNrZWRMZW5ndGg9ZHQucGFja2VkTGVuZ3RoKzU7R2kucGFjaz1mdW5jdGlvbih0LGUsbil7aWYoIWgodCkpdGhyb3cgbmV3IEIoInZhbHVlIGlzIHJlcXVpcmVkIik7aWYoIWgoZSkpdGhyb3cgbmV3IEIoImFycmF5IGlzIHJlcXVpcmVkIik7cmV0dXJuIG49eChuLDApLGR0LnBhY2sodC5fdmVydGV4Rm9ybWF0LGUsbiksbis9ZHQucGFja2VkTGVuZ3RoLGVbbisrXT10Ll9sZW5ndGgsZVtuKytdPXQuX3RvcFJhZGl1cyxlW24rK109dC5fYm90dG9tUmFkaXVzLGVbbisrXT10Ll9zbGljZXMsZVtuXT14KHQuX29mZnNldEF0dHJpYnV0ZSwtMSksZX07bU89bmV3IGR0LFRhPXt2ZXJ0ZXhGb3JtYXQ6bU8sbGVuZ3RoOnZvaWQgMCx0b3BSYWRpdXM6dm9pZCAwLGJvdHRvbVJhZGl1czp2b2lkIDAsc2xpY2VzOnZvaWQgMCxvZmZzZXRBdHRyaWJ1dGU6dm9pZCAwfTtHaS51bnBhY2s9ZnVuY3Rpb24odCxlLG4pe2lmKCFoKHQpKXRocm93IG5ldyBCKCJhcnJheSBpcyByZXF1aXJlZCIpO2U9eChlLDApO2xldCBvPWR0LnVucGFjayh0LGUsbU8pO2UrPWR0LnBhY2tlZExlbmd0aDtsZXQgcj10W2UrK10saT10W2UrK10scz10W2UrK10sZj10W2UrK10sdT10W2VdO3JldHVybiBoKG4pPyhuLl92ZXJ0ZXhGb3JtYXQ9ZHQuY2xvbmUobyxuLl92ZXJ0ZXhGb3JtYXQpLG4uX2xlbmd0aD1yLG4uX3RvcFJhZGl1cz1pLG4uX2JvdHRvbVJhZGl1cz1zLG4uX3NsaWNlcz1mLG4uX29mZnNldEF0dHJpYnV0ZT11PT09LTE/dm9pZCAwOnUsbik6KFRhLmxlbmd0aD1yLFRhLnRvcFJhZGl1cz1pLFRhLmJvdHRvbVJhZGl1cz1zLFRhLnNsaWNlcz1mLFRhLm9mZnNldEF0dHJpYnV0ZT11PT09LTE/dm9pZCAwOnUsbmV3IEdpKFRhKSl9O0dpLmNyZWF0ZUdlb21ldHJ5PWZ1bmN0aW9uKHQpe2xldCBlPXQuX2xlbmd0aCxuPXQuX3RvcFJhZGl1cyxvPXQuX2JvdHRvbVJhZGl1cyxyPXQuX3ZlcnRleEZvcm1hdCxpPXQuX3NsaWNlcztpZihlPD0wfHxuPDB8fG88MHx8bj09PTAmJm89PT0wKXJldHVybjtsZXQgcz1pK2ksZj1pK3MsdT1zK3MsYz1BZC5jb21wdXRlUG9zaXRpb25zKGUsbixvLGksITApLGw9ci5zdD9uZXcgRmxvYXQzMkFycmF5KHUqMik6dm9pZCAwLHA9ci5ub3JtYWw/bmV3IEZsb2F0MzJBcnJheSh1KjMpOnZvaWQgMCxkPXIudGFuZ2VudD9uZXcgRmxvYXQzMkFycmF5KHUqMyk6dm9pZCAwLG09ci5iaXRhbmdlbnQ/bmV3IEZsb2F0MzJBcnJheSh1KjMpOnZvaWQgMCxfLGc9ci5ub3JtYWx8fHIudGFuZ2VudHx8ci5iaXRhbmdlbnQ7aWYoZyl7bGV0IEk9ci50YW5nZW50fHxyLmJpdGFuZ2VudCxEPTAsdj0wLEw9MCxVPU1hdGguYXRhbjIoby1uLGUpLEE9YUw7QS56PU1hdGguc2luKFUpO2xldCBTPU1hdGguY29zKFUpLFA9dUwsRj1mTDtmb3IoXz0wO188aTtfKyspe2xldCBqPV8vaSpNLlRXT19QSSxIPVMqTWF0aC5jb3Moaiksaz1TKk1hdGguc2luKGopO2cmJihBLng9SCxBLnk9ayxJJiYoUD1hLm5vcm1hbGl6ZShhLmNyb3NzKGEuVU5JVF9aLEEsUCksUCkpLHIubm9ybWFsJiYocFtEKytdPUEueCxwW0QrK109QS55LHBbRCsrXT1BLnoscFtEKytdPUEueCxwW0QrK109QS55LHBbRCsrXT1BLnopLHIudGFuZ2VudCYmKGRbdisrXT1QLngsZFt2KytdPVAueSxkW3YrK109UC56LGRbdisrXT1QLngsZFt2KytdPVAueSxkW3YrK109UC56KSxyLmJpdGFuZ2VudCYmKEY9YS5ub3JtYWxpemUoYS5jcm9zcyhBLFAsRiksRiksbVtMKytdPUYueCxtW0wrK109Ri55LG1bTCsrXT1GLnosbVtMKytdPUYueCxtW0wrK109Ri55LG1bTCsrXT1GLnopKX1mb3IoXz0wO188aTtfKyspci5ub3JtYWwmJihwW0QrK109MCxwW0QrK109MCxwW0QrK109LTEpLHIudGFuZ2VudCYmKGRbdisrXT0xLGRbdisrXT0wLGRbdisrXT0wKSxyLmJpdGFuZ2VudCYmKG1bTCsrXT0wLG1bTCsrXT0tMSxtW0wrK109MCk7Zm9yKF89MDtfPGk7XysrKXIubm9ybWFsJiYocFtEKytdPTAscFtEKytdPTAscFtEKytdPTEpLHIudGFuZ2VudCYmKGRbdisrXT0xLGRbdisrXT0wLGRbdisrXT0wKSxyLmJpdGFuZ2VudCYmKG1bTCsrXT0wLG1bTCsrXT0xLG1bTCsrXT0wKX1sZXQgYj0xMippLTEyLFQ9RHQuY3JlYXRlVHlwZWRBcnJheSh1LGIpLE89MCxFPTA7Zm9yKF89MDtfPGktMTtfKyspVFtPKytdPUUsVFtPKytdPUUrMixUW08rK109RSszLFRbTysrXT1FLFRbTysrXT1FKzMsVFtPKytdPUUrMSxFKz0yO2ZvcihUW08rK109cy0yLFRbTysrXT0wLFRbTysrXT0xLFRbTysrXT1zLTIsVFtPKytdPTEsVFtPKytdPXMtMSxfPTE7XzxpLTE7XysrKVRbTysrXT1zK18rMSxUW08rK109cytfLFRbTysrXT1zO2ZvcihfPTE7XzxpLTE7XysrKVRbTysrXT1mLFRbTysrXT1mK18sVFtPKytdPWYrXysxO2xldCB3PTA7aWYoci5zdCl7bGV0IEk9TWF0aC5tYXgobixvKTtmb3IoXz0wO188dTtfKyspe2xldCBEPWEuZnJvbUFycmF5KGMsXyozLGxMKTtsW3crK109KEQueCtJKS8oMipJKSxsW3crK109KEQueStJKS8oMipJKX19bGV0IEM9bmV3IGllO3IucG9zaXRpb24mJihDLnBvc2l0aW9uPW5ldyBpdCh7Y29tcG9uZW50RGF0YXR5cGU6bnQuRE9VQkxFLGNvbXBvbmVudHNQZXJBdHRyaWJ1dGU6Myx2YWx1ZXM6Y30pKSxyLm5vcm1hbCYmKEMubm9ybWFsPW5ldyBpdCh7Y29tcG9uZW50RGF0YXR5cGU6bnQuRkxPQVQsY29tcG9uZW50c1BlckF0dHJpYnV0ZTozLHZhbHVlczpwfSkpLHIudGFuZ2VudCYmKEMudGFuZ2VudD1uZXcgaXQoe2NvbXBvbmVudERhdGF0eXBlOm50LkZMT0FULGNvbXBvbmVudHNQZXJBdHRyaWJ1dGU6Myx2YWx1ZXM6ZH0pKSxyLmJpdGFuZ2VudCYmKEMuYml0YW5nZW50PW5ldyBpdCh7Y29tcG9uZW50RGF0YXR5cGU6bnQuRkxPQVQsY29tcG9uZW50c1BlckF0dHJpYnV0ZTozLHZhbHVlczptfSkpLHIuc3QmJihDLnN0PW5ldyBpdCh7Y29tcG9uZW50RGF0YXR5cGU6bnQuRkxPQVQsY29tcG9uZW50c1BlckF0dHJpYnV0ZToyLHZhbHVlczpsfSkpLGZfLng9ZSouNSxmXy55PU1hdGgubWF4KG8sbik7bGV0IE49bmV3IEF0KGEuWkVSTyx0dC5tYWduaXR1ZGUoZl8pKTtpZihoKHQuX29mZnNldEF0dHJpYnV0ZSkpe2U9Yy5sZW5ndGg7bGV0IEk9dC5fb2Zmc2V0QXR0cmlidXRlPT09ZmUuTk9ORT8wOjEsRD1uZXcgVWludDhBcnJheShlLzMpLmZpbGwoSSk7Qy5hcHBseU9mZnNldD1uZXcgaXQoe2NvbXBvbmVudERhdGF0eXBlOm50LlVOU0lHTkVEX0JZVEUsY29tcG9uZW50c1BlckF0dHJpYnV0ZToxLHZhbHVlczpEfSl9cmV0dXJuIG5ldyBVdCh7YXR0cmlidXRlczpDLGluZGljZXM6VCxwcmltaXRpdmVUeXBlOkJ0LlRSSUFOR0xFUyxib3VuZGluZ1NwaGVyZTpOLG9mZnNldEF0dHJpYnV0ZTp0Ll9vZmZzZXRBdHRyaWJ1dGV9KX07R2kuZ2V0VW5pdEN5bGluZGVyPWZ1bmN0aW9uKCl7cmV0dXJuIGgodV8pfHwodV89R2kuY3JlYXRlR2VvbWV0cnkobmV3IEdpKHt0b3BSYWRpdXM6MSxib3R0b21SYWRpdXM6MSxsZW5ndGg6MSx2ZXJ0ZXhGb3JtYXQ6ZHQuUE9TSVRJT05fT05MWX0pKSksdV99O0hmPUdpfSk7dmFyIHBfPXt9O2RlKHBfLHtkZWZhdWx0OigpPT5kTH0pO2Z1bmN0aW9uIHBMKHQsZSl7cmV0dXJuIGgoZSkmJih0PUhmLnVucGFjayh0LGUpKSxIZi5jcmVhdGVHZW9tZXRyeSh0KX12YXIgZEwsZF89WigoKT0+e2xfKCk7ZnQoKTtkTD1wTH0pO2Z1bmN0aW9uIHdhKHQpe3Q9eCh0LHguRU1QVFlfT0JKRUNUKTtsZXQgZT10Lmxlbmd0aCxuPXQudG9wUmFkaXVzLG89dC5ib3R0b21SYWRpdXMscj14KHQuc2xpY2VzLDEyOCksaT1NYXRoLm1heCh4KHQubnVtYmVyT2ZWZXJ0aWNhbExpbmVzLDE2KSwwKTtpZih5LnR5cGVPZi5udW1iZXIoIm9wdGlvbnMucG9zaXRpb25zIixlKSx5LnR5cGVPZi5udW1iZXIoIm9wdGlvbnMudG9wUmFkaXVzIixuKSx5LnR5cGVPZi5udW1iZXIoIm9wdGlvbnMuYm90dG9tUmFkaXVzIixvKSx5LnR5cGVPZi5udW1iZXIuZ3JlYXRlclRoYW5PckVxdWFscygib3B0aW9ucy5zbGljZXMiLHIsMyksaCh0Lm9mZnNldEF0dHJpYnV0ZSkmJnQub2Zmc2V0QXR0cmlidXRlPT09ZmUuVE9QKXRocm93IG5ldyBCKCJHZW9tZXRyeU9mZnNldEF0dHJpYnV0ZS5UT1AgaXMgbm90IGEgc3VwcG9ydGVkIG9wdGlvbnMub2Zmc2V0QXR0cmlidXRlIGZvciB0aGlzIGdlb21ldHJ5LiIpO3RoaXMuX2xlbmd0aD1lLHRoaXMuX3RvcFJhZGl1cz1uLHRoaXMuX2JvdHRvbVJhZGl1cz1vLHRoaXMuX3NsaWNlcz1yLHRoaXMuX251bWJlck9mVmVydGljYWxMaW5lcz1pLHRoaXMuX29mZnNldEF0dHJpYnV0ZT10Lm9mZnNldEF0dHJpYnV0ZSx0aGlzLl93b3JrZXJOYW1lPSJjcmVhdGVDeWxpbmRlck91dGxpbmVHZW9tZXRyeSJ9dmFyIG1fLHljLGhfLGhPPVooKCk9Pnt2ZSgpO1VlKCk7RnQoKTtYdCgpO0ZlKCk7YV8oKTtJdCgpO2Z0KCk7SHQoKTtYZSgpO1llKCk7YW4oKTtMbygpOyRlKCk7dG4oKTttXz1uZXcgdHQ7d2EucGFja2VkTGVuZ3RoPTY7d2EucGFjaz1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHkudHlwZU9mLm9iamVjdCgidmFsdWUiLHQpLHkuZGVmaW5lZCgiYXJyYXkiLGUpLG49eChuLDApLGVbbisrXT10Ll9sZW5ndGgsZVtuKytdPXQuX3RvcFJhZGl1cyxlW24rK109dC5fYm90dG9tUmFkaXVzLGVbbisrXT10Ll9zbGljZXMsZVtuKytdPXQuX251bWJlck9mVmVydGljYWxMaW5lcyxlW25dPXgodC5fb2Zmc2V0QXR0cmlidXRlLC0xKSxlfTt5Yz17bGVuZ3RoOnZvaWQgMCx0b3BSYWRpdXM6dm9pZCAwLGJvdHRvbVJhZGl1czp2b2lkIDAsc2xpY2VzOnZvaWQgMCxudW1iZXJPZlZlcnRpY2FsTGluZXM6dm9pZCAwLG9mZnNldEF0dHJpYnV0ZTp2b2lkIDB9O3dhLnVucGFjaz1mdW5jdGlvbih0LGUsbil7eS5kZWZpbmVkKCJhcnJheSIsdCksZT14KGUsMCk7bGV0IG89dFtlKytdLHI9dFtlKytdLGk9dFtlKytdLHM9dFtlKytdLGY9dFtlKytdLHU9dFtlXTtyZXR1cm4gaChuKT8obi5fbGVuZ3RoPW8sbi5fdG9wUmFkaXVzPXIsbi5fYm90dG9tUmFkaXVzPWksbi5fc2xpY2VzPXMsbi5fbnVtYmVyT2ZWZXJ0aWNhbExpbmVzPWYsbi5fb2Zmc2V0QXR0cmlidXRlPXU9PT0tMT92b2lkIDA6dSxuKTooeWMubGVuZ3RoPW8seWMudG9wUmFkaXVzPXIseWMuYm90dG9tUmFkaXVzPWkseWMuc2xpY2VzPXMseWMubnVtYmVyT2ZWZXJ0aWNhbExpbmVzPWYseWMub2Zmc2V0QXR0cmlidXRlPXU9PT0tMT92b2lkIDA6dSxuZXcgd2EoeWMpKX07d2EuY3JlYXRlR2VvbWV0cnk9ZnVuY3Rpb24odCl7bGV0IGU9dC5fbGVuZ3RoLG49dC5fdG9wUmFkaXVzLG89dC5fYm90dG9tUmFkaXVzLHI9dC5fc2xpY2VzLGk9dC5fbnVtYmVyT2ZWZXJ0aWNhbExpbmVzO2lmKGU8PTB8fG48MHx8bzwwfHxuPT09MCYmbz09PTApcmV0dXJuO2xldCBzPXIqMixmPUFkLmNvbXB1dGVQb3NpdGlvbnMoZSxuLG8sciwhMSksdT1yKjIsYztpZihpPjApe2xldCBnPU1hdGgubWluKGkscik7Yz1NYXRoLnJvdW5kKHIvZyksdSs9Z31sZXQgbD1EdC5jcmVhdGVUeXBlZEFycmF5KHMsdSoyKSxwPTAsZDtmb3IoZD0wO2Q8ci0xO2QrKylsW3ArK109ZCxsW3ArK109ZCsxLGxbcCsrXT1kK3IsbFtwKytdPWQrMStyO2lmKGxbcCsrXT1yLTEsbFtwKytdPTAsbFtwKytdPXIrci0xLGxbcCsrXT1yLGk+MClmb3IoZD0wO2Q8cjtkKz1jKWxbcCsrXT1kLGxbcCsrXT1kK3I7bGV0IG09bmV3IGllO20ucG9zaXRpb249bmV3IGl0KHtjb21wb25lbnREYXRhdHlwZTpudC5ET1VCTEUsY29tcG9uZW50c1BlckF0dHJpYnV0ZTozLHZhbHVlczpmfSksbV8ueD1lKi41LG1fLnk9TWF0aC5tYXgobyxuKTtsZXQgXz1uZXcgQXQoYS5aRVJPLHR0Lm1hZ25pdHVkZShtXykpO2lmKGgodC5fb2Zmc2V0QXR0cmlidXRlKSl7ZT1mLmxlbmd0aDtsZXQgZz10Ll9vZmZzZXRBdHRyaWJ1dGU9PT1mZS5OT05FPzA6MSxiPW5ldyBVaW50OEFycmF5KGUvMykuZmlsbChnKTttLmFwcGx5T2Zmc2V0PW5ldyBpdCh7Y29tcG9uZW50RGF0YXR5cGU6bnQuVU5TSUdORURfQllURSxjb21wb25lbnRzUGVyQXR0cmlidXRlOjEsdmFsdWVzOmJ9KX1yZXR1cm4gbmV3IFV0KHthdHRyaWJ1dGVzOm0saW5kaWNlczpsLHByaW1pdGl2ZVR5cGU6QnQuTElORVMsYm91bmRpbmdTcGhlcmU6XyxvZmZzZXRBdHRyaWJ1dGU6dC5fb2Zmc2V0QXR0cmlidXRlfSl9O2hfPXdhfSk7dmFyIF9fPXt9O2RlKF9fLHtkZWZhdWx0OigpPT5oTH0pO2Z1bmN0aW9uIG1MKHQsZSl7cmV0dXJuIGgoZSkmJih0PWhfLnVucGFjayh0LGUpKSxoXy5jcmVhdGVHZW9tZXRyeSh0KX12YXIgaEwseV89WigoKT0+e2hPKCk7ZnQoKTtoTD1tTH0pO3ZhciBnXz17fTtkZShnXyx7ZGVmYXVsdDooKT0+eUx9KTtmdW5jdGlvbiBfTCh0LGUpe3JldHVybiBoKGUpJiYodD1Hci51bnBhY2sodCxlKSksdC5fY2VudGVyPWEuY2xvbmUodC5fY2VudGVyKSx0Ll9lbGxpcHNvaWQ9JC5jbG9uZSh0Ll9lbGxpcHNvaWQpLEdyLmNyZWF0ZUdlb21ldHJ5KHQpfXZhciB5TCxBXz1aKCgpPT57RnQoKTtmdCgpO0EwKCk7WnQoKTt5TD1fTH0pO3ZhciBiXz17fTtkZShiXyx7ZGVmYXVsdDooKT0+QUx9KTtmdW5jdGlvbiBnTCh0LGUpe3JldHVybiBoKGUpJiYodD16ci51bnBhY2sodCxlKSksdC5fY2VudGVyPWEuY2xvbmUodC5fY2VudGVyKSx0Ll9lbGxpcHNvaWQ9JC5jbG9uZSh0Ll9lbGxpcHNvaWQpLHpyLmNyZWF0ZUdlb21ldHJ5KHQpfXZhciBBTCxUXz1aKCgpPT57RnQoKTtmdCgpO08wKCk7WnQoKTtBTD1nTH0pO2Z1bmN0aW9uIHppKHQpe3Q9eCh0LHguRU1QVFlfT0JKRUNUKTtsZXQgZT14KHQucmFkaWksUkwpLG49eCh0LmlubmVyUmFkaWksZSksbz14KHQubWluaW11bUNsb2NrLDApLHI9eCh0Lm1heGltdW1DbG9jayxNLlRXT19QSSksaT14KHQubWluaW11bUNvbmUsMCkscz14KHQubWF4aW11bUNvbmUsTS5QSSksZj1NYXRoLnJvdW5kKHgodC5zdGFja1BhcnRpdGlvbnMsNjQpKSx1PU1hdGgucm91bmQoeCh0LnNsaWNlUGFydGl0aW9ucyw2NCkpLGM9eCh0LnZlcnRleEZvcm1hdCxkdC5ERUZBVUxUKTtpZih1PDMpdGhyb3cgbmV3IEIoIm9wdGlvbnMuc2xpY2VQYXJ0aXRpb25zIGNhbm5vdCBiZSBsZXNzIHRoYW4gdGhyZWUuIik7aWYoZjwzKXRocm93IG5ldyBCKCJvcHRpb25zLnN0YWNrUGFydGl0aW9ucyBjYW5ub3QgYmUgbGVzcyB0aGFuIHRocmVlLiIpO3RoaXMuX3JhZGlpPWEuY2xvbmUoZSksdGhpcy5faW5uZXJSYWRpaT1hLmNsb25lKG4pLHRoaXMuX21pbmltdW1DbG9jaz1vLHRoaXMuX21heGltdW1DbG9jaz1yLHRoaXMuX21pbmltdW1Db25lPWksdGhpcy5fbWF4aW11bUNvbmU9cyx0aGlzLl9zdGFja1BhcnRpdGlvbnM9Zix0aGlzLl9zbGljZVBhcnRpdGlvbnM9dSx0aGlzLl92ZXJ0ZXhGb3JtYXQ9ZHQuY2xvbmUoYyksdGhpcy5fb2Zmc2V0QXR0cmlidXRlPXQub2Zmc2V0QXR0cmlidXRlLHRoaXMuX3dvcmtlck5hbWU9ImNyZWF0ZUVsbGlwc29pZEdlb21ldHJ5In12YXIgYkwsVEwsd0wsT0wsRUwsUkwsX08seU8sZ08sQU8sYk8sZ3Msd18sc3IsYmQ9WigoKT0+e3ZlKCk7VWUoKTtGdCgpO0ZlKCk7SXQoKTtmdCgpO0h0KCk7WnQoKTtYZSgpO1llKCk7YW4oKTtMbygpOyRlKCk7V3QoKTt0bigpO1JvKCk7Ykw9bmV3IGEsVEw9bmV3IGEsd0w9bmV3IGEsT0w9bmV3IGEsRUw9bmV3IGEsUkw9bmV3IGEoMSwxLDEpLF9PPU1hdGguY29zLHlPPU1hdGguc2luO3ppLnBhY2tlZExlbmd0aD0yKmEucGFja2VkTGVuZ3RoK2R0LnBhY2tlZExlbmd0aCs3O3ppLnBhY2s9ZnVuY3Rpb24odCxlLG4pe2lmKCFoKHQpKXRocm93IG5ldyBCKCJ2YWx1ZSBpcyByZXF1aXJlZCIpO2lmKCFoKGUpKXRocm93IG5ldyBCKCJhcnJheSBpcyByZXF1aXJlZCIpO3JldHVybiBuPXgobiwwKSxhLnBhY2sodC5fcmFkaWksZSxuKSxuKz1hLnBhY2tlZExlbmd0aCxhLnBhY2sodC5faW5uZXJSYWRpaSxlLG4pLG4rPWEucGFja2VkTGVuZ3RoLGR0LnBhY2sodC5fdmVydGV4Rm9ybWF0LGUsbiksbis9ZHQucGFja2VkTGVuZ3RoLGVbbisrXT10Ll9taW5pbXVtQ2xvY2ssZVtuKytdPXQuX21heGltdW1DbG9jayxlW24rK109dC5fbWluaW11bUNvbmUsZVtuKytdPXQuX21heGltdW1Db25lLGVbbisrXT10Ll9zdGFja1BhcnRpdGlvbnMsZVtuKytdPXQuX3NsaWNlUGFydGl0aW9ucyxlW25dPXgodC5fb2Zmc2V0QXR0cmlidXRlLC0xKSxlfTtnTz1uZXcgYSxBTz1uZXcgYSxiTz1uZXcgZHQsZ3M9e3JhZGlpOmdPLGlubmVyUmFkaWk6QU8sdmVydGV4Rm9ybWF0OmJPLG1pbmltdW1DbG9jazp2b2lkIDAsbWF4aW11bUNsb2NrOnZvaWQgMCxtaW5pbXVtQ29uZTp2b2lkIDAsbWF4aW11bUNvbmU6dm9pZCAwLHN0YWNrUGFydGl0aW9uczp2b2lkIDAsc2xpY2VQYXJ0aXRpb25zOnZvaWQgMCxvZmZzZXRBdHRyaWJ1dGU6dm9pZCAwfTt6aS51bnBhY2s9ZnVuY3Rpb24odCxlLG4pe2lmKCFoKHQpKXRocm93IG5ldyBCKCJhcnJheSBpcyByZXF1aXJlZCIpO2U9eChlLDApO2xldCBvPWEudW5wYWNrKHQsZSxnTyk7ZSs9YS5wYWNrZWRMZW5ndGg7bGV0IHI9YS51bnBhY2sodCxlLEFPKTtlKz1hLnBhY2tlZExlbmd0aDtsZXQgaT1kdC51bnBhY2sodCxlLGJPKTtlKz1kdC5wYWNrZWRMZW5ndGg7bGV0IHM9dFtlKytdLGY9dFtlKytdLHU9dFtlKytdLGM9dFtlKytdLGw9dFtlKytdLHA9dFtlKytdLGQ9dFtlXTtyZXR1cm4gaChuKT8obi5fcmFkaWk9YS5jbG9uZShvLG4uX3JhZGlpKSxuLl9pbm5lclJhZGlpPWEuY2xvbmUocixuLl9pbm5lclJhZGlpKSxuLl92ZXJ0ZXhGb3JtYXQ9ZHQuY2xvbmUoaSxuLl92ZXJ0ZXhGb3JtYXQpLG4uX21pbmltdW1DbG9jaz1zLG4uX21heGltdW1DbG9jaz1mLG4uX21pbmltdW1Db25lPXUsbi5fbWF4aW11bUNvbmU9YyxuLl9zdGFja1BhcnRpdGlvbnM9bCxuLl9zbGljZVBhcnRpdGlvbnM9cCxuLl9vZmZzZXRBdHRyaWJ1dGU9ZD09PS0xP3ZvaWQgMDpkLG4pOihncy5taW5pbXVtQ2xvY2s9cyxncy5tYXhpbXVtQ2xvY2s9Zixncy5taW5pbXVtQ29uZT11LGdzLm1heGltdW1Db25lPWMsZ3Muc3RhY2tQYXJ0aXRpb25zPWwsZ3Muc2xpY2VQYXJ0aXRpb25zPXAsZ3Mub2Zmc2V0QXR0cmlidXRlPWQ9PT0tMT92b2lkIDA6ZCxuZXcgemkoZ3MpKX07emkuY3JlYXRlR2VvbWV0cnk9ZnVuY3Rpb24odCl7bGV0IGU9dC5fcmFkaWk7aWYoZS54PD0wfHxlLnk8PTB8fGUuejw9MClyZXR1cm47bGV0IG49dC5faW5uZXJSYWRpaTtpZihuLng8PTB8fG4ueTw9MHx8bi56PD0wKXJldHVybjtsZXQgbz10Ll9taW5pbXVtQ2xvY2sscj10Ll9tYXhpbXVtQ2xvY2ssaT10Ll9taW5pbXVtQ29uZSxzPXQuX21heGltdW1Db25lLGY9dC5fdmVydGV4Rm9ybWF0LHU9dC5fc2xpY2VQYXJ0aXRpb25zKzEsYz10Ll9zdGFja1BhcnRpdGlvbnMrMTt1PU1hdGgucm91bmQodSpNYXRoLmFicyhyLW8pL00uVFdPX1BJKSxjPU1hdGgucm91bmQoYypNYXRoLmFicyhzLWkpL00uUEkpLHU8MiYmKHU9MiksYzwyJiYoYz0yKTtsZXQgbCxwLGQ9MCxtPVtpXSxfPVtvXTtmb3IobD0wO2w8YztsKyspbS5wdXNoKGkrbCoocy1pKS8oYy0xKSk7Zm9yKG0ucHVzaChzKSxwPTA7cDx1O3ArKylfLnB1c2gobytwKihyLW8pLyh1LTEpKTtfLnB1c2gocik7bGV0IGc9bS5sZW5ndGgsYj1fLmxlbmd0aCxUPTAsTz0xLEU9bi54IT09ZS54fHxuLnkhPT1lLnl8fG4ueiE9PWUueix3PSExLEM9ITEsTj0hMTtFJiYoTz0yLGk+MCYmKHc9ITAsVCs9dS0xKSxzPE1hdGguUEkmJihDPSEwLFQrPXUtMSksKHItbyklTS5UV09fUEk/KE49ITAsVCs9KGMtMSkqMisxKTpUKz0xKTtsZXQgST1iKmcqTyxEPW5ldyBGbG9hdDY0QXJyYXkoSSozKSx2PW5ldyBBcnJheShJKS5maWxsKCExKSxMPW5ldyBBcnJheShJKS5maWxsKCExKSxVPXUqYypPLEE9NiooVStUKzEtKHUrYykqTyksUz1EdC5jcmVhdGVUeXBlZEFycmF5KFUsQSksUD1mLm5vcm1hbD9uZXcgRmxvYXQzMkFycmF5KEkqMyk6dm9pZCAwLEY9Zi50YW5nZW50P25ldyBGbG9hdDMyQXJyYXkoSSozKTp2b2lkIDAsaj1mLmJpdGFuZ2VudD9uZXcgRmxvYXQzMkFycmF5KEkqMyk6dm9pZCAwLEg9Zi5zdD9uZXcgRmxvYXQzMkFycmF5KEkqMik6dm9pZCAwLGs9bmV3IEFycmF5KGcpLEs9bmV3IEFycmF5KGcpO2ZvcihsPTA7bDxnO2wrKylrW2xdPXlPKG1bbF0pLEtbbF09X08obVtsXSk7bGV0IFg9bmV3IEFycmF5KGIpLFI9bmV3IEFycmF5KGIpO2ZvcihwPTA7cDxiO3ArKylSW3BdPV9PKF9bcF0pLFhbcF09eU8oX1twXSk7Zm9yKGw9MDtsPGc7bCsrKWZvcihwPTA7cDxiO3ArKylEW2QrK109ZS54KmtbbF0qUltwXSxEW2QrK109ZS55KmtbbF0qWFtwXSxEW2QrK109ZS56KktbbF07bGV0IG90PUkvMjtpZihFKWZvcihsPTA7bDxnO2wrKylmb3IocD0wO3A8YjtwKyspRFtkKytdPW4ueCprW2xdKlJbcF0sRFtkKytdPW4ueSprW2xdKlhbcF0sRFtkKytdPW4ueipLW2xdLHZbb3RdPSEwLGw+MCYmbCE9PWctMSYmcCE9PTAmJnAhPT1iLTEmJihMW290XT0hMCksb3QrKztkPTA7bGV0IGF0LHB0O2ZvcihsPTE7bDxnLTI7bCsrKWZvcihhdD1sKmIscHQ9KGwrMSkqYixwPTE7cDxiLTI7cCsrKVNbZCsrXT1wdCtwLFNbZCsrXT1wdCtwKzEsU1tkKytdPWF0K3ArMSxTW2QrK109cHQrcCxTW2QrK109YXQrcCsxLFNbZCsrXT1hdCtwO2lmKEUpe2xldCBwZT1nKmI7Zm9yKGw9MTtsPGctMjtsKyspZm9yKGF0PXBlK2wqYixwdD1wZSsobCsxKSpiLHA9MTtwPGItMjtwKyspU1tkKytdPXB0K3AsU1tkKytdPWF0K3AsU1tkKytdPWF0K3ArMSxTW2QrK109cHQrcCxTW2QrK109YXQrcCsxLFNbZCsrXT1wdCtwKzF9bGV0IHl0LHJ0O2lmKEUpe2lmKHcpZm9yKHJ0PWcqYixsPTE7bDxiLTI7bCsrKVNbZCsrXT1sLFNbZCsrXT1sKzEsU1tkKytdPXJ0K2wrMSxTW2QrK109bCxTW2QrK109cnQrbCsxLFNbZCsrXT1ydCtsO2lmKEMpZm9yKHl0PWcqYi1iLHJ0PWcqYipPLWIsbD0xO2w8Yi0yO2wrKylTW2QrK109eXQrbCsxLFNbZCsrXT15dCtsLFNbZCsrXT1ydCtsLFNbZCsrXT15dCtsKzEsU1tkKytdPXJ0K2wsU1tkKytdPXJ0K2wrMX1pZihOKXtmb3IobD0xO2w8Zy0yO2wrKylydD1iKmcrYipsLHl0PWIqbCxTW2QrK109cnQsU1tkKytdPXl0K2IsU1tkKytdPXl0LFNbZCsrXT1ydCxTW2QrK109cnQrYixTW2QrK109eXQrYjtmb3IobD0xO2w8Zy0yO2wrKylydD1iKmcrYioobCsxKS0xLHl0PWIqKGwrMSktMSxTW2QrK109eXQrYixTW2QrK109cnQsU1tkKytdPXl0LFNbZCsrXT15dCtiLFNbZCsrXT1ydCtiLFNbZCsrXT1ydH1sZXQgUHQ9bmV3IGllO2YucG9zaXRpb24mJihQdC5wb3NpdGlvbj1uZXcgaXQoe2NvbXBvbmVudERhdGF0eXBlOm50LkRPVUJMRSxjb21wb25lbnRzUGVyQXR0cmlidXRlOjMsdmFsdWVzOkR9KSk7bGV0IGd0PTAsQ3Q9MCxtdD0wLHV0PTAsdnQ9SS8yLHp0LG1lPSQuZnJvbUNhcnRlc2lhbjMoZSksY2U9JC5mcm9tQ2FydGVzaWFuMyhuKTtpZihmLnN0fHxmLm5vcm1hbHx8Zi50YW5nZW50fHxmLmJpdGFuZ2VudCl7Zm9yKGw9MDtsPEk7bCsrKXt6dD12W2xdP2NlOm1lO2xldCBwZT1hLmZyb21BcnJheShELGwqMyxiTCksdWU9enQuZ2VvZGV0aWNTdXJmYWNlTm9ybWFsKHBlLFRMKTtpZihMW2xdJiZhLm5lZ2F0ZSh1ZSx1ZSksZi5zdCl7bGV0IFF0PXR0Lm5lZ2F0ZSh1ZSxFTCk7SFtndCsrXT1NYXRoLmF0YW4yKFF0LnksUXQueCkvTS5UV09fUEkrLjUsSFtndCsrXT1NYXRoLmFzaW4odWUueikvTWF0aC5QSSsuNX1pZihmLm5vcm1hbCYmKFBbQ3QrK109dWUueCxQW0N0KytdPXVlLnksUFtDdCsrXT11ZS56KSxmLnRhbmdlbnR8fGYuYml0YW5nZW50KXtsZXQgUXQ9d0wsSnQ9MCxOZTtpZih2W2xdJiYoSnQ9dnQpLCF3JiZsPj1KdCYmbDxKdCtiKjI/TmU9YS5VTklUX1g6TmU9YS5VTklUX1osYS5jcm9zcyhOZSx1ZSxRdCksYS5ub3JtYWxpemUoUXQsUXQpLGYudGFuZ2VudCYmKEZbbXQrK109UXQueCxGW210KytdPVF0LnksRlttdCsrXT1RdC56KSxmLmJpdGFuZ2VudCl7bGV0IGdlPWEuY3Jvc3ModWUsUXQsT0wpO2Eubm9ybWFsaXplKGdlLGdlKSxqW3V0KytdPWdlLngsalt1dCsrXT1nZS55LGpbdXQrK109Z2Uuen19fWYuc3QmJihQdC5zdD1uZXcgaXQoe2NvbXBvbmVudERhdGF0eXBlOm50LkZMT0FULGNvbXBvbmVudHNQZXJBdHRyaWJ1dGU6Mix2YWx1ZXM6SH0pKSxmLm5vcm1hbCYmKFB0Lm5vcm1hbD1uZXcgaXQoe2NvbXBvbmVudERhdGF0eXBlOm50LkZMT0FULGNvbXBvbmVudHNQZXJBdHRyaWJ1dGU6Myx2YWx1ZXM6UH0pKSxmLnRhbmdlbnQmJihQdC50YW5nZW50PW5ldyBpdCh7Y29tcG9uZW50RGF0YXR5cGU6bnQuRkxPQVQsY29tcG9uZW50c1BlckF0dHJpYnV0ZTozLHZhbHVlczpGfSkpLGYuYml0YW5nZW50JiYoUHQuYml0YW5nZW50PW5ldyBpdCh7Y29tcG9uZW50RGF0YXR5cGU6bnQuRkxPQVQsY29tcG9uZW50c1BlckF0dHJpYnV0ZTozLHZhbHVlczpqfSkpfWlmKGgodC5fb2Zmc2V0QXR0cmlidXRlKSl7bGV0IHBlPUQubGVuZ3RoLHVlPXQuX29mZnNldEF0dHJpYnV0ZT09PWZlLk5PTkU/MDoxLFF0PW5ldyBVaW50OEFycmF5KHBlLzMpLmZpbGwodWUpO1B0LmFwcGx5T2Zmc2V0PW5ldyBpdCh7Y29tcG9uZW50RGF0YXR5cGU6bnQuVU5TSUdORURfQllURSxjb21wb25lbnRzUGVyQXR0cmlidXRlOjEsdmFsdWVzOlF0fSl9cmV0dXJuIG5ldyBVdCh7YXR0cmlidXRlczpQdCxpbmRpY2VzOlMscHJpbWl0aXZlVHlwZTpCdC5UUklBTkdMRVMsYm91bmRpbmdTcGhlcmU6QXQuZnJvbUVsbGlwc29pZChtZSksb2Zmc2V0QXR0cmlidXRlOnQuX29mZnNldEF0dHJpYnV0ZX0pfTt6aS5nZXRVbml0RWxsaXBzb2lkPWZ1bmN0aW9uKCl7cmV0dXJuIGgod18pfHwod189emkuY3JlYXRlR2VvbWV0cnkobmV3IHppKHtyYWRpaTpuZXcgYSgxLDEsMSksdmVydGV4Rm9ybWF0OmR0LlBPU0lUSU9OX09OTFl9KSkpLHdffTtzcj16aX0pO3ZhciBPXz17fTtkZShPXyx7ZGVmYXVsdDooKT0+Q0x9KTtmdW5jdGlvbiBTTCh0LGUpe3JldHVybiBoKGUpJiYodD1zci51bnBhY2sodCxlKSksc3IuY3JlYXRlR2VvbWV0cnkodCl9dmFyIENMLEVfPVooKCk9PntmdCgpO2JkKCk7Q0w9U0x9KTtmdW5jdGlvbiBPYSh0KXt0PXgodCx4LkVNUFRZX09CSkVDVCk7bGV0IGU9eCh0LnJhZGlpLHhMKSxuPXgodC5pbm5lclJhZGlpLGUpLG89eCh0Lm1pbmltdW1DbG9jaywwKSxyPXgodC5tYXhpbXVtQ2xvY2ssTS5UV09fUEkpLGk9eCh0Lm1pbmltdW1Db25lLDApLHM9eCh0Lm1heGltdW1Db25lLE0uUEkpLGY9TWF0aC5yb3VuZCh4KHQuc3RhY2tQYXJ0aXRpb25zLDEwKSksdT1NYXRoLnJvdW5kKHgodC5zbGljZVBhcnRpdGlvbnMsOCkpLGM9TWF0aC5yb3VuZCh4KHQuc3ViZGl2aXNpb25zLDEyOCkpO2lmKGY8MSl0aHJvdyBuZXcgQigib3B0aW9ucy5zdGFja1BhcnRpdGlvbnMgY2Fubm90IGJlIGxlc3MgdGhhbiAxIik7aWYodTwwKXRocm93IG5ldyBCKCJvcHRpb25zLnNsaWNlUGFydGl0aW9ucyBjYW5ub3QgYmUgbGVzcyB0aGFuIDAiKTtpZihjPDApdGhyb3cgbmV3IEIoIm9wdGlvbnMuc3ViZGl2aXNpb25zIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHplcm8uIik7aWYoaCh0Lm9mZnNldEF0dHJpYnV0ZSkmJnQub2Zmc2V0QXR0cmlidXRlPT09ZmUuVE9QKXRocm93IG5ldyBCKCJHZW9tZXRyeU9mZnNldEF0dHJpYnV0ZS5UT1AgaXMgbm90IGEgc3VwcG9ydGVkIG9wdGlvbnMub2Zmc2V0QXR0cmlidXRlIGZvciB0aGlzIGdlb21ldHJ5LiIpO3RoaXMuX3JhZGlpPWEuY2xvbmUoZSksdGhpcy5faW5uZXJSYWRpaT1hLmNsb25lKG4pLHRoaXMuX21pbmltdW1DbG9jaz1vLHRoaXMuX21heGltdW1DbG9jaz1yLHRoaXMuX21pbmltdW1Db25lPWksdGhpcy5fbWF4aW11bUNvbmU9cyx0aGlzLl9zdGFja1BhcnRpdGlvbnM9Zix0aGlzLl9zbGljZVBhcnRpdGlvbnM9dSx0aGlzLl9zdWJkaXZpc2lvbnM9Yyx0aGlzLl9vZmZzZXRBdHRyaWJ1dGU9dC5vZmZzZXRBdHRyaWJ1dGUsdGhpcy5fd29ya2VyTmFtZT0iY3JlYXRlRWxsaXBzb2lkT3V0bGluZUdlb21ldHJ5In12YXIgeEwsVGQsd2QsVE8sd08samksV3IsUl89WigoKT0+e3ZlKCk7RnQoKTtGZSgpO0l0KCk7ZnQoKTtIdCgpO1p0KCk7WGUoKTtZZSgpO2FuKCk7TG8oKTskZSgpO1d0KCk7dG4oKTt4TD1uZXcgYSgxLDEsMSksVGQ9TWF0aC5jb3Msd2Q9TWF0aC5zaW47T2EucGFja2VkTGVuZ3RoPTIqYS5wYWNrZWRMZW5ndGgrODtPYS5wYWNrPWZ1bmN0aW9uKHQsZSxuKXtpZighaCh0KSl0aHJvdyBuZXcgQigidmFsdWUgaXMgcmVxdWlyZWQiKTtpZighaChlKSl0aHJvdyBuZXcgQigiYXJyYXkgaXMgcmVxdWlyZWQiKTtyZXR1cm4gbj14KG4sMCksYS5wYWNrKHQuX3JhZGlpLGUsbiksbis9YS5wYWNrZWRMZW5ndGgsYS5wYWNrKHQuX2lubmVyUmFkaWksZSxuKSxuKz1hLnBhY2tlZExlbmd0aCxlW24rK109dC5fbWluaW11bUNsb2NrLGVbbisrXT10Ll9tYXhpbXVtQ2xvY2ssZVtuKytdPXQuX21pbmltdW1Db25lLGVbbisrXT10Ll9tYXhpbXVtQ29uZSxlW24rK109dC5fc3RhY2tQYXJ0aXRpb25zLGVbbisrXT10Ll9zbGljZVBhcnRpdGlvbnMsZVtuKytdPXQuX3N1YmRpdmlzaW9ucyxlW25dPXgodC5fb2Zmc2V0QXR0cmlidXRlLC0xKSxlfTtUTz1uZXcgYSx3Tz1uZXcgYSxqaT17cmFkaWk6VE8saW5uZXJSYWRpaTp3TyxtaW5pbXVtQ2xvY2s6dm9pZCAwLG1heGltdW1DbG9jazp2b2lkIDAsbWluaW11bUNvbmU6dm9pZCAwLG1heGltdW1Db25lOnZvaWQgMCxzdGFja1BhcnRpdGlvbnM6dm9pZCAwLHNsaWNlUGFydGl0aW9uczp2b2lkIDAsc3ViZGl2aXNpb25zOnZvaWQgMCxvZmZzZXRBdHRyaWJ1dGU6dm9pZCAwfTtPYS51bnBhY2s9ZnVuY3Rpb24odCxlLG4pe2lmKCFoKHQpKXRocm93IG5ldyBCKCJhcnJheSBpcyByZXF1aXJlZCIpO2U9eChlLDApO2xldCBvPWEudW5wYWNrKHQsZSxUTyk7ZSs9YS5wYWNrZWRMZW5ndGg7bGV0IHI9YS51bnBhY2sodCxlLHdPKTtlKz1hLnBhY2tlZExlbmd0aDtsZXQgaT10W2UrK10scz10W2UrK10sZj10W2UrK10sdT10W2UrK10sYz10W2UrK10sbD10W2UrK10scD10W2UrK10sZD10W2VdO3JldHVybiBoKG4pPyhuLl9yYWRpaT1hLmNsb25lKG8sbi5fcmFkaWkpLG4uX2lubmVyUmFkaWk9YS5jbG9uZShyLG4uX2lubmVyUmFkaWkpLG4uX21pbmltdW1DbG9jaz1pLG4uX21heGltdW1DbG9jaz1zLG4uX21pbmltdW1Db25lPWYsbi5fbWF4aW11bUNvbmU9dSxuLl9zdGFja1BhcnRpdGlvbnM9YyxuLl9zbGljZVBhcnRpdGlvbnM9bCxuLl9zdWJkaXZpc2lvbnM9cCxuLl9vZmZzZXRBdHRyaWJ1dGU9ZD09PS0xP3ZvaWQgMDpkLG4pOihqaS5taW5pbXVtQ2xvY2s9aSxqaS5tYXhpbXVtQ2xvY2s9cyxqaS5taW5pbXVtQ29uZT1mLGppLm1heGltdW1Db25lPXUsamkuc3RhY2tQYXJ0aXRpb25zPWMsamkuc2xpY2VQYXJ0aXRpb25zPWwsamkuc3ViZGl2aXNpb25zPXAsamkub2Zmc2V0QXR0cmlidXRlPWQ9PT0tMT92b2lkIDA6ZCxuZXcgT2EoamkpKX07T2EuY3JlYXRlR2VvbWV0cnk9ZnVuY3Rpb24odCl7bGV0IGU9dC5fcmFkaWk7aWYoZS54PD0wfHxlLnk8PTB8fGUuejw9MClyZXR1cm47bGV0IG49dC5faW5uZXJSYWRpaTtpZihuLng8PTB8fG4ueTw9MHx8bi56PD0wKXJldHVybjtsZXQgbz10Ll9taW5pbXVtQ2xvY2sscj10Ll9tYXhpbXVtQ2xvY2ssaT10Ll9taW5pbXVtQ29uZSxzPXQuX21heGltdW1Db25lLGY9dC5fc3ViZGl2aXNpb25zLHU9JC5mcm9tQ2FydGVzaWFuMyhlKSxjPXQuX3NsaWNlUGFydGl0aW9ucysxLGw9dC5fc3RhY2tQYXJ0aXRpb25zKzE7Yz1NYXRoLnJvdW5kKGMqTWF0aC5hYnMoci1vKS9NLlRXT19QSSksbD1NYXRoLnJvdW5kKGwqTWF0aC5hYnMocy1pKS9NLlBJKSxjPDImJihjPTIpLGw8MiYmKGw9Mik7bGV0IHA9MCxkPTEsbT1uLnghPT1lLnh8fG4ueSE9PWUueXx8bi56IT09ZS56LF89ITEsZz0hMTttJiYoZD0yLGk+MCYmKF89ITAscCs9YyksczxNYXRoLlBJJiYoZz0hMCxwKz1jKSk7bGV0IGI9ZipkKihsK2MpLFQ9bmV3IEZsb2F0NjRBcnJheShiKjMpLE89MiooYitwLShjK2wpKmQpLEU9RHQuY3JlYXRlVHlwZWRBcnJheShiLE8pLHcsQyxOLEksRD0wLHY9bmV3IEFycmF5KGwpLEw9bmV3IEFycmF5KGwpO2Zvcih3PTA7dzxsO3crKylJPWkrdyoocy1pKS8obC0xKSx2W3ddPXdkKEkpLExbd109VGQoSSk7bGV0IFU9bmV3IEFycmF5KGYpLEE9bmV3IEFycmF5KGYpO2Zvcih3PTA7dzxmO3crKylOPW8rdyooci1vKS8oZi0xKSxVW3ddPXdkKE4pLEFbd109VGQoTik7Zm9yKHc9MDt3PGw7dysrKWZvcihDPTA7QzxmO0MrKylUW0QrK109ZS54KnZbd10qQVtDXSxUW0QrK109ZS55KnZbd10qVVtDXSxUW0QrK109ZS56Kkxbd107aWYobSlmb3Iodz0wO3c8bDt3KyspZm9yKEM9MDtDPGY7QysrKVRbRCsrXT1uLngqdlt3XSpBW0NdLFRbRCsrXT1uLnkqdlt3XSpVW0NdLFRbRCsrXT1uLnoqTFt3XTtmb3Iodi5sZW5ndGg9ZixMLmxlbmd0aD1mLHc9MDt3PGY7dysrKUk9aSt3KihzLWkpLyhmLTEpLHZbd109d2QoSSksTFt3XT1UZChJKTtmb3IoVS5sZW5ndGg9YyxBLmxlbmd0aD1jLHc9MDt3PGM7dysrKU49byt3KihyLW8pLyhjLTEpLFVbd109d2QoTiksQVt3XT1UZChOKTtmb3Iodz0wO3c8Zjt3KyspZm9yKEM9MDtDPGM7QysrKVRbRCsrXT1lLngqdlt3XSpBW0NdLFRbRCsrXT1lLnkqdlt3XSpVW0NdLFRbRCsrXT1lLnoqTFt3XTtpZihtKWZvcih3PTA7dzxmO3crKylmb3IoQz0wO0M8YztDKyspVFtEKytdPW4ueCp2W3ddKkFbQ10sVFtEKytdPW4ueSp2W3ddKlVbQ10sVFtEKytdPW4ueipMW3ddO2ZvcihEPTAsdz0wO3c8bCpkO3crKyl7bGV0IEY9dypmO2ZvcihDPTA7QzxmLTE7QysrKUVbRCsrXT1GK0MsRVtEKytdPUYrQysxfWxldCBTPWwqZipkO2Zvcih3PTA7dzxjO3crKylmb3IoQz0wO0M8Zi0xO0MrKylFW0QrK109Uyt3K0MqYyxFW0QrK109Uyt3KyhDKzEpKmM7aWYobSlmb3IoUz1sKmYqZCtjKmYsdz0wO3c8Yzt3KyspZm9yKEM9MDtDPGYtMTtDKyspRVtEKytdPVMrdytDKmMsRVtEKytdPVMrdysoQysxKSpjO2lmKG0pe2xldCBGPWwqZipkLGo9RitmKmM7aWYoXylmb3Iodz0wO3c8Yzt3KyspRVtEKytdPUYrdyxFW0QrK109ait3O2lmKGcpZm9yKEYrPWYqYy1jLGorPWYqYy1jLHc9MDt3PGM7dysrKUVbRCsrXT1GK3csRVtEKytdPWord31sZXQgUD1uZXcgaWUoe3Bvc2l0aW9uOm5ldyBpdCh7Y29tcG9uZW50RGF0YXR5cGU6bnQuRE9VQkxFLGNvbXBvbmVudHNQZXJBdHRyaWJ1dGU6Myx2YWx1ZXM6VH0pfSk7aWYoaCh0Ll9vZmZzZXRBdHRyaWJ1dGUpKXtsZXQgRj1ULmxlbmd0aCxqPXQuX29mZnNldEF0dHJpYnV0ZT09PWZlLk5PTkU/MDoxLEg9bmV3IFVpbnQ4QXJyYXkoRi8zKS5maWxsKGopO1AuYXBwbHlPZmZzZXQ9bmV3IGl0KHtjb21wb25lbnREYXRhdHlwZTpudC5VTlNJR05FRF9CWVRFLGNvbXBvbmVudHNQZXJBdHRyaWJ1dGU6MSx2YWx1ZXM6SH0pfXJldHVybiBuZXcgVXQoe2F0dHJpYnV0ZXM6UCxpbmRpY2VzOkUscHJpbWl0aXZlVHlwZTpCdC5MSU5FUyxib3VuZGluZ1NwaGVyZTpBdC5mcm9tRWxsaXBzb2lkKHUpLG9mZnNldEF0dHJpYnV0ZTp0Ll9vZmZzZXRBdHRyaWJ1dGV9KX07V3I9T2F9KTt2YXIgU189e307ZGUoU18se2RlZmF1bHQ6KCk9Pk1MfSk7ZnVuY3Rpb24gUEwodCxlKXtyZXR1cm4gaCh0LmJ1ZmZlcixlKSYmKHQ9V3IudW5wYWNrKHQsZSkpLFdyLmNyZWF0ZUdlb21ldHJ5KHQpfXZhciBNTCxDXz1aKCgpPT57ZnQoKTtSXygpO01MPVBMfSk7ZnVuY3Rpb24gT3IodCl7dGhpcy5wbGFuZXM9eCh0LFtdKX12YXIgcWYsQXMsTkwsT08sT2QseF89WigoKT0+e0Z0KCk7aHIoKTtJdCgpO2Z0KCk7SHQoKTtrcygpO2ZzKCk7cWY9W25ldyBhLG5ldyBhLG5ldyBhXTthLmNsb25lKGEuVU5JVF9YLHFmWzBdKTthLmNsb25lKGEuVU5JVF9ZLHFmWzFdKTthLmNsb25lKGEuVU5JVF9aLHFmWzJdKTtBcz1uZXcgYSxOTD1uZXcgYSxPTz1uZXcgb24obmV3IGEoMSwwLDApLDApO09yLmZyb21Cb3VuZGluZ1NwaGVyZT1mdW5jdGlvbih0LGUpe2lmKCFoKHQpKXRocm93IG5ldyBCKCJib3VuZGluZ1NwaGVyZSBpcyByZXF1aXJlZC4iKTtoKGUpfHwoZT1uZXcgT3IpO2xldCBuPXFmLmxlbmd0aCxvPWUucGxhbmVzO28ubGVuZ3RoPTIqbjtsZXQgcj10LmNlbnRlcixpPXQucmFkaXVzLHM9MDtmb3IobGV0IGY9MDtmPG47KytmKXtsZXQgdT1xZltmXSxjPW9bc10sbD1vW3MrMV07aChjKXx8KGM9b1tzXT1uZXcgaGUpLGgobCl8fChsPW9bcysxXT1uZXcgaGUpLGEubXVsdGlwbHlCeVNjYWxhcih1LC1pLEFzKSxhLmFkZChyLEFzLEFzKSxjLng9dS54LGMueT11LnksYy56PXUueixjLnc9LWEuZG90KHUsQXMpLGEubXVsdGlwbHlCeVNjYWxhcih1LGksQXMpLGEuYWRkKHIsQXMsQXMpLGwueD0tdS54LGwueT0tdS55LGwuej0tdS56LGwudz0tYS5kb3QoYS5uZWdhdGUodSxOTCksQXMpLHMrPTJ9cmV0dXJuIGV9O09yLnByb3RvdHlwZS5jb21wdXRlVmlzaWJpbGl0eT1mdW5jdGlvbih0KXtpZighaCh0KSl0aHJvdyBuZXcgQigiYm91bmRpbmdWb2x1bWUgaXMgcmVxdWlyZWQuIik7bGV0IGU9dGhpcy5wbGFuZXMsbj0hMTtmb3IobGV0IG89MCxyPWUubGVuZ3RoO288cjsrK28pe2xldCBpPXQuaW50ZXJzZWN0UGxhbmUob24uZnJvbUNhcnRlc2lhbjQoZVtvXSxPTykpO2lmKGk9PT1Tbi5PVVRTSURFKXJldHVybiBTbi5PVVRTSURFO2k9PT1Tbi5JTlRFUlNFQ1RJTkcmJihuPSEwKX1yZXR1cm4gbj9Tbi5JTlRFUlNFQ1RJTkc6U24uSU5TSURFfTtPci5wcm90b3R5cGUuY29tcHV0ZVZpc2liaWxpdHlXaXRoUGxhbmVNYXNrPWZ1bmN0aW9uKHQsZSl7aWYoIWgodCkpdGhyb3cgbmV3IEIoImJvdW5kaW5nVm9sdW1lIGlzIHJlcXVpcmVkLiIpO2lmKCFoKGUpKXRocm93IG5ldyBCKCJwYXJlbnRQbGFuZU1hc2sgaXMgcmVxdWlyZWQuIik7aWYoZT09PU9yLk1BU0tfT1VUU0lERXx8ZT09PU9yLk1BU0tfSU5TSURFKXJldHVybiBlO2xldCBuPU9yLk1BU0tfSU5TSURFLG89dGhpcy5wbGFuZXM7Zm9yKGxldCByPTAsaT1vLmxlbmd0aDtyPGk7KytyKXtsZXQgcz1yPDMxPzE8PHI6MDtpZihyPDMxJiYoZSZzKT09PTApY29udGludWU7bGV0IGY9dC5pbnRlcnNlY3RQbGFuZShvbi5mcm9tQ2FydGVzaWFuNChvW3JdLE9PKSk7aWYoZj09PVNuLk9VVFNJREUpcmV0dXJuIE9yLk1BU0tfT1VUU0lERTtmPT09U24uSU5URVJTRUNUSU5HJiYobnw9cyl9cmV0dXJuIG59O09yLk1BU0tfT1VUU0lERT00Mjk0OTY3Mjk1O09yLk1BU0tfSU5TSURFPTA7T3IuTUFTS19JTkRFVEVSTUlOQVRFPTIxNDc0ODM2NDc7T2Q9T3J9KTtmdW5jdGlvbiBsaSh0KXt0PXgodCx4LkVNUFRZX09CSkVDVCksdGhpcy5sZWZ0PXQubGVmdCx0aGlzLl9sZWZ0PXZvaWQgMCx0aGlzLnJpZ2h0PXQucmlnaHQsdGhpcy5fcmlnaHQ9dm9pZCAwLHRoaXMudG9wPXQudG9wLHRoaXMuX3RvcD12b2lkIDAsdGhpcy5ib3R0b209dC5ib3R0b20sdGhpcy5fYm90dG9tPXZvaWQgMCx0aGlzLm5lYXI9eCh0Lm5lYXIsMSksdGhpcy5fbmVhcj10aGlzLm5lYXIsdGhpcy5mYXI9eCh0LmZhciw1ZTgpLHRoaXMuX2Zhcj10aGlzLmZhcix0aGlzLl9jdWxsaW5nVm9sdW1lPW5ldyBPZCx0aGlzLl9vcnRob2dyYXBoaWNNYXRyaXg9bmV3IHN0fWZ1bmN0aW9uIEVPKHQpe2lmKCFoKHQucmlnaHQpfHwhaCh0LmxlZnQpfHwhaCh0LnRvcCl8fCFoKHQuYm90dG9tKXx8IWgodC5uZWFyKXx8IWgodC5mYXIpKXRocm93IG5ldyBCKCJyaWdodCwgbGVmdCwgdG9wLCBib3R0b20sIG5lYXIsIG9yIGZhciBwYXJhbWV0ZXJzIGFyZSBub3Qgc2V0LiIpO2lmKHQudG9wIT09dC5fdG9wfHx0LmJvdHRvbSE9PXQuX2JvdHRvbXx8dC5sZWZ0IT09dC5fbGVmdHx8dC5yaWdodCE9PXQuX3JpZ2h0fHx0Lm5lYXIhPT10Ll9uZWFyfHx0LmZhciE9PXQuX2Zhcil7aWYodC5sZWZ0PnQucmlnaHQpdGhyb3cgbmV3IEIoInJpZ2h0IG11c3QgYmUgZ3JlYXRlciB0aGFuIGxlZnQuIik7aWYodC5ib3R0b20+dC50b3ApdGhyb3cgbmV3IEIoInRvcCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBib3R0b20uIik7dC5uZWFyPD0wfHx0Lm5lYXI+dC5mYXIsdC5fbGVmdD10LmxlZnQsdC5fcmlnaHQ9dC5yaWdodCx0Ll90b3A9dC50b3AsdC5fYm90dG9tPXQuYm90dG9tLHQuX25lYXI9dC5uZWFyLHQuX2Zhcj10LmZhcix0Ll9vcnRob2dyYXBoaWNNYXRyaXg9c3QuY29tcHV0ZU9ydGhvZ3JhcGhpY09mZkNlbnRlcih0LmxlZnQsdC5yaWdodCx0LmJvdHRvbSx0LnRvcCx0Lm5lYXIsdC5mYXIsdC5fb3J0aG9ncmFwaGljTWF0cml4KX19dmFyIElMLHZMLExMLFBfLFJPLFNPPVooKCk9PntGdCgpO2hyKCk7eF8oKTtJdCgpO2Z0KCk7SHQoKTtXdCgpO1VuKCk7T2JqZWN0LmRlZmluZVByb3BlcnRpZXMobGkucHJvdG90eXBlLHtwcm9qZWN0aW9uTWF0cml4OntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gRU8odGhpcyksdGhpcy5fb3J0aG9ncmFwaGljTWF0cml4fX19KTtJTD1uZXcgYSx2TD1uZXcgYSxMTD1uZXcgYSxQXz1uZXcgYTtsaS5wcm90b3R5cGUuY29tcHV0ZUN1bGxpbmdWb2x1bWU9ZnVuY3Rpb24odCxlLG4pe2lmKCFoKHQpKXRocm93IG5ldyBCKCJwb3NpdGlvbiBpcyByZXF1aXJlZC4iKTtpZighaChlKSl0aHJvdyBuZXcgQigiZGlyZWN0aW9uIGlzIHJlcXVpcmVkLiIpO2lmKCFoKG4pKXRocm93IG5ldyBCKCJ1cCBpcyByZXF1aXJlZC4iKTtsZXQgbz10aGlzLl9jdWxsaW5nVm9sdW1lLnBsYW5lcyxyPXRoaXMudG9wLGk9dGhpcy5ib3R0b20scz10aGlzLnJpZ2h0LGY9dGhpcy5sZWZ0LHU9dGhpcy5uZWFyLGM9dGhpcy5mYXIsbD1hLmNyb3NzKGUsbixJTCk7YS5ub3JtYWxpemUobCxsKTtsZXQgcD12TDthLm11bHRpcGx5QnlTY2FsYXIoZSx1LHApLGEuYWRkKHQscCxwKTtsZXQgZD1MTDthLm11bHRpcGx5QnlTY2FsYXIobCxmLGQpLGEuYWRkKHAsZCxkKTtsZXQgbT1vWzBdO3JldHVybiBoKG0pfHwobT1vWzBdPW5ldyBoZSksbS54PWwueCxtLnk9bC55LG0uej1sLnosbS53PS1hLmRvdChsLGQpLGEubXVsdGlwbHlCeVNjYWxhcihsLHMsZCksYS5hZGQocCxkLGQpLG09b1sxXSxoKG0pfHwobT1vWzFdPW5ldyBoZSksbS54PS1sLngsbS55PS1sLnksbS56PS1sLnosbS53PS1hLmRvdChhLm5lZ2F0ZShsLFBfKSxkKSxhLm11bHRpcGx5QnlTY2FsYXIobixpLGQpLGEuYWRkKHAsZCxkKSxtPW9bMl0saChtKXx8KG09b1syXT1uZXcgaGUpLG0ueD1uLngsbS55PW4ueSxtLno9bi56LG0udz0tYS5kb3QobixkKSxhLm11bHRpcGx5QnlTY2FsYXIobixyLGQpLGEuYWRkKHAsZCxkKSxtPW9bM10saChtKXx8KG09b1szXT1uZXcgaGUpLG0ueD0tbi54LG0ueT0tbi55LG0uej0tbi56LG0udz0tYS5kb3QoYS5uZWdhdGUobixQXyksZCksbT1vWzRdLGgobSl8fChtPW9bNF09bmV3IGhlKSxtLng9ZS54LG0ueT1lLnksbS56PWUueixtLnc9LWEuZG90KGUscCksYS5tdWx0aXBseUJ5U2NhbGFyKGUsYyxkKSxhLmFkZCh0LGQsZCksbT1vWzVdLGgobSl8fChtPW9bNV09bmV3IGhlKSxtLng9LWUueCxtLnk9LWUueSxtLno9LWUueixtLnc9LWEuZG90KGEubmVnYXRlKGUsUF8pLGQpLHRoaXMuX2N1bGxpbmdWb2x1bWV9O2xpLnByb3RvdHlwZS5nZXRQaXhlbERpbWVuc2lvbnM9ZnVuY3Rpb24odCxlLG4sbyxyKXtpZihFTyh0aGlzKSwhaCh0KXx8IWgoZSkpdGhyb3cgbmV3IEIoIkJvdGggZHJhd2luZ0J1ZmZlcldpZHRoIGFuZCBkcmF3aW5nQnVmZmVySGVpZ2h0IGFyZSByZXF1aXJlZC4iKTtpZih0PD0wKXRocm93IG5ldyBCKCJkcmF3aW5nQnVmZmVyV2lkdGggbXVzdCBiZSBncmVhdGVyIHRoYW4gemVyby4iKTtpZihlPD0wKXRocm93IG5ldyBCKCJkcmF3aW5nQnVmZmVySGVpZ2h0IG11c3QgYmUgZ3JlYXRlciB0aGFuIHplcm8uIik7aWYoIWgobikpdGhyb3cgbmV3IEIoImRpc3RhbmNlIGlzIHJlcXVpcmVkLiIpO2lmKCFoKG8pKXRocm93IG5ldyBCKCJwaXhlbFJhdGlvIGlzIHJlcXVpcmVkLiIpO2lmKG88PTApdGhyb3cgbmV3IEIoInBpeGVsUmF0aW8gbXVzdCBiZSBncmVhdGVyIHRoYW4gemVyby4iKTtpZighaChyKSl0aHJvdyBuZXcgQigiQSByZXN1bHQgb2JqZWN0IGlzIHJlcXVpcmVkLiIpO2xldCBpPXRoaXMucmlnaHQtdGhpcy5sZWZ0LHM9dGhpcy50b3AtdGhpcy5ib3R0b20sZj1vKmkvdCx1PW8qcy9lO3JldHVybiByLng9ZixyLnk9dSxyfTtsaS5wcm90b3R5cGUuY2xvbmU9ZnVuY3Rpb24odCl7cmV0dXJuIGgodCl8fCh0PW5ldyBsaSksdC5sZWZ0PXRoaXMubGVmdCx0LnJpZ2h0PXRoaXMucmlnaHQsdC50b3A9dGhpcy50b3AsdC5ib3R0b209dGhpcy5ib3R0b20sdC5uZWFyPXRoaXMubmVhcix0LmZhcj10aGlzLmZhcix0Ll9sZWZ0PXZvaWQgMCx0Ll9yaWdodD12b2lkIDAsdC5fdG9wPXZvaWQgMCx0Ll9ib3R0b209dm9pZCAwLHQuX25lYXI9dm9pZCAwLHQuX2Zhcj12b2lkIDAsdH07bGkucHJvdG90eXBlLmVxdWFscz1mdW5jdGlvbih0KXtyZXR1cm4gaCh0KSYmdCBpbnN0YW5jZW9mIGxpJiZ0aGlzLnJpZ2h0PT09dC5yaWdodCYmdGhpcy5sZWZ0PT09dC5sZWZ0JiZ0aGlzLnRvcD09PXQudG9wJiZ0aGlzLmJvdHRvbT09PXQuYm90dG9tJiZ0aGlzLm5lYXI9PT10Lm5lYXImJnRoaXMuZmFyPT09dC5mYXJ9O2xpLnByb3RvdHlwZS5lcXVhbHNFcHNpbG9uPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gdD09PXRoaXN8fGgodCkmJnQgaW5zdGFuY2VvZiBsaSYmTS5lcXVhbHNFcHNpbG9uKHRoaXMucmlnaHQsdC5yaWdodCxlLG4pJiZNLmVxdWFsc0Vwc2lsb24odGhpcy5sZWZ0LHQubGVmdCxlLG4pJiZNLmVxdWFsc0Vwc2lsb24odGhpcy50b3AsdC50b3AsZSxuKSYmTS5lcXVhbHNFcHNpbG9uKHRoaXMuYm90dG9tLHQuYm90dG9tLGUsbikmJk0uZXF1YWxzRXBzaWxvbih0aGlzLm5lYXIsdC5uZWFyLGUsbikmJk0uZXF1YWxzRXBzaWxvbih0aGlzLmZhcix0LmZhcixlLG4pfTtSTz1saX0pO2Z1bmN0aW9uIHRyKHQpe3Q9eCh0LHguRU1QVFlfT0JKRUNUKSx0aGlzLl9vZmZDZW50ZXJGcnVzdHVtPW5ldyBSTyx0aGlzLndpZHRoPXQud2lkdGgsdGhpcy5fd2lkdGg9dm9pZCAwLHRoaXMuYXNwZWN0UmF0aW89dC5hc3BlY3RSYXRpbyx0aGlzLl9hc3BlY3RSYXRpbz12b2lkIDAsdGhpcy5uZWFyPXgodC5uZWFyLDEpLHRoaXMuX25lYXI9dGhpcy5uZWFyLHRoaXMuZmFyPXgodC5mYXIsNWU4KSx0aGlzLl9mYXI9dGhpcy5mYXJ9ZnVuY3Rpb24gYnModCl7aWYoIWgodC53aWR0aCl8fCFoKHQuYXNwZWN0UmF0aW8pfHwhaCh0Lm5lYXIpfHwhaCh0LmZhcikpdGhyb3cgbmV3IEIoIndpZHRoLCBhc3BlY3RSYXRpbywgbmVhciwgb3IgZmFyIHBhcmFtZXRlcnMgYXJlIG5vdCBzZXQuIik7bGV0IGU9dC5fb2ZmQ2VudGVyRnJ1c3R1bTtpZih0LndpZHRoIT09dC5fd2lkdGh8fHQuYXNwZWN0UmF0aW8hPT10Ll9hc3BlY3RSYXRpb3x8dC5uZWFyIT09dC5fbmVhcnx8dC5mYXIhPT10Ll9mYXIpe2lmKHQuYXNwZWN0UmF0aW88MCl0aHJvdyBuZXcgQigiYXNwZWN0UmF0aW8gbXVzdCBiZSBwb3NpdGl2ZS4iKTtpZih0Lm5lYXI8MHx8dC5uZWFyPnQuZmFyKXRocm93IG5ldyBCKCJuZWFyIG11c3QgYmUgZ3JlYXRlciB0aGFuIHplcm8gYW5kIGxlc3MgdGhhbiBmYXIuIik7dC5fYXNwZWN0UmF0aW89dC5hc3BlY3RSYXRpbyx0Ll93aWR0aD10LndpZHRoLHQuX25lYXI9dC5uZWFyLHQuX2Zhcj10LmZhcjtsZXQgbj0xL3QuYXNwZWN0UmF0aW87ZS5yaWdodD10LndpZHRoKi41LGUubGVmdD0tZS5yaWdodCxlLnRvcD1uKmUucmlnaHQsZS5ib3R0b209LWUudG9wLGUubmVhcj10Lm5lYXIsZS5mYXI9dC5mYXJ9fXZhciB4byxNXz1aKCgpPT57WHQoKTtJdCgpO2Z0KCk7SHQoKTtXdCgpO1NPKCk7dHIucGFja2VkTGVuZ3RoPTQ7dHIucGFjaz1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHkudHlwZU9mLm9iamVjdCgidmFsdWUiLHQpLHkuZGVmaW5lZCgiYXJyYXkiLGUpLG49eChuLDApLGVbbisrXT10LndpZHRoLGVbbisrXT10LmFzcGVjdFJhdGlvLGVbbisrXT10Lm5lYXIsZVtuXT10LmZhcixlfTt0ci51bnBhY2s9ZnVuY3Rpb24odCxlLG4pe3JldHVybiB5LmRlZmluZWQoImFycmF5Iix0KSxlPXgoZSwwKSxoKG4pfHwobj1uZXcgdHIpLG4ud2lkdGg9dFtlKytdLG4uYXNwZWN0UmF0aW89dFtlKytdLG4ubmVhcj10W2UrK10sbi5mYXI9dFtlXSxufTtPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0ci5wcm90b3R5cGUse3Byb2plY3Rpb25NYXRyaXg6e2dldDpmdW5jdGlvbigpe3JldHVybiBicyh0aGlzKSx0aGlzLl9vZmZDZW50ZXJGcnVzdHVtLnByb2plY3Rpb25NYXRyaXh9fSxvZmZDZW50ZXJGcnVzdHVtOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gYnModGhpcyksdGhpcy5fb2ZmQ2VudGVyRnJ1c3R1bX19fSk7dHIucHJvdG90eXBlLmNvbXB1dGVDdWxsaW5nVm9sdW1lPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gYnModGhpcyksdGhpcy5fb2ZmQ2VudGVyRnJ1c3R1bS5jb21wdXRlQ3VsbGluZ1ZvbHVtZSh0LGUsbil9O3RyLnByb3RvdHlwZS5nZXRQaXhlbERpbWVuc2lvbnM9ZnVuY3Rpb24odCxlLG4sbyxyKXtyZXR1cm4gYnModGhpcyksdGhpcy5fb2ZmQ2VudGVyRnJ1c3R1bS5nZXRQaXhlbERpbWVuc2lvbnModCxlLG4sbyxyKX07dHIucHJvdG90eXBlLmNsb25lPWZ1bmN0aW9uKHQpe3JldHVybiBoKHQpfHwodD1uZXcgdHIpLHQuYXNwZWN0UmF0aW89dGhpcy5hc3BlY3RSYXRpbyx0LndpZHRoPXRoaXMud2lkdGgsdC5uZWFyPXRoaXMubmVhcix0LmZhcj10aGlzLmZhcix0Ll9hc3BlY3RSYXRpbz12b2lkIDAsdC5fd2lkdGg9dm9pZCAwLHQuX25lYXI9dm9pZCAwLHQuX2Zhcj12b2lkIDAsdGhpcy5fb2ZmQ2VudGVyRnJ1c3R1bS5jbG9uZSh0Ll9vZmZDZW50ZXJGcnVzdHVtKSx0fTt0ci5wcm90b3R5cGUuZXF1YWxzPWZ1bmN0aW9uKHQpe3JldHVybiFoKHQpfHwhKHQgaW5zdGFuY2VvZiB0cik/ITE6KGJzKHRoaXMpLGJzKHQpLHRoaXMud2lkdGg9PT10LndpZHRoJiZ0aGlzLmFzcGVjdFJhdGlvPT09dC5hc3BlY3RSYXRpbyYmdGhpcy5fb2ZmQ2VudGVyRnJ1c3R1bS5lcXVhbHModC5fb2ZmQ2VudGVyRnJ1c3R1bSkpfTt0ci5wcm90b3R5cGUuZXF1YWxzRXBzaWxvbj1mdW5jdGlvbih0LGUsbil7cmV0dXJuIWgodCl8fCEodCBpbnN0YW5jZW9mIHRyKT8hMTooYnModGhpcyksYnModCksTS5lcXVhbHNFcHNpbG9uKHRoaXMud2lkdGgsdC53aWR0aCxlLG4pJiZNLmVxdWFsc0Vwc2lsb24odGhpcy5hc3BlY3RSYXRpbyx0LmFzcGVjdFJhdGlvLGUsbikmJnRoaXMuX29mZkNlbnRlckZydXN0dW0uZXF1YWxzRXBzaWxvbih0Ll9vZmZDZW50ZXJGcnVzdHVtLGUsbikpfTt4bz10cn0pO2Z1bmN0aW9uIHBpKHQpe3Q9eCh0LHguRU1QVFlfT0JKRUNUKSx0aGlzLmxlZnQ9dC5sZWZ0LHRoaXMuX2xlZnQ9dm9pZCAwLHRoaXMucmlnaHQ9dC5yaWdodCx0aGlzLl9yaWdodD12b2lkIDAsdGhpcy50b3A9dC50b3AsdGhpcy5fdG9wPXZvaWQgMCx0aGlzLmJvdHRvbT10LmJvdHRvbSx0aGlzLl9ib3R0b209dm9pZCAwLHRoaXMubmVhcj14KHQubmVhciwxKSx0aGlzLl9uZWFyPXRoaXMubmVhcix0aGlzLmZhcj14KHQuZmFyLDVlOCksdGhpcy5fZmFyPXRoaXMuZmFyLHRoaXMuX2N1bGxpbmdWb2x1bWU9bmV3IE9kLHRoaXMuX3BlcnNwZWN0aXZlTWF0cml4PW5ldyBzdCx0aGlzLl9pbmZpbml0ZVBlcnNwZWN0aXZlPW5ldyBzdH1mdW5jdGlvbiBOXyh0KXtpZighaCh0LnJpZ2h0KXx8IWgodC5sZWZ0KXx8IWgodC50b3ApfHwhaCh0LmJvdHRvbSl8fCFoKHQubmVhcil8fCFoKHQuZmFyKSl0aHJvdyBuZXcgQigicmlnaHQsIGxlZnQsIHRvcCwgYm90dG9tLCBuZWFyLCBvciBmYXIgcGFyYW1ldGVycyBhcmUgbm90IHNldC4iKTtsZXR7dG9wOmUsYm90dG9tOm4scmlnaHQ6byxsZWZ0OnIsbmVhcjppLGZhcjpzfT10O2lmKGUhPT10Ll90b3B8fG4hPT10Ll9ib3R0b218fHIhPT10Ll9sZWZ0fHxvIT09dC5fcmlnaHR8fGkhPT10Ll9uZWFyfHxzIT09dC5fZmFyKXtpZih0Lm5lYXI8PTB8fHQubmVhcj50LmZhcil0aHJvdyBuZXcgQigibmVhciBtdXN0IGJlIGdyZWF0ZXIgdGhhbiB6ZXJvIGFuZCBsZXNzIHRoYW4gZmFyLiIpO3QuX2xlZnQ9cix0Ll9yaWdodD1vLHQuX3RvcD1lLHQuX2JvdHRvbT1uLHQuX25lYXI9aSx0Ll9mYXI9cyx0Ll9wZXJzcGVjdGl2ZU1hdHJpeD1zdC5jb21wdXRlUGVyc3BlY3RpdmVPZmZDZW50ZXIocixvLG4sZSxpLHMsdC5fcGVyc3BlY3RpdmVNYXRyaXgpLHQuX2luZmluaXRlUGVyc3BlY3RpdmU9c3QuY29tcHV0ZUluZmluaXRlUGVyc3BlY3RpdmVPZmZDZW50ZXIocixvLG4sZSxpLHQuX2luZmluaXRlUGVyc3BlY3RpdmUpfX12YXIgREwsRkwsQkwsVUwsQ08seE89WigoKT0+e0Z0KCk7aHIoKTt4XygpO0l0KCk7ZnQoKTtIdCgpO1d0KCk7VW4oKTtPYmplY3QuZGVmaW5lUHJvcGVydGllcyhwaS5wcm90b3R5cGUse3Byb2plY3Rpb25NYXRyaXg6e2dldDpmdW5jdGlvbigpe3JldHVybiBOXyh0aGlzKSx0aGlzLl9wZXJzcGVjdGl2ZU1hdHJpeH19LGluZmluaXRlUHJvamVjdGlvbk1hdHJpeDp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIE5fKHRoaXMpLHRoaXMuX2luZmluaXRlUGVyc3BlY3RpdmV9fX0pO0RMPW5ldyBhLEZMPW5ldyBhLEJMPW5ldyBhLFVMPW5ldyBhO3BpLnByb3RvdHlwZS5jb21wdXRlQ3VsbGluZ1ZvbHVtZT1mdW5jdGlvbih0LGUsbil7aWYoIWgodCkpdGhyb3cgbmV3IEIoInBvc2l0aW9uIGlzIHJlcXVpcmVkLiIpO2lmKCFoKGUpKXRocm93IG5ldyBCKCJkaXJlY3Rpb24gaXMgcmVxdWlyZWQuIik7aWYoIWgobikpdGhyb3cgbmV3IEIoInVwIGlzIHJlcXVpcmVkLiIpO2xldCBvPXRoaXMuX2N1bGxpbmdWb2x1bWUucGxhbmVzLHI9dGhpcy50b3AsaT10aGlzLmJvdHRvbSxzPXRoaXMucmlnaHQsZj10aGlzLmxlZnQsdT10aGlzLm5lYXIsYz10aGlzLmZhcixsPWEuY3Jvc3MoZSxuLERMKSxwPUZMO2EubXVsdGlwbHlCeVNjYWxhcihlLHUscCksYS5hZGQodCxwLHApO2xldCBkPUJMO2EubXVsdGlwbHlCeVNjYWxhcihlLGMsZCksYS5hZGQodCxkLGQpO2xldCBtPVVMO2EubXVsdGlwbHlCeVNjYWxhcihsLGYsbSksYS5hZGQocCxtLG0pLGEuc3VidHJhY3QobSx0LG0pLGEubm9ybWFsaXplKG0sbSksYS5jcm9zcyhtLG4sbSksYS5ub3JtYWxpemUobSxtKTtsZXQgXz1vWzBdO3JldHVybiBoKF8pfHwoXz1vWzBdPW5ldyBoZSksXy54PW0ueCxfLnk9bS55LF8uej1tLnosXy53PS1hLmRvdChtLHQpLGEubXVsdGlwbHlCeVNjYWxhcihsLHMsbSksYS5hZGQocCxtLG0pLGEuc3VidHJhY3QobSx0LG0pLGEuY3Jvc3MobixtLG0pLGEubm9ybWFsaXplKG0sbSksXz1vWzFdLGgoXyl8fChfPW9bMV09bmV3IGhlKSxfLng9bS54LF8ueT1tLnksXy56PW0ueixfLnc9LWEuZG90KG0sdCksYS5tdWx0aXBseUJ5U2NhbGFyKG4saSxtKSxhLmFkZChwLG0sbSksYS5zdWJ0cmFjdChtLHQsbSksYS5jcm9zcyhsLG0sbSksYS5ub3JtYWxpemUobSxtKSxfPW9bMl0saChfKXx8KF89b1syXT1uZXcgaGUpLF8ueD1tLngsXy55PW0ueSxfLno9bS56LF8udz0tYS5kb3QobSx0KSxhLm11bHRpcGx5QnlTY2FsYXIobixyLG0pLGEuYWRkKHAsbSxtKSxhLnN1YnRyYWN0KG0sdCxtKSxhLmNyb3NzKG0sbCxtKSxhLm5vcm1hbGl6ZShtLG0pLF89b1szXSxoKF8pfHwoXz1vWzNdPW5ldyBoZSksXy54PW0ueCxfLnk9bS55LF8uej1tLnosXy53PS1hLmRvdChtLHQpLF89b1s0XSxoKF8pfHwoXz1vWzRdPW5ldyBoZSksXy54PWUueCxfLnk9ZS55LF8uej1lLnosXy53PS1hLmRvdChlLHApLGEubmVnYXRlKGUsbSksXz1vWzVdLGgoXyl8fChfPW9bNV09bmV3IGhlKSxfLng9bS54LF8ueT1tLnksXy56PW0ueixfLnc9LWEuZG90KG0sZCksdGhpcy5fY3VsbGluZ1ZvbHVtZX07cGkucHJvdG90eXBlLmdldFBpeGVsRGltZW5zaW9ucz1mdW5jdGlvbih0LGUsbixvLHIpe2lmKE5fKHRoaXMpLCFoKHQpfHwhaChlKSl0aHJvdyBuZXcgQigiQm90aCBkcmF3aW5nQnVmZmVyV2lkdGggYW5kIGRyYXdpbmdCdWZmZXJIZWlnaHQgYXJlIHJlcXVpcmVkLiIpO2lmKHQ8PTApdGhyb3cgbmV3IEIoImRyYXdpbmdCdWZmZXJXaWR0aCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiB6ZXJvLiIpO2lmKGU8PTApdGhyb3cgbmV3IEIoImRyYXdpbmdCdWZmZXJIZWlnaHQgbXVzdCBiZSBncmVhdGVyIHRoYW4gemVyby4iKTtpZighaChuKSl0aHJvdyBuZXcgQigiZGlzdGFuY2UgaXMgcmVxdWlyZWQuIik7aWYoIWgobykpdGhyb3cgbmV3IEIoInBpeGVsUmF0aW8gaXMgcmVxdWlyZWQiKTtpZihvPD0wKXRocm93IG5ldyBCKCJwaXhlbFJhdGlvIG11c3QgYmUgZ3JlYXRlciB0aGFuIHplcm8uIik7aWYoIWgocikpdGhyb3cgbmV3IEIoIkEgcmVzdWx0IG9iamVjdCBpcyByZXF1aXJlZC4iKTtsZXQgaT0xL3RoaXMubmVhcixzPXRoaXMudG9wKmksZj0yKm8qbipzL2U7cz10aGlzLnJpZ2h0Kmk7bGV0IHU9MipvKm4qcy90O3JldHVybiByLng9dSxyLnk9ZixyfTtwaS5wcm90b3R5cGUuY2xvbmU9ZnVuY3Rpb24odCl7cmV0dXJuIGgodCl8fCh0PW5ldyBwaSksdC5yaWdodD10aGlzLnJpZ2h0LHQubGVmdD10aGlzLmxlZnQsdC50b3A9dGhpcy50b3AsdC5ib3R0b209dGhpcy5ib3R0b20sdC5uZWFyPXRoaXMubmVhcix0LmZhcj10aGlzLmZhcix0Ll9sZWZ0PXZvaWQgMCx0Ll9yaWdodD12b2lkIDAsdC5fdG9wPXZvaWQgMCx0Ll9ib3R0b209dm9pZCAwLHQuX25lYXI9dm9pZCAwLHQuX2Zhcj12b2lkIDAsdH07cGkucHJvdG90eXBlLmVxdWFscz1mdW5jdGlvbih0KXtyZXR1cm4gaCh0KSYmdCBpbnN0YW5jZW9mIHBpJiZ0aGlzLnJpZ2h0PT09dC5yaWdodCYmdGhpcy5sZWZ0PT09dC5sZWZ0JiZ0aGlzLnRvcD09PXQudG9wJiZ0aGlzLmJvdHRvbT09PXQuYm90dG9tJiZ0aGlzLm5lYXI9PT10Lm5lYXImJnRoaXMuZmFyPT09dC5mYXJ9O3BpLnByb3RvdHlwZS5lcXVhbHNFcHNpbG9uPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gdD09PXRoaXN8fGgodCkmJnQgaW5zdGFuY2VvZiBwaSYmTS5lcXVhbHNFcHNpbG9uKHRoaXMucmlnaHQsdC5yaWdodCxlLG4pJiZNLmVxdWFsc0Vwc2lsb24odGhpcy5sZWZ0LHQubGVmdCxlLG4pJiZNLmVxdWFsc0Vwc2lsb24odGhpcy50b3AsdC50b3AsZSxuKSYmTS5lcXVhbHNFcHNpbG9uKHRoaXMuYm90dG9tLHQuYm90dG9tLGUsbikmJk0uZXF1YWxzRXBzaWxvbih0aGlzLm5lYXIsdC5uZWFyLGUsbikmJk0uZXF1YWxzRXBzaWxvbih0aGlzLmZhcix0LmZhcixlLG4pfTtDTz1waX0pO2Z1bmN0aW9uIGVyKHQpe3Q9eCh0LHguRU1QVFlfT0JKRUNUKSx0aGlzLl9vZmZDZW50ZXJGcnVzdHVtPW5ldyBDTyx0aGlzLmZvdj10LmZvdix0aGlzLl9mb3Y9dm9pZCAwLHRoaXMuX2Zvdnk9dm9pZCAwLHRoaXMuX3NzZURlbm9taW5hdG9yPXZvaWQgMCx0aGlzLmFzcGVjdFJhdGlvPXQuYXNwZWN0UmF0aW8sdGhpcy5fYXNwZWN0UmF0aW89dm9pZCAwLHRoaXMubmVhcj14KHQubmVhciwxKSx0aGlzLl9uZWFyPXRoaXMubmVhcix0aGlzLmZhcj14KHQuZmFyLDVlOCksdGhpcy5fZmFyPXRoaXMuZmFyLHRoaXMueE9mZnNldD14KHQueE9mZnNldCwwKSx0aGlzLl94T2Zmc2V0PXRoaXMueE9mZnNldCx0aGlzLnlPZmZzZXQ9eCh0LnlPZmZzZXQsMCksdGhpcy5feU9mZnNldD10aGlzLnlPZmZzZXR9ZnVuY3Rpb24gWHIodCl7aWYoIWgodC5mb3YpfHwhaCh0LmFzcGVjdFJhdGlvKXx8IWgodC5uZWFyKXx8IWgodC5mYXIpKXRocm93IG5ldyBCKCJmb3YsIGFzcGVjdFJhdGlvLCBuZWFyLCBvciBmYXIgcGFyYW1ldGVycyBhcmUgbm90IHNldC4iKTtpZighKHQuZm92IT09dC5fZm92fHx0LmFzcGVjdFJhdGlvIT09dC5fYXNwZWN0UmF0aW98fHQubmVhciE9PXQuX25lYXJ8fHQuZmFyIT09dC5fZmFyfHx0LnhPZmZzZXQhPT10Ll94T2Zmc2V0fHx0LnlPZmZzZXQhPT10Ll95T2Zmc2V0KSlyZXR1cm47aWYoeS50eXBlT2YubnVtYmVyLmdyZWF0ZXJUaGFuT3JFcXVhbHMoImZvdiIsdC5mb3YsMCkseS50eXBlT2YubnVtYmVyLmxlc3NUaGFuKCJmb3YiLHQuZm92LE1hdGguUEkpLHkudHlwZU9mLm51bWJlci5ncmVhdGVyVGhhbk9yRXF1YWxzKCJhc3BlY3RSYXRpbyIsdC5hc3BlY3RSYXRpbywwKSx5LnR5cGVPZi5udW1iZXIuZ3JlYXRlclRoYW5PckVxdWFscygibmVhciIsdC5uZWFyLDApLHQubmVhcj50LmZhcil0aHJvdyBuZXcgQigibmVhciBtdXN0IGJlIGxlc3MgdGhhbiBmYXIuIik7dC5fYXNwZWN0UmF0aW89dC5hc3BlY3RSYXRpbyx0Ll9mb3Y9dC5mb3YsdC5fZm92eT10LmFzcGVjdFJhdGlvPD0xP3QuZm92Ok1hdGguYXRhbihNYXRoLnRhbih0LmZvdiouNSkvdC5hc3BlY3RSYXRpbykqMix0Ll9uZWFyPXQubmVhcix0Ll9mYXI9dC5mYXIsdC5fc3NlRGVub21pbmF0b3I9MipNYXRoLnRhbiguNSp0Ll9mb3Z5KSx0Ll94T2Zmc2V0PXQueE9mZnNldCx0Ll95T2Zmc2V0PXQueU9mZnNldDtsZXQgbj10Ll9vZmZDZW50ZXJGcnVzdHVtO24udG9wPXQubmVhcipNYXRoLnRhbiguNSp0Ll9mb3Z5KSxuLmJvdHRvbT0tbi50b3Asbi5yaWdodD10LmFzcGVjdFJhdGlvKm4udG9wLG4ubGVmdD0tbi5yaWdodCxuLm5lYXI9dC5uZWFyLG4uZmFyPXQuZmFyLG4ucmlnaHQrPXQueE9mZnNldCxuLmxlZnQrPXQueE9mZnNldCxuLnRvcCs9dC55T2Zmc2V0LG4uYm90dG9tKz10LnlPZmZzZXR9dmFyIFBvLElfPVooKCk9PntYdCgpO0l0KCk7ZnQoKTtIdCgpO1d0KCk7eE8oKTtlci5wYWNrZWRMZW5ndGg9Njtlci5wYWNrPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4geS50eXBlT2Yub2JqZWN0KCJ2YWx1ZSIsdCkseS5kZWZpbmVkKCJhcnJheSIsZSksbj14KG4sMCksZVtuKytdPXQuZm92LGVbbisrXT10LmFzcGVjdFJhdGlvLGVbbisrXT10Lm5lYXIsZVtuKytdPXQuZmFyLGVbbisrXT10LnhPZmZzZXQsZVtuXT10LnlPZmZzZXQsZX07ZXIudW5wYWNrPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4geS5kZWZpbmVkKCJhcnJheSIsdCksZT14KGUsMCksaChuKXx8KG49bmV3IGVyKSxuLmZvdj10W2UrK10sbi5hc3BlY3RSYXRpbz10W2UrK10sbi5uZWFyPXRbZSsrXSxuLmZhcj10W2UrK10sbi54T2Zmc2V0PXRbZSsrXSxuLnlPZmZzZXQ9dFtlXSxufTtPYmplY3QuZGVmaW5lUHJvcGVydGllcyhlci5wcm90b3R5cGUse3Byb2plY3Rpb25NYXRyaXg6e2dldDpmdW5jdGlvbigpe3JldHVybiBYcih0aGlzKSx0aGlzLl9vZmZDZW50ZXJGcnVzdHVtLnByb2plY3Rpb25NYXRyaXh9fSxpbmZpbml0ZVByb2plY3Rpb25NYXRyaXg6e2dldDpmdW5jdGlvbigpe3JldHVybiBYcih0aGlzKSx0aGlzLl9vZmZDZW50ZXJGcnVzdHVtLmluZmluaXRlUHJvamVjdGlvbk1hdHJpeH19LGZvdnk6e2dldDpmdW5jdGlvbigpe3JldHVybiBYcih0aGlzKSx0aGlzLl9mb3Z5fX0sc3NlRGVub21pbmF0b3I6e2dldDpmdW5jdGlvbigpe3JldHVybiBYcih0aGlzKSx0aGlzLl9zc2VEZW5vbWluYXRvcn19LG9mZkNlbnRlckZydXN0dW06e2dldDpmdW5jdGlvbigpe3JldHVybiBYcih0aGlzKSx0aGlzLl9vZmZDZW50ZXJGcnVzdHVtfX19KTtlci5wcm90b3R5cGUuY29tcHV0ZUN1bGxpbmdWb2x1bWU9ZnVuY3Rpb24odCxlLG4pe3JldHVybiBYcih0aGlzKSx0aGlzLl9vZmZDZW50ZXJGcnVzdHVtLmNvbXB1dGVDdWxsaW5nVm9sdW1lKHQsZSxuKX07ZXIucHJvdG90eXBlLmdldFBpeGVsRGltZW5zaW9ucz1mdW5jdGlvbih0LGUsbixvLHIpe3JldHVybiBYcih0aGlzKSx0aGlzLl9vZmZDZW50ZXJGcnVzdHVtLmdldFBpeGVsRGltZW5zaW9ucyh0LGUsbixvLHIpfTtlci5wcm90b3R5cGUuY2xvbmU9ZnVuY3Rpb24odCl7cmV0dXJuIGgodCl8fCh0PW5ldyBlciksdC5hc3BlY3RSYXRpbz10aGlzLmFzcGVjdFJhdGlvLHQuZm92PXRoaXMuZm92LHQubmVhcj10aGlzLm5lYXIsdC5mYXI9dGhpcy5mYXIsdC5fYXNwZWN0UmF0aW89dm9pZCAwLHQuX2Zvdj12b2lkIDAsdC5fbmVhcj12b2lkIDAsdC5fZmFyPXZvaWQgMCx0aGlzLl9vZmZDZW50ZXJGcnVzdHVtLmNsb25lKHQuX29mZkNlbnRlckZydXN0dW0pLHR9O2VyLnByb3RvdHlwZS5lcXVhbHM9ZnVuY3Rpb24odCl7cmV0dXJuIWgodCl8fCEodCBpbnN0YW5jZW9mIGVyKT8hMTooWHIodGhpcyksWHIodCksdGhpcy5mb3Y9PT10LmZvdiYmdGhpcy5hc3BlY3RSYXRpbz09PXQuYXNwZWN0UmF0aW8mJnRoaXMuX29mZkNlbnRlckZydXN0dW0uZXF1YWxzKHQuX29mZkNlbnRlckZydXN0dW0pKX07ZXIucHJvdG90eXBlLmVxdWFsc0Vwc2lsb249ZnVuY3Rpb24odCxlLG4pe3JldHVybiFoKHQpfHwhKHQgaW5zdGFuY2VvZiBlcik/ITE6KFhyKHRoaXMpLFhyKHQpLE0uZXF1YWxzRXBzaWxvbih0aGlzLmZvdix0LmZvdixlLG4pJiZNLmVxdWFsc0Vwc2lsb24odGhpcy5hc3BlY3RSYXRpbyx0LmFzcGVjdFJhdGlvLGUsbikmJnRoaXMuX29mZkNlbnRlckZydXN0dW0uZXF1YWxzRXBzaWxvbih0Ll9vZmZDZW50ZXJGcnVzdHVtLGUsbikpfTtQbz1lcn0pO2Z1bmN0aW9uIGdjKHQpe3kudHlwZU9mLm9iamVjdCgib3B0aW9ucyIsdCkseS50eXBlT2Yub2JqZWN0KCJvcHRpb25zLmZydXN0dW0iLHQuZnJ1c3R1bSkseS50eXBlT2Yub2JqZWN0KCJvcHRpb25zLm9yaWdpbiIsdC5vcmlnaW4pLHkudHlwZU9mLm9iamVjdCgib3B0aW9ucy5vcmllbnRhdGlvbiIsdC5vcmllbnRhdGlvbik7bGV0IGU9dC5mcnVzdHVtLG49dC5vcmllbnRhdGlvbixvPXQub3JpZ2luLHI9eCh0LnZlcnRleEZvcm1hdCxkdC5ERUZBVUxUKSxpPXgodC5fZHJhd05lYXJQbGFuZSwhMCkscyxmO2UgaW5zdGFuY2VvZiBQbz8ocz1FZCxmPVBvLnBhY2tlZExlbmd0aCk6ZSBpbnN0YW5jZW9mIHhvJiYocz1WTCxmPXhvLnBhY2tlZExlbmd0aCksdGhpcy5fZnJ1c3R1bVR5cGU9cyx0aGlzLl9mcnVzdHVtPWUuY2xvbmUoKSx0aGlzLl9vcmlnaW49YS5jbG9uZShvKSx0aGlzLl9vcmllbnRhdGlvbj1lZS5jbG9uZShuKSx0aGlzLl9kcmF3TmVhclBsYW5lPWksdGhpcy5fdmVydGV4Rm9ybWF0PXIsdGhpcy5fd29ya2VyTmFtZT0iY3JlYXRlRnJ1c3R1bUdlb21ldHJ5Iix0aGlzLnBhY2tlZExlbmd0aD0yK2YrYS5wYWNrZWRMZW5ndGgrZWUucGFja2VkTGVuZ3RoK2R0LnBhY2tlZExlbmd0aH1mdW5jdGlvbiBFYSh0LGUsbixvLHIsaSxzLGYpe2xldCB1PXQvMyoyO2ZvcihsZXQgYz0wO2M8NDsrK2MpaChlKSYmKGVbdF09aS54LGVbdCsxXT1pLnksZVt0KzJdPWkueiksaChuKSYmKG5bdF09cy54LG5bdCsxXT1zLnksblt0KzJdPXMueiksaChvKSYmKG9bdF09Zi54LG9bdCsxXT1mLnksb1t0KzJdPWYueiksdCs9MztyW3VdPTAsclt1KzFdPTAsclt1KzJdPTEsclt1KzNdPTAsclt1KzRdPTEsclt1KzVdPTEsclt1KzZdPTAsclt1KzddPTF9dmFyIEVkLFZMLGtMLEdMLHpMLGpMLEhMLHFMLEtMLHZfLFBPLE1PLE5PLFdMLFhMLFlMLFRzLEtmLElPLFdmLExfPVooKCk9Pnt2ZSgpO0Z0KCk7aHIoKTtYdCgpO0ZlKCk7SXQoKTtmdCgpO1hlKCk7WWUoKTthbigpO0JuKCk7VW4oKTtNXygpO0lfKCk7dG4oKTtLbygpO1JvKCk7RWQ9MCxWTD0xO2djLnBhY2s9ZnVuY3Rpb24odCxlLG4pe3kudHlwZU9mLm9iamVjdCgidmFsdWUiLHQpLHkuZGVmaW5lZCgiYXJyYXkiLGUpLG49eChuLDApO2xldCBvPXQuX2ZydXN0dW1UeXBlLHI9dC5fZnJ1c3R1bTtyZXR1cm4gZVtuKytdPW8sbz09PUVkPyhQby5wYWNrKHIsZSxuKSxuKz1Qby5wYWNrZWRMZW5ndGgpOih4by5wYWNrKHIsZSxuKSxuKz14by5wYWNrZWRMZW5ndGgpLGEucGFjayh0Ll9vcmlnaW4sZSxuKSxuKz1hLnBhY2tlZExlbmd0aCxlZS5wYWNrKHQuX29yaWVudGF0aW9uLGUsbiksbis9ZWUucGFja2VkTGVuZ3RoLGR0LnBhY2sodC5fdmVydGV4Rm9ybWF0LGUsbiksbis9ZHQucGFja2VkTGVuZ3RoLGVbbl09dC5fZHJhd05lYXJQbGFuZT8xOjAsZX07a0w9bmV3IFBvLEdMPW5ldyB4byx6TD1uZXcgZWUsakw9bmV3IGEsSEw9bmV3IGR0O2djLnVucGFjaz1mdW5jdGlvbih0LGUsbil7eS5kZWZpbmVkKCJhcnJheSIsdCksZT14KGUsMCk7bGV0IG89dFtlKytdLHI7bz09PUVkPyhyPVBvLnVucGFjayh0LGUsa0wpLGUrPVBvLnBhY2tlZExlbmd0aCk6KHI9eG8udW5wYWNrKHQsZSxHTCksZSs9eG8ucGFja2VkTGVuZ3RoKTtsZXQgaT1hLnVucGFjayh0LGUsakwpO2UrPWEucGFja2VkTGVuZ3RoO2xldCBzPWVlLnVucGFjayh0LGUsekwpO2UrPWVlLnBhY2tlZExlbmd0aDtsZXQgZj1kdC51bnBhY2sodCxlLEhMKTtlKz1kdC5wYWNrZWRMZW5ndGg7bGV0IHU9dFtlXT09PTE7aWYoIWgobikpcmV0dXJuIG5ldyBnYyh7ZnJ1c3R1bTpyLG9yaWdpbjppLG9yaWVudGF0aW9uOnMsdmVydGV4Rm9ybWF0OmYsX2RyYXdOZWFyUGxhbmU6dX0pO2xldCBjPW89PT1uLl9mcnVzdHVtVHlwZT9uLl9mcnVzdHVtOnZvaWQgMDtyZXR1cm4gbi5fZnJ1c3R1bT1yLmNsb25lKGMpLG4uX2ZydXN0dW1UeXBlPW8sbi5fb3JpZ2luPWEuY2xvbmUoaSxuLl9vcmlnaW4pLG4uX29yaWVudGF0aW9uPWVlLmNsb25lKHMsbi5fb3JpZW50YXRpb24pLG4uX3ZlcnRleEZvcm1hdD1kdC5jbG9uZShmLG4uX3ZlcnRleEZvcm1hdCksbi5fZHJhd05lYXJQbGFuZT11LG59O3FMPW5ldyBRLEtMPW5ldyBzdCx2Xz1uZXcgc3QsUE89bmV3IGEsTU89bmV3IGEsTk89bmV3IGEsV0w9bmV3IGEsWEw9bmV3IGEsWUw9bmV3IGEsVHM9bmV3IEFycmF5KDMpLEtmPW5ldyBBcnJheSg0KTtLZlswXT1uZXcgaGUoLTEsLTEsMSwxKTtLZlsxXT1uZXcgaGUoMSwtMSwxLDEpO0tmWzJdPW5ldyBoZSgxLDEsMSwxKTtLZlszXT1uZXcgaGUoLTEsMSwxLDEpO0lPPW5ldyBBcnJheSg0KTtmb3IobGV0IHQ9MDt0PDQ7Kyt0KUlPW3RdPW5ldyBoZTtnYy5fY29tcHV0ZU5lYXJGYXJQbGFuZXM9ZnVuY3Rpb24odCxlLG4sbyxyLGkscyxmKXtsZXQgdT1RLmZyb21RdWF0ZXJuaW9uKGUscUwpLGM9eChpLFBPKSxsPXgocyxNTykscD14KGYsTk8pO2M9US5nZXRDb2x1bW4odSwwLGMpLGw9US5nZXRDb2x1bW4odSwxLGwpLHA9US5nZXRDb2x1bW4odSwyLHApLGEubm9ybWFsaXplKGMsYyksYS5ub3JtYWxpemUobCxsKSxhLm5vcm1hbGl6ZShwLHApLGEubmVnYXRlKGMsYyk7bGV0IGQ9c3QuY29tcHV0ZVZpZXcodCxwLGwsYyxLTCksbSxfLGc9by5wcm9qZWN0aW9uTWF0cml4O2lmKG49PT1FZCl7bGV0IGI9c3QubXVsdGlwbHkoZyxkLHZfKTtfPXN0LmludmVyc2UoYix2Xyl9ZWxzZSBtPXN0LmludmVyc2VUcmFuc2Zvcm1hdGlvbihkLHZfKTtoKF8pPyhUc1swXT1vLm5lYXIsVHNbMV09by5mYXIpOihUc1swXT0wLFRzWzFdPW8ubmVhcixUc1syXT1vLmZhcik7Zm9yKGxldCBiPTA7YjwyOysrYilmb3IobGV0IFQ9MDtUPDQ7KytUKXtsZXQgTz1oZS5jbG9uZShLZltUXSxJT1tUXSk7aWYoaChfKSl7Tz1zdC5tdWx0aXBseUJ5VmVjdG9yKF8sTyxPKTtsZXQgRT0xL08udzthLm11bHRpcGx5QnlTY2FsYXIoTyxFLE8pLGEuc3VidHJhY3QoTyx0LE8pLGEubm9ybWFsaXplKE8sTyk7bGV0IHc9YS5kb3QocCxPKTthLm11bHRpcGx5QnlTY2FsYXIoTyxUc1tiXS93LE8pLGEuYWRkKE8sdCxPKX1lbHNle2xldCBFPW8ub2ZmQ2VudGVyRnJ1c3R1bTtoKEUpJiYobz1FKTtsZXQgdz1Uc1tiXSxDPVRzW2IrMV07Ty54PShPLngqKG8ucmlnaHQtby5sZWZ0KStvLmxlZnQrby5yaWdodCkqLjUsTy55PShPLnkqKG8udG9wLW8uYm90dG9tKStvLmJvdHRvbStvLnRvcCkqLjUsTy56PShPLnoqKHctQyktdy1DKSouNSxPLnc9MSxzdC5tdWx0aXBseUJ5VmVjdG9yKG0sTyxPKX1yWzEyKmIrVCozXT1PLngsclsxMipiK1QqMysxXT1PLnksclsxMipiK1QqMysyXT1PLnp9fTtnYy5jcmVhdGVHZW9tZXRyeT1mdW5jdGlvbih0KXtsZXQgZT10Ll9mcnVzdHVtVHlwZSxuPXQuX2ZydXN0dW0sbz10Ll9vcmlnaW4scj10Ll9vcmllbnRhdGlvbixpPXQuX2RyYXdOZWFyUGxhbmUscz10Ll92ZXJ0ZXhGb3JtYXQsZj1pPzY6NSx1PW5ldyBGbG9hdDY0QXJyYXkoMyo0KjYpO2djLl9jb21wdXRlTmVhckZhclBsYW5lcyhvLHIsZSxuLHUpO2xldCBjPTMqNCoyO3VbY109dVszKjRdLHVbYysxXT11WzMqNCsxXSx1W2MrMl09dVszKjQrMl0sdVtjKzNdPXVbMF0sdVtjKzRdPXVbMV0sdVtjKzVdPXVbMl0sdVtjKzZdPXVbMyozXSx1W2MrN109dVszKjMrMV0sdVtjKzhdPXVbMyozKzJdLHVbYys5XT11WzMqN10sdVtjKzEwXT11WzMqNysxXSx1W2MrMTFdPXVbMyo3KzJdLGMrPTMqNCx1W2NdPXVbMyo1XSx1W2MrMV09dVszKjUrMV0sdVtjKzJdPXVbMyo1KzJdLHVbYyszXT11WzNdLHVbYys0XT11WzRdLHVbYys1XT11WzVdLHVbYys2XT11WzBdLHVbYys3XT11WzFdLHVbYys4XT11WzJdLHVbYys5XT11WzMqNF0sdVtjKzEwXT11WzMqNCsxXSx1W2MrMTFdPXVbMyo0KzJdLGMrPTMqNCx1W2NdPXVbM10sdVtjKzFdPXVbNF0sdVtjKzJdPXVbNV0sdVtjKzNdPXVbMyo1XSx1W2MrNF09dVszKjUrMV0sdVtjKzVdPXVbMyo1KzJdLHVbYys2XT11WzMqNl0sdVtjKzddPXVbMyo2KzFdLHVbYys4XT11WzMqNisyXSx1W2MrOV09dVszKjJdLHVbYysxMF09dVszKjIrMV0sdVtjKzExXT11WzMqMisyXSxjKz0zKjQsdVtjXT11WzMqMl0sdVtjKzFdPXVbMyoyKzFdLHVbYysyXT11WzMqMisyXSx1W2MrM109dVszKjZdLHVbYys0XT11WzMqNisxXSx1W2MrNV09dVszKjYrMl0sdVtjKzZdPXVbMyo3XSx1W2MrN109dVszKjcrMV0sdVtjKzhdPXVbMyo3KzJdLHVbYys5XT11WzMqM10sdVtjKzEwXT11WzMqMysxXSx1W2MrMTFdPXVbMyozKzJdLGl8fCh1PXUuc3ViYXJyYXkoMyo0KSk7bGV0IGw9bmV3IGllKHtwb3NpdGlvbjpuZXcgaXQoe2NvbXBvbmVudERhdGF0eXBlOm50LkRPVUJMRSxjb21wb25lbnRzUGVyQXR0cmlidXRlOjMsdmFsdWVzOnV9KX0pO2lmKGgocy5ub3JtYWwpfHxoKHMudGFuZ2VudCl8fGgocy5iaXRhbmdlbnQpfHxoKHMuc3QpKXtsZXQgZD1oKHMubm9ybWFsKT9uZXcgRmxvYXQzMkFycmF5KDEyKmYpOnZvaWQgMCxtPWgocy50YW5nZW50KT9uZXcgRmxvYXQzMkFycmF5KDMqNCpmKTp2b2lkIDAsXz1oKHMuYml0YW5nZW50KT9uZXcgRmxvYXQzMkFycmF5KDMqNCpmKTp2b2lkIDAsZz1oKHMuc3QpP25ldyBGbG9hdDMyQXJyYXkoMio0KmYpOnZvaWQgMCxiPVBPLFQ9TU8sTz1OTyxFPWEubmVnYXRlKGIsV0wpLHc9YS5uZWdhdGUoVCxYTCksQz1hLm5lZ2F0ZShPLFlMKTtjPTAsaSYmKEVhKGMsZCxtLF8sZyxDLGIsVCksYys9Myo0KSxFYShjLGQsbSxfLGcsTyxFLFQpLGMrPTMqNCxFYShjLGQsbSxfLGcsRSxDLFQpLGMrPTMqNCxFYShjLGQsbSxfLGcsdyxDLEUpLGMrPTMqNCxFYShjLGQsbSxfLGcsYixPLFQpLGMrPTMqNCxFYShjLGQsbSxfLGcsVCxPLEUpLGgoZCkmJihsLm5vcm1hbD1uZXcgaXQoe2NvbXBvbmVudERhdGF0eXBlOm50LkZMT0FULGNvbXBvbmVudHNQZXJBdHRyaWJ1dGU6Myx2YWx1ZXM6ZH0pKSxoKG0pJiYobC50YW5nZW50PW5ldyBpdCh7Y29tcG9uZW50RGF0YXR5cGU6bnQuRkxPQVQsY29tcG9uZW50c1BlckF0dHJpYnV0ZTozLHZhbHVlczptfSkpLGgoXykmJihsLmJpdGFuZ2VudD1uZXcgaXQoe2NvbXBvbmVudERhdGF0eXBlOm50LkZMT0FULGNvbXBvbmVudHNQZXJBdHRyaWJ1dGU6Myx2YWx1ZXM6X30pKSxoKGcpJiYobC5zdD1uZXcgaXQoe2NvbXBvbmVudERhdGF0eXBlOm50LkZMT0FULGNvbXBvbmVudHNQZXJBdHRyaWJ1dGU6Mix2YWx1ZXM6Z30pKX1sZXQgcD1uZXcgVWludDE2QXJyYXkoNipmKTtmb3IobGV0IGQ9MDtkPGY7KytkKXtsZXQgbT1kKjYsXz1kKjQ7cFttXT1fLHBbbSsxXT1fKzEscFttKzJdPV8rMixwW20rM109XyxwW20rNF09XysyLHBbbSs1XT1fKzN9cmV0dXJuIG5ldyBVdCh7YXR0cmlidXRlczpsLGluZGljZXM6cCxwcmltaXRpdmVUeXBlOkJ0LlRSSUFOR0xFUyxib3VuZGluZ1NwaGVyZTpBdC5mcm9tVmVydGljZXModSl9KX07V2Y9Z2N9KTt2YXIgRF89e307ZGUoRF8se2RlZmF1bHQ6KCk9PlpMfSk7ZnVuY3Rpb24gJEwodCxlKXtyZXR1cm4gaChlKSYmKHQ9V2YudW5wYWNrKHQsZSkpLFdmLmNyZWF0ZUdlb21ldHJ5KHQpfXZhciBaTCxGXz1aKCgpPT57ZnQoKTtMXygpO1pMPSRMfSk7ZnVuY3Rpb24gWGYodCl7eS50eXBlT2Yub2JqZWN0KCJvcHRpb25zIix0KSx5LnR5cGVPZi5vYmplY3QoIm9wdGlvbnMuZnJ1c3R1bSIsdC5mcnVzdHVtKSx5LnR5cGVPZi5vYmplY3QoIm9wdGlvbnMub3JpZ2luIix0Lm9yaWdpbikseS50eXBlT2Yub2JqZWN0KCJvcHRpb25zLm9yaWVudGF0aW9uIix0Lm9yaWVudGF0aW9uKTtsZXQgZT10LmZydXN0dW0sbj10Lm9yaWVudGF0aW9uLG89dC5vcmlnaW4scj14KHQuX2RyYXdOZWFyUGxhbmUsITApLGkscztlIGluc3RhbmNlb2YgUG8/KGk9Ql8scz1Qby5wYWNrZWRMZW5ndGgpOmUgaW5zdGFuY2VvZiB4byYmKGk9UUwscz14by5wYWNrZWRMZW5ndGgpLHRoaXMuX2ZydXN0dW1UeXBlPWksdGhpcy5fZnJ1c3R1bT1lLmNsb25lKCksdGhpcy5fb3JpZ2luPWEuY2xvbmUobyksdGhpcy5fb3JpZW50YXRpb249ZWUuY2xvbmUobiksdGhpcy5fZHJhd05lYXJQbGFuZT1yLHRoaXMuX3dvcmtlck5hbWU9ImNyZWF0ZUZydXN0dW1PdXRsaW5lR2VvbWV0cnkiLHRoaXMucGFja2VkTGVuZ3RoPTIrcythLnBhY2tlZExlbmd0aCtlZS5wYWNrZWRMZW5ndGh9dmFyIEJfLFFMLEpMLHRELGVELG5ELFVfLHZPPVooKCk9Pnt2ZSgpO0Z0KCk7WHQoKTtGZSgpO0l0KCk7ZnQoKTtMXygpO1hlKCk7WWUoKTthbigpO01fKCk7SV8oKTt0bigpO0tvKCk7Ql89MCxRTD0xO1hmLnBhY2s9ZnVuY3Rpb24odCxlLG4pe3kudHlwZU9mLm9iamVjdCgidmFsdWUiLHQpLHkuZGVmaW5lZCgiYXJyYXkiLGUpLG49eChuLDApO2xldCBvPXQuX2ZydXN0dW1UeXBlLHI9dC5fZnJ1c3R1bTtyZXR1cm4gZVtuKytdPW8sbz09PUJfPyhQby5wYWNrKHIsZSxuKSxuKz1Qby5wYWNrZWRMZW5ndGgpOih4by5wYWNrKHIsZSxuKSxuKz14by5wYWNrZWRMZW5ndGgpLGEucGFjayh0Ll9vcmlnaW4sZSxuKSxuKz1hLnBhY2tlZExlbmd0aCxlZS5wYWNrKHQuX29yaWVudGF0aW9uLGUsbiksbis9ZWUucGFja2VkTGVuZ3RoLGVbbl09dC5fZHJhd05lYXJQbGFuZT8xOjAsZX07Skw9bmV3IFBvLHREPW5ldyB4byxlRD1uZXcgZWUsbkQ9bmV3IGE7WGYudW5wYWNrPWZ1bmN0aW9uKHQsZSxuKXt5LmRlZmluZWQoImFycmF5Iix0KSxlPXgoZSwwKTtsZXQgbz10W2UrK10scjtvPT09Ql8/KHI9UG8udW5wYWNrKHQsZSxKTCksZSs9UG8ucGFja2VkTGVuZ3RoKToocj14by51bnBhY2sodCxlLHREKSxlKz14by5wYWNrZWRMZW5ndGgpO2xldCBpPWEudW5wYWNrKHQsZSxuRCk7ZSs9YS5wYWNrZWRMZW5ndGg7bGV0IHM9ZWUudW5wYWNrKHQsZSxlRCk7ZSs9ZWUucGFja2VkTGVuZ3RoO2xldCBmPXRbZV09PT0xO2lmKCFoKG4pKXJldHVybiBuZXcgWGYoe2ZydXN0dW06cixvcmlnaW46aSxvcmllbnRhdGlvbjpzLF9kcmF3TmVhclBsYW5lOmZ9KTtsZXQgdT1vPT09bi5fZnJ1c3R1bVR5cGU/bi5fZnJ1c3R1bTp2b2lkIDA7cmV0dXJuIG4uX2ZydXN0dW09ci5jbG9uZSh1KSxuLl9mcnVzdHVtVHlwZT1vLG4uX29yaWdpbj1hLmNsb25lKGksbi5fb3JpZ2luKSxuLl9vcmllbnRhdGlvbj1lZS5jbG9uZShzLG4uX29yaWVudGF0aW9uKSxuLl9kcmF3TmVhclBsYW5lPWYsbn07WGYuY3JlYXRlR2VvbWV0cnk9ZnVuY3Rpb24odCl7bGV0IGU9dC5fZnJ1c3R1bVR5cGUsbj10Ll9mcnVzdHVtLG89dC5fb3JpZ2luLHI9dC5fb3JpZW50YXRpb24saT10Ll9kcmF3TmVhclBsYW5lLHM9bmV3IEZsb2F0NjRBcnJheSgzKjQqMik7V2YuX2NvbXB1dGVOZWFyRmFyUGxhbmVzKG8scixlLG4scyk7bGV0IGY9bmV3IGllKHtwb3NpdGlvbjpuZXcgaXQoe2NvbXBvbmVudERhdGF0eXBlOm50LkRPVUJMRSxjb21wb25lbnRzUGVyQXR0cmlidXRlOjMsdmFsdWVzOnN9KX0pLHUsYyxsPWk/MjoxLHA9bmV3IFVpbnQxNkFycmF5KDgqKGwrMSkpLGQ9aT8wOjE7Zm9yKDtkPDI7KytkKXU9aT9kKjg6MCxjPWQqNCxwW3VdPWMscFt1KzFdPWMrMSxwW3UrMl09YysxLHBbdSszXT1jKzIscFt1KzRdPWMrMixwW3UrNV09YyszLHBbdSs2XT1jKzMscFt1KzddPWM7Zm9yKGQ9MDtkPDI7KytkKXU9KGwrZCkqOCxjPWQqNCxwW3VdPWMscFt1KzFdPWMrNCxwW3UrMl09YysxLHBbdSszXT1jKzUscFt1KzRdPWMrMixwW3UrNV09Yys2LHBbdSs2XT1jKzMscFt1KzddPWMrNztyZXR1cm4gbmV3IFV0KHthdHRyaWJ1dGVzOmYsaW5kaWNlczpwLHByaW1pdGl2ZVR5cGU6QnQuTElORVMsYm91bmRpbmdTcGhlcmU6QXQuZnJvbVZlcnRpY2VzKHMpfSl9O1VfPVhmfSk7dmFyIFZfPXt9O2RlKFZfLHtkZWZhdWx0OigpPT5yRH0pO2Z1bmN0aW9uIG9EKHQsZSl7cmV0dXJuIGgoZSkmJih0PVVfLnVucGFjayh0LGUpKSxVXy5jcmVhdGVHZW9tZXRyeSh0KX12YXIgckQsa189WigoKT0+e2Z0KCk7dk8oKTtyRD1vRH0pO2Z1bmN0aW9uIHdzKHQpe3Q9eCh0LHguRU1QVFlfT0JKRUNUKSx0aGlzLl9lbGxpcHNvaWQ9eCh0LmVsbGlwc29pZCwkLmRlZmF1bHQpLHRoaXMuX3JlY3RhbmdsZT14KHQucmVjdGFuZ2xlLE50Lk1BWF9WQUxVRSksdGhpcy5fcHJvamVjdGlvbj1uZXcgSm4odGhpcy5fZWxsaXBzb2lkKSx0aGlzLl9udW1iZXJPZkxldmVsWmVyb1RpbGVzWD14KHQubnVtYmVyT2ZMZXZlbFplcm9UaWxlc1gsMiksdGhpcy5fbnVtYmVyT2ZMZXZlbFplcm9UaWxlc1k9eCh0Lm51bWJlck9mTGV2ZWxaZXJvVGlsZXNZLDEpfXZhciBMTyxETz1aKCgpPT57VWUoKTtYdCgpO0l0KCk7ZnQoKTtadCgpO1NpKCk7V3QoKTt3bigpO09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHdzLnByb3RvdHlwZSx7ZWxsaXBzb2lkOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZWxsaXBzb2lkfX0scmVjdGFuZ2xlOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcmVjdGFuZ2xlfX0scHJvamVjdGlvbjp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3Byb2plY3Rpb259fX0pO3dzLnByb3RvdHlwZS5nZXROdW1iZXJPZlhUaWxlc0F0TGV2ZWw9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX251bWJlck9mTGV2ZWxaZXJvVGlsZXNYPDx0fTt3cy5wcm90b3R5cGUuZ2V0TnVtYmVyT2ZZVGlsZXNBdExldmVsPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9udW1iZXJPZkxldmVsWmVyb1RpbGVzWTw8dH07d3MucHJvdG90eXBlLnJlY3RhbmdsZVRvTmF0aXZlUmVjdGFuZ2xlPWZ1bmN0aW9uKHQsZSl7eS5kZWZpbmVkKCJyZWN0YW5nbGUiLHQpO2xldCBuPU0udG9EZWdyZWVzKHQud2VzdCksbz1NLnRvRGVncmVlcyh0LnNvdXRoKSxyPU0udG9EZWdyZWVzKHQuZWFzdCksaT1NLnRvRGVncmVlcyh0Lm5vcnRoKTtyZXR1cm4gaChlKT8oZS53ZXN0PW4sZS5zb3V0aD1vLGUuZWFzdD1yLGUubm9ydGg9aSxlKTpuZXcgTnQobixvLHIsaSl9O3dzLnByb3RvdHlwZS50aWxlWFlUb05hdGl2ZVJlY3RhbmdsZT1mdW5jdGlvbih0LGUsbixvKXtsZXQgcj10aGlzLnRpbGVYWVRvUmVjdGFuZ2xlKHQsZSxuLG8pO3JldHVybiByLndlc3Q9TS50b0RlZ3JlZXMoci53ZXN0KSxyLnNvdXRoPU0udG9EZWdyZWVzKHIuc291dGgpLHIuZWFzdD1NLnRvRGVncmVlcyhyLmVhc3QpLHIubm9ydGg9TS50b0RlZ3JlZXMoci5ub3J0aCkscn07d3MucHJvdG90eXBlLnRpbGVYWVRvUmVjdGFuZ2xlPWZ1bmN0aW9uKHQsZSxuLG8pe2xldCByPXRoaXMuX3JlY3RhbmdsZSxpPXRoaXMuZ2V0TnVtYmVyT2ZYVGlsZXNBdExldmVsKG4pLHM9dGhpcy5nZXROdW1iZXJPZllUaWxlc0F0TGV2ZWwobiksZj1yLndpZHRoL2ksdT10KmYrci53ZXN0LGM9KHQrMSkqZityLndlc3QsbD1yLmhlaWdodC9zLHA9ci5ub3J0aC1lKmwsZD1yLm5vcnRoLShlKzEpKmw7cmV0dXJuIGgobyl8fChvPW5ldyBOdCh1LGQsYyxwKSksby53ZXN0PXUsby5zb3V0aD1kLG8uZWFzdD1jLG8ubm9ydGg9cCxvfTt3cy5wcm90b3R5cGUucG9zaXRpb25Ub1RpbGVYWT1mdW5jdGlvbih0LGUsbil7bGV0IG89dGhpcy5fcmVjdGFuZ2xlO2lmKCFOdC5jb250YWlucyhvLHQpKXJldHVybjtsZXQgcj10aGlzLmdldE51bWJlck9mWFRpbGVzQXRMZXZlbChlKSxpPXRoaXMuZ2V0TnVtYmVyT2ZZVGlsZXNBdExldmVsKGUpLHM9by53aWR0aC9yLGY9by5oZWlnaHQvaSx1PXQubG9uZ2l0dWRlO28uZWFzdDxvLndlc3QmJih1Kz1NLlRXT19QSSk7bGV0IGM9KHUtby53ZXN0KS9zfDA7Yz49ciYmKGM9ci0xKTtsZXQgbD0oby5ub3J0aC10LmxhdGl0dWRlKS9mfDA7cmV0dXJuIGw+PWkmJihsPWktMSksaChuKT8obi54PWMsbi55PWwsbik6bmV3IHR0KGMsbCl9O0xPPXdzfSk7ZnVuY3Rpb24ga08odCl7Y3QuZnJvbVJhZGlhbnModC5lYXN0LHQubm9ydGgsMCxZZlswXSksY3QuZnJvbVJhZGlhbnModC53ZXN0LHQubm9ydGgsMCxZZlsxXSksY3QuZnJvbVJhZGlhbnModC5lYXN0LHQuc291dGgsMCxZZlsyXSksY3QuZnJvbVJhZGlhbnModC53ZXN0LHQuc291dGgsMCxZZlszXSk7bGV0IGU9MCxuPTAsbz0wLHI9MCxpPVBuLl90ZXJyYWluSGVpZ2h0c01heExldmVsLHM7Zm9yKHM9MDtzPD1pOysrcyl7bGV0IGY9ITE7Zm9yKGxldCB1PTA7dTw0OysrdSl7bGV0IGM9WWZbdV07aWYoc0QucG9zaXRpb25Ub1RpbGVYWShjLHMsJGYpLHU9PT0wKW89JGYueCxyPSRmLnk7ZWxzZSBpZihvIT09JGYueHx8ciE9PSRmLnkpe2Y9ITA7YnJlYWt9fWlmKGYpYnJlYWs7ZT1vLG49cn1pZihzIT09MClyZXR1cm57eDplLHk6bixsZXZlbDpzPmk/aTpzLTF9fXZhciBGTyxCTyxVTyxHXyxpRCxWTyxzRCxZZiwkZixQbixSZCx6Xz1aKCgpPT57dmUoKTtYbSgpO1VlKCk7RnQoKTtJZSgpO1h0KCk7SXQoKTtmdCgpO0h0KCk7WnQoKTtETygpO3duKCk7ZGYoKTtGTz1uZXcgYSxCTz1uZXcgYSxVTz1uZXcgY3QsR189bmV3IGEsaUQ9bmV3IGEsVk89bmV3IEF0LHNEPW5ldyBMTyxZZj1bbmV3IGN0LG5ldyBjdCxuZXcgY3QsbmV3IGN0XSwkZj1uZXcgdHQsUG49e307UG4uaW5pdGlhbGl6ZT1mdW5jdGlvbigpe2xldCB0PVBuLl9pbml0UHJvbWlzZTtyZXR1cm4gaCh0KXx8KHQ9b2kuZmV0Y2hKc29uKGdwKCJBc3NldHMvYXBwcm94aW1hdGVUZXJyYWluSGVpZ2h0cy5qc29uIikpLnRoZW4oZnVuY3Rpb24oZSl7UG4uX3RlcnJhaW5IZWlnaHRzPWV9KSxQbi5faW5pdFByb21pc2U9dCksdH07UG4uZ2V0TWluaW11bU1heGltdW1IZWlnaHRzPWZ1bmN0aW9uKHQsZSl7aWYoeS5kZWZpbmVkKCJyZWN0YW5nbGUiLHQpLCFoKFBuLl90ZXJyYWluSGVpZ2h0cykpdGhyb3cgbmV3IEIoIllvdSBtdXN0IGNhbGwgQXBwcm94aW1hdGVUZXJyYWluSGVpZ2h0cy5pbml0aWFsaXplIGFuZCB3YWl0IGZvciB0aGUgcHJvbWlzZSB0byByZXNvbHZlIGJlZm9yZSB1c2luZyB0aGlzIGZ1bmN0aW9uIik7ZT14KGUsJC5kZWZhdWx0KTtsZXQgbj1rTyh0KSxvPVBuLl9kZWZhdWx0TWluVGVycmFpbkhlaWdodCxyPVBuLl9kZWZhdWx0TWF4VGVycmFpbkhlaWdodDtpZihoKG4pKXtsZXQgaT1gJHtuLmxldmVsfS0ke24ueH0tJHtuLnl9YCxzPVBuLl90ZXJyYWluSGVpZ2h0c1tpXTtoKHMpJiYobz1zWzBdLHI9c1sxXSksZS5jYXJ0b2dyYXBoaWNUb0NhcnRlc2lhbihOdC5ub3J0aGVhc3QodCxVTyksRk8pLGUuY2FydG9ncmFwaGljVG9DYXJ0ZXNpYW4oTnQuc291dGh3ZXN0KHQsVU8pLEJPKSxhLm1pZHBvaW50KEJPLEZPLEdfKTtsZXQgZj1lLnNjYWxlVG9HZW9kZXRpY1N1cmZhY2UoR18saUQpO2lmKGgoZikpe2xldCB1PWEuZGlzdGFuY2UoR18sZik7bz1NYXRoLm1pbihvLC11KX1lbHNlIG89UG4uX2RlZmF1bHRNaW5UZXJyYWluSGVpZ2h0fXJldHVybiBvPU1hdGgubWF4KFBuLl9kZWZhdWx0TWluVGVycmFpbkhlaWdodCxvKSx7bWluaW11bVRlcnJhaW5IZWlnaHQ6byxtYXhpbXVtVGVycmFpbkhlaWdodDpyfX07UG4uZ2V0Qm91bmRpbmdTcGhlcmU9ZnVuY3Rpb24odCxlKXtpZih5LmRlZmluZWQoInJlY3RhbmdsZSIsdCksIWgoUG4uX3RlcnJhaW5IZWlnaHRzKSl0aHJvdyBuZXcgQigiWW91IG11c3QgY2FsbCBBcHByb3hpbWF0ZVRlcnJhaW5IZWlnaHRzLmluaXRpYWxpemUgYW5kIHdhaXQgZm9yIHRoZSBwcm9taXNlIHRvIHJlc29sdmUgYmVmb3JlIHVzaW5nIHRoaXMgZnVuY3Rpb24iKTtlPXgoZSwkLmRlZmF1bHQpO2xldCBuPWtPKHQpLG89UG4uX2RlZmF1bHRNYXhUZXJyYWluSGVpZ2h0O2lmKGgobikpe2xldCBpPWAke24ubGV2ZWx9LSR7bi54fS0ke24ueX1gLHM9UG4uX3RlcnJhaW5IZWlnaHRzW2ldO2gocykmJihvPXNbMV0pfWxldCByPUF0LmZyb21SZWN0YW5nbGUzRCh0LGUsMCk7cmV0dXJuIEF0LmZyb21SZWN0YW5nbGUzRCh0LGUsbyxWTyksQXQudW5pb24ocixWTyxyKX07UG4uX3RlcnJhaW5IZWlnaHRzTWF4TGV2ZWw9NjtQbi5fZGVmYXVsdE1heFRlcnJhaW5IZWlnaHQ9OWUzO1BuLl9kZWZhdWx0TWluVGVycmFpbkhlaWdodD0tMWU1O1BuLl90ZXJyYWluSGVpZ2h0cz12b2lkIDA7UG4uX2luaXRQcm9taXNlPXZvaWQgMDtPYmplY3QuZGVmaW5lUHJvcGVydGllcyhQbix7aW5pdGlhbGl6ZWQ6e2dldDpmdW5jdGlvbigpe3JldHVybiBoKFBuLl90ZXJyYWluSGVpZ2h0cyl9fX0pO1JkPVBufSk7ZnVuY3Rpb24gRXModCl7dD14KHQseC5FTVBUWV9PQkpFQ1QpO2xldCBlPXQucG9zaXRpb25zO2lmKCFoKGUpfHxlLmxlbmd0aDwyKXRocm93IG5ldyBCKCJBdCBsZWFzdCB0d28gcG9zaXRpb25zIGFyZSByZXF1aXJlZC4iKTtpZihoKHQuYXJjVHlwZSkmJnQuYXJjVHlwZSE9PV9lLkdFT0RFU0lDJiZ0LmFyY1R5cGUhPT1fZS5SSFVNQil0aHJvdyBuZXcgQigiVmFsaWQgb3B0aW9ucyBmb3IgYXJjVHlwZSBhcmUgQXJjVHlwZS5HRU9ERVNJQyBhbmQgQXJjVHlwZS5SSFVNQi4iKTt0aGlzLndpZHRoPXgodC53aWR0aCwxKSx0aGlzLl9wb3NpdGlvbnM9ZSx0aGlzLmdyYW51bGFyaXR5PXgodC5ncmFudWxhcml0eSw5OTk5KSx0aGlzLmxvb3A9eCh0Lmxvb3AsITEpLHRoaXMuYXJjVHlwZT14KHQuYXJjVHlwZSxfZS5HRU9ERVNJQyksdGhpcy5fZWxsaXBzb2lkPSQuZGVmYXVsdCx0aGlzLl9wcm9qZWN0aW9uSW5kZXg9MCx0aGlzLl93b3JrZXJOYW1lPSJjcmVhdGVHcm91bmRQb2x5bGluZUdlb21ldHJ5Iix0aGlzLl9zY2VuZTNET25seT0hMX1mdW5jdGlvbiBZXyh0LGUsbixvLHIpe2xldCBpPVVvKG8sdCwwLGFEKSxzPVVvKG8sdCxuLHpPKSxmPVVvKG8sZSwwLGpPKSx1PUhpKHMsaSx6TyksYz1IaShmLGksak8pO3JldHVybiBhLmNyb3NzKGMsdSxyKSxhLm5vcm1hbGl6ZShyLHIpfWZ1bmN0aW9uIGpfKHQsZSxuLG8scixpLHMsZix1LGMsbCl7aWYocj09PTApcmV0dXJuO2xldCBwO2k9PT1fZS5HRU9ERVNJQz9wPW5ldyBhZCh0LGUscyk6aT09PV9lLlJIVU1CJiYocD1uZXcgWm8odCxlLHMpKTtsZXQgZD1wLnN1cmZhY2VEaXN0YW5jZTtpZihkPHIpcmV0dXJuO2xldCBtPVlfKHQsZSxvLHMscEQpLF89TWF0aC5jZWlsKGQvciksZz1kL18sYj1nLFQ9Xy0xLE89Zi5sZW5ndGg7Zm9yKGxldCBFPTA7RTxUO0UrKyl7bGV0IHc9cC5pbnRlcnBvbGF0ZVVzaW5nU3VyZmFjZURpc3RhbmNlKGIsZkQpLEM9VW8ocyx3LG4sdUQpLE49VW8ocyx3LG8sbEQpO2EucGFjayhtLGYsTyksYS5wYWNrKEMsdSxPKSxhLnBhY2soTixjLE8pLGwucHVzaCh3LmxhdGl0dWRlKSxsLnB1c2gody5sb25naXR1ZGUpLE8rPTMsYis9Z319ZnVuY3Rpb24gVW8odCxlLG4sbyl7cmV0dXJuIGN0LmNsb25lKGUsSF8pLEhfLmhlaWdodD1uLGN0LnRvQ2FydGVzaWFuKEhfLHQsbyl9ZnVuY3Rpb24gSGkodCxlLG4pe3JldHVybiBhLnN1YnRyYWN0KHQsZSxuKSxhLm5vcm1hbGl6ZShuLG4pLG59ZnVuY3Rpb24gSE8odCxlLG4sbyl7cmV0dXJuIG89SGkodCxlLG8pLG89YS5jcm9zcyhvLG4sbyksbz1hLm5vcm1hbGl6ZShvLG8pLG89YS5jcm9zcyhuLG8sbyksb31mdW5jdGlvbiBxXyh0LGUsbixvLHIpe2xldCBpPUhpKG4sZSxmRSkscz1ITyh0LGUsaSxkRCksZj1ITyhvLGUsaSxtRCk7aWYoTS5lcXVhbHNFcHNpbG9uKGEuZG90KHMsZikseUQsTS5FUFNJTE9ONSkpcmV0dXJuIHI9YS5jcm9zcyhpLHMscikscj1hLm5vcm1hbGl6ZShyLHIpLHI7cj1hLmFkZChmLHMscikscj1hLm5vcm1hbGl6ZShyLHIpO2xldCB1PWEuY3Jvc3MoaSxyLGhEKTtyZXR1cm4gYS5kb3QoZix1KTxfRCYmKHI9YS5uZWdhdGUocixyKSkscn1mdW5jdGlvbiBXTyh0LGUsbixvKXtsZXQgcj1IaShuLGUsT0QpLGk9YS5kb3Qocix0KTtpZihpPnNFfHxpPEdPKXtsZXQgcz1IaShvLG4sZkUpLGY9aTxHTz9NLlBJX09WRVJfVFdPOi1NLlBJX09WRVJfVFdPLHU9ZWUuZnJvbUF4aXNBbmdsZShzLGYsUkQpLGM9US5mcm9tUXVhdGVybmlvbih1LEVEKTtyZXR1cm4gUS5tdWx0aXBseUJ5VmVjdG9yKGMsdCx0KSwhMH1yZXR1cm4hMX1mdW5jdGlvbiBaZih0LGUsbixvLHIpe2xldCBpPWN0LnRvQ2FydGVzaWFuKGUsdC5fZWxsaXBzb2lkLFNEKSxzPWEuYWRkKGksbixZTyksZj0hMSx1PXQuX2VsbGlwc29pZCxjPXUuY2FydGVzaWFuVG9DYXJ0b2dyYXBoaWMocyxYTyk7TWF0aC5hYnMoZS5sb25naXR1ZGUtYy5sb25naXR1ZGUpPk0uUElfT1ZFUl9UV08mJihmPSEwLHM9YS5zdWJ0cmFjdChpLG4sWU8pLGM9dS5jYXJ0ZXNpYW5Ub0NhcnRvZ3JhcGhpYyhzLFhPKSksYy5oZWlnaHQ9MDtsZXQgbD10LnByb2plY3QoYyxyKTtyZXR1cm4gcj1hLnN1YnRyYWN0KGwsbyxyKSxyLno9MCxyPWEubm9ybWFsaXplKHIsciksZiYmYS5uZWdhdGUocixyKSxyfWZ1bmN0aW9uIFpPKHQsZSxuLG8scixpKXtsZXQgcz1hLnN1YnRyYWN0KGUsdCxDRCk7YS5ub3JtYWxpemUocyxzKTtsZXQgZj1uLWNFLHU9YS5tdWx0aXBseUJ5U2NhbGFyKHMsZiwkTyk7YS5hZGQodCx1LHIpO2xldCBjPW8tYUU7dT1hLm11bHRpcGx5QnlTY2FsYXIocyxjLCRPKSxhLmFkZChlLHUsaSl9ZnVuY3Rpb24geGQodCxlKXtsZXQgbj1vbi5nZXRQb2ludERpc3RhbmNlKFBkLHQpLG89b24uZ2V0UG9pbnREaXN0YW5jZShQZCxlKSxyPXhEO00uZXF1YWxzRXBzaWxvbihuLDAsTS5FUFNJTE9OMik/KHI9SGkoZSx0LHIpLGEubXVsdGlwbHlCeVNjYWxhcihyLE0uRVBTSUxPTjIsciksYS5hZGQodCxyLHQpKTpNLmVxdWFsc0Vwc2lsb24obywwLE0uRVBTSUxPTjIpJiYocj1IaSh0LGUsciksYS5tdWx0aXBseUJ5U2NhbGFyKHIsTS5FUFNJTE9OMixyKSxhLmFkZChlLHIsZSkpfWZ1bmN0aW9uIFBEKHQsZSl7bGV0IG49TWF0aC5hYnModC5sb25naXR1ZGUpLG89TWF0aC5hYnMoZS5sb25naXR1ZGUpO2lmKE0uZXF1YWxzRXBzaWxvbihuLE0uUEksTS5FUFNJTE9OMTEpKXtsZXQgcj1NLnNpZ24oZS5sb25naXR1ZGUpO3JldHVybiB0LmxvbmdpdHVkZT1yKihuLU0uRVBTSUxPTjExKSwxfWVsc2UgaWYoTS5lcXVhbHNFcHNpbG9uKG8sTS5QSSxNLkVQU0lMT04xMSkpe2xldCByPU0uc2lnbih0LmxvbmdpdHVkZSk7cmV0dXJuIGUubG9uZ2l0dWRlPXIqKG8tTS5FUFNJTE9OMTEpLDJ9cmV0dXJuIDB9ZnVuY3Rpb24gWEQodCxlLG4sbyxyLGkscyl7bGV0IGYsdSxjPWUuX2VsbGlwc29pZCxsPW4ubGVuZ3RoLzMtMSxwPWwqOCxkPXAqNCxtPWwqMzYsXz1wPjY1NTM1P25ldyBVaW50MzJBcnJheShtKTpuZXcgVWludDE2QXJyYXkobSksZz1uZXcgRmxvYXQ2NEFycmF5KHAqMyksYj1uZXcgRmxvYXQzMkFycmF5KGQpLFQ9bmV3IEZsb2F0MzJBcnJheShkKSxPPW5ldyBGbG9hdDMyQXJyYXkoZCksRT1uZXcgRmxvYXQzMkFycmF5KGQpLHc9bmV3IEZsb2F0MzJBcnJheShkKSxDLE4sSSxEO3MmJihDPW5ldyBGbG9hdDMyQXJyYXkoZCksTj1uZXcgRmxvYXQzMkFycmF5KGQpLEk9bmV3IEZsb2F0MzJBcnJheShkKSxEPW5ldyBGbG9hdDMyQXJyYXkocCoyKSk7bGV0IHY9aS5sZW5ndGgvMixMPTAsVT11RTtVLmhlaWdodD0wO2xldCBBPWxFO0EuaGVpZ2h0PTA7bGV0IFM9UU8sUD1LXztpZihzKWZvcih1PTAsZj0xO2Y8djtmKyspVS5sYXRpdHVkZT1pW3VdLFUubG9uZ2l0dWRlPWlbdSsxXSxBLmxhdGl0dWRlPWlbdSsyXSxBLmxvbmdpdHVkZT1pW3UrM10sUz1lLnByb2plY3QoVSxTKSxQPWUucHJvamVjdChBLFApLEwrPWEuZGlzdGFuY2UoUyxQKSx1Kz0yO2xldCBGPW8ubGVuZ3RoLzM7UD1hLnVucGFjayhvLDAsUCk7bGV0IGo9MDtmb3IodT0zLGY9MTtmPEY7ZisrKVM9YS5jbG9uZShQLFMpLFA9YS51bnBhY2sobyx1LFApLGorPWEuZGlzdGFuY2UoUyxQKSx1Kz0zO2xldCBIO3U9MztsZXQgaz0wLEs9MCxYPTAsUj0wLG90PSExLGF0PWEudW5wYWNrKG4sMCx0RSkscHQ9YS51bnBhY2sobywwLEtfKSx5dD1hLnVucGFjayhyLDAsZUUpO2lmKHQpe2xldCB6dD1hLnVucGFjayhuLG4ubGVuZ3RoLTYsSk8pO1dPKHl0LHp0LGF0LHB0KSYmKHl0PWEubmVnYXRlKHl0LHl0KSl9bGV0IHJ0PTAsUHQ9MCxndD0wO2ZvcihmPTA7ZjxsO2YrKyl7bGV0IHp0PWEuY2xvbmUoYXQsSk8pLG1lPWEuY2xvbmUocHQsUU8pLGNlPWEuY2xvbmUoeXQsTUQpO290JiYoY2U9YS5uZWdhdGUoY2UsY2UpKSxhdD1hLnVucGFjayhuLHUsdEUpLHB0PWEudW5wYWNrKG8sdSxLXykseXQ9YS51bnBhY2socix1LGVFKSxvdD1XTyh5dCx6dCxhdCxwdCksVS5sYXRpdHVkZT1pW2tdLFUubG9uZ2l0dWRlPWlbaysxXSxBLmxhdGl0dWRlPWlbaysyXSxBLmxvbmdpdHVkZT1pW2srM107bGV0IHBlLHVlLFF0LEp0O2lmKHMpe2xldCBMZT1QRChVLEEpO3BlPWUucHJvamVjdChVLEJEKSx1ZT1lLnByb2plY3QoQSxVRCk7bGV0IERuPUhpKHVlLHBlLG9FKTtEbi55PU1hdGguYWJzKERuLnkpLFF0PVdfLEp0PVhfLExlPT09MHx8YS5kb3QoRG4sYS5VTklUX1kpPnNFPyhRdD1aZihlLFUsY2UscGUsV18pLEp0PVpmKGUsQSx5dCx1ZSxYXykpOkxlPT09MT8oSnQ9WmYoZSxBLHl0LHVlLFhfKSxRdC54PTAsUXQueT1NLnNpZ24oVS5sb25naXR1ZGUtTWF0aC5hYnMoQS5sb25naXR1ZGUpKSxRdC56PTApOihRdD1aZihlLFUsY2UscGUsV18pLEp0Lng9MCxKdC55PU0uc2lnbihVLmxvbmdpdHVkZS1BLmxvbmdpdHVkZSksSnQuej0wKX1sZXQgTmU9YS5kaXN0YW5jZShtZSxwdCksZ2U9WnMuZnJvbUNhcnRlc2lhbih6dCxIRCksRWU9YS5zdWJ0cmFjdChhdCx6dCxWRCksdW49YS5ub3JtYWxpemUoRWUsbkUpLGtlPWEuc3VidHJhY3QobWUsenQsa0QpO2tlPWEubm9ybWFsaXplKGtlLGtlKTtsZXQgYmU9YS5jcm9zcyh1bixrZSxuRSk7YmU9YS5ub3JtYWxpemUoYmUsYmUpO2xldCBsbj1hLmNyb3NzKGtlLGNlLHpEKTtsbj1hLm5vcm1hbGl6ZShsbixsbik7bGV0IHBuPWEuc3VidHJhY3QocHQsYXQsR0QpO3BuPWEubm9ybWFsaXplKHBuLHBuKTtsZXQgRW49YS5jcm9zcyh5dCxwbixqRCk7RW49YS5ub3JtYWxpemUoRW4sRW4pO2xldCByZT1OZS9qLCR0PXJ0L2osR2U9MCxkbixzbixtbixmbz0wLEhuPTA7aWYocyl7R2U9YS5kaXN0YW5jZShwZSx1ZSksZG49WnMuZnJvbUNhcnRlc2lhbihwZSxxRCksc249YS5zdWJ0cmFjdCh1ZSxwZSxvRSksbW49YS5ub3JtYWxpemUoc24sS0QpO2xldCBMZT1tbi54O21uLng9bW4ueSxtbi55PS1MZSxmbz1HZS9MLEhuPVB0L0x9Zm9yKEg9MDtIPDg7SCsrKXtsZXQgTGU9UitIKjQsRG49SytIKjIsV249TGUrMyx6bz1IPDQ/MTotMSxybj1IPT09Mnx8SD09PTN8fEg9PT02fHxIPT09Nz8xOi0xO2EucGFjayhnZS5oaWdoLGIsTGUpLGJbV25dPUVlLngsYS5wYWNrKGdlLmxvdyxULExlKSxUW1duXT1FZS55LGEucGFjayhsbixPLExlKSxPW1duXT1FZS56LGEucGFjayhFbixFLExlKSxFW1duXT1yZSp6byxhLnBhY2soYmUsdyxMZSk7bGV0IFJuPSR0KnJuO1JuPT09MCYmcm48MCYmKFJuPTkpLHdbV25dPVJuLHMmJihDW0xlXT1kbi5oaWdoLngsQ1tMZSsxXT1kbi5oaWdoLnksQ1tMZSsyXT1kbi5sb3cueCxDW0xlKzNdPWRuLmxvdy55LElbTGVdPS1RdC55LElbTGUrMV09UXQueCxJW0xlKzJdPUp0LnksSVtMZSszXT0tSnQueCxOW0xlXT1zbi54LE5bTGUrMV09c24ueSxOW0xlKzJdPW1uLngsTltMZSszXT1tbi55LERbRG5dPWZvKnpvLFJuPUhuKnJuLFJuPT09MCYmcm48MCYmKFJuPTkpLERbRG4rMV09Um4pfWxldCBaZT1ERCxjbj1GRCxLZT12RCxobj1MRCx1bz1OdC5mcm9tQ2FydG9ncmFwaGljQXJyYXkoTkQsSUQpLHFuPVJkLmdldE1pbmltdW1NYXhpbXVtSGVpZ2h0cyh1byxjKSxLbj1xbi5taW5pbXVtVGVycmFpbkhlaWdodCxsbz1xbi5tYXhpbXVtVGVycmFpbkhlaWdodDtndCs9TWF0aC5hYnMoS24pLGd0Kz1NYXRoLmFicyhsbyksWk8oenQsbWUsS24sbG8sWmUsS2UpLFpPKGF0LHB0LEtuLGxvLGNuLGhuKTtsZXQgemU9YS5tdWx0aXBseUJ5U2NhbGFyKGJlLE0uRVBTSUxPTjUsckUpO2EuYWRkKFplLHplLFplKSxhLmFkZChjbix6ZSxjbiksYS5hZGQoS2UsemUsS2UpLGEuYWRkKGhuLHplLGhuKSx4ZChaZSxjbikseGQoS2UsaG4pLGEucGFjayhaZSxnLFgpLGEucGFjayhjbixnLFgrMyksYS5wYWNrKGhuLGcsWCs2KSxhLnBhY2soS2UsZyxYKzkpLHplPWEubXVsdGlwbHlCeVNjYWxhcihiZSwtMipNLkVQU0lMT041LHJFKSxhLmFkZChaZSx6ZSxaZSksYS5hZGQoY24semUsY24pLGEuYWRkKEtlLHplLEtlKSxhLmFkZChobix6ZSxobikseGQoWmUsY24pLHhkKEtlLGhuKSxhLnBhY2soWmUsZyxYKzEyKSxhLnBhY2soY24sZyxYKzE1KSxhLnBhY2soaG4sZyxYKzE4KSxhLnBhY2soS2UsZyxYKzIxKSxrKz0yLHUrPTMsSys9MTYsWCs9MjQsUis9MzIscnQrPU5lLFB0Kz1HZX11PTA7bGV0IEN0PTA7Zm9yKGY9MDtmPGw7ZisrKXtmb3IoSD0wO0g8aUU7SCsrKV9bdStIXT1wRVtIXStDdDtDdCs9OCx1Kz1pRX1sZXQgbXQ9V0Q7QXQuZnJvbVZlcnRpY2VzKG4sYS5aRVJPLDMsbXRbMF0pLEF0LmZyb21WZXJ0aWNlcyhvLGEuWkVSTywzLG10WzFdKTtsZXQgdXQ9QXQuZnJvbUJvdW5kaW5nU3BoZXJlcyhtdCk7dXQucmFkaXVzKz1ndC8obCoyKTtsZXQgdnQ9e3Bvc2l0aW9uOm5ldyBpdCh7Y29tcG9uZW50RGF0YXR5cGU6bnQuRE9VQkxFLGNvbXBvbmVudHNQZXJBdHRyaWJ1dGU6Myxub3JtYWxpemU6ITEsdmFsdWVzOmd9KSxzdGFydEhpQW5kRm9yd2FyZE9mZnNldFg6T3MoYiksc3RhcnRMb0FuZEZvcndhcmRPZmZzZXRZOk9zKFQpLHN0YXJ0Tm9ybWFsQW5kRm9yd2FyZE9mZnNldFo6T3MoTyksZW5kTm9ybWFsQW5kVGV4dHVyZUNvb3JkaW5hdGVOb3JtYWxpemF0aW9uWDpPcyhFKSxyaWdodE5vcm1hbEFuZFRleHR1cmVDb29yZGluYXRlTm9ybWFsaXphdGlvblk6T3Modyl9O3JldHVybiBzJiYodnQuc3RhcnRIaUxvMkQ9T3MoQyksdnQub2Zmc2V0QW5kUmlnaHQyRD1PcyhOKSx2dC5zdGFydEVuZE5vcm1hbHMyRD1PcyhJKSx2dC50ZXhjb29yZE5vcm1hbGl6YXRpb24yRD1uZXcgaXQoe2NvbXBvbmVudERhdGF0eXBlOm50LkZMT0FULGNvbXBvbmVudHNQZXJBdHRyaWJ1dGU6Mixub3JtYWxpemU6ITEsdmFsdWVzOkR9KSksbmV3IFV0KHthdHRyaWJ1dGVzOnZ0LGluZGljZXM6Xyxib3VuZGluZ1NwaGVyZTp1dH0pfWZ1bmN0aW9uIE9zKHQpe3JldHVybiBuZXcgaXQoe2NvbXBvbmVudERhdGF0eXBlOm50LkZMT0FULGNvbXBvbmVudHNQZXJBdHRyaWJ1dGU6NCxub3JtYWxpemU6ITEsdmFsdWVzOnR9KX12YXIgJF8sY0Qsc0UsR08sY0UsYUUsYUQsek8sak8sZkQsdUQsbEQscEQsSF8sZEQsbUQsaEQsZkUsX0QseUQsUGQsZ0QsQUQsYkQsVEQsd0QsU2QsQ2QscU8sS08sT0QsRUQsUkQsWE8sU0QsWU8sQ0QsJE8seEQsdUUsbEUsUU8sS18sSk8sdEUsTUQsZUUsTkQsSUQsdkQsTEQsREQsRkQsQkQsVUQsV18sWF8sVkQsa0QsR0QsbkUsekQsakQsSEQscUQsb0UsS0QsckUsV0QscEUsaUUsWl8sZEU9WigoKT0+e3pfKCk7ZmMoKTtqcigpO3ZlKCk7RnQoKTtJZSgpO1h0KCk7RmUoKTtJdCgpO2Z0KCk7SHQoKTtadCgpO2owKCk7TWYoKTtCaCgpO1NpKCk7WGUoKTtZZSgpO3RjKCk7V3QoKTtCbigpO2ZzKCk7S28oKTt3bigpO2ljKCk7JF89W0puLG5vXSxjRD0kXy5sZW5ndGgsc0U9TWF0aC5jb3MoTS50b1JhZGlhbnMoMzApKSxHTz1NYXRoLmNvcyhNLnRvUmFkaWFucygxNTApKSxjRT0wLGFFPTFlMztPYmplY3QuZGVmaW5lUHJvcGVydGllcyhFcy5wcm90b3R5cGUse3BhY2tlZExlbmd0aDp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIDErdGhpcy5fcG9zaXRpb25zLmxlbmd0aCozKzErMSsxKyQucGFja2VkTGVuZ3RoKzErMX19fSk7RXMuc2V0UHJvamVjdGlvbkFuZEVsbGlwc29pZD1mdW5jdGlvbih0LGUpe2xldCBuPTA7Zm9yKGxldCBvPTA7bzxjRDtvKyspaWYoZSBpbnN0YW5jZW9mICRfW29dKXtuPW87YnJlYWt9dC5fcHJvamVjdGlvbkluZGV4PW4sdC5fZWxsaXBzb2lkPWUuZWxsaXBzb2lkfTthRD1uZXcgYSx6Tz1uZXcgYSxqTz1uZXcgYTtmRD1uZXcgY3QsdUQ9bmV3IGEsbEQ9bmV3IGEscEQ9bmV3IGE7SF89bmV3IGN0O0VzLnBhY2s9ZnVuY3Rpb24odCxlLG4pe3kudHlwZU9mLm9iamVjdCgidmFsdWUiLHQpLHkuZGVmaW5lZCgiYXJyYXkiLGUpO2xldCBvPXgobiwwKSxyPXQuX3Bvc2l0aW9ucyxpPXIubGVuZ3RoO2VbbysrXT1pO2ZvcihsZXQgcz0wO3M8aTsrK3Mpe2xldCBmPXJbc107YS5wYWNrKGYsZSxvKSxvKz0zfXJldHVybiBlW28rK109dC5ncmFudWxhcml0eSxlW28rK109dC5sb29wPzE6MCxlW28rK109dC5hcmNUeXBlLCQucGFjayh0Ll9lbGxpcHNvaWQsZSxvKSxvKz0kLnBhY2tlZExlbmd0aCxlW28rK109dC5fcHJvamVjdGlvbkluZGV4LGVbbysrXT10Ll9zY2VuZTNET25seT8xOjAsZX07RXMudW5wYWNrPWZ1bmN0aW9uKHQsZSxuKXt5LmRlZmluZWQoImFycmF5Iix0KTtsZXQgbz14KGUsMCkscj10W28rK10saT1uZXcgQXJyYXkocik7Zm9yKGxldCBkPTA7ZDxyO2QrKylpW2RdPWEudW5wYWNrKHQsbyksbys9MztsZXQgcz10W28rK10sZj10W28rK109PT0xLHU9dFtvKytdLGM9JC51bnBhY2sodCxvKTtvKz0kLnBhY2tlZExlbmd0aDtsZXQgbD10W28rK10scD10W28rK109PT0xO3JldHVybiBoKG4pfHwobj1uZXcgRXMoe3Bvc2l0aW9uczppfSkpLG4uX3Bvc2l0aW9ucz1pLG4uZ3JhbnVsYXJpdHk9cyxuLmxvb3A9ZixuLmFyY1R5cGU9dSxuLl9lbGxpcHNvaWQ9YyxuLl9wcm9qZWN0aW9uSW5kZXg9bCxuLl9zY2VuZTNET25seT1wLG59O2REPW5ldyBhLG1EPW5ldyBhLGhEPW5ldyBhLGZFPW5ldyBhLF9EPTAseUQ9LTE7UGQ9b24uZnJvbVBvaW50Tm9ybWFsKGEuWkVSTyxhLlVOSVRfWSksZ0Q9bmV3IGEsQUQ9bmV3IGEsYkQ9bmV3IGEsVEQ9bmV3IGEsd0Q9bmV3IGEsU2Q9bmV3IGEsQ2Q9bmV3IGN0LHFPPW5ldyBjdCxLTz1uZXcgY3Q7RXMuY3JlYXRlR2VvbWV0cnk9ZnVuY3Rpb24odCl7bGV0IGU9IXQuX3NjZW5lM0RPbmx5LG49dC5sb29wLG89dC5fZWxsaXBzb2lkLHI9dC5ncmFudWxhcml0eSxpPXQuYXJjVHlwZSxzPW5ldyAkX1t0Ll9wcm9qZWN0aW9uSW5kZXhdKG8pLGY9Y0UsdT1hRSxjLGwscD10Ll9wb3NpdGlvbnMsZD1wLmxlbmd0aDtkPT09MiYmKG49ITEpO2xldCBtLF8sZyxiLFQ9bmV3IFpvKHZvaWQgMCx2b2lkIDAsbyksTyxFLHcsQz1bcFswXV07Zm9yKGw9MDtsPGQtMTtsKyspbT1wW2xdLF89cFtsKzFdLE89aG8ubGluZVNlZ21lbnRQbGFuZShtLF8sUGQsU2QpLGgoTykmJiFhLmVxdWFsc0Vwc2lsb24oTyxtLE0uRVBTSUxPTjcpJiYhYS5lcXVhbHNFcHNpbG9uKE8sXyxNLkVQU0lMT043KSYmKHQuYXJjVHlwZT09PV9lLkdFT0RFU0lDP0MucHVzaChhLmNsb25lKE8pKTp0LmFyY1R5cGU9PT1fZS5SSFVNQiYmKHc9by5jYXJ0ZXNpYW5Ub0NhcnRvZ3JhcGhpYyhPLENkKS5sb25naXR1ZGUsZz1vLmNhcnRlc2lhblRvQ2FydG9ncmFwaGljKG0sQ2QpLGI9by5jYXJ0ZXNpYW5Ub0NhcnRvZ3JhcGhpYyhfLHFPKSxULnNldEVuZFBvaW50cyhnLGIpLEU9VC5maW5kSW50ZXJzZWN0aW9uV2l0aExvbmdpdHVkZSh3LEtPKSxPPW8uY2FydG9ncmFwaGljVG9DYXJ0ZXNpYW4oRSxTZCksaChPKSYmIWEuZXF1YWxzRXBzaWxvbihPLG0sTS5FUFNJTE9ONykmJiFhLmVxdWFsc0Vwc2lsb24oTyxfLE0uRVBTSUxPTjcpJiZDLnB1c2goYS5jbG9uZShPKSkpKSxDLnB1c2goXyk7biYmKG09cFtkLTFdLF89cFswXSxPPWhvLmxpbmVTZWdtZW50UGxhbmUobSxfLFBkLFNkKSxoKE8pJiYhYS5lcXVhbHNFcHNpbG9uKE8sbSxNLkVQU0lMT043KSYmIWEuZXF1YWxzRXBzaWxvbihPLF8sTS5FUFNJTE9ONykmJih0LmFyY1R5cGU9PT1fZS5HRU9ERVNJQz9DLnB1c2goYS5jbG9uZShPKSk6dC5hcmNUeXBlPT09X2UuUkhVTUImJih3PW8uY2FydGVzaWFuVG9DYXJ0b2dyYXBoaWMoTyxDZCkubG9uZ2l0dWRlLGc9by5jYXJ0ZXNpYW5Ub0NhcnRvZ3JhcGhpYyhtLENkKSxiPW8uY2FydGVzaWFuVG9DYXJ0b2dyYXBoaWMoXyxxTyksVC5zZXRFbmRQb2ludHMoZyxiKSxFPVQuZmluZEludGVyc2VjdGlvbldpdGhMb25naXR1ZGUodyxLTyksTz1vLmNhcnRvZ3JhcGhpY1RvQ2FydGVzaWFuKEUsU2QpLGgoTykmJiFhLmVxdWFsc0Vwc2lsb24oTyxtLE0uRVBTSUxPTjcpJiYhYS5lcXVhbHNFcHNpbG9uKE8sXyxNLkVQU0lMT043KSYmQy5wdXNoKGEuY2xvbmUoTykpKSkpO2xldCBOPUMubGVuZ3RoLEk9bmV3IEFycmF5KE4pO2ZvcihsPTA7bDxOO2wrKyl7bGV0IG90PWN0LmZyb21DYXJ0ZXNpYW4oQ1tsXSxvKTtvdC5oZWlnaHQ9MCxJW2xdPW90fWlmKEk9eG4oSSxjdC5lcXVhbHNFcHNpbG9uKSxOPUkubGVuZ3RoLE48MilyZXR1cm47bGV0IEQ9W10sdj1bXSxMPVtdLFU9W10sQT1nRCxTPUFELFA9YkQsRj1URCxqPXdELEg9SVswXSxrPUlbMV0sSz1JW04tMV07Zm9yKEE9VW8obyxLLGYsQSksRj1VbyhvLGssZixGKSxTPVVvKG8sSCxmLFMpLFA9VW8obyxILHUsUCksbj9qPXFfKEEsUyxQLEYsaik6aj1ZXyhILGssdSxvLGopLGEucGFjayhqLHYsMCksYS5wYWNrKFMsTCwwKSxhLnBhY2soUCxVLDApLEQucHVzaChILmxhdGl0dWRlKSxELnB1c2goSC5sb25naXR1ZGUpLGpfKEgsayxmLHUscixpLG8sdixMLFUsRCksbD0xO2w8Ti0xOysrbCl7QT1hLmNsb25lKFMsQSksUz1hLmNsb25lKEYsUyk7bGV0IG90PUlbbF07VW8obyxvdCx1LFApLFVvKG8sSVtsKzFdLGYsRikscV8oQSxTLFAsRixqKSxjPXYubGVuZ3RoLGEucGFjayhqLHYsYyksYS5wYWNrKFMsTCxjKSxhLnBhY2soUCxVLGMpLEQucHVzaChvdC5sYXRpdHVkZSksRC5wdXNoKG90LmxvbmdpdHVkZSksal8oSVtsXSxJW2wrMV0sZix1LHIsaSxvLHYsTCxVLEQpfWxldCBYPUlbTi0xXSxSPUlbTi0yXTtpZihTPVVvKG8sWCxmLFMpLFA9VW8obyxYLHUsUCksbil7bGV0IG90PUlbMF07QT1VbyhvLFIsZixBKSxGPVVvKG8sb3QsZixGKSxqPXFfKEEsUyxQLEYsail9ZWxzZSBqPVlfKFIsWCx1LG8saik7aWYoYz12Lmxlbmd0aCxhLnBhY2soaix2LGMpLGEucGFjayhTLEwsYyksYS5wYWNrKFAsVSxjKSxELnB1c2goWC5sYXRpdHVkZSksRC5wdXNoKFgubG9uZ2l0dWRlKSxuKXtmb3Ioal8oWCxILGYsdSxyLGksbyx2LEwsVSxEKSxjPXYubGVuZ3RoLGw9MDtsPDM7KytsKXZbYytsXT12W2xdLExbYytsXT1MW2xdLFVbYytsXT1VW2xdO0QucHVzaChILmxhdGl0dWRlKSxELnB1c2goSC5sb25naXR1ZGUpfXJldHVybiBYRChuLHMsTCxVLHYsRCxlKX07T0Q9bmV3IGEsRUQ9bmV3IFEsUkQ9bmV3IGVlO1hPPW5ldyBjdCxTRD1uZXcgYSxZTz1uZXcgYTtDRD1uZXcgYSwkTz1uZXcgYTt4RD1uZXcgYTt1RT1uZXcgY3QsbEU9bmV3IGN0LFFPPW5ldyBhLEtfPW5ldyBhLEpPPW5ldyBhLHRFPW5ldyBhLE1EPW5ldyBhLGVFPW5ldyBhLE5EPVt1RSxsRV0sSUQ9bmV3IE50LHZEPW5ldyBhLExEPW5ldyBhLEREPW5ldyBhLEZEPW5ldyBhLEJEPW5ldyBhLFVEPW5ldyBhLFdfPW5ldyBhLFhfPW5ldyBhLFZEPW5ldyBhLGtEPW5ldyBhLEdEPW5ldyBhLG5FPW5ldyBhLHpEPW5ldyBhLGpEPW5ldyBhLEhEPW5ldyBacyxxRD1uZXcgWnMsb0U9bmV3IGEsS0Q9bmV3IGEsckU9bmV3IGEsV0Q9W25ldyBBdCxuZXcgQXRdLHBFPVswLDIsMSwwLDMsMiwwLDcsMywwLDQsNywwLDUsNCwwLDEsNSw1LDcsNCw1LDYsNyw1LDIsNiw1LDEsMiwzLDYsMiwzLDcsNl0saUU9cEUubGVuZ3RoO0VzLl9wcm9qZWN0Tm9ybWFsPVpmO1pfPUVzfSk7dmFyIFFfPXt9O2RlKFFfLHtkZWZhdWx0OigpPT4kRH0pO2Z1bmN0aW9uIFlEKHQsZSl7cmV0dXJuIFJkLmluaXRpYWxpemUoKS50aGVuKGZ1bmN0aW9uKCl7cmV0dXJuIGgoZSkmJih0PVpfLnVucGFjayh0LGUpKSxaXy5jcmVhdGVHZW9tZXRyeSh0KX0pfXZhciAkRCxKXz1aKCgpPT57el8oKTtmdCgpO2RFKCk7JEQ9WUR9KTtmdW5jdGlvbiBSYSh0KXt0PXgodCx4LkVNUFRZX09CSkVDVCk7bGV0IGU9eCh0LnZlcnRleEZvcm1hdCxkdC5ERUZBVUxUKTt0aGlzLl92ZXJ0ZXhGb3JtYXQ9ZSx0aGlzLl93b3JrZXJOYW1lPSJjcmVhdGVQbGFuZUdlb21ldHJ5In12YXIgbUUsWkQsTWQsTmQsdHksaEU9WigoKT0+e3ZlKCk7RnQoKTtYdCgpO0ZlKCk7SXQoKTtmdCgpO1hlKCk7WWUoKTthbigpO3RuKCk7Um8oKTtSYS5wYWNrZWRMZW5ndGg9ZHQucGFja2VkTGVuZ3RoO1JhLnBhY2s9ZnVuY3Rpb24odCxlLG4pe3JldHVybiB5LnR5cGVPZi5vYmplY3QoInZhbHVlIix0KSx5LmRlZmluZWQoImFycmF5IixlKSxuPXgobiwwKSxkdC5wYWNrKHQuX3ZlcnRleEZvcm1hdCxlLG4pLGV9O21FPW5ldyBkdCxaRD17dmVydGV4Rm9ybWF0Om1FfTtSYS51bnBhY2s9ZnVuY3Rpb24odCxlLG4pe3kuZGVmaW5lZCgiYXJyYXkiLHQpLGU9eChlLDApO2xldCBvPWR0LnVucGFjayh0LGUsbUUpO3JldHVybiBoKG4pPyhuLl92ZXJ0ZXhGb3JtYXQ9ZHQuY2xvbmUobyxuLl92ZXJ0ZXhGb3JtYXQpLG4pOm5ldyBSYShaRCl9O01kPW5ldyBhKC0uNSwtLjUsMCksTmQ9bmV3IGEoLjUsLjUsMCk7UmEuY3JlYXRlR2VvbWV0cnk9ZnVuY3Rpb24odCl7bGV0IGU9dC5fdmVydGV4Rm9ybWF0LG49bmV3IGllLG8scjtpZihlLnBvc2l0aW9uKXtpZihyPW5ldyBGbG9hdDY0QXJyYXkoNCozKSxyWzBdPU1kLngsclsxXT1NZC55LHJbMl09MCxyWzNdPU5kLngscls0XT1NZC55LHJbNV09MCxyWzZdPU5kLngscls3XT1OZC55LHJbOF09MCxyWzldPU1kLngsclsxMF09TmQueSxyWzExXT0wLG4ucG9zaXRpb249bmV3IGl0KHtjb21wb25lbnREYXRhdHlwZTpudC5ET1VCTEUsY29tcG9uZW50c1BlckF0dHJpYnV0ZTozLHZhbHVlczpyfSksZS5ub3JtYWwpe2xldCBpPW5ldyBGbG9hdDMyQXJyYXkoMTIpO2lbMF09MCxpWzFdPTAsaVsyXT0xLGlbM109MCxpWzRdPTAsaVs1XT0xLGlbNl09MCxpWzddPTAsaVs4XT0xLGlbOV09MCxpWzEwXT0wLGlbMTFdPTEsbi5ub3JtYWw9bmV3IGl0KHtjb21wb25lbnREYXRhdHlwZTpudC5GTE9BVCxjb21wb25lbnRzUGVyQXR0cmlidXRlOjMsdmFsdWVzOml9KX1pZihlLnN0KXtsZXQgaT1uZXcgRmxvYXQzMkFycmF5KDgpO2lbMF09MCxpWzFdPTAsaVsyXT0xLGlbM109MCxpWzRdPTEsaVs1XT0xLGlbNl09MCxpWzddPTEsbi5zdD1uZXcgaXQoe2NvbXBvbmVudERhdGF0eXBlOm50LkZMT0FULGNvbXBvbmVudHNQZXJBdHRyaWJ1dGU6Mix2YWx1ZXM6aX0pfWlmKGUudGFuZ2VudCl7bGV0IGk9bmV3IEZsb2F0MzJBcnJheSgxMik7aVswXT0xLGlbMV09MCxpWzJdPTAsaVszXT0xLGlbNF09MCxpWzVdPTAsaVs2XT0xLGlbN109MCxpWzhdPTAsaVs5XT0xLGlbMTBdPTAsaVsxMV09MCxuLnRhbmdlbnQ9bmV3IGl0KHtjb21wb25lbnREYXRhdHlwZTpudC5GTE9BVCxjb21wb25lbnRzUGVyQXR0cmlidXRlOjMsdmFsdWVzOml9KX1pZihlLmJpdGFuZ2VudCl7bGV0IGk9bmV3IEZsb2F0MzJBcnJheSgxMik7aVswXT0wLGlbMV09MSxpWzJdPTAsaVszXT0wLGlbNF09MSxpWzVdPTAsaVs2XT0wLGlbN109MSxpWzhdPTAsaVs5XT0wLGlbMTBdPTEsaVsxMV09MCxuLmJpdGFuZ2VudD1uZXcgaXQoe2NvbXBvbmVudERhdGF0eXBlOm50LkZMT0FULGNvbXBvbmVudHNQZXJBdHRyaWJ1dGU6Myx2YWx1ZXM6aX0pfW89bmV3IFVpbnQxNkFycmF5KDIqMyksb1swXT0wLG9bMV09MSxvWzJdPTIsb1szXT0wLG9bNF09MixvWzVdPTN9cmV0dXJuIG5ldyBVdCh7YXR0cmlidXRlczpuLGluZGljZXM6byxwcmltaXRpdmVUeXBlOkJ0LlRSSUFOR0xFUyxib3VuZGluZ1NwaGVyZTpuZXcgQXQoYS5aRVJPLE1hdGguc3FydCgyKSl9KX07dHk9UmF9KTt2YXIgZXk9e307ZGUoZXkse2RlZmF1bHQ6KCk9PkpEfSk7ZnVuY3Rpb24gUUQodCxlKXtyZXR1cm4gaChlKSYmKHQ9dHkudW5wYWNrKHQsZSkpLHR5LmNyZWF0ZUdlb21ldHJ5KHQpfXZhciBKRCxueT1aKCgpPT57ZnQoKTtoRSgpO0pEPVFEfSk7ZnVuY3Rpb24gU2EoKXt0aGlzLl93b3JrZXJOYW1lPSJjcmVhdGVQbGFuZU91dGxpbmVHZW9tZXRyeSJ9dmFyIFJzLElkLG95LF9FPVooKCk9Pnt2ZSgpO0Z0KCk7WHQoKTtGZSgpO2Z0KCk7WGUoKTtZZSgpO2FuKCk7dG4oKTtTYS5wYWNrZWRMZW5ndGg9MDtTYS5wYWNrPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHkuZGVmaW5lZCgidmFsdWUiLHQpLHkuZGVmaW5lZCgiYXJyYXkiLGUpLGV9O1NhLnVucGFjaz1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHkuZGVmaW5lZCgiYXJyYXkiLHQpLGgobik/bjpuZXcgU2F9O1JzPW5ldyBhKC0uNSwtLjUsMCksSWQ9bmV3IGEoLjUsLjUsMCk7U2EuY3JlYXRlR2VvbWV0cnk9ZnVuY3Rpb24oKXtsZXQgdD1uZXcgaWUsZT1uZXcgVWludDE2QXJyYXkoNCoyKSxuPW5ldyBGbG9hdDY0QXJyYXkoNCozKTtyZXR1cm4gblswXT1Scy54LG5bMV09UnMueSxuWzJdPVJzLnosblszXT1JZC54LG5bNF09UnMueSxuWzVdPVJzLnosbls2XT1JZC54LG5bN109SWQueSxuWzhdPVJzLnosbls5XT1Scy54LG5bMTBdPUlkLnksblsxMV09UnMueix0LnBvc2l0aW9uPW5ldyBpdCh7Y29tcG9uZW50RGF0YXR5cGU6bnQuRE9VQkxFLGNvbXBvbmVudHNQZXJBdHRyaWJ1dGU6Myx2YWx1ZXM6bn0pLGVbMF09MCxlWzFdPTEsZVsyXT0xLGVbM109MixlWzRdPTIsZVs1XT0zLGVbNl09MyxlWzddPTAsbmV3IFV0KHthdHRyaWJ1dGVzOnQsaW5kaWNlczplLHByaW1pdGl2ZVR5cGU6QnQuTElORVMsYm91bmRpbmdTcGhlcmU6bmV3IEF0KGEuWkVSTyxNYXRoLnNxcnQoMikpfSl9O295PVNhfSk7dmFyIHJ5PXt9O2RlKHJ5LHtkZWZhdWx0OigpPT5lRn0pO2Z1bmN0aW9uIHRGKHQsZSl7cmV0dXJuIGgoZSkmJih0PW95LnVucGFjayh0LGUpKSxveS5jcmVhdGVHZW9tZXRyeSh0KX12YXIgZUYsaXk9WigoKT0+e2Z0KCk7X0UoKTtlRj10Rn0pO2Z1bmN0aW9uIExuKHQsZSl7dGhpcy5wb3NpdGlvbj10LGgodGhpcy5wb3NpdGlvbil8fCh0aGlzLnBvc2l0aW9uPW5ldyB0dCksdGhpcy50YW5nZW50UGxhbmU9ZSxoKHRoaXMudGFuZ2VudFBsYW5lKXx8KHRoaXMudGFuZ2VudFBsYW5lPUxuLk5PUlRIX1BPTEVfVEFOR0VOVF9QTEFORSl9dmFyIENhLG5GLG9GLHJGLGlGLGNyLHlFPVooKCk9PntVZSgpO0Z0KCk7SWUoKTtYdCgpO2Z0KCk7WnQoKTtsYSgpO3RjKCk7V3QoKTtWcCgpO09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKExuLnByb3RvdHlwZSx7ZWxsaXBzb2lkOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50YW5nZW50UGxhbmUuZWxsaXBzb2lkfX0seDp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucG9zaXRpb24ueH19LHk6e2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBvc2l0aW9uLnl9fSxjb25mb3JtYWxMYXRpdHVkZTp7Z2V0OmZ1bmN0aW9uKCl7bGV0IHQ9dHQubWFnbml0dWRlKHRoaXMucG9zaXRpb24pLGU9Mip0aGlzLmVsbGlwc29pZC5tYXhpbXVtUmFkaXVzO3JldHVybiB0aGlzLnRhbmdlbnRQbGFuZS5wbGFuZS5ub3JtYWwueiooTS5QSV9PVkVSX1RXTy0yKk1hdGguYXRhbjIodCxlKSl9fSxsb25naXR1ZGU6e2dldDpmdW5jdGlvbigpe2xldCB0PU0uUElfT1ZFUl9UV08rTWF0aC5hdGFuMih0aGlzLnksdGhpcy54KTtyZXR1cm4gdD5NYXRoLlBJJiYodC09TS5UV09fUEkpLHR9fX0pO0NhPW5ldyBjdCxuRj1uZXcgYTtMbi5wcm90b3R5cGUuZ2V0TGF0aXR1ZGU9ZnVuY3Rpb24odCl7aCh0KXx8KHQ9JC5kZWZhdWx0KSxDYS5sYXRpdHVkZT10aGlzLmNvbmZvcm1hbExhdGl0dWRlLENhLmxvbmdpdHVkZT10aGlzLmxvbmdpdHVkZSxDYS5oZWlnaHQ9MDtsZXQgZT10aGlzLmVsbGlwc29pZC5jYXJ0b2dyYXBoaWNUb0NhcnRlc2lhbihDYSxuRik7cmV0dXJuIHQuY2FydGVzaWFuVG9DYXJ0b2dyYXBoaWMoZSxDYSksQ2EubGF0aXR1ZGV9O29GPW5ldyBRcyxyRj1uZXcgYSxpRj1uZXcgYTtMbi5mcm9tQ2FydGVzaWFuPWZ1bmN0aW9uKHQsZSl7eS5kZWZpbmVkKCJjYXJ0ZXNpYW4iLHQpO2xldCBuPU0uc2lnbk5vdFplcm8odC56KSxvPUxuLk5PUlRIX1BPTEVfVEFOR0VOVF9QTEFORSxyPUxuLlNPVVRIX1BPTEU7bjwwJiYobz1Mbi5TT1VUSF9QT0xFX1RBTkdFTlRfUExBTkUscj1Mbi5OT1JUSF9QT0xFKTtsZXQgaT1vRjtpLm9yaWdpbj1vLmVsbGlwc29pZC5zY2FsZVRvR2VvY2VudHJpY1N1cmZhY2UodCxpLm9yaWdpbiksaS5kaXJlY3Rpb249YS5zdWJ0cmFjdChpLm9yaWdpbixyLHJGKSxhLm5vcm1hbGl6ZShpLmRpcmVjdGlvbixpLmRpcmVjdGlvbik7bGV0IHM9aG8ucmF5UGxhbmUoaSxvLnBsYW5lLGlGKSxmPWEuc3VidHJhY3QocyxyLHMpLHU9YS5kb3Qoby54QXhpcyxmKSxjPW4qYS5kb3Qoby55QXhpcyxmKTtyZXR1cm4gaChlKT8oZS5wb3NpdGlvbj1uZXcgdHQodSxjKSxlLnRhbmdlbnRQbGFuZT1vLGUpOm5ldyBMbihuZXcgdHQodSxjKSxvKX07TG4uZnJvbUNhcnRlc2lhbkFycmF5PWZ1bmN0aW9uKHQsZSl7eS5kZWZpbmVkKCJjYXJ0ZXNpYW5zIix0KTtsZXQgbj10Lmxlbmd0aDtoKGUpP2UubGVuZ3RoPW46ZT1uZXcgQXJyYXkobik7Zm9yKGxldCBvPTA7bzxuO28rKyllW29dPUxuLmZyb21DYXJ0ZXNpYW4odFtvXSxlW29dKTtyZXR1cm4gZX07TG4uY2xvbmU9ZnVuY3Rpb24odCxlKXtpZihoKHQpKXJldHVybiBoKGUpPyhlLnBvc2l0aW9uPXQucG9zaXRpb24sZS50YW5nZW50UGxhbmU9dC50YW5nZW50UGxhbmUsZSk6bmV3IExuKHQucG9zaXRpb24sdC50YW5nZW50UGxhbmUpfTtMbi5IQUxGX1VOSVRfU1BIRVJFPU9iamVjdC5mcmVlemUobmV3ICQoLjUsLjUsLjUpKTtMbi5OT1JUSF9QT0xFPU9iamVjdC5mcmVlemUobmV3IGEoMCwwLC41KSk7TG4uU09VVEhfUE9MRT1PYmplY3QuZnJlZXplKG5ldyBhKDAsMCwtLjUpKTtMbi5OT1JUSF9QT0xFX1RBTkdFTlRfUExBTkU9T2JqZWN0LmZyZWV6ZShuZXcgeW8oTG4uTk9SVEhfUE9MRSxMbi5IQUxGX1VOSVRfU1BIRVJFKSk7TG4uU09VVEhfUE9MRV9UQU5HRU5UX1BMQU5FPU9iamVjdC5mcmVlemUobmV3IHlvKExuLlNPVVRIX1BPTEUsTG4uSEFMRl9VTklUX1NQSEVSRSkpO2NyPUxufSk7ZnVuY3Rpb24gY0YodCxlLG4sbyl7bGV0IGk9by5jYXJ0ZXNpYW5Ub0NhcnRvZ3JhcGhpYyh0LHNGKS5oZWlnaHQscz1vLmNhcnRlc2lhblRvQ2FydG9ncmFwaGljKGUsZ0UpO3MuaGVpZ2h0PWksby5jYXJ0b2dyYXBoaWNUb0NhcnRlc2lhbihzLGUpO2xldCBmPW8uY2FydGVzaWFuVG9DYXJ0b2dyYXBoaWMobixnRSk7Zi5oZWlnaHQ9aS0xMDAsby5jYXJ0b2dyYXBoaWNUb0NhcnRlc2lhbihmLG4pfWZ1bmN0aW9uIHN5KHQpe2xldCBlPXQudmVydGV4Rm9ybWF0LG49dC5nZW9tZXRyeSxvPXQuc2hhZG93Vm9sdW1lLHI9bi5hdHRyaWJ1dGVzLnBvc2l0aW9uLnZhbHVlcyxpPWgobi5hdHRyaWJ1dGVzLnN0KT9uLmF0dHJpYnV0ZXMuc3QudmFsdWVzOnZvaWQgMCxzPXIubGVuZ3RoLGY9dC53YWxsLHU9dC50b3B8fGYsYz10LmJvdHRvbXx8ZjtpZihlLnN0fHxlLm5vcm1hbHx8ZS50YW5nZW50fHxlLmJpdGFuZ2VudHx8byl7bGV0IGw9dC5ib3VuZGluZ1JlY3RhbmdsZSxwPXQucm90YXRpb25BeGlzLGQ9dC5wcm9qZWN0VG8yZCxtPXQuZWxsaXBzb2lkLF89dC5zdFJvdGF0aW9uLGc9dC5wZXJQb3NpdGlvbkhlaWdodCxiPW1GO2IueD1sLngsYi55PWwueTtsZXQgVD1lLnN0P25ldyBGbG9hdDMyQXJyYXkoMioocy8zKSk6dm9pZCAwLE87ZS5ub3JtYWwmJihnJiZ1JiYhZj9PPW4uYXR0cmlidXRlcy5ub3JtYWwudmFsdWVzOk89bmV3IEZsb2F0MzJBcnJheShzKSk7bGV0IEU9ZS50YW5nZW50P25ldyBGbG9hdDMyQXJyYXkocyk6dm9pZCAwLHc9ZS5iaXRhbmdlbnQ/bmV3IEZsb2F0MzJBcnJheShzKTp2b2lkIDAsQz1vP25ldyBGbG9hdDMyQXJyYXkocyk6dm9pZCAwLE49MCxJPTAsRD1mRix2PXVGLEw9bEYsVT0hMCxBPXlGLFM9Z0Y7aWYoXyE9PTApe2xldCBqPWVlLmZyb21BeGlzQW5nbGUocCxfLGJFKTtBPVEuZnJvbVF1YXRlcm5pb24oaixBKSxqPWVlLmZyb21BeGlzQW5nbGUocCwtXyxiRSksUz1RLmZyb21RdWF0ZXJuaW9uKGosUyl9ZWxzZSBBPVEuY2xvbmUoUS5JREVOVElUWSxBKSxTPVEuY2xvbmUoUS5JREVOVElUWSxTKTtsZXQgUD0wLEY9MDt1JiZjJiYoUD1zLzIsRj1zLzMscy89Mik7Zm9yKGxldCBqPTA7ajxzO2orPTMpe2xldCBIPWEuZnJvbUFycmF5KHIsaixfRik7aWYoZS5zdCYmIWgoaSkpe2xldCBrPVEubXVsdGlwbHlCeVZlY3RvcihBLEgsYUYpO2s9bS5zY2FsZVRvR2VvZGV0aWNTdXJmYWNlKGssayk7bGV0IEs9ZChba10saEYpWzBdO3R0LnN1YnRyYWN0KEssYixLKTtsZXQgWD1NLmNsYW1wKEsueC9sLndpZHRoLDAsMSksUj1NLmNsYW1wKEsueS9sLmhlaWdodCwwLDEpO2MmJihUW04rRl09WCxUW04rMStGXT1SKSx1JiYoVFtOXT1YLFRbTisxXT1SKSxOKz0yfWlmKGUubm9ybWFsfHxlLnRhbmdlbnR8fGUuYml0YW5nZW50fHxvKXtsZXQgaz1JKzEsSz1JKzI7aWYoZil7aWYoaiszPHMpe2xldCBYPWEuZnJvbUFycmF5KHIsaiszLHBGKTtpZihVKXtsZXQgUj1hLmZyb21BcnJheShyLGorcyxkRik7ZyYmY0YoSCxYLFIsbSksYS5zdWJ0cmFjdChYLEgsWCksYS5zdWJ0cmFjdChSLEgsUiksRD1hLm5vcm1hbGl6ZShhLmNyb3NzKFIsWCxEKSxEKSxVPSExfWEuZXF1YWxzRXBzaWxvbihYLEgsTS5FUFNJTE9OMTApJiYoVT0hMCl9KGUudGFuZ2VudHx8ZS5iaXRhbmdlbnQpJiYoTD1tLmdlb2RldGljU3VyZmFjZU5vcm1hbChILEwpLGUudGFuZ2VudCYmKHY9YS5ub3JtYWxpemUoYS5jcm9zcyhMLEQsdiksdikpKX1lbHNlIEQ9bS5nZW9kZXRpY1N1cmZhY2VOb3JtYWwoSCxEKSwoZS50YW5nZW50fHxlLmJpdGFuZ2VudCkmJihnJiYodmQ9YS5mcm9tQXJyYXkoTyxJLHZkKSxkaT1hLmNyb3NzKGEuVU5JVF9aLHZkLGRpKSxkaT1hLm5vcm1hbGl6ZShRLm11bHRpcGx5QnlWZWN0b3IoUyxkaSxkaSksZGkpLGUuYml0YW5nZW50JiYoeGE9YS5ub3JtYWxpemUoYS5jcm9zcyh2ZCxkaSx4YSkseGEpKSksdj1hLmNyb3NzKGEuVU5JVF9aLEQsdiksdj1hLm5vcm1hbGl6ZShRLm11bHRpcGx5QnlWZWN0b3IoUyx2LHYpLHYpLGUuYml0YW5nZW50JiYoTD1hLm5vcm1hbGl6ZShhLmNyb3NzKEQsdixMKSxMKSkpO2Uubm9ybWFsJiYodC53YWxsPyhPW0krUF09RC54LE9baytQXT1ELnksT1tLK1BdPUQueik6YyYmKE9bSStQXT0tRC54LE9baytQXT0tRC55LE9bSytQXT0tRC56KSwodSYmIWd8fGYpJiYoT1tJXT1ELngsT1trXT1ELnksT1tLXT1ELnopKSxvJiYoZiYmKEQ9bS5nZW9kZXRpY1N1cmZhY2VOb3JtYWwoSCxEKSksQ1tJK1BdPS1ELngsQ1trK1BdPS1ELnksQ1tLK1BdPS1ELnopLGUudGFuZ2VudCYmKHQud2FsbD8oRVtJK1BdPXYueCxFW2srUF09di55LEVbSytQXT12LnopOmMmJihFW0krUF09LXYueCxFW2srUF09LXYueSxFW0srUF09LXYueiksdSYmKGc/KEVbSV09ZGkueCxFW2tdPWRpLnksRVtLXT1kaS56KTooRVtJXT12LngsRVtrXT12LnksRVtLXT12LnopKSksZS5iaXRhbmdlbnQmJihjJiYod1tJK1BdPUwueCx3W2srUF09TC55LHdbSytQXT1MLnopLHUmJihnPyh3W0ldPXhhLngsd1trXT14YS55LHdbS109eGEueik6KHdbSV09TC54LHdba109TC55LHdbS109TC56KSkpLEkrPTN9fWUuc3QmJiFoKGkpJiYobi5hdHRyaWJ1dGVzLnN0PW5ldyBpdCh7Y29tcG9uZW50RGF0YXR5cGU6bnQuRkxPQVQsY29tcG9uZW50c1BlckF0dHJpYnV0ZToyLHZhbHVlczpUfSkpLGUubm9ybWFsJiYobi5hdHRyaWJ1dGVzLm5vcm1hbD1uZXcgaXQoe2NvbXBvbmVudERhdGF0eXBlOm50LkZMT0FULGNvbXBvbmVudHNQZXJBdHRyaWJ1dGU6Myx2YWx1ZXM6T30pKSxlLnRhbmdlbnQmJihuLmF0dHJpYnV0ZXMudGFuZ2VudD1uZXcgaXQoe2NvbXBvbmVudERhdGF0eXBlOm50LkZMT0FULGNvbXBvbmVudHNQZXJBdHRyaWJ1dGU6Myx2YWx1ZXM6RX0pKSxlLmJpdGFuZ2VudCYmKG4uYXR0cmlidXRlcy5iaXRhbmdlbnQ9bmV3IGl0KHtjb21wb25lbnREYXRhdHlwZTpudC5GTE9BVCxjb21wb25lbnRzUGVyQXR0cmlidXRlOjMsdmFsdWVzOnd9KSksbyYmKG4uYXR0cmlidXRlcy5leHRydWRlRGlyZWN0aW9uPW5ldyBpdCh7Y29tcG9uZW50RGF0YXR5cGU6bnQuRkxPQVQsY29tcG9uZW50c1BlckF0dHJpYnV0ZTozLHZhbHVlczpDfSkpfWlmKHQuZXh0cnVkZSYmaCh0Lm9mZnNldEF0dHJpYnV0ZSkpe2xldCBsPXIubGVuZ3RoLzMscD1uZXcgVWludDhBcnJheShsKTtpZih0Lm9mZnNldEF0dHJpYnV0ZT09PWZlLlRPUCl1JiZjfHxmP3A9cC5maWxsKDEsMCxsLzIpOnUmJihwPXAuZmlsbCgxKSk7ZWxzZXtsZXQgZD10Lm9mZnNldEF0dHJpYnV0ZT09PWZlLk5PTkU/MDoxO3A9cC5maWxsKGQpfW4uYXR0cmlidXRlcy5hcHBseU9mZnNldD1uZXcgaXQoe2NvbXBvbmVudERhdGF0eXBlOm50LlVOU0lHTkVEX0JZVEUsY29tcG9uZW50c1BlckF0dHJpYnV0ZToxLHZhbHVlczpwfSl9cmV0dXJuIG59ZnVuY3Rpb24gQUYodCxlLG4sbyxyLGkscyxmLHUsYyl7bGV0IGw9e3dhbGxzOltdfSxwO2lmKHN8fGYpe2xldCBPPXllLmNyZWF0ZUdlb21ldHJ5RnJvbVBvc2l0aW9ucyh0LGUsbixvLGksdSxjKSxFPU8uYXR0cmlidXRlcy5wb3NpdGlvbi52YWx1ZXMsdz1PLmluZGljZXMsQyxOO2lmKHMmJmYpe2xldCBJPUUuY29uY2F0KEUpO0M9SS5sZW5ndGgvMyxOPUR0LmNyZWF0ZVR5cGVkQXJyYXkoQyx3Lmxlbmd0aCoyKSxOLnNldCh3KTtsZXQgRD13Lmxlbmd0aCx2PUMvMjtmb3IocD0wO3A8RDtwKz0zKXtsZXQgTD1OW3BdK3YsVT1OW3ArMV0rdixBPU5bcCsyXSt2O05bcCtEXT1BLE5bcCsxK0RdPVUsTltwKzIrRF09TH1pZihPLmF0dHJpYnV0ZXMucG9zaXRpb24udmFsdWVzPUksaSYmdS5ub3JtYWwpe2xldCBMPU8uYXR0cmlidXRlcy5ub3JtYWwudmFsdWVzO08uYXR0cmlidXRlcy5ub3JtYWwudmFsdWVzPW5ldyBGbG9hdDMyQXJyYXkoSS5sZW5ndGgpLE8uYXR0cmlidXRlcy5ub3JtYWwudmFsdWVzLnNldChMKX1pZih1LnN0JiZoKG4pKXtsZXQgTD1PLmF0dHJpYnV0ZXMuc3QudmFsdWVzO08uYXR0cmlidXRlcy5zdC52YWx1ZXM9bmV3IEZsb2F0MzJBcnJheShDKjIpLE8uYXR0cmlidXRlcy5zdC52YWx1ZXM9TC5jb25jYXQoTCl9Ty5pbmRpY2VzPU59ZWxzZSBpZihmKXtmb3IoQz1FLmxlbmd0aC8zLE49RHQuY3JlYXRlVHlwZWRBcnJheShDLHcubGVuZ3RoKSxwPTA7cDx3Lmxlbmd0aDtwKz0zKU5bcF09d1twKzJdLE5bcCsxXT13W3ArMV0sTltwKzJdPXdbcF07Ty5pbmRpY2VzPU59bC50b3BBbmRCb3R0b209bmV3IGNvKHtnZW9tZXRyeTpPfSl9bGV0IGQ9ci5vdXRlclJpbmcsbT15by5mcm9tUG9pbnRzKGQsdCksXz1tLnByb2plY3RQb2ludHNPbnRvUGxhbmUoZCxURSksZz1QZS5jb21wdXRlV2luZGluZ09yZGVyMkQoXyk7Zz09PUNvLkNMT0NLV0lTRSYmKGQ9ZC5zbGljZSgpLnJldmVyc2UoKSk7bGV0IGI9eWUuY29tcHV0ZVdhbGxHZW9tZXRyeShkLG4sdCxvLGksYyk7bC53YWxscy5wdXNoKG5ldyBjbyh7Z2VvbWV0cnk6Yn0pKTtsZXQgVD1yLmhvbGVzO2ZvcihwPTA7cDxULmxlbmd0aDtwKyspe2xldCBPPVRbcF07Xz1tLnByb2plY3RQb2ludHNPbnRvUGxhbmUoTyxURSksZz1QZS5jb21wdXRlV2luZGluZ09yZGVyMkQoXyksZz09PUNvLkNPVU5URVJfQ0xPQ0tXSVNFJiYoTz1PLnNsaWNlKCkucmV2ZXJzZSgpKSxiPXllLmNvbXB1dGVXYWxsR2VvbWV0cnkoTyxuLHQsbyxpLGMpLGwud2FsbHMucHVzaChuZXcgY28oe2dlb21ldHJ5OmJ9KSl9cmV0dXJuIGx9ZnVuY3Rpb24gUnIodCl7aWYoeS50eXBlT2Yub2JqZWN0KCJvcHRpb25zIix0KSx5LnR5cGVPZi5vYmplY3QoIm9wdGlvbnMucG9seWdvbkhpZXJhcmNoeSIsdC5wb2x5Z29uSGllcmFyY2h5KSxoKHQucGVyUG9zaXRpb25IZWlnaHQpJiZ0LnBlclBvc2l0aW9uSGVpZ2h0JiZoKHQuaGVpZ2h0KSl0aHJvdyBuZXcgQigiQ2Fubm90IHVzZSBib3RoIG9wdGlvbnMucGVyUG9zaXRpb25IZWlnaHQgYW5kIG9wdGlvbnMuaGVpZ2h0Iik7aWYoaCh0LmFyY1R5cGUpJiZ0LmFyY1R5cGUhPT1fZS5HRU9ERVNJQyYmdC5hcmNUeXBlIT09X2UuUkhVTUIpdGhyb3cgbmV3IEIoIkludmFsaWQgYXJjVHlwZS4gVmFsaWQgb3B0aW9ucyBhcmUgQXJjVHlwZS5HRU9ERVNJQyBhbmQgQXJjVHlwZS5SSFVNQi4iKTtsZXQgZT10LnBvbHlnb25IaWVyYXJjaHksbj14KHQudmVydGV4Rm9ybWF0LGR0LkRFRkFVTFQpLG89eCh0LmVsbGlwc29pZCwkLmRlZmF1bHQpLHI9eCh0LmdyYW51bGFyaXR5LE0uUkFESUFOU19QRVJfREVHUkVFKSxpPXgodC5zdFJvdGF0aW9uLDApLHM9dC50ZXh0dXJlQ29vcmRpbmF0ZXMsZj14KHQucGVyUG9zaXRpb25IZWlnaHQsITEpLHU9ZiYmaCh0LmV4dHJ1ZGVkSGVpZ2h0KSxjPXgodC5oZWlnaHQsMCksbD14KHQuZXh0cnVkZWRIZWlnaHQsYyk7aWYoIXUpe2xldCBwPU1hdGgubWF4KGMsbCk7bD1NYXRoLm1pbihjLGwpLGM9cH10aGlzLl92ZXJ0ZXhGb3JtYXQ9ZHQuY2xvbmUobiksdGhpcy5fZWxsaXBzb2lkPSQuY2xvbmUobyksdGhpcy5fZ3JhbnVsYXJpdHk9cix0aGlzLl9zdFJvdGF0aW9uPWksdGhpcy5faGVpZ2h0PWMsdGhpcy5fZXh0cnVkZWRIZWlnaHQ9bCx0aGlzLl9jbG9zZVRvcD14KHQuY2xvc2VUb3AsITApLHRoaXMuX2Nsb3NlQm90dG9tPXgodC5jbG9zZUJvdHRvbSwhMCksdGhpcy5fcG9seWdvbkhpZXJhcmNoeT1lLHRoaXMuX3BlclBvc2l0aW9uSGVpZ2h0PWYsdGhpcy5fcGVyUG9zaXRpb25IZWlnaHRFeHRydWRlPXUsdGhpcy5fc2hhZG93Vm9sdW1lPXgodC5zaGFkb3dWb2x1bWUsITEpLHRoaXMuX3dvcmtlck5hbWU9ImNyZWF0ZVBvbHlnb25HZW9tZXRyeSIsdGhpcy5fb2Zmc2V0QXR0cmlidXRlPXQub2Zmc2V0QXR0cmlidXRlLHRoaXMuX2FyY1R5cGU9eCh0LmFyY1R5cGUsX2UuR0VPREVTSUMpLHRoaXMuX3JlY3RhbmdsZT12b2lkIDAsdGhpcy5fdGV4dHVyZUNvb3JkaW5hdGVSb3RhdGlvblBvaW50cz12b2lkIDAsdGhpcy5fdGV4dHVyZUNvb3JkaW5hdGVzPXMsdGhpcy5wYWNrZWRMZW5ndGg9eWUuY29tcHV0ZUhpZXJhcmNoeVBhY2tlZExlbmd0aChlLGEpKyQucGFja2VkTGVuZ3RoK2R0LnBhY2tlZExlbmd0aCsocz95ZS5jb21wdXRlSGllcmFyY2h5UGFja2VkTGVuZ3RoKHMsdHQpOjEpKzEyfWZ1bmN0aW9uIHdFKHQsZSxuLG8scixpKXtsZXQgcz10LmxvbmdpdHVkZSxmPXM+PTA/czpzK00uVFdPX1BJO3Iud2VzdE92ZXJJZGw9TWF0aC5taW4oci53ZXN0T3ZlcklkbCxmKSxyLmVhc3RPdmVySWRsPU1hdGgubWF4KHIuZWFzdE92ZXJJZGwsZiksaS53ZXN0PU1hdGgubWluKGkud2VzdCxzKSxpLmVhc3Q9TWF0aC5tYXgoaS5lYXN0LHMpO2xldCB1PXQuZ2V0TGF0aXR1ZGUobiksYz11O2lmKGkuc291dGg9TWF0aC5taW4oaS5zb3V0aCx1KSxpLm5vcnRoPU1hdGgubWF4KGkubm9ydGgsdSksbyE9PV9lLlJIVU1CKXtsZXQgZD10dC5zdWJ0cmFjdChlLnBvc2l0aW9uLHQucG9zaXRpb24sT0YpLG09dHQuZG90KGUucG9zaXRpb24sZCkvdHQuZG90KGQsZCk7aWYobT4wJiZtPDEpe2xldCBfPXR0LmFkZChlLnBvc2l0aW9uLHR0Lm11bHRpcGx5QnlTY2FsYXIoZCwtbSxkKSxFRiksZz1jci5jbG9uZShlLFJGKTtnLnBvc2l0aW9uPV87bGV0IGI9Zy5nZXRMYXRpdHVkZShuKTtpLnNvdXRoPU1hdGgubWluKGkuc291dGgsYiksaS5ub3J0aD1NYXRoLm1heChpLm5vcnRoLGIpLE1hdGguYWJzKHUpPk1hdGguYWJzKGIpJiYoYz1iKX19bGV0IGw9ZS54KnQueS10LngqZS55LHA9TWF0aC5zaWduKGwpO3AhPT0wJiYocCo9dHQuYW5nbGVCZXR3ZWVuKGUucG9zaXRpb24sdC5wb3NpdGlvbikpLGM+PTAmJihyLm5vcnRoQW5nbGUrPXApLGM8PTAmJihyLnNvdXRoQW5nbGUrPXApfWZ1bmN0aW9uIHhGKHQsZSxuKXtyZXR1cm4gdC5oZWlnaHQ+PU0uUEl8fHQud2lkdGg+PU0uUEk/Y3IuZnJvbUNhcnRlc2lhbihlWzBdLENGKS50YW5nZW50UGxhbmU6eW8uZnJvbVBvaW50cyhlLG4pfWZ1bmN0aW9uIFBGKHQsZSxuKXtyZXR1cm4obyxyKT0+e2lmKHQuaGVpZ2h0Pj1NLlBJfHx0LndpZHRoPj1NLlBJKXtpZih0LnNvdXRoPDAmJnQubm9ydGg+MCl7aChyKXx8KHI9W10pO2ZvcihsZXQgcz0wO3M8by5sZW5ndGg7KytzKXtsZXQgZj1uLmNhcnRlc2lhblRvQ2FydG9ncmFwaGljKG9bc10sRUUpO3Jbc109bmV3IHR0KGYubG9uZ2l0dWRlL00uUEksZi5sYXRpdHVkZS9NLlBJX09WRVJfVFdPKX1yZXR1cm4gci5sZW5ndGg9by5sZW5ndGgscn1yZXR1cm4gY3IuZnJvbUNhcnRlc2lhbkFycmF5KG8scil9cmV0dXJuIHlvLmZyb21Qb2ludHMoZSxuKS5wcm9qZWN0UG9pbnRzT250b1BsYW5lKG8scil9fWZ1bmN0aW9uIE1GKHQsZSxuKXtpZih0LmhlaWdodD49TS5QSXx8dC53aWR0aD49TS5QSSlyZXR1cm4ocixpKT0+e2lmKHQuc291dGg8MCYmdC5ub3J0aD4wKXtsZXQgcz1uLmNhcnRlc2lhblRvQ2FydG9ncmFwaGljKHIsRUUpO3JldHVybiBoKGkpfHwoaT1uZXcgdHQpLGkueD1zLmxvbmdpdHVkZS9NLlBJLGkueT1zLmxhdGl0dWRlL00uUElfT1ZFUl9UV08saX1yZXR1cm4gY3IuZnJvbUNhcnRlc2lhbihyLGkpfTtsZXQgbz15by5mcm9tUG9pbnRzKGUsbik7cmV0dXJuKHIsaSk9Pm8ucHJvamVjdFBvaW50c09udG9QbGFuZShyLGkpfWZ1bmN0aW9uIE5GKHQsZSxuLG8pe3JldHVybihyLGkpPT4hbyYmKHQuaGVpZ2h0Pj1NLlBJX09WRVJfVFdPfHx0LndpZHRoPj0yKk0uUElfT1ZFUl9USFJFRSk/eWUuc3BsaXRQb2x5Z29uc09uRXF1YXRvcihyLGUsbixpKTpyfWZ1bmN0aW9uIElGKHQsZSxuLG8pe2lmKGUuaGVpZ2h0Pj1NLlBJfHxlLndpZHRoPj1NLlBJKXJldHVybiBIci5mcm9tUmVjdGFuZ2xlKGUsdm9pZCAwLEFFKTtsZXQgcj10LGk9eW8uZnJvbVBvaW50cyhyLG4pO3JldHVybiB5ZS5jb21wdXRlQm91bmRpbmdSZWN0YW5nbGUoaS5wbGFuZS5ub3JtYWwsaS5wcm9qZWN0UG9pbnRPbnRvUGxhbmUuYmluZChpKSxyLG8sQUUpfWZ1bmN0aW9uIHZGKHQpe2xldCBlPS10Ll9zdFJvdGF0aW9uO2lmKGU9PT0wKXJldHVyblswLDAsMCwxLDEsMF07bGV0IG49dC5fZWxsaXBzb2lkLG89dC5fcG9seWdvbkhpZXJhcmNoeS5wb3NpdGlvbnMscj10LnJlY3RhbmdsZTtyZXR1cm4gVXQuX3RleHR1cmVDb29yZGluYXRlUm90YXRpb25Qb2ludHMobyxlLG4scil9dmFyIHNGLGdFLEFFLGFGLGZGLHVGLGxGLHBGLGRGLHZkLGRpLHhhLG1GLGhGLF9GLGJFLHlGLGdGLFRFLGJGLFRGLHdGLE9GLEVGLFJGLE9FLFNGLEVyLENGLEVFLGN5LFJFPVooKCk9PntmYygpO0NmKCk7dmUoKTtVZSgpO0Z0KCk7SWUoKTtYdCgpO0ZlKCk7SXQoKTtmdCgpO0h0KCk7WnQoKTtsYSgpO1hlKCk7WWUoKTtzYygpO0xvKCk7c2koKTskZSgpO1d0KCk7Qm4oKTtEZigpO3FyKCk7S28oKTt3bigpO3lFKCk7Um8oKTtsYygpO3NGPW5ldyBjdCxnRT1uZXcgY3Q7QUU9bmV3IEhyLGFGPW5ldyBhLGZGPW5ldyBhLHVGPW5ldyBhLGxGPW5ldyBhLHBGPW5ldyBhLGRGPW5ldyBhLHZkPW5ldyBhLGRpPW5ldyBhLHhhPW5ldyBhLG1GPW5ldyB0dCxoRj1uZXcgdHQsX0Y9bmV3IGEsYkU9bmV3IGVlLHlGPW5ldyBRLGdGPW5ldyBRO1RFPVtdO1JyLmZyb21Qb3NpdGlvbnM9ZnVuY3Rpb24odCl7dD14KHQseC5FTVBUWV9PQkpFQ1QpLHkuZGVmaW5lZCgib3B0aW9ucy5wb3NpdGlvbnMiLHQucG9zaXRpb25zKTtsZXQgZT17cG9seWdvbkhpZXJhcmNoeTp7cG9zaXRpb25zOnQucG9zaXRpb25zfSxoZWlnaHQ6dC5oZWlnaHQsZXh0cnVkZWRIZWlnaHQ6dC5leHRydWRlZEhlaWdodCx2ZXJ0ZXhGb3JtYXQ6dC52ZXJ0ZXhGb3JtYXQsc3RSb3RhdGlvbjp0LnN0Um90YXRpb24sZWxsaXBzb2lkOnQuZWxsaXBzb2lkLGdyYW51bGFyaXR5OnQuZ3JhbnVsYXJpdHkscGVyUG9zaXRpb25IZWlnaHQ6dC5wZXJQb3NpdGlvbkhlaWdodCxjbG9zZVRvcDp0LmNsb3NlVG9wLGNsb3NlQm90dG9tOnQuY2xvc2VCb3R0b20sb2Zmc2V0QXR0cmlidXRlOnQub2Zmc2V0QXR0cmlidXRlLGFyY1R5cGU6dC5hcmNUeXBlLHRleHR1cmVDb29yZGluYXRlczp0LnRleHR1cmVDb29yZGluYXRlc307cmV0dXJuIG5ldyBScihlKX07UnIucGFjaz1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHkudHlwZU9mLm9iamVjdCgidmFsdWUiLHQpLHkuZGVmaW5lZCgiYXJyYXkiLGUpLG49eChuLDApLG49eWUucGFja1BvbHlnb25IaWVyYXJjaHkodC5fcG9seWdvbkhpZXJhcmNoeSxlLG4sYSksJC5wYWNrKHQuX2VsbGlwc29pZCxlLG4pLG4rPSQucGFja2VkTGVuZ3RoLGR0LnBhY2sodC5fdmVydGV4Rm9ybWF0LGUsbiksbis9ZHQucGFja2VkTGVuZ3RoLGVbbisrXT10Ll9oZWlnaHQsZVtuKytdPXQuX2V4dHJ1ZGVkSGVpZ2h0LGVbbisrXT10Ll9ncmFudWxhcml0eSxlW24rK109dC5fc3RSb3RhdGlvbixlW24rK109dC5fcGVyUG9zaXRpb25IZWlnaHRFeHRydWRlPzE6MCxlW24rK109dC5fcGVyUG9zaXRpb25IZWlnaHQ/MTowLGVbbisrXT10Ll9jbG9zZVRvcD8xOjAsZVtuKytdPXQuX2Nsb3NlQm90dG9tPzE6MCxlW24rK109dC5fc2hhZG93Vm9sdW1lPzE6MCxlW24rK109eCh0Ll9vZmZzZXRBdHRyaWJ1dGUsLTEpLGVbbisrXT10Ll9hcmNUeXBlLGgodC5fdGV4dHVyZUNvb3JkaW5hdGVzKT9uPXllLnBhY2tQb2x5Z29uSGllcmFyY2h5KHQuX3RleHR1cmVDb29yZGluYXRlcyxlLG4sdHQpOmVbbisrXT0tMSxlW24rK109dC5wYWNrZWRMZW5ndGgsZX07YkY9JC5jbG9uZSgkLlVOSVRfU1BIRVJFKSxURj1uZXcgZHQsd0Y9e3BvbHlnb25IaWVyYXJjaHk6e319O1JyLnVucGFjaz1mdW5jdGlvbih0LGUsbil7eS5kZWZpbmVkKCJhcnJheSIsdCksZT14KGUsMCk7bGV0IG89eWUudW5wYWNrUG9seWdvbkhpZXJhcmNoeSh0LGUsYSk7ZT1vLnN0YXJ0aW5nSW5kZXgsZGVsZXRlIG8uc3RhcnRpbmdJbmRleDtsZXQgcj0kLnVucGFjayh0LGUsYkYpO2UrPSQucGFja2VkTGVuZ3RoO2xldCBpPWR0LnVucGFjayh0LGUsVEYpO2UrPWR0LnBhY2tlZExlbmd0aDtsZXQgcz10W2UrK10sZj10W2UrK10sdT10W2UrK10sYz10W2UrK10sbD10W2UrK109PT0xLHA9dFtlKytdPT09MSxkPXRbZSsrXT09PTEsbT10W2UrK109PT0xLF89dFtlKytdPT09MSxnPXRbZSsrXSxiPXRbZSsrXSxUPXRbZV09PT0tMT92b2lkIDA6eWUudW5wYWNrUG9seWdvbkhpZXJhcmNoeSh0LGUsdHQpO2goVCk/KGU9VC5zdGFydGluZ0luZGV4LGRlbGV0ZSBULnN0YXJ0aW5nSW5kZXgpOmUrKztsZXQgTz10W2UrK107cmV0dXJuIGgobil8fChuPW5ldyBScih3RikpLG4uX3BvbHlnb25IaWVyYXJjaHk9byxuLl9lbGxpcHNvaWQ9JC5jbG9uZShyLG4uX2VsbGlwc29pZCksbi5fdmVydGV4Rm9ybWF0PWR0LmNsb25lKGksbi5fdmVydGV4Rm9ybWF0KSxuLl9oZWlnaHQ9cyxuLl9leHRydWRlZEhlaWdodD1mLG4uX2dyYW51bGFyaXR5PXUsbi5fc3RSb3RhdGlvbj1jLG4uX3BlclBvc2l0aW9uSGVpZ2h0RXh0cnVkZT1sLG4uX3BlclBvc2l0aW9uSGVpZ2h0PXAsbi5fY2xvc2VUb3A9ZCxuLl9jbG9zZUJvdHRvbT1tLG4uX3NoYWRvd1ZvbHVtZT1fLG4uX29mZnNldEF0dHJpYnV0ZT1nPT09LTE/dm9pZCAwOmcsbi5fYXJjVHlwZT1iLG4uX3RleHR1cmVDb29yZGluYXRlcz1ULG4ucGFja2VkTGVuZ3RoPU8sbn07T0Y9bmV3IHR0LEVGPW5ldyB0dCxSRj1uZXcgY3I7T0U9bmV3IGNyLFNGPW5ldyBjcixFcj17bm9ydGhBbmdsZTowLHNvdXRoQW5nbGU6MCx3ZXN0T3ZlcklkbDowLGVhc3RPdmVySWRsOjB9O1JyLmNvbXB1dGVSZWN0YW5nbGVGcm9tUG9zaXRpb25zPWZ1bmN0aW9uKHQsZSxuLG8pe2lmKHkuZGVmaW5lZCgicG9zaXRpb25zIix0KSxoKG8pfHwobz1uZXcgTnQpLHQubGVuZ3RoPDMpcmV0dXJuIG87by53ZXN0PU51bWJlci5QT1NJVElWRV9JTkZJTklUWSxvLmVhc3Q9TnVtYmVyLk5FR0FUSVZFX0lORklOSVRZLG8uc291dGg9TnVtYmVyLlBPU0lUSVZFX0lORklOSVRZLG8ubm9ydGg9TnVtYmVyLk5FR0FUSVZFX0lORklOSVRZLEVyLm5vcnRoQW5nbGU9MCxFci5zb3V0aEFuZ2xlPTAsRXIud2VzdE92ZXJJZGw9TnVtYmVyLlBPU0lUSVZFX0lORklOSVRZLEVyLmVhc3RPdmVySWRsPU51bWJlci5ORUdBVElWRV9JTkZJTklUWTtsZXQgcj10Lmxlbmd0aCxpPWNyLmZyb21DYXJ0ZXNpYW4odFswXSxTRik7Zm9yKGxldCBzPTE7czxyO3MrKyl7bGV0IGY9Y3IuZnJvbUNhcnRlc2lhbih0W3NdLE9FKTt3RShmLGksZSxuLEVyLG8pLGk9Y3IuY2xvbmUoZixpKX1yZXR1cm4gd0UoY3IuZnJvbUNhcnRlc2lhbih0WzBdLE9FKSxpLGUsbixFcixvKSxvLmVhc3Qtby53ZXN0PkVyLmVhc3RPdmVySWRsLUVyLndlc3RPdmVySWRsJiYoby53ZXN0PUVyLndlc3RPdmVySWRsLG8uZWFzdD1Fci5lYXN0T3ZlcklkbCxvLmVhc3Q+TS5QSSYmKG8uZWFzdD1vLmVhc3QtTS5UV09fUEkpLG8ud2VzdD5NLlBJJiYoby53ZXN0PW8ud2VzdC1NLlRXT19QSSkpLE0uZXF1YWxzRXBzaWxvbihNYXRoLmFicyhFci5ub3J0aEFuZ2xlKSxNLlRXT19QSSxNLkVQU0lMT04xMCkmJihvLm5vcnRoPU0uUElfT1ZFUl9UV08sby5lYXN0PU0uUEksby53ZXN0PS1NLlBJKSxNLmVxdWFsc0Vwc2lsb24oTWF0aC5hYnMoRXIuc291dGhBbmdsZSksTS5UV09fUEksTS5FUFNJTE9OMTApJiYoby5zb3V0aD0tTS5QSV9PVkVSX1RXTyxvLmVhc3Q9TS5QSSxvLndlc3Q9LU0uUEkpLG99O0NGPW5ldyBjcjtFRT1uZXcgY3Q7UnIuY3JlYXRlR2VvbWV0cnk9ZnVuY3Rpb24odCl7bGV0IGU9dC5fdmVydGV4Rm9ybWF0LG49dC5fZWxsaXBzb2lkLG89dC5fZ3JhbnVsYXJpdHkscj10Ll9zdFJvdGF0aW9uLGk9dC5fcG9seWdvbkhpZXJhcmNoeSxzPXQuX3BlclBvc2l0aW9uSGVpZ2h0LGY9dC5fY2xvc2VUb3AsdT10Ll9jbG9zZUJvdHRvbSxjPXQuX2FyY1R5cGUsbD10Ll90ZXh0dXJlQ29vcmRpbmF0ZXMscD1oKGwpLGQ9aS5wb3NpdGlvbnM7aWYoZC5sZW5ndGg8MylyZXR1cm47bGV0IG09dC5yZWN0YW5nbGUsXz15ZS5wb2x5Z29uc0Zyb21IaWVyYXJjaHkoaSxwLFBGKG0sZCxuKSwhcyxuLE5GKG0sbixjLHMpKSxnPV8uaGllcmFyY2h5LGI9Xy5wb2x5Z29ucyxUPWZ1bmN0aW9uKFApe3JldHVybiBQfSxPPXA/eWUucG9seWdvbnNGcm9tSGllcmFyY2h5KGwsITAsVCwhMSxuKS5wb2x5Z29uczp2b2lkIDA7aWYoZy5sZW5ndGg9PT0wKXJldHVybjtsZXQgRT1nWzBdLm91dGVyUmluZyx3PUlGKEUsbSxuLHIpLEM9W10sTj10Ll9oZWlnaHQsST10Ll9leHRydWRlZEhlaWdodCxEPXQuX3BlclBvc2l0aW9uSGVpZ2h0RXh0cnVkZXx8IU0uZXF1YWxzRXBzaWxvbihOLEksMCxNLkVQU0lMT04yKSx2PXtwZXJQb3NpdGlvbkhlaWdodDpzLHZlcnRleEZvcm1hdDplLGdlb21ldHJ5OnZvaWQgMCxyb3RhdGlvbkF4aXM6eEYobSxFLG4pLnBsYW5lLm5vcm1hbCxwcm9qZWN0VG8yZDpNRihtLEUsbiksYm91bmRpbmdSZWN0YW5nbGU6dyxlbGxpcHNvaWQ6bixzdFJvdGF0aW9uOnIsdGV4dHVyZUNvb3JkaW5hdGVzOnZvaWQgMCxib3R0b206ITEsdG9wOiEwLHdhbGw6ITEsZXh0cnVkZTohMSxhcmNUeXBlOmN9LEw7aWYoRClmb3Iodi5leHRydWRlPSEwLHYudG9wPWYsdi5ib3R0b209dSx2LnNoYWRvd1ZvbHVtZT10Ll9zaGFkb3dWb2x1bWUsdi5vZmZzZXRBdHRyaWJ1dGU9dC5fb2Zmc2V0QXR0cmlidXRlLEw9MDtMPGIubGVuZ3RoO0wrKyl7bGV0IFA9QUYobixiW0xdLHA/T1tMXTp2b2lkIDAsbyxnW0xdLHMsZix1LGUsYyksRjtmJiZ1PyhGPVAudG9wQW5kQm90dG9tLHYuZ2VvbWV0cnk9eWUuc2NhbGVUb0dlb2RldGljSGVpZ2h0RXh0cnVkZWQoRi5nZW9tZXRyeSxOLEksbixzKSk6Zj8oRj1QLnRvcEFuZEJvdHRvbSxGLmdlb21ldHJ5LmF0dHJpYnV0ZXMucG9zaXRpb24udmFsdWVzPVBlLnNjYWxlVG9HZW9kZXRpY0hlaWdodChGLmdlb21ldHJ5LmF0dHJpYnV0ZXMucG9zaXRpb24udmFsdWVzLE4sbiwhcyksdi5nZW9tZXRyeT1GLmdlb21ldHJ5KTp1JiYoRj1QLnRvcEFuZEJvdHRvbSxGLmdlb21ldHJ5LmF0dHJpYnV0ZXMucG9zaXRpb24udmFsdWVzPVBlLnNjYWxlVG9HZW9kZXRpY0hlaWdodChGLmdlb21ldHJ5LmF0dHJpYnV0ZXMucG9zaXRpb24udmFsdWVzLEksbiwhMCksdi5nZW9tZXRyeT1GLmdlb21ldHJ5KSwoZnx8dSkmJih2LndhbGw9ITEsRi5nZW9tZXRyeT1zeSh2KSxDLnB1c2goRikpO2xldCBqPVAud2FsbHM7di53YWxsPSEwO2ZvcihsZXQgSD0wO0g8ai5sZW5ndGg7SCsrKXtsZXQgaz1qW0hdO3YuZ2VvbWV0cnk9eWUuc2NhbGVUb0dlb2RldGljSGVpZ2h0RXh0cnVkZWQoay5nZW9tZXRyeSxOLEksbixzKSxrLmdlb21ldHJ5PXN5KHYpLEMucHVzaChrKX19ZWxzZSBmb3IoTD0wO0w8Yi5sZW5ndGg7TCsrKXtsZXQgUD1uZXcgY28oe2dlb21ldHJ5OnllLmNyZWF0ZUdlb21ldHJ5RnJvbVBvc2l0aW9ucyhuLGJbTF0scD9PW0xdOnZvaWQgMCxvLHMsZSxjKX0pO2lmKFAuZ2VvbWV0cnkuYXR0cmlidXRlcy5wb3NpdGlvbi52YWx1ZXM9UGUuc2NhbGVUb0dlb2RldGljSGVpZ2h0KFAuZ2VvbWV0cnkuYXR0cmlidXRlcy5wb3NpdGlvbi52YWx1ZXMsTixuLCFzKSx2Lmdlb21ldHJ5PVAuZ2VvbWV0cnksUC5nZW9tZXRyeT1zeSh2KSxoKHQuX29mZnNldEF0dHJpYnV0ZSkpe2xldCBGPVAuZ2VvbWV0cnkuYXR0cmlidXRlcy5wb3NpdGlvbi52YWx1ZXMubGVuZ3RoLGo9dC5fb2Zmc2V0QXR0cmlidXRlPT09ZmUuTk9ORT8wOjEsSD1uZXcgVWludDhBcnJheShGLzMpLmZpbGwoaik7UC5nZW9tZXRyeS5hdHRyaWJ1dGVzLmFwcGx5T2Zmc2V0PW5ldyBpdCh7Y29tcG9uZW50RGF0YXR5cGU6bnQuVU5TSUdORURfQllURSxjb21wb25lbnRzUGVyQXR0cmlidXRlOjEsdmFsdWVzOkh9KX1DLnB1c2goUCl9bGV0IFU9VmUuY29tYmluZUluc3RhbmNlcyhDKVswXTtVLmF0dHJpYnV0ZXMucG9zaXRpb24udmFsdWVzPW5ldyBGbG9hdDY0QXJyYXkoVS5hdHRyaWJ1dGVzLnBvc2l0aW9uLnZhbHVlcyksVS5pbmRpY2VzPUR0LmNyZWF0ZVR5cGVkQXJyYXkoVS5hdHRyaWJ1dGVzLnBvc2l0aW9uLnZhbHVlcy5sZW5ndGgvMyxVLmluZGljZXMpO2xldCBBPVUuYXR0cmlidXRlcyxTPUF0LmZyb21WZXJ0aWNlcyhBLnBvc2l0aW9uLnZhbHVlcyk7cmV0dXJuIGUucG9zaXRpb258fGRlbGV0ZSBBLnBvc2l0aW9uLG5ldyBVdCh7YXR0cmlidXRlczpBLGluZGljZXM6VS5pbmRpY2VzLHByaW1pdGl2ZVR5cGU6VS5wcmltaXRpdmVUeXBlLGJvdW5kaW5nU3BoZXJlOlMsb2Zmc2V0QXR0cmlidXRlOnQuX29mZnNldEF0dHJpYnV0ZX0pfTtSci5jcmVhdGVTaGFkb3dWb2x1bWU9ZnVuY3Rpb24odCxlLG4pe2xldCBvPXQuX2dyYW51bGFyaXR5LHI9dC5fZWxsaXBzb2lkLGk9ZShvLHIpLHM9bihvLHIpO3JldHVybiBuZXcgUnIoe3BvbHlnb25IaWVyYXJjaHk6dC5fcG9seWdvbkhpZXJhcmNoeSxlbGxpcHNvaWQ6cixzdFJvdGF0aW9uOnQuX3N0Um90YXRpb24sZ3JhbnVsYXJpdHk6byxwZXJQb3NpdGlvbkhlaWdodDohMSxleHRydWRlZEhlaWdodDppLGhlaWdodDpzLHZlcnRleEZvcm1hdDpkdC5QT1NJVElPTl9PTkxZLHNoYWRvd1ZvbHVtZTohMCxhcmNUeXBlOnQuX2FyY1R5cGV9KX07T2JqZWN0LmRlZmluZVByb3BlcnRpZXMoUnIucHJvdG90eXBlLHtyZWN0YW5nbGU6e2dldDpmdW5jdGlvbigpe2lmKCFoKHRoaXMuX3JlY3RhbmdsZSkpe2xldCB0PXRoaXMuX3BvbHlnb25IaWVyYXJjaHkucG9zaXRpb25zO3RoaXMuX3JlY3RhbmdsZT1Sci5jb21wdXRlUmVjdGFuZ2xlRnJvbVBvc2l0aW9ucyh0LHRoaXMuX2VsbGlwc29pZCx0aGlzLl9hcmNUeXBlKX1yZXR1cm4gdGhpcy5fcmVjdGFuZ2xlfX0sdGV4dHVyZUNvb3JkaW5hdGVSb3RhdGlvblBvaW50czp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGgodGhpcy5fdGV4dHVyZUNvb3JkaW5hdGVSb3RhdGlvblBvaW50cyl8fCh0aGlzLl90ZXh0dXJlQ29vcmRpbmF0ZVJvdGF0aW9uUG9pbnRzPXZGKHRoaXMpKSx0aGlzLl90ZXh0dXJlQ29vcmRpbmF0ZVJvdGF0aW9uUG9pbnRzfX19KTtjeT1Scn0pO3ZhciBheT17fTtkZShheSx7ZGVmYXVsdDooKT0+REZ9KTtmdW5jdGlvbiBMRih0LGUpe3JldHVybiBoKGUpJiYodD1jeS51bnBhY2sodCxlKSksdC5fZWxsaXBzb2lkPSQuY2xvbmUodC5fZWxsaXBzb2lkKSxjeS5jcmVhdGVHZW9tZXRyeSh0KX12YXIgREYsZnk9WigoKT0+e2Z0KCk7WnQoKTtSRSgpO0RGPUxGfSk7ZnVuY3Rpb24gRkYodCxlLG4sbyxyKXtsZXQgcz15by5mcm9tUG9pbnRzKGUsdCkucHJvamVjdFBvaW50c09udG9QbGFuZShlLFNFKTtQZS5jb21wdXRlV2luZGluZ09yZGVyMkQocyk9PT1Dby5DTE9DS1dJU0UmJihzLnJldmVyc2UoKSxlPWUuc2xpY2UoKS5yZXZlcnNlKCkpO2xldCB1LGMsbD1lLmxlbmd0aCxwPTA7aWYobylmb3IodT1uZXcgRmxvYXQ2NEFycmF5KGwqMiozKSxjPTA7YzxsO2MrKyl7bGV0IF89ZVtjXSxnPWVbKGMrMSklbF07dVtwKytdPV8ueCx1W3ArK109Xy55LHVbcCsrXT1fLnosdVtwKytdPWcueCx1W3ArK109Zy55LHVbcCsrXT1nLnp9ZWxzZXtsZXQgXz0wO2lmKHI9PT1fZS5HRU9ERVNJQylmb3IoYz0wO2M8bDtjKyspXys9eWUuc3ViZGl2aWRlTGluZUNvdW50KGVbY10sZVsoYysxKSVsXSxuKTtlbHNlIGlmKHI9PT1fZS5SSFVNQilmb3IoYz0wO2M8bDtjKyspXys9eWUuc3ViZGl2aWRlUmh1bWJMaW5lQ291bnQodCxlW2NdLGVbKGMrMSklbF0sbik7Zm9yKHU9bmV3IEZsb2F0NjRBcnJheShfKjMpLGM9MDtjPGw7YysrKXtsZXQgZztyPT09X2UuR0VPREVTSUM/Zz15ZS5zdWJkaXZpZGVMaW5lKGVbY10sZVsoYysxKSVsXSxuLExkKTpyPT09X2UuUkhVTUImJihnPXllLnN1YmRpdmlkZVJodW1iTGluZSh0LGVbY10sZVsoYysxKSVsXSxuLExkKSk7bGV0IGI9Zy5sZW5ndGg7Zm9yKGxldCBUPTA7VDxiOysrVCl1W3ArK109Z1tUXX19bD11Lmxlbmd0aC8zO2xldCBkPWwqMixtPUR0LmNyZWF0ZVR5cGVkQXJyYXkobCxkKTtmb3IocD0wLGM9MDtjPGwtMTtjKyspbVtwKytdPWMsbVtwKytdPWMrMTtyZXR1cm4gbVtwKytdPWwtMSxtW3ArK109MCxuZXcgY28oe2dlb21ldHJ5Om5ldyBVdCh7YXR0cmlidXRlczpuZXcgaWUoe3Bvc2l0aW9uOm5ldyBpdCh7Y29tcG9uZW50RGF0YXR5cGU6bnQuRE9VQkxFLGNvbXBvbmVudHNQZXJBdHRyaWJ1dGU6Myx2YWx1ZXM6dX0pfSksaW5kaWNlczptLHByaW1pdGl2ZVR5cGU6QnQuTElORVN9KX0pfWZ1bmN0aW9uIEJGKHQsZSxuLG8scil7bGV0IHM9eW8uZnJvbVBvaW50cyhlLHQpLnByb2plY3RQb2ludHNPbnRvUGxhbmUoZSxTRSk7UGUuY29tcHV0ZVdpbmRpbmdPcmRlcjJEKHMpPT09Q28uQ0xPQ0tXSVNFJiYocy5yZXZlcnNlKCksZT1lLnNsaWNlKCkucmV2ZXJzZSgpKTtsZXQgdSxjLGw9ZS5sZW5ndGgscD1uZXcgQXJyYXkobCksZD0wO2lmKG8pZm9yKHU9bmV3IEZsb2F0NjRBcnJheShsKjIqMyoyKSxjPTA7YzxsOysrYyl7cFtjXT1kLzM7bGV0IGI9ZVtjXSxUPWVbKGMrMSklbF07dVtkKytdPWIueCx1W2QrK109Yi55LHVbZCsrXT1iLnosdVtkKytdPVQueCx1W2QrK109VC55LHVbZCsrXT1ULnp9ZWxzZXtsZXQgYj0wO2lmKHI9PT1fZS5HRU9ERVNJQylmb3IoYz0wO2M8bDtjKyspYis9eWUuc3ViZGl2aWRlTGluZUNvdW50KGVbY10sZVsoYysxKSVsXSxuKTtlbHNlIGlmKHI9PT1fZS5SSFVNQilmb3IoYz0wO2M8bDtjKyspYis9eWUuc3ViZGl2aWRlUmh1bWJMaW5lQ291bnQodCxlW2NdLGVbKGMrMSklbF0sbik7Zm9yKHU9bmV3IEZsb2F0NjRBcnJheShiKjMqMiksYz0wO2M8bDsrK2Mpe3BbY109ZC8zO2xldCBUO3I9PT1fZS5HRU9ERVNJQz9UPXllLnN1YmRpdmlkZUxpbmUoZVtjXSxlWyhjKzEpJWxdLG4sTGQpOnI9PT1fZS5SSFVNQiYmKFQ9eWUuc3ViZGl2aWRlUmh1bWJMaW5lKHQsZVtjXSxlWyhjKzEpJWxdLG4sTGQpKTtsZXQgTz1ULmxlbmd0aDtmb3IobGV0IEU9MDtFPE87KytFKXVbZCsrXT1UW0VdfX1sPXUubGVuZ3RoLygzKjIpO2xldCBtPXAubGVuZ3RoLF89KGwqMittKSoyLGc9RHQuY3JlYXRlVHlwZWRBcnJheShsK20sXyk7Zm9yKGQ9MCxjPTA7YzxsOysrYylnW2QrK109YyxnW2QrK109KGMrMSklbCxnW2QrK109YytsLGdbZCsrXT0oYysxKSVsK2w7Zm9yKGM9MDtjPG07YysrKXtsZXQgYj1wW2NdO2dbZCsrXT1iLGdbZCsrXT1iK2x9cmV0dXJuIG5ldyBjbyh7Z2VvbWV0cnk6bmV3IFV0KHthdHRyaWJ1dGVzOm5ldyBpZSh7cG9zaXRpb246bmV3IGl0KHtjb21wb25lbnREYXRhdHlwZTpudC5ET1VCTEUsY29tcG9uZW50c1BlckF0dHJpYnV0ZTozLHZhbHVlczp1fSl9KSxpbmRpY2VzOmcscHJpbWl0aXZlVHlwZTpCdC5MSU5FU30pfSl9ZnVuY3Rpb24gQWModCl7aWYoeS50eXBlT2Yub2JqZWN0KCJvcHRpb25zIix0KSx5LnR5cGVPZi5vYmplY3QoIm9wdGlvbnMucG9seWdvbkhpZXJhcmNoeSIsdC5wb2x5Z29uSGllcmFyY2h5KSx0LnBlclBvc2l0aW9uSGVpZ2h0JiZoKHQuaGVpZ2h0KSl0aHJvdyBuZXcgQigiQ2Fubm90IHVzZSBib3RoIG9wdGlvbnMucGVyUG9zaXRpb25IZWlnaHQgYW5kIG9wdGlvbnMuaGVpZ2h0Iik7aWYoaCh0LmFyY1R5cGUpJiZ0LmFyY1R5cGUhPT1fZS5HRU9ERVNJQyYmdC5hcmNUeXBlIT09X2UuUkhVTUIpdGhyb3cgbmV3IEIoIkludmFsaWQgYXJjVHlwZS4gVmFsaWQgb3B0aW9ucyBhcmUgQXJjVHlwZS5HRU9ERVNJQyBhbmQgQXJjVHlwZS5SSFVNQi4iKTtsZXQgZT10LnBvbHlnb25IaWVyYXJjaHksbj14KHQuZWxsaXBzb2lkLCQuZGVmYXVsdCksbz14KHQuZ3JhbnVsYXJpdHksTS5SQURJQU5TX1BFUl9ERUdSRUUpLHI9eCh0LnBlclBvc2l0aW9uSGVpZ2h0LCExKSxpPXImJmgodC5leHRydWRlZEhlaWdodCkscz14KHQuYXJjVHlwZSxfZS5HRU9ERVNJQyksZj14KHQuaGVpZ2h0LDApLHU9eCh0LmV4dHJ1ZGVkSGVpZ2h0LGYpO2lmKCFpKXtsZXQgYz1NYXRoLm1heChmLHUpO3U9TWF0aC5taW4oZix1KSxmPWN9dGhpcy5fZWxsaXBzb2lkPSQuY2xvbmUobiksdGhpcy5fZ3JhbnVsYXJpdHk9byx0aGlzLl9oZWlnaHQ9Zix0aGlzLl9leHRydWRlZEhlaWdodD11LHRoaXMuX2FyY1R5cGU9cyx0aGlzLl9wb2x5Z29uSGllcmFyY2h5PWUsdGhpcy5fcGVyUG9zaXRpb25IZWlnaHQ9cix0aGlzLl9wZXJQb3NpdGlvbkhlaWdodEV4dHJ1ZGU9aSx0aGlzLl9vZmZzZXRBdHRyaWJ1dGU9dC5vZmZzZXRBdHRyaWJ1dGUsdGhpcy5fd29ya2VyTmFtZT0iY3JlYXRlUG9seWdvbk91dGxpbmVHZW9tZXRyeSIsdGhpcy5wYWNrZWRMZW5ndGg9eWUuY29tcHV0ZUhpZXJhcmNoeVBhY2tlZExlbmd0aChlLGEpKyQucGFja2VkTGVuZ3RoKzh9dmFyIFNFLExkLFVGLFZGLHV5LENFPVooKCk9PntmYygpO3ZlKCk7RnQoKTtYdCgpO0ZlKCk7SXQoKTtmdCgpO0h0KCk7WnQoKTtsYSgpO1hlKCk7WWUoKTthbigpO3NjKCk7TG8oKTtzaSgpOyRlKCk7V3QoKTtEZigpO3FyKCk7dG4oKTtsYygpO1NFPVtdLExkPVtdO0FjLnBhY2s9ZnVuY3Rpb24odCxlLG4pe3JldHVybiB5LnR5cGVPZi5vYmplY3QoInZhbHVlIix0KSx5LmRlZmluZWQoImFycmF5IixlKSxuPXgobiwwKSxuPXllLnBhY2tQb2x5Z29uSGllcmFyY2h5KHQuX3BvbHlnb25IaWVyYXJjaHksZSxuLGEpLCQucGFjayh0Ll9lbGxpcHNvaWQsZSxuKSxuKz0kLnBhY2tlZExlbmd0aCxlW24rK109dC5faGVpZ2h0LGVbbisrXT10Ll9leHRydWRlZEhlaWdodCxlW24rK109dC5fZ3JhbnVsYXJpdHksZVtuKytdPXQuX3BlclBvc2l0aW9uSGVpZ2h0RXh0cnVkZT8xOjAsZVtuKytdPXQuX3BlclBvc2l0aW9uSGVpZ2h0PzE6MCxlW24rK109dC5fYXJjVHlwZSxlW24rK109eCh0Ll9vZmZzZXRBdHRyaWJ1dGUsLTEpLGVbbl09dC5wYWNrZWRMZW5ndGgsZX07VUY9JC5jbG9uZSgkLlVOSVRfU1BIRVJFKSxWRj17cG9seWdvbkhpZXJhcmNoeTp7fX07QWMudW5wYWNrPWZ1bmN0aW9uKHQsZSxuKXt5LmRlZmluZWQoImFycmF5Iix0KSxlPXgoZSwwKTtsZXQgbz15ZS51bnBhY2tQb2x5Z29uSGllcmFyY2h5KHQsZSxhKTtlPW8uc3RhcnRpbmdJbmRleCxkZWxldGUgby5zdGFydGluZ0luZGV4O2xldCByPSQudW5wYWNrKHQsZSxVRik7ZSs9JC5wYWNrZWRMZW5ndGg7bGV0IGk9dFtlKytdLHM9dFtlKytdLGY9dFtlKytdLHU9dFtlKytdPT09MSxjPXRbZSsrXT09PTEsbD10W2UrK10scD10W2UrK10sZD10W2VdO3JldHVybiBoKG4pfHwobj1uZXcgQWMoVkYpKSxuLl9wb2x5Z29uSGllcmFyY2h5PW8sbi5fZWxsaXBzb2lkPSQuY2xvbmUocixuLl9lbGxpcHNvaWQpLG4uX2hlaWdodD1pLG4uX2V4dHJ1ZGVkSGVpZ2h0PXMsbi5fZ3JhbnVsYXJpdHk9ZixuLl9wZXJQb3NpdGlvbkhlaWdodD1jLG4uX3BlclBvc2l0aW9uSGVpZ2h0RXh0cnVkZT11LG4uX2FyY1R5cGU9bCxuLl9vZmZzZXRBdHRyaWJ1dGU9cD09PS0xP3ZvaWQgMDpwLG4ucGFja2VkTGVuZ3RoPWQsbn07QWMuZnJvbVBvc2l0aW9ucz1mdW5jdGlvbih0KXt0PXgodCx4LkVNUFRZX09CSkVDVCkseS5kZWZpbmVkKCJvcHRpb25zLnBvc2l0aW9ucyIsdC5wb3NpdGlvbnMpO2xldCBlPXtwb2x5Z29uSGllcmFyY2h5Ontwb3NpdGlvbnM6dC5wb3NpdGlvbnN9LGhlaWdodDp0LmhlaWdodCxleHRydWRlZEhlaWdodDp0LmV4dHJ1ZGVkSGVpZ2h0LGVsbGlwc29pZDp0LmVsbGlwc29pZCxncmFudWxhcml0eTp0LmdyYW51bGFyaXR5LHBlclBvc2l0aW9uSGVpZ2h0OnQucGVyUG9zaXRpb25IZWlnaHQsYXJjVHlwZTp0LmFyY1R5cGUsb2Zmc2V0QXR0cmlidXRlOnQub2Zmc2V0QXR0cmlidXRlfTtyZXR1cm4gbmV3IEFjKGUpfTtBYy5jcmVhdGVHZW9tZXRyeT1mdW5jdGlvbih0KXtsZXQgZT10Ll9lbGxpcHNvaWQsbj10Ll9ncmFudWxhcml0eSxvPXQuX3BvbHlnb25IaWVyYXJjaHkscj10Ll9wZXJQb3NpdGlvbkhlaWdodCxpPXQuX2FyY1R5cGUscz15ZS5wb2x5Z29uT3V0bGluZXNGcm9tSGllcmFyY2h5KG8sIXIsZSk7aWYocy5sZW5ndGg9PT0wKXJldHVybjtsZXQgZix1PVtdLGM9TS5jaG9yZExlbmd0aChuLGUubWF4aW11bVJhZGl1cyksbD10Ll9oZWlnaHQscD10Ll9leHRydWRlZEhlaWdodCxkPXQuX3BlclBvc2l0aW9uSGVpZ2h0RXh0cnVkZXx8IU0uZXF1YWxzRXBzaWxvbihsLHAsMCxNLkVQU0lMT04yKSxtLF87aWYoZClmb3IoXz0wO188cy5sZW5ndGg7XysrKXtpZihmPUJGKGUsc1tfXSxjLHIsaSksZi5nZW9tZXRyeT15ZS5zY2FsZVRvR2VvZGV0aWNIZWlnaHRFeHRydWRlZChmLmdlb21ldHJ5LGwscCxlLHIpLGgodC5fb2Zmc2V0QXR0cmlidXRlKSl7bGV0IFQ9Zi5nZW9tZXRyeS5hdHRyaWJ1dGVzLnBvc2l0aW9uLnZhbHVlcy5sZW5ndGgvMyxPPW5ldyBVaW50OEFycmF5KFQpO3QuX29mZnNldEF0dHJpYnV0ZT09PWZlLlRPUD9PPU8uZmlsbCgxLDAsVC8yKToobT10Ll9vZmZzZXRBdHRyaWJ1dGU9PT1mZS5OT05FPzA6MSxPPU8uZmlsbChtKSksZi5nZW9tZXRyeS5hdHRyaWJ1dGVzLmFwcGx5T2Zmc2V0PW5ldyBpdCh7Y29tcG9uZW50RGF0YXR5cGU6bnQuVU5TSUdORURfQllURSxjb21wb25lbnRzUGVyQXR0cmlidXRlOjEsdmFsdWVzOk99KX11LnB1c2goZil9ZWxzZSBmb3IoXz0wO188cy5sZW5ndGg7XysrKXtpZihmPUZGKGUsc1tfXSxjLHIsaSksZi5nZW9tZXRyeS5hdHRyaWJ1dGVzLnBvc2l0aW9uLnZhbHVlcz1QZS5zY2FsZVRvR2VvZGV0aWNIZWlnaHQoZi5nZW9tZXRyeS5hdHRyaWJ1dGVzLnBvc2l0aW9uLnZhbHVlcyxsLGUsIXIpLGgodC5fb2Zmc2V0QXR0cmlidXRlKSl7bGV0IFQ9Zi5nZW9tZXRyeS5hdHRyaWJ1dGVzLnBvc2l0aW9uLnZhbHVlcy5sZW5ndGg7bT10Ll9vZmZzZXRBdHRyaWJ1dGU9PT1mZS5OT05FPzA6MTtsZXQgTz1uZXcgVWludDhBcnJheShULzMpLmZpbGwobSk7Zi5nZW9tZXRyeS5hdHRyaWJ1dGVzLmFwcGx5T2Zmc2V0PW5ldyBpdCh7Y29tcG9uZW50RGF0YXR5cGU6bnQuVU5TSUdORURfQllURSxjb21wb25lbnRzUGVyQXR0cmlidXRlOjEsdmFsdWVzOk99KX11LnB1c2goZil9bGV0IGc9VmUuY29tYmluZUluc3RhbmNlcyh1KVswXSxiPUF0LmZyb21WZXJ0aWNlcyhnLmF0dHJpYnV0ZXMucG9zaXRpb24udmFsdWVzKTtyZXR1cm4gbmV3IFV0KHthdHRyaWJ1dGVzOmcuYXR0cmlidXRlcyxpbmRpY2VzOmcuaW5kaWNlcyxwcmltaXRpdmVUeXBlOmcucHJpbWl0aXZlVHlwZSxib3VuZGluZ1NwaGVyZTpiLG9mZnNldEF0dHJpYnV0ZTp0Ll9vZmZzZXRBdHRyaWJ1dGV9KX07dXk9QWN9KTt2YXIgbHk9e307ZGUobHkse2RlZmF1bHQ6KCk9PkdGfSk7ZnVuY3Rpb24ga0YodCxlKXtyZXR1cm4gaChlKSYmKHQ9dXkudW5wYWNrKHQsZSkpLHQuX2VsbGlwc29pZD0kLmNsb25lKHQuX2VsbGlwc29pZCksdXkuY3JlYXRlR2VvbWV0cnkodCl9dmFyIEdGLHB5PVooKCk9PntmdCgpO1p0KCk7Q0UoKTtHRj1rRn0pO2Z1bmN0aW9uIGR5KHQsZSxuKXtyZXR1cm4gbjwwJiYobis9MSksbj4xJiYobi09MSksbio2PDE/dCsoZS10KSo2Km46bioyPDE/ZTpuKjM8Mj90KyhlLXQpKigyLzMtbikqNjp0fWZ1bmN0aW9uIHEodCxlLG4sbyl7dGhpcy5yZWQ9eCh0LDEpLHRoaXMuZ3JlZW49eChlLDEpLHRoaXMuYmx1ZT14KG4sMSksdGhpcy5hbHBoYT14KG8sMSl9dmFyIG15LGh5LHFpLHpGLGpGLEhGLHFGLG9lLFBhPVooKCk9PntYdCgpO0l0KCk7ZnQoKTtzaCgpO1d0KCk7cS5mcm9tQ2FydGVzaWFuND1mdW5jdGlvbih0LGUpe3JldHVybiB5LnR5cGVPZi5vYmplY3QoImNhcnRlc2lhbiIsdCksaChlKT8oZS5yZWQ9dC54LGUuZ3JlZW49dC55LGUuYmx1ZT10LnosZS5hbHBoYT10LncsZSk6bmV3IHEodC54LHQueSx0LnosdC53KX07cS5mcm9tQnl0ZXM9ZnVuY3Rpb24odCxlLG4sbyxyKXtyZXR1cm4gdD1xLmJ5dGVUb0Zsb2F0KHgodCwyNTUpKSxlPXEuYnl0ZVRvRmxvYXQoeChlLDI1NSkpLG49cS5ieXRlVG9GbG9hdCh4KG4sMjU1KSksbz1xLmJ5dGVUb0Zsb2F0KHgobywyNTUpKSxoKHIpPyhyLnJlZD10LHIuZ3JlZW49ZSxyLmJsdWU9bixyLmFscGhhPW8scik6bmV3IHEodCxlLG4sbyl9O3EuZnJvbUFscGhhPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4geS50eXBlT2Yub2JqZWN0KCJjb2xvciIsdCkseS50eXBlT2YubnVtYmVyKCJhbHBoYSIsZSksaChuKT8obi5yZWQ9dC5yZWQsbi5ncmVlbj10LmdyZWVuLG4uYmx1ZT10LmJsdWUsbi5hbHBoYT1lLG4pOm5ldyBxKHQucmVkLHQuZ3JlZW4sdC5ibHVlLGUpfTtZcy5zdXBwb3J0c1R5cGVkQXJyYXlzKCkmJihteT1uZXcgQXJyYXlCdWZmZXIoNCksaHk9bmV3IFVpbnQzMkFycmF5KG15KSxxaT1uZXcgVWludDhBcnJheShteSkpO3EuZnJvbVJnYmE9ZnVuY3Rpb24odCxlKXtyZXR1cm4gaHlbMF09dCxxLmZyb21CeXRlcyhxaVswXSxxaVsxXSxxaVsyXSxxaVszXSxlKX07cS5mcm9tSHNsPWZ1bmN0aW9uKHQsZSxuLG8scil7dD14KHQsMCklMSxlPXgoZSwwKSxuPXgobiwwKSxvPXgobywxKTtsZXQgaT1uLHM9bixmPW47aWYoZSE9PTApe2xldCB1O248LjU/dT1uKigxK2UpOnU9bitlLW4qZTtsZXQgYz0yKm4tdTtpPWR5KGMsdSx0KzEvMykscz1keShjLHUsdCksZj1keShjLHUsdC0xLzMpfXJldHVybiBoKHIpPyhyLnJlZD1pLHIuZ3JlZW49cyxyLmJsdWU9ZixyLmFscGhhPW8scik6bmV3IHEoaSxzLGYsbyl9O3EuZnJvbVJhbmRvbT1mdW5jdGlvbih0LGUpe3Q9eCh0LHguRU1QVFlfT0JKRUNUKTtsZXQgbj10LnJlZDtpZighaChuKSl7bGV0IHM9eCh0Lm1pbmltdW1SZWQsMCksZj14KHQubWF4aW11bVJlZCwxKTt5LnR5cGVPZi5udW1iZXIubGVzc1RoYW5PckVxdWFscygibWluaW11bVJlZCIscyxmKSxuPXMrTS5uZXh0UmFuZG9tTnVtYmVyKCkqKGYtcyl9bGV0IG89dC5ncmVlbjtpZighaChvKSl7bGV0IHM9eCh0Lm1pbmltdW1HcmVlbiwwKSxmPXgodC5tYXhpbXVtR3JlZW4sMSk7eS50eXBlT2YubnVtYmVyLmxlc3NUaGFuT3JFcXVhbHMoIm1pbmltdW1HcmVlbiIscyxmKSxvPXMrTS5uZXh0UmFuZG9tTnVtYmVyKCkqKGYtcyl9bGV0IHI9dC5ibHVlO2lmKCFoKHIpKXtsZXQgcz14KHQubWluaW11bUJsdWUsMCksZj14KHQubWF4aW11bUJsdWUsMSk7eS50eXBlT2YubnVtYmVyLmxlc3NUaGFuT3JFcXVhbHMoIm1pbmltdW1CbHVlIixzLGYpLHI9cytNLm5leHRSYW5kb21OdW1iZXIoKSooZi1zKX1sZXQgaT10LmFscGhhO2lmKCFoKGkpKXtsZXQgcz14KHQubWluaW11bUFscGhhLDApLGY9eCh0Lm1heGltdW1BbHBoYSwxKTt5LnR5cGVPZi5udW1iZXIubGVzc1RoYW5PckVxdWFscygibWluaW11bUFscGhhIixzLGYpLGk9cytNLm5leHRSYW5kb21OdW1iZXIoKSooZi1zKX1yZXR1cm4gaChlKT8oZS5yZWQ9bixlLmdyZWVuPW8sZS5ibHVlPXIsZS5hbHBoYT1pLGUpOm5ldyBxKG4sbyxyLGkpfTt6Rj0vXiMoWzAtOWEtZl0pKFswLTlhLWZdKShbMC05YS1mXSkoWzAtOWEtZl0pPyQvaSxqRj0vXiMoWzAtOWEtZl17Mn0pKFswLTlhLWZdezJ9KShbMC05YS1mXXsyfSkoWzAtOWEtZl17Mn0pPyQvaSxIRj0vXnJnYmE/XHMqXChccyooWzAtOS5dKyU/KVxzKlssXHNdK1xzKihbMC05Ll0rJT8pXHMqWyxcc10rXHMqKFswLTkuXSslPykoPzpccypbLFxzL10rXHMqKFswLTkuXSspKT9ccypcKSQvaSxxRj0vXmhzbGE/XHMqXChccyooWzAtOS5dKylccypbLFxzXStccyooWzAtOS5dKyUpXHMqWyxcc10rXHMqKFswLTkuXSslKSg/OlxzKlssXHMvXStccyooWzAtOS5dKykpP1xzKlwpJC9pO3EuZnJvbUNzc0NvbG9yU3RyaW5nPWZ1bmN0aW9uKHQsZSl7eS50eXBlT2Yuc3RyaW5nKCJjb2xvciIsdCksaChlKXx8KGU9bmV3IHEpLHQ9dC50cmltKCk7bGV0IG49cVt0LnRvVXBwZXJDYXNlKCldO2lmKGgobikpcmV0dXJuIHEuY2xvbmUobixlKSxlO2xldCBvPXpGLmV4ZWModCk7cmV0dXJuIG8hPT1udWxsPyhlLnJlZD1wYXJzZUludChvWzFdLDE2KS8xNSxlLmdyZWVuPXBhcnNlSW50KG9bMl0sMTYpLzE1LGUuYmx1ZT1wYXJzZUludChvWzNdLDE2KS8xNSxlLmFscGhhPXBhcnNlSW50KHgob1s0XSwiZiIpLDE2KS8xNSxlKToobz1qRi5leGVjKHQpLG8hPT1udWxsPyhlLnJlZD1wYXJzZUludChvWzFdLDE2KS8yNTUsZS5ncmVlbj1wYXJzZUludChvWzJdLDE2KS8yNTUsZS5ibHVlPXBhcnNlSW50KG9bM10sMTYpLzI1NSxlLmFscGhhPXBhcnNlSW50KHgob1s0XSwiZmYiKSwxNikvMjU1LGUpOihvPUhGLmV4ZWModCksbyE9PW51bGw/KGUucmVkPXBhcnNlRmxvYXQob1sxXSkvKG9bMV0uc3Vic3RyKC0xKT09PSIlIj8xMDA6MjU1KSxlLmdyZWVuPXBhcnNlRmxvYXQob1syXSkvKG9bMl0uc3Vic3RyKC0xKT09PSIlIj8xMDA6MjU1KSxlLmJsdWU9cGFyc2VGbG9hdChvWzNdKS8ob1szXS5zdWJzdHIoLTEpPT09IiUiPzEwMDoyNTUpLGUuYWxwaGE9cGFyc2VGbG9hdCh4KG9bNF0sIjEuMCIpKSxlKToobz1xRi5leGVjKHQpLG8hPT1udWxsP3EuZnJvbUhzbChwYXJzZUZsb2F0KG9bMV0pLzM2MCxwYXJzZUZsb2F0KG9bMl0pLzEwMCxwYXJzZUZsb2F0KG9bM10pLzEwMCxwYXJzZUZsb2F0KHgob1s0XSwiMS4wIikpLGUpOihlPXZvaWQgMCxlKSkpKX07cS5wYWNrZWRMZW5ndGg9NDtxLnBhY2s9ZnVuY3Rpb24odCxlLG4pe3JldHVybiB5LnR5cGVPZi5vYmplY3QoInZhbHVlIix0KSx5LmRlZmluZWQoImFycmF5IixlKSxuPXgobiwwKSxlW24rK109dC5yZWQsZVtuKytdPXQuZ3JlZW4sZVtuKytdPXQuYmx1ZSxlW25dPXQuYWxwaGEsZX07cS51bnBhY2s9ZnVuY3Rpb24odCxlLG4pe3JldHVybiB5LmRlZmluZWQoImFycmF5Iix0KSxlPXgoZSwwKSxoKG4pfHwobj1uZXcgcSksbi5yZWQ9dFtlKytdLG4uZ3JlZW49dFtlKytdLG4uYmx1ZT10W2UrK10sbi5hbHBoYT10W2VdLG59O3EuYnl0ZVRvRmxvYXQ9ZnVuY3Rpb24odCl7cmV0dXJuIHQvMjU1fTtxLmZsb2F0VG9CeXRlPWZ1bmN0aW9uKHQpe3JldHVybiB0PT09MT8yNTU6dCoyNTZ8MH07cS5jbG9uZT1mdW5jdGlvbih0LGUpe2lmKGgodCkpcmV0dXJuIGgoZSk/KGUucmVkPXQucmVkLGUuZ3JlZW49dC5ncmVlbixlLmJsdWU9dC5ibHVlLGUuYWxwaGE9dC5hbHBoYSxlKTpuZXcgcSh0LnJlZCx0LmdyZWVuLHQuYmx1ZSx0LmFscGhhKX07cS5lcXVhbHM9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdD09PWV8fGgodCkmJmgoZSkmJnQucmVkPT09ZS5yZWQmJnQuZ3JlZW49PT1lLmdyZWVuJiZ0LmJsdWU9PT1lLmJsdWUmJnQuYWxwaGE9PT1lLmFscGhhfTtxLmVxdWFsc0FycmF5PWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gdC5yZWQ9PT1lW25dJiZ0LmdyZWVuPT09ZVtuKzFdJiZ0LmJsdWU9PT1lW24rMl0mJnQuYWxwaGE9PT1lW24rM119O3EucHJvdG90eXBlLmNsb25lPWZ1bmN0aW9uKHQpe3JldHVybiBxLmNsb25lKHRoaXMsdCl9O3EucHJvdG90eXBlLmVxdWFscz1mdW5jdGlvbih0KXtyZXR1cm4gcS5lcXVhbHModGhpcyx0KX07cS5wcm90b3R5cGUuZXF1YWxzRXBzaWxvbj1mdW5jdGlvbih0LGUpe3JldHVybiB0aGlzPT09dHx8aCh0KSYmTWF0aC5hYnModGhpcy5yZWQtdC5yZWQpPD1lJiZNYXRoLmFicyh0aGlzLmdyZWVuLXQuZ3JlZW4pPD1lJiZNYXRoLmFicyh0aGlzLmJsdWUtdC5ibHVlKTw9ZSYmTWF0aC5hYnModGhpcy5hbHBoYS10LmFscGhhKTw9ZX07cS5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm5gKCR7dGhpcy5yZWR9LCAke3RoaXMuZ3JlZW59LCAke3RoaXMuYmx1ZX0sICR7dGhpcy5hbHBoYX0pYH07cS5wcm90b3R5cGUudG9Dc3NDb2xvclN0cmluZz1mdW5jdGlvbigpe2xldCB0PXEuZmxvYXRUb0J5dGUodGhpcy5yZWQpLGU9cS5mbG9hdFRvQnl0ZSh0aGlzLmdyZWVuKSxuPXEuZmxvYXRUb0J5dGUodGhpcy5ibHVlKTtyZXR1cm4gdGhpcy5hbHBoYT09PTE/YHJnYigke3R9LCR7ZX0sJHtufSlgOmByZ2JhKCR7dH0sJHtlfSwke259LCR7dGhpcy5hbHBoYX0pYH07cS5wcm90b3R5cGUudG9Dc3NIZXhTdHJpbmc9ZnVuY3Rpb24oKXtsZXQgdD1xLmZsb2F0VG9CeXRlKHRoaXMucmVkKS50b1N0cmluZygxNik7dC5sZW5ndGg8MiYmKHQ9YDAke3R9YCk7bGV0IGU9cS5mbG9hdFRvQnl0ZSh0aGlzLmdyZWVuKS50b1N0cmluZygxNik7ZS5sZW5ndGg8MiYmKGU9YDAke2V9YCk7bGV0IG49cS5mbG9hdFRvQnl0ZSh0aGlzLmJsdWUpLnRvU3RyaW5nKDE2KTtpZihuLmxlbmd0aDwyJiYobj1gMCR7bn1gKSx0aGlzLmFscGhhPDEpe2xldCBvPXEuZmxvYXRUb0J5dGUodGhpcy5hbHBoYSkudG9TdHJpbmcoMTYpO3JldHVybiBvLmxlbmd0aDwyJiYobz1gMCR7b31gKSxgIyR7dH0ke2V9JHtufSR7b31gfXJldHVybmAjJHt0fSR7ZX0ke259YH07cS5wcm90b3R5cGUudG9CeXRlcz1mdW5jdGlvbih0KXtsZXQgZT1xLmZsb2F0VG9CeXRlKHRoaXMucmVkKSxuPXEuZmxvYXRUb0J5dGUodGhpcy5ncmVlbiksbz1xLmZsb2F0VG9CeXRlKHRoaXMuYmx1ZSkscj1xLmZsb2F0VG9CeXRlKHRoaXMuYWxwaGEpO3JldHVybiBoKHQpPyh0WzBdPWUsdFsxXT1uLHRbMl09byx0WzNdPXIsdCk6W2UsbixvLHJdfTtxLnByb3RvdHlwZS50b1JnYmE9ZnVuY3Rpb24oKXtyZXR1cm4gcWlbMF09cS5mbG9hdFRvQnl0ZSh0aGlzLnJlZCkscWlbMV09cS5mbG9hdFRvQnl0ZSh0aGlzLmdyZWVuKSxxaVsyXT1xLmZsb2F0VG9CeXRlKHRoaXMuYmx1ZSkscWlbM109cS5mbG9hdFRvQnl0ZSh0aGlzLmFscGhhKSxoeVswXX07cS5wcm90b3R5cGUuYnJpZ2h0ZW49ZnVuY3Rpb24odCxlKXtyZXR1cm4geS50eXBlT2YubnVtYmVyKCJtYWduaXR1ZGUiLHQpLHkudHlwZU9mLm51bWJlci5ncmVhdGVyVGhhbk9yRXF1YWxzKCJtYWduaXR1ZGUiLHQsMCkseS50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLGUpLHQ9MS10LGUucmVkPTEtKDEtdGhpcy5yZWQpKnQsZS5ncmVlbj0xLSgxLXRoaXMuZ3JlZW4pKnQsZS5ibHVlPTEtKDEtdGhpcy5ibHVlKSp0LGUuYWxwaGE9dGhpcy5hbHBoYSxlfTtxLnByb3RvdHlwZS5kYXJrZW49ZnVuY3Rpb24odCxlKXtyZXR1cm4geS50eXBlT2YubnVtYmVyKCJtYWduaXR1ZGUiLHQpLHkudHlwZU9mLm51bWJlci5ncmVhdGVyVGhhbk9yRXF1YWxzKCJtYWduaXR1ZGUiLHQsMCkseS50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLGUpLHQ9MS10LGUucmVkPXRoaXMucmVkKnQsZS5ncmVlbj10aGlzLmdyZWVuKnQsZS5ibHVlPXRoaXMuYmx1ZSp0LGUuYWxwaGE9dGhpcy5hbHBoYSxlfTtxLnByb3RvdHlwZS53aXRoQWxwaGE9ZnVuY3Rpb24odCxlKXtyZXR1cm4gcS5mcm9tQWxwaGEodGhpcyx0LGUpfTtxLmFkZD1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHkudHlwZU9mLm9iamVjdCgibGVmdCIsdCkseS50eXBlT2Yub2JqZWN0KCJyaWdodCIsZSkseS50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLG4pLG4ucmVkPXQucmVkK2UucmVkLG4uZ3JlZW49dC5ncmVlbitlLmdyZWVuLG4uYmx1ZT10LmJsdWUrZS5ibHVlLG4uYWxwaGE9dC5hbHBoYStlLmFscGhhLG59O3Euc3VidHJhY3Q9ZnVuY3Rpb24odCxlLG4pe3JldHVybiB5LnR5cGVPZi5vYmplY3QoImxlZnQiLHQpLHkudHlwZU9mLm9iamVjdCgicmlnaHQiLGUpLHkudHlwZU9mLm9iamVjdCgicmVzdWx0IixuKSxuLnJlZD10LnJlZC1lLnJlZCxuLmdyZWVuPXQuZ3JlZW4tZS5ncmVlbixuLmJsdWU9dC5ibHVlLWUuYmx1ZSxuLmFscGhhPXQuYWxwaGEtZS5hbHBoYSxufTtxLm11bHRpcGx5PWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4geS50eXBlT2Yub2JqZWN0KCJsZWZ0Iix0KSx5LnR5cGVPZi5vYmplY3QoInJpZ2h0IixlKSx5LnR5cGVPZi5vYmplY3QoInJlc3VsdCIsbiksbi5yZWQ9dC5yZWQqZS5yZWQsbi5ncmVlbj10LmdyZWVuKmUuZ3JlZW4sbi5ibHVlPXQuYmx1ZSplLmJsdWUsbi5hbHBoYT10LmFscGhhKmUuYWxwaGEsbn07cS5kaXZpZGU9ZnVuY3Rpb24odCxlLG4pe3JldHVybiB5LnR5cGVPZi5vYmplY3QoImxlZnQiLHQpLHkudHlwZU9mLm9iamVjdCgicmlnaHQiLGUpLHkudHlwZU9mLm9iamVjdCgicmVzdWx0IixuKSxuLnJlZD10LnJlZC9lLnJlZCxuLmdyZWVuPXQuZ3JlZW4vZS5ncmVlbixuLmJsdWU9dC5ibHVlL2UuYmx1ZSxuLmFscGhhPXQuYWxwaGEvZS5hbHBoYSxufTtxLm1vZD1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHkudHlwZU9mLm9iamVjdCgibGVmdCIsdCkseS50eXBlT2Yub2JqZWN0KCJyaWdodCIsZSkseS50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLG4pLG4ucmVkPXQucmVkJWUucmVkLG4uZ3JlZW49dC5ncmVlbiVlLmdyZWVuLG4uYmx1ZT10LmJsdWUlZS5ibHVlLG4uYWxwaGE9dC5hbHBoYSVlLmFscGhhLG59O3EubGVycD1mdW5jdGlvbih0LGUsbixvKXtyZXR1cm4geS50eXBlT2Yub2JqZWN0KCJzdGFydCIsdCkseS50eXBlT2Yub2JqZWN0KCJlbmQiLGUpLHkudHlwZU9mLm51bWJlcigidCIsbikseS50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLG8pLG8ucmVkPU0ubGVycCh0LnJlZCxlLnJlZCxuKSxvLmdyZWVuPU0ubGVycCh0LmdyZWVuLGUuZ3JlZW4sbiksby5ibHVlPU0ubGVycCh0LmJsdWUsZS5ibHVlLG4pLG8uYWxwaGE9TS5sZXJwKHQuYWxwaGEsZS5hbHBoYSxuKSxvfTtxLm11bHRpcGx5QnlTY2FsYXI9ZnVuY3Rpb24odCxlLG4pe3JldHVybiB5LnR5cGVPZi5vYmplY3QoImNvbG9yIix0KSx5LnR5cGVPZi5udW1iZXIoInNjYWxhciIsZSkseS50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLG4pLG4ucmVkPXQucmVkKmUsbi5ncmVlbj10LmdyZWVuKmUsbi5ibHVlPXQuYmx1ZSplLG4uYWxwaGE9dC5hbHBoYSplLG59O3EuZGl2aWRlQnlTY2FsYXI9ZnVuY3Rpb24odCxlLG4pe3JldHVybiB5LnR5cGVPZi5vYmplY3QoImNvbG9yIix0KSx5LnR5cGVPZi5udW1iZXIoInNjYWxhciIsZSkseS50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLG4pLG4ucmVkPXQucmVkL2Usbi5ncmVlbj10LmdyZWVuL2Usbi5ibHVlPXQuYmx1ZS9lLG4uYWxwaGE9dC5hbHBoYS9lLG59O3EuQUxJQ0VCTFVFPU9iamVjdC5mcmVlemUocS5mcm9tQ3NzQ29sb3JTdHJpbmcoIiNGMEY4RkYiKSk7cS5BTlRJUVVFV0hJVEU9T2JqZWN0LmZyZWV6ZShxLmZyb21Dc3NDb2xvclN0cmluZygiI0ZBRUJENyIpKTtxLkFRVUE9T2JqZWN0LmZyZWV6ZShxLmZyb21Dc3NDb2xvclN0cmluZygiIzAwRkZGRiIpKTtxLkFRVUFNQVJJTkU9T2JqZWN0LmZyZWV6ZShxLmZyb21Dc3NDb2xvclN0cmluZygiIzdGRkZENCIpKTtxLkFaVVJFPU9iamVjdC5mcmVlemUocS5mcm9tQ3NzQ29sb3JTdHJpbmcoIiNGMEZGRkYiKSk7cS5CRUlHRT1PYmplY3QuZnJlZXplKHEuZnJvbUNzc0NvbG9yU3RyaW5nKCIjRjVGNURDIikpO3EuQklTUVVFPU9iamVjdC5mcmVlemUocS5mcm9tQ3NzQ29sb3JTdHJpbmcoIiNGRkU0QzQiKSk7cS5CTEFDSz1PYmplY3QuZnJlZXplKHEuZnJvbUNzc0NvbG9yU3RyaW5nKCIjMDAwMDAwIikpO3EuQkxBTkNIRURBTE1PTkQ9T2JqZWN0LmZyZWV6ZShxLmZyb21Dc3NDb2xvclN0cmluZygiI0ZGRUJDRCIpKTtxLkJMVUU9T2JqZWN0LmZyZWV6ZShxLmZyb21Dc3NDb2xvclN0cmluZygiIzAwMDBGRiIpKTtxLkJMVUVWSU9MRVQ9T2JqZWN0LmZyZWV6ZShxLmZyb21Dc3NDb2xvclN0cmluZygiIzhBMkJFMiIpKTtxLkJST1dOPU9iamVjdC5mcmVlemUocS5mcm9tQ3NzQ29sb3JTdHJpbmcoIiNBNTJBMkEiKSk7cS5CVVJMWVdPT0Q9T2JqZWN0LmZyZWV6ZShxLmZyb21Dc3NDb2xvclN0cmluZygiI0RFQjg4NyIpKTtxLkNBREVUQkxVRT1PYmplY3QuZnJlZXplKHEuZnJvbUNzc0NvbG9yU3RyaW5nKCIjNUY5RUEwIikpO3EuQ0hBUlRSRVVTRT1PYmplY3QuZnJlZXplKHEuZnJvbUNzc0NvbG9yU3RyaW5nKCIjN0ZGRjAwIikpO3EuQ0hPQ09MQVRFPU9iamVjdC5mcmVlemUocS5mcm9tQ3NzQ29sb3JTdHJpbmcoIiNEMjY5MUUiKSk7cS5DT1JBTD1PYmplY3QuZnJlZXplKHEuZnJvbUNzc0NvbG9yU3RyaW5nKCIjRkY3RjUwIikpO3EuQ09STkZMT1dFUkJMVUU9T2JqZWN0LmZyZWV6ZShxLmZyb21Dc3NDb2xvclN0cmluZygiIzY0OTVFRCIpKTtxLkNPUk5TSUxLPU9iamVjdC5mcmVlemUocS5mcm9tQ3NzQ29sb3JTdHJpbmcoIiNGRkY4REMiKSk7cS5DUklNU09OPU9iamVjdC5mcmVlemUocS5mcm9tQ3NzQ29sb3JTdHJpbmcoIiNEQzE0M0MiKSk7cS5DWUFOPU9iamVjdC5mcmVlemUocS5mcm9tQ3NzQ29sb3JTdHJpbmcoIiMwMEZGRkYiKSk7cS5EQVJLQkxVRT1PYmplY3QuZnJlZXplKHEuZnJvbUNzc0NvbG9yU3RyaW5nKCIjMDAwMDhCIikpO3EuREFSS0NZQU49T2JqZWN0LmZyZWV6ZShxLmZyb21Dc3NDb2xvclN0cmluZygiIzAwOEI4QiIpKTtxLkRBUktHT0xERU5ST0Q9T2JqZWN0LmZyZWV6ZShxLmZyb21Dc3NDb2xvclN0cmluZygiI0I4ODYwQiIpKTtxLkRBUktHUkFZPU9iamVjdC5mcmVlemUocS5mcm9tQ3NzQ29sb3JTdHJpbmcoIiNBOUE5QTkiKSk7cS5EQVJLR1JFRU49T2JqZWN0LmZyZWV6ZShxLmZyb21Dc3NDb2xvclN0cmluZygiIzAwNjQwMCIpKTtxLkRBUktHUkVZPXEuREFSS0dSQVk7cS5EQVJLS0hBS0k9T2JqZWN0LmZyZWV6ZShxLmZyb21Dc3NDb2xvclN0cmluZygiI0JEQjc2QiIpKTtxLkRBUktNQUdFTlRBPU9iamVjdC5mcmVlemUocS5mcm9tQ3NzQ29sb3JTdHJpbmcoIiM4QjAwOEIiKSk7cS5EQVJLT0xJVkVHUkVFTj1PYmplY3QuZnJlZXplKHEuZnJvbUNzc0NvbG9yU3RyaW5nKCIjNTU2QjJGIikpO3EuREFSS09SQU5HRT1PYmplY3QuZnJlZXplKHEuZnJvbUNzc0NvbG9yU3RyaW5nKCIjRkY4QzAwIikpO3EuREFSS09SQ0hJRD1PYmplY3QuZnJlZXplKHEuZnJvbUNzc0NvbG9yU3RyaW5nKCIjOTkzMkNDIikpO3EuREFSS1JFRD1PYmplY3QuZnJlZXplKHEuZnJvbUNzc0NvbG9yU3RyaW5nKCIjOEIwMDAwIikpO3EuREFSS1NBTE1PTj1PYmplY3QuZnJlZXplKHEuZnJvbUNzc0NvbG9yU3RyaW5nKCIjRTk5NjdBIikpO3EuREFSS1NFQUdSRUVOPU9iamVjdC5mcmVlemUocS5mcm9tQ3NzQ29sb3JTdHJpbmcoIiM4RkJDOEYiKSk7cS5EQVJLU0xBVEVCTFVFPU9iamVjdC5mcmVlemUocS5mcm9tQ3NzQ29sb3JTdHJpbmcoIiM0ODNEOEIiKSk7cS5EQVJLU0xBVEVHUkFZPU9iamVjdC5mcmVlemUocS5mcm9tQ3NzQ29sb3JTdHJpbmcoIiMyRjRGNEYiKSk7cS5EQVJLU0xBVEVHUkVZPXEuREFSS1NMQVRFR1JBWTtxLkRBUktUVVJRVU9JU0U9T2JqZWN0LmZyZWV6ZShxLmZyb21Dc3NDb2xvclN0cmluZygiIzAwQ0VEMSIpKTtxLkRBUktWSU9MRVQ9T2JqZWN0LmZyZWV6ZShxLmZyb21Dc3NDb2xvclN0cmluZygiIzk0MDBEMyIpKTtxLkRFRVBQSU5LPU9iamVjdC5mcmVlemUocS5mcm9tQ3NzQ29sb3JTdHJpbmcoIiNGRjE0OTMiKSk7cS5ERUVQU0tZQkxVRT1PYmplY3QuZnJlZXplKHEuZnJvbUNzc0NvbG9yU3RyaW5nKCIjMDBCRkZGIikpO3EuRElNR1JBWT1PYmplY3QuZnJlZXplKHEuZnJvbUNzc0NvbG9yU3RyaW5nKCIjNjk2OTY5IikpO3EuRElNR1JFWT1xLkRJTUdSQVk7cS5ET0RHRVJCTFVFPU9iamVjdC5mcmVlemUocS5mcm9tQ3NzQ29sb3JTdHJpbmcoIiMxRTkwRkYiKSk7cS5GSVJFQlJJQ0s9T2JqZWN0LmZyZWV6ZShxLmZyb21Dc3NDb2xvclN0cmluZygiI0IyMjIyMiIpKTtxLkZMT1JBTFdISVRFPU9iamVjdC5mcmVlemUocS5mcm9tQ3NzQ29sb3JTdHJpbmcoIiNGRkZBRjAiKSk7cS5GT1JFU1RHUkVFTj1PYmplY3QuZnJlZXplKHEuZnJvbUNzc0NvbG9yU3RyaW5nKCIjMjI4QjIyIikpO3EuRlVDSFNJQT1PYmplY3QuZnJlZXplKHEuZnJvbUNzc0NvbG9yU3RyaW5nKCIjRkYwMEZGIikpO3EuR0FJTlNCT1JPPU9iamVjdC5mcmVlemUocS5mcm9tQ3NzQ29sb3JTdHJpbmcoIiNEQ0RDREMiKSk7cS5HSE9TVFdISVRFPU9iamVjdC5mcmVlemUocS5mcm9tQ3NzQ29sb3JTdHJpbmcoIiNGOEY4RkYiKSk7cS5HT0xEPU9iamVjdC5mcmVlemUocS5mcm9tQ3NzQ29sb3JTdHJpbmcoIiNGRkQ3MDAiKSk7cS5HT0xERU5ST0Q9T2JqZWN0LmZyZWV6ZShxLmZyb21Dc3NDb2xvclN0cmluZygiI0RBQTUyMCIpKTtxLkdSQVk9T2JqZWN0LmZyZWV6ZShxLmZyb21Dc3NDb2xvclN0cmluZygiIzgwODA4MCIpKTtxLkdSRUVOPU9iamVjdC5mcmVlemUocS5mcm9tQ3NzQ29sb3JTdHJpbmcoIiMwMDgwMDAiKSk7cS5HUkVFTllFTExPVz1PYmplY3QuZnJlZXplKHEuZnJvbUNzc0NvbG9yU3RyaW5nKCIjQURGRjJGIikpO3EuR1JFWT1xLkdSQVk7cS5IT05FWURFVz1PYmplY3QuZnJlZXplKHEuZnJvbUNzc0NvbG9yU3RyaW5nKCIjRjBGRkYwIikpO3EuSE9UUElOSz1PYmplY3QuZnJlZXplKHEuZnJvbUNzc0NvbG9yU3RyaW5nKCIjRkY2OUI0IikpO3EuSU5ESUFOUkVEPU9iamVjdC5mcmVlemUocS5mcm9tQ3NzQ29sb3JTdHJpbmcoIiNDRDVDNUMiKSk7cS5JTkRJR089T2JqZWN0LmZyZWV6ZShxLmZyb21Dc3NDb2xvclN0cmluZygiIzRCMDA4MiIpKTtxLklWT1JZPU9iamVjdC5mcmVlemUocS5mcm9tQ3NzQ29sb3JTdHJpbmcoIiNGRkZGRjAiKSk7cS5LSEFLST1PYmplY3QuZnJlZXplKHEuZnJvbUNzc0NvbG9yU3RyaW5nKCIjRjBFNjhDIikpO3EuTEFWRU5ERVI9T2JqZWN0LmZyZWV6ZShxLmZyb21Dc3NDb2xvclN0cmluZygiI0U2RTZGQSIpKTtxLkxBVkVOREFSX0JMVVNIPU9iamVjdC5mcmVlemUocS5mcm9tQ3NzQ29sb3JTdHJpbmcoIiNGRkYwRjUiKSk7cS5MQVdOR1JFRU49T2JqZWN0LmZyZWV6ZShxLmZyb21Dc3NDb2xvclN0cmluZygiIzdDRkMwMCIpKTtxLkxFTU9OQ0hJRkZPTj1PYmplY3QuZnJlZXplKHEuZnJvbUNzc0NvbG9yU3RyaW5nKCIjRkZGQUNEIikpO3EuTElHSFRCTFVFPU9iamVjdC5mcmVlemUocS5mcm9tQ3NzQ29sb3JTdHJpbmcoIiNBREQ4RTYiKSk7cS5MSUdIVENPUkFMPU9iamVjdC5mcmVlemUocS5mcm9tQ3NzQ29sb3JTdHJpbmcoIiNGMDgwODAiKSk7cS5MSUdIVENZQU49T2JqZWN0LmZyZWV6ZShxLmZyb21Dc3NDb2xvclN0cmluZygiI0UwRkZGRiIpKTtxLkxJR0hUR09MREVOUk9EWUVMTE9XPU9iamVjdC5mcmVlemUocS5mcm9tQ3NzQ29sb3JTdHJpbmcoIiNGQUZBRDIiKSk7cS5MSUdIVEdSQVk9T2JqZWN0LmZyZWV6ZShxLmZyb21Dc3NDb2xvclN0cmluZygiI0QzRDNEMyIpKTtxLkxJR0hUR1JFRU49T2JqZWN0LmZyZWV6ZShxLmZyb21Dc3NDb2xvclN0cmluZygiIzkwRUU5MCIpKTtxLkxJR0hUR1JFWT1xLkxJR0hUR1JBWTtxLkxJR0hUUElOSz1PYmplY3QuZnJlZXplKHEuZnJvbUNzc0NvbG9yU3RyaW5nKCIjRkZCNkMxIikpO3EuTElHSFRTRUFHUkVFTj1PYmplY3QuZnJlZXplKHEuZnJvbUNzc0NvbG9yU3RyaW5nKCIjMjBCMkFBIikpO3EuTElHSFRTS1lCTFVFPU9iamVjdC5mcmVlemUocS5mcm9tQ3NzQ29sb3JTdHJpbmcoIiM4N0NFRkEiKSk7cS5MSUdIVFNMQVRFR1JBWT1PYmplY3QuZnJlZXplKHEuZnJvbUNzc0NvbG9yU3RyaW5nKCIjNzc4ODk5IikpO3EuTElHSFRTTEFURUdSRVk9cS5MSUdIVFNMQVRFR1JBWTtxLkxJR0hUU1RFRUxCTFVFPU9iamVjdC5mcmVlemUocS5mcm9tQ3NzQ29sb3JTdHJpbmcoIiNCMEM0REUiKSk7cS5MSUdIVFlFTExPVz1PYmplY3QuZnJlZXplKHEuZnJvbUNzc0NvbG9yU3RyaW5nKCIjRkZGRkUwIikpO3EuTElNRT1PYmplY3QuZnJlZXplKHEuZnJvbUNzc0NvbG9yU3RyaW5nKCIjMDBGRjAwIikpO3EuTElNRUdSRUVOPU9iamVjdC5mcmVlemUocS5mcm9tQ3NzQ29sb3JTdHJpbmcoIiMzMkNEMzIiKSk7cS5MSU5FTj1PYmplY3QuZnJlZXplKHEuZnJvbUNzc0NvbG9yU3RyaW5nKCIjRkFGMEU2IikpO3EuTUFHRU5UQT1PYmplY3QuZnJlZXplKHEuZnJvbUNzc0NvbG9yU3RyaW5nKCIjRkYwMEZGIikpO3EuTUFST09OPU9iamVjdC5mcmVlemUocS5mcm9tQ3NzQ29sb3JTdHJpbmcoIiM4MDAwMDAiKSk7cS5NRURJVU1BUVVBTUFSSU5FPU9iamVjdC5mcmVlemUocS5mcm9tQ3NzQ29sb3JTdHJpbmcoIiM2NkNEQUEiKSk7cS5NRURJVU1CTFVFPU9iamVjdC5mcmVlemUocS5mcm9tQ3NzQ29sb3JTdHJpbmcoIiMwMDAwQ0QiKSk7cS5NRURJVU1PUkNISUQ9T2JqZWN0LmZyZWV6ZShxLmZyb21Dc3NDb2xvclN0cmluZygiI0JBNTVEMyIpKTtxLk1FRElVTVBVUlBMRT1PYmplY3QuZnJlZXplKHEuZnJvbUNzc0NvbG9yU3RyaW5nKCIjOTM3MERCIikpO3EuTUVESVVNU0VBR1JFRU49T2JqZWN0LmZyZWV6ZShxLmZyb21Dc3NDb2xvclN0cmluZygiIzNDQjM3MSIpKTtxLk1FRElVTVNMQVRFQkxVRT1PYmplY3QuZnJlZXplKHEuZnJvbUNzc0NvbG9yU3RyaW5nKCIjN0I2OEVFIikpO3EuTUVESVVNU1BSSU5HR1JFRU49T2JqZWN0LmZyZWV6ZShxLmZyb21Dc3NDb2xvclN0cmluZygiIzAwRkE5QSIpKTtxLk1FRElVTVRVUlFVT0lTRT1PYmplY3QuZnJlZXplKHEuZnJvbUNzc0NvbG9yU3RyaW5nKCIjNDhEMUNDIikpO3EuTUVESVVNVklPTEVUUkVEPU9iamVjdC5mcmVlemUocS5mcm9tQ3NzQ29sb3JTdHJpbmcoIiNDNzE1ODUiKSk7cS5NSUROSUdIVEJMVUU9T2JqZWN0LmZyZWV6ZShxLmZyb21Dc3NDb2xvclN0cmluZygiIzE5MTk3MCIpKTtxLk1JTlRDUkVBTT1PYmplY3QuZnJlZXplKHEuZnJvbUNzc0NvbG9yU3RyaW5nKCIjRjVGRkZBIikpO3EuTUlTVFlST1NFPU9iamVjdC5mcmVlemUocS5mcm9tQ3NzQ29sb3JTdHJpbmcoIiNGRkU0RTEiKSk7cS5NT0NDQVNJTj1PYmplY3QuZnJlZXplKHEuZnJvbUNzc0NvbG9yU3RyaW5nKCIjRkZFNEI1IikpO3EuTkFWQUpPV0hJVEU9T2JqZWN0LmZyZWV6ZShxLmZyb21Dc3NDb2xvclN0cmluZygiI0ZGREVBRCIpKTtxLk5BVlk9T2JqZWN0LmZyZWV6ZShxLmZyb21Dc3NDb2xvclN0cmluZygiIzAwMDA4MCIpKTtxLk9MRExBQ0U9T2JqZWN0LmZyZWV6ZShxLmZyb21Dc3NDb2xvclN0cmluZygiI0ZERjVFNiIpKTtxLk9MSVZFPU9iamVjdC5mcmVlemUocS5mcm9tQ3NzQ29sb3JTdHJpbmcoIiM4MDgwMDAiKSk7cS5PTElWRURSQUI9T2JqZWN0LmZyZWV6ZShxLmZyb21Dc3NDb2xvclN0cmluZygiIzZCOEUyMyIpKTtxLk9SQU5HRT1PYmplY3QuZnJlZXplKHEuZnJvbUNzc0NvbG9yU3RyaW5nKCIjRkZBNTAwIikpO3EuT1JBTkdFUkVEPU9iamVjdC5mcmVlemUocS5mcm9tQ3NzQ29sb3JTdHJpbmcoIiNGRjQ1MDAiKSk7cS5PUkNISUQ9T2JqZWN0LmZyZWV6ZShxLmZyb21Dc3NDb2xvclN0cmluZygiI0RBNzBENiIpKTtxLlBBTEVHT0xERU5ST0Q9T2JqZWN0LmZyZWV6ZShxLmZyb21Dc3NDb2xvclN0cmluZygiI0VFRThBQSIpKTtxLlBBTEVHUkVFTj1PYmplY3QuZnJlZXplKHEuZnJvbUNzc0NvbG9yU3RyaW5nKCIjOThGQjk4IikpO3EuUEFMRVRVUlFVT0lTRT1PYmplY3QuZnJlZXplKHEuZnJvbUNzc0NvbG9yU3RyaW5nKCIjQUZFRUVFIikpO3EuUEFMRVZJT0xFVFJFRD1PYmplY3QuZnJlZXplKHEuZnJvbUNzc0NvbG9yU3RyaW5nKCIjREI3MDkzIikpO3EuUEFQQVlBV0hJUD1PYmplY3QuZnJlZXplKHEuZnJvbUNzc0NvbG9yU3RyaW5nKCIjRkZFRkQ1IikpO3EuUEVBQ0hQVUZGPU9iamVjdC5mcmVlemUocS5mcm9tQ3NzQ29sb3JTdHJpbmcoIiNGRkRBQjkiKSk7cS5QRVJVPU9iamVjdC5mcmVlemUocS5mcm9tQ3NzQ29sb3JTdHJpbmcoIiNDRDg1M0YiKSk7cS5QSU5LPU9iamVjdC5mcmVlemUocS5mcm9tQ3NzQ29sb3JTdHJpbmcoIiNGRkMwQ0IiKSk7cS5QTFVNPU9iamVjdC5mcmVlemUocS5mcm9tQ3NzQ29sb3JTdHJpbmcoIiNEREEwREQiKSk7cS5QT1dERVJCTFVFPU9iamVjdC5mcmVlemUocS5mcm9tQ3NzQ29sb3JTdHJpbmcoIiNCMEUwRTYiKSk7cS5QVVJQTEU9T2JqZWN0LmZyZWV6ZShxLmZyb21Dc3NDb2xvclN0cmluZygiIzgwMDA4MCIpKTtxLlJFRD1PYmplY3QuZnJlZXplKHEuZnJvbUNzc0NvbG9yU3RyaW5nKCIjRkYwMDAwIikpO3EuUk9TWUJST1dOPU9iamVjdC5mcmVlemUocS5mcm9tQ3NzQ29sb3JTdHJpbmcoIiNCQzhGOEYiKSk7cS5ST1lBTEJMVUU9T2JqZWN0LmZyZWV6ZShxLmZyb21Dc3NDb2xvclN0cmluZygiIzQxNjlFMSIpKTtxLlNBRERMRUJST1dOPU9iamVjdC5mcmVlemUocS5mcm9tQ3NzQ29sb3JTdHJpbmcoIiM4QjQ1MTMiKSk7cS5TQUxNT049T2JqZWN0LmZyZWV6ZShxLmZyb21Dc3NDb2xvclN0cmluZygiI0ZBODA3MiIpKTtxLlNBTkRZQlJPV049T2JqZWN0LmZyZWV6ZShxLmZyb21Dc3NDb2xvclN0cmluZygiI0Y0QTQ2MCIpKTtxLlNFQUdSRUVOPU9iamVjdC5mcmVlemUocS5mcm9tQ3NzQ29sb3JTdHJpbmcoIiMyRThCNTciKSk7cS5TRUFTSEVMTD1PYmplY3QuZnJlZXplKHEuZnJvbUNzc0NvbG9yU3RyaW5nKCIjRkZGNUVFIikpO3EuU0lFTk5BPU9iamVjdC5mcmVlemUocS5mcm9tQ3NzQ29sb3JTdHJpbmcoIiNBMDUyMkQiKSk7cS5TSUxWRVI9T2JqZWN0LmZyZWV6ZShxLmZyb21Dc3NDb2xvclN0cmluZygiI0MwQzBDMCIpKTtxLlNLWUJMVUU9T2JqZWN0LmZyZWV6ZShxLmZyb21Dc3NDb2xvclN0cmluZygiIzg3Q0VFQiIpKTtxLlNMQVRFQkxVRT1PYmplY3QuZnJlZXplKHEuZnJvbUNzc0NvbG9yU3RyaW5nKCIjNkE1QUNEIikpO3EuU0xBVEVHUkFZPU9iamVjdC5mcmVlemUocS5mcm9tQ3NzQ29sb3JTdHJpbmcoIiM3MDgwOTAiKSk7cS5TTEFURUdSRVk9cS5TTEFURUdSQVk7cS5TTk9XPU9iamVjdC5mcmVlemUocS5mcm9tQ3NzQ29sb3JTdHJpbmcoIiNGRkZBRkEiKSk7cS5TUFJJTkdHUkVFTj1PYmplY3QuZnJlZXplKHEuZnJvbUNzc0NvbG9yU3RyaW5nKCIjMDBGRjdGIikpO3EuU1RFRUxCTFVFPU9iamVjdC5mcmVlemUocS5mcm9tQ3NzQ29sb3JTdHJpbmcoIiM0NjgyQjQiKSk7cS5UQU49T2JqZWN0LmZyZWV6ZShxLmZyb21Dc3NDb2xvclN0cmluZygiI0QyQjQ4QyIpKTtxLlRFQUw9T2JqZWN0LmZyZWV6ZShxLmZyb21Dc3NDb2xvclN0cmluZygiIzAwODA4MCIpKTtxLlRISVNUTEU9T2JqZWN0LmZyZWV6ZShxLmZyb21Dc3NDb2xvclN0cmluZygiI0Q4QkZEOCIpKTtxLlRPTUFUTz1PYmplY3QuZnJlZXplKHEuZnJvbUNzc0NvbG9yU3RyaW5nKCIjRkY2MzQ3IikpO3EuVFVSUVVPSVNFPU9iamVjdC5mcmVlemUocS5mcm9tQ3NzQ29sb3JTdHJpbmcoIiM0MEUwRDAiKSk7cS5WSU9MRVQ9T2JqZWN0LmZyZWV6ZShxLmZyb21Dc3NDb2xvclN0cmluZygiI0VFODJFRSIpKTtxLldIRUFUPU9iamVjdC5mcmVlemUocS5mcm9tQ3NzQ29sb3JTdHJpbmcoIiNGNURFQjMiKSk7cS5XSElURT1PYmplY3QuZnJlZXplKHEuZnJvbUNzc0NvbG9yU3RyaW5nKCIjRkZGRkZGIikpO3EuV0hJVEVTTU9LRT1PYmplY3QuZnJlZXplKHEuZnJvbUNzc0NvbG9yU3RyaW5nKCIjRjVGNUY1IikpO3EuWUVMTE9XPU9iamVjdC5mcmVlemUocS5mcm9tQ3NzQ29sb3JTdHJpbmcoIiNGRkZGMDAiKSk7cS5ZRUxMT1dHUkVFTj1PYmplY3QuZnJlZXplKHEuZnJvbUNzc0NvbG9yU3RyaW5nKCIjOUFDRDMyIikpO3EuVFJBTlNQQVJFTlQ9T2JqZWN0LmZyZWV6ZShuZXcgcSgwLDAsMCwwKSk7b2U9cX0pO2Z1bmN0aW9uIEtGKHQsZSxuLG8scil7bGV0IGk9SUU7aS5sZW5ndGg9cjtsZXQgcyxmPW4ucmVkLHU9bi5ncmVlbixjPW4uYmx1ZSxsPW4uYWxwaGEscD1vLnJlZCxkPW8uZ3JlZW4sbT1vLmJsdWUsXz1vLmFscGhhO2lmKG9lLmVxdWFscyhuLG8pKXtmb3Iocz0wO3M8cjtzKyspaVtzXT1vZS5jbG9uZShuKTtyZXR1cm4gaX1sZXQgZz0ocC1mKS9yLGI9KGQtdSkvcixUPShtLWMpL3IsTz0oXy1sKS9yO2ZvcihzPTA7czxyO3MrKylpW3NdPW5ldyBvZShmK3MqZyx1K3MqYixjK3MqVCxsK3MqTyk7cmV0dXJuIGl9ZnVuY3Rpb24gUWYodCl7dD14KHQseC5FTVBUWV9PQkpFQ1QpO2xldCBlPXQucG9zaXRpb25zLG49dC5jb2xvcnMsbz14KHQud2lkdGgsMSkscj14KHQuY29sb3JzUGVyVmVydGV4LCExKTtpZighaChlKXx8ZS5sZW5ndGg8Mil0aHJvdyBuZXcgQigiQXQgbGVhc3QgdHdvIHBvc2l0aW9ucyBhcmUgcmVxdWlyZWQuIik7aWYodHlwZW9mIG8hPSJudW1iZXIiKXRocm93IG5ldyBCKCJ3aWR0aCBtdXN0IGJlIGEgbnVtYmVyIik7aWYoaChuKSYmKHImJm4ubGVuZ3RoPGUubGVuZ3RofHwhciYmbi5sZW5ndGg8ZS5sZW5ndGgtMSkpdGhyb3cgbmV3IEIoImNvbG9ycyBoYXMgYW4gaW52YWxpZCBsZW5ndGguIik7dGhpcy5fcG9zaXRpb25zPWUsdGhpcy5fY29sb3JzPW4sdGhpcy5fd2lkdGg9byx0aGlzLl9jb2xvcnNQZXJWZXJ0ZXg9cix0aGlzLl92ZXJ0ZXhGb3JtYXQ9ZHQuY2xvbmUoeCh0LnZlcnRleEZvcm1hdCxkdC5ERUZBVUxUKSksdGhpcy5fYXJjVHlwZT14KHQuYXJjVHlwZSxfZS5HRU9ERVNJQyksdGhpcy5fZ3JhbnVsYXJpdHk9eCh0LmdyYW51bGFyaXR5LE0uUkFESUFOU19QRVJfREVHUkVFKSx0aGlzLl9lbGxpcHNvaWQ9JC5jbG9uZSh4KHQuZWxsaXBzb2lkLCQuZGVmYXVsdCkpLHRoaXMuX3dvcmtlck5hbWU9ImNyZWF0ZVBvbHlsaW5lR2VvbWV0cnkiO2xldCBpPTErZS5sZW5ndGgqYS5wYWNrZWRMZW5ndGg7aSs9aChuKT8xK24ubGVuZ3RoKm9lLnBhY2tlZExlbmd0aDoxLHRoaXMucGFja2VkTGVuZ3RoPWkrJC5wYWNrZWRMZW5ndGgrZHQucGFja2VkTGVuZ3RoKzR9dmFyIElFLHZFLExFLGJjLHhFLFBFLE1FLE5FLF95LERFPVooKCk9PntmYygpO2pyKCk7dmUoKTtGdCgpO1BhKCk7RmUoKTtJdCgpO2Z0KCk7SHQoKTtadCgpO1hlKCk7WWUoKTthbigpO0xwKCk7JGUoKTtXdCgpO3lhKCk7dG4oKTtSbygpO0lFPVtdO1FmLnBhY2s9ZnVuY3Rpb24odCxlLG4pe2lmKCFoKHQpKXRocm93IG5ldyBCKCJ2YWx1ZSBpcyByZXF1aXJlZCIpO2lmKCFoKGUpKXRocm93IG5ldyBCKCJhcnJheSBpcyByZXF1aXJlZCIpO249eChuLDApO2xldCBvLHI9dC5fcG9zaXRpb25zLGk9ci5sZW5ndGg7Zm9yKGVbbisrXT1pLG89MDtvPGk7KytvLG4rPWEucGFja2VkTGVuZ3RoKWEucGFjayhyW29dLGUsbik7bGV0IHM9dC5fY29sb3JzO2ZvcihpPWgocyk/cy5sZW5ndGg6MCxlW24rK109aSxvPTA7bzxpOysrbyxuKz1vZS5wYWNrZWRMZW5ndGgpb2UucGFjayhzW29dLGUsbik7cmV0dXJuICQucGFjayh0Ll9lbGxpcHNvaWQsZSxuKSxuKz0kLnBhY2tlZExlbmd0aCxkdC5wYWNrKHQuX3ZlcnRleEZvcm1hdCxlLG4pLG4rPWR0LnBhY2tlZExlbmd0aCxlW24rK109dC5fd2lkdGgsZVtuKytdPXQuX2NvbG9yc1BlclZlcnRleD8xOjAsZVtuKytdPXQuX2FyY1R5cGUsZVtuXT10Ll9ncmFudWxhcml0eSxlfTt2RT0kLmNsb25lKCQuVU5JVF9TUEhFUkUpLExFPW5ldyBkdCxiYz17cG9zaXRpb25zOnZvaWQgMCxjb2xvcnM6dm9pZCAwLGVsbGlwc29pZDp2RSx2ZXJ0ZXhGb3JtYXQ6TEUsd2lkdGg6dm9pZCAwLGNvbG9yc1BlclZlcnRleDp2b2lkIDAsYXJjVHlwZTp2b2lkIDAsZ3JhbnVsYXJpdHk6dm9pZCAwfTtRZi51bnBhY2s9ZnVuY3Rpb24odCxlLG4pe2lmKCFoKHQpKXRocm93IG5ldyBCKCJhcnJheSBpcyByZXF1aXJlZCIpO2U9eChlLDApO2xldCBvLHI9dFtlKytdLGk9bmV3IEFycmF5KHIpO2ZvcihvPTA7bzxyOysrbyxlKz1hLnBhY2tlZExlbmd0aClpW29dPWEudW5wYWNrKHQsZSk7cj10W2UrK107bGV0IHM9cj4wP25ldyBBcnJheShyKTp2b2lkIDA7Zm9yKG89MDtvPHI7KytvLGUrPW9lLnBhY2tlZExlbmd0aClzW29dPW9lLnVucGFjayh0LGUpO2xldCBmPSQudW5wYWNrKHQsZSx2RSk7ZSs9JC5wYWNrZWRMZW5ndGg7bGV0IHU9ZHQudW5wYWNrKHQsZSxMRSk7ZSs9ZHQucGFja2VkTGVuZ3RoO2xldCBjPXRbZSsrXSxsPXRbZSsrXT09PTEscD10W2UrK10sZD10W2VdO3JldHVybiBoKG4pPyhuLl9wb3NpdGlvbnM9aSxuLl9jb2xvcnM9cyxuLl9lbGxpcHNvaWQ9JC5jbG9uZShmLG4uX2VsbGlwc29pZCksbi5fdmVydGV4Rm9ybWF0PWR0LmNsb25lKHUsbi5fdmVydGV4Rm9ybWF0KSxuLl93aWR0aD1jLG4uX2NvbG9yc1BlclZlcnRleD1sLG4uX2FyY1R5cGU9cCxuLl9ncmFudWxhcml0eT1kLG4pOihiYy5wb3NpdGlvbnM9aSxiYy5jb2xvcnM9cyxiYy53aWR0aD1jLGJjLmNvbG9yc1BlclZlcnRleD1sLGJjLmFyY1R5cGU9cCxiYy5ncmFudWxhcml0eT1kLG5ldyBRZihiYykpfTt4RT1uZXcgYSxQRT1uZXcgYSxNRT1uZXcgYSxORT1uZXcgYTtRZi5jcmVhdGVHZW9tZXRyeT1mdW5jdGlvbih0KXtsZXQgZT10Ll93aWR0aCxuPXQuX3ZlcnRleEZvcm1hdCxvPXQuX2NvbG9ycyxyPXQuX2NvbG9yc1BlclZlcnRleCxpPXQuX2FyY1R5cGUscz10Ll9ncmFudWxhcml0eSxmPXQuX2VsbGlwc29pZCx1LGMsbCxwPVtdLGQ9eG4odC5fcG9zaXRpb25zLGEuZXF1YWxzRXBzaWxvbiwhMSxwKTtpZihoKG8pJiZwLmxlbmd0aD4wKXtsZXQgRj0wLGo9cFswXTtvPW8uZmlsdGVyKGZ1bmN0aW9uKEgsayl7bGV0IEs9ITE7cmV0dXJuIHI/Sz1rPT09anx8az09PTAmJmo9PT0xOks9aysxPT09aixLPyhGKyssaj1wW0ZdLCExKTohMH0pfWxldCBtPWQubGVuZ3RoO2lmKG08Mnx8ZTw9MClyZXR1cm47aWYoaT09PV9lLkdFT0RFU0lDfHxpPT09X2UuUkhVTUIpe2xldCBGLGo7aT09PV9lLkdFT0RFU0lDPyhGPU0uY2hvcmRMZW5ndGgocyxmLm1heGltdW1SYWRpdXMpLGo9QW4ubnVtYmVyT2ZQb2ludHMpOihGPXMsaj1Bbi5udW1iZXJPZlBvaW50c1JodW1iTGluZSk7bGV0IEg9QW4uZXh0cmFjdEhlaWdodHMoZCxmKTtpZihoKG8pKXtsZXQgaz0xO2Zvcih1PTA7dTxtLTE7Kyt1KWsrPWooZFt1XSxkW3UrMV0sRik7bGV0IEs9bmV3IEFycmF5KGspLFg9MDtmb3IodT0wO3U8bS0xOysrdSl7bGV0IFI9ZFt1XSxvdD1kW3UrMV0sYXQ9b1t1XSxwdD1qKFIsb3QsRik7aWYociYmdTxrKXtsZXQgeXQ9b1t1KzFdLHJ0PUtGKFIsb3QsYXQseXQscHQpLFB0PXJ0Lmxlbmd0aDtmb3IoYz0wO2M8UHQ7KytjKUtbWCsrXT1ydFtjXX1lbHNlIGZvcihjPTA7YzxwdDsrK2MpS1tYKytdPW9lLmNsb25lKGF0KX1LW1hdPW9lLmNsb25lKG9bby5sZW5ndGgtMV0pLG89SyxJRS5sZW5ndGg9MH1pPT09X2UuR0VPREVTSUM/ZD1Bbi5nZW5lcmF0ZUNhcnRlc2lhbkFyYyh7cG9zaXRpb25zOmQsbWluRGlzdGFuY2U6RixlbGxpcHNvaWQ6ZixoZWlnaHQ6SH0pOmQ9QW4uZ2VuZXJhdGVDYXJ0ZXNpYW5SaHVtYkFyYyh7cG9zaXRpb25zOmQsZ3JhbnVsYXJpdHk6RixlbGxpcHNvaWQ6ZixoZWlnaHQ6SH0pfW09ZC5sZW5ndGg7bGV0IF89bSo0LTQsZz1uZXcgRmxvYXQ2NEFycmF5KF8qMyksYj1uZXcgRmxvYXQ2NEFycmF5KF8qMyksVD1uZXcgRmxvYXQ2NEFycmF5KF8qMyksTz1uZXcgRmxvYXQzMkFycmF5KF8qMiksRT1uLnN0P25ldyBGbG9hdDMyQXJyYXkoXyoyKTp2b2lkIDAsdz1oKG8pP25ldyBVaW50OEFycmF5KF8qNCk6dm9pZCAwLEM9MCxOPTAsST0wLEQ9MCx2O2ZvcihjPTA7YzxtOysrYyl7Yz09PTA/KHY9eEUsYS5zdWJ0cmFjdChkWzBdLGRbMV0sdiksYS5hZGQoZFswXSx2LHYpKTp2PWRbYy0xXSxhLmNsb25lKHYsTUUpLGEuY2xvbmUoZFtjXSxQRSksYz09PW0tMT8odj14RSxhLnN1YnRyYWN0KGRbbS0xXSxkW20tMl0sdiksYS5hZGQoZFttLTFdLHYsdikpOnY9ZFtjKzFdLGEuY2xvbmUodixORSk7bGV0IEYsajtoKHcpJiYoYyE9PTAmJiFyP0Y9b1tjLTFdOkY9b1tjXSxjIT09bS0xJiYoaj1vW2NdKSk7bGV0IEg9Yz09PTA/MjowLGs9Yz09PW0tMT8yOjQ7Zm9yKGw9SDtsPGs7KytsKXthLnBhY2soUEUsZyxDKSxhLnBhY2soTUUsYixDKSxhLnBhY2soTkUsVCxDKSxDKz0zO2xldCBLPWwtMjwwPy0xOjE7aWYoT1tOKytdPTIqKGwlMiktMSxPW04rK109SyplLG4uc3QmJihFW0krK109Yy8obS0xKSxFW0krK109TWF0aC5tYXgoT1tOLTJdLDApKSxoKHcpKXtsZXQgWD1sPDI/RjpqO3dbRCsrXT1vZS5mbG9hdFRvQnl0ZShYLnJlZCksd1tEKytdPW9lLmZsb2F0VG9CeXRlKFguZ3JlZW4pLHdbRCsrXT1vZS5mbG9hdFRvQnl0ZShYLmJsdWUpLHdbRCsrXT1vZS5mbG9hdFRvQnl0ZShYLmFscGhhKX19fWxldCBMPW5ldyBpZTtMLnBvc2l0aW9uPW5ldyBpdCh7Y29tcG9uZW50RGF0YXR5cGU6bnQuRE9VQkxFLGNvbXBvbmVudHNQZXJBdHRyaWJ1dGU6Myx2YWx1ZXM6Z30pLEwucHJldlBvc2l0aW9uPW5ldyBpdCh7Y29tcG9uZW50RGF0YXR5cGU6bnQuRE9VQkxFLGNvbXBvbmVudHNQZXJBdHRyaWJ1dGU6Myx2YWx1ZXM6Yn0pLEwubmV4dFBvc2l0aW9uPW5ldyBpdCh7Y29tcG9uZW50RGF0YXR5cGU6bnQuRE9VQkxFLGNvbXBvbmVudHNQZXJBdHRyaWJ1dGU6Myx2YWx1ZXM6VH0pLEwuZXhwYW5kQW5kV2lkdGg9bmV3IGl0KHtjb21wb25lbnREYXRhdHlwZTpudC5GTE9BVCxjb21wb25lbnRzUGVyQXR0cmlidXRlOjIsdmFsdWVzOk99KSxuLnN0JiYoTC5zdD1uZXcgaXQoe2NvbXBvbmVudERhdGF0eXBlOm50LkZMT0FULGNvbXBvbmVudHNQZXJBdHRyaWJ1dGU6Mix2YWx1ZXM6RX0pKSxoKHcpJiYoTC5jb2xvcj1uZXcgaXQoe2NvbXBvbmVudERhdGF0eXBlOm50LlVOU0lHTkVEX0JZVEUsY29tcG9uZW50c1BlckF0dHJpYnV0ZTo0LHZhbHVlczp3LG5vcm1hbGl6ZTohMH0pKTtsZXQgVT1EdC5jcmVhdGVUeXBlZEFycmF5KF8sbSo2LTYpLEE9MCxTPTAsUD1tLTE7Zm9yKGM9MDtjPFA7KytjKVVbUysrXT1BLFVbUysrXT1BKzIsVVtTKytdPUErMSxVW1MrK109QSsxLFVbUysrXT1BKzIsVVtTKytdPUErMyxBKz00O3JldHVybiBuZXcgVXQoe2F0dHJpYnV0ZXM6TCxpbmRpY2VzOlUscHJpbWl0aXZlVHlwZTpCdC5UUklBTkdMRVMsYm91bmRpbmdTcGhlcmU6QXQuZnJvbVBvaW50cyhkKSxnZW9tZXRyeVR5cGU6TWkuUE9MWUxJTkVTfSl9O195PVFmfSk7dmFyIHl5PXt9O2RlKHl5LHtkZWZhdWx0OigpPT5YRn0pO2Z1bmN0aW9uIFdGKHQsZSl7cmV0dXJuIGgoZSkmJih0PV95LnVucGFjayh0LGUpKSx0Ll9lbGxpcHNvaWQ9JC5jbG9uZSh0Ll9lbGxpcHNvaWQpLF95LmNyZWF0ZUdlb21ldHJ5KHQpfXZhciBYRixneT1aKCgpPT57ZnQoKTtadCgpO0RFKCk7WEY9V0Z9KTtmdW5jdGlvbiBZRih0LGUsbixvKXtsZXQgcj1uZXcgaWU7by5wb3NpdGlvbiYmKHIucG9zaXRpb249bmV3IGl0KHtjb21wb25lbnREYXRhdHlwZTpudC5ET1VCTEUsY29tcG9uZW50c1BlckF0dHJpYnV0ZTozLHZhbHVlczp0fSkpO2xldCBpPWUubGVuZ3RoLHM9dC5sZW5ndGgvMyxmPShzLWkqMikvKGkqMiksdT1QZS50cmlhbmd1bGF0ZShlKSxjPShmLTEpKmkqNit1Lmxlbmd0aCoyLGw9RHQuY3JlYXRlVHlwZWRBcnJheShzLGMpLHAsZCxtLF8sZyxiLFQ9aSoyLE89MDtmb3IocD0wO3A8Zi0xO3ArKyl7Zm9yKGQ9MDtkPGktMTtkKyspbT1kKjIrcCppKjIsYj1tK1QsXz1tKzEsZz1fK1QsbFtPKytdPV8sbFtPKytdPW0sbFtPKytdPWcsbFtPKytdPWcsbFtPKytdPW0sbFtPKytdPWI7bT1pKjItMitwKmkqMixfPW0rMSxnPV8rVCxiPW0rVCxsW08rK109XyxsW08rK109bSxsW08rK109ZyxsW08rK109ZyxsW08rK109bSxsW08rK109Yn1pZihvLnN0fHxvLnRhbmdlbnR8fG8uYml0YW5nZW50KXtsZXQgQz1uZXcgRmxvYXQzMkFycmF5KHMqMiksTj0xLyhmLTEpLEk9MS9uLmhlaWdodCxEPW4uaGVpZ2h0LzIsdixMLFU9MDtmb3IocD0wO3A8ZjtwKyspe2Zvcih2PXAqTixMPUkqKGVbMF0ueStEKSxDW1UrK109dixDW1UrK109TCxkPTE7ZDxpO2QrKylMPUkqKGVbZF0ueStEKSxDW1UrK109dixDW1UrK109TCxDW1UrK109dixDW1UrK109TDtMPUkqKGVbMF0ueStEKSxDW1UrK109dixDW1UrK109TH1mb3IoZD0wO2Q8aTtkKyspdj0wLEw9SSooZVtkXS55K0QpLENbVSsrXT12LENbVSsrXT1MO2ZvcihkPTA7ZDxpO2QrKyl2PShmLTEpKk4sTD1JKihlW2RdLnkrRCksQ1tVKytdPXYsQ1tVKytdPUw7ci5zdD1uZXcgaXQoe2NvbXBvbmVudERhdGF0eXBlOm50LkZMT0FULGNvbXBvbmVudHNQZXJBdHRyaWJ1dGU6Mix2YWx1ZXM6bmV3IEZsb2F0MzJBcnJheShDKX0pfWxldCBFPXMtaSoyO2ZvcihwPTA7cDx1Lmxlbmd0aDtwKz0zKXtsZXQgQz11W3BdK0UsTj11W3ArMV0rRSxJPXVbcCsyXStFO2xbTysrXT1DLGxbTysrXT1OLGxbTysrXT1JLGxbTysrXT1JK2ksbFtPKytdPU4raSxsW08rK109QytpfWxldCB3PW5ldyBVdCh7YXR0cmlidXRlczpyLGluZGljZXM6bCxib3VuZGluZ1NwaGVyZTpBdC5mcm9tVmVydGljZXModCkscHJpbWl0aXZlVHlwZTpCdC5UUklBTkdMRVN9KTtpZihvLm5vcm1hbCYmKHc9VmUuY29tcHV0ZU5vcm1hbCh3KSksby50YW5nZW50fHxvLmJpdGFuZ2VudCl7dHJ5e3c9VmUuY29tcHV0ZVRhbmdlbnRBbmRCaXRhbmdlbnQodyl9Y2F0Y2h7bGQoInBvbHlsaW5lLXZvbHVtZS10YW5nZW50LWJpdGFuZ2VudCIsIlVuYWJsZSB0byBjb21wdXRlIHRhbmdlbnRzIGFuZCBiaXRhbmdlbnRzIGZvciBwb2x5bGluZSB2b2x1bWUgZ2VvbWV0cnkiKX1vLnRhbmdlbnR8fCh3LmF0dHJpYnV0ZXMudGFuZ2VudD12b2lkIDApLG8uYml0YW5nZW50fHwody5hdHRyaWJ1dGVzLmJpdGFuZ2VudD12b2lkIDApLG8uc3R8fCh3LmF0dHJpYnV0ZXMuc3Q9dm9pZCAwKX1yZXR1cm4gd31mdW5jdGlvbiB0dSh0KXt0PXgodCx4LkVNUFRZX09CSkVDVCk7bGV0IGU9dC5wb2x5bGluZVBvc2l0aW9ucyxuPXQuc2hhcGVQb3NpdGlvbnM7aWYoIWgoZSkpdGhyb3cgbmV3IEIoIm9wdGlvbnMucG9seWxpbmVQb3NpdGlvbnMgaXMgcmVxdWlyZWQuIik7aWYoIWgobikpdGhyb3cgbmV3IEIoIm9wdGlvbnMuc2hhcGVQb3NpdGlvbnMgaXMgcmVxdWlyZWQuIik7dGhpcy5fcG9zaXRpb25zPWUsdGhpcy5fc2hhcGU9bix0aGlzLl9lbGxpcHNvaWQ9JC5jbG9uZSh4KHQuZWxsaXBzb2lkLCQuZGVmYXVsdCkpLHRoaXMuX2Nvcm5lclR5cGU9eCh0LmNvcm5lclR5cGUsZm4uUk9VTkRFRCksdGhpcy5fdmVydGV4Rm9ybWF0PWR0LmNsb25lKHgodC52ZXJ0ZXhGb3JtYXQsZHQuREVGQVVMVCkpLHRoaXMuX2dyYW51bGFyaXR5PXgodC5ncmFudWxhcml0eSxNLlJBRElBTlNfUEVSX0RFR1JFRSksdGhpcy5fd29ya2VyTmFtZT0iY3JlYXRlUG9seWxpbmVWb2x1bWVHZW9tZXRyeSI7bGV0IG89MStlLmxlbmd0aCphLnBhY2tlZExlbmd0aDtvKz0xK24ubGVuZ3RoKnR0LnBhY2tlZExlbmd0aCx0aGlzLnBhY2tlZExlbmd0aD1vKyQucGFja2VkTGVuZ3RoK2R0LnBhY2tlZExlbmd0aCsyfXZhciBGRSxCRSxKZiwkRixBeSxVRT1aKCgpPT57anIoKTtDZigpO3ZlKCk7VWUoKTtGdCgpO0ZlKCk7aGMoKTtJdCgpO2Z0KCk7SHQoKTtadCgpO1hlKCk7WWUoKTthbigpO3NpKCk7JGUoKTtXdCgpO1cwKCk7cXIoKTtoZCgpO3RuKCk7Um8oKTtsYygpO3R1LnBhY2s9ZnVuY3Rpb24odCxlLG4pe2lmKCFoKHQpKXRocm93IG5ldyBCKCJ2YWx1ZSBpcyByZXF1aXJlZCIpO2lmKCFoKGUpKXRocm93IG5ldyBCKCJhcnJheSBpcyByZXF1aXJlZCIpO249eChuLDApO2xldCBvLHI9dC5fcG9zaXRpb25zLGk9ci5sZW5ndGg7Zm9yKGVbbisrXT1pLG89MDtvPGk7KytvLG4rPWEucGFja2VkTGVuZ3RoKWEucGFjayhyW29dLGUsbik7bGV0IHM9dC5fc2hhcGU7Zm9yKGk9cy5sZW5ndGgsZVtuKytdPWksbz0wO288aTsrK28sbis9dHQucGFja2VkTGVuZ3RoKXR0LnBhY2soc1tvXSxlLG4pO3JldHVybiAkLnBhY2sodC5fZWxsaXBzb2lkLGUsbiksbis9JC5wYWNrZWRMZW5ndGgsZHQucGFjayh0Ll92ZXJ0ZXhGb3JtYXQsZSxuKSxuKz1kdC5wYWNrZWRMZW5ndGgsZVtuKytdPXQuX2Nvcm5lclR5cGUsZVtuXT10Ll9ncmFudWxhcml0eSxlfTtGRT0kLmNsb25lKCQuVU5JVF9TUEhFUkUpLEJFPW5ldyBkdCxKZj17cG9seWxpbmVQb3NpdGlvbnM6dm9pZCAwLHNoYXBlUG9zaXRpb25zOnZvaWQgMCxlbGxpcHNvaWQ6RkUsdmVydGV4Rm9ybWF0OkJFLGNvcm5lclR5cGU6dm9pZCAwLGdyYW51bGFyaXR5OnZvaWQgMH07dHUudW5wYWNrPWZ1bmN0aW9uKHQsZSxuKXtpZighaCh0KSl0aHJvdyBuZXcgQigiYXJyYXkgaXMgcmVxdWlyZWQiKTtlPXgoZSwwKTtsZXQgbyxyPXRbZSsrXSxpPW5ldyBBcnJheShyKTtmb3Iobz0wO288cjsrK28sZSs9YS5wYWNrZWRMZW5ndGgpaVtvXT1hLnVucGFjayh0LGUpO3I9dFtlKytdO2xldCBzPW5ldyBBcnJheShyKTtmb3Iobz0wO288cjsrK28sZSs9dHQucGFja2VkTGVuZ3RoKXNbb109dHQudW5wYWNrKHQsZSk7bGV0IGY9JC51bnBhY2sodCxlLEZFKTtlKz0kLnBhY2tlZExlbmd0aDtsZXQgdT1kdC51bnBhY2sodCxlLEJFKTtlKz1kdC5wYWNrZWRMZW5ndGg7bGV0IGM9dFtlKytdLGw9dFtlXTtyZXR1cm4gaChuKT8obi5fcG9zaXRpb25zPWksbi5fc2hhcGU9cyxuLl9lbGxpcHNvaWQ9JC5jbG9uZShmLG4uX2VsbGlwc29pZCksbi5fdmVydGV4Rm9ybWF0PWR0LmNsb25lKHUsbi5fdmVydGV4Rm9ybWF0KSxuLl9jb3JuZXJUeXBlPWMsbi5fZ3JhbnVsYXJpdHk9bCxuKTooSmYucG9seWxpbmVQb3NpdGlvbnM9aSxKZi5zaGFwZVBvc2l0aW9ucz1zLEpmLmNvcm5lclR5cGU9YyxKZi5ncmFudWxhcml0eT1sLG5ldyB0dShKZikpfTskRj1uZXcgSHI7dHUuY3JlYXRlR2VvbWV0cnk9ZnVuY3Rpb24odCl7bGV0IGU9dC5fcG9zaXRpb25zLG49eG4oZSxhLmVxdWFsc0Vwc2lsb24pLG89dC5fc2hhcGU7aWYobz1ocy5yZW1vdmVEdXBsaWNhdGVzRnJvbVNoYXBlKG8pLG4ubGVuZ3RoPDJ8fG8ubGVuZ3RoPDMpcmV0dXJuO1BlLmNvbXB1dGVXaW5kaW5nT3JkZXIyRChvKT09PUNvLkNMT0NLV0lTRSYmby5yZXZlcnNlKCk7bGV0IHI9SHIuZnJvbVBvaW50cyhvLCRGKSxpPWhzLmNvbXB1dGVQb3NpdGlvbnMobixvLHIsdCwhMCk7cmV0dXJuIFlGKGksbyxyLHQuX3ZlcnRleEZvcm1hdCl9O0F5PXR1fSk7dmFyIGJ5PXt9O2RlKGJ5LHtkZWZhdWx0OigpPT5RRn0pO2Z1bmN0aW9uIFpGKHQsZSl7cmV0dXJuIGgoZSkmJih0PUF5LnVucGFjayh0LGUpKSx0Ll9lbGxpcHNvaWQ9JC5jbG9uZSh0Ll9lbGxpcHNvaWQpLEF5LmNyZWF0ZUdlb21ldHJ5KHQpfXZhciBRRixUeT1aKCgpPT57ZnQoKTtadCgpO1VFKCk7UUY9WkZ9KTtmdW5jdGlvbiBKRih0LGUpe2xldCBuPW5ldyBpZTtuLnBvc2l0aW9uPW5ldyBpdCh7Y29tcG9uZW50RGF0YXR5cGU6bnQuRE9VQkxFLGNvbXBvbmVudHNQZXJBdHRyaWJ1dGU6Myx2YWx1ZXM6dH0pO2xldCBvPWUubGVuZ3RoLHI9bi5wb3NpdGlvbi52YWx1ZXMubGVuZ3RoLzMscz10Lmxlbmd0aC8zL28sZj1EdC5jcmVhdGVUeXBlZEFycmF5KHIsMipvKihzKzEpKSx1LGMsbD0wO3U9MDtsZXQgcD11Km87Zm9yKGM9MDtjPG8tMTtjKyspZltsKytdPWMrcCxmW2wrK109YytwKzE7Zm9yKGZbbCsrXT1vLTErcCxmW2wrK109cCx1PXMtMSxwPXUqbyxjPTA7YzxvLTE7YysrKWZbbCsrXT1jK3AsZltsKytdPWMrcCsxO2ZvcihmW2wrK109by0xK3AsZltsKytdPXAsdT0wO3U8cy0xO3UrKyl7bGV0IG09byp1LF89bStvO2ZvcihjPTA7YzxvO2MrKylmW2wrK109YyttLGZbbCsrXT1jK199cmV0dXJuIG5ldyBVdCh7YXR0cmlidXRlczpuLGluZGljZXM6RHQuY3JlYXRlVHlwZWRBcnJheShyLGYpLGJvdW5kaW5nU3BoZXJlOkF0LmZyb21WZXJ0aWNlcyh0KSxwcmltaXRpdmVUeXBlOkJ0LkxJTkVTfSl9ZnVuY3Rpb24gbnUodCl7dD14KHQseC5FTVBUWV9PQkpFQ1QpO2xldCBlPXQucG9seWxpbmVQb3NpdGlvbnMsbj10LnNoYXBlUG9zaXRpb25zO2lmKCFoKGUpKXRocm93IG5ldyBCKCJvcHRpb25zLnBvbHlsaW5lUG9zaXRpb25zIGlzIHJlcXVpcmVkLiIpO2lmKCFoKG4pKXRocm93IG5ldyBCKCJvcHRpb25zLnNoYXBlUG9zaXRpb25zIGlzIHJlcXVpcmVkLiIpO3RoaXMuX3Bvc2l0aW9ucz1lLHRoaXMuX3NoYXBlPW4sdGhpcy5fZWxsaXBzb2lkPSQuY2xvbmUoeCh0LmVsbGlwc29pZCwkLmRlZmF1bHQpKSx0aGlzLl9jb3JuZXJUeXBlPXgodC5jb3JuZXJUeXBlLGZuLlJPVU5ERUQpLHRoaXMuX2dyYW51bGFyaXR5PXgodC5ncmFudWxhcml0eSxNLlJBRElBTlNfUEVSX0RFR1JFRSksdGhpcy5fd29ya2VyTmFtZT0iY3JlYXRlUG9seWxpbmVWb2x1bWVPdXRsaW5lR2VvbWV0cnkiO2xldCBvPTErZS5sZW5ndGgqYS5wYWNrZWRMZW5ndGg7bys9MStuLmxlbmd0aCp0dC5wYWNrZWRMZW5ndGgsdGhpcy5wYWNrZWRMZW5ndGg9byskLnBhY2tlZExlbmd0aCsyfXZhciBWRSxldSx0Qix3eSxrRT1aKCgpPT57anIoKTtDZigpO3ZlKCk7VWUoKTtGdCgpO0ZlKCk7aGMoKTtJdCgpO2Z0KCk7SHQoKTtadCgpO1hlKCk7WWUoKTthbigpOyRlKCk7V3QoKTtxcigpO2hkKCk7dG4oKTtsYygpO251LnBhY2s9ZnVuY3Rpb24odCxlLG4pe2lmKCFoKHQpKXRocm93IG5ldyBCKCJ2YWx1ZSBpcyByZXF1aXJlZCIpO2lmKCFoKGUpKXRocm93IG5ldyBCKCJhcnJheSBpcyByZXF1aXJlZCIpO249eChuLDApO2xldCBvLHI9dC5fcG9zaXRpb25zLGk9ci5sZW5ndGg7Zm9yKGVbbisrXT1pLG89MDtvPGk7KytvLG4rPWEucGFja2VkTGVuZ3RoKWEucGFjayhyW29dLGUsbik7bGV0IHM9dC5fc2hhcGU7Zm9yKGk9cy5sZW5ndGgsZVtuKytdPWksbz0wO288aTsrK28sbis9dHQucGFja2VkTGVuZ3RoKXR0LnBhY2soc1tvXSxlLG4pO3JldHVybiAkLnBhY2sodC5fZWxsaXBzb2lkLGUsbiksbis9JC5wYWNrZWRMZW5ndGgsZVtuKytdPXQuX2Nvcm5lclR5cGUsZVtuXT10Ll9ncmFudWxhcml0eSxlfTtWRT0kLmNsb25lKCQuVU5JVF9TUEhFUkUpLGV1PXtwb2x5bGluZVBvc2l0aW9uczp2b2lkIDAsc2hhcGVQb3NpdGlvbnM6dm9pZCAwLGVsbGlwc29pZDpWRSxoZWlnaHQ6dm9pZCAwLGNvcm5lclR5cGU6dm9pZCAwLGdyYW51bGFyaXR5OnZvaWQgMH07bnUudW5wYWNrPWZ1bmN0aW9uKHQsZSxuKXtpZighaCh0KSl0aHJvdyBuZXcgQigiYXJyYXkgaXMgcmVxdWlyZWQiKTtlPXgoZSwwKTtsZXQgbyxyPXRbZSsrXSxpPW5ldyBBcnJheShyKTtmb3Iobz0wO288cjsrK28sZSs9YS5wYWNrZWRMZW5ndGgpaVtvXT1hLnVucGFjayh0LGUpO3I9dFtlKytdO2xldCBzPW5ldyBBcnJheShyKTtmb3Iobz0wO288cjsrK28sZSs9dHQucGFja2VkTGVuZ3RoKXNbb109dHQudW5wYWNrKHQsZSk7bGV0IGY9JC51bnBhY2sodCxlLFZFKTtlKz0kLnBhY2tlZExlbmd0aDtsZXQgdT10W2UrK10sYz10W2VdO3JldHVybiBoKG4pPyhuLl9wb3NpdGlvbnM9aSxuLl9zaGFwZT1zLG4uX2VsbGlwc29pZD0kLmNsb25lKGYsbi5fZWxsaXBzb2lkKSxuLl9jb3JuZXJUeXBlPXUsbi5fZ3JhbnVsYXJpdHk9YyxuKTooZXUucG9seWxpbmVQb3NpdGlvbnM9aSxldS5zaGFwZVBvc2l0aW9ucz1zLGV1LmNvcm5lclR5cGU9dSxldS5ncmFudWxhcml0eT1jLG5ldyBudShldSkpfTt0Qj1uZXcgSHI7bnUuY3JlYXRlR2VvbWV0cnk9ZnVuY3Rpb24odCl7bGV0IGU9dC5fcG9zaXRpb25zLG49eG4oZSxhLmVxdWFsc0Vwc2lsb24pLG89dC5fc2hhcGU7aWYobz1ocy5yZW1vdmVEdXBsaWNhdGVzRnJvbVNoYXBlKG8pLG4ubGVuZ3RoPDJ8fG8ubGVuZ3RoPDMpcmV0dXJuO1BlLmNvbXB1dGVXaW5kaW5nT3JkZXIyRChvKT09PUNvLkNMT0NLV0lTRSYmby5yZXZlcnNlKCk7bGV0IHI9SHIuZnJvbVBvaW50cyhvLHRCKSxpPWhzLmNvbXB1dGVQb3NpdGlvbnMobixvLHIsdCwhMSk7cmV0dXJuIEpGKGksbyl9O3d5PW51fSk7dmFyIE95PXt9O2RlKE95LHtkZWZhdWx0OigpPT5uQn0pO2Z1bmN0aW9uIGVCKHQsZSl7cmV0dXJuIGgoZSkmJih0PXd5LnVucGFjayh0LGUpKSx0Ll9lbGxpcHNvaWQ9JC5jbG9uZSh0Ll9lbGxpcHNvaWQpLHd5LmNyZWF0ZUdlb21ldHJ5KHQpfXZhciBuQixFeT1aKCgpPT57ZnQoKTtadCgpO2tFKCk7bkI9ZUJ9KTtmdW5jdGlvbiBqRSh0LGUsbixvLHIsaSxzKXtsZXQgZj1NYXRoLmNvcyhlKSx1PW8qZixjPW4qZixsPU1hdGguc2luKGUpLHA9bypsLGQ9bipsO291Ll9lbGxpcHNvaWQ9JC5kZWZhdWx0LFNyPW91LnByb2plY3QodCxTciksU3I9YS5zdWJ0cmFjdChTcixEZCxTcik7bGV0IG09WW8uZnJvbVJvdGF0aW9uKGUsckIpO1NyPVlvLm11bHRpcGx5QnlWZWN0b3IobSxTcixTciksU3I9YS5hZGQoU3IsRGQsU3IpLHQ9b3UudW5wcm9qZWN0KFNyLHQpLGktPTEscy09MTtsZXQgXz10LmxhdGl0dWRlLGc9XytpKmQsYj1fLXUqcyxUPV8tdSpzK2kqZCxPPU1hdGgubWF4KF8sZyxiLFQpLEU9TWF0aC5taW4oXyxnLGIsVCksdz10LmxvbmdpdHVkZSxDPXcraSpjLE49dytzKnAsST13K3MqcCtpKmMsRD1NYXRoLm1heCh3LEMsTixJKSx2PU1hdGgubWluKHcsQyxOLEkpO3JldHVybntub3J0aDpPLHNvdXRoOkUsZWFzdDpELHdlc3Q6dixncmFuWUNvczp1LGdyYW5ZU2luOnAsZ3JhblhDb3M6YyxncmFuWFNpbjpkLG53Q29ybmVyOnR9fXZhciBHRSx6RSxvQixSeSxyQixTcixpQixEZCxvdSxnbyxTeT1aKCgpPT57RnQoKTtJZSgpO2Z0KCk7SHQoKTtadCgpO1NpKCk7V3QoKTtBZigpO3duKCk7R0U9TWF0aC5jb3MsekU9TWF0aC5zaW4sb0I9TWF0aC5zcXJ0LFJ5PXt9O1J5LmNvbXB1dGVQb3NpdGlvbj1mdW5jdGlvbih0LGUsbixvLHIsaSxzKXtsZXQgZj1lLnJhZGlpU3F1YXJlZCx1PXQubndDb3JuZXIsYz10LmJvdW5kaW5nUmVjdGFuZ2xlLGw9dS5sYXRpdHVkZS10LmdyYW5ZQ29zKm8rcip0LmdyYW5YU2luLHA9R0UobCksZD16RShsKSxtPWYueipkLF89dS5sb25naXR1ZGUrbyp0LmdyYW5ZU2luK3IqdC5ncmFuWENvcyxnPXAqR0UoXyksYj1wKnpFKF8pLFQ9Zi54KmcsTz1mLnkqYixFPW9CKFQqZytPKmIrbSpkKTtpZihpLng9VC9FLGkueT1PL0UsaS56PW0vRSxuKXtsZXQgdz10LnN0TndDb3JuZXI7aCh3KT8obD13LmxhdGl0dWRlLXQuc3RHcmFuWUNvcypvK3IqdC5zdEdyYW5YU2luLF89dy5sb25naXR1ZGUrbyp0LnN0R3JhbllTaW4rcip0LnN0R3JhblhDb3Mscy54PShfLXQuc3RXZXN0KSp0LmxvblNjYWxhcixzLnk9KGwtdC5zdFNvdXRoKSp0LmxhdFNjYWxhcik6KHMueD0oXy1jLndlc3QpKnQubG9uU2NhbGFyLHMueT0obC1jLnNvdXRoKSp0LmxhdFNjYWxhcil9fTtyQj1uZXcgWW8sU3I9bmV3IGEsaUI9bmV3IGN0LERkPW5ldyBhLG91PW5ldyBKbjtSeS5jb21wdXRlT3B0aW9ucz1mdW5jdGlvbih0LGUsbixvLHIsaSxzKXtsZXQgZj10LmVhc3QsdT10Lndlc3QsYz10Lm5vcnRoLGw9dC5zb3V0aCxwPSExLGQ9ITE7Yz09PU0uUElfT1ZFUl9UV08mJihwPSEwKSxsPT09LU0uUElfT1ZFUl9UV08mJihkPSEwKTtsZXQgbSxfPWMtbDt1PmY/bT1NLlRXT19QSS11K2Y6bT1mLXU7bGV0IGc9TWF0aC5jZWlsKG0vZSkrMSxiPU1hdGguY2VpbChfL2UpKzEsVD1tLyhnLTEpLE89Xy8oYi0xKSxFPU50Lm5vcnRod2VzdCh0LGkpLHc9TnQuY2VudGVyKHQsaUIpOyhuIT09MHx8byE9PTApJiYody5sb25naXR1ZGU8RS5sb25naXR1ZGUmJih3LmxvbmdpdHVkZSs9TS5UV09fUEkpLG91Ll9lbGxpcHNvaWQ9JC5kZWZhdWx0LERkPW91LnByb2plY3QodyxEZCkpO2xldCBDPU8sTj1ULEk9MCxEPTAsdj1OdC5jbG9uZSh0LHIpLEw9e2dyYW5ZQ29zOkMsZ3JhbllTaW46SSxncmFuWENvczpOLGdyYW5YU2luOkQsbndDb3JuZXI6RSxib3VuZGluZ1JlY3RhbmdsZTp2LHdpZHRoOmcsaGVpZ2h0OmIsbm9ydGhDYXA6cCxzb3V0aENhcDpkfTtpZihuIT09MCl7bGV0IFU9akUoRSxuLFQsTyx3LGcsYik7aWYoYz1VLm5vcnRoLGw9VS5zb3V0aCxmPVUuZWFzdCx1PVUud2VzdCxjPC1NLlBJX09WRVJfVFdPfHxjPk0uUElfT1ZFUl9UV098fGw8LU0uUElfT1ZFUl9UV098fGw+TS5QSV9PVkVSX1RXTyl0aHJvdyBuZXcgQigiUm90YXRlZCByZWN0YW5nbGUgaXMgaW52YWxpZC4gIEl0IGNyb3NzZXMgb3ZlciBlaXRoZXIgdGhlIG5vcnRoIG9yIHNvdXRoIHBvbGUuIik7TC5ncmFuWUNvcz1VLmdyYW5ZQ29zLEwuZ3JhbllTaW49VS5ncmFuWVNpbixMLmdyYW5YQ29zPVUuZ3JhblhDb3MsTC5ncmFuWFNpbj1VLmdyYW5YU2luLHYubm9ydGg9Yyx2LnNvdXRoPWwsdi5lYXN0PWYsdi53ZXN0PXV9aWYobyE9PTApe249bi1vO2xldCBVPU50Lm5vcnRod2VzdCh2LHMpLEE9akUoVSxuLFQsTyx3LGcsYik7TC5zdEdyYW5ZQ29zPUEuZ3JhbllDb3MsTC5zdEdyYW5YQ29zPUEuZ3JhblhDb3MsTC5zdEdyYW5ZU2luPUEuZ3JhbllTaW4sTC5zdEdyYW5YU2luPUEuZ3JhblhTaW4sTC5zdE53Q29ybmVyPVUsTC5zdFdlc3Q9QS53ZXN0LEwuc3RTb3V0aD1BLnNvdXRofXJldHVybiBMfTtnbz1SeX0pO2Z1bmN0aW9uICRFKHQsZSl7bGV0IG49bmV3IFV0KHthdHRyaWJ1dGVzOm5ldyBpZSxwcmltaXRpdmVUeXBlOkJ0LlRSSUFOR0xFU30pO3JldHVybiBuLmF0dHJpYnV0ZXMucG9zaXRpb249bmV3IGl0KHtjb21wb25lbnREYXRhdHlwZTpudC5ET1VCTEUsY29tcG9uZW50c1BlckF0dHJpYnV0ZTozLHZhbHVlczplLnBvc2l0aW9uc30pLHQubm9ybWFsJiYobi5hdHRyaWJ1dGVzLm5vcm1hbD1uZXcgaXQoe2NvbXBvbmVudERhdGF0eXBlOm50LkZMT0FULGNvbXBvbmVudHNQZXJBdHRyaWJ1dGU6Myx2YWx1ZXM6ZS5ub3JtYWxzfSkpLHQudGFuZ2VudCYmKG4uYXR0cmlidXRlcy50YW5nZW50PW5ldyBpdCh7Y29tcG9uZW50RGF0YXR5cGU6bnQuRkxPQVQsY29tcG9uZW50c1BlckF0dHJpYnV0ZTozLHZhbHVlczplLnRhbmdlbnRzfSkpLHQuYml0YW5nZW50JiYobi5hdHRyaWJ1dGVzLmJpdGFuZ2VudD1uZXcgaXQoe2NvbXBvbmVudERhdGF0eXBlOm50LkZMT0FULGNvbXBvbmVudHNQZXJBdHRyaWJ1dGU6Myx2YWx1ZXM6ZS5iaXRhbmdlbnRzfSkpLG59ZnVuY3Rpb24gZkIodCxlLG4sbyl7bGV0IHI9dC5sZW5ndGgsaT1lLm5vcm1hbD9uZXcgRmxvYXQzMkFycmF5KHIpOnZvaWQgMCxzPWUudGFuZ2VudD9uZXcgRmxvYXQzMkFycmF5KHIpOnZvaWQgMCxmPWUuYml0YW5nZW50P25ldyBGbG9hdDMyQXJyYXkocik6dm9pZCAwLHU9MCxjPVhFLGw9V0UscD1LRTtpZihlLm5vcm1hbHx8ZS50YW5nZW50fHxlLmJpdGFuZ2VudClmb3IobGV0IGQ9MDtkPHI7ZCs9Myl7bGV0IG09YS5mcm9tQXJyYXkodCxkLEN5KSxfPXUrMSxnPXUrMjtwPW4uZ2VvZGV0aWNTdXJmYWNlTm9ybWFsKG0scCksKGUudGFuZ2VudHx8ZS5iaXRhbmdlbnQpJiYoYS5jcm9zcyhhLlVOSVRfWixwLGwpLFEubXVsdGlwbHlCeVZlY3RvcihvLGwsbCksYS5ub3JtYWxpemUobCxsKSxlLmJpdGFuZ2VudCYmYS5ub3JtYWxpemUoYS5jcm9zcyhwLGwsYyksYykpLGUubm9ybWFsJiYoaVt1XT1wLngsaVtfXT1wLnksaVtnXT1wLnopLGUudGFuZ2VudCYmKHNbdV09bC54LHNbX109bC55LHNbZ109bC56KSxlLmJpdGFuZ2VudCYmKGZbdV09Yy54LGZbX109Yy55LGZbZ109Yy56KSx1Kz0zfXJldHVybiAkRShlLHtwb3NpdGlvbnM6dCxub3JtYWxzOmksdGFuZ2VudHM6cyxiaXRhbmdlbnRzOmZ9KX1mdW5jdGlvbiB1Qih0LGUsbil7bGV0IG89dC5sZW5ndGgscj1lLm5vcm1hbD9uZXcgRmxvYXQzMkFycmF5KG8pOnZvaWQgMCxpPWUudGFuZ2VudD9uZXcgRmxvYXQzMkFycmF5KG8pOnZvaWQgMCxzPWUuYml0YW5nZW50P25ldyBGbG9hdDMyQXJyYXkobyk6dm9pZCAwLGY9MCx1PTAsYz0wLGw9ITAscD1YRSxkPVdFLG09S0U7aWYoZS5ub3JtYWx8fGUudGFuZ2VudHx8ZS5iaXRhbmdlbnQpZm9yKGxldCBfPTA7XzxvO18rPTYpe2xldCBnPWEuZnJvbUFycmF5KHQsXyxDeSksYj1hLmZyb21BcnJheSh0LChfKzYpJW8seHkpO2lmKGwpe2xldCBUPWEuZnJvbUFycmF5KHQsKF8rMyklbyxaRSk7YS5zdWJ0cmFjdChiLGcsYiksYS5zdWJ0cmFjdChULGcsVCksbT1hLm5vcm1hbGl6ZShhLmNyb3NzKFQsYixtKSxtKSxsPSExfWEuZXF1YWxzRXBzaWxvbihiLGcsTS5FUFNJTE9OMTApJiYobD0hMCksKGUudGFuZ2VudHx8ZS5iaXRhbmdlbnQpJiYocD1uLmdlb2RldGljU3VyZmFjZU5vcm1hbChnLHApLGUudGFuZ2VudCYmKGQ9YS5ub3JtYWxpemUoYS5jcm9zcyhwLG0sZCksZCkpKSxlLm5vcm1hbCYmKHJbZisrXT1tLngscltmKytdPW0ueSxyW2YrK109bS56LHJbZisrXT1tLngscltmKytdPW0ueSxyW2YrK109bS56KSxlLnRhbmdlbnQmJihpW3UrK109ZC54LGlbdSsrXT1kLnksaVt1KytdPWQueixpW3UrK109ZC54LGlbdSsrXT1kLnksaVt1KytdPWQueiksZS5iaXRhbmdlbnQmJihzW2MrK109cC54LHNbYysrXT1wLnksc1tjKytdPXAueixzW2MrK109cC54LHNbYysrXT1wLnksc1tjKytdPXAueil9cmV0dXJuICRFKGUse3Bvc2l0aW9uczp0LG5vcm1hbHM6cix0YW5nZW50czppLGJpdGFuZ2VudHM6c30pfWZ1bmN0aW9uIFFFKHQsZSl7bGV0IG49dC5fdmVydGV4Rm9ybWF0LG89dC5fZWxsaXBzb2lkLHI9ZS5oZWlnaHQsaT1lLndpZHRoLHM9ZS5ub3J0aENhcCxmPWUuc291dGhDYXAsdT0wLGM9cixsPXIscD0wO3MmJih1PTEsbC09MSxwKz0xKSxmJiYoYy09MSxsLT0xLHArPTEpLHArPWkqbDtsZXQgZD1uLnBvc2l0aW9uP25ldyBGbG9hdDY0QXJyYXkocCozKTp2b2lkIDAsbT1uLnN0P25ldyBGbG9hdDMyQXJyYXkocCoyKTp2b2lkIDAsXz0wLGc9MCxiPUN5LFQ9c0IsTz1OdW1iZXIuTUFYX1ZBTFVFLEU9TnVtYmVyLk1BWF9WQUxVRSx3PS1OdW1iZXIuTUFYX1ZBTFVFLEM9LU51bWJlci5NQVhfVkFMVUU7Zm9yKGxldCBBPXU7QTxjOysrQSlmb3IobGV0IFM9MDtTPGk7KytTKWdvLmNvbXB1dGVQb3NpdGlvbihlLG8sbi5zdCxBLFMsYixUKSxkW18rK109Yi54LGRbXysrXT1iLnksZFtfKytdPWIueixuLnN0JiYobVtnKytdPVQueCxtW2crK109VC55LE89TWF0aC5taW4oTyxULngpLEU9TWF0aC5taW4oRSxULnkpLHc9TWF0aC5tYXgodyxULngpLEM9TWF0aC5tYXgoQyxULnkpKTtpZihzJiYoZ28uY29tcHV0ZVBvc2l0aW9uKGUsbyxuLnN0LDAsMCxiLFQpLGRbXysrXT1iLngsZFtfKytdPWIueSxkW18rK109Yi56LG4uc3QmJihtW2crK109VC54LG1bZysrXT1ULnksTz1ULngsRT1ULnksdz1ULngsQz1ULnkpKSxmJiYoZ28uY29tcHV0ZVBvc2l0aW9uKGUsbyxuLnN0LHItMSwwLGIsVCksZFtfKytdPWIueCxkW18rK109Yi55LGRbX109Yi56LG4uc3QmJihtW2crK109VC54LG1bZ109VC55LE89TWF0aC5taW4oTyxULngpLEU9TWF0aC5taW4oRSxULnkpLHc9TWF0aC5tYXgodyxULngpLEM9TWF0aC5tYXgoQyxULnkpKSksbi5zdCYmKE88MHx8RTwwfHx3PjF8fEM+MSkpZm9yKGxldCBBPTA7QTxtLmxlbmd0aDtBKz0yKW1bQV09KG1bQV0tTykvKHctTyksbVtBKzFdPShtW0ErMV0tRSkvKEMtRSk7bGV0IE49ZkIoZCxuLG8sZS50YW5nZW50Um90YXRpb25NYXRyaXgpLEk9NiooaS0xKSoobC0xKTtzJiYoSSs9MyooaS0xKSksZiYmKEkrPTMqKGktMSkpO2xldCBEPUR0LmNyZWF0ZVR5cGVkQXJyYXkocCxJKSx2PTAsTD0wLFU7Zm9yKFU9MDtVPGwtMTsrK1Upe2ZvcihsZXQgQT0wO0E8aS0xOysrQSl7bGV0IFM9dixQPVMraSxGPVArMSxqPVMrMTtEW0wrK109UyxEW0wrK109UCxEW0wrK109aixEW0wrK109aixEW0wrK109UCxEW0wrK109RiwrK3Z9Kyt2fWlmKHN8fGYpe2xldCBBPXAtMSxTPXAtMTtzJiZmJiYoQT1wLTIpO2xldCBQLEY7aWYodj0wLHMpZm9yKFU9MDtVPGktMTtVKyspUD12LEY9UCsxLERbTCsrXT1BLERbTCsrXT1QLERbTCsrXT1GLCsrdjtpZihmKWZvcih2PShsLTEpKmksVT0wO1U8aS0xO1UrKylQPXYsRj1QKzEsRFtMKytdPVAsRFtMKytdPVMsRFtMKytdPUYsKyt2fXJldHVybiBOLmluZGljZXM9RCxuLnN0JiYoTi5hdHRyaWJ1dGVzLnN0PW5ldyBpdCh7Y29tcG9uZW50RGF0YXR5cGU6bnQuRkxPQVQsY29tcG9uZW50c1BlckF0dHJpYnV0ZToyLHZhbHVlczptfSkpLE59ZnVuY3Rpb24gTWEodCxlLG4sbyxyKXtyZXR1cm4gdFtlKytdPW9bbl0sdFtlKytdPW9bbisxXSx0W2UrK109b1tuKzJdLHRbZSsrXT1yW25dLHRbZSsrXT1yW24rMV0sdFtlXT1yW24rMl0sdH1mdW5jdGlvbiBOYSh0LGUsbixvKXtyZXR1cm4gdFtlKytdPW9bbl0sdFtlKytdPW9bbisxXSx0W2UrK109b1tuXSx0W2VdPW9bbisxXSx0fWZ1bmN0aW9uIGxCKHQsZSl7bGV0IG49dC5fc2hhZG93Vm9sdW1lLG89dC5fb2Zmc2V0QXR0cmlidXRlLHI9dC5fdmVydGV4Rm9ybWF0LGk9dC5fZXh0cnVkZWRIZWlnaHQscz10Ll9zdXJmYWNlSGVpZ2h0LGY9dC5fZWxsaXBzb2lkLHU9ZS5oZWlnaHQsYz1lLndpZHRoLGw7aWYobil7bGV0IEp0PWR0LmNsb25lKHIsUHkpO0p0Lm5vcm1hbD0hMCx0Ll92ZXJ0ZXhGb3JtYXQ9SnR9bGV0IHA9UUUodCxlKTtuJiYodC5fdmVydGV4Rm9ybWF0PXIpO2xldCBkPVBlLnNjYWxlVG9HZW9kZXRpY0hlaWdodChwLmF0dHJpYnV0ZXMucG9zaXRpb24udmFsdWVzLHMsZiwhMSk7ZD1uZXcgRmxvYXQ2NEFycmF5KGQpO2xldCBtPWQubGVuZ3RoLF89bSoyLGc9bmV3IEZsb2F0NjRBcnJheShfKTtnLnNldChkKTtsZXQgYj1QZS5zY2FsZVRvR2VvZGV0aWNIZWlnaHQocC5hdHRyaWJ1dGVzLnBvc2l0aW9uLnZhbHVlcyxpLGYpO2cuc2V0KGIsbSkscC5hdHRyaWJ1dGVzLnBvc2l0aW9uLnZhbHVlcz1nO2xldCBUPXIubm9ybWFsP25ldyBGbG9hdDMyQXJyYXkoXyk6dm9pZCAwLE89ci50YW5nZW50P25ldyBGbG9hdDMyQXJyYXkoXyk6dm9pZCAwLEU9ci5iaXRhbmdlbnQ/bmV3IEZsb2F0MzJBcnJheShfKTp2b2lkIDAsdz1yLnN0P25ldyBGbG9hdDMyQXJyYXkoXy8zKjIpOnZvaWQgMCxDLE47aWYoci5ub3JtYWwpe2ZvcihOPXAuYXR0cmlidXRlcy5ub3JtYWwudmFsdWVzLFQuc2V0KE4pLGw9MDtsPG07bCsrKU5bbF09LU5bbF07VC5zZXQoTixtKSxwLmF0dHJpYnV0ZXMubm9ybWFsLnZhbHVlcz1UfWlmKG4pe049cC5hdHRyaWJ1dGVzLm5vcm1hbC52YWx1ZXMsci5ub3JtYWx8fChwLmF0dHJpYnV0ZXMubm9ybWFsPXZvaWQgMCk7bGV0IEp0PW5ldyBGbG9hdDMyQXJyYXkoXyk7Zm9yKGw9MDtsPG07bCsrKU5bbF09LU5bbF07SnQuc2V0KE4sbSkscC5hdHRyaWJ1dGVzLmV4dHJ1ZGVEaXJlY3Rpb249bmV3IGl0KHtjb21wb25lbnREYXRhdHlwZTpudC5GTE9BVCxjb21wb25lbnRzUGVyQXR0cmlidXRlOjMsdmFsdWVzOkp0fSl9bGV0IEksRD1oKG8pO2lmKEQpe2xldCBKdD1tLzMqMixOZT1uZXcgVWludDhBcnJheShKdCk7bz09PWZlLlRPUD9OZT1OZS5maWxsKDEsMCxKdC8yKTooST1vPT09ZmUuTk9ORT8wOjEsTmU9TmUuZmlsbChJKSkscC5hdHRyaWJ1dGVzLmFwcGx5T2Zmc2V0PW5ldyBpdCh7Y29tcG9uZW50RGF0YXR5cGU6bnQuVU5TSUdORURfQllURSxjb21wb25lbnRzUGVyQXR0cmlidXRlOjEsdmFsdWVzOk5lfSl9aWYoci50YW5nZW50KXtsZXQgSnQ9cC5hdHRyaWJ1dGVzLnRhbmdlbnQudmFsdWVzO2ZvcihPLnNldChKdCksbD0wO2w8bTtsKyspSnRbbF09LUp0W2xdO08uc2V0KEp0LG0pLHAuYXR0cmlidXRlcy50YW5nZW50LnZhbHVlcz1PfWlmKHIuYml0YW5nZW50KXtsZXQgSnQ9cC5hdHRyaWJ1dGVzLmJpdGFuZ2VudC52YWx1ZXM7RS5zZXQoSnQpLEUuc2V0KEp0LG0pLHAuYXR0cmlidXRlcy5iaXRhbmdlbnQudmFsdWVzPUV9ci5zdCYmKEM9cC5hdHRyaWJ1dGVzLnN0LnZhbHVlcyx3LnNldChDKSx3LnNldChDLG0vMyoyKSxwLmF0dHJpYnV0ZXMuc3QudmFsdWVzPXcpO2xldCB2PXAuaW5kaWNlcyxMPXYubGVuZ3RoLFU9bS8zLEE9RHQuY3JlYXRlVHlwZWRBcnJheShfLzMsTCoyKTtmb3IoQS5zZXQodiksbD0wO2w8TDtsKz0zKUFbbCtMXT12W2wrMl0rVSxBW2wrMStMXT12W2wrMV0rVSxBW2wrMitMXT12W2xdK1U7cC5pbmRpY2VzPUE7bGV0IFM9ZS5ub3J0aENhcCxQPWUuc291dGhDYXAsRj11LGo9MixIPTAsaz00LEs9NDtTJiYoai09MSxGLT0xLEgrPTEsay09MixLLT0xKSxQJiYoai09MSxGLT0xLEgrPTEsay09MixLLT0xKSxIKz1qKmMrMipGLWs7bGV0IFg9KEgrSykqMixSPW5ldyBGbG9hdDY0QXJyYXkoWCozKSxvdD1uP25ldyBGbG9hdDMyQXJyYXkoWCozKTp2b2lkIDAsYXQ9RD9uZXcgVWludDhBcnJheShYKTp2b2lkIDAscHQ9ci5zdD9uZXcgRmxvYXQzMkFycmF5KFgqMik6dm9pZCAwLHl0PW89PT1mZS5UT1A7RCYmIXl0JiYoST1vPT09ZmUuQUxMPzE6MCxhdD1hdC5maWxsKEkpKTtsZXQgcnQ9MCxQdD0wLGd0PTAsQ3Q9MCxtdD1jKkYsdXQ7Zm9yKGw9MDtsPG10O2wrPWMpdXQ9bCozLFI9TWEoUixydCx1dCxkLGIpLHJ0Kz02LHIuc3QmJihwdD1OYShwdCxQdCxsKjIsQyksUHQrPTQpLG4mJihndCs9MyxvdFtndCsrXT1OW3V0XSxvdFtndCsrXT1OW3V0KzFdLG90W2d0KytdPU5bdXQrMl0pLHl0JiYoYXRbQ3QrK109MSxDdCs9MSk7aWYoUCl7bGV0IEp0PVM/bXQrMTptdDtmb3IodXQ9SnQqMyxsPTA7bDwyO2wrKylSPU1hKFIscnQsdXQsZCxiKSxydCs9NixyLnN0JiYocHQ9TmEocHQsUHQsSnQqMixDKSxQdCs9NCksbiYmKGd0Kz0zLG90W2d0KytdPU5bdXRdLG90W2d0KytdPU5bdXQrMV0sb3RbZ3QrK109Tlt1dCsyXSkseXQmJihhdFtDdCsrXT0xLEN0Kz0xKX1lbHNlIGZvcihsPW10LWM7bDxtdDtsKyspdXQ9bCozLFI9TWEoUixydCx1dCxkLGIpLHJ0Kz02LHIuc3QmJihwdD1OYShwdCxQdCxsKjIsQyksUHQrPTQpLG4mJihndCs9MyxvdFtndCsrXT1OW3V0XSxvdFtndCsrXT1OW3V0KzFdLG90W2d0KytdPU5bdXQrMl0pLHl0JiYoYXRbQ3QrK109MSxDdCs9MSk7Zm9yKGw9bXQtMTtsPjA7bC09Yyl1dD1sKjMsUj1NYShSLHJ0LHV0LGQsYikscnQrPTYsci5zdCYmKHB0PU5hKHB0LFB0LGwqMixDKSxQdCs9NCksbiYmKGd0Kz0zLG90W2d0KytdPU5bdXRdLG90W2d0KytdPU5bdXQrMV0sb3RbZ3QrK109Tlt1dCsyXSkseXQmJihhdFtDdCsrXT0xLEN0Kz0xKTtpZihTKXtsZXQgSnQ9bXQ7Zm9yKHV0PUp0KjMsbD0wO2w8MjtsKyspUj1NYShSLHJ0LHV0LGQsYikscnQrPTYsci5zdCYmKHB0PU5hKHB0LFB0LEp0KjIsQyksUHQrPTQpLG4mJihndCs9MyxvdFtndCsrXT1OW3V0XSxvdFtndCsrXT1OW3V0KzFdLG90W2d0KytdPU5bdXQrMl0pLHl0JiYoYXRbQ3QrK109MSxDdCs9MSl9ZWxzZSBmb3IobD1jLTE7bD49MDtsLS0pdXQ9bCozLFI9TWEoUixydCx1dCxkLGIpLHJ0Kz02LHIuc3QmJihwdD1OYShwdCxQdCxsKjIsQyksUHQrPTQpLG4mJihndCs9MyxvdFtndCsrXT1OW3V0XSxvdFtndCsrXT1OW3V0KzFdLG90W2d0KytdPU5bdXQrMl0pLHl0JiYoYXRbQ3QrK109MSxDdCs9MSk7bGV0IHZ0PXVCKFIscixmKTtyLnN0JiYodnQuYXR0cmlidXRlcy5zdD1uZXcgaXQoe2NvbXBvbmVudERhdGF0eXBlOm50LkZMT0FULGNvbXBvbmVudHNQZXJBdHRyaWJ1dGU6Mix2YWx1ZXM6cHR9KSksbiYmKHZ0LmF0dHJpYnV0ZXMuZXh0cnVkZURpcmVjdGlvbj1uZXcgaXQoe2NvbXBvbmVudERhdGF0eXBlOm50LkZMT0FULGNvbXBvbmVudHNQZXJBdHRyaWJ1dGU6Myx2YWx1ZXM6b3R9KSksRCYmKHZ0LmF0dHJpYnV0ZXMuYXBwbHlPZmZzZXQ9bmV3IGl0KHtjb21wb25lbnREYXRhdHlwZTpudC5VTlNJR05FRF9CWVRFLGNvbXBvbmVudHNQZXJBdHRyaWJ1dGU6MSx2YWx1ZXM6YXR9KSk7bGV0IHp0PUR0LmNyZWF0ZVR5cGVkQXJyYXkoWCxIKjYpLG1lLGNlLHBlLHVlO209Ui5sZW5ndGgvMztsZXQgUXQ9MDtmb3IobD0wO2w8bS0xO2wrPTIpe21lPWwsdWU9KG1lKzIpJW07bGV0IEp0PWEuZnJvbUFycmF5KFIsbWUqMyx4eSksTmU9YS5mcm9tQXJyYXkoUix1ZSozLFpFKTthLmVxdWFsc0Vwc2lsb24oSnQsTmUsTS5FUFNJTE9OMTApfHwoY2U9KG1lKzEpJW0scGU9KGNlKzIpJW0senRbUXQrK109bWUsenRbUXQrK109Y2UsenRbUXQrK109dWUsenRbUXQrK109dWUsenRbUXQrK109Y2UsenRbUXQrK109cGUpfXJldHVybiB2dC5pbmRpY2VzPXp0LHZ0PVZlLmNvbWJpbmVJbnN0YW5jZXMoW25ldyBjbyh7Z2VvbWV0cnk6cH0pLG5ldyBjbyh7Z2VvbWV0cnk6dnR9KV0pLHZ0WzBdfWZ1bmN0aW9uIE15KHQsZSxuLG8scil7aWYobj09PTApcmV0dXJuIE50LmNsb25lKHQscik7bGV0IGk9Z28uY29tcHV0ZU9wdGlvbnModCxlLG4sMCxZRSxKRSkscz1pLmhlaWdodCxmPWkud2lkdGgsdT1wQjtyZXR1cm4gZ28uY29tcHV0ZVBvc2l0aW9uKGksbywhMSwwLDAsdVswXSksZ28uY29tcHV0ZVBvc2l0aW9uKGksbywhMSwwLGYtMSx1WzFdKSxnby5jb21wdXRlUG9zaXRpb24oaSxvLCExLHMtMSwwLHVbMl0pLGdvLmNvbXB1dGVQb3NpdGlvbihpLG8sITEscy0xLGYtMSx1WzNdKSxOdC5mcm9tQ2FydGVzaWFuQXJyYXkodSxvLHIpfWZ1bmN0aW9uIG1pKHQpe3Q9eCh0LHguRU1QVFlfT0JKRUNUKTtsZXQgZT10LnJlY3RhbmdsZTtpZih5LnR5cGVPZi5vYmplY3QoInJlY3RhbmdsZSIsZSksTnQuX3ZhbGlkYXRlKGUpLGUubm9ydGg8ZS5zb3V0aCl0aHJvdyBuZXcgQigib3B0aW9ucy5yZWN0YW5nbGUubm9ydGggbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gb3B0aW9ucy5yZWN0YW5nbGUuc291dGgiKTtsZXQgbj14KHQuaGVpZ2h0LDApLG89eCh0LmV4dHJ1ZGVkSGVpZ2h0LG4pO3RoaXMuX3JlY3RhbmdsZT1OdC5jbG9uZShlKSx0aGlzLl9ncmFudWxhcml0eT14KHQuZ3JhbnVsYXJpdHksTS5SQURJQU5TX1BFUl9ERUdSRUUpLHRoaXMuX2VsbGlwc29pZD0kLmNsb25lKHgodC5lbGxpcHNvaWQsJC5kZWZhdWx0KSksdGhpcy5fc3VyZmFjZUhlaWdodD1NYXRoLm1heChuLG8pLHRoaXMuX3JvdGF0aW9uPXgodC5yb3RhdGlvbiwwKSx0aGlzLl9zdFJvdGF0aW9uPXgodC5zdFJvdGF0aW9uLDApLHRoaXMuX3ZlcnRleEZvcm1hdD1kdC5jbG9uZSh4KHQudmVydGV4Rm9ybWF0LGR0LkRFRkFVTFQpKSx0aGlzLl9leHRydWRlZEhlaWdodD1NYXRoLm1pbihuLG8pLHRoaXMuX3NoYWRvd1ZvbHVtZT14KHQuc2hhZG93Vm9sdW1lLCExKSx0aGlzLl93b3JrZXJOYW1lPSJjcmVhdGVSZWN0YW5nbGVHZW9tZXRyeSIsdGhpcy5fb2Zmc2V0QXR0cmlidXRlPXQub2Zmc2V0QXR0cmlidXRlLHRoaXMuX3JvdGF0ZWRSZWN0YW5nbGU9dm9pZCAwLHRoaXMuX3RleHR1cmVDb29yZGluYXRlUm90YXRpb25Qb2ludHM9dm9pZCAwfWZ1bmN0aW9uIEFCKHQpe2lmKHQuX3N0Um90YXRpb249PT0wKXJldHVyblswLDAsMCwxLDEsMF07bGV0IGU9TnQuY2xvbmUodC5fcmVjdGFuZ2xlLHFFKSxuPXQuX2dyYW51bGFyaXR5LG89dC5fZWxsaXBzb2lkLHI9dC5fcm90YXRpb24tdC5fc3RSb3RhdGlvbixpPU15KGUsbixyLG8scUUpLHM9X0I7c1swXS54PWkud2VzdCxzWzBdLnk9aS5zb3V0aCxzWzFdLng9aS53ZXN0LHNbMV0ueT1pLm5vcnRoLHNbMl0ueD1pLmVhc3Qsc1syXS55PWkuc291dGg7bGV0IGY9dC5yZWN0YW5nbGUsdT1Zby5mcm9tUm90YXRpb24odC5fc3RSb3RhdGlvbix5QiksYz1OdC5jZW50ZXIoZixnQik7Zm9yKGxldCBfPTA7XzwzOysrXyl7bGV0IGc9c1tfXTtnLngtPWMubG9uZ2l0dWRlLGcueS09Yy5sYXRpdHVkZSxZby5tdWx0aXBseUJ5VmVjdG9yKHUsZyxnKSxnLngrPWMubG9uZ2l0dWRlLGcueSs9Yy5sYXRpdHVkZSxnLng9KGcueC1mLndlc3QpL2Yud2lkdGgsZy55PShnLnktZi5zb3V0aCkvZi5oZWlnaHR9bGV0IGw9c1swXSxwPXNbMV0sZD1zWzJdLG09bmV3IEFycmF5KDYpO3JldHVybiB0dC5wYWNrKGwsbSksdHQucGFjayhwLG0sMiksdHQucGFjayhkLG0sNCksbX12YXIgQ3ksS0UsV0UsWEUsWUUsc0IsY0IsYUIseHksWkUsUHkscEIsSkUsZEIsdFIsZVIsU3MsbUIsSEUsaEIscUUsX0IseUIsZ0IsTnksblI9WigoKT0+e3ZlKCk7VWUoKTtGdCgpO0llKCk7WHQoKTtGZSgpO0l0KCk7ZnQoKTtIdCgpO1p0KCk7WGUoKTtZZSgpO2FuKCk7c2MoKTtMbygpO3NpKCk7JGUoKTtXdCgpO0FmKCk7Qm4oKTtxcigpO3RuKCk7S28oKTt3bigpO1N5KCk7Um8oKTtDeT1uZXcgYSxLRT1uZXcgYSxXRT1uZXcgYSxYRT1uZXcgYSxZRT1uZXcgTnQsc0I9bmV3IHR0LGNCPW5ldyBBdCxhQj1uZXcgQXQ7eHk9bmV3IGEsWkU9bmV3IGE7UHk9bmV3IGR0O3BCPVtuZXcgYSxuZXcgYSxuZXcgYSxuZXcgYV0sSkU9bmV3IGN0LGRCPW5ldyBjdDttaS5wYWNrZWRMZW5ndGg9TnQucGFja2VkTGVuZ3RoKyQucGFja2VkTGVuZ3RoK2R0LnBhY2tlZExlbmd0aCs3O21pLnBhY2s9ZnVuY3Rpb24odCxlLG4pe3JldHVybiB5LnR5cGVPZi5vYmplY3QoInZhbHVlIix0KSx5LmRlZmluZWQoImFycmF5IixlKSxuPXgobiwwKSxOdC5wYWNrKHQuX3JlY3RhbmdsZSxlLG4pLG4rPU50LnBhY2tlZExlbmd0aCwkLnBhY2sodC5fZWxsaXBzb2lkLGUsbiksbis9JC5wYWNrZWRMZW5ndGgsZHQucGFjayh0Ll92ZXJ0ZXhGb3JtYXQsZSxuKSxuKz1kdC5wYWNrZWRMZW5ndGgsZVtuKytdPXQuX2dyYW51bGFyaXR5LGVbbisrXT10Ll9zdXJmYWNlSGVpZ2h0LGVbbisrXT10Ll9yb3RhdGlvbixlW24rK109dC5fc3RSb3RhdGlvbixlW24rK109dC5fZXh0cnVkZWRIZWlnaHQsZVtuKytdPXQuX3NoYWRvd1ZvbHVtZT8xOjAsZVtuXT14KHQuX29mZnNldEF0dHJpYnV0ZSwtMSksZX07dFI9bmV3IE50LGVSPSQuY2xvbmUoJC5VTklUX1NQSEVSRSksU3M9e3JlY3RhbmdsZTp0UixlbGxpcHNvaWQ6ZVIsdmVydGV4Rm9ybWF0OlB5LGdyYW51bGFyaXR5OnZvaWQgMCxoZWlnaHQ6dm9pZCAwLHJvdGF0aW9uOnZvaWQgMCxzdFJvdGF0aW9uOnZvaWQgMCxleHRydWRlZEhlaWdodDp2b2lkIDAsc2hhZG93Vm9sdW1lOnZvaWQgMCxvZmZzZXRBdHRyaWJ1dGU6dm9pZCAwfTttaS51bnBhY2s9ZnVuY3Rpb24odCxlLG4pe3kuZGVmaW5lZCgiYXJyYXkiLHQpLGU9eChlLDApO2xldCBvPU50LnVucGFjayh0LGUsdFIpO2UrPU50LnBhY2tlZExlbmd0aDtsZXQgcj0kLnVucGFjayh0LGUsZVIpO2UrPSQucGFja2VkTGVuZ3RoO2xldCBpPWR0LnVucGFjayh0LGUsUHkpO2UrPWR0LnBhY2tlZExlbmd0aDtsZXQgcz10W2UrK10sZj10W2UrK10sdT10W2UrK10sYz10W2UrK10sbD10W2UrK10scD10W2UrK109PT0xLGQ9dFtlXTtyZXR1cm4gaChuKT8obi5fcmVjdGFuZ2xlPU50LmNsb25lKG8sbi5fcmVjdGFuZ2xlKSxuLl9lbGxpcHNvaWQ9JC5jbG9uZShyLG4uX2VsbGlwc29pZCksbi5fdmVydGV4Rm9ybWF0PWR0LmNsb25lKGksbi5fdmVydGV4Rm9ybWF0KSxuLl9ncmFudWxhcml0eT1zLG4uX3N1cmZhY2VIZWlnaHQ9ZixuLl9yb3RhdGlvbj11LG4uX3N0Um90YXRpb249YyxuLl9leHRydWRlZEhlaWdodD1sLG4uX3NoYWRvd1ZvbHVtZT1wLG4uX29mZnNldEF0dHJpYnV0ZT1kPT09LTE/dm9pZCAwOmQsbik6KFNzLmdyYW51bGFyaXR5PXMsU3MuaGVpZ2h0PWYsU3Mucm90YXRpb249dSxTcy5zdFJvdGF0aW9uPWMsU3MuZXh0cnVkZWRIZWlnaHQ9bCxTcy5zaGFkb3dWb2x1bWU9cCxTcy5vZmZzZXRBdHRyaWJ1dGU9ZD09PS0xP3ZvaWQgMDpkLG5ldyBtaShTcykpfTttaS5jb21wdXRlUmVjdGFuZ2xlPWZ1bmN0aW9uKHQsZSl7dD14KHQseC5FTVBUWV9PQkpFQ1QpO2xldCBuPXQucmVjdGFuZ2xlO2lmKHkudHlwZU9mLm9iamVjdCgicmVjdGFuZ2xlIixuKSxOdC5fdmFsaWRhdGUobiksbi5ub3J0aDxuLnNvdXRoKXRocm93IG5ldyBCKCJvcHRpb25zLnJlY3RhbmdsZS5ub3J0aCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byBvcHRpb25zLnJlY3RhbmdsZS5zb3V0aCIpO2xldCBvPXgodC5ncmFudWxhcml0eSxNLlJBRElBTlNfUEVSX0RFR1JFRSkscj14KHQuZWxsaXBzb2lkLCQuZGVmYXVsdCksaT14KHQucm90YXRpb24sMCk7cmV0dXJuIE15KG4sbyxpLHIsZSl9O21CPW5ldyBRLEhFPW5ldyBlZSxoQj1uZXcgY3Q7bWkuY3JlYXRlR2VvbWV0cnk9ZnVuY3Rpb24odCl7aWYoTS5lcXVhbHNFcHNpbG9uKHQuX3JlY3RhbmdsZS5ub3J0aCx0Ll9yZWN0YW5nbGUuc291dGgsTS5FUFNJTE9OMTApfHxNLmVxdWFsc0Vwc2lsb24odC5fcmVjdGFuZ2xlLmVhc3QsdC5fcmVjdGFuZ2xlLndlc3QsTS5FUFNJTE9OMTApKXJldHVybjtsZXQgZT10Ll9yZWN0YW5nbGUsbj10Ll9lbGxpcHNvaWQsbz10Ll9yb3RhdGlvbixyPXQuX3N0Um90YXRpb24saT10Ll92ZXJ0ZXhGb3JtYXQscz1nby5jb21wdXRlT3B0aW9ucyhlLHQuX2dyYW51bGFyaXR5LG8scixZRSxKRSxkQiksZj1tQjtpZihyIT09MHx8byE9PTApe2xldCBtPU50LmNlbnRlcihlLGhCKSxfPW4uZ2VvZGV0aWNTdXJmYWNlTm9ybWFsQ2FydG9ncmFwaGljKG0seHkpO2VlLmZyb21BeGlzQW5nbGUoXywtcixIRSksUS5mcm9tUXVhdGVybmlvbihIRSxmKX1lbHNlIFEuY2xvbmUoUS5JREVOVElUWSxmKTtsZXQgdT10Ll9zdXJmYWNlSGVpZ2h0LGM9dC5fZXh0cnVkZWRIZWlnaHQsbD0hTS5lcXVhbHNFcHNpbG9uKHUsYywwLE0uRVBTSUxPTjIpO3MubG9uU2NhbGFyPTEvdC5fcmVjdGFuZ2xlLndpZHRoLHMubGF0U2NhbGFyPTEvdC5fcmVjdGFuZ2xlLmhlaWdodCxzLnRhbmdlbnRSb3RhdGlvbk1hdHJpeD1mO2xldCBwLGQ7aWYoZT10Ll9yZWN0YW5nbGUsbCl7cD1sQih0LHMpO2xldCBtPUF0LmZyb21SZWN0YW5nbGUzRChlLG4sdSxhQiksXz1BdC5mcm9tUmVjdGFuZ2xlM0QoZSxuLGMsY0IpO2Q9QXQudW5pb24obSxfKX1lbHNle2lmKHA9UUUodCxzKSxwLmF0dHJpYnV0ZXMucG9zaXRpb24udmFsdWVzPVBlLnNjYWxlVG9HZW9kZXRpY0hlaWdodChwLmF0dHJpYnV0ZXMucG9zaXRpb24udmFsdWVzLHUsbiwhMSksaCh0Ll9vZmZzZXRBdHRyaWJ1dGUpKXtsZXQgbT1wLmF0dHJpYnV0ZXMucG9zaXRpb24udmFsdWVzLmxlbmd0aCxfPXQuX29mZnNldEF0dHJpYnV0ZT09PWZlLk5PTkU/MDoxLGc9bmV3IFVpbnQ4QXJyYXkobS8zKS5maWxsKF8pO3AuYXR0cmlidXRlcy5hcHBseU9mZnNldD1uZXcgaXQoe2NvbXBvbmVudERhdGF0eXBlOm50LlVOU0lHTkVEX0JZVEUsY29tcG9uZW50c1BlckF0dHJpYnV0ZToxLHZhbHVlczpnfSl9ZD1BdC5mcm9tUmVjdGFuZ2xlM0QoZSxuLHUpfXJldHVybiBpLnBvc2l0aW9ufHxkZWxldGUgcC5hdHRyaWJ1dGVzLnBvc2l0aW9uLG5ldyBVdCh7YXR0cmlidXRlczpwLmF0dHJpYnV0ZXMsaW5kaWNlczpwLmluZGljZXMscHJpbWl0aXZlVHlwZTpwLnByaW1pdGl2ZVR5cGUsYm91bmRpbmdTcGhlcmU6ZCxvZmZzZXRBdHRyaWJ1dGU6dC5fb2Zmc2V0QXR0cmlidXRlfSl9O21pLmNyZWF0ZVNoYWRvd1ZvbHVtZT1mdW5jdGlvbih0LGUsbil7bGV0IG89dC5fZ3JhbnVsYXJpdHkscj10Ll9lbGxpcHNvaWQsaT1lKG8scikscz1uKG8scik7cmV0dXJuIG5ldyBtaSh7cmVjdGFuZ2xlOnQuX3JlY3RhbmdsZSxyb3RhdGlvbjp0Ll9yb3RhdGlvbixlbGxpcHNvaWQ6cixzdFJvdGF0aW9uOnQuX3N0Um90YXRpb24sZ3JhbnVsYXJpdHk6byxleHRydWRlZEhlaWdodDpzLGhlaWdodDppLHZlcnRleEZvcm1hdDpkdC5QT1NJVElPTl9PTkxZLHNoYWRvd1ZvbHVtZTohMH0pfTtxRT1uZXcgTnQsX0I9W25ldyB0dCxuZXcgdHQsbmV3IHR0XSx5Qj1uZXcgWW8sZ0I9bmV3IGN0O09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKG1pLnByb3RvdHlwZSx7cmVjdGFuZ2xlOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gaCh0aGlzLl9yb3RhdGVkUmVjdGFuZ2xlKXx8KHRoaXMuX3JvdGF0ZWRSZWN0YW5nbGU9TXkodGhpcy5fcmVjdGFuZ2xlLHRoaXMuX2dyYW51bGFyaXR5LHRoaXMuX3JvdGF0aW9uLHRoaXMuX2VsbGlwc29pZCkpLHRoaXMuX3JvdGF0ZWRSZWN0YW5nbGV9fSx0ZXh0dXJlQ29vcmRpbmF0ZVJvdGF0aW9uUG9pbnRzOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gaCh0aGlzLl90ZXh0dXJlQ29vcmRpbmF0ZVJvdGF0aW9uUG9pbnRzKXx8KHRoaXMuX3RleHR1cmVDb29yZGluYXRlUm90YXRpb25Qb2ludHM9QUIodGhpcykpLHRoaXMuX3RleHR1cmVDb29yZGluYXRlUm90YXRpb25Qb2ludHN9fX0pO055PW1pfSk7dmFyIEl5PXt9O2RlKEl5LHtkZWZhdWx0OigpPT5UQn0pO2Z1bmN0aW9uIGJCKHQsZSl7cmV0dXJuIGgoZSkmJih0PU55LnVucGFjayh0LGUpKSx0Ll9lbGxpcHNvaWQ9JC5jbG9uZSh0Ll9lbGxpcHNvaWQpLHQuX3JlY3RhbmdsZT1OdC5jbG9uZSh0Ll9yZWN0YW5nbGUpLE55LmNyZWF0ZUdlb21ldHJ5KHQpfXZhciBUQix2eT1aKCgpPT57ZnQoKTtadCgpO3duKCk7blIoKTtUQj1iQn0pO2Z1bmN0aW9uIG9SKHQsZSl7bGV0IG49dC5fZWxsaXBzb2lkLG89ZS5oZWlnaHQscj1lLndpZHRoLGk9ZS5ub3J0aENhcCxzPWUuc291dGhDYXAsZj1vLHU9MixjPTAsbD00O2kmJih1LT0xLGYtPTEsYys9MSxsLT0yKSxzJiYodS09MSxmLT0xLGMrPTEsbC09MiksYys9dSpyKzIqZi1sO2xldCBwPW5ldyBGbG9hdDY0QXJyYXkoYyozKSxkPTAsbT0wLF8sZz1FQjtpZihpKWdvLmNvbXB1dGVQb3NpdGlvbihlLG4sITEsbSwwLGcpLHBbZCsrXT1nLngscFtkKytdPWcueSxwW2QrK109Zy56O2Vsc2UgZm9yKF89MDtfPHI7XysrKWdvLmNvbXB1dGVQb3NpdGlvbihlLG4sITEsbSxfLGcpLHBbZCsrXT1nLngscFtkKytdPWcueSxwW2QrK109Zy56O2ZvcihfPXItMSxtPTE7bTxvO20rKylnby5jb21wdXRlUG9zaXRpb24oZSxuLCExLG0sXyxnKSxwW2QrK109Zy54LHBbZCsrXT1nLnkscFtkKytdPWcuejtpZihtPW8tMSwhcylmb3IoXz1yLTI7Xz49MDtfLS0pZ28uY29tcHV0ZVBvc2l0aW9uKGUsbiwhMSxtLF8sZykscFtkKytdPWcueCxwW2QrK109Zy55LHBbZCsrXT1nLno7Zm9yKF89MCxtPW8tMjttPjA7bS0tKWdvLmNvbXB1dGVQb3NpdGlvbihlLG4sITEsbSxfLGcpLHBbZCsrXT1nLngscFtkKytdPWcueSxwW2QrK109Zy56O2xldCBiPXAubGVuZ3RoLzMqMixUPUR0LmNyZWF0ZVR5cGVkQXJyYXkocC5sZW5ndGgvMyxiKSxPPTA7Zm9yKGxldCB3PTA7dzxwLmxlbmd0aC8zLTE7dysrKVRbTysrXT13LFRbTysrXT13KzE7VFtPKytdPXAubGVuZ3RoLzMtMSxUW08rK109MDtsZXQgRT1uZXcgVXQoe2F0dHJpYnV0ZXM6bmV3IGllLHByaW1pdGl2ZVR5cGU6QnQuTElORVN9KTtyZXR1cm4gRS5hdHRyaWJ1dGVzLnBvc2l0aW9uPW5ldyBpdCh7Y29tcG9uZW50RGF0YXR5cGU6bnQuRE9VQkxFLGNvbXBvbmVudHNQZXJBdHRyaWJ1dGU6Myx2YWx1ZXM6cH0pLEUuaW5kaWNlcz1ULEV9ZnVuY3Rpb24gU0IodCxlKXtsZXQgbj10Ll9zdXJmYWNlSGVpZ2h0LG89dC5fZXh0cnVkZWRIZWlnaHQscj10Ll9lbGxpcHNvaWQsaT1vUih0LGUpLHM9ZS5oZWlnaHQsZj1lLndpZHRoLHU9UGUuc2NhbGVUb0dlb2RldGljSGVpZ2h0KGkuYXR0cmlidXRlcy5wb3NpdGlvbi52YWx1ZXMsbixyLCExKSxjPXUubGVuZ3RoLGw9bmV3IEZsb2F0NjRBcnJheShjKjIpO2wuc2V0KHUpO2xldCBwPVBlLnNjYWxlVG9HZW9kZXRpY0hlaWdodChpLmF0dHJpYnV0ZXMucG9zaXRpb24udmFsdWVzLG8scik7bC5zZXQocCxjKSxpLmF0dHJpYnV0ZXMucG9zaXRpb24udmFsdWVzPWw7bGV0IGQ9ZS5ub3J0aENhcCxtPWUuc291dGhDYXAsXz00O2QmJihfLT0xKSxtJiYoXy09MSk7bGV0IGc9KGwubGVuZ3RoLzMrXykqMixiPUR0LmNyZWF0ZVR5cGVkQXJyYXkobC5sZW5ndGgvMyxnKTtjPWwubGVuZ3RoLzY7bGV0IFQ9MDtmb3IobGV0IEU9MDtFPGMtMTtFKyspYltUKytdPUUsYltUKytdPUUrMSxiW1QrK109RStjLGJbVCsrXT1FK2MrMTtiW1QrK109Yy0xLGJbVCsrXT0wLGJbVCsrXT1jK2MtMSxiW1QrK109YyxiW1QrK109MCxiW1QrK109YztsZXQgTztpZihkKU89cy0xO2Vsc2V7bGV0IEU9Zi0xO2JbVCsrXT1FLGJbVCsrXT1FK2MsTz1mK3MtMn1pZihiW1QrK109TyxiW1QrK109TytjLCFtKXtsZXQgRT1mK08tMTtiW1QrK109RSxiW1RdPUUrY31yZXR1cm4gaS5pbmRpY2VzPWIsaX1mdW5jdGlvbiB2YSh0KXt0PXgodCx4LkVNUFRZX09CSkVDVCk7bGV0IGU9dC5yZWN0YW5nbGUsbj14KHQuZ3JhbnVsYXJpdHksTS5SQURJQU5TX1BFUl9ERUdSRUUpLG89eCh0LmVsbGlwc29pZCwkLmRlZmF1bHQpLHI9eCh0LnJvdGF0aW9uLDApO2lmKCFoKGUpKXRocm93IG5ldyBCKCJyZWN0YW5nbGUgaXMgcmVxdWlyZWQuIik7aWYoTnQuX3ZhbGlkYXRlKGUpLGUubm9ydGg8ZS5zb3V0aCl0aHJvdyBuZXcgQigib3B0aW9ucy5yZWN0YW5nbGUubm9ydGggbXVzdCBiZSBncmVhdGVyIHRoYW4gb3B0aW9ucy5yZWN0YW5nbGUuc291dGgiKTtsZXQgaT14KHQuaGVpZ2h0LDApLHM9eCh0LmV4dHJ1ZGVkSGVpZ2h0LGkpO3RoaXMuX3JlY3RhbmdsZT1OdC5jbG9uZShlKSx0aGlzLl9ncmFudWxhcml0eT1uLHRoaXMuX2VsbGlwc29pZD1vLHRoaXMuX3N1cmZhY2VIZWlnaHQ9TWF0aC5tYXgoaSxzKSx0aGlzLl9yb3RhdGlvbj1yLHRoaXMuX2V4dHJ1ZGVkSGVpZ2h0PU1hdGgubWluKGkscyksdGhpcy5fb2Zmc2V0QXR0cmlidXRlPXQub2Zmc2V0QXR0cmlidXRlLHRoaXMuX3dvcmtlck5hbWU9ImNyZWF0ZVJlY3RhbmdsZU91dGxpbmVHZW9tZXRyeSJ9dmFyIHdCLE9CLEVCLFJCLHJSLGlSLElhLENCLEx5LHNSPVooKCk9Pnt2ZSgpO0Z0KCk7SWUoKTtGZSgpO0l0KCk7ZnQoKTtIdCgpO1p0KCk7WGUoKTtZZSgpO2FuKCk7TG8oKTskZSgpO1d0KCk7cXIoKTt0bigpO3duKCk7U3koKTt3Qj1uZXcgQXQsT0I9bmV3IEF0LEVCPW5ldyBhLFJCPW5ldyBOdDt2YS5wYWNrZWRMZW5ndGg9TnQucGFja2VkTGVuZ3RoKyQucGFja2VkTGVuZ3RoKzU7dmEucGFjaz1mdW5jdGlvbih0LGUsbil7aWYoIWgodCkpdGhyb3cgbmV3IEIoInZhbHVlIGlzIHJlcXVpcmVkIik7aWYoIWgoZSkpdGhyb3cgbmV3IEIoImFycmF5IGlzIHJlcXVpcmVkIik7cmV0dXJuIG49eChuLDApLE50LnBhY2sodC5fcmVjdGFuZ2xlLGUsbiksbis9TnQucGFja2VkTGVuZ3RoLCQucGFjayh0Ll9lbGxpcHNvaWQsZSxuKSxuKz0kLnBhY2tlZExlbmd0aCxlW24rK109dC5fZ3JhbnVsYXJpdHksZVtuKytdPXQuX3N1cmZhY2VIZWlnaHQsZVtuKytdPXQuX3JvdGF0aW9uLGVbbisrXT10Ll9leHRydWRlZEhlaWdodCxlW25dPXgodC5fb2Zmc2V0QXR0cmlidXRlLC0xKSxlfTtyUj1uZXcgTnQsaVI9JC5jbG9uZSgkLlVOSVRfU1BIRVJFKSxJYT17cmVjdGFuZ2xlOnJSLGVsbGlwc29pZDppUixncmFudWxhcml0eTp2b2lkIDAsaGVpZ2h0OnZvaWQgMCxyb3RhdGlvbjp2b2lkIDAsZXh0cnVkZWRIZWlnaHQ6dm9pZCAwLG9mZnNldEF0dHJpYnV0ZTp2b2lkIDB9O3ZhLnVucGFjaz1mdW5jdGlvbih0LGUsbil7aWYoIWgodCkpdGhyb3cgbmV3IEIoImFycmF5IGlzIHJlcXVpcmVkIik7ZT14KGUsMCk7bGV0IG89TnQudW5wYWNrKHQsZSxyUik7ZSs9TnQucGFja2VkTGVuZ3RoO2xldCByPSQudW5wYWNrKHQsZSxpUik7ZSs9JC5wYWNrZWRMZW5ndGg7bGV0IGk9dFtlKytdLHM9dFtlKytdLGY9dFtlKytdLHU9dFtlKytdLGM9dFtlXTtyZXR1cm4gaChuKT8obi5fcmVjdGFuZ2xlPU50LmNsb25lKG8sbi5fcmVjdGFuZ2xlKSxuLl9lbGxpcHNvaWQ9JC5jbG9uZShyLG4uX2VsbGlwc29pZCksbi5fc3VyZmFjZUhlaWdodD1zLG4uX3JvdGF0aW9uPWYsbi5fZXh0cnVkZWRIZWlnaHQ9dSxuLl9vZmZzZXRBdHRyaWJ1dGU9Yz09PS0xP3ZvaWQgMDpjLG4pOihJYS5ncmFudWxhcml0eT1pLElhLmhlaWdodD1zLElhLnJvdGF0aW9uPWYsSWEuZXh0cnVkZWRIZWlnaHQ9dSxJYS5vZmZzZXRBdHRyaWJ1dGU9Yz09PS0xP3ZvaWQgMDpjLG5ldyB2YShJYSkpfTtDQj1uZXcgY3Q7dmEuY3JlYXRlR2VvbWV0cnk9ZnVuY3Rpb24odCl7bGV0IGU9dC5fcmVjdGFuZ2xlLG49dC5fZWxsaXBzb2lkLG89Z28uY29tcHV0ZU9wdGlvbnMoZSx0Ll9ncmFudWxhcml0eSx0Ll9yb3RhdGlvbiwwLFJCLENCKSxyLGk7aWYoTS5lcXVhbHNFcHNpbG9uKGUubm9ydGgsZS5zb3V0aCxNLkVQU0lMT04xMCl8fE0uZXF1YWxzRXBzaWxvbihlLmVhc3QsZS53ZXN0LE0uRVBTSUxPTjEwKSlyZXR1cm47bGV0IHM9dC5fc3VyZmFjZUhlaWdodCxmPXQuX2V4dHJ1ZGVkSGVpZ2h0LHU9IU0uZXF1YWxzRXBzaWxvbihzLGYsMCxNLkVQU0lMT04yKSxjO2lmKHUpe2lmKHI9U0IodCxvKSxoKHQuX29mZnNldEF0dHJpYnV0ZSkpe2xldCBkPXIuYXR0cmlidXRlcy5wb3NpdGlvbi52YWx1ZXMubGVuZ3RoLzMsbT1uZXcgVWludDhBcnJheShkKTt0Ll9vZmZzZXRBdHRyaWJ1dGU9PT1mZS5UT1A/bT1tLmZpbGwoMSwwLGQvMik6KGM9dC5fb2Zmc2V0QXR0cmlidXRlPT09ZmUuTk9ORT8wOjEsbT1tLmZpbGwoYykpLHIuYXR0cmlidXRlcy5hcHBseU9mZnNldD1uZXcgaXQoe2NvbXBvbmVudERhdGF0eXBlOm50LlVOU0lHTkVEX0JZVEUsY29tcG9uZW50c1BlckF0dHJpYnV0ZToxLHZhbHVlczptfSl9bGV0IGw9QXQuZnJvbVJlY3RhbmdsZTNEKGUsbixzLE9CKSxwPUF0LmZyb21SZWN0YW5nbGUzRChlLG4sZix3Qik7aT1BdC51bmlvbihsLHApfWVsc2V7aWYocj1vUih0LG8pLHIuYXR0cmlidXRlcy5wb3NpdGlvbi52YWx1ZXM9UGUuc2NhbGVUb0dlb2RldGljSGVpZ2h0KHIuYXR0cmlidXRlcy5wb3NpdGlvbi52YWx1ZXMscyxuLCExKSxoKHQuX29mZnNldEF0dHJpYnV0ZSkpe2xldCBsPXIuYXR0cmlidXRlcy5wb3NpdGlvbi52YWx1ZXMubGVuZ3RoO2M9dC5fb2Zmc2V0QXR0cmlidXRlPT09ZmUuTk9ORT8wOjE7bGV0IHA9bmV3IFVpbnQ4QXJyYXkobC8zKS5maWxsKGMpO3IuYXR0cmlidXRlcy5hcHBseU9mZnNldD1uZXcgaXQoe2NvbXBvbmVudERhdGF0eXBlOm50LlVOU0lHTkVEX0JZVEUsY29tcG9uZW50c1BlckF0dHJpYnV0ZToxLHZhbHVlczpwfSl9aT1BdC5mcm9tUmVjdGFuZ2xlM0QoZSxuLHMpfXJldHVybiBuZXcgVXQoe2F0dHJpYnV0ZXM6ci5hdHRyaWJ1dGVzLGluZGljZXM6ci5pbmRpY2VzLHByaW1pdGl2ZVR5cGU6QnQuTElORVMsYm91bmRpbmdTcGhlcmU6aSxvZmZzZXRBdHRyaWJ1dGU6dC5fb2Zmc2V0QXR0cmlidXRlfSl9O0x5PXZhfSk7dmFyIER5PXt9O2RlKER5LHtkZWZhdWx0OigpPT5QQn0pO2Z1bmN0aW9uIHhCKHQsZSl7cmV0dXJuIGgoZSkmJih0PUx5LnVucGFjayh0LGUpKSx0Ll9lbGxpcHNvaWQ9JC5jbG9uZSh0Ll9lbGxpcHNvaWQpLHQuX3JlY3RhbmdsZT1OdC5jbG9uZSh0Ll9yZWN0YW5nbGUpLEx5LmNyZWF0ZUdlb21ldHJ5KHQpfXZhciBQQixGeT1aKCgpPT57ZnQoKTtadCgpO3duKCk7c1IoKTtQQj14Qn0pO2Z1bmN0aW9uIE1CKHQsZSxuLG8scixpLHMpe2xldCBmPUFuLm51bWJlck9mUG9pbnRzKHQsZSxyKSx1LGM9bi5yZWQsbD1uLmdyZWVuLHA9bi5ibHVlLGQ9bi5hbHBoYSxtPW8ucmVkLF89by5ncmVlbixnPW8uYmx1ZSxiPW8uYWxwaGE7aWYob2UuZXF1YWxzKG4sbykpe2Zvcih1PTA7dTxmO3UrKylpW3MrK109b2UuZmxvYXRUb0J5dGUoYyksaVtzKytdPW9lLmZsb2F0VG9CeXRlKGwpLGlbcysrXT1vZS5mbG9hdFRvQnl0ZShwKSxpW3MrK109b2UuZmxvYXRUb0J5dGUoZCk7cmV0dXJuIHN9bGV0IFQ9KG0tYykvZixPPShfLWwpL2YsRT0oZy1wKS9mLHc9KGItZCkvZixDPXM7Zm9yKHU9MDt1PGY7dSsrKWlbQysrXT1vZS5mbG9hdFRvQnl0ZShjK3UqVCksaVtDKytdPW9lLmZsb2F0VG9CeXRlKGwrdSpPKSxpW0MrK109b2UuZmxvYXRUb0J5dGUocCt1KkUpLGlbQysrXT1vZS5mbG9hdFRvQnl0ZShkK3Uqdyk7cmV0dXJuIEN9ZnVuY3Rpb24gcnUodCl7dD14KHQseC5FTVBUWV9PQkpFQ1QpO2xldCBlPXQucG9zaXRpb25zLG49dC5jb2xvcnMsbz14KHQuY29sb3JzUGVyVmVydGV4LCExKTtpZighaChlKXx8ZS5sZW5ndGg8Mil0aHJvdyBuZXcgQigiQXQgbGVhc3QgdHdvIHBvc2l0aW9ucyBhcmUgcmVxdWlyZWQuIik7aWYoaChuKSYmKG8mJm4ubGVuZ3RoPGUubGVuZ3RofHwhbyYmbi5sZW5ndGg8ZS5sZW5ndGgtMSkpdGhyb3cgbmV3IEIoImNvbG9ycyBoYXMgYW4gaW52YWxpZCBsZW5ndGguIik7dGhpcy5fcG9zaXRpb25zPWUsdGhpcy5fY29sb3JzPW4sdGhpcy5fY29sb3JzUGVyVmVydGV4PW8sdGhpcy5fYXJjVHlwZT14KHQuYXJjVHlwZSxfZS5HRU9ERVNJQyksdGhpcy5fZ3JhbnVsYXJpdHk9eCh0LmdyYW51bGFyaXR5LE0uUkFESUFOU19QRVJfREVHUkVFKSx0aGlzLl9lbGxpcHNvaWQ9eCh0LmVsbGlwc29pZCwkLmRlZmF1bHQpLHRoaXMuX3dvcmtlck5hbWU9ImNyZWF0ZVNpbXBsZVBvbHlsaW5lR2VvbWV0cnkiO2xldCByPTErZS5sZW5ndGgqYS5wYWNrZWRMZW5ndGg7cis9aChuKT8xK24ubGVuZ3RoKm9lLnBhY2tlZExlbmd0aDoxLHRoaXMucGFja2VkTGVuZ3RoPXIrJC5wYWNrZWRMZW5ndGgrM312YXIgRmQsQmQsTkIsQnksY1I9WigoKT0+e2ZjKCk7dmUoKTtGdCgpO1BhKCk7RmUoKTtJdCgpO2Z0KCk7SHQoKTtadCgpO1hlKCk7WWUoKTthbigpOyRlKCk7V3QoKTt5YSgpO3RuKCk7cnUucGFjaz1mdW5jdGlvbih0LGUsbil7aWYoIWgodCkpdGhyb3cgbmV3IEIoInZhbHVlIGlzIHJlcXVpcmVkIik7aWYoIWgoZSkpdGhyb3cgbmV3IEIoImFycmF5IGlzIHJlcXVpcmVkIik7bj14KG4sMCk7bGV0IG8scj10Ll9wb3NpdGlvbnMsaT1yLmxlbmd0aDtmb3IoZVtuKytdPWksbz0wO288aTsrK28sbis9YS5wYWNrZWRMZW5ndGgpYS5wYWNrKHJbb10sZSxuKTtsZXQgcz10Ll9jb2xvcnM7Zm9yKGk9aChzKT9zLmxlbmd0aDowLGVbbisrXT1pLG89MDtvPGk7KytvLG4rPW9lLnBhY2tlZExlbmd0aClvZS5wYWNrKHNbb10sZSxuKTtyZXR1cm4gJC5wYWNrKHQuX2VsbGlwc29pZCxlLG4pLG4rPSQucGFja2VkTGVuZ3RoLGVbbisrXT10Ll9jb2xvcnNQZXJWZXJ0ZXg/MTowLGVbbisrXT10Ll9hcmNUeXBlLGVbbl09dC5fZ3JhbnVsYXJpdHksZX07cnUudW5wYWNrPWZ1bmN0aW9uKHQsZSxuKXtpZighaCh0KSl0aHJvdyBuZXcgQigiYXJyYXkgaXMgcmVxdWlyZWQiKTtlPXgoZSwwKTtsZXQgbyxyPXRbZSsrXSxpPW5ldyBBcnJheShyKTtmb3Iobz0wO288cjsrK28sZSs9YS5wYWNrZWRMZW5ndGgpaVtvXT1hLnVucGFjayh0LGUpO3I9dFtlKytdO2xldCBzPXI+MD9uZXcgQXJyYXkocik6dm9pZCAwO2ZvcihvPTA7bzxyOysrbyxlKz1vZS5wYWNrZWRMZW5ndGgpc1tvXT1vZS51bnBhY2sodCxlKTtsZXQgZj0kLnVucGFjayh0LGUpO2UrPSQucGFja2VkTGVuZ3RoO2xldCB1PXRbZSsrXT09PTEsYz10W2UrK10sbD10W2VdO3JldHVybiBoKG4pPyhuLl9wb3NpdGlvbnM9aSxuLl9jb2xvcnM9cyxuLl9lbGxpcHNvaWQ9ZixuLl9jb2xvcnNQZXJWZXJ0ZXg9dSxuLl9hcmNUeXBlPWMsbi5fZ3JhbnVsYXJpdHk9bCxuKTpuZXcgcnUoe3Bvc2l0aW9uczppLGNvbG9yczpzLGVsbGlwc29pZDpmLGNvbG9yc1BlclZlcnRleDp1LGFyY1R5cGU6YyxncmFudWxhcml0eTpsfSl9O0ZkPW5ldyBBcnJheSgyKSxCZD1uZXcgQXJyYXkoMiksTkI9e3Bvc2l0aW9uczpGZCxoZWlnaHQ6QmQsZWxsaXBzb2lkOnZvaWQgMCxtaW5EaXN0YW5jZTp2b2lkIDAsZ3JhbnVsYXJpdHk6dm9pZCAwfTtydS5jcmVhdGVHZW9tZXRyeT1mdW5jdGlvbih0KXtsZXQgZT10Ll9wb3NpdGlvbnMsbj10Ll9jb2xvcnMsbz10Ll9jb2xvcnNQZXJWZXJ0ZXgscj10Ll9hcmNUeXBlLGk9dC5fZ3JhbnVsYXJpdHkscz10Ll9lbGxpcHNvaWQsZj1NLmNob3JkTGVuZ3RoKGkscy5tYXhpbXVtUmFkaXVzKSx1PWgobikmJiFvLGMsbD1lLmxlbmd0aCxwLGQsbSxfLGc9MDtpZihyPT09X2UuR0VPREVTSUN8fHI9PT1fZS5SSFVNQil7bGV0IHcsQyxOO3I9PT1fZS5HRU9ERVNJQz8odz1NLmNob3JkTGVuZ3RoKGkscy5tYXhpbXVtUmFkaXVzKSxDPUFuLm51bWJlck9mUG9pbnRzLE49QW4uZ2VuZXJhdGVBcmMpOih3PWksQz1Bbi5udW1iZXJPZlBvaW50c1JodW1iTGluZSxOPUFuLmdlbmVyYXRlUmh1bWJBcmMpO2xldCBJPUFuLmV4dHJhY3RIZWlnaHRzKGUscyksRD1OQjtpZihyPT09X2UuR0VPREVTSUM/RC5taW5EaXN0YW5jZT1mOkQuZ3JhbnVsYXJpdHk9aSxELmVsbGlwc29pZD1zLHUpe2xldCB2PTA7Zm9yKGM9MDtjPGwtMTtjKyspdis9QyhlW2NdLGVbYysxXSx3KSsxO3A9bmV3IEZsb2F0NjRBcnJheSh2KjMpLG09bmV3IFVpbnQ4QXJyYXkodio0KSxELnBvc2l0aW9ucz1GZCxELmhlaWdodD1CZDtsZXQgTD0wO2ZvcihjPTA7YzxsLTE7KytjKXtGZFswXT1lW2NdLEZkWzFdPWVbYysxXSxCZFswXT1JW2NdLEJkWzFdPUlbYysxXTtsZXQgVT1OKEQpO2lmKGgobikpe2xldCBBPVUubGVuZ3RoLzM7Xz1uW2NdO2ZvcihsZXQgUz0wO1M8QTsrK1MpbVtMKytdPW9lLmZsb2F0VG9CeXRlKF8ucmVkKSxtW0wrK109b2UuZmxvYXRUb0J5dGUoXy5ncmVlbiksbVtMKytdPW9lLmZsb2F0VG9CeXRlKF8uYmx1ZSksbVtMKytdPW9lLmZsb2F0VG9CeXRlKF8uYWxwaGEpfXAuc2V0KFUsZyksZys9VS5sZW5ndGh9fWVsc2UgaWYoRC5wb3NpdGlvbnM9ZSxELmhlaWdodD1JLHA9bmV3IEZsb2F0NjRBcnJheShOKEQpKSxoKG4pKXtmb3IobT1uZXcgVWludDhBcnJheShwLmxlbmd0aC8zKjQpLGM9MDtjPGwtMTsrK2Mpe2xldCBMPWVbY10sVT1lW2MrMV0sQT1uW2NdLFM9bltjKzFdO2c9TUIoTCxVLEEsUyxmLG0sZyl9bGV0IHY9bltsLTFdO21bZysrXT1vZS5mbG9hdFRvQnl0ZSh2LnJlZCksbVtnKytdPW9lLmZsb2F0VG9CeXRlKHYuZ3JlZW4pLG1bZysrXT1vZS5mbG9hdFRvQnl0ZSh2LmJsdWUpLG1bZysrXT1vZS5mbG9hdFRvQnl0ZSh2LmFscGhhKX19ZWxzZXtkPXU/bCoyLTI6bCxwPW5ldyBGbG9hdDY0QXJyYXkoZCozKSxtPWgobik/bmV3IFVpbnQ4QXJyYXkoZCo0KTp2b2lkIDA7bGV0IHc9MCxDPTA7Zm9yKGM9MDtjPGw7KytjKXtsZXQgTj1lW2NdO2lmKHUmJmM+MCYmKGEucGFjayhOLHAsdyksdys9MyxfPW5bYy0xXSxtW0MrK109b2UuZmxvYXRUb0J5dGUoXy5yZWQpLG1bQysrXT1vZS5mbG9hdFRvQnl0ZShfLmdyZWVuKSxtW0MrK109b2UuZmxvYXRUb0J5dGUoXy5ibHVlKSxtW0MrK109b2UuZmxvYXRUb0J5dGUoXy5hbHBoYSkpLHUmJmM9PT1sLTEpYnJlYWs7YS5wYWNrKE4scCx3KSx3Kz0zLGgobikmJihfPW5bY10sbVtDKytdPW9lLmZsb2F0VG9CeXRlKF8ucmVkKSxtW0MrK109b2UuZmxvYXRUb0J5dGUoXy5ncmVlbiksbVtDKytdPW9lLmZsb2F0VG9CeXRlKF8uYmx1ZSksbVtDKytdPW9lLmZsb2F0VG9CeXRlKF8uYWxwaGEpKX19bGV0IGI9bmV3IGllO2IucG9zaXRpb249bmV3IGl0KHtjb21wb25lbnREYXRhdHlwZTpudC5ET1VCTEUsY29tcG9uZW50c1BlckF0dHJpYnV0ZTozLHZhbHVlczpwfSksaChuKSYmKGIuY29sb3I9bmV3IGl0KHtjb21wb25lbnREYXRhdHlwZTpudC5VTlNJR05FRF9CWVRFLGNvbXBvbmVudHNQZXJBdHRyaWJ1dGU6NCx2YWx1ZXM6bSxub3JtYWxpemU6ITB9KSksZD1wLmxlbmd0aC8zO2xldCBUPShkLTEpKjIsTz1EdC5jcmVhdGVUeXBlZEFycmF5KGQsVCksRT0wO2ZvcihjPTA7YzxkLTE7KytjKU9bRSsrXT1jLE9bRSsrXT1jKzE7cmV0dXJuIG5ldyBVdCh7YXR0cmlidXRlczpiLGluZGljZXM6TyxwcmltaXRpdmVUeXBlOkJ0LkxJTkVTLGJvdW5kaW5nU3BoZXJlOkF0LmZyb21Qb2ludHMoZSl9KX07Qnk9cnV9KTt2YXIgVXk9e307ZGUoVXkse2RlZmF1bHQ6KCk9PnZCfSk7ZnVuY3Rpb24gSUIodCxlKXtyZXR1cm4gaChlKSYmKHQ9QnkudW5wYWNrKHQsZSkpLHQuX2VsbGlwc29pZD0kLmNsb25lKHQuX2VsbGlwc29pZCksQnkuY3JlYXRlR2VvbWV0cnkodCl9dmFyIHZCLFZ5PVooKCk9PntmdCgpO1p0KCk7Y1IoKTt2Qj1JQn0pO2Z1bmN0aW9uIExhKHQpe2xldCBlPXgodC5yYWRpdXMsMSksbz17cmFkaWk6bmV3IGEoZSxlLGUpLHN0YWNrUGFydGl0aW9uczp0LnN0YWNrUGFydGl0aW9ucyxzbGljZVBhcnRpdGlvbnM6dC5zbGljZVBhcnRpdGlvbnMsdmVydGV4Rm9ybWF0OnQudmVydGV4Rm9ybWF0fTt0aGlzLl9lbGxpcHNvaWRHZW9tZXRyeT1uZXcgc3IobyksdGhpcy5fd29ya2VyTmFtZT0iY3JlYXRlU3BoZXJlR2VvbWV0cnkifXZhciBMQixDcyxreSxhUj1aKCgpPT57RnQoKTtYdCgpO0l0KCk7ZnQoKTtiZCgpO1JvKCk7TGEucGFja2VkTGVuZ3RoPXNyLnBhY2tlZExlbmd0aDtMYS5wYWNrPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4geS50eXBlT2Yub2JqZWN0KCJ2YWx1ZSIsdCksc3IucGFjayh0Ll9lbGxpcHNvaWRHZW9tZXRyeSxlLG4pfTtMQj1uZXcgc3IsQ3M9e3JhZGl1czp2b2lkIDAscmFkaWk6bmV3IGEsdmVydGV4Rm9ybWF0Om5ldyBkdCxzdGFja1BhcnRpdGlvbnM6dm9pZCAwLHNsaWNlUGFydGl0aW9uczp2b2lkIDB9O0xhLnVucGFjaz1mdW5jdGlvbih0LGUsbil7bGV0IG89c3IudW5wYWNrKHQsZSxMQik7cmV0dXJuIENzLnZlcnRleEZvcm1hdD1kdC5jbG9uZShvLl92ZXJ0ZXhGb3JtYXQsQ3MudmVydGV4Rm9ybWF0KSxDcy5zdGFja1BhcnRpdGlvbnM9by5fc3RhY2tQYXJ0aXRpb25zLENzLnNsaWNlUGFydGl0aW9ucz1vLl9zbGljZVBhcnRpdGlvbnMsaChuKT8oYS5jbG9uZShvLl9yYWRpaSxDcy5yYWRpaSksbi5fZWxsaXBzb2lkR2VvbWV0cnk9bmV3IHNyKENzKSxuKTooQ3MucmFkaXVzPW8uX3JhZGlpLngsbmV3IExhKENzKSl9O0xhLmNyZWF0ZUdlb21ldHJ5PWZ1bmN0aW9uKHQpe3JldHVybiBzci5jcmVhdGVHZW9tZXRyeSh0Ll9lbGxpcHNvaWRHZW9tZXRyeSl9O2t5PUxhfSk7dmFyIEd5PXt9O2RlKEd5LHtkZWZhdWx0OigpPT5GQn0pO2Z1bmN0aW9uIERCKHQsZSl7cmV0dXJuIGgoZSkmJih0PWt5LnVucGFjayh0LGUpKSxreS5jcmVhdGVHZW9tZXRyeSh0KX12YXIgRkIsenk9WigoKT0+e2Z0KCk7YVIoKTtGQj1EQn0pO2Z1bmN0aW9uIERhKHQpe2xldCBlPXgodC5yYWRpdXMsMSksbz17cmFkaWk6bmV3IGEoZSxlLGUpLHN0YWNrUGFydGl0aW9uczp0LnN0YWNrUGFydGl0aW9ucyxzbGljZVBhcnRpdGlvbnM6dC5zbGljZVBhcnRpdGlvbnMsc3ViZGl2aXNpb25zOnQuc3ViZGl2aXNpb25zfTt0aGlzLl9lbGxpcHNvaWRHZW9tZXRyeT1uZXcgV3IobyksdGhpcy5fd29ya2VyTmFtZT0iY3JlYXRlU3BoZXJlT3V0bGluZUdlb21ldHJ5In12YXIgQkIsVGMsanksZlI9WigoKT0+e0Z0KCk7WHQoKTtJdCgpO2Z0KCk7Ul8oKTtEYS5wYWNrZWRMZW5ndGg9V3IucGFja2VkTGVuZ3RoO0RhLnBhY2s9ZnVuY3Rpb24odCxlLG4pe3JldHVybiB5LnR5cGVPZi5vYmplY3QoInZhbHVlIix0KSxXci5wYWNrKHQuX2VsbGlwc29pZEdlb21ldHJ5LGUsbil9O0JCPW5ldyBXcixUYz17cmFkaXVzOnZvaWQgMCxyYWRpaTpuZXcgYSxzdGFja1BhcnRpdGlvbnM6dm9pZCAwLHNsaWNlUGFydGl0aW9uczp2b2lkIDAsc3ViZGl2aXNpb25zOnZvaWQgMH07RGEudW5wYWNrPWZ1bmN0aW9uKHQsZSxuKXtsZXQgbz1Xci51bnBhY2sodCxlLEJCKTtyZXR1cm4gVGMuc3RhY2tQYXJ0aXRpb25zPW8uX3N0YWNrUGFydGl0aW9ucyxUYy5zbGljZVBhcnRpdGlvbnM9by5fc2xpY2VQYXJ0aXRpb25zLFRjLnN1YmRpdmlzaW9ucz1vLl9zdWJkaXZpc2lvbnMsaChuKT8oYS5jbG9uZShvLl9yYWRpaSxUYy5yYWRpaSksbi5fZWxsaXBzb2lkR2VvbWV0cnk9bmV3IFdyKFRjKSxuKTooVGMucmFkaXVzPW8uX3JhZGlpLngsbmV3IERhKFRjKSl9O0RhLmNyZWF0ZUdlb21ldHJ5PWZ1bmN0aW9uKHQpe3JldHVybiBXci5jcmVhdGVHZW9tZXRyeSh0Ll9lbGxpcHNvaWRHZW9tZXRyeSl9O2p5PURhfSk7dmFyIEh5PXt9O2RlKEh5LHtkZWZhdWx0OigpPT5WQn0pO2Z1bmN0aW9uIFVCKHQsZSl7cmV0dXJuIGgoZSkmJih0PWp5LnVucGFjayh0LGUpKSxqeS5jcmVhdGVHZW9tZXRyeSh0KX12YXIgVkIscXk9WigoKT0+e2Z0KCk7ZlIoKTtWQj1VQn0pO3ZhciBLeT17fTtkZShLeSx7ZGVmYXVsdDooKT0+aTR9KTtmdW5jdGlvbiBqQih0LGUsbixvLHIsaSxzKXtsZXQgZj10Lmxlbmd0aCx1PW5ldyBGbG9hdDY0QXJyYXkoZiozKTtmb3IobGV0IGM9MDtjPGY7KytjKXtsZXQgbD10W2NdLHA9ZVtjXSxkPW5bY10sbT1NLmxlcnAoby53ZXN0LG8uZWFzdCxsL2l1KSxfPU0ubGVycChvLnNvdXRoLG8ubm9ydGgscC9pdSksZz1NLmxlcnAocixpLGQvaXUpLGI9Y3QuZnJvbVJhZGlhbnMobSxfLGcsR0IpLFQ9cy5jYXJ0b2dyYXBoaWNUb0NhcnRlc2lhbihiLHpCKTthLnBhY2soVCx1LGMqMyl9cmV0dXJuIHV9ZnVuY3Rpb24gSEIodCl7bGV0IGU9dC5sZW5ndGgsbj1uZXcgVWludDMyQXJyYXkoZSsxKSxvPTA7Zm9yKGxldCByPTA7cjxlOysrciluW3JdPW8sbys9dFtyXTtyZXR1cm4gbltlXT1vLG59ZnVuY3Rpb24gV0IodCxlLG4sbyl7bGV0IHI9by5sZW5ndGgsaT10Lmxlbmd0aCxzPW5ldyBVaW50OEFycmF5KGkpLGY9cUIsdT1LQixjPTA7Zm9yKGxldCBwPTA7cDxyO3ArKyl7bGV0IGQ9b1twXSxtPWQ7Zm9yKGxldCBfPTE7XzxkO18rKyl7bGV0IGc9YytfLGI9Zy0xO3UubG9uZ2l0dWRlPXRbZ10sdS5sYXRpdHVkZT1lW2ddLGYubG9uZ2l0dWRlPXRbYl0sZi5sYXRpdHVkZT1lW2JdLGN0LmVxdWFscyh1LGYpJiYobS0tLHNbYl09MSl9b1twXT1tLGMrPWR9bGV0IGw9MDtmb3IobGV0IHA9MDtwPGk7cCsrKXNbcF0hPT0xJiYodFtsXT10W3BdLGVbbF09ZVtwXSxuW2xdPW5bcF0sbCsrKX1mdW5jdGlvbiBtUih0KXtsZXQgZT10Kjgsbj1lKjMsbz1lKjQ7dGhpcy5zdGFydEVsbGlwc29pZE5vcm1hbHM9bmV3IEZsb2F0MzJBcnJheShuKSx0aGlzLmVuZEVsbGlwc29pZE5vcm1hbHM9bmV3IEZsb2F0MzJBcnJheShuKSx0aGlzLnN0YXJ0UG9zaXRpb25BbmRIZWlnaHRzPW5ldyBGbG9hdDMyQXJyYXkobyksdGhpcy5zdGFydEZhY2VOb3JtYWxBbmRWZXJ0ZXhDb3JuZXJJZHM9bmV3IEZsb2F0MzJBcnJheShvKSx0aGlzLmVuZFBvc2l0aW9uQW5kSGVpZ2h0cz1uZXcgRmxvYXQzMkFycmF5KG8pLHRoaXMuZW5kRmFjZU5vcm1hbEFuZEhhbGZXaWR0aHM9bmV3IEZsb2F0MzJBcnJheShvKSx0aGlzLnZlcnRleEJhdGNoSWRzPW5ldyBVaW50MTZBcnJheShlKSx0aGlzLmluZGljZXM9RHQuY3JlYXRlVHlwZWRBcnJheShlLDM2KnQpLHRoaXMudmVjM09mZnNldD0wLHRoaXMudmVjNE9mZnNldD0wLHRoaXMuYmF0Y2hJZE9mZnNldD0wLHRoaXMuaW5kZXhPZmZzZXQ9MCx0aGlzLnZvbHVtZVN0YXJ0SW5kZXg9MH1mdW5jdGlvbiBsUih0LGUsbixvLHIpe2xldCBpPWEuc3VidHJhY3QobixlLFhCKSxzPWEuc3VidHJhY3QoZSx0LHVSKTtyZXR1cm4gYS5ub3JtYWxpemUoaSxpKSxhLm5vcm1hbGl6ZShzLHMpLGEuZG90KGkscyk8a0ImJihzPWEubXVsdGlwbHlCeVNjYWxhcihzLC0xLHVSKSksYS5hZGQoaSxzLHIpLGEuZXF1YWxzKHIsYS5aRVJPKSYmKHI9YS5zdWJ0cmFjdCh0LGUpKSxhLmNyb3NzKHIsbyxyKSxhLmNyb3NzKG8scixyKSxhLm5vcm1hbGl6ZShyLHIpLHJ9ZnVuY3Rpb24gcjQodCxlKXtsZXQgbj1uZXcgVWludDE2QXJyYXkodC5wb3NpdGlvbnMpLG89bmV3IFVpbnQxNkFycmF5KHQud2lkdGhzKSxyPW5ldyBVaW50MzJBcnJheSh0LmNvdW50cyksaT1uZXcgVWludDE2QXJyYXkodC5iYXRjaElkcykscz1KQixmPXQ0LHU9ZTQsYz1uZXcgRmxvYXQ2NEFycmF5KHQucGFja2VkQnVmZmVyKSxsPTAscD1jW2wrK10sZD1jW2wrK107TnQudW5wYWNrKGMsbCxzKSxsKz1OdC5wYWNrZWRMZW5ndGgsJC51bnBhY2soYyxsLGYpLGwrPSQucGFja2VkTGVuZ3RoLGEudW5wYWNrKGMsbCx1KTtsZXQgbSxfPW4ubGVuZ3RoLzMsZz1uLnN1YmFycmF5KDAsXyksYj1uLnN1YmFycmF5KF8sMipfKSxUPW4uc3ViYXJyYXkoMipfLDMqXyk7bm4uemlnWmFnRGVsdGFEZWNvZGUoZyxiLFQpLFdCKGcsYixULHIpO2xldCBPPXIubGVuZ3RoLEU9MDtmb3IobT0wO208TzttKyspe2xldCBVPXJbbV07RSs9VS0xfWxldCB3PW5ldyBtUihFKSxDPWpCKGcsYixULHMscCxkLGYsdSk7Xz1nLmxlbmd0aDtsZXQgTj1uZXcgRmxvYXQzMkFycmF5KF8qMyk7Zm9yKG09MDttPF87KyttKU5bbSozXT1DW20qM10tdS54LE5bbSozKzFdPUNbbSozKzFdLXUueSxOW20qMysyXT1DW20qMysyXS11Lno7bGV0IEk9MCxEPTA7Zm9yKG09MDttPE87bSsrKXtsZXQgVT1yW21dLTEsQT1vW21dKi41LFM9aVttXSxQPUk7Zm9yKGxldCBGPTA7RjxVO0YrKyl7bGV0IGo9YS51bnBhY2soTixJLG40KSxIPWEudW5wYWNrKE4sSSszLG80KSxrPVRbRF0sSz1UW0QrMV07az1NLmxlcnAocCxkLGsvaXUpLEs9TS5sZXJwKHAsZCxLL2l1KSxEKys7bGV0IFg9VWQsUj1WZDtpZihGPT09MCl7bGV0IG90PVArVSozLGF0PWEudW5wYWNrKE4sb3QsVWQpO2lmKGEuZXF1YWxzKGF0LGopKWEudW5wYWNrKE4sb3QtMyxYKTtlbHNle2xldCBwdD1hLnN1YnRyYWN0KGosSCxVZCk7WD1hLmFkZChwdCxqLFVkKX19ZWxzZSBhLnVucGFjayhOLEktMyxYKTtpZihGPT09VS0xKXtsZXQgb3Q9YS51bnBhY2soTixQLFZkKTtpZihhLmVxdWFscyhvdCxIKSlhLnVucGFjayhOLFArMyxSKTtlbHNle2xldCBhdD1hLnN1YnRyYWN0KEgsaixWZCk7Uj1hLmFkZChhdCxILFZkKX19ZWxzZSBhLnVucGFjayhOLEkrNixSKTt3LmFkZFZvbHVtZShYLGosSCxSLGssSyxBLFMsdSxmKSxJKz0zfUkrPTMsRCsrfWxldCB2PXcuaW5kaWNlcztlLnB1c2gody5zdGFydEVsbGlwc29pZE5vcm1hbHMuYnVmZmVyKSxlLnB1c2gody5lbmRFbGxpcHNvaWROb3JtYWxzLmJ1ZmZlciksZS5wdXNoKHcuc3RhcnRQb3NpdGlvbkFuZEhlaWdodHMuYnVmZmVyKSxlLnB1c2gody5zdGFydEZhY2VOb3JtYWxBbmRWZXJ0ZXhDb3JuZXJJZHMuYnVmZmVyKSxlLnB1c2gody5lbmRQb3NpdGlvbkFuZEhlaWdodHMuYnVmZmVyKSxlLnB1c2gody5lbmRGYWNlTm9ybWFsQW5kSGFsZldpZHRocy5idWZmZXIpLGUucHVzaCh3LnZlcnRleEJhdGNoSWRzLmJ1ZmZlciksZS5wdXNoKHYuYnVmZmVyKTtsZXQgTD17aW5kZXhEYXRhdHlwZTp2LkJZVEVTX1BFUl9FTEVNRU5UPT09Mj9EdC5VTlNJR05FRF9TSE9SVDpEdC5VTlNJR05FRF9JTlQsc3RhcnRFbGxpcHNvaWROb3JtYWxzOncuc3RhcnRFbGxpcHNvaWROb3JtYWxzLmJ1ZmZlcixlbmRFbGxpcHNvaWROb3JtYWxzOncuZW5kRWxsaXBzb2lkTm9ybWFscy5idWZmZXIsc3RhcnRQb3NpdGlvbkFuZEhlaWdodHM6dy5zdGFydFBvc2l0aW9uQW5kSGVpZ2h0cy5idWZmZXIsc3RhcnRGYWNlTm9ybWFsQW5kVmVydGV4Q29ybmVySWRzOncuc3RhcnRGYWNlTm9ybWFsQW5kVmVydGV4Q29ybmVySWRzLmJ1ZmZlcixlbmRQb3NpdGlvbkFuZEhlaWdodHM6dy5lbmRQb3NpdGlvbkFuZEhlaWdodHMuYnVmZmVyLGVuZEZhY2VOb3JtYWxBbmRIYWxmV2lkdGhzOncuZW5kRmFjZU5vcm1hbEFuZEhhbGZXaWR0aHMuYnVmZmVyLHZlcnRleEJhdGNoSWRzOncudmVydGV4QmF0Y2hJZHMuYnVmZmVyLGluZGljZXM6di5idWZmZXJ9O2lmKHQua2VlcERlY29kZWRQb3NpdGlvbnMpe2xldCBVPUhCKHIpO2UucHVzaChDLmJ1ZmZlcixVLmJ1ZmZlciksTD1fcihMLHtkZWNvZGVkUG9zaXRpb25zOkMuYnVmZmVyLGRlY29kZWRQb3NpdGlvbk9mZnNldHM6VS5idWZmZXJ9KX1yZXR1cm4gTH12YXIgaXUsa0IsR0IsekIscUIsS0IsdVIsWEIsaFIscFIsZFIsWUIsJEIsWkIsUUIsSkIsdDQsZTQsVWQsbjQsbzQsVmQsaTQsV3k9WigoKT0+e2FzKCk7RnQoKTtJZSgpO3JwKCk7WnQoKTskZSgpO1d0KCk7d24oKTtzbygpO2l1PTMyNzY3LGtCPU1hdGguY29zKE0udG9SYWRpYW5zKDE1MCkpLEdCPW5ldyBjdCx6Qj1uZXcgYTtxQj1uZXcgY3QsS0I9bmV3IGN0O3VSPW5ldyBhLFhCPW5ldyBhO2hSPVswLDIsNiwwLDYsNCwwLDEsMywwLDMsMiwwLDQsNSwwLDUsMSw1LDMsMSw1LDcsMyw3LDUsNCw3LDQsNiw3LDYsMiw3LDIsM10scFI9aFIubGVuZ3RoLGRSPW5ldyBhLFlCPW5ldyBhLCRCPW5ldyBhLFpCPW5ldyBhLFFCPW5ldyBhO21SLnByb3RvdHlwZS5hZGRWb2x1bWU9ZnVuY3Rpb24odCxlLG4sbyxyLGkscyxmLHUsYyl7bGV0IGw9YS5hZGQoZSx1LGRSKSxwPWMuZ2VvZGV0aWNTdXJmYWNlTm9ybWFsKGwsWUIpO2w9YS5hZGQobix1LGRSKTtsZXQgZD1jLmdlb2RldGljU3VyZmFjZU5vcm1hbChsLFpCKSxtPWxSKHQsZSxuLHAsJEIpLF89bFIobyxuLGUsZCxRQiksZz10aGlzLnN0YXJ0RWxsaXBzb2lkTm9ybWFscyxiPXRoaXMuZW5kRWxsaXBzb2lkTm9ybWFscyxUPXRoaXMuc3RhcnRQb3NpdGlvbkFuZEhlaWdodHMsTz10aGlzLnN0YXJ0RmFjZU5vcm1hbEFuZFZlcnRleENvcm5lcklkcyxFPXRoaXMuZW5kUG9zaXRpb25BbmRIZWlnaHRzLHc9dGhpcy5lbmRGYWNlTm9ybWFsQW5kSGFsZldpZHRocyxDPXRoaXMudmVydGV4QmF0Y2hJZHMsTj10aGlzLmJhdGNoSWRPZmZzZXQsST10aGlzLnZlYzNPZmZzZXQsRD10aGlzLnZlYzRPZmZzZXQsdjtmb3Iodj0wO3Y8ODt2KyspYS5wYWNrKHAsZyxJKSxhLnBhY2soZCxiLEkpLGEucGFjayhlLFQsRCksVFtEKzNdPXIsYS5wYWNrKG4sRSxEKSxFW0QrM109aSxhLnBhY2sobSxPLEQpLE9bRCszXT12LGEucGFjayhfLHcsRCksd1tEKzNdPXMsQ1tOKytdPWYsSSs9MyxEKz00O3RoaXMuYmF0Y2hJZE9mZnNldD1OLHRoaXMudmVjM09mZnNldD1JLHRoaXMudmVjNE9mZnNldD1EO2xldCBMPXRoaXMuaW5kaWNlcyxVPXRoaXMudm9sdW1lU3RhcnRJbmRleCxBPXRoaXMuaW5kZXhPZmZzZXQ7Zm9yKHY9MDt2PHBSO3YrKylMW0Erdl09aFJbdl0rVTt0aGlzLnZvbHVtZVN0YXJ0SW5kZXgrPTgsdGhpcy5pbmRleE9mZnNldCs9cFJ9O0pCPW5ldyBOdCx0ND1uZXcgJCxlND1uZXcgYSxVZD1uZXcgYSxuND1uZXcgYSxvND1uZXcgYSxWZD1uZXcgYTtpND1RZShyNCl9KTtmdW5jdGlvbiBzNCh0KXt0aGlzLm9mZnNldD10Lm9mZnNldCx0aGlzLmNvdW50PXQuY291bnQsdGhpcy5jb2xvcj10LmNvbG9yLHRoaXMuYmF0Y2hJZHM9dC5iYXRjaElkc312YXIgX1IseVI9WigoKT0+e19SPXM0fSk7dmFyIFh5PXt9O2RlKFh5LHtkZWZhdWx0OigpPT5iNH0pO2Z1bmN0aW9uIGw0KHQsZSl7bGV0IG49ZSpjNCxvPWEudW5wYWNrKHQsbixHZCk7bis9YS5wYWNrZWRMZW5ndGg7bGV0IHI9c3QudW5wYWNrKHQsbixDci5tb2RlbE1hdHJpeCk7c3QubXVsdGlwbHlCeVNjYWxlKHIsbyxyKTtsZXQgaT1Dci5ib3VuZGluZ1ZvbHVtZTtyZXR1cm4gYS5jbG9uZShhLlpFUk8saS5jZW50ZXIpLGkucmFkaXVzPU1hdGguc3FydCgzKSxDcn1mdW5jdGlvbiBwNCh0LGUpe2xldCBuPWUqYTQsbz10W24rK10scj10W24rK10saT1hLmZyb21FbGVtZW50cyhvLG8scixHZCkscz1zdC51bnBhY2sodCxuLENyLm1vZGVsTWF0cml4KTtzdC5tdWx0aXBseUJ5U2NhbGUocyxpLHMpO2xldCBmPUNyLmJvdW5kaW5nVm9sdW1lO3JldHVybiBhLmNsb25lKGEuWkVSTyxmLmNlbnRlciksZi5yYWRpdXM9TWF0aC5zcXJ0KDIpLENyfWZ1bmN0aW9uIGQ0KHQsZSl7bGV0IG49ZSpmNCxvPWEudW5wYWNrKHQsbixHZCk7bis9YS5wYWNrZWRMZW5ndGg7bGV0IHI9c3QudW5wYWNrKHQsbixDci5tb2RlbE1hdHJpeCk7c3QubXVsdGlwbHlCeVNjYWxlKHIsbyxyKTtsZXQgaT1Dci5ib3VuZGluZ1ZvbHVtZTtyZXR1cm4gYS5jbG9uZShhLlpFUk8saS5jZW50ZXIpLGkucmFkaXVzPTEsQ3J9ZnVuY3Rpb24gbTQodCxlKXtsZXQgbj1lKnU0LG89dFtuKytdLHI9YS51bnBhY2sodCxuLEdkKSxpPXN0LmZyb21UcmFuc2xhdGlvbihyLENyLm1vZGVsTWF0cml4KTtzdC5tdWx0aXBseUJ5VW5pZm9ybVNjYWxlKGksbyxpKTtsZXQgcz1Dci5ib3VuZGluZ1ZvbHVtZTtyZXR1cm4gYS5jbG9uZShhLlpFUk8scy5jZW50ZXIpLHMucmFkaXVzPTEsQ3J9ZnVuY3Rpb24ga2QodCxlLG4sbyxyKXtpZighaChlKSlyZXR1cm47bGV0IGk9bi5sZW5ndGgscz1vLmF0dHJpYnV0ZXMucG9zaXRpb24udmFsdWVzLGY9by5pbmRpY2VzLHU9dC5wb3NpdGlvbnMsYz10LnZlcnRleEJhdGNoSWRzLGw9dC5pbmRpY2VzLHA9dC5iYXRjaElkcyxkPXQuYmF0Y2hUYWJsZUNvbG9ycyxtPXQuYmF0Y2hlZEluZGljZXMsXz10LmluZGV4T2Zmc2V0cyxnPXQuaW5kZXhDb3VudHMsYj10LmJvdW5kaW5nVm9sdW1lcyxUPXQubW9kZWxNYXRyaXgsTz10LmNlbnRlcixFPXQucG9zaXRpb25PZmZzZXQsdz10LmJhdGNoSWRJbmRleCxDPXQuaW5kZXhPZmZzZXQsTj10LmJhdGNoZWRJbmRpY2VzT2Zmc2V0O2ZvcihsZXQgST0wO0k8aTsrK0kpe2xldCBEPXIoZSxJKSx2PUQubW9kZWxNYXRyaXg7c3QubXVsdGlwbHkoVCx2LHYpO2xldCBMPW5bSV0sVT1zLmxlbmd0aDtmb3IobGV0IFA9MDtQPFU7UCs9Myl7bGV0IEY9YS51bnBhY2socyxQLGg0KTtzdC5tdWx0aXBseUJ5UG9pbnQodixGLEYpLGEuc3VidHJhY3QoRixPLEYpLGEucGFjayhGLHUsRSozK1ApLGNbdysrXT1MfWxldCBBPWYubGVuZ3RoO2ZvcihsZXQgUD0wO1A8QTsrK1ApbFtDK1BdPWZbUF0rRTtsZXQgUz1JK047bVtTXT1uZXcgX1Ioe29mZnNldDpDLGNvdW50OkEsY29sb3I6b2UuZnJvbVJnYmEoZFtMXSksYmF0Y2hJZHM6W0xdfSkscFtTXT1MLF9bU109QyxnW1NdPUEsYltTXT1BdC50cmFuc2Zvcm0oRC5ib3VuZGluZ1ZvbHVtZSx2KSxFKz1VLzMsQys9QX10LnBvc2l0aW9uT2Zmc2V0PUUsdC5iYXRjaElkSW5kZXg9dyx0LmluZGV4T2Zmc2V0PUMsdC5iYXRjaGVkSW5kaWNlc09mZnNldCs9aX1mdW5jdGlvbiBfNCh0KXtsZXQgZT1uZXcgRmxvYXQ2NEFycmF5KHQpLG49MDthLnVucGFjayhlLG4sZ1IpLG4rPWEucGFja2VkTGVuZ3RoLHN0LnVucGFjayhlLG4sQVIpfWZ1bmN0aW9uIHk0KHQpe2xldCBlPXQubGVuZ3RoLG49MDtmb3IobGV0IG89MDtvPGU7KytvKW4rPW9lLnBhY2tlZExlbmd0aCszK3Rbb10uYmF0Y2hJZHMubGVuZ3RoO3JldHVybiBufWZ1bmN0aW9uIGc0KHQsZSxuKXtsZXQgbz1uLmxlbmd0aCxyPTIrbypBdC5wYWNrZWRMZW5ndGgrMSt5NChlKSxpPW5ldyBGbG9hdDY0QXJyYXkocikscz0wO2lbcysrXT10LGlbcysrXT1vO2ZvcihsZXQgdT0wO3U8bzsrK3UpQXQucGFjayhuW3VdLGkscykscys9QXQucGFja2VkTGVuZ3RoO2xldCBmPWUubGVuZ3RoO2lbcysrXT1mO2ZvcihsZXQgdT0wO3U8ZjsrK3Upe2xldCBjPWVbdV07b2UucGFjayhjLmNvbG9yLGkscykscys9b2UucGFja2VkTGVuZ3RoLGlbcysrXT1jLm9mZnNldCxpW3MrK109Yy5jb3VudDtsZXQgbD1jLmJhdGNoSWRzLHA9bC5sZW5ndGg7aVtzKytdPXA7Zm9yKGxldCBkPTA7ZDxwOysrZClpW3MrK109bFtkXX1yZXR1cm4gaX1mdW5jdGlvbiBBNCh0LGUpe2xldCBuPWgodC5ib3hlcyk/bmV3IEZsb2F0MzJBcnJheSh0LmJveGVzKTp2b2lkIDAsbz1oKHQuYm94QmF0Y2hJZHMpP25ldyBVaW50MTZBcnJheSh0LmJveEJhdGNoSWRzKTp2b2lkIDAscj1oKHQuY3lsaW5kZXJzKT9uZXcgRmxvYXQzMkFycmF5KHQuY3lsaW5kZXJzKTp2b2lkIDAsaT1oKHQuY3lsaW5kZXJCYXRjaElkcyk/bmV3IFVpbnQxNkFycmF5KHQuY3lsaW5kZXJCYXRjaElkcyk6dm9pZCAwLHM9aCh0LmVsbGlwc29pZHMpP25ldyBGbG9hdDMyQXJyYXkodC5lbGxpcHNvaWRzKTp2b2lkIDAsZj1oKHQuZWxsaXBzb2lkQmF0Y2hJZHMpP25ldyBVaW50MTZBcnJheSh0LmVsbGlwc29pZEJhdGNoSWRzKTp2b2lkIDAsdT1oKHQuc3BoZXJlcyk/bmV3IEZsb2F0MzJBcnJheSh0LnNwaGVyZXMpOnZvaWQgMCxjPWgodC5zcGhlcmVCYXRjaElkcyk/bmV3IFVpbnQxNkFycmF5KHQuc3BoZXJlQmF0Y2hJZHMpOnZvaWQgMCxsPWgobik/by5sZW5ndGg6MCxwPWgocik/aS5sZW5ndGg6MCxkPWgocyk/Zi5sZW5ndGg6MCxtPWgodSk/Yy5sZW5ndGg6MCxfPVNmLmdldFVuaXRCb3goKSxnPUhmLmdldFVuaXRDeWxpbmRlcigpLGI9c3IuZ2V0VW5pdEVsbGlwc29pZCgpLFQ9Xy5hdHRyaWJ1dGVzLnBvc2l0aW9uLnZhbHVlcyxPPWcuYXR0cmlidXRlcy5wb3NpdGlvbi52YWx1ZXMsRT1iLmF0dHJpYnV0ZXMucG9zaXRpb24udmFsdWVzLHc9VC5sZW5ndGgqbDt3Kz1PLmxlbmd0aCpwLHcrPUUubGVuZ3RoKihkK20pO2xldCBDPV8uaW5kaWNlcyxOPWcuaW5kaWNlcyxJPWIuaW5kaWNlcyxEPUMubGVuZ3RoKmw7RCs9Ti5sZW5ndGgqcCxEKz1JLmxlbmd0aCooZCttKTtsZXQgdj1uZXcgRmxvYXQzMkFycmF5KHcpLEw9bmV3IFVpbnQxNkFycmF5KHcvMyksVT1EdC5jcmVhdGVUeXBlZEFycmF5KHcvMyxEKSxBPWwrcCtkK20sUz1uZXcgVWludDE2QXJyYXkoQSksUD1uZXcgQXJyYXkoQSksRj1uZXcgVWludDMyQXJyYXkoQSksaj1uZXcgVWludDMyQXJyYXkoQSksSD1uZXcgQXJyYXkoQSk7XzQodC5wYWNrZWRCdWZmZXIpO2xldCBrPXtiYXRjaFRhYmxlQ29sb3JzOm5ldyBVaW50MzJBcnJheSh0LmJhdGNoVGFibGVDb2xvcnMpLHBvc2l0aW9uczp2LHZlcnRleEJhdGNoSWRzOkwsaW5kaWNlczpVLGJhdGNoSWRzOlMsYmF0Y2hlZEluZGljZXM6UCxpbmRleE9mZnNldHM6RixpbmRleENvdW50czpqLGJvdW5kaW5nVm9sdW1lczpILHBvc2l0aW9uT2Zmc2V0OjAsYmF0Y2hJZEluZGV4OjAsaW5kZXhPZmZzZXQ6MCxiYXRjaGVkSW5kaWNlc09mZnNldDowLG1vZGVsTWF0cml4OkFSLGNlbnRlcjpnUn07a2QoayxuLG8sXyxsNCksa2QoayxyLGksZyxwNCksa2QoayxzLGYsYixkNCksa2Qoayx1LGMsYixtNCk7bGV0IEs9ZzQoVS5CWVRFU19QRVJfRUxFTUVOVCxQLEgpO3JldHVybiBlLnB1c2godi5idWZmZXIsTC5idWZmZXIsVS5idWZmZXIpLGUucHVzaChTLmJ1ZmZlcixGLmJ1ZmZlcixqLmJ1ZmZlciksZS5wdXNoKEsuYnVmZmVyKSx7cG9zaXRpb25zOnYuYnVmZmVyLHZlcnRleEJhdGNoSWRzOkwuYnVmZmVyLGluZGljZXM6VS5idWZmZXIsaW5kZXhPZmZzZXRzOkYuYnVmZmVyLGluZGV4Q291bnRzOmouYnVmZmVyLGJhdGNoSWRzOlMuYnVmZmVyLHBhY2tlZEJ1ZmZlcjpLLmJ1ZmZlcn19dmFyIEdkLGM0LGE0LGY0LHU0LENyLGg0LGdSLEFSLGI0LFl5PVooKCk9Pnt2ZSgpO2MwKCk7RnQoKTtQYSgpO2xfKCk7ZnQoKTtiZCgpOyRlKCk7VW4oKTt5UigpO3NvKCk7R2Q9bmV3IGEsYzQ9c3QucGFja2VkTGVuZ3RoK2EucGFja2VkTGVuZ3RoLGE0PXN0LnBhY2tlZExlbmd0aCsyLGY0PXN0LnBhY2tlZExlbmd0aCthLnBhY2tlZExlbmd0aCx1ND1hLnBhY2tlZExlbmd0aCsxLENyPXttb2RlbE1hdHJpeDpuZXcgc3QsYm91bmRpbmdWb2x1bWU6bmV3IEF0fTtoND1uZXcgYTtnUj1uZXcgYSxBUj1uZXcgc3Q7YjQ9UWUoQTQpfSk7dmFyIFp5PXt9O2RlKFp5LHtkZWZhdWx0OigpPT5SNH0pO2Z1bmN0aW9uIE80KHQpe3Q9bmV3IEZsb2F0NjRBcnJheSh0KTtsZXQgZT0wO3pkLm1pbj10W2UrK10semQubWF4PXRbZSsrXSxOdC51bnBhY2sodCxlLGJSKSxlKz1OdC5wYWNrZWRMZW5ndGgsJC51bnBhY2sodCxlLFRSKX1mdW5jdGlvbiBFNCh0LGUpe2xldCBuPW5ldyBVaW50MTZBcnJheSh0LnBvc2l0aW9ucyk7TzQodC5wYWNrZWRCdWZmZXIpO2xldCBvPWJSLHI9VFIsaT16ZC5taW4scz16ZC5tYXgsZj1uLmxlbmd0aC8zLHU9bi5zdWJhcnJheSgwLGYpLGM9bi5zdWJhcnJheShmLDIqZiksbD1uLnN1YmFycmF5KDIqZiwzKmYpO25uLnppZ1phZ0RlbHRhRGVjb2RlKHUsYyxsKTtsZXQgcD1uZXcgRmxvYXQ2NEFycmF5KG4ubGVuZ3RoKTtmb3IobGV0IGQ9MDtkPGY7KytkKXtsZXQgbT11W2RdLF89Y1tkXSxnPWxbZF0sYj1NLmxlcnAoby53ZXN0LG8uZWFzdCxtLyR5KSxUPU0ubGVycChvLnNvdXRoLG8ubm9ydGgsXy8keSksTz1NLmxlcnAoaSxzLGcvJHkpLEU9Y3QuZnJvbVJhZGlhbnMoYixULE8sVDQpLHc9ci5jYXJ0b2dyYXBoaWNUb0NhcnRlc2lhbihFLHc0KTthLnBhY2sodyxwLGQqMyl9cmV0dXJuIGUucHVzaChwLmJ1ZmZlcikse3Bvc2l0aW9uczpwLmJ1ZmZlcn19dmFyICR5LFQ0LHc0LGJSLFRSLHpkLFI0LFF5PVooKCk9PnthcygpO0Z0KCk7SWUoKTtadCgpO1d0KCk7d24oKTtzbygpOyR5PTMyNzY3LFQ0PW5ldyBjdCx3ND1uZXcgYSxiUj1uZXcgTnQsVFI9bmV3ICQsemQ9e21pbjp2b2lkIDAsbWF4OnZvaWQgMH07UjQ9UWUoRTQpfSk7dmFyIEp5PXt9O2RlKEp5LHtkZWZhdWx0OigpPT5ENH0pO2Z1bmN0aW9uIFM0KHQpe2xldCBlPW5ldyBGbG9hdDY0QXJyYXkodCksbj0wO0ZhLmluZGV4Qnl0ZXNQZXJFbGVtZW50PWVbbisrXSxGYS5taW49ZVtuKytdLEZhLm1heD1lW24rK10sYS51bnBhY2soZSxuLFJSKSxuKz1hLnBhY2tlZExlbmd0aCwkLnVucGFjayhlLG4sU1IpLG4rPSQucGFja2VkTGVuZ3RoLE50LnVucGFjayhlLG4sQ1IpfWZ1bmN0aW9uIEM0KHQpe2xldCBlPXQubGVuZ3RoLG49MDtmb3IobGV0IG89MDtvPGU7KytvKW4rPW9lLnBhY2tlZExlbmd0aCszK3Rbb10uYmF0Y2hJZHMubGVuZ3RoO3JldHVybiBufWZ1bmN0aW9uIHg0KHQsZSxuKXtsZXQgbz1lLmxlbmd0aCxyPTIrbypTby5wYWNrZWRMZW5ndGgrMStDNChuKSxpPW5ldyBGbG9hdDY0QXJyYXkocikscz0wO2lbcysrXT10LGlbcysrXT1vO2ZvcihsZXQgdT0wO3U8bzsrK3UpU28ucGFjayhlW3VdLGkscykscys9U28ucGFja2VkTGVuZ3RoO2xldCBmPW4ubGVuZ3RoO2lbcysrXT1mO2ZvcihsZXQgdT0wO3U8ZjsrK3Upe2xldCBjPW5bdV07b2UucGFjayhjLmNvbG9yLGkscykscys9b2UucGFja2VkTGVuZ3RoLGlbcysrXT1jLm9mZnNldCxpW3MrK109Yy5jb3VudDtsZXQgbD1jLmJhdGNoSWRzLHA9bC5sZW5ndGg7aVtzKytdPXA7Zm9yKGxldCBkPTA7ZDxwOysrZClpW3MrK109bFtkXX1yZXR1cm4gaX1mdW5jdGlvbiBMNCh0LGUpe1M0KHQucGFja2VkQnVmZmVyKTtsZXQgbjtGYS5pbmRleEJ5dGVzUGVyRWxlbWVudD09PTI/bj1uZXcgVWludDE2QXJyYXkodC5pbmRpY2VzKTpuPW5ldyBVaW50MzJBcnJheSh0LmluZGljZXMpO2xldCByPW5ldyBVaW50MTZBcnJheSh0LnBvc2l0aW9ucyksaT1uZXcgVWludDMyQXJyYXkodC5jb3VudHMpLHM9bmV3IFVpbnQzMkFycmF5KHQuaW5kZXhDb3VudHMpLGY9bmV3IFVpbnQzMkFycmF5KHQuYmF0Y2hJZHMpLHU9bmV3IFVpbnQzMkFycmF5KHQuYmF0Y2hUYWJsZUNvbG9ycyksYz1uZXcgQXJyYXkoaS5sZW5ndGgpLGw9UlIscD1TUixkPUNSLG09RmEubWluLF89RmEubWF4LGc9dC5taW5pbXVtSGVpZ2h0cyxiPXQubWF4aW11bUhlaWdodHM7aChnKSYmaChiKSYmKGc9bmV3IEZsb2F0MzJBcnJheShnKSxiPW5ldyBGbG9hdDMyQXJyYXkoYikpO2xldCBULE8sRSx3PXIubGVuZ3RoLzIsQz1yLnN1YmFycmF5KDAsdyksTj1yLnN1YmFycmF5KHcsMip3KTtubi56aWdaYWdEZWx0YURlY29kZShDLE4pO2xldCBJPW5ldyBGbG9hdDY0QXJyYXkodyozKTtmb3IoVD0wO1Q8dzsrK1Qpe2xldCBydD1DW1RdLFB0PU5bVF0sZ3Q9TS5sZXJwKGQud2VzdCxkLmVhc3QscnQvd1IpLEN0PU0ubGVycChkLnNvdXRoLGQubm9ydGgsUHQvd1IpLG10PWN0LmZyb21SYWRpYW5zKGd0LEN0LDAsRVIpLHV0PXAuY2FydG9ncmFwaGljVG9DYXJ0ZXNpYW4obXQsT1IpO2EucGFjayh1dCxJLFQqMyl9bGV0IEQ9aS5sZW5ndGgsdj1uZXcgQXJyYXkoRCksTD1uZXcgQXJyYXkoRCksVT0wLEE9MDtmb3IoVD0wO1Q8RDsrK1QpdltUXT1VLExbVF09QSxVKz1pW1RdLEErPXNbVF07bGV0IFM9bmV3IEZsb2F0MzJBcnJheSh3KjMqMiksUD1uZXcgVWludDE2QXJyYXkodyoyKSxGPW5ldyBVaW50MzJBcnJheShMLmxlbmd0aCksaj1uZXcgVWludDMyQXJyYXkocy5sZW5ndGgpLEg9W10saz17fTtmb3IoVD0wO1Q8RDsrK1QpRT11W1RdLGgoa1tFXSk/KGtbRV0ucG9zaXRpb25MZW5ndGgrPWlbVF0sa1tFXS5pbmRleExlbmd0aCs9c1tUXSxrW0VdLmJhdGNoSWRzLnB1c2goVCkpOmtbRV09e3Bvc2l0aW9uTGVuZ3RoOmlbVF0saW5kZXhMZW5ndGg6c1tUXSxvZmZzZXQ6MCxpbmRleE9mZnNldDowLGJhdGNoSWRzOltUXX07bGV0IEssWD0wLFI9MDtmb3IoRSBpbiBrKWlmKGsuaGFzT3duUHJvcGVydHkoRSkpe0s9a1tFXSxLLm9mZnNldD1YLEsuaW5kZXhPZmZzZXQ9UjtsZXQgcnQ9Sy5wb3NpdGlvbkxlbmd0aCoyLFB0PUsuaW5kZXhMZW5ndGgqMitLLnBvc2l0aW9uTGVuZ3RoKjY7WCs9cnQsUis9UHQsSy5pbmRleExlbmd0aD1QdH1sZXQgb3Q9W107Zm9yKEUgaW4gaylrLmhhc093blByb3BlcnR5KEUpJiYoSz1rW0VdLG90LnB1c2goe2NvbG9yOm9lLmZyb21SZ2JhKHBhcnNlSW50KEUpKSxvZmZzZXQ6Sy5pbmRleE9mZnNldCxjb3VudDpLLmluZGV4TGVuZ3RoLGJhdGNoSWRzOksuYmF0Y2hJZHN9KSk7Zm9yKFQ9MDtUPEQ7KytUKXtFPXVbVF0sSz1rW0VdO2xldCBydD1LLm9mZnNldCxQdD1ydCozLGd0PXJ0LEN0PXZbVF0sbXQ9aVtUXSx1dD1mW1RdLHZ0PW0senQ9XztoKGcpJiZoKGIpJiYodnQ9Z1tUXSx6dD1iW1RdKTtsZXQgbWU9TnVtYmVyLlBPU0lUSVZFX0lORklOSVRZLGNlPU51bWJlci5ORUdBVElWRV9JTkZJTklUWSxwZT1OdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFksdWU9TnVtYmVyLk5FR0FUSVZFX0lORklOSVRZO2ZvcihPPTA7TzxtdDsrK08pe2xldCBnZT1hLnVucGFjayhJLEN0KjMrTyozLE9SKTtwLnNjYWxlVG9HZW9kZXRpY1N1cmZhY2UoZ2UsZ2UpO2xldCBFZT1wLmNhcnRlc2lhblRvQ2FydG9ncmFwaGljKGdlLEVSKSx1bj1FZS5sYXRpdHVkZSxrZT1FZS5sb25naXR1ZGU7bWU9TWF0aC5taW4odW4sbWUpLGNlPU1hdGgubWF4KHVuLGNlKSxwZT1NYXRoLm1pbihrZSxwZSksdWU9TWF0aC5tYXgoa2UsdWUpO2xldCBiZT1wLmdlb2RldGljU3VyZmFjZU5vcm1hbChnZSxQNCksbG49YS5tdWx0aXBseUJ5U2NhbGFyKGJlLHZ0LE00KSxwbj1hLmFkZChnZSxsbixONCk7bG49YS5tdWx0aXBseUJ5U2NhbGFyKGJlLHp0LGxuKTtsZXQgRW49YS5hZGQoZ2UsbG4sSTQpO2Euc3VidHJhY3QoRW4sbCxFbiksYS5zdWJ0cmFjdChwbixsLHBuKSxhLnBhY2soRW4sUyxQdCksYS5wYWNrKHBuLFMsUHQrMyksUFtndF09dXQsUFtndCsxXT11dCxQdCs9NixndCs9Mn1kPXY0LGQud2VzdD1wZSxkLmVhc3Q9dWUsZC5zb3V0aD1tZSxkLm5vcnRoPWNlLGNbVF09U28uZnJvbVJlY3RhbmdsZShkLG0sXyxwKTtsZXQgUXQ9Sy5pbmRleE9mZnNldCxKdD1MW1RdLE5lPXNbVF07Zm9yKEZbVF09UXQsTz0wO088TmU7Tys9Myl7bGV0IGdlPW5bSnQrT10tQ3QsRWU9bltKdCtPKzFdLUN0LHVuPW5bSnQrTysyXS1DdDtIW1F0KytdPWdlKjIrcnQsSFtRdCsrXT1FZSoyK3J0LEhbUXQrK109dW4qMitydCxIW1F0KytdPXVuKjIrMStydCxIW1F0KytdPUVlKjIrMStydCxIW1F0KytdPWdlKjIrMStydH1mb3IoTz0wO088bXQ7KytPKXtsZXQgZ2U9TyxFZT0oTysxKSVtdDtIW1F0KytdPWdlKjIrMStydCxIW1F0KytdPUVlKjIrcnQsSFtRdCsrXT1nZSoyK3J0LEhbUXQrK109Z2UqMisxK3J0LEhbUXQrK109RWUqMisxK3J0LEhbUXQrK109RWUqMitydH1LLm9mZnNldCs9bXQqMixLLmluZGV4T2Zmc2V0PVF0LGpbVF09UXQtRltUXX1IPUR0LmNyZWF0ZVR5cGVkQXJyYXkoUy5sZW5ndGgvMyxIKTtsZXQgYXQ9b3QubGVuZ3RoO2ZvcihsZXQgcnQ9MDtydDxhdDsrK3J0KXtsZXQgUHQ9b3RbcnRdLmJhdGNoSWRzLGd0PTAsQ3Q9UHQubGVuZ3RoO2ZvcihsZXQgbXQ9MDttdDxDdDsrK210KWd0Kz1qW1B0W210XV07b3RbcnRdLmNvdW50PWd0fWxldCBwdD1ILkJZVEVTX1BFUl9FTEVNRU5UPT09Mj9EdC5VTlNJR05FRF9TSE9SVDpEdC5VTlNJR05FRF9JTlQseXQ9eDQocHQsYyxvdCk7cmV0dXJuIGUucHVzaChTLmJ1ZmZlcixILmJ1ZmZlcixGLmJ1ZmZlcixqLmJ1ZmZlcixQLmJ1ZmZlcix5dC5idWZmZXIpLHtwb3NpdGlvbnM6Uy5idWZmZXIsaW5kaWNlczpILmJ1ZmZlcixpbmRleE9mZnNldHM6Ri5idWZmZXIsaW5kZXhDb3VudHM6ai5idWZmZXIsYmF0Y2hJZHM6UC5idWZmZXIscGFja2VkQnVmZmVyOnl0LmJ1ZmZlcn19dmFyIFJSLFNSLENSLEZhLHdSLE9SLFA0LE00LE40LEk0LEVSLHY0LEQ0LHRnPVooKCk9PnthcygpO0Z0KCk7SWUoKTtQYSgpO2Z0KCk7WnQoKTskZSgpO1d0KCk7cGEoKTt3bigpO3NvKCk7UlI9bmV3IGEsU1I9bmV3ICQsQ1I9bmV3IE50LEZhPXttaW46dm9pZCAwLG1heDp2b2lkIDAsaW5kZXhCeXRlc1BlckVsZW1lbnQ6dm9pZCAwfTt3Uj0zMjc2NyxPUj1uZXcgYSxQND1uZXcgYSxNND1uZXcgYSxOND1uZXcgYSxJND1uZXcgYSxFUj1uZXcgY3QsdjQ9bmV3IE50O0Q0PVFlKEw0KX0pO2Z1bmN0aW9uIFU0KHQsZSxuLG8scil7bGV0IGk9dC5sZW5ndGgvMyxzPXQuc3ViYXJyYXkoMCxpKSxmPXQuc3ViYXJyYXkoaSwyKmkpLHU9dC5zdWJhcnJheSgyKmksMyppKTtubi56aWdaYWdEZWx0YURlY29kZShzLGYsdSk7bGV0IGM9bmV3IEZsb2F0NjRBcnJheSh0Lmxlbmd0aCk7Zm9yKGxldCBsPTA7bDxpOysrbCl7bGV0IHA9c1tsXSxkPWZbbF0sbT11W2xdLF89TS5sZXJwKGUud2VzdCxlLmVhc3QscC9lZyksZz1NLmxlcnAoZS5zb3V0aCxlLm5vcnRoLGQvZWcpLGI9TS5sZXJwKG4sbyxtL2VnKSxUPWN0LmZyb21SYWRpYW5zKF8sZyxiLEY0KSxPPXIuY2FydG9ncmFwaGljVG9DYXJ0ZXNpYW4oVCxCNCk7YS5wYWNrKE8sYyxsKjMpfXJldHVybiBjfXZhciBlZyxGNCxCNCx4UixQUj1aKCgpPT57YXMoKTtGdCgpO0llKCk7V3QoKTtlZz0zMjc2NyxGND1uZXcgY3QsQjQ9bmV3IGE7eFI9VTR9KTt2YXIgbmc9e307ZGUobmcse2RlZmF1bHQ6KCk9Pmo0fSk7ZnVuY3Rpb24gVjQodCl7dD1uZXcgRmxvYXQ2NEFycmF5KHQpO2xldCBlPTA7amQubWluPXRbZSsrXSxqZC5tYXg9dFtlKytdLE50LnVucGFjayh0LGUsTFIpLGUrPU50LnBhY2tlZExlbmd0aCwkLnVucGFjayh0LGUsRFIpLGUrPSQucGFja2VkTGVuZ3RoLGEudW5wYWNrKHQsZSxGUil9ZnVuY3Rpb24gazQodCl7bGV0IGU9dC5sZW5ndGgsbj1uZXcgVWludDMyQXJyYXkoZSsxKSxvPTA7Zm9yKGxldCByPTA7cjxlOysrciluW3JdPW8sbys9dFtyXTtyZXR1cm4gbltlXT1vLG59ZnVuY3Rpb24gejQodCxlKXtsZXQgbj1uZXcgVWludDE2QXJyYXkodC5wb3NpdGlvbnMpLG89bmV3IFVpbnQxNkFycmF5KHQud2lkdGhzKSxyPW5ldyBVaW50MzJBcnJheSh0LmNvdW50cyksaT1uZXcgVWludDE2QXJyYXkodC5iYXRjaElkcyk7VjQodC5wYWNrZWRCdWZmZXIpO2xldCBzPUxSLGY9RFIsdT1GUixjPWpkLm1pbixsPWpkLm1heCxwPXhSKG4scyxjLGwsZiksZD1wLmxlbmd0aC8zLG09ZCo0LTQsXz1uZXcgRmxvYXQzMkFycmF5KG0qMyksZz1uZXcgRmxvYXQzMkFycmF5KG0qMyksYj1uZXcgRmxvYXQzMkFycmF5KG0qMyksVD1uZXcgRmxvYXQzMkFycmF5KG0qMiksTz1uZXcgVWludDE2QXJyYXkobSksRT0wLHc9MCxDPTAsTixJPTAsRD1yLmxlbmd0aDtmb3IoTj0wO048RDsrK04pe2xldCBTPXJbTl0sUD1vW05dLEY9aVtOXTtmb3IobGV0IGo9MDtqPFM7KytqKXtsZXQgSDtpZihqPT09MCl7bGV0IG90PWEudW5wYWNrKHAsSSozLE1SKSxhdD1hLnVucGFjayhwLChJKzEpKjMsTlIpO0g9YS5zdWJ0cmFjdChvdCxhdCxJUiksYS5hZGQob3QsSCxIKX1lbHNlIEg9YS51bnBhY2socCwoSStqLTEpKjMsSVIpO2xldCBrPWEudW5wYWNrKHAsKEkraikqMyxHNCksSztpZihqPT09Uy0xKXtsZXQgb3Q9YS51bnBhY2socCwoSStTLTEpKjMsTVIpLGF0PWEudW5wYWNrKHAsKEkrUy0yKSozLE5SKTtLPWEuc3VidHJhY3Qob3QsYXQsdlIpLGEuYWRkKG90LEssSyl9ZWxzZSBLPWEudW5wYWNrKHAsKEkraisxKSozLHZSKTthLnN1YnRyYWN0KEgsdSxIKSxhLnN1YnRyYWN0KGssdSxrKSxhLnN1YnRyYWN0KEssdSxLKTtsZXQgWD1qPT09MD8yOjAsUj1qPT09Uy0xPzI6NDtmb3IobGV0IG90PVg7b3Q8UjsrK290KXthLnBhY2soayxfLEUpLGEucGFjayhILGcsRSksYS5wYWNrKEssYixFKSxFKz0zO2xldCBhdD1vdC0yPDA/LTE6MTtUW3crK109Mioob3QlMiktMSxUW3crK109YXQqUCxPW0MrK109Rn19SSs9U31sZXQgdj1EdC5jcmVhdGVUeXBlZEFycmF5KG0sZCo2LTYpLEw9MCxVPTA7Zm9yKEQ9ZC0xLE49MDtOPEQ7KytOKXZbVSsrXT1MLHZbVSsrXT1MKzIsdltVKytdPUwrMSx2W1UrK109TCsxLHZbVSsrXT1MKzIsdltVKytdPUwrMyxMKz00O2UucHVzaChfLmJ1ZmZlcixnLmJ1ZmZlcixiLmJ1ZmZlciksZS5wdXNoKFQuYnVmZmVyLE8uYnVmZmVyLHYuYnVmZmVyKTtsZXQgQT17aW5kZXhEYXRhdHlwZTp2LkJZVEVTX1BFUl9FTEVNRU5UPT09Mj9EdC5VTlNJR05FRF9TSE9SVDpEdC5VTlNJR05FRF9JTlQsY3VycmVudFBvc2l0aW9uczpfLmJ1ZmZlcixwcmV2aW91c1Bvc2l0aW9uczpnLmJ1ZmZlcixuZXh0UG9zaXRpb25zOmIuYnVmZmVyLGV4cGFuZEFuZFdpZHRoOlQuYnVmZmVyLGJhdGNoSWRzOk8uYnVmZmVyLGluZGljZXM6di5idWZmZXJ9O2lmKHQua2VlcERlY29kZWRQb3NpdGlvbnMpe2xldCBTPWs0KHIpO2UucHVzaChwLmJ1ZmZlcixTLmJ1ZmZlciksQT1fcihBLHtkZWNvZGVkUG9zaXRpb25zOnAuYnVmZmVyLGRlY29kZWRQb3NpdGlvbk9mZnNldHM6Uy5idWZmZXJ9KX1yZXR1cm4gQX12YXIgTFIsRFIsRlIsamQsTVIsTlIsSVIsRzQsdlIsajQsb2c9WigoKT0+e0Z0KCk7cnAoKTtQUigpO1p0KCk7JGUoKTt3bigpO3NvKCk7TFI9bmV3IE50LERSPW5ldyAkLEZSPW5ldyBhLGpkPXttaW46dm9pZCAwLG1heDp2b2lkIDB9O01SPW5ldyBhLE5SPW5ldyBhLElSPW5ldyBhLEc0PW5ldyBhLHZSPW5ldyBhO2o0PVFlKHo0KX0pO2Z1bmN0aW9uIGhpKHQsZSl7eS50eXBlT2Yub2JqZWN0KCJlbGxpcHNvaWQiLHQpLHRoaXMuX2VsbGlwc29pZD10LHRoaXMuX2NhbWVyYVBvc2l0aW9uPW5ldyBhLHRoaXMuX2NhbWVyYVBvc2l0aW9uSW5TY2FsZWRTcGFjZT1uZXcgYSx0aGlzLl9kaXN0YW5jZVRvTGltYkluU2NhbGVkU3BhY2VTcXVhcmVkPTAsaChlKSYmKHRoaXMuY2FtZXJhUG9zaXRpb249ZSl9ZnVuY3Rpb24gVlIodCxlLG4pe2lmKGgoZSkmJmU8MCYmdC5taW5pbXVtUmFkaXVzPi1lKXtsZXQgbz1hLmZyb21FbGVtZW50cyh0LnJhZGlpLngrZSx0LnJhZGlpLnkrZSx0LnJhZGlpLnorZSxLNCk7dD0kLmZyb21DYXJ0ZXNpYW4zKG8sbil9cmV0dXJuIHR9ZnVuY3Rpb24ga1IodCxlLG4sbyl7eS50eXBlT2Yub2JqZWN0KCJkaXJlY3Rpb25Ub1BvaW50IixlKSx5LmRlZmluZWQoInBvc2l0aW9ucyIsbiksaChvKXx8KG89bmV3IGEpO2xldCByPUhSKHQsZSksaT0wO2ZvcihsZXQgcz0wLGY9bi5sZW5ndGg7czxmOysrcyl7bGV0IHU9bltzXSxjPXpSKHQsdSxyKTtpZihjPDApcmV0dXJuO2k9TWF0aC5tYXgoaSxjKX1yZXR1cm4galIocixpLG8pfWZ1bmN0aW9uIEdSKHQsZSxuLG8scixpKXt5LnR5cGVPZi5vYmplY3QoImRpcmVjdGlvblRvUG9pbnQiLGUpLHkuZGVmaW5lZCgidmVydGljZXMiLG4pLHkudHlwZU9mLm51bWJlcigic3RyaWRlIixvKSxoKGkpfHwoaT1uZXcgYSksbz14KG8sMykscj14KHIsYS5aRVJPKTtsZXQgcz1IUih0LGUpLGY9MDtmb3IobGV0IHU9MCxjPW4ubGVuZ3RoO3U8Yzt1Kz1vKXtIZC54PW5bdV0rci54LEhkLnk9blt1KzFdK3IueSxIZC56PW5bdSsyXStyLno7bGV0IGw9elIodCxIZCxzKTtpZihsPDApcmV0dXJuO2Y9TWF0aC5tYXgoZixsKX1yZXR1cm4galIocyxmLGkpfWZ1bmN0aW9uIGlnKHQsZSxuKXtsZXQgbz1lLHI9bixpPWEuc3VidHJhY3QodCxvLEJSKSxzPS1hLmRvdChpLG8pO3JldHVybiEocjwwP3M+MDpzPnImJnMqcy9hLm1hZ25pdHVkZVNxdWFyZWQoaSk+cil9ZnVuY3Rpb24gelIodCxlLG4pe2xldCBvPXQudHJhbnNmb3JtUG9zaXRpb25Ub1NjYWxlZFNwYWNlKGUsVzQpLHI9YS5tYWduaXR1ZGVTcXVhcmVkKG8pLGk9TWF0aC5zcXJ0KHIpLHM9YS5kaXZpZGVCeVNjYWxhcihvLGksWDQpO3I9TWF0aC5tYXgoMSxyKSxpPU1hdGgubWF4KDEsaSk7bGV0IGY9YS5kb3QocyxuKSx1PWEubWFnbml0dWRlKGEuY3Jvc3MocyxuLHMpKSxjPTEvaSxsPU1hdGguc3FydChyLTEpKmM7cmV0dXJuIDEvKGYqYy11KmwpfWZ1bmN0aW9uIGpSKHQsZSxuKXtpZighKGU8PTB8fGU9PT0xLzB8fGUhPT1lKSlyZXR1cm4gYS5tdWx0aXBseUJ5U2NhbGFyKHQsZSxuKX1mdW5jdGlvbiBIUih0LGUpe3JldHVybiBhLmVxdWFscyhlLGEuWkVSTyk/ZToodC50cmFuc2Zvcm1Qb3NpdGlvblRvU2NhbGVkU3BhY2UoZSxyZyksYS5ub3JtYWxpemUocmcscmcpKX12YXIgQlIsSDQsVVIscTQsSzQsSGQsVzQsWDQscmcseHMsc3U9WigoKT0+e3ZlKCk7RnQoKTtYdCgpO0l0KCk7ZnQoKTtadCgpO3duKCk7T2JqZWN0LmRlZmluZVByb3BlcnRpZXMoaGkucHJvdG90eXBlLHtlbGxpcHNvaWQ6e2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9lbGxpcHNvaWR9fSxjYW1lcmFQb3NpdGlvbjp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2NhbWVyYVBvc2l0aW9ufSxzZXQ6ZnVuY3Rpb24odCl7bGV0IG49dGhpcy5fZWxsaXBzb2lkLnRyYW5zZm9ybVBvc2l0aW9uVG9TY2FsZWRTcGFjZSh0LHRoaXMuX2NhbWVyYVBvc2l0aW9uSW5TY2FsZWRTcGFjZSksbz1hLm1hZ25pdHVkZVNxdWFyZWQobiktMTthLmNsb25lKHQsdGhpcy5fY2FtZXJhUG9zaXRpb24pLHRoaXMuX2NhbWVyYVBvc2l0aW9uSW5TY2FsZWRTcGFjZT1uLHRoaXMuX2Rpc3RhbmNlVG9MaW1iSW5TY2FsZWRTcGFjZVNxdWFyZWQ9b319fSk7QlI9bmV3IGE7aGkucHJvdG90eXBlLmlzUG9pbnRWaXNpYmxlPWZ1bmN0aW9uKHQpe2xldCBuPXRoaXMuX2VsbGlwc29pZC50cmFuc2Zvcm1Qb3NpdGlvblRvU2NhbGVkU3BhY2UodCxCUik7cmV0dXJuIGlnKG4sdGhpcy5fY2FtZXJhUG9zaXRpb25JblNjYWxlZFNwYWNlLHRoaXMuX2Rpc3RhbmNlVG9MaW1iSW5TY2FsZWRTcGFjZVNxdWFyZWQpfTtoaS5wcm90b3R5cGUuaXNTY2FsZWRTcGFjZVBvaW50VmlzaWJsZT1mdW5jdGlvbih0KXtyZXR1cm4gaWcodCx0aGlzLl9jYW1lcmFQb3NpdGlvbkluU2NhbGVkU3BhY2UsdGhpcy5fZGlzdGFuY2VUb0xpbWJJblNjYWxlZFNwYWNlU3F1YXJlZCl9O0g0PW5ldyBhO2hpLnByb3RvdHlwZS5pc1NjYWxlZFNwYWNlUG9pbnRWaXNpYmxlUG9zc2libHlVbmRlckVsbGlwc29pZD1mdW5jdGlvbih0LGUpe2xldCBuPXRoaXMuX2VsbGlwc29pZCxvLHI7cmV0dXJuIGgoZSkmJmU8MCYmbi5taW5pbXVtUmFkaXVzPi1lPyhyPUg0LHIueD10aGlzLl9jYW1lcmFQb3NpdGlvbi54LyhuLnJhZGlpLngrZSksci55PXRoaXMuX2NhbWVyYVBvc2l0aW9uLnkvKG4ucmFkaWkueStlKSxyLno9dGhpcy5fY2FtZXJhUG9zaXRpb24uei8obi5yYWRpaS56K2UpLG89ci54KnIueCtyLnkqci55K3IueipyLnotMSk6KHI9dGhpcy5fY2FtZXJhUG9zaXRpb25JblNjYWxlZFNwYWNlLG89dGhpcy5fZGlzdGFuY2VUb0xpbWJJblNjYWxlZFNwYWNlU3F1YXJlZCksaWcodCxyLG8pfTtoaS5wcm90b3R5cGUuY29tcHV0ZUhvcml6b25DdWxsaW5nUG9pbnQ9ZnVuY3Rpb24odCxlLG4pe3JldHVybiBrUih0aGlzLl9lbGxpcHNvaWQsdCxlLG4pfTtVUj0kLmNsb25lKCQuVU5JVF9TUEhFUkUpO2hpLnByb3RvdHlwZS5jb21wdXRlSG9yaXpvbkN1bGxpbmdQb2ludFBvc3NpYmx5VW5kZXJFbGxpcHNvaWQ9ZnVuY3Rpb24odCxlLG4sbyl7bGV0IHI9VlIodGhpcy5fZWxsaXBzb2lkLG4sVVIpO3JldHVybiBrUihyLHQsZSxvKX07aGkucHJvdG90eXBlLmNvbXB1dGVIb3Jpem9uQ3VsbGluZ1BvaW50RnJvbVZlcnRpY2VzPWZ1bmN0aW9uKHQsZSxuLG8scil7cmV0dXJuIEdSKHRoaXMuX2VsbGlwc29pZCx0LGUsbixvLHIpfTtoaS5wcm90b3R5cGUuY29tcHV0ZUhvcml6b25DdWxsaW5nUG9pbnRGcm9tVmVydGljZXNQb3NzaWJseVVuZGVyRWxsaXBzb2lkPWZ1bmN0aW9uKHQsZSxuLG8scixpKXtsZXQgcz1WUih0aGlzLl9lbGxpcHNvaWQscixVUik7cmV0dXJuIEdSKHMsdCxlLG4sbyxpKX07cTQ9W107aGkucHJvdG90eXBlLmNvbXB1dGVIb3Jpem9uQ3VsbGluZ1BvaW50RnJvbVJlY3RhbmdsZT1mdW5jdGlvbih0LGUsbil7eS50eXBlT2Yub2JqZWN0KCJyZWN0YW5nbGUiLHQpO2xldCBvPU50LnN1YnNhbXBsZSh0LGUsMCxxNCkscj1BdC5mcm9tUG9pbnRzKG8pO2lmKCEoYS5tYWduaXR1ZGUoci5jZW50ZXIpPC4xKmUubWluaW11bVJhZGl1cykpcmV0dXJuIHRoaXMuY29tcHV0ZUhvcml6b25DdWxsaW5nUG9pbnQoci5jZW50ZXIsbyxuKX07SzQ9bmV3IGE7SGQ9bmV3IGE7VzQ9bmV3IGEsWDQ9bmV3IGE7cmc9bmV3IGE7eHM9aGl9KTt2YXIgcWQsWTQscVIsS1I9WigoKT0+e0Z0KCk7SWUoKTtIdCgpO2Z0KCk7cWQ9e307cWQuZ2V0SGVpZ2h0PWZ1bmN0aW9uKHQsZSxuKXtpZighTnVtYmVyLmlzRmluaXRlKGUpKXRocm93IG5ldyBCKCJzY2FsZSBtdXN0IGJlIGEgZmluaXRlIG51bWJlci4iKTtpZighTnVtYmVyLmlzRmluaXRlKG4pKXRocm93IG5ldyBCKCJyZWxhdGl2ZUhlaWdodCBtdXN0IGJlIGEgZmluaXRlIG51bWJlci4iKTtyZXR1cm4odC1uKSplK259O1k0PW5ldyBjdDtxZC5nZXRQb3NpdGlvbj1mdW5jdGlvbih0LGUsbixvLHIpe2xldCBpPWUuY2FydGVzaWFuVG9DYXJ0b2dyYXBoaWModCxZNCk7aWYoIWgoaSkpcmV0dXJuIGEuY2xvbmUodCxyKTtsZXQgcz1xZC5nZXRIZWlnaHQoaS5oZWlnaHQsbixvKTtyZXR1cm4gYS5mcm9tUmFkaWFucyhpLmxvbmdpdHVkZSxpLmxhdGl0dWRlLHMsZSxyKX07cVI9cWR9KTt2YXIgJDQseHIsV1I9WigoKT0+eyQ0PXtOT05FOjAsQklUUzEyOjF9LHhyPU9iamVjdC5mcmVlemUoJDQpfSk7ZnVuY3Rpb24gTW8odCxlLG4sbyxyLGkscyxmLHUsYyl7bGV0IGw9eHIuTk9ORSxwLGQ7aWYoaChlKSYmaChuKSYmaChvKSYmaChyKSl7bGV0IG09ZS5taW5pbXVtLF89ZS5tYXhpbXVtLGc9YS5zdWJ0cmFjdChfLG0sWjQpLGI9by1uO01hdGgubWF4KGEubWF4aW11bUNvbXBvbmVudChnKSxiKTxKNC0xP2w9eHIuQklUUzEyOmw9eHIuTk9ORSxwPXN0LmludmVyc2VUcmFuc2Zvcm1hdGlvbihyLG5ldyBzdCk7bGV0IE89YS5uZWdhdGUobSx3Yyk7c3QubXVsdGlwbHkoc3QuZnJvbVRyYW5zbGF0aW9uKE8sS2QpLHAscCk7bGV0IEU9d2M7RS54PTEvZy54LEUueT0xL2cueSxFLno9MS9nLnosc3QubXVsdGlwbHkoc3QuZnJvbVNjYWxlKEUsS2QpLHAscCksZD1zdC5jbG9uZShyKSxzdC5zZXRUcmFuc2xhdGlvbihkLGEuWkVSTyxkKSxyPXN0LmNsb25lKHIsbmV3IHN0KTtsZXQgdz1zdC5mcm9tVHJhbnNsYXRpb24obSxLZCksQz1zdC5mcm9tU2NhbGUoZyxRNCksTj1zdC5tdWx0aXBseSh3LEMsS2QpO3N0Lm11bHRpcGx5KHIsTixyKSxzdC5tdWx0aXBseShkLE4sZCl9dGhpcy5xdWFudGl6YXRpb249bCx0aGlzLm1pbmltdW1IZWlnaHQ9bix0aGlzLm1heGltdW1IZWlnaHQ9byx0aGlzLmNlbnRlcj1hLmNsb25lKHQpLHRoaXMudG9TY2FsZWRFTlU9cCx0aGlzLmZyb21TY2FsZWRFTlU9cix0aGlzLm1hdHJpeD1kLHRoaXMuaGFzVmVydGV4Tm9ybWFscz1pLHRoaXMuaGFzV2ViTWVyY2F0b3JUPXgocywhMSksdGhpcy5oYXNHZW9kZXRpY1N1cmZhY2VOb3JtYWxzPXgoZiwhMSksdGhpcy5leGFnZ2VyYXRpb249eCh1LDEpLHRoaXMuZXhhZ2dlcmF0aW9uUmVsYXRpdmVIZWlnaHQ9eChjLDApLHRoaXMuc3RyaWRlPTAsdGhpcy5fb2Zmc2V0R2VvZGV0aWNTdXJmYWNlTm9ybWFsPTAsdGhpcy5fb2Zmc2V0VmVydGV4Tm9ybWFsPTAsdGhpcy5fY2FsY3VsYXRlU3RyaWRlQW5kT2Zmc2V0cygpfXZhciB3YyxaNCxQcixLZCxRNCxKNCx0VSxYUixXZCxYZCxQcyxjdT1aKCgpPT57YXMoKTtVZSgpO0Z0KCk7RmUoKTtJdCgpO2Z0KCk7V3QoKTtVbigpO0tSKCk7V1IoKTt3Yz1uZXcgYSxaND1uZXcgYSxQcj1uZXcgdHQsS2Q9bmV3IHN0LFE0PW5ldyBzdCxKND1NYXRoLnBvdygyLDEyKTtNby5wcm90b3R5cGUuZW5jb2RlPWZ1bmN0aW9uKHQsZSxuLG8scixpLHMsZil7bGV0IHU9by54LGM9by55O2lmKHRoaXMucXVhbnRpemF0aW9uPT09eHIuQklUUzEyKXtuPXN0Lm11bHRpcGx5QnlQb2ludCh0aGlzLnRvU2NhbGVkRU5VLG4sd2MpLG4ueD1NLmNsYW1wKG4ueCwwLDEpLG4ueT1NLmNsYW1wKG4ueSwwLDEpLG4uej1NLmNsYW1wKG4ueiwwLDEpO2xldCBsPXRoaXMubWF4aW11bUhlaWdodC10aGlzLm1pbmltdW1IZWlnaHQscD1NLmNsYW1wKChyLXRoaXMubWluaW11bUhlaWdodCkvbCwwLDEpO3R0LmZyb21FbGVtZW50cyhuLngsbi55LFByKTtsZXQgZD1ubi5jb21wcmVzc1RleHR1cmVDb29yZGluYXRlcyhQcik7dHQuZnJvbUVsZW1lbnRzKG4ueixwLFByKTtsZXQgbT1ubi5jb21wcmVzc1RleHR1cmVDb29yZGluYXRlcyhQcik7dHQuZnJvbUVsZW1lbnRzKHUsYyxQcik7bGV0IF89bm4uY29tcHJlc3NUZXh0dXJlQ29vcmRpbmF0ZXMoUHIpO2lmKHRbZSsrXT1kLHRbZSsrXT1tLHRbZSsrXT1fLHRoaXMuaGFzV2ViTWVyY2F0b3JUKXt0dC5mcm9tRWxlbWVudHMocywwLFByKTtsZXQgZz1ubi5jb21wcmVzc1RleHR1cmVDb29yZGluYXRlcyhQcik7dFtlKytdPWd9fWVsc2UgYS5zdWJ0cmFjdChuLHRoaXMuY2VudGVyLHdjKSx0W2UrK109d2MueCx0W2UrK109d2MueSx0W2UrK109d2Mueix0W2UrK109cix0W2UrK109dSx0W2UrK109Yyx0aGlzLmhhc1dlYk1lcmNhdG9yVCYmKHRbZSsrXT1zKTtyZXR1cm4gdGhpcy5oYXNWZXJ0ZXhOb3JtYWxzJiYodFtlKytdPW5uLm9jdFBhY2tGbG9hdChpKSksdGhpcy5oYXNHZW9kZXRpY1N1cmZhY2VOb3JtYWxzJiYodFtlKytdPWYueCx0W2UrK109Zi55LHRbZSsrXT1mLnopLGV9O3RVPW5ldyBhLFhSPW5ldyBhO01vLnByb3RvdHlwZS5hZGRHZW9kZXRpY1N1cmZhY2VOb3JtYWxzPWZ1bmN0aW9uKHQsZSxuKXtpZih0aGlzLmhhc0dlb2RldGljU3VyZmFjZU5vcm1hbHMpcmV0dXJuO2xldCBvPXRoaXMuc3RyaWRlLHI9dC5sZW5ndGgvbzt0aGlzLmhhc0dlb2RldGljU3VyZmFjZU5vcm1hbHM9ITAsdGhpcy5fY2FsY3VsYXRlU3RyaWRlQW5kT2Zmc2V0cygpO2xldCBpPXRoaXMuc3RyaWRlO2ZvcihsZXQgcz0wO3M8cjtzKyspe2ZvcihsZXQgbD0wO2w8bztsKyspe2xldCBwPXMqbytsLGQ9cyppK2w7ZVtkXT10W3BdfWxldCBmPXRoaXMuZGVjb2RlUG9zaXRpb24oZSxzLHRVKSx1PW4uZ2VvZGV0aWNTdXJmYWNlTm9ybWFsKGYsWFIpLGM9cyppK3RoaXMuX29mZnNldEdlb2RldGljU3VyZmFjZU5vcm1hbDtlW2NdPXUueCxlW2MrMV09dS55LGVbYysyXT11Lnp9fTtNby5wcm90b3R5cGUucmVtb3ZlR2VvZGV0aWNTdXJmYWNlTm9ybWFscz1mdW5jdGlvbih0LGUpe2lmKCF0aGlzLmhhc0dlb2RldGljU3VyZmFjZU5vcm1hbHMpcmV0dXJuO2xldCBuPXRoaXMuc3RyaWRlLG89dC5sZW5ndGgvbjt0aGlzLmhhc0dlb2RldGljU3VyZmFjZU5vcm1hbHM9ITEsdGhpcy5fY2FsY3VsYXRlU3RyaWRlQW5kT2Zmc2V0cygpO2xldCByPXRoaXMuc3RyaWRlO2ZvcihsZXQgaT0wO2k8bztpKyspZm9yKGxldCBzPTA7czxyO3MrKyl7bGV0IGY9aSpuK3MsdT1pKnIrcztlW3VdPXRbZl19fTtNby5wcm90b3R5cGUuZGVjb2RlUG9zaXRpb249ZnVuY3Rpb24odCxlLG4pe2lmKGgobil8fChuPW5ldyBhKSxlKj10aGlzLnN0cmlkZSx0aGlzLnF1YW50aXphdGlvbj09PXhyLkJJVFMxMil7bGV0IG89bm4uZGVjb21wcmVzc1RleHR1cmVDb29yZGluYXRlcyh0W2VdLFByKTtuLng9by54LG4ueT1vLnk7bGV0IHI9bm4uZGVjb21wcmVzc1RleHR1cmVDb29yZGluYXRlcyh0W2UrMV0sUHIpO3JldHVybiBuLno9ci54LHN0Lm11bHRpcGx5QnlQb2ludCh0aGlzLmZyb21TY2FsZWRFTlUsbixuKX1yZXR1cm4gbi54PXRbZV0sbi55PXRbZSsxXSxuLno9dFtlKzJdLGEuYWRkKG4sdGhpcy5jZW50ZXIsbil9O01vLnByb3RvdHlwZS5nZXRFeGFnZ2VyYXRlZFBvc2l0aW9uPWZ1bmN0aW9uKHQsZSxuKXtuPXRoaXMuZGVjb2RlUG9zaXRpb24odCxlLG4pO2xldCBvPXRoaXMuZXhhZ2dlcmF0aW9uLHI9dGhpcy5leGFnZ2VyYXRpb25SZWxhdGl2ZUhlaWdodDtpZihvIT09MSYmdGhpcy5oYXNHZW9kZXRpY1N1cmZhY2VOb3JtYWxzKXtsZXQgcz10aGlzLmRlY29kZUdlb2RldGljU3VyZmFjZU5vcm1hbCh0LGUsWFIpLGY9dGhpcy5kZWNvZGVIZWlnaHQodCxlKSx1PXFSLmdldEhlaWdodChmLG8sciktZjtuLngrPXMueCp1LG4ueSs9cy55KnUsbi56Kz1zLnoqdX1yZXR1cm4gbn07TW8ucHJvdG90eXBlLmRlY29kZVRleHR1cmVDb29yZGluYXRlcz1mdW5jdGlvbih0LGUsbil7cmV0dXJuIGgobil8fChuPW5ldyB0dCksZSo9dGhpcy5zdHJpZGUsdGhpcy5xdWFudGl6YXRpb249PT14ci5CSVRTMTI/bm4uZGVjb21wcmVzc1RleHR1cmVDb29yZGluYXRlcyh0W2UrMl0sbik6dHQuZnJvbUVsZW1lbnRzKHRbZSs0XSx0W2UrNV0sbil9O01vLnByb3RvdHlwZS5kZWNvZGVIZWlnaHQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZSo9dGhpcy5zdHJpZGUsdGhpcy5xdWFudGl6YXRpb249PT14ci5CSVRTMTI/bm4uZGVjb21wcmVzc1RleHR1cmVDb29yZGluYXRlcyh0W2UrMV0sUHIpLnkqKHRoaXMubWF4aW11bUhlaWdodC10aGlzLm1pbmltdW1IZWlnaHQpK3RoaXMubWluaW11bUhlaWdodDp0W2UrM119O01vLnByb3RvdHlwZS5kZWNvZGVXZWJNZXJjYXRvclQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZSo9dGhpcy5zdHJpZGUsdGhpcy5xdWFudGl6YXRpb249PT14ci5CSVRTMTI/bm4uZGVjb21wcmVzc1RleHR1cmVDb29yZGluYXRlcyh0W2UrM10sUHIpLng6dFtlKzZdfTtNby5wcm90b3R5cGUuZ2V0T2N0RW5jb2RlZE5vcm1hbD1mdW5jdGlvbih0LGUsbil7ZT1lKnRoaXMuc3RyaWRlK3RoaXMuX29mZnNldFZlcnRleE5vcm1hbDtsZXQgbz10W2VdLzI1NixyPU1hdGguZmxvb3IobyksaT0oby1yKSoyNTY7cmV0dXJuIHR0LmZyb21FbGVtZW50cyhyLGksbil9O01vLnByb3RvdHlwZS5kZWNvZGVHZW9kZXRpY1N1cmZhY2VOb3JtYWw9ZnVuY3Rpb24odCxlLG4pe3JldHVybiBlPWUqdGhpcy5zdHJpZGUrdGhpcy5fb2Zmc2V0R2VvZGV0aWNTdXJmYWNlTm9ybWFsLG4ueD10W2VdLG4ueT10W2UrMV0sbi56PXRbZSsyXSxufTtNby5wcm90b3R5cGUuX2NhbGN1bGF0ZVN0cmlkZUFuZE9mZnNldHM9ZnVuY3Rpb24oKXtsZXQgdD0wO3N3aXRjaCh0aGlzLnF1YW50aXphdGlvbil7Y2FzZSB4ci5CSVRTMTI6dCs9MzticmVhaztkZWZhdWx0OnQrPTZ9dGhpcy5oYXNXZWJNZXJjYXRvclQmJih0Kz0xKSx0aGlzLmhhc1ZlcnRleE5vcm1hbHMmJih0aGlzLl9vZmZzZXRWZXJ0ZXhOb3JtYWw9dCx0Kz0xKSx0aGlzLmhhc0dlb2RldGljU3VyZmFjZU5vcm1hbHMmJih0aGlzLl9vZmZzZXRHZW9kZXRpY1N1cmZhY2VOb3JtYWw9dCx0Kz0zKSx0aGlzLnN0cmlkZT10fTtXZD17cG9zaXRpb24zREFuZEhlaWdodDowLHRleHR1cmVDb29yZEFuZEVuY29kZWROb3JtYWxzOjEsZ2VvZGV0aWNTdXJmYWNlTm9ybWFsOjJ9LFhkPXtjb21wcmVzc2VkMDowLGNvbXByZXNzZWQxOjEsZ2VvZGV0aWNTdXJmYWNlTm9ybWFsOjJ9O01vLnByb3RvdHlwZS5nZXRBdHRyaWJ1dGVzPWZ1bmN0aW9uKHQpe2xldCBlPW50LkZMT0FULG49bnQuZ2V0U2l6ZUluQnl0ZXMoZSksbz10aGlzLnN0cmlkZSpuLHI9MCxpPVtdO2Z1bmN0aW9uIHMoZix1KXtpLnB1c2goe2luZGV4OmYsdmVydGV4QnVmZmVyOnQsY29tcG9uZW50RGF0YXR5cGU6ZSxjb21wb25lbnRzUGVyQXR0cmlidXRlOnUsb2Zmc2V0SW5CeXRlczpyLHN0cmlkZUluQnl0ZXM6b30pLHIrPXUqbn1pZih0aGlzLnF1YW50aXphdGlvbj09PXhyLk5PTkUpe3MoV2QucG9zaXRpb24zREFuZEhlaWdodCw0KTtsZXQgZj0yO2YrPXRoaXMuaGFzV2ViTWVyY2F0b3JUPzE6MCxmKz10aGlzLmhhc1ZlcnRleE5vcm1hbHM/MTowLHMoV2QudGV4dHVyZUNvb3JkQW5kRW5jb2RlZE5vcm1hbHMsZiksdGhpcy5oYXNHZW9kZXRpY1N1cmZhY2VOb3JtYWxzJiZzKFdkLmdlb2RldGljU3VyZmFjZU5vcm1hbCwzKX1lbHNle2xldCBmPXRoaXMuaGFzV2ViTWVyY2F0b3JUfHx0aGlzLmhhc1ZlcnRleE5vcm1hbHMsdT10aGlzLmhhc1dlYk1lcmNhdG9yVCYmdGhpcy5oYXNWZXJ0ZXhOb3JtYWxzO3MoWGQuY29tcHJlc3NlZDAsZj80OjMpLHUmJnMoWGQuY29tcHJlc3NlZDEsMSksdGhpcy5oYXNHZW9kZXRpY1N1cmZhY2VOb3JtYWxzJiZzKFhkLmdlb2RldGljU3VyZmFjZU5vcm1hbCwzKX1yZXR1cm4gaX07TW8ucHJvdG90eXBlLmdldEF0dHJpYnV0ZUxvY2F0aW9ucz1mdW5jdGlvbigpe3JldHVybiB0aGlzLnF1YW50aXphdGlvbj09PXhyLk5PTkU/V2Q6WGR9O01vLmNsb25lPWZ1bmN0aW9uKHQsZSl7aWYoaCh0KSlyZXR1cm4gaChlKXx8KGU9bmV3IE1vKSxlLnF1YW50aXphdGlvbj10LnF1YW50aXphdGlvbixlLm1pbmltdW1IZWlnaHQ9dC5taW5pbXVtSGVpZ2h0LGUubWF4aW11bUhlaWdodD10Lm1heGltdW1IZWlnaHQsZS5jZW50ZXI9YS5jbG9uZSh0LmNlbnRlciksZS50b1NjYWxlZEVOVT1zdC5jbG9uZSh0LnRvU2NhbGVkRU5VKSxlLmZyb21TY2FsZWRFTlU9c3QuY2xvbmUodC5mcm9tU2NhbGVkRU5VKSxlLm1hdHJpeD1zdC5jbG9uZSh0Lm1hdHJpeCksZS5oYXNWZXJ0ZXhOb3JtYWxzPXQuaGFzVmVydGV4Tm9ybWFscyxlLmhhc1dlYk1lcmNhdG9yVD10Lmhhc1dlYk1lcmNhdG9yVCxlLmhhc0dlb2RldGljU3VyZmFjZU5vcm1hbHM9dC5oYXNHZW9kZXRpY1N1cmZhY2VOb3JtYWxzLGUuZXhhZ2dlcmF0aW9uPXQuZXhhZ2dlcmF0aW9uLGUuZXhhZ2dlcmF0aW9uUmVsYXRpdmVIZWlnaHQ9dC5leGFnZ2VyYXRpb25SZWxhdGl2ZUhlaWdodCxlLl9jYWxjdWxhdGVTdHJpZGVBbmRPZmZzZXRzKCksZX07UHM9TW99KTt2YXIgY2c9e307ZGUoY2cse2RlZmF1bHQ6KCk9PmFVfSk7ZnVuY3Rpb24gYXUodCxlLG4pe249eChuLE0pO2xldCBvPXQubGVuZ3RoO2ZvcihsZXQgcj0wO3I8bzsrK3IpaWYobi5lcXVhbHNFcHNpbG9uKHRbcl0sZSxNLkVQU0lMT04xMikpcmV0dXJuIHI7cmV0dXJuLTF9ZnVuY3Rpb24gb1UodCxlKXt0LmVsbGlwc29pZD0kLmNsb25lKHQuZWxsaXBzb2lkKSx0LnJlY3RhbmdsZT1OdC5jbG9uZSh0LnJlY3RhbmdsZSk7bGV0IG49Y1UodC5idWZmZXIsdC5yZWxhdGl2ZVRvQ2VudGVyLHQuZWxsaXBzb2lkLHQucmVjdGFuZ2xlLHQubmF0aXZlUmVjdGFuZ2xlLHQuZXhhZ2dlcmF0aW9uLHQuZXhhZ2dlcmF0aW9uUmVsYXRpdmVIZWlnaHQsdC5za2lydEhlaWdodCx0LmluY2x1ZGVXZWJNZXJjYXRvclQsdC5uZWdhdGl2ZUFsdGl0dWRlRXhwb25lbnRCaWFzLHQubmVnYXRpdmVFbGV2YXRpb25UaHJlc2hvbGQpLG89bi52ZXJ0aWNlcztlLnB1c2goby5idWZmZXIpO2xldCByPW4uaW5kaWNlcztyZXR1cm4gZS5wdXNoKHIuYnVmZmVyKSx7dmVydGljZXM6by5idWZmZXIsaW5kaWNlczpyLmJ1ZmZlcixudW1iZXJPZkF0dHJpYnV0ZXM6bi5lbmNvZGluZy5zdHJpZGUsbWluaW11bUhlaWdodDpuLm1pbmltdW1IZWlnaHQsbWF4aW11bUhlaWdodDpuLm1heGltdW1IZWlnaHQsYm91bmRpbmdTcGhlcmUzRDpuLmJvdW5kaW5nU3BoZXJlM0Qsb3JpZW50ZWRCb3VuZGluZ0JveDpuLm9yaWVudGVkQm91bmRpbmdCb3gsb2NjbHVkZWVQb2ludEluU2NhbGVkU3BhY2U6bi5vY2NsdWRlZVBvaW50SW5TY2FsZWRTcGFjZSxlbmNvZGluZzpuLmVuY29kaW5nLHZlcnRleENvdW50V2l0aG91dFNraXJ0czpuLnZlcnRleENvdW50V2l0aG91dFNraXJ0cyxpbmRleENvdW50V2l0aG91dFNraXJ0czpuLmluZGV4Q291bnRXaXRob3V0U2tpcnRzLHdlc3RJbmRpY2VzU291dGhUb05vcnRoOm4ud2VzdEluZGljZXNTb3V0aFRvTm9ydGgsc291dGhJbmRpY2VzRWFzdFRvV2VzdDpuLnNvdXRoSW5kaWNlc0Vhc3RUb1dlc3QsZWFzdEluZGljZXNOb3J0aFRvU291dGg6bi5lYXN0SW5kaWNlc05vcnRoVG9Tb3V0aCxub3J0aEluZGljZXNXZXN0VG9FYXN0Om4ubm9ydGhJbmRpY2VzV2VzdFRvRWFzdH19ZnVuY3Rpb24gY1UodCxlLG4sbyxyLGkscyxmLHUsYyxsKXtsZXQgcCxkLG0sXyxnLGI7aChvKT8ocD1vLndlc3QsZD1vLnNvdXRoLG09by5lYXN0LF89by5ub3J0aCxnPW8ud2lkdGgsYj1vLmhlaWdodCk6KHA9TS50b1JhZGlhbnMoci53ZXN0KSxkPU0udG9SYWRpYW5zKHIuc291dGgpLG09TS50b1JhZGlhbnMoci5lYXN0KSxfPU0udG9SYWRpYW5zKHIubm9ydGgpLGc9TS50b1JhZGlhbnMoby53aWR0aCksYj1NLnRvUmFkaWFucyhvLmhlaWdodCkpO2xldCBUPVtkLF9dLE89W3AsbV0sRT1Yby5lYXN0Tm9ydGhVcFRvRml4ZWRGcmFtZShlLG4pLHc9c3QuaW52ZXJzZVRyYW5zZm9ybWF0aW9uKEUsc1UpLEMsTjt1JiYoQz1uby5nZW9kZXRpY0xhdGl0dWRlVG9NZXJjYXRvckFuZ2xlKGQpLE49MS8obm8uZ2VvZGV0aWNMYXRpdHVkZVRvTWVyY2F0b3JBbmdsZShfKS1DKSk7bGV0IEQ9aSE9PTEsdj1uZXcgRGF0YVZpZXcodCksTD1OdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFksVT1OdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFksQT1yVTtBLng9TnVtYmVyLlBPU0lUSVZFX0lORklOSVRZLEEueT1OdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFksQS56PU51bWJlci5QT1NJVElWRV9JTkZJTklUWTtsZXQgUz1pVTtTLng9TnVtYmVyLk5FR0FUSVZFX0lORklOSVRZLFMueT1OdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFksUy56PU51bWJlci5ORUdBVElWRV9JTkZJTklUWTtsZXQgUD0wLEY9MCxqPTAsSCxrO2ZvcihrPTA7azw0Oysrayl7bGV0IHJlPVA7SD12LmdldFVpbnQzMihyZSwhMCkscmUrPXNnO2xldCAkdD1NLnRvUmFkaWFucyh2LmdldEZsb2F0NjQocmUsITApKjE4MCk7cmUrPU9jLGF1KE8sJHQpPT09LTEmJk8ucHVzaCgkdCk7bGV0IEdlPU0udG9SYWRpYW5zKHYuZ2V0RmxvYXQ2NChyZSwhMCkqMTgwKTtyZSs9T2MsYXUoVCxHZSk9PT0tMSYmVC5wdXNoKEdlKSxyZSs9MipPYztsZXQgZG49di5nZXRJbnQzMihyZSwhMCk7cmUrPVlkLEYrPWRuLGRuPXYuZ2V0SW50MzIocmUsITApLGorPWRuKjMsUCs9SCtzZ31sZXQgSz1bXSxYPVtdLFI9bmV3IEFycmF5KEYpLG90PW5ldyBBcnJheShGKSxhdD1uZXcgQXJyYXkoRikscHQ9dT9uZXcgQXJyYXkoRik6W10seXQ9RD9uZXcgQXJyYXkoRik6W10scnQ9bmV3IEFycmF5KGopLFB0PVtdLGd0PVtdLEN0PVtdLG10PVtdLHV0PTAsdnQ9MDtmb3IoUD0wLGs9MDtrPDQ7KytrKXtIPXYuZ2V0VWludDMyKFAsITApLFArPXNnO2xldCByZT1QLCR0PU0udG9SYWRpYW5zKHYuZ2V0RmxvYXQ2NChQLCEwKSoxODApO1ArPU9jO2xldCBHZT1NLnRvUmFkaWFucyh2LmdldEZsb2F0NjQoUCwhMCkqMTgwKTtQKz1PYztsZXQgZG49TS50b1JhZGlhbnModi5nZXRGbG9hdDY0KFAsITApKjE4MCksc249ZG4qLjU7UCs9T2M7bGV0IG1uPU0udG9SYWRpYW5zKHYuZ2V0RmxvYXQ2NChQLCEwKSoxODApLGZvPW1uKi41O1ArPU9jO2xldCBIbj12LmdldEludDMyKFAsITApO1ArPVlkO2xldCBaZT12LmdldEludDMyKFAsITApO1ArPVlkLFArPVlkO2xldCBjbj1uZXcgQXJyYXkoSG4pO2ZvcihsZXQgaG49MDtobjxIbjsrK2huKXtsZXQgdW89JHQrdi5nZXRVaW50OChQKyspKmRuO05vLmxvbmdpdHVkZT11bztsZXQgcW49R2Urdi5nZXRVaW50OChQKyspKm1uO05vLmxhdGl0dWRlPXFuO2xldCBLbj12LmdldEZsb2F0MzIoUCwhMCk7aWYoUCs9blUsS24hPT0wJiZLbjxsJiYoS24qPS1NYXRoLnBvdygyLGMpKSxLbio9NjM3MTAxMCxOby5oZWlnaHQ9S24sYXUoTyx1bykhPT0tMXx8YXUoVCxxbikhPT0tMSl7bGV0IERuPWF1KEssTm8sY3QpO2lmKERuPT09LTEpSy5wdXNoKGN0LmNsb25lKE5vKSksWC5wdXNoKHV0KTtlbHNle2NuW2huXT1YW0RuXTtjb250aW51ZX19Y25baG5dPXV0LE1hdGguYWJzKHVvLXApPHNuP1B0LnB1c2goe2luZGV4OnV0LGNhcnRvZ3JhcGhpYzpjdC5jbG9uZShObyl9KTpNYXRoLmFicyh1by1tKTxzbj9DdC5wdXNoKHtpbmRleDp1dCxjYXJ0b2dyYXBoaWM6Y3QuY2xvbmUoTm8pfSk6TWF0aC5hYnMocW4tZCk8Zm8/Z3QucHVzaCh7aW5kZXg6dXQsY2FydG9ncmFwaGljOmN0LmNsb25lKE5vKX0pOk1hdGguYWJzKHFuLV8pPGZvJiZtdC5wdXNoKHtpbmRleDp1dCxjYXJ0b2dyYXBoaWM6Y3QuY2xvbmUoTm8pfSksTD1NYXRoLm1pbihLbixMKSxVPU1hdGgubWF4KEtuLFUpLGF0W3V0XT1LbjtsZXQgbG89bi5jYXJ0b2dyYXBoaWNUb0NhcnRlc2lhbihObyk7aWYoUlt1dF09bG8sdSYmKHB0W3V0XT0obm8uZ2VvZGV0aWNMYXRpdHVkZVRvTWVyY2F0b3JBbmdsZShxbiktQykqTiksRCl7bGV0IERuPW4uZ2VvZGV0aWNTdXJmYWNlTm9ybWFsKGxvKTt5dFt1dF09RG59c3QubXVsdGlwbHlCeVBvaW50KHcsbG8sQmEpLGEubWluaW11bUJ5Q29tcG9uZW50KEJhLEEsQSksYS5tYXhpbXVtQnlDb21wb25lbnQoQmEsUyxTKTtsZXQgemU9KHVvLXApLyhtLXApO3plPU0uY2xhbXAoemUsMCwxKTtsZXQgTGU9KHFuLWQpLyhfLWQpO0xlPU0uY2xhbXAoTGUsMCwxKSxvdFt1dF09bmV3IHR0KHplLExlKSwrK3V0fWxldCBLZT1aZSozO2ZvcihsZXQgaG49MDtobjxLZTsrK2huLCsrdnQpcnRbdnRdPWNuW3YuZ2V0VWludDE2KFAsITApXSxQKz1lVTtpZihIIT09UC1yZSl0aHJvdyBuZXcgQWUoIkludmFsaWQgdGVycmFpbiB0aWxlLiIpfVIubGVuZ3RoPXV0LG90Lmxlbmd0aD11dCxhdC5sZW5ndGg9dXQsdSYmKHB0Lmxlbmd0aD11dCksRCYmKHl0Lmxlbmd0aD11dCk7bGV0IHp0PXV0LG1lPXZ0LGNlPXtoTWluOkwsbGFzdEJvcmRlclBvaW50OnZvaWQgMCxza2lydEhlaWdodDpmLHRvRU5VOncsZWxsaXBzb2lkOm4sbWluaW11bTpBLG1heGltdW06U307UHQuc29ydChmdW5jdGlvbihyZSwkdCl7cmV0dXJuICR0LmNhcnRvZ3JhcGhpYy5sYXRpdHVkZS1yZS5jYXJ0b2dyYXBoaWMubGF0aXR1ZGV9KSxndC5zb3J0KGZ1bmN0aW9uKHJlLCR0KXtyZXR1cm4gcmUuY2FydG9ncmFwaGljLmxvbmdpdHVkZS0kdC5jYXJ0b2dyYXBoaWMubG9uZ2l0dWRlfSksQ3Quc29ydChmdW5jdGlvbihyZSwkdCl7cmV0dXJuIHJlLmNhcnRvZ3JhcGhpYy5sYXRpdHVkZS0kdC5jYXJ0b2dyYXBoaWMubGF0aXR1ZGV9KSxtdC5zb3J0KGZ1bmN0aW9uKHJlLCR0KXtyZXR1cm4gJHQuY2FydG9ncmFwaGljLmxvbmdpdHVkZS1yZS5jYXJ0b2dyYXBoaWMubG9uZ2l0dWRlfSk7bGV0IHBlPTFlLTU7aWYoJGQoUixhdCxvdCxwdCx5dCxydCxjZSxQdCwtcGUqZywhMCwtcGUqYiksJGQoUixhdCxvdCxwdCx5dCxydCxjZSxndCwtcGUqYiwhMSksJGQoUixhdCxvdCxwdCx5dCxydCxjZSxDdCxwZSpnLCEwLHBlKmIpLCRkKFIsYXQsb3QscHQseXQscnQsY2UsbXQscGUqYiwhMSksUHQubGVuZ3RoPjAmJm10Lmxlbmd0aD4wKXtsZXQgcmU9UHRbMF0uaW5kZXgsJHQ9enQsR2U9bXRbbXQubGVuZ3RoLTFdLmluZGV4LGRuPVIubGVuZ3RoLTE7cnQucHVzaChHZSxkbiwkdCwkdCxyZSxHZSl9Rj1SLmxlbmd0aDtsZXQgdWU9QXQuZnJvbVBvaW50cyhSKSxRdDtoKG8pJiYoUXQ9U28uZnJvbVJlY3RhbmdsZShvLEwsVSxuKSk7bGV0IE5lPW5ldyB4cyhuKS5jb21wdXRlSG9yaXpvbkN1bGxpbmdQb2ludFBvc3NpYmx5VW5kZXJFbGxpcHNvaWQoZSxSLEwpLGdlPW5ldyBEaShBLFMsZSksRWU9bmV3IFBzKGUsZ2UsY2UuaE1pbixVLEUsITEsdSxELGkscyksdW49bmV3IEZsb2F0MzJBcnJheShGKkVlLnN0cmlkZSksa2U9MDtmb3IobGV0IHJlPTA7cmU8RjsrK3JlKWtlPUVlLmVuY29kZSh1bixrZSxSW3JlXSxvdFtyZV0sYXRbcmVdLHZvaWQgMCxwdFtyZV0seXRbcmVdKTtsZXQgYmU9UHQubWFwKGZ1bmN0aW9uKHJlKXtyZXR1cm4gcmUuaW5kZXh9KS5yZXZlcnNlKCksbG49Z3QubWFwKGZ1bmN0aW9uKHJlKXtyZXR1cm4gcmUuaW5kZXh9KS5yZXZlcnNlKCkscG49Q3QubWFwKGZ1bmN0aW9uKHJlKXtyZXR1cm4gcmUuaW5kZXh9KS5yZXZlcnNlKCksRW49bXQubWFwKGZ1bmN0aW9uKHJlKXtyZXR1cm4gcmUuaW5kZXh9KS5yZXZlcnNlKCk7cmV0dXJuIGxuLnVuc2hpZnQocG5bcG4ubGVuZ3RoLTFdKSxsbi5wdXNoKGJlWzBdKSxFbi51bnNoaWZ0KGJlW2JlLmxlbmd0aC0xXSksRW4ucHVzaChwblswXSkse3ZlcnRpY2VzOnVuLGluZGljZXM6bmV3IFVpbnQxNkFycmF5KHJ0KSxtYXhpbXVtSGVpZ2h0OlUsbWluaW11bUhlaWdodDpMLGVuY29kaW5nOkVlLGJvdW5kaW5nU3BoZXJlM0Q6dWUsb3JpZW50ZWRCb3VuZGluZ0JveDpRdCxvY2NsdWRlZVBvaW50SW5TY2FsZWRTcGFjZTpOZSx2ZXJ0ZXhDb3VudFdpdGhvdXRTa2lydHM6enQsaW5kZXhDb3VudFdpdGhvdXRTa2lydHM6bWUsd2VzdEluZGljZXNTb3V0aFRvTm9ydGg6YmUsc291dGhJbmRpY2VzRWFzdFRvV2VzdDpsbixlYXN0SW5kaWNlc05vcnRoVG9Tb3V0aDpwbixub3J0aEluZGljZXNXZXN0VG9FYXN0OkVufX1mdW5jdGlvbiAkZCh0LGUsbixvLHIsaSxzLGYsdSxjLGwpe2xldCBwPWYubGVuZ3RoO2ZvcihsZXQgZD0wO2Q8cDsrK2Qpe2xldCBtPWZbZF0sXz1tLmNhcnRvZ3JhcGhpYyxnPW0uaW5kZXgsYj10Lmxlbmd0aCxUPV8ubG9uZ2l0dWRlLE89Xy5sYXRpdHVkZTtPPU0uY2xhbXAoTywtTS5QSV9PVkVSX1RXTyxNLlBJX09WRVJfVFdPKTtsZXQgRT1fLmhlaWdodC1zLnNraXJ0SGVpZ2h0O3MuaE1pbj1NYXRoLm1pbihzLmhNaW4sRSksY3QuZnJvbVJhZGlhbnMoVCxPLEUsTm8pLGMmJihOby5sb25naXR1ZGUrPXUpLGM/ZD09PXAtMT9Oby5sYXRpdHVkZSs9bDpkPT09MCYmKE5vLmxhdGl0dWRlLT1sKTpOby5sYXRpdHVkZSs9dTtsZXQgdz1zLmVsbGlwc29pZC5jYXJ0b2dyYXBoaWNUb0NhcnRlc2lhbihObyk7dC5wdXNoKHcpLGUucHVzaChFKSxuLnB1c2godHQuY2xvbmUobltnXSkpLG8ubGVuZ3RoPjAmJm8ucHVzaChvW2ddKSxyLmxlbmd0aD4wJiZyLnB1c2gocltnXSksc3QubXVsdGlwbHlCeVBvaW50KHMudG9FTlUsdyxCYSk7bGV0IEM9cy5taW5pbXVtLE49cy5tYXhpbXVtO2EubWluaW11bUJ5Q29tcG9uZW50KEJhLEMsQyksYS5tYXhpbXVtQnlDb21wb25lbnQoQmEsTixOKTtsZXQgST1zLmxhc3RCb3JkZXJQb2ludDtpZihoKEkpKXtsZXQgRD1JLmluZGV4O2kucHVzaChELGItMSxiLGIsZyxEKX1zLmxhc3RCb3JkZXJQb2ludD1tfX12YXIgZVUsWWQsc2csblUsT2MsTm8sQmEsclUsaVUsc1UsYVUsYWc9WigoKT0+e3hmKCk7dmUoKTtVZSgpO0Z0KCk7SWUoKTtJdCgpO2Z0KCk7WnQoKTtzdSgpO1d0KCk7VW4oKTtwYSgpO3duKCk7SnIoKTtjdSgpO2NzKCk7aWMoKTtzbygpO2VVPVVpbnQxNkFycmF5LkJZVEVTX1BFUl9FTEVNRU5ULFlkPUludDMyQXJyYXkuQllURVNfUEVSX0VMRU1FTlQsc2c9VWludDMyQXJyYXkuQllURVNfUEVSX0VMRU1FTlQsblU9RmxvYXQzMkFycmF5LkJZVEVTX1BFUl9FTEVNRU5ULE9jPUZsb2F0NjRBcnJheS5CWVRFU19QRVJfRUxFTUVOVDtObz1uZXcgY3QsQmE9bmV3IGEsclU9bmV3IGEsaVU9bmV3IGEsc1U9bmV3IHN0O2FVPVFlKG9VKX0pO3ZhciBmVSxZUiwkUj1aKCgpPT57ZlU9e05PTkU6MCxMRVJDOjF9LFlSPU9iamVjdC5mcmVlemUoZlUpfSk7dmFyIF9pLGZnLHVVLGxVLHBVLFpSLFFSPVooKCk9Pnt4ZigpO3ZlKCk7VWUoKTtGdCgpO0l0KCk7ZnQoKTtIdCgpO1p0KCk7c3UoKTtXdCgpO1VuKCk7cGEoKTt3bigpO2N1KCk7Y3MoKTtpYygpO19pPXt9O19pLkRFRkFVTFRfU1RSVUNUVVJFPU9iamVjdC5mcmVlemUoe2hlaWdodFNjYWxlOjEsaGVpZ2h0T2Zmc2V0OjAsZWxlbWVudHNQZXJIZWlnaHQ6MSxzdHJpZGU6MSxlbGVtZW50TXVsdGlwbGllcjoyNTYsaXNCaWdFbmRpYW46ITF9KTtmZz1uZXcgYSx1VT1uZXcgc3QsbFU9bmV3IGEscFU9bmV3IGE7X2kuY29tcHV0ZVZlcnRpY2VzPWZ1bmN0aW9uKHQpe2lmKCFoKHQpfHwhaCh0LmhlaWdodG1hcCkpdGhyb3cgbmV3IEIoIm9wdGlvbnMuaGVpZ2h0bWFwIGlzIHJlcXVpcmVkLiIpO2lmKCFoKHQud2lkdGgpfHwhaCh0LmhlaWdodCkpdGhyb3cgbmV3IEIoIm9wdGlvbnMud2lkdGggYW5kIG9wdGlvbnMuaGVpZ2h0IGFyZSByZXF1aXJlZC4iKTtpZighaCh0Lm5hdGl2ZVJlY3RhbmdsZSkpdGhyb3cgbmV3IEIoIm9wdGlvbnMubmF0aXZlUmVjdGFuZ2xlIGlzIHJlcXVpcmVkLiIpO2lmKCFoKHQuc2tpcnRIZWlnaHQpKXRocm93IG5ldyBCKCJvcHRpb25zLnNraXJ0SGVpZ2h0IGlzIHJlcXVpcmVkLiIpO2xldCBlPU1hdGguY29zLG49TWF0aC5zaW4sbz1NYXRoLnNxcnQscj1NYXRoLmF0YW4saT1NYXRoLmV4cCxzPU0uUElfT1ZFUl9UV08sZj1NLnRvUmFkaWFucyx1PXQuaGVpZ2h0bWFwLGM9dC53aWR0aCxsPXQuaGVpZ2h0LHA9dC5za2lydEhlaWdodCxkPXA+MCxtPXgodC5pc0dlb2dyYXBoaWMsITApLF89eCh0LmVsbGlwc29pZCwkLmRlZmF1bHQpLGc9MS9fLm1heGltdW1SYWRpdXMsYj1OdC5jbG9uZSh0Lm5hdGl2ZVJlY3RhbmdsZSksVD1OdC5jbG9uZSh0LnJlY3RhbmdsZSksTyxFLHcsQztoKFQpPyhPPVQud2VzdCxFPVQuc291dGgsdz1ULmVhc3QsQz1ULm5vcnRoKTptPyhPPWYoYi53ZXN0KSxFPWYoYi5zb3V0aCksdz1mKGIuZWFzdCksQz1mKGIubm9ydGgpKTooTz1iLndlc3QqZyxFPXMtMipyKGkoLWIuc291dGgqZykpLHc9Yi5lYXN0KmcsQz1zLTIqcihpKC1iLm5vcnRoKmcpKSk7bGV0IE49dC5yZWxhdGl2ZVRvQ2VudGVyLEk9aChOKTtOPUk/TjphLlpFUk87bGV0IEQ9eCh0LmluY2x1ZGVXZWJNZXJjYXRvclQsITEpLHY9eCh0LmV4YWdnZXJhdGlvbiwxKSxMPXgodC5leGFnZ2VyYXRpb25SZWxhdGl2ZUhlaWdodCwwKSxBPXYhPT0xLFM9eCh0LnN0cnVjdHVyZSxfaS5ERUZBVUxUX1NUUlVDVFVSRSksUD14KFMuaGVpZ2h0U2NhbGUsX2kuREVGQVVMVF9TVFJVQ1RVUkUuaGVpZ2h0U2NhbGUpLEY9eChTLmhlaWdodE9mZnNldCxfaS5ERUZBVUxUX1NUUlVDVFVSRS5oZWlnaHRPZmZzZXQpLGo9eChTLmVsZW1lbnRzUGVySGVpZ2h0LF9pLkRFRkFVTFRfU1RSVUNUVVJFLmVsZW1lbnRzUGVySGVpZ2h0KSxIPXgoUy5zdHJpZGUsX2kuREVGQVVMVF9TVFJVQ1RVUkUuc3RyaWRlKSxrPXgoUy5lbGVtZW50TXVsdGlwbGllcixfaS5ERUZBVUxUX1NUUlVDVFVSRS5lbGVtZW50TXVsdGlwbGllciksSz14KFMuaXNCaWdFbmRpYW4sX2kuREVGQVVMVF9TVFJVQ1RVUkUuaXNCaWdFbmRpYW4pLFg9TnQuY29tcHV0ZVdpZHRoKGIpLFI9TnQuY29tcHV0ZUhlaWdodChiKSxvdD1YLyhjLTEpLGF0PVIvKGwtMSk7bXx8KFgqPWcsUio9Zyk7bGV0IHB0PV8ucmFkaWlTcXVhcmVkLHl0PXB0LngscnQ9cHQueSxQdD1wdC56LGd0PTY1NTM2LEN0PS02NTUzNixtdD1Yby5lYXN0Tm9ydGhVcFRvRml4ZWRGcmFtZShOLF8pLHV0PXN0LmludmVyc2VUcmFuc2Zvcm1hdGlvbihtdCx1VSksdnQsenQ7RCYmKHZ0PW5vLmdlb2RldGljTGF0aXR1ZGVUb01lcmNhdG9yQW5nbGUoRSksenQ9MS8obm8uZ2VvZGV0aWNMYXRpdHVkZVRvTWVyY2F0b3JBbmdsZShDKS12dCkpO2xldCBtZT1sVTttZS54PU51bWJlci5QT1NJVElWRV9JTkZJTklUWSxtZS55PU51bWJlci5QT1NJVElWRV9JTkZJTklUWSxtZS56PU51bWJlci5QT1NJVElWRV9JTkZJTklUWTtsZXQgY2U9cFU7Y2UueD1OdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFksY2UueT1OdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFksY2Uuej1OdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFk7bGV0IHBlPU51bWJlci5QT1NJVElWRV9JTkZJTklUWSx1ZT1jKmwsUXQ9cD4wP2MqMitsKjI6MCxKdD11ZStRdCxOZT1uZXcgQXJyYXkoSnQpLGdlPW5ldyBBcnJheShKdCksRWU9bmV3IEFycmF5KEp0KSx1bj1EP25ldyBBcnJheShKdCk6W10sa2U9QT9uZXcgQXJyYXkoSnQpOltdLGJlPTAsbG49bCxwbj0wLEVuPWM7ZCYmKC0tYmUsKytsbiwtLXBuLCsrRW4pO2xldCByZT0xZS01O2ZvcihsZXQgWmU9YmU7WmU8bG47KytaZSl7bGV0IGNuPVplO2NuPDAmJihjbj0wKSxjbj49bCYmKGNuPWwtMSk7bGV0IEtlPWIubm9ydGgtYXQqY247bT9LZT1mKEtlKTpLZT1zLTIqcihpKC1LZSpnKSk7bGV0IGhuPShLZS1FKS8oQy1FKTtobj1NLmNsYW1wKGhuLDAsMSk7bGV0IHVvPVplPT09YmUscW49WmU9PT1sbi0xO3A+MCYmKHVvP0tlKz1yZSpSOnFuJiYoS2UtPXJlKlIpKTtsZXQgS249ZShLZSksbG89bihLZSksemU9UHQqbG8sTGU7RCYmKExlPShuby5nZW9kZXRpY0xhdGl0dWRlVG9NZXJjYXRvckFuZ2xlKEtlKS12dCkqenQpO2ZvcihsZXQgRG49cG47RG48RW47KytEbil7bGV0IFduPURuO1duPDAmJihXbj0wKSxXbj49YyYmKFduPWMtMSk7bGV0IHpvPWNuKihjKkgpK1duKkgscm47aWYoaj09PTEpcm49dVt6b107ZWxzZXtybj0wO2xldCBwbztpZihLKWZvcihwbz0wO3BvPGo7Kytwbylybj1ybiprK3Vbem8rcG9dO2Vsc2UgZm9yKHBvPWotMTtwbz49MDstLXBvKXJuPXJuKmsrdVt6bytwb119cm49cm4qUCtGLEN0PU1hdGgubWF4KEN0LHJuKSxndD1NYXRoLm1pbihndCxybik7bGV0IFJuPWIud2VzdCtvdCpXbjttP1JuPWYoUm4pOlJuPVJuKmc7bGV0IGFyPShSbi1PKS8ody1PKTthcj1NLmNsYW1wKGFyLDAsMSk7bGV0IFFuPWNuKmMrV247aWYocD4wKXtsZXQgcG89RG49PT1wbix2cj1Ebj09PUVuLTEsTWM9dW98fHFufHxwb3x8dnI7aWYoKHVvfHxxbikmJihwb3x8dnIpKWNvbnRpbnVlO01jJiYocm4tPXAscG8/KFFuPXVlKyhsLWNuLTEpLFJuLT1yZSpYKTpxbj9Rbj11ZStsKyhjLVduLTEpOnZyPyhRbj11ZStsK2MrY24sUm4rPXJlKlgpOnVvJiYoUW49dWUrbCtjK2wrV24pKX1sZXQgam89S24qZShSbiksTnI9S24qbihSbiksTnM9eXQqam8sSXM9cnQqTnIsSXI9MS9vKE5zKmpvK0lzKk5yK3plKmxvKSwkaT1OcypJcix2cz1JcypJcixiaT16ZSpJcixvbz1uZXcgYTtvby54PSRpK2pvKnJuLG9vLnk9dnMrTnIqcm4sb28uej1iaStsbypybixzdC5tdWx0aXBseUJ5UG9pbnQodXQsb28sZmcpLGEubWluaW11bUJ5Q29tcG9uZW50KGZnLG1lLG1lKSxhLm1heGltdW1CeUNvbXBvbmVudChmZyxjZSxjZSkscGU9TWF0aC5taW4ocGUscm4pLE5lW1FuXT1vbyxFZVtRbl09bmV3IHR0KGFyLGhuKSxnZVtRbl09cm4sRCYmKHVuW1FuXT1MZSksQSYmKGtlW1FuXT1fLmdlb2RldGljU3VyZmFjZU5vcm1hbChvbykpfX1sZXQgJHQ9QXQuZnJvbVBvaW50cyhOZSksR2U7aChUKSYmKEdlPVNvLmZyb21SZWN0YW5nbGUoVCxndCxDdCxfKSk7bGV0IGRuO0kmJihkbj1uZXcgeHMoXykuY29tcHV0ZUhvcml6b25DdWxsaW5nUG9pbnRQb3NzaWJseVVuZGVyRWxsaXBzb2lkKE4sTmUsZ3QpKTtsZXQgc249bmV3IERpKG1lLGNlLE4pLG1uPW5ldyBQcyhOLHNuLHBlLEN0LG10LCExLEQsQSx2LEwpLGZvPW5ldyBGbG9hdDMyQXJyYXkoSnQqbW4uc3RyaWRlKSxIbj0wO2ZvcihsZXQgWmU9MDtaZTxKdDsrK1plKUhuPW1uLmVuY29kZShmbyxIbixOZVtaZV0sRWVbWmVdLGdlW1plXSx2b2lkIDAsdW5bWmVdLGtlW1plXSk7cmV0dXJue3ZlcnRpY2VzOmZvLG1heGltdW1IZWlnaHQ6Q3QsbWluaW11bUhlaWdodDpndCxlbmNvZGluZzptbixib3VuZGluZ1NwaGVyZTNEOiR0LG9yaWVudGVkQm91bmRpbmdCb3g6R2Usb2NjbHVkZWVQb2ludEluU2NhbGVkU3BhY2U6ZG59fTtaUj1faX0pO3ZhciBKUj1YbigodWZ0LFpkKT0+ey8qIENvcHlyaWdodCAyMDE1LTIwMTggRXNyaS4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCBAcHJlc2VydmUgKi8oZnVuY3Rpb24oKXt2YXIgdD1mdW5jdGlvbigpe3ZhciByPXt9O3IuZGVmYXVsdE5vRGF0YVZhbHVlPS0zNDAyNzk5OTM4NzkwMTQ4NGUyMixyLmRlY29kZT1mdW5jdGlvbihsLHApe3A9cHx8e307dmFyIGQ9cC5lbmNvZGVkTWFza0RhdGF8fHAuZW5jb2RlZE1hc2tEYXRhPT09bnVsbCxtPXUobCxwLmlucHV0T2Zmc2V0fHwwLGQpLF89cC5ub0RhdGFWYWx1ZSE9PW51bGw/cC5ub0RhdGFWYWx1ZTpyLmRlZmF1bHROb0RhdGFWYWx1ZSxnPWkobSxwLnBpeGVsVHlwZXx8RmxvYXQzMkFycmF5LHAuZW5jb2RlZE1hc2tEYXRhLF8scC5yZXR1cm5NYXNrKSxiPXt3aWR0aDptLndpZHRoLGhlaWdodDptLmhlaWdodCxwaXhlbERhdGE6Zy5yZXN1bHRQaXhlbHMsbWluVmFsdWU6Zy5taW5WYWx1ZSxtYXhWYWx1ZTptLnBpeGVscy5tYXhWYWx1ZSxub0RhdGFWYWx1ZTpffTtyZXR1cm4gZy5yZXN1bHRNYXNrJiYoYi5tYXNrRGF0YT1nLnJlc3VsdE1hc2spLHAucmV0dXJuRW5jb2RlZE1hc2smJm0ubWFzayYmKGIuZW5jb2RlZE1hc2tEYXRhPW0ubWFzay5iaXRzZXQ/bS5tYXNrLmJpdHNldDpudWxsKSxwLnJldHVybkZpbGVJbmZvJiYoYi5maWxlSW5mbz1zKG0pLHAuY29tcHV0ZVVzZWRCaXREZXB0aHMmJihiLmZpbGVJbmZvLmJpdERlcHRocz1mKG0pKSksYn07dmFyIGk9ZnVuY3Rpb24obCxwLGQsbSxfKXt2YXIgZz0wLGI9bC5waXhlbHMubnVtQmxvY2tzWCxUPWwucGl4ZWxzLm51bUJsb2Nrc1ksTz1NYXRoLmZsb29yKGwud2lkdGgvYiksRT1NYXRoLmZsb29yKGwuaGVpZ2h0L1QpLHc9MipsLm1heFpFcnJvcixDPU51bWJlci5NQVhfVkFMVUUsTjtkPWR8fChsLm1hc2s/bC5tYXNrLmJpdHNldDpudWxsKTt2YXIgSSxEO0k9bmV3IHAobC53aWR0aCpsLmhlaWdodCksXyYmZCYmKEQ9bmV3IFVpbnQ4QXJyYXkobC53aWR0aCpsLmhlaWdodCkpO2Zvcih2YXIgdj1uZXcgRmxvYXQzMkFycmF5KE8qRSksTCxVLEE9MDtBPD1UO0ErKyl7dmFyIFM9QSE9PVQ/RTpsLmhlaWdodCVUO2lmKFMhPT0wKWZvcih2YXIgUD0wO1A8PWI7UCsrKXt2YXIgRj1QIT09Yj9POmwud2lkdGglYjtpZihGIT09MCl7dmFyIGo9QSpsLndpZHRoKkUrUCpPLEg9bC53aWR0aC1GLGs9bC5waXhlbHMuYmxvY2tzW2ddLEssWCxSO2suZW5jb2Rpbmc8Mj8oay5lbmNvZGluZz09PTA/Sz1rLnJhd0RhdGE6KGMoay5zdHVmZmVkRGF0YSxrLmJpdHNQZXJQaXhlbCxrLm51bVZhbGlkUGl4ZWxzLGsub2Zmc2V0LHcsdixsLnBpeGVscy5tYXhWYWx1ZSksSz12KSxYPTApOmsuZW5jb2Rpbmc9PT0yP1I9MDpSPWsub2Zmc2V0O3ZhciBvdDtpZihkKWZvcihVPTA7VTxTO1UrKyl7Zm9yKGomNyYmKG90PWRbaj4+M10sb3Q8PD1qJjcpLEw9MDtMPEY7TCsrKWomN3x8KG90PWRbaj4+M10pLG90JjEyOD8oRCYmKERbal09MSksTj1rLmVuY29kaW5nPDI/S1tYKytdOlIsQz1DPk4/TjpDLElbaisrXT1OKTooRCYmKERbal09MCksSVtqKytdPW0pLG90PDw9MTtqKz1IfWVsc2UgaWYoay5lbmNvZGluZzwyKWZvcihVPTA7VTxTO1UrKyl7Zm9yKEw9MDtMPEY7TCsrKU49S1tYKytdLEM9Qz5OP046QyxJW2orK109TjtqKz1IfWVsc2UgZm9yKEM9Qz5SP1I6QyxVPTA7VTxTO1UrKyl7Zm9yKEw9MDtMPEY7TCsrKUlbaisrXT1SO2orPUh9aWYoay5lbmNvZGluZz09PTEmJlghPT1rLm51bVZhbGlkUGl4ZWxzKXRocm93IkJsb2NrIGFuZCBNYXNrIGRvIG5vdCBtYXRjaCI7ZysrfX19cmV0dXJue3Jlc3VsdFBpeGVsczpJLHJlc3VsdE1hc2s6RCxtaW5WYWx1ZTpDfX0scz1mdW5jdGlvbihsKXtyZXR1cm57ZmlsZUlkZW50aWZpZXJTdHJpbmc6bC5maWxlSWRlbnRpZmllclN0cmluZyxmaWxlVmVyc2lvbjpsLmZpbGVWZXJzaW9uLGltYWdlVHlwZTpsLmltYWdlVHlwZSxoZWlnaHQ6bC5oZWlnaHQsd2lkdGg6bC53aWR0aCxtYXhaRXJyb3I6bC5tYXhaRXJyb3IsZW9mT2Zmc2V0OmwuZW9mT2Zmc2V0LG1hc2s6bC5tYXNrP3tudW1CbG9ja3NYOmwubWFzay5udW1CbG9ja3NYLG51bUJsb2Nrc1k6bC5tYXNrLm51bUJsb2Nrc1ksbnVtQnl0ZXM6bC5tYXNrLm51bUJ5dGVzLG1heFZhbHVlOmwubWFzay5tYXhWYWx1ZX06bnVsbCxwaXhlbHM6e251bUJsb2Nrc1g6bC5waXhlbHMubnVtQmxvY2tzWCxudW1CbG9ja3NZOmwucGl4ZWxzLm51bUJsb2Nrc1ksbnVtQnl0ZXM6bC5waXhlbHMubnVtQnl0ZXMsbWF4VmFsdWU6bC5waXhlbHMubWF4VmFsdWUsbm9EYXRhVmFsdWU6bC5ub0RhdGFWYWx1ZX19fSxmPWZ1bmN0aW9uKGwpe2Zvcih2YXIgcD1sLnBpeGVscy5udW1CbG9ja3NYKmwucGl4ZWxzLm51bUJsb2Nrc1ksZD17fSxtPTA7bTxwO20rKyl7dmFyIF89bC5waXhlbHMuYmxvY2tzW21dO18uZW5jb2Rpbmc9PT0wP2QuZmxvYXQzMj0hMDpfLmVuY29kaW5nPT09MT9kW18uYml0c1BlclBpeGVsXT0hMDpkWzBdPSEwfXJldHVybiBPYmplY3Qua2V5cyhkKX0sdT1mdW5jdGlvbihsLHAsZCl7dmFyIG09e30sXz1uZXcgVWludDhBcnJheShsLHAsMTApO2lmKG0uZmlsZUlkZW50aWZpZXJTdHJpbmc9U3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLF8pLG0uZmlsZUlkZW50aWZpZXJTdHJpbmcudHJpbSgpIT09IkNudFpJbWFnZSIpdGhyb3ciVW5leHBlY3RlZCBmaWxlIGlkZW50aWZpZXIgc3RyaW5nOiAiK20uZmlsZUlkZW50aWZpZXJTdHJpbmc7cCs9MTA7dmFyIGc9bmV3IERhdGFWaWV3KGwscCwyNCk7aWYobS5maWxlVmVyc2lvbj1nLmdldEludDMyKDAsITApLG0uaW1hZ2VUeXBlPWcuZ2V0SW50MzIoNCwhMCksbS5oZWlnaHQ9Zy5nZXRVaW50MzIoOCwhMCksbS53aWR0aD1nLmdldFVpbnQzMigxMiwhMCksbS5tYXhaRXJyb3I9Zy5nZXRGbG9hdDY0KDE2LCEwKSxwKz0yNCwhZClpZihnPW5ldyBEYXRhVmlldyhsLHAsMTYpLG0ubWFzaz17fSxtLm1hc2subnVtQmxvY2tzWT1nLmdldFVpbnQzMigwLCEwKSxtLm1hc2subnVtQmxvY2tzWD1nLmdldFVpbnQzMig0LCEwKSxtLm1hc2subnVtQnl0ZXM9Zy5nZXRVaW50MzIoOCwhMCksbS5tYXNrLm1heFZhbHVlPWcuZ2V0RmxvYXQzMigxMiwhMCkscCs9MTYsbS5tYXNrLm51bUJ5dGVzPjApe3ZhciBiPW5ldyBVaW50OEFycmF5KE1hdGguY2VpbChtLndpZHRoKm0uaGVpZ2h0LzgpKTtnPW5ldyBEYXRhVmlldyhsLHAsbS5tYXNrLm51bUJ5dGVzKTt2YXIgVD1nLmdldEludDE2KDAsITApLE89MixFPTA7ZG97aWYoVD4wKWZvcig7VC0tOyliW0UrK109Zy5nZXRVaW50OChPKyspO2Vsc2V7dmFyIHc9Zy5nZXRVaW50OChPKyspO2ZvcihUPS1UO1QtLTspYltFKytdPXd9VD1nLmdldEludDE2KE8sITApLE8rPTJ9d2hpbGUoTzxtLm1hc2subnVtQnl0ZXMpO2lmKFQhPT0tMzI3Njh8fEU8Yi5sZW5ndGgpdGhyb3ciVW5leHBlY3RlZCBlbmQgb2YgbWFzayBSTEUgZW5jb2RpbmciO20ubWFzay5iaXRzZXQ9YixwKz1tLm1hc2subnVtQnl0ZXN9ZWxzZShtLm1hc2subnVtQnl0ZXN8bS5tYXNrLm51bUJsb2Nrc1l8bS5tYXNrLm1heFZhbHVlKT09PTAmJihtLm1hc2suYml0c2V0PW5ldyBVaW50OEFycmF5KE1hdGguY2VpbChtLndpZHRoKm0uaGVpZ2h0LzgpKSk7Zz1uZXcgRGF0YVZpZXcobCxwLDE2KSxtLnBpeGVscz17fSxtLnBpeGVscy5udW1CbG9ja3NZPWcuZ2V0VWludDMyKDAsITApLG0ucGl4ZWxzLm51bUJsb2Nrc1g9Zy5nZXRVaW50MzIoNCwhMCksbS5waXhlbHMubnVtQnl0ZXM9Zy5nZXRVaW50MzIoOCwhMCksbS5waXhlbHMubWF4VmFsdWU9Zy5nZXRGbG9hdDMyKDEyLCEwKSxwKz0xNjt2YXIgQz1tLnBpeGVscy5udW1CbG9ja3NYLE49bS5waXhlbHMubnVtQmxvY2tzWSxJPUMrKG0ud2lkdGglQz4wPzE6MCksRD1OKyhtLmhlaWdodCVOPjA/MTowKTttLnBpeGVscy5ibG9ja3M9bmV3IEFycmF5KEkqRCk7Zm9yKHZhciB2PTAsTD0wO0w8RDtMKyspZm9yKHZhciBVPTA7VTxJO1UrKyl7dmFyIEE9MCxTPWwuYnl0ZUxlbmd0aC1wO2c9bmV3IERhdGFWaWV3KGwscCxNYXRoLm1pbigxMCxTKSk7dmFyIFA9e307bS5waXhlbHMuYmxvY2tzW3YrK109UDt2YXIgRj1nLmdldFVpbnQ4KDApO2lmKEErKyxQLmVuY29kaW5nPUYmNjMsUC5lbmNvZGluZz4zKXRocm93IkludmFsaWQgYmxvY2sgZW5jb2RpbmcgKCIrUC5lbmNvZGluZysiKSI7aWYoUC5lbmNvZGluZz09PTIpe3ArKztjb250aW51ZX1pZihGIT09MCYmRiE9PTIpe2lmKEY+Pj02LFAub2Zmc2V0VHlwZT1GLEY9PT0yKVAub2Zmc2V0PWcuZ2V0SW50OCgxKSxBKys7ZWxzZSBpZihGPT09MSlQLm9mZnNldD1nLmdldEludDE2KDEsITApLEErPTI7ZWxzZSBpZihGPT09MClQLm9mZnNldD1nLmdldEZsb2F0MzIoMSwhMCksQSs9NDtlbHNlIHRocm93IkludmFsaWQgYmxvY2sgb2Zmc2V0IHR5cGUiO2lmKFAuZW5jb2Rpbmc9PT0xKWlmKEY9Zy5nZXRVaW50OChBKSxBKyssUC5iaXRzUGVyUGl4ZWw9RiY2MyxGPj49NixQLm51bVZhbGlkUGl4ZWxzVHlwZT1GLEY9PT0yKVAubnVtVmFsaWRQaXhlbHM9Zy5nZXRVaW50OChBKSxBKys7ZWxzZSBpZihGPT09MSlQLm51bVZhbGlkUGl4ZWxzPWcuZ2V0VWludDE2KEEsITApLEErPTI7ZWxzZSBpZihGPT09MClQLm51bVZhbGlkUGl4ZWxzPWcuZ2V0VWludDMyKEEsITApLEErPTQ7ZWxzZSB0aHJvdyJJbnZhbGlkIHZhbGlkIHBpeGVsIGNvdW50IHR5cGUifWlmKHArPUEsUC5lbmNvZGluZyE9PTMpe3ZhciBqLEg7aWYoUC5lbmNvZGluZz09PTApe3ZhciBrPShtLnBpeGVscy5udW1CeXRlcy0xKS80O2lmKGshPT1NYXRoLmZsb29yKGspKXRocm93InVuY29tcHJlc3NlZCBibG9jayBoYXMgaW52YWxpZCBsZW5ndGgiO2o9bmV3IEFycmF5QnVmZmVyKGsqNCksSD1uZXcgVWludDhBcnJheShqKSxILnNldChuZXcgVWludDhBcnJheShsLHAsayo0KSk7dmFyIEs9bmV3IEZsb2F0MzJBcnJheShqKTtQLnJhd0RhdGE9SyxwKz1rKjR9ZWxzZSBpZihQLmVuY29kaW5nPT09MSl7dmFyIFg9TWF0aC5jZWlsKFAubnVtVmFsaWRQaXhlbHMqUC5iaXRzUGVyUGl4ZWwvOCksUj1NYXRoLmNlaWwoWC80KTtqPW5ldyBBcnJheUJ1ZmZlcihSKjQpLEg9bmV3IFVpbnQ4QXJyYXkoaiksSC5zZXQobmV3IFVpbnQ4QXJyYXkobCxwLFgpKSxQLnN0dWZmZWREYXRhPW5ldyBVaW50MzJBcnJheShqKSxwKz1YfX19cmV0dXJuIG0uZW9mT2Zmc2V0PXAsbX0sYz1mdW5jdGlvbihsLHAsZCxtLF8sZyxiKXt2YXIgVD0oMTw8cCktMSxPPTAsRSx3PTAsQyxOLEk9TWF0aC5jZWlsKChiLW0pL18pLEQ9bC5sZW5ndGgqNC1NYXRoLmNlaWwocCpkLzgpO2ZvcihsW2wubGVuZ3RoLTFdPDw9OCpELEU9MDtFPGQ7RSsrKXtpZih3PT09MCYmKE49bFtPKytdLHc9MzIpLHc+PXApQz1OPj4+dy1wJlQsdy09cDtlbHNle3ZhciB2PXAtdztDPShOJlQpPDx2JlQsTj1sW08rK10sdz0zMi12LEMrPU4+Pj53fWdbRV09QzxJP20rQypfOmJ9cmV0dXJuIGd9O3JldHVybiByfSgpLGU9ZnVuY3Rpb24oKXsidXNlIHN0cmljdCI7dmFyIHI9e3Vuc3R1ZmY6ZnVuY3Rpb24odSxjLGwscCxkLG0sXyxnKXt2YXIgYj0oMTw8bCktMSxUPTAsTyxFPTAsdyxDLE4sSSxEPXUubGVuZ3RoKjQtTWF0aC5jZWlsKGwqcC84KTtpZih1W3UubGVuZ3RoLTFdPDw9OCpELGQpZm9yKE89MDtPPHA7TysrKUU9PT0wJiYoQz11W1QrK10sRT0zMiksRT49bD8odz1DPj4+RS1sJmIsRS09bCk6KE49bC1FLHc9KEMmYik8PE4mYixDPXVbVCsrXSxFPTMyLU4sdys9Qz4+PkUpLGNbT109ZFt3XTtlbHNlIGZvcihJPU1hdGguY2VpbCgoZy1tKS9fKSxPPTA7TzxwO08rKylFPT09MCYmKEM9dVtUKytdLEU9MzIpLEU+PWw/KHc9Qz4+PkUtbCZiLEUtPWwpOihOPWwtRSx3PShDJmIpPDxOJmIsQz11W1QrK10sRT0zMi1OLHcrPUM+Pj5FKSxjW09dPXc8ST9tK3cqXzpnfSx1bnN0dWZmTFVUOmZ1bmN0aW9uKHUsYyxsLHAsZCxtKXt2YXIgXz0oMTw8YyktMSxnPTAsYj0wLFQ9MCxPPTAsRT0wLHcsQz1bXSxOPXUubGVuZ3RoKjQtTWF0aC5jZWlsKGMqbC84KTt1W3UubGVuZ3RoLTFdPDw9OCpOO3ZhciBJPU1hdGguY2VpbCgobS1wKS9kKTtmb3IoYj0wO2I8bDtiKyspTz09PTAmJih3PXVbZysrXSxPPTMyKSxPPj1jPyhFPXc+Pj5PLWMmXyxPLT1jKTooVD1jLU8sRT0odyZfKTw8VCZfLHc9dVtnKytdLE89MzItVCxFKz13Pj4+TyksQ1tiXT1FPEk/cCtFKmQ6bTtyZXR1cm4gQy51bnNoaWZ0KHApLEN9LHVuc3R1ZmYyOmZ1bmN0aW9uKHUsYyxsLHAsZCxtLF8sZyl7dmFyIGI9KDE8PGwpLTEsVD0wLE8sRT0wLHc9MCxDLE4sSTtpZihkKWZvcihPPTA7TzxwO08rKylFPT09MCYmKE49dVtUKytdLEU9MzIsdz0wKSxFPj1sPyhDPU4+Pj53JmIsRS09bCx3Kz1sKTooST1sLUUsQz1OPj4+dyZiLE49dVtUKytdLEU9MzItSSxDfD0oTiYoMTw8SSktMSk8PGwtSSx3PUkpLGNbT109ZFtDXTtlbHNle3ZhciBEPU1hdGguY2VpbCgoZy1tKS9fKTtmb3IoTz0wO088cDtPKyspRT09PTAmJihOPXVbVCsrXSxFPTMyLHc9MCksRT49bD8oQz1OPj4+dyZiLEUtPWwsdys9bCk6KEk9bC1FLEM9Tj4+PncmYixOPXVbVCsrXSxFPTMyLUksQ3w9KE4mKDE8PEkpLTEpPDxsLUksdz1JKSxjW09dPUM8RD9tK0MqXzpnfXJldHVybiBjfSx1bnN0dWZmTFVUMjpmdW5jdGlvbih1LGMsbCxwLGQsbSl7dmFyIF89KDE8PGMpLTEsZz0wLGI9MCxUPTAsTz0wLEU9MCx3PTAsQyxOPVtdLEk9TWF0aC5jZWlsKChtLXApL2QpO2ZvcihiPTA7YjxsO2IrKylPPT09MCYmKEM9dVtnKytdLE89MzIsdz0wKSxPPj1jPyhFPUM+Pj53Jl8sTy09Yyx3Kz1jKTooVD1jLU8sRT1DPj4+dyZfLEM9dVtnKytdLE89MzItVCxFfD0oQyYoMTw8VCktMSk8PGMtVCx3PVQpLE5bYl09RTxJP3ArRSpkOm07cmV0dXJuIE4udW5zaGlmdChwKSxOfSxvcmlnaW5hbFVuc3R1ZmY6ZnVuY3Rpb24odSxjLGwscCl7dmFyIGQ9KDE8PGwpLTEsbT0wLF8sZz0wLGIsVCxPLEU9dS5sZW5ndGgqNC1NYXRoLmNlaWwobCpwLzgpO2Zvcih1W3UubGVuZ3RoLTFdPDw9OCpFLF89MDtfPHA7XysrKWc9PT0wJiYoVD11W20rK10sZz0zMiksZz49bD8oYj1UPj4+Zy1sJmQsZy09bCk6KE89bC1nLGI9KFQmZCk8PE8mZCxUPXVbbSsrXSxnPTMyLU8sYis9VD4+PmcpLGNbX109YjtyZXR1cm4gY30sb3JpZ2luYWxVbnN0dWZmMjpmdW5jdGlvbih1LGMsbCxwKXt2YXIgZD0oMTw8bCktMSxtPTAsXyxnPTAsYj0wLFQsTyxFO2ZvcihfPTA7XzxwO18rKylnPT09MCYmKE89dVttKytdLGc9MzIsYj0wKSxnPj1sPyhUPU8+Pj5iJmQsZy09bCxiKz1sKTooRT1sLWcsVD1PPj4+YiZkLE89dVttKytdLGc9MzItRSxUfD0oTyYoMTw8RSktMSk8PGwtRSxiPUUpLGNbX109VDtyZXR1cm4gY319LGk9e0hVRkZNQU5fTFVUX0JJVFNfTUFYOjEyLGNvbXB1dGVDaGVja3N1bUZsZXRjaGVyMzI6ZnVuY3Rpb24odSl7Zm9yKHZhciBjPTY1NTM1LGw9NjU1MzUscD11Lmxlbmd0aCxkPU1hdGguZmxvb3IocC8yKSxtPTA7ZDspe3ZhciBfPWQ+PTM1OT8zNTk6ZDtkLT1fO2RvIGMrPXVbbSsrXTw8OCxsKz1jKz11W20rK107d2hpbGUoLS1fKTtjPShjJjY1NTM1KSsoYz4+PjE2KSxsPShsJjY1NTM1KSsobD4+PjE2KX1yZXR1cm4gcCYxJiYobCs9Yys9dVttXTw8OCksYz0oYyY2NTUzNSkrKGM+Pj4xNiksbD0obCY2NTUzNSkrKGw+Pj4xNiksKGw8PDE2fGMpPj4+MH0scmVhZEhlYWRlckluZm86ZnVuY3Rpb24odSxjKXt2YXIgbD1jLnB0cixwPW5ldyBVaW50OEFycmF5KHUsbCw2KSxkPXt9O2lmKGQuZmlsZUlkZW50aWZpZXJTdHJpbmc9U3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLHApLGQuZmlsZUlkZW50aWZpZXJTdHJpbmcubGFzdEluZGV4T2YoIkxlcmMyIiwwKSE9PTApdGhyb3ciVW5leHBlY3RlZCBmaWxlIGlkZW50aWZpZXIgc3RyaW5nIChleHBlY3QgTGVyYzIgKTogIitkLmZpbGVJZGVudGlmaWVyU3RyaW5nO2wrPTY7dmFyIG09bmV3IERhdGFWaWV3KHUsbCw4KSxfPW0uZ2V0SW50MzIoMCwhMCk7ZC5maWxlVmVyc2lvbj1fLGwrPTQsXz49MyYmKGQuY2hlY2tzdW09bS5nZXRVaW50MzIoNCwhMCksbCs9NCksbT1uZXcgRGF0YVZpZXcodSxsLDEyKSxkLmhlaWdodD1tLmdldFVpbnQzMigwLCEwKSxkLndpZHRoPW0uZ2V0VWludDMyKDQsITApLGwrPTgsXz49ND8oZC5udW1EaW1zPW0uZ2V0VWludDMyKDgsITApLGwrPTQpOmQubnVtRGltcz0xLG09bmV3IERhdGFWaWV3KHUsbCw0MCksZC5udW1WYWxpZFBpeGVsPW0uZ2V0VWludDMyKDAsITApLGQubWljcm9CbG9ja1NpemU9bS5nZXRJbnQzMig0LCEwKSxkLmJsb2JTaXplPW0uZ2V0SW50MzIoOCwhMCksZC5pbWFnZVR5cGU9bS5nZXRJbnQzMigxMiwhMCksZC5tYXhaRXJyb3I9bS5nZXRGbG9hdDY0KDE2LCEwKSxkLnpNaW49bS5nZXRGbG9hdDY0KDI0LCEwKSxkLnpNYXg9bS5nZXRGbG9hdDY0KDMyLCEwKSxsKz00MCxjLmhlYWRlckluZm89ZCxjLnB0cj1sO3ZhciBnLGI7aWYoXz49MyYmKGI9Xz49ND81Mjo0OCxnPXRoaXMuY29tcHV0ZUNoZWNrc3VtRmxldGNoZXIzMihuZXcgVWludDhBcnJheSh1LGwtYixkLmJsb2JTaXplLTE0KSksZyE9PWQuY2hlY2tzdW0pKXRocm93IkNoZWNrc3VtIGZhaWxlZC4iO3JldHVybiEwfSxjaGVja01pbk1heFJhbmdlczpmdW5jdGlvbih1LGMpe3ZhciBsPWMuaGVhZGVySW5mbyxwPXRoaXMuZ2V0RGF0YVR5cGVBcnJheShsLmltYWdlVHlwZSksZD1sLm51bURpbXMqdGhpcy5nZXREYXRhVHlwZVNpemUobC5pbWFnZVR5cGUpLG09dGhpcy5yZWFkU3ViQXJyYXkodSxjLnB0cixwLGQpLF89dGhpcy5yZWFkU3ViQXJyYXkodSxjLnB0citkLHAsZCk7Yy5wdHIrPTIqZDt2YXIgZyxiPSEwO2ZvcihnPTA7ZzxsLm51bURpbXM7ZysrKWlmKG1bZ10hPT1fW2ddKXtiPSExO2JyZWFrfXJldHVybiBsLm1pblZhbHVlcz1tLGwubWF4VmFsdWVzPV8sYn0scmVhZFN1YkFycmF5OmZ1bmN0aW9uKHUsYyxsLHApe3ZhciBkO2lmKGw9PT1VaW50OEFycmF5KWQ9bmV3IFVpbnQ4QXJyYXkodSxjLHApO2Vsc2V7dmFyIG09bmV3IEFycmF5QnVmZmVyKHApLF89bmV3IFVpbnQ4QXJyYXkobSk7Xy5zZXQobmV3IFVpbnQ4QXJyYXkodSxjLHApKSxkPW5ldyBsKG0pfXJldHVybiBkfSxyZWFkTWFzazpmdW5jdGlvbih1LGMpe3ZhciBsPWMucHRyLHA9Yy5oZWFkZXJJbmZvLGQ9cC53aWR0aCpwLmhlaWdodCxtPXAubnVtVmFsaWRQaXhlbCxfPW5ldyBEYXRhVmlldyh1LGwsNCksZz17fTtpZihnLm51bUJ5dGVzPV8uZ2V0VWludDMyKDAsITApLGwrPTQsKG09PT0wfHxkPT09bSkmJmcubnVtQnl0ZXMhPT0wKXRocm93ImludmFsaWQgbWFzayI7dmFyIGIsVDtpZihtPT09MCliPW5ldyBVaW50OEFycmF5KE1hdGguY2VpbChkLzgpKSxnLmJpdHNldD1iLFQ9bmV3IFVpbnQ4QXJyYXkoZCksYy5waXhlbHMucmVzdWx0TWFzaz1ULGwrPWcubnVtQnl0ZXM7ZWxzZSBpZihnLm51bUJ5dGVzPjApe2I9bmV3IFVpbnQ4QXJyYXkoTWF0aC5jZWlsKGQvOCkpLF89bmV3IERhdGFWaWV3KHUsbCxnLm51bUJ5dGVzKTt2YXIgTz1fLmdldEludDE2KDAsITApLEU9Mix3PTAsQz0wO2Rve2lmKE8+MClmb3IoO08tLTspYlt3KytdPV8uZ2V0VWludDgoRSsrKTtlbHNlIGZvcihDPV8uZ2V0VWludDgoRSsrKSxPPS1PO08tLTspYlt3KytdPUM7Tz1fLmdldEludDE2KEUsITApLEUrPTJ9d2hpbGUoRTxnLm51bUJ5dGVzKTtpZihPIT09LTMyNzY4fHx3PGIubGVuZ3RoKXRocm93IlVuZXhwZWN0ZWQgZW5kIG9mIG1hc2sgUkxFIGVuY29kaW5nIjtUPW5ldyBVaW50OEFycmF5KGQpO3ZhciBOPTAsST0wO2ZvcihJPTA7STxkO0krKylJJjc/KE49YltJPj4zXSxOPDw9SSY3KTpOPWJbST4+M10sTiYxMjgmJihUW0ldPTEpO2MucGl4ZWxzLnJlc3VsdE1hc2s9VCxnLmJpdHNldD1iLGwrPWcubnVtQnl0ZXN9cmV0dXJuIGMucHRyPWwsYy5tYXNrPWcsITB9LHJlYWREYXRhT25lU3dlZXA6ZnVuY3Rpb24odSxjLGwpe3ZhciBwPWMucHRyLGQ9Yy5oZWFkZXJJbmZvLG09ZC5udW1EaW1zLF89ZC53aWR0aCpkLmhlaWdodCxnPWQuaW1hZ2VUeXBlLGI9ZC5udW1WYWxpZFBpeGVsKmkuZ2V0RGF0YVR5cGVTaXplKGcpKm0sVCxPPWMucGl4ZWxzLnJlc3VsdE1hc2s7aWYobD09PVVpbnQ4QXJyYXkpVD1uZXcgVWludDhBcnJheSh1LHAsYik7ZWxzZXt2YXIgRT1uZXcgQXJyYXlCdWZmZXIoYiksdz1uZXcgVWludDhBcnJheShFKTt3LnNldChuZXcgVWludDhBcnJheSh1LHAsYikpLFQ9bmV3IGwoRSl9aWYoVC5sZW5ndGg9PT1fKm0pYy5waXhlbHMucmVzdWx0UGl4ZWxzPVQ7ZWxzZXtjLnBpeGVscy5yZXN1bHRQaXhlbHM9bmV3IGwoXyptKTt2YXIgQz0wLE49MCxJPTAsRD0wO2lmKG0+MSlmb3IoST0wO0k8bTtJKyspZm9yKEQ9SSpfLE49MDtOPF87TisrKU9bTl0mJihjLnBpeGVscy5yZXN1bHRQaXhlbHNbRCtOXT1UW0MrK10pO2Vsc2UgZm9yKE49MDtOPF87TisrKU9bTl0mJihjLnBpeGVscy5yZXN1bHRQaXhlbHNbTl09VFtDKytdKX1yZXR1cm4gcCs9YixjLnB0cj1wLCEwfSxyZWFkSHVmZm1hblRyZWU6ZnVuY3Rpb24odSxjKXt2YXIgbD10aGlzLkhVRkZNQU5fTFVUX0JJVFNfTUFYLHA9bmV3IERhdGFWaWV3KHUsYy5wdHIsMTYpO2MucHRyKz0xNjt2YXIgZD1wLmdldEludDMyKDAsITApO2lmKGQ8Mil0aHJvdyJ1bnN1cHBvcnRlZCBIdWZmbWFuIHZlcnNpb24iO3ZhciBtPXAuZ2V0SW50MzIoNCwhMCksXz1wLmdldEludDMyKDgsITApLGc9cC5nZXRJbnQzMigxMiwhMCk7aWYoXz49ZylyZXR1cm4hMTt2YXIgYj1uZXcgVWludDMyQXJyYXkoZy1fKTtpLmRlY29kZUJpdHModSxjLGIpO3ZhciBUPVtdLE8sRSx3LEM7Zm9yKE89XztPPGc7TysrKUU9Ty0oTzxtPzA6bSksVFtFXT17Zmlyc3Q6YltPLV9dLHNlY29uZDpudWxsfTt2YXIgTj11LmJ5dGVMZW5ndGgtYy5wdHIsST1NYXRoLmNlaWwoTi80KSxEPW5ldyBBcnJheUJ1ZmZlcihJKjQpLHY9bmV3IFVpbnQ4QXJyYXkoRCk7di5zZXQobmV3IFVpbnQ4QXJyYXkodSxjLnB0cixOKSk7dmFyIEw9bmV3IFVpbnQzMkFycmF5KEQpLFU9MCxBLFM9MDtmb3IoQT1MWzBdLE89XztPPGc7TysrKUU9Ty0oTzxtPzA6bSksQz1UW0VdLmZpcnN0LEM+MCYmKFRbRV0uc2Vjb25kPUE8PFU+Pj4zMi1DLDMyLVU+PUM/KFUrPUMsVT09PTMyJiYoVT0wLFMrKyxBPUxbU10pKTooVSs9Qy0zMixTKyssQT1MW1NdLFRbRV0uc2Vjb25kfD1BPj4+MzItVSkpO3ZhciBQPTAsRj0wLGo9bmV3IHM7Zm9yKE89MDtPPFQubGVuZ3RoO08rKylUW09dIT09dm9pZCAwJiYoUD1NYXRoLm1heChQLFRbT10uZmlyc3QpKTtQPj1sP0Y9bDpGPVAsUD49MzAmJmNvbnNvbGUubG9nKCJXQVJuaW5nLCBsYXJnZSBOVU0gTFVUIEJJVFMgSVMgIitQKTt2YXIgSD1bXSxrLEssWCxSLG90LGF0O2ZvcihPPV87TzxnO08rKylpZihFPU8tKE88bT8wOm0pLEM9VFtFXS5maXJzdCxDPjApaWYoaz1bQyxFXSxDPD1GKWZvcihLPVRbRV0uc2Vjb25kPDxGLUMsWD0xPDxGLUMsdz0wO3c8WDt3KyspSFtLfHddPWs7ZWxzZSBmb3IoSz1UW0VdLnNlY29uZCxhdD1qLFI9Qy0xO1I+PTA7Ui0tKW90PUs+Pj5SJjEsb3Q/KGF0LnJpZ2h0fHwoYXQucmlnaHQ9bmV3IHMpLGF0PWF0LnJpZ2h0KTooYXQubGVmdHx8KGF0LmxlZnQ9bmV3IHMpLGF0PWF0LmxlZnQpLFI9PT0wJiYhYXQudmFsJiYoYXQudmFsPWtbMV0pO3JldHVybntkZWNvZGVMdXQ6SCxudW1CaXRzTFVUUWljazpGLG51bUJpdHNMVVQ6UCx0cmVlOmosc3R1ZmZlZERhdGE6TCxzcmNQdHI6UyxiaXRQb3M6VX19LHJlYWRIdWZmbWFuOmZ1bmN0aW9uKHUsYyxsKXt2YXIgcD1jLmhlYWRlckluZm8sZD1wLm51bURpbXMsbT1jLmhlYWRlckluZm8uaGVpZ2h0LF89Yy5oZWFkZXJJbmZvLndpZHRoLGc9XyptLGI9dGhpcy5yZWFkSHVmZm1hblRyZWUodSxjKSxUPWIuZGVjb2RlTHV0LE89Yi50cmVlLEU9Yi5zdHVmZmVkRGF0YSx3PWIuc3JjUHRyLEM9Yi5iaXRQb3MsTj1iLm51bUJpdHNMVVRRaWNrLEk9Yi5udW1CaXRzTFVULEQ9Yy5oZWFkZXJJbmZvLmltYWdlVHlwZT09PTA/MTI4OjAsdixMLFUsQT1jLnBpeGVscy5yZXN1bHRNYXNrLFMsUCxGLGosSCxrLEssWD0wO0M+MCYmKHcrKyxDPTApO3ZhciBSPUVbd10sb3Q9Yy5lbmNvZGVNb2RlPT09MSxhdD1uZXcgbChnKmQpLHB0PWF0LHl0O2Zvcih5dD0wO3l0PHAubnVtRGltczt5dCsrKXtpZihkPjEmJihwdD1uZXcgbChhdC5idWZmZXIsZyp5dCxnKSxYPTApLGMuaGVhZGVySW5mby5udW1WYWxpZFBpeGVsPT09XyptKWZvcihrPTAsaj0wO2o8bTtqKyspZm9yKEg9MDtIPF87SCsrLGsrKyl7aWYoTD0wLFM9Ujw8Qz4+PjMyLU4sUD1TLDMyLUM8TiYmKFN8PUVbdysxXT4+PjY0LUMtTixQPVMpLFRbUF0pTD1UW1BdWzFdLEMrPVRbUF1bMF07ZWxzZSBmb3IoUz1SPDxDPj4+MzItSSxQPVMsMzItQzxJJiYoU3w9RVt3KzFdPj4+NjQtQy1JLFA9Uyksdj1PLEs9MDtLPEk7SysrKWlmKEY9Uz4+PkktSy0xJjEsdj1GP3YucmlnaHQ6di5sZWZ0LCEodi5sZWZ0fHx2LnJpZ2h0KSl7TD12LnZhbCxDPUMrSysxO2JyZWFrfUM+PTMyJiYoQy09MzIsdysrLFI9RVt3XSksVT1MLUQsb3Q/KEg+MD9VKz1YOmo+MD9VKz1wdFtrLV9dOlUrPVgsVSY9MjU1LHB0W2tdPVUsWD1VKTpwdFtrXT1VfWVsc2UgZm9yKGs9MCxqPTA7ajxtO2orKylmb3IoSD0wO0g8XztIKyssaysrKWlmKEFba10pe2lmKEw9MCxTPVI8PEM+Pj4zMi1OLFA9UywzMi1DPE4mJihTfD1FW3crMV0+Pj42NC1DLU4sUD1TKSxUW1BdKUw9VFtQXVsxXSxDKz1UW1BdWzBdO2Vsc2UgZm9yKFM9Ujw8Qz4+PjMyLUksUD1TLDMyLUM8SSYmKFN8PUVbdysxXT4+PjY0LUMtSSxQPVMpLHY9TyxLPTA7SzxJO0srKylpZihGPVM+Pj5JLUstMSYxLHY9Rj92LnJpZ2h0OnYubGVmdCwhKHYubGVmdHx8di5yaWdodCkpe0w9di52YWwsQz1DK0srMTticmVha31DPj0zMiYmKEMtPTMyLHcrKyxSPUVbd10pLFU9TC1ELG90PyhIPjAmJkFbay0xXT9VKz1YOmo+MCYmQVtrLV9dP1UrPXB0W2stX106VSs9WCxVJj0yNTUscHRba109VSxYPVUpOnB0W2tdPVV9Yy5wdHI9Yy5wdHIrKHcrMSkqNCsoQz4wPzQ6MCl9Yy5waXhlbHMucmVzdWx0UGl4ZWxzPWF0fSxkZWNvZGVCaXRzOmZ1bmN0aW9uKHUsYyxsLHAsZCl7e3ZhciBtPWMuaGVhZGVySW5mbyxfPW0uZmlsZVZlcnNpb24sZz0wLGI9bmV3IERhdGFWaWV3KHUsYy5wdHIsNSksVD1iLmdldFVpbnQ4KDApO2crKzt2YXIgTz1UPj42LEU9Tz09PTA/NDozLU8sdz0oVCYzMik+MCxDPVQmMzEsTj0wO2lmKEU9PT0xKU49Yi5nZXRVaW50OChnKSxnKys7ZWxzZSBpZihFPT09MilOPWIuZ2V0VWludDE2KGcsITApLGcrPTI7ZWxzZSBpZihFPT09NClOPWIuZ2V0VWludDMyKGcsITApLGcrPTQ7ZWxzZSB0aHJvdyJJbnZhbGlkIHZhbGlkIHBpeGVsIGNvdW50IHR5cGUiO3ZhciBJPTIqbS5tYXhaRXJyb3IsRCx2LEwsVSxBLFMsUCxGLGosSCxrPW0ubnVtRGltcz4xP20ubWF4VmFsdWVzW2RdOm0uek1heDtpZih3KXtmb3IoYy5jb3VudGVyLmx1dCsrLEY9Yi5nZXRVaW50OChnKSxqPUMsZysrLFU9TWF0aC5jZWlsKChGLTEpKkMvOCksQT1NYXRoLmNlaWwoVS80KSx2PW5ldyBBcnJheUJ1ZmZlcihBKjQpLEw9bmV3IFVpbnQ4QXJyYXkodiksYy5wdHIrPWcsTC5zZXQobmV3IFVpbnQ4QXJyYXkodSxjLnB0cixVKSksUD1uZXcgVWludDMyQXJyYXkodiksYy5wdHIrPVUsSD0wO0YtMT4+Pkg7KUgrKztVPU1hdGguY2VpbChOKkgvOCksQT1NYXRoLmNlaWwoVS80KSx2PW5ldyBBcnJheUJ1ZmZlcihBKjQpLEw9bmV3IFVpbnQ4QXJyYXkodiksTC5zZXQobmV3IFVpbnQ4QXJyYXkodSxjLnB0cixVKSksRD1uZXcgVWludDMyQXJyYXkodiksYy5wdHIrPVUsXz49Mz9TPXIudW5zdHVmZkxVVDIoUCxDLEYtMSxwLEksayk6Uz1yLnVuc3R1ZmZMVVQoUCxDLEYtMSxwLEksayksXz49Mz9yLnVuc3R1ZmYyKEQsbCxILE4sUyk6ci51bnN0dWZmKEQsbCxILE4sUyl9ZWxzZSBjLmNvdW50ZXIuYml0c3R1ZmZlcisrLEg9QyxjLnB0cis9ZyxIPjAmJihVPU1hdGguY2VpbChOKkgvOCksQT1NYXRoLmNlaWwoVS80KSx2PW5ldyBBcnJheUJ1ZmZlcihBKjQpLEw9bmV3IFVpbnQ4QXJyYXkodiksTC5zZXQobmV3IFVpbnQ4QXJyYXkodSxjLnB0cixVKSksRD1uZXcgVWludDMyQXJyYXkodiksYy5wdHIrPVUsXz49Mz9wPT1udWxsP3Iub3JpZ2luYWxVbnN0dWZmMihELGwsSCxOKTpyLnVuc3R1ZmYyKEQsbCxILE4sITEscCxJLGspOnA9PW51bGw/ci5vcmlnaW5hbFVuc3R1ZmYoRCxsLEgsTik6ci51bnN0dWZmKEQsbCxILE4sITEscCxJLGspKX19LHJlYWRUaWxlczpmdW5jdGlvbih1LGMsbCl7dmFyIHA9Yy5oZWFkZXJJbmZvLGQ9cC53aWR0aCxtPXAuaGVpZ2h0LF89cC5taWNyb0Jsb2NrU2l6ZSxnPXAuaW1hZ2VUeXBlLGI9aS5nZXREYXRhVHlwZVNpemUoZyksVD1NYXRoLmNlaWwoZC9fKSxPPU1hdGguY2VpbChtL18pO2MucGl4ZWxzLm51bUJsb2Nrc1k9TyxjLnBpeGVscy5udW1CbG9ja3NYPVQsYy5waXhlbHMucHRyPTA7dmFyIEU9MCx3PTAsQz0wLE49MCxJPTAsRD0wLHY9MCxMPTAsVT0wLEE9MCxTPTAsUD0wLEY9MCxqPTAsSD0wLGs9MCxLLFgsUixvdCxhdCxwdCx5dD1uZXcgbChfKl8pLHJ0PW0lX3x8XyxQdD1kJV98fF8sZ3QsQ3QsbXQ9cC5udW1EaW1zLHV0LHZ0PWMucGl4ZWxzLnJlc3VsdE1hc2ssenQ9Yy5waXhlbHMucmVzdWx0UGl4ZWxzO2ZvcihDPTA7QzxPO0MrKylmb3IoST1DIT09Ty0xP186cnQsTj0wO048VDtOKyspZm9yKEQ9TiE9PVQtMT9fOlB0LFM9QypkKl8rTipfLFA9ZC1ELHV0PTA7dXQ8bXQ7dXQrKyl7aWYobXQ+MSYmKHp0PW5ldyBsKGMucGl4ZWxzLnJlc3VsdFBpeGVscy5idWZmZXIsZCptKnV0KmIsZCptKSksdj11LmJ5dGVMZW5ndGgtYy5wdHIsSz1uZXcgRGF0YVZpZXcodSxjLnB0cixNYXRoLm1pbigxMCx2KSksWD17fSxrPTAsTD1LLmdldFVpbnQ4KDApLGsrKyxVPUw+PjYmMjU1LEE9TD4+MiYxNSxBIT09KE4qXz4+MyYxNSkpdGhyb3ciaW50ZWdyaXR5IGlzc3VlIjtpZihwdD1MJjMscHQ+Myl0aHJvdyBjLnB0cis9aywiSW52YWxpZCBibG9jayBlbmNvZGluZyAoIitwdCsiKSI7aWYocHQ9PT0yKXtjLmNvdW50ZXIuY29uc3RhbnQrKyxjLnB0cis9aztjb250aW51ZX1lbHNlIGlmKHB0PT09MCl7aWYoYy5jb3VudGVyLnVuY29tcHJlc3NlZCsrLGMucHRyKz1rLEY9SSpEKmIsaj11LmJ5dGVMZW5ndGgtYy5wdHIsRj1GPGo/RjpqLFI9bmV3IEFycmF5QnVmZmVyKEYlYj09PTA/RjpGK2ItRiViKSxvdD1uZXcgVWludDhBcnJheShSKSxvdC5zZXQobmV3IFVpbnQ4QXJyYXkodSxjLnB0cixGKSksYXQ9bmV3IGwoUiksSD0wLHZ0KWZvcihFPTA7RTxJO0UrKyl7Zm9yKHc9MDt3PEQ7dysrKXZ0W1NdJiYoenRbU109YXRbSCsrXSksUysrO1MrPVB9ZWxzZSBmb3IoRT0wO0U8STtFKyspe2Zvcih3PTA7dzxEO3crKyl6dFtTKytdPWF0W0grK107Uys9UH1jLnB0cis9SCpifWVsc2UgaWYoZ3Q9aS5nZXREYXRhVHlwZVVzZWQoZyxVKSxDdD1pLmdldE9uZVBpeGVsKFgsayxndCxLKSxrKz1pLmdldERhdGFUeXBlU2l6ZShndCkscHQ9PT0zKWlmKGMucHRyKz1rLGMuY291bnRlci5jb25zdGFudG9mZnNldCsrLHZ0KWZvcihFPTA7RTxJO0UrKyl7Zm9yKHc9MDt3PEQ7dysrKXZ0W1NdJiYoenRbU109Q3QpLFMrKztTKz1QfWVsc2UgZm9yKEU9MDtFPEk7RSsrKXtmb3Iodz0wO3c8RDt3KyspenRbUysrXT1DdDtTKz1QfWVsc2UgaWYoYy5wdHIrPWssaS5kZWNvZGVCaXRzKHUsYyx5dCxDdCx1dCksaz0wLHZ0KWZvcihFPTA7RTxJO0UrKyl7Zm9yKHc9MDt3PEQ7dysrKXZ0W1NdJiYoenRbU109eXRbaysrXSksUysrO1MrPVB9ZWxzZSBmb3IoRT0wO0U8STtFKyspe2Zvcih3PTA7dzxEO3crKyl6dFtTKytdPXl0W2srK107Uys9UH19fSxmb3JtYXRGaWxlSW5mbzpmdW5jdGlvbih1KXtyZXR1cm57ZmlsZUlkZW50aWZpZXJTdHJpbmc6dS5oZWFkZXJJbmZvLmZpbGVJZGVudGlmaWVyU3RyaW5nLGZpbGVWZXJzaW9uOnUuaGVhZGVySW5mby5maWxlVmVyc2lvbixpbWFnZVR5cGU6dS5oZWFkZXJJbmZvLmltYWdlVHlwZSxoZWlnaHQ6dS5oZWFkZXJJbmZvLmhlaWdodCx3aWR0aDp1LmhlYWRlckluZm8ud2lkdGgsbnVtVmFsaWRQaXhlbDp1LmhlYWRlckluZm8ubnVtVmFsaWRQaXhlbCxtaWNyb0Jsb2NrU2l6ZTp1LmhlYWRlckluZm8ubWljcm9CbG9ja1NpemUsYmxvYlNpemU6dS5oZWFkZXJJbmZvLmJsb2JTaXplLG1heFpFcnJvcjp1LmhlYWRlckluZm8ubWF4WkVycm9yLHBpeGVsVHlwZTppLmdldFBpeGVsVHlwZSh1LmhlYWRlckluZm8uaW1hZ2VUeXBlKSxlb2ZPZmZzZXQ6dS5lb2ZPZmZzZXQsbWFzazp1Lm1hc2s/e251bUJ5dGVzOnUubWFzay5udW1CeXRlc306bnVsbCxwaXhlbHM6e251bUJsb2Nrc1g6dS5waXhlbHMubnVtQmxvY2tzWCxudW1CbG9ja3NZOnUucGl4ZWxzLm51bUJsb2Nrc1ksbWF4VmFsdWU6dS5oZWFkZXJJbmZvLnpNYXgsbWluVmFsdWU6dS5oZWFkZXJJbmZvLnpNaW4sbm9EYXRhVmFsdWU6dS5ub0RhdGFWYWx1ZX19fSxjb25zdHJ1Y3RDb25zdGFudFN1cmZhY2U6ZnVuY3Rpb24odSl7dmFyIGM9dS5oZWFkZXJJbmZvLnpNYXgsbD11LmhlYWRlckluZm8ubnVtRGltcyxwPXUuaGVhZGVySW5mby5oZWlnaHQqdS5oZWFkZXJJbmZvLndpZHRoLGQ9cCpsLG09MCxfPTAsZz0wLGI9dS5waXhlbHMucmVzdWx0TWFzaztpZihiKWlmKGw+MSlmb3IobT0wO208bDttKyspZm9yKGc9bSpwLF89MDtfPHA7XysrKWJbX10mJih1LnBpeGVscy5yZXN1bHRQaXhlbHNbZytfXT1jKTtlbHNlIGZvcihfPTA7XzxwO18rKyliW19dJiYodS5waXhlbHMucmVzdWx0UGl4ZWxzW19dPWMpO2Vsc2UgaWYodS5waXhlbHMucmVzdWx0UGl4ZWxzLmZpbGwpdS5waXhlbHMucmVzdWx0UGl4ZWxzLmZpbGwoYyk7ZWxzZSBmb3IoXz0wO188ZDtfKyspdS5waXhlbHMucmVzdWx0UGl4ZWxzW19dPWN9LGdldERhdGFUeXBlQXJyYXk6ZnVuY3Rpb24odSl7dmFyIGM7c3dpdGNoKHUpe2Nhc2UgMDpjPUludDhBcnJheTticmVhaztjYXNlIDE6Yz1VaW50OEFycmF5O2JyZWFrO2Nhc2UgMjpjPUludDE2QXJyYXk7YnJlYWs7Y2FzZSAzOmM9VWludDE2QXJyYXk7YnJlYWs7Y2FzZSA0OmM9SW50MzJBcnJheTticmVhaztjYXNlIDU6Yz1VaW50MzJBcnJheTticmVhaztjYXNlIDY6Yz1GbG9hdDMyQXJyYXk7YnJlYWs7Y2FzZSA3OmM9RmxvYXQ2NEFycmF5O2JyZWFrO2RlZmF1bHQ6Yz1GbG9hdDMyQXJyYXl9cmV0dXJuIGN9LGdldFBpeGVsVHlwZTpmdW5jdGlvbih1KXt2YXIgYztzd2l0Y2godSl7Y2FzZSAwOmM9IlM4IjticmVhaztjYXNlIDE6Yz0iVTgiO2JyZWFrO2Nhc2UgMjpjPSJTMTYiO2JyZWFrO2Nhc2UgMzpjPSJVMTYiO2JyZWFrO2Nhc2UgNDpjPSJTMzIiO2JyZWFrO2Nhc2UgNTpjPSJVMzIiO2JyZWFrO2Nhc2UgNjpjPSJGMzIiO2JyZWFrO2Nhc2UgNzpjPSJGNjQiO2JyZWFrO2RlZmF1bHQ6Yz0iRjMyIn1yZXR1cm4gY30saXNWYWxpZFBpeGVsVmFsdWU6ZnVuY3Rpb24odSxjKXtpZihjPT1udWxsKXJldHVybiExO3ZhciBsO3N3aXRjaCh1KXtjYXNlIDA6bD1jPj0tMTI4JiZjPD0xMjc7YnJlYWs7Y2FzZSAxOmw9Yz49MCYmYzw9MjU1O2JyZWFrO2Nhc2UgMjpsPWM+PS0zMjc2OCYmYzw9MzI3Njc7YnJlYWs7Y2FzZSAzOmw9Yz49MCYmYzw9NjU1MzY7YnJlYWs7Y2FzZSA0Omw9Yz49LTIxNDc0ODM2NDgmJmM8PTIxNDc0ODM2NDc7YnJlYWs7Y2FzZSA1Omw9Yz49MCYmYzw9NDI5NDk2NzI5NjticmVhaztjYXNlIDY6bD1jPj0tMzQwMjc5OTkzODc5MDE0ODRlMjImJmM8PTM0MDI3OTk5Mzg3OTAxNDg0ZTIyO2JyZWFrO2Nhc2UgNzpsPWM+PTVlLTMyNCYmYzw9MTc5NzY5MzEzNDg2MjMxNTdlMjkyO2JyZWFrO2RlZmF1bHQ6bD0hMX1yZXR1cm4gbH0sZ2V0RGF0YVR5cGVTaXplOmZ1bmN0aW9uKHUpe3ZhciBjPTA7c3dpdGNoKHUpe2Nhc2UgMDpjYXNlIDE6Yz0xO2JyZWFrO2Nhc2UgMjpjYXNlIDM6Yz0yO2JyZWFrO2Nhc2UgNDpjYXNlIDU6Y2FzZSA2OmM9NDticmVhaztjYXNlIDc6Yz04O2JyZWFrO2RlZmF1bHQ6Yz11fXJldHVybiBjfSxnZXREYXRhVHlwZVVzZWQ6ZnVuY3Rpb24odSxjKXt2YXIgbD11O3N3aXRjaCh1KXtjYXNlIDI6Y2FzZSA0Omw9dS1jO2JyZWFrO2Nhc2UgMzpjYXNlIDU6bD11LTIqYzticmVhaztjYXNlIDY6Yz09PTA/bD11OmM9PT0xP2w9MjpsPTE7YnJlYWs7Y2FzZSA3OmM9PT0wP2w9dTpsPXUtMipjKzE7YnJlYWs7ZGVmYXVsdDpsPXU7YnJlYWt9cmV0dXJuIGx9LGdldE9uZVBpeGVsOmZ1bmN0aW9uKHUsYyxsLHApe3ZhciBkPTA7c3dpdGNoKGwpe2Nhc2UgMDpkPXAuZ2V0SW50OChjKTticmVhaztjYXNlIDE6ZD1wLmdldFVpbnQ4KGMpO2JyZWFrO2Nhc2UgMjpkPXAuZ2V0SW50MTYoYywhMCk7YnJlYWs7Y2FzZSAzOmQ9cC5nZXRVaW50MTYoYywhMCk7YnJlYWs7Y2FzZSA0OmQ9cC5nZXRJbnQzMihjLCEwKTticmVhaztjYXNlIDU6ZD1wLmdldFVJbnQzMihjLCEwKTticmVhaztjYXNlIDY6ZD1wLmdldEZsb2F0MzIoYywhMCk7YnJlYWs7Y2FzZSA3OmQ9cC5nZXRGbG9hdDY0KGMsITApO2JyZWFrO2RlZmF1bHQ6dGhyb3cidGhlIGRlY29kZXIgZG9lcyBub3QgdW5kZXJzdGFuZCB0aGlzIHBpeGVsIHR5cGUifXJldHVybiBkfX0scz1mdW5jdGlvbih1LGMsbCl7dGhpcy52YWw9dSx0aGlzLmxlZnQ9Yyx0aGlzLnJpZ2h0PWx9LGY9e2RlY29kZTpmdW5jdGlvbih1LGMpe2M9Y3x8e307dmFyIGw9Yy5ub0RhdGFWYWx1ZSxwPTAsZD17fTtpZihkLnB0cj1jLmlucHV0T2Zmc2V0fHwwLGQucGl4ZWxzPXt9LCEhaS5yZWFkSGVhZGVySW5mbyh1LGQpKXt2YXIgbT1kLmhlYWRlckluZm8sXz1tLmZpbGVWZXJzaW9uLGc9aS5nZXREYXRhVHlwZUFycmF5KG0uaW1hZ2VUeXBlKTtpLnJlYWRNYXNrKHUsZCksbS5udW1WYWxpZFBpeGVsIT09bS53aWR0aCptLmhlaWdodCYmIWQucGl4ZWxzLnJlc3VsdE1hc2smJihkLnBpeGVscy5yZXN1bHRNYXNrPWMubWFza0RhdGEpO3ZhciBiPW0ud2lkdGgqbS5oZWlnaHQ7aWYoZC5waXhlbHMucmVzdWx0UGl4ZWxzPW5ldyBnKGIqbS5udW1EaW1zKSxkLmNvdW50ZXI9e29uZXN3ZWVwOjAsdW5jb21wcmVzc2VkOjAsbHV0OjAsYml0c3R1ZmZlcjowLGNvbnN0YW50OjAsY29uc3RhbnRvZmZzZXQ6MH0sbS5udW1WYWxpZFBpeGVsIT09MClpZihtLnpNYXg9PT1tLnpNaW4paS5jb25zdHJ1Y3RDb25zdGFudFN1cmZhY2UoZCk7ZWxzZSBpZihfPj00JiZpLmNoZWNrTWluTWF4UmFuZ2VzKHUsZCkpaS5jb25zdHJ1Y3RDb25zdGFudFN1cmZhY2UoZCk7ZWxzZXt2YXIgVD1uZXcgRGF0YVZpZXcodSxkLnB0ciwyKSxPPVQuZ2V0VWludDgoMCk7aWYoZC5wdHIrKyxPKWkucmVhZERhdGFPbmVTd2VlcCh1LGQsZyk7ZWxzZSBpZihfPjEmJm0uaW1hZ2VUeXBlPD0xJiZNYXRoLmFicyhtLm1heFpFcnJvci0uNSk8MWUtNSl7dmFyIEU9VC5nZXRVaW50OCgxKTtpZihkLnB0cisrLGQuZW5jb2RlTW9kZT1FLEU+Mnx8Xzw0JiZFPjEpdGhyb3ciSW52YWxpZCBIdWZmbWFuIGZsYWcgIitFO0U/aS5yZWFkSHVmZm1hbih1LGQsZyk6aS5yZWFkVGlsZXModSxkLGcpfWVsc2UgaS5yZWFkVGlsZXModSxkLGcpfWQuZW9mT2Zmc2V0PWQucHRyO3ZhciB3O2MuaW5wdXRPZmZzZXQ/KHc9ZC5oZWFkZXJJbmZvLmJsb2JTaXplK2MuaW5wdXRPZmZzZXQtZC5wdHIsTWF0aC5hYnModyk+PTEmJihkLmVvZk9mZnNldD1jLmlucHV0T2Zmc2V0K2QuaGVhZGVySW5mby5ibG9iU2l6ZSkpOih3PWQuaGVhZGVySW5mby5ibG9iU2l6ZS1kLnB0cixNYXRoLmFicyh3KT49MSYmKGQuZW9mT2Zmc2V0PWQuaGVhZGVySW5mby5ibG9iU2l6ZSkpO3ZhciBDPXt3aWR0aDptLndpZHRoLGhlaWdodDptLmhlaWdodCxwaXhlbERhdGE6ZC5waXhlbHMucmVzdWx0UGl4ZWxzLG1pblZhbHVlOm0uek1pbixtYXhWYWx1ZTptLnpNYXgsdmFsaWRQaXhlbENvdW50Om0ubnVtVmFsaWRQaXhlbCxkaW1Db3VudDptLm51bURpbXMsZGltU3RhdHM6e21pblZhbHVlczptLm1pblZhbHVlcyxtYXhWYWx1ZXM6bS5tYXhWYWx1ZXN9LG1hc2tEYXRhOmQucGl4ZWxzLnJlc3VsdE1hc2t9O2lmKGQucGl4ZWxzLnJlc3VsdE1hc2smJmkuaXNWYWxpZFBpeGVsVmFsdWUobS5pbWFnZVR5cGUsbCkpe3ZhciBOPWQucGl4ZWxzLnJlc3VsdE1hc2s7Zm9yKHA9MDtwPGI7cCsrKU5bcF18fChDLnBpeGVsRGF0YVtwXT1sKTtDLm5vRGF0YVZhbHVlPWx9cmV0dXJuIGQubm9EYXRhVmFsdWU9bCxjLnJldHVybkZpbGVJbmZvJiYoQy5maWxlSW5mbz1pLmZvcm1hdEZpbGVJbmZvKGQpKSxDfX0sZ2V0QmFuZENvdW50OmZ1bmN0aW9uKHUpe3ZhciBjPTAsbD0wLHA9e307Zm9yKHAucHRyPTAscC5waXhlbHM9e307bDx1LmJ5dGVMZW5ndGgtNTg7KWkucmVhZEhlYWRlckluZm8odSxwKSxsKz1wLmhlYWRlckluZm8uYmxvYlNpemUsYysrLHAucHRyPWw7cmV0dXJuIGN9fTtyZXR1cm4gZn0oKSxuPWZ1bmN0aW9uKCl7dmFyIHI9bmV3IEFycmF5QnVmZmVyKDQpLGk9bmV3IFVpbnQ4QXJyYXkocikscz1uZXcgVWludDMyQXJyYXkocik7cmV0dXJuIHNbMF09MSxpWzBdPT09MX0oKSxvPXtkZWNvZGU6ZnVuY3Rpb24ocixpKXtpZighbil0aHJvdyJCaWcgZW5kaWFuIHN5c3RlbSBpcyBub3Qgc3VwcG9ydGVkLiI7aT1pfHx7fTt2YXIgcz1pLmlucHV0T2Zmc2V0fHwwLGY9bmV3IFVpbnQ4QXJyYXkocixzLDEwKSx1PVN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCxmKSxjLGw7aWYodS50cmltKCk9PT0iQ250WkltYWdlIiljPXQsbD0xO2Vsc2UgaWYodS5zdWJzdHJpbmcoMCw1KT09PSJMZXJjMiIpYz1lLGw9MjtlbHNlIHRocm93IlVuZXhwZWN0ZWQgZmlsZSBpZGVudGlmaWVyIHN0cmluZzogIit1O2Zvcih2YXIgcD0wLGQ9ci5ieXRlTGVuZ3RoLTEwLG0sXz1bXSxnLGIsVD17d2lkdGg6MCxoZWlnaHQ6MCxwaXhlbHM6W10scGl4ZWxUeXBlOmkucGl4ZWxUeXBlLG1hc2s6bnVsbCxzdGF0aXN0aWNzOltdfTtzPGQ7KXt2YXIgTz1jLmRlY29kZShyLHtpbnB1dE9mZnNldDpzLGVuY29kZWRNYXNrRGF0YTptLG1hc2tEYXRhOmIscmV0dXJuTWFzazpwPT09MCxyZXR1cm5FbmNvZGVkTWFzazpwPT09MCxyZXR1cm5GaWxlSW5mbzohMCxwaXhlbFR5cGU6aS5waXhlbFR5cGV8fG51bGwsbm9EYXRhVmFsdWU6aS5ub0RhdGFWYWx1ZXx8bnVsbH0pO3M9Ty5maWxlSW5mby5lb2ZPZmZzZXQscD09PTAmJihtPU8uZW5jb2RlZE1hc2tEYXRhLGI9Ty5tYXNrRGF0YSxULndpZHRoPU8ud2lkdGgsVC5oZWlnaHQ9Ty5oZWlnaHQsVC5kaW1Db3VudD1PLmRpbUNvdW50fHwxLFQucGl4ZWxUeXBlPU8ucGl4ZWxUeXBlfHxPLmZpbGVJbmZvLnBpeGVsVHlwZSxULm1hc2s9Ty5tYXNrRGF0YSksbD4xJiZPLmZpbGVJbmZvLm1hc2smJk8uZmlsZUluZm8ubWFzay5udW1CeXRlcz4wJiZfLnB1c2goTy5tYXNrRGF0YSkscCsrLFQucGl4ZWxzLnB1c2goTy5waXhlbERhdGEpLFQuc3RhdGlzdGljcy5wdXNoKHttaW5WYWx1ZTpPLm1pblZhbHVlLG1heFZhbHVlOk8ubWF4VmFsdWUsbm9EYXRhVmFsdWU6Ty5ub0RhdGFWYWx1ZSxkaW1TdGF0czpPLmRpbVN0YXRzfSl9dmFyIEUsdyxDO2lmKGw+MSYmXy5sZW5ndGg+MSl7Zm9yKEM9VC53aWR0aCpULmhlaWdodCxULmJhbmRNYXNrcz1fLGI9bmV3IFVpbnQ4QXJyYXkoQyksYi5zZXQoX1swXSksRT0xO0U8Xy5sZW5ndGg7RSsrKWZvcihnPV9bRV0sdz0wO3c8Qzt3KyspYlt3XT1iW3ddJmdbd107VC5tYXNrRGF0YT1ifXJldHVybiBUfX07dHlwZW9mIGRlZmluZT09ImZ1bmN0aW9uIiYmZGVmaW5lLmFtZD9kZWZpbmUoW10sZnVuY3Rpb24oKXtyZXR1cm4gb30pOnR5cGVvZiBaZDwidSImJlpkLmV4cG9ydHM/WmQuZXhwb3J0cz1vOnRoaXMuTGVyYz1vfSkoKX0pO3ZhciB1Zz17fTtkZSh1Zyx7ZGVmYXVsdDooKT0+bVV9KTtmdW5jdGlvbiBkVSh0LGUpe2lmKHQuZW5jb2Rpbmc9PT1ZUi5MRVJDKXtsZXQgcjt0cnl7cj10Mi5kZWZhdWx0LmRlY29kZSh0LmhlaWdodG1hcCl9Y2F0Y2gocyl7dGhyb3cgbmV3IEFlKHMpfWlmKHIuc3RhdGlzdGljc1swXS5taW5WYWx1ZT09PU51bWJlci5NQVhfVkFMVUUpdGhyb3cgbmV3IEFlKCJJbnZhbGlkIHRpbGUgZGF0YSIpO3QuaGVpZ2h0bWFwPXIucGl4ZWxzWzBdLHQud2lkdGg9ci53aWR0aCx0LmhlaWdodD1yLmhlaWdodH10LmVsbGlwc29pZD0kLmNsb25lKHQuZWxsaXBzb2lkKSx0LnJlY3RhbmdsZT1OdC5jbG9uZSh0LnJlY3RhbmdsZSk7bGV0IG49WlIuY29tcHV0ZVZlcnRpY2VzKHQpLG89bi52ZXJ0aWNlcztyZXR1cm4gZS5wdXNoKG8uYnVmZmVyKSx7dmVydGljZXM6by5idWZmZXIsbnVtYmVyT2ZBdHRyaWJ1dGVzOm4uZW5jb2Rpbmcuc3RyaWRlLG1pbmltdW1IZWlnaHQ6bi5taW5pbXVtSGVpZ2h0LG1heGltdW1IZWlnaHQ6bi5tYXhpbXVtSGVpZ2h0LGdyaWRXaWR0aDp0LndpZHRoLGdyaWRIZWlnaHQ6dC5oZWlnaHQsYm91bmRpbmdTcGhlcmUzRDpuLmJvdW5kaW5nU3BoZXJlM0Qsb3JpZW50ZWRCb3VuZGluZ0JveDpuLm9yaWVudGVkQm91bmRpbmdCb3gsb2NjbHVkZWVQb2ludEluU2NhbGVkU3BhY2U6bi5vY2NsdWRlZVBvaW50SW5TY2FsZWRTcGFjZSxlbmNvZGluZzpuLmVuY29kaW5nLHdlc3RJbmRpY2VzU291dGhUb05vcnRoOm4ud2VzdEluZGljZXNTb3V0aFRvTm9ydGgsc291dGhJbmRpY2VzRWFzdFRvV2VzdDpuLnNvdXRoSW5kaWNlc0Vhc3RUb1dlc3QsZWFzdEluZGljZXNOb3J0aFRvU291dGg6bi5lYXN0SW5kaWNlc05vcnRoVG9Tb3V0aCxub3J0aEluZGljZXNXZXN0VG9FYXN0Om4ubm9ydGhJbmRpY2VzV2VzdFRvRWFzdH19dmFyIHQyLG1VLGxnPVooKCk9PntadCgpOyRSKCk7UVIoKTt3bigpO0pyKCk7dDI9ZHIoSlIoKSwxKTtzbygpO21VPVFlKGRVKX0pO2Z1bmN0aW9uIFZvKCl7Qi50aHJvd0luc3RhbnRpYXRpb25FcnJvcigpfWZ1bmN0aW9uIHIyKHQsZSl7bGV0IG49bmV3IEFycmF5KGUpLG89bmV3IEFycmF5KHQpLHI9bmV3IEFycmF5KGUpLGk9bmV3IEFycmF5KHQpLHM7Zm9yKHM9MDtzPHQ7KytzKWlbc109cyxvW3NdPXQqZS0xLXM7Zm9yKHM9MDtzPGU7KytzKXJbc109KHMrMSkqdC0xLG5bc109KGUtcy0xKSp0O3JldHVybnt3ZXN0SW5kaWNlc1NvdXRoVG9Ob3J0aDpuLHNvdXRoSW5kaWNlc0Vhc3RUb1dlc3Q6byxlYXN0SW5kaWNlc05vcnRoVG9Tb3V0aDpyLG5vcnRoSW5kaWNlc1dlc3RUb0Vhc3Q6aX19ZnVuY3Rpb24gaTIodCxlLG4sbyl7bGV0IHI9MDtmb3IobGV0IGk9MDtpPGUtMTsrK2kpe2ZvcihsZXQgcz0wO3M8dC0xOysrcyl7bGV0IGY9cix1PWYrdCxjPXUrMSxsPWYrMTtuW28rK109ZixuW28rK109dSxuW28rK109bCxuW28rK109bCxuW28rK109dSxuW28rK109YywrK3J9KytyfX1mdW5jdGlvbiBRZCh0LGUsbixvKXtsZXQgcj10WzBdLGk9dC5sZW5ndGg7Zm9yKGxldCBzPTE7czxpOysrcyl7bGV0IGY9dFtzXTtuW28rK109cixuW28rK109ZixuW28rK109ZSxuW28rK109ZSxuW28rK109ZixuW28rK109ZSsxLHI9ZiwrK2V9cmV0dXJuIG99dmFyIGUyLG4yLG8yLHMyLGMyPVooKCk9PntmdCgpO0h0KCk7JGUoKTtXdCgpO09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKFZvLnByb3RvdHlwZSx7ZXJyb3JFdmVudDp7Z2V0OkIudGhyb3dJbnN0YW50aWF0aW9uRXJyb3J9LGNyZWRpdDp7Z2V0OkIudGhyb3dJbnN0YW50aWF0aW9uRXJyb3J9LHRpbGluZ1NjaGVtZTp7Z2V0OkIudGhyb3dJbnN0YW50aWF0aW9uRXJyb3J9LGhhc1dhdGVyTWFzazp7Z2V0OkIudGhyb3dJbnN0YW50aWF0aW9uRXJyb3J9LGhhc1ZlcnRleE5vcm1hbHM6e2dldDpCLnRocm93SW5zdGFudGlhdGlvbkVycm9yfSxhdmFpbGFiaWxpdHk6e2dldDpCLnRocm93SW5zdGFudGlhdGlvbkVycm9yfX0pO2UyPVtdO1ZvLmdldFJlZ3VsYXJHcmlkSW5kaWNlcz1mdW5jdGlvbih0LGUpe2lmKHQqZT49TS5GT1VSX0dJR0FCWVRFUyl0aHJvdyBuZXcgQigiVGhlIHRvdGFsIG51bWJlciBvZiB2ZXJ0aWNlcyAod2lkdGggKiBoZWlnaHQpIG11c3QgYmUgbGVzcyB0aGFuIDQsMjk0LDk2NywyOTYuIik7bGV0IG49ZTJbdF07aChuKXx8KGUyW3RdPW49W10pO2xldCBvPW5bZV07cmV0dXJuIGgobyl8fCh0KmU8TS5TSVhUWV9GT1VSX0tJTE9CWVRFUz9vPW5bZV09bmV3IFVpbnQxNkFycmF5KCh0LTEpKihlLTEpKjYpOm89bltlXT1uZXcgVWludDMyQXJyYXkoKHQtMSkqKGUtMSkqNiksaTIodCxlLG8sMCkpLG99O24yPVtdO1ZvLmdldFJlZ3VsYXJHcmlkSW5kaWNlc0FuZEVkZ2VJbmRpY2VzPWZ1bmN0aW9uKHQsZSl7aWYodCplPj1NLkZPVVJfR0lHQUJZVEVTKXRocm93IG5ldyBCKCJUaGUgdG90YWwgbnVtYmVyIG9mIHZlcnRpY2VzICh3aWR0aCAqIGhlaWdodCkgbXVzdCBiZSBsZXNzIHRoYW4gNCwyOTQsOTY3LDI5Ni4iKTtsZXQgbj1uMlt0XTtoKG4pfHwobjJbdF09bj1bXSk7bGV0IG89bltlXTtpZighaChvKSl7bGV0IHI9Vm8uZ2V0UmVndWxhckdyaWRJbmRpY2VzKHQsZSksaT1yMih0LGUpLHM9aS53ZXN0SW5kaWNlc1NvdXRoVG9Ob3J0aCxmPWkuc291dGhJbmRpY2VzRWFzdFRvV2VzdCx1PWkuZWFzdEluZGljZXNOb3J0aFRvU291dGgsYz1pLm5vcnRoSW5kaWNlc1dlc3RUb0Vhc3Q7bz1uW2VdPXtpbmRpY2VzOnIsd2VzdEluZGljZXNTb3V0aFRvTm9ydGg6cyxzb3V0aEluZGljZXNFYXN0VG9XZXN0OmYsZWFzdEluZGljZXNOb3J0aFRvU291dGg6dSxub3J0aEluZGljZXNXZXN0VG9FYXN0OmN9fXJldHVybiBvfTtvMj1bXTtWby5nZXRSZWd1bGFyR3JpZEFuZFNraXJ0SW5kaWNlc0FuZEVkZ2VJbmRpY2VzPWZ1bmN0aW9uKHQsZSl7aWYodCplPj1NLkZPVVJfR0lHQUJZVEVTKXRocm93IG5ldyBCKCJUaGUgdG90YWwgbnVtYmVyIG9mIHZlcnRpY2VzICh3aWR0aCAqIGhlaWdodCkgbXVzdCBiZSBsZXNzIHRoYW4gNCwyOTQsOTY3LDI5Ni4iKTtsZXQgbj1vMlt0XTtoKG4pfHwobzJbdF09bj1bXSk7bGV0IG89bltlXTtpZighaChvKSl7bGV0IHI9dCplLGk9KHQtMSkqKGUtMSkqNixzPXQqMitlKjIsZj1NYXRoLm1heCgwLHMtNCkqNix1PXIrcyxjPWkrZixsPXIyKHQsZSkscD1sLndlc3RJbmRpY2VzU291dGhUb05vcnRoLGQ9bC5zb3V0aEluZGljZXNFYXN0VG9XZXN0LG09bC5lYXN0SW5kaWNlc05vcnRoVG9Tb3V0aCxfPWwubm9ydGhJbmRpY2VzV2VzdFRvRWFzdCxnPUR0LmNyZWF0ZVR5cGVkQXJyYXkodSxjKTtpMih0LGUsZywwKSxWby5hZGRTa2lydEluZGljZXMocCxkLG0sXyxyLGcsaSksbz1uW2VdPXtpbmRpY2VzOmcsd2VzdEluZGljZXNTb3V0aFRvTm9ydGg6cCxzb3V0aEluZGljZXNFYXN0VG9XZXN0OmQsZWFzdEluZGljZXNOb3J0aFRvU291dGg6bSxub3J0aEluZGljZXNXZXN0VG9FYXN0Ol8saW5kZXhDb3VudFdpdGhvdXRTa2lydHM6aX19cmV0dXJuIG99O1ZvLmFkZFNraXJ0SW5kaWNlcz1mdW5jdGlvbih0LGUsbixvLHIsaSxzKXtsZXQgZj1yO3M9UWQodCxmLGkscyksZis9dC5sZW5ndGgscz1RZChlLGYsaSxzKSxmKz1lLmxlbmd0aCxzPVFkKG4sZixpLHMpLGYrPW4ubGVuZ3RoLFFkKG8sZixpLHMpfTtWby5oZWlnaHRtYXBUZXJyYWluUXVhbGl0eT0uMjU7Vm8uZ2V0RXN0aW1hdGVkTGV2ZWxaZXJvR2VvbWV0cmljRXJyb3JGb3JBSGVpZ2h0bWFwPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gdC5tYXhpbXVtUmFkaXVzKjIqTWF0aC5QSSpWby5oZWlnaHRtYXBUZXJyYWluUXVhbGl0eS8oZSpuKX07Vm8ucHJvdG90eXBlLnJlcXVlc3RUaWxlR2VvbWV0cnk9Qi50aHJvd0luc3RhbnRpYXRpb25FcnJvcjtWby5wcm90b3R5cGUuZ2V0TGV2ZWxNYXhpbXVtR2VvbWV0cmljRXJyb3I9Qi50aHJvd0luc3RhbnRpYXRpb25FcnJvcjtWby5wcm90b3R5cGUuZ2V0VGlsZURhdGFBdmFpbGFibGU9Qi50aHJvd0luc3RhbnRpYXRpb25FcnJvcjtWby5wcm90b3R5cGUubG9hZFRpbGVEYXRhQXZhaWxhYmlsaXR5PUIudGhyb3dJbnN0YW50aWF0aW9uRXJyb3I7czI9Vm99KTt2YXIgZGc9e307ZGUoZGcse2RlZmF1bHQ6KCk9PmdVfSk7ZnVuY3Rpb24geVUodCxlKXtsZXQgbj10LnF1YW50aXplZFZlcnRpY2VzLG89bi5sZW5ndGgvMyxyPXQub2N0RW5jb2RlZE5vcm1hbHMsaT10Lndlc3RJbmRpY2VzLmxlbmd0aCt0LmVhc3RJbmRpY2VzLmxlbmd0aCt0LnNvdXRoSW5kaWNlcy5sZW5ndGgrdC5ub3J0aEluZGljZXMubGVuZ3RoLHM9dC5pbmNsdWRlV2ViTWVyY2F0b3JULGY9dC5leGFnZ2VyYXRpb24sdT10LmV4YWdnZXJhdGlvblJlbGF0aXZlSGVpZ2h0LGw9ZiE9PTEscD1OdC5jbG9uZSh0LnJlY3RhbmdsZSksZD1wLndlc3QsbT1wLnNvdXRoLF89cC5lYXN0LGc9cC5ub3J0aCxiPSQuY2xvbmUodC5lbGxpcHNvaWQpLFQ9dC5taW5pbXVtSGVpZ2h0LE89dC5tYXhpbXVtSGVpZ2h0LEU9dC5yZWxhdGl2ZVRvQ2VudGVyLHc9WG8uZWFzdE5vcnRoVXBUb0ZpeGVkRnJhbWUoRSxiKSxDPXN0LmludmVyc2VUcmFuc2Zvcm1hdGlvbih3LG5ldyBzdCksTixJO3MmJihOPW5vLmdlb2RldGljTGF0aXR1ZGVUb01lcmNhdG9yQW5nbGUobSksST0xLyhuby5nZW9kZXRpY0xhdGl0dWRlVG9NZXJjYXRvckFuZ2xlKGcpLU4pKTtsZXQgRD1uLnN1YmFycmF5KDAsbyksdj1uLnN1YmFycmF5KG8sMipvKSxMPW4uc3ViYXJyYXkobyoyLDMqbyksVT1oKHIpLEE9bmV3IEFycmF5KG8pLFM9bmV3IEFycmF5KG8pLFA9bmV3IEFycmF5KG8pLEY9cz9uZXcgQXJyYXkobyk6W10saj1sP25ldyBBcnJheShvKTpbXSxIPWhVO0gueD1OdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFksSC55PU51bWJlci5QT1NJVElWRV9JTkZJTklUWSxILno9TnVtYmVyLlBPU0lUSVZFX0lORklOSVRZO2xldCBrPV9VO2sueD1OdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFksay55PU51bWJlci5ORUdBVElWRV9JTkZJTklUWSxrLno9TnVtYmVyLk5FR0FUSVZFX0lORklOSVRZO2xldCBLPU51bWJlci5QT1NJVElWRV9JTkZJTklUWSxYPU51bWJlci5ORUdBVElWRV9JTkZJTklUWSxSPU51bWJlci5QT1NJVElWRV9JTkZJTklUWSxvdD1OdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFk7Zm9yKGxldCAkdD0wOyR0PG87KyskdCl7bGV0IEdlPURbJHRdLGRuPXZbJHRdLHNuPUdlL3BnLG1uPWRuL3BnLGZvPU0ubGVycChULE8sTFskdF0vcGcpO1puLmxvbmdpdHVkZT1NLmxlcnAoZCxfLHNuKSxabi5sYXRpdHVkZT1NLmxlcnAobSxnLG1uKSxabi5oZWlnaHQ9Zm8sSz1NYXRoLm1pbihabi5sb25naXR1ZGUsSyksWD1NYXRoLm1heChabi5sb25naXR1ZGUsWCksUj1NYXRoLm1pbihabi5sYXRpdHVkZSxSKSxvdD1NYXRoLm1heChabi5sYXRpdHVkZSxvdCk7bGV0IEhuPWIuY2FydG9ncmFwaGljVG9DYXJ0ZXNpYW4oWm4pO0FbJHRdPW5ldyB0dChzbixtbiksU1skdF09Zm8sUFskdF09SG4scyYmKEZbJHRdPShuby5nZW9kZXRpY0xhdGl0dWRlVG9NZXJjYXRvckFuZ2xlKFpuLmxhdGl0dWRlKS1OKSpJKSxsJiYoalskdF09Yi5nZW9kZXRpY1N1cmZhY2VOb3JtYWwoSG4pKSxzdC5tdWx0aXBseUJ5UG9pbnQoQyxIbixmdSksYS5taW5pbXVtQnlDb21wb25lbnQoZnUsSCxIKSxhLm1heGltdW1CeUNvbXBvbmVudChmdSxrLGspfWxldCBhdD1lbSh0Lndlc3RJbmRpY2VzLGZ1bmN0aW9uKCR0LEdlKXtyZXR1cm4gQVskdF0ueS1BW0dlXS55fSkscHQ9ZW0odC5lYXN0SW5kaWNlcyxmdW5jdGlvbigkdCxHZSl7cmV0dXJuIEFbR2VdLnktQVskdF0ueX0pLHl0PWVtKHQuc291dGhJbmRpY2VzLGZ1bmN0aW9uKCR0LEdlKXtyZXR1cm4gQVtHZV0ueC1BWyR0XS54fSkscnQ9ZW0odC5ub3J0aEluZGljZXMsZnVuY3Rpb24oJHQsR2Upe3JldHVybiBBWyR0XS54LUFbR2VdLnh9KSxQdDtUPDAmJihQdD1uZXcgeHMoYikuY29tcHV0ZUhvcml6b25DdWxsaW5nUG9pbnRQb3NzaWJseVVuZGVyRWxsaXBzb2lkKEUsUCxUKSk7bGV0IGd0PVQ7Z3Q9TWF0aC5taW4oZ3QsSmQodC53ZXN0SW5kaWNlcyx0Lndlc3RTa2lydEhlaWdodCxTLEEscCxiLEMsSCxrKSksZ3Q9TWF0aC5taW4oZ3QsSmQodC5zb3V0aEluZGljZXMsdC5zb3V0aFNraXJ0SGVpZ2h0LFMsQSxwLGIsQyxILGspKSxndD1NYXRoLm1pbihndCxKZCh0LmVhc3RJbmRpY2VzLHQuZWFzdFNraXJ0SGVpZ2h0LFMsQSxwLGIsQyxILGspKSxndD1NYXRoLm1pbihndCxKZCh0Lm5vcnRoSW5kaWNlcyx0Lm5vcnRoU2tpcnRIZWlnaHQsUyxBLHAsYixDLEgsaykpO2xldCBDdD1uZXcgRGkoSCxrLEUpLG10PW5ldyBQcyhFLEN0LGd0LE8sdyxVLHMsbCxmLHUpLHV0PW10LnN0cmlkZSx2dD1vKnV0K2kqdXQsenQ9bmV3IEZsb2F0MzJBcnJheSh2dCksbWU9MDtmb3IobGV0ICR0PTA7JHQ8bzsrKyR0KXtpZihVKXtsZXQgR2U9JHQqMjtVYS54PXJbR2VdLFVhLnk9cltHZSsxXX1tZT1tdC5lbmNvZGUoenQsbWUsUFskdF0sQVskdF0sU1skdF0sVWEsRlskdF0salskdF0pfWxldCBjZT1NYXRoLm1heCgwLChpLTQpKjIpLHBlPXQuaW5kaWNlcy5sZW5ndGgrY2UqMyx1ZT1EdC5jcmVhdGVUeXBlZEFycmF5KG8raSxwZSk7dWUuc2V0KHQuaW5kaWNlcywwKTtsZXQgUXQ9MWUtNCxKdD0oWC1LKSpRdCxOZT0ob3QtUikqUXQsZ2U9LUp0LEVlPTAsdW49SnQsa2U9MCxiZT0wLGxuPU5lLHBuPTAsRW49LU5lLHJlPW8qdXQ7cmV0dXJuIHRtKHp0LHJlLGF0LG10LFMsQSxyLGIscCx0Lndlc3RTa2lydEhlaWdodCxOLEksZ2UsRWUpLHJlKz10Lndlc3RJbmRpY2VzLmxlbmd0aCp1dCx0bSh6dCxyZSx5dCxtdCxTLEEscixiLHAsdC5zb3V0aFNraXJ0SGVpZ2h0LE4sSSxwbixFbikscmUrPXQuc291dGhJbmRpY2VzLmxlbmd0aCp1dCx0bSh6dCxyZSxwdCxtdCxTLEEscixiLHAsdC5lYXN0U2tpcnRIZWlnaHQsTixJLHVuLGtlKSxyZSs9dC5lYXN0SW5kaWNlcy5sZW5ndGgqdXQsdG0oenQscmUscnQsbXQsUyxBLHIsYixwLHQubm9ydGhTa2lydEhlaWdodCxOLEksYmUsbG4pLHMyLmFkZFNraXJ0SW5kaWNlcyhhdCx5dCxwdCxydCxvLHVlLHQuaW5kaWNlcy5sZW5ndGgpLGUucHVzaCh6dC5idWZmZXIsdWUuYnVmZmVyKSx7dmVydGljZXM6enQuYnVmZmVyLGluZGljZXM6dWUuYnVmZmVyLHdlc3RJbmRpY2VzU291dGhUb05vcnRoOmF0LHNvdXRoSW5kaWNlc0Vhc3RUb1dlc3Q6eXQsZWFzdEluZGljZXNOb3J0aFRvU291dGg6cHQsbm9ydGhJbmRpY2VzV2VzdFRvRWFzdDpydCx2ZXJ0ZXhTdHJpZGU6dXQsY2VudGVyOkUsbWluaW11bUhlaWdodDpULG1heGltdW1IZWlnaHQ6TyxvY2NsdWRlZVBvaW50SW5TY2FsZWRTcGFjZTpQdCxlbmNvZGluZzptdCxpbmRleENvdW50V2l0aG91dFNraXJ0czp0LmluZGljZXMubGVuZ3RofX1mdW5jdGlvbiBKZCh0LGUsbixvLHIsaSxzLGYsdSl7bGV0IGM9TnVtYmVyLlBPU0lUSVZFX0lORklOSVRZLGw9ci5ub3J0aCxwPXIuc291dGgsZD1yLmVhc3QsbT1yLndlc3Q7ZDxtJiYoZCs9TS5UV09fUEkpO2xldCBfPXQubGVuZ3RoO2ZvcihsZXQgZz0wO2c8XzsrK2cpe2xldCBiPXRbZ10sVD1uW2JdLE89b1tiXTtabi5sb25naXR1ZGU9TS5sZXJwKG0sZCxPLngpLFpuLmxhdGl0dWRlPU0ubGVycChwLGwsTy55KSxabi5oZWlnaHQ9VC1lO2xldCBFPWkuY2FydG9ncmFwaGljVG9DYXJ0ZXNpYW4oWm4sZnUpO3N0Lm11bHRpcGx5QnlQb2ludChzLEUsRSksYS5taW5pbXVtQnlDb21wb25lbnQoRSxmLGYpLGEubWF4aW11bUJ5Q29tcG9uZW50KEUsdSx1KSxjPU1hdGgubWluKGMsWm4uaGVpZ2h0KX1yZXR1cm4gY31mdW5jdGlvbiB0bSh0LGUsbixvLHIsaSxzLGYsdSxjLGwscCxkLG0pe2xldCBfPWgocyksZz11Lm5vcnRoLGI9dS5zb3V0aCxUPXUuZWFzdCxPPXUud2VzdDtUPE8mJihUKz1NLlRXT19QSSk7bGV0IEU9bi5sZW5ndGg7Zm9yKGxldCB3PTA7dzxFOysrdyl7bGV0IEM9blt3XSxOPXJbQ10sST1pW0NdO1puLmxvbmdpdHVkZT1NLmxlcnAoTyxULEkueCkrZCxabi5sYXRpdHVkZT1NLmxlcnAoYixnLEkueSkrbSxabi5oZWlnaHQ9Ti1jO2xldCBEPWYuY2FydG9ncmFwaGljVG9DYXJ0ZXNpYW4oWm4sZnUpO2lmKF8pe2xldCBVPUMqMjtVYS54PXNbVV0sVWEueT1zW1UrMV19bGV0IHY7by5oYXNXZWJNZXJjYXRvclQmJih2PShuby5nZW9kZXRpY0xhdGl0dWRlVG9NZXJjYXRvckFuZ2xlKFpuLmxhdGl0dWRlKS1sKSpwKTtsZXQgTDtvLmhhc0dlb2RldGljU3VyZmFjZU5vcm1hbHMmJihMPWYuZ2VvZGV0aWNTdXJmYWNlTm9ybWFsKEQpKSxlPW8uZW5jb2RlKHQsZSxELEksWm4uaGVpZ2h0LFVhLHYsTCl9fWZ1bmN0aW9uIGVtKHQsZSl7bGV0IG47cmV0dXJuIHR5cGVvZiB0LnNsaWNlPT0iZnVuY3Rpb24iJiYobj10LnNsaWNlKCksdHlwZW9mIG4uc29ydCE9ImZ1bmN0aW9uIiYmKG49dm9pZCAwKSksaChuKXx8KG49QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwodCkpLG4uc29ydChlKSxufXZhciBwZyxmdSxoVSxfVSxabixVYSxnVSxtZz1aKCgpPT57eGYoKTtVZSgpO0Z0KCk7SWUoKTtmdCgpO1p0KCk7c3UoKTskZSgpO1d0KCk7VW4oKTt3bigpO2N1KCk7YzIoKTtjcygpO2ljKCk7c28oKTtwZz0zMjc2NyxmdT1uZXcgYSxoVT1uZXcgYSxfVT1uZXcgYSxabj1uZXcgY3QsVWE9bmV3IHR0O2dVPVFlKHlVKX0pO2Z1bmN0aW9uIEFVKHQsZSl7cmV0dXJuIE0uZXF1YWxzRXBzaWxvbih0LmxhdGl0dWRlLGUubGF0aXR1ZGUsTS5FUFNJTE9OMTApJiZNLmVxdWFsc0Vwc2lsb24odC5sb25naXR1ZGUsZS5sb25naXR1ZGUsTS5FUFNJTE9OMTApfWZ1bmN0aW9uIHdVKHQsZSxuLG8pe2U9eG4oZSxhLmVxdWFsc0Vwc2lsb24pO2xldCByPWUubGVuZ3RoO2lmKHI8MilyZXR1cm47bGV0IGk9aChvKSxzPWgobiksZj1uZXcgQXJyYXkociksdT1uZXcgQXJyYXkociksYz1uZXcgQXJyYXkociksbD1lWzBdO2ZbMF09bDtsZXQgcD10LmNhcnRlc2lhblRvQ2FydG9ncmFwaGljKGwsYlUpO3MmJihwLmhlaWdodD1uWzBdKSx1WzBdPXAuaGVpZ2h0LGk/Y1swXT1vWzBdOmNbMF09MDtsZXQgZD11WzBdLG09Y1swXSxfPWQ9PT1tLGc9MTtmb3IobGV0IGI9MTtiPHI7KytiKXtsZXQgVD1lW2JdLE89dC5jYXJ0ZXNpYW5Ub0NhcnRvZ3JhcGhpYyhULFRVKTtzJiYoTy5oZWlnaHQ9bltiXSksXz1fJiZPLmhlaWdodD09PTAsQVUocCxPKT9wLmhlaWdodDxPLmhlaWdodCYmKHVbZy0xXT1PLmhlaWdodCk6KGZbZ109VCx1W2ddPU8uaGVpZ2h0LGk/Y1tnXT1vW2JdOmNbZ109MCxfPV8mJnVbZ109PT1jW2ddLGN0LmNsb25lKE8scCksKytnKX1pZighKF98fGc8MikpcmV0dXJuIGYubGVuZ3RoPWcsdS5sZW5ndGg9ZyxjLmxlbmd0aD1nLHtwb3NpdGlvbnM6Zix0b3BIZWlnaHRzOnUsYm90dG9tSGVpZ2h0czpjfX12YXIgYTIsYlUsVFUsT1UsRVUsUlUsbm0saGc9WigoKT0+e2pyKCk7RnQoKTtJZSgpO2Z0KCk7V3QoKTt5YSgpO2EyPXt9O2JVPW5ldyBjdCxUVT1uZXcgY3Q7T1U9bmV3IEFycmF5KDIpLEVVPW5ldyBBcnJheSgyKSxSVT17cG9zaXRpb25zOnZvaWQgMCxoZWlnaHQ6dm9pZCAwLGdyYW51bGFyaXR5OnZvaWQgMCxlbGxpcHNvaWQ6dm9pZCAwfTthMi5jb21wdXRlUG9zaXRpb25zPWZ1bmN0aW9uKHQsZSxuLG8scixpKXtsZXQgcz13VSh0LGUsbixvKTtpZighaChzKSlyZXR1cm47ZT1zLnBvc2l0aW9ucyxuPXMudG9wSGVpZ2h0cyxvPXMuYm90dG9tSGVpZ2h0cztsZXQgZj1lLmxlbmd0aCx1PWYtMixjLGwscD1NLmNob3JkTGVuZ3RoKHIsdC5tYXhpbXVtUmFkaXVzKSxkPVJVO2lmKGQubWluRGlzdGFuY2U9cCxkLmVsbGlwc29pZD10LGkpe2xldCBtPTAsXztmb3IoXz0wO188Zi0xO18rKyltKz1Bbi5udW1iZXJPZlBvaW50cyhlW19dLGVbXysxXSxwKSsxO2M9bmV3IEZsb2F0NjRBcnJheShtKjMpLGw9bmV3IEZsb2F0NjRBcnJheShtKjMpO2xldCBnPU9VLGI9RVU7ZC5wb3NpdGlvbnM9ZyxkLmhlaWdodD1iO2xldCBUPTA7Zm9yKF89MDtfPGYtMTtfKyspe2dbMF09ZVtfXSxnWzFdPWVbXysxXSxiWzBdPW5bX10sYlsxXT1uW18rMV07bGV0IE89QW4uZ2VuZXJhdGVBcmMoZCk7Yy5zZXQoTyxUKSxiWzBdPW9bX10sYlsxXT1vW18rMV0sbC5zZXQoQW4uZ2VuZXJhdGVBcmMoZCksVCksVCs9Ty5sZW5ndGh9fWVsc2UgZC5wb3NpdGlvbnM9ZSxkLmhlaWdodD1uLGM9bmV3IEZsb2F0NjRBcnJheShBbi5nZW5lcmF0ZUFyYyhkKSksZC5oZWlnaHQ9byxsPW5ldyBGbG9hdDY0QXJyYXkoQW4uZ2VuZXJhdGVBcmMoZCkpO3JldHVybntib3R0b21Qb3NpdGlvbnM6bCx0b3BQb3NpdGlvbnM6YyxudW1Db3JuZXJzOnV9fTtubT1hMn0pO2Z1bmN0aW9uIEVjKHQpe3Q9eCh0LHguRU1QVFlfT0JKRUNUKTtsZXQgZT10LnBvc2l0aW9ucyxuPXQubWF4aW11bUhlaWdodHMsbz10Lm1pbmltdW1IZWlnaHRzO2lmKCFoKGUpKXRocm93IG5ldyBCKCJvcHRpb25zLnBvc2l0aW9ucyBpcyByZXF1aXJlZC4iKTtpZihoKG4pJiZuLmxlbmd0aCE9PWUubGVuZ3RoKXRocm93IG5ldyBCKCJvcHRpb25zLnBvc2l0aW9ucyBhbmQgb3B0aW9ucy5tYXhpbXVtSGVpZ2h0cyBtdXN0IGhhdmUgdGhlIHNhbWUgbGVuZ3RoLiIpO2lmKGgobykmJm8ubGVuZ3RoIT09ZS5sZW5ndGgpdGhyb3cgbmV3IEIoIm9wdGlvbnMucG9zaXRpb25zIGFuZCBvcHRpb25zLm1pbmltdW1IZWlnaHRzIG11c3QgaGF2ZSB0aGUgc2FtZSBsZW5ndGguIik7bGV0IHI9eCh0LnZlcnRleEZvcm1hdCxkdC5ERUZBVUxUKSxpPXgodC5ncmFudWxhcml0eSxNLlJBRElBTlNfUEVSX0RFR1JFRSkscz14KHQuZWxsaXBzb2lkLCQuZGVmYXVsdCk7dGhpcy5fcG9zaXRpb25zPWUsdGhpcy5fbWluaW11bUhlaWdodHM9byx0aGlzLl9tYXhpbXVtSGVpZ2h0cz1uLHRoaXMuX3ZlcnRleEZvcm1hdD1kdC5jbG9uZShyKSx0aGlzLl9ncmFudWxhcml0eT1pLHRoaXMuX2VsbGlwc29pZD0kLmNsb25lKHMpLHRoaXMuX3dvcmtlck5hbWU9ImNyZWF0ZVdhbGxHZW9tZXRyeSI7bGV0IGY9MStlLmxlbmd0aCphLnBhY2tlZExlbmd0aCsyO2gobykmJihmKz1vLmxlbmd0aCksaChuKSYmKGYrPW4ubGVuZ3RoKSx0aGlzLnBhY2tlZExlbmd0aD1mKyQucGFja2VkTGVuZ3RoK2R0LnBhY2tlZExlbmd0aCsxfXZhciBfZyxvbSxTVSxmMixDVSx4VSxQVSx1MixsMix1dSx5ZyxwMj1aKCgpPT57dmUoKTtGdCgpO0ZlKCk7SXQoKTtmdCgpO0h0KCk7WnQoKTtYZSgpO1llKCk7YW4oKTskZSgpO1d0KCk7dG4oKTtSbygpO2hnKCk7X2c9bmV3IGEsb209bmV3IGEsU1U9bmV3IGEsZjI9bmV3IGEsQ1U9bmV3IGEseFU9bmV3IGEsUFU9bmV3IGE7RWMucGFjaz1mdW5jdGlvbih0LGUsbil7aWYoIWgodCkpdGhyb3cgbmV3IEIoInZhbHVlIGlzIHJlcXVpcmVkIik7aWYoIWgoZSkpdGhyb3cgbmV3IEIoImFycmF5IGlzIHJlcXVpcmVkIik7bj14KG4sMCk7bGV0IG8scj10Ll9wb3NpdGlvbnMsaT1yLmxlbmd0aDtmb3IoZVtuKytdPWksbz0wO288aTsrK28sbis9YS5wYWNrZWRMZW5ndGgpYS5wYWNrKHJbb10sZSxuKTtsZXQgcz10Ll9taW5pbXVtSGVpZ2h0cztpZihpPWgocyk/cy5sZW5ndGg6MCxlW24rK109aSxoKHMpKWZvcihvPTA7bzxpOysrbyllW24rK109c1tvXTtsZXQgZj10Ll9tYXhpbXVtSGVpZ2h0cztpZihpPWgoZik/Zi5sZW5ndGg6MCxlW24rK109aSxoKGYpKWZvcihvPTA7bzxpOysrbyllW24rK109ZltvXTtyZXR1cm4gJC5wYWNrKHQuX2VsbGlwc29pZCxlLG4pLG4rPSQucGFja2VkTGVuZ3RoLGR0LnBhY2sodC5fdmVydGV4Rm9ybWF0LGUsbiksbis9ZHQucGFja2VkTGVuZ3RoLGVbbl09dC5fZ3JhbnVsYXJpdHksZX07dTI9JC5jbG9uZSgkLlVOSVRfU1BIRVJFKSxsMj1uZXcgZHQsdXU9e3Bvc2l0aW9uczp2b2lkIDAsbWluaW11bUhlaWdodHM6dm9pZCAwLG1heGltdW1IZWlnaHRzOnZvaWQgMCxlbGxpcHNvaWQ6dTIsdmVydGV4Rm9ybWF0OmwyLGdyYW51bGFyaXR5OnZvaWQgMH07RWMudW5wYWNrPWZ1bmN0aW9uKHQsZSxuKXtpZighaCh0KSl0aHJvdyBuZXcgQigiYXJyYXkgaXMgcmVxdWlyZWQiKTtlPXgoZSwwKTtsZXQgbyxyPXRbZSsrXSxpPW5ldyBBcnJheShyKTtmb3Iobz0wO288cjsrK28sZSs9YS5wYWNrZWRMZW5ndGgpaVtvXT1hLnVucGFjayh0LGUpO3I9dFtlKytdO2xldCBzO2lmKHI+MClmb3Iocz1uZXcgQXJyYXkociksbz0wO288cjsrK28pc1tvXT10W2UrK107cj10W2UrK107bGV0IGY7aWYocj4wKWZvcihmPW5ldyBBcnJheShyKSxvPTA7bzxyOysrbylmW29dPXRbZSsrXTtsZXQgdT0kLnVucGFjayh0LGUsdTIpO2UrPSQucGFja2VkTGVuZ3RoO2xldCBjPWR0LnVucGFjayh0LGUsbDIpO2UrPWR0LnBhY2tlZExlbmd0aDtsZXQgbD10W2VdO3JldHVybiBoKG4pPyhuLl9wb3NpdGlvbnM9aSxuLl9taW5pbXVtSGVpZ2h0cz1zLG4uX21heGltdW1IZWlnaHRzPWYsbi5fZWxsaXBzb2lkPSQuY2xvbmUodSxuLl9lbGxpcHNvaWQpLG4uX3ZlcnRleEZvcm1hdD1kdC5jbG9uZShjLG4uX3ZlcnRleEZvcm1hdCksbi5fZ3JhbnVsYXJpdHk9bCxuKToodXUucG9zaXRpb25zPWksdXUubWluaW11bUhlaWdodHM9cyx1dS5tYXhpbXVtSGVpZ2h0cz1mLHV1LmdyYW51bGFyaXR5PWwsbmV3IEVjKHV1KSl9O0VjLmZyb21Db25zdGFudEhlaWdodHM9ZnVuY3Rpb24odCl7dD14KHQseC5FTVBUWV9PQkpFQ1QpO2xldCBlPXQucG9zaXRpb25zO2lmKCFoKGUpKXRocm93IG5ldyBCKCJvcHRpb25zLnBvc2l0aW9ucyBpcyByZXF1aXJlZC4iKTtsZXQgbixvLHI9dC5taW5pbXVtSGVpZ2h0LGk9dC5tYXhpbXVtSGVpZ2h0LHM9aChyKSxmPWgoaSk7aWYoc3x8Zil7bGV0IGM9ZS5sZW5ndGg7bj1zP25ldyBBcnJheShjKTp2b2lkIDAsbz1mP25ldyBBcnJheShjKTp2b2lkIDA7Zm9yKGxldCBsPTA7bDxjOysrbClzJiYobltsXT1yKSxmJiYob1tsXT1pKX1sZXQgdT17cG9zaXRpb25zOmUsbWF4aW11bUhlaWdodHM6byxtaW5pbXVtSGVpZ2h0czpuLGVsbGlwc29pZDp0LmVsbGlwc29pZCx2ZXJ0ZXhGb3JtYXQ6dC52ZXJ0ZXhGb3JtYXR9O3JldHVybiBuZXcgRWModSl9O0VjLmNyZWF0ZUdlb21ldHJ5PWZ1bmN0aW9uKHQpe2xldCBlPXQuX3Bvc2l0aW9ucyxuPXQuX21pbmltdW1IZWlnaHRzLG89dC5fbWF4aW11bUhlaWdodHMscj10Ll92ZXJ0ZXhGb3JtYXQsaT10Ll9ncmFudWxhcml0eSxzPXQuX2VsbGlwc29pZCxmPW5tLmNvbXB1dGVQb3NpdGlvbnMocyxlLG8sbixpLCEwKTtpZighaChmKSlyZXR1cm47bGV0IHU9Zi5ib3R0b21Qb3NpdGlvbnMsYz1mLnRvcFBvc2l0aW9ucyxsPWYubnVtQ29ybmVycyxwPWMubGVuZ3RoLGQ9cCoyLG09ci5wb3NpdGlvbj9uZXcgRmxvYXQ2NEFycmF5KGQpOnZvaWQgMCxfPXIubm9ybWFsP25ldyBGbG9hdDMyQXJyYXkoZCk6dm9pZCAwLGc9ci50YW5nZW50P25ldyBGbG9hdDMyQXJyYXkoZCk6dm9pZCAwLGI9ci5iaXRhbmdlbnQ/bmV3IEZsb2F0MzJBcnJheShkKTp2b2lkIDAsVD1yLnN0P25ldyBGbG9hdDMyQXJyYXkoZC8zKjIpOnZvaWQgMCxPPTAsRT0wLHc9MCxDPTAsTj0wLEk9UFUsRD14VSx2PUNVLEw9ITA7cC89MztsZXQgVSxBPTAsUz0xLyhwLWwtMSk7Zm9yKFU9MDtVPHA7KytVKXtsZXQgaz1VKjMsSz1hLmZyb21BcnJheShjLGssX2cpLFg9YS5mcm9tQXJyYXkodSxrLG9tKTtpZihyLnBvc2l0aW9uJiYobVtPKytdPVgueCxtW08rK109WC55LG1bTysrXT1YLnosbVtPKytdPUsueCxtW08rK109Sy55LG1bTysrXT1LLnopLHIuc3QmJihUW04rK109QSxUW04rK109MCxUW04rK109QSxUW04rK109MSksci5ub3JtYWx8fHIudGFuZ2VudHx8ci5iaXRhbmdlbnQpe2xldCBSPWEuY2xvbmUoYS5aRVJPLGYyKSxvdD1hLnN1YnRyYWN0KEsscy5nZW9kZXRpY1N1cmZhY2VOb3JtYWwoSyxvbSksb20pO2lmKFUrMTxwJiYoUj1hLmZyb21BcnJheShjLGsrMyxmMikpLEwpe2xldCBhdD1hLnN1YnRyYWN0KFIsSyxTVSkscHQ9YS5zdWJ0cmFjdChvdCxLLF9nKTtJPWEubm9ybWFsaXplKGEuY3Jvc3MocHQsYXQsSSksSSksTD0hMX1hLmVxdWFsc0Vwc2lsb24oSyxSLE0uRVBTSUxPTjEwKT9MPSEwOihBKz1TLHIudGFuZ2VudCYmKEQ9YS5ub3JtYWxpemUoYS5zdWJ0cmFjdChSLEssRCksRCkpLHIuYml0YW5nZW50JiYodj1hLm5vcm1hbGl6ZShhLmNyb3NzKEksRCx2KSx2KSkpLHIubm9ybWFsJiYoX1tFKytdPUkueCxfW0UrK109SS55LF9bRSsrXT1JLnosX1tFKytdPUkueCxfW0UrK109SS55LF9bRSsrXT1JLnopLHIudGFuZ2VudCYmKGdbQysrXT1ELngsZ1tDKytdPUQueSxnW0MrK109RC56LGdbQysrXT1ELngsZ1tDKytdPUQueSxnW0MrK109RC56KSxyLmJpdGFuZ2VudCYmKGJbdysrXT12LngsYlt3KytdPXYueSxiW3crK109di56LGJbdysrXT12LngsYlt3KytdPXYueSxiW3crK109di56KX19bGV0IFA9bmV3IGllO3IucG9zaXRpb24mJihQLnBvc2l0aW9uPW5ldyBpdCh7Y29tcG9uZW50RGF0YXR5cGU6bnQuRE9VQkxFLGNvbXBvbmVudHNQZXJBdHRyaWJ1dGU6Myx2YWx1ZXM6bX0pKSxyLm5vcm1hbCYmKFAubm9ybWFsPW5ldyBpdCh7Y29tcG9uZW50RGF0YXR5cGU6bnQuRkxPQVQsY29tcG9uZW50c1BlckF0dHJpYnV0ZTozLHZhbHVlczpffSkpLHIudGFuZ2VudCYmKFAudGFuZ2VudD1uZXcgaXQoe2NvbXBvbmVudERhdGF0eXBlOm50LkZMT0FULGNvbXBvbmVudHNQZXJBdHRyaWJ1dGU6Myx2YWx1ZXM6Z30pKSxyLmJpdGFuZ2VudCYmKFAuYml0YW5nZW50PW5ldyBpdCh7Y29tcG9uZW50RGF0YXR5cGU6bnQuRkxPQVQsY29tcG9uZW50c1BlckF0dHJpYnV0ZTozLHZhbHVlczpifSkpLHIuc3QmJihQLnN0PW5ldyBpdCh7Y29tcG9uZW50RGF0YXR5cGU6bnQuRkxPQVQsY29tcG9uZW50c1BlckF0dHJpYnV0ZToyLHZhbHVlczpUfSkpO2xldCBGPWQvMztkLT02KihsKzEpO2xldCBqPUR0LmNyZWF0ZVR5cGVkQXJyYXkoRixkKSxIPTA7Zm9yKFU9MDtVPEYtMjtVKz0yKXtsZXQgaz1VLEs9VSsyLFg9YS5mcm9tQXJyYXkobSxrKjMsX2cpLFI9YS5mcm9tQXJyYXkobSxLKjMsb20pO2lmKGEuZXF1YWxzRXBzaWxvbihYLFIsTS5FUFNJTE9OMTApKWNvbnRpbnVlO2xldCBvdD1VKzEsYXQ9VSszO2pbSCsrXT1vdCxqW0grK109ayxqW0grK109YXQsaltIKytdPWF0LGpbSCsrXT1rLGpbSCsrXT1LfXJldHVybiBuZXcgVXQoe2F0dHJpYnV0ZXM6UCxpbmRpY2VzOmoscHJpbWl0aXZlVHlwZTpCdC5UUklBTkdMRVMsYm91bmRpbmdTcGhlcmU6bmV3IEF0LmZyb21WZXJ0aWNlcyhtKX0pfTt5Zz1FY30pO3ZhciBnZz17fTtkZShnZyx7ZGVmYXVsdDooKT0+TlV9KTtmdW5jdGlvbiBNVSh0LGUpe3JldHVybiBoKGUpJiYodD15Zy51bnBhY2sodCxlKSksdC5fZWxsaXBzb2lkPSQuY2xvbmUodC5fZWxsaXBzb2lkKSx5Zy5jcmVhdGVHZW9tZXRyeSh0KX12YXIgTlUsQWc9WigoKT0+e2Z0KCk7WnQoKTtwMigpO05VPU1VfSk7ZnVuY3Rpb24gUmModCl7dD14KHQseC5FTVBUWV9PQkpFQ1QpO2xldCBlPXQucG9zaXRpb25zLG49dC5tYXhpbXVtSGVpZ2h0cyxvPXQubWluaW11bUhlaWdodHM7aWYoIWgoZSkpdGhyb3cgbmV3IEIoIm9wdGlvbnMucG9zaXRpb25zIGlzIHJlcXVpcmVkLiIpO2lmKGgobikmJm4ubGVuZ3RoIT09ZS5sZW5ndGgpdGhyb3cgbmV3IEIoIm9wdGlvbnMucG9zaXRpb25zIGFuZCBvcHRpb25zLm1heGltdW1IZWlnaHRzIG11c3QgaGF2ZSB0aGUgc2FtZSBsZW5ndGguIik7aWYoaChvKSYmby5sZW5ndGghPT1lLmxlbmd0aCl0aHJvdyBuZXcgQigib3B0aW9ucy5wb3NpdGlvbnMgYW5kIG9wdGlvbnMubWluaW11bUhlaWdodHMgbXVzdCBoYXZlIHRoZSBzYW1lIGxlbmd0aC4iKTtsZXQgcj14KHQuZ3JhbnVsYXJpdHksTS5SQURJQU5TX1BFUl9ERUdSRUUpLGk9eCh0LmVsbGlwc29pZCwkLmRlZmF1bHQpO3RoaXMuX3Bvc2l0aW9ucz1lLHRoaXMuX21pbmltdW1IZWlnaHRzPW8sdGhpcy5fbWF4aW11bUhlaWdodHM9bix0aGlzLl9ncmFudWxhcml0eT1yLHRoaXMuX2VsbGlwc29pZD0kLmNsb25lKGkpLHRoaXMuX3dvcmtlck5hbWU9ImNyZWF0ZVdhbGxPdXRsaW5lR2VvbWV0cnkiO2xldCBzPTErZS5sZW5ndGgqYS5wYWNrZWRMZW5ndGgrMjtoKG8pJiYocys9by5sZW5ndGgpLGgobikmJihzKz1uLmxlbmd0aCksdGhpcy5wYWNrZWRMZW5ndGg9cyskLnBhY2tlZExlbmd0aCsxfXZhciBkMixtMixoMixsdSxiZyxfMj1aKCgpPT57dmUoKTtGdCgpO0ZlKCk7SXQoKTtmdCgpO0h0KCk7WnQoKTtYZSgpO1llKCk7YW4oKTskZSgpO1d0KCk7dG4oKTtoZygpO2QyPW5ldyBhLG0yPW5ldyBhO1JjLnBhY2s9ZnVuY3Rpb24odCxlLG4pe2lmKCFoKHQpKXRocm93IG5ldyBCKCJ2YWx1ZSBpcyByZXF1aXJlZCIpO2lmKCFoKGUpKXRocm93IG5ldyBCKCJhcnJheSBpcyByZXF1aXJlZCIpO249eChuLDApO2xldCBvLHI9dC5fcG9zaXRpb25zLGk9ci5sZW5ndGg7Zm9yKGVbbisrXT1pLG89MDtvPGk7KytvLG4rPWEucGFja2VkTGVuZ3RoKWEucGFjayhyW29dLGUsbik7bGV0IHM9dC5fbWluaW11bUhlaWdodHM7aWYoaT1oKHMpP3MubGVuZ3RoOjAsZVtuKytdPWksaChzKSlmb3Iobz0wO288aTsrK28pZVtuKytdPXNbb107bGV0IGY9dC5fbWF4aW11bUhlaWdodHM7aWYoaT1oKGYpP2YubGVuZ3RoOjAsZVtuKytdPWksaChmKSlmb3Iobz0wO288aTsrK28pZVtuKytdPWZbb107cmV0dXJuICQucGFjayh0Ll9lbGxpcHNvaWQsZSxuKSxuKz0kLnBhY2tlZExlbmd0aCxlW25dPXQuX2dyYW51bGFyaXR5LGV9O2gyPSQuY2xvbmUoJC5VTklUX1NQSEVSRSksbHU9e3Bvc2l0aW9uczp2b2lkIDAsbWluaW11bUhlaWdodHM6dm9pZCAwLG1heGltdW1IZWlnaHRzOnZvaWQgMCxlbGxpcHNvaWQ6aDIsZ3JhbnVsYXJpdHk6dm9pZCAwfTtSYy51bnBhY2s9ZnVuY3Rpb24odCxlLG4pe2lmKCFoKHQpKXRocm93IG5ldyBCKCJhcnJheSBpcyByZXF1aXJlZCIpO2U9eChlLDApO2xldCBvLHI9dFtlKytdLGk9bmV3IEFycmF5KHIpO2ZvcihvPTA7bzxyOysrbyxlKz1hLnBhY2tlZExlbmd0aClpW29dPWEudW5wYWNrKHQsZSk7cj10W2UrK107bGV0IHM7aWYocj4wKWZvcihzPW5ldyBBcnJheShyKSxvPTA7bzxyOysrbylzW29dPXRbZSsrXTtyPXRbZSsrXTtsZXQgZjtpZihyPjApZm9yKGY9bmV3IEFycmF5KHIpLG89MDtvPHI7KytvKWZbb109dFtlKytdO2xldCB1PSQudW5wYWNrKHQsZSxoMik7ZSs9JC5wYWNrZWRMZW5ndGg7bGV0IGM9dFtlXTtyZXR1cm4gaChuKT8obi5fcG9zaXRpb25zPWksbi5fbWluaW11bUhlaWdodHM9cyxuLl9tYXhpbXVtSGVpZ2h0cz1mLG4uX2VsbGlwc29pZD0kLmNsb25lKHUsbi5fZWxsaXBzb2lkKSxuLl9ncmFudWxhcml0eT1jLG4pOihsdS5wb3NpdGlvbnM9aSxsdS5taW5pbXVtSGVpZ2h0cz1zLGx1Lm1heGltdW1IZWlnaHRzPWYsbHUuZ3JhbnVsYXJpdHk9YyxuZXcgUmMobHUpKX07UmMuZnJvbUNvbnN0YW50SGVpZ2h0cz1mdW5jdGlvbih0KXt0PXgodCx4LkVNUFRZX09CSkVDVCk7bGV0IGU9dC5wb3NpdGlvbnM7aWYoIWgoZSkpdGhyb3cgbmV3IEIoIm9wdGlvbnMucG9zaXRpb25zIGlzIHJlcXVpcmVkLiIpO2xldCBuLG8scj10Lm1pbmltdW1IZWlnaHQsaT10Lm1heGltdW1IZWlnaHQscz1oKHIpLGY9aChpKTtpZihzfHxmKXtsZXQgYz1lLmxlbmd0aDtuPXM/bmV3IEFycmF5KGMpOnZvaWQgMCxvPWY/bmV3IEFycmF5KGMpOnZvaWQgMDtmb3IobGV0IGw9MDtsPGM7KytsKXMmJihuW2xdPXIpLGYmJihvW2xdPWkpfWxldCB1PXtwb3NpdGlvbnM6ZSxtYXhpbXVtSGVpZ2h0czpvLG1pbmltdW1IZWlnaHRzOm4sZWxsaXBzb2lkOnQuZWxsaXBzb2lkfTtyZXR1cm4gbmV3IFJjKHUpfTtSYy5jcmVhdGVHZW9tZXRyeT1mdW5jdGlvbih0KXtsZXQgZT10Ll9wb3NpdGlvbnMsbj10Ll9taW5pbXVtSGVpZ2h0cyxvPXQuX21heGltdW1IZWlnaHRzLHI9dC5fZ3JhbnVsYXJpdHksaT10Ll9lbGxpcHNvaWQscz1ubS5jb21wdXRlUG9zaXRpb25zKGksZSxvLG4sciwhMSk7aWYoIWgocykpcmV0dXJuO2xldCBmPXMuYm90dG9tUG9zaXRpb25zLHU9cy50b3BQb3NpdGlvbnMsYz11Lmxlbmd0aCxsPWMqMixwPW5ldyBGbG9hdDY0QXJyYXkobCksZD0wO2MvPTM7bGV0IG07Zm9yKG09MDttPGM7KyttKXtsZXQgTz1tKjMsRT1hLmZyb21BcnJheSh1LE8sZDIpLHc9YS5mcm9tQXJyYXkoZixPLG0yKTtwW2QrK109dy54LHBbZCsrXT13LnkscFtkKytdPXcueixwW2QrK109RS54LHBbZCsrXT1FLnkscFtkKytdPUUuen1sZXQgXz1uZXcgaWUoe3Bvc2l0aW9uOm5ldyBpdCh7Y29tcG9uZW50RGF0YXR5cGU6bnQuRE9VQkxFLGNvbXBvbmVudHNQZXJBdHRyaWJ1dGU6Myx2YWx1ZXM6cH0pfSksZz1sLzM7bD0yKmctNCtnO2xldCBiPUR0LmNyZWF0ZVR5cGVkQXJyYXkoZyxsKSxUPTA7Zm9yKG09MDttPGctMjttKz0yKXtsZXQgTz1tLEU9bSsyLHc9YS5mcm9tQXJyYXkocCxPKjMsZDIpLEM9YS5mcm9tQXJyYXkocCxFKjMsbTIpO2lmKGEuZXF1YWxzRXBzaWxvbih3LEMsTS5FUFNJTE9OMTApKWNvbnRpbnVlO2xldCBOPW0rMSxJPW0rMztiW1QrK109TixiW1QrK109TyxiW1QrK109TixiW1QrK109SSxiW1QrK109TyxiW1QrK109RX1yZXR1cm4gYltUKytdPWctMixiW1QrK109Zy0xLG5ldyBVdCh7YXR0cmlidXRlczpfLGluZGljZXM6YixwcmltaXRpdmVUeXBlOkJ0LkxJTkVTLGJvdW5kaW5nU3BoZXJlOm5ldyBBdC5mcm9tVmVydGljZXMocCl9KX07Ymc9UmN9KTt2YXIgVGc9e307ZGUoVGcse2RlZmF1bHQ6KCk9PnZVfSk7ZnVuY3Rpb24gSVUodCxlKXtyZXR1cm4gaChlKSYmKHQ9YmcudW5wYWNrKHQsZSkpLHQuX2VsbGlwc29pZD0kLmNsb25lKHQuX2VsbGlwc29pZCksYmcuY3JlYXRlR2VvbWV0cnkodCl9dmFyIHZVLHdnPVooKCk9PntmdCgpO1p0KCk7XzIoKTt2VT1JVX0pO3ZhciBSZz1YbigocHUsRWcpPT57dmFyIFZ0PVZ0fHx7fTtWdC5zY29wZT17fTtWdC5hcnJheUl0ZXJhdG9ySW1wbD1mdW5jdGlvbih0KXt2YXIgZT0wO3JldHVybiBmdW5jdGlvbigpe3JldHVybiBlPHQubGVuZ3RoP3tkb25lOiExLHZhbHVlOnRbZSsrXX06e2RvbmU6ITB9fX07VnQuYXJyYXlJdGVyYXRvcj1mdW5jdGlvbih0KXtyZXR1cm57bmV4dDpWdC5hcnJheUl0ZXJhdG9ySW1wbCh0KX19O1Z0Lm1ha2VJdGVyYXRvcj1mdW5jdGlvbih0KXt2YXIgZT10eXBlb2YgU3ltYm9sPCJ1IiYmU3ltYm9sLml0ZXJhdG9yJiZ0W1N5bWJvbC5pdGVyYXRvcl07cmV0dXJuIGU/ZS5jYWxsKHQpOlZ0LmFycmF5SXRlcmF0b3IodCl9O1Z0LkFTU1VNRV9FUzU9ITE7VnQuQVNTVU1FX05PX05BVElWRV9NQVA9ITE7VnQuQVNTVU1FX05PX05BVElWRV9TRVQ9ITE7VnQuU0lNUExFX0ZST1VORF9QT0xZRklMTD0hMTtWdC5JU09MQVRFX1BPTFlGSUxMUz0hMTtWdC5GT1JDRV9QT0xZRklMTF9QUk9NSVNFPSExO1Z0LkZPUkNFX1BPTFlGSUxMX1BST01JU0VfV0hFTl9OT19VTkhBTkRMRURfUkVKRUNUSU9OPSExO1Z0LmdldEdsb2JhbD1mdW5jdGlvbih0KXt0PVt0eXBlb2YgZ2xvYmFsVGhpcz09Im9iamVjdCImJmdsb2JhbFRoaXMsdCx0eXBlb2Ygd2luZG93PT0ib2JqZWN0IiYmd2luZG93LHR5cGVvZiBzZWxmPT0ib2JqZWN0IiYmc2VsZix0eXBlb2YgZ2xvYmFsPT0ib2JqZWN0IiYmZ2xvYmFsXTtmb3IodmFyIGU9MDtlPHQubGVuZ3RoOysrZSl7dmFyIG49dFtlXTtpZihuJiZuLk1hdGg9PU1hdGgpcmV0dXJuIG59dGhyb3cgRXJyb3IoIkNhbm5vdCBmaW5kIGdsb2JhbCBvYmplY3QiKX07VnQuZ2xvYmFsPVZ0LmdldEdsb2JhbChwdSk7VnQuZGVmaW5lUHJvcGVydHk9VnQuQVNTVU1FX0VTNXx8dHlwZW9mIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzPT0iZnVuY3Rpb24iP09iamVjdC5kZWZpbmVQcm9wZXJ0eTpmdW5jdGlvbih0LGUsbil7cmV0dXJuIHQ9PUFycmF5LnByb3RvdHlwZXx8dD09T2JqZWN0LnByb3RvdHlwZXx8KHRbZV09bi52YWx1ZSksdH07VnQuSVNfU1lNQk9MX05BVElWRT10eXBlb2YgU3ltYm9sPT0iZnVuY3Rpb24iJiZ0eXBlb2YgU3ltYm9sKCJ4Iik9PSJzeW1ib2wiO1Z0LlRSVVNUX0VTNl9QT0xZRklMTFM9IVZ0LklTT0xBVEVfUE9MWUZJTExTfHxWdC5JU19TWU1CT0xfTkFUSVZFO1Z0LnBvbHlmaWxscz17fTtWdC5wcm9wZXJ0eVRvUG9seWZpbGxTeW1ib2w9e307VnQuUE9MWUZJTExfUFJFRklYPSIkanNjcCQiO1Z0LnBvbHlmaWxsPWZ1bmN0aW9uKHQsZSxuLG8pe2UmJihWdC5JU09MQVRFX1BPTFlGSUxMUz9WdC5wb2x5ZmlsbElzb2xhdGVkKHQsZSxuLG8pOlZ0LnBvbHlmaWxsVW5pc29sYXRlZCh0LGUsbixvKSl9O1Z0LnBvbHlmaWxsVW5pc29sYXRlZD1mdW5jdGlvbih0LGUsbixvKXtmb3Iobj1WdC5nbG9iYWwsdD10LnNwbGl0KCIuIiksbz0wO288dC5sZW5ndGgtMTtvKyspe3ZhciByPXRbb107aWYoIShyIGluIG4pKXJldHVybjtuPW5bcl19dD10W3QubGVuZ3RoLTFdLG89blt0XSxlPWUobyksZSE9byYmZSE9bnVsbCYmVnQuZGVmaW5lUHJvcGVydHkobix0LHtjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6ZX0pfTtWdC5wb2x5ZmlsbElzb2xhdGVkPWZ1bmN0aW9uKHQsZSxuLG8pe3ZhciByPXQuc3BsaXQoIi4iKTt0PXIubGVuZ3RoPT09MSxvPXJbMF0sbz0hdCYmbyBpbiBWdC5wb2x5ZmlsbHM/VnQucG9seWZpbGxzOlZ0Lmdsb2JhbDtmb3IodmFyIGk9MDtpPHIubGVuZ3RoLTE7aSsrKXt2YXIgcz1yW2ldO2lmKCEocyBpbiBvKSlyZXR1cm47bz1vW3NdfXI9cltyLmxlbmd0aC0xXSxuPVZ0LklTX1NZTUJPTF9OQVRJVkUmJm49PT0iZXM2Ij9vW3JdOm51bGwsZT1lKG4pLGUhPW51bGwmJih0P1Z0LmRlZmluZVByb3BlcnR5KFZ0LnBvbHlmaWxscyxyLHtjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6ZX0pOmUhPT1uJiYoVnQucHJvcGVydHlUb1BvbHlmaWxsU3ltYm9sW3JdPT09dm9pZCAwJiYobj0xZTkqTWF0aC5yYW5kb20oKT4+PjAsVnQucHJvcGVydHlUb1BvbHlmaWxsU3ltYm9sW3JdPVZ0LklTX1NZTUJPTF9OQVRJVkU/VnQuZ2xvYmFsLlN5bWJvbChyKTpWdC5QT0xZRklMTF9QUkVGSVgrbisiJCIrciksVnQuZGVmaW5lUHJvcGVydHkobyxWdC5wcm9wZXJ0eVRvUG9seWZpbGxTeW1ib2xbcl0se2NvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTplfSkpKX07VnQucG9seWZpbGwoIlByb21pc2UiLGZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXt0aGlzLmJhdGNoXz1udWxsfWZ1bmN0aW9uIG4ocyl7cmV0dXJuIHMgaW5zdGFuY2VvZiByP3M6bmV3IHIoZnVuY3Rpb24oZix1KXtmKHMpfSl9aWYodCYmKCEoVnQuRk9SQ0VfUE9MWUZJTExfUFJPTUlTRXx8VnQuRk9SQ0VfUE9MWUZJTExfUFJPTUlTRV9XSEVOX05PX1VOSEFORExFRF9SRUpFQ1RJT04mJnR5cGVvZiBWdC5nbG9iYWwuUHJvbWlzZVJlamVjdGlvbkV2ZW50PiJ1Iil8fCFWdC5nbG9iYWwuUHJvbWlzZXx8VnQuZ2xvYmFsLlByb21pc2UudG9TdHJpbmcoKS5pbmRleE9mKCJbbmF0aXZlIGNvZGVdIik9PT0tMSkpcmV0dXJuIHQ7ZS5wcm90b3R5cGUuYXN5bmNFeGVjdXRlPWZ1bmN0aW9uKHMpe2lmKHRoaXMuYmF0Y2hfPT1udWxsKXt0aGlzLmJhdGNoXz1bXTt2YXIgZj10aGlzO3RoaXMuYXN5bmNFeGVjdXRlRnVuY3Rpb24oZnVuY3Rpb24oKXtmLmV4ZWN1dGVCYXRjaF8oKX0pfXRoaXMuYmF0Y2hfLnB1c2gocyl9O3ZhciBvPVZ0Lmdsb2JhbC5zZXRUaW1lb3V0O2UucHJvdG90eXBlLmFzeW5jRXhlY3V0ZUZ1bmN0aW9uPWZ1bmN0aW9uKHMpe28ocywwKX0sZS5wcm90b3R5cGUuZXhlY3V0ZUJhdGNoXz1mdW5jdGlvbigpe2Zvcig7dGhpcy5iYXRjaF8mJnRoaXMuYmF0Y2hfLmxlbmd0aDspe3ZhciBzPXRoaXMuYmF0Y2hfO3RoaXMuYmF0Y2hfPVtdO2Zvcih2YXIgZj0wO2Y8cy5sZW5ndGg7KytmKXt2YXIgdT1zW2ZdO3NbZl09bnVsbDt0cnl7dSgpfWNhdGNoKGMpe3RoaXMuYXN5bmNUaHJvd18oYyl9fX10aGlzLmJhdGNoXz1udWxsfSxlLnByb3RvdHlwZS5hc3luY1Rocm93Xz1mdW5jdGlvbihzKXt0aGlzLmFzeW5jRXhlY3V0ZUZ1bmN0aW9uKGZ1bmN0aW9uKCl7dGhyb3cgc30pfTt2YXIgcj1mdW5jdGlvbihzKXt0aGlzLnN0YXRlXz0wLHRoaXMucmVzdWx0Xz12b2lkIDAsdGhpcy5vblNldHRsZWRDYWxsYmFja3NfPVtdLHRoaXMuaXNSZWplY3Rpb25IYW5kbGVkXz0hMTt2YXIgZj10aGlzLmNyZWF0ZVJlc29sdmVBbmRSZWplY3RfKCk7dHJ5e3MoZi5yZXNvbHZlLGYucmVqZWN0KX1jYXRjaCh1KXtmLnJlamVjdCh1KX19O3IucHJvdG90eXBlLmNyZWF0ZVJlc29sdmVBbmRSZWplY3RfPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gcyhjKXtyZXR1cm4gZnVuY3Rpb24obCl7dXx8KHU9ITAsYy5jYWxsKGYsbCkpfX12YXIgZj10aGlzLHU9ITE7cmV0dXJue3Jlc29sdmU6cyh0aGlzLnJlc29sdmVUb18pLHJlamVjdDpzKHRoaXMucmVqZWN0Xyl9fSxyLnByb3RvdHlwZS5yZXNvbHZlVG9fPWZ1bmN0aW9uKHMpe2lmKHM9PT10aGlzKXRoaXMucmVqZWN0XyhuZXcgVHlwZUVycm9yKCJBIFByb21pc2UgY2Fubm90IHJlc29sdmUgdG8gaXRzZWxmIikpO2Vsc2UgaWYocyBpbnN0YW5jZW9mIHIpdGhpcy5zZXR0bGVTYW1lQXNQcm9taXNlXyhzKTtlbHNle3Q6c3dpdGNoKHR5cGVvZiBzKXtjYXNlIm9iamVjdCI6dmFyIGY9cyE9bnVsbDticmVhayB0O2Nhc2UiZnVuY3Rpb24iOmY9ITA7YnJlYWsgdDtkZWZhdWx0OmY9ITF9Zj90aGlzLnJlc29sdmVUb05vblByb21pc2VPYmpfKHMpOnRoaXMuZnVsZmlsbF8ocyl9fSxyLnByb3RvdHlwZS5yZXNvbHZlVG9Ob25Qcm9taXNlT2JqXz1mdW5jdGlvbihzKXt2YXIgZj12b2lkIDA7dHJ5e2Y9cy50aGVufWNhdGNoKHUpe3RoaXMucmVqZWN0Xyh1KTtyZXR1cm59dHlwZW9mIGY9PSJmdW5jdGlvbiI/dGhpcy5zZXR0bGVTYW1lQXNUaGVuYWJsZV8oZixzKTp0aGlzLmZ1bGZpbGxfKHMpfSxyLnByb3RvdHlwZS5yZWplY3RfPWZ1bmN0aW9uKHMpe3RoaXMuc2V0dGxlXygyLHMpfSxyLnByb3RvdHlwZS5mdWxmaWxsXz1mdW5jdGlvbihzKXt0aGlzLnNldHRsZV8oMSxzKX0sci5wcm90b3R5cGUuc2V0dGxlXz1mdW5jdGlvbihzLGYpe2lmKHRoaXMuc3RhdGVfIT0wKXRocm93IEVycm9yKCJDYW5ub3Qgc2V0dGxlKCIrcysiLCAiK2YrIik6IFByb21pc2UgYWxyZWFkeSBzZXR0bGVkIGluIHN0YXRlIit0aGlzLnN0YXRlXyk7dGhpcy5zdGF0ZV89cyx0aGlzLnJlc3VsdF89Zix0aGlzLnN0YXRlXz09PTImJnRoaXMuc2NoZWR1bGVVbmhhbmRsZWRSZWplY3Rpb25DaGVja18oKSx0aGlzLmV4ZWN1dGVPblNldHRsZWRDYWxsYmFja3NfKCl9LHIucHJvdG90eXBlLnNjaGVkdWxlVW5oYW5kbGVkUmVqZWN0aW9uQ2hlY2tfPWZ1bmN0aW9uKCl7dmFyIHM9dGhpcztvKGZ1bmN0aW9uKCl7aWYocy5ub3RpZnlVbmhhbmRsZWRSZWplY3Rpb25fKCkpe3ZhciBmPVZ0Lmdsb2JhbC5jb25zb2xlO3R5cGVvZiBmPCJ1IiYmZi5lcnJvcihzLnJlc3VsdF8pfX0sMSl9LHIucHJvdG90eXBlLm5vdGlmeVVuaGFuZGxlZFJlamVjdGlvbl89ZnVuY3Rpb24oKXtpZih0aGlzLmlzUmVqZWN0aW9uSGFuZGxlZF8pcmV0dXJuITE7dmFyIHM9VnQuZ2xvYmFsLkN1c3RvbUV2ZW50LGY9VnQuZ2xvYmFsLkV2ZW50LHU9VnQuZ2xvYmFsLmRpc3BhdGNoRXZlbnQ7cmV0dXJuIHR5cGVvZiB1PiJ1Ij8hMDoodHlwZW9mIHM9PSJmdW5jdGlvbiI/cz1uZXcgcygidW5oYW5kbGVkcmVqZWN0aW9uIix7Y2FuY2VsYWJsZTohMH0pOnR5cGVvZiBmPT0iZnVuY3Rpb24iP3M9bmV3IGYoInVuaGFuZGxlZHJlamVjdGlvbiIse2NhbmNlbGFibGU6ITB9KToocz1WdC5nbG9iYWwuZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkN1c3RvbUV2ZW50Iikscy5pbml0Q3VzdG9tRXZlbnQoInVuaGFuZGxlZHJlamVjdGlvbiIsITEsITAscykpLHMucHJvbWlzZT10aGlzLHMucmVhc29uPXRoaXMucmVzdWx0Xyx1KHMpKX0sci5wcm90b3R5cGUuZXhlY3V0ZU9uU2V0dGxlZENhbGxiYWNrc189ZnVuY3Rpb24oKXtpZih0aGlzLm9uU2V0dGxlZENhbGxiYWNrc18hPW51bGwpe2Zvcih2YXIgcz0wO3M8dGhpcy5vblNldHRsZWRDYWxsYmFja3NfLmxlbmd0aDsrK3MpaS5hc3luY0V4ZWN1dGUodGhpcy5vblNldHRsZWRDYWxsYmFja3NfW3NdKTt0aGlzLm9uU2V0dGxlZENhbGxiYWNrc189bnVsbH19O3ZhciBpPW5ldyBlO3JldHVybiByLnByb3RvdHlwZS5zZXR0bGVTYW1lQXNQcm9taXNlXz1mdW5jdGlvbihzKXt2YXIgZj10aGlzLmNyZWF0ZVJlc29sdmVBbmRSZWplY3RfKCk7cy5jYWxsV2hlblNldHRsZWRfKGYucmVzb2x2ZSxmLnJlamVjdCl9LHIucHJvdG90eXBlLnNldHRsZVNhbWVBc1RoZW5hYmxlXz1mdW5jdGlvbihzLGYpe3ZhciB1PXRoaXMuY3JlYXRlUmVzb2x2ZUFuZFJlamVjdF8oKTt0cnl7cy5jYWxsKGYsdS5yZXNvbHZlLHUucmVqZWN0KX1jYXRjaChjKXt1LnJlamVjdChjKX19LHIucHJvdG90eXBlLnRoZW49ZnVuY3Rpb24ocyxmKXtmdW5jdGlvbiB1KGQsbSl7cmV0dXJuIHR5cGVvZiBkPT0iZnVuY3Rpb24iP2Z1bmN0aW9uKF8pe3RyeXtjKGQoXykpfWNhdGNoKGcpe2woZyl9fTptfXZhciBjLGwscD1uZXcgcihmdW5jdGlvbihkLG0pe2M9ZCxsPW19KTtyZXR1cm4gdGhpcy5jYWxsV2hlblNldHRsZWRfKHUocyxjKSx1KGYsbCkpLHB9LHIucHJvdG90eXBlLmNhdGNoPWZ1bmN0aW9uKHMpe3JldHVybiB0aGlzLnRoZW4odm9pZCAwLHMpfSxyLnByb3RvdHlwZS5jYWxsV2hlblNldHRsZWRfPWZ1bmN0aW9uKHMsZil7ZnVuY3Rpb24gdSgpe3N3aXRjaChjLnN0YXRlXyl7Y2FzZSAxOnMoYy5yZXN1bHRfKTticmVhaztjYXNlIDI6ZihjLnJlc3VsdF8pO2JyZWFrO2RlZmF1bHQ6dGhyb3cgRXJyb3IoIlVuZXhwZWN0ZWQgc3RhdGU6ICIrYy5zdGF0ZV8pfX12YXIgYz10aGlzO3RoaXMub25TZXR0bGVkQ2FsbGJhY2tzXz09bnVsbD9pLmFzeW5jRXhlY3V0ZSh1KTp0aGlzLm9uU2V0dGxlZENhbGxiYWNrc18ucHVzaCh1KSx0aGlzLmlzUmVqZWN0aW9uSGFuZGxlZF89ITB9LHIucmVzb2x2ZT1uLHIucmVqZWN0PWZ1bmN0aW9uKHMpe3JldHVybiBuZXcgcihmdW5jdGlvbihmLHUpe3Uocyl9KX0sci5yYWNlPWZ1bmN0aW9uKHMpe3JldHVybiBuZXcgcihmdW5jdGlvbihmLHUpe2Zvcih2YXIgYz1WdC5tYWtlSXRlcmF0b3IocyksbD1jLm5leHQoKTshbC5kb25lO2w9Yy5uZXh0KCkpbihsLnZhbHVlKS5jYWxsV2hlblNldHRsZWRfKGYsdSl9KX0sci5hbGw9ZnVuY3Rpb24ocyl7dmFyIGY9VnQubWFrZUl0ZXJhdG9yKHMpLHU9Zi5uZXh0KCk7cmV0dXJuIHUuZG9uZT9uKFtdKTpuZXcgcihmdW5jdGlvbihjLGwpe2Z1bmN0aW9uIHAoXyl7cmV0dXJuIGZ1bmN0aW9uKGcpe2RbX109ZyxtLS0sbT09MCYmYyhkKX19dmFyIGQ9W10sbT0wO2RvIGQucHVzaCh2b2lkIDApLG0rKyxuKHUudmFsdWUpLmNhbGxXaGVuU2V0dGxlZF8ocChkLmxlbmd0aC0xKSxsKSx1PWYubmV4dCgpO3doaWxlKCF1LmRvbmUpfSl9LHJ9LCJlczYiLCJlczMiKTtWdC5vd25zPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LGUpfTtWdC5hc3NpZ249VnQuVFJVU1RfRVM2X1BPTFlGSUxMUyYmdHlwZW9mIE9iamVjdC5hc3NpZ249PSJmdW5jdGlvbiI/T2JqZWN0LmFzc2lnbjpmdW5jdGlvbih0LGUpe2Zvcih2YXIgbj0xO248YXJndW1lbnRzLmxlbmd0aDtuKyspe3ZhciBvPWFyZ3VtZW50c1tuXTtpZihvKWZvcih2YXIgciBpbiBvKVZ0Lm93bnMobyxyKSYmKHRbcl09b1tyXSl9cmV0dXJuIHR9O1Z0LnBvbHlmaWxsKCJPYmplY3QuYXNzaWduIixmdW5jdGlvbih0KXtyZXR1cm4gdHx8VnQuYXNzaWdufSwiZXM2IiwiZXMzIik7VnQuY2hlY2tTdHJpbmdBcmdzPWZ1bmN0aW9uKHQsZSxuKXtpZih0PT1udWxsKXRocm93IG5ldyBUeXBlRXJyb3IoIlRoZSAndGhpcycgdmFsdWUgZm9yIFN0cmluZy5wcm90b3R5cGUuIituKyIgbXVzdCBub3QgYmUgbnVsbCBvciB1bmRlZmluZWQiKTtpZihlIGluc3RhbmNlb2YgUmVnRXhwKXRocm93IG5ldyBUeXBlRXJyb3IoIkZpcnN0IGFyZ3VtZW50IHRvIFN0cmluZy5wcm90b3R5cGUuIituKyIgbXVzdCBub3QgYmUgYSByZWd1bGFyIGV4cHJlc3Npb24iKTtyZXR1cm4gdCsiIn07VnQucG9seWZpbGwoIlN0cmluZy5wcm90b3R5cGUuc3RhcnRzV2l0aCIsZnVuY3Rpb24odCl7cmV0dXJuIHR8fGZ1bmN0aW9uKGUsbil7dmFyIG89VnQuY2hlY2tTdHJpbmdBcmdzKHRoaXMsZSwic3RhcnRzV2l0aCIpO2UrPSIiO3ZhciByPW8ubGVuZ3RoLGk9ZS5sZW5ndGg7bj1NYXRoLm1heCgwLE1hdGgubWluKG58MCxvLmxlbmd0aCkpO2Zvcih2YXIgcz0wO3M8aSYmbjxyOylpZihvW24rK10hPWVbcysrXSlyZXR1cm4hMTtyZXR1cm4gcz49aX19LCJlczYiLCJlczMiKTtWdC5wb2x5ZmlsbCgiQXJyYXkucHJvdG90eXBlLmNvcHlXaXRoaW4iLGZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUobil7cmV0dXJuIG49TnVtYmVyKG4pLG49PT0xLzB8fG49PT0tMS8wP246bnwwfXJldHVybiB0fHxmdW5jdGlvbihuLG8scil7dmFyIGk9dGhpcy5sZW5ndGg7aWYobj1lKG4pLG89ZShvKSxyPXI9PT12b2lkIDA/aTplKHIpLG49MD5uP01hdGgubWF4KGkrbiwwKTpNYXRoLm1pbihuLGkpLG89MD5vP01hdGgubWF4KGkrbywwKTpNYXRoLm1pbihvLGkpLHI9MD5yP01hdGgubWF4KGkrciwwKTpNYXRoLm1pbihyLGkpLG48bylmb3IoO288cjspbyBpbiB0aGlzP3RoaXNbbisrXT10aGlzW28rK106KGRlbGV0ZSB0aGlzW24rK10sbysrKTtlbHNlIGZvcihyPU1hdGgubWluKHIsaStvLW4pLG4rPXItbztyPm87KS0tciBpbiB0aGlzP3RoaXNbLS1uXT10aGlzW3JdOmRlbGV0ZSB0aGlzWy0tbl07cmV0dXJuIHRoaXN9fSwiZXM2IiwiZXMzIik7VnQudHlwZWRBcnJheUNvcHlXaXRoaW49ZnVuY3Rpb24odCl7cmV0dXJuIHR8fEFycmF5LnByb3RvdHlwZS5jb3B5V2l0aGlufTtWdC5wb2x5ZmlsbCgiSW50OEFycmF5LnByb3RvdHlwZS5jb3B5V2l0aGluIixWdC50eXBlZEFycmF5Q29weVdpdGhpbiwiZXM2IiwiZXM1Iik7VnQucG9seWZpbGwoIlVpbnQ4QXJyYXkucHJvdG90eXBlLmNvcHlXaXRoaW4iLFZ0LnR5cGVkQXJyYXlDb3B5V2l0aGluLCJlczYiLCJlczUiKTtWdC5wb2x5ZmlsbCgiVWludDhDbGFtcGVkQXJyYXkucHJvdG90eXBlLmNvcHlXaXRoaW4iLFZ0LnR5cGVkQXJyYXlDb3B5V2l0aGluLCJlczYiLCJlczUiKTtWdC5wb2x5ZmlsbCgiSW50MTZBcnJheS5wcm90b3R5cGUuY29weVdpdGhpbiIsVnQudHlwZWRBcnJheUNvcHlXaXRoaW4sImVzNiIsImVzNSIpO1Z0LnBvbHlmaWxsKCJVaW50MTZBcnJheS5wcm90b3R5cGUuY29weVdpdGhpbiIsVnQudHlwZWRBcnJheUNvcHlXaXRoaW4sImVzNiIsImVzNSIpO1Z0LnBvbHlmaWxsKCJJbnQzMkFycmF5LnByb3RvdHlwZS5jb3B5V2l0aGluIixWdC50eXBlZEFycmF5Q29weVdpdGhpbiwiZXM2IiwiZXM1Iik7VnQucG9seWZpbGwoIlVpbnQzMkFycmF5LnByb3RvdHlwZS5jb3B5V2l0aGluIixWdC50eXBlZEFycmF5Q29weVdpdGhpbiwiZXM2IiwiZXM1Iik7VnQucG9seWZpbGwoIkZsb2F0MzJBcnJheS5wcm90b3R5cGUuY29weVdpdGhpbiIsVnQudHlwZWRBcnJheUNvcHlXaXRoaW4sImVzNiIsImVzNSIpO1Z0LnBvbHlmaWxsKCJGbG9hdDY0QXJyYXkucHJvdG90eXBlLmNvcHlXaXRoaW4iLFZ0LnR5cGVkQXJyYXlDb3B5V2l0aGluLCJlczYiLCJlczUiKTt2YXIgT2c9ZnVuY3Rpb24oKXt2YXIgdD10eXBlb2YgZG9jdW1lbnQ8InUiJiZkb2N1bWVudC5jdXJyZW50U2NyaXB0P2RvY3VtZW50LmN1cnJlbnRTY3JpcHQuc3JjOnZvaWQgMDtyZXR1cm4gdHlwZW9mIF9fZmlsZW5hbWU8InUiJiYodD10fHxfX2ZpbGVuYW1lKSxmdW5jdGlvbihlKXtmdW5jdGlvbiBuKHope3JldHVybiBSLmxvY2F0ZUZpbGU/Ui5sb2NhdGVGaWxlKHosbXQpOm10K3p9ZnVuY3Rpb24gbyh6LFcsZXQpe3ZhciBNdD1XK2V0O2ZvcihldD1XO3pbZXRdJiYhKGV0Pj1NdCk7KSsrZXQ7aWYoMTY8ZXQtVyYmei5idWZmZXImJmdlKXJldHVybiBnZS5kZWNvZGUoei5zdWJhcnJheShXLGV0KSk7Zm9yKE10PSIiO1c8ZXQ7KXt2YXIgbGU9eltXKytdO2lmKGxlJjEyOCl7dmFyIFRlPXpbVysrXSY2MztpZigobGUmMjI0KT09MTkyKU10Kz1TdHJpbmcuZnJvbUNoYXJDb2RlKChsZSYzMSk8PDZ8VGUpO2Vsc2V7dmFyIE9pPXpbVysrXSY2MztsZT0obGUmMjQwKT09MjI0PyhsZSYxNSk8PDEyfFRlPDw2fE9pOihsZSY3KTw8MTh8VGU8PDEyfE9pPDw2fHpbVysrXSY2Myw2NTUzNj5sZT9NdCs9U3RyaW5nLmZyb21DaGFyQ29kZShsZSk6KGxlLT02NTUzNixNdCs9U3RyaW5nLmZyb21DaGFyQ29kZSg1NTI5NnxsZT4+MTAsNTYzMjB8bGUmMTAyMykpfX1lbHNlIE10Kz1TdHJpbmcuZnJvbUNoYXJDb2RlKGxlKX1yZXR1cm4gTXR9ZnVuY3Rpb24gcih6LFcpe3JldHVybiB6P28odW4seixXKToiIn1mdW5jdGlvbiBpKCl7dmFyIHo9SnQuYnVmZmVyO1IuSEVBUDg9RWU9bmV3IEludDhBcnJheSh6KSxSLkhFQVAxNj1uZXcgSW50MTZBcnJheSh6KSxSLkhFQVAzMj1rZT1uZXcgSW50MzJBcnJheSh6KSxSLkhFQVBVOD11bj1uZXcgVWludDhBcnJheSh6KSxSLkhFQVBVMTY9bmV3IFVpbnQxNkFycmF5KHopLFIuSEVBUFUzMj1iZT1uZXcgVWludDMyQXJyYXkoeiksUi5IRUFQRjMyPW5ldyBGbG9hdDMyQXJyYXkoeiksUi5IRUFQRjY0PW5ldyBGbG9hdDY0QXJyYXkoeil9ZnVuY3Rpb24gcyh6KXt0aHJvdyBSLm9uQWJvcnQmJlIub25BYm9ydCh6KSx6PSJBYm9ydGVkKCIreisiKSIsdWUoeiksTmU9ITAsej1uZXcgV2ViQXNzZW1ibHkuUnVudGltZUVycm9yKHorIi4gQnVpbGQgd2l0aCAtc0FTU0VSVElPTlMgZm9yIG1vcmUgaW5mby4iKSxhdCh6KSx6fWZ1bmN0aW9uIGYoeil7dHJ5e2lmKHo9PXNuJiZRdClyZXR1cm4gbmV3IFVpbnQ4QXJyYXkoUXQpO2lmKG1lKXJldHVybiBtZSh6KTt0aHJvdyJib3RoIGFzeW5jIGFuZCBzeW5jIGZldGNoaW5nIG9mIHRoZSB3YXNtIGZhaWxlZCJ9Y2F0Y2goVyl7cyhXKX19ZnVuY3Rpb24gdSgpe2lmKCFRdCYmKFB0fHxndCkpe2lmKHR5cGVvZiBmZXRjaD09ImZ1bmN0aW9uIiYmIXNuLnN0YXJ0c1dpdGgoImZpbGU6Ly8iKSlyZXR1cm4gZmV0Y2goc24se2NyZWRlbnRpYWxzOiJzYW1lLW9yaWdpbiJ9KS50aGVuKGZ1bmN0aW9uKHope2lmKCF6Lm9rKXRocm93ImZhaWxlZCB0byBsb2FkIHdhc20gYmluYXJ5IGZpbGUgYXQgJyIrc24rIiciO3JldHVybiB6LmFycmF5QnVmZmVyKCl9KS5jYXRjaChmdW5jdGlvbigpe3JldHVybiBmKHNuKX0pO2lmKGNlKXJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbih6LFcpe2NlKHNuLGZ1bmN0aW9uKGV0KXt6KG5ldyBVaW50OEFycmF5KGV0KSl9LFcpfSl9cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oZnVuY3Rpb24oKXtyZXR1cm4gZihzbil9KX1mdW5jdGlvbiBjKHope2Zvcig7MDx6Lmxlbmd0aDspei5zaGlmdCgpKFIpfWZ1bmN0aW9uIGwoeil7dGhpcy5leGNQdHI9eix0aGlzLnB0cj16LTI0LHRoaXMuc2V0X3R5cGU9ZnVuY3Rpb24oVyl7YmVbdGhpcy5wdHIrND4+Ml09V30sdGhpcy5nZXRfdHlwZT1mdW5jdGlvbigpe3JldHVybiBiZVt0aGlzLnB0cis0Pj4yXX0sdGhpcy5zZXRfZGVzdHJ1Y3Rvcj1mdW5jdGlvbihXKXtiZVt0aGlzLnB0cis4Pj4yXT1XfSx0aGlzLmdldF9kZXN0cnVjdG9yPWZ1bmN0aW9uKCl7cmV0dXJuIGJlW3RoaXMucHRyKzg+PjJdfSx0aGlzLnNldF9yZWZjb3VudD1mdW5jdGlvbihXKXtrZVt0aGlzLnB0cj4+Ml09V30sdGhpcy5zZXRfY2F1Z2h0PWZ1bmN0aW9uKFcpe0VlW3RoaXMucHRyKzEyPj4wXT1XPzE6MH0sdGhpcy5nZXRfY2F1Z2h0PWZ1bmN0aW9uKCl7cmV0dXJuIEVlW3RoaXMucHRyKzEyPj4wXSE9MH0sdGhpcy5zZXRfcmV0aHJvd249ZnVuY3Rpb24oVyl7RWVbdGhpcy5wdHIrMTM+PjBdPVc/MTowfSx0aGlzLmdldF9yZXRocm93bj1mdW5jdGlvbigpe3JldHVybiBFZVt0aGlzLnB0cisxMz4+MF0hPTB9LHRoaXMuaW5pdD1mdW5jdGlvbihXLGV0KXt0aGlzLnNldF9hZGp1c3RlZF9wdHIoMCksdGhpcy5zZXRfdHlwZShXKSx0aGlzLnNldF9kZXN0cnVjdG9yKGV0KSx0aGlzLnNldF9yZWZjb3VudCgwKSx0aGlzLnNldF9jYXVnaHQoITEpLHRoaXMuc2V0X3JldGhyb3duKCExKX0sdGhpcy5hZGRfcmVmPWZ1bmN0aW9uKCl7a2VbdGhpcy5wdHI+PjJdKz0xfSx0aGlzLnJlbGVhc2VfcmVmPWZ1bmN0aW9uKCl7dmFyIFc9a2VbdGhpcy5wdHI+PjJdO3JldHVybiBrZVt0aGlzLnB0cj4+Ml09Vy0xLFc9PT0xfSx0aGlzLnNldF9hZGp1c3RlZF9wdHI9ZnVuY3Rpb24oVyl7YmVbdGhpcy5wdHIrMTY+PjJdPVd9LHRoaXMuZ2V0X2FkanVzdGVkX3B0cj1mdW5jdGlvbigpe3JldHVybiBiZVt0aGlzLnB0cisxNj4+Ml19LHRoaXMuZ2V0X2V4Y2VwdGlvbl9wdHI9ZnVuY3Rpb24oKXtpZihGbCh0aGlzLmdldF90eXBlKCkpKXJldHVybiBiZVt0aGlzLmV4Y1B0cj4+Ml07dmFyIFc9dGhpcy5nZXRfYWRqdXN0ZWRfcHRyKCk7cmV0dXJuIFchPT0wP1c6dGhpcy5leGNQdHJ9fWZ1bmN0aW9uIHAoKXtmdW5jdGlvbiB6KCl7aWYoIW5mJiYobmY9ITAsUi5jYWxsZWRSdW49ITAsIU5lKSl7aWYocmU9ITAsYyhwbiksb3QoUiksUi5vblJ1bnRpbWVJbml0aWFsaXplZCYmUi5vblJ1bnRpbWVJbml0aWFsaXplZCgpLFIucG9zdFJ1bilmb3IodHlwZW9mIFIucG9zdFJ1bj09ImZ1bmN0aW9uIiYmKFIucG9zdFJ1bj1bUi5wb3N0UnVuXSk7Ui5wb3N0UnVuLmxlbmd0aDspRW4udW5zaGlmdChSLnBvc3RSdW4uc2hpZnQoKSk7YyhFbil9fWlmKCEoMDwkdCkpe2lmKFIucHJlUnVuKWZvcih0eXBlb2YgUi5wcmVSdW49PSJmdW5jdGlvbiImJihSLnByZVJ1bj1bUi5wcmVSdW5dKTtSLnByZVJ1bi5sZW5ndGg7KWxuLnVuc2hpZnQoUi5wcmVSdW4uc2hpZnQoKSk7YyhsbiksMDwkdHx8KFIuc2V0U3RhdHVzPyhSLnNldFN0YXR1cygiUnVubmluZy4uLiIpLHNldFRpbWVvdXQoZnVuY3Rpb24oKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Ui5zZXRTdGF0dXMoIiIpfSwxKSx6KCl9LDEpKTp6KCkpfX1mdW5jdGlvbiBkKCl7fWZ1bmN0aW9uIG0oeil7cmV0dXJuKHp8fGQpLl9fY2FjaGVfX31mdW5jdGlvbiBfKHosVyl7dmFyIGV0PW0oVyksTXQ9ZXRbel07cmV0dXJuIE10fHwoTXQ9T2JqZWN0LmNyZWF0ZSgoV3x8ZCkucHJvdG90eXBlKSxNdC5wdHI9eixldFt6XT1NdCl9ZnVuY3Rpb24gZyh6KXtpZih0eXBlb2Ygej09InN0cmluZyIpe2Zvcih2YXIgVz0wLGV0PTA7ZXQ8ei5sZW5ndGg7KytldCl7dmFyIE10PXouY2hhckNvZGVBdChldCk7MTI3Pj1NdD9XKys6MjA0Nz49TXQ/Vys9Mjo1NTI5Njw9TXQmJjU3MzQzPj1NdD8oVys9NCwrK2V0KTpXKz0zfWlmKFc9QXJyYXkoVysxKSxldD0wLE10PVcubGVuZ3RoLDA8TXQpe010PWV0K010LTE7Zm9yKHZhciBsZT0wO2xlPHoubGVuZ3RoOysrbGUpe3ZhciBUZT16LmNoYXJDb2RlQXQobGUpO2lmKDU1Mjk2PD1UZSYmNTczNDM+PVRlKXt2YXIgT2k9ei5jaGFyQ29kZUF0KCsrbGUpO1RlPTY1NTM2KygoVGUmMTAyMyk8PDEwKXxPaSYxMDIzfWlmKDEyNz49VGUpe2lmKGV0Pj1NdClicmVhaztXW2V0KytdPVRlfWVsc2V7aWYoMjA0Nz49VGUpe2lmKGV0KzE+PU10KWJyZWFrO1dbZXQrK109MTkyfFRlPj42fWVsc2V7aWYoNjU1MzU+PVRlKXtpZihldCsyPj1NdClicmVhaztXW2V0KytdPTIyNHxUZT4+MTJ9ZWxzZXtpZihldCszPj1NdClicmVhaztXW2V0KytdPTI0MHxUZT4+MTgsV1tldCsrXT0xMjh8VGU+PjEyJjYzfVdbZXQrK109MTI4fFRlPj42JjYzfVdbZXQrK109MTI4fFRlJjYzfX1XW2V0XT0wfXJldHVybiB6PUNlLmFsbG9jKFcsRWUpLENlLmNvcHkoVyxFZSx6KSx6fXJldHVybiB6fWZ1bmN0aW9uIGIoeil7aWYodHlwZW9mIHo9PSJvYmplY3QiKXt2YXIgVz1DZS5hbGxvYyh6LEVlKTtyZXR1cm4gQ2UuY29weSh6LEVlLFcpLFd9cmV0dXJuIHp9ZnVuY3Rpb24gVCgpe3Rocm93ImNhbm5vdCBjb25zdHJ1Y3QgYSBWb2lkUHRyLCBubyBjb25zdHJ1Y3RvciBpbiBJREwifWZ1bmN0aW9uIE8oKXt0aGlzLnB0cj1jbigpLG0oTylbdGhpcy5wdHJdPXRoaXN9ZnVuY3Rpb24gRSgpe3RoaXMucHRyPXVvKCksbShFKVt0aGlzLnB0cl09dGhpc31mdW5jdGlvbiB3KCl7dGhpcy5wdHI9bG8oKSxtKHcpW3RoaXMucHRyXT10aGlzfWZ1bmN0aW9uIEMoKXt0aGlzLnB0cj1MZSgpLG0oQylbdGhpcy5wdHJdPXRoaXN9ZnVuY3Rpb24gTigpe3RoaXMucHRyPUlzKCksbShOKVt0aGlzLnB0cl09dGhpc31mdW5jdGlvbiBJKCl7dGhpcy5wdHI9b28oKSxtKEkpW3RoaXMucHRyXT10aGlzfWZ1bmN0aW9uIEQoKXt0aGlzLnB0cj1OYygpLG0oRClbdGhpcy5wdHJdPXRoaXN9ZnVuY3Rpb24gdigpe3RoaXMucHRyPW9yKCksbSh2KVt0aGlzLnB0cl09dGhpc31mdW5jdGlvbiBMKCl7dGhpcy5wdHI9dmMoKSxtKEwpW3RoaXMucHRyXT10aGlzfWZ1bmN0aW9uIFUoKXt0aHJvdyJjYW5ub3QgY29uc3RydWN0IGEgU3RhdHVzLCBubyBjb25zdHJ1Y3RvciBpbiBJREwifWZ1bmN0aW9uIEEoKXt0aGlzLnB0cj1FdSgpLG0oQSlbdGhpcy5wdHJdPXRoaXN9ZnVuY3Rpb24gUygpe3RoaXMucHRyPUxjKCksbShTKVt0aGlzLnB0cl09dGhpc31mdW5jdGlvbiBQKCl7dGhpcy5wdHI9S2EoKSxtKFApW3RoaXMucHRyXT10aGlzfWZ1bmN0aW9uIEYoKXt0aGlzLnB0cj1GYygpLG0oRilbdGhpcy5wdHJdPXRoaXN9ZnVuY3Rpb24gaigpe3RoaXMucHRyPUl1KCksbShqKVt0aGlzLnB0cl09dGhpc31mdW5jdGlvbiBIKCl7dGhpcy5wdHI9RHUoKSxtKEgpW3RoaXMucHRyXT10aGlzfWZ1bmN0aW9uIGsoKXt0aGlzLnB0cj10cygpLG0oaylbdGhpcy5wdHJdPXRoaXN9ZnVuY3Rpb24gSygpe3RoaXMucHRyPUd1KCksbShLKVt0aGlzLnB0cl09dGhpc31mdW5jdGlvbiBYKCl7dGhpcy5wdHI9WmEoKSxtKFgpW3RoaXMucHRyXT10aGlzfWU9ZT09PXZvaWQgMD97fTplO3ZhciBSPXR5cGVvZiBlPCJ1Ij9lOnt9LG90LGF0O1IucmVhZHk9bmV3IFByb21pc2UoZnVuY3Rpb24oeixXKXtvdD16LGF0PVd9KTt2YXIgcHQ9ITEseXQ9ITE7Ui5vblJ1bnRpbWVJbml0aWFsaXplZD1mdW5jdGlvbigpe3B0PSEwLHl0JiZ0eXBlb2YgUi5vbk1vZHVsZUxvYWRlZD09ImZ1bmN0aW9uIiYmUi5vbk1vZHVsZUxvYWRlZChSKX0sUi5vbk1vZHVsZVBhcnNlZD1mdW5jdGlvbigpe3l0PSEwLHB0JiZ0eXBlb2YgUi5vbk1vZHVsZUxvYWRlZD09ImZ1bmN0aW9uIiYmUi5vbk1vZHVsZUxvYWRlZChSKX0sUi5pc1ZlcnNpb25TdXBwb3J0ZWQ9ZnVuY3Rpb24oeil7cmV0dXJuIHR5cGVvZiB6IT0ic3RyaW5nIj8hMTooej16LnNwbGl0KCIuIiksMj56Lmxlbmd0aHx8Mzx6Lmxlbmd0aD8hMTp6WzBdPT0xJiYwPD16WzFdJiY1Pj16WzFdPyEwOiEoelswXSE9MHx8MTA8elsxXSkpfTt2YXIgcnQ9T2JqZWN0LmFzc2lnbih7fSxSKSxQdD10eXBlb2Ygd2luZG93PT0ib2JqZWN0IixndD10eXBlb2YgaW1wb3J0U2NyaXB0cz09ImZ1bmN0aW9uIixDdD10eXBlb2YgcHJvY2Vzcz09Im9iamVjdCImJnR5cGVvZiBwcm9jZXNzLnZlcnNpb25zPT0ib2JqZWN0IiYmdHlwZW9mIHByb2Nlc3MudmVyc2lvbnMubm9kZT09InN0cmluZyIsbXQ9IiI7aWYoQ3Qpe3ZhciB1dD1wcigiZnMiKSx2dD1wcigicGF0aCIpO210PWd0P3Z0LmRpcm5hbWUobXQpKyIvIjpfX2Rpcm5hbWUrIi8iO3ZhciB6dD1mdW5jdGlvbih6LFcpe3JldHVybiB6PXouc3RhcnRzV2l0aCgiZmlsZTovLyIpP25ldyBVUkwoeik6dnQubm9ybWFsaXplKHopLHV0LnJlYWRGaWxlU3luYyh6LFc/dm9pZCAwOiJ1dGY4Iil9LG1lPWZ1bmN0aW9uKHope3JldHVybiB6PXp0KHosITApLHouYnVmZmVyfHwoej1uZXcgVWludDhBcnJheSh6KSksen0sY2U9ZnVuY3Rpb24oeixXLGV0KXt6PXouc3RhcnRzV2l0aCgiZmlsZTovLyIpP25ldyBVUkwoeik6dnQubm9ybWFsaXplKHopLHV0LnJlYWRGaWxlKHosZnVuY3Rpb24oTXQsbGUpe010P2V0KE10KTpXKGxlLmJ1ZmZlcil9KX07MTxwcm9jZXNzLmFyZ3YubGVuZ3RoJiZwcm9jZXNzLmFyZ3ZbMV0ucmVwbGFjZSgvXFwvZywiLyIpLHByb2Nlc3MuYXJndi5zbGljZSgyKSxSLmluc3BlY3Q9ZnVuY3Rpb24oKXtyZXR1cm4iW0Vtc2NyaXB0ZW4gTW9kdWxlIG9iamVjdF0ifX1lbHNlKFB0fHxndCkmJihndD9tdD1zZWxmLmxvY2F0aW9uLmhyZWY6dHlwZW9mIGRvY3VtZW50PCJ1IiYmZG9jdW1lbnQuY3VycmVudFNjcmlwdCYmKG10PWRvY3VtZW50LmN1cnJlbnRTY3JpcHQuc3JjKSx0JiYobXQ9dCksbXQ9bXQuaW5kZXhPZigiYmxvYjoiKSE9PTA/bXQuc3Vic3RyKDAsbXQucmVwbGFjZSgvWz8jXS4qLywiIikubGFzdEluZGV4T2YoIi8iKSsxKToiIix6dD1mdW5jdGlvbih6KXt2YXIgVz1uZXcgWE1MSHR0cFJlcXVlc3Q7cmV0dXJuIFcub3BlbigiR0VUIix6LCExKSxXLnNlbmQobnVsbCksVy5yZXNwb25zZVRleHR9LGd0JiYobWU9ZnVuY3Rpb24oeil7dmFyIFc9bmV3IFhNTEh0dHBSZXF1ZXN0O3JldHVybiBXLm9wZW4oIkdFVCIseiwhMSksVy5yZXNwb25zZVR5cGU9ImFycmF5YnVmZmVyIixXLnNlbmQobnVsbCksbmV3IFVpbnQ4QXJyYXkoVy5yZXNwb25zZSl9KSxjZT1mdW5jdGlvbih6LFcsZXQpe3ZhciBNdD1uZXcgWE1MSHR0cFJlcXVlc3Q7TXQub3BlbigiR0VUIix6LCEwKSxNdC5yZXNwb25zZVR5cGU9ImFycmF5YnVmZmVyIixNdC5vbmxvYWQ9ZnVuY3Rpb24oKXtNdC5zdGF0dXM9PTIwMHx8TXQuc3RhdHVzPT0wJiZNdC5yZXNwb25zZT9XKE10LnJlc3BvbnNlKTpldCgpfSxNdC5vbmVycm9yPWV0LE10LnNlbmQobnVsbCl9KTt2YXIgcGU9Ui5wcmludHx8Y29uc29sZS5sb2cuYmluZChjb25zb2xlKSx1ZT1SLnByaW50RXJyfHxjb25zb2xlLndhcm4uYmluZChjb25zb2xlKTtPYmplY3QuYXNzaWduKFIscnQpLHJ0PW51bGw7dmFyIFF0O1Iud2FzbUJpbmFyeSYmKFF0PVIud2FzbUJpbmFyeSksdHlwZW9mIFdlYkFzc2VtYmx5IT0ib2JqZWN0IiYmcygibm8gbmF0aXZlIHdhc20gc3VwcG9ydCBkZXRlY3RlZCIpO3ZhciBKdCxOZT0hMSxnZT10eXBlb2YgVGV4dERlY29kZXI8InUiP25ldyBUZXh0RGVjb2RlcigidXRmOCIpOnZvaWQgMCxFZSx1bixrZSxiZSxsbj1bXSxwbj1bXSxFbj1bXSxyZT0hMSwkdD0wLEdlPW51bGwsZG49bnVsbCxzbj0iZHJhY29fZGVjb2Rlci53YXNtIjtzbi5zdGFydHNXaXRoKCJkYXRhOmFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbTtiYXNlNjQsIil8fChzbj1uKHNuKSk7dmFyIG1uPTAsZm89W251bGwsW10sW11dLEhuPXtiOmZ1bmN0aW9uKHosVyxldCl7dGhyb3cgbmV3IGwoeikuaW5pdChXLGV0KSxtbisrLHp9LGE6ZnVuY3Rpb24oKXtzKCIiKX0sZzpmdW5jdGlvbih6LFcsZXQpe3VuLmNvcHlXaXRoaW4oeixXLFcrZXQpfSxlOmZ1bmN0aW9uKHope3ZhciBXPXVuLmxlbmd0aDtpZih6Pj4+PTAsMjE0NzQ4MzY0ODx6KXJldHVybiExO2Zvcih2YXIgZXQ9MTs0Pj1ldDtldCo9Mil7dmFyIE10PVcqKDErLjIvZXQpO010PU1hdGgubWluKE10LHorMTAwNjYzMjk2KTt2YXIgbGU9TWF0aDtNdD1NYXRoLm1heCh6LE10KSxsZT1sZS5taW4uY2FsbChsZSwyMTQ3NDgzNjQ4LE10Kyg2NTUzNi1NdCU2NTUzNiklNjU1MzYpO3Q6e010PUp0LmJ1ZmZlcjt0cnl7SnQuZ3JvdyhsZS1NdC5ieXRlTGVuZ3RoKzY1NTM1Pj4+MTYpLGkoKTt2YXIgVGU9MTticmVhayB0fWNhdGNoe31UZT12b2lkIDB9aWYoVGUpcmV0dXJuITB9cmV0dXJuITF9LGY6ZnVuY3Rpb24oeil7cmV0dXJuIDUyfSxkOmZ1bmN0aW9uKHosVyxldCxNdCxsZSl7cmV0dXJuIDcwfSxjOmZ1bmN0aW9uKHosVyxldCxNdCl7Zm9yKHZhciBsZT0wLFRlPTA7VGU8ZXQ7VGUrKyl7dmFyIE9pPWJlW1c+PjJdLEdjPWJlW1crND4+Ml07Vys9ODtmb3IodmFyIFY9MDtWPEdjO1YrKyl7dmFyIEc9dW5bT2krVl0sWT1mb1t6XTtHPT09MHx8Rz09PTEwPygoej09PTE/cGU6dWUpKG8oWSwwKSksWS5sZW5ndGg9MCk6WS5wdXNoKEcpfWxlKz1HY31yZXR1cm4gYmVbTXQ+PjJdPWxlLDB9fTsoZnVuY3Rpb24oKXtmdW5jdGlvbiB6KGxlLFRlKXtSLmFzbT1sZS5leHBvcnRzLEp0PVIuYXNtLmgsaSgpLHBuLnVuc2hpZnQoUi5hc20uaSksJHQtLSxSLm1vbml0b3JSdW5EZXBlbmRlbmNpZXMmJlIubW9uaXRvclJ1bkRlcGVuZGVuY2llcygkdCksJHQ9PTAmJihHZSE9PW51bGwmJihjbGVhckludGVydmFsKEdlKSxHZT1udWxsKSxkbiYmKGxlPWRuLGRuPW51bGwsbGUoKSkpfWZ1bmN0aW9uIFcobGUpe3oobGUuaW5zdGFuY2UpfWZ1bmN0aW9uIGV0KGxlKXtyZXR1cm4gdSgpLnRoZW4oZnVuY3Rpb24oVGUpe3JldHVybiBXZWJBc3NlbWJseS5pbnN0YW50aWF0ZShUZSxNdCl9KS50aGVuKGZ1bmN0aW9uKFRlKXtyZXR1cm4gVGV9KS50aGVuKGxlLGZ1bmN0aW9uKFRlKXt1ZSgiZmFpbGVkIHRvIGFzeW5jaHJvbm91c2x5IHByZXBhcmUgd2FzbTogIitUZSkscyhUZSl9KX12YXIgTXQ9e2E6SG59O2lmKCR0KyssUi5tb25pdG9yUnVuRGVwZW5kZW5jaWVzJiZSLm1vbml0b3JSdW5EZXBlbmRlbmNpZXMoJHQpLFIuaW5zdGFudGlhdGVXYXNtKXRyeXtyZXR1cm4gUi5pbnN0YW50aWF0ZVdhc20oTXQseil9Y2F0Y2gobGUpe3VlKCJNb2R1bGUuaW5zdGFudGlhdGVXYXNtIGNhbGxiYWNrIGZhaWxlZCB3aXRoIGVycm9yOiAiK2xlKSxhdChsZSl9cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIFF0fHx0eXBlb2YgV2ViQXNzZW1ibHkuaW5zdGFudGlhdGVTdHJlYW1pbmchPSJmdW5jdGlvbiJ8fHNuLnN0YXJ0c1dpdGgoImRhdGE6YXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtO2Jhc2U2NCwiKXx8c24uc3RhcnRzV2l0aCgiZmlsZTovLyIpfHxDdHx8dHlwZW9mIGZldGNoIT0iZnVuY3Rpb24iP2V0KFcpOmZldGNoKHNuLHtjcmVkZW50aWFsczoic2FtZS1vcmlnaW4ifSkudGhlbihmdW5jdGlvbihsZSl7cmV0dXJuIFdlYkFzc2VtYmx5Lmluc3RhbnRpYXRlU3RyZWFtaW5nKGxlLE10KS50aGVuKFcsZnVuY3Rpb24oVGUpe3JldHVybiB1ZSgid2FzbSBzdHJlYW1pbmcgY29tcGlsZSBmYWlsZWQ6ICIrVGUpLHVlKCJmYWxsaW5nIGJhY2sgdG8gQXJyYXlCdWZmZXIgaW5zdGFudGlhdGlvbiIpLGV0KFcpfSl9KX0oKS5jYXRjaChhdCkse319KSgpO3ZhciBaZT1SLl9lbXNjcmlwdGVuX2JpbmRfVm9pZFB0cl9fX2Rlc3Ryb3lfX18wPWZ1bmN0aW9uKCl7cmV0dXJuKFplPVIuX2Vtc2NyaXB0ZW5fYmluZF9Wb2lkUHRyX19fZGVzdHJveV9fXzA9Ui5hc20uaykuYXBwbHkobnVsbCxhcmd1bWVudHMpfSxjbj1SLl9lbXNjcmlwdGVuX2JpbmRfRGVjb2RlckJ1ZmZlcl9EZWNvZGVyQnVmZmVyXzA9ZnVuY3Rpb24oKXtyZXR1cm4oY249Ui5fZW1zY3JpcHRlbl9iaW5kX0RlY29kZXJCdWZmZXJfRGVjb2RlckJ1ZmZlcl8wPVIuYXNtLmwpLmFwcGx5KG51bGwsYXJndW1lbnRzKX0sS2U9Ui5fZW1zY3JpcHRlbl9iaW5kX0RlY29kZXJCdWZmZXJfSW5pdF8yPWZ1bmN0aW9uKCl7cmV0dXJuKEtlPVIuX2Vtc2NyaXB0ZW5fYmluZF9EZWNvZGVyQnVmZmVyX0luaXRfMj1SLmFzbS5tKS5hcHBseShudWxsLGFyZ3VtZW50cyl9LGhuPVIuX2Vtc2NyaXB0ZW5fYmluZF9EZWNvZGVyQnVmZmVyX19fZGVzdHJveV9fXzA9ZnVuY3Rpb24oKXtyZXR1cm4oaG49Ui5fZW1zY3JpcHRlbl9iaW5kX0RlY29kZXJCdWZmZXJfX19kZXN0cm95X19fMD1SLmFzbS5uKS5hcHBseShudWxsLGFyZ3VtZW50cyl9LHVvPVIuX2Vtc2NyaXB0ZW5fYmluZF9BdHRyaWJ1dGVUcmFuc2Zvcm1EYXRhX0F0dHJpYnV0ZVRyYW5zZm9ybURhdGFfMD1mdW5jdGlvbigpe3JldHVybih1bz1SLl9lbXNjcmlwdGVuX2JpbmRfQXR0cmlidXRlVHJhbnNmb3JtRGF0YV9BdHRyaWJ1dGVUcmFuc2Zvcm1EYXRhXzA9Ui5hc20ubykuYXBwbHkobnVsbCxhcmd1bWVudHMpfSxxbj1SLl9lbXNjcmlwdGVuX2JpbmRfQXR0cmlidXRlVHJhbnNmb3JtRGF0YV90cmFuc2Zvcm1fdHlwZV8wPWZ1bmN0aW9uKCl7cmV0dXJuKHFuPVIuX2Vtc2NyaXB0ZW5fYmluZF9BdHRyaWJ1dGVUcmFuc2Zvcm1EYXRhX3RyYW5zZm9ybV90eXBlXzA9Ui5hc20ucCkuYXBwbHkobnVsbCxhcmd1bWVudHMpfSxLbj1SLl9lbXNjcmlwdGVuX2JpbmRfQXR0cmlidXRlVHJhbnNmb3JtRGF0YV9fX2Rlc3Ryb3lfX18wPWZ1bmN0aW9uKCl7cmV0dXJuKEtuPVIuX2Vtc2NyaXB0ZW5fYmluZF9BdHRyaWJ1dGVUcmFuc2Zvcm1EYXRhX19fZGVzdHJveV9fXzA9Ui5hc20ucSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfSxsbz1SLl9lbXNjcmlwdGVuX2JpbmRfR2VvbWV0cnlBdHRyaWJ1dGVfR2VvbWV0cnlBdHRyaWJ1dGVfMD1mdW5jdGlvbigpe3JldHVybihsbz1SLl9lbXNjcmlwdGVuX2JpbmRfR2VvbWV0cnlBdHRyaWJ1dGVfR2VvbWV0cnlBdHRyaWJ1dGVfMD1SLmFzbS5yKS5hcHBseShudWxsLGFyZ3VtZW50cyl9LHplPVIuX2Vtc2NyaXB0ZW5fYmluZF9HZW9tZXRyeUF0dHJpYnV0ZV9fX2Rlc3Ryb3lfX18wPWZ1bmN0aW9uKCl7cmV0dXJuKHplPVIuX2Vtc2NyaXB0ZW5fYmluZF9HZW9tZXRyeUF0dHJpYnV0ZV9fX2Rlc3Ryb3lfX18wPVIuYXNtLnMpLmFwcGx5KG51bGwsYXJndW1lbnRzKX0sTGU9Ui5fZW1zY3JpcHRlbl9iaW5kX1BvaW50QXR0cmlidXRlX1BvaW50QXR0cmlidXRlXzA9ZnVuY3Rpb24oKXtyZXR1cm4oTGU9Ui5fZW1zY3JpcHRlbl9iaW5kX1BvaW50QXR0cmlidXRlX1BvaW50QXR0cmlidXRlXzA9Ui5hc20udCkuYXBwbHkobnVsbCxhcmd1bWVudHMpfSxEbj1SLl9lbXNjcmlwdGVuX2JpbmRfUG9pbnRBdHRyaWJ1dGVfc2l6ZV8wPWZ1bmN0aW9uKCl7cmV0dXJuKERuPVIuX2Vtc2NyaXB0ZW5fYmluZF9Qb2ludEF0dHJpYnV0ZV9zaXplXzA9Ui5hc20udSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfSxXbj1SLl9lbXNjcmlwdGVuX2JpbmRfUG9pbnRBdHRyaWJ1dGVfR2V0QXR0cmlidXRlVHJhbnNmb3JtRGF0YV8wPWZ1bmN0aW9uKCl7cmV0dXJuKFduPVIuX2Vtc2NyaXB0ZW5fYmluZF9Qb2ludEF0dHJpYnV0ZV9HZXRBdHRyaWJ1dGVUcmFuc2Zvcm1EYXRhXzA9Ui5hc20udikuYXBwbHkobnVsbCxhcmd1bWVudHMpfSx6bz1SLl9lbXNjcmlwdGVuX2JpbmRfUG9pbnRBdHRyaWJ1dGVfYXR0cmlidXRlX3R5cGVfMD1mdW5jdGlvbigpe3JldHVybih6bz1SLl9lbXNjcmlwdGVuX2JpbmRfUG9pbnRBdHRyaWJ1dGVfYXR0cmlidXRlX3R5cGVfMD1SLmFzbS53KS5hcHBseShudWxsLGFyZ3VtZW50cyl9LHJuPVIuX2Vtc2NyaXB0ZW5fYmluZF9Qb2ludEF0dHJpYnV0ZV9kYXRhX3R5cGVfMD1mdW5jdGlvbigpe3JldHVybihybj1SLl9lbXNjcmlwdGVuX2JpbmRfUG9pbnRBdHRyaWJ1dGVfZGF0YV90eXBlXzA9Ui5hc20ueCkuYXBwbHkobnVsbCxhcmd1bWVudHMpfSxSbj1SLl9lbXNjcmlwdGVuX2JpbmRfUG9pbnRBdHRyaWJ1dGVfbnVtX2NvbXBvbmVudHNfMD1mdW5jdGlvbigpe3JldHVybihSbj1SLl9lbXNjcmlwdGVuX2JpbmRfUG9pbnRBdHRyaWJ1dGVfbnVtX2NvbXBvbmVudHNfMD1SLmFzbS55KS5hcHBseShudWxsLGFyZ3VtZW50cyl9LGFyPVIuX2Vtc2NyaXB0ZW5fYmluZF9Qb2ludEF0dHJpYnV0ZV9ub3JtYWxpemVkXzA9ZnVuY3Rpb24oKXtyZXR1cm4oYXI9Ui5fZW1zY3JpcHRlbl9iaW5kX1BvaW50QXR0cmlidXRlX25vcm1hbGl6ZWRfMD1SLmFzbS56KS5hcHBseShudWxsLGFyZ3VtZW50cyl9LFFuPVIuX2Vtc2NyaXB0ZW5fYmluZF9Qb2ludEF0dHJpYnV0ZV9ieXRlX3N0cmlkZV8wPWZ1bmN0aW9uKCl7cmV0dXJuKFFuPVIuX2Vtc2NyaXB0ZW5fYmluZF9Qb2ludEF0dHJpYnV0ZV9ieXRlX3N0cmlkZV8wPVIuYXNtLkEpLmFwcGx5KG51bGwsYXJndW1lbnRzKX0sam89Ui5fZW1zY3JpcHRlbl9iaW5kX1BvaW50QXR0cmlidXRlX2J5dGVfb2Zmc2V0XzA9ZnVuY3Rpb24oKXtyZXR1cm4oam89Ui5fZW1zY3JpcHRlbl9iaW5kX1BvaW50QXR0cmlidXRlX2J5dGVfb2Zmc2V0XzA9Ui5hc20uQikuYXBwbHkobnVsbCxhcmd1bWVudHMpfSxOcj1SLl9lbXNjcmlwdGVuX2JpbmRfUG9pbnRBdHRyaWJ1dGVfdW5pcXVlX2lkXzA9ZnVuY3Rpb24oKXtyZXR1cm4oTnI9Ui5fZW1zY3JpcHRlbl9iaW5kX1BvaW50QXR0cmlidXRlX3VuaXF1ZV9pZF8wPVIuYXNtLkMpLmFwcGx5KG51bGwsYXJndW1lbnRzKX0sTnM9Ui5fZW1zY3JpcHRlbl9iaW5kX1BvaW50QXR0cmlidXRlX19fZGVzdHJveV9fXzA9ZnVuY3Rpb24oKXtyZXR1cm4oTnM9Ui5fZW1zY3JpcHRlbl9iaW5kX1BvaW50QXR0cmlidXRlX19fZGVzdHJveV9fXzA9Ui5hc20uRCkuYXBwbHkobnVsbCxhcmd1bWVudHMpfSxJcz1SLl9lbXNjcmlwdGVuX2JpbmRfQXR0cmlidXRlUXVhbnRpemF0aW9uVHJhbnNmb3JtX0F0dHJpYnV0ZVF1YW50aXphdGlvblRyYW5zZm9ybV8wPWZ1bmN0aW9uKCl7cmV0dXJuKElzPVIuX2Vtc2NyaXB0ZW5fYmluZF9BdHRyaWJ1dGVRdWFudGl6YXRpb25UcmFuc2Zvcm1fQXR0cmlidXRlUXVhbnRpemF0aW9uVHJhbnNmb3JtXzA9Ui5hc20uRSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfSxZaT1SLl9lbXNjcmlwdGVuX2JpbmRfQXR0cmlidXRlUXVhbnRpemF0aW9uVHJhbnNmb3JtX0luaXRGcm9tQXR0cmlidXRlXzE9ZnVuY3Rpb24oKXtyZXR1cm4oWWk9Ui5fZW1zY3JpcHRlbl9iaW5kX0F0dHJpYnV0ZVF1YW50aXphdGlvblRyYW5zZm9ybV9Jbml0RnJvbUF0dHJpYnV0ZV8xPVIuYXNtLkYpLmFwcGx5KG51bGwsYXJndW1lbnRzKX0sSXI9Ui5fZW1zY3JpcHRlbl9iaW5kX0F0dHJpYnV0ZVF1YW50aXphdGlvblRyYW5zZm9ybV9xdWFudGl6YXRpb25fYml0c18wPWZ1bmN0aW9uKCl7cmV0dXJuKElyPVIuX2Vtc2NyaXB0ZW5fYmluZF9BdHRyaWJ1dGVRdWFudGl6YXRpb25UcmFuc2Zvcm1fcXVhbnRpemF0aW9uX2JpdHNfMD1SLmFzbS5HKS5hcHBseShudWxsLGFyZ3VtZW50cyl9LCRpPVIuX2Vtc2NyaXB0ZW5fYmluZF9BdHRyaWJ1dGVRdWFudGl6YXRpb25UcmFuc2Zvcm1fbWluX3ZhbHVlXzE9ZnVuY3Rpb24oKXtyZXR1cm4oJGk9Ui5fZW1zY3JpcHRlbl9iaW5kX0F0dHJpYnV0ZVF1YW50aXphdGlvblRyYW5zZm9ybV9taW5fdmFsdWVfMT1SLmFzbS5IKS5hcHBseShudWxsLGFyZ3VtZW50cyl9LHZzPVIuX2Vtc2NyaXB0ZW5fYmluZF9BdHRyaWJ1dGVRdWFudGl6YXRpb25UcmFuc2Zvcm1fcmFuZ2VfMD1mdW5jdGlvbigpe3JldHVybih2cz1SLl9lbXNjcmlwdGVuX2JpbmRfQXR0cmlidXRlUXVhbnRpemF0aW9uVHJhbnNmb3JtX3JhbmdlXzA9Ui5hc20uSSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfSxiaT1SLl9lbXNjcmlwdGVuX2JpbmRfQXR0cmlidXRlUXVhbnRpemF0aW9uVHJhbnNmb3JtX19fZGVzdHJveV9fXzA9ZnVuY3Rpb24oKXtyZXR1cm4oYmk9Ui5fZW1zY3JpcHRlbl9iaW5kX0F0dHJpYnV0ZVF1YW50aXphdGlvblRyYW5zZm9ybV9fX2Rlc3Ryb3lfX18wPVIuYXNtLkopLmFwcGx5KG51bGwsYXJndW1lbnRzKX0sb289Ui5fZW1zY3JpcHRlbl9iaW5kX0F0dHJpYnV0ZU9jdGFoZWRyb25UcmFuc2Zvcm1fQXR0cmlidXRlT2N0YWhlZHJvblRyYW5zZm9ybV8wPWZ1bmN0aW9uKCl7cmV0dXJuKG9vPVIuX2Vtc2NyaXB0ZW5fYmluZF9BdHRyaWJ1dGVPY3RhaGVkcm9uVHJhbnNmb3JtX0F0dHJpYnV0ZU9jdGFoZWRyb25UcmFuc2Zvcm1fMD1SLmFzbS5LKS5hcHBseShudWxsLGFyZ3VtZW50cyl9LHBvPVIuX2Vtc2NyaXB0ZW5fYmluZF9BdHRyaWJ1dGVPY3RhaGVkcm9uVHJhbnNmb3JtX0luaXRGcm9tQXR0cmlidXRlXzE9ZnVuY3Rpb24oKXtyZXR1cm4ocG89Ui5fZW1zY3JpcHRlbl9iaW5kX0F0dHJpYnV0ZU9jdGFoZWRyb25UcmFuc2Zvcm1fSW5pdEZyb21BdHRyaWJ1dGVfMT1SLmFzbS5MKS5hcHBseShudWxsLGFyZ3VtZW50cyl9LHZyPVIuX2Vtc2NyaXB0ZW5fYmluZF9BdHRyaWJ1dGVPY3RhaGVkcm9uVHJhbnNmb3JtX3F1YW50aXphdGlvbl9iaXRzXzA9ZnVuY3Rpb24oKXtyZXR1cm4odnI9Ui5fZW1zY3JpcHRlbl9iaW5kX0F0dHJpYnV0ZU9jdGFoZWRyb25UcmFuc2Zvcm1fcXVhbnRpemF0aW9uX2JpdHNfMD1SLmFzbS5NKS5hcHBseShudWxsLGFyZ3VtZW50cyl9LE1jPVIuX2Vtc2NyaXB0ZW5fYmluZF9BdHRyaWJ1dGVPY3RhaGVkcm9uVHJhbnNmb3JtX19fZGVzdHJveV9fXzA9ZnVuY3Rpb24oKXtyZXR1cm4oTWM9Ui5fZW1zY3JpcHRlbl9iaW5kX0F0dHJpYnV0ZU9jdGFoZWRyb25UcmFuc2Zvcm1fX19kZXN0cm95X19fMD1SLmFzbS5OKS5hcHBseShudWxsLGFyZ3VtZW50cyl9LE5jPVIuX2Vtc2NyaXB0ZW5fYmluZF9Qb2ludENsb3VkX1BvaW50Q2xvdWRfMD1mdW5jdGlvbigpe3JldHVybihOYz1SLl9lbXNjcmlwdGVuX2JpbmRfUG9pbnRDbG91ZF9Qb2ludENsb3VkXzA9Ui5hc20uTykuYXBwbHkobnVsbCxhcmd1bWVudHMpfSxGbj1SLl9lbXNjcmlwdGVuX2JpbmRfUG9pbnRDbG91ZF9udW1fYXR0cmlidXRlc18wPWZ1bmN0aW9uKCl7cmV0dXJuKEZuPVIuX2Vtc2NyaXB0ZW5fYmluZF9Qb2ludENsb3VkX251bV9hdHRyaWJ1dGVzXzA9Ui5hc20uUCkuYXBwbHkobnVsbCxhcmd1bWVudHMpfSxUaT1SLl9lbXNjcmlwdGVuX2JpbmRfUG9pbnRDbG91ZF9udW1fcG9pbnRzXzA9ZnVuY3Rpb24oKXtyZXR1cm4oVGk9Ui5fZW1zY3JpcHRlbl9iaW5kX1BvaW50Q2xvdWRfbnVtX3BvaW50c18wPVIuYXNtLlEpLmFwcGx5KG51bGwsYXJndW1lbnRzKX0sRGU9Ui5fZW1zY3JpcHRlbl9iaW5kX1BvaW50Q2xvdWRfX19kZXN0cm95X19fMD1mdW5jdGlvbigpe3JldHVybihEZT1SLl9lbXNjcmlwdGVuX2JpbmRfUG9pbnRDbG91ZF9fX2Rlc3Ryb3lfX18wPVIuYXNtLlIpLmFwcGx5KG51bGwsYXJndW1lbnRzKX0sb3I9Ui5fZW1zY3JpcHRlbl9iaW5kX01lc2hfTWVzaF8wPWZ1bmN0aW9uKCl7cmV0dXJuKG9yPVIuX2Vtc2NyaXB0ZW5fYmluZF9NZXNoX01lc2hfMD1SLmFzbS5TKS5hcHBseShudWxsLGFyZ3VtZW50cyl9LEF1PVIuX2Vtc2NyaXB0ZW5fYmluZF9NZXNoX251bV9mYWNlc18wPWZ1bmN0aW9uKCl7cmV0dXJuKEF1PVIuX2Vtc2NyaXB0ZW5fYmluZF9NZXNoX251bV9mYWNlc18wPVIuYXNtLlQpLmFwcGx5KG51bGwsYXJndW1lbnRzKX0sYnU9Ui5fZW1zY3JpcHRlbl9iaW5kX01lc2hfbnVtX2F0dHJpYnV0ZXNfMD1mdW5jdGlvbigpe3JldHVybihidT1SLl9lbXNjcmlwdGVuX2JpbmRfTWVzaF9udW1fYXR0cmlidXRlc18wPVIuYXNtLlUpLmFwcGx5KG51bGwsYXJndW1lbnRzKX0sVHU9Ui5fZW1zY3JpcHRlbl9iaW5kX01lc2hfbnVtX3BvaW50c18wPWZ1bmN0aW9uKCl7cmV0dXJuKFR1PVIuX2Vtc2NyaXB0ZW5fYmluZF9NZXNoX251bV9wb2ludHNfMD1SLmFzbS5WKS5hcHBseShudWxsLGFyZ3VtZW50cyl9LEljPVIuX2Vtc2NyaXB0ZW5fYmluZF9NZXNoX19fZGVzdHJveV9fXzA9ZnVuY3Rpb24oKXtyZXR1cm4oSWM9Ui5fZW1zY3JpcHRlbl9iaW5kX01lc2hfX19kZXN0cm95X19fMD1SLmFzbS5XKS5hcHBseShudWxsLGFyZ3VtZW50cyl9LHZjPVIuX2Vtc2NyaXB0ZW5fYmluZF9NZXRhZGF0YV9NZXRhZGF0YV8wPWZ1bmN0aW9uKCl7cmV0dXJuKHZjPVIuX2Vtc2NyaXB0ZW5fYmluZF9NZXRhZGF0YV9NZXRhZGF0YV8wPVIuYXNtLlgpLmFwcGx5KG51bGwsYXJndW1lbnRzKX0sSGE9Ui5fZW1zY3JpcHRlbl9iaW5kX01ldGFkYXRhX19fZGVzdHJveV9fXzA9ZnVuY3Rpb24oKXtyZXR1cm4oSGE9Ui5fZW1zY3JpcHRlbl9iaW5kX01ldGFkYXRhX19fZGVzdHJveV9fXzA9Ui5hc20uWSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfSx3dT1SLl9lbXNjcmlwdGVuX2JpbmRfU3RhdHVzX2NvZGVfMD1mdW5jdGlvbigpe3JldHVybih3dT1SLl9lbXNjcmlwdGVuX2JpbmRfU3RhdHVzX2NvZGVfMD1SLmFzbS5aKS5hcHBseShudWxsLGFyZ3VtZW50cyl9LHFhPVIuX2Vtc2NyaXB0ZW5fYmluZF9TdGF0dXNfb2tfMD1mdW5jdGlvbigpe3JldHVybihxYT1SLl9lbXNjcmlwdGVuX2JpbmRfU3RhdHVzX29rXzA9Ui5hc20uXykuYXBwbHkobnVsbCxhcmd1bWVudHMpfSxaaT1SLl9lbXNjcmlwdGVuX2JpbmRfU3RhdHVzX2Vycm9yX21zZ18wPWZ1bmN0aW9uKCl7cmV0dXJuKFppPVIuX2Vtc2NyaXB0ZW5fYmluZF9TdGF0dXNfZXJyb3JfbXNnXzA9Ui5hc20uJCkuYXBwbHkobnVsbCxhcmd1bWVudHMpfSxPdT1SLl9lbXNjcmlwdGVuX2JpbmRfU3RhdHVzX19fZGVzdHJveV9fXzA9ZnVuY3Rpb24oKXtyZXR1cm4oT3U9Ui5fZW1zY3JpcHRlbl9iaW5kX1N0YXR1c19fX2Rlc3Ryb3lfX18wPVIuYXNtLmFhKS5hcHBseShudWxsLGFyZ3VtZW50cyl9LEV1PVIuX2Vtc2NyaXB0ZW5fYmluZF9EcmFjb0Zsb2F0MzJBcnJheV9EcmFjb0Zsb2F0MzJBcnJheV8wPWZ1bmN0aW9uKCl7cmV0dXJuKEV1PVIuX2Vtc2NyaXB0ZW5fYmluZF9EcmFjb0Zsb2F0MzJBcnJheV9EcmFjb0Zsb2F0MzJBcnJheV8wPVIuYXNtLmJhKS5hcHBseShudWxsLGFyZ3VtZW50cyl9LFJ1PVIuX2Vtc2NyaXB0ZW5fYmluZF9EcmFjb0Zsb2F0MzJBcnJheV9HZXRWYWx1ZV8xPWZ1bmN0aW9uKCl7cmV0dXJuKFJ1PVIuX2Vtc2NyaXB0ZW5fYmluZF9EcmFjb0Zsb2F0MzJBcnJheV9HZXRWYWx1ZV8xPVIuYXNtLmNhKS5hcHBseShudWxsLGFyZ3VtZW50cyl9LFFpPVIuX2Vtc2NyaXB0ZW5fYmluZF9EcmFjb0Zsb2F0MzJBcnJheV9zaXplXzA9ZnVuY3Rpb24oKXtyZXR1cm4oUWk9Ui5fZW1zY3JpcHRlbl9iaW5kX0RyYWNvRmxvYXQzMkFycmF5X3NpemVfMD1SLmFzbS5kYSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfSxKaT1SLl9lbXNjcmlwdGVuX2JpbmRfRHJhY29GbG9hdDMyQXJyYXlfX19kZXN0cm95X19fMD1mdW5jdGlvbigpe3JldHVybihKaT1SLl9lbXNjcmlwdGVuX2JpbmRfRHJhY29GbG9hdDMyQXJyYXlfX19kZXN0cm95X19fMD1SLmFzbS5lYSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfSxMYz1SLl9lbXNjcmlwdGVuX2JpbmRfRHJhY29JbnQ4QXJyYXlfRHJhY29JbnQ4QXJyYXlfMD1mdW5jdGlvbigpe3JldHVybihMYz1SLl9lbXNjcmlwdGVuX2JpbmRfRHJhY29JbnQ4QXJyYXlfRHJhY29JbnQ4QXJyYXlfMD1SLmFzbS5mYSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfSxTdT1SLl9lbXNjcmlwdGVuX2JpbmRfRHJhY29JbnQ4QXJyYXlfR2V0VmFsdWVfMT1mdW5jdGlvbigpe3JldHVybihTdT1SLl9lbXNjcmlwdGVuX2JpbmRfRHJhY29JbnQ4QXJyYXlfR2V0VmFsdWVfMT1SLmFzbS5nYSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfSxDdT1SLl9lbXNjcmlwdGVuX2JpbmRfRHJhY29JbnQ4QXJyYXlfc2l6ZV8wPWZ1bmN0aW9uKCl7cmV0dXJuKEN1PVIuX2Vtc2NyaXB0ZW5fYmluZF9EcmFjb0ludDhBcnJheV9zaXplXzA9Ui5hc20uaGEpLmFwcGx5KG51bGwsYXJndW1lbnRzKX0sTHI9Ui5fZW1zY3JpcHRlbl9iaW5kX0RyYWNvSW50OEFycmF5X19fZGVzdHJveV9fXzA9ZnVuY3Rpb24oKXtyZXR1cm4oTHI9Ui5fZW1zY3JpcHRlbl9iaW5kX0RyYWNvSW50OEFycmF5X19fZGVzdHJveV9fXzA9Ui5hc20uaWEpLmFwcGx5KG51bGwsYXJndW1lbnRzKX0sS2E9Ui5fZW1zY3JpcHRlbl9iaW5kX0RyYWNvVUludDhBcnJheV9EcmFjb1VJbnQ4QXJyYXlfMD1mdW5jdGlvbigpe3JldHVybihLYT1SLl9lbXNjcmlwdGVuX2JpbmRfRHJhY29VSW50OEFycmF5X0RyYWNvVUludDhBcnJheV8wPVIuYXNtLmphKS5hcHBseShudWxsLGFyZ3VtZW50cyl9LFdhPVIuX2Vtc2NyaXB0ZW5fYmluZF9EcmFjb1VJbnQ4QXJyYXlfR2V0VmFsdWVfMT1mdW5jdGlvbigpe3JldHVybihXYT1SLl9lbXNjcmlwdGVuX2JpbmRfRHJhY29VSW50OEFycmF5X0dldFZhbHVlXzE9Ui5hc20ua2EpLmFwcGx5KG51bGwsYXJndW1lbnRzKX0sRGM9Ui5fZW1zY3JpcHRlbl9iaW5kX0RyYWNvVUludDhBcnJheV9zaXplXzA9ZnVuY3Rpb24oKXtyZXR1cm4oRGM9Ui5fZW1zY3JpcHRlbl9iaW5kX0RyYWNvVUludDhBcnJheV9zaXplXzA9Ui5hc20ubGEpLmFwcGx5KG51bGwsYXJndW1lbnRzKX0seHU9Ui5fZW1zY3JpcHRlbl9iaW5kX0RyYWNvVUludDhBcnJheV9fX2Rlc3Ryb3lfX18wPWZ1bmN0aW9uKCl7cmV0dXJuKHh1PVIuX2Vtc2NyaXB0ZW5fYmluZF9EcmFjb1VJbnQ4QXJyYXlfX19kZXN0cm95X19fMD1SLmFzbS5tYSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfSxGYz1SLl9lbXNjcmlwdGVuX2JpbmRfRHJhY29JbnQxNkFycmF5X0RyYWNvSW50MTZBcnJheV8wPWZ1bmN0aW9uKCl7cmV0dXJuKEZjPVIuX2Vtc2NyaXB0ZW5fYmluZF9EcmFjb0ludDE2QXJyYXlfRHJhY29JbnQxNkFycmF5XzA9Ui5hc20ubmEpLmFwcGx5KG51bGwsYXJndW1lbnRzKX0sUHU9Ui5fZW1zY3JpcHRlbl9iaW5kX0RyYWNvSW50MTZBcnJheV9HZXRWYWx1ZV8xPWZ1bmN0aW9uKCl7cmV0dXJuKFB1PVIuX2Vtc2NyaXB0ZW5fYmluZF9EcmFjb0ludDE2QXJyYXlfR2V0VmFsdWVfMT1SLmFzbS5vYSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfSxNdT1SLl9lbXNjcmlwdGVuX2JpbmRfRHJhY29JbnQxNkFycmF5X3NpemVfMD1mdW5jdGlvbigpe3JldHVybihNdT1SLl9lbXNjcmlwdGVuX2JpbmRfRHJhY29JbnQxNkFycmF5X3NpemVfMD1SLmFzbS5wYSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfSxOdT1SLl9lbXNjcmlwdGVuX2JpbmRfRHJhY29JbnQxNkFycmF5X19fZGVzdHJveV9fXzA9ZnVuY3Rpb24oKXtyZXR1cm4oTnU9Ui5fZW1zY3JpcHRlbl9iaW5kX0RyYWNvSW50MTZBcnJheV9fX2Rlc3Ryb3lfX18wPVIuYXNtLnFhKS5hcHBseShudWxsLGFyZ3VtZW50cyl9LEl1PVIuX2Vtc2NyaXB0ZW5fYmluZF9EcmFjb1VJbnQxNkFycmF5X0RyYWNvVUludDE2QXJyYXlfMD1mdW5jdGlvbigpe3JldHVybihJdT1SLl9lbXNjcmlwdGVuX2JpbmRfRHJhY29VSW50MTZBcnJheV9EcmFjb1VJbnQxNkFycmF5XzA9Ui5hc20ucmEpLmFwcGx5KG51bGwsYXJndW1lbnRzKX0sdnU9Ui5fZW1zY3JpcHRlbl9iaW5kX0RyYWNvVUludDE2QXJyYXlfR2V0VmFsdWVfMT1mdW5jdGlvbigpe3JldHVybih2dT1SLl9lbXNjcmlwdGVuX2JpbmRfRHJhY29VSW50MTZBcnJheV9HZXRWYWx1ZV8xPVIuYXNtLnNhKS5hcHBseShudWxsLGFyZ3VtZW50cyl9LEx1PVIuX2Vtc2NyaXB0ZW5fYmluZF9EcmFjb1VJbnQxNkFycmF5X3NpemVfMD1mdW5jdGlvbigpe3JldHVybihMdT1SLl9lbXNjcmlwdGVuX2JpbmRfRHJhY29VSW50MTZBcnJheV9zaXplXzA9Ui5hc20udGEpLmFwcGx5KG51bGwsYXJndW1lbnRzKX0sWGE9Ui5fZW1zY3JpcHRlbl9iaW5kX0RyYWNvVUludDE2QXJyYXlfX19kZXN0cm95X19fMD1mdW5jdGlvbigpe3JldHVybihYYT1SLl9lbXNjcmlwdGVuX2JpbmRfRHJhY29VSW50MTZBcnJheV9fX2Rlc3Ryb3lfX18wPVIuYXNtLnVhKS5hcHBseShudWxsLGFyZ3VtZW50cyl9LER1PVIuX2Vtc2NyaXB0ZW5fYmluZF9EcmFjb0ludDMyQXJyYXlfRHJhY29JbnQzMkFycmF5XzA9ZnVuY3Rpb24oKXtyZXR1cm4oRHU9Ui5fZW1zY3JpcHRlbl9iaW5kX0RyYWNvSW50MzJBcnJheV9EcmFjb0ludDMyQXJyYXlfMD1SLmFzbS52YSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfSxGdT1SLl9lbXNjcmlwdGVuX2JpbmRfRHJhY29JbnQzMkFycmF5X0dldFZhbHVlXzE9ZnVuY3Rpb24oKXtyZXR1cm4oRnU9Ui5fZW1zY3JpcHRlbl9iaW5kX0RyYWNvSW50MzJBcnJheV9HZXRWYWx1ZV8xPVIuYXNtLndhKS5hcHBseShudWxsLGFyZ3VtZW50cyl9LEJ1PVIuX2Vtc2NyaXB0ZW5fYmluZF9EcmFjb0ludDMyQXJyYXlfc2l6ZV8wPWZ1bmN0aW9uKCl7cmV0dXJuKEJ1PVIuX2Vtc2NyaXB0ZW5fYmluZF9EcmFjb0ludDMyQXJyYXlfc2l6ZV8wPVIuYXNtLnhhKS5hcHBseShudWxsLGFyZ3VtZW50cyl9LFV1PVIuX2Vtc2NyaXB0ZW5fYmluZF9EcmFjb0ludDMyQXJyYXlfX19kZXN0cm95X19fMD1mdW5jdGlvbigpe3JldHVybihVdT1SLl9lbXNjcmlwdGVuX2JpbmRfRHJhY29JbnQzMkFycmF5X19fZGVzdHJveV9fXzA9Ui5hc20ueWEpLmFwcGx5KG51bGwsYXJndW1lbnRzKX0sdHM9Ui5fZW1zY3JpcHRlbl9iaW5kX0RyYWNvVUludDMyQXJyYXlfRHJhY29VSW50MzJBcnJheV8wPWZ1bmN0aW9uKCl7cmV0dXJuKHRzPVIuX2Vtc2NyaXB0ZW5fYmluZF9EcmFjb1VJbnQzMkFycmF5X0RyYWNvVUludDMyQXJyYXlfMD1SLmFzbS56YSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfSxWdT1SLl9lbXNjcmlwdGVuX2JpbmRfRHJhY29VSW50MzJBcnJheV9HZXRWYWx1ZV8xPWZ1bmN0aW9uKCl7cmV0dXJuKFZ1PVIuX2Vtc2NyaXB0ZW5fYmluZF9EcmFjb1VJbnQzMkFycmF5X0dldFZhbHVlXzE9Ui5hc20uQWEpLmFwcGx5KG51bGwsYXJndW1lbnRzKX0sa3U9Ui5fZW1zY3JpcHRlbl9iaW5kX0RyYWNvVUludDMyQXJyYXlfc2l6ZV8wPWZ1bmN0aW9uKCl7cmV0dXJuKGt1PVIuX2Vtc2NyaXB0ZW5fYmluZF9EcmFjb1VJbnQzMkFycmF5X3NpemVfMD1SLmFzbS5CYSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfSxMcz1SLl9lbXNjcmlwdGVuX2JpbmRfRHJhY29VSW50MzJBcnJheV9fX2Rlc3Ryb3lfX18wPWZ1bmN0aW9uKCl7cmV0dXJuKExzPVIuX2Vtc2NyaXB0ZW5fYmluZF9EcmFjb1VJbnQzMkFycmF5X19fZGVzdHJveV9fXzA9Ui5hc20uQ2EpLmFwcGx5KG51bGwsYXJndW1lbnRzKX0sR3U9Ui5fZW1zY3JpcHRlbl9iaW5kX01ldGFkYXRhUXVlcmllcl9NZXRhZGF0YVF1ZXJpZXJfMD1mdW5jdGlvbigpe3JldHVybihHdT1SLl9lbXNjcmlwdGVuX2JpbmRfTWV0YWRhdGFRdWVyaWVyX01ldGFkYXRhUXVlcmllcl8wPVIuYXNtLkRhKS5hcHBseShudWxsLGFyZ3VtZW50cyl9LHp1PVIuX2Vtc2NyaXB0ZW5fYmluZF9NZXRhZGF0YVF1ZXJpZXJfSGFzRW50cnlfMj1mdW5jdGlvbigpe3JldHVybih6dT1SLl9lbXNjcmlwdGVuX2JpbmRfTWV0YWRhdGFRdWVyaWVyX0hhc0VudHJ5XzI9Ui5hc20uRWEpLmFwcGx5KG51bGwsYXJndW1lbnRzKX0sZnI9Ui5fZW1zY3JpcHRlbl9iaW5kX01ldGFkYXRhUXVlcmllcl9HZXRJbnRFbnRyeV8yPWZ1bmN0aW9uKCl7cmV0dXJuKGZyPVIuX2Vtc2NyaXB0ZW5fYmluZF9NZXRhZGF0YVF1ZXJpZXJfR2V0SW50RW50cnlfMj1SLmFzbS5GYSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfSxZYT1SLl9lbXNjcmlwdGVuX2JpbmRfTWV0YWRhdGFRdWVyaWVyX0dldEludEVudHJ5QXJyYXlfMz1mdW5jdGlvbigpe3JldHVybihZYT1SLl9lbXNjcmlwdGVuX2JpbmRfTWV0YWRhdGFRdWVyaWVyX0dldEludEVudHJ5QXJyYXlfMz1SLmFzbS5HYSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfSxqdT1SLl9lbXNjcmlwdGVuX2JpbmRfTWV0YWRhdGFRdWVyaWVyX0dldERvdWJsZUVudHJ5XzI9ZnVuY3Rpb24oKXtyZXR1cm4oanU9Ui5fZW1zY3JpcHRlbl9iaW5kX01ldGFkYXRhUXVlcmllcl9HZXREb3VibGVFbnRyeV8yPVIuYXNtLkhhKS5hcHBseShudWxsLGFyZ3VtZW50cyl9LEh1PVIuX2Vtc2NyaXB0ZW5fYmluZF9NZXRhZGF0YVF1ZXJpZXJfR2V0U3RyaW5nRW50cnlfMj1mdW5jdGlvbigpe3JldHVybihIdT1SLl9lbXNjcmlwdGVuX2JpbmRfTWV0YWRhdGFRdWVyaWVyX0dldFN0cmluZ0VudHJ5XzI9Ui5hc20uSWEpLmFwcGx5KG51bGwsYXJndW1lbnRzKX0scXU9Ui5fZW1zY3JpcHRlbl9iaW5kX01ldGFkYXRhUXVlcmllcl9OdW1FbnRyaWVzXzE9ZnVuY3Rpb24oKXtyZXR1cm4ocXU9Ui5fZW1zY3JpcHRlbl9iaW5kX01ldGFkYXRhUXVlcmllcl9OdW1FbnRyaWVzXzE9Ui5hc20uSmEpLmFwcGx5KG51bGwsYXJndW1lbnRzKX0sSG89Ui5fZW1zY3JpcHRlbl9iaW5kX01ldGFkYXRhUXVlcmllcl9HZXRFbnRyeU5hbWVfMj1mdW5jdGlvbigpe3JldHVybihIbz1SLl9lbXNjcmlwdGVuX2JpbmRfTWV0YWRhdGFRdWVyaWVyX0dldEVudHJ5TmFtZV8yPVIuYXNtLkthKS5hcHBseShudWxsLGFyZ3VtZW50cyl9LCRhPVIuX2Vtc2NyaXB0ZW5fYmluZF9NZXRhZGF0YVF1ZXJpZXJfX19kZXN0cm95X19fMD1mdW5jdGlvbigpe3JldHVybigkYT1SLl9lbXNjcmlwdGVuX2JpbmRfTWV0YWRhdGFRdWVyaWVyX19fZGVzdHJveV9fXzA9Ui5hc20uTGEpLmFwcGx5KG51bGwsYXJndW1lbnRzKX0sWmE9Ui5fZW1zY3JpcHRlbl9iaW5kX0RlY29kZXJfRGVjb2Rlcl8wPWZ1bmN0aW9uKCl7cmV0dXJuKFphPVIuX2Vtc2NyaXB0ZW5fYmluZF9EZWNvZGVyX0RlY29kZXJfMD1SLmFzbS5NYSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfSxEcz1SLl9lbXNjcmlwdGVuX2JpbmRfRGVjb2Rlcl9EZWNvZGVBcnJheVRvUG9pbnRDbG91ZF8zPWZ1bmN0aW9uKCl7cmV0dXJuKERzPVIuX2Vtc2NyaXB0ZW5fYmluZF9EZWNvZGVyX0RlY29kZUFycmF5VG9Qb2ludENsb3VkXzM9Ui5hc20uTmEpLmFwcGx5KG51bGwsYXJndW1lbnRzKX0sS3U9Ui5fZW1zY3JpcHRlbl9iaW5kX0RlY29kZXJfRGVjb2RlQXJyYXlUb01lc2hfMz1mdW5jdGlvbigpe3JldHVybihLdT1SLl9lbXNjcmlwdGVuX2JpbmRfRGVjb2Rlcl9EZWNvZGVBcnJheVRvTWVzaF8zPVIuYXNtLk9hKS5hcHBseShudWxsLGFyZ3VtZW50cyl9LEJjPVIuX2Vtc2NyaXB0ZW5fYmluZF9EZWNvZGVyX0dldEF0dHJpYnV0ZUlkXzI9ZnVuY3Rpb24oKXtyZXR1cm4oQmM9Ui5fZW1zY3JpcHRlbl9iaW5kX0RlY29kZXJfR2V0QXR0cmlidXRlSWRfMj1SLmFzbS5QYSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfSxXdT1SLl9lbXNjcmlwdGVuX2JpbmRfRGVjb2Rlcl9HZXRBdHRyaWJ1dGVJZEJ5TmFtZV8yPWZ1bmN0aW9uKCl7cmV0dXJuKFd1PVIuX2Vtc2NyaXB0ZW5fYmluZF9EZWNvZGVyX0dldEF0dHJpYnV0ZUlkQnlOYW1lXzI9Ui5hc20uUWEpLmFwcGx5KG51bGwsYXJndW1lbnRzKX0sUWE9Ui5fZW1zY3JpcHRlbl9iaW5kX0RlY29kZXJfR2V0QXR0cmlidXRlSWRCeU1ldGFkYXRhRW50cnlfMz1mdW5jdGlvbigpe3JldHVybihRYT1SLl9lbXNjcmlwdGVuX2JpbmRfRGVjb2Rlcl9HZXRBdHRyaWJ1dGVJZEJ5TWV0YWRhdGFFbnRyeV8zPVIuYXNtLlJhKS5hcHBseShudWxsLGFyZ3VtZW50cyl9LEphPVIuX2Vtc2NyaXB0ZW5fYmluZF9EZWNvZGVyX0dldEF0dHJpYnV0ZV8yPWZ1bmN0aW9uKCl7cmV0dXJuKEphPVIuX2Vtc2NyaXB0ZW5fYmluZF9EZWNvZGVyX0dldEF0dHJpYnV0ZV8yPVIuYXNtLlNhKS5hcHBseShudWxsLGFyZ3VtZW50cyl9LFh1PVIuX2Vtc2NyaXB0ZW5fYmluZF9EZWNvZGVyX0dldEF0dHJpYnV0ZUJ5VW5pcXVlSWRfMj1mdW5jdGlvbigpe3JldHVybihYdT1SLl9lbXNjcmlwdGVuX2JpbmRfRGVjb2Rlcl9HZXRBdHRyaWJ1dGVCeVVuaXF1ZUlkXzI9Ui5hc20uVGEpLmFwcGx5KG51bGwsYXJndW1lbnRzKX0sWXU9Ui5fZW1zY3JpcHRlbl9iaW5kX0RlY29kZXJfR2V0TWV0YWRhdGFfMT1mdW5jdGlvbigpe3JldHVybihZdT1SLl9lbXNjcmlwdGVuX2JpbmRfRGVjb2Rlcl9HZXRNZXRhZGF0YV8xPVIuYXNtLlVhKS5hcHBseShudWxsLGFyZ3VtZW50cyl9LFVjPVIuX2Vtc2NyaXB0ZW5fYmluZF9EZWNvZGVyX0dldEF0dHJpYnV0ZU1ldGFkYXRhXzI9ZnVuY3Rpb24oKXtyZXR1cm4oVWM9Ui5fZW1zY3JpcHRlbl9iaW5kX0RlY29kZXJfR2V0QXR0cmlidXRlTWV0YWRhdGFfMj1SLmFzbS5WYSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfSxBbz1SLl9lbXNjcmlwdGVuX2JpbmRfRGVjb2Rlcl9HZXRGYWNlRnJvbU1lc2hfMz1mdW5jdGlvbigpe3JldHVybihBbz1SLl9lbXNjcmlwdGVuX2JpbmRfRGVjb2Rlcl9HZXRGYWNlRnJvbU1lc2hfMz1SLmFzbS5XYSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfSxWYz1SLl9lbXNjcmlwdGVuX2JpbmRfRGVjb2Rlcl9HZXRUcmlhbmdsZVN0cmlwc0Zyb21NZXNoXzI9ZnVuY3Rpb24oKXtyZXR1cm4oVmM9Ui5fZW1zY3JpcHRlbl9iaW5kX0RlY29kZXJfR2V0VHJpYW5nbGVTdHJpcHNGcm9tTWVzaF8yPVIuYXNtLlhhKS5hcHBseShudWxsLGFyZ3VtZW50cyl9LCR1PVIuX2Vtc2NyaXB0ZW5fYmluZF9EZWNvZGVyX0dldFRyaWFuZ2xlc1VJbnQxNkFycmF5XzM9ZnVuY3Rpb24oKXtyZXR1cm4oJHU9Ui5fZW1zY3JpcHRlbl9iaW5kX0RlY29kZXJfR2V0VHJpYW5nbGVzVUludDE2QXJyYXlfMz1SLmFzbS5ZYSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfSxadT1SLl9lbXNjcmlwdGVuX2JpbmRfRGVjb2Rlcl9HZXRUcmlhbmdsZXNVSW50MzJBcnJheV8zPWZ1bmN0aW9uKCl7cmV0dXJuKFp1PVIuX2Vtc2NyaXB0ZW5fYmluZF9EZWNvZGVyX0dldFRyaWFuZ2xlc1VJbnQzMkFycmF5XzM9Ui5hc20uWmEpLmFwcGx5KG51bGwsYXJndW1lbnRzKX0sUXU9Ui5fZW1zY3JpcHRlbl9iaW5kX0RlY29kZXJfR2V0QXR0cmlidXRlRmxvYXRfMz1mdW5jdGlvbigpe3JldHVybihRdT1SLl9lbXNjcmlwdGVuX2JpbmRfRGVjb2Rlcl9HZXRBdHRyaWJ1dGVGbG9hdF8zPVIuYXNtLl9hKS5hcHBseShudWxsLGFyZ3VtZW50cyl9LHVyPVIuX2Vtc2NyaXB0ZW5fYmluZF9EZWNvZGVyX0dldEF0dHJpYnV0ZUZsb2F0Rm9yQWxsUG9pbnRzXzM9ZnVuY3Rpb24oKXtyZXR1cm4odXI9Ui5fZW1zY3JpcHRlbl9iaW5kX0RlY29kZXJfR2V0QXR0cmlidXRlRmxvYXRGb3JBbGxQb2ludHNfMz1SLmFzbS4kYSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfSxKdT1SLl9lbXNjcmlwdGVuX2JpbmRfRGVjb2Rlcl9HZXRBdHRyaWJ1dGVJbnRGb3JBbGxQb2ludHNfMz1mdW5jdGlvbigpe3JldHVybihKdT1SLl9lbXNjcmlwdGVuX2JpbmRfRGVjb2Rlcl9HZXRBdHRyaWJ1dGVJbnRGb3JBbGxQb2ludHNfMz1SLmFzbS5hYikuYXBwbHkobnVsbCxhcmd1bWVudHMpfSx0bD1SLl9lbXNjcmlwdGVuX2JpbmRfRGVjb2Rlcl9HZXRBdHRyaWJ1dGVJbnQ4Rm9yQWxsUG9pbnRzXzM9ZnVuY3Rpb24oKXtyZXR1cm4odGw9Ui5fZW1zY3JpcHRlbl9iaW5kX0RlY29kZXJfR2V0QXR0cmlidXRlSW50OEZvckFsbFBvaW50c18zPVIuYXNtLmJiKS5hcHBseShudWxsLGFyZ3VtZW50cyl9LGVsPVIuX2Vtc2NyaXB0ZW5fYmluZF9EZWNvZGVyX0dldEF0dHJpYnV0ZVVJbnQ4Rm9yQWxsUG9pbnRzXzM9ZnVuY3Rpb24oKXtyZXR1cm4oZWw9Ui5fZW1zY3JpcHRlbl9iaW5kX0RlY29kZXJfR2V0QXR0cmlidXRlVUludDhGb3JBbGxQb2ludHNfMz1SLmFzbS5jYikuYXBwbHkobnVsbCxhcmd1bWVudHMpfSxGcz1SLl9lbXNjcmlwdGVuX2JpbmRfRGVjb2Rlcl9HZXRBdHRyaWJ1dGVJbnQxNkZvckFsbFBvaW50c18zPWZ1bmN0aW9uKCl7cmV0dXJuKEZzPVIuX2Vtc2NyaXB0ZW5fYmluZF9EZWNvZGVyX0dldEF0dHJpYnV0ZUludDE2Rm9yQWxsUG9pbnRzXzM9Ui5hc20uZGIpLmFwcGx5KG51bGwsYXJndW1lbnRzKX0sbmw9Ui5fZW1zY3JpcHRlbl9iaW5kX0RlY29kZXJfR2V0QXR0cmlidXRlVUludDE2Rm9yQWxsUG9pbnRzXzM9ZnVuY3Rpb24oKXtyZXR1cm4obmw9Ui5fZW1zY3JpcHRlbl9iaW5kX0RlY29kZXJfR2V0QXR0cmlidXRlVUludDE2Rm9yQWxsUG9pbnRzXzM9Ui5hc20uZWIpLmFwcGx5KG51bGwsYXJndW1lbnRzKX0sd2k9Ui5fZW1zY3JpcHRlbl9iaW5kX0RlY29kZXJfR2V0QXR0cmlidXRlSW50MzJGb3JBbGxQb2ludHNfMz1mdW5jdGlvbigpe3JldHVybih3aT1SLl9lbXNjcmlwdGVuX2JpbmRfRGVjb2Rlcl9HZXRBdHRyaWJ1dGVJbnQzMkZvckFsbFBvaW50c18zPVIuYXNtLmZiKS5hcHBseShudWxsLGFyZ3VtZW50cyl9LG9sPVIuX2Vtc2NyaXB0ZW5fYmluZF9EZWNvZGVyX0dldEF0dHJpYnV0ZVVJbnQzMkZvckFsbFBvaW50c18zPWZ1bmN0aW9uKCl7cmV0dXJuKG9sPVIuX2Vtc2NyaXB0ZW5fYmluZF9EZWNvZGVyX0dldEF0dHJpYnV0ZVVJbnQzMkZvckFsbFBvaW50c18zPVIuYXNtLmdiKS5hcHBseShudWxsLGFyZ3VtZW50cyl9LHJsPVIuX2Vtc2NyaXB0ZW5fYmluZF9EZWNvZGVyX0dldEF0dHJpYnV0ZURhdGFBcnJheUZvckFsbFBvaW50c181PWZ1bmN0aW9uKCl7cmV0dXJuKHJsPVIuX2Vtc2NyaXB0ZW5fYmluZF9EZWNvZGVyX0dldEF0dHJpYnV0ZURhdGFBcnJheUZvckFsbFBvaW50c181PVIuYXNtLmhiKS5hcHBseShudWxsLGFyZ3VtZW50cyl9LGlsPVIuX2Vtc2NyaXB0ZW5fYmluZF9EZWNvZGVyX1NraXBBdHRyaWJ1dGVUcmFuc2Zvcm1fMT1mdW5jdGlvbigpe3JldHVybihpbD1SLl9lbXNjcmlwdGVuX2JpbmRfRGVjb2Rlcl9Ta2lwQXR0cmlidXRlVHJhbnNmb3JtXzE9Ui5hc20uaWIpLmFwcGx5KG51bGwsYXJndW1lbnRzKX0sc2w9Ui5fZW1zY3JpcHRlbl9iaW5kX0RlY29kZXJfR2V0RW5jb2RlZEdlb21ldHJ5VHlwZV9EZXByZWNhdGVkXzE9ZnVuY3Rpb24oKXtyZXR1cm4oc2w9Ui5fZW1zY3JpcHRlbl9iaW5kX0RlY29kZXJfR2V0RW5jb2RlZEdlb21ldHJ5VHlwZV9EZXByZWNhdGVkXzE9Ui5hc20uamIpLmFwcGx5KG51bGwsYXJndW1lbnRzKX0sY2w9Ui5fZW1zY3JpcHRlbl9iaW5kX0RlY29kZXJfRGVjb2RlQnVmZmVyVG9Qb2ludENsb3VkXzI9ZnVuY3Rpb24oKXtyZXR1cm4oY2w9Ui5fZW1zY3JpcHRlbl9iaW5kX0RlY29kZXJfRGVjb2RlQnVmZmVyVG9Qb2ludENsb3VkXzI9Ui5hc20ua2IpLmFwcGx5KG51bGwsYXJndW1lbnRzKX0sYWw9Ui5fZW1zY3JpcHRlbl9iaW5kX0RlY29kZXJfRGVjb2RlQnVmZmVyVG9NZXNoXzI9ZnVuY3Rpb24oKXtyZXR1cm4oYWw9Ui5fZW1zY3JpcHRlbl9iaW5kX0RlY29kZXJfRGVjb2RlQnVmZmVyVG9NZXNoXzI9Ui5hc20ubGIpLmFwcGx5KG51bGwsYXJndW1lbnRzKX0sZmw9Ui5fZW1zY3JpcHRlbl9iaW5kX0RlY29kZXJfX19kZXN0cm95X19fMD1mdW5jdGlvbigpe3JldHVybihmbD1SLl9lbXNjcmlwdGVuX2JpbmRfRGVjb2Rlcl9fX2Rlc3Ryb3lfX18wPVIuYXNtLm1iKS5hcHBseShudWxsLGFyZ3VtZW50cyl9LHVsPVIuX2Vtc2NyaXB0ZW5fZW51bV9kcmFjb19BdHRyaWJ1dGVUcmFuc2Zvcm1UeXBlX0FUVFJJQlVURV9JTlZBTElEX1RSQU5TRk9STT1mdW5jdGlvbigpe3JldHVybih1bD1SLl9lbXNjcmlwdGVuX2VudW1fZHJhY29fQXR0cmlidXRlVHJhbnNmb3JtVHlwZV9BVFRSSUJVVEVfSU5WQUxJRF9UUkFOU0ZPUk09Ui5hc20ubmIpLmFwcGx5KG51bGwsYXJndW1lbnRzKX0sbGw9Ui5fZW1zY3JpcHRlbl9lbnVtX2RyYWNvX0F0dHJpYnV0ZVRyYW5zZm9ybVR5cGVfQVRUUklCVVRFX05PX1RSQU5TRk9STT1mdW5jdGlvbigpe3JldHVybihsbD1SLl9lbXNjcmlwdGVuX2VudW1fZHJhY29fQXR0cmlidXRlVHJhbnNmb3JtVHlwZV9BVFRSSUJVVEVfTk9fVFJBTlNGT1JNPVIuYXNtLm9iKS5hcHBseShudWxsLGFyZ3VtZW50cyl9LHBsPVIuX2Vtc2NyaXB0ZW5fZW51bV9kcmFjb19BdHRyaWJ1dGVUcmFuc2Zvcm1UeXBlX0FUVFJJQlVURV9RVUFOVElaQVRJT05fVFJBTlNGT1JNPWZ1bmN0aW9uKCl7cmV0dXJuKHBsPVIuX2Vtc2NyaXB0ZW5fZW51bV9kcmFjb19BdHRyaWJ1dGVUcmFuc2Zvcm1UeXBlX0FUVFJJQlVURV9RVUFOVElaQVRJT05fVFJBTlNGT1JNPVIuYXNtLnBiKS5hcHBseShudWxsLGFyZ3VtZW50cyl9LGRsPVIuX2Vtc2NyaXB0ZW5fZW51bV9kcmFjb19BdHRyaWJ1dGVUcmFuc2Zvcm1UeXBlX0FUVFJJQlVURV9PQ1RBSEVEUk9OX1RSQU5TRk9STT1mdW5jdGlvbigpe3JldHVybihkbD1SLl9lbXNjcmlwdGVuX2VudW1fZHJhY29fQXR0cmlidXRlVHJhbnNmb3JtVHlwZV9BVFRSSUJVVEVfT0NUQUhFRFJPTl9UUkFOU0ZPUk09Ui5hc20ucWIpLmFwcGx5KG51bGwsYXJndW1lbnRzKX0sZXM9Ui5fZW1zY3JpcHRlbl9lbnVtX2RyYWNvX0dlb21ldHJ5QXR0cmlidXRlX1R5cGVfSU5WQUxJRD1mdW5jdGlvbigpe3JldHVybihlcz1SLl9lbXNjcmlwdGVuX2VudW1fZHJhY29fR2VvbWV0cnlBdHRyaWJ1dGVfVHlwZV9JTlZBTElEPVIuYXNtLnJiKS5hcHBseShudWxsLGFyZ3VtZW50cyl9LG1sPVIuX2Vtc2NyaXB0ZW5fZW51bV9kcmFjb19HZW9tZXRyeUF0dHJpYnV0ZV9UeXBlX1BPU0lUSU9OPWZ1bmN0aW9uKCl7cmV0dXJuKG1sPVIuX2Vtc2NyaXB0ZW5fZW51bV9kcmFjb19HZW9tZXRyeUF0dHJpYnV0ZV9UeXBlX1BPU0lUSU9OPVIuYXNtLnNiKS5hcHBseShudWxsLGFyZ3VtZW50cyl9LGhsPVIuX2Vtc2NyaXB0ZW5fZW51bV9kcmFjb19HZW9tZXRyeUF0dHJpYnV0ZV9UeXBlX05PUk1BTD1mdW5jdGlvbigpe3JldHVybihobD1SLl9lbXNjcmlwdGVuX2VudW1fZHJhY29fR2VvbWV0cnlBdHRyaWJ1dGVfVHlwZV9OT1JNQUw9Ui5hc20udGIpLmFwcGx5KG51bGwsYXJndW1lbnRzKX0sQnM9Ui5fZW1zY3JpcHRlbl9lbnVtX2RyYWNvX0dlb21ldHJ5QXR0cmlidXRlX1R5cGVfQ09MT1I9ZnVuY3Rpb24oKXtyZXR1cm4oQnM9Ui5fZW1zY3JpcHRlbl9lbnVtX2RyYWNvX0dlb21ldHJ5QXR0cmlidXRlX1R5cGVfQ09MT1I9Ui5hc20udWIpLmFwcGx5KG51bGwsYXJndW1lbnRzKX0sa2M9Ui5fZW1zY3JpcHRlbl9lbnVtX2RyYWNvX0dlb21ldHJ5QXR0cmlidXRlX1R5cGVfVEVYX0NPT1JEPWZ1bmN0aW9uKCl7cmV0dXJuKGtjPVIuX2Vtc2NyaXB0ZW5fZW51bV9kcmFjb19HZW9tZXRyeUF0dHJpYnV0ZV9UeXBlX1RFWF9DT09SRD1SLmFzbS52YikuYXBwbHkobnVsbCxhcmd1bWVudHMpfSxfbD1SLl9lbXNjcmlwdGVuX2VudW1fZHJhY29fR2VvbWV0cnlBdHRyaWJ1dGVfVHlwZV9HRU5FUklDPWZ1bmN0aW9uKCl7cmV0dXJuKF9sPVIuX2Vtc2NyaXB0ZW5fZW51bV9kcmFjb19HZW9tZXRyeUF0dHJpYnV0ZV9UeXBlX0dFTkVSSUM9Ui5hc20ud2IpLmFwcGx5KG51bGwsYXJndW1lbnRzKX0sdGY9Ui5fZW1zY3JpcHRlbl9lbnVtX2RyYWNvX0VuY29kZWRHZW9tZXRyeVR5cGVfSU5WQUxJRF9HRU9NRVRSWV9UWVBFPWZ1bmN0aW9uKCl7cmV0dXJuKHRmPVIuX2Vtc2NyaXB0ZW5fZW51bV9kcmFjb19FbmNvZGVkR2VvbWV0cnlUeXBlX0lOVkFMSURfR0VPTUVUUllfVFlQRT1SLmFzbS54YikuYXBwbHkobnVsbCxhcmd1bWVudHMpfSx5bD1SLl9lbXNjcmlwdGVuX2VudW1fZHJhY29fRW5jb2RlZEdlb21ldHJ5VHlwZV9QT0lOVF9DTE9VRD1mdW5jdGlvbigpe3JldHVybih5bD1SLl9lbXNjcmlwdGVuX2VudW1fZHJhY29fRW5jb2RlZEdlb21ldHJ5VHlwZV9QT0lOVF9DTE9VRD1SLmFzbS55YikuYXBwbHkobnVsbCxhcmd1bWVudHMpfSxnbD1SLl9lbXNjcmlwdGVuX2VudW1fZHJhY29fRW5jb2RlZEdlb21ldHJ5VHlwZV9UUklBTkdVTEFSX01FU0g9ZnVuY3Rpb24oKXtyZXR1cm4oZ2w9Ui5fZW1zY3JpcHRlbl9lbnVtX2RyYWNvX0VuY29kZWRHZW9tZXRyeVR5cGVfVFJJQU5HVUxBUl9NRVNIPVIuYXNtLnpiKS5hcHBseShudWxsLGFyZ3VtZW50cyl9LEFsPVIuX2Vtc2NyaXB0ZW5fZW51bV9kcmFjb19EYXRhVHlwZV9EVF9JTlZBTElEPWZ1bmN0aW9uKCl7cmV0dXJuKEFsPVIuX2Vtc2NyaXB0ZW5fZW51bV9kcmFjb19EYXRhVHlwZV9EVF9JTlZBTElEPVIuYXNtLkFiKS5hcHBseShudWxsLGFyZ3VtZW50cyl9LGJsPVIuX2Vtc2NyaXB0ZW5fZW51bV9kcmFjb19EYXRhVHlwZV9EVF9JTlQ4PWZ1bmN0aW9uKCl7cmV0dXJuKGJsPVIuX2Vtc2NyaXB0ZW5fZW51bV9kcmFjb19EYXRhVHlwZV9EVF9JTlQ4PVIuYXNtLkJiKS5hcHBseShudWxsLGFyZ3VtZW50cyl9LFRsPVIuX2Vtc2NyaXB0ZW5fZW51bV9kcmFjb19EYXRhVHlwZV9EVF9VSU5UOD1mdW5jdGlvbigpe3JldHVybihUbD1SLl9lbXNjcmlwdGVuX2VudW1fZHJhY29fRGF0YVR5cGVfRFRfVUlOVDg9Ui5hc20uQ2IpLmFwcGx5KG51bGwsYXJndW1lbnRzKX0sd2w9Ui5fZW1zY3JpcHRlbl9lbnVtX2RyYWNvX0RhdGFUeXBlX0RUX0lOVDE2PWZ1bmN0aW9uKCl7cmV0dXJuKHdsPVIuX2Vtc2NyaXB0ZW5fZW51bV9kcmFjb19EYXRhVHlwZV9EVF9JTlQxNj1SLmFzbS5EYikuYXBwbHkobnVsbCxhcmd1bWVudHMpfSxPbD1SLl9lbXNjcmlwdGVuX2VudW1fZHJhY29fRGF0YVR5cGVfRFRfVUlOVDE2PWZ1bmN0aW9uKCl7cmV0dXJuKE9sPVIuX2Vtc2NyaXB0ZW5fZW51bV9kcmFjb19EYXRhVHlwZV9EVF9VSU5UMTY9Ui5hc20uRWIpLmFwcGx5KG51bGwsYXJndW1lbnRzKX0sRWw9Ui5fZW1zY3JpcHRlbl9lbnVtX2RyYWNvX0RhdGFUeXBlX0RUX0lOVDMyPWZ1bmN0aW9uKCl7cmV0dXJuKEVsPVIuX2Vtc2NyaXB0ZW5fZW51bV9kcmFjb19EYXRhVHlwZV9EVF9JTlQzMj1SLmFzbS5GYikuYXBwbHkobnVsbCxhcmd1bWVudHMpfSxlZj1SLl9lbXNjcmlwdGVuX2VudW1fZHJhY29fRGF0YVR5cGVfRFRfVUlOVDMyPWZ1bmN0aW9uKCl7cmV0dXJuKGVmPVIuX2Vtc2NyaXB0ZW5fZW51bV9kcmFjb19EYXRhVHlwZV9EVF9VSU5UMzI9Ui5hc20uR2IpLmFwcGx5KG51bGwsYXJndW1lbnRzKX0sUmw9Ui5fZW1zY3JpcHRlbl9lbnVtX2RyYWNvX0RhdGFUeXBlX0RUX0lOVDY0PWZ1bmN0aW9uKCl7cmV0dXJuKFJsPVIuX2Vtc2NyaXB0ZW5fZW51bV9kcmFjb19EYXRhVHlwZV9EVF9JTlQ2ND1SLmFzbS5IYikuYXBwbHkobnVsbCxhcmd1bWVudHMpfSxTbD1SLl9lbXNjcmlwdGVuX2VudW1fZHJhY29fRGF0YVR5cGVfRFRfVUlOVDY0PWZ1bmN0aW9uKCl7cmV0dXJuKFNsPVIuX2Vtc2NyaXB0ZW5fZW51bV9kcmFjb19EYXRhVHlwZV9EVF9VSU5UNjQ9Ui5hc20uSWIpLmFwcGx5KG51bGwsYXJndW1lbnRzKX0sQ2w9Ui5fZW1zY3JpcHRlbl9lbnVtX2RyYWNvX0RhdGFUeXBlX0RUX0ZMT0FUMzI9ZnVuY3Rpb24oKXtyZXR1cm4oQ2w9Ui5fZW1zY3JpcHRlbl9lbnVtX2RyYWNvX0RhdGFUeXBlX0RUX0ZMT0FUMzI9Ui5hc20uSmIpLmFwcGx5KG51bGwsYXJndW1lbnRzKX0seGw9Ui5fZW1zY3JpcHRlbl9lbnVtX2RyYWNvX0RhdGFUeXBlX0RUX0ZMT0FUNjQ9ZnVuY3Rpb24oKXtyZXR1cm4oeGw9Ui5fZW1zY3JpcHRlbl9lbnVtX2RyYWNvX0RhdGFUeXBlX0RUX0ZMT0FUNjQ9Ui5hc20uS2IpLmFwcGx5KG51bGwsYXJndW1lbnRzKX0sUGw9Ui5fZW1zY3JpcHRlbl9lbnVtX2RyYWNvX0RhdGFUeXBlX0RUX0JPT0w9ZnVuY3Rpb24oKXtyZXR1cm4oUGw9Ui5fZW1zY3JpcHRlbl9lbnVtX2RyYWNvX0RhdGFUeXBlX0RUX0JPT0w9Ui5hc20uTGIpLmFwcGx5KG51bGwsYXJndW1lbnRzKX0sTWw9Ui5fZW1zY3JpcHRlbl9lbnVtX2RyYWNvX0RhdGFUeXBlX0RUX1RZUEVTX0NPVU5UPWZ1bmN0aW9uKCl7cmV0dXJuKE1sPVIuX2Vtc2NyaXB0ZW5fZW51bV9kcmFjb19EYXRhVHlwZV9EVF9UWVBFU19DT1VOVD1SLmFzbS5NYikuYXBwbHkobnVsbCxhcmd1bWVudHMpfSxObD1SLl9lbXNjcmlwdGVuX2VudW1fZHJhY29fU3RhdHVzQ29kZV9PSz1mdW5jdGlvbigpe3JldHVybihObD1SLl9lbXNjcmlwdGVuX2VudW1fZHJhY29fU3RhdHVzQ29kZV9PSz1SLmFzbS5OYikuYXBwbHkobnVsbCxhcmd1bWVudHMpfSxVcz1SLl9lbXNjcmlwdGVuX2VudW1fZHJhY29fU3RhdHVzQ29kZV9EUkFDT19FUlJPUj1mdW5jdGlvbigpe3JldHVybihVcz1SLl9lbXNjcmlwdGVuX2VudW1fZHJhY29fU3RhdHVzQ29kZV9EUkFDT19FUlJPUj1SLmFzbS5PYikuYXBwbHkobnVsbCxhcmd1bWVudHMpfSxJbD1SLl9lbXNjcmlwdGVuX2VudW1fZHJhY29fU3RhdHVzQ29kZV9JT19FUlJPUj1mdW5jdGlvbigpe3JldHVybihJbD1SLl9lbXNjcmlwdGVuX2VudW1fZHJhY29fU3RhdHVzQ29kZV9JT19FUlJPUj1SLmFzbS5QYikuYXBwbHkobnVsbCxhcmd1bWVudHMpfSx2bD1SLl9lbXNjcmlwdGVuX2VudW1fZHJhY29fU3RhdHVzQ29kZV9JTlZBTElEX1BBUkFNRVRFUj1mdW5jdGlvbigpe3JldHVybih2bD1SLl9lbXNjcmlwdGVuX2VudW1fZHJhY29fU3RhdHVzQ29kZV9JTlZBTElEX1BBUkFNRVRFUj1SLmFzbS5RYikuYXBwbHkobnVsbCxhcmd1bWVudHMpfSxMbD1SLl9lbXNjcmlwdGVuX2VudW1fZHJhY29fU3RhdHVzQ29kZV9VTlNVUFBPUlRFRF9WRVJTSU9OPWZ1bmN0aW9uKCl7cmV0dXJuKExsPVIuX2Vtc2NyaXB0ZW5fZW51bV9kcmFjb19TdGF0dXNDb2RlX1VOU1VQUE9SVEVEX1ZFUlNJT049Ui5hc20uUmIpLmFwcGx5KG51bGwsYXJndW1lbnRzKX0sRGw9Ui5fZW1zY3JpcHRlbl9lbnVtX2RyYWNvX1N0YXR1c0NvZGVfVU5LTk9XTl9WRVJTSU9OPWZ1bmN0aW9uKCl7cmV0dXJuKERsPVIuX2Vtc2NyaXB0ZW5fZW51bV9kcmFjb19TdGF0dXNDb2RlX1VOS05PV05fVkVSU0lPTj1SLmFzbS5TYikuYXBwbHkobnVsbCxhcmd1bWVudHMpfTtSLl9tYWxsb2M9ZnVuY3Rpb24oKXtyZXR1cm4oUi5fbWFsbG9jPVIuYXNtLlRiKS5hcHBseShudWxsLGFyZ3VtZW50cyl9LFIuX2ZyZWU9ZnVuY3Rpb24oKXtyZXR1cm4oUi5fZnJlZT1SLmFzbS5VYikuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIgRmw9ZnVuY3Rpb24oKXtyZXR1cm4oRmw9Ui5hc20uVmIpLmFwcGx5KG51bGwsYXJndW1lbnRzKX07Ui5fX19zdGFydF9lbV9qcz0xNTg1NixSLl9fX3N0b3BfZW1fanM9MTU5NTQ7dmFyIG5mO2lmKGRuPWZ1bmN0aW9uIHooKXtuZnx8cCgpLG5mfHwoZG49eil9LFIucHJlSW5pdClmb3IodHlwZW9mIFIucHJlSW5pdD09ImZ1bmN0aW9uIiYmKFIucHJlSW5pdD1bUi5wcmVJbml0XSk7MDxSLnByZUluaXQubGVuZ3RoOylSLnByZUluaXQucG9wKCkoKTtwKCksZC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShkLnByb3RvdHlwZSksZC5wcm90b3R5cGUuY29uc3RydWN0b3I9ZCxkLnByb3RvdHlwZS5fX2NsYXNzX189ZCxkLl9fY2FjaGVfXz17fSxSLldyYXBwZXJPYmplY3Q9ZCxSLmdldENhY2hlPW0sUi53cmFwUG9pbnRlcj1fLFIuY2FzdE9iamVjdD1mdW5jdGlvbih6LFcpe3JldHVybiBfKHoucHRyLFcpfSxSLk5VTEw9XygwKSxSLmRlc3Ryb3k9ZnVuY3Rpb24oeil7aWYoIXouX19kZXN0cm95X18pdGhyb3ciRXJyb3I6IENhbm5vdCBkZXN0cm95IG9iamVjdC4gKERpZCB5b3UgY3JlYXRlIGl0IHlvdXJzZWxmPykiO3ouX19kZXN0cm95X18oKSxkZWxldGUgbSh6Ll9fY2xhc3NfXylbei5wdHJdfSxSLmNvbXBhcmU9ZnVuY3Rpb24oeixXKXtyZXR1cm4gei5wdHI9PT1XLnB0cn0sUi5nZXRQb2ludGVyPWZ1bmN0aW9uKHope3JldHVybiB6LnB0cn0sUi5nZXRDbGFzcz1mdW5jdGlvbih6KXtyZXR1cm4gei5fX2NsYXNzX199O3ZhciBDZT17YnVmZmVyOjAsc2l6ZTowLHBvczowLHRlbXBzOltdLG5lZWRlZDowLHByZXBhcmU6ZnVuY3Rpb24oKXtpZihDZS5uZWVkZWQpe2Zvcih2YXIgej0wO3o8Q2UudGVtcHMubGVuZ3RoO3orKylSLl9mcmVlKENlLnRlbXBzW3pdKTtDZS50ZW1wcy5sZW5ndGg9MCxSLl9mcmVlKENlLmJ1ZmZlciksQ2UuYnVmZmVyPTAsQ2Uuc2l6ZSs9Q2UubmVlZGVkLENlLm5lZWRlZD0wfUNlLmJ1ZmZlcnx8KENlLnNpemUrPTEyOCxDZS5idWZmZXI9Ui5fbWFsbG9jKENlLnNpemUpLENlLmJ1ZmZlcnx8cyh2b2lkIDApKSxDZS5wb3M9MH0sYWxsb2M6ZnVuY3Rpb24oeixXKXtyZXR1cm4gQ2UuYnVmZmVyfHxzKHZvaWQgMCksej16Lmxlbmd0aCpXLkJZVEVTX1BFUl9FTEVNRU5ULHo9eis3Ji04LENlLnBvcyt6Pj1DZS5zaXplPygwPHp8fHModm9pZCAwKSxDZS5uZWVkZWQrPXosVz1SLl9tYWxsb2MoeiksQ2UudGVtcHMucHVzaChXKSk6KFc9Q2UuYnVmZmVyK0NlLnBvcyxDZS5wb3MrPXopLFd9LGNvcHk6ZnVuY3Rpb24oeixXLGV0KXtzd2l0Y2goZXQ+Pj49MCxXLkJZVEVTX1BFUl9FTEVNRU5UKXtjYXNlIDI6ZXQ+Pj49MTticmVhaztjYXNlIDQ6ZXQ+Pj49MjticmVhaztjYXNlIDg6ZXQ+Pj49M31mb3IodmFyIE10PTA7TXQ8ei5sZW5ndGg7TXQrKylXW2V0K010XT16W010XX19O3JldHVybiBULnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGQucHJvdG90eXBlKSxULnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1ULFQucHJvdG90eXBlLl9fY2xhc3NfXz1ULFQuX19jYWNoZV9fPXt9LFIuVm9pZFB0cj1ULFQucHJvdG90eXBlLl9fZGVzdHJveV9fPVQucHJvdG90eXBlLl9fZGVzdHJveV9fPWZ1bmN0aW9uKCl7WmUodGhpcy5wdHIpfSxPLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGQucHJvdG90eXBlKSxPLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1PLE8ucHJvdG90eXBlLl9fY2xhc3NfXz1PLE8uX19jYWNoZV9fPXt9LFIuRGVjb2RlckJ1ZmZlcj1PLE8ucHJvdG90eXBlLkluaXQ9Ty5wcm90b3R5cGUuSW5pdD1mdW5jdGlvbih6LFcpe3ZhciBldD10aGlzLnB0cjtDZS5wcmVwYXJlKCksdHlwZW9mIHo9PSJvYmplY3QiJiYoej1iKHopKSxXJiZ0eXBlb2YgVz09Im9iamVjdCImJihXPVcucHRyKSxLZShldCx6LFcpfSxPLnByb3RvdHlwZS5fX2Rlc3Ryb3lfXz1PLnByb3RvdHlwZS5fX2Rlc3Ryb3lfXz1mdW5jdGlvbigpe2huKHRoaXMucHRyKX0sRS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShkLnByb3RvdHlwZSksRS5wcm90b3R5cGUuY29uc3RydWN0b3I9RSxFLnByb3RvdHlwZS5fX2NsYXNzX189RSxFLl9fY2FjaGVfXz17fSxSLkF0dHJpYnV0ZVRyYW5zZm9ybURhdGE9RSxFLnByb3RvdHlwZS50cmFuc2Zvcm1fdHlwZT1FLnByb3RvdHlwZS50cmFuc2Zvcm1fdHlwZT1mdW5jdGlvbigpe3JldHVybiBxbih0aGlzLnB0cil9LEUucHJvdG90eXBlLl9fZGVzdHJveV9fPUUucHJvdG90eXBlLl9fZGVzdHJveV9fPWZ1bmN0aW9uKCl7S24odGhpcy5wdHIpfSx3LnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGQucHJvdG90eXBlKSx3LnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj13LHcucHJvdG90eXBlLl9fY2xhc3NfXz13LHcuX19jYWNoZV9fPXt9LFIuR2VvbWV0cnlBdHRyaWJ1dGU9dyx3LnByb3RvdHlwZS5fX2Rlc3Ryb3lfXz13LnByb3RvdHlwZS5fX2Rlc3Ryb3lfXz1mdW5jdGlvbigpe3plKHRoaXMucHRyKX0sQy5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShkLnByb3RvdHlwZSksQy5wcm90b3R5cGUuY29uc3RydWN0b3I9QyxDLnByb3RvdHlwZS5fX2NsYXNzX189QyxDLl9fY2FjaGVfXz17fSxSLlBvaW50QXR0cmlidXRlPUMsQy5wcm90b3R5cGUuc2l6ZT1DLnByb3RvdHlwZS5zaXplPWZ1bmN0aW9uKCl7cmV0dXJuIERuKHRoaXMucHRyKX0sQy5wcm90b3R5cGUuR2V0QXR0cmlidXRlVHJhbnNmb3JtRGF0YT1DLnByb3RvdHlwZS5HZXRBdHRyaWJ1dGVUcmFuc2Zvcm1EYXRhPWZ1bmN0aW9uKCl7cmV0dXJuIF8oV24odGhpcy5wdHIpLEUpfSxDLnByb3RvdHlwZS5hdHRyaWJ1dGVfdHlwZT1DLnByb3RvdHlwZS5hdHRyaWJ1dGVfdHlwZT1mdW5jdGlvbigpe3JldHVybiB6byh0aGlzLnB0cil9LEMucHJvdG90eXBlLmRhdGFfdHlwZT1DLnByb3RvdHlwZS5kYXRhX3R5cGU9ZnVuY3Rpb24oKXtyZXR1cm4gcm4odGhpcy5wdHIpfSxDLnByb3RvdHlwZS5udW1fY29tcG9uZW50cz1DLnByb3RvdHlwZS5udW1fY29tcG9uZW50cz1mdW5jdGlvbigpe3JldHVybiBSbih0aGlzLnB0cil9LEMucHJvdG90eXBlLm5vcm1hbGl6ZWQ9Qy5wcm90b3R5cGUubm9ybWFsaXplZD1mdW5jdGlvbigpe3JldHVybiEhYXIodGhpcy5wdHIpfSxDLnByb3RvdHlwZS5ieXRlX3N0cmlkZT1DLnByb3RvdHlwZS5ieXRlX3N0cmlkZT1mdW5jdGlvbigpe3JldHVybiBRbih0aGlzLnB0cil9LEMucHJvdG90eXBlLmJ5dGVfb2Zmc2V0PUMucHJvdG90eXBlLmJ5dGVfb2Zmc2V0PWZ1bmN0aW9uKCl7cmV0dXJuIGpvKHRoaXMucHRyKX0sQy5wcm90b3R5cGUudW5pcXVlX2lkPUMucHJvdG90eXBlLnVuaXF1ZV9pZD1mdW5jdGlvbigpe3JldHVybiBOcih0aGlzLnB0cil9LEMucHJvdG90eXBlLl9fZGVzdHJveV9fPUMucHJvdG90eXBlLl9fZGVzdHJveV9fPWZ1bmN0aW9uKCl7TnModGhpcy5wdHIpfSxOLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGQucHJvdG90eXBlKSxOLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1OLE4ucHJvdG90eXBlLl9fY2xhc3NfXz1OLE4uX19jYWNoZV9fPXt9LFIuQXR0cmlidXRlUXVhbnRpemF0aW9uVHJhbnNmb3JtPU4sTi5wcm90b3R5cGUuSW5pdEZyb21BdHRyaWJ1dGU9Ti5wcm90b3R5cGUuSW5pdEZyb21BdHRyaWJ1dGU9ZnVuY3Rpb24oeil7dmFyIFc9dGhpcy5wdHI7cmV0dXJuIHomJnR5cGVvZiB6PT0ib2JqZWN0IiYmKHo9ei5wdHIpLCEhWWkoVyx6KX0sTi5wcm90b3R5cGUucXVhbnRpemF0aW9uX2JpdHM9Ti5wcm90b3R5cGUucXVhbnRpemF0aW9uX2JpdHM9ZnVuY3Rpb24oKXtyZXR1cm4gSXIodGhpcy5wdHIpfSxOLnByb3RvdHlwZS5taW5fdmFsdWU9Ti5wcm90b3R5cGUubWluX3ZhbHVlPWZ1bmN0aW9uKHope3ZhciBXPXRoaXMucHRyO3JldHVybiB6JiZ0eXBlb2Ygej09Im9iamVjdCImJih6PXoucHRyKSwkaShXLHopfSxOLnByb3RvdHlwZS5yYW5nZT1OLnByb3RvdHlwZS5yYW5nZT1mdW5jdGlvbigpe3JldHVybiB2cyh0aGlzLnB0cil9LE4ucHJvdG90eXBlLl9fZGVzdHJveV9fPU4ucHJvdG90eXBlLl9fZGVzdHJveV9fPWZ1bmN0aW9uKCl7YmkodGhpcy5wdHIpfSxJLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGQucHJvdG90eXBlKSxJLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1JLEkucHJvdG90eXBlLl9fY2xhc3NfXz1JLEkuX19jYWNoZV9fPXt9LFIuQXR0cmlidXRlT2N0YWhlZHJvblRyYW5zZm9ybT1JLEkucHJvdG90eXBlLkluaXRGcm9tQXR0cmlidXRlPUkucHJvdG90eXBlLkluaXRGcm9tQXR0cmlidXRlPWZ1bmN0aW9uKHope3ZhciBXPXRoaXMucHRyO3JldHVybiB6JiZ0eXBlb2Ygej09Im9iamVjdCImJih6PXoucHRyKSwhIXBvKFcseil9LEkucHJvdG90eXBlLnF1YW50aXphdGlvbl9iaXRzPUkucHJvdG90eXBlLnF1YW50aXphdGlvbl9iaXRzPWZ1bmN0aW9uKCl7cmV0dXJuIHZyKHRoaXMucHRyKX0sSS5wcm90b3R5cGUuX19kZXN0cm95X189SS5wcm90b3R5cGUuX19kZXN0cm95X189ZnVuY3Rpb24oKXtNYyh0aGlzLnB0cil9LEQucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoZC5wcm90b3R5cGUpLEQucHJvdG90eXBlLmNvbnN0cnVjdG9yPUQsRC5wcm90b3R5cGUuX19jbGFzc19fPUQsRC5fX2NhY2hlX189e30sUi5Qb2ludENsb3VkPUQsRC5wcm90b3R5cGUubnVtX2F0dHJpYnV0ZXM9RC5wcm90b3R5cGUubnVtX2F0dHJpYnV0ZXM9ZnVuY3Rpb24oKXtyZXR1cm4gRm4odGhpcy5wdHIpfSxELnByb3RvdHlwZS5udW1fcG9pbnRzPUQucHJvdG90eXBlLm51bV9wb2ludHM9ZnVuY3Rpb24oKXtyZXR1cm4gVGkodGhpcy5wdHIpfSxELnByb3RvdHlwZS5fX2Rlc3Ryb3lfXz1ELnByb3RvdHlwZS5fX2Rlc3Ryb3lfXz1mdW5jdGlvbigpe0RlKHRoaXMucHRyKX0sdi5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShkLnByb3RvdHlwZSksdi5wcm90b3R5cGUuY29uc3RydWN0b3I9dix2LnByb3RvdHlwZS5fX2NsYXNzX189dix2Ll9fY2FjaGVfXz17fSxSLk1lc2g9dix2LnByb3RvdHlwZS5udW1fZmFjZXM9di5wcm90b3R5cGUubnVtX2ZhY2VzPWZ1bmN0aW9uKCl7cmV0dXJuIEF1KHRoaXMucHRyKX0sdi5wcm90b3R5cGUubnVtX2F0dHJpYnV0ZXM9di5wcm90b3R5cGUubnVtX2F0dHJpYnV0ZXM9ZnVuY3Rpb24oKXtyZXR1cm4gYnUodGhpcy5wdHIpfSx2LnByb3RvdHlwZS5udW1fcG9pbnRzPXYucHJvdG90eXBlLm51bV9wb2ludHM9ZnVuY3Rpb24oKXtyZXR1cm4gVHUodGhpcy5wdHIpfSx2LnByb3RvdHlwZS5fX2Rlc3Ryb3lfXz12LnByb3RvdHlwZS5fX2Rlc3Ryb3lfXz1mdW5jdGlvbigpe0ljKHRoaXMucHRyKX0sTC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShkLnByb3RvdHlwZSksTC5wcm90b3R5cGUuY29uc3RydWN0b3I9TCxMLnByb3RvdHlwZS5fX2NsYXNzX189TCxMLl9fY2FjaGVfXz17fSxSLk1ldGFkYXRhPUwsTC5wcm90b3R5cGUuX19kZXN0cm95X189TC5wcm90b3R5cGUuX19kZXN0cm95X189ZnVuY3Rpb24oKXtIYSh0aGlzLnB0cil9LFUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoZC5wcm90b3R5cGUpLFUucHJvdG90eXBlLmNvbnN0cnVjdG9yPVUsVS5wcm90b3R5cGUuX19jbGFzc19fPVUsVS5fX2NhY2hlX189e30sUi5TdGF0dXM9VSxVLnByb3RvdHlwZS5jb2RlPVUucHJvdG90eXBlLmNvZGU9ZnVuY3Rpb24oKXtyZXR1cm4gd3UodGhpcy5wdHIpfSxVLnByb3RvdHlwZS5vaz1VLnByb3RvdHlwZS5vaz1mdW5jdGlvbigpe3JldHVybiEhcWEodGhpcy5wdHIpfSxVLnByb3RvdHlwZS5lcnJvcl9tc2c9VS5wcm90b3R5cGUuZXJyb3JfbXNnPWZ1bmN0aW9uKCl7cmV0dXJuIHIoWmkodGhpcy5wdHIpKX0sVS5wcm90b3R5cGUuX19kZXN0cm95X189VS5wcm90b3R5cGUuX19kZXN0cm95X189ZnVuY3Rpb24oKXtPdSh0aGlzLnB0cil9LEEucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoZC5wcm90b3R5cGUpLEEucHJvdG90eXBlLmNvbnN0cnVjdG9yPUEsQS5wcm90b3R5cGUuX19jbGFzc19fPUEsQS5fX2NhY2hlX189e30sUi5EcmFjb0Zsb2F0MzJBcnJheT1BLEEucHJvdG90eXBlLkdldFZhbHVlPUEucHJvdG90eXBlLkdldFZhbHVlPWZ1bmN0aW9uKHope3ZhciBXPXRoaXMucHRyO3JldHVybiB6JiZ0eXBlb2Ygej09Im9iamVjdCImJih6PXoucHRyKSxSdShXLHopfSxBLnByb3RvdHlwZS5zaXplPUEucHJvdG90eXBlLnNpemU9ZnVuY3Rpb24oKXtyZXR1cm4gUWkodGhpcy5wdHIpfSxBLnByb3RvdHlwZS5fX2Rlc3Ryb3lfXz1BLnByb3RvdHlwZS5fX2Rlc3Ryb3lfXz1mdW5jdGlvbigpe0ppKHRoaXMucHRyKX0sUy5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShkLnByb3RvdHlwZSksUy5wcm90b3R5cGUuY29uc3RydWN0b3I9UyxTLnByb3RvdHlwZS5fX2NsYXNzX189UyxTLl9fY2FjaGVfXz17fSxSLkRyYWNvSW50OEFycmF5PVMsUy5wcm90b3R5cGUuR2V0VmFsdWU9Uy5wcm90b3R5cGUuR2V0VmFsdWU9ZnVuY3Rpb24oeil7dmFyIFc9dGhpcy5wdHI7cmV0dXJuIHomJnR5cGVvZiB6PT0ib2JqZWN0IiYmKHo9ei5wdHIpLFN1KFcseil9LFMucHJvdG90eXBlLnNpemU9Uy5wcm90b3R5cGUuc2l6ZT1mdW5jdGlvbigpe3JldHVybiBDdSh0aGlzLnB0cil9LFMucHJvdG90eXBlLl9fZGVzdHJveV9fPVMucHJvdG90eXBlLl9fZGVzdHJveV9fPWZ1bmN0aW9uKCl7THIodGhpcy5wdHIpfSxQLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGQucHJvdG90eXBlKSxQLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1QLFAucHJvdG90eXBlLl9fY2xhc3NfXz1QLFAuX19jYWNoZV9fPXt9LFIuRHJhY29VSW50OEFycmF5PVAsUC5wcm90b3R5cGUuR2V0VmFsdWU9UC5wcm90b3R5cGUuR2V0VmFsdWU9ZnVuY3Rpb24oeil7dmFyIFc9dGhpcy5wdHI7cmV0dXJuIHomJnR5cGVvZiB6PT0ib2JqZWN0IiYmKHo9ei5wdHIpLFdhKFcseil9LFAucHJvdG90eXBlLnNpemU9UC5wcm90b3R5cGUuc2l6ZT1mdW5jdGlvbigpe3JldHVybiBEYyh0aGlzLnB0cil9LFAucHJvdG90eXBlLl9fZGVzdHJveV9fPVAucHJvdG90eXBlLl9fZGVzdHJveV9fPWZ1bmN0aW9uKCl7eHUodGhpcy5wdHIpfSxGLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGQucHJvdG90eXBlKSxGLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1GLEYucHJvdG90eXBlLl9fY2xhc3NfXz1GLEYuX19jYWNoZV9fPXt9LFIuRHJhY29JbnQxNkFycmF5PUYsRi5wcm90b3R5cGUuR2V0VmFsdWU9Ri5wcm90b3R5cGUuR2V0VmFsdWU9ZnVuY3Rpb24oeil7dmFyIFc9dGhpcy5wdHI7cmV0dXJuIHomJnR5cGVvZiB6PT0ib2JqZWN0IiYmKHo9ei5wdHIpLFB1KFcseil9LEYucHJvdG90eXBlLnNpemU9Ri5wcm90b3R5cGUuc2l6ZT1mdW5jdGlvbigpe3JldHVybiBNdSh0aGlzLnB0cil9LEYucHJvdG90eXBlLl9fZGVzdHJveV9fPUYucHJvdG90eXBlLl9fZGVzdHJveV9fPWZ1bmN0aW9uKCl7TnUodGhpcy5wdHIpfSxqLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGQucHJvdG90eXBlKSxqLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1qLGoucHJvdG90eXBlLl9fY2xhc3NfXz1qLGouX19jYWNoZV9fPXt9LFIuRHJhY29VSW50MTZBcnJheT1qLGoucHJvdG90eXBlLkdldFZhbHVlPWoucHJvdG90eXBlLkdldFZhbHVlPWZ1bmN0aW9uKHope3ZhciBXPXRoaXMucHRyO3JldHVybiB6JiZ0eXBlb2Ygej09Im9iamVjdCImJih6PXoucHRyKSx2dShXLHopfSxqLnByb3RvdHlwZS5zaXplPWoucHJvdG90eXBlLnNpemU9ZnVuY3Rpb24oKXtyZXR1cm4gTHUodGhpcy5wdHIpfSxqLnByb3RvdHlwZS5fX2Rlc3Ryb3lfXz1qLnByb3RvdHlwZS5fX2Rlc3Ryb3lfXz1mdW5jdGlvbigpe1hhKHRoaXMucHRyKX0sSC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShkLnByb3RvdHlwZSksSC5wcm90b3R5cGUuY29uc3RydWN0b3I9SCxILnByb3RvdHlwZS5fX2NsYXNzX189SCxILl9fY2FjaGVfXz17fSxSLkRyYWNvSW50MzJBcnJheT1ILEgucHJvdG90eXBlLkdldFZhbHVlPUgucHJvdG90eXBlLkdldFZhbHVlPWZ1bmN0aW9uKHope3ZhciBXPXRoaXMucHRyO3JldHVybiB6JiZ0eXBlb2Ygej09Im9iamVjdCImJih6PXoucHRyKSxGdShXLHopfSxILnByb3RvdHlwZS5zaXplPUgucHJvdG90eXBlLnNpemU9ZnVuY3Rpb24oKXtyZXR1cm4gQnUodGhpcy5wdHIpfSxILnByb3RvdHlwZS5fX2Rlc3Ryb3lfXz1ILnByb3RvdHlwZS5fX2Rlc3Ryb3lfXz1mdW5jdGlvbigpe1V1KHRoaXMucHRyKX0say5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShkLnByb3RvdHlwZSksay5wcm90b3R5cGUuY29uc3RydWN0b3I9ayxrLnByb3RvdHlwZS5fX2NsYXNzX189ayxrLl9fY2FjaGVfXz17fSxSLkRyYWNvVUludDMyQXJyYXk9ayxrLnByb3RvdHlwZS5HZXRWYWx1ZT1rLnByb3RvdHlwZS5HZXRWYWx1ZT1mdW5jdGlvbih6KXt2YXIgVz10aGlzLnB0cjtyZXR1cm4geiYmdHlwZW9mIHo9PSJvYmplY3QiJiYoej16LnB0ciksVnUoVyx6KX0say5wcm90b3R5cGUuc2l6ZT1rLnByb3RvdHlwZS5zaXplPWZ1bmN0aW9uKCl7cmV0dXJuIGt1KHRoaXMucHRyKX0say5wcm90b3R5cGUuX19kZXN0cm95X189ay5wcm90b3R5cGUuX19kZXN0cm95X189ZnVuY3Rpb24oKXtMcyh0aGlzLnB0cil9LEsucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoZC5wcm90b3R5cGUpLEsucHJvdG90eXBlLmNvbnN0cnVjdG9yPUssSy5wcm90b3R5cGUuX19jbGFzc19fPUssSy5fX2NhY2hlX189e30sUi5NZXRhZGF0YVF1ZXJpZXI9SyxLLnByb3RvdHlwZS5IYXNFbnRyeT1LLnByb3RvdHlwZS5IYXNFbnRyeT1mdW5jdGlvbih6LFcpe3ZhciBldD10aGlzLnB0cjtyZXR1cm4gQ2UucHJlcGFyZSgpLHomJnR5cGVvZiB6PT0ib2JqZWN0IiYmKHo9ei5wdHIpLFc9VyYmdHlwZW9mIFc9PSJvYmplY3QiP1cucHRyOmcoVyksISF6dShldCx6LFcpfSxLLnByb3RvdHlwZS5HZXRJbnRFbnRyeT1LLnByb3RvdHlwZS5HZXRJbnRFbnRyeT1mdW5jdGlvbih6LFcpe3ZhciBldD10aGlzLnB0cjtyZXR1cm4gQ2UucHJlcGFyZSgpLHomJnR5cGVvZiB6PT0ib2JqZWN0IiYmKHo9ei5wdHIpLFc9VyYmdHlwZW9mIFc9PSJvYmplY3QiP1cucHRyOmcoVyksZnIoZXQseixXKX0sSy5wcm90b3R5cGUuR2V0SW50RW50cnlBcnJheT1LLnByb3RvdHlwZS5HZXRJbnRFbnRyeUFycmF5PWZ1bmN0aW9uKHosVyxldCl7dmFyIE10PXRoaXMucHRyO0NlLnByZXBhcmUoKSx6JiZ0eXBlb2Ygej09Im9iamVjdCImJih6PXoucHRyKSxXPVcmJnR5cGVvZiBXPT0ib2JqZWN0Ij9XLnB0cjpnKFcpLGV0JiZ0eXBlb2YgZXQ9PSJvYmplY3QiJiYoZXQ9ZXQucHRyKSxZYShNdCx6LFcsZXQpfSxLLnByb3RvdHlwZS5HZXREb3VibGVFbnRyeT1LLnByb3RvdHlwZS5HZXREb3VibGVFbnRyeT1mdW5jdGlvbih6LFcpe3ZhciBldD10aGlzLnB0cjtyZXR1cm4gQ2UucHJlcGFyZSgpLHomJnR5cGVvZiB6PT0ib2JqZWN0IiYmKHo9ei5wdHIpLFc9VyYmdHlwZW9mIFc9PSJvYmplY3QiP1cucHRyOmcoVyksanUoZXQseixXKX0sSy5wcm90b3R5cGUuR2V0U3RyaW5nRW50cnk9Sy5wcm90b3R5cGUuR2V0U3RyaW5nRW50cnk9ZnVuY3Rpb24oeixXKXt2YXIgZXQ9dGhpcy5wdHI7cmV0dXJuIENlLnByZXBhcmUoKSx6JiZ0eXBlb2Ygej09Im9iamVjdCImJih6PXoucHRyKSxXPVcmJnR5cGVvZiBXPT0ib2JqZWN0Ij9XLnB0cjpnKFcpLHIoSHUoZXQseixXKSl9LEsucHJvdG90eXBlLk51bUVudHJpZXM9Sy5wcm90b3R5cGUuTnVtRW50cmllcz1mdW5jdGlvbih6KXt2YXIgVz10aGlzLnB0cjtyZXR1cm4geiYmdHlwZW9mIHo9PSJvYmplY3QiJiYoej16LnB0cikscXUoVyx6KX0sSy5wcm90b3R5cGUuR2V0RW50cnlOYW1lPUsucHJvdG90eXBlLkdldEVudHJ5TmFtZT1mdW5jdGlvbih6LFcpe3ZhciBldD10aGlzLnB0cjtyZXR1cm4geiYmdHlwZW9mIHo9PSJvYmplY3QiJiYoej16LnB0ciksVyYmdHlwZW9mIFc9PSJvYmplY3QiJiYoVz1XLnB0cikscihIbyhldCx6LFcpKX0sSy5wcm90b3R5cGUuX19kZXN0cm95X189Sy5wcm90b3R5cGUuX19kZXN0cm95X189ZnVuY3Rpb24oKXskYSh0aGlzLnB0cil9LFgucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoZC5wcm90b3R5cGUpLFgucHJvdG90eXBlLmNvbnN0cnVjdG9yPVgsWC5wcm90b3R5cGUuX19jbGFzc19fPVgsWC5fX2NhY2hlX189e30sUi5EZWNvZGVyPVgsWC5wcm90b3R5cGUuRGVjb2RlQXJyYXlUb1BvaW50Q2xvdWQ9WC5wcm90b3R5cGUuRGVjb2RlQXJyYXlUb1BvaW50Q2xvdWQ9ZnVuY3Rpb24oeixXLGV0KXt2YXIgTXQ9dGhpcy5wdHI7cmV0dXJuIENlLnByZXBhcmUoKSx0eXBlb2Ygej09Im9iamVjdCImJih6PWIoeikpLFcmJnR5cGVvZiBXPT0ib2JqZWN0IiYmKFc9Vy5wdHIpLGV0JiZ0eXBlb2YgZXQ9PSJvYmplY3QiJiYoZXQ9ZXQucHRyKSxfKERzKE10LHosVyxldCksVSl9LFgucHJvdG90eXBlLkRlY29kZUFycmF5VG9NZXNoPVgucHJvdG90eXBlLkRlY29kZUFycmF5VG9NZXNoPWZ1bmN0aW9uKHosVyxldCl7dmFyIE10PXRoaXMucHRyO3JldHVybiBDZS5wcmVwYXJlKCksdHlwZW9mIHo9PSJvYmplY3QiJiYoej1iKHopKSxXJiZ0eXBlb2YgVz09Im9iamVjdCImJihXPVcucHRyKSxldCYmdHlwZW9mIGV0PT0ib2JqZWN0IiYmKGV0PWV0LnB0ciksXyhLdShNdCx6LFcsZXQpLFUpfSxYLnByb3RvdHlwZS5HZXRBdHRyaWJ1dGVJZD1YLnByb3RvdHlwZS5HZXRBdHRyaWJ1dGVJZD1mdW5jdGlvbih6LFcpe3ZhciBldD10aGlzLnB0cjtyZXR1cm4geiYmdHlwZW9mIHo9PSJvYmplY3QiJiYoej16LnB0ciksVyYmdHlwZW9mIFc9PSJvYmplY3QiJiYoVz1XLnB0ciksQmMoZXQseixXKX0sWC5wcm90b3R5cGUuR2V0QXR0cmlidXRlSWRCeU5hbWU9WC5wcm90b3R5cGUuR2V0QXR0cmlidXRlSWRCeU5hbWU9ZnVuY3Rpb24oeixXKXt2YXIgZXQ9dGhpcy5wdHI7cmV0dXJuIENlLnByZXBhcmUoKSx6JiZ0eXBlb2Ygej09Im9iamVjdCImJih6PXoucHRyKSxXPVcmJnR5cGVvZiBXPT0ib2JqZWN0Ij9XLnB0cjpnKFcpLFd1KGV0LHosVyl9LFgucHJvdG90eXBlLkdldEF0dHJpYnV0ZUlkQnlNZXRhZGF0YUVudHJ5PVgucHJvdG90eXBlLkdldEF0dHJpYnV0ZUlkQnlNZXRhZGF0YUVudHJ5PWZ1bmN0aW9uKHosVyxldCl7dmFyIE10PXRoaXMucHRyO3JldHVybiBDZS5wcmVwYXJlKCkseiYmdHlwZW9mIHo9PSJvYmplY3QiJiYoej16LnB0ciksVz1XJiZ0eXBlb2YgVz09Im9iamVjdCI/Vy5wdHI6ZyhXKSxldD1ldCYmdHlwZW9mIGV0PT0ib2JqZWN0Ij9ldC5wdHI6ZyhldCksUWEoTXQseixXLGV0KX0sWC5wcm90b3R5cGUuR2V0QXR0cmlidXRlPVgucHJvdG90eXBlLkdldEF0dHJpYnV0ZT1mdW5jdGlvbih6LFcpe3ZhciBldD10aGlzLnB0cjtyZXR1cm4geiYmdHlwZW9mIHo9PSJvYmplY3QiJiYoej16LnB0ciksVyYmdHlwZW9mIFc9PSJvYmplY3QiJiYoVz1XLnB0ciksXyhKYShldCx6LFcpLEMpfSxYLnByb3RvdHlwZS5HZXRBdHRyaWJ1dGVCeVVuaXF1ZUlkPVgucHJvdG90eXBlLkdldEF0dHJpYnV0ZUJ5VW5pcXVlSWQ9ZnVuY3Rpb24oeixXKXt2YXIgZXQ9dGhpcy5wdHI7cmV0dXJuIHomJnR5cGVvZiB6PT0ib2JqZWN0IiYmKHo9ei5wdHIpLFcmJnR5cGVvZiBXPT0ib2JqZWN0IiYmKFc9Vy5wdHIpLF8oWHUoZXQseixXKSxDKX0sWC5wcm90b3R5cGUuR2V0TWV0YWRhdGE9WC5wcm90b3R5cGUuR2V0TWV0YWRhdGE9ZnVuY3Rpb24oeil7dmFyIFc9dGhpcy5wdHI7cmV0dXJuIHomJnR5cGVvZiB6PT0ib2JqZWN0IiYmKHo9ei5wdHIpLF8oWXUoVyx6KSxMKX0sWC5wcm90b3R5cGUuR2V0QXR0cmlidXRlTWV0YWRhdGE9WC5wcm90b3R5cGUuR2V0QXR0cmlidXRlTWV0YWRhdGE9ZnVuY3Rpb24oeixXKXt2YXIgZXQ9dGhpcy5wdHI7cmV0dXJuIHomJnR5cGVvZiB6PT0ib2JqZWN0IiYmKHo9ei5wdHIpLFcmJnR5cGVvZiBXPT0ib2JqZWN0IiYmKFc9Vy5wdHIpLF8oVWMoZXQseixXKSxMKX0sWC5wcm90b3R5cGUuR2V0RmFjZUZyb21NZXNoPVgucHJvdG90eXBlLkdldEZhY2VGcm9tTWVzaD1mdW5jdGlvbih6LFcsZXQpe3ZhciBNdD10aGlzLnB0cjtyZXR1cm4geiYmdHlwZW9mIHo9PSJvYmplY3QiJiYoej16LnB0ciksVyYmdHlwZW9mIFc9PSJvYmplY3QiJiYoVz1XLnB0ciksZXQmJnR5cGVvZiBldD09Im9iamVjdCImJihldD1ldC5wdHIpLCEhQW8oTXQseixXLGV0KX0sWC5wcm90b3R5cGUuR2V0VHJpYW5nbGVTdHJpcHNGcm9tTWVzaD1YLnByb3RvdHlwZS5HZXRUcmlhbmdsZVN0cmlwc0Zyb21NZXNoPWZ1bmN0aW9uKHosVyl7dmFyIGV0PXRoaXMucHRyO3JldHVybiB6JiZ0eXBlb2Ygej09Im9iamVjdCImJih6PXoucHRyKSxXJiZ0eXBlb2YgVz09Im9iamVjdCImJihXPVcucHRyKSxWYyhldCx6LFcpfSxYLnByb3RvdHlwZS5HZXRUcmlhbmdsZXNVSW50MTZBcnJheT1YLnByb3RvdHlwZS5HZXRUcmlhbmdsZXNVSW50MTZBcnJheT1mdW5jdGlvbih6LFcsZXQpe3ZhciBNdD10aGlzLnB0cjtyZXR1cm4geiYmdHlwZW9mIHo9PSJvYmplY3QiJiYoej16LnB0ciksVyYmdHlwZW9mIFc9PSJvYmplY3QiJiYoVz1XLnB0ciksZXQmJnR5cGVvZiBldD09Im9iamVjdCImJihldD1ldC5wdHIpLCEhJHUoTXQseixXLGV0KX0sWC5wcm90b3R5cGUuR2V0VHJpYW5nbGVzVUludDMyQXJyYXk9WC5wcm90b3R5cGUuR2V0VHJpYW5nbGVzVUludDMyQXJyYXk9ZnVuY3Rpb24oeixXLGV0KXt2YXIgTXQ9dGhpcy5wdHI7cmV0dXJuIHomJnR5cGVvZiB6PT0ib2JqZWN0IiYmKHo9ei5wdHIpLFcmJnR5cGVvZiBXPT0ib2JqZWN0IiYmKFc9Vy5wdHIpLGV0JiZ0eXBlb2YgZXQ9PSJvYmplY3QiJiYoZXQ9ZXQucHRyKSwhIVp1KE10LHosVyxldCl9LFgucHJvdG90eXBlLkdldEF0dHJpYnV0ZUZsb2F0PVgucHJvdG90eXBlLkdldEF0dHJpYnV0ZUZsb2F0PWZ1bmN0aW9uKHosVyxldCl7dmFyIE10PXRoaXMucHRyO3JldHVybiB6JiZ0eXBlb2Ygej09Im9iamVjdCImJih6PXoucHRyKSxXJiZ0eXBlb2YgVz09Im9iamVjdCImJihXPVcucHRyKSxldCYmdHlwZW9mIGV0PT0ib2JqZWN0IiYmKGV0PWV0LnB0ciksISFRdShNdCx6LFcsZXQpfSxYLnByb3RvdHlwZS5HZXRBdHRyaWJ1dGVGbG9hdEZvckFsbFBvaW50cz1YLnByb3RvdHlwZS5HZXRBdHRyaWJ1dGVGbG9hdEZvckFsbFBvaW50cz1mdW5jdGlvbih6LFcsZXQpe3ZhciBNdD10aGlzLnB0cjtyZXR1cm4geiYmdHlwZW9mIHo9PSJvYmplY3QiJiYoej16LnB0ciksVyYmdHlwZW9mIFc9PSJvYmplY3QiJiYoVz1XLnB0ciksZXQmJnR5cGVvZiBldD09Im9iamVjdCImJihldD1ldC5wdHIpLCEhdXIoTXQseixXLGV0KX0sWC5wcm90b3R5cGUuR2V0QXR0cmlidXRlSW50Rm9yQWxsUG9pbnRzPVgucHJvdG90eXBlLkdldEF0dHJpYnV0ZUludEZvckFsbFBvaW50cz1mdW5jdGlvbih6LFcsZXQpe3ZhciBNdD10aGlzLnB0cjtyZXR1cm4geiYmdHlwZW9mIHo9PSJvYmplY3QiJiYoej16LnB0ciksVyYmdHlwZW9mIFc9PSJvYmplY3QiJiYoVz1XLnB0ciksZXQmJnR5cGVvZiBldD09Im9iamVjdCImJihldD1ldC5wdHIpLCEhSnUoTXQseixXLGV0KX0sWC5wcm90b3R5cGUuR2V0QXR0cmlidXRlSW50OEZvckFsbFBvaW50cz1YLnByb3RvdHlwZS5HZXRBdHRyaWJ1dGVJbnQ4Rm9yQWxsUG9pbnRzPWZ1bmN0aW9uKHosVyxldCl7dmFyIE10PXRoaXMucHRyO3JldHVybiB6JiZ0eXBlb2Ygej09Im9iamVjdCImJih6PXoucHRyKSxXJiZ0eXBlb2YgVz09Im9iamVjdCImJihXPVcucHRyKSxldCYmdHlwZW9mIGV0PT0ib2JqZWN0IiYmKGV0PWV0LnB0ciksISF0bChNdCx6LFcsZXQpfSxYLnByb3RvdHlwZS5HZXRBdHRyaWJ1dGVVSW50OEZvckFsbFBvaW50cz1YLnByb3RvdHlwZS5HZXRBdHRyaWJ1dGVVSW50OEZvckFsbFBvaW50cz1mdW5jdGlvbih6LFcsZXQpe3ZhciBNdD10aGlzLnB0cjtyZXR1cm4geiYmdHlwZW9mIHo9PSJvYmplY3QiJiYoej16LnB0ciksVyYmdHlwZW9mIFc9PSJvYmplY3QiJiYoVz1XLnB0ciksZXQmJnR5cGVvZiBldD09Im9iamVjdCImJihldD1ldC5wdHIpLCEhZWwoTXQseixXLGV0KX0sWC5wcm90b3R5cGUuR2V0QXR0cmlidXRlSW50MTZGb3JBbGxQb2ludHM9WC5wcm90b3R5cGUuR2V0QXR0cmlidXRlSW50MTZGb3JBbGxQb2ludHM9ZnVuY3Rpb24oeixXLGV0KXt2YXIgTXQ9dGhpcy5wdHI7cmV0dXJuIHomJnR5cGVvZiB6PT0ib2JqZWN0IiYmKHo9ei5wdHIpLFcmJnR5cGVvZiBXPT0ib2JqZWN0IiYmKFc9Vy5wdHIpLGV0JiZ0eXBlb2YgZXQ9PSJvYmplY3QiJiYoZXQ9ZXQucHRyKSwhIUZzKE10LHosVyxldCl9LFgucHJvdG90eXBlLkdldEF0dHJpYnV0ZVVJbnQxNkZvckFsbFBvaW50cz1YLnByb3RvdHlwZS5HZXRBdHRyaWJ1dGVVSW50MTZGb3JBbGxQb2ludHM9ZnVuY3Rpb24oeixXLGV0KXt2YXIgTXQ9dGhpcy5wdHI7cmV0dXJuIHomJnR5cGVvZiB6PT0ib2JqZWN0IiYmKHo9ei5wdHIpLFcmJnR5cGVvZiBXPT0ib2JqZWN0IiYmKFc9Vy5wdHIpLGV0JiZ0eXBlb2YgZXQ9PSJvYmplY3QiJiYoZXQ9ZXQucHRyKSwhIW5sKE10LHosVyxldCl9LFgucHJvdG90eXBlLkdldEF0dHJpYnV0ZUludDMyRm9yQWxsUG9pbnRzPVgucHJvdG90eXBlLkdldEF0dHJpYnV0ZUludDMyRm9yQWxsUG9pbnRzPWZ1bmN0aW9uKHosVyxldCl7dmFyIE10PXRoaXMucHRyO3JldHVybiB6JiZ0eXBlb2Ygej09Im9iamVjdCImJih6PXoucHRyKSxXJiZ0eXBlb2YgVz09Im9iamVjdCImJihXPVcucHRyKSxldCYmdHlwZW9mIGV0PT0ib2JqZWN0IiYmKGV0PWV0LnB0ciksISF3aShNdCx6LFcsZXQpfSxYLnByb3RvdHlwZS5HZXRBdHRyaWJ1dGVVSW50MzJGb3JBbGxQb2ludHM9WC5wcm90b3R5cGUuR2V0QXR0cmlidXRlVUludDMyRm9yQWxsUG9pbnRzPWZ1bmN0aW9uKHosVyxldCl7dmFyIE10PXRoaXMucHRyO3JldHVybiB6JiZ0eXBlb2Ygej09Im9iamVjdCImJih6PXoucHRyKSxXJiZ0eXBlb2YgVz09Im9iamVjdCImJihXPVcucHRyKSxldCYmdHlwZW9mIGV0PT0ib2JqZWN0IiYmKGV0PWV0LnB0ciksISFvbChNdCx6LFcsZXQpfSxYLnByb3RvdHlwZS5HZXRBdHRyaWJ1dGVEYXRhQXJyYXlGb3JBbGxQb2ludHM9WC5wcm90b3R5cGUuR2V0QXR0cmlidXRlRGF0YUFycmF5Rm9yQWxsUG9pbnRzPWZ1bmN0aW9uKHosVyxldCxNdCxsZSl7dmFyIFRlPXRoaXMucHRyO3JldHVybiB6JiZ0eXBlb2Ygej09Im9iamVjdCImJih6PXoucHRyKSxXJiZ0eXBlb2YgVz09Im9iamVjdCImJihXPVcucHRyKSxldCYmdHlwZW9mIGV0PT0ib2JqZWN0IiYmKGV0PWV0LnB0ciksTXQmJnR5cGVvZiBNdD09Im9iamVjdCImJihNdD1NdC5wdHIpLGxlJiZ0eXBlb2YgbGU9PSJvYmplY3QiJiYobGU9bGUucHRyKSwhIXJsKFRlLHosVyxldCxNdCxsZSl9LFgucHJvdG90eXBlLlNraXBBdHRyaWJ1dGVUcmFuc2Zvcm09WC5wcm90b3R5cGUuU2tpcEF0dHJpYnV0ZVRyYW5zZm9ybT1mdW5jdGlvbih6KXt2YXIgVz10aGlzLnB0cjt6JiZ0eXBlb2Ygej09Im9iamVjdCImJih6PXoucHRyKSxpbChXLHopfSxYLnByb3RvdHlwZS5HZXRFbmNvZGVkR2VvbWV0cnlUeXBlX0RlcHJlY2F0ZWQ9WC5wcm90b3R5cGUuR2V0RW5jb2RlZEdlb21ldHJ5VHlwZV9EZXByZWNhdGVkPWZ1bmN0aW9uKHope3ZhciBXPXRoaXMucHRyO3JldHVybiB6JiZ0eXBlb2Ygej09Im9iamVjdCImJih6PXoucHRyKSxzbChXLHopfSxYLnByb3RvdHlwZS5EZWNvZGVCdWZmZXJUb1BvaW50Q2xvdWQ9WC5wcm90b3R5cGUuRGVjb2RlQnVmZmVyVG9Qb2ludENsb3VkPWZ1bmN0aW9uKHosVyl7dmFyIGV0PXRoaXMucHRyO3JldHVybiB6JiZ0eXBlb2Ygej09Im9iamVjdCImJih6PXoucHRyKSxXJiZ0eXBlb2YgVz09Im9iamVjdCImJihXPVcucHRyKSxfKGNsKGV0LHosVyksVSl9LFgucHJvdG90eXBlLkRlY29kZUJ1ZmZlclRvTWVzaD1YLnByb3RvdHlwZS5EZWNvZGVCdWZmZXJUb01lc2g9ZnVuY3Rpb24oeixXKXt2YXIgZXQ9dGhpcy5wdHI7cmV0dXJuIHomJnR5cGVvZiB6PT0ib2JqZWN0IiYmKHo9ei5wdHIpLFcmJnR5cGVvZiBXPT0ib2JqZWN0IiYmKFc9Vy5wdHIpLF8oYWwoZXQseixXKSxVKX0sWC5wcm90b3R5cGUuX19kZXN0cm95X189WC5wcm90b3R5cGUuX19kZXN0cm95X189ZnVuY3Rpb24oKXtmbCh0aGlzLnB0cil9LGZ1bmN0aW9uKCl7ZnVuY3Rpb24geigpe1IuQVRUUklCVVRFX0lOVkFMSURfVFJBTlNGT1JNPXVsKCksUi5BVFRSSUJVVEVfTk9fVFJBTlNGT1JNPWxsKCksUi5BVFRSSUJVVEVfUVVBTlRJWkFUSU9OX1RSQU5TRk9STT1wbCgpLFIuQVRUUklCVVRFX09DVEFIRURST05fVFJBTlNGT1JNPWRsKCksUi5JTlZBTElEPWVzKCksUi5QT1NJVElPTj1tbCgpLFIuTk9STUFMPWhsKCksUi5DT0xPUj1CcygpLFIuVEVYX0NPT1JEPWtjKCksUi5HRU5FUklDPV9sKCksUi5JTlZBTElEX0dFT01FVFJZX1RZUEU9dGYoKSxSLlBPSU5UX0NMT1VEPXlsKCksUi5UUklBTkdVTEFSX01FU0g9Z2woKSxSLkRUX0lOVkFMSUQ9QWwoKSxSLkRUX0lOVDg9YmwoKSxSLkRUX1VJTlQ4PVRsKCksUi5EVF9JTlQxNj13bCgpLFIuRFRfVUlOVDE2PU9sKCksUi5EVF9JTlQzMj1FbCgpLFIuRFRfVUlOVDMyPWVmKCksUi5EVF9JTlQ2ND1SbCgpLFIuRFRfVUlOVDY0PVNsKCksUi5EVF9GTE9BVDMyPUNsKCksUi5EVF9GTE9BVDY0PXhsKCksUi5EVF9CT09MPVBsKCksUi5EVF9UWVBFU19DT1VOVD1NbCgpLFIuT0s9TmwoKSxSLkRSQUNPX0VSUk9SPVVzKCksUi5JT19FUlJPUj1JbCgpLFIuSU5WQUxJRF9QQVJBTUVURVI9dmwoKSxSLlVOU1VQUE9SVEVEX1ZFUlNJT049TGwoKSxSLlVOS05PV05fVkVSU0lPTj1EbCgpfXJlP3ooKTpwbi51bnNoaWZ0KHopfSgpLHR5cGVvZiBSLm9uTW9kdWxlUGFyc2VkPT0iZnVuY3Rpb24iJiZSLm9uTW9kdWxlUGFyc2VkKCksUi5EZWNvZGVyLnByb3RvdHlwZS5HZXRFbmNvZGVkR2VvbWV0cnlUeXBlPWZ1bmN0aW9uKHope2lmKHouX19jbGFzc19fJiZ6Ll9fY2xhc3NfXz09PVIuRGVjb2RlckJ1ZmZlcilyZXR1cm4gUi5EZWNvZGVyLnByb3RvdHlwZS5HZXRFbmNvZGVkR2VvbWV0cnlUeXBlX0RlcHJlY2F0ZWQoeik7aWYoOD56LmJ5dGVMZW5ndGgpcmV0dXJuIFIuSU5WQUxJRF9HRU9NRVRSWV9UWVBFO3N3aXRjaCh6WzddKXtjYXNlIDA6cmV0dXJuIFIuUE9JTlRfQ0xPVUQ7Y2FzZSAxOnJldHVybiBSLlRSSUFOR1VMQVJfTUVTSDtkZWZhdWx0OnJldHVybiBSLklOVkFMSURfR0VPTUVUUllfVFlQRX19LGUucmVhZHl9fSgpO3R5cGVvZiBwdT09Im9iamVjdCImJnR5cGVvZiBFZz09Im9iamVjdCI/RWcuZXhwb3J0cz1PZzp0eXBlb2YgZGVmaW5lPT0iZnVuY3Rpb24iJiZkZWZpbmUuYW1kP2RlZmluZShbXSxmdW5jdGlvbigpe3JldHVybiBPZ30pOnR5cGVvZiBwdT09Im9iamVjdCImJihwdS5EcmFjb0RlY29kZXJNb2R1bGU9T2cpfSk7dmFyIENnPXt9O2RlKENnLHtkZWZhdWx0OigpPT56VX0pO2Z1bmN0aW9uIExVKHQsZSl7bGV0IG49dC5udW1fcG9pbnRzKCksbz10Lm51bV9mYWNlcygpLHI9bmV3IE1lLkRyYWNvSW50MzJBcnJheSxpPW8qMyxzPUR0LmNyZWF0ZVR5cGVkQXJyYXkobixpKSxmPTA7Zm9yKGxldCB1PTA7dTxvOysrdSllLkdldEZhY2VGcm9tTWVzaCh0LHUsciksc1tmKzBdPXIuR2V0VmFsdWUoMCksc1tmKzFdPXIuR2V0VmFsdWUoMSksc1tmKzJdPXIuR2V0VmFsdWUoMiksZis9MztyZXR1cm4gTWUuZGVzdHJveShyKSx7dHlwZWRBcnJheTpzLG51bWJlck9mSW5kaWNlczppfX1mdW5jdGlvbiBEVSh0LGUsbixvLHIpe2xldCBpLHM7by5xdWFudGl6YXRpb25CaXRzPD04PyhzPW5ldyBNZS5EcmFjb1VJbnQ4QXJyYXksaT1uZXcgVWludDhBcnJheShyKSxlLkdldEF0dHJpYnV0ZVVJbnQ4Rm9yQWxsUG9pbnRzKHQsbixzKSk6by5xdWFudGl6YXRpb25CaXRzPD0xNj8ocz1uZXcgTWUuRHJhY29VSW50MTZBcnJheSxpPW5ldyBVaW50MTZBcnJheShyKSxlLkdldEF0dHJpYnV0ZVVJbnQxNkZvckFsbFBvaW50cyh0LG4scykpOihzPW5ldyBNZS5EcmFjb0Zsb2F0MzJBcnJheSxpPW5ldyBGbG9hdDMyQXJyYXkociksZS5HZXRBdHRyaWJ1dGVGbG9hdEZvckFsbFBvaW50cyh0LG4scykpO2ZvcihsZXQgZj0wO2Y8cjsrK2YpaVtmXT1zLkdldFZhbHVlKGYpO3JldHVybiBNZS5kZXN0cm95KHMpLGl9ZnVuY3Rpb24gRlUodCxlLG4sbyl7bGV0IHIsaTtzd2l0Y2gobi5kYXRhX3R5cGUoKSl7Y2FzZSAxOmNhc2UgMTE6aT1uZXcgTWUuRHJhY29JbnQ4QXJyYXkscj1uZXcgSW50OEFycmF5KG8pLGUuR2V0QXR0cmlidXRlSW50OEZvckFsbFBvaW50cyh0LG4saSk7YnJlYWs7Y2FzZSAyOmk9bmV3IE1lLkRyYWNvVUludDhBcnJheSxyPW5ldyBVaW50OEFycmF5KG8pLGUuR2V0QXR0cmlidXRlVUludDhGb3JBbGxQb2ludHModCxuLGkpO2JyZWFrO2Nhc2UgMzppPW5ldyBNZS5EcmFjb0ludDE2QXJyYXkscj1uZXcgSW50MTZBcnJheShvKSxlLkdldEF0dHJpYnV0ZUludDE2Rm9yQWxsUG9pbnRzKHQsbixpKTticmVhaztjYXNlIDQ6aT1uZXcgTWUuRHJhY29VSW50MTZBcnJheSxyPW5ldyBVaW50MTZBcnJheShvKSxlLkdldEF0dHJpYnV0ZVVJbnQxNkZvckFsbFBvaW50cyh0LG4saSk7YnJlYWs7Y2FzZSA1OmNhc2UgNzppPW5ldyBNZS5EcmFjb0ludDMyQXJyYXkscj1uZXcgSW50MzJBcnJheShvKSxlLkdldEF0dHJpYnV0ZUludDMyRm9yQWxsUG9pbnRzKHQsbixpKTticmVhaztjYXNlIDY6Y2FzZSA4Omk9bmV3IE1lLkRyYWNvVUludDMyQXJyYXkscj1uZXcgVWludDMyQXJyYXkobyksZS5HZXRBdHRyaWJ1dGVVSW50MzJGb3JBbGxQb2ludHModCxuLGkpO2JyZWFrO2Nhc2UgOTpjYXNlIDEwOmk9bmV3IE1lLkRyYWNvRmxvYXQzMkFycmF5LHI9bmV3IEZsb2F0MzJBcnJheShvKSxlLkdldEF0dHJpYnV0ZUZsb2F0Rm9yQWxsUG9pbnRzKHQsbixpKTticmVha31mb3IobGV0IHM9MDtzPG87KytzKXJbc109aS5HZXRWYWx1ZShzKTtyZXR1cm4gTWUuZGVzdHJveShpKSxyfWZ1bmN0aW9uIHkyKHQsZSxuKXtsZXQgbz10Lm51bV9wb2ludHMoKSxyPW4ubnVtX2NvbXBvbmVudHMoKSxpLHM9bmV3IE1lLkF0dHJpYnV0ZVF1YW50aXphdGlvblRyYW5zZm9ybTtpZihzLkluaXRGcm9tQXR0cmlidXRlKG4pKXtsZXQgbD1uZXcgQXJyYXkocik7Zm9yKGxldCBwPTA7cDxyOysrcClsW3BdPXMubWluX3ZhbHVlKHApO2k9e3F1YW50aXphdGlvbkJpdHM6cy5xdWFudGl6YXRpb25fYml0cygpLG1pblZhbHVlczpsLHJhbmdlOnMucmFuZ2UoKSxvY3RFbmNvZGVkOiExfX1NZS5kZXN0cm95KHMpLHM9bmV3IE1lLkF0dHJpYnV0ZU9jdGFoZWRyb25UcmFuc2Zvcm0scy5Jbml0RnJvbUF0dHJpYnV0ZShuKSYmKGk9e3F1YW50aXphdGlvbkJpdHM6cy5xdWFudGl6YXRpb25fYml0cygpLG9jdEVuY29kZWQ6ITB9KSxNZS5kZXN0cm95KHMpO2xldCBmPW8qcix1O2goaSk/dT1EVSh0LGUsbixpLGYpOnU9RlUodCxlLG4sZik7bGV0IGM9bnQuZnJvbVR5cGVkQXJyYXkodSk7cmV0dXJue2FycmF5OnUsZGF0YTp7Y29tcG9uZW50c1BlckF0dHJpYnV0ZTpyLGNvbXBvbmVudERhdGF0eXBlOmMsYnl0ZU9mZnNldDpuLmJ5dGVfb2Zmc2V0KCksYnl0ZVN0cmlkZTpudC5nZXRTaXplSW5CeXRlcyhjKSpyLG5vcm1hbGl6ZWQ6bi5ub3JtYWxpemVkKCkscXVhbnRpemF0aW9uOml9fX1mdW5jdGlvbiBCVSh0KXtsZXQgZT1uZXcgTWUuRGVjb2Rlcjt0LmRlcXVhbnRpemVJblNoYWRlciYmKGUuU2tpcEF0dHJpYnV0ZVRyYW5zZm9ybShNZS5QT1NJVElPTiksZS5Ta2lwQXR0cmlidXRlVHJhbnNmb3JtKE1lLk5PUk1BTCkpO2xldCBuPW5ldyBNZS5EZWNvZGVyQnVmZmVyO2lmKG4uSW5pdCh0LmJ1ZmZlcix0LmJ1ZmZlci5sZW5ndGgpLGUuR2V0RW5jb2RlZEdlb21ldHJ5VHlwZShuKSE9PU1lLlBPSU5UX0NMT1VEKXRocm93IG5ldyBBZSgiRHJhY28gZ2VvbWV0cnkgdHlwZSBtdXN0IGJlIFBPSU5UX0NMT1VELiIpO2xldCByPW5ldyBNZS5Qb2ludENsb3VkLGk9ZS5EZWNvZGVCdWZmZXJUb1BvaW50Q2xvdWQobixyKTtpZighaS5vaygpfHxyLnB0cj09PTApdGhyb3cgbmV3IEFlKGBFcnJvciBkZWNvZGluZyBkcmFjbyBwb2ludCBjbG91ZDogJHtpLmVycm9yX21zZygpfWApO01lLmRlc3Ryb3kobik7bGV0IHM9e30sZj10LnByb3BlcnRpZXM7Zm9yKGxldCB1IGluIGYpaWYoZi5oYXNPd25Qcm9wZXJ0eSh1KSl7bGV0IGM7aWYodT09PSJQT1NJVElPTiJ8fHU9PT0iTk9STUFMIil7bGV0IGw9ZS5HZXRBdHRyaWJ1dGVJZChyLE1lW3VdKTtjPWUuR2V0QXR0cmlidXRlKHIsbCl9ZWxzZXtsZXQgbD1mW3VdO2M9ZS5HZXRBdHRyaWJ1dGVCeVVuaXF1ZUlkKHIsbCl9c1t1XT15MihyLGUsYyl9cmV0dXJuIE1lLmRlc3Ryb3kociksTWUuZGVzdHJveShlKSxzfWZ1bmN0aW9uIFVVKHQpe2xldCBlPW5ldyBNZS5EZWNvZGVyO2lmKHQuZGVxdWFudGl6ZUluU2hhZGVyKWZvcihsZXQgbD0wO2w8dC5hdHRyaWJ1dGVzVG9Ta2lwVHJhbnNmb3JtLmxlbmd0aDsrK2wpZS5Ta2lwQXR0cmlidXRlVHJhbnNmb3JtKE1lW3QuYXR0cmlidXRlc1RvU2tpcFRyYW5zZm9ybVtsXV0pO2xldCBuPXQuYnVmZmVyVmlldyxvPW5ldyBNZS5EZWNvZGVyQnVmZmVyO2lmKG8uSW5pdCh0LmFycmF5LG4uYnl0ZUxlbmd0aCksZS5HZXRFbmNvZGVkR2VvbWV0cnlUeXBlKG8pIT09TWUuVFJJQU5HVUxBUl9NRVNIKXRocm93IG5ldyBBZSgiVW5zdXBwb3J0ZWQgZHJhY28gbWVzaCBnZW9tZXRyeSB0eXBlLiIpO2xldCBpPW5ldyBNZS5NZXNoLHM9ZS5EZWNvZGVCdWZmZXJUb01lc2gobyxpKTtpZighcy5vaygpfHxpLnB0cj09PTApdGhyb3cgbmV3IEFlKGBFcnJvciBkZWNvZGluZyBkcmFjbyBtZXNoIGdlb21ldHJ5OiAke3MuZXJyb3JfbXNnKCl9YCk7TWUuZGVzdHJveShvKTtsZXQgZj17fSx1PXQuY29tcHJlc3NlZEF0dHJpYnV0ZXM7Zm9yKGxldCBsIGluIHUpaWYodS5oYXNPd25Qcm9wZXJ0eShsKSl7bGV0IHA9dVtsXSxkPWUuR2V0QXR0cmlidXRlQnlVbmlxdWVJZChpLHApO2ZbbF09eTIoaSxlLGQpfWxldCBjPXtpbmRleEFycmF5OkxVKGksZSksYXR0cmlidXRlRGF0YTpmfTtyZXR1cm4gTWUuZGVzdHJveShpKSxNZS5kZXN0cm95KGUpLGN9YXN5bmMgZnVuY3Rpb24gVlUodCxlKXtyZXR1cm4gaCh0LmJ1ZmZlclZpZXcpP1VVKHQpOkJVKHQpfWFzeW5jIGZ1bmN0aW9uIGtVKHQsZSl7bGV0IG49dC53ZWJBc3NlbWJseUNvbmZpZztyZXR1cm4gaChuKSYmaChuLndhc21CaW5hcnlGaWxlKT9NZT1hd2FpdCgwLFNnLmRlZmF1bHQpKG4pOk1lPWF3YWl0KDAsU2cuZGVmYXVsdCkoKSwhMH1hc3luYyBmdW5jdGlvbiBHVSh0LGUpe2xldCBuPXQud2ViQXNzZW1ibHlDb25maWc7cmV0dXJuIGgobik/a1UodCxlKTpWVSh0LGUpfXZhciBTZyxNZSx6VSx4Zz1aKCgpPT57RmUoKTtmdCgpOyRlKCk7SnIoKTtzbygpO1NnPWRyKFJnKCksMSk7elU9UWUoR1UpfSk7ZnVuY3Rpb24gUGcodCxlKXtpZihQZy5wYXNzVGhyb3VnaERhdGFGb3JUZXN0aW5nKXJldHVybiBlO3kudHlwZU9mLm9iamVjdCgia2V5Iix0KSx5LnR5cGVPZi5vYmplY3QoImRhdGEiLGUpO2xldCBuPXQuYnl0ZUxlbmd0aDtpZihuPT09MHx8biU0IT09MCl0aHJvdyBuZXcgQWUoIlRoZSBsZW5ndGggb2Yga2V5IG11c3QgYmUgZ3JlYXRlciB0aGFuIDAgYW5kIGEgbXVsdGlwbGUgb2YgNC4iKTtsZXQgbz1uZXcgRGF0YVZpZXcoZSkscj1vLmdldFVpbnQzMigwLCEwKTtpZihyPT09alV8fHI9PT1IVSlyZXR1cm4gZTtsZXQgaT1uZXcgRGF0YVZpZXcodCkscz0wLGY9ZS5ieXRlTGVuZ3RoLHU9Zi1mJTgsYz1uLGwscD04O2Zvcig7czx1Oylmb3IocD0ocCs4KSUyNCxsPXA7czx1JiZsPGM7KW8uc2V0VWludDMyKHMsby5nZXRVaW50MzIocywhMCleaS5nZXRVaW50MzIobCwhMCksITApLG8uc2V0VWludDMyKHMrNCxvLmdldFVpbnQzMihzKzQsITApXmkuZ2V0VWludDMyKGwrNCwhMCksITApLHMrPTgsbCs9MjQ7aWYoczxmKWZvcihsPj1jJiYocD0ocCs4KSUyNCxsPXApO3M8Zjspby5zZXRVaW50OChzLG8uZ2V0VWludDgocyleaS5nZXRVaW50OChsKSkscysrLGwrK312YXIgalUsSFUsZzIsQTI9WigoKT0+e1h0KCk7SnIoKTtqVT0xOTUzMDI5ODA1LEhVPTI5MTcwMzQxMDA7UGcucGFzc1Rocm91Z2hEYXRhRm9yVGVzdGluZz0hMTtnMj1QZ30pO2Z1bmN0aW9uIHFVKHQsZSl7cmV0dXJuKHQmZSkhPT0wfXZhciBWYSxiMj1aKCgpPT57VmE9cVV9KTtmdW5jdGlvbiB5aSh0LGUsbixvLHIsaSl7dGhpcy5fYml0cz10LHRoaXMuY25vZGVWZXJzaW9uPWUsdGhpcy5pbWFnZXJ5VmVyc2lvbj1uLHRoaXMudGVycmFpblZlcnNpb249byx0aGlzLmltYWdlcnlQcm92aWRlcj1yLHRoaXMudGVycmFpblByb3ZpZGVyPWksdGhpcy5hbmNlc3Rvckhhc1RlcnJhaW49ITEsdGhpcy50ZXJyYWluU3RhdGU9dm9pZCAwfXZhciBLVSxUMixXVSxYVSxZVSx3MixPMj1aKCgpPT57ZnQoKTtiMigpO0tVPVsxLDIsNCw4XSxUMj0xNSxXVT0xNixYVT02NCxZVT0xMjg7eWkuY2xvbmU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gaChlKT8oZS5fYml0cz10Ll9iaXRzLGUuY25vZGVWZXJzaW9uPXQuY25vZGVWZXJzaW9uLGUuaW1hZ2VyeVZlcnNpb249dC5pbWFnZXJ5VmVyc2lvbixlLnRlcnJhaW5WZXJzaW9uPXQudGVycmFpblZlcnNpb24sZS5pbWFnZXJ5UHJvdmlkZXI9dC5pbWFnZXJ5UHJvdmlkZXIsZS50ZXJyYWluUHJvdmlkZXI9dC50ZXJyYWluUHJvdmlkZXIpOmU9bmV3IHlpKHQuX2JpdHMsdC5jbm9kZVZlcnNpb24sdC5pbWFnZXJ5VmVyc2lvbix0LnRlcnJhaW5WZXJzaW9uLHQuaW1hZ2VyeVByb3ZpZGVyLHQudGVycmFpblByb3ZpZGVyKSxlLmFuY2VzdG9ySGFzVGVycmFpbj10LmFuY2VzdG9ySGFzVGVycmFpbixlLnRlcnJhaW5TdGF0ZT10LnRlcnJhaW5TdGF0ZSxlfTt5aS5wcm90b3R5cGUuc2V0UGFyZW50PWZ1bmN0aW9uKHQpe3RoaXMuYW5jZXN0b3JIYXNUZXJyYWluPXQuYW5jZXN0b3JIYXNUZXJyYWlufHx0aGlzLmhhc1RlcnJhaW4oKX07eWkucHJvdG90eXBlLmhhc1N1YnRyZWU9ZnVuY3Rpb24oKXtyZXR1cm4gVmEodGhpcy5fYml0cyxXVSl9O3lpLnByb3RvdHlwZS5oYXNJbWFnZXJ5PWZ1bmN0aW9uKCl7cmV0dXJuIFZhKHRoaXMuX2JpdHMsWFUpfTt5aS5wcm90b3R5cGUuaGFzVGVycmFpbj1mdW5jdGlvbigpe3JldHVybiBWYSh0aGlzLl9iaXRzLFlVKX07eWkucHJvdG90eXBlLmhhc0NoaWxkcmVuPWZ1bmN0aW9uKCl7cmV0dXJuIFZhKHRoaXMuX2JpdHMsVDIpfTt5aS5wcm90b3R5cGUuaGFzQ2hpbGQ9ZnVuY3Rpb24odCl7cmV0dXJuIFZhKHRoaXMuX2JpdHMsS1VbdF0pfTt5aS5wcm90b3R5cGUuZ2V0Q2hpbGRCaXRtYXNrPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2JpdHMmVDJ9O3cyPXlpfSk7dmFyIFIyPVhuKChrdXQsRTIpPT57InVzZSBzdHJpY3QiO3ZhciAkVT0odCxlLG4sbyk9PntsZXQgcj10JjY1NTM1fDAsaT10Pj4+MTYmNjU1MzV8MCxzPTA7Zm9yKDtuIT09MDspe3M9bj4yZTM/MmUzOm4sbi09cztkbyByPXIrZVtvKytdfDAsaT1pK3J8MDt3aGlsZSgtLXMpO3IlPTY1NTIxLGklPTY1NTIxfXJldHVybiByfGk8PDE2fDB9O0UyLmV4cG9ydHM9JFV9KTt2YXIgQzI9WG4oKEd1dCxTMik9PnsidXNlIHN0cmljdCI7dmFyIFpVPSgpPT57bGV0IHQsZT1bXTtmb3IodmFyIG49MDtuPDI1NjtuKyspe3Q9bjtmb3IodmFyIG89MDtvPDg7bysrKXQ9dCYxPzM5ODgyOTIzODRedD4+PjE6dD4+PjE7ZVtuXT10fXJldHVybiBlfSxRVT1uZXcgVWludDMyQXJyYXkoWlUoKSksSlU9KHQsZSxuLG8pPT57bGV0IHI9UVUsaT1vK247dF49LTE7Zm9yKGxldCBzPW87czxpO3MrKyl0PXQ+Pj44XnJbKHReZVtzXSkmMjU1XTtyZXR1cm4gdF4tMX07UzIuZXhwb3J0cz1KVX0pO3ZhciBQMj1YbigoenV0LHgyKT0+eyJ1c2Ugc3RyaWN0Ijt4Mi5leHBvcnRzPWZ1bmN0aW9uKGUsbil7bGV0IG8scixpLHMsZix1LGMsbCxwLGQsbSxfLGcsYixULE8sRSx3LEMsTixJLEQsdixMLFU9ZS5zdGF0ZTtvPWUubmV4dF9pbix2PWUuaW5wdXQscj1vKyhlLmF2YWlsX2luLTUpLGk9ZS5uZXh0X291dCxMPWUub3V0cHV0LHM9aS0obi1lLmF2YWlsX291dCksZj1pKyhlLmF2YWlsX291dC0yNTcpLHU9VS5kbWF4LGM9VS53c2l6ZSxsPVUud2hhdmUscD1VLnduZXh0LGQ9VS53aW5kb3csbT1VLmhvbGQsXz1VLmJpdHMsZz1VLmxlbmNvZGUsYj1VLmRpc3Rjb2RlLFQ9KDE8PFUubGVuYml0cyktMSxPPSgxPDxVLmRpc3RiaXRzKS0xO3Q6ZG97XzwxNSYmKG0rPXZbbysrXTw8XyxfKz04LG0rPXZbbysrXTw8XyxfKz04KSxFPWdbbSZUXTtlOmZvcig7Oyl7aWYodz1FPj4+MjQsbT4+Pj13LF8tPXcsdz1FPj4+MTYmMjU1LHc9PT0wKUxbaSsrXT1FJjY1NTM1O2Vsc2UgaWYodyYxNil7Qz1FJjY1NTM1LHcmPTE1LHcmJihfPHcmJihtKz12W28rK108PF8sXys9OCksQys9bSYoMTw8dyktMSxtPj4+PXcsXy09dyksXzwxNSYmKG0rPXZbbysrXTw8XyxfKz04LG0rPXZbbysrXTw8XyxfKz04KSxFPWJbbSZPXTtuOmZvcig7Oyl7aWYodz1FPj4+MjQsbT4+Pj13LF8tPXcsdz1FPj4+MTYmMjU1LHcmMTYpe2lmKE49RSY2NTUzNSx3Jj0xNSxfPHcmJihtKz12W28rK108PF8sXys9OCxfPHcmJihtKz12W28rK108PF8sXys9OCkpLE4rPW0mKDE8PHcpLTEsTj51KXtlLm1zZz0iaW52YWxpZCBkaXN0YW5jZSB0b28gZmFyIGJhY2siLFUubW9kZT0xNjIwOTticmVhayB0fWlmKG0+Pj49dyxfLT13LHc9aS1zLE4+dyl7aWYodz1OLXcsdz5sJiZVLnNhbmUpe2UubXNnPSJpbnZhbGlkIGRpc3RhbmNlIHRvbyBmYXIgYmFjayIsVS5tb2RlPTE2MjA5O2JyZWFrIHR9aWYoST0wLEQ9ZCxwPT09MCl7aWYoSSs9Yy13LHc8Qyl7Qy09dztkbyBMW2krK109ZFtJKytdO3doaWxlKC0tdyk7ST1pLU4sRD1MfX1lbHNlIGlmKHA8dyl7aWYoSSs9YytwLXcsdy09cCx3PEMpe0MtPXc7ZG8gTFtpKytdPWRbSSsrXTt3aGlsZSgtLXcpO2lmKEk9MCxwPEMpe3c9cCxDLT13O2RvIExbaSsrXT1kW0krK107d2hpbGUoLS13KTtJPWktTixEPUx9fX1lbHNlIGlmKEkrPXAtdyx3PEMpe0MtPXc7ZG8gTFtpKytdPWRbSSsrXTt3aGlsZSgtLXcpO0k9aS1OLEQ9TH1mb3IoO0M+MjspTFtpKytdPURbSSsrXSxMW2krK109RFtJKytdLExbaSsrXT1EW0krK10sQy09MztDJiYoTFtpKytdPURbSSsrXSxDPjEmJihMW2krK109RFtJKytdKSl9ZWxzZXtJPWktTjtkbyBMW2krK109TFtJKytdLExbaSsrXT1MW0krK10sTFtpKytdPUxbSSsrXSxDLT0zO3doaWxlKEM+Mik7QyYmKExbaSsrXT1MW0krK10sQz4xJiYoTFtpKytdPUxbSSsrXSkpfX1lbHNlIGlmKCh3JjY0KT09PTApe0U9YlsoRSY2NTUzNSkrKG0mKDE8PHcpLTEpXTtjb250aW51ZSBufWVsc2V7ZS5tc2c9ImludmFsaWQgZGlzdGFuY2UgY29kZSIsVS5tb2RlPTE2MjA5O2JyZWFrIHR9YnJlYWt9fWVsc2UgaWYoKHcmNjQpPT09MCl7RT1nWyhFJjY1NTM1KSsobSYoMTw8dyktMSldO2NvbnRpbnVlIGV9ZWxzZSBpZih3JjMyKXtVLm1vZGU9MTYxOTE7YnJlYWsgdH1lbHNle2UubXNnPSJpbnZhbGlkIGxpdGVyYWwvbGVuZ3RoIGNvZGUiLFUubW9kZT0xNjIwOTticmVhayB0fWJyZWFrfX13aGlsZShvPHImJmk8Zik7Qz1fPj4zLG8tPUMsXy09Qzw8MyxtJj0oMTw8XyktMSxlLm5leHRfaW49byxlLm5leHRfb3V0PWksZS5hdmFpbF9pbj1vPHI/NSsoci1vKTo1LShvLXIpLGUuYXZhaWxfb3V0PWk8Zj8yNTcrKGYtaSk6MjU3LShpLWYpLFUuaG9sZD1tLFUuYml0cz1ffX0pO3ZhciBOMj1YbigoanV0LE0yKT0+eyJ1c2Ugc3RyaWN0Ijt2YXIgdDY9bmV3IFVpbnQxNkFycmF5KFszLDQsNSw2LDcsOCw5LDEwLDExLDEzLDE1LDE3LDE5LDIzLDI3LDMxLDM1LDQzLDUxLDU5LDY3LDgzLDk5LDExNSwxMzEsMTYzLDE5NSwyMjcsMjU4LDAsMF0pLGU2PW5ldyBVaW50OEFycmF5KFsxNiwxNiwxNiwxNiwxNiwxNiwxNiwxNiwxNywxNywxNywxNywxOCwxOCwxOCwxOCwxOSwxOSwxOSwxOSwyMCwyMCwyMCwyMCwyMSwyMSwyMSwyMSwxNiw3Miw3OF0pLG42PW5ldyBVaW50MTZBcnJheShbMSwyLDMsNCw1LDcsOSwxMywxNywyNSwzMyw0OSw2NSw5NywxMjksMTkzLDI1NywzODUsNTEzLDc2OSwxMDI1LDE1MzcsMjA0OSwzMDczLDQwOTcsNjE0NSw4MTkzLDEyMjg5LDE2Mzg1LDI0NTc3LDAsMF0pLG82PW5ldyBVaW50OEFycmF5KFsxNiwxNiwxNiwxNiwxNywxNywxOCwxOCwxOSwxOSwyMCwyMCwyMSwyMSwyMiwyMiwyMywyMywyNCwyNCwyNSwyNSwyNiwyNiwyNywyNywyOCwyOCwyOSwyOSw2NCw2NF0pLHI2PSh0LGUsbixvLHIsaSxzLGYpPT57bGV0IHU9Zi5iaXRzLGM9MCxsPTAscD0wLGQ9MCxtPTAsXz0wLGc9MCxiPTAsVD0wLE89MCxFLHcsQyxOLEksRD1udWxsLHYsTD1uZXcgVWludDE2QXJyYXkoMTYpLFU9bmV3IFVpbnQxNkFycmF5KDE2KSxBPW51bGwsUyxQLEY7Zm9yKGM9MDtjPD0xNTtjKyspTFtjXT0wO2ZvcihsPTA7bDxvO2wrKylMW2VbbitsXV0rKztmb3IobT11LGQ9MTU7ZD49MSYmTFtkXT09PTA7ZC0tKTtpZihtPmQmJihtPWQpLGQ9PT0wKXJldHVybiByW2krK109MTw8MjR8NjQ8PDE2fDAscltpKytdPTE8PDI0fDY0PDwxNnwwLGYuYml0cz0xLDA7Zm9yKHA9MTtwPGQmJkxbcF09PT0wO3ArKyk7Zm9yKG08cCYmKG09cCksYj0xLGM9MTtjPD0xNTtjKyspaWYoYjw8PTEsYi09TFtjXSxiPDApcmV0dXJuLTE7aWYoYj4wJiYodD09PTB8fGQhPT0xKSlyZXR1cm4tMTtmb3IoVVsxXT0wLGM9MTtjPDE1O2MrKylVW2MrMV09VVtjXStMW2NdO2ZvcihsPTA7bDxvO2wrKyllW24rbF0hPT0wJiYoc1tVW2VbbitsXV0rK109bCk7aWYodD09PTA/KEQ9QT1zLHY9MjApOnQ9PT0xPyhEPXQ2LEE9ZTYsdj0yNTcpOihEPW42LEE9bzYsdj0wKSxPPTAsbD0wLGM9cCxJPWksXz1tLGc9MCxDPS0xLFQ9MTw8bSxOPVQtMSx0PT09MSYmVD44NTJ8fHQ9PT0yJiZUPjU5MilyZXR1cm4gMTtmb3IoOzspe1M9Yy1nLHNbbF0rMTx2PyhQPTAsRj1zW2xdKTpzW2xdPj12PyhQPUFbc1tsXS12XSxGPURbc1tsXS12XSk6KFA9OTYsRj0wKSxFPTE8PGMtZyx3PTE8PF8scD13O2RvIHctPUUscltJKyhPPj5nKSt3XT1TPDwyNHxQPDwxNnxGfDA7d2hpbGUodyE9PTApO2ZvcihFPTE8PGMtMTtPJkU7KUU+Pj0xO2lmKEUhPT0wPyhPJj1FLTEsTys9RSk6Tz0wLGwrKywtLUxbY109PT0wKXtpZihjPT09ZClicmVhaztjPWVbbitzW2xdXX1pZihjPm0mJihPJk4pIT09Qyl7Zm9yKGc9PT0wJiYoZz1tKSxJKz1wLF89Yy1nLGI9MTw8XztfK2c8ZCYmKGItPUxbXytnXSwhKGI8PTApKTspXysrLGI8PD0xO2lmKFQrPTE8PF8sdD09PTEmJlQ+ODUyfHx0PT09MiYmVD41OTIpcmV0dXJuIDE7Qz1PJk4scltDXT1tPDwyNHxfPDwxNnxJLWl8MH19cmV0dXJuIE8hPT0wJiYocltJK09dPWMtZzw8MjR8NjQ8PDE2fDApLGYuYml0cz1tLDB9O00yLmV4cG9ydHM9cjZ9KTt2YXIgcm09WG4oKEh1dCxJMik9PnsidXNlIHN0cmljdCI7STIuZXhwb3J0cz17Wl9OT19GTFVTSDowLFpfUEFSVElBTF9GTFVTSDoxLFpfU1lOQ19GTFVTSDoyLFpfRlVMTF9GTFVTSDozLFpfRklOSVNIOjQsWl9CTE9DSzo1LFpfVFJFRVM6NixaX09LOjAsWl9TVFJFQU1fRU5EOjEsWl9ORUVEX0RJQ1Q6MixaX0VSUk5POi0xLFpfU1RSRUFNX0VSUk9SOi0yLFpfREFUQV9FUlJPUjotMyxaX01FTV9FUlJPUjotNCxaX0JVRl9FUlJPUjotNSxaX05PX0NPTVBSRVNTSU9OOjAsWl9CRVNUX1NQRUVEOjEsWl9CRVNUX0NPTVBSRVNTSU9OOjksWl9ERUZBVUxUX0NPTVBSRVNTSU9OOi0xLFpfRklMVEVSRUQ6MSxaX0hVRkZNQU5fT05MWToyLFpfUkxFOjMsWl9GSVhFRDo0LFpfREVGQVVMVF9TVFJBVEVHWTowLFpfQklOQVJZOjAsWl9URVhUOjEsWl9VTktOT1dOOjIsWl9ERUZMQVRFRDo4fX0pO3ZhciBkUz1YbigocXV0LFlyKT0+eyJ1c2Ugc3RyaWN0Ijt2YXIgRGc9UjIoKSxnaT1DMigpLGk2PVAyKCksZHU9TjIoKSxzNj0wLHJTPTEsaVM9Mix7Wl9GSU5JU0g6djIsWl9CTE9DSzpjNixaX1RSRUVTOmltLFpfT0s6U2MsWl9TVFJFQU1fRU5EOmE2LFpfTkVFRF9ESUNUOmY2LFpfU1RSRUFNX0VSUk9SOk1yLFpfREFUQV9FUlJPUjpzUyxaX01FTV9FUlJPUjpGZyxaX0JVRl9FUlJPUjp1NixaX0RFRkxBVEVEOkwyfT1ybSgpLGZtPTE2MTgwLEQyPTE2MTgxLEYyPTE2MTgyLEIyPTE2MTgzLFUyPTE2MTg0LFYyPTE2MTg1LGsyPTE2MTg2LEcyPTE2MTg3LHoyPTE2MTg4LGoyPTE2MTg5LGFtPTE2MTkwLEtpPTE2MTkxLE1nPTE2MTkyLEgyPTE2MTkzLE5nPTE2MTk0LHEyPTE2MTk1LEsyPTE2MTk2LFcyPTE2MTk3LFgyPTE2MTk4LHNtPTE2MTk5LGNtPTE2MjAwLFkyPTE2MjAxLCQyPTE2MjAyLFoyPTE2MjAzLFEyPTE2MjA0LEoyPTE2MjA1LElnPTE2MjA2LHRTPTE2MjA3LGVTPTE2MjA4LE1uPTE2MjA5LEJnPTE2MjEwLGNTPTE2MjExLGw2PTg1MixwNj01OTIsZDY9MTUsbTY9ZDYsblM9dD0+KHQ+Pj4yNCYyNTUpKyh0Pj4+OCY2NTI4MCkrKCh0JjY1MjgwKTw8OCkrKCh0JjI1NSk8PDI0KTtmdW5jdGlvbiBoNigpe3RoaXMuc3RybT1udWxsLHRoaXMubW9kZT0wLHRoaXMubGFzdD0hMSx0aGlzLndyYXA9MCx0aGlzLmhhdmVkaWN0PSExLHRoaXMuZmxhZ3M9MCx0aGlzLmRtYXg9MCx0aGlzLmNoZWNrPTAsdGhpcy50b3RhbD0wLHRoaXMuaGVhZD1udWxsLHRoaXMud2JpdHM9MCx0aGlzLndzaXplPTAsdGhpcy53aGF2ZT0wLHRoaXMud25leHQ9MCx0aGlzLndpbmRvdz1udWxsLHRoaXMuaG9sZD0wLHRoaXMuYml0cz0wLHRoaXMubGVuZ3RoPTAsdGhpcy5vZmZzZXQ9MCx0aGlzLmV4dHJhPTAsdGhpcy5sZW5jb2RlPW51bGwsdGhpcy5kaXN0Y29kZT1udWxsLHRoaXMubGVuYml0cz0wLHRoaXMuZGlzdGJpdHM9MCx0aGlzLm5jb2RlPTAsdGhpcy5ubGVuPTAsdGhpcy5uZGlzdD0wLHRoaXMuaGF2ZT0wLHRoaXMubmV4dD1udWxsLHRoaXMubGVucz1uZXcgVWludDE2QXJyYXkoMzIwKSx0aGlzLndvcms9bmV3IFVpbnQxNkFycmF5KDI4OCksdGhpcy5sZW5keW49bnVsbCx0aGlzLmRpc3RkeW49bnVsbCx0aGlzLnNhbmU9MCx0aGlzLmJhY2s9MCx0aGlzLndhcz0wfXZhciBDYz10PT57aWYoIXQpcmV0dXJuIDE7bGV0IGU9dC5zdGF0ZTtyZXR1cm4hZXx8ZS5zdHJtIT09dHx8ZS5tb2RlPGZtfHxlLm1vZGU+Y1M/MTowfSxhUz10PT57aWYoQ2ModCkpcmV0dXJuIE1yO2xldCBlPXQuc3RhdGU7cmV0dXJuIHQudG90YWxfaW49dC50b3RhbF9vdXQ9ZS50b3RhbD0wLHQubXNnPSIiLGUud3JhcCYmKHQuYWRsZXI9ZS53cmFwJjEpLGUubW9kZT1mbSxlLmxhc3Q9MCxlLmhhdmVkaWN0PTAsZS5mbGFncz0tMSxlLmRtYXg9MzI3NjgsZS5oZWFkPW51bGwsZS5ob2xkPTAsZS5iaXRzPTAsZS5sZW5jb2RlPWUubGVuZHluPW5ldyBJbnQzMkFycmF5KGw2KSxlLmRpc3Rjb2RlPWUuZGlzdGR5bj1uZXcgSW50MzJBcnJheShwNiksZS5zYW5lPTEsZS5iYWNrPS0xLFNjfSxmUz10PT57aWYoQ2ModCkpcmV0dXJuIE1yO2xldCBlPXQuc3RhdGU7cmV0dXJuIGUud3NpemU9MCxlLndoYXZlPTAsZS53bmV4dD0wLGFTKHQpfSx1Uz0odCxlKT0+e2xldCBuO2lmKENjKHQpKXJldHVybiBNcjtsZXQgbz10LnN0YXRlO3JldHVybiBlPDA/KG49MCxlPS1lKToobj0oZT4+NCkrNSxlPDQ4JiYoZSY9MTUpKSxlJiYoZTw4fHxlPjE1KT9Ncjooby53aW5kb3chPT1udWxsJiZvLndiaXRzIT09ZSYmKG8ud2luZG93PW51bGwpLG8ud3JhcD1uLG8ud2JpdHM9ZSxmUyh0KSl9LGxTPSh0LGUpPT57aWYoIXQpcmV0dXJuIE1yO2xldCBuPW5ldyBoNjt0LnN0YXRlPW4sbi5zdHJtPXQsbi53aW5kb3c9bnVsbCxuLm1vZGU9Zm07bGV0IG89dVModCxlKTtyZXR1cm4gbyE9PVNjJiYodC5zdGF0ZT1udWxsKSxvfSxfNj10PT5sUyh0LG02KSxvUz0hMCx2ZyxMZyx5Nj10PT57aWYob1Mpe3ZnPW5ldyBJbnQzMkFycmF5KDUxMiksTGc9bmV3IEludDMyQXJyYXkoMzIpO2xldCBlPTA7Zm9yKDtlPDE0NDspdC5sZW5zW2UrK109ODtmb3IoO2U8MjU2Oyl0LmxlbnNbZSsrXT05O2Zvcig7ZTwyODA7KXQubGVuc1tlKytdPTc7Zm9yKDtlPDI4ODspdC5sZW5zW2UrK109ODtmb3IoZHUoclMsdC5sZW5zLDAsMjg4LHZnLDAsdC53b3JrLHtiaXRzOjl9KSxlPTA7ZTwzMjspdC5sZW5zW2UrK109NTtkdShpUyx0LmxlbnMsMCwzMixMZywwLHQud29yayx7Yml0czo1fSksb1M9ITF9dC5sZW5jb2RlPXZnLHQubGVuYml0cz05LHQuZGlzdGNvZGU9TGcsdC5kaXN0Yml0cz01fSxwUz0odCxlLG4sbyk9PntsZXQgcixpPXQuc3RhdGU7cmV0dXJuIGkud2luZG93PT09bnVsbCYmKGkud3NpemU9MTw8aS53Yml0cyxpLnduZXh0PTAsaS53aGF2ZT0wLGkud2luZG93PW5ldyBVaW50OEFycmF5KGkud3NpemUpKSxvPj1pLndzaXplPyhpLndpbmRvdy5zZXQoZS5zdWJhcnJheShuLWkud3NpemUsbiksMCksaS53bmV4dD0wLGkud2hhdmU9aS53c2l6ZSk6KHI9aS53c2l6ZS1pLnduZXh0LHI+byYmKHI9byksaS53aW5kb3cuc2V0KGUuc3ViYXJyYXkobi1vLG4tbytyKSxpLnduZXh0KSxvLT1yLG8/KGkud2luZG93LnNldChlLnN1YmFycmF5KG4tbyxuKSwwKSxpLnduZXh0PW8saS53aGF2ZT1pLndzaXplKTooaS53bmV4dCs9cixpLnduZXh0PT09aS53c2l6ZSYmKGkud25leHQ9MCksaS53aGF2ZTxpLndzaXplJiYoaS53aGF2ZSs9cikpKSwwfSxnNj0odCxlKT0+e2xldCBuLG8scixpLHMsZix1LGMsbCxwLGQsbSxfLGcsYj0wLFQsTyxFLHcsQyxOLEksRCx2PW5ldyBVaW50OEFycmF5KDQpLEwsVSxBPW5ldyBVaW50OEFycmF5KFsxNiwxNywxOCwwLDgsNyw5LDYsMTAsNSwxMSw0LDEyLDMsMTMsMiwxNCwxLDE1XSk7aWYoQ2ModCl8fCF0Lm91dHB1dHx8IXQuaW5wdXQmJnQuYXZhaWxfaW4hPT0wKXJldHVybiBNcjtuPXQuc3RhdGUsbi5tb2RlPT09S2kmJihuLm1vZGU9TWcpLHM9dC5uZXh0X291dCxyPXQub3V0cHV0LHU9dC5hdmFpbF9vdXQsaT10Lm5leHRfaW4sbz10LmlucHV0LGY9dC5hdmFpbF9pbixjPW4uaG9sZCxsPW4uYml0cyxwPWYsZD11LEQ9U2M7dDpmb3IoOzspc3dpdGNoKG4ubW9kZSl7Y2FzZSBmbTppZihuLndyYXA9PT0wKXtuLm1vZGU9TWc7YnJlYWt9Zm9yKDtsPDE2Oyl7aWYoZj09PTApYnJlYWsgdDtmLS0sYys9b1tpKytdPDxsLGwrPTh9aWYobi53cmFwJjImJmM9PT0zNTYxNSl7bi53Yml0cz09PTAmJihuLndiaXRzPTE1KSxuLmNoZWNrPTAsdlswXT1jJjI1NSx2WzFdPWM+Pj44JjI1NSxuLmNoZWNrPWdpKG4uY2hlY2ssdiwyLDApLGM9MCxsPTAsbi5tb2RlPUQyO2JyZWFrfWlmKG4uaGVhZCYmKG4uaGVhZC5kb25lPSExKSwhKG4ud3JhcCYxKXx8KCgoYyYyNTUpPDw4KSsoYz4+OCkpJTMxKXt0Lm1zZz0iaW5jb3JyZWN0IGhlYWRlciBjaGVjayIsbi5tb2RlPU1uO2JyZWFrfWlmKChjJjE1KSE9PUwyKXt0Lm1zZz0idW5rbm93biBjb21wcmVzc2lvbiBtZXRob2QiLG4ubW9kZT1NbjticmVha31pZihjPj4+PTQsbC09NCxJPShjJjE1KSs4LG4ud2JpdHM9PT0wJiYobi53Yml0cz1JKSxJPjE1fHxJPm4ud2JpdHMpe3QubXNnPSJpbnZhbGlkIHdpbmRvdyBzaXplIixuLm1vZGU9TW47YnJlYWt9bi5kbWF4PTE8PG4ud2JpdHMsbi5mbGFncz0wLHQuYWRsZXI9bi5jaGVjaz0xLG4ubW9kZT1jJjUxMj9qMjpLaSxjPTAsbD0wO2JyZWFrO2Nhc2UgRDI6Zm9yKDtsPDE2Oyl7aWYoZj09PTApYnJlYWsgdDtmLS0sYys9b1tpKytdPDxsLGwrPTh9aWYobi5mbGFncz1jLChuLmZsYWdzJjI1NSkhPT1MMil7dC5tc2c9InVua25vd24gY29tcHJlc3Npb24gbWV0aG9kIixuLm1vZGU9TW47YnJlYWt9aWYobi5mbGFncyY1NzM0NCl7dC5tc2c9InVua25vd24gaGVhZGVyIGZsYWdzIHNldCIsbi5tb2RlPU1uO2JyZWFrfW4uaGVhZCYmKG4uaGVhZC50ZXh0PWM+PjgmMSksbi5mbGFncyY1MTImJm4ud3JhcCY0JiYodlswXT1jJjI1NSx2WzFdPWM+Pj44JjI1NSxuLmNoZWNrPWdpKG4uY2hlY2ssdiwyLDApKSxjPTAsbD0wLG4ubW9kZT1GMjtjYXNlIEYyOmZvcig7bDwzMjspe2lmKGY9PT0wKWJyZWFrIHQ7Zi0tLGMrPW9baSsrXTw8bCxsKz04fW4uaGVhZCYmKG4uaGVhZC50aW1lPWMpLG4uZmxhZ3MmNTEyJiZuLndyYXAmNCYmKHZbMF09YyYyNTUsdlsxXT1jPj4+OCYyNTUsdlsyXT1jPj4+MTYmMjU1LHZbM109Yz4+PjI0JjI1NSxuLmNoZWNrPWdpKG4uY2hlY2ssdiw0LDApKSxjPTAsbD0wLG4ubW9kZT1CMjtjYXNlIEIyOmZvcig7bDwxNjspe2lmKGY9PT0wKWJyZWFrIHQ7Zi0tLGMrPW9baSsrXTw8bCxsKz04fW4uaGVhZCYmKG4uaGVhZC54ZmxhZ3M9YyYyNTUsbi5oZWFkLm9zPWM+PjgpLG4uZmxhZ3MmNTEyJiZuLndyYXAmNCYmKHZbMF09YyYyNTUsdlsxXT1jPj4+OCYyNTUsbi5jaGVjaz1naShuLmNoZWNrLHYsMiwwKSksYz0wLGw9MCxuLm1vZGU9VTI7Y2FzZSBVMjppZihuLmZsYWdzJjEwMjQpe2Zvcig7bDwxNjspe2lmKGY9PT0wKWJyZWFrIHQ7Zi0tLGMrPW9baSsrXTw8bCxsKz04fW4ubGVuZ3RoPWMsbi5oZWFkJiYobi5oZWFkLmV4dHJhX2xlbj1jKSxuLmZsYWdzJjUxMiYmbi53cmFwJjQmJih2WzBdPWMmMjU1LHZbMV09Yz4+PjgmMjU1LG4uY2hlY2s9Z2kobi5jaGVjayx2LDIsMCkpLGM9MCxsPTB9ZWxzZSBuLmhlYWQmJihuLmhlYWQuZXh0cmE9bnVsbCk7bi5tb2RlPVYyO2Nhc2UgVjI6aWYobi5mbGFncyYxMDI0JiYobT1uLmxlbmd0aCxtPmYmJihtPWYpLG0mJihuLmhlYWQmJihJPW4uaGVhZC5leHRyYV9sZW4tbi5sZW5ndGgsbi5oZWFkLmV4dHJhfHwobi5oZWFkLmV4dHJhPW5ldyBVaW50OEFycmF5KG4uaGVhZC5leHRyYV9sZW4pKSxuLmhlYWQuZXh0cmEuc2V0KG8uc3ViYXJyYXkoaSxpK20pLEkpKSxuLmZsYWdzJjUxMiYmbi53cmFwJjQmJihuLmNoZWNrPWdpKG4uY2hlY2ssbyxtLGkpKSxmLT1tLGkrPW0sbi5sZW5ndGgtPW0pLG4ubGVuZ3RoKSlicmVhayB0O24ubGVuZ3RoPTAsbi5tb2RlPWsyO2Nhc2UgazI6aWYobi5mbGFncyYyMDQ4KXtpZihmPT09MClicmVhayB0O209MDtkbyBJPW9baSttKytdLG4uaGVhZCYmSSYmbi5sZW5ndGg8NjU1MzYmJihuLmhlYWQubmFtZSs9U3RyaW5nLmZyb21DaGFyQ29kZShJKSk7d2hpbGUoSSYmbTxmKTtpZihuLmZsYWdzJjUxMiYmbi53cmFwJjQmJihuLmNoZWNrPWdpKG4uY2hlY2ssbyxtLGkpKSxmLT1tLGkrPW0sSSlicmVhayB0fWVsc2Ugbi5oZWFkJiYobi5oZWFkLm5hbWU9bnVsbCk7bi5sZW5ndGg9MCxuLm1vZGU9RzI7Y2FzZSBHMjppZihuLmZsYWdzJjQwOTYpe2lmKGY9PT0wKWJyZWFrIHQ7bT0wO2RvIEk9b1tpK20rK10sbi5oZWFkJiZJJiZuLmxlbmd0aDw2NTUzNiYmKG4uaGVhZC5jb21tZW50Kz1TdHJpbmcuZnJvbUNoYXJDb2RlKEkpKTt3aGlsZShJJiZtPGYpO2lmKG4uZmxhZ3MmNTEyJiZuLndyYXAmNCYmKG4uY2hlY2s9Z2kobi5jaGVjayxvLG0saSkpLGYtPW0saSs9bSxJKWJyZWFrIHR9ZWxzZSBuLmhlYWQmJihuLmhlYWQuY29tbWVudD1udWxsKTtuLm1vZGU9ejI7Y2FzZSB6MjppZihuLmZsYWdzJjUxMil7Zm9yKDtsPDE2Oyl7aWYoZj09PTApYnJlYWsgdDtmLS0sYys9b1tpKytdPDxsLGwrPTh9aWYobi53cmFwJjQmJmMhPT0obi5jaGVjayY2NTUzNSkpe3QubXNnPSJoZWFkZXIgY3JjIG1pc21hdGNoIixuLm1vZGU9TW47YnJlYWt9Yz0wLGw9MH1uLmhlYWQmJihuLmhlYWQuaGNyYz1uLmZsYWdzPj45JjEsbi5oZWFkLmRvbmU9ITApLHQuYWRsZXI9bi5jaGVjaz0wLG4ubW9kZT1LaTticmVhaztjYXNlIGoyOmZvcig7bDwzMjspe2lmKGY9PT0wKWJyZWFrIHQ7Zi0tLGMrPW9baSsrXTw8bCxsKz04fXQuYWRsZXI9bi5jaGVjaz1uUyhjKSxjPTAsbD0wLG4ubW9kZT1hbTtjYXNlIGFtOmlmKG4uaGF2ZWRpY3Q9PT0wKXJldHVybiB0Lm5leHRfb3V0PXMsdC5hdmFpbF9vdXQ9dSx0Lm5leHRfaW49aSx0LmF2YWlsX2luPWYsbi5ob2xkPWMsbi5iaXRzPWwsZjY7dC5hZGxlcj1uLmNoZWNrPTEsbi5tb2RlPUtpO2Nhc2UgS2k6aWYoZT09PWM2fHxlPT09aW0pYnJlYWsgdDtjYXNlIE1nOmlmKG4ubGFzdCl7Yz4+Pj1sJjcsbC09bCY3LG4ubW9kZT1JZzticmVha31mb3IoO2w8Mzspe2lmKGY9PT0wKWJyZWFrIHQ7Zi0tLGMrPW9baSsrXTw8bCxsKz04fXN3aXRjaChuLmxhc3Q9YyYxLGM+Pj49MSxsLT0xLGMmMyl7Y2FzZSAwOm4ubW9kZT1IMjticmVhaztjYXNlIDE6aWYoeTYobiksbi5tb2RlPXNtLGU9PT1pbSl7Yz4+Pj0yLGwtPTI7YnJlYWsgdH1icmVhaztjYXNlIDI6bi5tb2RlPUsyO2JyZWFrO2Nhc2UgMzp0Lm1zZz0iaW52YWxpZCBibG9jayB0eXBlIixuLm1vZGU9TW59Yz4+Pj0yLGwtPTI7YnJlYWs7Y2FzZSBIMjpmb3IoYz4+Pj1sJjcsbC09bCY3O2w8MzI7KXtpZihmPT09MClicmVhayB0O2YtLSxjKz1vW2krK108PGwsbCs9OH1pZigoYyY2NTUzNSkhPT0oYz4+PjE2XjY1NTM1KSl7dC5tc2c9ImludmFsaWQgc3RvcmVkIGJsb2NrIGxlbmd0aHMiLG4ubW9kZT1NbjticmVha31pZihuLmxlbmd0aD1jJjY1NTM1LGM9MCxsPTAsbi5tb2RlPU5nLGU9PT1pbSlicmVhayB0O2Nhc2UgTmc6bi5tb2RlPXEyO2Nhc2UgcTI6aWYobT1uLmxlbmd0aCxtKXtpZihtPmYmJihtPWYpLG0+dSYmKG09dSksbT09PTApYnJlYWsgdDtyLnNldChvLnN1YmFycmF5KGksaSttKSxzKSxmLT1tLGkrPW0sdS09bSxzKz1tLG4ubGVuZ3RoLT1tO2JyZWFrfW4ubW9kZT1LaTticmVhaztjYXNlIEsyOmZvcig7bDwxNDspe2lmKGY9PT0wKWJyZWFrIHQ7Zi0tLGMrPW9baSsrXTw8bCxsKz04fWlmKG4ubmxlbj0oYyYzMSkrMjU3LGM+Pj49NSxsLT01LG4ubmRpc3Q9KGMmMzEpKzEsYz4+Pj01LGwtPTUsbi5uY29kZT0oYyYxNSkrNCxjPj4+PTQsbC09NCxuLm5sZW4+Mjg2fHxuLm5kaXN0PjMwKXt0Lm1zZz0idG9vIG1hbnkgbGVuZ3RoIG9yIGRpc3RhbmNlIHN5bWJvbHMiLG4ubW9kZT1NbjticmVha31uLmhhdmU9MCxuLm1vZGU9VzI7Y2FzZSBXMjpmb3IoO24uaGF2ZTxuLm5jb2RlOyl7Zm9yKDtsPDM7KXtpZihmPT09MClicmVhayB0O2YtLSxjKz1vW2krK108PGwsbCs9OH1uLmxlbnNbQVtuLmhhdmUrK11dPWMmNyxjPj4+PTMsbC09M31mb3IoO24uaGF2ZTwxOTspbi5sZW5zW0Fbbi5oYXZlKytdXT0wO2lmKG4ubGVuY29kZT1uLmxlbmR5bixuLmxlbmJpdHM9NyxMPXtiaXRzOm4ubGVuYml0c30sRD1kdShzNixuLmxlbnMsMCwxOSxuLmxlbmNvZGUsMCxuLndvcmssTCksbi5sZW5iaXRzPUwuYml0cyxEKXt0Lm1zZz0iaW52YWxpZCBjb2RlIGxlbmd0aHMgc2V0IixuLm1vZGU9TW47YnJlYWt9bi5oYXZlPTAsbi5tb2RlPVgyO2Nhc2UgWDI6Zm9yKDtuLmhhdmU8bi5ubGVuK24ubmRpc3Q7KXtmb3IoO2I9bi5sZW5jb2RlW2MmKDE8PG4ubGVuYml0cyktMV0sVD1iPj4+MjQsTz1iPj4+MTYmMjU1LEU9YiY2NTUzNSwhKFQ8PWwpOyl7aWYoZj09PTApYnJlYWsgdDtmLS0sYys9b1tpKytdPDxsLGwrPTh9aWYoRTwxNiljPj4+PVQsbC09VCxuLmxlbnNbbi5oYXZlKytdPUU7ZWxzZXtpZihFPT09MTYpe2ZvcihVPVQrMjtsPFU7KXtpZihmPT09MClicmVhayB0O2YtLSxjKz1vW2krK108PGwsbCs9OH1pZihjPj4+PVQsbC09VCxuLmhhdmU9PT0wKXt0Lm1zZz0iaW52YWxpZCBiaXQgbGVuZ3RoIHJlcGVhdCIsbi5tb2RlPU1uO2JyZWFrfUk9bi5sZW5zW24uaGF2ZS0xXSxtPTMrKGMmMyksYz4+Pj0yLGwtPTJ9ZWxzZSBpZihFPT09MTcpe2ZvcihVPVQrMztsPFU7KXtpZihmPT09MClicmVhayB0O2YtLSxjKz1vW2krK108PGwsbCs9OH1jPj4+PVQsbC09VCxJPTAsbT0zKyhjJjcpLGM+Pj49MyxsLT0zfWVsc2V7Zm9yKFU9VCs3O2w8VTspe2lmKGY9PT0wKWJyZWFrIHQ7Zi0tLGMrPW9baSsrXTw8bCxsKz04fWM+Pj49VCxsLT1ULEk9MCxtPTExKyhjJjEyNyksYz4+Pj03LGwtPTd9aWYobi5oYXZlK20+bi5ubGVuK24ubmRpc3Qpe3QubXNnPSJpbnZhbGlkIGJpdCBsZW5ndGggcmVwZWF0IixuLm1vZGU9TW47YnJlYWt9Zm9yKDttLS07KW4ubGVuc1tuLmhhdmUrK109SX19aWYobi5tb2RlPT09TW4pYnJlYWs7aWYobi5sZW5zWzI1Nl09PT0wKXt0Lm1zZz0iaW52YWxpZCBjb2RlIC0tIG1pc3NpbmcgZW5kLW9mLWJsb2NrIixuLm1vZGU9TW47YnJlYWt9aWYobi5sZW5iaXRzPTksTD17Yml0czpuLmxlbmJpdHN9LEQ9ZHUoclMsbi5sZW5zLDAsbi5ubGVuLG4ubGVuY29kZSwwLG4ud29yayxMKSxuLmxlbmJpdHM9TC5iaXRzLEQpe3QubXNnPSJpbnZhbGlkIGxpdGVyYWwvbGVuZ3RocyBzZXQiLG4ubW9kZT1NbjticmVha31pZihuLmRpc3RiaXRzPTYsbi5kaXN0Y29kZT1uLmRpc3RkeW4sTD17Yml0czpuLmRpc3RiaXRzfSxEPWR1KGlTLG4ubGVucyxuLm5sZW4sbi5uZGlzdCxuLmRpc3Rjb2RlLDAsbi53b3JrLEwpLG4uZGlzdGJpdHM9TC5iaXRzLEQpe3QubXNnPSJpbnZhbGlkIGRpc3RhbmNlcyBzZXQiLG4ubW9kZT1NbjticmVha31pZihuLm1vZGU9c20sZT09PWltKWJyZWFrIHQ7Y2FzZSBzbTpuLm1vZGU9Y207Y2FzZSBjbTppZihmPj02JiZ1Pj0yNTgpe3QubmV4dF9vdXQ9cyx0LmF2YWlsX291dD11LHQubmV4dF9pbj1pLHQuYXZhaWxfaW49ZixuLmhvbGQ9YyxuLmJpdHM9bCxpNih0LGQpLHM9dC5uZXh0X291dCxyPXQub3V0cHV0LHU9dC5hdmFpbF9vdXQsaT10Lm5leHRfaW4sbz10LmlucHV0LGY9dC5hdmFpbF9pbixjPW4uaG9sZCxsPW4uYml0cyxuLm1vZGU9PT1LaSYmKG4uYmFjaz0tMSk7YnJlYWt9Zm9yKG4uYmFjaz0wO2I9bi5sZW5jb2RlW2MmKDE8PG4ubGVuYml0cyktMV0sVD1iPj4+MjQsTz1iPj4+MTYmMjU1LEU9YiY2NTUzNSwhKFQ8PWwpOyl7aWYoZj09PTApYnJlYWsgdDtmLS0sYys9b1tpKytdPDxsLGwrPTh9aWYoTyYmKE8mMjQwKT09PTApe2Zvcih3PVQsQz1PLE49RTtiPW4ubGVuY29kZVtOKygoYyYoMTw8dytDKS0xKT4+dyldLFQ9Yj4+PjI0LE89Yj4+PjE2JjI1NSxFPWImNjU1MzUsISh3K1Q8PWwpOyl7aWYoZj09PTApYnJlYWsgdDtmLS0sYys9b1tpKytdPDxsLGwrPTh9Yz4+Pj13LGwtPXcsbi5iYWNrKz13fWlmKGM+Pj49VCxsLT1ULG4uYmFjays9VCxuLmxlbmd0aD1FLE89PT0wKXtuLm1vZGU9SjI7YnJlYWt9aWYoTyYzMil7bi5iYWNrPS0xLG4ubW9kZT1LaTticmVha31pZihPJjY0KXt0Lm1zZz0iaW52YWxpZCBsaXRlcmFsL2xlbmd0aCBjb2RlIixuLm1vZGU9TW47YnJlYWt9bi5leHRyYT1PJjE1LG4ubW9kZT1ZMjtjYXNlIFkyOmlmKG4uZXh0cmEpe2ZvcihVPW4uZXh0cmE7bDxVOyl7aWYoZj09PTApYnJlYWsgdDtmLS0sYys9b1tpKytdPDxsLGwrPTh9bi5sZW5ndGgrPWMmKDE8PG4uZXh0cmEpLTEsYz4+Pj1uLmV4dHJhLGwtPW4uZXh0cmEsbi5iYWNrKz1uLmV4dHJhfW4ud2FzPW4ubGVuZ3RoLG4ubW9kZT0kMjtjYXNlICQyOmZvcig7Yj1uLmRpc3Rjb2RlW2MmKDE8PG4uZGlzdGJpdHMpLTFdLFQ9Yj4+PjI0LE89Yj4+PjE2JjI1NSxFPWImNjU1MzUsIShUPD1sKTspe2lmKGY9PT0wKWJyZWFrIHQ7Zi0tLGMrPW9baSsrXTw8bCxsKz04fWlmKChPJjI0MCk9PT0wKXtmb3Iodz1ULEM9TyxOPUU7Yj1uLmRpc3Rjb2RlW04rKChjJigxPDx3K0MpLTEpPj53KV0sVD1iPj4+MjQsTz1iPj4+MTYmMjU1LEU9YiY2NTUzNSwhKHcrVDw9bCk7KXtpZihmPT09MClicmVhayB0O2YtLSxjKz1vW2krK108PGwsbCs9OH1jPj4+PXcsbC09dyxuLmJhY2srPXd9aWYoYz4+Pj1ULGwtPVQsbi5iYWNrKz1ULE8mNjQpe3QubXNnPSJpbnZhbGlkIGRpc3RhbmNlIGNvZGUiLG4ubW9kZT1NbjticmVha31uLm9mZnNldD1FLG4uZXh0cmE9TyYxNSxuLm1vZGU9WjI7Y2FzZSBaMjppZihuLmV4dHJhKXtmb3IoVT1uLmV4dHJhO2w8VTspe2lmKGY9PT0wKWJyZWFrIHQ7Zi0tLGMrPW9baSsrXTw8bCxsKz04fW4ub2Zmc2V0Kz1jJigxPDxuLmV4dHJhKS0xLGM+Pj49bi5leHRyYSxsLT1uLmV4dHJhLG4uYmFjays9bi5leHRyYX1pZihuLm9mZnNldD5uLmRtYXgpe3QubXNnPSJpbnZhbGlkIGRpc3RhbmNlIHRvbyBmYXIgYmFjayIsbi5tb2RlPU1uO2JyZWFrfW4ubW9kZT1RMjtjYXNlIFEyOmlmKHU9PT0wKWJyZWFrIHQ7aWYobT1kLXUsbi5vZmZzZXQ+bSl7aWYobT1uLm9mZnNldC1tLG0+bi53aGF2ZSYmbi5zYW5lKXt0Lm1zZz0iaW52YWxpZCBkaXN0YW5jZSB0b28gZmFyIGJhY2siLG4ubW9kZT1NbjticmVha31tPm4ud25leHQ/KG0tPW4ud25leHQsXz1uLndzaXplLW0pOl89bi53bmV4dC1tLG0+bi5sZW5ndGgmJihtPW4ubGVuZ3RoKSxnPW4ud2luZG93fWVsc2UgZz1yLF89cy1uLm9mZnNldCxtPW4ubGVuZ3RoO20+dSYmKG09dSksdS09bSxuLmxlbmd0aC09bTtkbyByW3MrK109Z1tfKytdO3doaWxlKC0tbSk7bi5sZW5ndGg9PT0wJiYobi5tb2RlPWNtKTticmVhaztjYXNlIEoyOmlmKHU9PT0wKWJyZWFrIHQ7cltzKytdPW4ubGVuZ3RoLHUtLSxuLm1vZGU9Y207YnJlYWs7Y2FzZSBJZzppZihuLndyYXApe2Zvcig7bDwzMjspe2lmKGY9PT0wKWJyZWFrIHQ7Zi0tLGN8PW9baSsrXTw8bCxsKz04fWlmKGQtPXUsdC50b3RhbF9vdXQrPWQsbi50b3RhbCs9ZCxuLndyYXAmNCYmZCYmKHQuYWRsZXI9bi5jaGVjaz1uLmZsYWdzP2dpKG4uY2hlY2sscixkLHMtZCk6RGcobi5jaGVjayxyLGQscy1kKSksZD11LG4ud3JhcCY0JiYobi5mbGFncz9jOm5TKGMpKSE9PW4uY2hlY2spe3QubXNnPSJpbmNvcnJlY3QgZGF0YSBjaGVjayIsbi5tb2RlPU1uO2JyZWFrfWM9MCxsPTB9bi5tb2RlPXRTO2Nhc2UgdFM6aWYobi53cmFwJiZuLmZsYWdzKXtmb3IoO2w8MzI7KXtpZihmPT09MClicmVhayB0O2YtLSxjKz1vW2krK108PGwsbCs9OH1pZihuLndyYXAmNCYmYyE9PShuLnRvdGFsJjQyOTQ5NjcyOTUpKXt0Lm1zZz0iaW5jb3JyZWN0IGxlbmd0aCBjaGVjayIsbi5tb2RlPU1uO2JyZWFrfWM9MCxsPTB9bi5tb2RlPWVTO2Nhc2UgZVM6RD1hNjticmVhayB0O2Nhc2UgTW46RD1zUzticmVhayB0O2Nhc2UgQmc6cmV0dXJuIEZnO2Nhc2UgY1M6ZGVmYXVsdDpyZXR1cm4gTXJ9cmV0dXJuIHQubmV4dF9vdXQ9cyx0LmF2YWlsX291dD11LHQubmV4dF9pbj1pLHQuYXZhaWxfaW49ZixuLmhvbGQ9YyxuLmJpdHM9bCwobi53c2l6ZXx8ZCE9PXQuYXZhaWxfb3V0JiZuLm1vZGU8TW4mJihuLm1vZGU8SWd8fGUhPT12MikpJiZwUyh0LHQub3V0cHV0LHQubmV4dF9vdXQsZC10LmF2YWlsX291dCk/KG4ubW9kZT1CZyxGZyk6KHAtPXQuYXZhaWxfaW4sZC09dC5hdmFpbF9vdXQsdC50b3RhbF9pbis9cCx0LnRvdGFsX291dCs9ZCxuLnRvdGFsKz1kLG4ud3JhcCY0JiZkJiYodC5hZGxlcj1uLmNoZWNrPW4uZmxhZ3M/Z2kobi5jaGVjayxyLGQsdC5uZXh0X291dC1kKTpEZyhuLmNoZWNrLHIsZCx0Lm5leHRfb3V0LWQpKSx0LmRhdGFfdHlwZT1uLmJpdHMrKG4ubGFzdD82NDowKSsobi5tb2RlPT09S2k/MTI4OjApKyhuLm1vZGU9PT1zbXx8bi5tb2RlPT09Tmc/MjU2OjApLChwPT09MCYmZD09PTB8fGU9PT12MikmJkQ9PT1TYyYmKEQ9dTYpLEQpfSxBNj10PT57aWYoQ2ModCkpcmV0dXJuIE1yO2xldCBlPXQuc3RhdGU7cmV0dXJuIGUud2luZG93JiYoZS53aW5kb3c9bnVsbCksdC5zdGF0ZT1udWxsLFNjfSxiNj0odCxlKT0+e2lmKENjKHQpKXJldHVybiBNcjtsZXQgbj10LnN0YXRlO3JldHVybihuLndyYXAmMik9PT0wP01yOihuLmhlYWQ9ZSxlLmRvbmU9ITEsU2MpfSxUNj0odCxlKT0+e2xldCBuPWUubGVuZ3RoLG8scixpO3JldHVybiBDYyh0KXx8KG89dC5zdGF0ZSxvLndyYXAhPT0wJiZvLm1vZGUhPT1hbSk/TXI6by5tb2RlPT09YW0mJihyPTEscj1EZyhyLGUsbiwwKSxyIT09by5jaGVjayk/c1M6KGk9cFModCxlLG4sbiksaT8oby5tb2RlPUJnLEZnKTooby5oYXZlZGljdD0xLFNjKSl9O1lyLmV4cG9ydHMuaW5mbGF0ZVJlc2V0PWZTO1lyLmV4cG9ydHMuaW5mbGF0ZVJlc2V0Mj11UztZci5leHBvcnRzLmluZmxhdGVSZXNldEtlZXA9YVM7WXIuZXhwb3J0cy5pbmZsYXRlSW5pdD1fNjtZci5leHBvcnRzLmluZmxhdGVJbml0Mj1sUztZci5leHBvcnRzLmluZmxhdGU9ZzY7WXIuZXhwb3J0cy5pbmZsYXRlRW5kPUE2O1lyLmV4cG9ydHMuaW5mbGF0ZUdldEhlYWRlcj1iNjtZci5leHBvcnRzLmluZmxhdGVTZXREaWN0aW9uYXJ5PVQ2O1lyLmV4cG9ydHMuaW5mbGF0ZUluZm89InBha28gaW5mbGF0ZSAoZnJvbSBOb2RlY2EgcHJvamVjdCkifSk7dmFyIG1TPVhuKChLdXQsVWcpPT57InVzZSBzdHJpY3QiO3ZhciB3Nj0odCxlKT0+T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsZSk7VWcuZXhwb3J0cy5hc3NpZ249ZnVuY3Rpb24odCl7bGV0IGU9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDEpO2Zvcig7ZS5sZW5ndGg7KXtsZXQgbj1lLnNoaWZ0KCk7aWYobil7aWYodHlwZW9mIG4hPSJvYmplY3QiKXRocm93IG5ldyBUeXBlRXJyb3IobisibXVzdCBiZSBub24tb2JqZWN0Iik7Zm9yKGxldCBvIGluIG4pdzYobixvKSYmKHRbb109bltvXSl9fXJldHVybiB0fTtVZy5leHBvcnRzLmZsYXR0ZW5DaHVua3M9dD0+e2xldCBlPTA7Zm9yKGxldCBvPTAscj10Lmxlbmd0aDtvPHI7bysrKWUrPXRbb10ubGVuZ3RoO2xldCBuPW5ldyBVaW50OEFycmF5KGUpO2ZvcihsZXQgbz0wLHI9MCxpPXQubGVuZ3RoO288aTtvKyspe2xldCBzPXRbb107bi5zZXQocyxyKSxyKz1zLmxlbmd0aH1yZXR1cm4gbn19KTt2YXIgX1M9WG4oKFd1dCx1bSk9PnsidXNlIHN0cmljdCI7dmFyIGhTPSEwO3RyeXtTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsbmV3IFVpbnQ4QXJyYXkoMSkpfWNhdGNoe2hTPSExfXZhciBtdT1uZXcgVWludDhBcnJheSgyNTYpO2ZvcihsZXQgdD0wO3Q8MjU2O3QrKyltdVt0XT10Pj0yNTI/Njp0Pj0yNDg/NTp0Pj0yNDA/NDp0Pj0yMjQ/Mzp0Pj0xOTI/MjoxO211WzI1NF09bXVbMjU0XT0xO3VtLmV4cG9ydHMuc3RyaW5nMmJ1Zj10PT57aWYodHlwZW9mIFRleHRFbmNvZGVyPT0iZnVuY3Rpb24iJiZUZXh0RW5jb2Rlci5wcm90b3R5cGUuZW5jb2RlKXJldHVybiBuZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUodCk7bGV0IGUsbixvLHIsaSxzPXQubGVuZ3RoLGY9MDtmb3Iocj0wO3I8cztyKyspbj10LmNoYXJDb2RlQXQociksKG4mNjQ1MTIpPT09NTUyOTYmJnIrMTxzJiYobz10LmNoYXJDb2RlQXQocisxKSwobyY2NDUxMik9PT01NjMyMCYmKG49NjU1MzYrKG4tNTUyOTY8PDEwKSsoby01NjMyMCkscisrKSksZis9bjwxMjg/MTpuPDIwNDg/MjpuPDY1NTM2PzM6NDtmb3IoZT1uZXcgVWludDhBcnJheShmKSxpPTAscj0wO2k8ZjtyKyspbj10LmNoYXJDb2RlQXQociksKG4mNjQ1MTIpPT09NTUyOTYmJnIrMTxzJiYobz10LmNoYXJDb2RlQXQocisxKSwobyY2NDUxMik9PT01NjMyMCYmKG49NjU1MzYrKG4tNTUyOTY8PDEwKSsoby01NjMyMCkscisrKSksbjwxMjg/ZVtpKytdPW46bjwyMDQ4PyhlW2krK109MTkyfG4+Pj42LGVbaSsrXT0xMjh8biY2Myk6bjw2NTUzNj8oZVtpKytdPTIyNHxuPj4+MTIsZVtpKytdPTEyOHxuPj4+NiY2MyxlW2krK109MTI4fG4mNjMpOihlW2krK109MjQwfG4+Pj4xOCxlW2krK109MTI4fG4+Pj4xMiY2MyxlW2krK109MTI4fG4+Pj42JjYzLGVbaSsrXT0xMjh8biY2Myk7cmV0dXJuIGV9O3ZhciBPNj0odCxlKT0+e2lmKGU8NjU1MzQmJnQuc3ViYXJyYXkmJmhTKXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsdC5sZW5ndGg9PT1lP3Q6dC5zdWJhcnJheSgwLGUpKTtsZXQgbj0iIjtmb3IobGV0IG89MDtvPGU7bysrKW4rPVN0cmluZy5mcm9tQ2hhckNvZGUodFtvXSk7cmV0dXJuIG59O3VtLmV4cG9ydHMuYnVmMnN0cmluZz0odCxlKT0+e2xldCBuPWV8fHQubGVuZ3RoO2lmKHR5cGVvZiBUZXh0RGVjb2Rlcj09ImZ1bmN0aW9uIiYmVGV4dERlY29kZXIucHJvdG90eXBlLmRlY29kZSlyZXR1cm4gbmV3IFRleHREZWNvZGVyKCkuZGVjb2RlKHQuc3ViYXJyYXkoMCxlKSk7bGV0IG8scixpPW5ldyBBcnJheShuKjIpO2ZvcihyPTAsbz0wO288bjspe2xldCBzPXRbbysrXTtpZihzPDEyOCl7aVtyKytdPXM7Y29udGludWV9bGV0IGY9bXVbc107aWYoZj40KXtpW3IrK109NjU1MzMsbys9Zi0xO2NvbnRpbnVlfWZvcihzJj1mPT09Mj8zMTpmPT09Mz8xNTo3O2Y+MSYmbzxuOylzPXM8PDZ8dFtvKytdJjYzLGYtLTtpZihmPjEpe2lbcisrXT02NTUzMztjb250aW51ZX1zPDY1NTM2P2lbcisrXT1zOihzLT02NTUzNixpW3IrK109NTUyOTZ8cz4+MTAmMTAyMyxpW3IrK109NTYzMjB8cyYxMDIzKX1yZXR1cm4gTzYoaSxyKX07dW0uZXhwb3J0cy51dGY4Ym9yZGVyPSh0LGUpPT57ZT1lfHx0Lmxlbmd0aCxlPnQubGVuZ3RoJiYoZT10Lmxlbmd0aCk7bGV0IG49ZS0xO2Zvcig7bj49MCYmKHRbbl0mMTkyKT09PTEyODspbi0tO3JldHVybiBuPDB8fG49PT0wP2U6bittdVt0W25dXT5lP246ZX19KTt2YXIgZ1M9WG4oKFh1dCx5Uyk9PnsidXNlIHN0cmljdCI7eVMuZXhwb3J0cz17MjoibmVlZCBkaWN0aW9uYXJ5IiwxOiJzdHJlYW0gZW5kIiwwOiIiLCItMSI6ImZpbGUgZXJyb3IiLCItMiI6InN0cmVhbSBlcnJvciIsIi0zIjoiZGF0YSBlcnJvciIsIi00IjoiaW5zdWZmaWNpZW50IG1lbW9yeSIsIi01IjoiYnVmZmVyIGVycm9yIiwiLTYiOiJpbmNvbXBhdGlibGUgdmVyc2lvbiJ9fSk7dmFyIGJTPVhuKChZdXQsQVMpPT57InVzZSBzdHJpY3QiO2Z1bmN0aW9uIEU2KCl7dGhpcy5pbnB1dD1udWxsLHRoaXMubmV4dF9pbj0wLHRoaXMuYXZhaWxfaW49MCx0aGlzLnRvdGFsX2luPTAsdGhpcy5vdXRwdXQ9bnVsbCx0aGlzLm5leHRfb3V0PTAsdGhpcy5hdmFpbF9vdXQ9MCx0aGlzLnRvdGFsX291dD0wLHRoaXMubXNnPSIiLHRoaXMuc3RhdGU9bnVsbCx0aGlzLmRhdGFfdHlwZT0yLHRoaXMuYWRsZXI9MH1BUy5leHBvcnRzPUU2fSk7dmFyIHdTPVhuKCgkdXQsVFMpPT57InVzZSBzdHJpY3QiO2Z1bmN0aW9uIFI2KCl7dGhpcy50ZXh0PTAsdGhpcy50aW1lPTAsdGhpcy54ZmxhZ3M9MCx0aGlzLm9zPTAsdGhpcy5leHRyYT1udWxsLHRoaXMuZXh0cmFfbGVuPTAsdGhpcy5uYW1lPSIiLHRoaXMuY29tbWVudD0iIix0aGlzLmhjcmM9MCx0aGlzLmRvbmU9ITF9VFMuZXhwb3J0cz1SNn0pO3ZhciBTUz1YbigoWnV0LGthKT0+eyJ1c2Ugc3RyaWN0Ijt2YXIgV2k9ZFMoKSxFUz1tUygpLEdnPV9TKCksemc9Z1MoKSxTNj1iUygpLEM2PXdTKCksUlM9T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZyx7Wl9OT19GTFVTSDp4NixaX0ZJTklTSDpQNixaX09LOmh1LFpfU1RSRUFNX0VORDpWZyxaX05FRURfRElDVDprZyxaX1NUUkVBTV9FUlJPUjpNNixaX0RBVEFfRVJST1I6T1MsWl9NRU1fRVJST1I6TjZ9PXJtKCk7ZnVuY3Rpb24gX3UodCl7dGhpcy5vcHRpb25zPUVTLmFzc2lnbih7Y2h1bmtTaXplOjEwMjQqNjQsd2luZG93Qml0czoxNSx0bzoiIn0sdHx8e30pO2xldCBlPXRoaXMub3B0aW9ucztlLnJhdyYmZS53aW5kb3dCaXRzPj0wJiZlLndpbmRvd0JpdHM8MTYmJihlLndpbmRvd0JpdHM9LWUud2luZG93Qml0cyxlLndpbmRvd0JpdHM9PT0wJiYoZS53aW5kb3dCaXRzPS0xNSkpLGUud2luZG93Qml0cz49MCYmZS53aW5kb3dCaXRzPDE2JiYhKHQmJnQud2luZG93Qml0cykmJihlLndpbmRvd0JpdHMrPTMyKSxlLndpbmRvd0JpdHM+MTUmJmUud2luZG93Qml0czw0OCYmKGUud2luZG93Qml0cyYxNSk9PT0wJiYoZS53aW5kb3dCaXRzfD0xNSksdGhpcy5lcnI9MCx0aGlzLm1zZz0iIix0aGlzLmVuZGVkPSExLHRoaXMuY2h1bmtzPVtdLHRoaXMuc3RybT1uZXcgUzYsdGhpcy5zdHJtLmF2YWlsX291dD0wO2xldCBuPVdpLmluZmxhdGVJbml0Mih0aGlzLnN0cm0sZS53aW5kb3dCaXRzKTtpZihuIT09aHUpdGhyb3cgbmV3IEVycm9yKHpnW25dKTtpZih0aGlzLmhlYWRlcj1uZXcgQzYsV2kuaW5mbGF0ZUdldEhlYWRlcih0aGlzLnN0cm0sdGhpcy5oZWFkZXIpLGUuZGljdGlvbmFyeSYmKHR5cGVvZiBlLmRpY3Rpb25hcnk9PSJzdHJpbmciP2UuZGljdGlvbmFyeT1HZy5zdHJpbmcyYnVmKGUuZGljdGlvbmFyeSk6UlMuY2FsbChlLmRpY3Rpb25hcnkpPT09IltvYmplY3QgQXJyYXlCdWZmZXJdIiYmKGUuZGljdGlvbmFyeT1uZXcgVWludDhBcnJheShlLmRpY3Rpb25hcnkpKSxlLnJhdyYmKG49V2kuaW5mbGF0ZVNldERpY3Rpb25hcnkodGhpcy5zdHJtLGUuZGljdGlvbmFyeSksbiE9PWh1KSkpdGhyb3cgbmV3IEVycm9yKHpnW25dKX1fdS5wcm90b3R5cGUucHVzaD1mdW5jdGlvbih0LGUpe2xldCBuPXRoaXMuc3RybSxvPXRoaXMub3B0aW9ucy5jaHVua1NpemUscj10aGlzLm9wdGlvbnMuZGljdGlvbmFyeSxpLHMsZjtpZih0aGlzLmVuZGVkKXJldHVybiExO2ZvcihlPT09fn5lP3M9ZTpzPWU9PT0hMD9QNjp4NixSUy5jYWxsKHQpPT09IltvYmplY3QgQXJyYXlCdWZmZXJdIj9uLmlucHV0PW5ldyBVaW50OEFycmF5KHQpOm4uaW5wdXQ9dCxuLm5leHRfaW49MCxuLmF2YWlsX2luPW4uaW5wdXQubGVuZ3RoOzspe2ZvcihuLmF2YWlsX291dD09PTAmJihuLm91dHB1dD1uZXcgVWludDhBcnJheShvKSxuLm5leHRfb3V0PTAsbi5hdmFpbF9vdXQ9byksaT1XaS5pbmZsYXRlKG4scyksaT09PWtnJiZyJiYoaT1XaS5pbmZsYXRlU2V0RGljdGlvbmFyeShuLHIpLGk9PT1odT9pPVdpLmluZmxhdGUobixzKTppPT09T1MmJihpPWtnKSk7bi5hdmFpbF9pbj4wJiZpPT09VmcmJm4uc3RhdGUud3JhcD4wJiZ0W24ubmV4dF9pbl0hPT0wOylXaS5pbmZsYXRlUmVzZXQobiksaT1XaS5pbmZsYXRlKG4scyk7c3dpdGNoKGkpe2Nhc2UgTTY6Y2FzZSBPUzpjYXNlIGtnOmNhc2UgTjY6cmV0dXJuIHRoaXMub25FbmQoaSksdGhpcy5lbmRlZD0hMCwhMX1pZihmPW4uYXZhaWxfb3V0LG4ubmV4dF9vdXQmJihuLmF2YWlsX291dD09PTB8fGk9PT1WZykpaWYodGhpcy5vcHRpb25zLnRvPT09InN0cmluZyIpe2xldCB1PUdnLnV0Zjhib3JkZXIobi5vdXRwdXQsbi5uZXh0X291dCksYz1uLm5leHRfb3V0LXUsbD1HZy5idWYyc3RyaW5nKG4ub3V0cHV0LHUpO24ubmV4dF9vdXQ9YyxuLmF2YWlsX291dD1vLWMsYyYmbi5vdXRwdXQuc2V0KG4ub3V0cHV0LnN1YmFycmF5KHUsdStjKSwwKSx0aGlzLm9uRGF0YShsKX1lbHNlIHRoaXMub25EYXRhKG4ub3V0cHV0Lmxlbmd0aD09PW4ubmV4dF9vdXQ/bi5vdXRwdXQ6bi5vdXRwdXQuc3ViYXJyYXkoMCxuLm5leHRfb3V0KSk7aWYoIShpPT09aHUmJmY9PT0wKSl7aWYoaT09PVZnKXJldHVybiBpPVdpLmluZmxhdGVFbmQodGhpcy5zdHJtKSx0aGlzLm9uRW5kKGkpLHRoaXMuZW5kZWQ9ITAsITA7aWYobi5hdmFpbF9pbj09PTApYnJlYWt9fXJldHVybiEwfTtfdS5wcm90b3R5cGUub25EYXRhPWZ1bmN0aW9uKHQpe3RoaXMuY2h1bmtzLnB1c2godCl9O191LnByb3RvdHlwZS5vbkVuZD1mdW5jdGlvbih0KXt0PT09aHUmJih0aGlzLm9wdGlvbnMudG89PT0ic3RyaW5nIj90aGlzLnJlc3VsdD10aGlzLmNodW5rcy5qb2luKCIiKTp0aGlzLnJlc3VsdD1FUy5mbGF0dGVuQ2h1bmtzKHRoaXMuY2h1bmtzKSksdGhpcy5jaHVua3M9W10sdGhpcy5lcnI9dCx0aGlzLm1zZz10aGlzLnN0cm0ubXNnfTtmdW5jdGlvbiBqZyh0LGUpe2xldCBuPW5ldyBfdShlKTtpZihuLnB1c2godCksbi5lcnIpdGhyb3cgbi5tc2d8fHpnW24uZXJyXTtyZXR1cm4gbi5yZXN1bHR9ZnVuY3Rpb24gSTYodCxlKXtyZXR1cm4gZT1lfHx7fSxlLnJhdz0hMCxqZyh0LGUpfWthLmV4cG9ydHMuSW5mbGF0ZT1fdTtrYS5leHBvcnRzLmluZmxhdGU9amc7a2EuZXhwb3J0cy5pbmZsYXRlUmF3PUk2O2thLmV4cG9ydHMudW5nemlwPWpnO2thLmV4cG9ydHMuY29uc3RhbnRzPXJtKCl9KTt2YXIgSGc9e307ZGUoSGcse2RlZmF1bHQ6KCk9Pkc2fSk7ZnVuY3Rpb24gdjYodCxlKXtsZXQgbj1Ncy5mcm9tU3RyaW5nKHQudHlwZSksbz10LmJ1ZmZlcjtnMih0LmtleSxvKTtsZXQgcj1rNihvKTtvPXIuYnVmZmVyO2xldCBpPXIubGVuZ3RoO3N3aXRjaChuKXtjYXNlIE1zLk1FVEFEQVRBOnJldHVybiBENihvLGksdC5xdWFkS2V5KTtjYXNlIE1zLlRFUlJBSU46cmV0dXJuIFU2KG8saSxlKTtjYXNlIE1zLkRCUk9PVDpyZXR1cm4gZS5wdXNoKG8pLHtidWZmZXI6b319fWZ1bmN0aW9uIEQ2KHQsZSxuKXtsZXQgbz1uZXcgRGF0YVZpZXcodCkscj0wLGk9by5nZXRVaW50MzIociwhMCk7aWYocis9emEsaSE9PUw2KXRocm93IG5ldyBBZSgiSW52YWxpZCBtYWdpYyIpO2xldCBzPW8uZ2V0VWludDMyKHIsITApO2lmKHIrPXphLHMhPT0xKXRocm93IG5ldyBBZSgiSW52YWxpZCBkYXRhIHR5cGUuIE11c3QgYmUgMSBmb3IgUXVhZFRyZWVQYWNrZXQiKTtsZXQgZj1vLmdldFVpbnQzMihyLCEwKTtpZihyKz16YSxmIT09Mil0aHJvdyBuZXcgQWUoIkludmFsaWQgUXVhZFRyZWVQYWNrZXQgdmVyc2lvbi4gT25seSB2ZXJzaW9uIDIgaXMgc3VwcG9ydGVkLiIpO2xldCB1PW8uZ2V0SW50MzIociwhMCk7cis9eGM7bGV0IGM9by5nZXRJbnQzMihyLCEwKTtpZihyKz14YyxjIT09MzIpdGhyb3cgbmV3IEFlKCJJbnZhbGlkIGluc3RhbmNlIHNpemUuIik7bGV0IGw9by5nZXRJbnQzMihyLCEwKTtyKz14YztsZXQgcD1vLmdldEludDMyKHIsITApO3IrPXhjO2xldCBkPW8uZ2V0SW50MzIociwhMCk7aWYocis9eGMsbCE9PXUqYytyKXRocm93IG5ldyBBZSgiSW52YWxpZCBkYXRhQnVmZmVyT2Zmc2V0Iik7aWYobCtwK2QhPT1lKXRocm93IG5ldyBBZSgiSW52YWxpZCBwYWNrZXQgb2Zmc2V0cyIpO2xldCBtPVtdO2ZvcihsZXQgRT0wO0U8dTsrK0Upe2xldCB3PW8uZ2V0VWludDgocik7KytyLCsrcjtsZXQgQz1vLmdldFVpbnQxNihyLCEwKTtyKz1HYTtsZXQgTj1vLmdldFVpbnQxNihyLCEwKTtyKz1HYTtsZXQgST1vLmdldFVpbnQxNihyLCEwKTtyKz1HYSxyKz1HYSxyKz1HYSxyKz14YyxyKz14YyxyKz04O2xldCBEPW8uZ2V0VWludDgocisrKSx2PW8uZ2V0VWludDgocisrKTtyKz1HYSxtLnB1c2gobmV3IHcyKHcsQyxOLEksRCx2KSl9bGV0IF89W10sZz0wO2Z1bmN0aW9uIGIoRSx3LEMpe2xldCBOPSExO2lmKEM9PT00KXtpZih3Lmhhc1N1YnRyZWUoKSlyZXR1cm47Tj0hMH1mb3IobGV0IEk9MDtJPDQ7KytJKXtsZXQgRD1FK0kudG9TdHJpbmcoKTtpZihOKV9bRF09bnVsbDtlbHNlIGlmKEM8NClpZighdy5oYXNDaGlsZChJKSlfW0RdPW51bGw7ZWxzZXtpZihnPT09dSl7Y29uc29sZS5sb2coIkluY29ycmVjdCBudW1iZXIgb2YgaW5zdGFuY2VzIik7cmV0dXJufWxldCB2PW1bZysrXTtfW0RdPXYsYihELHYsQysxKX19fWxldCBUPTAsTz1tW2crK107cmV0dXJuIG49PT0iIj8rK1Q6X1tuXT1PLGIobixPLFQpLF99ZnVuY3Rpb24gVTYodCxlLG4pe2xldCBvPW5ldyBEYXRhVmlldyh0KSxyPWZ1bmN0aW9uKGYpe2ZvcihsZXQgdT0wO3U8QjY7Kyt1KXtsZXQgYz1vLmdldFVpbnQzMihmLCEwKTtpZihmKz16YSxmKz1jLGY+ZSl0aHJvdyBuZXcgQWUoIk1hbGZvcm1lZCB0ZXJyYWluIHBhY2tldCBmb3VuZC4iKX1yZXR1cm4gZn0saT0wLHM9W107Zm9yKDtzLmxlbmd0aDxGNjspe2xldCBmPWk7aT1yKGkpO2xldCB1PXQuc2xpY2UoZixpKTtuLnB1c2godSkscy5wdXNoKHUpfXJldHVybiBzfWZ1bmN0aW9uIGs2KHQpe2xldCBlPW5ldyBEYXRhVmlldyh0KSxuPTAsbz1lLmdldFVpbnQzMihuLCEwKTtpZihuKz16YSxvIT09Q1MmJm8hPT1WNil0aHJvdyBuZXcgQWUoIkludmFsaWQgbWFnaWMiKTtsZXQgcj1lLmdldFVpbnQzMihuLG89PT1DUyk7bis9emE7bGV0IGk9bmV3IFVpbnQ4QXJyYXkodCxuKSxzPXhTLmRlZmF1bHQuaW5mbGF0ZShpKTtpZihzLmxlbmd0aCE9PXIpdGhyb3cgbmV3IEFlKCJTaXplIG9mIHBhY2tldCBkb2Vzbid0IG1hdGNoIGhlYWRlciIpO3JldHVybiBzfXZhciB4UyxHYSx4Yyx6YSxNcyxMNixGNixCNixDUyxWNixHNixxZz1aKCgpPT57QTIoKTtPMigpO0pyKCk7eFM9ZHIoU1MoKSwxKTtzbygpO0dhPVVpbnQxNkFycmF5LkJZVEVTX1BFUl9FTEVNRU5ULHhjPUludDMyQXJyYXkuQllURVNfUEVSX0VMRU1FTlQsemE9VWludDMyQXJyYXkuQllURVNfUEVSX0VMRU1FTlQsTXM9e01FVEFEQVRBOjAsVEVSUkFJTjoxLERCUk9PVDoyfTtNcy5mcm9tU3RyaW5nPWZ1bmN0aW9uKHQpe2lmKHQ9PT0iTWV0YWRhdGEiKXJldHVybiBNcy5NRVRBREFUQTtpZih0PT09IlRlcnJhaW4iKXJldHVybiBNcy5URVJSQUlOO2lmKHQ9PT0iRGJSb290IilyZXR1cm4gTXMuREJST09UfTtMNj0zMjMwMTtGNj01LEI2PTQ7Q1M9MTk1MzAyOTgwNSxWNj0yOTE3MDM0MTAwO0c2PVFlKHY2KX0pO2Z1bmN0aW9uIHo2KHQpe3JldHVybiB5LmRlZmluZWQoInZhbHVlIix0KSx0PD0uMDQwNDU/dCouMDc3Mzk5MzgwODA0OTUzNTc6TWF0aC5wb3coKHQrLjA1NSkqLjk0Nzg2NzI5ODU3ODE5OTEsMi40KX12YXIgbG0sUFM9WigoKT0+e1h0KCk7bG09ejZ9KTt2YXIgWWc9e307ZGUoWWcse2RlZmF1bHQ6KCk9Pm04fSk7ZnVuY3Rpb24gajYodCxlLG4sbyxyLGkpe2xldCBzPW4qKDEtdCkrbyp0LGY9ciooMS10KStpKnQ7cmV0dXJuIHMqKDEtZSkrZiplfWZ1bmN0aW9uIHBtKHQsZSxuLG8pe2xldCByPXQrZSpuO3JldHVybiBvW3JdfWZ1bmN0aW9uIEg2KHQsZSxuKXtsZXQgbz1uLm5hdGl2ZUV4dGVudCxyPSh0LW8ud2VzdCkvKG8uZWFzdC1vLndlc3QpKihuLndpZHRoLTEpLGk9KGUtby5zb3V0aCkvKG8ubm9ydGgtby5zb3V0aCkqKG4uaGVpZ2h0LTEpLHM9TWF0aC5mbG9vcihyKSxmPU1hdGguZmxvb3IoaSk7ci09cyxpLT1mO2xldCB1PXM8bi53aWR0aD9zKzE6cyxjPWY8bi5oZWlnaHQ/ZisxOmY7Zj1uLmhlaWdodC0xLWYsYz1uLmhlaWdodC0xLWM7bGV0IGw9cG0ocyxmLG4ud2lkdGgsbi5idWZmZXIpLHA9cG0odSxmLG4ud2lkdGgsbi5idWZmZXIpLGQ9cG0ocyxjLG4ud2lkdGgsbi5idWZmZXIpLG09cG0odSxjLG4ud2lkdGgsbi5idWZmZXIpLF89ajYocixpLGwscCxkLG0pO3JldHVybiBfPV8qbi5zY2FsZStuLm9mZnNldCxffWZ1bmN0aW9uIE1TKHQsZSxuKXtmb3IobGV0IG89MDtvPG4ubGVuZ3RoO28rKyl7bGV0IHI9bltvXS5uYXRpdmVFeHRlbnQsaT1uZXcgYTtpZihuW29dLnByb2plY3Rpb25UeXBlPT09IldlYk1lcmNhdG9yIil7bGV0IHM9bltvXS5wcm9qZWN0aW9uLl9lbGxpcHNvaWQuX3JhZGlpO2k9bmV3IG5vKG5ldyAkKHMueCxzLnkscy56KSkucHJvamVjdChuZXcgY3QodCxlLDApKX1lbHNlIGkueD10LGkueT1lO2lmKGkueD5yLndlc3QmJmkueDxyLmVhc3QmJmkueT5yLnNvdXRoJiZpLnk8ci5ub3J0aClyZXR1cm4gSDYoaS54LGkueSxuW29dKX1yZXR1cm4gMH1mdW5jdGlvbiBxNih0LGUsbixvLHIsaSxzKXtpZihzKXJldHVybjtsZXQgZj1NUyhyLmxvbmdpdHVkZSxyLmxhdGl0dWRlLGkpO2ZvcihsZXQgdT0wO3U8dDsrK3Upe2xldCBjPU1TKHIubG9uZ2l0dWRlK00udG9SYWRpYW5zKG4qZVt1KjNdKSxyLmxhdGl0dWRlK00udG9SYWRpYW5zKG8qZVt1KjMrMV0pLGkpO2VbdSozKzJdKz1jLWZ9fWZ1bmN0aW9uIEs2KHQsZSxuLG8scixpLHMsZix1KXtpZih0PT09MHx8IWgoZSl8fGUubGVuZ3RoPT09MClyZXR1cm47bGV0IGM9bmV3ICQoTWF0aC5zcXJ0KHMueCksTWF0aC5zcXJ0KHMueSksTWF0aC5zcXJ0KHMueikpO2ZvcihsZXQgbD0wO2w8dDsrK2wpe2xldCBwPWwqMyxkPXArMSxtPXArMixfPW5ldyBjdDtfLmxvbmdpdHVkZT1vLmxvbmdpdHVkZStNLnRvUmFkaWFucyhmKmVbcF0pLF8ubGF0aXR1ZGU9by5sYXRpdHVkZStNLnRvUmFkaWFucyh1KmVbZF0pLF8uaGVpZ2h0PW8uaGVpZ2h0K2VbbV07bGV0IGc9e307Yy5jYXJ0b2dyYXBoaWNUb0NhcnRlc2lhbihfLGcpLGcueC09ci54LGcueS09ci55LGcuei09ci56O2xldCBiPXt9O2lmKFEubXVsdGlwbHlCeVZlY3RvcihpLGcsYiksZVtwXT1iLngsZVtkXT1iLnksZVttXT1iLnosaChuKSl7bGV0IFQ9bmV3IGEobltwXSxuW2RdLG5bbV0pLE89e307US5tdWx0aXBseUJ5VmVjdG9yKGksVCxPKSxuW3BdPU8ueCxuW2RdPU8ueSxuW21dPU8uen19fWZ1bmN0aW9uIFc2KHQsZSxuKXtmb3IobGV0IG89MDtvPHQ7KytvKXtsZXQgcj1uW28qNF0vNjU1MzUsaT1uW28qNCsxXS82NTUzNSxzPShuW28qNCsyXS1uW28qNF0pLzY1NTM1LGY9KG5bbyo0KzNdLW5bbyo0KzFdKS82NTUzNTtlW28qMl0qPXMsZVtvKjJdKz1yLGVbbyoyKzFdKj1mLGVbbyoyKzFdKz1pfX1mdW5jdGlvbiBYNih0LGUsbixvKXtsZXQgcj1uZXcgVWludDMyQXJyYXkodCksaT1oKGUpP2Y9PmVbZl06Zj0+ZixzPTA7aWYobyYmaChuKSl7bGV0IGY9dT0+bltpKHUpKjQrM108MjU1O2ZvcihsZXQgdT0wO3U8dDt1Kz0zKSFmKHUpJiYhZih1KzEpJiYhZih1KzIpJiYocltzKytdPWkodSkscltzKytdPWkodSsxKSxyW3MrK109aSh1KzIpKTtpZihzPjApe2xldCB1PXM7Zm9yKGxldCBjPTA7Yzx0O2MrPTMpKGYoYyl8fGYoYysxKXx8ZihjKzIpKSYmKHJbdSsrXT1pKGMpLHJbdSsrXT1pKGMrMSksclt1KytdPWkoYysyKSl9ZWxzZSBmb3IobGV0IHU9MDt1PHQ7Kyt1KXJbdV09aSh1KX1lbHNle3M9dDtmb3IobGV0IGY9MDtmPHQ7KytmKXJbZl09aShmKX1yZXR1cm57aW5kZXhBcnJheTpyLHRyYW5zcGFyZW50VmVydGV4T2Zmc2V0OnN9fWZ1bmN0aW9uIFk2KHQsZSxuKXtsZXQgbz1lW25dO2lmKGgobykpcmV0dXJuIG87bGV0IHI9ZVtuXT17cG9zaXRpb25zOnt9LGluZGljZXM6e30sZWRnZXM6e319LGk9eCh0W25dLHQuZGVmYXVsdCk7cmV0dXJuIHIuaGFzT3V0bGluZT1oKGk9PW51bGw/dm9pZCAwOmkuZWRnZXMpLHJ9ZnVuY3Rpb24gJDYodCxlLG4sbyl7aWYoIWgodFtuXSkpe2xldCByPW4qMyxpPWU7Zm9yKGxldCBzPTA7czwzO3MrKyl7bGV0IGY9b1tyK3NdO2goaVtmXSl8fChpW2ZdPXt9KSxpPWlbZl19aChpLmluZGV4KXx8KGkuaW5kZXg9biksdFtuXT1pLmluZGV4fX1mdW5jdGlvbiBaNih0LGUsbixvLHIsaSl7bGV0IHMsZjtvPHI/KHM9byxmPXIpOihzPXIsZj1vKTtsZXQgdT10W3NdO2godSl8fCh1PXRbc109e30pO2xldCBjPXVbZl07aChjKXx8KGM9dVtmXT17bm9ybWFsc0luZGV4OltdLG91dGxpbmVzOltdfSksYy5ub3JtYWxzSW5kZXgucHVzaChpKSwoYy5vdXRsaW5lcy5sZW5ndGg9PT0wfHxlIT09b3x8biE9PXIpJiZjLm91dGxpbmVzLnB1c2goZSxuKX1mdW5jdGlvbiBRNih0LGUsbixvKXtsZXQgcj1bXTtmb3IobGV0IGk9MDtpPG4ubGVuZ3RoO2krPTMpe2xldCBzPWgoZSk/ZVtuW2ldXToiZGVmYXVsdCIsZj1ZNih0LHIscyk7aWYoIWYuaGFzT3V0bGluZSljb250aW51ZTtsZXQgdT1mLmluZGljZXMsYz1mLnBvc2l0aW9ucztmb3IobGV0IHA9MDtwPDM7cCsrKXtsZXQgZD1uW2krcF07JDYodSxjLGQsbyl9bGV0IGw9Zi5lZGdlcztmb3IobGV0IHA9MDtwPDM7cCsrKXtsZXQgZD1uW2krcF0sbT1uW2krKHArMSklM10sXz11W2RdLGc9dVttXTtaNihsLGQsbSxfLGcsaSl9fXJldHVybiByfWZ1bmN0aW9uIE5TKHQsZSxuLG8pe2xldCByPW5bZV0qMyxpPW5bZSsxXSozLHM9bltlKzJdKjM7YS5mcm9tQXJyYXkobyxyLEFpKSxhLmZyb21BcnJheShvLGksZG0pLGEuZnJvbUFycmF5KG8scyxtbSksYS5zdWJ0cmFjdChkbSxBaSxkbSksYS5zdWJ0cmFjdChtbSxBaSxtbSksYS5jcm9zcyhkbSxtbSxBaSk7bGV0IGY9YS5tYWduaXR1ZGUoQWkpO2YhPT0wJiZhLmRpdmlkZUJ5U2NhbGFyKEFpLGYsQWkpO2xldCB1PWUqMyxjPShlKzEpKjMsbD0oZSsyKSozO2EucGFjayhBaSx0LHUpLGEucGFjayhBaSx0LGMpLGEucGFjayhBaSx0LGwpfWZ1bmN0aW9uIEo2KHQsZSxuKXthLmZyb21BcnJheSh0LGUsaG0pLGEuZnJvbUFycmF5KHQsbixLZyk7bGV0IG89YS5kb3QoaG0sS2cpLHI9YS5tYWduaXR1ZGUoYS5jcm9zcyhobSxLZyxobSkpO3JldHVybiBNYXRoLmF0YW4yKHIsbyk8LjI1fWZ1bmN0aW9uIHQ4KHQsZSxuLG8scil7aWYoZS5ub3JtYWxzSW5kZXgubGVuZ3RoPjEpe2xldCBpPW8ubGVuZ3RoPT09ci5sZW5ndGg7Zm9yKGxldCBzPTA7czxlLm5vcm1hbHNJbmRleC5sZW5ndGg7cysrKXtsZXQgZj1lLm5vcm1hbHNJbmRleFtzXTtpZihoKHJbZiozXSl8fE5TKHIsZixuLG8pLHMhPT0wKWZvcihsZXQgdT0wO3U8czt1Kyspe2xldCBjPWUubm9ybWFsc0luZGV4W3VdLGw9aT9uW2ZdKjM6ZiozLHA9aT9uW2NdKjM6YyozO2lmKEo2KHIsbCxwKSlyZXR1cm59fX10LnB1c2goLi4uZS5vdXRsaW5lcyl9ZnVuY3Rpb24gZTgodCxlLG4sbyxyKXtsZXQgaT1PYmplY3Qua2V5cyhlKTtmb3IobGV0IHM9MDtzPGkubGVuZ3RoO3MrKyl7bGV0IGY9ZVtpW3NdXSx1PU9iamVjdC5rZXlzKGYpO2ZvcihsZXQgYz0wO2M8dS5sZW5ndGg7YysrKXtsZXQgbD1mW3VbY11dO3Q4KHQsbCxuLG8scil9fX1mdW5jdGlvbiBuOCh0LGUsbixvKXtsZXQgcj1bXSxpPU9iamVjdC5rZXlzKHQpO2ZvcihsZXQgcz0wO3M8aS5sZW5ndGg7cysrKXtsZXQgZj10W2lbc11dLmVkZ2VzO2U4KHIsZixlLG4sbyl9cmV0dXJuIHJ9ZnVuY3Rpb24gbzgodCxlLG4sbyxyKXtpZighaCh0KXx8T2JqZWN0LmtleXModCkubGVuZ3RoPT09MClyZXR1cm47bGV0IGk9UTYodCxlLG4sbyk7KCFoKHIpfHxuLmxlbmd0aCozIT09ci5sZW5ndGgpJiYocj1bXSk7bGV0IHM9bjgoaSxuLG8scik7cmV0dXJuIHMubGVuZ3RoPjA/bmV3IFVpbnQzMkFycmF5KHMpOnZvaWQgMH1mdW5jdGlvbiByOCh0KXtsZXQgZT1uZXcgRmxvYXQzMkFycmF5KHQubGVuZ3RoKTtmb3IobGV0IG49MDtuPHQubGVuZ3RoO24rPTQpZVtuXT1sbShvZS5ieXRlVG9GbG9hdCh0W25dKSksZVtuKzFdPWxtKG9lLmJ5dGVUb0Zsb2F0KHRbbisxXSkpLGVbbisyXT1sbShvZS5ieXRlVG9GbG9hdCh0W24rMl0pKSxlW24rM109b2UuYnl0ZVRvRmxvYXQodFtuKzNdKTtyZXR1cm4gZX1mdW5jdGlvbiBpOCh0LGUsbixvLHIsaSxzKXtsZXQgZj17bm9ybWFsczp2b2lkIDAscG9zaXRpb25zOnZvaWQgMCx1djBzOnZvaWQgMCxjb2xvcnM6dm9pZCAwLGZlYXR1cmVJbmRleDp2b2lkIDAsdmVydGV4Q291bnQ6dm9pZCAwfTtpZih0PT09MHx8IWgobil8fG4ubGVuZ3RoPT09MHx8aChvKSlyZXR1cm4gZjtpZihoKGUpKXtmLnZlcnRleENvdW50PWUubGVuZ3RoLGYucG9zaXRpb25zPW5ldyBGbG9hdDMyQXJyYXkoZS5sZW5ndGgqMyksZi51djBzPWgocik/bmV3IEZsb2F0MzJBcnJheShlLmxlbmd0aCoyKTp2b2lkIDAsZi5jb2xvcnM9aChpKT9uZXcgVWludDhBcnJheShlLmxlbmd0aCo0KTp2b2lkIDAsZi5mZWF0dXJlSW5kZXg9aChzKT9uZXcgQXJyYXkoZS5sZW5ndGgpOnZvaWQgMDtmb3IobGV0IHU9MDt1PGUubGVuZ3RoO3UrKyl7bGV0IGM9ZVt1XTtmLnBvc2l0aW9uc1t1KjNdPW5bYyozXSxmLnBvc2l0aW9uc1t1KjMrMV09bltjKjMrMV0sZi5wb3NpdGlvbnNbdSozKzJdPW5bYyozKzJdLGgoZi51djBzKSYmKGYudXYwc1t1KjJdPXJbYyoyXSxmLnV2MHNbdSoyKzFdPXJbYyoyKzFdKSxoKGYuY29sb3JzKSYmKGYuY29sb3JzW3UqNF09aVtjKjRdLGYuY29sb3JzW3UqNCsxXT1pW2MqNCsxXSxmLmNvbG9yc1t1KjQrMl09aVtjKjQrMl0sZi5jb2xvcnNbdSo0KzNdPWlbYyo0KzNdKSxoKGYuZmVhdHVyZUluZGV4KSYmKGYuZmVhdHVyZUluZGV4W3VdPXNbY10pfXQ9ZS5sZW5ndGgsbj1mLnBvc2l0aW9uc31lPW5ldyBBcnJheSh0KTtmb3IobGV0IHU9MDt1PHQ7dSsrKWVbdV09dTtmLm5vcm1hbHM9bmV3IEZsb2F0MzJBcnJheShlLmxlbmd0aCozKTtmb3IobGV0IHU9MDt1PGUubGVuZ3RoO3UrPTMpTlMoZi5ub3JtYWxzLHUsZSxuKTtyZXR1cm4gZn1mdW5jdGlvbiBzOCh0LGUsbixvLHIsaSxzLGYpe2lmKHQ9PT0wfHwhaChuKXx8bi5sZW5ndGg9PT0wKXJldHVybntidWZmZXJzOltdLGJ1ZmZlclZpZXdzOltdLGFjY2Vzc29yczpbXSxtZXNoZXM6W10sbm9kZXM6W10sbm9kZXNJblNjZW5lOltdfTtsZXQgdT1bXSxjPVtdLGw9W10scD1bXSxkPVtdLG09W10sXz17fSxnPVtdO2goZSkmJih0PWUubGVuZ3RoKTtsZXR7aW5kZXhBcnJheTpiLHRyYW5zcGFyZW50VmVydGV4T2Zmc2V0OlR9PVg2KHQsZSxpLGYuc3BsaXRHZW9tZXRyeUJ5Q29sb3JUcmFuc3BhcmVuY3kpLE89bmV3IEJsb2IoW2JdLHt0eXBlOiJhcHBsaWNhdGlvbi9iaW5hcnkifSksRT1VUkwuY3JlYXRlT2JqZWN0VVJMKE8pLHc9dCxDPWYuZW5hYmxlRmVhdHVyZXMmJmgocyk/bmV3IEZsb2F0MzJBcnJheShzLmxlbmd0aCk6dm9pZCAwLE49MDtpZihoKEMpKWZvcihsZXQgdXQ9MDt1dDxzLmxlbmd0aDsrK3V0KXtDW3V0XT1zW3V0XTtsZXQgdnQ9c1t1dF0rMTtOPHZ0JiYoTj12dCl9bGV0IEksRD1vOChmLnN5bWJvbG9neURhdGEscyxiLG4sbyk7aWYoaChEKSl7bGV0IHV0PW5ldyBCbG9iKFtEXSx7dHlwZToiYXBwbGljYXRpb24vYmluYXJ5In0pO0k9VVJMLmNyZWF0ZU9iamVjdFVSTCh1dCl9bGV0IHY9bi5zdWJhcnJheSgwLHcqMyksTD1uZXcgQmxvYihbdl0se3R5cGU6ImFwcGxpY2F0aW9uL2JpbmFyeSJ9KSxVPVVSTC5jcmVhdGVPYmplY3RVUkwoTCksQT1OdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFksUz1OdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFksUD1OdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFksRj1OdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFksaj1OdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFksSD1OdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFk7Zm9yKGxldCB1dD0wO3V0PHYubGVuZ3RoLzM7dXQrKylBPU1hdGgubWluKEEsdlt1dCozKzBdKSxTPU1hdGgubWF4KFMsdlt1dCozKzBdKSxQPU1hdGgubWluKFAsdlt1dCozKzFdKSxGPU1hdGgubWF4KEYsdlt1dCozKzFdKSxqPU1hdGgubWluKGosdlt1dCozKzJdKSxIPU1hdGgubWF4KEgsdlt1dCozKzJdKTtsZXQgaz1vP28uc3ViYXJyYXkoMCx3KjMpOnZvaWQgMCxLO2lmKGgoaykpe2xldCB1dD1uZXcgQmxvYihba10se3R5cGU6ImFwcGxpY2F0aW9uL2JpbmFyeSJ9KTtLPVVSTC5jcmVhdGVPYmplY3RVUkwodXQpfWxldCBYPXI/ci5zdWJhcnJheSgwLHcqMik6dm9pZCAwLFI7aWYoaChYKSl7bGV0IHV0PW5ldyBCbG9iKFtYXSx7dHlwZToiYXBwbGljYXRpb24vYmluYXJ5In0pO1I9VVJMLmNyZWF0ZU9iamVjdFVSTCh1dCl9bGV0IG90PWgoaSk/cjgoaS5zdWJhcnJheSgwLHcqNCkpOnZvaWQgMCxhdDtpZihoKG90KSl7bGV0IHV0PW5ldyBCbG9iKFtvdF0se3R5cGU6ImFwcGxpY2F0aW9uL2JpbmFyeSJ9KTthdD1VUkwuY3JlYXRlT2JqZWN0VVJMKHV0KX1sZXQgcHQ9aChDKT9DLnN1YmFycmF5KDAsdyk6dm9pZCAwLHl0O2lmKGgocHQpKXtsZXQgdXQ9bmV3IEJsb2IoW3B0XSx7dHlwZToiYXBwbGljYXRpb24vYmluYXJ5In0pO3l0PVVSTC5jcmVhdGVPYmplY3RVUkwodXQpfWxldCBydD1oKEMpP25ldyBGbG9hdDMyQXJyYXkoTik6dm9pZCAwLFB0O2lmKGgocnQpKXtmb3IobGV0IHZ0PTA7dnQ8cnQubGVuZ3RoOysrdnQpcnRbdnRdPXZ0O2xldCB1dD1uZXcgQmxvYihbcnRdLHt0eXBlOiJhcHBsaWNhdGlvbi9iaW5hcnkifSk7UHQ9VVJMLmNyZWF0ZU9iamVjdFVSTCh1dCl9bGV0IGd0PXt9LEN0PXt9O2d0LlBPU0lUSU9OPWwubGVuZ3RoLHUucHVzaCh7dXJpOlUsYnl0ZUxlbmd0aDp2LmJ5dGVMZW5ndGh9KSxjLnB1c2goe2J1ZmZlcjp1Lmxlbmd0aC0xLGJ5dGVPZmZzZXQ6MCxieXRlTGVuZ3RoOnYuYnl0ZUxlbmd0aCx0YXJnZXQ6MzQ5NjJ9KSxsLnB1c2goe2J1ZmZlclZpZXc6Yy5sZW5ndGgtMSxieXRlT2Zmc2V0OjAsY29tcG9uZW50VHlwZTo1MTI2LGNvdW50OnYubGVuZ3RoLzMsdHlwZToiVkVDMyIsbWF4OltBLFAsal0sbWluOltTLEYsSF19KSxoKEspJiYoZ3QuTk9STUFMPWwubGVuZ3RoLHUucHVzaCh7dXJpOkssYnl0ZUxlbmd0aDprLmJ5dGVMZW5ndGh9KSxjLnB1c2goe2J1ZmZlcjp1Lmxlbmd0aC0xLGJ5dGVPZmZzZXQ6MCxieXRlTGVuZ3RoOmsuYnl0ZUxlbmd0aCx0YXJnZXQ6MzQ5NjJ9KSxsLnB1c2goe2J1ZmZlclZpZXc6Yy5sZW5ndGgtMSxieXRlT2Zmc2V0OjAsY29tcG9uZW50VHlwZTo1MTI2LGNvdW50OmsubGVuZ3RoLzMsdHlwZToiVkVDMyJ9KSksaChSKSYmKGd0LlRFWENPT1JEXzA9bC5sZW5ndGgsdS5wdXNoKHt1cmk6UixieXRlTGVuZ3RoOlguYnl0ZUxlbmd0aH0pLGMucHVzaCh7YnVmZmVyOnUubGVuZ3RoLTEsYnl0ZU9mZnNldDowLGJ5dGVMZW5ndGg6WC5ieXRlTGVuZ3RoLHRhcmdldDozNDk2Mn0pLGwucHVzaCh7YnVmZmVyVmlldzpjLmxlbmd0aC0xLGJ5dGVPZmZzZXQ6MCxjb21wb25lbnRUeXBlOjUxMjYsY291bnQ6WC5sZW5ndGgvMix0eXBlOiJWRUMyIn0pKSxoKGF0KSYmKGd0LkNPTE9SXzA9bC5sZW5ndGgsdS5wdXNoKHt1cmk6YXQsYnl0ZUxlbmd0aDpvdC5ieXRlTGVuZ3RofSksYy5wdXNoKHtidWZmZXI6dS5sZW5ndGgtMSxieXRlT2Zmc2V0OjAsYnl0ZUxlbmd0aDpvdC5ieXRlTGVuZ3RoLHRhcmdldDozNDk2Mn0pLGwucHVzaCh7YnVmZmVyVmlldzpjLmxlbmd0aC0xLGJ5dGVPZmZzZXQ6MCxjb21wb25lbnRUeXBlOjUxMjYsY291bnQ6b3QubGVuZ3RoLzQsdHlwZToiVkVDNCJ9KSksaCh5dCkmJihndC5fRkVBVFVSRV9JRF8wPWwubGVuZ3RoLHUucHVzaCh7dXJpOnl0LGJ5dGVMZW5ndGg6cHQuYnl0ZUxlbmd0aH0pLGMucHVzaCh7YnVmZmVyOnUubGVuZ3RoLTEsYnl0ZU9mZnNldDowLGJ5dGVMZW5ndGg6cHQuYnl0ZUxlbmd0aCx0YXJnZXQ6MzQ5NjN9KSxsLnB1c2goe2J1ZmZlclZpZXc6Yy5sZW5ndGgtMSxieXRlT2Zmc2V0OjAsY29tcG9uZW50VHlwZTo1MTI2LGNvdW50OnB0Lmxlbmd0aCx0eXBlOiJTQ0FMQVIifSksQ3QuRVhUX21lc2hfZmVhdHVyZXM9e2ZlYXR1cmVJZHM6W3thdHRyaWJ1dGU6MCxwcm9wZXJ0eVRhYmxlOjAsZmVhdHVyZUNvdW50Ok59XX0sZy5wdXNoKCJFWFRfbWVzaF9mZWF0dXJlcyIpKSxoKFB0KSYmKHUucHVzaCh7dXJpOlB0LGJ5dGVMZW5ndGg6cnQuYnl0ZUxlbmd0aH0pLGMucHVzaCh7YnVmZmVyOnUubGVuZ3RoLTEsYnl0ZU9mZnNldDowLGJ5dGVMZW5ndGg6cnQuYnl0ZUxlbmd0aCx0YXJnZXQ6MzQ5NjN9KSxfLkVYVF9zdHJ1Y3R1cmFsX21ldGFkYXRhPXtzY2hlbWE6e2lkOiJpM3MtbWV0YWRhdGEtc2NoZW1hLTAwMSIsbmFtZToiSTNTIG1ldGFkYXRhIHNjaGVtYSAwMDEiLGRlc2NyaXB0aW9uOiJUaGUgc2NoZW1hIGZvciBJM1MgbWV0YWRhdGEiLHZlcnNpb246IjEuMCIsY2xhc3Nlczp7ZmVhdHVyZTp7bmFtZToiZmVhdHVyZSIsZGVzY3JpcHRpb246IkZlYXR1cmUgbWV0YWRhdGEiLHByb3BlcnRpZXM6e2luZGV4OntkZXNjcmlwdGlvbjoiVGhlIGZlYXR1cmUgaW5kZXgiLHR5cGU6IlNDQUxBUiIsY29tcG9uZW50VHlwZToiRkxPQVQzMiIscmVxdWlyZWQ6ITB9fX19fSxwcm9wZXJ0eVRhYmxlczpbe25hbWU6ImZlYXR1cmUtaW5kaWNlcy1tYXBwaW5nIixjbGFzczoiZmVhdHVyZSIsY291bnQ6Tixwcm9wZXJ0aWVzOntpbmRleDp7dmFsdWVzOmMubGVuZ3RoLTF9fX1dfSxnLnB1c2goIkVYVF9zdHJ1Y3R1cmFsX21ldGFkYXRhIikpLGgoSSkmJih1LnB1c2goe3VyaTpJLGJ5dGVMZW5ndGg6RC5ieXRlTGVuZ3RofSksYy5wdXNoKHtidWZmZXI6dS5sZW5ndGgtMSxieXRlT2Zmc2V0OjAsYnl0ZUxlbmd0aDpELmJ5dGVMZW5ndGgsdGFyZ2V0OjM0OTYzfSksbC5wdXNoKHtidWZmZXJWaWV3OmMubGVuZ3RoLTEsYnl0ZU9mZnNldDowLGNvbXBvbmVudFR5cGU6NTEyNSxjb3VudDpELmxlbmd0aCx0eXBlOiJTQ0FMQVIifSksQ3QuQ0VTSVVNX3ByaW1pdGl2ZV9vdXRsaW5lPXtpbmRpY2VzOmwubGVuZ3RoLTF9LGcucHVzaCgiQ0VTSVVNX3ByaW1pdGl2ZV9vdXRsaW5lIikpLHUucHVzaCh7dXJpOkUsYnl0ZUxlbmd0aDpiLmJ5dGVMZW5ndGh9KSxjLnB1c2goe2J1ZmZlcjp1Lmxlbmd0aC0xLGJ5dGVPZmZzZXQ6MCxieXRlTGVuZ3RoOmIuYnl0ZUxlbmd0aCx0YXJnZXQ6MzQ5NjN9KTtsZXQgbXQ9W107cmV0dXJuIFQ+MCYmKGwucHVzaCh7YnVmZmVyVmlldzpjLmxlbmd0aC0xLGJ5dGVPZmZzZXQ6MCxjb21wb25lbnRUeXBlOjUxMjUsY291bnQ6VCx0eXBlOiJTQ0FMQVIifSksbXQucHVzaCh7YXR0cmlidXRlczpndCxpbmRpY2VzOmwubGVuZ3RoLTEsbWF0ZXJpYWw6bXQubGVuZ3RoLGV4dGVuc2lvbnM6Q3R9KSksVDx0JiYobC5wdXNoKHtidWZmZXJWaWV3OmMubGVuZ3RoLTEsYnl0ZU9mZnNldDo0KlQsY29tcG9uZW50VHlwZTo1MTI1LGNvdW50OnQtVCx0eXBlOiJTQ0FMQVIifSksbXQucHVzaCh7YXR0cmlidXRlczpndCxpbmRpY2VzOmwubGVuZ3RoLTEsbWF0ZXJpYWw6bXQubGVuZ3RoLGV4dGVuc2lvbnM6Q3QsZXh0cmE6e2lzVHJhbnNwYXJlbnQ6ITB9fSkpLHAucHVzaCh7cHJpbWl0aXZlczptdH0pLG0ucHVzaCgwKSxkLnB1c2goe21lc2g6MH0pLHtidWZmZXJzOnUsYnVmZmVyVmlld3M6YyxhY2Nlc3NvcnM6bCxtZXNoZXM6cCxub2RlczpkLG5vZGVzSW5TY2VuZTptLHJvb3RFeHRlbnNpb25zOl8sZXh0ZW5zaW9uc1VzZWQ6Z319ZnVuY3Rpb24gYzgodCxlLG4sbyl7bGV0IHI9bmV3IFVpbnQ4QXJyYXkodCwwLDUpO3JldHVybiByWzBdPT09NjgmJnJbMV09PT04MiYmclsyXT09PTY1JiZyWzNdPT09NjcmJnJbNF09PT03OT9hOCh0LG4pOnU4KHQsZSxuLG8pfWZ1bmN0aW9uIGE4KHQpe2xldCBlPVhnLG49bmV3IGUuRGVjb2RlckJ1ZmZlcixvPW5ldyBVaW50OEFycmF5KHQpO24uSW5pdChvLG8ubGVuZ3RoKTtsZXQgcj1uZXcgZS5EZWNvZGVyLGk9ci5HZXRFbmNvZGVkR2VvbWV0cnlUeXBlKG4pLHM9bmV3IGUuTWV0YWRhdGFRdWVyaWVyLGYsdTtpPT09ZS5UUklBTkdVTEFSX01FU0gmJihmPW5ldyBlLk1lc2gsdT1yLkRlY29kZUJ1ZmZlclRvTWVzaChuLGYpKTtsZXQgYz17dmVydGV4Q291bnQ6WzBdLGZlYXR1cmVDb3VudDowfTtpZihoKHUpJiZ1Lm9rKCkmJmYucHRyIT09MCl7bGV0IGw9Zi5udW1fZmFjZXMoKSxwPWYubnVtX2F0dHJpYnV0ZXMoKSxkPWYubnVtX3BvaW50cygpO2MuaW5kaWNlcz1uZXcgVWludDMyQXJyYXkobCozKTtsZXQgbT1jLmluZGljZXM7Yy52ZXJ0ZXhDb3VudFswXT1kLGMuc2NhbGVfeD0xLGMuc2NhbGVfeT0xO2xldCBfPW5ldyBlLkRyYWNvSW50MzJBcnJheSgzKTtmb3IobGV0IGc9MDtnPGw7KytnKXIuR2V0RmFjZUZyb21NZXNoKGYsZyxfKSxtW2cqM109Xy5HZXRWYWx1ZSgwKSxtW2cqMysxXT1fLkdldFZhbHVlKDEpLG1bZyozKzJdPV8uR2V0VmFsdWUoMik7ZS5kZXN0cm95KF8pO2ZvcihsZXQgZz0wO2c8cDsrK2cpe2xldCBiPXIuR2V0QXR0cmlidXRlKGYsZyksVD1mOChlLHIsZixiLGQpLE89Yi5hdHRyaWJ1dGVfdHlwZSgpLEU9InVua25vd24iO089PT1lLlBPU0lUSU9OP0U9InBvc2l0aW9ucyI6Tz09PWUuTk9STUFMP0U9Im5vcm1hbHMiOk89PT1lLkNPTE9SP0U9ImNvbG9ycyI6Tz09PWUuVEVYX0NPT1JEJiYoRT0idXYwcyIpO2xldCB3PXIuR2V0QXR0cmlidXRlTWV0YWRhdGEoZixnKTtpZih3LnB0ciE9PTApe2xldCBDPXMuTnVtRW50cmllcyh3KTtmb3IobGV0IE49MDtOPEM7KytOKXtsZXQgST1zLkdldEVudHJ5TmFtZSh3LE4pO0k9PT0iaTNzLXNjYWxlX3giP2Muc2NhbGVfeD1zLkdldERvdWJsZUVudHJ5KHcsImkzcy1zY2FsZV94Iik6ST09PSJpM3Mtc2NhbGVfeSI/Yy5zY2FsZV95PXMuR2V0RG91YmxlRW50cnkodywiaTNzLXNjYWxlX3kiKTpJPT09Imkzcy1hdHRyaWJ1dGUtdHlwZSImJihFPXMuR2V0U3RyaW5nRW50cnkodywiaTNzLWF0dHJpYnV0ZS10eXBlIikpfX1oKGNbRV0pJiZjb25zb2xlLmxvZygiQXR0cmlidXRlIGFscmVhZHkgZXhpc3RzIixFKSxjW0VdPVQsRT09PSJmZWF0dXJlLWluZGV4IiYmYy5mZWF0dXJlQ291bnQrK31lLmRlc3Ryb3koZil9cmV0dXJuIGUuZGVzdHJveShzKSxlLmRlc3Ryb3kociksY31mdW5jdGlvbiBmOCh0LGUsbixvLHIpe2xldCBpPW8ubnVtX2NvbXBvbmVudHMoKSpyLHMsdT1bZnVuY3Rpb24oKXt9LGZ1bmN0aW9uKCl7cz1uZXcgdC5EcmFjb0ludDhBcnJheShpKSxlLkdldEF0dHJpYnV0ZUludDhGb3JBbGxQb2ludHMobixvLHMpfHxjb25zb2xlLmVycm9yKCJCYWQgc3RyZWFtIik7bGV0IGw9bmV3IEludDhBcnJheShpKTtmb3IobGV0IHA9MDtwPGk7KytwKWxbcF09cy5HZXRWYWx1ZShwKTtyZXR1cm4gbH0sZnVuY3Rpb24oKXtzPW5ldyB0LkRyYWNvSW50OEFycmF5KGkpLGUuR2V0QXR0cmlidXRlVUludDhGb3JBbGxQb2ludHMobixvLHMpfHxjb25zb2xlLmVycm9yKCJCYWQgc3RyZWFtIik7bGV0IGw9bmV3IFVpbnQ4QXJyYXkoaSk7Zm9yKGxldCBwPTA7cDxpOysrcClsW3BdPXMuR2V0VmFsdWUocCk7cmV0dXJuIGx9LGZ1bmN0aW9uKCl7cz1uZXcgdC5EcmFjb0ludDE2QXJyYXkoaSksZS5HZXRBdHRyaWJ1dGVJbnQxNkZvckFsbFBvaW50cyhuLG8scyl8fGNvbnNvbGUuZXJyb3IoIkJhZCBzdHJlYW0iKTtsZXQgbD1uZXcgSW50MTZBcnJheShpKTtmb3IobGV0IHA9MDtwPGk7KytwKWxbcF09cy5HZXRWYWx1ZShwKTtyZXR1cm4gbH0sZnVuY3Rpb24oKXtzPW5ldyB0LkRyYWNvSW50MTZBcnJheShpKSxlLkdldEF0dHJpYnV0ZVVJbnQxNkZvckFsbFBvaW50cyhuLG8scyl8fGNvbnNvbGUuZXJyb3IoIkJhZCBzdHJlYW0iKTtsZXQgbD1uZXcgVWludDE2QXJyYXkoaSk7Zm9yKGxldCBwPTA7cDxpOysrcClsW3BdPXMuR2V0VmFsdWUocCk7cmV0dXJuIGx9LGZ1bmN0aW9uKCl7cz1uZXcgdC5EcmFjb0ludDMyQXJyYXkoaSksZS5HZXRBdHRyaWJ1dGVJbnQzMkZvckFsbFBvaW50cyhuLG8scyl8fGNvbnNvbGUuZXJyb3IoIkJhZCBzdHJlYW0iKTtsZXQgbD1uZXcgSW50MzJBcnJheShpKTtmb3IobGV0IHA9MDtwPGk7KytwKWxbcF09cy5HZXRWYWx1ZShwKTtyZXR1cm4gbH0sZnVuY3Rpb24oKXtzPW5ldyB0LkRyYWNvSW50MzJBcnJheShpKSxlLkdldEF0dHJpYnV0ZVVJbnQzMkZvckFsbFBvaW50cyhuLG8scyl8fGNvbnNvbGUuZXJyb3IoIkJhZCBzdHJlYW0iKTtsZXQgbD1uZXcgVWludDMyQXJyYXkoaSk7Zm9yKGxldCBwPTA7cDxpOysrcClsW3BdPXMuR2V0VmFsdWUocCk7cmV0dXJuIGx9LGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sZnVuY3Rpb24oKXtzPW5ldyB0LkRyYWNvRmxvYXQzMkFycmF5KGkpLGUuR2V0QXR0cmlidXRlRmxvYXRGb3JBbGxQb2ludHMobixvLHMpfHxjb25zb2xlLmVycm9yKCJCYWQgc3RyZWFtIik7bGV0IGw9bmV3IEZsb2F0MzJBcnJheShpKTtmb3IobGV0IHA9MDtwPGk7KytwKWxbcF09cy5HZXRWYWx1ZShwKTtyZXR1cm4gbH0sZnVuY3Rpb24oKXt9LGZ1bmN0aW9uKCl7cz1uZXcgdC5EcmFjb1VJbnQ4QXJyYXkoaSksZS5HZXRBdHRyaWJ1dGVVSW50OEZvckFsbFBvaW50cyhuLG8scyl8fGNvbnNvbGUuZXJyb3IoIkJhZCBzdHJlYW0iKTtsZXQgbD1uZXcgVWludDhBcnJheShpKTtmb3IobGV0IHA9MDtwPGk7KytwKWxbcF09cy5HZXRWYWx1ZShwKTtyZXR1cm4gbH1dW28uZGF0YV90eXBlKCldKCk7cmV0dXJuIGgocykmJnQuZGVzdHJveShzKSx1fWZ1bmN0aW9uIHU4KHQsZSxuLG8pe2xldCByPXt2ZXJ0ZXhDb3VudDowfSxpPW5ldyBEYXRhVmlldyh0KTt0cnl7bGV0IHM9MDtpZihyLnZlcnRleENvdW50PWkuZ2V0VWludDMyKHMsMSkscys9NCxyLmZlYXR1cmVDb3VudD1pLmdldFVpbnQzMihzLDEpLHMrPTQsaChuKSlmb3IobGV0IGY9MDtmPG4uYXR0cmlidXRlcy5sZW5ndGg7ZisrKWgoX21bbi5hdHRyaWJ1dGVzW2ZdXSk/cz1fbVtuLmF0dHJpYnV0ZXNbZl1dKHIsdCxzKTpjb25zb2xlLmVycm9yKCJVbmtub3duIGRlY29kZXIgZm9yIixuLmF0dHJpYnV0ZXNbZl0pO2Vsc2V7bGV0IGY9ZS5vcmRlcmluZyx1PWUuZmVhdHVyZUF0dHJpYnV0ZU9yZGVyO2gobykmJmgoby5nZW9tZXRyeURhdGEpJiZoKG8uZ2VvbWV0cnlEYXRhWzBdKSYmaChvLmdlb21ldHJ5RGF0YVswXS5wYXJhbXMpJiYoZj1PYmplY3Qua2V5cyhvLmdlb21ldHJ5RGF0YVswXS5wYXJhbXMudmVydGV4QXR0cmlidXRlcyksdT1PYmplY3Qua2V5cyhvLmdlb21ldHJ5RGF0YVswXS5wYXJhbXMuZmVhdHVyZUF0dHJpYnV0ZXMpKTtmb3IobGV0IGM9MDtjPGYubGVuZ3RoO2MrKyl7bGV0IGw9X21bZltjXV07cz1sKHIsdCxzKX1mb3IobGV0IGM9MDtjPHUubGVuZ3RoO2MrKyl7bGV0IGw9X21bdVtjXV07cz1sKHIsdCxzKX19fWNhdGNoKHMpe2NvbnNvbGUuZXJyb3Iocyl9cmV0dXJuIHIuc2NhbGVfeD0xLHIuc2NhbGVfeT0xLHJ9ZnVuY3Rpb24gbDgodCl7bGV0IGU9YzgodC5iaW5hcnlEYXRhLHQuc2NoZW1hLHQuYnVmZmVySW5mbyx0LmZlYXR1cmVEYXRhKTtoKHQuZ2VvaWREYXRhTGlzdCkmJnQuZ2VvaWREYXRhTGlzdC5sZW5ndGg+MCYmcTYoZS52ZXJ0ZXhDb3VudCxlLnBvc2l0aW9ucyxlLnNjYWxlX3gsZS5zY2FsZV95LHQuY2FydG9ncmFwaGljQ2VudGVyLHQuZ2VvaWREYXRhTGlzdCwhMSksSzYoZS52ZXJ0ZXhDb3VudCxlLnBvc2l0aW9ucyxlLm5vcm1hbHMsdC5jYXJ0b2dyYXBoaWNDZW50ZXIsdC5jYXJ0ZXNpYW5DZW50ZXIsdC5wYXJlbnRSb3RhdGlvbix0LmVsbGlwc29pZFJhZGlpU3F1YXJlLGUuc2NhbGVfeCxlLnNjYWxlX3kpLGgoZS51djBzKSYmaChlWyJ1di1yZWdpb24iXSkmJlc2KGUudmVydGV4Q291bnQsZS51djBzLGVbInV2LXJlZ2lvbiJdKTtsZXQgbjtpZihoKGVbImZlYXR1cmUtaW5kZXgiXSkpbj1lWyJmZWF0dXJlLWluZGV4Il07ZWxzZSBpZihoKGUuZmFjZVJhbmdlKSl7bj1uZXcgQXJyYXkoZS52ZXJ0ZXhDb3VudCk7Zm9yKGxldCBzPTA7czxlLmZhY2VSYW5nZS5sZW5ndGgtMTtzKz0yKXtsZXQgZj1zLzIsdT1lLmZhY2VSYW5nZVtzXSxjPWUuZmFjZVJhbmdlW3MrMV07Zm9yKGxldCBsPXU7bDw9YztsKyspbltsKjNdPWYsbltsKjMrMV09ZixuW2wqMysyXT1mfX1pZih0LmNhbGN1bGF0ZU5vcm1hbHMpe2xldCBzPWk4KGUudmVydGV4Q291bnQsZS5pbmRpY2VzLGUucG9zaXRpb25zLGUubm9ybWFscyxlLnV2MHMsZS5jb2xvcnMsbik7aChzLm5vcm1hbHMpJiYoZS5ub3JtYWxzPXMubm9ybWFscyxoKHMudmVydGV4Q291bnQpJiYoZS52ZXJ0ZXhDb3VudD1zLnZlcnRleENvdW50LGUuaW5kaWNlcz1zLmluZGljZXMsZS5wb3NpdGlvbnM9cy5wb3NpdGlvbnMsZS51djBzPXMudXYwcyxlLmNvbG9ycz1zLmNvbG9ycyxuPXMuZmVhdHVyZUluZGV4KSl9bGV0IG89czgoZS52ZXJ0ZXhDb3VudCxlLmluZGljZXMsZS5wb3NpdGlvbnMsZS5ub3JtYWxzLGUudXYwcyxlLmNvbG9ycyxuLHQpLHI9e3Bvc2l0aW9uczplLnBvc2l0aW9ucyxpbmRpY2VzOmUuaW5kaWNlcyxmZWF0dXJlSW5kZXg6bixzb3VyY2VVUkw6dC51cmwsY2FydGVzaWFuQ2VudGVyOnQuY2FydGVzaWFuQ2VudGVyLHBhcmVudFJvdGF0aW9uOnQucGFyZW50Um90YXRpb259O3JldHVybiBvLl9jdXN0b21BdHRyaWJ1dGVzPXIse21lc2hEYXRhOm99fWFzeW5jIGZ1bmN0aW9uIHA4KHQsZSl7bGV0IG49dC53ZWJBc3NlbWJseUNvbmZpZztyZXR1cm4gaChuKSYmaChuLndhc21CaW5hcnlGaWxlKT9YZz1hd2FpdCgwLFdnLmRlZmF1bHQpKG4pOlhnPWF3YWl0KDAsV2cuZGVmYXVsdCkoKSwhMH1mdW5jdGlvbiBkOCh0LGUpe2xldCBuPXQud2ViQXNzZW1ibHlDb25maWc7cmV0dXJuIGgobik/cDgodCxlKTpsOCh0LGUpfXZhciBXZyxYZyxBaSxkbSxtbSxobSxLZyxfbSxtOCwkZz1aKCgpPT57c28oKTtJdCgpO2Z0KCk7aWMoKTtadCgpO0llKCk7RnQoKTtQYSgpO0JuKCk7V3QoKTtXZz1kcihSZygpLDEpO1BTKCk7QWk9bmV3IGEsZG09bmV3IGEsbW09bmV3IGE7aG09bmV3IGEsS2c9bmV3IGE7X209e3Bvc2l0aW9uOmZ1bmN0aW9uKHQsZSxuKXtsZXQgbz10LnZlcnRleENvdW50KjM7cmV0dXJuIHQucG9zaXRpb25zPW5ldyBGbG9hdDMyQXJyYXkoZSxuLG8pLG4rPW8qNCxufSxub3JtYWw6ZnVuY3Rpb24odCxlLG4pe2xldCBvPXQudmVydGV4Q291bnQqMztyZXR1cm4gdC5ub3JtYWxzPW5ldyBGbG9hdDMyQXJyYXkoZSxuLG8pLG4rPW8qNCxufSx1djA6ZnVuY3Rpb24odCxlLG4pe2xldCBvPXQudmVydGV4Q291bnQqMjtyZXR1cm4gdC51djBzPW5ldyBGbG9hdDMyQXJyYXkoZSxuLG8pLG4rPW8qNCxufSxjb2xvcjpmdW5jdGlvbih0LGUsbil7bGV0IG89dC52ZXJ0ZXhDb3VudCo0O3JldHVybiB0LmNvbG9ycz1uZXcgVWludDhBcnJheShlLG4sbyksbis9byxufSxmZWF0dXJlSWQ6ZnVuY3Rpb24odCxlLG4pe2xldCBvPXQuZmVhdHVyZUNvdW50O3JldHVybiBuKz1vKjgsbn0saWQ6ZnVuY3Rpb24odCxlLG4pe2xldCBvPXQuZmVhdHVyZUNvdW50O3JldHVybiBuKz1vKjgsbn0sZmFjZVJhbmdlOmZ1bmN0aW9uKHQsZSxuKXtsZXQgbz10LmZlYXR1cmVDb3VudCoyO3JldHVybiB0LmZhY2VSYW5nZT1uZXcgVWludDMyQXJyYXkoZSxuLG8pLG4rPW8qNCxufSx1dlJlZ2lvbjpmdW5jdGlvbih0LGUsbil7bGV0IG89dC52ZXJ0ZXhDb3VudCo0O3JldHVybiB0WyJ1di1yZWdpb24iXT1uZXcgVWludDE2QXJyYXkoZSxuLG8pLG4rPW8qMixufSxyZWdpb246ZnVuY3Rpb24odCxlLG4pe2xldCBvPXQudmVydGV4Q291bnQqNDtyZXR1cm4gdFsidXYtcmVnaW9uIl09bmV3IFVpbnQxNkFycmF5KGUsbixvKSxuKz1vKjIsbn19O204PVFlKGQ4KX0pO3ZhciBTZSxucixaZz1aKCgpPT57JHMoKTtTZT17VU5TSUdORURfQllURTpxdC5VTlNJR05FRF9CWVRFLFVOU0lHTkVEX1NIT1JUOnF0LlVOU0lHTkVEX1NIT1JULFVOU0lHTkVEX0lOVDpxdC5VTlNJR05FRF9JTlQsRkxPQVQ6cXQuRkxPQVQsSEFMRl9GTE9BVDpxdC5IQUxGX0ZMT0FUX09FUyxVTlNJR05FRF9JTlRfMjRfODpxdC5VTlNJR05FRF9JTlRfMjRfOCxVTlNJR05FRF9TSE9SVF80XzRfNF80OnF0LlVOU0lHTkVEX1NIT1JUXzRfNF80XzQsVU5TSUdORURfU0hPUlRfNV81XzVfMTpxdC5VTlNJR05FRF9TSE9SVF81XzVfNV8xLFVOU0lHTkVEX1NIT1JUXzVfNl81OnF0LlVOU0lHTkVEX1NIT1JUXzVfNl81fTtTZS50b1dlYkdMQ29uc3RhbnQ9ZnVuY3Rpb24odCxlKXtzd2l0Y2godCl7Y2FzZSBTZS5VTlNJR05FRF9CWVRFOnJldHVybiBxdC5VTlNJR05FRF9CWVRFO2Nhc2UgU2UuVU5TSUdORURfU0hPUlQ6cmV0dXJuIHF0LlVOU0lHTkVEX1NIT1JUO2Nhc2UgU2UuVU5TSUdORURfSU5UOnJldHVybiBxdC5VTlNJR05FRF9JTlQ7Y2FzZSBTZS5GTE9BVDpyZXR1cm4gcXQuRkxPQVQ7Y2FzZSBTZS5IQUxGX0ZMT0FUOnJldHVybiBlLndlYmdsMj9xdC5IQUxGX0ZMT0FUOnF0LkhBTEZfRkxPQVRfT0VTO2Nhc2UgU2UuVU5TSUdORURfSU5UXzI0Xzg6cmV0dXJuIHF0LlVOU0lHTkVEX0lOVF8yNF84O2Nhc2UgU2UuVU5TSUdORURfU0hPUlRfNF80XzRfNDpyZXR1cm4gcXQuVU5TSUdORURfU0hPUlRfNF80XzRfNDtjYXNlIFNlLlVOU0lHTkVEX1NIT1JUXzVfNV81XzE6cmV0dXJuIHF0LlVOU0lHTkVEX1NIT1JUXzVfNV81XzE7Y2FzZSBTZS5VTlNJR05FRF9TSE9SVF81XzZfNTpyZXR1cm4gU2UuVU5TSUdORURfU0hPUlRfNV82XzV9fTtTZS5pc1BhY2tlZD1mdW5jdGlvbih0KXtyZXR1cm4gdD09PVNlLlVOU0lHTkVEX0lOVF8yNF84fHx0PT09U2UuVU5TSUdORURfU0hPUlRfNF80XzRfNHx8dD09PVNlLlVOU0lHTkVEX1NIT1JUXzVfNV81XzF8fHQ9PT1TZS5VTlNJR05FRF9TSE9SVF81XzZfNX07U2Uuc2l6ZUluQnl0ZXM9ZnVuY3Rpb24odCl7c3dpdGNoKHQpe2Nhc2UgU2UuVU5TSUdORURfQllURTpyZXR1cm4gMTtjYXNlIFNlLlVOU0lHTkVEX1NIT1JUOmNhc2UgU2UuVU5TSUdORURfU0hPUlRfNF80XzRfNDpjYXNlIFNlLlVOU0lHTkVEX1NIT1JUXzVfNV81XzE6Y2FzZSBTZS5VTlNJR05FRF9TSE9SVF81XzZfNTpjYXNlIFNlLkhBTEZfRkxPQVQ6cmV0dXJuIDI7Y2FzZSBTZS5VTlNJR05FRF9JTlQ6Y2FzZSBTZS5GTE9BVDpjYXNlIFNlLlVOU0lHTkVEX0lOVF8yNF84OnJldHVybiA0fX07U2UudmFsaWRhdGU9ZnVuY3Rpb24odCl7cmV0dXJuIHQ9PT1TZS5VTlNJR05FRF9CWVRFfHx0PT09U2UuVU5TSUdORURfU0hPUlR8fHQ9PT1TZS5VTlNJR05FRF9JTlR8fHQ9PT1TZS5GTE9BVHx8dD09PVNlLkhBTEZfRkxPQVR8fHQ9PT1TZS5VTlNJR05FRF9JTlRfMjRfOHx8dD09PVNlLlVOU0lHTkVEX1NIT1JUXzRfNF80XzR8fHQ9PT1TZS5VTlNJR05FRF9TSE9SVF81XzVfNV8xfHx0PT09U2UuVU5TSUdORURfU0hPUlRfNV82XzV9O1NlLmdldFR5cGVkQXJyYXlDb25zdHJ1Y3Rvcj1mdW5jdGlvbih0KXtsZXQgZT1TZS5zaXplSW5CeXRlcyh0KTtyZXR1cm4gZT09PVVpbnQ4QXJyYXkuQllURVNfUEVSX0VMRU1FTlQ/VWludDhBcnJheTplPT09VWludDE2QXJyYXkuQllURVNfUEVSX0VMRU1FTlQ/VWludDE2QXJyYXk6ZT09PUZsb2F0MzJBcnJheS5CWVRFU19QRVJfRUxFTUVOVCYmdD09PVNlLkZMT0FUP0Zsb2F0MzJBcnJheTpVaW50MzJBcnJheX07bnI9T2JqZWN0LmZyZWV6ZShTZSl9KTt2YXIgUnQsVm4sSVM9WigoKT0+e1pnKCk7JHMoKTtSdD17REVQVEhfQ09NUE9ORU5UOnF0LkRFUFRIX0NPTVBPTkVOVCxERVBUSF9TVEVOQ0lMOnF0LkRFUFRIX1NURU5DSUwsQUxQSEE6cXQuQUxQSEEsUkVEOnF0LlJFRCxSOnF0LlJFRCxSRzpxdC5SRyxSR0I6cXQuUkdCLFJHQkE6cXQuUkdCQSxMVU1JTkFOQ0U6cXQuTFVNSU5BTkNFLExVTUlOQU5DRV9BTFBIQTpxdC5MVU1JTkFOQ0VfQUxQSEEsUkdCX0RYVDE6cXQuQ09NUFJFU1NFRF9SR0JfUzNUQ19EWFQxX0VYVCxSR0JBX0RYVDE6cXQuQ09NUFJFU1NFRF9SR0JBX1MzVENfRFhUMV9FWFQsUkdCQV9EWFQzOnF0LkNPTVBSRVNTRURfUkdCQV9TM1RDX0RYVDNfRVhULFJHQkFfRFhUNTpxdC5DT01QUkVTU0VEX1JHQkFfUzNUQ19EWFQ1X0VYVCxSR0JfUFZSVENfNEJQUFYxOnF0LkNPTVBSRVNTRURfUkdCX1BWUlRDXzRCUFBWMV9JTUcsUkdCX1BWUlRDXzJCUFBWMTpxdC5DT01QUkVTU0VEX1JHQl9QVlJUQ18yQlBQVjFfSU1HLFJHQkFfUFZSVENfNEJQUFYxOnF0LkNPTVBSRVNTRURfUkdCQV9QVlJUQ180QlBQVjFfSU1HLFJHQkFfUFZSVENfMkJQUFYxOnF0LkNPTVBSRVNTRURfUkdCQV9QVlJUQ18yQlBQVjFfSU1HLFJHQkFfQVNUQzpxdC5DT01QUkVTU0VEX1JHQkFfQVNUQ180eDRfV0VCR0wsUkdCX0VUQzE6cXQuQ09NUFJFU1NFRF9SR0JfRVRDMV9XRUJHTCxSR0I4X0VUQzI6cXQuQ09NUFJFU1NFRF9SR0I4X0VUQzIsUkdCQThfRVRDMl9FQUM6cXQuQ09NUFJFU1NFRF9SR0JBOF9FVEMyX0VBQyxSR0JBX0JDNzpxdC5DT01QUkVTU0VEX1JHQkFfQlBUQ19VTk9STX07UnQuY29tcG9uZW50c0xlbmd0aD1mdW5jdGlvbih0KXtzd2l0Y2godCl7Y2FzZSBSdC5SR0I6cmV0dXJuIDM7Y2FzZSBSdC5SR0JBOnJldHVybiA0O2Nhc2UgUnQuTFVNSU5BTkNFX0FMUEhBOmNhc2UgUnQuUkc6cmV0dXJuIDI7Y2FzZSBSdC5BTFBIQTpjYXNlIFJ0LlJFRDpjYXNlIFJ0LkxVTUlOQU5DRTpyZXR1cm4gMTtjYXNlIFJ0LlI6cmV0dXJuIDQ7ZGVmYXVsdDpyZXR1cm4gMX19O1J0LnZhbGlkYXRlPWZ1bmN0aW9uKHQpe3JldHVybiB0PT09UnQuREVQVEhfQ09NUE9ORU5UfHx0PT09UnQuREVQVEhfU1RFTkNJTHx8dD09PVJ0LkFMUEhBfHx0PT09UnQuUkVEfHx0PT09UnQuUkd8fHQ9PT1SdC5SR0J8fHQ9PT1SdC5SR0JBfHx0PT09UnQuTFVNSU5BTkNFfHx0PT09UnQuTFVNSU5BTkNFX0FMUEhBfHx0PT09UnQuUkdCX0RYVDF8fHQ9PT1SdC5SR0JBX0RYVDF8fHQ9PT1SdC5SR0JBX0RYVDN8fHQ9PT1SdC5SR0JBX0RYVDV8fHQ9PT1SdC5SR0JfUFZSVENfNEJQUFYxfHx0PT09UnQuUkdCX1BWUlRDXzJCUFBWMXx8dD09PVJ0LlJHQkFfUFZSVENfNEJQUFYxfHx0PT09UnQuUkdCQV9QVlJUQ18yQlBQVjF8fHQ9PT1SdC5SR0JBX0FTVEN8fHQ9PT1SdC5SR0JfRVRDMXx8dD09PVJ0LlJHQjhfRVRDMnx8dD09PVJ0LlJHQkE4X0VUQzJfRUFDfHx0PT09UnQuUkdCQV9CQzd8fHQ9PT1SdC5SfTtSdC5pc0NvbG9yRm9ybWF0PWZ1bmN0aW9uKHQpe3JldHVybiB0PT09UnQuUkVEfHx0PT09UnQuQUxQSEF8fHQ9PT1SdC5SR0J8fHQ9PT1SdC5SR0JBfHx0PT09UnQuTFVNSU5BTkNFfHx0PT09UnQuTFVNSU5BTkNFX0FMUEhBfHx0PT09UnQuUn07UnQuaXNEZXB0aEZvcm1hdD1mdW5jdGlvbih0KXtyZXR1cm4gdD09PVJ0LkRFUFRIX0NPTVBPTkVOVHx8dD09PVJ0LkRFUFRIX1NURU5DSUx9O1J0LmlzQ29tcHJlc3NlZEZvcm1hdD1mdW5jdGlvbih0KXtyZXR1cm4gdD09PVJ0LlJHQl9EWFQxfHx0PT09UnQuUkdCQV9EWFQxfHx0PT09UnQuUkdCQV9EWFQzfHx0PT09UnQuUkdCQV9EWFQ1fHx0PT09UnQuUkdCX1BWUlRDXzRCUFBWMXx8dD09PVJ0LlJHQl9QVlJUQ18yQlBQVjF8fHQ9PT1SdC5SR0JBX1BWUlRDXzRCUFBWMXx8dD09PVJ0LlJHQkFfUFZSVENfMkJQUFYxfHx0PT09UnQuUkdCQV9BU1RDfHx0PT09UnQuUkdCX0VUQzF8fHQ9PT1SdC5SR0I4X0VUQzJ8fHQ9PT1SdC5SR0JBOF9FVEMyX0VBQ3x8dD09PVJ0LlJHQkFfQkM3fTtSdC5pc0RYVEZvcm1hdD1mdW5jdGlvbih0KXtyZXR1cm4gdD09PVJ0LlJHQl9EWFQxfHx0PT09UnQuUkdCQV9EWFQxfHx0PT09UnQuUkdCQV9EWFQzfHx0PT09UnQuUkdCQV9EWFQ1fTtSdC5pc1BWUlRDRm9ybWF0PWZ1bmN0aW9uKHQpe3JldHVybiB0PT09UnQuUkdCX1BWUlRDXzRCUFBWMXx8dD09PVJ0LlJHQl9QVlJUQ18yQlBQVjF8fHQ9PT1SdC5SR0JBX1BWUlRDXzRCUFBWMXx8dD09PVJ0LlJHQkFfUFZSVENfMkJQUFYxfTtSdC5pc0FTVENGb3JtYXQ9ZnVuY3Rpb24odCl7cmV0dXJuIHQ9PT1SdC5SR0JBX0FTVEN9O1J0LmlzRVRDMUZvcm1hdD1mdW5jdGlvbih0KXtyZXR1cm4gdD09PVJ0LlJHQl9FVEMxfTtSdC5pc0VUQzJGb3JtYXQ9ZnVuY3Rpb24odCl7cmV0dXJuIHQ9PT1SdC5SR0I4X0VUQzJ8fHQ9PT1SdC5SR0JBOF9FVEMyX0VBQ307UnQuaXNCQzdGb3JtYXQ9ZnVuY3Rpb24odCl7cmV0dXJuIHQ9PT1SdC5SR0JBX0JDN307UnQuY29tcHJlc3NlZFRleHR1cmVTaXplSW5CeXRlcz1mdW5jdGlvbih0LGUsbil7c3dpdGNoKHQpe2Nhc2UgUnQuUkdCX0RYVDE6Y2FzZSBSdC5SR0JBX0RYVDE6Y2FzZSBSdC5SR0JfRVRDMTpjYXNlIFJ0LlJHQjhfRVRDMjpyZXR1cm4gTWF0aC5mbG9vcigoZSszKS80KSpNYXRoLmZsb29yKChuKzMpLzQpKjg7Y2FzZSBSdC5SR0JBX0RYVDM6Y2FzZSBSdC5SR0JBX0RYVDU6Y2FzZSBSdC5SR0JBX0FTVEM6Y2FzZSBSdC5SR0JBOF9FVEMyX0VBQzpyZXR1cm4gTWF0aC5mbG9vcigoZSszKS80KSpNYXRoLmZsb29yKChuKzMpLzQpKjE2O2Nhc2UgUnQuUkdCX1BWUlRDXzRCUFBWMTpjYXNlIFJ0LlJHQkFfUFZSVENfNEJQUFYxOnJldHVybiBNYXRoLmZsb29yKChNYXRoLm1heChlLDgpKk1hdGgubWF4KG4sOCkqNCs3KS84KTtjYXNlIFJ0LlJHQl9QVlJUQ18yQlBQVjE6Y2FzZSBSdC5SR0JBX1BWUlRDXzJCUFBWMTpyZXR1cm4gTWF0aC5mbG9vcigoTWF0aC5tYXgoZSwxNikqTWF0aC5tYXgobiw4KSoyKzcpLzgpO2Nhc2UgUnQuUkdCQV9CQzc6cmV0dXJuIE1hdGguY2VpbChlLzQpKk1hdGguY2VpbChuLzQpKjE2O2RlZmF1bHQ6cmV0dXJuIDB9fTtSdC50ZXh0dXJlU2l6ZUluQnl0ZXM9ZnVuY3Rpb24odCxlLG4sbyl7bGV0IHI9UnQuY29tcG9uZW50c0xlbmd0aCh0KTtyZXR1cm4gbnIuaXNQYWNrZWQoZSkmJihyPTEpLHIqbnIuc2l6ZUluQnl0ZXMoZSkqbipvfTtSdC5hbGlnbm1lbnRJbkJ5dGVzPWZ1bmN0aW9uKHQsZSxuKXtsZXQgbz1SdC50ZXh0dXJlU2l6ZUluQnl0ZXModCxlLG4sMSklNDtyZXR1cm4gbz09PTA/NDpvPT09Mj8yOjF9O1J0LmNyZWF0ZVR5cGVkQXJyYXk9ZnVuY3Rpb24odCxlLG4sbyl7bGV0IHI9bnIuZ2V0VHlwZWRBcnJheUNvbnN0cnVjdG9yKGUpLGk9UnQuY29tcG9uZW50c0xlbmd0aCh0KSpuKm87cmV0dXJuIG5ldyByKGkpfTtSdC5mbGlwWT1mdW5jdGlvbih0LGUsbixvLHIpe2lmKHI9PT0xKXJldHVybiB0O2xldCBpPVJ0LmNyZWF0ZVR5cGVkQXJyYXkoZSxuLG8scikscz1SdC5jb21wb25lbnRzTGVuZ3RoKGUpLGY9bypzO2ZvcihsZXQgdT0wO3U8cjsrK3Upe2xldCBjPXUqbypzLGw9KHItdS0xKSpvKnM7Zm9yKGxldCBwPTA7cDxmOysrcClpW2wrcF09dFtjK3BdfXJldHVybiBpfTtSdC50b0ludGVybmFsRm9ybWF0PWZ1bmN0aW9uKHQsZSxuKXtpZighbi53ZWJnbDIpcmV0dXJuIHQ7aWYodD09PVJ0LkRFUFRIX1NURU5DSUwpcmV0dXJuIHF0LkRFUFRIMjRfU1RFTkNJTDg7aWYodD09PVJ0LkRFUFRIX0NPTVBPTkVOVCl7aWYoZT09PW5yLlVOU0lHTkVEX1NIT1JUKXJldHVybiBxdC5ERVBUSF9DT01QT05FTlQxNjtpZihlPT09bnIuVU5TSUdORURfSU5UKXJldHVybiBxdC5ERVBUSF9DT01QT05FTlQyNH1pZihlPT09bnIuRkxPQVQpc3dpdGNoKHQpe2Nhc2UgUnQuUkdCQTpyZXR1cm4gcXQuUkdCQTMyRjtjYXNlIFJ0LlJHQjpyZXR1cm4gcXQuUkdCMzJGO2Nhc2UgUnQuUkc6cmV0dXJuIHF0LlJHMzJGO2Nhc2UgUnQuUkVEOmNhc2UgUnQuUjpyZXR1cm4gcXQuUjMyRn1pZihlPT09bnIuSEFMRl9GTE9BVClzd2l0Y2godCl7Y2FzZSBSdC5SR0JBOnJldHVybiBxdC5SR0JBMTZGO2Nhc2UgUnQuUkdCOnJldHVybiBxdC5SR0IxNkY7Y2FzZSBSdC5SRzpyZXR1cm4gcXQuUkcxNkY7Y2FzZSBSdC5SRUQ6Y2FzZSBSdC5SOnJldHVybiBxdC5SMTZGfXJldHVybiB0fTtWbj1PYmplY3QuZnJlZXplKFJ0KX0pO3ZhciBoOCx5dSx2Uz1aKCgpPT57aDg9e1ZLX0ZPUk1BVF9VTkRFRklORUQ6MCxWS19GT1JNQVRfUjRHNF9VTk9STV9QQUNLODoxLFZLX0ZPUk1BVF9SNEc0QjRBNF9VTk9STV9QQUNLMTY6MixWS19GT1JNQVRfQjRHNFI0QTRfVU5PUk1fUEFDSzE2OjMsVktfRk9STUFUX1I1RzZCNV9VTk9STV9QQUNLMTY6NCxWS19GT1JNQVRfQjVHNlI1X1VOT1JNX1BBQ0sxNjo1LFZLX0ZPUk1BVF9SNUc1QjVBMV9VTk9STV9QQUNLMTY6NixWS19GT1JNQVRfQjVHNVI1QTFfVU5PUk1fUEFDSzE2OjcsVktfRk9STUFUX0ExUjVHNUI1X1VOT1JNX1BBQ0sxNjo4LFZLX0ZPUk1BVF9SOF9VTk9STTo5LFZLX0ZPUk1BVF9SOF9TTk9STToxMCxWS19GT1JNQVRfUjhfVVNDQUxFRDoxMSxWS19GT1JNQVRfUjhfU1NDQUxFRDoxMixWS19GT1JNQVRfUjhfVUlOVDoxMyxWS19GT1JNQVRfUjhfU0lOVDoxNCxWS19GT1JNQVRfUjhfU1JHQjoxNSxWS19GT1JNQVRfUjhHOF9VTk9STToxNixWS19GT1JNQVRfUjhHOF9TTk9STToxNyxWS19GT1JNQVRfUjhHOF9VU0NBTEVEOjE4LFZLX0ZPUk1BVF9SOEc4X1NTQ0FMRUQ6MTksVktfRk9STUFUX1I4RzhfVUlOVDoyMCxWS19GT1JNQVRfUjhHOF9TSU5UOjIxLFZLX0ZPUk1BVF9SOEc4X1NSR0I6MjIsVktfRk9STUFUX1I4RzhCOF9VTk9STToyMyxWS19GT1JNQVRfUjhHOEI4X1NOT1JNOjI0LFZLX0ZPUk1BVF9SOEc4QjhfVVNDQUxFRDoyNSxWS19GT1JNQVRfUjhHOEI4X1NTQ0FMRUQ6MjYsVktfRk9STUFUX1I4RzhCOF9VSU5UOjI3LFZLX0ZPUk1BVF9SOEc4QjhfU0lOVDoyOCxWS19GT1JNQVRfUjhHOEI4X1NSR0I6MjksVktfRk9STUFUX0I4RzhSOF9VTk9STTozMCxWS19GT1JNQVRfQjhHOFI4X1NOT1JNOjMxLFZLX0ZPUk1BVF9COEc4UjhfVVNDQUxFRDozMixWS19GT1JNQVRfQjhHOFI4X1NTQ0FMRUQ6MzMsVktfRk9STUFUX0I4RzhSOF9VSU5UOjM0LFZLX0ZPUk1BVF9COEc4UjhfU0lOVDozNSxWS19GT1JNQVRfQjhHOFI4X1NSR0I6MzYsVktfRk9STUFUX1I4RzhCOEE4X1VOT1JNOjM3LFZLX0ZPUk1BVF9SOEc4QjhBOF9TTk9STTozOCxWS19GT1JNQVRfUjhHOEI4QThfVVNDQUxFRDozOSxWS19GT1JNQVRfUjhHOEI4QThfU1NDQUxFRDo0MCxWS19GT1JNQVRfUjhHOEI4QThfVUlOVDo0MSxWS19GT1JNQVRfUjhHOEI4QThfU0lOVDo0MixWS19GT1JNQVRfUjhHOEI4QThfU1JHQjo0MyxWS19GT1JNQVRfQjhHOFI4QThfVU5PUk06NDQsVktfRk9STUFUX0I4RzhSOEE4X1NOT1JNOjQ1LFZLX0ZPUk1BVF9COEc4UjhBOF9VU0NBTEVEOjQ2LFZLX0ZPUk1BVF9COEc4UjhBOF9TU0NBTEVEOjQ3LFZLX0ZPUk1BVF9COEc4UjhBOF9VSU5UOjQ4LFZLX0ZPUk1BVF9COEc4UjhBOF9TSU5UOjQ5LFZLX0ZPUk1BVF9COEc4UjhBOF9TUkdCOjUwLFZLX0ZPUk1BVF9BOEI4RzhSOF9VTk9STV9QQUNLMzI6NTEsVktfRk9STUFUX0E4QjhHOFI4X1NOT1JNX1BBQ0szMjo1MixWS19GT1JNQVRfQThCOEc4UjhfVVNDQUxFRF9QQUNLMzI6NTMsVktfRk9STUFUX0E4QjhHOFI4X1NTQ0FMRURfUEFDSzMyOjU0LFZLX0ZPUk1BVF9BOEI4RzhSOF9VSU5UX1BBQ0szMjo1NSxWS19GT1JNQVRfQThCOEc4UjhfU0lOVF9QQUNLMzI6NTYsVktfRk9STUFUX0E4QjhHOFI4X1NSR0JfUEFDSzMyOjU3LFZLX0ZPUk1BVF9BMlIxMEcxMEIxMF9VTk9STV9QQUNLMzI6NTgsVktfRk9STUFUX0EyUjEwRzEwQjEwX1NOT1JNX1BBQ0szMjo1OSxWS19GT1JNQVRfQTJSMTBHMTBCMTBfVVNDQUxFRF9QQUNLMzI6NjAsVktfRk9STUFUX0EyUjEwRzEwQjEwX1NTQ0FMRURfUEFDSzMyOjYxLFZLX0ZPUk1BVF9BMlIxMEcxMEIxMF9VSU5UX1BBQ0szMjo2MixWS19GT1JNQVRfQTJSMTBHMTBCMTBfU0lOVF9QQUNLMzI6NjMsVktfRk9STUFUX0EyQjEwRzEwUjEwX1VOT1JNX1BBQ0szMjo2NCxWS19GT1JNQVRfQTJCMTBHMTBSMTBfU05PUk1fUEFDSzMyOjY1LFZLX0ZPUk1BVF9BMkIxMEcxMFIxMF9VU0NBTEVEX1BBQ0szMjo2NixWS19GT1JNQVRfQTJCMTBHMTBSMTBfU1NDQUxFRF9QQUNLMzI6NjcsVktfRk9STUFUX0EyQjEwRzEwUjEwX1VJTlRfUEFDSzMyOjY4LFZLX0ZPUk1BVF9BMkIxMEcxMFIxMF9TSU5UX1BBQ0szMjo2OSxWS19GT1JNQVRfUjE2X1VOT1JNOjcwLFZLX0ZPUk1BVF9SMTZfU05PUk06NzEsVktfRk9STUFUX1IxNl9VU0NBTEVEOjcyLFZLX0ZPUk1BVF9SMTZfU1NDQUxFRDo3MyxWS19GT1JNQVRfUjE2X1VJTlQ6NzQsVktfRk9STUFUX1IxNl9TSU5UOjc1LFZLX0ZPUk1BVF9SMTZfU0ZMT0FUOjc2LFZLX0ZPUk1BVF9SMTZHMTZfVU5PUk06NzcsVktfRk9STUFUX1IxNkcxNl9TTk9STTo3OCxWS19GT1JNQVRfUjE2RzE2X1VTQ0FMRUQ6NzksVktfRk9STUFUX1IxNkcxNl9TU0NBTEVEOjgwLFZLX0ZPUk1BVF9SMTZHMTZfVUlOVDo4MSxWS19GT1JNQVRfUjE2RzE2X1NJTlQ6ODIsVktfRk9STUFUX1IxNkcxNl9TRkxPQVQ6ODMsVktfRk9STUFUX1IxNkcxNkIxNl9VTk9STTo4NCxWS19GT1JNQVRfUjE2RzE2QjE2X1NOT1JNOjg1LFZLX0ZPUk1BVF9SMTZHMTZCMTZfVVNDQUxFRDo4NixWS19GT1JNQVRfUjE2RzE2QjE2X1NTQ0FMRUQ6ODcsVktfRk9STUFUX1IxNkcxNkIxNl9VSU5UOjg4LFZLX0ZPUk1BVF9SMTZHMTZCMTZfU0lOVDo4OSxWS19GT1JNQVRfUjE2RzE2QjE2X1NGTE9BVDo5MCxWS19GT1JNQVRfUjE2RzE2QjE2QTE2X1VOT1JNOjkxLFZLX0ZPUk1BVF9SMTZHMTZCMTZBMTZfU05PUk06OTIsVktfRk9STUFUX1IxNkcxNkIxNkExNl9VU0NBTEVEOjkzLFZLX0ZPUk1BVF9SMTZHMTZCMTZBMTZfU1NDQUxFRDo5NCxWS19GT1JNQVRfUjE2RzE2QjE2QTE2X1VJTlQ6OTUsVktfRk9STUFUX1IxNkcxNkIxNkExNl9TSU5UOjk2LFZLX0ZPUk1BVF9SMTZHMTZCMTZBMTZfU0ZMT0FUOjk3LFZLX0ZPUk1BVF9SMzJfVUlOVDo5OCxWS19GT1JNQVRfUjMyX1NJTlQ6OTksVktfRk9STUFUX1IzMl9TRkxPQVQ6MTAwLFZLX0ZPUk1BVF9SMzJHMzJfVUlOVDoxMDEsVktfRk9STUFUX1IzMkczMl9TSU5UOjEwMixWS19GT1JNQVRfUjMyRzMyX1NGTE9BVDoxMDMsVktfRk9STUFUX1IzMkczMkIzMl9VSU5UOjEwNCxWS19GT1JNQVRfUjMyRzMyQjMyX1NJTlQ6MTA1LFZLX0ZPUk1BVF9SMzJHMzJCMzJfU0ZMT0FUOjEwNixWS19GT1JNQVRfUjMyRzMyQjMyQTMyX1VJTlQ6MTA3LFZLX0ZPUk1BVF9SMzJHMzJCMzJBMzJfU0lOVDoxMDgsVktfRk9STUFUX1IzMkczMkIzMkEzMl9TRkxPQVQ6MTA5LFZLX0ZPUk1BVF9SNjRfVUlOVDoxMTAsVktfRk9STUFUX1I2NF9TSU5UOjExMSxWS19GT1JNQVRfUjY0X1NGTE9BVDoxMTIsVktfRk9STUFUX1I2NEc2NF9VSU5UOjExMyxWS19GT1JNQVRfUjY0RzY0X1NJTlQ6MTE0LFZLX0ZPUk1BVF9SNjRHNjRfU0ZMT0FUOjExNSxWS19GT1JNQVRfUjY0RzY0QjY0X1VJTlQ6MTE2LFZLX0ZPUk1BVF9SNjRHNjRCNjRfU0lOVDoxMTcsVktfRk9STUFUX1I2NEc2NEI2NF9TRkxPQVQ6MTE4LFZLX0ZPUk1BVF9SNjRHNjRCNjRBNjRfVUlOVDoxMTksVktfRk9STUFUX1I2NEc2NEI2NEE2NF9TSU5UOjEyMCxWS19GT1JNQVRfUjY0RzY0QjY0QTY0X1NGTE9BVDoxMjEsVktfRk9STUFUX0IxMEcxMVIxMV9VRkxPQVRfUEFDSzMyOjEyMixWS19GT1JNQVRfRTVCOUc5UjlfVUZMT0FUX1BBQ0szMjoxMjMsVktfRk9STUFUX0QxNl9VTk9STToxMjQsVktfRk9STUFUX1g4X0QyNF9VTk9STV9QQUNLMzI6MTI1LFZLX0ZPUk1BVF9EMzJfU0ZMT0FUOjEyNixWS19GT1JNQVRfUzhfVUlOVDoxMjcsVktfRk9STUFUX0QxNl9VTk9STV9TOF9VSU5UOjEyOCxWS19GT1JNQVRfRDI0X1VOT1JNX1M4X1VJTlQ6MTI5LFZLX0ZPUk1BVF9EMzJfU0ZMT0FUX1M4X1VJTlQ6MTMwLFZLX0ZPUk1BVF9CQzFfUkdCX1VOT1JNX0JMT0NLOjEzMSxWS19GT1JNQVRfQkMxX1JHQl9TUkdCX0JMT0NLOjEzMixWS19GT1JNQVRfQkMxX1JHQkFfVU5PUk1fQkxPQ0s6MTMzLFZLX0ZPUk1BVF9CQzFfUkdCQV9TUkdCX0JMT0NLOjEzNCxWS19GT1JNQVRfQkMyX1VOT1JNX0JMT0NLOjEzNSxWS19GT1JNQVRfQkMyX1NSR0JfQkxPQ0s6MTM2LFZLX0ZPUk1BVF9CQzNfVU5PUk1fQkxPQ0s6MTM3LFZLX0ZPUk1BVF9CQzNfU1JHQl9CTE9DSzoxMzgsVktfRk9STUFUX0JDNF9VTk9STV9CTE9DSzoxMzksVktfRk9STUFUX0JDNF9TTk9STV9CTE9DSzoxNDAsVktfRk9STUFUX0JDNV9VTk9STV9CTE9DSzoxNDEsVktfRk9STUFUX0JDNV9TTk9STV9CTE9DSzoxNDIsVktfRk9STUFUX0JDNkhfVUZMT0FUX0JMT0NLOjE0MyxWS19GT1JNQVRfQkM2SF9TRkxPQVRfQkxPQ0s6MTQ0LFZLX0ZPUk1BVF9CQzdfVU5PUk1fQkxPQ0s6MTQ1LFZLX0ZPUk1BVF9CQzdfU1JHQl9CTE9DSzoxNDYsVktfRk9STUFUX0VUQzJfUjhHOEI4X1VOT1JNX0JMT0NLOjE0NyxWS19GT1JNQVRfRVRDMl9SOEc4QjhfU1JHQl9CTE9DSzoxNDgsVktfRk9STUFUX0VUQzJfUjhHOEI4QTFfVU5PUk1fQkxPQ0s6MTQ5LFZLX0ZPUk1BVF9FVEMyX1I4RzhCOEExX1NSR0JfQkxPQ0s6MTUwLFZLX0ZPUk1BVF9FVEMyX1I4RzhCOEE4X1VOT1JNX0JMT0NLOjE1MSxWS19GT1JNQVRfRVRDMl9SOEc4QjhBOF9TUkdCX0JMT0NLOjE1MixWS19GT1JNQVRfRUFDX1IxMV9VTk9STV9CTE9DSzoxNTMsVktfRk9STUFUX0VBQ19SMTFfU05PUk1fQkxPQ0s6MTU0LFZLX0ZPUk1BVF9FQUNfUjExRzExX1VOT1JNX0JMT0NLOjE1NSxWS19GT1JNQVRfRUFDX1IxMUcxMV9TTk9STV9CTE9DSzoxNTYsVktfRk9STUFUX0FTVENfNHg0X1VOT1JNX0JMT0NLOjE1NyxWS19GT1JNQVRfQVNUQ180eDRfU1JHQl9CTE9DSzoxNTgsVktfRk9STUFUX0FTVENfNXg0X1VOT1JNX0JMT0NLOjE1OSxWS19GT1JNQVRfQVNUQ181eDRfU1JHQl9CTE9DSzoxNjAsVktfRk9STUFUX0FTVENfNXg1X1VOT1JNX0JMT0NLOjE2MSxWS19GT1JNQVRfQVNUQ181eDVfU1JHQl9CTE9DSzoxNjIsVktfRk9STUFUX0FTVENfNng1X1VOT1JNX0JMT0NLOjE2MyxWS19GT1JNQVRfQVNUQ182eDVfU1JHQl9CTE9DSzoxNjQsVktfRk9STUFUX0FTVENfNng2X1VOT1JNX0JMT0NLOjE2NSxWS19GT1JNQVRfQVNUQ182eDZfU1JHQl9CTE9DSzoxNjYsVktfRk9STUFUX0FTVENfOHg1X1VOT1JNX0JMT0NLOjE2NyxWS19GT1JNQVRfQVNUQ184eDVfU1JHQl9CTE9DSzoxNjgsVktfRk9STUFUX0FTVENfOHg2X1VOT1JNX0JMT0NLOjE2OSxWS19GT1JNQVRfQVNUQ184eDZfU1JHQl9CTE9DSzoxNzAsVktfRk9STUFUX0FTVENfOHg4X1VOT1JNX0JMT0NLOjE3MSxWS19GT1JNQVRfQVNUQ184eDhfU1JHQl9CTE9DSzoxNzIsVktfRk9STUFUX0FTVENfMTB4NV9VTk9STV9CTE9DSzoxNzMsVktfRk9STUFUX0FTVENfMTB4NV9TUkdCX0JMT0NLOjE3NCxWS19GT1JNQVRfQVNUQ18xMHg2X1VOT1JNX0JMT0NLOjE3NSxWS19GT1JNQVRfQVNUQ18xMHg2X1NSR0JfQkxPQ0s6MTc2LFZLX0ZPUk1BVF9BU1RDXzEweDhfVU5PUk1fQkxPQ0s6MTc3LFZLX0ZPUk1BVF9BU1RDXzEweDhfU1JHQl9CTE9DSzoxNzgsVktfRk9STUFUX0FTVENfMTB4MTBfVU5PUk1fQkxPQ0s6MTc5LFZLX0ZPUk1BVF9BU1RDXzEweDEwX1NSR0JfQkxPQ0s6MTgwLFZLX0ZPUk1BVF9BU1RDXzEyeDEwX1VOT1JNX0JMT0NLOjE4MSxWS19GT1JNQVRfQVNUQ18xMngxMF9TUkdCX0JMT0NLOjE4MixWS19GT1JNQVRfQVNUQ18xMngxMl9VTk9STV9CTE9DSzoxODMsVktfRk9STUFUX0FTVENfMTJ4MTJfU1JHQl9CTE9DSzoxODQsVktfRk9STUFUX0c4QjhHOFI4XzQyMl9VTk9STToxMDAwMTU2ZTMsVktfRk9STUFUX0I4RzhSOEc4XzQyMl9VTk9STToxMDAwMTU2MDAxLFZLX0ZPUk1BVF9HOF9COF9SOF8zUExBTkVfNDIwX1VOT1JNOjEwMDAxNTYwMDIsVktfRk9STUFUX0c4X0I4UjhfMlBMQU5FXzQyMF9VTk9STToxMDAwMTU2MDAzLFZLX0ZPUk1BVF9HOF9COF9SOF8zUExBTkVfNDIyX1VOT1JNOjEwMDAxNTYwMDQsVktfRk9STUFUX0c4X0I4UjhfMlBMQU5FXzQyMl9VTk9STToxMDAwMTU2MDA1LFZLX0ZPUk1BVF9HOF9COF9SOF8zUExBTkVfNDQ0X1VOT1JNOjEwMDAxNTYwMDYsVktfRk9STUFUX1IxMFg2X1VOT1JNX1BBQ0sxNjoxMDAwMTU2MDA3LFZLX0ZPUk1BVF9SMTBYNkcxMFg2X1VOT1JNXzJQQUNLMTY6MTAwMDE1NjAwOCxWS19GT1JNQVRfUjEwWDZHMTBYNkIxMFg2QTEwWDZfVU5PUk1fNFBBQ0sxNjoxMDAwMTU2MDA5LFZLX0ZPUk1BVF9HMTBYNkIxMFg2RzEwWDZSMTBYNl80MjJfVU5PUk1fNFBBQ0sxNjoxMDAwMTU2MDEwLFZLX0ZPUk1BVF9CMTBYNkcxMFg2UjEwWDZHMTBYNl80MjJfVU5PUk1fNFBBQ0sxNjoxMDAwMTU2MDExLFZLX0ZPUk1BVF9HMTBYNl9CMTBYNl9SMTBYNl8zUExBTkVfNDIwX1VOT1JNXzNQQUNLMTY6MTAwMDE1NjAxMixWS19GT1JNQVRfRzEwWDZfQjEwWDZSMTBYNl8yUExBTkVfNDIwX1VOT1JNXzNQQUNLMTY6MTAwMDE1NjAxMyxWS19GT1JNQVRfRzEwWDZfQjEwWDZfUjEwWDZfM1BMQU5FXzQyMl9VTk9STV8zUEFDSzE2OjEwMDAxNTYwMTQsVktfRk9STUFUX0cxMFg2X0IxMFg2UjEwWDZfMlBMQU5FXzQyMl9VTk9STV8zUEFDSzE2OjEwMDAxNTYwMTUsVktfRk9STUFUX0cxMFg2X0IxMFg2X1IxMFg2XzNQTEFORV80NDRfVU5PUk1fM1BBQ0sxNjoxMDAwMTU2MDE2LFZLX0ZPUk1BVF9SMTJYNF9VTk9STV9QQUNLMTY6MTAwMDE1NjAxNyxWS19GT1JNQVRfUjEyWDRHMTJYNF9VTk9STV8yUEFDSzE2OjEwMDAxNTYwMTgsVktfRk9STUFUX1IxMlg0RzEyWDRCMTJYNEExMlg0X1VOT1JNXzRQQUNLMTY6MTAwMDE1NjAxOSxWS19GT1JNQVRfRzEyWDRCMTJYNEcxMlg0UjEyWDRfNDIyX1VOT1JNXzRQQUNLMTY6MTAwMDE1NjAyMCxWS19GT1JNQVRfQjEyWDRHMTJYNFIxMlg0RzEyWDRfNDIyX1VOT1JNXzRQQUNLMTY6MTAwMDE1NjAyMSxWS19GT1JNQVRfRzEyWDRfQjEyWDRfUjEyWDRfM1BMQU5FXzQyMF9VTk9STV8zUEFDSzE2OjEwMDAxNTYwMjIsVktfRk9STUFUX0cxMlg0X0IxMlg0UjEyWDRfMlBMQU5FXzQyMF9VTk9STV8zUEFDSzE2OjEwMDAxNTYwMjMsVktfRk9STUFUX0cxMlg0X0IxMlg0X1IxMlg0XzNQTEFORV80MjJfVU5PUk1fM1BBQ0sxNjoxMDAwMTU2MDI0LFZLX0ZPUk1BVF9HMTJYNF9CMTJYNFIxMlg0XzJQTEFORV80MjJfVU5PUk1fM1BBQ0sxNjoxMDAwMTU2MDI1LFZLX0ZPUk1BVF9HMTJYNF9CMTJYNF9SMTJYNF8zUExBTkVfNDQ0X1VOT1JNXzNQQUNLMTY6MTAwMDE1NjAyNixWS19GT1JNQVRfRzE2QjE2RzE2UjE2XzQyMl9VTk9STToxMDAwMTU2MDI3LFZLX0ZPUk1BVF9CMTZHMTZSMTZHMTZfNDIyX1VOT1JNOjEwMDAxNTYwMjgsVktfRk9STUFUX0cxNl9CMTZfUjE2XzNQTEFORV80MjBfVU5PUk06MTAwMDE1NjAyOSxWS19GT1JNQVRfRzE2X0IxNlIxNl8yUExBTkVfNDIwX1VOT1JNOjEwMDAxNTYwMzAsVktfRk9STUFUX0cxNl9CMTZfUjE2XzNQTEFORV80MjJfVU5PUk06MTAwMDE1NjAzMSxWS19GT1JNQVRfRzE2X0IxNlIxNl8yUExBTkVfNDIyX1VOT1JNOjEwMDAxNTYwMzIsVktfRk9STUFUX0cxNl9CMTZfUjE2XzNQTEFORV80NDRfVU5PUk06MTAwMDE1NjAzMyxWS19GT1JNQVRfUFZSVEMxXzJCUFBfVU5PUk1fQkxPQ0tfSU1HOjEwMDAwNTRlMyxWS19GT1JNQVRfUFZSVEMxXzRCUFBfVU5PUk1fQkxPQ0tfSU1HOjEwMDAwNTQwMDEsVktfRk9STUFUX1BWUlRDMl8yQlBQX1VOT1JNX0JMT0NLX0lNRzoxMDAwMDU0MDAyLFZLX0ZPUk1BVF9QVlJUQzJfNEJQUF9VTk9STV9CTE9DS19JTUc6MTAwMDA1NDAwMyxWS19GT1JNQVRfUFZSVEMxXzJCUFBfU1JHQl9CTE9DS19JTUc6MTAwMDA1NDAwNCxWS19GT1JNQVRfUFZSVEMxXzRCUFBfU1JHQl9CTE9DS19JTUc6MTAwMDA1NDAwNSxWS19GT1JNQVRfUFZSVEMyXzJCUFBfU1JHQl9CTE9DS19JTUc6MTAwMDA1NDAwNixWS19GT1JNQVRfUFZSVEMyXzRCUFBfU1JHQl9CTE9DS19JTUc6MTAwMDA1NDAwNyxWS19GT1JNQVRfQVNUQ180eDRfU0ZMT0FUX0JMT0NLX0VYVDoxMDAwMDY2ZTMsVktfRk9STUFUX0FTVENfNXg0X1NGTE9BVF9CTE9DS19FWFQ6MTAwMDA2NjAwMSxWS19GT1JNQVRfQVNUQ181eDVfU0ZMT0FUX0JMT0NLX0VYVDoxMDAwMDY2MDAyLFZLX0ZPUk1BVF9BU1RDXzZ4NV9TRkxPQVRfQkxPQ0tfRVhUOjEwMDAwNjYwMDMsVktfRk9STUFUX0FTVENfNng2X1NGTE9BVF9CTE9DS19FWFQ6MTAwMDA2NjAwNCxWS19GT1JNQVRfQVNUQ184eDVfU0ZMT0FUX0JMT0NLX0VYVDoxMDAwMDY2MDA1LFZLX0ZPUk1BVF9BU1RDXzh4Nl9TRkxPQVRfQkxPQ0tfRVhUOjEwMDAwNjYwMDYsVktfRk9STUFUX0FTVENfOHg4X1NGTE9BVF9CTE9DS19FWFQ6MTAwMDA2NjAwNyxWS19GT1JNQVRfQVNUQ18xMHg1X1NGTE9BVF9CTE9DS19FWFQ6MTAwMDA2NjAwOCxWS19GT1JNQVRfQVNUQ18xMHg2X1NGTE9BVF9CTE9DS19FWFQ6MTAwMDA2NjAwOSxWS19GT1JNQVRfQVNUQ18xMHg4X1NGTE9BVF9CTE9DS19FWFQ6MTAwMDA2NjAxMCxWS19GT1JNQVRfQVNUQ18xMHgxMF9TRkxPQVRfQkxPQ0tfRVhUOjEwMDAwNjYwMTEsVktfRk9STUFUX0FTVENfMTJ4MTBfU0ZMT0FUX0JMT0NLX0VYVDoxMDAwMDY2MDEyLFZLX0ZPUk1BVF9BU1RDXzEyeDEyX1NGTE9BVF9CTE9DS19FWFQ6MTAwMDA2NjAxMyxWS19GT1JNQVRfRzhCOEc4UjhfNDIyX1VOT1JNX0tIUjoxMDAwMTU2ZTMsVktfRk9STUFUX0I4RzhSOEc4XzQyMl9VTk9STV9LSFI6MTAwMDE1NjAwMSxWS19GT1JNQVRfRzhfQjhfUjhfM1BMQU5FXzQyMF9VTk9STV9LSFI6MTAwMDE1NjAwMixWS19GT1JNQVRfRzhfQjhSOF8yUExBTkVfNDIwX1VOT1JNX0tIUjoxMDAwMTU2MDAzLFZLX0ZPUk1BVF9HOF9COF9SOF8zUExBTkVfNDIyX1VOT1JNX0tIUjoxMDAwMTU2MDA0LFZLX0ZPUk1BVF9HOF9COFI4XzJQTEFORV80MjJfVU5PUk1fS0hSOjEwMDAxNTYwMDUsVktfRk9STUFUX0c4X0I4X1I4XzNQTEFORV80NDRfVU5PUk1fS0hSOjEwMDAxNTYwMDYsVktfRk9STUFUX1IxMFg2X1VOT1JNX1BBQ0sxNl9LSFI6MTAwMDE1NjAwNyxWS19GT1JNQVRfUjEwWDZHMTBYNl9VTk9STV8yUEFDSzE2X0tIUjoxMDAwMTU2MDA4LFZLX0ZPUk1BVF9SMTBYNkcxMFg2QjEwWDZBMTBYNl9VTk9STV80UEFDSzE2X0tIUjoxMDAwMTU2MDA5LFZLX0ZPUk1BVF9HMTBYNkIxMFg2RzEwWDZSMTBYNl80MjJfVU5PUk1fNFBBQ0sxNl9LSFI6MTAwMDE1NjAxMCxWS19GT1JNQVRfQjEwWDZHMTBYNlIxMFg2RzEwWDZfNDIyX1VOT1JNXzRQQUNLMTZfS0hSOjEwMDAxNTYwMTEsVktfRk9STUFUX0cxMFg2X0IxMFg2X1IxMFg2XzNQTEFORV80MjBfVU5PUk1fM1BBQ0sxNl9LSFI6MTAwMDE1NjAxMixWS19GT1JNQVRfRzEwWDZfQjEwWDZSMTBYNl8yUExBTkVfNDIwX1VOT1JNXzNQQUNLMTZfS0hSOjEwMDAxNTYwMTMsVktfRk9STUFUX0cxMFg2X0IxMFg2X1IxMFg2XzNQTEFORV80MjJfVU5PUk1fM1BBQ0sxNl9LSFI6MTAwMDE1NjAxNCxWS19GT1JNQVRfRzEwWDZfQjEwWDZSMTBYNl8yUExBTkVfNDIyX1VOT1JNXzNQQUNLMTZfS0hSOjEwMDAxNTYwMTUsVktfRk9STUFUX0cxMFg2X0IxMFg2X1IxMFg2XzNQTEFORV80NDRfVU5PUk1fM1BBQ0sxNl9LSFI6MTAwMDE1NjAxNixWS19GT1JNQVRfUjEyWDRfVU5PUk1fUEFDSzE2X0tIUjoxMDAwMTU2MDE3LFZLX0ZPUk1BVF9SMTJYNEcxMlg0X1VOT1JNXzJQQUNLMTZfS0hSOjEwMDAxNTYwMTgsVktfRk9STUFUX1IxMlg0RzEyWDRCMTJYNEExMlg0X1VOT1JNXzRQQUNLMTZfS0hSOjEwMDAxNTYwMTksVktfRk9STUFUX0cxMlg0QjEyWDRHMTJYNFIxMlg0XzQyMl9VTk9STV80UEFDSzE2X0tIUjoxMDAwMTU2MDIwLFZLX0ZPUk1BVF9CMTJYNEcxMlg0UjEyWDRHMTJYNF80MjJfVU5PUk1fNFBBQ0sxNl9LSFI6MTAwMDE1NjAyMSxWS19GT1JNQVRfRzEyWDRfQjEyWDRfUjEyWDRfM1BMQU5FXzQyMF9VTk9STV8zUEFDSzE2X0tIUjoxMDAwMTU2MDIyLFZLX0ZPUk1BVF9HMTJYNF9CMTJYNFIxMlg0XzJQTEFORV80MjBfVU5PUk1fM1BBQ0sxNl9LSFI6MTAwMDE1NjAyMyxWS19GT1JNQVRfRzEyWDRfQjEyWDRfUjEyWDRfM1BMQU5FXzQyMl9VTk9STV8zUEFDSzE2X0tIUjoxMDAwMTU2MDI0LFZLX0ZPUk1BVF9HMTJYNF9CMTJYNFIxMlg0XzJQTEFORV80MjJfVU5PUk1fM1BBQ0sxNl9LSFI6MTAwMDE1NjAyNSxWS19GT1JNQVRfRzEyWDRfQjEyWDRfUjEyWDRfM1BMQU5FXzQ0NF9VTk9STV8zUEFDSzE2X0tIUjoxMDAwMTU2MDI2LFZLX0ZPUk1BVF9HMTZCMTZHMTZSMTZfNDIyX1VOT1JNX0tIUjoxMDAwMTU2MDI3LFZLX0ZPUk1BVF9CMTZHMTZSMTZHMTZfNDIyX1VOT1JNX0tIUjoxMDAwMTU2MDI4LFZLX0ZPUk1BVF9HMTZfQjE2X1IxNl8zUExBTkVfNDIwX1VOT1JNX0tIUjoxMDAwMTU2MDI5LFZLX0ZPUk1BVF9HMTZfQjE2UjE2XzJQTEFORV80MjBfVU5PUk1fS0hSOjEwMDAxNTYwMzAsVktfRk9STUFUX0cxNl9CMTZfUjE2XzNQTEFORV80MjJfVU5PUk1fS0hSOjEwMDAxNTYwMzEsVktfRk9STUFUX0cxNl9CMTZSMTZfMlBMQU5FXzQyMl9VTk9STV9LSFI6MTAwMDE1NjAzMixWS19GT1JNQVRfRzE2X0IxNl9SMTZfM1BMQU5FXzQ0NF9VTk9STV9LSFI6MTAwMDE1NjAzM30seXU9T2JqZWN0LmZyZWV6ZShoOCl9KTtmdW5jdGlvbiBMUyh0KXtyZXR1cm4gbmV3IFRleHREZWNvZGVyKCkuZGVjb2RlKHQpfWZ1bmN0aW9uIERTKHQpe2xldCBlPW5ldyBVaW50OEFycmF5KHQuYnVmZmVyLHQuYnl0ZU9mZnNldCxrby5sZW5ndGgpO2lmKGVbMF0hPT1rb1swXXx8ZVsxXSE9PWtvWzFdfHxlWzJdIT09a29bMl18fGVbM10hPT1rb1szXXx8ZVs0XSE9PWtvWzRdfHxlWzVdIT09a29bNV18fGVbNl0hPT1rb1s2XXx8ZVs3XSE9PWtvWzddfHxlWzhdIT09a29bOF18fGVbOV0hPT1rb1s5XXx8ZVsxMF0hPT1rb1sxMF18fGVbMTFdIT09a29bMTFdKXRocm93IG5ldyBFcnJvcigiTWlzc2luZyBLVFggMi4wIGlkZW50aWZpZXIuIik7bGV0IG49bmV3IFFnLG89MTcqVWludDMyQXJyYXkuQllURVNfUEVSX0VMRU1FTlQscj1uZXcgUGModCxrby5sZW5ndGgsbywhMCk7bi52a0Zvcm1hdD1yLl9uZXh0VWludDMyKCksbi50eXBlU2l6ZT1yLl9uZXh0VWludDMyKCksbi5waXhlbFdpZHRoPXIuX25leHRVaW50MzIoKSxuLnBpeGVsSGVpZ2h0PXIuX25leHRVaW50MzIoKSxuLnBpeGVsRGVwdGg9ci5fbmV4dFVpbnQzMigpLG4ubGF5ZXJDb3VudD1yLl9uZXh0VWludDMyKCksbi5mYWNlQ291bnQ9ci5fbmV4dFVpbnQzMigpO2xldCBpPXIuX25leHRVaW50MzIoKTtuLnN1cGVyY29tcHJlc3Npb25TY2hlbWU9ci5fbmV4dFVpbnQzMigpO2xldCBzPXIuX25leHRVaW50MzIoKSxmPXIuX25leHRVaW50MzIoKSx1PXIuX25leHRVaW50MzIoKSxjPXIuX25leHRVaW50MzIoKSxsPXIuX25leHRVaW50NjQoKSxwPXIuX25leHRVaW50NjQoKSxkPWkqMyo4LG09bmV3IFBjKHQsa28ubGVuZ3RoK28sZCwhMCk7Zm9yKGxldCBYPTA7WDxpO1grKyluLmxldmVscy5wdXNoKHtsZXZlbERhdGE6bmV3IFVpbnQ4QXJyYXkodC5idWZmZXIsdC5ieXRlT2Zmc2V0K20uX25leHRVaW50NjQoKSxtLl9uZXh0VWludDY0KCkpLHVuY29tcHJlc3NlZEJ5dGVMZW5ndGg6bS5fbmV4dFVpbnQ2NCgpfSk7bGV0IF89bmV3IFBjKHQscyxmLCEwKSxnPXt2ZW5kb3JJZDpfLl9za2lwKDQpLl9uZXh0VWludDE2KCksZGVzY3JpcHRvclR5cGU6Xy5fbmV4dFVpbnQxNigpLHZlcnNpb25OdW1iZXI6Xy5fbmV4dFVpbnQxNigpLGRlc2NyaXB0b3JCbG9ja1NpemU6Xy5fbmV4dFVpbnQxNigpLGNvbG9yTW9kZWw6Xy5fbmV4dFVpbnQ4KCksY29sb3JQcmltYXJpZXM6Xy5fbmV4dFVpbnQ4KCksdHJhbnNmZXJGdW5jdGlvbjpfLl9uZXh0VWludDgoKSxmbGFnczpfLl9uZXh0VWludDgoKSx0ZXhlbEJsb2NrRGltZW5zaW9uOltfLl9uZXh0VWludDgoKSxfLl9uZXh0VWludDgoKSxfLl9uZXh0VWludDgoKSxfLl9uZXh0VWludDgoKV0sYnl0ZXNQbGFuZTpbXy5fbmV4dFVpbnQ4KCksXy5fbmV4dFVpbnQ4KCksXy5fbmV4dFVpbnQ4KCksXy5fbmV4dFVpbnQ4KCksXy5fbmV4dFVpbnQ4KCksXy5fbmV4dFVpbnQ4KCksXy5fbmV4dFVpbnQ4KCksXy5fbmV4dFVpbnQ4KCldLHNhbXBsZXM6W119LE89KGcuZGVzY3JpcHRvckJsb2NrU2l6ZS80LTYpLzQ7Zm9yKGxldCBYPTA7WDxPO1grKyl7bGV0IFI9e2JpdE9mZnNldDpfLl9uZXh0VWludDE2KCksYml0TGVuZ3RoOl8uX25leHRVaW50OCgpLGNoYW5uZWxUeXBlOl8uX25leHRVaW50OCgpLHNhbXBsZVBvc2l0aW9uOltfLl9uZXh0VWludDgoKSxfLl9uZXh0VWludDgoKSxfLl9uZXh0VWludDgoKSxfLl9uZXh0VWludDgoKV0sc2FtcGxlTG93ZXI6LTEvMCxzYW1wbGVVcHBlcjoxLzB9O1IuY2hhbm5lbFR5cGUmNjQ/KFIuc2FtcGxlTG93ZXI9Xy5fbmV4dEludDMyKCksUi5zYW1wbGVVcHBlcj1fLl9uZXh0SW50MzIoKSk6KFIuc2FtcGxlTG93ZXI9Xy5fbmV4dFVpbnQzMigpLFIuc2FtcGxlVXBwZXI9Xy5fbmV4dFVpbnQzMigpKSxnLnNhbXBsZXNbWF09Un1uLmRhdGFGb3JtYXREZXNjcmlwdG9yLmxlbmd0aD0wLG4uZGF0YUZvcm1hdERlc2NyaXB0b3IucHVzaChnKTtsZXQgRT1uZXcgUGModCx1LGMsITApO2Zvcig7RS5fb2Zmc2V0PGM7KXtsZXQgWD1FLl9uZXh0VWludDMyKCksUj1FLl9zY2FuKFgpLG90PUxTKFIpO2lmKG4ua2V5VmFsdWVbb3RdPUUuX25leHRVaW50OEFycmF5KFgtUi5ieXRlTGVuZ3RoLTEpLG90Lm1hdGNoKC9ea3R4L2kpKXtsZXQgcHQ9TFMobi5rZXlWYWx1ZVtvdF0pO24ua2V5VmFsdWVbb3RdPXB0LnN1YnN0cmluZygwLHB0Lmxhc3RJbmRleE9mKCJcMCIpKX1sZXQgYXQ9WCU0PzQtWCU0OjA7RS5fc2tpcChhdCl9aWYocDw9MClyZXR1cm4gbjtsZXQgdz1uZXcgUGModCxsLHAsITApLEM9dy5fbmV4dFVpbnQxNigpLE49dy5fbmV4dFVpbnQxNigpLEk9dy5fbmV4dFVpbnQzMigpLEQ9dy5fbmV4dFVpbnQzMigpLHY9dy5fbmV4dFVpbnQzMigpLEw9dy5fbmV4dFVpbnQzMigpLFU9W107Zm9yKGxldCBYPTA7WDxpO1grKylVLnB1c2goe2ltYWdlRmxhZ3M6dy5fbmV4dFVpbnQzMigpLHJnYlNsaWNlQnl0ZU9mZnNldDp3Ll9uZXh0VWludDMyKCkscmdiU2xpY2VCeXRlTGVuZ3RoOncuX25leHRVaW50MzIoKSxhbHBoYVNsaWNlQnl0ZU9mZnNldDp3Ll9uZXh0VWludDMyKCksYWxwaGFTbGljZUJ5dGVMZW5ndGg6dy5fbmV4dFVpbnQzMigpfSk7bGV0IEE9bCt3Ll9vZmZzZXQsUz1BK0ksUD1TK0QsRj1QK3Ysaj1uZXcgVWludDhBcnJheSh0LmJ1ZmZlcix0LmJ5dGVPZmZzZXQrQSxJKSxIPW5ldyBVaW50OEFycmF5KHQuYnVmZmVyLHQuYnl0ZU9mZnNldCtTLEQpLGs9bmV3IFVpbnQ4QXJyYXkodC5idWZmZXIsdC5ieXRlT2Zmc2V0K1AsdiksSz1uZXcgVWludDhBcnJheSh0LmJ1ZmZlcix0LmJ5dGVPZmZzZXQrRixMKTtyZXR1cm4gbi5nbG9iYWxEYXRhPXtlbmRwb2ludENvdW50OkMsc2VsZWN0b3JDb3VudDpOLGltYWdlRGVzY3M6VSxlbmRwb2ludHNEYXRhOmosc2VsZWN0b3JzRGF0YTpILHRhYmxlc0RhdGE6ayxleHRlbmRlZERhdGE6S30sbn12YXIgUWcsUGMsVGx0LGtvLEZTPVooKCk9PntRZz1jbGFzc3tjb25zdHJ1Y3Rvcigpe3RoaXMudmtGb3JtYXQ9MCx0aGlzLnR5cGVTaXplPTEsdGhpcy5waXhlbFdpZHRoPTAsdGhpcy5waXhlbEhlaWdodD0wLHRoaXMucGl4ZWxEZXB0aD0wLHRoaXMubGF5ZXJDb3VudD0wLHRoaXMuZmFjZUNvdW50PTEsdGhpcy5zdXBlcmNvbXByZXNzaW9uU2NoZW1lPTAsdGhpcy5sZXZlbHM9W10sdGhpcy5kYXRhRm9ybWF0RGVzY3JpcHRvcj1be3ZlbmRvcklkOjAsZGVzY3JpcHRvclR5cGU6MCxkZXNjcmlwdG9yQmxvY2tTaXplOjAsdmVyc2lvbk51bWJlcjoyLGNvbG9yTW9kZWw6MCxjb2xvclByaW1hcmllczoxLHRyYW5zZmVyRnVuY3Rpb246MixmbGFnczowLHRleGVsQmxvY2tEaW1lbnNpb246WzAsMCwwLDBdLGJ5dGVzUGxhbmU6WzAsMCwwLDAsMCwwLDAsMF0sc2FtcGxlczpbXX1dLHRoaXMua2V5VmFsdWU9e30sdGhpcy5nbG9iYWxEYXRhPW51bGx9fSxQYz1jbGFzc3tjb25zdHJ1Y3RvcihlLG4sbyxyKXt0aGlzLl9kYXRhVmlldz12b2lkIDAsdGhpcy5fbGl0dGxlRW5kaWFuPXZvaWQgMCx0aGlzLl9vZmZzZXQ9dm9pZCAwLHRoaXMuX2RhdGFWaWV3PW5ldyBEYXRhVmlldyhlLmJ1ZmZlcixlLmJ5dGVPZmZzZXQrbixvKSx0aGlzLl9saXR0bGVFbmRpYW49cix0aGlzLl9vZmZzZXQ9MH1fbmV4dFVpbnQ4KCl7bGV0IGU9dGhpcy5fZGF0YVZpZXcuZ2V0VWludDgodGhpcy5fb2Zmc2V0KTtyZXR1cm4gdGhpcy5fb2Zmc2V0Kz0xLGV9X25leHRVaW50MTYoKXtsZXQgZT10aGlzLl9kYXRhVmlldy5nZXRVaW50MTYodGhpcy5fb2Zmc2V0LHRoaXMuX2xpdHRsZUVuZGlhbik7cmV0dXJuIHRoaXMuX29mZnNldCs9MixlfV9uZXh0VWludDMyKCl7bGV0IGU9dGhpcy5fZGF0YVZpZXcuZ2V0VWludDMyKHRoaXMuX29mZnNldCx0aGlzLl9saXR0bGVFbmRpYW4pO3JldHVybiB0aGlzLl9vZmZzZXQrPTQsZX1fbmV4dFVpbnQ2NCgpe2xldCBlPXRoaXMuX2RhdGFWaWV3LmdldFVpbnQzMih0aGlzLl9vZmZzZXQsdGhpcy5fbGl0dGxlRW5kaWFuKSxuPXRoaXMuX2RhdGFWaWV3LmdldFVpbnQzMih0aGlzLl9vZmZzZXQrNCx0aGlzLl9saXR0bGVFbmRpYW4pLG89ZSsyKiozMipuO3JldHVybiB0aGlzLl9vZmZzZXQrPTgsb31fbmV4dEludDMyKCl7bGV0IGU9dGhpcy5fZGF0YVZpZXcuZ2V0SW50MzIodGhpcy5fb2Zmc2V0LHRoaXMuX2xpdHRsZUVuZGlhbik7cmV0dXJuIHRoaXMuX29mZnNldCs9NCxlfV9uZXh0VWludDhBcnJheShlKXtsZXQgbj1uZXcgVWludDhBcnJheSh0aGlzLl9kYXRhVmlldy5idWZmZXIsdGhpcy5fZGF0YVZpZXcuYnl0ZU9mZnNldCt0aGlzLl9vZmZzZXQsZSk7cmV0dXJuIHRoaXMuX29mZnNldCs9ZSxufV9za2lwKGUpe3JldHVybiB0aGlzLl9vZmZzZXQrPWUsdGhpc31fc2NhbihlLG49MCl7bGV0IG89dGhpcy5fb2Zmc2V0LHI9MDtmb3IoO3RoaXMuX2RhdGFWaWV3LmdldFVpbnQ4KHRoaXMuX29mZnNldCkhPT1uJiZyPGU7KXIrKyx0aGlzLl9vZmZzZXQrKztyZXR1cm4gcjxlJiZ0aGlzLl9vZmZzZXQrKyxuZXcgVWludDhBcnJheSh0aGlzLl9kYXRhVmlldy5idWZmZXIsdGhpcy5fZGF0YVZpZXcuYnl0ZU9mZnNldCtvLHIpfX0sVGx0PW5ldyBVaW50OEFycmF5KFswXSksa289WzE3MSw3NSw4NCw4OCwzMiw1MCw0OCwxODcsMTMsMTAsMjYsMTBdfSk7dmFyIEJTPVhuKCh5bSx0MSk9Pnt2YXIgSmc9ZnVuY3Rpb24oKXt2YXIgdD10eXBlb2YgZG9jdW1lbnQ8InUiJiZkb2N1bWVudC5jdXJyZW50U2NyaXB0P2RvY3VtZW50LmN1cnJlbnRTY3JpcHQuc3JjOnZvaWQgMDtyZXR1cm4gdHlwZW9mIF9fZmlsZW5hbWU8InUiJiYodD10fHxfX2ZpbGVuYW1lKSxmdW5jdGlvbihlKXtlPWV8fHt9O3ZhciBuPXR5cGVvZiBlPCJ1Ij9lOnt9LG8scjtuLnJlYWR5PW5ldyBQcm9taXNlKGZ1bmN0aW9uKFYsRyl7bz1WLHI9R30pO3ZhciBpPXt9LHM7Zm9yKHMgaW4gbiluLmhhc093blByb3BlcnR5KHMpJiYoaVtzXT1uW3NdKTt2YXIgZj1bXSx1PSIuL3RoaXMucHJvZ3JhbSIsYz1mdW5jdGlvbihWLEcpe3Rocm93IEd9LGw9ITEscD0hMSxkPSExLG09ITE7bD10eXBlb2Ygd2luZG93PT0ib2JqZWN0IixwPXR5cGVvZiBpbXBvcnRTY3JpcHRzPT0iZnVuY3Rpb24iLGQ9dHlwZW9mIHByb2Nlc3M9PSJvYmplY3QiJiZ0eXBlb2YgcHJvY2Vzcy52ZXJzaW9ucz09Im9iamVjdCImJnR5cGVvZiBwcm9jZXNzLnZlcnNpb25zLm5vZGU9PSJzdHJpbmciLG09IWwmJiFkJiYhcDt2YXIgXz0iIjtmdW5jdGlvbiBnKFYpe3JldHVybiBuLmxvY2F0ZUZpbGU/bi5sb2NhdGVGaWxlKFYsXyk6XytWfXZhciBiLFQsTyxFLHcsQztkPyhwP189cHIoInBhdGgiKS5kaXJuYW1lKF8pKyIvIjpfPV9fZGlybmFtZSsiLyIsYj1mdW5jdGlvbihHLFkpe3JldHVybiB3fHwodz1wcigiZnMiKSksQ3x8KEM9cHIoInBhdGgiKSksRz1DLm5vcm1hbGl6ZShHKSx3LnJlYWRGaWxlU3luYyhHLFk/bnVsbDoidXRmOCIpfSxPPWZ1bmN0aW9uKEcpe3ZhciBZPWIoRywhMCk7cmV0dXJuIFkuYnVmZmVyfHwoWT1uZXcgVWludDhBcnJheShZKSksRihZLmJ1ZmZlciksWX0scHJvY2Vzcy5hcmd2Lmxlbmd0aD4xJiYodT1wcm9jZXNzLmFyZ3ZbMV0ucmVwbGFjZSgvXFwvZywiLyIpKSxmPXByb2Nlc3MuYXJndi5zbGljZSgyKSxwcm9jZXNzLm9uKCJ1bmNhdWdodEV4Y2VwdGlvbiIsZnVuY3Rpb24oVil7aWYoIShWIGluc3RhbmNlb2YgT2kpKXRocm93IFZ9KSxwcm9jZXNzLm9uKCJ1bmhhbmRsZWRSZWplY3Rpb24iLEtlKSxjPWZ1bmN0aW9uKFYpe3Byb2Nlc3MuZXhpdChWKX0sbi5pbnNwZWN0PWZ1bmN0aW9uKCl7cmV0dXJuIltFbXNjcmlwdGVuIE1vZHVsZSBvYmplY3RdIn0pOm0/KHR5cGVvZiByZWFkPCJ1IiYmKGI9ZnVuY3Rpb24oRyl7cmV0dXJuIHJlYWQoRyl9KSxPPWZ1bmN0aW9uKEcpe3ZhciBZO3JldHVybiB0eXBlb2YgcmVhZGJ1ZmZlcj09ImZ1bmN0aW9uIj9uZXcgVWludDhBcnJheShyZWFkYnVmZmVyKEcpKTooWT1yZWFkKEcsImJpbmFyeSIpLEYodHlwZW9mIFk9PSJvYmplY3QiKSxZKX0sdHlwZW9mIHNjcmlwdEFyZ3M8InUiP2Y9c2NyaXB0QXJnczp0eXBlb2YgYXJndW1lbnRzPCJ1IiYmKGY9YXJndW1lbnRzKSx0eXBlb2YgcXVpdD09ImZ1bmN0aW9uIiYmKGM9ZnVuY3Rpb24oVil7cXVpdChWKX0pLHR5cGVvZiBwcmludDwidSImJih0eXBlb2YgY29uc29sZT4idSImJihjb25zb2xlPXt9KSxjb25zb2xlLmxvZz1wcmludCxjb25zb2xlLndhcm49Y29uc29sZS5lcnJvcj10eXBlb2YgcHJpbnRFcnI8InUiP3ByaW50RXJyOnByaW50KSk6KGx8fHApJiYocD9fPXNlbGYubG9jYXRpb24uaHJlZjp0eXBlb2YgZG9jdW1lbnQ8InUiJiZkb2N1bWVudC5jdXJyZW50U2NyaXB0JiYoXz1kb2N1bWVudC5jdXJyZW50U2NyaXB0LnNyYyksdCYmKF89dCksXy5pbmRleE9mKCJibG9iOiIpIT09MD9fPV8uc3Vic3RyKDAsXy5sYXN0SW5kZXhPZigiLyIpKzEpOl89IiIsYj1mdW5jdGlvbihWKXt2YXIgRz1uZXcgWE1MSHR0cFJlcXVlc3Q7cmV0dXJuIEcub3BlbigiR0VUIixWLCExKSxHLnNlbmQobnVsbCksRy5yZXNwb25zZVRleHR9LHAmJihPPWZ1bmN0aW9uKFYpe3ZhciBHPW5ldyBYTUxIdHRwUmVxdWVzdDtyZXR1cm4gRy5vcGVuKCJHRVQiLFYsITEpLEcucmVzcG9uc2VUeXBlPSJhcnJheWJ1ZmZlciIsRy5zZW5kKG51bGwpLG5ldyBVaW50OEFycmF5KEcucmVzcG9uc2UpfSksVD1mdW5jdGlvbihWLEcsWSl7dmFyIEo9bmV3IFhNTEh0dHBSZXF1ZXN0O0oub3BlbigiR0VUIixWLCEwKSxKLnJlc3BvbnNlVHlwZT0iYXJyYXlidWZmZXIiLEoub25sb2FkPWZ1bmN0aW9uKCl7aWYoSi5zdGF0dXM9PTIwMHx8Si5zdGF0dXM9PTAmJkoucmVzcG9uc2Upe0coSi5yZXNwb25zZSk7cmV0dXJufVkoKX0sSi5vbmVycm9yPVksSi5zZW5kKG51bGwpfSxFPWZ1bmN0aW9uKFYpe2RvY3VtZW50LnRpdGxlPVZ9KTt2YXIgTj1uLnByaW50fHxjb25zb2xlLmxvZy5iaW5kKGNvbnNvbGUpLEk9bi5wcmludEVycnx8Y29uc29sZS53YXJuLmJpbmQoY29uc29sZSk7Zm9yKHMgaW4gaSlpLmhhc093blByb3BlcnR5KHMpJiYobltzXT1pW3NdKTtpPW51bGwsbi5hcmd1bWVudHMmJihmPW4uYXJndW1lbnRzKSxuLnRoaXNQcm9ncmFtJiYodT1uLnRoaXNQcm9ncmFtKSxuLnF1aXQmJihjPW4ucXVpdCk7dmFyIEQ9MCx2PWZ1bmN0aW9uKFYpe0Q9Vn0sTDtuLndhc21CaW5hcnkmJihMPW4ud2FzbUJpbmFyeSk7dmFyIFU9bi5ub0V4aXRSdW50aW1lfHwhMDt0eXBlb2YgV2ViQXNzZW1ibHkhPSJvYmplY3QiJiZLZSgibm8gbmF0aXZlIHdhc20gc3VwcG9ydCBkZXRlY3RlZCIpO3ZhciBBLFM9ITEsUDtmdW5jdGlvbiBGKFYsRyl7Vnx8S2UoIkFzc2VydGlvbiBmYWlsZWQ6ICIrRyl9dmFyIGo9dHlwZW9mIFRleHREZWNvZGVyPCJ1Ij9uZXcgVGV4dERlY29kZXIoInV0ZjgiKTp2b2lkIDA7ZnVuY3Rpb24gSChWLEcsWSl7Zm9yKHZhciBKPUcrWSxsdD1HO1ZbbHRdJiYhKGx0Pj1KKTspKytsdDtpZihsdC1HPjE2JiZWLnN1YmFycmF5JiZqKXJldHVybiBqLmRlY29kZShWLnN1YmFycmF5KEcsbHQpKTtmb3IodmFyIE90PSIiO0c8bHQ7KXt2YXIgU3Q9VltHKytdO2lmKCEoU3QmMTI4KSl7T3QrPVN0cmluZy5mcm9tQ2hhckNvZGUoU3QpO2NvbnRpbnVlfXZhciBodD1WW0crK10mNjM7aWYoKFN0JjIyNCk9PTE5Mil7T3QrPVN0cmluZy5mcm9tQ2hhckNvZGUoKFN0JjMxKTw8NnxodCk7Y29udGludWV9dmFyIF90PVZbRysrXSY2MztpZigoU3QmMjQwKT09MjI0P1N0PShTdCYxNSk8PDEyfGh0PDw2fF90OlN0PShTdCY3KTw8MTh8aHQ8PDEyfF90PDw2fFZbRysrXSY2MyxTdDw2NTUzNilPdCs9U3RyaW5nLmZyb21DaGFyQ29kZShTdCk7ZWxzZXt2YXIgS3Q9U3QtNjU1MzY7T3QrPVN0cmluZy5mcm9tQ2hhckNvZGUoNTUyOTZ8S3Q+PjEwLDU2MzIwfEt0JjEwMjMpfX1yZXR1cm4gT3R9ZnVuY3Rpb24gayhWLEcpe3JldHVybiBWP0godnQsVixHKToiIn1mdW5jdGlvbiBLKFYsRyxZLEope2lmKCEoSj4wKSlyZXR1cm4gMDtmb3IodmFyIGx0PVksT3Q9WStKLTEsU3Q9MDtTdDxWLmxlbmd0aDsrK1N0KXt2YXIgaHQ9Vi5jaGFyQ29kZUF0KFN0KTtpZihodD49NTUyOTYmJmh0PD01NzM0Myl7dmFyIF90PVYuY2hhckNvZGVBdCgrK1N0KTtodD02NTUzNisoKGh0JjEwMjMpPDwxMCl8X3QmMTAyM31pZihodDw9MTI3KXtpZihZPj1PdClicmVhaztHW1krK109aHR9ZWxzZSBpZihodDw9MjA0Nyl7aWYoWSsxPj1PdClicmVhaztHW1krK109MTkyfGh0Pj42LEdbWSsrXT0xMjh8aHQmNjN9ZWxzZSBpZihodDw9NjU1MzUpe2lmKFkrMj49T3QpYnJlYWs7R1tZKytdPTIyNHxodD4+MTIsR1tZKytdPTEyOHxodD4+NiY2MyxHW1krK109MTI4fGh0JjYzfWVsc2V7aWYoWSszPj1PdClicmVhaztHW1krK109MjQwfGh0Pj4xOCxHW1krK109MTI4fGh0Pj4xMiY2MyxHW1krK109MTI4fGh0Pj42JjYzLEdbWSsrXT0xMjh8aHQmNjN9fXJldHVybiBHW1ldPTAsWS1sdH1mdW5jdGlvbiBYKFYsRyxZKXtyZXR1cm4gSyhWLHZ0LEcsWSl9ZnVuY3Rpb24gUihWKXtmb3IodmFyIEc9MCxZPTA7WTxWLmxlbmd0aDsrK1kpe3ZhciBKPVYuY2hhckNvZGVBdChZKTtKPj01NTI5NiYmSjw9NTczNDMmJihKPTY1NTM2KygoSiYxMDIzKTw8MTApfFYuY2hhckNvZGVBdCgrK1kpJjEwMjMpLEo8PTEyNz8rK0c6Sjw9MjA0Nz9HKz0yOko8PTY1NTM1P0crPTM6Rys9NH1yZXR1cm4gR312YXIgb3Q9dHlwZW9mIFRleHREZWNvZGVyPCJ1Ij9uZXcgVGV4dERlY29kZXIoInV0Zi0xNmxlIik6dm9pZCAwO2Z1bmN0aW9uIGF0KFYsRyl7Zm9yKHZhciBZPVYsSj1ZPj4xLGx0PUorRy8yOyEoSj49bHQpJiZtZVtKXTspKytKO2lmKFk9Sjw8MSxZLVY+MzImJm90KXJldHVybiBvdC5kZWNvZGUodnQuc3ViYXJyYXkoVixZKSk7Zm9yKHZhciBPdD0iIixTdD0wOyEoU3Q+PUcvMik7KytTdCl7dmFyIGh0PXp0W1YrU3QqMj4+MV07aWYoaHQ9PTApYnJlYWs7T3QrPVN0cmluZy5mcm9tQ2hhckNvZGUoaHQpfXJldHVybiBPdH1mdW5jdGlvbiBwdChWLEcsWSl7aWYoWT09PXZvaWQgMCYmKFk9MjE0NzQ4MzY0NyksWTwyKXJldHVybiAwO1ktPTI7Zm9yKHZhciBKPUcsbHQ9WTxWLmxlbmd0aCoyP1kvMjpWLmxlbmd0aCxPdD0wO090PGx0OysrT3Qpe3ZhciBTdD1WLmNoYXJDb2RlQXQoT3QpO3p0W0c+PjFdPVN0LEcrPTJ9cmV0dXJuIHp0W0c+PjFdPTAsRy1KfWZ1bmN0aW9uIHl0KFYpe3JldHVybiBWLmxlbmd0aCoyfWZ1bmN0aW9uIHJ0KFYsRyl7Zm9yKHZhciBZPTAsSj0iIjshKFk+PUcvNCk7KXt2YXIgbHQ9Y2VbVitZKjQ+PjJdO2lmKGx0PT0wKWJyZWFrO2lmKCsrWSxsdD49NjU1MzYpe3ZhciBPdD1sdC02NTUzNjtKKz1TdHJpbmcuZnJvbUNoYXJDb2RlKDU1Mjk2fE90Pj4xMCw1NjMyMHxPdCYxMDIzKX1lbHNlIEorPVN0cmluZy5mcm9tQ2hhckNvZGUobHQpfXJldHVybiBKfWZ1bmN0aW9uIFB0KFYsRyxZKXtpZihZPT09dm9pZCAwJiYoWT0yMTQ3NDgzNjQ3KSxZPDQpcmV0dXJuIDA7Zm9yKHZhciBKPUcsbHQ9SitZLTQsT3Q9MDtPdDxWLmxlbmd0aDsrK090KXt2YXIgU3Q9Vi5jaGFyQ29kZUF0KE90KTtpZihTdD49NTUyOTYmJlN0PD01NzM0Myl7dmFyIGh0PVYuY2hhckNvZGVBdCgrK090KTtTdD02NTUzNisoKFN0JjEwMjMpPDwxMCl8aHQmMTAyM31pZihjZVtHPj4yXT1TdCxHKz00LEcrND5sdClicmVha31yZXR1cm4gY2VbRz4+Ml09MCxHLUp9ZnVuY3Rpb24gZ3QoVil7Zm9yKHZhciBHPTAsWT0wO1k8Vi5sZW5ndGg7KytZKXt2YXIgSj1WLmNoYXJDb2RlQXQoWSk7Sj49NTUyOTYmJko8PTU3MzQzJiYrK1ksRys9NH1yZXR1cm4gR31mdW5jdGlvbiBDdChWLEcpe3JldHVybiBWJUc+MCYmKFYrPUctViVHKSxWfXZhciBtdCx1dCx2dCx6dCxtZSxjZSxwZSx1ZSxRdDtmdW5jdGlvbiBKdChWKXttdD1WLG4uSEVBUDg9dXQ9bmV3IEludDhBcnJheShWKSxuLkhFQVAxNj16dD1uZXcgSW50MTZBcnJheShWKSxuLkhFQVAzMj1jZT1uZXcgSW50MzJBcnJheShWKSxuLkhFQVBVOD12dD1uZXcgVWludDhBcnJheShWKSxuLkhFQVBVMTY9bWU9bmV3IFVpbnQxNkFycmF5KFYpLG4uSEVBUFUzMj1wZT1uZXcgVWludDMyQXJyYXkoViksbi5IRUFQRjMyPXVlPW5ldyBGbG9hdDMyQXJyYXkoViksbi5IRUFQRjY0PVF0PW5ldyBGbG9hdDY0QXJyYXkoVil9dmFyIE5lPW4uSU5JVElBTF9NRU1PUll8fDE2Nzc3MjE2LGdlLEVlPVtdLHVuPVtdLGtlPVtdLGJlPVtdLGxuPSExO2Z1bmN0aW9uIHBuKCl7aWYobi5wcmVSdW4pZm9yKHR5cGVvZiBuLnByZVJ1bj09ImZ1bmN0aW9uIiYmKG4ucHJlUnVuPVtuLnByZVJ1bl0pO24ucHJlUnVuLmxlbmd0aDspR2Uobi5wcmVSdW4uc2hpZnQoKSk7em8oRWUpfWZ1bmN0aW9uIEVuKCl7bG49ITAsem8odW4pfWZ1bmN0aW9uIHJlKCl7em8oa2UpfWZ1bmN0aW9uICR0KCl7aWYobi5wb3N0UnVuKWZvcih0eXBlb2Ygbi5wb3N0UnVuPT0iZnVuY3Rpb24iJiYobi5wb3N0UnVuPVtuLnBvc3RSdW5dKTtuLnBvc3RSdW4ubGVuZ3RoOylzbihuLnBvc3RSdW4uc2hpZnQoKSk7em8oYmUpfWZ1bmN0aW9uIEdlKFYpe0VlLnVuc2hpZnQoVil9ZnVuY3Rpb24gZG4oVil7dW4udW5zaGlmdChWKX1mdW5jdGlvbiBzbihWKXtiZS51bnNoaWZ0KFYpfXZhciBtbj0wLGZvPW51bGwsSG49bnVsbDtmdW5jdGlvbiBaZShWKXttbisrLG4ubW9uaXRvclJ1bkRlcGVuZGVuY2llcyYmbi5tb25pdG9yUnVuRGVwZW5kZW5jaWVzKG1uKX1mdW5jdGlvbiBjbihWKXtpZihtbi0tLG4ubW9uaXRvclJ1bkRlcGVuZGVuY2llcyYmbi5tb25pdG9yUnVuRGVwZW5kZW5jaWVzKG1uKSxtbj09MCYmKGZvIT09bnVsbCYmKGNsZWFySW50ZXJ2YWwoZm8pLGZvPW51bGwpLEhuKSl7dmFyIEc9SG47SG49bnVsbCxHKCl9fW4ucHJlbG9hZGVkSW1hZ2VzPXt9LG4ucHJlbG9hZGVkQXVkaW9zPXt9O2Z1bmN0aW9uIEtlKFYpe24ub25BYm9ydCYmbi5vbkFib3J0KFYpLFYrPSIiLEkoViksUz0hMCxQPTEsVj0iYWJvcnQoIitWKyIpLiBCdWlsZCB3aXRoIC1zIEFTU0VSVElPTlM9MSBmb3IgbW9yZSBpbmZvLiI7dmFyIEc9bmV3IFdlYkFzc2VtYmx5LlJ1bnRpbWVFcnJvcihWKTt0aHJvdyByKEcpLEd9ZnVuY3Rpb24gaG4oVixHKXtyZXR1cm4gU3RyaW5nLnByb3RvdHlwZS5zdGFydHNXaXRoP1Yuc3RhcnRzV2l0aChHKTpWLmluZGV4T2YoRyk9PT0wfXZhciB1bz0iZGF0YTphcHBsaWNhdGlvbi9vY3RldC1zdHJlYW07YmFzZTY0LCI7ZnVuY3Rpb24gcW4oVil7cmV0dXJuIGhuKFYsdW8pfXZhciBLbj0iZmlsZTovLyI7ZnVuY3Rpb24gbG8oVil7cmV0dXJuIGhuKFYsS24pfXZhciB6ZT0iYmFzaXNfdHJhbnNjb2Rlci53YXNtIjtxbih6ZSl8fCh6ZT1nKHplKSk7ZnVuY3Rpb24gTGUoVil7dHJ5e2lmKFY9PXplJiZMKXJldHVybiBuZXcgVWludDhBcnJheShMKTtpZihPKXJldHVybiBPKFYpO3Rocm93ImJvdGggYXN5bmMgYW5kIHN5bmMgZmV0Y2hpbmcgb2YgdGhlIHdhc20gZmFpbGVkIn1jYXRjaChHKXtLZShHKX19ZnVuY3Rpb24gRG4oKXtpZighTCYmKGx8fHApKXtpZih0eXBlb2YgZmV0Y2g9PSJmdW5jdGlvbiImJiFsbyh6ZSkpcmV0dXJuIGZldGNoKHplLHtjcmVkZW50aWFsczoic2FtZS1vcmlnaW4ifSkudGhlbihmdW5jdGlvbihWKXtpZighVi5vayl0aHJvdyJmYWlsZWQgdG8gbG9hZCB3YXNtIGJpbmFyeSBmaWxlIGF0ICciK3plKyInIjtyZXR1cm4gVi5hcnJheUJ1ZmZlcigpfSkuY2F0Y2goZnVuY3Rpb24oKXtyZXR1cm4gTGUoemUpfSk7aWYoVClyZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24oVixHKXtUKHplLGZ1bmN0aW9uKFkpe1YobmV3IFVpbnQ4QXJyYXkoWSkpfSxHKX0pfXJldHVybiBQcm9taXNlLnJlc29sdmUoKS50aGVuKGZ1bmN0aW9uKCl7cmV0dXJuIExlKHplKX0pfWZ1bmN0aW9uIFduKCl7dmFyIFY9e2E6Rmx9O2Z1bmN0aW9uIEcoU3QsaHQpe3ZhciBfdD1TdC5leHBvcnRzO24uYXNtPV90LEE9bi5hc20uSyxKdChBLmJ1ZmZlciksZ2U9bi5hc20uTyxkbihuLmFzbS5MKSxjbigid2FzbS1pbnN0YW50aWF0ZSIpfVplKCJ3YXNtLWluc3RhbnRpYXRlIik7ZnVuY3Rpb24gWShTdCl7RyhTdC5pbnN0YW5jZSl9ZnVuY3Rpb24gSihTdCl7cmV0dXJuIERuKCkudGhlbihmdW5jdGlvbihodCl7dmFyIF90PVdlYkFzc2VtYmx5Lmluc3RhbnRpYXRlKGh0LFYpO3JldHVybiBfdH0pLnRoZW4oU3QsZnVuY3Rpb24oaHQpe0koImZhaWxlZCB0byBhc3luY2hyb25vdXNseSBwcmVwYXJlIHdhc206ICIraHQpLEtlKGh0KX0pfWZ1bmN0aW9uIGx0KCl7cmV0dXJuIUwmJnR5cGVvZiBXZWJBc3NlbWJseS5pbnN0YW50aWF0ZVN0cmVhbWluZz09ImZ1bmN0aW9uIiYmIXFuKHplKSYmIWxvKHplKSYmdHlwZW9mIGZldGNoPT0iZnVuY3Rpb24iP2ZldGNoKHplLHtjcmVkZW50aWFsczoic2FtZS1vcmlnaW4ifSkudGhlbihmdW5jdGlvbihTdCl7dmFyIGh0PVdlYkFzc2VtYmx5Lmluc3RhbnRpYXRlU3RyZWFtaW5nKFN0LFYpO3JldHVybiBodC50aGVuKFksZnVuY3Rpb24oX3Qpe3JldHVybiBJKCJ3YXNtIHN0cmVhbWluZyBjb21waWxlIGZhaWxlZDogIitfdCksSSgiZmFsbGluZyBiYWNrIHRvIEFycmF5QnVmZmVyIGluc3RhbnRpYXRpb24iKSxKKFkpfSl9KTpKKFkpfWlmKG4uaW5zdGFudGlhdGVXYXNtKXRyeXt2YXIgT3Q9bi5pbnN0YW50aWF0ZVdhc20oVixHKTtyZXR1cm4gT3R9Y2F0Y2goU3Qpe3JldHVybiBJKCJNb2R1bGUuaW5zdGFudGlhdGVXYXNtIGNhbGxiYWNrIGZhaWxlZCB3aXRoIGVycm9yOiAiK1N0KSwhMX1yZXR1cm4gbHQoKS5jYXRjaChyKSx7fX1mdW5jdGlvbiB6byhWKXtmb3IoO1YubGVuZ3RoPjA7KXt2YXIgRz1WLnNoaWZ0KCk7aWYodHlwZW9mIEc9PSJmdW5jdGlvbiIpe0cobik7Y29udGludWV9dmFyIFk9Ry5mdW5jO3R5cGVvZiBZPT0ibnVtYmVyIj9HLmFyZz09PXZvaWQgMD9nZS5nZXQoWSkoKTpnZS5nZXQoWSkoRy5hcmcpOlkoRy5hcmc9PT12b2lkIDA/bnVsbDpHLmFyZyl9fXZhciBybj17fTtmdW5jdGlvbiBSbihWKXtmb3IoO1YubGVuZ3RoOyl7dmFyIEc9Vi5wb3AoKSxZPVYucG9wKCk7WShHKX19ZnVuY3Rpb24gYXIoVil7cmV0dXJuIHRoaXMuZnJvbVdpcmVUeXBlKHBlW1Y+PjJdKX12YXIgUW49e30sam89e30sTnI9e30sTnM9NDgsSXM9NTc7ZnVuY3Rpb24gWWkoVil7aWYoVj09PXZvaWQgMClyZXR1cm4iX3Vua25vd24iO1Y9Vi5yZXBsYWNlKC9bXmEtekEtWjAtOV9dL2csIiQiKTt2YXIgRz1WLmNoYXJDb2RlQXQoMCk7cmV0dXJuIEc+PU5zJiZHPD1Jcz8iXyIrVjpWfWZ1bmN0aW9uIElyKFYsRyl7cmV0dXJuIFY9WWkoViksbmV3IEZ1bmN0aW9uKCJib2R5IiwicmV0dXJuIGZ1bmN0aW9uICIrVitgKCkgewogICAgInVzZSBzdHJpY3QiOyAgICByZXR1cm4gYm9keS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwp9OwpgKShHKX1mdW5jdGlvbiAkaShWLEcpe3ZhciBZPUlyKEcsZnVuY3Rpb24oSil7dGhpcy5uYW1lPUcsdGhpcy5tZXNzYWdlPUo7dmFyIGx0PW5ldyBFcnJvcihKKS5zdGFjaztsdCE9PXZvaWQgMCYmKHRoaXMuc3RhY2s9dGhpcy50b1N0cmluZygpK2AKYCtsdC5yZXBsYWNlKC9eRXJyb3IoOlteXG5dKik/XG4vLCIiKSl9KTtyZXR1cm4gWS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShWLnByb3RvdHlwZSksWS5wcm90b3R5cGUuY29uc3RydWN0b3I9WSxZLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0aGlzLm1lc3NhZ2U9PT12b2lkIDA/dGhpcy5uYW1lOnRoaXMubmFtZSsiOiAiK3RoaXMubWVzc2FnZX0sWX12YXIgdnM9dm9pZCAwO2Z1bmN0aW9uIGJpKFYpe3Rocm93IG5ldyB2cyhWKX1mdW5jdGlvbiBvbyhWLEcsWSl7Vi5mb3JFYWNoKGZ1bmN0aW9uKGh0KXtOcltodF09R30pO2Z1bmN0aW9uIEooaHQpe3ZhciBfdD1ZKGh0KTtfdC5sZW5ndGghPT1WLmxlbmd0aCYmYmkoIk1pc21hdGNoZWQgdHlwZSBjb252ZXJ0ZXIgY291bnQiKTtmb3IodmFyIEt0PTA7S3Q8Vi5sZW5ndGg7KytLdClvcihWW0t0XSxfdFtLdF0pfXZhciBsdD1uZXcgQXJyYXkoRy5sZW5ndGgpLE90PVtdLFN0PTA7Ry5mb3JFYWNoKGZ1bmN0aW9uKGh0LF90KXtqby5oYXNPd25Qcm9wZXJ0eShodCk/bHRbX3RdPWpvW2h0XTooT3QucHVzaChodCksUW4uaGFzT3duUHJvcGVydHkoaHQpfHwoUW5baHRdPVtdKSxRbltodF0ucHVzaChmdW5jdGlvbigpe2x0W190XT1qb1todF0sKytTdCxTdD09PU90Lmxlbmd0aCYmSihsdCl9KSl9KSxPdC5sZW5ndGg9PT0wJiZKKGx0KX1mdW5jdGlvbiBwbyhWKXt2YXIgRz1ybltWXTtkZWxldGUgcm5bVl07dmFyIFk9Ry5yYXdDb25zdHJ1Y3RvcixKPUcucmF3RGVzdHJ1Y3RvcixsdD1HLmZpZWxkcyxPdD1sdC5tYXAoZnVuY3Rpb24oU3Qpe3JldHVybiBTdC5nZXR0ZXJSZXR1cm5UeXBlfSkuY29uY2F0KGx0Lm1hcChmdW5jdGlvbihTdCl7cmV0dXJuIFN0LnNldHRlckFyZ3VtZW50VHlwZX0pKTtvbyhbVl0sT3QsZnVuY3Rpb24oU3Qpe3ZhciBodD17fTtyZXR1cm4gbHQuZm9yRWFjaChmdW5jdGlvbihfdCxLdCl7dmFyIHRlPV90LmZpZWxkTmFtZSx3ZT1TdFtLdF0sSmU9X3QuZ2V0dGVyLGJuPV90LmdldHRlckNvbnRleHQscm89U3RbS3QrbHQubGVuZ3RoXSxJbz1fdC5zZXR0ZXIsbHI9X3Quc2V0dGVyQ29udGV4dDtodFt0ZV09e3JlYWQ6ZnVuY3Rpb24oWnIpe3JldHVybiB3ZS5mcm9tV2lyZVR5cGUoSmUoYm4sWnIpKX0sd3JpdGU6ZnVuY3Rpb24oWnIsb2Ype3ZhciBFaT1bXTtJbyhscixacixyby50b1dpcmVUeXBlKEVpLG9mKSksUm4oRWkpfX19KSxbe25hbWU6Ry5uYW1lLGZyb21XaXJlVHlwZTpmdW5jdGlvbihfdCl7dmFyIEt0PXt9O2Zvcih2YXIgdGUgaW4gaHQpS3RbdGVdPWh0W3RlXS5yZWFkKF90KTtyZXR1cm4gSihfdCksS3R9LHRvV2lyZVR5cGU6ZnVuY3Rpb24oX3QsS3Qpe2Zvcih2YXIgdGUgaW4gaHQpaWYoISh0ZSBpbiBLdCkpdGhyb3cgbmV3IFR5cGVFcnJvcignTWlzc2luZyBmaWVsZDogICInK3RlKyciJyk7dmFyIHdlPVkoKTtmb3IodGUgaW4gaHQpaHRbdGVdLndyaXRlKHdlLEt0W3RlXSk7cmV0dXJuIF90IT09bnVsbCYmX3QucHVzaChKLHdlKSx3ZX0sYXJnUGFja0FkdmFuY2U6OCxyZWFkVmFsdWVGcm9tUG9pbnRlcjphcixkZXN0cnVjdG9yRnVuY3Rpb246Sn1dfSl9ZnVuY3Rpb24gdnIoVil7c3dpdGNoKFYpe2Nhc2UgMTpyZXR1cm4gMDtjYXNlIDI6cmV0dXJuIDE7Y2FzZSA0OnJldHVybiAyO2Nhc2UgODpyZXR1cm4gMztkZWZhdWx0OnRocm93IG5ldyBUeXBlRXJyb3IoIlVua25vd24gdHlwZSBzaXplOiAiK1YpfX1mdW5jdGlvbiBNYygpe2Zvcih2YXIgVj1uZXcgQXJyYXkoMjU2KSxHPTA7RzwyNTY7KytHKVZbR109U3RyaW5nLmZyb21DaGFyQ29kZShHKTtOYz1WfXZhciBOYz12b2lkIDA7ZnVuY3Rpb24gRm4oVil7Zm9yKHZhciBHPSIiLFk9Vjt2dFtZXTspRys9TmNbdnRbWSsrXV07cmV0dXJuIEd9dmFyIFRpPXZvaWQgMDtmdW5jdGlvbiBEZShWKXt0aHJvdyBuZXcgVGkoVil9ZnVuY3Rpb24gb3IoVixHLFkpe2lmKFk9WXx8e30sISgiYXJnUGFja0FkdmFuY2UiaW4gRykpdGhyb3cgbmV3IFR5cGVFcnJvcigicmVnaXN0ZXJUeXBlIHJlZ2lzdGVyZWRJbnN0YW5jZSByZXF1aXJlcyBhcmdQYWNrQWR2YW5jZSIpO3ZhciBKPUcubmFtZTtpZihWfHxEZSgndHlwZSAiJytKKyciIG11c3QgaGF2ZSBhIHBvc2l0aXZlIGludGVnZXIgdHlwZWlkIHBvaW50ZXInKSxqby5oYXNPd25Qcm9wZXJ0eShWKSl7aWYoWS5pZ25vcmVEdXBsaWNhdGVSZWdpc3RyYXRpb25zKXJldHVybjtEZSgiQ2Fubm90IHJlZ2lzdGVyIHR5cGUgJyIrSisiJyB0d2ljZSIpfWlmKGpvW1ZdPUcsZGVsZXRlIE5yW1ZdLFFuLmhhc093blByb3BlcnR5KFYpKXt2YXIgbHQ9UW5bVl07ZGVsZXRlIFFuW1ZdLGx0LmZvckVhY2goZnVuY3Rpb24oT3Qpe090KCl9KX19ZnVuY3Rpb24gQXUoVixHLFksSixsdCl7dmFyIE90PXZyKFkpO0c9Rm4oRyksb3IoVix7bmFtZTpHLGZyb21XaXJlVHlwZTpmdW5jdGlvbihTdCl7cmV0dXJuISFTdH0sdG9XaXJlVHlwZTpmdW5jdGlvbihTdCxodCl7cmV0dXJuIGh0P0o6bHR9LGFyZ1BhY2tBZHZhbmNlOjgscmVhZFZhbHVlRnJvbVBvaW50ZXI6ZnVuY3Rpb24oU3Qpe3ZhciBodDtpZihZPT09MSlodD11dDtlbHNlIGlmKFk9PT0yKWh0PXp0O2Vsc2UgaWYoWT09PTQpaHQ9Y2U7ZWxzZSB0aHJvdyBuZXcgVHlwZUVycm9yKCJVbmtub3duIGJvb2xlYW4gdHlwZSBzaXplOiAiK0cpO3JldHVybiB0aGlzLmZyb21XaXJlVHlwZShodFtTdD4+T3RdKX0sZGVzdHJ1Y3RvckZ1bmN0aW9uOm51bGx9KX1mdW5jdGlvbiBidShWKXtpZighKHRoaXMgaW5zdGFuY2VvZiBMcil8fCEoViBpbnN0YW5jZW9mIExyKSlyZXR1cm4hMTtmb3IodmFyIEc9dGhpcy4kJC5wdHJUeXBlLnJlZ2lzdGVyZWRDbGFzcyxZPXRoaXMuJCQucHRyLEo9Vi4kJC5wdHJUeXBlLnJlZ2lzdGVyZWRDbGFzcyxsdD1WLiQkLnB0cjtHLmJhc2VDbGFzczspWT1HLnVwY2FzdChZKSxHPUcuYmFzZUNsYXNzO2Zvcig7Si5iYXNlQ2xhc3M7KWx0PUoudXBjYXN0KGx0KSxKPUouYmFzZUNsYXNzO3JldHVybiBHPT09SiYmWT09PWx0fWZ1bmN0aW9uIFR1KFYpe3JldHVybntjb3VudDpWLmNvdW50LGRlbGV0ZVNjaGVkdWxlZDpWLmRlbGV0ZVNjaGVkdWxlZCxwcmVzZXJ2ZVBvaW50ZXJPbkRlbGV0ZTpWLnByZXNlcnZlUG9pbnRlck9uRGVsZXRlLHB0cjpWLnB0cixwdHJUeXBlOlYucHRyVHlwZSxzbWFydFB0cjpWLnNtYXJ0UHRyLHNtYXJ0UHRyVHlwZTpWLnNtYXJ0UHRyVHlwZX19ZnVuY3Rpb24gSWMoVil7ZnVuY3Rpb24gRyhZKXtyZXR1cm4gWS4kJC5wdHJUeXBlLnJlZ2lzdGVyZWRDbGFzcy5uYW1lfURlKEcoVikrIiBpbnN0YW5jZSBhbHJlYWR5IGRlbGV0ZWQiKX12YXIgdmM9ITE7ZnVuY3Rpb24gSGEoVil7fWZ1bmN0aW9uIHd1KFYpe1Yuc21hcnRQdHI/Vi5zbWFydFB0clR5cGUucmF3RGVzdHJ1Y3RvcihWLnNtYXJ0UHRyKTpWLnB0clR5cGUucmVnaXN0ZXJlZENsYXNzLnJhd0Rlc3RydWN0b3IoVi5wdHIpfWZ1bmN0aW9uIHFhKFYpe1YuY291bnQudmFsdWUtPTE7dmFyIEc9Vi5jb3VudC52YWx1ZT09PTA7RyYmd3UoVil9ZnVuY3Rpb24gWmkoVil7cmV0dXJuIHR5cGVvZiBGaW5hbGl6YXRpb25Hcm91cD4idSI/KFppPWZ1bmN0aW9uKEcpe3JldHVybiBHfSxWKToodmM9bmV3IEZpbmFsaXphdGlvbkdyb3VwKGZ1bmN0aW9uKEcpe2Zvcih2YXIgWT1HLm5leHQoKTshWS5kb25lO1k9Ry5uZXh0KCkpe3ZhciBKPVkudmFsdWU7Si5wdHI/cWEoSik6Y29uc29sZS53YXJuKCJvYmplY3QgYWxyZWFkeSBkZWxldGVkOiAiK0oucHRyKX19KSxaaT1mdW5jdGlvbihHKXtyZXR1cm4gdmMucmVnaXN0ZXIoRyxHLiQkLEcuJCQpLEd9LEhhPWZ1bmN0aW9uKEcpe3ZjLnVucmVnaXN0ZXIoRy4kJCl9LFppKFYpKX1mdW5jdGlvbiBPdSgpe2lmKHRoaXMuJCQucHRyfHxJYyh0aGlzKSx0aGlzLiQkLnByZXNlcnZlUG9pbnRlck9uRGVsZXRlKXJldHVybiB0aGlzLiQkLmNvdW50LnZhbHVlKz0xLHRoaXM7dmFyIFY9WmkoT2JqZWN0LmNyZWF0ZShPYmplY3QuZ2V0UHJvdG90eXBlT2YodGhpcykseyQkOnt2YWx1ZTpUdSh0aGlzLiQkKX19KSk7cmV0dXJuIFYuJCQuY291bnQudmFsdWUrPTEsVi4kJC5kZWxldGVTY2hlZHVsZWQ9ITEsVn1mdW5jdGlvbiBFdSgpe3RoaXMuJCQucHRyfHxJYyh0aGlzKSx0aGlzLiQkLmRlbGV0ZVNjaGVkdWxlZCYmIXRoaXMuJCQucHJlc2VydmVQb2ludGVyT25EZWxldGUmJkRlKCJPYmplY3QgYWxyZWFkeSBzY2hlZHVsZWQgZm9yIGRlbGV0aW9uIiksSGEodGhpcykscWEodGhpcy4kJCksdGhpcy4kJC5wcmVzZXJ2ZVBvaW50ZXJPbkRlbGV0ZXx8KHRoaXMuJCQuc21hcnRQdHI9dm9pZCAwLHRoaXMuJCQucHRyPXZvaWQgMCl9ZnVuY3Rpb24gUnUoKXtyZXR1cm4hdGhpcy4kJC5wdHJ9dmFyIFFpPXZvaWQgMCxKaT1bXTtmdW5jdGlvbiBMYygpe2Zvcig7SmkubGVuZ3RoOyl7dmFyIFY9SmkucG9wKCk7Vi4kJC5kZWxldGVTY2hlZHVsZWQ9ITEsVi5kZWxldGUoKX19ZnVuY3Rpb24gU3UoKXtyZXR1cm4gdGhpcy4kJC5wdHJ8fEljKHRoaXMpLHRoaXMuJCQuZGVsZXRlU2NoZWR1bGVkJiYhdGhpcy4kJC5wcmVzZXJ2ZVBvaW50ZXJPbkRlbGV0ZSYmRGUoIk9iamVjdCBhbHJlYWR5IHNjaGVkdWxlZCBmb3IgZGVsZXRpb24iKSxKaS5wdXNoKHRoaXMpLEppLmxlbmd0aD09PTEmJlFpJiZRaShMYyksdGhpcy4kJC5kZWxldGVTY2hlZHVsZWQ9ITAsdGhpc31mdW5jdGlvbiBDdSgpe0xyLnByb3RvdHlwZS5pc0FsaWFzT2Y9YnUsTHIucHJvdG90eXBlLmNsb25lPU91LExyLnByb3RvdHlwZS5kZWxldGU9RXUsTHIucHJvdG90eXBlLmlzRGVsZXRlZD1SdSxMci5wcm90b3R5cGUuZGVsZXRlTGF0ZXI9U3V9ZnVuY3Rpb24gTHIoKXt9dmFyIEthPXt9O2Z1bmN0aW9uIFdhKFYsRyxZKXtpZihWW0ddLm92ZXJsb2FkVGFibGU9PT12b2lkIDApe3ZhciBKPVZbR107VltHXT1mdW5jdGlvbigpe3JldHVybiBWW0ddLm92ZXJsb2FkVGFibGUuaGFzT3duUHJvcGVydHkoYXJndW1lbnRzLmxlbmd0aCl8fERlKCJGdW5jdGlvbiAnIitZKyInIGNhbGxlZCB3aXRoIGFuIGludmFsaWQgbnVtYmVyIG9mIGFyZ3VtZW50cyAoIithcmd1bWVudHMubGVuZ3RoKyIpIC0gZXhwZWN0cyBvbmUgb2YgKCIrVltHXS5vdmVybG9hZFRhYmxlKyIpISIpLFZbR10ub3ZlcmxvYWRUYWJsZVthcmd1bWVudHMubGVuZ3RoXS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LFZbR10ub3ZlcmxvYWRUYWJsZT1bXSxWW0ddLm92ZXJsb2FkVGFibGVbSi5hcmdDb3VudF09Sn19ZnVuY3Rpb24gRGMoVixHLFkpe24uaGFzT3duUHJvcGVydHkoVik/KChZPT09dm9pZCAwfHxuW1ZdLm92ZXJsb2FkVGFibGUhPT12b2lkIDAmJm5bVl0ub3ZlcmxvYWRUYWJsZVtZXSE9PXZvaWQgMCkmJkRlKCJDYW5ub3QgcmVnaXN0ZXIgcHVibGljIG5hbWUgJyIrVisiJyB0d2ljZSIpLFdhKG4sVixWKSxuLmhhc093blByb3BlcnR5KFkpJiZEZSgiQ2Fubm90IHJlZ2lzdGVyIG11bHRpcGxlIG92ZXJsb2FkcyBvZiBhIGZ1bmN0aW9uIHdpdGggdGhlIHNhbWUgbnVtYmVyIG9mIGFyZ3VtZW50cyAoIitZKyIpISIpLG5bVl0ub3ZlcmxvYWRUYWJsZVtZXT1HKToobltWXT1HLFkhPT12b2lkIDAmJihuW1ZdLm51bUFyZ3VtZW50cz1ZKSl9ZnVuY3Rpb24geHUoVixHLFksSixsdCxPdCxTdCxodCl7dGhpcy5uYW1lPVYsdGhpcy5jb25zdHJ1Y3Rvcj1HLHRoaXMuaW5zdGFuY2VQcm90b3R5cGU9WSx0aGlzLnJhd0Rlc3RydWN0b3I9Six0aGlzLmJhc2VDbGFzcz1sdCx0aGlzLmdldEFjdHVhbFR5cGU9T3QsdGhpcy51cGNhc3Q9U3QsdGhpcy5kb3duY2FzdD1odCx0aGlzLnB1cmVWaXJ0dWFsRnVuY3Rpb25zPVtdfWZ1bmN0aW9uIEZjKFYsRyxZKXtmb3IoO0chPT1ZOylHLnVwY2FzdHx8RGUoIkV4cGVjdGVkIG51bGwgb3IgaW5zdGFuY2Ugb2YgIitZLm5hbWUrIiwgZ290IGFuIGluc3RhbmNlIG9mICIrRy5uYW1lKSxWPUcudXBjYXN0KFYpLEc9Ry5iYXNlQ2xhc3M7cmV0dXJuIFZ9ZnVuY3Rpb24gUHUoVixHKXtpZihHPT09bnVsbClyZXR1cm4gdGhpcy5pc1JlZmVyZW5jZSYmRGUoIm51bGwgaXMgbm90IGEgdmFsaWQgIit0aGlzLm5hbWUpLDA7Ry4kJHx8RGUoJ0Nhbm5vdCBwYXNzICInK3dpKEcpKyciIGFzIGEgJyt0aGlzLm5hbWUpLEcuJCQucHRyfHxEZSgiQ2Fubm90IHBhc3MgZGVsZXRlZCBvYmplY3QgYXMgYSBwb2ludGVyIG9mIHR5cGUgIit0aGlzLm5hbWUpO3ZhciBZPUcuJCQucHRyVHlwZS5yZWdpc3RlcmVkQ2xhc3MsSj1GYyhHLiQkLnB0cixZLHRoaXMucmVnaXN0ZXJlZENsYXNzKTtyZXR1cm4gSn1mdW5jdGlvbiBNdShWLEcpe3ZhciBZO2lmKEc9PT1udWxsKXJldHVybiB0aGlzLmlzUmVmZXJlbmNlJiZEZSgibnVsbCBpcyBub3QgYSB2YWxpZCAiK3RoaXMubmFtZSksdGhpcy5pc1NtYXJ0UG9pbnRlcj8oWT10aGlzLnJhd0NvbnN0cnVjdG9yKCksViE9PW51bGwmJlYucHVzaCh0aGlzLnJhd0Rlc3RydWN0b3IsWSksWSk6MDtHLiQkfHxEZSgnQ2Fubm90IHBhc3MgIicrd2koRykrJyIgYXMgYSAnK3RoaXMubmFtZSksRy4kJC5wdHJ8fERlKCJDYW5ub3QgcGFzcyBkZWxldGVkIG9iamVjdCBhcyBhIHBvaW50ZXIgb2YgdHlwZSAiK3RoaXMubmFtZSksIXRoaXMuaXNDb25zdCYmRy4kJC5wdHJUeXBlLmlzQ29uc3QmJkRlKCJDYW5ub3QgY29udmVydCBhcmd1bWVudCBvZiB0eXBlICIrKEcuJCQuc21hcnRQdHJUeXBlP0cuJCQuc21hcnRQdHJUeXBlLm5hbWU6Ry4kJC5wdHJUeXBlLm5hbWUpKyIgdG8gcGFyYW1ldGVyIHR5cGUgIit0aGlzLm5hbWUpO3ZhciBKPUcuJCQucHRyVHlwZS5yZWdpc3RlcmVkQ2xhc3M7aWYoWT1GYyhHLiQkLnB0cixKLHRoaXMucmVnaXN0ZXJlZENsYXNzKSx0aGlzLmlzU21hcnRQb2ludGVyKXN3aXRjaChHLiQkLnNtYXJ0UHRyPT09dm9pZCAwJiZEZSgiUGFzc2luZyByYXcgcG9pbnRlciB0byBzbWFydCBwb2ludGVyIGlzIGlsbGVnYWwiKSx0aGlzLnNoYXJpbmdQb2xpY3kpe2Nhc2UgMDpHLiQkLnNtYXJ0UHRyVHlwZT09PXRoaXM/WT1HLiQkLnNtYXJ0UHRyOkRlKCJDYW5ub3QgY29udmVydCBhcmd1bWVudCBvZiB0eXBlICIrKEcuJCQuc21hcnRQdHJUeXBlP0cuJCQuc21hcnRQdHJUeXBlLm5hbWU6Ry4kJC5wdHJUeXBlLm5hbWUpKyIgdG8gcGFyYW1ldGVyIHR5cGUgIit0aGlzLm5hbWUpO2JyZWFrO2Nhc2UgMTpZPUcuJCQuc21hcnRQdHI7YnJlYWs7Y2FzZSAyOmlmKEcuJCQuc21hcnRQdHJUeXBlPT09dGhpcylZPUcuJCQuc21hcnRQdHI7ZWxzZXt2YXIgbHQ9Ry5jbG9uZSgpO1k9dGhpcy5yYXdTaGFyZShZLHVyKGZ1bmN0aW9uKCl7bHQuZGVsZXRlKCl9KSksViE9PW51bGwmJlYucHVzaCh0aGlzLnJhd0Rlc3RydWN0b3IsWSl9YnJlYWs7ZGVmYXVsdDpEZSgiVW5zdXBwb3J0aW5nIHNoYXJpbmcgcG9saWN5Iil9cmV0dXJuIFl9ZnVuY3Rpb24gTnUoVixHKXtpZihHPT09bnVsbClyZXR1cm4gdGhpcy5pc1JlZmVyZW5jZSYmRGUoIm51bGwgaXMgbm90IGEgdmFsaWQgIit0aGlzLm5hbWUpLDA7Ry4kJHx8RGUoJ0Nhbm5vdCBwYXNzICInK3dpKEcpKyciIGFzIGEgJyt0aGlzLm5hbWUpLEcuJCQucHRyfHxEZSgiQ2Fubm90IHBhc3MgZGVsZXRlZCBvYmplY3QgYXMgYSBwb2ludGVyIG9mIHR5cGUgIit0aGlzLm5hbWUpLEcuJCQucHRyVHlwZS5pc0NvbnN0JiZEZSgiQ2Fubm90IGNvbnZlcnQgYXJndW1lbnQgb2YgdHlwZSAiK0cuJCQucHRyVHlwZS5uYW1lKyIgdG8gcGFyYW1ldGVyIHR5cGUgIit0aGlzLm5hbWUpO3ZhciBZPUcuJCQucHRyVHlwZS5yZWdpc3RlcmVkQ2xhc3MsSj1GYyhHLiQkLnB0cixZLHRoaXMucmVnaXN0ZXJlZENsYXNzKTtyZXR1cm4gSn1mdW5jdGlvbiBJdShWKXtyZXR1cm4gdGhpcy5yYXdHZXRQb2ludGVlJiYoVj10aGlzLnJhd0dldFBvaW50ZWUoVikpLFZ9ZnVuY3Rpb24gdnUoVil7dGhpcy5yYXdEZXN0cnVjdG9yJiZ0aGlzLnJhd0Rlc3RydWN0b3IoVil9ZnVuY3Rpb24gTHUoVil7ViE9PW51bGwmJlYuZGVsZXRlKCl9ZnVuY3Rpb24gWGEoVixHLFkpe2lmKEc9PT1ZKXJldHVybiBWO2lmKFkuYmFzZUNsYXNzPT09dm9pZCAwKXJldHVybiBudWxsO3ZhciBKPVhhKFYsRyxZLmJhc2VDbGFzcyk7cmV0dXJuIEo9PT1udWxsP251bGw6WS5kb3duY2FzdChKKX1mdW5jdGlvbiBEdSgpe3JldHVybiBPYmplY3Qua2V5cyh0cykubGVuZ3RofWZ1bmN0aW9uIEZ1KCl7dmFyIFY9W107Zm9yKHZhciBHIGluIHRzKXRzLmhhc093blByb3BlcnR5KEcpJiZWLnB1c2godHNbR10pO3JldHVybiBWfWZ1bmN0aW9uIEJ1KFYpe1FpPVYsSmkubGVuZ3RoJiZRaSYmUWkoTGMpfWZ1bmN0aW9uIFV1KCl7bi5nZXRJbmhlcml0ZWRJbnN0YW5jZUNvdW50PUR1LG4uZ2V0TGl2ZUluaGVyaXRlZEluc3RhbmNlcz1GdSxuLmZsdXNoUGVuZGluZ0RlbGV0ZXM9TGMsbi5zZXREZWxheUZ1bmN0aW9uPUJ1fXZhciB0cz17fTtmdW5jdGlvbiBWdShWLEcpe2ZvcihHPT09dm9pZCAwJiZEZSgicHRyIHNob3VsZCBub3QgYmUgdW5kZWZpbmVkIik7Vi5iYXNlQ2xhc3M7KUc9Vi51cGNhc3QoRyksVj1WLmJhc2VDbGFzcztyZXR1cm4gR31mdW5jdGlvbiBrdShWLEcpe3JldHVybiBHPVZ1KFYsRyksdHNbR119ZnVuY3Rpb24gTHMoVixHKXsoIUcucHRyVHlwZXx8IUcucHRyKSYmYmkoIm1ha2VDbGFzc0hhbmRsZSByZXF1aXJlcyBwdHIgYW5kIHB0clR5cGUiKTt2YXIgWT0hIUcuc21hcnRQdHJUeXBlLEo9ISFHLnNtYXJ0UHRyO3JldHVybiBZIT09SiYmYmkoIkJvdGggc21hcnRQdHJUeXBlIGFuZCBzbWFydFB0ciBtdXN0IGJlIHNwZWNpZmllZCIpLEcuY291bnQ9e3ZhbHVlOjF9LFppKE9iamVjdC5jcmVhdGUoVix7JCQ6e3ZhbHVlOkd9fSkpfWZ1bmN0aW9uIEd1KFYpe3ZhciBHPXRoaXMuZ2V0UG9pbnRlZShWKTtpZighRylyZXR1cm4gdGhpcy5kZXN0cnVjdG9yKFYpLG51bGw7dmFyIFk9a3UodGhpcy5yZWdpc3RlcmVkQ2xhc3MsRyk7aWYoWSE9PXZvaWQgMCl7aWYoWS4kJC5jb3VudC52YWx1ZT09PTApcmV0dXJuIFkuJCQucHRyPUcsWS4kJC5zbWFydFB0cj1WLFkuY2xvbmUoKTt2YXIgSj1ZLmNsb25lKCk7cmV0dXJuIHRoaXMuZGVzdHJ1Y3RvcihWKSxKfWZ1bmN0aW9uIGx0KCl7cmV0dXJuIHRoaXMuaXNTbWFydFBvaW50ZXI/THModGhpcy5yZWdpc3RlcmVkQ2xhc3MuaW5zdGFuY2VQcm90b3R5cGUse3B0clR5cGU6dGhpcy5wb2ludGVlVHlwZSxwdHI6RyxzbWFydFB0clR5cGU6dGhpcyxzbWFydFB0cjpWfSk6THModGhpcy5yZWdpc3RlcmVkQ2xhc3MuaW5zdGFuY2VQcm90b3R5cGUse3B0clR5cGU6dGhpcyxwdHI6Vn0pfXZhciBPdD10aGlzLnJlZ2lzdGVyZWRDbGFzcy5nZXRBY3R1YWxUeXBlKEcpLFN0PUthW090XTtpZighU3QpcmV0dXJuIGx0LmNhbGwodGhpcyk7dmFyIGh0O3RoaXMuaXNDb25zdD9odD1TdC5jb25zdFBvaW50ZXJUeXBlOmh0PVN0LnBvaW50ZXJUeXBlO3ZhciBfdD1YYShHLHRoaXMucmVnaXN0ZXJlZENsYXNzLGh0LnJlZ2lzdGVyZWRDbGFzcyk7cmV0dXJuIF90PT09bnVsbD9sdC5jYWxsKHRoaXMpOnRoaXMuaXNTbWFydFBvaW50ZXI/THMoaHQucmVnaXN0ZXJlZENsYXNzLmluc3RhbmNlUHJvdG90eXBlLHtwdHJUeXBlOmh0LHB0cjpfdCxzbWFydFB0clR5cGU6dGhpcyxzbWFydFB0cjpWfSk6THMoaHQucmVnaXN0ZXJlZENsYXNzLmluc3RhbmNlUHJvdG90eXBlLHtwdHJUeXBlOmh0LHB0cjpfdH0pfWZ1bmN0aW9uIHp1KCl7ZnIucHJvdG90eXBlLmdldFBvaW50ZWU9SXUsZnIucHJvdG90eXBlLmRlc3RydWN0b3I9dnUsZnIucHJvdG90eXBlLmFyZ1BhY2tBZHZhbmNlPTgsZnIucHJvdG90eXBlLnJlYWRWYWx1ZUZyb21Qb2ludGVyPWFyLGZyLnByb3RvdHlwZS5kZWxldGVPYmplY3Q9THUsZnIucHJvdG90eXBlLmZyb21XaXJlVHlwZT1HdX1mdW5jdGlvbiBmcihWLEcsWSxKLGx0LE90LFN0LGh0LF90LEt0LHRlKXt0aGlzLm5hbWU9Vix0aGlzLnJlZ2lzdGVyZWRDbGFzcz1HLHRoaXMuaXNSZWZlcmVuY2U9WSx0aGlzLmlzQ29uc3Q9Six0aGlzLmlzU21hcnRQb2ludGVyPWx0LHRoaXMucG9pbnRlZVR5cGU9T3QsdGhpcy5zaGFyaW5nUG9saWN5PVN0LHRoaXMucmF3R2V0UG9pbnRlZT1odCx0aGlzLnJhd0NvbnN0cnVjdG9yPV90LHRoaXMucmF3U2hhcmU9S3QsdGhpcy5yYXdEZXN0cnVjdG9yPXRlLCFsdCYmRy5iYXNlQ2xhc3M9PT12b2lkIDA/Sj8odGhpcy50b1dpcmVUeXBlPVB1LHRoaXMuZGVzdHJ1Y3RvckZ1bmN0aW9uPW51bGwpOih0aGlzLnRvV2lyZVR5cGU9TnUsdGhpcy5kZXN0cnVjdG9yRnVuY3Rpb249bnVsbCk6dGhpcy50b1dpcmVUeXBlPU11fWZ1bmN0aW9uIFlhKFYsRyxZKXtuLmhhc093blByb3BlcnR5KFYpfHxiaSgiUmVwbGFjaW5nIG5vbmV4aXN0YW50IHB1YmxpYyBzeW1ib2wiKSxuW1ZdLm92ZXJsb2FkVGFibGUhPT12b2lkIDAmJlkhPT12b2lkIDA/bltWXS5vdmVybG9hZFRhYmxlW1ldPUc6KG5bVl09RyxuW1ZdLmFyZ0NvdW50PVkpfWZ1bmN0aW9uIGp1KFYsRyxZKXt2YXIgSj1uWyJkeW5DYWxsXyIrVl07cmV0dXJuIFkmJlkubGVuZ3RoP0ouYXBwbHkobnVsbCxbR10uY29uY2F0KFkpKTpKLmNhbGwobnVsbCxHKX1mdW5jdGlvbiBIdShWLEcsWSl7cmV0dXJuIFYuaW5kZXhPZigiaiIpIT0tMT9qdShWLEcsWSk6Z2UuZ2V0KEcpLmFwcGx5KG51bGwsWSl9ZnVuY3Rpb24gcXUoVixHKXt2YXIgWT1bXTtyZXR1cm4gZnVuY3Rpb24oKXtZLmxlbmd0aD1hcmd1bWVudHMubGVuZ3RoO2Zvcih2YXIgSj0wO0o8YXJndW1lbnRzLmxlbmd0aDtKKyspWVtKXT1hcmd1bWVudHNbSl07cmV0dXJuIEh1KFYsRyxZKX19ZnVuY3Rpb24gSG8oVixHKXtWPUZuKFYpO2Z1bmN0aW9uIFkoKXtyZXR1cm4gVi5pbmRleE9mKCJqIikhPS0xP3F1KFYsRyk6Z2UuZ2V0KEcpfXZhciBKPVkoKTtyZXR1cm4gdHlwZW9mIEohPSJmdW5jdGlvbiImJkRlKCJ1bmtub3duIGZ1bmN0aW9uIHBvaW50ZXIgd2l0aCBzaWduYXR1cmUgIitWKyI6ICIrRyksSn12YXIgJGE9dm9pZCAwO2Z1bmN0aW9uIFphKFYpe3ZhciBHPWV0KFYpLFk9Rm4oRyk7cmV0dXJuIFcoRyksWX1mdW5jdGlvbiBEcyhWLEcpe3ZhciBZPVtdLEo9e307ZnVuY3Rpb24gbHQoT3Qpe2lmKCFKW090XSYmIWpvW090XSl7aWYoTnJbT3RdKXtOcltPdF0uZm9yRWFjaChsdCk7cmV0dXJufVkucHVzaChPdCksSltPdF09ITB9fXRocm93IEcuZm9yRWFjaChsdCksbmV3ICRhKFYrIjogIitZLm1hcChaYSkuam9pbihbIiwgIl0pKX1mdW5jdGlvbiBLdShWLEcsWSxKLGx0LE90LFN0LGh0LF90LEt0LHRlLHdlLEplKXt0ZT1Gbih0ZSksT3Q9SG8obHQsT3QpLGh0JiYoaHQ9SG8oU3QsaHQpKSxLdCYmKEt0PUhvKF90LEt0KSksSmU9SG8od2UsSmUpO3ZhciBibj1ZaSh0ZSk7RGMoYm4sZnVuY3Rpb24oKXtEcygiQ2Fubm90IGNvbnN0cnVjdCAiK3RlKyIgZHVlIHRvIHVuYm91bmQgdHlwZXMiLFtKXSl9KSxvbyhbVixHLFldLEo/W0pdOltdLGZ1bmN0aW9uKHJvKXtybz1yb1swXTt2YXIgSW8sbHI7Sj8oSW89cm8ucmVnaXN0ZXJlZENsYXNzLGxyPUlvLmluc3RhbmNlUHJvdG90eXBlKTpscj1Mci5wcm90b3R5cGU7dmFyIFpyPUlyKGJuLGZ1bmN0aW9uKCl7aWYoT2JqZWN0LmdldFByb3RvdHlwZU9mKHRoaXMpIT09b2YpdGhyb3cgbmV3IFRpKCJVc2UgJ25ldycgdG8gY29uc3RydWN0ICIrdGUpO2lmKEVpLmNvbnN0cnVjdG9yX2JvZHk9PT12b2lkIDApdGhyb3cgbmV3IFRpKHRlKyIgaGFzIG5vIGFjY2Vzc2libGUgY29uc3RydWN0b3IiKTt2YXIgbDE9RWkuY29uc3RydWN0b3JfYm9keVthcmd1bWVudHMubGVuZ3RoXTtpZihsMT09PXZvaWQgMCl0aHJvdyBuZXcgVGkoIlRyaWVkIHRvIGludm9rZSBjdG9yIG9mICIrdGUrIiB3aXRoIGludmFsaWQgbnVtYmVyIG9mIHBhcmFtZXRlcnMgKCIrYXJndW1lbnRzLmxlbmd0aCsiKSAtIGV4cGVjdGVkICgiK09iamVjdC5rZXlzKEVpLmNvbnN0cnVjdG9yX2JvZHkpLnRvU3RyaW5nKCkrIikgcGFyYW1ldGVycyBpbnN0ZWFkISIpO3JldHVybiBsMS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9KSxvZj1PYmplY3QuY3JlYXRlKGxyLHtjb25zdHJ1Y3Rvcjp7dmFsdWU6WnJ9fSk7WnIucHJvdG90eXBlPW9mO3ZhciBFaT1uZXcgeHUodGUsWnIsb2YsSmUsSW8sT3QsaHQsS3QpLFdTPW5ldyBmcih0ZSxFaSwhMCwhMSwhMSksZjE9bmV3IGZyKHRlKyIqIixFaSwhMSwhMSwhMSksdTE9bmV3IGZyKHRlKyIgY29uc3QqIixFaSwhMSwhMCwhMSk7cmV0dXJuIEthW1ZdPXtwb2ludGVyVHlwZTpmMSxjb25zdFBvaW50ZXJUeXBlOnUxfSxZYShibixaciksW1dTLGYxLHUxXX0pfWZ1bmN0aW9uIEJjKFYsRyl7Zm9yKHZhciBZPVtdLEo9MDtKPFY7SisrKVkucHVzaChjZVsoRz4+MikrSl0pO3JldHVybiBZfWZ1bmN0aW9uIFd1KFYsRyxZLEosbHQsT3Qpe0YoRz4wKTt2YXIgU3Q9QmMoRyxZKTtsdD1IbyhKLGx0KTt2YXIgaHQ9W090XSxfdD1bXTtvbyhbXSxbVl0sZnVuY3Rpb24oS3Qpe0t0PUt0WzBdO3ZhciB0ZT0iY29uc3RydWN0b3IgIitLdC5uYW1lO2lmKEt0LnJlZ2lzdGVyZWRDbGFzcy5jb25zdHJ1Y3Rvcl9ib2R5PT09dm9pZCAwJiYoS3QucmVnaXN0ZXJlZENsYXNzLmNvbnN0cnVjdG9yX2JvZHk9W10pLEt0LnJlZ2lzdGVyZWRDbGFzcy5jb25zdHJ1Y3Rvcl9ib2R5W0ctMV0hPT12b2lkIDApdGhyb3cgbmV3IFRpKCJDYW5ub3QgcmVnaXN0ZXIgbXVsdGlwbGUgY29uc3RydWN0b3JzIHdpdGggaWRlbnRpY2FsIG51bWJlciBvZiBwYXJhbWV0ZXJzICgiKyhHLTEpKyIpIGZvciBjbGFzcyAnIitLdC5uYW1lKyInISBPdmVybG9hZCByZXNvbHV0aW9uIGlzIGN1cnJlbnRseSBvbmx5IHBlcmZvcm1lZCB1c2luZyB0aGUgcGFyYW1ldGVyIGNvdW50LCBub3QgYWN0dWFsIHR5cGUgaW5mbyEiKTtyZXR1cm4gS3QucmVnaXN0ZXJlZENsYXNzLmNvbnN0cnVjdG9yX2JvZHlbRy0xXT1mdW5jdGlvbigpe0RzKCJDYW5ub3QgY29uc3RydWN0ICIrS3QubmFtZSsiIGR1ZSB0byB1bmJvdW5kIHR5cGVzIixTdCl9LG9vKFtdLFN0LGZ1bmN0aW9uKHdlKXtyZXR1cm4gS3QucmVnaXN0ZXJlZENsYXNzLmNvbnN0cnVjdG9yX2JvZHlbRy0xXT1mdW5jdGlvbigpe2FyZ3VtZW50cy5sZW5ndGghPT1HLTEmJkRlKHRlKyIgY2FsbGVkIHdpdGggIithcmd1bWVudHMubGVuZ3RoKyIgYXJndW1lbnRzLCBleHBlY3RlZCAiKyhHLTEpKSxfdC5sZW5ndGg9MCxodC5sZW5ndGg9Rztmb3IodmFyIGJuPTE7Ym48RzsrK2JuKWh0W2JuXT13ZVtibl0udG9XaXJlVHlwZShfdCxhcmd1bWVudHNbYm4tMV0pO3ZhciBybz1sdC5hcHBseShudWxsLGh0KTtyZXR1cm4gUm4oX3QpLHdlWzBdLmZyb21XaXJlVHlwZShybyl9LFtdfSksW119KX1mdW5jdGlvbiBRYShWLEcpe2lmKCEoViBpbnN0YW5jZW9mIEZ1bmN0aW9uKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJuZXdfIGNhbGxlZCB3aXRoIGNvbnN0cnVjdG9yIHR5cGUgIit0eXBlb2YgVisiIHdoaWNoIGlzIG5vdCBhIGZ1bmN0aW9uIik7dmFyIFk9SXIoVi5uYW1lfHwidW5rbm93bkZ1bmN0aW9uTmFtZSIsZnVuY3Rpb24oKXt9KTtZLnByb3RvdHlwZT1WLnByb3RvdHlwZTt2YXIgSj1uZXcgWSxsdD1WLmFwcGx5KEosRyk7cmV0dXJuIGx0IGluc3RhbmNlb2YgT2JqZWN0P2x0Okp9ZnVuY3Rpb24gSmEoVixHLFksSixsdCl7dmFyIE90PUcubGVuZ3RoO090PDImJkRlKCJhcmdUeXBlcyBhcnJheSBzaXplIG1pc21hdGNoISBNdXN0IGF0IGxlYXN0IGdldCByZXR1cm4gdmFsdWUgYW5kICd0aGlzJyB0eXBlcyEiKTtmb3IodmFyIFN0PUdbMV0hPT1udWxsJiZZIT09bnVsbCxodD0hMSxfdD0xO190PEcubGVuZ3RoOysrX3QpaWYoR1tfdF0hPT1udWxsJiZHW190XS5kZXN0cnVjdG9yRnVuY3Rpb249PT12b2lkIDApe2h0PSEwO2JyZWFrfWZvcih2YXIgS3Q9R1swXS5uYW1lIT09InZvaWQiLHRlPSIiLHdlPSIiLF90PTA7X3Q8T3QtMjsrK190KXRlKz0oX3QhPT0wPyIsICI6IiIpKyJhcmciK190LHdlKz0oX3QhPT0wPyIsICI6IiIpKyJhcmciK190KyJXaXJlZCI7dmFyIEplPSJyZXR1cm4gZnVuY3Rpb24gIitZaShWKSsiKCIrdGUrYCkgewppZiAoYXJndW1lbnRzLmxlbmd0aCAhPT0gYCsoT3QtMikrYCkgewp0aHJvd0JpbmRpbmdFcnJvcignZnVuY3Rpb24gYCtWKyIgY2FsbGVkIHdpdGggJyArIGFyZ3VtZW50cy5sZW5ndGggKyAnIGFyZ3VtZW50cywgZXhwZWN0ZWQgIisoT3QtMikrYCBhcmdzIScpOwp9CmA7aHQmJihKZSs9YHZhciBkZXN0cnVjdG9ycyA9IFtdOwpgKTt2YXIgYm49aHQ/ImRlc3RydWN0b3JzIjoibnVsbCIscm89WyJ0aHJvd0JpbmRpbmdFcnJvciIsImludm9rZXIiLCJmbiIsInJ1bkRlc3RydWN0b3JzIiwicmV0VHlwZSIsImNsYXNzUGFyYW0iXSxJbz1bRGUsSixsdCxSbixHWzBdLEdbMV1dO1N0JiYoSmUrPSJ2YXIgdGhpc1dpcmVkID0gY2xhc3NQYXJhbS50b1dpcmVUeXBlKCIrYm4rYCwgdGhpcyk7CmApO2Zvcih2YXIgX3Q9MDtfdDxPdC0yOysrX3QpSmUrPSJ2YXIgYXJnIitfdCsiV2lyZWQgPSBhcmdUeXBlIitfdCsiLnRvV2lyZVR5cGUoIitibisiLCBhcmciK190KyIpOyAvLyAiK0dbX3QrMl0ubmFtZStgCmAscm8ucHVzaCgiYXJnVHlwZSIrX3QpLElvLnB1c2goR1tfdCsyXSk7aWYoU3QmJih3ZT0idGhpc1dpcmVkIisod2UubGVuZ3RoPjA/IiwgIjoiIikrd2UpLEplKz0oS3Q/InZhciBydiA9ICI6IiIpKyJpbnZva2VyKGZuIisod2UubGVuZ3RoPjA/IiwgIjoiIikrd2UrYCk7CmAsaHQpSmUrPWBydW5EZXN0cnVjdG9ycyhkZXN0cnVjdG9ycyk7CmA7ZWxzZSBmb3IodmFyIF90PVN0PzE6MjtfdDxHLmxlbmd0aDsrK190KXt2YXIgbHI9X3Q9PT0xPyJ0aGlzV2lyZWQiOiJhcmciKyhfdC0yKSsiV2lyZWQiO0dbX3RdLmRlc3RydWN0b3JGdW5jdGlvbiE9PW51bGwmJihKZSs9bHIrIl9kdG9yKCIrbHIrIik7IC8vICIrR1tfdF0ubmFtZStgCmAscm8ucHVzaChscisiX2R0b3IiKSxJby5wdXNoKEdbX3RdLmRlc3RydWN0b3JGdW5jdGlvbikpfUt0JiYoSmUrPWB2YXIgcmV0ID0gcmV0VHlwZS5mcm9tV2lyZVR5cGUocnYpOwpyZXR1cm4gcmV0OwpgKSxKZSs9YH0KYCxyby5wdXNoKEplKTt2YXIgWnI9UWEoRnVuY3Rpb24scm8pLmFwcGx5KG51bGwsSW8pO3JldHVybiBacn1mdW5jdGlvbiBYdShWLEcsWSxKLGx0LE90LFN0LGh0KXt2YXIgX3Q9QmMoWSxKKTtHPUZuKEcpLE90PUhvKGx0LE90KSxvbyhbXSxbVl0sZnVuY3Rpb24oS3Qpe0t0PUt0WzBdO3ZhciB0ZT1LdC5uYW1lKyIuIitHO2h0JiZLdC5yZWdpc3RlcmVkQ2xhc3MucHVyZVZpcnR1YWxGdW5jdGlvbnMucHVzaChHKTtmdW5jdGlvbiB3ZSgpe0RzKCJDYW5ub3QgY2FsbCAiK3RlKyIgZHVlIHRvIHVuYm91bmQgdHlwZXMiLF90KX12YXIgSmU9S3QucmVnaXN0ZXJlZENsYXNzLmluc3RhbmNlUHJvdG90eXBlLGJuPUplW0ddO3JldHVybiBibj09PXZvaWQgMHx8Ym4ub3ZlcmxvYWRUYWJsZT09PXZvaWQgMCYmYm4uY2xhc3NOYW1lIT09S3QubmFtZSYmYm4uYXJnQ291bnQ9PT1ZLTI/KHdlLmFyZ0NvdW50PVktMix3ZS5jbGFzc05hbWU9S3QubmFtZSxKZVtHXT13ZSk6KFdhKEplLEcsdGUpLEplW0ddLm92ZXJsb2FkVGFibGVbWS0yXT13ZSksb28oW10sX3QsZnVuY3Rpb24ocm8pe3ZhciBJbz1KYSh0ZSxybyxLdCxPdCxTdCk7cmV0dXJuIEplW0ddLm92ZXJsb2FkVGFibGU9PT12b2lkIDA/KElvLmFyZ0NvdW50PVktMixKZVtHXT1Jbyk6SmVbR10ub3ZlcmxvYWRUYWJsZVtZLTJdPUlvLFtdfSksW119KX1mdW5jdGlvbiBZdShWLEcsWSl7Vj1GbihWKSxvbyhbXSxbR10sZnVuY3Rpb24oSil7cmV0dXJuIEo9SlswXSxuW1ZdPUouZnJvbVdpcmVUeXBlKFkpLFtdfSl9dmFyIFVjPVtdLEFvPVt7fSx7dmFsdWU6dm9pZCAwfSx7dmFsdWU6bnVsbH0se3ZhbHVlOiEwfSx7dmFsdWU6ITF9XTtmdW5jdGlvbiBWYyhWKXtWPjQmJi0tQW9bVl0ucmVmY291bnQ9PT0wJiYoQW9bVl09dm9pZCAwLFVjLnB1c2goVikpfWZ1bmN0aW9uICR1KCl7Zm9yKHZhciBWPTAsRz01O0c8QW8ubGVuZ3RoOysrRylBb1tHXSE9PXZvaWQgMCYmKytWO3JldHVybiBWfWZ1bmN0aW9uIFp1KCl7Zm9yKHZhciBWPTU7VjxBby5sZW5ndGg7KytWKWlmKEFvW1ZdIT09dm9pZCAwKXJldHVybiBBb1tWXTtyZXR1cm4gbnVsbH1mdW5jdGlvbiBRdSgpe24uY291bnRfZW12YWxfaGFuZGxlcz0kdSxuLmdldF9maXJzdF9lbXZhbD1adX1mdW5jdGlvbiB1cihWKXtzd2l0Y2goVil7Y2FzZSB2b2lkIDA6cmV0dXJuIDE7Y2FzZSBudWxsOnJldHVybiAyO2Nhc2UhMDpyZXR1cm4gMztjYXNlITE6cmV0dXJuIDQ7ZGVmYXVsdDp7dmFyIEc9VWMubGVuZ3RoP1VjLnBvcCgpOkFvLmxlbmd0aDtyZXR1cm4gQW9bR109e3JlZmNvdW50OjEsdmFsdWU6Vn0sR319fWZ1bmN0aW9uIEp1KFYsRyl7Rz1GbihHKSxvcihWLHtuYW1lOkcsZnJvbVdpcmVUeXBlOmZ1bmN0aW9uKFkpe3ZhciBKPUFvW1ldLnZhbHVlO3JldHVybiBWYyhZKSxKfSx0b1dpcmVUeXBlOmZ1bmN0aW9uKFksSil7cmV0dXJuIHVyKEopfSxhcmdQYWNrQWR2YW5jZTo4LHJlYWRWYWx1ZUZyb21Qb2ludGVyOmFyLGRlc3RydWN0b3JGdW5jdGlvbjpudWxsfSl9ZnVuY3Rpb24gdGwoVixHLFkpe3N3aXRjaChHKXtjYXNlIDA6cmV0dXJuIGZ1bmN0aW9uKEope3ZhciBsdD1ZP3V0OnZ0O3JldHVybiB0aGlzLmZyb21XaXJlVHlwZShsdFtKXSl9O2Nhc2UgMTpyZXR1cm4gZnVuY3Rpb24oSil7dmFyIGx0PVk/enQ6bWU7cmV0dXJuIHRoaXMuZnJvbVdpcmVUeXBlKGx0W0o+PjFdKX07Y2FzZSAyOnJldHVybiBmdW5jdGlvbihKKXt2YXIgbHQ9WT9jZTpwZTtyZXR1cm4gdGhpcy5mcm9tV2lyZVR5cGUobHRbSj4+Ml0pfTtkZWZhdWx0OnRocm93IG5ldyBUeXBlRXJyb3IoIlVua25vd24gaW50ZWdlciB0eXBlOiAiK1YpfX1mdW5jdGlvbiBlbChWLEcsWSxKKXt2YXIgbHQ9dnIoWSk7Rz1GbihHKTtmdW5jdGlvbiBPdCgpe31PdC52YWx1ZXM9e30sb3IoVix7bmFtZTpHLGNvbnN0cnVjdG9yOk90LGZyb21XaXJlVHlwZTpmdW5jdGlvbihTdCl7cmV0dXJuIHRoaXMuY29uc3RydWN0b3IudmFsdWVzW1N0XX0sdG9XaXJlVHlwZTpmdW5jdGlvbihTdCxodCl7cmV0dXJuIGh0LnZhbHVlfSxhcmdQYWNrQWR2YW5jZTo4LHJlYWRWYWx1ZUZyb21Qb2ludGVyOnRsKEcsbHQsSiksZGVzdHJ1Y3RvckZ1bmN0aW9uOm51bGx9KSxEYyhHLE90KX1mdW5jdGlvbiBGcyhWLEcpe3ZhciBZPWpvW1ZdO3JldHVybiBZPT09dm9pZCAwJiZEZShHKyIgaGFzIHVua25vd24gdHlwZSAiK1phKFYpKSxZfWZ1bmN0aW9uIG5sKFYsRyxZKXt2YXIgSj1GcyhWLCJlbnVtIik7Rz1GbihHKTt2YXIgbHQ9Si5jb25zdHJ1Y3RvcixPdD1PYmplY3QuY3JlYXRlKEouY29uc3RydWN0b3IucHJvdG90eXBlLHt2YWx1ZTp7dmFsdWU6WX0sY29uc3RydWN0b3I6e3ZhbHVlOklyKEoubmFtZSsiXyIrRyxmdW5jdGlvbigpe30pfX0pO2x0LnZhbHVlc1tZXT1PdCxsdFtHXT1PdH1mdW5jdGlvbiB3aShWKXtpZihWPT09bnVsbClyZXR1cm4ibnVsbCI7dmFyIEc9dHlwZW9mIFY7cmV0dXJuIEc9PT0ib2JqZWN0Inx8Rz09PSJhcnJheSJ8fEc9PT0iZnVuY3Rpb24iP1YudG9TdHJpbmcoKToiIitWfWZ1bmN0aW9uIG9sKFYsRyl7c3dpdGNoKEcpe2Nhc2UgMjpyZXR1cm4gZnVuY3Rpb24oWSl7cmV0dXJuIHRoaXMuZnJvbVdpcmVUeXBlKHVlW1k+PjJdKX07Y2FzZSAzOnJldHVybiBmdW5jdGlvbihZKXtyZXR1cm4gdGhpcy5mcm9tV2lyZVR5cGUoUXRbWT4+M10pfTtkZWZhdWx0OnRocm93IG5ldyBUeXBlRXJyb3IoIlVua25vd24gZmxvYXQgdHlwZTogIitWKX19ZnVuY3Rpb24gcmwoVixHLFkpe3ZhciBKPXZyKFkpO0c9Rm4oRyksb3IoVix7bmFtZTpHLGZyb21XaXJlVHlwZTpmdW5jdGlvbihsdCl7cmV0dXJuIGx0fSx0b1dpcmVUeXBlOmZ1bmN0aW9uKGx0LE90KXtpZih0eXBlb2YgT3QhPSJudW1iZXIiJiZ0eXBlb2YgT3QhPSJib29sZWFuIil0aHJvdyBuZXcgVHlwZUVycm9yKCdDYW5ub3QgY29udmVydCAiJyt3aShPdCkrJyIgdG8gJyt0aGlzLm5hbWUpO3JldHVybiBPdH0sYXJnUGFja0FkdmFuY2U6OCxyZWFkVmFsdWVGcm9tUG9pbnRlcjpvbChHLEopLGRlc3RydWN0b3JGdW5jdGlvbjpudWxsfSl9ZnVuY3Rpb24gaWwoVixHLFksSixsdCxPdCl7dmFyIFN0PUJjKEcsWSk7Vj1GbihWKSxsdD1IbyhKLGx0KSxEYyhWLGZ1bmN0aW9uKCl7RHMoIkNhbm5vdCBjYWxsICIrVisiIGR1ZSB0byB1bmJvdW5kIHR5cGVzIixTdCl9LEctMSksb28oW10sU3QsZnVuY3Rpb24oaHQpe3ZhciBfdD1baHRbMF0sbnVsbF0uY29uY2F0KGh0LnNsaWNlKDEpKTtyZXR1cm4gWWEoVixKYShWLF90LG51bGwsbHQsT3QpLEctMSksW119KX1mdW5jdGlvbiBzbChWLEcsWSl7c3dpdGNoKEcpe2Nhc2UgMDpyZXR1cm4gWT9mdW5jdGlvbihsdCl7cmV0dXJuIHV0W2x0XX06ZnVuY3Rpb24obHQpe3JldHVybiB2dFtsdF19O2Nhc2UgMTpyZXR1cm4gWT9mdW5jdGlvbihsdCl7cmV0dXJuIHp0W2x0Pj4xXX06ZnVuY3Rpb24obHQpe3JldHVybiBtZVtsdD4+MV19O2Nhc2UgMjpyZXR1cm4gWT9mdW5jdGlvbihsdCl7cmV0dXJuIGNlW2x0Pj4yXX06ZnVuY3Rpb24obHQpe3JldHVybiBwZVtsdD4+Ml19O2RlZmF1bHQ6dGhyb3cgbmV3IFR5cGVFcnJvcigiVW5rbm93biBpbnRlZ2VyIHR5cGU6ICIrVil9fWZ1bmN0aW9uIGNsKFYsRyxZLEosbHQpe0c9Rm4oRyksbHQ9PT0tMSYmKGx0PTQyOTQ5NjcyOTUpO3ZhciBPdD12cihZKSxTdD1mdW5jdGlvbihLdCl7cmV0dXJuIEt0fTtpZihKPT09MCl7dmFyIGh0PTMyLTgqWTtTdD1mdW5jdGlvbihLdCl7cmV0dXJuIEt0PDxodD4+Pmh0fX12YXIgX3Q9Ry5pbmRleE9mKCJ1bnNpZ25lZCIpIT0tMTtvcihWLHtuYW1lOkcsZnJvbVdpcmVUeXBlOlN0LHRvV2lyZVR5cGU6ZnVuY3Rpb24oS3QsdGUpe2lmKHR5cGVvZiB0ZSE9Im51bWJlciImJnR5cGVvZiB0ZSE9ImJvb2xlYW4iKXRocm93IG5ldyBUeXBlRXJyb3IoJ0Nhbm5vdCBjb252ZXJ0ICInK3dpKHRlKSsnIiB0byAnK3RoaXMubmFtZSk7aWYodGU8Snx8dGU+bHQpdGhyb3cgbmV3IFR5cGVFcnJvcignUGFzc2luZyBhIG51bWJlciAiJyt3aSh0ZSkrJyIgZnJvbSBKUyBzaWRlIHRvIEMvQysrIHNpZGUgdG8gYW4gYXJndW1lbnQgb2YgdHlwZSAiJytHKyciLCB3aGljaCBpcyBvdXRzaWRlIHRoZSB2YWxpZCByYW5nZSBbJytKKyIsICIrbHQrIl0hIik7cmV0dXJuIF90P3RlPj4+MDp0ZXwwfSxhcmdQYWNrQWR2YW5jZTo4LHJlYWRWYWx1ZUZyb21Qb2ludGVyOnNsKEcsT3QsSiE9PTApLGRlc3RydWN0b3JGdW5jdGlvbjpudWxsfSl9ZnVuY3Rpb24gYWwoVixHLFkpe3ZhciBKPVtJbnQ4QXJyYXksVWludDhBcnJheSxJbnQxNkFycmF5LFVpbnQxNkFycmF5LEludDMyQXJyYXksVWludDMyQXJyYXksRmxvYXQzMkFycmF5LEZsb2F0NjRBcnJheV0sbHQ9SltHXTtmdW5jdGlvbiBPdChTdCl7U3Q9U3Q+PjI7dmFyIGh0PXBlLF90PWh0W1N0XSxLdD1odFtTdCsxXTtyZXR1cm4gbmV3IGx0KG10LEt0LF90KX1ZPUZuKFkpLG9yKFYse25hbWU6WSxmcm9tV2lyZVR5cGU6T3QsYXJnUGFja0FkdmFuY2U6OCxyZWFkVmFsdWVGcm9tUG9pbnRlcjpPdH0se2lnbm9yZUR1cGxpY2F0ZVJlZ2lzdHJhdGlvbnM6ITB9KX1mdW5jdGlvbiBmbChWLEcpe0c9Rm4oRyk7dmFyIFk9Rz09PSJzdGQ6OnN0cmluZyI7b3IoVix7bmFtZTpHLGZyb21XaXJlVHlwZTpmdW5jdGlvbihKKXt2YXIgbHQ9cGVbSj4+Ml0sT3Q7aWYoWSlmb3IodmFyIFN0PUorNCxodD0wO2h0PD1sdDsrK2h0KXt2YXIgX3Q9Sis0K2h0O2lmKGh0PT1sdHx8dnRbX3RdPT0wKXt2YXIgS3Q9X3QtU3QsdGU9ayhTdCxLdCk7T3Q9PT12b2lkIDA/T3Q9dGU6KE90Kz0iXDAiLE90Kz10ZSksU3Q9X3QrMX19ZWxzZXtmb3IodmFyIHdlPW5ldyBBcnJheShsdCksaHQ9MDtodDxsdDsrK2h0KXdlW2h0XT1TdHJpbmcuZnJvbUNoYXJDb2RlKHZ0W0orNCtodF0pO090PXdlLmpvaW4oIiIpfXJldHVybiBXKEopLE90fSx0b1dpcmVUeXBlOmZ1bmN0aW9uKEosbHQpe2x0IGluc3RhbmNlb2YgQXJyYXlCdWZmZXImJihsdD1uZXcgVWludDhBcnJheShsdCkpO3ZhciBPdCxTdD10eXBlb2YgbHQ9PSJzdHJpbmciO1N0fHxsdCBpbnN0YW5jZW9mIFVpbnQ4QXJyYXl8fGx0IGluc3RhbmNlb2YgVWludDhDbGFtcGVkQXJyYXl8fGx0IGluc3RhbmNlb2YgSW50OEFycmF5fHxEZSgiQ2Fubm90IHBhc3Mgbm9uLXN0cmluZyB0byBzdGQ6OnN0cmluZyIpLFkmJlN0P090PWZ1bmN0aW9uKCl7cmV0dXJuIFIobHQpfTpPdD1mdW5jdGlvbigpe3JldHVybiBsdC5sZW5ndGh9O3ZhciBodD1PdCgpLF90PXooNCtodCsxKTtpZihwZVtfdD4+Ml09aHQsWSYmU3QpWChsdCxfdCs0LGh0KzEpO2Vsc2UgaWYoU3QpZm9yKHZhciBLdD0wO0t0PGh0OysrS3Qpe3ZhciB0ZT1sdC5jaGFyQ29kZUF0KEt0KTt0ZT4yNTUmJihXKF90KSxEZSgiU3RyaW5nIGhhcyBVVEYtMTYgY29kZSB1bml0cyB0aGF0IGRvIG5vdCBmaXQgaW4gOCBiaXRzIikpLHZ0W190KzQrS3RdPXRlfWVsc2UgZm9yKHZhciBLdD0wO0t0PGh0OysrS3QpdnRbX3QrNCtLdF09bHRbS3RdO3JldHVybiBKIT09bnVsbCYmSi5wdXNoKFcsX3QpLF90fSxhcmdQYWNrQWR2YW5jZTo4LHJlYWRWYWx1ZUZyb21Qb2ludGVyOmFyLGRlc3RydWN0b3JGdW5jdGlvbjpmdW5jdGlvbihKKXtXKEopfX0pfWZ1bmN0aW9uIHVsKFYsRyxZKXtZPUZuKFkpO3ZhciBKLGx0LE90LFN0LGh0O0c9PT0yPyhKPWF0LGx0PXB0LFN0PXl0LE90PWZ1bmN0aW9uKCl7cmV0dXJuIG1lfSxodD0xKTpHPT09NCYmKEo9cnQsbHQ9UHQsU3Q9Z3QsT3Q9ZnVuY3Rpb24oKXtyZXR1cm4gcGV9LGh0PTIpLG9yKFYse25hbWU6WSxmcm9tV2lyZVR5cGU6ZnVuY3Rpb24oX3Qpe2Zvcih2YXIgS3Q9cGVbX3Q+PjJdLHRlPU90KCksd2UsSmU9X3QrNCxibj0wO2JuPD1LdDsrK2JuKXt2YXIgcm89X3QrNCtibipHO2lmKGJuPT1LdHx8dGVbcm8+Pmh0XT09MCl7dmFyIElvPXJvLUplLGxyPUooSmUsSW8pO3dlPT09dm9pZCAwP3dlPWxyOih3ZSs9IlwwIix3ZSs9bHIpLEplPXJvK0d9fXJldHVybiBXKF90KSx3ZX0sdG9XaXJlVHlwZTpmdW5jdGlvbihfdCxLdCl7dHlwZW9mIEt0IT0ic3RyaW5nIiYmRGUoIkNhbm5vdCBwYXNzIG5vbi1zdHJpbmcgdG8gQysrIHN0cmluZyB0eXBlICIrWSk7dmFyIHRlPVN0KEt0KSx3ZT16KDQrdGUrRyk7cmV0dXJuIHBlW3dlPj4yXT10ZT4+aHQsbHQoS3Qsd2UrNCx0ZStHKSxfdCE9PW51bGwmJl90LnB1c2goVyx3ZSksd2V9LGFyZ1BhY2tBZHZhbmNlOjgscmVhZFZhbHVlRnJvbVBvaW50ZXI6YXIsZGVzdHJ1Y3RvckZ1bmN0aW9uOmZ1bmN0aW9uKF90KXtXKF90KX19KX1mdW5jdGlvbiBsbChWLEcsWSxKLGx0LE90KXtybltWXT17bmFtZTpGbihHKSxyYXdDb25zdHJ1Y3RvcjpIbyhZLEopLHJhd0Rlc3RydWN0b3I6SG8obHQsT3QpLGZpZWxkczpbXX19ZnVuY3Rpb24gcGwoVixHLFksSixsdCxPdCxTdCxodCxfdCxLdCl7cm5bVl0uZmllbGRzLnB1c2goe2ZpZWxkTmFtZTpGbihHKSxnZXR0ZXJSZXR1cm5UeXBlOlksZ2V0dGVyOkhvKEosbHQpLGdldHRlckNvbnRleHQ6T3Qsc2V0dGVyQXJndW1lbnRUeXBlOlN0LHNldHRlcjpIbyhodCxfdCksc2V0dGVyQ29udGV4dDpLdH0pfWZ1bmN0aW9uIGRsKFYsRyl7Rz1GbihHKSxvcihWLHtpc1ZvaWQ6ITAsbmFtZTpHLGFyZ1BhY2tBZHZhbmNlOjAsZnJvbVdpcmVUeXBlOmZ1bmN0aW9uKCl7fSx0b1dpcmVUeXBlOmZ1bmN0aW9uKFksSil7fX0pfWZ1bmN0aW9uIGVzKFYpe3JldHVybiBWfHxEZSgiQ2Fubm90IHVzZSBkZWxldGVkIHZhbC4gaGFuZGxlID0gIitWKSxBb1tWXS52YWx1ZX1mdW5jdGlvbiBtbChWLEcsWSl7Vj1lcyhWKSxHPUZzKEcsImVtdmFsOjphcyIpO3ZhciBKPVtdLGx0PXVyKEopO3JldHVybiBjZVtZPj4yXT1sdCxHLnRvV2lyZVR5cGUoSixWKX12YXIgaGw9e307ZnVuY3Rpb24gQnMoVil7dmFyIEc9aGxbVl07cmV0dXJuIEc9PT12b2lkIDA/Rm4oVik6R312YXIga2M9W107ZnVuY3Rpb24gX2woVixHLFksSil7Vj1rY1tWXSxHPWVzKEcpLFk9QnMoWSksVihHLFksbnVsbCxKKX1mdW5jdGlvbiB0Zigpe3JldHVybiB0eXBlb2YgZ2xvYmFsVGhpcz09Im9iamVjdCI/Z2xvYmFsVGhpczpmdW5jdGlvbigpe3JldHVybiBGdW5jdGlvbn0oKSgicmV0dXJuIHRoaXMiKSgpfWZ1bmN0aW9uIHlsKFYpe3JldHVybiBWPT09MD91cih0ZigpKTooVj1CcyhWKSx1cih0ZigpW1ZdKSl9ZnVuY3Rpb24gZ2woVil7dmFyIEc9a2MubGVuZ3RoO3JldHVybiBrYy5wdXNoKFYpLEd9ZnVuY3Rpb24gQWwoVixHKXtmb3IodmFyIFk9bmV3IEFycmF5KFYpLEo9MDtKPFY7KytKKVlbSl09RnMoY2VbKEc+PjIpK0pdLCJwYXJhbWV0ZXIgIitKKTtyZXR1cm4gWX1mdW5jdGlvbiBibChWLEcpe2Zvcih2YXIgWT1BbChWLEcpLEo9WVswXSxsdD1KLm5hbWUrIl8kIitZLnNsaWNlKDEpLm1hcChmdW5jdGlvbihibil7cmV0dXJuIGJuLm5hbWV9KS5qb2luKCJfIikrIiQiLE90PVsicmV0VHlwZSJdLFN0PVtKXSxodD0iIixfdD0wO190PFYtMTsrK190KWh0Kz0oX3QhPT0wPyIsICI6IiIpKyJhcmciK190LE90LnB1c2goImFyZ1R5cGUiK190KSxTdC5wdXNoKFlbMStfdF0pO2Zvcih2YXIgS3Q9WWkoIm1ldGhvZENhbGxlcl8iK2x0KSx0ZT0icmV0dXJuIGZ1bmN0aW9uICIrS3QrYChoYW5kbGUsIG5hbWUsIGRlc3RydWN0b3JzLCBhcmdzKSB7CmAsd2U9MCxfdD0wO190PFYtMTsrK190KXRlKz0iICAgIHZhciBhcmciK190KyIgPSBhcmdUeXBlIitfdCsiLnJlYWRWYWx1ZUZyb21Qb2ludGVyKGFyZ3MiKyh3ZT8iKyIrd2U6IiIpK2ApOwpgLHdlKz1ZW190KzFdLmFyZ1BhY2tBZHZhbmNlO3RlKz0iICAgIHZhciBydiA9IGhhbmRsZVtuYW1lXSgiK2h0K2ApOwpgO2Zvcih2YXIgX3Q9MDtfdDxWLTE7KytfdClZW190KzFdLmRlbGV0ZU9iamVjdCYmKHRlKz0iICAgIGFyZ1R5cGUiK190KyIuZGVsZXRlT2JqZWN0KGFyZyIrX3QrYCk7CmApO0ouaXNWb2lkfHwodGUrPWAgICAgcmV0dXJuIHJldFR5cGUudG9XaXJlVHlwZShkZXN0cnVjdG9ycywgcnYpOwpgKSx0ZSs9YH07CmAsT3QucHVzaCh0ZSk7dmFyIEplPVFhKEZ1bmN0aW9uLE90KS5hcHBseShudWxsLFN0KTtyZXR1cm4gZ2woSmUpfWZ1bmN0aW9uIFRsKFYpe3JldHVybiBWPUJzKFYpLHVyKG5bVl0pfWZ1bmN0aW9uIHdsKFYsRyl7cmV0dXJuIFY9ZXMoViksRz1lcyhHKSx1cihWW0ddKX1mdW5jdGlvbiBPbChWKXtWPjQmJihBb1tWXS5yZWZjb3VudCs9MSl9ZnVuY3Rpb24gRWwoVil7Zm9yKHZhciBHPSIiLFk9MDtZPFY7KytZKUcrPShZIT09MD8iLCAiOiIiKSsiYXJnIitZO2Zvcih2YXIgSj0icmV0dXJuIGZ1bmN0aW9uIGVtdmFsX2FsbG9jYXRvcl8iK1YrYChjb25zdHJ1Y3RvciwgYXJnVHlwZXMsIGFyZ3MpIHsKYCxZPTA7WTxWOysrWSlKKz0idmFyIGFyZ1R5cGUiK1krIiA9IHJlcXVpcmVSZWdpc3RlcmVkVHlwZShNb2R1bGVbJ0hFQVAzMiddWyhhcmdUeXBlcyA+Pj4gMikgKyAiK1krJ10sICJwYXJhbWV0ZXIgJytZK2AiKTsKdmFyIGFyZ2ArWSsiID0gYXJnVHlwZSIrWStgLnJlYWRWYWx1ZUZyb21Qb2ludGVyKGFyZ3MpOwphcmdzICs9IGFyZ1R5cGVgK1krYFsnYXJnUGFja0FkdmFuY2UnXTsKYDtyZXR1cm4gSis9InZhciBvYmogPSBuZXcgY29uc3RydWN0b3IoIitHK2ApOwpyZXR1cm4gX19lbXZhbF9yZWdpc3RlcihvYmopOwp9CmAsbmV3IEZ1bmN0aW9uKCJyZXF1aXJlUmVnaXN0ZXJlZFR5cGUiLCJNb2R1bGUiLCJfX2VtdmFsX3JlZ2lzdGVyIixKKShGcyxuLHVyKX12YXIgZWY9e307ZnVuY3Rpb24gUmwoVixHLFksSil7Vj1lcyhWKTt2YXIgbHQ9ZWZbR107cmV0dXJuIGx0fHwobHQ9RWwoRyksZWZbR109bHQpLGx0KFYsWSxKKX1mdW5jdGlvbiBTbChWKXtyZXR1cm4gdXIoQnMoVikpfWZ1bmN0aW9uIENsKFYpe3ZhciBHPUFvW1ZdLnZhbHVlO1JuKEcpLFZjKFYpfWZ1bmN0aW9uIHhsKCl7S2UoKX1mdW5jdGlvbiBQbChWLEcsWSl7dnQuY29weVdpdGhpbihWLEcsRytZKX1mdW5jdGlvbiBNbChWKXt0cnl7cmV0dXJuIEEuZ3JvdyhWLW10LmJ5dGVMZW5ndGgrNjU1MzU+Pj4xNiksSnQoQS5idWZmZXIpLDF9Y2F0Y2h7fX1mdW5jdGlvbiBObChWKXt2YXIgRz12dC5sZW5ndGg7Vj1WPj4+MDt2YXIgWT0yMTQ3NDgzNjQ4O2lmKFY+WSlyZXR1cm4hMTtmb3IodmFyIEo9MTtKPD00O0oqPTIpe3ZhciBsdD1HKigxKy4yL0opO2x0PU1hdGgubWluKGx0LFYrMTAwNjYzMjk2KTt2YXIgT3Q9TWF0aC5taW4oWSxDdChNYXRoLm1heChWLGx0KSw2NTUzNikpLFN0PU1sKE90KTtpZihTdClyZXR1cm4hMH1yZXR1cm4hMX12YXIgVXM9e21hcHBpbmdzOnt9LGJ1ZmZlcnM6W251bGwsW10sW11dLHByaW50Q2hhcjpmdW5jdGlvbihWLEcpe3ZhciBZPVVzLmJ1ZmZlcnNbVl07Rz09PTB8fEc9PT0xMD8oKFY9PT0xP046SSkoSChZLDApKSxZLmxlbmd0aD0wKTpZLnB1c2goRyl9LHZhcmFyZ3M6dm9pZCAwLGdldDpmdW5jdGlvbigpe1VzLnZhcmFyZ3MrPTQ7dmFyIFY9Y2VbVXMudmFyYXJncy00Pj4yXTtyZXR1cm4gVn0sZ2V0U3RyOmZ1bmN0aW9uKFYpe3ZhciBHPWsoVik7cmV0dXJuIEd9LGdldDY0OmZ1bmN0aW9uKFYsRyl7cmV0dXJuIFZ9fTtmdW5jdGlvbiBJbChWKXtyZXR1cm4gMH1mdW5jdGlvbiB2bChWLEcsWSxKLGx0KXt9ZnVuY3Rpb24gTGwoVixHLFksSil7Zm9yKHZhciBsdD0wLE90PTA7T3Q8WTtPdCsrKXtmb3IodmFyIFN0PWNlW0crT3QqOD4+Ml0saHQ9Y2VbRysoT3QqOCs0KT4+Ml0sX3Q9MDtfdDxodDtfdCsrKVVzLnByaW50Q2hhcihWLHZ0W1N0K190XSk7bHQrPWh0fXJldHVybiBjZVtKPj4yXT1sdCwwfWZ1bmN0aW9uIERsKFYpe3YoVnwwKX12cz1uLkludGVybmFsRXJyb3I9JGkoRXJyb3IsIkludGVybmFsRXJyb3IiKSxNYygpLFRpPW4uQmluZGluZ0Vycm9yPSRpKEVycm9yLCJCaW5kaW5nRXJyb3IiKSxDdSgpLHp1KCksVXUoKSwkYT1uLlVuYm91bmRUeXBlRXJyb3I9JGkoRXJyb3IsIlVuYm91bmRUeXBlRXJyb3IiKSxRdSgpO3ZhciBGbD17dDpwbyxJOkF1LHg6S3UsdzpXdSxkOlh1LGs6WXUsSDpKdSxuOmVsLGE6bmwsQTpybCxpOmlsLGo6Y2wsaDphbCxCOmZsLHY6dWwsdTpsbCxjOnBsLEo6ZGwsbTptbCxzOl9sLGI6VmMseTp5bCxwOmJsLHI6VGwsZTp3bCxnOk9sLHE6UmwsZjpTbCxsOkNsLG86eGwsRTpQbCxGOk5sLEc6SWwsQzp2bCx6OkxsLEQ6RGx9LG5mPVduKCksQ2U9bi5fX193YXNtX2NhbGxfY3RvcnM9ZnVuY3Rpb24oKXtyZXR1cm4oQ2U9bi5fX193YXNtX2NhbGxfY3RvcnM9bi5hc20uTCkuYXBwbHkobnVsbCxhcmd1bWVudHMpfSx6PW4uX21hbGxvYz1mdW5jdGlvbigpe3JldHVybih6PW4uX21hbGxvYz1uLmFzbS5NKS5hcHBseShudWxsLGFyZ3VtZW50cyl9LFc9bi5fZnJlZT1mdW5jdGlvbigpe3JldHVybihXPW4uX2ZyZWU9bi5hc20uTikuYXBwbHkobnVsbCxhcmd1bWVudHMpfSxldD1uLl9fX2dldFR5cGVOYW1lPWZ1bmN0aW9uKCl7cmV0dXJuKGV0PW4uX19fZ2V0VHlwZU5hbWU9bi5hc20uUCkuYXBwbHkobnVsbCxhcmd1bWVudHMpfSxNdD1uLl9fX2VtYmluZF9yZWdpc3Rlcl9uYXRpdmVfYW5kX2J1aWx0aW5fdHlwZXM9ZnVuY3Rpb24oKXtyZXR1cm4oTXQ9bi5fX19lbWJpbmRfcmVnaXN0ZXJfbmF0aXZlX2FuZF9idWlsdGluX3R5cGVzPW4uYXNtLlEpLmFwcGx5KG51bGwsYXJndW1lbnRzKX0sbGU9bi5keW5DYWxsX2ppamk9ZnVuY3Rpb24oKXtyZXR1cm4obGU9bi5keW5DYWxsX2ppamk9bi5hc20uUikuYXBwbHkobnVsbCxhcmd1bWVudHMpfSxUZTtmdW5jdGlvbiBPaShWKXt0aGlzLm5hbWU9IkV4aXRTdGF0dXMiLHRoaXMubWVzc2FnZT0iUHJvZ3JhbSB0ZXJtaW5hdGVkIHdpdGggZXhpdCgiK1YrIikiLHRoaXMuc3RhdHVzPVZ9SG49ZnVuY3Rpb24gVigpe1RlfHxHYygpLFRlfHwoSG49Vil9O2Z1bmN0aW9uIEdjKFYpe2lmKFY9Vnx8Zixtbj4wfHwocG4oKSxtbj4wKSlyZXR1cm47ZnVuY3Rpb24gRygpe1RlfHwoVGU9ITAsbi5jYWxsZWRSdW49ITAsIVMmJihFbigpLHJlKCksbyhuKSxuLm9uUnVudGltZUluaXRpYWxpemVkJiZuLm9uUnVudGltZUluaXRpYWxpemVkKCksJHQoKSkpfW4uc2V0U3RhdHVzPyhuLnNldFN0YXR1cygiUnVubmluZy4uLiIpLHNldFRpbWVvdXQoZnVuY3Rpb24oKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7bi5zZXRTdGF0dXMoIiIpfSwxKSxHKCl9LDEpKTpHKCl9aWYobi5ydW49R2Msbi5wcmVJbml0KWZvcih0eXBlb2Ygbi5wcmVJbml0PT0iZnVuY3Rpb24iJiYobi5wcmVJbml0PVtuLnByZUluaXRdKTtuLnByZUluaXQubGVuZ3RoPjA7KW4ucHJlSW5pdC5wb3AoKSgpO3JldHVybiBHYygpLGUucmVhZHl9fSgpO3R5cGVvZiB5bT09Im9iamVjdCImJnR5cGVvZiB0MT09Im9iamVjdCI/dDEuZXhwb3J0cz1KZzp0eXBlb2YgZGVmaW5lPT0iZnVuY3Rpb24iJiZkZWZpbmUuYW1kP2RlZmluZShbXSxmdW5jdGlvbigpe3JldHVybiBKZ30pOnR5cGVvZiB5bT09Im9iamVjdCImJih5bS5CQVNJUz1KZyl9KTt2YXIgZTE9e307ZGUoZTEse2RlZmF1bHQ6KCk9PlQ4fSk7ZnVuY3Rpb24gXzgodCxlKXt5LnR5cGVPZi5vYmplY3QoInRyYW5zY29kZXJNb2R1bGUiLGd1KTtsZXQgbj10Lmt0eDJCdWZmZXIsbz10LnN1cHBvcnRlZFRhcmdldEZvcm1hdHMscjt0cnl7cj1EUyhuKX1jYXRjaHt0aHJvdyBuZXcgQWUoIkludmFsaWQgS1RYMiBmaWxlLiIpfWlmKHIubGF5ZXJDb3VudCE9PTApdGhyb3cgbmV3IEFlKCJLVFgyIHRleHR1cmUgYXJyYXlzIGFyZSBub3Qgc3VwcG9ydGVkLiIpO2lmKHIucGl4ZWxEZXB0aCE9PTApdGhyb3cgbmV3IEFlKCJLVFgyIDNEIHRleHR1cmVzIGFyZSB1bnN1cHBvcnRlZC4iKTtsZXQgaT1yLmRhdGFGb3JtYXREZXNjcmlwdG9yWzBdLHM9bmV3IEFycmF5KHIubGV2ZWxDb3VudCk7cmV0dXJuIHIudmtGb3JtYXQ9PT0wJiYoaS5jb2xvck1vZGVsPT09a1N8fGkuY29sb3JNb2RlbD09PUdTKT9nOChuLHIsbyxndSxlLHMpOihlLnB1c2gobi5idWZmZXIpLHk4KHIscykpLHN9ZnVuY3Rpb24geTgodCxlKXtsZXQgbj10LnZrRm9ybWF0PT09eXUuVktfRk9STUFUX1I4RzhCOF9TUkdCP1ZuLlJHQjpWbi5SR0JBLG87dC52a0Zvcm1hdD09PXl1LlZLX0ZPUk1BVF9SOEc4QjhBOF9VTk9STT9vPW5yLlVOU0lHTkVEX0JZVEU6dC52a0Zvcm1hdD09PXl1LlZLX0ZPUk1BVF9SMTZHMTZCMTZBMTZfU0ZMT0FUP289bnIuSEFMRl9GTE9BVDp0LnZrRm9ybWF0PT09eXUuVktfRk9STUFUX1IzMkczMkIzMkEzMl9TRkxPQVQmJihvPW5yLkZMT0FUKTtmb3IobGV0IHI9MDtyPHQubGV2ZWxzLmxlbmd0aDsrK3Ipe2xldCBpPXt9O2Vbcl09aTtsZXQgcz10LmxldmVsc1tyXS5sZXZlbERhdGEsZj10LnBpeGVsV2lkdGg+PnIsdT10LnBpeGVsSGVpZ2h0Pj5yLGM9Zip1KlZuLmNvbXBvbmVudHNMZW5ndGgobik7Zm9yKGxldCBsPTA7bDx0LmZhY2VDb3VudDsrK2wpe2xldCBwPXMuYnl0ZU9mZnNldCtjKnQudHlwZVNpemUqbCxkOyFoKG8pfHxuci5zaXplSW5CeXRlcyhvKT09PTE/ZD1uZXcgVWludDhBcnJheShzLmJ1ZmZlcixwLGMpOm5yLnNpemVJbkJ5dGVzKG8pPT09Mj9kPW5ldyBVaW50MTZBcnJheShzLmJ1ZmZlcixwLGMpOmQ9bmV3IEZsb2F0MzJBcnJheShzLmJ1ZmZlcixwLGMpLGlbVlNbbF1dPXtpbnRlcm5hbEZvcm1hdDpuLGRhdGF0eXBlOm8sd2lkdGg6ZixoZWlnaHQ6dSxsZXZlbEJ1ZmZlcjpkfX19fWZ1bmN0aW9uIGc4KHQsZSxuLG8scixpKXtsZXQgcz1uZXcgby5LVFgyRmlsZSh0KSxmPXMuZ2V0V2lkdGgoKSx1PXMuZ2V0SGVpZ2h0KCksYz1zLmdldExldmVscygpLGw9cy5nZXRIYXNBbHBoYSgpO2lmKCEoZj4wKXx8ISh1PjApfHwhKGM+MCkpdGhyb3cgcy5jbG9zZSgpLHMuZGVsZXRlKCksbmV3IEFlKCJJbnZhbGlkIEtUWDIgZmlsZSIpO2xldCBwLGQsbT1lLmRhdGFGb3JtYXREZXNjcmlwdG9yWzBdLF89by50cmFuc2NvZGVyX3RleHR1cmVfZm9ybWF0O2lmKG0uY29sb3JNb2RlbD09PWtTKWlmKG4uZXRjKXA9bD9Wbi5SR0JBOF9FVEMyX0VBQzpWbi5SR0I4X0VUQzIsZD1sP18uY1RGRVRDMl9SR0JBOl8uY1RGRVRDMV9SR0I7ZWxzZSBpZihuLmV0YzEmJiFsKXA9Vm4uUkdCX0VUQzEsZD1fLmNURkVUQzFfUkdCO2Vsc2UgaWYobi5zM3RjKXA9bD9Wbi5SR0JBX0RYVDU6Vm4uUkdCX0RYVDEsZD1sP18uY1RGQkMzX1JHQkE6Xy5jVEZCQzFfUkdCO2Vsc2UgaWYobi5wdnJ0YylwPWw/Vm4uUkdCQV9QVlJUQ180QlBQVjE6Vm4uUkdCX1BWUlRDXzRCUFBWMSxkPWw/Xy5jVEZQVlJUQzFfNF9SR0JBOl8uY1RGUFZSVEMxXzRfUkdCO2Vsc2UgaWYobi5hc3RjKXA9Vm4uUkdCQV9BU1RDLGQ9Xy5jVEZBU1RDXzR4NF9SR0JBO2Vsc2UgaWYobi5iYzcpcD1Wbi5SR0JBX0JDNyxkPV8uY1RGQkM3X1JHQkE7ZWxzZSB0aHJvdyBuZXcgQWUoIk5vIHRyYW5zY29kaW5nIGZvcm1hdCB0YXJnZXQgYXZhaWxhYmxlIGZvciBFVEMxUyBjb21wcmVzc2VkIGt0eDIuIik7ZWxzZSBpZihtLmNvbG9yTW9kZWw9PT1HUylpZihuLmFzdGMpcD1Wbi5SR0JBX0FTVEMsZD1fLmNURkFTVENfNHg0X1JHQkE7ZWxzZSBpZihuLmJjNylwPVZuLlJHQkFfQkM3LGQ9Xy5jVEZCQzdfUkdCQTtlbHNlIGlmKG4uczN0YylwPWw/Vm4uUkdCQV9EWFQ1OlZuLlJHQl9EWFQxLGQ9bD9fLmNURkJDM19SR0JBOl8uY1RGQkMxX1JHQjtlbHNlIGlmKG4uZXRjKXA9bD9Wbi5SR0JBOF9FVEMyX0VBQzpWbi5SR0I4X0VUQzIsZD1sP18uY1RGRVRDMl9SR0JBOl8uY1RGRVRDMV9SR0I7ZWxzZSBpZihuLmV0YzEmJiFsKXA9Vm4uUkdCX0VUQzEsZD1fLmNURkVUQzFfUkdCO2Vsc2UgaWYobi5wdnJ0YylwPWw/Vm4uUkdCQV9QVlJUQ180QlBQVjE6Vm4uUkdCX1BWUlRDXzRCUFBWMSxkPWw/Xy5jVEZQVlJUQzFfNF9SR0JBOl8uY1RGUFZSVEMxXzRfUkdCO2Vsc2UgdGhyb3cgbmV3IEFlKCJObyB0cmFuc2NvZGluZyBmb3JtYXQgdGFyZ2V0IGF2YWlsYWJsZSBmb3IgVUFTVEMgY29tcHJlc3NlZCBrdHgyLiIpO2lmKCFzLnN0YXJ0VHJhbnNjb2RpbmcoKSl0aHJvdyBzLmNsb3NlKCkscy5kZWxldGUoKSxuZXcgQWUoInN0YXJ0VHJhbnNjb2RpbmcoKSBmYWlsZWQiKTtmb3IobGV0IGc9MDtnPGUubGV2ZWxzLmxlbmd0aDsrK2cpe2xldCBiPXt9O2lbZ109YixmPWUucGl4ZWxXaWR0aD4+Zyx1PWUucGl4ZWxIZWlnaHQ+Pmc7bGV0IFQ9cy5nZXRJbWFnZVRyYW5zY29kZWRTaXplSW5CeXRlcyhnLDAsMCxkLnZhbHVlKSxPPW5ldyBVaW50OEFycmF5KFQpLEU9cy50cmFuc2NvZGVJbWFnZShPLGcsMCwwLGQudmFsdWUsMCwtMSwtMSk7aWYoIWgoRSkpdGhyb3cgbmV3IEFlKCJ0cmFuc2NvZGVJbWFnZSgpIGZhaWxlZC4iKTtyLnB1c2goTy5idWZmZXIpLGJbVlNbMF1dPXtpbnRlcm5hbEZvcm1hdDpwLHdpZHRoOmYsaGVpZ2h0OnUsbGV2ZWxCdWZmZXI6T319cmV0dXJuIHMuY2xvc2UoKSxzLmRlbGV0ZSgpLGl9YXN5bmMgZnVuY3Rpb24gQTgodCxlKXtsZXQgbj10LndlYkFzc2VtYmx5Q29uZmlnLG89eChVUy5kZWZhdWx0LHNlbGYuQkFTSVMpO3JldHVybiBoKG4ud2FzbUJpbmFyeUZpbGUpP2d1PWF3YWl0IG8obik6Z3U9YXdhaXQgbygpLGd1LmluaXRpYWxpemVCYXNpcygpLCEwfWZ1bmN0aW9uIGI4KHQsZSl7bGV0IG49dC53ZWJBc3NlbWJseUNvbmZpZztyZXR1cm4gaChuKT9BOCh0LGUpOl84KHQsZSl9dmFyIFVTLFZTLGtTLEdTLGd1LFQ4LG4xPVooKCk9PntJdCgpO2Z0KCk7WHQoKTtJUygpO0pyKCk7dlMoKTtaZygpO3NvKCk7RlMoKTtVUz1kcihCUygpLDEpLFZTPVsicG9zaXRpdmVYIiwibmVnYXRpdmVYIiwicG9zaXRpdmVZIiwibmVnYXRpdmVZIiwicG9zaXRpdmVaIiwibmVnYXRpdmVaIl0sa1M9MTYzLEdTPTE2NjtUOD1RZShiOCl9KTt2YXIgelM9e307dmFyIG8xPVooKCk9PntzZWxmLm9ubWVzc2FnZT1mdW5jdGlvbih0KXtsZXQgZT10LmRhdGEuYXJyYXksbj1zZWxmLndlYmtpdFBvc3RNZXNzYWdlfHxzZWxmLnBvc3RNZXNzYWdlO3RyeXtuKHthcnJheTplfSxbZS5idWZmZXJdKX1jYXRjaHtuKHt9KX19fSk7dmFyIGdtLEFtLGpTPVooKCk9PntVZSgpO0Z0KCk7WHQoKTtmdCgpO0h0KCk7Z209e307Z20uY2xpcFRyaWFuZ2xlQXRBeGlzQWxpZ25lZFRocmVzaG9sZD1mdW5jdGlvbih0LGUsbixvLHIsaSl7aWYoIWgodCkpdGhyb3cgbmV3IEIoInRocmVzaG9sZCBpcyByZXF1aXJlZC4iKTtpZighaChlKSl0aHJvdyBuZXcgQigia2VlcEFib3ZlIGlzIHJlcXVpcmVkLiIpO2lmKCFoKG4pKXRocm93IG5ldyBCKCJ1MCBpcyByZXF1aXJlZC4iKTtpZighaChvKSl0aHJvdyBuZXcgQigidTEgaXMgcmVxdWlyZWQuIik7aWYoIWgocikpdGhyb3cgbmV3IEIoInUyIGlzIHJlcXVpcmVkLiIpO2goaSk/aS5sZW5ndGg9MDppPVtdO2xldCBzLGYsdTtlPyhzPW48dCxmPW88dCx1PXI8dCk6KHM9bj50LGY9bz50LHU9cj50KTtsZXQgYz1zK2YrdSxsLHAsZCxtLF8sZztyZXR1cm4gYz09PTE/cz8obD0odC1uKS8oby1uKSxwPSh0LW4pLyhyLW4pLGkucHVzaCgxKSxpLnB1c2goMikscCE9PTEmJihpLnB1c2goLTEpLGkucHVzaCgwKSxpLnB1c2goMiksaS5wdXNoKHApKSxsIT09MSYmKGkucHVzaCgtMSksaS5wdXNoKDApLGkucHVzaCgxKSxpLnB1c2gobCkpKTpmPyhkPSh0LW8pLyhyLW8pLG09KHQtbykvKG4tbyksaS5wdXNoKDIpLGkucHVzaCgwKSxtIT09MSYmKGkucHVzaCgtMSksaS5wdXNoKDEpLGkucHVzaCgwKSxpLnB1c2gobSkpLGQhPT0xJiYoaS5wdXNoKC0xKSxpLnB1c2goMSksaS5wdXNoKDIpLGkucHVzaChkKSkpOnUmJihfPSh0LXIpLyhuLXIpLGc9KHQtcikvKG8tciksaS5wdXNoKDApLGkucHVzaCgxKSxnIT09MSYmKGkucHVzaCgtMSksaS5wdXNoKDIpLGkucHVzaCgxKSxpLnB1c2goZykpLF8hPT0xJiYoaS5wdXNoKC0xKSxpLnB1c2goMiksaS5wdXNoKDApLGkucHVzaChfKSkpOmM9PT0yPyFzJiZuIT09dD8obT0odC1vKS8obi1vKSxfPSh0LXIpLyhuLXIpLGkucHVzaCgwKSxpLnB1c2goLTEpLGkucHVzaCgxKSxpLnB1c2goMCksaS5wdXNoKG0pLGkucHVzaCgtMSksaS5wdXNoKDIpLGkucHVzaCgwKSxpLnB1c2goXykpOiFmJiZvIT09dD8oZz0odC1yKS8oby1yKSxsPSh0LW4pLyhvLW4pLGkucHVzaCgxKSxpLnB1c2goLTEpLGkucHVzaCgyKSxpLnB1c2goMSksaS5wdXNoKGcpLGkucHVzaCgtMSksaS5wdXNoKDApLGkucHVzaCgxKSxpLnB1c2gobCkpOiF1JiZyIT09dCYmKHA9KHQtbikvKHItbiksZD0odC1vKS8oci1vKSxpLnB1c2goMiksaS5wdXNoKC0xKSxpLnB1c2goMCksaS5wdXNoKDIpLGkucHVzaChwKSxpLnB1c2goLTEpLGkucHVzaCgxKSxpLnB1c2goMiksaS5wdXNoKGQpKTpjIT09MyYmKGkucHVzaCgwKSxpLnB1c2goMSksaS5wdXNoKDIpKSxpfTtnbS5jb21wdXRlQmFyeWNlbnRyaWNDb29yZGluYXRlcz1mdW5jdGlvbih0LGUsbixvLHIsaSxzLGYsdSl7aWYoIWgodCkpdGhyb3cgbmV3IEIoInggaXMgcmVxdWlyZWQuIik7aWYoIWgoZSkpdGhyb3cgbmV3IEIoInkgaXMgcmVxdWlyZWQuIik7aWYoIWgobikpdGhyb3cgbmV3IEIoIngxIGlzIHJlcXVpcmVkLiIpO2lmKCFoKG8pKXRocm93IG5ldyBCKCJ5MSBpcyByZXF1aXJlZC4iKTtpZighaChyKSl0aHJvdyBuZXcgQigieDIgaXMgcmVxdWlyZWQuIik7aWYoIWgoaSkpdGhyb3cgbmV3IEIoInkyIGlzIHJlcXVpcmVkLiIpO2lmKCFoKHMpKXRocm93IG5ldyBCKCJ4MyBpcyByZXF1aXJlZC4iKTtpZighaChmKSl0aHJvdyBuZXcgQigieTMgaXMgcmVxdWlyZWQuIik7bGV0IGM9bi1zLGw9cy1yLHA9aS1mLGQ9by1mLG09MS8ocCpjK2wqZCksXz1lLWYsZz10LXMsYj0ocCpnK2wqXykqbSxUPSgtZCpnK2MqXykqbSxPPTEtYi1UO3JldHVybiBoKHUpPyh1Lng9Yix1Lnk9VCx1Lno9Tyx1KTpuZXcgYShiLFQsTyl9O2dtLmNvbXB1dGVMaW5lU2VnbWVudExpbmVTZWdtZW50SW50ZXJzZWN0aW9uPWZ1bmN0aW9uKHQsZSxuLG8scixpLHMsZix1KXt5LnR5cGVPZi5udW1iZXIoIngwMCIsdCkseS50eXBlT2YubnVtYmVyKCJ5MDAiLGUpLHkudHlwZU9mLm51bWJlcigieDAxIixuKSx5LnR5cGVPZi5udW1iZXIoInkwMSIsbykseS50eXBlT2YubnVtYmVyKCJ4MTAiLHIpLHkudHlwZU9mLm51bWJlcigieTEwIixpKSx5LnR5cGVPZi5udW1iZXIoIngxMSIscykseS50eXBlT2YubnVtYmVyKCJ5MTEiLGYpO2xldCBjPShzLXIpKihlLWkpLShmLWkpKih0LXIpLGw9KG4tdCkqKGUtaSktKG8tZSkqKHQtcikscD0oZi1pKSoobi10KS0ocy1yKSooby1lKTtpZihwPT09MClyZXR1cm47bGV0IGQ9Yy9wLG09bC9wO2lmKGQ+PTAmJmQ8PTEmJm0+PTAmJm08PTEpcmV0dXJuIGgodSl8fCh1PW5ldyB0dCksdS54PXQrZCoobi10KSx1Lnk9ZStkKihvLWUpLHV9O0FtPWdtfSk7dmFyIHIxPXt9O2RlKHIxLHtkZWZhdWx0OigpPT5COH0pO2Z1bmN0aW9uIEw4KHQsZSl7bGV0IG49dC5pc0Vhc3RDaGlsZCxvPXQuaXNOb3J0aENoaWxkLHI9bj8kcjowLGk9bj96bjokcixzPW8/JHI6MCxmPW8/em46JHIsdT1FOCxjPVI4LGw9UzgscD14ODt1Lmxlbmd0aD0wLGMubGVuZ3RoPTAsbC5sZW5ndGg9MCxwLmxlbmd0aD0wO2xldCBkPUM4O2QubGVuZ3RoPTA7bGV0IG09e30sXz10LnZlcnRpY2VzLGc9dC5pbmRpY2VzO2c9Zy5zdWJhcnJheSgwLHQuaW5kZXhDb3VudFdpdGhvdXRTa2lydHMpO2xldCBiPVBzLmNsb25lKHQuZW5jb2RpbmcpLFQ9Yi5oYXNWZXJ0ZXhOb3JtYWxzLE89MCxFPXQudmVydGV4Q291bnRXaXRob3V0U2tpcnRzLHc9dC5taW5pbXVtSGVpZ2h0LEM9dC5tYXhpbXVtSGVpZ2h0LE49bmV3IEFycmF5KEUpLEk9bmV3IEFycmF5KEUpLEQ9bmV3IEFycmF5KEUpLHY9VD9uZXcgQXJyYXkoRSoyKTp2b2lkIDAsTD0yMCxVLEEsUyxQLEY7Zm9yKEE9MCxTPTA7QTxFOysrQSxTKz0yKXtsZXQga2U9Yi5kZWNvZGVUZXh0dXJlQ29vcmRpbmF0ZXMoXyxBLEk4KTtpZihVPWIuZGVjb2RlSGVpZ2h0KF8sQSksUD1NLmNsYW1wKGtlLngqem58MCwwLHpuKSxGPU0uY2xhbXAoa2UueSp6bnwwLDAsem4pLERbQV09TS5jbGFtcCgoVS13KS8oQy13KSp6bnwwLDAsem4pLFA8TCYmKFA9MCksRjxMJiYoRj0wKSx6bi1QPEwmJihQPXpuKSx6bi1GPEwmJihGPXpuKSxOW0FdPVAsSVtBXT1GLFQpe2xldCBiZT1iLmdldE9jdEVuY29kZWROb3JtYWwoXyxBLHY4KTt2W1NdPWJlLngsdltTKzFdPWJlLnl9KG4mJlA+PSRyfHwhbiYmUDw9JHIpJiYobyYmRj49JHJ8fCFvJiZGPD0kcikmJihtW0FdPU8sdS5wdXNoKFApLGMucHVzaChGKSxsLnB1c2goRFtBXSksVCYmKHAucHVzaCh2W1NdKSxwLnB1c2godltTKzFdKSksKytPKX1sZXQgaj1bXTtqLnB1c2gobmV3IGpuKSxqLnB1c2gobmV3IGpuKSxqLnB1c2gobmV3IGpuKTtsZXQgSD1bXTtILnB1c2gobmV3IGpuKSxILnB1c2gobmV3IGpuKSxILnB1c2gobmV3IGpuKTtsZXQgayxLO2ZvcihBPTA7QTxnLmxlbmd0aDtBKz0zKXtsZXQga2U9Z1tBXSxiZT1nW0ErMV0sbG49Z1tBKzJdLHBuPU5ba2VdLEVuPU5bYmVdLHJlPU5bbG5dO2pbMF0uaW5pdGlhbGl6ZUluZGV4ZWQoTixJLEQsdixrZSksalsxXS5pbml0aWFsaXplSW5kZXhlZChOLEksRCx2LGJlKSxqWzJdLmluaXRpYWxpemVJbmRleGVkKE4sSSxELHYsbG4pO2xldCAkdD1BbS5jbGlwVHJpYW5nbGVBdEF4aXNBbGlnbmVkVGhyZXNob2xkKCRyLG4scG4sRW4scmUsdzgpO2s9MCwhKGs+PSR0Lmxlbmd0aCkmJihrPUhbMF0uaW5pdGlhbGl6ZUZyb21DbGlwUmVzdWx0KCR0LGssaiksIShrPj0kdC5sZW5ndGgpJiYoaz1IWzFdLmluaXRpYWxpemVGcm9tQ2xpcFJlc3VsdCgkdCxrLGopLCEoaz49JHQubGVuZ3RoKSYmKGs9SFsyXS5pbml0aWFsaXplRnJvbUNsaXBSZXN1bHQoJHQsayxqKSxLPUFtLmNsaXBUcmlhbmdsZUF0QXhpc0FsaWduZWRUaHJlc2hvbGQoJHIsbyxIWzBdLmdldFYoKSxIWzFdLmdldFYoKSxIWzJdLmdldFYoKSxIUykscVModSxjLGwscCxkLG0sSyxILFQpLGs8JHQubGVuZ3RoJiYoSFsyXS5jbG9uZShIWzFdKSxIWzJdLmluaXRpYWxpemVGcm9tQ2xpcFJlc3VsdCgkdCxrLGopLEs9QW0uY2xpcFRyaWFuZ2xlQXRBeGlzQWxpZ25lZFRocmVzaG9sZCgkcixvLEhbMF0uZ2V0VigpLEhbMV0uZ2V0VigpLEhbMl0uZ2V0VigpLEhTKSxxUyh1LGMsbCxwLGQsbSxLLEgsVCkpKSkpfWxldCBYPW4/LXpuOjAsUj1vPy16bjowLG90PVtdLGF0PVtdLHB0PVtdLHl0PVtdLHJ0PU51bWJlci5NQVhfVkFMVUUsUHQ9LXJ0LGd0PU84O2d0Lmxlbmd0aD0wO2xldCBDdD0kLmNsb25lKHQuZWxsaXBzb2lkKSxtdD1OdC5jbG9uZSh0LmNoaWxkUmVjdGFuZ2xlKSx1dD1tdC5ub3J0aCx2dD1tdC5zb3V0aCx6dD1tdC5lYXN0LG1lPW10Lndlc3Q7Zm9yKHp0PG1lJiYoenQrPU0uVFdPX1BJKSxBPTA7QTx1Lmxlbmd0aDsrK0EpUD1NYXRoLnJvdW5kKHVbQV0pLFA8PXI/KG90LnB1c2goQSksUD0wKTpQPj1pPyhwdC5wdXNoKEEpLFA9em4pOlA9UCoyK1gsdVtBXT1QLEY9TWF0aC5yb3VuZChjW0FdKSxGPD1zPyhhdC5wdXNoKEEpLEY9MCk6Rj49Zj8oeXQucHVzaChBKSxGPXpuKTpGPUYqMitSLGNbQV09RixVPU0ubGVycCh3LEMsbFtBXS96biksVTxydCYmKHJ0PVUpLFU+UHQmJihQdD1VKSxsW0FdPVUsYm0ubG9uZ2l0dWRlPU0ubGVycChtZSx6dCxQL3puKSxibS5sYXRpdHVkZT1NLmxlcnAodnQsdXQsRi96biksYm0uaGVpZ2h0PVUsQ3QuY2FydG9ncmFwaGljVG9DYXJ0ZXNpYW4oYm0sWGkpLGd0LnB1c2goWGkueCksZ3QucHVzaChYaS55KSxndC5wdXNoKFhpLnopO2xldCBjZT1BdC5mcm9tVmVydGljZXMoZ3QsYS5aRVJPLDMsTTgpLHBlPVNvLmZyb21SZWN0YW5nbGUobXQscnQsUHQsQ3QsTjgpLFF0PW5ldyB4cyhDdCkuY29tcHV0ZUhvcml6b25DdWxsaW5nUG9pbnRGcm9tVmVydGljZXNQb3NzaWJseVVuZGVyRWxsaXBzb2lkKGNlLmNlbnRlcixndCwzLGNlLmNlbnRlcixydCxQOCksSnQ9UHQtcnQsTmU9bmV3IFVpbnQxNkFycmF5KHUubGVuZ3RoK2MubGVuZ3RoK2wubGVuZ3RoKTtmb3IoQT0wO0E8dS5sZW5ndGg7KytBKU5lW0FdPXVbQV07bGV0IGdlPXUubGVuZ3RoO2ZvcihBPTA7QTxjLmxlbmd0aDsrK0EpTmVbZ2UrQV09Y1tBXTtmb3IoZ2UrPWMubGVuZ3RoLEE9MDtBPGwubGVuZ3RoOysrQSlOZVtnZStBXT16bioobFtBXS1ydCkvSnQ7bGV0IEVlPUR0LmNyZWF0ZVR5cGVkQXJyYXkodS5sZW5ndGgsZCksdW47aWYoVCl7bGV0IGtlPW5ldyBVaW50OEFycmF5KHApO2UucHVzaChOZS5idWZmZXIsRWUuYnVmZmVyLGtlLmJ1ZmZlciksdW49a2UuYnVmZmVyfWVsc2UgZS5wdXNoKE5lLmJ1ZmZlcixFZS5idWZmZXIpO3JldHVybnt2ZXJ0aWNlczpOZS5idWZmZXIsZW5jb2RlZE5vcm1hbHM6dW4saW5kaWNlczpFZS5idWZmZXIsbWluaW11bUhlaWdodDpydCxtYXhpbXVtSGVpZ2h0OlB0LHdlc3RJbmRpY2VzOm90LHNvdXRoSW5kaWNlczphdCxlYXN0SW5kaWNlczpwdCxub3J0aEluZGljZXM6eXQsYm91bmRpbmdTcGhlcmU6Y2Usb3JpZW50ZWRCb3VuZGluZ0JveDpwZSxob3Jpem9uT2NjbHVzaW9uUG9pbnQ6UXR9fWZ1bmN0aW9uIGpuKCl7dGhpcy52ZXJ0ZXhCdWZmZXI9dm9pZCAwLHRoaXMuaW5kZXg9dm9pZCAwLHRoaXMuZmlyc3Q9dm9pZCAwLHRoaXMuc2Vjb25kPXZvaWQgMCx0aGlzLnJhdGlvPXZvaWQgMH1mdW5jdGlvbiBLUyh0LGUpeysrVG07bGV0IG49RDhbVG1dLG89RjhbVG1dO3JldHVybiBuPW5uLm9jdERlY29kZSh0LmZpcnN0LmdldE5vcm1hbFgoKSx0LmZpcnN0LmdldE5vcm1hbFkoKSxuKSxvPW5uLm9jdERlY29kZSh0LnNlY29uZC5nZXROb3JtYWxYKCksdC5zZWNvbmQuZ2V0Tm9ybWFsWSgpLG8pLFhpPWEubGVycChuLG8sdC5yYXRpbyxYaSksYS5ub3JtYWxpemUoWGksWGkpLG5uLm9jdEVuY29kZShYaSxlKSwtLVRtLGV9ZnVuY3Rpb24gcVModCxlLG4sbyxyLGkscyxmLHUpe2lmKHMubGVuZ3RoPT09MClyZXR1cm47bGV0IGM9MCxsPTA7Zm9yKDtsPHMubGVuZ3RoOylsPUdvW2MrK10uaW5pdGlhbGl6ZUZyb21DbGlwUmVzdWx0KHMsbCxmKTtmb3IobGV0IHA9MDtwPGM7KytwKXtsZXQgZD1Hb1twXTtpZihkLmlzSW5kZXhlZCgpKWQubmV3SW5kZXg9aVtkLmluZGV4XSxkLnVCdWZmZXI9dCxkLnZCdWZmZXI9ZSxkLmhlaWdodEJ1ZmZlcj1uLHUmJihkLm5vcm1hbEJ1ZmZlcj1vKTtlbHNle2xldCBtPWQuZ2V0S2V5KCk7aWYoaChpW21dKSlkLm5ld0luZGV4PWlbbV07ZWxzZXtsZXQgXz10Lmxlbmd0aDt0LnB1c2goZC5nZXRVKCkpLGUucHVzaChkLmdldFYoKSksbi5wdXNoKGQuZ2V0SCgpKSx1JiYoby5wdXNoKGQuZ2V0Tm9ybWFsWCgpKSxvLnB1c2goZC5nZXROb3JtYWxZKCkpKSxkLm5ld0luZGV4PV8saVttXT1ffX19Yz09PTM/KHIucHVzaChHb1swXS5uZXdJbmRleCksci5wdXNoKEdvWzFdLm5ld0luZGV4KSxyLnB1c2goR29bMl0ubmV3SW5kZXgpKTpjPT09NCYmKHIucHVzaChHb1swXS5uZXdJbmRleCksci5wdXNoKEdvWzFdLm5ld0luZGV4KSxyLnB1c2goR29bMl0ubmV3SW5kZXgpLHIucHVzaChHb1swXS5uZXdJbmRleCksci5wdXNoKEdvWzJdLm5ld0luZGV4KSxyLnB1c2goR29bM10ubmV3SW5kZXgpKX12YXIgem4sJHIsdzgsSFMsTzgsYm0sWGksRTgsUjgsUzgsQzgseDgsUDgsTTgsTjgsSTgsdjgsamEsVG0sRDgsRjgsR28sQjgsaTE9WigoKT0+e2FzKCk7dmUoKTtVZSgpO0Z0KCk7SWUoKTtmdCgpO1p0KCk7c3UoKTskZSgpO2pTKCk7V3QoKTtwYSgpO3duKCk7Y3UoKTtzbygpO3puPTMyNzY3LCRyPXpuLzJ8MCx3OD1bXSxIUz1bXSxPOD1bXSxibT1uZXcgY3QsWGk9bmV3IGEsRTg9W10sUjg9W10sUzg9W10sQzg9W10seDg9W10sUDg9bmV3IGEsTTg9bmV3IEF0LE44PW5ldyBTbyxJOD1uZXcgdHQsdjg9bmV3IGE7am4ucHJvdG90eXBlLmNsb25lPWZ1bmN0aW9uKHQpe3JldHVybiBoKHQpfHwodD1uZXcgam4pLHQudUJ1ZmZlcj10aGlzLnVCdWZmZXIsdC52QnVmZmVyPXRoaXMudkJ1ZmZlcix0LmhlaWdodEJ1ZmZlcj10aGlzLmhlaWdodEJ1ZmZlcix0Lm5vcm1hbEJ1ZmZlcj10aGlzLm5vcm1hbEJ1ZmZlcix0LmluZGV4PXRoaXMuaW5kZXgsdC5maXJzdD10aGlzLmZpcnN0LHQuc2Vjb25kPXRoaXMuc2Vjb25kLHQucmF0aW89dGhpcy5yYXRpbyx0fTtqbi5wcm90b3R5cGUuaW5pdGlhbGl6ZUluZGV4ZWQ9ZnVuY3Rpb24odCxlLG4sbyxyKXt0aGlzLnVCdWZmZXI9dCx0aGlzLnZCdWZmZXI9ZSx0aGlzLmhlaWdodEJ1ZmZlcj1uLHRoaXMubm9ybWFsQnVmZmVyPW8sdGhpcy5pbmRleD1yLHRoaXMuZmlyc3Q9dm9pZCAwLHRoaXMuc2Vjb25kPXZvaWQgMCx0aGlzLnJhdGlvPXZvaWQgMH07am4ucHJvdG90eXBlLmluaXRpYWxpemVGcm9tQ2xpcFJlc3VsdD1mdW5jdGlvbih0LGUsbil7bGV0IG89ZSsxO3JldHVybiB0W2VdIT09LTE/blt0W2VdXS5jbG9uZSh0aGlzKToodGhpcy52ZXJ0ZXhCdWZmZXI9dm9pZCAwLHRoaXMuaW5kZXg9dm9pZCAwLHRoaXMuZmlyc3Q9blt0W29dXSwrK28sdGhpcy5zZWNvbmQ9blt0W29dXSwrK28sdGhpcy5yYXRpbz10W29dLCsrbyksb307am4ucHJvdG90eXBlLmdldEtleT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmlzSW5kZXhlZCgpP3RoaXMuaW5kZXg6SlNPTi5zdHJpbmdpZnkoe2ZpcnN0OnRoaXMuZmlyc3QuZ2V0S2V5KCksc2Vjb25kOnRoaXMuc2Vjb25kLmdldEtleSgpLHJhdGlvOnRoaXMucmF0aW99KX07am4ucHJvdG90eXBlLmlzSW5kZXhlZD1mdW5jdGlvbigpe3JldHVybiBoKHRoaXMuaW5kZXgpfTtqbi5wcm90b3R5cGUuZ2V0SD1mdW5jdGlvbigpe3JldHVybiBoKHRoaXMuaW5kZXgpP3RoaXMuaGVpZ2h0QnVmZmVyW3RoaXMuaW5kZXhdOk0ubGVycCh0aGlzLmZpcnN0LmdldEgoKSx0aGlzLnNlY29uZC5nZXRIKCksdGhpcy5yYXRpbyl9O2puLnByb3RvdHlwZS5nZXRVPWZ1bmN0aW9uKCl7cmV0dXJuIGgodGhpcy5pbmRleCk/dGhpcy51QnVmZmVyW3RoaXMuaW5kZXhdOk0ubGVycCh0aGlzLmZpcnN0LmdldFUoKSx0aGlzLnNlY29uZC5nZXRVKCksdGhpcy5yYXRpbyl9O2puLnByb3RvdHlwZS5nZXRWPWZ1bmN0aW9uKCl7cmV0dXJuIGgodGhpcy5pbmRleCk/dGhpcy52QnVmZmVyW3RoaXMuaW5kZXhdOk0ubGVycCh0aGlzLmZpcnN0LmdldFYoKSx0aGlzLnNlY29uZC5nZXRWKCksdGhpcy5yYXRpbyl9O2phPW5ldyB0dCxUbT0tMSxEOD1bbmV3IGEsbmV3IGFdLEY4PVtuZXcgYSxuZXcgYV07am4ucHJvdG90eXBlLmdldE5vcm1hbFg9ZnVuY3Rpb24oKXtyZXR1cm4gaCh0aGlzLmluZGV4KT90aGlzLm5vcm1hbEJ1ZmZlclt0aGlzLmluZGV4KjJdOihqYT1LUyh0aGlzLGphKSxqYS54KX07am4ucHJvdG90eXBlLmdldE5vcm1hbFk9ZnVuY3Rpb24oKXtyZXR1cm4gaCh0aGlzLmluZGV4KT90aGlzLm5vcm1hbEJ1ZmZlclt0aGlzLmluZGV4KjIrMV06KGphPUtTKHRoaXMsamEpLGphLnkpfTtHbz1bXTtHby5wdXNoKG5ldyBqbik7R28ucHVzaChuZXcgam4pO0dvLnB1c2gobmV3IGpuKTtHby5wdXNoKG5ldyBqbik7Qjg9UWUoTDgpfSk7dmFyIFU4LHMxPVooKCk9PntVOD1wMSh7Ii4vY29tYmluZUdlb21ldHJ5LmpzIjooKT0+UHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKT0+KGkwKCkscjApKSwiLi9jcmVhdGVCb3hHZW9tZXRyeS5qcyI6KCk9PlByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCk9PihmMCgpLGEwKSksIi4vY3JlYXRlQm94T3V0bGluZUdlb21ldHJ5LmpzIjooKT0+UHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKT0+KHAwKCksbDApKSwiLi9jcmVhdGVDaXJjbGVHZW9tZXRyeS5qcyI6KCk9PlByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCk9Pih3MCgpLFQwKSksIi4vY3JlYXRlQ2lyY2xlT3V0bGluZUdlb21ldHJ5LmpzIjooKT0+UHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKT0+KFMwKCksUjApKSwiLi9jcmVhdGVDb3BsYW5hclBvbHlnb25HZW9tZXRyeS5qcyI6KCk9PlByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCk9PihVMCgpLEIwKSksIi4vY3JlYXRlQ29wbGFuYXJQb2x5Z29uT3V0bGluZUdlb21ldHJ5LmpzIjooKT0+UHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKT0+KEcwKCksazApKSwiLi9jcmVhdGVDb3JyaWRvckdlb21ldHJ5LmpzIjooKT0+UHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKT0+KHJfKCksb18pKSwiLi9jcmVhdGVDb3JyaWRvck91dGxpbmVHZW9tZXRyeS5qcyI6KCk9PlByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCk9PihjXygpLHNfKSksIi4vY3JlYXRlQ3lsaW5kZXJHZW9tZXRyeS5qcyI6KCk9PlByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCk9PihkXygpLHBfKSksIi4vY3JlYXRlQ3lsaW5kZXJPdXRsaW5lR2VvbWV0cnkuanMiOigpPT5Qcm9taXNlLnJlc29sdmUoKS50aGVuKCgpPT4oeV8oKSxfXykpLCIuL2NyZWF0ZUVsbGlwc2VHZW9tZXRyeS5qcyI6KCk9PlByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCk9PihBXygpLGdfKSksIi4vY3JlYXRlRWxsaXBzZU91dGxpbmVHZW9tZXRyeS5qcyI6KCk9PlByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCk9PihUXygpLGJfKSksIi4vY3JlYXRlRWxsaXBzb2lkR2VvbWV0cnkuanMiOigpPT5Qcm9taXNlLnJlc29sdmUoKS50aGVuKCgpPT4oRV8oKSxPXykpLCIuL2NyZWF0ZUVsbGlwc29pZE91dGxpbmVHZW9tZXRyeS5qcyI6KCk9PlByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCk9PihDXygpLFNfKSksIi4vY3JlYXRlRnJ1c3R1bUdlb21ldHJ5LmpzIjooKT0+UHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKT0+KEZfKCksRF8pKSwiLi9jcmVhdGVGcnVzdHVtT3V0bGluZUdlb21ldHJ5LmpzIjooKT0+UHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKT0+KGtfKCksVl8pKSwiLi9jcmVhdGVHZW9tZXRyeS5qcyI6KCk9PlByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCk9PihhMSgpLGMxKSksIi4vY3JlYXRlR3JvdW5kUG9seWxpbmVHZW9tZXRyeS5qcyI6KCk9PlByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCk9PihKXygpLFFfKSksIi4vY3JlYXRlUGxhbmVHZW9tZXRyeS5qcyI6KCk9PlByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCk9PihueSgpLGV5KSksIi4vY3JlYXRlUGxhbmVPdXRsaW5lR2VvbWV0cnkuanMiOigpPT5Qcm9taXNlLnJlc29sdmUoKS50aGVuKCgpPT4oaXkoKSxyeSkpLCIuL2NyZWF0ZVBvbHlnb25HZW9tZXRyeS5qcyI6KCk9PlByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCk9PihmeSgpLGF5KSksIi4vY3JlYXRlUG9seWdvbk91dGxpbmVHZW9tZXRyeS5qcyI6KCk9PlByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCk9PihweSgpLGx5KSksIi4vY3JlYXRlUG9seWxpbmVHZW9tZXRyeS5qcyI6KCk9PlByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCk9PihneSgpLHl5KSksIi4vY3JlYXRlUG9seWxpbmVWb2x1bWVHZW9tZXRyeS5qcyI6KCk9PlByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCk9PihUeSgpLGJ5KSksIi4vY3JlYXRlUG9seWxpbmVWb2x1bWVPdXRsaW5lR2VvbWV0cnkuanMiOigpPT5Qcm9taXNlLnJlc29sdmUoKS50aGVuKCgpPT4oRXkoKSxPeSkpLCIuL2NyZWF0ZVJlY3RhbmdsZUdlb21ldHJ5LmpzIjooKT0+UHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKT0+KHZ5KCksSXkpKSwiLi9jcmVhdGVSZWN0YW5nbGVPdXRsaW5lR2VvbWV0cnkuanMiOigpPT5Qcm9taXNlLnJlc29sdmUoKS50aGVuKCgpPT4oRnkoKSxEeSkpLCIuL2NyZWF0ZVNpbXBsZVBvbHlsaW5lR2VvbWV0cnkuanMiOigpPT5Qcm9taXNlLnJlc29sdmUoKS50aGVuKCgpPT4oVnkoKSxVeSkpLCIuL2NyZWF0ZVNwaGVyZUdlb21ldHJ5LmpzIjooKT0+UHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKT0+KHp5KCksR3kpKSwiLi9jcmVhdGVTcGhlcmVPdXRsaW5lR2VvbWV0cnkuanMiOigpPT5Qcm9taXNlLnJlc29sdmUoKS50aGVuKCgpPT4ocXkoKSxIeSkpLCIuL2NyZWF0ZVRhc2tQcm9jZXNzb3JXb3JrZXIuanMiOigpPT5Qcm9taXNlLnJlc29sdmUoKS50aGVuKCgpPT4oc28oKSxvMCkpLCIuL2NyZWF0ZVZlY3RvclRpbGVDbGFtcGVkUG9seWxpbmVzLmpzIjooKT0+UHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKT0+KFd5KCksS3kpKSwiLi9jcmVhdGVWZWN0b3JUaWxlR2VvbWV0cmllcy5qcyI6KCk9PlByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCk9PihZeSgpLFh5KSksIi4vY3JlYXRlVmVjdG9yVGlsZVBvaW50cy5qcyI6KCk9PlByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCk9PihReSgpLFp5KSksIi4vY3JlYXRlVmVjdG9yVGlsZVBvbHlnb25zLmpzIjooKT0+UHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKT0+KHRnKCksSnkpKSwiLi9jcmVhdGVWZWN0b3JUaWxlUG9seWxpbmVzLmpzIjooKT0+UHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKT0+KG9nKCksbmcpKSwiLi9jcmVhdGVWZXJ0aWNlc0Zyb21Hb29nbGVFYXJ0aEVudGVycHJpc2VCdWZmZXIuanMiOigpPT5Qcm9taXNlLnJlc29sdmUoKS50aGVuKCgpPT4oYWcoKSxjZykpLCIuL2NyZWF0ZVZlcnRpY2VzRnJvbUhlaWdodG1hcC5qcyI6KCk9PlByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCk9PihsZygpLHVnKSksIi4vY3JlYXRlVmVydGljZXNGcm9tUXVhbnRpemVkVGVycmFpbk1lc2guanMiOigpPT5Qcm9taXNlLnJlc29sdmUoKS50aGVuKCgpPT4obWcoKSxkZykpLCIuL2NyZWF0ZVdhbGxHZW9tZXRyeS5qcyI6KCk9PlByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCk9PihBZygpLGdnKSksIi4vY3JlYXRlV2FsbE91dGxpbmVHZW9tZXRyeS5qcyI6KCk9PlByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCk9Pih3ZygpLFRnKSksIi4vZGVjb2RlRHJhY28uanMiOigpPT5Qcm9taXNlLnJlc29sdmUoKS50aGVuKCgpPT4oeGcoKSxDZykpLCIuL2RlY29kZUdvb2dsZUVhcnRoRW50ZXJwcmlzZVBhY2tldC5qcyI6KCk9PlByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCk9PihxZygpLEhnKSksIi4vZGVjb2RlSTNTLmpzIjooKT0+UHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKT0+KCRnKCksWWcpKSwiLi90cmFuc2NvZGVLVFgyLmpzIjooKT0+UHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKT0+KG4xKCksZTEpKSwiLi90cmFuc2ZlclR5cGVkQXJyYXlUZXN0LmpzIjooKT0+UHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKT0+KG8xKCkselMpKSwiLi91cHNhbXBsZVF1YW50aXplZFRlcnJhaW5NZXNoLmpzIjooKT0+UHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKT0+KGkxKCkscjEpKX0pfSk7dmFyIGMxPXt9O2RlKGMxLHtkZWZhdWx0OigpPT5HOH0pO2FzeW5jIGZ1bmN0aW9uIFY4KHQsZSl7bGV0IG49eCh3bVtlXSx3bVt0XSk7cmV0dXJuIGgobik/bjpoKGUpPyh0eXBlb2YgZXhwb3J0cz09Im9iamVjdCI/bj1wcihlKTpuPShhd2FpdCBpbXBvcnQoZSkpLmRlZmF1bHQsd21bZV09bixuKToodHlwZW9mIGV4cG9ydHM9PSJvYmplY3QiP249cHIoYFdvcmtlcnMvJHt0fWApOm49KGgoZSk/YXdhaXQgaW1wb3J0KGUpOmF3YWl0IFU4KGAuLyR7dH0uanNgKSkuZGVmYXVsdCx3bVt0XT1uLG4pfWFzeW5jIGZ1bmN0aW9uIGs4KHQsZSl7bGV0IG49dC5zdWJUYXNrcyxvPW4ubGVuZ3RoLHI9bmV3IEFycmF5KG8pO2ZvcihsZXQgaT0wO2k8bztpKyspe2xldCBzPW5baV0sZj1zLmdlb21ldHJ5LHU9cy5tb2R1bGVOYW1lLGM9cy5tb2R1bGVQYXRoO2lmKGgodSkmJmgoYykpdGhyb3cgbmV3IEIoIk11c3Qgb25seSBzZXQgbW9kdWxlTmFtZSBvciBtb2R1bGVQYXRoIik7aCh1KXx8aChjKT9yW2ldPVY4KHUsYykudGhlbihsPT5sKGYscy5vZmZzZXQpKTpyW2ldPWZ9cmV0dXJuIFByb21pc2UuYWxsKHIpLnRoZW4oZnVuY3Rpb24oaSl7cmV0dXJuIHNhLnBhY2tDcmVhdGVHZW9tZXRyeVJlc3VsdHMoaSxlKX0pfXZhciB3bSxHOCxhMT1aKCgpPT57SHQoKTtJdCgpO2Z0KCk7bjAoKTtzbygpO3MxKCk7d209e307Rzg9UWUoazgpfSk7dmFyIEZWPXt9O2RlKEZWLHtjb21iaW5lR2VvbWV0cnk6KCk9Pno4LGNyZWF0ZUJveEdlb21ldHJ5OigpPT5qOCxjcmVhdGVCb3hPdXRsaW5lR2VvbWV0cnk6KCk9Pkg4LGNyZWF0ZUNpcmNsZUdlb21ldHJ5OigpPT5xOCxjcmVhdGVDaXJjbGVPdXRsaW5lR2VvbWV0cnk6KCk9Pks4LGNyZWF0ZUNvcGxhbmFyUG9seWdvbkdlb21ldHJ5OigpPT5XOCxjcmVhdGVDb3BsYW5hclBvbHlnb25PdXRsaW5lR2VvbWV0cnk6KCk9Plg4LGNyZWF0ZUNvcnJpZG9yR2VvbWV0cnk6KCk9Plk4LGNyZWF0ZUNvcnJpZG9yT3V0bGluZUdlb21ldHJ5OigpPT4kOCxjcmVhdGVDeWxpbmRlckdlb21ldHJ5OigpPT5aOCxjcmVhdGVDeWxpbmRlck91dGxpbmVHZW9tZXRyeTooKT0+UTgsY3JlYXRlRWxsaXBzZUdlb21ldHJ5OigpPT5KOCxjcmVhdGVFbGxpcHNlT3V0bGluZUdlb21ldHJ5OigpPT50VixjcmVhdGVFbGxpcHNvaWRHZW9tZXRyeTooKT0+ZVYsY3JlYXRlRWxsaXBzb2lkT3V0bGluZUdlb21ldHJ5OigpPT5uVixjcmVhdGVGcnVzdHVtR2VvbWV0cnk6KCk9Pm9WLGNyZWF0ZUZydXN0dW1PdXRsaW5lR2VvbWV0cnk6KCk9PnJWLGNyZWF0ZUdlb21ldHJ5OigpPT5pVixjcmVhdGVHcm91bmRQb2x5bGluZUdlb21ldHJ5OigpPT5zVixjcmVhdGVQbGFuZUdlb21ldHJ5OigpPT5jVixjcmVhdGVQbGFuZU91dGxpbmVHZW9tZXRyeTooKT0+YVYsY3JlYXRlUG9seWdvbkdlb21ldHJ5OigpPT5mVixjcmVhdGVQb2x5Z29uT3V0bGluZUdlb21ldHJ5OigpPT51VixjcmVhdGVQb2x5bGluZUdlb21ldHJ5OigpPT5sVixjcmVhdGVQb2x5bGluZVZvbHVtZUdlb21ldHJ5OigpPT5wVixjcmVhdGVQb2x5bGluZVZvbHVtZU91dGxpbmVHZW9tZXRyeTooKT0+ZFYsY3JlYXRlUmVjdGFuZ2xlR2VvbWV0cnk6KCk9Pm1WLGNyZWF0ZVJlY3RhbmdsZU91dGxpbmVHZW9tZXRyeTooKT0+aFYsY3JlYXRlU2ltcGxlUG9seWxpbmVHZW9tZXRyeTooKT0+X1YsY3JlYXRlU3BoZXJlR2VvbWV0cnk6KCk9PnlWLGNyZWF0ZVNwaGVyZU91dGxpbmVHZW9tZXRyeTooKT0+Z1YsY3JlYXRlVGFza1Byb2Nlc3NvcldvcmtlcjooKT0+QVYsY3JlYXRlVmVjdG9yVGlsZUNsYW1wZWRQb2x5bGluZXM6KCk9PmJWLGNyZWF0ZVZlY3RvclRpbGVHZW9tZXRyaWVzOigpPT5UVixjcmVhdGVWZWN0b3JUaWxlUG9pbnRzOigpPT53VixjcmVhdGVWZWN0b3JUaWxlUG9seWdvbnM6KCk9Pk9WLGNyZWF0ZVZlY3RvclRpbGVQb2x5bGluZXM6KCk9PkVWLGNyZWF0ZVZlcnRpY2VzRnJvbUdvb2dsZUVhcnRoRW50ZXJwcmlzZUJ1ZmZlcjooKT0+UlYsY3JlYXRlVmVydGljZXNGcm9tSGVpZ2h0bWFwOigpPT5TVixjcmVhdGVWZXJ0aWNlc0Zyb21RdWFudGl6ZWRUZXJyYWluTWVzaDooKT0+Q1YsY3JlYXRlV2FsbEdlb21ldHJ5OigpPT54VixjcmVhdGVXYWxsT3V0bGluZUdlb21ldHJ5OigpPT5QVixkZWNvZGVEcmFjbzooKT0+TVYsZGVjb2RlR29vZ2xlRWFydGhFbnRlcnByaXNlUGFja2V0OigpPT5OVixkZWNvZGVJM1M6KCk9PklWLHRyYW5zY29kZUtUWDI6KCk9PnZWLHRyYW5zZmVyVHlwZWRBcnJheVRlc3Q6KCk9PkxWLHVwc2FtcGxlUXVhbnRpemVkVGVycmFpbk1lc2g6KCk9PkRWfSk7dmFyIHo4PSgpPT57UHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKT0+aTAoKSl9LGo4PSgpPT57UHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKT0+ZjAoKSl9LEg4PSgpPT57UHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKT0+cDAoKSl9LHE4PSgpPT57UHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKT0+dzAoKSl9LEs4PSgpPT57UHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKT0+UzAoKSl9LFc4PSgpPT57UHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKT0+VTAoKSl9LFg4PSgpPT57UHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKT0+RzAoKSl9LFk4PSgpPT57UHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKT0+cl8oKSl9LCQ4PSgpPT57UHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKT0+Y18oKSl9LFo4PSgpPT57UHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKT0+ZF8oKSl9LFE4PSgpPT57UHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKT0+eV8oKSl9LEo4PSgpPT57UHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKT0+QV8oKSl9LHRWPSgpPT57UHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKT0+VF8oKSl9LGVWPSgpPT57UHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKT0+RV8oKSl9LG5WPSgpPT57UHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKT0+Q18oKSl9LG9WPSgpPT57UHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKT0+Rl8oKSl9LHJWPSgpPT57UHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKT0+a18oKSl9LGlWPSgpPT57UHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKT0+YTEoKSl9LHNWPSgpPT57UHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKT0+Sl8oKSl9LGNWPSgpPT57UHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKT0+bnkoKSl9LGFWPSgpPT57UHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKT0+aXkoKSl9LGZWPSgpPT57UHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKT0+ZnkoKSl9LHVWPSgpPT57UHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKT0+cHkoKSl9LGxWPSgpPT57UHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKT0+Z3koKSl9LHBWPSgpPT57UHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKT0+VHkoKSl9LGRWPSgpPT57UHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKT0+RXkoKSl9LG1WPSgpPT57UHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKT0+dnkoKSl9LGhWPSgpPT57UHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKT0+RnkoKSl9LF9WPSgpPT57UHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKT0+VnkoKSl9LHlWPSgpPT57UHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKT0+enkoKSl9LGdWPSgpPT57UHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKT0+cXkoKSl9LEFWPSgpPT57UHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKT0+c28oKSl9LGJWPSgpPT57UHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKT0+V3koKSl9LFRWPSgpPT57UHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKT0+WXkoKSl9LHdWPSgpPT57UHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKT0+UXkoKSl9LE9WPSgpPT57UHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKT0+dGcoKSl9LEVWPSgpPT57UHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKT0+b2coKSl9LFJWPSgpPT57UHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKT0+YWcoKSl9LFNWPSgpPT57UHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKT0+bGcoKSl9LENWPSgpPT57UHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKT0+bWcoKSl9LHhWPSgpPT57UHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKT0+QWcoKSl9LFBWPSgpPT57UHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKT0+d2coKSl9LE1WPSgpPT57UHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKT0+eGcoKSl9LE5WPSgpPT57UHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKT0+cWcoKSl9LElWPSgpPT57UHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKT0+JGcoKSl9LHZWPSgpPT57UHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKT0+bjEoKSl9LExWPSgpPT57UHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKT0+bzEoKSl9LERWPSgpPT57UHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKT0+aTEoKSl9O3JldHVybiBKUyhGVik7fSkoKTsK")});var uN=dd((RLt,vq)=>{var ZLt=T(S()),Vp=function(e){e==null&&(e=new Date().getTime()),this.N=624,this.M=397,this.MATRIX_A=2567483615,this.UPPER_MASK=2147483648,this.LOWER_MASK=2147483647,this.mt=new Array(this.N),this.mti=this.N+1,e.constructor==Array?this.init_by_array(e,e.length):this.init_seed(e)};Vp.prototype.init_seed=function(e){for(this.mt[0]=e>>>0,this.mti=1;this.mti>>30;this.mt[this.mti]=(((e&4294901760)>>>16)*1812433253<<16)+(e&65535)*1812433253+this.mti,this.mt[this.mti]>>>=0}};Vp.prototype.init_by_array=function(e,t){var n,i,o;for(this.init_seed(19650218),n=1,i=0,o=this.N>t?this.N:t;o;o--){var r=this.mt[n-1]^this.mt[n-1]>>>30;this.mt[n]=(this.mt[n]^(((r&4294901760)>>>16)*1664525<<16)+(r&65535)*1664525)+e[i]+i,this.mt[n]>>>=0,n++,i++,n>=this.N&&(this.mt[0]=this.mt[this.N-1],n=1),i>=t&&(i=0)}for(o=this.N-1;o;o--){var r=this.mt[n-1]^this.mt[n-1]>>>30;this.mt[n]=(this.mt[n]^(((r&4294901760)>>>16)*1566083941<<16)+(r&65535)*1566083941)-n,this.mt[n]>>>=0,n++,n>=this.N&&(this.mt[0]=this.mt[this.N-1],n=1)}this.mt[0]=2147483648};Vp.prototype.random_int=function(){var e,t=new Array(0,this.MATRIX_A);if(this.mti>=this.N){var n;for(this.mti==this.N+1&&this.init_seed(5489),n=0;n>>1^t[e&1];for(;n>>1^t[e&1];e=this.mt[this.N-1]&this.UPPER_MASK|this.mt[0]&this.LOWER_MASK,this.mt[this.N-1]=this.mt[this.M-1]^e>>>1^t[e&1],this.mti=0}return e=this.mt[this.mti++],e^=e>>>11,e^=e<<7&2636928640,e^=e<<15&4022730752,e^=e>>>18,e>>>0};Vp.prototype.random_int31=function(){return this.random_int()>>>1};Vp.prototype.random_incl=function(){return this.random_int()*(1/4294967295)};Vp.prototype.random=function(){return this.random_int()*(1/4294967296)};Vp.prototype.random_excl=function(){return(this.random_int()+.5)*(1/4294967296)};Vp.prototype.random_long=function(){var e=this.random_int()>>>5,t=this.random_int()>>>6;return(e*67108864+t)*(1/9007199254740992)};vq.exports=Vp});var zq=dd((qS,$S)=>{var QRt=T(S());/*! https://mths.be/punycode v1.4.0 by @mathias */(function(e){var t=typeof qS=="object"&&qS&&!qS.nodeType&&qS,n=typeof $S=="object"&&$S&&!$S.nodeType&&$S,i=typeof global=="object"&&global;(i.global===i||i.window===i||i.self===i)&&(e=i);var o,r=2147483647,s=36,a=1,c=26,d=38,u=700,h=72,p=128,g="-",f=/^xn--/,x=/[^\x20-\x7E]/,_=/[\x2E\u3002\uFF0E\uFF61]/g,C={overflow:"Overflow: input needs wider integers to process","not-basic":"Illegal input >= 0x80 (not a basic code point)","invalid-input":"Invalid input"},V=s-a,L=Math.floor,R=String.fromCharCode,G;function I(U){throw new RangeError(C[U])}function v(U,Y){for(var k=U.length,H=[];k--;)H[k]=Y(U[k]);return H}function P(U,Y){var k=U.split("@"),H="";k.length>1&&(H=k[0]+"@",U=k[1]),U=U.replace(_,".");var K=U.split("."),te=v(K,Y).join(".");return H+te}function w(U){for(var Y=[],k=0,H=U.length,K,te;k=55296&&K<=56319&&k65535&&(Y-=65536,k+=R(Y>>>10&1023|55296),Y=56320|Y&1023),k+=R(Y),k}).join("")}function b(U){return U-48<10?U-22:U-65<26?U-65:U-97<26?U-97:s}function Z(U,Y){return U+22+75*(U<26)-((Y!=0)<<5)}function E(U,Y,k){var H=0;for(U=k?L(U/u):U>>1,U+=L(U/Y);U>V*c>>1;H+=s)U=L(U/V);return L(H+(V+1)*U/(U+d))}function X(U){var Y=[],k=U.length,H,K=0,te=p,z=h,j,ee,pe,_e,ae,ye,Se,Ee,Ie;for(j=U.lastIndexOf(g),j<0&&(j=0),ee=0;ee=128&&I("not-basic"),Y.push(U.charCodeAt(ee));for(pe=j>0?j+1:0;pe=k&&I("invalid-input"),Se=b(U.charCodeAt(pe++)),(Se>=s||Se>L((r-K)/ae))&&I("overflow"),K+=Se*ae,Ee=ye<=z?a:ye>=z+c?c:ye-z,!(SeL(r/Ie)&&I("overflow"),ae*=Ie;H=Y.length+1,z=E(K-_e,H,_e==0),L(K/H)>r-te&&I("overflow"),te+=L(K/H),K%=H,Y.splice(K++,0,te)}return A(Y)}function F(U){var Y,k,H,K,te,z,j,ee,pe,_e,ae,ye=[],Se,Ee,Ie,we;for(U=w(U),Se=U.length,Y=p,k=0,te=h,z=0;z=Y&&aeL((r-k)/Ee)&&I("overflow"),k+=(j-Y)*Ee,Y=j,z=0;zr&&I("overflow"),ae==Y){for(ee=k,pe=s;_e=pe<=te?a:pe>=te+c?c:pe-te,!(ee<_e);pe+=s)we=ee-_e,Ie=s-_e,ye.push(R(Z(_e+we%Ie,0))),ee=L(we/Ie);ye.push(R(Z(ee,0))),te=E(k,Ee,H==K),k=0,++H}++k,++Y}return ye.join("")}function N(U){return P(U,function(Y){return f.test(Y)?X(Y.slice(4).toLowerCase()):Y})}function O(U){return P(U,function(Y){return x.test(Y)?"xn--"+F(Y):Y})}if(o={version:"1.3.2",ucs2:{decode:w,encode:A},decode:X,encode:F,toASCII:O,toUnicode:N},typeof define=="function"&&typeof define.amd=="object"&&define.amd)define("punycode",function(){return o});else if(t&&n)if($S.exports==t)n.exports=o;else for(G in o)o.hasOwnProperty(G)&&(t[G]=o[G]);else e.punycode=o})(qS)});var Jq=dd((Kq,_N)=>{var jRt=T(S());/*! * URI.js - Mutating URLs * IPv6 Support * * Version: 1.19.11 * * Author: Rodney Rehm * Web: http://medialize.github.io/URI.js/ * * Licensed under * MIT License http://www.opensource.org/licenses/mit-license * */(function(e,t){"use strict";typeof _N=="object"&&_N.exports?_N.exports=t():typeof define=="function"&&define.amd?define(t):e.IPv6=t(e)})(Kq,function(e){"use strict";var t=e&&e.IPv6;function n(o){var r=o.toLowerCase(),s=r.split(":"),a=s.length,c=8;s[0]===""&&s[1]===""&&s[2]===""?(s.shift(),s.shift()):s[0]===""&&s[1]===""?s.shift():s[a-1]===""&&s[a-2]===""&&s.pop(),a=s.length,s[a-1].indexOf(".")!==-1&&(c=7);var d;for(d=0;d1);p++)u.splice(0,1);s[h]=u.join("")}var g=-1,f=0,x=0,_=-1,C=!1;for(h=0;hf&&(g=_,f=x)):s[h]==="0"&&(C=!0,_=h,x=1);x>f&&(g=_,f=x),f>1&&s.splice(g,f,""),a=s.length;var V="";for(s[0]===""&&(V=":"),h=0;h{var qRt=T(S());/*! * URI.js - Mutating URLs * Second Level Domain (SLD) Support * * Version: 1.19.11 * * Author: Rodney Rehm * Web: http://medialize.github.io/URI.js/ * * Licensed under * MIT License http://www.opensource.org/licenses/mit-license * */(function(e,t){"use strict";typeof TN=="object"&&TN.exports?TN.exports=t():typeof define=="function"&&define.amd?define(t):e.SecondLevelDomains=t(e)})(Qq,function(e){"use strict";var t=e&&e.SecondLevelDomains,n={list:{ac:" com gov mil net org ",ae:" ac co gov mil name net org pro sch ",af:" com edu gov net org ",al:" com edu gov mil net org ",ao:" co ed gv it og pb ",ar:" com edu gob gov int mil net org tur ",at:" ac co gv or ",au:" asn com csiro edu gov id net org ",ba:" co com edu gov mil net org rs unbi unmo unsa untz unze ",bb:" biz co com edu gov info net org store tv ",bh:" biz cc com edu gov info net org ",bn:" com edu gov net org ",bo:" com edu gob gov int mil net org tv ",br:" adm adv agr am arq art ato b bio blog bmd cim cng cnt com coop ecn edu eng esp etc eti far flog fm fnd fot fst g12 ggf gov imb ind inf jor jus lel mat med mil mus net nom not ntr odo org ppg pro psc psi qsl rec slg srv tmp trd tur tv vet vlog wiki zlg ",bs:" com edu gov net org ",bz:" du et om ov rg ",ca:" ab bc mb nb nf nl ns nt nu on pe qc sk yk ",ck:" biz co edu gen gov info net org ",cn:" ac ah bj com cq edu fj gd gov gs gx gz ha hb he hi hl hn jl js jx ln mil net nm nx org qh sc sd sh sn sx tj tw xj xz yn zj ",co:" com edu gov mil net nom org ",cr:" ac c co ed fi go or sa ",cy:" ac biz com ekloges gov ltd name net org parliament press pro tm ",do:" art com edu gob gov mil net org sld web ",dz:" art asso com edu gov net org pol ",ec:" com edu fin gov info med mil net org pro ",eg:" com edu eun gov mil name net org sci ",er:" com edu gov ind mil net org rochest w ",es:" com edu gob nom org ",et:" biz com edu gov info name net org ",fj:" ac biz com info mil name net org pro ",fk:" ac co gov net nom org ",fr:" asso com f gouv nom prd presse tm ",gg:" co net org ",gh:" com edu gov mil org ",gn:" ac com gov net org ",gr:" com edu gov mil net org ",gt:" com edu gob ind mil net org ",gu:" com edu gov net org ",hk:" com edu gov idv net org ",hu:" 2000 agrar bolt casino city co erotica erotika film forum games hotel info ingatlan jogasz konyvelo lakas media news org priv reklam sex shop sport suli szex tm tozsde utazas video ",id:" ac co go mil net or sch web ",il:" ac co gov idf k12 muni net org ",in:" ac co edu ernet firm gen gov i ind mil net nic org res ",iq:" com edu gov i mil net org ",ir:" ac co dnssec gov i id net org sch ",it:" edu gov ",je:" co net org ",jo:" com edu gov mil name net org sch ",jp:" ac ad co ed go gr lg ne or ",ke:" ac co go info me mobi ne or sc ",kh:" com edu gov mil net org per ",ki:" biz com de edu gov info mob net org tel ",km:" asso com coop edu gouv k medecin mil nom notaires pharmaciens presse tm veterinaire ",kn:" edu gov net org ",kr:" ac busan chungbuk chungnam co daegu daejeon es gangwon go gwangju gyeongbuk gyeonggi gyeongnam hs incheon jeju jeonbuk jeonnam k kg mil ms ne or pe re sc seoul ulsan ",kw:" com edu gov net org ",ky:" com edu gov net org ",kz:" com edu gov mil net org ",lb:" com edu gov net org ",lk:" assn com edu gov grp hotel int ltd net ngo org sch soc web ",lr:" com edu gov net org ",lv:" asn com conf edu gov id mil net org ",ly:" com edu gov id med net org plc sch ",ma:" ac co gov m net org press ",mc:" asso tm ",me:" ac co edu gov its net org priv ",mg:" com edu gov mil nom org prd tm ",mk:" com edu gov inf name net org pro ",ml:" com edu gov net org presse ",mn:" edu gov org ",mo:" com edu gov net org ",mt:" com edu gov net org ",mv:" aero biz com coop edu gov info int mil museum name net org pro ",mw:" ac co com coop edu gov int museum net org ",mx:" com edu gob net org ",my:" com edu gov mil name net org sch ",nf:" arts com firm info net other per rec store web ",ng:" biz com edu gov mil mobi name net org sch ",ni:" ac co com edu gob mil net nom org ",np:" com edu gov mil net org ",nr:" biz com edu gov info net org ",om:" ac biz co com edu gov med mil museum net org pro sch ",pe:" com edu gob mil net nom org sld ",ph:" com edu gov i mil net ngo org ",pk:" biz com edu fam gob gok gon gop gos gov net org web ",pl:" art bialystok biz com edu gda gdansk gorzow gov info katowice krakow lodz lublin mil net ngo olsztyn org poznan pwr radom slupsk szczecin torun warszawa waw wroc wroclaw zgora ",pr:" ac biz com edu est gov info isla name net org pro prof ",ps:" com edu gov net org plo sec ",pw:" belau co ed go ne or ",ro:" arts com firm info nom nt org rec store tm www ",rs:" ac co edu gov in org ",sb:" com edu gov net org ",sc:" com edu gov net org ",sh:" co com edu gov net nom org ",sl:" com edu gov net org ",st:" co com consulado edu embaixada gov mil net org principe saotome store ",sv:" com edu gob org red ",sz:" ac co org ",tr:" av bbs bel biz com dr edu gen gov info k12 name net org pol tel tsk tv web ",tt:" aero biz cat co com coop edu gov info int jobs mil mobi museum name net org pro tel travel ",tw:" club com ebiz edu game gov idv mil net org ",mu:" ac co com gov net or org ",mz:" ac co edu gov org ",na:" co com ",nz:" ac co cri geek gen govt health iwi maori mil net org parliament school ",pa:" abo ac com edu gob ing med net nom org sld ",pt:" com edu gov int net nome org publ ",py:" com edu gov mil net org ",qa:" com edu gov mil net org ",re:" asso com nom ",ru:" ac adygeya altai amur arkhangelsk astrakhan bashkiria belgorod bir bryansk buryatia cbg chel chelyabinsk chita chukotka chuvashia com dagestan e-burg edu gov grozny int irkutsk ivanovo izhevsk jar joshkar-ola kalmykia kaluga kamchatka karelia kazan kchr kemerovo khabarovsk khakassia khv kirov koenig komi kostroma kranoyarsk kuban kurgan kursk lipetsk magadan mari mari-el marine mil mordovia mosreg msk murmansk nalchik net nnov nov novosibirsk nsk omsk orenburg org oryol penza perm pp pskov ptz rnd ryazan sakhalin samara saratov simbirsk smolensk spb stavropol stv surgut tambov tatarstan tom tomsk tsaritsyn tsk tula tuva tver tyumen udm udmurtia ulan-ude vladikavkaz vladimir vladivostok volgograd vologda voronezh vrn vyatka yakutia yamal yekaterinburg yuzhno-sakhalinsk ",rw:" ac co com edu gouv gov int mil net ",sa:" com edu gov med net org pub sch ",sd:" com edu gov info med net org tv ",se:" a ac b bd c d e f g h i k l m n o org p parti pp press r s t tm u w x y z ",sg:" com edu gov idn net org per ",sn:" art com edu gouv org perso univ ",sy:" com edu gov mil net news org ",th:" ac co go in mi net or ",tj:" ac biz co com edu go gov info int mil name net nic org test web ",tn:" agrinet com defense edunet ens fin gov ind info intl mincom nat net org perso rnrt rns rnu tourism ",tz:" ac co go ne or ",ua:" biz cherkassy chernigov chernovtsy ck cn co com crimea cv dn dnepropetrovsk donetsk dp edu gov if in ivano-frankivsk kh kharkov kherson khmelnitskiy kiev kirovograd km kr ks kv lg lugansk lutsk lviv me mk net nikolaev od odessa org pl poltava pp rovno rv sebastopol sumy te ternopil uzhgorod vinnica vn zaporizhzhe zhitomir zp zt ",ug:" ac co go ne or org sc ",uk:" ac bl british-library co cym gov govt icnet jet lea ltd me mil mod national-library-scotland nel net nhs nic nls org orgn parliament plc police sch scot soc ",us:" dni fed isa kids nsn ",uy:" com edu gub mil net org ",ve:" co com edu gob info mil net org web ",vi:" co com k12 net org ",vn:" ac biz com edu gov health info int name net org pro ",ye:" co com gov ltd me net org plc ",yu:" ac co edu gov org ",za:" ac agric alt bourse city co cybernet db edu gov grondar iaccess imt inca landesign law mil net ngo nis nom olivetti org pix school tm web ",zm:" ac co com edu gov net org sch ",com:"ar br cn de eu gb gr hu jpn kr no qc ru sa se uk us uy za ",net:"gb jp se uk ",org:"ae",de:"com "},has:function(i){var o=i.lastIndexOf(".");if(o<=0||o>=i.length-1)return!1;var r=i.lastIndexOf(".",o-1);if(r<=0||r>=o-1)return!1;var s=n.list[i.slice(o+1)];return s?s.indexOf(" "+i.slice(r+1,o)+" ")>=0:!1},is:function(i){var o=i.lastIndexOf(".");if(o<=0||o>=i.length-1)return!1;var r=i.lastIndexOf(".",o-1);if(r>=0)return!1;var s=n.list[i.slice(o+1)];return s?s.indexOf(" "+i.slice(0,o)+" ")>=0:!1},get:function(i){var o=i.lastIndexOf(".");if(o<=0||o>=i.length-1)return null;var r=i.lastIndexOf(".",o-1);if(r<=0||r>=o-1)return null;var s=n.list[i.slice(o+1)];return!s||s.indexOf(" "+i.slice(r+1,o)+" ")<0?null:i.slice(r+1)},noConflict:function(){return e.SecondLevelDomains===this&&(e.SecondLevelDomains=t),this}};return n})});var ud=dd((qq,SN)=>{var $Rt=T(S());/*! * URI.js - Mutating URLs * * Version: 1.19.11 * * Author: Rodney Rehm * Web: http://medialize.github.io/URI.js/ * * Licensed under * MIT License http://www.opensource.org/licenses/mit-license * */(function(e,t){"use strict";typeof SN=="object"&&SN.exports?SN.exports=t(zq(),Jq(),jq()):typeof define=="function"&&define.amd?define(["./punycode","./IPv6","./SecondLevelDomains"],t):e.URI=t(e.punycode,e.IPv6,e.SecondLevelDomains,e)})(qq,function(e,t,n,i){"use strict";var o=i&&i.URI;function r(Z,E){var X=arguments.length>=1,F=arguments.length>=2;if(!(this instanceof r))return X?F?new r(Z,E):new r(Z):new r;if(Z===void 0){if(X)throw new TypeError("undefined is not a valid argument for URI");typeof location<"u"?Z=location.href+"":Z=""}if(Z===null&&X)throw new TypeError("null is not a valid argument for URI");return this.href(Z),E!==void 0?this.absoluteTo(E):this}function s(Z){return/^[0-9]+$/.test(Z)}r.version="1.19.11";var a=r.prototype,c=Object.prototype.hasOwnProperty;function d(Z){return Z.replace(/([.*+?^=!:${}()|[\]\/\\])/g,"\\$1")}function u(Z){return Z===void 0?"Undefined":String(Object.prototype.toString.call(Z)).slice(8,-1)}function h(Z){return u(Z)==="Array"}function p(Z,E){var X={},F,N;if(u(E)==="RegExp")X=null;else if(h(E))for(F=0,N=E.length;F]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:'".,<>?«»“”‘’]))/ig,r.findUri={start:/\b(?:([a-z][a-z0-9.+-]*:\/\/)|www\.)/gi,end:/[\s\r\n]|$/,trim:/[`!()\[\]{};:'".,<>?«»“”„‘’]+$/,parens:/(\([^\)]*\)|\[[^\]]*\]|\{[^}]*\}|<[^>]*>)/g},r.leading_whitespace_expression=/^[\x00-\x20\u00a0\u1680\u2000-\u200a\u2028\u2029\u202f\u205f\u3000\ufeff]+/,r.ascii_tab_whitespace=/[\u0009\u000A\u000D]+/g,r.defaultPorts={http:"80",https:"443",ftp:"21",gopher:"70",ws:"80",wss:"443"},r.hostProtocols=["http","https"],r.invalid_hostname_characters=/[^a-zA-Z0-9\.\-:_]/,r.domAttributes={a:"href",blockquote:"cite",link:"href",base:"href",script:"src",form:"action",img:"src",area:"href",iframe:"src",embed:"src",source:"src",track:"src",input:"src",audio:"src",video:"src"},r.getDomAttribute=function(Z){if(!(!Z||!Z.nodeName)){var E=Z.nodeName.toLowerCase();if(!(E==="input"&&Z.type!=="image"))return r.domAttributes[E]}};function _(Z){return escape(Z)}function C(Z){return encodeURIComponent(Z).replace(/[!'()*]/g,_).replace(/\*/g,"%2A")}r.encode=C,r.decode=decodeURIComponent,r.iso8859=function(){r.encode=escape,r.decode=unescape},r.unicode=function(){r.encode=C,r.decode=decodeURIComponent},r.characters={pathname:{encode:{expression:/%(24|26|2B|2C|3B|3D|3A|40)/ig,map:{"%24":"$","%26":"&","%2B":"+","%2C":",","%3B":";","%3D":"=","%3A":":","%40":"@"}},decode:{expression:/[\/\?#]/g,map:{"/":"%2F","?":"%3F","#":"%23"}}},reserved:{encode:{expression:/%(21|23|24|26|27|28|29|2A|2B|2C|2F|3A|3B|3D|3F|40|5B|5D)/ig,map:{"%3A":":","%2F":"/","%3F":"?","%23":"#","%5B":"[","%5D":"]","%40":"@","%21":"!","%24":"$","%26":"&","%27":"'","%28":"(","%29":")","%2A":"*","%2B":"+","%2C":",","%3B":";","%3D":"="}}},urnpath:{encode:{expression:/%(21|24|27|28|29|2A|2B|2C|3B|3D|40)/ig,map:{"%21":"!","%24":"$","%27":"'","%28":"(","%29":")","%2A":"*","%2B":"+","%2C":",","%3B":";","%3D":"=","%40":"@"}},decode:{expression:/[\/\?#:]/g,map:{"/":"%2F","?":"%3F","#":"%23",":":"%3A"}}}},r.encodeQuery=function(Z,E){var X=r.encode(Z+"");return E===void 0&&(E=r.escapeQuerySpace),E?X.replace(/%20/g,"+"):X},r.decodeQuery=function(Z,E){Z+="",E===void 0&&(E=r.escapeQuerySpace);try{return r.decode(E?Z.replace(/\+/g,"%20"):Z)}catch{return Z}};var V={encode:"encode",decode:"decode"},L,R=function(Z,E){return function(X){try{return r[E](X+"").replace(r.characters[Z][E].expression,function(F){return r.characters[Z][E].map[F]})}catch{return X}}};for(L in V)r[L+"PathSegment"]=R("pathname",V[L]),r[L+"UrnPathSegment"]=R("urnpath",V[L]);var G=function(Z,E,X){return function(F){var N;X?N=function(k){return r[E](r[X](k))}:N=r[E];for(var O=(F+"").split(Z),U=0,Y=O.length;U-1&&(E.fragment=Z.substring(X+1)||null,Z=Z.substring(0,X)),X=Z.indexOf("?"),X>-1&&(E.query=Z.substring(X+1)||null,Z=Z.substring(0,X)),Z=Z.replace(/^(https?|ftp|wss?)?:+[/\\]*/i,"$1://"),Z=Z.replace(/^[/\\]{2,}/i,"//"),Z.substring(0,2)==="//"?(E.protocol=null,Z=Z.substring(2),Z=r.parseAuthority(Z,E)):(X=Z.indexOf(":"),X>-1&&(E.protocol=Z.substring(0,X)||null,E.protocol&&!E.protocol.match(r.protocol_expression)?E.protocol=void 0:Z.substring(X+1,X+3).replace(/\\/g,"/")==="//"?(Z=Z.substring(X+3),Z=r.parseAuthority(Z,E)):(Z=Z.substring(X+1),E.urn=!0))),E.path=Z,E},r.parseHost=function(Z,E){Z||(Z=""),Z=Z.replace(/\\/g,"/");var X=Z.indexOf("/"),F,N;if(X===-1&&(X=Z.length),Z.charAt(0)==="[")F=Z.indexOf("]"),E.hostname=Z.substring(1,F)||null,E.port=Z.substring(F+2,X)||null,E.port==="/"&&(E.port=null);else{var O=Z.indexOf(":"),U=Z.indexOf("/"),Y=Z.indexOf(":",O+1);Y!==-1&&(U===-1||Y-1?N:Z.length-1),U;return O>-1&&(N===-1||O-1?z=z.slice(0,j)+z.slice(j).replace(O,""):z=z.replace(O,""),!(z.length<=k[0].length)&&!(X.ignore&&X.ignore.test(z))){te=H+z.length;var _e=E(z,H,te,Z);if(_e===void 0){F.lastIndex=te;continue}_e=String(_e),Z=Z.slice(0,H)+_e+Z.slice(te),F.lastIndex=H+_e.length}}return F.lastIndex=0,Z},r.ensureValidHostname=function(Z,E){var X=!!Z,F=!!E,N=!1;if(F&&(N=g(r.hostProtocols,E)),N&&!X)throw new TypeError("Hostname cannot be empty, if protocol is "+E);if(Z&&Z.match(r.invalid_hostname_characters)){if(!e)throw new TypeError('Hostname "'+Z+'" contains characters other than [A-Z0-9.-:_] and Punycode.js is not available');if(e.toASCII(Z).match(r.invalid_hostname_characters))throw new TypeError('Hostname "'+Z+'" contains characters other than [A-Z0-9.-:_]')}},r.ensureValidPort=function(Z){if(Z){var E=Number(Z);if(!(s(E)&&E>0&&E<65536))throw new TypeError('Port "'+Z+'" is not a valid port')}},r.noConflict=function(Z){if(Z){var E={URI:this.noConflict()};return i.URITemplate&&typeof i.URITemplate.noConflict=="function"&&(E.URITemplate=i.URITemplate.noConflict()),i.IPv6&&typeof i.IPv6.noConflict=="function"&&(E.IPv6=i.IPv6.noConflict()),i.SecondLevelDomains&&typeof i.SecondLevelDomains.noConflict=="function"&&(E.SecondLevelDomains=i.SecondLevelDomains.noConflict()),E}else i.URI===this&&(i.URI=o);return this},a.build=function(Z){return Z===!0?this._deferred_build=!0:(Z===void 0||this._deferred_build)&&(this._string=r.build(this._parts),this._deferred_build=!1),this},a.clone=function(){return new r(this)},a.valueOf=a.toString=function(){return this.build(!1)._string};function I(Z){return function(E,X){return E===void 0?this._parts[Z]||"":(this._parts[Z]=E||null,this.build(!X),this)}}function v(Z,E){return function(X,F){return X===void 0?this._parts[Z]||"":(X!==null&&(X=X+"",X.charAt(0)===E&&(X=X.substring(1))),this._parts[Z]=X,this.build(!F),this)}}a.protocol=I("protocol"),a.username=I("username"),a.password=I("password"),a.hostname=I("hostname"),a.port=I("port"),a.query=v("query","?"),a.fragment=v("fragment","#"),a.search=function(Z,E){var X=this.query(Z,E);return typeof X=="string"&&X.length?"?"+X:X},a.hash=function(Z,E){var X=this.fragment(Z,E);return typeof X=="string"&&X.length?"#"+X:X},a.pathname=function(Z,E){if(Z===void 0||Z===!0){var X=this._parts.path||(this._parts.hostname?"/":"");return Z?(this._parts.urn?r.decodeUrnPath:r.decodePath)(X):X}else return this._parts.urn?this._parts.path=Z?r.recodeUrnPath(Z):"":this._parts.path=Z?r.recodePath(Z):"/",this.build(!E),this},a.path=a.pathname,a.href=function(Z,E){var X;if(Z===void 0)return this.toString();this._string="",this._parts=r._parts();var F=Z instanceof r,N=typeof Z=="object"&&(Z.hostname||Z.path||Z.pathname);if(Z.nodeName){var O=r.getDomAttribute(Z);Z=Z[O]||"",N=!1}if(!F&&N&&Z.pathname!==void 0&&(Z=Z.toString()),typeof Z=="string"||Z instanceof String)this._parts=r.parse(String(Z),this._parts);else if(F||N){var U=F?Z._parts:Z;for(X in U)X!=="query"&&c.call(this._parts,X)&&(this._parts[X]=U[X]);U.query&&this.query(U.query,!1)}else throw new TypeError("invalid input");return this.build(!E),this},a.is=function(Z){var E=!1,X=!1,F=!1,N=!1,O=!1,U=!1,Y=!1,k=!this._parts.urn;switch(this._parts.hostname&&(k=!1,X=r.ip4_expression.test(this._parts.hostname),F=r.ip6_expression.test(this._parts.hostname),E=X||F,N=!E,O=N&&n&&n.has(this._parts.hostname),U=N&&r.idn_expression.test(this._parts.hostname),Y=N&&r.punycode_expression.test(this._parts.hostname)),Z.toLowerCase()){case"relative":return k;case"absolute":return!k;case"domain":case"name":return N;case"sld":return O;case"ip":return E;case"ip4":case"ipv4":case"inet4":return X;case"ip6":case"ipv6":case"inet6":return F;case"idn":return U;case"url":return!this._parts.urn;case"urn":return!!this._parts.urn;case"punycode":return Y}return null};var P=a.protocol,w=a.port,A=a.hostname;a.protocol=function(Z,E){if(Z&&(Z=Z.replace(/:(\/\/)?$/,""),!Z.match(r.protocol_expression)))throw new TypeError('Protocol "'+Z+`" contains characters other than [A-Z0-9.+-] or doesn't start with [A-Z]`);return P.call(this,Z,E)},a.scheme=a.protocol,a.port=function(Z,E){return this._parts.urn?Z===void 0?"":this:(Z!==void 0&&(Z===0&&(Z=null),Z&&(Z+="",Z.charAt(0)===":"&&(Z=Z.substring(1)),r.ensureValidPort(Z))),w.call(this,Z,E))},a.hostname=function(Z,E){if(this._parts.urn)return Z===void 0?"":this;if(Z!==void 0){var X={preventInvalidHostname:this._parts.preventInvalidHostname},F=r.parseHost(Z,X);if(F!=="/")throw new TypeError('Hostname "'+Z+'" contains characters other than [A-Z0-9.-]');Z=X.hostname,this._parts.preventInvalidHostname&&r.ensureValidHostname(Z,this._parts.protocol)}return A.call(this,Z,E)},a.origin=function(Z,E){if(this._parts.urn)return Z===void 0?"":this;if(Z===void 0){var X=this.protocol(),F=this.authority();return F?(X?X+"://":"")+this.authority():""}else{var N=r(Z);return this.protocol(N.protocol()).authority(N.authority()).build(!E),this}},a.host=function(Z,E){if(this._parts.urn)return Z===void 0?"":this;if(Z===void 0)return this._parts.hostname?r.buildHost(this._parts):"";var X=r.parseHost(Z,this._parts);if(X!=="/")throw new TypeError('Hostname "'+Z+'" contains characters other than [A-Z0-9.-]');return this.build(!E),this},a.authority=function(Z,E){if(this._parts.urn)return Z===void 0?"":this;if(Z===void 0)return this._parts.hostname?r.buildAuthority(this._parts):"";var X=r.parseAuthority(Z,this._parts);if(X!=="/")throw new TypeError('Hostname "'+Z+'" contains characters other than [A-Z0-9.-]');return this.build(!E),this},a.userinfo=function(Z,E){if(this._parts.urn)return Z===void 0?"":this;if(Z===void 0){var X=r.buildUserinfo(this._parts);return X&&X.substring(0,X.length-1)}else return Z[Z.length-1]!=="@"&&(Z+="@"),r.parseUserinfo(Z,this._parts),this.build(!E),this},a.resource=function(Z,E){var X;return Z===void 0?this.path()+this.search()+this.hash():(X=r.parse(Z),this._parts.path=X.path,this._parts.query=X.query,this._parts.fragment=X.fragment,this.build(!E),this)},a.subdomain=function(Z,E){if(this._parts.urn)return Z===void 0?"":this;if(Z===void 0){if(!this._parts.hostname||this.is("IP"))return"";var X=this._parts.hostname.length-this.domain().length-1;return this._parts.hostname.substring(0,X)||""}else{var F=this._parts.hostname.length-this.domain().length,N=this._parts.hostname.substring(0,F),O=new RegExp("^"+d(N));if(Z&&Z.charAt(Z.length-1)!=="."&&(Z+="."),Z.indexOf(":")!==-1)throw new TypeError("Domains cannot contain colons");return Z&&r.ensureValidHostname(Z,this._parts.protocol),this._parts.hostname=this._parts.hostname.replace(O,Z),this.build(!E),this}},a.domain=function(Z,E){if(this._parts.urn)return Z===void 0?"":this;if(typeof Z=="boolean"&&(E=Z,Z=void 0),Z===void 0){if(!this._parts.hostname||this.is("IP"))return"";var X=this._parts.hostname.match(/\./g);if(X&&X.length<2)return this._parts.hostname;var F=this._parts.hostname.length-this.tld(E).length-1;return F=this._parts.hostname.lastIndexOf(".",F-1)+1,this._parts.hostname.substring(F)||""}else{if(!Z)throw new TypeError("cannot set domain empty");if(Z.indexOf(":")!==-1)throw new TypeError("Domains cannot contain colons");if(r.ensureValidHostname(Z,this._parts.protocol),!this._parts.hostname||this.is("IP"))this._parts.hostname=Z;else{var N=new RegExp(d(this.domain())+"$");this._parts.hostname=this._parts.hostname.replace(N,Z)}return this.build(!E),this}},a.tld=function(Z,E){if(this._parts.urn)return Z===void 0?"":this;if(typeof Z=="boolean"&&(E=Z,Z=void 0),Z===void 0){if(!this._parts.hostname||this.is("IP"))return"";var X=this._parts.hostname.lastIndexOf("."),F=this._parts.hostname.substring(X+1);return E!==!0&&n&&n.list[F.toLowerCase()]&&n.get(this._parts.hostname)||F}else{var N;if(Z)if(Z.match(/[^a-zA-Z0-9-]/))if(n&&n.is(Z))N=new RegExp(d(this.tld())+"$"),this._parts.hostname=this._parts.hostname.replace(N,Z);else throw new TypeError('TLD "'+Z+'" contains characters other than [A-Z0-9]');else{if(!this._parts.hostname||this.is("IP"))throw new ReferenceError("cannot set TLD on non-domain host");N=new RegExp(d(this.tld())+"$"),this._parts.hostname=this._parts.hostname.replace(N,Z)}else throw new TypeError("cannot set TLD empty");return this.build(!E),this}},a.directory=function(Z,E){if(this._parts.urn)return Z===void 0?"":this;if(Z===void 0||Z===!0){if(!this._parts.path&&!this._parts.hostname)return"";if(this._parts.path==="/")return"/";var X=this._parts.path.length-this.filename().length-1,F=this._parts.path.substring(0,X)||(this._parts.hostname?"/":"");return Z?r.decodePath(F):F}else{var N=this._parts.path.length-this.filename().length,O=this._parts.path.substring(0,N),U=new RegExp("^"+d(O));return this.is("relative")||(Z||(Z="/"),Z.charAt(0)!=="/"&&(Z="/"+Z)),Z&&Z.charAt(Z.length-1)!=="/"&&(Z+="/"),Z=r.recodePath(Z),this._parts.path=this._parts.path.replace(U,Z),this.build(!E),this}},a.filename=function(Z,E){if(this._parts.urn)return Z===void 0?"":this;if(typeof Z!="string"){if(!this._parts.path||this._parts.path==="/")return"";var X=this._parts.path.lastIndexOf("/"),F=this._parts.path.substring(X+1);return Z?r.decodePathSegment(F):F}else{var N=!1;Z.charAt(0)==="/"&&(Z=Z.substring(1)),Z.match(/\.?\//)&&(N=!0);var O=new RegExp(d(this.filename())+"$");return Z=r.recodePath(Z),this._parts.path=this._parts.path.replace(O,Z),N?this.normalizePath(E):this.build(!E),this}},a.suffix=function(Z,E){if(this._parts.urn)return Z===void 0?"":this;if(Z===void 0||Z===!0){if(!this._parts.path||this._parts.path==="/")return"";var X=this.filename(),F=X.lastIndexOf("."),N,O;return F===-1?"":(N=X.substring(F+1),O=/^[a-z0-9%]+$/i.test(N)?N:"",Z?r.decodePathSegment(O):O)}else{Z.charAt(0)==="."&&(Z=Z.substring(1));var U=this.suffix(),Y;if(U)Z?Y=new RegExp(d(U)+"$"):Y=new RegExp(d("."+U)+"$");else{if(!Z)return this;this._parts.path+="."+r.recodePath(Z)}return Y&&(Z=r.recodePath(Z),this._parts.path=this._parts.path.replace(Y,Z)),this.build(!E),this}},a.segment=function(Z,E,X){var F=this._parts.urn?":":"/",N=this.path(),O=N.substring(0,1)==="/",U=N.split(F);if(Z!==void 0&&typeof Z!="number"&&(X=E,E=Z,Z=void 0),Z!==void 0&&typeof Z!="number")throw new Error('Bad segment "'+Z+'", must be 0-based integer');if(O&&U.shift(),Z<0&&(Z=Math.max(U.length+Z,0)),E===void 0)return Z===void 0?U:U[Z];if(Z===null||U[Z]===void 0)if(h(E)){U=[];for(var Y=0,k=E.length;Y{"use strict";var TFn=T(S());Yce.exports=LHe;var O2=1e20;function LHe(e,t){t||(t={});var n=t.cutoff==null?.25:t.cutoff,i=t.radius==null?8:t.radius,o=t.channel||0,r,s,a,c,d,u,h,p,g,f,x;if(ArrayBuffer.isView(e)||Array.isArray(e)){if(!t.width||!t.height)throw Error("For raw data width and height should be provided by options");r=t.width,s=t.height,c=e,t.stride?u=t.stride:u=Math.floor(e.length/r/s)}else window.HTMLCanvasElement&&e instanceof window.HTMLCanvasElement?(p=e,h=p.getContext("2d"),r=p.width,s=p.height,g=h.getImageData(0,0,r,s),c=g.data,u=4):window.CanvasRenderingContext2D&&e instanceof window.CanvasRenderingContext2D?(p=e.canvas,h=e,r=p.width,s=p.height,g=h.getImageData(0,0,r,s),c=g.data,u=4):window.ImageData&&e instanceof window.ImageData&&(g=e,r=e.width,s=e.height,c=g.data,u=4);if(a=Math.max(r,s),window.Uint8ClampedArray&&c instanceof window.Uint8ClampedArray||window.Uint8Array&&c instanceof window.Uint8Array)for(d=c,c=Array(r*s),f=0,x=Math.floor(d.length/u);f{var UFn=T(S());function FHe(){var e=0,t=1,n=2,i=3,o=4,r=5,s=6,a=7,c=8,d=9,u=10,h=11,p=12,g=13,f=14,x=15,_=16,C=17,V=0,L=1,R=2,G=3,I=4;function v(b,Z){return 55296<=b.charCodeAt(Z)&&b.charCodeAt(Z)<=56319&&56320<=b.charCodeAt(Z+1)&&b.charCodeAt(Z+1)<=57343}function P(b,Z){Z===void 0&&(Z=0);var E=b.charCodeAt(Z);if(55296<=E&&E<=56319&&Z=1){var X=b.charCodeAt(Z-1),F=E;return 55296<=X&&X<=56319?(X-55296)*1024+(F-56320)+65536:F}return E}function w(b,Z,E){var X=[b].concat(Z).concat([E]),F=X[X.length-2],N=E,O=X.lastIndexOf(f);if(O>1&&X.slice(1,O).every(function(k){return k==i})&&[i,g,C].indexOf(b)==-1)return R;var U=X.lastIndexOf(o);if(U>0&&X.slice(1,U).every(function(k){return k==o})&&[p,o].indexOf(F)==-1)return X.filter(function(k){return k==o}).length%2==1?G:I;if(F==e&&N==t)return V;if(F==n||F==e||F==t)return N==f&&Z.every(function(k){return k==i})?R:L;if(N==n||N==e||N==t)return L;if(F==s&&(N==s||N==a||N==d||N==u))return V;if((F==d||F==a)&&(N==a||N==c))return V;if((F==u||F==c)&&N==c)return V;if(N==i||N==x)return V;if(N==r)return V;if(F==p)return V;var Y=X.indexOf(i)!=-1?X.lastIndexOf(i)-1:X.length-2;return[g,C].indexOf(X[Y])!=-1&&X.slice(Y+1,-1).every(function(k){return k==i})&&N==f||F==x&&[_,C].indexOf(N)!=-1?V:Z.indexOf(o)!=-1?R:F==o&&N==o?V:L}this.nextBreak=function(b,Z){if(Z===void 0&&(Z=0),Z<0)return 0;if(Z>=b.length-1)return b.length;for(var E=A(P(b,Z)),X=[],F=Z+1;F{var $si=T(S());(function(e,t){typeof kJ=="object"&&typeof UJ<"u"?UJ.exports=t():typeof define=="function"&&define.amd?define(t):(e=e||self).RBush=t()})(kJ,function(){"use strict";function e(_,C,V,L,R){(function G(I,v,P,w,A){for(;w>P;){if(w-P>600){var b=w-P+1,Z=v-P+1,E=Math.log(b),X=.5*Math.exp(2*E/3),F=.5*Math.sqrt(E*X*(b-X)/b)*(Z-b/2<0?-1:1),N=Math.max(P,Math.floor(v-Z*X/b+F)),O=Math.min(w,Math.floor(v+(b-Z)*X/b+F));G(I,v,N,O,A)}var U=I[v],Y=P,k=w;for(t(I,P,v),A(I[w],U)>0&&t(I,P,w);Y0;)k--}A(I[P],U)===0?t(I,P,k):t(I,++k,w),k<=v&&(P=k+1),v<=k&&(w=k-1)}})(_,C,V||0,L||_.length-1,R||n)}function t(_,C,V){var L=_[C];_[C]=_[V],_[V]=L}function n(_,C){return _C?1:0}var i=function(_){_===void 0&&(_=9),this._maxEntries=Math.max(4,_),this._minEntries=Math.max(2,Math.ceil(.4*this._maxEntries)),this.clear()};function o(_,C,V){if(!V)return C.indexOf(_);for(var L=0;L=_.minX&&C.maxY>=_.minY}function f(_){return{children:_,height:1,leaf:!0,minX:1/0,minY:1/0,maxX:-1/0,maxY:-1/0}}function x(_,C,V,L,R){for(var G=[C,V];G.length;)if(!((V=G.pop())-(C=G.pop())<=L)){var I=C+Math.ceil((V-C)/L/2)*L;e(_,I,C,V,R),G.push(C,I,I,V)}}return i.prototype.all=function(){return this._all(this.data,[])},i.prototype.search=function(_){var C=this.data,V=[];if(!g(_,C))return V;for(var L=this.toBBox,R=[];C;){for(var G=0;G=0&&R[C].children.length>this._maxEntries;)this._split(R,C),C--;this._adjustParentBBoxes(L,R,C)},i.prototype._split=function(_,C){var V=_[C],L=V.children.length,R=this._minEntries;this._chooseSplitAxis(V,R,L);var G=this._chooseSplitIndex(V,R,L),I=f(V.children.splice(G,V.children.length-G));I.height=V.height,I.leaf=V.leaf,r(V,this.toBBox),r(I,this.toBBox),C?_[C-1].children.push(I):this._splitRoot(V,I)},i.prototype._splitRoot=function(_,C){this.data=f([_,C]),this.data.height=_.height+1,this.data.leaf=!1,r(this.data,this.toBBox)},i.prototype._chooseSplitIndex=function(_,C,V){for(var L,R,G,I,v,P,w,A=1/0,b=1/0,Z=C;Z<=V-C;Z++){var E=s(_,0,Z,this.toBBox),X=s(_,Z,V,this.toBBox),F=(R=E,G=X,I=void 0,v=void 0,P=void 0,w=void 0,I=Math.max(R.minX,G.minX),v=Math.max(R.minY,G.minY),P=Math.min(R.maxX,G.maxX),w=Math.min(R.maxY,G.maxY),Math.max(0,P-I)*Math.max(0,w-v)),N=u(E)+u(X);F=C;A--){var b=_.children[A];a(I,_.leaf?R(b):b),v+=h(I)}return v},i.prototype._adjustParentBBoxes=function(_,C,V){for(var L=V;L>=0;L--)a(C[L],_)},i.prototype._condense=function(_){for(var C=_.length-1,V=void 0;C>=0;C--)_[C].children.length===0?C>0?(V=_[C-1].children).splice(V.indexOf(_[C]),1):this.clear():r(_[C],this.toBBox)},i})});var W7=dd((exports,module)=>{var N8i=T(S());/*! * protobuf.js v7.4.0 (c) 2016, daniel wirtz * compiled thu, 22 aug 2024 20:30:39 utc * licensed under the bsd-3-clause license * see: https://github.com/dcodeio/protobuf.js for details */(function(undefined){"use strict";(function(t,n,i){function o(s){var a=n[s];return a||t[s][0].call(a=n[s]={exports:{}},o,a,a.exports),a.exports}var r=o(i[0]);r.util.global.protobuf=r,typeof define=="function"&&define.amd&&define(["long"],function(s){return s&&s.isLong&&(r.util.Long=s,r.configure()),r}),typeof module=="object"&&module&&module.exports&&(module.exports=r)})({1:[function(e,t,n){"use strict";t.exports=i;function i(o,r){for(var s=new Array(arguments.length-1),a=0,c=2,d=!0;c1&&d.charAt(u)==="=";)++h;return Math.ceil(d.length*3)/4-h};for(var o=new Array(64),r=new Array(123),s=0;s<64;)r[o[s]=s<26?s+65:s<52?s+71:s<62?s-4:s-59|43]=s++;i.encode=function(d,u,h){for(var p=null,g=[],f=0,x=0,_;u>2],_=(C&3)<<4,x=1;break;case 1:g[f++]=o[_|C>>4],_=(C&15)<<2,x=2;break;case 2:g[f++]=o[_|C>>6],g[f++]=o[C&63],x=0;break}f>8191&&((p||(p=[])).push(String.fromCharCode.apply(String,g)),f=0)}return x&&(g[f++]=o[_],g[f++]=61,x===1&&(g[f++]=61)),p?(f&&p.push(String.fromCharCode.apply(String,g.slice(0,f))),p.join("")):String.fromCharCode.apply(String,g.slice(0,f))};var a="invalid encoding";i.decode=function(d,u,h){for(var p=h,g=0,f,x=0;x1)break;if((_=r[_])===undefined)throw Error(a);switch(g){case 0:f=_,g=1;break;case 1:u[h++]=f<<2|(_&48)>>4,f=_,g=2;break;case 2:u[h++]=(f&15)<<4|(_&60)>>2,f=_,g=3;break;case 3:u[h++]=(f&3)<<6|_,g=0;break}}if(g===1)throw Error(a);return h-p},i.test=function(d){return/^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/.test(d)}},{}],3:[function(e,t,n){"use strict";t.exports=i;function i(){this._listeners={}}i.prototype.on=function(r,s,a){return(this._listeners[r]||(this._listeners[r]=[])).push({fn:s,ctx:a||this}),this},i.prototype.off=function(r,s){if(r===undefined)this._listeners={};else if(s===undefined)this._listeners[r]=[];else for(var a=this._listeners[r],c=0;c0?0:2147483648,g,f);else if(isNaN(p))h(2143289344,g,f);else if(p>34028234663852886e22)h((x<<31|2139095040)>>>0,g,f);else if(p<11754943508222875e-54)h((x<<31|Math.round(p/1401298464324817e-60))>>>0,g,f);else{var _=Math.floor(Math.log(p)/Math.LN2),C=Math.round(p*Math.pow(2,-_)*8388608)&8388607;h((x<<31|_+127<<23|C)>>>0,g,f)}}c.writeFloatLE=d.bind(null,o),c.writeFloatBE=d.bind(null,r);function u(h,p,g){var f=h(p,g),x=(f>>31)*2+1,_=f>>>23&255,C=f&8388607;return _===255?C?NaN:x*(1/0):_===0?x*1401298464324817e-60*C:x*Math.pow(2,_-150)*(C+8388608)}c.readFloatLE=u.bind(null,s),c.readFloatBE=u.bind(null,a)}(),typeof Float64Array<"u"?function(){var d=new Float64Array([-0]),u=new Uint8Array(d.buffer),h=u[7]===128;function p(_,C,V){d[0]=_,C[V]=u[0],C[V+1]=u[1],C[V+2]=u[2],C[V+3]=u[3],C[V+4]=u[4],C[V+5]=u[5],C[V+6]=u[6],C[V+7]=u[7]}function g(_,C,V){d[0]=_,C[V]=u[7],C[V+1]=u[6],C[V+2]=u[5],C[V+3]=u[4],C[V+4]=u[3],C[V+5]=u[2],C[V+6]=u[1],C[V+7]=u[0]}c.writeDoubleLE=h?p:g,c.writeDoubleBE=h?g:p;function f(_,C){return u[0]=_[C],u[1]=_[C+1],u[2]=_[C+2],u[3]=_[C+3],u[4]=_[C+4],u[5]=_[C+5],u[6]=_[C+6],u[7]=_[C+7],d[0]}function x(_,C){return u[7]=_[C],u[6]=_[C+1],u[5]=_[C+2],u[4]=_[C+3],u[3]=_[C+4],u[2]=_[C+5],u[1]=_[C+6],u[0]=_[C+7],d[0]}c.readDoubleLE=h?f:x,c.readDoubleBE=h?x:f}():function(){function d(h,p,g,f,x,_){var C=f<0?1:0;if(C&&(f=-f),f===0)h(0,x,_+p),h(1/f>0?0:2147483648,x,_+g);else if(isNaN(f))h(0,x,_+p),h(2146959360,x,_+g);else if(f>17976931348623157e292)h(0,x,_+p),h((C<<31|2146435072)>>>0,x,_+g);else{var V;if(f<22250738585072014e-324)V=f/5e-324,h(V>>>0,x,_+p),h((C<<31|V/4294967296)>>>0,x,_+g);else{var L=Math.floor(Math.log(f)/Math.LN2);L===1024&&(L=1023),V=f*Math.pow(2,-L),h(V*4503599627370496>>>0,x,_+p),h((C<<31|L+1023<<20|V*1048576&1048575)>>>0,x,_+g)}}}c.writeDoubleLE=d.bind(null,o,0,4),c.writeDoubleBE=d.bind(null,r,4,0);function u(h,p,g,f,x){var _=h(f,x+p),C=h(f,x+g),V=(C>>31)*2+1,L=C>>>20&2047,R=4294967296*(C&1048575)+_;return L===2047?R?NaN:V*(1/0):L===0?V*5e-324*R:V*Math.pow(2,L-1075)*(R+4503599627370496)}c.readDoubleLE=u.bind(null,s,0,4),c.readDoubleBE=u.bind(null,a,4,0)}(),c}function o(c,d,u){d[u]=c&255,d[u+1]=c>>>8&255,d[u+2]=c>>>16&255,d[u+3]=c>>>24}function r(c,d,u){d[u]=c>>>24,d[u+1]=c>>>16&255,d[u+2]=c>>>8&255,d[u+3]=c&255}function s(c,d){return(c[d]|c[d+1]<<8|c[d+2]<<16|c[d+3]<<24)>>>0}function a(c,d){return(c[d]<<24|c[d+1]<<16|c[d+2]<<8|c[d+3])>>>0}},{}],5:[function(require,module,exports){"use strict";module.exports=inquire;function inquire(moduleName){try{var mod=eval("quire".replace(/^/,"re"))(moduleName);if(mod&&(mod.length||Object.keys(mod).length))return mod}catch(e){}return null}},{}],6:[function(e,t,n){"use strict";t.exports=i;function i(o,r,s){var a=s||8192,c=a>>>1,d=null,u=a;return function(p){if(p<1||p>c)return o(p);u+p>a&&(d=o(a),u=0);var g=r.call(d,u,u+=p);return u&7&&(u=(u|7)+1),g}}},{}],7:[function(e,t,n){"use strict";var i=n;i.length=function(r){for(var s=0,a=0,c=0;c191&&p<224?u[h++]=(p&31)<<6|r[s++]&63:p>239&&p<365?(p=((p&7)<<18|(r[s++]&63)<<12|(r[s++]&63)<<6|r[s++]&63)-65536,u[h++]=55296+(p>>10),u[h++]=56320+(p&1023)):u[h++]=(p&15)<<12|(r[s++]&63)<<6|r[s++]&63,h>8191&&((d||(d=[])).push(String.fromCharCode.apply(String,u)),h=0);return d?(h&&d.push(String.fromCharCode.apply(String,u.slice(0,h))),d.join("")):String.fromCharCode.apply(String,u.slice(0,h))},i.write=function(r,s,a){for(var c=a,d,u,h=0;h>6|192,s[a++]=d&63|128):(d&64512)===55296&&((u=r.charCodeAt(h+1))&64512)===56320?(d=65536+((d&1023)<<10)+(u&1023),++h,s[a++]=d>>18|240,s[a++]=d>>12&63|128,s[a++]=d>>6&63|128,s[a++]=d&63|128):(s[a++]=d>>12|224,s[a++]=d>>6&63|128,s[a++]=d&63|128);return a-c}},{}],8:[function(e,t,n){"use strict";var i=n;i.build="minimal",i.Writer=e(16),i.BufferWriter=e(17),i.Reader=e(9),i.BufferReader=e(10),i.util=e(15),i.rpc=e(12),i.roots=e(11),i.configure=o;function o(){i.util._configure(),i.Writer._configure(i.BufferWriter),i.Reader._configure(i.BufferReader)}o()},{10:10,11:11,12:12,15:15,16:16,17:17,9:9}],9:[function(e,t,n){"use strict";t.exports=c;var i=e(15),o,r=i.LongBits,s=i.utf8;function a(f,x){return RangeError("index out of range: "+f.pos+" + "+(x||1)+" > "+f.len)}function c(f){this.buf=f,this.pos=0,this.len=f.length}var d=typeof Uint8Array<"u"?function(x){if(x instanceof Uint8Array||Array.isArray(x))return new c(x);throw Error("illegal buffer")}:function(x){if(Array.isArray(x))return new c(x);throw Error("illegal buffer")},u=function(){return i.Buffer?function(_){return(c.create=function(V){return i.Buffer.isBuffer(V)?new o(V):d(V)})(_)}:d};c.create=u(),c.prototype._slice=i.Array.prototype.subarray||i.Array.prototype.slice,c.prototype.uint32=function(){var x=4294967295;return function(){if(x=(this.buf[this.pos]&127)>>>0,this.buf[this.pos++]<128||(x=(x|(this.buf[this.pos]&127)<<7)>>>0,this.buf[this.pos++]<128)||(x=(x|(this.buf[this.pos]&127)<<14)>>>0,this.buf[this.pos++]<128)||(x=(x|(this.buf[this.pos]&127)<<21)>>>0,this.buf[this.pos++]<128)||(x=(x|(this.buf[this.pos]&15)<<28)>>>0,this.buf[this.pos++]<128))return x;if((this.pos+=5)>this.len)throw this.pos=this.len,a(this,10);return x}}(),c.prototype.int32=function(){return this.uint32()|0},c.prototype.sint32=function(){var x=this.uint32();return x>>>1^-(x&1)|0};function h(){var f=new r(0,0),x=0;if(this.len-this.pos>4){for(;x<4;++x)if(f.lo=(f.lo|(this.buf[this.pos]&127)<>>0,this.buf[this.pos++]<128)return f;if(f.lo=(f.lo|(this.buf[this.pos]&127)<<28)>>>0,f.hi=(f.hi|(this.buf[this.pos]&127)>>4)>>>0,this.buf[this.pos++]<128)return f;x=0}else{for(;x<3;++x){if(this.pos>=this.len)throw a(this);if(f.lo=(f.lo|(this.buf[this.pos]&127)<>>0,this.buf[this.pos++]<128)return f}return f.lo=(f.lo|(this.buf[this.pos++]&127)<>>0,f}if(this.len-this.pos>4){for(;x<5;++x)if(f.hi=(f.hi|(this.buf[this.pos]&127)<>>0,this.buf[this.pos++]<128)return f}else for(;x<5;++x){if(this.pos>=this.len)throw a(this);if(f.hi=(f.hi|(this.buf[this.pos]&127)<>>0,this.buf[this.pos++]<128)return f}throw Error("invalid varint encoding")}c.prototype.bool=function(){return this.uint32()!==0};function p(f,x){return(f[x-4]|f[x-3]<<8|f[x-2]<<16|f[x-1]<<24)>>>0}c.prototype.fixed32=function(){if(this.pos+4>this.len)throw a(this,4);return p(this.buf,this.pos+=4)},c.prototype.sfixed32=function(){if(this.pos+4>this.len)throw a(this,4);return p(this.buf,this.pos+=4)|0};function g(){if(this.pos+8>this.len)throw a(this,8);return new r(p(this.buf,this.pos+=4),p(this.buf,this.pos+=4))}c.prototype.float=function(){if(this.pos+4>this.len)throw a(this,4);var x=i.float.readFloatLE(this.buf,this.pos);return this.pos+=4,x},c.prototype.double=function(){if(this.pos+8>this.len)throw a(this,4);var x=i.float.readDoubleLE(this.buf,this.pos);return this.pos+=8,x},c.prototype.bytes=function(){var x=this.uint32(),_=this.pos,C=this.pos+x;if(C>this.len)throw a(this,x);if(this.pos+=x,Array.isArray(this.buf))return this.buf.slice(_,C);if(_===C){var V=i.Buffer;return V?V.alloc(0):new this.buf.constructor(0)}return this._slice.call(this.buf,_,C)},c.prototype.string=function(){var x=this.bytes();return s.read(x,0,x.length)},c.prototype.skip=function(x){if(typeof x=="number"){if(this.pos+x>this.len)throw a(this,x);this.pos+=x}else do if(this.pos>=this.len)throw a(this);while(this.buf[this.pos++]&128);return this},c.prototype.skipType=function(f){switch(f){case 0:this.skip();break;case 1:this.skip(8);break;case 2:this.skip(this.uint32());break;case 3:for(;(f=this.uint32()&7)!==4;)this.skipType(f);break;case 5:this.skip(4);break;default:throw Error("invalid wire type "+f+" at offset "+this.pos)}return this},c._configure=function(f){o=f,c.create=u(),o._configure();var x=i.Long?"toLong":"toNumber";i.merge(c.prototype,{int64:function(){return h.call(this)[x](!1)},uint64:function(){return h.call(this)[x](!0)},sint64:function(){return h.call(this).zzDecode()[x](!1)},fixed64:function(){return g.call(this)[x](!0)},sfixed64:function(){return g.call(this)[x](!1)}})}},{15:15}],10:[function(e,t,n){"use strict";t.exports=r;var i=e(9);(r.prototype=Object.create(i.prototype)).constructor=r;var o=e(15);function r(s){i.call(this,s)}r._configure=function(){o.Buffer&&(r.prototype._slice=o.Buffer.prototype.slice)},r.prototype.string=function(){var a=this.uint32();return this.buf.utf8Slice?this.buf.utf8Slice(this.pos,this.pos=Math.min(this.pos+a,this.len)):this.buf.toString("utf-8",this.pos,this.pos=Math.min(this.pos+a,this.len))},r._configure()},{15:15,9:9}],11:[function(e,t,n){"use strict";t.exports={}},{}],12:[function(e,t,n){"use strict";var i=n;i.Service=e(13)},{13:13}],13:[function(e,t,n){"use strict";t.exports=o;var i=e(15);(o.prototype=Object.create(i.EventEmitter.prototype)).constructor=o;function o(r,s,a){if(typeof r!="function")throw TypeError("rpcImpl must be a function");i.EventEmitter.call(this),this.rpcImpl=r,this.requestDelimited=!!s,this.responseDelimited=!!a}o.prototype.rpcCall=function r(s,a,c,d,u){if(!d)throw TypeError("request must be specified");var h=this;if(!u)return i.asPromise(r,h,s,a,c,d);if(!h.rpcImpl)return setTimeout(function(){u(Error("already ended"))},0),undefined;try{return h.rpcImpl(s,a[h.requestDelimited?"encodeDelimited":"encode"](d).finish(),function(g,f){if(g)return h.emit("error",g,s),u(g);if(f===null)return h.end(!0),undefined;if(!(f instanceof c))try{f=c[h.responseDelimited?"decodeDelimited":"decode"](f)}catch(x){return h.emit("error",x,s),u(x)}return h.emit("data",f,s),u(null,f)})}catch(p){return h.emit("error",p,s),setTimeout(function(){u(p)},0),undefined}},o.prototype.end=function(s){return this.rpcImpl&&(s||this.rpcImpl(null,null,null),this.rpcImpl=null,this.emit("end").off()),this}},{15:15}],14:[function(e,t,n){"use strict";t.exports=o;var i=e(15);function o(c,d){this.lo=c>>>0,this.hi=d>>>0}var r=o.zero=new o(0,0);r.toNumber=function(){return 0},r.zzEncode=r.zzDecode=function(){return this},r.length=function(){return 1};var s=o.zeroHash="\0\0\0\0\0\0\0\0";o.fromNumber=function(d){if(d===0)return r;var u=d<0;u&&(d=-d);var h=d>>>0,p=(d-h)/4294967296>>>0;return u&&(p=~p>>>0,h=~h>>>0,++h>4294967295&&(h=0,++p>4294967295&&(p=0))),new o(h,p)},o.from=function(d){if(typeof d=="number")return o.fromNumber(d);if(i.isString(d))if(i.Long)d=i.Long.fromString(d);else return o.fromNumber(parseInt(d,10));return d.low||d.high?new o(d.low>>>0,d.high>>>0):r},o.prototype.toNumber=function(d){if(!d&&this.hi>>>31){var u=~this.lo+1>>>0,h=~this.hi>>>0;return u||(h=h+1>>>0),-(u+h*4294967296)}return this.lo+this.hi*4294967296},o.prototype.toLong=function(d){return i.Long?new i.Long(this.lo|0,this.hi|0,!!d):{low:this.lo|0,high:this.hi|0,unsigned:!!d}};var a=String.prototype.charCodeAt;o.fromHash=function(d){return d===s?r:new o((a.call(d,0)|a.call(d,1)<<8|a.call(d,2)<<16|a.call(d,3)<<24)>>>0,(a.call(d,4)|a.call(d,5)<<8|a.call(d,6)<<16|a.call(d,7)<<24)>>>0)},o.prototype.toHash=function(){return String.fromCharCode(this.lo&255,this.lo>>>8&255,this.lo>>>16&255,this.lo>>>24,this.hi&255,this.hi>>>8&255,this.hi>>>16&255,this.hi>>>24)},o.prototype.zzEncode=function(){var d=this.hi>>31;return this.hi=((this.hi<<1|this.lo>>>31)^d)>>>0,this.lo=(this.lo<<1^d)>>>0,this},o.prototype.zzDecode=function(){var d=-(this.lo&1);return this.lo=((this.lo>>>1|this.hi<<31)^d)>>>0,this.hi=(this.hi>>>1^d)>>>0,this},o.prototype.length=function(){var d=this.lo,u=(this.lo>>>28|this.hi<<4)>>>0,h=this.hi>>>24;return h===0?u===0?d<16384?d<128?1:2:d<2097152?3:4:u<16384?u<128?5:6:u<2097152?7:8:h<128?9:10}},{15:15}],15:[function(e,t,n){"use strict";var i=n;i.asPromise=e(1),i.base64=e(2),i.EventEmitter=e(3),i.float=e(4),i.inquire=e(5),i.utf8=e(7),i.pool=e(6),i.LongBits=e(14),i.isNode=!!(typeof global<"u"&&global&&global.process&&global.process.versions&&global.process.versions.node),i.global=i.isNode&&global||typeof window<"u"&&window||typeof self<"u"&&self||this,i.emptyArray=Object.freeze?Object.freeze([]):[],i.emptyObject=Object.freeze?Object.freeze({}):{},i.isInteger=Number.isInteger||function(a){return typeof a=="number"&&isFinite(a)&&Math.floor(a)===a},i.isString=function(a){return typeof a=="string"||a instanceof String},i.isObject=function(a){return a&&typeof a=="object"},i.isset=i.isSet=function(a,c){var d=a[c];return d!=null&&a.hasOwnProperty(c)?typeof d!="object"||(Array.isArray(d)?d.length:Object.keys(d).length)>0:!1},i.Buffer=function(){try{var s=i.inquire("buffer").Buffer;return s.prototype.utf8Write?s:null}catch{return null}}(),i._Buffer_from=null,i._Buffer_allocUnsafe=null,i.newBuffer=function(a){return typeof a=="number"?i.Buffer?i._Buffer_allocUnsafe(a):new i.Array(a):i.Buffer?i._Buffer_from(a):typeof Uint8Array>"u"?a:new Uint8Array(a)},i.Array=typeof Uint8Array<"u"?Uint8Array:Array,i.Long=i.global.dcodeIO&&i.global.dcodeIO.Long||i.global.Long||i.inquire("long"),i.key2Re=/^true|false|0|1$/,i.key32Re=/^-?(?:0|[1-9][0-9]*)$/,i.key64Re=/^(?:[\\x00-\\xff]{8}|-?(?:0|[1-9][0-9]*))$/,i.longToHash=function(a){return a?i.LongBits.from(a).toHash():i.LongBits.zeroHash},i.longFromHash=function(a,c){var d=i.LongBits.fromHash(a);return i.Long?i.Long.fromBits(d.lo,d.hi,c):d.toNumber(!!c)};function o(s,a,c){for(var d=Object.keys(a),u=0;u-1;--h)if(c[u[h]]===1&&this[u[h]]!==undefined&&this[u[h]]!==null)return u[h]}},i.oneOfSetter=function(a){return function(c){for(var d=0;d127;)R[G++]=L&127|128,L>>>=7;R[G]=L}function x(L,R){this.len=L,this.next=undefined,this.val=R}x.prototype=Object.create(c.prototype),x.prototype.fn=f,h.prototype.uint32=function(R){return this.len+=(this.tail=this.tail.next=new x((R=R>>>0)<128?1:R<16384?2:R<2097152?3:R<268435456?4:5,R)).len,this},h.prototype.int32=function(R){return R<0?this._push(_,10,r.fromNumber(R)):this.uint32(R)},h.prototype.sint32=function(R){return this.uint32((R<<1^R>>31)>>>0)};function _(L,R,G){for(;L.hi;)R[G++]=L.lo&127|128,L.lo=(L.lo>>>7|L.hi<<25)>>>0,L.hi>>>=7;for(;L.lo>127;)R[G++]=L.lo&127|128,L.lo=L.lo>>>7;R[G++]=L.lo}h.prototype.uint64=function(R){var G=r.from(R);return this._push(_,G.length(),G)},h.prototype.int64=h.prototype.uint64,h.prototype.sint64=function(R){var G=r.from(R).zzEncode();return this._push(_,G.length(),G)},h.prototype.bool=function(R){return this._push(g,1,R?1:0)};function C(L,R,G){R[G]=L&255,R[G+1]=L>>>8&255,R[G+2]=L>>>16&255,R[G+3]=L>>>24}h.prototype.fixed32=function(R){return this._push(C,4,R>>>0)},h.prototype.sfixed32=h.prototype.fixed32,h.prototype.fixed64=function(R){var G=r.from(R);return this._push(C,4,G.lo)._push(C,4,G.hi)},h.prototype.sfixed64=h.prototype.fixed64,h.prototype.float=function(R){return this._push(i.float.writeFloatLE,4,R)},h.prototype.double=function(R){return this._push(i.float.writeDoubleLE,8,R)};var V=i.Array.prototype.set?function(R,G,I){G.set(R,I)}:function(R,G,I){for(var v=0;v>>0;if(!G)return this._push(g,1,0);if(i.isString(R)){var I=h.alloc(G=s.length(R));s.decode(R,I,0),R=I}return this.uint32(G)._push(V,G,R)},h.prototype.string=function(R){var G=a.length(R);return G?this.uint32(G)._push(a.write,G,R):this._push(g,1,0)},h.prototype.fork=function(){return this.states=new u(this),this.head=this.tail=new c(d,0,0),this.len=0,this},h.prototype.reset=function(){return this.states?(this.head=this.states.head,this.tail=this.states.tail,this.len=this.states.len,this.states=this.states.next):(this.head=this.tail=new c(d,0,0),this.len=0),this},h.prototype.ldelim=function(){var R=this.head,G=this.tail,I=this.len;return this.reset().uint32(I),I&&(this.tail.next=R.next,this.tail=G,this.len+=I),this},h.prototype.finish=function(){for(var R=this.head.next,G=this.constructor.alloc(this.len),I=0;R;)R.fn(R.val,G,I),I+=R.len,R=R.next;return G},h._configure=function(L){o=L,h.create=p(),o._configure()}},{15:15}],17:[function(e,t,n){"use strict";t.exports=r;var i=e(16);(r.prototype=Object.create(i.prototype)).constructor=r;var o=e(15);function r(){i.call(this)}r._configure=function(){r.alloc=o._Buffer_allocUnsafe,r.writeBytesBuffer=o.Buffer&&o.Buffer.prototype instanceof Uint8Array&&o.Buffer.prototype.set.name==="set"?function(c,d,u){d.set(c,u)}:function(c,d,u){if(c.copy)c.copy(d,u,0,c.length);else for(var h=0;h>>0;return this.uint32(d),d&&this._push(r.writeBytesBuffer,d,c),this};function s(a,c,d){a.length<40?o.utf8.write(a,c,d):c.utf8Write?c.utf8Write(a,d):c.write(a,d)}r.prototype.string=function(c){var d=o.Buffer.byteLength(c);return this.uint32(d),d&&this._push(s,d,c),this},r._configure()},{15:15,16:16}]},{},[8])})()});var xCe=dd((_oo,LB)=>{var Too=T(S());/* Copyright 2015-2018 Esri. 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 @preserve */(function(){var e=function(){var o={};o.defaultNoDataValue=-34027999387901484e22,o.decode=function(u,h){h=h||{};var p=h.encodedMaskData||h.encodedMaskData===null,g=c(u,h.inputOffset||0,p),f=h.noDataValue!==null?h.noDataValue:o.defaultNoDataValue,x=r(g,h.pixelType||Float32Array,h.encodedMaskData,f,h.returnMask),_={width:g.width,height:g.height,pixelData:x.resultPixels,minValue:x.minValue,maxValue:g.pixels.maxValue,noDataValue:f};return x.resultMask&&(_.maskData=x.resultMask),h.returnEncodedMask&&g.mask&&(_.encodedMaskData=g.mask.bitset?g.mask.bitset:null),h.returnFileInfo&&(_.fileInfo=s(g),h.computeUsedBitDepths&&(_.fileInfo.bitDepths=a(g))),_};var r=function(u,h,p,g,f){var x=0,_=u.pixels.numBlocksX,C=u.pixels.numBlocksY,V=Math.floor(u.width/_),L=Math.floor(u.height/C),R=2*u.maxZError,G=Number.MAX_VALUE,I;p=p||(u.mask?u.mask.bitset:null);var v,P;v=new h(u.width*u.height),f&&p&&(P=new Uint8Array(u.width*u.height));for(var w=new Float32Array(V*L),A,b,Z=0;Z<=C;Z++){var E=Z!==C?L:u.height%C;if(E!==0)for(var X=0;X<=_;X++){var F=X!==_?V:u.width%_;if(F!==0){var N=Z*u.width*L+X*V,O=u.width-F,U=u.pixels.blocks[x],Y,k,H;U.encoding<2?(U.encoding===0?Y=U.rawData:(d(U.stuffedData,U.bitsPerPixel,U.numValidPixels,U.offset,R,w,u.pixels.maxValue),Y=w),k=0):U.encoding===2?H=0:H=U.offset;var K;if(p)for(b=0;b>3],K<<=N&7),A=0;A>3]),K&128?(P&&(P[N]=1),I=U.encoding<2?Y[k++]:H,G=G>I?I:G,v[N++]=I):(P&&(P[N]=0),v[N++]=g),K<<=1;N+=O}else if(U.encoding<2)for(b=0;bI?I:G,v[N++]=I;N+=O}else for(G=G>H?H:G,b=0;b0){var _=new Uint8Array(Math.ceil(g.width*g.height/8));x=new DataView(u,h,g.mask.numBytes);var C=x.getInt16(0,!0),V=2,L=0;do{if(C>0)for(;C--;)_[L++]=x.getUint8(V++);else{var R=x.getUint8(V++);for(C=-C;C--;)_[L++]=R}C=x.getInt16(V,!0),V+=2}while(V0?1:0),P=I+(g.height%I>0?1:0);g.pixels.blocks=new Array(v*P);for(var w=0,A=0;A3)throw"Invalid block encoding ("+X.encoding+")";if(X.encoding===2){h++;continue}if(F!==0&&F!==2){if(F>>=6,X.offsetType=F,F===2)X.offset=x.getInt8(1),Z++;else if(F===1)X.offset=x.getInt16(1,!0),Z+=2;else if(F===0)X.offset=x.getFloat32(1,!0),Z+=4;else throw"Invalid block offset type";if(X.encoding===1)if(F=x.getUint8(Z),Z++,X.bitsPerPixel=F&63,F>>=6,X.numValidPixelsType=F,F===2)X.numValidPixels=x.getUint8(Z),Z++;else if(F===1)X.numValidPixels=x.getUint16(Z,!0),Z+=2;else if(F===0)X.numValidPixels=x.getUint32(Z,!0),Z+=4;else throw"Invalid valid pixel count type"}if(h+=Z,X.encoding!==3){var N,O;if(X.encoding===0){var U=(g.pixels.numBytes-1)/4;if(U!==Math.floor(U))throw"uncompressed block has invalid length";N=new ArrayBuffer(U*4),O=new Uint8Array(N),O.set(new Uint8Array(u,h,U*4));var Y=new Float32Array(N);X.rawData=Y,h+=U*4}else if(X.encoding===1){var k=Math.ceil(X.numValidPixels*X.bitsPerPixel/8),H=Math.ceil(k/4);N=new ArrayBuffer(H*4),O=new Uint8Array(N),O.set(new Uint8Array(u,h,k)),X.stuffedData=new Uint32Array(N),h+=k}}}return g.eofOffset=h,g},d=function(u,h,p,g,f,x,_){var C=(1<=h)G=I>>>R-h&C,R-=h;else{var w=h-R;G=(I&C)<>>R}x[L]=G=u?(R=G>>>L-u&_,L-=u):(I=u-L,R=(G&_)<>>L),d[V]=p[R];else for(v=Math.ceil((x-g)/f),V=0;V=u?(R=G>>>L-u&_,L-=u):(I=u-L,R=(G&_)<>>L),d[V]=R=d?(L=R>>>V-d&f,V-=d):(C=d-V,L=(R&f)<>>V),G[_]=L=u?(G=I>>>R&_,L-=u,R+=u):(v=u-L,G=I>>>R&_,I=c[C++],L=32-v,G|=(I&(1<=u?(G=I>>>R&_,L-=u,R+=u):(v=u-L,G=I>>>R&_,I=c[C++],L=32-v,G|=(I&(1<=d?(L=G>>>R&f,V-=d,R+=d):(C=d-V,L=G>>>R&f,G=c[x++],V=32-C,L|=(G&(1<=u?(_=C>>>x-u&p,x-=u):(V=u-x,_=(C&p)<>>x),d[f]=_;return d},originalUnstuff2:function(c,d,u,h){var p=(1<=u?(C=V>>>_&p,x-=u,_+=u):(L=u-x,C=V>>>_&p,V=c[g++],x=32-L,C|=(V&(1<=359?359:p;p-=f;do d+=c[g++]<<8,u+=d+=c[g++];while(--f);d=(d&65535)+(d>>>16),u=(u&65535)+(u>>>16)}return h&1&&(u+=d+=c[g]<<8),d=(d&65535)+(d>>>16),u=(u&65535)+(u>>>16),(u<<16|d)>>>0},readHeaderInfo:function(c,d){var u=d.ptr,h=new Uint8Array(c,u,6),p={};if(p.fileIdentifierString=String.fromCharCode.apply(null,h),p.fileIdentifierString.lastIndexOf("Lerc2",0)!==0)throw"Unexpected file identifier string (expect Lerc2 ): "+p.fileIdentifierString;u+=6;var g=new DataView(c,u,8),f=g.getInt32(0,!0);p.fileVersion=f,u+=4,f>=3&&(p.checksum=g.getUint32(4,!0),u+=4),g=new DataView(c,u,12),p.height=g.getUint32(0,!0),p.width=g.getUint32(4,!0),u+=8,f>=4?(p.numDims=g.getUint32(8,!0),u+=4):p.numDims=1,g=new DataView(c,u,40),p.numValidPixel=g.getUint32(0,!0),p.microBlockSize=g.getInt32(4,!0),p.blobSize=g.getInt32(8,!0),p.imageType=g.getInt32(12,!0),p.maxZError=g.getFloat64(16,!0),p.zMin=g.getFloat64(24,!0),p.zMax=g.getFloat64(32,!0),u+=40,d.headerInfo=p,d.ptr=u;var x,_;if(f>=3&&(_=f>=4?52:48,x=this.computeChecksumFletcher32(new Uint8Array(c,u-_,p.blobSize-14)),x!==p.checksum))throw"Checksum failed.";return!0},checkMinMaxRanges:function(c,d){var u=d.headerInfo,h=this.getDataTypeArray(u.imageType),p=u.numDims*this.getDataTypeSize(u.imageType),g=this.readSubArray(c,d.ptr,h,p),f=this.readSubArray(c,d.ptr+p,h,p);d.ptr+=2*p;var x,_=!0;for(x=0;x0){_=new Uint8Array(Math.ceil(p/8)),f=new DataView(c,u,x.numBytes);var V=f.getInt16(0,!0),L=2,R=0,G=0;do{if(V>0)for(;V--;)_[R++]=f.getUint8(L++);else for(G=f.getUint8(L++),V=-V;V--;)_[R++]=G;V=f.getInt16(L,!0),L+=2}while(L>3],I<<=v&7):I=_[v>>3],I&128&&(C[v]=1);d.pixels.resultMask=C,x.bitset=_,u+=x.numBytes}return d.ptr=u,d.mask=x,!0},readDataOneSweep:function(c,d,u){var h=d.ptr,p=d.headerInfo,g=p.numDims,f=p.width*p.height,x=p.imageType,_=p.numValidPixel*r.getDataTypeSize(x)*g,C,V=d.pixels.resultMask;if(u===Uint8Array)C=new Uint8Array(c,h,_);else{var L=new ArrayBuffer(_),R=new Uint8Array(L);R.set(new Uint8Array(c,h,_)),C=new u(L)}if(C.length===f*g)d.pixels.resultPixels=C;else{d.pixels.resultPixels=new u(f*g);var G=0,I=0,v=0,P=0;if(g>1)for(v=0;v=x)return!1;var _=new Uint32Array(x-f);r.decodeBits(c,d,_);var C=[],V,L,R,G;for(V=f;V0&&(C[L].second=Z<>>32-G,32-b>=G?(b+=G,b===32&&(b=0,E++,Z=A[E])):(b+=G-32,E++,Z=A[E],C[L].second|=Z>>>32-b));var X=0,F=0,N=new s;for(V=0;V=u?F=u:F=X,X>=30&&console.log("WARning, large NUM LUT BITS IS "+X);var O=[],U,Y,k,H,K,te;for(V=f;V0)if(U=[G,L],G<=F)for(Y=C[L].second<=0;H--)K=Y>>>H&1,K?(te.right||(te.right=new s),te=te.right):(te.left||(te.left=new s),te=te.left),H===0&&!te.val&&(te.val=U[1]);return{decodeLut:O,numBitsLUTQick:F,numBitsLUT:X,tree:N,stuffedData:A,srcPtr:E,bitPos:b}},readHuffman:function(c,d,u){var h=d.headerInfo,p=h.numDims,g=d.headerInfo.height,f=d.headerInfo.width,x=f*g,_=this.readHuffmanTree(c,d),C=_.decodeLut,V=_.tree,L=_.stuffedData,R=_.srcPtr,G=_.bitPos,I=_.numBitsLUTQick,v=_.numBitsLUT,P=d.headerInfo.imageType===0?128:0,w,A,b,Z=d.pixels.resultMask,E,X,F,N,O,U,Y,k=0;G>0&&(R++,G=0);var H=L[R],K=d.encodeMode===1,te=new u(x*p),z=te,j;for(j=0;j1&&(z=new u(te.buffer,x*j,x),k=0),d.headerInfo.numValidPixel===f*g)for(U=0,N=0;N>>32-I,X=E,32-G>>64-G-I,X=E),C[X])A=C[X][1],G+=C[X][0];else for(E=H<>>32-v,X=E,32-G>>64-G-v,X=E),w=V,Y=0;Y>>v-Y-1&1,w=F?w.right:w.left,!(w.left||w.right)){A=w.val,G=G+Y+1;break}G>=32&&(G-=32,R++,H=L[R]),b=A-P,K?(O>0?b+=k:N>0?b+=z[U-f]:b+=k,b&=255,z[U]=b,k=b):z[U]=b}else for(U=0,N=0;N>>32-I,X=E,32-G>>64-G-I,X=E),C[X])A=C[X][1],G+=C[X][0];else for(E=H<>>32-v,X=E,32-G>>64-G-v,X=E),w=V,Y=0;Y>>v-Y-1&1,w=F?w.right:w.left,!(w.left||w.right)){A=w.val,G=G+Y+1;break}G>=32&&(G-=32,R++,H=L[R]),b=A-P,K?(O>0&&Z[U-1]?b+=k:N>0&&Z[U-f]?b+=z[U-f]:b+=k,b&=255,z[U]=b,k=b):z[U]=b}d.ptr=d.ptr+(R+1)*4+(G>0?4:0)}d.pixels.resultPixels=te},decodeBits:function(c,d,u,h,p){{var g=d.headerInfo,f=g.fileVersion,x=0,_=new DataView(c,d.ptr,5),C=_.getUint8(0);x++;var V=C>>6,L=V===0?4:3-V,R=(C&32)>0,G=C&31,I=0;if(L===1)I=_.getUint8(x),x++;else if(L===2)I=_.getUint16(x,!0),x+=2;else if(L===4)I=_.getUint32(x,!0),x+=4;else throw"Invalid valid pixel count type";var v=2*g.maxZError,P,w,A,b,Z,E,X,F,N,O,U=g.numDims>1?g.maxValues[p]:g.zMax;if(R){for(d.counter.lut++,F=_.getUint8(x),N=G,x++,b=Math.ceil((F-1)*G/8),Z=Math.ceil(b/4),w=new ArrayBuffer(Z*4),A=new Uint8Array(w),d.ptr+=x,A.set(new Uint8Array(c,d.ptr,b)),X=new Uint32Array(w),d.ptr+=b,O=0;F-1>>>O;)O++;b=Math.ceil(I*O/8),Z=Math.ceil(b/4),w=new ArrayBuffer(Z*4),A=new Uint8Array(w),A.set(new Uint8Array(c,d.ptr,b)),P=new Uint32Array(w),d.ptr+=b,f>=3?E=o.unstuffLUT2(X,G,F-1,h,v,U):E=o.unstuffLUT(X,G,F-1,h,v,U),f>=3?o.unstuff2(P,u,O,I,E):o.unstuff(P,u,O,I,E)}else d.counter.bitstuffer++,O=G,d.ptr+=x,O>0&&(b=Math.ceil(I*O/8),Z=Math.ceil(b/4),w=new ArrayBuffer(Z*4),A=new Uint8Array(w),A.set(new Uint8Array(c,d.ptr,b)),P=new Uint32Array(w),d.ptr+=b,f>=3?h==null?o.originalUnstuff2(P,u,O,I):o.unstuff2(P,u,O,I,!1,h,v,U):h==null?o.originalUnstuff(P,u,O,I):o.unstuff(P,u,O,I,!1,h,v,U))}},readTiles:function(c,d,u){var h=d.headerInfo,p=h.width,g=h.height,f=h.microBlockSize,x=h.imageType,_=r.getDataTypeSize(x),C=Math.ceil(p/f),V=Math.ceil(g/f);d.pixels.numBlocksY=V,d.pixels.numBlocksX=C,d.pixels.ptr=0;var L=0,R=0,G=0,I=0,v=0,P=0,w=0,A=0,b=0,Z=0,E=0,X=0,F=0,N=0,O=0,U=0,Y,k,H,K,te,z,j=new u(f*f),ee=g%f||f,pe=p%f||f,_e,ae,ye=h.numDims,Se,Ee=d.pixels.resultMask,Ie=d.pixels.resultPixels;for(G=0;G1&&(Ie=new u(d.pixels.resultPixels.buffer,p*g*Se*_,p*g)),w=c.byteLength-d.ptr,Y=new DataView(c,d.ptr,Math.min(10,w)),k={},U=0,A=Y.getUint8(0),U++,b=A>>6&255,Z=A>>2&15,Z!==(I*f>>3&15))throw"integrity issue";if(z=A&3,z>3)throw d.ptr+=U,"Invalid block encoding ("+z+")";if(z===2){d.counter.constant++,d.ptr+=U;continue}else if(z===0){if(d.counter.uncompressed++,d.ptr+=U,F=v*P*_,N=c.byteLength-d.ptr,F=F1)for(g=0;g=-128&&d<=127;break;case 1:u=d>=0&&d<=255;break;case 2:u=d>=-32768&&d<=32767;break;case 3:u=d>=0&&d<=65536;break;case 4:u=d>=-2147483648&&d<=2147483647;break;case 5:u=d>=0&&d<=4294967296;break;case 6:u=d>=-34027999387901484e22&&d<=34027999387901484e22;break;case 7:u=d>=5e-324&&d<=17976931348623157e292;break;default:u=!1}return u},getDataTypeSize:function(c){var d=0;switch(c){case 0:case 1:d=1;break;case 2:case 3:d=2;break;case 4:case 5:case 6:d=4;break;case 7:d=8;break;default:d=c}return d},getDataTypeUsed:function(c,d){var u=c;switch(c){case 2:case 4:u=c-d;break;case 3:case 5:u=c-2*d;break;case 6:d===0?u=c:d===1?u=2:u=1;break;case 7:d===0?u=c:u=c-2*d+1;break;default:u=c;break}return u},getOnePixel:function(c,d,u,h){var p=0;switch(u){case 0:p=h.getInt8(d);break;case 1:p=h.getUint8(d);break;case 2:p=h.getInt16(d,!0);break;case 3:p=h.getUint16(d,!0);break;case 4:p=h.getInt32(d,!0);break;case 5:p=h.getUInt32(d,!0);break;case 6:p=h.getFloat32(d,!0);break;case 7:p=h.getFloat64(d,!0);break;default:throw"the decoder does not understand this pixel type"}return p}},s=function(c,d,u){this.val=c,this.left=d,this.right=u},a={decode:function(c,d){d=d||{};var u=d.noDataValue,h=0,p={};if(p.ptr=d.inputOffset||0,p.pixels={},!!r.readHeaderInfo(c,p)){var g=p.headerInfo,f=g.fileVersion,x=r.getDataTypeArray(g.imageType);r.readMask(c,p),g.numValidPixel!==g.width*g.height&&!p.pixels.resultMask&&(p.pixels.resultMask=d.maskData);var _=g.width*g.height;if(p.pixels.resultPixels=new x(_*g.numDims),p.counter={onesweep:0,uncompressed:0,lut:0,bitstuffer:0,constant:0,constantoffset:0},g.numValidPixel!==0)if(g.zMax===g.zMin)r.constructConstantSurface(p);else if(f>=4&&r.checkMinMaxRanges(c,p))r.constructConstantSurface(p);else{var C=new DataView(c,p.ptr,2),V=C.getUint8(0);if(p.ptr++,V)r.readDataOneSweep(c,p,x);else if(f>1&&g.imageType<=1&&Math.abs(g.maxZError-.5)<1e-5){var L=C.getUint8(1);if(p.ptr++,p.encodeMode=L,L>2||f<4&&L>1)throw"Invalid Huffman flag "+L;L?r.readHuffman(c,p,x):r.readTiles(c,p,x)}else r.readTiles(c,p,x)}p.eofOffset=p.ptr;var R;d.inputOffset?(R=p.headerInfo.blobSize+d.inputOffset-p.ptr,Math.abs(R)>=1&&(p.eofOffset=d.inputOffset+p.headerInfo.blobSize)):(R=p.headerInfo.blobSize-p.ptr,Math.abs(R)>=1&&(p.eofOffset=p.headerInfo.blobSize));var G={width:g.width,height:g.height,pixelData:p.pixels.resultPixels,minValue:g.zMin,maxValue:g.zMax,validPixelCount:g.numValidPixel,dimCount:g.numDims,dimStats:{minValues:g.minValues,maxValues:g.maxValues},maskData:p.pixels.resultMask};if(p.pixels.resultMask&&r.isValidPixelValue(g.imageType,u)){var I=p.pixels.resultMask;for(h=0;h<_;h++)I[h]||(G.pixelData[h]=u);G.noDataValue=u}return p.noDataValue=u,d.returnFileInfo&&(G.fileInfo=r.formatFileInfo(p)),G}},getBandCount:function(c){var d=0,u=0,h={};for(h.ptr=0,h.pixels={};u1&&V.fileInfo.mask&&V.fileInfo.mask.numBytes>0&&f.push(V.maskData),h++,C.pixels.push(V.pixelData),C.statistics.push({minValue:V.minValue,maxValue:V.maxValue,noDataValue:V.noDataValue,dimStats:V.dimStats})}var L,R,G;if(u>1&&f.length>1){for(G=C.width*C.height,C.bandMasks=f,_=new Uint8Array(G),_.set(f[0]),L=1;L{var TXo=T(S());i1e.exports={webm:"data:video/webm;base64,GkXfowEAAAAAAAAfQoaBAUL3gQFC8oEEQvOBCEKChHdlYm1Ch4EEQoWBAhhTgGcBAAAAAAAVkhFNm3RALE27i1OrhBVJqWZTrIHfTbuMU6uEFlSua1OsggEwTbuMU6uEHFO7a1OsghV17AEAAAAAAACkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVSalmAQAAAAAAAEUq17GDD0JATYCNTGF2ZjU1LjMzLjEwMFdBjUxhdmY1NS4zMy4xMDBzpJBlrrXf3DCDVB8KcgbMpcr+RImIQJBgAAAAAAAWVK5rAQAAAAAAD++uAQAAAAAAADLXgQFzxYEBnIEAIrWcg3VuZIaFVl9WUDiDgQEj44OEAmJaAOABAAAAAAAABrCBsLqBkK4BAAAAAAAPq9eBAnPFgQKcgQAitZyDdW5khohBX1ZPUkJJU4OBAuEBAAAAAAAAEZ+BArWIQOdwAAAAAABiZIEgY6JPbwIeVgF2b3JiaXMAAAAAAoC7AAAAAAAAgLUBAAAAAAC4AQN2b3JiaXMtAAAAWGlwaC5PcmcgbGliVm9yYmlzIEkgMjAxMDExMDEgKFNjaGF1ZmVudWdnZXQpAQAAABUAAABlbmNvZGVyPUxhdmM1NS41Mi4xMDIBBXZvcmJpcyVCQ1YBAEAAACRzGCpGpXMWhBAaQlAZ4xxCzmvsGUJMEYIcMkxbyyVzkCGkoEKIWyiB0JBVAABAAACHQXgUhIpBCCGEJT1YkoMnPQghhIg5eBSEaUEIIYQQQgghhBBCCCGERTlokoMnQQgdhOMwOAyD5Tj4HIRFOVgQgydB6CCED0K4moOsOQghhCQ1SFCDBjnoHITCLCiKgsQwuBaEBDUojILkMMjUgwtCiJqDSTX4GoRnQXgWhGlBCCGEJEFIkIMGQcgYhEZBWJKDBjm4FITLQagahCo5CB+EIDRkFQCQAACgoiiKoigKEBqyCgDIAAAQQFEUx3EcyZEcybEcCwgNWQUAAAEACAAAoEiKpEiO5EiSJFmSJVmSJVmS5omqLMuyLMuyLMsyEBqyCgBIAABQUQxFcRQHCA1ZBQBkAAAIoDiKpViKpWiK54iOCISGrAIAgAAABAAAEDRDUzxHlETPVFXXtm3btm3btm3btm3btm1blmUZCA1ZBQBAAAAQ0mlmqQaIMAMZBkJDVgEACAAAgBGKMMSA0JBVAABAAACAGEoOogmtOd+c46BZDppKsTkdnEi1eZKbirk555xzzsnmnDHOOeecopxZDJoJrTnnnMSgWQqaCa0555wnsXnQmiqtOeeccc7pYJwRxjnnnCateZCajbU555wFrWmOmkuxOeecSLl5UptLtTnnnHPOOeecc84555zqxekcnBPOOeecqL25lpvQxTnnnE/G6d6cEM4555xzzjnnnHPOOeecIDRkFQAABABAEIaNYdwpCNLnaCBGEWIaMulB9+gwCRqDnELq0ehopJQ6CCWVcVJKJwgNWQUAAAIAQAghhRRSSCGFFFJIIYUUYoghhhhyyimnoIJKKqmooowyyyyzzDLLLLPMOuyssw47DDHEEEMrrcRSU2011lhr7jnnmoO0VlprrbVSSimllFIKQkNWAQAgAAAEQgYZZJBRSCGFFGKIKaeccgoqqIDQkFUAACAAgAAAAABP8hzRER3RER3RER3RER3R8RzPESVREiVREi3TMjXTU0VVdWXXlnVZt31b2IVd933d933d+HVhWJZlWZZlWZZlWZZlWZZlWZYgNGQVAAACAAAghBBCSCGFFFJIKcYYc8w56CSUEAgNWQUAAAIACAAAAHAUR3EcyZEcSbIkS9IkzdIsT/M0TxM9URRF0zRV0RVdUTdtUTZl0zVdUzZdVVZtV5ZtW7Z125dl2/d93/d93/d93/d93/d9XQdCQ1YBABIAADqSIymSIimS4ziOJElAaMgqAEAGAEAAAIriKI7jOJIkSZIlaZJneZaomZrpmZ4qqkBoyCoAABAAQAAAAAAAAIqmeIqpeIqoeI7oiJJomZaoqZoryqbsuq7ruq7ruq7ruq7ruq7ruq7ruq7ruq7ruq7ruq7ruq7ruq4LhIasAgAkAAB0JEdyJEdSJEVSJEdygNCQVQCADACAAAAcwzEkRXIsy9I0T/M0TxM90RM901NFV3SB0JBVAAAgAIAAAAAAAAAMybAUy9EcTRIl1VItVVMt1VJF1VNVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVN0zRNEwgNWQkAkAEAkBBTLS3GmgmLJGLSaqugYwxS7KWxSCpntbfKMYUYtV4ah5RREHupJGOKQcwtpNApJq3WVEKFFKSYYyoVUg5SIDRkhQAQmgHgcBxAsixAsiwAAAAAAAAAkDQN0DwPsDQPAAAAAAAAACRNAyxPAzTPAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABA0jRA8zxA8zwAAAAAAAAA0DwP8DwR8EQRAAAAAAAAACzPAzTRAzxRBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABA0jRA8zxA8zwAAAAAAAAAsDwP8EQR0DwRAAAAAAAAACzPAzxRBDzRAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAEOAAABBgIRQasiIAiBMAcEgSJAmSBM0DSJYFTYOmwTQBkmVB06BpME0AAAAAAAAAAAAAJE2DpkHTIIoASdOgadA0iCIAAAAAAAAAAAAAkqZB06BpEEWApGnQNGgaRBEAAAAAAAAAAAAAzzQhihBFmCbAM02IIkQRpgkAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAGHAAAAgwoQwUGrIiAIgTAHA4imUBAIDjOJYFAACO41gWAABYliWKAABgWZooAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAYcAAACDChDBQashIAiAIAcCiKZQHHsSzgOJYFJMmyAJYF0DyApgFEEQAIAAAocAAACLBBU2JxgEJDVgIAUQAABsWxLE0TRZKkaZoniiRJ0zxPFGma53meacLzPM80IYqiaJoQRVE0TZimaaoqME1VFQAAUOAAABBgg6bE4gCFhqwEAEICAByKYlma5nmeJ4qmqZokSdM8TxRF0TRNU1VJkqZ5niiKommapqqyLE3zPFEURdNUVVWFpnmeKIqiaaqq6sLzPE8URdE0VdV14XmeJ4qiaJqq6roQRVE0TdNUTVV1XSCKpmmaqqqqrgtETxRNU1Vd13WB54miaaqqq7ouEE3TVFVVdV1ZBpimaaqq68oyQFVV1XVdV5YBqqqqruu6sgxQVdd1XVmWZQCu67qyLMsCAAAOHAAAAoygk4wqi7DRhAsPQKEhKwKAKAAAwBimFFPKMCYhpBAaxiSEFEImJaXSUqogpFJSKRWEVEoqJaOUUmopVRBSKamUCkIqJZVSAADYgQMA2IGFUGjISgAgDwCAMEYpxhhzTiKkFGPOOScRUoox55yTSjHmnHPOSSkZc8w556SUzjnnnHNSSuacc845KaVzzjnnnJRSSuecc05KKSWEzkEnpZTSOeecEwAAVOAAABBgo8jmBCNBhYasBABSAQAMjmNZmuZ5omialiRpmud5niiapiZJmuZ5nieKqsnzPE8URdE0VZXneZ4oiqJpqirXFUXTNE1VVV2yLIqmaZqq6rowTdNUVdd1XZimaaqq67oubFtVVdV1ZRm2raqq6rqyDFzXdWXZloEsu67s2rIAAPAEBwCgAhtWRzgpGgssNGQlAJABAEAYg5BCCCFlEEIKIYSUUggJAAAYcAAACDChDBQashIASAUAAIyx1lprrbXWQGettdZaa62AzFprrbXWWmuttdZaa6211lJrrbXWWmuttdZaa6211lprrbXWWmuttdZaa6211lprrbXWWmuttdZaa6211lprrbXWWmstpZRSSimllFJKKaWUUkoppZRSSgUA+lU4APg/2LA6wknRWGChISsBgHAAAMAYpRhzDEIppVQIMeacdFRai7FCiDHnJKTUWmzFc85BKCGV1mIsnnMOQikpxVZjUSmEUlJKLbZYi0qho5JSSq3VWIwxqaTWWoutxmKMSSm01FqLMRYjbE2ptdhqq7EYY2sqLbQYY4zFCF9kbC2m2moNxggjWywt1VprMMYY3VuLpbaaizE++NpSLDHWXAAAd4MDAESCjTOsJJ0VjgYXGrISAAgJACAQUooxxhhzzjnnpFKMOeaccw5CCKFUijHGnHMOQgghlIwx5pxzEEIIIYRSSsaccxBCCCGEkFLqnHMQQgghhBBKKZ1zDkIIIYQQQimlgxBCCCGEEEoopaQUQgghhBBCCKmklEIIIYRSQighlZRSCCGEEEIpJaSUUgohhFJCCKGElFJKKYUQQgillJJSSimlEkoJJYQSUikppRRKCCGUUkpKKaVUSgmhhBJKKSWllFJKIYQQSikFAAAcOAAABBhBJxlVFmGjCRcegEJDVgIAZAAAkKKUUiktRYIipRikGEtGFXNQWoqocgxSzalSziDmJJaIMYSUk1Qy5hRCDELqHHVMKQYtlRhCxhik2HJLoXMOAAAAQQCAgJAAAAMEBTMAwOAA4XMQdAIERxsAgCBEZohEw0JweFAJEBFTAUBigkIuAFRYXKRdXECXAS7o4q4DIQQhCEEsDqCABByccMMTb3jCDU7QKSp1IAAAAAAADADwAACQXAAREdHMYWRobHB0eHyAhIiMkAgAAAAAABcAfAAAJCVAREQ0cxgZGhscHR4fICEiIyQBAIAAAgAAAAAggAAEBAQAAAAAAAIAAAAEBB9DtnUBAAAAAAAEPueBAKOFggAAgACjzoEAA4BwBwCdASqwAJAAAEcIhYWIhYSIAgIABhwJ7kPfbJyHvtk5D32ych77ZOQ99snIe+2TkPfbJyHvtk5D32ych77ZOQ99YAD+/6tQgKOFggADgAqjhYIAD4AOo4WCACSADqOZgQArADECAAEQEAAYABhYL/QACIBDmAYAAKOFggA6gA6jhYIAT4AOo5mBAFMAMQIAARAQABgAGFgv9AAIgEOYBgAAo4WCAGSADqOFggB6gA6jmYEAewAxAgABEBAAGAAYWC/0AAiAQ5gGAACjhYIAj4AOo5mBAKMAMQIAARAQABgAGFgv9AAIgEOYBgAAo4WCAKSADqOFggC6gA6jmYEAywAxAgABEBAAGAAYWC/0AAiAQ5gGAACjhYIAz4AOo4WCAOSADqOZgQDzADECAAEQEAAYABhYL/QACIBDmAYAAKOFggD6gA6jhYIBD4AOo5iBARsAEQIAARAQFGAAYWC/0AAiAQ5gGACjhYIBJIAOo4WCATqADqOZgQFDADECAAEQEAAYABhYL/QACIBDmAYAAKOFggFPgA6jhYIBZIAOo5mBAWsAMQIAARAQABgAGFgv9AAIgEOYBgAAo4WCAXqADqOFggGPgA6jmYEBkwAxAgABEBAAGAAYWC/0AAiAQ5gGAACjhYIBpIAOo4WCAbqADqOZgQG7ADECAAEQEAAYABhYL/QACIBDmAYAAKOFggHPgA6jmYEB4wAxAgABEBAAGAAYWC/0AAiAQ5gGAACjhYIB5IAOo4WCAfqADqOZgQILADECAAEQEAAYABhYL/QACIBDmAYAAKOFggIPgA6jhYICJIAOo5mBAjMAMQIAARAQABgAGFgv9AAIgEOYBgAAo4WCAjqADqOFggJPgA6jmYECWwAxAgABEBAAGAAYWC/0AAiAQ5gGAACjhYICZIAOo4WCAnqADqOZgQKDADECAAEQEAAYABhYL/QACIBDmAYAAKOFggKPgA6jhYICpIAOo5mBAqsAMQIAARAQABgAGFgv9AAIgEOYBgAAo4WCArqADqOFggLPgA6jmIEC0wARAgABEBAUYABhYL/QACIBDmAYAKOFggLkgA6jhYIC+oAOo5mBAvsAMQIAARAQABgAGFgv9AAIgEOYBgAAo4WCAw+ADqOZgQMjADECAAEQEAAYABhYL/QACIBDmAYAAKOFggMkgA6jhYIDOoAOo5mBA0sAMQIAARAQABgAGFgv9AAIgEOYBgAAo4WCA0+ADqOFggNkgA6jmYEDcwAxAgABEBAAGAAYWC/0AAiAQ5gGAACjhYIDeoAOo4WCA4+ADqOZgQObADECAAEQEAAYABhYL/QACIBDmAYAAKOFggOkgA6jhYIDuoAOo5mBA8MAMQIAARAQABgAGFgv9AAIgEOYBgAAo4WCA8+ADqOFggPkgA6jhYID+oAOo4WCBA+ADhxTu2sBAAAAAAAAEbuPs4EDt4r3gQHxghEr8IEK",mp4:"data:video/mp4;base64,AAAAHGZ0eXBNNFYgAAACAGlzb21pc28yYXZjMQAAAAhmcmVlAAAGF21kYXTeBAAAbGliZmFhYyAxLjI4AABCAJMgBDIARwAAArEGBf//rdxF6b3m2Ui3lizYINkj7u94MjY0IC0gY29yZSAxNDIgcjIgOTU2YzhkOCAtIEguMjY0L01QRUctNCBBVkMgY29kZWMgLSBDb3B5bGVmdCAyMDAzLTIwMTQgLSBodHRwOi8vd3d3LnZpZGVvbGFuLm9yZy94MjY0Lmh0bWwgLSBvcHRpb25zOiBjYWJhYz0wIHJlZj0zIGRlYmxvY2s9MTowOjAgYW5hbHlzZT0weDE6MHgxMTEgbWU9aGV4IHN1Ym1lPTcgcHN5PTEgcHN5X3JkPTEuMDA6MC4wMCBtaXhlZF9yZWY9MSBtZV9yYW5nZT0xNiBjaHJvbWFfbWU9MSB0cmVsbGlzPTEgOHg4ZGN0PTAgY3FtPTAgZGVhZHpvbmU9MjEsMTEgZmFzdF9wc2tpcD0xIGNocm9tYV9xcF9vZmZzZXQ9LTIgdGhyZWFkcz02IGxvb2thaGVhZF90aHJlYWRzPTEgc2xpY2VkX3RocmVhZHM9MCBucj0wIGRlY2ltYXRlPTEgaW50ZXJsYWNlZD0wIGJsdXJheV9jb21wYXQ9MCBjb25zdHJhaW5lZF9pbnRyYT0wIGJmcmFtZXM9MCB3ZWlnaHRwPTAga2V5aW50PTI1MCBrZXlpbnRfbWluPTI1IHNjZW5lY3V0PTQwIGludHJhX3JlZnJlc2g9MCByY19sb29rYWhlYWQ9NDAgcmM9Y3JmIG1idHJlZT0xIGNyZj0yMy4wIHFjb21wPTAuNjAgcXBtaW49MCBxcG1heD02OSBxcHN0ZXA9NCB2YnZfbWF4cmF0ZT03NjggdmJ2X2J1ZnNpemU9MzAwMCBjcmZfbWF4PTAuMCBuYWxfaHJkPW5vbmUgZmlsbGVyPTAgaXBfcmF0aW89MS40MCBhcT0xOjEuMDAAgAAAAFZliIQL8mKAAKvMnJycnJycnJycnXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXiEASZACGQAjgCEASZACGQAjgAAAAAdBmjgX4GSAIQBJkAIZACOAAAAAB0GaVAX4GSAhAEmQAhkAI4AhAEmQAhkAI4AAAAAGQZpgL8DJIQBJkAIZACOAIQBJkAIZACOAAAAABkGagC/AySEASZACGQAjgAAAAAZBmqAvwMkhAEmQAhkAI4AhAEmQAhkAI4AAAAAGQZrAL8DJIQBJkAIZACOAAAAABkGa4C/AySEASZACGQAjgCEASZACGQAjgAAAAAZBmwAvwMkhAEmQAhkAI4AAAAAGQZsgL8DJIQBJkAIZACOAIQBJkAIZACOAAAAABkGbQC/AySEASZACGQAjgCEASZACGQAjgAAAAAZBm2AvwMkhAEmQAhkAI4AAAAAGQZuAL8DJIQBJkAIZACOAIQBJkAIZACOAAAAABkGboC/AySEASZACGQAjgAAAAAZBm8AvwMkhAEmQAhkAI4AhAEmQAhkAI4AAAAAGQZvgL8DJIQBJkAIZACOAAAAABkGaAC/AySEASZACGQAjgCEASZACGQAjgAAAAAZBmiAvwMkhAEmQAhkAI4AhAEmQAhkAI4AAAAAGQZpAL8DJIQBJkAIZACOAAAAABkGaYC/AySEASZACGQAjgCEASZACGQAjgAAAAAZBmoAvwMkhAEmQAhkAI4AAAAAGQZqgL8DJIQBJkAIZACOAIQBJkAIZACOAAAAABkGawC/AySEASZACGQAjgAAAAAZBmuAvwMkhAEmQAhkAI4AhAEmQAhkAI4AAAAAGQZsAL8DJIQBJkAIZACOAAAAABkGbIC/AySEASZACGQAjgCEASZACGQAjgAAAAAZBm0AvwMkhAEmQAhkAI4AhAEmQAhkAI4AAAAAGQZtgL8DJIQBJkAIZACOAAAAABkGbgCvAySEASZACGQAjgCEASZACGQAjgAAAAAZBm6AnwMkhAEmQAhkAI4AhAEmQAhkAI4AhAEmQAhkAI4AhAEmQAhkAI4AAAAhubW9vdgAAAGxtdmhkAAAAAAAAAAAAAAAAAAAD6AAABDcAAQAAAQAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAzB0cmFrAAAAXHRraGQAAAADAAAAAAAAAAAAAAABAAAAAAAAA+kAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAABAAAAAALAAAACQAAAAAAAkZWR0cwAAABxlbHN0AAAAAAAAAAEAAAPpAAAAAAABAAAAAAKobWRpYQAAACBtZGhkAAAAAAAAAAAAAAAAAAB1MAAAdU5VxAAAAAAALWhkbHIAAAAAAAAAAHZpZGUAAAAAAAAAAAAAAABWaWRlb0hhbmRsZXIAAAACU21pbmYAAAAUdm1oZAAAAAEAAAAAAAAAAAAAACRkaW5mAAAAHGRyZWYAAAAAAAAAAQAAAAx1cmwgAAAAAQAAAhNzdGJsAAAAr3N0c2QAAAAAAAAAAQAAAJ9hdmMxAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAALAAkABIAAAASAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGP//AAAALWF2Y0MBQsAN/+EAFWdCwA3ZAsTsBEAAAPpAADqYA8UKkgEABWjLg8sgAAAAHHV1aWRraEDyXyRPxbo5pRvPAyPzAAAAAAAAABhzdHRzAAAAAAAAAAEAAAAeAAAD6QAAABRzdHNzAAAAAAAAAAEAAAABAAAAHHN0c2MAAAAAAAAAAQAAAAEAAAABAAAAAQAAAIxzdHN6AAAAAAAAAAAAAAAeAAADDwAAAAsAAAALAAAACgAAAAoAAAAKAAAACgAAAAoAAAAKAAAACgAAAAoAAAAKAAAACgAAAAoAAAAKAAAACgAAAAoAAAAKAAAACgAAAAoAAAAKAAAACgAAAAoAAAAKAAAACgAAAAoAAAAKAAAACgAAAAoAAAAKAAAAiHN0Y28AAAAAAAAAHgAAAEYAAANnAAADewAAA5gAAAO0AAADxwAAA+MAAAP2AAAEEgAABCUAAARBAAAEXQAABHAAAASMAAAEnwAABLsAAATOAAAE6gAABQYAAAUZAAAFNQAABUgAAAVkAAAFdwAABZMAAAWmAAAFwgAABd4AAAXxAAAGDQAABGh0cmFrAAAAXHRraGQAAAADAAAAAAAAAAAAAAACAAAAAAAABDcAAAAAAAAAAAAAAAEBAAAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAkZWR0cwAAABxlbHN0AAAAAAAAAAEAAAQkAAADcAABAAAAAAPgbWRpYQAAACBtZGhkAAAAAAAAAAAAAAAAAAC7gAAAykBVxAAAAAAALWhkbHIAAAAAAAAAAHNvdW4AAAAAAAAAAAAAAABTb3VuZEhhbmRsZXIAAAADi21pbmYAAAAQc21oZAAAAAAAAAAAAAAAJGRpbmYAAAAcZHJlZgAAAAAAAAABAAAADHVybCAAAAABAAADT3N0YmwAAABnc3RzZAAAAAAAAAABAAAAV21wNGEAAAAAAAAAAQAAAAAAAAAAAAIAEAAAAAC7gAAAAAAAM2VzZHMAAAAAA4CAgCIAAgAEgICAFEAVBbjYAAu4AAAADcoFgICAAhGQBoCAgAECAAAAIHN0dHMAAAAAAAAAAgAAADIAAAQAAAAAAQAAAkAAAAFUc3RzYwAAAAAAAAAbAAAAAQAAAAEAAAABAAAAAgAAAAIAAAABAAAAAwAAAAEAAAABAAAABAAAAAIAAAABAAAABgAAAAEAAAABAAAABwAAAAIAAAABAAAACAAAAAEAAAABAAAACQAAAAIAAAABAAAACgAAAAEAAAABAAAACwAAAAIAAAABAAAADQAAAAEAAAABAAAADgAAAAIAAAABAAAADwAAAAEAAAABAAAAEAAAAAIAAAABAAAAEQAAAAEAAAABAAAAEgAAAAIAAAABAAAAFAAAAAEAAAABAAAAFQAAAAIAAAABAAAAFgAAAAEAAAABAAAAFwAAAAIAAAABAAAAGAAAAAEAAAABAAAAGQAAAAIAAAABAAAAGgAAAAEAAAABAAAAGwAAAAIAAAABAAAAHQAAAAEAAAABAAAAHgAAAAIAAAABAAAAHwAAAAQAAAABAAAA4HN0c3oAAAAAAAAAAAAAADMAAAAaAAAACQAAAAkAAAAJAAAACQAAAAkAAAAJAAAACQAAAAkAAAAJAAAACQAAAAkAAAAJAAAACQAAAAkAAAAJAAAACQAAAAkAAAAJAAAACQAAAAkAAAAJAAAACQAAAAkAAAAJAAAACQAAAAkAAAAJAAAACQAAAAkAAAAJAAAACQAAAAkAAAAJAAAACQAAAAkAAAAJAAAACQAAAAkAAAAJAAAACQAAAAkAAAAJAAAACQAAAAkAAAAJAAAACQAAAAkAAAAJAAAACQAAAAkAAACMc3RjbwAAAAAAAAAfAAAALAAAA1UAAANyAAADhgAAA6IAAAO+AAAD0QAAA+0AAAQAAAAEHAAABC8AAARLAAAEZwAABHoAAASWAAAEqQAABMUAAATYAAAE9AAABRAAAAUjAAAFPwAABVIAAAVuAAAFgQAABZ0AAAWwAAAFzAAABegAAAX7AAAGFwAAAGJ1ZHRhAAAAWm1ldGEAAAAAAAAAIWhkbHIAAAAAAAAAAG1kaXJhcHBsAAAAAAAAAAAAAAAALWlsc3QAAAAlqXRvbwAAAB1kYXRhAAAAAQAAAABMYXZmNTUuMzMuMTAw"}});var s1e=dd((SXo,r1e)=>{var CXo=T(S()),{webm:_Vt,mp4:TVt}=o1e(),xq=()=>typeof navigator<"u"&&parseFloat((""+(/CPU.*OS ([0-9_]{3,4})[0-9_]{0,1}|(CPU like).*AppleWebKit.*Mobile/i.exec(navigator.userAgent)||[0,""])[1]).replace("undefined","3_2").replace("_",".").replace("_",""))<10&&!window.MSStream,_q=()=>"wakeLock"in navigator,Tq=class{constructor(){if(this.enabled=!1,_q()){this._wakeLock=null;let t=()=>{this._wakeLock!==null&&document.visibilityState==="visible"&&this.enable()};document.addEventListener("visibilitychange",t),document.addEventListener("fullscreenchange",t)}else xq()?this.noSleepTimer=null:(this.noSleepVideo=document.createElement("video"),this.noSleepVideo.setAttribute("title","No Sleep"),this.noSleepVideo.setAttribute("playsinline",""),this._addSourceToVideo(this.noSleepVideo,"webm",_Vt),this._addSourceToVideo(this.noSleepVideo,"mp4",TVt),this.noSleepVideo.addEventListener("loadedmetadata",()=>{this.noSleepVideo.duration<=1?this.noSleepVideo.setAttribute("loop",""):this.noSleepVideo.addEventListener("timeupdate",()=>{this.noSleepVideo.currentTime>.5&&(this.noSleepVideo.currentTime=Math.random())})}))}_addSourceToVideo(t,n,i){var o=document.createElement("source");o.src=i,o.type=`video/${n}`,t.appendChild(o)}get isEnabled(){return this.enabled}enable(){return _q()?navigator.wakeLock.request("screen").then(t=>{this._wakeLock=t,this.enabled=!0,console.log("Wake Lock active."),this._wakeLock.addEventListener("release",()=>{console.log("Wake Lock released.")})}).catch(t=>{throw this.enabled=!1,console.error(`${t.name}, ${t.message}`),t}):xq()?(this.disable(),console.warn(` NoSleep enabled for older iOS devices. This can interrupt active or long-running network requests from completing successfully. See https://github.com/richtr/NoSleep.js/issues/15 for more details. `),this.noSleepTimer=window.setInterval(()=>{document.hidden||(window.location.href=window.location.href.split("#")[0],window.setTimeout(window.stop,0))},15e3),this.enabled=!0,Promise.resolve()):this.noSleepVideo.play().then(n=>(this.enabled=!0,n)).catch(n=>{throw this.enabled=!1,n})}disable(){_q()?(this._wakeLock&&this._wakeLock.release(),this._wakeLock=null):xq()?this.noSleepTimer&&(console.warn(` NoSleep now disabled for older iOS devices. `),window.clearInterval(this.noSleepTimer),this.noSleepTimer=null):this.noSleepVideo.pause(),this.enabled=!1}};r1e.exports=Tq});var OVt={};V1e(OVt,{AlphaMode:()=>Rf,AlphaPipelineStage:()=>ZW,AnchorPointDirect:()=>EX,AnchorPointIndirect:()=>IX,Animation:()=>Z9,AnimationViewModel:()=>G9,Appearance:()=>oo,ApproximateTerrainHeights:()=>mi,ArcGISTiledElevationTerrainProvider:()=>p7,ArcGisBaseMapType:()=>kh,ArcGisMapServerImageryProvider:()=>b0,ArcGisMapService:()=>qd,ArcType:()=>tn,ArticulationStageType:()=>pc,AssociativeArray:()=>Et,Atmosphere:()=>R_,AtmospherePipelineStage:()=>aW,AttributeCompression:()=>Mn,AttributeType:()=>rn,AutoExposure:()=>TA,AutomaticUniforms:()=>wp,Axis:()=>wo,AxisAlignedBoundingBox:()=>q0,B3dmLoader:()=>YX,B3dmParser:()=>DX,BaseLayerPicker:()=>P9,BaseLayerPickerViewModel:()=>W9,BatchTable:()=>Px,BatchTableHierarchy:()=>i_,BatchTexture:()=>jc,BatchTexturePipelineStage:()=>GW,Billboard:()=>ho,BillboardCollection:()=>Ed,BillboardGraphics:()=>ec,BillboardLoadState:()=>os,BillboardTexture:()=>Lb,BillboardVisualizer:()=>SR,BingMapsGeocoderService:()=>g7,BingMapsImageryProvider:()=>Uw,BingMapsStyle:()=>$V,BlendEquation:()=>wa,BlendFunction:()=>Vo,BlendOption:()=>Ro,BlendingState:()=>hn,BoundingRectangle:()=>He,BoundingSphere:()=>de,BoundingSphereState:()=>dt,BoundingVolumeSemantics:()=>T_,BoxEmitter:()=>a6,BoxGeometry:()=>va,BoxGeometryUpdater:()=>VI,BoxGraphics:()=>Ux,BoxOutlineGeometry:()=>Pm,BrdfLutGenerator:()=>_F,Buffer:()=>St,BufferLoader:()=>l_,BufferUsage:()=>ke,CPUStylingPipelineStage:()=>WW,CallbackPositionProperty:()=>LI,CallbackProperty:()=>Om,Camera:()=>co,CameraEventAggregator:()=>GA,CameraEventType:()=>Mi,CameraFlightPath:()=>SF,Cartesian2:()=>D,Cartesian3:()=>m,Cartesian4:()=>re,Cartographic:()=>he,CartographicGeocoderService:()=>x7,CatmullRomSpline:()=>_7,Cesium3DContentGroup:()=>n_,Cesium3DTile:()=>Ku,Cesium3DTileBatchTable:()=>jp,Cesium3DTileColorBlendMode:()=>Pl,Cesium3DTileContent:()=>c6,Cesium3DTileContentFactory:()=>Y_,Cesium3DTileContentState:()=>Ho,Cesium3DTileContentType:()=>Is,Cesium3DTileFeature:()=>Hs,Cesium3DTileFeatureTable:()=>rh,Cesium3DTileOptimizationHint:()=>Bu,Cesium3DTileOptimizations:()=>xP,Cesium3DTilePass:()=>Ao,Cesium3DTilePassState:()=>bm,Cesium3DTilePointFeature:()=>Rb,Cesium3DTileRefine:()=>Oo,Cesium3DTileStyle:()=>FS,Cesium3DTileStyleEngine:()=>LP,Cesium3DTilesInspector:()=>V9,Cesium3DTilesInspectorViewModel:()=>C9,Cesium3DTilesVoxelProvider:()=>l6,Cesium3DTileset:()=>xs,Cesium3DTilesetBaseTraversal:()=>XP,Cesium3DTilesetCache:()=>SP,Cesium3DTilesetGraphics:()=>Kx,Cesium3DTilesetHeatmap:()=>CP,Cesium3DTilesetMetadata:()=>tT,Cesium3DTilesetMostDetailedTraversal:()=>GP,Cesium3DTilesetSkipTraversal:()=>vP,Cesium3DTilesetStatistics:()=>bh,Cesium3DTilesetTraversal:()=>$s,Cesium3DTilesetVisualizer:()=>wP,CesiumInspector:()=>X9,CesiumInspectorViewModel:()=>I9,CesiumTerrainProvider:()=>ES,CesiumWidget:()=>EM,Check:()=>To,CheckerboardMaterialProperty:()=>A1,CircleEmitter:()=>KM,CircleGeometry:()=>R7,CircleOutlineGeometry:()=>Z7,ClassificationModelDrawCommand:()=>G2,ClassificationPipelineStage:()=>EW,ClassificationPrimitive:()=>TC,ClassificationType:()=>Bn,ClearCommand:()=>ai,ClippingPlane:()=>S_,ClippingPlaneCollection:()=>bs,ClippingPolygon:()=>QC,ClippingPolygonCollection:()=>eh,Clock:()=>Th,ClockRange:()=>Kr,ClockStep:()=>yo,ClockViewModel:()=>x9,CloudCollection:()=>p6,CloudType:()=>zL,Color:()=>B,ColorBlendMode:()=>fc,ColorGeometryInstanceAttribute:()=>Ht,ColorMaterialProperty:()=>Bt,Command:()=>rq,ComponentDatatype:()=>Q,Composite3DTileContent:()=>wI,CompositeEntityCollection:()=>UK,CompositeMaterialProperty:()=>N1,CompositePositionProperty:()=>_a,CompositeProperty:()=>_c,CompressedTextureBuffer:()=>XR,ComputeCommand:()=>$c,ComputeEngine:()=>Gw,ConditionsExpression:()=>OM,ConeEmitter:()=>g6,ConstantPositionProperty:()=>Dc,ConstantProperty:()=>qn,ConstantSpline:()=>JX,ContentMetadata:()=>dP,Context:()=>Pw,ContextLimits:()=>Mt,CoplanarPolygonGeometry:()=>bv,CoplanarPolygonGeometryLibrary:()=>wb,CoplanarPolygonOutlineGeometry:()=>zu,CornerType:()=>wi,CorrelationGroup:()=>XX,CorridorGeometry:()=>aT,CorridorGeometryLibrary:()=>Yi,CorridorGeometryUpdater:()=>OP,CorridorGraphics:()=>Bx,CorridorOutlineGeometry:()=>BP,Credit:()=>Rt,CreditDisplay:()=>RF,CubeMap:()=>Tr,CubeMapFace:()=>UR,CubicRealPolynomial:()=>Cx,CullFace:()=>_i,CullingVolume:()=>ps,CumulusCloud:()=>du,CustomDataSource:()=>zP,CustomHeightmapTerrainProvider:()=>G7,CustomShader:()=>yS,CustomShaderMode:()=>_b,CustomShaderPipelineStage:()=>UW,CustomShaderTranslucencyMode:()=>Ag,CylinderGeometry:()=>KP,CylinderGeometryLibrary:()=>cT,CylinderGeometryUpdater:()=>QP,CylinderGraphics:()=>Ox,CylinderOutlineGeometry:()=>JP,CzmlDataSource:()=>sv,DataSource:()=>zr,DataSourceClock:()=>Sh,DataSourceCollection:()=>av,DataSourceDisplay:()=>Yv,DebugAppearance:()=>S6,DebugCameraPrimitive:()=>ap,DebugInspector:()=>FA,DebugModelMatrixPrimitive:()=>jM,DefaultProxy:()=>I7,DepthFunction:()=>ac,DepthPlane:()=>vF,DequantizationPipelineStage:()=>BW,DerivedCommand:()=>cp,DeveloperError:()=>fe,DeviceOrientationCameraController:()=>wF,DirectionalLight:()=>C6,DiscardEmptyTileImagePolicy:()=>eL,DiscardMissingTileImagePolicy:()=>Nw,DistanceDisplayCondition:()=>Ft,DistanceDisplayConditionGeometryInstanceAttribute:()=>Dn,DoubleEndedPriorityQueue:()=>TS,DoublyLinkedList:()=>TP,DracoLoader:()=>ob,DrawCommand:()=>$e,DynamicAtmosphereLightingType:()=>lb,DynamicEnvironmentMapManager:()=>db,DynamicGeometryBatch:()=>pT,DynamicGeometryUpdater:()=>ri,EarthOrientationParameters:()=>bR,EarthOrientationParametersSample:()=>U0,EasingFunction:()=>Qr,EllipseGeometry:()=>ul,EllipseGeometryLibrary:()=>Kl,EllipseGeometryUpdater:()=>lv,EllipseGraphics:()=>Yx,EllipseOutlineGeometry:()=>kd,Ellipsoid:()=>ne,EllipsoidGeodesic:()=>kp,EllipsoidGeometry:()=>ta,EllipsoidGeometryUpdater:()=>uv,EllipsoidGraphics:()=>Hx,EllipsoidOutlineGeometry:()=>Wd,EllipsoidPrimitive:()=>fF,EllipsoidRhumbLine:()=>Fa,EllipsoidSurfaceAppearance:()=>V6,EllipsoidTangentPlane:()=>qr,EllipsoidTerrainProvider:()=>YT,EllipsoidalOccluder:()=>Hb,Empty3DTileContent:()=>V1,EncodedCartesian3:()=>Hn,Entity:()=>tr,EntityCluster:()=>vd,EntityCollection:()=>ea,EntityView:()=>zv,Event:()=>be,EventHelper:()=>fr,Expression:()=>Xu,ExpressionNodeType:()=>yt,ExtrapolationType:()=>Fd,FeatureDetection:()=>Ot,FeatureIdPipelineStage:()=>Fg,Fog:()=>FF,ForEach:()=>We,FrameRateMonitor:()=>e9,FrameState:()=>AF,Framebuffer:()=>Ar,FramebufferManager:()=>bi,FrustumCommands:()=>DF,FrustumGeometry:()=>jT,FrustumOutlineGeometry:()=>EF,Fullscreen:()=>xr,FullscreenButton:()=>A9,FullscreenButtonViewModel:()=>F9,GeoJsonDataSource:()=>Cy,GeoJsonLoader:()=>HX,GeocodeType:()=>Qy,Geocoder:()=>N9,GeocoderService:()=>DL,GeocoderViewModel:()=>M9,GeographicProjection:()=>Ii,GeographicTilingScheme:()=>Qi,Geometry:()=>mt,Geometry3DTileContent:()=>MI,GeometryAttribute:()=>Ze,GeometryAttributes:()=>fn,GeometryFactory:()=>X7,GeometryInstance:()=>It,GeometryInstanceAttribute:()=>cc,GeometryOffsetAttribute:()=>an,GeometryPipeline:()=>Nn,GeometryPipelineStage:()=>zW,GeometryType:()=>Tu,GeometryUpdater:()=>si,GeometryUpdaterSet:()=>RT,GeometryVisualizer:()=>Pv,GetFeatureInfoFormat:()=>zT,Globe:()=>dF,GlobeDepth:()=>BF,GlobeSurfaceShaderSet:()=>Mw,GlobeSurfaceTile:()=>hm,GlobeSurfaceTileProvider:()=>eF,GlobeTranslucency:()=>tF,GlobeTranslucencyFramebuffer:()=>OF,GlobeTranslucencyState:()=>MF,GltfBufferViewLoader:()=>vC,GltfDracoLoader:()=>wC,GltfGpmLoader:()=>PX,GltfGpmLocal:()=>qC,GltfImageLoader:()=>FC,GltfIndexBufferLoader:()=>AC,GltfJsonLoader:()=>NC,GltfLoader:()=>oh,GltfLoaderUtil:()=>Fl,GltfMeshPrimitiveGpmLoader:()=>AX,GltfStructuralMetadataLoader:()=>ZX,GltfTextureLoader:()=>kC,GltfVertexBufferLoader:()=>UC,GoogleEarthEnterpriseImageryProvider:()=>R6,GoogleEarthEnterpriseMapsProvider:()=>Ow,GoogleEarthEnterpriseMetadata:()=>v0,GoogleEarthEnterpriseTerrainData:()=>BL,GoogleEarthEnterpriseTerrainProvider:()=>N7,GoogleEarthEnterpriseTileInformation:()=>NM,GoogleGeocoderService:()=>U7,GoogleMaps:()=>WS,GpxDataSource:()=>gw,GregorianDate:()=>Lp,GridImageryProvider:()=>Z6,GridMaterialProperty:()=>J1,GroundGeometryUpdater:()=>zn,GroundPolylineGeometry:()=>Ax,GroundPolylinePrimitive:()=>Nm,GroundPrimitive:()=>kc,GroupMetadata:()=>v1,HeadingPitchRange:()=>rm,HeadingPitchRoll:()=>Xa,Heap:()=>uR,HeightReference:()=>Ke,HeightmapEncoding:()=>dm,HeightmapTerrainData:()=>za,HeightmapTessellator:()=>KV,HermitePolynomialApproximation:()=>jP,HermiteSpline:()=>Pg,HilbertOrder:()=>IC,HomeButton:()=>U9,HomeButtonViewModel:()=>k9,HorizontalOrigin:()=>xi,I3SBuildingSceneLayerExplorer:()=>fq,I3SBuildingSceneLayerExplorerViewModel:()=>D9,I3SDataProvider:()=>ef,I3SDecoder:()=>t9,I3SFeature:()=>n9,I3SField:()=>i9,I3SGeometry:()=>KL,I3SLayer:()=>US,I3SNode:()=>JL,I3SStatistics:()=>s9,I3SSublayer:()=>c9,I3SSymbology:()=>r9,I3dmLoader:()=>KX,I3dmParser:()=>zX,ITwinData:()=>X6,ITwinPlatform:()=>Ns,Iau2000Orientation:()=>mF,Iau2006XysData:()=>gR,Iau2006XysSample:()=>xx,IauOrientationAxes:()=>hF,IauOrientationParameters:()=>uF,ImageBasedLighting:()=>t_,ImageBasedLightingPipelineStage:()=>lW,ImageMaterialProperty:()=>ig,Imagery:()=>sL,ImageryLayer:()=>Ja,ImageryLayerCollection:()=>nF,ImageryLayerFeatureInfo:()=>Nh,ImageryProvider:()=>bl,ImageryState:()=>$n,Implicit3DTileContent:()=>OC,ImplicitAvailabilityBitstream:()=>WC,ImplicitMetadataView:()=>PC,ImplicitSubdivisionScheme:()=>ts,ImplicitSubtree:()=>x_,ImplicitSubtreeCache:()=>HM,ImplicitSubtreeMetadata:()=>NI,ImplicitTileCoordinates:()=>oT,ImplicitTileset:()=>iT,IndexDatatype:()=>Me,InfoBox:()=>O9,InfoBoxViewModel:()=>B9,InspectorShared:()=>qa,InstanceAttributeSemantic:()=>is,InstancingPipelineStage:()=>CW,InterpolationAlgorithm:()=>D7,InterpolationType:()=>nh,Intersect:()=>zt,IntersectionTests:()=>ti,Intersections2D:()=>W0,Interval:()=>Wa,InvertClassification:()=>xL,Ion:()=>zm,IonGeocodeProviderType:()=>w0,IonGeocoderService:()=>PS,IonImageryProvider:()=>g0,IonResource:()=>xd,IonWorldImageryStyle:()=>y0,Iso8601:()=>Be,JobScheduler:()=>NF,JobType:()=>ka,JsonMetadataTable:()=>ub,JulianDate:()=>q,KTX2Transcoder:()=>WR,KeyboardEventModifier:()=>ca,KeyframeNode:()=>_o,KmlCamera:()=>yw,KmlDataSource:()=>NT,KmlLookAt:()=>xw,KmlTour:()=>_w,KmlTourFlyTo:()=>Sw,KmlTourWait:()=>Cw,Label:()=>Dg,LabelCollection:()=>Wf,LabelGraphics:()=>Um,LabelStyle:()=>Yo,LabelVisualizer:()=>vv,LagrangePolynomialApproximation:()=>qP,LeapSecond:()=>Ki,Light:()=>W6,LightingModel:()=>Ef,LightingPipelineStage:()=>JW,LinearApproximation:()=>dT,LinearSpline:()=>Wg,ManagedArray:()=>Qc,MapMode2D:()=>id,MapProjection:()=>Y7,MapboxImageryProvider:()=>Yw,MapboxStyleImageryProvider:()=>P6,Mars3DEx:()=>Tb,Material:()=>Ji,MaterialAppearance:()=>uo,MaterialPipelineStage:()=>jW,MaterialProperty:()=>er,Math:()=>W,Matrix2:()=>Xi,Matrix3:()=>$,Matrix4:()=>M,Megatexture:()=>GL,MeshPrimitiveGpmLocal:()=>FX,MetadataClass:()=>jm,MetadataClassProperty:()=>Cf,MetadataComponentType:()=>At,MetadataEntity:()=>Un,MetadataEnum:()=>rX,MetadataEnumValue:()=>oX,MetadataPicking:()=>kF,MetadataPickingPipelineStage:()=>Rd,MetadataPipelineStage:()=>Fu,MetadataSchema:()=>Cd,MetadataSchemaLoader:()=>DC,MetadataSemantic:()=>__,MetadataTable:()=>Wu,MetadataTableProperty:()=>UI,MetadataType:()=>ut,MipmapHint:()=>hf,Model:()=>ch,Model3DTileContent:()=>Gd,ModelAlphaOptions:()=>p2,ModelAnimation:()=>$X,ModelAnimationChannel:()=>qX,ModelAnimationCollection:()=>eW,ModelAnimationLoop:()=>Ml,ModelAnimationState:()=>sh,ModelArticulation:()=>uW,ModelArticulationStage:()=>dW,ModelClippingPlanesPipelineStage:()=>fW,ModelClippingPolygonsPipelineStage:()=>gW,ModelColorPipelineStage:()=>wg,ModelComponents:()=>Tn,ModelDrawCommand:()=>E2,ModelDrawCommands:()=>W2,ModelFeature:()=>tW,ModelFeatureTable:()=>iW,ModelGraphics:()=>Yp,ModelLightingOptions:()=>L2,ModelMatrixUpdateStage:()=>VW,ModelNode:()=>yW,ModelRenderResources:()=>y2,ModelRuntimeNode:()=>RW,ModelRuntimePrimitive:()=>h2,ModelSceneGraph:()=>P2,ModelSilhouettePipelineStage:()=>T2,ModelSkin:()=>f2,ModelSplitterPipelineStage:()=>C2,ModelStatistics:()=>v2,ModelType:()=>mr,ModelUtility:()=>jt,ModelVisualizer:()=>wv,Moon:()=>bF,MorphTargetsPipelineStage:()=>$W,MorphWeightSpline:()=>H7,MortonOrder:()=>Kg,Multiple3DTileContent:()=>hP,MultisampleFramebuffer:()=>MX,NavigationHelpButton:()=>H9,NavigationHelpButtonViewModel:()=>Y9,NearFarScalar:()=>Ut,NeverTileDiscardPolicy:()=>w6,NodeRenderResources:()=>V2,NodeStatisticsPipelineStage:()=>LW,NodeTransformationProperty:()=>zx,OIT:()=>HF,Occluder:()=>gF,OffsetGeometryInstanceAttribute:()=>no,OpenCageGeocoderService:()=>K7,OpenStreetMapImageryProvider:()=>A0,OrderedGroundPrimitiveCollection:()=>cv,OrientedBoundingBox:()=>Gn,OrthographicFrustum:()=>ln,OrthographicOffCenterFrustum:()=>Mr,Packable:()=>J7,PackableForInterpolation:()=>Q7,Particle:()=>qL,ParticleBurst:()=>A6,ParticleEmitter:()=>M6,ParticleSystem:()=>N6,Pass:()=>Ge,PassState:()=>Vc,PathGraphics:()=>Hp,PathVisualizer:()=>Av,PeliasGeocoderService:()=>UM,PerInstanceColorAppearance:()=>dn,PerformanceDisplay:()=>S0,PerformanceWatchdog:()=>K9,PerformanceWatchdogViewModel:()=>z9,PerspectiveFrustum:()=>Gi,PerspectiveOffCenterFrustum:()=>yl,PickDepth:()=>UF,PickDepthFramebuffer:()=>KF,PickFramebuffer:()=>QF,PickedMetadataInfo:()=>dM,Picking:()=>tA,PickingPipelineStage:()=>e2,PinBuilder:()=>u0,PixelDatatype:()=>je,PixelFormat:()=>ot,Plane:()=>cn,PlaneGeometry:()=>mv,PlaneGeometryUpdater:()=>fv,PlaneGraphics:()=>gI,PlaneOutlineGeometry:()=>hv,PntsLoader:()=>F2,PntsParser:()=>A_,PointCloud:()=>ZM,PointCloudEyeDomeLighting:()=>hb,PointCloudShading:()=>Gf,PointCloudStylingPipelineStage:()=>n2,PointGraphics:()=>Jx,PointPrimitive:()=>Ws,PointPrimitiveCollection:()=>O1,PointVisualizer:()=>Nv,PolygonGeometry:()=>cb,PolygonGeometryLibrary:()=>Yn,PolygonGeometryUpdater:()=>yv,PolygonGraphics:()=>Dm,PolygonHierarchy:()=>Aa,PolygonOutlineGeometry:()=>gv,PolygonPipeline:()=>di,Polyline:()=>ku,PolylineArrowMaterialProperty:()=>j1,PolylineCollection:()=>uh,PolylineColorAppearance:()=>$r,PolylineDashMaterialProperty:()=>$1,PolylineGeometry:()=>s0,PolylineGeometryUpdater:()=>Dv,PolylineGlowMaterialProperty:()=>tV,PolylineGraphics:()=>lc,PolylineMaterialAppearance:()=>ba,PolylineOutlineMaterialProperty:()=>ny,PolylinePipeline:()=>vi,PolylineVisualizer:()=>Ov,PolylineVolumeGeometry:()=>Tv,PolylineVolumeGeometryLibrary:()=>gh,PolylineVolumeGeometryUpdater:()=>Lv,PolylineVolumeGraphics:()=>Qx,PolylineVolumeOutlineGeometry:()=>Vv,PositionProperty:()=>km,PositionPropertyArray:()=>Qb,PostProcessStage:()=>bo,PostProcessStageCollection:()=>VA,PostProcessStageComposite:()=>rd,PostProcessStageLibrary:()=>nu,PostProcessStageSampleMode:()=>tu,PostProcessStageTextureCache:()=>lS,PpeMetadata:()=>wX,PpeSource:()=>tq,PpeTexture:()=>vX,Primitive:()=>Xn,PrimitiveCollection:()=>dl,PrimitiveLoadPlan:()=>E_,PrimitiveOutlineGenerator:()=>G_,PrimitiveOutlinePipelineStage:()=>r2,PrimitivePipeline:()=>vx,PrimitiveRenderResources:()=>R2,PrimitiveState:()=>Vr,PrimitiveStatisticsPipelineStage:()=>s2,PrimitiveType:()=>Ae,ProjectionPicker:()=>Q9,ProjectionPickerViewModel:()=>J9,Property:()=>J,PropertyArray:()=>iV,PropertyAttribute:()=>Z_,PropertyAttributeProperty:()=>CX,PropertyBag:()=>Oc,PropertyTable:()=>el,PropertyTexture:()=>mb,PropertyTextureProperty:()=>SX,ProviderViewModel:()=>ds,Proxy:()=>q7,QuadraticRealPolynomial:()=>Ac,QuadtreeOccluders:()=>iF,QuadtreePrimitive:()=>lF,QuadtreeTile:()=>oF,QuadtreeTileLoadState:()=>ra,QuadtreeTileProvider:()=>k6,QuantizedMeshTerrainData:()=>GS,QuarticRealPolynomial:()=>wR,Quaternion:()=>Fe,QuaternionSpline:()=>jX,Queue:()=>Lg,Ray:()=>gn,Rectangle:()=>le,RectangleCollisionChecker:()=>GT,RectangleGeometry:()=>_T,RectangleGeometryLibrary:()=>Xs,RectangleGeometryUpdater:()=>Rv,RectangleGraphics:()=>Bm,RectangleOutlineGeometry:()=>K_,ReferenceFrame:()=>Di,ReferenceProperty:()=>jb,RenderState:()=>Ue,Renderbuffer:()=>Ld,RenderbufferFormat:()=>nl,Request:()=>Qo,RequestErrorEvent:()=>af,RequestScheduler:()=>ic,RequestState:()=>ei,RequestType:()=>ms,Resource:()=>Re,ResourceCache:()=>Li,ResourceCacheKey:()=>Al,ResourceCacheStatistics:()=>cX,ResourceLoader:()=>ji,ResourceLoaderState:()=>xt,Rotation:()=>qu,RuntimeError:()=>ce,S2Cell:()=>eb,SDFSettings:()=>js,SampledPositionProperty:()=>Sa,SampledProperty:()=>Md,Sampler:()=>$t,ScaledPositionProperty:()=>Df,Scene:()=>mM,SceneFramebuffer:()=>nS,SceneMode:()=>oe,SceneMode2DPipelineStage:()=>a2,SceneModePicker:()=>q9,SceneModePickerViewModel:()=>j9,SceneTransforms:()=>Bi,SceneTransitioner:()=>ZA,ScreenSpaceCameraController:()=>XA,ScreenSpaceEventHandler:()=>ou,ScreenSpaceEventType:()=>Sn,SelectedFeatureIdPipelineStage:()=>Mg,SelectionIndicator:()=>tN,SelectionIndicatorViewModel:()=>eN,SensorVolumePortionToDisplay:()=>aV,ShaderBuilder:()=>w_,ShaderCache:()=>Ew,ShaderDestination:()=>ge,ShaderFunction:()=>g2,ShaderProgram:()=>en,ShaderSource:()=>De,ShaderStruct:()=>b2,ShadowMap:()=>L0,ShadowMapShader:()=>up,ShadowMode:()=>_n,ShadowVolumeAppearance:()=>bd,ShowGeometryInstanceAttribute:()=>xn,Simon1994PlanetaryPositions:()=>Iy,SimplePolylineGeometry:()=>$7,SingleTileImageryProvider:()=>Hw,SkinningPipelineStage:()=>l2,SkyAtmosphere:()=>pM,SkyBox:()=>yM,SpatialNode:()=>aM,Spdcf:()=>WX,SpecularEnvironmentCubeMap:()=>Hm,SphereEmitter:()=>D6,SphereGeometry:()=>e6,SphereOutlineGeometry:()=>Ab,Spherical:()=>$P,Spline:()=>so,SplitDirection:()=>Fr,Splitter:()=>PL,StaticGeometryColorBatch:()=>nm,StaticGeometryPerMaterialBatch:()=>im,StaticGroundGeometryColorBatch:()=>LV,StaticGroundGeometryPerMaterialBatch:()=>Wv,StaticGroundPolylinePerMaterialBatch:()=>Bv,StaticOutlineGeometryBatch:()=>GV,StencilConstants:()=>Dt,StencilFunction:()=>On,StencilOperation:()=>ft,SteppedSpline:()=>QX,Stereographic:()=>hc,StorageType:()=>Gg,StripeMaterialProperty:()=>rV,StripeOrientation:()=>Ch,StructuralMetadata:()=>Ks,StyleCommandsNeeded:()=>ah,StyleExpression:()=>B6,Sun:()=>VM,SunLight:()=>h0,SunPostProcess:()=>vA,SupportedImageFormats:()=>GX,SvgPathBindingHandler:()=>g9,TaskProcessor:()=>Ti,Terrain:()=>m9,TerrainData:()=>Mh,TerrainEncoding:()=>Rc,TerrainFillMesh:()=>dL,TerrainMesh:()=>mm,TerrainOffsetProperty:()=>jx,TerrainProvider:()=>ss,TerrainQuantization:()=>oa,TerrainState:()=>po,Texture:()=>Wt,TextureAtlas:()=>M_,TextureCache:()=>Iw,TextureMagnificationFilter:()=>pi,TextureManager:()=>nM,TextureMinificationFilter:()=>qt,TexturePacker:()=>x1,TextureUniform:()=>$6,TextureWrap:()=>Vn,TileAvailability:()=>Jh,TileBoundingRegion:()=>Xd,TileBoundingS2Cell:()=>gP,TileBoundingSphere:()=>Mb,TileBoundingVolume:()=>O6,TileCoordinatesImageryProvider:()=>f9,TileDiscardPolicy:()=>H6,TileEdge:()=>yn,TileImagery:()=>aL,TileMapServiceImageryProvider:()=>Py,TileMetadata:()=>uP,TileOrientedBoundingBox:()=>Yl,TileProviderError:()=>Go,TileReplacementQueue:()=>rF,TileSelectionResult:()=>jn,TileState:()=>z6,Tileset3DTileContent:()=>N2,TilesetMetadata:()=>yP,TilesetPipelineStage:()=>oW,TilingScheme:()=>t6,TimeConstants:()=>Qn,TimeDynamicImagery:()=>KT,TimeDynamicPointCloud:()=>wL,TimeInterval:()=>Cn,TimeIntervalCollection:()=>Hr,TimeIntervalCollectionPositionProperty:()=>qb,TimeIntervalCollectionProperty:()=>$b,TimeStandard:()=>Kn,Timeline:()=>oN,TimelineHighlightRange:()=>nN,TimelineTrack:()=>iN,Tipsify:()=>FR,ToggleButtonViewModel:()=>nx,Tonemapper:()=>Z0,TrackingReferenceFrame:()=>Np,Transforms:()=>wt,TranslationRotationScale:()=>og,TranslucentTileClassification:()=>qF,TridiagonalSystemSolver:()=>s1,TrustedServers:()=>nC,TweenCollection:()=>hS,UniformState:()=>Ww,UniformType:()=>RL,UrlTemplateImageryProvider:()=>Ka,VERSION:()=>BVt,VRButton:()=>sN,VRButtonViewModel:()=>rN,VRTheWorldTerrainProvider:()=>i6,VaryingType:()=>eq,Vector3DTileBatch:()=>Tf,Vector3DTileClampedPolylines:()=>aP,Vector3DTileContent:()=>lP,Vector3DTileGeometry:()=>$p,Vector3DTilePoints:()=>eP,Vector3DTilePolygons:()=>tP,Vector3DTilePolylines:()=>O_,Vector3DTilePrimitive:()=>s_,VelocityOrientationProperty:()=>tv,VelocityVectorProperty:()=>e0,VertexArray:()=>oi,VertexArrayFacade:()=>Cb,VertexAttributeSemantic:()=>gt,VertexFormat:()=>Xe,VerticalExaggeration:()=>Sr,VerticalExaggerationPipelineStage:()=>u2,VerticalOrigin:()=>An,VideoSynchronizer:()=>n6,View:()=>rS,Viewer:()=>Cq,ViewportQuad:()=>K6,Visibility:()=>gr,Visualizer:()=>K4,VoxelBoxShape:()=>pp,VoxelCell:()=>AA,VoxelContent:()=>xS,VoxelCylinderShape:()=>bp,VoxelEllipsoidShape:()=>_S,VoxelInspector:()=>cN,VoxelInspectorViewModel:()=>aN,VoxelMetadataOrder:()=>zh,VoxelPrimitive:()=>Yy,VoxelProvider:()=>Q6,VoxelRenderResources:()=>qA,VoxelShape:()=>j6,VoxelShapeType:()=>Ni,VoxelTraversal:()=>cM,VulkanConstants:()=>o6,WallGeometry:()=>Gv,WallGeometryLibrary:()=>TT,WallGeometryUpdater:()=>Xv,WallGraphics:()=>zp,WallOutlineGeometry:()=>Iv,WebGLConstants:()=>ie,WebMapServiceImageryProvider:()=>Kw,WebMapTileServiceImageryProvider:()=>Qw,WebMercatorProjection:()=>Wi,WebMercatorTilingScheme:()=>as,WindingOrder:()=>fs,WireframeIndexGenerator:()=>p1,WireframePipelineStage:()=>m2,_shadersAcesTonemappingStage:()=>nA,_shadersAdditiveBlend:()=>WA,_shadersAdjustTranslucentFS:()=>_L,_shadersAllMaterialAppearanceFS:()=>LR,_shadersAllMaterialAppearanceVS:()=>RR,_shadersAmbientOcclusionGenerate:()=>iA,_shadersAmbientOcclusionModulate:()=>oA,_shadersAspectRampMaterial:()=>BR,_shadersAtmosphereCommon:()=>th,_shadersAtmosphereStageFS:()=>rW,_shadersAtmosphereStageVS:()=>sW,_shadersBasicMaterialAppearanceFS:()=>ZR,_shadersBasicMaterialAppearanceVS:()=>GR,_shadersBillboardCollectionFS:()=>k2,_shadersBillboardCollectionVS:()=>U2,_shadersBlackAndWhite:()=>rA,_shadersBloomComposite:()=>sA,_shadersBrdfLutGeneratorFS:()=>yF,_shadersBrightPass:()=>PA,_shadersBrightness:()=>aA,_shadersBumpMapMaterial:()=>OR,_shadersCPUStylingStageFS:()=>XW,_shadersCPUStylingStageVS:()=>IW,_shadersCheckerboardMaterial:()=>YR,_shadersCloudCollectionFS:()=>IM,_shadersCloudCollectionVS:()=>XM,_shadersCloudNoiseFS:()=>WM,_shadersCloudNoiseVS:()=>PM,_shadersCompareAndPackTranslucentDepth:()=>jF,_shadersCompositeOITFS:()=>YF,_shadersCompositeTranslucentClassification:()=>oS,_shadersComputeIrradianceFS:()=>pX,_shadersComputeRadianceMapFS:()=>bX,_shadersContrastBias:()=>cA,_shadersConvolveSpecularMapFS:()=>gX,_shadersConvolveSpecularMapVS:()=>yX,_shadersCustomShaderStageFS:()=>vW,_shadersCustomShaderStageVS:()=>PW,_shadersCzmBuiltins:()=>Wx,_shadersDepthOfField:()=>lA,_shadersDepthPlaneFS:()=>IF,_shadersDepthPlaneVS:()=>XF,_shadersDepthView:()=>dA,_shadersDepthViewPacked:()=>q6,_shadersDotMaterial:()=>HR,_shadersEdgeDetection:()=>uA,_shadersElevationBandMaterial:()=>zR,_shadersElevationContourMaterial:()=>KR,_shadersElevationRampMaterial:()=>JR,_shadersEllipsoidFS:()=>mL,_shadersEllipsoidSurfaceAppearanceFS:()=>qM,_shadersEllipsoidSurfaceAppearanceVS:()=>$M,_shadersEllipsoidVS:()=>hL,_shadersFXAA:()=>fA,_shadersFXAA3_11:()=>_A,_shadersFadeMaterial:()=>QR,_shadersFeatureIdStageFS:()=>wW,_shadersFeatureIdStageVS:()=>FW,_shadersFilmicTonemapping:()=>mA,_shadersGaussianBlur1D:()=>Uy,_shadersGeometryStageFS:()=>OW,_shadersGeometryStageVS:()=>YW,_shadersGlobeFS:()=>Fw,_shadersGlobeVS:()=>Aw,_shadersGridMaterial:()=>jR,_shadersGroundAtmosphere:()=>QV,_shadersHSBToRGB:()=>YG,_shadersHSLToRGB:()=>HG,_shadersImageBasedLightingStageFS:()=>cW,_shadersInstancingStageCommon:()=>xW,_shadersInstancingStageVS:()=>_W,_shadersIntersectBox:()=>OA,_shadersIntersectClippingPlanes:()=>BA,_shadersIntersectCylinder:()=>YA,_shadersIntersectDepth:()=>DA,_shadersIntersectEllipsoid:()=>HA,_shadersIntersectLongitude:()=>LL,_shadersIntersection:()=>bS,_shadersIntersectionUtils:()=>UA,_shadersLegacyInstancingStageVS:()=>TW,_shadersLensFlare:()=>pA,_shadersLightingStageFS:()=>KW,_shadersMaterialStageFS:()=>QW,_shadersMegatexture:()=>jA,_shadersMetadataStageFS:()=>AW,_shadersMetadataStageVS:()=>MW,_shadersModelClippingPlanesStageFS:()=>hW,_shadersModelClippingPolygonsStageFS:()=>bW,_shadersModelClippingPolygonsStageVS:()=>pW,_shadersModelColorStageFS:()=>mW,_shadersModelFS:()=>X2,_shadersModelSilhouetteStageFS:()=>x2,_shadersModelSilhouetteStageVS:()=>_2,_shadersModelSplitterStageFS:()=>S2,_shadersModelVS:()=>I2,_shadersModifiedReinhardTonemapping:()=>bA,_shadersMorphTargetsStageVS:()=>qW,_shadersNightVision:()=>gA,_shadersNormalMapMaterial:()=>qR,_shadersOctree:()=>QA,_shadersPassThrough:()=>od,_shadersPassThroughDepth:()=>My,_shadersPbrNeutralTonemapping:()=>hA,_shadersPerInstanceColorAppearanceFS:()=>lZ,_shadersPerInstanceColorAppearanceVS:()=>dZ,_shadersPerInstanceFlatColorAppearanceFS:()=>Ix,_shadersPerInstanceFlatColorAppearanceVS:()=>uZ,_shadersPointCloudEyeDomeLighting:()=>kX,_shadersPointCloudStylingStageVS:()=>t2,_shadersPointPrimitiveCollectionFS:()=>ty,_shadersPointPrimitiveCollectionVS:()=>YP,_shadersPolygonSignedDistanceFS:()=>hX,_shadersPolylineArrowMaterial:()=>$R,_shadersPolylineColorAppearanceVS:()=>oI,_shadersPolylineCommon:()=>gd,_shadersPolylineDashMaterial:()=>eZ,_shadersPolylineFS:()=>Nx,_shadersPolylineGlowMaterial:()=>tZ,_shadersPolylineMaterialAppearanceVS:()=>rI,_shadersPolylineOutlineMaterial:()=>nZ,_shadersPolylineShadowVolumeFS:()=>eI,_shadersPolylineShadowVolumeMorphFS:()=>tI,_shadersPolylineShadowVolumeMorphVS:()=>nI,_shadersPolylineShadowVolumeVS:()=>iI,_shadersPolylineVS:()=>K2,_shadersPrimitiveOutlineStageFS:()=>o2,_shadersPrimitiveOutlineStageVS:()=>i2,_shadersRGBToHSB:()=>yE,_shadersRGBToHSL:()=>xE,_shadersRGBToXYZ:()=>_E,_shadersReinhardTonemapping:()=>yA,_shadersReprojectWebMercatorFS:()=>jw,_shadersReprojectWebMercatorVS:()=>qw,_shadersRimLightingMaterial:()=>iZ,_shadersSelectedFeatureIdStageCommon:()=>f1,_shadersShadowVolumeAppearanceFS:()=>xC,_shadersShadowVolumeAppearanceVS:()=>HE,_shadersShadowVolumeFS:()=>eg,_shadersSilhouette:()=>xA,_shadersSkinningStageVS:()=>c2,_shadersSkyAtmosphereCommon:()=>EL,_shadersSkyAtmosphereFS:()=>hM,_shadersSkyAtmosphereVS:()=>fM,_shadersSkyBoxFS:()=>bM,_shadersSkyBoxVS:()=>gM,_shadersSlopeRampMaterial:()=>oZ,_shadersStripeMaterial:()=>rZ,_shadersSunFS:()=>xM,_shadersSunTextureFS:()=>_M,_shadersSunVS:()=>TM,_shadersTexturedMaterialAppearanceFS:()=>ER,_shadersTexturedMaterialAppearanceVS:()=>IR,_shadersVector3DTileClampedPolylinesFS:()=>rP,_shadersVector3DTileClampedPolylinesVS:()=>oP,_shadersVector3DTilePolylinesVS:()=>nP,_shadersVectorTileVS:()=>EC,_shadersVerticalExaggerationStageVS:()=>d2,_shadersViewportQuadFS:()=>vM,_shadersViewportQuadVS:()=>kT,_shadersVoxelFS:()=>NA,_shadersVoxelUtils:()=>MA,_shadersVoxelVS:()=>kA,_shadersWater:()=>aZ,_shadersWaterMaskMaterial:()=>sZ,_shadersXYZToRGB:()=>OE,_shadersacesTonemapping:()=>lG,_shadersalphaWeight:()=>dG,_shadersantialias:()=>uG,_shadersapplyHSBShift:()=>mG,_shadersapproximateSphericalCoordinates:()=>hG,_shadersapproximateTanh:()=>fG,_shadersbackFacing:()=>pG,_shadersbranchFreeTernary:()=>bG,_shaderscascadeColor:()=>gG,_shaderscascadeDistance:()=>yG,_shaderscascadeMatrix:()=>xG,_shaderscascadeWeights:()=>_G,_shadersclipPolygons:()=>TG,_shaderscolumbusViewMorph:()=>SG,_shaderscomputeAtmosphereColor:()=>CG,_shaderscomputeGroundAtmosphereScattering:()=>VG,_shaderscomputePosition:()=>LG,_shaderscomputeScattering:()=>RG,_shadersconvertUvToBox:()=>zA,_shadersconvertUvToCylinder:()=>KA,_shadersconvertUvToEllipsoid:()=>JA,_shaderscosineAndSine:()=>ZG,_shadersdecompressTextureCoordinates:()=>GG,_shadersdegreesPerRadian:()=>gZ,_shadersdepthClamp:()=>EG,_shadersdepthRange:()=>yZ,_shadersdepthRangeStruct:()=>tG,_shaderseastNorthUpToEyeCoordinates:()=>IG,_shadersellipsoidContainsPoint:()=>XG,_shadersellipsoidTextureCoordinates:()=>WG,_shadersepsilon1:()=>xZ,_shadersepsilon2:()=>_Z,_shadersepsilon3:()=>TZ,_shadersepsilon4:()=>SZ,_shadersepsilon5:()=>CZ,_shadersepsilon6:()=>VZ,_shadersepsilon7:()=>LZ,_shadersequalsEpsilon:()=>PG,_shaderseyeOffset:()=>vG,_shaderseyeToWindowCoordinates:()=>wG,_shadersfastApproximateAtan:()=>FG,_shadersfog:()=>AG,_shadersgammaCorrect:()=>MG,_shadersgeodeticSurfaceNormal:()=>NG,_shadersgetDefaultMaterial:()=>kG,_shadersgetDynamicAtmosphereLightDirection:()=>UG,_shadersgetLambertDiffuse:()=>DG,_shadersgetSpecular:()=>BG,_shadersgetWaterNoise:()=>OG,_shadershue:()=>zG,_shadersinfinity:()=>RZ,_shadersinverseGamma:()=>KG,_shadersisEmpty:()=>JG,_shadersisFull:()=>QG,_shaderslatitudeToWebMercatorFraction:()=>jG,_shaderslineDistance:()=>$G,_shaderslinearToSrgb:()=>qG,_shadersluminance:()=>eE,_shadersmaterial:()=>nG,_shadersmaterialInput:()=>iG,_shadersmaximumComponent:()=>tE,_shadersmetersPerPixel:()=>nE,_shadersmodelMaterial:()=>oG,_shadersmodelToWindowCoordinates:()=>iE,_shadersmodelVertexOutput:()=>rG,_shadersmultiplyWithColorBalance:()=>oE,_shadersnearFarScalar:()=>rE,_shadersoctDecode:()=>sE,_shadersoneOverPi:()=>ZZ,_shadersoneOverTwoPi:()=>GZ,_shaderspackDepth:()=>aE,_shaderspassCesium3DTile:()=>EZ,_shaderspassCesium3DTileClassification:()=>IZ,_shaderspassCesium3DTileClassificationIgnoreShow:()=>XZ,_shaderspassClassification:()=>WZ,_shaderspassCompute:()=>PZ,_shaderspassEnvironment:()=>vZ,_shaderspassGlobe:()=>wZ,_shaderspassOpaque:()=>FZ,_shaderspassOverlay:()=>AZ,_shaderspassTerrainClassification:()=>MZ,_shaderspassTranslucent:()=>NZ,_shaderspassVoxels:()=>kZ,_shaderspbrLighting:()=>cE,_shaderspbrNeutralTonemapping:()=>lE,_shadersphong:()=>dE,_shaderspi:()=>UZ,_shaderspiOverFour:()=>DZ,_shaderspiOverSix:()=>BZ,_shaderspiOverThree:()=>OZ,_shaderspiOverTwo:()=>YZ,_shadersplaneDistance:()=>uE,_shaderspointAlongRay:()=>mE,_shadersradiansPerDegree:()=>HZ,_shadersray:()=>sG,_shadersrayEllipsoidIntersectionInterval:()=>hE,_shadersraySegment:()=>aG,_shadersraySphereIntersectionInterval:()=>fE,_shadersreadDepth:()=>pE,_shadersreadNonPerspective:()=>bE,_shadersreverseLogDepth:()=>gE,_shadersround:()=>TE,_shaderssaturation:()=>SE,_shaderssceneMode2D:()=>zZ,_shaderssceneMode3D:()=>KZ,_shaderssceneModeColumbusView:()=>JZ,_shaderssceneModeMorphing:()=>QZ,_shadersshadowDepthCompare:()=>CE,_shadersshadowParameters:()=>cG,_shadersshadowVisibility:()=>VE,_shaderssignNotZero:()=>LE,_shaderssolarRadius:()=>jZ,_shaderssphericalHarmonics:()=>RE,_shaderssrgbToLinear:()=>ZE,_shaderstangentToEyeSpaceMatrix:()=>GE,_shaderstextureCube:()=>EE,_shadersthreePiOver2:()=>qZ,_shaderstransformPlane:()=>IE,_shaderstranslateRelativeToEye:()=>XE,_shaderstranslucentPhong:()=>WE,_shaderstranspose:()=>PE,_shaderstwoPi:()=>$Z,_shadersunpackClippingExtents:()=>vE,_shadersunpackDepth:()=>wE,_shadersunpackFloat:()=>FE,_shadersunpackUint:()=>AE,_shadersvalueTransform:()=>ME,_shadersvertexLogDepth:()=>NE,_shaderswebMercatorMaxLatitude:()=>eG,_shaderswindowToEyeCoordinates:()=>kE,_shaderswriteDepthClamp:()=>UE,_shaderswriteLogDepth:()=>DE,_shaderswriteNonPerspective:()=>BE,addBuffer:()=>QI,addDefaults:()=>DI,addExtensionsRequired:()=>zI,addExtensionsUsed:()=>Pu,addPipelineExtras:()=>gg,addToArray:()=>Zs,appendForwardSlash:()=>cR,arrayRemoveDuplicates:()=>Co,barycentricCoordinates:()=>Sx,binarySearch:()=>Po,buildModuleUrl:()=>on,buildVoxelDrawCommands:()=>eM,clone:()=>Oe,combine:()=>Lt,computeFlyToLocationForRectangle:()=>BT,createBillboardPointCallback:()=>k_,createCommand:()=>Ln,createDefaultImageryProviderViewModels:()=>v9,createDefaultTerrainProviderViewModels:()=>w9,createElevationBandMaterial:()=>y6,createGooglePhotorealistic3DTileset:()=>x6,createGuid:()=>Jn,createMaterialPropertyDescriptor:()=>vo,createOsmBuildingsAsync:()=>_6,createPropertyDescriptor:()=>ue,createRawPropertyDescriptor:()=>Bc,createTangentSpaceDebugPrimitive:()=>T6,createTaskProcessorWorker:()=>nq,createUniform:()=>pZ,createUniformArray:()=>bZ,createWorldBathymetryAsync:()=>AM,createWorldImageryAsync:()=>x0,createWorldTerrainAsync:()=>IS,decodeGoogleEarthEnterpriseData:()=>MM,decodeVectorPolylinePositions:()=>cP,defaultValue:()=>y,defer:()=>Ll,defined:()=>l,demodernizeShader:()=>YE,deprecationWarning:()=>Ma,destroyObject:()=>me,exportKml:()=>i4,findAccessorMinMax:()=>p_,findContentMetadata:()=>H_,findGroupMetadata:()=>z_,findTileMetadata:()=>mP,forEachTextureInMaterial:()=>MC,formatError:()=>np,freezeRenderState:()=>vY,getAbsoluteUri:()=>rf,getAccessorByteStride:()=>wl,getBaseUri:()=>lR,getBinaryAccessor:()=>_d,getClipAndStyleCode:()=>LM,getClippingFunction:()=>p0,getComponentReader:()=>sb,getElement:()=>Wn,getExtensionFromUri:()=>ux,getFilenameFromUri:()=>Kb,getImageFromTypedArray:()=>tM,getImagePixels:()=>Im,getJsonFromTypedArray:()=>nr,getMagic:()=>Km,getMetadataClassProperty:()=>lM,getMetadataProperty:()=>uM,getStringFromTypedArray:()=>Wl,getTimestamp:()=>Si,hasExtension:()=>ci,heightReferenceOnEntityPropertyChanged:()=>Kp,isBitSet:()=>Xc,isBlobUri:()=>mx,isCrossOriginUrl:()=>B0,isDataUri:()=>Rp,isLeapYear:()=>Em,knockout:()=>Te,knockout_3_5_1:()=>BS,knockout_es5:()=>b9,loadAndExecuteScript:()=>hx,loadCubeMap:()=>vw,loadImageFromTypedArray:()=>m_,loadKTX2:()=>Gl,mergeSort:()=>T0,moveTechniqueRenderStates:()=>HI,moveTechniquesToExtension:()=>KI,numberOfComponentsForType:()=>Sd,objectToQuery:()=>fx,oneTimeWarning:()=>Ct,parseBatchTable:()=>bb,parseFeatureMetadataLegacy:()=>RX,parseGlb:()=>OI,parseResponseHeaders:()=>dR,parseStructuralMetadata:()=>LX,pickModel:()=>y1,pointInsideTriangle:()=>j7,preprocess3DTileContent:()=>vb,processVoxelProperties:()=>$A,queryToObject:()=>md,readAccessorPacked:()=>jI,removeExtension:()=>b_,removeExtensionsRequired:()=>BI,removeExtensionsUsed:()=>f_,removePipelineExtras:()=>YI,removeUnusedElements:()=>JI,resizeImageToNextPowerOfTwo:()=>_g,sampleTerrain:()=>ww,sampleTerrainMostDetailed:()=>DT,scaleToGeodeticSurface:()=>dx,srgbToLinear:()=>vS,subdivideArray:()=>zE,subscribeAndEvaluate:()=>Ga,updateAccessorComponentTypes:()=>qI,updateVersion:()=>$I,usesExtension:()=>ur,viewerCesium3DTilesInspectorMixin:()=>Vq,viewerCesiumInspectorMixin:()=>Lq,viewerDragDropMixin:()=>Zq,viewerPerformanceWatchdogMixin:()=>Gq,viewerVoxelInspectorMixin:()=>Eq,webGLConstantToGlslType:()=>r6,wrapFunction:()=>BM,writeTextToCanvas:()=>D_});var A2o=T(S(),1);var eao=T(S(),1);var SLt=T(S(),1);var JVt=T(S(),1);function Pq(e,t){return e!=null?e:t}Pq.EMPTY_OBJECT=Object.freeze({});var y=Pq;var jVt=T(S(),1);function R1e(e){return e!=null}var l=R1e;var eLt=T(S(),1);function cx(e){this.name="DeveloperError",this.message=e;let t;try{throw new Error}catch(n){t=n.stack}this.stack=t}l(Object.create)&&(cx.prototype=Object.create(Error.prototype),cx.prototype.constructor=cx);cx.prototype.toString=function(){let e=`${this.name}: ${this.message}`;return l(this.stack)&&(e+=` ${this.stack.toString()}`),e};cx.throwInstantiationError=function(){throw new cx("This function defines an interface and should not be called directly.")};var fe=cx;var aLt=T(S(),1);var oLt=T(S(),1);var Rs={};Rs.typeOf={};function Z1e(e){return`${e} is required, actual value was undefined`}function JS(e,t,n){return`Expected ${n} to be typeof ${t}, actual typeof was ${e}`}Rs.defined=function(e,t){if(!l(t))throw new fe(Z1e(e))};Rs.typeOf.func=function(e,t){if(typeof t!="function")throw new fe(JS(typeof t,"function",e))};Rs.typeOf.string=function(e,t){if(typeof t!="string")throw new fe(JS(typeof t,"string",e))};Rs.typeOf.number=function(e,t){if(typeof t!="number")throw new fe(JS(typeof t,"number",e))};Rs.typeOf.number.lessThan=function(e,t,n){if(Rs.typeOf.number(e,t),t>=n)throw new fe(`Expected ${e} to be less than ${n}, actual value was ${t}`)};Rs.typeOf.number.lessThanOrEquals=function(e,t,n){if(Rs.typeOf.number(e,t),t>n)throw new fe(`Expected ${e} to be less than or equal to ${n}, actual value was ${t}`)};Rs.typeOf.number.greaterThan=function(e,t,n){if(Rs.typeOf.number(e,t),t<=n)throw new fe(`Expected ${e} to be greater than ${n}, actual value was ${t}`)};Rs.typeOf.number.greaterThanOrEquals=function(e,t,n){if(Rs.typeOf.number(e,t),t0){for(o.sort(G1e),e=0;e0&&(this._hash={},e.length=0)};var Et=lx;var UIt=T(S(),1);var wLt=T(S(),1);var ILt=T(S(),1),iO=T(uN(),1);var lt={};lt.EPSILON1=.1;lt.EPSILON2=.01;lt.EPSILON3=.001;lt.EPSILON4=1e-4;lt.EPSILON5=1e-5;lt.EPSILON6=1e-6;lt.EPSILON7=1e-7;lt.EPSILON8=1e-8;lt.EPSILON9=1e-9;lt.EPSILON10=1e-10;lt.EPSILON11=1e-11;lt.EPSILON12=1e-12;lt.EPSILON13=1e-13;lt.EPSILON14=1e-14;lt.EPSILON15=1e-15;lt.EPSILON16=1e-16;lt.EPSILON17=1e-17;lt.EPSILON18=1e-18;lt.EPSILON19=1e-19;lt.EPSILON20=1e-20;lt.EPSILON21=1e-21;lt.GRAVITATIONALPARAMETER=3986004418e5;lt.SOLAR_RADIUS=6955e5;lt.LUNAR_RADIUS=1737400;lt.SIXTY_FOUR_KILOBYTES=64*1024;lt.FOUR_GIGABYTES=4*1024*1024*1024;lt.sign=y(Math.sign,function(t){return t=+t,t===0||t!==t?t:t>0?1:-1});lt.signNotZero=function(e){return e<0?-1:1};lt.toSNorm=function(e,t){return t=y(t,255),Math.round((lt.clamp(e,-1,1)*.5+.5)*t)};lt.fromSNorm=function(e,t){return t=y(t,255),lt.clamp(e,0,t)/t*2-1};lt.normalize=function(e,t,n){return n=Math.max(n-t,0),n===0?0:lt.clamp((e-t)/n,0,1)};lt.sinh=y(Math.sinh,function(t){return(Math.exp(t)-Math.exp(-t))/2});lt.cosh=y(Math.cosh,function(t){return(Math.exp(t)+Math.exp(-t))/2});lt.lerp=function(e,t,n){return(1-n)*e+n*t};lt.PI=Math.PI;lt.ONE_OVER_PI=1/Math.PI;lt.PI_OVER_TWO=Math.PI/2;lt.PI_OVER_THREE=Math.PI/3;lt.PI_OVER_FOUR=Math.PI/4;lt.PI_OVER_SIX=Math.PI/6;lt.THREE_PI_OVER_TWO=3*Math.PI/2;lt.TWO_PI=2*Math.PI;lt.ONE_OVER_TWO_PI=1/(2*Math.PI);lt.RADIANS_PER_DEGREE=Math.PI/180;lt.DEGREES_PER_RADIAN=180/Math.PI;lt.RADIANS_PER_ARCSECOND=lt.RADIANS_PER_DEGREE/3600;lt.toRadians=function(e){return e*lt.RADIANS_PER_DEGREE};lt.toDegrees=function(e){return e*lt.DEGREES_PER_RADIAN};lt.convertLongitudeRange=function(e){let t=lt.TWO_PI,n=e-Math.floor(e/t)*t;return n<-Math.PI?n+t:n>=Math.PI?n-t:n};lt.clampToLatitudeRange=function(e){return lt.clamp(e,-1*lt.PI_OVER_TWO,lt.PI_OVER_TWO)};lt.negativePiToPi=function(e){return e>=-lt.PI&&e<=lt.PI?e:lt.zeroToTwoPi(e+lt.PI)-lt.PI};lt.zeroToTwoPi=function(e){if(e>=0&&e<=lt.TWO_PI)return e;let t=lt.mod(e,lt.TWO_PI);return Math.abs(t)lt.EPSILON14?lt.TWO_PI:t};lt.mod=function(e,t){return lt.sign(e)===lt.sign(t)&&Math.abs(e)n};lt.greaterThanOrEquals=function(e,t,n){return e-t>-n};var mN=[1];lt.factorial=function(e){let t=mN.length;if(e>=t){let n=mN[t-1];for(let i=t;i<=e;i++){let o=n*i;mN.push(o),n=o}}return mN[e]};lt.incrementWrap=function(e,t,n){return n=y(n,0),++e,e>t&&(e=n),e};lt.isPowerOfTwo=function(e){return e!==0&&(e&e-1)===0};lt.nextPowerOfTwo=function(e){return--e,e|=e>>1,e|=e>>2,e|=e>>4,e|=e>>8,e|=e>>16,++e,e};lt.previousPowerOfTwo=function(e){return e|=e>>1,e|=e>>2,e|=e>>4,e|=e>>8,e|=e>>16,e|=e>>32,e=(e>>>0)-(e>>>1),e};lt.clamp=function(e,t,n){return en?n:e};var wq=new iO.default;lt.setRandomNumberSeed=function(e){wq=new iO.default(e)};lt.nextRandomNumber=function(){return wq.random()};lt.randomBetween=function(e,t){return lt.nextRandomNumber()*(t-e)+e};lt.acosClamped=function(e){return Math.acos(lt.clamp(e,-1,1))};lt.asinClamped=function(e){return Math.asin(lt.clamp(e,-1,1))};lt.chordLength=function(e,t){return 2*t*Math.sin(e*.5)};lt.logBase=function(e,t){return Math.log(e)/Math.log(t)};lt.cbrt=y(Math.cbrt,function(t){let n=Math.pow(Math.abs(t),.3333333333333333);return t<0?-n:n});lt.log2=y(Math.log2,function(t){return Math.log(t)*Math.LOG2E});lt.fog=function(e,t){let n=e*t;return 1-Math.exp(-(n*n))};lt.fastApproximateAtan=function(e){return e*(-.1784*Math.abs(e)-.0663*e*e+1.0301)};lt.fastApproximateAtan2=function(e,t){let n,i=Math.abs(e);n=Math.abs(t);let o=Math.max(i,n);n=Math.min(i,n);let r=n/o;return i=lt.fastApproximateAtan(r),i=Math.abs(t)>Math.abs(e)?lt.PI_OVER_TWO-i:i,i=e<0?lt.PI-i:i,i=t<0?-i:i,i};var W=lt;function kt(e,t){this.x=y(e,0),this.y=y(t,0)}kt.fromElements=function(e,t,n){return l(n)?(n.x=e,n.y=t,n):new kt(e,t)};kt.clone=function(e,t){if(l(e))return l(t)?(t.x=e.x,t.y=e.y,t):new kt(e.x,e.y)};kt.fromCartesian3=kt.clone;kt.fromCartesian4=kt.clone;kt.packedLength=2;kt.pack=function(e,t,n){return n=y(n,0),t[n++]=e.x,t[n]=e.y,t};kt.unpack=function(e,t,n){return t=y(t,0),l(n)||(n=new kt),n.x=e[t++],n.y=e[t],n};kt.packArray=function(e,t){let n=e.length,i=n*2;l(t)?!Array.isArray(t)&&t.length!==i||t.length!==i&&(t.length=i):t=new Array(i);for(let o=0;oW.EPSILON12);return l(o)?(o.x=r*w,o.y=s*A,o.z=a*b,o):new m(r*w,s*A,a*b)}var dx=F1e;function Uo(e,t,n){this.longitude=y(e,0),this.latitude=y(t,0),this.height=y(n,0)}Uo.fromRadians=function(e,t,n,i){return n=y(n,0),l(i)?(i.longitude=e,i.latitude=t,i.height=n,i):new Uo(e,t,n)};Uo.fromDegrees=function(e,t,n,i){return e=W.toRadians(e),t=W.toRadians(t),Uo.fromRadians(e,t,n,i)};var A1e=new m,M1e=new m,N1e=new m;Uo._ellipsoidOneOverRadii=new m(1/6378137,1/6378137,1/6356752314245179e-9);Uo._ellipsoidOneOverRadiiSquared=new m(1/(6378137*6378137),1/(6378137*6378137),1/(6356752314245179e-9*6356752314245179e-9));Uo._ellipsoidCenterToleranceSquared=W.EPSILON1;Uo.fromCartesian=function(e,t,n){let i=l(t)?t.oneOverRadii:Uo._ellipsoidOneOverRadii,o=l(t)?t.oneOverRadiiSquared:Uo._ellipsoidOneOverRadiiSquared,r=l(t)?t._centerToleranceSquared:Uo._ellipsoidCenterToleranceSquared,s=dx(e,i,o,r,M1e);if(!l(s))return;let a=m.multiplyComponents(s,o,A1e);a=m.normalize(a,a);let c=m.subtract(e,s,N1e),d=Math.atan2(a.y,a.x),u=Math.asin(a.z),h=W.sign(m.dot(c,e))*m.magnitude(c);return l(n)?(n.longitude=d,n.latitude=u,n.height=h,n):new Uo(d,u,h)};Uo.toCartesian=function(e,t,n){return m.fromRadians(e.longitude,e.latitude,e.height,t,n)};Uo.clone=function(e,t){if(l(e))return l(t)?(t.longitude=e.longitude,t.latitude=e.latitude,t.height=e.height,t):new Uo(e.longitude,e.latitude,e.height)};Uo.equals=function(e,t){return e===t||l(e)&&l(t)&&e.longitude===t.longitude&&e.latitude===t.latitude&&e.height===t.height};Uo.equalsEpsilon=function(e,t,n){return n=y(n,0),e===t||l(e)&&l(t)&&Math.abs(e.longitude-t.longitude)<=n&&Math.abs(e.latitude-t.latitude)<=n&&Math.abs(e.height-t.height)<=n};Uo.ZERO=Object.freeze(new Uo(0,0,0));Uo.prototype.clone=function(e){return Uo.clone(this,e)};Uo.prototype.equals=function(e){return Uo.equals(this,e)};Uo.prototype.equalsEpsilon=function(e,t){return Uo.equalsEpsilon(this,e,t)};Uo.prototype.toString=function(){return`(${this.longitude}, ${this.latitude}, ${this.height})`};var he=Uo;var aRt=T(S(),1);function Uq(e,t,n,i){t=y(t,0),n=y(n,0),i=y(i,0),e._radii=new m(t,n,i),e._radiiSquared=new m(t*t,n*n,i*i),e._radiiToTheFourth=new m(t*t*t*t,n*n*n*n,i*i*i*i),e._oneOverRadii=new m(t===0?0:1/t,n===0?0:1/n,i===0?0:1/i),e._oneOverRadiiSquared=new m(t===0?0:1/(t*t),n===0?0:1/(n*n),i===0?0:1/(i*i)),e._minimumRadius=Math.min(t,n,i),e._maximumRadius=Math.max(t,n,i),e._centerToleranceSquared=W.EPSILON1,e._radiiSquared.z!==0&&(e._squaredXOverSquaredZ=e._radiiSquared.x/e._radiiSquared.z)}function yi(e,t,n){this._radii=void 0,this._radiiSquared=void 0,this._radiiToTheFourth=void 0,this._oneOverRadii=void 0,this._oneOverRadiiSquared=void 0,this._minimumRadius=void 0,this._maximumRadius=void 0,this._centerToleranceSquared=void 0,this._squaredXOverSquaredZ=void 0,Uq(this,e,t,n)}Object.defineProperties(yi.prototype,{radii:{get:function(){return this._radii}},radiiSquared:{get:function(){return this._radiiSquared}},radiiToTheFourth:{get:function(){return this._radiiToTheFourth}},oneOverRadii:{get:function(){return this._oneOverRadii}},oneOverRadiiSquared:{get:function(){return this._oneOverRadiiSquared}},minimumRadius:{get:function(){return this._minimumRadius}},maximumRadius:{get:function(){return this._maximumRadius}}});yi.clone=function(e,t){if(!l(e))return;let n=e._radii;return l(t)?(m.clone(n,t._radii),m.clone(e._radiiSquared,t._radiiSquared),m.clone(e._radiiToTheFourth,t._radiiToTheFourth),m.clone(e._oneOverRadii,t._oneOverRadii),m.clone(e._oneOverRadiiSquared,t._oneOverRadiiSquared),t._minimumRadius=e._minimumRadius,t._maximumRadius=e._maximumRadius,t._centerToleranceSquared=e._centerToleranceSquared,t):new yi(n.x,n.y,n.z)};yi.fromCartesian3=function(e,t){return l(t)||(t=new yi),l(e)&&Uq(t,e.x,e.y,e.z),t};yi.WGS84=Object.freeze(new yi(6378137,6378137,6356752314245179e-9));yi.UNIT_SPHERE=Object.freeze(new yi(1,1,1));yi.MOON=Object.freeze(new yi(W.LUNAR_RADIUS,W.LUNAR_RADIUS,W.LUNAR_RADIUS));yi._default=yi.WGS84;Object.defineProperties(yi,{default:{get:function(){return yi._default},set:function(e){yi._default=e,m._ellipsoidRadiiSquared=e.radiiSquared,he._ellipsoidOneOverRadii=e.oneOverRadii,he._ellipsoidOneOverRadiiSquared=e.oneOverRadiiSquared,he._ellipsoidCenterToleranceSquared=e._centerToleranceSquared}}});yi.prototype.clone=function(e){return yi.clone(this,e)};yi.packedLength=m.packedLength;yi.pack=function(e,t,n){return n=y(n,0),m.pack(e._radii,t,n),t};yi.unpack=function(e,t,n){t=y(t,0);let i=m.unpack(e,t);return yi.fromCartesian3(i,n)};yi.prototype.geocentricSurfaceNormal=m.normalize;yi.prototype.geodeticSurfaceNormalCartographic=function(e,t){let n=e.longitude,i=e.latitude,o=Math.cos(i),r=o*Math.cos(n),s=o*Math.sin(n),a=Math.sin(i);return l(t)||(t=new m),t.x=r,t.y=s,t.z=a,m.normalize(t,t)};yi.prototype.geodeticSurfaceNormal=function(e,t){if(!m.equalsEpsilon(e,m.ZERO,W.EPSILON14))return l(t)||(t=new m),t=m.multiplyComponents(e,this._oneOverRadiiSquared,t),m.normalize(t,t)};var k1e=new m,U1e=new m;yi.prototype.cartographicToCartesian=function(e,t){let n=k1e,i=U1e;this.geodeticSurfaceNormalCartographic(e,n),m.multiplyComponents(this._radiiSquared,n,i);let o=Math.sqrt(m.dot(n,i));return m.divideByScalar(i,o,i),m.multiplyByScalar(n,e.height,n),l(t)||(t=new m),m.add(i,n,t)};yi.prototype.cartographicArrayToCartesianArray=function(e,t){let n=e.length;l(t)?t.length=n:t=new Array(n);for(let i=0;i=this._radii.z-t))return n};var Y1e=new m;yi.prototype.getLocalCurvature=function(e,t){l(t)||(t=new D);let n=this.getSurfaceNormalIntersectionWithZAxis(e,0,Y1e),i=m.distance(e,n),o=this.minimumRadius*i/this.maximumRadius**2,r=i*o**2;return D.fromElements(1/i,1/r,t)};var H1e=[.14887433898163,.43339539412925,.67940956829902,.86506336668898,.97390652851717,0],z1e=[.29552422471475,.26926671930999,.21908636251598,.14945134915058,.066671344308684,0];function kq(e,t,n){let i=.5*(t+e),o=.5*(t-e),r=0;for(let s=0;s<5;s++){let a=o*H1e[s];r+=z1e[s]*(n(i+a)+n(i-a))}return r*=o,r}yi.prototype.surfaceArea=function(e){let t=e.west,n=e.east,i=e.south,o=e.north;for(;n0){o=r-1;continue}return r}return~(o+1)}var Po=q1e;var LRt=T(S(),1);function $1e(e,t,n,i,o){this.xPoleWander=e,this.yPoleWander=t,this.xPoleOffset=n,this.yPoleOffset=i,this.ut1MinusUtc=o}var U0=$1e;var JRt=T(S(),1);var PRt=T(S(),1);var ZRt=T(S(),1);function eVe(e){return e%4===0&&e%100!==0||e%400===0}var Em=eVe;var Oq=[31,28,31,30,31,30,31,31,30,31,30,31];function tVe(e,t,n,i,o,r,s,a){e=y(e,1),t=y(t,1),n=y(n,1),i=y(i,0),o=y(o,0),r=y(r,0),s=y(s,0),a=y(a,!1),this.year=e,this.month=t,this.day=n,this.hour=i,this.minute=o,this.second=r,this.millisecond=s,this.isLeapSecond=a;function x(){To.typeOf.number.greaterThanOrEquals("Year",e,1),To.typeOf.number.lessThanOrEquals("Year",e,9999),To.typeOf.number.greaterThanOrEquals("Month",t,1),To.typeOf.number.lessThanOrEquals("Month",t,12),To.typeOf.number.greaterThanOrEquals("Day",n,1),To.typeOf.number.lessThanOrEquals("Day",n,31),To.typeOf.number.greaterThanOrEquals("Hour",i,0),To.typeOf.number.lessThanOrEquals("Hour",i,23),To.typeOf.number.greaterThanOrEquals("Minute",o,0),To.typeOf.number.lessThanOrEquals("Minute",o,59),To.typeOf.bool("IsLeapSecond",a),To.typeOf.number.greaterThanOrEquals("Second",r,0),To.typeOf.number.lessThanOrEquals("Second",r,a?60:59),To.typeOf.number.greaterThanOrEquals("Millisecond",s,0),To.typeOf.number.lessThan("Millisecond",s,1e3)}function _(){let C=t===2&&Em(e)?Oq[t-1]+1:Oq[t-1];if(n>C)throw new fe("Month and Day represents invalid date")}}var Lp=tVe;var wRt=T(S(),1);function nVe(e,t){this.julianDate=e,this.offset=t}var Ki=nVe;var ARt=T(S(),1),iVe={SECONDS_PER_MILLISECOND:.001,SECONDS_PER_MINUTE:60,MINUTES_PER_HOUR:60,HOURS_PER_DAY:24,SECONDS_PER_HOUR:3600,MINUTES_PER_DAY:1440,SECONDS_PER_DAY:86400,DAYS_PER_JULIAN_CENTURY:36525,PICOSECOND:1e-9,MODIFIED_JULIAN_DATE_DIFFERENCE:24000005e-1},Qn=Object.freeze(iVe);var NRt=T(S(),1),oVe={UTC:0,TAI:1},Kn=Object.freeze(oVe);var Hq=new Lp,sO=[31,28,31,30,31,30,31,31,30,31,30,31],aO=29;function cO(e,t){return vt.compare(e.julianDate,t.julianDate)}var jS=new Ki;function xN(e){jS.julianDate=e;let t=vt.leapSeconds,n=Po(t,jS,cO);n<0&&(n=~n),n>=t.length&&(n=t.length-1);let i=t[n].offset;n>0&&vt.secondsDifference(t[n].julianDate,e)>i&&(n--,i=t[n].offset),vt.addSeconds(e,i,e)}function Yq(e,t){jS.julianDate=e;let n=vt.leapSeconds,i=Po(n,jS,cO);if(i<0&&(i=~i),i===0)return vt.addSeconds(e,-n[0].offset,t);if(i>=n.length)return vt.addSeconds(e,-n[i-1].offset,t);let o=vt.secondsDifference(n[i].julianDate,e);if(o===0)return vt.addSeconds(e,-n[i].offset,t);if(!(o<=1))return vt.addSeconds(e,-n[--i].offset,t)}function D0(e,t,n){let i=t/Qn.SECONDS_PER_DAY|0;return e+=i,t-=Qn.SECONDS_PER_DAY*i,t<0&&(e--,t+=Qn.SECONDS_PER_DAY),n.dayNumber=e,n.secondsOfDay=t,n}function lO(e,t,n,i,o,r,s){let a=(t-14)/12|0,c=e+4800+a,d=(1461*c/4|0)+(367*(t-2-12*a)/12|0)-(3*((c+100)/100|0)/4|0)+n-32075;i=i-12,i<0&&(i+=24);let u=r+(i*Qn.SECONDS_PER_HOUR+o*Qn.SECONDS_PER_MINUTE+s*Qn.SECONDS_PER_MILLISECOND);return u>=43200&&(d-=1),[d,u]}var rVe=/^(\d{4})$/,sVe=/^(\d{4})-(\d{2})$/,aVe=/^(\d{4})-?(\d{3})$/,cVe=/^(\d{4})-?W(\d{2})-?(\d{1})?$/,lVe=/^(\d{4})-?(\d{2})-?(\d{2})$/,dO=/([Z+\-])?(\d{2})?:?(\d{2})?$/,dVe=/^(\d{2})(\.\d+)?/.source+dO.source,uVe=/^(\d{2}):?(\d{2})(\.\d+)?/.source+dO.source,mVe=/^(\d{2}):?(\d{2}):?(\d{2})(\.\d+)?/.source+dO.source;function vt(e,t,n){this.dayNumber=void 0,this.secondsOfDay=void 0,e=y(e,0),t=y(t,0),n=y(n,Kn.UTC);let i=e|0;t=t+(e-i)*Qn.SECONDS_PER_DAY,D0(i,t,this),n===Kn.UTC&&xN(this)}vt.fromGregorianDate=function(e,t){let n=lO(e.year,e.month,e.day,e.hour,e.minute,e.second,e.millisecond);return l(t)?(D0(n[0],n[1],t),xN(t),t):new vt(n[0],n[1],Kn.UTC)};vt.fromDate=function(e,t){let n=lO(e.getUTCFullYear(),e.getUTCMonth()+1,e.getUTCDate(),e.getUTCHours(),e.getUTCMinutes(),e.getUTCSeconds(),e.getUTCMilliseconds());return l(t)?(D0(n[0],n[1],t),xN(t),t):new vt(n[0],n[1],Kn.UTC)};vt.fromIso8601=function(e,t){e=e.replace(",",".");let n=e.split("T"),i,o=1,r=1,s=0,a=0,c=0,d=0,u=n[0],h=n[1],p,g;if(n=u.match(lVe),n!==null)i=+n[1],o=+n[2],r=+n[3];else if(n=u.match(sVe),n!==null)i=+n[1],o=+n[2];else if(n=u.match(rVe),n!==null)i=+n[1];else{let C;if(n=u.match(aVe),n!==null)i=+n[1],C=+n[2],g=Em(i);else if(n=u.match(cVe),n!==null){i=+n[1];let V=+n[2],L=+n[3]||0,R=new Date(Date.UTC(i,0,4));C=V*7+L-R.getUTCDay()-3}p=new Date(Date.UTC(i,0,1)),p.setUTCDate(C),o=p.getUTCMonth()+1,r=p.getUTCDate()}g=Em(i);let f;if(l(h)){n=h.match(mVe),n!==null?(s=+n[1],a=+n[2],c=+n[3],d=+(n[4]||0)*1e3,f=5):(n=h.match(uVe),n!==null?(s=+n[1],a=+n[2],c=+(n[3]||0)*60,f=4):(n=h.match(dVe),n!==null&&(s=+n[1],a=+(n[2]||0)*60,f=3)));let C=n[f],V=+n[f+1],L=+(n[f+2]||0);switch(C){case"+":s=s-V,a=a-L;break;case"-":s=s+V,a=a+L;break;case"Z":break;default:a=a+new Date(Date.UTC(i,o-1,r,s,a)).getTimezoneOffset();break}}let x=c===60;for(x&&c--;a>=60;)a-=60,s++;for(;s>=24;)s-=24,r++;for(p=g&&o===2?aO:sO[o-1];r>p;)r-=p,o++,o>12&&(o-=12,i++),p=g&&o===2?aO:sO[o-1];for(;a<0;)a+=60,s--;for(;s<0;)s+=24,r--;for(;r<1;)o--,o<1&&(o+=12,i--),p=g&&o===2?aO:sO[o-1],r+=p;let _=lO(i,o,r,s,a,c,d);return l(t)?(D0(_[0],_[1],t),xN(t)):t=new vt(_[0],_[1],Kn.UTC),x&&vt.addSeconds(t,1,t),t};vt.now=function(e){return vt.fromDate(new Date,e)};var yN=new vt(0,0,Kn.TAI);vt.toGregorianDate=function(e,t){let n=!1,i=Yq(e,yN);l(i)||(vt.addSeconds(e,-1,yN),i=Yq(yN,yN),n=!0);let o=i.dayNumber,r=i.secondsOfDay;r>=43200&&(o+=1);let s=o+68569|0,a=4*s/146097|0;s=s-((146097*a+3)/4|0)|0;let c=4e3*(s+1)/1461001|0;s=s-(1461*c/4|0)+31|0;let d=80*s/2447|0,u=s-(2447*d/80|0)|0;s=d/11|0;let h=d+2-12*s|0,p=100*(a-49)+c+s|0,g=r/Qn.SECONDS_PER_HOUR|0,f=r-g*Qn.SECONDS_PER_HOUR,x=f/Qn.SECONDS_PER_MINUTE|0;f=f-x*Qn.SECONDS_PER_MINUTE;let _=f|0,C=(f-_)/Qn.SECONDS_PER_MILLISECOND;return g+=12,g>23&&(g-=24),n&&(_+=1),l(t)?(t.year=p,t.month=h,t.day=u,t.hour=g,t.minute=x,t.second=_,t.millisecond=C,t.isLeapSecond=n,t):new Lp(p,h,u,g,x,_,C,n)};vt.toDate=function(e){let t=vt.toGregorianDate(e,Hq),n=t.second;return t.isLeapSecond&&(n-=1),new Date(Date.UTC(t.year,t.month-1,t.day,t.hour,t.minute,n,t.millisecond))};vt.toIso8601=function(e,t){let n=vt.toGregorianDate(e,Hq),i=n.year,o=n.month,r=n.day,s=n.hour,a=n.minute,c=n.second,d=n.millisecond;i===1e4&&o===1&&r===1&&s===0&&a===0&&c===0&&d===0&&(i=9999,o=12,r=31,s=24);let u;if(!l(t)&&d!==0){let h=d*.01;return u=h<1e-6?h.toFixed(20).replace(".","").replace(/0+$/,""):h.toString().replace(".",""),`${i.toString().padStart(4,"0")}-${o.toString().padStart(2,"0")}-${r.toString().padStart(2,"0")}T${s.toString().padStart(2,"0")}:${a.toString().padStart(2,"0")}:${c.toString().padStart(2,"0")}.${u}Z`}return!l(t)||t===0?`${i.toString().padStart(4,"0")}-${o.toString().padStart(2,"0")}-${r.toString().padStart(2,"0")}T${s.toString().padStart(2,"0")}:${a.toString().padStart(2,"0")}:${c.toString().padStart(2,"0")}Z`:(u=(d*.01).toFixed(t).replace(".","").slice(0,t),`${i.toString().padStart(4,"0")}-${o.toString().padStart(2,"0")}-${r.toString().padStart(2,"0")}T${s.toString().padStart(2,"0")}:${a.toString().padStart(2,"0")}:${c.toString().padStart(2,"0")}.${u}Z`)};vt.clone=function(e,t){if(l(e))return l(t)?(t.dayNumber=e.dayNumber,t.secondsOfDay=e.secondsOfDay,t):new vt(e.dayNumber,e.secondsOfDay,Kn.TAI)};vt.compare=function(e,t){let n=e.dayNumber-t.dayNumber;return n!==0?n:e.secondsOfDay-t.secondsOfDay};vt.equals=function(e,t){return e===t||l(e)&&l(t)&&e.dayNumber===t.dayNumber&&e.secondsOfDay===t.secondsOfDay};vt.equalsEpsilon=function(e,t,n){return n=y(n,0),e===t||l(e)&&l(t)&&Math.abs(vt.secondsDifference(e,t))<=n};vt.totalDays=function(e){return e.dayNumber+e.secondsOfDay/Qn.SECONDS_PER_DAY};vt.secondsDifference=function(e,t){return(e.dayNumber-t.dayNumber)*Qn.SECONDS_PER_DAY+(e.secondsOfDay-t.secondsOfDay)};vt.daysDifference=function(e,t){let n=e.dayNumber-t.dayNumber,i=(e.secondsOfDay-t.secondsOfDay)/Qn.SECONDS_PER_DAY;return n+i};vt.computeTaiMinusUtc=function(e){jS.julianDate=e;let t=vt.leapSeconds,n=Po(t,jS,cO);return n<0&&(n=~n,--n,n<0&&(n=0)),t[n].offset};vt.addSeconds=function(e,t,n){return D0(e.dayNumber,e.secondsOfDay+t,n)};vt.addMinutes=function(e,t,n){let i=e.secondsOfDay+t*Qn.SECONDS_PER_MINUTE;return D0(e.dayNumber,i,n)};vt.addHours=function(e,t,n){let i=e.secondsOfDay+t*Qn.SECONDS_PER_HOUR;return D0(e.dayNumber,i,n)};vt.addDays=function(e,t,n){let i=e.dayNumber+t;return D0(i,e.secondsOfDay,n)};vt.lessThan=function(e,t){return vt.compare(e,t)<0};vt.lessThanOrEquals=function(e,t){return vt.compare(e,t)<=0};vt.greaterThan=function(e,t){return vt.compare(e,t)>0};vt.greaterThanOrEquals=function(e,t){return vt.compare(e,t)>=0};vt.prototype.clone=function(e){return vt.clone(this,e)};vt.prototype.equals=function(e){return vt.equals(this,e)};vt.prototype.equalsEpsilon=function(e,t){return vt.equalsEpsilon(this,e,t)};vt.prototype.toString=function(){return vt.toIso8601(this)};vt.leapSeconds=[new Ki(new vt(2441317,43210,Kn.TAI),10),new Ki(new vt(2441499,43211,Kn.TAI),11),new Ki(new vt(2441683,43212,Kn.TAI),12),new Ki(new vt(2442048,43213,Kn.TAI),13),new Ki(new vt(2442413,43214,Kn.TAI),14),new Ki(new vt(2442778,43215,Kn.TAI),15),new Ki(new vt(2443144,43216,Kn.TAI),16),new Ki(new vt(2443509,43217,Kn.TAI),17),new Ki(new vt(2443874,43218,Kn.TAI),18),new Ki(new vt(2444239,43219,Kn.TAI),19),new Ki(new vt(2444786,43220,Kn.TAI),20),new Ki(new vt(2445151,43221,Kn.TAI),21),new Ki(new vt(2445516,43222,Kn.TAI),22),new Ki(new vt(2446247,43223,Kn.TAI),23),new Ki(new vt(2447161,43224,Kn.TAI),24),new Ki(new vt(2447892,43225,Kn.TAI),25),new Ki(new vt(2448257,43226,Kn.TAI),26),new Ki(new vt(2448804,43227,Kn.TAI),27),new Ki(new vt(2449169,43228,Kn.TAI),28),new Ki(new vt(2449534,43229,Kn.TAI),29),new Ki(new vt(2450083,43230,Kn.TAI),30),new Ki(new vt(2450630,43231,Kn.TAI),31),new Ki(new vt(2451179,43232,Kn.TAI),32),new Ki(new vt(2453736,43233,Kn.TAI),33),new Ki(new vt(2454832,43234,Kn.TAI),34),new Ki(new vt(2456109,43235,Kn.TAI),35),new Ki(new vt(2457204,43236,Kn.TAI),36),new Ki(new vt(2457754,43237,Kn.TAI),37)];var q=vt;var BGt=T(S(),1),u$=T(ud(),1);var tZt=T(S(),1);function hVe(e){return(e.length===0||e[e.length-1]!=="/")&&(e=`${e}/`),e}var cR=hVe;var oZt=T(S(),1);function $q(e,t){if(e===null||typeof e!="object")return e;t=y(t,!1);let n=new e.constructor;for(let i in e)if(e.hasOwnProperty(i)){let o=e[i];t&&(o=$q(o,t)),n[i]=o}return n}var Oe=$q;var cZt=T(S(),1);function e$(e,t,n){n=y(n,!1);let i={},o=l(e),r=l(t),s,a,c;if(o)for(s in e)e.hasOwnProperty(s)&&(a=e[s],r&&n&&typeof a=="object"&&t.hasOwnProperty(s)?(c=t[s],typeof c=="object"?i[s]=e$(a,c,n):i[s]=a):i[s]=a);if(r)for(s in t)t.hasOwnProperty(s)&&!i.hasOwnProperty(s)&&(c=t[s],i[s]=c);return i}var Lt=e$;var dZt=T(S(),1);function fVe(){let e,t,n=new Promise(function(i,o){e=i,t=o});return{resolve:e,reject:t,promise:n}}var Ll=fVe;var fZt=T(S(),1),t$=T(ud(),1);function uO(e,t){let n;return typeof document<"u"&&(n=document),uO._implementation(e,t,n)}uO._implementation=function(e,t,n){if(!l(t)){if(typeof n>"u")return e;t=y(n.baseURI,n.location.href)}let i=new t$.default(e);return i.scheme()!==""?i.toString():i.absoluteTo(t).toString()};var rf=uO;var bZt=T(S(),1),n$=T(ud(),1);function pVe(e,t){let n="",i=e.lastIndexOf("/");return i!==-1&&(n=e.substring(0,i+1)),t&&(e=new n$.default(e),e.query().length!==0&&(n+=`?${e.query()}`),e.fragment().length!==0&&(n+=`#${e.fragment()}`)),n}var lR=pVe;var yZt=T(S(),1),i$=T(ud(),1);function bVe(e){let t=new i$.default(e);t.normalize();let n=t.path(),i=n.lastIndexOf("/");return i!==-1&&(n=n.substr(i+1)),i=n.lastIndexOf("."),i===-1?n="":n=n.substr(i+1),n}var ux=bVe;var TZt=T(S(),1);var o$={};function gVe(e,t,n){l(t)||(t=e.width),l(n)||(n=e.height);let i=o$[t];l(i)||(i={},o$[t]=i);let o=i[n];if(!l(o)){let r=document.createElement("canvas");r.width=t,r.height=n,o=r.getContext("2d",{willReadFrequently:!0}),o.globalCompositeOperation="copy",i[n]=o}return o.drawImage(e,0,0,t,n),o.getImageData(0,0,t,n).data}var Im=gVe;var CZt=T(S(),1);var yVe=/^blob:/i;function xVe(e){return yVe.test(e)}var mx=xVe;var RZt=T(S(),1);var sf;function _Ve(e){l(sf)||(sf=document.createElement("a")),sf.href=window.location.href;let t=sf.host,n=sf.protocol;return sf.href=e,sf.href=sf.href,n!==sf.protocol||t!==sf.host}var B0=_Ve;var GZt=T(S(),1);var TVe=/^data:/i;function SVe(e){return TVe.test(e)}var Rp=SVe;var IZt=T(S(),1);function CVe(e){let t=document.createElement("script");return t.async=!0,t.src=e,new Promise((n,i)=>{window.crossOriginIsolated&&t.setAttribute("crossorigin","anonymous");let o=document.getElementsByTagName("head")[0];t.onload=function(){t.onload=void 0,o.removeChild(t),n()},t.onerror=function(r){i(r)},o.appendChild(t)})}var hx=CVe;var WZt=T(S(),1);function VVe(e){let t="";for(let n in e)if(e.hasOwnProperty(n)){let i=e[n],o=`${encodeURIComponent(n)}=`;if(Array.isArray(i))for(let r=0,s=i.length;r0){let s=o.substring(0,r),a=o.substring(r+2);t[s]=a}}return t}var dR=GVe;function r$(e,t,n){this.statusCode=e,this.response=t,this.responseHeaders=n,typeof this.responseHeaders=="string"&&(this.responseHeaders=dR(this.responseHeaders))}r$.prototype.toString=function(){let e="Request has failed.";return l(this.statusCode)&&(e+=` Status Code: ${this.statusCode}`),e};var af=r$;var uGt=T(S(),1),VN=T(ud(),1);var tGt=T(S(),1);function px(e){this._comparator=e.comparator,this._array=[],this._length=0,this._maximumLength=void 0}Object.defineProperties(px.prototype,{length:{get:function(){return this._length}},internalArray:{get:function(){return this._array}},maximumLength:{get:function(){return this._maximumLength},set:function(e){let t=this._length;if(e=0;--t)this.heapify(t)};px.prototype.insert=function(e){let t=this._array,n=this._comparator,i=this._maximumLength,o=this._length++;for(oi&&(r=t[i],this._length=i),r};px.prototype.pop=function(e){if(e=y(e,0),this._length===0)return;let t=this._array,n=t[e];return mO(t,e,--this._length),this.heapify(e),t[this._length]=void 0,n};var uR=px;function EVe(e,t){return e.priority-t.priority}var io={numberOfAttemptedRequests:0,numberOfActiveRequests:0,numberOfCancelledRequests:0,numberOfCancelledActiveRequests:0,numberOfFailedRequests:0,numberOfActiveRequestsEver:0,lastNumberOfActiveRequests:0},eC=20,nc=new uR({comparator:EVe});nc.maximumLength=eC;nc.reserve(eC);var cf=[],Zp={},IVe=typeof document<"u"?new VN.default(document.location.href):new VN.default,LN=new be;function jo(){}jo.maximumRequests=50;jo.maximumRequestsPerServer=18;jo.requestsByServer={};jo.throttleRequests=!0;jo.debugShowStatistics=!1;jo.requestCompletedEvent=LN;Object.defineProperties(jo,{statistics:{get:function(){return io}},priorityHeapLength:{get:function(){return eC},set:function(e){if(ee;){let t=nc.pop();bx(t)}eC=e,nc.maximumLength=e,nc.reserve(e)}}});function s$(e){l(e.priorityFunction)&&(e.priority=e.priorityFunction())}jo.serverHasOpenSlots=function(e,t){t=y(t,1);let n=y(jo.requestsByServer[e],jo.maximumRequestsPerServer);return Zp[e]+t<=n};jo.heapHasOpenSlots=function(e){return nc.length+e<=eC};function a$(e){return e.state===ei.UNISSUED&&(e.state=ei.ISSUED,e.deferred=Ll()),e.deferred.promise}function XVe(e){return function(t){if(e.state===ei.CANCELLED)return;let n=e.deferred;--io.numberOfActiveRequests,--Zp[e.serverKey],LN.raiseEvent(),e.state=ei.RECEIVED,e.deferred=void 0,n.resolve(t)}}function WVe(e){return function(t){e.state!==ei.CANCELLED&&(++io.numberOfFailedRequests,--io.numberOfActiveRequests,--Zp[e.serverKey],LN.raiseEvent(t),e.state=ei.FAILED,e.deferred.reject(t))}}function c$(e){let t=a$(e);return e.state=ei.ACTIVE,cf.push(e),++io.numberOfActiveRequests,++io.numberOfActiveRequestsEver,++Zp[e.serverKey],e.requestFunction().then(XVe(e)).catch(WVe(e)),t}function bx(e){let t=e.state===ei.ACTIVE;if(e.state=ei.CANCELLED,++io.numberOfCancelledRequests,l(e.deferred)){let n=e.deferred;e.deferred=void 0,n.reject()}t&&(--io.numberOfActiveRequests,--Zp[e.serverKey],++io.numberOfCancelledActiveRequests),l(e.cancelFunction)&&e.cancelFunction()}jo.update=function(){let e,t,n=0,i=cf.length;for(e=0;e0&&(cf[e-n]=t)}cf.length-=n;let o=nc.internalArray,r=nc.length;for(e=0;e0;){if(t=nc.pop(),t.cancelled){bx(t);continue}if(t.throttleByServer&&!jo.serverHasOpenSlots(t.serverKey)){bx(t);continue}c$(t),++a}PVe()};jo.getServerKey=function(e){let t=new VN.default(e);t.scheme()===""&&(t=t.absoluteTo(IVe),t.normalize());let n=t.authority();/:/.test(n)||(n=`${n}:${t.scheme()==="https"?"443":"80"}`);let i=Zp[n];return l(i)||(Zp[n]=0),n};jo.request=function(e){if(Rp(e.url)||mx(e.url))return LN.raiseEvent(),e.state=ei.RECEIVED,e.requestFunction();if(++io.numberOfAttemptedRequests,l(e.serverKey)||(e.serverKey=jo.getServerKey(e.url)),jo.throttleRequests&&e.throttleByServer&&!jo.serverHasOpenSlots(e.serverKey))return;if(!jo.throttleRequests||!e.throttle)return c$(e);if(cf.length>=jo.maximumRequests)return;s$(e);let t=nc.insert(e);if(l(t)){if(t===e)return;bx(t)}return a$(e)};function PVe(){jo.debugShowStatistics&&(io.numberOfActiveRequests===0&&io.lastNumberOfActiveRequests>0&&(io.numberOfAttemptedRequests>0&&(console.log(`Number of attempted requests: ${io.numberOfAttemptedRequests}`),io.numberOfAttemptedRequests=0),io.numberOfCancelledRequests>0&&(console.log(`Number of cancelled requests: ${io.numberOfCancelledRequests}`),io.numberOfCancelledRequests=0),io.numberOfCancelledActiveRequests>0&&(console.log(`Number of cancelled active requests: ${io.numberOfCancelledActiveRequests}`),io.numberOfCancelledActiveRequests=0),io.numberOfFailedRequests>0&&(console.log(`Number of failed requests: ${io.numberOfFailedRequests}`),io.numberOfFailedRequests=0)),io.lastNumberOfActiveRequests=io.numberOfActiveRequests)}jo.clearForSpecs=function(){for(;nc.length>0;){let t=nc.pop();bx(t)}let e=cf.length;for(let t=0;t0}},credits:{get:function(){return this._credits}}});Xt.prototype.toString=function(){return this.getUrlComponent(!0,!0)};Xt.prototype.parseUrl=function(e,t,n,i){let o=new u$.default(e),r=wVe(o.query());this._queryParameters=t?ZN(r,this.queryParameters,n):r,o.search(""),o.fragment(""),l(i)&&o.scheme()===""&&(o=o.absoluteTo(rf(i))),this._url=o.toString()};function wVe(e){return e.length===0?{}:e.indexOf("=")===-1?{[e]:void 0}:md(e)}function ZN(e,t,n){if(!n)return Lt(e,t);let i=Oe(e,!0);for(let o in t)if(t.hasOwnProperty(o)){let r=i[o],s=t[o];l(r)?(Array.isArray(r)||(r=i[o]=[r]),i[o]=r.concat(s)):i[o]=Array.isArray(s)?s.slice():s}return i}Xt.prototype.getUrlComponent=function(e,t){if(this.isDataUri)return this._url;let n=this._url;e&&(n=`${n}${FVe(this.queryParameters)}`),n=n.replace(/%7B/g,"{").replace(/%7D/g,"}");let i=this._templateValues;return Object.keys(i).length>0&&(n=n.replace(/{(.*?)}/g,function(o,r){let s=i[r];return l(s)?encodeURIComponent(s):o})),t&&l(this.proxy)&&(n=this.proxy.getURL(n)),n};function FVe(e){let t=Object.keys(e);return t.length===0?"":t.length===1&&!l(e[t[0]])?`?${t[0]}`:`?${fx(e)}`}Xt.prototype.setQueryParameters=function(e,t){t?this._queryParameters=ZN(this._queryParameters,e,!1):this._queryParameters=ZN(e,this._queryParameters,!1)};Xt.prototype.appendQueryParameters=function(e){this._queryParameters=ZN(e,this._queryParameters,!0)};Xt.prototype.setTemplateValues=function(e,t){t?this._templateValues=Lt(this._templateValues,e):this._templateValues=Lt(e,this._templateValues)};Xt.prototype.getDerivedResource=function(e){let t=this.clone();if(t._retryCount=0,l(e.url)){let n=y(e.preserveQueryParameters,!1);t.parseUrl(e.url,!0,n,this._url)}return l(e.queryParameters)&&(t._queryParameters=Lt(e.queryParameters,t.queryParameters)),l(e.templateValues)&&(t._templateValues=Lt(e.templateValues,t.templateValues)),l(e.headers)&&(t.headers=Lt(e.headers,t.headers)),l(e.proxy)&&(t.proxy=e.proxy),l(e.request)&&(t.request=e.request),l(e.retryCallback)&&(t.retryCallback=e.retryCallback),l(e.retryAttempts)&&(t.retryAttempts=e.retryAttempts),t};Xt.prototype.retryOnError=function(e){let t=this.retryCallback;if(typeof t!="function"||this._retryCount>=this.retryAttempts)return Promise.resolve(!1);let n=this;return Promise.resolve(t(this,e)).then(function(i){return++n._retryCount,i})};Xt.prototype.clone=function(e){return l(e)?(e._url=this._url,e._queryParameters=Oe(this._queryParameters),e._templateValues=Oe(this._templateValues),e.headers=Oe(this.headers),e.proxy=this.proxy,e.retryCallback=this.retryCallback,e.retryAttempts=this.retryAttempts,e._retryCount=0,e.request=this.request.clone(),e):new Xt({url:this._url,queryParameters:this.queryParameters,templateValues:this.templateValues,headers:this.headers,proxy:this.proxy,retryCallback:this.retryCallback,retryAttempts:this.retryAttempts,request:this.request.clone(),parseUrl:!1,credits:l(this.credits)?this.credits.slice():void 0})};Xt.prototype.getBaseUri=function(e){return lR(this.getUrlComponent(e),e)};Xt.prototype.appendForwardSlash=function(){this._url=cR(this._url)};Xt.prototype.fetchArrayBuffer=function(){return this.fetch({responseType:"arraybuffer"})};Xt.fetchArrayBuffer=function(e){return new Xt(e).fetchArrayBuffer()};Xt.prototype.fetchBlob=function(){return this.fetch({responseType:"blob"})};Xt.fetchBlob=function(e){return new Xt(e).fetchBlob()};Xt.prototype.fetchImage=function(e){e=y(e,y.EMPTY_OBJECT);let t=y(e.preferImageBitmap,!1),n=y(e.preferBlob,!1),i=y(e.flipY,!1),o=y(e.skipColorSpaceConversion,!1);if(fO(this.request),!m$||this.isDataUri||this.isBlobUri||!this.hasHeaders&&!n)return hO({resource:this,flipY:i,skipColorSpaceConversion:o,preferImageBitmap:t});let r=this.fetchBlob();if(!l(r))return;let s,a,c,d;return Xt.supportsImageBitmapOptions().then(function(u){return s=u,a=s&&t,r}).then(function(u){if(!l(u))return;if(d=u,a)return Xt.createImageBitmapFromBlob(u,{flipY:i,premultiplyAlpha:!1,skipColorSpaceConversion:o});let h=window.URL.createObjectURL(u);return c=new Xt({url:h}),hO({resource:c,flipY:i,skipColorSpaceConversion:o,preferImageBitmap:!1})}).then(function(u){if(l(u))return u.blob=d,a||window.URL.revokeObjectURL(c.url),u}).catch(function(u){return l(c)&&window.URL.revokeObjectURL(c.url),u.blob=d,Promise.reject(u)})};function hO(e){let t=e.resource,n=e.flipY,i=e.skipColorSpaceConversion,o=e.preferImageBitmap,r=t.request;r.url=t.url,r.requestFunction=function(){let a=!1;!t.isDataUri&&!t.isBlobUri&&(a=t.isCrossOriginUrl);let c=Ll();return Xt._Implementations.createImage(r,a,c,n,i,o),c.promise};let s=ic.request(r);if(l(s))return s.catch(function(a){return r.state!==ei.FAILED?Promise.reject(a):t.retryOnError(a).then(function(c){return c?(r.state=ei.UNISSUED,r.deferred=void 0,hO({resource:t,flipY:n,skipColorSpaceConversion:i,preferImageBitmap:o})):Promise.reject(a)})})}Xt.fetchImage=function(e){return new Xt(e).fetchImage({flipY:e.flipY,skipColorSpaceConversion:e.skipColorSpaceConversion,preferBlob:e.preferBlob,preferImageBitmap:e.preferImageBitmap})};Xt.prototype.fetchText=function(){return this.fetch({responseType:"text"})};Xt.fetchText=function(e){return new Xt(e).fetchText()};Xt.prototype.fetchJson=function(){let e=this.fetch({responseType:"text",headers:{Accept:"application/json,*/*;q=0.01"}});if(l(e))return e.then(function(t){if(l(t))return JSON.parse(t)})};Xt.fetchJson=function(e){return new Xt(e).fetchJson()};Xt.prototype.fetchXML=function(){return this.fetch({responseType:"document",overrideMimeType:"text/xml"})};Xt.fetchXML=function(e){return new Xt(e).fetchXML()};Xt.prototype.fetchJsonp=function(e){e=y(e,"callback"),fO(this.request);let t;do t=`loadJsonp${W.nextRandomNumber().toString().substring(2,8)}`;while(l(window[t]));return h$(this,e,t)};function h$(e,t,n){let i={};i[t]=n,e.setQueryParameters(i);let o=e.request,r=e.url;o.url=r,o.requestFunction=function(){let a=Ll();return window[n]=function(c){a.resolve(c);try{delete window[n]}catch{window[n]=void 0}},Xt._Implementations.loadAndExecuteScript(r,n,a),a.promise};let s=ic.request(o);if(l(s))return s.catch(function(a){return o.state!==ei.FAILED?Promise.reject(a):e.retryOnError(a).then(function(c){return c?(o.state=ei.UNISSUED,o.deferred=void 0,h$(e,t,n)):Promise.reject(a)})})}Xt.fetchJsonp=function(e){return new Xt(e).fetchJsonp(e.callbackParameterName)};Xt.prototype._makeRequest=function(e){let t=this;fO(t.request);let n=t.request,i=t.url;n.url=i,n.requestFunction=function(){let r=e.responseType,s=Lt(e.headers,t.headers),a=e.overrideMimeType,c=e.method,d=e.data,u=Ll(),h=Xt._Implementations.loadWithXhr(i,r,c,d,s,u,a);return l(h)&&l(h.abort)&&(n.cancelFunction=function(){h.abort()}),u.promise};let o=ic.request(n);if(l(o))return o.then(function(r){return n.cancelFunction=void 0,r}).catch(function(r){return n.cancelFunction=void 0,n.state!==ei.FAILED?Promise.reject(r):t.retryOnError(r).then(function(s){return s?(n.state=ei.UNISSUED,n.deferred=void 0,t.fetch(e)):Promise.reject(r)})})};function fO(e){if(e.state===ei.ISSUED||e.state===ei.ACTIVE)throw new ce("The Resource is already being fetched.");e.state=ei.UNISSUED,e.deferred=void 0}var AVe=/^data:(.*?)(;base64)?,(.*)$/;function RN(e,t){let n=decodeURIComponent(t);return e?atob(n):n}function d$(e,t){let n=RN(e,t),i=new ArrayBuffer(n.length),o=new Uint8Array(i);for(let r=0;r{if(!a.ok){let c={};a.headers.forEach((d,u)=>{c[u]=d}),r.reject(new af(a.status,a,c));return}switch(t){case"text":r.resolve(a.text());break;case"json":r.resolve(a.json());break;default:r.resolve(new Uint8Array(await a.arrayBuffer()).buffer);break}}).catch(()=>{r.reject(new af)})}var kVe=typeof XMLHttpRequest>"u";Xt._Implementations.loadWithXhr=function(e,t,n,i,o,r,s){let a=AVe.exec(e);if(a!==null){r.resolve(MVe(a,t));return}if(kVe){NVe(e,t,n,i,o,r,s);return}let c=new XMLHttpRequest;if(nC.contains(e)&&(c.withCredentials=!0),c.open(n,e,!0),l(s)&&l(c.overrideMimeType)&&c.overrideMimeType(s),l(o))for(let u in o)o.hasOwnProperty(u)&&c.setRequestHeader(u,o[u]);l(t)&&(c.responseType=t);let d=!1;return typeof e=="string"&&(d=e.indexOf("file://")===0||typeof window<"u"&&window.location.origin==="file://"),c.onload=function(){if((c.status<200||c.status>=300)&&!(d&&c.status===0)){r.reject(new af(c.status,c.response,c.getAllResponseHeaders()));return}let u=c.response,h=c.responseType;if(n==="HEAD"||n==="OPTIONS"){let g=c.getAllResponseHeaders().trim().split(/[\r\n]+/),f={};g.forEach(function(x){let _=x.split(": "),C=_.shift();f[C]=_.join(": ")}),r.resolve(f);return}if(c.status===204)r.resolve(void 0);else if(l(u)&&(!l(t)||h===t))r.resolve(u);else if(t==="json"&&typeof u=="string")try{r.resolve(JSON.parse(u))}catch(p){r.reject(p)}else(h===""||h==="document")&&l(c.responseXML)&&c.responseXML.hasChildNodes()?r.resolve(c.responseXML):(h===""||h==="text")&&l(c.responseText)?r.resolve(c.responseText):r.reject(new ce("Invalid XMLHttpRequest response type."))},c.onerror=function(u){r.reject(new af)},c.send(i),c};Xt._Implementations.loadAndExecuteScript=function(e,t,n){return hx(e,t).catch(function(i){n.reject(i)})};Xt._DefaultImplementations={};Xt._DefaultImplementations.createImage=Xt._Implementations.createImage;Xt._DefaultImplementations.loadWithXhr=Xt._Implementations.loadWithXhr;Xt._DefaultImplementations.loadAndExecuteScript=Xt._Implementations.loadAndExecuteScript;Xt.DEFAULT=Object.freeze(new Xt({url:typeof document>"u"?"":document.location.href.split("?")[0]}));var Re=Xt;function pR(e){e=y(e,y.EMPTY_OBJECT),this._dates=void 0,this._samples=void 0,this._dateColumn=-1,this._xPoleWanderRadiansColumn=-1,this._yPoleWanderRadiansColumn=-1,this._ut1MinusUtcSecondsColumn=-1,this._xCelestialPoleOffsetRadiansColumn=-1,this._yCelestialPoleOffsetRadiansColumn=-1,this._taiMinusUtcSecondsColumn=-1,this._columnCount=0,this._lastIndex=-1,this._addNewLeapSeconds=y(e.addNewLeapSeconds,!0),l(e.data)?f$(this,e.data):f$(this,{columnNames:["dateIso8601","modifiedJulianDateUtc","xPoleWanderRadians","yPoleWanderRadians","ut1MinusUtcSeconds","lengthOfDayCorrectionSeconds","xCelestialPoleOffsetRadians","yCelestialPoleOffsetRadians","taiMinusUtcSeconds"],samples:[]})}pR.fromUrl=async function(e,t){t=y(t,y.EMPTY_OBJECT);let n=Re.createIfNeeded(e),i;try{i=await n.fetchJson()}catch{throw new ce(`An error occurred while retrieving the EOP data from the URL ${n.url}.`)}return new pR({addNewLeapSeconds:t.addNewLeapSeconds,data:i})};pR.NONE=Object.freeze({compute:function(e,t){return l(t)?(t.xPoleWander=0,t.yPoleWander=0,t.xPoleOffset=0,t.yPoleOffset=0,t.ut1MinusUtc=0):t=new U0(0,0,0,0,0),t}});pR.prototype.compute=function(e,t){if(!l(this._samples))return;if(l(t)||(t=new U0(0,0,0,0,0)),this._samples.length===0)return t.xPoleWander=0,t.yPoleWander=0,t.xPoleOffset=0,t.yPoleOffset=0,t.ut1MinusUtc=0,t;let n=this._dates,i=this._lastIndex,o=0,r=0;if(l(i)){let a=n[i],c=n[i+1],d=q.lessThanOrEquals(a,e),u=!l(c),h=u||q.greaterThanOrEquals(c,e);if(d&&h)return o=i,!u&&c.equals(e)&&++o,r=o+1,b$(this,n,this._samples,e,o,r,t),t}let s=Po(n,e,q.compare,this._dateColumn);return s>=0?(st.length-1)return s.xPoleWander=0,s.yPoleWander=0,s.xPoleOffset=0,s.yPoleOffset=0,s.ut1MinusUtc=0,s;let c=t[o],d=t[r];if(c.equals(d)||i.equals(c))return p$(e,n,o,a,s),s;if(i.equals(d))return p$(e,n,r,a,s),s;let u=q.secondsDifference(i,c)/q.secondsDifference(d,c),h=o*a,p=r*a,g=n[h+e._ut1MinusUtcSecondsColumn],f=n[p+e._ut1MinusUtcSecondsColumn],x=f-g;if(x>.5||x<-.5){let _=n[h+e._taiMinusUtcSecondsColumn],C=n[p+e._taiMinusUtcSecondsColumn];_!==C&&(d.equals(i)?g=f:f-=C-_)}return s.xPoleWander=fR(u,n[h+e._xPoleWanderRadiansColumn],n[p+e._xPoleWanderRadiansColumn]),s.yPoleWander=fR(u,n[h+e._yPoleWanderRadiansColumn],n[p+e._yPoleWanderRadiansColumn]),s.xPoleOffset=fR(u,n[h+e._xCelestialPoleOffsetRadiansColumn],n[p+e._xCelestialPoleOffsetRadiansColumn]),s.yPoleOffset=fR(u,n[h+e._yCelestialPoleOffsetRadiansColumn],n[p+e._yCelestialPoleOffsetRadiansColumn]),s.ut1MinusUtc=fR(u,g,f),s}var bR=pR;var sEt=T(S(),1);function oc(e,t,n){this.heading=y(e,0),this.pitch=y(t,0),this.roll=y(n,0)}oc.fromQuaternion=function(e,t){l(t)||(t=new oc);let n=2*(e.w*e.y-e.z*e.x),i=1-2*(e.x*e.x+e.y*e.y),o=2*(e.w*e.x+e.y*e.z),r=1-2*(e.y*e.y+e.z*e.z),s=2*(e.w*e.z+e.x*e.y);return t.heading=-Math.atan2(s,r),t.roll=Math.atan2(o,i),t.pitch=-W.asinClamped(n),t};oc.fromDegrees=function(e,t,n,i){return l(i)||(i=new oc),i.heading=e*W.RADIANS_PER_DEGREE,i.pitch=t*W.RADIANS_PER_DEGREE,i.roll=n*W.RADIANS_PER_DEGREE,i};oc.clone=function(e,t){if(l(e))return l(t)?(t.heading=e.heading,t.pitch=e.pitch,t.roll=e.roll,t):new oc(e.heading,e.pitch,e.roll)};oc.equals=function(e,t){return e===t||l(e)&&l(t)&&e.heading===t.heading&&e.pitch===t.pitch&&e.roll===t.roll};oc.equalsEpsilon=function(e,t,n,i){return e===t||l(e)&&l(t)&&W.equalsEpsilon(e.heading,t.heading,n,i)&&W.equalsEpsilon(e.pitch,t.pitch,n,i)&&W.equalsEpsilon(e.roll,t.roll,n,i)};oc.prototype.clone=function(e){return oc.clone(this,e)};oc.prototype.equals=function(e){return oc.equals(this,e)};oc.prototype.equalsEpsilon=function(e,t,n){return oc.equalsEpsilon(this,e,t,n)};oc.prototype.toString=function(){return`(${this.heading}, ${this.pitch}, ${this.roll})`};var Xa=oc;var CEt=T(S(),1);var uEt=T(S(),1);var IN={};var g$=/((?:.*\/)|^)Cesium\.js(?:\?|\#|$)/;function DVe(){let e=document.getElementsByTagName("script");for(let t=0,n=e.length;t"u"?e:(l(GN)||(GN=document.createElement("a")),GN.href=e,GN.href)}var gx;function x$(){if(l(gx))return gx;let e;return typeof CESIUM_BASE_URL<"u"?e=CESIUM_BASE_URL:l(IN==null?void 0:IN.url)?e=rf(".",IN.url):typeof define=="object"&&l(define.amd)&&!define.amd.toUrlUndefined&&l(dN.toUrl)?e=rf("..",yx("Core/buildModuleUrl.js")):e=DVe(),gx=new Re({url:y$(e)}),gx.appendForwardSlash(),gx}function BVe(e){return y$(dN.toUrl(`../${e}`))}function _$(e){return x$().getDerivedResource({url:e}).url}var EN;function yx(e){return l(EN)||(typeof define=="object"&&l(define.amd)&&!define.amd.toUrlUndefined&&l(dN.toUrl)?EN=BVe:EN=_$),EN(e)}yx._cesiumScriptRegex=g$;yx._buildModuleUrlFromBaseUrl=_$;yx._clearBaseResource=function(){gx=void 0};yx.setBaseUrl=function(e){gx=Re.DEFAULT.getDerivedResource({url:e})};yx.getCesiumBaseUrl=x$;var on=yx;var fEt=T(S(),1);function OVe(e,t,n){this.x=e,this.y=t,this.s=n}var xx=OVe;function gO(e){e=y(e,y.EMPTY_OBJECT),this._xysFileUrlTemplate=Re.createIfNeeded(e.xysFileUrlTemplate),this._interpolationOrder=y(e.interpolationOrder,9),this._sampleZeroJulianEphemerisDate=y(e.sampleZeroJulianEphemerisDate,24423965e-1),this._sampleZeroDateTT=new q(this._sampleZeroJulianEphemerisDate,0,Kn.TAI),this._stepSizeDays=y(e.stepSizeDays,1),this._samplesPerXysFile=y(e.samplesPerXysFile,1e3),this._totalSamples=y(e.totalSamples,27426),this._samples=new Array(this._totalSamples*3),this._chunkDownloadsInProgress=[];let t=this._interpolationOrder,n=this._denominators=new Array(t+1),i=this._xTable=new Array(t+1),o=Math.pow(this._stepSizeDays,t);for(let r=0;r<=t;++r){n[r]=o,i[r]=r*this._stepSizeDays;for(let s=0;s<=t;++s)s!==r&&(n[r]*=r-s);n[r]=1/n[r]}this._work=new Array(t+1),this._coef=new Array(t+1)}var YVe=new q(0,0,Kn.TAI);function pO(e,t,n){let i=YVe;return i.dayNumber=t,i.secondsOfDay=n,q.daysDifference(i,e._sampleZeroDateTT)}gO.prototype.preload=function(e,t,n,i){let o=pO(this,e,t),r=pO(this,n,i),s=o/this._stepSizeDays-this._interpolationOrder/2|0;s<0&&(s=0);let a=r/this._stepSizeDays-this._interpolationOrder/2|0+this._interpolationOrder;a>=this._totalSamples&&(a=this._totalSamples-1);let c=s/this._samplesPerXysFile|0,d=a/this._samplesPerXysFile|0,u=[];for(let h=c;h<=d;++h)u.push(bO(this,h));return Promise.all(u)};gO.prototype.computeXysRadians=function(e,t,n){let i=pO(this,e,t);if(i<0)return;let o=i/this._stepSizeDays|0;if(o>=this._totalSamples)return;let r=this._interpolationOrder,s=o-(r/2|0);s<0&&(s=0);let a=s+r;a>=this._totalSamples&&(a=this._totalSamples-1,s=a-r,s<0&&(s=0));let c=!1,d=this._samples;if(l(d[s*3])||(bO(this,s/this._samplesPerXysFile|0),c=!0),l(d[a*3])||(bO(this,a/this._samplesPerXysFile|0),c=!0),c)return;l(n)?(n.x=0,n.y=0,n.s=0):n=new xx(0,0,0);let u=i-s*this._stepSizeDays,h=this._work,p=this._denominators,g=this._coef,f=this._xTable,x,_;for(x=0;x<=r;++x)h[x]=u-f[x];for(x=0;x<=r;++x){for(g[x]=1,_=0;_<=r;++_)_!==x&&(g[x]*=h[_]);g[x]*=p[x];let C=(s+x)*3;n.x+=g[x]*d[C++],n.y+=g[x]*d[C++],n.s+=g[x]*d[C]}return n};function bO(e,t){if(e._chunkDownloadsInProgress[t])return e._chunkDownloadsInProgress[t];let n,i=e._xysFileUrlTemplate;l(i)?n=i.getDerivedResource({templateValues:{0:t}}):n=new Re({url:on(`Assets/IAU2006_XYS/IAU2006_XYS_${t}.json`)});let o=n.fetchJson().then(function(r){e._chunkDownloadsInProgress[t]=!1;let s=e._samples,a=r.samples,c=t*e._samplesPerXysFile*3;for(let d=0,u=a.length;di&&(o=d,i=u)}let r=1,s=0,a=xO[o],c=_O[o];if(Math.abs(e[nt.getElementIndex(c,a)])>n){let d=e[nt.getElementIndex(c,c)],u=e[nt.getElementIndex(a,a)],h=e[nt.getElementIndex(c,a)],p=(d-u)/2/h,g;p<0?g=-1/(-p+Math.sqrt(1+p*p)):g=1/(p+Math.sqrt(1+p*p)),r=1/Math.sqrt(1+g*g),s=g*r}return t=nt.clone(nt.IDENTITY,t),t[nt.getElementIndex(a,a)]=t[nt.getElementIndex(c,c)]=r,t[nt.getElementIndex(c,a)]=s,t[nt.getElementIndex(a,c)]=-s,t}var XN=new nt,S$=new nt;nt.computeEigenDecomposition=function(e,t){let n=W.EPSILON20,i=10,o=0,r=0;l(t)||(t={});let s=t.unitary=nt.clone(nt.IDENTITY,t.unitary),a=t.diagonal=nt.clone(e,t.diagonal),c=n*QVe(a);for(;rc;)qVe(a,XN),nt.transpose(XN,S$),nt.multiply(a,XN,a),nt.multiply(S$,a,a),nt.multiply(s,XN,s),++o>2&&(++r,o=0);return t};nt.abs=function(e,t){return t[0]=Math.abs(e[0]),t[1]=Math.abs(e[1]),t[2]=Math.abs(e[2]),t[3]=Math.abs(e[3]),t[4]=Math.abs(e[4]),t[5]=Math.abs(e[5]),t[6]=Math.abs(e[6]),t[7]=Math.abs(e[7]),t[8]=Math.abs(e[8]),t};nt.determinant=function(e){let t=e[0],n=e[3],i=e[6],o=e[1],r=e[4],s=e[7],a=e[2],c=e[5],d=e[8];return t*(r*d-c*s)+o*(c*i-n*d)+a*(n*s-r*i)};nt.inverse=function(e,t){let n=e[0],i=e[1],o=e[2],r=e[3],s=e[4],a=e[5],c=e[6],d=e[7],u=e[8],h=nt.determinant(e);t[0]=s*u-d*a,t[1]=d*o-i*u,t[2]=i*a-s*o,t[3]=c*a-r*u,t[4]=n*u-c*o,t[5]=r*o-n*a,t[6]=r*d-c*s,t[7]=c*i-n*d,t[8]=n*s-r*i;let p=1/h;return nt.multiplyByScalar(t,p,t)};var $Ve=new nt;nt.inverseTranspose=function(e,t){return nt.inverse(nt.transpose(e,$Ve),t)};nt.equals=function(e,t){return e===t||l(e)&&l(t)&&e[0]===t[0]&&e[1]===t[1]&&e[2]===t[2]&&e[3]===t[3]&&e[4]===t[4]&&e[5]===t[5]&&e[6]===t[6]&&e[7]===t[7]&&e[8]===t[8]};nt.equalsEpsilon=function(e,t,n){return n=y(n,0),e===t||l(e)&&l(t)&&Math.abs(e[0]-t[0])<=n&&Math.abs(e[1]-t[1])<=n&&Math.abs(e[2]-t[2])<=n&&Math.abs(e[3]-t[3])<=n&&Math.abs(e[4]-t[4])<=n&&Math.abs(e[5]-t[5])<=n&&Math.abs(e[6]-t[6])<=n&&Math.abs(e[7]-t[7])<=n&&Math.abs(e[8]-t[8])<=n};nt.IDENTITY=Object.freeze(new nt(1,0,0,0,1,0,0,0,1));nt.ZERO=Object.freeze(new nt(0,0,0,0,0,0,0,0,0));nt.COLUMN0ROW0=0;nt.COLUMN0ROW1=1;nt.COLUMN0ROW2=2;nt.COLUMN1ROW0=3;nt.COLUMN1ROW1=4;nt.COLUMN1ROW2=5;nt.COLUMN2ROW0=6;nt.COLUMN2ROW1=7;nt.COLUMN2ROW2=8;Object.defineProperties(nt.prototype,{length:{get:function(){return nt.packedLength}}});nt.prototype.clone=function(e){return nt.clone(this,e)};nt.prototype.equals=function(e){return nt.equals(this,e)};nt.equalsArray=function(e,t,n){return e[0]===t[n]&&e[1]===t[n+1]&&e[2]===t[n+2]&&e[3]===t[n+3]&&e[4]===t[n+4]&&e[5]===t[n+5]&&e[6]===t[n+6]&&e[7]===t[n+7]&&e[8]===t[n+8]};nt.prototype.equalsEpsilon=function(e,t){return nt.equalsEpsilon(this,e,t)};nt.prototype.toString=function(){return`(${this[0]}, ${this[3]}, ${this[6]}) (${this[1]}, ${this[4]}, ${this[7]}) (${this[2]}, ${this[5]}, ${this[8]})`};var $=nt;var MEt=T(S(),1);function tt(e,t,n,i,o,r,s,a,c,d,u,h,p,g,f,x){this[0]=y(e,0),this[1]=y(o,0),this[2]=y(c,0),this[3]=y(p,0),this[4]=y(t,0),this[5]=y(r,0),this[6]=y(d,0),this[7]=y(g,0),this[8]=y(n,0),this[9]=y(s,0),this[10]=y(u,0),this[11]=y(f,0),this[12]=y(i,0),this[13]=y(a,0),this[14]=y(h,0),this[15]=y(x,0)}tt.packedLength=16;tt.pack=function(e,t,n){return n=y(n,0),t[n++]=e[0],t[n++]=e[1],t[n++]=e[2],t[n++]=e[3],t[n++]=e[4],t[n++]=e[5],t[n++]=e[6],t[n++]=e[7],t[n++]=e[8],t[n++]=e[9],t[n++]=e[10],t[n++]=e[11],t[n++]=e[12],t[n++]=e[13],t[n++]=e[14],t[n]=e[15],t};tt.unpack=function(e,t,n){return t=y(t,0),l(n)||(n=new tt),n[0]=e[t++],n[1]=e[t++],n[2]=e[t++],n[3]=e[t++],n[4]=e[t++],n[5]=e[t++],n[6]=e[t++],n[7]=e[t++],n[8]=e[t++],n[9]=e[t++],n[10]=e[t++],n[11]=e[t++],n[12]=e[t++],n[13]=e[t++],n[14]=e[t++],n[15]=e[t],n};tt.packArray=function(e,t){let n=e.length,i=n*16;l(t)?!Array.isArray(t)&&t.length!==i||t.length!==i&&(t.length=i):t=new Array(i);for(let o=0;o{let t=new Image;t.onload=function(){Fc._result=t.width>0&&t.height>0,e(Fc._result)},t.onerror=function(){Fc._result=!1,e(Fc._result)},t.src="data:image/webp;base64,UklGRiIAAABXRUJQVlA4IBYAAAAwAQCdASoBAAEADsD+JaQAA3AAAAAA"})),Fc._promise};Object.defineProperties(Fc,{initialized:{get:function(){return l(Fc._result)}}});var sC=[];typeof ArrayBuffer<"u"&&(sC.push(Int8Array,Uint8Array,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array),typeof Uint8ClampedArray<"u"&&sC.push(Uint8ClampedArray),typeof Uint8ClampedArray<"u"&&sC.push(Uint8ClampedArray),typeof BigInt64Array<"u"&&sC.push(BigInt64Array),typeof BigUint64Array<"u"&&sC.push(BigUint64Array));var yu={isChrome:ZO,chromeVersion:lLe,isSafari:R$,safariVersion:dLe,isWebkit:Z$,webkitVersion:uLe,isInternetExplorer:G$,internetExplorerVersion:mLe,isEdge:MN,edgeVersion:hLe,isFirefox:NN,firefoxVersion:bLe,isWindows:fLe,isIPadOrIOS:pLe,hardwareConcurrency:y(rc.hardwareConcurrency,3),supportsPointerEvents:gLe,supportsImageRenderingPixelated:X$,supportsWebP:Fc,imageRenderingValue:yLe,typedArrayTypes:sC};yu.supportsBasis=function(e){return yu.supportsWebAssembly()&&e.context.supportsBasis};yu.supportsFullscreen=function(){return xr.supportsFullscreen()};yu.supportsTypedArrays=function(){return typeof ArrayBuffer<"u"};yu.supportsBigInt64Array=function(){return typeof BigInt64Array<"u"};yu.supportsBigUint64Array=function(){return typeof BigUint64Array<"u"};yu.supportsBigInt=function(){return typeof BigInt<"u"};yu.supportsWebWorkers=function(){return typeof Worker<"u"};yu.supportsWebAssembly=function(){return typeof WebAssembly<"u"};yu.supportsWebgl2=function(e){return e.context.webgl2};yu.supportsEsmWebWorkers=function(){return!NN()||parseInt(GO)>=114};var Ot=yu;function rt(e,t,n,i){this.x=y(e,0),this.y=y(t,0),this.z=y(n,0),this.w=y(i,0)}var _R=new m;rt.fromAxisAngle=function(e,t,n){let i=t/2,o=Math.sin(i);_R=m.normalize(e,_R);let r=_R.x*o,s=_R.y*o,a=_R.z*o,c=Math.cos(i);return l(n)?(n.x=r,n.y=s,n.z=a,n.w=c,n):new rt(r,s,a,c)};var xLe=[1,2,0],_Le=new Array(3);rt.fromRotationMatrix=function(e,t){let n,i,o,r,s,a=e[$.COLUMN0ROW0],c=e[$.COLUMN1ROW1],d=e[$.COLUMN2ROW2],u=a+c+d;if(u>0)n=Math.sqrt(u+1),s=.5*n,n=.5/n,i=(e[$.COLUMN1ROW2]-e[$.COLUMN2ROW1])*n,o=(e[$.COLUMN2ROW0]-e[$.COLUMN0ROW2])*n,r=(e[$.COLUMN0ROW1]-e[$.COLUMN1ROW0])*n;else{let h=xLe,p=0;c>a&&(p=1),d>a&&d>c&&(p=2);let g=h[p],f=h[g];n=Math.sqrt(e[$.getElementIndex(p,p)]-e[$.getElementIndex(g,g)]-e[$.getElementIndex(f,f)]+1);let x=_Le;x[p]=.5*n,n=.5/n,s=(e[$.getElementIndex(f,g)]-e[$.getElementIndex(g,f)])*n,x[g]=(e[$.getElementIndex(g,p)]+e[$.getElementIndex(p,g)])*n,x[f]=(e[$.getElementIndex(f,p)]+e[$.getElementIndex(p,f)])*n,i=-x[0],o=-x[1],r=-x[2]}return l(t)?(t.x=i,t.y=o,t.z=r,t.w=s,t):new rt(i,o,r,s)};var W$=new rt,P$=new rt,EO=new rt,v$=new rt;rt.fromHeadingPitchRoll=function(e,t){return v$=rt.fromAxisAngle(m.UNIT_X,e.roll,W$),EO=rt.fromAxisAngle(m.UNIT_Y,-e.pitch,t),t=rt.multiply(EO,v$,EO),P$=rt.fromAxisAngle(m.UNIT_Z,-e.heading,W$),rt.multiply(P$,t,t)};var kN=new m,IO=new m,Xm=new rt,w$=new rt,UN=new rt;rt.packedLength=4;rt.pack=function(e,t,n){return n=y(n,0),t[n++]=e.x,t[n++]=e.y,t[n++]=e.z,t[n]=e.w,t};rt.unpack=function(e,t,n){return t=y(t,0),l(n)||(n=new rt),n.x=e[t],n.y=e[t+1],n.z=e[t+2],n.w=e[t+3],n};rt.packedInterpolationLength=3;rt.convertPackedArrayForInterpolation=function(e,t,n,i){rt.unpack(e,n*4,UN),rt.conjugate(UN,UN);for(let o=0,r=n-t+1;o=0?r=1:(r=-1,o=-o);let s=o-1,a=1-n,c=n*n,d=a*a;for(let g=7;g>=0;--g)Gp[g]=(DN[g]*c-BN[g])*s,Ep[g]=(DN[g]*d-BN[g])*s;let u=r*n*(1+Gp[0]*(1+Gp[1]*(1+Gp[2]*(1+Gp[3]*(1+Gp[4]*(1+Gp[5]*(1+Gp[6]*(1+Gp[7])))))))),h=a*(1+Ep[0]*(1+Ep[1]*(1+Ep[2]*(1+Ep[3]*(1+Ep[4]*(1+Ep[5]*(1+Ep[6]*(1+Ep[7])))))))),p=rt.multiplyByScalar(e,h,CLe);return rt.multiplyByScalar(t,u,i),rt.add(p,i,i)};rt.fastSquad=function(e,t,n,i,o,r){let s=rt.fastSlerp(e,t,o,TR),a=rt.fastSlerp(n,i,o,aC);return rt.fastSlerp(s,a,2*o*(1-o),r)};rt.equals=function(e,t){return e===t||l(e)&&l(t)&&e.x===t.x&&e.y===t.y&&e.z===t.z&&e.w===t.w};rt.equalsEpsilon=function(e,t,n){return n=y(n,0),e===t||l(e)&&l(t)&&Math.abs(e.x-t.x)<=n&&Math.abs(e.y-t.y)<=n&&Math.abs(e.z-t.z)<=n&&Math.abs(e.w-t.w)<=n};rt.ZERO=Object.freeze(new rt(0,0,0,0));rt.IDENTITY=Object.freeze(new rt(0,0,0,1));rt.prototype.clone=function(e){return rt.clone(this,e)};rt.prototype.equals=function(e){return rt.equals(this,e)};rt.prototype.equalsEpsilon=function(e,t){return rt.equalsEpsilon(this,e,t)};rt.prototype.toString=function(){return`(${this.x}, ${this.y}, ${this.z}, ${this.w})`};var Fe=rt;var hi={},vO={up:{south:"east",north:"west",west:"south",east:"north"},down:{south:"west",north:"east",west:"north",east:"south"},south:{up:"west",down:"east",west:"down",east:"up"},north:{up:"east",down:"west",west:"up",east:"down"},west:{up:"north",down:"south",north:"down",south:"up"},east:{up:"south",down:"north",north:"up",south:"down"}},cC={north:[-1,0,0],east:[0,1,0],up:[0,0,1],south:[1,0,0],west:[0,-1,0],down:[0,0,-1]},wO={},Zl={east:new m,north:new m,up:new m,west:new m,south:new m,down:new m},Y0=new m,H0=new m,z0=new m;hi.localFrameToFixedFrameGenerator=function(e,t){if(!vO.hasOwnProperty(e)||!vO[e].hasOwnProperty(t))throw new fe("firstAxis and secondAxis must be east, north, up, west, south or down.");let n=vO[e][t],i,o=e+t;return l(wO[o])?i=wO[o]:(i=function(r,s,a){if(l(a)||(a=new M),m.equalsEpsilon(r,m.ZERO,W.EPSILON14))m.unpack(cC[e],0,Y0),m.unpack(cC[t],0,H0),m.unpack(cC[n],0,z0);else if(W.equalsEpsilon(r.x,0,W.EPSILON14)&&W.equalsEpsilon(r.y,0,W.EPSILON14)){let c=W.sign(r.z);m.unpack(cC[e],0,Y0),e!=="east"&&e!=="west"&&m.multiplyByScalar(Y0,c,Y0),m.unpack(cC[t],0,H0),t!=="east"&&t!=="west"&&m.multiplyByScalar(H0,c,H0),m.unpack(cC[n],0,z0),n!=="east"&&n!=="west"&&m.multiplyByScalar(z0,c,z0)}else{s=y(s,ne.default),s.geodeticSurfaceNormal(r,Zl.up);let c=Zl.up,d=Zl.east;d.x=-r.y,d.y=r.x,d.z=0,m.normalize(d,Zl.east),m.cross(c,d,Zl.north),m.multiplyByScalar(Zl.up,-1,Zl.down),m.multiplyByScalar(Zl.east,-1,Zl.west),m.multiplyByScalar(Zl.north,-1,Zl.south),Y0=Zl[e],H0=Zl[t],z0=Zl[n]}return a[0]=Y0.x,a[1]=Y0.y,a[2]=Y0.z,a[3]=0,a[4]=H0.x,a[5]=H0.y,a[6]=H0.z,a[7]=0,a[8]=z0.x,a[9]=z0.y,a[10]=z0.z,a[11]=0,a[12]=r.x,a[13]=r.y,a[14]=r.z,a[15]=1,a},wO[o]=i),i};hi.eastNorthUpToFixedFrame=hi.localFrameToFixedFrameGenerator("east","north");hi.northEastDownToFixedFrame=hi.localFrameToFixedFrameGenerator("north","east");hi.northUpEastToFixedFrame=hi.localFrameToFixedFrameGenerator("north","up");hi.northWestUpToFixedFrame=hi.localFrameToFixedFrameGenerator("north","west");var VLe=new Fe,LLe=new m(1,1,1),RLe=new M;hi.headingPitchRollToFixedFrame=function(e,t,n,i,o){i=y(i,hi.eastNorthUpToFixedFrame);let r=Fe.fromHeadingPitchRoll(t,VLe),s=M.fromTranslationQuaternionRotationScale(m.ZERO,r,LLe,RLe);return o=i(e,n,o),M.multiply(o,s,o)};var ZLe=new M,GLe=new $;hi.headingPitchRollQuaternion=function(e,t,n,i,o){let r=hi.headingPitchRollToFixedFrame(e,t,n,i,ZLe),s=M.getMatrix3(r,GLe);return Fe.fromRotationMatrix(s,o)};var ELe=new m(1,1,1),ILe=new m,M$=new M,XLe=new M,WLe=new $,PLe=new Fe;hi.fixedFrameToHeadingPitchRoll=function(e,t,n,i){t=y(t,ne.default),n=y(n,hi.eastNorthUpToFixedFrame),l(i)||(i=new Xa);let o=M.getTranslation(e,ILe);if(m.equals(o,m.ZERO))return i.heading=0,i.pitch=0,i.roll=0,i;let r=M.inverseTransformation(n(o,t,M$),M$),s=M.setScale(e,ELe,XLe);s=M.setTranslation(s,m.ZERO,s),r=M.multiply(r,s,r);let a=Fe.fromRotationMatrix(M.getMatrix3(r,WLe),PLe);return a=Fe.normalize(a,a),Xa.fromQuaternion(a,i)};var vLe=6*3600+41*60+50.54841,wLe=8640184812866e-6,FLe=.093104,ALe=-62e-7,MLe=11772758384668e-32,NLe=72921158553e-15,kLe=W.TWO_PI/86400,ON=new q;hi.computeIcrfToCentralBodyFixedMatrix=function(e,t){let n=hi.computeIcrfToFixedMatrix(e,t);return l(n)||(n=hi.computeTemeToPseudoFixedMatrix(e,t)),n};hi.computeTemeToPseudoFixedMatrix=function(e,t){ON=q.addSeconds(e,-q.computeTaiMinusUtc(e),ON);let n=ON.dayNumber,i=ON.secondsOfDay,o,r=n-2451545;i>=43200?o=(r+.5)/Qn.DAYS_PER_JULIAN_CENTURY:o=(r-.5)/Qn.DAYS_PER_JULIAN_CENTURY;let a=(vLe+o*(wLe+o*(FLe+o*ALe)))*kLe%W.TWO_PI,c=NLe+MLe*(n-24515455e-1),d=(i+Qn.SECONDS_PER_DAY*.5)%Qn.SECONDS_PER_DAY,u=a+c*d,h=Math.cos(u),p=Math.sin(u);return l(t)?(t[0]=h,t[1]=-p,t[2]=0,t[3]=p,t[4]=h,t[5]=0,t[6]=0,t[7]=0,t[8]=1,t):new $(h,p,0,-p,h,0,0,0,1)};hi.iau2006XysData=new gR;hi.earthOrientationParameters=bR.NONE;var MO=32.184,ULe=2451545;hi.preloadIcrfFixed=function(e){let t=e.start.dayNumber,n=e.start.secondsOfDay+MO,i=e.stop.dayNumber,o=e.stop.secondsOfDay+MO;return hi.iau2006XysData.preload(t,n,i,o)};hi.computeIcrfToFixedMatrix=function(e,t){l(t)||(t=new $);let n=hi.computeFixedToIcrfMatrix(e,t);if(l(n))return $.transpose(n,t)};var DLe=32.184,BLe=2451545,YN=new Xa,OLe=new $,YLe=new q;hi.computeMoonFixedToIcrfMatrix=function(e,t){l(t)||(t=new $);let n=q.addSeconds(e,DLe,YLe),i=q.totalDays(n)-BLe,o=W.toRadians(12.112)-W.toRadians(.052992)*i,r=W.toRadians(24.224)-W.toRadians(.105984)*i,s=W.toRadians(227.645)+W.toRadians(13.012)*i,a=W.toRadians(261.105)+W.toRadians(13.340716)*i,c=W.toRadians(358)+W.toRadians(.9856)*i;return YN.pitch=W.toRadians(180)-W.toRadians(3.878)*Math.sin(o)-W.toRadians(.12)*Math.sin(r)+W.toRadians(.07)*Math.sin(s)-W.toRadians(.017)*Math.sin(a),YN.roll=W.toRadians(66.53-90)+W.toRadians(1.543)*Math.cos(o)+W.toRadians(.24)*Math.cos(r)-W.toRadians(.028)*Math.cos(s)+W.toRadians(.007)*Math.cos(a),YN.heading=W.toRadians(244.375-90)+W.toRadians(13.17635831)*i+W.toRadians(3.558)*Math.sin(o)+W.toRadians(.121)*Math.sin(r)-W.toRadians(.064)*Math.sin(s)+W.toRadians(.016)*Math.sin(a)+W.toRadians(.025)*Math.sin(c),$.fromHeadingPitchRoll(YN,OLe)};hi.computeIcrfToMoonFixedMatrix=function(e,t){l(t)||(t=new $);let n=hi.computeMoonFixedToIcrfMatrix(e,t);if(l(n))return $.transpose(n,t)};var HLe=new xx(0,0,0),zLe=new U0(0,0,0,0,0,0),FO=new $,AO=new $;hi.computeFixedToIcrfMatrix=function(e,t){l(t)||(t=new $);let n=hi.earthOrientationParameters.compute(e,zLe);if(!l(n))return;let i=e.dayNumber,o=e.secondsOfDay+MO,r=hi.iau2006XysData.computeXysRadians(i,o,HLe);if(!l(r))return;let s=r.x+n.xPoleOffset,a=r.y+n.yPoleOffset,c=1/(1+Math.sqrt(1-s*s-a*a)),d=FO;d[0]=1-c*s*s,d[3]=-c*s*a,d[6]=s,d[1]=-c*s*a,d[4]=1-c*a*a,d[7]=a,d[2]=-s,d[5]=-a,d[8]=1-c*(s*s+a*a);let u=$.fromRotationZ(-r.s,AO),h=$.multiply(d,u,FO),p=e.dayNumber,g=e.secondsOfDay-q.computeTaiMinusUtc(e)+n.ut1MinusUtc,f=p-2451545,x=g/Qn.SECONDS_PER_DAY,_=.779057273264+x+.00273781191135448*(f+x);_=_%1*W.TWO_PI;let C=$.fromRotationZ(_,AO),V=$.multiply(h,C,FO),L=Math.cos(n.xPoleWander),R=Math.cos(n.yPoleWander),G=Math.sin(n.xPoleWander),I=Math.sin(n.yPoleWander),v=i-ULe+o/Qn.SECONDS_PER_DAY;v/=36525;let P=-47e-6*v*W.RADIANS_PER_DEGREE/3600,w=Math.cos(P),A=Math.sin(P),b=AO;return b[0]=L*w,b[1]=L*A,b[2]=G,b[3]=-R*A+I*G*w,b[4]=R*w+I*G*A,b[5]=-I*L,b[6]=-I*A-R*G*w,b[7]=I*w-R*G*A,b[8]=R*L,$.multiply(V,b,t)};var KLe=new re;hi.pointToWindowCoordinates=function(e,t,n,i){return i=hi.pointToGLWindowCoordinates(e,t,n,i),i.y=2*t[5]-i.y,i};hi.pointToGLWindowCoordinates=function(e,t,n,i){l(i)||(i=new D);let o=KLe;return M.multiplyByVector(e,re.fromElements(n.x,n.y,n.z,1,o),o),re.multiplyByScalar(o,1/o.w,o),M.multiplyByVector(t,o,o),D.fromCartesian4(o,i)};var JLe=new m,QLe=new m,jLe=new m;hi.rotationMatrixFromPositionVelocity=function(e,t,n,i){let o=y(n,ne.default).geodeticSurfaceNormal(e,JLe),r=m.cross(t,o,QLe);m.equalsEpsilon(r,m.ZERO,W.EPSILON6)&&(r=m.clone(m.UNIT_X,r));let s=m.cross(r,t,jLe);return m.normalize(s,s),m.cross(t,s,r),m.negate(r,r),m.normalize(r,r),l(i)||(i=new $),i[0]=t.x,i[1]=t.y,i[2]=t.z,i[3]=r.x,i[4]=r.y,i[5]=r.z,i[6]=s.x,i[7]=s.y,i[8]=s.z,i};var N$=new M(0,0,1,0,1,0,0,0,0,1,0,0,0,0,0,1),k$=new he,NO=new m,qLe=new m,$Le=new $,kO=new M,U$=new M;hi.basisTo2D=function(e,t,n){let i=M.getTranslation(t,qLe),o=e.ellipsoid,r;if(m.equals(i,m.ZERO))r=m.clone(m.ZERO,NO);else{let u=o.cartesianToCartographic(i,k$);r=e.project(u,NO),m.fromElements(r.z,r.x,r.y,r)}let s=hi.eastNorthUpToFixedFrame(i,o,kO),a=M.inverseTransformation(s,U$),c=M.getMatrix3(t,$Le),d=M.multiplyByMatrix3(a,c,n);return M.multiply(N$,d,n),M.setTranslation(n,r,n),n};hi.ellipsoidTo2DModelMatrix=function(e,t,n){let i=e.ellipsoid,o=hi.eastNorthUpToFixedFrame(t,i,kO),r=M.inverseTransformation(o,U$),s=i.cartesianToCartographic(t,k$),a=e.project(s,NO);m.fromElements(a.z,a.x,a.y,a);let c=M.fromTranslation(a,kO);return M.multiply(N$,r,n),M.multiply(c,n,n),n};var wt=hi;function In(e,t,n,i){this.west=y(e,0),this.south=y(t,0),this.east=y(n,0),this.north=y(i,0)}Object.defineProperties(In.prototype,{width:{get:function(){return In.computeWidth(this)}},height:{get:function(){return In.computeHeight(this)}}});In.packedLength=4;In.pack=function(e,t,n){return n=y(n,0),t[n++]=e.west,t[n++]=e.south,t[n++]=e.east,t[n]=e.north,t};In.unpack=function(e,t,n){return t=y(t,0),l(n)||(n=new In),n.west=e[t++],n.south=e[t++],n.east=e[t++],n.north=e[t],n};In.computeWidth=function(e){let t=e.east,n=e.west;return t=0?u.longitude:u.longitude+W.TWO_PI;o=Math.min(o,h),r=Math.max(r,h)}return i-n>r-o&&(n=o,i=r,i>W.PI&&(i=i-W.TWO_PI),n>W.PI&&(n=n-W.TWO_PI)),l(t)?(t.west=n,t.south=s,t.east=i,t.north=a,t):new In(n,s,i,a)};In.fromCartesianArray=function(e,t,n){t=y(t,ne.default);let i=Number.MAX_VALUE,o=-Number.MAX_VALUE,r=Number.MAX_VALUE,s=-Number.MAX_VALUE,a=Number.MAX_VALUE,c=-Number.MAX_VALUE;for(let d=0,u=e.length;d=0?h.longitude:h.longitude+W.TWO_PI;r=Math.min(r,p),s=Math.max(s,p)}return o-i>s-r&&(i=r,o=s,o>W.PI&&(o=o-W.TWO_PI),i>W.PI&&(i=i-W.TWO_PI)),l(n)?(n.west=i,n.south=a,n.east=o,n.north=c,n):new In(i,a,o,c)};var eRe=new m,tRe=new m,nRe=new m,iRe=new m,oRe=new m,UO=new Array(5);for(let e=0;e0?i+=W.TWO_PI:r0&&(r+=W.TWO_PI),i=u))return l(n)?(n.west=a,n.south=d,n.east=c,n.north=u,n):new In(a,d,c,u)};In.simpleIntersection=function(e,t,n){let i=Math.max(e.west,t.west),o=Math.max(e.south,t.south),r=Math.min(e.east,t.east),s=Math.min(e.north,t.north);if(!(o>=s||i>=r))return l(n)?(n.west=i,n.south=o,n.east=r,n.north=s,n):new In(i,o,r,s)};In.union=function(e,t,n){l(n)||(n=new In);let i=e.east,o=e.west,r=t.east,s=t.west;i0?i+=W.TWO_PI:r0&&(r+=W.TWO_PI),io||W.equalsEpsilon(n,o,W.EPSILON14))&&(n=e.south&&i<=e.north};var rRe=new he;In.subsample=function(e,t,n,i){t=y(t,ne.default),n=y(n,0),l(i)||(i=[]);let o=0,r=e.north,s=e.south,a=e.east,c=e.west,d=rRe;d.height=n,d.longitude=c,d.latitude=r,i[o]=t.cartographicToCartesian(d,i[o]),o++,d.longitude=a,i[o]=t.cartographicToCartesian(d,i[o]),o++,d.latitude=s,i[o]=t.cartographicToCartesian(d,i[o]),o++,d.longitude=c,i[o]=t.cartographicToCartesian(d,i[o]),o++,r<0?d.latitude=r:s>0?d.latitude=s:d.latitude=0;for(let u=1;u<8;++u)d.longitude=-Math.PI+u*W.PI_OVER_TWO,In.contains(e,d)&&(i[o]=t.cartographicToCartesian(d,i[o]),o++);return d.latitude===0&&(d.longitude=c,i[o]=t.cartographicToCartesian(d,i[o]),o++,d.longitude=a,i[o]=t.cartographicToCartesian(d,i[o]),o++),i.length=o,i};In.subsection=function(e,t,n,i,o,r){if(l(r)||(r=new In),e.west<=e.east){let a=e.east-e.west;r.west=e.west+t*a,r.east=e.west+i*a}else{let a=W.TWO_PI+e.east-e.west;r.west=W.negativePiToPi(e.west+t*a),r.east=W.negativePiToPi(e.west+i*a)}let s=e.north-e.south;return r.south=e.south+n*s,r.north=e.south+o*s,t===1&&(r.west=e.east),i===1&&(r.east=e.east),n===1&&(r.south=e.north),o===1&&(r.north=e.north),r};In.MAX_VALUE=Object.freeze(new In(-Math.PI,-W.PI_OVER_TWO,Math.PI,W.PI_OVER_TWO));var le=In;function wr(e,t,n,i){this.x=y(e,0),this.y=y(t,0),this.width=y(n,0),this.height=y(i,0)}wr.packedLength=4;wr.pack=function(e,t,n){return n=y(n,0),t[n++]=e.x,t[n++]=e.y,t[n++]=e.width,t[n]=e.height,t};wr.unpack=function(e,t,n){return t=y(t,0),l(n)||(n=new wr),n.x=e[t++],n.y=e[t++],n.width=e[t++],n.height=e[t],n};wr.fromPoints=function(e,t){if(l(t)||(t=new wr),!l(e)||e.length===0)return t.x=0,t.y=0,t.width=0,t.height=0,t;let n=e.length,i=e[0].x,o=e[0].y,r=e[0].x,s=e[0].y;for(let a=1;an.width?n.width=i:i<0&&(n.width-=i,n.x=t.x),o>n.height?n.height=o:o<0&&(n.height-=o,n.y=t.y),n};wr.intersect=function(e,t){let n=e.x,i=e.y,o=t.x,r=t.y;return n>o+t.width||n+e.widthr+t.height?zt.OUTSIDE:zt.INTERSECTING};wr.equals=function(e,t){return e===t||l(e)&&l(t)&&e.x===t.x&&e.y===t.y&&e.width===t.width&&e.height===t.height};wr.prototype.clone=function(e){return wr.clone(this,e)};wr.prototype.intersect=function(e){return wr.intersect(this,e)};wr.prototype.equals=function(e){return wr.equals(this,e)};var He=wr;var zIt=T(S(),1);function DO(e,t,n){return n<0&&(n+=1),n>1&&(n-=1),n*6<1?e+(t-e)*6*n:n*2<1?t:n*3<2?e+(t-e)*(2/3-n)*6:e}function se(e,t,n,i){this.red=y(e,1),this.green=y(t,1),this.blue=y(n,1),this.alpha=y(i,1)}se.fromCartesian4=function(e,t){return l(t)?(t.red=e.x,t.green=e.y,t.blue=e.z,t.alpha=e.w,t):new se(e.x,e.y,e.z,e.w)};se.fromBytes=function(e,t,n,i,o){return e=se.byteToFloat(y(e,255)),t=se.byteToFloat(y(t,255)),n=se.byteToFloat(y(n,255)),i=se.byteToFloat(y(i,255)),l(o)?(o.red=e,o.green=t,o.blue=n,o.alpha=i,o):new se(e,t,n,i)};se.fromAlpha=function(e,t,n){return l(n)?(n.red=e.red,n.green=e.green,n.blue=e.blue,n.alpha=t,n):new se(e.red,e.green,e.blue,t)};var BO,OO,Ip;Ot.supportsTypedArrays()&&(BO=new ArrayBuffer(4),OO=new Uint32Array(BO),Ip=new Uint8Array(BO));se.fromRgba=function(e,t){return OO[0]=e,se.fromBytes(Ip[0],Ip[1],Ip[2],Ip[3],t)};se.fromHsl=function(e,t,n,i,o){e=y(e,0)%1,t=y(t,0),n=y(n,0),i=y(i,1);let r=n,s=n,a=n;if(t!==0){let c;n<.5?c=n*(1+t):c=n+t-n*t;let d=2*n-c;r=DO(d,c,e+1/3),s=DO(d,c,e),a=DO(d,c,e-1/3)}return l(o)?(o.red=r,o.green=s,o.blue=a,o.alpha=i,o):new se(r,s,a,i)};se.fromRandom=function(e,t){e=y(e,y.EMPTY_OBJECT);let n=e.red;if(!l(n)){let s=y(e.minimumRed,0),a=y(e.maximumRed,1);n=s+W.nextRandomNumber()*(a-s)}let i=e.green;if(!l(i)){let s=y(e.minimumGreen,0),a=y(e.maximumGreen,1);i=s+W.nextRandomNumber()*(a-s)}let o=e.blue;if(!l(o)){let s=y(e.minimumBlue,0),a=y(e.maximumBlue,1);o=s+W.nextRandomNumber()*(a-s)}let r=e.alpha;if(!l(r)){let s=y(e.minimumAlpha,0),a=y(e.maximumAlpha,1);r=s+W.nextRandomNumber()*(a-s)}return l(t)?(t.red=n,t.green=i,t.blue=o,t.alpha=r,t):new se(n,i,o,r)};var cRe=/^#([0-9a-f])([0-9a-f])([0-9a-f])([0-9a-f])?$/i,lRe=/^#([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})?$/i,dRe=/^rgba?\s*\(\s*([0-9.]+%?)\s*[,\s]+\s*([0-9.]+%?)\s*[,\s]+\s*([0-9.]+%?)(?:\s*[,\s/]+\s*([0-9.]+))?\s*\)$/i,uRe=/^hsla?\s*\(\s*([0-9.]+)\s*[,\s]+\s*([0-9.]+%)\s*[,\s]+\s*([0-9.]+%)(?:\s*[,\s/]+\s*([0-9.]+))?\s*\)$/i;se.fromCssColorString=function(e,t){l(t)||(t=new se),e=e.trim();let n=se[e.toUpperCase()];if(l(n))return se.clone(n,t),t;let i=cRe.exec(e);return i!==null?(t.red=parseInt(i[1],16)/15,t.green=parseInt(i[2],16)/15,t.blue=parseInt(i[3],16)/15,t.alpha=parseInt(y(i[4],"f"),16)/15,t):(i=lRe.exec(e),i!==null?(t.red=parseInt(i[1],16)/255,t.green=parseInt(i[2],16)/255,t.blue=parseInt(i[3],16)/255,t.alpha=parseInt(y(i[4],"ff"),16)/255,t):(i=dRe.exec(e),i!==null?(t.red=parseFloat(i[1])/(i[1].substr(-1)==="%"?100:255),t.green=parseFloat(i[2])/(i[2].substr(-1)==="%"?100:255),t.blue=parseFloat(i[3])/(i[3].substr(-1)==="%"?100:255),t.alpha=parseFloat(y(i[4],"1.0")),t):(i=uRe.exec(e),i!==null?se.fromHsl(parseFloat(i[1])/360,parseFloat(i[2])/100,parseFloat(i[3])/100,parseFloat(y(i[4],"1.0")),t):(t=void 0,t))))};se.packedLength=4;se.pack=function(e,t,n){return n=y(n,0),t[n++]=e.red,t[n++]=e.green,t[n++]=e.blue,t[n]=e.alpha,t};se.unpack=function(e,t,n){return t=y(t,0),l(n)||(n=new se),n.red=e[t++],n.green=e[t++],n.blue=e[t++],n.alpha=e[t],n};se.byteToFloat=function(e){return e/255};se.floatToByte=function(e){return e===1?255:e*256|0};se.clone=function(e,t){if(l(e))return l(t)?(t.red=e.red,t.green=e.green,t.blue=e.blue,t.alpha=e.alpha,t):new se(e.red,e.green,e.blue,e.alpha)};se.equals=function(e,t){return e===t||l(e)&&l(t)&&e.red===t.red&&e.green===t.green&&e.blue===t.blue&&e.alpha===t.alpha};se.equalsArray=function(e,t,n){return e.red===t[n]&&e.green===t[n+1]&&e.blue===t[n+2]&&e.alpha===t[n+3]};se.prototype.clone=function(e){return se.clone(this,e)};se.prototype.equals=function(e){return se.equals(this,e)};se.prototype.equalsEpsilon=function(e,t){return this===e||l(e)&&Math.abs(this.red-e.red)<=t&&Math.abs(this.green-e.green)<=t&&Math.abs(this.blue-e.blue)<=t&&Math.abs(this.alpha-e.alpha)<=t};se.prototype.toString=function(){return`(${this.red}, ${this.green}, ${this.blue}, ${this.alpha})`};se.prototype.toCssColorString=function(){let e=se.floatToByte(this.red),t=se.floatToByte(this.green),n=se.floatToByte(this.blue);return this.alpha===1?`rgb(${e},${t},${n})`:`rgba(${e},${t},${n},${this.alpha})`};se.prototype.toCssHexString=function(){let e=se.floatToByte(this.red).toString(16);e.length<2&&(e=`0${e}`);let t=se.floatToByte(this.green).toString(16);t.length<2&&(t=`0${t}`);let n=se.floatToByte(this.blue).toString(16);if(n.length<2&&(n=`0${n}`),this.alpha<1){let i=se.floatToByte(this.alpha).toString(16);return i.length<2&&(i=`0${i}`),`#${e}${t}${n}${i}`}return`#${e}${t}${n}`};se.prototype.toBytes=function(e){let t=se.floatToByte(this.red),n=se.floatToByte(this.green),i=se.floatToByte(this.blue),o=se.floatToByte(this.alpha);return l(e)?(e[0]=t,e[1]=n,e[2]=i,e[3]=o,e):[t,n,i,o]};se.prototype.toRgba=function(){return Ip[0]=se.floatToByte(this.red),Ip[1]=se.floatToByte(this.green),Ip[2]=se.floatToByte(this.blue),Ip[3]=se.floatToByte(this.alpha),OO[0]};se.prototype.brighten=function(e,t){return e=1-e,t.red=1-(1-this.red)*e,t.green=1-(1-this.green)*e,t.blue=1-(1-this.blue)*e,t.alpha=this.alpha,t};se.prototype.darken=function(e,t){return e=1-e,t.red=this.red*e,t.green=this.green*e,t.blue=this.blue*e,t.alpha=this.alpha,t};se.prototype.withAlpha=function(e,t){return se.fromAlpha(this,e,t)};se.add=function(e,t,n){return n.red=e.red+t.red,n.green=e.green+t.green,n.blue=e.blue+t.blue,n.alpha=e.alpha+t.alpha,n};se.subtract=function(e,t,n){return n.red=e.red-t.red,n.green=e.green-t.green,n.blue=e.blue-t.blue,n.alpha=e.alpha-t.alpha,n};se.multiply=function(e,t,n){return n.red=e.red*t.red,n.green=e.green*t.green,n.blue=e.blue*t.blue,n.alpha=e.alpha*t.alpha,n};se.divide=function(e,t,n){return n.red=e.red/t.red,n.green=e.green/t.green,n.blue=e.blue/t.blue,n.alpha=e.alpha/t.alpha,n};se.mod=function(e,t,n){return n.red=e.red%t.red,n.green=e.green%t.green,n.blue=e.blue%t.blue,n.alpha=e.alpha%t.alpha,n};se.lerp=function(e,t,n,i){return i.red=W.lerp(e.red,t.red,n),i.green=W.lerp(e.green,t.green,n),i.blue=W.lerp(e.blue,t.blue,n),i.alpha=W.lerp(e.alpha,t.alpha,n),i};se.multiplyByScalar=function(e,t,n){return n.red=e.red*t,n.green=e.green*t,n.blue=e.blue*t,n.alpha=e.alpha*t,n};se.divideByScalar=function(e,t,n){return n.red=e.red/t,n.green=e.green/t,n.blue=e.blue/t,n.alpha=e.alpha/t,n};se.ALICEBLUE=Object.freeze(se.fromCssColorString("#F0F8FF"));se.ANTIQUEWHITE=Object.freeze(se.fromCssColorString("#FAEBD7"));se.AQUA=Object.freeze(se.fromCssColorString("#00FFFF"));se.AQUAMARINE=Object.freeze(se.fromCssColorString("#7FFFD4"));se.AZURE=Object.freeze(se.fromCssColorString("#F0FFFF"));se.BEIGE=Object.freeze(se.fromCssColorString("#F5F5DC"));se.BISQUE=Object.freeze(se.fromCssColorString("#FFE4C4"));se.BLACK=Object.freeze(se.fromCssColorString("#000000"));se.BLANCHEDALMOND=Object.freeze(se.fromCssColorString("#FFEBCD"));se.BLUE=Object.freeze(se.fromCssColorString("#0000FF"));se.BLUEVIOLET=Object.freeze(se.fromCssColorString("#8A2BE2"));se.BROWN=Object.freeze(se.fromCssColorString("#A52A2A"));se.BURLYWOOD=Object.freeze(se.fromCssColorString("#DEB887"));se.CADETBLUE=Object.freeze(se.fromCssColorString("#5F9EA0"));se.CHARTREUSE=Object.freeze(se.fromCssColorString("#7FFF00"));se.CHOCOLATE=Object.freeze(se.fromCssColorString("#D2691E"));se.CORAL=Object.freeze(se.fromCssColorString("#FF7F50"));se.CORNFLOWERBLUE=Object.freeze(se.fromCssColorString("#6495ED"));se.CORNSILK=Object.freeze(se.fromCssColorString("#FFF8DC"));se.CRIMSON=Object.freeze(se.fromCssColorString("#DC143C"));se.CYAN=Object.freeze(se.fromCssColorString("#00FFFF"));se.DARKBLUE=Object.freeze(se.fromCssColorString("#00008B"));se.DARKCYAN=Object.freeze(se.fromCssColorString("#008B8B"));se.DARKGOLDENROD=Object.freeze(se.fromCssColorString("#B8860B"));se.DARKGRAY=Object.freeze(se.fromCssColorString("#A9A9A9"));se.DARKGREEN=Object.freeze(se.fromCssColorString("#006400"));se.DARKGREY=se.DARKGRAY;se.DARKKHAKI=Object.freeze(se.fromCssColorString("#BDB76B"));se.DARKMAGENTA=Object.freeze(se.fromCssColorString("#8B008B"));se.DARKOLIVEGREEN=Object.freeze(se.fromCssColorString("#556B2F"));se.DARKORANGE=Object.freeze(se.fromCssColorString("#FF8C00"));se.DARKORCHID=Object.freeze(se.fromCssColorString("#9932CC"));se.DARKRED=Object.freeze(se.fromCssColorString("#8B0000"));se.DARKSALMON=Object.freeze(se.fromCssColorString("#E9967A"));se.DARKSEAGREEN=Object.freeze(se.fromCssColorString("#8FBC8F"));se.DARKSLATEBLUE=Object.freeze(se.fromCssColorString("#483D8B"));se.DARKSLATEGRAY=Object.freeze(se.fromCssColorString("#2F4F4F"));se.DARKSLATEGREY=se.DARKSLATEGRAY;se.DARKTURQUOISE=Object.freeze(se.fromCssColorString("#00CED1"));se.DARKVIOLET=Object.freeze(se.fromCssColorString("#9400D3"));se.DEEPPINK=Object.freeze(se.fromCssColorString("#FF1493"));se.DEEPSKYBLUE=Object.freeze(se.fromCssColorString("#00BFFF"));se.DIMGRAY=Object.freeze(se.fromCssColorString("#696969"));se.DIMGREY=se.DIMGRAY;se.DODGERBLUE=Object.freeze(se.fromCssColorString("#1E90FF"));se.FIREBRICK=Object.freeze(se.fromCssColorString("#B22222"));se.FLORALWHITE=Object.freeze(se.fromCssColorString("#FFFAF0"));se.FORESTGREEN=Object.freeze(se.fromCssColorString("#228B22"));se.FUCHSIA=Object.freeze(se.fromCssColorString("#FF00FF"));se.GAINSBORO=Object.freeze(se.fromCssColorString("#DCDCDC"));se.GHOSTWHITE=Object.freeze(se.fromCssColorString("#F8F8FF"));se.GOLD=Object.freeze(se.fromCssColorString("#FFD700"));se.GOLDENROD=Object.freeze(se.fromCssColorString("#DAA520"));se.GRAY=Object.freeze(se.fromCssColorString("#808080"));se.GREEN=Object.freeze(se.fromCssColorString("#008000"));se.GREENYELLOW=Object.freeze(se.fromCssColorString("#ADFF2F"));se.GREY=se.GRAY;se.HONEYDEW=Object.freeze(se.fromCssColorString("#F0FFF0"));se.HOTPINK=Object.freeze(se.fromCssColorString("#FF69B4"));se.INDIANRED=Object.freeze(se.fromCssColorString("#CD5C5C"));se.INDIGO=Object.freeze(se.fromCssColorString("#4B0082"));se.IVORY=Object.freeze(se.fromCssColorString("#FFFFF0"));se.KHAKI=Object.freeze(se.fromCssColorString("#F0E68C"));se.LAVENDER=Object.freeze(se.fromCssColorString("#E6E6FA"));se.LAVENDAR_BLUSH=Object.freeze(se.fromCssColorString("#FFF0F5"));se.LAWNGREEN=Object.freeze(se.fromCssColorString("#7CFC00"));se.LEMONCHIFFON=Object.freeze(se.fromCssColorString("#FFFACD"));se.LIGHTBLUE=Object.freeze(se.fromCssColorString("#ADD8E6"));se.LIGHTCORAL=Object.freeze(se.fromCssColorString("#F08080"));se.LIGHTCYAN=Object.freeze(se.fromCssColorString("#E0FFFF"));se.LIGHTGOLDENRODYELLOW=Object.freeze(se.fromCssColorString("#FAFAD2"));se.LIGHTGRAY=Object.freeze(se.fromCssColorString("#D3D3D3"));se.LIGHTGREEN=Object.freeze(se.fromCssColorString("#90EE90"));se.LIGHTGREY=se.LIGHTGRAY;se.LIGHTPINK=Object.freeze(se.fromCssColorString("#FFB6C1"));se.LIGHTSEAGREEN=Object.freeze(se.fromCssColorString("#20B2AA"));se.LIGHTSKYBLUE=Object.freeze(se.fromCssColorString("#87CEFA"));se.LIGHTSLATEGRAY=Object.freeze(se.fromCssColorString("#778899"));se.LIGHTSLATEGREY=se.LIGHTSLATEGRAY;se.LIGHTSTEELBLUE=Object.freeze(se.fromCssColorString("#B0C4DE"));se.LIGHTYELLOW=Object.freeze(se.fromCssColorString("#FFFFE0"));se.LIME=Object.freeze(se.fromCssColorString("#00FF00"));se.LIMEGREEN=Object.freeze(se.fromCssColorString("#32CD32"));se.LINEN=Object.freeze(se.fromCssColorString("#FAF0E6"));se.MAGENTA=Object.freeze(se.fromCssColorString("#FF00FF"));se.MAROON=Object.freeze(se.fromCssColorString("#800000"));se.MEDIUMAQUAMARINE=Object.freeze(se.fromCssColorString("#66CDAA"));se.MEDIUMBLUE=Object.freeze(se.fromCssColorString("#0000CD"));se.MEDIUMORCHID=Object.freeze(se.fromCssColorString("#BA55D3"));se.MEDIUMPURPLE=Object.freeze(se.fromCssColorString("#9370DB"));se.MEDIUMSEAGREEN=Object.freeze(se.fromCssColorString("#3CB371"));se.MEDIUMSLATEBLUE=Object.freeze(se.fromCssColorString("#7B68EE"));se.MEDIUMSPRINGGREEN=Object.freeze(se.fromCssColorString("#00FA9A"));se.MEDIUMTURQUOISE=Object.freeze(se.fromCssColorString("#48D1CC"));se.MEDIUMVIOLETRED=Object.freeze(se.fromCssColorString("#C71585"));se.MIDNIGHTBLUE=Object.freeze(se.fromCssColorString("#191970"));se.MINTCREAM=Object.freeze(se.fromCssColorString("#F5FFFA"));se.MISTYROSE=Object.freeze(se.fromCssColorString("#FFE4E1"));se.MOCCASIN=Object.freeze(se.fromCssColorString("#FFE4B5"));se.NAVAJOWHITE=Object.freeze(se.fromCssColorString("#FFDEAD"));se.NAVY=Object.freeze(se.fromCssColorString("#000080"));se.OLDLACE=Object.freeze(se.fromCssColorString("#FDF5E6"));se.OLIVE=Object.freeze(se.fromCssColorString("#808000"));se.OLIVEDRAB=Object.freeze(se.fromCssColorString("#6B8E23"));se.ORANGE=Object.freeze(se.fromCssColorString("#FFA500"));se.ORANGERED=Object.freeze(se.fromCssColorString("#FF4500"));se.ORCHID=Object.freeze(se.fromCssColorString("#DA70D6"));se.PALEGOLDENROD=Object.freeze(se.fromCssColorString("#EEE8AA"));se.PALEGREEN=Object.freeze(se.fromCssColorString("#98FB98"));se.PALETURQUOISE=Object.freeze(se.fromCssColorString("#AFEEEE"));se.PALEVIOLETRED=Object.freeze(se.fromCssColorString("#DB7093"));se.PAPAYAWHIP=Object.freeze(se.fromCssColorString("#FFEFD5"));se.PEACHPUFF=Object.freeze(se.fromCssColorString("#FFDAB9"));se.PERU=Object.freeze(se.fromCssColorString("#CD853F"));se.PINK=Object.freeze(se.fromCssColorString("#FFC0CB"));se.PLUM=Object.freeze(se.fromCssColorString("#DDA0DD"));se.POWDERBLUE=Object.freeze(se.fromCssColorString("#B0E0E6"));se.PURPLE=Object.freeze(se.fromCssColorString("#800080"));se.RED=Object.freeze(se.fromCssColorString("#FF0000"));se.ROSYBROWN=Object.freeze(se.fromCssColorString("#BC8F8F"));se.ROYALBLUE=Object.freeze(se.fromCssColorString("#4169E1"));se.SADDLEBROWN=Object.freeze(se.fromCssColorString("#8B4513"));se.SALMON=Object.freeze(se.fromCssColorString("#FA8072"));se.SANDYBROWN=Object.freeze(se.fromCssColorString("#F4A460"));se.SEAGREEN=Object.freeze(se.fromCssColorString("#2E8B57"));se.SEASHELL=Object.freeze(se.fromCssColorString("#FFF5EE"));se.SIENNA=Object.freeze(se.fromCssColorString("#A0522D"));se.SILVER=Object.freeze(se.fromCssColorString("#C0C0C0"));se.SKYBLUE=Object.freeze(se.fromCssColorString("#87CEEB"));se.SLATEBLUE=Object.freeze(se.fromCssColorString("#6A5ACD"));se.SLATEGRAY=Object.freeze(se.fromCssColorString("#708090"));se.SLATEGREY=se.SLATEGRAY;se.SNOW=Object.freeze(se.fromCssColorString("#FFFAFA"));se.SPRINGGREEN=Object.freeze(se.fromCssColorString("#00FF7F"));se.STEELBLUE=Object.freeze(se.fromCssColorString("#4682B4"));se.TAN=Object.freeze(se.fromCssColorString("#D2B48C"));se.TEAL=Object.freeze(se.fromCssColorString("#008080"));se.THISTLE=Object.freeze(se.fromCssColorString("#D8BFD8"));se.TOMATO=Object.freeze(se.fromCssColorString("#FF6347"));se.TURQUOISE=Object.freeze(se.fromCssColorString("#40E0D0"));se.VIOLET=Object.freeze(se.fromCssColorString("#EE82EE"));se.WHEAT=Object.freeze(se.fromCssColorString("#F5DEB3"));se.WHITE=Object.freeze(se.fromCssColorString("#FFFFFF"));se.WHITESMOKE=Object.freeze(se.fromCssColorString("#F5F5F5"));se.YELLOW=Object.freeze(se.fromCssColorString("#FFFF00"));se.YELLOWGREEN=Object.freeze(se.fromCssColorString("#9ACD32"));se.TRANSPARENT=Object.freeze(new se(0,0,0,0));var B=se;var QIt=T(S(),1);function mRe(){return!0}function hRe(e,t){t=y(t,"This object was destroyed, i.e., destroy() was called.");function n(){}for(let i in e)typeof e[i]=="function"&&(e[i]=n);e.isDestroyed=mRe}var me=hRe;var eXt=T(S(),1);function hd(e,t){e=y(e,0),this._near=e,t=y(t,Number.MAX_VALUE),this._far=t}Object.defineProperties(hd.prototype,{near:{get:function(){return this._near},set:function(e){this._near=e}},far:{get:function(){return this._far},set:function(e){this._far=e}}});hd.packedLength=2;hd.pack=function(e,t,n){return n=y(n,0),t[n++]=e.near,t[n]=e.far,t};hd.unpack=function(e,t,n){return t=y(t,0),l(n)||(n=new hd),n.near=e[t++],n.far=e[t],n};hd.equals=function(e,t){return e===t||l(e)&&l(t)&&e.near===t.near&&e.far===t.far};hd.clone=function(e,t){if(l(e))return l(t)||(t=new hd),t.near=e.near,t.far=e.far,t};hd.prototype.clone=function(e){return hd.clone(this,e)};hd.prototype.equals=function(e){return hd.equals(this,e)};var Ft=hd;var oXt=T(S(),1);function xu(e,t,n,i){this.near=y(e,0),this.nearValue=y(t,0),this.far=y(n,1),this.farValue=y(i,0)}xu.clone=function(e,t){if(l(e))return l(t)?(t.near=e.near,t.nearValue=e.nearValue,t.far=e.far,t.farValue=e.farValue,t):new xu(e.near,e.nearValue,e.far,e.farValue)};xu.packedLength=4;xu.pack=function(e,t,n){return n=y(n,0),t[n++]=e.near,t[n++]=e.nearValue,t[n++]=e.far,t[n]=e.farValue,t};xu.unpack=function(e,t,n){return t=y(t,0),l(n)||(n=new xu),n.near=e[t++],n.nearValue=e[t++],n.far=e[t++],n.farValue=e[t],n};xu.equals=function(e,t){return e===t||l(e)&&l(t)&&e.near===t.near&&e.nearValue===t.nearValue&&e.far===t.far&&e.farValue===t.farValue};xu.prototype.clone=function(e){return xu.clone(this,e)};xu.prototype.equals=function(e){return xu.equals(this,e)};var Ut=xu;var sXt=T(S(),1),Tx={NONE:0,CLAMP_TO_GROUND:1,RELATIVE_TO_GROUND:2,CLAMP_TO_TERRAIN:3,RELATIVE_TO_TERRAIN:4,CLAMP_TO_3D_TILE:5,RELATIVE_TO_3D_TILE:6},Ke=Object.freeze(Tx);function _u(e){return e===Tx.CLAMP_TO_GROUND||e===Tx.CLAMP_TO_3D_TILE||e===Tx.CLAMP_TO_TERRAIN}function lC(e){return e===Tx.RELATIVE_TO_GROUND||e===Tx.RELATIVE_TO_3D_TILE||e===Tx.RELATIVE_TO_TERRAIN}var cXt=T(S(),1),fRe={CENTER:0,LEFT:1,RIGHT:-1},xi=Object.freeze(fRe);var dXt=T(S(),1),pRe={CENTER:0,BOTTOM:1,BASELINE:2,TOP:-1},An=Object.freeze(pRe);var mXt=T(S(),1),bRe=Object.freeze({DONE:0,PENDING:1,FAILED:2}),dt=bRe;var gXt=T(S(),1);function Wm(){fe.throwInstantiationError()}Object.defineProperties(Wm.prototype,{isConstant:{get:fe.throwInstantiationError},definitionChanged:{get:fe.throwInstantiationError}});Wm.prototype.getValue=fe.throwInstantiationError;Wm.prototype.equals=fe.throwInstantiationError;Wm.equals=function(e,t){return e===t||l(e)&&e.equals(t)};Wm.arrayEquals=function(e,t){if(e===t)return!0;if(!l(e)||!l(t)||e.length!==t.length)return!1;let n=e.length;for(let i=0;i-1;o--)r=t[o],l(r._billboard)&&l(r._position)&&s.set(r.id,new B$(r));for(o=i.length-1;o>-1;o--)r=i[o],l(r._billboard)&&l(r._position)?s.contains(r.id)||s.set(r.id,new B$(r)):(YO(s.get(r.id),r,a),s.remove(r.id));for(o=n.length-1;o>-1;o--)r=n[o],YO(s.get(r.id),r,a),s.remove(r.id)};function YO(e,t,n){l(e)&&(e.billboard=void 0,n.removeBillboard(t))}var SR=K0;var w$t=T(S(),1);var n2t=T(S(),1);var $Xt=T(S(),1);var NXt=T(S(),1);function MRe(e,t){this.start=y(e,0),this.stop=y(t,0)}var Wa=MRe;function bn(e,t){this.center=m.clone(y(e,m.ZERO)),this.radius=y(t,0)}var KO=new m,JO=new m,QO=new m,jO=new m,qO=new m,$O=new m,eY=new m,ha=new m,tY=new m,nY=new m,iY=new m,oY=new m,NRe=4/3*W.PI;bn.fromPoints=function(e,t){if(l(t)||(t=new bn),!l(e)||e.length===0)return t.center=m.clone(m.ZERO,t.center),t.radius=0,t;let n=m.clone(e[0],eY),i=m.clone(n,KO),o=m.clone(n,JO),r=m.clone(n,QO),s=m.clone(n,jO),a=m.clone(n,qO),c=m.clone(n,$O),d=e.length,u;for(u=1;us.x&&m.clone(n,s),wa.y&&m.clone(n,a),Ac.z&&m.clone(n,c)}let h=m.magnitudeSquared(m.subtract(s,i,ha)),p=m.magnitudeSquared(m.subtract(a,o,ha)),g=m.magnitudeSquared(m.subtract(c,r,ha)),f=i,x=s,_=h;p>_&&(_=p,f=o,x=a),g>_&&(_=g,f=r,x=c);let C=tY;C.x=(f.x+x.x)*.5,C.y=(f.y+x.y)*.5,C.z=(f.z+x.z)*.5;let V=m.magnitudeSquared(m.subtract(x,C,ha)),L=Math.sqrt(V),R=nY;R.x=i.x,R.y=o.y,R.z=r.z;let G=iY;G.x=s.x,G.y=a.y,G.z=c.z;let I=m.midpoint(R,G,oY),v=0;for(u=0;uv&&(v=P);let w=m.magnitudeSquared(m.subtract(n,C,ha));if(w>V){let A=Math.sqrt(w);L=(L+A)*.5,V=L*L;let b=A-L;C.x=(L*C.x+b*n.x)/A,C.y=(L*C.y+b*n.y)/A,C.z=(L*C.z+b*n.z)/A}}return Lc.x&&m.clone(o,c),bd.y&&m.clone(o,d),Zu.z&&m.clone(o,u)}let g=m.magnitudeSquared(m.subtract(c,r,ha)),f=m.magnitudeSquared(m.subtract(d,s,ha)),x=m.magnitudeSquared(m.subtract(u,a,ha)),_=r,C=c,V=g;f>V&&(V=f,_=s,C=d),x>V&&(V=x,_=a,C=u);let L=tY;L.x=(_.x+C.x)*.5,L.y=(_.y+C.y)*.5,L.z=(_.z+C.z)*.5;let R=m.magnitudeSquared(m.subtract(C,L,ha)),G=Math.sqrt(R),I=nY;I.x=r.x,I.y=s.y,I.z=a.z;let v=iY;v.x=c.x,v.y=d.y,v.z=u.z;let P=m.midpoint(I,v,oY),w=0;for(p=0;pw&&(w=A);let b=m.magnitudeSquared(m.subtract(o,L,ha));if(b>R){let Z=Math.sqrt(b);G=(G+Z)*.5,R=G*G;let E=Z-G;L.x=(G*L.x+E*o.x)/Z,L.y=(G*L.y+E*o.y)/Z,L.z=(G*L.z+E*o.z)/Z}}return Ga.x&&m.clone(i,a),Ac.y&&m.clone(i,c),bd.z&&m.clone(i,d)}let p=m.magnitudeSquared(m.subtract(a,o,ha)),g=m.magnitudeSquared(m.subtract(c,r,ha)),f=m.magnitudeSquared(m.subtract(d,s,ha)),x=o,_=a,C=p;g>C&&(C=g,x=r,_=c),f>C&&(C=f,x=s,_=d);let V=tY;V.x=(x.x+_.x)*.5,V.y=(x.y+_.y)*.5,V.z=(x.z+_.z)*.5;let L=m.magnitudeSquared(m.subtract(_,V,ha)),R=Math.sqrt(L),G=nY;G.x=o.x,G.y=r.y,G.z=s.z;let I=iY;I.x=a.x,I.y=c.y,I.z=d.z;let v=m.midpoint(G,I,oY),P=0;for(h=0;hP&&(P=w);let A=m.magnitudeSquared(m.subtract(i,V,ha));if(A>L){let b=Math.sqrt(A);R=(R+b)*.5,L=R*R;let Z=b-R;V.x=(R*V.x+Z*i.x)/b,V.y=(R*V.y+Z*i.y)/b,V.z=(R*V.z+Z*i.z)/b}}return R=c+s)return e.clone(n),n;if(s>=c+o)return t.clone(n),n;let d=(o+c+s)*.5,u=m.multiplyByScalar(a,(-o+d)/c,QRe);return m.add(u,i,u),m.clone(u,n.center),n.radius=d,n};var jRe=new m;bn.expand=function(e,t,n){n=bn.clone(e,n);let i=m.magnitude(m.subtract(t,n.center,jRe));return i>n.radius&&(n.radius=i),n};bn.intersectPlane=function(e,t){let n=e.center,i=e.radius,o=t.normal,r=m.dot(o,n)+t.distance;return r<-i?zt.OUTSIDE:r{e.onmessage=function(o){let r=o.data.array,s=l(r)&&r[0]===t;i(s),e.terminate(),fa._canTransferArrayBuffer=s}})}return fa._canTransferArrayBuffer}var cY=new be;function aY(e){let t;try{t=new Blob([e],{type:"application/javascript"})}catch{let o=window.BlobBuilder||window.WebKitBlobBuilder||window.MozBlobBuilder||window.MSBlobBuilder,r=new o;r.append(e),t=r.getBlob("application/javascript")}return(window.URL||window.webkitURL).createObjectURL(t)}function lY(e){let t=new see.default(e),n=t.scheme().length!==0&&t.fragment().length===0,i=e.replace(/\.js$/,""),o={},r,s;if(B0(e))s=e;else if(!n){let a=on(`${fa._workerModulePrefix}/${i}.js`);B0(a)&&(s=a)}if(s){let a=`import "${s}";`;return r=aY(a),o.type="module",new Worker(r,o)}if(!n&&typeof CESIUM_WORKERS<"u"){let a=` importScripts("${aY(CESIUM_WORKERS)}"); CesiumWorkers["${i}"](); `;return r=aY(a),new Worker(r,o)}if(r=e,n||(r=on(`${fa._workerModulePrefix+i}.js`)),!Ot.supportsEsmWebWorkers())throw new ce("This browser is not supported. Please update your browser to continue.");return o.type="module",new Worker(r,o)}async function PZe(e,t){let n={modulePath:void 0,wasmBinaryFile:void 0,wasmBinary:void 0};if(!Ot.supportsWebAssembly()){if(!l(t.fallbackModulePath))throw new ce(`This browser does not support Web Assembly, and no backup module was provided for ${e._workerPath}`);return n.modulePath=on(t.fallbackModulePath),n}n.wasmBinaryFile=on(t.wasmBinaryFile);let i=await Re.fetchArrayBuffer({url:n.wasmBinaryFile});return n.wasmBinary=i,n}function fa(e,t){this._workerPath=e,this._maximumActiveTasks=y(t,Number.POSITIVE_INFINITY),this._activeTasks=0,this._nextID=0,this._webAssemblyPromise=void 0}var vZe=(e,t,n,i)=>{let o=({data:r})=>{if(r.id===t){if(l(r.error)){let s=r.error;s.name==="RuntimeError"?(s=new ce(r.error.message),s.stack=r.error.stack):s.name==="DeveloperError"?(s=new fe(r.error.message),s.stack=r.error.stack):s.name==="Error"&&(s=new Error(r.error.message),s.stack=r.error.stack),cY.raiseEvent(s),i(s)}else cY.raiseEvent(),n(r.result);e.removeEventListener("message",o)}};return o},wZe=[];async function FZe(e,t,n){let i=await Promise.resolve(aee());l(n)?i||(n.length=0):n=wZe;let o=e._nextID++,r=new Promise((s,a)=>{e._worker.addEventListener("message",vZe(e._worker,o,s,a))});return e._worker.postMessage({id:o,baseUrl:on.getCesiumBaseUrl().url,parameters:t,canTransferArrayBuffer:i},n),r}async function AZe(e,t,n){++e._activeTasks;try{let i=await FZe(e,t,n);return--e._activeTasks,i}catch(i){throw--e._activeTasks,i}}fa.prototype.scheduleTask=function(e,t){if(l(this._worker)||(this._worker=lY(this._workerPath)),!(this._activeTasks>=this._maximumActiveTasks))return AZe(this,e,t)};fa.prototype.initWebAssemblyModule=async function(e){if(l(this._webAssemblyPromise))return this._webAssemblyPromise;let t=async()=>{let n=this._worker=lY(this._workerPath),i=await PZe(this,e),o=await Promise.resolve(aee()),r,s=i.wasmBinary;l(s)&&o&&(r=[s]);let a=new Promise((c,d)=>{n.onmessage=function({data:u}){l(u)?c(u.result):d(new ce("Could not configure wasm module"))}});return n.postMessage({canTransferArrayBuffer:o,parameters:{webAssemblyConfig:i}},r),a};return this._webAssemblyPromise=t(),this._webAssemblyPromise};fa.prototype.isDestroyed=function(){return!1};fa.prototype.destroy=function(){return l(this._worker)&&this._worker.terminate(),me(this)};fa.taskCompletedEvent=cY;fa._defaultWorkerModulePrefix="Workers/";fa._workerModulePrefix=fa._defaultWorkerModulePrefix;fa._canTransferArrayBuffer=void 0;var Ti=fa;function Xp(){}Xp._transcodeTaskProcessor=new Ti("transcodeKTX2",Number.POSITIVE_INFINITY);Xp._readyPromise=void 0;function MZe(){let e=Xp._transcodeTaskProcessor.initWebAssemblyModule({wasmBinaryFile:"ThirdParty/basis_transcoder.wasm"}).then(function(t){if(t)return Xp._transcodeTaskProcessor;throw new ce("KTX2 transcoder could not be initialized.")});Xp._readyPromise=e}Xp.transcode=function(e,t){return l(Xp._readyPromise)||MZe(),Xp._readyPromise.then(function(n){let i=e;e instanceof ArrayBuffer&&(i=new Uint8Array(e));let o={supportedTargetFormats:t,ktx2Buffer:i};return n.scheduleTask(o,[i.buffer])}).then(function(n){let i=n.length,o=Object.keys(n[0]);for(let r=0;r>1^-(e&1)}So.zigZagDeltaDecode=function(e,t,n){let i=e.length,o=0,r=0,s=0;for(let a=0;a>11,u=c>>5&o,h=c&i,p=3*a;t[p]=d*r,t[p+1]=u*s,t[p+2]=h*r}return t};var Mn=So;var Cvt=T(S(),1);var hee=new m,fee=new m,pee=new m;function NZe(e,t,n,i,o){l(o)||(o=new m);let r,s,a,c,d,u,h,p;if(l(t.z)){if(m.equalsEpsilon(e,t,W.EPSILON14))return m.clone(m.UNIT_X,o);if(m.equalsEpsilon(e,n,W.EPSILON14))return m.clone(m.UNIT_Y,o);if(m.equalsEpsilon(e,i,W.EPSILON14))return m.clone(m.UNIT_Z,o);r=m.subtract(n,t,hee),s=m.subtract(i,t,fee),a=m.subtract(e,t,pee),c=m.dot(r,r),d=m.dot(r,s),u=m.dot(r,a),h=m.dot(s,s),p=m.dot(s,a)}else{if(D.equalsEpsilon(e,t,W.EPSILON14))return m.clone(m.UNIT_X,o);if(D.equalsEpsilon(e,n,W.EPSILON14))return m.clone(m.UNIT_Y,o);if(D.equalsEpsilon(e,i,W.EPSILON14))return m.clone(m.UNIT_Z,o);r=D.subtract(n,t,hee),s=D.subtract(i,t,fee),a=D.subtract(e,t,pee),c=D.dot(r,r),d=D.dot(r,s),u=D.dot(r,a),h=D.dot(s,s),p=D.dot(s,a)}o.y=h*u-d*p,o.z=c*p-d*u;let g=c*h-d*d;if(g!==0)return o.y/=g,o.z/=g,o.x=1-o.y-o.z,o}var Sx=NZe;var Zvt=T(S(),1);function uf(){this.high=m.clone(m.ZERO),this.low=m.clone(m.ZERO)}uf.encode=function(e,t){l(t)||(t={high:0,low:0});let n;return e>=0?(n=Math.floor(e/65536)*65536,t.high=n,t.low=e-n):(n=Math.floor(-e/65536)*65536,t.high=-n,t.low=e+n),t};var Wp={high:0,low:0};uf.fromCartesian=function(e,t){l(t)||(t=new uf);let n=t.high,i=t.low;return uf.encode(e.x,Wp),n.x=Wp.high,i.x=Wp.low,uf.encode(e.y,Wp),n.y=Wp.high,i.y=Wp.low,uf.encode(e.z,Wp),n.z=Wp.high,i.z=Wp.low,t};var mY=new uf;uf.writeElements=function(e,t,n){uf.fromCartesian(e,mY);let i=mY.high,o=mY.low;t[n]=i.x,t[n+1]=i.y,t[n+2]=i.z,t[n+3]=o.x,t[n+4]=o.y,t[n+5]=o.z};var Hn=uf;var Wvt=T(S(),1);var Ds={UNSIGNED_BYTE:ie.UNSIGNED_BYTE,UNSIGNED_SHORT:ie.UNSIGNED_SHORT,UNSIGNED_INT:ie.UNSIGNED_INT};Ds.getSizeInBytes=function(e){switch(e){case Ds.UNSIGNED_BYTE:return Uint8Array.BYTES_PER_ELEMENT;case Ds.UNSIGNED_SHORT:return Uint16Array.BYTES_PER_ELEMENT;case Ds.UNSIGNED_INT:return Uint32Array.BYTES_PER_ELEMENT}};Ds.fromSizeInBytes=function(e){switch(e){case 2:return Ds.UNSIGNED_SHORT;case 4:return Ds.UNSIGNED_INT;case 1:return Ds.UNSIGNED_BYTE}};Ds.validate=function(e){return l(e)&&(e===Ds.UNSIGNED_BYTE||e===Ds.UNSIGNED_SHORT||e===Ds.UNSIGNED_INT)};Ds.createTypedArray=function(e,t){return e>=W.SIXTY_FOUR_KILOBYTES?new Uint32Array(t):new Uint16Array(t)};Ds.createTypedArrayFromArrayBuffer=function(e,t,n,i){return e>=W.SIXTY_FOUR_KILOBYTES?new Uint32Array(t,n,i):new Uint16Array(t,n,i)};Ds.fromTypedArray=function(e){if(e instanceof Uint8Array)return Ds.UNSIGNED_BYTE;if(e instanceof Uint16Array)return Ds.UNSIGNED_SHORT;if(e instanceof Uint32Array)return Ds.UNSIGNED_INT};var Me=Object.freeze(Ds);var swt=T(S(),1);var wvt=T(S(),1);var hY={};hY.computeDiscriminant=function(e,t,n){return t*t-4*e*n};function bee(e,t,n){let i=e+t;return W.sign(e)!==W.sign(t)&&Math.abs(i/Math.max(Math.abs(e),Math.abs(t)))d&&d/c0?[a/e,n/a]:[n/a,a/e]};var Ac=hY;var Bvt=T(S(),1);var Mvt=T(S(),1);var pY={};pY.computeDiscriminant=function(e,t,n,i){let o=e*e,r=t*t,s=n*n,a=i*i;return 18*e*t*n*i+r*s-27*o*a-4*(e*s*n+r*t*i)};function fY(e,t,n,i){let o=e,r=t/3,s=n/3,a=i,c=o*s,d=r*a,u=r*r,h=s*s,p=o*s-u,g=o*a-r*s,f=r*a-h,x=4*p*f-g*g,_,C;if(x<0){let H,K,te;u*d>=c*h?(H=o,K=p,te=-2*r*p+o*g):(H=a,K=f,te=-a*g+2*s*f);let j=-(te<0?-1:1)*Math.abs(H)*Math.sqrt(-x);C=-te+j;let ee=C/2,pe=ee<0?-Math.pow(-ee,1/3):Math.pow(ee,1/3),_e=C===j?-pe:-K/pe;return _=K<=0?pe+_e:-te/(pe*pe+_e*_e+K),u*d>=c*h?[(_-r)/o]:[-a/(_+s)]}let V=p,L=-2*r*p+o*g,R=f,G=-a*g+2*s*f,I=Math.sqrt(x),v=Math.sqrt(3)/2,P=Math.abs(Math.atan2(o*I,-L)/3);_=2*Math.sqrt(-V);let w=Math.cos(P);C=_*w;let A=_*(-w/2-v*Math.sin(P)),b=C+A>2*r?C-r:A-r,Z=o,E=b/Z;P=Math.abs(Math.atan2(a*I,-G)/3),_=2*Math.sqrt(-R),w=Math.cos(P),C=_*w,A=_*(-w/2-v*Math.sin(P));let X=-a,F=C+A<2*s?C+s:A+s,N=X/F,O=Z*F,U=-b*F-Z*X,Y=b*X,k=(s*U-r*Y)/(-r*U+s*O);return E<=k?E<=N?k<=N?[E,k,N]:[E,N,k]:[N,E,k]:E<=N?[k,E,N]:k<=N?[k,N,E]:[N,k,E]}pY.computeRealRoots=function(e,t,n,i){let o,r;if(e===0)return Ac.computeRealRoots(t,n,i);if(t===0){if(n===0){if(i===0)return[0,0,0];r=-i/e;let s=r<0?-Math.pow(-r,1/3):Math.pow(r,1/3);return[s,s,s]}else if(i===0)return o=Ac.computeRealRoots(e,0,n),o.Length===0?[0]:[o[0],0,o[1]];return fY(e,0,n,i)}else{if(n===0)return i===0?(r=-t/e,r<0?[r,0,0]:[0,0,r]):fY(e,t,0,i);if(i===0)return o=Ac.computeRealRoots(e,t,n),o.length===0?[0]:o[1]<=0?[o[0],o[1],0]:o[0]>=0?[0,o[0],o[1]]:[o[0],0,o[1]]}return fY(e,t,n,i)};var Cx=pY;var bY={};bY.computeDiscriminant=function(e,t,n,i,o){let r=e*e,s=r*e,a=t*t,c=a*t,d=n*n,u=d*n,h=i*i,p=h*i,g=o*o,f=g*o;return a*d*h-4*c*p-4*e*u*h+18*e*t*n*p-27*r*h*h+256*s*f+o*(18*c*n*i-4*a*u+16*e*d*d-80*e*t*d*i-6*e*a*h+144*r*n*h)+g*(144*e*a*n-27*a*a-128*r*d-192*r*t*i)};function vm(e,t,n,i){let o=e*e,r=t-3*o/8,s=n-t*e/2+o*e/8,a=i-n*e/4+t*o/16-3*o*o/256,c=Cx.computeRealRoots(1,2*r,r*r-4*a,-s*s);if(c.length>0){let d=-e/4,u=c[c.length-1];if(Math.abs(u)=0&&g>=0){let x=Math.sqrt(p),_=Math.sqrt(g);return[d-_,d-x,d+x,d+_]}else{if(p>=0&&g<0)return f=Math.sqrt(p),[d-f,d+f];if(p<0&&g>=0)return f=Math.sqrt(g),[d-f,d+f]}}return[]}else if(u>0){let h=Math.sqrt(u),p=(r+u-s/h)/2,g=(r+u+s/h)/2,f=Ac.computeRealRoots(1,h,p),x=Ac.computeRealRoots(1,-h,g);return f.length!==0?(f[0]+=d,f[1]+=d,x.length!==0?(x[0]+=d,x[1]+=d,f[1]<=x[0]?[f[0],f[1],x[0],x[1]]:x[1]<=f[0]?[x[0],x[1],f[0],f[1]]:f[0]>=x[0]&&f[1]<=x[1]?[x[0],f[0],f[1],x[1]]:x[0]>=f[0]&&x[1]<=f[1]?[f[0],x[0],x[1],f[1]]:f[0]>x[0]&&f[0]0){let h=u[0],p=t-h,g=p*p,f=e/2,x=p/2,_=g-4*i,C=g+4*Math.abs(i),V=s-4*h,L=s+4*Math.abs(h),R,G;if(h<0||_*L=b[0]&&A[1]<=b[1]?[b[0],A[0],A[1],b[1]]:b[0]>=A[0]&&b[1]<=A[1]?[A[0],b[0],b[1],A[1]]:A[0]>b[0]&&A[0]u)||(p=m.cross(h,a,yee),f=m.dot(s,p),f<0||g+f>u))return;x=m.dot(c,p)/u}else{if(Math.abs(u)1||(p=m.cross(h,a,yee),f=m.dot(s,p)*_,f<0||g+f>1))return;x=m.dot(c,p)*_}return x};Do.rayTriangle=function(e,t,n,i,o,r){let s=Do.rayTriangleParametric(e,t,n,i,o);if(!(!l(s)||s<0))return l(r)||(r=new m),m.multiplyByScalar(e.direction,s,r),m.add(e.origin,r,r)};var DZe=new gn;Do.lineSegmentTriangle=function(e,t,n,i,o,r,s){let a=DZe;m.clone(e,a.origin),m.subtract(t,e,a.direction),m.normalize(a.direction,a.direction);let c=Do.rayTriangleParametric(a,n,i,o,r);if(!(!l(c)||c<0||c>m.distance(e,t)))return l(s)||(s=new m),m.multiplyByScalar(a.direction,c,s),m.add(a.origin,s,s)};function BZe(e,t,n,i){let o=t*t-4*e*n;if(o<0)return;if(o>0){let s=1/(2*e),a=Math.sqrt(o),c=(-t+a)*s,d=(-t-a)*s;return cs))return i.start=Math.max(i.start,0),i.stop=Math.min(i.stop,s),i};var HZe=new m,zZe=new m;Do.rayEllipsoid=function(e,t){let n=t.oneOverRadii,i=m.multiplyComponents(n,e.origin,HZe),o=m.multiplyComponents(n,e.direction,zZe),r=m.magnitudeSquared(i),s=m.dot(i,o),a,c,d,u,h;if(r>1){if(s>=0)return;let p=s*s;if(a=r-1,c=m.magnitudeSquared(o),d=c*a,pd){u=s*s-d,h=-s+Math.sqrt(u);let f=h/c,x=a/h;return f0?g.push(new m(i,o*w,o*-Z)):Z!==0?(g.push(new m(i,o*w,o*-Z)),g.push(new m(i,o*w,o*Z)),++P):g.push(new m(i,o*w,o*Z))}return g};var gY=new m,xee=new m,_ee=new m,JN=new m,KZe=new m,JZe=new $,QZe=new $,jZe=new $,qZe=new $,$Ze=new $,Tee=new $,See=new $,Cee=new m,eGe=new m,tGe=new he;Do.grazingAltitudeLocation=function(e,t){let n=e.origin,i=e.direction;if(!m.equals(n,m.ZERO)){let I=t.geodeticSurfaceNormal(n,gY);if(m.dot(i,I)>=0)return n}let o=l(this.rayEllipsoid(e,t)),r=t.transformPositionToScaledSpace(i,gY),s=m.normalize(r,r),a=m.mostOrthogonalAxis(r,JN),c=m.normalize(m.cross(a,s,xee),xee),d=m.normalize(m.cross(s,c,_ee),_ee),u=JZe;u[0]=s.x,u[1]=s.y,u[2]=s.z,u[3]=c.x,u[4]=c.y,u[5]=c.z,u[6]=d.x,u[7]=d.y,u[8]=d.z;let h=$.transpose(u,QZe),p=$.fromScale(t.radii,jZe),g=$.fromScale(t.oneOverRadii,qZe),f=$Ze;f[0]=0,f[1]=-i.z,f[2]=i.y,f[3]=i.z,f[4]=0,f[5]=-i.x,f[6]=-i.y,f[7]=i.x,f[8]=0;let x=$.multiply($.multiply(h,g,Tee),f,Tee),_=$.multiply($.multiply(x,p,See),u,See),C=$.multiplyByVector(x,n,KZe),V=Do.quadraticVectorExpression(_,m.negate(C,gY),0,0,1),L,R,G=V.length;if(G>0){let I=m.clone(m.ZERO,eGe),v=Number.NEGATIVE_INFINITY;for(let w=0;wv&&(v=b,I=m.clone(L,I))}let P=t.cartesianToCartographic(I,tGe);return v=W.clamp(v,0,1),R=m.magnitude(m.subtract(I,n,JN))*Math.sqrt(1-v*v),R=o?-R:R,P.height=R,t.cartographicToCartesian(P,new m)}};var nGe=new m;Do.lineSegmentPlane=function(e,t,n,i){l(i)||(i=new m);let o=m.subtract(t,e,nGe),r=n.normal,s=m.dot(r,o);if(Math.abs(s)1))return m.multiplyByScalar(o,c,i),m.add(e,i,i),i};Do.trianglePlaneIntersection=function(e,t,n,i){let o=i.normal,r=i.distance,s=m.dot(o,e)+r<0,a=m.dot(o,t)+r<0,c=m.dot(o,n)+r<0,d=0;d+=s?1:0,d+=a?1:0,d+=c?1:0;let u,h;if((d===1||d===2)&&(u=new m,h=new m),d===1){if(s)return Do.lineSegmentPlane(e,t,i,u),Do.lineSegmentPlane(e,n,i,h),{positions:[e,t,n,u,h],indices:[0,3,4,1,2,4,1,4,3]};if(a)return Do.lineSegmentPlane(t,n,i,u),Do.lineSegmentPlane(t,e,i,h),{positions:[e,t,n,u,h],indices:[1,3,4,2,0,4,2,4,3]};if(c)return Do.lineSegmentPlane(n,e,i,u),Do.lineSegmentPlane(n,t,i,h),{positions:[e,t,n,u,h],indices:[2,3,4,0,1,4,0,4,3]}}else if(d===2)if(s)if(a){if(!c)return Do.lineSegmentPlane(e,n,i,u),Do.lineSegmentPlane(t,n,i,h),{positions:[e,t,n,u,h],indices:[0,1,4,0,4,3,2,3,4]}}else return Do.lineSegmentPlane(n,t,i,u),Do.lineSegmentPlane(e,t,i,h),{positions:[e,t,n,u,h],indices:[2,0,4,2,4,3,1,3,4]};else return Do.lineSegmentPlane(t,e,i,u),Do.lineSegmentPlane(n,e,i,h),{positions:[e,t,n,u,h],indices:[1,2,4,1,4,3,0,3,4]}};var ti=Do;var mwt=T(S(),1);function Bs(e,t){this.normal=m.clone(e),this.distance=t}Bs.fromPointNormal=function(e,t,n){let i=-m.dot(t,e);return l(n)?(m.clone(t,n.normal),n.distance=i,n):new Bs(t,i)};var iGe=new m;Bs.fromCartesian4=function(e,t){let n=m.fromCartesian4(e,iGe),i=e.w;return l(t)?(m.clone(n,t.normal),t.distance=i,t):new Bs(n,i)};Bs.getPointDistance=function(e,t){return m.dot(e.normal,t)+e.distance};var oGe=new m;Bs.projectPointOntoPlane=function(e,t,n){l(n)||(n=new m);let i=Bs.getPointDistance(e,t),o=m.multiplyByScalar(e.normal,i,oGe);return m.subtract(t,o,n)};var rGe=new M,sGe=new re,aGe=new m;Bs.transform=function(e,t,n){let i=e.normal,o=e.distance,r=M.inverseTranspose(t,rGe),s=re.fromElements(i.x,i.y,i.z,o,sGe);s=M.multiplyByVector(r,s,s);let a=m.fromCartesian4(s,aGe);return s=re.divideByScalar(s,m.magnitude(a),s),Bs.fromCartesian4(s,n)};Bs.clone=function(e,t){return l(t)?(m.clone(e.normal,t.normal),t.distance=e.distance,t):new Bs(e.normal,e.distance)};Bs.equals=function(e,t){return e.distance===t.distance&&m.equals(e.normal,t.normal)};Bs.ORIGIN_XY_PLANE=Object.freeze(new Bs(m.UNIT_Z,0));Bs.ORIGIN_YZ_PLANE=Object.freeze(new Bs(m.UNIT_X,0));Bs.ORIGIN_ZX_PLANE=Object.freeze(new Bs(m.UNIT_Y,0));var cn=Bs;var bwt=T(S(),1);var yY={};yY.calculateACMR=function(e){e=y(e,y.EMPTY_OBJECT);let t=e.indices,n=e.maximumIndex,i=y(e.cacheSize,24),o=t.length;if(!l(n)){n=0;let a=0,c=t[a];for(;an&&(n=c),++a,c=t[a]}let r=[];for(let a=0;ai&&(r[t[a]]=s,++s);return(s-i+1)/(o/3)};yY.tipsify=function(e){e=y(e,y.EMPTY_OBJECT);let t=e.indices,n=e.maximumIndex,i=y(e.cacheSize,24),o;function r(b,Z,E,X){for(;Z.length>=1;){let F=Z[Z.length-1];if(Z.splice(Z.length-1,1),b[F].numLiveTriangles>0)return F}for(;o0)return++o,o-1;++o}return-1}function s(b,Z,E,X,F,N,O){let U=-1,Y,k=-1,H=0;for(;Hk||k===-1)&&(k=Y,U=K)),++H}return U===-1?r(X,N,b,O):U}let a=t.length,c=0,d=0,u=t[d],h=a;if(l(n))c=n+1;else{for(;dc&&(c=u),++d,u=t[d];if(c===-1)return 0;++c}let p=[],g;for(g=0;gi&&(L.timeStamp=_,++_),++d}x=s(t,i,C,p,_,V,c)}return I};var FR=yY;var Mc={};function n5(e,t,n,i,o){e[t++]=n,e[t++]=i,e[t++]=i,e[t++]=o,e[t++]=o,e[t]=n}function cGe(e){let t=e.length,n=t/3*6,i=Me.createTypedArray(t,n),o=0;for(let r=0;r=3){let n=(t-2)*6,i=Me.createTypedArray(t,n);n5(i,0,e[0],e[1],e[2]);let o=6;for(let r=3;r0){let t=e.length-1,n=(t-1)*6,i=Me.createTypedArray(t,n),o=e[0],r=0;for(let s=1;so&&(o=n[r]);e.indices=FR.tipsify({indices:n,maximumIndex:o,cacheSize:t})}return e};function Ree(e){let t={};for(let n in e)if(e.hasOwnProperty(n)&&l(e[n])&&l(e[n].values)){let i=e[n];t[n]=new Ze({componentDatatype:i.componentDatatype,componentsPerAttribute:i.componentsPerAttribute,normalize:i.normalize,values:[]})}return t}function uGe(e,t,n){for(let i in t)if(t.hasOwnProperty(i)&&l(t[i])&&l(t[i].values)){let o=t[i];for(let r=0;r=W.SIXTY_FOUR_KILOBYTES){let i=[],o=[],r=0,s=Ree(e.attributes),a=e.indices,c=a.length,d;e.primitiveType===Ae.TRIANGLES?d=3:e.primitiveType===Ae.LINES?d=2:e.primitiveType===Ae.POINTS&&(d=1);for(let u=0;u=W.SIXTY_FOUR_KILOBYTES&&(t.push(new mt({attributes:s,indices:o,primitiveType:e.primitiveType,boundingSphere:e.boundingSphere,boundingSphereCV:e.boundingSphereCV})),i=[],o=[],r=0,s=Ree(e.attributes))}o.length!==0&&t.push(new mt({attributes:s,indices:o,primitiveType:e.primitiveType,boundingSphere:e.boundingSphere,boundingSphereCV:e.boundingSphereCV}))}else t.push(e);return t};var Zee=new m,mGe=new he;Mc.projectTo2D=function(e,t,n,i,o){let r=e.attributes[t];o=l(o)?o:new Ii;let s=o.ellipsoid,a=r.values,c=new Float64Array(a.length),d=0;for(let u=0;u_&&(_=V)}return new mt({attributes:u,indices:f,primitiveType:d,boundingSphere:l(x)?new de(x,_):void 0})}Mc.combineInstances=function(e){let t=[],n=[],i=e.length;for(let r=0;r0&&o.push(SY(t,"geometry")),n.length>0&&(o.push(SY(n,"westHemisphereGeometry")),o.push(SY(n,"eastHemisphereGeometry"))),o};var Su=new m,AR=new m,fC=new m,pC=new m;Mc.computeNormal=function(e){let t=e.indices,n=e.attributes,i=n.position.values,o=n.position.values.length/3,r=t.length,s=new Array(o),a=new Array(r/3),c=new Array(r),d;for(d=0;d0){for(u=0;u3&&(n[3]=0,n[4]=2,n[5]=3);let i=6;for(let o=3;oo?i>r?s=W.sign(e.y):s=W.sign(n.y):o>r?s=W.sign(t.y):s=W.sign(n.y);let a=s<0;J0(e,a),J0(t,a),J0(n,a)}var Xee=new m;function Cu(e,t,n,i){m.add(e,m.multiplyByScalar(m.subtract(t,e,Xee),e.y/(e.y-t.y),Xee),n),m.clone(n,i),J0(n,!0),J0(i,!1)}var Lx=new m,Rx=new m,Zx=new m,Gx=new m,CY={positions:new Array(7),indices:new Array(3*3)};function LGe(e,t,n){if(e.x>=0||t.x>=0||n.x>=0)return;VGe(e,t,n);let i=e.y<0,o=t.y<0,r=n.y<0,s=0;s+=i?1:0,s+=o?1:0,s+=r?1:0;let a=CY.indices;s===1?(a[1]=3,a[2]=4,a[5]=6,a[7]=6,a[8]=5,i?(Cu(e,t,Lx,Zx),Cu(e,n,Rx,Gx),a[0]=0,a[3]=1,a[4]=2,a[6]=1):o?(Cu(t,n,Lx,Zx),Cu(t,e,Rx,Gx),a[0]=1,a[3]=2,a[4]=0,a[6]=2):r&&(Cu(n,e,Lx,Zx),Cu(n,t,Rx,Gx),a[0]=2,a[3]=0,a[4]=1,a[6]=0)):s===2&&(a[2]=4,a[4]=4,a[5]=3,a[7]=5,a[8]=6,i?o?r||(Cu(n,e,Lx,Zx),Cu(n,t,Rx,Gx),a[0]=0,a[1]=1,a[3]=0,a[6]=2):(Cu(t,n,Lx,Zx),Cu(t,e,Rx,Gx),a[0]=2,a[1]=0,a[3]=2,a[6]=1):(Cu(e,t,Lx,Zx),Cu(e,n,Rx,Gx),a[0]=1,a[1]=2,a[3]=1,a[6]=0));let c=CY.positions;return c[0]=e,c[1]=t,c[2]=n,c.length=3,(s===1||s===2)&&(c[3]=Lx,c[4]=Rx,c[5]=Zx,c[6]=Gx,c.length=7),CY}function Wee(e,t){let n=e.attributes;if(n.position.values.length===0)return;for(let o in n)if(n.hasOwnProperty(o)&&l(n[o])&&l(n[o].values)){let r=n[o];r.values=Q.createTypedArray(r.componentDatatype,r.values)}let i=mt.computeNumberOfVertices(e);return e.indices=Me.createTypedArray(i,e.indices),t&&(e.boundingSphere=de.fromVertices(n.position.values)),e}function gC(e){let t=e.attributes,n={};for(let i in t)if(t.hasOwnProperty(i)&&l(t[i])&&l(t[i].values)){let o=t[i];n[i]=new Ze({componentDatatype:o.componentDatatype,componentsPerAttribute:o.componentsPerAttribute,normalize:o.normalize,values:[]})}return new mt({attributes:n,indices:[],primitiveType:e.primitiveType})}function ZY(e,t,n){let i=l(e.geometry.boundingSphere);t=Wee(t,i),n=Wee(n,i),l(n)&&!l(t)?e.geometry=n:!l(n)&&l(t)?e.geometry=t:(e.westHemisphereGeometry=t,e.eastHemisphereGeometry=n,e.geometry=void 0)}function GY(e,t){let n=new e,i=new e,o=new e;return function(r,s,a,c,d,u,h,p){let g=e.fromArray(d,r*t,n),f=e.fromArray(d,s*t,i),x=e.fromArray(d,a*t,o);e.multiplyByScalar(g,c.x,g),e.multiplyByScalar(f,c.y,f),e.multiplyByScalar(x,c.z,x);let _=e.add(g,f,g);e.add(_,x,_),p&&e.normalize(_,_),e.pack(_,u,h*t)}}var RGe=GY(re,4),t5=GY(m,3),Mee=GY(D,2),ZGe=function(e,t,n,i,o,r,s){let a=o[e]*i.x,c=o[t]*i.y,d=o[n]*i.z;r[s]=a+c+d>W.EPSILON6?1:0},NR=new m,VY=new m,LY=new m,GGe=new m;function $N(e,t,n,i,o,r,s,a,c,d,u,h,p,g,f,x){if(!l(r)&&!l(s)&&!l(a)&&!l(c)&&!l(d)&&g===0)return;let _=m.fromArray(o,e*3,NR),C=m.fromArray(o,t*3,VY),V=m.fromArray(o,n*3,LY),L=Sx(i,_,C,V,GGe);if(l(L)){if(l(r)&&t5(e,t,n,L,r,h.normal.values,x,!0),l(d)){let R=m.fromArray(d,e*3,NR),G=m.fromArray(d,t*3,VY),I=m.fromArray(d,n*3,LY);m.multiplyByScalar(R,L.x,R),m.multiplyByScalar(G,L.y,G),m.multiplyByScalar(I,L.z,I);let v;!m.equals(R,m.ZERO)||!m.equals(G,m.ZERO)||!m.equals(I,m.ZERO)?(v=m.add(R,G,R),m.add(v,I,v),m.normalize(v,v)):(v=NR,v.x=0,v.y=0,v.z=0),m.pack(v,h.extrudeDirection.values,x*3)}if(l(u)&&ZGe(e,t,n,L,u,h.applyOffset.values,x),l(s)&&t5(e,t,n,L,s,h.tangent.values,x,!0),l(a)&&t5(e,t,n,L,a,h.bitangent.values,x,!0),l(c)&&Mee(e,t,n,L,c,h.st.values,x),g>0)for(let R=0;R3){let X=E.positions,F=E.indices,N=F.length;for(let O=0;O0)continue;let c=m.unpack(i,s,Uee);(a.y<0&&c.y>0||a.y>0&&c.y<0)&&(s-3>0?(i[s]=n[s-3],i[s+1]=n[s-2],i[s+2]=n[s-1]):m.pack(a,i,s));let d=m.unpack(o,s,RY);(a.y<0&&d.y>0||a.y>0&&d.y<0)&&(s+30||de.intersectPlane(n,cn.ORIGIN_ZX_PLANE)!==zt.INTERSECTING))return e;if(t.geometryType!==Tu.NONE)switch(t.geometryType){case Tu.POLYLINES:MGe(e);break;case Tu.TRIANGLES:Pee(e);break;case Tu.LINES:vee(e);break}else CGe(t),t.primitiveType===Ae.TRIANGLES?Pee(e):t.primitiveType===Ae.LINES&&vee(e);return e};var Nn=Mc;var Jwt=T(S(),1);var Ywt=T(S(),1);var fi={UNSIGNED_BYTE:ie.UNSIGNED_BYTE,UNSIGNED_SHORT:ie.UNSIGNED_SHORT,UNSIGNED_INT:ie.UNSIGNED_INT,FLOAT:ie.FLOAT,HALF_FLOAT:ie.HALF_FLOAT_OES,UNSIGNED_INT_24_8:ie.UNSIGNED_INT_24_8,UNSIGNED_SHORT_4_4_4_4:ie.UNSIGNED_SHORT_4_4_4_4,UNSIGNED_SHORT_5_5_5_1:ie.UNSIGNED_SHORT_5_5_5_1,UNSIGNED_SHORT_5_6_5:ie.UNSIGNED_SHORT_5_6_5};fi.toWebGLConstant=function(e,t){switch(e){case fi.UNSIGNED_BYTE:return ie.UNSIGNED_BYTE;case fi.UNSIGNED_SHORT:return ie.UNSIGNED_SHORT;case fi.UNSIGNED_INT:return ie.UNSIGNED_INT;case fi.FLOAT:return ie.FLOAT;case fi.HALF_FLOAT:return t.webgl2?ie.HALF_FLOAT:ie.HALF_FLOAT_OES;case fi.UNSIGNED_INT_24_8:return ie.UNSIGNED_INT_24_8;case fi.UNSIGNED_SHORT_4_4_4_4:return ie.UNSIGNED_SHORT_4_4_4_4;case fi.UNSIGNED_SHORT_5_5_5_1:return ie.UNSIGNED_SHORT_5_5_5_1;case fi.UNSIGNED_SHORT_5_6_5:return fi.UNSIGNED_SHORT_5_6_5}};fi.isPacked=function(e){return e===fi.UNSIGNED_INT_24_8||e===fi.UNSIGNED_SHORT_4_4_4_4||e===fi.UNSIGNED_SHORT_5_5_5_1||e===fi.UNSIGNED_SHORT_5_6_5};fi.sizeInBytes=function(e){switch(e){case fi.UNSIGNED_BYTE:return 1;case fi.UNSIGNED_SHORT:case fi.UNSIGNED_SHORT_4_4_4_4:case fi.UNSIGNED_SHORT_5_5_5_1:case fi.UNSIGNED_SHORT_5_6_5:case fi.HALF_FLOAT:return 2;case fi.UNSIGNED_INT:case fi.FLOAT:case fi.UNSIGNED_INT_24_8:return 4}};fi.validate=function(e){return e===fi.UNSIGNED_BYTE||e===fi.UNSIGNED_SHORT||e===fi.UNSIGNED_INT||e===fi.FLOAT||e===fi.HALF_FLOAT||e===fi.UNSIGNED_INT_24_8||e===fi.UNSIGNED_SHORT_4_4_4_4||e===fi.UNSIGNED_SHORT_5_5_5_1||e===fi.UNSIGNED_SHORT_5_6_5};fi.getTypedArrayConstructor=function(e){let t=fi.sizeInBytes(e);return t===Uint8Array.BYTES_PER_ELEMENT?Uint8Array:t===Uint16Array.BYTES_PER_ELEMENT?Uint16Array:t===Float32Array.BYTES_PER_ELEMENT&&e===fi.FLOAT?Float32Array:Uint32Array};var je=Object.freeze(fi);var st={DEPTH_COMPONENT:ie.DEPTH_COMPONENT,DEPTH_STENCIL:ie.DEPTH_STENCIL,ALPHA:ie.ALPHA,RED:ie.RED,R:ie.RED,RG:ie.RG,RGB:ie.RGB,RGBA:ie.RGBA,LUMINANCE:ie.LUMINANCE,LUMINANCE_ALPHA:ie.LUMINANCE_ALPHA,RGB_DXT1:ie.COMPRESSED_RGB_S3TC_DXT1_EXT,RGBA_DXT1:ie.COMPRESSED_RGBA_S3TC_DXT1_EXT,RGBA_DXT3:ie.COMPRESSED_RGBA_S3TC_DXT3_EXT,RGBA_DXT5:ie.COMPRESSED_RGBA_S3TC_DXT5_EXT,RGB_PVRTC_4BPPV1:ie.COMPRESSED_RGB_PVRTC_4BPPV1_IMG,RGB_PVRTC_2BPPV1:ie.COMPRESSED_RGB_PVRTC_2BPPV1_IMG,RGBA_PVRTC_4BPPV1:ie.COMPRESSED_RGBA_PVRTC_4BPPV1_IMG,RGBA_PVRTC_2BPPV1:ie.COMPRESSED_RGBA_PVRTC_2BPPV1_IMG,RGBA_ASTC:ie.COMPRESSED_RGBA_ASTC_4x4_WEBGL,RGB_ETC1:ie.COMPRESSED_RGB_ETC1_WEBGL,RGB8_ETC2:ie.COMPRESSED_RGB8_ETC2,RGBA8_ETC2_EAC:ie.COMPRESSED_RGBA8_ETC2_EAC,RGBA_BC7:ie.COMPRESSED_RGBA_BPTC_UNORM};st.componentsLength=function(e){switch(e){case st.RGB:return 3;case st.RGBA:return 4;case st.LUMINANCE_ALPHA:case st.RG:return 2;case st.ALPHA:case st.RED:case st.LUMINANCE:return 1;case st.R:return 4;default:return 1}};st.validate=function(e){return e===st.DEPTH_COMPONENT||e===st.DEPTH_STENCIL||e===st.ALPHA||e===st.RED||e===st.RG||e===st.RGB||e===st.RGBA||e===st.LUMINANCE||e===st.LUMINANCE_ALPHA||e===st.RGB_DXT1||e===st.RGBA_DXT1||e===st.RGBA_DXT3||e===st.RGBA_DXT5||e===st.RGB_PVRTC_4BPPV1||e===st.RGB_PVRTC_2BPPV1||e===st.RGBA_PVRTC_4BPPV1||e===st.RGBA_PVRTC_2BPPV1||e===st.RGBA_ASTC||e===st.RGB_ETC1||e===st.RGB8_ETC2||e===st.RGBA8_ETC2_EAC||e===st.RGBA_BC7||e===st.R};st.isColorFormat=function(e){return e===st.RED||e===st.ALPHA||e===st.RGB||e===st.RGBA||e===st.LUMINANCE||e===st.LUMINANCE_ALPHA||e===st.R};st.isDepthFormat=function(e){return e===st.DEPTH_COMPONENT||e===st.DEPTH_STENCIL};st.isCompressedFormat=function(e){return e===st.RGB_DXT1||e===st.RGBA_DXT1||e===st.RGBA_DXT3||e===st.RGBA_DXT5||e===st.RGB_PVRTC_4BPPV1||e===st.RGB_PVRTC_2BPPV1||e===st.RGBA_PVRTC_4BPPV1||e===st.RGBA_PVRTC_2BPPV1||e===st.RGBA_ASTC||e===st.RGB_ETC1||e===st.RGB8_ETC2||e===st.RGBA8_ETC2_EAC||e===st.RGBA_BC7};st.isDXTFormat=function(e){return e===st.RGB_DXT1||e===st.RGBA_DXT1||e===st.RGBA_DXT3||e===st.RGBA_DXT5};st.isPVRTCFormat=function(e){return e===st.RGB_PVRTC_4BPPV1||e===st.RGB_PVRTC_2BPPV1||e===st.RGBA_PVRTC_4BPPV1||e===st.RGBA_PVRTC_2BPPV1};st.isASTCFormat=function(e){return e===st.RGBA_ASTC};st.isETC1Format=function(e){return e===st.RGB_ETC1};st.isETC2Format=function(e){return e===st.RGB8_ETC2||e===st.RGBA8_ETC2_EAC};st.isBC7Format=function(e){return e===st.RGBA_BC7};st.compressedTextureSizeInBytes=function(e,t,n){switch(e){case st.RGB_DXT1:case st.RGBA_DXT1:case st.RGB_ETC1:case st.RGB8_ETC2:return Math.floor((t+3)/4)*Math.floor((n+3)/4)*8;case st.RGBA_DXT3:case st.RGBA_DXT5:case st.RGBA_ASTC:case st.RGBA8_ETC2_EAC:return Math.floor((t+3)/4)*Math.floor((n+3)/4)*16;case st.RGB_PVRTC_4BPPV1:case st.RGBA_PVRTC_4BPPV1:return Math.floor((Math.max(t,8)*Math.max(n,8)*4+7)/8);case st.RGB_PVRTC_2BPPV1:case st.RGBA_PVRTC_2BPPV1:return Math.floor((Math.max(t,16)*Math.max(n,8)*2+7)/8);case st.RGBA_BC7:return Math.ceil(t/4)*Math.ceil(n/4)*16;default:return 0}};st.textureSizeInBytes=function(e,t,n,i){let o=st.componentsLength(e);return je.isPacked(t)&&(o=1),o*je.sizeInBytes(t)*n*i};st.alignmentInBytes=function(e,t,n){let i=st.textureSizeInBytes(e,t,n,1)%4;return i===0?4:i===2?2:1};st.createTypedArray=function(e,t,n,i){let o=je.getTypedArrayConstructor(t),r=st.componentsLength(e)*n*i;return new o(r)};st.flipY=function(e,t,n,i,o){if(o===1)return e;let r=st.createTypedArray(t,n,i,o),s=st.componentsLength(t),a=i*s;for(let c=0;c0&&(i.glVertexAttribDivisor(d,this.instanceDivisor),i._vertexAttribDivisors[d]=this.instanceDivisor,i._previousDrawInstanced=!0)},a.disableVertexAttribArray=function(c){c.disableVertexAttribArray(this.index),this.instanceDivisor>0&&i.glVertexAttribDivisor(n,0)};else{switch(a.componentsPerAttribute){case 1:a.vertexAttrib=function(c){c.vertexAttrib1fv(this.index,this.value)};break;case 2:a.vertexAttrib=function(c){c.vertexAttrib2fv(this.index,this.value)};break;case 3:a.vertexAttrib=function(c){c.vertexAttrib3fv(this.index,this.value)};break;case 4:a.vertexAttrib=function(c){c.vertexAttrib4fv(this.index,this.value)};break}a.disableVertexAttribArray=function(c){}}e.push(a)}function Bee(e,t,n){for(let i=0;i0&&(c=!0),l(s[r].value)&&(d=!0);let h;t.vertexArrayObject&&(h=t.glCreateVertexArray(),t.glBindVertexArray(h),Bee(n,s,o),t.glBindVertexArray(null)),this._numberOfVertices=a,this._hasInstancedAttributes=c,this._hasConstantAttributes=d,this._context=t,this._gl=n,this._vao=h,this._attributes=s,this._indexBuffer=o}function Dee(e){return e.values.length/e.componentsPerAttribute}function kGe(e){return Q.getSizeInBytes(e.componentDatatype)*e.componentsPerAttribute}function UGe(e){let t,n,i,o=[];for(n in e)e.hasOwnProperty(n)&&l(e[n])&&l(e[n].values)&&(o.push(n),e[n].componentDatatype===Q.DOUBLE&&(e[n].componentDatatype=Q.FLOAT,e[n].values=Q.createTypedArray(Q.FLOAT,e[n].values)));let r,s=o.length;if(s>0)for(r=Dee(e[o[0]]),t=1;t0){let d=Q.getSizeInBytes(e[o[0]].componentDatatype),u=a%d;u!==0&&(a+=d-u);let h=r*a,p=new ArrayBuffer(h),g={};for(t=0;t=W.SIXTY_FOUR_KILOBYTES&&t.elementIndexUint?p=St.createIndexBuffer({context:t,typedArray:new Uint32Array(g),usage:i,indexDatatype:Me.UNSIGNED_INT}):p=St.createIndexBuffer({context:t,typedArray:new Uint16Array(g),usage:i,indexDatatype:Me.UNSIGNED_SHORT})),new Pp({context:t,attributes:u,indexBuffer:p})};Object.defineProperties(Pp.prototype,{numberOfAttributes:{get:function(){return this._attributes.length}},numberOfVertices:{get:function(){return this._numberOfVertices}},indexBuffer:{get:function(){return this._indexBuffer}}});Pp.prototype.getAttribute=function(e){return this._attributes[e]};function DGe(e){let t=e._context,n=e._hasInstancedAttributes;if(!n&&!t._previousDrawInstanced)return;t._previousDrawInstanced=n;let i=t._vertexAttribDivisors,o=e._attributes,r=Mt.maximumVertexAttributes,s;if(n){let a=o.length;for(s=0;s0&&(t.glVertexAttribDivisor(s,0),i[s]=0)}function BGe(e,t){let n=e._attributes,i=n.length;for(let o=0;o maxHeight) { material.diffuse = vec3(0.0); material.alpha = 0.0; return material; } // Binary search to find heights above and below. int idxBelow = 0; int idxAbove = heightsDimensions.x; float heightBelow = minHeight; float heightAbove = maxHeight; // while loop not allowed, so use for loop with max iterations. // maxIterations of 16 supports a texture size up to 65536 (2^16). const int maxIterations = 16; for (int i = 0; i < maxIterations; i++) { if (idxBelow >= idxAbove - 1) { break; } int idxMid = (idxBelow + idxAbove) / 2; float heightTex = getHeight(idxMid, invTexSize); if (height > heightTex) { idxBelow = idxMid; heightBelow = heightTex; } else { idxAbove = idxMid; heightAbove = heightTex; } } float lerper = heightBelow == heightAbove ? 1.0 : (height - heightBelow) / (heightAbove - heightBelow); vec2 colorUv = vec2(invTexSize * (float(idxBelow) + 0.5 + lerper), 0.5); vec4 color = texture(colors, colorUv); // undo preumultiplied alpha if (color.a > 0.0) { color.rgb /= color.a; } color.rgb = czm_gammaCorrect(color.rgb); material.diffuse = color.rgb; material.alpha = color.a; return material; } `;var DAt=T(S(),1),KR=`uniform vec4 color; uniform float spacing; uniform float width; czm_material czm_getMaterial(czm_materialInput materialInput) { czm_material material = czm_getDefaultMaterial(materialInput); float distanceToContour = mod(materialInput.height, spacing); #if (__VERSION__ == 300 || defined(GL_OES_standard_derivatives)) float dxc = abs(dFdx(materialInput.height)); float dyc = abs(dFdy(materialInput.height)); float dF = max(dxc, dyc) * czm_pixelRatio * width; float alpha = (distanceToContour < dF) ? 1.0 : 0.0; #else // If no derivatives available (IE 10?), use pixel ratio float alpha = (distanceToContour < (czm_pixelRatio * width)) ? 1.0 : 0.0; #endif vec4 outColor = czm_gammaCorrect(vec4(color.rgb, alpha * color.a)); material.diffuse = outColor.rgb; material.alpha = outColor.a; return material; } `;var OAt=T(S(),1),JR=`uniform sampler2D image; uniform float minimumHeight; uniform float maximumHeight; czm_material czm_getMaterial(czm_materialInput materialInput) { czm_material material = czm_getDefaultMaterial(materialInput); float scaledHeight = clamp((materialInput.height - minimumHeight) / (maximumHeight - minimumHeight), 0.0, 1.0); vec4 rampColor = texture(image, vec2(scaledHeight, 0.5)); rampColor = czm_gammaCorrect(rampColor); material.diffuse = rampColor.rgb; material.alpha = rampColor.a; return material; } `;var HAt=T(S(),1),QR=`uniform vec4 fadeInColor; uniform vec4 fadeOutColor; uniform float maximumDistance; uniform bool repeat; uniform vec2 fadeDirection; uniform vec2 time; float getTime(float t, float coord) { float scalar = 1.0 / maximumDistance; float q = distance(t, coord) * scalar; if (repeat) { float r = distance(t, coord + 1.0) * scalar; float s = distance(t, coord - 1.0) * scalar; q = min(min(r, s), q); } return clamp(q, 0.0, 1.0); } czm_material czm_getMaterial(czm_materialInput materialInput) { czm_material material = czm_getDefaultMaterial(materialInput); vec2 st = materialInput.st; float s = getTime(time.x, st.s) * fadeDirection.s; float t = getTime(time.y, st.t) * fadeDirection.t; float u = length(vec2(s, t)); vec4 color = mix(fadeInColor, fadeOutColor, u); color = czm_gammaCorrect(color); material.emission = color.rgb; material.alpha = color.a; return material; } `;var KAt=T(S(),1),jR=`uniform vec4 color; uniform float cellAlpha; uniform vec2 lineCount; uniform vec2 lineThickness; uniform vec2 lineOffset; czm_material czm_getMaterial(czm_materialInput materialInput) { czm_material material = czm_getDefaultMaterial(materialInput); vec2 st = materialInput.st; float scaledWidth = fract(lineCount.s * st.s - lineOffset.s); scaledWidth = abs(scaledWidth - floor(scaledWidth + 0.5)); float scaledHeight = fract(lineCount.t * st.t - lineOffset.t); scaledHeight = abs(scaledHeight - floor(scaledHeight + 0.5)); float value; // Fuzz Factor - Controls blurriness of lines #if (__VERSION__ == 300 || defined(GL_OES_standard_derivatives)) const float fuzz = 1.2; vec2 thickness = (lineThickness * czm_pixelRatio) - 1.0; // From "3D Engine Design for Virtual Globes" by Cozzi and Ring, Listing 4.13. vec2 dx = abs(dFdx(st)); vec2 dy = abs(dFdy(st)); vec2 dF = vec2(max(dx.s, dy.s), max(dx.t, dy.t)) * lineCount; value = min( smoothstep(dF.s * thickness.s, dF.s * (fuzz + thickness.s), scaledWidth), smoothstep(dF.t * thickness.t, dF.t * (fuzz + thickness.t), scaledHeight)); #else // If no derivatives available (IE 10?), revert to view-dependent fuzz const float fuzz = 0.05; vec2 range = 0.5 - (lineThickness * 0.05); value = min( 1.0 - smoothstep(range.s, range.s + fuzz, scaledWidth), 1.0 - smoothstep(range.t, range.t + fuzz, scaledHeight)); #endif // Edges taken from RimLightingMaterial.glsl // See http://www.fundza.com/rman_shaders/surface/fake_rim/fake_rim1.html float dRim = 1.0 - abs(dot(materialInput.normalEC, normalize(materialInput.positionToEyeEC))); float sRim = smoothstep(0.8, 1.0, dRim); value *= (1.0 - sRim); vec4 halfColor; halfColor.rgb = color.rgb * 0.5; halfColor.a = color.a * (1.0 - ((1.0 - cellAlpha) * value)); halfColor = czm_gammaCorrect(halfColor); material.diffuse = halfColor.rgb; material.emission = halfColor.rgb; material.alpha = halfColor.a; return material; } `;var QAt=T(S(),1),qR=`uniform sampler2D image; uniform float strength; uniform vec2 repeat; czm_material czm_getMaterial(czm_materialInput materialInput) { czm_material material = czm_getDefaultMaterial(materialInput); vec4 textureValue = texture(image, fract(repeat * materialInput.st)); vec3 normalTangentSpace = textureValue.channels; normalTangentSpace.xy = normalTangentSpace.xy * 2.0 - 1.0; normalTangentSpace.z = clamp(1.0 - strength, 0.1, 1.0); normalTangentSpace = normalize(normalTangentSpace); vec3 normalEC = materialInput.tangentToEyeMatrix * normalTangentSpace; material.normal = normalEC; return material; } `;var qAt=T(S(),1),$R=`uniform vec4 color; float getPointOnLine(vec2 p0, vec2 p1, float x) { float slope = (p0.y - p1.y) / (p0.x - p1.x); return slope * (x - p0.x) + p0.y; } czm_material czm_getMaterial(czm_materialInput materialInput) { czm_material material = czm_getDefaultMaterial(materialInput); vec2 st = materialInput.st; #if (__VERSION__ == 300 || defined(GL_OES_standard_derivatives)) float base = 1.0 - abs(fwidth(st.s)) * 10.0 * czm_pixelRatio; #else // If no derivatives available (IE 10?), 2.5% of the line will be the arrow head float base = 0.975; #endif vec2 center = vec2(1.0, 0.5); float ptOnUpperLine = getPointOnLine(vec2(base, 1.0), center, st.s); float ptOnLowerLine = getPointOnLine(vec2(base, 0.0), center, st.s); float halfWidth = 0.15; float s = step(0.5 - halfWidth, st.t); s *= 1.0 - step(0.5 + halfWidth, st.t); s *= 1.0 - step(base, st.s); float t = step(base, materialInput.st.s); t *= 1.0 - step(ptOnUpperLine, st.t); t *= step(ptOnLowerLine, st.t); // Find the distance from the closest separator (region between two colors) float dist; if (st.s < base) { float d1 = abs(st.t - (0.5 - halfWidth)); float d2 = abs(st.t - (0.5 + halfWidth)); dist = min(d1, d2); } else { float d1 = czm_infinity; if (st.t < 0.5 - halfWidth && st.t > 0.5 + halfWidth) { d1 = abs(st.s - base); } float d2 = abs(st.t - ptOnUpperLine); float d3 = abs(st.t - ptOnLowerLine); dist = min(min(d1, d2), d3); } vec4 outsideColor = vec4(0.0); vec4 currentColor = mix(outsideColor, color, clamp(s + t, 0.0, 1.0)); vec4 outColor = czm_antialias(outsideColor, color, currentColor, dist); outColor = czm_gammaCorrect(outColor); material.diffuse = outColor.rgb; material.alpha = outColor.a; return material; } `;var eMt=T(S(),1),eZ=`uniform vec4 color; uniform vec4 gapColor; uniform float dashLength; uniform float dashPattern; in float v_polylineAngle; const float maskLength = 16.0; mat2 rotate(float rad) { float c = cos(rad); float s = sin(rad); return mat2( c, s, -s, c ); } czm_material czm_getMaterial(czm_materialInput materialInput) { czm_material material = czm_getDefaultMaterial(materialInput); vec2 pos = rotate(v_polylineAngle) * gl_FragCoord.xy; // Get the relative position within the dash from 0 to 1 float dashPosition = fract(pos.x / (dashLength * czm_pixelRatio)); // Figure out the mask index. float maskIndex = floor(dashPosition * maskLength); // Test the bit mask. float maskTest = floor(dashPattern / pow(2.0, maskIndex)); vec4 fragColor = (mod(maskTest, 2.0) < 1.0) ? gapColor : color; if (fragColor.a < 0.005) { // matches 0/255 and 1/255 discard; } fragColor = czm_gammaCorrect(fragColor); material.emission = fragColor.rgb; material.alpha = fragColor.a; return material; } `;var nMt=T(S(),1),tZ=`uniform vec4 color; uniform float glowPower; uniform float taperPower; czm_material czm_getMaterial(czm_materialInput materialInput) { czm_material material = czm_getDefaultMaterial(materialInput); vec2 st = materialInput.st; float glow = glowPower / abs(st.t - 0.5) - (glowPower / 0.5); if (taperPower <= 0.99999) { glow *= min(1.0, taperPower / (0.5 - st.s * 0.5) - (taperPower / 0.5)); } vec4 fragColor; fragColor.rgb = max(vec3(glow - 1.0 + color.rgb), color.rgb); fragColor.a = clamp(0.0, 1.0, glow) * color.a; fragColor = czm_gammaCorrect(fragColor); material.emission = fragColor.rgb; material.alpha = fragColor.a; return material; } `;var oMt=T(S(),1),nZ=`uniform vec4 color; uniform vec4 outlineColor; uniform float outlineWidth; in float v_width; czm_material czm_getMaterial(czm_materialInput materialInput) { czm_material material = czm_getDefaultMaterial(materialInput); vec2 st = materialInput.st; float halfInteriorWidth = 0.5 * (v_width - outlineWidth) / v_width; float b = step(0.5 - halfInteriorWidth, st.t); b *= 1.0 - step(0.5 + halfInteriorWidth, st.t); // Find the distance from the closest separator (region between two colors) float d1 = abs(st.t - (0.5 - halfInteriorWidth)); float d2 = abs(st.t - (0.5 + halfInteriorWidth)); float dist = min(d1, d2); vec4 currentColor = mix(outlineColor, color, b); vec4 outColor = czm_antialias(outlineColor, color, currentColor, dist); outColor = czm_gammaCorrect(outColor); material.diffuse = outColor.rgb; material.alpha = outColor.a; return material; } `;var sMt=T(S(),1),iZ=`uniform vec4 color; uniform vec4 rimColor; uniform float width; czm_material czm_getMaterial(czm_materialInput materialInput) { czm_material material = czm_getDefaultMaterial(materialInput); // See http://www.fundza.com/rman_shaders/surface/fake_rim/fake_rim1.html float d = 1.0 - dot(materialInput.normalEC, normalize(materialInput.positionToEyeEC)); float s = smoothstep(1.0 - width, 1.0, d); vec4 outColor = czm_gammaCorrect(color); vec4 outRimColor = czm_gammaCorrect(rimColor); material.diffuse = outColor.rgb; material.emission = outRimColor.rgb * s; material.alpha = mix(outColor.a, outRimColor.a, s); return material; } `;var cMt=T(S(),1),oZ=`uniform sampler2D image; czm_material czm_getMaterial(czm_materialInput materialInput) { czm_material material = czm_getDefaultMaterial(materialInput); vec4 rampColor = texture(image, vec2(materialInput.slope / (czm_pi / 2.0), 0.5)); rampColor = czm_gammaCorrect(rampColor); material.diffuse = rampColor.rgb; material.alpha = rampColor.a; return material; } `;var dMt=T(S(),1),rZ=`uniform vec4 evenColor; uniform vec4 oddColor; uniform float offset; uniform float repeat; uniform bool horizontal; czm_material czm_getMaterial(czm_materialInput materialInput) { czm_material material = czm_getDefaultMaterial(materialInput); // Based on the Stripes Fragment Shader in the Orange Book (11.1.2) float coord = mix(materialInput.st.s, materialInput.st.t, float(horizontal)); float value = fract((coord - offset) * (repeat * 0.5)); float dist = min(value, min(abs(value - 0.5), 1.0 - value)); vec4 currentColor = mix(evenColor, oddColor, step(0.5, value)); vec4 color = czm_antialias(evenColor, oddColor, currentColor, dist); color = czm_gammaCorrect(color); material.diffuse = color.rgb; material.alpha = color.a; return material; } `;var mMt=T(S(),1),sZ=`uniform vec4 waterColor; uniform vec4 landColor; czm_material czm_getMaterial(czm_materialInput materialInput) { czm_material material = czm_getDefaultMaterial(materialInput); vec4 outColor = mix(landColor, waterColor, materialInput.waterMask); outColor = czm_gammaCorrect(outColor); material.diffuse = outColor.rgb; material.alpha = outColor.a; return material; } `;var fMt=T(S(),1),aZ=`// Thanks for the contribution Jonas // http://29a.ch/2012/7/19/webgl-terrain-rendering-water-fog uniform sampler2D specularMap; uniform sampler2D normalMap; uniform vec4 baseWaterColor; uniform vec4 blendColor; uniform float frequency; uniform float animationSpeed; uniform float amplitude; uniform float specularIntensity; uniform float fadeFactor; czm_material czm_getMaterial(czm_materialInput materialInput) { czm_material material = czm_getDefaultMaterial(materialInput); float time = czm_frameNumber * animationSpeed; // fade is a function of the distance from the fragment and the frequency of the waves float fade = max(1.0, (length(materialInput.positionToEyeEC) / 10000000000.0) * frequency * fadeFactor); float specularMapValue = texture(specularMap, materialInput.st).r; // note: not using directional motion at this time, just set the angle to 0.0; vec4 noise = czm_getWaterNoise(normalMap, materialInput.st * frequency, time, 0.0); vec3 normalTangentSpace = noise.xyz * vec3(1.0, 1.0, (1.0 / amplitude)); // fade out the normal perturbation as we move further from the water surface normalTangentSpace.xy /= fade; // attempt to fade out the normal perturbation as we approach non water areas (low specular map value) normalTangentSpace = mix(vec3(0.0, 0.0, 50.0), normalTangentSpace, specularMapValue); normalTangentSpace = normalize(normalTangentSpace); // get ratios for alignment of the new normal vector with a vector perpendicular to the tangent plane float tsPerturbationRatio = clamp(dot(normalTangentSpace, vec3(0.0, 0.0, 1.0)), 0.0, 1.0); // fade out water effect as specular map value decreases material.alpha = mix(blendColor.a, baseWaterColor.a, specularMapValue) * specularMapValue; // base color is a blend of the water and non-water color based on the value from the specular map // may need a uniform blend factor to better control this material.diffuse = mix(blendColor.rgb, baseWaterColor.rgb, specularMapValue); // diffuse highlights are based on how perturbed the normal is material.diffuse += (0.1 * tsPerturbationRatio); material.diffuse = material.diffuse; material.normal = normalize(materialInput.tangentToEyeMatrix * normalTangentSpace); material.specular = specularIntensity; material.shininess = 10.0; return material; } `;function Ye(e){var t;this.type=void 0,this.autoDestroyOldTexture=(t=e.autoDestroyOldTexture)!=null?t:!0,this.shaderSource=void 0,this.materials=void 0,this.uniforms=void 0,this._uniforms=void 0,this.translucent=void 0,this._minificationFilter=y(e.minificationFilter,qt.LINEAR),this._magnificationFilter=y(e.magnificationFilter,pi.LINEAR),this._strict=void 0,this._template=void 0,this._count=void 0,this._texturePaths={},this._loadedImages=[],this._loadedCubeMaps=[],this._textures={},this._updateFunctions=[],this._defaultTexture=void 0,JGe(e,this),Object.defineProperties(this,{type:{value:this.type,writable:!1}}),l(Ye._uniformList[this.type])||(Ye._uniformList[this.type]=Object.keys(this._uniforms))}Ye._uniformList={};Ye.fromType=function(e,t){let n=new Ye({fabric:{type:e}});if(l(t))for(let i in t)t.hasOwnProperty(i)&&(n.uniforms[i]=t[i]);return n};Ye.prototype.isTranslucent=function(){if(l(this.translucent))return typeof this.translucent=="function"?this.translucent():this.translucent;let e=!0,t=this._translucentFunctions,n=t.length;for(let i=0;i-1)return!0;return!1}function tEe(e){let t=e._template.components,n=e._template.source;if(l(n))e.shaderSource+=`${n} `;else{if(e.shaderSource+=`czm_material czm_getMaterial(czm_materialInput materialInput) { `,e.shaderSource+=`czm_material material = czm_getDefaultMaterial(materialInput); `,l(t)){let i=Object.keys(e._template.materials).length>0;for(let o in t)if(t.hasOwnProperty(o))if(o==="diffuse"||o==="emission"){let s=i&&eEe(t[o],e)?t[o]:`czm_gammaCorrect(${t[o]})`;e.shaderSource+=`material.${o} = ${s}; `}else o==="alpha"?e.shaderSource+=`material.alpha = ${t.alpha}; `:e.shaderSource+=`material.${o} = ${t[o]}; `}e.shaderSource+=`return material; } `}}var Qee={mat2:Xi,mat3:$,mat4:M},nEe=/\.ktx2$/i;function iEe(e){let t;return function(n,i){let o=n.uniforms,r=o[e],s=t!==r,a=!l(r)||r===Ye.DefaultImageId;t=r;let c=n._textures[e],d,u;if(r instanceof HTMLVideoElement){if(r.readyState>=2){if(s&&l(c)&&(c!==i.defaultTexture&&c.destroy(),c=void 0),!l(c)||c===i.defaultTexture){let p=new $t({minificationFilter:n._minificationFilter,magnificationFilter:n._magnificationFilter});c=new Wt({context:i,source:r,sampler:p}),n._textures[e]=c;return}c.copyFrom({source:r})}else l(c)||(n._textures[e]=i.defaultTexture);return}if(r instanceof Wt&&r!==c){n._texturePaths[e]=void 0;let p=n._textures[e];l(p)&&p!==n._defaultTexture&&!p.isDestroyed()&&n.autoDestroyOldTexture&&p.destroy(),n._textures[e]=r,d=`${e}Dimensions`,o.hasOwnProperty(d)&&(u=o[d],u.x=r._width,u.y=r._height);return}if(s&&l(c)&&a&&(c!==n._defaultTexture&&c.destroy(),c=void 0),l(c)||(n._texturePaths[e]=void 0,c=n._textures[e]=n._defaultTexture,d=`${e}Dimensions`,o.hasOwnProperty(d)&&(u=o[d],u.x=c._width,u.y=c._height)),a)return;let h=r instanceof Re;if(!l(n._texturePaths[e])||h&&r.url!==n._texturePaths[e].url||!h&&r!==n._texturePaths[e]){if(typeof r=="string"||h){let p=h?r:Re.createIfNeeded(r),g;nEe.test(p.url)?g=Gl(p.url):g=p.fetchImage(),Promise.resolve(g).then(function(f){n._loadedImages.push({id:e,image:f})}).catch(function(){l(c)&&c!==n._defaultTexture&&c.destroy(),n._textures[e]=n._defaultTexture})}else(r instanceof HTMLCanvasElement||r instanceof HTMLImageElement)&&n._loadedImages.push({id:e,image:r});n._texturePaths[e]=r}}}function oEe(e){return function(t,n){let i=t.uniforms[e];if(i instanceof Tr){let r=t._textures[e];r!==t._defaultTexture&&r.destroy(),t._texturePaths[e]=void 0,t._textures[e]=i;return}if(l(t._textures[e])||(t._texturePaths[e]=void 0,t._textures[e]=n.defaultCubeMap),i===Ye.DefaultCubeMapId)return;let o=i.positiveX+i.negativeX+i.positiveY+i.negativeY+i.positiveZ+i.negativeZ;if(o!==t._texturePaths[e]){let r=[Re.createIfNeeded(i.positiveX).fetchImage(),Re.createIfNeeded(i.negativeX).fetchImage(),Re.createIfNeeded(i.positiveY).fetchImage(),Re.createIfNeeded(i.negativeY).fetchImage(),Re.createIfNeeded(i.positiveZ).fetchImage(),Re.createIfNeeded(i.negativeZ).fetchImage()];Promise.all(r).then(function(s){t._loadedCubeMaps.push({id:e,images:s})}),t._texturePaths[e]=o}}}function rEe(e){let t=e._template.uniforms;for(let n in t)t.hasOwnProperty(n)&&jee(e,n)}function jee(e,t){let n=e._strict,i=e._template.uniforms,o=i[t],r=sEe(o),s;if(r==="channels")s=cZ(e,t,o,!1);else{if(r==="sampler2D"){let d=`${t}Dimensions`;cEe(e,d)>0&&(i[d]={type:"ivec3",x:1,y:1},jee(e,d))}if(!new RegExp(`uniform\\s+${r}\\s+${t}\\s*;`).test(e.shaderSource)){let d=`uniform ${r} ${t};`;e.shaderSource=d+e.shaderSource}let c=`${t}_${e._count++}`;if(s=cZ(e,t,c),e.uniforms[t]=o,r==="sampler2D")e._uniforms[c]=function(){return e._textures[t]},e._updateFunctions.push(iEe(t));else if(r==="samplerCube")e._uniforms[c]=function(){return e._textures[t]},e._updateFunctions.push(oEe(t));else if(r.indexOf("mat")!==-1){let d=new Qee[r];e._uniforms[c]=function(){return Qee[r].fromColumnMajorArray(e.uniforms[t],d)}}else e._uniforms[c]=function(){return e.uniforms[t]}}}function sEe(e){let t=e.type;if(!l(t)){let n=typeof e;if(n==="number")t="float";else if(n==="boolean")t="bool";else if(n==="string"||e instanceof Re||e instanceof HTMLCanvasElement||e instanceof HTMLImageElement||e instanceof Wt)/^([rgba]){1,4}$/i.test(e)?t="channels":e===Ye.DefaultCubeMapId?t="samplerCube":t="sampler2D";else if(n==="object")if(Array.isArray(e))(e.length===4||e.length===9||e.length===16)&&(t=`mat${Math.sqrt(e.length)}`);else{let i=0;for(let o in e)e.hasOwnProperty(o)&&(i+=1);i>=2&&i<=4?t=`vec${i}`:i===6&&(t="samplerCube")}}return t}function aEe(e){let t=e._strict,n=e._template.materials;for(let i in n)if(n.hasOwnProperty(i)){let o=new Ye({strict:t,fabric:n[i],count:e._count});e._count=o._count,e._uniforms=Lt(e._uniforms,o._uniforms,!0),e.materials[i]=o,e._translucentFunctions=e._translucentFunctions.concat(o._translucentFunctions);let r="czm_getMaterial",s=`${r}_${e._count++}`;cZ(o,r,s),e.shaderSource=o.shaderSource+e.shaderSource;let a=`${s}(materialInput)`,c=cZ(e,i,a)}}function cZ(e,t,n,i){i=y(i,!0);let o=0,r="([\\w])?",s=`([\\w${i?".":""}])?`,a=new RegExp(s+t+r,"g");return e.shaderSource=e.shaderSource.replace(a,function(c,d,u){return d||u?c:(o+=1,n)}),o}function cEe(e,t,n){return cZ(e,t,t,n)}Ye._materialCache={_materials:{},addMaterial:function(e,t){this._materials[e]=t},getMaterial:function(e){return this._materials[e]}};Ye.DefaultImageId="czm_defaultImage";Ye.DefaultCubeMapId="czm_defaultCubeMap";Ye.ColorType="Color";Ye._materialCache.addMaterial(Ye.ColorType,{fabric:{type:Ye.ColorType,uniforms:{color:new B(1,0,0,.5)},components:{diffuse:"color.rgb",alpha:"color.a"}},translucent:function(e){return e.uniforms.color.alpha<1}});Ye.ImageType="Image";Ye._materialCache.addMaterial(Ye.ImageType,{fabric:{type:Ye.ImageType,uniforms:{image:Ye.DefaultImageId,repeat:new D(1,1),color:new B(1,1,1,1)},components:{diffuse:"texture(image, fract(repeat * materialInput.st)).rgb * color.rgb",alpha:"texture(image, fract(repeat * materialInput.st)).a * color.a"}},translucent:function(e){return e.uniforms.color.alpha<1}});Ye.DiffuseMapType="DiffuseMap";Ye._materialCache.addMaterial(Ye.DiffuseMapType,{fabric:{type:Ye.DiffuseMapType,uniforms:{image:Ye.DefaultImageId,channels:"rgb",repeat:new D(1,1)},components:{diffuse:"texture(image, fract(repeat * materialInput.st)).channels"}},translucent:!1});Ye.AlphaMapType="AlphaMap";Ye._materialCache.addMaterial(Ye.AlphaMapType,{fabric:{type:Ye.AlphaMapType,uniforms:{image:Ye.DefaultImageId,channel:"a",repeat:new D(1,1)},components:{alpha:"texture(image, fract(repeat * materialInput.st)).channel"}},translucent:!0});Ye.SpecularMapType="SpecularMap";Ye._materialCache.addMaterial(Ye.SpecularMapType,{fabric:{type:Ye.SpecularMapType,uniforms:{image:Ye.DefaultImageId,channel:"r",repeat:new D(1,1)},components:{specular:"texture(image, fract(repeat * materialInput.st)).channel"}},translucent:!1});Ye.EmissionMapType="EmissionMap";Ye._materialCache.addMaterial(Ye.EmissionMapType,{fabric:{type:Ye.EmissionMapType,uniforms:{image:Ye.DefaultImageId,channels:"rgb",repeat:new D(1,1)},components:{emission:"texture(image, fract(repeat * materialInput.st)).channels"}},translucent:!1});Ye.BumpMapType="BumpMap";Ye._materialCache.addMaterial(Ye.BumpMapType,{fabric:{type:Ye.BumpMapType,uniforms:{image:Ye.DefaultImageId,channel:"r",strength:.8,repeat:new D(1,1)},source:OR},translucent:!1});Ye.NormalMapType="NormalMap";Ye._materialCache.addMaterial(Ye.NormalMapType,{fabric:{type:Ye.NormalMapType,uniforms:{image:Ye.DefaultImageId,channels:"rgb",strength:.8,repeat:new D(1,1)},source:qR},translucent:!1});Ye.GridType="Grid";Ye._materialCache.addMaterial(Ye.GridType,{fabric:{type:Ye.GridType,uniforms:{color:new B(0,1,0,1),cellAlpha:.1,lineCount:new D(8,8),lineThickness:new D(1,1),lineOffset:new D(0,0)},source:jR},translucent:function(e){let t=e.uniforms;return t.color.alpha<1||t.cellAlpha<1}});Ye.StripeType="Stripe";Ye._materialCache.addMaterial(Ye.StripeType,{fabric:{type:Ye.StripeType,uniforms:{horizontal:!0,evenColor:new B(1,1,1,.5),oddColor:new B(0,0,1,.5),offset:0,repeat:5},source:rZ},translucent:function(e){let t=e.uniforms;return t.evenColor.alpha<1||t.oddColor.alpha<1}});Ye.CheckerboardType="Checkerboard";Ye._materialCache.addMaterial(Ye.CheckerboardType,{fabric:{type:Ye.CheckerboardType,uniforms:{lightColor:new B(1,1,1,.5),darkColor:new B(0,0,0,.5),repeat:new D(5,5)},source:YR},translucent:function(e){let t=e.uniforms;return t.lightColor.alpha<1||t.darkColor.alpha<1}});Ye.DotType="Dot";Ye._materialCache.addMaterial(Ye.DotType,{fabric:{type:Ye.DotType,uniforms:{lightColor:new B(1,1,0,.75),darkColor:new B(0,1,1,.75),repeat:new D(5,5)},source:HR},translucent:function(e){let t=e.uniforms;return t.lightColor.alpha<1||t.darkColor.alpha<1}});Ye.WaterType="Water";Ye._materialCache.addMaterial(Ye.WaterType,{fabric:{type:Ye.WaterType,uniforms:{baseWaterColor:new B(.2,.3,.6,1),blendColor:new B(0,1,.699,1),specularMap:Ye.DefaultImageId,normalMap:Ye.DefaultImageId,frequency:10,animationSpeed:.01,amplitude:1,specularIntensity:.5,fadeFactor:1},source:aZ},translucent:function(e){let t=e.uniforms;return t.baseWaterColor.alpha<1||t.blendColor.alpha<1}});Ye.RimLightingType="RimLighting";Ye._materialCache.addMaterial(Ye.RimLightingType,{fabric:{type:Ye.RimLightingType,uniforms:{color:new B(1,0,0,.7),rimColor:new B(1,1,1,.4),width:.3},source:iZ},translucent:function(e){let t=e.uniforms;return t.color.alpha<1||t.rimColor.alpha<1}});Ye.FadeType="Fade";Ye._materialCache.addMaterial(Ye.FadeType,{fabric:{type:Ye.FadeType,uniforms:{fadeInColor:new B(1,0,0,1),fadeOutColor:new B(0,0,0,0),maximumDistance:.5,repeat:!0,fadeDirection:{x:!0,y:!0},time:new D(.5,.5)},source:QR},translucent:function(e){let t=e.uniforms;return t.fadeInColor.alpha<1||t.fadeOutColor.alpha<1}});Ye.PolylineArrowType="PolylineArrow";Ye._materialCache.addMaterial(Ye.PolylineArrowType,{fabric:{type:Ye.PolylineArrowType,uniforms:{color:new B(1,1,1,1)},source:$R},translucent:!0});Ye.PolylineDashType="PolylineDash";Ye._materialCache.addMaterial(Ye.PolylineDashType,{fabric:{type:Ye.PolylineDashType,uniforms:{color:new B(1,0,1,1),gapColor:new B(0,0,0,0),dashLength:16,dashPattern:255},source:eZ},translucent:!0});Ye.PolylineGlowType="PolylineGlow";Ye._materialCache.addMaterial(Ye.PolylineGlowType,{fabric:{type:Ye.PolylineGlowType,uniforms:{color:new B(0,.5,1,1),glowPower:.25,taperPower:1},source:tZ},translucent:!0});Ye.PolylineOutlineType="PolylineOutline";Ye._materialCache.addMaterial(Ye.PolylineOutlineType,{fabric:{type:Ye.PolylineOutlineType,uniforms:{color:new B(1,1,1,1),outlineColor:new B(1,0,0,1),outlineWidth:1},source:nZ},translucent:function(e){let t=e.uniforms;return t.color.alpha<1||t.outlineColor.alpha<1}});Ye.ElevationContourType="ElevationContour";Ye._materialCache.addMaterial(Ye.ElevationContourType,{fabric:{type:Ye.ElevationContourType,uniforms:{spacing:100,color:new B(1,0,0,1),width:1},source:KR},translucent:!1});Ye.ElevationRampType="ElevationRamp";Ye._materialCache.addMaterial(Ye.ElevationRampType,{fabric:{type:Ye.ElevationRampType,uniforms:{image:Ye.DefaultImageId,minimumHeight:0,maximumHeight:1e4},source:JR},translucent:!1});Ye.SlopeRampMaterialType="SlopeRamp";Ye._materialCache.addMaterial(Ye.SlopeRampMaterialType,{fabric:{type:Ye.SlopeRampMaterialType,uniforms:{image:Ye.DefaultImageId},source:oZ},translucent:!1});Ye.AspectRampMaterialType="AspectRamp";Ye._materialCache.addMaterial(Ye.AspectRampMaterialType,{fabric:{type:Ye.AspectRampMaterialType,uniforms:{image:Ye.DefaultImageId},source:BR},translucent:!1});Ye.ElevationBandType="ElevationBand";Ye._materialCache.addMaterial(Ye.ElevationBandType,{fabric:{type:Ye.ElevationBandType,uniforms:{heights:Ye.DefaultImageId,colors:Ye.DefaultImageId},source:zR},translucent:!0});Ye.WaterMaskType="WaterMask";Ye._materialCache.addMaterial(Ye.WaterMaskType,{fabric:{type:Ye.WaterMaskType,source:sZ,uniforms:{waterColor:new B(1,1,1,1),landColor:new B(0,0,0,0)}},translucent:!1});var Ji=Ye;function Ex(e){e=y(e,y.EMPTY_OBJECT);let t=y(e.translucent,!0),n=y(e.closed,!1),i=y(e.materialSupport,Ex.MaterialSupport.TEXTURED);this.material=l(e.material)?e.material:Ji.fromType(Ji.ColorType),this.translucent=t,this._vertexShaderSource=y(e.vertexShaderSource,i.vertexShaderSource),this._fragmentShaderSource=y(e.fragmentShaderSource,i.fragmentShaderSource),this._renderState=oo.getDefaultRenderState(t,n,e.renderState),this._closed=n,this._materialSupport=i,this._vertexFormat=i.vertexFormat,this._flat=y(e.flat,!1),this._faceForward=y(e.faceForward,!n)}Object.defineProperties(Ex.prototype,{vertexShaderSource:{get:function(){return this._vertexShaderSource}},fragmentShaderSource:{get:function(){return this._fragmentShaderSource}},renderState:{get:function(){return this._renderState}},closed:{get:function(){return this._closed}},materialSupport:{get:function(){return this._materialSupport}},vertexFormat:{get:function(){return this._vertexFormat}},flat:{get:function(){return this._flat}},faceForward:{get:function(){return this._faceForward}}});Ex.prototype.getFragmentShaderSource=oo.prototype.getFragmentShaderSource;Ex.prototype.isTranslucent=oo.prototype.isTranslucent;Ex.prototype.getRenderState=oo.prototype.getRenderState;Ex.MaterialSupport={BASIC:Object.freeze({vertexFormat:Xe.POSITION_AND_NORMAL,vertexShaderSource:GR,fragmentShaderSource:ZR}),TEXTURED:Object.freeze({vertexFormat:Xe.POSITION_NORMAL_AND_ST,vertexShaderSource:IR,fragmentShaderSource:ER}),ALL:Object.freeze({vertexFormat:Xe.ALL,vertexShaderSource:RR,fragmentShaderSource:LR})};var uo=Ex;var E9t=T(S(),1);var f9t=T(S(),1),lZ=`in vec3 v_positionEC; in vec3 v_normalEC; in vec4 v_color; void main() { vec3 positionToEyeEC = -v_positionEC; vec3 normalEC = normalize(v_normalEC); #ifdef FACE_FORWARD normalEC = faceforward(normalEC, vec3(0.0, 0.0, 1.0), -normalEC); #endif vec4 color = czm_gammaCorrect(v_color); czm_materialInput materialInput; materialInput.normalEC = normalEC; materialInput.positionToEyeEC = positionToEyeEC; czm_material material = czm_getDefaultMaterial(materialInput); material.diffuse = color.rgb; material.alpha = color.a; out_FragColor = czm_phong(normalize(positionToEyeEC), material, czm_lightDirectionEC); } `;var b9t=T(S(),1),dZ=`in vec3 position3DHigh; in vec3 position3DLow; in vec3 normal; in vec4 color; in float batchId; out vec3 v_positionEC; out vec3 v_normalEC; out vec4 v_color; void main() { vec4 p = czm_computePosition(); v_positionEC = (czm_modelViewRelativeToEye * p).xyz; // position in eye coordinates v_normalEC = czm_normal * normal; // normal in eye coordinates v_color = color; gl_Position = czm_modelViewProjectionRelativeToEye * p; } `;var y9t=T(S(),1),Ix=`in vec4 v_color; void main() { out_FragColor = czm_gammaCorrect(v_color); } `;var _9t=T(S(),1),uZ=`in vec3 position3DHigh; in vec3 position3DLow; in vec4 color; in float batchId; out vec4 v_color; void main() { vec4 p = czm_computePosition(); v_color = color; gl_Position = czm_modelViewProjectionRelativeToEye * p; } `;function vp(e){e=y(e,y.EMPTY_OBJECT);let t=y(e.translucent,!0),n=y(e.closed,!1),i=y(e.flat,!1),o=i?uZ:dZ,r=i?Ix:lZ,s=i?vp.FLAT_VERTEX_FORMAT:vp.VERTEX_FORMAT;this.material=void 0,this.translucent=t,this._vertexShaderSource=y(e.vertexShaderSource,o),this._fragmentShaderSource=y(e.fragmentShaderSource,r),this._renderState=oo.getDefaultRenderState(t,n,e.renderState),this._closed=n,this._vertexFormat=s,this._flat=i,this._faceForward=y(e.faceForward,!n)}Object.defineProperties(vp.prototype,{vertexShaderSource:{get:function(){return this._vertexShaderSource}},fragmentShaderSource:{get:function(){return this._fragmentShaderSource}},renderState:{get:function(){return this._renderState}},closed:{get:function(){return this._closed}},vertexFormat:{get:function(){return this._vertexFormat}},flat:{get:function(){return this._flat}},faceForward:{get:function(){return this._faceForward}}});vp.VERTEX_FORMAT=Xe.POSITION_AND_NORMAL;vp.FLAT_VERTEX_FORMAT=Xe.POSITION_ONLY;vp.prototype.getFragmentShaderSource=oo.prototype.getFragmentShaderSource;vp.prototype.isTranslucent=oo.prototype.isTranslucent;vp.prototype.getRenderState=oo.prototype.getRenderState;var dn=vp;var A9t=T(S(),1);function yC(e){this._definitionChanged=new be,this._color=void 0,this._colorSubscription=void 0,this.color=e}Object.defineProperties(yC.prototype,{isConstant:{get:function(){return J.isConstant(this._color)}},definitionChanged:{get:function(){return this._definitionChanged}},color:ue("color")});yC.prototype.getType=function(e){return"Color"};var lEe=new q;yC.prototype.getValue=function(e,t){return l(e)||(e=q.now(lEe)),l(t)||(t={}),t.color=J.getValueOrClonedDefault(this._color,e,B.WHITE,t.color),t};yC.prototype.equals=function(e){return this===e||e instanceof yC&&J.equals(this._color,e._color)};var Bt=yC;var fQt=T(S(),1);var zJt=T(S(),1);var rNt=T(S(),1);var H9t=T(S(),1);function j0(e){e=y(e,y.EMPTY_OBJECT),this._ellipsoid=y(e.ellipsoid,ne.default),this._rectangle=y(e.rectangle,le.MAX_VALUE),this._projection=new Ii(this._ellipsoid),this._numberOfLevelZeroTilesX=y(e.numberOfLevelZeroTilesX,2),this._numberOfLevelZeroTilesY=y(e.numberOfLevelZeroTilesY,1)}Object.defineProperties(j0.prototype,{ellipsoid:{get:function(){return this._ellipsoid}},rectangle:{get:function(){return this._rectangle}},projection:{get:function(){return this._projection}}});j0.prototype.getNumberOfXTilesAtLevel=function(e){return this._numberOfLevelZeroTilesX<=o&&(d=o-1);let u=(i.north-e.latitude)/a|0;return u>=r&&(u=r-1),l(n)?(n.x=d,n.y=u,n):new D(d,u)};var Qi=j0;var qee=new m,$ee=new m,ete=new he,WY=new m,dEe=new m,tte=new de,uEe=new Qi,mZ=[new he,new he,new he,new he],hZ=new D,jr={};jr.initialize=function(){let e=jr._initPromise;return l(e)||(e=Re.fetchJson(on("Assets/approximateTerrainHeights.json")).then(function(t){jr._terrainHeights=t}),jr._initPromise=e),e};jr.getMinimumMaximumHeights=function(e,t){t=y(t,ne.default);let n=nte(e),i=jr._defaultMinTerrainHeight,o=jr._defaultMaxTerrainHeight;if(l(n)){let r=`${n.level}-${n.x}-${n.y}`,s=jr._terrainHeights[r];l(s)&&(i=s[0],o=s[1]),t.cartographicToCartesian(le.northeast(e,ete),qee),t.cartographicToCartesian(le.southwest(e,ete),$ee),m.midpoint($ee,qee,WY);let a=t.scaleToGeodeticSurface(WY,dEe);if(l(a)){let c=m.distance(WY,a);i=Math.min(i,-c)}else i=jr._defaultMinTerrainHeight}return i=Math.max(jr._defaultMinTerrainHeight,i),{minimumTerrainHeight:i,maximumTerrainHeight:o}};jr.getBoundingSphere=function(e,t){t=y(t,ne.default);let n=nte(e),i=jr._defaultMaxTerrainHeight;if(l(n)){let r=`${n.level}-${n.x}-${n.y}`,s=jr._terrainHeights[r];l(s)&&(i=s[1])}let o=de.fromRectangle3D(e,t,0);return de.fromRectangle3D(e,t,i,tte),de.union(o,tte,o)};function nte(e){he.fromRadians(e.east,e.north,0,mZ[0]),he.fromRadians(e.west,e.north,0,mZ[1]),he.fromRadians(e.east,e.south,0,mZ[2]),he.fromRadians(e.west,e.south,0,mZ[3]);let t=0,n=0,i=0,o=0,r=jr._terrainHeightsMaxLevel,s;for(s=0;s<=r;++s){let a=!1;for(let c=0;c<4;++c){let d=mZ[c];if(uEe.positionToTileXY(d,s,hZ),c===0)i=hZ.x,o=hZ.y;else if(i!==hZ.x||o!==hZ.y){a=!0;break}}if(a)break;t=i,n=o}if(s!==0)return{x:t,y:n,level:s>r?r:s-1}}jr._terrainHeightsMaxLevel=6;jr._defaultMaxTerrainHeight=9e3;jr._defaultMinTerrainHeight=-1e5;jr._terrainHeights=void 0;jr._initPromise=void 0;Object.defineProperties(jr,{initialized:{get:function(){return l(jr._terrainHeights)}}});var mi=jr;var DNt=T(S(),1);var LNt=T(S(),1);var uNt=T(S(),1);function Nc(e,t,n){this.minimum=m.clone(y(e,m.ZERO)),this.maximum=m.clone(y(t,m.ZERO)),l(n)?n=m.clone(n):n=m.midpoint(this.minimum,this.maximum,new m),this.center=n}Nc.fromCorners=function(e,t,n){return l(n)||(n=new Nc),n.minimum=m.clone(e,n.minimum),n.maximum=m.clone(t,n.maximum),n.center=m.midpoint(e,t,n.center),n};Nc.fromPoints=function(e,t){if(l(t)||(t=new Nc),!l(e)||e.length===0)return t.minimum=m.clone(m.ZERO,t.minimum),t.maximum=m.clone(m.ZERO,t.maximum),t.center=m.clone(m.ZERO,t.center),t;let n=e[0].x,i=e[0].y,o=e[0].z,r=e[0].x,s=e[0].y,a=e[0].z,c=e.length;for(let h=1;h0?zt.INSIDE:r+o<0?zt.OUTSIDE:zt.INTERSECTING};Nc.prototype.clone=function(e){return Nc.clone(this,e)};Nc.prototype.intersectPlane=function(e){return Nc.intersectPlane(this,e)};Nc.prototype.equals=function(e){return Nc.equals(this,e)};var q0=Nc;var PY=new re;function ff(e,t){t=y(t,ne.default),e=t.scaleToGeodeticSurface(e);let n=wt.eastNorthUpToFixedFrame(e,t);this._ellipsoid=t,this._origin=e,this._xAxis=m.fromCartesian4(M.getColumn(n,0,PY)),this._yAxis=m.fromCartesian4(M.getColumn(n,1,PY));let i=m.fromCartesian4(M.getColumn(n,2,PY));this._plane=cn.fromPointNormal(e,i)}Object.defineProperties(ff.prototype,{ellipsoid:{get:function(){return this._ellipsoid}},origin:{get:function(){return this._origin}},plane:{get:function(){return this._plane}},xAxis:{get:function(){return this._xAxis}},yAxis:{get:function(){return this._yAxis}},zAxis:{get:function(){return this._plane.normal}}});var mEe=new q0;ff.fromPoints=function(e,t){let n=q0.fromPoints(e,mEe);return new ff(n.center,t)};var ite=new gn,d5=new m;ff.prototype.projectPointOntoPlane=function(e,t){let n=ite;n.origin=e,m.normalize(e,n.direction);let i=ti.rayPlane(n,this._plane,d5);if(l(i)||(m.negate(n.direction,n.direction),i=ti.rayPlane(n,this._plane,d5)),l(i)){let o=m.subtract(i,this._origin,i),r=m.dot(this._xAxis,o),s=m.dot(this._yAxis,o);return l(t)?(t.x=r,t.y=s,t):new D(r,s)}};ff.prototype.projectPointsOntoPlane=function(e,t){l(t)||(t=[]);let n=0,i=e.length;for(let o=0;o0?0:v.latitude,Z=he.fromRadians(A,e.north,n,VEe),E=he.fromRadians(e.west,e.north,n,LEe),X=he.fromRadians(e.west,b,n,REe),F=he.fromRadians(e.west,e.south,n,ZEe),N=he.fromRadians(A,e.south,n,GEe),O=i.cartographicToCartesian(Z,EEe),U=i.cartographicToCartesian(E,ste),Y=i.cartographicToCartesian(X,IEe),k=i.cartographicToCartesian(F,ate),H=i.cartographicToCartesian(N,XEe),K=w.projectPointToNearestOnPlane(O,WEe),te=w.projectPointToNearestOnPlane(U,PEe),z=w.projectPointToNearestOnPlane(Y,vEe),j=w.projectPointToNearestOnPlane(k,wEe),ee=w.projectPointToNearestOnPlane(H,FEe);return r=Math.min(te.x,z.x,j.x),s=-r,c=Math.max(te.y,K.y),a=Math.min(j.y,ee.y),E.height=F.height=t,U=i.cartographicToCartesian(E,ste),k=i.cartographicToCartesian(F,ate),d=Math.min(cn.getPointDistance(h,U),cn.getPointDistance(h,k)),u=n,ote(w.origin,w.xAxis,w.yAxis,w.zAxis,r,s,a,c,d,u,o)}let p=e.south>0,g=e.north<0,f=p?e.south:g?e.north:0,x=le.center(e,rte).longitude,_=m.fromRadians(x,f,n,i,AEe);_.z=0;let V=Math.abs(_.x)=c?zt.INSIDE:zt.INTERSECTING};var dte=new m,ute=new m,mte=new m,HEe=new m,cte=new m,zEe=new m;Ui.distanceSquaredTo=function(e,t){let n=m.subtract(t,e.center,lte),i=e.halfAxes,o=$.getColumn(i,0,dte),r=$.getColumn(i,1,ute),s=$.getColumn(i,2,mte),a=m.magnitude(o),c=m.magnitude(r),d=m.magnitude(s),u=!0,h=!0,p=!0;a>0?m.divideByScalar(o,a,o):u=!1,c>0?m.divideByScalar(r,c,r):h=!1,d>0?m.divideByScalar(s,d,s):p=!1;let g=!u+!h+!p,f,x,_;if(g===1){let R=o;f=r,x=s,h?p||(R=s,x=o):(R=r,f=o),_=m.cross(f,x,cte),R===o?o=_:R===r?r=_:R===s&&(s=_)}else if(g===2){f=o,h?f=r:p&&(f=s);let R=m.UNIT_Y;R.equalsEpsilon(f,W.EPSILON3)&&(R=m.UNIT_X),x=m.cross(f,R,HEe),m.normalize(x,x),_=m.cross(f,x,cte),m.normalize(_,_),f===o?(r=x,s=_):f===r?(s=x,o=_):f===s&&(o=x,r=_)}else g===3&&(o=m.UNIT_X,r=m.UNIT_Y,s=m.UNIT_Z);let C=zEe;C.x=m.dot(n,o),C.y=m.dot(n,r),C.z=m.dot(n,s);let V=0,L;return C.x<-a?(L=C.x+a,V+=L*L):C.x>a&&(L=C.x-a,V+=L*L),C.y<-c?(L=C.y+c,V+=L*L):C.y>c&&(L=C.y-c,V+=L*L),C.z<-d?(L=C.z+d,V+=L*L):C.z>d&&(L=C.z-d,V+=L*L),V};var KEe=new m,JEe=new m;Ui.computePlaneDistances=function(e,t,n,i){l(i)||(i=new Wa);let o=Number.POSITIVE_INFINITY,r=Number.NEGATIVE_INFINITY,s=e.center,a=e.halfAxes,c=$.getColumn(a,0,dte),d=$.getColumn(a,1,ute),u=$.getColumn(a,2,mte),h=m.add(c,d,KEe);m.add(h,u,h),m.add(h,s,h);let p=m.subtract(h,t,JEe),g=m.dot(n,p);return o=Math.min(g,o),r=Math.max(g,r),m.add(s,c,h),m.add(h,d,h),m.subtract(h,u,h),m.subtract(h,t,p),g=m.dot(n,p),o=Math.min(g,o),r=Math.max(g,r),m.add(s,c,h),m.subtract(h,d,h),m.add(h,u,h),m.subtract(h,t,p),g=m.dot(n,p),o=Math.min(g,o),r=Math.max(g,r),m.add(s,c,h),m.subtract(h,d,h),m.subtract(h,u,h),m.subtract(h,t,p),g=m.dot(n,p),o=Math.min(g,o),r=Math.max(g,r),m.subtract(s,c,h),m.add(h,d,h),m.add(h,u,h),m.subtract(h,t,p),g=m.dot(n,p),o=Math.min(g,o),r=Math.max(g,r),m.subtract(s,c,h),m.add(h,d,h),m.subtract(h,u,h),m.subtract(h,t,p),g=m.dot(n,p),o=Math.min(g,o),r=Math.max(g,r),m.subtract(s,c,h),m.subtract(h,d,h),m.add(h,u,h),m.subtract(h,t,p),g=m.dot(n,p),o=Math.min(g,o),r=Math.max(g,r),m.subtract(s,c,h),m.subtract(h,d,h),m.subtract(h,u,h),m.subtract(h,t,p),g=m.dot(n,p),o=Math.min(g,o),r=Math.max(g,r),i.start=o,i.stop=r,i};var QEe=new m,jEe=new m,qEe=new m;Ui.computeCorners=function(e,t){l(t)||(t=[new m,new m,new m,new m,new m,new m,new m,new m]);let n=e.center,i=e.halfAxes,o=$.getColumn(i,0,QEe),r=$.getColumn(i,1,jEe),s=$.getColumn(i,2,qEe);return m.clone(n,t[0]),m.subtract(t[0],o,t[0]),m.subtract(t[0],r,t[0]),m.subtract(t[0],s,t[0]),m.clone(n,t[1]),m.subtract(t[1],o,t[1]),m.subtract(t[1],r,t[1]),m.add(t[1],s,t[1]),m.clone(n,t[2]),m.subtract(t[2],o,t[2]),m.add(t[2],r,t[2]),m.subtract(t[2],s,t[2]),m.clone(n,t[3]),m.subtract(t[3],o,t[3]),m.add(t[3],r,t[3]),m.add(t[3],s,t[3]),m.clone(n,t[4]),m.add(t[4],o,t[4]),m.subtract(t[4],r,t[4]),m.subtract(t[4],s,t[4]),m.clone(n,t[5]),m.add(t[5],o,t[5]),m.subtract(t[5],r,t[5]),m.add(t[5],s,t[5]),m.clone(n,t[6]),m.add(t[6],o,t[6]),m.add(t[6],r,t[6]),m.subtract(t[6],s,t[6]),m.clone(n,t[7]),m.add(t[7],o,t[7]),m.add(t[7],r,t[7]),m.add(t[7],s,t[7]),t};var $Ee=new $;Ui.computeTransformation=function(e,t){l(t)||(t=new M);let n=e.center,i=$.multiplyByUniformScale(e.halfAxes,2,$Ee);return M.fromRotationTranslation(i,n,t)};var eIe=new de;Ui.isOccluded=function(e,t){let n=de.fromOrientedBoundingBox(e,eIe);return!t.isBoundingSphereVisible(n)};Ui.prototype.intersectPlane=function(e){return Ui.intersectPlane(this,e)};Ui.prototype.distanceSquaredTo=function(e){return Ui.distanceSquaredTo(this,e)};Ui.prototype.computePlaneDistances=function(e,t,n){return Ui.computePlaneDistances(this,e,t,n)};Ui.prototype.computeCorners=function(e){return Ui.computeCorners(this,e)};Ui.prototype.computeTransformation=function(e){return Ui.computeTransformation(this,e)};Ui.prototype.isOccluded=function(e){return Ui.isOccluded(this,e)};Ui.equals=function(e,t){return e===t||l(e)&&l(t)&&m.equals(e.center,t.center)&&$.equals(e.halfAxes,t.halfAxes)};Ui.prototype.clone=function(e){return Ui.clone(this,e)};Ui.prototype.equals=function(e){return Ui.equals(this,e)};var Gn=Ui;var zNt=T(S(),1);var u5={};u5.getHeight=function(e,t,n){return(e-n)*t+n};var tIe=new he;u5.getPosition=function(e,t,n,i,o){let r=t.cartesianToCartographic(e,tIe);if(!l(r))return m.clone(e,o);let s=u5.getHeight(r.height,n,i);return m.fromRadians(r.longitude,r.latitude,s,t,o)};var Sr=u5;var EJt=T(S(),1);var qNt=T(S(),1);var Cr={CULL:1,OCCLUDE:2,EXECUTE_IN_CLOSEST_FRUSTUM:4,DEBUG_SHOW_BOUNDING_VOLUME:8,CAST_SHADOWS:16,RECEIVE_SHADOWS:32,PICK_ONLY:64,DEPTH_FOR_TRANSLUCENT_CLASSIFICATION:128};function fZ(e){e=y(e,y.EMPTY_OBJECT),this._boundingVolume=e.boundingVolume,this._orientedBoundingBox=e.orientedBoundingBox,this._modelMatrix=e.modelMatrix,this._primitiveType=y(e.primitiveType,Ae.TRIANGLES),this._vertexArray=e.vertexArray,this._count=e.count,this._offset=y(e.offset,0),this._instanceCount=y(e.instanceCount,0),this._shaderProgram=e.shaderProgram,this._uniformMap=e.uniformMap,this._renderState=e.renderState,this._framebuffer=e.framebuffer,this._pass=e.pass,this._owner=e.owner,this._debugOverlappingFrustums=0,this._pickId=e.pickId,this._pickMetadataAllowed=e.pickMetadataAllowed===!0,this._pickedMetadataInfo=void 0,this._flags=0,this.cull=y(e.cull,!0),this.occlude=y(e.occlude,!0),this.executeInClosestFrustum=y(e.executeInClosestFrustum,!1),this.debugShowBoundingVolume=y(e.debugShowBoundingVolume,!1),this.castShadows=y(e.castShadows,!1),this.receiveShadows=y(e.receiveShadows,!1),this.pickOnly=y(e.pickOnly,!1),this.depthForTranslucentClassification=y(e.depthForTranslucentClassification,!1),this.dirty=!0,this.lastDirtyTime=0,this.derivedCommands={}}function sc(e,t){return(e._flags&t)===t}function $0(e,t,n){n?e._flags|=t:e._flags&=~t}Object.defineProperties(fZ.prototype,{boundingVolume:{get:function(){return this._boundingVolume},set:function(e){this._boundingVolume!==e&&(this._boundingVolume=e,this.dirty=!0)}},orientedBoundingBox:{get:function(){return this._orientedBoundingBox},set:function(e){this._orientedBoundingBox!==e&&(this._orientedBoundingBox=e,this.dirty=!0)}},cull:{get:function(){return sc(this,Cr.CULL)},set:function(e){sc(this,Cr.CULL)!==e&&($0(this,Cr.CULL,e),this.dirty=!0)}},occlude:{get:function(){return sc(this,Cr.OCCLUDE)},set:function(e){sc(this,Cr.OCCLUDE)!==e&&($0(this,Cr.OCCLUDE,e),this.dirty=!0)}},modelMatrix:{get:function(){return this._modelMatrix},set:function(e){this._modelMatrix!==e&&(this._modelMatrix=e,this.dirty=!0)}},primitiveType:{get:function(){return this._primitiveType},set:function(e){this._primitiveType!==e&&(this._primitiveType=e,this.dirty=!0)}},vertexArray:{get:function(){return this._vertexArray},set:function(e){this._vertexArray!==e&&(this._vertexArray=e,this.dirty=!0)}},count:{get:function(){return this._count},set:function(e){this._count!==e&&(this._count=e,this.dirty=!0)}},offset:{get:function(){return this._offset},set:function(e){this._offset!==e&&(this._offset=e,this.dirty=!0)}},instanceCount:{get:function(){return this._instanceCount},set:function(e){this._instanceCount!==e&&(this._instanceCount=e,this.dirty=!0)}},shaderProgram:{get:function(){return this._shaderProgram},set:function(e){this._shaderProgram!==e&&(this._shaderProgram=e,this.dirty=!0)}},castShadows:{get:function(){return sc(this,Cr.CAST_SHADOWS)},set:function(e){sc(this,Cr.CAST_SHADOWS)!==e&&($0(this,Cr.CAST_SHADOWS,e),this.dirty=!0)}},receiveShadows:{get:function(){return sc(this,Cr.RECEIVE_SHADOWS)},set:function(e){sc(this,Cr.RECEIVE_SHADOWS)!==e&&($0(this,Cr.RECEIVE_SHADOWS,e),this.dirty=!0)}},uniformMap:{get:function(){return this._uniformMap},set:function(e){this._uniformMap!==e&&(this._uniformMap=e,this.dirty=!0)}},renderState:{get:function(){return this._renderState},set:function(e){this._renderState!==e&&(this._renderState=e,this.dirty=!0)}},framebuffer:{get:function(){return this._framebuffer},set:function(e){this._framebuffer!==e&&(this._framebuffer=e,this.dirty=!0)}},pass:{get:function(){return this._pass},set:function(e){this._pass!==e&&(this._pass=e,this.dirty=!0)}},executeInClosestFrustum:{get:function(){return sc(this,Cr.EXECUTE_IN_CLOSEST_FRUSTUM)},set:function(e){sc(this,Cr.EXECUTE_IN_CLOSEST_FRUSTUM)!==e&&($0(this,Cr.EXECUTE_IN_CLOSEST_FRUSTUM,e),this.dirty=!0)}},owner:{get:function(){return this._owner},set:function(e){this._owner!==e&&(this._owner=e,this.dirty=!0)}},debugShowBoundingVolume:{get:function(){return sc(this,Cr.DEBUG_SHOW_BOUNDING_VOLUME)},set:function(e){sc(this,Cr.DEBUG_SHOW_BOUNDING_VOLUME)!==e&&($0(this,Cr.DEBUG_SHOW_BOUNDING_VOLUME,e),this.dirty=!0)}},debugOverlappingFrustums:{get:function(){return this._debugOverlappingFrustums},set:function(e){this._debugOverlappingFrustums!==e&&(this._debugOverlappingFrustums=e,this.dirty=!0)}},pickId:{get:function(){return this._pickId},set:function(e){this._pickId!==e&&(this._pickId=e,this.dirty=!0)}},pickMetadataAllowed:{get:function(){return this._pickMetadataAllowed}},pickedMetadataInfo:{get:function(){return this._pickedMetadataInfo},set:function(e){this._pickedMetadataInfo!==e&&(this._pickedMetadataInfo=e,this.dirty=!0)}},pickOnly:{get:function(){return sc(this,Cr.PICK_ONLY)},set:function(e){sc(this,Cr.PICK_ONLY)!==e&&($0(this,Cr.PICK_ONLY,e),this.dirty=!0)}},depthForTranslucentClassification:{get:function(){return sc(this,Cr.DEPTH_FOR_TRANSLUCENT_CLASSIFICATION)},set:function(e){sc(this,Cr.DEPTH_FOR_TRANSLUCENT_CLASSIFICATION)!==e&&($0(this,Cr.DEPTH_FOR_TRANSLUCENT_CLASSIFICATION,e),this.dirty=!0)}}});fZ.shallowClone=function(e,t){if(l(e))return l(t)||(t=new fZ),t._boundingVolume=e._boundingVolume,t._orientedBoundingBox=e._orientedBoundingBox,t._modelMatrix=e._modelMatrix,t._primitiveType=e._primitiveType,t._vertexArray=e._vertexArray,t._count=e._count,t._offset=e._offset,t._instanceCount=e._instanceCount,t._shaderProgram=e._shaderProgram,t._uniformMap=e._uniformMap,t._renderState=e._renderState,t._framebuffer=e._framebuffer,t._pass=e._pass,t._owner=e._owner,t._debugOverlappingFrustums=e._debugOverlappingFrustums,t._pickId=e._pickId,t._pickMetadataAllowed=e._pickMetadataAllowed,t._pickedMetadataInfo=e._pickedMetadataInfo,t._flags=e._flags,t.dirty=!0,t.lastDirtyTime=0,t};fZ.prototype.execute=function(e,t){e.draw(this,t)};var $e=fZ;var e5t=T(S(),1),nIe={ENVIRONMENT:0,COMPUTE:1,GLOBE:2,TERRAIN_CLASSIFICATION:3,CESIUM_3D_TILE:4,CESIUM_3D_TILE_CLASSIFICATION:5,CESIUM_3D_TILE_CLASSIFICATION_IGNORE_SHOW:6,OPAQUE:7,TRANSLUCENT:8,VOXELS:9,OVERLAY:10,NUMBER_OF_PASSES:11},Ge=Object.freeze(nIe);var h5t=T(S(),1);var i5t=T(S(),1);var m5={CLOCKWISE:ie.CW,COUNTER_CLOCKWISE:ie.CCW};m5.validate=function(e){return e===m5.CLOCKWISE||e===m5.COUNTER_CLOCKWISE};var fs=Object.freeze(m5);var r5t=T(S(),1);function hte(e){if(typeof e!="object"||e===null)return e;let t,n=Object.keys(e);for(let i=0;i0&&console.log(`${gf}Vertex shader compile log: ${c}`),c=e.getShaderInfoLog(r),l(c)&&c.length>0&&console.log(`${gf}Fragment shader compile log: ${c}`),c=e.getProgramInfoLog(s),l(c)&&c.length>0&&console.log(`${gf}Shader program link log: ${c}`)),e.deleteShader(o),e.deleteShader(r),s;let d,u=t._debugShaders;throw e.getShaderParameter(r,e.COMPILE_STATUS)?e.getShaderParameter(o,e.COMPILE_STATUS)?(c=e.getProgramInfoLog(s),console.error(`${gf}Shader program link log: ${c}`),h(o,"vertex"),h(r,"fragment"),d=`Program failed to link. Link log: ${c}`):(c=e.getShaderInfoLog(o),console.error(`${gf}Vertex shader compile log: ${c}`),console.error(`${gf} Vertex shader source: ${n}`),d=`Vertex shader failed to compile. Compile log: ${c}`):(c=e.getShaderInfoLog(r),console.error(`${gf}Fragment shader compile log: ${c}`),console.error(`${gf} Fragment shader source: ${i}`),d=`Fragment shader failed to compile. Compile log: ${c}`),e.deleteShader(o),e.deleteShader(r),e.deleteProgram(s),new ce(d);function h(p,g){if(!l(u))return;let f=u.getTranslatedShaderSource(p);if(f===""){console.error(`${gf}${g} shader translation failed.`);return}console.error(`${gf}Translated ${g} shaderSource: ${f}`)}}function gIe(e,t,n){let i={};for(let o=0;o=0){if(u=n[d.slice(0,f)],!l(u))continue;h=u._locations,h.length<=1&&(p=u.value,g=e.getUniformLocation(t,d),g!==null&&(h.push(g),p.push(e.getUniform(t,g))))}else{h=[];for(let x=0;x abs(x), czm_piOverTwo - t, t); t = czm_branchFreeTernary(x < 0.0, czm_pi - t, t); t = czm_branchFreeTernary(y < 0.0, -t, t); return t; } `;var MDt=T(S(),1),AG=`/** * Gets the color with fog at a distance from the camera. * * @name czm_fog * @glslFunction * * @param {float} distanceToCamera The distance to the camera in meters. * @param {vec3} color The original color. * @param {vec3} fogColor The color of the fog. * * @returns {vec3} The color adjusted for fog at the distance from the camera. */ vec3 czm_fog(float distanceToCamera, vec3 color, vec3 fogColor) { float scalar = distanceToCamera * czm_fogDensity; float fog = 1.0 - exp(-(scalar * scalar)); return mix(color, fogColor, fog); } /** * Gets the color with fog at a distance from the camera. * * @name czm_fog * @glslFunction * * @param {float} distanceToCamera The distance to the camera in meters. * @param {vec3} color The original color. * @param {vec3} fogColor The color of the fog. * @param {float} fogModifierConstant A constant to modify the appearance of fog. * * @returns {vec3} The color adjusted for fog at the distance from the camera. */ vec3 czm_fog(float distanceToCamera, vec3 color, vec3 fogColor, float fogModifierConstant) { float scalar = distanceToCamera * czm_fogDensity; float fog = 1.0 - exp(-((fogModifierConstant * scalar + fogModifierConstant) * (scalar * (1.0 + fogModifierConstant)))); return mix(color, fogColor, fog); } `;var kDt=T(S(),1),MG=`/** * Converts a color from RGB space to linear space. * * @name czm_gammaCorrect * @glslFunction * * @param {vec3} color The color in RGB space. * @returns {vec3} The color in linear space. */ vec3 czm_gammaCorrect(vec3 color) { #ifdef HDR color = pow(color, vec3(czm_gamma)); #endif return color; } vec4 czm_gammaCorrect(vec4 color) { #ifdef HDR color.rgb = pow(color.rgb, vec3(czm_gamma)); #endif return color; } `;var DDt=T(S(),1),NG=`/** * DOC_TBA * * @name czm_geodeticSurfaceNormal * @glslFunction * * @param {vec3} positionOnEllipsoid DOC_TBA * @param {vec3} ellipsoidCenter DOC_TBA * @param {vec3} oneOverEllipsoidRadiiSquared DOC_TBA * * @returns {vec3} DOC_TBA. */ vec3 czm_geodeticSurfaceNormal(vec3 positionOnEllipsoid, vec3 ellipsoidCenter, vec3 oneOverEllipsoidRadiiSquared) { return normalize((positionOnEllipsoid - ellipsoidCenter) * oneOverEllipsoidRadiiSquared); } `;var ODt=T(S(),1),kG=`/** * An czm_material with default values. Every material's czm_getMaterial * should use this default material as a base for the material it returns. * The default normal value is given by materialInput.normalEC. * * @name czm_getDefaultMaterial * @glslFunction * * @param {czm_materialInput} input The input used to construct the default material. * * @returns {czm_material} The default material. * * @see czm_materialInput * @see czm_material * @see czm_getMaterial */ czm_material czm_getDefaultMaterial(czm_materialInput materialInput) { czm_material material; material.diffuse = vec3(0.0); material.specular = 0.0; material.shininess = 1.0; material.normal = materialInput.normalEC; material.emission = vec3(0.0); material.alpha = 1.0; return material; } `;var HDt=T(S(),1),UG=`/** * Select which direction vector to use for dynamic atmosphere lighting based on an enum value * * @name czm_getDynamicAtmosphereLightDirection * @glslfunction * @see DynamicAtmosphereLightingType.js * * @param {vec3} positionWC the position of the vertex/fragment in world coordinates. This is normalized and returned when dynamic lighting is turned off. * @param {float} lightEnum The enum value for selecting between light sources. * @return {vec3} The normalized light direction vector. Depending on the enum value, it is either positionWC, czm_lightDirectionWC or czm_sunDirectionWC */ vec3 czm_getDynamicAtmosphereLightDirection(vec3 positionWC, float lightEnum) { const float NONE = 0.0; const float SCENE_LIGHT = 1.0; const float SUNLIGHT = 2.0; vec3 lightDirection = positionWC * float(lightEnum == NONE) + czm_lightDirectionWC * float(lightEnum == SCENE_LIGHT) + czm_sunDirectionWC * float(lightEnum == SUNLIGHT); return normalize(lightDirection); } `;var KDt=T(S(),1),DG=`/** * Calculates the intensity of diffusely reflected light. * * @name czm_getLambertDiffuse * @glslFunction * * @param {vec3} lightDirectionEC Unit vector pointing to the light source in eye coordinates. * @param {vec3} normalEC The surface normal in eye coordinates. * * @returns {float} The intensity of the diffuse reflection. * * @see czm_phong * * @example * float diffuseIntensity = czm_getLambertDiffuse(lightDirectionEC, normalEC); * float specularIntensity = czm_getSpecular(lightDirectionEC, toEyeEC, normalEC, 200); * vec3 color = (diffuseColor * diffuseIntensity) + (specularColor * specularIntensity); */ float czm_getLambertDiffuse(vec3 lightDirectionEC, vec3 normalEC) { return max(dot(lightDirectionEC, normalEC), 0.0); } `;var QDt=T(S(),1),BG=`/** * Calculates the specular intensity of reflected light. * * @name czm_getSpecular * @glslFunction * * @param {vec3} lightDirectionEC Unit vector pointing to the light source in eye coordinates. * @param {vec3} toEyeEC Unit vector pointing to the eye position in eye coordinates. * @param {vec3} normalEC The surface normal in eye coordinates. * @param {float} shininess The sharpness of the specular reflection. Higher values create a smaller, more focused specular highlight. * * @returns {float} The intensity of the specular highlight. * * @see czm_phong * * @example * float diffuseIntensity = czm_getLambertDiffuse(lightDirectionEC, normalEC); * float specularIntensity = czm_getSpecular(lightDirectionEC, toEyeEC, normalEC, 200); * vec3 color = (diffuseColor * diffuseIntensity) + (specularColor * specularIntensity); */ float czm_getSpecular(vec3 lightDirectionEC, vec3 toEyeEC, vec3 normalEC, float shininess) { vec3 toReflectedLight = reflect(-lightDirectionEC, normalEC); float specular = max(dot(toReflectedLight, toEyeEC), 0.0); // pow has undefined behavior if both parameters <= 0. // Prevent this by making sure shininess is at least czm_epsilon2. return pow(specular, max(shininess, czm_epsilon2)); } `;var qDt=T(S(),1),OG=`/** * @private */ vec4 czm_getWaterNoise(sampler2D normalMap, vec2 uv, float time, float angleInRadians) { float cosAngle = cos(angleInRadians); float sinAngle = sin(angleInRadians); // time dependent sampling directions vec2 s0 = vec2(1.0/17.0, 0.0); vec2 s1 = vec2(-1.0/29.0, 0.0); vec2 s2 = vec2(1.0/101.0, 1.0/59.0); vec2 s3 = vec2(-1.0/109.0, -1.0/57.0); // rotate sampling direction by specified angle s0 = vec2((cosAngle * s0.x) - (sinAngle * s0.y), (sinAngle * s0.x) + (cosAngle * s0.y)); s1 = vec2((cosAngle * s1.x) - (sinAngle * s1.y), (sinAngle * s1.x) + (cosAngle * s1.y)); s2 = vec2((cosAngle * s2.x) - (sinAngle * s2.y), (sinAngle * s2.x) + (cosAngle * s2.y)); s3 = vec2((cosAngle * s3.x) - (sinAngle * s3.y), (sinAngle * s3.x) + (cosAngle * s3.y)); vec2 uv0 = (uv/103.0) + (time * s0); vec2 uv1 = uv/107.0 + (time * s1) + vec2(0.23); vec2 uv2 = uv/vec2(897.0, 983.0) + (time * s2) + vec2(0.51); vec2 uv3 = uv/vec2(991.0, 877.0) + (time * s3) + vec2(0.71); uv0 = fract(uv0); uv1 = fract(uv1); uv2 = fract(uv2); uv3 = fract(uv3); vec4 noise = (texture(normalMap, uv0)) + (texture(normalMap, uv1)) + (texture(normalMap, uv2)) + (texture(normalMap, uv3)); // average and scale to between -1 and 1 return ((noise / 4.0) - 0.5) * 2.0; } `;var e3t=T(S(),1),YG=`/** * Converts an HSB color (hue, saturation, brightness) to RGB * HSB <-> RGB conversion with minimal branching: {@link http://lolengine.net/blog/2013/07/27/rgb-to-hsv-in-glsl} * * @name czm_HSBToRGB * @glslFunction * * @param {vec3} hsb The color in HSB. * * @returns {vec3} The color in RGB. * * @example * vec3 hsb = czm_RGBToHSB(rgb); * hsb.z *= 0.1; * rgb = czm_HSBToRGB(hsb); */ const vec4 K_HSB2RGB = vec4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0); vec3 czm_HSBToRGB(vec3 hsb) { vec3 p = abs(fract(hsb.xxx + K_HSB2RGB.xyz) * 6.0 - K_HSB2RGB.www); return hsb.z * mix(K_HSB2RGB.xxx, clamp(p - K_HSB2RGB.xxx, 0.0, 1.0), hsb.y); } `;var n3t=T(S(),1),HG=`/** * Converts an HSL color (hue, saturation, lightness) to RGB * HSL <-> RGB conversion: {@link http://www.chilliant.com/rgb2hsv.html} * * @name czm_HSLToRGB * @glslFunction * * @param {vec3} rgb The color in HSL. * * @returns {vec3} The color in RGB. * * @example * vec3 hsl = czm_RGBToHSL(rgb); * hsl.z *= 0.1; * rgb = czm_HSLToRGB(hsl); */ vec3 hueToRGB(float hue) { float r = abs(hue * 6.0 - 3.0) - 1.0; float g = 2.0 - abs(hue * 6.0 - 2.0); float b = 2.0 - abs(hue * 6.0 - 4.0); return clamp(vec3(r, g, b), 0.0, 1.0); } vec3 czm_HSLToRGB(vec3 hsl) { vec3 rgb = hueToRGB(hsl.x); float c = (1.0 - abs(2.0 * hsl.z - 1.0)) * hsl.y; return (rgb - 0.5) * c + hsl.z; } `;var o3t=T(S(),1),zG=`/** * Adjusts the hue of a color. * * @name czm_hue * @glslFunction * * @param {vec3} rgb The color. * @param {float} adjustment The amount to adjust the hue of the color in radians. * * @returns {float} The color with the hue adjusted. * * @example * vec3 adjustHue = czm_hue(color, czm_pi); // The same as czm_hue(color, -czm_pi) */ vec3 czm_hue(vec3 rgb, float adjustment) { const mat3 toYIQ = mat3(0.299, 0.587, 0.114, 0.595716, -0.274453, -0.321263, 0.211456, -0.522591, 0.311135); const mat3 toRGB = mat3(1.0, 0.9563, 0.6210, 1.0, -0.2721, -0.6474, 1.0, -1.107, 1.7046); vec3 yiq = toYIQ * rgb; float hue = atan(yiq.z, yiq.y) + adjustment; float chroma = sqrt(yiq.z * yiq.z + yiq.y * yiq.y); vec3 color = vec3(yiq.x, chroma * cos(hue), chroma * sin(hue)); return toRGB * color; } `;var s3t=T(S(),1),KG=`/** * Converts a color in linear space to RGB space. * * @name czm_inverseGamma * @glslFunction * * @param {vec3} color The color in linear space. * @returns {vec3} The color in RGB space. */ vec3 czm_inverseGamma(vec3 color) { return pow(color, vec3(1.0 / czm_gamma)); } `;var c3t=T(S(),1),JG=`/** * Determines if a time interval is empty. * * @name czm_isEmpty * @glslFunction * * @param {czm_raySegment} interval The interval to test. * * @returns {bool} true if the time interval is empty; otherwise, false. * * @example * bool b0 = czm_isEmpty(czm_emptyRaySegment); // true * bool b1 = czm_isEmpty(czm_raySegment(0.0, 1.0)); // false * bool b2 = czm_isEmpty(czm_raySegment(1.0, 1.0)); // false, contains 1.0. */ bool czm_isEmpty(czm_raySegment interval) { return (interval.stop < 0.0); } `;var d3t=T(S(),1),QG=`/** * Determines if a time interval is empty. * * @name czm_isFull * @glslFunction * * @param {czm_raySegment} interval The interval to test. * * @returns {bool} true if the time interval is empty; otherwise, false. * * @example * bool b0 = czm_isEmpty(czm_emptyRaySegment); // true * bool b1 = czm_isEmpty(czm_raySegment(0.0, 1.0)); // false * bool b2 = czm_isEmpty(czm_raySegment(1.0, 1.0)); // false, contains 1.0. */ bool czm_isFull(czm_raySegment interval) { return (interval.start == 0.0 && interval.stop == czm_infinity); } `;var m3t=T(S(),1),jG=`/** * Computes the fraction of a Web Wercator rectangle at which a given geodetic latitude is located. * * @name czm_latitudeToWebMercatorFraction * @glslFunction * * @param {float} latitude The geodetic latitude, in radians. * @param {float} southMercatorY The Web Mercator coordinate of the southern boundary of the rectangle. * @param {float} oneOverMercatorHeight The total height of the rectangle in Web Mercator coordinates. * * @returns {float} The fraction of the rectangle at which the latitude occurs. If the latitude is the southern * boundary of the rectangle, the return value will be zero. If it is the northern boundary, the return * value will be 1.0. Latitudes in between are mapped according to the Web Mercator projection. */ float czm_latitudeToWebMercatorFraction(float latitude, float southMercatorY, float oneOverMercatorHeight) { float sinLatitude = sin(latitude); float mercatorY = 0.5 * log((1.0 + sinLatitude) / (1.0 - sinLatitude)); return (mercatorY - southMercatorY) * oneOverMercatorHeight; } `;var f3t=T(S(),1),qG=`/** * Converts a linear RGB color to an sRGB color. * * @param {vec3|vec4} linearIn The color in linear color space. * @returns {vec3|vec4} The color in sRGB color space. The vector type matches the input. */ vec3 czm_linearToSrgb(vec3 linearIn) { return pow(linearIn, vec3(1.0/2.2)); } vec4 czm_linearToSrgb(vec4 linearIn) { vec3 srgbOut = pow(linearIn.rgb, vec3(1.0/2.2)); return vec4(srgbOut, linearIn.a); } `;var b3t=T(S(),1),$G=`/** * Computes distance from an point in 2D to a line in 2D. * * @name czm_lineDistance * @glslFunction * * param {vec2} point1 A point along the line. * param {vec2} point2 A point along the line. * param {vec2} point A point that may or may not be on the line. * returns {float} The distance from the point to the line. */ float czm_lineDistance(vec2 point1, vec2 point2, vec2 point) { return abs((point2.y - point1.y) * point.x - (point2.x - point1.x) * point.y + point2.x * point1.y - point2.y * point1.x) / distance(point2, point1); } `;var y3t=T(S(),1),eE=`/** * Computes the luminance of a color. * * @name czm_luminance * @glslFunction * * @param {vec3} rgb The color. * * @returns {float} The luminance. * * @example * float light = czm_luminance(vec3(0.0)); // 0.0 * float dark = czm_luminance(vec3(1.0)); // ~1.0 */ float czm_luminance(vec3 rgb) { // Algorithm from Chapter 10 of Graphics Shaders. const vec3 W = vec3(0.2125, 0.7154, 0.0721); return dot(rgb, W); } `;var _3t=T(S(),1),tE=`/** * Find the maximum component of a vector. * * @name czm_maximumComponent * @glslFunction * * @param {vec2|vec3|vec4} v The input vector. * @returns {float} The value of the largest component. */ float czm_maximumComponent(vec2 v) { return max(v.x, v.y); } float czm_maximumComponent(vec3 v) { return max(max(v.x, v.y), v.z); } float czm_maximumComponent(vec4 v) { return max(max(max(v.x, v.y), v.z), v.w); } `;var S3t=T(S(),1),nE=`/** * Computes the size of a pixel in meters at a distance from the eye. *

* Use this version when passing in a custom pixel ratio. For example, passing in 1.0 will return meters per native device pixel. *

* @name czm_metersPerPixel * @glslFunction * * @param {vec3} positionEC The position to get the meters per pixel in eye coordinates. * @param {float} pixelRatio The scaling factor from pixel space to coordinate space * * @returns {float} The meters per pixel at positionEC. */ float czm_metersPerPixel(vec4 positionEC, float pixelRatio) { float width = czm_viewport.z; float height = czm_viewport.w; float pixelWidth; float pixelHeight; float top = czm_frustumPlanes.x; float bottom = czm_frustumPlanes.y; float left = czm_frustumPlanes.z; float right = czm_frustumPlanes.w; if (czm_sceneMode == czm_sceneMode2D || czm_orthographicIn3D == 1.0) { float frustumWidth = right - left; float frustumHeight = top - bottom; pixelWidth = frustumWidth / width; pixelHeight = frustumHeight / height; } else { float distanceToPixel = -positionEC.z; float inverseNear = 1.0 / czm_currentFrustum.x; float tanTheta = top * inverseNear; pixelHeight = 2.0 * distanceToPixel * tanTheta / height; tanTheta = right * inverseNear; pixelWidth = 2.0 * distanceToPixel * tanTheta / width; } return max(pixelWidth, pixelHeight) * pixelRatio; } /** * Computes the size of a pixel in meters at a distance from the eye. *

* Use this version when scaling by pixel ratio. *

* @name czm_metersPerPixel * @glslFunction * * @param {vec3} positionEC The position to get the meters per pixel in eye coordinates. * * @returns {float} The meters per pixel at positionEC. */ float czm_metersPerPixel(vec4 positionEC) { return czm_metersPerPixel(positionEC, czm_pixelRatio); } `;var V3t=T(S(),1),iE=`/** * Transforms a position from model to window coordinates. The transformation * from model to clip coordinates is done using {@link czm_modelViewProjection}. * The transform from normalized device coordinates to window coordinates is * done using {@link czm_viewportTransformation}, which assumes a depth range * of near = 0 and far = 1. *

* This transform is useful when there is a need to manipulate window coordinates * in a vertex shader as done by {@link BillboardCollection}. *

* This function should not be confused with {@link czm_viewportOrthographic}, * which is an orthographic projection matrix that transforms from window * coordinates to clip coordinates. * * @name czm_modelToWindowCoordinates * @glslFunction * * @param {vec4} position The position in model coordinates to transform. * * @returns {vec4} The transformed position in window coordinates. * * @see czm_eyeToWindowCoordinates * @see czm_modelViewProjection * @see czm_viewportTransformation * @see czm_viewportOrthographic * @see BillboardCollection * * @example * vec4 positionWC = czm_modelToWindowCoordinates(positionMC); */ vec4 czm_modelToWindowCoordinates(vec4 position) { vec4 q = czm_modelViewProjection * position; // clip coordinates q.xyz /= q.w; // normalized device coordinates q.xyz = (czm_viewportTransformation * vec4(q.xyz, 1.0)).xyz; // window coordinates return q; } `;var R3t=T(S(),1),oE=`/** * DOC_TBA * * @name czm_multiplyWithColorBalance * @glslFunction */ vec3 czm_multiplyWithColorBalance(vec3 left, vec3 right) { // Algorithm from Chapter 10 of Graphics Shaders. const vec3 W = vec3(0.2125, 0.7154, 0.0721); vec3 target = left * right; float leftLuminance = dot(left, W); float rightLuminance = dot(right, W); float targetLuminance = dot(target, W); return ((leftLuminance + rightLuminance) / (2.0 * targetLuminance)) * target; } `;var G3t=T(S(),1),rE=`/** * Computes a value that scales with distance. The scaling is clamped at the near and * far distances, and does not extrapolate. This function works with the * {@link NearFarScalar} JavaScript class. * * @name czm_nearFarScalar * @glslFunction * * @param {vec4} nearFarScalar A vector with 4 components: Near distance (x), Near value (y), Far distance (z), Far value (w). * @param {float} cameraDistSq The square of the current distance from the camera. * * @returns {float} The value at this distance. */ float czm_nearFarScalar(vec4 nearFarScalar, float cameraDistSq) { float valueAtMin = nearFarScalar.y; float valueAtMax = nearFarScalar.w; float nearDistanceSq = nearFarScalar.x * nearFarScalar.x; float farDistanceSq = nearFarScalar.z * nearFarScalar.z; float t = (cameraDistSq - nearDistanceSq) / (farDistanceSq - nearDistanceSq); t = pow(clamp(t, 0.0, 1.0), 0.2); return mix(valueAtMin, valueAtMax, t); } `;var I3t=T(S(),1),sE=` /** * Decodes a unit-length vector in 'oct' encoding to a normalized 3-component Cartesian vector. * The 'oct' encoding is described in "A Survey of Efficient Representations of Independent Unit Vectors", * Cigolle et al 2014: http://jcgt.org/published/0003/02/01/ * * @name czm_octDecode * @param {vec2} encoded The oct-encoded, unit-length vector * @param {float} range The maximum value of the SNORM range. The encoded vector is stored in log2(rangeMax+1) bits. * @returns {vec3} The decoded and normalized vector */ vec3 czm_octDecode(vec2 encoded, float range) { if (encoded.x == 0.0 && encoded.y == 0.0) { return vec3(0.0, 0.0, 0.0); } encoded = encoded / range * 2.0 - 1.0; vec3 v = vec3(encoded.x, encoded.y, 1.0 - abs(encoded.x) - abs(encoded.y)); if (v.z < 0.0) { v.xy = (1.0 - abs(v.yx)) * czm_signNotZero(v.xy); } return normalize(v); } /** * Decodes a unit-length vector in 'oct' encoding to a normalized 3-component Cartesian vector. * The 'oct' encoding is described in "A Survey of Efficient Representations of Independent Unit Vectors", * Cigolle et al 2014: http://jcgt.org/published/0003/02/01/ * * @name czm_octDecode * @param {vec2} encoded The oct-encoded, unit-length vector * @returns {vec3} The decoded and normalized vector */ vec3 czm_octDecode(vec2 encoded) { return czm_octDecode(encoded, 255.0); } /** * Decodes a unit-length vector in 'oct' encoding packed into a floating-point number to a normalized 3-component Cartesian vector. * The 'oct' encoding is described in "A Survey of Efficient Representations of Independent Unit Vectors", * Cigolle et al 2014: http://jcgt.org/published/0003/02/01/ * * @name czm_octDecode * @param {float} encoded The oct-encoded, unit-length vector * @returns {vec3} The decoded and normalized vector */ vec3 czm_octDecode(float encoded) { float temp = encoded / 256.0; float x = floor(temp); float y = (temp - x) * 256.0; return czm_octDecode(vec2(x, y)); } /** * Decodes three unit-length vectors in 'oct' encoding packed into two floating-point numbers to normalized 3-component Cartesian vectors. * The 'oct' encoding is described in "A Survey of Efficient Representations of Independent Unit Vectors", * Cigolle et al 2014: http://jcgt.org/published/0003/02/01/ * * @name czm_octDecode * @param {vec2} encoded The packed oct-encoded, unit-length vectors. * @param {vec3} vector1 One decoded and normalized vector. * @param {vec3} vector2 One decoded and normalized vector. * @param {vec3} vector3 One decoded and normalized vector. */ void czm_octDecode(vec2 encoded, out vec3 vector1, out vec3 vector2, out vec3 vector3) { float temp = encoded.x / 65536.0; float x = floor(temp); float encodedFloat1 = (temp - x) * 65536.0; temp = encoded.y / 65536.0; float y = floor(temp); float encodedFloat2 = (temp - y) * 65536.0; vector1 = czm_octDecode(encodedFloat1); vector2 = czm_octDecode(encodedFloat2); vector3 = czm_octDecode(vec2(x, y)); } `;var W3t=T(S(),1),aE=`/** * Packs a depth value into a vec4 that can be represented by unsigned bytes. * * @name czm_packDepth * @glslFunction * * @param {float} depth The floating-point depth. * @returns {vec4} The packed depth. */ vec4 czm_packDepth(float depth) { // See Aras Pranckevi\u010Dius' post Encoding Floats to RGBA // http://aras-p.info/blog/2009/07/30/encoding-floats-to-rgba-the-final/ vec4 enc = vec4(1.0, 255.0, 65025.0, 16581375.0) * depth; enc = fract(enc); enc -= enc.yzww * vec4(1.0 / 255.0, 1.0 / 255.0, 1.0 / 255.0, 0.0); return enc; } `;var v3t=T(S(),1),cE=`vec3 lambertianDiffuse(vec3 diffuseColor) { return diffuseColor / czm_pi; } vec3 fresnelSchlick2(vec3 f0, vec3 f90, float VdotH) { float versine = 1.0 - VdotH; // pow(versine, 5.0) is slow. See https://stackoverflow.com/a/68793086/10082269 float versineSquared = versine * versine; return f0 + (f90 - f0) * versineSquared * versineSquared * versine; } #ifdef USE_ANISOTROPY /** * @param {float} bitangentRoughness Material roughness (along the anisotropy bitangent) * @param {float} tangentialRoughness Anisotropic roughness (along the anisotropy tangent) * @param {vec3} lightDirection The direction from the fragment to the light source, transformed to tangent-bitangent-normal coordinates * @param {vec3} viewDirection The direction from the fragment to the camera, transformed to tangent-bitangent-normal coordinates */ float smithVisibilityGGX_anisotropic(float bitangentRoughness, float tangentialRoughness, vec3 lightDirection, vec3 viewDirection) { vec3 roughnessScale = vec3(tangentialRoughness, bitangentRoughness, 1.0); float GGXV = lightDirection.z * length(roughnessScale * viewDirection); float GGXL = viewDirection.z * length(roughnessScale * lightDirection); float v = 0.5 / (GGXV + GGXL); return clamp(v, 0.0, 1.0); } /** * @param {float} bitangentRoughness Material roughness (along the anisotropy bitangent) * @param {float} tangentialRoughness Anisotropic roughness (along the anisotropy tangent) * @param {vec3} halfwayDirection The unit vector halfway between light and view directions, transformed to tangent-bitangent-normal coordinates */ float GGX_anisotropic(float bitangentRoughness, float tangentialRoughness, vec3 halfwayDirection) { float roughnessSquared = bitangentRoughness * tangentialRoughness; vec3 f = halfwayDirection * vec3(bitangentRoughness, tangentialRoughness, roughnessSquared); float w2 = roughnessSquared / dot(f, f); return roughnessSquared * w2 * w2 / czm_pi; } #endif /** * Estimate the geometric self-shadowing of the microfacets in a surface, * using the Smith Joint GGX visibility function. * Note: Vis = G / (4 * NdotL * NdotV) * see Eric Heitz. 2014. Understanding the Masking-Shadowing Function in Microfacet-Based BRDFs. Journal of Computer Graphics Techniques, 3 * see Real-Time Rendering. Page 331 to 336. * see https://google.github.io/filament/Filament.md.html#materialsystem/specularbrdf/geometricshadowing(specularg) * * @param {float} alphaRoughness The roughness of the material, expressed as the square of perceptual roughness. * @param {float} NdotL The cosine of the angle between the surface normal and the direction to the light source. * @param {float} NdotV The cosine of the angle between the surface normal and the direction to the camera. */ float smithVisibilityGGX(float alphaRoughness, float NdotL, float NdotV) { float alphaRoughnessSq = alphaRoughness * alphaRoughness; float GGXV = NdotL * sqrt(NdotV * NdotV * (1.0 - alphaRoughnessSq) + alphaRoughnessSq); float GGXL = NdotV * sqrt(NdotL * NdotL * (1.0 - alphaRoughnessSq) + alphaRoughnessSq); float GGX = GGXV + GGXL; if (GGX > 0.0) { return 0.5 / GGX; } return 0.0; } /** * Estimate the fraction of the microfacets in a surface that are aligned with * the halfway vector, which is aligned halfway between the directions from * the fragment to the camera and from the fragment to the light source. * * @param {float} alphaRoughness The roughness of the material, expressed as the square of perceptual roughness. * @param {float} NdotH The cosine of the angle between the surface normal and the halfway vector. * @return {float} The fraction of microfacets aligned to the halfway vector. */ float GGX(float alphaRoughness, float NdotH) { float alphaRoughnessSquared = alphaRoughness * alphaRoughness; float f = (NdotH * alphaRoughnessSquared - NdotH) * NdotH + 1.0; return alphaRoughnessSquared / (czm_pi * f * f); } /** * Compute the strength of the specular reflection due to direct lighting. * * @param {vec3} normal The surface normal. * @param {vec3} lightDirection The unit vector pointing from the fragment to the light source. * @param {vec3} viewDirection The unit vector pointing from the fragment to the camera. * @param {vec3} halfwayDirection The unit vector pointing from the fragment to halfway between the light source and the camera. * @param {float} alphaRoughness The roughness of the material, expressed as the square of perceptual roughness. * @return {float} The strength of the specular reflection. */ float computeDirectSpecularStrength(vec3 normal, vec3 lightDirection, vec3 viewDirection, vec3 halfwayDirection, float alphaRoughness) { float NdotL = clamp(dot(normal, lightDirection), 0.0, 1.0); float NdotV = clamp(dot(normal, viewDirection), 0.0, 1.0); float G = smithVisibilityGGX(alphaRoughness, NdotL, NdotV); float NdotH = clamp(dot(normal, halfwayDirection), 0.0, 1.0); float D = GGX(alphaRoughness, NdotH); return G * D; } /** * Compute the diffuse and specular contributions using physically based * rendering. This function only handles direct lighting. *

* This function only handles the lighting calculations. Metallic/roughness * and specular/glossy must be handled separately. See {@MaterialStageFS} *

* * @name czm_pbrLighting * @glslFunction * * @param {vec3} viewDirectionEC Unit vector pointing from the fragment to the eye position * @param {vec3} normalEC The surface normal in eye coordinates * @param {vec3} lightDirectionEC Unit vector pointing to the light source in eye coordinates. * @param {czm_modelMaterial} The material properties. * @return {vec3} The computed HDR color */ vec3 czm_pbrLighting(vec3 viewDirectionEC, vec3 normalEC, vec3 lightDirectionEC, czm_modelMaterial material) { vec3 halfwayDirectionEC = normalize(viewDirectionEC + lightDirectionEC); float VdotH = clamp(dot(viewDirectionEC, halfwayDirectionEC), 0.0, 1.0); float NdotL = clamp(dot(normalEC, lightDirectionEC), 0.001, 1.0); vec3 f0 = material.specular; float reflectance = czm_maximumComponent(f0); // Typical dielectrics will have reflectance 0.04, so f90 will be 1.0. // In this case, at grazing angle, all incident energy is reflected. vec3 f90 = vec3(clamp(reflectance * 25.0, 0.0, 1.0)); vec3 F = fresnelSchlick2(f0, f90, VdotH); #if defined(USE_SPECULAR) F *= material.specularWeight; #endif float alphaRoughness = material.roughness * material.roughness; #ifdef USE_ANISOTROPY mat3 tbn = mat3(material.anisotropicT, material.anisotropicB, normalEC); vec3 lightDirection = lightDirectionEC * tbn; vec3 viewDirection = viewDirectionEC * tbn; vec3 halfwayDirection = halfwayDirectionEC * tbn; float anisotropyStrength = material.anisotropyStrength; float tangentialRoughness = mix(alphaRoughness, 1.0, anisotropyStrength * anisotropyStrength); float bitangentRoughness = clamp(alphaRoughness, 0.001, 1.0); float G = smithVisibilityGGX_anisotropic(bitangentRoughness, tangentialRoughness, lightDirection, viewDirection); float D = GGX_anisotropic(bitangentRoughness, tangentialRoughness, halfwayDirection); vec3 specularContribution = F * G * D; #else float specularStrength = computeDirectSpecularStrength(normalEC, lightDirectionEC, viewDirectionEC, halfwayDirectionEC, alphaRoughness); vec3 specularContribution = F * specularStrength; #endif vec3 diffuseColor = material.diffuse; // F here represents the specular contribution vec3 diffuseContribution = (1.0 - F) * lambertianDiffuse(diffuseColor); // Lo = (diffuse + specular) * Li * NdotL return (diffuseContribution + specularContribution) * NdotL; } `;var F3t=T(S(),1),lE=`// KhronosGroup https://github.com/KhronosGroup/ToneMapping/tree/main/PBR_Neutral // Input color is non-negative and resides in the Linear Rec. 709 color space. // Output color is also Linear Rec. 709, but in the [0, 1] range. vec3 czm_pbrNeutralTonemapping(vec3 color) { const float startCompression = 0.8 - 0.04; const float desaturation = 0.15; float x = min(color.r, min(color.g, color.b)); float offset = czm_branchFreeTernary(x < 0.08, x - 6.25 * x * x, 0.04); color -= offset; float peak = max(color.r, max(color.g, color.b)); if (peak < startCompression) return color; const float d = 1.0 - startCompression; float newPeak = 1.0 - d * d / (peak + d - startCompression); color *= newPeak / peak; float g = 1.0 - 1.0 / (desaturation * (peak - newPeak) + 1.0); return mix(color, newPeak * vec3(1.0, 1.0, 1.0), g); } `;var M3t=T(S(),1),dE=`float czm_private_getLambertDiffuseOfMaterial(vec3 lightDirectionEC, czm_material material) { return czm_getLambertDiffuse(lightDirectionEC, material.normal); } float czm_private_getSpecularOfMaterial(vec3 lightDirectionEC, vec3 toEyeEC, czm_material material) { return czm_getSpecular(lightDirectionEC, toEyeEC, material.normal, material.shininess); } /** * Computes a color using the Phong lighting model. * * @name czm_phong * @glslFunction * * @param {vec3} toEye A normalized vector from the fragment to the eye in eye coordinates. * @param {czm_material} material The fragment's material. * * @returns {vec4} The computed color. * * @example * vec3 positionToEyeEC = // ... * czm_material material = // ... * vec3 lightDirectionEC = // ... * out_FragColor = czm_phong(normalize(positionToEyeEC), material, lightDirectionEC); * * @see czm_getMaterial */ vec4 czm_phong(vec3 toEye, czm_material material, vec3 lightDirectionEC) { // Diffuse from directional light sources at eye (for top-down) float diffuse = czm_private_getLambertDiffuseOfMaterial(vec3(0.0, 0.0, 1.0), material); if (czm_sceneMode == czm_sceneMode3D) { // (and horizon views in 3D) diffuse += czm_private_getLambertDiffuseOfMaterial(vec3(0.0, 1.0, 0.0), material); } float specular = czm_private_getSpecularOfMaterial(lightDirectionEC, toEye, material); // Temporary workaround for adding ambient. vec3 materialDiffuse = material.diffuse * 0.5; vec3 ambient = materialDiffuse; vec3 color = ambient + material.emission; color += materialDiffuse * diffuse * czm_lightColor; color += material.specular * specular * czm_lightColor; return vec4(color, material.alpha); } vec4 czm_private_phong(vec3 toEye, czm_material material, vec3 lightDirectionEC) { float diffuse = czm_private_getLambertDiffuseOfMaterial(lightDirectionEC, material); float specular = czm_private_getSpecularOfMaterial(lightDirectionEC, toEye, material); vec3 ambient = vec3(0.0); vec3 color = ambient + material.emission; color += material.diffuse * diffuse * czm_lightColor; color += material.specular * specular * czm_lightColor; return vec4(color, material.alpha); } `;var k3t=T(S(),1),uE=`/** * Computes distance from a point to a plane. * * @name czm_planeDistance * @glslFunction * * param {vec4} plane A Plane in Hessian Normal Form. See Plane.js * param {vec3} point A point in the same space as the plane. * returns {float} The distance from the point to the plane. */ float czm_planeDistance(vec4 plane, vec3 point) { return (dot(plane.xyz, point) + plane.w); } /** * Computes distance from a point to a plane. * * @name czm_planeDistance * @glslFunction * * param {vec3} planeNormal Normal for a plane in Hessian Normal Form. See Plane.js * param {float} planeDistance Distance for a plane in Hessian Normal form. See Plane.js * param {vec3} point A point in the same space as the plane. * returns {float} The distance from the point to the plane. */ float czm_planeDistance(vec3 planeNormal, float planeDistance, vec3 point) { return (dot(planeNormal, point) + planeDistance); } `;var D3t=T(S(),1),mE=`/** * Computes the point along a ray at the given time. time can be positive, negative, or zero. * * @name czm_pointAlongRay * @glslFunction * * @param {czm_ray} ray The ray to compute the point along. * @param {float} time The time along the ray. * * @returns {vec3} The point along the ray at the given time. * * @example * czm_ray ray = czm_ray(vec3(0.0), vec3(1.0, 0.0, 0.0)); // origin, direction * vec3 v = czm_pointAlongRay(ray, 2.0); // (2.0, 0.0, 0.0) */ vec3 czm_pointAlongRay(czm_ray ray, float time) { return ray.origin + (time * ray.direction); } `;var O3t=T(S(),1),hE=`/** * DOC_TBA * * @name czm_rayEllipsoidIntersectionInterval * @glslFunction */ czm_raySegment czm_rayEllipsoidIntersectionInterval(czm_ray ray, vec3 ellipsoid_center, vec3 ellipsoid_inverseRadii) { // ray and ellipsoid center in eye coordinates. radii in model coordinates. vec3 q = ellipsoid_inverseRadii * (czm_inverseModelView * vec4(ray.origin, 1.0)).xyz; vec3 w = ellipsoid_inverseRadii * (czm_inverseModelView * vec4(ray.direction, 0.0)).xyz; q = q - ellipsoid_inverseRadii * (czm_inverseModelView * vec4(ellipsoid_center, 1.0)).xyz; float q2 = dot(q, q); float qw = dot(q, w); if (q2 > 1.0) // Outside ellipsoid. { if (qw >= 0.0) // Looking outward or tangent (0 intersections). { return czm_emptyRaySegment; } else // qw < 0.0. { float qw2 = qw * qw; float difference = q2 - 1.0; // Positively valued. float w2 = dot(w, w); float product = w2 * difference; if (qw2 < product) // Imaginary roots (0 intersections). { return czm_emptyRaySegment; } else if (qw2 > product) // Distinct roots (2 intersections). { float discriminant = qw * qw - product; float temp = -qw + sqrt(discriminant); // Avoid cancellation. float root0 = temp / w2; float root1 = difference / temp; if (root0 < root1) { czm_raySegment i = czm_raySegment(root0, root1); return i; } else { czm_raySegment i = czm_raySegment(root1, root0); return i; } } else // qw2 == product. Repeated roots (2 intersections). { float root = sqrt(difference / w2); czm_raySegment i = czm_raySegment(root, root); return i; } } } else if (q2 < 1.0) // Inside ellipsoid (2 intersections). { float difference = q2 - 1.0; // Negatively valued. float w2 = dot(w, w); float product = w2 * difference; // Negatively valued. float discriminant = qw * qw - product; float temp = -qw + sqrt(discriminant); // Positively valued. czm_raySegment i = czm_raySegment(0.0, temp / w2); return i; } else // q2 == 1.0. On ellipsoid. { if (qw < 0.0) // Looking inward. { float w2 = dot(w, w); czm_raySegment i = czm_raySegment(0.0, -qw / w2); return i; } else // qw >= 0.0. Looking outward or tangent. { return czm_emptyRaySegment; } } } `;var H3t=T(S(),1),fE=`/** * Compute the intersection interval of a ray with a sphere. * * @name czm_raySphereIntersectionInterval * @glslFunction * * @param {czm_ray} ray The ray. * @param {vec3} center The center of the sphere. * @param {float} radius The radius of the sphere. * @return {czm_raySegment} The intersection interval of the ray with the sphere. */ czm_raySegment czm_raySphereIntersectionInterval(czm_ray ray, vec3 center, float radius) { vec3 o = ray.origin; vec3 d = ray.direction; vec3 oc = o - center; float a = dot(d, d); float b = 2.0 * dot(d, oc); float c = dot(oc, oc) - (radius * radius); float det = (b * b) - (4.0 * a * c); if (det < 0.0) { return czm_emptyRaySegment; } float sqrtDet = sqrt(det); float t0 = (-b - sqrtDet) / (2.0 * a); float t1 = (-b + sqrtDet) / (2.0 * a); czm_raySegment result = czm_raySegment(t0, t1); return result; } `;var K3t=T(S(),1),pE=`float czm_readDepth(sampler2D depthTexture, vec2 texCoords) { return czm_reverseLogDepth(texture(depthTexture, texCoords).r); } `;var Q3t=T(S(),1),bE=`/** * Reads a value previously transformed with {@link czm_writeNonPerspective} * by dividing it by \`w\`, the value used in the perspective divide. * This function is intended to be called in a fragment shader to access a * \`varying\` that should not be subject to perspective interpolation. * For example, screen-space texture coordinates. The value should have been * previously written in the vertex shader with a call to * {@link czm_writeNonPerspective}. * * @name czm_readNonPerspective * @glslFunction * * @param {float|vec2|vec3|vec4} value The non-perspective value to be read. * @param {float} oneOverW One over the perspective divide value, \`w\`. Usually this is simply \`gl_FragCoord.w\`. * @returns {float|vec2|vec3|vec4} The usable value. */ float czm_readNonPerspective(float value, float oneOverW) { return value * oneOverW; } vec2 czm_readNonPerspective(vec2 value, float oneOverW) { return value * oneOverW; } vec3 czm_readNonPerspective(vec3 value, float oneOverW) { return value * oneOverW; } vec4 czm_readNonPerspective(vec4 value, float oneOverW) { return value * oneOverW; } `;var q3t=T(S(),1),gE=`float czm_reverseLogDepth(float logZ) { #ifdef LOG_DEPTH float near = czm_currentFrustum.x; float far = czm_currentFrustum.y; float log2Depth = logZ * czm_log2FarDepthFromNearPlusOne; float depthFromNear = exp2(log2Depth) - 1.0; return far * (1.0 - near / (depthFromNear + near)) / (far - near); #endif return logZ; } `;var eBt=T(S(),1),yE=`/** * Converts an RGB color to HSB (hue, saturation, brightness) * HSB <-> RGB conversion with minimal branching: {@link http://lolengine.net/blog/2013/07/27/rgb-to-hsv-in-glsl} * * @name czm_RGBToHSB * @glslFunction * * @param {vec3} rgb The color in RGB. * * @returns {vec3} The color in HSB. * * @example * vec3 hsb = czm_RGBToHSB(rgb); * hsb.z *= 0.1; * rgb = czm_HSBToRGB(hsb); */ const vec4 K_RGB2HSB = vec4(0.0, -1.0 / 3.0, 2.0 / 3.0, -1.0); vec3 czm_RGBToHSB(vec3 rgb) { vec4 p = mix(vec4(rgb.bg, K_RGB2HSB.wz), vec4(rgb.gb, K_RGB2HSB.xy), step(rgb.b, rgb.g)); vec4 q = mix(vec4(p.xyw, rgb.r), vec4(rgb.r, p.yzx), step(p.x, rgb.r)); float d = q.x - min(q.w, q.y); return vec3(abs(q.z + (q.w - q.y) / (6.0 * d + czm_epsilon7)), d / (q.x + czm_epsilon7), q.x); } `;var nBt=T(S(),1),xE=`/** * Converts an RGB color to HSL (hue, saturation, lightness) * HSL <-> RGB conversion: {@link http://www.chilliant.com/rgb2hsv.html} * * @name czm_RGBToHSL * @glslFunction * * @param {vec3} rgb The color in RGB. * * @returns {vec3} The color in HSL. * * @example * vec3 hsl = czm_RGBToHSL(rgb); * hsl.z *= 0.1; * rgb = czm_HSLToRGB(hsl); */ vec3 RGBtoHCV(vec3 rgb) { // Based on work by Sam Hocevar and Emil Persson vec4 p = (rgb.g < rgb.b) ? vec4(rgb.bg, -1.0, 2.0 / 3.0) : vec4(rgb.gb, 0.0, -1.0 / 3.0); vec4 q = (rgb.r < p.x) ? vec4(p.xyw, rgb.r) : vec4(rgb.r, p.yzx); float c = q.x - min(q.w, q.y); float h = abs((q.w - q.y) / (6.0 * c + czm_epsilon7) + q.z); return vec3(h, c, q.x); } vec3 czm_RGBToHSL(vec3 rgb) { vec3 hcv = RGBtoHCV(rgb); float l = hcv.z - hcv.y * 0.5; float s = hcv.y / (1.0 - abs(l * 2.0 - 1.0) + czm_epsilon7); return vec3(hcv.x, s, l); } `;var oBt=T(S(),1),_E=`/** * Converts an RGB color to CIE Yxy. *

The conversion is described in * {@link http://content.gpwiki.org/index.php/D3DBook:High-Dynamic_Range_Rendering#Luminance_Transform|Luminance Transform} *

* * @name czm_RGBToXYZ * @glslFunction * * @param {vec3} rgb The color in RGB. * * @returns {vec3} The color in CIE Yxy. * * @example * vec3 xyz = czm_RGBToXYZ(rgb); * xyz.x = max(xyz.x - luminanceThreshold, 0.0); * rgb = czm_XYZToRGB(xyz); */ vec3 czm_RGBToXYZ(vec3 rgb) { const mat3 RGB2XYZ = mat3(0.4124, 0.2126, 0.0193, 0.3576, 0.7152, 0.1192, 0.1805, 0.0722, 0.9505); vec3 xyz = RGB2XYZ * rgb; vec3 Yxy; Yxy.r = xyz.g; float temp = dot(vec3(1.0), xyz); Yxy.gb = xyz.rg / temp; return Yxy; } `;var sBt=T(S(),1),TE=`/** * Round a floating point value. This function exists because round() doesn't * exist in GLSL 1.00. * * @param {float|vec2|vec3|vec4} value The value to round * @param {float|vec2|vec3|vec3} The rounded value. The type matches the input. */ float czm_round(float value) { return floor(value + 0.5); } vec2 czm_round(vec2 value) { return floor(value + 0.5); } vec3 czm_round(vec3 value) { return floor(value + 0.5); } vec4 czm_round(vec4 value) { return floor(value + 0.5); } `;var cBt=T(S(),1),SE=`/** * Adjusts the saturation of a color. * * @name czm_saturation * @glslFunction * * @param {vec3} rgb The color. * @param {float} adjustment The amount to adjust the saturation of the color. * * @returns {float} The color with the saturation adjusted. * * @example * vec3 greyScale = czm_saturation(color, 0.0); * vec3 doubleSaturation = czm_saturation(color, 2.0); */ vec3 czm_saturation(vec3 rgb, float adjustment) { // Algorithm from Chapter 16 of OpenGL Shading Language const vec3 W = vec3(0.2125, 0.7154, 0.0721); vec3 intensity = vec3(dot(rgb, W)); return mix(intensity, rgb, adjustment); } `;var dBt=T(S(),1),CE=` float czm_sampleShadowMap(highp samplerCube shadowMap, vec3 d) { return czm_unpackDepth(czm_textureCube(shadowMap, d)); } float czm_sampleShadowMap(highp sampler2D shadowMap, vec2 uv) { #ifdef USE_SHADOW_DEPTH_TEXTURE return texture(shadowMap, uv).r; #else return czm_unpackDepth(texture(shadowMap, uv)); #endif } float czm_shadowDepthCompare(samplerCube shadowMap, vec3 uv, float depth) { return step(depth, czm_sampleShadowMap(shadowMap, uv)); } float czm_shadowDepthCompare(sampler2D shadowMap, vec2 uv, float depth) { return step(depth, czm_sampleShadowMap(shadowMap, uv)); } `;var mBt=T(S(),1),VE=` float czm_private_shadowVisibility(float visibility, float nDotL, float normalShadingSmooth, float darkness) { #ifdef USE_NORMAL_SHADING #ifdef USE_NORMAL_SHADING_SMOOTH float strength = clamp(nDotL / normalShadingSmooth, 0.0, 1.0); #else float strength = step(0.0, nDotL); #endif visibility *= strength; #endif visibility = max(visibility, darkness); return visibility; } #ifdef USE_CUBE_MAP_SHADOW float czm_shadowVisibility(samplerCube shadowMap, czm_shadowParameters shadowParameters) { float depthBias = shadowParameters.depthBias; float depth = shadowParameters.depth; float nDotL = shadowParameters.nDotL; float normalShadingSmooth = shadowParameters.normalShadingSmooth; float darkness = shadowParameters.darkness; vec3 uvw = shadowParameters.texCoords; depth -= depthBias; float visibility = czm_shadowDepthCompare(shadowMap, uvw, depth); return czm_private_shadowVisibility(visibility, nDotL, normalShadingSmooth, darkness); } #else float czm_shadowVisibility(sampler2D shadowMap, czm_shadowParameters shadowParameters) { float depthBias = shadowParameters.depthBias; float depth = shadowParameters.depth; float nDotL = shadowParameters.nDotL; float normalShadingSmooth = shadowParameters.normalShadingSmooth; float darkness = shadowParameters.darkness; vec2 uv = shadowParameters.texCoords; depth -= depthBias; #ifdef USE_SOFT_SHADOWS vec2 texelStepSize = shadowParameters.texelStepSize; float radius = 1.0; float dx0 = -texelStepSize.x * radius; float dy0 = -texelStepSize.y * radius; float dx1 = texelStepSize.x * radius; float dy1 = texelStepSize.y * radius; float visibility = ( czm_shadowDepthCompare(shadowMap, uv, depth) + czm_shadowDepthCompare(shadowMap, uv + vec2(dx0, dy0), depth) + czm_shadowDepthCompare(shadowMap, uv + vec2(0.0, dy0), depth) + czm_shadowDepthCompare(shadowMap, uv + vec2(dx1, dy0), depth) + czm_shadowDepthCompare(shadowMap, uv + vec2(dx0, 0.0), depth) + czm_shadowDepthCompare(shadowMap, uv + vec2(dx1, 0.0), depth) + czm_shadowDepthCompare(shadowMap, uv + vec2(dx0, dy1), depth) + czm_shadowDepthCompare(shadowMap, uv + vec2(0.0, dy1), depth) + czm_shadowDepthCompare(shadowMap, uv + vec2(dx1, dy1), depth) ) * (1.0 / 9.0); #else float visibility = czm_shadowDepthCompare(shadowMap, uv, depth); #endif return czm_private_shadowVisibility(visibility, nDotL, normalShadingSmooth, darkness); } #endif `;var fBt=T(S(),1),LE=`/** * Returns 1.0 if the given value is positive or zero, and -1.0 if it is negative. This is similar to the GLSL * built-in function sign except that returns 1.0 instead of 0.0 when the input value is 0.0. * * @name czm_signNotZero * @glslFunction * * @param {} value The value for which to determine the sign. * @returns {} 1.0 if the value is positive or zero, -1.0 if the value is negative. */ float czm_signNotZero(float value) { return value >= 0.0 ? 1.0 : -1.0; } vec2 czm_signNotZero(vec2 value) { return vec2(czm_signNotZero(value.x), czm_signNotZero(value.y)); } vec3 czm_signNotZero(vec3 value) { return vec3(czm_signNotZero(value.x), czm_signNotZero(value.y), czm_signNotZero(value.z)); } vec4 czm_signNotZero(vec4 value) { return vec4(czm_signNotZero(value.x), czm_signNotZero(value.y), czm_signNotZero(value.z), czm_signNotZero(value.w)); } `;var bBt=T(S(),1),RE=`/** * Computes a color from the third order spherical harmonic coefficients and a normalized direction vector. *

* The order of the coefficients is [L00, L1_1, L10, L11, L2_2, L2_1, L20, L21, L22]. *

* * @name czm_sphericalHarmonics * @glslFunction * * @param {vec3} normal The normalized direction. * @param {vec3[9]} coefficients The third order spherical harmonic coefficients. * @returns {vec3} The color at the direction. * * @see https://graphics.stanford.edu/papers/envmap/envmap.pdf */ vec3 czm_sphericalHarmonics(vec3 normal, vec3 coefficients[9]) { vec3 L00 = coefficients[0]; vec3 L1_1 = coefficients[1]; vec3 L10 = coefficients[2]; vec3 L11 = coefficients[3]; vec3 L2_2 = coefficients[4]; vec3 L2_1 = coefficients[5]; vec3 L20 = coefficients[6]; vec3 L21 = coefficients[7]; vec3 L22 = coefficients[8]; float x = normal.x; float y = normal.y; float z = normal.z; vec3 L = L00 + L1_1 * y + L10 * z + L11 * x + L2_2 * (y * x) + L2_1 * (y * z) + L20 * (3.0 * z * z - 1.0) + L21 * (z * x) + L22 * (x * x - y * y); return max(L, vec3(0.0)); } `;var yBt=T(S(),1),ZE=`/** * Converts an sRGB color to a linear RGB color. * * @param {vec3|vec4} srgbIn The color in sRGB space * @returns {vec3|vec4} The color in linear color space. The vector type matches the input. */ vec3 czm_srgbToLinear(vec3 srgbIn) { return pow(srgbIn, vec3(2.2)); } vec4 czm_srgbToLinear(vec4 srgbIn) { vec3 linearOut = pow(srgbIn.rgb, vec3(2.2)); return vec4(linearOut, srgbIn.a); } `;var _Bt=T(S(),1),GE=`/** * Creates a matrix that transforms vectors from tangent space to eye space. * * @name czm_tangentToEyeSpaceMatrix * @glslFunction * * @param {vec3} normalEC The normal vector in eye coordinates. * @param {vec3} tangentEC The tangent vector in eye coordinates. * @param {vec3} bitangentEC The bitangent vector in eye coordinates. * * @returns {mat3} The matrix that transforms from tangent space to eye space. * * @example * mat3 tangentToEye = czm_tangentToEyeSpaceMatrix(normalEC, tangentEC, bitangentEC); * vec3 normal = tangentToEye * texture(normalMap, st).xyz; */ mat3 czm_tangentToEyeSpaceMatrix(vec3 normalEC, vec3 tangentEC, vec3 bitangentEC) { vec3 normal = normalize(normalEC); vec3 tangent = normalize(tangentEC); vec3 bitangent = normalize(bitangentEC); return mat3(tangent.x , tangent.y , tangent.z, bitangent.x, bitangent.y, bitangent.z, normal.x , normal.y , normal.z); } `;var SBt=T(S(),1),EE=`/** * A wrapper around the texture (WebGL2) / textureCube (WebGL1) * function to allow for WebGL 1 support. * * @name czm_textureCube * @glslFunction * * @param {samplerCube} sampler The sampler. * @param {vec3} p The coordinate at which to sample the texture. */ vec4 czm_textureCube(samplerCube sampler, vec3 p) { #if __VERSION__ == 300 return texture(sampler, p); #else return textureCube(sampler, p); #endif } /** * A wrapper around the textureLod (WebGL2) / textureCube (WebGL1) * function to allow for WebGL 1 support in fragment shaders. * * @name czm_textureCubeLod * @glslFunction * * @param {samplerCube} sampler The sampler. * @param {vec3} p The coordinate at which to sample the texture. * @param {float} lod The mipmap level from which to sample. */ vec4 czm_textureCube(samplerCube sampler, vec3 p, float lod) { #if __VERSION__ == 300 return textureLod(sampler, p, lod); #elif defined(GL_EXT_shader_texture_lod) return textureCubeLodEXT(sampler, p, lod); #endif }`;var VBt=T(S(),1),IE=`/** * Transforms a plane. * * @name czm_transformPlane * @glslFunction * * @param {vec4} plane The plane in Hessian Normal Form. * @param {mat4} transform The inverse-transpose of a transformation matrix. */ vec4 czm_transformPlane(vec4 plane, mat4 transform) { vec4 transformedPlane = transform * plane; // Convert the transformed plane to Hessian Normal Form float normalMagnitude = length(transformedPlane.xyz); return transformedPlane / normalMagnitude; } `;var RBt=T(S(),1),XE=`/** * Translates a position (or any vec3) that was encoded with {@link EncodedCartesian3}, * and then provided to the shader as separate high and low bits to * be relative to the eye. As shown in the example, the position can then be transformed in eye * or clip coordinates using {@link czm_modelViewRelativeToEye} or {@link czm_modelViewProjectionRelativeToEye}, * respectively. *

* This technique, called GPU RTE, eliminates jittering artifacts when using large coordinates as * described in {@link http://help.agi.com/AGIComponents/html/BlogPrecisionsPrecisions.htm|Precisions, Precisions}. *

* * @name czm_translateRelativeToEye * @glslFunction * * @param {vec3} high The position's high bits. * @param {vec3} low The position's low bits. * @returns {vec3} The position translated to be relative to the camera's position. * * @example * in vec3 positionHigh; * in vec3 positionLow; * * void main() * { * vec4 p = czm_translateRelativeToEye(positionHigh, positionLow); * gl_Position = czm_modelViewProjectionRelativeToEye * p; * } * * @see czm_modelViewRelativeToEye * @see czm_modelViewProjectionRelativeToEye * @see czm_computePosition * @see EncodedCartesian3 */ vec4 czm_translateRelativeToEye(vec3 high, vec3 low) { vec3 highDifference = high - czm_encodedCameraPositionMCHigh; // This check handles the case when NaN values have gotten into \`highDifference\`. // Such a thing could happen on devices running iOS. if (length(highDifference) == 0.0) { highDifference = vec3(0); } vec3 lowDifference = low - czm_encodedCameraPositionMCLow; return vec4(highDifference + lowDifference, 1.0); } `;var GBt=T(S(),1),WE=`/** * @private */ vec4 czm_translucentPhong(vec3 toEye, czm_material material, vec3 lightDirectionEC) { // Diffuse from directional light sources at eye (for top-down and horizon views) float diffuse = czm_getLambertDiffuse(vec3(0.0, 0.0, 1.0), material.normal); if (czm_sceneMode == czm_sceneMode3D) { // (and horizon views in 3D) diffuse += czm_getLambertDiffuse(vec3(0.0, 1.0, 0.0), material.normal); } diffuse = clamp(diffuse, 0.0, 1.0); float specular = czm_getSpecular(lightDirectionEC, toEye, material.normal, material.shininess); // Temporary workaround for adding ambient. vec3 materialDiffuse = material.diffuse * 0.5; vec3 ambient = materialDiffuse; vec3 color = ambient + material.emission; color += materialDiffuse * diffuse * czm_lightColor; color += material.specular * specular * czm_lightColor; return vec4(color, material.alpha); } `;var IBt=T(S(),1),PE=`/** * Returns the transpose of the matrix. The input matrix can be * a mat2, mat3, or mat4. * * @name czm_transpose * @glslFunction * * @param {} matrix The matrix to transpose. * * @returns {} The transposed matrix. * * @example * // GLSL declarations * mat2 czm_transpose(mat2 matrix); * mat3 czm_transpose(mat3 matrix); * mat4 czm_transpose(mat4 matrix); * * // Transpose a 3x3 rotation matrix to find its inverse. * mat3 eastNorthUpToEye = czm_eastNorthUpToEyeCoordinates( * positionMC, normalEC); * mat3 eyeToEastNorthUp = czm_transpose(eastNorthUpToEye); */ mat2 czm_transpose(mat2 matrix) { return mat2( matrix[0][0], matrix[1][0], matrix[0][1], matrix[1][1]); } mat3 czm_transpose(mat3 matrix) { return mat3( matrix[0][0], matrix[1][0], matrix[2][0], matrix[0][1], matrix[1][1], matrix[2][1], matrix[0][2], matrix[1][2], matrix[2][2]); } mat4 czm_transpose(mat4 matrix) { return mat4( matrix[0][0], matrix[1][0], matrix[2][0], matrix[3][0], matrix[0][1], matrix[1][1], matrix[2][1], matrix[3][1], matrix[0][2], matrix[1][2], matrix[2][2], matrix[3][2], matrix[0][3], matrix[1][3], matrix[2][3], matrix[3][3]); } `;var WBt=T(S(),1),vE=`vec2 getLookupUv(vec2 dimensions, int i) { int pixY = i / int(dimensions.x); int pixX = i - (pixY * int(dimensions.x)); float pixelWidth = 1.0 / dimensions.x; float pixelHeight = 1.0 / dimensions.y; float u = (float(pixX) + 0.5) * pixelWidth; // sample from center of pixel float v = (float(pixY) + 0.5) * pixelHeight; return vec2(u, v); } vec4 czm_unpackClippingExtents(highp sampler2D extentsTexture, int index) { vec2 textureDimensions = vec2(textureSize(extentsTexture, 0)); return texture(extentsTexture, getLookupUv(textureDimensions, index)); }`;var vBt=T(S(),1),wE=`/** * Unpacks a vec4 depth value to a float in [0, 1) range. * * @name czm_unpackDepth * @glslFunction * * @param {vec4} packedDepth The packed depth. * * @returns {float} The floating-point depth in [0, 1) range. */ float czm_unpackDepth(vec4 packedDepth) { // See Aras Pranckevi\u010Dius' post Encoding Floats to RGBA // http://aras-p.info/blog/2009/07/30/encoding-floats-to-rgba-the-final/ return dot(packedDepth, vec4(1.0, 1.0 / 255.0, 1.0 / 65025.0, 1.0 / 16581375.0)); } `;var FBt=T(S(),1),FE=`/** * Unpack an IEEE 754 single-precision float that is packed as a little-endian unsigned normalized vec4. * * @name czm_unpackFloat * @glslFunction * * @param {vec4} packedFloat The packed float. * * @returns {float} The floating-point depth in arbitrary range. */ float czm_unpackFloat(vec4 packedFloat) { // Convert to [0.0, 255.0] and round to integer packedFloat = floor(packedFloat * 255.0 + 0.5); float sign = 1.0 - step(128.0, packedFloat[3]) * 2.0; float exponent = 2.0 * mod(packedFloat[3], 128.0) + step(128.0, packedFloat[2]) - 127.0; if (exponent == -127.0) { return 0.0; } float mantissa = mod(packedFloat[2], 128.0) * 65536.0 + packedFloat[1] * 256.0 + packedFloat[0] + float(0x800000); float result = sign * exp2(exponent - 23.0) * mantissa; return result; } `;var MBt=T(S(),1),AE=`/** * Unpack unsigned integers of 1-4 bytes. in WebGL 1, there is no uint type, * so the return value is an int. *

* There are also precision limitations in WebGL 1. highp int is still limited * to 24 bits. Above the value of 2^24 = 16777216, precision loss may occur. *

* * @param {float|vec2|vec3|vec4} packed The packed value. For vectors, the components are listed in little-endian order. * * @return {int} The unpacked value. */ int czm_unpackUint(float packedValue) { float rounded = czm_round(packedValue * 255.0); return int(rounded); } int czm_unpackUint(vec2 packedValue) { vec2 rounded = czm_round(packedValue * 255.0); return int(dot(rounded, vec2(1.0, 256.0))); } int czm_unpackUint(vec3 packedValue) { vec3 rounded = czm_round(packedValue * 255.0); return int(dot(rounded, vec3(1.0, 256.0, 65536.0))); } int czm_unpackUint(vec4 packedValue) { vec4 rounded = czm_round(packedValue * 255.0); return int(dot(rounded, vec4(1.0, 256.0, 65536.0, 16777216.0))); } `;var kBt=T(S(),1),ME=`/** * Transform metadata values following the EXT_structural_metadata spec * by multiplying by scale and adding the offset. Operations are always * performed component-wise, even for matrices. * * @param {float|vec2|vec3|vec4|mat2|mat3|mat4} offset The offset to add * @param {float|vec2|vec3|vec4|mat2|mat3|mat4} scale The scale factor to multiply * @param {float|vec2|vec3|vec4|mat2|mat3|mat4} value The original value. * * @return {float|vec2|vec3|vec4|mat2|mat3|mat4} The transformed value of the same scalar/vector/matrix type as the input. */ float czm_valueTransform(float offset, float scale, float value) { return scale * value + offset; } vec2 czm_valueTransform(vec2 offset, vec2 scale, vec2 value) { return scale * value + offset; } vec3 czm_valueTransform(vec3 offset, vec3 scale, vec3 value) { return scale * value + offset; } vec4 czm_valueTransform(vec4 offset, vec4 scale, vec4 value) { return scale * value + offset; } mat2 czm_valueTransform(mat2 offset, mat2 scale, mat2 value) { return matrixCompMult(scale, value) + offset; } mat3 czm_valueTransform(mat3 offset, mat3 scale, mat3 value) { return matrixCompMult(scale, value) + offset; } mat4 czm_valueTransform(mat4 offset, mat4 scale, mat4 value) { return matrixCompMult(scale, value) + offset; } `;var DBt=T(S(),1),NE=`#ifdef LOG_DEPTH // 1.0 at the near plane, increasing linearly from there. out float v_depthFromNearPlusOne; #ifdef SHADOW_MAP out vec3 v_logPositionEC; #endif #endif vec4 czm_updatePositionDepth(vec4 coords) { #if defined(LOG_DEPTH) #ifdef SHADOW_MAP vec3 logPositionEC = (czm_inverseProjection * coords).xyz; v_logPositionEC = logPositionEC; #endif // With the very high far/near ratios used with the logarithmic depth // buffer, floating point rounding errors can cause linear depth values // to end up on the wrong side of the far plane, even for vertices that // are really nowhere near it. Since we always write a correct logarithmic // depth value in the fragment shader anyway, we just need to make sure // such errors don't cause the primitive to be clipped entirely before // we even get to the fragment shader. coords.z = clamp(coords.z / coords.w, -1.0, 1.0) * coords.w; #endif return coords; } /** * Writes the logarithmic depth to gl_Position using the already computed gl_Position. * * @name czm_vertexLogDepth * @glslFunction */ void czm_vertexLogDepth() { #ifdef LOG_DEPTH v_depthFromNearPlusOne = (gl_Position.w - czm_currentFrustum.x) + 1.0; gl_Position = czm_updatePositionDepth(gl_Position); #endif } /** * Writes the logarithmic depth to gl_Position using the provided clip coordinates. *

* An example use case for this function would be moving the vertex in window coordinates * before converting back to clip coordinates. Use the original vertex clip coordinates. *

* @name czm_vertexLogDepth * @glslFunction * * @param {vec4} clipCoords The vertex in clip coordinates. * * @example * czm_vertexLogDepth(czm_projection * vec4(positionEyeCoordinates, 1.0)); */ void czm_vertexLogDepth(vec4 clipCoords) { #ifdef LOG_DEPTH v_depthFromNearPlusOne = (clipCoords.w - czm_currentFrustum.x) + 1.0; czm_updatePositionDepth(clipCoords); #endif } `;var OBt=T(S(),1),kE=`vec4 czm_screenToEyeCoordinates(vec4 screenCoordinate) { // Reconstruct NDC coordinates float x = 2.0 * screenCoordinate.x - 1.0; float y = 2.0 * screenCoordinate.y - 1.0; float z = (screenCoordinate.z - czm_viewportTransformation[3][2]) / czm_viewportTransformation[2][2]; vec4 q = vec4(x, y, z, 1.0); // Reverse the perspective division to obtain clip coordinates. q /= screenCoordinate.w; // Reverse the projection transformation to obtain eye coordinates. if (!(czm_inverseProjection == mat4(0.0))) // IE and Edge sometimes do something weird with != between mat4s { q = czm_inverseProjection * q; } else { float top = czm_frustumPlanes.x; float bottom = czm_frustumPlanes.y; float left = czm_frustumPlanes.z; float right = czm_frustumPlanes.w; float near = czm_currentFrustum.x; float far = czm_currentFrustum.y; q.x = (q.x * (right - left) + left + right) * 0.5; q.y = (q.y * (top - bottom) + bottom + top) * 0.5; q.z = (q.z * (near - far) - near - far) * 0.5; q.w = 1.0; } return q; } /** * Transforms a position from window to eye coordinates. * The transform from window to normalized device coordinates is done using components * of (@link czm_viewport} and {@link czm_viewportTransformation} instead of calculating * the inverse of czm_viewportTransformation. The transformation from * normalized device coordinates to clip coordinates is done using fragmentCoordinate.w, * which is expected to be the scalar used in the perspective divide. The transformation * from clip to eye coordinates is done using {@link czm_inverseProjection}. * * @name czm_windowToEyeCoordinates * @glslFunction * * @param {vec4} fragmentCoordinate The position in window coordinates to transform. * * @returns {vec4} The transformed position in eye coordinates. * * @see czm_modelToWindowCoordinates * @see czm_eyeToWindowCoordinates * @see czm_inverseProjection * @see czm_viewport * @see czm_viewportTransformation * * @example * vec4 positionEC = czm_windowToEyeCoordinates(gl_FragCoord); */ vec4 czm_windowToEyeCoordinates(vec4 fragmentCoordinate) { vec2 screenCoordXY = (fragmentCoordinate.xy - czm_viewport.xy) / czm_viewport.zw; return czm_screenToEyeCoordinates(vec4(screenCoordXY, fragmentCoordinate.zw)); } vec4 czm_screenToEyeCoordinates(vec2 screenCoordinateXY, float depthOrLogDepth) { // See reverseLogDepth.glsl. This is separate to re-use the pow. #if defined(LOG_DEPTH) || defined(LOG_DEPTH_READ_ONLY) float near = czm_currentFrustum.x; float far = czm_currentFrustum.y; float log2Depth = depthOrLogDepth * czm_log2FarDepthFromNearPlusOne; float depthFromNear = exp2(log2Depth) - 1.0; float depthFromCamera = depthFromNear + near; vec4 screenCoord = vec4(screenCoordinateXY, far * (1.0 - near / depthFromCamera) / (far - near), 1.0); vec4 eyeCoordinate = czm_screenToEyeCoordinates(screenCoord); eyeCoordinate.w = 1.0 / depthFromCamera; // Better precision return eyeCoordinate; #else vec4 screenCoord = vec4(screenCoordinateXY, depthOrLogDepth, 1.0); vec4 eyeCoordinate = czm_screenToEyeCoordinates(screenCoord); #endif return eyeCoordinate; } /** * Transforms a position given as window x/y and a depth or a log depth from window to eye coordinates. * This function produces more accurate results for window positions with log depth than * conventionally unpacking the log depth using czm_reverseLogDepth and using the standard version * of czm_windowToEyeCoordinates. * * @name czm_windowToEyeCoordinates * @glslFunction * * @param {vec2} fragmentCoordinateXY The XY position in window coordinates to transform. * @param {float} depthOrLogDepth A depth or log depth for the fragment. * * @see czm_modelToWindowCoordinates * @see czm_eyeToWindowCoordinates * @see czm_inverseProjection * @see czm_viewport * @see czm_viewportTransformation * * @returns {vec4} The transformed position in eye coordinates. */ vec4 czm_windowToEyeCoordinates(vec2 fragmentCoordinateXY, float depthOrLogDepth) { vec2 screenCoordXY = (fragmentCoordinateXY.xy - czm_viewport.xy) / czm_viewport.zw; return czm_screenToEyeCoordinates(screenCoordXY, depthOrLogDepth); } `;var HBt=T(S(),1),UE=`// emulated noperspective #if !defined(LOG_DEPTH) in float v_WindowZ; #endif /** * Emulates GL_DEPTH_CLAMP. Clamps a fragment to the near and far plane * by writing the fragment's depth. See czm_depthClamp for more details. * * @name czm_writeDepthClamp * @glslFunction * * @example * out_FragColor = color; * czm_writeDepthClamp(); * * @see czm_depthClamp */ void czm_writeDepthClamp() { #if (!defined(LOG_DEPTH) && (__VERSION__ == 300 || defined(GL_EXT_frag_depth))) gl_FragDepth = clamp(v_WindowZ * gl_FragCoord.w, 0.0, 1.0); #endif } `;var KBt=T(S(),1),DE=`#ifdef LOG_DEPTH in float v_depthFromNearPlusOne; #ifdef POLYGON_OFFSET uniform vec2 u_polygonOffset; #endif #endif /** * Writes the fragment depth to the logarithmic depth buffer. *

* Use this when the vertex shader does not call {@link czm_vertexLogDepth}, for example, when * ray-casting geometry using a full screen quad. *

* @name czm_writeLogDepth * @glslFunction * * @param {float} depth The depth coordinate, where 1.0 is on the near plane and * depth increases in eye-space units from there * * @example * czm_writeLogDepth((czm_projection * v_positionEyeCoordinates).w + 1.0); */ void czm_writeLogDepth(float depth) { #if (defined(LOG_DEPTH) && (__VERSION__ == 300 || defined(GL_EXT_frag_depth))) // Discard the vertex if it's not between the near and far planes. // We allow a bit of epsilon on the near plane comparison because a 1.0 // from the vertex shader (indicating the vertex should be _on_ the near // plane) will not necessarily come here as exactly 1.0. if (depth <= 0.9999999 || depth > czm_farDepthFromNearPlusOne) { discard; } #ifdef POLYGON_OFFSET // Polygon offset: m * factor + r * units float factor = u_polygonOffset[0]; float units = u_polygonOffset[1]; #if (__VERSION__ == 300 || defined(GL_OES_standard_derivatives)) // This factor doesn't work in IE 10 if (factor != 0.0) { // m = sqrt(dZdX^2 + dZdY^2); float x = dFdx(depth); float y = dFdy(depth); float m = sqrt(x * x + y * y); // Apply the factor before computing the log depth. depth += m * factor; } #endif #endif gl_FragDepth = log2(depth) * czm_oneOverLog2FarDepthFromNearPlusOne; #ifdef POLYGON_OFFSET // Apply the units after the log depth. gl_FragDepth += czm_epsilon7 * units; #endif #endif } /** * Writes the fragment depth to the logarithmic depth buffer. *

* Use this when the vertex shader calls {@link czm_vertexLogDepth}. *

* * @name czm_writeLogDepth * @glslFunction */ void czm_writeLogDepth() { #ifdef LOG_DEPTH czm_writeLogDepth(v_depthFromNearPlusOne); #endif } `;var QBt=T(S(),1),BE=`/** * Transforms a value for non-perspective interpolation by multiplying * it by w, the value used in the perspective divide. This function is * intended to be called in a vertex shader to compute the value of a * \`varying\` that should not be subject to perspective interpolation. * For example, screen-space texture coordinates. The fragment shader * must call {@link czm_readNonPerspective} to retrieve the final * non-perspective value. * * @name czm_writeNonPerspective * @glslFunction * * @param {float|vec2|vec3|vec4} value The value to be interpolated without accounting for perspective. * @param {float} w The perspective divide value. Usually this is the computed \`gl_Position.w\`. * @returns {float|vec2|vec3|vec4} The transformed value, intended to be stored in a \`varying\` and read in the * fragment shader with {@link czm_readNonPerspective}. */ float czm_writeNonPerspective(float value, float w) { return value * w; } vec2 czm_writeNonPerspective(vec2 value, float w) { return value * w; } vec3 czm_writeNonPerspective(vec3 value, float w) { return value * w; } vec4 czm_writeNonPerspective(vec4 value, float w) { return value * w; } `;var qBt=T(S(),1),OE=`/** * Converts a CIE Yxy color to RGB. *

The conversion is described in * {@link http://content.gpwiki.org/index.php/D3DBook:High-Dynamic_Range_Rendering#Luminance_Transform|Luminance Transform} *

* * @name czm_XYZToRGB * @glslFunction * * @param {vec3} Yxy The color in CIE Yxy. * * @returns {vec3} The color in RGB. * * @example * vec3 xyz = czm_RGBToXYZ(rgb); * xyz.x = max(xyz.x - luminanceThreshold, 0.0); * rgb = czm_XYZToRGB(xyz); */ vec3 czm_XYZToRGB(vec3 Yxy) { const mat3 XYZ2RGB = mat3( 3.2405, -0.9693, 0.0556, -1.5371, 1.8760, -0.2040, -0.4985, 0.0416, 1.0572); vec3 xyz; xyz.r = Yxy.r * Yxy.g / Yxy.b; xyz.g = Yxy.r; xyz.b = Yxy.r * (1.0 - Yxy.g - Yxy.b) / Yxy.b; return XYZ2RGB * xyz; } `;var Wx={czm_degreesPerRadian:gZ,czm_depthRange:yZ,czm_epsilon1:xZ,czm_epsilon2:_Z,czm_epsilon3:TZ,czm_epsilon4:SZ,czm_epsilon5:CZ,czm_epsilon6:VZ,czm_epsilon7:LZ,czm_infinity:RZ,czm_oneOverPi:ZZ,czm_oneOverTwoPi:GZ,czm_passCesium3DTile:EZ,czm_passCesium3DTileClassification:IZ,czm_passCesium3DTileClassificationIgnoreShow:XZ,czm_passClassification:WZ,czm_passCompute:PZ,czm_passEnvironment:vZ,czm_passGlobe:wZ,czm_passOpaque:FZ,czm_passOverlay:AZ,czm_passTerrainClassification:MZ,czm_passTranslucent:NZ,czm_passVoxels:kZ,czm_pi:UZ,czm_piOverFour:DZ,czm_piOverSix:BZ,czm_piOverThree:OZ,czm_piOverTwo:YZ,czm_radiansPerDegree:HZ,czm_sceneMode2D:zZ,czm_sceneMode3D:KZ,czm_sceneModeColumbusView:JZ,czm_sceneModeMorphing:QZ,czm_solarRadius:jZ,czm_threePiOver2:qZ,czm_twoPi:$Z,czm_webMercatorMaxLatitude:eG,czm_depthRangeStruct:tG,czm_material:nG,czm_materialInput:iG,czm_modelMaterial:oG,czm_modelVertexOutput:rG,czm_ray:sG,czm_raySegment:aG,czm_shadowParameters:cG,czm_acesTonemapping:lG,czm_alphaWeight:dG,czm_antialias:uG,czm_applyHSBShift:mG,czm_approximateSphericalCoordinates:hG,czm_approximateTanh:fG,czm_backFacing:pG,czm_branchFreeTernary:bG,czm_cascadeColor:gG,czm_cascadeDistance:yG,czm_cascadeMatrix:xG,czm_cascadeWeights:_G,czm_clipPolygons:TG,czm_columbusViewMorph:SG,czm_computeAtmosphereColor:CG,czm_computeGroundAtmosphereScattering:VG,czm_computePosition:LG,czm_computeScattering:RG,czm_cosineAndSine:ZG,czm_decompressTextureCoordinates:GG,czm_depthClamp:EG,czm_eastNorthUpToEyeCoordinates:IG,czm_ellipsoidContainsPoint:XG,czm_ellipsoidTextureCoordinates:WG,czm_equalsEpsilon:PG,czm_eyeOffset:vG,czm_eyeToWindowCoordinates:wG,czm_fastApproximateAtan:FG,czm_fog:AG,czm_gammaCorrect:MG,czm_geodeticSurfaceNormal:NG,czm_getDefaultMaterial:kG,czm_getDynamicAtmosphereLightDirection:UG,czm_getLambertDiffuse:DG,czm_getSpecular:BG,czm_getWaterNoise:OG,czm_HSBToRGB:YG,czm_HSLToRGB:HG,czm_hue:zG,czm_inverseGamma:KG,czm_isEmpty:JG,czm_isFull:QG,czm_latitudeToWebMercatorFraction:jG,czm_linearToSrgb:qG,czm_lineDistance:$G,czm_luminance:eE,czm_maximumComponent:tE,czm_metersPerPixel:nE,czm_modelToWindowCoordinates:iE,czm_multiplyWithColorBalance:oE,czm_nearFarScalar:rE,czm_octDecode:sE,czm_packDepth:aE,czm_pbrLighting:cE,czm_pbrNeutralTonemapping:lE,czm_phong:dE,czm_planeDistance:uE,czm_pointAlongRay:mE,czm_rayEllipsoidIntersectionInterval:hE,czm_raySphereIntersectionInterval:fE,czm_readDepth:pE,czm_readNonPerspective:bE,czm_reverseLogDepth:gE,czm_RGBToHSB:yE,czm_RGBToHSL:xE,czm_RGBToXYZ:_E,czm_round:TE,czm_saturation:SE,czm_shadowDepthCompare:CE,czm_shadowVisibility:VE,czm_signNotZero:LE,czm_sphericalHarmonics:RE,czm_srgbToLinear:ZE,czm_tangentToEyeSpaceMatrix:GE,czm_textureCube:EE,czm_transformPlane:IE,czm_translateRelativeToEye:XE,czm_translucentPhong:WE,czm_transpose:PE,czm_unpackClippingExtents:vE,czm_unpackDepth:wE,czm_unpackFloat:FE,czm_unpackUint:AE,czm_valueTransform:ME,czm_vertexLogDepth:NE,czm_windowToEyeCoordinates:kE,czm_writeDepthClamp:UE,czm_writeLogDepth:DE,czm_writeNonPerspective:BE,czm_XYZToRGB:OE};var IHt=T(S(),1);function TIe(e,t){let n=e;return n=n.replaceAll("version 300 es",""),n=n.replaceAll(/(texture\()/g,"texture2D("),t?(n=n.replaceAll(/\n\s*(in)\s+(vec\d|mat\d|float)/g,` varying $2`),/out_FragData_(\d+)/.test(n)&&(n=`#extension GL_EXT_draw_buffers : enable ${n}`,n=n.replaceAll(/layout\s+\(location\s*=\s*\d+\)\s*out\s+vec4\s+out_FragData_\d+;/g,""),n=n.replaceAll(/out_FragData_(\d+)/g,"gl_FragData[$1]")),n=n.replaceAll(/layout\s+\(location\s*=\s*0\)\s*out\s+vec4\s+out_FragColor;/g,""),n=n.replaceAll(/out_FragColor/g,"gl_FragColor"),n=n.replaceAll(/out_FragColor\[(\d+)\]/g,"gl_FragColor[$1]"),/gl_FragDepth/.test(n)&&(n=`#extension GL_EXT_frag_depth : enable ${n}`,n=n.replaceAll(/gl_FragDepth/g,"gl_FragDepthEXT")),n=`#ifdef GL_EXT_shader_texture_lod #extension GL_EXT_shader_texture_lod : enable #endif ${n}`,n=`#ifdef GL_OES_standard_derivatives #extension GL_OES_standard_derivatives : enable #endif ${n}`):(n=n.replaceAll(/(in)\s+(vec\d|mat\d|float)/g,"attribute $2"),n=n.replaceAll(/(out)\s+(vec\d|mat\d|float)\s+([\w]+);/g,"varying $2 $3;")),n=`#version 100 ${n}`,n}var YE=TIe;function qte(e){return e=e.replace(/\/\/.*/g,""),e.replace(/\/\*\*[\s\S]*?\*\//gm,function(t){let n=t.match(/\n/gm).length,i="";for(let o=0;o0;){let o=e.pop();n.push(o),o.requiredBy.length===0&&t.push(o)}for(;t.length>0;){let o=t.shift();e.push(o);for(let r=0;r=0;--o)i=`${i+t[o].glslSource} `;return i.replace(n.glslSource,"")}function tne(e,t,n){let i,o,r="",s=e.sources;if(l(s))for(i=0,o=s.length;i planes2D_high.w): // - If this vertex is on the east side of the IDL (position3DLow.y > 0.0, comparison with position3DHigh may produce artifacts) // - existing "east" is on the wrong side of the world, far away (planes2D_high/low.w) // - so set "east" as beyond the eastmost extent of the projection (idlSplitNewPlaneHiLow) vec2 idlSplitNewPlaneHiLow = vec2(EAST_MOST_X_HIGH - (WEST_MOST_X_HIGH - planes2D_high.w), EAST_MOST_X_LOW - (WEST_MOST_X_LOW - planes2D_low.w)); bool idlSplit = planes2D_high.x > planes2D_high.w && position3DLow.y > 0.0; planes2D_high.w = czm_branchFreeTernary(idlSplit, idlSplitNewPlaneHiLow.x, planes2D_high.w); planes2D_low.w = czm_branchFreeTernary(idlSplit, idlSplitNewPlaneHiLow.y, planes2D_low.w); // - else, if this vertex is on the west side of the IDL (position3DLow.y < 0.0) // - existing "west" is on the wrong side of the world, far away (planes2D_high/low.x) // - so set "west" as beyond the westmost extent of the projection (idlSplitNewPlaneHiLow) idlSplit = planes2D_high.x > planes2D_high.w && position3DLow.y < 0.0; idlSplitNewPlaneHiLow = vec2(WEST_MOST_X_HIGH - (EAST_MOST_X_HIGH - planes2D_high.x), WEST_MOST_X_LOW - (EAST_MOST_X_LOW - planes2D_low.x)); planes2D_high.x = czm_branchFreeTernary(idlSplit, idlSplitNewPlaneHiLow.x, planes2D_high.x); planes2D_low.x = czm_branchFreeTernary(idlSplit, idlSplitNewPlaneHiLow.y, planes2D_low.x); vec3 southWestCorner = (czm_modelViewRelativeToEye * czm_translateRelativeToEye(vec3(0.0, planes2D_high.xy), vec3(0.0, planes2D_low.xy))).xyz; vec3 northWestCorner = (czm_modelViewRelativeToEye * czm_translateRelativeToEye(vec3(0.0, planes2D_high.x, planes2D_high.z), vec3(0.0, planes2D_low.x, planes2D_low.z))).xyz; vec3 southEastCorner = (czm_modelViewRelativeToEye * czm_translateRelativeToEye(vec3(0.0, planes2D_high.w, planes2D_high.y), vec3(0.0, planes2D_low.w, planes2D_low.y))).xyz; #else // COLUMBUS_VIEW_2D // 3D case has smaller "plane extents," so planes encoded as a 64 bit position and 2 vec3s for distances/direction vec3 southWestCorner = (czm_modelViewRelativeToEye * czm_translateRelativeToEye(czm_batchTable_southWest_HIGH(batchId), czm_batchTable_southWest_LOW(batchId))).xyz; vec3 northWestCorner = czm_normal * czm_batchTable_northward(batchId) + southWestCorner; vec3 southEastCorner = czm_normal * czm_batchTable_eastward(batchId) + southWestCorner; #endif // COLUMBUS_VIEW_2D vec3 eastWard = southEastCorner - southWestCorner; float eastExtent = length(eastWard); eastWard /= eastExtent; vec3 northWard = northWestCorner - southWestCorner; float northExtent = length(northWard); northWard /= northExtent; v_westPlane = vec4(eastWard, -dot(eastWard, southWestCorner)); v_southPlane = vec4(northWard, -dot(northWard, southWestCorner)); v_inversePlaneExtents = vec2(1.0 / eastExtent, 1.0 / northExtent); #endif // SPHERICAL vec4 uvMinAndExtents = czm_batchTable_uvMinAndExtents(batchId); vec4 uMaxVmax = czm_batchTable_uMaxVmax(batchId); v_uMaxAndInverseDistance = vec3(uMaxVmax.xy, uvMinAndExtents.z); v_vMaxAndInverseDistance = vec3(uMaxVmax.zw, uvMinAndExtents.w); v_uvMinAndSphericalLongitudeRotation.xy = uvMinAndExtents.xy; #endif // TEXTURE_COORDINATES #ifdef PER_INSTANCE_COLOR v_color = czm_batchTable_color(batchId); #endif gl_Position = czm_depthClamp(czm_modelViewProjectionRelativeToEye * position); } `;var UHt=T(S(),1),eg=`#ifdef VECTOR_TILE uniform vec4 u_highlightColor; #endif void main(void) { #ifdef VECTOR_TILE out_FragColor = czm_gammaCorrect(u_highlightColor); #else out_FragColor = vec4(1.0); #endif czm_writeDepthClamp(); } `;var BHt=T(S(),1),one={TERRAIN:0,CESIUM_3D_TILE:1,BOTH:2};one.NUMBER_OF_CLASSIFICATION_TYPES=3;var Bn=Object.freeze(one);var HHt=T(S(),1);var ZIe={NEVER:ie.NEVER,LESS:ie.LESS,EQUAL:ie.EQUAL,LESS_OR_EQUAL:ie.LEQUAL,GREATER:ie.GREATER,NOT_EQUAL:ie.NOTEQUAL,GREATER_OR_EQUAL:ie.GEQUAL,ALWAYS:ie.ALWAYS},ac=Object.freeze(ZIe);var LKt=T(S(),1);var KHt=T(S(),1);function GIe(e,t){let n=[],i=e.length,o=0;for(;oEl.MaximumLatitude?e=El.MaximumLatitude:e<-El.MaximumLatitude&&(e=-El.MaximumLatitude);let t=Math.sin(e);return .5*Math.log((1+t)/(1-t))};El.MaximumLatitude=El.mercatorAngleToGeodeticLatitude(Math.PI);El.prototype.project=function(e,t){let n=this._semimajorAxis,i=e.longitude*n,o=El.geodeticLatitudeToMercatorAngle(e.latitude)*n,r=e.height;return l(t)?(t.x=i,t.y=o,t.z=r,t):new m(i,o,r)};El.prototype.unproject=function(e,t){let n=this._oneOverSemimajorAxis,i=e.x*n,o=El.mercatorAngleToGeodeticLatitude(e.y*n),r=e.z;return l(t)?(t.longitude=i,t.latitude=o,t.height=r,t):new he(i,o,r)};var Wi=El;function DIe(e,t,n){let i=!n,o=e.length,r;if(!i&&o>1){let s=e[0].modelMatrix;for(r=1;r=0){let d=i[a];o=d.offset+d.count,s=d.index,r=n[s].indices.length}else o=0,s=0,r=n[s].indices.length;let c=e.length;for(let d=0;dr&&(o=0,r=n[++s].indices.length),i.push({index:s,offset:o,count:p}),o+=p}}function YIe(e,t){let n=[];return MY(e,"geometry",t,n),MY(e,"westHemisphereGeometry",t,n),MY(e,"eastHemisphereGeometry",t,n),n}var Mp={};Mp.combineGeometry=function(e){let t,n,i=e.instances,o=i.length,r,s,a=!1;o>0&&(t=OIe(e),t.length>0&&(n=Nn.createAttributeLocations(t[0]),e.createPickOffsets&&(r=YIe(i,t))),l(i[0].attributes)&&l(i[0].attributes.offset)&&(s=new Array(o),a=!0));let c=new Array(o),d=new Array(o);for(let u=0;u0&&(n.set(c.indices,s),s+=f)}return t.push(n.buffer),{stringTable:i,packedData:n}};Mp.unpackCreateGeometryResults=function(e){let t=e.stringTable,n=e.packedData,i,o=new Array(n[0]),r=0,s=1;for(;s0){let G=_.length/C;for(R=Me.createTypedArray(G,x),i=0;i= nearSq && distanceSq <= farSq) ? 1.0 : 0.0; gl_Position *= show; }`,`${i} ${o}`};function une(e,t){if(!e.compressVertices)return t;let n=t.search(/in\s+vec3\s+normal;/g)!==-1,i=t.search(/in\s+vec2\s+st;/g)!==-1;if(!n&&!i)return t;let o=t.search(/in\s+vec3\s+tangent;/g)!==-1,r=t.search(/in\s+vec3\s+bitangent;/g)!==-1,s=i&&n?2:1;s+=o||r?1:0;let a=s>1?`vec${s}`:"float",c="compressedAttributes",d=`in ${a} ${c};`,u="",h="";if(i){u+=`vec2 st; `;let f=s>1?`${c}.x`:c;h+=` st = czm_decompressTextureCoordinates(${f}); `}n&&o&&r?(u+=`vec3 normal; vec3 tangent; vec3 bitangent; `,h+=` czm_octDecode(${c}.${i?"yz":"xy"}, normal, tangent, bitangent); `):(n&&(u+=`vec3 normal; `,h+=` normal = czm_octDecode(${c}${s>1?`.${i?"y":"x"}`:""}); `),o&&(u+=`vec3 tangent; `,h+=` tangent = czm_octDecode(${c}.${i&&n?"z":"y"}); `),r&&(u+=`vec3 bitangent; `,h+=` bitangent = czm_octDecode(${c}.${i&&n?"z":"y"}); `));let p=t;p=p.replace(/in\s+vec3\s+normal;/g,""),p=p.replace(/in\s+vec2\s+st;/g,""),p=p.replace(/in\s+vec3\s+tangent;/g,""),p=p.replace(/in\s+vec3\s+bitangent;/g,""),p=De.replaceMain(p,"czm_non_compressed_main");let g=`void main() { ${h} czm_non_compressed_main(); }`;return[d,u,p,g].join(` `)}function sXe(e){let t=De.replaceMain(e,"czm_non_depth_clamp_main");return t+=`void main() { czm_non_depth_clamp_main(); gl_Position = czm_depthClamp(gl_Position);} `,t}function aXe(e){let t=De.replaceMain(e,"czm_non_depth_clamp_main");return t+=`void main() { czm_non_depth_clamp_main(); #if defined(LOG_DEPTH) czm_writeLogDepth(); #else czm_writeDepthClamp(); #endif } `,t}function mne(e,t){let n=e.vertexAttributes}function cXe(e,t){return function(){return e[t]}}var NY=Math.max(Ot.hardwareConcurrency-1,1),p5,lXe=new Ti("combineGeometry");function dXe(e,t){let n,i,o,r,s=e._instanceIds;if(e._state===Vr.READY){n=Array.isArray(e.geometryInstances)?e.geometryInstances:[e.geometryInstances];let a=e._numberOfInstances=n.length,c=[],d=[];for(o=0;o0){let x=new Float64Array(h);for(f=[x.buffer],r=0;r0?(e._recomputeBoundingSpheres=!0,e._state=Vr.COMBINED):QE(e,t,Vr.FAILED,void 0)}).catch(function(h){QE(e,t,Vr.FAILED,h)})}}function uXe(e,t){let n=Array.isArray(e.geometryInstances)?e.geometryInstances:[e.geometryInstances],i=e._numberOfInstances=n.length,o=new Array(i),r=e._instanceIds,s,a,c=0;for(a=0;a0?(e._recomputeBoundingSpheres=!0,e._state=Vr.COMBINED):QE(e,t,Vr.FAILED,void 0)}function mXe(e,t){let n=e._batchTableAttributeIndices.offset;if(!e._recomputeBoundingSpheres||!l(n)){e._recomputeBoundingSpheres=!1;return}let i,o=e._offsetInstanceExtend,r=e._instanceBoundingSpheres,s=r.length,a=e._tempBoundingSpheres;if(!l(a)){for(a=new Array(s),i=0;i0||de.intersectPlane(x,cn.ORIGIN_ZX_PLANE)!==zt.INTERSECTING?c.push(x):(d.push(x),u.push(x))}let h=c[0],p=u[0],g=d[0];for(i=1;i0){if(Mt.maximumVertexTextureImageUnits===0)throw new ce("Vertex texture fetch support is required to render primitives with per-instance attributes. The maximum number of vertex texture image units must be greater than zero.");this._batchTable.update(e)}if(this._state!==Vr.COMPLETE&&this._state!==Vr.COMBINED&&(this.asynchronous?dXe(this,e):uXe(this,e)),this._state===Vr.COMBINED&&(hXe(this,e),fne(this,e),pXe(this,e)),!this.show||this._state!==Vr.COMPLETE)return;this._batchTableOffsetsUpdated||fne(this,e),this._recomputeBoundingSpheres&&mXe(this,e);let n=this.appearance,i=n.material,o=!1,r=!1;this._appearance!==n?(this._appearance=n,this._material=i,o=!0,r=!0):this._material!==i&&(this._material=i,r=!0);let s=this.depthFailAppearance,a=l(s)?s.material:void 0;this._depthFailAppearance!==s?(this._depthFailAppearance=s,this._depthFailMaterial=a,o=!0,r=!0):this._depthFailMaterial!==a&&(this._depthFailMaterial=a,r=!0);let c=this._appearance.isTranslucent();this._translucent!==c&&(this._translucent=c,o=!0),l(this._material)&&this._material.update(t);let d=n.closed&&c;o&&y(this._createRenderStatesFunction,bXe)(this,t,n,d),r&&y(this._createShaderProgramFunction,gXe)(this,e,n),(o||r)&&y(this._createCommandsFunction,yXe)(this,n,i,c,d,this._colorCommands,this._pickCommands,e),y(this._updateAndQueueCommandsFunction,xXe)(this,e,this._colorCommands,this._pickCommands,this.modelMatrix,this.cull,this.debugShowBoundingVolume,d)};var _Xe=new de,TXe=new de;function Sne(e,t,n){if(n===an.TOP){let i=de.clone(e,_Xe),o=de.clone(e,TXe);o.center=m.add(o.center,t,o.center),e=de.union(i,o,e)}else n===an.ALL&&(e.center=m.add(e.center,t,e.center));return e}function SXe(e,t,n){return function(){let i=e.getBatchedAttribute(t,n),o=e.attributes[n],r=o.componentsPerAttribute,s=Q.createTypedArray(o.componentDatatype,r);return l(i.constructor.pack)?i.constructor.pack(i,s,0):s[0]=i,s}}function CXe(e,t,n,i,o){return function(r){let s=yne(r);e.setBatchedAttribute(t,n,s),o==="offset"&&(i._recomputeBoundingSpheres=!0,i._batchTableOffsetsUpdated=!1)}}var VXe=new m;function LXe(e,t,n){t.boundingSphere={get:function(){let i=e._instanceBoundingSpheres[n];if(l(i)){i=i.clone();let o=e.modelMatrix,r=t.offset;l(r)&&Sne(i,m.fromArray(r.get(),0,VXe),e._offsetInstanceExtend[n]),l(o)&&(i=de.transform(i,o))}return i}},t.boundingSphereCV={get:function(){return e._instanceBoundingSpheresCV[n]}}}function RXe(e,t,n){t.pickId={get:function(){return e._pickIds[n]}}}Lr.prototype.getGeometryInstanceAttributes=function(e){let t=this._perInstanceAttributeCache.get(e);if(l(t))return t;let n=-1,i=this._lastPerInstanceAttributeIndex,o=this._instanceIds,r=o.length;for(let d=0;d 0.0 && upOrRightInBounds.x && upOrRightInBounds.y); float useDownOrLeft = float(useUpOrRight == 0.0); vec3 upOrRightEC = getEyeCoordinate3FromWindowCoordinate(glFragCoordXY + positiveOffset, upOrRightLogDepth); vec3 downOrLeftEC = getEyeCoordinate3FromWindowCoordinate(glFragCoordXY - positiveOffset, downOrLeftLogDepth); return (upOrRightEC - (eyeCoordinate.xyz / eyeCoordinate.w)) * useUpOrRight + ((eyeCoordinate.xyz / eyeCoordinate.w) - downOrLeftEC) * useDownOrLeft; } #endif // NORMAL_EC void main(void) { #ifdef REQUIRES_EC float logDepthOrDepth = czm_unpackDepth(texture(czm_globeDepthTexture, gl_FragCoord.xy / czm_viewport.zw)); vec4 eyeCoordinate = czm_windowToEyeCoordinates(gl_FragCoord.xy, logDepthOrDepth); #endif #ifdef REQUIRES_WC vec4 worldCoordinate4 = czm_inverseView * eyeCoordinate; vec3 worldCoordinate = worldCoordinate4.xyz / worldCoordinate4.w; #endif #ifdef TEXTURE_COORDINATES vec2 uv; #ifdef SPHERICAL // Treat world coords as a sphere normal for spherical coordinates vec2 sphericalLatLong = czm_approximateSphericalCoordinates(worldCoordinate); sphericalLatLong.y += v_uvMinAndSphericalLongitudeRotation.z; sphericalLatLong.y = czm_branchFreeTernary(sphericalLatLong.y < czm_pi, sphericalLatLong.y, sphericalLatLong.y - czm_twoPi); uv.x = (sphericalLatLong.y - v_sphericalExtents.y) * v_sphericalExtents.w; uv.y = (sphericalLatLong.x - v_sphericalExtents.x) * v_sphericalExtents.z; #else // SPHERICAL // Unpack planes and transform to eye space uv.x = czm_planeDistance(v_westPlane, eyeCoordinate.xyz / eyeCoordinate.w) * v_inversePlaneExtents.x; uv.y = czm_planeDistance(v_southPlane, eyeCoordinate.xyz / eyeCoordinate.w) * v_inversePlaneExtents.y; #endif // SPHERICAL #endif // TEXTURE_COORDINATES #ifdef PICK #ifdef CULL_FRAGMENTS // When classifying translucent geometry, logDepthOrDepth == 0.0 // indicates a region that should not be classified, possibly due to there // being opaque pixels there in another buffer. // Check for logDepthOrDepth != 0.0 to make sure this should be classified. if (0.0 <= uv.x && uv.x <= 1.0 && 0.0 <= uv.y && uv.y <= 1.0 || logDepthOrDepth != 0.0) { out_FragColor.a = 1.0; // 0.0 alpha leads to discard from ShaderSource.createPickFragmentShaderSource czm_writeDepthClamp(); } #else // CULL_FRAGMENTS out_FragColor.a = 1.0; #endif // CULL_FRAGMENTS #else // PICK #ifdef CULL_FRAGMENTS // When classifying translucent geometry, logDepthOrDepth == 0.0 // indicates a region that should not be classified, possibly due to there // being opaque pixels there in another buffer. if (uv.x <= 0.0 || 1.0 <= uv.x || uv.y <= 0.0 || 1.0 <= uv.y || logDepthOrDepth == 0.0) { discard; } #endif #ifdef NORMAL_EC // Compute normal by sampling adjacent pixels in 2x2 block in screen space vec3 downUp = vectorFromOffset(eyeCoordinate, vec2(0.0, 1.0)); vec3 leftRight = vectorFromOffset(eyeCoordinate, vec2(1.0, 0.0)); vec3 normalEC = normalize(cross(leftRight, downUp)); #endif #ifdef PER_INSTANCE_COLOR vec4 color = czm_gammaCorrect(v_color); #ifdef FLAT out_FragColor = color; #else // FLAT czm_materialInput materialInput; materialInput.normalEC = normalEC; materialInput.positionToEyeEC = -eyeCoordinate.xyz; czm_material material = czm_getDefaultMaterial(materialInput); material.diffuse = color.rgb; material.alpha = color.a; out_FragColor = czm_phong(normalize(-eyeCoordinate.xyz), material, czm_lightDirectionEC); #endif // FLAT // Premultiply alpha. Required for classification primitives on translucent globe. out_FragColor.rgb *= out_FragColor.a; #else // PER_INSTANCE_COLOR // Material support. // USES_ is distinct from REQUIRES_, because some things are dependencies of each other or // dependencies for culling but might not actually be used by the material. czm_materialInput materialInput; #ifdef USES_NORMAL_EC materialInput.normalEC = normalEC; #endif #ifdef USES_POSITION_TO_EYE_EC materialInput.positionToEyeEC = -eyeCoordinate.xyz; #endif #ifdef USES_TANGENT_TO_EYE materialInput.tangentToEyeMatrix = czm_eastNorthUpToEyeCoordinates(worldCoordinate, normalEC); #endif #ifdef USES_ST // Remap texture coordinates from computed (approximately aligned with cartographic space) to the desired // texture coordinate system, which typically forms a tight oriented bounding box around the geometry. // Shader is provided a set of reference points for remapping. materialInput.st.x = czm_lineDistance(v_uvMinAndSphericalLongitudeRotation.xy, v_uMaxAndInverseDistance.xy, uv) * v_uMaxAndInverseDistance.z; materialInput.st.y = czm_lineDistance(v_uvMinAndSphericalLongitudeRotation.xy, v_vMaxAndInverseDistance.xy, uv) * v_vMaxAndInverseDistance.z; #endif czm_material material = czm_getMaterial(materialInput); #ifdef FLAT out_FragColor = vec4(material.diffuse + material.emission, material.alpha); #else // FLAT out_FragColor = czm_phong(normalize(-eyeCoordinate.xyz), material, czm_lightDirectionEC); #endif // FLAT // Premultiply alpha. Required for classification primitives on translucent globe. out_FragColor.rgb *= out_FragColor.a; #endif // PER_INSTANCE_COLOR czm_writeDepthClamp(); #endif // PICK } `;function Lu(e,t,n){this._projectionExtentDefines={eastMostYhighDefine:"",eastMostYlowDefine:"",westMostYhighDefine:"",westMostYlowDefine:""};let i=new UY;i.requiresTextureCoordinates=e,i.requiresEC=!n.flat;let o=new UY;if(o.requiresTextureCoordinates=e,n instanceof dn)i.requiresNormalEC=!n.flat;else{let r=`${n.material.shaderSource} ${n.fragmentShaderSource}`;i.normalEC=r.indexOf("materialInput.normalEC")!==-1||r.indexOf("czm_getDefaultMaterial")!==-1,i.positionToEyeEC=r.indexOf("materialInput.positionToEyeEC")!==-1,i.tangentToEyeMatrix=r.indexOf("materialInput.tangentToEyeMatrix")!==-1,i.st=r.indexOf("materialInput.st")!==-1}this._colorShaderDependencies=i,this._pickShaderDependencies=o,this._appearance=n,this._extentsCulling=e,this._planarExtents=t}Lu.prototype.createFragmentShader=function(e){let t=this._appearance,n=this._colorShaderDependencies,i=[];!e&&!this._planarExtents&&i.push("SPHERICAL"),n.requiresEC&&i.push("REQUIRES_EC"),n.requiresWC&&i.push("REQUIRES_WC"),n.requiresTextureCoordinates&&i.push("TEXTURE_COORDINATES"),this._extentsCulling&&i.push("CULL_FRAGMENTS"),n.requiresNormalEC&&i.push("NORMAL_EC"),t instanceof dn&&i.push("PER_INSTANCE_COLOR"),n.normalEC&&i.push("USES_NORMAL_EC"),n.positionToEyeEC&&i.push("USES_POSITION_TO_EYE_EC"),n.tangentToEyeMatrix&&i.push("USES_TANGENT_TO_EYE"),n.st&&i.push("USES_ST"),t.flat&&i.push("FLAT");let o="";return t instanceof dn||(o=t.material.shaderSource),new De({defines:i,sources:[o,xC]})};Lu.prototype.createPickFragmentShader=function(e){let t=this._pickShaderDependencies,n=["PICK"];return!e&&!this._planarExtents&&n.push("SPHERICAL"),t.requiresEC&&n.push("REQUIRES_EC"),t.requiresWC&&n.push("REQUIRES_WC"),t.requiresTextureCoordinates&&n.push("TEXTURE_COORDINATES"),this._extentsCulling&&n.push("CULL_FRAGMENTS"),new De({defines:n,sources:[xC],pickColorQualifier:"in"})};Lu.prototype.createVertexShader=function(e,t,n,i){return Ine(this._colorShaderDependencies,this._planarExtents,n,e,t,this._appearance,i,this._projectionExtentDefines)};Lu.prototype.createPickVertexShader=function(e,t,n,i){return Ine(this._pickShaderDependencies,this._planarExtents,n,e,t,void 0,i,this._projectionExtentDefines)};var Cne=new m,Vne=new he,Lne={high:0,low:0};function Ine(e,t,n,i,o,r,s,a){let c=i.slice();if(a.eastMostYhighDefine===""){let d=Vne;d.longitude=W.PI,d.latitude=0,d.height=0;let u=s.project(d,Cne),h=Hn.encode(u.x,Lne);a.eastMostYhighDefine=`EAST_MOST_X_HIGH ${h.high.toFixed(`${h.high}`.length+1)}`,a.eastMostYlowDefine=`EAST_MOST_X_LOW ${h.low.toFixed(`${h.low}`.length+1)}`;let p=Vne;p.longitude=-W.PI,p.latitude=0,p.height=0;let g=s.project(p,Cne);h=Hn.encode(g.x,Lne),a.westMostYhighDefine=`WEST_MOST_X_HIGH ${h.high.toFixed(`${h.high}`.length+1)}`,a.westMostYlowDefine=`WEST_MOST_X_LOW ${h.low.toFixed(`${h.low}`.length+1)}`}return n&&(c.push(a.eastMostYhighDefine),c.push(a.eastMostYlowDefine),c.push(a.westMostYhighDefine),c.push(a.westMostYlowDefine)),l(r)&&r instanceof dn&&c.push("PER_INSTANCE_COLOR"),e.requiresTextureCoordinates&&(c.push("TEXTURE_COORDINATES"),t||n||c.push("SPHERICAL"),n&&c.push("COLUMBUS_VIEW_2D")),new De({defines:c,sources:[o]})}function UY(){this._requiresEC=!1,this._requiresWC=!1,this._requiresNormalEC=!1,this._requiresTextureCoordinates=!1,this._usesNormalEC=!1,this._usesPositionToEyeEC=!1,this._usesTangentToEyeMat=!1,this._usesSt=!1}Object.defineProperties(UY.prototype,{requiresEC:{get:function(){return this._requiresEC},set:function(e){this._requiresEC=e||this._requiresEC}},requiresWC:{get:function(){return this._requiresWC},set:function(e){this._requiresWC=e||this._requiresWC,this.requiresEC=this._requiresWC}},requiresNormalEC:{get:function(){return this._requiresNormalEC},set:function(e){this._requiresNormalEC=e||this._requiresNormalEC,this.requiresEC=this._requiresNormalEC}},requiresTextureCoordinates:{get:function(){return this._requiresTextureCoordinates},set:function(e){this._requiresTextureCoordinates=e||this._requiresTextureCoordinates,this.requiresWC=this._requiresTextureCoordinates}},normalEC:{set:function(e){this.requiresNormalEC=e,this._usesNormalEC=e},get:function(){return this._usesNormalEC}},tangentToEyeMatrix:{set:function(e){this.requiresWC=e,this.requiresNormalEC=e,this._usesTangentToEyeMat=e},get:function(){return this._usesTangentToEyeMat}},positionToEyeEC:{set:function(e){this.requiresEC=e,this._usesPositionToEyeEC=e},get:function(){return this._usesPositionToEyeEC}},st:{set:function(e){this.requiresTextureCoordinates=e,this._usesSt=e},get:function(){return this._usesSt}}});function Rne(e,t,n){return Math.abs((t.y-e.y)*n.x-(t.x-e.x)*n.y+t.x*e.y-t.y*e.x)/D.distance(t,e)}var GXe=[new D,new D,new D,new D];function Xne(e,t){let n=GXe,i=D.unpack(t,0,n[0]),o=D.unpack(t,2,n[1]),r=D.unpack(t,4,n[2]);e.uMaxVmax=new cc({componentDatatype:Q.FLOAT,componentsPerAttribute:4,normalize:!1,value:[o.x,o.y,r.x,r.y]});let s=1/Rne(i,o,r),a=1/Rne(i,r,o);e.uvMinAndExtents=new cc({componentDatatype:Q.FLOAT,componentsPerAttribute:4,normalize:!1,value:[i.x,i.y,s,a]})}var Wne=new he,Pne=new m,EXe=new m,IXe=new m,b5={high:0,low:0};function vne(e,t,n){let i=Wne;i.height=0,i.longitude=e.west,i.latitude=e.south;let o=t.project(i,Pne);i.latitude=e.north;let r=t.project(i,EXe);i.longitude=e.east,i.latitude=e.south;let s=t.project(i,IXe),a=[0,0,0,0],c=[0,0,0,0],d=Hn.encode(o.x,b5);a[0]=d.high,c[0]=d.low,d=Hn.encode(o.y,b5),a[1]=d.high,c[1]=d.low,d=Hn.encode(r.y,b5),a[2]=d.high,c[2]=d.low,d=Hn.encode(s.x,b5),a[3]=d.high,c[3]=d.low,n.planes2D_HIGH=new cc({componentDatatype:Q.FLOAT,componentsPerAttribute:4,normalize:!1,value:a}),n.planes2D_LOW=new cc({componentDatatype:Q.FLOAT,componentsPerAttribute:4,normalize:!1,value:c})}var XXe=new M,WXe=new M,Zne=new m,PXe=new he,vXe=[new he,new he,new he,new he,new he,new he,new he,new he];function wXe(e,t,n,i,o,r){let s=le.center(e,PXe);s.height=n;let a=he.toCartesian(s,t,Zne),c=wt.eastNorthUpToFixedFrame(a,t,XXe),d=M.inverse(c,WXe),u=e.west,h=e.east,p=e.north,g=e.south,f=vXe;f[0].latitude=g,f[0].longitude=u,f[1].latitude=p,f[1].longitude=u,f[2].latitude=p,f[2].longitude=h,f[3].latitude=g,f[3].longitude=h;let x=(u+h)*.5,_=(p+g)*.5;f[4].latitude=g,f[4].longitude=x,f[5].latitude=p,f[5].longitude=x,f[6].latitude=_,f[6].longitude=u,f[7].latitude=_,f[7].longitude=h;let C=Number.POSITIVE_INFINITY,V=Number.NEGATIVE_INFINITY,L=Number.POSITIVE_INFINITY,R=Number.NEGATIVE_INFINITY;for(let P=0;P<8;P++){f[P].height=n;let w=he.toCartesian(f[P],t,Zne);M.multiplyByPoint(d,w,w),w.z=0,C=Math.min(C,w.x),V=Math.max(V,w.x),L=Math.min(L,w.y),R=Math.max(R,w.y)}let G=i;G.x=C,G.y=L,G.z=0,M.multiplyByPoint(c,G,G);let I=o;I.x=V,I.y=L,I.z=0,M.multiplyByPoint(c,I,I),m.subtract(I,G,o);let v=r;v.x=C,v.y=R,v.z=0,M.multiplyByPoint(c,v,v),m.subtract(v,G,r)}var FXe=new m,AXe=new m,MXe=new Hn;Lu.getPlanarTextureCoordinateAttributes=function(e,t,n,i,o){let r=Pne,s=FXe,a=AXe;wXe(e,n,y(o,0),r,s,a);let c={};Xne(c,t);let d=Hn.fromCartesian(r,MXe);return c.southWest_HIGH=new cc({componentDatatype:Q.FLOAT,componentsPerAttribute:3,normalize:!1,value:m.pack(d.high,[0,0,0])}),c.southWest_LOW=new cc({componentDatatype:Q.FLOAT,componentsPerAttribute:3,normalize:!1,value:m.pack(d.low,[0,0,0])}),c.eastward=new cc({componentDatatype:Q.FLOAT,componentsPerAttribute:3,normalize:!1,value:m.pack(s,[0,0,0])}),c.northward=new cc({componentDatatype:Q.FLOAT,componentsPerAttribute:3,normalize:!1,value:m.pack(a,[0,0,0])}),vne(e,i,c),c};var NXe=new m;function Gne(e,t,n,i){let o=Wne;o.latitude=e,o.longitude=t,o.height=0;let r=he.toCartesian(o,n,NXe),s=Math.sqrt(r.x*r.x+r.y*r.y),a=W.fastApproximateAtan2(s,r.z),c=W.fastApproximateAtan2(r.x,r.y);return i.x=a,i.y=c,i}var Ene=new D;Lu.getSphericalExtentGeometryInstanceAttributes=function(e,t,n,i){let o=Gne(e.south,e.west,n,Ene),r=o.x,s=o.y,a=Gne(e.north,e.east,n,Ene),c=a.x,d=a.y,u=0;s>d&&(u=W.PI-s,s=-W.PI,d+=u),r-=W.EPSILON5,s-=W.EPSILON5,c+=W.EPSILON5,d+=W.EPSILON5;let h=1/(d-s),p=1/(c-r),g={sphericalExtents:new cc({componentDatatype:Q.FLOAT,componentsPerAttribute:4,normalize:!1,value:[r,s,p,h]}),longitudeRotation:new cc({componentDatatype:Q.FLOAT,componentsPerAttribute:1,normalize:!1,value:[u]})};return Xne(g,t),vne(e,i,g),g};Lu.hasAttributesForTextureCoordinatePlanes=function(e){return l(e.southWest_HIGH)&&l(e.southWest_LOW)&&l(e.northward)&&l(e.eastward)&&l(e.planes2D_HIGH)&&l(e.planes2D_LOW)&&l(e.uMaxVmax)&&l(e.uvMinAndExtents)};Lu.hasAttributesForSphericalExtents=function(e){return l(e.sphericalExtents)&&l(e.longitudeRotation)&&l(e.planes2D_HIGH)&&l(e.planes2D_LOW)&&l(e.uMaxVmax)&&l(e.uvMinAndExtents)};function kXe(e){return Math.max(e.width,e.height)>Lu.MAX_WIDTH_FOR_PLANAR_EXTENTS}Lu.shouldUseSphericalCoordinates=function(e){return kXe(e)};Lu.MAX_WIDTH_FOR_PLANAR_EXTENTS=W.toRadians(1);var bd=Lu;var iJt=T(S(),1);var QKt=T(S(),1);var UXe={NEVER:ie.NEVER,LESS:ie.LESS,EQUAL:ie.EQUAL,LESS_OR_EQUAL:ie.LEQUAL,GREATER:ie.GREATER,NOT_EQUAL:ie.NOTEQUAL,GREATER_OR_EQUAL:ie.GEQUAL,ALWAYS:ie.ALWAYS},On=Object.freeze(UXe);var $Kt=T(S(),1);var DXe={ZERO:ie.ZERO,KEEP:ie.KEEP,REPLACE:ie.REPLACE,INCREMENT:ie.INCR,DECREMENT:ie.DECR,INVERT:ie.INVERT,INCREMENT_WRAP:ie.INCR_WRAP,DECREMENT_WRAP:ie.DECR_WRAP},ft=Object.freeze(DXe);var g5={CESIUM_3D_TILE_MASK:128,SKIP_LOD_MASK:112,SKIP_LOD_BIT_SHIFT:4,CLASSIFICATION_MASK:15};g5.setCesium3DTileBit=function(){return{enabled:!0,frontFunction:On.ALWAYS,frontOperation:{fail:ft.KEEP,zFail:ft.KEEP,zPass:ft.REPLACE},backFunction:On.ALWAYS,backOperation:{fail:ft.KEEP,zFail:ft.KEEP,zPass:ft.REPLACE},reference:g5.CESIUM_3D_TILE_MASK,mask:g5.CESIUM_3D_TILE_MASK}};var Dt=Object.freeze(g5);function wx(e){e=y(e,y.EMPTY_OBJECT);let t=e.geometryInstances;this.geometryInstances=t,this.show=y(e.show,!0),this.classificationType=y(e.classificationType,Bn.BOTH),this.debugShowBoundingVolume=y(e.debugShowBoundingVolume,!1),this.debugShowShadowVolume=y(e.debugShowShadowVolume,!1),this._debugShowShadowVolume=!1,this._extruded=y(e._extruded,!1),this._uniformMap=e._uniformMap,this._sp=void 0,this._spStencil=void 0,this._spPick=void 0,this._spColor=void 0,this._spPick2D=void 0,this._spColor2D=void 0,this._rsStencilDepthPass=void 0,this._rsStencilDepthPass3DTiles=void 0,this._rsColorPass=void 0,this._rsPickPass=void 0,this._commandsIgnoreShow=[],this._ready=!1,this._primitive=void 0,this._pickPrimitive=e._pickPrimitive,this._hasSphericalExtentsAttribute=!1,this._hasPlanarExtentsAttributes=!1,this._hasPerColorAttribute=!1,this.appearance=e.appearance,this._createBoundingVolumeFunction=e._createBoundingVolumeFunction,this._updateAndQueueCommandsFunction=e._updateAndQueueCommandsFunction,this._usePickOffsets=!1,this._primitiveOptions={geometryInstances:void 0,appearance:void 0,vertexCacheOptimize:y(e.vertexCacheOptimize,!1),interleave:y(e.interleave,!1),releaseGeometryInstances:y(e.releaseGeometryInstances,!0),allowPicking:y(e.allowPicking,!0),asynchronous:y(e.asynchronous,!0),compressVertices:y(e.compressVertices,!0),_createBoundingVolumeFunction:void 0,_createRenderStatesFunction:void 0,_createShaderProgramFunction:void 0,_createCommandsFunction:void 0,_updateAndQueueCommandsFunction:void 0,_createPickOffsets:!0}}Object.defineProperties(wx.prototype,{vertexCacheOptimize:{get:function(){return this._primitiveOptions.vertexCacheOptimize}},interleave:{get:function(){return this._primitiveOptions.interleave}},releaseGeometryInstances:{get:function(){return this._primitiveOptions.releaseGeometryInstances}},allowPicking:{get:function(){return this._primitiveOptions.allowPicking}},asynchronous:{get:function(){return this._primitiveOptions.asynchronous}},compressVertices:{get:function(){return this._primitiveOptions.compressVertices}},ready:{get:function(){return this._ready}},_needs2DShader:{get:function(){return this._hasPlanarExtentsAttributes||this._hasSphericalExtentsAttribute}}});wx.isSupported=function(e){return e.context.stencilBuffer};function _C(e,t){let n=t?On.EQUAL:On.ALWAYS;return{colorMask:{red:!1,green:!1,blue:!1,alpha:!1},stencilTest:{enabled:e,frontFunction:n,frontOperation:{fail:ft.KEEP,zFail:ft.DECREMENT_WRAP,zPass:ft.KEEP},backFunction:n,backOperation:{fail:ft.KEEP,zFail:ft.INCREMENT_WRAP,zPass:ft.KEEP},reference:Dt.CESIUM_3D_TILE_MASK,mask:Dt.CESIUM_3D_TILE_MASK},stencilMask:Dt.CLASSIFICATION_MASK,depthTest:{enabled:!0,func:ac.LESS_OR_EQUAL},depthMask:!1}}function BY(e){return{stencilTest:{enabled:e,frontFunction:On.NOT_EQUAL,frontOperation:{fail:ft.ZERO,zFail:ft.ZERO,zPass:ft.ZERO},backFunction:On.NOT_EQUAL,backOperation:{fail:ft.ZERO,zFail:ft.ZERO,zPass:ft.ZERO},reference:0,mask:Dt.CLASSIFICATION_MASK},stencilMask:Dt.CLASSIFICATION_MASK,depthTest:{enabled:!1},depthMask:!1,blending:hn.PRE_MULTIPLIED_ALPHA_BLEND}}var BXe={stencilTest:{enabled:!0,frontFunction:On.NOT_EQUAL,frontOperation:{fail:ft.ZERO,zFail:ft.ZERO,zPass:ft.ZERO},backFunction:On.NOT_EQUAL,backOperation:{fail:ft.ZERO,zFail:ft.ZERO,zPass:ft.ZERO},reference:0,mask:Dt.CLASSIFICATION_MASK},stencilMask:Dt.CLASSIFICATION_MASK,depthTest:{enabled:!1},depthMask:!1};function OXe(e,t,n,i){if(l(e._rsStencilDepthPass))return;let o=!e.debugShowShadowVolume;e._rsStencilDepthPass=Ue.fromCache(_C(o,!1)),e._rsStencilDepthPass3DTiles=Ue.fromCache(_C(o,!0)),e._rsColorPass=Ue.fromCache(BY(o,!1)),e._rsPickPass=Ue.fromCache(BXe)}function YXe(e,t){if(!e.compressVertices)return t;if(t.search(/in\s+vec3\s+extrudeDirection;/g)!==-1){let n="compressedAttributes",i=`in vec2 ${n};`,o=`vec3 extrudeDirection; `,r=` extrudeDirection = czm_octDecode(${n}, 65535.0); `,s=t;s=s.replace(/in\s+vec3\s+extrudeDirection;/g,""),s=De.replaceMain(s,"czm_non_compressed_main");let a=`void main() { ${r} czm_non_compressed_main(); }`;return[i,o,s,a].join(` `)}}function HXe(e,t){let n=t.context,i=e._primitive,o=HE;o=e._primitive._batchTable.getVertexShaderCallback()(o),o=Xn._appendDistanceDisplayConditionToShader(i,o),o=Xn._modifyShaderPosition(e,o,t.scene3DOnly),o=Xn._updateColorAttribute(i,o);let r=e._hasPlanarExtentsAttributes,s=r||e._hasSphericalExtentsAttribute;e._extruded&&(o=YXe(i,o));let a=e._extruded?"EXTRUDED_GEOMETRY":"",c=new De({defines:[a],sources:[o]}),d=new De({sources:[eg]}),u=e._primitive._attributeLocations,h=new bd(s,r,e.appearance);if(e._spStencil=en.replaceCache({context:n,shaderProgram:e._spStencil,vertexShaderSource:c,fragmentShaderSource:d,attributeLocations:u}),e._primitive.allowPicking){let f=De.createPickVertexShaderSource(o);f=Xn._appendShowToShader(i,f),f=Xn._updatePickColorAttribute(f);let x=h.createPickFragmentShader(!1),_=h.createPickVertexShader([a],f,!1,t.mapProjection);if(e._spPick=en.replaceCache({context:n,shaderProgram:e._spPick,vertexShaderSource:_,fragmentShaderSource:x,attributeLocations:u}),s){let C=n.shaderCache.getDerivedShaderProgram(e._spPick,"2dPick");if(!l(C)){let V=h.createPickFragmentShader(!0),L=h.createPickVertexShader([a],f,!0,t.mapProjection);C=n.shaderCache.createDerivedShaderProgram(e._spPick,"2dPick",{vertexShaderSource:L,fragmentShaderSource:V,attributeLocations:u})}e._spPick2D=C}}else e._spPick=en.fromCache({context:n,vertexShaderSource:c,fragmentShaderSource:d,attributeLocations:u});o=Xn._appendShowToShader(i,o),c=new De({defines:[a],sources:[o]}),e._sp=en.replaceCache({context:n,shaderProgram:e._sp,vertexShaderSource:c,fragmentShaderSource:d,attributeLocations:u});let p=h.createFragmentShader(!1),g=h.createVertexShader([a],o,!1,t.mapProjection);if(e._spColor=en.replaceCache({context:n,shaderProgram:e._spColor,vertexShaderSource:g,fragmentShaderSource:p,attributeLocations:u}),s){let f=n.shaderCache.getDerivedShaderProgram(e._spColor,"2dColor");if(!l(f)){let x=h.createFragmentShader(!0),_=h.createVertexShader([a],o,!0,t.mapProjection);f=n.shaderCache.createDerivedShaderProgram(e._spColor,"2dColor",{vertexShaderSource:_,fragmentShaderSource:x,attributeLocations:u})}e._spColor2D=f}}function zXe(e,t){let n=e._primitive,i=n._va.length*2;t.length=i;let o,r,s,a=0,c=n._batchTable.getUniformMapCallback()(e._uniformMap),d=e._needs2DShader;for(o=0;o0&&(c=o[0].attributes,p=bd.hasAttributesForSphericalExtents(c),g=bd.hasAttributesForTextureCoordinatePlanes(c),h=c.color),s=0;s{l(this._primitive)&&this._primitive.ready&&(this._ready=!0,this.releaseGeometryInstances&&(this.geometryInstances=void 0))})};wx.prototype.getGeometryInstanceAttributes=function(e){return this._primitive.getGeometryInstanceAttributes(e)};wx.prototype.isDestroyed=function(){return!1};wx.prototype.destroy=function(){return this._primitive=this._primitive&&this._primitive.destroy(),this._sp=this._sp&&this._sp.destroy(),this._spPick=this._spPick&&this._spPick.destroy(),this._spColor=this._spColor&&this._spColor.destroy(),this._spPick2D=void 0,this._spColor2D=void 0,me(this)};var TC=wx;var jXe={u_globeMinimumAltitude:function(){return 55e3}};function Il(e){e=y(e,y.EMPTY_OBJECT);let t=e.appearance,n=e.geometryInstances;if(!l(t)&&l(n)){let o=Array.isArray(n)?n:[n],r=o.length;for(let s=0;s{!this._ready&&l(this._primitive)&&this._primitive.ready&&(this._ready=!0,this.releaseGeometryInstances&&(this.geometryInstances=void 0))})};Il.prototype.getBoundingSphere=function(e){let t=this._boundingSpheresKeys.indexOf(e);if(t!==-1)return this._boundingSpheres[t]};Il.prototype.getGeometryInstanceAttributes=function(e){return this._primitive.getGeometryInstanceAttributes(e)};Il.prototype.isDestroyed=function(){return!1};Il.prototype.destroy=function(){return this._primitive=this._primitive&&this._primitive.destroy(),me(this)};Il._supportsMaterials=function(e){return e.depthTexture};Il.supportsMaterials=function(e){return Il._supportsMaterials(e.frameState.context)};var kc=Il;var eQt=T(S(),1);function SC(){fe.throwInstantiationError()}Object.defineProperties(SC.prototype,{isConstant:{get:fe.throwInstantiationError},definitionChanged:{get:fe.throwInstantiationError}});SC.prototype.getType=fe.throwInstantiationError;SC.prototype.getValue=fe.throwInstantiationError;SC.prototype.equals=fe.throwInstantiationError;var sWe=new q;SC.getValue=function(e,t,n){let i;return l(e)||(e=q.now(sWe)),l(t)&&(i=t.getType(e),l(i))?((!l(n)||n.type!==i)&&(n=Ji.fromType(i)),t.getValue(e,n.uniforms),n):((!l(n)||n.type!==Ji.ColorType)&&(n=Ji.fromType(Ji.ColorType)),B.clone(B.WHITE,n.uniforms.color),n)};var er=SC;function Fx(e,t,n){this._primitives=t,this._orderedGroundPrimitives=n,this._primitive=void 0,this._outlinePrimitive=void 0,this._geometryUpdater=e,this._options=e._options,this._entity=e._entity,this._material=void 0}Fx.prototype._isHidden=function(e,t,n){return!e.isShowing||!e.isAvailable(n)||!J.getValueOrDefault(t.show,n,!0)};Fx.prototype._setOptions=fe.throwInstantiationError;Fx.prototype.update=function(e){let t=this._geometryUpdater,n=t._onTerrain,i=this._primitives,o=this._orderedGroundPrimitives;n?o.remove(this._primitive):(i.removeAndDestroy(this._primitive),i.removeAndDestroy(this._outlinePrimitive),this._outlinePrimitive=void 0),this._primitive=void 0;let r=this._entity,s=r[this._geometryUpdater._geometryPropertyName];if(this._setOptions(r,s,e),this._isHidden(r,s,e))return;let a=this._geometryUpdater.shadowsProperty.getValue(e),c=this._options;if(!l(s.fill)||s.fill.getValue(e)){let d=t.fillMaterialProperty,u=d instanceof Bt,h,p=t._getIsClosed(c);if(u)h=new dn({closed:p,flat:n&&!t._supportsMaterialsforEntitiesOnTerrain});else{let g=er.getValue(e,d,this._material);this._material=g,h=new uo({material:g,translucent:g.isTranslucent(),closed:p})}if(n)c.vertexFormat=dn.VERTEX_FORMAT,this._primitive=o.add(new kc({geometryInstances:this._geometryUpdater.createFillGeometryInstance(e),appearance:h,asynchronous:!1,shadows:a,classificationType:this._geometryUpdater.classificationTypeProperty.getValue(e)}),J.getValueOrUndefined(this._geometryUpdater.zIndex,e));else{c.vertexFormat=h.vertexFormat;let g=this._geometryUpdater.createFillGeometryInstance(e);u&&(h.translucent=g.attributes.color.value[3]!==255),this._primitive=i.add(new Xn({geometryInstances:g,appearance:h,asynchronous:!1,shadows:a}))}}if(!n&&l(s.outline)&&s.outline.getValue(e)){let d=this._geometryUpdater.createOutlineGeometryInstance(e),u=J.getValueOrDefault(s.outlineWidth,e,1);this._outlinePrimitive=i.add(new Xn({geometryInstances:d,appearance:new dn({flat:!0,translucent:d.attributes.color.value[3]!==255,renderState:{lineWidth:t._scene.clampLineWidth(u)}}),asynchronous:!1,shadows:a}))}};Fx.prototype.getBoundingSphere=function(e){let t=this._entity,n=this._primitive,i=this._outlinePrimitive,o;return l(n)&&n.show&&n.ready&&(o=n.getGeometryInstanceAttributes(t),l(o)&&l(o.boundingSphere))?(de.clone(o.boundingSphere,e),dt.DONE):l(i)&&i.show&&i.ready&&(o=i.getGeometryInstanceAttributes(t),l(o)&&l(o.boundingSphere))?(de.clone(o.boundingSphere,e),dt.DONE):l(n)&&!n.ready||l(i)&&!i.ready?dt.PENDING:dt.FAILED};Fx.prototype.isDestroyed=function(){return!1};Fx.prototype.destroy=function(){let e=this._primitives,t=this._orderedGroundPrimitives;this._geometryUpdater._onTerrain?t.remove(this._primitive):e.removeAndDestroy(this._primitive),e.removeAndDestroy(this._outlinePrimitive),me(this)};var ri=Fx;var Oqt=T(S(),1);var yQt=T(S(),1);var kne={};function jE(e,t){l(kne[e])||(kne[e]=!0,console.warn(y(t,e)))}jE.geometryOutlines="Entity geometry outlines are unsupported on terrain. Outlines will be disabled. To enable outlines, disable geometry terrain clamping by explicitly setting height to 0.";jE.geometryZIndex="Entity geometry with zIndex are unsupported when height or extrudedHeight are defined. zIndex will be ignored";jE.geometryHeightReference="Entity corridor, ellipse, polygon or rectangle with heightReference must also have a defined height. heightReference will be ignored";jE.geometryExtrudedHeightReference="Entity corridor, ellipse, polygon or rectangle with extrudedHeightReference must also have a defined extrudedHeight. extrudedHeightReference will be ignored";var Ct=jE;var Zqt=T(S(),1);var _Qt=T(S(),1),aWe={AUTODETECT:0,ENU:1,INERTIAL:2,VELOCITY:3},Np=Object.freeze(aWe);var Rjt=T(S(),1);var f4t=T(S(),1);var SQt=T(S(),1),cWe={NONE:0,GEODESIC:1,RHUMB:2},tn=Object.freeze(cWe);var ZQt=T(S(),1);var Une=W.EPSILON10;function lWe(e,t,n,i){if(!l(e))return;n=y(n,!1);let o=l(i),r=e.length;if(r<2)return e;let s,a=e[0],c,d,u=0,h=-1;for(s=1;sW.EPSILON12);let Z=A*(t*t-n*n)/(n*n),E=1+Z*(4096+Z*(Z*(320-175*Z)-768))/16384,X=Z*(256+Z*(Z*(74-47*Z)-128))/1024,F=b*b,N=X*w*(b+X*(P*(2*F-1)-X*b*(4*w*w-3)*(4*F-3)/6)/4),O=n*E*(v-N),U=Math.atan2(g*I,_-V*G),Y=Math.atan2(h*I,_*G-V);e._distance=O,e._startHeading=U,e._endHeading=Y,e._uSquared=Z}var hWe=new m,HY=new m;function Bne(e,t,n,i){let o=m.normalize(i.cartographicToCartesian(t,HY),hWe),r=m.normalize(i.cartographicToCartesian(n,HY),HY);mWe(e,i.maximumRadius,i.minimumRadius,t.longitude,t.latitude,n.longitude,n.latitude),e._start=he.clone(t,e._start),e._end=he.clone(n,e._end),e._start.height=0,e._end.height=0,dWe(e)}function qE(e,t,n){let i=y(n,ne.default);this._ellipsoid=i,this._start=new he,this._end=new he,this._constants={},this._startHeading=void 0,this._endHeading=void 0,this._distance=void 0,this._uSquared=void 0,l(e)&&l(t)&&Bne(this,e,t,i)}Object.defineProperties(qE.prototype,{ellipsoid:{get:function(){return this._ellipsoid}},surfaceDistance:{get:function(){return this._distance}},start:{get:function(){return this._start}},end:{get:function(){return this._end}},startHeading:{get:function(){return this._startHeading}},endHeading:{get:function(){return this._endHeading}}});qE.prototype.setEndPoints=function(e,t){Bne(this,e,t,this._ellipsoid)};qE.prototype.interpolateUsingFraction=function(e,t){return this.interpolateUsingSurfaceDistance(this._distance*e,t)};qE.prototype.interpolateUsingSurfaceDistance=function(e,t){let n=this._constants,i=n.distanceRatio+e/n.b,o=Math.cos(2*i),r=Math.cos(4*i),s=Math.cos(6*i),a=Math.sin(2*i),c=Math.sin(4*i),d=Math.sin(6*i),u=Math.sin(8*i),h=i*i,p=i*h,g=n.u8Over256,f=n.u2Over4,x=n.u6Over64,_=n.u4Over16,C=2*p*g*o/3+i*(1-f+7*_/4-15*x/4+579*g/64-(_-15*x/4+187*g/16)*o-(5*x/4-115*g/16)*r-29*g*s/16)+(f/2-_+71*x/32-85*g/16)*a+(5*_/16-5*x/4+383*g/96)*c-h*((x-11*g/2)*a+5*g*c/2)+(29*x/96-29*g/16)*d+539*g*u/1536,V=Math.asin(Math.sin(C)*n.cosineAlpha),L=Math.atan(n.a/n.b*Math.tan(V));C=C-n.sigma;let R=Math.cos(2*n.sigma+C),G=Math.sin(C),I=Math.cos(C),v=n.cosineU*I,P=n.sineU*G,A=Math.atan2(G*n.sineHeading,v-P*n.cosineHeading)-Dne(n.f,n.sineAlpha,n.cosineSquaredAlpha,C,G,I,R);return l(t)?(t.longitude=this._start.longitude+A,t.latitude=L,t.height=0,t):new he(this._start.longitude+A,L,0)};var kp=qE;var BQt=T(S(),1);function KY(e,t,n){if(e===0)return t*n;let i=e*e,o=i*i,r=o*i,s=r*i,a=s*i,c=a*i,d=n,u=Math.sin(2*d),h=Math.sin(4*d),p=Math.sin(6*d),g=Math.sin(8*d),f=Math.sin(10*d),x=Math.sin(12*d);return t*((1-i/4-3*o/64-5*r/256-175*s/16384-441*a/65536-4851*c/1048576)*d-(3*i/8+3*o/32+45*r/1024+105*s/4096+2205*a/131072+6237*c/524288)*u+(15*o/256+45*r/1024+525*s/16384+1575*a/65536+155925*c/8388608)*h-(35*r/3072+175*s/12288+3675*a/262144+13475*c/1048576)*p+(315*s/131072+2205*a/524288+43659*c/8388608)*g-(693*a/1310720+6237*c/5242880)*f+1001*c/8388608*x)}function fWe(e,t,n){let i=e/n;if(t===0)return i;let o=i*i,r=o*i,s=r*i,a=t,c=a*a,d=c*c,u=d*c,h=u*c,p=h*c,g=p*c,f=Math.sin(2*i),x=Math.cos(2*i),_=Math.sin(4*i),C=Math.cos(4*i),V=Math.sin(6*i),L=Math.cos(6*i),R=Math.sin(8*i),G=Math.cos(8*i),I=Math.sin(10*i),v=Math.cos(10*i),P=Math.sin(12*i);return i+i*c/4+7*i*d/64+15*i*u/256+579*i*h/16384+1515*i*p/65536+16837*i*g/1048576+(3*i*d/16+45*i*u/256-i*(32*o-561)*h/4096-i*(232*o-1677)*p/16384+i*(399985-90560*o+512*s)*g/5242880)*x+(21*i*u/256+483*i*h/4096-i*(224*o-1969)*p/16384-i*(33152*o-112599)*g/1048576)*C+(151*i*h/4096+4681*i*p/65536+1479*i*g/16384-453*r*g/32768)*L+(1097*i*p/65536+42783*i*g/1048576)*G+8011*i*g/1048576*v+(3*c/8+3*d/16+213*u/2048-3*o*u/64+255*h/4096-33*o*h/512+20861*p/524288-33*o*p/512+s*p/1024+28273*g/1048576-471*o*g/8192+9*s*g/4096)*f+(21*d/256+21*u/256+533*h/8192-21*o*h/512+197*p/4096-315*o*p/4096+584039*g/16777216-12517*o*g/131072+7*s*g/2048)*_+(151*u/6144+151*h/4096+5019*p/131072-453*o*p/16384+26965*g/786432-8607*o*g/131072)*V+(1097*h/131072+1097*p/65536+225797*g/10485760-1097*o*g/65536)*R+(8011*p/2621440+8011*g/1048576)*I+293393*g/251658240*P}function CC(e,t){if(e===0)return Math.log(Math.tan(.5*(W.PI_OVER_TWO+t)));let n=e*Math.sin(t);return Math.log(Math.tan(.5*(W.PI_OVER_TWO+t)))-e/2*Math.log((1+n)/(1-n))}function pWe(e,t,n,i,o){let r=CC(e._ellipticity,n),s=CC(e._ellipticity,o);return Math.atan2(W.negativePiToPi(i-t),s-r)}function bWe(e,t,n,i,o,r,s){let a=e._heading,c=r-i,d=0;if(W.equalsEpsilon(Math.abs(a),W.PI_OVER_TWO,W.EPSILON8))if(t===n)d=t*Math.cos(o)*W.negativePiToPi(c);else{let u=Math.sin(o);d=t*Math.cos(o)*W.negativePiToPi(c)/Math.sqrt(1-e._ellipticitySquared*u*u)}else{let u=KY(e._ellipticity,t,o);d=(KY(e._ellipticity,t,s)-u)/Math.cos(a)}return Math.abs(d)}var gWe=new m,zY=new m;function One(e,t,n,i){let o=m.normalize(i.cartographicToCartesian(t,zY),gWe),r=m.normalize(i.cartographicToCartesian(n,zY),zY),s=i.maximumRadius,a=i.minimumRadius,c=s*s,d=a*a;e._ellipticitySquared=(c-d)/c,e._ellipticity=Math.sqrt(e._ellipticitySquared),e._start=he.clone(t,e._start),e._start.height=0,e._end=he.clone(n,e._end),e._end.height=0,e._heading=pWe(e,t.longitude,t.latitude,n.longitude,n.latitude),e._distance=bWe(e,i.maximumRadius,i.minimumRadius,t.longitude,t.latitude,n.longitude,n.latitude)}function Yne(e,t,n,i,o,r){if(n===0)return he.clone(e,r);let s=o*o,a,c,d;if(Math.abs(W.PI_OVER_TWO-Math.abs(t))>W.EPSILON8){let u=KY(o,i,e.latitude),h=n*Math.cos(t),p=u+h;if(c=fWe(p,o,i),Math.abs(t)0?a=W.negativePiToPi(e.longitude+d):a=W.negativePiToPi(e.longitude-d)}return l(r)?(r.longitude=a,r.latitude=c,r.height=0,r):new he(a,c,0)}function Up(e,t,n){let i=y(n,ne.default);this._ellipsoid=i,this._start=new he,this._end=new he,this._heading=void 0,this._distance=void 0,this._ellipticity=void 0,this._ellipticitySquared=void 0,l(e)&&l(t)&&One(this,e,t,i)}Object.defineProperties(Up.prototype,{ellipsoid:{get:function(){return this._ellipsoid}},surfaceDistance:{get:function(){return this._distance}},start:{get:function(){return this._start}},end:{get:function(){return this._end}},heading:{get:function(){return this._heading}}});Up.fromStartHeadingDistance=function(e,t,n,i,o){let r=y(i,ne.default),s=r.maximumRadius,a=r.minimumRadius,c=s*s,d=a*a,u=Math.sqrt((c-d)/c);t=W.negativePiToPi(t);let h=Yne(e,t,n,r.maximumRadius,u);return!l(o)||l(i)&&!i.equals(o.ellipsoid)?new Up(e,h,r):(o.setEndPoints(e,h),o)};Up.prototype.setEndPoints=function(e,t){One(this,e,t,this._ellipsoid)};Up.prototype.interpolateUsingFraction=function(e,t){return this.interpolateUsingSurfaceDistance(e*this._distance,t)};Up.prototype.interpolateUsingSurfaceDistance=function(e,t){return Yne(this._start,this._heading,e,this._ellipsoid.maximumRadius,this._ellipticity,t)};Up.prototype.findIntersectionWithLongitude=function(e,t){let n=this._ellipticity,i=this._heading,o=Math.abs(i),r=this._start;if(e=W.negativePiToPi(e),W.equalsEpsilon(Math.abs(e),Math.PI,W.EPSILON14)&&(e=W.sign(r.longitude)*Math.PI),l(t)||(t=new he),Math.abs(W.PI_OVER_TWO-o)<=W.EPSILON8)return t.longitude=e,t.latitude=r.latitude,t.height=0,t;if(W.equalsEpsilon(Math.abs(W.PI_OVER_TWO-o),W.PI_OVER_TWO,W.EPSILON8))return W.equalsEpsilon(e,r.longitude,W.EPSILON12)?void 0:(t.longitude=e,t.latitude=W.PI_OVER_TWO*W.sign(W.PI_OVER_TWO-i),t.height=0,t);let s=r.latitude,a=n*Math.sin(s),c=Math.tan(.5*(W.PI_OVER_TWO+s))*Math.exp((e-r.longitude)/Math.tan(i)),d=(1+a)/(1-a),u=r.latitude,h;do{h=u;let p=n*Math.sin(h),g=(1+p)/(1-p);u=2*Math.atan(c*Math.pow(g/d,n/2))-W.PI_OVER_TWO}while(!W.equalsEpsilon(u,h,W.EPSILON12));return t.longitude=e,t.latitude=u,t.height=0,t};Up.prototype.findIntersectionWithLatitude=function(e,t){let n=this._ellipticity,i=this._heading,o=this._start;if(W.equalsEpsilon(Math.abs(i),W.PI_OVER_TWO,W.EPSILON8))return;let r=CC(n,o.latitude),s=CC(n,e),a=Math.tan(i)*(s-r),c=W.negativePiToPi(o.longitude+a);return l(t)?(t.longitude=c,t.latitude=e,t.height=0,t):new he(c,e,0)};var Fa=Up;var nH=[Ii,Wi],yWe=nH.length,uie=Math.cos(W.toRadians(30)),Hne=Math.cos(W.toRadians(150)),mie=0,hie=1e3;function ng(e){e=y(e,y.EMPTY_OBJECT);let t=e.positions;this.width=y(e.width,1),this._positions=t,this.granularity=y(e.granularity,9999),this.loop=y(e.loop,!1),this.arcType=y(e.arcType,tn.GEODESIC),this._ellipsoid=ne.default,this._projectionIndex=0,this._workerName="createGroundPolylineGeometry",this._scene3DOnly=!1}Object.defineProperties(ng.prototype,{packedLength:{get:function(){return 1+this._positions.length*3+1+1+1+ne.packedLength+1+1}}});ng.setProjectionAndEllipsoid=function(e,t){let n=0;for(let i=0;iuie||rW.PI_OVER_TWO&&(a=!0,s=m.subtract(r,n,eie),d=c.cartesianToCartographic(s,$ne)),d.height=0;let u=e.project(d,o);return o=m.subtract(u,i,o),o.z=0,o=m.normalize(o,o),a&&m.negate(o,o),o}var MWe=new m,tie=new m;function nie(e,t,n,i,o,r){let s=m.subtract(t,e,MWe);m.normalize(s,s);let a=n-mie,c=m.multiplyByScalar(s,a,tie);m.add(e,c,o);let d=i-hie;c=m.multiplyByScalar(s,d,tie),m.add(t,c,r)}var NWe=new m;function T5(e,t){let n=cn.getPointDistance(S5,e),i=cn.getPointDistance(S5,t),o=NWe;W.equalsEpsilon(n,0,W.EPSILON2)?(o=Dp(t,e,o),m.multiplyByScalar(o,W.EPSILON2,o),m.add(e,o,e)):W.equalsEpsilon(i,0,W.EPSILON2)&&(o=Dp(e,t,o),m.multiplyByScalar(o,W.EPSILON2,o),m.add(t,o,t))}function kWe(e,t){let n=Math.abs(e.longitude),i=Math.abs(t.longitude);if(W.equalsEpsilon(n,W.PI,W.EPSILON11)){let o=W.sign(t.longitude);return e.longitude=o*(n-W.EPSILON11),1}else if(W.equalsEpsilon(i,W.PI,W.EPSILON11)){let o=W.sign(e.longitude);return t.longitude=o*(i-W.EPSILON11),2}return 0}var pie=new he,bie=new he,iie=new m,qY=new m,oie=new m,rie=new m,UWe=new m,sie=new m,DWe=[pie,bie],BWe=new le,OWe=new m,YWe=new m,HWe=new m,zWe=new m,KWe=new m,JWe=new m,$Y=new m,eH=new m,QWe=new m,jWe=new m,qWe=new m,aie=new m,$We=new m,e2e=new m,t2e=new Hn,n2e=new Hn,cie=new m,i2e=new m,lie=new m,o2e=[new de,new de],gie=[0,2,1,0,3,2,0,7,3,0,4,7,0,5,4,0,1,5,5,7,4,5,6,7,5,2,6,5,1,2,3,6,2,3,7,6],die=gie.length;function r2e(e,t,n,i,o,r,s){let a,c,d=t._ellipsoid,u=n.length/3-1,h=u*8,p=h*4,g=u*36,f=h>65535?new Uint32Array(g):new Uint16Array(g),x=new Float64Array(h*3),_=new Float32Array(p),C=new Float32Array(p),V=new Float32Array(p),L=new Float32Array(p),R=new Float32Array(p),G,I,v,P;s&&(G=new Float32Array(p),I=new Float32Array(p),v=new Float32Array(p),P=new Float32Array(h*2));let w=r.length/2,A=0,b=pie;b.height=0;let Z=bie;Z.height=0;let E=iie,X=qY;if(s)for(c=0,a=1;auie?(pt=$E(t,b,ve,at,$Y),Qe=$E(t,Z,j,Je,eH)):ki===1?(Qe=$E(t,Z,j,Je,eH),pt.x=0,pt.y=W.sign(b.longitude-Math.abs(Z.longitude)),pt.z=0):(pt=$E(t,b,ve,at,$Y),Qe.x=0,Qe.y=W.sign(b.longitude-Z.longitude),Qe.z=0)}let _t=m.distance(we,z),ht=Hn.fromCartesian(Ie,t2e),bt=m.subtract(te,Ie,QWe),En=m.normalize(bt,aie),sn=m.subtract(we,Ie,jWe);sn=m.normalize(sn,sn);let Ce=m.cross(En,sn,aie);Ce=m.normalize(Ce,Ce);let Le=m.cross(sn,ve,$We);Le=m.normalize(Le,Le);let wn=m.subtract(z,te,qWe);wn=m.normalize(wn,wn);let Mo=m.cross(j,wn,e2e);Mo=m.normalize(Mo,Mo);let Jo=_t/N,Xr=ee/N,da=0,Vs,ua,Ne,ct=0,it=0;if(s){da=m.distance(at,Je),Vs=Hn.fromCartesian(at,n2e),ua=m.subtract(Je,at,cie),Ne=m.normalize(ua,i2e);let ki=Ne.x;Ne.x=Ne.y,Ne.y=-ki,ct=da/A,it=pe/A}for(O=0;O<8;O++){let ki=H+O*4,Ia=Y+O*2,mn=ki+3,Fn=O<4?1:-1,zi=O===2||O===3||O===6||O===7?1:-1;m.pack(ht.high,_,ki),_[mn]=bt.x,m.pack(ht.low,C,ki),C[mn]=bt.y,m.pack(Le,V,ki),V[mn]=bt.z,m.pack(Mo,L,ki),L[mn]=Jo*Fn,m.pack(Ce,R,ki);let ze=Xr*zi;ze===0&&zi<0&&(ze=9),R[mn]=ze,s&&(G[ki]=Vs.high.x,G[ki+1]=Vs.high.y,G[ki+2]=Vs.low.x,G[ki+3]=Vs.low.y,v[ki]=-pt.y,v[ki+1]=pt.x,v[ki+2]=Qe.y,v[ki+3]=-Qe.x,I[ki]=ua.x,I[ki+1]=ua.y,I[ki+2]=Ne.x,I[ki+3]=Ne.y,P[Ia]=ct*Fn,ze=it*zi,ze===0&&zi<0&&(ze=9),P[Ia+1]=ze)}let qe=HWe,Gt=zWe,Yt=OWe,Rn=YWe,No=le.fromCartographicArray(DWe,BWe),Io=mi.getMinimumMaximumHeights(No,d),vc=Io.minimumTerrainHeight,wc=Io.maximumTerrainHeight;_e+=Math.abs(vc),_e+=Math.abs(wc),nie(Ie,we,vc,wc,qe,Yt),nie(te,z,vc,wc,Gt,Rn);let Ei=m.multiplyByScalar(Ce,W.EPSILON5,lie);m.add(qe,Ei,qe),m.add(Gt,Ei,Gt),m.add(Yt,Ei,Yt),m.add(Rn,Ei,Rn),T5(qe,Gt),T5(Yt,Rn),m.pack(qe,x,k),m.pack(Gt,x,k+3),m.pack(Rn,x,k+6),m.pack(Yt,x,k+9),Ei=m.multiplyByScalar(Ce,-2*W.EPSILON5,lie),m.add(qe,Ei,qe),m.add(Gt,Ei,Gt),m.add(Yt,Ei,Yt),m.add(Rn,Ei,Rn),T5(qe,Gt),T5(Yt,Rn),m.pack(qe,x,k+12),m.pack(Gt,x,k+15),m.pack(Rn,x,k+18),m.pack(Yt,x,k+21),U+=2,c+=3,Y+=16,k+=24,H+=32,ee+=_t,pe+=da}c=0;let ae=0;for(a=0;a halfMaxWidth || distanceFromStart < 0.0 || distanceFromEnd < 0.0) { #ifdef DEBUG_SHOW_VOLUME out_FragColor = vec4(1.0, 0.0, 0.0, 0.5); return; #else // DEBUG_SHOW_VOLUME discard; #endif // DEBUG_SHOW_VOLUME } // Check distance of the eye coordinate against start and end planes with normals in the right plane. // For computing unskewed lengthwise texture coordinate. // Can also be used for clipping extremely pointy miters, but in practice unnecessary because of miter breaking. // aligned plane: cross the right plane normal with miter plane normal, then cross the result with right again to point it more "forward" vec3 alignedPlaneNormal; // start aligned plane alignedPlaneNormal = cross(v_rightPlaneEC.xyz, v_startPlaneNormalEcAndHalfWidth.xyz); alignedPlaneNormal = normalize(cross(alignedPlaneNormal, v_rightPlaneEC.xyz)); distanceFromStart = czm_planeDistance(alignedPlaneNormal, -dot(alignedPlaneNormal, ecStart), eyeCoordinate.xyz); // end aligned plane alignedPlaneNormal = cross(v_rightPlaneEC.xyz, v_endPlaneNormalEcAndBatchId.xyz); alignedPlaneNormal = normalize(cross(alignedPlaneNormal, v_rightPlaneEC.xyz)); distanceFromEnd = czm_planeDistance(alignedPlaneNormal, -dot(alignedPlaneNormal, v_endEcAndStartEcX.xyz), eyeCoordinate.xyz); #ifdef PER_INSTANCE_COLOR out_FragColor = czm_gammaCorrect(v_color); #else // PER_INSTANCE_COLOR // Clamp - distance to aligned planes may be negative due to mitering, // so fragment texture coordinate might be out-of-bounds. float s = clamp(distanceFromStart / (distanceFromStart + distanceFromEnd), 0.0, 1.0); s = (s * v_texcoordNormalizationAndStartEcYZ.x) + v_texcoordNormalizationAndStartEcYZ.y; float t = (widthwiseDistance + halfMaxWidth) / (2.0 * halfMaxWidth); czm_materialInput materialInput; materialInput.s = s; materialInput.st = vec2(s, t); materialInput.str = vec3(s, t, 0.0); czm_material material = czm_getMaterial(materialInput); out_FragColor = vec4(material.diffuse + material.emission, material.alpha); #endif // PER_INSTANCE_COLOR // Premultiply alpha. Required for classification primitives on translucent globe. out_FragColor.rgb *= out_FragColor.a; czm_writeDepthClamp(); } `;var y4t=T(S(),1),tI=`in vec3 v_forwardDirectionEC; in vec3 v_texcoordNormalizationAndHalfWidth; in float v_batchId; #ifdef PER_INSTANCE_COLOR in vec4 v_color; #else in vec2 v_alignedPlaneDistances; in float v_texcoordT; #endif float rayPlaneDistanceUnsafe(vec3 origin, vec3 direction, vec3 planeNormal, float planeDistance) { // We don't expect the ray to ever be parallel to the plane return (-planeDistance - dot(planeNormal, origin)) / dot(planeNormal, direction); } void main(void) { vec4 eyeCoordinate = gl_FragCoord; eyeCoordinate /= eyeCoordinate.w; #ifdef PER_INSTANCE_COLOR out_FragColor = czm_gammaCorrect(v_color); #else // PER_INSTANCE_COLOR // Use distances for planes aligned with segment to prevent skew in dashing float distanceFromStart = rayPlaneDistanceUnsafe(eyeCoordinate.xyz, -v_forwardDirectionEC, v_forwardDirectionEC.xyz, v_alignedPlaneDistances.x); float distanceFromEnd = rayPlaneDistanceUnsafe(eyeCoordinate.xyz, v_forwardDirectionEC, -v_forwardDirectionEC.xyz, v_alignedPlaneDistances.y); // Clamp - distance to aligned planes may be negative due to mitering distanceFromStart = max(0.0, distanceFromStart); distanceFromEnd = max(0.0, distanceFromEnd); float s = distanceFromStart / (distanceFromStart + distanceFromEnd); s = (s * v_texcoordNormalizationAndHalfWidth.x) + v_texcoordNormalizationAndHalfWidth.y; czm_materialInput materialInput; materialInput.s = s; materialInput.st = vec2(s, v_texcoordT); materialInput.str = vec3(s, v_texcoordT, 0.0); czm_material material = czm_getMaterial(materialInput); out_FragColor = vec4(material.diffuse + material.emission, material.alpha); #endif // PER_INSTANCE_COLOR } `;var _4t=T(S(),1),nI=`in vec3 position3DHigh; in vec3 position3DLow; in vec4 startHiAndForwardOffsetX; in vec4 startLoAndForwardOffsetY; in vec4 startNormalAndForwardOffsetZ; in vec4 endNormalAndTextureCoordinateNormalizationX; in vec4 rightNormalAndTextureCoordinateNormalizationY; in vec4 startHiLo2D; in vec4 offsetAndRight2D; in vec4 startEndNormals2D; in vec2 texcoordNormalization2D; in float batchId; out vec3 v_forwardDirectionEC; out vec3 v_texcoordNormalizationAndHalfWidth; out float v_batchId; // For materials #ifdef WIDTH_VARYING out float v_width; #endif #ifdef ANGLE_VARYING out float v_polylineAngle; #endif #ifdef PER_INSTANCE_COLOR out vec4 v_color; #else out vec2 v_alignedPlaneDistances; out float v_texcoordT; #endif // Morphing planes using SLERP or NLERP doesn't seem to work, so instead draw the material directly on the shadow volume. // Morph views are from very far away and aren't meant to be used precisely, so this should be sufficient. void main() { v_batchId = batchId; // Start position vec4 posRelativeToEye2D = czm_translateRelativeToEye(vec3(0.0, startHiLo2D.xy), vec3(0.0, startHiLo2D.zw)); vec4 posRelativeToEye3D = czm_translateRelativeToEye(startHiAndForwardOffsetX.xyz, startLoAndForwardOffsetY.xyz); vec4 posRelativeToEye = czm_columbusViewMorph(posRelativeToEye2D, posRelativeToEye3D, czm_morphTime); vec3 posEc2D = (czm_modelViewRelativeToEye * posRelativeToEye2D).xyz; vec3 posEc3D = (czm_modelViewRelativeToEye * posRelativeToEye3D).xyz; vec3 startEC = (czm_modelViewRelativeToEye * posRelativeToEye).xyz; // Start plane vec4 startPlane2D; vec4 startPlane3D; startPlane2D.xyz = czm_normal * vec3(0.0, startEndNormals2D.xy); startPlane3D.xyz = czm_normal * startNormalAndForwardOffsetZ.xyz; startPlane2D.w = -dot(startPlane2D.xyz, posEc2D); startPlane3D.w = -dot(startPlane3D.xyz, posEc3D); // Right plane vec4 rightPlane2D; vec4 rightPlane3D; rightPlane2D.xyz = czm_normal * vec3(0.0, offsetAndRight2D.zw); rightPlane3D.xyz = czm_normal * rightNormalAndTextureCoordinateNormalizationY.xyz; rightPlane2D.w = -dot(rightPlane2D.xyz, posEc2D); rightPlane3D.w = -dot(rightPlane3D.xyz, posEc3D); // End position posRelativeToEye2D = posRelativeToEye2D + vec4(0.0, offsetAndRight2D.xy, 0.0); posRelativeToEye3D = posRelativeToEye3D + vec4(startHiAndForwardOffsetX.w, startLoAndForwardOffsetY.w, startNormalAndForwardOffsetZ.w, 0.0); posRelativeToEye = czm_columbusViewMorph(posRelativeToEye2D, posRelativeToEye3D, czm_morphTime); posEc2D = (czm_modelViewRelativeToEye * posRelativeToEye2D).xyz; posEc3D = (czm_modelViewRelativeToEye * posRelativeToEye3D).xyz; vec3 endEC = (czm_modelViewRelativeToEye * posRelativeToEye).xyz; vec3 forwardEc3D = czm_normal * normalize(vec3(startHiAndForwardOffsetX.w, startLoAndForwardOffsetY.w, startNormalAndForwardOffsetZ.w)); vec3 forwardEc2D = czm_normal * normalize(vec3(0.0, offsetAndRight2D.xy)); // End plane vec4 endPlane2D; vec4 endPlane3D; endPlane2D.xyz = czm_normal * vec3(0.0, startEndNormals2D.zw); endPlane3D.xyz = czm_normal * endNormalAndTextureCoordinateNormalizationX.xyz; endPlane2D.w = -dot(endPlane2D.xyz, posEc2D); endPlane3D.w = -dot(endPlane3D.xyz, posEc3D); // Forward direction v_forwardDirectionEC = normalize(endEC - startEC); vec2 cleanTexcoordNormalization2D; cleanTexcoordNormalization2D.x = abs(texcoordNormalization2D.x); cleanTexcoordNormalization2D.y = czm_branchFreeTernary(texcoordNormalization2D.y > 1.0, 0.0, abs(texcoordNormalization2D.y)); vec2 cleanTexcoordNormalization3D; cleanTexcoordNormalization3D.x = abs(endNormalAndTextureCoordinateNormalizationX.w); cleanTexcoordNormalization3D.y = rightNormalAndTextureCoordinateNormalizationY.w; cleanTexcoordNormalization3D.y = czm_branchFreeTernary(cleanTexcoordNormalization3D.y > 1.0, 0.0, abs(cleanTexcoordNormalization3D.y)); v_texcoordNormalizationAndHalfWidth.xy = mix(cleanTexcoordNormalization2D, cleanTexcoordNormalization3D, czm_morphTime); #ifdef PER_INSTANCE_COLOR v_color = czm_batchTable_color(batchId); #else // PER_INSTANCE_COLOR // For computing texture coordinates v_alignedPlaneDistances.x = -dot(v_forwardDirectionEC, startEC); v_alignedPlaneDistances.y = -dot(-v_forwardDirectionEC, endEC); #endif // PER_INSTANCE_COLOR #ifdef WIDTH_VARYING float width = czm_batchTable_width(batchId); float halfWidth = width * 0.5; v_width = width; v_texcoordNormalizationAndHalfWidth.z = halfWidth; #else float halfWidth = 0.5 * czm_batchTable_width(batchId); v_texcoordNormalizationAndHalfWidth.z = halfWidth; #endif // Compute a normal along which to "push" the position out, extending the miter depending on view distance. // Position has already been "pushed" by unit length along miter normal, and miter normals are encoded in the planes. // Decode the normal to use at this specific vertex, push the position back, and then push to where it needs to be. // Since this is morphing, compute both 3D and 2D positions and then blend. // ****** 3D ****** // Check distance to the end plane and start plane, pick the plane that is closer vec4 positionEc3D = czm_modelViewRelativeToEye * czm_translateRelativeToEye(position3DHigh, position3DLow); // w = 1.0, see czm_computePosition float absStartPlaneDistance = abs(czm_planeDistance(startPlane3D, positionEc3D.xyz)); float absEndPlaneDistance = abs(czm_planeDistance(endPlane3D, positionEc3D.xyz)); vec3 planeDirection = czm_branchFreeTernary(absStartPlaneDistance < absEndPlaneDistance, startPlane3D.xyz, endPlane3D.xyz); vec3 upOrDown = normalize(cross(rightPlane3D.xyz, planeDirection)); // Points "up" for start plane, "down" at end plane. vec3 normalEC = normalize(cross(planeDirection, upOrDown)); // In practice, the opposite seems to work too. // Nudge the top vertex upwards to prevent flickering vec3 geodeticSurfaceNormal = normalize(cross(normalEC, forwardEc3D)); geodeticSurfaceNormal *= float(0.0 <= rightNormalAndTextureCoordinateNormalizationY.w && rightNormalAndTextureCoordinateNormalizationY.w <= 1.0); geodeticSurfaceNormal *= MAX_TERRAIN_HEIGHT; positionEc3D.xyz += geodeticSurfaceNormal; // Determine if this vertex is on the "left" or "right" normalEC *= sign(endNormalAndTextureCoordinateNormalizationX.w); // A "perfect" implementation would push along normals according to the angle against forward. // In practice, just pushing the normal out by halfWidth is sufficient for morph views. positionEc3D.xyz += halfWidth * max(0.0, czm_metersPerPixel(positionEc3D)) * normalEC; // prevent artifacts when czm_metersPerPixel is negative (behind camera) // ****** 2D ****** // Check distance to the end plane and start plane, pick the plane that is closer vec4 positionEc2D = czm_modelViewRelativeToEye * czm_translateRelativeToEye(position2DHigh.zxy, position2DLow.zxy); // w = 1.0, see czm_computePosition absStartPlaneDistance = abs(czm_planeDistance(startPlane2D, positionEc2D.xyz)); absEndPlaneDistance = abs(czm_planeDistance(endPlane2D, positionEc2D.xyz)); planeDirection = czm_branchFreeTernary(absStartPlaneDistance < absEndPlaneDistance, startPlane2D.xyz, endPlane2D.xyz); upOrDown = normalize(cross(rightPlane2D.xyz, planeDirection)); // Points "up" for start plane, "down" at end plane. normalEC = normalize(cross(planeDirection, upOrDown)); // In practice, the opposite seems to work too. // Nudge the top vertex upwards to prevent flickering geodeticSurfaceNormal = normalize(cross(normalEC, forwardEc2D)); geodeticSurfaceNormal *= float(0.0 <= texcoordNormalization2D.y && texcoordNormalization2D.y <= 1.0); geodeticSurfaceNormal *= MAX_TERRAIN_HEIGHT; positionEc2D.xyz += geodeticSurfaceNormal; // Determine if this vertex is on the "left" or "right" normalEC *= sign(texcoordNormalization2D.x); #ifndef PER_INSTANCE_COLOR // Use vertex's sidedness to compute its texture coordinate. v_texcoordT = clamp(sign(texcoordNormalization2D.x), 0.0, 1.0); #endif // A "perfect" implementation would push along normals according to the angle against forward. // In practice, just pushing the normal out by halfWidth is sufficient for morph views. positionEc2D.xyz += halfWidth * max(0.0, czm_metersPerPixel(positionEc2D)) * normalEC; // prevent artifacts when czm_metersPerPixel is negative (behind camera) // Blend for actual position gl_Position = czm_projection * mix(positionEc2D, positionEc3D, czm_morphTime); #ifdef ANGLE_VARYING // Approximate relative screen space direction of the line. vec2 approxLineDirection = normalize(vec2(v_forwardDirectionEC.x, -v_forwardDirectionEC.y)); approxLineDirection.y = czm_branchFreeTernary(approxLineDirection.x == 0.0 && approxLineDirection.y == 0.0, -1.0, approxLineDirection.y); v_polylineAngle = czm_fastApproximateAtan(approxLineDirection.x, approxLineDirection.y); #endif } `;var S4t=T(S(),1),iI=`in vec3 position3DHigh; in vec3 position3DLow; // In 2D and in 3D, texture coordinate normalization component signs encodes: // * X sign - sidedness relative to right plane // * Y sign - is negative OR magnitude is greater than 1.0 if vertex is on bottom of volume #ifndef COLUMBUS_VIEW_2D in vec4 startHiAndForwardOffsetX; in vec4 startLoAndForwardOffsetY; in vec4 startNormalAndForwardOffsetZ; in vec4 endNormalAndTextureCoordinateNormalizationX; in vec4 rightNormalAndTextureCoordinateNormalizationY; #else in vec4 startHiLo2D; in vec4 offsetAndRight2D; in vec4 startEndNormals2D; in vec2 texcoordNormalization2D; #endif in float batchId; out vec4 v_startPlaneNormalEcAndHalfWidth; out vec4 v_endPlaneNormalEcAndBatchId; out vec4 v_rightPlaneEC; out vec4 v_endEcAndStartEcX; out vec4 v_texcoordNormalizationAndStartEcYZ; // For materials #ifdef WIDTH_VARYING out float v_width; #endif #ifdef ANGLE_VARYING out float v_polylineAngle; #endif #ifdef PER_INSTANCE_COLOR out vec4 v_color; #endif void main() { #ifdef COLUMBUS_VIEW_2D vec3 ecStart = (czm_modelViewRelativeToEye * czm_translateRelativeToEye(vec3(0.0, startHiLo2D.xy), vec3(0.0, startHiLo2D.zw))).xyz; vec3 forwardDirectionEC = czm_normal * vec3(0.0, offsetAndRight2D.xy); vec3 ecEnd = forwardDirectionEC + ecStart; forwardDirectionEC = normalize(forwardDirectionEC); // Right plane v_rightPlaneEC.xyz = czm_normal * vec3(0.0, offsetAndRight2D.zw); v_rightPlaneEC.w = -dot(v_rightPlaneEC.xyz, ecStart); // start plane vec4 startPlaneEC; startPlaneEC.xyz = czm_normal * vec3(0.0, startEndNormals2D.xy); startPlaneEC.w = -dot(startPlaneEC.xyz, ecStart); // end plane vec4 endPlaneEC; endPlaneEC.xyz = czm_normal * vec3(0.0, startEndNormals2D.zw); endPlaneEC.w = -dot(endPlaneEC.xyz, ecEnd); v_texcoordNormalizationAndStartEcYZ.x = abs(texcoordNormalization2D.x); v_texcoordNormalizationAndStartEcYZ.y = texcoordNormalization2D.y; #else // COLUMBUS_VIEW_2D vec3 ecStart = (czm_modelViewRelativeToEye * czm_translateRelativeToEye(startHiAndForwardOffsetX.xyz, startLoAndForwardOffsetY.xyz)).xyz; vec3 offset = czm_normal * vec3(startHiAndForwardOffsetX.w, startLoAndForwardOffsetY.w, startNormalAndForwardOffsetZ.w); vec3 ecEnd = ecStart + offset; vec3 forwardDirectionEC = normalize(offset); // start plane vec4 startPlaneEC; startPlaneEC.xyz = czm_normal * startNormalAndForwardOffsetZ.xyz; startPlaneEC.w = -dot(startPlaneEC.xyz, ecStart); // end plane vec4 endPlaneEC; endPlaneEC.xyz = czm_normal * endNormalAndTextureCoordinateNormalizationX.xyz; endPlaneEC.w = -dot(endPlaneEC.xyz, ecEnd); // Right plane v_rightPlaneEC.xyz = czm_normal * rightNormalAndTextureCoordinateNormalizationY.xyz; v_rightPlaneEC.w = -dot(v_rightPlaneEC.xyz, ecStart); v_texcoordNormalizationAndStartEcYZ.x = abs(endNormalAndTextureCoordinateNormalizationX.w); v_texcoordNormalizationAndStartEcYZ.y = rightNormalAndTextureCoordinateNormalizationY.w; #endif // COLUMBUS_VIEW_2D v_endEcAndStartEcX.xyz = ecEnd; v_endEcAndStartEcX.w = ecStart.x; v_texcoordNormalizationAndStartEcYZ.zw = ecStart.yz; #ifdef PER_INSTANCE_COLOR v_color = czm_batchTable_color(batchId); #endif // PER_INSTANCE_COLOR // Compute a normal along which to "push" the position out, extending the miter depending on view distance. // Position has already been "pushed" by unit length along miter normal, and miter normals are encoded in the planes. // Decode the normal to use at this specific vertex, push the position back, and then push to where it needs to be. vec4 positionRelativeToEye = czm_computePosition(); // Check distance to the end plane and start plane, pick the plane that is closer vec4 positionEC = czm_modelViewRelativeToEye * positionRelativeToEye; // w = 1.0, see czm_computePosition float absStartPlaneDistance = abs(czm_planeDistance(startPlaneEC, positionEC.xyz)); float absEndPlaneDistance = abs(czm_planeDistance(endPlaneEC, positionEC.xyz)); vec3 planeDirection = czm_branchFreeTernary(absStartPlaneDistance < absEndPlaneDistance, startPlaneEC.xyz, endPlaneEC.xyz); vec3 upOrDown = normalize(cross(v_rightPlaneEC.xyz, planeDirection)); // Points "up" for start plane, "down" at end plane. vec3 normalEC = normalize(cross(planeDirection, upOrDown)); // In practice, the opposite seems to work too. // Extrude bottom vertices downward for far view distances, like for GroundPrimitives upOrDown = cross(forwardDirectionEC, normalEC); upOrDown = float(czm_sceneMode == czm_sceneMode3D) * upOrDown; upOrDown = float(v_texcoordNormalizationAndStartEcYZ.y > 1.0 || v_texcoordNormalizationAndStartEcYZ.y < 0.0) * upOrDown; upOrDown = min(GLOBE_MINIMUM_ALTITUDE, czm_geometricToleranceOverMeter * length(positionRelativeToEye.xyz)) * upOrDown; positionEC.xyz += upOrDown; v_texcoordNormalizationAndStartEcYZ.y = czm_branchFreeTernary(v_texcoordNormalizationAndStartEcYZ.y > 1.0, 0.0, abs(v_texcoordNormalizationAndStartEcYZ.y)); // Determine distance along normalEC to push for a volume of appropriate width. // Make volumes about double pixel width for a conservative fit - in practice the // extra cost here is minimal compared to the loose volume heights. // // N = normalEC (guaranteed "right-facing") // R = rightEC // p = angle between N and R // w = distance to push along R if R == N // d = distance to push along N // // N R // { p| } * cos(p) = dot(N, R) = w / d // d | |w * d = w / dot(N, R) // { | } // o---------- polyline segment ----> // float width = czm_batchTable_width(batchId); #ifdef WIDTH_VARYING v_width = width; #endif v_startPlaneNormalEcAndHalfWidth.xyz = startPlaneEC.xyz; v_startPlaneNormalEcAndHalfWidth.w = width * 0.5; v_endPlaneNormalEcAndBatchId.xyz = endPlaneEC.xyz; v_endPlaneNormalEcAndBatchId.w = batchId; width = width * max(0.0, czm_metersPerPixel(positionEC)); // width = distance to push along R width = width / dot(normalEC, v_rightPlaneEC.xyz); // width = distance to push along N // Determine if this vertex is on the "left" or "right" #ifdef COLUMBUS_VIEW_2D normalEC *= sign(texcoordNormalization2D.x); #else normalEC *= sign(endNormalAndTextureCoordinateNormalizationX.w); #endif positionEC.xyz += width * normalEC; gl_Position = czm_depthClamp(czm_projection * positionEC); #ifdef ANGLE_VARYING // Approximate relative screen space direction of the line. vec2 approxLineDirection = normalize(vec2(forwardDirectionEC.x, -forwardDirectionEC.y)); approxLineDirection.y = czm_branchFreeTernary(approxLineDirection.x == 0.0 && approxLineDirection.y == 0.0, -1.0, approxLineDirection.y); v_polylineAngle = czm_fastApproximateAtan(approxLineDirection.x, approxLineDirection.y); #endif } `;var w4t=T(S(),1);var V4t=T(S(),1),oI=`in vec3 position3DHigh; in vec3 position3DLow; in vec3 prevPosition3DHigh; in vec3 prevPosition3DLow; in vec3 nextPosition3DHigh; in vec3 nextPosition3DLow; in vec2 expandAndWidth; in vec4 color; in float batchId; out vec4 v_color; void main() { float expandDir = expandAndWidth.x; float width = abs(expandAndWidth.y) + 0.5; bool usePrev = expandAndWidth.y < 0.0; vec4 p = czm_computePosition(); vec4 prev = czm_computePrevPosition(); vec4 next = czm_computeNextPosition(); float angle; vec4 positionWC = getPolylineWindowCoordinates(p, prev, next, expandDir, width, usePrev, angle); gl_Position = czm_viewportOrthographic * positionWC; v_color = color; } `;var R4t=T(S(),1),gd=`void clipLineSegmentToNearPlane( vec3 p0, vec3 p1, out vec4 positionWC, out bool clipped, out bool culledByNearPlane, out vec4 clippedPositionEC) { culledByNearPlane = false; clipped = false; vec3 p0ToP1 = p1 - p0; float magnitude = length(p0ToP1); vec3 direction = normalize(p0ToP1); // Distance that p0 is behind the near plane. Negative means p0 is // in front of the near plane. float endPoint0Distance = czm_currentFrustum.x + p0.z; // Camera looks down -Z. // When moving a point along +Z: LESS VISIBLE // * Points in front of the camera move closer to the camera. // * Points behind the camrea move farther away from the camera. // When moving a point along -Z: MORE VISIBLE // * Points in front of the camera move farther away from the camera. // * Points behind the camera move closer to the camera. // Positive denominator: -Z, becoming more visible // Negative denominator: +Z, becoming less visible // Nearly zero: parallel to near plane float denominator = -direction.z; if (endPoint0Distance > 0.0 && abs(denominator) < czm_epsilon7) { // p0 is behind the near plane and the line to p1 is nearly parallel to // the near plane, so cull the segment completely. culledByNearPlane = true; } else if (endPoint0Distance > 0.0) { // p0 is behind the near plane, and the line to p1 is moving distinctly // toward or away from it. // t = (-plane distance - dot(plane normal, ray origin)) / dot(plane normal, ray direction) float t = endPoint0Distance / denominator; if (t < 0.0 || t > magnitude) { // Near plane intersection is not between the two points. // We already confirmed p0 is behind the naer plane, so now // we know the entire segment is behind it. culledByNearPlane = true; } else { // Segment crosses the near plane, update p0 to lie exactly on it. p0 = p0 + t * direction; // Numerical noise might put us a bit on the wrong side of the near plane. // Don't let that happen. p0.z = min(p0.z, -czm_currentFrustum.x); clipped = true; } } clippedPositionEC = vec4(p0, 1.0); positionWC = czm_eyeToWindowCoordinates(clippedPositionEC); } vec4 getPolylineWindowCoordinatesEC(vec4 positionEC, vec4 prevEC, vec4 nextEC, float expandDirection, float width, bool usePrevious, out float angle) { // expandDirection +1 is to the _left_ when looking from positionEC toward nextEC. #ifdef POLYLINE_DASH // Compute the window coordinates of the points. vec4 positionWindow = czm_eyeToWindowCoordinates(positionEC); vec4 previousWindow = czm_eyeToWindowCoordinates(prevEC); vec4 nextWindow = czm_eyeToWindowCoordinates(nextEC); // Determine the relative screen space direction of the line. vec2 lineDir; if (usePrevious) { lineDir = normalize(positionWindow.xy - previousWindow.xy); } else { lineDir = normalize(nextWindow.xy - positionWindow.xy); } angle = atan(lineDir.x, lineDir.y) - 1.570796327; // precomputed atan(1,0) // Quantize the angle so it doesn't change rapidly between segments. angle = floor(angle / czm_piOverFour + 0.5) * czm_piOverFour; #endif vec4 clippedPrevWC, clippedPrevEC; bool prevSegmentClipped, prevSegmentCulled; clipLineSegmentToNearPlane(prevEC.xyz, positionEC.xyz, clippedPrevWC, prevSegmentClipped, prevSegmentCulled, clippedPrevEC); vec4 clippedNextWC, clippedNextEC; bool nextSegmentClipped, nextSegmentCulled; clipLineSegmentToNearPlane(nextEC.xyz, positionEC.xyz, clippedNextWC, nextSegmentClipped, nextSegmentCulled, clippedNextEC); bool segmentClipped, segmentCulled; vec4 clippedPositionWC, clippedPositionEC; clipLineSegmentToNearPlane(positionEC.xyz, usePrevious ? prevEC.xyz : nextEC.xyz, clippedPositionWC, segmentClipped, segmentCulled, clippedPositionEC); if (segmentCulled) { return vec4(0.0, 0.0, 0.0, 1.0); } vec2 directionToPrevWC = normalize(clippedPrevWC.xy - clippedPositionWC.xy); vec2 directionToNextWC = normalize(clippedNextWC.xy - clippedPositionWC.xy); // If a segment was culled, we can't use the corresponding direction // computed above. We should never see both of these be true without // \`segmentCulled\` above also being true. if (prevSegmentCulled) { directionToPrevWC = -directionToNextWC; } else if (nextSegmentCulled) { directionToNextWC = -directionToPrevWC; } vec2 thisSegmentForwardWC, otherSegmentForwardWC; if (usePrevious) { thisSegmentForwardWC = -directionToPrevWC; otherSegmentForwardWC = directionToNextWC; } else { thisSegmentForwardWC = directionToNextWC; otherSegmentForwardWC = -directionToPrevWC; } vec2 thisSegmentLeftWC = vec2(-thisSegmentForwardWC.y, thisSegmentForwardWC.x); vec2 leftWC = thisSegmentLeftWC; float expandWidth = width * 0.5; // When lines are split at the anti-meridian, the position may be at the // same location as the next or previous position, and we need to handle // that to avoid producing NaNs. if (!czm_equalsEpsilon(prevEC.xyz - positionEC.xyz, vec3(0.0), czm_epsilon1) && !czm_equalsEpsilon(nextEC.xyz - positionEC.xyz, vec3(0.0), czm_epsilon1)) { vec2 otherSegmentLeftWC = vec2(-otherSegmentForwardWC.y, otherSegmentForwardWC.x); vec2 leftSumWC = thisSegmentLeftWC + otherSegmentLeftWC; float leftSumLength = length(leftSumWC); leftWC = leftSumLength < czm_epsilon6 ? thisSegmentLeftWC : (leftSumWC / leftSumLength); // The sine of the angle between the two vectors is given by the formula // |a x b| = |a||b|sin(theta) // which is // float sinAngle = length(cross(vec3(leftWC, 0.0), vec3(-thisSegmentForwardWC, 0.0))); // Because the z components of both vectors are zero, the x and y coordinate will be zero. // Therefore, the sine of the angle is just the z component of the cross product. vec2 u = -thisSegmentForwardWC; vec2 v = leftWC; float sinAngle = abs(u.x * v.y - u.y * v.x); expandWidth = clamp(expandWidth / sinAngle, 0.0, width * 0.5); } vec2 offset = leftWC * expandDirection * expandWidth * czm_pixelRatio; return vec4(clippedPositionWC.xy + offset, -clippedPositionWC.z, 1.0) * (czm_projection * clippedPositionEC).w; } vec4 getPolylineWindowCoordinates(vec4 position, vec4 previous, vec4 next, float expandDirection, float width, bool usePrevious, out float angle) { vec4 positionEC = czm_modelViewRelativeToEye * position; vec4 prevEC = czm_modelViewRelativeToEye * previous; vec4 nextEC = czm_modelViewRelativeToEye * next; return getPolylineWindowCoordinatesEC(positionEC, prevEC, nextEC, expandDirection, width, usePrevious, angle); } `;var iH=`${gd} ${oI}`,s2e=Ix;Ot.isInternetExplorer()||(iH=`#define CLIP_POLYLINE ${iH}`);function Mx(e){e=y(e,y.EMPTY_OBJECT);let t=y(e.translucent,!0),n=!1,i=Mx.VERTEX_FORMAT;this.material=void 0,this.translucent=t,this._vertexShaderSource=y(e.vertexShaderSource,iH),this._fragmentShaderSource=y(e.fragmentShaderSource,s2e),this._renderState=oo.getDefaultRenderState(t,n,e.renderState),this._closed=n,this._vertexFormat=i}Object.defineProperties(Mx.prototype,{vertexShaderSource:{get:function(){return this._vertexShaderSource}},fragmentShaderSource:{get:function(){return this._fragmentShaderSource}},renderState:{get:function(){return this._renderState}},closed:{get:function(){return this._closed}},vertexFormat:{get:function(){return this._vertexFormat}}});Mx.VERTEX_FORMAT=Xe.POSITION_ONLY;Mx.prototype.getFragmentShaderSource=oo.prototype.getFragmentShaderSource;Mx.prototype.isTranslucent=oo.prototype.isTranslucent;Mx.prototype.getRenderState=oo.prototype.getRenderState;var $r=Mx;var Q4t=T(S(),1);var A4t=T(S(),1),rI=`in vec3 position3DHigh; in vec3 position3DLow; in vec3 prevPosition3DHigh; in vec3 prevPosition3DLow; in vec3 nextPosition3DHigh; in vec3 nextPosition3DLow; in vec2 expandAndWidth; in vec2 st; in float batchId; out float v_width; out vec2 v_st; out float v_polylineAngle; void main() { float expandDir = expandAndWidth.x; float width = abs(expandAndWidth.y) + 0.5; bool usePrev = expandAndWidth.y < 0.0; vec4 p = czm_computePosition(); vec4 prev = czm_computePrevPosition(); vec4 next = czm_computeNextPosition(); float angle; vec4 positionWC = getPolylineWindowCoordinates(p, prev, next, expandDir, width, usePrev, angle); gl_Position = czm_viewportOrthographic * positionWC; v_width = width; v_st.s = st.s; v_st.t = czm_writeNonPerspective(st.t, gl_Position.w); v_polylineAngle = angle; } `;var N4t=T(S(),1),Nx=`#ifdef VECTOR_TILE uniform vec4 u_highlightColor; #endif in vec2 v_st; void main() { czm_materialInput materialInput; vec2 st = v_st; st.t = czm_readNonPerspective(st.t, gl_FragCoord.w); materialInput.s = st.s; materialInput.st = st; materialInput.str = vec3(st, 0.0); czm_material material = czm_getMaterial(materialInput); out_FragColor = vec4(material.diffuse + material.emission, material.alpha); #ifdef VECTOR_TILE out_FragColor *= u_highlightColor; #endif czm_writeLogDepth(); } `;var oH=`${gd} ${rI}`,a2e=Nx;Ot.isInternetExplorer()||(oH=`#define CLIP_POLYLINE ${oH}`);function kx(e){e=y(e,y.EMPTY_OBJECT);let t=y(e.translucent,!0),n=!1,i=kx.VERTEX_FORMAT;this.material=l(e.material)?e.material:Ji.fromType(Ji.ColorType),this.translucent=t,this._vertexShaderSource=y(e.vertexShaderSource,oH),this._fragmentShaderSource=y(e.fragmentShaderSource,a2e),this._renderState=oo.getDefaultRenderState(t,n,e.renderState),this._closed=n,this._vertexFormat=i}Object.defineProperties(kx.prototype,{vertexShaderSource:{get:function(){let e=this._vertexShaderSource;return this.material.shaderSource.search(/in\s+float\s+v_polylineAngle;/g)!==-1&&(e=`#define POLYLINE_DASH ${e}`),e}},fragmentShaderSource:{get:function(){return this._fragmentShaderSource}},renderState:{get:function(){return this._renderState}},closed:{get:function(){return this._closed}},vertexFormat:{get:function(){return this._vertexFormat}}});kx.VERTEX_FORMAT=Xe.POSITION_AND_ST;kx.prototype.getFragmentShaderSource=oo.prototype.getFragmentShaderSource;kx.prototype.isTranslucent=oo.prototype.isTranslucent;kx.prototype.getRenderState=oo.prototype.getRenderState;var ba=kx;function Bp(e){e=y(e,y.EMPTY_OBJECT),this.geometryInstances=e.geometryInstances,this._hasPerInstanceColors=!0;let t=e.appearance;l(t)||(t=new ba),this.appearance=t,this.show=y(e.show,!0),this.classificationType=y(e.classificationType,Bn.BOTH),this.debugShowBoundingVolume=y(e.debugShowBoundingVolume,!1),this._debugShowShadowVolume=y(e.debugShowShadowVolume,!1),this._primitiveOptions={geometryInstances:void 0,appearance:void 0,vertexCacheOptimize:!1,interleave:y(e.interleave,!1),releaseGeometryInstances:y(e.releaseGeometryInstances,!0),allowPicking:y(e.allowPicking,!0),asynchronous:y(e.asynchronous,!0),compressVertices:!1,_createShaderProgramFunction:void 0,_createCommandsFunction:void 0,_updateAndQueueCommandsFunction:void 0},this._zIndex=void 0,this._ready=!1,this._primitive=void 0,this._sp=void 0,this._sp2D=void 0,this._spMorph=void 0,this._renderState=yie(!1),this._renderState3DTiles=yie(!0),this._renderStateMorph=Ue.fromCache({cull:{enabled:!0,face:_i.FRONT},depthTest:{enabled:!0},blending:hn.PRE_MULTIPLIED_ALPHA_BLEND,depthMask:!1})}Object.defineProperties(Bp.prototype,{interleave:{get:function(){return this._primitiveOptions.interleave}},releaseGeometryInstances:{get:function(){return this._primitiveOptions.releaseGeometryInstances}},allowPicking:{get:function(){return this._primitiveOptions.allowPicking}},asynchronous:{get:function(){return this._primitiveOptions.asynchronous}},ready:{get:function(){return this._ready}},debugShowShadowVolume:{get:function(){return this._debugShowShadowVolume}}});Bp.initializeTerrainHeights=function(){return mi.initialize()};function c2e(e,t,n){let i=t.context,o=e._primitive,r=o._attributeLocations,s=o._batchTable.getVertexShaderCallback()(iI);s=Xn._appendShowToShader(o,s),s=Xn._appendDistanceDisplayConditionToShader(o,s),s=Xn._modifyShaderPosition(e,s,t.scene3DOnly);let a=o._batchTable.getVertexShaderCallback()(nI);a=Xn._appendShowToShader(o,a),a=Xn._appendDistanceDisplayConditionToShader(o,a),a=Xn._modifyShaderPosition(e,a,t.scene3DOnly);let c=o._batchTable.getVertexShaderCallback()(eI),d=[`GLOBE_MINIMUM_ALTITUDE ${t.mapProjection.ellipsoid.minimumRadius.toFixed(1)}`],u="",h="";l(n.material)?(h=l(n.material)?n.material.shaderSource:"",h.search(/in\s+float\s+v_polylineAngle;/g)!==-1&&d.push("ANGLE_VARYING"),h.search(/in\s+float\s+v_width;/g)!==-1&&d.push("WIDTH_VARYING")):u="PER_INSTANCE_COLOR",d.push(u);let p=e.debugShowShadowVolume?["DEBUG_SHOW_VOLUME",u]:[u],g=new De({defines:d,sources:[s]}),f=new De({defines:p,sources:[h,c]});e._sp=en.replaceCache({context:i,shaderProgram:o._sp,vertexShaderSource:g,fragmentShaderSource:f,attributeLocations:r});let x=i.shaderCache.getDerivedShaderProgram(e._sp,"2dColor");if(!l(x)){let C=new De({defines:d.concat(["COLUMBUS_VIEW_2D"]),sources:[s]});x=i.shaderCache.createDerivedShaderProgram(e._sp,"2dColor",{context:i,shaderProgram:e._sp2D,vertexShaderSource:C,fragmentShaderSource:f,attributeLocations:r})}e._sp2D=x;let _=i.shaderCache.getDerivedShaderProgram(e._sp,"MorphColor");if(!l(_)){let C=new De({defines:d.concat([`MAX_TERRAIN_HEIGHT ${mi._defaultMaxTerrainHeight.toFixed(1)}`]),sources:[a]});c=o._batchTable.getVertexShaderCallback()(tI);let V=new De({defines:p,sources:[h,c]});_=i.shaderCache.createDerivedShaderProgram(e._sp,"MorphColor",{context:i,shaderProgram:e._spMorph,vertexShaderSource:C,fragmentShaderSource:V,attributeLocations:r})}e._spMorph=_}function yie(e){return Ue.fromCache({cull:{enabled:!0},blending:hn.PRE_MULTIPLIED_ALPHA_BLEND,depthMask:!1,stencilTest:{enabled:e,frontFunction:On.EQUAL,frontOperation:{fail:ft.KEEP,zFail:ft.KEEP,zPass:ft.KEEP},backFunction:On.EQUAL,backOperation:{fail:ft.KEEP,zFail:ft.KEEP,zPass:ft.KEEP},reference:Dt.CESIUM_3D_TILE_MASK,mask:Dt.CESIUM_3D_TILE_MASK}})}function l2e(e,t,n,i,o,r){let s=e._primitive,a=s._va.length;o.length=a,r.length=a;let d=t instanceof $r?{}:n._uniforms,u=s._batchTable.getUniformMapCallback()(d);for(let h=0;h{!this._ready&&l(this._primitive)&&this._primitive.ready&&(this._ready=!0,this.releaseGeometryInstances&&(this.geometryInstances=void 0))})};Bp.prototype.getGeometryInstanceAttributes=function(e){return this._primitive.getGeometryInstanceAttributes(e)};Bp.isSupported=function(e){return e.frameState.context.depthTexture};Bp.prototype.isDestroyed=function(){return!1};Bp.prototype.destroy=function(){return this._primitive=this._primitive&&this._primitive.destroy(),this._sp=this._sp&&this._sp.destroy(),this._sp2D=void 0,this._spMorph=void 0,me(this)};var Nm=Bp;var Qjt=T(S(),1);var Bjt=T(S(),1);var Fjt=T(S(),1);var u2e=new D(1,1),m2e=!1,h2e=B.WHITE;function VC(e){e=y(e,y.EMPTY_OBJECT),this._definitionChanged=new be,this._image=void 0,this._imageSubscription=void 0,this._repeat=void 0,this._repeatSubscription=void 0,this._color=void 0,this._colorSubscription=void 0,this._transparent=void 0,this._transparentSubscription=void 0,this.image=e.image,this.repeat=e.repeat,this.color=e.color,this.transparent=e.transparent}Object.defineProperties(VC.prototype,{isConstant:{get:function(){return J.isConstant(this._image)&&J.isConstant(this._repeat)}},definitionChanged:{get:function(){return this._definitionChanged}},image:ue("image"),repeat:ue("repeat"),color:ue("color"),transparent:ue("transparent")});VC.prototype.getType=function(e){return"Image"};var f2e=new q;VC.prototype.getValue=function(e,t){return l(e)||(e=q.now(f2e)),l(t)||(t={}),t.image=J.getValueOrUndefined(this._image,e),t.repeat=J.getValueOrClonedDefault(this._repeat,e,u2e,t.repeat),t.color=J.getValueOrClonedDefault(this._color,e,h2e,t.color),J.getValueOrDefault(this._transparent,e,m2e)&&(t.color.alpha=Math.min(.99,t.color.alpha)),t};VC.prototype.equals=function(e){return this===e||e instanceof VC&&J.equals(this._image,e._image)&&J.equals(this._repeat,e._repeat)&&J.equals(this._color,e._color)&&J.equals(this._transparent,e._transparent)};var ig=VC;function p2e(e){if(e instanceof B)return new Bt(e);if(typeof e=="string"||e instanceof Re||e instanceof HTMLCanvasElement||e instanceof HTMLVideoElement){let t=new ig;return t.image=e,t}}function b2e(e,t){return ue(e,t,p2e)}var vo=b2e;function sI(e){this._definitionChanged=new be,this._show=void 0,this._showSubscription=void 0,this._dimensions=void 0,this._dimensionsSubscription=void 0,this._heightReference=void 0,this._heightReferenceSubscription=void 0,this._fill=void 0,this._fillSubscription=void 0,this._material=void 0,this._materialSubscription=void 0,this._outline=void 0,this._outlineSubscription=void 0,this._outlineColor=void 0,this._outlineColorSubscription=void 0,this._outlineWidth=void 0,this._outlineWidthSubscription=void 0,this._shadows=void 0,this._shadowsSubscription=void 0,this._distanceDisplayCondition=void 0,this._distanceDisplayConditionSubscription=void 0,this.merge(y(e,y.EMPTY_OBJECT))}Object.defineProperties(sI.prototype,{definitionChanged:{get:function(){return this._definitionChanged}},show:ue("show"),dimensions:ue("dimensions"),heightReference:ue("heightReference"),fill:ue("fill"),material:vo("material"),outline:ue("outline"),outlineColor:ue("outlineColor"),outlineWidth:ue("outlineWidth"),shadows:ue("shadows"),distanceDisplayCondition:ue("distanceDisplayCondition")});sI.prototype.clone=function(e){return l(e)?(e.show=this.show,e.dimensions=this.dimensions,e.heightReference=this.heightReference,e.fill=this.fill,e.material=this.material,e.outline=this.outline,e.outlineColor=this.outlineColor,e.outlineWidth=this.outlineWidth,e.shadows=this.shadows,e.distanceDisplayCondition=this.distanceDisplayCondition,e):new sI(this)};sI.prototype.merge=function(e){this.show=y(this.show,e.show),this.dimensions=y(this.dimensions,e.dimensions),this.heightReference=y(this.heightReference,e.heightReference),this.fill=y(this.fill,e.fill),this.material=y(this.material,e.material),this.outline=y(this.outline,e.outline),this.outlineColor=y(this.outlineColor,e.outlineColor),this.outlineWidth=y(this.outlineWidth,e.outlineWidth),this.shadows=y(this.shadows,e.shadows),this.distanceDisplayCondition=y(this.distanceDisplayCondition,e.distanceDisplayCondition)};var Ux=sI;var p8t=T(S(),1);var qjt=T(S(),1),g2e={FIXED:0,INERTIAL:1},Di=Object.freeze(g2e);var s8t=T(S(),1);function LC(){fe.throwInstantiationError()}Object.defineProperties(LC.prototype,{isConstant:{get:fe.throwInstantiationError},definitionChanged:{get:fe.throwInstantiationError},referenceFrame:{get:fe.throwInstantiationError}});LC.prototype.getValue=fe.throwInstantiationError;LC.prototype.getValueInReferenceFrame=fe.throwInstantiationError;LC.prototype.equals=fe.throwInstantiationError;var _ie=new $;LC.convertToReferenceFrame=function(e,t,n,i,o){if(!l(t))return t;if(l(o)||(o=new m),n===i)return m.clone(t,o);let r=wt.computeIcrfToCentralBodyFixedMatrix(e,_ie);if(n===Di.INERTIAL)return $.multiplyByVector(r,t,o);if(n===Di.FIXED)return $.multiplyByVector($.transpose(r,_ie),t,o)};var km=LC;function Dx(e,t){this._definitionChanged=new be,this._value=m.clone(e),this._referenceFrame=y(t,Di.FIXED)}Object.defineProperties(Dx.prototype,{isConstant:{get:function(){return!l(this._value)||this._referenceFrame===Di.FIXED}},definitionChanged:{get:function(){return this._definitionChanged}},referenceFrame:{get:function(){return this._referenceFrame}}});var y2e=new q;Dx.prototype.getValue=function(e,t){return l(e)||(e=q.now(y2e)),this.getValueInReferenceFrame(e,Di.FIXED,t)};Dx.prototype.setValue=function(e,t){let n=!1;m.equals(this._value,e)||(n=!0,this._value=m.clone(e)),l(t)&&this._referenceFrame!==t&&(n=!0,this._referenceFrame=t),n&&this._definitionChanged.raiseEvent(this)};Dx.prototype.getValueInReferenceFrame=function(e,t,n){return km.convertToReferenceFrame(e,this._value,this._referenceFrame,t,n)};Dx.prototype.equals=function(e){return this===e||e instanceof Dx&&m.equals(this._value,e._value)&&this._referenceFrame===e._referenceFrame};var Dc=Dx;var S8t=T(S(),1);function aI(e){this._definitionChanged=new be,this._show=void 0,this._showSubscription=void 0,this._positions=void 0,this._positionsSubscription=void 0,this._width=void 0,this._widthSubscription=void 0,this._height=void 0,this._heightSubscription=void 0,this._heightReference=void 0,this._heightReferenceSubscription=void 0,this._extrudedHeight=void 0,this._extrudedHeightSubscription=void 0,this._extrudedHeightReference=void 0,this._extrudedHeightReferenceSubscription=void 0,this._cornerType=void 0,this._cornerTypeSubscription=void 0,this._granularity=void 0,this._granularitySubscription=void 0,this._fill=void 0,this._fillSubscription=void 0,this._material=void 0,this._materialSubscription=void 0,this._outline=void 0,this._outlineSubscription=void 0,this._outlineColor=void 0,this._outlineColorSubscription=void 0,this._outlineWidth=void 0,this._outlineWidthSubscription=void 0,this._shadows=void 0,this._shadowsSubscription=void 0,this._distanceDisplayCondition=void 0,this._distanceDisplayConditionSubscription=void 0,this._classificationType=void 0,this._classificationTypeSubscription=void 0,this._zIndex=void 0,this._zIndexSubscription=void 0,this.merge(y(e,y.EMPTY_OBJECT))}Object.defineProperties(aI.prototype,{definitionChanged:{get:function(){return this._definitionChanged}},show:ue("show"),positions:ue("positions"),width:ue("width"),height:ue("height"),heightReference:ue("heightReference"),extrudedHeight:ue("extrudedHeight"),extrudedHeightReference:ue("extrudedHeightReference"),cornerType:ue("cornerType"),granularity:ue("granularity"),fill:ue("fill"),material:vo("material"),outline:ue("outline"),outlineColor:ue("outlineColor"),outlineWidth:ue("outlineWidth"),shadows:ue("shadows"),distanceDisplayCondition:ue("distanceDisplayCondition"),classificationType:ue("classificationType"),zIndex:ue("zIndex")});aI.prototype.clone=function(e){return l(e)?(e.show=this.show,e.positions=this.positions,e.width=this.width,e.height=this.height,e.heightReference=this.heightReference,e.extrudedHeight=this.extrudedHeight,e.extrudedHeightReference=this.extrudedHeightReference,e.cornerType=this.cornerType,e.granularity=this.granularity,e.fill=this.fill,e.material=this.material,e.outline=this.outline,e.outlineColor=this.outlineColor,e.outlineWidth=this.outlineWidth,e.shadows=this.shadows,e.distanceDisplayCondition=this.distanceDisplayCondition,e.classificationType=this.classificationType,e.zIndex=this.zIndex,e):new aI(this)};aI.prototype.merge=function(e){this.show=y(this.show,e.show),this.positions=y(this.positions,e.positions),this.width=y(this.width,e.width),this.height=y(this.height,e.height),this.heightReference=y(this.heightReference,e.heightReference),this.extrudedHeight=y(this.extrudedHeight,e.extrudedHeight),this.extrudedHeightReference=y(this.extrudedHeightReference,e.extrudedHeightReference),this.cornerType=y(this.cornerType,e.cornerType),this.granularity=y(this.granularity,e.granularity),this.fill=y(this.fill,e.fill),this.material=y(this.material,e.material),this.outline=y(this.outline,e.outline),this.outlineColor=y(this.outlineColor,e.outlineColor),this.outlineWidth=y(this.outlineWidth,e.outlineWidth),this.shadows=y(this.shadows,e.shadows),this.distanceDisplayCondition=y(this.distanceDisplayCondition,e.distanceDisplayCondition),this.classificationType=y(this.classificationType,e.classificationType),this.zIndex=y(this.zIndex,e.zIndex)};var Bx=aI;var L8t=T(S(),1);function x2e(e){return e}function _2e(e,t){return ue(e,t,x2e)}var Bc=_2e;var W8t=T(S(),1);function cI(e){this._definitionChanged=new be,this._show=void 0,this._showSubscription=void 0,this._length=void 0,this._lengthSubscription=void 0,this._topRadius=void 0,this._topRadiusSubscription=void 0,this._bottomRadius=void 0,this._bottomRadiusSubscription=void 0,this._heightReference=void 0,this._heightReferenceSubscription=void 0,this._fill=void 0,this._fillSubscription=void 0,this._material=void 0,this._materialSubscription=void 0,this._outline=void 0,this._outlineSubscription=void 0,this._outlineColor=void 0,this._outlineColorSubscription=void 0,this._outlineWidth=void 0,this._outlineWidthSubscription=void 0,this._numberOfVerticalLines=void 0,this._numberOfVerticalLinesSubscription=void 0,this._slices=void 0,this._slicesSubscription=void 0,this._shadows=void 0,this._shadowsSubscription=void 0,this._distanceDisplayCondition=void 0,this._distanceDisplayConditionSubscription=void 0,this.merge(y(e,y.EMPTY_OBJECT))}Object.defineProperties(cI.prototype,{definitionChanged:{get:function(){return this._definitionChanged}},show:ue("show"),length:ue("length"),topRadius:ue("topRadius"),bottomRadius:ue("bottomRadius"),heightReference:ue("heightReference"),fill:ue("fill"),material:vo("material"),outline:ue("outline"),outlineColor:ue("outlineColor"),outlineWidth:ue("outlineWidth"),numberOfVerticalLines:ue("numberOfVerticalLines"),slices:ue("slices"),shadows:ue("shadows"),distanceDisplayCondition:ue("distanceDisplayCondition")});cI.prototype.clone=function(e){return l(e)?(e.show=this.show,e.length=this.length,e.topRadius=this.topRadius,e.bottomRadius=this.bottomRadius,e.heightReference=this.heightReference,e.fill=this.fill,e.material=this.material,e.outline=this.outline,e.outlineColor=this.outlineColor,e.outlineWidth=this.outlineWidth,e.numberOfVerticalLines=this.numberOfVerticalLines,e.slices=this.slices,e.shadows=this.shadows,e.distanceDisplayCondition=this.distanceDisplayCondition,e):new cI(this)};cI.prototype.merge=function(e){this.show=y(this.show,e.show),this.length=y(this.length,e.length),this.topRadius=y(this.topRadius,e.topRadius),this.bottomRadius=y(this.bottomRadius,e.bottomRadius),this.heightReference=y(this.heightReference,e.heightReference),this.fill=y(this.fill,e.fill),this.material=y(this.material,e.material),this.outline=y(this.outline,e.outline),this.outlineColor=y(this.outlineColor,e.outlineColor),this.outlineWidth=y(this.outlineWidth,e.outlineWidth),this.numberOfVerticalLines=y(this.numberOfVerticalLines,e.numberOfVerticalLines),this.slices=y(this.slices,e.slices),this.shadows=y(this.shadows,e.shadows),this.distanceDisplayCondition=y(this.distanceDisplayCondition,e.distanceDisplayCondition)};var Ox=cI;var N8t=T(S(),1);function lI(e){this._definitionChanged=new be,this._show=void 0,this._showSubscription=void 0,this._semiMajorAxis=void 0,this._semiMajorAxisSubscription=void 0,this._semiMinorAxis=void 0,this._semiMinorAxisSubscription=void 0,this._height=void 0,this._heightSubscription=void 0,this._heightReference=void 0,this._heightReferenceSubscription=void 0,this._extrudedHeight=void 0,this._extrudedHeightSubscription=void 0,this._extrudedHeightReference=void 0,this._extrudedHeightReferenceSubscription=void 0,this._rotation=void 0,this._rotationSubscription=void 0,this._stRotation=void 0,this._stRotationSubscription=void 0,this._granularity=void 0,this._granularitySubscription=void 0,this._fill=void 0,this._fillSubscription=void 0,this._material=void 0,this._materialSubscription=void 0,this._outline=void 0,this._outlineSubscription=void 0,this._outlineColor=void 0,this._outlineColorSubscription=void 0,this._outlineWidth=void 0,this._outlineWidthSubscription=void 0,this._numberOfVerticalLines=void 0,this._numberOfVerticalLinesSubscription=void 0,this._shadows=void 0,this._shadowsSubscription=void 0,this._distanceDisplayCondition=void 0,this._distanceDisplayConditionSubscription=void 0,this._classificationType=void 0,this._classificationTypeSubscription=void 0,this._zIndex=void 0,this._zIndexSubscription=void 0,this.merge(y(e,y.EMPTY_OBJECT))}Object.defineProperties(lI.prototype,{definitionChanged:{get:function(){return this._definitionChanged}},show:ue("show"),semiMajorAxis:ue("semiMajorAxis"),semiMinorAxis:ue("semiMinorAxis"),height:ue("height"),heightReference:ue("heightReference"),extrudedHeight:ue("extrudedHeight"),extrudedHeightReference:ue("extrudedHeightReference"),rotation:ue("rotation"),stRotation:ue("stRotation"),granularity:ue("granularity"),fill:ue("fill"),material:vo("material"),outline:ue("outline"),outlineColor:ue("outlineColor"),outlineWidth:ue("outlineWidth"),numberOfVerticalLines:ue("numberOfVerticalLines"),shadows:ue("shadows"),distanceDisplayCondition:ue("distanceDisplayCondition"),classificationType:ue("classificationType"),zIndex:ue("zIndex")});lI.prototype.clone=function(e){return l(e)?(e.show=this.show,e.semiMajorAxis=this.semiMajorAxis,e.semiMinorAxis=this.semiMinorAxis,e.height=this.height,e.heightReference=this.heightReference,e.extrudedHeight=this.extrudedHeight,e.extrudedHeightReference=this.extrudedHeightReference,e.rotation=this.rotation,e.stRotation=this.stRotation,e.granularity=this.granularity,e.fill=this.fill,e.material=this.material,e.outline=this.outline,e.outlineColor=this.outlineColor,e.outlineWidth=this.outlineWidth,e.numberOfVerticalLines=this.numberOfVerticalLines,e.shadows=this.shadows,e.distanceDisplayCondition=this.distanceDisplayCondition,e.classificationType=this.classificationType,e.zIndex=this.zIndex,e):new lI(this)};lI.prototype.merge=function(e){this.show=y(this.show,e.show),this.semiMajorAxis=y(this.semiMajorAxis,e.semiMajorAxis),this.semiMinorAxis=y(this.semiMinorAxis,e.semiMinorAxis),this.height=y(this.height,e.height),this.heightReference=y(this.heightReference,e.heightReference),this.extrudedHeight=y(this.extrudedHeight,e.extrudedHeight),this.extrudedHeightReference=y(this.extrudedHeightReference,e.extrudedHeightReference),this.rotation=y(this.rotation,e.rotation),this.stRotation=y(this.stRotation,e.stRotation),this.granularity=y(this.granularity,e.granularity),this.fill=y(this.fill,e.fill),this.material=y(this.material,e.material),this.outline=y(this.outline,e.outline),this.outlineColor=y(this.outlineColor,e.outlineColor),this.outlineWidth=y(this.outlineWidth,e.outlineWidth),this.numberOfVerticalLines=y(this.numberOfVerticalLines,e.numberOfVerticalLines),this.shadows=y(this.shadows,e.shadows),this.distanceDisplayCondition=y(this.distanceDisplayCondition,e.distanceDisplayCondition),this.classificationType=y(this.classificationType,e.classificationType),this.zIndex=y(this.zIndex,e.zIndex)};var Yx=lI;var H8t=T(S(),1);function dI(e){this._definitionChanged=new be,this._show=void 0,this._showSubscription=void 0,this._radii=void 0,this._radiiSubscription=void 0,this._innerRadii=void 0,this._innerRadiiSubscription=void 0,this._minimumClock=void 0,this._minimumClockSubscription=void 0,this._maximumClock=void 0,this._maximumClockSubscription=void 0,this._minimumCone=void 0,this._minimumConeSubscription=void 0,this._maximumCone=void 0,this._maximumConeSubscription=void 0,this._heightReference=void 0,this._heightReferenceSubscription=void 0,this._fill=void 0,this._fillSubscription=void 0,this._material=void 0,this._materialSubscription=void 0,this._outline=void 0,this._outlineSubscription=void 0,this._outlineColor=void 0,this._outlineColorSubscription=void 0,this._outlineWidth=void 0,this._outlineWidthSubscription=void 0,this._stackPartitions=void 0,this._stackPartitionsSubscription=void 0,this._slicePartitions=void 0,this._slicePartitionsSubscription=void 0,this._subdivisions=void 0,this._subdivisionsSubscription=void 0,this._shadows=void 0,this._shadowsSubscription=void 0,this._distanceDisplayCondition=void 0,this._distanceDisplayConditionSubscription=void 0,this.merge(y(e,y.EMPTY_OBJECT))}Object.defineProperties(dI.prototype,{definitionChanged:{get:function(){return this._definitionChanged}},show:ue("show"),radii:ue("radii"),innerRadii:ue("innerRadii"),minimumClock:ue("minimumClock"),maximumClock:ue("maximumClock"),minimumCone:ue("minimumCone"),maximumCone:ue("maximumCone"),heightReference:ue("heightReference"),fill:ue("fill"),material:vo("material"),outline:ue("outline"),outlineColor:ue("outlineColor"),outlineWidth:ue("outlineWidth"),stackPartitions:ue("stackPartitions"),slicePartitions:ue("slicePartitions"),subdivisions:ue("subdivisions"),shadows:ue("shadows"),distanceDisplayCondition:ue("distanceDisplayCondition")});dI.prototype.clone=function(e){return l(e)?(e.show=this.show,e.radii=this.radii,e.innerRadii=this.innerRadii,e.minimumClock=this.minimumClock,e.maximumClock=this.maximumClock,e.minimumCone=this.minimumCone,e.maximumCone=this.maximumCone,e.heightReference=this.heightReference,e.fill=this.fill,e.material=this.material,e.outline=this.outline,e.outlineColor=this.outlineColor,e.outlineWidth=this.outlineWidth,e.stackPartitions=this.stackPartitions,e.slicePartitions=this.slicePartitions,e.subdivisions=this.subdivisions,e.shadows=this.shadows,e.distanceDisplayCondition=this.distanceDisplayCondition,e):new dI(this)};dI.prototype.merge=function(e){this.show=y(this.show,e.show),this.radii=y(this.radii,e.radii),this.innerRadii=y(this.innerRadii,e.innerRadii),this.minimumClock=y(this.minimumClock,e.minimumClock),this.maximumClock=y(this.maximumClock,e.maximumClock),this.minimumCone=y(this.minimumCone,e.minimumCone),this.maximumCone=y(this.maximumCone,e.maximumCone),this.heightReference=y(this.heightReference,e.heightReference),this.fill=y(this.fill,e.fill),this.material=y(this.material,e.material),this.outline=y(this.outline,e.outline),this.outlineColor=y(this.outlineColor,e.outlineColor),this.outlineWidth=y(this.outlineWidth,e.outlineWidth),this.stackPartitions=y(this.stackPartitions,e.stackPartitions),this.slicePartitions=y(this.slicePartitions,e.slicePartitions),this.subdivisions=y(this.subdivisions,e.subdivisions),this.shadows=y(this.shadows,e.shadows),this.distanceDisplayCondition=y(this.distanceDisplayCondition,e.distanceDisplayCondition)};var Hx=dI;var q8t=T(S(),1);function uI(e){this._definitionChanged=new be,this._show=void 0,this._showSubscription=void 0,this._text=void 0,this._textSubscription=void 0,this._font=void 0,this._fontSubscription=void 0,this._style=void 0,this._styleSubscription=void 0,this._scale=void 0,this._scaleSubscription=void 0,this._showBackground=void 0,this._showBackgroundSubscription=void 0,this._backgroundColor=void 0,this._backgroundColorSubscription=void 0,this._backgroundPadding=void 0,this._backgroundPaddingSubscription=void 0,this._pixelOffset=void 0,this._pixelOffsetSubscription=void 0,this._eyeOffset=void 0,this._eyeOffsetSubscription=void 0,this._horizontalOrigin=void 0,this._horizontalOriginSubscription=void 0,this._verticalOrigin=void 0,this._verticalOriginSubscription=void 0,this._heightReference=void 0,this._heightReferenceSubscription=void 0,this._fillColor=void 0,this._fillColorSubscription=void 0,this._outlineColor=void 0,this._outlineColorSubscription=void 0,this._outlineWidth=void 0,this._outlineWidthSubscription=void 0,this._translucencyByDistance=void 0,this._translucencyByDistanceSubscription=void 0,this._pixelOffsetScaleByDistance=void 0,this._pixelOffsetScaleByDistanceSubscription=void 0,this._scaleByDistance=void 0,this._scaleByDistanceSubscription=void 0,this._distanceDisplayCondition=void 0,this._distanceDisplayConditionSubscription=void 0,this._disableDepthTestDistance=void 0,this._disableDepthTestDistanceSubscription=void 0,this.merge(y(e,y.EMPTY_OBJECT))}Object.defineProperties(uI.prototype,{definitionChanged:{get:function(){return this._definitionChanged}},show:ue("show"),text:ue("text"),font:ue("font"),style:ue("style"),scale:ue("scale"),showBackground:ue("showBackground"),backgroundColor:ue("backgroundColor"),backgroundPadding:ue("backgroundPadding"),pixelOffset:ue("pixelOffset"),eyeOffset:ue("eyeOffset"),horizontalOrigin:ue("horizontalOrigin"),verticalOrigin:ue("verticalOrigin"),heightReference:ue("heightReference"),fillColor:ue("fillColor"),outlineColor:ue("outlineColor"),outlineWidth:ue("outlineWidth"),translucencyByDistance:ue("translucencyByDistance"),pixelOffsetScaleByDistance:ue("pixelOffsetScaleByDistance"),scaleByDistance:ue("scaleByDistance"),distanceDisplayCondition:ue("distanceDisplayCondition"),disableDepthTestDistance:ue("disableDepthTestDistance")});uI.prototype.clone=function(e){return l(e)?(e.show=this.show,e.text=this.text,e.font=this.font,e.style=this.style,e.scale=this.scale,e.showBackground=this.showBackground,e.backgroundColor=this.backgroundColor,e.backgroundPadding=this.backgroundPadding,e.pixelOffset=this.pixelOffset,e.eyeOffset=this.eyeOffset,e.horizontalOrigin=this.horizontalOrigin,e.verticalOrigin=this.verticalOrigin,e.heightReference=this.heightReference,e.fillColor=this.fillColor,e.outlineColor=this.outlineColor,e.outlineWidth=this.outlineWidth,e.translucencyByDistance=this.translucencyByDistance,e.pixelOffsetScaleByDistance=this.pixelOffsetScaleByDistance,e.scaleByDistance=this.scaleByDistance,e.distanceDisplayCondition=this.distanceDisplayCondition,e.disableDepthTestDistance=this.disableDepthTestDistance,e):new uI(this)};uI.prototype.merge=function(e){this.show=y(this.show,e.show),this.text=y(this.text,e.text),this.font=y(this.font,e.font),this.style=y(this.style,e.style),this.scale=y(this.scale,e.scale),this.showBackground=y(this.showBackground,e.showBackground),this.backgroundColor=y(this.backgroundColor,e.backgroundColor),this.backgroundPadding=y(this.backgroundPadding,e.backgroundPadding),this.pixelOffset=y(this.pixelOffset,e.pixelOffset),this.eyeOffset=y(this.eyeOffset,e.eyeOffset),this.horizontalOrigin=y(this.horizontalOrigin,e.horizontalOrigin),this.verticalOrigin=y(this.verticalOrigin,e.verticalOrigin),this.heightReference=y(this.heightReference,e.heightReference),this.fillColor=y(this.fillColor,e.fillColor),this.outlineColor=y(this.outlineColor,e.outlineColor),this.outlineWidth=y(this.outlineWidth,e.outlineWidth),this.translucencyByDistance=y(this.translucencyByDistance,e.translucencyByDistance),this.pixelOffsetScaleByDistance=y(this.pixelOffsetScaleByDistance,e.pixelOffsetScaleByDistance),this.scaleByDistance=y(this.scaleByDistance,e.scaleByDistance),this.distanceDisplayCondition=y(this.distanceDisplayCondition,e.distanceDisplayCondition),this.disableDepthTestDistance=y(this.disableDepthTestDistance,e.disableDepthTestDistance)};var Um=uI;var I7t=T(S(),1);var h7t=T(S(),1);var o7t=T(S(),1);var T2e=new m(1,1,1),S2e=m.ZERO,C2e=Fe.IDENTITY;function Tie(e,t,n){this.translation=m.clone(y(e,S2e)),this.rotation=Fe.clone(y(t,C2e)),this.scale=m.clone(y(n,T2e))}Tie.prototype.equals=function(e){return this===e||l(e)&&m.equals(this.translation,e.translation)&&Fe.equals(this.rotation,e.rotation)&&m.equals(this.scale,e.scale)};var og=Tie;var rH=new og;function mI(e){e=y(e,y.EMPTY_OBJECT),this._definitionChanged=new be,this._translation=void 0,this._translationSubscription=void 0,this._rotation=void 0,this._rotationSubscription=void 0,this._scale=void 0,this._scaleSubscription=void 0,this.translation=e.translation,this.rotation=e.rotation,this.scale=e.scale}Object.defineProperties(mI.prototype,{isConstant:{get:function(){return J.isConstant(this._translation)&&J.isConstant(this._rotation)&&J.isConstant(this._scale)}},definitionChanged:{get:function(){return this._definitionChanged}},translation:ue("translation"),rotation:ue("rotation"),scale:ue("scale")});var V2e=new q;mI.prototype.getValue=function(e,t){return l(e)||(e=q.now(V2e)),l(t)||(t=new og),t.translation=J.getValueOrClonedDefault(this._translation,e,rH.translation,t.translation),t.rotation=J.getValueOrClonedDefault(this._rotation,e,rH.rotation,t.rotation),t.scale=J.getValueOrClonedDefault(this._scale,e,rH.scale,t.scale),t};mI.prototype.equals=function(e){return this===e||e instanceof mI&&J.equals(this._translation,e._translation)&&J.equals(this._rotation,e._rotation)&&J.equals(this._scale,e._scale)};var zx=mI;var S7t=T(S(),1);function Op(e,t){this._propertyNames=[],this._definitionChanged=new be,l(e)&&this.merge(e,t)}Object.defineProperties(Op.prototype,{propertyNames:{get:function(){return this._propertyNames}},isConstant:{get:function(){let e=this._propertyNames;for(let t=0,n=e.length;t{this._terrainHeight=s.height,this.definitionChanged.raiseEvent()};this._removeCallbackFunc=e.updateHeight(i,r,this._heightReference)};var Y2e=new q;ZC.prototype.getValue=function(e,t){l(e)||(e=q.now(Y2e));let n=J.getValueOrDefault(this._heightReference,e,Ke.NONE),i=J.getValueOrDefault(this._extrudedHeightReference,e,Ke.NONE);if(n===Ke.NONE&&!lC(i))return this._position=m.clone(m.ZERO,this._position),m.clone(m.ZERO,t);if(this._positionProperty.isConstant)return m.multiplyByScalar(this._normal,this._terrainHeight,t);let o=this._scene,r=this._positionProperty.getValue(e,Rie);if(!l(r)||m.equals(r,m.ZERO)||!l(o.globe))return m.clone(m.ZERO,t);if(m.equalsEpsilon(this._position,r,W.EPSILON10))return m.multiplyByScalar(this._normal,this._terrainHeight,t);this._position=m.clone(r,this._position),this._updateClamping();let s=o.ellipsoid.geodeticSurfaceNormal(r,this._normal);return m.multiplyByScalar(s,this._terrainHeight,t)};ZC.prototype.isDestroyed=function(){return!1};ZC.prototype.destroy=function(){return l(this._removeEventListener)&&this._removeEventListener(),l(this._removeModeListener)&&this._removeModeListener(),l(this._removeCallbackFunc)&&this._removeCallbackFunc(),me(this)};var jx=ZC;function H2e(e,t,n,i){if(si.prototype._onEntityPropertyChanged.call(this,e,t,n,i),this._observedPropertyNames.indexOf(t)===-1)return;let o=this._entity[this._geometryPropertyName];if(!l(o))return;l(this._terrainOffsetProperty)&&(this._terrainOffsetProperty.destroy(),this._terrainOffsetProperty=void 0);let r=o.heightReference;if(l(r)){let s=new Om(this._computeCenter.bind(this),!this._dynamic);this._terrainOffsetProperty=new jx(this._scene,s,r)}}var Kp=H2e;var Zie=m.ZERO,Gie=new m,z2e=new m,Eie=new B;function K2e(e){this.id=e,this.vertexFormat=void 0,this.dimensions=void 0,this.offsetAttribute=void 0}function yd(e,t){si.call(this,{entity:e,scene:t,geometryOptions:new K2e(e),geometryPropertyName:"box",observedPropertyNames:["availability","position","orientation","box"]}),this._onEntityPropertyChanged(e,"box",e.box,void 0)}l(Object.create)&&(yd.prototype=Object.create(si.prototype),yd.prototype.constructor=yd);Object.defineProperties(yd.prototype,{terrainOffsetProperty:{get:function(){return this._terrainOffsetProperty}}});yd.prototype.createFillGeometryInstance=function(e){let t=this._entity,n=t.isAvailable(e),i=new xn(n&&t.isShowing&&this._showProperty.getValue(e)&&this._fillProperty.getValue(e)),o=this._distanceDisplayConditionProperty.getValue(e),r=Dn.fromDistanceDisplayCondition(o),s={show:i,distanceDisplayCondition:r,color:void 0,offset:void 0};if(this._materialProperty instanceof Bt){let a;l(this._materialProperty.color)&&(this._materialProperty.color.isConstant||n)&&(a=this._materialProperty.color.getValue(e,Eie)),l(a)||(a=B.WHITE),s.color=Ht.fromColor(a)}return l(this._options.offsetAttribute)&&(s.offset=no.fromCartesian3(J.getValueOrDefault(this._terrainOffsetProperty,e,Zie,Gie))),new It({id:t,geometry:va.fromDimensions(this._options),modelMatrix:t.computeModelMatrixForHeightReference(e,t.box.heightReference,this._options.dimensions.z*.5,this._scene.ellipsoid),attributes:s})};yd.prototype.createOutlineGeometryInstance=function(e){let t=this._entity,n=t.isAvailable(e),i=J.getValueOrDefault(this._outlineColorProperty,e,B.BLACK,Eie),o=this._distanceDisplayConditionProperty.getValue(e),r={show:new xn(n&&t.isShowing&&this._showProperty.getValue(e)&&this._showOutlineProperty.getValue(e)),color:Ht.fromColor(i),distanceDisplayCondition:Dn.fromDistanceDisplayCondition(o),offset:void 0};return l(this._options.offsetAttribute)&&(r.offset=no.fromCartesian3(J.getValueOrDefault(this._terrainOffsetProperty,e,Zie,Gie))),new It({id:t,geometry:Pm.fromDimensions(this._options),modelMatrix:t.computeModelMatrixForHeightReference(e,t.box.heightReference,this._options.dimensions.z*.5,this._scene.ellipsoid),attributes:r})};yd.prototype._computeCenter=function(e,t){return J.getValueOrUndefined(this._entity.position,e,t)};yd.prototype._isHidden=function(e,t){return!l(t.dimensions)||!l(e.position)||si.prototype._isHidden.call(this,e,t)};yd.prototype._isDynamic=function(e,t){return!e.position.isConstant||!J.isConstant(e.orientation)||!t.dimensions.isConstant||!J.isConstant(t.outlineWidth)};yd.prototype._setStaticOptions=function(e,t){let n=J.getValueOrDefault(t.heightReference,Be.MINIMUM_VALUE,Ke.NONE),i=this._options;i.vertexFormat=this._materialProperty instanceof Bt?dn.VERTEX_FORMAT:uo.MaterialSupport.TEXTURED.vertexFormat,i.dimensions=t.dimensions.getValue(Be.MINIMUM_VALUE,i.dimensions),i.offsetAttribute=n!==Ke.NONE?an.ALL:void 0};yd.prototype._onEntityPropertyChanged=Kp;yd.DynamicGeometryUpdater=GC;function GC(e,t,n){ri.call(this,e,t,n)}l(Object.create)&&(GC.prototype=Object.create(ri.prototype),GC.prototype.constructor=GC);GC.prototype._isHidden=function(e,t,n){let i=J.getValueOrUndefined(e.position,n,z2e),o=this._options.dimensions;return!l(i)||!l(o)||ri.prototype._isHidden.call(this,e,t,n)};GC.prototype._setOptions=function(e,t,n){let i=J.getValueOrDefault(t.heightReference,n,Ke.NONE),o=this._options;o.dimensions=J.getValueOrUndefined(t.dimensions,n,o.dimensions),o.offsetAttribute=i!==Ke.NONE?an.ALL:void 0};var VI=yd;var B$t=T(S(),1);function qx(e,t,n){this._callback=void 0,this._isConstant=void 0,this._referenceFrame=y(n,Di.FIXED),this._definitionChanged=new be,this.setCallback(e,t)}Object.defineProperties(qx.prototype,{isConstant:{get:function(){return this._isConstant}},definitionChanged:{get:function(){return this._definitionChanged}},referenceFrame:{get:function(){return this._referenceFrame}}});var J2e=new q;qx.prototype.getValue=function(e,t){return l(e)||(e=q.now(J2e)),this.getValueInReferenceFrame(e,Di.FIXED,t)};qx.prototype.setCallback=function(e,t){let n=this._callback!==e||this._isConstant!==t;this._callback=e,this._isConstant=t,n&&this._definitionChanged.raiseEvent(this)};qx.prototype.getValueInReferenceFrame=function(e,t,n){let i=this._callback(e,n);return km.convertToReferenceFrame(e,i,this._referenceFrame,t,n)};qx.prototype.equals=function(e){return this===e||e instanceof qx&&this._callback===e._callback&&this._isConstant===e._isConstant&&this._referenceFrame===e._referenceFrame};var LI=qx;var gYn=T(S(),1);var sYn=T(S(),1);var Q$t=T(S(),1);var Y$t=T(S(),1);/*! @license DOMPurify 3.2.4 | (c) Cure53 and other contributors | Released under the Apache license 2.0 and Mozilla Public License 2.0 | github.com/cure53/DOMPurify/blob/3.2.4/LICENSE */var{entries:Nie,setPrototypeOf:Iie,isFrozen:Q2e,getPrototypeOf:j2e,getOwnPropertyDescriptor:q2e}=Object,{freeze:zc,seal:Zu,create:kie}=Object,{apply:hH,construct:fH}=typeof Reflect<"u"&&Reflect;zc||(zc=function(t){return t});Zu||(Zu=function(t){return t});hH||(hH=function(t,n,i){return t.apply(n,i)});fH||(fH=function(t,n){return new t(...n)});var C5=Kc(Array.prototype.forEach),$2e=Kc(Array.prototype.lastIndexOf),Xie=Kc(Array.prototype.pop),RI=Kc(Array.prototype.push),ePe=Kc(Array.prototype.splice),L5=Kc(String.prototype.toLowerCase),cH=Kc(String.prototype.toString),Wie=Kc(String.prototype.match),ZI=Kc(String.prototype.replace),tPe=Kc(String.prototype.indexOf),nPe=Kc(String.prototype.trim),Ym=Kc(Object.prototype.hasOwnProperty),Hc=Kc(RegExp.prototype.test),GI=iPe(TypeError);function Kc(e){return function(t){for(var n=arguments.length,i=new Array(n>1?n-1:0),o=1;o2&&arguments[2]!==void 0?arguments[2]:L5;Iie&&Iie(e,null);let i=t.length;for(;i--;){let o=t[i];if(typeof o=="string"){let r=n(o);r!==o&&(Q2e(t)||(t[i]=r),o=r)}e[o]=!0}return e}function oPe(e){for(let t=0;t/gm),lPe=Zu(/\$\{[\w\W]*/gm),dPe=Zu(/^data-[\-\w.\u00B7-\uFFFF]+$/),uPe=Zu(/^aria-[\-\w]+$/),Uie=Zu(/^(?:(?:(?:f|ht)tps?|mailto|tel|callto|sms|cid|xmpp):|[^a-z]|[a-z+.\-]+(?:[^a-z+.\-:]|$))/i),mPe=Zu(/^(?:\w+script|data):/i),hPe=Zu(/[\u0000-\u0020\u00A0\u1680\u180E\u2000-\u2029\u205F\u3000]/g),Die=Zu(/^html$/i),fPe=Zu(/^[a-z][.\w]*(-[.\w]+)+$/i),Aie=Object.freeze({__proto__:null,ARIA_ATTR:uPe,ATTR_WHITESPACE:hPe,CUSTOM_ELEMENT:fPe,DATA_ATTR:dPe,DOCTYPE_NAME:Die,ERB_EXPR:cPe,IS_ALLOWED_URI:Uie,IS_SCRIPT_OR_DATA:mPe,MUSTACHE_EXPR:aPe,TMPLIT_EXPR:lPe}),II={element:1,attribute:2,text:3,cdataSection:4,entityReference:5,entityNode:6,progressingInstruction:7,comment:8,document:9,documentType:10,documentFragment:11,notation:12},pPe=function(){return typeof window>"u"?null:window},bPe=function(t,n){if(typeof t!="object"||typeof t.createPolicy!="function")return null;let i=null,o="data-tt-policy-suffix";n&&n.hasAttribute(o)&&(i=n.getAttribute(o));let r="dompurify"+(i?"#"+i:"");try{return t.createPolicy(r,{createHTML(s){return s},createScriptURL(s){return s}})}catch{return console.warn("TrustedTypes policy "+r+" could not be created."),null}},Mie=function(){return{afterSanitizeAttributes:[],afterSanitizeElements:[],afterSanitizeShadowDOM:[],beforeSanitizeAttributes:[],beforeSanitizeElements:[],beforeSanitizeShadowDOM:[],uponSanitizeAttribute:[],uponSanitizeElement:[],uponSanitizeShadowNode:[]}};function Bie(){let e=arguments.length>0&&arguments[0]!==void 0?arguments[0]:pPe(),t=Jt=>Bie(Jt);if(t.version="3.2.4",t.removed=[],!e||!e.document||e.document.nodeType!==II.document||!e.Element)return t.isSupported=!1,t;let{document:n}=e,i=n,o=i.currentScript,{DocumentFragment:r,HTMLTemplateElement:s,Node:a,Element:c,NodeFilter:d,NamedNodeMap:u=e.NamedNodeMap||e.MozNamedAttrMap,HTMLFormElement:h,DOMParser:p,trustedTypes:g}=e,f=c.prototype,x=EI(f,"cloneNode"),_=EI(f,"remove"),C=EI(f,"nextSibling"),V=EI(f,"childNodes"),L=EI(f,"parentNode");if(typeof s=="function"){let Jt=n.createElement("template");Jt.content&&Jt.content.ownerDocument&&(n=Jt.content.ownerDocument)}let R,G="",{implementation:I,createNodeIterator:v,createDocumentFragment:P,getElementsByTagName:w}=n,{importNode:A}=i,b=Mie();t.isSupported=typeof Nie=="function"&&typeof L=="function"&&I&&I.createHTMLDocument!==void 0;let{MUSTACHE_EXPR:Z,ERB_EXPR:E,TMPLIT_EXPR:X,DATA_ATTR:F,ARIA_ATTR:N,IS_SCRIPT_OR_DATA:O,ATTR_WHITESPACE:U,CUSTOM_ELEMENT:Y}=Aie,{IS_ALLOWED_URI:k}=Aie,H=null,K=Pi({},[...Pie,...lH,...dH,...uH,...vie]),te=null,z=Pi({},[...wie,...mH,...Fie,...V5]),j=Object.seal(kie(null,{tagNameCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},attributeNameCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},allowCustomizedBuiltInElements:{writable:!0,configurable:!1,enumerable:!0,value:!1}})),ee=null,pe=null,_e=!0,ae=!0,ye=!1,Se=!0,Ee=!1,Ie=!0,we=!1,ve=!1,at=!1,Je=!1,pt=!1,Qe=!1,_t=!0,ht=!1,bt="user-content-",En=!0,sn=!1,Ce={},Le=null,wn=Pi({},["annotation-xml","audio","colgroup","desc","foreignobject","head","iframe","math","mi","mn","mo","ms","mtext","noembed","noframes","noscript","plaintext","script","style","svg","template","thead","title","video","xmp"]),Mo=null,Jo=Pi({},["audio","video","img","source","image","track"]),Xr=null,da=Pi({},["alt","class","for","id","label","name","pattern","placeholder","role","summary","title","value","style","xmlns"]),Vs="http://www.w3.org/1998/Math/MathML",ua="http://www.w3.org/2000/svg",Ne="http://www.w3.org/1999/xhtml",ct=Ne,it=!1,qe=null,Gt=Pi({},[Vs,ua,Ne],cH),Yt=Pi({},["mi","mo","mn","ms","mtext"]),Rn=Pi({},["annotation-xml"]),No=Pi({},["title","style","font","a","script"]),Io=null,vc=["application/xhtml+xml","text/html"],wc="text/html",Ei=null,ki=null,Ia=n.createElement("form"),mn=function(Ve){return Ve instanceof RegExp||Ve instanceof Function},Fn=function(){let Ve=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};if(!(ki&&ki===Ve)){if((!Ve||typeof Ve!="object")&&(Ve={}),Ve=$x(Ve),Io=vc.indexOf(Ve.PARSER_MEDIA_TYPE)===-1?wc:Ve.PARSER_MEDIA_TYPE,Ei=Io==="application/xhtml+xml"?cH:L5,H=Ym(Ve,"ALLOWED_TAGS")?Pi({},Ve.ALLOWED_TAGS,Ei):K,te=Ym(Ve,"ALLOWED_ATTR")?Pi({},Ve.ALLOWED_ATTR,Ei):z,qe=Ym(Ve,"ALLOWED_NAMESPACES")?Pi({},Ve.ALLOWED_NAMESPACES,cH):Gt,Xr=Ym(Ve,"ADD_URI_SAFE_ATTR")?Pi($x(da),Ve.ADD_URI_SAFE_ATTR,Ei):da,Mo=Ym(Ve,"ADD_DATA_URI_TAGS")?Pi($x(Jo),Ve.ADD_DATA_URI_TAGS,Ei):Jo,Le=Ym(Ve,"FORBID_CONTENTS")?Pi({},Ve.FORBID_CONTENTS,Ei):wn,ee=Ym(Ve,"FORBID_TAGS")?Pi({},Ve.FORBID_TAGS,Ei):{},pe=Ym(Ve,"FORBID_ATTR")?Pi({},Ve.FORBID_ATTR,Ei):{},Ce=Ym(Ve,"USE_PROFILES")?Ve.USE_PROFILES:!1,_e=Ve.ALLOW_ARIA_ATTR!==!1,ae=Ve.ALLOW_DATA_ATTR!==!1,ye=Ve.ALLOW_UNKNOWN_PROTOCOLS||!1,Se=Ve.ALLOW_SELF_CLOSE_IN_ATTR!==!1,Ee=Ve.SAFE_FOR_TEMPLATES||!1,Ie=Ve.SAFE_FOR_XML!==!1,we=Ve.WHOLE_DOCUMENT||!1,Je=Ve.RETURN_DOM||!1,pt=Ve.RETURN_DOM_FRAGMENT||!1,Qe=Ve.RETURN_TRUSTED_TYPE||!1,at=Ve.FORCE_BODY||!1,_t=Ve.SANITIZE_DOM!==!1,ht=Ve.SANITIZE_NAMED_PROPS||!1,En=Ve.KEEP_CONTENT!==!1,sn=Ve.IN_PLACE||!1,k=Ve.ALLOWED_URI_REGEXP||Uie,ct=Ve.NAMESPACE||Ne,Yt=Ve.MATHML_TEXT_INTEGRATION_POINTS||Yt,Rn=Ve.HTML_INTEGRATION_POINTS||Rn,j=Ve.CUSTOM_ELEMENT_HANDLING||{},Ve.CUSTOM_ELEMENT_HANDLING&&mn(Ve.CUSTOM_ELEMENT_HANDLING.tagNameCheck)&&(j.tagNameCheck=Ve.CUSTOM_ELEMENT_HANDLING.tagNameCheck),Ve.CUSTOM_ELEMENT_HANDLING&&mn(Ve.CUSTOM_ELEMENT_HANDLING.attributeNameCheck)&&(j.attributeNameCheck=Ve.CUSTOM_ELEMENT_HANDLING.attributeNameCheck),Ve.CUSTOM_ELEMENT_HANDLING&&typeof Ve.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements=="boolean"&&(j.allowCustomizedBuiltInElements=Ve.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements),Ee&&(ae=!1),pt&&(Je=!0),Ce&&(H=Pi({},vie),te=[],Ce.html===!0&&(Pi(H,Pie),Pi(te,wie)),Ce.svg===!0&&(Pi(H,lH),Pi(te,mH),Pi(te,V5)),Ce.svgFilters===!0&&(Pi(H,dH),Pi(te,mH),Pi(te,V5)),Ce.mathMl===!0&&(Pi(H,uH),Pi(te,Fie),Pi(te,V5))),Ve.ADD_TAGS&&(H===K&&(H=$x(H)),Pi(H,Ve.ADD_TAGS,Ei)),Ve.ADD_ATTR&&(te===z&&(te=$x(te)),Pi(te,Ve.ADD_ATTR,Ei)),Ve.ADD_URI_SAFE_ATTR&&Pi(Xr,Ve.ADD_URI_SAFE_ATTR,Ei),Ve.FORBID_CONTENTS&&(Le===wn&&(Le=$x(Le)),Pi(Le,Ve.FORBID_CONTENTS,Ei)),En&&(H["#text"]=!0),we&&Pi(H,["html","head","body"]),H.table&&(Pi(H,["tbody"]),delete ee.tbody),Ve.TRUSTED_TYPES_POLICY){if(typeof Ve.TRUSTED_TYPES_POLICY.createHTML!="function")throw GI('TRUSTED_TYPES_POLICY configuration option must provide a "createHTML" hook.');if(typeof Ve.TRUSTED_TYPES_POLICY.createScriptURL!="function")throw GI('TRUSTED_TYPES_POLICY configuration option must provide a "createScriptURL" hook.');R=Ve.TRUSTED_TYPES_POLICY,G=R.createHTML("")}else R===void 0&&(R=bPe(g,o)),R!==null&&typeof G=="string"&&(G=R.createHTML(""));zc&&zc(Ve),ki=Ve}},zi=Pi({},[...lH,...dH,...rPe]),ze=Pi({},[...uH,...sPe]),Cl=function(Ve){let Tt=L(Ve);(!Tt||!Tt.tagName)&&(Tt={namespaceURI:ct,tagName:"template"});let un=L5(Ve.tagName),Wo=L5(Tt.tagName);return qe[Ve.namespaceURI]?Ve.namespaceURI===ua?Tt.namespaceURI===Ne?un==="svg":Tt.namespaceURI===Vs?un==="svg"&&(Wo==="annotation-xml"||Yt[Wo]):!!zi[un]:Ve.namespaceURI===Vs?Tt.namespaceURI===Ne?un==="math":Tt.namespaceURI===ua?un==="math"&&Rn[Wo]:!!ze[un]:Ve.namespaceURI===Ne?Tt.namespaceURI===ua&&!Rn[Wo]||Tt.namespaceURI===Vs&&!Yt[Wo]?!1:!ze[un]&&(No[un]||!zi[un]):!!(Io==="application/xhtml+xml"&&qe[Ve.namespaceURI]):!1},Xo=function(Ve){RI(t.removed,{element:Ve});try{L(Ve).removeChild(Ve)}catch{_(Ve)}},Rm=function(Ve,Tt){try{RI(t.removed,{attribute:Tt.getAttributeNode(Ve),from:Tt})}catch{RI(t.removed,{attribute:null,from:Tt})}if(Tt.removeAttribute(Ve),Ve==="is")if(Je||pt)try{Xo(Tt)}catch{}else try{Tt.setAttribute(Ve,"")}catch{}},hu=function(Ve){let Tt=null,un=null;if(at)Ve=""+Ve;else{let us=Wie(Ve,/^[\r\n\t ]+/);un=us&&us[0]}Io==="application/xhtml+xml"&&ct===Ne&&(Ve=''+Ve+"");let Wo=R?R.createHTML(Ve):Ve;if(ct===Ne)try{Tt=new p().parseFromString(Wo,Io)}catch{}if(!Tt||!Tt.documentElement){Tt=I.createDocument(ct,"template",null);try{Tt.documentElement.innerHTML=it?G:Wo}catch{}}let Ls=Tt.body||Tt.documentElement;return Ve&&un&&Ls.insertBefore(n.createTextNode(un),Ls.childNodes[0]||null),ct===Ne?w.call(Tt,we?"html":"body")[0]:we?Tt.documentElement:Ls},nf=function(Ve){return v.call(Ve.ownerDocument||Ve,Ve,d.SHOW_ELEMENT|d.SHOW_COMMENT|d.SHOW_TEXT|d.SHOW_PROCESSING_INSTRUCTION|d.SHOW_CDATA_SECTION,null)},fu=function(Ve){return Ve instanceof h&&(typeof Ve.nodeName!="string"||typeof Ve.textContent!="string"||typeof Ve.removeChild!="function"||!(Ve.attributes instanceof u)||typeof Ve.removeAttribute!="function"||typeof Ve.setAttribute!="function"||typeof Ve.namespaceURI!="string"||typeof Ve.insertBefore!="function"||typeof Ve.hasChildNodes!="function")},N0=function(Ve){return typeof a=="function"&&Ve instanceof a};function lo(Jt,Ve,Tt){C5(Jt,un=>{un.call(t,Ve,Tt,ki)})}let pu=function(Ve){let Tt=null;if(lo(b.beforeSanitizeElements,Ve,null),fu(Ve))return Xo(Ve),!0;let un=Ei(Ve.nodeName);if(lo(b.uponSanitizeElement,Ve,{tagName:un,allowedTags:H}),Ve.hasChildNodes()&&!N0(Ve.firstElementChild)&&Hc(/<[/\w]/g,Ve.innerHTML)&&Hc(/<[/\w]/g,Ve.textContent)||Ve.nodeType===II.progressingInstruction||Ie&&Ve.nodeType===II.comment&&Hc(/<[/\w]/g,Ve.data))return Xo(Ve),!0;if(!H[un]||ee[un]){if(!ee[un]&&Vl(un)&&(j.tagNameCheck instanceof RegExp&&Hc(j.tagNameCheck,un)||j.tagNameCheck instanceof Function&&j.tagNameCheck(un)))return!1;if(En&&!Le[un]){let Wo=L(Ve)||Ve.parentNode,Ls=V(Ve)||Ve.childNodes;if(Ls&&Wo){let us=Ls.length;for(let ma=us-1;ma>=0;--ma){let $a=x(Ls[ma],!0);$a.__removalCount=(Ve.__removalCount||0)+1,Wo.insertBefore($a,C(Ve))}}}return Xo(Ve),!0}return Ve instanceof c&&!Cl(Ve)||(un==="noscript"||un==="noembed"||un==="noframes")&&Hc(/<\/no(script|embed|frames)/i,Ve.innerHTML)?(Xo(Ve),!0):(Ee&&Ve.nodeType===II.text&&(Tt=Ve.textContent,C5([Z,E,X],Wo=>{Tt=ZI(Tt,Wo," ")}),Ve.textContent!==Tt&&(RI(t.removed,{element:Ve.cloneNode()}),Ve.textContent=Tt)),lo(b.afterSanitizeElements,Ve,null),!1)},Zm=function(Ve,Tt,un){if(_t&&(Tt==="id"||Tt==="name")&&(un in n||un in Ia))return!1;if(!(ae&&!pe[Tt]&&Hc(F,Tt))){if(!(_e&&Hc(N,Tt))){if(!te[Tt]||pe[Tt]){if(!(Vl(Ve)&&(j.tagNameCheck instanceof RegExp&&Hc(j.tagNameCheck,Ve)||j.tagNameCheck instanceof Function&&j.tagNameCheck(Ve))&&(j.attributeNameCheck instanceof RegExp&&Hc(j.attributeNameCheck,Tt)||j.attributeNameCheck instanceof Function&&j.attributeNameCheck(Tt))||Tt==="is"&&j.allowCustomizedBuiltInElements&&(j.tagNameCheck instanceof RegExp&&Hc(j.tagNameCheck,un)||j.tagNameCheck instanceof Function&&j.tagNameCheck(un))))return!1}else if(!Xr[Tt]){if(!Hc(k,ZI(un,U,""))){if(!((Tt==="src"||Tt==="xlink:href"||Tt==="href")&&Ve!=="script"&&tPe(un,"data:")===0&&Mo[Ve])){if(!(ye&&!Hc(O,ZI(un,U,"")))){if(un)return!1}}}}}}return!0},Vl=function(Ve){return Ve!=="annotation-xml"&&Wie(Ve,Y)},ks=function(Ve){lo(b.beforeSanitizeAttributes,Ve,null);let{attributes:Tt}=Ve;if(!Tt||fu(Ve))return;let un={attrName:"",attrValue:"",keepAttr:!0,allowedAttributes:te,forceKeepAttr:void 0},Wo=Tt.length;for(;Wo--;){let Ls=Tt[Wo],{name:us,namespaceURI:ma,value:$a}=Ls,Sp=Ei(us),Us=us==="value"?$a:nPe($a);if(un.attrName=Sp,un.attrValue=Us,un.keepAttr=!0,un.forceKeepAttr=void 0,lo(b.uponSanitizeAttribute,Ve,un),Us=un.attrValue,ht&&(Sp==="id"||Sp==="name")&&(Rm(us,Ve),Us=bt+Us),Ie&&Hc(/((--!?|])>)|<\/(style|title)/i,Us)){Rm(us,Ve);continue}if(un.forceKeepAttr||(Rm(us,Ve),!un.keepAttr))continue;if(!Se&&Hc(/\/>/i,Us)){Rm(us,Ve);continue}Ee&&C5([Z,E,X],KS=>{Us=ZI(Us,KS," ")});let zS=Ei(Ve.nodeName);if(Zm(zS,Sp,Us)){if(R&&typeof g=="object"&&typeof g.getAttributeType=="function"&&!ma)switch(g.getAttributeType(zS,Sp)){case"TrustedHTML":{Us=R.createHTML(Us);break}case"TrustedScriptURL":{Us=R.createScriptURL(Us);break}}try{ma?Ve.setAttributeNS(ma,us,Us):Ve.setAttribute(us,Us),fu(Ve)?Xo(Ve):Xie(t.removed)}catch{}}}lo(b.afterSanitizeAttributes,Ve,null)},Wr=function Jt(Ve){let Tt=null,un=nf(Ve);for(lo(b.beforeSanitizeShadowDOM,Ve,null);Tt=un.nextNode();)lo(b.uponSanitizeShadowNode,Tt,null),pu(Tt),ks(Tt),Tt.content instanceof r&&Jt(Tt.content);lo(b.afterSanitizeShadowDOM,Ve,null)};return t.sanitize=function(Jt){let Ve=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{},Tt=null,un=null,Wo=null,Ls=null;if(it=!Jt,it&&(Jt=""),typeof Jt!="string"&&!N0(Jt))if(typeof Jt.toString=="function"){if(Jt=Jt.toString(),typeof Jt!="string")throw GI("dirty is not a string, aborting")}else throw GI("toString is not a function");if(!t.isSupported)return Jt;if(ve||Fn(Ve),t.removed=[],typeof Jt=="string"&&(sn=!1),sn){if(Jt.nodeName){let $a=Ei(Jt.nodeName);if(!H[$a]||ee[$a])throw GI("root node is forbidden and cannot be sanitized in-place")}}else if(Jt instanceof a)Tt=hu(""),un=Tt.ownerDocument.importNode(Jt,!0),un.nodeType===II.element&&un.nodeName==="BODY"||un.nodeName==="HTML"?Tt=un:Tt.appendChild(un);else{if(!Je&&!Ee&&!we&&Jt.indexOf("<")===-1)return R&&Qe?R.createHTML(Jt):Jt;if(Tt=hu(Jt),!Tt)return Je?null:Qe?G:""}Tt&&at&&Xo(Tt.firstChild);let us=nf(sn?Jt:Tt);for(;Wo=us.nextNode();)pu(Wo),ks(Wo),Wo.content instanceof r&&Wr(Wo.content);if(sn)return Jt;if(Je){if(pt)for(Ls=P.call(Tt.ownerDocument);Tt.firstChild;)Ls.appendChild(Tt.firstChild);else Ls=Tt;return(te.shadowroot||te.shadowrootmode)&&(Ls=A.call(i,Ls,!0)),Ls}let ma=we?Tt.outerHTML:Tt.innerHTML;return we&&H["!doctype"]&&Tt.ownerDocument&&Tt.ownerDocument.doctype&&Tt.ownerDocument.doctype.name&&Hc(Die,Tt.ownerDocument.doctype.name)&&(ma=" `+ma),Ee&&C5([Z,E,X],$a=>{ma=ZI(ma,$a," ")}),R&&Qe?R.createHTML(ma):ma},t.setConfig=function(){let Jt=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};Fn(Jt),ve=!0},t.clearConfig=function(){ki=null,ve=!1},t.isValidAttribute=function(Jt,Ve,Tt){ki||Fn({});let un=Ei(Jt),Wo=Ei(Ve);return Zm(un,Wo,Tt)},t.addHook=function(Jt,Ve){typeof Ve=="function"&&RI(b[Jt],Ve)},t.removeHook=function(Jt,Ve){if(Ve!==void 0){let Tt=$2e(b[Jt],Ve);return Tt===-1?void 0:ePe(b[Jt],Tt,1)[0]}return Xie(b[Jt])},t.removeHooks=function(Jt){b[Jt]=[]},t.removeAllHooks=function(){b=Mie()},t}var Oie=Bie();var gPe=0,pH={};function yf(e,t){let n,i=e;l(pH[i])?n=pH[i]:(n=gPe++,pH[i]=n),t=y(t,!1),this._id=n,this._html=e,this._showOnScreen=t,this._element=void 0}Object.defineProperties(yf.prototype,{html:{get:function(){return this._html}},id:{get:function(){return this._id}},showOnScreen:{get:function(){return this._showOnScreen},set:function(e){this._showOnScreen=e}},element:{get:function(){if(!l(this._element)){let e=Oie.sanitize(this._html),t=document.createElement("div");t.className="cesium-credit-wrapper",t._creditId=this._id,t.style.display="inline",t.innerHTML=e;let n=t.querySelectorAll("a");for(let i=0;i{u[h]=void 0});for(let h=r;h0||this._imageBasedLightingFactor.y>0}},shouldRegenerateShaders:{get:function(){return this._shouldRegenerateShaders}},specularEnvironmentCubeMap:{get:function(){return this._specularEnvironmentCubeMap}},useDefaultSphericalHarmonics:{get:function(){return this._useDefaultSphericalHarmonics}},useDefaultSpecularMaps:{get:function(){return this._useDefaultSpecularMaps}},useSpecularEnvironmentMaps:{get:function(){return l(this._specularEnvironmentCubeMap)&&this._specularEnvironmentCubeMap.ready||this._useDefaultSpecularMaps}}});function xPe(e,t){if(Hm.isSupported(t)){if(e._specularEnvironmentCubeMap=e._specularEnvironmentCubeMap&&e._specularEnvironmentCubeMap.destroy(),l(e._specularEnvironmentMaps)){let n=new Hm(e._specularEnvironmentMaps);e._specularEnvironmentCubeMap=n,e._removeErrorListener=n.errorEvent.addEventListener(i=>{console.error(`Error loading specularEnvironmentMaps: ${i}`)})}e._shouldRegenerateShaders=!0}}XI.prototype.update=function(e){if(e.frameNumber===this._previousFrameNumber)return;this._previousFrameNumber=e.frameNumber;let t=e.context;e.brdfLutGenerator.update(e),this._shouldRegenerateShaders=!1;let n=this._imageBasedLightingFactor,i=this._previousImageBasedLightingFactor;D.equals(n,i)||(this._shouldRegenerateShaders=n.x>0&&i.x===0||n.x===0&&i.x>0,this._shouldRegenerateShaders=this._shouldRegenerateShaders||n.y>0&&i.y===0||n.y===0&&i.y>0,this._previousImageBasedLightingFactor=D.clone(this._imageBasedLightingFactor,this._previousImageBasedLightingFactor)),this._previousSphericalHarmonicCoefficients!==this._sphericalHarmonicCoefficients&&(this._shouldRegenerateShaders=this._shouldRegenerateShaders||l(this._previousSphericalHarmonicCoefficients)!==l(this._sphericalHarmonicCoefficients),this._previousSphericalHarmonicCoefficients=this._sphericalHarmonicCoefficients),this._shouldRegenerateShaders=this._shouldRegenerateShaders||this._previousSpecularEnvironmentMapLoaded!==this._specularEnvironmentMapLoaded,this._previousSpecularEnvironmentMapLoaded=this._specularEnvironmentMapLoaded,this._specularEnvironmentCubeMapDirty&&(xPe(this,t),this._specularEnvironmentCubeMapDirty=!1),l(this._specularEnvironmentCubeMap)&&(this._specularEnvironmentCubeMap.update(e),this._specularEnvironmentCubeMap.ready&&(this._specularEnvironmentMapLoaded=!0));let o=!l(this._specularEnvironmentCubeMap)&&l(e.specularEnvironmentMaps)&&!this._useDefaultSpecularMaps,r=!l(e.specularEnvironmentMaps)&&this._useDefaultSpecularMaps,s=!l(this._sphericalHarmonicCoefficients)&&l(e.sphericalHarmonicCoefficients)&&!this._useDefaultSphericalHarmonics,a=!l(e.sphericalHarmonicCoefficients)&&this._useDefaultSphericalHarmonics;this._shouldRegenerateShaders=this._shouldRegenerateShaders||o||r||s||a,this._useDefaultSpecularMaps=!l(this._specularEnvironmentCubeMap)&&l(e.specularEnvironmentMaps),this._useDefaultSphericalHarmonics=!l(this._sphericalHarmonicCoefficients)&&l(e.sphericalHarmonicCoefficients)};XI.prototype.isDestroyed=function(){return!1};XI.prototype.destroy=function(){return this._specularEnvironmentCubeMap=this._specularEnvironmentCubeMap&&this._specularEnvironmentCubeMap.destroy(),this._removeErrorListener=this._removeErrorListener&&this._removeErrorListener(),me(this)};var t_=XI;var Ien=T(S(),1),yH=T(ud(),1);var Sen=T(S(),1);var gH,Yie="eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJqdGkiOiJiNTZhYmEzOS1hNmFhLTQ1OTAtODk0Mi1lM2U3M2FlMjIxZTMiLCJpZCI6MjU5LCJpYXQiOjE3NDEwMTMyNzF9.J_SThPuEuresJ_TioZat6GbGcDLEruo269cV5QQxiqM",R5={};R5.defaultAccessToken=Yie;R5.defaultServer=new Re({url:"https://api.cesium.com/"});R5.getDefaultTokenCredit=function(e){if(e===Yie){if(!l(gH)){let t=` This application is using Cesium's default ion access token. Please assign Cesium.Ion.defaultAccessToken with an access token from your ion account before making any Cesium API calls. You can sign up for a free ion account at https://cesium.com.`;gH=new Rt(t,!0)}return gH}};var zm=R5;function Jc(e,t){let n,i=e.externalType,o=l(i);if(!o)n={url:e.url,retryAttempts:1,retryCallback:_Pe};else if(i==="3DTILES"||i==="STK_TERRAIN_SERVER")n={url:e.options.url};else throw new ce("Ion.createResource does not support external imagery assets; use IonImageryProvider instead.");Re.call(this,n),this._ionEndpoint=e,this._ionEndpointDomain=o?void 0:new yH.default(e.url).authority(),this._ionEndpointResource=t,this._ionRoot=void 0,this._pendingPromise=void 0,this._credits=void 0,this._isExternal=o}l(Object.create)&&(Jc.prototype=Object.create(Re.prototype),Jc.prototype.constructor=Jc);Jc.fromAssetId=function(e,t){let n=Jc._createEndpointResource(e,t);return n.fetchJson().then(function(i){return new Jc(i,n)})};Object.defineProperties(Jc.prototype,{credits:{get:function(){return l(this._ionRoot)?this._ionRoot.credits:l(this._credits)?this._credits:(this._credits=Jc.getCreditsFromEndpoint(this._ionEndpoint,this._ionEndpointResource),this._credits)}}});Jc.getCreditsFromEndpoint=function(e,t){let n=e.attributions.map(Rt.getIonCredit),i=zm.getDefaultTokenCredit(t.queryParameters.access_token);return l(i)&&n.push(Rt.clone(i)),n};Jc.prototype.clone=function(e){let t=y(this._ionRoot,this);return l(e)||(e=new Jc(t._ionEndpoint,t._ionEndpointResource)),e=Re.prototype.clone.call(this,e),e._ionRoot=t,e._isExternal=this._isExternal,e};Jc.prototype.fetchImage=function(e){if(!this._isExternal){let t=e;e={preferBlob:!0},l(t)&&(e.flipY=t.flipY,e.preferImageBitmap=t.preferImageBitmap)}return Re.prototype.fetchImage.call(this,e)};Jc.prototype._makeRequest=function(e){return this._isExternal||new yH.default(this.url).authority()!==this._ionEndpointDomain?Re.prototype._makeRequest.call(this,e):(l(e.headers)||(e.headers={}),e.headers.Authorization=`Bearer ${this._ionEndpoint.accessToken}`,e.headers["X-Cesium-Client"]="CesiumJS",typeof CESIUM_VERSION<"u"&&(e.headers["X-Cesium-Client-Version"]=CESIUM_VERSION),Re.prototype._makeRequest.call(this,e))};Jc._createEndpointResource=function(e,t){t=y(t,y.EMPTY_OBJECT);let n=y(t.server,zm.defaultServer),i=y(t.accessToken,zm.defaultAccessToken);n=Re.createIfNeeded(n);let o={url:`v1/assets/${e}/endpoint`};return l(i)&&(o.queryParameters={access_token:i}),n.getDerivedResource(o)};function _Pe(e,t){let n=y(e._ionRoot,e),i=n._ionEndpointResource,o=typeof Image<"u";return!l(t)||t.statusCode!==401&&!(o&&t.target instanceof Image)?Promise.resolve(!1):(l(n._pendingPromise)||(n._pendingPromise=i.fetchJson().then(function(r){return n._ionEndpoint=r,r}).finally(function(r){return n._pendingPromise=void 0,r})),n._pendingPromise.then(function(r){return e._ionEndpoint=r,!0}))}var xd=Jc;var Pen=T(S(),1);function xf(e){e=y(e,0),this._array=new Array(e),this._length=e}Object.defineProperties(xf.prototype,{length:{get:function(){return this._length},set:function(e){let t=this._array,n=this._length;if(et.length&&(t.length=e);this._length=e}},values:{get:function(){return this._array}}});xf.prototype.get=function(e){return this._array[e]};xf.prototype.set=function(e,t){e>=this._length&&(this.length=e+1),this._array[e]=t};xf.prototype.peek=function(){return this._array[this._length-1]};xf.prototype.push=function(e){let t=this.length++;this._array[t]=e};xf.prototype.pop=function(){if(this._length===0)return;let e=this._array[this._length-1];return--this.length,e};xf.prototype.reserve=function(e){e>this._array.length&&(this._array.length=e)};xf.prototype.resize=function(e){this.length=e};xf.prototype.trim=function(e){e=y(e,this._length),this._array.length=e};var Qc=xf;var Aen=T(S(),1);function Z5(e){e=y(e,y.EMPTY_OBJECT),this.color=e.color,this.depth=e.depth,this.stencil=e.stencil,this.renderState=e.renderState,this.framebuffer=e.framebuffer,this.owner=e.owner,this.pass=e.pass}Z5.ALL=Object.freeze(new Z5({color:new B(0,0,0,0),depth:1,stencil:0}));Z5.prototype.execute=function(e,t){e.clear(this,t)};var ai=Z5;var Uen=T(S(),1);var Jp={X:0,Y:1,Z:2};Jp.Y_UP_TO_Z_UP=M.fromRotationTranslation($.fromArray([1,0,0,0,0,1,0,-1,0]));Jp.Z_UP_TO_Y_UP=M.fromRotationTranslation($.fromArray([1,0,0,0,0,-1,0,1,0]));Jp.X_UP_TO_Z_UP=M.fromRotationTranslation($.fromArray([0,0,1,0,1,0,-1,0,0]));Jp.Z_UP_TO_X_UP=M.fromRotationTranslation($.fromArray([0,0,-1,0,1,0,1,0,0]));Jp.X_UP_TO_Y_UP=M.fromRotationTranslation($.fromArray([0,1,0,-1,0,0,0,0,1]));Jp.Y_UP_TO_X_UP=M.fromRotationTranslation($.fromArray([0,-1,0,1,0,0,0,0,1]));Jp.fromName=function(e){return Jp[e]};var wo=Object.freeze(Jp);var _3n=T(S(),1);var Jen=T(S(),1);function Gu(e){this.planes=y(e,[])}var WI=[new m,new m,new m];m.clone(m.UNIT_X,WI[0]);m.clone(m.UNIT_Y,WI[1]);m.clone(m.UNIT_Z,WI[2]);var rg=new m,TPe=new m,Hie=new cn(new m(1,0,0),0);Gu.fromBoundingSphere=function(e,t){l(t)||(t=new Gu);let n=WI.length,i=t.planes;i.length=2*n;let o=e.center,r=e.radius,s=0;for(let a=0;a>10)+55296,(r&1023)+56320))}return t};function PI(e,t,n){return t<=e&&e<=n}function LPe(e){let t=0,n=0,i=0,o=128,r=191,s=[],a=e.length;for(let c=0;c0){let o=Math.min(t,Mt.maximumTextureSize),r=Math.ceil(t/Mt.maximumTextureSize),s=1/o,a=s*.5,c=1/r,d=c*.5;n=new D(o,r),i=new re(s,a,c,d)}this._translucentFeaturesLength=0,this._featuresLength=t,this._textureDimensions=n,this._textureStep=i,this._owner=e.owner,this._statistics=e.statistics,this._colorChangedCallback=e.colorChangedCallback}Object.defineProperties(dc.prototype,{translucentFeaturesLength:{get:function(){return this._translucentFeaturesLength}},byteLength:{get:function(){let e=0;return l(this._pickTexture)&&(e+=this._pickTexture.sizeInBytes),l(this._batchTexture)&&(e+=this._batchTexture.sizeInBytes),e}},textureDimensions:{get:function(){return this._textureDimensions}},textureStep:{get:function(){return this._textureStep}},batchTexture:{get:function(){return this._batchTexture}},defaultTexture:{get:function(){return this._defaultTexture}},pickTexture:{get:function(){return this._pickTexture}}});dc.DEFAULT_COLOR_VALUE=B.WHITE;dc.DEFAULT_SHOW_VALUE=!0;function Jie(e){let t=e._textureDimensions;return t.x*t.y*4}function Qie(e){if(!l(e._batchValues)){let t=Jie(e),n=new Uint8Array(t).fill(255);e._batchValues=n}return e._batchValues}function jie(e){if(!l(e._showAlphaProperties)){let t=2*e._featuresLength,n=new Uint8Array(t).fill(255);e._showAlphaProperties=n}return e._showAlphaProperties}dc.prototype.setShow=function(e,t){if(t&&!l(this._showAlphaProperties))return;let n=jie(this),i=e*2,o=t?255:0;if(n[i]!==o){n[i]=o;let r=Qie(this),s=e*4+3;r[s]=t?n[i+1]:0,this._batchValuesDirty=!0}};dc.prototype.setAllShow=function(e){let t=this._featuresLength;for(let n=0;n0){let i=e._pickIds,o=Jie(e),r=new Uint8Array(o),s=e._owner,a=e._statistics;for(let c=0;c0;){if(t=u.pop(),c[t]===d)continue;c[t]=d;let h=n(e,t);if(l(h))return h;let p=o[t],g=s[t];for(let f=0;f0?(s="",e&&(s+=`uniform bool tile_translucentCommand; `),s+=`uniform sampler2D tile_batchTexture; out vec4 tile_featureColor; out vec2 tile_featureSt; void main() { vec2 st = computeSt(${t}); vec4 featureProperties = texture(tile_batchTexture, st); tile_color(featureProperties); float show = ceil(featureProperties.a); gl_Position *= show; `,e&&(s+=` bool isStyleTranslucent = (featureProperties.a != 1.0); if (czm_pass == czm_passTranslucent) { if (!isStyleTranslucent && !tile_translucentCommand) { gl_Position *= 0.0; } } else { if (isStyleTranslucent) { gl_Position *= 0.0; } } `),s+=` tile_featureColor = featureProperties; tile_featureSt = st; }`):s=`out vec2 tile_featureSt; void main() { tile_color(vec4(1.0)); tile_featureSt = computeSt(${t}); }`,`${r} ${jPe(i)}${s}`}};function $ie(e,t){return e=De.replaceMain(e,"tile_main"),t?`${e}uniform float tile_colorBlend; void tile_color(vec4 tile_featureColor) { tile_main(); tile_featureColor = czm_gammaCorrect(tile_featureColor); out_FragColor.a *= tile_featureColor.a; float highlight = ceil(tile_colorBlend); out_FragColor.rgb *= mix(tile_featureColor.rgb, vec3(1.0), highlight); } `:`${e}void tile_color(vec4 tile_featureColor) { tile_main(); } `}function qPe(e,t){let n=`texture(${t}`,i=0,o=e.indexOf(n,i),r;for(;o>-1;){let s=0;for(let d=o;d0?(i+=`uniform sampler2D tile_pickTexture; in vec2 tile_featureSt; in vec4 tile_featureColor; void main() { tile_color(tile_featureColor); `,n&&(i+=` out_FragColor.rgb *= out_FragColor.a; `),i+="}"):(e&&(i+=`uniform bool tile_translucentCommand; `),i+=`uniform sampler2D tile_pickTexture; uniform sampler2D tile_batchTexture; in vec2 tile_featureSt; void main() { vec4 featureProperties = texture(tile_batchTexture, tile_featureSt); if (featureProperties.a == 0.0) { discard; } `,e&&(i+=` bool isStyleTranslucent = (featureProperties.a != 1.0); if (czm_pass == czm_passTranslucent) { if (!isStyleTranslucent && !tile_translucentCommand) { discard; } } else { if (isStyleTranslucent) { discard; } } `),i+=` tile_color(featureProperties); `,n&&(i+=` out_FragColor.rgb *= out_FragColor.a; `),i+=`} `),i}};go.prototype.getClassificationFragmentShaderCallback=function(){if(this.featuresLength!==0)return function(e){return e=De.replaceMain(e,"tile_main"),Mt.maximumVertexTextureImageUnits>0?e+=`uniform sampler2D tile_pickTexture; in vec2 tile_featureSt; in vec4 tile_featureColor; void main() { tile_main(); out_FragColor = tile_featureColor; out_FragColor.rgb *= out_FragColor.a; }`:e+=`uniform sampler2D tile_batchTexture; uniform sampler2D tile_pickTexture; in vec2 tile_featureSt; void main() { tile_main(); vec4 featureProperties = texture(tile_batchTexture, tile_featureSt); if (featureProperties.a == 0.0) { discard; } out_FragColor = featureProperties; out_FragColor.rgb *= out_FragColor.a; } `,e}};function $Pe(e){let t=e._content.tileset,n=t.colorBlendMode,i=t.colorBlendAmount;if(n===Pl.HIGHLIGHT)return 0;if(n===Pl.REPLACE)return 1;if(n===Pl.MIX)return W.clamp(i,W.EPSILON4,1)}go.prototype.getUniformMapCallback=function(){if(this.featuresLength===0)return;let e=this;return function(t){return Lt(t,{tile_batchTexture:function(){return y(e._batchTexture.batchTexture,e._batchTexture.defaultTexture)},tile_textureDimensions:function(){return e._batchTexture.textureDimensions},tile_textureStep:function(){return e._batchTexture.textureStep},tile_colorBlend:function(){return $Pe(e)},tile_pickTexture:function(){return e._batchTexture.pickTexture}})}};go.prototype.getPickId=function(){return"texture(tile_pickTexture, tile_featureSt)"};var cg={ALL_OPAQUE:0,ALL_TRANSLUCENT:1,OPAQUE_AND_TRANSLUCENT:2};go.prototype.addDerivedCommands=function(e,t){let n=e.commandList,i=n.length,o=this._content._tile,r=o._finalResolution,s=o.tileset,a=s.isSkippingLevelOfDetail&&s.hasMixedContent&&e.context.stencilBuffer,c=eve(this);for(let d=t;d>>Dt.SKIP_LOD_BIT_SHIFT}function cve(e){let t=Oe(e,!0);return t.cull.enabled=!1,t.depthTest.enabled=!0,t.depthMask=!1,t.blending=hn.ALPHA_BLEND,t.stencilTest=Dt.setCesium3DTileBit(),t.stencilMask=Dt.CESIUM_3D_TILE_MASK,Ue.fromCache(t)}function lve(e){let t=Oe(e,!0);return t.stencilTest=Dt.setCesium3DTileBit(),t.stencilMask=Dt.CESIUM_3D_TILE_MASK,Ue.fromCache(t)}go.prototype.update=function(e,t){this._batchTexture.update(e,t)};go.prototype.isDestroyed=function(){return!1};go.prototype.destroy=function(){return this._batchTexture=this._batchTexture&&this._batchTexture.destroy(),me(this)};var jp=go;var jin=T(S(),1);var knn=T(S(),1);function dve(e){this.offset=e.offset,this.count=e.count,this.color=e.color,this.batchIds=e.batchIds}var Tf=dve;var Min=T(S(),1);var Dnn=T(S(),1),EC=`in vec3 position; in float a_batchId; uniform mat4 u_modifiedModelViewProjection; void main() { gl_Position = czm_depthClamp(u_modifiedModelViewProjection * vec4(position, 1.0)); } `;var Hnn=T(S(),1);function Iu(e,t){this._content=e,this._batchId=t,this._color=void 0}Object.defineProperties(Iu.prototype,{show:{get:function(){return this._content.batchTable.getShow(this._batchId)},set:function(e){this._content.batchTable.setShow(this._batchId,e)}},color:{get:function(){return l(this._color)||(this._color=new B),this._content.batchTable.getColor(this._batchId,this._color)},set:function(e){this._content.batchTable.setColor(this._batchId,e)}},polylinePositions:{get:function(){if(l(this._content.getPolylinePositions))return this._content.getPolylinePositions(this._batchId)}},content:{get:function(){return this._content}},tileset:{get:function(){return this._content.tileset}},primitive:{get:function(){return this._content.tileset}},featureId:{get:function(){return this._batchId}},pickId:{get:function(){return this._content.batchTable.getPickColor(this._batchId)}}});Iu.prototype.hasProperty=function(e){return this._content.batchTable.hasProperty(this._batchId,e)};Iu.prototype.getPropertyIds=function(e){return this._content.batchTable.getPropertyIds(this._batchId,e)};Iu.prototype.getProperty=function(e){return this._content.batchTable.getProperty(this._batchId,e)};Iu.getPropertyInherited=function(e,t,n){let i=e.batchTable;if(l(i)){if(i.hasPropertyBySemantic(t,n))return i.getPropertyBySemantic(t,n);if(i.hasProperty(t,n))return i.getProperty(t,n)}let o=e.metadata;if(l(o)){if(o.hasPropertyBySemantic(n))return o.getPropertyBySemantic(n);if(o.hasProperty(n))return o.getProperty(n)}let r=e.tile,s=r.metadata;if(l(s)){if(s.hasPropertyBySemantic(n))return s.getPropertyBySemantic(n);if(s.hasProperty(n))return s.getProperty(n)}let a;if(l(r.implicitSubtree)&&(a=r.implicitSubtree.metadata),l(a)){if(a.hasPropertyBySemantic(n))return a.getPropertyBySemantic(n);if(a.hasProperty(n))return a.getProperty(n)}let c=l(e.group)?e.group.metadata:void 0;if(l(c)){if(c.hasPropertyBySemantic(n))return c.getPropertyBySemantic(n);if(c.hasProperty(n))return c.getProperty(n)}let d=e.tileset.metadata;if(l(d)){if(d.hasPropertyBySemantic(n))return d.getPropertyBySemantic(n);if(d.hasProperty(n))return d.getProperty(n)}};Iu.prototype.getPropertyInherited=function(e){return Iu.getPropertyInherited(this._content,this._batchId,e)};Iu.prototype.setProperty=function(e,t){this._content.batchTable.setProperty(this._batchId,e,t),this._content.featurePropertiesDirty=!0};Iu.prototype.isExactClass=function(e){return this._content.batchTable.isExactClass(this._batchId,e)};Iu.prototype.isClass=function(e){return this._content.batchTable.isClass(this._batchId,e)};Iu.prototype.getExactClassName=function(){return this._content.batchTable.getExactClassName(this._batchId)};var Hs=Iu;var cin=T(S(),1);var Jnn=T(S(),1),SH=class{add(t,n,i){if(typeof arguments[0]!="string")for(let o in arguments[0])this.add(o,arguments[0][o],arguments[1]);else(Array.isArray(t)?t:[t]).forEach(function(o){this[o]=this[o]||[],n&&this[o][i?"unshift":"push"](n)},this)}run(t,n){this[t]=this[t]||[],this[t].forEach(function(i){i.call(n&&n.context?n.context:n,n)})}},CH=class{constructor(t){this.jsep=t,this.registered={}}register(...t){t.forEach(n=>{if(typeof n!="object"||!n.name||!n.init)throw new Error("Invalid JSEP plugin format");this.registered[n.name]||(n.init(this.jsep),this.registered[n.name]=n)})}},vl=class e{static get version(){return"1.4.0"}static toString(){return"JavaScript Expression Parser (JSEP) v"+e.version}static addUnaryOp(t){return e.max_unop_len=Math.max(t.length,e.max_unop_len),e.unary_ops[t]=1,e}static addBinaryOp(t,n,i){return e.max_binop_len=Math.max(t.length,e.max_binop_len),e.binary_ops[t]=n,i?e.right_associative.add(t):e.right_associative.delete(t),e}static addIdentifierChar(t){return e.additional_identifier_chars.add(t),e}static addLiteral(t,n){return e.literals[t]=n,e}static removeUnaryOp(t){return delete e.unary_ops[t],t.length===e.max_unop_len&&(e.max_unop_len=e.getMaxKeyLen(e.unary_ops)),e}static removeAllUnaryOps(){return e.unary_ops={},e.max_unop_len=0,e}static removeIdentifierChar(t){return e.additional_identifier_chars.delete(t),e}static removeBinaryOp(t){return delete e.binary_ops[t],t.length===e.max_binop_len&&(e.max_binop_len=e.getMaxKeyLen(e.binary_ops)),e.right_associative.delete(t),e}static removeAllBinaryOps(){return e.binary_ops={},e.max_binop_len=0,e}static removeLiteral(t){return delete e.literals[t],e}static removeAllLiterals(){return e.literals={},e}get char(){return this.expr.charAt(this.index)}get code(){return this.expr.charCodeAt(this.index)}constructor(t){this.expr=t,this.index=0}static parse(t){return new e(t).parse()}static getMaxKeyLen(t){return Math.max(0,...Object.keys(t).map(n=>n.length))}static isDecimalDigit(t){return t>=48&&t<=57}static binaryPrecedence(t){return e.binary_ops[t]||0}static isIdentifierStart(t){return t>=65&&t<=90||t>=97&&t<=122||t>=128&&!e.binary_ops[String.fromCharCode(t)]||e.additional_identifier_chars.has(String.fromCharCode(t))}static isIdentifierPart(t){return e.isIdentifierStart(t)||e.isDecimalDigit(t)}throwError(t){let n=new Error(t+" at character "+this.index);throw n.index=this.index,n.description=t,n}runHook(t,n){if(e.hooks[t]){let i={context:this,node:n};return e.hooks.run(t,i),i.node}return n}searchHook(t){if(e.hooks[t]){let n={context:this};return e.hooks[t].find(function(i){return i.call(n.context,n),n.node}),n.node}}gobbleSpaces(){let t=this.code;for(;t===e.SPACE_CODE||t===e.TAB_CODE||t===e.LF_CODE||t===e.CR_CODE;)t=this.expr.charCodeAt(++this.index);this.runHook("gobble-spaces")}parse(){this.runHook("before-all");let t=this.gobbleExpressions(),n=t.length===1?t[0]:{type:e.COMPOUND,body:t};return this.runHook("after-all",n)}gobbleExpressions(t){let n=[],i,o;for(;this.index0;){if(e.binary_ops.hasOwnProperty(t)&&(!e.isIdentifierStart(this.code)||this.index+t.lengthr.right_a&&h.right_a?i>h.prec:i<=h.prec;for(;o.length>2&&u(o[o.length-2]);)a=o.pop(),n=o.pop().value,s=o.pop(),t={type:e.BINARY_EXP,operator:n,left:s,right:a},o.push(t);t=this.gobbleToken(),t||this.throwError("Expected expression after "+d),o.push(r,t)}for(c=o.length-1,t=o[c];c>1;)t={type:e.BINARY_EXP,operator:o[c-1].value,left:o[c-2],right:t},c-=2;return t}gobbleToken(){let t,n,i,o;if(this.gobbleSpaces(),o=this.searchHook("gobble-token"),o)return this.runHook("after-token",o);if(t=this.code,e.isDecimalDigit(t)||t===e.PERIOD_CODE)return this.gobbleNumericLiteral();if(t===e.SQUOTE_CODE||t===e.DQUOTE_CODE)o=this.gobbleStringLiteral();else if(t===e.OBRACK_CODE)o=this.gobbleArray();else{for(n=this.expr.substr(this.index,e.max_unop_len),i=n.length;i>0;){if(e.unary_ops.hasOwnProperty(n)&&(!e.isIdentifierStart(this.code)||this.index+n.length=n.length&&this.throwError("Unexpected token "+String.fromCharCode(t));break}else if(r===e.COMMA_CODE){if(this.index++,o++,o!==n.length){if(t===e.CPAREN_CODE)this.throwError("Unexpected token ,");else if(t===e.CBRACK_CODE)for(let s=n.length;s":7,"<=":7,">=":7,"<<":8,">>":8,">>>":8,"+":9,"-":9,"*":10,"/":10,"%":10,"**":11},right_associative:new Set(["**"]),additional_identifier_chars:new Set(["$","_"]),literals:{true:!0,false:!1,null:null},this_str:"this"});vl.max_unop_len=vl.getMaxKeyLen(vl.unary_ops);vl.max_binop_len=vl.getMaxKeyLen(vl.binary_ops);var lg=e=>new vl(e).parse(),mve=Object.getOwnPropertyNames(class{});Object.getOwnPropertyNames(vl).filter(e=>!mve.includes(e)&&lg[e]===void 0).forEach(e=>{lg[e]=vl[e]});lg.Jsep=vl;var hve="ConditionalExpression",fve={name:"ternary",init(e){e.hooks.add("after-expression",function(n){if(n.node&&this.code===e.QUMARK_CODE){this.index++;let i=n.node,o=this.gobbleExpression();if(o||this.throwError("Expected expression"),this.gobbleSpaces(),this.code===e.COLON_CODE){this.index++;let r=this.gobbleExpression();if(r||this.throwError("Expected expression"),n.node={type:hve,test:i,consequent:o,alternate:r},i.operator&&e.binary_ops[i.operator]<=.9){let s=i;for(;s.right.operator&&e.binary_ops[s.right.operator]<=.9;)s=s.right;n.node.test=s.right,s.right=n.node,n.node=i}}else this.throwError("Expected :")}})}};lg.plugins.register(fve);var jnn=T(S(),1),pve={VARIABLE:0,UNARY:1,BINARY:2,TERNARY:3,CONDITIONAL:4,MEMBER:5,FUNCTION_CALL:6,ARRAY:7,REGEX:8,VARIABLE_IN_STRING:9,LITERAL_NULL:10,LITERAL_BOOLEAN:11,LITERAL_NUMBER:12,LITERAL_STRING:13,LITERAL_COLOR:14,LITERAL_VECTOR:15,LITERAL_REGEX:16,LITERAL_UNDEFINED:17,BUILTIN_VARIABLE:18},yt=Object.freeze(pve);function Jm(e,t){this._expression=e,e=Gve(e,t),e=Ive(Eve(e)),lg.addBinaryOp("=~",0),lg.addBinaryOp("!~",0);let n;try{n=lg(e)}catch(i){throw new ce(i)}this._runtimeAst=Vi(this,n)}Object.defineProperties(Jm.prototype,{expression:{get:function(){return this._expression}}});var vn={arrayIndex:0,arrayArray:[[]],cartesian2Index:0,cartesian3Index:0,cartesian4Index:0,cartesian2Array:[new D],cartesian3Array:[new m],cartesian4Array:[new re],reset:function(){this.arrayIndex=0,this.cartesian2Index=0,this.cartesian3Index=0,this.cartesian4Index=0},getArray:function(){this.arrayIndex>=this.arrayArray.length&&this.arrayArray.push([]);let e=this.arrayArray[this.arrayIndex++];return e.length=0,e},getCartesian2:function(){return this.cartesian2Index>=this.cartesian2Array.length&&this.cartesian2Array.push(new D),this.cartesian2Array[this.cartesian2Index++]},getCartesian3:function(){return this.cartesian3Index>=this.cartesian3Array.length&&this.cartesian3Array.push(new m),this.cartesian3Array[this.cartesian3Index++]},getCartesian4:function(){return this.cartesian4Index>=this.cartesian4Array.length&&this.cartesian4Array.push(new re),this.cartesian4Array[this.cartesian4Index++]}};Jm.prototype.evaluate=function(e,t){vn.reset();let n=this._runtimeAst.evaluate(e);return t instanceof B&&n instanceof re?B.fromCartesian4(n,t):n instanceof D||n instanceof m||n instanceof re?n.clone(t):n};Jm.prototype.evaluateColor=function(e,t){vn.reset();let n=this._runtimeAst.evaluate(e);return B.fromCartesian4(n,t)};Jm.prototype.getShaderFunction=function(e,t,n,i){let o=this.getShaderExpression(t,n);return o=`${i} ${e} { return ${o}; } `,o};Jm.prototype.getShaderExpression=function(e,t){return this._runtimeAst.getShaderExpression(e,t)};Jm.prototype.getVariables=function(){let e=[];return this._runtimeAst.getVariables(e),e=e.filter(function(t,n,i){return i.indexOf(t)===n}),e};var bve=["!","-","+"],noe=["+","-","*","/","%","===","!==",">",">=","<","<=","&&","||","!~","=~"],AI=/\${(.*?)}/g,gve=/\\/g,yve="@#%",xve=/@#%/g,I5=new B,X5={abs:zs(Math.abs),sqrt:zs(Math.sqrt),cos:zs(Math.cos),sin:zs(Math.sin),tan:zs(Math.tan),acos:zs(Math.acos),asin:zs(Math.asin),atan:zs(Math.atan),radians:zs(W.toRadians),degrees:zs(W.toDegrees),sign:zs(W.sign),floor:zs(Math.floor),ceil:zs(Math.ceil),round:zs(Math.round),exp:zs(Math.exp),exp2:zs(Tve),log:zs(Math.log),log2:zs(Sve),fract:zs(_ve),length:Cve,normalize:Vve},W5={atan2:G5(Math.atan2,!1),pow:G5(Math.pow,!1),min:G5(Math.min,!0),max:G5(Math.max,!0),distance:Lve,dot:Rve,cross:Zve},RH={clamp:ioe(W.clamp,!0),mix:ioe(W.lerp,!0)};function _ve(e){return e-Math.floor(e)}function Tve(e){return Math.pow(2,e)}function Sve(e){return W.log2(e)}function zs(e){return function(t,n){if(typeof n=="number")return e(n);if(n instanceof D)return D.fromElements(e(n.x),e(n.y),vn.getCartesian2());if(n instanceof m)return m.fromElements(e(n.x),e(n.y),e(n.z),vn.getCartesian3());if(n instanceof re)return re.fromElements(e(n.x),e(n.y),e(n.z),e(n.w),vn.getCartesian4());throw new ce(`Function "${t}" requires a vector or number argument. Argument is ${n}.`)}}function G5(e,t){return function(n,i,o){if(t&&typeof o=="number"){if(typeof i=="number")return e(i,o);if(i instanceof D)return D.fromElements(e(i.x,o),e(i.y,o),vn.getCartesian2());if(i instanceof m)return m.fromElements(e(i.x,o),e(i.y,o),e(i.z,o),vn.getCartesian3());if(i instanceof re)return re.fromElements(e(i.x,o),e(i.y,o),e(i.z,o),e(i.w,o),vn.getCartesian4())}if(typeof i=="number"&&typeof o=="number")return e(i,o);if(i instanceof D&&o instanceof D)return D.fromElements(e(i.x,o.x),e(i.y,o.y),vn.getCartesian2());if(i instanceof m&&o instanceof m)return m.fromElements(e(i.x,o.x),e(i.y,o.y),e(i.z,o.z),vn.getCartesian3());if(i instanceof re&&o instanceof re)return re.fromElements(e(i.x,o.x),e(i.y,o.y),e(i.z,o.z),e(i.w,o.w),vn.getCartesian4());throw new ce(`Function "${n}" requires vector or number arguments of matching types. Arguments are ${i} and ${o}.`)}}function ioe(e,t){return function(n,i,o,r){if(t&&typeof r=="number"){if(typeof i=="number"&&typeof o=="number")return e(i,o,r);if(i instanceof D&&o instanceof D)return D.fromElements(e(i.x,o.x,r),e(i.y,o.y,r),vn.getCartesian2());if(i instanceof m&&o instanceof m)return m.fromElements(e(i.x,o.x,r),e(i.y,o.y,r),e(i.z,o.z,r),vn.getCartesian3());if(i instanceof re&&o instanceof re)return re.fromElements(e(i.x,o.x,r),e(i.y,o.y,r),e(i.z,o.z,r),e(i.w,o.w,r),vn.getCartesian4())}if(typeof i=="number"&&typeof o=="number"&&typeof r=="number")return e(i,o,r);if(i instanceof D&&o instanceof D&&r instanceof D)return D.fromElements(e(i.x,o.x,r.x),e(i.y,o.y,r.y),vn.getCartesian2());if(i instanceof m&&o instanceof m&&r instanceof m)return m.fromElements(e(i.x,o.x,r.x),e(i.y,o.y,r.y),e(i.z,o.z,r.z),vn.getCartesian3());if(i instanceof re&&o instanceof re&&r instanceof re)return re.fromElements(e(i.x,o.x,r.x),e(i.y,o.y,r.y),e(i.z,o.z,r.z),e(i.w,o.w,r.w),vn.getCartesian4());throw new ce(`Function "${n}" requires vector or number arguments of matching types. Arguments are ${i}, ${o}, and ${r}.`)}}function Cve(e,t){if(typeof t=="number")return Math.abs(t);if(t instanceof D)return D.magnitude(t);if(t instanceof m)return m.magnitude(t);if(t instanceof re)return re.magnitude(t);throw new ce(`Function "${e}" requires a vector or number argument. Argument is ${t}.`)}function Vve(e,t){if(typeof t=="number")return 1;if(t instanceof D)return D.normalize(t,vn.getCartesian2());if(t instanceof m)return m.normalize(t,vn.getCartesian3());if(t instanceof re)return re.normalize(t,vn.getCartesian4());throw new ce(`Function "${e}" requires a vector or number argument. Argument is ${t}.`)}function Lve(e,t,n){if(typeof t=="number"&&typeof n=="number")return Math.abs(t-n);if(t instanceof D&&n instanceof D)return D.distance(t,n);if(t instanceof m&&n instanceof m)return m.distance(t,n);if(t instanceof re&&n instanceof re)return re.distance(t,n);throw new ce(`Function "${e}" requires vector or number arguments of matching types. Arguments are ${t} and ${n}.`)}function Rve(e,t,n){if(typeof t=="number"&&typeof n=="number")return t*n;if(t instanceof D&&n instanceof D)return D.dot(t,n);if(t instanceof m&&n instanceof m)return m.dot(t,n);if(t instanceof re&&n instanceof re)return re.dot(t,n);throw new ce(`Function "${e}" requires vector or number arguments of matching types. Arguments are ${t} and ${n}.`)}function Zve(e,t,n){if(t instanceof m&&n instanceof m)return m.cross(t,n,vn.getCartesian3());throw new ce(`Function "${e}" requires vec3 arguments. Arguments are ${t} and ${n}.`)}function Zt(e,t,n,i,o){this._type=e,this._value=t,this._left=n,this._right=i,this._test=o,this.evaluate=void 0,kve(this)}function Gve(e,t){if(!l(t))return e;for(let n in t)if(t.hasOwnProperty(n)){let i=new RegExp(`\\$\\{${n}\\}`,"g"),o=`(${t[n]})`;l(o)&&(e=e.replace(i,o))}return e}function Eve(e){return e.replace(gve,yve)}function LH(e){return e.replace(xve,"\\")}function Ive(e){let t=e,n="",i=t.indexOf("${");for(;i>=0;){let o=t.indexOf("'"),r=t.indexOf('"'),s;if(o>=0&&o=0&&r=0?new Zt(yt.VARIABLE_IN_STRING,e.value):new Zt(yt.LITERAL_STRING,LH(e.value))}function Wve(e,t){let n=t.arguments,i=n.length,o,r,s,a;if(t.callee.type==="MemberExpression"){o=t.callee.property.name;let c=t.callee.object;if(o==="test"||o==="exec"){if(!l(c.callee)||c.callee.name!=="regExp")throw new ce(`${o} is not a function.`);return i===0?o==="test"?new Zt(yt.LITERAL_BOOLEAN,!1):new Zt(yt.LITERAL_NULL,null):(s=Vi(e,c),a=Vi(e,n[0]),new Zt(yt.FUNCTION_CALL,o,s,a))}else if(o==="toString")return r=Vi(e,c),new Zt(yt.FUNCTION_CALL,o,r);throw new ce(`Unexpected function call "${o}".`)}if(o=t.callee.name,o==="color"){if(i===0)return new Zt(yt.LITERAL_COLOR,o);if(r=Vi(e,n[0]),l(n[1])){let c=Vi(e,n[1]);return new Zt(yt.LITERAL_COLOR,o,[r,c])}return new Zt(yt.LITERAL_COLOR,o,[r])}else if(o==="rgb"||o==="hsl"){if(i<3)throw new ce(`${o} requires three arguments.`);return r=[Vi(e,n[0]),Vi(e,n[1]),Vi(e,n[2])],new Zt(yt.LITERAL_COLOR,o,r)}else if(o==="rgba"||o==="hsla"){if(i<4)throw new ce(`${o} requires four arguments.`);return r=[Vi(e,n[0]),Vi(e,n[1]),Vi(e,n[2]),Vi(e,n[3])],new Zt(yt.LITERAL_COLOR,o,r)}else if(o==="vec2"||o==="vec3"||o==="vec4"){r=new Array(i);for(let c=0;c1)throw new ce(`${o} requires exactly one argument.`);return r=Vi(e,n[0]),new Zt(yt.UNARY,o,r)}else if(o==="getExactClassName"){if(i>0)throw new ce(`${o} does not take any argument.`);return new Zt(yt.UNARY,o)}else if(l(X5[o])){if(i!==1)throw new ce(`${o} requires exactly one argument.`);return r=Vi(e,n[0]),new Zt(yt.UNARY,o,r)}else if(l(W5[o])){if(i!==2)throw new ce(`${o} requires exactly two arguments.`);return s=Vi(e,n[0]),a=Vi(e,n[1]),new Zt(yt.BINARY,o,s,a)}else if(l(RH[o])){if(i!==3)throw new ce(`${o} requires exactly three arguments.`);s=Vi(e,n[0]),a=Vi(e,n[1]);let c=Vi(e,n[2]);return new Zt(yt.TERNARY,o,s,a,c)}else{if(o==="Boolean")return i===0?new Zt(yt.LITERAL_BOOLEAN,!1):(r=Vi(e,n[0]),new Zt(yt.UNARY,o,r));if(o==="Number")return i===0?new Zt(yt.LITERAL_NUMBER,0):(r=Vi(e,n[0]),new Zt(yt.UNARY,o,r));if(o==="String")return i===0?new Zt(yt.LITERAL_STRING,""):(r=Vi(e,n[0]),new Zt(yt.UNARY,o,r));if(o==="regExp")return Pve(e,t)}}throw new ce(`Unexpected function call "${o}".`)}function Pve(e,t){let n=t.arguments;if(n.length===0)return new Zt(yt.LITERAL_REGEX,new RegExp);let i=Vi(e,n[0]),o;if(n.length>1){let r=Vi(e,n[1]);if(VH(i)&&VH(r)){try{o=new RegExp(LH(String(i._value)),r._value)}catch(s){throw new ce(s)}return new Zt(yt.LITERAL_REGEX,o)}return new Zt(yt.REGEX,i,r)}if(VH(i)){try{o=new RegExp(LH(String(i._value)))}catch(r){throw new ce(r)}return new Zt(yt.LITERAL_REGEX,o)}return new Zt(yt.REGEX,i)}function vve(e){if(Mve(e.name)){let t=Nve(e.name);return t.substr(0,8)==="tiles3d_"?new Zt(yt.BUILTIN_VARIABLE,t):new Zt(yt.VARIABLE,t)}else{if(e.name==="NaN")return new Zt(yt.LITERAL_NUMBER,NaN);if(e.name==="Infinity")return new Zt(yt.LITERAL_NUMBER,1/0);if(e.name==="undefined")return new Zt(yt.LITERAL_UNDEFINED,void 0)}throw new ce(`${e.name} is not defined.`)}function wve(e){let t=e.property.name;if(t==="PI")return new Zt(yt.LITERAL_NUMBER,Math.PI);if(t==="E")return new Zt(yt.LITERAL_NUMBER,Math.E)}function Fve(e){if(e.property.name==="POSITIVE_INFINITY")return new Zt(yt.LITERAL_NUMBER,Number.POSITIVE_INFINITY)}function Ave(e,t){if(t.object.name==="Math")return wve(t);if(t.object.name==="Number")return Fve(t);let n,i=Vi(e,t.object);return t.computed?(n=Vi(e,t.property),new Zt(yt.MEMBER,"brackets",i,n)):(n=new Zt(yt.LITERAL_STRING,t.property.name),new Zt(yt.MEMBER,"dot",i,n))}function VH(e){return e._type>=yt.LITERAL_NULL}function Mve(e){return e.substr(0,4)==="czm_"}function Nve(e){return e.substr(4)}function Vi(e,t){let n,i,o,r;if(t.type==="Literal")n=Xve(t);else if(t.type==="CallExpression")n=Wve(e,t);else if(t.type==="Identifier")n=vve(t);else if(t.type==="UnaryExpression"){i=t.operator;let s=Vi(e,t.argument);if(bve.indexOf(i)>-1)n=new Zt(yt.UNARY,i,s);else throw new ce(`Unexpected operator "${i}".`)}else if(t.type==="BinaryExpression")if(i=t.operator,o=Vi(e,t.left),r=Vi(e,t.right),noe.indexOf(i)>-1)n=new Zt(yt.BINARY,i,o,r);else throw new ce(`Unexpected operator "${i}".`);else if(t.type==="LogicalExpression")i=t.operator,o=Vi(e,t.left),r=Vi(e,t.right),noe.indexOf(i)>-1&&(n=new Zt(yt.BINARY,i,o,r));else if(t.type==="ConditionalExpression"){let s=Vi(e,t.test);o=Vi(e,t.consequent),r=Vi(e,t.alternate),n=new Zt(yt.CONDITIONAL,"?",o,r,s)}else if(t.type==="MemberExpression")n=Ave(e,t);else if(t.type==="ArrayExpression"){let s=[];for(let a=0;a"?e.evaluate=e._evaluateGreaterThan:e._value===">="?e.evaluate=e._evaluateGreaterThanOrEquals:e._value==="&&"?e.evaluate=e._evaluateAnd:e._value==="||"?e.evaluate=e._evaluateOr:e._value==="=~"?e.evaluate=e._evaluateRegExpMatch:e._value==="!~"?e.evaluate=e._evaluateRegExpNotMatch:l(W5[e._value])&&(e.evaluate=Bve(e._value)):e._type===yt.TERNARY?e.evaluate=Ove(e._value):e._type===yt.MEMBER?e._value==="brackets"?e.evaluate=e._evaluateMemberBrackets:e.evaluate=e._evaluateMemberDot:e._type===yt.ARRAY?e.evaluate=e._evaluateArray:e._type===yt.VARIABLE?e.evaluate=e._evaluateVariable:e._type===yt.VARIABLE_IN_STRING?e.evaluate=e._evaluateVariableString:e._type===yt.LITERAL_COLOR?e.evaluate=e._evaluateLiteralColor:e._type===yt.LITERAL_VECTOR?e.evaluate=e._evaluateLiteralVector:e._type===yt.LITERAL_STRING?e.evaluate=e._evaluateLiteralString:e._type===yt.REGEX?e.evaluate=e._evaluateRegExp:e._type===yt.BUILTIN_VARIABLE?e._value==="tiles3d_tileset_time"&&(e.evaluate=Uve):e.evaluate=e._evaluateLiteral}function Uve(e){return l(e)?e.content.tileset.timeSinceLoad:0}function Dve(e){let t=X5[e];return function(n){let i=this._left.evaluate(n);return t(e,i)}}function Bve(e){let t=W5[e];return function(n){let i=this._left.evaluate(n),o=this._right.evaluate(n);return t(e,i,o)}}function Ove(e){let t=RH[e];return function(n){let i=this._left.evaluate(n),o=this._right.evaluate(n),r=this._test.evaluate(n);return t(e,i,o,r)}}function P5(e,t){if(l(e))return e.getPropertyInherited(t)}Zt.prototype._evaluateLiteral=function(){return this._value};Zt.prototype._evaluateLiteralColor=function(e){let t=I5,n=this._left;if(this._value==="color")l(n)?n.length>1?(B.fromCssColorString(n[0].evaluate(e),t),t.alpha=n[1].evaluate(e)):B.fromCssColorString(n[0].evaluate(e),t):B.fromBytes(255,255,255,255,t);else if(this._value==="rgb")B.fromBytes(n[0].evaluate(e),n[1].evaluate(e),n[2].evaluate(e),255,t);else if(this._value==="rgba"){let i=n[3].evaluate(e)*255;B.fromBytes(n[0].evaluate(e),n[1].evaluate(e),n[2].evaluate(e),i,t)}else this._value==="hsl"?B.fromHsl(n[0].evaluate(e),n[1].evaluate(e),n[2].evaluate(e),1,t):this._value==="hsla"&&B.fromHsl(n[0].evaluate(e),n[1].evaluate(e),n[2].evaluate(e),n[3].evaluate(e),t);return re.fromColor(t,vn.getCartesian4())};Zt.prototype._evaluateLiteralVector=function(e){let t=vn.getArray(),n=this._value,i=this._left,o=i.length;for(let a=0;a1)throw new ce(`Invalid ${n} constructor. Not enough arguments.`);if(r>s&&o>1)throw new ce(`Invalid ${n} constructor. Too many arguments.`);if(r===1){let a=t[0];t.push(a,a,a)}if(n==="vec2")return D.fromArray(t,0,vn.getCartesian2());if(n==="vec3")return m.fromArray(t,0,vn.getCartesian3());if(n==="vec4")return re.fromArray(t,0,vn.getCartesian4())};Zt.prototype._evaluateLiteralString=function(){return this._value};Zt.prototype._evaluateVariableString=function(e){let t=this._value,n=AI.exec(t);for(;n!==null;){let i=n[0],o=n[1],r=P5(e,o);l(r)||(r=""),t=t.replace(i,r),AI.lastIndex+=r.length-i.length,n=AI.exec(t)}return t};Zt.prototype._evaluateVariable=function(e){return P5(e,this._value)};function o_(e){return e._value==="feature"}Zt.prototype._evaluateMemberDot=function(e){if(o_(this._left))return P5(e,this._right.evaluate(e));let t=this._left.evaluate(e);if(!l(t))return;let n=this._right.evaluate(e);if(t instanceof D||t instanceof m||t instanceof re){if(n==="r")return t.x;if(n==="g")return t.y;if(n==="b")return t.z;if(n==="a")return t.w}return t[n]};Zt.prototype._evaluateMemberBrackets=function(e){if(o_(this._left))return P5(e,this._right.evaluate(e));let t=this._left.evaluate(e);if(!l(t))return;let n=this._right.evaluate(e);if(t instanceof D||t instanceof m||t instanceof re){if(n===0||n==="r")return t.x;if(n===1||n==="g")return t.y;if(n===2||n==="b")return t.z;if(n===3||n==="a")return t.w}return t[n]};Zt.prototype._evaluateArray=function(e){let t=[];for(let n=0;n" requires number arguments. Arguments are ${t} and ${n}.`);return t>n};Zt.prototype._evaluateGreaterThanOrEquals=function(e){let t=this._left.evaluate(e),n=this._right.evaluate(e);if(typeof t!="number"||typeof n!="number")throw new ce(`Operator ">=" requires number arguments. Arguments are ${t} and ${n}.`);return t>=n};Zt.prototype._evaluateOr=function(e){let t=this._left.evaluate(e);if(typeof t!="boolean")throw new ce(`Operator "||" requires boolean arguments. First argument is ${t}.`);if(t)return!0;let n=this._right.evaluate(e);if(typeof n!="boolean")throw new ce(`Operator "||" requires boolean arguments. Second argument is ${n}.`);return t||n};Zt.prototype._evaluateAnd=function(e){let t=this._left.evaluate(e);if(typeof t!="boolean")throw new ce(`Operator "&&" requires boolean arguments. First argument is ${t}.`);if(!t)return!1;let n=this._right.evaluate(e);if(typeof n!="boolean")throw new ce(`Operator "&&" requires boolean arguments. Second argument is ${n}.`);return t&&n};Zt.prototype._evaluatePlus=function(e){let t=this._left.evaluate(e),n=this._right.evaluate(e);if(n instanceof D&&t instanceof D)return D.add(t,n,vn.getCartesian2());if(n instanceof m&&t instanceof m)return m.add(t,n,vn.getCartesian3());if(n instanceof re&&t instanceof re)return re.add(t,n,vn.getCartesian4());if(typeof t=="string"||typeof n=="string")return t+n;if(typeof t=="number"&&typeof n=="number")return t+n;throw new ce(`Operator "+" requires vector or number arguments of matching types, or at least one string argument. Arguments are ${t} and ${n}.`)};Zt.prototype._evaluateMinus=function(e){let t=this._left.evaluate(e),n=this._right.evaluate(e);if(n instanceof D&&t instanceof D)return D.subtract(t,n,vn.getCartesian2());if(n instanceof m&&t instanceof m)return m.subtract(t,n,vn.getCartesian3());if(n instanceof re&&t instanceof re)return re.subtract(t,n,vn.getCartesian4());if(typeof t=="number"&&typeof n=="number")return t-n;throw new ce(`Operator "-" requires vector or number arguments of matching types. Arguments are ${t} and ${n}.`)};Zt.prototype._evaluateTimes=function(e){let t=this._left.evaluate(e),n=this._right.evaluate(e);if(n instanceof D&&t instanceof D)return D.multiplyComponents(t,n,vn.getCartesian2());if(n instanceof D&&typeof t=="number")return D.multiplyByScalar(n,t,vn.getCartesian2());if(t instanceof D&&typeof n=="number")return D.multiplyByScalar(t,n,vn.getCartesian2());if(n instanceof m&&t instanceof m)return m.multiplyComponents(t,n,vn.getCartesian3());if(n instanceof m&&typeof t=="number")return m.multiplyByScalar(n,t,vn.getCartesian3());if(t instanceof m&&typeof n=="number")return m.multiplyByScalar(t,n,vn.getCartesian3());if(n instanceof re&&t instanceof re)return re.multiplyComponents(t,n,vn.getCartesian4());if(n instanceof re&&typeof t=="number")return re.multiplyByScalar(n,t,vn.getCartesian4());if(t instanceof re&&typeof n=="number")return re.multiplyByScalar(t,n,vn.getCartesian4());if(typeof t=="number"&&typeof n=="number")return t*n;throw new ce(`Operator "*" requires vector or number arguments. If both arguments are vectors they must be matching types. Arguments are ${t} and ${n}.`)};Zt.prototype._evaluateDivide=function(e){let t=this._left.evaluate(e),n=this._right.evaluate(e);if(n instanceof D&&t instanceof D)return D.divideComponents(t,n,vn.getCartesian2());if(t instanceof D&&typeof n=="number")return D.divideByScalar(t,n,vn.getCartesian2());if(n instanceof m&&t instanceof m)return m.divideComponents(t,n,vn.getCartesian3());if(t instanceof m&&typeof n=="number")return m.divideByScalar(t,n,vn.getCartesian3());if(n instanceof re&&t instanceof re)return re.divideComponents(t,n,vn.getCartesian4());if(t instanceof re&&typeof n=="number")return re.divideByScalar(t,n,vn.getCartesian4());if(typeof t=="number"&&typeof n=="number")return t/n;throw new ce(`Operator "/" requires vector or number arguments of matching types, or a number as the second argument. Arguments are ${t} and ${n}.`)};Zt.prototype._evaluateMod=function(e){let t=this._left.evaluate(e),n=this._right.evaluate(e);if(n instanceof D&&t instanceof D)return D.fromElements(t.x%n.x,t.y%n.y,vn.getCartesian2());if(n instanceof m&&t instanceof m)return m.fromElements(t.x%n.x,t.y%n.y,t.z%n.z,vn.getCartesian3());if(n instanceof re&&t instanceof re)return re.fromElements(t.x%n.x,t.y%n.y,t.z%n.z,t.w%n.w,vn.getCartesian4());if(typeof t=="number"&&typeof n=="number")return t%n;throw new ce(`Operator "%" requires vector or number arguments of matching types. Arguments are ${t} and ${n}.`)};Zt.prototype._evaluateEqualsStrict=function(e){let t=this._left.evaluate(e),n=this._right.evaluate(e);return n instanceof D&&t instanceof D||n instanceof m&&t instanceof m||n instanceof re&&t instanceof re?t.equals(n):t===n};Zt.prototype._evaluateNotEqualsStrict=function(e){let t=this._left.evaluate(e),n=this._right.evaluate(e);return n instanceof D&&t instanceof D||n instanceof m&&t instanceof m||n instanceof re&&t instanceof re?!t.equals(n):t!==n};Zt.prototype._evaluateConditional=function(e){let t=this._test.evaluate(e);if(typeof t!="boolean")throw new ce(`Conditional argument of conditional expression must be a boolean. Argument is ${t}.`);return t?this._left.evaluate(e):this._right.evaluate(e)};Zt.prototype._evaluateNaN=function(e){return isNaN(this._left.evaluate(e))};Zt.prototype._evaluateIsFinite=function(e){return isFinite(this._left.evaluate(e))};Zt.prototype._evaluateIsExactClass=function(e){return l(e)?e.isExactClass(this._left.evaluate(e)):!1};Zt.prototype._evaluateIsClass=function(e){return l(e)?e.isClass(this._left.evaluate(e)):!1};Zt.prototype._evaluateGetExactClassName=function(e){if(l(e))return e.getExactClassName()};Zt.prototype._evaluateBooleanConversion=function(e){return!!this._left.evaluate(e)};Zt.prototype._evaluateNumberConversion=function(e){return Number(this._left.evaluate(e))};Zt.prototype._evaluateStringConversion=function(e){return String(this._left.evaluate(e))};Zt.prototype._evaluateRegExp=function(e){let t=this._value.evaluate(e),n="";l(this._left)&&(n=this._left.evaluate(e));let i;try{i=new RegExp(t,n)}catch(o){throw new ce(o)}return i};Zt.prototype._evaluateRegExpTest=function(e){let t=this._left.evaluate(e),n=this._right.evaluate(e);if(!(t instanceof RegExp&&typeof n=="string"))throw new ce(`RegExp.test requires the first argument to be a RegExp and the second argument to be a string. Arguments are ${t} and ${n}.`);return t.test(n)};Zt.prototype._evaluateRegExpMatch=function(e){let t=this._left.evaluate(e),n=this._right.evaluate(e);if(t instanceof RegExp&&typeof n=="string")return t.test(n);if(n instanceof RegExp&&typeof t=="string")return n.test(t);throw new ce(`Operator "=~" requires one RegExp argument and one string argument. Arguments are ${t} and ${n}.`)};Zt.prototype._evaluateRegExpNotMatch=function(e){let t=this._left.evaluate(e),n=this._right.evaluate(e);if(t instanceof RegExp&&typeof n=="string")return!t.test(n);if(n instanceof RegExp&&typeof t=="string")return!n.test(t);throw new ce(`Operator "!~" requires one RegExp argument and one string argument. Arguments are ${t} and ${n}.`)};Zt.prototype._evaluateRegExpExec=function(e){let t=this._left.evaluate(e),n=this._right.evaluate(e);if(!(t instanceof RegExp&&typeof n=="string"))throw new ce(`RegExp.exec requires the first argument to be a RegExp and the second argument to be a string. Arguments are ${t} and ${n}.`);let i=t.exec(n);return l(i)?i[1]:null};Zt.prototype._evaluateToString=function(e){let t=this._left.evaluate(e);if(t instanceof RegExp||t instanceof D||t instanceof m||t instanceof re)return String(t);throw new ce(`Unexpected function call "${this._value}".`)};function ooe(e){let t=e._left,n=t.length;for(let a=0;a1){let p=d[0],g=d[1];return g!=="1.0"&&(t.translucent=!0),`vec4(${p}, ${g})`}}else return"vec4(1.0)";return`vec4(${d[0]}, 1.0)`}else{if(c==="rgb")return i=roe(this),l(i)?E5(i):`vec4(${d[0]} / 255.0, ${d[1]} / 255.0, ${d[2]} / 255.0, 1.0)`;if(c==="rgba")return d[3]!=="1.0"&&(t.translucent=!0),i=roe(this),l(i)?E5(i):`vec4(${d[0]} / 255.0, ${d[1]} / 255.0, ${d[2]} / 255.0, ${d[3]})`;if(c==="hsl")return i=ooe(this),l(i)?E5(i):`vec4(czm_HSLToRGB(vec3(${d[0]}, ${d[1]}, ${d[2]})), 1.0)`;if(c==="hsla")return i=ooe(this),l(i)?(i.alpha!==1&&(t.translucent=!0),E5(i)):(d[3]!=="1.0"&&(t.translucent=!0),`vec4(czm_HSLToRGB(vec3(${d[0]}, ${d[1]}, ${d[2]})), ${d[3]})`)}break;case yt.LITERAL_VECTOR:u=o.length,h=`${c}(`;for(let p=0;p0;){let u=t.pop();if(B.equals(u.color,a.color))d=ZH(n,s,d,i,o,u.batchIds,r),a.batchIds=a.batchIds.concat(u.batchIds),a.count=d-a.offset;else{let h=d;d=ZH(n,s,d,i,o,u.batchIds,r),u.offset=h,u.count=d-h,c.push(u),a=u}}e._va.indexBuffer.copyFromArrayView(s),e._indices=s,e._batchedIndices=c}function GH(e,t,n,i,o,r,s){let a=e.bytesPerIndex,c=r.length;for(let d=0;d0;){let h=t.pop();if(B.equals(h.color,r.color))d=GH(a,c,d,n,i,h.batchIds,o),r.batchIds=r.batchIds.concat(h.batchIds),r.count=d-r.offset;else{let p=d;d=GH(a,c,d,n,i,h.batchIds,o),h.offset=p,h.count=d-p,s.push(h),r=h}}let u=e._va;e._va=e._vaSwap,e._vaSwap=u,e._batchedIndices=s}function twe(e,t){return t.color.toRgba()-e.color.toRgba()}function nwe(e,t){if(!e._batchDirty)return!1;let n=e._batchedIndices,i=n.length,o=!1,r={};for(let s=0;s=x&&s{e.isDestroyed()||(e._error=f)}):void 0}}function ywe(e){l(e._primitive)||(e._primitive=new s_({batchTable:e._batchTable,positions:e._positions,batchIds:e._batchIds,vertexBatchIds:e._vertexBatchIds,indices:e._indices,indexOffsets:e._indexOffsets,indexCounts:e._indexCounts,batchedIndices:e._batchedIndices,boundingVolume:e._boundingVolume,boundingVolumes:e._boundingVolumes,center:e._center,pickObject:y(e._pickObject,e)}),e._boxes=void 0,e._boxBatchIds=void 0,e._cylinders=void 0,e._cylinderBatchIds=void 0,e._ellipsoids=void 0,e._ellipsoidBatchIds=void 0,e._spheres=void 0,e._sphereBatchIds=void 0,e._center=void 0,e._modelMatrix=void 0,e._batchTable=void 0,e._boundingVolume=void 0,e._boundingVolumes=void 0,e._batchedIndices=void 0,e._indices=void 0,e._indexOffsets=void 0,e._indexCounts=void 0,e._positions=void 0,e._vertexBatchIds=void 0,e._batchIds=void 0,e._batchTableColors=void 0,e._packedBuffer=void 0,e._verticesPromise=void 0)}Td.prototype.createFeatures=function(e,t){this._primitive.createFeatures(e,t)};Td.prototype.applyDebugSettings=function(e,t){this._primitive.applyDebugSettings(e,t)};Td.prototype.applyStyle=function(e,t){this._primitive.applyStyle(e,t)};Td.prototype.updateCommands=function(e,t){this._primitive.updateCommands(e,t)};Td.prototype.update=function(e){if(!this._ready){if(l(this._promise)||(this._promise=gwe(this)),l(this._error)){let t=this._error;throw this._error=void 0,t}return}this._primitive.debugWireframe=this.debugWireframe,this._primitive.forceRebatch=this.forceRebatch,this._primitive.classificationType=this.classificationType,this._primitive.update(e)};Td.prototype.isDestroyed=function(){return!1};Td.prototype.destroy=function(){return this._primitive=this._primitive&&this._primitive.destroy(),me(this)};var $p=Td;function Sf(e,t,n,i,o){this._tileset=e,this._tile=t,this._resource=n,this._geometries=void 0,this._metadata=void 0,this._batchTable=void 0,this._features=void 0,this.featurePropertiesDirty=!1,this._group=void 0,this._ready=!1,Twe(this,i,o)}Object.defineProperties(Sf.prototype,{featuresLength:{get:function(){return l(this._batchTable)?this._batchTable.featuresLength:0}},pointsLength:{get:function(){return 0}},trianglesLength:{get:function(){return l(this._geometries)?this._geometries.trianglesLength:0}},geometryByteLength:{get:function(){return l(this._geometries)?this._geometries.geometryByteLength:0}},texturesByteLength:{get:function(){return 0}},batchTableByteLength:{get:function(){return l(this._batchTable)?this._batchTable.batchTableByteLength:0}},innerContents:{get:function(){}},ready:{get:function(){return this._ready}},tileset:{get:function(){return this._tileset}},tile:{get:function(){return this._tile}},url:{get:function(){return this._resource.getUrlComponent(!0)}},metadata:{get:function(){return this._metadata},set:function(e){this._metadata=e}},batchTable:{get:function(){return this._batchTable}},group:{get:function(){return this._group},set:function(e){this._group=e}}});function xwe(e){return function(t,n){l(e._geometries)&&e._geometries.updateCommands(t,n)}}function _we(e,t){let n,i,o,r,s,a=y(e.BOXES_LENGTH,0),c=y(e.CYLINDERS_LENGTH,0),d=y(e.ELLIPSOIDS_LENGTH,0),u=y(e.SPHERES_LENGTH,0);if(a>0&&l(e.BOX_BATCH_IDS)){let f=t.byteOffset+e.BOX_BATCH_IDS.byteOffset;n=new Uint16Array(t.buffer,f,a)}if(c>0&&l(e.CYLINDER_BATCH_IDS)){let f=t.byteOffset+e.CYLINDER_BATCH_IDS.byteOffset;i=new Uint16Array(t.buffer,f,c)}if(d>0&&l(e.ELLIPSOID_BATCH_IDS)){let f=t.byteOffset+e.ELLIPSOID_BATCH_IDS.byteOffset;o=new Uint16Array(t.buffer,f,d)}if(u>0&&l(e.SPHERE_BATCH_IDS)){let f=t.byteOffset+e.SPHERE_BATCH_IDS.byteOffset;r=new Uint16Array(t.buffer,f,u)}let h=l(n)||l(i)||l(o)||l(r),p=a>0&&!l(n)||c>0&&!l(i)||d>0&&!l(o)||u>0&&!l(r);if(h&&p)throw new ce("If one group of batch ids is defined, then all batch ids must be defined");if(!l(n)&&!l(i)&&!l(o)&&!l(r)){let f=0;if(!l(n)&&a>0)for(n=new Uint16Array(a),s=0;s0)for(i=new Uint16Array(c),s=0;s0)for(o=new Uint16Array(d),s=0;s0)for(r=new Uint16Array(u),s=0;s0&&(g=nr(i,n,d),n+=d,u>0&&(f=new Uint8Array(t,n,u),f=new Uint8Array(f)));let x=y(h.BOXES_LENGTH,0),_=y(h.CYLINDERS_LENGTH,0),C=y(h.ELLIPSOIDS_LENGTH,0),V=y(h.SPHERES_LENGTH,0),L=x+_+C+V,R=new jp(e,L,g,f,xwe(e));if(e._batchTable=R,L===0)return;let G=e.tile.computedTransform,I;l(h.RTC_CENTER)&&(I=m.unpack(h.RTC_CENTER),M.multiplyByPoint(G,I,I));let v=_we(h,p);if(x>0||_>0||C>0||V>0){let P,w,A,b;if(x>0){let Z=p.byteOffset+h.BOXES.byteOffset;P=new Float32Array(p.buffer,Z,$p.packedBoxLength*x)}if(_>0){let Z=p.byteOffset+h.CYLINDERS.byteOffset;w=new Float32Array(p.buffer,Z,$p.packedCylinderLength*_)}if(C>0){let Z=p.byteOffset+h.ELLIPSOIDS.byteOffset;A=new Float32Array(p.buffer,Z,$p.packedEllipsoidLength*C)}if(V>0){let Z=p.byteOffset+h.SPHERES.byteOffset;b=new Float32Array(p.buffer,Z,$p.packedSphereLength*V)}return e._geometries=new $p({boxes:P,boxBatchIds:v.boxes,cylinders:w,cylinderBatchIds:v.cylinders,ellipsoids:A,ellipsoidBatchIds:v.ellipsoids,spheres:b,sphereBatchIds:v.spheres,center:I,modelMatrix:G,batchTable:R,boundingVolume:e.tile.boundingVolume.boundingVolume}),e}return Promise.resolve(e)}function uoe(e){let t=e.featuresLength;if(!l(e._features)&&t>0){let n=new Array(t);l(e._geometries)&&e._geometries.createFeatures(e,n),e._features=n}}Sf.prototype.hasProperty=function(e,t){return this._batchTable.hasProperty(e,t)};Sf.prototype.getFeature=function(e){return uoe(this),this._features[e]};Sf.prototype.applyDebugSettings=function(e,t){l(this._geometries)&&this._geometries.applyDebugSettings(e,t)};Sf.prototype.applyStyle=function(e){uoe(this),l(this._geometries)&&this._geometries.applyStyle(e,this._features)};Sf.prototype.update=function(e,t){l(this._geometries)&&(this._geometries.classificationType=this._tileset.classificationType,this._geometries.debugWireframe=this._tileset.debugWireframe,this._geometries.update(t)),l(this._batchTable)&&this._geometries.ready&&(this._batchTable.update(e,t),this._ready=!0)};Sf.prototype.pick=function(e,t,n){};Sf.prototype.isDestroyed=function(){return!1};Sf.prototype.destroy=function(){return this._geometries=this._geometries&&this._geometries.destroy(),this._batchTable=this._batchTable&&this._batchTable.destroy(),me(this)};var MI=Sf;var Kmn=T(S(),1);var don=T(S(),1);var EH={};EH.encode2D=function(e,t,n){let i=Math.pow(2,e),o={x:t,y:n},r,s,a,c=BigInt(0);for(a=i/2;a>0;a/=2)r=(o.x&a)>0?1:0,s=(o.y&a)>0?1:0,c+=BigInt((3*r^s)*a*a),moe(i,o,r,s);return c};EH.decode2D=function(e,t){let n=Math.pow(2,e),i={x:0,y:0},o,r,s,a;for(s=1,a=t;s>>0,IH=2*c_+1,ug=4,poe=[],boe=[],Vwe=[[0,1,3,2],[0,2,3,1],[3,2,0,1],[3,1,0,2]],mg=1,XC=2,v5=[mg,0,0,mg|XC];function es(e){if(!Ot.supportsBigInt())throw new ce("S2 required BigInt support");this._cellId=e,this._level=es.getLevel(e)}es.fromToken=function(e){return new es(es.getIdFromToken(e))};es.isValidId=function(e){return!(e<=0||e>>BigInt(IH)>5||!(e&~e+BigInt(1)&BigInt("0x1555555555555555")))};es.isValidToken=function(e){return/^[0-9a-fA-F]{1,16}$/.test(e)?es.isValidId(es.getIdFromToken(e)):!1};es.getIdFromToken=function(e){return BigInt("0x"+e+"0".repeat(16-e.length))};es.getTokenFromId=function(e){let t=Math.floor(vwe(e)/4),n=e.toString(16).replace(/0*$/,"");return Array(17-t-n.length).join("0")+n};es.getLevel=function(e){let t=0;for(;e!==BigInt(0)&&!(e&BigInt(1));)t++,e=e>>BigInt(1);return c_-(t>>1)};es.prototype.getChild=function(e){let t=xoe(this._cellId)>>BigInt(2),n=this._cellId+BigInt(2*e+1-4)*t;return new es(n)};es.prototype.getParent=function(){let e=xoe(this._cellId)<>1&1;return yoe(i[0],o[0][r^n&1],o[1][r])}function Zwe(e,t){let n=goe(e),i=n[0],o=n[1],r=n[2],s=t===30,a=!s&&(BigInt(o)^e>>BigInt(2))&BigInt(1),c=s?1:a?2:0,d=(o<<1)+c,u=(r<<1)+c;return[i,d,u]}function goe(e){poe.length===0&&Xwe();let t=Number(e>>BigInt(IH)),n=t&mg,i=(1<=0;s--){let c=(1<<2*(s===7?c_-7*ug:ug))-1;n+=Number(e>>BigInt(s*2*ug+1)&BigInt(c))<<2,n=boe[n];let d=s*ug;o+=n>>ug+2<>2&i)<=.5?1/3*(4*e*e-1):1/3*(1-4*(1-e)*(1-e))}function hoe(e){return 1/Cwe*e}function Ewe(e,t){let n=[[],[]],i=Iwe(t);for(let o=0;o<2;++o){let r=e[o]&-i,s=r+i;n[o][0]=w5(foe(r)),n[o][1]=w5(foe(s))}return n}function Iwe(e){return 1<>>0}function foe(e){return 1/Swe*e}function hg(e,t,n,i,o,r){if(e===ug){let s=(t<>1),n+(s[0]&1),i,o,r^v5[0]),hg(e,t+(s[1]>>1),n+(s[1]&1),i,o+1,r^v5[1]),hg(e,t+(s[2]>>1),n+(s[2]&1),i,o+2,r^v5[2]),hg(e,t+(s[3]>>1),n+(s[3]&1),i,o+3,r^v5[3])}}function Xwe(){hg(0,0,0,0,0,0),hg(0,0,0,mg,0,mg),hg(0,0,0,XC,0,XC),hg(0,0,0,mg|XC,0,mg|XC)}function xoe(e){return e&~e+BigInt(1)}function Wwe(e){return BigInt(1)<>3,r=i%8;n+=e[o]>>r&1}return n}Object.defineProperties(XH.prototype,{lengthBits:{get:function(){return this._lengthBits}},availableCount:{get:function(){return this._availableCount}}});XH.prototype.getBit=function(e){if(l(this._constant))return this._constant;let t=e>>3,n=e%8;return(this._bitstream[t]>>n&1)===1};var WC=XH;var Eon=T(S(),1);function tb(e){e=y(e,y.EMPTY_OBJECT);let t=e.metadataTable,n=e.class,i=e.entityId,o=e.propertyTableJson;this._class=n,this._metadataTable=t,this._entityId=i,this._extensions=o.extensions,this._extras=o.extras}Object.defineProperties(tb.prototype,{class:{get:function(){return this._class}},extras:{get:function(){return this._extras}},extensions:{get:function(){return this._extensions}}});tb.prototype.hasProperty=function(e){return this._metadataTable.hasProperty(e)};tb.prototype.hasPropertyBySemantic=function(e){return this._metadataTable.hasPropertyBySemantic(e)};tb.prototype.getPropertyIds=function(e){return this._metadataTable.getPropertyIds(e)};tb.prototype.getProperty=function(e){return this._metadataTable.getProperty(this._entityId,e)};tb.prototype.setProperty=function(e,t){return this._metadataTable.setProperty(this._entityId,e,t)};tb.prototype.getPropertyBySemantic=function(e){return this._metadataTable.getPropertyBySemantic(this._entityId,e)};tb.prototype.setPropertyBySemantic=function(e,t){return this._metadataTable.setPropertyBySemantic(this._entityId,e,t)};var PC=tb;var Xon=T(S(),1);var F5={QUADTREE:"QUADTREE",OCTREE:"OCTREE"};F5.getBranchingFactor=function(e){switch(e){case F5.OCTREE:return 8;case F5.QUADTREE:return 4}};var ts=Object.freeze(F5);var Uon=T(S(),1);var Fon=T(S(),1);function ga(){}Object.defineProperties(ga.prototype,{class:{get:function(){fe.throwInstantiationError()}}});ga.prototype.hasProperty=function(e){fe.throwInstantiationError()};ga.prototype.hasPropertyBySemantic=function(e){fe.throwInstantiationError()};ga.prototype.getPropertyIds=function(e){fe.throwInstantiationError()};ga.prototype.getProperty=function(e){fe.throwInstantiationError()};ga.prototype.setProperty=function(e,t){fe.throwInstantiationError()};ga.prototype.getPropertyBySemantic=function(e){fe.throwInstantiationError()};ga.prototype.setPropertyBySemantic=function(e,t){fe.throwInstantiationError()};ga.hasProperty=function(e,t,n){if(l(t[e]))return!0;let i=n.properties;if(!l(i))return!1;let o=i[e];return!!(l(o)&&l(o.default))};ga.hasPropertyBySemantic=function(e,t,n){let i=n.propertiesBySemantic;if(!l(i))return!1;let o=i[e];return l(o)};ga.getPropertyIds=function(e,t,n){n=l(n)?n:[],n.length=0;for(let o in e)e.hasOwnProperty(o)&&l(e[o])&&n.push(o);let i=t.properties;if(l(i))for(let o in i)i.hasOwnProperty(o)&&!l(e[o])&&l(i[o].default)&&n.push(o);return n};ga.getProperty=function(e,t,n){let i=n.properties[e],o=t[e];Array.isArray(o)&&(o=o.slice());let r=!0;if(o=i.handleNoData(o),!l(o)&&l(i.default))return o=Oe(i.default,!0),i.unpackVectorAndMatrixTypes(o,r);if(l(o))return o=i.normalize(o),o=i.applyValueTransform(o),i.unpackVectorAndMatrixTypes(o,r)};ga.setProperty=function(e,t,n,i){if(!l(n[e]))return!1;Array.isArray(t)&&(t=t.slice());let o,r=i.properties;return l(r)&&(o=r[e]),l(o)&&(t=o.packVectorAndMatrixTypes(t,!0),t=o.unapplyValueTransform(t),t=o.unnormalize(t)),n[e]=t,!0};ga.getPropertyBySemantic=function(e,t,n){let i=n.propertiesBySemantic;if(!l(i))return;let o=i[e];if(l(o))return ga.getProperty(o.id,t,n)};ga.setPropertyBySemantic=function(e,t,n,i){let o=i.propertiesBySemantic;if(!l(o))return!1;let r=i.propertiesBySemantic[e];return l(r)?ga.setProperty(r.id,t,n,i):!1};var Un=ga;function nb(e){e=y(e,y.EMPTY_OBJECT);let t=e.subtreeMetadata,n=e.class,i=l(t.properties)?t.properties:{};this._class=n,this._properties=i,this._extras=t.extras,this._extensions=t.extensions}Object.defineProperties(nb.prototype,{class:{get:function(){return this._class}},extras:{get:function(){return this._extras}},extensions:{get:function(){return this._extensions}}});nb.prototype.hasProperty=function(e){return Un.hasProperty(e,this._properties,this._class)};nb.prototype.hasPropertyBySemantic=function(e){return Un.hasPropertyBySemantic(e,this._properties,this._class)};nb.prototype.getPropertyIds=function(e){return Un.getPropertyIds(this._properties,this._class,e)};nb.prototype.getProperty=function(e){return Un.getProperty(e,this._properties,this._class)};nb.prototype.setProperty=function(e,t){return Un.setProperty(e,t,this._properties,this._class)};nb.prototype.getPropertyBySemantic=function(e){return Un.getPropertyBySemantic(e,this._properties,this._class)};nb.prototype.setPropertyBySemantic=function(e,t){return Un.setPropertyBySemantic(e,t,this._properties,this._class)};var NI=nb;var Wrn=T(S(),1);var Lrn=T(S(),1);var Hon=T(S(),1);var Nt={INT8:"INT8",UINT8:"UINT8",INT16:"INT16",UINT16:"UINT16",INT32:"INT32",UINT32:"UINT32",INT64:"INT64",UINT64:"UINT64",FLOAT32:"FLOAT32",FLOAT64:"FLOAT64"};Nt.getMinimum=function(e){switch(e){case Nt.INT8:return-128;case Nt.UINT8:return 0;case Nt.INT16:return-32768;case Nt.UINT16:return 0;case Nt.INT32:return-2147483648;case Nt.UINT32:return 0;case Nt.INT64:return Ot.supportsBigInt()?BigInt("-9223372036854775808"):-Math.pow(2,63);case Nt.UINT64:return Ot.supportsBigInt()?BigInt(0):0;case Nt.FLOAT32:return-34028234663852886e22;case Nt.FLOAT64:return-Number.MAX_VALUE}};Nt.getMaximum=function(e){switch(e){case Nt.INT8:return 127;case Nt.UINT8:return 255;case Nt.INT16:return 32767;case Nt.UINT16:return 65535;case Nt.INT32:return 2147483647;case Nt.UINT32:return 4294967295;case Nt.INT64:return Ot.supportsBigInt()?BigInt("9223372036854775807"):Math.pow(2,63)-1;case Nt.UINT64:return Ot.supportsBigInt()?BigInt("18446744073709551615"):Math.pow(2,64)-1;case Nt.FLOAT32:return 34028234663852886e22;case Nt.FLOAT64:return Number.MAX_VALUE}};Nt.isIntegerType=function(e){switch(e){case Nt.INT8:case Nt.UINT8:case Nt.INT16:case Nt.UINT16:case Nt.INT32:case Nt.UINT32:case Nt.INT64:case Nt.UINT64:return!0;default:return!1}};Nt.isUnsignedIntegerType=function(e){switch(e){case Nt.UINT8:case Nt.UINT16:case Nt.UINT32:case Nt.UINT64:return!0;default:return!1}};Nt.isVectorCompatible=function(e){switch(e){case Nt.INT8:case Nt.UINT8:case Nt.INT16:case Nt.UINT16:case Nt.INT32:case Nt.UINT32:case Nt.FLOAT32:case Nt.FLOAT64:return!0;default:return!1}};Nt.normalize=function(e,t){return Math.max(Number(e)/Number(Nt.getMaximum(t)),-1)};Nt.unnormalize=function(e,t){let n=Nt.getMaximum(t),i=Nt.isUnsignedIntegerType(t)?0:-n;return e=W.sign(e)*Math.round(Math.abs(e)*Number(n)),(t===Nt.INT64||t===Nt.UINT64)&&Ot.supportsBigInt()&&(e=BigInt(e)),e>n?n:e1;if(!n&&o===1)return e;if(!n)return new Array(o).fill(e);if(!r)return new Array(i).fill(e);if(!t)return new Array(this._arrayLength*o).fill(e);let s=new Array(o).fill(e);return new Array(this._arrayLength).fill(s)};Na.prototype.handleNoData=function(e){let t=this._noData;if(!l(t))return e;if(!Coe(e,t))return e};function Coe(e,t){if(!Array.isArray(e))return e===t;if(!Array.isArray(t)||e.length!==t.length)return!1;for(let n=0;n1;return l(n)?t&&r?e.map(function(s){return n.unpack(s)}):i?n.unpackArray(e):n.unpack(e):e};Na.prototype.packVectorAndMatrixTypes=function(e,t){t=y(t,!1);let n=ut.getMathType(this._type),i=this._isArray,o=ut.getComponentCount(this._type),r=i&&o>1;return l(n)?t&&r?e.map(function(s){return n.pack(s,[])}):i?n.packArray(e,[]):n.pack(e,[]):e};Na.prototype.validate=function(e){if(!(!l(e)&&l(this._default)))return this._required&&!l(e)?"required property must have a value":this._isArray?Nwe(this,e):Voe(this,e)};function Nwe(e,t){if(!Array.isArray(t))return`value ${t} must be an array`;let n=t.length;if(!e._isVariableLengthArray&&n!==e._arrayLength)return"Array length does not match property.arrayLength";for(let i=0;i1?_oe(e,t,n):void 0}if(eAt.getMaximum(t))return _oe(e,t,n)}function Soe(e,t){return`value ${e} of type ${t} must be finite`}function WH(e,t,n){if(!Array.isArray(e))return n(e,t);for(let i=0;i>3,i=e%8;return(t.typedArray[n]>>i&1)===1}function Qwe(e,t,n){let i=e>>3,o=e%8;n?t.typedArray[i]|=1<0,s=!0;for(let a=0;a<8;++a){let c=n.getUint8(i+a);r&&(s?c!==0&&(c=~(c-1)&255,s=!1):c=~c&255),o+=c*Math.pow(256,a)}return r&&(o=-o),o}function qwe(e,t){let n=t.dataView,i=e*8,o=BigInt(0),r=(n.getUint8(i+7)&128)>0,s=!0;for(let a=0;a<8;++a){let c=n.getUint8(i+a);r&&(s?c!==0&&(c=~(c-1)&255,s=!1):c=~c&255),o+=BigInt(c)*(BigInt(1)<96?_-97:_>64?_-39:_+4}for(var C=0,x=0;x=3),c(n.exports.meshopt_spatialSortRemap,g,g.length/f,f*4)},encodeVertexBuffer:function(g,f,x){r(x>0&&x<=256),r(x%4==0);var _=n.exports.meshopt_encodeVertexBufferBound(f,x);return d(n.exports.meshopt_encodeVertexBuffer,_,g,f,x)},encodeIndexBuffer:function(g,f,x){r(x==2||x==4),r(f%3==0);var _=h(g,x),C=n.exports.meshopt_encodeIndexBufferBound(f,u(_)+1);return d(n.exports.meshopt_encodeIndexBuffer,C,_,f,4)},encodeIndexSequence:function(g,f,x){r(x==2||x==4);var _=h(g,x),C=n.exports.meshopt_encodeIndexSequenceBound(f,u(_)+1);return d(n.exports.meshopt_encodeIndexSequence,C,_,f,4)},encodeGltfBuffer:function(g,f,x,_){var C={ATTRIBUTES:this.encodeVertexBuffer,TRIANGLES:this.encodeIndexBuffer,INDICES:this.encodeIndexSequence};return r(C[_]),C[_](g,f,x)},encodeFilterOct:function(g,f,x,_){return r(x==4||x==8),r(_>=1&&_<=16),p(n.exports.meshopt_encodeFilterOct,g,f,x,_,16)},encodeFilterQuat:function(g,f,x,_){return r(x==8),r(_>=4&&_<=16),p(n.exports.meshopt_encodeFilterQuat,g,f,x,_,16)},encodeFilterExp:function(g,f,x,_,C){r(x>0&&x%4==0),r(_>=1&&_<=24);var V={Separate:0,SharedVector:1,SharedComponent:2,Clamped:3};return p(n.exports.meshopt_encodeFilterExp,g,f,x,_,x,C?V[C]:1)}}}();var jrn=T(S()),Eoe=function(){var e="b9H79Tebbbe8Fv9Gbb9Gvuuuuueu9Giuuub9Geueu9Giuuueuikqbeeedddillviebeoweuec:q:Odkr;leDo9TW9T9VV95dbH9F9F939H79T9F9J9H229F9Jt9VV7bb8A9TW79O9V9Wt9F9KW9J9V9KW9wWVtW949c919M9MWVbeY9TW79O9V9Wt9F9KW9J9V9KW69U9KW949c919M9MWVbdE9TW79O9V9Wt9F9KW9J9V9KW69U9KW949tWG91W9U9JWbiL9TW79O9V9Wt9F9KW9J9V9KWS9P2tWV9p9JtblK9TW79O9V9Wt9F9KW9J9V9KWS9P2tWV9r919HtbvL9TW79O9V9Wt9F9KW9J9V9KWS9P2tWVT949Wbol79IV9Rbrq;w8Wqdbk;esezu8Jjjjjbcj;eb9Rgv8Kjjjjbc9:hodnadcefal0mbcuhoaiRbbc:Ge9hmbavaialfgrad9Radz1jjjbhwcj;abad9Uc;WFbGgocjdaocjd6EhDaicefhocbhqdnindndndnaeaq9nmbaDaeaq9RaqaDfae6Egkcsfglcl4cifcd4hxalc9WGgmTmecbhPawcjdfhsaohzinaraz9Rax6mvarazaxfgo9RcK6mvczhlcbhHinalgic9WfgOawcj;cbffhldndndndndnazaOco4fRbbaHcoG4ciGPlbedibkal9cb83ibalcwf9cb83ibxikalaoRblaoRbbgOco4gAaAciSgAE86bbawcj;cbfaifglcGfaoclfaAfgARbbaOcl4ciGgCaCciSgCE86bbalcVfaAaCfgARbbaOcd4ciGgCaCciSgCE86bbalc7faAaCfgARbbaOciGgOaOciSgOE86bbalctfaAaOfgARbbaoRbegOco4gCaCciSgCE86bbalc91faAaCfgARbbaOcl4ciGgCaCciSgCE86bbalc4faAaCfgARbbaOcd4ciGgCaCciSgCE86bbalc93faAaCfgARbbaOciGgOaOciSgOE86bbalc94faAaOfgARbbaoRbdgOco4gCaCciSgCE86bbalc95faAaCfgARbbaOcl4ciGgCaCciSgCE86bbalc96faAaCfgARbbaOcd4ciGgCaCciSgCE86bbalc97faAaCfgARbbaOciGgOaOciSgOE86bbalc98faAaOfgORbbaoRbigoco4gAaAciSgAE86bbalc99faOaAfgORbbaocl4ciGgAaAciSgAE86bbalc9:faOaAfgORbbaocd4ciGgAaAciSgAE86bbalcufaOaAfglRbbaociGgoaociSgoE86bbalaofhoxdkalaoRbwaoRbbgOcl4gAaAcsSgAE86bbawcj;cbfaifglcGfaocwfaAfgARbbaOcsGgOaOcsSgOE86bbalcVfaAaOfgORbbaoRbegAcl4gCaCcsSgCE86bbalc7faOaCfgORbbaAcsGgAaAcsSgAE86bbalctfaOaAfgORbbaoRbdgAcl4gCaCcsSgCE86bbalc91faOaCfgORbbaAcsGgAaAcsSgAE86bbalc4faOaAfgORbbaoRbigAcl4gCaCcsSgCE86bbalc93faOaCfgORbbaAcsGgAaAcsSgAE86bbalc94faOaAfgORbbaoRblgAcl4gCaCcsSgCE86bbalc95faOaCfgORbbaAcsGgAaAcsSgAE86bbalc96faOaAfgORbbaoRbvgAcl4gCaCcsSgCE86bbalc97faOaCfgORbbaAcsGgAaAcsSgAE86bbalc98faOaAfgORbbaoRbogAcl4gCaCcsSgCE86bbalc99faOaCfgORbbaAcsGgAaAcsSgAE86bbalc9:faOaAfgORbbaoRbrgocl4gAaAcsSgAE86bbalcufaOaAfglRbbaocsGgoaocsSgoE86bbalaofhoxekalao8Pbb83bbalcwfaocwf8Pbb83bbaoczfhokdnaiam9pmbaHcdfhHaiczfhlarao9RcL0mekkaiam6mvaoTmvdnakTmbawaPfRbbhHawcj;cbfhlashiakhOinaialRbbgzce4cbazceG9R7aHfgH86bbaiadfhialcefhlaOcufgOmbkkascefhsaohzaPcefgPad9hmbxikkcbc99arao9Radcaadca0ESEhoxlkaoaxad2fhCdnakmbadhlinaoTmlarao9Rax6mlaoaxfhoalcufglmbkaChoxekcbhmawcjdfhAinarao9Rax6miawamfRbbhHawcj;cbfhlaAhiakhOinaialRbbgzce4cbazceG9R7aHfgH86bbaiadfhialcefhlaOcufgOmbkaAcefhAaoaxfhoamcefgmad9hmbkaChokabaqad2fawcjdfakad2z1jjjb8Aawawcjdfakcufad2fadz1jjjb8Aakaqfhqaombkc9:hoxekc9:hokavcj;ebf8Kjjjjbaok;cseHu8Jjjjjbc;ae9Rgv8Kjjjjbc9:hodnaeci9UgrcHfal0mbcuhoaiRbbgwc;WeGc;Ge9hmbawcsGgwce0mbavc;abfcFecjez:jjjjb8AavcUf9cu83ibavc8Wf9cu83ibavcyf9cu83ibavcaf9cu83ibavcKf9cu83ibavczf9cu83ibav9cu83iwav9cu83ibaialfc9WfhDaicefgqarfhidnaeTmbcmcsawceSEhkcbhxcbhmcbhPcbhwcbhlindnaiaD9nmbc9:hoxikdndnaqRbbgoc;Ve0mbavc;abfalaocu7gscl4fcsGcitfgzydlhrazydbhzdnaocsGgHak9pmbavawasfcsGcdtfydbaxaHEhoaHThsdndnadcd9hmbabaPcetfgHaz87ebaHclfao87ebaHcdfar87ebxekabaPcdtfgHazBdbaHcwfaoBdbaHclfarBdbkaxasfhxcdhHavawcdtfaoBdbawasfhwcehsalhOxdkdndnaHcsSmbaHc987aHamffcefhoxekaicefhoai8SbbgHcFeGhsdndnaHcu9mmbaohixekaicvfhiascFbGhscrhHdninao8SbbgOcFbGaHtasVhsaOcu9kmeaocefhoaHcrfgHc8J9hmbxdkkaocefhikasce4cbasceG9R7amfhokdndnadcd9hmbabaPcetfgHaz87ebaHclfao87ebaHcdfar87ebxekabaPcdtfgHazBdbaHcwfaoBdbaHclfarBdbkcdhHavawcdtfaoBdbcehsawcefhwalhOaohmxekdnaocpe0mbaxcefgHavawaDaocsGfRbbgocl49RcsGcdtfydbaocz6gzEhravawao9RcsGcdtfydbaHazfgAaocsGgHEhoaHThCdndnadcd9hmbabaPcetfgHax87ebaHclfao87ebaHcdfar87ebxekabaPcdtfgHaxBdbaHcwfaoBdbaHclfarBdbkcdhsavawcdtfaxBdbavawcefgwcsGcdtfarBdbcihHavc;abfalcitfgOaxBdlaOarBdbavawazfgwcsGcdtfaoBdbalcefcsGhOawaCfhwaxhzaAaCfhxxekaxcbaiRbbgOEgzaoc;:eSgHfhraOcsGhCaOcl4hAdndnaOcs0mbarcefhoxekarhoavawaA9RcsGcdtfydbhrkdndnaCmbaocefhxxekaohxavawaO9RcsGcdtfydbhokdndnaHTmbaicefhHxekaicdfhHai8SbegscFeGhzdnascu9kmbaicofhXazcFbGhzcrhidninaH8SbbgscFbGaitazVhzascu9kmeaHcefhHaicrfgic8J9hmbkaXhHxekaHcefhHkazce4cbazceG9R7amfgmhzkdndnaAcsSmbaHhsxekaHcefhsaH8SbbgicFeGhrdnaicu9kmbaHcvfhXarcFbGhrcrhidninas8SbbgHcFbGaitarVhraHcu9kmeascefhsaicrfgic8J9hmbkaXhsxekascefhskarce4cbarceG9R7amfgmhrkdndnaCcsSmbashixekascefhias8SbbgocFeGhHdnaocu9kmbascvfhXaHcFbGhHcrhodninai8SbbgscFbGaotaHVhHascu9kmeaicefhiaocrfgoc8J9hmbkaXhixekaicefhikaHce4cbaHceG9R7amfgmhokdndnadcd9hmbabaPcetfgHaz87ebaHclfao87ebaHcdfar87ebxekabaPcdtfgHazBdbaHcwfaoBdbaHclfarBdbkcdhsavawcdtfazBdbavawcefgwcsGcdtfarBdbcihHavc;abfalcitfgXazBdlaXarBdbavawaOcz6aAcsSVfgwcsGcdtfaoBdbawaCTaCcsSVfhwalcefcsGhOkaqcefhqavc;abfaOcitfgOarBdlaOaoBdbavc;abfalasfcsGcitfgraoBdlarazBdbawcsGhwalaHfcsGhlaPcifgPae6mbkkcbc99aiaDSEhokavc;aef8Kjjjjbaok:flevu8Jjjjjbcz9Rhvc9:hodnaecvfal0mbcuhoaiRbbc;:eGc;qe9hmbav9cb83iwaicefhraialfc98fhwdnaeTmbdnadcdSmbcbhDindnaraw6mbc9:skarcefhoar8SbbglcFeGhidndnalcu9mmbaohrxekarcvfhraicFbGhicrhldninao8SbbgdcFbGaltaiVhiadcu9kmeaocefhoalcrfglc8J9hmbxdkkaocefhrkabaDcdtfaic8Etc8F91aicd47avcwfaiceGcdtVgoydbfglBdbaoalBdbaDcefgDae9hmbxdkkcbhDindnaraw6mbc9:skarcefhoar8SbbglcFeGhidndnalcu9mmbaohrxekarcvfhraicFbGhicrhldninao8SbbgdcFbGaltaiVhiadcu9kmeaocefhoalcrfglc8J9hmbxdkkaocefhrkabaDcetfaic8Etc8F91aicd47avcwfaiceGcdtVgoydbfgl87ebaoalBdbaDcefgDae9hmbkkcbc99arawSEhokaok:Lvoeue99dud99eud99dndnadcl9hmbaeTmeindndnabcdfgd8Sbb:Yab8Sbbgi:Ygl:l:tabcefgv8Sbbgo:Ygr:l:tgwJbb;:9cawawNJbbbbawawJbbbb9GgDEgq:mgkaqaicb9iEalMgwawNakaqaocb9iEarMgqaqNMM:r:vglNJbbbZJbbb:;aDEMgr:lJbbb9p9DTmbar:Ohixekcjjjj94hikadai86bbdndnaqalNJbbbZJbbb:;aqJbbbb9GEMgq:lJbbb9p9DTmbaq:Ohdxekcjjjj94hdkavad86bbdndnawalNJbbbZJbbb:;awJbbbb9GEMgw:lJbbb9p9DTmbaw:Ohdxekcjjjj94hdkabad86bbabclfhbaecufgembxdkkaeTmbindndnabclfgd8Ueb:Yab8Uebgi:Ygl:l:tabcdfgv8Uebgo:Ygr:l:tgwJb;:FSawawNJbbbbawawJbbbb9GgDEgq:mgkaqaicb9iEalMgwawNakaqaocb9iEarMgqaqNMM:r:vglNJbbbZJbbb:;aDEMgr:lJbbb9p9DTmbar:Ohixekcjjjj94hikadai87ebdndnaqalNJbbbZJbbb:;aqJbbbb9GEMgq:lJbbb9p9DTmbaq:Ohdxekcjjjj94hdkavad87ebdndnawalNJbbbZJbbb:;awJbbbb9GEMgw:lJbbb9p9DTmbaw:Ohdxekcjjjj94hdkabad87ebabcwfhbaecufgembkkk;oiliui99iue99dnaeTmbcbhiabhlindndnJ;Zl81Zalcof8UebgvciV:Y:vgoal8Ueb:YNgrJb;:FSNJbbbZJbbb:;arJbbbb9GEMgw:lJbbb9p9DTmbaw:OhDxekcjjjj94hDkalclf8Uebhqalcdf8UebhkabaiavcefciGfcetfaD87ebdndnaoak:YNgwJb;:FSNJbbbZJbbb:;awJbbbb9GEMgx:lJbbb9p9DTmbax:OhDxekcjjjj94hDkabaiavciGfgkcd7cetfaD87ebdndnaoaq:YNgoJb;:FSNJbbbZJbbb:;aoJbbbb9GEMgx:lJbbb9p9DTmbax:OhDxekcjjjj94hDkabaiavcufciGfcetfaD87ebdndnJbbjZararN:tawawN:taoaoN:tgrJbbbbarJbbbb9GE:rJb;:FSNJbbbZMgr:lJbbb9p9DTmbar:Ohvxekcjjjj94hvkabakcetfav87ebalcwfhlaiclfhiaecufgembkkk9mbdnadcd4ae2gdTmbinababydbgecwtcw91:Yaece91cjjj98Gcjjj;8if::NUdbabclfhbadcufgdmbkkk9teiucbcbydj1jjbgeabcifc98GfgbBdj1jjbdndnabZbcztgd9nmbcuhiabad9RcFFifcz4nbcuSmekaehikaik;LeeeudndnaeabVciGTmbabhixekdndnadcz9pmbabhixekabhiinaiaeydbBdbaiclfaeclfydbBdbaicwfaecwfydbBdbaicxfaecxfydbBdbaeczfheaiczfhiadc9Wfgdcs0mbkkadcl6mbinaiaeydbBdbaeclfheaiclfhiadc98fgdci0mbkkdnadTmbinaiaeRbb86bbaicefhiaecefheadcufgdmbkkabk;aeedudndnabciGTmbabhixekaecFeGc:b:c:ew2hldndnadcz9pmbabhixekabhiinaialBdbaicxfalBdbaicwfalBdbaiclfalBdbaiczfhiadc9Wfgdcs0mbkkadcl6mbinaialBdbaiclfhiadc98fgdci0mbkkdnadTmbinaiae86bbaicefhiadcufgdmbkkabkkkebcjwklzNbb",t="b9H79TebbbeKl9Gbb9Gvuuuuueu9Giuuub9Geueuikqbbebeedddilve9Weeeviebeoweuec:q:6dkr;leDo9TW9T9VV95dbH9F9F939H79T9F9J9H229F9Jt9VV7bb8A9TW79O9V9Wt9F9KW9J9V9KW9wWVtW949c919M9MWVbdY9TW79O9V9Wt9F9KW9J9V9KW69U9KW949c919M9MWVblE9TW79O9V9Wt9F9KW9J9V9KW69U9KW949tWG91W9U9JWbvL9TW79O9V9Wt9F9KW9J9V9KWS9P2tWV9p9JtboK9TW79O9V9Wt9F9KW9J9V9KWS9P2tWV9r919HtbrL9TW79O9V9Wt9F9KW9J9V9KWS9P2tWVT949Wbwl79IV9RbDq:p9sqlbzik9:evu8Jjjjjbcz9Rhbcbheincbhdcbhiinabcwfadfaicjuaead4ceGglE86bbaialfhiadcefgdcw9hmbkaec:q:yjjbfai86bbaecitc:q1jjbfab8Piw83ibaecefgecjd9hmbkk:N8JlHud97euo978Jjjjjbcj;kb9Rgv8Kjjjjbc9:hodnadcefal0mbcuhoaiRbbc:Ge9hmbavaialfgrad9Rad;8qbbcj;abad9UhlaicefhodnaeTmbadTmbalc;WFbGglcjdalcjd6EhwcbhDinawaeaD9RaDawfae6Egqcsfglc9WGgkci2hxakcethmalcl4cifcd4hPabaDad2fhsakc;ab6hzcbhHincbhOaohAdndninaraA9RaP6meavcj;cbfaOak2fhCaAaPfhocbhidnazmbarao9Rc;Gb6mbcbhlinaCalfhidndndndndnaAalco4fRbbgXciGPlbedibkaipxbbbbbbbbbbbbbbbbpklbxikaiaopbblaopbbbgQclp:meaQpmbzeHdOiAlCvXoQrLgQcdp:meaQpmbzeHdOiAlCvXoQrLpxiiiiiiiiiiiiiiiip9ogLpxiiiiiiiiiiiiiiiip8JgQp5b9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibaKc:q:yjjbfpbbbgYaYpmbbbbbbbbbbbbbbbbaQp5e9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibp9UpmbedilvorzHOACXQLpPaLaQp9spklbaoclfaYpQbfaKc:q:yjjbfRbbfhoxdkaiaopbbwaopbbbgQclp:meaQpmbzeHdOiAlCvXoQrLpxssssssssssssssssp9ogLpxssssssssssssssssp8JgQp5b9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibaKc:q:yjjbfpbbbgYaYpmbbbbbbbbbbbbbbbbaQp5e9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibp9UpmbedilvorzHOACXQLpPaLaQp9spklbaocwfaYpQbfaKc:q:yjjbfRbbfhoxekaiaopbbbpklbaoczfhokdndndndndnaXcd4ciGPlbedibkaipxbbbbbbbbbbbbbbbbpklzxikaiaopbblaopbbbgQclp:meaQpmbzeHdOiAlCvXoQrLgQcdp:meaQpmbzeHdOiAlCvXoQrLpxiiiiiiiiiiiiiiiip9ogLpxiiiiiiiiiiiiiiiip8JgQp5b9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibaKc:q:yjjbfpbbbgYaYpmbbbbbbbbbbbbbbbbaQp5e9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibp9UpmbedilvorzHOACXQLpPaLaQp9spklzaoclfaYpQbfaKc:q:yjjbfRbbfhoxdkaiaopbbwaopbbbgQclp:meaQpmbzeHdOiAlCvXoQrLpxssssssssssssssssp9ogLpxssssssssssssssssp8JgQp5b9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibaKc:q:yjjbfpbbbgYaYpmbbbbbbbbbbbbbbbbaQp5e9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibp9UpmbedilvorzHOACXQLpPaLaQp9spklzaocwfaYpQbfaKc:q:yjjbfRbbfhoxekaiaopbbbpklzaoczfhokdndndndndnaXcl4ciGPlbedibkaipxbbbbbbbbbbbbbbbbpklaxikaiaopbblaopbbbgQclp:meaQpmbzeHdOiAlCvXoQrLgQcdp:meaQpmbzeHdOiAlCvXoQrLpxiiiiiiiiiiiiiiiip9ogLpxiiiiiiiiiiiiiiiip8JgQp5b9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibaKc:q:yjjbfpbbbgYaYpmbbbbbbbbbbbbbbbbaQp5e9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibp9UpmbedilvorzHOACXQLpPaLaQp9spklaaoclfaYpQbfaKc:q:yjjbfRbbfhoxdkaiaopbbwaopbbbgQclp:meaQpmbzeHdOiAlCvXoQrLpxssssssssssssssssp9ogLpxssssssssssssssssp8JgQp5b9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibaKc:q:yjjbfpbbbgYaYpmbbbbbbbbbbbbbbbbaQp5e9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibp9UpmbedilvorzHOACXQLpPaLaQp9spklaaocwfaYpQbfaKc:q:yjjbfRbbfhoxekaiaopbbbpklaaoczfhokdndndndndnaXco4Plbedibkaipxbbbbbbbbbbbbbbbbpkl8WxikaiaopbblaopbbbgQclp:meaQpmbzeHdOiAlCvXoQrLgQcdp:meaQpmbzeHdOiAlCvXoQrLpxiiiiiiiiiiiiiiiip9ogLpxiiiiiiiiiiiiiiiip8JgQp5b9cjF;8;4;W;G;ab9:9cU1:NgXcitc:q1jjbfpbibaXc:q:yjjbfpbbbgYaYpmbbbbbbbbbbbbbbbbaQp5e9cjF;8;4;W;G;ab9:9cU1:NgXcitc:q1jjbfpbibp9UpmbedilvorzHOACXQLpPaLaQp9spkl8WaoclfaYpQbfaXc:q:yjjbfRbbfhoxdkaiaopbbwaopbbbgQclp:meaQpmbzeHdOiAlCvXoQrLpxssssssssssssssssp9ogLpxssssssssssssssssp8JgQp5b9cjF;8;4;W;G;ab9:9cU1:NgXcitc:q1jjbfpbibaXc:q:yjjbfpbbbgYaYpmbbbbbbbbbbbbbbbbaQp5e9cjF;8;4;W;G;ab9:9cU1:NgXcitc:q1jjbfpbibp9UpmbedilvorzHOACXQLpPaLaQp9spkl8WaocwfaYpQbfaXc:q:yjjbfRbbfhoxekaiaopbbbpkl8Waoczfhokalc;abfhialcjefak0meaihlarao9Rc;Fb0mbkkdnaiak9pmbaici4hlinarao9RcK6miaCaifhXdndndndndnaAaico4fRbbalcoG4ciGPlbedibkaXpxbbbbbbbbbbbbbbbbpkbbxikaXaopbblaopbbbgQclp:meaQpmbzeHdOiAlCvXoQrLgQcdp:meaQpmbzeHdOiAlCvXoQrLpxiiiiiiiiiiiiiiiip9ogLpxiiiiiiiiiiiiiiiip8JgQp5b9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibaKc:q:yjjbfpbbbgYaYpmbbbbbbbbbbbbbbbbaQp5e9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibp9UpmbedilvorzHOACXQLpPaLaQp9spkbbaoclfaYpQbfaKc:q:yjjbfRbbfhoxdkaXaopbbwaopbbbgQclp:meaQpmbzeHdOiAlCvXoQrLpxssssssssssssssssp9ogLpxssssssssssssssssp8JgQp5b9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibaKc:q:yjjbfpbbbgYaYpmbbbbbbbbbbbbbbbbaQp5e9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibp9UpmbedilvorzHOACXQLpPaLaQp9spkbbaocwfaYpQbfaKc:q:yjjbfRbbfhoxekaXaopbbbpkbbaoczfhokalcdfhlaiczfgiak6mbkkaoTmeaohAaOcefgOclSmdxbkkc9:hoxlkdnakTmbavcjdfaHfhiavaHfpbdbhYcbhXinaiavcj;cbfaXfglpblbgLcep9TaLpxeeeeeeeeeeeeeeeegQp9op9Hp9rgLalakfpblbg8Acep9Ta8AaQp9op9Hp9rg8ApmbzeHdOiAlCvXoQrLgEalamfpblbg3cep9Ta3aQp9op9Hp9rg3alaxfpblbg5cep9Ta5aQp9op9Hp9rg5pmbzeHdOiAlCvXoQrLg8EpmbezHdiOAlvCXorQLgQaQpmbedibedibedibediaYp9UgYp9AdbbaiadfglaYaQaQpmlvorlvorlvorlvorp9UgYp9AdbbaladfglaYaQaQpmwDqkwDqkwDqkwDqkp9UgYp9AdbbaladfglaYaQaQpmxmPsxmPsxmPsxmPsp9UgYp9AdbbaladfglaYaEa8EpmwDKYqk8AExm35Ps8E8FgQaQpmbedibedibedibedip9UgYp9AdbbaladfglaYaQaQpmlvorlvorlvorlvorp9UgYp9AdbbaladfglaYaQaQpmwDqkwDqkwDqkwDqkp9UgYp9AdbbaladfglaYaQaQpmxmPsxmPsxmPsxmPsp9UgYp9AdbbaladfglaYaLa8ApmwKDYq8AkEx3m5P8Es8FgLa3a5pmwKDYq8AkEx3m5P8Es8Fg8ApmbezHdiOAlvCXorQLgQaQpmbedibedibedibedip9UgYp9AdbbaladfglaYaQaQpmlvorlvorlvorlvorp9UgYp9AdbbaladfglaYaQaQpmwDqkwDqkwDqkwDqkp9UgYp9AdbbaladfglaYaQaQpmxmPsxmPsxmPsxmPsp9UgYp9AdbbaladfglaYaLa8ApmwDKYqk8AExm35Ps8E8FgQaQpmbedibedibedibedip9UgYp9AdbbaladfglaYaQaQpmlvorlvorlvorlvorp9UgYp9AdbbaladfglaYaQaQpmwDqkwDqkwDqkwDqkp9UgYp9AdbbaladfglaYaQaQpmxmPsxmPsxmPsxmPsp9UgYp9AdbbaladfhiaXczfgXak6mbkkaHclfgHad6mbkasavcjdfaqad2;8qbbavavcjdfaqcufad2fad;8qbbaqaDfgDae6mbkkcbc99arao9Radcaadca0ESEhokavcj;kbf8Kjjjjbaokwbz:bjjjbk::seHu8Jjjjjbc;ae9Rgv8Kjjjjbc9:hodnaeci9UgrcHfal0mbcuhoaiRbbgwc;WeGc;Ge9hmbawcsGgwce0mbavc;abfcFecje;8kbavcUf9cu83ibavc8Wf9cu83ibavcyf9cu83ibavcaf9cu83ibavcKf9cu83ibavczf9cu83ibav9cu83iwav9cu83ibaialfc9WfhDaicefgqarfhidnaeTmbcmcsawceSEhkcbhxcbhmcbhPcbhwcbhlindnaiaD9nmbc9:hoxikdndnaqRbbgoc;Ve0mbavc;abfalaocu7gscl4fcsGcitfgzydlhrazydbhzdnaocsGgHak9pmbavawasfcsGcdtfydbaxaHEhoaHThsdndnadcd9hmbabaPcetfgHaz87ebaHclfao87ebaHcdfar87ebxekabaPcdtfgHazBdbaHcwfaoBdbaHclfarBdbkaxasfhxcdhHavawcdtfaoBdbawasfhwcehsalhOxdkdndnaHcsSmbaHc987aHamffcefhoxekaicefhoai8SbbgHcFeGhsdndnaHcu9mmbaohixekaicvfhiascFbGhscrhHdninao8SbbgOcFbGaHtasVhsaOcu9kmeaocefhoaHcrfgHc8J9hmbxdkkaocefhikasce4cbasceG9R7amfhokdndnadcd9hmbabaPcetfgHaz87ebaHclfao87ebaHcdfar87ebxekabaPcdtfgHazBdbaHcwfaoBdbaHclfarBdbkcdhHavawcdtfaoBdbcehsawcefhwalhOaohmxekdnaocpe0mbaxcefgHavawaDaocsGfRbbgocl49RcsGcdtfydbaocz6gzEhravawao9RcsGcdtfydbaHazfgAaocsGgHEhoaHThCdndnadcd9hmbabaPcetfgHax87ebaHclfao87ebaHcdfar87ebxekabaPcdtfgHaxBdbaHcwfaoBdbaHclfarBdbkcdhsavawcdtfaxBdbavawcefgwcsGcdtfarBdbcihHavc;abfalcitfgOaxBdlaOarBdbavawazfgwcsGcdtfaoBdbalcefcsGhOawaCfhwaxhzaAaCfhxxekaxcbaiRbbgOEgzaoc;:eSgHfhraOcsGhCaOcl4hAdndnaOcs0mbarcefhoxekarhoavawaA9RcsGcdtfydbhrkdndnaCmbaocefhxxekaohxavawaO9RcsGcdtfydbhokdndnaHTmbaicefhHxekaicdfhHai8SbegscFeGhzdnascu9kmbaicofhXazcFbGhzcrhidninaH8SbbgscFbGaitazVhzascu9kmeaHcefhHaicrfgic8J9hmbkaXhHxekaHcefhHkazce4cbazceG9R7amfgmhzkdndnaAcsSmbaHhsxekaHcefhsaH8SbbgicFeGhrdnaicu9kmbaHcvfhXarcFbGhrcrhidninas8SbbgHcFbGaitarVhraHcu9kmeascefhsaicrfgic8J9hmbkaXhsxekascefhskarce4cbarceG9R7amfgmhrkdndnaCcsSmbashixekascefhias8SbbgocFeGhHdnaocu9kmbascvfhXaHcFbGhHcrhodninai8SbbgscFbGaotaHVhHascu9kmeaicefhiaocrfgoc8J9hmbkaXhixekaicefhikaHce4cbaHceG9R7amfgmhokdndnadcd9hmbabaPcetfgHaz87ebaHclfao87ebaHcdfar87ebxekabaPcdtfgHazBdbaHcwfaoBdbaHclfarBdbkcdhsavawcdtfazBdbavawcefgwcsGcdtfarBdbcihHavc;abfalcitfgXazBdlaXarBdbavawaOcz6aAcsSVfgwcsGcdtfaoBdbawaCTaCcsSVfhwalcefcsGhOkaqcefhqavc;abfaOcitfgOarBdlaOaoBdbavc;abfalasfcsGcitfgraoBdlarazBdbawcsGhwalaHfcsGhlaPcifgPae6mbkkcbc99aiaDSEhokavc;aef8Kjjjjbaok:flevu8Jjjjjbcz9Rhvc9:hodnaecvfal0mbcuhoaiRbbc;:eGc;qe9hmbav9cb83iwaicefhraialfc98fhwdnaeTmbdnadcdSmbcbhDindnaraw6mbc9:skarcefhoar8SbbglcFeGhidndnalcu9mmbaohrxekarcvfhraicFbGhicrhldninao8SbbgdcFbGaltaiVhiadcu9kmeaocefhoalcrfglc8J9hmbxdkkaocefhrkabaDcdtfaic8Etc8F91aicd47avcwfaiceGcdtVgoydbfglBdbaoalBdbaDcefgDae9hmbxdkkcbhDindnaraw6mbc9:skarcefhoar8SbbglcFeGhidndnalcu9mmbaohrxekarcvfhraicFbGhicrhldninao8SbbgdcFbGaltaiVhiadcu9kmeaocefhoalcrfglc8J9hmbxdkkaocefhrkabaDcetfaic8Etc8F91aicd47avcwfaiceGcdtVgoydbfgl87ebaoalBdbaDcefgDae9hmbkkcbc99arawSEhokaok:wPliuo97eue978Jjjjjbca9Rhiaec98Ghldndnadcl9hmbdnalTmbcbhvabhdinadadpbbbgocKp:RecKp:Sep;6egraocwp:RecKp:Sep;6earp;Geaoczp:RecKp:Sep;6egwp;Gep;Kep;LegDpxbbbbbbbbbbbbbbbbp:2egqarpxbbbjbbbjbbbjbbbjgkp9op9rp;Kegrpxbb;:9cbb;:9cbb;:9cbb;:9cararp;MeaDaDp;Meawaqawakp9op9rp;Kegrarp;Mep;Kep;Kep;Jep;Negwp;Mepxbbn0bbn0bbn0bbn0gqp;KepxFbbbFbbbFbbbFbbbp9oaopxbbbFbbbFbbbFbbbFp9op9qarawp;Meaqp;Kecwp:RepxbFbbbFbbbFbbbFbbp9op9qaDawp;Meaqp;Keczp:RepxbbFbbbFbbbFbbbFbp9op9qpkbbadczfhdavclfgval6mbkkalaeSmeaipxbbbbbbbbbbbbbbbbgqpklbaiabalcdtfgdaeciGglcdtgv;8qbbdnalTmbaiaipblbgocKp:RecKp:Sep;6egraocwp:RecKp:Sep;6earp;Geaoczp:RecKp:Sep;6egwp;Gep;Kep;LegDaqp:2egqarpxbbbjbbbjbbbjbbbjgkp9op9rp;Kegrpxbb;:9cbb;:9cbb;:9cbb;:9cararp;MeaDaDp;Meawaqawakp9op9rp;Kegrarp;Mep;Kep;Kep;Jep;Negwp;Mepxbbn0bbn0bbn0bbn0gqp;KepxFbbbFbbbFbbbFbbbp9oaopxbbbFbbbFbbbFbbbFp9op9qarawp;Meaqp;Kecwp:RepxbFbbbFbbbFbbbFbbp9op9qaDawp;Meaqp;Keczp:RepxbbFbbbFbbbFbbbFbp9op9qpklbkadaiav;8qbbskdnalTmbcbhvabhdinadczfgxaxpbbbgopxbbbbbbFFbbbbbbFFgkp9oadpbbbgDaopmbediwDqkzHOAKY8AEgwczp:Reczp:Sep;6egraDaopmlvorxmPsCXQL358E8FpxFubbFubbFubbFubbp9op;6eawczp:Sep;6egwp;Gearp;Gep;Kep;Legopxbbbbbbbbbbbbbbbbp:2egqarpxbbbjbbbjbbbjbbbjgmp9op9rp;Kegrpxb;:FSb;:FSb;:FSb;:FSararp;Meaoaop;Meawaqawamp9op9rp;Kegrarp;Mep;Kep;Kep;Jep;Negwp;Mepxbbn0bbn0bbn0bbn0gqp;KepxFFbbFFbbFFbbFFbbp9oaoawp;Meaqp;Keczp:Rep9qgoarawp;Meaqp;KepxFFbbFFbbFFbbFFbbp9ogrpmwDKYqk8AExm35Ps8E8Fp9qpkbbadaDakp9oaoarpmbezHdiOAlvCXorQLp9qpkbbadcafhdavclfgval6mbkkalaeSmbaiaeciGgvcitgdfcbcaad9R;8kbaiabalcitfglad;8qbbdnavTmbaiaipblzgopxbbbbbbFFbbbbbbFFgkp9oaipblbgDaopmbediwDqkzHOAKY8AEgwczp:Reczp:Sep;6egraDaopmlvorxmPsCXQL358E8FpxFubbFubbFubbFubbp9op;6eawczp:Sep;6egwp;Gearp;Gep;Kep;Legopxbbbbbbbbbbbbbbbbp:2egqarpxbbbjbbbjbbbjbbbjgmp9op9rp;Kegrpxb;:FSb;:FSb;:FSb;:FSararp;Meaoaop;Meawaqawamp9op9rp;Kegrarp;Mep;Kep;Kep;Jep;Negwp;Mepxbbn0bbn0bbn0bbn0gqp;KepxFFbbFFbbFFbbFFbbp9oaoawp;Meaqp;Keczp:Rep9qgoarawp;Meaqp;KepxFFbbFFbbFFbbFFbbp9ogrpmwDKYqk8AExm35Ps8E8Fp9qpklzaiaDakp9oaoarpmbezHdiOAlvCXorQLp9qpklbkalaiad;8qbbkk;4wllue97euv978Jjjjjbc8W9Rhidnaec98GglTmbcbhvabhoinaiaopbbbgraoczfgwpbbbgDpmlvorxmPsCXQL358E8Fgqczp:Segkclp:RepklbaopxbbjZbbjZbbjZbbjZpx;Zl81Z;Zl81Z;Zl81Z;Zl81Zakpxibbbibbbibbbibbbp9qp;6ep;NegkaraDpmbediwDqkzHOAKY8AEgrczp:Reczp:Sep;6ep;MegDaDp;Meakarczp:Sep;6ep;Megxaxp;Meakaqczp:Reczp:Sep;6ep;Megqaqp;Mep;Kep;Kep;Lepxbbbbbbbbbbbbbbbbp:4ep;Jepxb;:FSb;:FSb;:FSb;:FSgkp;Mepxbbn0bbn0bbn0bbn0grp;KepxFFbbFFbbFFbbFFbbgmp9oaxakp;Mearp;Keczp:Rep9qgxaDakp;Mearp;Keamp9oaqakp;Mearp;Keczp:Rep9qgkpmbezHdiOAlvCXorQLgrp5baipblbpEb:T:j83ibaocwfarp5eaipblbpEe:T:j83ibawaxakpmwDKYqk8AExm35Ps8E8Fgkp5baipblbpEd:T:j83ibaocKfakp5eaipblbpEi:T:j83ibaocafhoavclfgval6mbkkdnalaeSmbaiaeciGgvcitgofcbcaao9R;8kbaiabalcitfgwao;8qbbdnavTmbaiaipblbgraipblzgDpmlvorxmPsCXQL358E8Fgqczp:Segkclp:RepklaaipxbbjZbbjZbbjZbbjZpx;Zl81Z;Zl81Z;Zl81Z;Zl81Zakpxibbbibbbibbbibbbp9qp;6ep;NegkaraDpmbediwDqkzHOAKY8AEgrczp:Reczp:Sep;6ep;MegDaDp;Meakarczp:Sep;6ep;Megxaxp;Meakaqczp:Reczp:Sep;6ep;Megqaqp;Mep;Kep;Kep;Lepxbbbbbbbbbbbbbbbbp:4ep;Jepxb;:FSb;:FSb;:FSb;:FSgkp;Mepxbbn0bbn0bbn0bbn0grp;KepxFFbbFFbbFFbbFFbbgmp9oaxakp;Mearp;Keczp:Rep9qgxaDakp;Mearp;Keamp9oaqakp;Mearp;Keczp:Rep9qgkpmbezHdiOAlvCXorQLgrp5baipblapEb:T:j83ibaiarp5eaipblapEe:T:j83iwaiaxakpmwDKYqk8AExm35Ps8E8Fgkp5baipblapEd:T:j83izaiakp5eaipblapEi:T:j83iKkawaiao;8qbbkk:Pddiue978Jjjjjbc;ab9Rhidnadcd4ae2glc98GgvTmbcbheabhdinadadpbbbgocwp:Recwp:Sep;6eaocep:SepxbbjFbbjFbbjFbbjFp9opxbbjZbbjZbbjZbbjZp:Uep;Mepkbbadczfhdaeclfgeav6mbkkdnavalSmbaialciGgecdtgdVcbc;abad9R;8kbaiabavcdtfgvad;8qbbdnaeTmbaiaipblbgocwp:Recwp:Sep;6eaocep:SepxbbjFbbjFbbjFbbjFp9opxbbjZbbjZbbjZbbjZp:Uep;Mepklbkavaiad;8qbbkk9teiucbcbydj1jjbgeabcifc98GfgbBdj1jjbdndnabZbcztgd9nmbcuhiabad9RcFFifcz4nbcuSmekaehikaikkkebcjwklz:Dbb",n=new Uint8Array([0,97,115,109,1,0,0,0,1,4,1,96,0,0,3,3,2,0,0,5,3,1,0,1,12,1,0,10,22,2,12,0,65,0,65,0,65,0,252,10,0,0,11,7,0,65,0,253,15,26,11]),i=new Uint8Array([32,0,65,2,1,106,34,33,3,128,11,4,13,64,6,253,10,7,15,116,127,5,8,12,40,16,19,54,20,9,27,255,113,17,42,67,24,23,146,148,18,14,22,45,70,69,56,114,101,21,25,63,75,136,108,28,118,29,73,115]);if(typeof WebAssembly!="object")return{supported:!1};var o=WebAssembly.validate(n)?a(t):a(e),r,s=WebAssembly.instantiate(o,{}).then(function(C){r=C.instance,r.exports.__wasm_call_ctors()});function a(C){for(var V=new Uint8Array(C.length),L=0;L96?R-97:R>64?R-39:R+4}for(var G=0,L=0;L0?x(C,V,L,u[R],d[G]):s.then(function(){var I=new Uint8Array(C*V);return c(r,r.exports[u[R]],I,C,V,L,r.exports[d[G]]),I})}}}();var esn=T(S()),qrn=function(){var e="b9H79Tebbbe9Hk9Geueu9Geub9Gbb9Gsuuuuuuuuuuuu99uueu9Gvuuuuub9Gvuuuuue999Gquuuuuuu99uueu9Gwuuuuuu99ueu9Giuuue999Gluuuueu9GiuuueuizsdilvoirwDbqqbeqlve9Weiiviebeoweuecj:Pdkr:Tewo9TW9T9VV95dbH9F9F939H79T9F9J9H229F9Jt9VV7bbz9TW79O9V9Wt9F79P9T9W29P9M95bl8E9TW79O9V9Wt9F79P9T9W29P9M959x9Pt9OcttV9P9I91tW7bvQ9TW79O9V9Wt9F79P9T9W29P9M959q9V9P9Ut7boX9TW79O9V9Wt9F79P9T9W29P9M959t9J9H2Wbra9TW79O9V9Wt9F9V9Wt9P9T9P96W9wWVtW94SWt9J9O9sW9T9H9Wbwl79IV9RbDDwebcekdmxq;UMesdbk:kfvKue99euY99Qu8Jjjjjbc;W;qb9Rgs8Kjjjjbcbhzascxfcbc;Kbz:ljjjb8AdnabaeSmbabaeadcdtz:kjjjb8AkdnamcdGTmbalcrfci4gHcbyd;S1jjbHjjjjbbheascxfasyd2gOcdtfaeBdbasaOcefBd2aecbaHz:ljjjbhAcbhlcbhednadTmbcbhlabheadhHinaAaeydbgOci4fgCaCRbbgCceaOcrGgOtV86bbaCcu7aO4ceGalfhlaeclfheaHcufgHmbkcualcdtalcFFFFi0Ehekaecbyd;S1jjbHjjjjbbhzascxfasyd2gecdtfazBdbasaecefBd2alcd4alfhOcehHinaHgecethHaeaO6mbkcbhXcuaecdtgOaecFFFFi0Ecbyd;S1jjbHjjjjbbhHascxfasyd2gCcdtfaHBdbasaCcefBd2aHcFeaOz:ljjjbhQdnadTmbaecufhCcbhLinabaXcdtfgKydbgAc:v;t;h;Ev2hOcbhedndninaQaOaCGgOcdtfgYydbgHcuSmeazaHcdtfydbaASmdaecefgeaOfhOaeaC9nmbxdkkazaLcdtfaABdbaYaLBdbaLhHaLcefhLkaKaHBdbaXcefgXad9hmbkkaQcbyd;O1jjbH:bjjjbbasasyd2cufBd2kcualcefgecdtaecFFFFi0Ecbyd;S1jjbHjjjjbbh8Aascxfasyd2gecdtfa8ABdbasa8ABdlasaecefBd2cuadcitadcFFFFe0Ecbyd;S1jjbHjjjjbbhEascxfasyd2gecdtfaEBdbasaEBdwasaecefBd2asclfabadalcbz:cjjjbcualcdtg3alcFFFFi0Eg5cbyd;S1jjbHjjjjbbhQascxfasyd2gecdtfaQBdbasaecefBd2a5cbyd;S1jjbHjjjjbbh8Eascxfasyd2gecdtfa8EBdbasaecefBd2alcd4alfhOcehHinaHgecethHaeaO6mbkcbhLcuaecdtgOaecFFFFi0Ecbyd;S1jjbHjjjjbbhHascxfasyd2gCcdtfaHBdbasaCcefBd2aHcFeaOz:ljjjbhXdnalTmbavcd4hCaecufhHinaLhednazTmbazaLcdtfydbhekaiaeaC2cdtfgeydlgOcH4aO7c:F:b:DD2aeydbgOcH4aO7c;D;O:B8J27aeydwgecH4ae7c:3F;N8N27aHGheaLcdth8FdndndndndnazTmbaza8FfhKcbhOinaXaecdtfgYydbgAcuSmlaiazaAcdtfydbaC2cdtfaiaKydbaC2cdtfcxz:ojjjbTmiaOcefgOaefaHGheaOaH9nmbxdkkaiaLaC2cdtfhKcbhOinaXaecdtfgYydbgAcuSmiaiaAaC2cdtfaKcxz:ojjjbTmdaOcefgOaefaHGheaOaH9nmbkkcbhYkaYydbgecu9hmekaYaLBdbaLhekaQa8FfaeBdbaLcefgLal9hmbkcbhea8EhHinaHaeBdbaHclfhHalaecefge9hmbkcbheaQhHa8EhOindnaeaHydbgCSmbaOa8EaCcdtfgCydbBdbaCaeBdbkaHclfhHaOclfhOalaecefge9hmbkkcbhaaXcbyd;O1jjbH:bjjjbbasasyd2cufBd2alcbyd;S1jjbHjjjjbbhXascxfasyd2gecdtfaXBdbasaecefBd2a5cbyd;S1jjbHjjjjbbheascxfasyd2gHcdtfaeBdbasaHcefBd2a5cbyd;S1jjbHjjjjbbhHascxfasyd2gOcdtfaHBdbasaOcefBd2aecFea3z:ljjjbhhaHcFea3z:ljjjbhgdnalTmbaEcwfh8Jindna8AaagOcefgacdtfydbgCa8AaOcdtgefydbgHSmbaCaH9Rh8FaEaHcitfh3agaefh8KahaefhLcbhAindndna3aAcitfydbgYaO9hmbaLaOBdba8KaOBdbxekdna8AaYcdtg8LfgeclfydbgHaeydbgeSmbaEaecitgCfydbaOSmeaHae9Rh8Maecu7aHfhKa8JaCfhHcbheinaKaeSmeaecefheaHydbhCaHcwfhHaCaO9hmbkaea8M6mekaga8LfgeaOaYaeydbcuSEBdbaLaYaOaLydbcuSEBdbkaAcefgAa8F9hmbkkaaal9hmbkaQhHa8EhOaghCahhAcbheindndnaeaHydbgY9hmbdnaeaOydbgY9hmbaAydbhYdnaCydbgKcu9hmbaYcu9hmbaXaefcb86bbxikaXaefhLdnaeaKSmbaeaYSmbaLce86bbxikaLcl86bbxdkdnaea8EaYcdtgKfydb9hmbdnaCydbgLcuSmbaeaLSmbaAydbg8FcuSmbaea8FSmbagaKfydbg3cuSmba3aYSmbahaKfydbgKcuSmbaKaYSmbdnaQaLcdtfydbgYaQaKcdtfydb9hmbaYaQa8FcdtfydbgKSmbaKaQa3cdtfydb9hmbaXaefcd86bbxlkaXaefcl86bbxikaXaefcl86bbxdkaXaefcl86bbxekaXaefaXaYfRbb86bbkaHclfhHaOclfhOaCclfhCaAclfhAalaecefge9hmbkdnaqTmbdndnazTmbazheaQhHalhOindnaqaeydbfRbbTmbaXaHydbfcl86bbkaeclfheaHclfhHaOcufgOmbxdkkaQhealhHindnaqRbbTmbaXaeydbfcl86bbkaqcefhqaeclfheaHcufgHmbkkaQhealhOaXhHindnaXaeydbfRbbcl9hmbaHcl86bbkaeclfheaHcefhHaOcufgOmbkkamceGTmbaXhealhHindnaeRbbce9hmbaecl86bbkaecefheaHcufgHmbkkcualcx2alc;v:Q;v:Qe0Ecbyd;S1jjbHjjjjbbhaascxfasyd2gecdtfaaBdbasaecefBd2aaaialavazz:djjjbh8NdndnaDmbcbhycbh8Jxekcbh8JawhecbhHindnaeIdbJbbbb9ETmbasc;Wbfa8JcdtfaHBdba8Jcefh8JkaeclfheaDaHcefgH9hmbkcua8Jal2gecdtaecFFFFi0Ecbyd;S1jjbHjjjjbbhyascxfasyd2gecdtfayBdbasaecefBd2alTmba8JTmbarcd4hLdnazTmba8JcdthicbhYayhKinaoazaYcdtfydbaL2cdtfhAasc;WbfheaKhHa8JhOinaHaAaeydbcdtgCfIdbawaCfIdbNUdbaeclfheaHclfhHaOcufgOmbkaKaifhKaYcefgYal9hmbxdkka8JcdthicbhYayhKinaoaYaL2cdtfhAasc;WbfheaKhHa8JhOinaHaAaeydbcdtgCfIdbawaCfIdbNUdbaeclfheaHclfhHaOcufgOmbkaKaifhKaYcefgYal9hmbkkcualc8S2gHalc;D;O;f8U0EgCcbyd;S1jjbHjjjjbbheascxfasyd2gOcdtfaeBdbasaOcefBd2aecbaHz:ljjjbhqdndndndna8JTmbaCcbyd;S1jjbHjjjjbbhvascxfasyd2gecdtfavBdbcehOasaecefBd2avcbaHz:ljjjb8Acua8Jal2gecltgHaecFFFFb0Ecbyd;S1jjbHjjjjbbhrascxfasyd2gecdtfarBdbasaecefBd2arcbaHz:ljjjb8AadmexikcbhvadTmecbhrkcbhAabhHindnaaaHclfydbgYcx2fgeIdbaaaHydbgKcx2fgOIdbg8P:tgIaaaHcwfydbgLcx2fgCIdlaOIdlg8R:tg8SNaCIdba8P:tgRaeIdla8R:tg8UN:tg8Va8VNa8UaCIdwaOIdwg8W:tg8XNa8SaeIdwa8W:tg8UN:tg8Sa8SNa8UaRNa8XaIN:tgIaINMM:rgRJbbbb9ETmba8VaR:vh8VaIaR:vhIa8SaR:vh8SkaqaQaKcdtfydbc8S2fgea8SaR:rgRa8SNNg8UaeIdbMUdbaeaIaRaINg8YNg8XaeIdlMUdlaea8VaRa8VNg8ZNg80aeIdwMUdwaea8Ya8SNg8YaeIdxMUdxaea8Za8SNg81aeIdzMUdzaea8ZaINg8ZaeIdCMUdCaea8SaRa8Va8WNa8Sa8PNa8RaINMM:mg8RNg8PNg8SaeIdKMUdKaeaIa8PNgIaeId3MUd3aea8Va8PNg8VaeIdaMUdaaea8Pa8RNg8PaeId8KMUd8KaeaRaeIdyMUdyaqaQaYcdtfydbc8S2fgea8UaeIdbMUdbaea8XaeIdlMUdlaea80aeIdwMUdwaea8YaeIdxMUdxaea81aeIdzMUdzaea8ZaeIdCMUdCaea8SaeIdKMUdKaeaIaeId3MUd3aea8VaeIdaMUdaaea8PaeId8KMUd8KaeaRaeIdyMUdyaqaQaLcdtfydbc8S2fgea8UaeIdbMUdbaea8XaeIdlMUdlaea80aeIdwMUdwaea8YaeIdxMUdxaea81aeIdzMUdzaea8ZaeIdCMUdCaea8SaeIdKMUdKaeaIaeId3MUd3aea8VaeIdaMUdaaea8PaeId8KMUd8KaeaRaeIdyMUdyaHcxfhHaAcifgAad6mbkcbhiabhKinabaicdtfhYcbhHinaXaYaHc:G1jjbfydbcdtfydbgOfRbbhedndnaXaKaHfydbgCfRbbgAc99fcFeGcpe0mbaeceSmbaecd9hmekdnaAcufcFeGce0mbahaCcdtfydbaO9hmekdnaecufcFeGce0mbagaOcdtfydbaC9hmekdnaAcv2aefcj1jjbfRbbTmbaQaOcdtfydbaQaCcdtfydb0mekJbbacJbbacJbbjZaeceSEaAceSEh8ZdnaaaYaHc:K1jjbfydbcdtfydbcx2fgeIdwaaaCcx2fgAIdwg8R:tg8VaaaOcx2fgLIdwa8R:tg8Sa8SNaLIdbaAIdbg8W:tgIaINaLIdlaAIdlg8U:tgRaRNMMg8PNa8Va8SNaeIdba8W:tg80aINaRaeIdla8U:tg8YNMMg8Xa8SN:tg8Va8VNa80a8PNa8XaIN:tg8Sa8SNa8Ya8PNa8XaRN:tgIaINMM:rgRJbbbb9ETmba8VaR:vh8VaIaR:vhIa8SaR:vh8SkaqaQaCcdtfydbc8S2fgea8Sa8Za8P:rNgRa8SNNg8XaeIdbMUdbaeaIaRaINg8ZNg80aeIdlMUdlaea8VaRa8VNg8PNg8YaeIdwMUdwaea8Za8SNg8ZaeIdxMUdxaea8Pa8SNg81aeIdzMUdzaea8PaINgBaeIdCMUdCaea8SaRa8Va8RNa8Sa8WNa8UaINMM:mg8RNg8PNg8SaeIdKMUdKaeaIa8PNgIaeId3MUd3aea8Va8PNg8VaeIdaMUdaaea8Pa8RNg8PaeId8KMUd8KaeaRaeIdyMUdyaqaQaOcdtfydbc8S2fgea8XaeIdbMUdbaea80aeIdlMUdlaea8YaeIdwMUdwaea8ZaeIdxMUdxaea81aeIdzMUdzaeaBaeIdCMUdCaea8SaeIdKMUdKaeaIaeId3MUd3aea8VaeIdaMUdaaea8PaeId8KMUd8KaeaRaeIdyMUdykaHclfgHcx9hmbkaKcxfhKaicifgiad6mbkdna8JTmbcbhKinJbbbbh8WaaabaKcdtfgeclfydbgLcx2fgHIdwaaaeydbgicx2fgOIdwg8Y:tgIaINaHIdbaOIdbg81:tg8Va8VNaHIdlaOIdlgB:tgRaRNMMg8Zaaaecwfydbg8Fcx2fgeIdwa8Y:tg8PNaIaIa8PNa8VaeIdba81:tg8RNaRaeIdlaB:tg8UNMMg8SN:tJbbbbJbbjZa8Za8Pa8PNa8Ra8RNa8Ua8UNMMg80Na8Sa8SN:tg8X:va8XJbbbb9BEg8XNh83a80aINa8Pa8SN:ta8XNhUa8Za8UNaRa8SN:ta8XNh85a80aRNa8Ua8SN:ta8XNh86a8Za8RNa8Va8SN:ta8XNh87a80a8VNa8Ra8SN:ta8XNh88a8Va8UNa8RaRN:tg8Sa8SNaRa8PNa8UaIN:tg8Sa8SNaIa8RNa8Pa8VN:tg8Sa8SNMM:rJbbbZNh8Sayaia8J2g3cdtfhHaya8Fa8J2gwcdtfhOayaLa8J2g8LcdtfhCa8Y:mh89aB:mh8:a81:mhZcbhAa8JhYJbbbbh8UJbbbbh8XJbbbbh8ZJbbbbh80Jbbbbh8YJbbbbh81JbbbbhBJbbbbhnJbbbbhcinasc;WbfaAfgecwfa8SaUaCIdbaHIdbg8P:tgRNa83aOIdba8P:tg8RNMgINUdbaeclfa8Sa86aRNa85a8RNMg8VNUdbaea8Sa88aRNa87a8RNMgRNUdbaecxfa8Sa89aINa8:a8VNa8PaZaRNMMMg8PNUdba8SaIa8VNNa80Mh80a8SaIaRNNa8YMh8Ya8Sa8VaRNNa81Mh81a8Sa8Pa8PNNa8WMh8Wa8SaIa8PNNa8UMh8Ua8Sa8Va8PNNa8XMh8Xa8SaRa8PNNa8ZMh8Za8SaIaINNaBMhBa8Sa8Va8VNNanMhna8SaRaRNNacMhcaHclfhHaCclfhCaOclfhOaAczfhAaYcufgYmbkavaic8S2fgeacaeIdbMUdbaeanaeIdlMUdlaeaBaeIdwMUdwaea81aeIdxMUdxaea8YaeIdzMUdzaea80aeIdCMUdCaea8ZaeIdKMUdKaea8XaeId3MUd3aea8UaeIdaMUdaaea8WaeId8KMUd8Kaea8SaeIdyMUdyavaLc8S2fgeacaeIdbMUdbaeanaeIdlMUdlaeaBaeIdwMUdwaea81aeIdxMUdxaea8YaeIdzMUdzaea80aeIdCMUdCaea8ZaeIdKMUdKaea8XaeId3MUd3aea8UaeIdaMUdaaea8WaeId8KMUd8Kaea8SaeIdyMUdyava8Fc8S2fgeacaeIdbMUdbaeanaeIdlMUdlaeaBaeIdwMUdwaea81aeIdxMUdxaea8YaeIdzMUdzaea80aeIdCMUdCaea8ZaeIdKMUdKaea8XaeId3MUd3aea8UaeIdaMUdaaea8WaeId8KMUd8Kaea8SaeIdyMUdyara3cltfhYcbhHa8JhCinaYaHfgeasc;WbfaHfgOIdbaeIdbMUdbaeclfgAaOclfIdbaAIdbMUdbaecwfgAaOcwfIdbaAIdbMUdbaecxfgeaOcxfIdbaeIdbMUdbaHczfhHaCcufgCmbkara8LcltfhYcbhHa8JhCinaYaHfgeasc;WbfaHfgOIdbaeIdbMUdbaeclfgAaOclfIdbaAIdbMUdbaecwfgAaOcwfIdbaAIdbMUdbaecxfgeaOcxfIdbaeIdbMUdbaHczfhHaCcufgCmbkarawcltfhYcbhHa8JhCinaYaHfgeasc;WbfaHfgOIdbaeIdbMUdbaeclfgAaOclfIdbaAIdbMUdbaecwfgAaOcwfIdbaAIdbMUdbaecxfgeaOcxfIdbaeIdbMUdbaHczfhHaCcufgCmbkaKcifgKad6mbkkcbhOxekcehOcbhrkcbh8FdndnamcwGg9cmbJbbbbh8ZcbhJcbhocbhCxekcbhea5cbyd;S1jjbHjjjjbbhCascxfasyd2gHcdtfaCBdbasaHcefBd2dnalTmbaChHinaHaeBdbaHclfhHalaecefge9hmbkkdnaOmbcbhiinabaicdtfhLcbhKinaQaLaKcdtgec:G1jjbfydbcdtfydbcdtfydbhHdnaCaQaLaefydbcdtfydbgOcdtfgAydbgeaOSmbinaAaCaegOcdtfgYydbgeBdbaYhAaOae9hmbkkdnaCaHcdtfgAydbgeaHSmbinaAaCaegHcdtfgYydbgeBdbaYhAaHae9hmbkkdnaOaHSmbaCaOaHaOaH0EcdtfaOaHaOaH6EBdbkaKcefgKci9hmbkaicifgiad6mbkkcbhJdnalTmbcbhYindnaQaYcdtgefydbaY9hmbaYhHdnaCaefgKydbgeaYSmbaKhOinaOaCaegHcdtfgAydbgeBdbaAhOaHae9hmbkkaKaHBdbkaYcefgYal9hmbkcbheaQhOaChHcbhJindndnaeaOydbgA9hmbdnaeaHydbgA9hmbaHaJBdbaJcefhJxdkaHaCaAcdtfydbBdbxekaHaCaAcdtfydbBdbkaOclfhOaHclfhHalaecefge9hmbkkcuaJcltgeaJcjjjjiGEcbyd;S1jjbHjjjjbbhoascxfasyd2gHcdtfaoBdbasaHcefBd2aocbaez:ljjjbhAdnalTmbaChOaahealhYinaecwfIdbh8SaeclfIdbhIaAaOydbcltfgHaeIdbaHIdbMUdbaHclfgKaIaKIdbMUdbaHcwfgKa8SaKIdbMUdbaHcxfgHaHIdbJbbjZMUdbaOclfhOaecxfheaYcufgYmbkkdnaJTmbaAheaJhHinaecxfgOIdbh8SaOcbBdbaeaeIdbJbbbbJbbjZa8S:va8SJbbbb9BEg8SNUdbaeclfgOa8SaOIdbNUdbaecwfgOa8SaOIdbNUdbaeczfheaHcufgHmbkkdnalTmbaChOaahealhYinaAaOydbcltfgHcxfgKaecwfIdbaHcwfIdb:tg8Sa8SNaeIdbaHIdb:tg8Sa8SNaeclfIdbaHclfIdb:tg8Sa8SNMMg8SaKIdbgIaIa8S9DEUdbaOclfhOaecxfheaYcufgYmbkkdnaJmbcbhJJFFuuh8ZxekaAcxfheaAhHaJhOinaHaeIdbUdbaeczfheaHclfhHaOcufgOmbkJFFuuh8ZaAheaJhHinaeIdbg8Sa8Za8Za8S9EEh8ZaeclfheaHcufgHmbkkasydlh9ednalTmba9eclfhea9eydbhAaXhHalhYcbhOincbaeydbgKaA9RaHRbbcpeGEaOfhOaHcefhHaeclfheaKhAaYcufgYmbkaOce4h8Fkcuada8F9RcifgTcx2aTc;v:Q;v:Qe0Ecbyd;S1jjbHjjjjbbhDascxfasyd2gecdtfaDBdbasaecefBd2cuaTcdtaTcFFFFi0Ecbyd;S1jjbHjjjjbbhSascxfasyd2gecdtfaSBdbasaecefBd2a5cbyd;S1jjbHjjjjbbh8Mascxfasyd2gecdtfa8MBdbasaecefBd2alcbyd;S1jjbHjjjjbbh9hascxfasyd2gecdtfa9hBdbasaecefBd2axaxNa8NJbbjZamclGEg83a83N:vhcJbbbbhndnadak9nmbdnaTci6mba8Jclth9iaDcwfh6JbbbbhBJbbbbhninasclfabadalaQz:cjjjbabh8FcbhEcbh5inaba5cdtfh3cbheindnaQa8FaefydbgOcdtgifydbgYaQa3aec:W1jjbfydbcdtfydbgHcdtgwfydbgKSmbaXaHfRbbgLcv2aXaOfRbbgAfc;a1jjbfRbbg8AaAcv2aLfg8Lc;a1jjbfRbbg8KVcFeGTmbdnaKaY9nmba8Lcj1jjbfRbbcFeGmekaAcufhYdnaAaL9hmbaYcFeGce0mbahaifydbaH9hmekdndnaAclSmbaLcl9hmekdnaYcFeGce0mbahaifydbaH9hmdkaLcufcFeGce0mbagawfydbaO9hmekaDaEcx2fgAaHaOa8KcFeGgYEBdlaAaOaHaYEBdbaAaYa8AGcb9hBdwaEcefhEkaeclfgecx9hmbkdna5cifg5ad9pmba8Fcxfh8FaEcifaT9nmekkaETmdcbhiinJbbbbJbbjZaqaQaDaicx2fgAydlgKaAydbgYaAydwgHEgLcdtfydbc8S2fgeIdyg8S:va8SJbbbb9BEaeIdwaaaYaKaHEg8Fcx2fgHIdwgRNaeIdzaHIdbg8PNaeIdaMg8Sa8SMMaRNaeIdlaHIdlg8RNaeIdCaRNaeId3Mg8Sa8SMMa8RNaeIdba8PNaeIdxa8RNaeIdKMg8Sa8SMMa8PNaeId8KMMM:lNh80JbbbbJbbjZaqaQaYcdtfydbc8S2fgeIdyg8S:va8SJbbbb9BEaeIdwaaaKcx2fgHIdwg8VNaeIdzaHIdbg8WNaeIdaMg8Sa8SMMa8VNaeIdlaHIdlg8UNaeIdCa8VNaeId3Mg8Sa8SMMa8UNaeIdba8WNaeIdxa8UNaeIdKMg8Sa8SMMa8WNaeId8KMMM:lNh8YaAcwfh3aAclfhwdna8JTmbavaYc8S2fgOIdwa8VNaOIdza8WNaOIdaMg8Sa8SMMa8VNaOIdla8UNaOIdCa8VNaOId3Mg8Sa8SMMa8UNaOIdba8WNaOIdxa8UNaOIdKMg8Sa8SMMa8WNaOId8KMMMh8SayaKa8J2cdtfhHaraYa8J2cltfheaOIdyh8Xa8JhOinaHIdbgIaIa8XNaecxfIdba8VaecwfIdbNa8WaeIdbNa8UaeclfIdbNMMMgIaIM:tNa8SMh8SaHclfhHaeczfheaOcufgOmbkavaLc8S2fgOIdwaRNaOIdza8PNaOIdaMgIaIMMaRNaOIdla8RNaOIdCaRNaOId3MgIaIMMa8RNaOIdba8PNaOIdxa8RNaOIdKMgIaIMMa8PNaOId8KMMMhIaya8Fa8J2cdtfhHaraLa8J2cltfheaOIdyh8Wa8JhOinaHIdbg8Va8Va8WNaecxfIdbaRaecwfIdbNa8PaeIdbNa8RaeclfIdbNMMMg8Va8VM:tNaIMhIaHclfhHaeczfheaOcufgOmbka80aI:lMh80a8Ya8S:lMh8YkawaKa8Fa8Ya809FgeEBdbaAaYaLaeEBdba3a8Ya80aeEUdbaicefgiaE9hmbkasc;Wbfcbcj;qbz:ljjjb8Aa6heaEhHinasc;WbfaeydbcA4cF8FGgOcFAaOcFA6EcdtfgOaOydbcefBdbaecxfheaHcufgHmbkcbhecbhHinasc;WbfaefgOydbhAaOaHBdbaAaHfhHaeclfgecj;qb9hmbkcbhea6hHinasc;WbfaHydbcA4cF8FGgOcFAaOcFA6EcdtfgOaOydbgOcefBdbaSaOcdtfaeBdbaHcxfhHaEaecefge9hmbkadak9RgOci9Uh9kdnalTmbcbhea8MhHinaHaeBdbaHclfhHalaecefge9hmbkkcbh0a9hcbalz:ljjjbh9maOcO9Uh9na9kce4h9oasydwh9pcbh8KcbhwdninaDaSawcdtfydbcx2fg3Idwg8Sac9Emea8Ka9k9pmeJFFuuhIdna9oaE9pmbaDaSa9ocdtfydbcx2fIdwJbb;aZNhIkdna8SaI9ETmba8San9ETmba8Ka9n0mdkdna9maQa3ydlgicdtg9qfydbgAfg9rRbba9maQa3ydbgLcdtg9sfydbgHfg9tRbbVmbaXaLfRbbh9udna9eaHcdtfgeclfydbgOaeydbgeSmbaOae9RhKa9paecitfheaaaAcx2fg8Lcwfh5a8Lclfh9vaaaHcx2fg8Acwfh9wa8Aclfh9xcbhHceh8Fdnindna8MaeydbcdtfydbgOaASmba8MaeclfydbcdtfydbgYaASmbaOaYSmbaaaYcx2fgYIdbaaaOcx2fgOIdbg8V:tg8Sa9xIdbaOIdlgR:tg8WNa8AIdba8V:tg8UaYIdlaR:tgIN:tg8Pa8Sa9vIdbaR:tg8XNa8LIdba8V:tg80aIN:tgRNaIa9wIdbaOIdwg8R:tg8YNa8WaYIdwa8R:tg8VN:tg8WaIa5Idba8R:tg81Na8Xa8VN:tgINa8Va8UNa8Ya8SN:tg8Ra8Va80Na81a8SN:tg8SNMMa8Pa8PNa8Wa8WNa8Ra8RNMMaRaRNaIaINa8Sa8SNMMN:rJbbj8:N9FmdkaecwfheaHcefgHaK6h8FaKaH9hmbkka8FceGTmba9ocefh9oxeka3cwfhHdndndndna9uc9:fPdebdkaLheina8MaecdtgefaiBdba8EaefydbgeaL9hmbxikkdnagahaha9sfydbaiSEa8Ea9sfydbgLcdtfydbgecu9hmba8Ea9qfydbheka8Ma9sfaiBdbaehika8MaLcdtfaiBdbka9tce86bba9rce86bbaHIdbg8Sanana8S9DEhna0cefh0cecda9uceSEa8Kfh8KkawcefgwaE9hmbkka0TmddnalTmbcbhKcbhiindna8MaicdtgefydbgOaiSmbaQaOcdtfydbh8FdnaiaQaefydb9hg3mbaqa8Fc8S2fgeaqaic8S2fgHIdbaeIdbMUdbaeaHIdlaeIdlMUdlaeaHIdwaeIdwMUdwaeaHIdxaeIdxMUdxaeaHIdzaeIdzMUdzaeaHIdCaeIdCMUdCaeaHIdKaeIdKMUdKaeaHId3aeId3MUd3aeaHIdaaeIdaMUdaaeaHId8KaeId8KMUd8KaeaHIdyaeIdyMUdyka8JTmbavaOc8S2fgeavaic8S2gwfgHIdbaeIdbMUdbaeaHIdlaeIdlMUdlaeaHIdwaeIdwMUdwaeaHIdxaeIdxMUdxaeaHIdzaeIdzMUdzaeaHIdCaeIdCMUdCaeaHIdKaeIdKMUdKaeaHId3aeId3MUd3aeaHIdaaeIdaMUdaaeaHId8KaeId8KMUd8KaeaHIdyaeIdyMUdya9iaO2hLarhHa8JhAinaHaLfgeaHaKfgOIdbaeIdbMUdbaeclfgYaOclfIdbaYIdbMUdbaecwfgYaOcwfIdbaYIdbMUdbaecxfgeaOcxfIdbaeIdbMUdbaHczfhHaAcufgAmbka3mbJbbbbJbbjZaqawfgeIdyg8S:va8SJbbbb9BEaeIdwaaa8Fcx2fgHIdwg8SNaeIdzaHIdbgINaeIdaMg8Va8VMMa8SNaeIdlaHIdlg8VNaeIdCa8SNaeId3Mg8Sa8SMMa8VNaeIdbaINaeIdxa8VNaeIdKMg8Sa8SMMaINaeId8KMMM:lNg8SaBaBa8S9DEhBkaKa9ifhKaicefgial9hmbkcbhHahheindnaeydbgOcuSmbdnaHa8MaOcdtgAfydbgO9hmbcuhOahaAfydbgAcuSmba8MaAcdtfydbhOkaeaOBdbkaeclfhealaHcefgH9hmbkcbhHagheindnaeydbgOcuSmbdnaHa8MaOcdtgAfydbgO9hmbcuhOagaAfydbgAcuSmba8MaAcdtfydbhOkaeaOBdbkaeclfhealaHcefgH9hmbkkaBana8JEhBcbhYabhecbhKindna8MaeydbcdtfydbgHa8MaeclfydbcdtfydbgOSmbaHa8MaecwfydbcdtfydbgASmbaOaASmbabaYcdtfgLaHBdbaLcwfaABdbaLclfaOBdbaYcifhYkaecxfheaKcifgKad6mbkdndna9cTmbaYak9nmba8ZaB9FTmbcbhdabhecbhHindnaoaCaeydbgOcdtfydbcdtfIdbaB9ETmbabadcdtfgAaOBdbaAclfaeclfydbBdbaAcwfaecwfydbBdbadcifhdkaecxfheaHcifgHaY6mbkJFFuuh8ZaJTmeaoheaJhHJFFuuh8SinaeIdbgIa8Sa8SaI9EEg8Va8SaIaB9EgOEh8Sa8Va8ZaOEh8ZaeclfheaHcufgHmbxdkkaYhdkadak0mbxdkkasclfabadalaQz:cjjjbkdndnadak0mbadhOxekdna9cmbadhOxekdna8Zac9FmbadhOxekina8ZJbb;aZNg8Saca8Sac9DEh8VJbbbbh8SdnaJTmbaoheaJhHinaeIdbgIa8SaIa8V9FEa8SaIa8S9EEh8SaeclfheaHcufgHmbkkcbhOabhecbhHindnaoaCaeydbgAcdtfydbcdtfIdba8V9ETmbabaOcdtfgYaABdbaYclfaeclfydbBdbaYcwfaecwfydbBdbaOcifhOkaecxfheaHcifgHad6mbkJFFuuh8ZdnaJTmbaoheaJhHJFFuuhIinaeIdbgRaIaIaR9EEg8PaIaRa8V9EgAEhIa8Pa8ZaAEh8ZaeclfheaHcufgHmbkkdnaOad9hmbadhOxdka8Sanana8S9DEhnaOak9nmeaOhda8Zac9FmbkkdnamcjjjjlGTmbazmbaOTmbcbhQabheinaXaeydbgAfRbbc3thKaecwfgLydbhHdndnahaAcdtg8FfydbaeclfgiydbgCSmbcbhYagaCcdtfydbaA9hmekcjjjj94hYkaeaKaYVaAVBdbaXaCfRbbc3thKdndnahaCcdtfydbaHSmbcbhYagaHcdtfydbaC9hmekcjjjj94hYkaiaKaYVaCVBdbaXaHfRbbc3thYdndnahaHcdtfydbaASmbcbhCaga8FfydbaH9hmekcjjjj94hCkaLaYaCVaHVBdbaecxfheaQcifgQaO6mbkkdnazTmbaOTmbaOheinabazabydbcdtfydbBdbabclfhbaecufgembkkdnaPTmbaPa83an:rNUdbkasyd2gecdtascxffc98fhHdninaeTmeaHydbcbyd;O1jjbH:bjjjbbaHc98fhHaecufhexbkkasc;W;qbf8KjjjjbaOk;Yieouabydlhvabydbclfcbaicdtz:ljjjbhoadci9UhrdnadTmbdnalTmbaehwadhDinaoalawydbcdtfydbcdtfgqaqydbcefBdbawclfhwaDcufgDmbxdkkaehwadhDinaoawydbcdtfgqaqydbcefBdbawclfhwaDcufgDmbkkdnaiTmbcbhDaohwinawydbhqawaDBdbawclfhwaqaDfhDaicufgimbkkdnadci6mbinaecwfydbhwaeclfydbhDaeydbhidnalTmbalawcdtfydbhwalaDcdtfydbhDalaicdtfydbhikavaoaicdtfgqydbcitfaDBdbavaqydbcitfawBdlaqaqydbcefBdbavaoaDcdtfgqydbcitfawBdbavaqydbcitfaiBdlaqaqydbcefBdbavaoawcdtfgwydbcitfaiBdbavawydbcitfaDBdlawawydbcefBdbaecxfhearcufgrmbkkabydbcbBdbk;Podvuv998Jjjjjbca9RgvcFFF;7rBd3av9cFFF;7;3FF:;Fb83dCavcFFF97Bdzav9cFFF;7FFF:;u83dwdnadTmbaicd4hodnabmbdnalTmbcbhrinaealarcdtfydbao2cdtfhwcbhiinavcCfaifgDawaifIdbgqaDIdbgkakaq9EEUdbavcwfaifgDaqaDIdbgkakaq9DEUdbaiclfgicx9hmbkarcefgrad9hmbxikkaocdthrcbhwincbhiinavcCfaifgDaeaifIdbgqaDIdbgkakaq9EEUdbavcwfaifgDaqaDIdbgkakaq9DEUdbaiclfgicx9hmbkaearfheawcefgwad9hmbxdkkdnalTmbcbhrinabarcx2fgiaealarcdtfydbao2cdtfgwIdbUdbaiawIdlUdlaiawIdwUdwcbhiinavcCfaifgDawaifIdbgqaDIdbgkakaq9EEUdbavcwfaifgDaqaDIdbgkakaq9DEUdbaiclfgicx9hmbkarcefgrad9hmbxdkkaocdthlcbhraehwinabarcx2fgiaearao2cdtfgDIdbUdbaiaDIdlUdlaiaDIdwUdwcbhiinavcCfaifgDawaifIdbgqaDIdbgkakaq9EEUdbavcwfaifgDaqaDIdbgkakaq9DEUdbaiclfgicx9hmbkawalfhwarcefgrad9hmbkkJbbbbavIdwavIdCgk:tgqaqJbbbb9DEgqavIdxavIdKgx:tgmamaq9DEgqavIdzavId3gm:tgPaPaq9DEhPdnabTmbadTmbJbbbbJbbjZaP:vaPJbbbb9BEhqinabaqabIdbak:tNUdbabclfgvaqavIdbax:tNUdbabcwfgvaqavIdbam:tNUdbabcxfhbadcufgdmbkkaPk8MbabaeadaialavcbcbcbcbcbaoarawaDz:bjjjbk8MbabaeadaialavaoarawaDaqakaxamaPz:bjjjbk:nCoDud99rue99lul998Jjjjjbc;Wb9Rgw8KjjjjbdndnarmbcbhDxekawcxfcbc;Kbz:ljjjb8Aawcuadcx2adc;v:Q;v:Qe0Ecbyd;S1jjbHjjjjbbgqBdxawceBd2aqaeadaicbz:djjjb8AawcuadcdtadcFFFFi0Egkcbyd;S1jjbHjjjjbbgxBdzawcdBd2adcd4adfhmceheinaegicetheaiam6mbkcbhPawcuaicdtgsaicFFFFi0Ecbyd;S1jjbHjjjjbbgzBdCawciBd2dndnar:ZgH:rJbbbZMgO:lJbbb9p9DTmbaO:Ohexekcjjjj94hekaicufhAc:bwhmcbhCadhXcbhQinaChLaeamgKcufaeaK9iEaPgDcefaeaD9kEhYdndnadTmbaYcuf:YhOaqhiaxheadhmindndnaiIdbaONJbbbZMg8A:lJbbb9p9DTmba8A:OhCxekcjjjj94hCkaCcCthCdndnaiclfIdbaONJbbbZMg8A:lJbbb9p9DTmba8A:OhExekcjjjj94hEkaEcqtaCVhCdndnaicwfIdbaONJbbbZMg8A:lJbbb9p9DTmba8A:OhExekcjjjj94hEkaeaCaEVBdbaicxfhiaeclfheamcufgmmbkazcFeasz:ljjjbh3cbh5cbh8Eindna3axa8EcdtfydbgCcm4aC7c:v;t;h;Ev2gics4ai7aAGgmcdtfgEydbgecuSmbaeaCSmbcehiina3amaifaAGgmcdtfgEydbgecuSmeaicefhiaeaC9hmbkkaEaCBdba5aecuSfh5a8Ecefg8Ead9hmbxdkkazcFeasz:ljjjb8Acbh5kaDaYa5ar0giEhPaLa5aiEhCdna5arSmbaYaKaiEgmaP9Rcd9imbdndnaQcl0mbdnaX:ZgOaL:Zg8A:taY:Yg8FaD:Y:tgaa8FaK:Y:tgha5:ZggaH:tNNNaOaH:tahNa8Aag:tNa8AaH:taaNagaO:tNM:va8FMJbbbZMgO:lJbbb9p9DTmbaO:Ohexdkcjjjj94hexekaPamfcd9Theka5aXaiEhXaQcefgQcs9hmekkdndnaCmbcihicbhDxekcbhiawakcbyd;S1jjbHjjjjbbg8EBdKawclBd2aPcuf:Yh8AdndnadTmbaqhiaxheadhmindndnaiIdba8ANJbbbZMgO:lJbbb9p9DTmbaO:OhCxekcjjjj94hCkaCcCthCdndnaiclfIdba8ANJbbbZMgO:lJbbb9p9DTmbaO:OhExekcjjjj94hEkaEcqtaCVhCdndnaicwfIdba8ANJbbbZMgO:lJbbb9p9DTmbaO:OhExekcjjjj94hEkaeaCaEVBdbaicxfhiaeclfheamcufgmmbkazcFeasz:ljjjbh3cbhDcbh5inaxa5cdtgYfydbgCcm4aC7c:v;t;h;Ev2gics4ai7hecbhidndnina3aeaAGgmcdtfgEydbgecuSmednaxaecdtgEfydbaCSmbaicefgiamfheaiaA9nmekka8EaEfydbhixekaEa5BdbaDhiaDcefhDka8EaYfaiBdba5cefg5ad9hmbkcuaDc32giaDc;j:KM;jb0EhexekazcFeasz:ljjjb8AcbhDcbhekawaecbyd;S1jjbHjjjjbbgeBd3awcvBd2aecbaiz:ljjjbhEavcd4hxdnadTmbdnalTmbaxcdth3a8EhCalheaqhmadhAinaEaCydbc32fgiamIdbaiIdbMUdbaiamclfIdbaiIdlMUdlaiamcwfIdbaiIdwMUdwaiaeIdbaiIdxMUdxaiaeclfIdbaiIdzMUdzaiaecwfIdbaiIdCMUdCaiaiIdKJbbjZMUdKaCclfhCaea3fheamcxfhmaAcufgAmbxdkka8EhmaqheadhCinaEamydbc32fgiaeIdbaiIdbMUdbaiaeclfIdbaiIdlMUdlaiaecwfIdbaiIdwMUdwaiaiIdxJbbbbMUdxaiaiIdzJbbbbMUdzaiaiIdCJbbbbMUdCaiaiIdKJbbjZMUdKamclfhmaecxfheaCcufgCmbkkdnaDTmbaEhiaDheinaiaiIdbJbbbbJbbjZaicKfIdbgO:vaOJbbbb9BEgONUdbaiclfgmaOamIdbNUdbaicwfgmaOamIdbNUdbaicxfgmaOamIdbNUdbaiczfgmaOamIdbNUdbaicCfgmaOamIdbNUdbaic3fhiaecufgembkkcbhCawcuaDcdtgYaDcFFFFi0Egicbyd;S1jjbHjjjjbbgeBdaawcoBd2awaicbyd;S1jjbHjjjjbbg3Bd8KaecFeaYz:ljjjbh5dnadTmbJbbjZJbbjZa8A:vaPceSEaoNgOaONh8Aaxcdthxalheina8Aaec;C1jjbalEgmIdwaEa8EydbgAc32fgiIdC:tgOaONamIdbaiIdx:tgOaONamIdlaiIdz:tgOaONMMNaqcwfIdbaiIdw:tgOaONaqIdbaiIdb:tgOaONaqclfIdbaiIdl:tgOaONMMMhOdndna5aAcdtgifgmydbcuSmba3aifIdbaO9ETmekamaCBdba3aifaOUdbka8Eclfh8EaeaxfheaqcxfhqadaCcefgC9hmbkkaba5aYz:kjjjb8AcrhikaicdthiinaiTmeaic98fgiawcxffydbcbyd;O1jjbH:bjjjbbxbkkawc;Wbf8KjjjjbaDk:Odieui99iu8Jjjjjbca9RgicFFF;7rBd3ai9cFFF;7;3FF:;Fb83dCaicFFF97Bdzai9cFFF;7FFF:;u83dwdndnaembJbbjFhlJbbjFhvJbbjFhoxekadcd4cdthrcbhwincbhdinaicCfadfgDabadfIdbglaDIdbgvaval9EEUdbaicwfadfgDalaDIdbgvaval9DEUdbadclfgdcx9hmbkabarfhbawcefgwae9hmbkaiIdzaiId3:thoaiIdxaiIdK:thvaiIdwaiIdC:thlkJbbbbalalJbbbb9DEglavaval9DEglaoaoal9DEk9DeeuabcFeaicdtz:ljjjbhlcbhbdnadTmbindnalaeydbcdtfgiydbcu9hmbaiabBdbabcefhbkaeclfheadcufgdmbkkabk9teiucbcbyd;W1jjbgeabcifc98GfgbBd;W1jjbdndnabZbcztgd9nmbcuhiabad9RcFFifcz4nbcuSmekaehikaik;LeeeudndnaeabVciGTmbabhixekdndnadcz9pmbabhixekabhiinaiaeydbBdbaiclfaeclfydbBdbaicwfaecwfydbBdbaicxfaecxfydbBdbaeczfheaiczfhiadc9Wfgdcs0mbkkadcl6mbinaiaeydbBdbaeclfheaiclfhiadc98fgdci0mbkkdnadTmbinaiaeRbb86bbaicefhiaecefheadcufgdmbkkabk;aeedudndnabciGTmbabhixekaecFeGc:b:c:ew2hldndnadcz9pmbabhixekabhiinaialBdbaicxfalBdbaicwfalBdbaiclfalBdbaiczfhiadc9Wfgdcs0mbkkadcl6mbinaialBdbaiclfhiadc98fgdci0mbkkdnadTmbinaiae86bbaicefhiadcufgdmbkkabk9teiucbcbyd;W1jjbgeabcrfc94GfgbBd;W1jjbdndnabZbcztgd9nmbcuhiabad9RcFFifcz4nbcuSmekaehikaik9:eiuZbhedndncbyd;W1jjbgdaecztgi9nmbcuheadai9RcFFifcz4nbcuSmekadhekcbabae9Rcifc98Gcbyd;W1jjbfgdBd;W1jjbdnadZbcztge9nmbadae9RcFFifcz4nb8Akk6eiucbhidnadTmbdninabRbbglaeRbbgv9hmeaecefheabcefhbadcufgdmbxdkkalav9Rhikaikk:bedbcjwk9Oeeebeebebbeeebebbbbbebebbbbbbbbbebbbdbbbbbbbebbbebbbdbbbbbbbbbbbeeeeebebbebbebebbbeebbbbbbbbbbbbbbbbbbbbbc;OwkxebbbdbbbjNbb",t=new Uint8Array([32,0,65,2,1,106,34,33,3,128,11,4,13,64,6,253,10,7,15,116,127,5,8,12,40,16,19,54,20,9,27,255,113,17,42,67,24,23,146,148,18,14,22,45,70,69,56,114,101,21,25,63,75,136,108,28,118,29,73,115]);if(typeof WebAssembly!="object")return{supported:!1};var n,i=WebAssembly.instantiate(o(e),{}).then(function(f){n=f.instance,n.exports.__wasm_call_ctors()});function o(f){for(var x=new Uint8Array(f.length),_=0;_96?C-97:C>64?C-39:C+4}for(var V=0,_=0;_=3),r(C>=0&&C<=f.length),r(C%3==0),r(V>=0);for(var R=0,G=0;G<(L?L.length:0);++G)r(L[G]in g),r(this.useExperimentalFeatures||L[G]!="Prune"),R|=g[L[G]];var I=f.BYTES_PER_ELEMENT==4?f:new Uint32Array(f),v=d(n.exports.meshopt_simplify,I,f.length,x,x.length/_,_*4,C,V,R);return v[0]=f instanceof Uint32Array?v[0]:new f.constructor(v[0]),v},simplifyWithAttributes:function(f,x,_,C,V,L,R,G,I,v){r(this.useExperimentalFeatures),r(f instanceof Uint32Array||f instanceof Int32Array||f instanceof Uint16Array||f instanceof Int16Array),r(f.length%3==0),r(x instanceof Float32Array),r(x.length%_==0),r(_>=3),r(C instanceof Float32Array),r(C.length%V==0),r(V>=0),r(R==null||R instanceof Uint8Array),r(R==null||R.length==x.length/_),r(G>=0&&G<=f.length),r(G%3==0),r(I>=0),r(Array.isArray(L)),r(V>=L.length),r(L.length<=32);for(var P=0;P=0);for(var w=0,P=0;P<(v?v.length:0);++P)r(v[P]in g),w|=g[v[P]];var A=f.BYTES_PER_ELEMENT==4?f:new Uint32Array(f),b=u(n.exports.meshopt_simplifyWithAttributes,A,f.length,x,x.length/_,_*4,C,V*4,new Float32Array(L),R?new Uint8Array(R):null,G,I,w);return b[0]=f instanceof Uint32Array?b[0]:new f.constructor(b[0]),b},getScale:function(f,x){return r(f instanceof Float32Array),r(f.length%x==0),r(x>=3),h(n.exports.meshopt_simplifyScale,f,f.length/x,x*4)},simplifyPoints:function(f,x,_,C,V,L){return r(this.useExperimentalFeatures),r(f instanceof Float32Array),r(f.length%x==0),r(x>=3),r(_>=0&&_<=f.length/x),C?(r(C instanceof Float32Array),r(C.length%V==0),r(V>=3),r(f.length/x==C.length/V),p(n.exports.meshopt_simplifyPoints,f,f.length/x,x*4,C,V*4,L,_)):p(n.exports.meshopt_simplifyPoints,f,f.length/x,x*4,void 0,0,0,_)}}}();var isn=T(S()),tsn=function(){var e="b9H79Tebbbefx9Geueu9Geub9Gbb9Giuuueu9Gkuuuuuuuuuu99eu9Gvuuuuueu9Gkuuuuuuuuu9999eu9Gruuuuuuub9Gkuuuuuuuuuuueu9Gouuuuuub9Giuuub9GluuuubiOHdilvorwDqrkbiibeilve9Weiiviebeoweuec:q:Odkr:Yewo9TW9T9VV95dbH9F9F939H79T9F9J9H229F9Jt9VV7bb8A9TW79O9V9Wt9F9I919P29K9nW79O2Wt79c9V919U9KbeX9TW79O9V9Wt9F9I919P29K9nW79O2Wt7bd39TW79O9V9Wt9F9J9V9T9W91tWJ2917tWV9c9V919U9K7br39TW79O9V9Wt9F9J9V9T9W91tW9nW79O2Wt9c9V919U9K7bDL9TW79O9V9Wt9F9V9Wt9P9T9P96W9nW79O2Wtbql79IV9RbkDwebcekdsPq;L9kHdbkIbabaec9:fgefcufae9Ugeabci9Uadfcufad9Ugbaeab0Ek:oAlPue99eux998Jjjjjbc:We9Rgk8Kjjjjbakc;mbfcbc;Kbz:njjjb8AakcuaocdtgxaocFFFFi0Egmcbyd:e1jjbHjjjjbbgPBd9makceBd:SeakaPBdnakamcbyd:e1jjbHjjjjbbgsBd9qakcdBd:SeakasBd9eakcualcdtalcFFFFi0Ecbyd:e1jjbHjjjjbbgzBd9uakazBd9iakciBd:SeaPcbaxz:njjjbhHalci9UhOdnalTmbaihPalhAinaHaPydbcdtfgCaCydbcefBdbaPclfhPaAcufgAmbkkdnaoTmbcbhPashAaHhCaohXinaAaPBdbaAclfhAaCydbaPfhPaCclfhCaXcufgXmbkkdnalci6mbcbhPaihAinaAcwfydbhCaAclfydbhXasaAydbcdtfgQaQydbgQcefBdbazaQcdtfaPBdbasaXcdtfgXaXydbgXcefBdbazaXcdtfaPBdbasaCcdtfgCaCydbgCcefBdbazaCcdtfaPBdbaAcxfhAaOaPcefgP9hmbkkdnaoTmbaHhAashPaohCinaPaPydbaAydb9RBdbaAclfhAaPclfhPaCcufgCmbkkakamcbyd:e1jjbHjjjjbbgPBd9yakclBd:SeaPaHaxz:mjjjbhmakaOcbyd:e1jjbHjjjjbbgPBd9CakcvBd:SeaPcbaOz:njjjbhLakcuaOcK2alcjjjjd0Ecbyd:e1jjbHjjjjbbgKBd9GakcoBd:SeJbbbbhYdnalci6g8Ambarcd4hxaihAaKhPaOhrJbbbbhEinavaAclfydbax2cdtfgCIdlh3avaAydbax2cdtfgXIdlhYavaAcwfydbax2cdtfgQIdlh5aCIdwh8EaXIdwh8FaQIdwhaaPaCIdbghaXIdbggMaQIdbg8JMJbbnn:vUdbaPclfaXIdlaCIdlMaQIdlMJbbnn:vUdbaQIdwh8KaCIdwh8LaXIdwh8MaPcxfa3aY:tg3aaa8F:tgaNa5aY:tg5a8Ea8F:tg8EN:tgYJbbbbJbbjZahag:tgha5Na8Jag:tgga3N:tg8Fa8FNaYaYNa8EagNaaahN:tgYaYNMM:rgg:vagJbbbb9BEg3NUdbaPczfaYa3NUdbaPcCfa8Fa3NUdbaPcwfa8Ka8Ma8LMMJbbnn:vUdbaEagMhEaAcxfhAaPcKfhParcufgrmbkaEaO:Z:vJbbbZNhYkakcuaOcdtalcFFFF970Ecbyd:e1jjbHjjjjbbgCBd9KakcrBd:SeaYaD:ZN:rhYdna8AmbcbhPaChAinaAaPBdbaAclfhAaOaPcefgP9hmbkkaYJbbbZNh8MakcuaOcltalcFFFFd0Ecbyd:e1jjbHjjjjbbg8ABd9OakcwBd:Secba8AaKaCaOz:djjjb8Aakaocbyd:e1jjbHjjjjbbgPBd2aPcFeaoz:njjjbhrakc8Wfcwf9cb83ibak9cb83i8WcbhPJbbbbhEJbbbbh5Jbbbbh8EJbbbbhYJbbbbh8FJbbbbhgcbhlinJbbbbh3dnaPTmbJbbjZaP:Z:vh3kaka8Ea3NgaUdaaka5a3NghUd3akaEa3Ng8JUdKJbbbbh3dnagagNaYaYNa8Fa8FNMMg8KJbbbb9BmbJbbjZa8K:r:vh3kakaga3NUd8Saka8Fa3NUdyakaYa3NUd8Kdndndnakyd8WgQakydUgAakcKfaeaiakc;abfaKamara8Maqz:ejjjbgCcuSmbdnaPaD9pmbaAaraiaCcx2fgXydbfRbbcFeSfaraXclfydbfRbbcFeSfaraXcwfydbfRbbcFeSfaw9nmdkaQaAcbaeaiakc;abfaKamara8MJbbbbz:ejjjbgCcu9hmekakaaUdCakahUdzaka8JUdxakcuBdwakcFFF;7rBdla8AcbaKaLakcxfakcwfakclfz:fjjjbakydwgCcuSmekdnakc8WfaiaCcx2fgOydbgPaOclfydbgAaOcwfydbgXarabaeadalawaDz:gjjjbTmbalcefhlJbbbbhEJbbbbh5Jbbbbh8EJbbbbhYJbbbbh8FJbbbbhgkamaPcdtfgPaPydbcufBdbamaAcdtfgPaPydbcufBdbamaXcdtfgPaPydbcufBdbcbhXinazasaOaXcdtfydbcdtgAfydbcdtfgxhPaHaAfgvydbgQhAdnaQTmbdninaPydbaCSmeaPclfhPaAcufgATmdxbkkaPaxaQcdtfc98fydbBdbavavydbcufBdbkaXcefgXci9hmbkaKaCcK2fgPIdbh3aPIdlhaaPIdwhhaPIdxh8JaPIdzh8KaPIdCh8LaLaCfce86bbaga8LMhga8Fa8KMh8FaYa8JMhYa8EahMh8Ea5aaMh5aEa3MhEakyd88hPxekkdnaPTmbdnakyd80gAaPci2fgCciGTmbadaCfcbaPaAcu7fciGcefz:njjjb8AkabalcltfgPak8Pi8W83dbaPcwfakc8Wfcwf8Pib83dbalcefhlkcahPdninaPc98Smeakc;mbfaPfydbcbydj1jjbH:bjjjbbaPc98fhPxbkkakc:Wef8Kjjjjbalk;3vivuv99lu8Jjjjjbca9Rgv8Kjjjjbdndnalcw0mbaiydbhoaeabcitfgralcdtcufBdlaraoBdbdnalcd6mbaiclfhoalcufhwarcxfhrinaoydbhDarcuBdbarc98faDBdbarcwfhraoclfhoawcufgwmbkkalabfhrxekcbhDavczfcwfcbBdbav9cb83izavcwfcbBdbav9cb83ibJbbjZhqJbbjZhkinadaiaDcdtfydbcK2fhwcbhrinavczfarfgoawarfIdbgxaoIdbgm:tgPakNamMgmUdbavarfgoaPaxam:tNaoIdbMUdbarclfgrcx9hmbkJbbjZaqJbbjZMgq:vhkaDcefgDal9hmbkcbhoadcbcecdavIdlgxavIdwgm9GEgravIdbgPam9GEaraPax9GEgscdtgrfhzavczfarfIdbhxaihralhwinaiaocdtfgDydbhHaDarydbgOBdbaraHBdbarclfhraoazaOcK2fIdbax9Dfhoawcufgwmbkaeabcitfhrdndnaocv6mbaoalc98f6mekaraiydbBdbaralcdtcufBdlaiclfhoalcufhwarcxfhrinaoydbhDarcuBdbarc98faDBdbarcwfhraoclfhoawcufgwmbkalabfhrxekaraxUdbaeabcitfgrarydlc98GasVBdlabcefaeadaiaoz:djjjbhwararydlciGawabcu7fcdtVBdlawaeadaiaocdtfalao9Rz:djjjbhrkavcaf8Kjjjjbark;Bloeue99vue99Due99dndnaembcuhkxekJbbjZaq:thxaiabcdtfhmavydbhPavydlhsavydwhzcbhHJFFuuhOcvhbcuhkindnaPamaHcdtfydbcdtgvfydbgATmbazasavfydbcdtfhiindndnawalaiydbgCcx2fgvclfydbgXfRbbcFeSawavydbgQfRbbcFeSfawavcwfydbgLfRbbcFeSfgKmbcbhvxekcehvaraQcdtfydbgYceSmbcehvaraXcdtfydbg8AceSmbcehvaraLcdtfydbgEceSmbdna8AcdSaYcdSfaEcdSfcd6mbaKcefhvxekaKcdfhvkdnavab9kmbdndnadTmbaoaCcK2fgQIdwadIdw:tg3a3NaQIdbadIdb:tg3a3NaQIdladIdl:tg3a3NMM:raD:vaxNJbbjZMJ9VO:d86JbbjZaQIdCadIdCNaQIdxadIdxNaQIdzadIdzNMMaqN:tg3a3J9VO:d869DENh3xekaraQcdtfydbaraXcdtfydbfaraLcdtfydbfc99f:Zh3kaCakavab6a3aO9DVgQEhkavabaQEhba3aOaQEhOkaiclfhiaAcufgAmbkkaHcefgHae9hmbkkakk;bddlue99dndndnabaecitfgrydlgwciGgDci9hmbarclfhqxekinabcbawcd4gwalaDcdtfIdbabaecitfIdb:tgkJbbbb9FEgDaecefgefadaialavaoz:fjjjbak:laoIdb9FTmdabaDaw7aefgecitfgrydlgwciGgDci9hmbkarclfhqkabaecitfhecuhbindnaiaeydbgDfRbbmbadaDcK2fgrIdwalIdw:tgkakNarIdbalIdb:tgkakNarIdlalIdl:tgkakNMM:rgkaoIdb9DTmbaoakUdbavaDBdbaqydbhwkaecwfheabcefgbawcd46mbkkk;yleoudnaladfgkRbbcFeSalaefgxRbbgmcFeSfabydwgPfalaifgsRbbcFeSfaD0abydxaq9pVgzce9hmbavawcltfgmab8Pdb83dbamcwfabcwfgm8Pdb83dbdndnamydbmbcbhqxekcbhDaohminalamabydbcdtfydbfcFe86bbamclfhmaDcefgDabydwgq6mbkkdnabydxglci2gDabydlgmfgPciGTmbaraPfcbalamcu7fciGcefz:njjjb8Aabydxci2hDabydlhmabydwhqkab9cb83dwababydbaqfBdbabaDcifc98GamfBdlaxRbbhmcbhPkdnamcFeGcFe9hmbaxaP86bbababydwgmcefBdwaoabydbcdtfamcdtfaeBdbkdnakRbbcFe9hmbakabydw86bbababydwgmcefBdwaoabydbcdtfamcdtfadBdbkdnasRbbcFe9hmbasabydw86bbababydwgmcefBdwaoabydbcdtfamcdtfaiBdbkarabydlfabydxci2faxRbb86bbarabydlfabydxci2fcefakRbb86bbarabydlfabydxci2fcdfasRbb86bbababydxcefBdxazk;Ckovud99euv99eul998Jjjjjbc:G;ae9Rgo8KjjjjbdndnadTmbavcd4hrcbhwcbhDindnaiaeclfydbar2cdtfgvIdbaiaeydbar2cdtfgqIdbgk:tgxaiaecwfydbar2cdtfgmIdlaqIdlgP:tgsNamIdbak:tgzavIdlaP:tgPN:tgkakNaPamIdwaqIdwgH:tgONasavIdwaH:tgHN:tgPaPNaHazNaOaxN:tgxaxNMM:rgsJbbbb9Bmbaoc:G:qefawcx2fgAakas:vUdwaAaxas:vUdlaAaPas:vUdbaocafawc8K2fgAaq8Pdb83dbaAav8Pdb83dxaAam8Pdb83dKaAcwfaqcwfydbBdbaAcCfavcwfydbBdbaAcafamcwfydbBdbawcefhwkaecxfheaDcifgDad6mbkab9cb83dbabcyf9cb83dbabcaf9cb83dbabcKf9cb83dbabczf9cb83dbabcwf9cb83dbawTmeao9cb83iKao9cb83izaoczfaocafawci2z1jjjbaoIdKhCaoIdChXaoIdzhQao9cb83iwao9cb83ibaoaoc:G:qefawz1jjjbJbbjZhkaoIdwgPJbbbbJbbjZaPaPNaoIdbgPaPNaoIdlgsasNMM:rgx:vaxJbbbb9BEgzNhxasazNhsaPazNhzaoc:G:qefheawhvinaecwfIdbaxNaeIdbazNasaeclfIdbNMMgPakaPak9DEhkaecxfheavcufgvmbkabaCUdwabaXUdlabaQUdbabaoId3UdxdndnakJ;n;m;m899FmbJbbbbhPaoc:G:qefheaocafhvinaCavcwfIdb:taecwfIdbgHNaQavIdb:taeIdbgONaXavclfIdb:taeclfIdbgLNMMaxaHNazaONasaLNMM:vgHaPaHaP9EEhPavc8KfhvaecxfheawcufgwmbkabazUd3abc8KfaxUdbabcafasUdbabcKfaCaxaPN:tUdbabcCfaXasaPN:tUdbabaQazaPN:tUdzabJbbjZakakN:t:rgkUdydndnaxJbbj:;axJbbj:;9GEgPJbbjZaPJbbjZ9FEJbb;:9cNJbbbZJbbb:;axJbbbb9GEMgP:lJbbb9p9DTmbaP:Ohexekcjjjj94hekabc8Ufae86bbdndnasJbbj:;asJbbj:;9GEgPJbbjZaPJbbjZ9FEJbb;:9cNJbbbZJbbb:;asJbbbb9GEMgP:lJbbb9p9DTmbaP:Ohvxekcjjjj94hvkabcRfav86bbdndnazJbbj:;azJbbj:;9GEgPJbbjZaPJbbjZ9FEJbb;:9cNJbbbZJbbb:;azJbbbb9GEMgP:lJbbb9p9DTmbaP:Ohqxekcjjjj94hqkabaq86b8SdndnaecKtcK91:YJbb;:9c:vax:t:lavcKtcK91:YJbb;:9c:vas:t:laqcKtcK91:YJbb;:9c:vaz:t:lakMMMJbb;:9cNJbbjZMgk:lJbbb9p9DTmbak:Ohexekcjjjj94hekaecFbaecFb9iEhexekabcjjj;8iBdycFbhekabae86b8Vxekab9cb83dbabcyf9cb83dbabcaf9cb83dbabcKf9cb83dbabczf9cb83dbabcwf9cb83dbkaoc:G;aef8Kjjjjbk:mvdouq99cbhi8Jjjjjbca9RglczfcwfcbBdbal9cb83izalcwfcbBdbal9cb83ibdnadTmbcbhvinaeaifhocbhrinalczfarfgwavawydbgwaoarfIdbgDaearawcx2ffIdb9DEBdbalarfgwavawydbgwaDaearawcx2ffIdb9EEBdbarclfgrcx9hmbkaicxfhiavcefgvad9hmbkkJbbbbhDcbhrcbhicbhvinaealarfydbcx2fgwIdwaealczfarfydbcx2fgoIdw:tgqaqNawIdbaoIdb:tgqaqNawIdlaoIdl:tgqaqNMMgqaDaqaD9EgwEhDavaiawEhiarclfhravcefgvci9hmbkaealczfaicdtgvfydbcx2fgrIdwaealavfydbcx2fglIdwMJbbbZNhqarIdlalIdlMJbbbZNhkarIdbalIdbMJbbbZNhxaD:rJbbbZNhDdnadTmbindnaecwfIdbgmaq:tgPaPNaeIdbgsax:tgPaPNaeclfIdbgzak:tgPaPNMMgPaDaDN9ETmbaqaDaP:rgH:vJbbbZNJbbbZMgPNamJbbjZaP:tgONMhqakaPNazaONMhkaxaPNasaONMhxaDaHMJbbbZNhDkaecxfheadcufgdmbkkabaDUdxabaqUdwabakUdlabaxUdbkjeeiu8Jjjjjbcj8W9Rgr8Kjjjjbaici2hwdnaiTmbawceawce0EhDarhiinaiaeadRbbcdtfydbBdbadcefhdaiclfhiaDcufgDmbkkabarawaladaoz:hjjjbarcj8Wf8Kjjjjbk:Ylequ8Jjjjjbcjx9Rgl8Kjjjjbcbhvalcjqfcbaiz:njjjb8AdndnadTmbcjehoaehrincuhwarhDcuhqavhkdninawakaoalcjqfaDcefRbbfRbb9RcFeGci6aoalcjqfaDRbbfRbb9RcFeGci6faoalcjqfaDcdfRbbfRbb9RcFeGci6fgxaq9mgmEhwdnammbaxce0mdkaxaqaxaq9kEhqaDcifhDadakcefgk9hmbkkaeawci2fgDcdfRbbhqaDcefRbbhxaDRbbhkaeavci2fgDcifaDawav9Rci2z:qjjjb8Aakalcjqffaocefgo86bbaxalcjqffao86bbaDcdfaq86bbaDcefax86bbaDak86bbaqalcjqffao86bbarcifhravcefgvad9hmbkalcFeaiz:njjjbhoadci2gDceaDce0EhqcbhxindnaoaeRbbgkfgwRbbgDcFe9hmbawax86bbaocjdfaxcdtfabakcdtfydbBdbaxhDaxcefhxkaeaD86bbaecefheaqcufgqmbkaxcdthDxekcbhDkabalcjdfaDz:mjjjb8Aalcjxf8Kjjjjbk9teiucbcbyd11jjbgeabcifc98GfgbBd11jjbdndnabZbcztgd9nmbcuhiabad9RcFFifcz4nbcuSmekaehikaik;LeeeudndnaeabVciGTmbabhixekdndnadcz9pmbabhixekabhiinaiaeydbBdbaiclfaeclfydbBdbaicwfaecwfydbBdbaicxfaecxfydbBdbaeczfheaiczfhiadc9Wfgdcs0mbkkadcl6mbinaiaeydbBdbaeclfheaiclfhiadc98fgdci0mbkkdnadTmbinaiaeRbb86bbaicefhiaecefheadcufgdmbkkabk;aeedudndnabciGTmbabhixekaecFeGc:b:c:ew2hldndnadcz9pmbabhixekabhiinaialBdbaicxfalBdbaicwfalBdbaiclfalBdbaiczfhiadc9Wfgdcs0mbkkadcl6mbinaialBdbaiclfhiadc98fgdci0mbkkdnadTmbinaiae86bbaicefhiadcufgdmbkkabk9teiucbcbyd11jjbgeabcrfc94GfgbBd11jjbdndnabZbcztgd9nmbcuhiabad9RcFFifcz4nbcuSmekaehikaik9:eiuZbhedndncbyd11jjbgdaecztgi9nmbcuheadai9RcFFifcz4nbcuSmekadhekcbabae9Rcifc98Gcbyd11jjbfgdBd11jjbdnadZbcztge9nmbadae9RcFFifcz4nb8Akk:;Deludndndnadch9pmbabaeSmdaeabadfgi9Rcbadcet9R0mekabaead;8qbbxekaeab7ciGhldndndnabae9pmbdnalTmbadhvabhixikdnabciGmbadhvabhixdkadTmiabaeRbb86bbadcufhvdnabcefgiciGmbaecefhexdkavTmiabaeRbe86beadc9:fhvdnabcdfgiciGmbaecdfhexdkavTmiabaeRbd86bdadc99fhvdnabcifgiciGmbaecifhexdkavTmiabaeRbi86biabclfhiaeclfheadc98fhvxekdnalmbdnaiciGTmbadTmlabadcufgifglaeaifRbb86bbdnalciGmbaihdxekaiTmlabadc9:fgifglaeaifRbb86bbdnalciGmbaihdxekaiTmlabadc99fgifglaeaifRbb86bbdnalciGmbaihdxekaiTmlabadc98fgdfaeadfRbb86bbkadcl6mbdnadc98fgocd4cefciGgiTmbaec98fhlabc98fhvinavadfaladfydbBdbadc98fhdaicufgimbkkaocx6mbaec9Wfhvabc9WfhoinaoadfgicxfavadfglcxfydbBdbaicwfalcwfydbBdbaiclfalclfydbBdbaialydbBdbadc9Wfgdci0mbkkadTmdadhidnadciGglTmbaecufhvabcufhoadhiinaoaifavaifRbb86bbaicufhialcufglmbkkadcl6mdaec98fhlabc98fhvinavaifgecifalaifgdcifRbb86bbaecdfadcdfRbb86bbaecefadcefRbb86bbaeadRbb86bbaic98fgimbxikkavcl6mbdnavc98fglcd4cefcrGgdTmbavadcdt9RhvinaiaeydbBdbaeclfheaiclfhiadcufgdmbkkalc36mbinaiaeydbBdbaiaeydlBdlaiaeydwBdwaiaeydxBdxaiaeydzBdzaiaeydCBdCaiaeydKBdKaiaeyd3Bd3aecafheaicafhiavc9Gfgvci0mbkkavTmbdndnavcrGgdmbavhlxekavc94GhlinaiaeRbb86bbaicefhiaecefheadcufgdmbkkavcw6mbinaiaeRbb86bbaiaeRbe86beaiaeRbd86bdaiaeRbi86biaiaeRbl86blaiaeRbv86bvaiaeRbo86boaiaeRbr86braicwfhiaecwfhealc94fglmbkkabkkAebcjwkxebbbdbbbzNbb",t=new Uint8Array([32,0,65,2,1,106,34,33,3,128,11,4,13,64,6,253,10,7,15,116,127,5,8,12,40,16,19,54,20,9,27,255,113,17,42,67,24,23,146,148,18,14,22,45,70,69,56,114,101,21,25,63,75,136,108,28,118,29,73,115]);if(typeof WebAssembly!="object")return{supported:!1};var n,i=WebAssembly.instantiate(o(e),{}).then(function(f){n=f.instance,n.exports.__wasm_call_ctors()});function o(f){for(var x=new Uint8Array(f.length),_=0;_96?C-97:C>64?C-39:C+4}for(var V=0,_=0;_=3),r(C<=255||C>0),r(V<=512),r(V%4==0),L=L||0;var R=f.BYTES_PER_ELEMENT==4?f:new Uint32Array(f);return u(R,x,x.length/_,_*4,C,V,L)},computeClusterBounds:function(f,x,_){r(f.length%3==0),r(f.length/3<=512),r(x instanceof Float32Array),r(x.length%_==0),r(_>=3);var C=f.BYTES_PER_ELEMENT==4?f:new Uint32Array(f);return g(C,x,x.length/_,_*4)},computeMeshletBounds:function(f,x,_){return r(f.meshletCount!=0),r(x instanceof Float32Array),r(x.length%_==0),r(_>=3),p(f,x,x.length/_,_*4)},extractMeshlet:function(f,x){return r(x>=0&&x{Nr._error=t}),Nr._decoderTaskProcessor=e}return Nr._decoderTaskProcessor};Nr.decodePointCloud=function(e){let t=Nr._getDecoderTaskProcessor();if(l(Nr._error))throw Nr._error;if(Nr._taskProcessorReady)return t.scheduleTask(e,[e.buffer.buffer])};Nr.decodeBufferView=function(e){let t=Nr._getDecoderTaskProcessor();if(l(Nr._error))throw Nr._error;if(Nr._taskProcessorReady)return t.scheduleTask(e,[e.array.buffer])};var ob=Nr;var Rsn=T(S(),1);var li={POSITION:"POSITION",NORMAL:"NORMAL",TANGENT:"TANGENT",TEXCOORD:"TEXCOORD",COLOR:"COLOR",JOINTS:"JOINTS",WEIGHTS:"WEIGHTS",FEATURE_ID:"_FEATURE_ID"};function uFe(e){switch(e){case li.POSITION:return"positionMC";case li.NORMAL:return"normalMC";case li.TANGENT:return"tangentMC";case li.TEXCOORD:return"texCoord";case li.COLOR:return"color";case li.JOINTS:return"joints";case li.WEIGHTS:return"weights";case li.FEATURE_ID:return"featureId"}}li.hasSetIndex=function(e){switch(e){case li.POSITION:case li.NORMAL:case li.TANGENT:return!1;case li.TEXCOORD:case li.COLOR:case li.JOINTS:case li.WEIGHTS:case li.FEATURE_ID:return!0}};li.fromGltfSemantic=function(e){let t=e,i=/^(\w+)_\d+$/.exec(e);switch(i!==null&&(t=i[1]),t){case"POSITION":return li.POSITION;case"NORMAL":return li.NORMAL;case"TANGENT":return li.TANGENT;case"TEXCOORD":return li.TEXCOORD;case"COLOR":return li.COLOR;case"JOINTS":return li.JOINTS;case"WEIGHTS":return li.WEIGHTS;case"_FEATURE_ID":return li.FEATURE_ID}};li.fromPntsSemantic=function(e){switch(e){case"POSITION":case"POSITION_QUANTIZED":return li.POSITION;case"RGBA":case"RGB":case"RGB565":return li.COLOR;case"NORMAL":case"NORMAL_OCT16P":return li.NORMAL;case"BATCH_ID":return li.FEATURE_ID}};li.getGlslType=function(e){switch(e){case li.POSITION:case li.NORMAL:case li.TANGENT:return"vec3";case li.TEXCOORD:return"vec2";case li.COLOR:return"vec4";case li.JOINTS:return"ivec4";case li.WEIGHTS:return"vec4";case li.FEATURE_ID:return"int"}};li.getVariableName=function(e,t){let n=uFe(e);return l(t)&&(n+=`_${t}`),n};var gt=Object.freeze(li);function pg(e){e=y(e,y.EMPTY_OBJECT);let t=e.resourceCache,n=e.gltf,i=e.primitive,o=e.draco,r=e.gltfResource,s=e.baseResource,a=e.cacheKey;this._resourceCache=t,this._gltfResource=r,this._baseResource=s,this._gltf=n,this._primitive=i,this._draco=o,this._cacheKey=a,this._bufferViewLoader=void 0,this._bufferViewTypedArray=void 0,this._decodePromise=void 0,this._decodedData=void 0,this._state=xt.UNLOADED,this._promise=void 0,this._dracoError=void 0}l(Object.create)&&(pg.prototype=Object.create(ji.prototype),pg.prototype.constructor=pg);Object.defineProperties(pg.prototype,{cacheKey:{get:function(){return this._cacheKey}},decodedData:{get:function(){return this._decodedData}}});async function mFe(e){let t=e._resourceCache;try{let n=t.getBufferViewLoader({gltf:e._gltf,bufferViewId:e._draco.bufferView,gltfResource:e._gltfResource,baseResource:e._baseResource});return e._bufferViewLoader=n,await n.load(),e.isDestroyed()?void 0:(e._bufferViewTypedArray=n.typedArray,e._state=xt.PROCESSING,e)}catch(n){if(e.isDestroyed())return;Ioe(e,n)}}pg.prototype.load=async function(){return l(this._promise)?this._promise:(this._state=xt.LOADING,this._promise=mFe(this),this._promise)};function Ioe(e,t){throw e.unload(),e._state=xt.FAILED,e.getError("Failed to load Draco",t)}async function hFe(e,t){try{let n=await t;return e.isDestroyed()?void 0:(e.unload(),e._decodedData={indices:n.indexArray,vertexAttributes:n.attributeData},e._state=xt.READY,e._baseResource)}catch(n){if(e.isDestroyed())return;e._dracoError=n}}var u_={};u_[gt.POSITION]="POSITION";u_[gt.NORMAL]="NORMAL";u_[gt.COLOR]="COLOR";u_[gt.TEXCOORD]="TEX_COORD";function fFe(e){for(let t in u_)if(u_.hasOwnProperty(t)&&e.startsWith(t))return u_[t]}pg.prototype.process=function(e){if(this._state===xt.READY)return!0;if(this._state!==xt.PROCESSING||(l(this._dracoError)&&Ioe(this,this._dracoError),!l(this._bufferViewTypedArray))||l(this._decodePromise))return!1;let t=this._draco,n=this._primitive,i=this._gltf,o=i.bufferViews,r=t.bufferView,s=o[r],a=t.attributes,c=[];for(let h in n.attributes)if(n.attributes.hasOwnProperty(h)){let p=fFe(h);l(p)&&i.accessors[n.attributes[h]].componentType===Q.FLOAT&&(c.includes(p)||c.push(p))}let d={array:new Uint8Array(this._bufferViewTypedArray),bufferView:s,compressedAttributes:a,dequantizeInShader:!0,attributesToSkipTransform:c},u=ob.decodeBufferView(d);if(!l(u))return!1;this._decodePromise=hFe(this,u)};pg.prototype.unload=function(){l(this._bufferViewLoader)&&this._resourceCache.unload(this._bufferViewLoader),this._bufferViewLoader=void 0,this._bufferViewTypedArray=void 0,this._decodedData=void 0,this._gltf=void 0,this._primitive=void 0};var wC=pg;var Jsn=T(S(),1);var ksn=T(S(),1);function pFe(e){let t=e.uint8Array,n=e.format,i=e.request,o=y(e.flipY,!1),r=y(e.skipColorSpaceConversion,!1),s=new Blob([t],{type:n}),a;return Re.supportsImageBitmapOptions().then(function(c){return c?Promise.resolve(Re.createImageBitmapFromBlob(s,{flipY:o,premultiplyAlpha:!1,skipColorSpaceConversion:r})):(a=window.URL.createObjectURL(s),new Re({url:a,request:i}).fetchImage({flipY:o,skipColorSpaceConversion:r}))}).then(function(c){return l(a)&&window.URL.revokeObjectURL(a),c}).catch(function(c){return l(a)&&window.URL.revokeObjectURL(a),Promise.reject(c)})}var m_=pFe;function rb(e){e=y(e,y.EMPTY_OBJECT);let t=e.resourceCache,n=e.gltf,i=e.imageId,o=e.gltfResource,r=e.baseResource,s=e.cacheKey,a=n.images[i],c=a.bufferView,d=a.uri;this._resourceCache=t,this._gltfResource=o,this._baseResource=r,this._gltf=n,this._bufferViewId=c,this._uri=d,this._cacheKey=s,this._bufferViewLoader=void 0,this._image=void 0,this._mipLevels=void 0,this._state=xt.UNLOADED,this._promise=void 0}l(Object.create)&&(rb.prototype=Object.create(ji.prototype),rb.prototype.constructor=rb);Object.defineProperties(rb.prototype,{cacheKey:{get:function(){return this._cacheKey}},image:{get:function(){return this._image}},mipLevels:{get:function(){return this._mipLevels}}});rb.prototype.load=function(){return l(this._promise)?this._promise:l(this._bufferViewId)?(this._promise=bFe(this),this._promise):(this._promise=gFe(this),this._promise)};function Xoe(e){let t;return Array.isArray(e)&&(t=e.slice(1,e.length).map(function(n){return n.bufferView}),e=e[0]),{image:e,mipLevels:t}}async function bFe(e){e._state=xt.LOADING;let t=e._resourceCache;try{let n=t.getBufferViewLoader({gltf:e._gltf,bufferViewId:e._bufferViewId,gltfResource:e._gltfResource,baseResource:e._baseResource});if(e._bufferViewLoader=n,await n.load(),e.isDestroyed())return;let i=n.typedArray,o=await xFe(i);if(e.isDestroyed())return;let r=Xoe(o);return e.unload(),e._image=r.image,e._mipLevels=r.mipLevels,e._state=xt.READY,e}catch(n){return e.isDestroyed()?void 0:Woe(e,n,"Failed to load embedded image")}}async function gFe(e){e._state=xt.LOADING;let t=e._baseResource,n=e._uri,i=t.getDerivedResource({url:n});try{let o=await TFe(i);if(e.isDestroyed())return;let r=Xoe(o);return e.unload(),e._image=r.image,e._mipLevels=r.mipLevels,e._state=xt.READY,e}catch(o){return e.isDestroyed()?void 0:Woe(e,o,`Failed to load image: ${n}`)}}function Woe(e,t,n){return e.unload(),e._state=xt.FAILED,Promise.reject(e.getError(n,t))}function yFe(e){let t=e.subarray(0,2),n=e.subarray(0,4),i=e.subarray(8,12);if(t[0]===255&&t[1]===216)return"image/jpeg";if(t[0]===137&&t[1]===80)return"image/png";if(t[0]===171&&t[1]===75)return"image/ktx2";if(n[0]===82&&n[1]===73&&n[2]===70&&n[3]===70&&i[0]===87&&i[1]===69&&i[2]===66&&i[3]===80)return"image/webp";throw new ce("Image format is not recognized")}async function xFe(e){let t=yFe(e);if(t==="image/ktx2"){let n=new Uint8Array(e);return Gl(n)}return rb._loadImageFromTypedArray({uint8Array:e,format:t,flipY:!1,skipColorSpaceConversion:!0})}var _Fe=/(^data:image\/ktx2)|(\.ktx2$)/i;function TFe(e){let t=e.getUrlComponent(!1,!0);return _Fe.test(t)?Gl(e):e.fetchImage({skipColorSpaceConversion:!0,preferImageBitmap:!0})}rb.prototype.unload=function(){l(this._bufferViewLoader)&&!this._bufferViewLoader.isDestroyed()&&this._resourceCache.unload(this._bufferViewLoader),this._bufferViewLoader=void 0,this._uri=void 0,this._image=void 0,this._mipLevels=void 0,this._gltf=void 0};rb._loadImageFromTypedArray=m_;var FC=rb;var lan=T(S(),1);var jsn=T(S(),1),SFe={TEXTURE:0,PROGRAM:1,BUFFER:2,NUMBER_OF_JOB_TYPES:3},ka=Object.freeze(SFe);function bg(e){e=y(e,y.EMPTY_OBJECT);let t=e.resourceCache,n=e.gltf,i=e.accessorId,o=e.gltfResource,r=e.baseResource,s=e.primitive,a=e.draco,c=e.cacheKey,d=y(e.asynchronous,!0),u=y(e.loadBuffer,!1),h=y(e.loadTypedArray,!1),p=n.accessors[i].componentType;this._resourceCache=t,this._gltfResource=o,this._baseResource=r,this._gltf=n,this._accessorId=i,this._indexDatatype=p,this._primitive=s,this._draco=a,this._cacheKey=c,this._asynchronous=d,this._loadBuffer=u,this._loadTypedArray=h,this._bufferViewLoader=void 0,this._dracoLoader=void 0,this._typedArray=void 0,this._buffer=void 0,this._state=xt.UNLOADED,this._promise=void 0}l(Object.create)&&(bg.prototype=Object.create(ji.prototype),bg.prototype.constructor=bg);Object.defineProperties(bg.prototype,{cacheKey:{get:function(){return this._cacheKey}},buffer:{get:function(){return this._buffer}},typedArray:{get:function(){return this._typedArray}},indexDatatype:{get:function(){return this._indexDatatype}}});var CFe=new wH;bg.prototype.load=async function(){return l(this._promise)?this._promise:l(this._draco)?(this._promise=VFe(this),this._promise):(this._promise=LFe(this),this._promise)};async function VFe(e){e._state=xt.LOADING;let t=e._resourceCache;try{let n=t.getDracoLoader({gltf:e._gltf,primitive:e._primitive,draco:e._draco,gltfResource:e._gltfResource,baseResource:e._baseResource});return e._dracoLoader=n,await n.load(),e.isDestroyed()?void 0:(e._state=xt.LOADED,e)}catch(n){if(e.isDestroyed())return;vH(e,n)}}async function LFe(e){let t=e._gltf,n=e._accessorId,o=t.accessors[n].bufferView;e._state=xt.LOADING;let r=e._resourceCache;try{let s=r.getBufferViewLoader({gltf:t,bufferViewId:o,gltfResource:e._gltfResource,baseResource:e._baseResource});if(e._bufferViewLoader=s,await s.load(),e.isDestroyed())return;let a=s.typedArray;return e._typedArray=RFe(e,a),e._state=xt.PROCESSING,e}catch(s){if(e.isDestroyed())return;vH(e,s)}}function RFe(e,t){let n=e._gltf,i=e._accessorId,o=n.accessors[i],r=o.count,s=o.componentType,a=Me.getSizeInBytes(s),c=t.buffer,d=t.byteOffset+o.byteOffset;if(d%a!==0){let h=r*a,p=new Uint8Array(c,d,h);c=new Uint8Array(p).buffer,d=0,Ma("index-buffer-unaligned",`The index array is not aligned to a ${a}-byte boundary.`)}let u;return s===Me.UNSIGNED_BYTE?u=new Uint8Array(c,d,r):s===Me.UNSIGNED_SHORT?u=new Uint16Array(c,d,r):s===Me.UNSIGNED_INT&&(u=new Uint32Array(c,d,r)),u}function vH(e,t){throw e.unload(),e._state=xt.FAILED,e.getError("Failed to load index buffer",t)}function wH(){this.typedArray=void 0,this.indexDatatype=void 0,this.context=void 0,this.buffer=void 0}wH.prototype.set=function(e,t,n){this.typedArray=e,this.indexDatatype=t,this.context=n};wH.prototype.execute=function(){this.buffer=Poe(this.typedArray,this.indexDatatype,this.context)};function Poe(e,t,n){let i=St.createIndexBuffer({typedArray:e,context:n,usage:ke.STATIC_DRAW,indexDatatype:t});return i.vertexArrayDestroyable=!1,i}bg.prototype.process=function(e){if(this._state===xt.READY)return!0;if(this._state!==xt.LOADED&&this._state!==xt.PROCESSING)return!1;let t=this._typedArray,n=this._indexDatatype;if(l(this._dracoLoader))try{this._dracoLoader.process(e)&&(t=this._dracoLoader.decodedData.indices.typedArray,this._typedArray=t,n=Q.fromTypedArray(t),this._indexDatatype=n)}catch(o){vH(this,o)}if(!l(t))return!1;let i;if(this._loadBuffer&&this._asynchronous){let o=CFe;if(o.set(t,n,e.context),!e.jobScheduler.execute(o,ka.BUFFER))return!1;i=o.buffer}else this._loadBuffer&&(i=Poe(t,n,e.context));return this.unload(),this._buffer=i,this._typedArray=this._loadTypedArray?t:void 0,this._state=xt.READY,this._resourceCache.statistics.addGeometryLoader(this),!0};bg.prototype.unload=function(){l(this._buffer)&&this._buffer.destroy();let e=this._resourceCache;l(this._bufferViewLoader)&&!this._bufferViewLoader.isDestroyed()&&e.unload(this._bufferViewLoader),l(this._dracoLoader)&&e.unload(this._dracoLoader),this._bufferViewLoader=void 0,this._dracoLoader=void 0,this._typedArray=void 0,this._buffer=void 0,this._gltf=void 0,this._primitive=void 0};var AC=bg;var gdn=T(S(),1);var van=T(S(),1);var man=T(S(),1);function ZFe(e,t,n){if(n=y(n,!1),n){let i=e.indexOf(t);if(i>-1)return i}return e.push(t),e.length-1}var Zs=ZFe;var xan=T(S(),1);var pan=T(S(),1);function GFe(e,t){return l(e.extensionsUsed)&&e.extensionsUsed.indexOf(t)>=0}var ur=GFe;function Kt(){}Kt.objectLegacy=function(e,t){if(l(e)){for(let n in e)if(Object.prototype.hasOwnProperty.call(e,n)){let i=e[n],o=t(i,n);if(l(o))return o}}};Kt.object=function(e,t){if(l(e)){let n=e.length;for(let i=0;i0)return i.byteStride}return Q.getSizeInBytes(t.componentType)*Sd(t.type)}var wl=IFe;function XFe(e){We.accessor(e,function(n){l(n.bufferView)&&(n.byteOffset=y(n.byteOffset,0))}),We.bufferView(e,function(n){l(n.buffer)&&(n.byteOffset=y(n.byteOffset,0))}),We.mesh(e,function(n){We.meshPrimitive(n,function(i){if(i.mode=y(i.mode,ie.TRIANGLES),!l(i.material)){l(e.materials)||(e.materials=[]);let o={name:"default"};i.material=Zs(e.materials,o)}})}),We.accessorContainingVertexAttributeData(e,function(n){let i=e.accessors[n],o=i.bufferView;if(i.normalized=y(i.normalized,!1),l(o)){let r=e.bufferViews[o];r.byteStride=wl(e,i),r.target=ie.ARRAY_BUFFER}}),We.accessorContainingIndexData(e,function(n){let o=e.accessors[n].bufferView;if(l(o)){let r=e.bufferViews[o];r.target=ie.ELEMENT_ARRAY_BUFFER}}),We.material(e,function(n){let i=y(n.extensions,y.EMPTY_OBJECT),o=i.KHR_materials_common;if(l(o)){let c=o.technique,d=l(o.values)?o.values:{};o.values=d,d.ambient=l(d.ambient)?d.ambient:[0,0,0,1],d.emission=l(d.emission)?d.emission:[0,0,0,1],d.transparency=y(d.transparency,1),c!=="CONSTANT"&&(d.diffuse=l(d.diffuse)?d.diffuse:[0,0,0,1],c!=="LAMBERT"&&(d.specular=l(d.specular)?d.specular:[0,0,0,1],d.shininess=y(d.shininess,0))),o.transparent=y(o.transparent,!1),o.doubleSided=y(o.doubleSided,!1);return}n.emissiveFactor=y(n.emissiveFactor,[0,0,0]),n.alphaMode=y(n.alphaMode,"OPAQUE"),n.doubleSided=y(n.doubleSided,!1),n.alphaMode==="MASK"&&(n.alphaCutoff=y(n.alphaCutoff,.5));let r=i.KHR_techniques_webgl;l(r)&&We.materialValue(n,function(c){l(c.index)&&h_(c)}),h_(n.emissiveTexture),h_(n.normalTexture),h_(n.occlusionTexture);let s=n.pbrMetallicRoughness;l(s)&&(s.baseColorFactor=y(s.baseColorFactor,[1,1,1,1]),s.metallicFactor=y(s.metallicFactor,1),s.roughnessFactor=y(s.roughnessFactor,1),h_(s.baseColorTexture),h_(s.metallicRoughnessTexture));let a=i.KHR_materials_pbrSpecularGlossiness;l(a)&&(a.diffuseFactor=y(a.diffuseFactor,[1,1,1,1]),a.specularFactor=y(a.specularFactor,[1,1,1]),a.glossinessFactor=y(a.glossinessFactor,1),h_(a.specularGlossinessTexture))}),We.animation(e,function(n){We.animationSampler(n,function(i){i.interpolation=y(i.interpolation,"LINEAR")})});let t=WFe(e);return We.node(e,function(n,i){l(t[i])||l(n.translation)||l(n.rotation)||l(n.scale)?(n.translation=y(n.translation,[0,0,0]),n.rotation=y(n.rotation,[0,0,0,1]),n.scale=y(n.scale,[1,1,1])):n.matrix=y(n.matrix,[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1])}),We.sampler(e,function(n){n.wrapS=y(n.wrapS,ie.REPEAT),n.wrapT=y(n.wrapT,ie.REPEAT)}),l(e.scenes)&&!l(e.scene)&&(e.scene=0),e}function WFe(e){let t={};return We.animation(e,function(n){We.animationChannel(n,function(i){let o=i.target,r=o.node,s=o.path;(s==="translation"||s==="rotation"||s==="scale")&&(t[r]=!0)})}),t}function h_(e){l(e)&&(e.texCoord=y(e.texCoord,0))}var DI=XFe;var Man=T(S(),1);function PFe(e){return We.shader(e,function(t){M5(t)}),We.buffer(e,function(t){M5(t)}),We.image(e,function(t){M5(t)}),M5(e),e}function M5(e){e.extras=l(e.extras)?e.extras:{},e.extras._pipeline=l(e.extras._pipeline)?e.extras._pipeline:{}}var gg=PFe;var ecn=T(S(),1);var Yan=T(S(),1);var Uan=T(S(),1);function vFe(e,t){let n=e.extensionsRequired;if(l(n)){let i=n.indexOf(t);i>=0&&n.splice(i,1),n.length===0&&delete e.extensionsRequired}}var BI=vFe;function wFe(e,t){let n=e.extensionsUsed;if(l(n)){let i=n.indexOf(t);i>=0&&n.splice(i,1),BI(e,t),n.length===0&&delete e.extensionsUsed}}var f_=wFe;var FFe=4;function AFe(e){if(Km(e)!=="glTF")throw new ce("File is not valid binary glTF");let n=voe(e,0,5),i=n[1];if(i!==1&&i!==2)throw new ce("Binary glTF version is not 1 or 2");return i===1?MFe(e,n):NFe(e,n)}function voe(e,t,n){let i=new DataView(e.buffer),o=new Array(n);for(let r=0;r0){let h=y(u.binary_glTF,u.KHR_binary_glTF);l(h)&&(h.extras._pipeline.source=d,delete h.uri)}return f_(c,"KHR_binary_glTF"),c}function NFe(e,t){let n=t[2],i=12,o,r;for(;i0){let a=s[0];a.extras._pipeline.source=r}}return o}var OI=AFe;var ocn=T(S(),1);function kFe(e){return We.shader(e,function(t){N5(t)}),We.buffer(e,function(t){N5(t)}),We.image(e,function(t){N5(t)}),N5(e),e}function N5(e){l(e.extras)&&(l(e.extras._pipeline)&&delete e.extras._pipeline,Object.keys(e.extras).length===0&&delete e.extras)}var YI=kFe;var Nln=T(S(),1);var ccn=T(S(),1);function UFe(e,t){let n=e.extensionsUsed;l(n)||(n=[],e.extensionsUsed=n),Zs(n,t,!0)}var Pu=UFe;var ycn=T(S(),1);var ucn=T(S(),1);function DFe(e){switch(e){case Q.BYTE:return function(t,n,i,o,r){for(let s=0;s-1:!1}var HFe=[ie.ZERO,ie.ONE,ie.SRC_COLOR,ie.ONE_MINUS_SRC_COLOR,ie.SRC_ALPHA,ie.ONE_MINUS_SRC_ALPHA,ie.DST_ALPHA,ie.ONE_MINUS_DST_ALPHA,ie.DST_COLOR,ie.ONE_MINUS_DST_COLOR];function zFe(e,t){if(!l(e))return t;for(let n=0;n<4;n++)if(HFe.indexOf(e[n])===-1)return t;return e}function KFe(e){let t={},n={},i=e.techniques;return l(i)&&(We.technique(e,function(o,r){let s=o.states;if(l(s)){let a=n[r]={};if(woe(s,ie.BLEND)){a.alphaMode="BLEND";let c=s.functions;l(c)&&(l(c.blendEquationSeparate)||l(c.blendFuncSeparate))&&(t[r]={blendEquation:y(c.blendEquationSeparate,OFe),blendFactors:zFe(c.blendFuncSeparate,YFe)})}woe(s,ie.CULL_FACE)||(a.doubleSided=!0),delete o.states}}),Object.keys(t).length>0&&(l(e.extensions)||(e.extensions={}),Pu(e,"KHR_blend")),We.material(e,function(o){if(l(o.technique)){let r=n[o.technique];We.objectLegacy(r,function(a,c){o[c]=a});let s=t[o.technique];l(s)&&(l(o.extensions)||(o.extensions={}),o.extensions.KHR_blend=s)}})),e}var HI=KFe;var Acn=T(S(),1);var Icn=T(S(),1);function JFe(e,t){let n=e.extensionsRequired;l(n)||(n=[],e.extensionsRequired=n),Zs(n,t,!0),Pu(e,t)}var zI=JFe;function QFe(e){let t=e.techniques,n={},i={},o={};if(l(t)){let r={programs:[],shaders:[],techniques:[]},s=e.glExtensionsUsed;delete e.glExtensionsUsed,We.technique(e,function(a,c){let d={name:a.name,program:void 0,attributes:{},uniforms:{}},u;if(We.techniqueAttribute(a,function(h,p){u=a.parameters[h],d.attributes[p]={semantic:u.semantic}}),We.techniqueUniform(a,function(h,p){u=a.parameters[h],d.uniforms[p]={count:u.count,node:u.node,type:u.type,semantic:u.semantic,value:u.value},l(n[c])||(n[c]={}),n[c][h]=p}),l(o[a.program]))d.program=o[a.program];else{let h=e.programs[a.program],p={name:h.name,fragmentShader:void 0,vertexShader:void 0,glExtensions:s},g=e.shaders[h.fragmentShader];p.fragmentShader=Zs(r.shaders,g,!0);let f=e.shaders[h.vertexShader];p.vertexShader=Zs(r.shaders,f,!0),d.program=Zs(r.programs,p),o[a.program]=d.program}i[c]=Zs(r.techniques,d)}),r.techniques.length>0&&(l(e.extensions)||(e.extensions={}),e.extensions.KHR_techniques_webgl=r,Pu(e,"KHR_techniques_webgl"),zI(e,"KHR_techniques_webgl"))}return We.material(e,function(r){if(l(r.technique)){let s={technique:i[r.technique]};We.objectLegacy(r.values,function(a,c){l(s.values)||(s.values={});let d=n[r.technique][c];l(d)&&(s.values[d]=a)}),l(r.extensions)||(r.extensions={}),r.extensions.KHR_techniques_webgl=s}delete r.technique,delete r.values}),delete e.techniques,delete e.programs,delete e.shaders,e}var KI=QFe;var Jcn=T(S(),1);var Dcn=T(S(),1);function jFe(e,t){To.typeOf.object("material",e),To.defined("handler",t);let n=e.pbrMetallicRoughness;if(l(n)){if(l(n.baseColorTexture)){let r=n.baseColorTexture,s=t(r.index,r);if(l(s))return s}if(l(n.metallicRoughnessTexture)){let r=n.metallicRoughnessTexture,s=t(r.index,r);if(l(s))return s}}let{extensions:i}=e;if(l(i)){let r=i.KHR_materials_pbrSpecularGlossiness;if(l(r)){if(l(r.diffuseTexture)){let c=r.diffuseTexture,d=t(c.index,c);if(l(d))return d}if(l(r.specularGlossinessTexture)){let c=r.specularGlossinessTexture,d=t(c.index,c);if(l(d))return d}}let s=i.KHR_materials_specular;if(l(s)){let{specularTexture:c,specularColorTexture:d}=s;if(l(c)){let u=t(c.index,c);if(l(u))return u}if(l(d)){let u=t(d.index,d);if(l(u))return u}}let a=i.KHR_materials_common;if(l(a)&&l(a.values)){let{diffuse:c,ambient:d,emission:u,specular:h}=a.values;if(l(c)&&l(c.index)){let p=t(c.index,c);if(l(p))return p}if(l(d)&&l(d.index)){let p=t(d.index,d);if(l(p))return p}if(l(u)&&l(u.index)){let p=t(u.index,u);if(l(p))return p}if(l(h)&&l(h.index)){let p=t(h.index,h);if(l(p))return p}}}let o=We.materialValue(e,function(r){if(l(r.index)){let s=t(r.index,r);if(l(s))return s}});if(l(o))return o;if(l(e.emissiveTexture)){let r=e.emissiveTexture,s=t(r.index,r);if(l(s))return s}if(l(e.normalTexture)){let r=e.normalTexture,s=t(r.index,r);if(l(s))return s}if(l(e.occlusionTexture)){let r=e.occlusionTexture,s=t(r.index,r);if(l(s))return s}}var MC=jFe;var Foe=["mesh","node","material","accessor","bufferView","buffer","texture","sampler","image"];function qFe(e,t){return t=y(t,Foe),Foe.forEach(function(n){t.indexOf(n)>-1&&eAe(e,n)}),e}var $Fe={accessor:"accessors",buffer:"buffers",bufferView:"bufferViews",image:"images",node:"nodes",material:"materials",mesh:"meshes",sampler:"samplers",texture:"textures"};function eAe(e,t){let n=$Fe[t],i=e[n];if(l(i)){let o=0,r=Lf[t](e),s=i.length;for(let a=0;at&&o.attributes[c]--}),We.meshPrimitiveTarget(o,function(a){We.meshPrimitiveTargetAttribute(a,function(c,d){c>t&&a[d]--})});let r=o.indices;l(r)&&r>t&&o.indices--;let s=o.extensions;l(s)&&l(s.CESIUM_primitive_outline)&&s.CESIUM_primitive_outline.indices>t&&--s.CESIUM_primitive_outline.indices})}),We.skin(e,function(i){l(i.inverseBindMatrices)&&i.inverseBindMatrices>t&&i.inverseBindMatrices--}),We.animation(e,function(i){We.animationSampler(i,function(o){l(o.input)&&o.input>t&&o.input--,l(o.output)&&o.output>t&&o.output--})})};Vf.buffer=function(e,t){e.buffers.splice(t,1),We.bufferView(e,function(i){l(i.buffer)&&i.buffer>t&&i.buffer--,l(i.extensions)&&l(i.extensions.EXT_meshopt_compression)&&i.extensions.EXT_meshopt_compression.buffer--})};Vf.bufferView=function(e,t){if(e.bufferViews.splice(t,1),We.accessor(e,function(i){l(i.bufferView)&&i.bufferView>t&&i.bufferView--}),We.shader(e,function(i){l(i.bufferView)&&i.bufferView>t&&i.bufferView--}),We.image(e,function(i){l(i.bufferView)&&i.bufferView>t&&i.bufferView--}),ur(e,"KHR_draco_mesh_compression")&&We.mesh(e,function(i){We.meshPrimitive(i,function(o){l(o.extensions)&&l(o.extensions.KHR_draco_mesh_compression)&&o.extensions.KHR_draco_mesh_compression.bufferView>t&&o.extensions.KHR_draco_mesh_compression.bufferView--})}),ur(e,"EXT_feature_metadata")){let o=e.extensions.EXT_feature_metadata.featureTables;for(let r in o)if(o.hasOwnProperty(r)){let a=o[r].properties;if(l(a)){for(let c in a)if(a.hasOwnProperty(c)){let d=a[c];l(d.bufferView)&&d.bufferView>t&&d.bufferView--,l(d.arrayOffsetBufferView)&&d.arrayOffsetBufferView>t&&d.arrayOffsetBufferView--,l(d.stringOffsetBufferView)&&d.stringOffsetBufferView>t&&d.stringOffsetBufferView--}}}}if(ur(e,"EXT_structural_metadata")){let o=e.extensions.EXT_structural_metadata.propertyTables;if(l(o)){let r=o.length;for(let s=0;st&&u.values--,l(u.arrayOffsets)&&u.arrayOffsets>t&&u.arrayOffsets--,l(u.stringOffsets)&&u.stringOffsets>t&&u.stringOffsets--}}}}};Vf.image=function(e,t){e.images.splice(t,1),We.texture(e,function(i){l(i.source)&&i.source>t&&--i.source;let o=i.extensions;l(o)&&l(o.EXT_texture_webp)&&o.EXT_texture_webp.source>t?--i.extensions.EXT_texture_webp.source:l(o)&&l(o.KHR_texture_basisu)&&o.KHR_texture_basisu.source>t&&--i.extensions.KHR_texture_basisu.source})};Vf.mesh=function(e,t){e.meshes.splice(t,1),We.node(e,function(i){l(i.mesh)&&(i.mesh>t?i.mesh--:i.mesh===t&&delete i.mesh)})};Vf.node=function(e,t){e.nodes.splice(t,1),We.skin(e,function(i){l(i.skeleton)&&i.skeleton>t&&i.skeleton--,i.joints=i.joints.map(function(o){return o>t?o-1:o})}),We.animation(e,function(i){We.animationChannel(i,function(o){l(o.target)&&l(o.target.node)&&o.target.node>t&&o.target.node--})}),We.technique(e,function(i){We.techniqueUniform(i,function(o){l(o.node)&&o.node>t&&o.node--})}),We.node(e,function(i){l(i.children)&&(i.children=i.children.filter(function(o){return o!==t}).map(function(o){return o>t?o-1:o}))}),We.scene(e,function(i){i.nodes=i.nodes.filter(function(o){return o!==t}).map(function(o){return o>t?o-1:o})})};Vf.material=function(e,t){e.materials.splice(t,1),We.mesh(e,function(i){We.meshPrimitive(i,function(o){l(o.material)&&o.material>t&&o.material--})})};Vf.sampler=function(e,t){e.samplers.splice(t,1),We.texture(e,function(i){l(i.sampler)&&i.sampler>t&&--i.sampler})};Vf.texture=function(e,t){if(e.textures.splice(t,1),We.material(e,function(i){MC(i,function(o,r){r.index>t&&--r.index})}),ur(e,"EXT_feature_metadata")){We.mesh(e,function(r){We.meshPrimitive(r,function(s){let a=s.extensions;if(l(a)&&l(a.EXT_feature_metadata)){let d=a.EXT_feature_metadata.featureIdTextures;if(l(d)){let u=d.length;for(let h=0;ht&&--g.index}}}})});let o=e.extensions.EXT_feature_metadata.featureTextures;for(let r in o)if(o.hasOwnProperty(r)){let a=o[r].properties;if(l(a)){for(let c in a)if(a.hasOwnProperty(c)){let u=a[c].texture;u.index>t&&--u.index}}}}if(ur(e,"EXT_mesh_features")&&We.mesh(e,function(i){We.meshPrimitive(i,function(o){let r=o.extensions;if(l(r)&&l(r.EXT_mesh_features)){let a=r.EXT_mesh_features.featureIds;if(l(a)){let c=a.length;for(let d=0;dt&&--u.texture.index}}}})}),ur(e,"EXT_structural_metadata")){let o=e.extensions.EXT_structural_metadata.propertyTextures;if(l(o)){let r=o.length;for(let s=0;st&&--u.index}}}}};function Lf(){}Lf.accessor=function(e){let t={};return We.mesh(e,function(n){We.meshPrimitive(n,function(i){We.meshPrimitiveAttribute(i,function(r){t[r]=!0}),We.meshPrimitiveTarget(i,function(r){We.meshPrimitiveTargetAttribute(r,function(s){t[s]=!0})});let o=i.indices;l(o)&&(t[o]=!0)})}),We.skin(e,function(n){l(n.inverseBindMatrices)&&(t[n.inverseBindMatrices]=!0)}),We.animation(e,function(n){We.animationSampler(n,function(i){l(i.input)&&(t[i.input]=!0),l(i.output)&&(t[i.output]=!0)})}),ur(e,"EXT_mesh_gpu_instancing")&&We.node(e,function(n){l(n.extensions)&&l(n.extensions.EXT_mesh_gpu_instancing)&&Object.keys(n.extensions.EXT_mesh_gpu_instancing.attributes).forEach(function(i){let o=n.extensions.EXT_mesh_gpu_instancing.attributes[i];t[o]=!0})}),ur(e,"CESIUM_primitive_outline")&&We.mesh(e,function(n){We.meshPrimitive(n,function(i){let o=i.extensions;if(l(o)&&l(o.CESIUM_primitive_outline)){let s=o.CESIUM_primitive_outline.indices;l(s)&&(t[s]=!0)}})}),t};Lf.buffer=function(e){let t={};return We.bufferView(e,function(n){l(n.buffer)&&(t[n.buffer]=!0),l(n.extensions)&&l(n.extensions.EXT_meshopt_compression)&&(t[n.extensions.EXT_meshopt_compression.buffer]=!0)}),t};Lf.bufferView=function(e){let t={};if(We.accessor(e,function(n){l(n.bufferView)&&(t[n.bufferView]=!0)}),We.shader(e,function(n){l(n.bufferView)&&(t[n.bufferView]=!0)}),We.image(e,function(n){l(n.bufferView)&&(t[n.bufferView]=!0)}),ur(e,"KHR_draco_mesh_compression")&&We.mesh(e,function(n){We.meshPrimitive(n,function(i){l(i.extensions)&&l(i.extensions.KHR_draco_mesh_compression)&&(t[i.extensions.KHR_draco_mesh_compression.bufferView]=!0)})}),ur(e,"EXT_feature_metadata")){let i=e.extensions.EXT_feature_metadata.featureTables;for(let o in i)if(i.hasOwnProperty(o)){let s=i[o].properties;if(l(s)){for(let a in s)if(s.hasOwnProperty(a)){let c=s[a];l(c.bufferView)&&(t[c.bufferView]=!0),l(c.arrayOffsetBufferView)&&(t[c.arrayOffsetBufferView]=!0),l(c.stringOffsetBufferView)&&(t[c.stringOffsetBufferView]=!0)}}}}if(ur(e,"EXT_structural_metadata")){let i=e.extensions.EXT_structural_metadata.propertyTables;if(l(i)){let o=i.length;for(let r=0;r0&&(t[n.mesh]=!0)}}),t};function Aoe(e,t,n){let i=e.nodes[t];return l(i.mesh)||l(i.camera)||l(i.skin)||l(i.weights)||l(i.extras)||l(i.extensions)&&Object.keys(i.extensions).length!==0||l(n[t])?!1:!l(i.children)||i.children.filter(function(o){return!Aoe(e,o,n)}).length===0}Lf.node=function(e){let t={};return We.skin(e,function(n){l(n.skeleton)&&(t[n.skeleton]=!0),We.skinJoint(n,function(i){t[i]=!0})}),We.animation(e,function(n){We.animationChannel(n,function(i){l(i.target)&&l(i.target.node)&&(t[i.target.node]=!0)})}),We.technique(e,function(n){We.techniqueUniform(n,function(i){l(i.node)&&(t[i.node]=!0)})}),We.node(e,function(n,i){Aoe(e,i,t)||(t[i]=!0)}),t};Lf.material=function(e){let t={};return We.mesh(e,function(n){We.meshPrimitive(n,function(i){l(i.material)&&(t[i.material]=!0)})}),t};Lf.texture=function(e){let t={};if(We.material(e,function(n){MC(n,function(i){t[i]=!0})}),ur(e,"EXT_feature_metadata")){We.mesh(e,function(o){We.meshPrimitive(o,function(r){let s=r.extensions;if(l(s)&&l(s.EXT_feature_metadata)){let c=s.EXT_feature_metadata.featureIdTextures;if(l(c)){let d=c.length;for(let u=0;u0)for(s.mesh=n.meshes[c[0]],t=1;t0&&l(s.skin)){let u=e.skins[s.skin];u.skeleton=n.nodes[c[0]]}delete s.skeletons}l(s.jointName)&&delete s.jointName}),We.skin(e,function(s){l(s.inverseBindMatrices)&&(s.inverseBindMatrices=n.accessors[s.inverseBindMatrices]);let a=s.jointNames;if(l(a)){let c=[],d=a.length;for(t=0;t=0&&(a=r.substring(0,s),c=r.substring(s));let d,u=CAe[a];l(u)?(d=u+c,t[r]=d):l(SAe[a])||(d=`_${r}`,t[r]=d)}});for(let o in t)if(Object.prototype.hasOwnProperty.call(t,o)){let r=t[o],s=i.attributes[o];l(s)&&(delete i.attributes[o],i.attributes[r]=s)}})}),We.technique(e,function(n){We.techniqueParameter(n,function(i){let o=t[i.semantic];l(o)&&(i.semantic=o)})})}function LAe(e){We.camera(e,function(t){let n=t.perspective;if(l(n)){let i=n.aspectRatio;l(i)&&i===0&&delete n.aspectRatio;let o=n.yfov;l(o)&&o===0&&(n.yfov=1)}})}function MH(e,t){return l(t.byteStride)&&t.byteStride!==0?t.byteStride:wl(e,t)}function RAe(e){We.buffer(e,function(t){l(t.byteLength)||(t.byteLength=t.extras._pipeline.source.length)}),We.accessor(e,function(t){let n=t.bufferView;if(l(n)){let i=e.bufferViews[n],o=MH(e,t),r=t.byteOffset+t.count*o;i.byteLength=Math.max(y(i.byteLength,0),r)}})}function ZAe(e){let t,n,i,o=e.bufferViews,r={};We.accessorContainingVertexAttributeData(e,function(a){let c=e.accessors[a];l(c.bufferView)&&(r[c.bufferView]=!0)});let s={};We.accessor(e,function(a){l(a.bufferView)&&(s[a.bufferView]=y(s[a.bufferView],[]),s[a.bufferView].push(a))});for(let a in s)if(Object.prototype.hasOwnProperty.call(s,a)){i=o[a];let c=s[a];c.sort(function(p,g){return p.byteOffset-g.byteOffset});let d=0,u=0,h=c.length;for(t=0;t=0;--r)if(i[r]===t){i.splice(r,1);return}}}),We.node(e,function(n,i){if(l(n.children)){let o=n.children.indexOf(t);o>-1&&(n.children.splice(o,1),Uoe(n)&&Doe(e,i))}}),delete e.nodes[t]}function EAe(e){return We.node(e,function(t,n){Uoe(t)&&Doe(e,n)}),e}function IAe(e){We.animation(e,function(t){We.animationSampler(t,function(n){let i=e.accessors[n.input];if(!l(i.min)||!l(i.max)){let o=p_(e,i);i.min=o.min,i.max=o.max}})})}function XAe(e){We.accessor(e,function(t){if(l(t.min)||l(t.max)){let n=p_(e,t);l(t.min)&&(t.min=n.min),l(t.max)&&(t.max=n.max)}})}function WAe(e){e.asset=y(e.asset,{}),e.asset.version="2.0",koe(e),mAe(e),EAe(e),hAe(e),fAe(e),bAe(e),yAe(e),RAe(e),ZAe(e),GAe(e),IAe(e),XAe(e),xAe(e),_Ae(e),TAe(e),VAe(e),qI(e),LAe(e),HI(e),KI(e),pAe(e)}var PAe=["u_tex","u_diffuse","u_emission","u_diffuse_tex"],vAe=["u_diffuse","u_diffuse_mat"];function NH(e){e.pbrMetallicRoughness=l(e.pbrMetallicRoughness)?e.pbrMetallicRoughness:{},e.pbrMetallicRoughness.roughnessFactor=1,e.pbrMetallicRoughness.metallicFactor=0}function kH(e){return l(e.index)}function UH(e){return Array.isArray(e)&&e.length===4}function Boe(e){let t=new Array(4);t[3]=e[3];for(let n=0;n<3;n++){let i=e[n];i<=.04045?t[n]=e[n]*.07739938080495357:t[n]=Math.pow((i+.055)*.9478672985781991,2.4)}return t}function wAe(e,t){t=y(t,y.EMPTY_OBJECT);let n=y(t.baseColorTextureNames,PAe),i=y(t.baseColorFactorNames,vAe);We.material(e,function(o){We.materialValue(o,function(r,s){n.indexOf(s)!==-1&&kH(r)?(NH(o),o.pbrMetallicRoughness.baseColorTexture=r):i.indexOf(s)!==-1&&UH(r)&&(NH(o),o.pbrMetallicRoughness.baseColorFactor=Boe(r))})}),b_(e,"KHR_techniques_webgl"),b_(e,"KHR_blend")}function AH(e,t){l(t)&&(UH(t)?e.pbrMetallicRoughness.baseColorFactor=Boe(t):kH(t)&&(e.pbrMetallicRoughness.baseColorTexture=t))}function Noe(e,t){l(t)&&(UH(t)?e.emissiveFactor=t.slice(0,3):kH(t)&&(e.emissiveTexture=t))}function FAe(e){We.material(e,function(t){let n=y(t.extensions,y.EMPTY_OBJECT).KHR_materials_common;if(!l(n))return;let i=y(n.values,{}),o=i.ambient,r=i.diffuse,s=i.emission,a=i.transparency,c=n.doubleSided,d=n.transparent;NH(t),n.technique==="CONSTANT"?(Pu(e,"KHR_materials_unlit"),t.extensions=l(t.extensions)?t.extensions:{},t.extensions.KHR_materials_unlit={},AH(t,s),AH(t,o)):(AH(t,r),Noe(t,o),Noe(t,s)),l(c)&&(t.doubleSided=c),l(a)&&(l(t.pbrMetallicRoughness.baseColorFactor)?t.pbrMetallicRoughness.baseColorFactor[3]*=a:t.pbrMetallicRoughness.baseColorFactor=[1,1,1,a]),l(d)&&(t.alphaMode=d?"BLEND":"OPAQUE")}),b_(e,"KHR_materials_common")}var $I=sAe;var qln=T(S(),1);function uc(){}uc.getError=function(e,t,n){let i=`Failed to load ${e}: ${t}`;l(n)&&l(n.message)&&(i+=` ${n.message}`);let o=new ce(i);return l(n)&&(o.stack=`Original stack: ${n.stack} Handler stack: ${o.stack}`),o};uc.getNodeTransform=function(e){return l(e.matrix)?e.matrix:M.fromTranslationQuaternionRotationScale(l(e.translation)?e.translation:m.ZERO,l(e.rotation)?e.rotation:Fe.IDENTITY,l(e.scale)?e.scale:m.ONE)};uc.getAttributeBySemantic=function(e,t,n){let i=e.attributes,o=i.length;for(let r=0;r>t};ya.fromSubtreeJson=async function(e,t,n,i,o){let r=new ya(e,i,o),s;l(t)?s={json:t,binary:void 0}:s=RMe(n);let a=s.json;r._subtreeJson=a;let c;if(ci(a,"3DTILES_metadata"))c=a.extensions["3DTILES_metadata"];else if(l(a.tileMetadata)){let V=a.tileMetadata;c=a.propertyTables[V]}let d=[];if(l(a.contentMetadata)){let V=a.contentMetadata.length;for(let L=0;L0;u=u||h;for(let p=0;p>BigInt(61)),d=c%2===0?IC.encode2D(i,o,r):IC.encode2D(i,r,o),u=eb.fromFacePositionLevel(c,BigInt(d),i),h,p;if(l(s)){let g=(a.maximumHeight+a.minimumHeight)/2;h=n<4?a.minimumHeight:g,p=n<4?g:a.maximumHeight}else h=a.minimumHeight,p=a.maximumHeight;return{extensions:{"3DTILES_bounding_volume_S2":{token:eb.getTokenFromId(u._cellId),minimumHeight:h,maximumHeight:p}}}}var KMe=new m,JMe=new m,JH=new m,QMe=new $;function ire(e,t,n,i,o){if(t===0)return e;let r=m.unpack(e,0,JMe),s=$.unpack(e,3,QMe),a=Math.pow(2,-t),c=-1+(2*n+1)*a,d=-1+(2*i+1)*a,u=0,h=m.fromElements(a,a,1,KMe);l(o)&&(u=-1+(2*o+1)*a,h.z=a);let p=m.fromElements(c,d,u,JH);p=$.multiplyByVector(s,p,JH),p=m.add(p,r,JH);let g=$.clone(s);g=$.multiplyByScale(g,h,g);let f=new Array(12);return m.pack(p,f),$.pack(g,f,3),f}var jMe=new le;function ore(e,t,n,i,o){if(t===0)return e.slice();let r=le.unpack(e,0,jMe),s=e[4],a=e[5],c=Math.pow(2,-t),d=c*r.width,u=W.negativePiToPi(r.west+n*d),h=W.negativePiToPi(u+d),p=c*r.height,g=W.negativePiToPi(r.south+i*p),f=W.negativePiToPi(g+p),x=s,_=a;if(l(o)){let C=c*(a-s);x+=o*C,_=x+C}return[u,g,h,f,x,_]}function qMe(e,t,n){let i=e._implicitTileset,o=t.implicitCoordinates.getChildCoordinates(n),r=tre(i,o,n,!1,t),s=ere(void 0,i,o),a=i.subtreeUriTemplate.getDerivedResource({templateValues:o.getTemplateValues()}).url,c={boundingVolume:r,geometricError:s,refine:i.refine,contents:[{uri:a}]},d=rre(e,i.baseResource,c,t);return d.implicitTileset=i,d.implicitCoordinates=o,d}function rre(e,t,n,i){let o=e._tile.constructor;return new o(e._tileset,t,n,i)}qc.prototype.hasProperty=function(e,t){return!1};qc.prototype.getFeature=function(e){};qc.prototype.applyDebugSettings=function(e,t){};qc.prototype.applyStyle=function(e){};qc.prototype.update=function(e,t){};qc.prototype.pick=function(e,t,n){};qc.prototype.isDestroyed=function(){return!1};qc.prototype.destroy=function(){return this._implicitSubtree=this._implicitSubtree&&this._implicitSubtree.destroy(),me(this)};qc._deriveBoundingBox=ire;qc._deriveBoundingRegion=ore;qc._deriveBoundingVolumeS2=nre;var OC=qc;var svn=T(S(),1);var Qmn=T(S(),1),$Me={NONE:0,REPEAT:1,MIRRORED_REPEAT:2},Ml=Object.freeze($Me);var QPn=T(S(),1);var _hn=T(S(),1);var ehn=T(S(),1);function YC(e,t){this._distance=t,this._normal=new sre(e,this),this.onChangeCallback=void 0,this.index=-1}Object.defineProperties(YC.prototype,{distance:{get:function(){return this._distance},set:function(e){l(this.onChangeCallback)&&e!==this._distance&&this.onChangeCallback(this.index),this._distance=e}},normal:{get:function(){return this._normal},set:function(e){l(this.onChangeCallback)&&!m.equals(this._normal._cartesian3,e)&&this.onChangeCallback(this.index),m.clone(e,this._normal._cartesian3)}}});YC.fromPlane=function(e,t){return l(t)?(t.normal=e.normal,t.distance=e.distance):t=new YC(e.normal,e.distance),t};YC.clone=function(e,t){return l(t)?(t.normal=e.normal,t.distance=e.distance,t):new YC(e.normal,e.distance)};function sre(e,t){this._clippingPlane=t,this._cartesian3=m.clone(e)}Object.defineProperties(sre.prototype,{x:{get:function(){return this._cartesian3.x},set:function(e){l(this._clippingPlane.onChangeCallback)&&e!==this._cartesian3.x&&this._clippingPlane.onChangeCallback(this._clippingPlane.index),this._cartesian3.x=e}},y:{get:function(){return this._cartesian3.y},set:function(e){l(this._clippingPlane.onChangeCallback)&&e!==this._cartesian3.y&&this._clippingPlane.onChangeCallback(this._clippingPlane.index),this._cartesian3.y=e}},z:{get:function(){return this._cartesian3.z},set:function(e){l(this._clippingPlane.onChangeCallback)&&e!==this._cartesian3.z&&this._clippingPlane.onChangeCallback(this._clippingPlane.index),this._cartesian3.z=e}}});var S_=YC;function mc(e){e=y(e,y.EMPTY_OBJECT),this._planes=[],this._dirtyIndex=-1,this._multipleDirtyPlanes=!1,this._enabled=y(e.enabled,!0),this.modelMatrix=M.clone(y(e.modelMatrix,M.IDENTITY)),this.edgeColor=B.clone(y(e.edgeColor,B.WHITE)),this.edgeWidth=y(e.edgeWidth,0),this.planeAdded=new be,this.planeRemoved=new be,this._owner=void 0;let t=y(e.unionClippingRegions,!1);this._unionClippingRegions=t,this._testIntersection=t?ure:mre,this._uint8View=void 0,this._float32View=void 0,this._clippingPlanesTexture=void 0;let n=e.planes;if(l(n)){let i=n.length;for(let o=0;o0&&(r=zt.OUTSIDE);for(let s=0;s80*n){a=1/0,c=1/0;let u=-1/0,h=-1/0;for(let p=n;pu&&(u=g),f>h&&(h=f)}d=Math.max(u-a,h-c),d=d!==0?32767/d:0}return dX(r,s,n,a,c,d,0),s}function bre(e,t,n,i,o){let r;if(o===x9e(e,t,n,i)>0)for(let s=t;s=t;s-=i)r=pre(s/i|0,e[s],e[s+1],r);return r&&HC(r,r.next)&&(mX(r),r=r.next),r}function C_(e,t){if(!e)return e;t||(t=e);let n=e,i;do if(i=!1,!n.steiner&&(HC(n,n.next)||kr(n.prev,n,n.next)===0)){if(mX(n),n=t=n.prev,n===n.next)break;i=!0}else n=n.next;while(i||n!==t);return t}function dX(e,t,n,i,o,r,s){if(!e)return;!s&&r&&h9e(e,i,o,r);let a=e;for(;e.prev!==e.next;){let c=e.prev,d=e.next;if(r?r9e(e,i,o,r):o9e(e)){t.push(c.i,e.i,d.i),mX(e),e=d.next,a=d.next;continue}if(e=d,e===a){s?s===1?(e=s9e(C_(e),t),dX(e,t,n,i,o,r,2)):s===2&&a9e(e,t,n,i,o,r):dX(C_(e),t,n,i,o,r,1);break}}}function o9e(e){let t=e.prev,n=e,i=e.next;if(kr(t,n,i)>=0)return!1;let o=t.x,r=n.x,s=i.x,a=t.y,c=n.y,d=i.y,u=Math.min(o,r,s),h=Math.min(a,c,d),p=Math.max(o,r,s),g=Math.max(a,c,d),f=i.next;for(;f!==t;){if(f.x>=u&&f.x<=p&&f.y>=h&&f.y<=g&&lX(o,a,r,c,s,d,f.x,f.y)&&kr(f.prev,f,f.next)>=0)return!1;f=f.next}return!0}function r9e(e,t,n,i){let o=e.prev,r=e,s=e.next;if(kr(o,r,s)>=0)return!1;let a=o.x,c=r.x,d=s.x,u=o.y,h=r.y,p=s.y,g=Math.min(a,c,d),f=Math.min(u,h,p),x=Math.max(a,c,d),_=Math.max(u,h,p),C=jH(g,f,t,n,i),V=jH(x,_,t,n,i),L=e.prevZ,R=e.nextZ;for(;L&&L.z>=C&&R&&R.z<=V;){if(L.x>=g&&L.x<=x&&L.y>=f&&L.y<=_&&L!==o&&L!==s&&lX(a,u,c,h,d,p,L.x,L.y)&&kr(L.prev,L,L.next)>=0||(L=L.prevZ,R.x>=g&&R.x<=x&&R.y>=f&&R.y<=_&&R!==o&&R!==s&&lX(a,u,c,h,d,p,R.x,R.y)&&kr(R.prev,R,R.next)>=0))return!1;R=R.nextZ}for(;L&&L.z>=C;){if(L.x>=g&&L.x<=x&&L.y>=f&&L.y<=_&&L!==o&&L!==s&&lX(a,u,c,h,d,p,L.x,L.y)&&kr(L.prev,L,L.next)>=0)return!1;L=L.prevZ}for(;R&&R.z<=V;){if(R.x>=g&&R.x<=x&&R.y>=f&&R.y<=_&&R!==o&&R!==s&&lX(a,u,c,h,d,p,R.x,R.y)&&kr(R.prev,R,R.next)>=0)return!1;R=R.nextZ}return!0}function s9e(e,t){let n=e;do{let i=n.prev,o=n.next.next;!HC(i,o)&&yre(i,n,n.next,o)&&uX(i,o)&&uX(o,i)&&(t.push(i.i,n.i,o.i),mX(n),mX(n.next),n=e=o),n=n.next}while(n!==e);return C_(n)}function a9e(e,t,n,i,o,r){let s=e;do{let a=s.next.next;for(;a!==s.prev;){if(s.i!==a.i&&b9e(s,a)){let c=xre(s,a);s=C_(s,s.next),c=C_(c,c.next),dX(s,t,n,i,o,r,0),dX(c,t,n,i,o,r,0);return}a=a.next}s=s.next}while(s!==e)}function c9e(e,t,n,i){let o=[];for(let r=0,s=t.length;r=n.next.y&&n.next.y!==n.y){let h=n.x+(o-n.y)*(n.next.x-n.x)/(n.next.y-n.y);if(h<=i&&h>r&&(r=h,s=n.x=n.x&&n.x>=c&&i!==n.x&&gre(os.x||n.x===s.x&&m9e(s,n)))&&(s=n,u=h)}n=n.next}while(n!==a);return s}function m9e(e,t){return kr(e.prev,e,t.prev)<0&&kr(t.next,e,e.next)<0}function h9e(e,t,n,i){let o=e;do o.z===0&&(o.z=jH(o.x,o.y,t,n,i)),o.prevZ=o.prev,o.nextZ=o.next,o=o.next;while(o!==e);o.prevZ.nextZ=null,o.prevZ=null,f9e(o)}function f9e(e){let t,n=1;do{let i=e,o;e=null;let r=null;for(t=0;i;){t++;let s=i,a=0;for(let d=0;d0||c>0&&s;)a!==0&&(c===0||!s||i.z<=s.z)?(o=i,i=i.nextZ,a--):(o=s,s=s.nextZ,c--),r?r.nextZ=o:e=o,o.prevZ=r,r=o;i=s}r.nextZ=null,n*=2}while(t>1);return e}function jH(e,t,n,i,o){return e=(e-n)*o|0,t=(t-i)*o|0,e=(e|e<<8)&16711935,e=(e|e<<4)&252645135,e=(e|e<<2)&858993459,e=(e|e<<1)&1431655765,t=(t|t<<8)&16711935,t=(t|t<<4)&252645135,t=(t|t<<2)&858993459,t=(t|t<<1)&1431655765,e|t<<1}function p9e(e){let t=e,n=e;do(t.x=(e-s)*(r-a)&&(e-s)*(i-a)>=(n-s)*(t-a)&&(n-s)*(r-a)>=(o-s)*(i-a)}function lX(e,t,n,i,o,r,s,a){return!(e===s&&t===a)&&gre(e,t,n,i,o,r,s,a)}function b9e(e,t){return e.next.i!==t.i&&e.prev.i!==t.i&&!g9e(e,t)&&(uX(e,t)&&uX(t,e)&&y9e(e,t)&&(kr(e.prev,e,t.prev)||kr(e,t.prev,t))||HC(e,t)&&kr(e.prev,e,e.next)>0&&kr(t.prev,t,t.next)>0)}function kr(e,t,n){return(t.y-e.y)*(n.x-t.x)-(t.x-e.x)*(n.y-t.y)}function HC(e,t){return e.x===t.x&&e.y===t.y}function yre(e,t,n,i){let o=J5(kr(e,t,n)),r=J5(kr(e,t,i)),s=J5(kr(n,i,e)),a=J5(kr(n,i,t));return!!(o!==r&&s!==a||o===0&&K5(e,n,t)||r===0&&K5(e,i,t)||s===0&&K5(n,e,i)||a===0&&K5(n,t,i))}function K5(e,t,n){return t.x<=Math.max(e.x,n.x)&&t.x>=Math.min(e.x,n.x)&&t.y<=Math.max(e.y,n.y)&&t.y>=Math.min(e.y,n.y)}function J5(e){return e>0?1:e<0?-1:0}function g9e(e,t){let n=e;do{if(n.i!==e.i&&n.next.i!==e.i&&n.i!==t.i&&n.next.i!==t.i&&yre(n,n.next,e,t))return!0;n=n.next}while(n!==e);return!1}function uX(e,t){return kr(e.prev,e,e.next)<0?kr(e,t,e.next)>=0&&kr(e,e.prev,t)>=0:kr(e,t,e.prev)<0||kr(e,e.next,t)<0}function y9e(e,t){let n=e,i=!1,o=(e.x+t.x)/2,r=(e.y+t.y)/2;do n.y>r!=n.next.y>r&&n.next.y!==n.y&&o<(n.next.x-n.x)*(r-n.y)/(n.next.y-n.y)+n.x&&(i=!i),n=n.next;while(n!==e);return i}function xre(e,t){let n=qH(e.i,e.x,e.y),i=qH(t.i,t.x,t.y),o=e.next,r=t.prev;return e.next=t,t.prev=e,n.next=o,o.prev=n,i.next=n,n.prev=i,r.next=i,i.prev=r,i}function pre(e,t,n,i){let o=qH(e,t,n);return i?(o.next=i.next,o.prev=i,i.next.prev=o,i.next=o):(o.prev=o,o.next=o),o}function mX(e){e.next.prev=e.prev,e.prev.next=e.next,e.prevZ&&(e.prevZ.nextZ=e.nextZ),e.nextZ&&(e.nextZ.prevZ=e.prevZ)}function qH(e,t,n){return{i:e,x:t,y:n,prev:null,next:null,z:0,prevZ:null,nextZ:null,steiner:!1}}function x9e(e,t,n,i){let o=0;for(let r=t,s=n-i;r0?fs.COUNTER_CLOCKWISE:fs.CLOCKWISE};Cg.triangulate=function(e,t){let n=D.packArray(e);return $H(n,t,2)};var Cre=new m,Vre=new m,Lre=new m,_re=new m,Tre=new m,Sre=new m,ab=new m,Rre=new D,Zre=new D,Gre=new D,zC=new D;Cg.computeSubdivision=function(e,t,n,i,o){o=y(o,W.RADIANS_PER_DEGREE);let r=l(i),s=n.slice(0),a,c=t.length,d=new Array(c*3),u=new Array(c*2),h=0,p=0;for(a=0;a0;){let L=s.pop(),R=s.pop(),G=s.pop(),I=m.fromArray(d,G*3,Cre),v=m.fromArray(d,R*3,Vre),P=m.fromArray(d,L*3,Lre),w,A,b;r&&(w=D.fromArray(u,G*2,Rre),A=D.fromArray(u,R*2,Zre),b=D.fromArray(u,L*2,Gre));let Z=m.multiplyByScalar(m.normalize(I,_re),x,_re),E=m.multiplyByScalar(m.normalize(v,Tre),x,Tre),X=m.multiplyByScalar(m.normalize(P,Sre),x,Sre),F=m.magnitudeSquared(m.subtract(Z,E,ab)),N=m.magnitudeSquared(m.subtract(E,X,ab)),O=m.magnitudeSquared(m.subtract(X,Z,ab)),U=Math.max(F,N,O),Y,k,H;U>C?F===U?(Y=`${Math.min(G,R)} ${Math.max(G,R)}`,a=f[Y],l(a)||(k=m.add(I,v,ab),m.multiplyByScalar(k,.5,k),d.push(k.x,k.y,k.z),a=d.length/3-1,f[Y]=a,r&&(H=D.add(w,A,zC),D.multiplyByScalar(H,.5,H),u.push(H.x,H.y))),s.push(G,a,L),s.push(a,R,L)):N===U?(Y=`${Math.min(R,L)} ${Math.max(R,L)}`,a=f[Y],l(a)||(k=m.add(v,P,ab),m.multiplyByScalar(k,.5,k),d.push(k.x,k.y,k.z),a=d.length/3-1,f[Y]=a,r&&(H=D.add(A,b,zC),D.multiplyByScalar(H,.5,H),u.push(H.x,H.y))),s.push(R,a,G),s.push(a,L,G)):O===U&&(Y=`${Math.min(L,G)} ${Math.max(L,G)}`,a=f[Y],l(a)||(k=m.add(P,I,ab),m.multiplyByScalar(k,.5,k),d.push(k.x,k.y,k.z),a=d.length/3-1,f[Y]=a,r&&(H=D.add(b,w,zC),D.multiplyByScalar(H,.5,H),u.push(H.x,H.y))),s.push(L,a,R),s.push(a,G,R)):(g.push(G),g.push(R),g.push(L))}let V={attributes:{position:new Ze({componentDatatype:Q.DOUBLE,componentsPerAttribute:3,values:d})},indices:g,primitiveType:Ae.TRIANGLES};return r&&(V.attributes.st=new Ze({componentDatatype:Q.FLOAT,componentsPerAttribute:2,values:u})),new mt(V)};var S9e=new he,C9e=new he,V9e=new he,ez=new he;Cg.computeRhumbLineSubdivision=function(e,t,n,i,o){o=y(o,W.RADIANS_PER_DEGREE);let r=l(i),s=n.slice(0),a,c=t.length,d=new Array(c*3),u=new Array(c*2),h=0,p=0;for(a=0;a0;){let G=s.pop(),I=s.pop(),v=s.pop(),P=m.fromArray(d,v*3,Cre),w=m.fromArray(d,I*3,Vre),A=m.fromArray(d,G*3,Lre),b,Z,E;r&&(b=D.fromArray(u,v*2,Rre),Z=D.fromArray(u,I*2,Zre),E=D.fromArray(u,G*2,Gre));let X=e.cartesianToCartographic(P,S9e),F=e.cartesianToCartographic(w,C9e),N=e.cartesianToCartographic(A,V9e);C.setEndPoints(X,F);let O=C.surfaceDistance;V.setEndPoints(F,N);let U=V.surfaceDistance;L.setEndPoints(N,X);let Y=L.surfaceDistance,k=Math.max(O,U,Y),H,K,te,z,j;k>_?O===k?(H=`${Math.min(v,I)} ${Math.max(v,I)}`,a=f[H],l(a)||(K=C.interpolateUsingFraction(.5,ez),te=(X.height+F.height)*.5,z=m.fromRadians(K.longitude,K.latitude,te,e,ab),d.push(z.x,z.y,z.z),a=d.length/3-1,f[H]=a,r&&(j=D.add(b,Z,zC),D.multiplyByScalar(j,.5,j),u.push(j.x,j.y))),s.push(v,a,G),s.push(a,I,G)):U===k?(H=`${Math.min(I,G)} ${Math.max(I,G)}`,a=f[H],l(a)||(K=V.interpolateUsingFraction(.5,ez),te=(F.height+N.height)*.5,z=m.fromRadians(K.longitude,K.latitude,te,e,ab),d.push(z.x,z.y,z.z),a=d.length/3-1,f[H]=a,r&&(j=D.add(Z,E,zC),D.multiplyByScalar(j,.5,j),u.push(j.x,j.y))),s.push(I,a,v),s.push(a,G,v)):Y===k&&(H=`${Math.min(G,v)} ${Math.max(G,v)}`,a=f[H],l(a)||(K=L.interpolateUsingFraction(.5,ez),te=(N.height+X.height)*.5,z=m.fromRadians(K.longitude,K.latitude,te,e,ab),d.push(z.x,z.y,z.z),a=d.length/3-1,f[H]=a,r&&(j=D.add(E,b,zC),D.multiplyByScalar(j,.5,j),u.push(j.x,j.y))),s.push(G,a,I),s.push(a,v,I)):(g.push(v),g.push(I),g.push(G))}let R={attributes:{position:new Ze({componentDatatype:Q.DOUBLE,componentsPerAttribute:3,values:d})},indices:g,primitiveType:Ae.TRIANGLES};return r&&(R.attributes.st=new Ze({componentDatatype:Q.FLOAT,componentsPerAttribute:2,values:u})),new mt(R)};Cg.scaleToGeodeticHeight=function(e,t,n,i){n=y(n,ne.default);let o=_9e,r=T9e;if(t=y(t,0),i=y(i,!0),l(e)){let s=e.length;for(let a=0;a10&&t*2>e.length&&(this._array=e.slice(t),t=0),this._offset=t,this._length--,n};Vg.prototype.peek=function(){if(this._length!==0)return this._array[this._offset]};Vg.prototype.contains=function(e){return this._array.indexOf(e)!==-1};Vg.prototype.clear=function(){this._array.length=this._offset=this._length=0};Vg.prototype.sort=function(e){this._offset>0&&(this._array=this._array.slice(this._offset),this._offset=0),this._array.sort(e)};var Lg=Vg;var ir={};ir.computeHierarchyPackedLength=function(e,t){let n=0,i=[e];for(;i.length>0;){let o=i.pop();if(!l(o))continue;n+=2;let r=o.positions,s=o.holes;if(l(r)&&r.length>0&&(n+=r.length*t.packedLength),l(s)){let a=s.length;for(let c=0;c0;){let r=o.pop();if(!l(r))continue;let s=r.positions,a=r.holes;if(t[n++]=l(s)?s.length:0,t[n++]=l(a)?a.length:0,l(s)){let c=s.length;for(let d=0;d0?new Array(o):void 0;for(let a=0;aW.PI){let c=s;s=a,a=c}if(!(r.longitudea))return n.cartographicToCartesian(r)}function v9e(e,t,n,i){if(i===tn.RHUMB)return P9e(e,t,n);let o=ti.lineSegmentPlane(e,t,cn.ORIGIN_XY_PLANE);if(l(o))return n.scaleToGeodeticSurface(o,o)}var w9e=new he;function F9e(e,t,n){let i=[],o,r,s,a,c,d=0;for(;dt.cartesianToCartographic(h,w9e).longitude;if(s===0)i.push({position:d,type:s,visited:!1,next:a,theta:u(o)});else if(a!==0){if(c=v9e(o,r,t,n),++d,!l(c))continue;e.splice(d,0,c),i.push({position:d,type:s,visited:!1,next:a,theta:u(c)})}++d}return i}function Wre(e,t,n,i,o,r,s){let a=[],c=r,d=h=>p=>p.position===h,u=[];do{let h=n[c];a.push(h);let p=i.findIndex(d(c)),g=i[p];if(!l(g)){++c;continue}let{visited:f,type:x,next:_}=g;if(g.visited=!0,x===0){if(_===0){let R=i[p-(s?1:-1)];if((R==null?void 0:R.position)===c+1)R.visited=!0;else{++c;continue}}if(!f&&s&&_>0||r===c&&!s&&_<0){++c;continue}}if(!(s?x>=0:x<=0)){++c;continue}f||u.push(c);let V=p+(s?1:-1),L=i[V];if(!l(L)){++c;continue}c=L.position}while(c=0&&c!==r&&a.lengthd.theta-u.theta);let c=s[0].z>=0;o=Wre(i,o,s,a,1,0,c)}return i};ir.polygonsFromHierarchy=function(e,t,n,i,o,r){let s=[],a=[],c=new Lg;c.enqueue(e);let d=l(r);for(;c.length!==0;){let u=c.dequeue(),h=u.positions,p=u.holes,g,f;if(i)for(f=h.length,g=0;g1){for(let v of I)c.enqueue(new Aa(v,p));continue}}let V=h.slice(),L=l(p)?p.length:0,R=[],G;for(g=0;gMath.PI&&(e-=W.TWO_PI),e}}});var KC=new he,B9e=new m;Ur.prototype.getLatitude=function(e){l(e)||(e=ne.default),KC.latitude=this.conformalLatitude,KC.longitude=this.longitude,KC.height=0;let t=this.ellipsoid.cartographicToCartesian(KC,B9e);return e.cartesianToCartographic(t,KC),KC.latitude};var O9e=new gn,Y9e=new m,H9e=new m;Ur.fromCartesian=function(e,t){let n=W.signNotZero(e.z),i=Ur.NORTH_POLE_TANGENT_PLANE,o=Ur.SOUTH_POLE;n<0&&(i=Ur.SOUTH_POLE_TANGENT_PLANE,o=Ur.NORTH_POLE);let r=O9e;r.origin=i.ellipsoid.scaleToGeocentricSurface(e,r.origin),r.direction=m.subtract(r.origin,o,Y9e),m.normalize(r.direction,r.direction);let s=ti.rayPlane(r,i.plane,H9e),a=m.subtract(s,o,s),c=m.dot(i.xAxis,a),d=n*m.dot(i.yAxis,a);return l(t)?(t.position=new D(c,d),t.tangentPlane=i,t):new Ur(new D(c,d),i)};Ur.fromCartesianArray=function(e,t){let n=e.length;l(t)?t.length=n:t=new Array(n);for(let i=0;i=0?s:s+W.TWO_PI;o.westOverIdl=Math.min(o.westOverIdl,a),o.eastOverIdl=Math.max(o.eastOverIdl,a),r.west=Math.min(r.west,s),r.east=Math.max(r.east,s);let c=e.getLatitude(n),d=c;if(r.south=Math.min(r.south,c),r.north=Math.max(r.north,c),i!==tn.RHUMB){let p=D.subtract(t.position,e.position,dNe),g=D.dot(t.position,p)/D.dot(p,p);if(g>0&&g<1){let f=D.add(t.position,D.multiplyByScalar(p,-g,p),uNe),x=hc.clone(t,mNe);x.position=f;let _=x.getLatitude(n);r.south=Math.min(r.south,_),r.north=Math.max(r.north,_),Math.abs(c)>Math.abs(_)&&(d=_)}}let u=t.x*e.y-e.x*t.y,h=Math.sign(u);h!==0&&(h*=D.angleBetween(t.position,e.position)),d>=0&&(o.northAngle+=h),d<=0&&(o.southAngle+=h)}var Mre=new hc,hNe=new hc,vu={northAngle:0,southAngle:0,westOverIdl:0,eastOverIdl:0};wu.computeRectangleFromPositions=function(e,t,n,i){if(l(i)||(i=new le),e.length<3)return i;i.west=Number.POSITIVE_INFINITY,i.east=Number.NEGATIVE_INFINITY,i.south=Number.POSITIVE_INFINITY,i.north=Number.NEGATIVE_INFINITY,vu.northAngle=0,vu.southAngle=0,vu.westOverIdl=Number.POSITIVE_INFINITY,vu.eastOverIdl=Number.NEGATIVE_INFINITY;let o=e.length,r=hc.fromCartesian(e[0],hNe);for(let s=1;svu.eastOverIdl-vu.westOverIdl&&(i.west=vu.westOverIdl,i.east=vu.eastOverIdl,i.east>W.PI&&(i.east=i.east-W.TWO_PI),i.west>W.PI&&(i.west=i.west-W.TWO_PI)),W.equalsEpsilon(Math.abs(vu.northAngle),W.TWO_PI,W.EPSILON10)&&(i.north=W.PI_OVER_TWO,i.east=W.PI,i.west=-W.PI),W.equalsEpsilon(Math.abs(vu.southAngle),W.TWO_PI,W.EPSILON10)&&(i.south=-W.PI_OVER_TWO,i.east=W.PI,i.west=-W.PI),i};var fNe=new hc;function pNe(e,t,n){return e.height>=W.PI||e.width>=W.PI?hc.fromCartesian(t[0],fNe).tangentPlane:qr.fromPoints(t,n)}var Nre=new he;function bNe(e,t,n){return(i,o)=>{if(e.height>=W.PI||e.width>=W.PI){if(e.south<0&&e.north>0){l(o)||(o=[]);for(let s=0;s=W.PI||e.width>=W.PI)return(o,r)=>{if(e.south<0&&e.north>0){let s=n.cartesianToCartographic(o,Nre);return l(r)||(r=new D),r.x=s.longitude/W.PI,r.y=s.latitude/W.PI_OVER_TWO,r}return hc.fromCartesian(o,r)};let i=qr.fromPoints(t,n);return(o,r)=>i.projectPointsOntoPlane(o,r)}function yNe(e,t,n,i){return(o,r)=>!i&&(e.height>=W.PI_OVER_TWO||e.width>=2*W.PI_OVER_THREE)?Yn.splitPolygonsOnEquator(o,t,n,r):o}function xNe(e,t,n,i){if(t.height>=W.PI||t.width>=W.PI)return He.fromRectangle(t,void 0,vre);let o=e,r=qr.fromPoints(o,n);return Yn.computeBoundingRectangle(r.plane.normal,r.projectPointOntoPlane.bind(r),o,i,vre)}wu.createGeometry=function(e){let t=e._vertexFormat,n=e._ellipsoid,i=e._granularity,o=e._stRotation,r=e._polygonHierarchy,s=e._perPositionHeight,a=e._closeTop,c=e._closeBottom,d=e._arcType,u=e._textureCoordinates,h=l(u),p=r.positions;if(p.length<3)return;let g=e.rectangle,f=Yn.polygonsFromHierarchy(r,h,bNe(g,p,n),!s,n,yNe(g,n,d,s)),x=f.hierarchy,_=f.polygons,C=function(X){return X},V=h?Yn.polygonsFromHierarchy(u,!0,C,!1,n).polygons:void 0;if(x.length===0)return;let L=x[0].outerRing,R=xNe(L,g,n,o),G=[],I=e._height,v=e._extrudedHeight,P=e._perPositionHeightExtrude||!W.equalsEpsilon(I,v,0,W.EPSILON2),w={perPositionHeight:s,vertexFormat:t,geometry:void 0,rotationAxis:pNe(g,L,n).plane.normal,projectTo2d:gNe(g,L,n),boundingRectangle:R,ellipsoid:n,stRotation:o,textureCoordinates:void 0,bottom:!1,top:!0,wall:!1,extrude:!1,arcType:d},A;if(P)for(w.extrude=!0,w.top=a,w.bottom=c,w.shadowVolume=e._shadowVolume,w.offsetAttribute=e._offsetAttribute,A=0;A<_.length;A++){let X=sNe(n,_[A],h?V[A]:void 0,i,x[A],s,a,c,t,d),F;a&&c?(F=X.topAndBottom,w.geometry=Yn.scaleToGeodeticHeightExtruded(F.geometry,I,v,n,s)):a?(F=X.topAndBottom,F.geometry.attributes.position.values=di.scaleToGeodeticHeight(F.geometry.attributes.position.values,I,n,!s),w.geometry=F.geometry):c&&(F=X.topAndBottom,F.geometry.attributes.position.values=di.scaleToGeodeticHeight(F.geometry.attributes.position.values,v,n,!0),w.geometry=F.geometry),(a||c)&&(w.wall=!1,F.geometry=tz(w),G.push(F));let N=X.walls;w.wall=!0;for(let O=0;O 2) { dimension = ceil(log2(float(u_extentsLength))); } int regionIndex = getPolygonIndex(dimension, v_textureCoordinates); for (int polygonIndex = 0; polygonIndex < u_polygonsLength; polygonIndex++) { ivec2 positionsLengthAndExtents = getPositionsLengthAndExtentsIndex(lastPolygonIndex); int positionsLength = positionsLengthAndExtents.x; int polygonExtentsIndex = positionsLengthAndExtents.y; lastPolygonIndex += 1; // Only compute signed distance for the relevant part of the atlas if (polygonExtentsIndex == regionIndex) { float clipAmount = czm_infinity; vec4 extents = getExtents(polygonExtentsIndex); vec2 textureOffset = vec2(mod(float(polygonExtentsIndex), dimension), floor(float(polygonExtentsIndex) / dimension)) / dimension; vec2 p = getCoordinates((v_textureCoordinates - textureOffset) * dimension, extents); float s = 1.0; // Check each edge for absolute distance for (int i = 0, j = positionsLength - 1; i < positionsLength; j = i, i++) { vec2 a = getPolygonPosition(lastPolygonIndex + i); vec2 b = getPolygonPosition(lastPolygonIndex + j); vec2 ab = b - a; vec2 pa = p - a; float t = dot(pa, ab) / dot(ab, ab); t = clamp(t, 0.0, 1.0); vec2 pq = pa - t * ab; float d = length(pq); // Inside / outside computation to determine sign bvec3 cond = bvec3(p.y >= a.y, p.y < b.y, ab.x * pa.y > ab.y * pa.x); if (all(cond) || all(not(cond))) s = -s; if (abs(d) < abs(clipAmount)) { clipAmount = d; } } // Normalize the range to [0,1] vec4 result = (s * vec4(clipAmount * length(extents.zw))) / 2.0 + 0.5; // In the case where we've iterated through multiple polygons, take the minimum out_FragColor = min(out_FragColor, result); } lastPolygonIndex += positionsLength; } }`;function ns(e){e=y(e,y.EMPTY_OBJECT),this._polygons=[],this._totalPositions=0,this.enabled=y(e.enabled,!0),this.inverse=y(e.inverse,!1),this.polygonAdded=new be,this.polygonRemoved=new be,this._owner=void 0,this._float32View=void 0,this._extentsFloat32View=void 0,this._extentsCount=0,this._polygonsTexture=void 0,this._extentsTexture=void 0,this._signedDistanceTexture=void 0,this._signedDistanceComputeCommand=void 0;let t=e.polygons;if(l(t)){let n=t.length;for(let i=0;iQC.equals(t,e))};ns.prototype.remove=function(e){let t=this._polygons,n=t.findIndex(i=>QC.equals(i,e));return n===-1?!1:(t.splice(n,1),this.polygonRemoved.raiseEvent(e,n),!0)};var SNe=new le;function CNe(e){let t=[],n=[],i=e.length;for(let r=0;rle.union(e[_].computeSphericalExtents(SNe),x,x),a),t[p]=void 0,n[p]=void 0,c=Math.max(a.height*2.5,.001),d=Math.max(a.width*2.5,.001),u=le.clone(a,u),u.south-=c,u.west-=d,u.north+=c,u.east+=d,u.south=Math.max(u.south,-Math.PI),u.west=Math.max(u.west,-Math.PI),u.north=Math.min(u.north,Math.PI),u.east=Math.min(u.east,Math.PI),p=-1}}t.push(u),n.push(h)}let o=new Map;return n.filter(l).forEach((r,s)=>r.forEach(a=>o.set(a,s))),{extentsList:t.filter(l),extentsIndexByPolygon:o}}ns.prototype.removeAll=function(){let e=this._polygons,t=e.length;for(let n=0;ns+a.length,0);if(n===this.totalPositions||(this._totalPositions=n,this.length===0))return;l(this._signedDistanceComputeCommand)&&(this._signedDistanceComputeCommand.canceled=!0,this._signedDistanceComputeCommand=void 0);let i=this._polygonsTexture,o=this._extentsTexture,r=this._signedDistanceTexture;if(l(i)){let s=i.width*i.height;(s{e._signedDistanceComputeCommand=void 0}})}var Dre=new le,RNe=new le;ns.prototype.computeIntersectionWithBoundingVolume=function(e,t){var r;let n=this._polygons,i=n.length,o=zt.OUTSIDE;this.inverse&&(o=zt.INSIDE);for(let s=0;s= PRIMARY_STEPS) { break; } // Calculate sample position along viewpoint ray. vec3 samplePosition = primaryRay.origin + primaryRay.direction * (rayPositionLength + rayStepLength); // Calculate height of sample position above ellipsoid. float sampleHeight = length(samplePosition) - atmosphereInnerRadius; // Calculate and accumulate density of particles at the sample position. vec2 sampleDensity = exp(-sampleHeight / heightScale) * rayStepLength; opticalDepth += sampleDensity; // Generate ray from the sample position segment to the light source, up to the outer ring of the atmosphere. czm_ray lightRay = czm_ray(samplePosition, lightDirection); czm_raySegment lightRayAtmosphereIntersect = czm_raySphereIntersectionInterval(lightRay, origin, atmosphereOuterRadius); float lightStepLength = lightRayAtmosphereIntersect.stop / float(LIGHT_STEPS); float lightPositionLength = 0.0; vec2 lightOpticalDepth = vec2(0.0); // Sample positions along the light ray, to accumulate incidence of light on the latest sample segment. for (int j = 0; j < LIGHT_STEPS_MAX; ++j) { // The loop should be: for (int j = 0; i < LIGHT_STEPS; ++j) {...} but WebGL1 cannot // loop with non-constant condition, so it has to break early instead if (j >= LIGHT_STEPS) { break; } // Calculate sample position along light ray. vec3 lightPosition = samplePosition + lightDirection * (lightPositionLength + lightStepLength * 0.5); // Calculate height of the light sample position above ellipsoid. float lightHeight = length(lightPosition) - atmosphereInnerRadius; // Calculate density of photons at the light sample position. lightOpticalDepth += exp(-lightHeight / heightScale) * lightStepLength; // Increment distance on light ray. lightPositionLength += lightStepLength; } // Compute attenuation via the primary ray and the light ray. vec3 attenuation = exp(-((u_atmosphereMieCoefficient * (opticalDepth.y + lightOpticalDepth.y)) + (u_atmosphereRayleighCoefficient * (opticalDepth.x + lightOpticalDepth.x)))); // Accumulate the scattering. rayleighAccumulation += sampleDensity.x * attenuation; mieAccumulation += sampleDensity.y * attenuation; // Increment distance on primary ray. rayPositionLength += (rayStepLength += rayStepLengthIncrease); } // Compute the scattering amount. rayleighColor = u_atmosphereRayleighCoefficient * rayleighAccumulation; mieColor = u_atmosphereMieCoefficient * mieAccumulation; // Compute the transmittance i.e. how much light is passing through the atmosphere. opacity = length(exp(-((u_atmosphereMieCoefficient * opticalDepth.y) + (u_atmosphereRayleighCoefficient * opticalDepth.x)))); } vec4 computeAtmosphereColor( vec3 positionWC, vec3 lightDirection, vec3 rayleighColor, vec3 mieColor, float opacity ) { // Setup the primary ray: from the camera position to the vertex position. vec3 cameraToPositionWC = positionWC - czm_viewerPositionWC; vec3 cameraToPositionWCDirection = normalize(cameraToPositionWC); float cosAngle = dot(cameraToPositionWCDirection, lightDirection); float cosAngleSq = cosAngle * cosAngle; float G = u_atmosphereMieAnisotropy; float GSq = G * G; // The Rayleigh phase function. float rayleighPhase = 3.0 / (50.2654824574) * (1.0 + cosAngleSq); // The Mie phase function. float miePhase = 3.0 / (25.1327412287) * ((1.0 - GSq) * (cosAngleSq + 1.0)) / (pow(1.0 + GSq - 2.0 * cosAngle * G, 1.5) * (2.0 + GSq)); // The final color is generated by combining the effects of the Rayleigh and Mie scattering. vec3 rayleigh = rayleighPhase * rayleighColor; vec3 mie = miePhase * mieColor; vec3 color = (rayleigh + mie) * u_atmosphereLightIntensity; return vec4(color, opacity); } `;var zpn=T(S(),1),pX=`uniform samplerCube u_radianceMap; in vec2 v_textureCoordinates; const float twoSqrtPi = 2.0 * sqrt(czm_pi); // Coutesy of https://www.ppsloan.org/publications/StupidSH36.pdf float computeShBasis(int index, vec3 s) { if (index == 0) { // l = 0, m = 0 return 1.0 / twoSqrtPi; } if (index == 1) { // l = 1, m = -1 return -sqrt(3.0) * s.y / twoSqrtPi; } if (index == 2) { // l = 1, m = 0 return sqrt(3.0) * s.z / twoSqrtPi; } if (index == 3) { // l = 1, m = 1 return -sqrt(3.0) * s.x / twoSqrtPi; } if (index == 4) { // l = 2, m = -2 return sqrt(15.0) * s.y * s.x / twoSqrtPi; } if (index == 5) { // l = 2, m = -1 return -sqrt(15.0) * s.y * s.z / twoSqrtPi; } if (index == 6) { // l = 2, m = 0 return sqrt(5.0) * (3.0 * s.z * s.z - 1.0) / 2.0 / twoSqrtPi; } if (index == 7) { // l = 2, m = 1 return -sqrt(15.0) * s.x * s.z / twoSqrtPi; } if (index == 8) { // l = 2, m = 2 return sqrt(15.0) * (s.x * s.x - s.y * s.y) / 2.0 / twoSqrtPi; } return 0.0; } float vdcRadicalInverse(int i) { float r; float base = 2.0; float value = 0.0; float invBase = 1.0 / base; float invBi = invBase; for (int x = 0; x < 100; x++) { if (i <= 0) { break; } r = mod(float(i), base); value += r * invBi; invBi *= invBase; i = int(float(i) * invBase); } return value; } vec2 hammersley2D(int i, int N) { return vec2(float(i) / float(N), vdcRadicalInverse(i)); } // Sample count is relatively low for the sake of performance, but should still be enough to capture directionality needed for third-order harmonics const int samples = 256; const float solidAngle = 1.0 / float(samples); void main() { // Get the current coefficient based on the uv vec2 uv = v_textureCoordinates.xy * 3.0; int coefficientIndex = int(floor(uv.y) * 3.0 + floor(uv.x)); for (int i = 0; i < samples; ++i) { vec2 xi = hammersley2D(i, samples); float phi = czm_twoPi * xi.x; float cosTheta = 1.0 - 2.0 * sqrt(1.0 - xi.y * xi.y); float sinTheta = sqrt(1.0 - cosTheta * cosTheta); vec3 direction = normalize(vec3(sinTheta * cos(phi), cosTheta, sinTheta * sin(phi))); // Generate the spherical harmonics basis from the direction float Ylm = computeShBasis(coefficientIndex, direction); vec3 lookupDirection = -direction.xyz; lookupDirection.z = -lookupDirection.z; vec4 color = czm_textureCube(u_radianceMap, lookupDirection, 0.0); // Use the relevant function for this coefficient out_FragColor += Ylm * color * solidAngle * sinTheta; } } `;var Jpn=T(S(),1),bX=`precision highp float; in vec2 v_textureCoordinates; uniform vec3 u_faceDirection; // Current cubemap face uniform vec3 u_positionWC; uniform mat4 u_enuToFixedFrame; uniform vec4 u_brightnessSaturationGammaIntensity; uniform vec4 u_groundColor; // alpha component represent albedo vec4 getCubeMapDirection(vec2 uv, vec3 faceDir) { vec2 scaledUV = uv * 2.0 - 1.0; if (faceDir.x != 0.0) { return vec4(faceDir.x, scaledUV.x * faceDir.x, -scaledUV.y, 0.0); } else if (faceDir.y != 0.0) { return vec4(scaledUV.x, -scaledUV.y * faceDir.y, faceDir.y, 0.0); } else { return vec4(scaledUV.x * faceDir.z, -faceDir.z, -scaledUV.y, 0.0); } } void main() { float height = length(u_positionWC); float atmosphereInnerRadius = u_radiiAndDynamicAtmosphereColor.y; float ellipsoidHeight = max(height - atmosphereInnerRadius, 0.0); // Scale the position to ensure the sky color is present, even when underground. vec3 positionWC = u_positionWC / height * (ellipsoidHeight + atmosphereInnerRadius); float atmosphereOuterRadius = u_radiiAndDynamicAtmosphereColor.x; float atmosphereHeight = atmosphereOuterRadius - atmosphereInnerRadius; vec3 direction = (u_enuToFixedFrame * getCubeMapDirection(v_textureCoordinates, u_faceDirection)).xyz; vec3 normalizedDirection = normalize(direction); czm_ray ray = czm_ray(positionWC, normalizedDirection); czm_raySegment intersection = czm_raySphereIntersectionInterval(ray, vec3(0.0), atmosphereInnerRadius); if (!czm_isEmpty(intersection)) { intersection = czm_rayEllipsoidIntersectionInterval(ray, vec3(0.0), czm_ellipsoidInverseRadii); } bool onEllipsoid = intersection.start >= 0.0; float rayLength = czm_branchFreeTernary(onEllipsoid, intersection.start, atmosphereOuterRadius); // Compute sky color for each position on a sphere at radius centered around the provided position's origin vec3 skyPositionWC = positionWC + normalizedDirection * rayLength; float lightEnum = u_radiiAndDynamicAtmosphereColor.z; vec3 lightDirectionWC = normalize(czm_getDynamicAtmosphereLightDirection(skyPositionWC, lightEnum)); vec3 mieColor; vec3 rayleighColor; float opacity; czm_computeScattering( ray, rayLength, lightDirectionWC, atmosphereInnerRadius, rayleighColor, mieColor, opacity ); vec4 atmopshereColor = czm_computeAtmosphereColor(ray, lightDirectionWC, rayleighColor, mieColor, opacity); #ifdef ATMOSPHERE_COLOR_CORRECT const bool ignoreBlackPixels = true; atmopshereColor.rgb = czm_applyHSBShift(atmopshereColor.rgb, czm_atmosphereHsbShift, ignoreBlackPixels); #endif vec3 lookupDirection = -normalizedDirection; // Flipping the X vector is a cheap way to get the inverse of czm_temeToPseudoFixed, since that's a rotation about Z. lookupDirection.x = -lookupDirection.x; lookupDirection = -normalize(czm_temeToPseudoFixed * lookupDirection); lookupDirection.x = -lookupDirection.x; // Values outside the atmopshere are rendered as black, when they should be treated as transparent float skyAlpha = clamp((1.0 - ellipsoidHeight / atmosphereHeight) * atmopshereColor.a, 0.0, 1.0); skyAlpha = czm_branchFreeTernary(length(atmopshereColor.rgb) <= czm_epsilon7, 0.0, skyAlpha); // Treat black as transparent // Blend starmap with atmopshere scattering float intensity = u_brightnessSaturationGammaIntensity.w; vec4 sceneSkyBoxColor = czm_textureCube(czm_environmentMap, lookupDirection); vec3 skyBackgroundColor = mix(czm_backgroundColor.rgb, sceneSkyBoxColor.rgb, sceneSkyBoxColor.a); vec4 combinedSkyColor = vec4(mix(skyBackgroundColor, atmopshereColor.rgb * intensity, skyAlpha), 1.0); // Compute ground color based on amount of reflected light, then blend it with ground atmosphere based on height vec3 up = normalize(positionWC); float occlusion = max(dot(lightDirectionWC, up), 0.05); vec4 groundColor = vec4(u_groundColor.rgb * u_groundColor.a * (vec3(intensity * occlusion) + atmopshereColor.rgb), 1.0); vec4 blendedGroundColor = mix(groundColor, atmopshereColor, clamp(ellipsoidHeight / atmosphereHeight, 0.0, 1.0)); vec4 color = czm_branchFreeTernary(onEllipsoid, blendedGroundColor, combinedSkyColor); float brightness = u_brightnessSaturationGammaIntensity.x; float saturation = u_brightnessSaturationGammaIntensity.y; float gamma = u_brightnessSaturationGammaIntensity.z; #ifdef ENVIRONMENT_COLOR_CORRECT color.rgb = mix(vec3(0.0), color.rgb, brightness); color.rgb = czm_saturation(color.rgb, saturation); #endif color.rgb = pow(color.rgb, vec3(gamma)); // Normally this would be in the ifdef above, but there is a precision issue with the atmopshere scattering transmittance (alpha). Having this line is a workaround for that issue, even when gamma is 1.0. color.rgb = czm_gammaCorrect(color.rgb); out_FragColor = color; } `;var jpn=T(S(),1),gX=`precision highp float; in vec3 v_textureCoordinates; uniform float u_roughness; uniform samplerCube u_radianceTexture; uniform vec3 u_faceDirection; float vdcRadicalInverse(int i) { float r; float base = 2.0; float value = 0.0; float invBase = 1.0 / base; float invBi = invBase; for (int x = 0; x < 100; x++) { if (i <= 0) { break; } r = mod(float(i), base); value += r * invBi; invBi *= invBase; i = int(float(i) * invBase); } return value; } vec2 hammersley2D(int i, int N) { return vec2(float(i) / float(N), vdcRadicalInverse(i)); } vec3 importanceSampleGGX(vec2 xi, float alphaRoughness, vec3 N) { float alphaRoughnessSquared = alphaRoughness * alphaRoughness; float phi = czm_twoPi * xi.x; float cosTheta = sqrt((1.0 - xi.y) / (1.0 + (alphaRoughnessSquared - 1.0) * xi.y)); float sinTheta = sqrt(1.0 - cosTheta * cosTheta); vec3 H = vec3(sinTheta * cos(phi), sinTheta * sin(phi), cosTheta); vec3 upVector = abs(N.z) < 0.999 ? vec3(0.0, 0.0, 1.0) : vec3(1.0, 0.0, 0.0); vec3 tangentX = normalize(cross(upVector, N)); vec3 tangentY = cross(N, tangentX); return tangentX * H.x + tangentY * H.y + N * H.z; } // Sample count is relatively low for the sake of performance, but should still be enough to prevent artifacting in lower roughnesses const int samples = 128; void main() { vec3 normal = u_faceDirection; vec3 V = normalize(v_textureCoordinates); float roughness = u_roughness; vec4 color = vec4(0.0); float weight = 0.0; for (int i = 0; i < samples; ++i) { vec2 xi = hammersley2D(i, samples); vec3 H = importanceSampleGGX(xi, roughness, V); vec3 L = 2.0 * dot(V, H) * H - V; // reflected vector float NdotL = max(dot(V, L), 0.0); if (NdotL > 0.0) { color += vec4(czm_textureCube(u_radianceTexture, L).rgb, 1.0) * NdotL; weight += NdotL; } } out_FragColor = color / weight; } `;var $pn=T(S(),1),yX=`in vec3 position; out vec3 v_textureCoordinates; uniform vec3 u_faceDirection; vec3 getCubeMapDirection(vec2 uv, vec3 faceDir) { vec2 scaledUV = uv; if (faceDir.x != 0.0) { return vec3(faceDir.x, scaledUV.y, scaledUV.x * faceDir.x); } else if (faceDir.y != 0.0) { return vec3(scaledUV.x, -faceDir.y, -scaledUV.y * faceDir.y); } else { return vec3(scaledUV.x * faceDir.z, scaledUV.y, -faceDir.z); } } void main() { v_textureCoordinates = getCubeMapDirection(position.xy, u_faceDirection); v_textureCoordinates.y = -v_textureCoordinates.y; v_textureCoordinates.z = -v_textureCoordinates.z; gl_Position = vec4(position, 1.0); } `;function ni(e){this._position=void 0,this._radianceMapDirty=!1,this._radianceCommandsDirty=!1,this._convolutionsCommandsDirty=!1,this._irradianceCommandDirty=!1,this._irradianceTextureDirty=!1,this._sphericalHarmonicCoefficientsDirty=!1,this._shouldRegenerateShaders=!1,this._shouldReset=!1,e=y(e,y.EMPTY_OBJECT);let t=Math.min(y(e.mipmapLevels,7),Math.log2(Mt.maximumCubeMapSize));this._mipmapLevels=t,this._radianceMapComputeCommands=new Array(6),this._convolutionComputeCommands=new Array((t-1)*6),this._irradianceComputeCommand=void 0,this._radianceMapFS=void 0,this._irradianceMapFS=void 0,this._convolveSP=void 0,this._va=void 0,this._radianceMapTextures=new Array(6),this._specularMapTextures=new Array((t-1)*6),this._radianceCubeMap=void 0,this._irradianceMapTexture=void 0,this._sphericalHarmonicCoefficients=ni.DEFAULT_SPHERICAL_HARMONIC_COEFFICIENTS.slice(),this._lastTime=new q;let n=Math.pow(2,t-1);this._textureDimensions=new D(n,n),this._radiiAndDynamicAtmosphereColor=new m,this._sceneEnvironmentMap=void 0,this._backgroundColor=void 0,this._owner=void 0,this.enabled=y(e.enabled,!0),this.shouldUpdate=!0,this.maximumSecondsDifference=y(e.maximumSecondsDifference,60*60),this.maximumPositionEpsilon=y(e.maximumPositionEpsilon,1e3),this.atmosphereScatteringIntensity=y(e.atmosphereScatteringIntensity,2),this.gamma=y(e.gamma,1),this.brightness=y(e.brightness,1),this.saturation=y(e.saturation,1),this.groundColor=y(e.groundColor,ni.AVERAGE_EARTH_GROUND_COLOR),this.groundAlbedo=y(e.groundAlbedo,.31)}Object.defineProperties(ni.prototype,{owner:{get:function(){return this._owner}},shouldRegenerateShaders:{get:function(){return this._shouldRegenerateShaders}},position:{get:function(){return this._position},set:function(e){m.equalsEpsilon(e,this._position,0,this.maximumPositionEpsilon)||(this._position=m.clone(e,this._position),this._shouldReset=!0)}},radianceCubeMap:{get:function(){return this._radianceCubeMap}},maximumMipmapLevel:{get:function(){return this._mipmapLevels}},sphericalHarmonicCoefficients:{get:function(){return this._sphericalHarmonicCoefficients}}});ni._maximumComputeCommandCount=8;ni._activeComputeCommandCount=0;ni._nextFrameCommandQueue=[];ni._queueCommand=(e,t)=>{if(ni._activeComputeCommandCount>=ni._maximumComputeCommandCount){ni._nextFrameCommandQueue.push(e);return}t.commandList.push(e),ni._activeComputeCommandCount++};ni._updateCommandQueue=e=>{if(ni._maximumComputeCommandCount=Math.log2(Mt.maximumCubeMapSize),ni._nextFrameCommandQueue.length>0&&ni._activeComputeCommandCounts,u_enuToFixedFrame:()=>c,u_faceDirection:()=>Tr.getDirection(h,Ore),u_positionWC:()=>r,u_brightnessSaturationGammaIntensity:()=>d,u_groundColor:()=>e.groundColor.withAlpha(e.groundAlbedo,WNe)},owner:e});f.postExecute=()=>{if(e.isDestroyed()||f.canceled){ni._activeComputeCommandCount--;return}let x=e._radianceMapComputeCommands;x[g]=void 0;let _=new Ar({context:n,colorTextures:[e._radianceMapTextures[g]]});_._bind(),e._radianceCubeMap[h].copyFromFramebuffer(),_._unBind(),_.destroy(),ni._activeComputeCommandCount--,x.some(l)||(e._convolutionsCommandsDirty=!0,e._shouldRegenerateShaders=!0)},e._radianceMapComputeCommands[u]=f,ni._queueCommand(f,t),u++}e._radianceCommandsDirty=!1}}function vNe(e,t){let n=e._radianceCubeMap;n.generateMipmap();let i=e._mipmapLevels,o=e._textureDimensions,r=o.x/2,s=o.y/2,a=t.context,c=0,d=(h,p,g,f,x)=>()=>{if(e.isDestroyed()||h.canceled){ni._activeComputeCommandCount--;return}let _=e._convolutionComputeCommands;_[p]=void 0,n.copyFace(t,g,f,x),c++,ni._activeComputeCommandCount--,g.destroy(),e._specularMapTextures[p]=void 0;let C=e._specularMapTextures.length;c>=C&&(e._irradianceCommandDirty=!0,n.sampler=new $t({minificationFilter:qt.LINEAR_MIPMAP_LINEAR}),e._shouldRegenerateShaders=!0,e._va.destroy(),e._va=void 0,e._convolveSP.destroy(),e._convolveSP=void 0)},u=0;for(let h=1;hh/(i-1),u_radianceTexture:()=>n!=null?n:a.defaultTexture,u_faceDirection:()=>Tr.getDirection(p,Ore)}});_.postExecute=d(_,u,g,p,h),e._convolutionComputeCommands[u]=_,ni._queueCommand(_,t),++u}r/=2,s/=2}}var Yre=new D(3,3);function wNe(e,t){let n=t.context,i=Yre,o=e._irradianceMapTexture;l(o)&&!o.isDestroyed()&&o.destroy(),o=new Wt({context:n,width:i.x,height:i.y,pixelDatatype:je.FLOAT,pixelFormat:ot.RGBA}),e._irradianceMapTexture=o;let r=e._irradianceMapFS;l(r)||(r=new De({sources:[pX]}),e._irradianceMapFS=r);let s=new $c({fragmentShaderSource:r,outputTexture:o,owner:e,uniformMap:{u_radianceMap:()=>{var a;return(a=e._radianceCubeMap)!=null?a:n.defaultTexture}}});s.postExecute=()=>{if(e.isDestroyed()||s.canceled){ni._activeComputeCommandCount--;return}e._irradianceTextureDirty=!1,e._irradianceComputeCommand=void 0,e._sphericalHarmonicCoefficientsDirty=!0,e._irradianceMapFS=void 0,ni._activeComputeCommandCount--},e._irradianceComputeCommand=s,ni._queueCommand(s,t),e._irradianceTextureDirty=!0}function FNe(e,t){let n=t.context;if(!l(e._irradianceMapTexture))return;let i=new Ar({context:n,colorTextures:[e._irradianceMapTexture],destroyAttachments:!1}),o=Yre,r=n.readPixels({x:0,y:0,width:o.x,height:o.y,framebuffer:i});for(let s=0;s<9;++s)e._sphericalHarmonicCoefficients[s]=m.unpack(r,s*4),m.multiplyByScalar(e._sphericalHarmonicCoefficients[s],e.atmosphereScatteringIntensity,e._sphericalHarmonicCoefficients[s]);i.destroy(),e._irradianceMapTexture.destroy(),e._irradianceMapTexture=void 0,e._shouldRegenerateShaders=!0}ni.prototype.update=function(e){let t=e.mode;if(!ni.isDynamicUpdateSupported(e)||!this.enabled||!this.shouldUpdate||!l(this._position)||t===oe.MORPHING){this._shouldRegenerateShaders=!1;return}ni._updateCommandQueue(e);let i=e.atmosphere.dynamicLighting,o=ENe(this,e)||i===lb.SUNLIGHT&&!q.equalsEpsilon(e.time,this._lastTime,this.maximumSecondsDifference);if(this._shouldReset||o){this.reset(),this._shouldReset=!1,this._lastTime=q.clone(e.time,this._lastTime);return}if(this._radianceMapDirty&&(PNe(this,e),this._radianceMapDirty=!1),this._convolutionsCommandsDirty&&(vNe(this,e),this._convolutionsCommandsDirty=!1),this._irradianceCommandDirty&&(wNe(this,e),this._irradianceCommandDirty=!1),this._irradianceTextureDirty){this._shouldRegenerateShaders=!1;return}if(this._sphericalHarmonicCoefficientsDirty){FNe(this,e),this._sphericalHarmonicCoefficientsDirty=!1;return}this._shouldRegenerateShaders=!1};ni.prototype.isDestroyed=function(){return!1};ni.prototype.destroy=function(){let e=this._radianceMapComputeCommands.length;for(let t=0;t4?(Ct(`Property texture property ${e.id} is an array of length ${e.arrayLength}, but may have at most a length of 4`),!1):t!==ut.SCALAR?(Ct(`Property texture property ${e.id} is an array of type ${t}, but only SCALAR is supported`),!1):n!==At.UINT8?(Ct(`Property texture property ${e.id} is an array with component type ${n}, but only UINT8 is supported`),!1):!0:ut.isVectorType(t)||t===ut.SCALAR?n!==At.UINT8?(Ct(`Property texture property ${e.id} has component type ${n}, but only UINT8 is supported`),!1):!0:(Ct(`Property texture property ${e.id} has an unsupported type`),!1)};var NNe=[void 0,"float","vec2","vec3","vec4"],kNe=[void 0,"int","ivec2","ivec3","ivec4"];TX.prototype.getGlslType=function(){let e=this._classProperty,t=ut.getComponentCount(e.type);return e.isArray&&(t=e.arrayLength),e.normalized?NNe[t]:kNe[t]};TX.prototype.unpackInShader=function(e){return this._classProperty.normalized?e:`${this.getGlslType()}(255.0 * ${e})`};function UNe(e){return e.map(function(t){return"rgba".charAt(t)}).join("")}var SX=TX;function oz(e){e=y(e,y.EMPTY_OBJECT);let t=e.propertyTexture,n=e.class,i=e.textures,o=t.extensions,r=t.extras,s={};if(l(t.properties))for(let a in t.properties)t.properties.hasOwnProperty(a)&&(s[a]=new SX({property:t.properties[a],classProperty:n.properties[a],textures:i}));this._name=e.name,this._id=e.id,this._class=n,this._properties=s,this._extras=r,this._extensions=o}Object.defineProperties(oz.prototype,{name:{get:function(){return this._name}},id:{get:function(){return this._id}},class:{get:function(){return this._class}},properties:{get:function(){return this._properties}},extras:{get:function(){return this._extras}},extensions:{get:function(){return this._extensions}}});oz.prototype.getProperty=function(e){return this._properties[e]};var mb=oz;var p0n=T(S(),1);var d0n=T(S(),1);function zre(e){e=y(e,y.EMPTY_OBJECT);let t=e.property,n=e.classProperty;this._attribute=t.attribute,this._classProperty=n,this._min=t.min,this._max=t.max;let i=t.offset,o=t.scale,r=n.hasValueTransform||l(i)||l(o);i=y(i,n.offset),o=y(o,n.scale),i=n.unpackVectorAndMatrixTypes(i),o=n.unpackVectorAndMatrixTypes(o),this._offset=i,this._scale=o,this._hasValueTransform=r,this._extras=t.extras,this._extensions=t.extensions}Object.defineProperties(zre.prototype,{attribute:{get:function(){return this._attribute}},hasValueTransform:{get:function(){return this._hasValueTransform}},offset:{get:function(){return this._offset}},scale:{get:function(){return this._scale}},classProperty:{get:function(){return this._classProperty}},extras:{get:function(){return this._extras}},extensions:{get:function(){return this._extensions}}});var CX=zre;function rz(e){e=y(e,y.EMPTY_OBJECT);let t=e.propertyAttribute,n=e.class,i={};if(l(t.properties))for(let o in t.properties)t.properties.hasOwnProperty(o)&&(i[o]=new CX({property:t.properties[o],classProperty:n.properties[o]}));this._name=e.name,this._id=e.id,this._class=n,this._properties=i,this._extras=t.extras,this._extensions=t.extensions}Object.defineProperties(rz.prototype,{name:{get:function(){return this._name}},id:{get:function(){return this._id}},class:{get:function(){return this._class}},properties:{get:function(){return this._properties}},extras:{get:function(){return this._extras}},extensions:{get:function(){return this._extensions}}});rz.prototype.getProperty=function(e){return this._properties[e]};var Z_=rz;var x0n=T(S(),1);function VX(e){e=y(e,y.EMPTY_OBJECT),this._schema=e.schema;let t=e.propertyTables;this._propertyTableCount=l(t)?t.length:0,this._propertyTables=t,this._propertyTextures=e.propertyTextures,this._propertyAttributes=e.propertyAttributes,this._statistics=e.statistics,this._extras=e.extras,this._extensions=e.extensions}Object.defineProperties(VX.prototype,{schema:{get:function(){return this._schema}},statistics:{get:function(){return this._statistics}},extras:{get:function(){return this._extras}},extensions:{get:function(){return this._extensions}},propertyTableCount:{get:function(){return this._propertyTableCount}},propertyTables:{get:function(){return this._propertyTables}},propertyTextures:{get:function(){return this._propertyTextures}},propertyAttributes:{get:function(){return this._propertyAttributes}},propertyTablesByteLength:{get:function(){if(!l(this._propertyTables))return 0;let e=0,t=this._propertyTables.length;for(let n=0;n=r;)C=o[C-r];o.push(C),s[x]=_}_>r5e&&(t instanceof Uint16Array||t instanceof Uint8Array)?t=new Uint32Array(t):_>s5e&&t instanceof Uint8Array&&(t=new Uint16Array(t)),x===c?(c=_,t[a]=_):x===d?(d=_,t[a+1]=_):(u=_,t[a+2]=_),x=Jre(i,c,d,u,p,g,f)}}e._triangleIndices=t,e._outlineCoordinatesTypedArray=new Float32Array(i)}function Jre(e,t,n,i,o,r,s){let a=s?1:0,c=o?1:0,d=0,u=sz(e,t,a,c,d);if(u===0)return t;let h=0,p=o?1:0,g=r?1:0,f=sz(e,n,h,p,g);if(f===0)return n;let x=s?1:0,_=0,C=r?1:0,V=sz(e,i,x,_,C);if(V===0)return i;let L=u&f&V,R,G,I;if(L&1)R=0,G=1,I=2;else if(L&2)R=0,I=1,G=2;else if(L&4)G=0,R=1,I=2;else if(L&8)G=0,I=1,R=2;else if(L&16)I=0,R=1,G=2;else if(L&32)I=0,G=1,R=2;else{let A=az(u),b=az(f),Z=az(V);return A>1&1)+(e>>2&1)+(e>>3&1)+(e>>4&1)+(e>>5&1)}ek.prototype.updateAttribute=function(e){let t=this._extraVertices,n=e.length,i=n/this._originalVertexCount,o=t.length,r=e.constructor,s=new r(e.length+o*i);s.set(e);for(let a=0;a1;)i>>=1,r.push(Qre(i));let s=new Wt({context:e,source:{arrayBufferView:o,mipLevels:r},width:n,height:1,pixelFormat:ot.LUMINANCE,sampler:new $t({wrapS:Vn.CLAMP_TO_EDGE,wrapT:Vn.CLAMP_TO_EDGE,minificationFilter:qt.LINEAR_MIPMAP_LINEAR,magnificationFilter:pi.LINEAR})});return t.outlineTexture=s,s};function Qre(e){let t=new Uint8Array(e);return t[e-1]=192,e===8?t[e-1]=96:e===4?t[e-1]=48:e===2?t[e-1]=24:e===1&&(t[e-1]=12),t}function jre(e,t){this._originalVertexCount=t,this._edges=new Set;for(let n=0;n{this._resourcesLoaded=!0}).catch(o=>{this._processError=o})),l(this._processError)){this._state=Fo.FAILED;let o=this._processError;this._processError=void 0,nk(this,o)}let t=this._textureErrors.pop();if(l(t)){let o=this.getError("Failed to load glTF texture",t);throw o.name="TextureError",o}if(this._state===Fo.FAILED)return!1;let n=!1;try{n=this._process(e)}catch(o){this._state=Fo.FAILED,nk(this,o)}let i=!1;try{i=this._processTextures(e)}catch(o){this._textureState=Fo.FAILED,nk(this,o)}return this._incrementallyLoadTextures?n:n&&i};function H5e(e,t,n,i,o,r,s,a){let c=e.gltfJson,u=c.accessors[t].bufferView;return Li.getVertexBufferLoader({gltf:c,gltfResource:e._gltfResource,baseResource:e._baseResource,frameState:a,bufferViewId:u,primitive:i,draco:o,attributeSemantic:n,accessorId:t,asynchronous:e._asynchronous,loadBuffer:r,loadTypedArray:s})}function z5e(e,t,n,i,o,r,s){return Li.getIndexBufferLoader({gltf:e.gltfJson,accessorId:t,gltfResource:e._gltfResource,baseResource:e._baseResource,frameState:s,primitive:n,draco:i,asynchronous:e._asynchronous,loadBuffer:o,loadTypedArray:r})}function K5e(e,t){let n=Li.getBufferViewLoader({gltf:e.gltfJson,bufferViewId:t,gltfResource:e._gltfResource,baseResource:e._baseResource});return e._bufferViewLoaders.push(n),n}function use(e,t,n){let i=t.byteOffset,o=wl(e,t),r=t.count,s=Sd(t.type),a=t.componentType,c=Q.getSizeInBytes(a),d=c*s,u=r*s;if(o===d)return n=new Uint8Array(n),Q.createArrayBufferView(a,n.buffer,n.byteOffset+i,u);let h=Q.createTypedArray(a,u),p=new DataView(n.buffer),g=new Array(s),f=sb(t.componentType);i=n.byteOffset+i;for(let x=0;x{l(o)&&l(o.attributes)&&l(o.attributes[h])?ske(_,C,r,s):ake(c,d,_,C,r,s)},_}function fse(e,t,n,i,o,r,s,a){let c=n.modelSemantic,d=c===gt.POSITION,u=c===gt.FEATURE_ID,h=d&&!r&&e._loadAttributesFor2D&&!a.scene3DOnly,p=d&&e._enablePick&&!a.context.webgl2,g=e._loadForClassification&&u,f=e._loadAttributesAsTypedArray,x=!f,_=f||h||p||g,L=hse(e,t,n,i,o,s?!1:x,s?!0:_,a),R=new E_.AttributeLoadPlan(L);return R.loadBuffer=x,R.loadTypedArray=_,R}function cke(e,t,n,i,o){let r=e.gltfJson.accessors,s=l(n.ROTATION),a=l(n.TRANSLATION)&&l(r[n.TRANSLATION].min)&&l(r[n.TRANSLATION].max),c=dz(e,is,i),d=c.modelSemantic,u=d===is.TRANSLATION||d===is.ROTATION||d===is.SCALE,h=d===is.TRANSLATION,p=e._loadAttributesAsTypedArray||s&&u||!o.context.instancedArrays,g=e._enablePick&&!o.context.webgl2,f=!p,x=e._loadAttributesFor2D&&!o.scene3DOnly;return hse(e,t,c,void 0,void 0,f,p||h&&(!a||x||g),o)}function lke(e,t,n,i,o,r,s){let a=e.gltfJson.accessors[t],c=a.bufferView;if(!l(i)&&!l(c))return;let d=new T5e;d.count=a.count;let u=e._loadAttributesAsTypedArray,h=(e._loadIndicesForWireframe||e._enablePick)&&!s.context.webgl2,p=e._loadForClassification&&o,f=!u,x=u||h||p,V=z5e(e,t,n,i,r?!1:f,r?!0:x,s),L=e._geometryLoaders.length;e._geometryLoaders.push(V);let R=V.load();e._loaderPromises.push(R),e._geometryCallbacks[L]=()=>{d.indexDatatype=V.indexDatatype,d.buffer=V.buffer,d.typedArray=V.typedArray};let G=new E_.IndicesLoadPlan(d);return G.loadBuffer=f,G.loadTypedArray=x,G}function tl(e,t,n,i){let o=e.gltfJson,r=Fl.getImageIdFromTexture({gltf:o,textureId:t.index,supportedImageFormats:e._supportedImageFormats});if(!l(r))return;let s=Li.getTextureLoader({gltf:o,textureInfo:t,gltfResource:e._gltfResource,baseResource:e._baseResource,supportedImageFormats:e._supportedImageFormats,frameState:n,asynchronous:e._asynchronous}),a=Fl.createModelTextureReader({textureInfo:t}),c=e._textureLoaders.length;e._textureLoaders.push(s);let d=s.load().catch(u=>{if(!e.isDestroyed()){if(!e._incrementallyLoadTextures)throw u;e._textureState=Fo.FAILED,e._textureErrors.push(u)}});return e._texturesPromises.push(d),e._textureCallbacks[c]=()=>{a.texture=s.texture,l(i)&&(a.texture.sampler=i)},a}function dke(e,t,n){let{diffuseTexture:i,specularGlossinessTexture:o,diffuseFactor:r,specularFactor:s,glossinessFactor:a}=t,c=new M5e;return l(i)&&(c.diffuseTexture=tl(e,i,n)),l(o)&&(c.specularGlossinessTexture=tl(e,o,n)),c.diffuseFactor=Vd(re,r),c.specularFactor=Vd(m,s),c.glossinessFactor=a,c}function uke(e,t,n){let{baseColorTexture:i,metallicRoughnessTexture:o,baseColorFactor:r,metallicFactor:s,roughnessFactor:a}=t,c=new A5e;return l(i)&&(c.baseColorTexture=tl(e,i,n)),l(o)&&(c.metallicRoughnessTexture=tl(e,o,n)),c.baseColorFactor=Vd(re,r),c.metallicFactor=s,c.roughnessFactor=a,c}function mke(e,t,n){let{specularFactor:i,specularTexture:o,specularColorFactor:r,specularColorTexture:s}=t,a=new N5e;return l(o)&&(a.specularTexture=tl(e,o,n)),l(s)&&(a.specularColorTexture=tl(e,s,n)),a.specularFactor=i,a.specularColorFactor=Vd(m,r),a}function hke(e,t,n){let{anisotropyStrength:i=cz.DEFAULT_ANISOTROPY_STRENGTH,anisotropyRotation:o=cz.DEFAULT_ANISOTROPY_ROTATION,anisotropyTexture:r}=t,s=new cz;return l(r)&&(s.anisotropyTexture=tl(e,r,n)),s.anisotropyStrength=i,s.anisotropyRotation=o,s}function fke(e,t,n){let{clearcoatFactor:i=lz.DEFAULT_CLEARCOAT_FACTOR,clearcoatTexture:o,clearcoatRoughnessFactor:r=lz.DEFAULT_CLEARCOAT_ROUGHNESS_FACTOR,clearcoatRoughnessTexture:s,clearcoatNormalTexture:a}=t,c=new lz;return l(o)&&(c.clearcoatTexture=tl(e,o,n)),l(s)&&(c.clearcoatRoughnessTexture=tl(e,s,n)),l(a)&&(c.clearcoatNormalTexture=tl(e,a,n)),c.clearcoatFactor=i,c.clearcoatRoughnessFactor=r,c}function pke(e,t,n){let i=new k5e,o=y(t.extensions,y.EMPTY_OBJECT),r=o.KHR_materials_pbrSpecularGlossiness,s=o.KHR_materials_specular,a=o.KHR_materials_anisotropy,c=o.KHR_materials_clearcoat,d=t.pbrMetallicRoughness;return i.unlit=l(o.KHR_materials_unlit),l(r)?i.specularGlossiness=dke(e,r,n):(l(d)&&(i.metallicRoughness=uke(e,d,n)),l(s)&&!i.unlit&&(i.specular=mke(e,s,n)),l(a)&&!i.unlit&&(i.anisotropy=hke(e,a,n)),l(c)&&!i.unlit&&(i.clearcoat=fke(e,c,n))),l(t.emissiveTexture)&&(i.emissiveTexture=tl(e,t.emissiveTexture,n)),l(t.normalTexture)&&!e._loadForClassification&&(i.normalTexture=tl(e,t.normalTexture,n)),l(t.occlusionTexture)&&(i.occlusionTexture=tl(e,t.occlusionTexture,n)),i.emissiveFactor=Vd(m,t.emissiveFactor),i.alphaMode=t.alphaMode,i.alphaCutoff=t.alphaCutoff,i.doubleSided=t.doubleSided,i}function pse(e,t){let n=new cse;return n.featureCount=e.featureCount,n.nullFeatureId=e.nullFeatureId,n.propertyTableId=e.propertyTable,n.setIndex=e.attribute,n.label=e.label,n.positionalLabel=t,n}function bse(e,t,n,i){let o=new cse,r=e.featureIds;return o.featureCount=n,o.propertyTableId=t,o.setIndex=mse(r.attribute),o.positionalLabel=i,o}function gse(e,t){let n=new dse;return n.propertyTableId=e.propertyTable,n.featureCount=e.featureCount,n.nullFeatureId=e.nullFeatureId,n.label=e.label,n.positionalLabel=t,n.offset=0,n.repeat=1,n}function yse(e,t,n,i){let o=new dse,r=e.featureIds;o.propertyTableId=t,o.featureCount=n,o.offset=y(r.constant,0);let s=y(r.divisor,0);return o.repeat=s===0?void 0:s,o.positionalLabel=i,o}function bke(e,t,n,i){let o=new lse;o.featureCount=t.featureCount,o.nullFeatureId=t.nullFeatureId,o.propertyTableId=t.propertyTable,o.label=t.label,o.positionalLabel=i;let r=t.texture;o.textureReader=tl(e,r,n,$t.NEAREST);let a=(l(r.channels)?r.channels:[0]).map(function(c){return"rgba".charAt(c)}).join("");return o.textureReader.channels=a,o}function gke(e,t,n,i,o,r){let s=new lse,a=t.featureIds,c=a.texture;return s.featureCount=o,s.propertyTableId=n,s.textureReader=tl(e,c,i,$t.NEAREST),s.textureReader.channels=a.channels,s.positionalLabel=r,s}function yke(e,t,n,i,o){let r=new S5e,s=void 0,a=void 0,c=!1;for(let d in t){if(!t.hasOwnProperty(d))continue;let u=t[d],h=dz(e,gt,d),p=fse(e,u,h,s,a,c,n,o);r.attributes.push(p.attribute),i.attributePlans.push(p)}return r}function xke(e,t,n,i){let o=new C5e,r=new E_(o);e._primitiveLoadPlans.push(r);let s=t.material;l(s)&&(o.material=pke(e,e.gltfJson.materials[s],i));let a=y(t.extensions,y.EMPTY_OBJECT),c=!1,d=a.CESIUM_primitive_outline;e._loadPrimitiveOutline&&l(d)&&(c=!0,r.needsOutlines=!0,r.outlineIndices=_ke(e,d,r));let u=e._loadForClassification,h=a.KHR_draco_mesh_compression,p=!1,g=t.attributes;if(l(g))for(let G in g){if(!g.hasOwnProperty(G))continue;let I=g[G],v=dz(e,gt,G),P=v.modelSemantic;if(u&&!rke(P))continue;P===gt.FEATURE_ID&&(p=!0);let w=fse(e,I,v,t,h,n,c,i);r.attributePlans.push(w),o.attributes.push(w.attribute)}let f=t.targets;if(l(f)&&!u)for(let G=0;Gn[s]);let r=t.inverseBindMatrices;if(l(r)){let s=e.gltfJson.accessors[r];i.inverseBindMatrices=ik(e,s)}else i.inverseBindMatrices=new Array(o.length).fill(M.IDENTITY);return i}function Xke(e,t){let n=e.gltfJson.skins;if(e._loadForClassification||!l(n))return[];let i=n.map(function(r,s){let a=Ike(e,r,t);return a.index=s,a}),o=e.gltfJson.nodes;for(let r=0;r0&&(i|=n.COLOR_BUFFER_BIT),l(this._colorFramebuffer.depthStencilTexture)&&(i|=n.DEPTH_BUFFER_BIT|(t?n.STENCIL_BUFFER_BIT:0)),n.blitFramebuffer(0,0,this._width,this._height,0,0,this._width,this._height,i,n.NEAREST),n.bindFramebuffer(n.READ_FRAMEBUFFER,null),n.bindFramebuffer(n.DRAW_FRAMEBUFFER,null)};e1.prototype.isDestroyed=function(){return!1};e1.prototype.destroy=function(){return this._renderFramebuffer.destroy(),this._colorFramebuffer.destroy(),me(this)};var MX=e1;var oxn=T(S(),1);var jyn=T(S(),1);var Nl={RGBA4:ie.RGBA4,RGBA8:ie.RGBA8,RGBA16F:ie.RGBA16F,RGBA32F:ie.RGBA32F,RGB5_A1:ie.RGB5_A1,RGB565:ie.RGB565,DEPTH_COMPONENT16:ie.DEPTH_COMPONENT16,STENCIL_INDEX8:ie.STENCIL_INDEX8,DEPTH_STENCIL:ie.DEPTH_STENCIL,DEPTH24_STENCIL8:ie.DEPTH24_STENCIL8,validate:function(e){return e===Nl.RGBA4||e===Nl.RGBA8||e===Nl.RGBA16F||e===Nl.RGBA32F||e===Nl.RGB5_A1||e===Nl.RGB565||e===Nl.DEPTH_COMPONENT16||e===Nl.STENCIL_INDEX8||e===Nl.DEPTH_STENCIL||e===Nl.DEPTH24_STENCIL8},getColorFormat:function(e){return e===ie.FLOAT?Nl.RGBA32F:e===ie.HALF_FLOAT_OES?Nl.RGBA16F:Nl.RGBA8}},nl=Object.freeze(Nl);function NX(e){e=y(e,y.EMPTY_OBJECT);let n=e.context._gl,i=Mt.maximumRenderbufferSize,o=y(e.format,nl.RGBA4),r=l(e.width)?e.width:n.drawingBufferWidth,s=l(e.height)?e.height:n.drawingBufferHeight,a=y(e.numSamples,1);this._gl=n,this._format=o,this._width=r,this._height=s,this._renderbuffer=this._gl.createRenderbuffer(),n.bindRenderbuffer(n.RENDERBUFFER,this._renderbuffer),a>1?n.renderbufferStorageMultisample(n.RENDERBUFFER,a,o,r,s):n.renderbufferStorage(n.RENDERBUFFER,o,r,s),n.bindRenderbuffer(n.RENDERBUFFER,null)}Object.defineProperties(NX.prototype,{format:{get:function(){return this._format}},width:{get:function(){return this._width}},height:{get:function(){return this._height}}});NX.prototype._getRenderbuffer=function(){return this._renderbuffer};NX.prototype.isDestroyed=function(){return!1};NX.prototype.destroy=function(){return this._gl.deleteRenderbuffer(this._renderbuffer),me(this)};var Ld=NX;function Gs(e){e=y(e,y.EMPTY_OBJECT),this._numSamples=y(e.numSamples,1),this._colorAttachmentsLength=y(e.colorAttachmentsLength,1),this._color=y(e.color,!0),this._depth=y(e.depth,!1),this._depthStencil=y(e.depthStencil,!1),this._supportsDepthTexture=y(e.supportsDepthTexture,!1),this._createColorAttachments=y(e.createColorAttachments,!0),this._createDepthAttachments=y(e.createDepthAttachments,!0),this._pixelDatatype=e.pixelDatatype,this._pixelFormat=e.pixelFormat,this._width=void 0,this._height=void 0,this._framebuffer=void 0,this._multisampleFramebuffer=void 0,this._colorTextures=void 0,this._color&&(this._colorTextures=new Array(this._colorAttachmentsLength),this._colorRenderbuffers=new Array(this._colorAttachmentsLength)),this._colorRenderbuffer=void 0,this._depthStencilRenderbuffer=void 0,this._depthStencilTexture=void 0,this._depthRenderbuffer=void 0,this._depthTexture=void 0,this._attachmentsDirty=!1}Object.defineProperties(Gs.prototype,{framebuffer:{get:function(){return this._numSamples>1?this._multisampleFramebuffer.getRenderFramebuffer():this._framebuffer}},numSamples:{get:function(){return this._numSamples}},status:{get:function(){return this.framebuffer.status}}});Gs.prototype.isDirty=function(e,t,n,i,o){n=y(n,1);let r=this._width!==e||this._height!==t,s=this._numSamples!==n,a=l(i)&&this._pixelDatatype!==i||l(o)&&this._pixelFormat!==o,c=n===1?l(this._framebuffer):l(this._multisampleFramebuffer);return this._attachmentsDirty||r||s||a||!c||this._color&&!l(this._colorTextures[0])};Gs.prototype.update=function(e,t,n,i,o,r){if(i=e.msaa?y(i,1):1,o=y(o,this._color?y(this._pixelDatatype,je.UNSIGNED_BYTE):void 0),r=y(r,this._color?y(this._pixelFormat,ot.RGBA):void 0),this.isDirty(t,n,i,o,r)){if(this.destroy(),this._width=t,this._height=n,this._numSamples=i,this._pixelDatatype=o,this._pixelFormat=r,this._attachmentsDirty=!1,this._color&&this._createColorAttachments){for(let s=0;s1){let a=nl.getColorFormat(o);this._colorRenderbuffers[s]=new Ld({context:e,width:t,height:n,format:a,numSamples:this._numSamples})}}this._depthStencil&&this._createDepthAttachments&&(this._supportsDepthTexture&&e.depthTexture?(this._depthStencilTexture=new Wt({context:e,width:t,height:n,pixelFormat:ot.DEPTH_STENCIL,pixelDatatype:je.UNSIGNED_INT_24_8,sampler:$t.NEAREST}),this._numSamples>1&&(this._depthStencilRenderbuffer=new Ld({context:e,width:t,height:n,format:nl.DEPTH24_STENCIL8,numSamples:this._numSamples}))):this._depthStencilRenderbuffer=new Ld({context:e,width:t,height:n,format:nl.DEPTH_STENCIL})),this._depth&&this._createDepthAttachments&&(this._supportsDepthTexture&&e.depthTexture?this._depthTexture=new Wt({context:e,width:t,height:n,pixelFormat:ot.DEPTH_COMPONENT,pixelDatatype:je.UNSIGNED_INT,sampler:$t.NEAREST}):this._depthRenderbuffer=new Ld({context:e,width:t,height:n,format:nl.DEPTH_COMPONENT16})),this._numSamples>1?this._multisampleFramebuffer=new MX({context:e,width:this._width,height:this._height,colorTextures:this._colorTextures,colorRenderbuffers:this._colorRenderbuffers,depthStencilTexture:this._depthStencilTexture,depthStencilRenderbuffer:this._depthStencilRenderbuffer,destroyAttachments:!1}):this._framebuffer=new Ar({context:e,colorTextures:this._colorTextures,depthTexture:this._depthTexture,depthRenderbuffer:this._depthRenderbuffer,depthStencilTexture:this._depthStencilTexture,depthStencilRenderbuffer:this._depthStencilRenderbuffer,destroyAttachments:!1})}};Gs.prototype.getColorTexture=function(e){return e=y(e,0),this._colorTextures[e]};Gs.prototype.setColorTexture=function(e,t){t=y(t,0),this._attachmentsDirty=e!==this._colorTextures[t],this._colorTextures[t]=e};Gs.prototype.getColorRenderbuffer=function(e){return e=y(e,0),this._colorRenderbuffers[e]};Gs.prototype.setColorRenderbuffer=function(e,t){t=y(t,0),this._attachmentsDirty=e!==this._colorRenderbuffers[t],this._colorRenderbuffers[t]=e};Gs.prototype.getDepthRenderbuffer=function(){return this._depthRenderbuffer};Gs.prototype.setDepthRenderbuffer=function(e){this._attachmentsDirty=e!==this._depthRenderbuffer,this._depthRenderbuffer=e};Gs.prototype.getDepthTexture=function(){return this._depthTexture};Gs.prototype.setDepthTexture=function(e){this._attachmentsDirty=e!==this._depthTexture,this._depthTexture=e};Gs.prototype.getDepthStencilRenderbuffer=function(){return this._depthStencilRenderbuffer};Gs.prototype.setDepthStencilRenderbuffer=function(e){this._attachmentsDirty=e!==this._depthStencilRenderbuffer,this._depthStencilRenderbuffer=e};Gs.prototype.getDepthStencilTexture=function(){return this._depthStencilTexture};Gs.prototype.setDepthStencilTexture=function(e){this._attachmentsDirty=e!==this._depthStencilTexture,this._depthStencilTexture=e};Gs.prototype.prepareTextures=function(e,t){this._numSamples>1&&this._multisampleFramebuffer.blitFramebuffers(e,t)};Gs.prototype.clear=function(e,t,n){let i=t.framebuffer;t.framebuffer=this.framebuffer,t.execute(e,n),t.framebuffer=i};Gs.prototype.destroyFramebuffer=function(){this._framebuffer=this._framebuffer&&this._framebuffer.destroy(),this._multisampleFramebuffer=this._multisampleFramebuffer&&this._multisampleFramebuffer.destroy()};Gs.prototype.destroy=function(){if(this._color){let e=this._colorTextures,t=this._colorRenderbuffers;for(let n=0;n=s.clientWidth)d=!0;else{if(L.x>s.clientWidth*.5){a.width=L.x,c.frustum.right=p.x-C,gc=UX(r,n,c,gc),Ua.clipToGLWindowCoordinates(a,gc,mz),a.x+=L.x,c.position.x=-c.position.x;let R=c.frustum.right;c.frustum.right=-c.frustum.left,c.frustum.left=-R,gc=UX(r,n,c,gc),Ua.clipToGLWindowCoordinates(a,gc,hz)}else{a.x+=L.x,a.width-=L.x,c.frustum.left=-p.x-C,gc=UX(r,n,c,gc),Ua.clipToGLWindowCoordinates(a,gc,mz),a.x=a.x-a.width,c.position.x=-c.position.x;let R=c.frustum.left;c.frustum.left=-c.frustum.right,c.frustum.right=-R,gc=UX(r,n,c,gc),Ua.clipToGLWindowCoordinates(a,gc,hz)}m.clone(g,c.position),c.frustum=f.clone(),i=D.clone(mz,i),(i.x<0||i.x>s.clientWidth)&&(i.x=hz.x)}}if(o.mode!==oe.SCENE2D||d){if(gc=UX(r,n,c,gc),gc.z<0&&!(c.frustum instanceof ln)&&!(c.frustum instanceof Mr))return;i=Ua.clipToGLWindowCoordinates(a,gc,i)}return i.y=s.clientHeight-i.y,i};Ua.worldToDrawingBufferCoordinates=function(e,t,n){if(n=Ua.worldToWindowCoordinates(e,t,n),!!l(n))return Ua.transformWindowToDrawingBuffer(e,n,n)};var fb=new m,sUe=new he;Ua.computeActualEllipsoidPosition=function(e,t,n){let i=e.mode;if(i===oe.SCENE3D)return m.clone(t,n);let o=e.mapProjection,r=o.ellipsoid.cartesianToCartographic(t,sUe);if(!l(r))return;if(o.project(r,fb),i===oe.COLUMBUS_VIEW)return m.fromElements(fb.z,fb.x,fb.y,n);if(i===oe.SCENE2D)return m.fromElements(0,fb.x,fb.y,n);let s=e.morphTime;return m.fromElements(W.lerp(fb.z,t.x,s),W.lerp(fb.x,t.y,s),W.lerp(fb.y,t.z,s),n)};var Vse=new m,Lse=new m,Rse=new M;Ua.clipToGLWindowCoordinates=function(e,t,n){return m.divideByScalar(t,t.w,Vse),M.computeViewportTransformation(e,0,1,Rse),M.multiplyByPoint(Rse,Vse,Lse),D.fromCartesian3(Lse,n)};Ua.transformWindowToDrawingBuffer=function(e,t,n){let i=e.canvas,o=e.drawingBufferWidth/i.clientWidth,r=e.drawingBufferHeight/i.clientHeight;return D.fromElements(t.x*o,t.y*r,n)};var aUe=new re,Zse=new re;Ua.drawingBufferToWorldCoordinates=function(e,t,n,i){let r=e.context.uniformState,s=r.currentFrustum,a=s.x,c=s.y;if(e.frameState.useLogDepth){let g=n*r.log2FarDepthFromNearPlusOne,f=Math.pow(2,g)-1;n=c*(1-a/(f+a))/(c-a)}let d=e.view.passState.viewport,u=re.clone(re.UNIT_W,aUe);u.x=(t.x-d.x)/d.width*2-1,u.y=(t.y-d.y)/d.height*2-1,u.z=n*2-1,u.w=1;let h,p=e.camera.frustum;if(l(p.fovy)){h=M.multiplyByVector(r.inverseViewProjection,u,Zse);let g=1/h.w;m.multiplyByScalar(h,g,h)}else{let g=p.offCenterFrustum;l(g)&&(p=g),h=Zse,h.x=(u.x*(p.right-p.left)+p.left+p.right)*.5,h.y=(u.y*(p.top-p.bottom)+p.bottom+p.top)*.5,h.z=(u.z*(a-c)-a-c)*.5,h.w=1,h=M.multiplyByVector(r.inverseView,h,h)}return m.fromCartesian4(h,i)};var Bi=Ua;var z_n=T(S(),1);var o_n=T(S(),1);var n1={};n1._deprecationWarning=Ma;var pb=Uint32Array.BYTES_PER_ELEMENT;n1.parse=function(e,t){let n=y(t,0);t=n;let i=new Uint8Array(e),o=new DataView(e);t+=pb;let r=o.getUint32(t,!0);if(r!==1)throw new ce(`Only Batched 3D Model version 1 is supported. Version ${r} is not.`);t+=pb;let s=o.getUint32(t,!0);t+=pb;let a=o.getUint32(t,!0);t+=pb;let c=o.getUint32(t,!0);t+=pb;let d=o.getUint32(t,!0);t+=pb;let u=o.getUint32(t,!0);t+=pb;let h;d>=570425344?(t-=pb*2,h=a,d=c,u=0,a=0,c=0,n1._deprecationWarning("b3dm-legacy-header","This b3dm header is using the legacy format [batchLength] [batchTableByteLength]. The new format is [featureTableJsonByteLength] [featureTableBinaryByteLength] [batchTableJsonByteLength] [batchTableBinaryByteLength] from https://github.com/CesiumGS/3d-tiles/tree/main/specification/TileFormats/Batched3DModel.")):u>=570425344&&(t-=pb,h=d,d=a,u=c,a=0,c=0,n1._deprecationWarning("b3dm-legacy-header","This b3dm header is using the legacy format [batchTableJsonByteLength] [batchTableBinaryByteLength] [batchLength]. The new format is [featureTableJsonByteLength] [featureTableBinaryByteLength] [batchTableJsonByteLength] [batchTableBinaryByteLength] from https://github.com/CesiumGS/3d-tiles/tree/main/specification/TileFormats/Batched3DModel."));let p;a===0?p={BATCH_LENGTH:y(h,0)}:(p=nr(i,t,a),t+=a);let g=new Uint8Array(e,t,c);t+=c;let f,x;d>0&&(f=nr(i,t,d),t+=d,u>0&&(x=new Uint8Array(e,t,u),x=new Uint8Array(x),t+=u));let _=n+s-t;if(_===0)throw new ce("glTF byte length must be greater than 0.");let C;return t%4===0?C=new Uint8Array(e,t,_):(n1._deprecationWarning("b3dm-glb-unaligned","The embedded glb is not aligned to a 4-byte boundary."),C=new Uint8Array(i.subarray(t,t+_))),{batchLength:h,featureTableJson:p,featureTableBinary:g,batchTableJson:f,batchTableBinary:x,gltf:C}};var DX=n1;var l_n=T(S(),1);function BX(e,t){this.json=e,this.buffer=t,this._cachedTypedArrays={},this.featuresLength=0}function Gse(e,t,n,i,o,r){let s=e._cachedTypedArrays,a=s[t];return l(a)||(a=Q.createArrayBufferView(n,e.buffer.buffer,e.buffer.byteOffset+r,o*i),s[t]=a),a}function cUe(e,t,n,i){let o=e._cachedTypedArrays,r=o[t];return l(r)||(r=Q.createTypedArray(n,i),o[t]=r),r}BX.prototype.getGlobalProperty=function(e,t,n){let i=this.json[e];if(l(i))return l(i.byteOffset)?(t=y(t,Q.UNSIGNED_INT),n=y(n,1),Gse(this,e,t,n,1,i.byteOffset)):i};BX.prototype.hasProperty=function(e){return l(this.json[e])};BX.prototype.getPropertyArray=function(e,t,n){let i=this.json[e];if(l(i))return l(i.byteOffset)?(l(i.componentType)&&(t=Q.fromName(i.componentType)),Gse(this,e,t,n,this.featuresLength,i.byteOffset)):cUe(this,e,t,i)};BX.prototype.getProperty=function(e,t,n,i,o){let r=this.json[e];if(!l(r))return;let s=this.getPropertyArray(e,t,n);if(n===1)return s[i];for(let a=0;a0&&(f=nr(i,t,d),t+=d,u>0&&(x=new Uint8Array(e,t,u),x=new Uint8Array(x),t+=u));let _=n+s-t;if(_===0)throw new ce("glTF byte length must be greater than 0.");let C;return t%4===0?C=new Uint8Array(e,t,_):(rk._deprecationWarning("i3dm-glb-unaligned","The embedded glb is not aligned to a 4-byte boundary."),C=new Uint8Array(i.subarray(t,t+_))),{gltfFormat:h,featureTableJson:p,featureTableBinary:g,batchTableJson:f,batchTableBinary:x,gltf:C}};var zX=rk;var gb={NOT_LOADED:0,LOADING:1,PROCESSING:2,POST_PROCESSING:3,READY:4,FAILED:5,UNLOADED:6},sk=Tn.Attribute,EUe=Tn.FeatureIdAttribute,vse=Tn.Instances;function yb(e){e=y(e,y.EMPTY_OBJECT);let t=e.i3dmResource,n=e.arrayBuffer,i=e.baseResource,o=y(e.byteOffset,0),r=y(e.releaseGltfJson,!1),s=y(e.asynchronous,!0),a=y(e.incrementallyLoadTextures,!0),c=y(e.upAxis,wo.Y),d=y(e.forwardAxis,wo.X),u=y(e.loadAttributesAsTypedArray,!1),h=y(e.loadIndicesForWireframe,!1),p=y(e.loadPrimitiveOutline,!0),g=y(e.enablePick,!1);i=l(i)?i:t.clone(),this._i3dmResource=t,this._baseResource=i,this._arrayBuffer=n,this._byteOffset=o,this._releaseGltfJson=r,this._asynchronous=s,this._incrementallyLoadTextures=a,this._upAxis=c,this._forwardAxis=d,this._loadAttributesAsTypedArray=u,this._loadIndicesForWireframe=h,this._loadPrimitiveOutline=p,this._enablePick=g,this._state=gb.NOT_LOADED,this._promise=void 0,this._gltfLoader=void 0,this._buffers=[],this._components=void 0,this._transform=M.IDENTITY,this._batchTable=void 0,this._featureTable=void 0,this._instancesLength=0}l(Object.create)&&(yb.prototype=Object.create(ji.prototype),yb.prototype.constructor=yb);Object.defineProperties(yb.prototype,{texturesLoaded:{get:function(){var e;return(e=this._gltfLoader)==null?void 0:e.texturesLoaded}},cacheKey:{get:function(){}},components:{get:function(){return this._components}}});yb.prototype.load=function(){if(l(this._promise))return this._promise;let e=zX.parse(this._arrayBuffer,this._byteOffset),t=e.featureTableJson,n=e.featureTableBinary,i=e.batchTableJson,o=e.batchTableBinary,r=e.gltfFormat,s=new rh(t,n);this._featureTable=s;let a=s.getGlobalProperty("INSTANCES_LENGTH");if(s.featuresLength=a,!l(a))throw new ce("Feature table global property: INSTANCES_LENGTH must be defined");this._instancesLength=a;let c=s.getGlobalProperty("RTC_CENTER",Q.FLOAT,3);l(c)&&(this._transform=M.fromTranslation(m.fromArray(c))),this._batchTable={json:i,binary:o};let d={upAxis:this._upAxis,forwardAxis:this._forwardAxis,releaseGltfJson:this._releaseGltfJson,incrementallyLoadTextures:this._incrementallyLoadTextures,loadAttributesAsTypedArray:this._loadAttributesAsTypedArray,enablePick:this._enablePick,loadIndicesForWireframe:this._loadIndicesForWireframe,loadPrimitiveOutline:this._loadPrimitiveOutline};if(r===0){let h=Wl(e.gltf);h=h.replace(/[\s\0]+$/,"");let p=this._baseResource.getDerivedResource({url:h});d.gltfResource=p,d.baseResource=p}else d.gltfResource=this._i3dmResource,d.typedArray=e.gltf;let u=new oh(d);return this._gltfLoader=u,this._state=gb.LOADING,this._promise=u.load().then(()=>{if(!this.isDestroyed())return this._state=gb.PROCESSING,this}).catch(h=>{if(!this.isDestroyed())throw IUe(this,h)}),this._promise};function IUe(e,t){return e.unload(),e._state=gb.FAILED,e.getError("Failed to load i3dm",t)}yb.prototype.process=function(e){if(this._state===gb.READY)return!0;let t=this._gltfLoader,n=!1;if(this._state===gb.PROCESSING&&(n=t.process(e)),!n)return!1;let i=t.components;return i.transform=M.multiplyTransformation(this._transform,i.transform,i.transform),PUe(this,i,e),XUe(this,i),this._components=i,this._arrayBuffer=void 0,this._state=gb.READY,!0};function XUe(e,t){let n=e._batchTable,i=e._instancesLength;if(i===0)return;let o;if(l(n.json))o=bb({count:i,batchTable:n.json,binaryBody:n.binary});else{let r=new el({name:jm.BATCH_TABLE_CLASS_NAME,count:i});o=new Ks({schema:{},propertyTables:[r]})}t.structuralMetadata=o}var ak=new m,bz=new Array(4),WUe=new M;function PUe(e,t,n){let i,o=e._featureTable,r=e._instancesLength;if(r===0)return;let s=o.getGlobalProperty("RTC_CENTER",Q.FLOAT,3),a=o.getGlobalProperty("EAST_NORTH_UP"),c=o.hasProperty("NORMAL_UP")||o.hasProperty("NORMAL_UP_OCT32P")||a,d=o.hasProperty("SCALE")||o.hasProperty("SCALE_NON_UNIFORM"),u=wUe(o,r),h;c&&(h=new Float32Array(4*r));let p;d&&(p=new Float32Array(3*r));let g=new Float32Array(r),f=m.unpackArray(u),x=new m,_=new m,C=new m,V=new m,L=new $,R=new Fe,G=new Array(4),I=new m,v=new Array(3),P=new M;if(!l(s)||m.equals(m.unpack(s),m.ZERO)){let U=de.fromPoints(f);for(i=0;i0&&(U.instances=O?vUe(w):w,O=!0)}}function vUe(e){let t=new vse;t.transformInWorldSpace=e.transformInWorldSpace;let n=e.attributes,i=n.length;for(let o=0;o=n[t]){if(t+1=0&&e>=n[t-1])return t-1;let o;if(e>n[t])for(o=t;o=n[o]&&e=0&&!(e>=n[o]&&en&&(r=Math.floor((e-n)/o)+1,e-=r*o),e};i1.prototype.clampTime=function(e){let t=this.times;return W.clamp(e,t[0],t[t.length-1])};var so=i1;function o1(e){this._value=e,this._valueType=so.getPointType(e)}Object.defineProperties(o1.prototype,{value:{get:function(){return this._value}}});o1.prototype.findTimeInterval=function(e){};o1.prototype.wrapTime=function(e){return 0};o1.prototype.clampTime=function(e){return 0};o1.prototype.evaluate=function(e,t){let n=this._value,i=this._valueType;return i===Number?n:i.clone(n,t)};var JX=o1;var GSn=T(S(),1);var pSn=T(S(),1);function r1(e){e=y(e,y.EMPTY_OBJECT);let t=e.points,n=e.times;this._times=n,this._points=t,this._pointType=so.getPointType(t[0]),this._lastTimeIndex=0}Object.defineProperties(r1.prototype,{times:{get:function(){return this._times}},points:{get:function(){return this._points}}});r1.prototype.findTimeInterval=so.prototype.findTimeInterval;r1.prototype.wrapTime=so.prototype.wrapTime;r1.prototype.clampTime=so.prototype.clampTime;r1.prototype.evaluate=function(e,t){let n=this.points,i=this.times,o=this._lastTimeIndex=this.findTimeInterval(e,this._lastTimeIndex),r=(e-i[o])/(i[o+1]-i[o]);return this._pointType===Number?(1-r)*n[o]+r*n[o+1]:(l(t)||(t=new m),m.lerp(n[o],n[o+1],r,t))};var Wg=r1;var ySn=T(S(),1);var wse={};wse.solve=function(e,t,n,i){let o=new Array(n.length),r=new Array(i.length),s=new Array(i.length),a;for(a=0;a=0;--a)s[a]=m.subtract(r[a],m.multiplyByScalar(s[a+1],o[a],s[a]),s[a]);return s};var s1=wse;var Fse=[],Ase=[],Mse=[],Nse=[];function kUe(e,t,n){let i=Fse,o=Mse,r=Ase,s=Nse;i.length=o.length=e.length-1,r.length=s.length=e.length;let a;i[0]=r[0]=1,o[0]=0;let c=s[0];for(l(c)||(c=s[0]=new m),m.clone(t,c),a=1;a0&&e.afterRender.push(a._raiseStartEvent)),a.loop===Ml.REPEAT)g=g-Math.floor(g);else if(a.loop===Ml.MIRRORED_REPEAT){let C=Math.floor(g),V=g-C;g=C%2===1?1-V:V}a.reverse&&(g=1-g);let _=g*d*a.multiplier;_=W.clamp(_,a.localStartTime,a.localStopTime),a.animate(_),a.update.numberOfListeners>0&&(a._updateEventTime=_,e.afterRender.push(a._raiseUpdateEvent)),i=!0,x||(a._state=sh.STOPPED,a.stop.numberOfListeners>0&&e.afterRender.push(a._raiseStopEvent),a.removeOnStop&&ck.push(a))}}n=ck.length;for(let s=0;sW.EPSILON3}};var aW=Dse;var u1n=T(S(),1);var i1n=T(S(),1),cW=`#ifdef DIFFUSE_IBL vec3 sampleDiffuseEnvironment(vec3 cubeDir) { #ifdef CUSTOM_SPHERICAL_HARMONICS return czm_sphericalHarmonics(cubeDir, model_sphericalHarmonicCoefficients); #else return czm_sphericalHarmonics(cubeDir, czm_sphericalHarmonicCoefficients); #endif } #endif #ifdef SPECULAR_IBL vec3 sampleSpecularEnvironment(vec3 cubeDir, float roughness) { #ifdef CUSTOM_SPECULAR_IBL float lod = roughness * model_specularEnvironmentMapsMaximumLOD; return czm_textureCube(model_specularEnvironmentMaps, cubeDir, lod).rgb; #else float lod = roughness * czm_specularEnvironmentMapsMaximumLOD; return czm_textureCube(czm_specularEnvironmentMaps, cubeDir, lod).rgb; #endif } vec3 computeSpecularIBL(vec3 cubeDir, float NdotV, vec3 f0, float roughness) { // see https://bruop.github.io/ibl/ at Single Scattering Results // Roughness dependent fresnel, from Fdez-Aguera vec3 f90 = max(vec3(1.0 - roughness), f0); vec3 F = fresnelSchlick2(f0, f90, NdotV); vec2 brdfLut = texture(czm_brdfLut, vec2(NdotV, roughness)).rg; vec3 specularSample = sampleSpecularEnvironment(cubeDir, roughness); return specularSample * (F * brdfLut.x + brdfLut.y); } #endif #if defined(DIFFUSE_IBL) || defined(SPECULAR_IBL) /** * Compute the light contributions from environment maps and spherical harmonic coefficients. * See Fdez-Aguera, https://www.jcgt.org/published/0008/01/03/paper.pdf, for explanation * of the single- and multi-scattering terms. * * @param {vec3} viewDirectionEC Unit vector pointing from the fragment to the eye position. * @param {vec3} normalEC The surface normal in eye coordinates. * @param {czm_modelMaterial} The material properties. * @return {vec3} The computed HDR color. */ vec3 textureIBL(vec3 viewDirectionEC, vec3 normalEC, czm_modelMaterial material) { vec3 f0 = material.specular; float roughness = material.roughness; float specularWeight = 1.0; #ifdef USE_SPECULAR specularWeight = material.specularWeight; #endif float NdotV = clamp(dot(normalEC, viewDirectionEC), 0.0, 1.0); // see https://bruop.github.io/ibl/ at Single Scattering Results // Roughness dependent fresnel, from Fdez-Aguera vec3 f90 = max(vec3(1.0 - roughness), f0); vec3 singleScatterFresnel = fresnelSchlick2(f0, f90, NdotV); vec2 brdfLut = texture(czm_brdfLut, vec2(NdotV, roughness)).rg; vec3 FssEss = specularWeight * (singleScatterFresnel * brdfLut.x + brdfLut.y); #ifdef DIFFUSE_IBL vec3 normalMC = normalize(model_iblReferenceFrameMatrix * normalEC); vec3 irradiance = sampleDiffuseEnvironment(normalMC); vec3 averageFresnel = f0 + (1.0 - f0) / 21.0; float Ems = specularWeight * (1.0 - brdfLut.x - brdfLut.y); vec3 FmsEms = FssEss * averageFresnel * Ems / (1.0 - averageFresnel * Ems); vec3 dielectricScattering = (1.0 - FssEss - FmsEms) * material.diffuse; vec3 diffuseContribution = irradiance * (FmsEms + dielectricScattering) * model_iblFactor.x; #else vec3 diffuseContribution = vec3(0.0); #endif #ifdef USE_ANISOTROPY // Bend normal to account for anisotropic distortion of specular reflection vec3 anisotropyDirection = material.anisotropicB; vec3 anisotropicTangent = cross(anisotropyDirection, viewDirectionEC); vec3 anisotropicNormal = cross(anisotropicTangent, anisotropyDirection); float bendFactor = 1.0 - material.anisotropyStrength * (1.0 - roughness); float bendFactorPow4 = bendFactor * bendFactor * bendFactor * bendFactor; vec3 bentNormal = normalize(mix(anisotropicNormal, normalEC, bendFactorPow4)); vec3 reflectEC = reflect(-viewDirectionEC, bentNormal); #else vec3 reflectEC = reflect(-viewDirectionEC, normalEC); #endif #ifdef SPECULAR_IBL vec3 reflectMC = normalize(model_iblReferenceFrameMatrix * reflectEC); vec3 radiance = sampleSpecularEnvironment(reflectMC, roughness); vec3 specularContribution = radiance * FssEss * model_iblFactor.y; #else vec3 specularContribution = vec3(0.0); #endif return diffuseContribution + specularContribution; } #endif `;var Bse={name:"ImageBasedLightingPipelineStage"},$Ue=new D;Bse.process=function(e,t,n){var d;let i=t.imageBasedLighting,o=t.environmentMapManager,r=e.shaderBuilder,s;l(i.specularEnvironmentMaps)||(s=o.radianceCubeMap);let a=(d=i.sphericalHarmonicCoefficients)!=null?d:o.sphericalHarmonicCoefficients;r.addDefine("USE_IBL_LIGHTING",void 0,ge.FRAGMENT),r.addUniform("vec2","model_iblFactor",ge.FRAGMENT),Hm.isSupported(n.context)&&((i.useSphericalHarmonics||i.useSpecularEnvironmentMaps||i.enabled)&&r.addUniform("mat3","model_iblReferenceFrameMatrix",ge.FRAGMENT),l(s)&&r.addDefine("COMPUTE_POSITION_WC_ATMOSPHERE",void 0,ge.BOTH),l(a)&&l(a[0])?(r.addDefine("DIFFUSE_IBL",void 0,ge.FRAGMENT),r.addDefine("CUSTOM_SPHERICAL_HARMONICS",void 0,ge.FRAGMENT),r.addUniform("vec3","model_sphericalHarmonicCoefficients[9]",ge.FRAGMENT)):i.useDefaultSphericalHarmonics&&r.addDefine("DIFFUSE_IBL",void 0,ge.FRAGMENT),l(i.specularEnvironmentCubeMap)&&i.specularEnvironmentCubeMap.ready||l(s)?(r.addDefine("SPECULAR_IBL",void 0,ge.FRAGMENT),r.addDefine("CUSTOM_SPECULAR_IBL",void 0,ge.FRAGMENT),r.addUniform("samplerCube","model_specularEnvironmentMaps",ge.FRAGMENT),r.addUniform("float","model_specularEnvironmentMapsMaximumLOD",ge.FRAGMENT)):t.useDefaultSpecularMaps&&r.addDefine("SPECULAR_IBL",void 0,ge.FRAGMENT)),r.addFragmentLines(cW);let c={model_iblFactor:function(){return D.multiplyByScalar(i.imageBasedLightingFactor,(o==null?void 0:o.intensity)||1,$Ue)},model_iblReferenceFrameMatrix:function(){return t._iblReferenceFrameMatrix},model_sphericalHarmonicCoefficients:function(){return a},model_specularEnvironmentMaps:function(){return i.specularEnvironmentCubeMap.texture},model_specularEnvironmentMapsMaximumLOD:function(){return i.specularEnvironmentCubeMap.maximumMipmapLevel}};l(s)&&(c.model_specularEnvironmentMaps=function(){return s},c.model_specularEnvironmentMapsMaximumLOD=function(){return o.maximumMipmapLevel}),e.uniformMap=Lt(c,e.uniformMap)};var lW=Bse;var L1n=T(S(),1);var x1n=T(S(),1);var eDe=W.EPSILON16;function Tz(e){e=y(e,y.EMPTY_OBJECT);let t=e.stage,n=e.runtimeArticulation;this._stage=t,this._runtimeArticulation=n,this._name=t.name,this._type=t.type,this._minimumValue=t.minimumValue,this._maximumValue=t.maximumValue,this._currentValue=t.initialValue}Object.defineProperties(Tz.prototype,{stage:{get:function(){return this._stage}},runtimeArticulation:{get:function(){return this._runtimeArticulation}},name:{get:function(){return this._name}},type:{get:function(){return this._type}},minimumValue:{get:function(){return this._minimumValue}},maximumValue:{get:function(){return this._maximumValue}},currentValue:{get:function(){return this._currentValue},set:function(e){e=W.clamp(e,this.minimumValue,this.maximumValue),W.equalsEpsilon(this._currentValue,e,eDe)||(this._currentValue=e,this.runtimeArticulation._dirty=!0)}}});var tDe=new m,_z=new $;Tz.prototype.applyStageToMatrix=function(e){let t=this.type,n=this.currentValue,i=tDe,o;switch(t){case pc.XROTATE:o=$.fromRotationX(W.toRadians(n),_z),e=M.multiplyByMatrix3(e,o,e);break;case pc.YROTATE:o=$.fromRotationY(W.toRadians(n),_z),e=M.multiplyByMatrix3(e,o,e);break;case pc.ZROTATE:o=$.fromRotationZ(W.toRadians(n),_z),e=M.multiplyByMatrix3(e,o,e);break;case pc.XTRANSLATE:i.x=n,i.y=0,i.z=0,e=M.multiplyByTranslation(e,i,e);break;case pc.YTRANSLATE:i.x=0,i.y=n,i.z=0,e=M.multiplyByTranslation(e,i,e);break;case pc.ZTRANSLATE:i.x=0,i.y=0,i.z=n,e=M.multiplyByTranslation(e,i,e);break;case pc.XSCALE:i.x=n,i.y=1,i.z=1,e=M.multiplyByScale(e,i,e);break;case pc.YSCALE:i.x=1,i.y=n,i.z=1,e=M.multiplyByScale(e,i,e);break;case pc.ZSCALE:i.x=1,i.y=1,i.z=n,e=M.multiplyByScale(e,i,e);break;case pc.UNIFORMSCALE:e=M.multiplyByUniformScale(e,n,e);break;default:break}return e};var dW=Tz;function lk(e){e=y(e,y.EMPTY_OBJECT);let t=e.articulation,n=e.sceneGraph;this._articulation=t,this._sceneGraph=n,this._name=t.name,this._runtimeStages=[],this._runtimeStagesByName={},this._runtimeNodes=[],this._dirty=!0,nDe(this)}Object.defineProperties(lk.prototype,{articulation:{get:function(){return this._articulation}},sceneGraph:{get:function(){return this._sceneGraph}},name:{get:function(){return this._name}},runtimeStages:{get:function(){return this._runtimeStages}},runtimeNodes:{get:function(){return this._runtimeNodes}}});function nDe(e){let n=e.articulation.stages,i=n.length,o=e._runtimeStages,r=e._runtimeStagesByName;for(let s=0;s 0.0 && clipDistance < clippingPlanesEdgeWidth) { color = clippingPlanesEdgeColor; } } `;var Ose={name:"ModelClippingPlanesPipelineStage"},rDe=new D;Ose.process=function(e,t,n){let i=t.clippingPlanes,o=n.context,r=e.shaderBuilder;r.addDefine("HAS_CLIPPING_PLANES",void 0,ge.FRAGMENT),r.addDefine("CLIPPING_PLANES_LENGTH",i.length,ge.FRAGMENT),i.unionClippingRegions&&r.addDefine("UNION_CLIPPING_REGIONS",void 0,ge.FRAGMENT),bs.useFloatTexture(o)&&r.addDefine("USE_CLIPPING_PLANES_FLOAT_TEXTURE",void 0,ge.FRAGMENT);let s=bs.getTextureResolution(i,o,rDe);r.addDefine("CLIPPING_PLANES_TEXTURE_WIDTH",s.x,ge.FRAGMENT),r.addDefine("CLIPPING_PLANES_TEXTURE_HEIGHT",s.y,ge.FRAGMENT),r.addUniform("sampler2D","model_clippingPlanes",ge.FRAGMENT),r.addUniform("vec4","model_clippingPlanesEdgeStyle",ge.FRAGMENT),r.addUniform("mat4","model_clippingPlanesMatrix",ge.FRAGMENT),r.addFragmentLines(hW);let a={model_clippingPlanes:function(){return i.texture},model_clippingPlanesEdgeStyle:function(){let c=B.clone(i.edgeColor);return c.alpha=i.edgeWidth,c},model_clippingPlanesMatrix:function(){return t._clippingPlanesMatrix}};e.uniformMap=Lt(a,e.uniformMap)};var fW=Ose;var eVn=T(S(),1);var H1n=T(S(),1),pW=`void modelClippingPolygonsStage(ProcessedAttributes attributes) { vec2 sphericalLatLong = czm_approximateSphericalCoordinates(v_positionWC); sphericalLatLong.y = czm_branchFreeTernary(sphericalLatLong.y < czm_pi, sphericalLatLong.y, sphericalLatLong.y - czm_twoPi); vec2 minDistance = vec2(czm_infinity); v_regionIndex = -1; v_clippingPosition = vec2(czm_infinity); for (int regionIndex = 0; regionIndex < CLIPPING_POLYGON_REGIONS_LENGTH; regionIndex++) { vec4 extents = czm_unpackClippingExtents(model_clippingExtents, regionIndex); vec2 rectUv = (sphericalLatLong.yx - extents.yx) * extents.wz; vec2 clamped = clamp(rectUv, vec2(0.0), vec2(1.0)); vec2 distance = abs(rectUv - clamped) * extents.wz; if (minDistance.x > distance.x || minDistance.y > distance.y) { minDistance = distance; v_clippingPosition = rectUv; } float threshold = 0.01; if (rectUv.x > threshold && rectUv.y > threshold && rectUv.x < 1.0 - threshold && rectUv.y < 1.0 - threshold) { v_regionIndex = regionIndex; } } } `;var K1n=T(S(),1),bW=`void modelClippingPolygonsStage() { vec2 clippingPosition = v_clippingPosition; int regionIndex = v_regionIndex; czm_clipPolygons(model_clippingDistance, CLIPPING_POLYGON_REGIONS_LENGTH, clippingPosition, regionIndex); } `;var Yse={name:"ModelClippingPolygonsPipelineStage"};Yse.process=function(e,t,n){let i=t.clippingPolygons,o=e.shaderBuilder;o.addDefine("ENABLE_CLIPPING_POLYGONS",void 0,ge.BOTH),i.inverse&&o.addDefine("CLIPPING_INVERSE",void 0,ge.FRAGMENT),o.addDefine("CLIPPING_POLYGON_REGIONS_LENGTH",i.extentsCount,ge.BOTH),o.addUniform("sampler2D","model_clippingDistance",ge.FRAGMENT),o.addUniform("sampler2D","model_clippingExtents",ge.VERTEX),o.addVarying("vec2","v_clippingPosition"),o.addVarying("int","v_regionIndex","flat"),o.addVertexLines(pW),o.addFragmentLines(bW);let r={model_clippingDistance:function(){return i.clippingTexture},model_clippingExtents:function(){return i.extentsTexture}};e.uniformMap=Lt(r,e.uniformMap)};var gW=Yse;var iVn=T(S(),1);function Hse(e,t){this._model=e,this._runtimeNode=t}Object.defineProperties(Hse.prototype,{name:{get:function(){return this._runtimeNode._name}},id:{get:function(){return this._runtimeNode._id}},show:{get:function(){return this._runtimeNode.show},set:function(e){this._runtimeNode.show=e}},matrix:{get:function(){return this._runtimeNode.transform},set:function(e){l(e)?(this._runtimeNode.transform=e,this._runtimeNode.userAnimated=!0,this._model._userAnimationDirty=!0):(this._runtimeNode.transform=this.originalMatrix,this._runtimeNode.userAnimated=!1)}},originalMatrix:{get:function(){return this._runtimeNode.originalTransform}}});var yW=Hse;var QVn=T(S(),1);var XVn=T(S(),1);var rVn=T(S(),1),xW=`mat4 getInstancingTransform() { mat4 instancingTransform; #ifdef HAS_INSTANCE_MATRICES instancingTransform = mat4( a_instancingTransformRow0.x, a_instancingTransformRow1.x, a_instancingTransformRow2.x, 0.0, // Column 1 a_instancingTransformRow0.y, a_instancingTransformRow1.y, a_instancingTransformRow2.y, 0.0, // Column 2 a_instancingTransformRow0.z, a_instancingTransformRow1.z, a_instancingTransformRow2.z, 0.0, // Column 3 a_instancingTransformRow0.w, a_instancingTransformRow1.w, a_instancingTransformRow2.w, 1.0 // Column 4 ); #else vec3 translation = vec3(0.0, 0.0, 0.0); vec3 scale = vec3(1.0, 1.0, 1.0); #ifdef HAS_INSTANCE_TRANSLATION translation = a_instanceTranslation; #endif #ifdef HAS_INSTANCE_SCALE scale = a_instanceScale; #endif instancingTransform = mat4( scale.x, 0.0, 0.0, 0.0, 0.0, scale.y, 0.0, 0.0, 0.0, 0.0, scale.z, 0.0, translation.x, translation.y, translation.z, 1.0 ); #endif return instancingTransform; } #ifdef USE_2D_INSTANCING mat4 getInstancingTransform2D() { mat4 instancingTransform2D; #ifdef HAS_INSTANCE_MATRICES instancingTransform2D = mat4( a_instancingTransform2DRow0.x, a_instancingTransform2DRow1.x, a_instancingTransform2DRow2.x, 0.0, // Column 1 a_instancingTransform2DRow0.y, a_instancingTransform2DRow1.y, a_instancingTransform2DRow2.y, 0.0, // Column 2 a_instancingTransform2DRow0.z, a_instancingTransform2DRow1.z, a_instancingTransform2DRow2.z, 0.0, // Column 3 a_instancingTransform2DRow0.w, a_instancingTransform2DRow1.w, a_instancingTransform2DRow2.w, 1.0 // Column 4 ); #else vec3 translation2D = vec3(0.0, 0.0, 0.0); vec3 scale = vec3(1.0, 1.0, 1.0); #ifdef HAS_INSTANCE_TRANSLATION translation2D = a_instanceTranslation2D; #endif #ifdef HAS_INSTANCE_SCALE scale = a_instanceScale; #endif instancingTransform2D = mat4( scale.x, 0.0, 0.0, 0.0, 0.0, scale.y, 0.0, 0.0, 0.0, 0.0, scale.z, 0.0, translation2D.x, translation2D.y, translation2D.z, 1.0 ); #endif return instancingTransform2D; } #endif `;var aVn=T(S(),1),_W=`void instancingStage(inout ProcessedAttributes attributes) { vec3 positionMC = attributes.positionMC; mat4 instancingTransform = getInstancingTransform(); attributes.positionMC = (instancingTransform * vec4(positionMC, 1.0)).xyz; #ifdef HAS_NORMALS vec3 normalMC = attributes.normalMC; attributes.normalMC = (instancingTransform * vec4(normalMC, 0.0)).xyz; #endif #ifdef USE_2D_INSTANCING mat4 instancingTransform2D = getInstancingTransform2D(); attributes.position2D = (instancingTransform2D * vec4(positionMC, 1.0)).xyz; #endif } `;var lVn=T(S(),1),TW=`void legacyInstancingStage( inout ProcessedAttributes attributes, out mat4 instanceModelView, out mat3 instanceModelViewInverseTranspose) { vec3 positionMC = attributes.positionMC; mat4 instancingTransform = getInstancingTransform(); mat4 instanceModel = instancingTransform * u_instance_nodeTransform; instanceModelView = u_instance_modifiedModelView; instanceModelViewInverseTranspose = mat3(u_instance_modifiedModelView * instanceModel); attributes.positionMC = (instanceModel * vec4(positionMC, 1.0)).xyz; #ifdef USE_2D_INSTANCING mat4 instancingTransform2D = getInstancingTransform2D(); attributes.position2D = (instancingTransform2D * vec4(positionMC, 1.0)).xyz; #endif } `;var dk=new M,sDe=new M,aDe=new M,Kse={name:"InstancingPipelineStage",_getInstanceTransformsAsMatrices:$se,_transformsToTypedArray:Cz};Kse.process=function(e,t,n){let i=t.instances,o=i.attributes[0].count,r=e.shaderBuilder;r.addDefine("HAS_INSTANCING"),r.addVertexLines(xW);let s=e.model,a=s.sceneGraph,c=e.runtimeNode,d=n.mode!==oe.SCENE3D&&!n.scene3DOnly&&s._projectTo2D,u=s._enablePick&&!n.context.webgl2,h=[];SDe(e,n,i,h,d,u),LDe(e,n,i,h);let p={};if(i.transformInWorldSpace?(r.addDefine("USE_LEGACY_INSTANCING",void 0,ge.VERTEX),r.addUniform("mat4","u_instance_modifiedModelView",ge.VERTEX),r.addUniform("mat4","u_instance_nodeTransform",ge.VERTEX),p.u_instance_modifiedModelView=function(){let g=M.multiplyTransformation(s.modelMatrix,a.components.transform,dk);return d?M.multiplyTransformation(n.context.uniformState.view3D,g,dk):(n.mode!==oe.SCENE3D&&(g=wt.basisTo2D(n.mapProjection,g,dk)),M.multiplyTransformation(n.context.uniformState.view,g,dk))},p.u_instance_nodeTransform=function(){return M.multiplyTransformation(a.axisCorrectionMatrix,c.computedTransform,sDe)},r.addVertexLines(TW)):r.addVertexLines(_W),d){r.addDefine("USE_2D_INSTANCING",void 0,ge.VERTEX),r.addUniform("mat4","u_modelView2D",ge.VERTEX);let g=n.context,f=M.fromTranslation(c.instancingReferencePoint2D,new M);p.u_modelView2D=function(){return M.multiplyTransformation(g.uniformState.view,f,aDe)}}e.uniformMap=Lt(p,e.uniformMap),e.instanceCount=o,e.attributes.push.apply(e.attributes,h)};var SW=new M,cDe=new m;function lDe(e,t,n,i,o){let r=M.multiplyTransformation(t,e,SW);return r=M.multiplyTransformation(r,n,SW),o=wt.basisTo2D(i.mapProjection,r,o),o}function dDe(e,t,n,i,o){let r=M.fromTranslation(e,SW),s=M.multiplyTransformation(t,r,SW);s=M.multiplyTransformation(s,n,SW);let a=M.getTranslation(s,cDe);return o=Bi.computeActualEllipsoidPosition(i,a,o),o}function Jse(e,t,n){let i=e.model,o=i.sceneGraph;e.runtimeNode.node.instances.transformInWorldSpace?(t=M.multiplyTransformation(i.modelMatrix,o.components.transform,t),n=M.multiplyTransformation(o.axisCorrectionMatrix,e.runtimeNode.computedTransform,n)):(t=M.clone(o.computedModelMatrix,t),t=M.multiplyTransformation(t,e.runtimeNode.computedTransform,t),n=M.clone(M.IDENTITY,n))}var Qse=new M,jse=new M,uDe=new M,mDe=new m;function hDe(e,t,n,i){let o=Qse,r=jse;Jse(t,o,r);let a=t.runtimeNode.instancingReferencePoint2D,c=e.length;for(let d=0;d=e.featureIdVertexAttributeSetIndex&&(e.featureIdVertexAttributeSetIndex=a.setIndex+1),i.push({index:e.attributeIndex++,vertexBuffer:a.buffer,componentsPerAttribute:rn.getNumberOfComponents(a.type),componentDatatype:a.componentDatatype,normalize:!1,offsetInBytes:a.byteOffset,strideInBytes:a.byteStride,instanceDivisor:1}),r.addAttribute("float",`a_instanceFeatureId_${a.setIndex}`))}}var CW=Kse;var FVn=T(S(),1);var Lz={};Lz.name="ModelMatrixUpdateStage";Lz.update=function(e,t,n){let i=n.mode!==oe.SCENE3D;if(!(i&&t._model._projectTo2D)&&e._transformDirty){let o=i?t._computedModelMatrix2D:t._computedModelMatrix;eae(e,t,o,e.transformToRoot),e._transformDirty=!1}};function RDe(e,t,n){e.modelMatrix=M.multiplyTransformation(t,n,e.modelMatrix),e.cullFace=jt.getCullFace(e.modelMatrix,e.primitiveType)}function eae(e,t,n,i){let o;i=M.multiplyTransformation(i,e.transform,new M),e.updateComputedTransform();let r=e.runtimePrimitives.length;for(o=0;o1&&(i.addDefine("MULTILINE_BATCH_TEXTURE"),i.addUniform("vec2","model_textureDimensions"),o.model_textureDimensions=function(){return c.textureDimensions}),e.uniformMap=Lt(o,e.uniformMap)};var GW=rae;var fLn=T(S(),1);var sae={name:"ClassificationPipelineStage"};sae.process=function(e,t,n){e.shaderBuilder.addDefine("HAS_CLASSIFICATION",void 0,ge.BOTH);let o=e.runtimePrimitive;l(o.batchLengths)||GDe(t,o)};function GDe(e,t){let n=jt.getAttributeBySemantic(e,gt.POSITION);if(!l(n))throw new ce("Primitives must have a position attribute to be used for classification.");let i,o=e.indices,r=l(o);r&&(i=o.typedArray,o.typedArray=void 0);let s=r?o.count:n.count,a=jt.getAttributeBySemantic(e,gt.FEATURE_ID,0);if(!l(a)){t.batchLengths=[s],t.batchOffsets=[0];return}let c=a.typedArray;a.typedArray=void 0;let d=[],u=[0],h=r?i[0]:0,p=c[h],g=0;for(let x=1;xMDe(i,t,n)):[]}function MDe(e,t,n){let{getAttributeByName:i,getAttributeInfo:o,sanitizeGlslIdentifier:r}=jt,s=e.class.id,a=n==null?void 0:n.classes[s],c=Object.entries(e.properties),d=new Array(c.length);for(let u=0;ukDe(n,t)):[]}function kDe(e,t){let{sanitizeGlslIdentifier:n}=jt,i=e.class.id,o=t==null?void 0:t.classes[i],r=Object.entries(e.properties).filter(([a,c])=>c.isGpuCompatible()),s=new Array(r.length);for(let a=0;au),n.addStructField(Ri.STRUCT_ID_METADATA_FS,r,o);let g=`attributes.texCoord_${a}`,f=g;if(l(h)&&!$.equals(h,$.IDENTITY)){let L=`${p}Transform`;n.addUniform("mat3",L,ge.FRAGMENT),i[L]=function(){return h},f=`vec2(${L} * vec3(${g}, 1.0))`}let x=`texture(${p}, ${f}).${c}`,_=s.unpackInShader(x),C=fae({valueExpression:_,renderResources:e,glslType:r,metadataVariable:o,shaderDestination:ge.FRAGMENT,property:s}),V=`metadata.${o} = ${C};`;n.addFunctionLines(Ri.FUNCTION_ID_INITIALIZE_METADATA_FS,[V])}function uae(e,t){let{classProperty:n}=t.property,{metadataVariable:i,glslType:o,shaderDestination:r}=t,s=hae(Ri.METADATA_CLASS_FIELDS,n,`metadataClass.${i}`,o),a=`${o}MetadataClass`;e.addStructField(Ri.STRUCT_ID_METADATA_CLASS_FS,a,i),e.addFunctionLines(Ri.FUNCTION_ID_INITIALIZE_METADATA_FS,s),ge.includesVertexShader(r)&&(e.addStructField(Ri.STRUCT_ID_METADATA_CLASS_VS,a,i),e.addFunctionLines(Ri.FUNCTION_ID_INITIALIZE_METADATA_VS,s))}function mae(e,t){let{propertyStatistics:n}=t;if(!l(n))return;let{metadataVariable:i,type:o,glslType:r}=t;if(o===ut.ENUM)return;let s=Ri.METADATA_STATISTICS_FIELDS,a=`metadataStatistics.${i}`,c=hae(s,n,a,r),d=`${r}MetadataStatistics`;e.addStructField(Ri.STRUCT_ID_METADATA_STATISTICS_FS,d,i),e.addFunctionLines(Ri.FUNCTION_ID_INITIALIZE_METADATA_FS,c),ge.includesVertexShader(t.shaderDestination)&&(e.addStructField(Ri.STRUCT_ID_METADATA_STATISTICS_VS,d,i),e.addFunctionLines(Ri.FUNCTION_ID_INITIALIZE_METADATA_VS,c))}function hae(e,t,n,i){function o(r){let s=t[r.specName];if(l(s))return`${n}.${r.shaderName} = ${i}(${s});`}return l(t)?e.map(o).filter(l):[]}function fae(e){let{valueExpression:t,property:n}=e;if(!n.hasValueTransform)return t;let i=e.metadataVariable,o=`u_${i}_offset`,r=`u_${i}_scale`,{shaderBuilder:s,uniformMap:a}=e.renderResources,{glslType:c,shaderDestination:d}=e;s.addUniform(c,o,d),s.addUniform(c,r,d);let{offset:u,scale:h}=n;return a[o]=()=>u,a[r]=()=>h,`czm_valueTransform(${o}, ${r}, ${t})`}var Fu=Ri;var mRn=T(S(),1),JDe={INHERIT:0,OPAQUE:1,TRANSLUCENT:2},Ag=Object.freeze(JDe);var gRn=T(S(),1);var fRn=T(S(),1),pae=[Int8Array,Uint8Array,Uint8ClampedArray,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array],Zz=1,NW=8,P_=class e{static from(t){if(!(t instanceof ArrayBuffer))throw new Error("Data must be an instance of ArrayBuffer.");let[n,i]=new Uint8Array(t,0,2);if(n!==219)throw new Error("Data does not appear to be in a KDBush format.");let o=i>>4;if(o!==Zz)throw new Error(`Got v${o} data when expected v${Zz}.`);let r=pae[i&15];if(!r)throw new Error("Unrecognized array type.");let[s]=new Uint16Array(t,2,1),[a]=new Uint32Array(t,4,1);return new e(a,s,r,t)}constructor(t,n=64,i=Float64Array,o){if(isNaN(t)||t<0)throw new Error(`Unpexpected numItems value: ${t}.`);this.numItems=+t,this.nodeSize=Math.min(Math.max(+n,2),65535),this.ArrayType=i,this.IndexArrayType=t<65536?Uint16Array:Uint32Array;let r=pae.indexOf(this.ArrayType),s=t*2*this.ArrayType.BYTES_PER_ELEMENT,a=t*this.IndexArrayType.BYTES_PER_ELEMENT,c=(8-a%8)%8;if(r<0)throw new Error(`Unexpected typed array class: ${i}.`);o&&o instanceof ArrayBuffer?(this.data=o,this.ids=new this.IndexArrayType(this.data,NW,t),this.coords=new this.ArrayType(this.data,NW+a+c,t*2),this._pos=t*2,this._finished=!0):(this.data=new ArrayBuffer(NW+s+a+c),this.ids=new this.IndexArrayType(this.data,NW,t),this.coords=new this.ArrayType(this.data,NW+a+c,t*2),this._pos=0,this._finished=!1,new Uint8Array(this.data,0,2).set([219,(Zz<<4)+r]),new Uint16Array(this.data,2,1)[0]=n,new Uint32Array(this.data,4,1)[0]=t)}add(t,n){let i=this._pos>>1;return this.ids[i]=i,this.coords[this._pos++]=t,this.coords[this._pos++]=n,i}finish(){let t=this._pos>>1;if(t!==this.numItems)throw new Error(`Added ${t} items when expected ${this.numItems}.`);return Ez(this.ids,this.coords,this.nodeSize,0,this.numItems-1,0),this._finished=!0,this}range(t,n,i,o){if(!this._finished)throw new Error("Data not yet indexed - call index.finish().");let{ids:r,coords:s,nodeSize:a}=this,c=[0,r.length-1,0],d=[];for(;c.length;){let u=c.pop()||0,h=c.pop()||0,p=c.pop()||0;if(h-p<=a){for(let _=p;_<=h;_++){let C=s[2*_],V=s[2*_+1];C>=t&&C<=i&&V>=n&&V<=o&&d.push(r[_])}continue}let g=p+h>>1,f=s[2*g],x=s[2*g+1];f>=t&&f<=i&&x>=n&&x<=o&&d.push(r[g]),(u===0?t<=f:n<=x)&&(c.push(p),c.push(g-1),c.push(1-u)),(u===0?i>=f:o>=x)&&(c.push(g+1),c.push(h),c.push(1-u))}return d}within(t,n,i){if(!this._finished)throw new Error("Data not yet indexed - call index.finish().");let{ids:o,coords:r,nodeSize:s}=this,a=[0,o.length-1,0],c=[],d=i*i;for(;a.length;){let u=a.pop()||0,h=a.pop()||0,p=a.pop()||0;if(h-p<=s){for(let _=p;_<=h;_++)bae(r[2*_],r[2*_+1],t,n)<=d&&c.push(o[_]);continue}let g=p+h>>1,f=r[2*g],x=r[2*g+1];bae(f,x,t,n)<=d&&c.push(o[g]),(u===0?t-i<=f:n-i<=x)&&(a.push(p),a.push(g-1),a.push(1-u)),(u===0?t+i>=f:n+i>=x)&&(a.push(g+1),a.push(h),a.push(1-u))}return c}};function Ez(e,t,n,i,o,r){if(o-i<=n)return;let s=i+o>>1;gae(e,t,s,i,o,r),Ez(e,t,n,i,s-1,1-r),Ez(e,t,n,s+1,o,1-r)}function gae(e,t,n,i,o,r){for(;o>i;){if(o-i>600){let d=o-i+1,u=n-i+1,h=Math.log(d),p=.5*Math.exp(2*h/3),g=.5*Math.sqrt(h*p*(d-p)/d)*(u-d/2<0?-1:1),f=Math.max(i,Math.floor(n-u*p/d+g)),x=Math.min(o,Math.floor(n+(d-u)*p/d+g));gae(e,t,n,f,x,r)}let s=t[2*n+r],a=i,c=o;for(kW(e,t,i,n),t[2*o+r]>s&&kW(e,t,i,o);as;)c--}t[2*i+r]===s?kW(e,t,i,c):(c++,kW(e,t,c,o)),c<=n&&(i=c+1),n<=c&&(o=c-1)}}function kW(e,t,n,i){Gz(e,n,i),Gz(t,2*n,2*i),Gz(t,2*n+1,2*i+1)}function Gz(e,t,n){let i=e[t];e[t]=e[n],e[n]=i}function bae(e,t,n,i){let o=e-n,r=t-i;return o*o+r*r}var h1={},QDe={KDBush:P_,addCache:function(e,t){return h1[e]=t,t},removeCache:function(e){delete h1[e]},getCache:function(e){return h1[e]},getCacheOrAdd:function(e){return h1[e]||(h1[e]={}),h1[e]}},Tb=QDe;var gs={name:"CustomShaderPipelineStage",STRUCT_ID_ATTRIBUTES_VS:"AttributesVS",STRUCT_ID_ATTRIBUTES_FS:"AttributesFS",STRUCT_NAME_ATTRIBUTES:"Attributes",STRUCT_ID_VERTEX_INPUT:"VertexInput",STRUCT_NAME_VERTEX_INPUT:"VertexInput",STRUCT_ID_FRAGMENT_INPUT:"FragmentInput",STRUCT_NAME_FRAGMENT_INPUT:"FragmentInput",FUNCTION_ID_INITIALIZE_INPUT_STRUCT_VS:"initializeInputStructVS",FUNCTION_SIGNATURE_INITIALIZE_INPUT_STRUCT_VS:"void initializeInputStruct(out VertexInput vsInput, ProcessedAttributes attributes)",FUNCTION_ID_INITIALIZE_INPUT_STRUCT_FS:"initializeInputStructFS",FUNCTION_SIGNATURE_INITIALIZE_INPUT_STRUCT_FS:"void initializeInputStruct(out FragmentInput fsInput, ProcessedAttributes attributes)",_oneTimeWarning:Ct};gs.process=function(e,t,n){let i=e.model.customShader;if(i&&gs.process_original(e,t,n,i),l(e.model._marsOptions)&&l(e.model._marsOptions.customShaders)){let o=Tb.getCache(e.model._marsOptions.customShaders);for(let r in o)Object.prototype.hasOwnProperty.call(o,r)&&gs.process_original(e,t,n,o[r])}};gs.process_original=function(e,t,n,i){let{shaderBuilder:o,alphaOptions:r}=e,{lightingModel:s,translucencyMode:a}=i;l(s)&&(e.lightingOptions.lightingModel=s),a===Ag.TRANSLUCENT?r.pass=Ge.TRANSLUCENT:a===Ag.OPAQUE&&(r.pass=void 0);let c=o3e(i,t);if(!c.customShaderEnabled)return;if(c3e(o,i,c),c.shouldComputePositionWC&&o.addDefine("COMPUTE_POSITION_WC_CUSTOM_SHADER",void 0,ge.BOTH),l(i.vertexShaderText)&&o.addDefine("HAS_CUSTOM_VERTEX_SHADER",void 0,ge.VERTEX),l(i.fragmentShaderText)){o.addDefine("HAS_CUSTOM_FRAGMENT_SHADER",void 0,ge.FRAGMENT);let h=_b.getDefineName(i.mode);o.addDefine(h,void 0,ge.FRAGMENT)}let d=i.uniforms;for(let h in d)if(d.hasOwnProperty(h)){let p=d[h];o.addUniform(p.type,h)}let u=i.varyings;for(let h in u)if(u.hasOwnProperty(h)){let p=u[h];o.addVarying(p,h)}e.uniformMap=Lt(e.uniformMap,i.uniformMap)};function jDe(e){let t={};for(let n=0;n1?(g=e.attributeIndex,e.attributeIndex+=h):p&&!a?g=0:g=e.attributeIndex++,p3e(e,u,g,h,r,s)}V3e(i,t.attributes),t.primitiveType===Ae.POINTS&&i.addDefine("PRIMITIVE_TYPE_POINTS"),i.addVertexLines(YW),i.addFragmentLines(OW)};function p3e(e,t,n,i,o,r){let s=e.shaderBuilder,a=jt.getAttributeInfo(t),c=o&&!r;i>1?y3e(e,t,n,i):g3e(e,t,n,c),_3e(s,a,c),x3e(s,a),l(t.semantic)&&b3e(s,t),T3e(s,a,o),S3e(s,a,c),C3e(s,a)}function b3e(e,t){let{semantic:n,setIndex:i}=t;switch(n){case gt.NORMAL:e.addDefine("HAS_NORMALS");break;case gt.TANGENT:e.addDefine("HAS_TANGENTS");break;case gt.FEATURE_ID:e.addDefine(`HAS${n}_${i}`);break;case gt.TEXCOORD:case gt.COLOR:e.addDefine(`HAS_${n}_${i}`)}}function g3e(e,t,n,i){let{quantization:o,semantic:r,setIndex:s}=t,{type:a,componentDatatype:c}=l(o)?o:t;r===gt.FEATURE_ID&&s>=e.featureIdVertexAttributeSetIndex&&(e.featureIdVertexAttributeSetIndex=s+1);let d=r===gt.POSITION,u=d?0:n,h=rn.getNumberOfComponents(a),p={index:u,value:l(t.buffer)?void 0:t.constant,vertexBuffer:t.buffer,count:t.count,componentsPerAttribute:h,componentDatatype:c,offsetInBytes:t.byteOffset,strideInBytes:t.byteStride,normalize:t.normalized};if(e.attributes.push(p),!d||!i)return;let g=e.runtimePrimitive.positionBuffer2D,f={index:n,vertexBuffer:g,count:t.count,componentsPerAttribute:h,componentDatatype:Q.FLOAT,offsetInBytes:0,strideInBytes:void 0,normalize:t.normalized};e.attributes.push(f)}function y3e(e,t,n,i){let{quantization:o,normalized:r}=t,{type:s,componentDatatype:a}=l(o)?o:t,d=rn.getNumberOfComponents(s)/i,u=Q.getSizeInBytes(a),h=d*u,p=t.byteStride;for(let g=0;g0,d=!l(a)&&c;if(l(r)&&!d){let x=J3e(a),_=Q3e(r,x);j3e(i,_);let V=q3e(_).indexOf("normalMC")>=0,L=jt.getAttributeBySemantic(t,gt.NORMAL);if(V&&!L)throw new ce("Style references the NORMAL semantic but the point cloud does not have normals");i.addDefine("COMPUTE_POSITION_WC_STYLE",void 0,ge.VERTEX),_.styleTranslucent&&(e.alphaOptions.pass=Ge.TRANSLUCENT)}let u=o.pointCloudShading;u.attenuation&&i.addDefine("HAS_POINT_CLOUD_ATTENUATION",void 0,ge.VERTEX),u.backFaceCulling&&i.addDefine("HAS_POINT_CLOUD_BACK_FACE_CULLING",void 0,ge.VERTEX);let h,p,g;mr.is3DTiles(o.type)&&(p=!0,h=o.content,g=h.tile.refine===Oo.ADD),i.addUniform("vec4","model_pointCloudParameters",ge.VERTEX),i.addVertexLines(t2);let f=e.uniformMap;f.model_pointCloudParameters=function(){let x=Y3e,_=1;p&&(_=g?5:h.tileset.memoryAdjustedScreenSpaceError),x.x=y(u.maximumAttenuation,_),x.x*=n.pixelRatio;let C=H3e(e,t,u,h);x.y=C*u.geometricErrorScale;let V=n.context,L=n.camera.frustum,R;return n.mode===oe.SCENE2D||L instanceof ln?R=Number.POSITIVE_INFINITY:R=V.drawingBufferHeight/n.camera.frustum.sseDenominator,x.z=R,p&&(x.w=h.tileset.timeSinceLoad),x}};var Xae=new m;function H3e(e,t,n,i){if(l(i)){let u=i.tile.geometricError;if(u>0)return u}if(l(n.baseResolution))return n.baseResolution;let o=jt.getAttributeBySemantic(t,gt.POSITION),r=o.count,s=e.runtimeNode.transform,a=m.subtract(o.max,o.min,Xae);a=M.multiplyByPointAsVector(s,a,Xae);let c=a.x*a.y*a.z;return W.cbrt(c/r)}var z3e={colorStyleFunction:void 0,showStyleFunction:void 0,pointSizeStyleFunction:void 0,styleTranslucent:!1},K3e={POSITION:"attributes.positionMC",POSITION_ABSOLUTE:"v_positionWC",COLOR:"attributes.color_0",NORMAL:"attributes.normalMC"};function J3e(e){let t=Oe(K3e);if(!l(e))return t;for(let n=0;n0,p=l(i.skin),g=l(r),x=!(g&&l(r.fragmentShaderText))||r.mode!==_b.REPLACE_MATERIAL,_=jt.hasQuantizedAttributes(n.attributes),C=o.debugWireframe&&Ae.isTriangles(n.primitiveType)&&(o._enableDebugWireframe||a),V=o.pointCloudShading,L=l(V)&&V.attenuation,R=l(V)&&V.backFaceCulling,G=n.primitiveType===Ae.POINTS&&(l(s)||L||R),I=o._enableShowOutline&&l(n.outlineCoordinates),v=_Be(o,i,n),P=l(o.classificationType);d&&t.push(a2),t.push(zW),C&&t.push(m2),P&&t.push(EW),h&&t.push($W),p&&t.push(l2),G&&t.push(n2),_&&t.push(BW),x&&t.push(jW),t.push(Fg),t.push(Fu),t.push(Rd),v.hasPropertyTable&&(t.push(Mg),t.push(GW),t.push(WW)),u&&t.push(u2),g&&t.push(UW),t.push(JW),o.allowPicking&&t.push(e2),I&&t.push(r2),t.push(ZW),t.push(s2)};function _Be(e,t,n){let i;return l(t.instances)&&(i=jt.getFeatureIdsByLabel(t.instances.featureIds,e.instanceFeatureIdLabel),l(i))?{hasFeatureIds:!0,hasPropertyTable:l(i.propertyTableId)}:(i=jt.getFeatureIdsByLabel(n.featureIds,e.featureIdLabel),l(i)?{hasFeatureIds:!0,hasPropertyTable:l(i.propertyTableId)}:{hasFeatureIds:!1,hasPropertyTable:!1})}var h2=Yae;var CIn=T(S(),1);function wz(e){e=y(e,y.EMPTY_OBJECT),this._sceneGraph=e.sceneGraph;let t=e.skin;this._skin=t,this._inverseBindMatrices=void 0,this._joints=[],this._jointMatrices=[],TBe(this)}Object.defineProperties(wz.prototype,{skin:{get:function(){return this._skin}},sceneGraph:{get:function(){return this._sceneGraph}},inverseBindMatrices:{get:function(){return this._inverseBindMatrices}},joints:{get:function(){return this._joints}},jointMatrices:{get:function(){return this._jointMatrices}}});function TBe(e){let t=e.skin,n=t.inverseBindMatrices;e._inverseBindMatrices=n;let i=t.joints,o=i.length,r=e.sceneGraph._runtimeNodes,s=e.joints,a=e._jointMatrices;for(let c=0;c czm_splitPosition) discard; if (model_splitDirection > 0.0 && gl_FragCoord.x < czm_splitPosition) discard; #endif } `;var mk={name:"ModelSplitterPipelineStage",SPLIT_DIRECTION_UNIFORM_NAME:"model_splitDirection"};mk.process=function(e,t,n){let i=e.shaderBuilder;i.addDefine("HAS_MODEL_SPLITTER",void 0,ge.FRAGMENT),i.addFragmentLines(S2);let o={};i.addUniform("float",mk.SPLIT_DIRECTION_UNIFORM_NAME,ge.FRAGMENT),o[mk.SPLIT_DIRECTION_UNIFORM_NAME]=function(){return t.splitDirection},e.uniformMap=Lt(o,e.uniformMap)};var C2=mk;var mXn=T(S(),1);function ZBe(e,t){this.model=e.model,this.shaderBuilder=e.shaderBuilder.clone(),this.uniformMap=Oe(e.uniformMap),this.alphaOptions=Oe(e.alphaOptions),this.renderStateOptions=Oe(e.renderStateOptions,!0),this.hasSilhouette=e.hasSilhouette,this.hasSkipLevelOfDetail=e.hasSkipLevelOfDetail,this.runtimeNode=t,this.attributes=[],this.attributeIndex=1,this.featureIdVertexAttributeSetIndex=0,this.instanceCount=0}var V2=ZBe;var VXn=T(S(),1);var bXn=T(S(),1);function GBe(e){e=y(e,y.EMPTY_OBJECT),this.lightingModel=y(e.lightingModel,Ef.UNLIT)}var L2=GBe;function EBe(e,t){this.model=e.model,this.runtimeNode=e.runtimeNode,this.attributes=e.attributes.slice(),this.attributeIndex=e.attributeIndex,this.featureIdVertexAttributeSetIndex=e.featureIdVertexAttributeSetIndex,this.uniformMap=Oe(e.uniformMap),this.alphaOptions=Oe(e.alphaOptions),this.renderStateOptions=Oe(e.renderStateOptions,!0),this.hasSilhouette=e.hasSilhouette,this.hasSkipLevelOfDetail=e.hasSkipLevelOfDetail,this.shaderBuilder=e.shaderBuilder.clone(),this.instanceCount=e.instanceCount,this.runtimePrimitive=t;let n=t.primitive;this.count=l(n.indices)?n.indices.count:jt.getAttributeBySemantic(n,"POSITION").count,this.hasPropertyTable=!1,this.indices=n.indices,this.wireframeIndexBuffer=void 0,this.primitiveType=n.primitiveType;let i=jt.getPositionMinMax(n,this.runtimeNode.instancingTranslationMin,this.runtimeNode.instancingTranslationMax);this.positionMin=m.clone(i.min,new m),this.positionMax=m.clone(i.max,new m),this.boundingSphere=de.fromCornerPoints(this.positionMin,this.positionMax,new de),this.lightingOptions=new L2,this.pickId=void 0}var R2=EBe;var LWn=T(S(),1);var MXn=T(S(),1);function Nz(e){e=y(e,y.EMPTY_OBJECT);let t=e.command,n=e.primitiveRenderResources,i=n.model;this._command=t,this._model=i,this._runtimePrimitive=n.runtimePrimitive,this._modelMatrix=t.modelMatrix,this._boundingVolume=t.boundingVolume,this._cullFace=t.renderState.cull.face;let o=i.classificationType;this._classificationType=o,this._classifiesTerrain=o!==Bn.CESIUM_3D_TILE,this._classifies3DTiles=o!==Bn.TERRAIN,this._useDebugWireframe=i._enableDebugWireframe&&i.debugWireframe,this._pickId=n.pickId,this._commandListTerrain=[],this._commandList3DTiles=[],this._commandListIgnoreShow=[],this._commandListDebugWireframe=[],this._commandListTerrainPicking=[],this._commandList3DTilesPicking=[],PBe(this)}function IBe(e){return{colorMask:{red:!1,green:!1,blue:!1,alpha:!1},stencilTest:{enabled:!0,frontFunction:e,frontOperation:{fail:ft.KEEP,zFail:ft.DECREMENT_WRAP,zPass:ft.KEEP},backFunction:e,backOperation:{fail:ft.KEEP,zFail:ft.INCREMENT_WRAP,zPass:ft.KEEP},reference:Dt.CESIUM_3D_TILE_MASK,mask:Dt.CESIUM_3D_TILE_MASK},stencilMask:Dt.CLASSIFICATION_MASK,depthTest:{enabled:!0,func:ac.LESS_OR_EQUAL},depthMask:!1}}var XBe={stencilTest:{enabled:!0,frontFunction:On.NOT_EQUAL,frontOperation:{fail:ft.ZERO,zFail:ft.ZERO,zPass:ft.ZERO},backFunction:On.NOT_EQUAL,backOperation:{fail:ft.ZERO,zFail:ft.ZERO,zPass:ft.ZERO},reference:0,mask:Dt.CLASSIFICATION_MASK},stencilMask:Dt.CLASSIFICATION_MASK,depthTest:{enabled:!1},depthMask:!1,blending:hn.PRE_MULTIPLIED_ALPHA_BLEND},WBe={stencilTest:{enabled:!0,frontFunction:On.NOT_EQUAL,frontOperation:{fail:ft.ZERO,zFail:ft.ZERO,zPass:ft.ZERO},backFunction:On.NOT_EQUAL,backOperation:{fail:ft.ZERO,zFail:ft.ZERO,zPass:ft.ZERO},reference:0,mask:Dt.CLASSIFICATION_MASK},stencilMask:Dt.CLASSIFICATION_MASK,depthTest:{enabled:!1},depthMask:!1},Jae=[];function PBe(e){let t=e._command,n=Jae;if(e._useDebugWireframe){t.pass=Ge.OPAQUE,n.length=0,n.push(t),e._commandListDebugWireframe=Z2(e,n,e._commandListDebugWireframe);let r=e._commandListDebugWireframe,s=r.length;for(let a=0;as||o<-s&&r>-s}function b1(e,t){if(!l(t))return;let n=Sb.clone(t),i=$e.shallowClone(t.command);return i.modelMatrix=e._modelMatrix2D,i.boundingVolume=e._boundingVolume2D,n.command=i,n.updateShadows=!1,n.is2D=!0,t.derivedCommand2D=n,e._derivedCommands.push(n),n}function UBe(e){b1(e,e._originalCommand),b1(e,e._translucentCommand),b1(e,e._skipLodBackfaceCommand),b1(e,e._skipLodStencilCommand),b1(e,e._silhouetteModelCommand),b1(e,e._silhouetteColorCommand)}function DBe(e){let t=$e.shallowClone(e);t.pass=Ge.TRANSLUCENT;let n=Oe(e.renderState,!0);return n.cull.enabled=!1,n.depthMask=!1,n.blending=hn.ALPHA_BLEND,t.renderState=Ue.fromCache(n),t}function BBe(e,t){let n=t._silhouetteId%255,i=$e.shallowClone(e),o=Oe(e.renderState,!0);return o.stencilTest={enabled:!0,frontFunction:ie.ALWAYS,backFunction:ie.ALWAYS,reference:n,mask:-1,frontOperation:{fail:ie.KEEP,zFail:ie.KEEP,zPass:ie.REPLACE},backOperation:{fail:ie.KEEP,zFail:ie.KEEP,zPass:ie.REPLACE}},t.isInvisible()&&(o.colorMask={red:!1,green:!1,blue:!1,alpha:!1}),i.renderState=Ue.fromCache(o),i}function OBe(e,t){let n=t._silhouetteId%255,i=$e.shallowClone(e),o=Oe(e.renderState,!0);o.cull.enabled=!1,(e.pass===Ge.TRANSLUCENT||t.silhouetteColor.alpha<1)&&(i.pass=Ge.TRANSLUCENT,o.depthMask=!1,o.blending=hn.ALPHA_BLEND),o.stencilTest={enabled:!0,frontFunction:ie.NOTEQUAL,backFunction:ie.NOTEQUAL,reference:n,mask:-1,frontOperation:{fail:ie.KEEP,zFail:ie.KEEP,zPass:ie.KEEP},backOperation:{fail:ie.KEEP,zFail:ie.KEEP,zPass:ie.KEEP}};let s=Oe(e.uniformMap);return s.model_silhouettePass=function(){return!0},i.renderState=Ue.fromCache(o),i.uniformMap=s,i.castShadows=!1,i.receiveShadows=!1,i}function YBe(e,t,n){let i=e._skipLodStencilCommand,o=i.command,r=t._selectionDepth,s=HBe(o);if(r!==s){let a=zBe(r),c=Oe(o.renderState,!0);c.stencilTest.reference=a,o.renderState=Ue.fromCache(c),n&&(i.derivedCommand2D.renderState=c)}}function HBe(e){return(e.renderState.stencilTest.reference&Dt.SKIP_LOD_MASK)>>>Dt.SKIP_LOD_BIT_SHIFT}function zBe(e){return Dt.CESIUM_3D_TILE_MASK|e<0&&(h=nr(n,t,a),t+=a,c>0&&(p=new Uint8Array(e,t,c),t+=c));let g=new rh(d,u),f=g.getGlobalProperty("POINTS_LENGTH");if(g.featuresLength=f,!l(f))throw new ce("Feature table global property: POINTS_LENGTH must be defined");let x=g.getGlobalProperty("RTC_CENTER",Q.FLOAT,3);l(x)&&(x=m.unpack(x));let _=fOe(g,h);if(_.rtcCenter=x,_.pointsLength=f,!_.hasPositions){let C=pOe(g);_.positions=C,_.hasPositions=_.hasPositions||l(C)}if(!_.hasPositions)throw new ce("Either POSITION or POSITION_QUANTIZED must be defined.");if(!_.hasNormals){let C=gOe(g);_.normals=C,_.hasNormals=_.hasNormals||l(C)}if(!_.hasColors){let C=bOe(g);_.colors=C,_.hasColors=_.hasColors||l(C),_.hasConstantColor=l(_.constantColor),_.isTranslucent=l(C)&&C.isTranslucent}if(!_.hasBatchIds){let C=yOe(g);_.batchIds=C,_.hasBatchIds=_.hasBatchIds||l(C)}if(_.hasBatchIds){let C=g.getGlobalProperty("BATCH_LENGTH");if(!l(C))throw new ce("Global property: BATCH_LENGTH must be defined when BATCH_ID is defined.");_.batchLength=C}return l(p)&&(p=new Uint8Array(p),_.batchTableJson=h,_.batchTableBinary=p),_};function fOe(e,t){let n=e.json,i,o,r,s=l(n.extensions)?n.extensions["3DTILES_draco_point_compression"]:void 0,a=l(t)&&l(t.extensions)?t.extensions["3DTILES_draco_point_compression"]:void 0;l(a)&&(r=a.properties);let c,d,u,h,p;if(l(s)){o=s.properties;let f=s.byteOffset,x=s.byteLength;if(!l(o)||!l(f)||!l(x))throw new ce("Draco properties, byteOffset, and byteLength must be defined");i=e.buffer.slice(f,f+x),c=l(o.POSITION),d=l(o.RGB)||l(o.RGBA),u=l(o.NORMAL),h=l(o.BATCH_ID),p=l(o.RGBA)}let g;return l(i)&&(g={buffer:i,featureTableProperties:o,batchTableProperties:r,properties:Lt(o,r),dequantizeInShader:!0}),{draco:g,hasPositions:c,hasColors:d,isTranslucent:p,hasNormals:u,hasBatchIds:h}}function pOe(e){let t=e.json,n;if(l(t.POSITION))return n=e.getPropertyArray("POSITION",Q.FLOAT,3),{name:gt.POSITION,semantic:gt.POSITION,typedArray:n,isQuantized:!1,componentDatatype:Q.FLOAT,type:rn.VEC3};if(l(t.POSITION_QUANTIZED)){n=e.getPropertyArray("POSITION_QUANTIZED",Q.UNSIGNED_SHORT,3);let i=e.getGlobalProperty("QUANTIZED_VOLUME_SCALE",Q.FLOAT,3);if(!l(i))throw new ce("Global property: QUANTIZED_VOLUME_SCALE must be defined for quantized positions.");let o=65535,r=e.getGlobalProperty("QUANTIZED_VOLUME_OFFSET",Q.FLOAT,3);if(!l(r))throw new ce("Global property: QUANTIZED_VOLUME_OFFSET must be defined for quantized positions.");return{name:gt.POSITION,semantic:gt.POSITION,typedArray:n,isQuantized:!0,componentDatatype:Q.FLOAT,type:rn.VEC3,quantizedRange:o,quantizedVolumeOffset:m.unpack(r),quantizedVolumeScale:m.unpack(i),quantizedComponentDatatype:Q.UNSIGNED_SHORT,quantizedType:rn.VEC3}}}function bOe(e){let t=e.json,n;if(l(t.RGBA))return n=e.getPropertyArray("RGBA",Q.UNSIGNED_BYTE,4),{name:gt.COLOR,semantic:gt.COLOR,setIndex:0,typedArray:n,componentDatatype:Q.UNSIGNED_BYTE,type:rn.VEC4,normalized:!0,isRGB565:!1,isTranslucent:!0};if(l(t.RGB))return n=e.getPropertyArray("RGB",Q.UNSIGNED_BYTE,3),{name:"COLOR",semantic:gt.COLOR,setIndex:0,typedArray:n,componentDatatype:Q.UNSIGNED_BYTE,type:rn.VEC3,normalized:!0,isRGB565:!1,isTranslucent:!1};if(l(t.RGB565))return n=e.getPropertyArray("RGB565",Q.UNSIGNED_SHORT,1),{name:"COLOR",semantic:gt.COLOR,setIndex:0,typedArray:n,componentDatatype:Q.FLOAT,type:rn.VEC3,normalized:!1,isRGB565:!0,isTranslucent:!1};if(l(t.CONSTANT_RGBA)){let i=e.getGlobalProperty("CONSTANT_RGBA",Q.UNSIGNED_BYTE,4),o=i[3],r=B.fromBytes(i[0],i[1],i[2],o),s=o<255;return{name:gt.COLOR,semantic:gt.COLOR,setIndex:0,constantColor:r,componentDatatype:Q.FLOAT,type:rn.VEC4,isQuantized:!1,isTranslucent:s}}}function gOe(e){let t=e.json,n;if(l(t.NORMAL))return n=e.getPropertyArray("NORMAL",Q.FLOAT,3),{name:gt.NORMAL,semantic:gt.NORMAL,typedArray:n,octEncoded:!1,octEncodedZXY:!1,componentDatatype:Q.FLOAT,type:rn.VEC3};if(l(t.NORMAL_OCT16P))return n=e.getPropertyArray("NORMAL_OCT16P",Q.UNSIGNED_BYTE,2),{name:gt.NORMAL,semantic:gt.NORMAL,typedArray:n,octEncoded:!0,octEncodedZXY:!1,quantizedRange:(1<<8)-1,quantizedType:rn.VEC2,quantizedComponentDatatype:Q.UNSIGNED_BYTE,componentDatatype:Q.FLOAT,type:rn.VEC3}}function yOe(e){let t=e.json;if(l(t.BATCH_ID)){let n=e.getPropertyArray("BATCH_ID",Q.UNSIGNED_SHORT,1);return{name:gt.FEATURE_ID,semantic:gt.FEATURE_ID,setIndex:0,typedArray:n,componentDatatype:Q.fromTypedArray(n),type:rn.SCALAR}}}var A_=nce;var xOe=Tn.Components,_Oe=Tn.Scene,TOe=Tn.Node,SOe=Tn.Primitive,COe=Tn.Attribute,ice=Tn.Quantization,VOe=Tn.FeatureIdAttribute,LOe=Tn.Material,ROe=Tn.MetallicRoughness;function kg(e){e=y(e,y.EMPTY_OBJECT);let t=e.arrayBuffer,n=y(e.byteOffset,0);this._arrayBuffer=t,this._byteOffset=n,this._loadAttributesFor2D=y(e.loadAttributesFor2D,!1),this._parsedContent=void 0,this._decodePromise=void 0,this._decodedAttributes=void 0,this._promise=void 0,this._error=void 0,this._state=xt.UNLOADED,this._buffers=[],this._components=void 0,this._transform=M.IDENTITY}l(Object.create)&&(kg.prototype=Object.create(ji.prototype),kg.prototype.constructor=kg);Object.defineProperties(kg.prototype,{cacheKey:{get:function(){}},components:{get:function(){return this._components}},transform:{get:function(){return this._transform}}});kg.prototype.load=function(){if(l(this._promise))return this._promise;this._parsedContent=A_.parse(this._arrayBuffer,this._byteOffset),this._state=xt.PROCESSING,this._promise=Promise.resolve(this)};kg.prototype.process=function(e){if(l(this._error)){let t=this._error;throw this._error=void 0,t}if(this._state===xt.READY)return!0;if(this._state===xt.PROCESSING){if(l(this._decodePromise))return!1;this._decodePromise=ZOe(this,e.context)}return!1};function ZOe(e,t){let i=e._parsedContent.draco,o;if(l(i)?o=ob.decodePointCloud(i,t):o=Promise.resolve(),!!l(o))return e._decodePromise=o,o.then(function(r){if(!e.isDestroyed())return l(r)&&GOe(e,i,r),NOe(e,t),e._state=xt.READY,e}).catch(function(r){e.unload(),e._state=xt.FAILED;let s="Failed to load Draco pnts";e._error=e.getError(s,r)})}function GOe(e,t,n){e._state=xt.READY;let i=e._parsedContent,o;if(l(n.POSITION)){if(o={name:"POSITION",semantic:gt.POSITION,typedArray:n.POSITION.array,componentDatatype:Q.FLOAT,type:rn.VEC3,isQuantized:!1},l(n.POSITION.data.quantization)){let a=n.POSITION.data.quantization,c=a.range,d=m.fromElements(c,c,c),u=m.unpack(a.minValues),h=(1<0&&kOe(e,a,h,t),l(n.rtcCenter)&&(u.transform=M.multiplyByTranslation(u.transform,n.rtcCenter,u.transform));let p=n.positions;l(p)&&p.isQuantized&&(u.transform=M.multiplyByTranslation(u.transform,p.quantizedVolumeOffset,u.transform)),e._components=u,e._parsedContent=void 0,e._arrayBuffer=void 0}function kOe(e,t,n,i){let o=t.attributes,r=n.length;for(let s=0;s=0&&(a=ye)}}}}if(a!==Number.MAX_VALUE){if(s=gn.getPoint(t,a,s),n.mode!==oe.SCENE3D){m.fromElements(s.y,s.z,s.x,s);let u=n.mapProjection,h=u.ellipsoid,p=u.unproject(s,zOe);h.cartographicToCartesian(p,s)}return s}}function kz(e,t,n,i,o,r,s,a,c,d){let u=n+t*i;if(d.x=e[u],d.y=e[u+1],d.z=e[u+2],l(o))if(o.octEncoded){if(d=Mn.octDecodeInRange(d,o.normalizationRange,d),o.octEncodedZXY){let h=d.x;d.x=d.z,d.z=d.y,d.y=h}}else d=m.multiplyComponents(d,o.quantizedVolumeStepSize,d),d=m.add(d,o.quantizedVolumeOffset,d);return d=M.multiplyByPoint(r,d,d),s!==1&&Sr.getPosition(d,c,s,a,d),d}function mo(e){e=y(e,y.EMPTY_OBJECT),this._loader=e.loader,this._resource=e.resource,this.type=y(e.type,mr.GLTF),this.modelMatrix=M.clone(y(e.modelMatrix,M.IDENTITY)),this._modelMatrix=M.clone(this.modelMatrix),this._scale=y(e.scale,1),this._minimumPixelSize=y(e.minimumPixelSize,0),this._maximumScale=e.maximumScale,this._clampedScale=l(this._maximumScale)?Math.min(this._scale,this._maximumScale):this._scale,this._computedScale=this._clampedScale,this._updateModelMatrix=!1,this.referenceMatrix=void 0,this._iblReferenceFrameMatrix=$.clone($.IDENTITY),this._resourcesLoaded=!1,this._drawCommandsBuilt=!1,this._ready=!1,this._customShader=e.customShader,this._content=e.content,this._texturesLoaded=!1,this._defaultTexture=void 0,this._activeAnimations=new eW(this),this._clampAnimations=y(e.clampAnimations,!0),this._userAnimationDirty=!1,this._id=e.id,this._idDirty=!1,this._color=B.clone(e.color),this._colorBlendMode=y(e.colorBlendMode,fc.HIGHLIGHT),this._colorBlendAmount=y(e.colorBlendAmount,.5);let t=y(e.silhouetteColor,B.RED);this._silhouetteColor=B.clone(t),this._silhouetteSize=y(e.silhouetteSize,0),this._silhouetteDirty=!1,this._silhouetteId=void 0,this._cull=y(e.cull,!0),this._opaquePass=y(e.opaquePass,Ge.OPAQUE),this._allowPicking=y(e.allowPicking,!0),this._show=y(e.show,!0),this._style=void 0,this._styleDirty=!1,this._styleCommandsNeeded=void 0;let n=y(e.featureIdLabel,"featureId_0");typeof n=="number"&&(n=`featureId_${n}`),this._featureIdLabel=n;let i=y(e.instanceFeatureIdLabel,"instanceFeatureId_0");typeof i=="number"&&(i=`instanceFeatureId_${i}`),this._instanceFeatureIdLabel=i,this._featureTables=[],this._featureTableId=void 0,this._featureTableIdDirty=!0,this._pipelineResources=[],this._modelResources=[],this._pickIds=[],this._boundingSphere=new de,this._initialRadius=void 0,this._heightReference=y(e.heightReference,Ke.NONE),this._heightDirty=this._heightReference!==Ke.NONE,this._removeUpdateHeightCallback=void 0,this._enableVerticalExaggeration=y(e.enableVerticalExaggeration,!0),this._hasVerticalExaggeration=!1,this._clampedModelMatrix=void 0;let o=e.scene;l(o)&&l(o.terrainProviderChanged)&&(this._terrainProviderChangedCallback=o.terrainProviderChanged.addEventListener(()=>{this._heightDirty=!0})),this._scene=o,this._distanceDisplayCondition=e.distanceDisplayCondition;let r=new Gf(e.pointCloudShading);this._pointCloudShading=r,this._attenuation=r.attenuation,this._pointCloudBackFaceCulling=r.backFaceCulling;let s=e.clippingPlanes;l(s)&&s.owner===void 0?bs.setOwner(s,this,"_clippingPlanes"):this._clippingPlanes=s,this._clippingPlanesState=0,this._clippingPlanesMatrix=M.clone(M.IDENTITY);let a=e.clippingPolygons;l(a)&&a.owner===void 0?eh.setOwner(a,this,"_clippingPolygons"):this._clippingPolygons=a,this._clippingPolygonsState=0,this._lightColor=m.clone(e.lightColor),this._imageBasedLighting=l(e.imageBasedLighting)?e.imageBasedLighting:new t_,this._shouldDestroyImageBasedLighting=!l(e.imageBasedLighting),this._environmentMapManager=void 0;let c=new db(e.environmentMapOptions);db.setOwner(c,this,"_environmentMapManager"),this._backFaceCulling=y(e.backFaceCulling,!0),this._backFaceCullingDirty=!1,this._shadows=y(e.shadows,_n.ENABLED),this._shadowsDirty=!1,this._debugShowBoundingVolumeDirty=!1,this._debugShowBoundingVolume=y(e.debugShowBoundingVolume,!1),this._enableDebugWireframe=y(e.enableDebugWireframe,!1),this._enableShowOutline=y(e.enableShowOutline,!0),this._debugWireframe=y(e.debugWireframe,!1),this._debugWireframe===!0&&this._enableDebugWireframe===!1&&this.type===mr.GLTF&&Ct("model-debug-wireframe-ignored","enableDebugWireframe must be set to true in Model.fromGltf, otherwise debugWireframe will be ignored.");let d=e.credit;typeof d=="string"&&(d=new Rt(d)),this._credits=[],this._credit=d,this._resourceCredits=[],this._gltfCredits=[],this._showCreditsOnScreen=y(e.showCreditsOnScreen,!1),this._showCreditsOnScreenDirty=!0,this._splitDirection=y(e.splitDirection,Fr.NONE),this._enableShowOutline=y(e.enableShowOutline,!0),this.showOutline=y(e.showOutline,!0),this.outlineColor=y(e.outlineColor,B.BLACK),this._classificationType=e.classificationType,this._statistics=new v2,this._sceneMode=void 0,this._projectTo2D=y(e.projectTo2D,!1),this._enablePick=y(e.enablePick,!1),this._fogRenderable=void 0,this._skipLevelOfDetail=!1,this._ignoreCommands=y(e.ignoreCommands,!1),this._errorEvent=new be,this._readyEvent=new be,this._texturesReadyEvent=new be,this._sceneGraph=void 0,this._nodesByName={},this.pickObject=e.pickObject,this._marsOptions=y(e.marsOptions,{})}function Uz(e,t){if(e._errorEvent.numberOfListeners>0){e._errorEvent.raiseEvent(t);return}console.log(t)}function JOe(e,t){let n=e._featureTables,i=t.propertyTables,o=i.length;for(let r=0;r0&&t===0||e===0&&t>0;this._silhouetteDirty=this._silhouetteDirty||n,this._backFaceCullingDirty=this._backFaceCullingDirty||n}this._silhouetteSize=e}},boundingSphere:{get:function(){let e=l(this._clampedModelMatrix)?this._clampedModelMatrix:this.modelMatrix;return cce(this,e),this._boundingSphere}},debugShowBoundingVolume:{get:function(){return this._debugShowBoundingVolume},set:function(e){this._debugShowBoundingVolume!==e&&(this._debugShowBoundingVolumeDirty=!0),this._debugShowBoundingVolume=e}},debugWireframe:{get:function(){return this._debugWireframe},set:function(e){this._debugWireframe!==e&&this.resetDrawCommands(),this._debugWireframe=e,this._debugWireframe===!0&&this._enableDebugWireframe===!1&&this.type===mr.GLTF&&Ct("model-debug-wireframe-ignored","enableDebugWireframe must be set to true in Model.fromGltfAsync, otherwise debugWireframe will be ignored.")}},show:{get:function(){return this._show},set:function(e){this._show=e}},featureIdLabel:{get:function(){return this._featureIdLabel},set:function(e){typeof e=="number"&&(e=`featureId_${e}`),e!==this._featureIdLabel&&(this._featureTableIdDirty=!0),this._featureIdLabel=e}},instanceFeatureIdLabel:{get:function(){return this._instanceFeatureIdLabel},set:function(e){typeof e=="number"&&(e=`instanceFeatureId_${e}`),e!==this._instanceFeatureIdLabel&&(this._featureTableIdDirty=!0),this._instanceFeatureIdLabel=e}},clippingPlanes:{get:function(){return this._clippingPlanes},set:function(e){e!==this._clippingPlanes&&(bs.setOwner(e,this,"_clippingPlanes"),this.resetDrawCommands())}},clippingPolygons:{get:function(){return this._clippingPolygons},set:function(e){e!==this._clippingPolygons&&(eh.setOwner(e,this,"_clippingPolygons"),this.resetDrawCommands())}},enableVerticalExaggeration:{get:function(){return this._enableVerticalExaggeration},set:function(e){e!==this._enableVerticalExaggeration&&this.resetDrawCommands(),this._enableVerticalExaggeration=e}},hasVerticalExaggeration:{get:function(){return this._hasVerticalExaggeration}},lightColor:{get:function(){return this._lightColor},set:function(e){l(e)!==l(this._lightColor)&&this.resetDrawCommands(),this._lightColor=m.clone(e,this._lightColor)}},imageBasedLighting:{get:function(){return this._imageBasedLighting},set:function(e){e!==this._imageBasedLighting&&(this._shouldDestroyImageBasedLighting&&!this._imageBasedLighting.isDestroyed()&&this._imageBasedLighting.destroy(),this._imageBasedLighting=e,this._shouldDestroyImageBasedLighting=!1,this.resetDrawCommands())}},environmentMapManager:{get:function(){return this._environmentMapManager},set:function(e){e!==this.environmentMapManager&&(db.setOwner(e,this,"_environmentMapManager"),this.resetDrawCommands())}},backFaceCulling:{get:function(){return this._backFaceCulling},set:function(e){e!==this._backFaceCulling&&(this._backFaceCullingDirty=!0),this._backFaceCulling=e}},scale:{get:function(){return this._scale},set:function(e){e!==this._scale&&(this._updateModelMatrix=!0),this._scale=e}},computedScale:{get:function(){return this._computedScale}},minimumPixelSize:{get:function(){return this._minimumPixelSize},set:function(e){e!==this._minimumPixelSize&&(this._updateModelMatrix=!0),this._minimumPixelSize=e}},maximumScale:{get:function(){return this._maximumScale},set:function(e){e!==this._maximumScale&&(this._updateModelMatrix=!0),this._maximumScale=e}},shadows:{get:function(){return this._shadows},set:function(e){e!==this._shadows&&(this._shadowsDirty=!0),this._shadows=e}},credit:{get:function(){return this._credit}},showCreditsOnScreen:{get:function(){return this._showCreditsOnScreen},set:function(e){this._showCreditsOnScreen!==e&&(this._showCreditsOnScreenDirty=!0),this._showCreditsOnScreen=e}},splitDirection:{get:function(){return this._splitDirection},set:function(e){this._splitDirection!==e&&this.resetDrawCommands(),this._splitDirection=e}},classificationType:{get:function(){return this._classificationType}},pickIds:{get:function(){return this._pickIds}},styleCommandsNeeded:{get:function(){return this._styleCommandsNeeded}}});mo.prototype.getNode=function(e){return this._nodesByName[e]};mo.prototype.setArticulationStage=function(e,t){this._sceneGraph.setArticulationStage(e,t)};mo.prototype.applyArticulations=function(){this._sceneGraph.applyArticulations()};mo.prototype.getExtension=function(e){return this._loader.components.extensions[e]};mo.prototype.makeStyleDirty=function(){this._styleDirty=!0};mo.prototype.resetDrawCommands=function(){this._drawCommandsBuilt=!1};var jOe=new M,qOe=new $,$Oe=new M;mo.prototype.update=function(e){let t=!1;try{t=eYe(this,e)}catch(n){if(!this._loader.incrementallyLoadTextures&&n.name==="TextureError")Uz(this,n);else{let i=jt.getError("model",this._resource,n);Uz(this,i)}}if(iYe(this,e),tYe(this,e),nYe(this,e),oYe(this,e),!this._resourcesLoaded&&t){this._resourcesLoaded=!0;let n=this._loader.components;if(!l(n)){if(this._loader.isUnloaded())return;let r=jt.getError("model",this._resource,new ce("Failed to load model."));Uz(r),this._rejectLoad=this._rejectLoad&&this._rejectLoad(r)}let i=n.structuralMetadata;l(i)&&i.propertyTableCount>0&&JOe(this,i);let o=new P2({model:this,modelComponents:n});this._sceneGraph=o,this._gltfCredits=o.components.asset.credits}if(!(!this._resourcesLoaded||e.mode===oe.MORPHING)){if(rYe(this),sYe(this),aYe(this,e),cYe(this),lYe(this,e),dYe(this,e),uYe(this,e),mYe(this,e),hYe(this,e),fYe(this,e),pYe(this,e),this._defaultTexture=e.context.defaultTexture,bYe(this,e),gYe(this,e),yYe(this),xYe(this,e),CYe(this,e),!this._ready){e.afterRender.push(()=>{this._ready=!0,this._readyEvent.raiseEvent(this)});return}this._loader.incrementallyLoadTextures&&!this._texturesLoaded&&this._loader.texturesLoaded&&(this.resetDrawCommands(),this._texturesLoaded=!0,this._texturesReadyEvent.raiseEvent(this)),TYe(this),VYe(this,e),LYe(this),RYe(this,e)}};function eYe(e,t){return!e._resourcesLoaded||e._loader.incrementallyLoadTextures&&!e._texturesLoaded?(t.afterRender.push(()=>!0),e._loader.process(t)):!0}function tYe(e,t){l(e._customShader)&&e._customShader.update(t)}function nYe(e,t){let n=e._environmentMapManager,i=t.passes.pick||t.passes.pickVoxel;e._ready&&n.owner===e&&!i&&(n.position=e._boundingSphere.center,n.shouldUpdate=!l(e._imageBasedLighting.sphericalHarmonicCoefficients)||!l(e._imageBasedLighting.specularEnvironmentMaps),n.update(t),n.shouldRegenerateShaders&&e.resetDrawCommands())}function iYe(e,t){if(l(e._marsOptions)&&l(e._marsOptions.customShaders)){let n=Tb.getCache(e._marsOptions.customShaders);for(let i in n)Object.prototype.hasOwnProperty.call(n,i)&&n[i].update(t)}}function oYe(e,t){e._imageBasedLighting.update(t),e._imageBasedLighting.shouldRegenerateShaders&&e.resetDrawCommands()}function rYe(e){if(!e._featureTableIdDirty)return;e._featureTableIdDirty=!1;let t=e._sceneGraph.components,n=t.structuralMetadata;l(n)&&n.propertyTableCount>0&&(e.featureTableId=QOe(t,e),e._styleDirty=!0,e.resetDrawCommands())}function sYe(e){e._styleDirty&&(e.applyStyle(e._style),e._styleDirty=!1)}function aYe(e,t){let n=e._featureTables,i=n.length,o=!1;for(let r=0;r=i&&r<=o}function IYe(e,t){let n=t.creditDisplay,i=e._credits,o=i.length;for(let r=0;r0&&e.alpha<1};mo.prototype.isInvisible=function(){let e=this.color;return l(e)&&e.alpha===0};function lce(e){return e.context.stencilBuffer}mo.prototype.hasSilhouette=function(e){return lce(e)&&this._silhouetteSize>0&&this._silhouetteColor.alpha>0&&!l(this._classificationType)};mo.prototype.hasSkipLevelOfDetail=function(e){if(!mr.is3DTiles(this.type))return!1;let t=e.context.stencilBuffer,n=this._content.tileset;return t&&n.isSkippingLevelOfDetail};mo.prototype.isClippingEnabled=function(){let e=this._clippingPlanes;return l(e)&&e.enabled&&e.length!==0};mo.prototype.pick=function(e,t,n,i,o){return y1(this,e,t,n,i,o)};mo.prototype.isClippingPolygonsEnabled=function(){let e=this._clippingPolygons;return l(e)&&e.enabled&&e.length!==0};mo.prototype.isDestroyed=function(){return!1};mo.prototype.destroy=function(){let e=this._loader;l(e)&&e.destroy();let t=this._featureTables;if(l(t)){let r=t.length;for(let s=0;s0,i=l(this.structuralMetadata)?this.structuralMetadata.propertyAttributes:void 0,o=l(i)&&l(i[0]);if(t&&(!n||o)){this.resetDrawCommands();return}n?(this.featureTables[this.featureTableId].applyStyle(e),ace(this,e)):(this.applyColorAndShow(e),this._styleCommandsNeeded=void 0)};function A2(e,t,n){return{loader:e,type:t,resource:n.resource,show:n.show,modelMatrix:n.modelMatrix,scale:n.scale,enableVerticalExaggeration:n.enableVerticalExaggeration,minimumPixelSize:n.minimumPixelSize,maximumScale:n.maximumScale,id:n.id,allowPicking:n.allowPicking,clampAnimations:n.clampAnimations,shadows:n.shadows,debugShowBoundingVolume:n.debugShowBoundingVolume,enableDebugWireframe:n.enableDebugWireframe,debugWireframe:n.debugWireframe,cull:n.cull,opaquePass:n.opaquePass,customShader:n.customShader,content:n.content,heightReference:n.heightReference,scene:n.scene,distanceDisplayCondition:n.distanceDisplayCondition,color:n.color,colorBlendAmount:n.colorBlendAmount,colorBlendMode:n.colorBlendMode,silhouetteColor:n.silhouetteColor,silhouetteSize:n.silhouetteSize,enableShowOutline:n.enableShowOutline,showOutline:n.showOutline,outlineColor:n.outlineColor,clippingPlanes:n.clippingPlanes,clippingPolygons:n.clippingPolygons,lightColor:n.lightColor,imageBasedLighting:n.imageBasedLighting,backFaceCulling:n.backFaceCulling,credit:n.credit,showCreditsOnScreen:n.showCreditsOnScreen,splitDirection:n.splitDirection,projectTo2D:n.projectTo2D,enablePick:n.enablePick,featureIdLabel:n.featureIdLabel,instanceFeatureIdLabel:n.instanceFeatureIdLabel,pointCloudShading:n.pointCloudShading,classificationType:n.classificationType,pickObject:n.pickObject,marsOptions:n.marsOptions}}var ch=mo;function Br(e,t,n){this._tileset=e,this._tile=t,this._resource=n,this._model=void 0,this._metadata=void 0,this._group=void 0,this._ready=!1}Object.defineProperties(Br.prototype,{featuresLength:{get:function(){let e=this._model,t=e.featureTables,n=e.featureTableId;return l(t)&&l(t[n])?t[n].featuresLength:0}},pointsLength:{get:function(){return this._model.statistics.pointsLength}},trianglesLength:{get:function(){return this._model.statistics.trianglesLength}},geometryByteLength:{get:function(){return this._model.statistics.geometryByteLength}},texturesByteLength:{get:function(){return this._model.statistics.texturesByteLength}},batchTableByteLength:{get:function(){let e=this._model.statistics;return e.propertyTablesByteLength+e.batchTexturesByteLength}},innerContents:{get:function(){}},ready:{get:function(){return this._ready}},tileset:{get:function(){return this._tileset}},tile:{get:function(){return this._tile}},url:{get:function(){return this._resource.getUrlComponent(!0)}},batchTable:{get:function(){let e=this._model,t=e.featureTables,n=e.featureTableId;if(l(t)&&l(t[n]))return t[n]}},metadata:{get:function(){return this._metadata},set:function(e){this._metadata=e}},group:{get:function(){return this._group},set:function(e){this._group=e}}});Br.prototype.getTextureIds=function(){return this._model.statistics.getTextureIds()};Br.prototype.getTextureByteLengthById=function(e){return this._model.statistics.getTextureByteLengthById(e)};Br.prototype.getExtension=function(e){return this._model.getExtension(e)};Br.prototype.getFeature=function(e){let t=this._model,n=t.featureTableId;return t.featureTables[n].getFeature(e)};Br.prototype.hasProperty=function(e,t){let n=this._model,i=n.featureTableId;return l(i)?n.featureTables[i].hasProperty(e,t):!1};Br.prototype.applyDebugSettings=function(e,t){t=e?t:B.WHITE,this.featuresLength===0?this._model.color=t:l(this.batchTable)&&this.batchTable.setAllColor(t)};Br.prototype.applyStyle=function(e){this._model.style=e};Br.prototype.update=function(e,t){let n=this._model,i=this._tile;n.colorBlendAmount=e.colorBlendAmount,n.colorBlendMode=e.colorBlendMode,n.modelMatrix=i.computedTransform,n.customShader=e.customShader,n.featureIdLabel=e.featureIdLabel,n.instanceFeatureIdLabel=e.instanceFeatureIdLabel,n.lightColor=e.lightColor,n.imageBasedLighting=e.imageBasedLighting,n.backFaceCulling=e.backFaceCulling,n.shadows=e.shadows,n.showCreditsOnScreen=e.showCreditsOnScreen,n.splitDirection=e.splitDirection,n.debugWireframe=e.debugWireframe,n.showOutline=e.showOutline,n.outlineColor=e.outlineColor,n.pointCloudShading=e.pointCloudShading;let o=e.clippingPlanes;n.referenceMatrix=e.clippingPlanesOriginMatrix,l(o)&&i.clippingPlanesDirty&&(n._clippingPlanes=o.enabled&&i._isClipped?o:void 0);let r=e.environmentMapManager;n.environmentMapManager!==o&&(n._environmentMapManager=r),l(o)&&l(n._clippingPlanes)&&n._clippingPlanes!==o&&(n._clippingPlanes=o,n._clippingPlanesState=0);let s=e.clippingPolygons;l(s)&&i.clippingPolygonsDirty&&(n._clippingPolygons=s.enabled&&i._isClippedByPolygon?s:void 0),l(s)&&l(n._clippingPolygons)&&n._clippingPolygons!==s&&(n._clippingPolygons=s,n._clippingPolygonsState=0),n.update(t),!this._ready&&n.ready&&(n.activeAnimations.addAll({loop:Ml.REPEAT}),this._ready=!0)};Br.prototype.isDestroyed=function(){return!1};Br.prototype.destroy=function(){return this._model=this._model&&this._model.destroy(),me(this)};Br.fromGltf=async function(e,t,n,i){let o=new Br(e,t,n),s=M2(e,t,o,{gltf:i,basePath:n}),a=e.vectorClassificationOnly?void 0:e.classificationType;s.classificationType=a;let c=await ch.fromGltfAsync(s);return o._model=c,o};Br.fromB3dm=async function(e,t,n,i,o){let r=new Br(e,t,n),a=M2(e,t,r,{arrayBuffer:i,byteOffset:o,resource:n}),c=e.vectorClassificationOnly?void 0:e.classificationType;a.classificationType=c;let d=await ch.fromB3dm(a);return r._model=d,r};Br.fromI3dm=async function(e,t,n,i,o){let r=new Br(e,t,n),a=M2(e,t,r,{arrayBuffer:i,byteOffset:o,resource:n}),c=await ch.fromI3dm(a);return r._model=c,r};Br.fromPnts=async function(e,t,n,i,o){let r=new Br(e,t,n),a=M2(e,t,r,{arrayBuffer:i,byteOffset:o,resource:n}),c=await ch.fromPnts(a);return r._model=c,r};Br.fromGeoJson=async function(e,t,n,i){let o=new Br(e,t,n),s=M2(e,t,o,{geoJson:i,resource:n}),a=await ch.fromGeoJson(s);return o._model=a,o};Br.prototype.pick=function(e,t,n){if(!l(this._model)||!this._ready)return;let i=t.verticalExaggeration,o=t.verticalExaggerationRelativeHeight;return this._model.pick(e,t,i,o,ne.WGS84,n)};function M2(e,t,n,i){let o={cull:!1,releaseGltfJson:!0,opaquePass:Ge.CESIUM_3D_TILE,modelMatrix:t.computedTransform,upAxis:e._modelUpAxis,forwardAxis:e._modelForwardAxis,incrementallyLoadTextures:!1,customShader:e.customShader,content:n,colorBlendMode:e.colorBlendMode,colorBlendAmount:e.colorBlendAmount,lightColor:e.lightColor,imageBasedLighting:e.imageBasedLighting,featureIdLabel:e.featureIdLabel,instanceFeatureIdLabel:e.instanceFeatureIdLabel,pointCloudShading:e.pointCloudShading,clippingPlanes:e.clippingPlanes,backFaceCulling:e.backFaceCulling,shadows:e.shadows,showCreditsOnScreen:e.showCreditsOnScreen,splitDirection:e.splitDirection,enableDebugWireframe:e._enableDebugWireframe,debugWireframe:e.debugWireframe,projectTo2D:e._projectTo2D,enablePick:e._enablePick,enableShowOutline:e._enableShowOutline,showOutline:e.showOutline,outlineColor:e.outlineColor,marsOptions:e._marsOptions};return Lt(i,o)}var Gd=Br;var lvn=T(S(),1);function Au(e,t,n){this._tileset=e,this._tile=t,this._resource=n,this.featurePropertiesDirty=!1,this._metadata=void 0,this._group=void 0,this._ready=!1}Object.defineProperties(Au.prototype,{featuresLength:{get:function(){return 0}},pointsLength:{get:function(){return 0}},trianglesLength:{get:function(){return 0}},geometryByteLength:{get:function(){return 0}},texturesByteLength:{get:function(){return 0}},batchTableByteLength:{get:function(){return 0}},innerContents:{get:function(){}},ready:{get:function(){return this._ready}},tileset:{get:function(){return this._tileset}},tile:{get:function(){return this._tile}},url:{get:function(){return this._resource.getUrlComponent(!0)}},batchTable:{get:function(){}},metadata:{get:function(){return this._metadata},set:function(e){this._metadata=e}},group:{get:function(){return this._group},set:function(e){this._group=e}}});Au.fromJson=function(e,t,n,i){let o=new Au(e,t,n);return o._tileset.loadTileset(o._resource,i,o._tile),o._ready=!0,o};Au.prototype.hasProperty=function(e,t){return!1};Au.prototype.getFeature=function(e){};Au.prototype.applyDebugSettings=function(e,t){};Au.prototype.applyStyle=function(e){};Au.prototype.update=function(e,t){};Au.prototype.pick=function(e,t,n){};Au.prototype.isDestroyed=function(){return!1};Au.prototype.destroy=function(){return me(this)};var N2=Au;var NNn=T(S(),1);var MMn=T(S(),1);var oFn=T(S(),1);var xvn=T(S(),1);function Qs(e,t,n,i){let o=Qs._verifyAttributes(t);n=y(n,0);let r=[],s={},a,c,d=o.length;for(let h=0;h0?Q.getSizeInBytes(e[0].componentDatatype):0,o=i>0?t%i:0,r=o===0?0:i-o;return t+=r,t};Qs._createArrayViews=function(e,t){let n=[],i=0,o=e.length;for(let r=0;r0){let n=new ArrayBuffer(t*e.vertexSizeInBytes);if(l(e.arrayBuffer)){let r=new Uint8Array(n),s=new Uint8Array(e.arrayBuffer),a=s.length;for(let c=0;c0){t.needsCommit=!1;let n=t.vertexBuffer,i=e._size*t.vertexSizeInBytes,o=l(n);if(!o||n.sizeInBytes0){let i=e.vertexSizeInBytes*t,o=e.vertexSizeInBytes*n;e.vertexBuffer.copyFromArrayView(new Uint8Array(e.arrayBuffer,i,o),i)}}Qs.prototype.endSubCommits=function(){let e=this._allBuffers;for(let t=0,n=e.length;t 0.0) { // Don't get the outline edge exceed the SDF_EDGE float outlineEdge = clamp(SDF_EDGE - outlineWidth, 0.0, SDF_EDGE); float outlineFactor = smoothstep(SDF_EDGE - smoothing, SDF_EDGE + smoothing, distance); vec4 sdfColor = mix(outlineColor, v_color, outlineFactor); float alpha = smoothstep(outlineEdge - smoothing, outlineEdge + smoothing, distance); return vec4(sdfColor.rgb, sdfColor.a * alpha); } else { float alpha = smoothstep(SDF_EDGE - smoothing, SDF_EDGE + smoothing, distance); return vec4(v_color.rgb, v_color.a * alpha); } } #endif void main() { if (v_splitDirection < 0.0 && gl_FragCoord.x > czm_splitPosition) discard; if (v_splitDirection > 0.0 && gl_FragCoord.x < czm_splitPosition) discard; vec4 color = texture(u_atlas, v_textureCoordinates); #ifdef SDF float outlineWidth = v_outlineWidth; vec4 outlineColor = v_outlineColor; // Get the current distance float distance = getDistance(v_textureCoordinates); #if (__VERSION__ == 300 || defined(GL_OES_standard_derivatives)) float smoothing = fwidth(distance); // Get an offset that is approximately half the distance to the neighbor pixels // 0.354 is approximately half of 1/sqrt(2) vec2 sampleOffset = 0.354 * vec2(dFdx(v_textureCoordinates) + dFdy(v_textureCoordinates)); // Sample the center point vec4 center = getSDFColor(v_textureCoordinates, outlineWidth, outlineColor, smoothing); // Sample the 4 neighbors vec4 color1 = getSDFColor(v_textureCoordinates + vec2(sampleOffset.x, sampleOffset.y), outlineWidth, outlineColor, smoothing); vec4 color2 = getSDFColor(v_textureCoordinates + vec2(-sampleOffset.x, sampleOffset.y), outlineWidth, outlineColor, smoothing); vec4 color3 = getSDFColor(v_textureCoordinates + vec2(-sampleOffset.x, -sampleOffset.y), outlineWidth, outlineColor, smoothing); vec4 color4 = getSDFColor(v_textureCoordinates + vec2(sampleOffset.x, -sampleOffset.y), outlineWidth, outlineColor, smoothing); // Equally weight the center sample and the 4 neighboring samples color = (center + color1 + color2 + color3 + color4)/5.0; #else // If no derivatives available (IE 10?), just do a single sample float smoothing = 1.0/32.0; color = getSDFColor(v_textureCoordinates, outlineWidth, outlineColor, smoothing); #endif color = czm_gammaCorrect(color); #else color = czm_gammaCorrect(color); color *= czm_gammaCorrect(v_color); #endif // Fully transparent parts of the billboard are not pickable. #if !defined(OPAQUE) && !defined(TRANSLUCENT) if (color.a < 0.005) // matches 0/255 and 1/255 { discard; } #else // The billboard is rendered twice. The opaque pass discards translucent fragments // and the translucent pass discards opaque fragments. #ifdef OPAQUE if (color.a < 0.995) // matches < 254/255 { discard; } #else if (color.a >= 0.995) // matches 254/255 and 255/255 { discard; } #endif #endif #ifdef VECTOR_TILE color *= u_highlightColor; #endif out_FragColor = color; #ifdef LOG_DEPTH czm_writeLogDepth(); #endif #ifdef FRAGMENT_DEPTH_CHECK float temp = v_compressed.y; temp = temp * SHIFT_RIGHT1; float temp2 = (temp - floor(temp)) * SHIFT_LEFT1; bool enableDepthTest = temp2 != 0.0; bool applyTranslate = floor(temp) != 0.0; if (enableDepthTest) { temp = v_compressed.z; temp = temp * SHIFT_RIGHT12; vec2 dimensions; dimensions.y = (temp - floor(temp)) * SHIFT_LEFT12; dimensions.x = floor(temp); temp = v_compressed.w; temp = temp * SHIFT_RIGHT12; vec2 imageSize; imageSize.y = (temp - floor(temp)) * SHIFT_LEFT12; imageSize.x = floor(temp); vec2 adjustedST = v_textureCoordinates - v_textureCoordinateBounds.xy; adjustedST = adjustedST / vec2(v_textureCoordinateBounds.z - v_textureCoordinateBounds.x, v_textureCoordinateBounds.w - v_textureCoordinateBounds.y); float epsilonEyeDepth = v_compressed.x + czm_epsilon1; float globeDepth1 = getGlobeDepth(adjustedST, v_originTextureCoordinateAndTranslate.xy, applyTranslate, dimensions, imageSize); // negative values go into the screen if (globeDepth1 != 0.0 && globeDepth1 > epsilonEyeDepth) { float globeDepth2 = getGlobeDepth(adjustedST, vec2(0.0, 1.0), applyTranslate, dimensions, imageSize); // top left corner if (globeDepth2 != 0.0 && globeDepth2 > epsilonEyeDepth) { float globeDepth3 = getGlobeDepth(adjustedST, vec2(1.0, 1.0), applyTranslate, dimensions, imageSize); // top right corner if (globeDepth3 != 0.0 && globeDepth3 > epsilonEyeDepth) { discard; } } } } #endif } `;var Cvn=T(S(),1),U2=`#ifdef INSTANCED in vec2 direction; #endif in vec4 positionHighAndScale; in vec4 positionLowAndRotation; in vec4 compressedAttribute0; // pixel offset, translate, horizontal origin, vertical origin, show, direction, texture coordinates (texture offset) in vec4 compressedAttribute1; // aligned axis, translucency by distance, image width in vec4 compressedAttribute2; // label horizontal origin, image height, color, pick color, size in meters, valid aligned axis, 13 bits free in vec4 eyeOffset; // eye offset in meters, 4 bytes free (texture range) in vec4 scaleByDistance; // near, nearScale, far, farScale in vec4 pixelOffsetScaleByDistance; // near, nearScale, far, farScale in vec4 compressedAttribute3; // distance display condition near, far, disableDepthTestDistance, dimensions in vec2 sdf; // sdf outline color (rgb) and width (w) in float splitDirection; // splitDirection #if defined(VERTEX_DEPTH_CHECK) || defined(FRAGMENT_DEPTH_CHECK) in vec4 textureCoordinateBoundsOrLabelTranslate; // the min and max x and y values for the texture coordinates #endif #ifdef VECTOR_TILE in float a_batchId; #endif out vec2 v_textureCoordinates; #ifdef FRAGMENT_DEPTH_CHECK out vec4 v_textureCoordinateBounds; out vec4 v_originTextureCoordinateAndTranslate; out vec4 v_compressed; // x: eyeDepth, y: applyTranslate & enableDepthCheck, z: dimensions, w: imageSize out mat2 v_rotationMatrix; #endif out vec4 v_pickColor; out vec4 v_color; out float v_splitDirection; #ifdef SDF out vec4 v_outlineColor; out float v_outlineWidth; #endif const float UPPER_BOUND = 32768.0; const float SHIFT_LEFT16 = 65536.0; const float SHIFT_LEFT12 = 4096.0; const float SHIFT_LEFT8 = 256.0; const float SHIFT_LEFT7 = 128.0; const float SHIFT_LEFT5 = 32.0; const float SHIFT_LEFT3 = 8.0; const float SHIFT_LEFT2 = 4.0; const float SHIFT_LEFT1 = 2.0; const float SHIFT_RIGHT12 = 1.0 / 4096.0; const float SHIFT_RIGHT8 = 1.0 / 256.0; const float SHIFT_RIGHT7 = 1.0 / 128.0; const float SHIFT_RIGHT5 = 1.0 / 32.0; const float SHIFT_RIGHT3 = 1.0 / 8.0; const float SHIFT_RIGHT2 = 1.0 / 4.0; const float SHIFT_RIGHT1 = 1.0 / 2.0; vec4 addScreenSpaceOffset(vec4 positionEC, vec2 imageSize, float scale, vec2 direction, vec2 origin, vec2 translate, vec2 pixelOffset, vec3 alignedAxis, bool validAlignedAxis, float rotation, bool sizeInMeters, out mat2 rotationMatrix, out float mpp) { // Note the halfSize cannot be computed in JavaScript because it is sent via // compressed vertex attributes that coerce it to an integer. vec2 halfSize = imageSize * scale * 0.5; halfSize *= ((direction * 2.0) - 1.0); vec2 originTranslate = origin * abs(halfSize); #if defined(ROTATION) || defined(ALIGNED_AXIS) if (validAlignedAxis || rotation != 0.0) { float angle = rotation; if (validAlignedAxis) { vec4 projectedAlignedAxis = czm_modelView3D * vec4(alignedAxis, 0.0); angle += sign(-projectedAlignedAxis.x) * acos(sign(projectedAlignedAxis.y) * (projectedAlignedAxis.y * projectedAlignedAxis.y) / (projectedAlignedAxis.x * projectedAlignedAxis.x + projectedAlignedAxis.y * projectedAlignedAxis.y)); } float cosTheta = cos(angle); float sinTheta = sin(angle); rotationMatrix = mat2(cosTheta, sinTheta, -sinTheta, cosTheta); halfSize = rotationMatrix * halfSize; } else { rotationMatrix = mat2(1.0, 0.0, 0.0, 1.0); } #endif mpp = czm_metersPerPixel(positionEC); positionEC.xy += (originTranslate + halfSize) * czm_branchFreeTernary(sizeInMeters, 1.0, mpp); positionEC.xy += (translate + pixelOffset) * mpp; return positionEC; } #ifdef VERTEX_DEPTH_CHECK float getGlobeDepth(vec4 positionEC) { vec4 posWC = czm_eyeToWindowCoordinates(positionEC); float globeDepth = czm_unpackDepth(texture(czm_globeDepthTexture, posWC.xy / czm_viewport.zw)); if (globeDepth == 0.0) { return 0.0; // not on the globe } vec4 eyeCoordinate = czm_windowToEyeCoordinates(posWC.xy, globeDepth); return eyeCoordinate.z / eyeCoordinate.w; } #endif void main() { // Modifying this shader may also require modifications to Billboard._computeScreenSpacePosition // unpack attributes vec3 positionHigh = positionHighAndScale.xyz; vec3 positionLow = positionLowAndRotation.xyz; float scale = positionHighAndScale.w; #if defined(ROTATION) || defined(ALIGNED_AXIS) float rotation = positionLowAndRotation.w; #else float rotation = 0.0; #endif float compressed = compressedAttribute0.x; vec2 pixelOffset; pixelOffset.x = floor(compressed * SHIFT_RIGHT7); compressed -= pixelOffset.x * SHIFT_LEFT7; pixelOffset.x -= UPPER_BOUND; vec2 origin; origin.x = floor(compressed * SHIFT_RIGHT5); compressed -= origin.x * SHIFT_LEFT5; origin.y = floor(compressed * SHIFT_RIGHT3); compressed -= origin.y * SHIFT_LEFT3; #ifdef FRAGMENT_DEPTH_CHECK vec2 depthOrigin = origin.xy; #endif origin -= vec2(1.0); float show = floor(compressed * SHIFT_RIGHT2); compressed -= show * SHIFT_LEFT2; #ifdef INSTANCED vec2 textureCoordinatesBottomLeft = czm_decompressTextureCoordinates(compressedAttribute0.w); vec2 textureCoordinatesRange = czm_decompressTextureCoordinates(eyeOffset.w); vec2 textureCoordinates = textureCoordinatesBottomLeft + direction * textureCoordinatesRange; #else vec2 direction; direction.x = floor(compressed * SHIFT_RIGHT1); direction.y = compressed - direction.x * SHIFT_LEFT1; vec2 textureCoordinates = czm_decompressTextureCoordinates(compressedAttribute0.w); #endif float temp = compressedAttribute0.y * SHIFT_RIGHT8; pixelOffset.y = -(floor(temp) - UPPER_BOUND); vec2 translate; translate.y = (temp - floor(temp)) * SHIFT_LEFT16; temp = compressedAttribute0.z * SHIFT_RIGHT8; translate.x = floor(temp) - UPPER_BOUND; translate.y += (temp - floor(temp)) * SHIFT_LEFT8; translate.y -= UPPER_BOUND; temp = compressedAttribute1.x * SHIFT_RIGHT8; float temp2 = floor(compressedAttribute2.w * SHIFT_RIGHT2); vec2 imageSize = vec2(floor(temp), temp2); #ifdef FRAGMENT_DEPTH_CHECK float labelHorizontalOrigin = floor(compressedAttribute2.w - (temp2 * SHIFT_LEFT2)); float applyTranslate = 0.0; if (labelHorizontalOrigin != 0.0) // is a billboard, so set apply translate to false { applyTranslate = 1.0; labelHorizontalOrigin -= 2.0; depthOrigin.x = labelHorizontalOrigin + 1.0; } depthOrigin = vec2(1.0) - (depthOrigin * 0.5); #endif #ifdef EYE_DISTANCE_TRANSLUCENCY vec4 translucencyByDistance; translucencyByDistance.x = compressedAttribute1.z; translucencyByDistance.z = compressedAttribute1.w; translucencyByDistance.y = ((temp - floor(temp)) * SHIFT_LEFT8) / 255.0; temp = compressedAttribute1.y * SHIFT_RIGHT8; translucencyByDistance.w = ((temp - floor(temp)) * SHIFT_LEFT8) / 255.0; #endif #if defined(VERTEX_DEPTH_CHECK) || defined(FRAGMENT_DEPTH_CHECK) temp = compressedAttribute3.w; temp = temp * SHIFT_RIGHT12; vec2 dimensions; dimensions.y = (temp - floor(temp)) * SHIFT_LEFT12; dimensions.x = floor(temp); #endif #ifdef ALIGNED_AXIS vec3 alignedAxis = czm_octDecode(floor(compressedAttribute1.y * SHIFT_RIGHT8)); temp = compressedAttribute2.z * SHIFT_RIGHT5; bool validAlignedAxis = (temp - floor(temp)) * SHIFT_LEFT1 > 0.0; #else vec3 alignedAxis = vec3(0.0); bool validAlignedAxis = false; #endif vec4 pickColor; vec4 color; temp = compressedAttribute2.y; temp = temp * SHIFT_RIGHT8; pickColor.b = (temp - floor(temp)) * SHIFT_LEFT8; temp = floor(temp) * SHIFT_RIGHT8; pickColor.g = (temp - floor(temp)) * SHIFT_LEFT8; pickColor.r = floor(temp); temp = compressedAttribute2.x; temp = temp * SHIFT_RIGHT8; color.b = (temp - floor(temp)) * SHIFT_LEFT8; temp = floor(temp) * SHIFT_RIGHT8; color.g = (temp - floor(temp)) * SHIFT_LEFT8; color.r = floor(temp); temp = compressedAttribute2.z * SHIFT_RIGHT8; bool sizeInMeters = floor((temp - floor(temp)) * SHIFT_LEFT7) > 0.0; temp = floor(temp) * SHIFT_RIGHT8; pickColor.a = (temp - floor(temp)) * SHIFT_LEFT8; pickColor /= 255.0; color.a = floor(temp); color /= 255.0; /////////////////////////////////////////////////////////////////////////// vec4 p = czm_translateRelativeToEye(positionHigh, positionLow); vec4 positionEC = czm_modelViewRelativeToEye * p; #if defined(FRAGMENT_DEPTH_CHECK) || defined(VERTEX_DEPTH_CHECK) float eyeDepth = positionEC.z; #endif positionEC = czm_eyeOffset(positionEC, eyeOffset.xyz); positionEC.xyz *= show; /////////////////////////////////////////////////////////////////////////// #if defined(EYE_DISTANCE_SCALING) || defined(EYE_DISTANCE_TRANSLUCENCY) || defined(EYE_DISTANCE_PIXEL_OFFSET) || defined(DISTANCE_DISPLAY_CONDITION) || defined(DISABLE_DEPTH_DISTANCE) float lengthSq; if (czm_sceneMode == czm_sceneMode2D) { // 2D camera distance is a special case // treat all billboards as flattened to the z=0.0 plane lengthSq = czm_eyeHeight2D.y; } else { lengthSq = dot(positionEC.xyz, positionEC.xyz); } #endif #ifdef EYE_DISTANCE_SCALING float distanceScale = czm_nearFarScalar(scaleByDistance, lengthSq); scale *= distanceScale; translate *= distanceScale; // push vertex behind near plane for clipping if (scale == 0.0) { positionEC.xyz = vec3(0.0); } #endif float translucency = 1.0; #ifdef EYE_DISTANCE_TRANSLUCENCY translucency = czm_nearFarScalar(translucencyByDistance, lengthSq); // push vertex behind near plane for clipping if (translucency == 0.0) { positionEC.xyz = vec3(0.0); } #endif #ifdef EYE_DISTANCE_PIXEL_OFFSET float pixelOffsetScale = czm_nearFarScalar(pixelOffsetScaleByDistance, lengthSq); pixelOffset *= pixelOffsetScale; #endif #ifdef DISTANCE_DISPLAY_CONDITION float nearSq = compressedAttribute3.x; float farSq = compressedAttribute3.y; if (lengthSq < nearSq || lengthSq > farSq) { positionEC.xyz = vec3(0.0); } #endif mat2 rotationMatrix; float mpp; #ifdef DISABLE_DEPTH_DISTANCE float disableDepthTestDistance = compressedAttribute3.z; #endif #ifdef VERTEX_DEPTH_CHECK if (lengthSq < disableDepthTestDistance) { float depthsilon = 10.0; vec2 labelTranslate = textureCoordinateBoundsOrLabelTranslate.xy; vec4 pEC1 = addScreenSpaceOffset(positionEC, dimensions, scale, vec2(0.0), origin, labelTranslate, pixelOffset, alignedAxis, validAlignedAxis, rotation, sizeInMeters, rotationMatrix, mpp); float globeDepth1 = getGlobeDepth(pEC1); if (globeDepth1 != 0.0 && pEC1.z + depthsilon < globeDepth1) { vec4 pEC2 = addScreenSpaceOffset(positionEC, dimensions, scale, vec2(0.0, 1.0), origin, labelTranslate, pixelOffset, alignedAxis, validAlignedAxis, rotation, sizeInMeters, rotationMatrix, mpp); float globeDepth2 = getGlobeDepth(pEC2); if (globeDepth2 != 0.0 && pEC2.z + depthsilon < globeDepth2) { vec4 pEC3 = addScreenSpaceOffset(positionEC, dimensions, scale, vec2(1.0), origin, labelTranslate, pixelOffset, alignedAxis, validAlignedAxis, rotation, sizeInMeters, rotationMatrix, mpp); float globeDepth3 = getGlobeDepth(pEC3); if (globeDepth3 != 0.0 && pEC3.z + depthsilon < globeDepth3) { positionEC.xyz = vec3(0.0); } } } } #endif positionEC = addScreenSpaceOffset(positionEC, imageSize, scale, direction, origin, translate, pixelOffset, alignedAxis, validAlignedAxis, rotation, sizeInMeters, rotationMatrix, mpp); gl_Position = czm_projection * positionEC; v_textureCoordinates = textureCoordinates; #ifdef LOG_DEPTH czm_vertexLogDepth(); #endif #ifdef DISABLE_DEPTH_DISTANCE if (disableDepthTestDistance == 0.0 && czm_minimumDisableDepthTestDistance != 0.0) { disableDepthTestDistance = czm_minimumDisableDepthTestDistance; } if (disableDepthTestDistance != 0.0) { // Don't try to "multiply both sides" by w. Greater/less-than comparisons won't work for negative values of w. float zclip = gl_Position.z / gl_Position.w; bool clipped = (zclip < -1.0 || zclip > 1.0); if (!clipped && (disableDepthTestDistance < 0.0 || (lengthSq > 0.0 && lengthSq < disableDepthTestDistance))) { // Position z on the near plane. gl_Position.z = -gl_Position.w; #ifdef LOG_DEPTH v_depthFromNearPlusOne = 1.0; #endif } } #endif #ifdef FRAGMENT_DEPTH_CHECK if (sizeInMeters) { translate /= mpp; dimensions /= mpp; imageSize /= mpp; } #if defined(ROTATION) || defined(ALIGNED_AXIS) v_rotationMatrix = rotationMatrix; #else v_rotationMatrix = mat2(1.0, 0.0, 0.0, 1.0); #endif float enableDepthCheck = 0.0; if (lengthSq < disableDepthTestDistance) { enableDepthCheck = 1.0; } float dw = floor(clamp(dimensions.x, 0.0, SHIFT_LEFT12)); float dh = floor(clamp(dimensions.y, 0.0, SHIFT_LEFT12)); float iw = floor(clamp(imageSize.x, 0.0, SHIFT_LEFT12)); float ih = floor(clamp(imageSize.y, 0.0, SHIFT_LEFT12)); v_compressed.x = eyeDepth; v_compressed.y = applyTranslate * SHIFT_LEFT1 + enableDepthCheck; v_compressed.z = dw * SHIFT_LEFT12 + dh; v_compressed.w = iw * SHIFT_LEFT12 + ih; v_originTextureCoordinateAndTranslate.xy = depthOrigin; v_originTextureCoordinateAndTranslate.zw = translate; v_textureCoordinateBounds = textureCoordinateBoundsOrLabelTranslate; #endif #ifdef SDF vec4 outlineColor; float outlineWidth; temp = sdf.x; temp = temp * SHIFT_RIGHT8; outlineColor.b = (temp - floor(temp)) * SHIFT_LEFT8; temp = floor(temp) * SHIFT_RIGHT8; outlineColor.g = (temp - floor(temp)) * SHIFT_LEFT8; outlineColor.r = floor(temp); temp = sdf.y; temp = temp * SHIFT_RIGHT8; float temp3 = (temp - floor(temp)) * SHIFT_LEFT8; temp = floor(temp) * SHIFT_RIGHT8; outlineWidth = (temp - floor(temp)) * SHIFT_LEFT8; outlineColor.a = floor(temp); outlineColor /= 255.0; v_outlineWidth = outlineWidth / 255.0; v_outlineColor = outlineColor; v_outlineColor.a *= translucency; #endif v_pickColor = pickColor; v_color = color; v_color.a *= translucency; v_splitDirection = splitDirection; } `;var qvn=T(S(),1);var Evn=T(S(),1);var Lvn=T(S(),1),wYe=Object.freeze({NONE:0,LOADING:2,LOADED:3,ERROR:4,FAILED:5}),os=wYe;function Vb(e){this._billboardCollection=e,this._id=void 0,this._loadState=os.NONE,this._loadError=void 0,this._index=-1,this._width=void 0,this._height=void 0,this._hasSubregion=!1,this.dirty=!1}Object.defineProperties(Vb.prototype,{loadError:{get:function(){return this._loadError}},loadState:{get:function(){return this._loadState}},ready:{get:function(){return this._loadState===os.LOADED}},hasImage:{get:function(){return this._loadState!==os.NONE}},id:{get:function(){return this._id}},width:{get:function(){return this._width}},height:{get:function(){return this._height}}});Vb.prototype.unload=async function(){this._loadState!==os.NONE&&(this._id=void 0,this._loadError=void 0,this._loadState=os.NONE,this._index=-1,this._width=void 0,this._height=void 0,this.dirty=!0)};Vb.prototype.loadImage=async function(e,t){if(this._id===e)return;let n=this._billboardCollection,i=n.billboardTextureCache,o=i.get(e);if(l(o)&&t.loadState===os.LOADING||t.loadState===os.LOADED){Vb.clone(o,this);return}l(o)||(o=new Vb(n),i.set(e,o)),o._id=this._id=e,o._loadState=this._loadState=os.LOADING,o._loadError=this._loadError=void 0;let r,s=this._billboardCollection.textureAtlas;try{r=await s.addImage(e,t)}catch(c){if(o._loadState=os.ERROR,o._loadError=c,this._id!==e)return;this._loadState=os.ERROR,this._loadError=c;return}if(!l(r)||r===-1){if(o._loadState=os.FAILED,o._index=-1,this._id!==e)return;this._loadState=os.FAILED,this._index=-1;return}o._index=r,o._loadState=os.LOADED;let a=s.rectangles[r];o._width=a.width,o._height=a.height,this._id===e&&(this._index=r,this._loadState=os.LOADED,this._width=a.width,this._height=a.height,this.dirty=!0)};Vb.prototype.addImageSubRegion=async function(e,t){this._id=e,this._loadState=os.LOADING,this._loadError=void 0,this._hasSubregion=!0;let n,i=this._billboardCollection.textureAtlas;try{n=await i.addImageSubRegion(e,t)}catch(o){this._loadState=os.ERROR,this._loadError=o;return}if(!l(n)||n===-1){this._loadState=os.FAILED,this._index=-1,this._width=void 0,this._height=void 0;return}this._width=t.width,this._height=t.height,this._index=n,this._loadState=os.LOADED,this.dirty=!0};Vb.prototype.computeTextureCoordinates=function(e){return this._billboardCollection.textureAtlas.computeTextureCoordinates(this._index,e)};Vb.clone=function(e,t){if(t._id=e._id,t._loadState=e._loadState,t._loadError=void 0,t._index=e._index,t._width=e._width,t._height=e._height,t._hasSubregion=e._hasSubregion,e.ready){t.dirty=!0;return}return(async()=>{let i=e._id;await e._billboardCollection.textureAtlas._indexPromiseById.get(i),t._id===i&&(e._hasSubregion&&await Promise.resolve(),t._id=i,t._loadState=e._loadState,t._loadError=e._loadError,t._index=e._index,t._width=e._width,t._height=e._height,t.dirty=!0)})(),t};var Lb=Vb;function gi(e,t){e=y(e,y.EMPTY_OBJECT);let n=e.translucencyByDistance,i=e.pixelOffsetScaleByDistance,o=e.scaleByDistance,r=e.distanceDisplayCondition;l(n)&&(n=Ut.clone(n)),l(i)&&(i=Ut.clone(i)),l(o)&&(o=Ut.clone(o)),l(r)&&(r=Ft.clone(r)),this._show=y(e.show,!0),this._position=m.clone(y(e.position,m.ZERO)),this._actualPosition=m.clone(this._position),this._pixelOffset=D.clone(y(e.pixelOffset,D.ZERO)),this._translate=new D(0,0),this._eyeOffset=m.clone(y(e.eyeOffset,m.ZERO)),this._heightReference=y(e.heightReference,Ke.NONE),this._verticalOrigin=y(e.verticalOrigin,An.CENTER),this._horizontalOrigin=y(e.horizontalOrigin,xi.CENTER),this._scale=y(e.scale,1),this._color=B.clone(y(e.color,B.WHITE)),this._rotation=y(e.rotation,0),this._alignedAxis=m.clone(y(e.alignedAxis,m.ZERO)),this._width=e.width,this._height=e.height,this._scaleByDistance=o,this._translucencyByDistance=n,this._pixelOffsetScaleByDistance=i,this._sizeInMeters=y(e.sizeInMeters,!1),this._distanceDisplayCondition=r,this._disableDepthTestDistance=e.disableDepthTestDistance,this._id=e.id,this._collection=y(e.collection,t),this._pickId=void 0,this._pickPrimitive=y(e._pickPrimitive,this),this._billboardCollection=t,this._dirty=!1,this._index=-1,this._batchIndex=void 0,this._imageTexture=new Lb(t),this._imageWidth=void 0,this._imageHeight=void 0,this._labelDimensions=void 0,this._labelHorizontalOrigin=void 0,this._labelTranslate=void 0;let s=e.image,a=e.imageId;l(s)&&(l(a)||(typeof s=="string"?a=s:l(s.src)?a=s.src:a=Jn()),this._imageTexture.loadImage(a,s)),l(e.imageSubRegion)&&this._imageTexture.addImageSubRegion(a,e.imageSubRegion),this._actualClampedPosition=void 0,this._removeCallbackFunc=void 0,this._mode=oe.SCENE3D,this._clusterShow=!0,this._outlineColor=B.clone(y(e.outlineColor,B.BLACK)),this._outlineWidth=y(e.outlineWidth,0),this._updateClamping(),this._splitDirection=y(e.splitDirection,Fr.NONE)}var dce=gi.SHOW_INDEX=0,yk=gi.POSITION_INDEX=1,pce=gi.PIXEL_OFFSET_INDEX=2,FYe=gi.EYE_OFFSET_INDEX=3,AYe=gi.HORIZONTAL_ORIGIN_INDEX=4,MYe=gi.VERTICAL_ORIGIN_INDEX=5,NYe=gi.SCALE_INDEX=6,uce=gi.IMAGE_INDEX_INDEX=7,mce=gi.COLOR_INDEX=8,kYe=gi.ROTATION_INDEX=9,UYe=gi.ALIGNED_AXIS_INDEX=10,DYe=gi.SCALE_BY_DISTANCE_INDEX=11,BYe=gi.TRANSLUCENCY_BY_DISTANCE_INDEX=12,OYe=gi.PIXEL_OFFSET_SCALE_BY_DISTANCE_INDEX=13,YYe=gi.DISTANCE_DISPLAY_CONDITION=14,HYe=gi.DISABLE_DEPTH_DISTANCE=15;gi.TEXTURE_COORDINATE_BOUNDS=16;var hce=gi.SDF_INDEX=17,zYe=gi.SPLIT_DIRECTION_INDEX=18;gi.NUMBER_OF_PROPERTIES=19;function or(e,t){let n=e._billboardCollection;l(n)&&(n._updateBillboard(e,t),e._dirty=!0)}Object.defineProperties(gi.prototype,{show:{get:function(){return this._show},set:function(e){this._show!==e&&(this._show=e,or(this,dce))}},position:{get:function(){return this._position},set:function(e){let t=this._position;m.equals(t,e)||(m.clone(e,t),m.clone(e,this._actualPosition),this._updateClamping(),or(this,yk))}},heightReference:{get:function(){return this._heightReference},set:function(e){let t=this._heightReference;e!==t&&(this._heightReference=e,this._updateClamping(),or(this,yk))}},pixelOffset:{get:function(){return this._pixelOffset},set:function(e){let t=this._pixelOffset;D.equals(t,e)||(D.clone(e,t),or(this,pce))}},scaleByDistance:{get:function(){return this._scaleByDistance},set:function(e){let t=this._scaleByDistance;Ut.equals(t,e)||(this._scaleByDistance=Ut.clone(e,t),or(this,DYe))}},translucencyByDistance:{get:function(){return this._translucencyByDistance},set:function(e){let t=this._translucencyByDistance;Ut.equals(t,e)||(this._translucencyByDistance=Ut.clone(e,t),or(this,BYe))}},pixelOffsetScaleByDistance:{get:function(){return this._pixelOffsetScaleByDistance},set:function(e){let t=this._pixelOffsetScaleByDistance;Ut.equals(t,e)||(this._pixelOffsetScaleByDistance=Ut.clone(e,t),or(this,OYe))}},eyeOffset:{get:function(){return this._eyeOffset},set:function(e){let t=this._eyeOffset;m.equals(t,e)||(m.clone(e,t),or(this,FYe))}},horizontalOrigin:{get:function(){return this._horizontalOrigin},set:function(e){this._horizontalOrigin!==e&&(this._horizontalOrigin=e,or(this,AYe))}},verticalOrigin:{get:function(){return this._verticalOrigin},set:function(e){this._verticalOrigin!==e&&(this._verticalOrigin=e,or(this,MYe))}},scale:{get:function(){return this._scale},set:function(e){this._scale!==e&&(this._scale=e,or(this,NYe))}},color:{get:function(){return this._color},set:function(e){let t=this._color;B.equals(t,e)||(B.clone(e,t),or(this,mce))}},rotation:{get:function(){return this._rotation},set:function(e){this._rotation!==e&&(this._rotation=e,or(this,kYe))}},alignedAxis:{get:function(){return this._alignedAxis},set:function(e){let t=this._alignedAxis;m.equals(t,e)||(m.clone(e,t),or(this,UYe))}},width:{get:function(){return y(this._width,this._imageTexture.width)},set:function(e){this._width!==e&&(this._width=e,or(this,uce))}},height:{get:function(){return y(this._height,this._imageTexture.height)},set:function(e){this._height!==e&&(this._height=e,or(this,uce))}},sizeInMeters:{get:function(){return this._sizeInMeters},set:function(e){this._sizeInMeters!==e&&(this._sizeInMeters=e,or(this,mce))}},distanceDisplayCondition:{get:function(){return this._distanceDisplayCondition},set:function(e){Ft.equals(e,this._distanceDisplayCondition)||(this._distanceDisplayCondition=Ft.clone(e,this._distanceDisplayCondition),or(this,YYe))}},disableDepthTestDistance:{get:function(){return this._disableDepthTestDistance},set:function(e){this._disableDepthTestDistance!==e&&(this._disableDepthTestDistance=e,or(this,HYe))}},id:{get:function(){return this._id},set:function(e){this._id=e,l(this._pickId)&&(this._pickId.object.id=e)}},pickPrimitive:{get:function(){return this._pickPrimitive},set:function(e){this._pickPrimitive=e,l(this._pickId)&&(this._pickId.object.primitive=e)}},pickId:{get:function(){return this._pickId}},image:{get:function(){return this._imageTexture.id},set:function(e){if(!l(e)){this._imageTexture.unload();return}let t;typeof e=="string"?t=e:e instanceof Re?t=e._url:l(e.src)?t=e.src:t=Jn(),this._imageTexture.loadImage(t,e)}},ready:{get:function(){return this._imageTexture.ready}},loadError:{get:function(){return this._imageTexture.loadError}},textureDirty:{get:function(){return this._imageTexture.dirty},set:function(e){this._imageTexture.dirty=e}},_clampedPosition:{get:function(){return this._actualClampedPosition},set:function(e){this._actualClampedPosition=m.clone(e,this._actualClampedPosition),or(this,yk)}},clusterShow:{get:function(){return this._clusterShow},set:function(e){this._clusterShow!==e&&(this._clusterShow=e,or(this,dce))}},outlineColor:{get:function(){return this._outlineColor},set:function(e){let t=this._outlineColor;B.equals(t,e)||(B.clone(e,t),or(this,hce))}},outlineWidth:{get:function(){return this._outlineWidth},set:function(e){this._outlineWidth!==e&&(this._outlineWidth=e,or(this,hce))}},splitDirection:{get:function(){return this._splitDirection},set:function(e){this._splitDirection!==e&&(this._splitDirection=e,or(this,zYe))}}});gi.prototype.getPickId=function(e){return l(this._pickId)||(this._pickId=e.createPickId({primitive:this._pickPrimitive,collection:this._collection,id:this._id})),this._pickId};gi.prototype._updateClamping=function(){gi._updateClamping(this._billboardCollection,this)};var xk=new he;gi._updateClamping=function(e,t){if(!l(e)||!l(e._scene))return;let n=e._scene,i=y(n.ellipsoid,ne.default),o=n.frameState.mode,r=o!==t._mode;if(t._mode=o,(t._heightReference===Ke.NONE||r)&&l(t._removeCallbackFunc)&&(t._removeCallbackFunc(),t._removeCallbackFunc=void 0,t._clampedPosition=void 0),t._heightReference===Ke.NONE||!l(t._position))return;l(t._removeCallbackFunc)&&t._removeCallbackFunc();let s=i.cartesianToCartographic(t._position);if(!l(s)){t._actualClampedPosition=void 0;return}function a(d){let u=i.cartographicToCartesian(d,t._clampedPosition);lC(t._heightReference)&&(t._mode===oe.SCENE3D?(d.height+=s.height,i.cartographicToCartesian(d,u)):u.x+=s.height),t._clampedPosition=u}t._removeCallbackFunc=n.updateHeight(s,a,t._heightReference),he.clone(s,xk);let c=n.getHeight(s,t._heightReference);l(c)&&(xk.height=c),a(xk)};gi.prototype.computeTextureCoordinates=function(e){return this._imageTexture.computeTextureCoordinates(e)};gi.prototype.setImage=function(e,t){this._imageTexture.loadImage(e,t)};gi.prototype.setImageTexture=function(e){Lb.clone(e,this._imageTexture)};gi.prototype.setImageSubRegion=function(e,t){this._imageTexture.addImageSubRegion(e,t)};gi.prototype._setTranslate=function(e){let t=this._translate;D.equals(t,e)||(D.clone(e,t),or(this,pce))};gi.prototype._getActualPosition=function(){return l(this._clampedPosition)?this._clampedPosition:this._actualPosition};gi.prototype._setActualPosition=function(e){l(this._clampedPosition)||m.clone(e,this._actualPosition),or(this,yk)};var fce=new re;gi._computeActualPosition=function(e,t,n,i){return l(e._clampedPosition)?(n.mode!==e._mode&&e._updateClamping(),e._clampedPosition):n.mode===oe.SCENE3D?t:(M.multiplyByPoint(i,t,fce),Bi.computeActualEllipsoidPosition(n,fce))};var bce=new m;gi._computeScreenSpacePosition=function(e,t,n,i,o,r){let s=M.multiplyByPoint(e,t,bce),a=Bi.worldWithEyeOffsetToWindowCoordinates(o,s,n,r);if(l(a))return D.add(a,i,a),a};var gk=new D(0,0);gi.prototype.computeScreenSpacePosition=function(e,t){let n=this._billboardCollection;l(t)||(t=new D),D.clone(this._pixelOffset,gk),D.add(gk,this._translate,gk);let i=n.modelMatrix,o=this._position;if(l(this._clampedPosition)&&(o=this._clampedPosition,e.mode!==oe.SCENE3D)){let s=e.mapProjection,a=s.ellipsoid,c=s.unproject(o,xk);o=a.cartographicToCartesian(c,bce),i=M.IDENTITY}return gi._computeScreenSpacePosition(i,o,this._eyeOffset,gk,e,t)};gi.getScreenSpaceBoundingBox=function(e,t,n){let i=e.width,o=e.height,r=e.scale;i*=r,o*=r;let s=t.x;e.horizontalOrigin===xi.RIGHT?s-=i:e.horizontalOrigin===xi.CENTER&&(s-=i*.5);let a=t.y;return e.verticalOrigin===An.BOTTOM||e.verticalOrigin===An.BASELINE?a-=o:e.verticalOrigin===An.CENTER&&(a-=o*.5),l(n)||(n=new He),n.x=s,n.y=a,n.width=i,n.height=o,n};gi.prototype.equals=function(e){return this===e||l(e)&&this._id===e._id&&m.equals(this._position,e._position)&&this.image===e.image&&this._show===e._show&&this._scale===e._scale&&this._verticalOrigin===e._verticalOrigin&&this._horizontalOrigin===e._horizontalOrigin&&this._heightReference===e._heightReference&&B.equals(this._color,e._color)&&D.equals(this._pixelOffset,e._pixelOffset)&&D.equals(this._translate,e._translate)&&m.equals(this._eyeOffset,e._eyeOffset)&&Ut.equals(this._scaleByDistance,e._scaleByDistance)&&Ut.equals(this._translucencyByDistance,e._translucencyByDistance)&&Ut.equals(this._pixelOffsetScaleByDistance,e._pixelOffsetScaleByDistance)&&Ft.equals(this._distanceDisplayCondition,e._distanceDisplayCondition)&&this._disableDepthTestDistance===e._disableDepthTestDistance&&this._splitDirection===e._splitDirection};gi.prototype._destroy=function(){l(this._customData)&&(this._billboardCollection._scene.globe._surface.removeTileCustomData(this._customData),this._customData=void 0),l(this._removeCallbackFunc)&&(this._removeCallbackFunc(),this._removeCallbackFunc=void 0),this.image=void 0,this._pickId=this._pickId&&this._pickId.destroy(),this._billboardCollection=void 0};var ho=gi;var ewn=T(S(),1),KYe={OPAQUE:0,TRANSLUCENT:1,OPAQUE_AND_TRANSLUCENT:2},Ro=Object.freeze(KYe);var nwn=T(S(),1),JYe={FONT_SIZE:48,PADDING:10,RADIUS:8,CUTOFF:.25},js=Object.freeze(JYe);var Twn=T(S(),1);var swn=T(S(),1);function D2({x:e,y:t,width:n,height:i}){this.rectangle=new He(e,t,n,i),this.childNode1=void 0,this.childNode2=void 0,this.index=void 0}function Hz({width:e,height:t,borderPadding:n}){this._width=e,this._height=t,this._borderPadding=n,this._root=new D2({x:n,y:n,width:e-2*n,height:t-2*n})}Hz.prototype.pack=function(e,{width:t,height:n}){let i=this._findNode(this._root,{width:t,height:n});if(l(i))return i.index=e,i};Hz.prototype._findNode=function(e,{width:t,height:n}){if(l(e)){if(!l(e.childNode1)&&!l(e.childNode2)){if(l(e.index))return;let{rectangle:i}=e,o=i.width,r=i.height,s=o-t,a=r-n;return s<0||a<0?void 0:s===0&&a===0?e:s>a?(e.childNode1=new D2({x:i.x,y:i.y,width:t,height:r}),e.childNode2=new D2({x:i.x+t,y:i.y,width:s,height:r}),this._findNode(e.childNode1,{width:t,height:n})):(e.childNode1=new D2({x:i.x,y:i.y,width:o,height:n}),e.childNode2=new D2({x:i.x,y:i.y+n,width:o,height:a}),this._findNode(e.childNode1,{width:t,height:n}))}return this._findNode(e.childNode1,{width:t,height:n})||this._findNode(e.childNode2,{width:t,height:n})}};var x1=Hz;var gce=16;function Dl(e){var i;e=y(e,y.EMPTY_OBJECT);let t=y(e.borderWidthInPixels,1),n=(i=e.initialSize)!=null?i:new D(gce,gce);this._pixelFormat=y(e.pixelFormat,ot.RGBA),this._sampler=e.sampler,this._borderWidthInPixels=t,this._initialSize=n,this._texturePacker=void 0,this._rectangles=[],this._subRegions=new Map,this._guid=Jn(),this._imagesToAddQueue=[],this._indexById=new Map,this._indexPromiseById=new Map,this._nextIndex=0}Object.defineProperties(Dl.prototype,{borderWidthInPixels:{get:function(){return this._borderWidthInPixels}},rectangles:{get:function(){return this._rectangles}},texture:{get:function(){return this._texture}},pixelFormat:{get:function(){return this._pixelFormat}},sampler:{get:function(){return this._sampler}},numberOfImages:{get:function(){return this._nextIndex}},guid:{get:function(){return this._guid}},sizeInBytes:{get:function(){return l(this._texture)?this._texture.sizeInBytes:0}}});Dl.prototype.computeTextureCoordinates=function(e,t){let n=this._texture,i=this._rectangles[e];if(l(t)||(t=new He),!l(i))return t.x=0,t.y=0,t.width=0,t.height=0,t;let o=n.width,r=n.height,s=i.width,a=i.height,c=i.x,d=i.y,u=this._subRegions.get(e);if(l(u)){let h=this._rectangles[u];c+=h.x,d+=h.y}return t.x=c/o,t.y=d/r,t.width=s/o,t.height=a/r,t};Dl.prototype._copyFromTexture=function(e,t,n,i){let o=this._pixelFormat,r=this._sampler,s=new Wt({context:e,height:n,width:t,pixelFormat:o,sampler:r}),a=e._gl,c=s._textureTarget,d=this._texture,u=new Ar({context:e,colorTextures:[d],destroyAttachments:!1});a.activeTexture(a.TEXTURE0),a.bindTexture(c,s._texture),u._bind();let h=this.rectangles,p=this._subRegions;for(let g=0;gnew yce({index:L,image:V})).filter((V,L)=>l(V.image)&&!l(c.get(L))),u=0,h=0,p=0;for(let V=t;V=1;)f*=2,s>a?a*=f:s*=f;d.sort(({image:V},{image:L})=>L.height*L.width-V.height*V.width);let x=new Array(this._nextIndex);for(let V of this._subRegions.keys())l(c.get(V))&&(x[V]=i[V]);let _,C=!1;for(;!C;){_=new x1({height:a,width:s,borderPadding:n});let V;for(V=0;Va?a*=2:s*=2;break}x[L]=G.rectangle}C=V===d.length}this._texturePacker=_,this._texture=this._copyFromTexture(e,s,a,x),r.destroy(),this._rectangles=x,this._guid=Jn()};Dl.prototype.getImageIndex=function(e){return this._indexById.get(e)};Dl.prototype._copyImageToTexture=function({index:e,image:t,resolve:n,reject:i}){let o=this._texture,r=this._rectangles[e];try{o.copyFrom({source:t,xOffset:r.x,yOffset:r.y}),l(n)&&n(e)}catch(s){if(l(i)){i(s);return}}};function yce({index:e,image:t,resolve:n,reject:i}){this.index=e,this.image=t,this.resolve=n,this.reject=i,this.rectangle=void 0}Dl.prototype._addImage=function(e,t){return new Promise((n,i)=>{this._imagesToAddQueue.push(new yce({index:e,image:t,resolve:n,reject:i})),this._imagesToAddQueue.sort(({image:o},{image:r})=>r.height*r.width-o.height*o.width)})};Dl.prototype._processImageQueue=function(e){let t=this._imagesToAddQueue;if(t.length===0)return!1;this._rectangles.length=this._nextIndex;let n,i;for(n=0;n(t=await QYe(t,e),this.isDestroyed()||!l(t)?-1:this._addImage(i,t)))(),this._indexPromiseById.set(e,n),n};Dl.prototype.addImageSubRegion=function(e,t){let n=this._indexById.get(e);if(!l(n))throw new ce(`image with id "${e}" not found in the atlas.`);let i=this._indexPromiseById.get(e);for(let[r,s]of this._subRegions.entries())if(n===s&&this._rectangles[r].equals(t))return i.then(c=>c===-1?-1:r);let o=this._nextIndex++;return this._subRegions.set(o,n),this._rectangles[o]=t.clone(),i.then(r=>{if(r===-1)return-1;let s=this._rectangles[r];return o})};Dl.prototype.isDestroyed=function(){return!1};Dl.prototype.destroy=function(){return this._texture=this._texture&&this._texture.destroy(),this._imagesToAddQueue.forEach(({resolve:e})=>{l(e)&&e(-1)}),me(this)};var M_=Dl;var jYe=ho.SHOW_INDEX,B2=ho.POSITION_INDEX,xce=ho.PIXEL_OFFSET_INDEX,_ce=ho.EYE_OFFSET_INDEX,qYe=ho.HORIZONTAL_ORIGIN_INDEX,$Ye=ho.VERTICAL_ORIGIN_INDEX,eHe=ho.SCALE_INDEX,N_=ho.IMAGE_INDEX_INDEX,Tce=ho.COLOR_INDEX,tHe=ho.ROTATION_INDEX,nHe=ho.ALIGNED_AXIS_INDEX,Sce=ho.SCALE_BY_DISTANCE_INDEX,Cce=ho.TRANSLUCENCY_BY_DISTANCE_INDEX,Vce=ho.PIXEL_OFFSET_SCALE_BY_DISTANCE_INDEX,Lce=ho.DISTANCE_DISPLAY_CONDITION,iHe=ho.DISABLE_DEPTH_DISTANCE,oHe=ho.TEXTURE_COORDINATE_BOUNDS,Rce=ho.SDF_INDEX,Zce=ho.SPLIT_DIRECTION_INDEX,$z=ho.NUMBER_OF_PROPERTIES,fo,rHe={positionHighAndScale:0,positionLowAndRotation:1,compressedAttribute0:2,compressedAttribute1:3,compressedAttribute2:4,eyeOffset:5,scaleByDistance:6,pixelOffsetScaleByDistance:7,compressedAttribute3:8,textureCoordinateBoundsOrLabelTranslate:9,a_batchId:10,sdf:11,splitDirection:12},sHe={direction:0,positionHighAndScale:1,positionLowAndRotation:2,compressedAttribute0:3,compressedAttribute1:4,compressedAttribute2:5,eyeOffset:6,scaleByDistance:7,pixelOffsetScaleByDistance:8,compressedAttribute3:9,textureCoordinateBoundsOrLabelTranslate:10,a_batchId:11,sdf:12,splitDirection:13};function Nu(e){e=y(e,y.EMPTY_OBJECT),this._scene=e.scene,this._batchTable=e.batchTable;let t=e.textureAtlas;l(t)||(t=new M_),this._textureAtlas=t,this._textureAtlasGUID=t.guid,this._destroyTextureAtlas=!0,this._billboardTextureCache=new Map,this._sp=void 0,this._spTranslucent=void 0,this._rsOpaque=void 0,this._rsTranslucent=void 0,this._vaf=void 0,this._billboards=[],this._billboardsToUpdate=[],this._billboardsToUpdateIndex=0,this._billboardsRemoved=!1,this._createVertexArray=!1,this._shaderRotation=!1,this._compiledShaderRotation=!1,this._shaderAlignedAxis=!1,this._compiledShaderAlignedAxis=!1,this._shaderScaleByDistance=!1,this._compiledShaderScaleByDistance=!1,this._shaderTranslucencyByDistance=!1,this._compiledShaderTranslucencyByDistance=!1,this._shaderPixelOffsetScaleByDistance=!1,this._compiledShaderPixelOffsetScaleByDistance=!1,this._shaderDistanceDisplayCondition=!1,this._compiledShaderDistanceDisplayCondition=!1,this._shaderDisableDepthDistance=!1,this._compiledShaderDisableDepthDistance=!1,this._shaderClampToGround=!1,this._compiledShaderClampToGround=!1,this._propertiesChanged=new Uint32Array($z),this._maxSize=0,this._maxEyeOffset=0,this._maxScale=1,this._maxPixelOffset=0,this._allHorizontalCenter=!0,this._allVerticalCenter=!0,this._allSizedInMeters=!0,this._baseVolume=new de,this._baseVolumeWC=new de,this._baseVolume2D=new de,this._boundingVolume=new de,this._boundingVolumeDirty=!1,this._colorCommands=[],this._allBillboardsReady=!1,this.show=y(e.show,!0),this.modelMatrix=M.clone(y(e.modelMatrix,M.IDENTITY)),this._modelMatrix=M.clone(M.IDENTITY),this.debugShowBoundingVolume=y(e.debugShowBoundingVolume,!1),this.debugShowTextureAtlas=y(e.debugShowTextureAtlas,!1),this.blendOption=y(e.blendOption,Ro.OPAQUE_AND_TRANSLUCENT),this._blendOption=void 0,this._mode=oe.SCENE3D,this._buffersUsage=[ke.STATIC_DRAW,ke.STATIC_DRAW,ke.STATIC_DRAW,ke.STATIC_DRAW,ke.STATIC_DRAW,ke.STATIC_DRAW,ke.STATIC_DRAW,ke.STATIC_DRAW,ke.STATIC_DRAW,ke.STATIC_DRAW,ke.STATIC_DRAW,ke.STATIC_DRAW,ke.STATIC_DRAW,ke.STATIC_DRAW,ke.STATIC_DRAW,ke.STATIC_DRAW,ke.STATIC_DRAW],this._highlightColor=B.clone(B.WHITE),this._uniforms={u_atlas:()=>this.textureAtlas.texture,u_highlightColor:()=>this._highlightColor};let n=this._scene;l(n)&&l(n.terrainProviderChanged)&&(this._removeCallbackFunc=n.terrainProviderChanged.addEventListener(function(){let i=this._billboards,o=i.length;for(let r=0;r0)&&(e._shaderDisableDepthDistance=!0,d===Number.POSITIVE_INFINITY&&(d=-1));let h,p;l(i._labelDimensions)?(p=i._labelDimensions.x,h=i._labelDimensions.y):(p=(_=i.width)!=null?_:0,h=(C=i.height)!=null?C:0);let g=Math.floor(W.clamp(p,0,Jz)),f=Math.floor(W.clamp(h,0,Jz)),x=g*Jz+f;e._instanced?(o=i._index,r(o,s,a,d,x)):(o=i._index*4,r(o+0,s,a,d,x),r(o+1,s,a,d,x),r(o+2,s,a,d,x),r(o+3,s,a,d,x))}function kce(e,t,n,i){if(_u(i.heightReference)){let p=e._scene,g=t.context,f=t.globeTranslucencyState.translucent,x=l(p.globe)&&p.globe.depthTestAgainstTerrain;e._shaderClampToGround=g.depthTexture&&!f&&x}let o,r=n[fo.textureCoordinateBoundsOrLabelTranslate];if(Mt.maximumVertexTextureImageUnits>0){let p=0,g=0;l(i._labelTranslate)&&(p=i._labelTranslate.x,g=i._labelTranslate.y),e._instanced?(o=i._index,r(o,p,g,0,0)):(o=i._index*4,r(o+0,p,g,0,0),r(o+1,p,g,0,0),r(o+2,p,g,0,0),r(o+3,p,g,0,0));return}let s=0,a=0,c=0,d=0;if(i.ready){let p=i.computeTextureCoordinates(tK);s=p.x,a=p.y,c=p.width,d=p.height}let u=s+c,h=a+d;e._instanced?(o=i._index,r(o,s,a,u,h)):(o=i._index*4,r(o+0,s,a,u,h),r(o+1,s,a,u,h),r(o+2,s,a,u,h),r(o+3,s,a,u,h))}function pHe(e,t,n,i){if(!l(e._batchTable))return;let o=n[fo.a_batchId],r=i._batchIndex,s;e._instanced?(s=i._index,o(s,r)):(s=i._index*4,o(s+0,r),o(s+1,r),o(s+2,r),o(s+3,r))}function Uce(e,t,n,i){if(!e._sdf)return;let o,r=n[fo.sdf],s=i.outlineColor,a=i.outlineWidth,c=B.floatToByte(s.red),d=B.floatToByte(s.green),u=B.floatToByte(s.blue),h=c*_1+d*If+u,p=a/js.RADIUS,g=B.floatToByte(s.alpha)*_1+B.floatToByte(p)*If;e._instanced?(o=i._index,r(o,h,g)):(o=i._index*4,r(o+0,h+Xce,g),r(o+1,h+Wce,g),r(o+2,h+Pce,g),r(o+3,h+vce,g))}function Dce(e,t,n,i){let o=n[fo.splitDirection],r=0,s=i.splitDirection;l(s)&&(r=s);let a;e._instanced?(a=i._index,o(a,r)):(a=i._index*4,o(a+0,r),o(a+1,r),o(a+2,r),o(a+3,r))}function bHe(e,t,n,i){Ece(e,t,n,i),wce(e,t,n,i),Fce(e,t,n,i),jz(e,t,n,i),qz(e,t,n,i),Ace(e,t,n,i),Mce(e,t,n,i),Nce(e,t,n,i),kce(e,t,n,i),pHe(e,t,n,i),Uce(e,t,n,i),Dce(e,t,n,i)}function Qz(e,t,n,i,o,r){let s;i.mode===oe.SCENE3D?(s=e._baseVolume,e._boundingVolumeDirty=!0):s=e._baseVolume2D;let a=[];for(let c=0;c{if(!this.isDestroyed())return r.update(e.context)}),!l(r.texture))return;gHe(this,e),n=this._billboards,i=n.length;let s=this._billboardsToUpdate,a=this._billboardsToUpdateIndex,c=this._propertiesChanged,d=r.guid,u=this._createVertexArray||this._textureAtlasGUID!==d;this._textureAtlasGUID=d;let h,p=e.passes,g=p.pick;if(u||!g&&this.computeNewBuffersUsage()){this._createVertexArray=!1;for(let P=0;P<$z;++P)c[P]=0;if(this._vaf=this._vaf&&this._vaf.destroy(),i>0){this._vaf=dHe(t,i,this._buffersUsage,this._instanced,this._batchTable,this._sdf),h=this._vaf.writers;for(let P=0;P0){let P=_He;P.length=0,(c[B2]||c[tHe]||c[eHe])&&P.push(Ece),(c[N_]||c[xce]||c[qYe]||c[$Ye]||c[jYe])&&(P.push(wce),this._instanced&&P.push(qz)),(c[N_]||c[nHe]||c[Cce])&&(P.push(Fce),P.push(jz)),(c[N_]||c[Tce])&&P.push(jz),(c[N_]||c[_ce])&&P.push(qz),c[Sce]&&P.push(Ace),c[Vce]&&P.push(Mce),(c[Lce]||c[iHe]||c[N_]||c[B2])&&P.push(Nce),(c[N_]||c[B2])&&P.push(kce),c[Rce]&&P.push(Uce),c[Zce]&&P.push(Dce);let w=P.length;if(h=this._vaf.writers,a/i>.1){for(let A=0;Ai*1.5&&(s.length=i),!l(this._vaf)||!l(this._vaf.va))return;this._boundingVolumeDirty&&(this._boundingVolumeDirty=!1,de.transform(this._baseVolume,this.modelMatrix,this._baseVolumeWC));let f,x=M.IDENTITY;e.mode===oe.SCENE3D?(x=this.modelMatrix,f=de.clone(this._baseVolumeWC,this._boundingVolume)):f=de.clone(this._baseVolume2D,this._boundingVolume),yHe(this,e,f);let _=this._blendOption!==this.blendOption;if(this._blendOption=this.blendOption,_){this._blendOption===Ro.OPAQUE||this._blendOption===Ro.OPAQUE_AND_TRANSLUCENT?this._rsOpaque=Ue.fromCache({depthTest:{enabled:!0,func:ie.LESS},depthMask:!0}):this._rsOpaque=void 0;let P=this._blendOption===Ro.TRANSLUCENT;this._blendOption===Ro.TRANSLUCENT||this._blendOption===Ro.OPAQUE_AND_TRANSLUCENT?this._rsTranslucent=Ue.fromCache({depthTest:{enabled:!0,func:P?ie.LEQUAL:ie.LESS},depthMask:P,blending:hn.ALPHA_BLEND}):this._rsTranslucent=void 0}this._shaderDisableDepthDistance=this._shaderDisableDepthDistance||e.minimumDisableDepthTestDistance!==0;let C,V,L,R,G,I=Mt.maximumVertexTextureImageUnits>0;if(_||this._shaderRotation!==this._compiledShaderRotation||this._shaderAlignedAxis!==this._compiledShaderAlignedAxis||this._shaderScaleByDistance!==this._compiledShaderScaleByDistance||this._shaderTranslucencyByDistance!==this._compiledShaderTranslucencyByDistance||this._shaderPixelOffsetScaleByDistance!==this._compiledShaderPixelOffsetScaleByDistance||this._shaderDistanceDisplayCondition!==this._compiledShaderDistanceDisplayCondition||this._shaderDisableDepthDistance!==this._compiledShaderDisableDepthDistance||this._shaderClampToGround!==this._compiledShaderClampToGround||this._sdf!==this._compiledSDF){C=U2,V=k2,G=[],l(this._batchTable)&&(G.push("VECTOR_TILE"),C=this._batchTable.getVertexShaderCallback(!1,"a_batchId",void 0)(C),V=this._batchTable.getFragmentShaderCallback(!1,void 0)(V)),L=new De({defines:G,sources:[C]}),this._instanced&&L.defines.push("INSTANCED"),this._shaderRotation&&L.defines.push("ROTATION"),this._shaderAlignedAxis&&L.defines.push("ALIGNED_AXIS"),this._shaderScaleByDistance&&L.defines.push("EYE_DISTANCE_SCALING"),this._shaderTranslucencyByDistance&&L.defines.push("EYE_DISTANCE_TRANSLUCENCY"),this._shaderPixelOffsetScaleByDistance&&L.defines.push("EYE_DISTANCE_PIXEL_OFFSET"),this._shaderDistanceDisplayCondition&&L.defines.push("DISTANCE_DISPLAY_CONDITION"),this._shaderDisableDepthDistance&&L.defines.push("DISABLE_DEPTH_DISTANCE"),this._shaderClampToGround&&(I?L.defines.push("VERTEX_DEPTH_CHECK"):L.defines.push("FRAGMENT_DEPTH_CHECK"));let P=1-js.CUTOFF;this._sdf&&L.defines.push("SDF");let w=l(this._batchTable)?"VECTOR_TILE":"";this._blendOption===Ro.OPAQUE_AND_TRANSLUCENT&&(R=new De({defines:["OPAQUE",w],sources:[V]}),this._shaderClampToGround&&(I?R.defines.push("VERTEX_DEPTH_CHECK"):R.defines.push("FRAGMENT_DEPTH_CHECK")),this._sdf&&(R.defines.push("SDF"),R.defines.push(`SDF_EDGE ${P}`)),this._sp=en.replaceCache({context:t,shaderProgram:this._sp,vertexShaderSource:L,fragmentShaderSource:R,attributeLocations:fo}),R=new De({defines:["TRANSLUCENT",w],sources:[V]}),this._shaderClampToGround&&(I?R.defines.push("VERTEX_DEPTH_CHECK"):R.defines.push("FRAGMENT_DEPTH_CHECK")),this._sdf&&(R.defines.push("SDF"),R.defines.push(`SDF_EDGE ${P}`)),this._spTranslucent=en.replaceCache({context:t,shaderProgram:this._spTranslucent,vertexShaderSource:L,fragmentShaderSource:R,attributeLocations:fo})),this._blendOption===Ro.OPAQUE&&(R=new De({defines:[w],sources:[V]}),this._shaderClampToGround&&(I?R.defines.push("VERTEX_DEPTH_CHECK"):R.defines.push("FRAGMENT_DEPTH_CHECK")),this._sdf&&(R.defines.push("SDF"),R.defines.push(`SDF_EDGE ${P}`)),this._sp=en.replaceCache({context:t,shaderProgram:this._sp,vertexShaderSource:L,fragmentShaderSource:R,attributeLocations:fo})),this._blendOption===Ro.TRANSLUCENT&&(R=new De({defines:[w],sources:[V]}),this._shaderClampToGround&&(I?R.defines.push("VERTEX_DEPTH_CHECK"):R.defines.push("FRAGMENT_DEPTH_CHECK")),this._sdf&&(R.defines.push("SDF"),R.defines.push(`SDF_EDGE ${P}`)),this._spTranslucent=en.replaceCache({context:t,shaderProgram:this._spTranslucent,vertexShaderSource:L,fragmentShaderSource:R,attributeLocations:fo})),this._compiledShaderRotation=this._shaderRotation,this._compiledShaderAlignedAxis=this._shaderAlignedAxis,this._compiledShaderScaleByDistance=this._shaderScaleByDistance,this._compiledShaderTranslucencyByDistance=this._shaderTranslucencyByDistance,this._compiledShaderPixelOffsetScaleByDistance=this._shaderPixelOffsetScaleByDistance,this._compiledShaderDistanceDisplayCondition=this._shaderDistanceDisplayCondition,this._compiledShaderDisableDepthDistance=this._shaderDisableDepthDistance,this._compiledShaderClampToGround=this._shaderClampToGround,this._compiledSDF=this._sdf}let v=e.commandList;if(p.render||p.pick){let P=this._colorCommands,w=this._blendOption===Ro.OPAQUE,A=this._blendOption===Ro.OPAQUE_AND_TRANSLUCENT,b=this._vaf.va,Z=b.length,E=this._uniforms,X;l(this._batchTable)?(E=this._batchTable.getUniformMapCallback()(E),X=this._batchTable.getPickId()):X="v_pickColor",P.length=Z;let F=A?Z*2:Z;for(let N=0;N0}},labelOutlineColor:{get:function(){return this._label.outlineColor},set:function(e){this._label.outlineColor=e}},labelOutlineWidth:{get:function(){return this._label.outlineWidth},set:function(e){this._label.outlineWidth=e}},font:{get:function(){return this._label.font},set:function(e){this._label.font=e}},labelStyle:{get:function(){return this._label.style},set:function(e){this._label.style=e}},labelText:{get:function(){return this._label.text},set:function(e){l(e)||(e=""),this._label.text=e}},backgroundColor:{get:function(){return this._label.backgroundColor},set:function(e){this._label.backgroundColor=e}},backgroundPadding:{get:function(){return this._label.backgroundPadding},set:function(e){this._label.backgroundPadding=e}},backgroundEnabled:{get:function(){return this._label.showBackground},set:function(e){this._label.showBackground=e}},scaleByDistance:{get:function(){return this._label.scaleByDistance},set:function(e){this._label.scaleByDistance=e,this._billboard.scaleByDistance=e}},translucencyByDistance:{get:function(){return this._label.translucencyByDistance},set:function(e){this._label.translucencyByDistance=e,this._billboard.translucencyByDistance=e}},distanceDisplayCondition:{get:function(){return this._label.distanceDisplayCondition},set:function(e){this._label.distanceDisplayCondition=e,this._polyline.distanceDisplayCondition=e,this._billboard.distanceDisplayCondition=e}},heightOffset:{get:function(){return this._heightOffset},set:function(e){let t=y(this._heightOffset,0),n=this._content.tileset.ellipsoid,i=n.cartesianToCartographic(this._billboard.position,SHe);i.height=i.height-t+e;let o=n.cartographicToCartesian(i);this._billboard.position=o,this._label.position=this._billboard.position,this._polyline.positions=[this._polyline.positions[0],o],this._heightOffset=e}},anchorLineEnabled:{get:function(){return this._polyline.show},set:function(e){this._polyline.show=e}},anchorLineColor:{get:function(){return this._polyline.material.uniforms.color},set:function(e){this._polyline.material.uniforms.color=B.clone(e,this._polyline.material.uniforms.color)}},image:{get:function(){return this._billboardImage},set:function(e){let t=this._billboardImage!==e;this._billboardImage=e,t&&T1(this)}},disableDepthTestDistance:{get:function(){return this._label.disableDepthTestDistance},set:function(e){this._label.disableDepthTestDistance=e,this._billboard.disableDepthTestDistance=e}},horizontalOrigin:{get:function(){return this._billboard.horizontalOrigin},set:function(e){this._billboard.horizontalOrigin=e}},verticalOrigin:{get:function(){return this._billboard.verticalOrigin},set:function(e){this._billboard.verticalOrigin=e}},labelHorizontalOrigin:{get:function(){return this._label.horizontalOrigin},set:function(e){this._label.horizontalOrigin=e}},labelVerticalOrigin:{get:function(){return this._label.verticalOrigin},set:function(e){this._label.verticalOrigin=e}},content:{get:function(){return this._content}},tileset:{get:function(){return this._content.tileset}},primitive:{get:function(){return this._content.tileset}},pickIds:{get:function(){let e=this._pickIds;return e[0]=this._billboard.pickId,e[1]=this._label.pickId,e[2]=this._polyline.pickId,e}}});xa.defaultColor=B.WHITE;xa.defaultPointOutlineColor=B.BLACK;xa.defaultPointOutlineWidth=0;xa.defaultPointSize=8;function T1(e){let t=e._billboard;if(l(e._billboardImage)&&e._billboardImage!==t.image){t.image=e._billboardImage;return}if(l(e._billboardImage))return;let n=y(e._color,xa.defaultColor),i=y(e._pointOutlineColor,xa.defaultPointOutlineColor),o=y(e._pointOutlineWidth,xa.defaultPointOutlineWidth),r=y(e._pointSize,xa.defaultPointSize),s=e._billboardColor,a=e._billboardOutlineColor,c=e._billboardOutlineWidth,d=e._billboardSize;if(B.equals(n,s)&&B.equals(i,a)&&o===c&&r===d)return;e._billboardColor=B.clone(n,e._billboardColor),e._billboardOutlineColor=B.clone(i,e._billboardOutlineColor),e._billboardOutlineWidth=o,e._billboardSize=r;let u=n.alpha,h=n.toCssColorString(),p=i.toCssColorString(),g=JSON.stringify([h,r,p,o]);t.setImage(g,k_(u,h,p,o,r))}xa.prototype.hasProperty=function(e){return this._content.batchTable.hasProperty(this._batchId,e)};xa.prototype.getPropertyIds=function(e){return this._content.batchTable.getPropertyIds(this._batchId,e)};xa.prototype.getProperty=function(e){return this._content.batchTable.getProperty(this._batchId,e)};xa.prototype.getPropertyInherited=function(e){return Hs.getPropertyInherited(this._content,this._batchId,e)};xa.prototype.setProperty=function(e,t){this._content.batchTable.setProperty(this._batchId,e,t),this._content.featurePropertiesDirty=!0};xa.prototype.isExactClass=function(e){return this._content.batchTable.isExactClass(this._batchId,e)};xa.prototype.isClass=function(e){return this._content.batchTable.isClass(this._batchId,e)};xa.prototype.getExactClassName=function(){return this._content.batchTable.getExactClassName(this._batchId)};var Rb=xa;var aAn=T(S(),1);var xFn=T(S(),1);function CHe(e,t,n,i,o){let r=e.measureText(t);if(!!/\S/.test(t)){let a=document.defaultView.getComputedStyle(e.canvas).getPropertyValue("font-size").replace("px",""),c=document.createElement("canvas"),d=100,u=r.width+d|0,h=3*a,p=h/2;c.width=u,c.height=h;let g=c.getContext("2d");g.font=n,g.fillStyle="white",g.fillRect(0,0,c.width+1,c.height+1),i&&(g.strokeStyle="black",g.lineWidth=e.lineWidth,g.strokeText(t,d/2,p)),o&&(g.fillStyle="black",g.fillText(t,d/2,p));let f=g.getImageData(0,0,u,h).data,x=f.length,_=u*4,C,V,L,R;for(C=0;C=0;--C)if(f[C]!==255){R=C/_|0;break}let G=-1;for(C=0;C]/,o=[],r="",s=ys.LTR,a="",c=e.length;for(let d=0;d";case">":return"<"}}var PHe="\u05D0-\u05EA",vHe="\u0600-\u06FF\u0750-\u077F\u08A0-\u08FF",Jce=new RegExp(`[${PHe}${vHe}]`);function wHe(e){let t=e.split(` `),n="";for(let i=0;id+1?s[d+1].Type===ys.RTL?(c=h+c,a=0):(c=z2(c,a,u.Word),a+=u.Word.length):c=z2(c,0,h)):u.Type===ys.RTL?c=z2(c,a,h):u.Type===ys.LTR?(c+=u.Word,a=c.length):(u.Type===ys.WEAK||u.Type===ys.BRACKETS)&&(d>0&&s[d-1].Type===ys.RTL?s.length>d+1?s[d+1].Type===ys.RTL?c=z2(c,a,h):(c+=u.Word,a=c.length):c+=u.Word:(c+=u.Word,a=c.length))}n+=c,i0,c=t._backgroundBillboard,d=e._backgroundBillboardCollection;a?(l(c)||(c=kHe(d,e),t._backgroundBillboard=c),c.color=t._backgroundColor,c.show=t._show,c.position=t._position,c.eyeOffset=t._eyeOffset,c.pixelOffset=t._pixelOffset,c.horizontalOrigin=xi.LEFT,c.verticalOrigin=t._verticalOrigin,c.heightReference=t._heightReference,c.scale=t.totalScale,c.pickPrimitive=t,c.id=t._id,c.translucencyByDistance=t._translucencyByDistance,c.pixelOffsetScaleByDistance=t._pixelOffsetScaleByDistance,c.scaleByDistance=t._scaleByDistance,c.distanceDisplayCondition=t._distanceDisplayCondition,c.disableDepthTestDistance=t._disableDepthTestDistance,c.clusterShow=t.clusterShow):l(c)&&(d.remove(c),t._backgroundBillboard=c=void 0);let u=e._glyphBillboardCollection,h=u.billboardTextureCache,p=e._textDimensionsCache;for(let g=0;g0&&v.height>0&&!BHe.test(f)){let P=(0,ele.default)(v,{cutoff:js.CUTOFF,radius:js.RADIUS}),w=v.getContext("2d"),A=v.width,b=v.height,Z=w.getImageData(0,0,A,b);for(let E=0;E0?R=G.pop():(R=u.add({collection:e}),R._labelDimensions=new D,R._labelTranslate=new D),L.billboard=R),R.setImageTexture(V),R.show=t._show,R.position=t._position,R.eyeOffset=t._eyeOffset,R.pixelOffset=t._pixelOffset,R.horizontalOrigin=xi.LEFT,R.verticalOrigin=t._verticalOrigin,R.heightReference=t._heightReference,R.scale=t.totalScale,R.pickPrimitive=t,R.id=t._id,R.translucencyByDistance=t._translucencyByDistance,R.pixelOffsetScaleByDistance=t._pixelOffsetScaleByDistance,R.scaleByDistance=t._scaleByDistance,R.distanceDisplayCondition=t._distanceDisplayCondition,R.disableDepthTestDistance=t._disableDepthTestDistance,R._batchIndex=t._batchIndex,R.outlineColor=t.outlineColor,t.style===Yo.FILL_AND_OUTLINE?(R.color=t._fillColor,R.outlineWidth=t.outlineWidth):t.style===Yo.FILL?(R.color=t._fillColor,R.outlineWidth=0):t.style===Yo.OUTLINE&&(R.color=B.TRANSPARENT,R.outlineWidth=t.outlineWidth)}t._repositionAllGlyphs=!0}function $ce(e,t,n){return t===xi.CENTER?-e/2:t===xi.RIGHT?-(e+n.x):n.x}var hr=new D,YHe=new D;function HHe(e){let t=e._glyphs,n=e._renderedText,i=0,o=0,r=[],s=Number.NEGATIVE_INFINITY,a=0,c=1,d=t.length,u=e._backgroundBillboard,h=D.clone(l(u)?e._backgroundPadding:D.ZERO,YHe);h.x/=e._relativeSize,h.y/=e._relativeSize;for(let w=0;w0&&(f===xi.CENTER?V=-o/2-h.x:f===xi.RIGHT?V=-(o+h.x*2):V=0,hr.x=V*g,x===An.TOP?hr.y=p-a-s:x===An.CENTER?hr.y=(p-a)/2-s:x===An.BASELINE?hr.y=-h.y-s:hr.y=0,hr.y=hr.y*g,u.width=G,u.height=I,u._setTranslate(hr),u._labelTranslate=D.clone(hr,u._labelTranslate)),_u(e.heightReference))for(let w=0;w0?Ro.TRANSLUCENT:this.blendOption;t.blendOption=o,n.blendOption=o,t._highlightColor=this._highlightColor,n._highlightColor=this._highlightColor,this._labelsToUpdate.length=0,n.update(e),t.update(e)};Xf.prototype.isDestroyed=function(){return!1};Xf.prototype.destroy=function(){return this.removeAll(),this._glyphBillboardCollection=this._glyphBillboardCollection.destroy(),this._backgroundBillboardCollection=this._backgroundBillboardCollection.destroy(),me(this)};var Wf=Xf;var xMn=T(S(),1);var lAn=T(S(),1),K2=`in vec3 position3DHigh; in vec3 position3DLow; in vec3 position2DHigh; in vec3 position2DLow; in vec3 prevPosition3DHigh; in vec3 prevPosition3DLow; in vec3 prevPosition2DHigh; in vec3 prevPosition2DLow; in vec3 nextPosition3DHigh; in vec3 nextPosition3DLow; in vec3 nextPosition2DHigh; in vec3 nextPosition2DLow; in vec4 texCoordExpandAndBatchIndex; out vec2 v_st; out float v_width; out vec4 v_pickColor; out float v_polylineAngle; void main() { float texCoord = texCoordExpandAndBatchIndex.x; float expandDir = texCoordExpandAndBatchIndex.y; bool usePrev = texCoordExpandAndBatchIndex.z < 0.0; float batchTableIndex = texCoordExpandAndBatchIndex.w; vec2 widthAndShow = batchTable_getWidthAndShow(batchTableIndex); float width = widthAndShow.x + 0.5; float show = widthAndShow.y; if (width < 1.0) { show = 0.0; } vec4 pickColor = batchTable_getPickColor(batchTableIndex); vec4 p, prev, next; if (czm_morphTime == 1.0) { p = czm_translateRelativeToEye(position3DHigh.xyz, position3DLow.xyz); prev = czm_translateRelativeToEye(prevPosition3DHigh.xyz, prevPosition3DLow.xyz); next = czm_translateRelativeToEye(nextPosition3DHigh.xyz, nextPosition3DLow.xyz); } else if (czm_morphTime == 0.0) { p = czm_translateRelativeToEye(position2DHigh.zxy, position2DLow.zxy); prev = czm_translateRelativeToEye(prevPosition2DHigh.zxy, prevPosition2DLow.zxy); next = czm_translateRelativeToEye(nextPosition2DHigh.zxy, nextPosition2DLow.zxy); } else { p = czm_columbusViewMorph( czm_translateRelativeToEye(position2DHigh.zxy, position2DLow.zxy), czm_translateRelativeToEye(position3DHigh.xyz, position3DLow.xyz), czm_morphTime); prev = czm_columbusViewMorph( czm_translateRelativeToEye(prevPosition2DHigh.zxy, prevPosition2DLow.zxy), czm_translateRelativeToEye(prevPosition3DHigh.xyz, prevPosition3DLow.xyz), czm_morphTime); next = czm_columbusViewMorph( czm_translateRelativeToEye(nextPosition2DHigh.zxy, nextPosition2DLow.zxy), czm_translateRelativeToEye(nextPosition3DHigh.xyz, nextPosition3DLow.xyz), czm_morphTime); } #ifdef DISTANCE_DISPLAY_CONDITION vec3 centerHigh = batchTable_getCenterHigh(batchTableIndex); vec4 centerLowAndRadius = batchTable_getCenterLowAndRadius(batchTableIndex); vec3 centerLow = centerLowAndRadius.xyz; float radius = centerLowAndRadius.w; vec2 distanceDisplayCondition = batchTable_getDistanceDisplayCondition(batchTableIndex); float lengthSq; if (czm_sceneMode == czm_sceneMode2D) { lengthSq = czm_eyeHeight2D.y; } else { vec4 center = czm_translateRelativeToEye(centerHigh.xyz, centerLow.xyz); lengthSq = max(0.0, dot(center.xyz, center.xyz) - radius * radius); } float nearSq = distanceDisplayCondition.x * distanceDisplayCondition.x; float farSq = distanceDisplayCondition.y * distanceDisplayCondition.y; if (lengthSq < nearSq || lengthSq > farSq) { show = 0.0; } #endif float polylineAngle; vec4 positionWC = getPolylineWindowCoordinates(p, prev, next, expandDir, width, usePrev, polylineAngle); gl_Position = czm_viewportOrthographic * positionWC * show; v_st.s = texCoord; v_st.t = czm_writeNonPerspective(clamp(expandDir, 0.0, 1.0), gl_Position.w); v_width = width; v_pickColor = pickColor; v_polylineAngle = polylineAngle; } `;var vAn=T(S(),1);var SAn=T(S(),1);var rl={};rl.numberOfPoints=function(e,t,n){let i=m.distance(e,t);return Math.ceil(i/n)};rl.numberOfPointsRhumbLine=function(e,t,n){let i=Math.pow(e.longitude-t.longitude,2)+Math.pow(e.latitude-t.latitude,2);return Math.max(1,Math.ceil(Math.sqrt(i/(n*n))))};var zHe=new he;rl.extractHeights=function(e,t){let n=e.length,i=new Array(n);for(let o=0;o0){t=y(t,M.IDENTITY);let o=M.inverseTransformation(t,KHe),r=M.multiplyByPoint(o,m.ZERO,JHe),s=m.normalize(M.multiplyByPointAsVector(o,m.UNIT_Y,ile),ile),a=cn.fromPointNormal(r,s,QHe),c=m.normalize(M.multiplyByPointAsVector(o,m.UNIT_X,ole),ole),d=cn.fromPointNormal(r,c,jHe),u=1;n.push(m.clone(e[0]));let h=n[0],p=e.length;for(let g=1;g2&&(this._actualPositions===this._positions&&(this._actualPositions=n.slice()),this._actualPositions.push(m.clone(this._actualPositions[0]))),this._length=this._actualPositions.length,this._id=e.id;let i;l(t)&&(i=M.clone(t.modelMatrix)),this._modelMatrix=i,this._segments=vi.wrapLongitude(this._actualPositions,i),this._actualLength=void 0,this._propertiesChanged=new Uint32Array(cle),this._polylineCollection=t,this._dirty=!1,this._pickId=void 0,this._boundingVolume=de.fromPoints(this._actualPositions),this._boundingVolumeWC=de.transform(this._boundingVolume,this._modelMatrix),this._boundingVolume2D=new de}var ale=Id.POSITION_INDEX=0,oze=Id.SHOW_INDEX=1,rze=Id.WIDTH_INDEX=2,sze=Id.MATERIAL_INDEX=3,Q2=Id.POSITION_SIZE_INDEX=4,aze=Id.DISTANCE_DISPLAY_CONDITION=5,cle=Id.NUMBER_OF_PROPERTIES=6;function Gb(e,t){++e._propertiesChanged[t];let n=e._polylineCollection;l(n)&&(n._updatePolyline(e,t),e._dirty=!0)}Object.defineProperties(Id.prototype,{show:{get:function(){return this._show},set:function(e){e!==this._show&&(this._show=e,Gb(this,oze))}},positions:{get:function(){return this._positions},set:function(e){let t=Co(e,m.equalsEpsilon);this._loop&&t.length>2&&(t===e&&(t=e.slice()),t.push(m.clone(t[0]))),(this._actualPositions.length!==t.length||this._actualPositions.length!==this._length)&&Gb(this,Q2),this._positions=e,this._actualPositions=t,this._length=t.length,this._boundingVolume=de.fromPoints(this._actualPositions,this._boundingVolume),this._boundingVolumeWC=de.transform(this._boundingVolume,this._modelMatrix,this._boundingVolumeWC),Gb(this,ale),this.update()}},material:{get:function(){return this._material},set:function(e){this._material!==e&&(this._material=e,Gb(this,sze))}},width:{get:function(){return this._width},set:function(e){let t=this._width;e!==t&&(this._width=e,Gb(this,rze))}},loop:{get:function(){return this._loop},set:function(e){if(e!==this._loop){let t=this._actualPositions;e?t.length>2&&!m.equals(t[0],t[t.length-1])&&(t.length===this._positions.length&&(this._actualPositions=t=this._positions.slice()),t.push(m.clone(t[0]))):t.length>2&&m.equals(t[0],t[t.length-1])&&(t.length-1===this._positions.length?this._actualPositions=this._positions:t.pop()),this._loop=e,Gb(this,Q2)}}},id:{get:function(){return this._id},set:function(e){this._id=e,l(this._pickId)&&(this._pickId.object.id=e)}},pickId:{get:function(){return this._pickId}},isDestroyed:{get:function(){return!l(this._polylineCollection)}},distanceDisplayCondition:{get:function(){return this._distanceDisplayCondition},set:function(e){Ft.equals(e,this._distanceDisplayCondition)||(this._distanceDisplayCondition=Ft.clone(e,this._distanceDisplayCondition),Gb(this,aze))}}});Id.prototype.update=function(){let e=M.IDENTITY;l(this._polylineCollection)&&(e=this._polylineCollection.modelMatrix);let t=this._segments.positions.length,n=this._segments.lengths,i=this._propertiesChanged[ale]>0||this._propertiesChanged[Q2]>0;if((!M.equals(e,this._modelMatrix)||i)&&(this._segments=vi.wrapLongitude(this._actualPositions,e),this._boundingVolumeWC=de.transform(this._boundingVolume,e,this._boundingVolumeWC)),this._modelMatrix=M.clone(e,this._modelMatrix),this._segments.positions.length!==t)Gb(this,Q2);else{let o=n.length;for(let r=0;r2){if(o[cK]||o[lle]){let f=e.mode===oe.SCENE2D?i._boundingVolume2D:i._boundingVolumeWC,x=Hn.fromCartesian(f.center,gle),_=re.fromElements(x.low.x,x.low.y,x.low.z,f.radius,yle);this._batchTable.setBatchedAttribute(i._index,2,x.high),this._batchTable.setBatchedAttribute(i._index,3,_)}if(o[uze]){let f=xle;f.x=0,f.y=Number.MAX_VALUE;let x=i.distanceDisplayCondition;l(x)&&(f.x=x.near,f.y=x.far),this._batchTable.setBatchedAttribute(i._index,4,f)}}i._clean()}}c.length=0,this._polylinesUpdated=!1}o=this._propertiesChanged;for(let c=0;c0){let Y=w.isTranslucent();a>=s?(b=new $e({owner:e}),n.push(b)):b=n[a],++a,Z=Lt(p(w._uniforms),e._uniformMap),b.boundingVolume=de.clone(j2,b.boundingVolume),b.modelMatrix=i,b.shaderProgram=G,b.vertexArray=x.va,b.renderState=Y?e._translucentRS:e._opaqueRS,b.pass=Y?Ge.TRANSLUCENT:Ge.OPAQUE,b.debugShowBoundingVolume=u,b.pickId="v_pickColor",b.uniformMap=Z,b.count=A,b.offset=R,R+=A,A=0,c=!0,r.push(b)}w=X._material,w.update(o),P=F}let N=X._locatorBuckets,O=N.length;for(let Y=0;Y0&&(a>=s?(b=new $e({owner:e}),n.push(b)):b=n[a],++a,Z=Lt(p(w._uniforms),e._uniformMap),b.boundingVolume=de.clone(j2,b.boundingVolume),b.modelMatrix=i,b.shaderProgram=G,b.vertexArray=x.va,b.renderState=w.isTranslucent()?e._translucentRS:e._opaqueRS,b.pass=w.isTranslucent()?Ge.TRANSLUCENT:Ge.OPAQUE,b.debugShowBoundingVolume=u,b.pickId="v_pickColor",b.uniformMap=Z,b.count=A,b.offset=R,c=!0,r.push(b)),P=void 0}}n.length=a}dh.prototype.isDestroyed=function(){return!1};dh.prototype.destroy=function(){return _le(this),dK(this),Tle(this),this._batchTable=this._batchTable&&this._batchTable.destroy(),me(this)};function fze(e){let t=!1,n=e._propertiesChanged,i=e._positionBufferUsage;return n[cK]?(i.bufferUsage!==ke.STREAM_DRAW&&(t=!0,i.bufferUsage=ke.STREAM_DRAW),i.frameCount=100):i.bufferUsage!==ke.STATIC_DRAW&&(i.frameCount===0?(t=!0,i.bufferUsage=ke.STATIC_DRAW):i.frameCount--),t}var ule=[0,0,0];function mle(e,t,n){e._createVertexArray=!1,dK(e),_le(e),gze(e);let i=[[]],o=i[0],r=e._batchTable,s=e._useHighlightColor,a=[0],c=0,d=[[]],u=0,h=e._polylineBuckets,p,g;for(p in h)h.hasOwnProperty(p)&&(g=h[p],g.updateShader(t,r,s),u+=g.lengthOfPositions);if(u>0){let f=e._mode,x=new Float32Array(6*u*3),_=new Float32Array(u*4),C,V=0,L=0,R=0;for(p in h)if(h.hasOwnProperty(p)){g=h[p],g.write(x,_,V,L,R,r,t,n),f===oe.MORPHING&&(l(C)||(C=new Float32Array(6*u*3)),g.writeForMorph(C,V));let Z=g.lengthOfPositions;V+=6*Z*3,L+=Z*4,R+=Z*4,c=g.updateIndices(i,a,d,c)}let G=e._positionBufferUsage.bufferUsage,I=ke.STATIC_DRAW;e._positionBuffer=St.createVertexBuffer({context:t,typedArray:x,usage:G});let v;l(C)&&(v=St.createVertexBuffer({context:t,typedArray:C,usage:G})),e._texCoordExpandAndBatchIndexBuffer=St.createVertexBuffer({context:t,typedArray:_,usage:I});let P=3*Float32Array.BYTES_PER_ELEMENT,w=4*Float32Array.BYTES_PER_ELEMENT,A=0,b=i.length;for(let Z=0;Z0){let E=new Uint16Array(o),X=St.createIndexBuffer({context:t,typedArray:E,usage:ke.STATIC_DRAW,indexDatatype:Me.UNSIGNED_SHORT});A+=a[Z];let F=6*(Z*(P*W.SIXTY_FOUR_KILOBYTES)-A*P),N=P+F,O=P+N,U=P+O,Y=P+U,k=P+Y,H=Z*(w*W.SIXTY_FOUR_KILOBYTES)-A*w,K=[{index:Ol.position3DHigh,componentsPerAttribute:3,componentDatatype:Q.FLOAT,offsetInBytes:F,strideInBytes:6*P},{index:Ol.position3DLow,componentsPerAttribute:3,componentDatatype:Q.FLOAT,offsetInBytes:N,strideInBytes:6*P},{index:Ol.position2DHigh,componentsPerAttribute:3,componentDatatype:Q.FLOAT,offsetInBytes:F,strideInBytes:6*P},{index:Ol.position2DLow,componentsPerAttribute:3,componentDatatype:Q.FLOAT,offsetInBytes:N,strideInBytes:6*P},{index:Ol.prevPosition3DHigh,componentsPerAttribute:3,componentDatatype:Q.FLOAT,offsetInBytes:O,strideInBytes:6*P},{index:Ol.prevPosition3DLow,componentsPerAttribute:3,componentDatatype:Q.FLOAT,offsetInBytes:U,strideInBytes:6*P},{index:Ol.prevPosition2DHigh,componentsPerAttribute:3,componentDatatype:Q.FLOAT,offsetInBytes:O,strideInBytes:6*P},{index:Ol.prevPosition2DLow,componentsPerAttribute:3,componentDatatype:Q.FLOAT,offsetInBytes:U,strideInBytes:6*P},{index:Ol.nextPosition3DHigh,componentsPerAttribute:3,componentDatatype:Q.FLOAT,offsetInBytes:Y,strideInBytes:6*P},{index:Ol.nextPosition3DLow,componentsPerAttribute:3,componentDatatype:Q.FLOAT,offsetInBytes:k,strideInBytes:6*P},{index:Ol.nextPosition2DHigh,componentsPerAttribute:3,componentDatatype:Q.FLOAT,offsetInBytes:Y,strideInBytes:6*P},{index:Ol.nextPosition2DLow,componentsPerAttribute:3,componentDatatype:Q.FLOAT,offsetInBytes:k,strideInBytes:6*P},{index:Ol.texCoordExpandAndBatchIndex,componentsPerAttribute:4,componentDatatype:Q.FLOAT,vertexBuffer:e._texCoordExpandAndBatchIndexBuffer,offsetInBytes:H}],te,z,j,ee;f===oe.SCENE3D?(z=e._positionBuffer,te="vertexBuffer",j=ule,ee="value"):f===oe.SCENE2D||f===oe.COLUMBUS_VIEW?(z=ule,te="value",j=e._positionBuffer,ee="vertexBuffer"):(z=v,te="vertexBuffer",j=e._positionBuffer,ee="vertexBuffer"),K[0][te]=z,K[1][te]=z,K[2][ee]=j,K[3][ee]=j,K[4][te]=z,K[5][te]=z,K[6][ee]=j,K[7][ee]=j,K[8][te]=z,K[9][te]=z,K[10][ee]=j,K[11][ee]=j;let pe=new oi({context:t,attributes:K,indexBuffer:X});e._vertexArrays.push({va:pe,buckets:d[Z]})}}}function pze(e,t){return t instanceof Wt?t.id:t}var Ck=[];function bze(e){let t=Ji._uniformList[e.type],n=t.length;Ck.length=2*n;let i=0;for(let o=0;o1){a.update();let c=a.material,d=i[c.type];l(d)||(d=i[c.type]=new Pf(c,t,n)),d.addPolyline(a)}}}function yze(e,t){let n=t.mode;(e._mode!==n||!M.equals(e._modelMatrix,e.modelMatrix))&&(e._mode=n,e._modelMatrix=M.clone(e.modelMatrix),e._createVertexArray=!0)}function lK(e){if(e._polylinesRemoved){e._polylinesRemoved=!1;let t=[],n=[],i=0,o,r=e._polylines.length;for(let s=0;s0,_=g._index,C=this.getSegments(g,a),V=C.positions,L=C.lengths,R=V.length,G=g.getPickId(s).color,I=0,v=0,P;for(let O=0;O0||Es.x>0&&Uu.x<0)&&m.clone(Es,Uu),(Es.x<0&&Du.x>0||Es.x>0&&Du.x<0)&&m.clone(Es,Du));let H=Y?2:0,K=k?2:4;for(let te=H;te2&&(r.setBatchedAttribute(_,2,E),r.setBatchedAttribute(_,3,X),r.setBatchedAttribute(_,4,F))}};var Tze=new m,Sze=new m,Cze=new m,hle=new m;Pf.prototype.writeForMorph=function(e,t){let n=this.modelMatrix,i=this.polylines,o=i.length;for(let r=0;r0&&(c=a[a.length-1]+1);let d=this.polylines,u=d.length;for(let h=0;h0)g[0]=x;else continue}else g=p._segments.lengths;let f=g.length;if(f>0){let x=0;for(let _=0;_W.SIXTY_FOUR_KILOBYTES&&(p._locatorBuckets.push({locator:r,count:x}),x=0,t.push(4),a=[],e.push(a),c=0,r.count=s,s=0,i=0,r=new aK(0,0,this),n[++o]=[r]),a.push(c,c+2,c+1),a.push(c+1,c+2,c+3),x+=6,s+=6,i+=6,c+=4}p._locatorBuckets.push({locator:r,count:x}),c+4>W.SIXTY_FOUR_KILOBYTES&&(t.push(0),a=[],e.push(a),c=0,r.count=s,i=0,s=0,r=new aK(0,0,this),n[++o]=[r])}p._clean()}return r.count=s,i};Pf.prototype.getPolylineStartIndex=function(e){let t=this.polylines,n=0,i=t.length;for(let o=0;o0){e._boundingVolume2D=de.fromPoints(o,e._boundingVolume2D);let d=e._boundingVolume2D.center;e._boundingVolume2D.center=new m(d.z,d.x,d.y)}return S1.positions=o,S1.lengths=e._segments.lengths,S1};var ple;Pf.prototype.writeUpdate=function(e,t,n,i){let o=this.mode,r=i.ellipsoid.maximumRadius*W.PI,s=t._actualLength;if(s){e+=this.getPolylineStartIndex(t);let a=ple,c=6*s*3;!l(a)||a.lengthc&&(a=new Float32Array(a.buffer,0,c));let d=this.getSegments(t,i),u=d.positions,h=d.lengths,p=0,g=0,f=0,x;s=u.length;for(let _=0;_0||Es.x>0&&Uu.x<0)&&m.clone(Es,Uu),(Es.x<0&&Du.x>0||Es.x>0&&Du.x<0)&&m.clone(Es,Du));let R=V?2:0,G=L?2:4;for(let I=R;I{if(e.isDestroyed())return;e._positions=new Float64Array(a.positions);let c=e._billboardCollection,d=e._labelCollection,u=e._polylineCollection;n=e._positions;let h=e._batchIds,p=n.length/3;for(let g=0;g{e.isDestroyed()||(e._error=a)})}Og.prototype.createFeatures=function(e,t){let n=this._billboardCollection,i=this._labelCollection,o=this._polylineCollection,r=this._batchIds,s=r.length;for(let a=0;a{if(e.isDestroyed())return;e._positions=void 0,e._counts=void 0,e._polygonMinimumHeights=void 0,e._polygonMaximumHeights=void 0;let f=new Float64Array(g.packedBuffer),x=f[0];Nze(e,f),e._indices=Me.getSizeInBytes(x)===2?new Uint16Array(g.indices):new Uint32Array(g.indices),e._indexOffsets=new Uint32Array(g.indexOffsets),e._indexCounts=new Uint32Array(g.indexCounts),e._batchedPositions=new Float32Array(g.positions),e._vertexBatchIds=new Uint16Array(g.batchIds),Bze(e),e._ready=!0}).catch(g=>{e.isDestroyed()||(e._error=g)})}function Bze(e){l(e._primitive)||(e._primitive=new s_({batchTable:e._batchTable,positions:e._batchedPositions,batchIds:e._batchIds,vertexBatchIds:e._vertexBatchIds,indices:e._indices,indexOffsets:e._indexOffsets,indexCounts:e._indexCounts,batchedIndices:e._batchedIndices,boundingVolume:e._boundingVolume,boundingVolumes:e._boundingVolumes,center:e._center}),e._batchTable=void 0,e._batchIds=void 0,e._positions=void 0,e._counts=void 0,e._indices=void 0,e._indexCounts=void 0,e._indexOffsets=void 0,e._batchTableColors=void 0,e._packedBuffer=void 0,e._batchedPositions=void 0,e._transferrableBatchIds=void 0,e._vertexBatchIds=void 0,e._ellipsoid=void 0,e._minimumHeight=void 0,e._maximumHeight=void 0,e._polygonMinimumHeights=void 0,e._polygonMaximumHeights=void 0,e._center=void 0,e._rectangle=void 0,e._boundingVolume=void 0,e._boundingVolumes=void 0,e._batchedIndices=void 0)}Eb.prototype.createFeatures=function(e,t){this._primitive.createFeatures(e,t)};Eb.prototype.applyDebugSettings=function(e,t){this._primitive.applyDebugSettings(e,t)};Eb.prototype.applyStyle=function(e,t){this._primitive.applyStyle(e,t)};Eb.prototype.updateCommands=function(e,t){this._primitive.updateCommands(e,t)};Eb.prototype.update=function(e){if(!this._ready){if(l(this._promise)||(this._promise=Dze(this)),l(this._error)){let t=this._error;throw this._error=void 0,t}return}this._primitive.debugWireframe=this.debugWireframe,this._primitive.forceRebatch=this.forceRebatch,this._primitive.classificationType=this.classificationType,this._primitive.update(e)};Eb.prototype.isDestroyed=function(){return!1};Eb.prototype.destroy=function(){return this._primitive=this._primitive&&this._primitive.destroy(),me(this)};var tP=Eb;var Z9n=T(S(),1);var t9n=T(S(),1),nP=`in vec4 currentPosition; in vec4 previousPosition; in vec4 nextPosition; in vec2 expandAndWidth; in float a_batchId; uniform mat4 u_modifiedModelView; void main() { float expandDir = expandAndWidth.x; float width = abs(expandAndWidth.y) + 0.5; bool usePrev = expandAndWidth.y < 0.0; vec4 p = u_modifiedModelView * currentPosition; vec4 prev = u_modifiedModelView * previousPosition; vec4 next = u_modifiedModelView * nextPosition; float angle; vec4 positionWC = getPolylineWindowCoordinatesEC(p, prev, next, expandDir, width, usePrev, angle); gl_Position = czm_viewportOrthographic * positionWC; } `;function mh(e){this._positions=e.positions,this._widths=e.widths,this._counts=e.counts,this._batchIds=e.batchIds,this._ellipsoid=y(e.ellipsoid,ne.WGS84),this._minimumHeight=e.minimumHeight,this._maximumHeight=e.maximumHeight,this._center=e.center,this._rectangle=e.rectangle,this._boundingVolume=e.boundingVolume,this._batchTable=e.batchTable,this._va=void 0,this._sp=void 0,this._rs=void 0,this._uniformMap=void 0,this._command=void 0,this._transferrableBatchIds=void 0,this._packedBuffer=void 0,this._keepDecodedPositions=e.keepDecodedPositions,this._decodedPositions=void 0,this._decodedPositionOffsets=void 0,this._currentPositions=void 0,this._previousPositions=void 0,this._nextPositions=void 0,this._expandAndWidth=void 0,this._vertexBatchIds=void 0,this._indices=void 0,this._constantColor=B.clone(B.WHITE),this._highlightColor=this._constantColor,this._trianglesLength=0,this._geometryByteLength=0,this._ready=!1,this._promise=void 0,this._error=void 0}Object.defineProperties(mh.prototype,{trianglesLength:{get:function(){return this._trianglesLength}},geometryByteLength:{get:function(){return this._geometryByteLength}},ready:{get:function(){return this._ready}}});function Oze(e){let t=e._rectangle,n=e._minimumHeight,i=e._maximumHeight,o=e._ellipsoid,r=e._center,s=2+le.packedLength+ne.packedLength+m.packedLength,a=new Float64Array(s),c=0;return a[c++]=n,a[c++]=i,le.pack(t,a,c),c+=le.packedLength,ne.pack(o,a,c),c+=ne.packedLength,m.pack(r,a,c),a}var Yze=new Ti("createVectorTilePolylines",5),C1={previousPosition:0,currentPosition:1,nextPosition:2,expandAndWidth:3,a_batchId:4};function Hze(e,t){if(l(e._va))return;let n=e._positions,i=e._widths,o=e._counts,r=e._transferrableBatchIds,s=e._packedBuffer;l(s)||(n=e._positions=n.slice(),i=e._widths=i.slice(),o=e._counts=o.slice(),r=e._transferrableBatchIds=e._batchIds.slice(),s=e._packedBuffer=Oze(e));let a=[n.buffer,i.buffer,o.buffer,r.buffer,s.buffer],c={positions:n.buffer,widths:i.buffer,counts:o.buffer,batchIds:r.buffer,packedBuffer:s.buffer,keepDecodedPositions:e._keepDecodedPositions},d=Yze.scheduleTask(c,a);if(l(d))return d.then(function(u){if(e.isDestroyed())return;e._keepDecodedPositions&&(e._decodedPositions=new Float64Array(u.decodedPositions),e._decodedPositionOffsets=new Uint32Array(u.decodedPositionOffsets)),e._currentPositions=new Float32Array(u.currentPositions),e._previousPositions=new Float32Array(u.previousPositions),e._nextPositions=new Float32Array(u.nextPositions),e._expandAndWidth=new Float32Array(u.expandAndWidth),e._vertexBatchIds=new Uint16Array(u.batchIds);let h=u.indexDatatype;e._indices=h===Me.UNSIGNED_SHORT?new Uint16Array(u.indices):new Uint32Array(u.indices),zze(e,t),e._ready=!0}).catch(u=>{e.isDestroyed()||(e._error=u)})}function zze(e,t){if(!l(e._va)){let n=e._currentPositions,i=e._previousPositions,o=e._nextPositions,r=e._expandAndWidth,s=e._vertexBatchIds,a=e._indices,c=i.byteLength+n.byteLength+o.byteLength;c+=r.byteLength+s.byteLength+a.byteLength,e._trianglesLength=a.length/3,e._geometryByteLength=c;let d=St.createVertexBuffer({context:t,typedArray:i,usage:ke.STATIC_DRAW}),u=St.createVertexBuffer({context:t,typedArray:n,usage:ke.STATIC_DRAW}),h=St.createVertexBuffer({context:t,typedArray:o,usage:ke.STATIC_DRAW}),p=St.createVertexBuffer({context:t,typedArray:r,usage:ke.STATIC_DRAW}),g=St.createVertexBuffer({context:t,typedArray:s,usage:ke.STATIC_DRAW}),f=St.createIndexBuffer({context:t,typedArray:a,usage:ke.STATIC_DRAW,indexDatatype:a.BYTES_PER_ELEMENT===2?Me.UNSIGNED_SHORT:Me.UNSIGNED_INT}),x=[{index:C1.previousPosition,vertexBuffer:d,componentDatatype:Q.FLOAT,componentsPerAttribute:3},{index:C1.currentPosition,vertexBuffer:u,componentDatatype:Q.FLOAT,componentsPerAttribute:3},{index:C1.nextPosition,vertexBuffer:h,componentDatatype:Q.FLOAT,componentsPerAttribute:3},{index:C1.expandAndWidth,vertexBuffer:p,componentDatatype:Q.FLOAT,componentsPerAttribute:2},{index:C1.a_batchId,vertexBuffer:g,componentDatatype:Q.UNSIGNED_SHORT,componentsPerAttribute:1}];e._va=new oi({context:t,attributes:x,indexBuffer:f}),e._positions=void 0,e._widths=void 0,e._counts=void 0,e._ellipsoid=void 0,e._minimumHeight=void 0,e._maximumHeight=void 0,e._rectangle=void 0,e._transferrableBatchIds=void 0,e._packedBuffer=void 0,e._currentPositions=void 0,e._previousPositions=void 0,e._nextPositions=void 0,e._expandAndWidth=void 0,e._vertexBatchIds=void 0,e._indices=void 0}}var iP=new M,Cle=new m;function Kze(e,t){l(e._uniformMap)||(e._uniformMap={u_modifiedModelView:function(){let n=t.uniformState.view;return M.clone(n,iP),M.multiplyByPoint(iP,e._center,Cle),M.setTranslation(iP,Cle,iP),iP},u_highlightColor:function(){return e._highlightColor}})}function Jze(e){if(l(e._rs))return;let t={enabled:!0,factor:-5,units:-5};e._rs=Ue.fromCache({blending:hn.ALPHA_BLEND,depthMask:!1,depthTest:{enabled:!0},polygonOffset:t})}var Qze=`uniform vec4 u_highlightColor; void main() { out_FragColor = u_highlightColor; } `;function jze(e,t){if(l(e._sp))return;let n=e._batchTable,i=n.getVertexShaderCallback(!1,"a_batchId",void 0)(nP),o=n.getFragmentShaderCallback(!1,void 0,!1)(Qze),r=new De({defines:["VECTOR_TILE",Ot.isInternetExplorer()?"":"CLIP_POLYLINE"],sources:[gd,i]}),s=new De({defines:["VECTOR_TILE"],sources:[o]});e._sp=en.fromCache({context:t,vertexShaderSource:r,fragmentShaderSource:s,attributeLocations:C1})}function qze(e,t){if(!l(e._command)){let n=e._batchTable.getUniformMapCallback()(e._uniformMap);e._command=new $e({owner:e,vertexArray:e._va,renderState:e._rs,shaderProgram:e._sp,uniformMap:n,boundingVolume:e._boundingVolume,pass:Ge.TRANSLUCENT,pickId:e._batchTable.getPickId()})}t.commandList.push(e._command)}mh.getPolylinePositions=function(e,t){let n=e._batchIds,i=e._decodedPositions,o=e._decodedPositionOffsets;if(!l(n)||!l(i))return;let r,s,a=n.length,c=0,d=0;for(r=0;r // vec3 scratchNormal = mix(-startFaceNormalAndVertexCorner.xyz, endFaceNormalAndHalfWidth.xyz, isEnd); scratchNormal = cross(scratchNormal, mix(startEllipsoidNormal, endEllipsoidNormal, isEnd)); vec3 miterPushNormal = czm_normal * normalize(scratchNormal); offset = 2.0 * endFaceNormalAndHalfWidth.w * max(0.0, czm_metersPerPixel(position)); // offset = widthEC offset = offset / dot(miterPushNormal, right); position.xyz += miterPushNormal * (offset * sign(0.5 - mod(startFaceNormalAndVertexCorner.w, 2.0))); gl_Position = czm_depthClamp(czm_projection * position); position = u_modifiedModelView * vec4(startPositionAndHeight.xyz, 1.0); vec3 startNormalEC = czm_normal * startFaceNormalAndVertexCorner.xyz; v_startPlaneEC = vec4(startNormalEC, -dot(startNormalEC, position.xyz)); v_rightPlaneEC = vec4(right, -dot(right, position.xyz)); position = u_modifiedModelView * vec4(endPositionAndHeight.xyz, 1.0); vec3 endNormalEC = czm_normal * endFaceNormalAndHalfWidth.xyz; v_endPlaneEC = vec4(endNormalEC, -dot(endNormalEC, position.xyz)); v_halfWidth = endFaceNormalAndHalfWidth.w; } `;var X9n=T(S(),1),rP=`in vec4 v_startPlaneEC; in vec4 v_endPlaneEC; in vec4 v_rightPlaneEC; in float v_halfWidth; in vec3 v_volumeUpEC; uniform vec4 u_highlightColor; void main() { float logDepthOrDepth = czm_branchFreeTernary(czm_sceneMode == czm_sceneMode2D, gl_FragCoord.z, czm_unpackDepth(texture(czm_globeDepthTexture, gl_FragCoord.xy / czm_viewport.zw))); // Discard for sky if (logDepthOrDepth == 0.0) { #ifdef DEBUG_SHOW_VOLUME out_FragColor = vec4(0.0, 0.0, 1.0, 0.5); return; #else // DEBUG_SHOW_VOLUME discard; #endif // DEBUG_SHOW_VOLUME } vec4 eyeCoordinate = czm_windowToEyeCoordinates(gl_FragCoord.xy, logDepthOrDepth); eyeCoordinate /= eyeCoordinate.w; float halfMaxWidth = v_halfWidth * czm_metersPerPixel(eyeCoordinate); // Expand halfMaxWidth if direction to camera is almost perpendicular with the volume's up direction halfMaxWidth += halfMaxWidth * (1.0 - dot(-normalize(eyeCoordinate.xyz), v_volumeUpEC)); // Check distance of the eye coordinate against the right-facing plane float widthwiseDistance = czm_planeDistance(v_rightPlaneEC, eyeCoordinate.xyz); // Check eye coordinate against the mitering planes float distanceFromStart = czm_planeDistance(v_startPlaneEC, eyeCoordinate.xyz); float distanceFromEnd = czm_planeDistance(v_endPlaneEC, eyeCoordinate.xyz); if (abs(widthwiseDistance) > halfMaxWidth || distanceFromStart < 0.0 || distanceFromEnd < 0.0) { #ifdef DEBUG_SHOW_VOLUME out_FragColor = vec4(logDepthOrDepth, 0.0, 0.0, 0.5); return; #else // DEBUG_SHOW_VOLUME discard; #endif // DEBUG_SHOW_VOLUME } out_FragColor = u_highlightColor; czm_writeDepthClamp(); } `;function Ib(e){this._positions=e.positions,this._widths=e.widths,this._counts=e.counts,this._batchIds=e.batchIds,this._ellipsoid=y(e.ellipsoid,ne.WGS84),this._minimumHeight=e.minimumHeight,this._maximumHeight=e.maximumHeight,this._center=e.center,this._rectangle=e.rectangle,this._batchTable=e.batchTable,this._va=void 0,this._sp=void 0,this._rs=void 0,this._uniformMap=void 0,this._command=void 0,this._transferrableBatchIds=void 0,this._packedBuffer=void 0,this._minimumMaximumVectorHeights=new D(mi._defaultMinTerrainHeight,mi._defaultMaxTerrainHeight),this._boundingVolume=Gn.fromRectangle(e.rectangle,mi._defaultMinTerrainHeight,mi._defaultMaxTerrainHeight,this._ellipsoid),this._classificationType=e.classificationType,this._keepDecodedPositions=e.keepDecodedPositions,this._decodedPositions=void 0,this._decodedPositionOffsets=void 0,this._startEllipsoidNormals=void 0,this._endEllipsoidNormals=void 0,this._startPositionAndHeights=void 0,this._startFaceNormalAndVertexCornerIds=void 0,this._endPositionAndHeights=void 0,this._endFaceNormalAndHalfWidths=void 0,this._vertexBatchIds=void 0,this._indices=void 0,this._constantColor=B.clone(B.WHITE),this._highlightColor=this._constantColor,this._trianglesLength=0,this._geometryByteLength=0,this._ready=!1,this._promise=void 0,this._error=void 0}Object.defineProperties(Ib.prototype,{trianglesLength:{get:function(){return this._trianglesLength}},geometryByteLength:{get:function(){return this._geometryByteLength}},ready:{get:function(){return this._ready}}});function iKe(e,t,n){let i=mi.getMinimumMaximumHeights(t,n),o=i.minimumTerrainHeight,r=i.maximumTerrainHeight,s=e._minimumMaximumVectorHeights;s.x=o,s.y=r;let a=e._boundingVolume,c=e._rectangle;Gn.fromRectangle(c,o,r,n,a)}function oKe(e){let t=e._rectangle,n=e._minimumHeight,i=e._maximumHeight,o=e._ellipsoid,r=e._center,s=2+le.packedLength+ne.packedLength+m.packedLength,a=new Float64Array(s),c=0;return a[c++]=n,a[c++]=i,le.pack(t,a,c),c+=le.packedLength,ne.pack(o,a,c),c+=ne.packedLength,m.pack(r,a,c),a}var rKe=new Ti("createVectorTileClampedPolylines"),Yg={startEllipsoidNormal:0,endEllipsoidNormal:1,startPositionAndHeight:2,endPositionAndHeight:3,startFaceNormalAndVertexCorner:4,endFaceNormalAndHalfWidth:5,a_batchId:6};function sKe(e,t){if(l(e._va))return;let n=e._positions,i=e._widths,o=e._counts,r=e._transferrableBatchIds,s=e._packedBuffer;l(s)||(n=e._positions=n.slice(),i=e._widths=i.slice(),o=e._counts=o.slice(),r=e._transferrableBatchIds=e._batchIds.slice(),s=e._packedBuffer=oKe(e));let a=[n.buffer,i.buffer,o.buffer,r.buffer,s.buffer],c={positions:n.buffer,widths:i.buffer,counts:o.buffer,batchIds:r.buffer,packedBuffer:s.buffer,keepDecodedPositions:e._keepDecodedPositions},d=rKe.scheduleTask(c,a);if(l(d))return d.then(function(u){if(e.isDestroyed())return;e._keepDecodedPositions&&(e._decodedPositions=new Float64Array(u.decodedPositions),e._decodedPositionOffsets=new Uint32Array(u.decodedPositionOffsets)),e._startEllipsoidNormals=new Float32Array(u.startEllipsoidNormals),e._endEllipsoidNormals=new Float32Array(u.endEllipsoidNormals),e._startPositionAndHeights=new Float32Array(u.startPositionAndHeights),e._startFaceNormalAndVertexCornerIds=new Float32Array(u.startFaceNormalAndVertexCornerIds),e._endPositionAndHeights=new Float32Array(u.endPositionAndHeights),e._endFaceNormalAndHalfWidths=new Float32Array(u.endFaceNormalAndHalfWidths),e._vertexBatchIds=new Uint16Array(u.vertexBatchIds);let h=u.indexDatatype;e._indices=h===Me.UNSIGNED_SHORT?new Uint16Array(u.indices):new Uint32Array(u.indices),aKe(e,t),e._ready=!0}).catch(u=>{e.isDestroyed()||(e._error=u)})}function aKe(e,t){if(!l(e._va)){let n=e._startEllipsoidNormals,i=e._endEllipsoidNormals,o=e._startPositionAndHeights,r=e._endPositionAndHeights,s=e._startFaceNormalAndVertexCornerIds,a=e._endFaceNormalAndHalfWidths,c=e._vertexBatchIds,d=e._indices,u=n.byteLength+i.byteLength;u+=o.byteLength+r.byteLength,u+=s.byteLength+a.byteLength,u+=c.byteLength+d.byteLength,e._trianglesLength=d.length/3,e._geometryByteLength=u;let h=St.createVertexBuffer({context:t,typedArray:n,usage:ke.STATIC_DRAW}),p=St.createVertexBuffer({context:t,typedArray:i,usage:ke.STATIC_DRAW}),g=St.createVertexBuffer({context:t,typedArray:o,usage:ke.STATIC_DRAW}),f=St.createVertexBuffer({context:t,typedArray:r,usage:ke.STATIC_DRAW}),x=St.createVertexBuffer({context:t,typedArray:s,usage:ke.STATIC_DRAW}),_=St.createVertexBuffer({context:t,typedArray:a,usage:ke.STATIC_DRAW}),C=St.createVertexBuffer({context:t,typedArray:c,usage:ke.STATIC_DRAW}),V=St.createIndexBuffer({context:t,typedArray:d,usage:ke.STATIC_DRAW,indexDatatype:d.BYTES_PER_ELEMENT===2?Me.UNSIGNED_SHORT:Me.UNSIGNED_INT}),L=[{index:Yg.startEllipsoidNormal,vertexBuffer:h,componentDatatype:Q.FLOAT,componentsPerAttribute:3},{index:Yg.endEllipsoidNormal,vertexBuffer:p,componentDatatype:Q.FLOAT,componentsPerAttribute:3},{index:Yg.startPositionAndHeight,vertexBuffer:g,componentDatatype:Q.FLOAT,componentsPerAttribute:4},{index:Yg.endPositionAndHeight,vertexBuffer:f,componentDatatype:Q.FLOAT,componentsPerAttribute:4},{index:Yg.startFaceNormalAndVertexCorner,vertexBuffer:x,componentDatatype:Q.FLOAT,componentsPerAttribute:4},{index:Yg.endFaceNormalAndHalfWidth,vertexBuffer:_,componentDatatype:Q.FLOAT,componentsPerAttribute:4},{index:Yg.a_batchId,vertexBuffer:C,componentDatatype:Q.UNSIGNED_SHORT,componentsPerAttribute:1}];e._va=new oi({context:t,attributes:L,indexBuffer:V}),e._positions=void 0,e._widths=void 0,e._counts=void 0,e._ellipsoid=void 0,e._minimumHeight=void 0,e._maximumHeight=void 0,e._rectangle=void 0,e._transferrableBatchIds=void 0,e._packedBuffer=void 0,e._startEllipsoidNormals=void 0,e._endEllipsoidNormals=void 0,e._startPositionAndHeights=void 0,e._startFaceNormalAndVertexCornerIds=void 0,e._endPositionAndHeights=void 0,e._endFaceNormalAndHalfWidths=void 0,e._vertexBatchIds=void 0,e._indices=void 0}}var sP=new M,Vle=new m;function cKe(e,t){l(e._uniformMap)||(e._uniformMap={u_modifiedModelView:function(){let n=t.uniformState.view;return M.clone(n,sP),M.multiplyByPoint(sP,e._center,Vle),M.setTranslation(sP,Vle,sP),sP},u_highlightColor:function(){return e._highlightColor},u_minimumMaximumVectorHeights:function(){return e._minimumMaximumVectorHeights}})}function Lle(e){return Ue.fromCache({cull:{enabled:!0,face:_i.FRONT},blending:hn.PRE_MULTIPLIED_ALPHA_BLEND,depthMask:!1,stencilTest:{enabled:e,frontFunction:On.EQUAL,frontOperation:{fail:ft.KEEP,zFail:ft.KEEP,zPass:ft.KEEP},backFunction:On.EQUAL,backOperation:{fail:ft.KEEP,zFail:ft.KEEP,zPass:ft.KEEP},reference:Dt.CESIUM_3D_TILE_MASK,mask:Dt.CESIUM_3D_TILE_MASK}})}function lKe(e){l(e._rs)||(e._rs=Lle(!1),e._rs3DTiles=Lle(!0))}function dKe(e,t){if(l(e._sp))return;let n=e._batchTable,i=n.getVertexShaderCallback(!1,"a_batchId",void 0)(oP),o=n.getFragmentShaderCallback(!1,void 0,!0)(rP),r=new De({defines:["VECTOR_TILE",Ot.isInternetExplorer()?"":"CLIP_POLYLINE"],sources:[gd,i]}),s=new De({defines:["VECTOR_TILE"],sources:[o]});e._sp=en.fromCache({context:t,vertexShaderSource:r,fragmentShaderSource:s,attributeLocations:Yg})}function uKe(e,t){let n=e._command;if(!l(e._command)){let o=e._batchTable.getUniformMapCallback()(e._uniformMap);n=e._command=new $e({owner:e,vertexArray:e._va,renderState:e._rs,shaderProgram:e._sp,uniformMap:o,boundingVolume:e._boundingVolume,pass:Ge.TERRAIN_CLASSIFICATION,pickId:e._batchTable.getPickId()});let r=$e.shallowClone(n,n.derivedCommands.tileset);r.renderState=e._rs3DTiles,r.pass=Ge.CESIUM_3D_TILE_CLASSIFICATION,n.derivedCommands.tileset=r}let i=e._classificationType;(i===Bn.TERRAIN||i===Bn.BOTH)&&t.commandList.push(n),(i===Bn.CESIUM_3D_TILE||i===Bn.BOTH)&&t.commandList.push(n.derivedCommands.tileset)}Ib.prototype.getPositions=function(e){return O_.getPolylinePositions(this,e)};Ib.prototype.createFeatures=function(e,t){let n=this._batchIds,i=n.length;for(let o=0;o{e.isDestroyed()||(e._error=t)})}Ib.prototype.update=function(e){let t=e.context;if(!this._ready){if(l(this._promise)||(this._promise=bKe(this).then(sKe(this,t))),l(this._error)){let i=this._error;throw this._error=void 0,i}return}cKe(this,t),dKe(this,t),lKe(this);let n=e.passes;(n.render||n.pick)&&uKe(this,e)};Ib.prototype.isDestroyed=function(){return!1};Ib.prototype.destroy=function(){return this._va=this._va&&this._va.destroy(),this._sp=this._sp&&this._sp.destroy(),me(this)};var aP=Ib;var xNn=T(S(),1);var mK=32767,gKe=new he,yKe=new m;function xKe(e,t,n,i,o){let r=e.length/3,s=e.subarray(0,r),a=e.subarray(r,2*r),c=e.subarray(2*r,3*r);Mn.zigZagDeltaDecode(s,a,c);let d=new Float64Array(e.length);for(let u=0;u0&&l(e.POLYGON_BATCH_IDS)){let p=t.byteOffset+e.POLYGON_BATCH_IDS.byteOffset;n=new Uint16Array(t.buffer,p,s)}if(a>0&&l(e.POLYLINE_BATCH_IDS)){let p=t.byteOffset+e.POLYLINE_BATCH_IDS.byteOffset;i=new Uint16Array(t.buffer,p,a)}if(c>0&&l(e.POINT_BATCH_IDS)){let p=t.byteOffset+e.POINT_BATCH_IDS.byteOffset;o=new Uint16Array(t.buffer,p,c)}let d=l(n)||l(i)||l(o),u=s>0&&!l(n)||a>0&&!l(i)||c>0&&!l(o);if(d&&u)throw new ce("If one group of batch ids is defined, then all batch ids must be defined");if(!l(n)&&!l(i)&&!l(o)){let p=0;if(!l(n)&&s>0)for(n=new Uint16Array(s),r=0;r0)for(i=new Uint16Array(a),r=0;r0)for(o=new Uint16Array(c),r=0;r0&&(C=nr(i,n,d),n+=d,u>0&&(V=new Uint8Array(t,n,u),V=new Uint8Array(V),n+=u));let L=y(x.POLYGONS_LENGTH,0),R=y(x.POLYLINES_LENGTH,0),G=y(x.POINTS_LENGTH,0),I=L+R+G,v=new jp(e,I,C,V,_Ke(e));if(e._batchTable=v,I===0)return;let P=new rh(x,_),w=P.getGlobalProperty("REGION");if(!l(w))throw new ce("Feature table global property: REGION must be defined");let A=le.unpack(w),b=w[4],Z=w[5],E=e._tile.computedTransform,X=P.getGlobalProperty("RTC_CENTER",Q.FLOAT,3);l(X)?(X=m.unpack(X),M.multiplyByPoint(E,X,X)):(X=le.center(A),X.height=W.lerp(b,Z,.5),X=ne.WGS84.cartographicToCartesian(X));let F=TKe(x,_);if(n+=(4-n%4)%4,L>0){P.featuresLength=L;let N=y(P.getPropertyArray("POLYGON_COUNTS",Q.UNSIGNED_INT,1),P.getPropertyArray("POLYGON_COUNT",Q.UNSIGNED_INT,1));if(!l(N))throw new ce("Feature table property: POLYGON_COUNTS must be defined when POLYGONS_LENGTH is greater than 0");let O=y(P.getPropertyArray("POLYGON_INDEX_COUNTS",Q.UNSIGNED_INT,1),P.getPropertyArray("POLYGON_INDEX_COUNT",Q.UNSIGNED_INT,1));if(!l(O))throw new ce("Feature table property: POLYGON_INDEX_COUNTS must be defined when POLYGONS_LENGTH is greater than 0");let U=N.reduce(function(z,j){return z+j*2},0),Y=O.reduce(function(z,j){return z+j},0),k=new Uint32Array(t,n,Y);n+=h;let H=new Uint16Array(t,n,U);n+=p;let K,te;l(x.POLYGON_MINIMUM_HEIGHTS)&&l(x.POLYGON_MAXIMUM_HEIGHTS)&&(K=P.getPropertyArray("POLYGON_MINIMUM_HEIGHTS",Q.FLOAT,1),te=P.getPropertyArray("POLYGON_MAXIMUM_HEIGHTS",Q.FLOAT,1)),e._polygons=new tP({positions:H,counts:N,indexCounts:O,indices:k,minimumHeight:b,maximumHeight:Z,polygonMinimumHeights:K,polygonMaximumHeights:te,center:X,rectangle:A,boundingVolume:e.tile.boundingVolume.boundingVolume,batchTable:v,batchIds:F.polygons,modelMatrix:E})}if(R>0){P.featuresLength=R;let N=y(P.getPropertyArray("POLYLINE_COUNTS",Q.UNSIGNED_INT,1),P.getPropertyArray("POLYLINE_COUNT",Q.UNSIGNED_INT,1));if(!l(N))throw new ce("Feature table property: POLYLINE_COUNTS must be defined when POLYLINES_LENGTH is greater than 0");let O=P.getPropertyArray("POLYLINE_WIDTHS",Q.UNSIGNED_SHORT,1);if(!l(O)){O=new Uint16Array(R);for(let te=0;te0){let N=new Uint16Array(t,n,G*3);n+=f,e._points=new eP({positions:N,batchIds:F.points,minimumHeight:b,maximumHeight:Z,rectangle:A,batchTable:v})}}function hK(e){let t=e.featuresLength;if(!l(e._features)&&t>0){let n=new Array(t);l(e._polygons)&&e._polygons.createFeatures(e,n),l(e._polylines)&&e._polylines.createFeatures(e,n),l(e._points)&&e._points.createFeatures(e,n),e._features=n}}fh.prototype.hasProperty=function(e,t){return this._batchTable.hasProperty(e,t)};fh.prototype.getFeature=function(e){return l(this._features)||hK(this),this._features[e]};fh.prototype.applyDebugSettings=function(e,t){l(this._polygons)&&this._polygons.applyDebugSettings(e,t),l(this._polylines)&&this._polylines.applyDebugSettings(e,t),l(this._points)&&this._points.applyDebugSettings(e,t)};fh.prototype.applyStyle=function(e){l(this._features)||hK(this),l(this._polygons)&&this._polygons.applyStyle(e,this._features),l(this._polylines)&&this._polylines.applyStyle(e,this._features),l(this._points)&&this._points.applyStyle(e,this._features)};fh.prototype.update=function(e,t){let n=!0;l(this._polygons)&&(this._polygons.classificationType=this._tileset.classificationType,this._polygons.debugWireframe=this._tileset.debugWireframe,this._polygons.update(t),n=n&&this._polygons.ready),l(this._polylines)&&(this._polylines.update(t),n=n&&this._polylines.ready),l(this._points)&&(this._points.update(t),n=n&&this._points.ready),l(this._batchTable)&&n&&(l(this._features)||hK(this),this._batchTable.update(e,t),this._ready=!0)};fh.prototype.pick=function(e,t,n){};fh.prototype.getPolylinePositions=function(e){let t=this._polylines;if(l(t))return t.getPositions(e)};fh.prototype.isDestroyed=function(){return!1};fh.prototype.destroy=function(){return this._polygons=this._polygons&&this._polygons.destroy(),this._polylines=this._polylines&&this._polylines.destroy(),this._points=this._points&&this._points.destroy(),this._batchTable=this._batchTable&&this._batchTable.destroy(),me(this)};function LKe(e,t,n,i,o,r){let s=t.length,a=0;for(let c=0;c=0?i[r]:void 0}var z_=GKe;var X5n=T(S(),1);var V5n=T(S(),1);function Pb(e){e=y(e,y.EMPTY_OBJECT);let t=e.tile,n=e.class;this._class=n,this._properties=t.properties,this._extensions=t.extensions,this._extras=t.extras}Object.defineProperties(Pb.prototype,{class:{get:function(){return this._class}},extras:{get:function(){return this._extras}},extensions:{get:function(){return this._extensions}}});Pb.prototype.hasProperty=function(e){return Un.hasProperty(e,this._properties,this._class)};Pb.prototype.hasPropertyBySemantic=function(e){return Un.hasPropertyBySemantic(e,this._properties,this._class)};Pb.prototype.getPropertyIds=function(e){return Un.getPropertyIds(this._properties,this._class,e)};Pb.prototype.getProperty=function(e){return Un.getProperty(e,this._properties,this._class)};Pb.prototype.setProperty=function(e,t){return Un.setProperty(e,t,this._properties,this._class)};Pb.prototype.getPropertyBySemantic=function(e){return Un.getPropertyBySemantic(e,this._properties,this._class)};Pb.prototype.setPropertyBySemantic=function(e,t){return Un.setPropertyBySemantic(e,t,this._properties,this._class)};var uP=Pb;function pK(e,t){let n=ci(t,"3DTILES_metadata")?t.extensions["3DTILES_metadata"]:t.metadata;if(!l(n))return;if(!l(e.schema)){pK._oneTimeWarning("findTileMetadata-missing-root-schema","Could not find a metadata schema for tile metadata. For tilesets that contain external tilesets, make sure the schema is added to the root tileset.json.");return}let i=y(e.schema.classes,y.EMPTY_OBJECT);if(l(n.class)){let o=i[n.class];return new uP({tile:n,class:o})}}pK._oneTimeWarning=Ct;var mP=pK;var $5n=T(S(),1);var M5n=T(S(),1);function EKe(e){let t=new Uint8Array(e),n=Km(t);if(n==="glTF"&&(n="glb"),Is.isBinaryFormat(n))return{contentType:n,binaryPayload:t};let i=IKe(t);if(l(i.root))return{contentType:Is.EXTERNAL_TILESET,jsonPayload:i};if(l(i.asset))return{contentType:Is.GLTF,jsonPayload:i};if(l(i.tileAvailability))return{contentType:Is.IMPLICIT_SUBTREE_JSON,jsonPayload:i};if(l(i.type))return{contentType:Is.GEOJSON,jsonPayload:i};if(l(i.voxelTable))return{contentType:Is.VOXEL_JSON,jsonPayload:i};throw new ce("Invalid tile content.")}function IKe(e){let t;try{t=nr(e)}catch{throw new ce("Invalid tile content.")}return t}var vb=EKe;function Ou(e,t,n,i){this._tileset=e,this._tile=t,this._tilesetResource=n,this._contents=[],this._contentsCreated=!1;let o=l(i.contents)?i.contents:i.content;this._innerContentHeaders=o,this._requestsInFlight=0,this._cancelCount=0,this._externalTilesetCount=0;let r=this._innerContentHeaders.length;this._arrayFetchPromises=new Array(r),this._requests=new Array(r),this._ready=!1,this._innerContentResources=new Array(r),this._serverKeys=new Array(r);for(let s=0;svKe(e,r,s)),o=await Promise.all(i);if(e._contentsCreated=!0,e._contents=o.filter(l),e._externalTilesetCount===e._contents.length){let r=e._tile;r.hasRenderableContent=!1}return o}async function vKe(e,t,n){if(l(t))try{let i=vb(t),o=e._tileset,r=e._innerContentResources[n],s=e._tile;i.contentType===Is.EXTERNAL_TILESET&&(e._externalTilesetCount++,s.hasTilesetContent=!0),e._disableSkipLevelOfDetail=e._disableSkipLevelOfDetail||i.contentType===Is.GEOMETRY||i.contentType===Is.VECTOR;let a,c=Y_[i.contentType];l(i.binaryPayload)?a=await Promise.resolve(c(o,s,r,i.binaryPayload.buffer,0)):a=await Promise.resolve(c(o,s,r,i.jsonPayload));let d=e._innerContentHeaders[n];if(s.hasImplicitContentMetadata){let h=s.implicitSubtree,p=s.implicitCoordinates;a.metadata=h.getContentMetadataView(p,n)}else s.hasImplicitContent||(a.metadata=H_(o,d));let u=z_(o,d);return l(u)&&(a.group=new n_({metadata:u})),a}catch(i){Gle(e,n,i)}}function Gle(e,t,n){let i=e._tileset,o=e._innerContentResources[t].url,r=l(n.message)?n.message:n.toString();i.tileFailed.numberOfListeners>0?i.tileFailed.raiseEvent({url:o,message:r}):(console.log(`A content failed to load: ${o}`),console.log(`Error: ${r}`))}Ou.prototype.cancelRequests=function(){for(let e=0;ea?g=W.TWO_PI-c+a:g=a-c;let x=Math.ceil(g/t)+1,_=Math.ceil(f/t)+1,C=g/(x-1),V=f/(_-1),L=le.northwest(e,r),R=le.center(e,AKe);(n!==0||i!==0)&&(R.longitude=0;f--)Xs.computePosition(t,n,!1,g,f,x),h[p++]=x.x,h[p++]=x.y,h[p++]=x.z;for(f=0,g=i-2;g>0;g--)Xs.computePosition(t,n,!1,g,f,x),h[p++]=x.x,h[p++]=x.y,h[p++]=x.z;let _=h.length/3*2,C=Me.createTypedArray(h.length/3,_),V=0;for(let R=0;R0){Hu.longitude=(t.west+t.east)*.5,Hu.latitude=d;let x=n.cartographicToCartesian(Hu,Z1.origin);m.clone(c,Z1.direction);let _=cn.fromPointNormal(e.southwestCornerCartesian,e.westNormal,Ale);ti.rayPlane(Z1,_,e.southwestCornerCartesian),u=n.geodeticSurfaceNormal(x,Rk)}else u=n.geodeticSurfaceNormalCartographic(le.southeast(t),Rk);let h=m.cross(u,a,Fle);m.normalize(h,e.southNormal);let p=t.north,g;if(p<0){Hu.longitude=(t.west+t.east)*.5,Hu.latitude=p;let x=n.cartographicToCartesian(Hu,Z1.origin);m.negate(c,Z1.direction);let _=cn.fromPointNormal(e.northeastCornerCartesian,e.eastNormal,Ale);ti.rayPlane(Z1,_,e.northeastCornerCartesian),g=n.geodeticSurfaceNormal(x,Rk)}else g=n.geodeticSurfaceNormalCartographic(le.northwest(t),Rk);let f=m.cross(a,g,Fle);m.normalize(f,e.northNormal)}var JKe=new m,QKe=new m,jKe=new m(0,-1,0),qKe=new m(0,0,-1),Mle=new m;function $Ke(e,t){let n=t.camera,i=n.positionWC,o=n.positionCartographic,r=0;if(!le.contains(e.rectangle,o)){let d=e.southwestCornerCartesian,u=e.northeastCornerCartesian,h=e.westNormal,p=e.southNormal,g=e.eastNormal,f=e.northNormal;t.mode!==oe.SCENE3D&&(d=t.mapProjection.project(le.southwest(e.rectangle),JKe),d.z=d.y,d.y=d.x,d.x=0,u=t.mapProjection.project(le.northeast(e.rectangle),QKe),u.z=u.y,u.y=u.x,u.x=0,h=jKe,g=m.UNIT_Y,p=qKe,f=m.UNIT_Z);let x=m.subtract(i,d,Mle),_=m.dot(x,h),C=m.dot(x,p),V=m.subtract(i,u,Mle),L=m.dot(V,g),R=m.dot(V,f);_>0?r+=_*_:L>0&&(r+=L*L),C>0?r+=C*C:R>0&&(r+=R*R)}let s,a,c;if(t.mode===oe.SCENE3D?(s=o.height,a=e.minimumHeight,c=e.maximumHeight):(s=i.x,a=0,c=0),s>c){let d=s-c;r+=d*d}else if(s0?(n.push(0),i.push(this._planeVertices[0]),o=this._edgeNormals[0]):cn.getPointDistance(this._boundingPlanes[1],t)>0&&(n.push(1),i.push(this._planeVertices[1]),o=this._edgeNormals[1]);let r,s;for(r=0;r<4;r++)s=2+r,cn.getPointDistance(this._boundingPlanes[s],t)>0&&(n.push(s),i.push(this._planeVertices[s]),o=this._edgeNormals[s]);if(n.length===0)return 0;let a,c;if(n.length===1)return c=this._boundingPlanes[n[0]],a=ZK(cn.projectPointOntoPlane(c,t,RK),i[0],c,o),m.distance(a,t);if(n.length===2){if(n[0]===0){let p=[this._vertices[4*n[0]+(n[1]-2)],this._vertices[4*n[0]+(n[1]-2+1)%4]];return a=Yle(t,p[0],p[1]),m.distance(a,t)}let u=Number.MAX_VALUE,h;for(r=0;r<2;r++)c=this._boundingPlanes[n[r]],a=ZK(cn.projectPointOntoPlane(c,t,RK),i[r],c,this._edgeNormals[n[r]]),h=m.distanceSquared(a,t),h3)return a=ZK(cn.projectPointOntoPlane(this._boundingPlanes[1],t,RK),this._planeVertices[1],this._boundingPlanes[1],this._edgeNormals[1]),m.distance(a,t);let d=n[1]===2&&n[2]===5?0:1;return n[0]===0?m.distance(t,this._vertices[(n[1]-2+d)%4]):m.distance(t,this._vertices[4+(n[1]-2+d)%4])};var bJe=new m,gJe=new m;function Yle(e,t,n){let i=m.subtract(n,t,bJe),o=m.subtract(e,t,gJe),r=m.dot(i,o);if(r<=0)return t;let s=m.dot(i,i);return r>=s?n:(r=r/s,new m((1-r)*t.x+r*n.x,(1-r)*t.y+r*n.y,(1-r)*t.z+r*n.z))}var yJe=new cn(m.UNIT_X,0);function ZK(e,t,n,i){let o=Number.MAX_VALUE,r,s,a;for(let c=0;c0&&(f=!0,h+=d),s1||ci(n,"3DTILES_multiple_contents"),s=o&&!r?n.contents[0]:n.content;this._contentHeader=s,this.transform=l(n.transform)?M.unpack(n.transform):M.clone(M.IDENTITY);let a=l(i)?i.computedTransform:e.modelMatrix,c=M.multiply(a,this.transform,new M),d=l(i)?i._initialTransform:M.IDENTITY;this._initialTransform=M.multiply(d,this.transform,new M),this.computedTransform=c,this.metadata=mP(e,n),this._verticalExaggeration=1,this._verticalExaggerationRelativeHeight=0,this._boundingVolume=this.createBoundingVolume(n.boundingVolume,c),this._boundingVolume2D=void 0;let u;l(s)&&l(s.boundingVolume)&&(u=this.createBoundingVolume(s.boundingVolume,c)),this._contentBoundingVolume=u,this._contentBoundingVolume2D=void 0;let h;l(n.viewerRequestVolume)&&(h=this.createBoundingVolume(n.viewerRequestVolume,c)),this._viewerRequestVolume=h,this.geometricError=n.geometricError,this._geometricError=n.geometricError,l(this._geometricError)||(this._geometricError=l(i)?i._geometricError:e._geometricError,rr._deprecationWarning("geometricErrorUndefined","Required property geometricError is undefined for this tile. Using parent's geometric error instead.")),this.updateGeometricErrorScale();let p;l(n.refine)?((n.refine==="replace"||n.refine==="add")&&rr._deprecationWarning("lowercase-refine",`This tile uses a lowercase refine "${n.refine}". Instead use "${n.refine.toUpperCase()}".`),p=n.refine.toUpperCase()==="REPLACE"?Oo.REPLACE:Oo.ADD):l(i)?p=i.refine:p=Oo.REPLACE,this.refine=p,this.children=[],this.parent=i;let g,f=!1,x,_,C;if(t=Re.createIfNeeded(t),r)x=Ho.UNLOADED,_=t.clone();else if(l(s)){let G=s.uri;l(s.url)&&(rr._deprecationWarning("contentUrl",'This tileset JSON uses the "content.url" property which has been deprecated. Use "content.uri" instead.'),G=s.url),G===""?(rr._deprecationWarning("contentUriEmpty","content.uri property is an empty string, which creates a circular dependency, making this tileset invalid. Omit the content property instead"),g=new V1(e,this),f=!0,x=Ho.READY):(x=Ho.UNLOADED,_=t.getDerivedResource({url:G}),C=ic.getServerKey(_.getUrlComponent()))}else g=new V1(e,this),f=!0,x=Ho.READY;this._content=g,this._contentResource=_,this._contentState=x,this._expiredContent=void 0,this._serverKey=C,this.hasEmptyContent=f,this.hasTilesetContent=!1,this.hasImplicitContent=!1,this.hasRenderableContent=!f,this.hasImplicitContentMetadata=!1,this.hasMultipleContents=r,this.cacheNode=void 0;let V=n.expire,L,R;l(V)&&(L=V.duration,l(V.date)&&(R=q.fromIso8601(V.date))),this.expireDuration=L,this.expireDate=R,this.lastStyleTime=0,this._optimChildrenWithinParent=Bu.NOT_COMPUTED,this.clippingPlanesDirty=!1,this.clippingPolygonsDirty=!1,this.priorityDeferred=!1,this.implicitTileset=void 0,this.implicitCoordinates=void 0,this.implicitSubtree=void 0,this._distanceToCamera=0,this._centerZDepth=0,this._screenSpaceError=0,this._screenSpaceErrorProgressiveResolution=0,this._visibilityPlaneMask=0,this._visible=!1,this._inRequestVolume=!1,this._finalResolution=!0,this._depth=0,this._stackLength=0,this._selectionDepth=0,this._updatedVisibilityFrame=0,this._touchedFrame=0,this._visitedFrame=0,this._selectedFrame=0,this._wasSelectedLastFrame=!1,this._requestedFrame=0,this._ancestorWithContent=void 0,this._ancestorWithContentAvailable=void 0,this._refines=!1,this._shouldSelect=!1,this._isClipped=!0,this._isClippedByPolygon=!1,this._clippingPlanesState=0,this._clippingPolygonsState=0,this._debugBoundingVolume=void 0,this._debugContentBoundingVolume=void 0,this._debugViewerRequestVolume=void 0,this._debugColor=B.fromRandom({alpha:1}),this._debugColorizeTiles=!1,this._priority=0,this._priorityHolder=this,this._priorityProgressiveResolution=!1,this._priorityProgressiveResolutionScreenSpaceErrorLeaf=!1,this._priorityReverseScreenSpaceError=0,this._foveatedFactor=0,this._wasMinPriorityChild=!1,this._loadTimestamp=new q,this._commandsLength=0,this._color=void 0,this._colorDirty=!1,this._request=void 0}rr._deprecationWarning=Ma;Object.defineProperties(rr.prototype,{tileset:{get:function(){return this._tileset}},content:{get:function(){return this._content}},boundingVolume:{get:function(){return this._boundingVolume}},contentBoundingVolume:{get:function(){return y(this._contentBoundingVolume,this._boundingVolume)}},boundingSphere:{get:function(){return this._boundingVolume.boundingSphere}},isVisible:{get:function(){return this._visible&&this._inRequestVolume}},extras:{get:function(){return this._header.extras}},color:{get:function(){return l(this._color)||(this._color=new B),B.clone(this._color)},set:function(e){this._color=B.clone(e,this._color),this._colorDirty=!0}},contentAvailable:{get:function(){return this.contentReady&&this.hasRenderableContent||l(this._expiredContent)&&!this.contentFailed}},contentReady:{get:function(){return this._contentState===Ho.READY}},contentUnloaded:{get:function(){return this._contentState===Ho.UNLOADED}},hasUnloadedRenderableContent:{get:function(){return this.hasRenderableContent&&this.contentUnloaded}},contentExpired:{get:function(){return this._contentState===Ho.EXPIRED}},contentFailed:{get:function(){return this._contentState===Ho.FAILED}},commandsLength:{get:function(){return this._commandsLength}}});var zg=new m;function LJe(e,t){let{tileset:n,boundingSphere:i}=e,{radius:o,center:r}=i,{camera:s}=t,a=m.multiplyByScalar(s.directionWC,e._centerZDepth,zg),c=m.add(s.positionWC,a,zg),d=m.subtract(c,r,zg);if(m.magnitude(d)>o){let R=m.normalize(d,zg),G=m.multiplyByScalar(R,o,zg),I=m.add(r,G,zg),v=m.subtract(I,s.positionWC,zg),P=m.normalize(v,zg);e._foveatedFactor=1-Math.abs(m.dot(s.directionWC,P))}else e._foveatedFactor=0;let p=e.refine===Oo.REPLACE,g=n.isSkippingLevelOfDetail;if(p&&!g||!n.foveatedScreenSpaceError||n.foveatedConeSize===1||e._priorityProgressiveResolution&&p&&g||n._pass===Ao.PRELOAD_FLIGHT||n._pass===Ao.PRELOAD)return!1;let f=1-Math.cos(s.frustum.fov*.5),x=n.foveatedConeSize*f;if(e._foveatedFactor<=x)return!1;let _=f-x,C=W.clamp((e._foveatedFactor-x)/_,0,1),V=n.foveatedInterpolationCallback(n.foveatedMinimumScreenSpaceErrorRelaxation,n.memoryAdjustedScreenSpaceError,C),L=e._screenSpaceError===0&&l(e.parent)?e.parent._screenSpaceError*.5:e._screenSpaceError;return n.memoryAdjustedScreenSpaceError-V<=L}var $le=new q;rr.prototype.getScreenSpaceError=function(e,t,n){let i=this._tileset,o=y(n,1),r=l(this.parent)?this.parent.geometricError:i._scaledGeometricError,s=t?r:this.geometricError;if(s===0)return 0;let{camera:a,context:c}=e,d=a.frustum,u=c.drawingBufferWidth,h=c.drawingBufferHeight*o,p;if(e.mode===oe.SCENE2D||d instanceof ln){let g=d.offCenterFrustum;l(g)&&(d=g);let f=Math.max(d.top-d.bottom,d.right-d.left)/Math.max(u,h);p=s/f}else{let g=Math.max(this._distanceToCamera,W.EPSILON7),f=d.sseDenominator;if(p=s*h/(g*f),i.dynamicScreenSpaceError){let x=i._dynamicScreenSpaceErrorComputedDensity,_=i.dynamicScreenSpaceErrorFactor,C=W.fog(g,x)*_;p-=C}}return p/=e.pixelRatio,p};function RJe(e,t){if(e.progressiveResolutionHeightFraction<=0||e.progressiveResolutionHeightFraction>.5)return!1;let n=e.memoryAdjustedScreenSpaceError,i=t._screenSpaceErrorProgressiveResolution>n;t._priorityProgressiveResolutionScreenSpaceErrorLeaf=!1;let o=t.parent,r=t._screenSpaceErrorProgressiveResolution<=n,s=l(o)&&o._screenSpaceErrorProgressiveResolution>n;return r&&s&&(t._priorityProgressiveResolutionScreenSpaceErrorLeaf=!0,i=!0),i}function ZJe(e,t){let n=t.parent,o=l(n)&&(!e.isSkippingLevelOfDetail||t._screenSpaceError===0||n.hasTilesetContent||n.hasImplicitContent)?n._screenSpaceError:t._screenSpaceError;return e.root._screenSpaceError-o}rr.prototype.updateVisibility=function(e){let{parent:t,tileset:n}=this;if(this._updatedVisibilityFrame===n._updatedVisibilityFrame)return;let i=l(t)?t.computedTransform:n.modelMatrix,o=l(t)?t._visibilityPlaneMask:ps.MASK_INDETERMINATE;this.updateTransform(i,e),this._distanceToCamera=this.distanceToTile(e),this._centerZDepth=this.distanceToTileCenter(e),this._screenSpaceError=this.getScreenSpaceError(e,!1),this._screenSpaceErrorProgressiveResolution=this.getScreenSpaceError(e,!1,n.progressiveResolutionHeightFraction),this._visibilityPlaneMask=this.visibility(e,o),this._visible=this._visibilityPlaneMask!==ps.MASK_OUTSIDE,this._inRequestVolume=this.insideViewerRequestVolume(e),this._priorityReverseScreenSpaceError=ZJe(n,this),this._priorityProgressiveResolution=RJe(n,this),this.priorityDeferred=LJe(this,e),this._updatedVisibilityFrame=n._updatedVisibilityFrame};rr.prototype.updateExpiration=function(){if(l(this.expireDate)&&this.contentReady&&!this.hasEmptyContent&&!this.hasMultipleContents){let e=q.now($le);q.lessThan(this.expireDate,e)&&(this._contentState=Ho.EXPIRED,this._expiredContent=this._content)}};function GJe(e){if(!l(e.expireDuration))return;let t=q.now($le);q.addSeconds(t,e.expireDuration,t),l(e.expireDate)?q.lessThan(e.expireDate,t)&&q.clone(t,e.expireDate):e.expireDate=q.clone(t)}function EJe(e){return function(){return e._priority}}rr.prototype.requestContent=function(){if(!this.hasEmptyContent)return this.hasMultipleContents?IJe(this):WJe(this)};function IJe(e){let t=e._content,n=e._tileset;if(!l(t)){let o=ci(e._header,"3DTILES_multiple_contents")?e._header.extensions["3DTILES_multiple_contents"]:e._header;t=new hP(n,e,e._contentResource.clone(),o),e._content=t}let i=t.requestInnerContents();if(l(i))return e._contentState=Ho.LOADING,i.then(o=>{if(!e.isDestroyed()&&l(o))return e._contentState=Ho.PROCESSING,t}).catch(o=>{if(!e.isDestroyed())throw e._contentState=Ho.FAILED,o})}async function XJe(e,t,n,i,o){let r=e._contentState;e._contentState=Ho.LOADING,++t.statistics.numberOfPendingRequests;let s;try{s=await o}catch(a){if(--t.statistics.numberOfPendingRequests,e.isDestroyed())return;if(n.cancelled||n.state===ei.CANCELLED){e._contentState=r,++t.statistics.numberOfAttemptedRequests;return}throw e._contentState=Ho.FAILED,a}if(e.isDestroyed()){--t.statistics.numberOfPendingRequests;return}if(n.cancelled||n.state===ei.CANCELLED){e._contentState=r,--t.statistics.numberOfPendingRequests,++t.statistics.numberOfAttemptedRequests;return}try{let a=await PJe(e,s);return--t.statistics.numberOfPendingRequests,e.isDestroyed()?void 0:(i&&(e.expireDate=void 0),e._content=a,e._contentState=Ho.PROCESSING,a)}catch(a){if(--t.statistics.numberOfPendingRequests,e.isDestroyed())return;throw e._contentState=Ho.FAILED,a}}function WJe(e){let t=e._contentResource.clone(),n=e.contentExpired;n&&t.setQueryParameters({expired:e.expireDate.toString()});let i=new Qo({throttle:!0,throttleByServer:!0,type:ms.TILES3D,priorityFunction:EJe(e),serverKey:e._serverKey});e._request=i,t.request=i;let o=e._tileset,r=t.fetchArrayBuffer();if(!l(r)){++o.statistics.numberOfAttemptedRequests;return}return XJe(e,o,i,n,r)}async function PJe(e,t){let n=vb(t),i=e._tileset;i._disableSkipLevelOfDetail=i._disableSkipLevelOfDetail||n.contentType===Is.GEOMETRY||n.contentType===Is.VECTOR,(n.contentType===Is.IMPLICIT_SUBTREE||n.contentType===Is.IMPLICIT_SUBTREE_JSON)&&(e.hasImplicitContent=!0,e.hasRenderableContent=!1),n.contentType===Is.EXTERNAL_TILESET&&(e.hasTilesetContent=!0,e.hasRenderableContent=!1);let o,r=Y_[n.contentType];if(e.isDestroyed())return;l(n.binaryPayload)?o=await Promise.resolve(r(i,e,e._contentResource,n.binaryPayload.buffer,0)):o=await Promise.resolve(r(i,e,e._contentResource,n.jsonPayload));let s=e._contentHeader;if(e.hasImplicitContentMetadata){let c=e.implicitSubtree,d=e.implicitCoordinates;o.metadata=c.getContentMetadataView(d,0)}else e.hasImplicitContent||(o.metadata=H_(i,s));let a=z_(i,s);return l(a)&&(o.group=new n_({metadata:a})),o}rr.prototype.cancelRequests=function(){this.hasMultipleContents?this._content.cancelRequests():this._request.cancel()};rr.prototype.unloadContent=function(){this.hasRenderableContent&&(this._content=this._content&&this._content.destroy(),this._contentState=Ho.UNLOADED,this.lastStyleTime=0,this.clippingPlanesDirty=this._clippingPlanesState===0,this._clippingPlanesState=0,this.clippingPolygonsDirty=this._clippingPolygonsState===0,this._clippingPolygonsState=0,this._debugColorizeTiles=!1,this._debugBoundingVolume=this._debugBoundingVolume&&this._debugBoundingVolume.destroy(),this._debugContentBoundingVolume=this._debugContentBoundingVolume&&this._debugContentBoundingVolume.destroy(),this._debugViewerRequestVolume=this._debugViewerRequestVolume&&this._debugViewerRequestVolume.destroy())};var ede=new de;function IK(e,t){if(t.mode!==oe.SCENE3D&&!l(e._boundingVolume2D)){let n=e._boundingVolume.boundingSphere,i=de.projectTo2D(n,t.mapProjection,ede);e._boundingVolume2D=new Mb(i.center,i.radius)}return t.mode!==oe.SCENE3D?e._boundingVolume2D:e._boundingVolume}function vJe(e,t){if(t.mode!==oe.SCENE3D&&!l(e._contentBoundingVolume2D)){let n=e._contentBoundingVolume.boundingSphere,i=de.projectTo2D(n,t.mapProjection,ede);e._contentBoundingVolume2D=new Mb(i.center,i.radius)}return t.mode!==oe.SCENE3D?e._contentBoundingVolume2D:e._contentBoundingVolume}rr.prototype.visibility=function(e,t){let n=e.cullingVolume,i=IK(this,e),o=this._tileset,r=o.clippingPlanes;if(l(r)&&r.enabled){let a=r.computeIntersectionWithBoundingVolume(i,o.clippingPlanesOriginMatrix);if(this._isClipped=a!==zt.INSIDE,a===zt.OUTSIDE)return ps.MASK_OUTSIDE}let s=o.clippingPolygons;if(l(s)&&s.enabled){let a=s.computeIntersectionWithBoundingVolume(i);this._isClippedByPolygon=a!==zt.OUTSIDE}return n.computeVisibilityWithPlaneMask(i,t)};rr.prototype.contentVisibility=function(e){if(!l(this._contentBoundingVolume))return zt.INSIDE;if(this._visibilityPlaneMask===ps.MASK_INSIDE)return zt.INSIDE;let t=e.cullingVolume,n=vJe(this,e),i=this._tileset,o=i.clippingPlanes;if(l(o)&&o.enabled){let s=o.computeIntersectionWithBoundingVolume(n,i.clippingPlanesOriginMatrix);if(this._isClipped=s!==zt.INSIDE,s===zt.OUTSIDE)return zt.OUTSIDE}let r=i.clippingPolygons;if(l(r)&&r.enabled){let s=r.computeIntersectionWithBoundingVolume(n);if(this._isClippedByPolygon=s!==zt.OUTSIDE,s===zt.INSIDE)return zt.OUTSIDE}return t.computeVisibility(n)};rr.prototype.distanceToTile=function(e){return IK(this,e).distanceToCamera(e)};var wJe=new m;rr.prototype.distanceToTileCenter=function(e){let n=IK(this,e).boundingVolume,i=m.subtract(n.center,e.camera.positionWC,wJe);return m.dot(e.camera.directionWC,i)};rr.prototype.insideViewerRequestVolume=function(e){let t=this._viewerRequestVolume;return!l(t)||t.distanceToCamera(e)===0};var tde=new $,nde=new m,FJe=new $,XK=new m,ide=new le,ode=new Gn,EK=new M;function AJe(e,t,n){let i=m.fromElements(e[0],e[1],e[2],XK),o=$.fromArray(e,3,FJe);i=M.multiplyByPoint(t,i,i);let r=M.getMatrix3(t,tde);return o=$.multiply(r,o,o),l(n)?(n.update(i,o),n):new Yl(i,o)}function Jle(e,t,n,i){let o=le.unpack(e,0,ide),r=e[4],s=e[5],a=Gn.fromRectangle(o,r,s,ne.WGS84,ode),c=a.center,d=a.halfAxes;t=M.multiplyTransformation(t,M.inverseTransformation(n,EK),EK),c=M.multiplyByPoint(t,c,c);let u=M.getMatrix3(t,tde);return d=$.multiply(u,d,d),l(i)&&i instanceof Yl?(i.update(c,d),i):new Yl(c,d)}function MJe(e,t,n,i){if(!M.equalsEpsilon(t,n,W.EPSILON8))return i instanceof Yl?Jle(e,t,n,i):Jle(e,t,n,void 0);let o=le.unpack(e,0,ide);return i instanceof Xd?(i.rectangle=le.clone(o,i.rectangle),i.minimumHeight=e[4],i.maximumHeight=e[5],i.computeBoundingVolumes(ne.WGS84),i):new Xd({rectangle:o,minimumHeight:e[4],maximumHeight:e[5]})}function NJe(e,t,n){let i=m.fromElements(e[0],e[1],e[2],XK),o=e[3];i=M.multiplyByPoint(t,i,i);let r=M.getScale(t,nde),s=m.maximumComponent(r);return o*=s,l(n)?(n.update(i,o),n):new Mb(i,o)}rr.prototype.createBoundingVolume=function(e,t,n){let i=this.metadata,o;if(l(i)&&(o=T_.parseBoundingVolumeSemantic("TILE",i)),l(o)&&(e=o),!l(e))throw new ce("boundingVolume must be defined");if(ci(e,"3DTILES_bounding_volume_S2"))return new gP(e.extensions["3DTILES_bounding_volume_S2"]);let{box:r,region:s,sphere:a}=e;if(l(r)){let c=AJe(r,t,n);return this._verticalExaggeration!==1&&Qle(c,this._verticalExaggeration,this._verticalExaggerationRelativeHeight),c}if(l(s)){let c=MJe(s,t,this._initialTransform,n);return this._verticalExaggeration===1||(c instanceof Yl?Qle(c,this._verticalExaggeration,this._verticalExaggerationRelativeHeight):(c.minimumHeight=Sr.getHeight(c.minimumHeight,this._verticalExaggeration,this._verticalExaggerationRelativeHeight),c.maximumHeight=Sr.getHeight(c.maximumHeight,this._verticalExaggeration,this._verticalExaggerationRelativeHeight),c.computeBoundingVolumes(ne.WGS84))),c}if(l(a)){let c=NJe(a,t,n);if(this._verticalExaggeration!==1){let d=Sr.getPosition(c.center,ne.WGS84,this._verticalExaggeration,this._verticalExaggerationRelativeHeight,XK),u=c.radius*this._verticalExaggeration;c.update(d,u)}return c}throw new ce("boundingVolume must contain a sphere, region, or box")};var kJe=m.unpackArray(new Array(8*3).fill(0));function Qle(e,t,n){let i=e.boundingVolume.computeCorners(kJe).map(r=>Sr.getPosition(r,ne.WGS84,t,n,r)),o=Gn.fromPoints(i,ode);e.update(o.center,o.halfAxes)}rr.prototype.updateTransform=function(e,t){e=y(e,M.IDENTITY);let n=M.multiplyTransformation(e,this.transform,EK),i=!M.equals(n,this.computedTransform),o=l(t)&&(this._verticalExaggeration!==t.verticalExaggeration||this._verticalExaggerationRelativeHeight!==t.verticalExaggerationRelativeHeight);if(!i&&!o)return;i&&M.clone(n,this.computedTransform),o&&(this._verticalExaggeration=t.verticalExaggeration,this._verticalExaggerationRelativeHeight=t.verticalExaggerationRelativeHeight);let r=this._header,s=this._contentHeader;this._boundingVolume=this.createBoundingVolume(r.boundingVolume,this.computedTransform,this._boundingVolume),l(this._contentBoundingVolume)&&(this._contentBoundingVolume=this.createBoundingVolume(s.boundingVolume,this.computedTransform,this._contentBoundingVolume)),l(this._viewerRequestVolume)&&(this._viewerRequestVolume=this.createBoundingVolume(r.viewerRequestVolume,this.computedTransform,this._viewerRequestVolume)),this.updateGeometricErrorScale(),this._debugBoundingVolume=this._debugBoundingVolume&&this._debugBoundingVolume.destroy(),this._debugContentBoundingVolume=this._debugContentBoundingVolume&&this._debugContentBoundingVolume.destroy(),this._debugViewerRequestVolume=this._debugViewerRequestVolume&&this._debugViewerRequestVolume.destroy()};rr.prototype.updateGeometricErrorScale=function(){let e=M.getScale(this.computedTransform,nde),t=m.maximumComponent(e);if(this.geometricError=this._geometricError*t,!l(this.parent)){let n=this._tileset;n._scaledGeometricError=n._geometricError*t}};function UJe(e,t,n,i){if(!i.isRender)return;let o=l(e._contentHeader)&&l(e._contentHeader.boundingVolume),r=t.debugShowBoundingVolume||t.debugShowContentBoundingVolume&&!o;if(r){let c;e._finalResolution?e.hasRenderableContent?c=B.WHITE:c=B.DARKGRAY:c=B.YELLOW,l(e._debugBoundingVolume)||(e._debugBoundingVolume=e._boundingVolume.createDebugVolume(c)),e._debugBoundingVolume.update(n);let d=e._debugBoundingVolume.getGeometryInstanceAttributes("outline");d.color=Ht.toValue(c,d.color)}else!r&&l(e._debugBoundingVolume)&&(e._debugBoundingVolume=e._debugBoundingVolume.destroy());t.debugShowContentBoundingVolume&&o?(l(e._debugContentBoundingVolume)||(e._debugContentBoundingVolume=e._contentBoundingVolume.createDebugVolume(B.BLUE)),e._debugContentBoundingVolume.update(n)):!t.debugShowContentBoundingVolume&&l(e._debugContentBoundingVolume)&&(e._debugContentBoundingVolume=e._debugContentBoundingVolume.destroy()),t.debugShowViewerRequestVolume&&l(e._viewerRequestVolume)?(l(e._debugViewerRequestVolume)||(e._debugViewerRequestVolume=e._viewerRequestVolume.createDebugVolume(B.YELLOW)),e._debugViewerRequestVolume.update(n)):!t.debugShowViewerRequestVolume&&l(e._debugViewerRequestVolume)&&(e._debugViewerRequestVolume=e._debugViewerRequestVolume.destroy());let s=t.debugColorizeTiles&&!e._debugColorizeTiles||l(t._heatmap.tilePropertyName),a=!t.debugColorizeTiles&&e._debugColorizeTiles;s?(t._heatmap.colorize(e,n),e._debugColorizeTiles=!0,e.color=e._debugColor):a&&(e._debugColorizeTiles=!1,e.color=B.WHITE),e._colorDirty&&(e._colorDirty=!1,e._content.applyDebugSettings(!0,e._color)),a&&t.makeStyleDirty()}function DJe(e,t,n){let i=e._expiredContent;if(!e.hasMultipleContents&&l(i)){if(!e.contentReady){try{i.update(t,n)}catch{}return}e._expiredContent.destroy(),e._expiredContent=void 0}if(l(e.content))try{e.content.update(t,n)}catch(o){throw e._contentState=Ho.FAILED,o}}function BJe(e,t){let n=t.clippingPlanes,i=0;l(n)&&e._isClipped&&n.enabled&&(i=n.clippingPlanesState),i!==e._clippingPlanesState&&(e._clippingPlanesState=i,e.clippingPlanesDirty=!0)}function OJe(e,t){let n=t.clippingPolygons,i=0;l(n)&&e._isClippedByPolygon&&n.enabled&&(i=n.clippingPolygonsState),i!==e._clippingPolygonsState&&(e._clippingPolygonsState=i,e.clippingPolygonsDirty=!0)}rr.prototype.update=function(e,t,n){let{commandList:i}=t,o=i.length;BJe(this,e),OJe(this,e),UJe(this,e,t,n),DJe(this,e,t);let r=i.length;this._commandsLength=r-o;for(let s=o;se.cacheBytes||n);){let s=r.item;r=r.next,this.unloadTile(e,s,t)}};nT.prototype.trim=function(){this._trimTiles=!0};var SP=nT;var tBn=T(S(),1);function Xk(e){this.tilePropertyName=e,this._minimum=Number.MAX_VALUE,this._maximum=-Number.MAX_VALUE,this._previousMinimum=Number.MAX_VALUE,this._previousMaximum=-Number.MAX_VALUE,this._referenceMinimum={},this._referenceMaximum={}}function PK(e,t){let n;return t==="_loadTimestamp"?n=q.toDate(e).getTime():n=e,n}Xk.prototype.setReferenceMinimumMaximum=function(e,t,n){this._referenceMinimum[n]=PK(e,n),this._referenceMaximum[n]=PK(t,n)};function zJe(e,t){let n=e.tilePropertyName;if(l(n)){let i=PK(t[n],n);return l(i)?(e._maximum=Math.max(i,e._maximum),e._minimum=Math.min(i,e._minimum),i):(e.tilePropertyName=void 0,i)}}var WK=[new B(.1,.1,.1,1),new B(.153,.278,.878,1),new B(.827,.231,.49,1),new B(.827,.188,.22,1),new B(1,.592,.259,1),new B(1,.843,0,1)];Xk.prototype.colorize=function(e,t){let n=this.tilePropertyName;if(!l(n)||!e.contentAvailable||e._selectedFrame!==t.frameNumber)return;let i=zJe(this,e),o=this._previousMinimum,r=this._previousMaximum;if(o===Number.MAX_VALUE||r===-Number.MAX_VALUE)return;let s=r-o+W.EPSILON7,c=W.clamp(i-o,0,s)/s,d=WK.length-1,u=c*d,h=Math.floor(u),p=Math.ceil(u),g=u-h,f=WK[h],x=WK[p],_=B.clone(B.WHITE);_.red=W.lerp(f.red,x.red,g),_.green=W.lerp(f.green,x.green,g),_.blue=W.lerp(f.blue,x.blue,g),e._debugColor=_};Xk.prototype.resetMinimumMaximum=function(){let e=this.tilePropertyName;if(l(e)){let t=this._referenceMinimum[e],n=this._referenceMaximum[e],i=l(t)&&l(n);this._previousMinimum=i?t:this._minimum,this._previousMaximum=i?n:this._maximum,this._minimum=Number.MAX_VALUE,this._maximum=-Number.MAX_VALUE}};var CP=Xk;var rBn=T(S(),1);function w1(){this.selected=0,this.visited=0,this.numberOfCommands=0,this.numberOfAttemptedRequests=0,this.numberOfPendingRequests=0,this.numberOfTilesProcessing=0,this.numberOfTilesWithContentReady=0,this.numberOfTilesTotal=0,this.numberOfLoadedTilesTotal=0,this.numberOfFeaturesSelected=0,this.numberOfFeaturesLoaded=0,this.numberOfPointsSelected=0,this.numberOfPointsLoaded=0,this.numberOfTrianglesSelected=0,this.numberOfTilesStyled=0,this.numberOfFeaturesStyled=0,this.numberOfTilesCulledWithChildrenUnion=0,this.geometryByteLength=0,this.texturesByteLength=0,this.texturesReferenceCounterById={},this.batchTableByteLength=0}w1.prototype.clear=function(){this.selected=0,this.visited=0,this.numberOfCommands=0,this.numberOfAttemptedRequests=0,this.numberOfFeaturesSelected=0,this.numberOfPointsSelected=0,this.numberOfTrianglesSelected=0,this.numberOfTilesStyled=0,this.numberOfFeaturesStyled=0,this.numberOfTilesCulledWithChildrenUnion=0};w1.prototype.incrementSelectionCounts=function(e){this.numberOfFeaturesSelected+=e.featuresLength,this.numberOfPointsSelected+=e.pointsLength,this.numberOfTrianglesSelected+=e.trianglesLength;let t=e.innerContents;if(l(t)){let n=t.length;for(let i=0;i>1)&858993459,e=(e^e>>2)&252645135,e=(e^e>>4)&16711935,e=(e^e>>8)&65535,e}function wK(e){return e&=153391689,e=(e^e>>2)&51130563,e=(e^e>>4)&50393103,e=(e^e>>8)&4278190335,e=(e^e>>16)&1023,e}RP.encode2D=function(e,t){return(cde(e)|cde(t)<<1)>>>0};RP.decode2D=function(e,t){return l(t)||(t=new Array(2)),t[0]=lde(e),t[1]=lde(e>>1),t};RP.encode3D=function(e,t,n){return vK(e)|vK(t)<<1|vK(n)<<2};RP.decode3D=function(e,t){return l(t)||(t=new Array(3)),t[0]=wK(e),t[1]=wK(e>>1),t[2]=wK(e>>2),t};var Kg=RP;function zo(e){this.subdivisionScheme=e.subdivisionScheme,this.subtreeLevels=e.subtreeLevels,this.level=e.level,this.x=e.x,this.y=e.y,this.z=void 0,e.subdivisionScheme===ts.OCTREE&&(this.z=e.z)}Object.defineProperties(zo.prototype,{childIndex:{get:function(){let e=0;return e|=this.x&1,e|=(this.y&1)<<1,this.subdivisionScheme===ts.OCTREE&&(e|=(this.z&1)<<2),e}},mortonIndex:{get:function(){return this.subdivisionScheme===ts.OCTREE?Kg.encode3D(this.x,this.y,this.z):Kg.encode2D(this.x,this.y)}},tileIndex:{get:function(){let e=this.subdivisionScheme===ts.OCTREE?((1<<3*this.level)-1)/7:((1<<2*this.level)-1)/3,t=this.mortonIndex;return e+t}}});zo.prototype.getDescendantCoordinates=function(e){let t=this.level+e.level,n=(this.x<>t,i=e.y>>t,o=this.x===n,r=this.y===i;if(this.subdivisionScheme===ts.OCTREE){let s=e.z>>t,a=this.z===s;return o&&r&&a}return o&&r};zo.prototype.isEqual=function(e){return this.subdivisionScheme===e.subdivisionScheme&&this.subtreeLevels===e.subtreeLevels&&this.level===e.level&&this.x===e.x&&this.y===e.y&&(this.subdivisionScheme===ts.OCTREE?this.z===e.z:!0)};zo.prototype.isImplicitTilesetRoot=function(){return this.level===0};zo.prototype.isSubtreeRoot=function(){return this.level%this.subtreeLevels===0};zo.prototype.isBottomOfSubtree=function(){return this.level%this.subtreeLevels===this.subtreeLevels-1};zo.prototype.getTemplateValues=function(){let e={level:this.level,x:this.x,y:this.y};return this.subdivisionScheme===ts.OCTREE&&(e.z=this.z),e};var dde=[0,0,0];zo.fromMortonIndex=function(e,t,n,i){let o;return e===ts.OCTREE?(o=Kg.decode3D(i,dde),new zo({subdivisionScheme:e,subtreeLevels:t,level:n,x:o[0],y:o[1],z:o[2]})):(o=Kg.decode2D(i,dde),new zo({subdivisionScheme:e,subtreeLevels:t,level:n,x:o[0],y:o[1]}))};zo.fromTileIndex=function(e,t,n){let i,o,r;return e===ts.OCTREE?(i=Math.floor(W.log2(7*n+1)/3),o=((1<<3*i)-1)/7,r=n-o):(i=Math.floor(W.log2(3*n+1)/2),o=((1<<2*i)-1)/3,r=n-o),zo.fromMortonIndex(e,t,i,r)};var oT=zo;var ABn=T(S(),1);var XBn=T(S(),1);function Ub(){}Ub.selectTiles=function(e,t){fe.throwInstantiationError()};Ub.sortChildrenByDistanceToCamera=function(e,t){return t._distanceToCamera===0&&e._distanceToCamera===0?t._centerZDepth-e._centerZDepth:t._distanceToCamera-e._distanceToCamera};Ub.canTraverse=function(e){return e.children.length===0?!1:e.hasTilesetContent||e.hasImplicitContent?!e.contentExpired:e._screenSpaceError>e.tileset.memoryAdjustedScreenSpaceError};Ub.selectTile=function(e,t){if(e.contentVisibility(t)===zt.OUTSIDE)return;e._wasSelectedLastFrame=!0;let{content:n,tileset:i}=e;n.featurePropertiesDirty?(n.featurePropertiesDirty=!1,e.lastStyleTime=0,i._selectedTilesToStyle.push(e)):e._selectedFrame0;if((e.hasTilesetContent||e.hasImplicitContent)&&n){let r=e.children[0];ude(r,t),e._visible=r._visible;return}if(qJe(e,t)){e._visible=!1;return}let i=e.refine===Oo.REPLACE,o=e._optimChildrenWithinParent===Bu.USE_OPTIMIZATION;if(i&&o&&n&&!$Je(e,t)){++e.tileset._statistics.numberOfTilesCulledWithChildrenUnion,e._visible=!1;return}}function qJe(e,t){let{parent:n,tileset:i}=e;return!l(n)||n.hasTilesetContent||n.hasImplicitContent||n.refine!==Oo.ADD?!1:e.getScreenSpaceError(t,!0)<=i.memoryAdjustedScreenSpaceError}function $Je(e,t){let n=!1,i=e.children;for(let o=0;o0;){ZP.stackMaximumLength=Math.max(ZP.stackMaximumLength,s.length);let a=s.pop(),c=a.refine===Oo.ADD,d=a.refine===Oo.REPLACE,u=tQe(a);u&&nQe(a,s,t),(c||d&&!u)&&(iQe(e,a),o(a,t),oQe(a,t),a.hasRenderableContent&&!a.contentAvailable&&(n=!1)),r(a,t)}return ZP.stack.trim(ZP.stackMaximumLength),n};function tQe(e){return e.children.length===0?!1:e.hasTilesetContent||e.hasImplicitContent?!e.contentExpired:(e.hasEmptyContent,!0)}function nQe(e,t,n){let{children:i}=e;for(let o=0;o0;){EP.stackMaximumLength=Math.max(EP.stackMaximumLength,a.length);let c=a.pop(),d=c.parent,u=!l(d)||d._refines;c._refines=i(c)?rQe(c,a,t)&&u:!1;let h=!c._refines&&u;c.hasRenderableContent?c.refine===Oo.ADD?(FK(c,t),o(c,t)):c.refine===Oo.REPLACE&&(o(c,t),h&&FK(c,t)):(n._emptyTiles.push(c),o(c,t),h&&FK(c,t)),r(c,t),s(c,t)}}function aQe(e,t){let{canTraverse:n,updateTile:i,loadTile:o,touchTile:r}=$s,s=!0,a=IP.stack;for(a.push(e);a.length>0;){IP.stackMaximumLength=Math.max(IP.stackMaximumLength,a.length);let c=a.pop(),d=c.children,u=d.length,h=!c.hasRenderableContent&&n(c);if(!h&&!c.contentAvailable&&(s=!1),i(c,t),c.isVisible||(o(c,t),r(c,t)),h)for(let p=0;p0;){PP.stackMaximumLength=Math.max(PP.stackMaximumLength,r.length);let a=r.pop().children;for(let c=0;cn._depth+e.skipLevels)}function mQe(e,t,n){let{tileset:i,children:o}=e,{updateTile:r,loadTile:s,touchTile:a}=$s;for(let d=0;dt:e._screenSpaceError>t:!0}function fQe(e,t){let{tileset:n}=e,i=n.immediatelyLoadDesiredLevelOfDetail?Number.MAX_VALUE:Math.max(n.baseScreenSpaceError,n.memoryAdjustedScreenSpaceError),{canTraverse:o,loadTile:r,visitTile:s,touchTile:a}=$s,c=WP.stack;for(c.push(e);c.length>0;){WP.stackMaximumLength=Math.max(WP.stackMaximumLength,c.length);let d=c.pop();dQe(d,t);let u=d.parent,h=!l(u)||u._refines;d._refines=o(d)?mQe(d,c,t)&&h:!1;let p=!d._refines&&h;d.hasRenderableContent?d.refine===Oo.ADD?(Wk(d,t),r(d,t)):d.refine===Oo.REPLACE&&(hQe(d,i)?(r(d,t),p&&Wk(d,t)):p?(Wk(d,t),r(d,t)):uQe(n,d)&&r(d,t)):(n._emptyTiles.push(d),r(d,t),p&&Wk(d,t)),s(d,t),a(d,t)}}function pQe(e,t){let{selectTile:n,canTraverse:i}=$s,{stack:o,ancestorStack:r}=Db,s;for(o.push(e);o.length>0||r.length>0;){if(Db.stackMaximumLength=Math.max(Db.stackMaximumLength,o.length),Db.ancestorStackMaximumLength=Math.max(Db.ancestorStackMaximumLength,r.length),r.length>0){let d=r.peek();if(d._stackLength===o.length){r.pop(),d!==s&&(d._finalResolution=!1),n(d,t);continue}}let a=o.pop();if(!l(a))continue;let c=i(a);if(a._shouldSelect)if(a.refine===Oo.ADD)n(a,t);else{if(a._selectionDepth=r.length,a._selectionDepth>0&&(a.tileset.hasMixedContent=!0),s=a,!c){n(a,t);continue}r.push(a),a._stackLength=o.length}if(c){let d=a.children;for(let u=0;umi._defaultMinTerrainHeight&&(s._initialClippingPlanesOriginMatrix=wt.eastNorthUpToFixedFrame(p)),s._clippingPlanesOriginMatrix=M.clone(s._initialClippingPlanesOriginMatrix),s};sr.loadJson=function(e){return Re.createIfNeeded(e).fetchJson()};sr.prototype.makeStyleDirty=function(){this._styleEngine.makeDirty()};sr.prototype.loadTileset=function(e,t,n){let i=t.asset;if(!l(i))throw new ce("Tileset must have an asset property.");if(i.version!=="0.0"&&i.version!=="1.0"&&i.version!=="1.1")throw new ce("The tileset must be 3D Tiles version 0.0, 1.0, or 1.1");l(t.extensionsRequired)&&sr.checkSupportedExtensions(t.extensionsRequired);let o=this._statistics,r=i.tilesetVersion;l(r)&&(this._basePath+=`?v=${r}`,e=e.clone(),e.setQueryParameters({v:r}));let s=pde(this,e,t.root,n);l(n)&&(n.children.push(s),s._depth=n._depth+1);let a=[];for(a.push(s);a.length>0;){let c=a.pop();++o.numberOfTilesTotal,this._allTilesAdditive=this._allTilesAdditive&&c.refine===Oo.ADD;let d=c._header.children;if(l(d))for(let u=0;u_.minimumRadius){let L=he.fromCartesian(V,_,gQe);n=m.normalize(a.positionWC,bde),i=a.directionWC,o=a.positionCartographic.height,r=0,s=L.height*2}else{let L=M.multiplyByPoint(x,a.positionWC,_Qe);if(n=m.UNIT_Z,i=M.multiplyByPointAsVector(x,a.directionWC,TQe),i=m.normalize(i,i),o=L.z,d instanceof Yl){let R=$.getColumn(C.halfAxes,2,SQe),G=m.magnitude(R);r=V.z-G,s=V.z+G}else if(d instanceof Mb){let R=C.radius;r=V.z-R,s=V.z+R}}}let u=e.dynamicScreenSpaceErrorHeightFalloff,h=r+(s-r)*u,p=s,g=W.clamp((o-h)/(p-h),0,1),f=1-Math.abs(m.dot(i,n));f=f*(1-g),e._dynamicScreenSpaceErrorComputedDensity=e.dynamicScreenSpaceErrorDensity*f}function VQe(e,t){if(t.hasEmptyContent)return;let{statistics:n}=e,i=t.contentExpired,o=t.requestContent();l(o)&&(o.then(r=>{!l(r)||t.isDestroyed()||e.isDestroyed()||(e._processingQueue.push(t),++n.numberOfTilesProcessing)}).catch(r=>{xde(r,e,t)}),i&&(t.hasTilesetContent||t.hasImplicitContent?MQe(e,t):(n.decrementLoadCounts(t.content),--n.numberOfTilesWithContentReady)),e._requestedTilesInFlight.push(t))}function yde(e,t){return e._priority-t._priority}sr.prototype.postPassesUpdate=function(e){l(this._root)&&(LQe(this,e),kQe(this,e),this._cache.unloadTiles(this,Tde),this._styleApplied&&this._styleEngine.resetDirty(),this._styleApplied=!1)};sr.prototype.prePassesUpdate=function(e){if(!l(this._root))return;WQe(this,e);let t=this._clippingPlanes;this._clippingPlanesOriginMatrixDirty=!0,l(t)&&t.enabled&&t.update(e);let n=this._clippingPolygons;l(n)&&n.enabled&&n.update(e),l(this._loadTimestamp)||(this._loadTimestamp=q.clone(e.time)),this._timeSinceLoad=Math.max(q.secondsDifference(e.time,this._loadTimestamp)*1e3,0),this.dynamicScreenSpaceError&&CQe(this,e),e.newFrame&&this._cache.reset()};function LQe(e,t){let n=e._requestedTilesInFlight,i=0;for(let o=0;o=1;if(r._contentState!==Ho.LOADING){++i;continue}else if(s){r.cancelRequests(),++i;continue}i>0&&(n[o-i]=r)}n.length-=i}function RQe(e){let t=e._requestedTiles;t.sort(yde);for(let n=0;n0?t.tileFailed.raiseEvent({url:i,message:o}):(console.log(`A 3D tile failed to load: ${i}`),console.log(`Error: ${o}`),console.log(e.stack))}function ZQe(e){let t=e._processingQueue,n=0;for(let i=0;i0&&(t[i-n]=o)}t.length-=n}var GQe=new he,EQe=new he,IQe=new m;function XQe(e,t,n){if(!e.enableCollision||!e.show)return;let i=e._addHeightCallbacks,o=t.boundingSphere;for(let r of i){if(r.invoked||t._wasSelectedLastFrame)continue;let s=r.ellipsoid,a=he.clone(r.positionCartographic,GQe),c=he.fromCartesian(o.center,s,EQe);l(c)&&(a.height=c.height);let d=he.toCartesian(a,s,IQe);m.distance(d,o.center)<=o.radius&&n.afterRender.push(()=>{l(r.callback)&&r.callback(a),r.invoked=!1})}}function WQe(e,t){ZQe(e);let n=e._processingQueue,{cacheBytes:i,maximumCacheOverflowBytes:o,statistics:r}=e,s=i+o,a=!1;for(let c=0;cs){a=!0;break}let d=n[c];try{d.process(e,t),d.contentReady&&(--r.numberOfTilesProcessing,e.tileLoad.raiseEvent(d))}catch(u){--r.numberOfTilesProcessing,xde(u,e,d)}}e.totalMemoryUsageInBytes0&&PQe(e)}function PQe(e){e._memoryAdjustedScreenSpaceError*=1.02;let t=e._processingQueue;for(let n=0;n0&&(i+=` Points: ${e.content.pointsLength}`,o++),e.content.trianglesLength>0&&(i+=` Triangles: ${e.content.trianglesLength}`,o++),i+=` Features: ${e.content.featuresLength}`,o++),t.debugShowMemoryUsage&&(i+=` Texture Memory: ${gde(e.content.texturesByteLength)}`,i+=` Geometry Memory: ${gde(e.content.geometryByteLength)}`,o+=2),t.debugShowUrl)if(e.hasMultipleContents){i+=` Urls:`;let s=e.content.innerContentUrls;for(let a=0;a0;e._backfaceCommands.length=0,a&&(l(e._stencilClearCommand)||(e._stencilClearCommand=new ai({stencil:0,pass:Ge.CESIUM_3D_TILE,renderState:Ue.fromCache({stencilMask:Dt.SKIP_LOD_MASK})})),i.push(e._stencilClearCommand));let{statistics:c,tileVisible:d}=e,u=n.isRender,h=i.length;for(let f=0;f=0;--_)i[h+x+_]=i[h+_];for(let _=0;_0&&e._pointCloudEyeDomeLighting.update(t,r,e.pointCloudShading,e.boundingSphere),e.debugShowGeometricError||e.debugShowRenderingStatistics||e.debugShowMemoryUsage||e.debugShowUrl?(l(e._tileDebugLabels)||(e._tileDebugLabels=new Wf),FQe(e,t)):e._tileDebugLabels=e._tileDebugLabels&&e._tileDebugLabels.destroy())}var _de=[];function MQe(e,t){let n=t,i=_de;for(i.push(t);i.length>0;){t=i.pop();let o=t.children;for(let r=0;r{t.push(Rt.clone(i))});let n=e.asset.extras;if(l(n)&&l(n.cesium)&&l(n.cesium.credits)){let i=n.cesium.credits;for(let o=0;oi.showOnScreen=i.showOnScreen||e._showCreditsOnScreen),e._credits=t}sr.prototype.getTraversal=function(e){let{pass:t}=e;return t===Ao.MOST_DETAILED_PRELOAD||t===Ao.MOST_DETAILED_PICK?GP:this.isSkippingLevelOfDetail?vP:XP};sr.prototype.update=function(e){this.updateForPass(e,e.tilesetPassState)};sr.prototype.updateForPass=function(e,t){let n=t.pass;if(n===Ao.PRELOAD&&(!this.preloadWhenHidden||this.show)||n===Ao.PRELOAD_FLIGHT&&(!this.preloadFlightDestinations||!this.show&&!this.preloadWhenHidden)||n===Ao.REQUEST_RENDER_MODE_DEFER_CHECK&&(!this._cullRequestsWhileMoving&&this.foveatedTimeDelay<=0||!this.show))return;let i=e.commandList,o=e.camera,r=e.cullingVolume;t.ready=!1;let s=Ao.getPassOptions(n),a=s.ignoreCommands,c=y(t.commandList,i),d=c.length;if(e.commandList=c,e.camera=y(t.camera,o),e.cullingVolume=y(t.cullingVolume,r),s.isRender){let p=this._environmentMapManager;l(this._root)&&(p.position=this.boundingSphere.center),p.update(e)}let u=this._clippingPolygons;l(u)&&u.enabled&&u.queueCommands(e);let h=this._statisticsPerPass[n];(this.show||a)&&(this._pass=n,t.ready=BQe(this,e,h,s)),a&&(c.length=d),e.commandList=i,e.camera=o,e.cullingVolume=r};sr.prototype.hasExtension=function(e){return l(this._extensionsUsed)?this._extensionsUsed.indexOf(e)>-1:!1};sr.prototype.isDestroyed=function(){return!1};sr.prototype.destroy=function(){if(this._tileDebugLabels=this._tileDebugLabels&&this._tileDebugLabels.destroy(),this._clippingPlanes=this._clippingPlanes&&this._clippingPlanes.destroy(),this._clippingPolygons=this._clippingPolygons&&this._clippingPolygons.destroy(),l(this._root)){let e=_de;for(e.push(this._root);e.length>0;){let t=e.pop();t.destroy();let n=t.children;for(let i=0;i{let r=this._addHeightCallbacks,s=r.length;for(let a=0;a{let u=de.distanceSquaredTo(c.contentBoundingVolume.boundingSphere,e.origin),h=de.distanceSquaredTo(d.contentBoundingVolume.boundingSphere,e.origin);return u-h});let a;for(let c=0;c-1;i--)NK(this,e[i],t,n);return me(this)};Jg.prototype.getBoundingSphere=function(e,t){let n=this._tilesetHash[e.id];if(!l(n)||n.loadFail)return dt.FAILED;let i=n.tilesetPrimitive;return l(i)?i.show?(de.clone(i.boundingSphere,t),dt.DONE):dt.FAILED:dt.PENDING};Jg.prototype._onCollectionChanged=function(e,t,n,i){let o,r,s=this._entitiesToVisualize,a=this._tilesetHash,c=this._primitives;for(o=t.length-1;o>-1;o--)r=t[o],l(r._tileset)&&s.set(r.id,r);for(o=i.length-1;o>-1;o--)r=i[o],l(r._tileset)?s.set(r.id,r):(NK(this,r,a,c),s.remove(r.id));for(o=n.length-1;o>-1;o--)r=n[o],NK(this,r,a,c),s.remove(r.id)};function NK(e,t,n,i){let o=n[t.id];l(o)&&(l(o.tilesetPrimitive)&&i.removeAndDestroy(o.tilesetPrimitive),delete n[t.id])}async function QQe(e,t,n,i){t[n.id]={url:e.url,loadFail:!1};try{let o=await xs.fromUrl(e);if(o.id=n,i.add(o),!l(t[n.id]))return;t[n.id].tilesetPrimitive=o}catch(o){console.error(o),t[n.id].loadFail=!0}}var wP=Jg;var ZYn=T(S(),1);var jQe=B.WHITE,qQe=B.BLACK,$Qe=new D(2,2);function F1(e){e=y(e,y.EMPTY_OBJECT),this._definitionChanged=new be,this._evenColor=void 0,this._evenColorSubscription=void 0,this._oddColor=void 0,this._oddColorSubscription=void 0,this._repeat=void 0,this._repeatSubscription=void 0,this.evenColor=e.evenColor,this.oddColor=e.oddColor,this.repeat=e.repeat}Object.defineProperties(F1.prototype,{isConstant:{get:function(){return J.isConstant(this._evenColor)&&J.isConstant(this._oddColor)&&J.isConstant(this._repeat)}},definitionChanged:{get:function(){return this._definitionChanged}},evenColor:ue("evenColor"),oddColor:ue("oddColor"),repeat:ue("repeat")});F1.prototype.getType=function(e){return"Checkerboard"};var e4e=new q;F1.prototype.getValue=function(e,t){return l(e)||(e=q.now(e4e)),l(t)||(t={}),t.lightColor=J.getValueOrClonedDefault(this._evenColor,e,jQe,t.lightColor),t.darkColor=J.getValueOrClonedDefault(this._oddColor,e,qQe,t.darkColor),t.repeat=J.getValueOrDefault(this._repeat,e,$Qe),t};F1.prototype.equals=function(e){return this===e||e instanceof F1&&J.equals(this._evenColor,e._evenColor)&&J.equals(this._oddColor,e._oddColor)&&J.equals(this._repeat,e._repeat)};var A1=F1;var YYn=T(S(),1);var MYn=T(S(),1);var Cde={id:void 0};function FP(e){if(e._firing){e._refire=!0;return}if(e._suspendCount===0){let t=e._addedEntities,n=e._removedEntities,i=e._changedEntities;if(i.length!==0||t.length!==0||n.length!==0){e._firing=!0;do{e._refire=!1;let o=t.values.slice(0),r=n.values.slice(0),s=i.values.slice(0);t.removeAll(),n.removeAll(),i.removeAll(),e._collectionChanged.raiseEvent(e,o,r,s)}while(e._refire);e._firing=!1}}}function yc(e){this._owner=e,this._entities=new Et,this._addedEntities=new Et,this._removedEntities=new Et,this._changedEntities=new Et,this._suspendCount=0,this._collectionChanged=new be,this._id=Jn(),this._show=!0,this._firing=!1,this._refire=!1}yc.prototype.suspendEvents=function(){this._suspendCount++};yc.prototype.resumeEvents=function(){this._suspendCount--,FP(this)};Object.defineProperties(yc.prototype,{collectionChanged:{get:function(){return this._collectionChanged}},id:{get:function(){return this._id}},values:{get:function(){return this._entities.values}},show:{get:function(){return this._show},set:function(e){if(e===this._show)return;this.suspendEvents();let t,n=[],i=this._entities.values,o=i.length;for(t=0;t-1;c--)s=a[c],Lde(e,p,g,s);for(r=n-1;r>=0;r--)for(d=t[r],d.collectionChanged.addEventListener(Or.prototype._onCollectionChanged,e),a=d.values,g=d.id,c=a.length-1;c>-1;c--){s=a[c],Vde(e,p,g,s);let x=h.getById(s.id);l(x)||(x=u.getById(s.id),l(x)?kK(x):(vk.id=s.id,x=new tr(vk)),h.add(x)),x.merge(s)}e._collectionsCopy=t.slice(0),u.suspendEvents(),u.removeAll();let f=h.values;for(r=0;r=0;a--)c=i[a].getById(x),l(c)&&(l(d)||(d=r.getById(x),kK(d)),d.merge(c));l(d)||r.removeById(x),d=void 0}let g=t.length;for(s=0;s=0;a--)c=i[a].getById(x),l(c)&&(l(d)||(d=r.getById(x),l(d)?kK(d):(vk.id=x,d=new tr(vk),r.add(d))),d.merge(c));d=void 0}r.resumeEvents()};Or.prototype._onDefinitionChanged=function(e,t,n,i){let o=this._collections,r=this._composite,s=o.length,a=e.id,c=r.getById(a),d=c[t],u=!l(d),h=!0;for(let p=s-1;p>=0;p--){let g=o[p].getById(e.id);if(l(g)){let f=g[t];if(l(f)){if(h)if(h=!1,l(f.merge)&&l(f.clone))d=f.clone(d);else{d=f;break}d.merge(f)}}}u&&c.propertyNames.indexOf(t)===-1&&c.addProperty(t),c[t]=d};var UK=Or;var xHn=T(S(),1);var mHn=T(S(),1);var zYn=T(S(),1);function DK(){this._removalFunctions=[]}DK.prototype.add=function(e,t,n){let i=e.addEventListener(t,n);this._removalFunctions.push(i);let o=this;return function(){i();let r=o._removalFunctions;r.splice(r.indexOf(i),1)}};DK.prototype.removeAll=function(){let e=this._removalFunctions;for(let t=0,n=e.length;t0&&(this._intervals.length=0,this._changedEvent.raiseEvent(this))};Yr.prototype.findIntervalContainingDate=function(e){let t=this.indexOf(e);return t>=0?this._intervals[t]:void 0};Yr.prototype.findDataForIntervalContainingDate=function(e){let t=this.indexOf(e);return t>=0?this._intervals[t].data:void 0};Yr.prototype.contains=function(e){return this.indexOf(e)>=0};var BK=new Cn;Yr.prototype.indexOf=function(e){let t=this._intervals;BK.start=e,BK.stop=e;let n=Po(t,BK,YK);return n>=0?t[n].isStartIncluded?n:n>0&&t[n-1].stop.equals(e)&&t[n-1].isStopIncluded?n-1:~n:(n=~n,n>0&&n-10&&e.isStartIncluded&&n[i-1].isStartIncluded&&n[i-1].start.equals(e.start)?--i:i0&&(o=q.compare(n[i-1].stop,e.start),(o>0||o===0&&(n[i-1].isStopIncluded||e.isStartIncluded))&&((l(t)?t(n[i-1].data,e.data):n[i-1].data===e.data)?(q.greaterThan(e.stop,n[i-1].stop)?e=new Cn({start:n[i-1].start,stop:e.stop,isStartIncluded:n[i-1].isStartIncluded,isStopIncluded:e.isStopIncluded,data:e.data}):e=new Cn({start:n[i-1].start,stop:n[i-1].stop,isStartIncluded:n[i-1].isStartIncluded,isStopIncluded:n[i-1].isStopIncluded||e.stop.equals(n[i-1].stop)&&e.isStopIncluded,data:e.data}),n.splice(i-1,1),--i):(o=q.compare(n[i-1].stop,e.stop),(o>0||o===0&&n[i-1].isStopIncluded&&!e.isStopIncluded)&&n.splice(i,0,new Cn({start:e.stop,stop:n[i-1].stop,isStartIncluded:!e.isStopIncluded,isStopIncluded:n[i-1].isStopIncluded,data:n[i-1].data})),n[i-1]=new Cn({start:n[i-1].start,stop:e.start,isStartIncluded:n[i-1].isStartIncluded,isStopIncluded:!e.isStartIncluded,data:n[i-1].data}))));i0||o===0&&(e.isStopIncluded||n[i].isStartIncluded));)if(l(t)?t(n[i].data,e.data):n[i].data===e.data)e=new Cn({start:e.start,stop:q.greaterThan(n[i].stop,e.stop)?n[i].stop:e.stop,isStartIncluded:e.isStartIncluded,isStopIncluded:q.greaterThan(n[i].stop,e.stop)?n[i].isStopIncluded:e.isStopIncluded,data:e.data}),n.splice(i,1);else if(n[i]=new Cn({start:e.stop,stop:n[i].stop,isStartIncluded:!e.isStopIncluded,isStopIncluded:n[i].isStopIncluded,data:n[i].data}),n[i].isEmpty)n.splice(i,1);else break;n.splice(i,0,e),this._changedEvent.raiseEvent(this)};Yr.prototype.removeInterval=function(e){if(e.isEmpty)return!1;let t=this._intervals,n=Po(t,e,YK);n<0&&(n=~n);let i=!1;for(n>0&&(q.greaterThan(t[n-1].stop,e.start)||t[n-1].stop.equals(e.start)&&t[n-1].isStopIncluded&&e.isStartIncluded)&&(i=!0,(q.greaterThan(t[n-1].stop,e.stop)||t[n-1].isStopIncluded&&!e.isStopIncluded&&t[n-1].stop.equals(e.stop))&&t.splice(n,0,new Cn({start:e.stop,stop:t[n-1].stop,isStartIncluded:!e.isStopIncluded,isStopIncluded:t[n-1].isStopIncluded,data:t[n-1].data})),t[n-1]=new Cn({start:t[n-1].start,stop:e.start,isStartIncluded:t[n-1].isStartIncluded,isStopIncluded:!e.isStartIncluded,data:t[n-1].data})),n=1e3&&(o+=Math.floor(i/1e3),i=i%1e3),o>=60&&(r+=Math.floor(o/60),o=o%60),r>=60&&(s+=Math.floor(r/60),r=r%60),s>=24&&(a+=Math.floor(s/24),s=s%24),AP[2]=Em(d)?29:28;a>AP[c]||c>=13;)a>AP[c]&&(a-=AP[c],++c),c>=13&&(--c,d+=Math.floor(c/12),c=c%12,++c),AP[2]=Em(d)?29:28;return xc.millisecond=i,xc.second=o,xc.minute=r,xc.hour=s,xc.day=a,xc.month=c,xc.year=d,q.fromGregorianDate(xc,n)}var t4e=new q,n4e=/P(?:([\d.,]+)Y)?(?:([\d.,]+)M)?(?:([\d.,]+)W)?(?:([\d.,]+)D)?(?:T(?:([\d.,]+)H)?(?:([\d.,]+)M)?(?:([\d.,]+)S)?)?/;function Zde(e,t){if(!l(e)||e.length===0)return!1;if(t.year=0,t.month=0,t.day=0,t.hour=0,t.minute=0,t.second=0,t.millisecond=0,e[0]==="P"){let n=e.match(n4e);if(!l(n))return!1;if(l(n[1])&&(t.year=Number(n[1].replace(",","."))),l(n[2])&&(t.month=Number(n[2].replace(",","."))),l(n[3])&&(t.day=Number(n[3].replace(",","."))*7),l(n[4])&&(t.day+=Number(n[4].replace(",","."))),l(n[5])&&(t.hour=Number(n[5].replace(",","."))),l(n[6])&&(t.minute=Number(n[6].replace(",","."))),l(n[7])){let i=Number(n[7].replace(",","."));t.second=Math.floor(i),t.millisecond=i%1*1e3}}else e[e.length-1]!=="Z"&&(e+="Z"),q.toGregorianDate(q.fromIso8601(e,t4e),t);return t.year||t.month||t.day||t.hour||t.minute||t.second||t.millisecond}var MP=new Lp;Yr.fromIso8601=function(e,t){let n=e.iso8601.split("/"),i=q.fromIso8601(n[0]),o=q.fromIso8601(n[1]),r=[];if(!Zde(n[2],MP))r.push(i,o);else{let s=q.clone(i);for(r.push(s);q.compare(s,o)<0;)s=OK(s,MP),q.compare(o,s)<=0&&q.clone(o,s),r.push(s)}return Yr.fromJulianDateArray({julianDates:r,isStartIncluded:e.isStartIncluded,isStopIncluded:e.isStopIncluded,leadingInterval:e.leadingInterval,trailingInterval:e.trailingInterval,dataCallback:e.dataCallback},t)};Yr.fromIso8601DateArray=function(e,t){return Yr.fromJulianDateArray({julianDates:e.iso8601Dates.map(function(n){return q.fromIso8601(n)}),isStartIncluded:e.isStartIncluded,isStopIncluded:e.isStopIncluded,leadingInterval:e.leadingInterval,trailingInterval:e.trailingInterval,dataCallback:e.dataCallback},t)};Yr.fromIso8601DurationArray=function(e,t){let n=e.epoch,i=e.iso8601Durations,o=y(e.relativeToPrevious,!1),r=[],s,a,c=i.length;for(let d=0;d=0?-a:a}var x4e=new m(-1,0,0),sT=new M,_4e=new M,KK=new $,T4e=$.IDENTITY.clone(),S4e=new m,C4e=new re,Gde=new m;function Bb(e,t,n,i,o,r,s,a){let c=S4e,d=C4e;sT=wt.eastNorthUpToFixedFrame(e,o,sT),c=M.multiplyByPointAsVector(sT,x4e,c),c=m.normalize(c,c);let u=y4e(c,t,e,o);KK=$.fromRotationZ(u,KK),Gde.z=r,sT=M.multiplyTransformation(sT,M.fromRotationTranslation(KK,Gde,_4e),sT);let h=T4e;h[0]=s;for(let p=0;p0){let x=d?2:1;for(let _=0;_=0};var R4e=new m,Z4e=new m;NP.computePositions=function(e,t,n,i,o){let r=i._ellipsoid,s=g4e(e,r),a=i._granularity,c=i._cornerType,d=o?L4e(t,n):Ede(t,n),u=o?Ede(t,n):void 0,h=n.height/2,p=n.width/2,g=e.length,f=[],x=o?[]:void 0,_=c4e,C=l4e,V=d4e,L=u4e,R=m4e,G=h4e,I=f4e,v=p4e,P=b4e,w=e[0],A=e[1];L=r.geodeticSurfaceNormal(w,L),_=m.subtract(A,w,_),_=m.normalize(_,_),v=m.cross(L,_,v),v=m.normalize(v,v);let b=s[0],Z=s[1];o&&(x=Bb(w,v,u,x,r,b+h,1,1)),P=m.clone(w,P),w=A,C=m.negate(_,C);let E,X;for(let O=1;OEe;p--)Se=W.PI_OVER_TWO-p*ye,ee[ae++]=1-pe*(1+Math.cos(Se)),ee[ae++]=.5*(1+Math.sin(Se));for(p=Ee;p>0;p--)Se=W.PI_OVER_TWO-ye*p,ee[ae++]=1-_e*(1+Math.cos(Se)),ee[ae++]=.5*(1+Math.sin(Se));for(p=u-_;p>0;p--)ee[ae++]=p*_e,ee[ae++]=1;for(p=1;p0;p--)ee[ae++]=(p-1)*_e,ee[ae++]=1}c.st=new Ze({componentDatatype:Q.FLOAT,componentsPerAttribute:2,values:ee})}return t.normal&&(c.normal=new Ze({componentDatatype:Q.FLOAT,componentsPerAttribute:3,values:I.normals})),t.tangent&&(c.tangent=new Ze({componentDatatype:Q.FLOAT,componentsPerAttribute:3,values:I.tangents})),t.bitangent&&(c.bitangent=new Ze({componentDatatype:Q.FLOAT,componentsPerAttribute:3,values:I.bitangents})),{attributes:c,indices:U}}function k4e(e,t){if(!t.normal&&!t.tangent&&!t.bitangent&&!t.st)return e;let n=e.position.values,i,o;(t.normal||t.bitangent)&&(i=e.normal.values,o=e.bitangent.values);let r=e.position.values.length/18,s=r*3,a=r*2,c=s*2,d;if(t.normal||t.bitangent||t.tangent){let u=t.normal?new Float32Array(s*6):void 0,h=t.tangent?new Float32Array(s*6):void 0,p=t.bitangent?new Float32Array(s*6):void 0,g=Ode,f=Yde,x=kk,_=Uk,C=N4e,V=Hde,L=c;for(d=0;d-t?(o=z4e,o.x=this._cameraPosition.x/(n.radii.x+t),o.y=this._cameraPosition.y/(n.radii.y+t),o.z=this._cameraPosition.z/(n.radii.z+t),i=o.x*o.x+o.y*o.y+o.z*o.z-1):(o=this._cameraPositionInScaledSpace,i=this._distanceToLimbInScaledSpaceSquared),eJ(e,o,i)};Ff.prototype.computeHorizonCullingPoint=function(e,t,n){return lue(this._ellipsoid,e,t,n)};var aue=ne.clone(ne.UNIT_SPHERE);Ff.prototype.computeHorizonCullingPointPossiblyUnderEllipsoid=function(e,t,n,i){let o=cue(this._ellipsoid,n,aue);return lue(o,e,t,i)};Ff.prototype.computeHorizonCullingPointFromVertices=function(e,t,n,i,o){return due(this._ellipsoid,e,t,n,i,o)};Ff.prototype.computeHorizonCullingPointFromVerticesPossiblyUnderEllipsoid=function(e,t,n,i,o,r){let s=cue(this._ellipsoid,o,aue);return due(s,e,t,n,i,r)};var K4e=[];Ff.prototype.computeHorizonCullingPointFromRectangle=function(e,t,n){let i=le.subsample(e,t,0,K4e),o=de.fromPoints(i);if(!(m.magnitude(o.center)<.1*t.minimumRadius))return this.computeHorizonCullingPoint(o.center,i,n)};var J4e=new m;function cue(e,t,n){if(l(t)&&t<0&&e.minimumRadius>-t){let i=m.fromElements(e.radii.x+t,e.radii.y+t,e.radii.z+t,J4e);e=ne.fromCartesian3(i,n)}return e}function lue(e,t,n,i){l(i)||(i=new m);let o=hue(e,t),r=0;for(let s=0,a=n.length;s0:s>o&&s*s/m.magnitudeSquared(r)>o)}var Q4e=new m,j4e=new m;function uue(e,t,n){let i=e.transformPositionToScaledSpace(t,Q4e),o=m.magnitudeSquared(i),r=Math.sqrt(o),s=m.divideByScalar(i,r,j4e);o=Math.max(1,o),r=Math.max(1,r);let a=m.dot(s,n),c=m.magnitude(m.cross(s,n,s)),d=1/r,u=Math.sqrt(o-1)*d;return 1/(a*d-c*u)}function mue(e,t,n){if(!(t<=0||t===1/0||t!==t))return m.multiplyByScalar(e,t,n)}var $K=new m;function hue(e,t){return m.equals(t,m.ZERO)?t:(e.transformPositionToScaledSpace(t,$K),m.normalize($K,$K))}var Hb=Ff;var QKn=T(S(),1);function Zr(e,t){e=y(e,y.EMPTY_OBJECT);let n=e.translucencyByDistance,i=e.scaleByDistance,o=e.distanceDisplayCondition;l(n)&&(n=Ut.clone(n)),l(i)&&(i=Ut.clone(i)),l(o)&&(o=Ft.clone(o)),this._show=y(e.show,!0),this._position=m.clone(y(e.position,m.ZERO)),this._actualPosition=m.clone(this._position),this._color=B.clone(y(e.color,B.WHITE)),this._outlineColor=B.clone(y(e.outlineColor,B.TRANSPARENT)),this._outlineWidth=y(e.outlineWidth,0),this._pixelSize=y(e.pixelSize,10),this._scaleByDistance=i,this._translucencyByDistance=n,this._distanceDisplayCondition=o,this._disableDepthTestDistance=y(e.disableDepthTestDistance,0),this._id=e.id,this._collection=y(e.collection,t),this._clusterShow=!0,this._pickId=void 0,this._pointPrimitiveCollection=t,this._dirty=!1,this._index=-1,this._splitDirection=y(e.splitDirection,Fr.NONE)}var fue=Zr.SHOW_INDEX=0,gue=Zr.POSITION_INDEX=1,q4e=Zr.COLOR_INDEX=2,$4e=Zr.OUTLINE_COLOR_INDEX=3,eje=Zr.OUTLINE_WIDTH_INDEX=4,tje=Zr.PIXEL_SIZE_INDEX=5,nje=Zr.SCALE_BY_DISTANCE_INDEX=6,ije=Zr.TRANSLUCENCY_BY_DISTANCE_INDEX=7,oje=Zr.DISTANCE_DISPLAY_CONDITION_INDEX=8,rje=Zr.DISABLE_DEPTH_DISTANCE_INDEX=9,sje=Zr.SPLIT_DIRECTION_INDEX=10;Zr.NUMBER_OF_PROPERTIES=11;function Pd(e,t){let n=e._pointPrimitiveCollection;l(n)&&(n._updatePointPrimitive(e,t),e._dirty=!0)}Object.defineProperties(Zr.prototype,{show:{get:function(){return this._show},set:function(e){this._show!==e&&(this._show=e,Pd(this,fue))}},position:{get:function(){return this._position},set:function(e){let t=this._position;m.equals(t,e)||(m.clone(e,t),m.clone(e,this._actualPosition),Pd(this,gue))}},scaleByDistance:{get:function(){return this._scaleByDistance},set:function(e){let t=this._scaleByDistance;Ut.equals(t,e)||(this._scaleByDistance=Ut.clone(e,t),Pd(this,nje))}},translucencyByDistance:{get:function(){return this._translucencyByDistance},set:function(e){let t=this._translucencyByDistance;Ut.equals(t,e)||(this._translucencyByDistance=Ut.clone(e,t),Pd(this,ije))}},pixelSize:{get:function(){return this._pixelSize},set:function(e){this._pixelSize!==e&&(this._pixelSize=e,Pd(this,tje))}},color:{get:function(){return this._color},set:function(e){let t=this._color;B.equals(t,e)||(B.clone(e,t),Pd(this,q4e))}},outlineColor:{get:function(){return this._outlineColor},set:function(e){let t=this._outlineColor;B.equals(t,e)||(B.clone(e,t),Pd(this,$4e))}},outlineWidth:{get:function(){return this._outlineWidth},set:function(e){this._outlineWidth!==e&&(this._outlineWidth=e,Pd(this,eje))}},distanceDisplayCondition:{get:function(){return this._distanceDisplayCondition},set:function(e){Ft.equals(this._distanceDisplayCondition,e)||(this._distanceDisplayCondition=Ft.clone(e,this._distanceDisplayCondition),Pd(this,oje))}},disableDepthTestDistance:{get:function(){return this._disableDepthTestDistance},set:function(e){this._disableDepthTestDistance!==e&&(this._disableDepthTestDistance=e,Pd(this,rje))}},id:{get:function(){return this._id},set:function(e){this._id=e,l(this._pickId)&&(this._pickId.object.id=e)}},pickId:{get:function(){return this._pickId}},clusterShow:{get:function(){return this._clusterShow},set:function(e){this._clusterShow!==e&&(this._clusterShow=e,Pd(this,fue))}},splitDirection:{get:function(){return this._splitDirection},set:function(e){this._splitDirection!==e&&(this._splitDirection=e,Pd(this,sje))}}});Zr.prototype.getPickId=function(e){return l(this._pickId)||(this._pickId=e.createPickId({primitive:this,collection:this._collection,id:this._id})),this._pickId};Zr.prototype._getActualPosition=function(){return this._actualPosition};Zr.prototype._setActualPosition=function(e){m.clone(e,this._actualPosition),Pd(this,gue)};var pue=new re;Zr._computeActualPosition=function(e,t,n){return t.mode===oe.SCENE3D?e:(M.multiplyByPoint(n,e,pue),Bi.computeActualEllipsoidPosition(t,pue))};var bue=new re;Zr._computeScreenSpacePosition=function(e,t,n,i){let o=M.multiplyByVector(e,re.fromElements(t.x,t.y,t.z,1,bue),bue);return Bi.worldToWindowCoordinates(n,o,i)};Zr.prototype.computeScreenSpacePosition=function(e,t){let n=this._pointPrimitiveCollection;l(t)||(t=new D);let i=n.modelMatrix,o=Zr._computeScreenSpacePosition(i,this._actualPosition,e,t);if(l(o))return o.y=e.canvas.clientHeight-o.y,o};Zr.getScreenSpaceBoundingBox=function(e,t,n){let i=e.pixelSize,o=i*.5,r=t.x-o,s=t.y-o,a=i,c=i;return l(n)||(n=new He),n.x=r,n.y=s,n.width=a,n.height=c,n};Zr.prototype.equals=function(e){return this===e||l(e)&&this._id===e._id&&m.equals(this._position,e._position)&&B.equals(this._color,e._color)&&this._pixelSize===e._pixelSize&&this._outlineWidth===e._outlineWidth&&this._show===e._show&&B.equals(this._outlineColor,e._outlineColor)&&Ut.equals(this._scaleByDistance,e._scaleByDistance)&&Ut.equals(this._translucencyByDistance,e._translucencyByDistance)&&Ft.equals(this._distanceDisplayCondition,e._distanceDisplayCondition)&&this._disableDepthTestDistance===e._disableDepthTestDistance&&this._splitDirection===e._splitDirection};Zr.prototype._destroy=function(){this._pickId=this._pickId&&this._pickId.destroy(),this._pointPrimitiveCollection=void 0};var Ws=Zr;var ZJn=T(S(),1);var qKn=T(S(),1),ty=`in vec4 v_color; in vec4 v_outlineColor; in float v_innerPercent; in float v_pixelDistance; in vec4 v_pickColor; in float v_splitDirection; void main() { if (v_splitDirection < 0.0 && gl_FragCoord.x > czm_splitPosition) discard; if (v_splitDirection > 0.0 && gl_FragCoord.x < czm_splitPosition) discard; // The distance in UV space from this fragment to the center of the point, at most 0.5. float distanceToCenter = length(gl_PointCoord - vec2(0.5)); // The max distance stops one pixel shy of the edge to leave space for anti-aliasing. float maxDistance = max(0.0, 0.5 - v_pixelDistance); float wholeAlpha = 1.0 - smoothstep(maxDistance, 0.5, distanceToCenter); float innerAlpha = 1.0 - smoothstep(maxDistance * v_innerPercent, 0.5 * v_innerPercent, distanceToCenter); vec4 color = mix(v_outlineColor, v_color, innerAlpha); color.a *= wholeAlpha; // Fully transparent parts of the billboard are not pickable. #if !defined(OPAQUE) && !defined(TRANSLUCENT) if (color.a < 0.005) // matches 0/255 and 1/255 { discard; } #else // The billboard is rendered twice. The opaque pass discards translucent fragments // and the translucent pass discards opaque fragments. #ifdef OPAQUE if (color.a < 0.995) // matches < 254/255 { discard; } #else if (color.a >= 0.995) // matches 254/255 and 255/255 { discard; } #endif #endif out_FragColor = czm_gammaCorrect(color); czm_writeLogDepth(); } `;var eJn=T(S(),1),YP=`uniform float u_maxTotalPointSize; in vec4 positionHighAndSize; in vec4 positionLowAndOutline; in vec4 compressedAttribute0; // color, outlineColor, pick color in vec4 compressedAttribute1; // show, translucency by distance, some free space in vec4 scaleByDistance; // near, nearScale, far, farScale in vec4 distanceDisplayConditionAndDisableDepthAndSplitDirection; // near, far, disableDepthTestDistance, splitDirection out vec4 v_color; out vec4 v_outlineColor; out float v_innerPercent; out float v_pixelDistance; out vec4 v_pickColor; out float v_splitDirection; const float SHIFT_LEFT8 = 256.0; const float SHIFT_RIGHT8 = 1.0 / 256.0; void main() { // Modifying this shader may also require modifications to PointPrimitive._computeScreenSpacePosition // unpack attributes vec3 positionHigh = positionHighAndSize.xyz; vec3 positionLow = positionLowAndOutline.xyz; float outlineWidthBothSides = 2.0 * positionLowAndOutline.w; float totalSize = positionHighAndSize.w + outlineWidthBothSides; float outlinePercent = outlineWidthBothSides / totalSize; // Scale in response to browser-zoom. totalSize *= czm_pixelRatio; float temp = compressedAttribute1.x * SHIFT_RIGHT8; float show = floor(temp); #ifdef EYE_DISTANCE_TRANSLUCENCY vec4 translucencyByDistance; translucencyByDistance.x = compressedAttribute1.z; translucencyByDistance.z = compressedAttribute1.w; translucencyByDistance.y = ((temp - floor(temp)) * SHIFT_LEFT8) / 255.0; temp = compressedAttribute1.y * SHIFT_RIGHT8; translucencyByDistance.w = ((temp - floor(temp)) * SHIFT_LEFT8) / 255.0; #endif /////////////////////////////////////////////////////////////////////////// vec4 color; vec4 outlineColor; vec4 pickColor; // compressedAttribute0.z => pickColor.rgb temp = compressedAttribute0.z * SHIFT_RIGHT8; pickColor.b = (temp - floor(temp)) * SHIFT_LEFT8; temp = floor(temp) * SHIFT_RIGHT8; pickColor.g = (temp - floor(temp)) * SHIFT_LEFT8; pickColor.r = floor(temp); // compressedAttribute0.x => color.rgb temp = compressedAttribute0.x * SHIFT_RIGHT8; color.b = (temp - floor(temp)) * SHIFT_LEFT8; temp = floor(temp) * SHIFT_RIGHT8; color.g = (temp - floor(temp)) * SHIFT_LEFT8; color.r = floor(temp); // compressedAttribute0.y => outlineColor.rgb temp = compressedAttribute0.y * SHIFT_RIGHT8; outlineColor.b = (temp - floor(temp)) * SHIFT_LEFT8; temp = floor(temp) * SHIFT_RIGHT8; outlineColor.g = (temp - floor(temp)) * SHIFT_LEFT8; outlineColor.r = floor(temp); // compressedAttribute0.w => color.a, outlineColor.a, pickColor.a temp = compressedAttribute0.w * SHIFT_RIGHT8; pickColor.a = (temp - floor(temp)) * SHIFT_LEFT8; pickColor = pickColor / 255.0; temp = floor(temp) * SHIFT_RIGHT8; outlineColor.a = (temp - floor(temp)) * SHIFT_LEFT8; outlineColor /= 255.0; color.a = floor(temp); color /= 255.0; /////////////////////////////////////////////////////////////////////////// vec4 p = czm_translateRelativeToEye(positionHigh, positionLow); vec4 positionEC = czm_modelViewRelativeToEye * p; /////////////////////////////////////////////////////////////////////////// #if defined(EYE_DISTANCE_SCALING) || defined(EYE_DISTANCE_TRANSLUCENCY) || defined(DISTANCE_DISPLAY_CONDITION) || defined(DISABLE_DEPTH_DISTANCE) float lengthSq; if (czm_sceneMode == czm_sceneMode2D) { // 2D camera distance is a special case // treat all billboards as flattened to the z=0.0 plane lengthSq = czm_eyeHeight2D.y; } else { lengthSq = dot(positionEC.xyz, positionEC.xyz); } #endif #ifdef EYE_DISTANCE_SCALING totalSize *= czm_nearFarScalar(scaleByDistance, lengthSq); #endif if (totalSize > 0.0) { // Add padding for anti-aliasing on both sides. totalSize += 3.0; } // Clamp to max point size. totalSize = min(totalSize, u_maxTotalPointSize); // If size is too small, push vertex behind near plane for clipping. // Note that context.minimumAliasedPointSize "will be at most 1.0". if (totalSize < 1.0) { positionEC.xyz = vec3(0.0); totalSize = 1.0; } float translucency = 1.0; #ifdef EYE_DISTANCE_TRANSLUCENCY translucency = czm_nearFarScalar(translucencyByDistance, lengthSq); // push vertex behind near plane for clipping if (translucency < 0.004) { positionEC.xyz = vec3(0.0); } #endif #ifdef DISTANCE_DISPLAY_CONDITION float nearSq = distanceDisplayConditionAndDisableDepthAndSplitDirection.x; float farSq = distanceDisplayConditionAndDisableDepthAndSplitDirection.y; if (lengthSq < nearSq || lengthSq > farSq) { // push vertex behind camera to force it to be clipped positionEC.xyz = vec3(0.0, 0.0, 1.0); } #endif gl_Position = czm_projection * positionEC; czm_vertexLogDepth(); #ifdef DISABLE_DEPTH_DISTANCE float disableDepthTestDistance = distanceDisplayConditionAndDisableDepthAndSplitDirection.z; if (disableDepthTestDistance == 0.0 && czm_minimumDisableDepthTestDistance != 0.0) { disableDepthTestDistance = czm_minimumDisableDepthTestDistance; } if (disableDepthTestDistance != 0.0) { // Don't try to "multiply both sides" by w. Greater/less-than comparisons won't work for negative values of w. float zclip = gl_Position.z / gl_Position.w; bool clipped = (zclip < -1.0 || zclip > 1.0); if (!clipped && (disableDepthTestDistance < 0.0 || (lengthSq > 0.0 && lengthSq < disableDepthTestDistance))) { // Position z on the near plane. gl_Position.z = -gl_Position.w; #ifdef LOG_DEPTH czm_vertexLogDepth(vec4(czm_currentFrustum.x)); #endif } } #endif v_color = color; v_color.a *= translucency * show; v_outlineColor = outlineColor; v_outlineColor.a *= translucency * show; v_innerPercent = 1.0 - outlinePercent; v_pixelDistance = 2.0 / totalSize; gl_PointSize = totalSize * show; gl_Position *= show; v_pickColor = pickColor; v_splitDirection = distanceDisplayConditionAndDisableDepthAndSplitDirection.w; } `;var aje=Ws.SHOW_INDEX,iJ=Ws.POSITION_INDEX,yue=Ws.COLOR_INDEX,cje=Ws.OUTLINE_COLOR_INDEX,lje=Ws.OUTLINE_WIDTH_INDEX,dje=Ws.PIXEL_SIZE_INDEX,xue=Ws.SCALE_BY_DISTANCE_INDEX,_ue=Ws.TRANSLUCENCY_BY_DISTANCE_INDEX,Tue=Ws.DISTANCE_DISPLAY_CONDITION_INDEX,uje=Ws.DISABLE_DEPTH_DISTANCE_INDEX,mje=Ws.SPLIT_DIRECTION_INDEX,oJ=Ws.NUMBER_OF_PROPERTIES,Tc={positionHighAndSize:0,positionLowAndOutline:1,compressedAttribute0:2,compressedAttribute1:3,scaleByDistance:4,distanceDisplayConditionAndDisableDepthAndSplitDirection:5};function ju(e){e=y(e,y.EMPTY_OBJECT),this._sp=void 0,this._spTranslucent=void 0,this._rsOpaque=void 0,this._rsTranslucent=void 0,this._vaf=void 0,this._pointPrimitives=[],this._pointPrimitivesToUpdate=[],this._pointPrimitivesToUpdateIndex=0,this._pointPrimitivesRemoved=!1,this._createVertexArray=!1,this._shaderScaleByDistance=!1,this._compiledShaderScaleByDistance=!1,this._shaderTranslucencyByDistance=!1,this._compiledShaderTranslucencyByDistance=!1,this._shaderDistanceDisplayCondition=!1,this._compiledShaderDistanceDisplayCondition=!1,this._shaderDisableDepthDistance=!1,this._compiledShaderDisableDepthDistance=!1,this._propertiesChanged=new Uint32Array(oJ),this._maxPixelSize=1,this._baseVolume=new de,this._baseVolumeWC=new de,this._baseVolume2D=new de,this._boundingVolume=new de,this._boundingVolumeDirty=!1,this._colorCommands=[],this.show=y(e.show,!0),this.modelMatrix=M.clone(y(e.modelMatrix,M.IDENTITY)),this._modelMatrix=M.clone(M.IDENTITY),this.debugShowBoundingVolume=y(e.debugShowBoundingVolume,!1),this.blendOption=y(e.blendOption,Ro.OPAQUE_AND_TRANSLUCENT),this._blendOption=void 0,this._mode=oe.SCENE3D,this._maxTotalPointSize=1,this._buffersUsage=[ke.STATIC_DRAW,ke.STATIC_DRAW,ke.STATIC_DRAW,ke.STATIC_DRAW,ke.STATIC_DRAW,ke.STATIC_DRAW,ke.STATIC_DRAW,ke.STATIC_DRAW,ke.STATIC_DRAW];let t=this;this._uniforms={u_maxTotalPointSize:function(){return t._maxTotalPointSize}}}Object.defineProperties(ju.prototype,{length:{get:function(){return rJ(this),this._pointPrimitives.length}}});function Sue(e){let t=e.length;for(let n=0;n0&&(e._shaderDisableDepthDistance=!0,d===Number.POSITIVE_INFINITY&&(d=-1));let u=0,h=i.splitDirection;l(h)&&(u=h),r(o,s,a,d,u)}function fje(e,t,n,i){Cue(e,t,n,i),Vue(e,t,n,i),Lue(e,t,n,i),Rue(e,t,n,i),Zue(e,t,n,i)}function nJ(e,t,n,i,o,r){let s;i.mode===oe.SCENE3D?(s=e._baseVolume,e._boundingVolumeDirty=!0):s=e._baseVolume2D;let a=[];for(let c=0;c0){this._vaf=hje(c,n,this._buffersUsage),a=this._vaf.writers;for(let G=0;G0){let G=gje;G.length=0,(r[iJ]||r[lje]||r[dje])&&G.push(Cue),(r[yue]||r[cje])&&G.push(Vue),(r[aje]||r[_ue])&&G.push(Lue),r[xue]&&G.push(Rue),(r[Tue]||r[uje]||r[mje])&&G.push(Zue);let I=G.length;if(a=this._vaf.writers,o/n>.1){for(let v=0;vn*1.5&&(i.length=n),!l(this._vaf)||!l(this._vaf.va))return;this._boundingVolumeDirty&&(this._boundingVolumeDirty=!1,de.transform(this._baseVolume,this.modelMatrix,this._baseVolumeWC));let h,p=M.IDENTITY;e.mode===oe.SCENE3D?(p=this.modelMatrix,h=de.clone(this._baseVolumeWC,this._boundingVolume)):h=de.clone(this._baseVolume2D,this._boundingVolume),bje(this,e,h);let g=this._blendOption!==this.blendOption;this._blendOption=this.blendOption,g&&(this._blendOption===Ro.OPAQUE||this._blendOption===Ro.OPAQUE_AND_TRANSLUCENT?this._rsOpaque=Ue.fromCache({depthTest:{enabled:!0,func:ie.LEQUAL},depthMask:!0}):this._rsOpaque=void 0,this._blendOption===Ro.TRANSLUCENT||this._blendOption===Ro.OPAQUE_AND_TRANSLUCENT?this._rsTranslucent=Ue.fromCache({depthTest:{enabled:!0,func:ie.LEQUAL},depthMask:!1,blending:hn.ALPHA_BLEND}):this._rsTranslucent=void 0),this._shaderDisableDepthDistance=this._shaderDisableDepthDistance||e.minimumDisableDepthTestDistance!==0;let f,x;(g||this._shaderScaleByDistance&&!this._compiledShaderScaleByDistance||this._shaderTranslucencyByDistance&&!this._compiledShaderTranslucencyByDistance||this._shaderDistanceDisplayCondition&&!this._compiledShaderDistanceDisplayCondition||this._shaderDisableDepthDistance!==this._compiledShaderDisableDepthDistance)&&(f=new De({sources:[YP]}),this._shaderScaleByDistance&&f.defines.push("EYE_DISTANCE_SCALING"),this._shaderTranslucencyByDistance&&f.defines.push("EYE_DISTANCE_TRANSLUCENCY"),this._shaderDistanceDisplayCondition&&f.defines.push("DISTANCE_DISPLAY_CONDITION"),this._shaderDisableDepthDistance&&f.defines.push("DISABLE_DEPTH_DISTANCE"),this._blendOption===Ro.OPAQUE_AND_TRANSLUCENT&&(x=new De({defines:["OPAQUE"],sources:[ty]}),this._sp=en.replaceCache({context:c,shaderProgram:this._sp,vertexShaderSource:f,fragmentShaderSource:x,attributeLocations:Tc}),x=new De({defines:["TRANSLUCENT"],sources:[ty]}),this._spTranslucent=en.replaceCache({context:c,shaderProgram:this._spTranslucent,vertexShaderSource:f,fragmentShaderSource:x,attributeLocations:Tc})),this._blendOption===Ro.OPAQUE&&(x=new De({sources:[ty]}),this._sp=en.replaceCache({context:c,shaderProgram:this._sp,vertexShaderSource:f,fragmentShaderSource:x,attributeLocations:Tc})),this._blendOption===Ro.TRANSLUCENT&&(x=new De({sources:[ty]}),this._spTranslucent=en.replaceCache({context:c,shaderProgram:this._spTranslucent,vertexShaderSource:f,fragmentShaderSource:x,attributeLocations:Tc})),this._compiledShaderScaleByDistance=this._shaderScaleByDistance,this._compiledShaderTranslucencyByDistance=this._shaderTranslucencyByDistance,this._compiledShaderDistanceDisplayCondition=this._shaderDistanceDisplayCondition,this._compiledShaderDisableDepthDistance=this._shaderDisableDepthDistance);let _,C,V,L,R=e.commandList;if(d.render||u){let G=this._colorCommands,I=this._blendOption===Ro.OPAQUE,v=this._blendOption===Ro.OPAQUE_AND_TRANSLUCENT;_=this._vaf.va,C=_.length,G.length=C;let P=v?C*2:C;for(L=0;L0){let F=new P_(V.length,64,Uint32Array);for(let N=0;N=u)for(Iue(N.position,Z,b,e),p.push(N),R=0;R=u){let k=m.multiplyByScalar(Y,1/Z,Y);for(Iue(k,Z,b,e),p.push({position:k,width:U.width,height:U.height,minimumWidth:I.width,minimumHeight:I.height}),R=0;R0?(a=d.shift(),c=r.get(a)):(c=r.add(),a=r.length-1),s[i]=a;let u=this;return Promise.resolve().then(function(){u._clusterDirty=!0}),c}}function lJ(e,t){let n=e._collectionIndicesByEntity[t];!l(n.billboardIndex)&&!l(n.labelIndex)&&!l(n.pointIndex)&&delete e._collectionIndicesByEntity[t]}_h.prototype.getLabel=cJ("_labelCollection",Wf,"_unusedLabelIndices","labelIndex");_h.prototype.removeLabel=function(e){let t=this._collectionIndicesByEntity&&this._collectionIndicesByEntity[e.id];if(!l(this._labelCollection)||!l(t)||!l(t.labelIndex))return;let n=t.labelIndex;t.labelIndex=void 0,lJ(this,e.id);let i=this._labelCollection.get(n);i.show=!1,i.text="",i.id=void 0,this._unusedLabelIndices.push(n),this._clusterDirty=!0};_h.prototype.getBillboard=cJ("_billboardCollection",Ed,"_unusedBillboardIndices","billboardIndex");_h.prototype.removeBillboard=function(e){let t=this._collectionIndicesByEntity&&this._collectionIndicesByEntity[e.id];if(!l(this._billboardCollection)||!l(t)||!l(t.billboardIndex))return;let n=t.billboardIndex;t.billboardIndex=void 0,lJ(this,e.id);let i=this._billboardCollection.get(n);i.id=void 0,i.show=!1,i.image=void 0,this._unusedBillboardIndices.push(n),this._clusterDirty=!0};_h.prototype.getPoint=cJ("_pointCollection",O1,"_unusedPointIndices","pointIndex");_h.prototype.removePoint=function(e){let t=this._collectionIndicesByEntity&&this._collectionIndicesByEntity[e.id];if(!l(this._pointCollection)||!l(t)||!l(t.pointIndex))return;let n=t.pointIndex;t.pointIndex=void 0,lJ(this,e.id);let i=this._pointCollection.get(n);i.show=!1,i.id=void 0,this._unusedPointIndices.push(n),this._clusterDirty=!0};function aJ(e){if(!l(e))return;let t=e.length;for(let n=0;n0&&!n.ready&&(t=e.commandList,e.commandList=[],n.update(e),e.commandList=t);let i=this._billboardCollection;l(i)&&i.length>0&&!i.ready&&(t=e.commandList,e.commandList=[],i.update(e),e.commandList=t),this._enabledDirty&&(this._enabledDirty=!1,Vje(this),this._clusterDirty=!0),this._clusterDirty&&(this._cluster(),this._clusterDirty=l(n)&&!n.ready||l(i)&&!i.ready),l(this._clusterLabelCollection)&&this._clusterLabelCollection.update(e),l(this._clusterBillboardCollection)&&this._clusterBillboardCollection.update(e),l(this._clusterPointCollection)&&this._clusterPointCollection.update(e),l(n)&&n.update(e),l(i)&&i.update(e),l(this._pointCollection)&&this._pointCollection.update(e)};_h.prototype.destroy=function(){l(this._removeEventListener)&&(this._removeEventListener(),this._removeEventListener=void 0),this._labelCollection=this._labelCollection&&this._labelCollection.destroy(),this._billboardCollection=this._billboardCollection&&this._billboardCollection.destroy(),this._pointCollection=this._pointCollection&&this._pointCollection.destroy(),this._clusterLabelCollection=this._clusterLabelCollection&&this._clusterLabelCollection.destroy(),this._clusterBillboardCollection=this._clusterBillboardCollection&&this._clusterBillboardCollection.destroy(),this._clusterPointCollection=this._clusterPointCollection&&this._clusterPointCollection.destroy(),this._labelCollection=void 0,this._billboardCollection=void 0,this._pointCollection=void 0,this._clusterBillboardCollection=void 0,this._clusterLabelCollection=void 0,this._clusterPointCollection=void 0,this._collectionIndicesByEntity=void 0,this._unusedLabelIndices=[],this._unusedBillboardIndices=[],this._unusedPointIndices=[],this._previousClusters=[],this._previousHeight=void 0,this._enabledDirty=!1,this._pixelRangeDirty=!1,this._minimumClusterSizeDirty=!1};var vd=_h;function dJ(e){this._name=e,this._clock=void 0,this._changed=new be,this._error=new be,this._isLoading=!1,this._loading=new be,this._entityCollection=new ea(this),this._entityCluster=new vd}Object.defineProperties(dJ.prototype,{name:{get:function(){return this._name},set:function(e){this._name!==e&&(this._name=e,this._changed.raiseEvent(this))}},clock:{get:function(){return this._clock},set:function(e){this._clock!==e&&(this._clock=e,this._changed.raiseEvent(this))}},entities:{get:function(){return this._entityCollection}},isLoading:{get:function(){return this._isLoading},set:function(e){zr.setLoading(this,e)}},changedEvent:{get:function(){return this._changed}},errorEvent:{get:function(){return this._error}},loadingEvent:{get:function(){return this._loading}},show:{get:function(){return this._entityCollection.show},set:function(e){this._entityCollection.show=e}},clustering:{get:function(){return this._entityCluster},set:function(e){this._entityCluster=e}}});dJ.prototype.update=function(e){return!0};var zP=dJ;var e4n=T(S(),1);var gQn=T(S(),1);var eQn=T(S(),1);var Wue={};Wue.computePositions=function(e,t,n,i,o){let r=e*.5,s=-r,a=i+i,c=o?2*a:a,d=new Float64Array(c*3),u,h=0,p=0,g=o?a*3:0,f=o?(a+i)*3:i*3;for(u=0;u0){let x=Math.min(r,o);d=Math.round(o/x),c+=x}let u=Me.createTypedArray(s,c*2),h=0,p;for(p=0;p0)for(p=0;p0){for(c=0;c=t;i--)e[i]=e[a--]}for(i=0;i=0||l(h)&&q.compare(u,h)>=0));){for(xJ[p++]=u,r=r+1,s=0;s0&&(_J.length=g,Nue(n,d,_J),xJ.length=p,Nue(t,c,xJ))}else{for(s=0;so)return;if(this._backwardExtrapolationType===Fd.HOLD)return r.unpack(s,0,t)}if(a>=i){a=i-1;let R=n[a];if(o=this._forwardExtrapolationDuration,this._forwardExtrapolationType===Fd.NONE||o!==0&&q.secondsDifference(e,R)>o)return;if(this._forwardExtrapolationType===Fd.HOLD)return a=i-1,r.unpack(s,a*r.packedLength,t)}let c=this._xTable,d=this._yTable,u=this._interpolationAlgorithm,h=this._packedInterpolationLength,p=this._inputOrder;if(this._updateTableLength){this._updateTableLength=!1;let R=Math.min(u.getRequiredDataPoints(this._interpolationDegree,p),i);R!==this._numberOfPoints&&(this._numberOfPoints=R,c.length=R,d.length=R*h)}let g=this._numberOfPoints-1;if(g<1)return;let f=0,x=i-1;if(x-f+1>=g+1){let R=a-(g/2|0)-1;Rx&&(G=x,R=G-g,R0){n=new Array(t);for(let i=0;ic&&e!==Object}let f=typeof e.unpack=="function"&&e!==qu;if(!g&&!p){h?t[n]=new qn(f?e.unpack(d,0):d):t[n]=Hue(e,s,i);return}let x=t[n],_,C=i.epoch;if(l(C)&&(_=q.fromIso8601(C)),g&&!p){x instanceof Md||(t[n]=x=new Md(e)),x.addSamplesPackedArray(d,_),Kk(i,x);return}let V;if(!g&&p){a=a.clone(),h?a.data=f?e.unpack(d,0):d:a.data=Hue(e,s,i),l(x)||(t[n]=x=h?new $b:new _c),h&&x instanceof $b?x.intervals.addInterval(a):x instanceof _c?(h&&(a.data=new qn(a.data)),x.intervals.addInterval(a)):(t[n]=x=que(x),h&&(a.data=new qn(a.data)),x.intervals.addInterval(a));return}l(x)||(t[n]=x=new _c),x instanceof _c||(t[n]=x=que(x));let L=x.intervals;V=L.findInterval(a),(!l(V)||!(V.data instanceof Md))&&(V=a.clone(),V.data=new Md(e),L.addInterval(V)),V.data.addSamplesPackedArray(d,_),Kk(i,V.data)}function dme(e,t){if(e instanceof Md){e.removeSamples(t);return}else if(e instanceof $b){e.intervals.removeInterval(t);return}else if(e instanceof _c){let n=e.intervals;for(let i=0;ic),!f&&!p){h?e[t]=new Dc(m.unpack(d),g):e[t]=nv(r,n.reference);return}let x=e[t],_,C=n.epoch;if(l(C)&&(_=q.fromIso8601(C)),f&&!p){(!(x instanceof Sa)||l(g)&&x.referenceFrame!==g)&&(e[t]=x=new Sa(g,a)),x.addSamplesPackedArray(d,_),Kk(n,x);return}let V;if(!f&&p){s=s.clone(),h?s.data=m.unpack(d):s.data=nv(r,n.reference),l(x)||(h?x=new qb(g):x=new _a(g),e[t]=x),h&&x instanceof qb&&l(g)&&x.referenceFrame===g?x.intervals.addInterval(s):x instanceof _a?(h&&(s.data=new Dc(s.data,g)),x.intervals.addInterval(s)):(e[t]=x=$ue(x),h&&(s.data=new Dc(s.data,g)),x.intervals.addInterval(s));return}l(x)?x instanceof _a||(e[t]=x=$ue(x)):e[t]=x=new _a(g);let L=x.intervals;V=L.findInterval(s),(!l(V)||!(V.data instanceof Sa)||l(g)&&V.data.referenceFrame!==g)&&(V=s.clone(),V.data=new Sa(g,a),L.addInterval(V)),V.data.addSamplesPackedArray(d,_),Kk(n,V.data)}function ume(e,t){if(e instanceof Sa){e.removeSamples(t);return}else if(e instanceof qb){e.intervals.removeInterval(t);return}else if(e instanceof _a){let n=e.intervals;for(let i=0;i. version format.");let i=t._documentPacket;l(e.name)&&(i.name=e.name);let o=e.clock;if(l(o)){let r=i.clock;l(r)?(r.interval=y(o.interval,r.interval),r.currentTime=y(o.currentTime,r.currentTime),r.range=y(o.range,r.range),r.step=y(o.step,r.step),r.multiplier=y(o.multiplier,r.multiplier)):i.clock={interval:o.interval,currentTime:o.currentTime,range:o.range,step:o.step,multiplier:o.multiplier}}}function q8e(e,t,n,i){let o=t.ellipse;if(!l(o))return;let r=pr(o.interval),s=e.ellipse;l(s)||(e.ellipse=s=new Yx),xe(Boolean,s,"show",o.show,r,i,n),xe(Number,s,"semiMajorAxis",o.semiMajorAxis,r,i,n),xe(Number,s,"semiMinorAxis",o.semiMinorAxis,r,i,n),xe(Number,s,"height",o.height,r,i,n),xe(Ke,s,"heightReference",o.heightReference,r,i,n),xe(Number,s,"extrudedHeight",o.extrudedHeight,r,i,n),xe(Ke,s,"extrudedHeightReference",o.extrudedHeightReference,r,i,n),xe(qu,s,"rotation",o.rotation,r,i,n),xe(qu,s,"stRotation",o.stRotation,r,i,n),xe(Number,s,"granularity",o.granularity,r,i,n),xe(Boolean,s,"fill",o.fill,r,i,n),Nd(s,"material",o.material,r,i,n),xe(Boolean,s,"outline",o.outline,r,i,n),xe(B,s,"outlineColor",o.outlineColor,r,i,n),xe(Number,s,"outlineWidth",o.outlineWidth,r,i,n),xe(Number,s,"numberOfVerticalLines",o.numberOfVerticalLines,r,i,n),xe(_n,s,"shadows",o.shadows,r,i,n),xe(Ft,s,"distanceDisplayCondition",o.distanceDisplayCondition,r,i,n),xe(Bn,s,"classificationType",o.classificationType,r,i,n),xe(Number,s,"zIndex",o.zIndex,r,i,n)}function $8e(e,t,n,i){let o=t.ellipsoid;if(!l(o))return;let r=pr(o.interval),s=e.ellipsoid;l(s)||(e.ellipsoid=s=new Hx),xe(Boolean,s,"show",o.show,r,i,n),xe(m,s,"radii",o.radii,r,i,n),xe(m,s,"innerRadii",o.innerRadii,r,i,n),xe(Number,s,"minimumClock",o.minimumClock,r,i,n),xe(Number,s,"maximumClock",o.maximumClock,r,i,n),xe(Number,s,"minimumCone",o.minimumCone,r,i,n),xe(Number,s,"maximumCone",o.maximumCone,r,i,n),xe(Ke,s,"heightReference",o.heightReference,r,i,n),xe(Boolean,s,"fill",o.fill,r,i,n),Nd(s,"material",o.material,r,i,n),xe(Boolean,s,"outline",o.outline,r,i,n),xe(B,s,"outlineColor",o.outlineColor,r,i,n),xe(Number,s,"outlineWidth",o.outlineWidth,r,i,n),xe(Number,s,"stackPartitions",o.stackPartitions,r,i,n),xe(Number,s,"slicePartitions",o.slicePartitions,r,i,n),xe(Number,s,"subdivisions",o.subdivisions,r,i,n),xe(_n,s,"shadows",o.shadows,r,i,n),xe(Ft,s,"distanceDisplayCondition",o.distanceDisplayCondition,r,i,n)}function e7e(e,t,n,i){let o=t.label;if(!l(o))return;let r=pr(o.interval),s=e.label;l(s)||(e.label=s=new Um),xe(Boolean,s,"show",o.show,r,i,n),xe(String,s,"text",o.text,r,i,n),xe(String,s,"font",o.font,r,i,n),xe(Yo,s,"style",o.style,r,i,n),xe(Number,s,"scale",o.scale,r,i,n),xe(Boolean,s,"showBackground",o.showBackground,r,i,n),xe(B,s,"backgroundColor",o.backgroundColor,r,i,n),xe(D,s,"backgroundPadding",o.backgroundPadding,r,i,n),xe(D,s,"pixelOffset",o.pixelOffset,r,i,n),xe(m,s,"eyeOffset",o.eyeOffset,r,i,n),xe(xi,s,"horizontalOrigin",o.horizontalOrigin,r,i,n),xe(An,s,"verticalOrigin",o.verticalOrigin,r,i,n),xe(Ke,s,"heightReference",o.heightReference,r,i,n),xe(B,s,"fillColor",o.fillColor,r,i,n),xe(B,s,"outlineColor",o.outlineColor,r,i,n),xe(Number,s,"outlineWidth",o.outlineWidth,r,i,n),xe(Ut,s,"translucencyByDistance",o.translucencyByDistance,r,i,n),xe(Ut,s,"pixelOffsetScaleByDistance",o.pixelOffsetScaleByDistance,r,i,n),xe(Ut,s,"scaleByDistance",o.scaleByDistance,r,i,n),xe(Ft,s,"distanceDisplayCondition",o.distanceDisplayCondition,r,i,n),xe(Number,s,"disableDepthTestDistance",o.disableDepthTestDistance,r,i,n)}function t7e(e,t,n,i){let o=t.model;if(!l(o))return;let r=pr(o.interval),s=e.model;l(s)||(e.model=s=new Yp),xe(Boolean,s,"show",o.show,r,i,n),xe(ov.default,s,"uri",o.gltf,r,i,n),xe(Number,s,"scale",o.scale,r,i,n),xe(Number,s,"minimumPixelSize",o.minimumPixelSize,r,i,n),xe(Number,s,"maximumScale",o.maximumScale,r,i,n),xe(Boolean,s,"incrementallyLoadTextures",o.incrementallyLoadTextures,r,i,n),xe(Boolean,s,"runAnimations",o.runAnimations,r,i,n),xe(Boolean,s,"clampAnimations",o.clampAnimations,r,i,n),xe(_n,s,"shadows",o.shadows,r,i,n),xe(Ke,s,"heightReference",o.heightReference,r,i,n),xe(B,s,"silhouetteColor",o.silhouetteColor,r,i,n),xe(Number,s,"silhouetteSize",o.silhouetteSize,r,i,n),xe(B,s,"color",o.color,r,i,n),xe(fc,s,"colorBlendMode",o.colorBlendMode,r,i,n),xe(Number,s,"colorBlendAmount",o.colorBlendAmount,r,i,n),xe(Ft,s,"distanceDisplayCondition",o.distanceDisplayCondition,r,i,n);let a,c,d=o.nodeTransformations;if(l(d))if(Array.isArray(d))for(a=0,c=d.length;a-1;c--)n[c](s,e,t,i)}SJ=void 0}function u7e(e){let t,n=e._documentPacket.clock;if(!l(n)){if(!l(e._clock)){let o=e._entityCollection.computeAvailability();if(!o.start.equals(Be.MINIMUM_VALUE)){let r=o.start,s=o.stop,a=q.secondsDifference(s,r),c=Math.round(a/120);return t=new Sh,t.startTime=q.clone(r),t.stopTime=q.clone(s),t.clockRange=Kr.LOOP_STOP,t.multiplier=c,t.currentTime=q.clone(r),t.clockStep=yo.SYSTEM_CLOCK_MULTIPLIER,e._clock=t,!0}}return!1}l(e._clock)?t=e._clock.clone():(t=new Sh,t.startTime=Be.MINIMUM_VALUE.clone(),t.stopTime=Be.MAXIMUM_VALUE.clone(),t.currentTime=Be.MINIMUM_VALUE.clone(),t.clockRange=Kr.LOOP_STOP,t.clockStep=yo.SYSTEM_CLOCK_MULTIPLIER,t.multiplier=1);let i=pr(n.interval);return l(i)&&(t.startTime=i.start,t.stopTime=i.stop),l(n.currentTime)&&(t.currentTime=q.fromIso8601(n.currentTime)),l(n.range)&&(t.clockRange=y(Kr[n.range],Kr.LOOP_STOP)),l(n.step)&&(t.clockStep=y(yo[n.step],yo.SYSTEM_CLOCK_MULTIPLIER)),l(n.multiplier)&&(t.multiplier=n.multiplier),t.equals(e._clock)?!1:(e._clock=t.clone(e._clock),!0)}function hme(e,t,n,i){n=y(n,y.EMPTY_OBJECT);let o=t,r=n.sourceUri,s=n.credit;if(typeof s=="string"&&(s=new Rt(s)),e._credit=s,typeof t=="string"||t instanceof Re){t=Re.createIfNeeded(t),o=t.fetchJson(),r=y(r,t.clone());let a=e._resourceCredits,c=t.credits;if(l(c)){let d=c.length;for(let u=0;u1;--b){if(C=W.PI_OVER_TWO-(b-1)*_,G=lV(-C,r,f,g,c,u,d,h,p,G),I=lV(C+Math.PI,r,f,g,c,u,d,h,p,I),t){for(L[R++]=G.x,L[R++]=G.y,L[R++]=G.z,E=2*(b-1)+2,Z=1;Z1;--s){for(t[n++]=i++,t[n++]=i,t[n++]=r,o=2*s,a=0;aW.PI&&(h.north=h.north>0?W.PI_OVER_TWO-W.EPSILON7:h.north,h.south=h.south<0?W.EPSILON7-W.PI_OVER_TWO:h.south,h.east=W.PI,h.west=-W.PI),h}function Nf(e){e=y(e,y.EMPTY_OBJECT);let t=e.center,n=y(e.ellipsoid,ne.default),i=e.semiMajorAxis,o=e.semiMinorAxis,r=y(e.granularity,W.RADIANS_PER_DEGREE),s=y(e.vertexFormat,Xe.DEFAULT),a=y(e.height,0),c=y(e.extrudedHeight,a);this._center=m.clone(t),this._semiMajorAxis=i,this._semiMinorAxis=o,this._ellipsoid=ne.clone(n),this._rotation=y(e.rotation,0),this._stRotation=y(e.stRotation,0),this._height=Math.max(c,a),this._granularity=r,this._vertexFormat=Xe.clone(s),this._extrudedHeight=Math.min(c,a),this._shadowVolume=y(e.shadowVolume,!1),this._workerName="createEllipseGeometry",this._offsetAttribute=e.offsetAttribute,this._rectangle=void 0,this._textureCoordinateRotationPoints=void 0}Nf.packedLength=m.packedLength+ne.packedLength+Xe.packedLength+9;Nf.pack=function(e,t,n){return n=y(n,0),m.pack(e._center,t,n),n+=m.packedLength,ne.pack(e._ellipsoid,t,n),n+=ne.packedLength,Xe.pack(e._vertexFormat,t,n),n+=Xe.packedLength,t[n++]=e._semiMajorAxis,t[n++]=e._semiMinorAxis,t[n++]=e._rotation,t[n++]=e._stRotation,t[n++]=e._height,t[n++]=e._granularity,t[n++]=e._extrudedHeight,t[n++]=e._shadowVolume?1:0,t[n]=y(e._offsetAttribute,-1),t};var Wme=new m,Pme=new ne,vme=new Xe,Mf={center:Wme,ellipsoid:Pme,vertexFormat:vme,semiMajorAxis:void 0,semiMinorAxis:void 0,rotation:void 0,stRotation:void 0,height:void 0,granularity:void 0,extrudedHeight:void 0,shadowVolume:void 0,offsetAttribute:void 0};Nf.unpack=function(e,t,n){t=y(t,0);let i=m.unpack(e,t,Wme);t+=m.packedLength;let o=ne.unpack(e,t,Pme);t+=ne.packedLength;let r=Xe.unpack(e,t,vme);t+=Xe.packedLength;let s=e[t++],a=e[t++],c=e[t++],d=e[t++],u=e[t++],h=e[t++],p=e[t++],g=e[t++]===1,f=e[t];return l(n)?(n._center=m.clone(i,n._center),n._ellipsoid=ne.clone(o,n._ellipsoid),n._vertexFormat=Xe.clone(r,n._vertexFormat),n._semiMajorAxis=s,n._semiMinorAxis=a,n._rotation=c,n._stRotation=d,n._height=u,n._granularity=h,n._extrudedHeight=p,n._shadowVolume=g,n._offsetAttribute=f===-1?void 0:f,n):(Mf.height=u,Mf.extrudedHeight=p,Mf.granularity=h,Mf.stRotation=d,Mf.rotation=c,Mf.semiMajorAxis=s,Mf.semiMinorAxis=a,Mf.shadowVolume=g,Mf.offsetAttribute=f===-1?void 0:f,new Nf(Mf))};Nf.computeRectangle=function(e,t){e=y(e,y.EMPTY_OBJECT);let n=e.center,i=y(e.ellipsoid,ne.default),o=e.semiMajorAxis,r=e.semiMinorAxis,s=y(e.granularity,W.RADIANS_PER_DEGREE),a=y(e.rotation,0);return Xme(n,o,r,a,s,i,t)};Nf.createGeometry=function(e){if(e._semiMajorAxis<=0||e._semiMinorAxis<=0)return;let t=e._height,n=e._extrudedHeight,i=!W.equalsEpsilon(t,n,0,W.EPSILON2);e._center=e._ellipsoid.scaleToGeodeticSurface(e._center,e._center);let o={center:e._center,semiMajorAxis:e._semiMajorAxis,semiMinorAxis:e._semiMinorAxis,ellipsoid:e._ellipsoid,rotation:e._rotation,height:t,granularity:e._granularity,vertexFormat:e._vertexFormat,stRotation:e._stRotation},r;if(i)o.extrudedHeight=n,o.shadowVolume=e._shadowVolume,o.offsetAttribute=e._offsetAttribute,r=T7e(o);else if(r=y7e(o),l(e._offsetAttribute)){let s=r.attributes.position.values.length,a=e._offsetAttribute===an.NONE?0:1,c=new Uint8Array(s/3).fill(a);r.attributes.applyOffset=new Ze({componentDatatype:Q.UNSIGNED_BYTE,componentsPerAttribute:1,values:c})}return new mt({attributes:r.attributes,indices:r.indices,primitiveType:Ae.TRIANGLES,boundingSphere:r.boundingSphere,offsetAttribute:e._offsetAttribute})};Nf.createShadowVolume=function(e,t,n){let i=e._granularity,o=e._ellipsoid,r=t(i,o),s=n(i,o);return new Nf({center:e._center,semiMajorAxis:e._semiMajorAxis,semiMinorAxis:e._semiMinorAxis,ellipsoid:o,rotation:e._rotation,stRotation:e._stRotation,granularity:i,extrudedHeight:r,height:s,vertexFormat:Xe.POSITION_ONLY,shadowVolume:!0})};function S7e(e){let t=-e._stRotation;if(t===0)return[0,0,0,1,1,0];let i=Kl.computeEllipsePositions({center:e._center,semiMajorAxis:e._semiMajorAxis,semiMinorAxis:e._semiMinorAxis,rotation:e._rotation,granularity:e._granularity},!1,!0).outerPositions,o=i.length/3,r=new Array(o);for(let c=0;c0){let f=Math.min(d,c);g=Math.round(c/f);let x=Math.min(g*d,c);for(p=0;p0&&(R=!0,C+=c-1),s0&&u!==x-1&&h!==0&&h!==_-1&&(A[K]=!0),K++;p=0;let te,z;for(u=1;u=Qe&&u1||G>1))for(let Z=0;Z0;u-=d)Se=u*3,H=yV(H,ee,Se,p,_),ee+=6,o.st&&(z=xV(z,pe,u*2,G),pe+=4),n&&(_e+=3,K[_e++]=I[Se],K[_e++]=I[Se+1],K[_e++]=I[Se+2]),j&&(te[ae++]=1,ae+=1);if(E){let Qe=ye;for(Se=Qe*3,u=0;u<2;u++)H=yV(H,ee,Se,p,_),ee+=6,o.st&&(z=xV(z,pe,Qe*2,G),pe+=4),n&&(_e+=3,K[_e++]=I[Se],K[_e++]=I[Se+1],K[_e++]=I[Se+2]),j&&(te[ae++]=1,ae+=1)}else for(u=d-1;u>=0;u--)Se=u*3,H=yV(H,ee,Se,p,_),ee+=6,o.st&&(z=xV(z,pe,u*2,G),pe+=4),n&&(_e+=3,K[_e++]=I[Se],K[_e++]=I[Se+1],K[_e++]=I[Se+2]),j&&(te[ae++]=1,ae+=1);let Ee=L6e(H,o,a);o.st&&(Ee.attributes.st=new Ze({componentDatatype:Q.FLOAT,componentsPerAttribute:2,values:z})),n&&(Ee.attributes.extrudeDirection=new Ze({componentDatatype:Q.FLOAT,componentsPerAttribute:3,values:K})),P&&(Ee.attributes.applyOffset=new Ze({componentDatatype:Q.UNSIGNED_BYTE,componentsPerAttribute:1,values:te}));let Ie=Me.createTypedArray(k,O*6),we,ve,at,Je;g=H.length/3;let pt=0;for(u=0;u0)for(s=new Array(o),i=0;i0)for(a=new Array(o),i=0;i0)for(s=new Array(o),i=0;i0)for(a=new Array(o),i=0;i{i.raiseEvent(a)}),n[r]=s}this.updaters=n,this.geometryChanged=i,this.eventHelper=o,this._removeEntitySubscription=e.definitionChanged.addEventListener(LT.prototype._onEntityPropertyChanged,this)}LT.prototype._onEntityPropertyChanged=function(e,t,n,i){let o=this.updaters;for(let r=0;r0){l(i)&&(l(this.oldPrimitive)?o.remove(i):this.oldPrimitive=i);let c;l(this.depthFailAppearanceType)&&(l(this.depthFailMaterialProperty)&&(this.depthFailMaterial=er.getValue(e,this.depthFailMaterialProperty,this.depthFailMaterial)),c=new this.depthFailAppearanceType({material:this.depthFailMaterial,translucent:this.translucent,closed:this.closed})),i=new Xn({show:!1,asynchronous:!0,geometryInstances:s.slice(),appearance:new this.appearanceType({translucent:this.translucent,closed:this.closed}),depthFailAppearance:c,shadows:this.shadows}),o.add(i),t=!1}else{l(i)&&(o.remove(i),i=void 0);let c=this.oldPrimitive;l(c)&&(o.remove(c),this.oldPrimitive=void 0)}this.attributes.removeAll(),this.primitive=i,this.createPrimitive=!1,this.waitingOnCreate=!0}else if(l(i)&&i.ready){i.show=!0,l(this.oldPrimitive)&&(o.remove(this.oldPrimitive),this.oldPrimitive=void 0),l(this.depthFailAppearanceType)&&!(this.depthFailMaterialProperty instanceof Bt)&&(this.depthFailMaterial=er.getValue(e,this.depthFailMaterialProperty,this.depthFailMaterial),this.primitive.depthFailAppearance.material=this.depthFailMaterial);let s=this.updatersWithAttributes.values,a=s.length,c=this.waitingOnCreate;for(r=0;r=0;i--){let o=e[i];if(o.remove(t))return o.updaters.length===0&&(e.splice(i,1),o.destroy()),!0}return!1}SV.prototype.remove=function(e){Whe(this._solidItems,e)||Whe(this._translucentItems,e)};function Phe(e,t,n){let i=!1,o=t.length;for(let r=0;r0)for(r=0;r=0;r--){let s=t[r];if(s.invalidated){t.splice(r,1);let a=s.updaters.values,c=a.length;for(let d=0;d0){l(n)&&(l(this.oldPrimitive)?i.remove(n):this.oldPrimitive=n),this.material=er.getValue(e,this.materialProperty,this.material);let a;l(this.depthFailMaterialProperty)&&(this.depthFailMaterial=er.getValue(e,this.depthFailMaterialProperty,this.depthFailMaterial),a=new this.depthFailAppearanceType({material:this.depthFailMaterial,translucent:this.depthFailMaterial.isTranslucent(),closed:this.closed})),n=new Xn({show:!1,asynchronous:!0,geometryInstances:o.slice(),appearance:new this.appearanceType({material:this.material,translucent:this.material.isTranslucent(),closed:this.closed}),depthFailAppearance:a,shadows:this.shadows}),i.add(n),t=!1}else{l(n)&&(i.remove(n),n=void 0);let a=this.oldPrimitive;l(a)&&(i.remove(a),this.oldPrimitive=void 0)}this.attributes.removeAll(),this.primitive=n,this.createPrimitive=!1}else if(l(n)&&n.ready){n.show=!0,l(this.oldPrimitive)&&(i.remove(this.oldPrimitive),this.oldPrimitive=void 0),this.material=er.getValue(e,this.materialProperty,this.material),this.primitive.appearance.material=this.material,l(this.depthFailAppearanceType)&&!(this.depthFailMaterialProperty instanceof Bt)&&(this.depthFailMaterial=er.getValue(e,this.depthFailMaterialProperty,this.depthFailMaterial),this.primitive.depthFailAppearance.material=this.depthFailMaterial);let s=this.updatersWithAttributes.values,a=s.length;for(r=0;r=0;i--){let o=t[i];if(o.remove(e)){o.updaters.length===0&&(t.splice(i,1),o.destroy());break}}};CV.prototype.update=function(e){let t,n=this._items,i=n.length;for(t=i-1;t>=0;t--){let r=n[t];if(r.invalidated){n.splice(t,1);let s=r.updaters.values,a=s.length;for(let c=0;c0)l(i)&&(l(this.oldPrimitive)?o.remove(i):this.oldPrimitive=i),i=new kc({show:!1,asynchronous:!0,geometryInstances:s.slice(),classificationType:this.classificationType}),o.add(i,this.zIndex),t=!1;else{l(i)&&(o.remove(i),i=void 0);let c=this.oldPrimitive;l(c)&&(o.remove(c),this.oldPrimitive=void 0)}this.attributes.removeAll(),this.primitive=i,this.createPrimitive=!1,this.waitingOnCreate=!0}else if(l(i)&&i.ready){i.show=!0,l(this.oldPrimitive)&&(o.remove(this.oldPrimitive),this.oldPrimitive=void 0);let s=this.updatersWithAttributes.values,a=s.length,c=this.waitingOnCreate;for(r=0;r=0;--t){let s=o[t];s.isDirty&&(i=o[t].update(e)&&i,s.isDirty=!1),s.geometry.length===0&&o.splice(t,1)}return i};VV.prototype.getBoundingSphere=function(e,t){let n=this._batches,i=n.length;for(let o=0;o0)l(n)&&(l(this.oldPrimitive)?i.remove(n):this.oldPrimitive=n),this.material=er.getValue(e,this.materialProperty,this.material),n=new kc({show:!1,asynchronous:!0,geometryInstances:o.slice(),appearance:new this.appearanceType({material:this.material}),classificationType:this.classificationType}),i.add(n,this.zIndex),t=!1;else{l(n)&&(i.remove(n),n=void 0);let a=this.oldPrimitive;l(a)&&(i.remove(a),this.oldPrimitive=void 0)}this.attributes.removeAll(),this.primitive=n,this.createPrimitive=!1}else if(l(n)&&n.ready){n.show=!0,l(this.oldPrimitive)&&(i.remove(this.oldPrimitive),this.oldPrimitive=void 0),this.material=er.getValue(e,this.materialProperty,this.material),this.primitive.appearance.material=this.material;let s=this.updatersWithAttributes.values,a=s.length;for(r=0;r=0;i--){let o=t[i];if(o.remove(e)){o.updaters.length===0&&(t.splice(i,1),o.destroy());break}}};RV.prototype.update=function(e){let t,n=this._items,i=n.length;for(t=i-1;t>=0;t--){let r=n[t];if(r.invalidated){n.splice(t,1);let s=r.updaters.values,a=s.length;for(let c=0;c0)l(i)&&(l(this.oldPrimitive)?o.remove(i):this.oldPrimitive=i),i=new Xn({show:!1,asynchronous:!0,geometryInstances:s.slice(),appearance:new dn({flat:!0,translucent:this.translucent,renderState:{lineWidth:this.width}}),shadows:this.shadows}),o.add(i),t=!1;else{l(i)&&(o.remove(i),i=void 0);let c=this.oldPrimitive;l(c)&&(o.remove(c),this.oldPrimitive=void 0)}this.attributes.removeAll(),this.primitive=i,this.createPrimitive=!1,this.waitingOnCreate=!0}else if(l(i)&&i.ready){i.show=!0,l(this.oldPrimitive)&&(o.remove(this.oldPrimitive),this.oldPrimitive=void 0);let s=this.updatersWithAttributes.values,a=s.length,c=this.waitingOnCreate;for(r=0;r0)for(h=!0,t=0;t0)for(h=!0,t=0;t-1;a--)c=s[a],d=c.id,u=this._updaterSets.get(d),u.entity===c?u.forEach(function(x){h._removeUpdater(x),h._insertUpdaterIntoBatch(e,x)}):(o.push(c),n.push(c));for(a=o.length-1;a>-1;a--)c=o[a],d=c.id,u=this._updaterSets.get(d),u.forEach(this._removeUpdater.bind(this)),u.destroy(),this._updaterSets.remove(d),this._subscriptions.get(d)(),this._subscriptions.remove(d);for(a=n.length-1;a>-1;a--)c=n[a],d=c.id,u=new RT(c,this._scene),this._updaterSets.set(d,u),u.forEach(function(x){h._insertUpdaterIntoBatch(e,x)}),this._subscriptions.set(d,u.geometryChanged.addEventListener(Jl._onGeometryChanged,this));t.removeAll(),i.removeAll(),r.removeAll();let p=!0,g=this._batches,f=g.length;for(a=0;a-1;s--)c=n[s],a=c.id,i.remove(a)||(o.set(a,c),r.remove(a));for(s=t.length-1;s>-1;s--)c=t[s],a=c.id,o.remove(a)?r.set(a,c):i.set(a,c)};var Pv=Jl;var Zci=T(S(),1);var Tqe=1,Sqe="30px sans-serif",Cqe=Yo.FILL,Vqe=B.WHITE,Lqe=B.BLACK,Rqe=1,Zqe=!1,Gqe=new B(.165,.165,.165,.8),Eqe=new D(7,5),Iqe=D.ZERO,Xqe=m.ZERO,Wqe=Ke.NONE,Pqe=xi.CENTER,vqe=An.CENTER,wqe=new m,Fqe=new B,Aqe=new B,Mqe=new B,Nqe=new D,kqe=new m,Uqe=new D,Dqe=new Ut,Bqe=new Ut,Oqe=new Ut,Yqe=new Ft;function Mhe(e){this.entity=e,this.label=void 0,this.index=void 0}function ly(e,t){t.collectionChanged.addEventListener(ly.prototype._onCollectionChanged,this),this._cluster=e,this._entityCollection=t,this._items=new Et,this._onCollectionChanged(t,t.values,[],[])}ly.prototype.update=function(e){let t=this._items.values,n=this._cluster;for(let i=0,o=t.length;i-1;o--)r=t[o],l(r._label)&&l(r._position)&&s.set(r.id,new Mhe(r));for(o=i.length-1;o>-1;o--)r=i[o],l(r._label)&&l(r._position)?s.contains(r.id)||s.set(r.id,new Mhe(r)):(DJ(s.get(r.id),r,a),s.remove(r.id));for(o=n.length-1;o>-1;o--)r=n[o],DJ(s.get(r.id),r,a),s.remove(r.id)};function DJ(e,t,n){l(e)&&(e.label=void 0,n.removeLabel(t))}var vv=ly;var Kci=T(S(),1);var Hqe=1,zqe=!0,Kqe=0,Jqe=!0,Qqe=!0,jqe=_n.ENABLED,qqe=Ke.NONE,$qe=B.RED,e$e=0,t$e=B.WHITE,n$e=fc.HIGHLIGHT,i$e=.5,o$e=new D(1,1),Nhe={maximumPositionEpsilon:Number.POSITIVE_INFINITY},r$e=new M,s$e=new M,khe=new B,Uhe=new Array(4),a$e=new m;function dy(e,t){t.collectionChanged.addEventListener(dy.prototype._onCollectionChanged,this),this._scene=e,this._primitives=e.primitives,this._entityCollection=t,this._modelHash={},this._entitiesToVisualize=new Et,this._onCollectionChanged(t,t.values,[],[])}async function c$e(e,t,n,i,o){let r=e._primitives,s=e._modelHash;try{let a=await ch.fromGltfAsync({url:n,incrementallyLoadTextures:i,scene:e._scene,environmentMapOptions:o});if(e.isDestroyed()||!l(s[t.id]))return;a.id=t,r.add(a),s[t.id].modelPrimitive=a,a.errorEvent.addEventListener(c=>{l(s[t.id])&&(console.log(c),c.name!=="TextureError"&&a.incrementallyLoadTextures&&(s[t.id].loadFailed=!0))})}catch(a){if(e.isDestroyed()||!l(s[t.id]))return;console.log(a),s[t.id].loadFailed=!0}}dy.prototype.update=function(e){let t=this._entitiesToVisualize.values,n=this._modelHash,i=this._primitives;for(let o=0,r=t.length;o-1;i--)BJ(this,e[i],t,n);return me(this)};var mU=new m,l$e=new he;dy.prototype.getBoundingSphere=function(e,t){let n=this._modelHash[e.id];if(!l(n))return dt.FAILED;if(n.loadFailed)return dt.FAILED;let i=n.modelPrimitive;if(!l(i)||!i.show)return dt.PENDING;if(!i.ready||!n.modelUpdated)return dt.PENDING;let o=this._scene,r=y(o.ellipsoid,ne.default);if(i.heightReference!==Ke.NONE){let a=i.modelMatrix;mU.x=a[12],mU.y=a[13],mU.z=a[14];let c=r.cartesianToCartographic(mU,l$e),d=o.getHeight(c,i.heightReference);return l(d)&&(_u(i.heightReference)?c.height=d:c.height+=d),de.clone(i.boundingSphere,t),t.center=r.cartographicToCartesian(c),dt.DONE}return de.clone(i.boundingSphere,t),dt.DONE};dy.prototype._onCollectionChanged=function(e,t,n,i){let o,r,s=this._entitiesToVisualize,a=this._modelHash,c=this._primitives;for(o=t.length-1;o>-1;o--)r=t[o],l(r._model)&&l(r._position)&&s.set(r.id,r);for(o=i.length-1;o>-1;o--)r=i[o],l(r._model)&&l(r._position)?(d$e(r,a),s.set(r.id,r)):(BJ(this,r,a,c),s.remove(r.id));for(o=n.length-1;o>-1;o--)r=n[o],BJ(this,r,a,c),s.remove(r.id)};function BJ(e,t,n,i){let o=n[t.id];l(o)&&(i.removeAndDestroy(o.modelPrimitive),delete n[t.id])}function d$e(e,t){let n=t[e.id];l(n)&&(n.nodeTransformationsScratch={},n.articulationsScratch={})}var wv=dy;var Lli=T(S(),1);var nli=T(S(),1);function uy(e){this._definitionChanged=new be,this._value=void 0,this._removeSubscription=void 0,this.setValue(e)}Object.defineProperties(uy.prototype,{isConstant:{get:function(){return J.isConstant(this._value)}},definitionChanged:{get:function(){return this._definitionChanged}},referenceFrame:{get:function(){return l(this._value)?this._value.referenceFrame:Di.FIXED}}});var u$e=new q;uy.prototype.getValue=function(e,t){return l(e)||(e=q.now(u$e)),this.getValueInReferenceFrame(e,Di.FIXED,t)};uy.prototype.setValue=function(e){this._value!==e&&(this._value=e,l(this._removeSubscription)&&(this._removeSubscription(),this._removeSubscription=void 0),l(e)&&(this._removeSubscription=e.definitionChanged.addEventListener(this._raiseDefinitionChanged,this)),this._definitionChanged.raiseEvent(this))};uy.prototype.getValueInReferenceFrame=function(e,t,n){if(l(this._value))return n=this._value.getValueInReferenceFrame(e,t,n),l(n)?ne.default.scaleToGeodeticSurface(n,n):void 0};uy.prototype.equals=function(e){return this===e||e instanceof uy&&this._value===e._value};uy.prototype._raiseDefinitionChanged=function(){this._definitionChanged.raiseEvent(this)};var Df=uy;var m$e=60,h$e=1,Bhe=new Cn,OJ=new Cn,YJ=new Cn;function Dhe(e){this.entity=e,this.polyline=void 0,this.index=void 0,this.updater=void 0}function f$e(e,t,n,i,o,r,s,a,c){let d=a,u;u=e.getValueInReferenceFrame(t,r,c[d]),l(u)&&(c[d++]=u);let h=!l(o)||q.lessThanOrEquals(o,t)||q.greaterThanOrEquals(o,n),p=0,g=i.length,f=i[p],x=n,_=!1,C,V,L;for(;p0&&!_){let R=i[p+1],G=q.secondsDifference(R,f);_=G>s,_&&(C=Math.ceil(G/s),V=0,L=G/Math.max(C,2),C=Math.max(C-1,1))}if(_&&V0){let g=h.pop();c=this._polylineCollection.get(g),t.index=g}else t.index=this._polylineCollection.length,c=this._polylineCollection.add();c.id=n,t.polyline=c}let u=J.getValueOrDefault(i._resolution,e,m$e);c.show=!0,c.positions=Yhe(o,r,s,e,this._referenceFrame,u,c.positions.slice()),c.material=er.getValue(e,i._material,c.material),c.width=J.getValueOrDefault(i._width,e,h$e),c.distanceDisplayCondition=J.getValueOrUndefined(i._distanceDisplayCondition,e,c.distanceDisplayCondition)};Fv.prototype.removeObject=function(e){let t=e.polyline;l(t)&&(this._unusedIndexes.push(e.index),e.polyline=void 0,t.show=!1,t.id=void 0,e.index=void 0)};Fv.prototype.destroy=function(){return this._scene.primitives.remove(this._polylineCollection),me(this)};function my(e,t){t.collectionChanged.addEventListener(my.prototype._onCollectionChanged,this),this._scene=e,this._updaters={},this._entityCollection=t,this._items=new Et,this._onCollectionChanged(t,t.values,[],[])}my.prototype.update=function(e){let t=this._updaters;for(let i in t)t.hasOwnProperty(i)&&t[i].update(e);let n=this._items.values;if(n.length===0&&l(this._updaters)&&Object.keys(this._updaters).length>0){for(let i in t)t.hasOwnProperty(i)&&t[i].destroy();this._updaters={}}for(let i=0,o=n.length;i-1;o--)r=t[o],l(r._path)&&l(r._position)&&a.set(r.id,new Dhe(r));for(o=i.length-1;o>-1;o--)r=i[o],l(r._path)&&l(r._position)?a.contains(r.id)||a.set(r.id,new Dhe(r)):(s=a.get(r.id),l(s)&&(l(s.updater)&&s.updater.removeObject(s),a.remove(r.id)));for(o=n.length-1;o>-1;o--)r=n[o],s=a.get(r.id),l(s)&&(l(s.updater)&&s.updater.removeObject(s),a.remove(r.id))};my._subSample=Yhe;var Av=my;var Nli=T(S(),1);var Hhe=B.WHITE,zhe=B.BLACK,Khe=0,Jhe=1,Qhe=0,jhe=Fr.NONE,qhe=new B,T$e=new m,$he=new B,efe=new Ut,tfe=new Ut,nfe=new Ft;function ife(e){this.entity=e,this.pointPrimitive=void 0,this.billboard=void 0,this.color=void 0,this.outlineColor=void 0,this.pixelSize=void 0,this.outlineWidth=void 0}function hy(e,t){t.collectionChanged.addEventListener(hy.prototype._onCollectionChanged,this),this._cluster=e,this._entityCollection=t,this._items=new Et,this._onCollectionChanged(t,t.values,[],[])}hy.prototype.update=function(e){let t=this._items.values,n=this._cluster;for(let i=0,o=t.length;i0?(d.scale=1,g=g||C!==r.outlineWidth||V!==r.pixelSize||!B.equals(x,r.color)||!B.equals(_,r.outlineColor)):(d.scale=V/50,V=50,g=g||C!==r.outlineWidth||!B.equals(x,r.color)||!B.equals(_,r.outlineColor)),g){r.color=B.clone(x,r.color),r.outlineColor=B.clone(_,r.outlineColor),r.pixelSize=V,r.outlineWidth=C;let L=x.alpha,R=x.toCssColorString(),G=_.toCssColorString(),I=JSON.stringify([R,V,G,C]);d.setImage(I,k_(L,R,G,C,V))}f&&d._updateClamping()}}return!0};hy.prototype.getBoundingSphere=function(e,t){let n=this._items.get(e.id);if(!l(n)||!(l(n.pointPrimitive)||l(n.billboard)))return dt.FAILED;if(l(n.pointPrimitive))t.center=m.clone(n.pointPrimitive.position,t.center);else{let i=n.billboard;if(!l(i._clampedPosition))return dt.PENDING;t.center=m.clone(i._clampedPosition,t.center)}return t.radius=0,dt.DONE};hy.prototype.isDestroyed=function(){return!1};hy.prototype.destroy=function(){this._entityCollection.collectionChanged.removeEventListener(hy.prototype._onCollectionChanged,this);let e=this._entityCollection.values;for(let t=0;t-1;o--)r=t[o],l(r._point)&&l(r._position)&&s.set(r.id,new ife(r));for(o=i.length-1;o>-1;o--)r=i[o],l(r._point)&&l(r._position)?s.contains(r.id)||s.set(r.id,new ife(r)):(Mv(s.get(r.id),r,a),s.remove(r.id));for(o=n.length-1;o>-1;o--)r=n[o],Mv(s.get(r.id),r,a),s.remove(r.id)};function Mv(e,t,n){if(l(e)){let i=e.pointPrimitive;if(l(i)){e.pointPrimitive=void 0,n.removePoint(t);return}let o=e.billboard;l(o)&&(e.billboard=void 0,n.removeBillboard(t))}}var Nv=hy;var gui=T(S(),1);var Fdi=T(S(),1);var rdi=T(S(),1);var cfe=[];function S$e(e,t,n,i,o){let r=cfe;r.length=o;let s,a=n.red,c=n.green,d=n.blue,u=n.alpha,h=i.red,p=i.green,g=i.blue,f=i.alpha;if(B.equals(n,i)){for(s=0;s0?new Array(o):void 0;for(i=0;i0){let F=0,N=h[0];i=i.filter(function(O,U){let Y=!1;return o?Y=U===N||U===0&&N===1:Y=U+1===N,Y?(F++,N=h[F],!1):!0})}let g=p.length;if(g<2||t<=0)return;if(r===tn.GEODESIC||r===tn.RHUMB){let F,N;r===tn.GEODESIC?(F=W.chordLength(s,a.maximumRadius),N=vi.numberOfPoints):(F=s,N=vi.numberOfPointsRhumbLine);let O=vi.extractHeights(p,a);if(l(i)){let U=1;for(c=0;c0)return de.fromPoints(t.positions,e),dt.DONE}return dt.FAILED};Uv.prototype.isDestroyed=function(){return!1};Uv.prototype.destroy=function(){let t=this._geometryUpdater._scene.id+this._primitives._guid,n=hU[t];l(n)&&(n.remove(this._line),n.length===0&&(this._primitives.removeAndDestroy(n),delete hU[t])),l(this._groundPolylinePrimitive)&&this._groundPrimitives.remove(this._groundPolylinePrimitive),me(this)};var Dv=Eh;var $di=T(S(),1);var X$e=new B,W$e=new Ft,P$e=new Ft;function Ih(e,t,n,i,o){let r;n instanceof Bt?r=$r:r=ba,this.orderedGroundPrimitives=e,this.classificationType=t,this.appearanceType=r,this.materialProperty=n,this.updaters=new Et,this.createPrimitive=!0,this.primitive=void 0,this.oldPrimitive=void 0,this.geometry=new Et,this.material=void 0,this.updatersWithAttributes=new Et,this.attributes=new Et,this.invalidated=!1,this.removeMaterialSubscription=n.definitionChanged.addEventListener(Ih.prototype.onMaterialChanged,this),this.subscriptions=new Et,this.showsUpdated=new Et,this.zIndex=i,this._asynchronous=o}Ih.prototype.onMaterialChanged=function(){this.invalidated=!0};Ih.prototype.isMaterial=function(e){let t=this.materialProperty,n=e.fillMaterialProperty;return n===t||n instanceof Bt&&t instanceof Bt?!0:l(t)&&t.equals(n)};Ih.prototype.add=function(e,t,n){let i=t.id;if(this.updaters.set(i,t),this.geometry.set(i,n),!t.hasConstantFill||!t.fillMaterialProperty.isConstant||!J.isConstant(t.distanceDisplayConditionProperty))this.updatersWithAttributes.set(i,t);else{let o=this;this.subscriptions.set(i,t.entity.definitionChanged.addEventListener(function(r,s,a,c){s==="isShowing"&&o.showsUpdated.set(t.id,t)}))}this.createPrimitive=!0};Ih.prototype.remove=function(e){let t=e.id;if(this.createPrimitive=this.geometry.remove(t)||this.createPrimitive,this.updaters.remove(t)){this.updatersWithAttributes.remove(t);let n=this.subscriptions.get(t);return l(n)&&(n(),this.subscriptions.remove(t)),!0}return!1};Ih.prototype.update=function(e){let t=!0,n=this.primitive,i=this.orderedGroundPrimitives,o=this.geometry.values,r;if(this.createPrimitive){if(o.length>0)l(n)&&(l(this.oldPrimitive)?i.remove(n):this.oldPrimitive=n),n=new Nm({show:!1,asynchronous:this._asynchronous,geometryInstances:o.slice(),appearance:new this.appearanceType,classificationType:this.classificationType}),this.appearanceType===ba&&(this.material=er.getValue(e,this.materialProperty,this.material),n.appearance.material=this.material),i.add(n,this.zIndex),t=!1;else{l(n)&&(i.remove(n),n=void 0);let a=this.oldPrimitive;l(a)&&(i.remove(a),this.oldPrimitive=void 0)}this.attributes.removeAll(),this.primitive=n,this.createPrimitive=!1}else if(l(n)&&n.ready){n.show=!0,l(this.oldPrimitive)&&(i.remove(this.oldPrimitive),this.oldPrimitive=void 0),this.appearanceType===ba&&(this.material=er.getValue(e,this.materialProperty,this.material),this.primitive.appearance.material=this.material);let s=this.updatersWithAttributes.values,a=s.length;for(r=0;r=0;i--){let o=t[i];if(o.remove(e)){o.updaters.length===0&&(t.splice(i,1),o.destroy());break}}};IV.prototype.update=function(e){let t,n=this._items,i=n.length;for(t=i-1;t>=0;t--){let r=n[t];if(r.invalidated){n.splice(t,1);let s=r.updaters.values,a=s.length;for(let c=0;c-1;a--)c=s[a],d=c.id,u=this._updaters.get(d),u.entity===c?(hfe(this,u),ffe(this,e,u)):(o.push(c),n.push(c));for(a=o.length-1;a>-1;a--)c=o[a],d=c.id,u=this._updaters.get(d),hfe(this,u),u.destroy(),this._updaters.remove(d),this._subscriptions.get(d)(),this._subscriptions.remove(d);for(a=n.length-1;a>-1;a--)c=n[a],d=c.id,u=new Dv(c,this._scene),this._updaters.set(d,u),ffe(this,e,u),this._subscriptions.set(d,u.geometryChanged.addEventListener(Bf._onGeometryChanged,this));t.removeAll(),i.removeAll(),r.removeAll();let h=!0,p=this._batches,g=p.length;for(a=0;a-1;s--)c=n[s],a=c.id,i.remove(a)||(o.set(a,c),r.remove(a));for(s=t.length-1;s>-1;s--)c=t[s],a=c.id,o.remove(a)?r.set(a,c):i.set(a,c)};var Ov=Bf;function Ql(e){kc.initializeTerrainHeights(),Nm.initializeTerrainHeights();let t=e.scene,n=e.dataSourceCollection;this._eventHelper=new fr,this._eventHelper.add(n.dataSourceAdded,this._onDataSourceAdded,this),this._eventHelper.add(n.dataSourceRemoved,this._onDataSourceRemoved,this),this._eventHelper.add(n.dataSourceMoved,this._onDataSourceMoved,this),this._eventHelper.add(t.postRender,this._postRender,this),this._dataSourceCollection=n,this._scene=t,this._visualizersCallback=y(e.visualizersCallback,Ql.defaultVisualizersCallback);let i=!1,o=new dl,r=new dl;n.length>0&&(t.primitives.add(o),t.groundPrimitives.add(r),i=!0),this._primitives=o,this._groundPrimitives=r;for(let d=0,u=n.length;dnew o(e,i))]};Object.defineProperties(Ql.prototype,{scene:{get:function(){return this._scene}},dataSources:{get:function(){return this._dataSourceCollection}},defaultDataSource:{get:function(){return this._defaultDataSource}},ready:{get:function(){return this._ready}}});Ql.prototype.isDestroyed=function(){return!1};Ql.prototype.destroy=function(){this._eventHelper.removeAll();let e=this._dataSourceCollection;for(let t=0,n=e.length;tB$e*d.maximumRadius?(f=yfe,m.normalize(h,f),m.negate(f,f),_=m.clone(m.UNIT_Z,zJ),x=m.cross(_,f,fU),m.magnitude(x)>W.EPSILON7&&(m.normalize(f,f),m.normalize(x,x),_=m.cross(f,x,zJ),m.normalize(_,_),p=!0)):m.equalsEpsilon(h,v,W.EPSILON7)||(_=yfe,m.normalize(b,_),m.normalize(Z,Z),x=m.cross(_,Z,zJ),g&&(x=m.multiplyByScalar(x,-1,x)),m.equalsEpsilon(x,m.ZERO,W.EPSILON7)||(f=m.cross(x,_,fU),$.multiplyByVector(A,f,f),$.multiplyByVector(A,x,x),$.multiplyByVector(A,_,_),m.normalize(f,f),m.normalize(x,x),m.normalize(_,_),p=!0))}}l(e.boundingSphere)&&(h=e.boundingSphere.center);let C,V,L;i&&(C=m.clone(t.position,KJ),V=m.clone(t.direction,xfe),L=m.clone(t.up,_fe));let R=N$e,G;l(s)&&(G=s.getValue(c,k$e));let I=r.getValue(c,U$e);if(a===Np.INERTIAL&&l(G))M.fromTranslationQuaternionRotationScale(h,G,m.ONE,R);else if(a===Np.VELOCITY&&l(I)){let v=wt.rotationMatrixFromPositionVelocity(h,I,d,D$e);M.fromRotationTranslation(v,h,R)}else a===Np.ENU||!p?wt.eastNorthUpToFixedFrame(h,d,R):(R[0]=f.x,R[1]=f.y,R[2]=f.z,R[3]=0,R[4]=x.x,R[5]=x.y,R[6]=x.z,R[7]=0,R[8]=_.x,R[9]=_.y,R[10]=_.z,R[11]=0,R[12]=h.x,R[13]=h.y,R[14]=h.z,R[15]=0);t._setTransform(R),i&&(m.clone(C,t.position),m.clone(V,t.direction),m.clone(L,t.up),m.cross(V,L,t.right))}if(n){let p=u===oe.SCENE2D||m.equals(e._offset3D,m.ZERO)?void 0:e._offset3D;t.lookAtTransform(t.transform,p)}}function Hv(e,t,n){this.entity=e,this.scene=t,this.ellipsoid=y(n,ne.default),this.boundingSphere=void 0,this._lastEntity=void 0,this._mode=void 0,this._lastCartesian=new m,this._defaultOffset3D=void 0,this._velocityProperty=new e0(e.position,!0),this._offset3D=new m}Object.defineProperties(Hv,{defaultOffset3D:{get:function(){return this._defaultOffset3D},set:function(e){this._defaultOffset3D=m.clone(e,new m)}}});Hv.defaultOffset3D=new m(-14e3,3500,3500);var pU=new rm,Y$e=new m;Hv.prototype.update=function(e,t){let n=this.scene,i=this.ellipsoid,o=n.mode;if(o===oe.MORPHING)return;let r=this.entity,s=r.trackingReferenceFrame,a=r.position;if(!l(a))return;let c=this._velocityProperty,d=r.orientation,u=r!==this._lastEntity,h=o!==this._mode,p=n.camera,g=u||h,f=!0;if(u){let x=r.viewFrom,_=l(x);if(l(t)){//!hasViewFrom && let C=a.getValue(e,Y$e);l(C)&&(pU.heading=p.heading,pU.pitch=p.pitch,pU.range=p.getCameraDistance?p.getCameraDistance():300,p.viewBoundingSphere(t,pU)),this.boundingSphere=t,g=!1,f=!1}else(!_||!l(x.getValue(e,this._offset3D)))&&m.clone(Hv._defaultOffset3D,this._offset3D)}else!h&&this._mode!==oe.SCENE2D&&m.clone(p.position,this._offset3D);this._lastEntity=r,this._mode=o,O$e(this,p,g,f,a,c,d,s,e,i)};var zv=Hv;var Zfi=T(S(),1);var Khi=T(S(),1);var ami=T(S(),1);function SU(e){return CU(e.map(([t,n])=>new Array(t).fill(n,0,t)))}function CU(e){return e.reduce((t,n)=>t.concat(Array.isArray(n)?CU(n):n),[])}var Tfe=[0,1,2,3].concat(...SU([[2,4],[2,5],[4,6],[4,7],[8,8],[8,9],[16,10],[16,11],[32,12],[32,13],[64,14],[64,15],[2,0],[1,16],[1,17],[2,18],[2,19],[4,20],[4,21],[8,22],[8,23],[16,24],[16,25],[32,26],[32,27],[64,28],[64,29]]));function br(){let e=this;function t(o){let r=e.dyn_tree,s=e.stat_desc.static_tree,a=e.stat_desc.extra_bits,c=e.stat_desc.extra_base,d=e.stat_desc.max_length,u,h,p,g,f,x,_=0;for(g=0;g<=15;g++)o.bl_count[g]=0;for(r[o.heap[o.heap_max]*2+1]=0,u=o.heap_max+1;u<573;u++)h=o.heap[u],g=r[r[h*2+1]*2+1]+1,g>d&&(g=d,_++),r[h*2+1]=g,!(h>e.max_code)&&(o.bl_count[g]++,f=0,h>=c&&(f=a[h-c]),x=r[h*2],o.opt_len+=x*(g+f),s&&(o.static_len+=x*(s[h*2+1]+f)));if(_!==0){do{for(g=d-1;o.bl_count[g]===0;)g--;o.bl_count[g]--,o.bl_count[g+1]+=2,o.bl_count[d]--,_-=2}while(_>0);for(g=d;g!==0;g--)for(h=o.bl_count[g];h!==0;)p=o.heap[--u],!(p>e.max_code)&&(r[p*2+1]!=g&&(o.opt_len+=(g-r[p*2+1])*r[p*2],r[p*2+1]=g),h--)}}function n(o,r){let s=0;do s|=o&1,o>>>=1,s<<=1;while(--r>0);return s>>>1}function i(o,r,s){let a=[],c=0,d,u,h;for(d=1;d<=15;d++)a[d]=c=c+s[d-1]<<1;for(u=0;u<=r;u++)h=o[u*2+1],h!==0&&(o[u*2]=n(a[h]++,h))}e.build_tree=function(o){let r=e.dyn_tree,s=e.stat_desc.static_tree,a=e.stat_desc.elems,c,d,u=-1,h;for(o.heap_len=0,o.heap_max=573,c=0;c=1;c--)o.pqdownheap(r,c);h=a;do c=o.heap[1],o.heap[1]=o.heap[o.heap_len--],o.pqdownheap(r,1),d=o.heap[1],o.heap[--o.heap_max]=c,o.heap[--o.heap_max]=d,r[h*2]=r[c*2]+r[d*2],o.depth[h]=Math.max(o.depth[c],o.depth[d])+1,r[c*2+1]=r[d*2+1]=h,o.heap[1]=h++,o.pqdownheap(r,1);while(o.heap_len>=2);o.heap[--o.heap_max]=o.heap[1],t(o),i(r,e.max_code,o.bl_count)}}br._length_code=[0,1,2,3,4,5,6,7].concat(...SU([[2,8],[2,9],[2,10],[2,11],[4,12],[4,13],[4,14],[4,15],[8,16],[8,17],[8,18],[8,19],[16,20],[16,21],[16,22],[16,23],[32,24],[32,25],[32,26],[31,27],[1,28]]));br.base_length=[0,1,2,3,4,5,6,7,8,10,12,14,16,20,24,28,32,40,48,56,64,80,96,112,128,160,192,224,0];br.base_dist=[0,1,2,3,4,6,8,12,16,24,32,48,64,96,128,192,256,384,512,768,1024,1536,2048,3072,4096,6144,8192,12288,16384,24576];br.d_code=function(e){return e<256?Tfe[e]:Tfe[256+(e>>>7)]};br.extra_lbits=[0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0];br.extra_dbits=[0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13];br.extra_blbits=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7];br.bl_order=[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15];function Ba(e,t,n,i,o){let r=this;r.static_tree=e,r.extra_bits=t,r.extra_base=n,r.elems=i,r.max_length=o}var H$e=[12,140,76,204,44,172,108,236,28,156,92,220,60,188,124,252,2,130,66,194,34,162,98,226,18,146,82,210,50,178,114,242,10,138,74,202,42,170,106,234,26,154,90,218,58,186,122,250,6,134,70,198,38,166,102,230,22,150,86,214,54,182,118,246,14,142,78,206,46,174,110,238,30,158,94,222,62,190,126,254,1,129,65,193,33,161,97,225,17,145,81,209,49,177,113,241,9,137,73,201,41,169,105,233,25,153,89,217,57,185,121,249,5,133,69,197,37,165,101,229,21,149,85,213,53,181,117,245,13,141,77,205,45,173,109,237,29,157,93,221,61,189,125,253,19,275,147,403,83,339,211,467,51,307,179,435,115,371,243,499,11,267,139,395,75,331,203,459,43,299,171,427,107,363,235,491,27,283,155,411,91,347,219,475,59,315,187,443,123,379,251,507,7,263,135,391,71,327,199,455,39,295,167,423,103,359,231,487,23,279,151,407,87,343,215,471,55,311,183,439,119,375,247,503,15,271,143,399,79,335,207,463,47,303,175,431,111,367,239,495,31,287,159,415,95,351,223,479,63,319,191,447,127,383,255,511,0,64,32,96,16,80,48,112,8,72,40,104,24,88,56,120,4,68,36,100,20,84,52,116,3,131,67,195,35,163,99,227],z$e=SU([[144,8],[112,9],[24,7],[8,8]]);Ba.static_ltree=CU(H$e.map((e,t)=>[e,z$e[t]]));var K$e=[0,16,8,24,4,20,12,28,2,18,10,26,6,22,14,30,1,17,9,25,5,21,13,29,3,19,11,27,7,23],J$e=SU([[30,5]]);Ba.static_dtree=CU(K$e.map((e,t)=>[e,J$e[t]]));Ba.static_l_desc=new Ba(Ba.static_ltree,br.extra_lbits,257,286,15);Ba.static_d_desc=new Ba(Ba.static_dtree,br.extra_dbits,0,30,15);Ba.static_bl_desc=new Ba(null,br.extra_blbits,0,19,7);var Q$e=9,j$e=8;function Of(e,t,n,i,o){let r=this;r.good_length=e,r.max_lazy=t,r.nice_length=n,r.max_chain=i,r.func=o}var Cfe=0,_U=1,IT=2,Xh=[new Of(0,0,0,0,Cfe),new Of(4,4,8,4,_U),new Of(4,5,16,8,_U),new Of(4,6,32,32,_U),new Of(4,4,16,16,IT),new Of(8,16,32,32,IT),new Of(8,16,128,128,IT),new Of(8,32,128,256,IT),new Of(32,128,258,1024,IT),new Of(32,258,258,4096,IT)],bU=["need dictionary","stream end","","","stream error","data error","","buffer error","",""],sm=0,gU=1,Kv=2,yU=3,q$e=32,JJ=42,xU=113,Jv=666,QJ=8,$$e=0,jJ=1,eet=2,Gr=3,TU=258,Bd=TU+Gr+1;function Sfe(e,t,n,i){let o=e[t*2],r=e[n*2];return o=3&&O[br.bl_order[Ne]*2+1]===0;Ne--);return e.opt_len+=3*(Ne+1)+5+5+4,Ne}function Ee(Ne){e.pending_buf[e.pending++]=Ne}function Ie(Ne){Ee(Ne&255),Ee(Ne>>>8&255)}function we(Ne){Ee(Ne>>8&255),Ee(Ne&255&255)}function ve(Ne,ct){let it,qe=ct;ee>16-qe?(it=Ne,j|=it<>>16-ee,ee+=qe-16):(j|=Ne<=8&&(Ee(j&255),j>>>=8,ee-=8)}function _t(){ve(jJ<<1,3),at(256,Ba.static_ltree),Qe(),1+z+10-ee<9&&(ve(jJ<<1,3),at(256,Ba.static_ltree),Qe()),z=7}function ht(Ne,ct){let it,qe,Gt;if(e.dist_buf[K]=Ne,e.lc_buf[K]=ct&255,K++,Ne===0?F[ct*2]++:(te++,Ne--,F[(br._length_code[ct]+256+1)*2]++,N[br.d_code(Ne)*2]++),(K&8191)===0&&b>2){for(it=K*8,qe=G-C,Gt=0;Gt<30;Gt++)it+=N[Gt*2]*(5+br.extra_dbits[Gt]);if(it>>>=3,te8?Ie(j):ee>0&&Ee(j&255),j=0,ee=0}function sn(Ne,ct,it){En(),z=8,it&&(Ie(ct),Ie(~ct)),e.pending_buf.set(c.subarray(Ne,Ne+ct),e.pending),e.pending+=ct}function Ce(Ne,ct,it){ve(($$e<<1)+(it?1:0),3),sn(Ne,ct,!0)}function Le(Ne,ct,it){let qe,Gt,Yt=0;b>0?(U.build_tree(e),Y.build_tree(e),Yt=Se(),qe=e.opt_len+3+7>>>3,Gt=e.static_len+3+7>>>3,Gt<=qe&&(qe=Gt)):qe=Gt=ct+5,ct+4<=qe&&Ne!=-1?Ce(Ne,ct,it):Gt==qe?(ve((jJ<<1)+(it?1:0),3),bt(Ba.static_ltree,Ba.static_dtree)):(ve((eet<<1)+(it?1:0),3),pt(U.max_code+1,Y.max_code+1,Yt+1),bt(F,N)),_e(),it&&En()}function wn(Ne){Le(C>=0?C:-1,G-C,Ne),C=G,t.flush_pending()}function Mo(){let Ne,ct,it,qe;do{if(qe=d-v-G,qe===0&&G===0&&v===0)qe=r;else if(qe==-1)qe--;else if(G>=r+r-Bd){c.set(c.subarray(r,r+r),0),I-=r,G-=r,C-=r,Ne=g,it=Ne;do ct=h[--it]&65535,h[it]=ct>=r?ct-r:0;while(--Ne!==0);Ne=r,it=Ne;do ct=u[--it]&65535,u[it]=ct>=r?ct-r:0;while(--Ne!==0);qe+=r}if(t.avail_in===0)return;Ne=t.read_buf(c,G+v,qe),v+=Ne,v>=Gr&&(p=c[G]&255,p=(p<<_^c[G+1]&255)&x)}while(vi-5&&(ct=i-5);;){if(v<=1){if(Mo(),v===0&&Ne==0)return sm;if(v===0)break}if(G+=v,v=0,it=C+ct,(G===0||G>=it)&&(v=G-it,G=it,wn(!1),t.avail_out===0)||G-C>=r-Bd&&(wn(!1),t.avail_out===0))return sm}return wn(Ne==4),t.avail_out===0?Ne==4?Kv:sm:Ne==4?yU:gU}function Xr(Ne){let ct=w,it=G,qe,Gt,Yt=P,Rn=G>r-Bd?G-(r-Bd):0,No=X,Io=a,vc=G+TU,wc=c[it+Yt-1],Ei=c[it+Yt];P>=E&&(ct>>=2),No>v&&(No=v);do if(qe=Ne,!(c[qe+Yt]!=Ei||c[qe+Yt-1]!=wc||c[qe]!=c[it]||c[++qe]!=c[it+1])){it+=2,qe++;do;while(c[++it]==c[++qe]&&c[++it]==c[++qe]&&c[++it]==c[++qe]&&c[++it]==c[++qe]&&c[++it]==c[++qe]&&c[++it]==c[++qe]&&c[++it]==c[++qe]&&c[++it]==c[++qe]&&itYt){if(I=Ne,Yt=Gt,Gt>=No)break;wc=c[it+Yt-1],Ei=c[it+Yt]}}while((Ne=u[Ne&Io]&65535)>Rn&&--ct!==0);return Yt<=v?Yt:v}function da(Ne){let ct=0,it;for(;;){if(v=Gr&&(p=(p<<_^c[G+(Gr-1)]&255)&x,ct=h[p]&65535,u[G&a]=h[p],h[p]=G),ct!==0&&(G-ct&65535)<=r-Bd&&Z!=2&&(V=Xr(ct)),V>=Gr)if(it=ht(G-I,V-Gr),v-=V,V<=A&&v>=Gr){V--;do G++,p=(p<<_^c[G+(Gr-1)]&255)&x,ct=h[p]&65535,u[G&a]=h[p],h[p]=G;while(--V!==0);G++}else G+=V,V=0,p=c[G]&255,p=(p<<_^c[G+1]&255)&x;else it=ht(0,c[G]&255),v--,G++;if(it&&(wn(!1),t.avail_out===0))return sm}return wn(Ne==4),t.avail_out===0?Ne==4?Kv:sm:Ne==4?yU:gU}function Vs(Ne){let ct=0,it,qe;for(;;){if(v=Gr&&(p=(p<<_^c[G+(Gr-1)]&255)&x,ct=h[p]&65535,u[G&a]=h[p],h[p]=G),P=V,L=I,V=Gr-1,ct!==0&&P4096)&&(V=Gr-1)),P>=Gr&&V<=P){qe=G+v-Gr,it=ht(G-1-L,P-Gr),v-=P-1,P-=2;do++G<=qe&&(p=(p<<_^c[G+(Gr-1)]&255)&x,ct=h[p]&65535,u[G&a]=h[p],h[p]=G);while(--P!==0);if(R=0,V=Gr-1,G++,it&&(wn(!1),t.avail_out===0))return sm}else if(R!==0){if(it=ht(0,c[G-1]&255),it&&wn(!1),G++,v--,t.avail_out===0)return sm}else R=1,G++,v--}return R!==0&&(it=ht(0,c[G-1]&255),R=0),wn(Ne==4),t.avail_out===0?Ne==4?Kv:sm:Ne==4?yU:gU}function ua(Ne){return Ne.total_in=Ne.total_out=0,Ne.msg=null,e.pending=0,e.pending_out=0,n=xU,o=0,ae(),pe(),0}e.deflateInit=function(Ne,ct,it,qe,Gt,Yt){return qe||(qe=QJ),Gt||(Gt=j$e),Yt||(Yt=0),Ne.msg=null,ct==-1&&(ct=6),Gt<1||Gt>Q$e||qe!=QJ||it<9||it>15||ct<0||ct>9||Yt<0||Yt>2?-2:(Ne.dstate=e,s=it,r=1<9||it<0||it>2?-2:(Xh[b].func!=Xh[ct].func&&Ne.total_in!==0&&(qe=Ne.deflate(1)),b!=ct&&(b=ct,A=Xh[b].max_lazy,E=Xh[b].good_length,X=Xh[b].nice_length,w=Xh[b].max_chain),Z=it,qe)},e.deflateSetDictionary=function(Ne,ct,it){let qe=it,Gt,Yt=0;if(!ct||n!=JJ)return-2;if(qer-Bd&&(qe=r-Bd,Yt=it-qe),c.set(ct.subarray(Yt,Yt+qe),0),G=qe,C=qe,p=c[0]&255,p=(p<<_^c[1]&255)&x,Gt=0;Gt<=qe-Gr;Gt++)p=(p<<_^c[Gt+(Gr-1)]&255)&x,u[Gt&a]=h[p],h[p]=Gt;return 0},e.deflate=function(Ne,ct){let it,qe,Gt,Yt,Rn;if(ct>4||ct<0)return-2;if(!Ne.next_out||!Ne.next_in&&Ne.avail_in!==0||n==Jv&&ct!=4)return Ne.msg=bU[4],-2;if(Ne.avail_out===0)return Ne.msg=bU[7],-5;if(t=Ne,Yt=o,o=ct,n==JJ&&(qe=QJ+(s-8<<4)<<8,Gt=(b-1&255)>>1,Gt>3&&(Gt=3),qe|=Gt<<6,G!==0&&(qe|=q$e),qe+=31-qe%31,n=xU,we(qe)),e.pending!==0){if(t.flush_pending(),t.avail_out===0)return o=-1,0}else if(t.avail_in===0&&ct<=Yt&&ct!=4)return t.msg=bU[7],-5;if(n==Jv&&t.avail_in!==0)return Ne.msg=bU[7],-5;if(t.avail_in!==0||v!==0||ct!=0&&n!=Jv){switch(Rn=-1,Xh[b].func){case Cfe:Rn=Jo(ct);break;case _U:Rn=da(ct);break;case IT:Rn=Vs(ct);break;default:}if((Rn==Kv||Rn==yU)&&(n=Jv),Rn==sm||Rn==Kv)return t.avail_out===0&&(o=-1),0;if(Rn==gU){if(ct==1)_t();else if(Ce(0,0,!1),ct==3)for(it=0;itn&&(o=n),o===0?0:(i.avail_in-=o,e.set(i.next_in.subarray(i.next_in_index,i.next_in_index+o),t),i.next_in_index+=o,i.total_in+=o,o)},flush_pending(){let e=this,t=e.dstate.pending;t>e.avail_out&&(t=e.avail_out),t!==0&&(e.next_out.set(e.dstate.pending_buf.subarray(e.dstate.pending_out,e.dstate.pending_out+t),e.next_out_index),e.next_out_index+=t,e.dstate.pending_out+=t,e.total_out+=t,e.avail_out-=t,e.dstate.pending-=t,e.dstate.pending===0&&(e.dstate.pending_out=0))}};function Lfe(e){let t=this,n=new Vfe,i=net(e&&e.chunkSize?e.chunkSize:64*1024),o=0,r=new Uint8Array(i),s=e?e.level:-1;typeof s>"u"&&(s=-1),n.deflateInit(s),n.next_out=r,t.append=function(a,c){let d,u,h=0,p=0,g=0,f=[];if(a.length){n.next_in_index=0,n.next_in=a,n.avail_in=a.length;do{if(n.next_out_index=0,n.avail_out=i,d=n.deflate(o),d!=0)throw new Error("deflating: "+n.msg);n.next_out_index&&(n.next_out_index==i?f.push(new Uint8Array(r)):f.push(r.subarray(0,n.next_out_index))),g+=n.next_out_index,c&&n.next_in_index>0&&n.next_in_index!=h&&(c(n.next_in_index),h=n.next_in_index)}while(n.avail_in>0||n.avail_out===0);return f.length>1?(u=new Uint8Array(g),f.forEach(function(x){u.set(x,p),p+=x.length})):u=f[0]?new Uint8Array(f[0]):new Uint8Array,u}},t.flush=function(){let a,c,d=0,u=0,h=[];do{if(n.next_out_index=0,n.avail_out=i,a=n.deflate(4),a!=1&&a!=0)throw new Error("deflating: "+n.msg);i-n.avail_out>0&&h.push(r.slice(0,n.next_out_index)),u+=n.next_out_index}while(n.avail_in>0||n.avail_out===0);return n.deflateEnd(),c=new Uint8Array(u),h.forEach(function(p){c.set(p,d),d+=p.length}),c}}function net(e){return e+5*(Math.floor(e/16383)+1)}var lmi=T(S(),1);var Od=[0,1,3,7,15,31,63,127,255,511,1023,2047,4095,8191,16383,32767,65535],Yfe=1440,iet=0,oet=4,ret=9,set=5,aet=[96,7,256,0,8,80,0,8,16,84,8,115,82,7,31,0,8,112,0,8,48,0,9,192,80,7,10,0,8,96,0,8,32,0,9,160,0,8,0,0,8,128,0,8,64,0,9,224,80,7,6,0,8,88,0,8,24,0,9,144,83,7,59,0,8,120,0,8,56,0,9,208,81,7,17,0,8,104,0,8,40,0,9,176,0,8,8,0,8,136,0,8,72,0,9,240,80,7,4,0,8,84,0,8,20,85,8,227,83,7,43,0,8,116,0,8,52,0,9,200,81,7,13,0,8,100,0,8,36,0,9,168,0,8,4,0,8,132,0,8,68,0,9,232,80,7,8,0,8,92,0,8,28,0,9,152,84,7,83,0,8,124,0,8,60,0,9,216,82,7,23,0,8,108,0,8,44,0,9,184,0,8,12,0,8,140,0,8,76,0,9,248,80,7,3,0,8,82,0,8,18,85,8,163,83,7,35,0,8,114,0,8,50,0,9,196,81,7,11,0,8,98,0,8,34,0,9,164,0,8,2,0,8,130,0,8,66,0,9,228,80,7,7,0,8,90,0,8,26,0,9,148,84,7,67,0,8,122,0,8,58,0,9,212,82,7,19,0,8,106,0,8,42,0,9,180,0,8,10,0,8,138,0,8,74,0,9,244,80,7,5,0,8,86,0,8,22,192,8,0,83,7,51,0,8,118,0,8,54,0,9,204,81,7,15,0,8,102,0,8,38,0,9,172,0,8,6,0,8,134,0,8,70,0,9,236,80,7,9,0,8,94,0,8,30,0,9,156,84,7,99,0,8,126,0,8,62,0,9,220,82,7,27,0,8,110,0,8,46,0,9,188,0,8,14,0,8,142,0,8,78,0,9,252,96,7,256,0,8,81,0,8,17,85,8,131,82,7,31,0,8,113,0,8,49,0,9,194,80,7,10,0,8,97,0,8,33,0,9,162,0,8,1,0,8,129,0,8,65,0,9,226,80,7,6,0,8,89,0,8,25,0,9,146,83,7,59,0,8,121,0,8,57,0,9,210,81,7,17,0,8,105,0,8,41,0,9,178,0,8,9,0,8,137,0,8,73,0,9,242,80,7,4,0,8,85,0,8,21,80,8,258,83,7,43,0,8,117,0,8,53,0,9,202,81,7,13,0,8,101,0,8,37,0,9,170,0,8,5,0,8,133,0,8,69,0,9,234,80,7,8,0,8,93,0,8,29,0,9,154,84,7,83,0,8,125,0,8,61,0,9,218,82,7,23,0,8,109,0,8,45,0,9,186,0,8,13,0,8,141,0,8,77,0,9,250,80,7,3,0,8,83,0,8,19,85,8,195,83,7,35,0,8,115,0,8,51,0,9,198,81,7,11,0,8,99,0,8,35,0,9,166,0,8,3,0,8,131,0,8,67,0,9,230,80,7,7,0,8,91,0,8,27,0,9,150,84,7,67,0,8,123,0,8,59,0,9,214,82,7,19,0,8,107,0,8,43,0,9,182,0,8,11,0,8,139,0,8,75,0,9,246,80,7,5,0,8,87,0,8,23,192,8,0,83,7,51,0,8,119,0,8,55,0,9,206,81,7,15,0,8,103,0,8,39,0,9,174,0,8,7,0,8,135,0,8,71,0,9,238,80,7,9,0,8,95,0,8,31,0,9,158,84,7,99,0,8,127,0,8,63,0,9,222,82,7,27,0,8,111,0,8,47,0,9,190,0,8,15,0,8,143,0,8,79,0,9,254,96,7,256,0,8,80,0,8,16,84,8,115,82,7,31,0,8,112,0,8,48,0,9,193,80,7,10,0,8,96,0,8,32,0,9,161,0,8,0,0,8,128,0,8,64,0,9,225,80,7,6,0,8,88,0,8,24,0,9,145,83,7,59,0,8,120,0,8,56,0,9,209,81,7,17,0,8,104,0,8,40,0,9,177,0,8,8,0,8,136,0,8,72,0,9,241,80,7,4,0,8,84,0,8,20,85,8,227,83,7,43,0,8,116,0,8,52,0,9,201,81,7,13,0,8,100,0,8,36,0,9,169,0,8,4,0,8,132,0,8,68,0,9,233,80,7,8,0,8,92,0,8,28,0,9,153,84,7,83,0,8,124,0,8,60,0,9,217,82,7,23,0,8,108,0,8,44,0,9,185,0,8,12,0,8,140,0,8,76,0,9,249,80,7,3,0,8,82,0,8,18,85,8,163,83,7,35,0,8,114,0,8,50,0,9,197,81,7,11,0,8,98,0,8,34,0,9,165,0,8,2,0,8,130,0,8,66,0,9,229,80,7,7,0,8,90,0,8,26,0,9,149,84,7,67,0,8,122,0,8,58,0,9,213,82,7,19,0,8,106,0,8,42,0,9,181,0,8,10,0,8,138,0,8,74,0,9,245,80,7,5,0,8,86,0,8,22,192,8,0,83,7,51,0,8,118,0,8,54,0,9,205,81,7,15,0,8,102,0,8,38,0,9,173,0,8,6,0,8,134,0,8,70,0,9,237,80,7,9,0,8,94,0,8,30,0,9,157,84,7,99,0,8,126,0,8,62,0,9,221,82,7,27,0,8,110,0,8,46,0,9,189,0,8,14,0,8,142,0,8,78,0,9,253,96,7,256,0,8,81,0,8,17,85,8,131,82,7,31,0,8,113,0,8,49,0,9,195,80,7,10,0,8,97,0,8,33,0,9,163,0,8,1,0,8,129,0,8,65,0,9,227,80,7,6,0,8,89,0,8,25,0,9,147,83,7,59,0,8,121,0,8,57,0,9,211,81,7,17,0,8,105,0,8,41,0,9,179,0,8,9,0,8,137,0,8,73,0,9,243,80,7,4,0,8,85,0,8,21,80,8,258,83,7,43,0,8,117,0,8,53,0,9,203,81,7,13,0,8,101,0,8,37,0,9,171,0,8,5,0,8,133,0,8,69,0,9,235,80,7,8,0,8,93,0,8,29,0,9,155,84,7,83,0,8,125,0,8,61,0,9,219,82,7,23,0,8,109,0,8,45,0,9,187,0,8,13,0,8,141,0,8,77,0,9,251,80,7,3,0,8,83,0,8,19,85,8,195,83,7,35,0,8,115,0,8,51,0,9,199,81,7,11,0,8,99,0,8,35,0,9,167,0,8,3,0,8,131,0,8,67,0,9,231,80,7,7,0,8,91,0,8,27,0,9,151,84,7,67,0,8,123,0,8,59,0,9,215,82,7,19,0,8,107,0,8,43,0,9,183,0,8,11,0,8,139,0,8,75,0,9,247,80,7,5,0,8,87,0,8,23,192,8,0,83,7,51,0,8,119,0,8,55,0,9,207,81,7,15,0,8,103,0,8,39,0,9,175,0,8,7,0,8,135,0,8,71,0,9,239,80,7,9,0,8,95,0,8,31,0,9,159,84,7,99,0,8,127,0,8,63,0,9,223,82,7,27,0,8,111,0,8,47,0,9,191,0,8,15,0,8,143,0,8,79,0,9,255],cet=[80,5,1,87,5,257,83,5,17,91,5,4097,81,5,5,89,5,1025,85,5,65,93,5,16385,80,5,3,88,5,513,84,5,33,92,5,8193,82,5,9,90,5,2049,86,5,129,192,5,24577,80,5,2,87,5,385,83,5,25,91,5,6145,81,5,7,89,5,1537,85,5,97,93,5,24577,80,5,4,88,5,769,84,5,49,92,5,12289,82,5,13,90,5,3073,86,5,193,192,5,24577],det=[3,4,5,6,7,8,9,10,11,13,15,17,19,23,27,31,35,43,51,59,67,83,99,115,131,163,195,227,258,0,0],uet=[0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0,112,112],met=[1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193,257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577],het=[0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13],fy=15;function tQ(){let e=this,t,n,i,o,r,s;function a(d,u,h,p,g,f,x,_,C,V,L){let R,G,I,v,P,w,A,b,Z,E,X,F,N,O,U;E=0,P=h;do i[d[u+E]]++,E++,P--;while(P!==0);if(i[0]==h)return x[0]=-1,_[0]=0,0;for(b=_[0],w=1;w<=fy&&i[w]===0;w++);for(A=w,bP&&(b=P),_[0]=b,O=1<F+b;){if(v++,F+=b,U=I-F,U=U>b?b:U,(G=1<<(w=A-F))>R+1&&(G-=R+1,N=A,wYfe)return-3;r[v]=X=V[0],V[0]+=U,v!==0?(s[v]=P,o[0]=w,o[1]=b,w=P>>>F-b,o[2]=X-r[v-1]-w,C.set(o,(r[v-1]+w)*3)):x[0]=X}for(o[1]=A-F,E>=h?o[0]=192:L[E]>>F;w>>=1)P^=w;for(P^=w,Z=(1<257?(V==-3?C.msg="oversubscribed distance tree":V==-5?(C.msg="incomplete distance tree",V=-3):V!=-4&&(C.msg="empty distance tree with lengths",V=-3),V):0)}}tQ.inflate_trees_fixed=function(e,t,n,i){return e[0]=ret,t[0]=set,n[0]=aet,i[0]=cet,0};var VU=0,Rfe=1,Zfe=2,Gfe=3,Efe=4,Ife=5,Xfe=6,qJ=7,Wfe=8,LU=9;function fet(){let e=this,t,n=0,i,o=0,r=0,s=0,a=0,c=0,d=0,u=0,h,p=0,g,f=0;function x(_,C,V,L,R,G,I,v){let P,w,A,b,Z,E,X,F,N,O,U,Y,k,H,K,te;X=v.next_in_index,F=v.avail_in,Z=I.bitb,E=I.bitk,N=I.write,O=N>=w[te+1],E-=w[te+1],I.win[N++]=w[te+2],O--;continue}do{if(Z>>=w[te+1],E-=w[te+1],(b&16)!==0){for(b&=15,k=w[te+2]+(Z&Od[b]),Z>>=b,E-=b;E<15;)F--,Z|=(v.read_byte(X++)&255)<>=w[te+1],E-=w[te+1],(b&16)!==0){for(b&=15;E>=b,E-=b,O-=k,N>=H)K=N-H,N-K>0&&2>N-K?(I.win[N++]=I.win[K++],I.win[N++]=I.win[K++],k-=2):(I.win.set(I.win.subarray(K,K+2),N),N+=2,K+=2,k-=2);else{K=N-H;do K+=I.end;while(K<0);if(b=I.end-K,k>b){if(k-=b,N-K>0&&b>N-K)do I.win[N++]=I.win[K++];while(--b!==0);else I.win.set(I.win.subarray(K,K+b),N),N+=b,K+=b,b=0;K=0}}if(N-K>0&&k>N-K)do I.win[N++]=I.win[K++];while(--k!==0);else I.win.set(I.win.subarray(K,K+k),N),N+=k,K+=k,k=0;break}else if((b&64)===0)P+=w[te+2],P+=Z&Od[b],te=(A+P)*3,b=w[te];else return v.msg="invalid distance code",k=v.avail_in-F,k=E>>3>3:k,F+=k,X-=k,E-=k<<3,I.bitb=Z,I.bitk=E,v.avail_in=F,v.total_in+=X-v.next_in_index,v.next_in_index=X,I.write=N,-3;while(!0);break}if((b&64)===0){if(P+=w[te+2],P+=Z&Od[b],te=(A+P)*3,(b=w[te])===0){Z>>=w[te+1],E-=w[te+1],I.win[N++]=w[te+2],O--;break}}else return(b&32)!==0?(k=v.avail_in-F,k=E>>3>3:k,F+=k,X-=k,E-=k<<3,I.bitb=Z,I.bitk=E,v.avail_in=F,v.total_in+=X-v.next_in_index,v.next_in_index=X,I.write=N,1):(v.msg="invalid literal/length code",k=v.avail_in-F,k=E>>3>3:k,F+=k,X-=k,E-=k<<3,I.bitb=Z,I.bitk=E,v.avail_in=F,v.total_in+=X-v.next_in_index,v.next_in_index=X,I.write=N,-3)}while(!0)}while(O>=258&&F>=10);return k=v.avail_in-F,k=E>>3>3:k,F+=k,X-=k,E-=k<<3,I.bitb=Z,I.bitk=E,v.avail_in=F,v.total_in+=X-v.next_in_index,v.next_in_index=X,I.write=N,0}e.init=function(_,C,V,L,R,G){t=VU,d=_,u=C,h=V,p=L,g=R,f=G,i=null},e.proc=function(_,C,V){let L,R,G,I=0,v=0,P=0,w,A,b,Z;for(P=C.next_in_index,w=C.avail_in,I=_.bitb,v=_.bitk,A=_.write,b=A<_.read?_.read-A-1:_.end-A;;)switch(t){case VU:if(b>=258&&w>=10&&(_.bitb=I,_.bitk=v,C.avail_in=w,C.total_in+=P-C.next_in_index,C.next_in_index=P,_.write=A,V=x(d,u,h,p,g,f,_,C),P=C.next_in_index,w=C.avail_in,I=_.bitb,v=_.bitk,A=_.write,b=A<_.read?_.read-A-1:_.end-A,V!=0)){t=V==1?qJ:LU;break}r=d,i=h,o=p,t=Rfe;case Rfe:for(L=r;v>>=i[R+1],v-=i[R+1],G=i[R],G===0){s=i[R+2],t=Xfe;break}if((G&16)!==0){a=G&15,n=i[R+2],t=Zfe;break}if((G&64)===0){r=G,o=R/3+i[R+2];break}if((G&32)!==0){t=qJ;break}return t=LU,C.msg="invalid literal/length code",V=-3,_.bitb=I,_.bitk=v,C.avail_in=w,C.total_in+=P-C.next_in_index,C.next_in_index=P,_.write=A,_.inflate_flush(C,V);case Zfe:for(L=a;v>=L,v-=L,r=u,i=g,o=f,t=Gfe;case Gfe:for(L=r;v>=i[R+1],v-=i[R+1],G=i[R],(G&16)!==0){a=G&15,c=i[R+2],t=Efe;break}if((G&64)===0){r=G,o=R/3+i[R+2];break}return t=LU,C.msg="invalid distance code",V=-3,_.bitb=I,_.bitk=v,C.avail_in=w,C.total_in+=P-C.next_in_index,C.next_in_index=P,_.write=A,_.inflate_flush(C,V);case Efe:for(L=a;v>=L,v-=L,t=Ife;case Ife:for(Z=A-c;Z<0;)Z+=_.end;for(;n!==0;){if(b===0&&(A==_.end&&_.read!==0&&(A=0,b=A<_.read?_.read-A-1:_.end-A),b===0&&(_.write=A,V=_.inflate_flush(C,V),A=_.write,b=A<_.read?_.read-A-1:_.end-A,A==_.end&&_.read!==0&&(A=0,b=A<_.read?_.read-A-1:_.end-A),b===0)))return _.bitb=I,_.bitk=v,C.avail_in=w,C.total_in+=P-C.next_in_index,C.next_in_index=P,_.write=A,_.inflate_flush(C,V);_.win[A++]=_.win[Z++],b--,Z==_.end&&(Z=0),n--}t=VU;break;case Xfe:if(b===0&&(A==_.end&&_.read!==0&&(A=0,b=A<_.read?_.read-A-1:_.end-A),b===0&&(_.write=A,V=_.inflate_flush(C,V),A=_.write,b=A<_.read?_.read-A-1:_.end-A,A==_.end&&_.read!==0&&(A=0,b=A<_.read?_.read-A-1:_.end-A),b===0)))return _.bitb=I,_.bitk=v,C.avail_in=w,C.total_in+=P-C.next_in_index,C.next_in_index=P,_.write=A,_.inflate_flush(C,V);V=0,_.win[A++]=s,b--,t=VU;break;case qJ:if(v>7&&(v-=8,w++,P--),_.write=A,V=_.inflate_flush(C,V),A=_.write,b=A<_.read?_.read-A-1:_.end-A,_.read!=_.write)return _.bitb=I,_.bitk=v,C.avail_in=w,C.total_in+=P-C.next_in_index,C.next_in_index=P,_.write=A,_.inflate_flush(C,V);t=Wfe;case Wfe:return V=1,_.bitb=I,_.bitk=v,C.avail_in=w,C.total_in+=P-C.next_in_index,C.next_in_index=P,_.write=A,_.inflate_flush(C,V);case LU:return V=-3,_.bitb=I,_.bitk=v,C.avail_in=w,C.total_in+=P-C.next_in_index,C.next_in_index=P,_.write=A,_.inflate_flush(C,V);default:return V=-2,_.bitb=I,_.bitk=v,C.avail_in=w,C.total_in+=P-C.next_in_index,C.next_in_index=P,_.write=A,_.inflate_flush(C,V)}},e.free=function(){}}var Pfe=[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15],PV=0,$J=1,vfe=2,wfe=3,Ffe=4,Afe=5,RU=6,ZU=7,Mfe=8,XT=9;function pet(e,t){let n=this,i=PV,o=0,r=0,s=0,a,c=[0],d=[0],u=new fet,h=0,p=new Int32Array(Yfe*3),g=0,f=new tQ;n.bitk=0,n.bitb=0,n.win=new Uint8Array(t),n.end=t,n.read=0,n.write=0,n.reset=function(x,_){_&&(_[0]=g),i==RU&&u.free(x),i=PV,n.bitk=0,n.bitb=0,n.read=n.write=0},n.reset(e,null),n.inflate_flush=function(x,_){let C,V,L;return V=x.next_out_index,L=n.read,C=(L<=n.write?n.write:n.end)-L,C>x.avail_out&&(C=x.avail_out),C!==0&&_==-5&&(_=0),x.avail_out-=C,x.total_out+=C,x.next_out.set(n.win.subarray(L,L+C),V),V+=C,L+=C,L==n.end&&(L=0,n.write==n.end&&(n.write=0),C=n.write-L,C>x.avail_out&&(C=x.avail_out),C!==0&&_==-5&&(_=0),x.avail_out-=C,x.total_out+=C,x.next_out.set(n.win.subarray(L,L+C),V),V+=C,L+=C),x.next_out_index=V,n.read=L,_},n.proc=function(x,_){let C,V,L,R,G,I,v,P;for(R=x.next_in_index,G=x.avail_in,V=n.bitb,L=n.bitk,I=n.write,v=I>>1){case 0:V>>>=3,L-=3,C=L&7,V>>>=C,L-=C,i=$J;break;case 1:w=[],A=[],b=[[]],Z=[[]],tQ.inflate_trees_fixed(w,A,b,Z),u.init(w[0],A[0],b[0],0,Z[0],0),V>>>=3,L-=3,i=RU;break;case 2:V>>>=3,L-=3,i=wfe;break;case 3:return V>>>=3,L-=3,i=XT,x.msg="invalid block type",_=-3,n.bitb=V,n.bitk=L,x.avail_in=G,x.total_in+=R-x.next_in_index,x.next_in_index=R,n.write=I,n.inflate_flush(x,_)}break;case $J:for(;L<32;){if(G!==0)_=0;else return n.bitb=V,n.bitk=L,x.avail_in=G,x.total_in+=R-x.next_in_index,x.next_in_index=R,n.write=I,n.inflate_flush(x,_);G--,V|=(x.read_byte(R++)&255)<>>16&65535)!=(V&65535))return i=XT,x.msg="invalid stored block lengths",_=-3,n.bitb=V,n.bitk=L,x.avail_in=G,x.total_in+=R-x.next_in_index,x.next_in_index=R,n.write=I,n.inflate_flush(x,_);o=V&65535,V=L=0,i=o!==0?vfe:h!==0?ZU:PV;break;case vfe:if(G===0||v===0&&(I==n.end&&n.read!==0&&(I=0,v=IG&&(C=G),C>v&&(C=v),n.win.set(x.read_buf(R,C),I),R+=C,G-=C,I+=C,v-=C,(o-=C)!==0)break;i=h!==0?ZU:PV;break;case wfe:for(;L<14;){if(G!==0)_=0;else return n.bitb=V,n.bitk=L,x.avail_in=G,x.total_in+=R-x.next_in_index,x.next_in_index=R,n.write=I,n.inflate_flush(x,_);G--,V|=(x.read_byte(R++)&255)<29||(C>>5&31)>29)return i=XT,x.msg="too many length or distance symbols",_=-3,n.bitb=V,n.bitk=L,x.avail_in=G,x.total_in+=R-x.next_in_index,x.next_in_index=R,n.write=I,n.inflate_flush(x,_);if(C=258+(C&31)+(C>>5&31),!a||a.length>>=14,L-=14,s=0,i=Ffe;case Ffe:for(;s<4+(r>>>10);){for(;L<3;){if(G!==0)_=0;else return n.bitb=V,n.bitk=L,x.avail_in=G,x.total_in+=R-x.next_in_index,x.next_in_index=R,n.write=I,n.inflate_flush(x,_);G--,V|=(x.read_byte(R++)&255)<>>=3,L-=3}for(;s<19;)a[Pfe[s++]]=0;if(c[0]=7,C=f.inflate_trees_bits(a,c,d,p,x),C!=0)return _=C,_==-3&&(a=null,i=XT),n.bitb=V,n.bitk=L,x.avail_in=G,x.total_in+=R-x.next_in_index,x.next_in_index=R,n.write=I,n.inflate_flush(x,_);s=0,i=Afe;case Afe:for(;C=r,!(s>=258+(C&31)+(C>>5&31));){let O,U;for(C=c[0];L>>=C,L-=C,a[s++]=U;else{for(P=U==18?7:U-14,O=U==18?11:3;L>>=C,L-=C,O+=V&Od[P],V>>>=P,L-=P,P=s,C=r,P+O>258+(C&31)+(C>>5&31)||U==16&&P<1)return a=null,i=XT,x.msg="invalid bit length repeat",_=-3,n.bitb=V,n.bitk=L,x.avail_in=G,x.total_in+=R-x.next_in_index,x.next_in_index=R,n.write=I,n.inflate_flush(x,_);U=U==16?a[P-1]:0;do a[P++]=U;while(--O!==0);s=P}}if(d[0]=-1,E=[],X=[],F=[],N=[],E[0]=9,X[0]=6,C=r,C=f.inflate_trees_dynamic(257+(C&31),1+(C>>5&31),a,E,X,F,N,p,x),C!=0)return C==-3&&(a=null,i=XT),_=C,n.bitb=V,n.bitk=L,x.avail_in=G,x.total_in+=R-x.next_in_index,x.next_in_index=R,n.write=I,n.inflate_flush(x,_);u.init(E[0],X[0],p,F[0],p,N[0]),i=RU;case RU:if(n.bitb=V,n.bitk=L,x.avail_in=G,x.total_in+=R-x.next_in_index,x.next_in_index=R,n.write=I,(_=u.proc(n,x,_))!=1)return n.inflate_flush(x,_);if(_=0,u.free(x),R=x.next_in_index,G=x.avail_in,V=n.bitb,L=n.bitk,I=n.write,v=I15?(e.inflateEnd(n),-2):(e.wbits=i,n.istate.blocks=new pet(n,1<>4)+8>s.wbits){s.mode=py,n.msg="invalid win size",s.marker=5;break}s.mode=Nfe;case Nfe:if(n.avail_in===0)return o;if(o=i,n.avail_in--,n.total_in++,r=n.read_byte(n.next_in_index++)&255,((s.method<<8)+r)%31!==0){s.mode=py,n.msg="incorrect header check",s.marker=5;break}if((r&bet)===0){s.mode=Qv;break}s.mode=kfe;case kfe:if(n.avail_in===0)return o;o=i,n.avail_in--,n.total_in++,s.need=(n.read_byte(n.next_in_index++)&255)<<24&4278190080,s.mode=Ufe;case Ufe:if(n.avail_in===0)return o;o=i,n.avail_in--,n.total_in++,s.need+=(n.read_byte(n.next_in_index++)&255)<<16&16711680,s.mode=Dfe;case Dfe:if(n.avail_in===0)return o;o=i,n.avail_in--,n.total_in++,s.need+=(n.read_byte(n.next_in_index++)&255)<<8&65280,s.mode=Bfe;case Bfe:return n.avail_in===0?o:(o=i,n.avail_in--,n.total_in++,s.need+=n.read_byte(n.next_in_index++)&255,s.mode=eQ,2);case eQ:return s.mode=py,n.msg="need dictionary",s.marker=0,-2;case Qv:if(o=s.blocks.proc(n,o),o==-3){s.mode=py,s.marker=0;break}if(o==0&&(o=i),o!=1)return o;o=i,s.blocks.reset(n,s.was),s.mode=Ofe;case Ofe:return n.avail_in=0,1;case py:return-3;default:return-2}},e.inflateSetDictionary=function(n,i,o){let r=0,s=o;if(!n||!n.istate||n.istate.mode!=eQ)return-2;let a=n.istate;return s>=1<0&&n.next_in_index!=p&&(c(n.next_in_index),p=n.next_in_index)}while(n.avail_in>0||n.avail_out===0);return d.length>1?(h=new Uint8Array(f),d.forEach(function(x){h.set(x,g),g+=x.length})):h=d[0]?new Uint8Array(d[0]):new Uint8Array,h}},t.flush=function(){n.inflateEnd()}}var ymi=T(S(),1);var umi=T(S(),1);var WT="/",nQ=new Date(2107,11,31),iQ=new Date(1980,0,1),Zi=void 0,Yd="undefined",a0="function";var hmi=T(S(),1);var jv=class{constructor(t){return class extends TransformStream{constructor(n,i){let o=new t(i);super({transform(r,s){s.enqueue(o.append(r))},flush(r){let s=o.flush();s&&r.enqueue(s)}})}}}};var Tet=64,Kfe=2;try{typeof navigator!=Yd&&navigator.hardwareConcurrency&&(Kfe=navigator.hardwareConcurrency)}catch{}var Cet={chunkSize:512*1024,maxWorkers:Kfe,terminateWorkerTimeout:5e3,useWebWorkers:!0,useCompressionStream:!0,workerScripts:Zi,CompressionStreamNative:typeof CompressionStream!=Yd&&CompressionStream,DecompressionStreamNative:typeof DecompressionStream!=Yd&&DecompressionStream},gy=Object.assign({},Cet);function qv(){return gy}function GU(e){return Math.max(e.chunkSize,Tet)}function vV(e){let{baseURL:t,chunkSize:n,maxWorkers:i,terminateWorkerTimeout:o,useCompressionStream:r,useWebWorkers:s,Deflate:a,Inflate:c,CompressionStream:d,DecompressionStream:u,workerScripts:h}=e;if(by("baseURL",t),by("chunkSize",n),by("maxWorkers",i),by("terminateWorkerTimeout",o),by("useCompressionStream",r),by("useWebWorkers",s),a&&(gy.CompressionStream=new jv(a)),c&&(gy.DecompressionStream=new jv(c)),by("CompressionStream",d),by("DecompressionStream",u),h!==Zi){let{deflate:p,inflate:g}=h;if((p||g)&&(gy.workerScripts||(gy.workerScripts={})),p){if(!Array.isArray(p))throw new Error("workerScripts.deflate must be an array");gy.workerScripts.deflate=p}if(g){if(!Array.isArray(g))throw new Error("workerScripts.inflate must be an array");gy.workerScripts.inflate=g}}}function by(e,t){t!==Zi&&(gy[e]=t)}var _mi=T(S(),1);var mhi=T(S(),1);var ihi=T(S(),1);var ehi=T(S(),1);var Lmi=T(S(),1);var Smi=T(S(),1),Jfe=[];for(let e=0;e<256;e++){let t=e;for(let n=0;n<8;n++)t&1?t=t>>>1^3988292384:t=t>>>1;Jfe[e]=t}var c0=class{constructor(t){this.crc=t||-1}append(t){let n=this.crc|0;for(let i=0,o=t.length|0;i>>8^Jfe[(n^t[i])&255];this.crc=n}get(){return~this.crc}};var $v=class extends TransformStream{constructor(){let t,n=new c0;super({transform(i,o){n.append(i),o.enqueue(i)},flush(){let i=new Uint8Array(4);new DataView(i.buffer).setUint32(0,n.get()),t.value=i}}),t=this}};var Omi=T(S(),1);var Gmi=T(S(),1);function wV(e){if(typeof TextEncoder==Yd){e=unescape(encodeURIComponent(e));let t=new Uint8Array(e.length);for(let n=0;n0&&t&&(e[n-1]=ml.partial(t,e[n-1]&2147483648>>t-1,1)),e},partial(e,t,n){return e===32?t:(n?t|0:t<<32-e)+e*1099511627776},getPartial(e){return Math.round(e/1099511627776)||32},_shiftRight(e,t,n,i){for(i===void 0&&(i=[]);t>=32;t-=32)i.push(n),n=0;if(t===0)return i.concat(e);for(let s=0;s>>t),n=e[s]<<32-t;let o=e.length?e[e.length-1]:0,r=ml.getPartial(o);return i.push(ml.partial(t+r&31,t+r>32?n:i.pop(),1)),i}},ew={bytes:{fromBits(e){let n=ml.bitLength(e)/8,i=new Uint8Array(n),o;for(let r=0;r>>24,o<<=8;return i},toBits(e){let t=[],n,i=0;for(n=0;n9007199254740991)throw new Error("Cannot hash more than 2^53 - 1 bits");let r=new Uint32Array(n),s=0;for(let a=t.blockSize+i-(t.blockSize+i&t.blockSize-1);a<=o;a+=t.blockSize)t._block(r.subarray(16*s,16*(s+1))),s+=1;return n.splice(0,16*s),t}finalize(){let e=this,t=e._buffer,n=e._h;t=ml.concat(t,[ml.partial(1,1)]);for(let i=t.length+2;i&15;i++)t.push(0);for(t.push(Math.floor(e._length/4294967296)),t.push(e._length|0);t.length;)e._block(t.splice(0,16));return e.reset(),n}_f(e,t,n,i){if(e<=19)return t&n|~t&i;if(e<=39)return t^n^i;if(e<=59)return t&n|t&i|n&i;if(e<=79)return t^n^i}_S(e,t){return t<>>32-e}_block(e){let t=this,n=t._h,i=Array(80);for(let d=0;d<16;d++)i[d]=e[d];let o=n[0],r=n[1],s=n[2],a=n[3],c=n[4];for(let d=0;d<=79;d++){d>=16&&(i[d]=t._S(1,i[d-3]^i[d-8]^i[d-14]^i[d-16]));let u=t._S(5,o)+t._f(d,r,s,a)+c+i[d]+t._key[Math.floor(d/20)]|0;c=a,a=s,s=t._S(30,r),r=o,o=u}n[0]=n[0]+o|0,n[1]=n[1]+r|0,n[2]=n[2]+s|0,n[3]=n[3]+a|0,n[4]=n[4]+c|0}};var oQ={};oQ.aes=class{constructor(e){let t=this;t._tables=[[[],[],[],[],[]],[[],[],[],[],[]]],t._tables[0][0][0]||t._precompute();let n=t._tables[0][4],i=t._tables[1],o=e.length,r,s,a,c=1;if(o!==4&&o!==6&&o!==8)throw new Error("invalid aes key size");for(t._key=[s=e.slice(0),a=[]],r=o;r<4*o+28;r++){let d=s[r-1];(r%o===0||o===8&&r%o===4)&&(d=n[d>>>24]<<24^n[d>>16&255]<<16^n[d>>8&255]<<8^n[d&255],r%o===0&&(d=d<<8^d>>>24^c<<24,c=c<<1^(c>>7)*283)),s[r]=s[r-o]^d}for(let d=0;r;d++,r--){let u=s[d&3?r:r-4];r<=4||d<4?a[d]=u:a[d]=i[0][n[u>>>24]]^i[1][n[u>>16&255]]^i[2][n[u>>8&255]]^i[3][n[u&255]]}}encrypt(e){return this._crypt(e,0)}decrypt(e){return this._crypt(e,1)}_precompute(){let e=this._tables[0],t=this._tables[1],n=e[4],i=t[4],o=[],r=[],s,a,c,d;for(let u=0;u<256;u++)r[(o[u]=u<<1^(u>>7)*283)^u]=u;for(let u=s=0;!n[u];u^=a||1,s=r[s]||1){let h=s^s<<1^s<<2^s<<3^s<<4;h=h>>8^h&255^99,n[u]=h,i[h]=u,d=o[c=o[a=o[u]]];let p=d*16843009^c*65537^a*257^u*16843008,g=o[h]*257^h*16843008;for(let f=0;f<4;f++)e[f][u]=g=g<<24^g>>>8,t[f][h]=p=p<<24^p>>>8}for(let u=0;u<5;u++)e[u]=e[u].slice(0),t[u]=t[u].slice(0)}_crypt(e,t){if(e.length!==4)throw new Error("invalid aes block size");let n=this._key[t],i=n.length/4-2,o=[0,0,0,0],r=this._tables[t],s=r[0],a=r[1],c=r[2],d=r[3],u=r[4],h=e[0]^n[0],p=e[t?3:1]^n[1],g=e[2]^n[2],f=e[t?1:3]^n[3],x=4,_,C,V;for(let L=0;L>>24]^a[p>>16&255]^c[g>>8&255]^d[f&255]^n[x],C=s[p>>>24]^a[g>>16&255]^c[f>>8&255]^d[h&255]^n[x+1],V=s[g>>>24]^a[f>>16&255]^c[h>>8&255]^d[p&255]^n[x+2],f=s[f>>>24]^a[h>>16&255]^c[p>>8&255]^d[g&255]^n[x+3],x+=4,h=_,p=C,g=V;for(let L=0;L<4;L++)o[t?3&-L:L]=u[h>>>24]<<24^u[p>>16&255]<<16^u[g>>8&255]<<8^u[f&255]^n[x++],_=h,h=p,p=g,g=f,f=_;return o}};var jfe={getRandomValues(e){let t=new Uint32Array(e.buffer),n=i=>{let o=987654321,r=4294967295;return function(){return o=36969*(o&65535)+(o>>16)&r,i=18e3*(i&65535)+(i>>16)&r,(((o<<16)+i&r)/4294967296+.5)*(Math.random()>.5?1:-1)}};for(let i=0,o;i>24&255)===255){let t=e>>16&255,n=e>>8&255,i=e&255;t===255?(t=0,n===255?(n=0,i===255?i=0:++i):++n):++t,e=0,e+=t<<16,e+=n<<8,e+=i}else e+=1<<24;return e}incCounter(e){(e[0]=this.incWord(e[0]))===0&&(e[1]=this.incWord(e[1]))}calculate(e,t,n){let i;if(!(i=t.length))return[];let o=ml.bitLength(t);for(let r=0;r>5)+1<<2,r,s,a,c,d,u=new ArrayBuffer(o),h=new DataView(u),p=0,g=ml;for(t=ew.bytes.toBits(t),d=1;p<(o||1);d++){for(r=s=e.encrypt(g.concat(t,[d])),a=1;ao&&(e=new n().update(e).finalize());for(let r=0;rthis.resolveReady=s),password:ope(t,n),signed:i,strength:o-1,pending:new Uint8Array})},async transform(s,a){let c=this,{password:d,strength:u,resolveReady:h,ready:p}=c;d?(await vet(c,u,d,am(s,0,nw[u]+2)),s=am(s,nw[u]+2),r?a.error(new Error(l0)):h()):await p;let g=new Uint8Array(s.length-_y-(s.length-_y)%FV);a.enqueue(npe(c,s,g,0,_y,!0))},async flush(s){let{signed:a,ctr:c,hmac:d,pending:u,ready:h}=this;if(d&&c){await h;let p=am(u,0,u.length-_y),g=am(u,u.length-_y),f=new Uint8Array;if(p.length){let x=ow(Yf,p);d.update(x);let _=c.update(x);f=iw(Yf,_)}if(a){let x=am(iw(Yf,d.digest()),0,_y);for(let _=0;_<_y;_++)if(x[_]!=g[_])throw new Error(PT)}s.enqueue(f)}}})}},XU=class extends TransformStream{constructor({password:t,rawPassword:n,encryptionStrength:i}){let o;super({start(){Object.assign(this,{ready:new Promise(r=>this.resolveReady=r),password:ope(t,n),strength:i-1,pending:new Uint8Array})},async transform(r,s){let a=this,{password:c,strength:d,resolveReady:u,ready:h}=a,p=new Uint8Array;c?(p=await wet(a,d,c),u()):await h;let g=new Uint8Array(p.length+r.length-r.length%FV);g.set(p,0),s.enqueue(npe(a,r,g,p.length,0))},async flush(r){let{ctr:s,hmac:a,pending:c,ready:d}=this;if(a&&s){await d;let u=new Uint8Array;if(c.length){let h=s.update(ow(Yf,c));a.update(h),u=iw(Yf,h)}o.signature=iw(Yf,a.digest()).slice(0,_y),r.enqueue(aQ(u,o.signature))}}}),o=this}};function npe(e,t,n,i,o,r){let{ctr:s,hmac:a,pending:c}=e,d=t.length-o;c.length&&(t=aQ(c,t),n=Met(n,d-d%FV));let u;for(u=0;u<=d-FV;u+=FV){let h=ow(Yf,am(t,u,u+FV));r&&a.update(h);let p=s.update(h);r||a.update(p),n.set(iw(Yf,p),u+i)}return e.pending=am(t,u),n}async function vet(e,t,n,i){let o=await ipe(e,t,n,am(i,0,nw[t])),r=am(i,nw[t]);if(o[0]!=r[0]||o[1]!=r[1])throw new Error(xy)}async function wet(e,t,n){let i=EU(new Uint8Array(nw[t])),o=await ipe(e,t,n,i);return aQ(i,o)}async function ipe(e,t,n,i){e.password=null;let o=await Fet(Let,n,Get,!1,Eet),r=await Aet(Object.assign({salt:i},sQ),o,8*(tw[t]*2+2)),s=new Uint8Array(r),a=ow(Yf,am(s,0,tw[t])),c=ow(Yf,am(s,tw[t],tw[t]*2)),d=am(s,tw[t]*2);return Object.assign(e,{keys:{key:a,authentication:c,passwordVerification:d},ctr:new Wet(new Xet(a),Array.from(Iet)),hmac:new Pet(c)}),d}async function Fet(e,t,n,i,o){if(qfe)try{return await rw.importKey(e,t,n,i,o)}catch{return qfe=!1,yy.importKey(t)}else return yy.importKey(t)}async function Aet(e,t,n){if($fe)try{return await rw.deriveBits(e,t,n)}catch{return $fe=!1,yy.pbkdf2(t,e.salt,sQ.iterations,n)}else return yy.pbkdf2(t,e.salt,sQ.iterations,n)}function ope(e,t){return t===Zi?wV(e):t}function aQ(e,t){let n=e;return e.length+t.length&&(n=new Uint8Array(e.length+t.length),n.set(e,0),n.set(t,e.length)),n}function Met(e,t){if(t&&t>e.length){let n=e;e=new Uint8Array(t),e.set(n,0)}return e}function am(e,t,n){return e.subarray(t,n)}function iw(e,t){return e.fromBits(t)}function ow(e,t){return e.toBits(t)}var Kmi=T(S(),1);var AV=12,PU=class extends TransformStream{constructor({password:t,passwordVerification:n,checkPasswordOnly:i}){super({start(){Object.assign(this,{password:t,passwordVerification:n}),cpe(this,t)},transform(o,r){let s=this;if(s.password){let a=rpe(s,o.subarray(0,AV));if(s.password=null,a[AV-1]!=s.passwordVerification)throw new Error(xy);o=o.subarray(AV)}i?r.error(new Error(l0)):r.enqueue(rpe(s,o))}})}},vU=class extends TransformStream{constructor({password:t,passwordVerification:n}){super({start(){Object.assign(this,{password:t,passwordVerification:n}),cpe(this,t)},transform(i,o){let r=this,s,a;if(r.password){r.password=null;let c=EU(new Uint8Array(AV));c[AV-1]=r.passwordVerification,s=new Uint8Array(i.length+c.length),s.set(spe(r,c),0),a=AV}else s=new Uint8Array(i.length),a=0;s.set(spe(r,i),a),o.enqueue(s)}})}};function rpe(e,t){let n=new Uint8Array(t.length);for(let i=0;i>>24]),o=~e.crcKey2.get(),e.keys=[n,i,o]}function lpe(e){let t=e.keys[2]|2;return dpe(Math.imul(t,t^1)>>>8)}function dpe(e){return e&255}function ape(e){return e&4294967295}var upe="deflate-raw",wU=class extends TransformStream{constructor(t,{chunkSize:n,CompressionStream:i,CompressionStreamNative:o}){super({});let{compressed:r,encrypted:s,useCompressionStream:a,zipCrypto:c,signed:d,level:u}=t,h=this,p,g,f=mpe(super.readable);(!s||c)&&d&&(p=new $v,f=Hf(f,p)),r&&(f=fpe(f,a,{level:u,chunkSize:n},o,i)),s&&(c?f=Hf(f,new vU(t)):(g=new XU(t),f=Hf(f,g))),hpe(h,f,()=>{let x;s&&!c&&(x=g.signature),(!s||c)&&d&&(x=new DataView(p.value.buffer).getUint32(0)),h.signature=x})}},FU=class extends TransformStream{constructor(t,{chunkSize:n,DecompressionStream:i,DecompressionStreamNative:o}){super({});let{zipCrypto:r,encrypted:s,signed:a,signature:c,compressed:d,useCompressionStream:u}=t,h,p,g=mpe(super.readable);s&&(r?g=Hf(g,new PU(t)):(p=new IU(t),g=Hf(g,p))),d&&(g=fpe(g,u,{chunkSize:n},o,i)),(!s||r)&&a&&(h=new $v,g=Hf(g,h)),hpe(this,g,()=>{if((!s||r)&&a){let f=new DataView(h.value.buffer);if(c!=f.getUint32(0,!1))throw new Error(PT)}})}};function mpe(e){return Hf(e,new TransformStream({transform(t,n){t&&t.length&&n.enqueue(t)}}))}function hpe(e,t,n){t=Hf(t,new TransformStream({flush:n})),Object.defineProperty(e,"readable",{get(){return t}})}function fpe(e,t,n,i,o){try{let r=t&&i?i:o;e=Hf(e,new r(upe,n))}catch{if(t)try{e=Hf(e,new o(upe,n))}catch{return e}else return e}return e}function Hf(e,t){return e.pipeThrough(t)}var ppe="message",bpe="start",gpe="pull",lQ="data",ype="ack",dQ="close",NU="deflate",kU="inflate";var AU=class extends TransformStream{constructor(t,n){super({});let i=this,{codecType:o}=t,r;o.startsWith(NU)?r=wU:o.startsWith(kU)&&(r=FU);let s=0,a=0,c=new r(t,n),d=super.readable,u=new TransformStream({transform(p,g){p&&p.length&&(a+=p.length,g.enqueue(p))},flush(){Object.assign(i,{inputSize:a})}}),h=new TransformStream({transform(p,g){p&&p.length&&(s+=p.length,g.enqueue(p))},flush(){let{signature:p}=c;Object.assign(i,{signature:p,outputSize:s,inputSize:a})}});Object.defineProperty(i,"readable",{get(){return d.pipeThrough(u).pipeThrough(c).pipeThrough(h)}})}},MU=class extends TransformStream{constructor(t){let n;super({transform:i,flush(o){n&&n.length&&o.enqueue(n)}});function i(o,r){if(n){let s=new Uint8Array(n.length+o.length);s.set(n),s.set(o,n.length),o=s,n=null}o.length>t?(r.enqueue(o.slice(0,t)),i(o.slice(t),r)):n=o}}};var ahi=T(S(),1);var Tpe=typeof Worker!=Yd;var MV=class{constructor(t,{readable:n,writable:i},{options:o,config:r,streamOptions:s,useWebWorkers:a,transferStreams:c,scripts:d},u){let{signal:h}=s;return Object.assign(t,{busy:!0,readable:n.pipeThrough(new MU(r.chunkSize)).pipeThrough(new mQ(n,s),{signal:h}),writable:i,options:Object.assign({},o),scripts:d,transferStreams:c,terminate(){return new Promise(p=>{let{worker:g,busy:f}=t;g?(f?t.resolveTerminated=p:(g.terminate(),p()),t.interface=null):p()})},onTaskFinished(){let{resolveTerminated:p}=t;p&&(t.resolveTerminated=null,t.terminated=!0,t.worker.terminate(),p()),t.busy=!1,u(t)}}),(a&&Tpe?Net:Spe)(t,r)}},mQ=class extends TransformStream{constructor(t,{onstart:n,onprogress:i,size:o,onend:r}){let s=0;super({async start(){n&&await uQ(n,o)},async transform(a,c){s+=a.length,i&&await uQ(i,s,o),c.enqueue(a)},async flush(){t.size=s,r&&await uQ(r,s)}})}};async function uQ(e,...t){try{await e(...t)}catch{}}function Spe(e,t){return{run:()=>ket(e,t)}}function Net(e,t){let{baseURL:n,chunkSize:i}=t;if(!e.interface){let o;try{o=Bet(e.scripts[0],n,e)}catch{return Tpe=!1,Spe(e,t)}Object.assign(e,{worker:o,interface:{run:()=>Uet(e,{chunkSize:i})}})}return e.interface}async function ket({options:e,readable:t,writable:n,onTaskFinished:i},o){try{let r=new AU(e,o);await t.pipeThrough(r).pipeTo(n,{preventClose:!0,preventAbort:!0});let{signature:s,inputSize:a,outputSize:c}=r;return{signature:s,inputSize:a,outputSize:c}}finally{i()}}async function Uet(e,t){let n,i,o=new Promise((p,g)=>{n=p,i=g});Object.assign(e,{reader:null,writer:null,resolveResult:n,rejectResult:i,result:o});let{readable:r,options:s,scripts:a}=e,{writable:c,closed:d}=Det(e.writable),u=UU({type:bpe,scripts:a.slice(1),options:s,config:t,readable:r,writable:c},e);u||Object.assign(e,{reader:r.getReader(),writer:c.getWriter()});let h=await o;return u||await c.getWriter().close(),await d,h}function Det(e){let t,n=new Promise(o=>t=o);return{writable:new WritableStream({async write(o){let r=e.getWriter();await r.ready,await r.write(o),r.releaseLock()},close(){t()},abort(o){return e.getWriter().abort(o)}}),closed:n}}var xpe=!0,_pe=!0;function Bet(e,t,n){let i={type:"module"},o,r;typeof e==a0&&(e=e());try{o=new URL(e,t)}catch{o=e}if(xpe)try{r=new Worker(o)}catch{xpe=!1,r=new Worker(o,i)}else r=new Worker(o,i);return r.addEventListener(ppe,s=>Oet(s,n)),r}function UU(e,{worker:t,writer:n,onTaskFinished:i,transferStreams:o}){try{let{value:r,readable:s,writable:a}=e,c=[];if(r&&(r.byteLength!C.busy);if(_)return Vpe(_),new MV(_,e,t,x);if(vT.lengthhQ.push({resolve:C,stream:e,workerOptions:t}))}function x(_){if(hQ.length){let[{resolve:C,stream:V,workerOptions:L}]=hQ.splice(0,1);C(new MV(_,V,L,x))}else _.worker?(Vpe(_),Yet(_,t)):vT=vT.filter(C=>C!=_)}}function Yet(e,t){let{config:n}=t,{terminateWorkerTimeout:i}=n;Number.isFinite(i)&&i>=0&&(e.terminated?e.terminated=!1:e.terminateTimeout=setTimeout(async()=>{vT=vT.filter(o=>o!=e);try{await e.terminate()}catch{}},i))}function Vpe(e){let{terminateTimeout:t}=e;t&&(clearTimeout(t),e.terminateTimeout=null)}var bhi=T(S(),1);var Het="Writer iterator completed too soon",zet="text/plain";var Ket="Content-Type";var Jet=64*1024,bQ="writable",NV=class{constructor(){this.size=0}init(){this.initialized=!0}},BU=class extends NV{get readable(){let t=this,{chunkSize:n=Jet}=t,i=new ReadableStream({start(){this.chunkOffset=0},async pull(o){let{offset:r=0,size:s,diskNumberStart:a}=i,{chunkOffset:c}=this;o.enqueue(await Oa(t,r+c,Math.min(n,s-c),a)),c+n>s?o.close():this.chunkOffset+=n}});return i}},fQ=class extends NV{constructor(){super();let t=this,n=new WritableStream({write(i){return t.writeUint8Array(i)}});Object.defineProperty(t,bQ,{get(){return n}})}writeUint8Array(){}};var OU=class extends fQ{constructor(t){super(),Object.assign(this,{data:"data:"+(t||"")+";base64,",pending:[]})}writeUint8Array(t){let n=this,i=0,o=n.pending,r=n.pending.length;for(n.pending="",i=0;i2?n.data+=btoa(o):n.pending=o}getData(){return this.data+btoa(this.pending)}},d0=class extends BU{constructor(t){super(),Object.assign(this,{blob:t,size:t.size})}async readUint8Array(t,n){let i=this,o=t+n,s=await(t||on&&(s=s.slice(t,o)),new Uint8Array(s)}},sw=class extends NV{constructor(t){super();let n=this,i=new TransformStream,o=[];t&&o.push([Ket,t]),Object.defineProperty(n,bQ,{get(){return i.writable}}),n.blob=new Response(i.readable,{headers:o}).blob()}getData(){return this.blob}},YU=class extends d0{constructor(t){super(new Blob([t],{type:zet}))}},HU=class extends sw{constructor(t){super(t),Object.assign(this,{encoding:t,utf8:!t||t.toLowerCase()=="utf-8"})}async getData(){let{encoding:t,utf8:n}=this,i=await super.getData();if(i.text&&n)return i.text();{let o=new FileReader;return new Promise((r,s)=>{Object.assign(o,{onload:({target:a})=>r(a.result),onerror:()=>s(o.error)}),o.readAsText(i,t)})}}};var pQ=class extends BU{constructor(t){super(),this.readers=t}async init(){let t=this,{readers:n}=t;t.lastDiskNumber=0,t.lastDiskOffset=0,await Promise.all(n.map(async(i,o)=>{await i.init(),o!=n.length-1&&(t.lastDiskOffset+=i.size),t.size+=i.size})),super.init()}async readUint8Array(t,n,i=0){let o=this,{readers:r}=this,s,a=i;a==-1&&(a=r.length-1);let c=t;for(;c>=r[a].size;)c-=r[a].size,a++;let d=r[a],u=d.size;if(c+n<=u)s=await Oa(d,c,n);else{let h=u-c;s=new Uint8Array(n),s.set(await Oa(d,c,h)),s.set(await o.readUint8Array(t+h,n-h,i),h)}return o.lastDiskNumber=Math.max(a,o.lastDiskNumber),s}},zU=class extends NV{constructor(t,n=4294967295){super();let i=this;Object.assign(i,{diskNumber:0,diskOffset:0,size:0,maxSize:n,availableSize:n});let o,r,s,a=new WritableStream({async write(u){let{availableSize:h}=i;if(s)u.length>=h?(await c(u.slice(0,h)),await d(),i.diskOffset+=o.size,i.diskNumber++,s=null,await this.write(u.slice(h))):await c(u);else{let{value:p,done:g}=await t.next();if(g&&!p)throw new Error(Het);o=p,o.size=0,o.maxSize&&(i.maxSize=o.maxSize),i.availableSize=i.maxSize,await Kf(o),r=p.writable,s=r.getWriter(),await this.write(u)}},async close(){await s.ready,await d()}});Object.defineProperty(i,bQ,{get(){return a}});async function c(u){let h=u.length;h&&(await s.ready,await s.write(u),o.size+=h,i.size+=h,i.availableSize-=h)}async function d(){r.size=o.size,await s.close()}}};async function Kf(e,t){if(e.init&&!e.initialized)await e.init(t);else return Promise.resolve()}function KU(e){return Array.isArray(e)&&(e=new pQ(e)),e instanceof ReadableStream&&(e={readable:e}),e}function JU(e){e.writable===Zi&&typeof e.next==a0&&(e=new zU(e)),e instanceof WritableStream&&(e={writable:e});let{writable:t}=e;return t.size===Zi&&(t.size=0),e instanceof zU||Object.assign(e,{diskNumber:0,diskOffset:0,availableSize:1/0,maxSize:1/0}),e}function Oa(e,t,n,i){return e.readUint8Array(t,n,i)}var Whi=T(S(),1);var Thi=T(S(),1);var yhi=T(S(),1),Lpe="\0\u263A\u263B\u2665\u2666\u2663\u2660\u2022\u25D8\u25CB\u25D9\u2642\u2640\u266A\u266B\u263C\u25BA\u25C4\u2195\u203C\xB6\xA7\u25AC\u21A8\u2191\u2193\u2192\u2190\u221F\u2194\u25B2\u25BC !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\u2302\xC7\xFC\xE9\xE2\xE4\xE0\xE5\xE7\xEA\xEB\xE8\xEF\xEE\xEC\xC4\xC5\xC9\xE6\xC6\xF4\xF6\xF2\xFB\xF9\xFF\xD6\xDC\xA2\xA3\xA5\u20A7\u0192\xE1\xED\xF3\xFA\xF1\xD1\xAA\xBA\xBF\u2310\xAC\xBD\xBC\xA1\xAB\xBB\u2591\u2592\u2593\u2502\u2524\u2561\u2562\u2556\u2555\u2563\u2551\u2557\u255D\u255C\u255B\u2510\u2514\u2534\u252C\u251C\u2500\u253C\u255E\u255F\u255A\u2554\u2569\u2566\u2560\u2550\u256C\u2567\u2568\u2564\u2565\u2559\u2558\u2552\u2553\u256B\u256A\u2518\u250C\u2588\u2584\u258C\u2590\u2580\u03B1\xDF\u0393\u03C0\u03A3\u03C3\xB5\u03C4\u03A6\u0398\u03A9\u03B4\u221E\u03C6\u03B5\u2229\u2261\xB1\u2265\u2264\u2320\u2321\xF7\u2248\xB0\u2219\xB7\u221A\u207F\xB2\u25A0 ".split(""),Qet=Lpe.length==256;function Rpe(e){if(Qet){let t="";for(let n=0;nthis[n]=t[n])}};var wQ="File format is not recognized",ttt="End of central directory not found",ntt="End of Zip64 central directory locator not found",itt="Central directory header not found",ott="Local file header not found",rtt="Zip64 extra field not found",stt="File contains encrypted entry",att="Encryption method not supported",Epe="Compression method not supported",Ipe="Split zip file",Xpe="utf-8",Wpe="cp437",ctt=[[TQ,4294967295],[SQ,4294967295],[CQ,4294967295],[QU,65535]],ltt={[65535]:{getValue:Ts,bytes:4},[4294967295]:{getValue:$U,bytes:8}},cD=class{constructor(t,n={}){Object.assign(this,{reader:KU(t),options:n,config:qv()})}async*getEntriesGenerator(t={}){let n=this,{reader:i}=n,{config:o}=n;if(await Kf(i),(i.size===Zi||!i.readUint8Array)&&(i=new d0(await new Response(i.readable).blob()),await Kf(i)),i.size<22)throw new Error(wQ);i.chunkSize=GU(o);let r=await ftt(i,101010256,i.size,22,65535*16);if(!r){let A=await Oa(i,0,4),b=La(A);throw Ts(b)==134695760?new Error(Ipe):new Error(ttt)}let s=La(r),a=Ts(s,12),c=Ts(s,16),d=r.offset,u=Va(s,20),h=d+22+u,p=Va(s,4),g=i.lastDiskNumber||0,f=Va(s,6),x=Va(s,8),_=0,C=0;if(c==4294967295||a==4294967295||x==65535||f==65535){let A=await Oa(i,r.offset-20,20),b=La(A);if(Ts(b,0)==117853008){c=$U(b,8);let Z=await Oa(i,c,56,-1),E=La(Z),X=r.offset-20-56;if(Ts(E,0)!=101075792&&c!=X){let F=c;c=X,_=c-F,Z=await Oa(i,c,56,-1),E=La(Z)}if(Ts(E,0)!=101075792)throw new Error(ntt);p==65535&&(p=Ts(E,16)),f==65535&&(f=Ts(E,20)),x==65535&&(x=$U(E,32)),a==4294967295&&(a=$U(E,40)),c-=a}}if(c>=i.size&&(_=i.size-c-a-22,c=i.size-a-22),g!=p)throw new Error(Ipe);if(c<0)throw new Error(wQ);let V=0,L=await Oa(i,c,a,f),R=La(L);if(a){let A=r.offset-a;if(Ts(R,V)!=33639248&&c!=A){let b=c;c=A,_+=c-b,L=await Oa(i,c,a,f),R=La(L)}}let G=r.offset-c-(i.lastDiskOffset||0);if(a!=G&&G>=0&&(a=G,L=await Oa(i,c,a,f),R=La(L)),c<0||c>=i.size)throw new Error(wQ);let I=hl(n,t,"filenameEncoding"),v=hl(n,t,"commentEncoding");for(let A=0;A>8==0,U=N>>8==3,Y=L.subarray(E,X),k=Va(R,V+32),H=F+k,K=L.subarray(F,H),te=Z,z=Z,j=Ts(R,V+38),ee=O&&(UV(R,V+38)&16)==16||U&&(j>>16&16384)==16384||Y.length&&Y[Y.length-1]==WT.charCodeAt(0),pe=U&&(j>>16&73)==73,_e=Ts(R,V+42)+_;Object.assign(b,{versionMadeBy:N,msDosCompatible:O,compressedSize:0,uncompressedSize:0,commentLength:k,directory:ee,offset:_e,diskNumberStart:Va(R,V+34),internalFileAttributes:Va(R,V+36),externalFileAttributes:j,rawFilename:Y,filenameUTF8:te,commentUTF8:z,rawExtraField:L.subarray(X,F),executable:pe}),b.internalFileAttribute=b.internalFileAttributes,b.externalFileAttribute=b.externalFileAttributes;let ae=hl(n,t,"decodeText")||aw,ye=te?Xpe:I||Wpe,Se=z?Xpe:v||Wpe,Ee=ae(Y,ye);Ee===Zi&&(Ee=aw(Y,ye));let Ie=ae(K,Se);Ie===Zi&&(Ie=aw(K,Se)),Object.assign(b,{rawComment:K,filename:Ee,comment:Ie,directory:ee||Ee.endsWith(WT)}),C=Math.max(_e,C),wpe(b,b,R,V+6),b.zipCrypto=b.encrypted&&!b.extraFieldAES;let we=new Ty(b);we.getData=(at,Je)=>b.getData(at,we,Je),V=H;let{onprogress:ve}=t;if(ve)try{await ve(A+1,x,new Ty(b))}catch{}yield we}let P=hl(n,t,"extractPrependedData"),w=hl(n,t,"extractAppendedData");return P&&(n.prependedData=C>0?await Oa(i,0,C):new Uint8Array),n.comment=u?await Oa(i,d+22,u):new Uint8Array,w&&(n.appendedData=h>>8&255:p>>>24&255),signature:p,compressed:d!=0&&!G,encrypted:o.encrypted&&!G,useWebWorkers:hl(o,i,"useWebWorkers"),useCompressionStream:hl(o,i,"useCompressionStream"),transferStreams:hl(o,i,"transferStreams"),checkPasswordOnly:Z},config:u,streamOptions:{signal:b,size:w,onstart:X,onprogress:F,onend:N}},U=0;try{({outputSize:U}=await DU({readable:A,writable:E},O))}catch(Y){if(!Z||Y.message!=l0)throw Y}finally{let Y=hl(o,i,"preventClose");E.size+=U,!Y&&!E.locked&&await E.getWriter().close()}return Z?Zi:t.getData?t.getData():E}};function vpe(e,t,n){let i=e.rawBitFlag=Va(t,n+2),o=(i&1)==1,r=Ts(t,n+6);Object.assign(e,{encrypted:o,version:Va(t,n),bitFlag:{level:(i&6)>>1,dataDescriptor:(i&8)==8,languageEncodingFlag:(i&2048)==2048},rawLastModDate:r,lastModDate:ptt(r),filenameLength:Va(t,n+22),extraFieldLength:Va(t,n+24)})}function wpe(e,t,n,i,o){let{rawExtraField:r}=t,s=t.extraField=new Map,a=La(new Uint8Array(r)),c=0;try{for(;ct[o]==r);for(let o=0,r=0;o=5&&(r.push(kV),s.push(jU));let a=1;r.forEach((c,d)=>{if(e.data.length>=a+4){let u=Ts(i,a);t[c]=e[c]=new Date(u*1e3);let h=s[d];e[h]=u}a+=4})}async function ftt(e,t,n,i,o){let r=new Uint8Array(4),s=La(r);btt(s,0,t);let a=i+o;return await c(i)||await c(Math.min(a,n));async function c(d){let u=n-d,h=await Oa(e,u,d);for(let p=h.length-i;p>=0;p--)if(h[p]==r[0]&&h[p+1]==r[1]&&h[p+2]==r[2]&&h[p+3]==r[3])return{offset:u+p,buffer:h.slice(p,p+i).buffer}}}function hl(e,t,n){return t[n]===Zi?e.options[n]:t[n]}function ptt(e){let t=(e&4294901760)>>16,n=e&65535;try{return new Date(1980+((t&65024)>>9),((t&480)>>5)-1,t&31,(n&63488)>>11,(n&2016)>>5,(n&31)*2,0)}catch{}}function FQ(e){return new Date(Number(e/BigInt(1e4)-BigInt(116444736e5)))}function UV(e,t){return e.getUint8(t)}function Va(e,t){return e.getUint16(t,!0)}function Ts(e,t){return e.getUint32(t,!0)}function $U(e,t){return Number(e.getBigUint64(t,!0))}function btt(e,t,n){e.setUint32(t,n,!0)}function La(e){return new DataView(e.buffer)}var khi=T(S(),1);var _tt="File already exists",Ttt="Zip file comment exceeds 64KB",Stt="File entry comment exceeds 64KB",Ctt="File entry name exceeds 64KB",Npe="Version exceeds 65535",Vtt="The strength must equal 1, 2, or 3",Ltt="Extra field type exceeds 65535",Rtt="Extra field data exceeds 64KB",qQ="Zip64 is not supported (make sure 'keepOrder' is set to 'true')",Ztt="Undefined uncompressed size",kpe=new Uint8Array([7,0,2,0,65,69,3,0,0]),JQ=0,Upe=[],uD=class{constructor(t,n={}){t=JU(t);let i=t.availableSize!==Zi&&t.availableSize>0&&t.availableSize!==1/0&&t.maxSize!==Zi&&t.maxSize>0&&t.maxSize!==1/0;Object.assign(this,{writer:t,addSplitZipSignature:i,options:n,config:qv(),files:new Map,filenames:new Set,offset:n.offset===Zi?t.writable.size:n.offset,pendingEntriesSize:0,pendingAddFileCalls:new Set,bufferedWrites:0})}async add(t="",n,i={}){let o=this,{pendingAddFileCalls:r,config:s}=o;JQUpe.push(c));let a;try{if(t=t.trim(),o.filenames.has(t))throw new Error(_tt);return o.filenames.add(t),a=Gtt(o,t,n,i),r.add(a),await a}catch(c){throw o.filenames.delete(t),c}finally{r.delete(a);let c=Upe.shift();c?c():JQ--}}async close(t=new Uint8Array,n={}){let i=this,{pendingAddFileCalls:o,writer:r}=this,{writable:s}=r;for(;o.size;)await Promise.allSettled(Array.from(o));return await Att(this,t,n),qi(i,n,"preventClose")||await s.getWriter().close(),r.getData?r.getData():s}};async function Gtt(e,t,n,i){t=t.trim();let o=qi(e,i,GQ),r=qi(e,i,XQ,o?20:768),s=qi(e,i,vQ);if(r>65535)throw new Error(Npe);let a=qi(e,i,ZQ,0);a===0&&(a=qi(e,i,RQ,0)),!i.directory&&t.endsWith(WT)&&(i.directory=!0),qi(e,i,PQ)?(t.endsWith(WT)||(t+=WT),a===0&&(o?a=16:a=16384<<16)):!o&&a===0&&(s?a=493<<16:a=420<<16);let d=qi(e,i,"encodeText",wV),u=d(t);if(u===Zi&&(u=wV(t)),eo(u)>65535)throw new Error(Ctt);let h=i.comment||"",p=d(h);if(p===Zi&&(p=wV(h)),eo(p)>65535)throw new Error(Stt);let g=qi(e,i,IQ,20);if(g>65535)throw new Error(Npe);let f=qi(e,i,kV,new Date),x=qi(e,i,cw),_=qi(e,i,lw),C=qi(e,i,LQ,0);C===0&&(C=qi(e,i,VQ,0));let V=qi(e,i,"passThrough"),L,R;V||(L=qi(e,i,"password"),R=qi(e,i,"rawPassword"));let G=qi(e,i,"encryptionStrength",3),I=qi(e,i,WQ),v=qi(e,i,"extendedTimestamp",!0),P=qi(e,i,"keepOrder",!0),w=qi(e,i,"level"),A=qi(e,i,"useWebWorkers"),b=qi(e,i,"bufferedWrite"),Z=qi(e,i,"dataDescriptorSignature",!1),E=qi(e,i,"signal"),X=qi(e,i,"useUnicodeFileNames",!0),F=qi(e,i,"useCompressionStream"),N=qi(e,i,"compressionMethod"),O=qi(e,i,"dataDescriptor",!0),U=qi(e,i,qU);if(!I&&(L!==Zi||R!==Zi)&&!(G>=1&&G<=3))throw new Error(Vtt);let Y=new Uint8Array,{extraField:k}=i;if(k){let Qe=0,_t=0;k.forEach(ht=>Qe+=4+eo(ht)),Y=new Uint8Array(Qe),k.forEach((ht,bt)=>{if(bt>65535)throw new Error(Ltt);if(eo(ht)>65535)throw new Error(Rtt);vs(Y,new Uint16Array([bt]),_t),vs(Y,new Uint16Array([eo(ht)]),_t+2),vs(Y,ht,_t+4),_t+=4+eo(ht)})}let H=0,K=0,te=0;if(V&&({uncompressedSize:te}=i,te===Zi))throw new Error(Ztt);let z=U===!0;n&&(n=KU(n),await Kf(n),V?H=Dpe(te):n.size===Zi?(O=!0,(U||U===Zi)&&(U=!0,te=H=4294967296)):(te=n.size,H=Dpe(te)));let{diskOffset:j,diskNumber:ee,maxSize:pe}=e.writer,_e=z||te>4294967295,ae=z||H>4294967295,ye=z||e.offset+e.pendingEntriesSize-j>4294967295,Ee=qi(e,i,"supportZip64SplitFile",!0)&&z||ee+Math.ceil(e.pendingEntriesSize/pe)>65535;if(ye||_e||ae||Ee){if(U===!1||!P)throw new Error(qQ);U=!0}U=U||!1;let Ie=qi(e,i,EQ),{signature:we}=i;i=Object.assign({},i,{rawFilename:u,rawComment:p,version:g,versionMadeBy:r,lastModDate:f,lastAccessDate:x,creationDate:_,rawExtraField:Y,zip64:U,zip64UncompressedSize:_e,zip64CompressedSize:ae,zip64Offset:ye,zip64DiskNumberStart:Ee,password:L,rawPassword:R,level:!F&&e.config.CompressionStream===Zi&&e.config.CompressionStreamNative===Zi?0:w,useWebWorkers:A,encryptionStrength:G,extendedTimestamp:v,zipCrypto:I,bufferedWrite:b,keepOrder:P,useUnicodeFileNames:X,dataDescriptor:O,dataDescriptorSignature:Z,signal:E,msDosCompatible:o,internalFileAttribute:C,internalFileAttributes:C,externalFileAttribute:a,externalFileAttributes:a,useCompressionStream:F,passThrough:V,encrypted:!!(L&&eo(L)||R&&eo(R))||V&&Ie,signature:we,compressionMethod:N});let ve=Xtt(i),at=Ptt(i),Je=eo(ve.localHeaderArray,at.dataDescriptorArray);K=Je+H,e.options.usdz&&(K+=K+64),e.pendingEntriesSize+=K;let pt;try{pt=await Ett(e,t,n,{headerInfo:ve,dataDescriptorInfo:at,metadataSize:Je},i)}finally{e.pendingEntriesSize-=K}return Object.assign(pt,{name:t,comment:h,extraField:k}),new Ty(pt)}async function Ett(e,t,n,i,o){let{files:r,writer:s}=e,{keepOrder:a,dataDescriptor:c,signal:d}=o,{headerInfo:u}=i,{usdz:h}=e.options,p=Array.from(r.values()).pop(),g={},f,x,_,C,V,L,R;r.set(t,g);try{let P;a&&(P=p&&p.lock,G()),(o.bufferedWrite||e.writerLocked||e.bufferedWrites&&a||!c)&&!h?(L=new TransformStream,R=new Response(L.readable).blob(),L.writable.size=0,f=!0,e.bufferedWrites++,await Kf(s)):(L=s,await I()),await Kf(L);let{writable:w}=s,{diskOffset:A}=s;if(e.addSplitZipSignature){delete e.addSplitZipSignature;let Z=new Uint8Array(4),E=Ya(Z);$i(E,0,134695760),await Jf(w,Z),e.offset+=4}h&&Wtt(i,e.offset-A),f||(await P,await v(w));let{diskNumber:b}=s;if(V=!0,g.diskNumberStart=b,g=await Itt(n,L,g,i,e.config,o),V=!1,r.set(t,g),g.filename=t,f){await L.writable.getWriter().close();let Z=await R;await P,await I(),C=!0,c||(Z=await wtt(g,Z,w,o)),await v(w),g.diskNumberStart=s.diskNumber,A=s.diskOffset,await Z.stream().pipeTo(w,{preventClose:!0,preventAbort:!0,signal:d}),w.size+=Z.size,C=!1}if(g.offset=e.offset-A,g.zip64)Ftt(g,o);else if(g.offset>4294967295)throw new Error(qQ);return e.offset+=g.size,g}catch(P){if(f&&C||!f&&V){if(e.hasCorruptedEntries=!0,P)try{P.corruptedEntry=!0}catch{}f?e.offset+=L.writable.size:e.offset=L.writable.size}throw r.delete(t),P}finally{f&&e.bufferedWrites--,_&&_(),x&&x()}function G(){g.lock=new Promise(P=>_=P)}async function I(){e.writerLocked=!0;let{lockWriter:P}=e;e.lockWriter=new Promise(w=>x=()=>{e.writerLocked=!1,w()}),await P}async function v(P){eo(u.localHeaderArray)>s.availableSize&&(s.availableSize=0,await Jf(P,new Uint8Array))}}async function Itt(e,t,{diskNumberStart:n,lock:i},o,r,s){let{headerInfo:a,dataDescriptorInfo:c,metadataSize:d}=o,{localHeaderArray:u,headerArray:h,lastModDate:p,rawLastModDate:g,encrypted:f,compressed:x,version:_,compressionMethod:C,rawExtraFieldExtendedTimestamp:V,extraFieldExtendedTimestampFlag:L,rawExtraFieldNTFS:R,rawExtraFieldAES:G}=a,{dataDescriptorArray:I}=c,{rawFilename:v,lastAccessDate:P,creationDate:w,password:A,rawPassword:b,level:Z,zip64:E,zip64UncompressedSize:X,zip64CompressedSize:F,zip64Offset:N,zip64DiskNumberStart:O,zipCrypto:U,dataDescriptor:Y,directory:k,executable:H,versionMadeBy:K,rawComment:te,rawExtraField:z,useWebWorkers:j,onstart:ee,onprogress:pe,onend:_e,signal:ae,encryptionStrength:ye,extendedTimestamp:Se,msDosCompatible:Ee,internalFileAttributes:Ie,externalFileAttributes:we,useCompressionStream:ve,passThrough:at}=s,Je={lock:i,versionMadeBy:K,zip64:E,directory:!!k,executable:!!H,filenameUTF8:!0,rawFilename:v,commentUTF8:!0,rawComment:te,rawExtraFieldExtendedTimestamp:V,rawExtraFieldNTFS:R,rawExtraFieldAES:G,rawExtraField:z,extendedTimestamp:Se,msDosCompatible:Ee,internalFileAttributes:Ie,externalFileAttributes:we,diskNumberStart:n},{signature:pt,uncompressedSize:Qe}=s,_t=0;at||(Qe=0);let{writable:ht}=t;if(e){e.chunkSize=GU(r),await Jf(ht,u);let En=e.readable,sn=En.size=e.size,Ce={options:{codecType:NU,level:Z,rawPassword:b,password:A,encryptionStrength:ye,zipCrypto:f&&U,passwordVerification:f&&U&&g>>8&255,signed:!at,compressed:x&&!at,encrypted:f&&!at,useWebWorkers:j,useCompressionStream:ve,transferStreams:!1},config:r,streamOptions:{signal:ae,size:sn,onstart:ee,onprogress:pe,onend:_e}},Le=await DU({readable:En,writable:ht},Ce);_t=Le.outputSize,at||(Qe=Le.inputSize,pt=Le.signature),ht.size+=Qe}else await Jf(ht,u);let bt;if(E){let En=4;X&&(En+=8),F&&(En+=8),N&&(En+=8),O&&(En+=4),bt=new Uint8Array(En)}else bt=new Uint8Array;return vtt({signature:pt,rawExtraFieldZip64:bt,compressedSize:_t,uncompressedSize:Qe,headerInfo:a,dataDescriptorInfo:c},s),Y&&await Jf(ht,I),Object.assign(Je,{uncompressedSize:Qe,compressedSize:_t,lastModDate:p,rawLastModDate:g,creationDate:w,lastAccessDate:P,encrypted:f,zipCrypto:U,size:d+_t,compressionMethod:C,version:_,headerArray:h,signature:pt,rawExtraFieldZip64:bt,extraFieldExtendedTimestampFlag:L,zip64UncompressedSize:X,zip64CompressedSize:F,zip64Offset:N,zip64DiskNumberStart:O}),Je}function Xtt(e){let{rawFilename:t,lastModDate:n,lastAccessDate:i,creationDate:o,level:r,zip64:s,zipCrypto:a,useUnicodeFileNames:c,dataDescriptor:d,directory:u,rawExtraField:h,encryptionStrength:p,extendedTimestamp:g,encrypted:f}=e,{version:x,compressionMethod:_}=e,C=!u&&(r>0||r===Zi&&_!==0),V;if(f&&!a){V=new Uint8Array(eo(kpe)+2);let N=Ya(V);ao(N,0,39169),vs(V,kpe,2),jQ(N,8,p)}else V=new Uint8Array;let L,R,G;if(g){R=new Uint8Array(9+(i?4:0)+(o?4:0));let N=Ya(R);ao(N,0,21589),ao(N,2,eo(R)-4),G=1+(i?2:0)+(o?4:0),jQ(N,4,G);let O=5;$i(N,O,Math.floor(n.getTime()/1e3)),O+=4,i&&($i(N,O,Math.floor(i.getTime()/1e3)),O+=4),o&&$i(N,O,Math.floor(o.getTime()/1e3));try{L=new Uint8Array(36);let U=Ya(L),Y=QQ(n);ao(U,0,10),ao(U,2,32),ao(U,8,1),ao(U,10,24),jl(U,12,Y),jl(U,20,QQ(i)||Y),jl(U,28,QQ(o)||Y)}catch{L=new Uint8Array}}else L=R=new Uint8Array;let I=0;c&&(I=I|2048),d&&(I=I|8),_===Zi&&(_=C?8:0),_==8&&(r>=1&&r<3&&(I=I|6),r>=3&&r<5&&(I=I|1),r===9&&(I=I|2)),s&&(x=x>45?x:45),f&&(I=I|1,a||(x=x>51?x:51,V[9]=_,_=99));let v=new Uint8Array(26),P=Ya(v);ao(P,0,x),ao(P,2,I),ao(P,4,_);let w=new Uint32Array(1),A=Ya(w),b;nnQ?b=nQ:b=n,ao(A,0,(b.getHours()<<6|b.getMinutes())<<5|b.getSeconds()/2),ao(A,2,(b.getFullYear()-1980<<4|b.getMonth()+1)<<5|b.getDate());let Z=w[0];$i(P,6,Z),ao(P,22,eo(t));let E=eo(V,R,L,h);ao(P,24,E);let X=new Uint8Array(30+eo(t)+E),F=Ya(X);return $i(F,0,67324752),vs(X,v,4),vs(X,t,30),vs(X,V,30+eo(t)),vs(X,R,30+eo(t,V)),vs(X,L,30+eo(t,V,R)),vs(X,h,30+eo(t,V,R,L)),{localHeaderArray:X,headerArray:v,headerView:P,lastModDate:n,rawLastModDate:Z,encrypted:f,compressed:C,version:x,compressionMethod:_,extraFieldExtendedTimestampFlag:G,rawExtraFieldExtendedTimestamp:R,rawExtraFieldNTFS:L,rawExtraFieldAES:V,extraFieldLength:E}}function Wtt(e,t){let{headerInfo:n}=e,{localHeaderArray:i,extraFieldLength:o}=n,r=Ya(i),s=64-(t+eo(i))%64;s<4&&(s+=64);let a=new Uint8Array(s),c=Ya(a);ao(c,0,6534),ao(c,2,s-2);let d=i;n.localHeaderArray=i=new Uint8Array(eo(d)+s),vs(i,d),vs(i,a,eo(d)),r=Ya(i),ao(r,28,o+s),e.metadataSize+=s}function Ptt(e){let{zip64:t,dataDescriptor:n,dataDescriptorSignature:i}=e,o=new Uint8Array,r,s=0;return n&&(o=new Uint8Array(t?i?24:20:i?16:12),r=Ya(o),i&&(s=4,$i(r,0,134695760))),{dataDescriptorArray:o,dataDescriptorView:r,dataDescriptorOffset:s}}function vtt(e,t){let{signature:n,rawExtraFieldZip64:i,compressedSize:o,uncompressedSize:r,headerInfo:s,dataDescriptorInfo:a}=e,{headerView:c,encrypted:d}=s,{dataDescriptorView:u,dataDescriptorOffset:h}=a,{zip64:p,zip64UncompressedSize:g,zip64CompressedSize:f,zipCrypto:x,dataDescriptor:_}=t;if((!d||x)&&n!==Zi&&($i(c,10,n),_&&$i(u,h,n)),p){let C=Ya(i);ao(C,0,1),ao(C,2,eo(i)-4);let V=4;g&&($i(c,18,4294967295),jl(C,V,BigInt(r)),V+=8),f&&($i(c,14,4294967295),jl(C,V,BigInt(o))),_&&(jl(u,h+4,BigInt(o)),jl(u,h+12,BigInt(r)))}else $i(c,14,o),$i(c,18,r),_&&($i(u,h+4,o),$i(u,h+8,r))}async function wtt(e,t,n,{zipCrypto:i}){let o;o=await t.slice(0,26).arrayBuffer(),o.byteLength!=26&&(o=o.slice(0,26));let r=new DataView(o);return(!e.encrypted||i)&&$i(r,14,e.signature),e.zip64?($i(r,18,4294967295),$i(r,22,4294967295)):($i(r,18,e.compressedSize),$i(r,22,e.uncompressedSize)),await Jf(n,new Uint8Array(o)),t.slice(o.byteLength)}function Ftt(e,t){let{rawExtraFieldZip64:n,offset:i,diskNumberStart:o}=e,{zip64UncompressedSize:r,zip64CompressedSize:s,zip64Offset:a,zip64DiskNumberStart:c}=t,d=Ya(n),u=4;r&&(u+=8),s&&(u+=8),a&&(jl(d,u,BigInt(i)),u+=8),c&&$i(d,u,o)}async function Att(e,t,n){let{files:i,writer:o}=e,{diskOffset:r,writable:s}=o,{diskNumber:a}=o,c=0,d=0,u=e.offset-r,h=i.size;for(let[,G]of i){let{rawFilename:I,rawExtraFieldZip64:v,rawExtraFieldAES:P,rawComment:w,rawExtraFieldNTFS:A,rawExtraField:b,extendedTimestamp:Z,extraFieldExtendedTimestampFlag:E,lastModDate:X}=G,F;if(Z){F=new Uint8Array(9);let N=Ya(F);ao(N,0,21589),ao(N,2,5),jQ(N,4,E),$i(N,5,Math.floor(X.getTime()/1e3))}else F=new Uint8Array;G.rawExtraFieldCDExtendedTimestamp=F,d+=46+eo(I,w,v,P,A,F,b)}let p=new Uint8Array(d),g=Ya(p);await Kf(o);let f=0;for(let[G,I]of Array.from(i.values()).entries()){let{offset:v,rawFilename:P,rawExtraFieldZip64:w,rawExtraFieldAES:A,rawExtraFieldCDExtendedTimestamp:b,rawExtraFieldNTFS:Z,rawExtraField:E,rawComment:X,versionMadeBy:F,headerArray:N,zip64:O,zip64UncompressedSize:U,zip64CompressedSize:Y,zip64DiskNumberStart:k,zip64Offset:H,internalFileAttributes:K,externalFileAttributes:te,diskNumberStart:z,uncompressedSize:j,compressedSize:ee}=I,pe=eo(w,A,b,Z,E);$i(g,c,33639248),ao(g,c+4,F);let _e=Ya(N);U||$i(_e,18,j),Y||$i(_e,14,ee),vs(p,N,c+6),ao(g,c+30,pe),ao(g,c+32,eo(X)),ao(g,c+34,O&&k?65535:z),ao(g,c+36,K),te&&$i(g,c+38,te),$i(g,c+42,O&&H?4294967295:v),vs(p,P,c+46),vs(p,w,c+46+eo(P)),vs(p,A,c+46+eo(P,w)),vs(p,b,c+46+eo(P,w,A)),vs(p,Z,c+46+eo(P,w,A,b)),vs(p,E,c+46+eo(P,w,A,b,Z)),vs(p,X,c+46+eo(P)+pe);let ae=46+eo(P,X)+pe;if(c-f>o.availableSize&&(o.availableSize=0,await Jf(s,p.slice(f,c)),f=c),c+=ae,n.onprogress)try{await n.onprogress(G+1,i.size,new Ty(I))}catch{}}await Jf(s,f?p.slice(f):p);let x=o.diskNumber,{availableSize:_}=o;_<22&&x++;let C=qi(e,n,qU);if(u>4294967295||d>4294967295||h>65535||x>65535){if(C===!1)throw new Error(qQ);C=!0}let V=new Uint8Array(C?98:22),L=Ya(V);c=0,C&&($i(L,0,101075792),jl(L,4,BigInt(44)),ao(L,12,45),ao(L,14,45),$i(L,16,x),$i(L,20,a),jl(L,24,BigInt(h)),jl(L,32,BigInt(h)),jl(L,40,BigInt(d)),jl(L,48,BigInt(u)),$i(L,56,117853008),jl(L,64,BigInt(u)+BigInt(d)),$i(L,72,x+1),qi(e,n,"supportZip64SplitFile",!0)&&(x=65535,a=65535),h=65535,u=4294967295,d=4294967295,c+=76),$i(L,c,101010256),ao(L,c+4,x),ao(L,c+6,a),ao(L,c+8,h),ao(L,c+10,h),$i(L,c+12,d),$i(L,c+16,u);let R=eo(t);if(R)if(R<=65535)ao(L,c+20,R);else throw new Error(Ttt);await Jf(s,V),R&&await Jf(s,t)}async function Jf(e,t){let n=e.getWriter();try{await n.ready,e.size+=eo(t),await n.write(t)}finally{n.releaseLock()}}function QQ(e){if(e)return(BigInt(e.getTime())+BigInt(116444736e5))*BigInt(1e4)}function qi(e,t,n,i){let o=t[n]===Zi?e.options[n]:t[n];return o===Zi?i:o}function Dpe(e){return e+5*(Math.floor(e/16383)+1)}function jQ(e,t,n){e.setUint8(t,n)}function ao(e,t,n){e.setUint16(t,n,!0)}function $i(e,t,n){e.setUint32(t,n,!0)}function jl(e,t,n){e.setBigUint64(t,n,!0)}function vs(e,t,n){e.set(t,n)}function Ya(e){return new DataView(e.buffer)}function eo(...e){let t=0;return e.forEach(n=>n&&(t+=n.length)),t}vV({Deflate:Lfe,Inflate:zfe});var $Q=32,Mtt="http://www.opengis.net/kml/2.2",Ph="http://www.google.com/kml/ext/2.2",Ntt="http://www.w3.org/2000/xmlns/";function mD(e){this._files={},this._promises=[],this._count=0,this._modelCallback=e}var ktt=/^data:image\/([^,;]+)/;mD.prototype.texture=function(e){let t=this,n;if(typeof e=="string"||e instanceof Re){if(e=Re.createIfNeeded(e),!e.isDataUri)return e.url;let i=e.url.match(ktt);n=`texture_${++this._count}`,l(i)&&(n+=`.${i[1]}`);let o=e.fetchBlob().then(function(r){t._files[n]=r});return this._promises.push(o),n}if(e instanceof HTMLCanvasElement){n=`texture_${++this._count}.png`;let i=new Promise(o=>{e.toBlob(function(r){t._files[n]=r,o()})});return this._promises.push(i),n}return""};function Utt(e,t){return function(n){e._files[t]=n}}mD.prototype.model=function(e,t){let n=this._modelCallback;if(!l(n))throw new ce("Encountered a model entity while exporting to KML, but no model callback was supplied.");let i={},o=n(e,t,i);for(let r in i)if(i.hasOwnProperty(r)){let s=Promise.resolve(i[r]);this._promises.push(s),s.then(Utt(this,r))}return o};Object.defineProperties(mD.prototype,{promise:{get:function(){return Promise.all(this._promises)}},files:{get:function(){return this._files}}});function hD(e){this._time=e}hD.prototype.get=function(e,t,n){let i;return l(e)&&(i=l(e.getValue)?e.getValue(this._time,n):e),y(i,t)};hD.prototype.getColor=function(e,t){let n=this.get(e,t);if(l(n))return FT(n)};hD.prototype.getMaterialType=function(e){if(l(e))return e.getType(this._time)};function e4(){this._ids={},this._styles={},this._count=0}e4.prototype.get=function(e){let t=this._ids,n=e.innerHTML;if(l(t[n]))return t[n];let i=`style-${++this._count}`;return e.setAttribute("id",i),i=`#${i}`,t[n]=i,this._styles[n]=e,i};e4.prototype.save=function(e){let t=this._styles,n=e.childNodes[0];for(let i in t)t.hasOwnProperty(i)&&e.insertBefore(t[i],n)};function Hpe(){this._ids={}}Hpe.prototype.get=function(e){if(!l(e))return this.get(Jn());let t=this._ids;return l(t[e])?`${e.toString()}-${++t[e]}`:(t[e]=0,e)};function t4(e){e=y(e,y.EMPTY_OBJECT);let t=e.entities,n=y(e.kmz,!1),i=t4._createState(e),o=t.values.filter(function(d){return!l(d.parent)}),r=i.kmlDoc,s=r.documentElement;s.setAttributeNS(Ntt,"xmlns:gx",Ph);let a=r.createElement("Document");s.appendChild(a),Kpe(i,a,o),i.styleCache.save(a);let c=i.externalFileHandler;return c.promise.then(function(){let u=new XMLSerializer().serializeToString(i.kmlDoc);return n?Dtt(u,c.files):{kml:u,externalFiles:c.files}})}function Dtt(e,t){let n=on("ThirdParty/Workers/z-worker-pako.js");vV({workerScripts:{deflate:[n,"./pako_deflate.min.js"],inflate:[n,"./pako_inflate.min.js"]}});let i=new sw,o=new uD(i);return o.add("doc.kml",new YU(e)).then(function(){let r=Object.keys(t);return zpe(o,r,t,0)}).then(function(){return o.close()}).then(function(r){return{kmz:r}})}function zpe(e,t,n,i){if(t.length===i)return;let o=t[i];return e.add(o,new d0(n[o])).then(function(){return zpe(e,t,n,i+1)})}t4._createState=function(e){let t=e.entities,n=new e4,i=t.computeAvailability(),o=l(e.time)?e.time:i.start,r=y(e.defaultAvailability,i),s=y(e.sampleDuration,60);r.start===Be.MINIMUM_VALUE?r.stop===Be.MAXIMUM_VALUE?r=new Cn:q.addSeconds(r.stop,-10*s,r.start):r.stop===Be.MAXIMUM_VALUE&&q.addSeconds(r.start,10*s,r.stop);let a=new mD(e.modelCallback);return{kmlDoc:document.implementation.createDocument(Mtt,"kml"),ellipsoid:y(e.ellipsoid,ne.default),idManager:new Hpe,styleCache:n,externalFileHandler:a,time:o,valueGetter:new hD(o),sampleDuration:s,defaultAvailability:new Hr([r])}};function Kpe(e,t,n){let i=e.kmlDoc,o=e.styleCache,r=e.valueGetter,s=e.idManager,a=n.length,c,d,u;for(let h=0;h0){let C=i.createElement("Placemark");C.setAttribute("id",s.get(p.id));let V=p.name,L=p.label;if(l(L)){let G=i.createElement("LabelStyle"),I=r.get(L.text);V=l(I)&&I.length>0?I:V;let v=r.getColor(L.fillColor);l(v)&&(G.appendChild(pn(i,"color",v)),G.appendChild(pn(i,"colorMode","normal")));let P=r.get(L.scale);l(P)&&G.appendChild(pn(i,"scale",P)),u.push(G)}C.appendChild(pn(i,"name",V)),C.appendChild(pn(i,"visibility",p.show)),C.appendChild(pn(i,"description",p.description)),l(g)&&C.appendChild(g),t.appendChild(C);let R=u.length;if(R>0){let G=i.createElement("Style");for(let I=0;I1){let G=i.createElement("MultiGeometry");for(let I=0;I0){let C=i.createElement("Folder");C.setAttribute("id",s.get(p.id)),C.appendChild(pn(i,"name",p.name)),C.appendChild(pn(i,"visibility",p.show)),C.appendChild(pn(i,"description",p.description)),t.appendChild(C),Kpe(e,C,_)}}}var ql=new m,fl=new he,Wh=new q;function Btt(e,t,n,i){let o=e.kmlDoc,r=e.ellipsoid,s=e.valueGetter,a=y(t.billboard,t.point);if(!l(a)&&!l(t.path))return;let c=t.position;if(!c.isConstant){Jpe(e,t,a,n,i);return}s.get(c,void 0,ql);let d=pn(o,"coordinates",wT(ql,r)),u=o.createElement("Point"),h=o.createElement("altitudeMode");h.appendChild(AT(e,a.heightReference)),u.appendChild(h),u.appendChild(d),n.push(u);let p=a instanceof ec?jpe(e,a):Qpe(e,a);i.push(p)}function Jpe(e,t,n,i,o){let r=e.kmlDoc,s=e.ellipsoid,a=e.valueGetter,c,d=t.position,u=!0;d instanceof _a?(c=d.intervals,u=!1):c=y(t.availability,e.defaultAvailability);let h=n instanceof Yp,p,g,f,x=[];for(p=0;p1){let C=r.createElementNS(Ph,"MultiTrack");for(p=0;p0&&(r=n);let s=t.coordinates,a=o.get(s),c=[],d=[le.northeast,le.southeast,le.southwest,le.northwest];for(let g=0;g<4;++g)d[g](a,fl),c.push(`${W.toDegrees(fl.longitude)},${W.toDegrees(fl.latitude)},${r}`);let u=pn(i,"coordinates",c.join(" ")),h=i.createElement("outerBoundaryIs"),p=i.createElement("LinearRing");return p.appendChild(u),h.appendChild(p),[h]}function Ope(e,t,n,i){let o=e.kmlDoc,r=e.ellipsoid,s=[],a=t.length;for(let u=0;u0&&(r=n);let a=[],c=t.hierarchy,d=o.get(c),u=Array.isArray(d)?d:d.positions,h=i.createElement("outerBoundaryIs");h.appendChild(Ope(e,u,r,s)),a.push(h);let p=d.holes;if(l(p)){let g=p.length;for(let f=0;f0&&c.appendChild(pn(r,"extrude",!0));let u=a?Ytt(e,t,d):Htt(e,t,d),h=u.length;for(let _=0;_=0;--i)t+=n[i]<16?`0${n[i].toString(16)}`:n[i].toString(16);return t}var i4=t4;var rbi=T(S(),1);var vfi=T(S(),1);function hw(){this._cache={}}hw.prototype.fromColor=function(e,t){return fD(void 0,void 0,e,t,this._cache)};hw.prototype.fromUrl=function(e,t,n){return fD(e,void 0,t,n,this._cache)};hw.prototype.fromMakiIconId=function(e,t,n){return fD(on(`Assets/Textures/maki/${encodeURIComponent(e)}.png`),void 0,t,n,this._cache)};hw.prototype.fromText=function(e,t,n){return fD(void 0,e,t,n,this._cache)};var Jtt=new B;function Qtt(e,t,n){e.save(),e.scale(n/24,n/24),e.fillStyle=t.toCssColorString(),e.strokeStyle=t.brighten(.6,Jtt).toCssColorString(),e.lineWidth=.846,e.beginPath(),e.moveTo(6.72,.422),e.lineTo(17.28,.422),e.bezierCurveTo(18.553,.422,19.577,1.758,19.577,3.415),e.lineTo(19.577,10.973),e.bezierCurveTo(19.577,12.63,18.553,13.966,17.282,13.966),e.lineTo(14.386,14.008),e.lineTo(11.826,23.578),e.lineTo(9.614,14.008),e.lineTo(6.719,13.965),e.bezierCurveTo(5.446,13.983,4.422,12.629,4.422,10.972),e.lineTo(4.422,3.416),e.bezierCurveTo(4.423,1.76,5.447,.423,6.718,.423),e.closePath(),e.fill(),e.stroke(),e.restore()}function $pe(e,t,n){let i=n/2.5,o=i,r=i;t.width>t.height?r=i*(t.height/t.width):t.width${i}${obe(o)}`:n+=`${i}${o}`)}return n.length>0&&(n=`${n}
`),n}function int(e,t,n){let i;return function(o,r){return l(i)||(i=e(t,n)),i}}function ont(e,t){return new Om(int(obe,e,t),!0)}function gD(e,t,n){let i=e.id;if(!l(i)||e.type!=="Feature")i=Jn();else{let s=2,a=i;for(;l(t.getById(a));)a=`${i}_${s}`,s++;i=a}let o=t.getOrCreateEntity(i),r=e.properties;if(l(r)){o.properties=r;let s,a=r.title;if(l(a))o.name=a,s="title";else{let d=Number.MAX_VALUE;for(let u in r)if(r.hasOwnProperty(u)&&r[u]){let h=u.toLowerCase();if(d>1&&h==="title"){d=1,s=u;break}else d>2&&h==="name"?(d=2,s=u):d>3&&/title/i.test(u)?(d=3,s=u):d>4&&/name/i.test(u)&&(d=4,s=u)}l(s)&&(o.name=r[s])}let c=r.description;c!==null&&(o.description=l(c)?new qn(c):n(r,s))}return o}function p4(e,t){let n=new Array(e.length);for(let i=0;i2?d.perPositionHeight=new qn(!0):o.clampToGround||(d.height=0);let p=gD(t,e._entityCollection,o.describe);p.polygon=d}function bbe(e,t,n,i,o){pbe(e,t,i,n.coordinates,o)}function gbe(e,t,n,i,o){let r=n.coordinates;for(let s=0;st&&(n==null?(n="…",i=3):i=n.length,e=e.substring(0,t-i)+n),e}function Ko(e,t){for(var n=e.length-1;n>=0;n--)e[n]===t&&e.splice(n,1)}function Vy(e,t){for(var n=e.length-1;n>=0;n--)t(e[n])===!0&&e.splice(n,1)}function Qf(e){throw new Error("Unhandled case for value: '".concat(e,"'"))}var Ibi=T(S());var gbi=T(S());var fbi=T(S()),Ly=/[A-Za-z]/,na=/[\d]/;var zd=/\s/,yD=/['"]/,Cbe=/[\x00-\x1F\x7F]/,Vbe=/A-Za-z\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u05D0-\u05EA\u05F0-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u08A0-\u08B4\u08B6-\u08BD\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0980\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0AF9\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D\u0C58-\u0C5A\u0C60\u0C61\u0C80\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D54-\u0D56\u0D5F-\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16F1-\u16F8\u1700-\u170C\u170E-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7\u17DC\u1820-\u1877\u1880-\u1884\u1887-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191E\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u1A00-\u1A16\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE\u1BAF\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1C80-\u1C88\u1CE9-\u1CEC\u1CEE-\u1CF1\u1CF5\u1CF6\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2183\u2184\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2E2F\u3005\u3006\u3031-\u3035\u303B\u303C\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312D\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FD5\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B\uA640-\uA66E\uA67F-\uA69D\uA6A0-\uA6E5\uA717-\uA71F\uA722-\uA788\uA78B-\uA7AE\uA7B0-\uA7B7\uA7F7-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB\uA8FD\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uA9E0-\uA9E4\uA9E6-\uA9EF\uA9FA-\uA9FE\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA7E-\uAAAF\uAAB1\uAAB5\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB65\uAB70-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC/.source,lnt=/\u2700-\u27bf\udde6-\uddff\ud800-\udbff\udc00-\udfff\ufe0e\ufe0f\u0300-\u036f\ufe20-\ufe23\u20d0-\u20f0\ud83c\udffb-\udfff\u200d\u3299\u3297\u303d\u3030\u24c2\ud83c\udd70-\udd71\udd7e-\udd7f\udd8e\udd91-\udd9a\udde6-\uddff\ude01-\ude02\ude1a\ude2f\ude32-\ude3a\ude50-\ude51\u203c\u2049\u25aa-\u25ab\u25b6\u25c0\u25fb-\u25fe\u00a9\u00ae\u2122\u2139\udc04\u2600-\u26FF\u2b05\u2b06\u2b07\u2b1b\u2b1c\u2b50\u2b55\u231a\u231b\u2328\u23cf\u23e9-\u23f3\u23f8-\u23fa\udccf\u2935\u2934\u2190-\u21ff/.source,dnt=/\u0300-\u036F\u0483-\u0489\u0591-\u05BD\u05BF\u05C1\u05C2\u05C4\u05C5\u05C7\u0610-\u061A\u064B-\u065F\u0670\u06D6-\u06DC\u06DF-\u06E4\u06E7\u06E8\u06EA-\u06ED\u0711\u0730-\u074A\u07A6-\u07B0\u07EB-\u07F3\u0816-\u0819\u081B-\u0823\u0825-\u0827\u0829-\u082D\u0859-\u085B\u08D4-\u08E1\u08E3-\u0903\u093A-\u093C\u093E-\u094F\u0951-\u0957\u0962\u0963\u0981-\u0983\u09BC\u09BE-\u09C4\u09C7\u09C8\u09CB-\u09CD\u09D7\u09E2\u09E3\u0A01-\u0A03\u0A3C\u0A3E-\u0A42\u0A47\u0A48\u0A4B-\u0A4D\u0A51\u0A70\u0A71\u0A75\u0A81-\u0A83\u0ABC\u0ABE-\u0AC5\u0AC7-\u0AC9\u0ACB-\u0ACD\u0AE2\u0AE3\u0B01-\u0B03\u0B3C\u0B3E-\u0B44\u0B47\u0B48\u0B4B-\u0B4D\u0B56\u0B57\u0B62\u0B63\u0B82\u0BBE-\u0BC2\u0BC6-\u0BC8\u0BCA-\u0BCD\u0BD7\u0C00-\u0C03\u0C3E-\u0C44\u0C46-\u0C48\u0C4A-\u0C4D\u0C55\u0C56\u0C62\u0C63\u0C81-\u0C83\u0CBC\u0CBE-\u0CC4\u0CC6-\u0CC8\u0CCA-\u0CCD\u0CD5\u0CD6\u0CE2\u0CE3\u0D01-\u0D03\u0D3E-\u0D44\u0D46-\u0D48\u0D4A-\u0D4D\u0D57\u0D62\u0D63\u0D82\u0D83\u0DCA\u0DCF-\u0DD4\u0DD6\u0DD8-\u0DDF\u0DF2\u0DF3\u0E31\u0E34-\u0E3A\u0E47-\u0E4E\u0EB1\u0EB4-\u0EB9\u0EBB\u0EBC\u0EC8-\u0ECD\u0F18\u0F19\u0F35\u0F37\u0F39\u0F3E\u0F3F\u0F71-\u0F84\u0F86\u0F87\u0F8D-\u0F97\u0F99-\u0FBC\u0FC6\u102B-\u103E\u1056-\u1059\u105E-\u1060\u1062-\u1064\u1067-\u106D\u1071-\u1074\u1082-\u108D\u108F\u109A-\u109D\u135D-\u135F\u1712-\u1714\u1732-\u1734\u1752\u1753\u1772\u1773\u17B4-\u17D3\u17DD\u180B-\u180D\u1885\u1886\u18A9\u1920-\u192B\u1930-\u193B\u1A17-\u1A1B\u1A55-\u1A5E\u1A60-\u1A7C\u1A7F\u1AB0-\u1ABE\u1B00-\u1B04\u1B34-\u1B44\u1B6B-\u1B73\u1B80-\u1B82\u1BA1-\u1BAD\u1BE6-\u1BF3\u1C24-\u1C37\u1CD0-\u1CD2\u1CD4-\u1CE8\u1CED\u1CF2-\u1CF4\u1CF8\u1CF9\u1DC0-\u1DF5\u1DFB-\u1DFF\u20D0-\u20F0\u2CEF-\u2CF1\u2D7F\u2DE0-\u2DFF\u302A-\u302F\u3099\u309A\uA66F-\uA672\uA674-\uA67D\uA69E\uA69F\uA6F0\uA6F1\uA802\uA806\uA80B\uA823-\uA827\uA880\uA881\uA8B4-\uA8C5\uA8E0-\uA8F1\uA926-\uA92D\uA947-\uA953\uA980-\uA983\uA9B3-\uA9C0\uA9E5\uAA29-\uAA36\uAA43\uAA4C\uAA4D\uAA7B-\uAA7D\uAAB0\uAAB2-\uAAB4\uAAB7\uAAB8\uAABE\uAABF\uAAC1\uAAEB-\uAAEF\uAAF5\uAAF6\uABE3-\uABEA\uABEC\uABED\uFB1E\uFE00-\uFE0F\uFE20-\uFE2F/.source,unt=Vbe+lnt+dnt,Lbe=/0-9\u0660-\u0669\u06F0-\u06F9\u07C0-\u07C9\u0966-\u096F\u09E6-\u09EF\u0A66-\u0A6F\u0AE6-\u0AEF\u0B66-\u0B6F\u0BE6-\u0BEF\u0C66-\u0C6F\u0CE6-\u0CEF\u0D66-\u0D6F\u0DE6-\u0DEF\u0E50-\u0E59\u0ED0-\u0ED9\u0F20-\u0F29\u1040-\u1049\u1090-\u1099\u17E0-\u17E9\u1810-\u1819\u1946-\u194F\u19D0-\u19D9\u1A80-\u1A89\u1A90-\u1A99\u1B50-\u1B59\u1BB0-\u1BB9\u1C40-\u1C49\u1C50-\u1C59\uA620-\uA629\uA8D0-\uA8D9\uA900-\uA909\uA9D0-\uA9D9\uA9F0-\uA9F9\uAA50-\uAA59\uABF0-\uABF9\uFF10-\uFF19/.source,mbi=new RegExp("[".concat(Vbe+Lbe,"]")),b4=unt+Lbe,vh=new RegExp("[".concat(b4,"]"));var xD=function(){function e(t){t===void 0&&(t={}),this.tagName="",this.attrs={},this.innerHTML="",this.tagName=t.tagName||"",this.attrs=t.attrs||{},this.innerHTML=t.innerHtml||t.innerHTML||""}return e.prototype.setTagName=function(t){return this.tagName=t,this},e.prototype.getTagName=function(){return this.tagName||""},e.prototype.setAttr=function(t,n){var i=this.getAttrs();return i[t]=n,this},e.prototype.getAttr=function(t){return this.getAttrs()[t]},e.prototype.setAttrs=function(t){return Object.assign(this.getAttrs(),t),this},e.prototype.getAttrs=function(){return this.attrs||(this.attrs={})},e.prototype.setClass=function(t){return this.setAttr("class",t)},e.prototype.addClass=function(t){for(var n=this.getClass(),i=n?n.split(zd):[],o=t.split(zd),r;r=o.shift();)i.indexOf(r)===-1&&i.push(r);return this.getAttrs().class=i.join(" "),this},e.prototype.removeClass=function(t){for(var n=this.getClass(),i=n?n.split(zd):[],o=t.split(zd),r;i.length&&(r=o.shift());){var s=i.indexOf(r);s!==-1&&i.splice(s,1)}return this.getAttrs().class=i.join(" "),this},e.prototype.getClass=function(){return this.getAttrs().class||""},e.prototype.hasClass=function(t){return(" "+this.getClass()+" ").indexOf(" "+t+" ")!==-1},e.prototype.setInnerHTML=function(t){return this.innerHTML=t,this},e.prototype.setInnerHtml=function(t){return this.setInnerHTML(t)},e.prototype.getInnerHTML=function(){return this.innerHTML||""},e.prototype.getInnerHtml=function(){return this.getInnerHTML()},e.prototype.toAnchorString=function(){var t=this.getTagName(),n=this.buildAttrsStr();return n=n?" "+n:"",["<",t,n,">",this.getInnerHtml(),""].join("")},e.prototype.buildAttrsStr=function(){if(!this.attrs)return"";var t=this.getAttrs(),n=[];for(var i in t)t.hasOwnProperty(i)&&n.push(i+'="'+t[i]+'"');return n.join(" ")},e}();var xbi=T(S());function Rbe(e,t,n){var i,o;n==null?(n="…",o=3,i=8):(o=n.length,i=n.length);var r=function(V){var L={},R=V,G=R.match(/^([a-z]+):\/\//i);return G&&(L.scheme=G[1],R=R.substr(G[0].length)),G=R.match(/^(.*?)(?=(\?|#|\/|$))/i),G&&(L.host=G[1],R=R.substr(G[0].length)),G=R.match(/^\/(.*?)(?=(\?|#|$))/i),G&&(L.path=G[1],R=R.substr(G[0].length)),G=R.match(/^\?(.*?)(?=(#|$))/i),G&&(L.query=G[1],R=R.substr(G[0].length)),G=R.match(/^#(.*?)$/i),G&&(L.fragment=G[1]),L},s=function(V){var L="";return V.scheme&&V.host&&(L+=V.scheme+"://"),V.host&&(L+=V.host),V.path&&(L+="/"+V.path),V.query&&(L+="?"+V.query),V.fragment&&(L+="#"+V.fragment),L},a=function(V,L){var R=L/2,G=Math.ceil(R),I=-1*Math.floor(R),v="";return I<0&&(v=V.substr(I)),V.substr(0,G)+n+v};if(e.length<=t)return e;var c=t-o,d=r(e);if(d.query){var u=d.query.match(/^(.*?)(?=(\?|\#))(.*?)$/i);u&&(d.query=d.query.substr(0,u[1].length),e=s(d))}if(e.length<=t||(d.host&&(d.host=d.host.replace(/^www\./,""),e=s(d)),e.length<=t))return e;var h="";if(d.host&&(h+=d.host),h.length>=c)return d.host.length==t?(d.host.substr(0,t-o)+n).substr(0,c+i):a(h,c).substr(0,c+i);var p="";if(d.path&&(p+="/"+d.path),d.query&&(p+="?"+d.query),p)if((h+p).length>=c){if((h+p).length==t)return(h+p).substr(0,t);var g=c-h.length;return(h+a(p,g)).substr(0,c+i)}else h+=p;if(d.fragment){var f="#"+d.fragment;if((h+f).length>=c){if((h+f).length==t)return(h+f).substr(0,t);var x=c-h.length;return(h+a(f,x)).substr(0,c+i)}else h+=f}if(d.scheme&&d.host){var _=d.scheme+"://";if((h+_).length0&&(C=h.substr(-1*Math.floor(c/2))),(h.substr(0,Math.ceil(c/2))+n+C).substr(0,c+i)}var Tbi=T(S());function Zbe(e,t,n){if(e.length<=t)return e;var i,o;n==null?(n="…",i=8,o=3):(i=n.length,o=n.length);var r=t-o,s="";return r>0&&(s=e.substr(-1*Math.floor(r/2))),(e.substr(0,Math.ceil(r/2))+n+s).substr(0,r+i)}var Vbi=T(S());function Gbe(e,t,n){return Sbe(e,t,n)}var Ebe=function(){function e(t){t===void 0&&(t={}),this.newWindow=!1,this.truncate={},this.className="",this.newWindow=t.newWindow||!1,this.truncate=t.truncate||{},this.className=t.className||""}return e.prototype.build=function(t){return new xD({tagName:"a",attrs:this.createAttrs(t),innerHtml:this.processAnchorText(t.getAnchorText())})},e.prototype.createAttrs=function(t){var n={href:t.getAnchorHref()},i=this.createCssClass(t);return i&&(n.class=i),this.newWindow&&(n.target="_blank",n.rel="noopener noreferrer"),this.truncate&&this.truncate.length&&this.truncate.length=0;g--){var f=u[g];switch(f.state){case 11:v(f,p);break;case 12:P(f,p);break;case 0:V(f,p);break;case 1:L(f,p);break;case 2:R(f,p);break;case 3:G(f,p);break;case 4:I(f,p);break;case 5:w(f,p);break;case 6:A(f,p);break;case 7:b(f,p);break;case 13:Z(f,p);break;case 14:E(f,p);break;case 8:X(f,p);break;case 9:F(f,p);break;case 10:N(f,p);break;case 15:O(f,p);break;case 16:U(f,p);break;case 17:Y(f,p);break;case 18:k(f,p);break;case 19:H(f,p);break;case 20:K(f,p);break;case 21:te(f,p);break;case 22:z(f,p);break;case 23:j(f,p);break;case 24:ee(f,p);break;case 25:pe(f,p);break;case 26:_e(f,p);break;case 27:ae(f,p);break;case 28:ye(f,p);break;case 29:Se(f,p);break;case 30:Ee(f,p);break;case 31:Ie(f,p);break;case 32:ve(f,p);break;case 33:at(f,p);break;case 34:Je(f,p);break;case 35:pt(f,p);break;case 36:Qe(f,p);break;case 37:we(f,p);break;case 38:_t(f,p);break;case 39:ht(f,p);break;case 40:bt(f,p);break;case 41:En(f,p);break;default:Qf(f.state)}}if(h>0&&DV(p)){var x=e.charAt(h-1);!DV(x)&&!u.some(Dnt)&&u.push(VD(h,0))}}}for(var _=u.length-1;_>=0;_--)u.forEach(function(Ce){return sn(Ce)});return c;function C(Ce){if(Ce==="#")u.push(knt(h,28));else if(Ce==="@")u.push(Unt(h,30));else if(Ce==="/")u.push(L4(h,11));else if(Ce==="+")u.push(R4(h,37));else if(Ce==="(")u.push(R4(h,32));else{if(na.test(Ce)&&(u.push(R4(h,38)),u.push(Mnt(h,13))),Nbe(Ce)){var Le=Ce.toLowerCase()==="m"?15:22;u.push(Nnt(h,Le))}DV(Ce)&&u.push(VD(h,0)),vh.test(Ce)&&u.push(L4(h,5))}}function V(Ce,Le){Le===":"?Ce.state=2:Le==="-"?Ce.state=1:x4(Le)||Ko(u,Ce)}function L(Ce,Le){Le==="-"||(Le==="/"?(Ko(u,Ce),u.push(L4(h,11))):x4(Le)?Ce.state=0:Ko(u,Ce))}function R(Ce,Le){Le==="/"?Ce.state=3:Le==="."?Ko(u,Ce):m0(Le)?(Ce.state=5,DV(Le)&&u.push(VD(h,0))):Ko(u,Ce)}function G(Ce,Le){Le==="/"?Ce.state=4:_4(Le)?(Ce.state=10,Ce.acceptStateReached=!0):sn(Ce)}function I(Ce,Le){Le==="/"?Ce.state=10:m0(Le)?(Ce.state=5,Ce.acceptStateReached=!0):Ko(u,Ce)}function v(Ce,Le){Le==="/"?Ce.state=12:Ko(u,Ce)}function P(Ce,Le){m0(Le)?Ce.state=5:Ko(u,Ce)}function w(Ce,Le){Le==="."?Ce.state=7:Le==="-"?Ce.state=6:Le===":"?Ce.state=8:TD(Le)?Ce.state=10:_D(Le)||sn(Ce)}function A(Ce,Le){Le==="-"||(Le==="."?sn(Ce):m0(Le)?Ce.state=5:sn(Ce))}function b(Ce,Le){Le==="."?sn(Ce):m0(Le)?(Ce.state=5,Ce.acceptStateReached=!0):sn(Ce)}function Z(Ce,Le){Le==="."?Ce.state=14:Le===":"?Ce.state=8:na.test(Le)||(TD(Le)?Ce.state=10:vh.test(Le)?Ko(u,Ce):sn(Ce))}function E(Ce,Le){na.test(Le)?(Ce.octetsEncountered++,Ce.octetsEncountered===4&&(Ce.acceptStateReached=!0),Ce.state=13):sn(Ce)}function X(Ce,Le){na.test(Le)?Ce.state=9:sn(Ce)}function F(Ce,Le){na.test(Le)||(TD(Le)?Ce.state=10:sn(Ce))}function N(Ce,Le){_4(Le)||sn(Ce)}function O(Ce,Le){Le.toLowerCase()==="a"?Ce.state=16:z(Ce,Le)}function U(Ce,Le){Le.toLowerCase()==="i"?Ce.state=17:z(Ce,Le)}function Y(Ce,Le){Le.toLowerCase()==="l"?Ce.state=18:z(Ce,Le)}function k(Ce,Le){Le.toLowerCase()==="t"?Ce.state=19:z(Ce,Le)}function H(Ce,Le){Le.toLowerCase()==="o"?Ce.state=20:z(Ce,Le)}function K(Ce,Le){Le.toLowerCase()===":"?Ce.state=21:z(Ce,Le)}function te(Ce,Le){SD(Le)?Ce.state=22:Ko(u,Ce)}function z(Ce,Le){Le==="."?Ce.state=23:Le==="@"?Ce.state=24:SD(Le)?Ce.state=22:Ko(u,Ce)}function j(Ce,Le){Le==="."?Ko(u,Ce):Le==="@"?Ko(u,Ce):SD(Le)?Ce.state=22:Ko(u,Ce)}function ee(Ce,Le){m0(Le)?Ce.state=25:Ko(u,Ce)}function pe(Ce,Le){Le==="."?Ce.state=27:Le==="-"?Ce.state=26:_D(Le)||sn(Ce)}function _e(Ce,Le){Le==="-"||Le==="."?sn(Ce):_D(Le)?Ce.state=25:sn(Ce)}function ae(Ce,Le){Le==="."||Le==="-"?sn(Ce):m0(Le)?(Ce.state=25,Ce.acceptStateReached=!0):sn(Ce)}function ye(Ce,Le){S4(Le)?(Ce.state=29,Ce.acceptStateReached=!0):Ko(u,Ce)}function Se(Ce,Le){S4(Le)||sn(Ce)}function Ee(Ce,Le){C4(Le)?(Ce.state=31,Ce.acceptStateReached=!0):Ko(u,Ce)}function Ie(Ce,Le){C4(Le)||(vh.test(Le)?Ko(u,Ce):sn(Ce))}function we(Ce,Le){na.test(Le)?Ce.state=38:(Ko(u,Ce),C(Le))}function ve(Ce,Le){na.test(Le)?Ce.state=33:Ko(u,Ce),C(Le)}function at(Ce,Le){na.test(Le)?Ce.state=34:Ko(u,Ce)}function Je(Ce,Le){na.test(Le)?Ce.state=35:Ko(u,Ce)}function pt(Ce,Le){Le===")"?Ce.state=36:Ko(u,Ce)}function Qe(Ce,Le){na.test(Le)?Ce.state=38:V4(Le)?Ce.state=39:Ko(u,Ce)}function _t(Ce,Le){Ce.acceptStateReached=!0,CD(Le)?Ce.state=40:Le==="#"?Ce.state=41:na.test(Le)||(Le==="("?Ce.state=32:V4(Le)?Ce.state=39:(sn(Ce),DV(Le)&&u.push(VD(h,0))))}function ht(Ce,Le){na.test(Le)?Ce.state=38:Le==="("?Ce.state=32:(sn(Ce),C(Le))}function bt(Ce,Le){CD(Le)||(Le==="#"?Ce.state=41:na.test(Le)?Ce.state=38:sn(Ce))}function En(Ce,Le){CD(Le)?Ce.state=40:na.test(Le)?Ko(u,Ce):sn(Ce)}function sn(Ce){if(Ko(u,Ce),!!Ce.acceptStateReached){var Le=Ce.startIdx,wn=e.slice(Ce.startIdx,h);if(wn=Ant(wn),Ce.type==="url"){var Mo=e.charAt(Ce.startIdx-1);if(Mo==="@")return;var Jo=Ce.matchType;if(Jo==="scheme"){var Xr=y4.exec(wn);if(Xr&&(Le=Le+Xr.index,wn=wn.slice(Xr.index)),!vbe(wn))return}else if(Jo==="tld"){if(!wbe(wn))return}else if(Jo==="ipV4"){if(!Fbe(wn))return}else Qf(Jo);c.push(new Abe({tagBuilder:n,matchedText:wn,offset:Le,urlMatchType:Jo,url:wn,protocolRelativeMatch:wn.slice(0,2)==="//",stripPrefix:i,stripTrailingSlash:o,decodePercentEncoding:r}))}else if(Ce.type==="email")kbe(wn)&&c.push(new Ube({tagBuilder:n,matchedText:wn,offset:Le,email:wn.replace(Mbe,"")}));else if(Ce.type==="hashtag")Dbe(wn)&&c.push(new Obe({tagBuilder:n,matchedText:wn,offset:Le,serviceName:s,hashtag:wn.slice(1)}));else if(Ce.type==="mention")Ybe(wn,a)&&c.push(new zbe({tagBuilder:n,matchedText:wn,offset:Le,serviceName:a,mention:wn.slice(1)}));else if(Ce.type==="phone"){if(wn=wn.replace(/ +$/g,""),Kbe(wn)){var da=wn.replace(/[^0-9,;#]/g,"");c.push(new Jbe({tagBuilder:n,matchedText:wn,offset:Le,number:da,plusSign:wn.charAt(0)==="+"}))}}else Qf(Ce)}}}var Fnt=/[\(\{\[]/,Qbe=/[\)\}\]]/,jbe={")":"(","}":"{","]":"["};function Ant(e){for(var t={"(":0,"{":0,"[":0},n=0;n=0;)if(r=e.charAt(o),Qbe.test(r)){var s=jbe[r];if(t[s]<0)t[s]++,o--;else break}else if(Pbe.test(r))o--;else break;return e.slice(0,o+1)}function VD(e,t){return{type:"url",startIdx:e,state:t,acceptStateReached:!1,matchType:"scheme"}}function L4(e,t){return{type:"url",startIdx:e,state:t,acceptStateReached:!1,matchType:"tld"}}function Mnt(e,t){return{type:"url",startIdx:e,state:t,acceptStateReached:!1,matchType:"ipV4",octetsEncountered:1}}function Nnt(e,t){return{type:"email",startIdx:e,state:t,acceptStateReached:!1}}function knt(e,t){return{type:"hashtag",startIdx:e,state:t,acceptStateReached:!1}}function Unt(e,t){return{type:"mention",startIdx:e,state:t,acceptStateReached:!1}}function R4(e,t){return{type:"phone",startIdx:e,state:t,acceptStateReached:!1}}function Dnt(e){return e.type==="url"&&e.matchType==="scheme"}var N0i=T(S());function $be(e,t){for(var n=t.onOpenTag,i=t.onCloseTag,o=t.onText,r=t.onComment,s=t.onDoctype,a=new $f,c=0,d=e.length,u=0,h=0,p=a;c"?(p=new $f(ia(ia({},p),{name:te()})),H()):!Ly.test(j)&&!na.test(j)&&j!==":"&&Y()}function C(j){j===">"?Y():Ly.test(j)?u=3:Y()}function V(j){zd.test(j)||(j==="/"?u=12:j===">"?H():j==="<"?k():j==="="||yD.test(j)||Cbe.test(j)?Y():u=5)}function L(j){zd.test(j)?u=6:j==="/"?u=12:j==="="?u=7:j===">"?H():j==="<"?k():yD.test(j)&&Y()}function R(j){zd.test(j)||(j==="/"?u=12:j==="="?u=7:j===">"?H():j==="<"?k():yD.test(j)?Y():u=5)}function G(j){zd.test(j)||(j==='"'?u=8:j==="'"?u=9:/[>=`]/.test(j)?Y():j==="<"?k():u=10)}function I(j){j==='"'&&(u=11)}function v(j){j==="'"&&(u=11)}function P(j){zd.test(j)?u=4:j===">"?H():j==="<"&&k()}function w(j){zd.test(j)?u=4:j==="/"?u=12:j===">"?H():j==="<"?k():(u=4,z())}function A(j){j===">"?(p=new $f(ia(ia({},p),{isClosing:!0})),H()):u=4}function b(j){e.substr(c,2)==="--"?(c+=2,p=new $f(ia(ia({},p),{type:"comment"})),u=14):e.substr(c,7).toUpperCase()==="DOCTYPE"?(c+=7,p=new $f(ia(ia({},p),{type:"doctype"})),u=20):Y()}function Z(j){j==="-"?u=15:j===">"?Y():u=16}function E(j){j==="-"?u=18:j===">"?Y():u=16}function X(j){j==="-"&&(u=17)}function F(j){j==="-"?u=18:u=16}function N(j){j===">"?H():j==="!"?u=19:j==="-"||(u=16)}function O(j){j==="-"?u=17:j===">"?H():u=16}function U(j){j===">"?H():j==="<"&&k()}function Y(){u=0,p=a}function k(){u=1,p=new $f({idx:c})}function H(){var j=e.slice(h,p.idx);j&&o(j,h),p.type==="comment"?r(p.idx):p.type==="doctype"?s(p.idx):(p.isOpening&&n(p.name,p.idx),p.isClosing&&i(p.name,p.idx)),Y(),h=c+1}function K(){var j=e.slice(h,c);o(j,h),h=c+1}function te(){var j=p.idx+(p.isClosing?2:1);return e.slice(j,c).toLowerCase()}function z(){c--}}var $f=function(){function e(t){t===void 0&&(t={}),this.idx=t.idx!==void 0?t.idx:-1,this.type=t.type||"tag",this.name=t.name||"",this.isOpening=!!t.isOpening,this.isClosing=!!t.isClosing}return e}();var Bnt=function(){function e(t){t===void 0&&(t={}),this.version=e.version,this.urls={},this.email=!0,this.phone=!0,this.hashtag=!1,this.mention=!1,this.newWindow=!0,this.stripPrefix={scheme:!0,www:!0},this.stripTrailingSlash=!0,this.decodePercentEncoding=!0,this.truncate={length:0,location:"end"},this.className="",this.replaceFn=null,this.context=void 0,this.sanitizeHtml=!1,this.tagBuilder=null,this.urls=Ont(t.urls),this.email=Hd(t.email)?t.email:this.email,this.phone=Hd(t.phone)?t.phone:this.phone,this.hashtag=t.hashtag||this.hashtag,this.mention=t.mention||this.mention,this.newWindow=Hd(t.newWindow)?t.newWindow:this.newWindow,this.stripPrefix=Ynt(t.stripPrefix),this.stripTrailingSlash=Hd(t.stripTrailingSlash)?t.stripTrailingSlash:this.stripTrailingSlash,this.decodePercentEncoding=Hd(t.decodePercentEncoding)?t.decodePercentEncoding:this.decodePercentEncoding,this.sanitizeHtml=t.sanitizeHtml||!1;var n=this.mention;if(n!==!1&&Hbe.indexOf(n)===-1)throw new Error("invalid `mention` cfg '".concat(n,"' - see docs"));var i=this.hashtag;if(i!==!1&&Bbe.indexOf(i)===-1)throw new Error("invalid `hashtag` cfg '".concat(i,"' - see docs"));this.truncate=Hnt(t.truncate),this.className=t.className||this.className,this.replaceFn=t.replaceFn||this.replaceFn,this.context=t.context||this}return e.link=function(t,n){var i=new e(n);return i.link(t)},e.parse=function(t,n){var i=new e(n);return i.parse(t)},e.prototype.parse=function(t){var n=this,i=["a","style","script"],o=0,r=[];return $be(t,{onOpenTag:function(s){i.indexOf(s)>=0&&o++},onText:function(s,a){if(o===0){var c=/( | |<|<|>|>|"|"|')/gi,d=s.split(c),u=a;d.forEach(function(h,p){if(p%2===0){var g=n.parseText(h,u);r.push.apply(r,g)}u+=h.length})}},onCloseTag:function(s){i.indexOf(s)>=0&&(o=Math.max(o-1,0))},onComment:function(s){},onDoctype:function(s){}}),r=this.compactMatches(r),r=this.removeUnwantedMatches(r),r},e.prototype.compactMatches=function(t){t.sort(function(c,d){return c.getOffset()-d.getOffset()});for(var n=0;nr?n:n+1;t.splice(a,1);continue}if(t[n+1].getOffset()/g,">"));for(var n=this.parse(t),i=[],o=0,r=0,s=n.length;r{let i=new FileReader;i.addEventListener("load",function(){t(i.result)}),i.addEventListener("error",function(){n(i.error)}),i.readAsText(e)})}function Z4(e,t){let n=bw(e,"id");return n=l(n)?n:Jn(),t.getOrCreateEntity(n)}function G4(e){let t=r0e(e,"lon"),n=r0e(e,"lat"),i=fw(e,"ele",Zo.gpx);return m.fromDegrees(t,n,i)}function r0e(e,t){if(!l(e))return;let n=e.getAttribute(t);if(n!==null){let i=parseFloat(n);return isNaN(i)?void 0:i}}function bw(e,t){if(!l(e))return;let n=e.getAttribute(t);return n!==null?n:void 0}function Ry(e,t,n){if(!l(e))return;let i=e.childNodes,o=i.length;for(let r=0;r${h.text}: ${h.value}

`)}if(!l(i)||i==="")return;i=znt.link(i),pw.innerHTML=i;let s=pw.querySelectorAll("a");for(n=0;n',d+=`${pw.innerHTML}`,pw.innerHTML="",d}function m0e(e,t,n,i){let o=G4(t),r=Z4(t,n);r.position=o;let s=l(i.waypointImage)?i.waypointImage:e._pinBuilder.fromMakiIconId("marker",B.RED,RD);r.billboard=d0e(s);let a=$l(t,"name",Zo.gpx);r.name=a,r.label=Qnt(),r.label.text=a,r.description=I4(t,r),i.clampToGround&&(r.billboard.heightReference=Ke.CLAMP_TO_GROUND,r.label.heightReference=Ke.CLAMP_TO_GROUND)}function jnt(e,t,n,i){let o=Z4(t,n);o.description=I4(t,o);let r=E4(t,"rtept",Zo.gpx),s=new Array(r.length);for(let a=0;a0?(a=a.concat(c.times),u.addSamples(a,s),d=d&&!0):d=!1;if(d){let h=l(i.waypointImage)?i.waypointImage:e._pinBuilder.fromMakiIconId("marker",B.RED,RD);o.billboard=d0e(h),o.position=u,i.clampToGround&&(o.billboard.heightReference=Ke.CLAMP_TO_GROUND),o.availability=new Hr,o.availability.addInterval(new Cn({start:a[0],stop:a[a.length-1]}))}o.polyline=u0e(i.trackColor),o.polyline.positions=s,i.clampToGround&&(o.polyline.clampToGround=!0)}function $nt(e){let t={positions:[],times:[]},n=E4(e,"trkpt",Zo.gpx),i;for(let o=0;o=0&&r._activeEntries.splice(s,1)}),o(e,t,n)}}else l(n)&&n(!1)}function dit(e,t,n,i){let o=this.playlist[this.playlistIndex];if(this.entryEnd.raiseEvent(o,i),i)n(i);else{let r=this._activeEntries.indexOf(o);r>=0&&this._activeEntries.splice(r,1),this.playlistIndex++,p0e.call(this,e,t,n)}}var _w=ZD;var Syi=T(S(),1);var byi=T(S(),1);var hyi=T(S(),1),Fi=Object.freeze({Linear:Object.freeze({None:function(e){return e},In:function(e){return e},Out:function(e){return e},InOut:function(e){return e}}),Quadratic:Object.freeze({In:function(e){return e*e},Out:function(e){return e*(2-e)},InOut:function(e){return(e*=2)<1?.5*e*e:-.5*(--e*(e-2)-1)}}),Cubic:Object.freeze({In:function(e){return e*e*e},Out:function(e){return--e*e*e+1},InOut:function(e){return(e*=2)<1?.5*e*e*e:.5*((e-=2)*e*e+2)}}),Quartic:Object.freeze({In:function(e){return e*e*e*e},Out:function(e){return 1- --e*e*e*e},InOut:function(e){return(e*=2)<1?.5*e*e*e*e:-.5*((e-=2)*e*e*e-2)}}),Quintic:Object.freeze({In:function(e){return e*e*e*e*e},Out:function(e){return--e*e*e*e*e+1},InOut:function(e){return(e*=2)<1?.5*e*e*e*e*e:.5*((e-=2)*e*e*e*e+2)}}),Sinusoidal:Object.freeze({In:function(e){return 1-Math.sin((1-e)*Math.PI/2)},Out:function(e){return Math.sin(e*Math.PI/2)},InOut:function(e){return .5*(1-Math.sin(Math.PI*(.5-e)))}}),Exponential:Object.freeze({In:function(e){return e===0?0:Math.pow(1024,e-1)},Out:function(e){return e===1?1:1-Math.pow(2,-10*e)},InOut:function(e){return e===0?0:e===1?1:(e*=2)<1?.5*Math.pow(1024,e-1):.5*(-Math.pow(2,-10*(e-1))+2)}}),Circular:Object.freeze({In:function(e){return 1-Math.sqrt(1-e*e)},Out:function(e){return Math.sqrt(1- --e*e)},InOut:function(e){return(e*=2)<1?-.5*(Math.sqrt(1-e*e)-1):.5*(Math.sqrt(1-(e-=2)*e)+1)}}),Elastic:Object.freeze({In:function(e){return e===0?0:e===1?1:-Math.pow(2,10*(e-1))*Math.sin((e-1.1)*5*Math.PI)},Out:function(e){return e===0?0:e===1?1:Math.pow(2,-10*e)*Math.sin((e-.1)*5*Math.PI)+1},InOut:function(e){return e===0?0:e===1?1:(e*=2,e<1?-.5*Math.pow(2,10*(e-1))*Math.sin((e-1.1)*5*Math.PI):.5*Math.pow(2,-10*(e-1))*Math.sin((e-1.1)*5*Math.PI)+1)}}),Back:Object.freeze({In:function(e){var t=1.70158;return e===1?1:e*e*((t+1)*e-t)},Out:function(e){var t=1.70158;return e===0?0:--e*e*((t+1)*e+t)+1},InOut:function(e){var t=2.5949095;return(e*=2)<1?.5*(e*e*((t+1)*e-t)):.5*((e-=2)*e*((t+1)*e+t)+2)}}),Bounce:Object.freeze({In:function(e){return 1-Fi.Bounce.Out(1-e)},Out:function(e){return e<.36363636363636365?7.5625*e*e:e<.7272727272727273?7.5625*(e-=.5454545454545454)*e+.75:e<.9090909090909091?7.5625*(e-=.8181818181818182)*e+.9375:7.5625*(e-=.9545454545454546)*e+.984375},InOut:function(e){return e<.5?Fi.Bounce.In(e*2)*.5:Fi.Bounce.Out(e*2-1)*.5+.5}}),generatePow:function(e){return e===void 0&&(e=4),e=e1e4?1e4:e,{In:function(t){return Math.pow(t,e)},Out:function(t){return 1-Math.pow(1-t,e)},InOut:function(t){return t<.5?Math.pow(t*2,e)/2:(1-Math.pow(2-t*2,e))/2+.5}}}}),Tw=function(){return performance.now()},uit=function(){function e(){for(var t=[],n=0;n0;){this._tweensAddedDuringUpdate={};for(var o=0;o1?r(e[n],e[n-1],n-i):r(e[o],e[o+1>n?n:o+1],i-o)},Bezier:function(e,t){for(var n=0,i=e.length-1,o=Math.pow,r=OV.Utils.Bernstein,s=0;s<=i;s++)n+=o(1-t,i-s)*o(t,s)*e[s]*r(i,s);return n},CatmullRom:function(e,t){var n=e.length-1,i=n*t,o=Math.floor(i),r=OV.Utils.CatmullRom;return e[0]===e[n]?(t<0&&(o=Math.floor(i=n*(1+t))),r(e[(o-1+n)%n],e[o],e[(o+1)%n],e[(o+2)%n],i-o)):t<0?e[0]-(r(e[0],e[0],e[1],e[1],-i)-e[0]):t>1?e[n]-(r(e[n],e[n],e[n-1],e[n-1],i-n)-e[n]):r(e[o?o-1:0],e[o],e[n1;i--)n*=i;return e[t]=n,n}}(),CatmullRom:function(e,t,n,i,o){var r=(n-e)*.5,s=(i-t)*.5,a=o*o,c=o*a;return(2*t-2*n+r+s)*c+(-3*t+3*n-2*r-s)*a+r*o+t}}},b0e=function(){function e(){}return e.nextId=function(){return e._nextId++},e._nextId=0,e}(),X4=new uit,g0e=function(){function e(t,n){this._isPaused=!1,this._pauseStart=0,this._valuesStart={},this._valuesEnd={},this._valuesStartRepeat={},this._duration=1e3,this._isDynamic=!1,this._initialRepeat=0,this._repeat=0,this._yoyo=!1,this._isPlaying=!1,this._reversed=!1,this._delayTime=0,this._startTime=0,this._easingFunction=Fi.Linear.None,this._interpolationFunction=OV.Linear,this._chainedTweens=[],this._onStartCallbackFired=!1,this._onEveryStartCallbackFired=!1,this._id=b0e.nextId(),this._isChainStopped=!1,this._propertiesAreSetUp=!1,this._goToEnd=!1,this._object=t,typeof n=="object"?(this._group=n,n.add(this)):n===!0&&(this._group=X4,X4.add(this))}return e.prototype.getId=function(){return this._id},e.prototype.isPlaying=function(){return this._isPlaying},e.prototype.isPaused=function(){return this._isPaused},e.prototype.getDuration=function(){return this._duration},e.prototype.to=function(t,n){if(n===void 0&&(n=1e3),this._isPlaying)throw new Error("Can not call Tween.to() while Tween is already started or paused. Stop the Tween first.");return this._valuesEnd=t,this._propertiesAreSetUp=!1,this._duration=n<0?0:n,this},e.prototype.duration=function(t){return t===void 0&&(t=1e3),this._duration=t<0?0:t,this},e.prototype.dynamic=function(t){return t===void 0&&(t=!1),this._isDynamic=t,this},e.prototype.start=function(t,n){if(t===void 0&&(t=Tw()),n===void 0&&(n=!1),this._isPlaying)return this;if(this._repeat=this._initialRepeat,this._reversed){this._reversed=!1;for(var i in this._valuesStartRepeat)this._swapEndStartRepeatValues(i),this._valuesStart[i]=this._valuesStartRepeat[i]}if(this._isPlaying=!0,this._isPaused=!1,this._onStartCallbackFired=!1,this._onEveryStartCallbackFired=!1,this._isChainStopped=!1,this._startTime=t,this._startTime+=this._delayTime,!this._propertiesAreSetUp||n){if(this._propertiesAreSetUp=!0,!this._isDynamic){var o={};for(var r in this._valuesEnd)o[r]=this._valuesEnd[r];this._valuesEnd=o}this._setupProperties(this._object,this._valuesStart,this._valuesEnd,this._valuesStartRepeat,n)}return this},e.prototype.startFromCurrentValues=function(t){return this.start(t,!0)},e.prototype._setupProperties=function(t,n,i,o,r){for(var s in i){var a=t[s],c=Array.isArray(a),d=c?"array":typeof a,u=!c&&Array.isArray(i[s]);if(!(d==="undefined"||d==="function")){if(u){var h=i[s];if(h.length===0)continue;for(var p=[a],g=0,f=h.length;g"u"||r)&&(n[s]=a),c||(n[s]*=1),u?o[s]=i[s].slice().reverse():o[s]=n[s]||0}}},e.prototype.stop=function(){return this._isChainStopped||(this._isChainStopped=!0,this.stopChainedTweens()),this._isPlaying?(this._isPlaying=!1,this._isPaused=!1,this._onStopCallback&&this._onStopCallback(this._object),this):this},e.prototype.end=function(){return this._goToEnd=!0,this.update(this._startTime+this._duration),this},e.prototype.pause=function(t){return t===void 0&&(t=Tw()),this._isPaused||!this._isPlaying?this:(this._isPaused=!0,this._pauseStart=t,this)},e.prototype.resume=function(t){return t===void 0&&(t=Tw()),!this._isPaused||!this._isPlaying?this:(this._isPaused=!1,this._startTime+=t-this._pauseStart,this._pauseStart=0,this)},e.prototype.stopChainedTweens=function(){for(var t=0,n=this._chainedTweens.length;tc)return 1;var x=Math.trunc(s/a),_=s-x*a,C=Math.min(_/i._duration,1);return C===0&&s===i._duration?1:C},u=d(),h=this._easingFunction(u);if(this._updateProperties(this._object,this._valuesStart,this._valuesEnd,h),this._onUpdateCallback&&this._onUpdateCallback(this._object,u),this._duration===0||s>=this._duration)if(this._repeat>0){var p=Math.min(Math.trunc((s-this._duration)/a)+1,this._repeat);isFinite(this._repeat)&&(this._repeat-=p);for(r in this._valuesStartRepeat)!this._yoyo&&typeof this._valuesEnd[r]=="string"&&(this._valuesStartRepeat[r]=this._valuesStartRepeat[r]+parseFloat(this._valuesEnd[r])),this._yoyo&&this._swapEndStartRepeatValues(r),this._valuesStart[r]=this._valuesStartRepeat[r];return this._yoyo&&(this._reversed=!this._reversed),this._startTime+=a*p,this._onRepeatCallback&&this._onRepeatCallback(this._object),this._onEveryStartCallbackFired=!1,!0}else{this._onCompleteCallback&&this._onCompleteCallback(this._object);for(var g=0,f=this._chainedTweens.length;gthis._started+this._timeThreshold)){this._giveUpTime();return}i=this._nextNode()}this._pop()&&e&&this._process(!0)};function pit(e){let t=e.slice(0,Math.min(4,e.size)),n=Ll(),i=new FileReader;return i.addEventListener("load",function(){n.resolve(new DataView(i.result).getUint32(0,!1)===1347093252)}),i.addEventListener("error",function(){n.reject(i.error)}),i.readAsArrayBuffer(t),n.promise}function bit(e){let t=Ll(),n=new FileReader;return n.addEventListener("load",function(){t.resolve(n.result)}),n.addEventListener("error",function(){t.reject(n.error)}),n.readAsText(e),t.promise}function G0e(e){let t={xsi:"http://www.w3.org/2001/XMLSchema-instance"},n,i,o,r;for(let s in t)t.hasOwnProperty(s)&&(o=RegExp(`[< ]${s}:`),r=`xmlns:${s}=`,o.test(e)&&e.indexOf(r)===-1&&(l(n)||(n=e.substr(0,e.indexOf("",t),i,o,r;for(;t!==-1&&t0?(ed.maximumRed=r,ed.red=void 0):(ed.maximumRed=void 0,ed.red=0),o>0?(ed.maximumGreen=o,ed.green=void 0):(ed.maximumGreen=void 0,ed.green=0),i>0?(ed.maximumBlue=i,ed.blue=void 0):(ed.maximumBlue=void 0,ed.blue=0),ed.alpha=n,B.fromRandom(ed)):new B(r,o,i,n)}function MT(e,t,n){let i=Pn(e,t,n);if(l(i))return A4(i,Pn(e,"colorMode",n)==="random")}function yit(e){let t=Ai(e,"TimeStamp",Pe.kmlgx),n=Pn(t,"when",Pe.kmlgx);if(!l(t)||!l(n)||n.length===0)return;let i=q.fromIso8601(n),o=new Hr;return o.addInterval(new Cn({start:i,stop:Be.MAXIMUM_VALUE})),o}function xit(e){let t=Ai(e,"TimeSpan",Pe.kmlgx);if(!l(t))return;let n,i=Ai(t,"begin",Pe.kmlgx),o=l(i)?q.fromIso8601(i.textContent):void 0,r=Ai(t,"end",Pe.kmlgx),s=l(r)?q.fromIso8601(r.textContent):void 0;if(l(o)&&l(s)){if(q.lessThan(s,o)){let a=o;o=s,s=a}n=new Hr,n.addInterval(new Cn({start:o,stop:s}))}else l(o)?(n=new Hr,n.addInterval(new Cn({start:o,stop:Be.MAXIMUM_VALUE}))):l(s)&&(n=new Hr,n.addInterval(new Cn({start:Be.MINIMUM_VALUE,stop:s})));return n}function X0e(){let e=new ec;return e.width=Zy,e.height=Zy,e.scaleByDistance=new Ut(y0e,x0e,_0e,T0e),e.pixelOffsetScaleByDistance=new Ut(y0e,x0e,_0e,T0e),e}function D4(){let e=new Dm;return e.outline=!0,e.outlineColor=B.WHITE,e}function W0e(){let e=new Um;return e.translucencyByDistance=new Ut(3e6,1,5e6,0),e.pixelOffset=new D(17,0),e.horizontalOrigin=xi.LEFT,e.font="16px sans-serif",e.style=Yo.FILL_AND_OUTLINE,e}function B4(e,t,n,i,o){let r=Pn(e,"href",Pe.kml);if(!l(r)||r.length===0)return;if(r.indexOf("root://icons/palette-")===0){let a=r.charAt(21),c=y(ii(e,"x",Pe.gx),0),d=y(ii(e,"y",Pe.gx),0);c=Math.min(c/32,7),d=7-Math.min(d/32,7);let u=8*d+c;r=`https://maps.google.com/mapfiles/kml/pal${a}/icon${u}.png`}let s=U4(r,n,i);if(o){let a=Pn(e,"refreshMode",Pe.kml),c=Pn(e,"viewRefreshMode",Pe.kml);a==="onInterval"||a==="onExpire"?Ct(`kml-refreshMode-${a}`,`KML - Unsupported Icon refreshMode: ${a}`):(c==="onStop"||c==="onRegion")&&Ct(`kml-refreshMode-${c}`,`KML - Unsupported Icon viewRefreshMode: ${c}`);let d=y(Pn(e,"viewBoundScale",Pe.kml),1),u=c==="onStop"?"BBOX=[bboxWest],[bboxSouth],[bboxEast],[bboxNorth]":"",h=y(Pn(e,"viewFormat",Pe.kml),u),p=Pn(e,"httpQuery",Pe.kml);l(h)&&s.setQueryParameters(md(XD(h))),l(p)&&s.setQueryParameters(md(XD(p)));let g=t._ellipsoid;return Y4(s,t.camera,t.canvas,d,t._lastCameraView.bbox,g),s}return s}function _it(e,t,n,i,o){let r=ii(t,"scale",Pe.kml),s=ii(t,"heading",Pe.kml),a=MT(t,"color",Pe.kml),c=Ai(t,"Icon",Pe.kml),d=B4(c,e,i,o,!1);l(c)&&!l(d)&&(d=!1);let u=ii(c,"x",Pe.gx),h=ii(c,"y",Pe.gx),p=ii(c,"w",Pe.gx),g=ii(c,"h",Pe.gx),f=Ai(t,"hotSpot",Pe.kml),x=Gy(f,"x"),_=Gy(f,"y"),C=ws(f,"xunits"),V=ws(f,"yunits"),L=n.billboard;l(L)||(L=X0e(),n.billboard=L),L.image=d,L.scale=r,L.color=a,(l(u)||l(h)||l(p)||l(g))&&(L.imageSubRegion=new He(u,h,p,g)),l(s)&&s!==0&&(L.rotation=W.toRadians(-s),L.alignedAxis=m.UNIT_Z),r=y(r,1);let R,G;l(x)&&(C==="pixels"?R=-x*r:C==="insetPixels"?R=(x-Zy)*r:C==="fraction"&&(R=-x*Zy*r),R+=Zy*.5*r),l(_)&&(V==="pixels"?G=_*r:V==="insetPixels"?G=(-_+Zy)*r:V==="fraction"&&(G=_*Zy*r),G-=Zy*.5*r),(l(R)||l(G))&&(L.pixelOffset=new D(R,G))}function ID(e,t,n,i,o){for(let r=0,s=t.childNodes.length;r:clampToSeaFloor is currently not supported, using :clampToGround."),Ke.CLAMP_TO_GROUND):t==="relativeToSeaFloor"?(Ct("kml-gx:altitudeMode-relativeToSeaFloor","KML - :relativeToSeaFloor is currently not supported, using :relativeToGround."),Ke.RELATIVE_TO_GROUND):(l(e)?Ct("kml-altitudeMode-unknown",`KML - Unknown :${e}, using :CLAMP_TO_GROUND.`):Ct("kml-gx:altitudeMode-unknown",`KML - Unknown :${t}, using :CLAMP_TO_GROUND.`),Ke.CLAMP_TO_GROUND)}function Cit(e,t,n){return n==="relativeToSeaFloor"||t==="absolute"||t==="relativeToGround"?e:((l(t)&&t!=="clampToGround"||l(n)&&n!=="clampToSeaFloor")&&Ct("kml-altitudeMode-unknown",`KML - Unknown altitudeMode: ${y(t,n)}`),new Df(e))}function Vit(e,t,n,i){if(!l(e))return;if(n==="relativeToSeaFloor"||t==="absolute"||t==="relativeToGround")return e;(l(t)&&t!=="clampToGround"||l(n)&&n!=="clampToSeaFloor")&&Ct("kml-altitudeMode-unknown",`KML - Unknown altitudeMode: ${y(t,n)}`);let o=e.length;for(let r=0;r0&&Ct("kml-gx:angles","KML - gx:angles are not supported in gx:Tracks");let g=Math.min(a.length,d.length),f=[],x=[];for(let C=0;C0&&i.availability.addInterval(new Cn({start:x[0],stop:x[x.length-1]})),h&&u&&O4(t,i,o),!0}function R0e(e,t,n,i,o,r,s,a,c){let d=e[0],u=e[e.length-1],h=new Sa;h.addSamples(e,t),n.intervals.addInterval(new Cn({start:d,stop:u,isStartIncluded:c,isStopIncluded:c,data:Cit(h,s,a)})),i.addInterval(new Cn({start:d,stop:u,isStartIncluded:c,isStopIncluded:c})),o.intervals.addInterval(new Cn({start:d,stop:u,isStartIncluded:c,isStopIncluded:c,data:r}))}function Git(e,t,n,i,o){let r=Fh(n,"interpolate",Pe.gx),s=wh(n,"Track",Pe.gx),a,c,d,u=!1,h=new $b,p=new Hr,g=new _a,f=e._ellipsoid;for(let x=0,_=s.length;x<_;x++){let C=s[x],V=wh(C,"when",Pe.kml),L=wh(C,"coord",Pe.gx),R=Pn(C,"altitudeMode",Pe.kml),G=Pn(C,"altitudeMode",Pe.gx),I=Lw(R,G),v=Fh(C,"extrude",Pe.kml),P=Math.min(L.length,V.length),w=[];a=[];for(let A=0;A0)){for(f='',r=0;r`;f+="
${y(x.displayName,s)}${y(x.value,"")}
"}if(!l(f))return;f=hit.link(f),xo.innerHTML=f;let _=xo.querySelectorAll("a");for(r=0;r<_.length;r++)_[r].setAttribute("target","_blank");l(i)&&i.keys.length>1&&(Kd(xo,"a","href",i),Kd(xo,"link","href",i),Kd(xo,"area","href",i),Kd(xo,"img","src",i),Kd(xo,"iframe","src",i),Kd(xo,"video","src",i),Kd(xo,"audio","src",i),Kd(xo,"source","src",i),Kd(xo,"track","src",i),Kd(xo,"input","src",i),Kd(xo,"embed","src",i),Kd(xo,"script","src",i),Kd(xo,"video","poster",i)),Jd(xo,"a","href",o),Jd(xo,"link","href",o),Jd(xo,"area","href",o),Jd(xo,"img","src",o),Jd(xo,"iframe","src",o),Jd(xo,"video","src",o),Jd(xo,"audio","src",o),Jd(xo,"source","src",o),Jd(xo,"track","src",o),Jd(xo,"input","src",o),Jd(xo,"embed","src",o),Jd(xo,"script","src",o),Jd(xo,"video","poster",o);let C='
',C+=`${xo.innerHTML}
`,xo.innerHTML="",t.description=C}function vD(e,t,n){let i=n.entityCollection,o=n.parentEntity,r=n.sourceResource,s=n.uriResolver,a=I0e(t,i,n.context),c=a.kml,d=Tit(e,t,n.styleCollection,r,s),u=Pn(t,"name",Pe.kml);a.name=u,a.parent=o;let h=xit(t);l(h)||(h=yit(t)),a.availability=h,z4(a);function p(L){return L?L.show&&p(L.parent):!0}let g=Fh(t,"visibility",Pe.kml);a.show=p(o)&&y(g,!0);let f=Ai(t,"author",Pe.atom),x=c.author;x.name=Pn(f,"name",Pe.atom),x.uri=Pn(f,"uri",Pe.atom),x.email=Pn(f,"email",Pe.atom);let _=Ai(t,"link",Pe.atom),C=c.link;C.href=ws(_,"href"),C.hreflang=ws(_,"hreflang"),C.rel=ws(_,"rel"),C.type=ws(_,"type"),C.title=ws(_,"title"),C.length=ws(_,"length"),c.address=Pn(t,"address",Pe.kml),c.phoneNumber=Pn(t,"phoneNumber",Pe.kml),c.snippet=Pn(t,"Snippet",Pe.kml),Xit(t,a),Wit(t,a,d,s,r);let V=e._ellipsoid;return N0e(t,a,V),M0e(t,a,V),l(Ai(t,"Region",Pe.kml))&&Ct("kml-region","KML - Placemark Regions are unsupported"),{entity:a,styleEntity:d}}function A0e(e,t,n,i){i.addNodes(t.childNodes,n),i.process()}function Pit(e,t,n,i){let o=vD(e,t,n),r=Oe(n);r.parentEntity=o.entity,A0e(e,t,r,i)}function vit(e,t,n,i){let o=vD(e,t,n),r=o.entity,s=o.styleEntity,a=!1,c=t.childNodes;for(let d=0,u=c.length;dW.PI_OVER_TWO?W.PI_OVER_TWO:d}function a(d){return d>W.PI?d-W.TWO_PI:d<-W.PI?d+W.TWO_PI:d}let c=fx(e.queryParameters);if(c=c.replace(/%5B/g,"[").replace(/%5D/g,"]"),l(t)&&t._mode!==oe.MORPHING){let d,u;if(o=y(o,Uit),l(n)&&(w4.x=n.clientWidth*.5,w4.y=n.clientHeight*.5,d=t.pickEllipsoid(w4,r,Dit)),l(d)?u=r.cartesianToCartographic(d,YV):(u=le.center(o,YV),d=r.cartographicToCartesian(u)),l(i)&&!W.equalsEpsilon(i,1,W.EPSILON9)){let C=o.width*i*.5,V=o.height*i*.5;o=new le(a(u.longitude-C),s(u.latitude-V),a(u.longitude+C),s(u.latitude+V))}c=c.replace("[bboxWest]",W.toDegrees(o.west).toString()),c=c.replace("[bboxSouth]",W.toDegrees(o.south).toString()),c=c.replace("[bboxEast]",W.toDegrees(o.east).toString()),c=c.replace("[bboxNorth]",W.toDegrees(o.north).toString());let h=W.toDegrees(u.longitude).toString(),p=W.toDegrees(u.latitude).toString();c=c.replace("[lookatLon]",h),c=c.replace("[lookatLat]",p),c=c.replace("[lookatTilt]",W.toDegrees(t.pitch).toString()),c=c.replace("[lookatHeading]",W.toDegrees(t.heading).toString()),c=c.replace("[lookatRange]",m.distance(t.positionWC,d)),c=c.replace("[lookatTerrainLon]",h),c=c.replace("[lookatTerrainLat]",p),c=c.replace("[lookatTerrainAlt]",u.height.toString()),r.cartesianToCartographic(t.positionWC,YV),c=c.replace("[cameraLon]",W.toDegrees(YV.longitude).toString()),c=c.replace("[cameraLat]",W.toDegrees(YV.latitude).toString()),c=c.replace("[cameraAlt]",W.toDegrees(YV.height).toString());let g=t.frustum,f=g.aspectRatio,x="",_="";if(l(f)){let C=W.toDegrees(g.fov);f>1?(x=C,_=C/f):(_=C,x=C*f)}c=c.replace("[horizFov]",x.toString()),c=c.replace("[vertFov]",_.toString())}else c=c.replace("[bboxWest]","-180"),c=c.replace("[bboxSouth]","-90"),c=c.replace("[bboxEast]","180"),c=c.replace("[bboxNorth]","90"),c=c.replace("[lookatLon]",""),c=c.replace("[lookatLat]",""),c=c.replace("[lookatRange]",""),c=c.replace("[lookatTilt]",""),c=c.replace("[lookatHeading]",""),c=c.replace("[lookatTerrainLon]",""),c=c.replace("[lookatTerrainLat]",""),c=c.replace("[lookatTerrainAlt]",""),c=c.replace("[cameraLon]",""),c=c.replace("[cameraLat]",""),c=c.replace("[cameraAlt]",""),c=c.replace("[horizFov]",""),c=c.replace("[vertFov]","");l(n)?(c=c.replace("[horizPixels]",n.clientWidth),c=c.replace("[vertPixels]",n.clientHeight)):(c=c.replace("[horizPixels]",""),c=c.replace("[vertPixels]","")),c=c.replace("[terrainEnabled]","1"),c=c.replace("[clientVersion]","1"),c=c.replace("[kmlVersion]","2.2"),c=c.replace("[clientName]","Cesium"),c=c.replace("[language]","English"),e.setQueryParameters(md(c))}function Bit(e,t,n,i){let r=vD(e,t,n).entity,s=n.sourceResource,a=n.uriResolver,c=Ai(t,"Link",Pe.kml);if(l(c)||(c=Ai(t,"Url",Pe.kml)),l(c)){let d=Pn(c,"href",Pe.kml),u,h;if(l(d)){let p=d;if(d=U4(d,s,n.uriResolver),/^data:/.test(d.getUrlComponent()))/\.kmz/i.test(s.getUrlComponent())||(p=s.getDerivedResource({url:p}));else{if(p=d.clone(),u=Pn(c,"viewRefreshMode",Pe.kml),u==="onRegion"){Ct("kml-refrehMode-onRegion","KML - Unsupported viewRefreshMode: onRegion");return}h=y(Pn(c,"viewBoundScale",Pe.kml),1);let _=u==="onStop"?"BBOX=[bboxWest],[bboxSouth],[bboxEast],[bboxNorth]":"",C=y(Pn(c,"viewFormat",Pe.kml),_),V=Pn(c,"httpQuery",Pe.kml);l(C)&&d.setQueryParameters(md(XD(C))),l(V)&&d.setQueryParameters(md(XD(V)));let L=e._ellipsoid;Y4(d,e.camera,e.canvas,h,e._lastCameraView.bbox,L)}let g={sourceUri:p,uriResolver:a,context:r.id,screenOverlayContainer:n.screenOverlayContainer},f=new ea,x=H4(e,f,d,g).then(function(_){let C=e._entityCollection,V=f.values;C.suspendEvents();for(let G=0;G0||L==="onExpire"||u==="onStop"){let G=Ai(_,"NetworkLinkControl",Pe.kml),I=l(G),v=q.now(),P={id:Jn(),href:d,cookie:{},lastUpdated:v,updating:!1,entity:r,viewBoundScale:h,needsUpdate:!1,cameraUpdateTime:v},w=0;if(I&&(P.cookie=md(y(Pn(G,"cookie",Pe.kml),"")),w=y(ii(G,"minRefreshPeriod",Pe.kml),0)),L==="onInterval")I&&(R=Math.max(w,R)),P.refreshMode=Ey.INTERVAL,P.time=R;else if(L==="onExpire"){let A;if(I&&(A=Pn(G,"expires",Pe.kml)),l(A))try{let b=q.fromIso8601(A),Z=q.secondsDifference(b,v);Z>0&&Z0;)this._screenOverlays.pop().remove()};function z4(e){let t=e.parent;if(l(t)){let n=t.availability;if(l(n)){let i=e.availability;l(i)?i.intersect(n):e.availability=n}}}function Hit(e,t,n,i,o){return function(r){if(!i.contains(t.id))return;let s=!1,a=Ai(r,"NetworkLinkControl",Pe.kml),c=l(a),d=0;if(c){if(l(Ai(a,"Update",Pe.kml))){Ct("kml-networkLinkControl-update","KML - NetworkLinkControl updates aren't supported."),t.updating=!1,i.remove(t.id);return}t.cookie=md(y(Pn(a,"cookie",Pe.kml),"")),d=y(ii(a,"minRefreshPeriod",Pe.kml),0)}let u=q.now(),h=t.refreshMode;if(h===Ey.INTERVAL)l(a)&&(t.time=Math.max(d,t.time));else if(h===Ey.EXPIRE){let v;if(l(a)&&(v=Pn(a,"expires",Pe.kml)),l(v))try{let P=q.fromIso8601(v),w=q.secondsDifference(P,u);w>0&&wu.time&&(p=!0):u.refreshMode===Ey.EXPIRE?q.greaterThan(n,u.time)&&(p=!0):u.refreshMode===Ey.STOP&&(r&&(u.needsUpdate=!0,u.cameraUpdateTime=n),u.needsUpdate&&q.secondsDifference(n,u.cameraUpdateTime)>=u.time&&(p=!0)),p){o(h),u.updating=!0;let g=new ea,f=u.href.clone();f.setQueryParameters(u.cookie);let x=y(i._ellipsoid,ne.default);Y4(f,i.camera,i.canvas,u.viewBoundScale,s.bbox,x),H4(i,g,f,{context:h.id}).then(Hit(i,u,g,c,f)).catch(function(_){let C=`NetworkLink ${u.href} refresh failed: ${_}`;console.log(C),i._error.raiseEvent(i,C)}),d=!0}}c.set(u.id,u)}}),d&&(this._networkLinks=c,this._changed.raiseEvent(this)),!0};function zit(){this.author={name:void 0,uri:void 0,email:void 0},this.link={href:void 0,hreflang:void 0,rel:void 0,type:void 0,title:void 0,length:void 0},this.address=void 0,this.phoneNumber=void 0,this.snippet=void 0,this.extendedData=void 0}Qd._DeferredLoading=tp;Qd._getTimestamp=Si;var NT=Qd;var Dxi=T(S(),1);function Rw(){fe.throwInstantiationError()}Rw.prototype.update=fe.throwInstantiationError;Rw.prototype.getBoundingSphere=fe.throwInstantiationError;Rw.prototype.isDestroyed=fe.throwInstantiationError;Rw.prototype.destroy=fe.throwInstantiationError;var K4=Rw;var i_i=T(S(),1);var Oxi=T(S(),1),kT=`in vec4 position; in vec2 textureCoordinates; out vec2 v_textureCoordinates; void main() { gl_Position = position; v_textureCoordinates = textureCoordinates; } `;function wD(e){this._context=e}var Zw,Kit=new $e({primitiveType:Ae.TRIANGLES}),Jit=new ai({color:new B(0,0,0,0)});function Qit(e,t){return new Ar({context:e,colorTextures:[t],destroyAttachments:!1})}function jit(e,t){return en.fromCache({context:e,vertexShaderSource:kT,fragmentShaderSource:t,attributeLocations:{position:0,textureCoordinates:1}})}function qit(e,t){return(!l(Zw)||Zw.viewport.width!==e||Zw.viewport.height!==t)&&(Zw=Ue.fromCache({viewport:new He(0,0,e,t)})),Zw}wD.prototype.execute=function(e){l(e.preExecute)&&e.preExecute(e);let t=e.outputTexture,n=t.width,i=t.height,o=this._context,r=l(e.vertexArray)?e.vertexArray:o.getViewportQuadVertexArray(),s=l(e.shaderProgram)?e.shaderProgram:jit(o,e.fragmentShaderSource),a=Qit(o,t),c=qit(n,i),d=e.uniformMap,u=Jit;u.framebuffer=a,u.renderState=c,u.execute(o);let h=Kit;h.vertexArray=r,h.renderState=c,h.shaderProgram=s,h.uniformMap=d,h.framebuffer=a,h.execute(o),a.destroy(),e.persists||(s.destroy(),l(e.vertexArray)&&r.destroy()),l(e.postExecute)&&e.postExecute(t)};wD.prototype.isDestroyed=function(){return!1};wD.prototype.destroy=function(){return me(this)};var Gw=wD;var LTi=T(S(),1);var r_i=T(S(),1);function $it(e){this.context=e,this.framebuffer=void 0,this.blendingEnabled=void 0,this.scissorTest=void 0,this.viewport=void 0}var Vc=$it;var u_i=T(S(),1);function Ah(e){this._context=e,this._shaders={},this._numberOfShaders=0,this._shadersToRelease={}}Object.defineProperties(Ah.prototype,{numberOfShaders:{get:function(){return this._numberOfShaders}}});Ah.prototype.replaceShaderProgram=function(e){return l(e.shaderProgram)&&e.shaderProgram.destroy(),this.getShaderProgram(e)};function eot(e){let t=Object.keys(e).sort();return JSON.stringify(e,t)}Ah.prototype.getShaderProgram=function(e){let t=e.vertexShaderSource,n=e.fragmentShaderSource,i=e.attributeLocations;typeof t=="string"&&(t=new De({sources:[t]})),typeof n=="string"&&(n=new De({sources:[n]}));let o=t.getCacheKey(),r=n.getCacheKey(),s=l(i)?eot(i):"",a=`${o}:${r}:${s}`,c;if(l(this._shaders[a]))c=this._shaders[a],delete this._shadersToRelease[a];else{let d=this._context,u=t.createCombinedVertexShader(d),h=n.createCombinedFragmentShader(d),p=new en({gl:d._gl,logShaderCompilation:d.logShaderCompilation,debugShaders:d.debugShaders,vertexShaderSource:t,vertexShaderText:u,fragmentShaderSource:n,fragmentShaderText:h,attributeLocations:i});c={cache:this,shaderProgram:p,keyword:a,derivedKeywords:[],count:0},p._cachedShader=c,this._shaders[a]=c,++this._numberOfShaders}return++c.count,c.shaderProgram};Ah.prototype.replaceDerivedShaderProgram=function(e,t,n){let i=e._cachedShader,o=t+i.keyword,r=this._shaders[o];if(l(r)){J4(this,r);let s=i.derivedKeywords.indexOf(t);s>-1&&i.derivedKeywords.splice(s,1)}return this.createDerivedShaderProgram(e,t,n)};Ah.prototype.getDerivedShaderProgram=function(e,t){let n=e._cachedShader,i=t+n.keyword,o=this._shaders[i];if(l(o))return o.shaderProgram};Ah.prototype.createDerivedShaderProgram=function(e,t,n){let i=e._cachedShader,o=t+i.keyword,r=n.vertexShaderSource,s=n.fragmentShaderSource,a=n.attributeLocations;typeof r=="string"&&(r=new De({sources:[r]})),typeof s=="string"&&(s=new De({sources:[s]}));let c=this._context,d=r.createCombinedVertexShader(c),u=s.createCombinedFragmentShader(c),h=new en({gl:c._gl,logShaderCompilation:c.logShaderCompilation,debugShaders:c.debugShaders,vertexShaderSource:r,vertexShaderText:d,fragmentShaderSource:s,fragmentShaderText:u,attributeLocations:a}),p={cache:this,shaderProgram:h,keyword:o,derivedKeywords:[],count:0};return i.derivedKeywords.push(t),h._cachedShader=p,this._shaders[o]=p,h};function J4(e,t){let n=t.derivedKeywords,i=n.length;for(let o=0;ocot;++r){o=i;let s=o-t*Math.sin(o)-e,a=1-t*Math.cos(o);i=o-s/a}return o=i+n*W.TWO_PI,o}function dot(e,t){let n=Math.floor(e/W.TWO_PI);e-=n*W.TWO_PI;let i=Math.cos(e)-t,o=Math.sin(e)*Math.sqrt(1-t*t),r=Math.atan2(o,i);return r=W.zeroToTwoPi(r),e<0&&(r-=W.TWO_PI),r+=n*W.TWO_PI,r}function uot(e,t,n,i){let o=Math.cos(e),r=Math.sin(e),s=Math.cos(t),a=Math.sin(t),c=Math.cos(n),d=Math.sin(n);return l(i)?(i[0]=c*o-d*r*s,i[1]=d*o+c*r*s,i[2]=r*a,i[3]=-c*r-d*o*s,i[4]=-d*r+c*o*s,i[5]=o*a,i[6]=d*a,i[7]=-c*a,i[8]=s):i=new $(c*o-d*r*s,-c*r-d*o*s,d*a,d*o+c*r*s,-d*r+c*o*s,-c*a,r*a,o*a,s),i}var mot=1.0000010178*Ha,hot=100.46645683*cm,fot=129597742283429e-5*jd,D0e=16002,B0e=21863,O0e=32004,Y0e=10931,H0e=14529,z0e=16368,K0e=15318,J0e=32794,pot=64*1e-7*Ha,bot=-152*1e-7*Ha,got=62*1e-7*Ha,yot=-8*1e-7*Ha,xot=32*1e-7*Ha,_ot=-41*1e-7*Ha,Tot=19*1e-7*Ha,Sot=-11*1e-7*Ha,Cot=-150*1e-7*Ha,Vot=-46*1e-7*Ha,Lot=68*1e-7*Ha,Rot=54*1e-7*Ha,Zot=14*1e-7*Ha,Got=24*1e-7*Ha,Eot=-28*1e-7*Ha,Iot=22*1e-7*Ha,Q0e=10,j0e=16002,q0e=21863,$0e=10931,ege=1473,tge=32004,nge=4387,ige=73,Xot=-325*1e-7,Wot=-322*1e-7,Pot=-79*1e-7,vot=232*1e-7,wot=-52*1e-7,Fot=97*1e-7,Aot=55*1e-7,Mot=-41*1e-7,Not=-105*1e-7,kot=-137*1e-7,Uot=258*1e-7,Dot=35*1e-7,Bot=-116*1e-7,Oot=-88*1e-7,Yot=-112*1e-7,Hot=-80*1e-7,HV=new q(0,0,Kn.TAI);function zot(e,t){rge(e,HV);let i=(HV.dayNumber-FD.dayNumber+(HV.secondsOfDay-FD.secondsOfDay)/Qn.SECONDS_PER_DAY)/(Qn.DAYS_PER_JULIAN_CENTURY*10),o=.3595362*i,r=mot+pot*Math.cos(D0e*o)+Cot*Math.sin(D0e*o)+bot*Math.cos(B0e*o)+Vot*Math.sin(B0e*o)+got*Math.cos(O0e*o)+Lot*Math.sin(O0e*o)+yot*Math.cos(Y0e*o)+Rot*Math.sin(Y0e*o)+xot*Math.cos(H0e*o)+Zot*Math.sin(H0e*o)+_ot*Math.cos(z0e*o)+Got*Math.sin(z0e*o)+Tot*Math.cos(K0e*o)+Eot*Math.sin(K0e*o)+Sot*Math.cos(J0e*o)+Iot*Math.sin(J0e*o),s=hot+fot*i+Xot*Math.cos(Q0e*o)+Not*Math.sin(Q0e*o)+Wot*Math.cos(j0e*o)+kot*Math.sin(j0e*o)+Pot*Math.cos(q0e*o)+Uot*Math.sin(q0e*o)+vot*Math.cos($0e*o)+Dot*Math.sin($0e*o)+wot*Math.cos(ege*o)+Bot*Math.sin(ege*o)+Fot*Math.cos(tge*o)+Oot*Math.sin(tge*o)+Aot*Math.cos(nge*o)+Yot*Math.sin(nge*o)+Mot*Math.cos(ige*o)+Hot*Math.sin(ige*o),a=.0167086342-.0004203654*i,c=102.93734808*cm+11612.3529*jd*i,d=469.97289*jd*i,u=174.87317577*cm-8679.27034*jd*i;return sge(r,a,d,c,u,s,t)}function age(e,t){rge(e,HV);let i=(HV.dayNumber-FD.dayNumber+(HV.secondsOfDay-FD.secondsOfDay)/Qn.SECONDS_PER_DAY)/Qn.DAYS_PER_JULIAN_CENTURY,o=i*i,r=o*i,s=r*i,a=383397.7725+.004*i,c=.055545526-16e-9*i,d=5.15668983*cm,u=-8e-5*i+.02966*o-42e-6*r-13e-8*s,h=83.35324312*cm,p=146434202669e-4*i-38.2702*o-.045047*r+21301e-8*s,g=125.04455501*cm,f=-69679193631e-4*i+6.3602*o+.007625*r-3586e-8*s,x=218.31664563*cm,_=17325593434847e-4*i-6.391*o+.006588*r-3169e-8*s,C=297.85019547*cm+jd*(1602961601209e-3*i-6.3706*o+.006593*r-3169e-8*s),V=93.27209062*cm+jd*(17395272628478e-4*i-12.7512*o-.001037*r+417e-8*s),L=134.96340251*cm+jd*(17179159232178e-4*i+31.8792*o+.051635*r-2447e-7*s),R=357.52910918*cm+jd*(1295965810481e-4*i-.5532*o+136e-6*r-1149e-8*s),G=310.17137918*cm-jd*(6967051436e-3*i+6.2068*o+.007618*r-3219e-8*s),I=2*C,v=4*C,P=6*C,w=2*L,A=3*L,b=4*L,Z=2*V;a+=3400.4*Math.cos(I)-635.6*Math.cos(I-L)-235.6*Math.cos(L)+218.1*Math.cos(I-R)+181*Math.cos(I+L),c+=.014216*Math.cos(I-L)+.008551*Math.cos(I-w)-.001383*Math.cos(L)+.001356*Math.cos(I+L)-.001147*Math.cos(v-A)-914e-6*Math.cos(v-w)+869e-6*Math.cos(I-R-L)-627e-6*Math.cos(I)-394e-6*Math.cos(v-b)+282e-6*Math.cos(I-R-w)-279e-6*Math.cos(C-L)-236e-6*Math.cos(w)+231e-6*Math.cos(v)+229e-6*Math.cos(P-b)-201e-6*Math.cos(w-Z),u+=486.26*Math.cos(I-Z)-40.13*Math.cos(I)+37.51*Math.cos(Z)+25.73*Math.cos(w-Z)+19.97*Math.cos(I-R-Z),p+=-55609*Math.sin(I-L)-34711*Math.sin(I-w)-9792*Math.sin(L)+9385*Math.sin(v-A)+7505*Math.sin(v-w)+5318*Math.sin(I+L)+3484*Math.sin(v-b)-3417*Math.sin(I-R-L)-2530*Math.sin(P-b)-2376*Math.sin(I)-2075*Math.sin(I-A)-1883*Math.sin(w)-1736*Math.sin(P-5*L)+1626*Math.sin(R)-1370*Math.sin(P-A),f+=-5392*Math.sin(I-Z)-540*Math.sin(R)-441*Math.sin(I)+423*Math.sin(Z)-288*Math.sin(w-Z),_+=-3332.9*Math.sin(I)+1197.4*Math.sin(I-L)-662.5*Math.sin(R)+396.3*Math.sin(L)-218*Math.sin(I-R);let E=2*G,X=3*G;u+=46.997*Math.cos(G)*i-.614*Math.cos(I-Z+G)*i+.614*Math.cos(I-Z-G)*i-.0297*Math.cos(E)*o-.0335*Math.cos(G)*o+.0012*Math.cos(I-Z+E)*o-16e-5*Math.cos(G)*r+4e-5*Math.cos(X)*r+4e-5*Math.cos(E)*r;let F=2.116*Math.sin(G)*i-.111*Math.sin(I-Z-G)*i-.0015*Math.sin(G)*o;p+=F,_+=F,f+=-520.77*Math.sin(G)*i+13.66*Math.sin(I-Z+G)*i+1.12*Math.sin(I-G)*i-1.06*Math.sin(Z-G)*i+.66*Math.sin(E)*o+.371*Math.sin(G)*o-.035*Math.sin(I-Z+E)*o-.015*Math.sin(I-Z+G)*o+.0014*Math.sin(G)*r-.0011*Math.sin(X)*r-9e-4*Math.sin(E)*r,a*=oot;let N=d+u*jd,O=h+p*jd,U=x+_*jd,Y=g+f*jd;return sge(a,c,N,O,Y,U,t)}var oge=.012300034,Kot=oge/(oge+1)*-1;function Jot(e,t){return t=age(e,t),m.multiplyByScalar(t,Kot,t)}var cge=new $(1.0000000000000002,5619723173785822e-31,4690511510146299e-34,-5154129427414611e-31,.9174820620691819,-.39777715593191376,-223970096136568e-30,.39777715593191376,.9174820620691819),Xw=new m;Q4.computeSunPositionInEarthInertialFrame=function(e,t){return l(e)||(e=q.now()),l(t)||(t=new m),Xw=zot(e,Xw),t=m.negate(Xw,t),Jot(e,Xw),m.subtract(t,Xw,t),$.multiplyByVector(cge,t,t),t};Q4.computeMoonPositionInEarthInertialFrame=function(e,t){return l(e)||(e=q.now()),t=age(e,t),$.multiplyByVector(cge,t,t),t};var Iy=Q4;var G_i=T(S(),1);function Qot(e){e=y(e,y.EMPTY_OBJECT),this.color=B.clone(y(e.color,B.WHITE)),this.intensity=y(e.intensity,2)}var h0=Qot;function zV(){this.globeDepthTexture=void 0,this.gamma=void 0,this._viewport=new He,this._viewportCartesian4=new re,this._viewportDirty=!1,this._viewportOrthographicMatrix=M.clone(M.IDENTITY),this._viewportTransformation=M.clone(M.IDENTITY),this._model=M.clone(M.IDENTITY),this._view=M.clone(M.IDENTITY),this._inverseView=M.clone(M.IDENTITY),this._projection=M.clone(M.IDENTITY),this._infiniteProjection=M.clone(M.IDENTITY),this._entireFrustum=new D,this._currentFrustum=new D,this._frustumPlanes=new re,this._farDepthFromNearPlusOne=void 0,this._log2FarDepthFromNearPlusOne=void 0,this._oneOverLog2FarDepthFromNearPlusOne=void 0,this._frameState=void 0,this._temeToPseudoFixed=$.clone(M.IDENTITY),this._view3DDirty=!0,this._view3D=new M,this._inverseView3DDirty=!0,this._inverseView3D=new M,this._inverseModelDirty=!0,this._inverseModel=new M,this._inverseTransposeModelDirty=!0,this._inverseTransposeModel=new $,this._viewRotation=new $,this._inverseViewRotation=new $,this._viewRotation3D=new $,this._inverseViewRotation3D=new $,this._inverseProjectionDirty=!0,this._inverseProjection=new M,this._modelViewDirty=!0,this._modelView=new M,this._modelView3DDirty=!0,this._modelView3D=new M,this._modelViewRelativeToEyeDirty=!0,this._modelViewRelativeToEye=new M,this._inverseModelViewDirty=!0,this._inverseModelView=new M,this._inverseModelView3DDirty=!0,this._inverseModelView3D=new M,this._viewProjectionDirty=!0,this._viewProjection=new M,this._inverseViewProjectionDirty=!0,this._inverseViewProjection=new M,this._modelViewProjectionDirty=!0,this._modelViewProjection=new M,this._inverseModelViewProjectionDirty=!0,this._inverseModelViewProjection=new M,this._modelViewProjectionRelativeToEyeDirty=!0,this._modelViewProjectionRelativeToEye=new M,this._modelViewInfiniteProjectionDirty=!0,this._modelViewInfiniteProjection=new M,this._normalDirty=!0,this._normal=new $,this._normal3DDirty=!0,this._normal3D=new $,this._inverseNormalDirty=!0,this._inverseNormal=new $,this._inverseNormal3DDirty=!0,this._inverseNormal3D=new $,this._encodedCameraPositionMCDirty=!0,this._encodedCameraPositionMC=new Hn,this._cameraPosition=new m,this._sunPositionWC=new m,this._sunPositionColumbusView=new m,this._sunDirectionWC=new m,this._sunDirectionEC=new m,this._moonDirectionEC=new m,this._lightDirectionWC=new m,this._lightDirectionEC=new m,this._lightColor=new m,this._lightColorHdr=new m,this._pass=void 0,this._mode=void 0,this._mapProjection=void 0,this._ellipsoid=void 0,this._cameraDirection=new m,this._cameraRight=new m,this._cameraUp=new m,this._frustum2DWidth=0,this._eyeHeight=0,this._eyeHeight2D=new D,this._eyeEllipsoidNormalEC=new m,this._eyeEllipsoidCurvature=new D,this._modelToEnu=new M,this._enuToModel=new M,this._pixelRatio=1,this._orthographicIn3D=!1,this._backgroundColor=new B,this._brdfLut=void 0,this._environmentMap=void 0,this._sphericalHarmonicCoefficients=void 0,this._specularEnvironmentMaps=void 0,this._specularEnvironmentMapsMaximumLOD=void 0,this._fogDensity=void 0,this._fogVisualDensityScalar=void 0,this._fogMinimumBrightness=void 0,this._atmosphereHsbShift=void 0,this._atmosphereLightIntensity=void 0,this._atmosphereRayleighCoefficient=new m,this._atmosphereRayleighScaleHeight=new m,this._atmosphereMieCoefficient=new m,this._atmosphereMieScaleHeight=void 0,this._atmosphereMieAnisotropy=void 0,this._atmosphereDynamicLighting=void 0,this._invertClassificationColor=void 0,this._splitPosition=0,this._pixelSizePerMeter=void 0,this._geometricToleranceOverMeter=void 0,this._minimumDisableDepthTestDistance=void 0}Object.defineProperties(zV.prototype,{frameState:{get:function(){return this._frameState}},viewport:{get:function(){return this._viewport},set:function(e){if(!He.equals(e,this._viewport)){He.clone(e,this._viewport);let t=this._viewport,n=this._viewportCartesian4;n.x=t.x,n.y=t.y,n.z=t.width,n.w=t.height,this._viewportDirty=!0}}},viewportCartesian4:{get:function(){return this._viewportCartesian4}},viewportOrthographic:{get:function(){return dge(this),this._viewportOrthographicMatrix}},viewportTransformation:{get:function(){return dge(this),this._viewportTransformation}},model:{get:function(){return this._model},set:function(e){M.clone(e,this._model),this._modelView3DDirty=!0,this._inverseModelView3DDirty=!0,this._inverseModelDirty=!0,this._inverseTransposeModelDirty=!0,this._modelViewDirty=!0,this._inverseModelViewDirty=!0,this._modelViewRelativeToEyeDirty=!0,this._inverseModelViewDirty=!0,this._modelViewProjectionDirty=!0,this._inverseModelViewProjectionDirty=!0,this._modelViewProjectionRelativeToEyeDirty=!0,this._modelViewInfiniteProjectionDirty=!0,this._normalDirty=!0,this._inverseNormalDirty=!0,this._normal3DDirty=!0,this._inverseNormal3DDirty=!0,this._encodedCameraPositionMCDirty=!0}},inverseModel:{get:function(){return this._inverseModelDirty&&(this._inverseModelDirty=!1,M.inverse(this._model,this._inverseModel)),this._inverseModel}},inverseTransposeModel:{get:function(){let e=this._inverseTransposeModel;return this._inverseTransposeModelDirty&&(this._inverseTransposeModelDirty=!1,M.getMatrix3(this.inverseModel,e),$.transpose(e,e)),e}},view:{get:function(){return this._view}},view3D:{get:function(){return q4(this),this._view3D}},viewRotation:{get:function(){return q4(this),this._viewRotation}},viewRotation3D:{get:function(){return q4(this),this._viewRotation3D}},inverseView:{get:function(){return this._inverseView}},inverseView3D:{get:function(){return hge(this),this._inverseView3D}},inverseViewRotation:{get:function(){return this._inverseViewRotation}},inverseViewRotation3D:{get:function(){return hge(this),this._inverseViewRotation3D}},projection:{get:function(){return this._projection}},inverseProjection:{get:function(){return art(this),this._inverseProjection}},infiniteProjection:{get:function(){return this._infiniteProjection}},modelView:{get:function(){return crt(this),this._modelView}},modelView3D:{get:function(){return lrt(this),this._modelView3D}},modelViewRelativeToEye:{get:function(){return prt(this),this._modelViewRelativeToEye}},inverseModelView:{get:function(){return drt(this),this._inverseModelView}},inverseModelView3D:{get:function(){return urt(this),this._inverseModelView3D}},viewProjection:{get:function(){return mrt(this),this._viewProjection}},inverseViewProjection:{get:function(){return hrt(this),this._inverseViewProjection}},modelViewProjection:{get:function(){return frt(this),this._modelViewProjection}},inverseModelViewProjection:{get:function(){return brt(this),this._inverseModelViewProjection}},modelViewProjectionRelativeToEye:{get:function(){return grt(this),this._modelViewProjectionRelativeToEye}},modelViewInfiniteProjection:{get:function(){return yrt(this),this._modelViewInfiniteProjection}},normal:{get:function(){return xrt(this),this._normal}},normal3D:{get:function(){return _rt(this),this._normal3D}},inverseNormal:{get:function(){return Trt(this),this._inverseNormal}},inverseNormal3D:{get:function(){return Srt(this),this._inverseNormal3D}},entireFrustum:{get:function(){return this._entireFrustum}},currentFrustum:{get:function(){return this._currentFrustum}},frustumPlanes:{get:function(){return this._frustumPlanes}},farDepthFromNearPlusOne:{get:function(){return this._farDepthFromNearPlusOne}},log2FarDepthFromNearPlusOne:{get:function(){return this._log2FarDepthFromNearPlusOne}},oneOverLog2FarDepthFromNearPlusOne:{get:function(){return this._oneOverLog2FarDepthFromNearPlusOne}},eyeHeight:{get:function(){return this._eyeHeight}},eyeHeight2D:{get:function(){return this._eyeHeight2D}},eyeEllipsoidNormalEC:{get:function(){return this._eyeEllipsoidNormalEC}},eyeEllipsoidCurvature:{get:function(){return this._eyeEllipsoidCurvature}},modelToEnu:{get:function(){return this._modelToEnu}},enuToModel:{get:function(){return this._enuToModel}},sunPositionWC:{get:function(){return this._sunPositionWC}},sunPositionColumbusView:{get:function(){return this._sunPositionColumbusView}},sunDirectionWC:{get:function(){return this._sunDirectionWC}},sunDirectionEC:{get:function(){return this._sunDirectionEC}},moonDirectionEC:{get:function(){return this._moonDirectionEC}},lightDirectionWC:{get:function(){return this._lightDirectionWC}},lightDirectionEC:{get:function(){return this._lightDirectionEC}},lightColor:{get:function(){return this._lightColor}},lightColorHdr:{get:function(){return this._lightColorHdr}},encodedCameraPositionMCHigh:{get:function(){return mge(this),this._encodedCameraPositionMC.high}},encodedCameraPositionMCLow:{get:function(){return mge(this),this._encodedCameraPositionMC.low}},temeToPseudoFixedMatrix:{get:function(){return this._temeToPseudoFixed}},pixelRatio:{get:function(){return this._pixelRatio}},fogDensity:{get:function(){return this._fogDensity}},fogVisualDensityScalar:{get:function(){return this._fogVisualDensityScalar}},fogMinimumBrightness:{get:function(){return this._fogMinimumBrightness}},atmosphereHsbShift:{get:function(){return this._atmosphereHsbShift}},atmosphereLightIntensity:{get:function(){return this._atmosphereLightIntensity}},atmosphereRayleighCoefficient:{get:function(){return this._atmosphereRayleighCoefficient}},atmosphereRayleighScaleHeight:{get:function(){return this._atmosphereRayleighScaleHeight}},atmosphereMieCoefficient:{get:function(){return this._atmosphereMieCoefficient}},atmosphereMieScaleHeight:{get:function(){return this._atmosphereMieScaleHeight}},atmosphereMieAnisotropy:{get:function(){return this._atmosphereMieAnisotropy}},atmosphereDynamicLighting:{get:function(){return this._atmosphereDynamicLighting}},geometricToleranceOverMeter:{get:function(){return this._geometricToleranceOverMeter}},pass:{get:function(){return this._pass}},backgroundColor:{get:function(){return this._backgroundColor}},brdfLut:{get:function(){return this._brdfLut}},environmentMap:{get:function(){return this._environmentMap}},sphericalHarmonicCoefficients:{get:function(){return this._sphericalHarmonicCoefficients}},specularEnvironmentMaps:{get:function(){return this._specularEnvironmentMaps}},specularEnvironmentMapsMaximumLOD:{get:function(){return this._specularEnvironmentMapsMaximumLOD}},splitPosition:{get:function(){return this._splitPosition}},minimumDisableDepthTestDistance:{get:function(){return this._minimumDisableDepthTestDistance}},invertClassificationColor:{get:function(){return this._invertClassificationColor}},orthographicIn3D:{get:function(){return this._orthographicIn3D}},ellipsoid:{get:function(){return y(this._ellipsoid,ne.default)}}});function jot(e,t){M.clone(t,e._view),M.getMatrix3(t,e._viewRotation),e._view3DDirty=!0,e._inverseView3DDirty=!0,e._modelViewDirty=!0,e._modelView3DDirty=!0,e._modelViewRelativeToEyeDirty=!0,e._inverseModelViewDirty=!0,e._inverseModelView3DDirty=!0,e._viewProjectionDirty=!0,e._inverseViewProjectionDirty=!0,e._modelViewProjectionDirty=!0,e._modelViewProjectionRelativeToEyeDirty=!0,e._modelViewInfiniteProjectionDirty=!0,e._normalDirty=!0,e._inverseNormalDirty=!0,e._normal3DDirty=!0,e._inverseNormal3DDirty=!0}function qot(e,t){M.clone(t,e._inverseView),M.getMatrix3(t,e._inverseViewRotation)}function $ot(e,t){M.clone(t,e._projection),e._inverseProjectionDirty=!0,e._viewProjectionDirty=!0,e._inverseViewProjectionDirty=!0,e._modelViewProjectionDirty=!0,e._modelViewProjectionRelativeToEyeDirty=!0}function ert(e,t){M.clone(t,e._infiniteProjection),e._modelViewInfiniteProjectionDirty=!0}var lge=new m,trt=new M;function nrt(e,t){m.clone(t.positionWC,e._cameraPosition),m.clone(t.directionWC,e._cameraDirection),m.clone(t.rightWC,e._cameraRight),m.clone(t.upWC,e._cameraUp);let n=e._ellipsoid,i,o=t.positionCartographic;if(l(o)?(e._eyeHeight=o.height,e._eyeEllipsoidNormalEC=n.geodeticSurfaceNormalCartographic(o,e._eyeEllipsoidNormalEC),i=m.fromRadians(o.longitude,o.latitude,0,n,lge)):(e._eyeHeight=-n.maximumRadius,m.magnitude(t.positionWC)>0&&(e._eyeEllipsoidNormalEC=m.normalize(t.positionWC,e._eyeEllipsoidNormalEC)),i=n.scaleToGeodeticSurface(t.positionWC,lge)),e._encodedCameraPositionMCDirty=!0,!l(i))return;e._eyeEllipsoidNormalEC=$.multiplyByVector(e._viewRotation,e._eyeEllipsoidNormalEC,e._eyeEllipsoidNormalEC);let r=wt.eastNorthUpToFixedFrame(i,n,trt);e._enuToModel=M.multiplyTransformation(e.inverseModel,r,e._enuToModel),e._modelToEnu=M.inverseTransformation(e._enuToModel,e._modelToEnu),W.equalsEpsilon(n._radii.x,n._radii.y,W.EPSILON15)&&(e._eyeEllipsoidCurvature=n.getLocalCurvature(i,e._eyeEllipsoidCurvature))}var j4=new $,irt=new he;function ort(e,t){wt.computeIcrfToCentralBodyFixedMatrix(t.time,j4);let n=Iy.computeSunPositionInEarthInertialFrame(t.time,e._sunPositionWC);$.multiplyByVector(j4,n,n),m.normalize(n,e._sunDirectionWC),n=$.multiplyByVector(e.viewRotation3D,n,e._sunDirectionEC),m.normalize(n,n),n=Iy.computeMoonPositionInEarthInertialFrame(t.time,e._moonDirectionEC),$.multiplyByVector(j4,n,n),$.multiplyByVector(e.viewRotation3D,n,n),m.normalize(n,n);let i=t.mapProjection,r=i.ellipsoid.cartesianToCartographic(e._sunPositionWC,irt);i.project(r,e._sunPositionColumbusView)}zV.prototype.updateCamera=function(e){jot(this,e.viewMatrix),qot(this,e.inverseViewMatrix),nrt(this,e),this._entireFrustum.x=e.frustum.near,this._entireFrustum.y=e.frustum.far,this.updateFrustum(e.frustum),this._orthographicIn3D=this._mode!==oe.SCENE2D&&e.frustum instanceof ln};zV.prototype.updateFrustum=function(e){$ot(this,e.projectionMatrix),l(e.infiniteProjectionMatrix)&&ert(this,e.infiniteProjectionMatrix),this._currentFrustum.x=e.near,this._currentFrustum.y=e.far,this._farDepthFromNearPlusOne=e.far-e.near+1,this._log2FarDepthFromNearPlusOne=W.log2(this._farDepthFromNearPlusOne),this._oneOverLog2FarDepthFromNearPlusOne=1/this._log2FarDepthFromNearPlusOne;let t=e.offCenterFrustum;l(t)&&(e=t),this._frustumPlanes.x=e.top,this._frustumPlanes.y=e.bottom,this._frustumPlanes.z=e.left,this._frustumPlanes.w=e.right};zV.prototype.updatePass=function(e){this._pass=e};var rrt=[],srt=new h0;zV.prototype.update=function(e){this._mode=e.mode,this._mapProjection=e.mapProjection,this._ellipsoid=e.mapProjection.ellipsoid,this._pixelRatio=e.pixelRatio;let t=e.camera;this.updateCamera(t),e.mode===oe.SCENE2D?(this._frustum2DWidth=t.frustum.right-t.frustum.left,this._eyeHeight2D.x=this._frustum2DWidth*.5,this._eyeHeight2D.y=this._eyeHeight2D.x*this._eyeHeight2D.x):(this._frustum2DWidth=0,this._eyeHeight2D.x=0,this._eyeHeight2D.y=0),ort(this,e);let n=y(e.light,srt);n instanceof h0?(this._lightDirectionWC=m.clone(this._sunDirectionWC,this._lightDirectionWC),this._lightDirectionEC=m.clone(this._sunDirectionEC,this._lightDirectionEC)):(this._lightDirectionWC=m.normalize(m.negate(n.direction,this._lightDirectionWC),this._lightDirectionWC),this._lightDirectionEC=$.multiplyByVector(this.viewRotation3D,this._lightDirectionWC,this._lightDirectionEC));let i=n.color,o=m.fromElements(i.red,i.green,i.blue,this._lightColorHdr);o=m.multiplyByScalar(o,n.intensity,o);let r=m.maximumComponent(o);r>1?m.divideByScalar(o,r,this._lightColor):m.clone(o,this._lightColor);let s=e.brdfLutGenerator,a=l(s)?s.colorTexture:void 0;this._brdfLut=a,this._environmentMap=y(e.environmentMap,e.context.defaultCubeMap),this._sphericalHarmonicCoefficients=y(e.sphericalHarmonicCoefficients,rrt),this._specularEnvironmentMaps=e.specularEnvironmentMaps,this._specularEnvironmentMapsMaximumLOD=e.specularEnvironmentMapsMaximumLOD,this._fogDensity=e.fog.density,this._fogVisualDensityScalar=e.fog.visualDensityScalar,this._fogMinimumBrightness=e.fog.minimumBrightness;let c=e.atmosphere;l(c)&&(this._atmosphereHsbShift=m.fromElements(c.hueShift,c.saturationShift,c.brightnessShift,this._atmosphereHsbShift),this._atmosphereLightIntensity=c.lightIntensity,this._atmosphereRayleighCoefficient=m.clone(c.rayleighCoefficient,this._atmosphereRayleighCoefficient),this._atmosphereRayleighScaleHeight=c.rayleighScaleHeight,this._atmosphereMieCoefficient=m.clone(c.mieCoefficient,this._atmosphereMieCoefficient),this._atmosphereMieScaleHeight=c.mieScaleHeight,this._atmosphereMieAnisotropy=c.mieAnisotropy,this._atmosphereDynamicLighting=c.dynamicLighting),this._invertClassificationColor=e.invertClassificationColor,this._frameState=e,this._temeToPseudoFixed=wt.computeTemeToPseudoFixedMatrix(e.time,this._temeToPseudoFixed),this._splitPosition=e.splitPosition*e.context.drawingBufferWidth;let d=t.frustum.fov,u=this._viewport,h;l(d)?u.height>u.width?h=Math.tan(.5*d)*2/u.height:h=Math.tan(.5*d)*2/u.width:h=1/Math.max(u.width,u.height),this._geometricToleranceOverMeter=h*e.maximumScreenSpaceError,B.clone(e.backgroundColor,this._backgroundColor),this._minimumDisableDepthTestDistance=e.minimumDisableDepthTestDistance,this._minimumDisableDepthTestDistance*=this._minimumDisableDepthTestDistance,this._minimumDisableDepthTestDistance===Number.POSITIVE_INFINITY&&(this._minimumDisableDepthTestDistance=-1)};function dge(e){if(e._viewportDirty){let t=e._viewport;M.computeOrthographicOffCenter(t.x,t.x+t.width,t.y,t.y+t.height,0,1,e._viewportOrthographicMatrix),M.computeViewportTransformation(t,0,1,e._viewportTransformation),e._viewportDirty=!1}}function art(e){e._inverseProjectionDirty&&(e._inverseProjectionDirty=!1,e._mode!==oe.SCENE2D&&e._mode!==oe.MORPHING&&!e._orthographicIn3D?M.inverse(e._projection,e._inverseProjection):M.clone(M.ZERO,e._inverseProjection))}function crt(e){e._modelViewDirty&&(e._modelViewDirty=!1,M.multiplyTransformation(e._view,e._model,e._modelView))}function lrt(e){e._modelView3DDirty&&(e._modelView3DDirty=!1,M.multiplyTransformation(e.view3D,e._model,e._modelView3D))}function drt(e){e._inverseModelViewDirty&&(e._inverseModelViewDirty=!1,M.inverse(e.modelView,e._inverseModelView))}function urt(e){e._inverseModelView3DDirty&&(e._inverseModelView3DDirty=!1,M.inverse(e.modelView3D,e._inverseModelView3D))}function mrt(e){e._viewProjectionDirty&&(e._viewProjectionDirty=!1,M.multiply(e._projection,e._view,e._viewProjection))}function hrt(e){e._inverseViewProjectionDirty&&(e._inverseViewProjectionDirty=!1,M.inverse(e.viewProjection,e._inverseViewProjection))}function frt(e){e._modelViewProjectionDirty&&(e._modelViewProjectionDirty=!1,M.multiply(e._projection,e.modelView,e._modelViewProjection))}function prt(e){if(e._modelViewRelativeToEyeDirty){e._modelViewRelativeToEyeDirty=!1;let t=e.modelView,n=e._modelViewRelativeToEye;n[0]=t[0],n[1]=t[1],n[2]=t[2],n[3]=t[3],n[4]=t[4],n[5]=t[5],n[6]=t[6],n[7]=t[7],n[8]=t[8],n[9]=t[9],n[10]=t[10],n[11]=t[11],n[12]=0,n[13]=0,n[14]=0,n[15]=t[15]}}function brt(e){e._inverseModelViewProjectionDirty&&(e._inverseModelViewProjectionDirty=!1,M.inverse(e.modelViewProjection,e._inverseModelViewProjection))}function grt(e){e._modelViewProjectionRelativeToEyeDirty&&(e._modelViewProjectionRelativeToEyeDirty=!1,M.multiply(e._projection,e.modelViewRelativeToEye,e._modelViewProjectionRelativeToEye))}function yrt(e){e._modelViewInfiniteProjectionDirty&&(e._modelViewInfiniteProjectionDirty=!1,M.multiply(e._infiniteProjection,e.modelView,e._modelViewInfiniteProjection))}function xrt(e){if(e._normalDirty){e._normalDirty=!1;let t=e._normal;M.getMatrix3(e.inverseModelView,t),$.transpose(t,t)}}function _rt(e){if(e._normal3DDirty){e._normal3DDirty=!1;let t=e._normal3D;M.getMatrix3(e.inverseModelView3D,t),$.transpose(t,t)}}function Trt(e){if(e._inverseNormalDirty){e._inverseNormalDirty=!1;let t=e._inverseNormal;M.getMatrix3(e.modelView,t),$.transpose(t,t)}}function Srt(e){if(e._inverseNormal3DDirty){e._inverseNormal3DDirty=!1;let t=e._inverseNormal3D;M.getMatrix3(e.modelView3D,t),$.transpose(t,t)}}var uge=new m;function mge(e){e._encodedCameraPositionMCDirty&&(e._encodedCameraPositionMCDirty=!1,M.multiplyByPoint(e.inverseModel,e._cameraPosition,uge),Hn.fromCartesian(uge,e._encodedCameraPositionMC))}var Crt=new m,Vrt=new m,Lrt=new m,Rrt=new m,Zrt=new he,Grt=new m,Ert=new M;function Irt(e,t,n,i,o,r,s,a){let c=Crt;c.x=e.y,c.y=e.z,c.z=e.x;let d=Vrt;d.x=n.y,d.y=n.z,d.z=n.x;let u=Lrt;u.x=i.y,u.y=i.z,u.z=i.x;let h=Rrt;h.x=t.y,h.y=t.z,h.z=t.x,r===oe.SCENE2D&&(c.z=o*.5);let p=s.unproject(c,Zrt);p.longitude=W.clamp(p.longitude,-Math.PI,Math.PI),p.latitude=W.clamp(p.latitude,-W.PI_OVER_TWO,W.PI_OVER_TWO);let g=s.ellipsoid,f=g.cartographicToCartesian(p,Grt),x=wt.eastNorthUpToFixedFrame(f,g,Ert);return M.multiplyByPointAsVector(x,d,d),M.multiplyByPointAsVector(x,u,u),M.multiplyByPointAsVector(x,h,h),l(a)||(a=new M),a[0]=d.x,a[1]=u.x,a[2]=-h.x,a[3]=0,a[4]=d.y,a[5]=u.y,a[6]=-h.y,a[7]=0,a[8]=d.z,a[9]=u.z,a[10]=-h.z,a[11]=0,a[12]=-m.dot(d,f),a[13]=-m.dot(u,f),a[14]=m.dot(h,f),a[15]=1,a}function q4(e){e._view3DDirty&&(e._mode===oe.SCENE3D?M.clone(e._view,e._view3D):Irt(e._cameraPosition,e._cameraDirection,e._cameraRight,e._cameraUp,e._frustum2DWidth,e._mode,e._mapProjection,e._view3D),M.getMatrix3(e._view3D,e._viewRotation3D),e._view3DDirty=!1)}function hge(e){e._inverseView3DDirty&&(M.inverseTransformation(e.view3D,e._inverseView3D),M.getMatrix3(e._inverseView3D,e._inverseViewRotation3D),e._inverseView3DDirty=!1)}var Ww=zV;function lm(e,t){let{getWebGLStub:n,requestWebgl1:i,webgl:o={},allowTextureFilterAnisotropic:r=!0}=y(t,{});o.alpha=y(o.alpha,!1),o.stencil=y(o.stencil,!0),o.powerPreference=y(o.powerPreference,"high-performance");let s=l(n)?n(e,o):Xrt(e,o,i),c=typeof WebGL2RenderingContext<"u"&&s instanceof WebGL2RenderingContext;this._canvas=e,this._originalGLContext=s,this._gl=s,this._webgl2=c,this._id=Jn(),this.validateFramebuffer=!1,this.validateShaderProgram=!1,this.logShaderCompilation=!1,this._throwOnWebGLError=!1,this._shaderCache=new Ew(this),this._textureCache=new Iw;let d=s;this._stencilBits=d.getParameter(d.STENCIL_BITS),Mt._maximumCombinedTextureImageUnits=d.getParameter(d.MAX_COMBINED_TEXTURE_IMAGE_UNITS),Mt._maximumCubeMapSize=d.getParameter(d.MAX_CUBE_MAP_TEXTURE_SIZE),Mt._maximumFragmentUniformVectors=d.getParameter(d.MAX_FRAGMENT_UNIFORM_VECTORS),Mt._maximumTextureImageUnits=d.getParameter(d.MAX_TEXTURE_IMAGE_UNITS),Mt._maximumRenderbufferSize=d.getParameter(d.MAX_RENDERBUFFER_SIZE),Mt._maximumTextureSize=d.getParameter(d.MAX_TEXTURE_SIZE),Mt._maximumVaryingVectors=d.getParameter(d.MAX_VARYING_VECTORS),Mt._maximumVertexAttributes=d.getParameter(d.MAX_VERTEX_ATTRIBS),Mt._maximumVertexTextureImageUnits=d.getParameter(d.MAX_VERTEX_TEXTURE_IMAGE_UNITS),Mt._maximumVertexUniformVectors=d.getParameter(d.MAX_VERTEX_UNIFORM_VECTORS),Mt._maximumSamples=this._webgl2?d.getParameter(d.MAX_SAMPLES):0;let u=d.getParameter(d.ALIASED_LINE_WIDTH_RANGE);Mt._minimumAliasedLineWidth=u[0],Mt._maximumAliasedLineWidth=u[1];let h=d.getParameter(d.ALIASED_POINT_SIZE_RANGE);Mt._minimumAliasedPointSize=h[0],Mt._maximumAliasedPointSize=h[1];let p=d.getParameter(d.MAX_VIEWPORT_DIMS);Mt._maximumViewportWidth=p[0],Mt._maximumViewportHeight=p[1];let g=d.getShaderPrecisionFormat(d.FRAGMENT_SHADER,d.HIGH_FLOAT);Mt._highpFloatSupported=g.precision!==0;let f=d.getShaderPrecisionFormat(d.FRAGMENT_SHADER,d.HIGH_INT);Mt._highpIntSupported=f.rangeMax!==0,this._antialias=d.getContextAttributes().antialias,this._standardDerivatives=!!Er(d,["OES_standard_derivatives"]),this._blendMinmax=!!Er(d,["EXT_blend_minmax"]),this._elementIndexUint=!!Er(d,["OES_element_index_uint"]),this._depthTexture=!!Er(d,["WEBGL_depth_texture","WEBKIT_WEBGL_depth_texture"]),this._fragDepth=!!Er(d,["EXT_frag_depth"]),this._debugShaders=Er(d,["WEBGL_debug_shaders"]),this._textureFloat=!!Er(d,["OES_texture_float"]),this._textureHalfFloat=!!Er(d,["OES_texture_half_float"]),this._textureFloatLinear=!!Er(d,["OES_texture_float_linear"]),this._textureHalfFloatLinear=!!Er(d,["OES_texture_half_float_linear"]),this._supportsTextureLod=!!Er(d,["EXT_shader_texture_lod"]),this._colorBufferFloat=!!Er(d,["EXT_color_buffer_float","WEBGL_color_buffer_float"]),this._floatBlend=!!Er(d,["EXT_float_blend"]),this._colorBufferHalfFloat=!!Er(d,["EXT_color_buffer_half_float"]),this._s3tc=!!Er(d,["WEBGL_compressed_texture_s3tc","MOZ_WEBGL_compressed_texture_s3tc","WEBKIT_WEBGL_compressed_texture_s3tc"]),this._pvrtc=!!Er(d,["WEBGL_compressed_texture_pvrtc","WEBKIT_WEBGL_compressed_texture_pvrtc"]),this._astc=!!Er(d,["WEBGL_compressed_texture_astc"]),this._etc=!!Er(d,["WEBG_compressed_texture_etc"]),this._etc1=!!Er(d,["WEBGL_compressed_texture_etc1"]),this._bc7=!!Er(d,["EXT_texture_compression_bptc"]),Gl.setKTX2SupportedFormats(this._s3tc,this._pvrtc,this._astc,this._etc,this._etc1,this._bc7);let x=r?Er(d,["EXT_texture_filter_anisotropic","WEBKIT_EXT_texture_filter_anisotropic"]):void 0;this._textureFilterAnisotropic=x,Mt._maximumTextureFilterAnisotropy=l(x)?d.getParameter(x.MAX_TEXTURE_MAX_ANISOTROPY_EXT):1;let _,C,V,L,R,G,I,v,P,w;if(c){let E=this;_=function(){return E._gl.createVertexArray()},C=function(X){E._gl.bindVertexArray(X)},V=function(X){E._gl.deleteVertexArray(X)},L=function(X,F,N,O,U){d.drawElementsInstanced(X,F,N,O,U)},R=function(X,F,N,O){d.drawArraysInstanced(X,F,N,O)},G=function(X,F){d.vertexAttribDivisor(X,F)},I=function(X){d.drawBuffers(X)}}else v=Er(d,["OES_vertex_array_object"]),l(v)&&(_=function(){return v.createVertexArrayOES()},C=function(E){v.bindVertexArrayOES(E)},V=function(E){v.deleteVertexArrayOES(E)}),P=Er(d,["ANGLE_instanced_arrays"]),l(P)&&(L=function(E,X,F,N,O){P.drawElementsInstancedANGLE(E,X,F,N,O)},R=function(E,X,F,N){P.drawArraysInstancedANGLE(E,X,F,N)},G=function(E,X){P.vertexAttribDivisorANGLE(E,X)}),w=Er(d,["WEBGL_draw_buffers"]),l(w)&&(I=function(E){w.drawBuffersWEBGL(E)});this.glCreateVertexArray=_,this.glBindVertexArray=C,this.glDeleteVertexArray=V,this.glDrawElementsInstanced=L,this.glDrawArraysInstanced=R,this.glVertexAttribDivisor=G,this.glDrawBuffers=I,this._vertexArrayObject=!!v,this._instancedArrays=!!P,this._drawBuffers=!!w,Mt._maximumDrawBuffers=this.drawBuffers?d.getParameter(ie.MAX_DRAW_BUFFERS):1,Mt._maximumColorAttachments=this.drawBuffers?d.getParameter(ie.MAX_COLOR_ATTACHMENTS):1,this._clearColor=new B(0,0,0,0),this._clearDepth=1,this._clearStencil=0;let A=new Ww,b=new Vc(this),Z=Ue.fromCache();this._defaultPassState=b,this._defaultRenderState=Z,this._defaultTexture=void 0,this._defaultEmissiveTexture=void 0,this._defaultNormalTexture=void 0,this._defaultCubeMap=void 0,this._us=A,this._currentRenderState=Z,this._currentPassState=b,this._currentFramebuffer=void 0,this._maxFrameTextureUnitIndex=0,this._vertexAttribDivisors=[],this._previousDrawInstanced=!1;for(let E=0;E"u")throw new ce("The browser does not support WebGL. Visit http://get.webgl.org.");!n&&!(typeof WebGL2RenderingContext<"u")&&(n=!0);let o=n?"webgl":"webgl2",r=e.getContext(o,t);if(!l(r))throw new ce("The browser supports WebGL, but initialization failed.");return r}function Wrt(e,t){let n="WebGL Error: ";switch(t){case e.INVALID_ENUM:n+="INVALID_ENUM";break;case e.INVALID_VALUE:n+="INVALID_VALUE";break;case e.INVALID_OPERATION:n+="INVALID_OPERATION";break;case e.OUT_OF_MEMORY:n+="OUT_OF_MEMORY";break;case e.CONTEXT_LOST_WEBGL:n+="CONTEXT_LOST_WEBGL lost";break;default:n+=`Unknown (${t})`}return n}function Prt(e,t,n,i){let o=`${Wrt(e,i)}: ${t.name}(`;for(let r=0;r=8}},antialias:{get:function(){return this._antialias}},msaa:{get:function(){return this._webgl2}},standardDerivatives:{get:function(){return this._standardDerivatives||this._webgl2}},floatBlend:{get:function(){return this._floatBlend}},blendMinmax:{get:function(){return this._blendMinmax||this._webgl2}},elementIndexUint:{get:function(){return this._elementIndexUint||this._webgl2}},depthTexture:{get:function(){return this._depthTexture||this._webgl2}},floatingPointTexture:{get:function(){return this._webgl2||this._textureFloat}},halfFloatingPointTexture:{get:function(){return this._webgl2||this._textureHalfFloat}},textureFloatLinear:{get:function(){return this._textureFloatLinear}},textureHalfFloatLinear:{get:function(){return this._webgl2&&this._textureFloatLinear||!this._webgl2&&this._textureHalfFloatLinear}},supportsTextureLod:{get:function(){return this._webgl2||this._supportsTextureLod}},textureFilterAnisotropic:{get:function(){return!!this._textureFilterAnisotropic}},s3tc:{get:function(){return this._s3tc}},pvrtc:{get:function(){return this._pvrtc}},astc:{get:function(){return this._astc}},etc:{get:function(){return this._etc}},etc1:{get:function(){return this._etc1}},bc7:{get:function(){return this._bc7}},supportsBasis:{get:function(){return this._s3tc||this._pvrtc||this._astc||this._etc||this._etc1||this._bc7}},vertexArrayObject:{get:function(){return this._vertexArrayObject||this._webgl2}},fragmentDepth:{get:function(){return this._fragDepth||this._webgl2}},instancedArrays:{get:function(){return this._instancedArrays||this._webgl2}},colorBufferFloat:{get:function(){return this._colorBufferFloat}},colorBufferHalfFloat:{get:function(){return this._webgl2&&this._colorBufferFloat||!this._webgl2&&this._colorBufferHalfFloat}},drawBuffers:{get:function(){return this._drawBuffers||this._webgl2}},debugShaders:{get:function(){return this._debugShaders}},throwOnWebGLError:{get:function(){return this._throwOnWebGLError},set:function(e){this._throwOnWebGLError=e,this._gl=Frt(this._originalGLContext,e?vrt:void 0)}},defaultTexture:{get:function(){return this._defaultTexture===void 0&&(this._defaultTexture=new Wt({context:this,source:{width:1,height:1,arrayBufferView:new Uint8Array([255,255,255,255])},flipY:!1})),this._defaultTexture}},defaultEmissiveTexture:{get:function(){return this._defaultEmissiveTexture===void 0&&(this._defaultEmissiveTexture=new Wt({context:this,pixelFormat:ot.RGB,source:{width:1,height:1,arrayBufferView:new Uint8Array([0,0,0])},flipY:!1})),this._defaultEmissiveTexture}},defaultNormalTexture:{get:function(){return this._defaultNormalTexture===void 0&&(this._defaultNormalTexture=new Wt({context:this,pixelFormat:ot.RGB,source:{width:1,height:1,arrayBufferView:new Uint8Array([128,128,255])},flipY:!1})),this._defaultNormalTexture}},defaultCubeMap:{get:function(){if(this._defaultCubeMap===void 0){let e={width:1,height:1,arrayBufferView:new Uint8Array([255,255,255,255])};this._defaultCubeMap=new Tr({context:this,source:{positiveX:e,negativeX:e,positiveY:e,negativeY:e,positiveZ:e,negativeZ:e},flipY:!1})}return this._defaultCubeMap}},drawingBufferHeight:{get:function(){return this._gl.drawingBufferHeight}},drawingBufferWidth:{get:function(){return this._gl.drawingBufferWidth}},defaultFramebuffer:{get:function(){return Art}}});function fge(e,t,n,i){let o=e._currentRenderState,r=e._currentPassState;e._currentRenderState=t,e._currentPassState=n,Ue.partialApply(e._gl,o,t,r,n,i)}var $4;typeof WebGLRenderingContext<"u"&&($4=[ie.BACK]);function ej(e,t){if(t!==e._currentFramebuffer){e._currentFramebuffer=t;let n=$4;if(l(t))t._bind(),n=t._getActiveColorAttachments();else{let i=e._gl;i.bindFramebuffer(i.FRAMEBUFFER,null)}e.drawBuffers&&e.glDrawBuffers(n)}}var Mrt=new ai;lm.prototype.clear=function(e,t){e=y(e,Mrt),t=y(t,this._defaultPassState);let n=this._gl,i=0,o=e.color,r=e.depth,s=e.stencil;l(o)&&(B.equals(this._clearColor,o)||(B.clone(o,this._clearColor),n.clearColor(o.red,o.green,o.blue,o.alpha)),i|=n.COLOR_BUFFER_BIT),l(r)&&(r!==this._clearDepth&&(this._clearDepth=r,n.clearDepth(r)),i|=n.DEPTH_BUFFER_BIT),l(s)&&(s!==this._clearStencil&&(this._clearStencil=s,n.clearStencil(s)),i|=n.STENCIL_BUFFER_BIT);let a=y(e.renderState,this._defaultRenderState);fge(this,a,t,!0);let c=y(e.framebuffer,t.framebuffer);ej(this,c),n.clear(i)};function Nrt(e,t,n,i,o){ej(e,t),fge(e,o,n,!1),i._bind(),e._maxFrameTextureUnitIndex=Math.max(e._maxFrameTextureUnitIndex,i.maximumTextureUnitIndex)}function krt(e,t,n,i){let o=t._primitiveType,r=t._vertexArray,s=t._offset,a=t._count,c=t.instanceCount;e._us.model=y(t._modelMatrix,M.IDENTITY),n._setUniforms(i,e._us,e.validateShaderProgram),r._bind();let d=r.indexBuffer;l(d)?(s=s*d.bytesPerIndex,l(a)?a=Math.min(a,d.numberOfIndices):a=d.numberOfIndices,c===0?e._gl.drawElements(o,a,d.indexDatatype,s):e.glDrawElementsInstanced(o,a,d.indexDatatype,s,c)):(l(a)?a=Math.min(a,r.numberOfVertices):a=r.numberOfVertices,c===0?e._gl.drawArrays(o,s,a):e.glDrawArraysInstanced(o,s,a,c)),r._unBind()}lm.prototype.draw=function(e,t,n,i){t=y(t,this._defaultPassState);let o=y(e._framebuffer,t.framebuffer),r=y(e._renderState,this._defaultRenderState);n=y(n,e._shaderProgram),i=y(i,e._uniformMap),Nrt(this,o,t,n,r),krt(this,e,n,i)};lm.prototype.endFrame=function(){let e=this._gl;e.useProgram(null),this._currentFramebuffer=void 0,e.bindFramebuffer(e.FRAMEBUFFER,null);let t=$4;this.drawBuffers&&this.glDrawBuffers(t);let n=this._maxFrameTextureUnitIndex;this._maxFrameTextureUnitIndex=0;for(let i=0;i0&&(a=s.getColorTexture(0).pixelDatatype);let c=ot.createTypedArray(ot.RGBA,a,o,r);return ej(this,s),t.readPixels(n,i,o,r,ot.RGBA,je.toWebGLConstant(a,this),c),c};var pge={position:0,textureCoordinates:1};lm.prototype.getViewportQuadVertexArray=function(){let e=this.cache.viewportQuad_vertexArray;if(!l(e)){let t=new mt({attributes:{position:new Ze({componentDatatype:Q.FLOAT,componentsPerAttribute:2,values:[-1,-1,1,-1,1,1,-1,1]}),textureCoordinates:new Ze({componentDatatype:Q.FLOAT,componentsPerAttribute:2,values:[0,0,1,0,1,1,0,1]})},indices:new Uint16Array([0,1,2,0,2,3]),primitiveType:Ae.TRIANGLES});e=oi.fromGeometry({context:this,geometry:t,attributeLocations:pge,bufferUsage:ke.STATIC_DRAW,interleave:!0}),this.cache.viewportQuad_vertexArray=e}return e};lm.prototype.createViewportQuadCommand=function(e,t){return t=y(t,y.EMPTY_OBJECT),new $e({vertexArray:this.getViewportQuadVertexArray(),primitiveType:Ae.TRIANGLES,renderState:t.renderState,shaderProgram:en.fromCache({context:this,vertexShaderSource:kT,fragmentShaderSource:e,attributeLocations:pge}),uniformMap:t.uniformMap,owner:t.owner,framebuffer:t.framebuffer,pass:t.pass})};lm.prototype.getObjectByPickColor=function(e){return this._pickObjects[e.toRgba()]};function tj(e,t,n){this._pickObjects=e,this.key=t,this.color=n}Object.defineProperties(tj.prototype,{object:{get:function(){return this._pickObjects[this.key]},set:function(e){this._pickObjects[this.key]=e}}});tj.prototype.destroy=function(){delete this._pickObjects[this.key]};lm.prototype.createPickId=function(e){++this._nextPickColor[0];let t=this._nextPickColor[0];if(t===0)throw new ce("Out of unique Pick IDs.");return this._pickObjects[t]=e,new tj(this._pickObjects,t,B.fromRgba(t))};lm.prototype.isDestroyed=function(){return!1};lm.prototype.destroy=function(){let e=this.cache;for(let t in e)if(e.hasOwnProperty(t)){let n=e[t];l(n.destroy)&&n.destroy()}return this._shaderCache=this._shaderCache.destroy(),this._textureCache=this._textureCache.destroy(),this._defaultTexture=this._defaultTexture&&this._defaultTexture.destroy(),this._defaultEmissiveTexture=this._defaultEmissiveTexture&&this._defaultEmissiveTexture.destroy(),this._defaultNormalTexture=this._defaultNormalTexture&&this._defaultNormalTexture.destroy(),this._defaultCubeMap=this._defaultCubeMap&&this._defaultCubeMap.destroy(),me(this)};var Pw=lm;var ETi=T(S(),1);function Urt(e,t,n){let i={flipY:!0,skipColorSpaceConversion:n,preferImageBitmap:!0},o=[Re.createIfNeeded(t.positiveX).fetchImage(i),Re.createIfNeeded(t.negativeX).fetchImage(i),Re.createIfNeeded(t.positiveY).fetchImage(i),Re.createIfNeeded(t.negativeY).fetchImage(i),Re.createIfNeeded(t.positiveZ).fetchImage(i),Re.createIfNeeded(t.negativeZ).fetchImage(i)];return Promise.all(o).then(function(r){return new Tr({context:e,source:{positiveX:r[0],negativeX:r[1],positiveY:r[2],negativeY:r[3],positiveZ:r[4],negativeZ:r[5]}})})}var vw=Urt;var QQi=T(S(),1);var WTi=T(S(),1);function Drt(e){let t,n=e.name,i=e.message;l(n)&&l(i)?t=`${n}: ${i}`:t=e.toString();let o=e.stack;return l(o)&&(t+=` ${o}`),t}var np=Drt;var HTi=T(S(),1);var kTi=T(S(),1);var wTi=T(S(),1);async function Brt(e,t,n,i){return l(i)||(i=!1),Hrt(e,t,n,i)}function Ort(e,t,n){let i=e[0],o=i.terrainProvider.requestTileGeometry(i.x,i.y,i.level);if(!o)return!1;let r;return n?r=o.then(gge(i)):r=o.then(gge(i)).catch(zrt(i)),e.shift(),t.push(r),!0}function Yrt(e){return new Promise(function(t){setTimeout(t,e)})}function nj(e,t,n){return e.length?Ort(e,t,n)?nj(e,t,n):Yrt(100).then(()=>nj(e,t,n)):Promise.resolve()}function Hrt(e,t,n,i){let o=e.tilingScheme,r,s=[],a={};for(r=0;r0&&await yge(e,a,n),t}var DT=yge;async function oj(e,t){let n=t.terrainProvider,i=t.mapProjection,o=i.ellipsoid,r,s=t.camera.getRectangleCameraCoordinates(e);if(t.mode===oe.SCENE3D?r=o.cartesianToCartographic(s):r=i.unproject(s),!l(n))return r;let a=n.availability;if(!l(a)||t.mode===oe.SCENE2D)return r;let c=[le.center(e),le.southeast(e),le.southwest(e),le.northeast(e),le.northwest(e)],d=await oj._sampleTerrainMostDetailed(n,c),u=!1,h=d.reduce(function(g,f){return l(f.height)?(u=!0,Math.max(f.height,g)):g},-Number.MAX_VALUE),p=r;return u&&(p.height+=h),p}oj._sampleTerrainMostDetailed=DT;var BT=oj;var zIi=T(S(),1);var lCi=T(S(),1);var eCi=T(S(),1);var KTi=T(S(),1),Krt={NONE:0,LERC:1},dm=Object.freeze(Krt);var LSi=T(S(),1);var cSi=T(S(),1);var QTi=T(S(),1),Jrt={NONE:0,BITS12:1},oa=Object.freeze(Jrt);var OT=new m,Qrt=new m,um=new D,AD=new M,jrt=new M,qrt=Math.pow(2,12);function Lc(e,t,n,i,o,r,s,a,c,d){let u=oa.NONE,h,p;if(l(t)&&l(n)&&l(i)&&l(o)){let g=t.minimum,f=t.maximum,x=m.subtract(f,g,Qrt),_=i-n;Math.max(m.maximumComponent(x),_)0,g=y(e.isGeographic,!0),f=y(e.ellipsoid,ne.default),x=1/f.maximumRadius,_=le.clone(e.nativeRectangle),C=le.clone(e.rectangle),V,L,R,G;l(C)?(V=C.west,L=C.south,R=C.east,G=C.north):g?(V=a(_.west),L=a(_.south),R=a(_.east),G=a(_.north)):(V=_.west*x,L=s-2*o(r(-_.south*x)),R=_.east*x,G=s-2*o(r(-_.north*x)));let I=e.relativeToCenter,v=l(I);I=v?I:m.ZERO;let P=y(e.includeWebMercatorT,!1),w=y(e.exaggeration,1),A=y(e.exaggerationRelativeHeight,0),Z=w!==1,E=y(e.structure,ip.DEFAULT_STRUCTURE),X=y(E.heightScale,ip.DEFAULT_STRUCTURE.heightScale),F=y(E.heightOffset,ip.DEFAULT_STRUCTURE.heightOffset),N=y(E.elementsPerHeight,ip.DEFAULT_STRUCTURE.elementsPerHeight),O=y(E.stride,ip.DEFAULT_STRUCTURE.stride),U=y(E.elementMultiplier,ip.DEFAULT_STRUCTURE.elementMultiplier),Y=y(E.isBigEndian,ip.DEFAULT_STRUCTURE.isBigEndian),k=le.computeWidth(_),H=le.computeHeight(_),K=k/(d-1),te=H/(u-1);g||(k*=x,H*=x);let z=f.radiiSquared,j=z.x,ee=z.y,pe=z.z,_e=65536,ae=-65536,ye=wt.eastNorthUpToFixedFrame(I,f),Se=M.inverseTransformation(ye,est),Ee,Ie;P&&(Ee=Wi.geodeticLatitudeToMercatorAngle(L),Ie=1/(Wi.geodeticLatitudeToMercatorAngle(G)-Ee));let we=tst;we.x=Number.POSITIVE_INFINITY,we.y=Number.POSITIVE_INFINITY,we.z=Number.POSITIVE_INFINITY;let ve=nst;ve.x=Number.NEGATIVE_INFINITY,ve.y=Number.NEGATIVE_INFINITY,ve.z=Number.NEGATIVE_INFINITY;let at=Number.POSITIVE_INFINITY,Je=d*u,pt=h>0?d*2+u*2:0,Qe=Je+pt,_t=new Array(Qe),ht=new Array(Qe),bt=new Array(Qe),En=P?new Array(Qe):[],sn=Z?new Array(Qe):[],Ce=0,Le=u,wn=0,Mo=d;p&&(--Ce,++Le,--wn,++Mo);let Jo=1e-5;for(let qe=Ce;qe=u&&(Gt=u-1);let Yt=_.north-te*Gt;g?Yt=a(Yt):Yt=s-2*o(r(-Yt*x));let Rn=(Yt-L)/(G-L);Rn=W.clamp(Rn,0,1);let No=qe===Ce,Io=qe===Le-1;h>0&&(No?Yt+=Jo*H:Io&&(Yt-=Jo*H));let vc=t(Yt),wc=n(Yt),Ei=pe*wc,ki;P&&(ki=(Wi.geodeticLatitudeToMercatorAngle(Yt)-Ee)*Ie);for(let Ia=wn;Ia=d&&(mn=d-1);let Fn=Gt*(d*O)+mn*O,zi;if(N===1)zi=c[Fn];else{zi=0;let Wr;if(Y)for(Wr=0;Wr=0;--Wr)zi=zi*U+c[Fn+Wr]}zi=zi*X+F,ae=Math.max(ae,zi),_e=Math.min(_e,zi);let ze=_.west+K*mn;g?ze=a(ze):ze=ze*x;let Cl=(ze-V)/(R-V);Cl=W.clamp(Cl,0,1);let Xo=Gt*d+mn;if(h>0){let Wr=Ia===wn,Jt=Ia===Mo-1,Ve=No||Io||Wr||Jt;if((No||Io)&&(Wr||Jt))continue;Ve&&(zi-=h,Wr?(Xo=Je+(u-Gt-1),ze-=Jo*k):Io?Xo=Je+u+(d-mn-1):Jt?(Xo=Je+u+d+Gt,ze+=Jo*k):No&&(Xo=Je+u+d+u+mn))}let Rm=vc*t(ze),hu=vc*n(ze),nf=j*Rm,fu=ee*hu,lo=1/i(nf*Rm+fu*hu+Ei*wc),pu=nf*lo,Zm=fu*lo,Vl=Ei*lo,ks=new m;ks.x=pu+Rm*zi,ks.y=Zm+hu*zi,ks.z=Vl+wc*zi,M.multiplyByPoint(Se,ks,rj),m.minimumByComponent(rj,we,we),m.maximumByComponent(rj,ve,ve),at=Math.min(at,zi),_t[Xo]=ks,bt[Xo]=new D(Cl,Rn),ht[Xo]=zi,P&&(En[Xo]=ki),Z&&(sn[Xo]=f.geodeticSurfaceNormal(ks))}}let Xr=de.fromPoints(_t),da;l(C)&&(da=Gn.fromRectangle(C,_e,ae,f));let Vs;v&&(Vs=new Hb(f).computeHorizonCullingPointPossiblyUnderEllipsoid(I,_t,_e));let ua=new q0(we,ve,I),Ne=new Rc(I,ua,at,ae,ye,!1,P,Z,w,A),ct=new Float32Array(Qe*Ne.stride),it=0;for(let qe=0;qe0?L=ss.getRegularGridAndSkirtIndicesAndEdgeIndices(V.gridWidth,V.gridHeight):L=ss.getRegularGridIndicesAndEdgeIndices(V.gridWidth,V.gridHeight);let R=V.gridWidth*V.gridHeight;return C._mesh=new mm(h,new Float32Array(V.vertices),L.indices,L.indexCountWithoutSkirts,R,V.minimumHeight,V.maximumHeight,de.clone(V.boundingSphere3D),m.clone(V.occludeePointInScaledSpace),V.numberOfAttributes,Gn.clone(V.orientedBoundingBox),Rc.clone(V.encoding),L.westIndicesSouthToNorth,L.southIndicesEastToWest,L.eastIndicesNorthToSouth,L.northIndicesWestToEast),C._buffer=void 0,C._mesh})};f0.prototype._createMeshSync=function(e){let t=e.tilingScheme,n=e.x,i=e.y,o=e.level,r=y(e.exaggeration,1),s=y(e.exaggerationRelativeHeight,0),a=t.ellipsoid,c=t.tileXYToNativeRectangle(n,i,o),d=t.tileXYToRectangle(n,i,o),u=a.cartographicToCartesian(le.center(d)),h=this._structure,g=ss.getEstimatedLevelZeroGeometricErrorForAHeightmap(a,this._width,t.getNumberOfXTilesAtLevel(0))/(1<0?x=ss.getRegularGridAndSkirtIndicesAndEdgeIndices(this._width,this._height):x=ss.getRegularGridIndicesAndEdgeIndices(this._width,this._height);let _=f.gridWidth*f.gridHeight;return this._mesh=new mm(u,f.vertices,x.indices,x.indexCountWithoutSkirts,_,f.minimumHeight,f.maximumHeight,f.boundingSphere3D,f.occludeePointInScaledSpace,f.encoding.stride,f.orientedBoundingBox,f.encoding,x.westIndicesSouthToNorth,x.southIndicesEastToWest,x.eastIndicesNorthToSouth,x.northIndicesWestToEast),this._mesh};f0.prototype.interpolateHeight=function(e,t,n){let i=this._width,o=this._height,r=this._structure,s=r.stride,a=r.elementsPerHeight,c=r.elementMultiplier,d=r.isBigEndian,u=r.heightOffset,h=r.heightScale,p=l(this._mesh),g=this._encoding===dm.LERC;if(!p&&g)return;let x;if(p){let _=this._mesh.vertices,C=this._mesh.encoding;x=Rge(_,C,u,h,e,i,o,t,n)}else x=sst(this._buffer,a,c,s,d,e,i,o,t,n),x=x*h+u;return x};f0.prototype.upsample=function(e,t,n,i,o,r,s){let a=this._mesh;if(!l(a))return;let c=this._width,d=this._height,u=this._structure,h=u.stride,p=new this._bufferType(c*d*h),g=a.vertices,f=a.encoding,x=e.tileXYToRectangle(t,n,i),_=e.tileXYToRectangle(o,r,s),C=u.heightOffset,V=u.heightScale,L=u.elementsPerHeight,R=u.elementMultiplier,G=u.isBigEndian,I=Math.pow(R,L-1);for(let v=0;vu.highestEncodedHeight?u.highestEncodedHeight:b,ast(p,L,R,I,h,G,v*c+w,b)}}return Promise.resolve(new f0({buffer:p,width:c,height:d,childTileMask:0,structure:this._structure,createdByUpsampling:!0}))};f0.prototype.isChildAvailable=function(e,t,n,i){let o=2;return n!==e*2&&++o,i!==t*2&&(o-=2),(this._childTileMask&1<=s&&(g=s-1,p=s-2);let f=h|0,x=f+1;x>=a&&(x=a-1,f=a-2);let _=u-p,C=h-f;f=a-1-f,x=a-1-x;let V=UD(e,t,n,i,o,f*s+p),L=UD(e,t,n,i,o,f*s+g),R=UD(e,t,n,i,o,x*s+p),G=UD(e,t,n,i,o,x*s+g);return Zge(_,C,V,L,R,G)}function Rge(e,t,n,i,o,r,s,a,c){let d=(a-o.west)*(r-1)/(o.east-o.west),u=(c-o.south)*(s-1)/(o.north-o.south),h=d|0,p=h+1;p>=r&&(p=r-1,h=r-2);let g=u|0,f=g+1;f>=s&&(f=s-1,g=s-2);let x=d-h,_=u-g;g=s-1-g,f=s-1-f;let C=(t.decodeHeight(e,g*r+h)-n)/i,V=(t.decodeHeight(e,g*r+p)-n)/i,L=(t.decodeHeight(e,f*r+h)-n)/i,R=(t.decodeHeight(e,f*r+p)-n)/i;return Zge(x,_,C,V,L,R)}function Zge(e,t,n,i,o,r){return t=0;--a)s=s*n+e[r+a];return s}function ast(e,t,n,i,o,r,s,a){s*=o;let c;if(r)for(c=0;c0;--c)e[s+c]=a/i|0,a-=e[s+c]*i,i/=n;e[s+c]=a}var za=f0;function JV(e){e=y(e,y.EMPTY_OBJECT),this._tilingScheme=e.tilingScheme,l(this._tilingScheme)||(this._tilingScheme=new Qi({ellipsoid:y(e.ellipsoid,ne.default)})),this._levelZeroMaximumGeometricError=ss.getEstimatedLevelZeroGeometricErrorForAHeightmap(this._tilingScheme.ellipsoid,64,this._tilingScheme.getNumberOfXTilesAtLevel(0)),this._errorEvent=new be}Object.defineProperties(JV.prototype,{errorEvent:{get:function(){return this._errorEvent}},credit:{get:function(){}},tilingScheme:{get:function(){return this._tilingScheme}},hasWaterMask:{get:function(){return!1}},hasVertexNormals:{get:function(){return!1}},availability:{get:function(){}}});JV.prototype.requestTileGeometry=function(e,t,n,i){return Promise.resolve(new za({buffer:new Uint8Array(16*16),width:16,height:16}))};JV.prototype.getLevelMaximumGeometricError=function(e){return this._levelZeroMaximumGeometricError/(1< 0 uniform sampler2D u_dayTextures[TEXTURE_UNITS]; uniform vec4 u_dayTextureTranslationAndScale[TEXTURE_UNITS]; uniform bool u_dayTextureUseWebMercatorT[TEXTURE_UNITS]; #ifdef APPLY_ALPHA uniform float u_dayTextureAlpha[TEXTURE_UNITS]; #endif #ifdef APPLY_DAY_NIGHT_ALPHA uniform float u_dayTextureNightAlpha[TEXTURE_UNITS]; uniform float u_dayTextureDayAlpha[TEXTURE_UNITS]; #endif #ifdef APPLY_SPLIT uniform float u_dayTextureSplit[TEXTURE_UNITS]; #endif #ifdef APPLY_BRIGHTNESS uniform float u_dayTextureBrightness[TEXTURE_UNITS]; #endif #ifdef APPLY_CONTRAST uniform float u_dayTextureContrast[TEXTURE_UNITS]; #endif #ifdef APPLY_HUE uniform float u_dayTextureHue[TEXTURE_UNITS]; #endif #ifdef APPLY_SATURATION uniform float u_dayTextureSaturation[TEXTURE_UNITS]; #endif #ifdef APPLY_GAMMA uniform float u_dayTextureOneOverGamma[TEXTURE_UNITS]; #endif //\u3010\u706B\u661F\u79D1\u6280marsgis.cn\u3011 Hao 2022-1-5 \u74E6\u7247\u6EE4\u955C\u6548\u679C #ifdef APPLY_INVERT_COLOR_MARS3D uniform bool u_mars3dTextureInvertColor[TEXTURE_UNITS]; #endif #ifdef APPLY_FILTER_COLOR_MARS3D uniform vec3 u_mars3dTextureFilterColor[TEXTURE_UNITS]; #endif //\u3010\u706B\u661F\u79D1\u6280marsgis.cn\u3011 Hao 2022-1-5 \u74E6\u7247\u6EE4\u955C\u6548\u679C #ifdef APPLY_IMAGERY_CUTOUT uniform vec4 u_dayTextureCutoutRectangles[TEXTURE_UNITS]; #endif #ifdef APPLY_COLOR_TO_ALPHA uniform vec4 u_colorsToAlpha[TEXTURE_UNITS]; #endif uniform vec4 u_dayTextureTexCoordsRectangle[TEXTURE_UNITS]; #endif #if defined(HAS_WATER_MASK) && (defined(SHOW_REFLECTIVE_OCEAN) || defined(APPLY_MATERIAL)) uniform sampler2D u_waterMask; uniform vec4 u_waterMaskTranslationAndScale; uniform float u_zoomedOutOceanSpecularIntensity; #endif #ifdef SHOW_OCEAN_WAVES uniform sampler2D u_oceanNormalMap; #endif #if defined(ENABLE_DAYNIGHT_SHADING) || defined(GROUND_ATMOSPHERE) uniform vec2 u_lightingFadeDistance; #endif #ifdef TILE_LIMIT_RECTANGLE uniform vec4 u_cartographicLimitRectangle; #endif #ifdef GROUND_ATMOSPHERE uniform vec2 u_nightFadeDistance; #endif #ifdef ENABLE_CLIPPING_PLANES uniform highp sampler2D u_clippingPlanes; uniform mat4 u_clippingPlanesMatrix; uniform vec4 u_clippingPlanesEdgeStyle; #endif #ifdef ENABLE_CLIPPING_POLYGONS uniform highp sampler2D u_clippingDistance; in vec2 v_clippingPosition; flat in int v_regionIndex; #endif #if defined(GROUND_ATMOSPHERE) || defined(FOG) && defined(DYNAMIC_ATMOSPHERE_LIGHTING) && (defined(ENABLE_VERTEX_LIGHTING) || defined(ENABLE_DAYNIGHT_SHADING)) uniform float u_minimumBrightness; #endif #ifdef COLOR_CORRECT uniform vec3 u_hsbShift; // Hue, saturation, brightness #endif #ifdef HIGHLIGHT_FILL_TILE uniform vec4 u_fillHighlightColor; #endif #ifdef TRANSLUCENT uniform vec4 u_frontFaceAlphaByDistance; uniform vec4 u_backFaceAlphaByDistance; uniform vec4 u_translucencyRectangle; #endif #ifdef UNDERGROUND_COLOR uniform vec4 u_undergroundColor; uniform vec4 u_undergroundColorAlphaByDistance; #endif #ifdef ENABLE_VERTEX_LIGHTING uniform float u_lambertDiffuseMultiplier; uniform float u_vertexShadowDarkness; #endif in vec3 v_positionMC; in vec3 v_positionEC; in vec3 v_textureCoordinates; in vec3 v_normalMC; in vec3 v_normalEC; #ifdef APPLY_MATERIAL in float v_height; in float v_slope; in float v_aspect; #endif //\u3010\u706B\u661F\u79D1\u6280marsgis.cn\u3011 Muyao 2023-07-19 \u5730\u5F62\u533A\u57DF\u6750\u8D28(\u6DF9\u6CA1\uFF0C\u7B49\u9AD8\u7EBF) #ifdef APPLY_MARS3D_FLOOD uniform bool u_mars_flood_enabled; uniform bool u_mars_flood_only; uniform vec4 u_mars_flood_rectangle; uniform highp sampler2D u_mars_flood_texture; #endif //\u3010\u706B\u661F\u79D1\u6280marsgis.cn\u3011 Muyao 2023-07-19 \u5730\u5F62\u533A\u57DF\u6750\u8D28(\u6DF9\u6CA1\uFF0C\u7B49\u9AD8\u7EBF) //\u3010\u706B\u661F\u79D1\u6280marsgis.cn\u3011 Muyao 2023-07-19 \u5730\u5F62\u5F00\u6316 #ifdef APPLY_MARS3D_CLIP uniform bool u_mars_clip_enabled; uniform bool u_mars_clip_only; uniform vec4 u_mars_clip_rectangle; uniform highp sampler2D u_mars_clip_texture; #endif //\u3010\u706B\u661F\u79D1\u6280marsgis.cn\u3011 Muyao 2023-07-19 \u5730\u5F62\u5F00\u6316 //\u3010\u706B\u661F\u79D1\u6280marsgis.cn\u3011 Muyao 2023-07-19 \u5730\u5F62\u7F16\u8F91\u901A\u7528\u7684\u8303\u56F4\u5224\u65AD\u65B9\u6CD5\uFF08\u542B \u5730\u5F62\u62AC\u5347/\u5730\u5F62\u538B\u5E73/\u5730\u5F62\u5F00\u6316/\u5730\u5F62\u533A\u57DF\u6750\u8D28\uFF09 uniform highp float u_mars_inverseTileWidth; uniform highp vec2 u_mars_cartographicTileRectangle; bool inAreaMars3DRange(vec4 rectangle, sampler2D rangeTexture) { float lo = v_textureCoordinates.x / u_mars_inverseTileWidth + u_mars_cartographicTileRectangle.x; float la = v_textureCoordinates.y / u_mars_inverseTileWidth + u_mars_cartographicTileRectangle.y; float newX = (lo - rectangle.x) / rectangle.z; float newY = (la - rectangle.y) / rectangle.w; if(newX >= 0.0 && newX <= 1.0 && newY >= 0.0 && newY <= 1.0){ vec4 point = texture(rangeTexture, vec2(newX, newY)); return point.r > 0.0; } return false; } //\u3010\u706B\u661F\u79D1\u6280marsgis.cn\u3011 Muyao 2023-07-19 \u5730\u5F62\u7F16\u8F91\u901A\u7528\u7684\u8303\u56F4\u5224\u65AD\u65B9\u6CD5\uFF08\u542B \u5730\u5F62\u62AC\u5347/\u5730\u5F62\u538B\u5E73/\u5730\u5F62\u5F00\u6316/\u5730\u5F62\u533A\u57DF\u6750\u8D28\uFF09 #if defined(FOG) || defined(GROUND_ATMOSPHERE) || defined(UNDERGROUND_COLOR) || defined(TRANSLUCENT) in float v_distance; #endif #if defined(GROUND_ATMOSPHERE) || defined(FOG) in vec3 v_atmosphereRayleighColor; in vec3 v_atmosphereMieColor; in float v_atmosphereOpacity; #endif // \u3010\u706B\u661F\u79D1\u6280marsgis.cn\u3011 Muyao 2023-02-20 \u5730\u5F62\u62AC\u5347 #ifdef APPLY_MARS3D_UPLIFT uniform vec4 u_mars_uplift_rectangle; uniform highp sampler2D u_mars_uplift_texture; uniform bool u_mars_uplift_enabled; uniform bool u_mars_uplift_hideInsideOrOutside; #endif // \u3010\u706B\u661F\u79D1\u6280marsgis.cn\u3011 Muyao 2023-02-20 \u5730\u5F62\u62AC\u5347 #if defined(UNDERGROUND_COLOR) || defined(TRANSLUCENT) float interpolateByDistance(vec4 nearFarScalar, float distance) { float startDistance = nearFarScalar.x; float startValue = nearFarScalar.y; float endDistance = nearFarScalar.z; float endValue = nearFarScalar.w; float t = clamp((distance - startDistance) / (endDistance - startDistance), 0.0, 1.0); return mix(startValue, endValue, t); } #endif #if defined(UNDERGROUND_COLOR) || defined(TRANSLUCENT) || defined(APPLY_MATERIAL) vec4 alphaBlend(vec4 sourceColor, vec4 destinationColor) { return sourceColor * vec4(sourceColor.aaa, 1.0) + destinationColor * (1.0 - sourceColor.a); } #endif #ifdef TRANSLUCENT bool inTranslucencyRectangle() { return v_textureCoordinates.x > u_translucencyRectangle.x && v_textureCoordinates.x < u_translucencyRectangle.z && v_textureCoordinates.y > u_translucencyRectangle.y && v_textureCoordinates.y < u_translucencyRectangle.w; } #endif vec4 sampleAndBlend( vec4 previousColor, sampler2D textureToSample, vec2 tileTextureCoordinates, vec4 textureCoordinateRectangle, vec4 textureCoordinateTranslationAndScale, float textureAlpha, float textureNightAlpha, float textureDayAlpha, float textureBrightness, float textureContrast, float textureHue, float textureSaturation, float textureOneOverGamma, //\u3010\u706B\u661F\u79D1\u6280marsgis.cn\u3011 Hao 2022-1-5 \u74E6\u7247\u6EE4\u955C\u6548\u679C bool textureInvertColor, vec3 texturefilterColor, //\u3010\u706B\u661F\u79D1\u6280marsgis.cn\u3011 Hao 2022-1-5 \u74E6\u7247\u6EE4\u955C\u6548\u679C float split, vec4 colorToAlpha, float nightBlend) { // This crazy step stuff sets the alpha to 0.0 if this following condition is true: // tileTextureCoordinates.s < textureCoordinateRectangle.s || // tileTextureCoordinates.s > textureCoordinateRectangle.p || // tileTextureCoordinates.t < textureCoordinateRectangle.t || // tileTextureCoordinates.t > textureCoordinateRectangle.q // In other words, the alpha is zero if the fragment is outside the rectangle // covered by this texture. Would an actual 'if' yield better performance? vec2 alphaMultiplier = step(textureCoordinateRectangle.st, tileTextureCoordinates); textureAlpha = textureAlpha * alphaMultiplier.x * alphaMultiplier.y; alphaMultiplier = step(vec2(0.0), textureCoordinateRectangle.pq - tileTextureCoordinates); textureAlpha = textureAlpha * alphaMultiplier.x * alphaMultiplier.y; #if defined(APPLY_DAY_NIGHT_ALPHA) && defined(ENABLE_DAYNIGHT_SHADING) textureAlpha *= mix(textureDayAlpha, textureNightAlpha, nightBlend); #endif vec2 translation = textureCoordinateTranslationAndScale.xy; vec2 scale = textureCoordinateTranslationAndScale.zw; vec2 textureCoordinates = tileTextureCoordinates * scale + translation; vec4 value = texture(textureToSample, textureCoordinates); vec3 color = value.rgb; float alpha = value.a; #ifdef APPLY_COLOR_TO_ALPHA vec3 colorDiff = abs(color.rgb - colorToAlpha.rgb); colorDiff.r = czm_maximumComponent(colorDiff); alpha = czm_branchFreeTernary(colorDiff.r < colorToAlpha.a, 0.0, alpha); #endif #if !defined(APPLY_GAMMA) vec4 tempColor = czm_gammaCorrect(vec4(color, alpha)); color = tempColor.rgb; alpha = tempColor.a; #else color = pow(color, vec3(textureOneOverGamma)); #endif #ifdef APPLY_SPLIT float splitPosition = czm_splitPosition; // Split to the left if (split < 0.0 && gl_FragCoord.x > splitPosition) { alpha = 0.0; } // Split to the right else if (split > 0.0 && gl_FragCoord.x < splitPosition) { alpha = 0.0; } #endif #ifdef APPLY_BRIGHTNESS color = mix(vec3(0.0), color, textureBrightness); #endif #ifdef APPLY_CONTRAST color = mix(vec3(0.5), color, textureContrast); #endif #ifdef APPLY_HUE color = czm_hue(color, textureHue); #endif #ifdef APPLY_SATURATION color = czm_saturation(color, textureSaturation); #endif //\u3010\u706B\u661F\u79D1\u6280marsgis.cn\u3011 Hao 2022-1-5 \u74E6\u7247\u6EE4\u955C\u6548\u679C #ifdef APPLY_INVERT_COLOR_MARS3D if(textureInvertColor) { color = vec3(1.0 - color.r, 1.0 - color.g, 1.0 - color.b); } #endif #ifdef APPLY_FILTER_COLOR_MARS3D if(texturefilterColor.x != 1.0 || texturefilterColor.y != 1.0 || texturefilterColor.z != 1.0) { color = vec3(color.r * texturefilterColor.x, color.g * texturefilterColor.y, color.b * texturefilterColor.z); } #endif //\u3010\u706B\u661F\u79D1\u6280marsgis.cn\u3011 Hao 2022-1-5 \u74E6\u7247\u6EE4\u955C\u6548\u679C float sourceAlpha = alpha * textureAlpha; float outAlpha = mix(previousColor.a, 1.0, sourceAlpha); outAlpha += sign(outAlpha) - 1.0; vec3 outColor = mix(previousColor.rgb * previousColor.a, color, sourceAlpha) / outAlpha; // When rendering imagery for a tile in multiple passes, // some GPU/WebGL implementation combinations will not blend fragments in // additional passes correctly if their computation includes an unmasked // divide-by-zero operation, // even if it's not in the output or if the output has alpha zero. // // For example, without sanitization for outAlpha, // this renders without artifacts: // if (outAlpha == 0.0) { outColor = vec3(0.0); } // // but using czm_branchFreeTernary will cause portions of the tile that are // alpha-zero in the additional pass to render as black instead of blending // with the previous pass: // outColor = czm_branchFreeTernary(outAlpha == 0.0, vec3(0.0), outColor); // // So instead, sanitize against divide-by-zero, // store this state on the sign of outAlpha, and correct on return. return vec4(outColor, max(outAlpha, 0.0)); } vec3 colorCorrect(vec3 rgb) { #ifdef COLOR_CORRECT // Convert rgb color to hsb vec3 hsb = czm_RGBToHSB(rgb); // Perform hsb shift hsb.x += u_hsbShift.x; // hue hsb.y = clamp(hsb.y + u_hsbShift.y, 0.0, 1.0); // saturation hsb.z = hsb.z > czm_epsilon7 ? hsb.z + u_hsbShift.z : 0.0; // brightness // Convert shifted hsb back to rgb rgb = czm_HSBToRGB(hsb); #endif return rgb; } vec4 computeDayColor(vec4 initialColor, vec3 textureCoordinates, float nightBlend); vec4 computeWaterColor(vec3 positionEyeCoordinates, vec2 textureCoordinates, mat3 enuToEye, vec4 imageryColor, float specularMapValue, float fade); const float fExposure = 2.0; vec3 computeEllipsoidPosition() { float mpp = czm_metersPerPixel(vec4(0.0, 0.0, -czm_currentFrustum.x, 1.0), 1.0); vec2 xy = gl_FragCoord.xy / czm_viewport.zw * 2.0 - vec2(1.0); xy *= czm_viewport.zw * mpp * 0.5; vec3 direction; if (czm_orthographicIn3D == 1.0) { direction = vec3(0.0, 0.0, -1.0); } else { direction = normalize(vec3(xy, -czm_currentFrustum.x)); } czm_ray ray = czm_ray(vec3(0.0), direction); vec3 ellipsoid_center = czm_view[3].xyz; czm_raySegment intersection = czm_rayEllipsoidIntersectionInterval(ray, ellipsoid_center, czm_ellipsoidInverseRadii); vec3 ellipsoidPosition = czm_pointAlongRay(ray, intersection.start); return (czm_inverseView * vec4(ellipsoidPosition, 1.0)).xyz; } void main() { //\u3010\u706B\u661F\u79D1\u6280marsgis.cn\u3011 Muyao 2023-07-19 \u5730\u5F62\u5F00\u6316 #ifdef APPLY_MARS3D_CLIP if(u_mars_clip_enabled) { if(u_mars_clip_only) { if(!inAreaMars3DRange(u_mars_clip_rectangle, u_mars_clip_texture)) { discard; } } else { if(inAreaMars3DRange(u_mars_clip_rectangle, u_mars_clip_texture)) { discard; } } } #endif //\u3010\u706B\u661F\u79D1\u6280marsgis.cn\u3011 Muyao 2023-07-19 \u5730\u5F62\u5F00\u6316 #ifdef TILE_LIMIT_RECTANGLE if (v_textureCoordinates.x < u_cartographicLimitRectangle.x || u_cartographicLimitRectangle.z < v_textureCoordinates.x || v_textureCoordinates.y < u_cartographicLimitRectangle.y || u_cartographicLimitRectangle.w < v_textureCoordinates.y) { discard; } #endif #ifdef ENABLE_CLIPPING_PLANES float clipDistance = clip(gl_FragCoord, u_clippingPlanes, u_clippingPlanesMatrix); #endif #if defined(SHOW_REFLECTIVE_OCEAN) || defined(ENABLE_DAYNIGHT_SHADING) || defined(HDR) vec3 normalMC = czm_geodeticSurfaceNormal(v_positionMC, vec3(0.0), vec3(1.0)); // normalized surface normal in model coordinates vec3 normalEC = czm_normal3D * normalMC; // normalized surface normal in eye coordinates #endif #if defined(APPLY_DAY_NIGHT_ALPHA) && defined(ENABLE_DAYNIGHT_SHADING) float nightBlend = 1.0 - clamp(czm_getLambertDiffuse(czm_lightDirectionEC, normalEC) * 5.0, 0.0, 1.0); #else float nightBlend = 0.0; #endif // The clamp below works around an apparent bug in Chrome Canary v23.0.1241.0 // where the fragment shader sees textures coordinates < 0.0 and > 1.0 for the // fragments on the edges of tiles even though the vertex shader is outputting // coordinates strictly in the 0-1 range. vec4 color = computeDayColor(u_initialColor, clamp(v_textureCoordinates, 0.0, 1.0), nightBlend); #ifdef SHOW_TILE_BOUNDARIES if (v_textureCoordinates.x < (1.0/256.0) || v_textureCoordinates.x > (255.0/256.0) || v_textureCoordinates.y < (1.0/256.0) || v_textureCoordinates.y > (255.0/256.0)) { color = vec4(1.0, 0.0, 0.0, 1.0); } #endif #if defined(ENABLE_DAYNIGHT_SHADING) || defined(GROUND_ATMOSPHERE) float cameraDist; if (czm_sceneMode == czm_sceneMode2D) { cameraDist = max(czm_frustumPlanes.x - czm_frustumPlanes.y, czm_frustumPlanes.w - czm_frustumPlanes.z) * 0.5; } else if (czm_sceneMode == czm_sceneModeColumbusView) { cameraDist = -czm_view[3].z; } else { cameraDist = length(czm_view[3]); } float fadeOutDist = u_lightingFadeDistance.x; float fadeInDist = u_lightingFadeDistance.y; if (czm_sceneMode != czm_sceneMode3D) { vec3 radii = czm_ellipsoidRadii; float maxRadii = max(radii.x, max(radii.y, radii.z)); fadeOutDist -= maxRadii; fadeInDist -= maxRadii; } float fade = clamp((cameraDist - fadeOutDist) / (fadeInDist - fadeOutDist), 0.0, 1.0); #else float fade = 0.0; #endif #if defined(HAS_WATER_MASK) && (defined(SHOW_REFLECTIVE_OCEAN) || defined(APPLY_MATERIAL)) vec2 waterMaskTranslation = u_waterMaskTranslationAndScale.xy; vec2 waterMaskScale = u_waterMaskTranslationAndScale.zw; vec2 waterMaskTextureCoordinates = v_textureCoordinates.xy * waterMaskScale + waterMaskTranslation; waterMaskTextureCoordinates.y = 1.0 - waterMaskTextureCoordinates.y; float mask = texture(u_waterMask, waterMaskTextureCoordinates).r; #ifdef SHOW_REFLECTIVE_OCEAN if (mask > 0.0) { mat3 enuToEye = czm_eastNorthUpToEyeCoordinates(v_positionMC, normalEC); vec2 ellipsoidTextureCoordinates = czm_ellipsoidTextureCoordinates(normalMC); vec2 ellipsoidFlippedTextureCoordinates = czm_ellipsoidTextureCoordinates(normalMC.zyx); vec2 textureCoordinates = mix(ellipsoidTextureCoordinates, ellipsoidFlippedTextureCoordinates, czm_morphTime * smoothstep(0.9, 0.95, normalMC.z)); color = computeWaterColor(v_positionEC, textureCoordinates, enuToEye, color, mask, fade); } #endif #endif #ifdef APPLY_MATERIAL czm_materialInput materialInput; materialInput.st = v_textureCoordinates.st; materialInput.normalEC = normalize(v_normalEC); materialInput.positionToEyeEC = -v_positionEC; materialInput.tangentToEyeMatrix = czm_eastNorthUpToEyeCoordinates(v_positionMC, normalize(v_normalEC)); materialInput.slope = v_slope; materialInput.height = v_height; materialInput.aspect = v_aspect; #ifdef HAS_WATER_MASK materialInput.waterMask = mask; #endif czm_material material = czm_getMaterial(materialInput); //\u3010\u706B\u661F\u79D1\u6280marsgis.cn\u3011 Muyao 2023-07-19 \u5730\u5F62\u533A\u57DF\u6750\u8D28(\u6DF9\u6CA1\uFF0C\u7B49\u9AD8\u7EBF) bool hasAlphaBlend = true; #ifdef APPLY_MARS3D_FLOOD hasAlphaBlend = !u_mars_flood_enabled || (u_mars_flood_enabled && inAreaMars3DRange(u_mars_flood_rectangle, u_mars_flood_texture)); if(u_mars_flood_enabled) { if(u_mars_flood_only) { if(! inAreaMars3DRange(u_mars_flood_rectangle, u_mars_flood_texture)) { discard; } } } #endif //\u3010\u706B\u661F\u79D1\u6280marsgis.cn\u3011 Muyao 2023-07-19 \u5730\u5F62\u533A\u57DF\u6750\u8D28(\u6DF9\u6CA1\uFF0C\u7B49\u9AD8\u7EBF) if(hasAlphaBlend) { vec4 materialColor = vec4(material.diffuse, material.alpha); color = alphaBlend(materialColor, color); } #endif #ifdef ENABLE_VERTEX_LIGHTING float diffuseIntensity = clamp(czm_getLambertDiffuse(czm_lightDirectionEC, normalize(v_normalEC)) * u_lambertDiffuseMultiplier + u_vertexShadowDarkness, 0.0, 1.0); vec4 finalColor = vec4(color.rgb * czm_lightColor * diffuseIntensity, color.a); #elif defined(ENABLE_DAYNIGHT_SHADING) float diffuseIntensity = clamp(czm_getLambertDiffuse(czm_lightDirectionEC, normalEC) * 5.0 + 0.3, 0.0, 1.0); diffuseIntensity = mix(1.0, diffuseIntensity, fade); vec4 finalColor = vec4(color.rgb * czm_lightColor * diffuseIntensity, color.a); #else vec4 finalColor = color; #endif #ifdef ENABLE_CLIPPING_PLANES vec4 clippingPlanesEdgeColor = vec4(1.0); clippingPlanesEdgeColor.rgb = u_clippingPlanesEdgeStyle.rgb; float clippingPlanesEdgeWidth = u_clippingPlanesEdgeStyle.a; if (clipDistance < clippingPlanesEdgeWidth) { finalColor = clippingPlanesEdgeColor; } #endif #ifdef ENABLE_CLIPPING_POLYGONS vec2 clippingPosition = v_clippingPosition; int regionIndex = v_regionIndex; clipPolygons(u_clippingDistance, CLIPPING_POLYGON_REGIONS_LENGTH, clippingPosition, regionIndex); #endif #ifdef HIGHLIGHT_FILL_TILE finalColor = vec4(mix(finalColor.rgb, u_fillHighlightColor.rgb, u_fillHighlightColor.a), finalColor.a); #endif #if defined(DYNAMIC_ATMOSPHERE_LIGHTING_FROM_SUN) vec3 atmosphereLightDirection = czm_sunDirectionWC; #else vec3 atmosphereLightDirection = czm_lightDirectionWC; #endif #if defined(GROUND_ATMOSPHERE) || defined(FOG) if (!czm_backFacing()) { bool dynamicLighting = false; #if defined(DYNAMIC_ATMOSPHERE_LIGHTING) && (defined(ENABLE_DAYNIGHT_SHADING) || defined(ENABLE_VERTEX_LIGHTING)) dynamicLighting = true; #endif vec3 rayleighColor; vec3 mieColor; float opacity; vec3 positionWC; vec3 lightDirection; // When the camera is far away (camera distance > nightFadeOutDistance), the scattering is computed in the fragment shader. // Otherwise, the scattering is computed in the vertex shader. #ifdef PER_FRAGMENT_GROUND_ATMOSPHERE positionWC = computeEllipsoidPosition(); lightDirection = czm_branchFreeTernary(dynamicLighting, atmosphereLightDirection, normalize(positionWC)); computeAtmosphereScattering( positionWC, lightDirection, rayleighColor, mieColor, opacity ); #else positionWC = v_positionMC; lightDirection = czm_branchFreeTernary(dynamicLighting, atmosphereLightDirection, normalize(positionWC)); rayleighColor = v_atmosphereRayleighColor; mieColor = v_atmosphereMieColor; opacity = v_atmosphereOpacity; #endif #ifdef COLOR_CORRECT const bool ignoreBlackPixels = true; rayleighColor = czm_applyHSBShift(rayleighColor, u_hsbShift, ignoreBlackPixels); mieColor = czm_applyHSBShift(mieColor, u_hsbShift, ignoreBlackPixels); #endif vec4 groundAtmosphereColor = computeAtmosphereColor(positionWC, lightDirection, rayleighColor, mieColor, opacity); // Fog is applied to tiles selected for fog, close to the Earth. #ifdef FOG vec3 fogColor = groundAtmosphereColor.rgb; // If there is lighting, apply that to the fog. #if defined(DYNAMIC_ATMOSPHERE_LIGHTING) && (defined(ENABLE_VERTEX_LIGHTING) || defined(ENABLE_DAYNIGHT_SHADING)) float darken = clamp(dot(normalize(czm_viewerPositionWC), atmosphereLightDirection), u_minimumBrightness, 1.0); fogColor *= darken; #endif #ifndef HDR fogColor.rgb = czm_pbrNeutralTonemapping(fogColor.rgb); fogColor.rgb = czm_inverseGamma(fogColor.rgb); #endif finalColor = vec4(czm_fog(v_distance, finalColor.rgb, fogColor.rgb, czm_fogVisualDensityScalar), finalColor.a); #else // Apply ground atmosphere. This happens when the camera is far away from the earth. // The transmittance is based on optical depth i.e. the length of segment of the ray inside the atmosphere. // This value is larger near the "circumference", as it is further away from the camera. We use it to // brighten up that area of the ground atmosphere. const float transmittanceModifier = 0.5; float transmittance = transmittanceModifier + clamp(1.0 - groundAtmosphereColor.a, 0.0, 1.0); vec3 finalAtmosphereColor = finalColor.rgb + groundAtmosphereColor.rgb * transmittance; #if defined(DYNAMIC_ATMOSPHERE_LIGHTING) && (defined(ENABLE_VERTEX_LIGHTING) || defined(ENABLE_DAYNIGHT_SHADING)) float fadeInDist = u_nightFadeDistance.x; float fadeOutDist = u_nightFadeDistance.y; float sunlitAtmosphereIntensity = clamp((cameraDist - fadeOutDist) / (fadeInDist - fadeOutDist), 0.05, 1.0); float darken = clamp(dot(normalize(positionWC), atmosphereLightDirection), 0.0, 1.0); vec3 darkenendGroundAtmosphereColor = mix(groundAtmosphereColor.rgb, finalAtmosphereColor.rgb, darken); finalAtmosphereColor = mix(darkenendGroundAtmosphereColor, finalAtmosphereColor, sunlitAtmosphereIntensity); #endif #ifndef HDR finalAtmosphereColor.rgb = vec3(1.0) - exp(-fExposure * finalAtmosphereColor.rgb); #else finalAtmosphereColor.rgb = czm_saturation(finalAtmosphereColor.rgb, 1.6); #endif finalColor.rgb = mix(finalColor.rgb, finalAtmosphereColor.rgb, fade); #endif } #endif #ifdef UNDERGROUND_COLOR if (czm_backFacing()) { float distanceFromEllipsoid = max(czm_eyeHeight, 0.0); float distance = max(v_distance - distanceFromEllipsoid, 0.0); float blendAmount = interpolateByDistance(u_undergroundColorAlphaByDistance, distance); vec4 undergroundColor = vec4(u_undergroundColor.rgb, u_undergroundColor.a * blendAmount); finalColor = alphaBlend(undergroundColor, finalColor); } #endif #ifdef TRANSLUCENT if (inTranslucencyRectangle()) { vec4 alphaByDistance = gl_FrontFacing ? u_frontFaceAlphaByDistance : u_backFaceAlphaByDistance; finalColor.a *= interpolateByDistance(alphaByDistance, v_distance); } #endif // \u3010\u706B\u661F\u79D1\u6280marsgis.cn\u3011 Muyao 2023-02-20 \u5730\u5F62\u62AC\u5347 #ifdef APPLY_MARS3D_UPLIFT if(u_mars_uplift_enabled) { bool isInSlopeRampRectangle = inAreaMars3DRange(u_mars_uplift_rectangle, u_mars_uplift_texture); if(isInSlopeRampRectangle == u_mars_uplift_hideInsideOrOutside) { discard; } } #endif out_FragColor = finalColor; } #ifdef SHOW_REFLECTIVE_OCEAN float waveFade(float edge0, float edge1, float x) { float y = clamp((x - edge0) / (edge1 - edge0), 0.0, 1.0); return pow(1.0 - y, 5.0); } float linearFade(float edge0, float edge1, float x) { return clamp((x - edge0) / (edge1 - edge0), 0.0, 1.0); } // Based on water rendering by Jonas Wagner: // http://29a.ch/2012/7/19/webgl-terrain-rendering-water-fog // low altitude wave settings const float oceanFrequencyLowAltitude = 825000.0; const float oceanAnimationSpeedLowAltitude = 0.004; const float oceanOneOverAmplitudeLowAltitude = 1.0 / 2.0; const float oceanSpecularIntensity = 0.5; // high altitude wave settings const float oceanFrequencyHighAltitude = 125000.0; const float oceanAnimationSpeedHighAltitude = 0.008; const float oceanOneOverAmplitudeHighAltitude = 1.0 / 2.0; vec4 computeWaterColor(vec3 positionEyeCoordinates, vec2 textureCoordinates, mat3 enuToEye, vec4 imageryColor, float maskValue, float fade) { vec3 positionToEyeEC = -positionEyeCoordinates; float positionToEyeECLength = length(positionToEyeEC); // The double normalize below works around a bug in Firefox on Android devices. vec3 normalizedPositionToEyeEC = normalize(normalize(positionToEyeEC)); // Fade out the waves as the camera moves far from the surface. float waveIntensity = waveFade(70000.0, 1000000.0, positionToEyeECLength); #ifdef SHOW_OCEAN_WAVES // high altitude waves float time = czm_frameNumber * oceanAnimationSpeedHighAltitude; vec4 noise = czm_getWaterNoise(u_oceanNormalMap, textureCoordinates * oceanFrequencyHighAltitude, time, 0.0); vec3 normalTangentSpaceHighAltitude = vec3(noise.xy, noise.z * oceanOneOverAmplitudeHighAltitude); // low altitude waves time = czm_frameNumber * oceanAnimationSpeedLowAltitude; noise = czm_getWaterNoise(u_oceanNormalMap, textureCoordinates * oceanFrequencyLowAltitude, time, 0.0); vec3 normalTangentSpaceLowAltitude = vec3(noise.xy, noise.z * oceanOneOverAmplitudeLowAltitude); // blend the 2 wave layers based on distance to surface float highAltitudeFade = linearFade(0.0, 60000.0, positionToEyeECLength); float lowAltitudeFade = 1.0 - linearFade(20000.0, 60000.0, positionToEyeECLength); vec3 normalTangentSpace = (highAltitudeFade * normalTangentSpaceHighAltitude) + (lowAltitudeFade * normalTangentSpaceLowAltitude); normalTangentSpace = normalize(normalTangentSpace); // fade out the normal perturbation as we move farther from the water surface normalTangentSpace.xy *= waveIntensity; normalTangentSpace = normalize(normalTangentSpace); #else vec3 normalTangentSpace = vec3(0.0, 0.0, 1.0); #endif vec3 normalEC = enuToEye * normalTangentSpace; const vec3 waveHighlightColor = vec3(0.3, 0.45, 0.6); // Use diffuse light to highlight the waves float diffuseIntensity = czm_getLambertDiffuse(czm_lightDirectionEC, normalEC) * maskValue; vec3 diffuseHighlight = waveHighlightColor * diffuseIntensity * (1.0 - fade); #ifdef SHOW_OCEAN_WAVES // Where diffuse light is low or non-existent, use wave highlights based solely on // the wave bumpiness and no particular light direction. float tsPerturbationRatio = normalTangentSpace.z; vec3 nonDiffuseHighlight = mix(waveHighlightColor * 5.0 * (1.0 - tsPerturbationRatio), vec3(0.0), diffuseIntensity); #else vec3 nonDiffuseHighlight = vec3(0.0); #endif // Add specular highlights in 3D, and in all modes when zoomed in. float specularIntensity = czm_getSpecular(czm_lightDirectionEC, normalizedPositionToEyeEC, normalEC, 10.0); float surfaceReflectance = mix(0.0, mix(u_zoomedOutOceanSpecularIntensity, oceanSpecularIntensity, waveIntensity), maskValue); float specular = specularIntensity * surfaceReflectance; #ifdef HDR specular *= 1.4; float e = 0.2; float d = 3.3; float c = 1.7; vec3 color = imageryColor.rgb + (c * (vec3(e) + imageryColor.rgb * d) * (diffuseHighlight + nonDiffuseHighlight + specular)); #else vec3 color = imageryColor.rgb + diffuseHighlight + nonDiffuseHighlight + specular; #endif return vec4(color, imageryColor.a); } #endif // #ifdef SHOW_REFLECTIVE_OCEAN `;var hCi=T(S(),1),Aw=`#ifdef QUANTIZATION_BITS12 in vec4 compressed0; in float compressed1; #else in vec4 position3DAndHeight; in vec4 textureCoordAndEncodedNormals; #endif #ifdef GEODETIC_SURFACE_NORMALS in vec3 geodeticSurfaceNormal; #endif #ifdef EXAGGERATION uniform vec2 u_verticalExaggerationAndRelativeHeight; #endif uniform vec3 u_center3D; uniform mat4 u_modifiedModelView; uniform mat4 u_modifiedModelViewProjection; uniform vec4 u_tileRectangle; // Uniforms for 2D Mercator projection uniform vec2 u_southAndNorthLatitude; uniform vec2 u_southMercatorYAndOneOverHeight; out vec3 v_positionMC; out vec3 v_positionEC; out vec3 v_textureCoordinates; out vec3 v_normalMC; out vec3 v_normalEC; #ifdef APPLY_MATERIAL out float v_slope; out float v_aspect; out float v_height; #endif #if defined(FOG) || defined(GROUND_ATMOSPHERE) || defined(UNDERGROUND_COLOR) || defined(TRANSLUCENT) out float v_distance; #endif #if defined(FOG) || defined(GROUND_ATMOSPHERE) out vec3 v_atmosphereRayleighColor; out vec3 v_atmosphereMieColor; out float v_atmosphereOpacity; #endif #ifdef ENABLE_CLIPPING_POLYGONS uniform highp sampler2D u_clippingExtents; out vec2 v_clippingPosition; flat out int v_regionIndex; #endif // These functions are generated at runtime. vec4 getPosition(vec3 position, float height, vec2 textureCoordinates); float get2DYPositionFraction(vec2 textureCoordinates); vec4 getPosition3DMode(vec3 position, float height, vec2 textureCoordinates) { return u_modifiedModelViewProjection * vec4(position, 1.0); } float get2DMercatorYPositionFraction(vec2 textureCoordinates) { // The width of a tile at level 11, in radians and assuming a single root tile, is // 2.0 * czm_pi / pow(2.0, 11.0) // We want to just linearly interpolate the 2D position from the texture coordinates // when we're at this level or higher. The constant below is the expression // above evaluated and then rounded up at the 4th significant digit. const float maxTileWidth = 0.003068; float positionFraction = textureCoordinates.y; float southLatitude = u_southAndNorthLatitude.x; float northLatitude = u_southAndNorthLatitude.y; if (northLatitude - southLatitude > maxTileWidth) { float southMercatorY = u_southMercatorYAndOneOverHeight.x; float oneOverMercatorHeight = u_southMercatorYAndOneOverHeight.y; float currentLatitude = mix(southLatitude, northLatitude, textureCoordinates.y); currentLatitude = clamp(currentLatitude, -czm_webMercatorMaxLatitude, czm_webMercatorMaxLatitude); positionFraction = czm_latitudeToWebMercatorFraction(currentLatitude, southMercatorY, oneOverMercatorHeight); } return positionFraction; } float get2DGeographicYPositionFraction(vec2 textureCoordinates) { return textureCoordinates.y; } vec4 getPositionPlanarEarth(vec3 position, float height, vec2 textureCoordinates) { float yPositionFraction = get2DYPositionFraction(textureCoordinates); vec4 rtcPosition2D = vec4(height, mix(u_tileRectangle.st, u_tileRectangle.pq, vec2(textureCoordinates.x, yPositionFraction)), 1.0); return u_modifiedModelViewProjection * rtcPosition2D; } vec4 getPosition2DMode(vec3 position, float height, vec2 textureCoordinates) { return getPositionPlanarEarth(position, 0.0, textureCoordinates); } vec4 getPositionColumbusViewMode(vec3 position, float height, vec2 textureCoordinates) { return getPositionPlanarEarth(position, height, textureCoordinates); } vec4 getPositionMorphingMode(vec3 position, float height, vec2 textureCoordinates) { // We do not do RTC while morphing, so there is potential for jitter. // This is unlikely to be noticeable, though. vec3 position3DWC = position + u_center3D; float yPositionFraction = get2DYPositionFraction(textureCoordinates); vec4 position2DWC = vec4(height, mix(u_tileRectangle.st, u_tileRectangle.pq, vec2(textureCoordinates.x, yPositionFraction)), 1.0); vec4 morphPosition = czm_columbusViewMorph(position2DWC, vec4(position3DWC, 1.0), czm_morphTime); return czm_modelViewProjection * morphPosition; } #ifdef QUANTIZATION_BITS12 uniform vec2 u_minMaxHeight; uniform mat4 u_scaleAndBias; #endif // \u3010\u706B\u661F\u79D1\u6280marsgis.cn\u3011 Muyao 2023-02-20 \u5730\u5F62\u538B\u5E73 #ifdef APPLY_MARS3D_FLAT uniform bool u_mars_flat_enabled; uniform vec4 u_mars_flat_rectangle; uniform highp sampler2D u_mars_flat_texture; uniform highp float u_mars_inverseTileWidth; uniform highp vec2 u_mars_cartographicTileRectangle; vec4 getAreaMars3DRange(vec4 rectangle, sampler2D rangeTexture, vec2 textureCoordinates) { float lo = textureCoordinates.x / u_mars_inverseTileWidth + u_mars_cartographicTileRectangle.x; float la = textureCoordinates.y / u_mars_inverseTileWidth + u_mars_cartographicTileRectangle.y; float newX = (lo - rectangle.x) / rectangle.z; float newY = (la - rectangle.y) / rectangle.w; vec4 point; if(newX >= 0.0 && newX <= 1.0 && newY >= 0.0 && newY <= 1.0){ vec4 point = texture(rangeTexture, vec2(newX, newY)); return point; }else{ return vec4(0.0); } } #endif // \u3010\u706B\u661F\u79D1\u6280marsgis.cn\u3011 Muyao 2023-02-20 \u5730\u5F62\u538B\u5E73 void main() { #ifdef QUANTIZATION_BITS12 vec2 xy = czm_decompressTextureCoordinates(compressed0.x); vec2 zh = czm_decompressTextureCoordinates(compressed0.y); vec3 position = vec3(xy, zh.x); float height = zh.y; vec2 textureCoordinates = czm_decompressTextureCoordinates(compressed0.z); height = height * (u_minMaxHeight.y - u_minMaxHeight.x) + u_minMaxHeight.x; position = (u_scaleAndBias * vec4(position, 1.0)).xyz; #if (defined(ENABLE_VERTEX_LIGHTING) || defined(GENERATE_POSITION_AND_NORMAL)) && defined(INCLUDE_WEB_MERCATOR_Y) || defined(APPLY_MATERIAL) float webMercatorT = czm_decompressTextureCoordinates(compressed0.w).x; float encodedNormal = compressed1; #elif defined(INCLUDE_WEB_MERCATOR_Y) float webMercatorT = czm_decompressTextureCoordinates(compressed0.w).x; float encodedNormal = 0.0; #elif defined(ENABLE_VERTEX_LIGHTING) || defined(GENERATE_POSITION_AND_NORMAL) float webMercatorT = textureCoordinates.y; float encodedNormal = compressed0.w; #else float webMercatorT = textureCoordinates.y; float encodedNormal = 0.0; #endif #else // A single float per element vec3 position = position3DAndHeight.xyz; float height = position3DAndHeight.w; vec2 textureCoordinates = textureCoordAndEncodedNormals.xy; #if (defined(ENABLE_VERTEX_LIGHTING) || defined(GENERATE_POSITION_AND_NORMAL) || defined(APPLY_MATERIAL)) && defined(INCLUDE_WEB_MERCATOR_Y) float webMercatorT = textureCoordAndEncodedNormals.z; float encodedNormal = textureCoordAndEncodedNormals.w; #elif defined(ENABLE_VERTEX_LIGHTING) || defined(GENERATE_POSITION_AND_NORMAL) || defined(APPLY_MATERIAL) float webMercatorT = textureCoordinates.y; float encodedNormal = textureCoordAndEncodedNormals.z; #elif defined(INCLUDE_WEB_MERCATOR_Y) float webMercatorT = textureCoordAndEncodedNormals.z; float encodedNormal = 0.0; #else float webMercatorT = textureCoordinates.y; float encodedNormal = 0.0; #endif #endif vec3 position3DWC = position + u_center3D; #ifdef GEODETIC_SURFACE_NORMALS vec3 ellipsoidNormal = geodeticSurfaceNormal; #else vec3 ellipsoidNormal = normalize(position3DWC); #endif #if defined(EXAGGERATION) && defined(GEODETIC_SURFACE_NORMALS) float exaggeration = u_verticalExaggerationAndRelativeHeight.x; float relativeHeight = u_verticalExaggerationAndRelativeHeight.y; float newHeight = (height - relativeHeight) * exaggeration + relativeHeight; // stop from going through center of earth float minRadius = min(min(czm_ellipsoidRadii.x, czm_ellipsoidRadii.y), czm_ellipsoidRadii.z); newHeight = max(newHeight, -minRadius); vec3 offset = ellipsoidNormal * (newHeight - height); position += offset; position3DWC += offset; height = newHeight; #endif // \u3010\u706B\u661F\u79D1\u6280marsgis.cn\u3011 Muyao 2023-02-20 \u5730\u5F62\u538B\u5E73 #ifdef APPLY_MARS3D_FLAT if(u_mars_flat_enabled) { vec4 isInside = getAreaMars3DRange(u_mars_flat_rectangle,u_mars_flat_texture,textureCoordinates); if(isInside.r>0.0 || isInside.g>0.0 || isInside.b>0.0 || isInside.a>0.0){ float newHeight = czm_unpackFloat(isInside); if(newHeight>-9999.0 && newHeight<9999.0){ vec3 offset = (newHeight - height) * ellipsoidNormal; position += offset; position3DWC += offset; height = newHeight; // vec3 newPosition = (position3DWC + offset) - u_center3D; } } } #endif // \u3010\u706B\u661F\u79D1\u6280marsgis.cn\u3011 Muyao 2023-02-20 \u5730\u5F62\u538B\u5E73 gl_Position = getPosition(position, height, textureCoordinates); v_positionEC = (u_modifiedModelView * vec4(position, 1.0)).xyz; v_positionMC = position3DWC; // position in model coordinates v_textureCoordinates = vec3(textureCoordinates, webMercatorT); #if defined(ENABLE_VERTEX_LIGHTING) || defined(GENERATE_POSITION_AND_NORMAL) || defined(APPLY_MATERIAL) vec3 normalMC = czm_octDecode(encodedNormal); #if defined(EXAGGERATION) && defined(GEODETIC_SURFACE_NORMALS) vec3 projection = dot(normalMC, ellipsoidNormal) * ellipsoidNormal; vec3 rejection = normalMC - projection; normalMC = normalize(projection + rejection * exaggeration); #endif v_normalMC = normalMC; v_normalEC = czm_normal3D * v_normalMC; #endif #ifdef ENABLE_CLIPPING_POLYGONS vec2 sphericalLatLong = czm_approximateSphericalCoordinates(position3DWC); sphericalLatLong.y = czm_branchFreeTernary(sphericalLatLong.y < czm_pi, sphericalLatLong.y, sphericalLatLong.y - czm_twoPi); vec2 minDistance = vec2(czm_infinity); v_clippingPosition = vec2(czm_infinity); v_regionIndex = -1; for (int regionIndex = 0; regionIndex < CLIPPING_POLYGON_REGIONS_LENGTH; regionIndex++) { vec4 extents = unpackClippingExtents(u_clippingExtents, regionIndex); vec2 rectUv = (sphericalLatLong.yx - extents.yx) * extents.wz; vec2 clamped = clamp(rectUv, vec2(0.0), vec2(1.0)); vec2 distance = abs(rectUv - clamped) * extents.wz; float threshold = 0.01; if (minDistance.x > distance.x || minDistance.y > distance.y) { minDistance = distance; v_clippingPosition = rectUv; if (rectUv.x > threshold && rectUv.y > threshold && rectUv.x < 1.0 - threshold && rectUv.y < 1.0 - threshold) { v_regionIndex = regionIndex; } } } #endif #if defined(FOG) || (defined(GROUND_ATMOSPHERE) && !defined(PER_FRAGMENT_GROUND_ATMOSPHERE)) bool dynamicLighting = false; #if defined(DYNAMIC_ATMOSPHERE_LIGHTING) && (defined(ENABLE_DAYNIGHT_SHADING) || defined(ENABLE_VERTEX_LIGHTING)) dynamicLighting = true; #endif #if defined(DYNAMIC_ATMOSPHERE_LIGHTING_FROM_SUN) vec3 atmosphereLightDirection = czm_sunDirectionWC; #else vec3 atmosphereLightDirection = czm_lightDirectionWC; #endif vec3 lightDirection = czm_branchFreeTernary(dynamicLighting, atmosphereLightDirection, normalize(position3DWC)); computeAtmosphereScattering( position3DWC, lightDirection, v_atmosphereRayleighColor, v_atmosphereMieColor, v_atmosphereOpacity ); #endif #if defined(FOG) || defined(GROUND_ATMOSPHERE) || defined(UNDERGROUND_COLOR) || defined(TRANSLUCENT) v_distance = length((czm_modelView3D * vec4(position3DWC, 1.0)).xyz); #endif #ifdef APPLY_MATERIAL float northPoleZ = czm_ellipsoidRadii.z; vec3 northPolePositionMC = vec3(0.0, 0.0, northPoleZ); vec3 vectorEastMC = normalize(cross(northPolePositionMC - v_positionMC, ellipsoidNormal)); float dotProd = abs(dot(ellipsoidNormal, v_normalMC)); v_slope = acos(dotProd); vec3 normalRejected = ellipsoidNormal * dotProd; vec3 normalProjected = v_normalMC - normalRejected; vec3 aspectVector = normalize(normalProjected); v_aspect = acos(dot(aspectVector, vectorEastMC)); float determ = dot(cross(vectorEastMC, aspectVector), ellipsoidNormal); v_aspect = czm_branchFreeTernary(determ < 0.0, 2.0 * czm_pi - v_aspect, v_aspect); v_height = height; #endif } `;var pCi=T(S(),1),QV=`void computeAtmosphereScattering(vec3 positionWC, vec3 lightDirection, out vec3 rayleighColor, out vec3 mieColor, out float opacity) { vec3 cameraToPositionWC = positionWC - czm_viewerPositionWC; vec3 cameraToPositionWCDirection = normalize(cameraToPositionWC); czm_ray primaryRay = czm_ray(czm_viewerPositionWC, cameraToPositionWCDirection); float atmosphereInnerRadius = length(positionWC); computeScattering( primaryRay, length(cameraToPositionWC), lightDirection, atmosphereInnerRadius, rayleighColor, mieColor, opacity ); } `;var ZCi=T(S(),1);var xCi=T(S(),1);var cst=new D;function lst(e,t){let n=e.unionClippingRegions,i=e.length,o=bs.useFloatTexture(t),r=bs.getTextureResolution(e,t,cst),s=r.x,a=r.y,c=o?mst(s,a):hst(s,a);return c+=` `,c+=n?dst(i):ust(i),c}function dst(e){return`float clip(vec4 fragCoord, sampler2D clippingPlanes, mat4 clippingPlanesMatrix) { vec4 position = czm_windowToEyeCoordinates(fragCoord); vec3 clipNormal = vec3(0.0); vec3 clipPosition = vec3(0.0); float clipAmount; float pixelWidth = czm_metersPerPixel(position); bool breakAndDiscard = false; for (int i = 0; i < ${e}; ++i) { vec4 clippingPlane = getClippingPlane(clippingPlanes, i, clippingPlanesMatrix); clipNormal = clippingPlane.xyz; clipPosition = -clippingPlane.w * clipNormal; float amount = dot(clipNormal, (position.xyz - clipPosition)) / pixelWidth; clipAmount = czm_branchFreeTernary(i == 0, amount, min(amount, clipAmount)); if (amount <= 0.0) { breakAndDiscard = true; break; } } if (breakAndDiscard) { discard; } return clipAmount; } `}function ust(e){return`float clip(vec4 fragCoord, sampler2D clippingPlanes, mat4 clippingPlanesMatrix) { bool clipped = true; vec4 position = czm_windowToEyeCoordinates(fragCoord); vec3 clipNormal = vec3(0.0); vec3 clipPosition = vec3(0.0); float clipAmount = 0.0; float pixelWidth = czm_metersPerPixel(position); for (int i = 0; i < ${e}; ++i) { vec4 clippingPlane = getClippingPlane(clippingPlanes, i, clippingPlanesMatrix); clipNormal = clippingPlane.xyz; clipPosition = -clippingPlane.w * clipNormal; float amount = dot(clipNormal, (position.xyz - clipPosition)) / pixelWidth; clipAmount = max(amount, clipAmount); clipped = clipped && (amount <= 0.0); } if (clipped) { discard; } return clipAmount; } `}function mst(e,t){let n=1/e,i=1/t,o=`${n}`;o.indexOf(".")===-1&&(o+=".0");let r=`${i}`;return r.indexOf(".")===-1&&(r+=".0"),`vec4 getClippingPlane(highp sampler2D packedClippingPlanes, int clippingPlaneNumber, mat4 transform) { int pixY = clippingPlaneNumber / ${e}; int pixX = clippingPlaneNumber - (pixY * ${e}); float u = (float(pixX) + 0.5) * ${o}; float v = (float(pixY) + 0.5) * ${r}; vec4 plane = texture(packedClippingPlanes, vec2(u, v)); return czm_transformPlane(plane, transform); } `}function hst(e,t){let n=1/e,i=1/t,o=`${n}`;o.indexOf(".")===-1&&(o+=".0");let r=`${i}`;return r.indexOf(".")===-1&&(r+=".0"),`vec4 getClippingPlane(highp sampler2D packedClippingPlanes, int clippingPlaneNumber, mat4 transform) { int clippingPlaneStartIndex = clippingPlaneNumber * 2; int pixY = clippingPlaneStartIndex / ${e}; int pixX = clippingPlaneStartIndex - (pixY * ${e}); float u = (float(pixX) + 0.5) * ${o}; float v = (float(pixY) + 0.5) * ${r}; vec4 oct32 = texture(packedClippingPlanes, vec2(u, v)) * 255.0; vec2 oct = vec2(oct32.x * 256.0 + oct32.y, oct32.z * 256.0 + oct32.w); vec4 plane; plane.xyz = czm_octDecode(oct, 65535.0); plane.w = czm_unpackFloat(texture(packedClippingPlanes, vec2(u + ${o}, v))); return czm_transformPlane(plane, transform); } `}var p0=lst;function fst(e,t,n,i,o,r){this.numberOfDayTextures=e,this.flags=t,this.material=n,this.shaderProgram=i,this.clippingShaderState=o,this.clippingPolygonShaderState=r}function sj(){this.baseVertexShaderSource=void 0,this.baseFragmentShaderSource=void 0,this._shadersByTexturesFlags=[],this.material=void 0}function pst(e){let t="vec4 getPosition(vec3 position, float height, vec2 textureCoordinates) { return getPosition3DMode(position, height, textureCoordinates); }",n="vec4 getPosition(vec3 position, float height, vec2 textureCoordinates) { return getPositionColumbusViewMode(position, height, textureCoordinates); }",i="vec4 getPosition(vec3 position, float height, vec2 textureCoordinates) { return getPositionMorphingMode(position, height, textureCoordinates); }",o;switch(e){case oe.SCENE3D:o=t;break;case oe.SCENE2D:case oe.COLUMBUS_VIEW:o=n;break;case oe.MORPHING:o=i;break}return o}function bst(e){return e.webgl2?`void clipPolygons(highp sampler2D clippingDistance, int regionsLength, vec2 clippingPosition, int regionIndex) { czm_clipPolygons(clippingDistance, regionsLength, clippingPosition, regionIndex); }`:`void clipPolygons(highp sampler2D clippingDistance, int regionsLength, vec2 clippingPosition, int regionIndex) { }`}function gst(e){return e.webgl2?`vec4 unpackClippingExtents(highp sampler2D extentsTexture, int index) { return czm_unpackClippingExtents(extentsTexture, index); }`:`vec4 unpackClippingExtents(highp sampler2D extentsTexture, int index) { return vec4(); }`}function yst(e){return e?"float get2DYPositionFraction(vec2 textureCoordinates) { return get2DMercatorYPositionFraction(textureCoordinates); }":"float get2DYPositionFraction(vec2 textureCoordinates) { return get2DGeographicYPositionFraction(textureCoordinates); }"}sj.prototype.getShaderProgram=function(e){let t=e.frameState,n=e.surfaceTile,i=e.numberOfDayTextures,o=e.applyBrightness,r=e.applyContrast,s=e.applyHue,a=e.applySaturation,c=e.applyGamma,d=e.applyAlpha,u=e.applyDayNightAlpha,h=e.applySplit,p=e.hasWaterMask,g=e.showReflectiveOcean,f=e.showOceanWaves,x=e.enableLighting,_=e.dynamicAtmosphereLighting,C=e.dynamicAtmosphereLightingFromSun,V=e.showGroundAtmosphere,L=e.perFragmentGroundAtmosphere,R=e.hasVertexNormals,G=e.useWebMercatorProjection,I=e.enableFog,v=e.enableClippingPlanes,P=e.clippingPlanes,w=e.enableClippingPolygons,A=e.clippingPolygons,b=e.clippedByBoundaries,Z=e.hasImageryLayerCutout,E=e.colorCorrect,X=e.highlightFillTile,F=e.colorToAlpha,N=e.hasGeodeticSurfaceNormals,O=e.hasExaggeration,U=e.showUndergroundColor,Y=e.translucent,k=e.marsOptions||{},H=0,K="",z=n.renderedMesh.encoding;z.quantization===oa.BITS12&&(H=1,K="QUANTIZATION_BITS12");let ee=0,pe="";b&&(ee=1,pe="TILE_LIMIT_RECTANGLE");let _e=0,ae="";Z&&(_e=1,ae="APPLY_IMAGERY_CUTOUT");let ye=t.mode,Se=ye|o<<2|r<<3|s<<4|a<<5|c<<6|d<<7|p<<8|g<<9|f<<10|x<<11|_<<12|C<<13|V<<14|L<<15|R<<16|G<<17|I<<18|H<<19|h<<20|v<<21|w<<22|ee<<23|_e<<24|E<<25|X<<26|F<<27|N<<28|O<<29|U<<30|Y<<31|u<<32,Ee=0;l(P)&&P.length>0&&(Ee=v?P.clippingPlanesState:0);let Ie=0;l(A)&&A.length>0&&(Ie=w?A.clippingPolygonsState:0);let we=n.surfaceShader;if(l(we)&&we.numberOfDayTextures===i&&we.flags===Se&&we.material===this.material&&we.clippingShaderState===Ee&&we.clippingPolygonShaderState===Ie)return we.shaderProgram;let ve=this._shadersByTexturesFlags[i];if(l(ve)||(ve=this._shadersByTexturesFlags[i]=[]),we=ve[Se],!l(we)||we.material!==this.material||we.clippingShaderState!==Ee||we.clippingPolygonShaderState!==Ie){let at=this.baseVertexShaderSource.clone(),Je=this.baseFragmentShaderSource.clone();Ee!==0&&Je.sources.unshift(p0(P,t.context)),Ie!==0&&(Je.sources.unshift(bst(t.context)),at.sources.unshift(gst(t.context))),k.enableUplift&&Je.defines.push("APPLY_MARS3D_UPLIFT"),k.enableFlat&&at.defines.push("APPLY_MARS3D_FLAT"),k.enableClip&&Je.defines.push("APPLY_MARS3D_CLIP"),k.enableFlood&&Je.defines.push("APPLY_MARS3D_FLOOD"),at.defines.push(K),Je.defines.push(`TEXTURE_UNITS ${i}`,pe,ae),o&&Je.defines.push("APPLY_BRIGHTNESS"),r&&Je.defines.push("APPLY_CONTRAST"),s&&Je.defines.push("APPLY_HUE"),a&&Je.defines.push("APPLY_SATURATION"),c&&Je.defines.push("APPLY_GAMMA"),k.invertColor&&Je.defines.push("APPLY_INVERT_COLOR_MARS3D"),k.filterColor&&Je.defines.push("APPLY_FILTER_COLOR_MARS3D"),d&&Je.defines.push("APPLY_ALPHA"),u&&Je.defines.push("APPLY_DAY_NIGHT_ALPHA"),p&&Je.defines.push("HAS_WATER_MASK"),g&&(Je.defines.push("SHOW_REFLECTIVE_OCEAN"),at.defines.push("SHOW_REFLECTIVE_OCEAN")),f&&Je.defines.push("SHOW_OCEAN_WAVES"),F&&Je.defines.push("APPLY_COLOR_TO_ALPHA"),U&&(at.defines.push("UNDERGROUND_COLOR"),Je.defines.push("UNDERGROUND_COLOR")),Y&&(at.defines.push("TRANSLUCENT"),Je.defines.push("TRANSLUCENT")),x&&(R?(at.defines.push("ENABLE_VERTEX_LIGHTING"),Je.defines.push("ENABLE_VERTEX_LIGHTING")):(at.defines.push("ENABLE_DAYNIGHT_SHADING"),Je.defines.push("ENABLE_DAYNIGHT_SHADING"))),_&&(at.defines.push("DYNAMIC_ATMOSPHERE_LIGHTING"),Je.defines.push("DYNAMIC_ATMOSPHERE_LIGHTING"),C&&(at.defines.push("DYNAMIC_ATMOSPHERE_LIGHTING_FROM_SUN"),Je.defines.push("DYNAMIC_ATMOSPHERE_LIGHTING_FROM_SUN"))),V&&(at.defines.push("GROUND_ATMOSPHERE"),Je.defines.push("GROUND_ATMOSPHERE"),L&&(at.defines.push("PER_FRAGMENT_GROUND_ATMOSPHERE"),Je.defines.push("PER_FRAGMENT_GROUND_ATMOSPHERE"))),at.defines.push("INCLUDE_WEB_MERCATOR_Y"),Je.defines.push("INCLUDE_WEB_MERCATOR_Y"),I&&(at.defines.push("FOG"),Je.defines.push("FOG")),h&&Je.defines.push("APPLY_SPLIT"),v&&Je.defines.push("ENABLE_CLIPPING_PLANES"),w&&(Je.defines.push("ENABLE_CLIPPING_POLYGONS"),at.defines.push("ENABLE_CLIPPING_POLYGONS"),A.inverse&&Je.defines.push("CLIPPING_INVERSE"),Je.defines.push(`CLIPPING_POLYGON_REGIONS_LENGTH ${A.extentsCount}`),at.defines.push(`CLIPPING_POLYGON_REGIONS_LENGTH ${A.extentsCount}`)),E&&Je.defines.push("COLOR_CORRECT"),X&&Je.defines.push("HIGHLIGHT_FILL_TILE"),N&&at.defines.push("GEODETIC_SURFACE_NORMALS"),O&&at.defines.push("EXAGGERATION");let pt=` vec4 computeDayColor(vec4 initialColor, vec3 textureCoordinates, float nightBlend) { vec4 color = initialColor; `;Z&&(pt+=` vec4 cutoutAndColorResult; bool texelUnclipped; `);for(let _t=0;_t0?n.raiseEvent(c):l(t)&&console.log(`An error occurred in "${t.constructor.name}": ${np(i)}`),c};DD.reportSuccess=function(e){l(e)&&(e.timesRetried=-1)};var Go=DD;var FCi=T(S(),1),_st={UNLOADED:0,TRANSITIONING:1,RECEIVED:2,TEXTURE_LOADED:3,READY:4,FAILED:5,INVALID:6,PLACEHOLDER:7},$n=Object.freeze(_st);var MCi=T(S(),1),Tst={START:0,LOADING:1,DONE:2,FAILED:3},ra=Object.freeze(Tst);var kCi=T(S(),1),Sst={FAILED:0,UNLOADED:1,RECEIVING:2,RECEIVED:3,TRANSFORMING:4,TRANSFORMED:5,READY:6},po=Object.freeze(Sst);function ar(){this.imagery=[],this.waterMaskTexture=void 0,this.waterMaskTranslationAndScale=new re(0,0,1,1),this.terrainData=void 0,this.vertexArray=void 0,this.tileBoundingRegion=void 0,this.occludeePointInScaledSpace=new m,this.boundingVolumeSourceTile=void 0,this.boundingVolumeIsFromMesh=!1,this.terrainState=po.UNLOADED,this.mesh=void 0,this.fill=void 0,this.pickBoundingSphere=new de,this.surfaceShader=void 0,this.isClipped=!0,this.clippedByBoundaries=!1}Object.defineProperties(ar.prototype,{eligibleForUnloading:{get:function(){let e=this.terrainState,n=!(e===po.RECEIVING||e===po.TRANSFORMING),i=this.imagery;for(let o=0,r=i.length;n&&o=0&&(u=V)}return u!==Number.MAX_VALUE?gn.getPoint(e,u,o):void 0};ar.prototype.freeResources=function(){l(this.waterMaskTexture)&&(--this.waterMaskTexture.referenceCount,this.waterMaskTexture.referenceCount===0&&this.waterMaskTexture.destroy(),this.waterMaskTexture=void 0),this.terrainData=void 0,this.terrainState=po.UNLOADED,this.mesh=void 0,this.fill=this.fill&&this.fill.destroy();let e=this.imagery;for(let t=0,n=e.length;t=po.RECEIVED&&s.waterMaskTexture===void 0&&n.hasWaterMask)if(s.terrainData.waterMask!==void 0)wst(t.context,s);else{let d=s._findAncestorTileWithTerrainData(e);l(d)&&l(d.data.waterMaskTexture)&&(s.waterMaskTexture=d.data.waterMaskTexture,++s.waterMaskTexture.referenceCount,s._computeWaterMaskTranslationAndScale(e,d,s.waterMaskTranslationAndScale))}}function Est(e,t,n,i,o,r,s){let a=t.parent;if(!a){t.state=ra.FAILED;return}let c=a.data.terrainData,d=a.x,u=a.y,h=a.level;if(!l(c))return;let p=c.upsample(i.tilingScheme,d,u,h,o,r,s);l(p)&&(e.terrainState=po.RECEIVING,Promise.resolve(p).then(function(g){l(g)&&(e.terrainData=g,e.terrainState=po.RECEIVED)}).catch(function(){e.terrainState=po.FAILED}))}function Ist(e,t,n,i,o){function r(c){if(!l(c)){e.terrainState=po.UNLOADED,e.request=void 0;return}e.terrainData=c,e.terrainState=po.RECEIVED,e.request=void 0}function s(c){if(e.request.state===ei.CANCELLED){e.terrainData=void 0,e.terrainState=po.UNLOADED,e.request=void 0;return}e.terrainState=po.FAILED,e.request=void 0;let d=`Failed to obtain terrain tile X: ${n} Y: ${i} Level: ${o}. Error message: "${c}"`;t._requestError=Go.reportError(t._requestError,t,t.errorEvent,d,n,i,o),t._requestError.retry&&a()}function a(){let c=new Qo({throttle:!1,throttleByServer:!0,type:ms.TERRAIN});e.request=c;let d=t.requestTileGeometry(n,i,o,c);l(d)?(e.terrainState=po.RECEIVING,Promise.resolve(d).then(function(u){r(u)}).catch(function(u){s(u)})):(e.terrainState=po.UNLOADED,e.request=void 0)}a()}var Xst={tilingScheme:void 0,x:0,y:0,level:0,exaggeration:1,exaggerationRelativeHeight:0,throttle:!0};function Wst(e,t,n,i,o,r){let s=n.tilingScheme,a=Xst;a.tilingScheme=s,a.x=i,a.y=o,a.level=r,a.exaggeration=t.verticalExaggeration,a.exaggerationRelativeHeight=t.verticalExaggerationRelativeHeight,a.throttle=!0;let d=e.terrainData.createMesh(a);l(d)&&(e.terrainState=po.TRANSFORMING,Promise.resolve(d).then(function(u){e.mesh=u,e.terrainState=po.TRANSFORMED}).catch(function(){e.terrainState=po.FAILED}))}ar._createVertexArrayForMesh=function(e,t){let n=t.vertices,i=St.createVertexBuffer({context:e,typedArray:n,usage:ke.STATIC_DRAW}),o=t.encoding.getAttributes(i),r=t.indices.indexBuffers||{},s=r[e.id];if(!l(s)||s.isDestroyed()){let a=t.indices;s=St.createIndexBuffer({context:e,typedArray:a,usage:ke.STATIC_DRAW,indexDatatype:Me.fromSizeInBytes(a.BYTES_PER_ELEMENT)}),s.vertexArrayDestroyable=!1,s.referenceCount=1,r[e.id]=s,t.indices.indexBuffers=r}else++s.referenceCount;return new oi({context:e,attributes:o,indexBuffer:s})};ar._freeVertexArray=function(e){if(l(e)){let t=e.indexBuffer;e.isDestroyed()||e.destroy(),l(t)&&!t.isDestroyed()&&l(t.referenceCount)&&(--t.referenceCount,t.referenceCount===0&&t.destroy())}};function Pst(e,t,n,i,o,r,s){e.vertexArray=ar._createVertexArrayForMesh(t,e.mesh),e.terrainState=po.READY,e.fill=e.fill&&e.fill.destroy(s)}function vst(e){let t=e.cache.tile_waterMaskData;if(!l(t)){let n=Wt.create({context:e,pixelFormat:ot.LUMINANCE,pixelDatatype:je.UNSIGNED_BYTE,source:{arrayBufferView:new Uint8Array([255]),width:1,height:1}});n.referenceCount=1;let i=new $t({wrapS:Vn.CLAMP_TO_EDGE,wrapT:Vn.CLAMP_TO_EDGE,minificationFilter:qt.LINEAR,magnificationFilter:pi.LINEAR});t={allWaterTexture:n,sampler:i,destroy:function(){this.allWaterTexture.destroy()}},e.cache.tile_waterMaskData=t}return t}function wst(e,t){let n=t.terrainData.waterMask,i=vst(e),o,r=n.length;if(r===1)if(n[0]!==0)o=i.allWaterTexture;else return;else{let s=Math.sqrt(r);o=Wt.create({context:e,pixelFormat:ot.LUMINANCE,pixelDatatype:je.UNSIGNED_BYTE,source:{width:s,height:s,arrayBufferView:n},sampler:i.sampler,flipY:!1}),o.referenceCount=0}++o.referenceCount,t.waterMaskTexture=o,re.fromElements(0,0,1,1,t.waterMaskTranslationAndScale)}ar.prototype._findAncestorTileWithTerrainData=function(e){let t=e.parent;for(;l(t)&&(!l(t.data)||!l(t.data.terrainData)||t.data.terrainData.wasCreatedByUpsampling());)t=t.parent;return t};ar.prototype._computeWaterMaskTranslationAndScale=function(e,t,n){let i=t.rectangle,o=e.rectangle,r=o.width,s=o.height,a=r/i.width,c=s/i.height;return n.x=a*(o.west-i.west)/r,n.y=c*(o.south-i.south)/s,n.z=a,n.w=c,n};var hm=ar;var KZi=T(S(),1);var JRi=T(S(),1);var DRi=T(S(),1);var hVi=T(S(),1);var C1i=T(S(),1);function Wy(e){if(e=y(e,y.EMPTY_OBJECT),this._ellipsoid=y(e.ellipsoid,ne.default),this._numberOfLevelZeroTilesX=y(e.numberOfLevelZeroTilesX,1),this._numberOfLevelZeroTilesY=y(e.numberOfLevelZeroTilesY,1),this._projection=new Wi(this._ellipsoid),l(e.rectangleSouthwestInMeters)&&l(e.rectangleNortheastInMeters))this._rectangleSouthwestInMeters=e.rectangleSouthwestInMeters,this._rectangleNortheastInMeters=e.rectangleNortheastInMeters;else{let i=this._ellipsoid.maximumRadius*Math.PI;this._rectangleSouthwestInMeters=new D(-i,-i),this._rectangleNortheastInMeters=new D(i,i)}let t=this._projection.unproject(this._rectangleSouthwestInMeters),n=this._projection.unproject(this._rectangleNortheastInMeters);this._rectangle=new le(t.longitude,t.latitude,n.longitude,n.latitude)}Object.defineProperties(Wy.prototype,{ellipsoid:{get:function(){return this._ellipsoid}},rectangle:{get:function(){return this._rectangle}},projection:{get:function(){return this._projection}}});Wy.prototype.getNumberOfXTilesAtLevel=function(e){return this._numberOfLevelZeroTilesX<=o&&(f=o-1);let x=g/d|0;return x>=r&&(x=r-1),l(n)?(n.x=f,n.y=x,n):new D(f,x)};var as=Wy;var G1i=T(S(),1);var cj,Ege="AAPTxy8BH1VEsoebNVZXo8HurEOF051kAEKlhkOhBEc9BmR-yn9MvzP-kKlsEftvba-Ksa9fy6DfgprKJvVPrYflNktZkc_R1DWiCclyPfJDVoQFVG5RAYgC6zo1Y0tjygPXWzKh6a7QBgk7gX6xm7vkHmbExafWckqkicqYw9UkxFf1Fjya64KizMRumKKV-VXV6_CwU0hR7Zv4pDhQDz4bwoyMxi_abRmOIS58oUlATyE.AT1_X4rsxcr3",jV={};jV.defaultAccessToken=Ege;jV.defaultWorldImageryServer=new Re({url:"https://ibasemaps-api.arcgis.com/arcgis/rest/services/World_Imagery/MapServer"});jV.defaultWorldHillshadeServer=new Re({url:"https://ibasemaps-api.arcgis.com/arcgis/rest/services/Elevation/World_Hillshade/MapServer"});jV.defaultWorldOceanServer=new Re({url:"https://ibasemaps-api.arcgis.com/arcgis/rest/services/Ocean/World_Ocean_Base/MapServer"});jV.getDefaultTokenCredit=function(e){if(e===Ege){if(!l(cj)){let t=' This application is using a default ArcGIS access token. Please assign Cesium.ArcGisMapService.defaultAccessToken with an API key from your ArcGIS Developer account before using the ArcGIS tile services. You can sign up for a free ArcGIS Developer account at https://developers.arcgis.com/.';cj=new Rt(t,!0)}return cj}};var qd=jV;var v1i=T(S(),1);function lj(e){e=y(e,y.EMPTY_OBJECT),this._pixelsToCheck=e.pixelsToCheck,this._missingImagePixels=void 0,this._missingImageByteLength=void 0,this._isReady=!1;let t=Re.createIfNeeded(e.missingImageUrl),n=this;function i(r){l(r.blob)&&(n._missingImageByteLength=r.blob.size);let s=Im(r);if(e.disableCheckIfAllPixelsAreTransparent){let a=!0,c=r.width,d=e.pixelsToCheck;for(let u=0,h=d.length;a&&u0&&(a=!1)}a&&(s=void 0)}n._missingImagePixels=s,n._isReady=!0}function o(){n._missingImagePixels=void 0,n._isReady=!0}t.fetchImage({preferBlob:!0,preferImageBitmap:!0,flipY:!0}).then(i).catch(o)}lj.prototype.isReady=function(){return this._isReady};lj.prototype.shouldDiscardImage=function(e){let t=this._pixelsToCheck,n=this._missingImagePixels;if(!l(n)||l(e.blob)&&e.blob.size!==this._missingImageByteLength)return!1;let i=Im(e),o=e.width;for(let r=0,s=t.length;r1&&o==="name"?(t=1,n=i):t>2&&o==="title"?(t=2,n=i):t>3&&/name/i.test(i)?(t=3,n=i):t>4&&/title/i.test(i)&&(t=4,n=i)}l(n)&&(this.name=e[n])};dj.prototype.configureDescriptionFromProperties=function(e){function t(n){let i='';for(let o in n)if(n.hasOwnProperty(o)){let r=n[o];l(r)&&(typeof r=="object"?i+=``:i+=``)}return i+="
${o}${t(r)}
${o}${r}
",i}this.description=t(e)};var Nh=dj;var B1i=T(S(),1);function qV(){fe.throwInstantiationError()}Object.defineProperties(qV.prototype,{rectangle:{get:fe.throwInstantiationError},tileWidth:{get:fe.throwInstantiationError},tileHeight:{get:fe.throwInstantiationError},maximumLevel:{get:fe.throwInstantiationError},minimumLevel:{get:fe.throwInstantiationError},tilingScheme:{get:fe.throwInstantiationError},tileDiscardPolicy:{get:fe.throwInstantiationError},errorEvent:{get:fe.throwInstantiationError},credit:{get:fe.throwInstantiationError},proxy:{get:fe.throwInstantiationError},hasAlphaChannel:{get:fe.throwInstantiationError}});qV.prototype.getTileCredits=function(e,t,n){fe.throwInstantiationError()};qV.prototype.requestImage=function(e,t,n,i){fe.throwInstantiationError()};qV.prototype.pickFeatures=function(e,t,n,i,o){fe.throwInstantiationError()};var Fst=/\.ktx2$/i;qV.loadImage=function(e,t){let n=Re.createIfNeeded(t);return Fst.test(n.url)?Gl(n):l(e)&&l(e.tileDiscardPolicy)?n.fetchImage({preferBlob:!0,preferImageBitmap:!0,flipY:!0}):n.fetchImage({preferImageBitmap:!0,flipY:!0})};var bl=qV;var Y1i=T(S(),1),Ast={SATELLITE:1,OCEANS:2,HILLSHADE:3},kh=Object.freeze(Ast);function Ige(e){this.useTiles=y(e.usePreCachedTilesIfAvailable,!0);let t=e.ellipsoid;this.tilingScheme=y(e.tilingScheme,new Qi({ellipsoid:t})),this.rectangle=y(e.rectangle,this.tilingScheme.rectangle),this.ellipsoid=t;let n=e.credit;typeof n=="string"&&(n=new Rt(n)),this.credit=n,this.tileCredits=void 0,this.tileDiscardPolicy=e.tileDiscardPolicy,this.tileWidth=y(e.tileWidth,256),this.tileHeight=y(e.tileHeight,256),this.maximumLevel=e.maximumLevel}Ige.prototype.build=function(e){e._useTiles=this.useTiles,e._tilingScheme=this.tilingScheme,e._rectangle=this.rectangle,e._credit=this.credit,e._tileCredits=this.tileCredits,e._tileDiscardPolicy=this.tileDiscardPolicy,e._tileWidth=this.tileWidth,e._tileHeight=this.tileHeight,e._maximumLevel=this.maximumLevel,this.useTiles&&!l(this.tileDiscardPolicy)&&(e._tileDiscardPolicy=new Nw({missingImageUrl:Xge(e,0,0,this.maximumLevel).url,pixelsToCheck:[new D(0,0),new D(200,20),new D(20,200),new D(80,110),new D(160,130)],disableCheckIfAllPixelsAreTransparent:!0}))};function Mst(e,t){let n=e.tileInfo;if(!l(n))t.useTiles=!1;else{if(t.tileWidth=n.rows,t.tileHeight=n.cols,n.spatialReference.wkid===102100||n.spatialReference.wkid===102113)t.tilingScheme=new as({ellipsoid:t.ellipsoid});else if(e.tileInfo.spatialReference.wkid===4326)t.tilingScheme=new Qi({ellipsoid:t.ellipsoid});else{let i=`Tile spatial reference WKID ${e.tileInfo.spatialReference.wkid} is not supported.`;throw new ce(i)}if(t.maximumLevel=e.tileInfo.lods.length-1,l(e.fullExtent)){if(l(e.fullExtent.spatialReference)&&l(e.fullExtent.spatialReference.wkid))if(e.fullExtent.spatialReference.wkid===102100||e.fullExtent.spatialReference.wkid===102113){let i=new Wi,o=e.fullExtent,r=i.unproject(new m(Math.max(o.xmin,-t.tilingScheme.ellipsoid.maximumRadius*Math.PI),Math.max(o.ymin,-t.tilingScheme.ellipsoid.maximumRadius*Math.PI),0)),s=i.unproject(new m(Math.min(o.xmax,t.tilingScheme.ellipsoid.maximumRadius*Math.PI),Math.min(o.ymax,t.tilingScheme.ellipsoid.maximumRadius*Math.PI),0));t.rectangle=new le(r.longitude,r.latitude,s.longitude,s.latitude)}else if(e.fullExtent.spatialReference.wkid===4326)t.rectangle=le.fromDegrees(e.fullExtent.xmin,e.fullExtent.ymin,e.fullExtent.xmax,e.fullExtent.ymax);else{let i=`fullExtent.spatialReference WKID ${e.fullExtent.spatialReference.wkid} is not supported.`;throw new ce(i)}}else t.rectangle=t.tilingScheme.rectangle;t.useTiles=!0}l(e.copyrightText)&&e.copyrightText.length>0&&(l(t.credit)?t.tileCredits=[new Rt(e.copyrightText)]:t.credit=new Rt(e.copyrightText))}function Nst(e,t){let n=`An error occurred while accessing ${e.url}`;throw l(t)&&l(t.message)&&(n+=`: ${t.message}`),new ce(n)}async function kst(e,t){let n=e.getDerivedResource({queryParameters:{f:"json"}});try{let i=await n.fetchJson();Mst(i,t)}catch(i){Nst(e,i)}}function op(e){e=y(e,y.EMPTY_OBJECT),this._defaultAlpha=void 0,this._defaultNightAlpha=void 0,this._defaultDayAlpha=void 0,this._defaultBrightness=void 0,this._defaultContrast=void 0,this._defaultHue=void 0,this._defaultSaturation=void 0,this._defaultGamma=void 0,this._defaultMinificationFilter=void 0,this._defaultMagnificationFilter=void 0,this._tileDiscardPolicy=e.tileDiscardPolicy,this._tileWidth=y(e.tileWidth,256),this._tileHeight=y(e.tileHeight,256),this._maximumLevel=e.maximumLevel,this._tilingScheme=y(e.tilingScheme,new Qi({ellipsoid:e.ellipsoid})),this._useTiles=y(e.usePreCachedTilesIfAvailable,!0),this._rectangle=y(e.rectangle,this._tilingScheme.rectangle),this._layers=e.layers,this._credit=e.credit,this._tileCredits=void 0;let t=e.credit;typeof t=="string"&&(t=new Rt(t)),this.enablePickFeatures=y(e.enablePickFeatures,!0),this._errorEvent=new be}op.fromBasemapType=async function(e,t){t=y(t,y.EMPTY_OBJECT);let n,i,o;switch(e){case kh.SATELLITE:{n=y(t.token,qd.defaultAccessToken),i=Re.createIfNeeded(qd.defaultWorldImageryServer),i.appendForwardSlash();let r=qd.getDefaultTokenCredit(n);l(r)&&(o=Rt.clone(r))}break;case kh.OCEANS:{n=y(t.token,qd.defaultAccessToken),i=Re.createIfNeeded(qd.defaultWorldOceanServer),i.appendForwardSlash();let r=qd.getDefaultTokenCredit(n);l(r)&&(o=Rt.clone(r))}break;case kh.HILLSHADE:{n=y(t.token,qd.defaultAccessToken),i=Re.createIfNeeded(qd.defaultWorldHillshadeServer),i.appendForwardSlash();let r=qd.getDefaultTokenCredit(n);l(r)&&(o=Rt.clone(r))}break;default:}return op.fromUrl(i,{...t,token:n,credit:o,usePreCachedTilesIfAvailable:!0})};function Xge(e,t,n,i,o){let r;if(e._useTiles)r=e._resource.getDerivedResource({url:`tile/${i}/${n}/${t}`,request:o});else{let s=e._tilingScheme.tileXYToNativeRectangle(t,n,i),c={bbox:`${s.west},${s.south},${s.east},${s.north}`,size:`${e._tileWidth},${e._tileHeight}`,format:"png32",transparent:!0,f:"image"};e._tilingScheme.projection instanceof Ii?(c.bboxSR=4326,c.imageSR=4326):(c.bboxSR=3857,c.imageSR=3857),e.layers&&(c.layers=`show:${e.layers}`),r=e._resource.getDerivedResource({url:"export",request:o,queryParameters:c})}return r}Object.defineProperties(op.prototype,{url:{get:function(){return this._resource._url}},token:{get:function(){return this._resource.queryParameters.token}},proxy:{get:function(){return this._resource.proxy}},tileWidth:{get:function(){return this._tileWidth}},tileHeight:{get:function(){return this._tileHeight}},maximumLevel:{get:function(){return this._maximumLevel}},minimumLevel:{get:function(){return 0}},tilingScheme:{get:function(){return this._tilingScheme}},rectangle:{get:function(){return this._rectangle}},tileDiscardPolicy:{get:function(){return this._tileDiscardPolicy}},errorEvent:{get:function(){return this._errorEvent}},credit:{get:function(){return this._credit}},usingPrecachedTiles:{get:function(){return this._useTiles}},hasAlphaChannel:{get:function(){return!0}},layers:{get:function(){return this._layers}}});op.fromUrl=async function(e,t){t=y(t,y.EMPTY_OBJECT);let n=Re.createIfNeeded(e);n.appendForwardSlash(),l(t.token)&&n.setQueryParameters({token:t.token});let i=new op(t);i._resource=n;let o=new Ige(t);return y(t.usePreCachedTilesIfAvailable,!0)&&await kst(n,o),o.build(i),i};op.prototype.getTileCredits=function(e,t,n){return this._tileCredits};op.prototype.requestImage=function(e,t,n,i){return bl.loadImage(this,Xge(this,e,t,n,i))};op.prototype.pickFeatures=function(e,t,n,i,o){if(!this.enablePickFeatures)return;let r=this._tilingScheme.tileXYToNativeRectangle(e,t,n),s,a,c;if(this._tilingScheme.projection instanceof Ii)s=W.toDegrees(i),a=W.toDegrees(o),c="4326";else{let p=this._tilingScheme.projection.project(new he(i,o,0));s=p.x,a=p.y,c="3857"}let d="visible";l(this._layers)&&(d+=`:${this._layers}`);let u={f:"json",tolerance:2,geometryType:"esriGeometryPoint",geometry:`${s},${a}`,mapExtent:`${r.west},${r.south},${r.east},${r.north}`,imageDisplay:`${this._tileWidth},${this._tileHeight},96`,sr:c,layers:d};return this._resource.getDerivedResource({url:"identify",queryParameters:u}).fetchJson().then(function(p){let g=[],f=p.results;if(!l(f))return g;for(let x=0;x{var r;return(r=o.coverageAreas)==null?void 0:r.some(s=>l(s.bbox))})),t.attributionList=i}function Bst(e,t,n){let i=`An error occurred while accessing ${e.url}`;throw l(t)&&l(t.message)&&(i+=`: ${t.message}`),Go.reportError(void 0,n,l(n)?n._errorEvent:void 0,i,void 0,void 0,void 0,t),new ce(i)}async function Ost(e,t,n){let i=e.url,o=Fs._metadataCache[i];l(o)||(o=e.fetchJsonp("jsonp"),Fs._metadataCache[i]=o);try{let r=await o;return Dst(r,t)}catch(r){Bst(e,r,n)}}function Fs(e){e=y(e,y.EMPTY_OBJECT),this._defaultAlpha=void 0,this._defaultNightAlpha=void 0,this._defaultDayAlpha=void 0,this._defaultBrightness=void 0,this._defaultContrast=void 0,this._defaultHue=void 0,this._defaultSaturation=void 0,this._defaultGamma=1,this._defaultMinificationFilter=void 0,this._defaultMagnificationFilter=void 0,this._mapStyle=y(e.mapStyle,$V.AERIAL),this._mapLayer=e.mapLayer,this._culture=y(e.culture,""),this._key=e.key,this._tileDiscardPolicy=e.tileDiscardPolicy,l(this._tileDiscardPolicy)||(this._tileDiscardPolicy=new eL),this._proxy=e.proxy,this._credit=new Rt(``),this._tilingScheme=new as({numberOfLevelZeroTilesX:2,numberOfLevelZeroTilesY:2,ellipsoid:e.ellipsoid}),this._tileWidth=void 0,this._tileHeight=void 0,this._maximumLevel=void 0,this._imageUrlTemplate=void 0,this._imageUrlSubdomains=void 0,this._attributionList=void 0,this._errorEvent=new be}Object.defineProperties(Fs.prototype,{url:{get:function(){return this._resource.url}},proxy:{get:function(){return this._resource.proxy}},key:{get:function(){return this._key}},mapStyle:{get:function(){return this._mapStyle}},mapLayer:{get:function(){return this._mapLayer}},culture:{get:function(){return this._culture}},tileWidth:{get:function(){return this._tileWidth}},tileHeight:{get:function(){return this._tileHeight}},maximumLevel:{get:function(){return this._maximumLevel}},minimumLevel:{get:function(){return 0}},tilingScheme:{get:function(){return this._tilingScheme}},rectangle:{get:function(){return this._tilingScheme.rectangle}},tileDiscardPolicy:{get:function(){return this._tileDiscardPolicy}},errorEvent:{get:function(){return this._errorEvent}},credit:{get:function(){return this._credit}},hasAlphaChannel:{get:function(){return l(this.mapLayer)}}});Fs.fromUrl=async function(e,t){t=y(t,y.EMPTY_OBJECT);let n=t.tileProtocol;l(n)?n.length>0&&n[n.length-1]===":"&&(n=n.substr(0,n.length-1)):n=document.location.protocol==="http:"?"http":"https";let i=y(t.mapStyle,$V.AERIAL),o=Re.createIfNeeded(e);o.appendForwardSlash();let r={incl:"ImageryProviders",key:t.key,uriScheme:n};l(t.mapLayer)&&(r.mapLayer=t.mapLayer),l(t.culture)&&(r.culture=t.culture);let s=o.getDerivedResource({url:`REST/v1/Imagery/Metadata/${i}`,queryParameters:r}),a=new Fs(t);a._resource=o;let c=new Wge(t);return await Ost(s,c),c.build(a),a};var Yst=new le;Fs.prototype.getTileCredits=function(e,t,n){let i=this._tilingScheme.tileXYToRectangle(e,t,n,Yst);return Kst(this._attributionList,n,i)};Fs.prototype.requestImage=function(e,t,n,i){let o=bl.loadImage(this,Hst(this,e,t,n,i));if(l(o))return o.catch(function(r){return l(r.blob)&&r.blob.size===0?eL.EMPTY_IMAGE:Promise.reject(r)})};Fs.prototype.pickFeatures=function(e,t,n,i,o){};Fs.tileXYToQuadKey=function(e,t,n){let i="";for(let o=n;o>=0;--o){let r=1<=0;--o){let r=1<=h.zoomMin&&t<=h.zoomMax){let p=le.intersection(n,h.bbox,zst);l(p)&&(c=!0)}}c&&i.push(s.credit)}return i}Fs._metadataCache={};var Uw=Fs;var uLi=T(S(),1);var QVi=T(S(),1);var Pge=/{[^}]+}/g,vge={x:qst,y:eat,z:iat,s:oat,reverseX:$st,reverseY:tat,reverseZ:nat,westDegrees:rat,southDegrees:sat,eastDegrees:aat,northDegrees:cat,westProjected:lat,southProjected:dat,eastProjected:uat,northProjected:mat,width:hat,height:fat},Jst=Lt(vge,{i:pat,j:bat,reverseI:gat,reverseJ:yat,longitudeDegrees:_at,latitudeDegrees:Tat,longitudeProjected:Sat,latitudeProjected:Cat,format:Lat});function Dw(e){e=y(e,y.EMPTY_OBJECT),this._errorEvent=new be;let t=Re.createIfNeeded(e.url),n=Re.createIfNeeded(e.pickFeaturesUrl);this._resource=t,this._urlSchemeZeroPadding=e.urlSchemeZeroPadding,this._getFeatureInfoFormats=e.getFeatureInfoFormats,this._pickFeaturesResource=n;let i=e.subdomains;Array.isArray(i)?i=i.slice():l(i)&&i.length>0?i=i.split(""):i=["a","b","c"],this._subdomains=i,this._tileWidth=y(e.tileWidth,256),this._tileHeight=y(e.tileHeight,256),this._minimumLevel=y(e.minimumLevel,0),this._maximumLevel=e.maximumLevel,this._tilingScheme=y(e.tilingScheme,new as({ellipsoid:e.ellipsoid})),this._rectangle=y(e.rectangle,this._tilingScheme.rectangle),this._rectangle=le.intersection(this._rectangle,this._tilingScheme.rectangle),this._tileDiscardPolicy=e.tileDiscardPolicy;let o=e.credit;typeof o=="string"&&(o=new Rt(o)),this._credit=o,this._hasAlphaChannel=y(e.hasAlphaChannel,!0);let r=e.customTags,s=Lt(vge,r),a=Lt(Jst,r);this._tags=s,this._pickFeaturesTags=a,this._defaultAlpha=void 0,this._defaultNightAlpha=void 0,this._defaultDayAlpha=void 0,this._defaultBrightness=void 0,this._defaultContrast=void 0,this._defaultHue=void 0,this._defaultSaturation=void 0,this._defaultGamma=void 0,this._defaultMinificationFilter=void 0,this._defaultMagnificationFilter=void 0,this.enablePickFeatures=y(e.enablePickFeatures,!0)}Object.defineProperties(Dw.prototype,{url:{get:function(){return this._resource.url}},urlSchemeZeroPadding:{get:function(){return this._urlSchemeZeroPadding}},pickFeaturesUrl:{get:function(){return this._pickFeaturesResource.url}},proxy:{get:function(){return this._resource.proxy}},tileWidth:{get:function(){return this._tileWidth}},tileHeight:{get:function(){return this._tileHeight}},maximumLevel:{get:function(){return this._maximumLevel}},minimumLevel:{get:function(){return this._minimumLevel}},tilingScheme:{get:function(){return this._tilingScheme}},rectangle:{get:function(){return this._rectangle}},tileDiscardPolicy:{get:function(){return this._tileDiscardPolicy}},errorEvent:{get:function(){return this._errorEvent}},credit:{get:function(){return this._credit}},hasAlphaChannel:{get:function(){return this._hasAlphaChannel}}});Dw.prototype.getTileCredits=function(e,t,n){};Dw.prototype.requestImage=function(e,t,n,i){return bl.loadImage(this,Qst(this,e,t,n,i))};Dw.prototype.pickFeatures=function(e,t,n,i,o){if(!this.enablePickFeatures||!l(this._pickFeaturesResource)||this._getFeatureInfoFormats.length===0)return;let r=0,s=this;function a(d,u){return d.callback(u)}function c(){if(r>=s._getFeatureInfoFormats.length)return Promise.resolve([]);let d=s._getFeatureInfoFormats[r],u=jst(s,e,t,n,i,o,d.format);return++r,d.type==="json"?u.fetchJson().then(d.callback).catch(c):d.type==="xml"?u.fetchXML().then(d.callback).catch(c):d.type==="text"||d.type==="html"?u.fetchText().then(d.callback).catch(c):u.fetch({responseType:d.format}).then(a.bind(void 0,d)).catch(c)}return c()};var OD=!1,$d=new le,YD=!1,Bw=new le;function Qst(e,t,n,i,o){OD=!1,YD=!1;let r=e._resource,s=r.getUrlComponent(!0),a=e._tags,c={},d=s.match(Pge);return l(d)&&d.forEach(function(u){let h=u.substring(1,u.length-1);l(a[h])&&(c[h]=a[h](e,t,n,i))}),r.getDerivedResource({request:o,templateValues:c})}var uj=!1,nL=new D,mj=!1;function jst(e,t,n,i,o,r,s){OD=!1,YD=!1,uj=!1,mj=!1;let a=e._pickFeaturesResource,c=a.getUrlComponent(!0),d=e._pickFeaturesTags,u={},h=c.match(Pge);return l(h)&&h.forEach(function(p){let g=p.substring(1,p.length-1);l(d[g])&&(u[g]=d[g](e,t,n,i,o,r,s))}),a.getDerivedResource({templateValues:u})}function iL(e,t,n){if(e&&e.urlSchemeZeroPadding&&e.urlSchemeZeroPadding.hasOwnProperty(t)){let i=e.urlSchemeZeroPadding[t];if(typeof i=="string"){let o=i.length;o>1&&(n=n.length>=o?n:new Array(o-n.toString().length+1).join("0")+n)}}return n}function qst(e,t,n,i){return iL(e,"{x}",t)}function $st(e,t,n,i){let o=e.tilingScheme.getNumberOfXTilesAtLevel(i)-t-1;return iL(e,"{reverseX}",o)}function eat(e,t,n,i){return iL(e,"{y}",n)}function tat(e,t,n,i){let o=e.tilingScheme.getNumberOfYTilesAtLevel(i)-n-1;return iL(e,"{reverseY}",o)}function nat(e,t,n,i){let o=e.maximumLevel,r=l(o)&&it.rectangle.east&&(e.east=t.rectangle.east),e.southt.rectangle.north&&(e.north=t.rectangle.north),e}function Fge(e,t,n){let i=e.positionToTileXY(le.southwest(t),n),o=e.positionToTileXY(le.northeast(t),n);return(Math.abs(o.x-i.x)+1)*(Math.abs(o.y-i.y)+1)>4?0:n}fm._metadataSuccess=function(e,t,n,i,o){let r=/tileformat/i,s=/tileset/i,a=/tilesets/i,c=/boundingbox/i,d,u,h,p=[],g=e.childNodes[0].childNodes;for(let P=0;P`),this._tilingScheme=void 0,this._version=void 0,this._tileWidth=256,this._tileHeight=256,this._maximumLevel=e.maximumLevel,this._errorEvent=new be}Object.defineProperties(td.prototype,{url:{get:function(){return this._url}},path:{get:function(){return this._path}},proxy:{get:function(){return this._resource.proxy}},channel:{get:function(){return this._channel}},tileWidth:{get:function(){return this._tileWidth}},tileHeight:{get:function(){return this._tileHeight}},maximumLevel:{get:function(){return this._maximumLevel}},minimumLevel:{get:function(){return 0}},tilingScheme:{get:function(){return this._tilingScheme}},version:{get:function(){return this._version}},requestType:{get:function(){return this._requestType}},rectangle:{get:function(){return this._tilingScheme.rectangle}},tileDiscardPolicy:{get:function(){return this._tileDiscardPolicy}},errorEvent:{get:function(){return this._errorEvent}},credit:{get:function(){return this._credit}},hasAlphaChannel:{get:function(){return!0}}});td.fromUrl=async function(e,t,n){n=y(n,{});let i=y(n.path,"/default_map"),o=Re.createIfNeeded(e).getDerivedResource({url:i[0]==="/"?i.substring(1):i});o.appendForwardSlash();let r=o.getDerivedResource({url:"query",queryParameters:{request:"Json",vars:"geeServerDefs",is2d:"t"}}),s=new Age(n);s.channel=t,await Gat(r,s);let a=new td(n);return s.build(a),a._resource=o,a._url=e,a._path=i,a};td.prototype.getTileCredits=function(e,t,n){};td.prototype.requestImage=function(e,t,n,i){let o=this._resource.getDerivedResource({url:"query",request:i,queryParameters:{request:this._requestType,channel:this._channel,version:this._version,x:e,y:t,z:n+1}});return bl.loadImage(this,o)};td.prototype.pickFeatures=function(e,t,n,i,o){};td._logoUrl=void 0;Object.defineProperties(td,{logoUrl:{get:function(){return l(td._logoUrl)||(td._logoUrl=on("Assets/Images/google_earth_credit.png")),td._logoUrl},set:function(e){td._logoUrl=e}}});var Ow=td;var WLi=T(S(),1);var Eat=/\/$/,Mge=new Rt('© Mapbox © OpenStreetMap Improve this map');function oL(e){e=y(e,y.EMPTY_OBJECT);let t=e.mapId,n=e.accessToken;this._defaultAlpha=void 0,this._defaultNightAlpha=void 0,this._defaultDayAlpha=void 0,this._defaultBrightness=void 0,this._defaultContrast=void 0,this._defaultHue=void 0,this._defaultSaturation=void 0,this._defaultGamma=void 0,this._defaultMinificationFilter=void 0,this._defaultMagnificationFilter=void 0;let i=Re.createIfNeeded(y(e.url,"https://{s}.tiles.mapbox.com/v4/"));this._mapId=t,this._accessToken=n;let o=y(e.format,"png");/\./.test(o)||(o=`.${o}`),this._format=o;let r=i.getUrlComponent();Eat.test(r)||(r+="/"),r+=`${t}/{z}/{x}/{y}${this._format}`,i.url=r,i.setQueryParameters({access_token:n});let s;l(e.credit)?(s=e.credit,typeof s=="string"&&(s=new Rt(s))):s=Mge,this._resource=i,this._imageryProvider=new Ka({url:i,credit:s,ellipsoid:e.ellipsoid,minimumLevel:e.minimumLevel,maximumLevel:e.maximumLevel,rectangle:e.rectangle})}Object.defineProperties(oL.prototype,{url:{get:function(){return this._imageryProvider.url}},rectangle:{get:function(){return this._imageryProvider.rectangle}},tileWidth:{get:function(){return this._imageryProvider.tileWidth}},tileHeight:{get:function(){return this._imageryProvider.tileHeight}},maximumLevel:{get:function(){return this._imageryProvider.maximumLevel}},minimumLevel:{get:function(){return this._imageryProvider.minimumLevel}},tilingScheme:{get:function(){return this._imageryProvider.tilingScheme}},tileDiscardPolicy:{get:function(){return this._imageryProvider.tileDiscardPolicy}},errorEvent:{get:function(){return this._imageryProvider.errorEvent}},credit:{get:function(){return this._imageryProvider.credit}},proxy:{get:function(){return this._imageryProvider.proxy}},hasAlphaChannel:{get:function(){return this._imageryProvider.hasAlphaChannel}}});oL.prototype.getTileCredits=function(e,t,n){};oL.prototype.requestImage=function(e,t,n,i){return this._imageryProvider.requestImage(e,t,n,i)};oL.prototype.pickFeatures=function(e,t,n,i,o){return this._imageryProvider.pickFeatures(e,t,n,i,o)};oL._defaultCredit=Mge;var Yw=oL;var OLi=T(S(),1);function HT(e){e=y(e,y.EMPTY_OBJECT),this._defaultAlpha=void 0,this._defaultNightAlpha=void 0,this._defaultDayAlpha=void 0,this._defaultBrightness=void 0,this._defaultContrast=void 0,this._defaultHue=void 0,this._defaultSaturation=void 0,this._defaultGamma=void 0,this._defaultMinificationFilter=void 0,this._defaultMagnificationFilter=void 0;let t=y(e.rectangle,le.MAX_VALUE),n=new Qi({rectangle:t,numberOfLevelZeroTilesX:1,numberOfLevelZeroTilesY:1,ellipsoid:e.ellipsoid});this._tilingScheme=n,this._image=void 0,this._texture=void 0,this._hasError=!1,this._errorEvent=new be;let i=e.credit;typeof i=="string"&&(i=new Rt(i)),this._credit=i;let o=Re.createIfNeeded(e.url);this._resource=o,this._tileWidth=e.tileWidth,this._tileHeight=e.tileHeight}Object.defineProperties(HT.prototype,{url:{get:function(){return this._resource.url}},proxy:{get:function(){return this._resource.proxy}},tileWidth:{get:function(){return this._tileWidth}},tileHeight:{get:function(){return this._tileHeight}},maximumLevel:{get:function(){return 0}},minimumLevel:{get:function(){return 0}},tilingScheme:{get:function(){return this._tilingScheme}},rectangle:{get:function(){return this._tilingScheme.rectangle}},tileDiscardPolicy:{get:function(){}},errorEvent:{get:function(){return this._errorEvent}},credit:{get:function(){return this._credit}},hasAlphaChannel:{get:function(){return!0}}});function Iat(e,t,n,i){let o=`Failed to load image ${e.url}`;l(t)&&l(t.message)&&(o+=`: ${t.message}`);let r=Go.reportError(i,n,l(n)?n._errorEvent:void 0,o,0,0,0,t);if(r.retry)return fj(e,n,r);throw l(n)&&(n._hasError=!0),new ce(o)}async function fj(e,t,n){try{return await bl.loadImage(null,e)}catch(i){return Iat(e,i,t,n)}}HT.fromUrl=async function(e,t){let n=Re.createIfNeeded(e),i=await fj(n);t=y(t,y.EMPTY_OBJECT);let o=new HT({...t,url:e,tileWidth:i.width,tileHeight:i.height});return o._image=i,o};HT.prototype.getTileCredits=function(e,t,n){};HT.prototype.requestImage=async function(e,t,n,i){if(!this._hasError&&!l(this._image)){let o=await fj(this._resource,this);return this._image=o,Go.reportSuccess(this._errorEvent),o}return this._image};HT.prototype.pickFeatures=function(e,t,n,i,o){};var Hw=HT;var fRi=T(S(),1);var QLi=T(S(),1);function Xat(e,t,n){this.type=e,l(t)||(e==="json"?t="application/json":e==="xml"?t="text/xml":e==="html"?t="text/html":e==="text"&&(t="text/plain")),this.format=t,l(n)||(e==="json"?n=Wat:e==="xml"?n=Fat:(e==="html"||e==="text")&&(n=Nge)),this.callback=n}function Wat(e){let t=[],n=e.features;for(let i=0;i0)for(let r=0;r\s*<\/body>/im,Bat=//im,Oat=/([\s\S]*)<\/title>/im;function Nge(e){if(Dat.test(e)||Bat.test(e))return;let t,n=Oat.exec(e);n&&n.length>1&&(t=n[1]);let i=new Nh;return i.name=t,i.description=e,i.data=e,[i]}var zT=Xat;var iRi=T(S(),1);function zw(e){e=y(e,y.EMPTY_OBJECT),this._tileCache={},this._tilesRequestedForInterval=[];let t=this._clock=e.clock;this._times=e.times,this._requestImageFunction=e.requestImageFunction,this._reloadFunction=e.reloadFunction,this._currentIntervalIndex=-1,t.onTick.addEventListener(this._clockOnTick,this),this._clockOnTick(t)}Object.defineProperties(zw.prototype,{clock:{get:function(){return this._clock},set:function(e){this._clock!==e&&(this._clock=e,this._clockOnTick(e),this._reloadFunction())}},times:{get:function(){return this._times},set:function(e){this._times!==e&&(this._times=e,this._clockOnTick(this._clock),this._reloadFunction())}},currentInterval:{get:function(){return this._times.get(this._currentIntervalIndex)}}});zw.prototype.getFromCache=function(e,t,n,i){let o=kge(e,t,n),r,s=this._tileCache[this._currentIntervalIndex];if(l(s)&&l(s[o])){let a=s[o];r=a.promise.catch(function(c){throw i.state=a.request.state,c}),delete s[o]}return r};zw.prototype.checkApproachingInterval=function(e,t,n,i){let o=kge(e,t,n),r=this._tilesRequestedForInterval,s=Uge(this),a={key:o,priorityFunction:i.priorityFunction};(!l(s)||!Dge(this,a,s))&&r.push(a),r.length>=512&&r.splice(0,256)};zw.prototype._clockOnTick=function(e){let t=e.currentTime,i=this._times.indexOf(t),o=this._currentIntervalIndex;if(i!==o){let s=this._tileCache[o];for(let a in s)s.hasOwnProperty(a)&&s[a].request.cancel();delete this._tileCache[o],this._tilesRequestedForInterval=[],this._currentIntervalIndex=i,this._reloadFunction();return}let r=Uge(this);if(l(r)){let s=this._tilesRequestedForInterval,a=!0;for(;a&&s.length!==0;){let c=s.pop();a=Dge(this,c,r),a||s.push(c)}}};function kge(e,t,n){return`${e}-${t}-${n}`}function Yat(e){let t=e.split("-");if(t.length===3)return{x:Number(t[0]),y:Number(t[1]),level:Number(t[2])}}function Uge(e){let t=e._times;if(!l(t))return;let n=e._clock,i=n.currentTime,o=n.canAnimate&&n.shouldAnimate,r=n.multiplier;if(!o&&r!==0)return;let s,a=t.indexOf(i);if(a<0)return;let c=t.get(a);return r>0?(s=q.secondsDifference(c.stop,i),++a):(s=q.secondsDifference(c.start,i),--a),s/=r,a>=0&&s<=5?t.get(a):void 0}function Dge(e,t,n){let i=e._times.indexOf(n.start),o=e._tileCache,r=o[i];l(r)||(r=o[i]={});let s=t.key;if(l(r[s]))return!0;let a=Yat(s),c=new Qo({throttle:!1,throttleByServer:!0,type:ms.IMAGERY,priorityFunction:t.priorityFunction}),d=e._requestImageFunction(a.x,a.y,a.level,c,n);return l(d)?(r[s]={promise:d,request:c},!0):!1}var KT=zw;var Hat=[3034,3035,3042,3043,3044],zat=[4471,4559];function Uh(e){if(e=y(e,y.EMPTY_OBJECT),l(e.times)&&!l(e.clock))throw new fe("options.times was specified, so options.clock is required.");this._defaultAlpha=void 0,this._defaultNightAlpha=void 0,this._defaultDayAlpha=void 0,this._defaultBrightness=void 0,this._defaultContrast=void 0,this._defaultHue=void 0,this._defaultSaturation=void 0,this._defaultGamma=void 0,this._defaultMinificationFilter=void 0,this._defaultMagnificationFilter=void 0,this._getFeatureInfoUrl=y(e.getFeatureInfoUrl,e.url);let t=Re.createIfNeeded(e.url),n=Re.createIfNeeded(this._getFeatureInfoUrl);t.setQueryParameters(Uh.DefaultParameters,!0),n.setQueryParameters(Uh.GetFeatureInfoDefaultParameters,!0),l(e.parameters)&&t.setQueryParameters(Bge(e.parameters,e.toLowerCase)),l(e.getFeatureInfoParameters)&&n.setQueryParameters(Bge(e.getFeatureInfoParameters,e.toLowerCase));let i=this;this._reload=void 0,l(e.times)&&(this._timeDynamicImagery=new KT({clock:e.clock,times:e.times,requestImageFunction:function(s,a,c,d,u){return Oge(i,s,a,c,d,u)},reloadFunction:function(){l(i._reload)&&i._reload()}}));let o={};if(o.layers=e.layers,o.bbox="{westProjected},{southProjected},{eastProjected},{northProjected}",o.width="{width}",o.height="{height}",parseFloat(t.queryParameters.version)>=1.3){o.crs=y(e.crs,e.tilingScheme&&e.tilingScheme.projection instanceof Wi?"EPSG:3857":"CRS:84");let s=o.crs.split(":");if(s[0]==="EPSG"&&s.length===2){let a=Number(s[1]);(a>=4e3&&a<5e3&&!zat.includes(a)||Hat.includes(a))&&(o.bbox="{southProjected},{westProjected},{northProjected},{eastProjected}")}}else o.srs=y(e.srs,e.tilingScheme&&e.tilingScheme.projection instanceof Wi?"EPSG:3857":"EPSG:4326");t.setQueryParameters(o,!0),n.setQueryParameters(o,!0);let r={query_layers:e.layers,info_format:"{format}"};parseFloat(n.queryParameters.version)>=1.3?(r.i="{i}",r.j="{j}"):(r.x="{i}",r.y="{j}"),n.setQueryParameters(r,!0),this._resource=t,this._pickFeaturesResource=n,this._layers=e.layers,this._tileProvider=new Ka({url:t,pickFeaturesUrl:n,tilingScheme:y(e.tilingScheme,new Qi({ellipsoid:e.ellipsoid})),rectangle:e.rectangle,tileWidth:e.tileWidth,tileHeight:e.tileHeight,minimumLevel:e.minimumLevel,maximumLevel:e.maximumLevel,subdomains:e.subdomains,tileDiscardPolicy:e.tileDiscardPolicy,credit:e.credit,getFeatureInfoFormats:y(e.getFeatureInfoFormats,Uh.DefaultGetFeatureInfoFormats),enablePickFeatures:e.enablePickFeatures})}function Oge(e,t,n,i,o,r){let s=l(r)?r.data:void 0,a=e._tileProvider;return l(s)&&a._resource.setQueryParameters(s),a.requestImage(t,n,i,o)}function Kat(e,t,n,i,o,r,s){let a=l(s)?s.data:void 0,c=e._tileProvider;return l(a)&&c._pickFeaturesResource.setQueryParameters(a),c.pickFeatures(t,n,i,o,r)}Object.defineProperties(Uh.prototype,{url:{get:function(){return this._resource._url}},proxy:{get:function(){return this._resource.proxy}},layers:{get:function(){return this._layers}},tileWidth:{get:function(){return this._tileProvider.tileWidth}},tileHeight:{get:function(){return this._tileProvider.tileHeight}},maximumLevel:{get:function(){return this._tileProvider.maximumLevel}},minimumLevel:{get:function(){return this._tileProvider.minimumLevel}},tilingScheme:{get:function(){return this._tileProvider.tilingScheme}},rectangle:{get:function(){return this._tileProvider.rectangle}},tileDiscardPolicy:{get:function(){return this._tileProvider.tileDiscardPolicy}},errorEvent:{get:function(){return this._tileProvider.errorEvent}},credit:{get:function(){return this._tileProvider.credit}},hasAlphaChannel:{get:function(){return this._tileProvider.hasAlphaChannel}},enablePickFeatures:{get:function(){return this._tileProvider.enablePickFeatures},set:function(e){this._tileProvider.enablePickFeatures=e}},clock:{get:function(){return this._timeDynamicImagery.clock},set:function(e){this._timeDynamicImagery.clock=e}},times:{get:function(){return this._timeDynamicImagery.times},set:function(e){this._timeDynamicImagery.times=e}},getFeatureInfoUrl:{get:function(){return this._getFeatureInfoUrl}}});Uh.prototype.getTileCredits=function(e,t,n){return this._tileProvider.getTileCredits(e,t,n)};Uh.prototype.requestImage=function(e,t,n,i){let o,r=this._timeDynamicImagery,s;return l(r)&&(s=r.currentInterval,o=r.getFromCache(e,t,n,i)),l(o)||(o=Oge(this,e,t,n,i,s)),l(o)&&l(r)&&r.checkApproachingInterval(e,t,n,i),o};Uh.prototype.pickFeatures=function(e,t,n,i,o){let r=this._timeDynamicImagery,s=l(r)?r.currentInterval:void 0;return Kat(this,e,t,n,i,o,s)};Uh.DefaultParameters=Object.freeze({service:"WMS",version:"1.1.1",request:"GetMap",styles:"",format:"image/jpeg"});Uh.GetFeatureInfoDefaultParameters=Object.freeze({service:"WMS",version:"1.1.1",request:"GetFeatureInfo"});Uh.DefaultGetFeatureInfoFormats=Object.freeze([Object.freeze(new zT("json","application/json")),Object.freeze(new zT("xml","text/xml")),Object.freeze(new zT("text","text/html"))]);function Bge(e,t=!0){if(t){let n={};for(let i in e)e.hasOwnProperty(i)&&(n[i.toLowerCase()]=e[i]);return n}return e}var Kw=Uh;var RRi=T(S(),1);var Jat=Object.freeze({service:"WMTS",version:"1.0.0",request:"GetTile"});function Jw(e){e=y(e,y.EMPTY_OBJECT),this._defaultAlpha=void 0,this._defaultNightAlpha=void 0,this._defaultDayAlpha=void 0,this._defaultBrightness=void 0,this._defaultContrast=void 0,this._defaultHue=void 0,this._defaultSaturation=void 0,this._defaultGamma=void 0,this._defaultMinificationFilter=void 0,this._defaultMagnificationFilter=void 0;let t=Re.createIfNeeded(e.url),n=e.style,i=e.tileMatrixSetID,o=t.url,r=o.match(/{/g);if(!l(r)||r.length===1&&/{s}/.test(o))t.setQueryParameters(Jat),this._useKvp=!0;else{let h={style:n,Style:n,TileMatrixSet:i};t.setTemplateValues(h),this._useKvp=!1}this._resource=t,this._layer=e.layer,this._style=n,this._tileMatrixSetID=i,this._tileMatrixLabels=e.tileMatrixLabels,this._format=y(e.format,"image/jpeg"),this._tileDiscardPolicy=e.tileDiscardPolicy,this._tilingScheme=l(e.tilingScheme)?e.tilingScheme:new as({ellipsoid:e.ellipsoid}),this._tileWidth=y(e.tileWidth,256),this._tileHeight=y(e.tileHeight,256),this._minimumLevel=y(e.minimumLevel,0),this._maximumLevel=e.maximumLevel,this._rectangle=y(e.rectangle,this._tilingScheme.rectangle),this._dimensions=e.dimensions;let s=this;this._reload=void 0,l(e.times)&&(this._timeDynamicImagery=new KT({clock:e.clock,times:e.times,requestImageFunction:function(h,p,g,f,x){return Yge(s,h,p,g,f,x)},reloadFunction:function(){l(s._reload)&&s._reload()}}));let a=this._tilingScheme.positionToTileXY(le.southwest(this._rectangle),this._minimumLevel),c=this._tilingScheme.positionToTileXY(le.northeast(this._rectangle),this._minimumLevel),d=(Math.abs(c.x-a.x)+1)*(Math.abs(c.y-a.y)+1);this._errorEvent=new be;let u=e.credit;this._credit=typeof u=="string"?new Rt(u):u,this._subdomains=e.subdomains,Array.isArray(this._subdomains)?this._subdomains=this._subdomains.slice():l(this._subdomains)&&this._subdomains.length>0?this._subdomains=this._subdomains.split(""):this._subdomains=["a","b","c"]}function Yge(e,t,n,i,o,r){let s=e._tileMatrixLabels,a=l(s)?s[i]:i.toString(),c=e._subdomains,d=e._dimensions,u=l(r)?r.data:void 0,h,p;if(!e._useKvp)p={TileMatrix:a,TileRow:n.toString(),TileCol:t.toString(),s:c[(t+n+i)%c.length]},h=e._resource.getDerivedResource({request:o}),h.setTemplateValues(p),l(d)&&h.setTemplateValues(d),l(u)&&h.setTemplateValues(u);else{let g={};g.tilematrix=a,g.layer=e._layer,g.style=e._style,g.tilerow=n,g.tilecol=t,g.tilematrixset=e._tileMatrixSetID,g.format=e._format,l(d)&&(g=Lt(g,d)),l(u)&&(g=Lt(g,u)),p={s:c[(t+n+i)%c.length]},h=e._resource.getDerivedResource({queryParameters:g,request:o}),h.setTemplateValues(p)}return bl.loadImage(e,h)}Object.defineProperties(Jw.prototype,{url:{get:function(){return this._resource.url}},proxy:{get:function(){return this._resource.proxy}},tileWidth:{get:function(){return this._tileWidth}},tileHeight:{get:function(){return this._tileHeight}},maximumLevel:{get:function(){return this._maximumLevel}},minimumLevel:{get:function(){return this._minimumLevel}},tilingScheme:{get:function(){return this._tilingScheme}},rectangle:{get:function(){return this._rectangle}},tileDiscardPolicy:{get:function(){return this._tileDiscardPolicy}},errorEvent:{get:function(){return this._errorEvent}},format:{get:function(){return this._format}},credit:{get:function(){return this._credit}},hasAlphaChannel:{get:function(){return!0}},clock:{get:function(){return this._timeDynamicImagery.clock},set:function(e){this._timeDynamicImagery.clock=e}},times:{get:function(){return this._timeDynamicImagery.times},set:function(e){this._timeDynamicImagery.times=e}},dimensions:{get:function(){return this._dimensions},set:function(e){this._dimensions!==e&&(this._dimensions=e,l(this._reload)&&this._reload())}}});Jw.prototype.getTileCredits=function(e,t,n){};Jw.prototype.requestImage=function(e,t,n,i){let o,r=this._timeDynamicImagery,s;return l(r)&&(s=r.currentInterval,o=r.getFromCache(e,t,n,i)),l(o)||(o=Yge(this,e,t,n,i,s)),l(o)&&l(r)&&r.checkApproachingInterval(e,t,n,i),o};Jw.prototype.pickFeatures=function(e,t,n,i,o){};var Qw=Jw;var Qat={ARCGIS_MAPSERVER:b0.fromUrl,BING:async(e,t)=>Uw.fromUrl(e,t),GOOGLE_EARTH:async(e,t)=>{let n=t.channel;return delete t.channel,Ow.fromUrl(e,n,t)},MAPBOX:(e,t)=>new Yw({url:e,...t}),SINGLE_TILE:Hw.fromUrl,TMS:Py.fromUrl,URL_TEMPLATE:(e,t)=>new Ka({url:e,...t}),WMS:(e,t)=>new Kw({url:e,...t}),WMTS:(e,t)=>new Qw({url:e,...t})};function rp(e){e=y(e,y.EMPTY_OBJECT),this._defaultAlpha=void 0,this._defaultNightAlpha=void 0,this._defaultDayAlpha=void 0,this._defaultBrightness=void 0,this._defaultContrast=void 0,this._defaultHue=void 0,this._defaultSaturation=void 0,this._defaultGamma=void 0,this._defaultMinificationFilter=void 0,this._defaultMagnificationFilter=void 0,this._tileCredits=void 0,this._errorEvent=new be}Object.defineProperties(rp.prototype,{rectangle:{get:function(){return this._imageryProvider.rectangle}},tileWidth:{get:function(){return this._imageryProvider.tileWidth}},tileHeight:{get:function(){return this._imageryProvider.tileHeight}},maximumLevel:{get:function(){return this._imageryProvider.maximumLevel}},minimumLevel:{get:function(){return this._imageryProvider.minimumLevel}},tilingScheme:{get:function(){return this._imageryProvider.tilingScheme}},tileDiscardPolicy:{get:function(){return this._imageryProvider.tileDiscardPolicy}},errorEvent:{get:function(){return this._errorEvent}},credit:{get:function(){return this._imageryProvider.credit}},hasAlphaChannel:{get:function(){return this._imageryProvider.hasAlphaChannel}},proxy:{get:function(){}}});rp.fromAssetId=async function(e,t){t=y(t,y.EMPTY_OBJECT);let n=xd._createEndpointResource(e,t),i=e.toString()+t.accessToken+t.server,o=rp._endpointCache[i];l(o)||(o=n.fetchJson(),rp._endpointCache[i]=o);let r=await o;if(r.type!=="IMAGERY")throw new ce(`Cesium ion asset ${e} is not an imagery asset.`);let s,a=r.externalType;if(!l(a))s=await Py.fromUrl(new xd(r,n));else{let d=Qat[a];if(!l(d))throw new ce(`Unrecognized Cesium ion imagery type: ${a}`);let u={...r.options},h=u.url;delete u.url,s=await d(h,u)}let c=new rp(t);return s.errorEvent.addEventListener(function(d){d.provider=c,c._errorEvent.raiseEvent(d)}),c._tileCredits=xd.getCreditsFromEndpoint(r,n),c._imageryProvider=s,c};rp.prototype.getTileCredits=function(e,t,n){let i=this._imageryProvider.getTileCredits(e,t,n);return l(i)?this._tileCredits.concat(i):this._tileCredits};rp.prototype.requestImage=function(e,t,n,i){return this._imageryProvider.requestImage(e,t,n,i)};rp.prototype.pickFeatures=function(e,t,n,i,o){return this._imageryProvider.pickFeatures(e,t,n,i,o)};rp._endpointCache={};var g0=rp;var ORi=T(S(),1),jat={AERIAL:2,AERIAL_WITH_LABELS:3,ROAD:4},y0=Object.freeze(jat);function qat(e){e=y(e,y.EMPTY_OBJECT);let t=y(e.style,y0.AERIAL);return g0.fromAssetId(t)}var x0=qat;var jRi=T(S(),1),jw=`uniform sampler2D u_texture; in vec2 v_textureCoordinates; void main() { out_FragColor = texture(u_texture, v_textureCoordinates); } `;var $Ri=T(S(),1),qw=`in vec4 position; in float webMercatorT; uniform vec2 u_textureDimensions; out vec2 v_textureCoordinates; void main() { v_textureCoordinates = vec2(position.x, webMercatorT); gl_Position = czm_viewportOrthographic * (position * vec4(u_textureDimensions, 1.0, 1.0)); } `;var oZi=T(S(),1);function rL(e,t,n,i,o){if(this.imageryLayer=e,this.x=t,this.y=n,this.level=i,this.request=void 0,i!==0){let r=t/2|0,s=n/2|0,a=i-1;this.parent=e.getImageryFromCache(r,s,a)}this.state=$n.UNLOADED,this.imageUrl=void 0,this.image=void 0,this.texture=void 0,this.textureWebMercator=void 0,this.credits=void 0,this.referenceCount=0,!l(o)&&e.ready&&(o=e.imageryProvider.tilingScheme.tileXYToRectangle(t,n,i)),this.rectangle=o}rL.createPlaceholder=function(e){let t=new rL(e,0,0,0);return t.addReference(),t.state=$n.PLACEHOLDER,t};rL.prototype.addReference=function(){++this.referenceCount};rL.prototype.releaseReference=function(){return--this.referenceCount,this.referenceCount===0?(this.imageryLayer.removeImageryFromCache(this),l(this.parent)&&this.parent.releaseReference(),l(this.image)&&l(this.image.destroy)&&this.image.destroy(),l(this.texture)&&this.texture.destroy(),l(this.textureWebMercator)&&this.texture!==this.textureWebMercator&&this.textureWebMercator.destroy(),me(this),0):this.referenceCount};rL.prototype.processStateMachine=function(e,t,n){this.state===$n.UNLOADED&&!n&&(this.state=$n.TRANSITIONING,this.imageryLayer._requestImagery(this)),this.state===$n.RECEIVED&&(this.state=$n.TRANSITIONING,this.imageryLayer._createTexture(e.context,this));let i=this.state===$n.READY&&t&&!this.texture;(this.state===$n.TEXTURE_LOADED||i)&&(this.state=$n.TRANSITIONING,this.imageryLayer._reprojectTexture(e,this,t))};var sL=rL;var cZi=T(S(),1);function gj(e,t,n){this.readyImagery=void 0,this.loadingImagery=e,this.textureCoordinateRectangle=t,this.textureTranslationAndScale=void 0,this.useWebMercatorT=n}gj.prototype.freeResources=function(){l(this.readyImagery)&&this.readyImagery.releaseReference(),l(this.loadingImagery)&&this.loadingImagery.releaseReference()};gj.prototype.processStateMachine=function(e,t,n){let i=this.loadingImagery,o=i.imageryLayer;if(i.processStateMachine(t,!this.useWebMercatorT,n),i.state===$n.READY)return l(this.readyImagery)&&this.readyImagery.releaseReference(),this.readyImagery=this.loadingImagery,this.loadingImagery=void 0,this.textureTranslationAndScale=o._calculateTextureTranslationAndScale(e,this),!0;let r=i.parent,s;for(;l(r)&&(r.state!==$n.READY||!this.useWebMercatorT&&!l(r.texture));)r.state!==$n.FAILED&&r.state!==$n.INVALID&&(s=s||r),r=r.parent;return this.readyImagery!==r&&(l(this.readyImagery)&&this.readyImagery.releaseReference(),this.readyImagery=r,l(r)&&(r.addReference(),this.textureTranslationAndScale=o._calculateTextureTranslationAndScale(e,this))),i.state===$n.FAILED||i.state===$n.INVALID?l(s)?(s.processStateMachine(t,!this.useWebMercatorT,n),!1):!0:!1};var aL=gj;function Ci(e,t){this._imageryProvider=e,this._readyEvent=new be,this._errorEvent=new be,t=y(t,y.EMPTY_OBJECT),e=y(e,y.EMPTY_OBJECT),this.alpha=y(t.alpha,y(e._defaultAlpha,1)),this.nightAlpha=y(t.nightAlpha,y(e._defaultNightAlpha,1)),this.dayAlpha=y(t.dayAlpha,y(e._defaultDayAlpha,1)),this.brightness=y(t.brightness,y(e._defaultBrightness,Ci.DEFAULT_BRIGHTNESS)),this.contrast=y(t.contrast,y(e._defaultContrast,Ci.DEFAULT_CONTRAST)),this.hue=y(t.hue,y(e._defaultHue,Ci.DEFAULT_HUE)),this.saturation=y(t.saturation,y(e._defaultSaturation,Ci.DEFAULT_SATURATION)),this.gamma=y(t.gamma,y(e._defaultGamma,Ci.DEFAULT_GAMMA)),this.splitDirection=y(t.splitDirection,Ci.DEFAULT_SPLIT),this.minificationFilter=y(t.minificationFilter,y(e._defaultMinificationFilter,Ci.DEFAULT_MINIFICATION_FILTER)),this.magnificationFilter=y(t.magnificationFilter,y(e._defaultMagnificationFilter,Ci.DEFAULT_MAGNIFICATION_FILTER)),this.show=y(t.show,!0),this._minimumTerrainLevel=t.minimumTerrainLevel,this._maximumTerrainLevel=t.maximumTerrainLevel,this._rectangle=y(t.rectangle,le.MAX_VALUE),this._maximumAnisotropy=t.maximumAnisotropy,this._imageryCache={},this._skeletonPlaceholder=new aL(sL.createPlaceholder(this)),this._show=!0,this._layerIndex=-1,this._isBaseLayer=!1,this._requestImageError=void 0,this._reprojectComputeCommands=[],this.cutoutRectangle=t.cutoutRectangle,this.colorToAlpha=t.colorToAlpha,this.colorToAlphaThreshold=y(t.colorToAlphaThreshold,Ci.DEFAULT_APPLY_COLOR_TO_ALPHA_THRESHOLD),this._marsOptions=y(t.marsOptions,{}),this._initByMars3D&&this._initByMars3D(e,t)}Object.defineProperties(Ci.prototype,{imageryProvider:{get:function(){return this._imageryProvider}},ready:{get:function(){return l(this._imageryProvider)}},errorEvent:{get:function(){return this._errorEvent}},readyEvent:{get:function(){return this._readyEvent}},rectangle:{get:function(){return this._rectangle}}});Ci.DEFAULT_BRIGHTNESS=1;Ci.DEFAULT_CONTRAST=1;Ci.DEFAULT_HUE=0;Ci.DEFAULT_SATURATION=1;Ci.DEFAULT_GAMMA=1;Ci.DEFAULT_SPLIT=Fr.NONE;Ci.DEFAULT_MINIFICATION_FILTER=qt.LINEAR;Ci.DEFAULT_MAGNIFICATION_FILTER=pi.LINEAR;Ci.DEFAULT_APPLY_COLOR_TO_ALPHA_THRESHOLD=.004;Ci.fromProviderAsync=function(e,t){let n=new Ci(void 0,t);return ict(n,Promise.resolve(e)),n};Ci.fromWorldImagery=function(e){return e=y(e,y.EMPTY_OBJECT),Ci.fromProviderAsync(x0({style:e.style}),e)};Ci.prototype.isBaseLayer=function(){return this._isBaseLayer};Ci.prototype.isDestroyed=function(){return!1};Ci.prototype.destroy=function(){return me(this)};var Kge=new le,Hge=new le,yj=new le,Jge=new le;Ci.prototype.getImageryRectangle=function(){let e=this._imageryProvider,t=this._rectangle;return le.intersection(e.rectangle,t)};Ci.prototype._createTileImagerySkeletons=function(e,t,n){let i=e.data;if(!l(t)||l(this._minimumTerrainLevel)&&e.level<this._minimumTerrainLevel||l(this._maximumTerrainLevel)&&e.level>this._maximumTerrainLevel)return!1;l(n)||(n=i.imagery.length);let o=this._imageryProvider;if(!this.ready)return this._skeletonPlaceholder.loadingImagery.addReference(),i.imagery.splice(n,0,this._skeletonPlaceholder),!0;let r=o.tilingScheme.projection instanceof Wi&&e.rectangle.north<Wi.MaximumLatitude&&e.rectangle.south>-Wi.MaximumLatitude,s=le.intersection(o.rectangle,this._rectangle,Kge),a=le.intersection(e.rectangle,s,Hge);if(!l(a)){if(!this.isBaseLayer())return!1;let E=s,X=e.rectangle;a=Hge,X.south>=E.north?a.north=a.south=E.north:X.north<=E.south?a.north=a.south=E.south:(a.south=Math.max(X.south,E.south),a.north=Math.min(X.north,E.north)),X.west>=E.east?a.west=a.east=E.east:X.east<=E.west?a.west=a.east=E.west:(a.west=Math.max(X.west,E.west),a.east=Math.min(X.east,E.east))}let c=0;a.south>0?c=a.south:a.north<0&&(c=a.north);let u=1*t.getLevelMaximumGeometricError(e.level),h=tct(this,u,c);h=Math.max(0,h);let p=o.maximumLevel;if(h>p&&(h=p),l(o.minimumLevel)){let E=o.minimumLevel;h<E&&(h=E)}let g=o.tilingScheme,f=g.positionToTileXY(le.northwest(a),h),x=g.positionToTileXY(le.southeast(a),h),_=e.rectangle.width/512,C=e.rectangle.height/512,V=g.tileXYToRectangle(f.x,f.y,h);Math.abs(V.south-e.rectangle.north)<C&&f.y<x.y&&++f.y,Math.abs(V.east-e.rectangle.west)<_&&f.x<x.x&&++f.x;let L=g.tileXYToRectangle(x.x,x.y,h);Math.abs(L.north-e.rectangle.south)<C&&x.y>f.y&&--x.y,Math.abs(L.west-e.rectangle.east)<_&&x.x>f.x&&--x.x;let R=le.clone(e.rectangle,Jge),G=g.tileXYToRectangle(f.x,f.y,h),I=le.intersection(G,s,yj),v;r?(g.rectangleToNativeRectangle(R,R),g.rectangleToNativeRectangle(G,G),g.rectangleToNativeRectangle(I,I),g.rectangleToNativeRectangle(s,s),v=g.tileXYToNativeRectangle.bind(g),_=R.width/512,C=R.height/512):v=g.tileXYToRectangle.bind(g);let P,w=0,A=1,b;!this.isBaseLayer()&&Math.abs(I.west-R.west)>=_&&(w=Math.min(1,(I.west-R.west)/R.width)),!this.isBaseLayer()&&Math.abs(I.north-R.north)>=C&&(A=Math.max(0,(I.north-R.south)/R.height));let Z=A;for(let E=f.x;E<=x.x;E++)if(P=w,G=v(E,f.y,h),I=le.simpleIntersection(G,s,yj),!!l(I)){w=Math.min(1,(I.east-R.west)/R.width),E===x.x&&(this.isBaseLayer()||Math.abs(I.east-R.east)<_)&&(w=1),A=Z;for(let X=f.y;X<=x.y;X++){if(b=A,G=v(E,X,h),I=le.simpleIntersection(G,s,yj),!l(I))continue;A=Math.max(0,(I.south-R.south)/R.height),X===x.y&&(this.isBaseLayer()||Math.abs(I.south-R.south)<C)&&(A=0);let F=new re(P,A,w,b),N=this.getImageryFromCache(E,X,h);i.imagery.splice(n,0,new aL(N,F,r)),++n}}return!0};Ci.prototype._calculateTextureTranslationAndScale=function(e,t){let n=t.readyImagery.rectangle,i=e.rectangle;if(t.useWebMercatorT){let c=t.readyImagery.imageryLayer.imageryProvider.tilingScheme;n=c.rectangleToNativeRectangle(n,Kge),i=c.rectangleToNativeRectangle(i,Jge)}let o=i.width,r=i.height,s=o/n.width,a=r/n.height;return new re(s*(i.west-n.west)/o,a*(i.south-n.south)/r,s,a)};Ci.prototype._requestImagery=function(e){if(l(this._minimumTerrainLevel)&&e.level<this._minimumTerrainLevel)return e.state=$n.FAILED,e.request=void 0,!1;if(l(this._maximumTerrainLevel)&&e.level>this._maximumTerrainLevel)return e.state=$n.FAILED,e.request=void 0,!1;let t=this._imageryProvider,n=this;function i(s){if(!l(s))return o();e.image=s,e.state=$n.RECEIVED,e.request=void 0,Go.reportSuccess(n._requestImageError),n._marsOptions.onAddTileSuccess&&n._marsOptions.onAddTileSuccess(e)}function o(s){if(e.request.state===ei.CANCELLED){e.state=$n.UNLOADED,e.request=void 0;return}e.state=$n.FAILED,e.request=void 0;let a=`\u65E0\u6CD5\u83B7\u5F97\u56FE\u5757 x:${e.x},y: ${e.y},z:${e.level}. `;t._resource&&t._resource._last_url&&(a+=t._resource._last_url),n._requestImageError=Go.reportError(n._requestImageError,t,t.errorEvent,a,e.x,e.y,e.level,s),n._requestImageError.retry&&r(),n._marsOptions.onAddTileError&&n._marsOptions.onAddTileError(e)}function r(){let s=new Qo({throttle:!1,throttleByServer:!0,type:ms.IMAGERY});e.request=s,e.state=$n.TRANSITIONING;let a=t.requestImage(e.x,e.y,e.level,s);if(!l(a)){e.state=$n.UNLOADED,e.request=void 0;return}l(t.getTileCredits)&&(e.credits=t.getTileCredits(e.x,e.y,e.level)),n._marsOptions.onAddTile&&n._marsOptions.onAddTile(e),a.then?a.then(function(c){i(c)}).catch(function(c){o(c)}):i(a)}r()};Ci.prototype._createTextureWebGL=function(e,t){let n=new $t({minificationFilter:this.minificationFilter,magnificationFilter:this.magnificationFilter}),i=t.image;return l(i.internalFormat)?new Wt({context:e,pixelFormat:i.internalFormat,width:i.width,height:i.height,source:{arrayBufferView:i.bufferView},sampler:n}):new Wt({context:e,source:i,pixelFormat:this._imageryProvider.hasAlphaChannel?ot.RGBA:ot.RGB,sampler:n})};Ci.prototype._createTexture=function(e,t){let n=this._imageryProvider,i=t.image;if(l(n.tileDiscardPolicy)){let r=n.tileDiscardPolicy;if(l(r)){if(!r.isReady()){t.state=$n.RECEIVED;return}if(r.shouldDiscardImage(i)){t.state=$n.INVALID;return}}}let o=this._createTextureWebGL(e,t);n.tilingScheme.projection instanceof Wi?t.textureWebMercator=o:t.texture=o,t.image=void 0,t.state=$n.TEXTURE_LOADED};function zge(e,t,n){return`${e}:${t}:${n}`}Ci.prototype._finalizeReprojectTexture=function(e,t){let n=this.minificationFilter,i=this.magnificationFilter;if(n===qt.LINEAR&&i===pi.LINEAR&&!ot.isCompressedFormat(t.pixelFormat)&&W.isPowerOfTwo(t.width)&&W.isPowerOfTwo(t.height)){n=qt.LINEAR_MIPMAP_LINEAR;let r=Mt.maximumTextureFilterAnisotropy,s=Math.min(r,y(this._maximumAnisotropy,r)),a=zge(n,i,s),c=e.cache.imageryLayerMipmapSamplers;l(c)||(c={},e.cache.imageryLayerMipmapSamplers=c);let d=c[a];l(d)||(d=c[a]=new $t({wrapS:Vn.CLAMP_TO_EDGE,wrapT:Vn.CLAMP_TO_EDGE,minificationFilter:n,magnificationFilter:i,maximumAnisotropy:s})),t.generateMipmap(hf.NICEST),t.sampler=d}else{let r=zge(n,i,0),s=e.cache.imageryLayerNonMipmapSamplers;l(s)||(s={},e.cache.imageryLayerNonMipmapSamplers=s);let a=s[r];l(a)||(a=s[r]=new $t({wrapS:Vn.CLAMP_TO_EDGE,wrapT:Vn.CLAMP_TO_EDGE,minificationFilter:n,magnificationFilter:i})),t.sampler=a}};Ci.prototype._reprojectTexture=function(e,t,n){let i=t.textureWebMercator||t.texture,o=t.rectangle,r=e.context;if(n=y(n,!0),n&&!(this._imageryProvider.tilingScheme.projection instanceof Ii)&&o.width/i.width>1e-5){let s=this;t.addReference();let a=new $c({persists:!0,owner:this,preExecute:function(c){ect(c,r,i,t.rectangle)},postExecute:function(c){t.texture=c,s._finalizeReprojectTexture(r,c),t.state=$n.READY,t.releaseReference()},canceled:function(){t.state=$n.TEXTURE_LOADED,t.releaseReference()}});this._reprojectComputeCommands.push(a)}else n&&(t.texture=i),this._finalizeReprojectTexture(r,i),t.state=$n.READY};Ci.prototype.queueReprojectionCommands=function(e){let t=this._reprojectComputeCommands,n=t.length;for(let i=0;i<n;++i)e.commandList.push(t[i]);t.length=0};Ci.prototype.cancelReprojections=function(){this._reprojectComputeCommands.forEach(function(e){l(e.canceled)&&e.canceled()}),this._reprojectComputeCommands.length=0};Ci.prototype.getImageryFromCache=function(e,t,n,i){let o=Qge(e,t,n),r=this._imageryCache[o];return l(r)||(r=new sL(this,e,t,n,i),this._imageryCache[o]=r),r.addReference(),r};Ci.prototype.removeImageryFromCache=function(e){this._marsOptions.onRemoveTile&&this._marsOptions.onRemoveTile(e);let t=Qge(e.x,e.y,e.level);delete this._imageryCache[t]};function Qge(e,t,n){return JSON.stringify([e,t,n])}var QD={u_textureDimensions:function(){return this.textureDimensions},u_texture:function(){return this.texture},textureDimensions:new D,texture:void 0},$at=Ot.supportsTypedArrays()?new Float32Array(2*64):void 0;function ect(e,t,n,i){let o=t.cache.imageryLayer_reproject;if(!l(o)){o=t.cache.imageryLayer_reproject={vertexArray:void 0,shaderProgram:void 0,sampler:void 0,destroy:function(){l(this.framebuffer)&&this.framebuffer.destroy(),l(this.vertexArray)&&this.vertexArray.destroy(),l(this.shaderProgram)&&this.shaderProgram.destroy()}};let _=new Float32Array(2*64*2),C=0;for(let I=0;I<64;++I){let v=I/63;_[C++]=0,_[C++]=v,_[C++]=1,_[C++]=v}let V={position:0,webMercatorT:1},L=ss.getRegularGridIndices(2,64),R=St.createIndexBuffer({context:t,typedArray:L,usage:ke.STATIC_DRAW,indexDatatype:Me.UNSIGNED_SHORT});o.vertexArray=new oi({context:t,attributes:[{index:V.position,vertexBuffer:St.createVertexBuffer({context:t,typedArray:_,usage:ke.STATIC_DRAW}),componentsPerAttribute:2},{index:V.webMercatorT,vertexBuffer:St.createVertexBuffer({context:t,sizeInBytes:64*2*4,usage:ke.STREAM_DRAW}),componentsPerAttribute:1}],indexBuffer:R});let G=new De({sources:[qw]});o.shaderProgram=en.fromCache({context:t,vertexShaderSource:G,fragmentShaderSource:jw,attributeLocations:V}),o.sampler=new $t({wrapS:Vn.CLAMP_TO_EDGE,wrapT:Vn.CLAMP_TO_EDGE,minificationFilter:qt.LINEAR,magnificationFilter:pi.LINEAR})}n.sampler=o.sampler;let r=n.width,s=n.height;QD.textureDimensions.x=r,QD.textureDimensions.y=s,QD.texture=n;let a=Math.sin(i.south),c=.5*Math.log((1+a)/(1-a));a=Math.sin(i.north);let u=1/(.5*Math.log((1+a)/(1-a))-c),h=new Wt({context:t,width:r,height:s,pixelFormat:n.pixelFormat,pixelDatatype:n.pixelDatatype,preMultiplyAlpha:n.preMultiplyAlpha});W.isPowerOfTwo(r)&&W.isPowerOfTwo(s)&&h.generateMipmap(hf.NICEST);let p=i.south,g=i.north,f=$at,x=0;for(let _=0;_<64;++_){let C=_/63,V=W.lerp(p,g,C);a=Math.sin(V);let R=(.5*Math.log((1+a)/(1-a))-c)*u;f[x++]=R,f[x++]=R}o.vertexArray.getAttribute(1).vertexBuffer.copyFromArrayView(f),e.shaderProgram=o.shaderProgram,e.outputTexture=h,e.uniformMap=QD,e.vertexArray=o.vertexArray}function tct(e,t,n){let i=e._imageryProvider,o=i.tilingScheme,r=o.ellipsoid,s=e._imageryProvider.tilingScheme.projection instanceof Ii?1:Math.cos(n),a=o.rectangle,d=r.maximumRadius*a.width*s/(i.tileWidth*o.getNumberOfXTilesAtLevel(0))/t,u=Math.log(d)/Math.log(2);return Math.round(u)|0}function nct(e,t){e.numberOfListeners>0?e.raiseEvent(t):console.error(t)}async function ict(e,t){let n;try{if(n=await Promise.resolve(t),e.isDestroyed())return;e._imageryProvider=n,e._readyEvent.raiseEvent(n)}catch(i){nct(e._errorEvent,i)}}var Ja=Ci;var _Gi=T(S(),1);var QZi=T(S(),1),oct={WEST:0,NORTH:1,EAST:2,SOUTH:3,NORTHWEST:4,NORTHEAST:5,SOUTHWEST:6,SOUTHEAST:7},yn=oct;var qZi=T(S(),1),jge={NONE:0,CULLED:1,RENDERED:2,REFINED:3,RENDERED_AND_KICKED:6,REFINED_AND_KICKED:7,CULLED_BUT_NEEDED:9,wasKicked:function(e){return e>=jge.RENDERED_AND_KICKED},originalResult:function(e){return e&3},kick:function(e){return e|4}},jn=jge;function lL(e){this.tile=e,this.frameLastUpdated=void 0,this.westMeshes=[],this.westTiles=[],this.southMeshes=[],this.southTiles=[],this.eastMeshes=[],this.eastTiles=[],this.northMeshes=[],this.northTiles=[],this.southwestMesh=void 0,this.southwestTile=void 0,this.southeastMesh=void 0,this.southeastTile=void 0,this.northwestMesh=void 0,this.northwestTile=void 0,this.northeastMesh=void 0,this.northeastTile=void 0,this.changedThisFrame=!0,this.visitedFrame=void 0,this.enqueuedFrame=void 0,this.mesh=void 0,this.vertexArray=void 0,this.waterMaskTexture=void 0,this.waterMaskTranslationAndScale=new re}lL.prototype.update=function(e,t,n){this.changedThisFrame&&(oye(e,t,this.tile,n),this.changedThisFrame=!1)};lL.prototype.destroy=function(e){this._destroyVertexArray(e),l(this.waterMaskTexture)&&(--this.waterMaskTexture.referenceCount,this.waterMaskTexture.referenceCount===0&&this.waterMaskTexture.destroy(),this.waterMaskTexture=void 0)};lL.prototype._destroyVertexArray=function(e){l(this.vertexArray)&&(l(e)?e.push(this.vertexArray):hm._freeVertexArray(this.vertexArray),this.vertexArray=void 0)};var rct=new Lg;lL.updateFillTiles=function(e,t,n,i){let o=e._quadtree,r=o._levelZeroTiles,s=o._lastSelectionFrameNumber,a=rct;a.clear();for(let d=0;d<t.length;++d){let u=t[d];l(u.data.vertexArray)&&a.enqueue(t[d])}let c=a.dequeue();for(;c!==void 0;){let d=c.findTileToWest(r),u=c.findTileToSouth(r),h=c.findTileToEast(r),p=c.findTileToNorth(r);As(e,n,c,d,s,yn.EAST,!1,a,i),As(e,n,c,u,s,yn.NORTH,!1,a,i),As(e,n,c,h,s,yn.WEST,!1,a,i),As(e,n,c,p,s,yn.SOUTH,!1,a,i);let g=d.findTileToNorth(r),f=d.findTileToSouth(r),x=h.findTileToNorth(r),_=h.findTileToSouth(r);As(e,n,c,g,s,yn.SOUTHEAST,!1,a,i),As(e,n,c,x,s,yn.SOUTHWEST,!1,a,i),As(e,n,c,f,s,yn.NORTHEAST,!1,a,i),As(e,n,c,_,s,yn.NORTHWEST,!1,a,i),c=a.dequeue()}};function As(e,t,n,i,o,r,s,a,c){if(i===void 0)return;let d=i;for(;d&&(d._lastSelectionResultFrame!==o||jn.wasKicked(d._lastSelectionResult)||jn.originalResult(d._lastSelectionResult)===jn.CULLED);){if(s)return;let u=d.parent;if(r>=yn.NORTHWEST&&u!==void 0)switch(r){case yn.NORTHWEST:d=d===u.northwestChild?u:void 0;break;case yn.NORTHEAST:d=d===u.northeastChild?u:void 0;break;case yn.SOUTHWEST:d=d===u.southwestChild?u:void 0;break;case yn.SOUTHEAST:d=d===u.southeastChild?u:void 0;break}else d=u}if(d!==void 0){if(d._lastSelectionResult===jn.RENDERED){if(l(d.data.vertexArray))return;sct(e,t,n,d,r,o,a,c);return}if(jn.originalResult(i._lastSelectionResult)!==jn.CULLED)switch(r){case yn.WEST:As(e,t,n,i.northwestChild,o,r,!0,a,c),As(e,t,n,i.southwestChild,o,r,!0,a,c);break;case yn.EAST:As(e,t,n,i.southeastChild,o,r,!0,a,c),As(e,t,n,i.northeastChild,o,r,!0,a,c);break;case yn.SOUTH:As(e,t,n,i.southwestChild,o,r,!0,a,c),As(e,t,n,i.southeastChild,o,r,!0,a,c);break;case yn.NORTH:As(e,t,n,i.northeastChild,o,r,!0,a,c),As(e,t,n,i.northwestChild,o,r,!0,a,c);break;case yn.NORTHWEST:As(e,t,n,i.northwestChild,o,r,!0,a,c);break;case yn.NORTHEAST:As(e,t,n,i.northeastChild,o,r,!0,a,c);break;case yn.SOUTHWEST:As(e,t,n,i.southwestChild,o,r,!0,a,c);break;case yn.SOUTHEAST:As(e,t,n,i.southeastChild,o,r,!0,a,c);break;default:throw new fe("Invalid edge")}}}function sct(e,t,n,i,o,r,s,a){let c=i.data;if(c.fill===void 0)c.fill=new lL(i);else if(c.fill.visitedFrame===r)return;c.fill.enqueuedFrame!==r&&(c.fill.enqueuedFrame=r,c.fill.changedThisFrame=!1,s.enqueue(i)),act(e,t,n,i,o,a)}function act(e,t,n,i,o,r){let s=i.data.fill,a,c=n.data.fill;l(c)?(c.visitedFrame=t.frameNumber,c.changedThisFrame&&(oye(e,t,n,r),c.changedThisFrame=!1),a=n.data.fill.mesh):a=n.data.mesh;let d,u;switch(o){case yn.WEST:d=s.westMeshes,u=s.westTiles;break;case yn.SOUTH:d=s.southMeshes,u=s.southTiles;break;case yn.EAST:d=s.eastMeshes,u=s.eastTiles;break;case yn.NORTH:d=s.northMeshes,u=s.northTiles;break;case yn.NORTHWEST:s.changedThisFrame=s.changedThisFrame||s.northwestMesh!==a,s.northwestMesh=a,s.northwestTile=n;return;case yn.NORTHEAST:s.changedThisFrame=s.changedThisFrame||s.northeastMesh!==a,s.northeastMesh=a,s.northeastTile=n;return;case yn.SOUTHWEST:s.changedThisFrame=s.changedThisFrame||s.southwestMesh!==a,s.southwestMesh=a,s.southwestTile=n;return;case yn.SOUTHEAST:s.changedThisFrame=s.changedThisFrame||s.southeastMesh!==a,s.southeastMesh=a,s.southeastTile=n;return}if(n.level<=i.level){s.changedThisFrame=s.changedThisFrame||d[0]!==a||d.length!==1,d[0]=a,u[0]=n,d.length=1,u.length=1;return}let h,p,g,f,x=n.rectangle,_,C=i.rectangle;switch(o){case yn.WEST:for(_=(C.north-C.south)*W.EPSILON5,h=0;h<u.length&&(g=u[h],f=g.rectangle,!W.greaterThan(x.north,f.south,_));++h);for(p=h;p<u.length&&(g=u[p],f=g.rectangle,!W.greaterThanOrEquals(x.south,f.north,_));++p);break;case yn.SOUTH:for(_=(C.east-C.west)*W.EPSILON5,h=0;h<u.length&&(g=u[h],f=g.rectangle,!W.lessThan(x.west,f.east,_));++h);for(p=h;p<u.length&&(g=u[p],f=g.rectangle,!W.lessThanOrEquals(x.east,f.west,_));++p);break;case yn.EAST:for(_=(C.north-C.south)*W.EPSILON5,h=0;h<u.length&&(g=u[h],f=g.rectangle,!W.lessThan(x.south,f.north,_));++h);for(p=h;p<u.length&&(g=u[p],f=g.rectangle,!W.lessThanOrEquals(x.north,f.south,_));++p);break;case yn.NORTH:for(_=(C.east-C.west)*W.EPSILON5,h=0;h<u.length&&(g=u[h],f=g.rectangle,!W.greaterThan(x.east,f.west,_));++h);for(p=h;p<u.length&&(g=u[p],f=g.rectangle,!W.greaterThanOrEquals(x.west,f.east,_));++p);break}p-h===1?(s.changedThisFrame=s.changedThisFrame||d[h]!==a,d[h]=a,u[h]=n):(s.changedThisFrame=!0,d.splice(h,p-h,a),u.splice(h,p-h,n))}var JT=new he,cct=new he,cL=new m,Sj=new m,xj=new D,_j=new D,eu=new D;function i3(){this.height=0,this.encodedNormal=new D}function jD(e,t,n,i,o,r,s,a,c){if(l(o))return o;let d;if(l(r)&&l(s))d=(r.height+s.height)*.5;else if(l(r))d=r.height;else if(l(s))d=s.height;else if(l(a))d=a.height;else{let h=e.tile.data.tileBoundingRegion,p=0,g=0;l(h)&&(p=h.minimumHeight,g=h.maximumHeight),d=(p+g)*.5}return rye(e,t,n,i,d,c),c}var lct={minimumHeight:0,maximumHeight:0},dct=new m,qge=new i3,$ge=new i3,eye=new i3,tye=new i3,uct=typeof Uint8Array<"u"?new Uint8Array(9*9):void 0,mct={tilingScheme:void 0,x:0,y:0,level:0,exaggeration:1,exaggerationRelativeHeight:0};function oye(e,t,n,i){hm.initialize(n,e.terrainProvider,e._imageryLayers);let o=n.data,r=o.fill,s=n.rectangle,a=t.verticalExaggeration,c=t.verticalExaggerationRelativeHeight,d=a!==1,u=n.tilingScheme.ellipsoid,h=$D(r,u,0,1,r.northwestTile,r.northwestMesh,r.northTiles,r.northMeshes,r.westTiles,r.westMeshes,eye),p=$D(r,u,0,0,r.southwestTile,r.southwestMesh,r.westTiles,r.westMeshes,r.southTiles,r.southMeshes,qge),g=$D(r,u,1,0,r.southeastTile,r.southeastMesh,r.southTiles,r.southMeshes,r.eastTiles,r.eastMeshes,$ge),f=$D(r,u,1,1,r.northeastTile,r.northeastMesh,r.eastTiles,r.eastMeshes,r.northTiles,r.northMeshes,tye);h=jD(r,u,0,1,h,p,f,g,eye),p=jD(r,u,0,0,p,h,g,f,qge),g=jD(r,u,1,1,g,p,f,h,$ge),f=jD(r,u,1,1,f,g,h,p,tye);let x=p.height,_=g.height,C=h.height,V=f.height,L=Math.min(x,_,C,V),R=Math.max(x,_,C,V),G=(L+R)*.5,I,v,P=e.getLevelMaximumGeometricError(n.level),w=u.maximumRadius-P,A=Math.acos(w/u.maximumRadius)*4;if(A*=1.5,s.width>A&&R-L<=P){let E=new za({width:9,height:9,buffer:uct,structure:{heightOffset:R}}),X=mct;X.tilingScheme=n.tilingScheme,X.x=n.x,X.y=n.y,X.level=n.level,X.exaggeration=a,X.exaggerationRelativeHeight=c,r.mesh=E._createMeshSync(X)}else{let E=d,X=le.center(s,cct);X.height=G;let F=u.cartographicToCartesian(X,dct),N=new Rc(F,void 0,void 0,void 0,void 0,!0,!0,E,a,c),O=5,U;for(U=r.westMeshes,I=0,v=U.length;I<v;++I)O+=U[I].eastIndicesNorthToSouth.length;for(U=r.southMeshes,I=0,v=U.length;I<v;++I)O+=U[I].northIndicesWestToEast.length;for(U=r.eastMeshes,I=0,v=U.length;I<v;++I)O+=U[I].westIndicesSouthToNorth.length;for(U=r.northMeshes,I=0,v=U.length;I<v;++I)O+=U[I].southIndicesEastToWest.length;let Y=lct;Y.minimumHeight=L,Y.maximumHeight=R;let k=N.stride,H=new Float32Array(O*k),K=0,te=K;K=qD(u,s,N,H,K,0,1,h.height,h.encodedNormal,1,Y),K=t3(r,u,N,H,K,r.westTiles,r.westMeshes,yn.EAST,Y);let z=K;K=qD(u,s,N,H,K,0,0,p.height,p.encodedNormal,0,Y),K=t3(r,u,N,H,K,r.southTiles,r.southMeshes,yn.NORTH,Y);let j=K;K=qD(u,s,N,H,K,1,0,g.height,g.encodedNormal,0,Y),K=t3(r,u,N,H,K,r.eastTiles,r.eastMeshes,yn.WEST,Y);let ee=K;K=qD(u,s,N,H,K,1,1,f.height,f.encodedNormal,1,Y),K=t3(r,u,N,H,K,r.northTiles,r.northMeshes,yn.SOUTH,Y),L=Y.minimumHeight,R=Y.maximumHeight;let pe=Gn.fromRectangle(s,L,R,n.tilingScheme.ellipsoid),_e=Wi.geodeticLatitudeToMercatorAngle(s.south),ae=1/(Wi.geodeticLatitudeToMercatorAngle(s.north)-_e),ye=(Wi.geodeticLatitudeToMercatorAngle(X.latitude)-_e)*ae,Se=u.geodeticSurfaceNormalCartographic(JT,Sj),Ee=Mn.octEncode(Se,xj),Ie=K;N.encode(H,K*k,pe.center,D.fromElements(.5,.5,eu),G,Ee,ye,Se),++K;let we=K,ve=we<256?1:2,at=(we-1)*3,Je=at*ve,pt=(H.length-we*k)*Float32Array.BYTES_PER_ELEMENT,Qe;if(pt>=Je){let Ce=we*k*Float32Array.BYTES_PER_ELEMENT;Qe=we<256?new Uint8Array(H.buffer,Ce,at):new Uint16Array(H.buffer,Ce,at)}else Qe=we<256?new Uint8Array(at):new Uint16Array(at);H=new Float32Array(H.buffer,0,we*k);let _t=0;for(I=0;I<we-2;++I)Qe[_t++]=Ie,Qe[_t++]=I,Qe[_t++]=I+1;Qe[_t++]=Ie,Qe[_t++]=I,Qe[_t++]=0;let ht=[];for(I=z;I>=te;--I)ht.push(I);let bt=[];for(I=j;I>=z;--I)bt.push(I);let En=[];for(I=ee;I>=j;--I)En.push(I);let sn=[];for(sn.push(0),I=Ie-1;I>=ee;--I)sn.push(I);r.mesh=new mm(N.center,H,Qe,at,we,L,R,de.fromOrientedBoundingBox(pe),xct(e,pe.center,s,L,R),N.stride,pe,N,ht,bt,En,sn)}let b=t.context;r._destroyVertexArray(i),r.vertexArray=hm._createVertexArrayForMesh(b,r.mesh),o.processImagery(n,e.terrainProvider,t,!0);let Z=r.waterMaskTexture;if(r.waterMaskTexture=void 0,e.terrainProvider.hasWaterMask){let E=o._findAncestorTileWithTerrainData(n);l(E)&&l(E.data.waterMaskTexture)&&(r.waterMaskTexture=E.data.waterMaskTexture,++r.waterMaskTexture.referenceCount,o._computeWaterMaskTranslationAndScale(n,E,r.waterMaskTranslationAndScale))}l(Z)&&(--Z.referenceCount,Z.referenceCount===0&&Z.destroy())}function qD(e,t,n,i,o,r,s,a,c,d,u){let h=JT;h.longitude=W.lerp(t.west,t.east,r),h.latitude=W.lerp(t.south,t.north,s),h.height=a;let p=e.cartographicToCartesian(h,cL),g;n.hasGeodeticSurfaceNormals&&(g=e.geodeticSurfaceNormal(p,Sj));let f=_j;return f.x=r,f.y=s,n.encode(i,o*n.stride,p,f,a,c,d,g),u.minimumHeight=Math.min(u.minimumHeight,a),u.maximumHeight=Math.max(u.maximumHeight,a),o+1}var n3=new le;function $w(e,t,n,i){let o=e.rectangle,r=t.rectangle;t.x===0&&n.x===1&&e.x===e.tilingScheme.getNumberOfXTilesAtLevel(e.level)-1?(o=le.clone(e.rectangle,n3),o.west-=W.TWO_PI,o.east-=W.TWO_PI):e.x===0&&n.x===0&&t.x===t.tilingScheme.getNumberOfXTilesAtLevel(t.level)-1&&(o=le.clone(e.rectangle,n3),o.west+=W.TWO_PI,o.east+=W.TWO_PI);let s=o.east-o.west,a=(r.west-o.west)/s,c=(r.east-o.west)/s,d=o.north-o.south,u=(r.south-o.south)/d,h=(r.north-o.south)/d,p=(n.x-a)/(c-a),g=(n.y-u)/(h-u);return Math.abs(p)<Math.EPSILON5?p=0:Math.abs(p-1)<Math.EPSILON5&&(p=1),Math.abs(g)<Math.EPSILON5?g=0:Math.abs(g-1)<Math.EPSILON5&&(g=1),i.x=p,i.y=g,i}var hct=new D;function Tj(e,t,n,i,o){let r=e.encoding,s=e.vertices;if(o.height=r.decodeHeight(s,t),r.hasVertexNormals)r.getOctEncodedNormal(s,t,o.encodedNormal);else{let a=o.encodedNormal;a.x=0,a.y=0}}var fct=new D,pct=new m;function bct(e,t,n,i,o,r,s,a,c,d){let u=i.encoding,h=i.vertices,p=$w(t,n,u.decodeTextureCoordinates(h,o,eu),eu),g=$w(t,n,u.decodeTextureCoordinates(h,r,_j),_j),f;c?f=(s-p.x)/(g.x-p.x):f=(a-p.y)/(g.y-p.y);let x=u.decodeHeight(h,o),_=u.decodeHeight(h,r),C=n.rectangle;JT.longitude=W.lerp(C.west,C.east,s),JT.latitude=W.lerp(C.south,C.north,a),d.height=JT.height=W.lerp(x,_,f);let V;if(u.hasVertexNormals){let L=u.getOctEncodedNormal(h,o,hct),R=u.getOctEncodedNormal(h,r,fct),G=Mn.octDecode(L.x,L.y,cL),I=Mn.octDecode(R.x,R.y,pct);V=m.lerp(G,I,f,cL),m.normalize(V,V),Mn.octEncode(V,d.encodedNormal)}else V=e.geodeticSurfaceNormalCartographic(JT,cL),Mn.octEncode(V,d.encodedNormal)}function rye(e,t,n,i,o,r){r.height=o;let s=t.geodeticSurfaceNormalCartographic(JT,cL);Mn.octEncode(s,r.encodedNormal)}function $D(e,t,n,i,o,r,s,a,c,d,u){if(iye(e,t,a,s,!1,n,i,u)||iye(e,t,d,c,!0,n,i,u))return u;let p;if(Cj(o,r))return n===0?i===0?p=r.eastIndicesNorthToSouth[0]:p=r.southIndicesEastToWest[0]:i===0?p=r.northIndicesWestToEast[0]:p=r.westIndicesSouthToNorth[0],Tj(r,p,n,i,u),u;let g;if(n===0?i===0?g=e3(e.westMeshes,e.westTiles,yn.EAST,e.southMeshes,e.southTiles,yn.NORTH,n,i):g=e3(e.northMeshes,e.northTiles,yn.SOUTH,e.westMeshes,e.westTiles,yn.EAST,n,i):i===0?g=e3(e.southMeshes,e.southTiles,yn.NORTH,e.eastMeshes,e.eastTiles,yn.WEST,n,i):g=e3(e.eastMeshes,e.eastTiles,yn.WEST,e.northMeshes,e.northTiles,yn.SOUTH,n,i),l(g))return rye(e,t,n,i,g,u),u}function e3(e,t,n,i,o,r,s,a){let c=nye(e,t,!1,n,s,a),d=nye(i,o,!0,r,s,a);return l(c)&&l(d)?(c+d)*.5:l(c)?c:d}function t3(e,t,n,i,o,r,s,a,c){for(let d=0;d<r.length;++d)o=gct(e,t,n,i,o,r[d],s[d],a,c);return o}function gct(e,t,n,i,o,r,s,a,c){let d=r.rectangle;a===yn.EAST&&e.tile.x===0?(d=le.clone(r.rectangle,n3),d.west-=W.TWO_PI,d.east-=W.TWO_PI):a===yn.WEST&&r.x===0&&(d=le.clone(r.rectangle,n3),d.west+=W.TWO_PI,d.east+=W.TWO_PI);let u=e.tile.rectangle,h,p;o>0&&(n.decodeTextureCoordinates(i,o-1,eu),h=eu.x,p=eu.y);let g,f;switch(a){case yn.WEST:g=s.westIndicesSouthToNorth,f=!1;break;case yn.NORTH:g=s.northIndicesWestToEast,f=!0;break;case yn.EAST:g=s.eastIndicesNorthToSouth,f=!1;break;case yn.SOUTH:g=s.southIndicesEastToWest,f=!0;break}let x=r,_=e.tile,C=s.encoding,V=s.vertices,L=n.stride,R,G;C.hasWebMercatorT&&(R=Wi.geodeticLatitudeToMercatorAngle(u.south),G=1/(Wi.geodeticLatitudeToMercatorAngle(u.north)-R));for(let I=0;I<g.length;++I){let v=g[I],P=C.decodeTextureCoordinates(V,v,eu);$w(x,_,P,P);let w=P.x,A=P.y,b=f?w:A;if(b<0||b>1||Math.abs(w-h)<W.EPSILON5&&Math.abs(A-p)<W.EPSILON5)continue;let Z=Math.abs(w)<W.EPSILON5||Math.abs(w-1)<W.EPSILON5,E=Math.abs(A)<W.EPSILON5||Math.abs(A-1)<W.EPSILON5;if(Z&&E)continue;let X=C.decodePosition(V,v,cL),F=C.decodeHeight(V,v),N;C.hasVertexNormals?N=C.getOctEncodedNormal(V,v,xj):(N=xj,N.x=0,N.y=0);let O=A;if(C.hasWebMercatorT){let Y=W.lerp(u.south,u.north,A);O=(Wi.geodeticLatitudeToMercatorAngle(Y)-R)*G}let U;n.hasGeodeticSurfaceNormals&&(U=t.geodeticSurfaceNormal(X,Sj)),n.encode(i,o*L,X,P,F,N,O,U),c.minimumHeight=Math.min(c.minimumHeight,F),c.maximumHeight=Math.max(c.maximumHeight,F),++o}return o}function nye(e,t,n,i,o,r){let s,a,c;n?(s=0,a=e.length,c=1):(s=e.length-1,a=-1,c=-1);for(let d=s;d!==a;d+=c){let u=e[d],h=t[d];if(!Cj(h,u))continue;let p;switch(i){case yn.WEST:p=u.westIndicesSouthToNorth;break;case yn.SOUTH:p=u.southIndicesEastToWest;break;case yn.EAST:p=u.eastIndicesNorthToSouth;break;case yn.NORTH:p=u.northIndicesWestToEast;break}let g=p[n?0:p.length-1];if(l(g))return u.encoding.decodeHeight(u.vertices,g)}}function Cj(e,t){return l(t)&&(!l(e.data.fill)||!e.data.fill.changedThisFrame)}function iye(e,t,n,i,o,r,s,a){let c,d,u,h,p,g=i[o?0:n.length-1],f=n[o?0:n.length-1];if(Cj(g,f)&&(r===0?s===0?(c=o?f.northIndicesWestToEast:f.eastIndicesNorthToSouth,d=o,u=o):(c=o?f.eastIndicesNorthToSouth:f.southIndicesEastToWest,d=!o,u=!1):s===0?(c=o?f.westIndicesSouthToNorth:f.northIndicesWestToEast,d=!o,u=!0):(c=o?f.southIndicesEastToWest:f.westIndicesSouthToNorth,d=o,u=!o),c.length>0)){h=o?0:c.length-1,p=c[h],f.encoding.decodeTextureCoordinates(f.vertices,p,eu);let x=$w(g,e.tile,eu,eu);if(x.x===r&&x.y===s)return Tj(f,p,r,s,a),!0;if(h=Po(c,d?r:s,function(_,C){f.encoding.decodeTextureCoordinates(f.vertices,_,eu);let V=$w(g,e.tile,eu,eu);return u?d?V.x-r:V.y-s:d?r-V.x:s-V.y}),h<0){if(h=~h,h>0&&h<c.length)return bct(t,g,e.tile,f,c[h-1],c[h],r,s,d,a),!0}else return Tj(f,c[h],r,s,a),!0}return!1}var yct=[new m,new m,new m,new m];function xct(e,t,n,i,o,r){let s=e.quadtree._occluders.ellipsoid,a=s.ellipsoid,c=yct;return m.fromRadians(n.west,n.south,o,a,c[0]),m.fromRadians(n.east,n.south,o,a,c[1]),m.fromRadians(n.west,n.north,o,a,c[2]),m.fromRadians(n.east,n.north,o,a,c[3]),s.computeHorizonCullingPointPossiblyUnderEllipsoid(t,c,i,r)}var dL=lL;function cr(e){this.lightingFadeOutDistance=65e5,this.lightingFadeInDistance=9e6,this.hasWaterMask=!1,this.showWaterEffect=!1,this.oceanNormalMap=void 0,this.zoomedOutOceanSpecularIntensity=.5,this.enableLighting=!1,this.dynamicAtmosphereLighting=!1,this.dynamicAtmosphereLightingFromSun=!1,this.showGroundAtmosphere=!1,this.shadows=_n.RECEIVE_ONLY,this.vertexShadowDarkness=.3,this.fillHighlightColor=void 0,this.hueShift=0,this.saturationShift=0,this.brightnessShift=0,this.showSkirts=!0,this.backFaceCulling=!0,this.undergroundColor=void 0,this.undergroundColorAlphaByDistance=void 0,this.lambertDiffuseMultiplier=0,this.materialUniformMap=void 0,this._materialUniformMap=void 0,this._quadtree=void 0,this._terrainProvider=e.terrainProvider,this._imageryLayers=e.imageryLayers,this._surfaceShaderSet=e.surfaceShaderSet,this._renderState=void 0,this._blendRenderState=void 0,this._disableCullingRenderState=void 0,this._disableCullingBlendRenderState=void 0,this._errorEvent=new be,this._removeLayerAddedListener=this._imageryLayers.layerAdded.addEventListener(cr.prototype._onLayerAdded,this),this._removeLayerRemovedListener=this._imageryLayers.layerRemoved.addEventListener(cr.prototype._onLayerRemoved,this),this._removeLayerMovedListener=this._imageryLayers.layerMoved.addEventListener(cr.prototype._onLayerMoved,this),this._removeLayerShownListener=this._imageryLayers.layerShownOrHidden.addEventListener(cr.prototype._onLayerShownOrHidden,this),this._imageryLayersUpdatedEvent=new be,this._layerOrderChanged=!1,this._tilesToRenderByTextureCount=[],this._drawCommands=[],this._uniformMaps=[],this._usedDrawCommands=0,this._vertexArraysToDestroy=[],this._debug={wireframe:!1,boundingSphereTile:void 0},this._baseColor=void 0,this._firstPassInitialColor=void 0,this.baseColor=new B(0,0,.5,1),this._clippingPlanes=void 0,this._clippingPolygons=void 0,this.cartographicLimitRectangle=le.clone(le.MAX_VALUE),this._hasLoadedTilesThisFrame=!1,this._hasFillTilesThisFrame=!1,this._oldVerticalExaggeration=void 0,this._oldVerticalExaggerationRelativeHeight=void 0,this._initByMars3D&&this._initByMars3D(e)}Object.defineProperties(cr.prototype,{baseColor:{get:function(){return this._baseColor},set:function(e){this._baseColor=e,this._firstPassInitialColor=re.fromColor(e,this._firstPassInitialColor)}},quadtree:{get:function(){return this._quadtree},set:function(e){this._quadtree=e}},tilingScheme:{get:function(){if(l(this._terrainProvider))return this._terrainProvider.tilingScheme}},errorEvent:{get:function(){return this._errorEvent}},imageryLayersUpdatedEvent:{get:function(){return this._imageryLayersUpdatedEvent}},terrainProvider:{get:function(){return this._terrainProvider},set:function(e){this._terrainProvider!==e&&(this._terrainProvider=e,l(this._quadtree)&&this._quadtree.invalidateAllTiles())}},clippingPlanes:{get:function(){return this._clippingPlanes},set:function(e){bs.setOwner(e,this,"_clippingPlanes")}},clippingPolygons:{get:function(){return this._clippingPolygons},set:function(e){eh.setOwner(e,this,"_clippingPolygons")}}});function _ct(e,t){let n=e.loadingImagery;l(n)||(n=e.readyImagery);let i=t.loadingImagery;return l(i)||(i=t.readyImagery),n.imageryLayer._layerIndex-i.imageryLayer._layerIndex}cr.prototype.update=function(e){this._imageryLayers._update()};function Tct(e,t){let n=t.creditDisplay,i=e._terrainProvider;l(i)&&l(i.credit)&&n.addCreditToNextFrame(i.credit);let o=e._imageryLayers;for(let r=0,s=o.length;r<s;++r){let a=o.get(r);a.ready&&a.show&&l(a.imageryProvider.credit)&&n.addCreditToNextFrame(a.imageryProvider.credit)}}cr.prototype.initialize=function(e){this._imageryLayers.queueReprojectionCommands(e),this._layerOrderChanged&&(this._layerOrderChanged=!1,this._quadtree.forEachLoadedTile(function(i){i.data.imagery.sort(_ct)})),Tct(this,e);let t=this._vertexArraysToDestroy,n=t.length;for(let i=0;i<n;++i)hm._freeVertexArray(t[i]);t.length=0};cr.prototype.beginUpdate=function(e){let t=this._tilesToRenderByTextureCount;for(let o=0,r=t.length;o<r;++o){let s=t[o];l(s)&&(s.length=0)}let n=this._clippingPlanes;l(n)&&n.enabled&&n.update(e);let i=this._clippingPolygons;l(i)&&i.enabled&&(i.update(e),i.queueCommands(e)),this._usedDrawCommands=0,this._hasLoadedTilesThisFrame=!1,this._hasFillTilesThisFrame=!1};cr.prototype.endUpdate=function(e){var s;if(!l(this._renderState)){this._renderState=Ue.fromCache({cull:{enabled:!0},depthTest:{enabled:!0,func:ac.LESS}}),this._blendRenderState=Ue.fromCache({cull:{enabled:!0},depthTest:{enabled:!0,func:ac.LESS_OR_EQUAL},blending:hn.ALPHA_BLEND});let a=Oe(this._renderState,!0);a.cull.enabled=!1,this._disableCullingRenderState=Ue.fromCache(a),a=Oe(this._blendRenderState,!0),a.cull.enabled=!1,this._disableCullingBlendRenderState=Ue.fromCache(a)}this._hasFillTilesThisFrame&&this._hasLoadedTilesThisFrame&&dL.updateFillTiles(this,this._quadtree._tilesToRender,e,this._vertexArraysToDestroy);let t=this.quadtree,n=e.verticalExaggeration,i=e.verticalExaggerationRelativeHeight,o=this._oldVerticalExaggeration!==n||this._oldVerticalExaggerationRelativeHeight!==i;this._oldVerticalExaggeration=n,this._oldVerticalExaggerationRelativeHeight=i,o&&t.forEachLoadedTile(function(a){a.data.updateExaggeration(a,e,t)});let r=this._tilesToRenderByTextureCount;for(let a=0,c=r.length;a<c;++a){let d=r[a];if(l(d))for(let u=0,h=d.length;u<h;++u){let p=d[u],g=p.data.tileBoundingRegion;dye(this,p,e,!1);let f=(s=this.marsOptions)==null?void 0:s.uplift;if(f&&f.enabled&&f.height!==0&&f.rectangles){for(let x=0;x<f.rectangles.length;x++)if(le.intersection(g.rectangle,f.rectangles[x])){dye(this,p,e,!0);break}}e.minimumTerrainHeight=Math.min(e.minimumTerrainHeight,g.minimumHeight)}}};function uye(e,t){let n=t.globeTranslucencyState;if(n.translucent){let i=e.renderState.blending.enabled;n.pushDerivedCommands(e,i,t)}else t.commandList.push(e)}cr.prototype.updateForPick=function(e){let t=this._drawCommands;for(let n=0,i=this._usedDrawCommands;n<i;++n)uye(t[n],e)};cr.prototype.cancelReprojections=function(){this._imageryLayers.cancelReprojections()};cr.prototype.getLevelMaximumGeometricError=function(e){return l(this._terrainProvider)?this._terrainProvider.getLevelMaximumGeometricError(e):0};cr.prototype.loadTile=function(e,t){let n=t.data,i=!0,o;l(n)&&(i=n.boundingVolumeSourceTile!==t||t._lastSelectionResult===jn.CULLED_BUT_NEEDED,o=n.terrainState),hm.processStateMachine(t,e,this.terrainProvider,this._imageryLayers,this.quadtree,this._vertexArraysToDestroy,i),n=t.data,i&&o!==t.data.terrainState&&this.computeTileVisibility(t,e,this.quadtree.occluders)!==gr.NONE&&n.boundingVolumeSourceTile===t&&(i=!1,hm.processStateMachine(t,e,this.terrainProvider,this._imageryLayers,this.quadtree,this._vertexArraysToDestroy,i))};var Sct=new de,mye=new le,Cct=new le,Vct=new he;function r3(e,t){if(t.west<t.east)return t;let n=le.clone(t,Cct);return le.center(e,Vct).longitude>0?n.east=W.PI:n.west=-W.PI,n}function hye(e,t){if(t.cameraUnderground||t.globeTranslucencyState.translucent)return!0;if(e.backFaceCulling)return!1;let n=e._clippingPlanes;if(l(n)&&n.enabled)return!0;let i=e._clippingPolygons;return!!(l(i)&&i.enabled||!le.equals(e.cartographicLimitRectangle,le.MAX_VALUE))}cr.prototype.computeTileVisibility=function(e,t,n){let i=this.computeDistanceToTile(e,t);e._distance=i;let o=hye(this,t);if(t.fog.enabled&&!o&&W.fog(i,t.fog.density)>=1)return gr.NONE;let r=e.data,s=r.tileBoundingRegion;if(r.boundingVolumeSourceTile===void 0)return gr.PARTIAL;let a=t.cullingVolume,c=s.boundingVolume;l(c)||(c=s.boundingSphere),r.clippedByBoundaries=!1;let d=r3(e.rectangle,this.cartographicLimitRectangle),u=le.simpleIntersection(d,e.rectangle,mye);if(!l(u))return gr.NONE;if(le.equals(u,e.rectangle)||(r.clippedByBoundaries=!0),t.mode!==oe.SCENE3D&&(c=Sct,de.fromRectangleWithHeights2D(e.rectangle,t.mapProjection,s.minimumHeight,s.maximumHeight,c),m.fromElements(c.center.z,c.center.x,c.center.y,c.center),t.mode===oe.MORPHING&&l(r.renderedMesh)&&(c=de.union(s.boundingSphere,c,c))),!l(c))return gr.PARTIAL;let h=this._clippingPlanes;if(l(h)&&h.enabled){let _=h.computeIntersectionWithBoundingVolume(c);if(e.isClipped=_!==zt.INSIDE,_===zt.OUTSIDE)return gr.NONE}let p=this._clippingPolygons;if(l(p)&&p.enabled){let _=p.computeIntersectionWithBoundingVolume(s);e.isClipped=_!==zt.OUTSIDE}let g,f=a.computeVisibility(c);if(f===zt.OUTSIDE?g=gr.NONE:f===zt.INTERSECTING?g=gr.PARTIAL:f===zt.INSIDE&&(g=gr.FULL),g===gr.NONE)return g;let x=t.mode===oe.SCENE3D&&t.camera.frustum instanceof ln;if(t.mode===oe.SCENE3D&&!x&&l(n)&&!o){let _=r.occludeePointInScaledSpace;return!l(_)||n.ellipsoid.isScaledSpacePointVisiblePossiblyUnderEllipsoid(_,s.minimumHeight)?g:gr.NONE}return g};cr.prototype.canRefine=function(e){return l(e.data.terrainData)?!0:this.terrainProvider.getTileDataAvailable(e.x*2,e.y*2,e.level+1)!==void 0};var Lct=[],Rct=[];cr.prototype.canRenderWithoutLosingDetail=function(e,t){let n=e.data,i=Lct;i.length=this._imageryLayers.length;let o=!1,r=!1,s;l(n)&&(o=n.terrainState===po.READY,r=!0,s=n.imagery);let a,c;for(a=0,c=i.length;a<c;++a)i[a]=r;if(l(s))for(a=0,c=s.length;a<c;++a){let h=s[a],p=h.loadingImagery,g=!l(p)||p.state===$n.FAILED||p.state===$n.INVALID,f=(h.loadingImagery||h.readyImagery).imageryLayer._layerIndex;i[f]=g&&i[f]}let d=this.quadtree._lastSelectionFrameNumber,u=Rct;for(u.length=0,u.push(e.southwestChild,e.southeastChild,e.northwestChild,e.northeastChild);u.length>0;){let h=u.pop(),p=h._lastSelectionResultFrame===d?h._lastSelectionResult:jn.NONE;if(p===jn.RENDERED){let g=h.data;if(!l(g))continue;if(!o&&h.data.terrainState===po.READY)return!1;let f=h.data.imagery;for(a=0,c=f.length;a<c;++a){let x=f[a],_=x.loadingImagery,C=!l(_)||_.state===$n.FAILED||_.state===$n.INVALID,V=(x.loadingImagery||x.readyImagery).imageryLayer._layerIndex;if(C&&!i[V])return!1}}else p===jn.REFINED&&u.push(h.southwestChild,h.southeastChild,h.northwestChild,h.northeastChild)}return!0};var Zct=new m;cr.prototype.computeTileLoadPriority=function(e,t){let n=e.data;if(n===void 0)return 0;let i=n.tileBoundingRegion.boundingVolume;if(i===void 0)return 0;let o=t.camera.positionWC,r=t.camera.directionWC,s=m.subtract(i.center,o,Zct),a=m.magnitude(s);return a<W.EPSILON5?0:(m.divideByScalar(s,a,s),(1-m.dot(s,r))*e._distance)};var sye=new M,o3=new M,Gct=new re,Ect=new re,Ict=new re,Xct=new m,aye=new m,Wct=new m,Pct=new m;cr.prototype.showTileThisFrame=function(e,t){let n=0,i=e.data.imagery;for(let a=0,c=i.length;a<c;++a){let d=i[a];l(d.readyImagery)&&d.readyImagery.imageryLayer.alpha!==0&&++n}let o=this._tilesToRenderByTextureCount[n];l(o)||(o=[],this._tilesToRenderByTextureCount[n]=o),o.push(e);let r=e.data;l(r.vertexArray)?this._hasLoadedTilesThisFrame=!0:this._hasFillTilesThisFrame=!0;let s=this._debug;++s.tilesRendered,s.texturesRendered+=n};var vct=[new m,new m,new m,new m];function cye(e,t,n,i,o,r){let s=e.quadtree._occluders.ellipsoid,a=s.ellipsoid,c=vct;return m.fromRadians(n.west,n.south,o,a,c[0]),m.fromRadians(n.east,n.south,o,a,c[1]),m.fromRadians(n.west,n.north,o,a,c[2]),m.fromRadians(n.east,n.north,o,a,c[3]),s.computeHorizonCullingPointPossiblyUnderEllipsoid(t,c,i,r)}cr.prototype.computeDistanceToTile=function(e,t){wct(e,this,t);let n=e.data;if(n.boundingVolumeSourceTile===void 0)return 9999999999;let o=n.tileBoundingRegion,r=o.minimumHeight,s=o.maximumHeight;if(n.boundingVolumeSourceTile!==e){let c=t.camera.positionCartographic.height,d=Math.abs(c-r),u=Math.abs(c-s);d>u?(o.minimumHeight=r,o.maximumHeight=r):(o.minimumHeight=s,o.maximumHeight=s)}let a=o.distanceToCamera(t);return o.minimumHeight=r,o.maximumHeight=s,a};function wct(e,t,n){var _,C,V;let i=e.data;i===void 0&&(i=e.data=new hm);let o=e.tilingScheme.ellipsoid;i.tileBoundingRegion===void 0&&(i.tileBoundingRegion=new Xd({computeBoundingVolumes:!1,rectangle:e.rectangle,ellipsoid:o,minimumHeight:0,maximumHeight:0}));let r=i.tileBoundingRegion,s=r.minimumHeight,a=r.maximumHeight,c=!1,d=e,u=0,h=(_=t.marsOptions)==null?void 0:_.flat;if(h&&h.enabled&&h.rectangles){for(let L=0;L<h.rectangles.length;L++)if(le.intersection(e.rectangle,h.rectangles[L])){u=(C=h.rectangles[L]._flatHeight)!=null?C:h.heights[L];break}}let p=(V=t.marsOptions)==null?void 0:V.uplift,g=0;if(p&&p.enabled&&p.height!==0&&p.rectangles){for(let L=0;L<p.rectangles.length;L++)if(le.intersection(r.rectangle,p.rectangles[L])){g=p.height;break}}let f=i.mesh,x=i.terrainData;if(f!==void 0&&f.minimumHeight!==void 0&&f.maximumHeight!==void 0)r.minimumHeight=f.minimumHeight,r.maximumHeight=f.maximumHeight,c=!0;else if(x!==void 0&&x._minimumHeight!==void 0&&x._maximumHeight!==void 0)r.minimumHeight=x._minimumHeight,r.maximumHeight=x._maximumHeight;else{r.minimumHeight=Number.NaN,r.maximumHeight=Number.NaN;let L=e.parent;for(;L!==void 0;){let R=L.data;if(R!==void 0){let G=R.mesh,I=R.terrainData;if(G!==void 0&&G.minimumHeight!==void 0&&G.maximumHeight!==void 0){r.minimumHeight=G.minimumHeight,r.maximumHeight=G.maximumHeight;break}else if(I!==void 0&&I._minimumHeight!==void 0&&I._maximumHeight!==void 0){r.minimumHeight=I._minimumHeight,r.maximumHeight=I._maximumHeight;break}}L=L.parent}d=L}if(r.maximumHeight+=g,r.minimumHeight-=u,d!==void 0){let L=n.verticalExaggeration,R=n.verticalExaggerationRelativeHeight;if((L!==1||u!==0)&&(c=!1,r.minimumHeight=Sr.getHeight(r.minimumHeight,L,R),r.maximumHeight=Sr.getHeight(r.maximumHeight,L,R)),c)i.boundingVolumeIsFromMesh||(r._orientedBoundingBox=Gn.clone(f.orientedBoundingBox,r._orientedBoundingBox),r._boundingSphere=de.clone(f.boundingSphere3D,r._boundingSphere),i.occludeePointInScaledSpace=m.clone(f.occludeePointInScaledSpace,i.occludeePointInScaledSpace),l(i.occludeePointInScaledSpace)||(i.occludeePointInScaledSpace=cye(t,r._orientedBoundingBox.center,e.rectangle,r.minimumHeight,r.maximumHeight,i.occludeePointInScaledSpace)));else{let I=r._orientedBoundingBox===void 0||r._boundingSphere===void 0;(r.minimumHeight!==s||r.maximumHeight!==a||I)&&(r.computeBoundingVolumes(o),i.occludeePointInScaledSpace=cye(t,r._orientedBoundingBox.center,e.rectangle,r.minimumHeight,r.maximumHeight,i.occludeePointInScaledSpace))}i.boundingVolumeSourceTile=d,i.boundingVolumeIsFromMesh=c}else i.boundingVolumeSourceTile=void 0,i.boundingVolumeIsFromMesh=!1}cr.prototype.isDestroyed=function(){return!1};cr.prototype.destroy=function(){return this._tileProvider=this._tileProvider&&this._tileProvider.destroy(),this._clippingPlanes=this._clippingPlanes&&this._clippingPlanes.destroy(),this._clippingPolygons=this._clippingPolygons&&this._clippingPolygons.destroy(),this._removeLayerAddedListener=this._removeLayerAddedListener&&this._removeLayerAddedListener(),this._removeLayerRemovedListener=this._removeLayerRemovedListener&&this._removeLayerRemovedListener(),this._removeLayerMovedListener=this._removeLayerMovedListener&&this._removeLayerMovedListener(),this._removeLayerShownListener=this._removeLayerShownListener&&this._removeLayerShownListener(),me(this)};function Fct(e,t,n){return function(i){let o,r,s=-1,a=i.data.imagery,c=a.length,d;for(d=0;d<c;++d)if(o=a[d],r=y(o.readyImagery,o.loadingImagery),r.imageryLayer===t){s=d;break}if(s!==-1){let u=s+e;if(o=a[u],r=l(o)?y(o.readyImagery,o.loadingImagery):void 0,!l(r)||r.imageryLayer!==t)return!t._createTileImagerySkeletons(i,n,u);for(d=s;d<u;++d)a[d].freeResources();a.splice(s,e)}return!0}}cr.prototype._onLayerAdded=function(e,t){if(!this.isDestroyed()&&e.show){let n=this._terrainProvider,i=this,o=this._imageryLayersUpdatedEvent,r=function(){e._imageryCache={},i._quadtree.forEachLoadedTile(function(s){if(l(s._loadedCallbacks[e._layerIndex]))return;let a,c=s.data.imagery,d=c.length,u=-1,h=0;for(a=0;a<d;++a){let g=c[a];if(y(g.readyImagery,g.loadingImagery).imageryLayer===e)u===-1&&(u=a),++h;else if(u!==-1)break}if(u===-1)return;let p=u+h;e._createTileImagerySkeletons(s,n,p)&&(s._loadedCallbacks[e._layerIndex]=Fct(h,e,n),s.state=ra.LOADING)})};if(e.ready){let s=e.imageryProvider;s._reload=r}this._quadtree.forEachLoadedTile(function(s){e._createTileImagerySkeletons(s,n)&&(s.state=ra.LOADING,s.level!==0&&(s._lastSelectionResultFrame!==i.quadtree._lastSelectionFrameNumber||s._lastSelectionResult!==jn.RENDERED)&&(s.renderable=!1))}),this._layerOrderChanged=!0,o.raiseEvent()}};cr.prototype._onLayerRemoved=function(e,t){this._quadtree.forEachLoadedTile(function(n){let i=n.data.imagery,o=-1,r=0;for(let s=0,a=i.length;s<a;++s){let c=i[s],d=c.loadingImagery;if(l(d)||(d=c.readyImagery),d.imageryLayer===e)o===-1&&(o=s),c.freeResources(),++r;else if(o!==-1)break}o!==-1&&i.splice(o,r)}),l(e.imageryProvider)&&(e.imageryProvider._reload=void 0),this._imageryLayersUpdatedEvent.raiseEvent()};cr.prototype._onLayerMoved=function(e,t,n){this._layerOrderChanged=!0,this._imageryLayersUpdatedEvent.raiseEvent()};cr.prototype._onLayerShownOrHidden=function(e,t,n){n?this._onLayerAdded(e,t):this._onLayerRemoved(e,t)};var Act=new M,Mct=new M;function lye(e,t){let n={u_initialColor:function(){return this.properties.initialColor},u_fillHighlightColor:function(){return this.properties.fillHighlightColor},u_zoomedOutOceanSpecularIntensity:function(){return this.properties.zoomedOutOceanSpecularIntensity},u_oceanNormalMap:function(){return this.properties.oceanNormalMap},u_atmosphereLightIntensity:function(){return this.properties.atmosphereLightIntensity},u_atmosphereRayleighCoefficient:function(){return this.properties.atmosphereRayleighCoefficient},u_atmosphereMieCoefficient:function(){return this.properties.atmosphereMieCoefficient},u_atmosphereRayleighScaleHeight:function(){return this.properties.atmosphereRayleighScaleHeight},u_atmosphereMieScaleHeight:function(){return this.properties.atmosphereMieScaleHeight},u_atmosphereMieAnisotropy:function(){return this.properties.atmosphereMieAnisotropy},u_lightingFadeDistance:function(){return this.properties.lightingFadeDistance},u_nightFadeDistance:function(){return this.properties.nightFadeDistance},u_center3D:function(){return this.properties.center3D},u_verticalExaggerationAndRelativeHeight:function(){return this.properties.verticalExaggerationAndRelativeHeight},u_tileRectangle:function(){return this.properties.tileRectangle},u_modifiedModelView:function(){let i=e.context.uniformState.view,o=M.multiplyByPoint(i,this.properties.rtc,aye);return M.setTranslation(i,o,sye),sye},u_modifiedModelViewProjection:function(){let i=e.context.uniformState.view,o=e.context.uniformState.projection,r=M.multiplyByPoint(i,this.properties.rtc,aye);return M.setTranslation(i,r,o3),M.multiply(o,o3,o3),o3},u_dayTextures:function(){return this.properties.dayTextures},u_dayTextureTranslationAndScale:function(){return this.properties.dayTextureTranslationAndScale},u_dayTextureTexCoordsRectangle:function(){return this.properties.dayTextureTexCoordsRectangle},u_dayTextureUseWebMercatorT:function(){return this.properties.dayTextureUseWebMercatorT},u_dayTextureAlpha:function(){return this.properties.dayTextureAlpha},u_dayTextureNightAlpha:function(){return this.properties.dayTextureNightAlpha},u_dayTextureDayAlpha:function(){return this.properties.dayTextureDayAlpha},u_dayTextureBrightness:function(){return this.properties.dayTextureBrightness},u_dayTextureContrast:function(){return this.properties.dayTextureContrast},u_dayTextureHue:function(){return this.properties.dayTextureHue},u_dayTextureSaturation:function(){return this.properties.dayTextureSaturation},u_dayTextureOneOverGamma:function(){return this.properties.dayTextureOneOverGamma},u_dayIntensity:function(){return this.properties.dayIntensity},u_southAndNorthLatitude:function(){return this.properties.southAndNorthLatitude},u_southMercatorYAndOneOverHeight:function(){return this.properties.southMercatorYAndOneOverHeight},u_waterMask:function(){return this.properties.waterMask},u_waterMaskTranslationAndScale:function(){return this.properties.waterMaskTranslationAndScale},u_minMaxHeight:function(){return this.properties.minMaxHeight},u_scaleAndBias:function(){return this.properties.scaleAndBias},u_dayTextureSplit:function(){return this.properties.dayTextureSplit},u_dayTextureCutoutRectangles:function(){return this.properties.dayTextureCutoutRectangles},u_clippingPlanes:function(){let i=t._clippingPlanes;return l(i)&&l(i.texture)?i.texture:e.context.defaultTexture},u_cartographicLimitRectangle:function(){return this.properties.localizedCartographicLimitRectangle},u_clippingPlanesMatrix:function(){let i=t._clippingPlanes,o=l(i)?M.multiply(e.context.uniformState.view,i.modelMatrix,Act):M.IDENTITY;return M.inverseTranspose(o,Mct)},u_clippingPlanesEdgeStyle:function(){let i=this.properties.clippingPlanesEdgeColor;return i.alpha=this.properties.clippingPlanesEdgeWidth,i},u_clippingDistance:function(){let i=t._clippingPolygons.clippingTexture;return l(i)?i:e.context.defaultTexture},u_clippingExtents:function(){let i=t._clippingPolygons.extentsTexture;return l(i)?i:e.context.defaultTexture},u_minimumBrightness:function(){return e.fog.minimumBrightness},u_hsbShift:function(){return this.properties.hsbShift},u_colorsToAlpha:function(){return this.properties.colorsToAlpha},u_frontFaceAlphaByDistance:function(){return this.properties.frontFaceAlphaByDistance},u_backFaceAlphaByDistance:function(){return this.properties.backFaceAlphaByDistance},u_translucencyRectangle:function(){return this.properties.localizedTranslucencyRectangle},u_undergroundColor:function(){return this.properties.undergroundColor},u_undergroundColorAlphaByDistance:function(){return this.properties.undergroundColorAlphaByDistance},u_lambertDiffuseMultiplier:function(){return this.properties.lambertDiffuseMultiplier},u_vertexShadowDarkness:function(){return this.properties.vertexShadowDarkness},u_mars3dTextureInvertColor:function(){return this.properties.mars3dTextureInvertColor},u_mars3dTextureFilterColor:function(){return this.properties.mars3dTextureFilterColor},u_mars_inverseTileWidth:function(){return this.properties.mars_inverseTileWidth},u_mars_cartographicTileRectangle:function(){return this.properties.mars_cartographicTileRectangle},u_mars_flat_enabled:function(){return this.properties.mars_flat_enabled},u_mars_flat_rectangle:function(){return this.properties.mars_flat_rectangle},u_mars_flat_texture:function(){return l(this.properties.mars_flat_texture)?this.properties.mars_flat_texture:e.context.defaultTexture},u_mars_uplift_enabled:function(){return this.properties.mars_uplift_enabled},u_mars_uplift_hideInsideOrOutside:function(){return this.properties.mars_uplift_hideInsideOrOutside},u_mars_uplift_rectangle:function(){return this.properties.mars_uplift_rectangle},u_mars_uplift_texture:function(){return l(this.properties.mars_uplift_texture)?this.properties.mars_uplift_texture:e.context.defaultTexture},u_mars_clip_enabled:function(){return this.properties.mars_clip_enabled},u_mars_clip_rectangle:function(){return this.properties.mars_clip_rectangle},u_mars_clip_texture:function(){return l(this.properties.mars_clip_texture)?this.properties.mars_clip_texture:e.context.defaultTexture},u_mars_clip_only:function(){return this.properties.mars_clip_only},u_mars_flood_enabled:function(){return this.properties.mars_flood_enabled},u_mars_flood_rectangle:function(){return this.properties.mars_flood_rectangle},u_mars_flood_texture:function(){return l(this.properties.mars_flood_texture)?this.properties.mars_flood_texture:e.context.defaultTexture},u_mars_flood_only:function(){return this.properties.mars_flood_only},properties:{initialColor:new re(0,0,.5,1),fillHighlightColor:new B(0,0,0,0),zoomedOutOceanSpecularIntensity:.5,oceanNormalMap:void 0,lightingFadeDistance:new D(65e5,9e6),nightFadeDistance:new D(1e7,4e7),atmosphereLightIntensity:10,atmosphereRayleighCoefficient:new m(55e-7,13e-6,284e-7),atmosphereMieCoefficient:new m(21e-6,21e-6,21e-6),atmosphereRayleighScaleHeight:1e4,atmosphereMieScaleHeight:3200,atmosphereMieAnisotropy:.9,hsbShift:new m,center3D:void 0,rtc:new m,modifiedModelView:new M,tileRectangle:new re,verticalExaggerationAndRelativeHeight:new D(1,0),dayTextures:[],dayTextureTranslationAndScale:[],dayTextureTexCoordsRectangle:[],dayTextureUseWebMercatorT:[],dayTextureAlpha:[],dayTextureNightAlpha:[],dayTextureDayAlpha:[],dayTextureBrightness:[],dayTextureContrast:[],dayTextureHue:[],dayTextureSaturation:[],dayTextureOneOverGamma:[],dayTextureSplit:[],dayTextureCutoutRectangles:[],dayIntensity:0,colorsToAlpha:[],southAndNorthLatitude:new D,southMercatorYAndOneOverHeight:new D,waterMask:void 0,waterMaskTranslationAndScale:new re,minMaxHeight:new D,scaleAndBias:new M,clippingPlanesEdgeColor:B.clone(B.WHITE),clippingPlanesEdgeWidth:0,localizedCartographicLimitRectangle:new re,frontFaceAlphaByDistance:new re,backFaceAlphaByDistance:new re,localizedTranslucencyRectangle:new re,undergroundColor:B.clone(B.TRANSPARENT),undergroundColorAlphaByDistance:new re,lambertDiffuseMultiplier:0,vertexShadowDarkness:0,mars3dTextureInvertColor:[],mars3dTextureFilterColor:[],mars_inverseTileWidth:0,mars_cartographicTileRectangle:void 0,mars_flat_enabled:!1,mars_flat_rectangle:new re,mars_flat_texture:void 0,mars_uplift_enabled:!1,mars_uplift_hideInsideOrOutside:!1,mars_uplift_rectangle:new re,mars_uplift_texture:void 0,mars_clip_enabled:!1,mars_clip_rectangle:new re,mars_clip_texture:void 0,mars_clip_only:!1,mars_flood_enabled:!1,mars_flood_rectangle:new re,mars_flood_texture:void 0,mars_flood_only:!1}};return l(t.materialUniformMap)?Lt(n,t.materialUniformMap):n}function Nct(e,t,n){let i=n.data,o,r;if(l(i.vertexArray)?(o=i.mesh,r=i.vertexArray):l(i.fill)&&l(i.fill.vertexArray)&&(o=i.fill.mesh,r=i.fill.vertexArray),!(!l(o)||!l(r))){if(l(i.wireframeVertexArray)){if(i.wireframeVertexArray.mesh===o)return;i.wireframeVertexArray.destroy(),i.wireframeVertexArray=void 0}i.wireframeVertexArray=kct(e,r,o),i.wireframeVertexArray.mesh=o}}function kct(e,t,n){let o={indices:n.indices,primitiveType:Ae.TRIANGLES};Nn.toWireframe(o);let r=o.indices,s=St.createIndexBuffer({context:e,typedArray:r,usage:ke.STATIC_DRAW,indexDatatype:Me.fromSizeInBytes(r.BYTES_PER_ELEMENT)});return new oi({context:e,attributes:t._attributes,indexBuffer:s})}var fye,pye,s3;(function(){let e=new It({geometry:Pm.fromDimensions({dimensions:new m(2,2,2)})}),t=new It({geometry:new Ab({radius:1})}),n=new M,i,o;function r(s){return new Xn({geometryInstances:s,appearance:new dn({translucent:!1,flat:!0}),asynchronous:!1})}fye=function(s,a){return s===i||(s3(),i=s,n=M.fromRotationTranslation(s.halfAxes,s.center,n),e.modelMatrix=n,e.attributes.color=Ht.fromColor(a),o=r(e)),o},pye=function(s,a){return s===i||(s3(),i=s,n=M.fromTranslation(s.center,n),n=M.multiplyByUniformScale(n,s.radius,n),t.modelMatrix=n,t.attributes.color=Ht.fromColor(a),o=r(t)),o},s3=function(){l(o)&&(o.destroy(),o=void 0,i=void 0)}})();var Uct=new re(0,0,0,0),Dct={frameState:void 0,surfaceTile:void 0,numberOfDayTextures:void 0,applyBrightness:void 0,applyContrast:void 0,applyHue:void 0,applySaturation:void 0,applyGamma:void 0,applyAlpha:void 0,applyDayNightAlpha:void 0,applySplit:void 0,showReflectiveOcean:void 0,showOceanWaves:void 0,enableLighting:void 0,dynamicAtmosphereLighting:void 0,dynamicAtmosphereLightingFromSun:void 0,showGroundAtmosphere:void 0,perFragmentGroundAtmosphere:void 0,hasVertexNormals:void 0,useWebMercatorProjection:void 0,enableFog:void 0,enableClippingPlanes:void 0,clippingPlanes:void 0,enableClippingPolygons:void 0,clippingPolygons:void 0,clippedByBoundaries:void 0,hasImageryLayerCutout:void 0,colorCorrect:void 0,colorToAlpha:void 0,hasGeodeticSurfaceNormals:void 0,hasExaggeration:void 0},Bct=B.TRANSPARENT,Oct=new Ut;function dye(e,t,n,i){var wn,Mo,Jo,Xr,da,Vs,ua,Ne,ct,it,qe,Gt,Yt,Rn,No,Io,vc,wc,Ei,ki,Ia;let o=t.data;l(o.vertexArray)||(o.fill===void 0&&(o.fill=new dL(t)),o.fill.update(e,n));let r=n.creditDisplay,s=o.terrainData;if(l(s)&&l(s.credits)){let mn=s.credits;for(let Fn=0,zi=mn.length;Fn<zi;++Fn)r.addCreditToNextFrame(mn[Fn])}let a=Mt.maximumTextureImageUnits,c=o.waterMaskTexture,d=o.waterMaskTranslationAndScale;!l(c)&&l(o.fill)&&(c=o.fill.waterMaskTexture,d=o.fill.waterMaskTranslationAndScale);let u=n.cameraUnderground,h=n.globeTranslucencyState,p=h.translucent,g=h.frontFaceAlphaByDistance,f=h.backFaceAlphaByDistance,x=h.rectangle,_=y(e.undergroundColor,Bct),C=y(e.undergroundColorAlphaByDistance,Oct),V=hye(e,n)&&n.mode===oe.SCENE3D&&_.alpha>0&&(C.nearValue>0||C.farValue>0),L=e.lambertDiffuseMultiplier,R=e.vertexShadowDarkness,G=e.hasWaterMask&&l(c),I=G&&e.showWaterEffect,v=e.oceanNormalMap,P=I&&l(v),w=e.terrainProvider,A=l(w)&&e.terrainProvider.hasVertexNormals,b=n.fog.enabled&&n.fog.renderable&&!u,Z=e.showGroundAtmosphere&&n.mode===oe.SCENE3D,E=_n.castShadows(e.shadows)&&!p,X=_n.receiveShadows(e.shadows)&&!p,F=e.hueShift,N=e.saturationShift,O=e.brightnessShift,U=!(W.equalsEpsilon(F,0,W.EPSILON7)&&W.equalsEpsilon(N,0,W.EPSILON7)&&W.equalsEpsilon(O,0,W.EPSILON7)),Y=!1;if(Z){let mn=m.magnitude(n.camera.positionWC),Fn=e.nightFadeOutDistance;Y=mn>Fn}G&&--a,P&&--a,l(n.shadowState)&&n.shadowState.shadowsEnabled&&--a,l(e.clippingPlanes)&&e.clippingPlanes.enabled&&--a,l(e.clippingPolygons)&&e.clippingPolygons.enabled&&(--a,--a),a-=h.numberOfTextureUniforms;let k=o.renderedMesh,H=k.center,K=k.encoding,te=o.tileBoundingRegion,z=n.verticalExaggeration,j=n.verticalExaggerationRelativeHeight,ee=(wn=e.marsOptions)==null?void 0:wn.uplift;i&&ee&&(j=n.verticalExaggerationRelativeHeight-ee.height/(z-1)),(Jo=(Mo=e.marsOptions)==null?void 0:Mo.uplift)!=null&&Jo.enabled&&--a,(da=(Xr=e.marsOptions)==null?void 0:Xr.clip)!=null&&da.enabled&&--a,(ua=(Vs=e.marsOptions)==null?void 0:Vs.flat)!=null&&ua.enabled&&--a,(ct=(Ne=e.marsOptions)==null?void 0:Ne.flood)!=null&&ct.enabled&&--a;let pe=z!==1,_e=K.hasGeodeticSurfaceNormals,ae=Gct,ye=0,Se=0,Ee=0,Ie=0,we=!1;if(n.mode!==oe.SCENE3D){let mn=n.mapProjection,Fn=mn.project(le.southwest(t.rectangle),Wct),zi=mn.project(le.northeast(t.rectangle),Pct);if(ae.x=Fn.x,ae.y=Fn.y,ae.z=zi.x,ae.w=zi.y,n.mode!==oe.MORPHING&&(H=Xct,H.x=0,H.y=(ae.z+ae.x)*.5,H.z=(ae.w+ae.y)*.5,ae.x-=H.y,ae.y-=H.z,ae.z-=H.y,ae.w-=H.z),n.mode===oe.SCENE2D&&K.quantization===oa.BITS12){let ze=1/(Math.pow(2,12)-1)*.5,Cl=(ae.z-ae.x)*ze,Xo=(ae.w-ae.y)*ze;ae.x-=Cl,ae.y-=Xo,ae.z+=Cl,ae.w+=Xo}mn instanceof Wi&&(ye=t.rectangle.south,Se=t.rectangle.north,Ee=Wi.geodeticLatitudeToMercatorAngle(ye),Ie=1/(Wi.geodeticLatitudeToMercatorAngle(Se)-Ee),we=!0)}let ve=Dct;ve.frameState=n,ve.surfaceTile=o,ve.hasWaterMask=G,ve.showReflectiveOcean=I,ve.showOceanWaves=P,ve.enableLighting=e.enableLighting,ve.dynamicAtmosphereLighting=e.dynamicAtmosphereLighting,ve.dynamicAtmosphereLightingFromSun=e.dynamicAtmosphereLightingFromSun,ve.showGroundAtmosphere=Z,ve.atmosphereLightIntensity=e.atmosphereLightIntensity,ve.atmosphereRayleighCoefficient=e.atmosphereRayleighCoefficient,ve.atmosphereMieCoefficient=e.atmosphereMieCoefficient,ve.atmosphereRayleighScaleHeight=e.atmosphereRayleighScaleHeight,ve.atmosphereMieScaleHeight=e.atmosphereMieScaleHeight,ve.atmosphereMieAnisotropy=e.atmosphereMieAnisotropy,ve.perFragmentGroundAtmosphere=Y,ve.hasVertexNormals=A,ve.useWebMercatorProjection=we,ve.clippedByBoundaries=o.clippedByBoundaries,ve.hasGeodeticSurfaceNormals=_e,ve.hasExaggeration=pe;let at=o.imagery,Je=0,pt=at.length,Qe=e.showSkirts&&!u&&!p,_t=e.backFaceCulling&&!u&&!p,ht=_t?e._renderState:e._disableCullingRenderState,bt=_t?e._blendRenderState:e._disableCullingBlendRenderState,En=ht,sn=e._firstPassInitialColor,Ce=n.context;if(l(e._debug.boundingSphereTile)||s3(),e._materialUniformMap!==e.materialUniformMap){e._materialUniformMap=e.materialUniformMap;let mn=e._drawCommands.length;for(let Fn=0;Fn<mn;++Fn)e._uniformMaps[Fn]=lye(n,e)}do{let mn=0,Fn,zi;if(e._drawCommands.length<=e._usedDrawCommands?(Fn=new $e,Fn.owner=t,Fn.cull=!1,Fn.boundingVolume=new de,Fn.orientedBoundingBox=void 0,zi=lye(n,e),e._drawCommands.push(Fn),e._uniformMaps.push(zi)):(Fn=e._drawCommands[e._usedDrawCommands],zi=e._uniformMaps[e._usedDrawCommands]),Fn.owner=t,++e._usedDrawCommands,t===e._debug.boundingSphereTile){let Gm=te.boundingVolume,of=te.boundingSphere;l(Gm)?fye(Gm,B.RED).update(n):l(of)&&pye(of,B.RED).update(n)}let ze=zi.properties;re.clone(sn,ze.initialColor),ze.oceanNormalMap=v,ze.lightingFadeDistance.x=e.lightingFadeOutDistance,ze.lightingFadeDistance.y=e.lightingFadeInDistance,ze.nightFadeDistance.x=e.nightFadeOutDistance,ze.nightFadeDistance.y=e.nightFadeInDistance,ze.atmosphereLightIntensity=e.atmosphereLightIntensity,ze.atmosphereRayleighCoefficient=e.atmosphereRayleighCoefficient,ze.atmosphereMieCoefficient=e.atmosphereMieCoefficient,ze.atmosphereRayleighScaleHeight=e.atmosphereRayleighScaleHeight,ze.atmosphereMieScaleHeight=e.atmosphereMieScaleHeight,ze.atmosphereMieAnisotropy=e.atmosphereMieAnisotropy,ze.zoomedOutOceanSpecularIntensity=e.zoomedOutOceanSpecularIntensity;let Cl=u?f:g,Xo=u?g:f;l(Cl)&&(re.fromElements(Cl.near,Cl.nearValue,Cl.far,Cl.farValue,ze.frontFaceAlphaByDistance),re.fromElements(Xo.near,Xo.nearValue,Xo.far,Xo.farValue,ze.backFaceAlphaByDistance)),re.fromElements(C.near,C.nearValue,C.far,C.farValue,ze.undergroundColorAlphaByDistance),B.clone(_,ze.undergroundColor),ze.lambertDiffuseMultiplier=L,ze.vertexShadowDarkness=R;let Rm=!l(o.vertexArray)&&l(e.fillHighlightColor)&&e.fillHighlightColor.alpha>0;Rm&&B.clone(e.fillHighlightColor,ze.fillHighlightColor),ze.verticalExaggerationAndRelativeHeight.x=z,ze.verticalExaggerationAndRelativeHeight.y=j,ze.center3D=k.center,m.clone(H,ze.rtc),re.clone(ae,ze.tileRectangle),ze.southAndNorthLatitude.x=ye,ze.southAndNorthLatitude.y=Se,ze.southMercatorYAndOneOverHeight.x=Ee,ze.southMercatorYAndOneOverHeight.y=Ie;let hu=Ect,nf=r3(t.rectangle,e.cartographicLimitRectangle),fu=Ict,N0=r3(t.rectangle,x);m.fromElements(F,N,O,ze.hsbShift);let lo=t.rectangle,pu=1/lo.width,Zm=1/lo.height;hu.x=(nf.west-lo.west)*pu,hu.y=(nf.south-lo.south)*Zm,hu.z=(nf.east-lo.west)*pu,hu.w=(nf.north-lo.south)*Zm,re.clone(hu,ze.localizedCartographicLimitRectangle),fu.x=(N0.west-lo.west)*pu,fu.y=(N0.south-lo.south)*Zm,fu.z=(N0.east-lo.west)*pu,fu.w=(N0.north-lo.south)*Zm,ze.mars_inverseTileWidth=pu,ze.mars_cartographicTileRectangle=new D(lo.west,lo.south);let Vl=(it=e.marsOptions)==null?void 0:it.clip;Vl?(Vl.rectangle?ze.mars_clip_rectangle=new re(Vl.rectangle.west,Vl.rectangle.south,Vl.rectangle.width,Vl.rectangle.height):ze.mars_clip_rectangle=new re,ze.mars_clip_texture=Vl.texture,ze.mars_clip_only=Vl.onlySelf,ze.mars_clip_enabled=Vl.enabled):(ze.mars_clip_enabled=!1,ze.mars_clip_rectangle=new re,ze.mars_clip_texture=void 0,ze.mars_clip_only=!1);let ks=(qe=e.marsOptions)==null?void 0:qe.flood;ks?(ks.rectangle?ze.mars_flood_rectangle=new re(ks.rectangle.west,ks.rectangle.south,ks.rectangle.width,ks.rectangle.height):ze.mars_flood_rectangle=new re,ze.mars_flood_texture=ks.texture,ze.mars_flood_only=ks.onlySelf,ze.mars_flood_enabled=ks.enabled):(ze.mars_flood_enabled=!1,ze.mars_flood_rectangle=new re,ze.mars_flood_texture=void 0);let Wr=(Gt=e.marsOptions)==null?void 0:Gt.flat;Wr?(Wr.rectangle?ze.mars_flat_rectangle=new re(Wr.rectangle.west,Wr.rectangle.south,Wr.rectangle.width,Wr.rectangle.height):ze.mars_flat_rectangle=new re,ze.mars_flat_texture=Wr.texture,ze.mars_flat_enabled=Wr.enabled):(ze.mars_flat_enabled=!1,ze.mars_flat_rectangle=new re,ze.mars_flat_texture=void 0);let Jt=(Yt=e.marsOptions)==null?void 0:Yt.uplift;Jt?(Jt.rectangle?ze.mars_uplift_rectangle=new re(Jt.rectangle.west,Jt.rectangle.south,Jt.rectangle.width,Jt.rectangle.height):ze.mars_uplift_rectangle=new re,ze.mars_uplift_texture=Jt.texture,ze.mars_uplift_enabled=(!Jt.showUp||Jt.enabled&&Jt.height!==0)&&l(Jt.rectangles)&&Jt.rectangles.length>0,ze.mars_uplift_hideInsideOrOutside=!i):(ze.mars_uplift_enabled=!1,ze.mars_uplift_rectangle=new re,ze.mars_uplift_texture=void 0,ze.mars_uplift_hideInsideOrOutside=!1),re.clone(fu,ze.localizedTranslucencyRectangle);let Ve=b&&W.fog(t._distance,n.fog.density)>W.EPSILON3;U=U&&(Ve||Z);let Tt=!1,un=!1,Wo=!1,Ls=!1,us=!1,ma=!1,$a=!1,Sp=!1,Us=!1,zS=!1,KS=!1,eO=!1;for(;mn<a&&Je<pt;){let Gm=at[Je],of=Gm.readyImagery;if(++Je,!l(of)||of.imageryLayer.alpha===0)continue;let g1e=Gm.useWebMercatorT?of.textureWebMercator:of.texture,Pr=of.imageryLayer;l(Gm.textureTranslationAndScale)||(Gm.textureTranslationAndScale=Pr._calculateTextureTranslationAndScale(t,Gm)),ze.dayTextures[mn]=g1e,ze.dayTextureTranslationAndScale[mn]=Gm.textureTranslationAndScale,ze.dayTextureTexCoordsRectangle[mn]=Gm.textureCoordinateRectangle,ze.dayTextureUseWebMercatorT[mn]=Gm.useWebMercatorT,ze.dayTextureAlpha[mn]=Pr.alpha,ma=ma||ze.dayTextureAlpha[mn]!==1,ze.dayTextureNightAlpha[mn]=Pr.nightAlpha,$a=$a||ze.dayTextureNightAlpha[mn]!==1,ze.dayTextureDayAlpha[mn]=Pr.dayAlpha,$a=$a||ze.dayTextureDayAlpha[mn]!==1,ze.dayTextureBrightness[mn]=Pr.brightness,Tt=Tt||ze.dayTextureBrightness[mn]!==Ja.DEFAULT_BRIGHTNESS,ze.dayTextureContrast[mn]=Pr.contrast,un=un||ze.dayTextureContrast[mn]!==Ja.DEFAULT_CONTRAST,ze.dayTextureHue[mn]=Pr.hue,Wo=Wo||ze.dayTextureHue[mn]!==Ja.DEFAULT_HUE,ze.dayTextureSaturation[mn]=Pr.saturation,Ls=Ls||ze.dayTextureSaturation[mn]!==Ja.DEFAULT_SATURATION,ze.dayTextureOneOverGamma[mn]=1/Pr.gamma,us=us||ze.dayTextureOneOverGamma[mn]!==1/Ja.DEFAULT_GAMMA,ze.dayTextureSplit[mn]=Pr.splitDirection,Sp=Sp||ze.dayTextureSplit[mn]!==0,KS=KS||!!Pr.invertColor,ze.mars3dTextureInvertColor[mn]=!!Pr.invertColor,eO=eO||!!Pr.filterColor,Pr.filterColor?ze.mars3dTextureFilterColor[mn]=new m(Pr.filterColor.red,Pr.filterColor.green,Pr.filterColor.blue):ze.mars3dTextureFilterColor[mn]=new m(1,1,1);let sx=ze.dayTextureCutoutRectangles[mn];if(l(sx)||(sx=ze.dayTextureCutoutRectangles[mn]=new re),re.clone(re.ZERO,sx),l(Pr.cutoutRectangle)){let bu=r3(lo,Pr.cutoutRectangle),rR=le.simpleIntersection(bu,lo,mye);Us=l(rR)||Us,sx.x=(bu.west-lo.west)*pu,sx.y=(bu.south-lo.south)*Zm,sx.z=(bu.east-lo.west)*pu,sx.w=(bu.north-lo.south)*Zm}let ax=ze.colorsToAlpha[mn];l(ax)||(ax=ze.colorsToAlpha[mn]=new re);let Xq=l(Pr.colorToAlpha)&&Pr.colorToAlphaThreshold>0;if(zS=zS||Xq,Xq){let bu=Pr.colorToAlpha;ax.x=bu.red,ax.y=bu.green,ax.z=bu.blue,ax.w=Pr.colorToAlphaThreshold}else ax.w=-1;if(l(of.credits)){let bu=of.credits;for(let rR=0,y1e=bu.length;rR<y1e;++rR)r.addCreditToNextFrame(bu[rR])}++mn}ze.dayTextures.length=mn,ze.waterMask=c,re.clone(d,ze.waterMaskTranslationAndScale),ze.minMaxHeight.x=K.minimumHeight,ze.minMaxHeight.y=K.maximumHeight,M.clone(K.matrix,ze.scaleAndBias);let oR=e._clippingPlanes,Iq=l(oR)&&oR.enabled&&t.isClipped;Iq&&(ze.clippingPlanesEdgeColor=B.clone(oR.edgeColor,ze.clippingPlanesEdgeColor),ze.clippingPlanesEdgeWidth=oR.edgeWidth);let tO=e._clippingPolygons,p1e=l(tO)&&tO.enabled&&t.isClipped;ve.numberOfDayTextures=mn,ve.applyBrightness=Tt,ve.applyContrast=un,ve.applyHue=Wo,ve.applySaturation=Ls,ve.applyGamma=us,ve.applyAlpha=ma,ve.applyDayNightAlpha=$a,ve.applySplit=Sp,ve.enableFog=Ve,ve.enableClippingPlanes=Iq,ve.clippingPlanes=oR,ve.enableClippingPolygons=p1e,ve.clippingPolygons=tO,ve.hasImageryLayerCutout=Us,ve.colorCorrect=U,ve.highlightFillTile=Rm,ve.colorToAlpha=zS,ve.showUndergroundColor=V,ve.translucent=p,ve.marsOptions={invertColor:KS,filterColor:eO,enableUplift:(No=(Rn=e==null?void 0:e._marsOptions)==null?void 0:Rn.uplift)==null?void 0:No.enabled,enableFlat:(vc=(Io=e==null?void 0:e._marsOptions)==null?void 0:Io.flat)==null?void 0:vc.enabled,enableClip:(Ei=(wc=e==null?void 0:e._marsOptions)==null?void 0:wc.clip)==null?void 0:Ei.enabled,enableFlood:(Ia=(ki=e==null?void 0:e._marsOptions)==null?void 0:ki.flood)==null?void 0:Ia.enabled};let nO=o.renderedMesh.indices.length;Qe||(nO=o.renderedMesh.indexCountWithoutSkirts),Fn.shaderProgram=e._surfaceShaderSet.getShaderProgram(ve),Fn.castShadows=E,Fn.receiveShadows=X,Fn.renderState=En,Fn.primitiveType=Ae.TRIANGLES,Fn.vertexArray=o.vertexArray||o.fill.vertexArray,Fn.count=nO,Fn.uniformMap=zi,Fn.pass=Ge.GLOBE,e._debug.wireframe&&(Nct(Ce,e,t),l(o.wireframeVertexArray)&&(Fn.vertexArray=o.wireframeVertexArray,Fn.primitiveType=Ae.LINES,Fn.count=nO*2));let Cp=Fn.boundingVolume,b1e=Fn.orientedBoundingBox;n.mode!==oe.SCENE3D?(de.fromRectangleWithHeights2D(t.rectangle,n.mapProjection,te.minimumHeight,te.maximumHeight,Cp),m.fromElements(Cp.center.z,Cp.center.x,Cp.center.y,Cp.center),n.mode===oe.MORPHING&&(Cp=de.union(te.boundingSphere,Cp,Cp))):(Fn.boundingVolume=de.clone(te.boundingSphere,Cp),Fn.orientedBoundingBox=Gn.clone(te.boundingVolume,b1e)),Fn.dirty=!0,p&&h.updateDerivedCommands(Fn,n),uye(Fn,n),En=bt,sn=Uct}while(Je<pt)}var eF=cr;var REi=T(S(),1);function bye(){this._enabled=!1,this._frontFaceAlpha=1,this._frontFaceAlphaByDistance=void 0,this._backFaceAlpha=1,this._backFaceAlphaByDistance=void 0,this._rectangle=le.clone(le.MAX_VALUE)}Object.defineProperties(bye.prototype,{enabled:{get:function(){return this._enabled},set:function(e){this._enabled=e}},frontFaceAlpha:{get:function(){return this._frontFaceAlpha},set:function(e){this._frontFaceAlpha=e}},frontFaceAlphaByDistance:{get:function(){return this._frontFaceAlphaByDistance},set:function(e){this._frontFaceAlphaByDistance=Ut.clone(e,this._frontFaceAlphaByDistance)}},backFaceAlpha:{get:function(){return this._backFaceAlpha},set:function(e){this._backFaceAlpha=e}},backFaceAlphaByDistance:{get:function(){return this._backFaceAlphaByDistance},set:function(e){this._backFaceAlphaByDistance=Ut.clone(e,this._backFaceAlphaByDistance)}},rectangle:{get:function(){return this._rectangle},set:function(e){l(e)||(e=le.clone(le.MAX_VALUE)),le.clone(e,this._rectangle)}}});var tF=bye;var wEi=T(S(),1);function Ss(){this._layers=[],this.layerAdded=new be,this.layerRemoved=new be,this.layerMoved=new be,this.layerShownOrHidden=new be}Object.defineProperties(Ss.prototype,{length:{get:function(){return this._layers.length}}});Ss.prototype.add=function(e,t){l(t)?this._layers.splice(t,0,e):(t=this._layers.length,this._layers.push(e)),this._update(),this.layerAdded.raiseEvent(e,t);let i=e.readyEvent.addEventListener(()=>{this.layerShownOrHidden.raiseEvent(e,e._layerIndex,e.show),i()})};Ss.prototype.addImageryProvider=function(e,t){let n=new Ja(e);return this.add(n,t),n};Ss.prototype.remove=function(e,t){t=y(t,!0);let n=this._layers.indexOf(e);return n!==-1?(this._layers.splice(n,1),this._update(),this.layerRemoved.raiseEvent(e,n),t&&e.destroy(),!0):!1};Ss.prototype.removeAll=function(e){e=y(e,!0);let t=this._layers;for(let n=0,i=t.length;n<i;n++){let o=t[n];this.layerRemoved.raiseEvent(o,n),e&&o.destroy()}this._layers=[]};Ss.prototype.contains=function(e){return this.indexOf(e)!==-1};Ss.prototype.indexOf=function(e){return this._layers.indexOf(e)};Ss.prototype.get=function(e){return this._layers[e]};function a3(e,t){return e.indexOf(t)}function gye(e,t,n){let i=e._layers;if(t=W.clamp(t,0,i.length-1),n=W.clamp(n,0,i.length-1),t===n)return;let o=i[t];i[t]=i[n],i[n]=o,e._update(),e.layerMoved.raiseEvent(o,n,t)}Ss.prototype.raise=function(e){let t=a3(this._layers,e);gye(this,t,t+1)};Ss.prototype.lower=function(e){let t=a3(this._layers,e);gye(this,t,t-1)};Ss.prototype.raiseToTop=function(e){let t=a3(this._layers,e);t!==this._layers.length-1&&(this._layers.splice(t,1),this._layers.push(e),this._update(),this.layerMoved.raiseEvent(e,this._layers.length-1,t))};Ss.prototype.lowerToBottom=function(e){let t=a3(this._layers,e);t!==0&&(this._layers.splice(t,1),this._layers.splice(0,0,e),this._update(),this.layerMoved.raiseEvent(e,0,t))};var Yct=new le;function Vj(e,t,n,i){let o=e.globe._surface._tilesToRender,r;for(let a=0;!l(r)&&a<o.length;++a){let c=o[a];le.contains(c.rectangle,t)&&(r=c)}if(!l(r))return;let s=r.data.imagery;for(let a=s.length-1;a>=0;--a){let c=s[a],d=c.readyImagery;if(!l(d)||!d.imageryLayer.ready)continue;let u=d.imageryLayer.imageryProvider;if(n&&!l(u.pickFeatures)||!le.contains(d.rectangle,t))continue;let h=Yct,p=1/1024;h.west=W.lerp(r.rectangle.west,r.rectangle.east,c.textureCoordinateRectangle.x-p),h.east=W.lerp(r.rectangle.west,r.rectangle.east,c.textureCoordinateRectangle.z+p),h.south=W.lerp(r.rectangle.south,r.rectangle.north,c.textureCoordinateRectangle.y-p),h.north=W.lerp(r.rectangle.south,r.rectangle.north,c.textureCoordinateRectangle.w+p),le.contains(h,t)&&i(d)}}Ss.pickImageryHelper=Vj;Ss.prototype.pickImageryLayers=function(e,t){let n=t.globe.pick(e,t);if(!l(n))return;let i=t.ellipsoid.cartesianToCartographic(n),o=[];if(Vj(t,i,!1,function(r){o.push(r.imageryLayer)}),o.length!==0)return o};Ss.prototype.pickImageryLayerFeatures=function(e,t){let n=t.globe.pick(e,t);if(!l(n))return;let i=t.ellipsoid.cartesianToCartographic(n),o=[],r=[];if(Vj(t,i,!0,function(s){if(!s.imageryLayer.ready)return;let a=s.imageryLayer.imageryProvider;for(let d=0;d<r.length;d++)if(r[d]===s.imageryLayer)return;let c=a.pickFeatures(s.x,s.y,s.level,i.longitude,i.latitude);l(c)&&(o.push(c),r.push(s.imageryLayer))}),o.length!==0)return Promise.all(o).then(function(s){let a=[];for(let c=0;c<s.length;++c){let d=s[c],u=r[c];if(l(d)&&d.length>0)for(let h=0;h<d.length;++h){let p=d[h];p.imageryLayer=u,l(p.position)||(p.position=i),a.push(p)}}return a})};Ss.prototype.queueReprojectionCommands=function(e){let t=this._layers;for(let n=0,i=t.length;n<i;++n)t[n].queueReprojectionCommands(e)};Ss.prototype.cancelReprojections=function(){let e=this._layers;for(let t=0,n=e.length;t<n;++t)e[t].cancelReprojections()};Ss.prototype.isDestroyed=function(){return!1};Ss.prototype.destroy=function(){return this.removeAll(!0),me(this)};Ss.prototype._update=function(){let e=!0,t=this._layers,n,i,o,r;for(o=0,r=t.length;o<r;++o)i=t[o],i._layerIndex=o,i.show?(i._isBaseLayer=e,e=!1):i._isBaseLayer=!1,i.show!==i._show&&(l(i._show)&&(l(n)||(n=[]),n.push(i)),i._show=i.show);if(l(n))for(o=0,r=n.length;o<r;++o)i=n[o],this.layerShownOrHidden.raiseEvent(i,i._layerIndex,i.show)};var nF=Ss;var pIi=T(S(),1);var NEi=T(S(),1);function yye(e){this._ellipsoid=new Hb(e.ellipsoid,m.ZERO)}Object.defineProperties(yye.prototype,{ellipsoid:{get:function(){return this._ellipsoid}}});var iF=yye;var YEi=T(S(),1);function gl(e){this._tilingScheme=e.tilingScheme,this._x=e.x,this._y=e.y,this._level=e.level,this._parent=e.parent,this._rectangle=this._tilingScheme.tileXYToRectangle(this._x,this._y,this._level),this._southwestChild=void 0,this._southeastChild=void 0,this._northwestChild=void 0,this._northeastChild=void 0,this.replacementPrevious=void 0,this.replacementNext=void 0,this._distance=0,this._loadPriority=0,this._customData=[],this._frameUpdated=void 0,this._lastSelectionResult=jn.NONE,this._lastSelectionResultFrame=void 0,this._loadedCallbacks={},this.state=ra.START,this.renderable=!1,this.upsampledFromParent=!1,this.data=void 0}gl.createLevelZeroTiles=function(e){let t=e.getNumberOfXTilesAtLevel(0),n=e.getNumberOfYTilesAtLevel(0),i=new Array(t*n),o=0;for(let r=0;r<n;++r)for(let s=0;s<t;++s)i[o++]=new gl({tilingScheme:e,x:s,y:r,level:0});return i};gl.prototype._updateCustomData=function(e,t,n){let i=this.customData,o,r,s;if(l(t)&&l(n)){for(i=i.filter(function(a){return n.indexOf(a)===-1}),this._customData=i,s=this._rectangle,o=0;o<t.length;++o)r=t[o],le.contains(s,r.positionCartographic)&&i.push(r);this._frameUpdated=e}else{let a=this._parent;if(l(a)&&this._frameUpdated!==a._frameUpdated){i.length=0,s=this._rectangle;let c=a.customData;for(o=0;o<c.length;++o)r=c[o],le.contains(s,r.positionCartographic)&&i.push(r);this._frameUpdated=a._frameUpdated}}};Object.defineProperties(gl.prototype,{tilingScheme:{get:function(){return this._tilingScheme}},x:{get:function(){return this._x}},y:{get:function(){return this._y}},level:{get:function(){return this._level}},parent:{get:function(){return this._parent}},rectangle:{get:function(){return this._rectangle}},children:{get:function(){return[this.northwestChild,this.northeastChild,this.southwestChild,this.southeastChild]}},southwestChild:{get:function(){return l(this._southwestChild)||(this._southwestChild=new gl({tilingScheme:this.tilingScheme,x:this.x*2,y:this.y*2+1,level:this.level+1,parent:this})),this._southwestChild}},southeastChild:{get:function(){return l(this._southeastChild)||(this._southeastChild=new gl({tilingScheme:this.tilingScheme,x:this.x*2+1,y:this.y*2+1,level:this.level+1,parent:this})),this._southeastChild}},northwestChild:{get:function(){return l(this._northwestChild)||(this._northwestChild=new gl({tilingScheme:this.tilingScheme,x:this.x*2,y:this.y*2,level:this.level+1,parent:this})),this._northwestChild}},northeastChild:{get:function(){return l(this._northeastChild)||(this._northeastChild=new gl({tilingScheme:this.tilingScheme,x:this.x*2+1,y:this.y*2,level:this.level+1,parent:this})),this._northeastChild}},customData:{get:function(){return this._customData}},needsLoading:{get:function(){return this.state<ra.DONE}},eligibleForUnloading:{get:function(){let e=!0;return l(this.data)&&(e=this.data.eligibleForUnloading,l(e)||(e=!0)),e}}});gl.prototype.findLevelZeroTile=function(e,t,n){let i=this.tilingScheme.getNumberOfXTilesAtLevel(0);if(t<0?t+=i:t>=i&&(t-=i),!(n<0||n>=this.tilingScheme.getNumberOfYTilesAtLevel(0)))return e.filter(function(o){return o.x===t&&o.y===n})[0]};gl.prototype.findTileToWest=function(e){let t=this.parent;if(t===void 0)return this.findLevelZeroTile(e,this.x-1,this.y);if(t.southeastChild===this)return t.southwestChild;if(t.northeastChild===this)return t.northwestChild;let n=t.findTileToWest(e);if(n!==void 0)return t.southwestChild===this?n.southeastChild:n.northeastChild};gl.prototype.findTileToEast=function(e){let t=this.parent;if(t===void 0)return this.findLevelZeroTile(e,this.x+1,this.y);if(t.southwestChild===this)return t.southeastChild;if(t.northwestChild===this)return t.northeastChild;let n=t.findTileToEast(e);if(n!==void 0)return t.southeastChild===this?n.southwestChild:n.northwestChild};gl.prototype.findTileToSouth=function(e){let t=this.parent;if(t===void 0)return this.findLevelZeroTile(e,this.x,this.y+1);if(t.northwestChild===this)return t.southwestChild;if(t.northeastChild===this)return t.southeastChild;let n=t.findTileToSouth(e);if(n!==void 0)return t.southwestChild===this?n.northwestChild:n.northeastChild};gl.prototype.findTileToNorth=function(e){let t=this.parent;if(t===void 0)return this.findLevelZeroTile(e,this.x,this.y-1);if(t.southwestChild===this)return t.northwestChild;if(t.southeastChild===this)return t.northeastChild;let n=t.findTileToNorth(e);if(n!==void 0)return t.northwestChild===this?n.southwestChild:n.southeastChild};gl.prototype.freeResources=function(){this.state=ra.START,this.renderable=!1,this.upsampledFromParent=!1,l(this.data)&&l(this.data.freeResources)&&this.data.freeResources(),c3(this._southwestChild),this._southwestChild=void 0,c3(this._southeastChild),this._southeastChild=void 0,c3(this._northwestChild),this._northwestChild=void 0,c3(this._northeastChild),this._northeastChild=void 0};function c3(e){l(e)&&e.freeResources()}var oF=gl;var KEi=T(S(),1);function l3(){this.head=void 0,this.tail=void 0,this.count=0,this._lastBeforeStartOfFrame=void 0}l3.prototype.markStartOfRenderFrame=function(){this._lastBeforeStartOfFrame=this.head};l3.prototype.trimTiles=function(e){let t=this.tail,n=!0;for(;n&&l(this._lastBeforeStartOfFrame)&&this.count>e&&l(t);){n=t!==this._lastBeforeStartOfFrame;let i=t.replacementPrevious;t.eligibleForUnloading&&(t.freeResources(),xye(this,t)),t=i}};function xye(e,t){let n=t.replacementPrevious,i=t.replacementNext;t===e._lastBeforeStartOfFrame&&(e._lastBeforeStartOfFrame=i),t===e.head?e.head=i:n.replacementNext=i,t===e.tail?e.tail=n:i.replacementPrevious=n,t.replacementPrevious=void 0,t.replacementNext=void 0,--e.count}l3.prototype.markTileRendered=function(e){let t=this.head;if(t===e){e===this._lastBeforeStartOfFrame&&(this._lastBeforeStartOfFrame=e.replacementNext);return}if(++this.count,!l(t)){e.replacementPrevious=void 0,e.replacementNext=void 0,this.head=e,this.tail=e;return}(l(e.replacementPrevious)||l(e.replacementNext))&&xye(this,e),e.replacementPrevious=void 0,e.replacementNext=t,t.replacementPrevious=e,this.head=e};var rF=l3;function pm(e){this._tileProvider=e.tileProvider,this._tileProvider.quadtree=this,this._debug={enableDebugOutput:!1,maxDepth:0,maxDepthVisited:0,tilesVisited:0,tilesCulled:0,tilesRendered:0,tilesWaitingForChildren:0,lastMaxDepth:-1,lastMaxDepthVisited:-1,lastTilesVisited:-1,lastTilesCulled:-1,lastTilesRendered:-1,lastTilesWaitingForChildren:-1,suspendLodUpdate:!1};let n=this._tileProvider.tilingScheme.ellipsoid;this._tilesToRender=[],this._tileLoadQueueHigh=[],this._tileLoadQueueMedium=[],this._tileLoadQueueLow=[],this._tileReplacementQueue=new rF,this._levelZeroTiles=void 0,this._loadQueueTimeSlice=5,this._tilesInvalidated=!1,this._addHeightCallbacks=[],this._removeHeightCallbacks=[],this._tileToUpdateHeights=[],this._lastTileIndex=0,this._updateHeightsTimeSlice=2,this._cameraPositionCartographic=void 0,this._cameraReferenceFrameOriginCartographic=void 0,this.maximumScreenSpaceError=y(e.maximumScreenSpaceError,2),this.tileCacheSize=y(e.tileCacheSize,100),this.loadingDescendantLimit=20,this.preloadAncestors=!0,this.preloadSiblings=!1,this._occluders=new iF({ellipsoid:n}),this._tileLoadProgressEvent=new be,this._lastTileLoadQueueLength=0,this._lastSelectionFrameNumber=void 0}Object.defineProperties(pm.prototype,{tileProvider:{get:function(){return this._tileProvider}},tileLoadProgressEvent:{get:function(){return this._tileLoadProgressEvent}},occluders:{get:function(){return this._occluders}}});pm.prototype.invalidateAllTiles=function(){this._tilesInvalidated=!0};function Hct(e){let t=e._tileReplacementQueue;t.head=void 0,t.tail=void 0,t.count=0,Tye(e);let n=e._levelZeroTiles;if(l(n))for(let i=0;i<n.length;++i){let r=n[i].customData,s=r.length;for(let a=0;a<s;++a){let c=r[a];c.level=0,e._addHeightCallbacks.push(c)}n[i].freeResources()}e._levelZeroTiles=void 0,e._tileProvider.cancelReprojections()}pm.prototype.forEachLoadedTile=function(e){let t=this._tileReplacementQueue.head;for(;l(t);)t.state!==ra.START&&e(t),t=t.replacementNext};pm.prototype.forEachRenderedTile=function(e){let t=this._tilesToRender;for(let n=0,i=t.length;n<i;++n)e(t[n])};pm.prototype.updateHeight=function(e,t){let n=this,i={positionOnEllipsoidSurface:void 0,positionCartographic:e,level:-1,callback:t};return i.removeFunc=function(){let o=n._addHeightCallbacks,r=o.length;for(let s=0;s<r;++s)if(o[s]===i){o.splice(s,1);break}n._removeHeightCallbacks.push(i),i.callback&&(i.callback=void 0)},n._addHeightCallbacks.push(i),i.removeFunc};pm.prototype.update=function(e){l(this._tileProvider.update)&&this._tileProvider.update(e)};function Tye(e){let t=e._debug;t.maxDepth=0,t.maxDepthVisited=0,t.tilesVisited=0,t.tilesCulled=0,t.tilesRendered=0,t.tilesWaitingForChildren=0,e._tileLoadQueueHigh.length=0,e._tileLoadQueueMedium.length=0,e._tileLoadQueueLow.length=0}pm.prototype.beginFrame=function(e){e.passes.render&&(this._tilesInvalidated&&(Hct(this),this._tilesInvalidated=!1),this._tileProvider.initialize(e),Tye(this),!this._debug.suspendLodUpdate&&this._tileReplacementQueue.markStartOfRenderFrame())};pm.prototype.render=function(e){let t=e.passes,n=this._tileProvider;t.render&&(n.beginUpdate(e),Qct(this,e),slt(this,e),n.endUpdate(e)),t.pick&&this._tilesToRender.length>0&&n.updateForPick(e)};function zct(e,t){let n=e._tileLoadQueueHigh.length+e._tileLoadQueueMedium.length+e._tileLoadQueueLow.length;if(n!==e._lastTileLoadQueueLength||e._tilesInvalidated){let o=be.prototype.raiseEvent.bind(e._tileLoadProgressEvent,n);t.afterRender.push(()=>(o(),!0)),e._lastTileLoadQueueLength=n}let i=e._debug;i.enableDebugOutput&&!i.suspendLodUpdate&&(i.maxDepth=e._tilesToRender.reduce(function(o,r){return Math.max(o,r.level)},-1),i.tilesRendered=e._tilesToRender.length,(i.tilesVisited!==i.lastTilesVisited||i.tilesRendered!==i.lastTilesRendered||i.tilesCulled!==i.lastTilesCulled||i.maxDepth!==i.lastMaxDepth||i.tilesWaitingForChildren!==i.lastTilesWaitingForChildren||i.maxDepthVisited!==i.lastMaxDepthVisited)&&(console.log(`Visited ${i.tilesVisited}, Rendered: ${i.tilesRendered}, Culled: ${i.tilesCulled}, Max Depth Rendered: ${i.maxDepth}, Max Depth Visited: ${i.maxDepthVisited}, Waiting for children: ${i.tilesWaitingForChildren}`),i.lastTilesVisited=i.tilesVisited,i.lastTilesRendered=i.tilesRendered,i.lastTilesCulled=i.tilesCulled,i.lastMaxDepth=i.maxDepth,i.lastTilesWaitingForChildren=i.tilesWaitingForChildren,i.lastMaxDepthVisited=i.maxDepthVisited))}pm.prototype.endFrame=function(e){!e.passes.render||e.mode===oe.MORPHING||(nlt(this,e),rlt(this,e),zct(this,e))};pm.prototype.isDestroyed=function(){return!1};pm.prototype.destroy=function(){this._tileProvider=this._tileProvider&&this._tileProvider.destroy()};var aF,_ye=new he;function Kct(e,t){let n=le.center(e.rectangle,_ye),i=n.longitude-aF.longitude,o=n.latitude-aF.latitude;n=le.center(t.rectangle,_ye);let r=n.longitude-aF.longitude,s=n.latitude-aF.latitude;return i*i+o*o-(r*r+s*s)}var Jct=new m,sF=[];function Qct(e,t){let n=e._debug;if(n.suspendLodUpdate)return;let i=e._tilesToRender;i.length=0;let o,r=e._tileProvider;if(!l(e._levelZeroTiles)){let x=r.tilingScheme;if(l(x)){let _=r.tilingScheme;e._levelZeroTiles=oF.createLevelZeroTiles(_);let C=e._levelZeroTiles.length;if(sF.length<C)for(sF=new Array(C),o=0;o<C;++o)sF[o]===void 0&&(sF[o]=new cF)}else return}e._occluders.ellipsoid.cameraPosition=t.camera.positionWC;let s,a=e._levelZeroTiles,c=a.length>1?e._occluders:void 0;aF=t.camera.positionCartographic,a.sort(Kct);let d=e._addHeightCallbacks,u=e._removeHeightCallbacks,h=t.frameNumber,p;if(d.length>0||u.length>0){for(o=0,p=a.length;o<p;++o)s=a[o],s._updateCustomData(h,d,u);d.length=0,u.length=0}let g=t.camera;e._cameraPositionCartographic=g.positionCartographic;let f=M.getTranslation(g.transform,Jct);for(e._cameraReferenceFrameOriginCartographic=e.tileProvider.tilingScheme.ellipsoid.cartesianToCartographic(f,e._cameraReferenceFrameOriginCartographic),o=0,p=a.length;o<p;++o)s=a[o],e._tileReplacementQueue.markTileRendered(s),s.renderable?Qa(e,s,r,t,c,!1,sF[o]):(_0(e,e._tileLoadQueueHigh,s,t),++n.tilesWaitingForChildren);e._lastSelectionFrameNumber=h}function _0(e,t,n,i){n.needsLoading&&(e.tileProvider.computeTileLoadPriority!==void 0&&(n._loadPriority=e.tileProvider.computeTileLoadPriority(n,i)),t.push(n))}function cF(){this.allAreRenderable=!0,this.anyWereRenderedLastFrame=!1,this.notYetRenderableCount=0}function Sye(){this.southwest=new cF,this.southeast=new cF,this.northwest=new cF,this.northeast=new cF}Sye.prototype.combine=function(e){let t=this.southwest,n=this.southeast,i=this.northwest,o=this.northeast;e.allAreRenderable=t.allAreRenderable&&n.allAreRenderable&&i.allAreRenderable&&o.allAreRenderable,e.anyWereRenderedLastFrame=t.anyWereRenderedLastFrame||n.anyWereRenderedLastFrame||i.anyWereRenderedLastFrame||o.anyWereRenderedLastFrame,e.notYetRenderableCount=t.notYetRenderableCount+n.notYetRenderableCount+i.notYetRenderableCount+o.notYetRenderableCount};var Zj=new Array(31);for(let e=0;e<Zj.length;++e)Zj[e]=new Sye;function jct(e,t,n,i,o){let r=e._debug;++r.tilesVisited,e._tileReplacementQueue.markTileRendered(n),n._updateCustomData(t.frameNumber),n.level>r.maxDepthVisited&&(r.maxDepthVisited=n.level);let s=elt(e,t,n)<e.maximumScreenSpaceError,a=n.southwestChild,c=n.southeastChild,d=n.northwestChild,u=n.northeastChild,h=e._lastSelectionFrameNumber,p=n._lastSelectionResultFrame===h?n._lastSelectionResult:jn.NONE,g=e.tileProvider;if(s||i){let f=jn.originalResult(p)===jn.RENDERED,x=jn.originalResult(p)===jn.CULLED||p===jn.NONE,_=n.state===ra.DONE,C=f||x||_;if(C||l(g.canRenderWithoutLosingDetail)&&(C=g.canRenderWithoutLosingDetail(n)),C){s&&_0(e,e._tileLoadQueueMedium,n,t),d3(e,n),o.allAreRenderable=n.renderable,o.anyWereRenderedLastFrame=p===jn.RENDERED,o.notYetRenderableCount=n.renderable?0:1,n._lastSelectionResultFrame=t.frameNumber,n._lastSelectionResult=jn.RENDERED,o.anyWereRenderedLastFrame||e._tileToUpdateHeights.push(n);return}i=!0,s&&_0(e,e._tileLoadQueueHigh,n,t)}if(g.canRefine(n)){if(a.upsampledFromParent&&c.upsampledFromParent&&d.upsampledFromParent&&u.upsampledFromParent){d3(e,n),_0(e,e._tileLoadQueueMedium,n,t),e._tileReplacementQueue.markTileRendered(a),e._tileReplacementQueue.markTileRendered(c),e._tileReplacementQueue.markTileRendered(d),e._tileReplacementQueue.markTileRendered(u),o.allAreRenderable=n.renderable,o.anyWereRenderedLastFrame=p===jn.RENDERED,o.notYetRenderableCount=n.renderable?0:1,n._lastSelectionResultFrame=t.frameNumber,n._lastSelectionResult=jn.RENDERED,o.anyWereRenderedLastFrame||e._tileToUpdateHeights.push(n);return}n._lastSelectionResultFrame=t.frameNumber,n._lastSelectionResult=jn.REFINED;let x=e._tilesToRender.length,_=e._tileLoadQueueLow.length,C=e._tileLoadQueueMedium.length,V=e._tileLoadQueueHigh.length,L=e._tileToUpdateHeights.length;if(qct(e,a,c,d,u,t,i,o),x!==e._tilesToRender.length){let R=o.allAreRenderable,G=o.anyWereRenderedLastFrame,I=o.notYetRenderableCount,v=!1;if(!R&&!G){let P=e._tilesToRender;for(let A=x;A<P.length;++A){let b=P[A];for(;b!==void 0&&b._lastSelectionResult!==jn.KICKED&&b!==n;)b._lastSelectionResult=jn.kick(b._lastSelectionResult),b=b.parent}e._tilesToRender.length=x,e._tileToUpdateHeights.length=L,d3(e,n),n._lastSelectionResult=jn.RENDERED;let w=p===jn.RENDERED;!w&&I>e.loadingDescendantLimit&&(e._tileLoadQueueLow.length=_,e._tileLoadQueueMedium.length=C,e._tileLoadQueueHigh.length=V,_0(e,e._tileLoadQueueMedium,n,t),o.notYetRenderableCount=n.renderable?0:1,v=!0),o.allAreRenderable=n.renderable,o.anyWereRenderedLastFrame=w,w||e._tileToUpdateHeights.push(n),++r.tilesWaitingForChildren}e.preloadAncestors&&!v&&_0(e,e._tileLoadQueueLow,n,t)}return}n._lastSelectionResultFrame=t.frameNumber,n._lastSelectionResult=jn.RENDERED,d3(e,n),_0(e,e._tileLoadQueueHigh,n,t),o.allAreRenderable=n.renderable,o.anyWereRenderedLastFrame=p===jn.RENDERED,o.notYetRenderableCount=n.renderable?0:1}function qct(e,t,n,i,o,r,s,a){let c=r.camera.positionCartographic,d=e._tileProvider,u=e._occluders,h=Zj[t.level],p=h.southwest,g=h.southeast,f=h.northwest,x=h.northeast;c.longitude<t.rectangle.east?c.latitude<t.rectangle.north?(Qa(e,t,d,r,u,s,p),Qa(e,n,d,r,u,s,g),Qa(e,i,d,r,u,s,f),Qa(e,o,d,r,u,s,x)):(Qa(e,i,d,r,u,s,f),Qa(e,t,d,r,u,s,p),Qa(e,o,d,r,u,s,x),Qa(e,n,d,r,u,s,g)):c.latitude<t.rectangle.north?(Qa(e,n,d,r,u,s,g),Qa(e,t,d,r,u,s,p),Qa(e,o,d,r,u,s,x),Qa(e,i,d,r,u,s,f)):(Qa(e,o,d,r,u,s,x),Qa(e,i,d,r,u,s,f),Qa(e,n,d,r,u,s,g),Qa(e,t,d,r,u,s,p)),h.combine(a)}function $ct(e,t){let n=t.rectangle;return l(e._cameraPositionCartographic)&&le.contains(n,e._cameraPositionCartographic)||l(e._cameraReferenceFrameOriginCartographic)&&le.contains(n,e._cameraReferenceFrameOriginCartographic)}function Qa(e,t,n,i,o,r,s){if(n.computeTileVisibility(t,i,o)!==gr.NONE)return jct(e,i,t,r,s);if(++e._debug.tilesCulled,e._tileReplacementQueue.markTileRendered(t),s.allAreRenderable=!0,s.anyWereRenderedLastFrame=!1,s.notYetRenderableCount=0,$ct(e,t)){(!l(t.data)||!l(t.data.vertexArray))&&_0(e,e._tileLoadQueueMedium,t,i);let a=e._lastSelectionFrameNumber,c=t._lastSelectionResultFrame===a?t._lastSelectionResult:jn.NONE;c!==jn.CULLED_BUT_NEEDED&&c!==jn.RENDERED&&e._tileToUpdateHeights.push(t),t._lastSelectionResult=jn.CULLED_BUT_NEEDED}else e.preloadSiblings||t.level===0?(_0(e,e._tileLoadQueueLow,t,i),t._lastSelectionResult=jn.CULLED):t._lastSelectionResult=jn.CULLED;t._lastSelectionResultFrame=i.frameNumber}function elt(e,t,n){if(t.mode===oe.SCENE2D||t.camera.frustum instanceof ln||t.camera.frustum instanceof Mr)return tlt(e,t,n);let i=e._tileProvider.getLevelMaximumGeometricError(n.level),o=n._distance,r=t.context.drawingBufferHeight,s=t.camera.frustum.sseDenominator,a=i*r/(o*s);return t.fog.enabled&&(a-=W.fog(o,t.fog.density)*t.fog.sse),a/=t.pixelRatio,a}function tlt(e,t,n){let o=t.camera.frustum,r=o.offCenterFrustum;l(r)&&(o=r);let s=t.context,a=s.drawingBufferWidth,c=s.drawingBufferHeight,d=e._tileProvider.getLevelMaximumGeometricError(n.level),u=Math.max(o.top-o.bottom,o.right-o.left)/Math.max(a,c),h=d/u;return t.fog.enabled&&t.mode!==oe.SCENE2D&&(h-=W.fog(n._distance,t.fog.density)*t.fog.sse),h/=t.pixelRatio,h}function d3(e,t){e._tilesToRender.push(t)}function nlt(e,t){let n=e._tileLoadQueueHigh,i=e._tileLoadQueueMedium,o=e._tileLoadQueueLow;if(n.length===0&&i.length===0&&o.length===0)return;e._tileReplacementQueue.trimTiles(e.tileCacheSize);let r=Si()+e._loadQueueTimeSlice,s=e._tileProvider,a=Lj(e,t,s,r,n,!1);a=Lj(e,t,s,r,i,a),Lj(e,t,s,r,o,a)}function ilt(e,t){return e._loadPriority-t._loadPriority}function Lj(e,t,n,i,o,r){n.computeTileLoadPriority!==void 0&&o.sort(ilt);for(let s=0,a=o.length;s<a&&(Si()<i||!r);++s){let c=o[s];e._tileReplacementQueue.markTileRendered(c),n.loadTile(t,c),r=!0}return r}var uL=new gn,Rj=new he,vy=new m,olt=[];function rlt(e,t){if(!l(e.tileProvider.tilingScheme))return;let n=olt;n.length=0;let i=e._tileToUpdateHeights,o=Si(),r=e._updateHeightsTimeSlice,s=o+r,a=t.mode,c=t.mapProjection,d=e.tileProvider.tilingScheme.ellipsoid,u;for(;i.length>0;){let h=i[0];if(!l(h.data)||!l(h.data.mesh)){let x=h._lastSelectionResultFrame===e._lastSelectionFrameNumber?h._lastSelectionResult:jn.NONE;(x===jn.RENDERED||x===jn.CULLED_BUT_NEEDED)&&n.push(h),i.shift(),e._lastTileIndex=0;continue}let p=h.customData,g=p.length,f=!1;for(u=e._lastTileIndex;u<g;++u){let x=p[u],_=h.data.terrainData,C=l(_)&&_.wasCreatedByUpsampling();if(h.level>x.level&&!C){if(l(x.positionOnEllipsoidSurface)||(x.positionOnEllipsoidSurface=m.fromRadians(x.positionCartographic.longitude,x.positionCartographic.latitude,0,d)),a===oe.SCENE3D){let L=d.geodeticSurfaceNormal(x.positionOnEllipsoidSurface,uL.direction),R=d.getSurfaceNormalIntersectionWithZAxis(x.positionOnEllipsoidSurface,11500,uL.origin);if(!l(R)){let G=0;l(h.data.tileBoundingRegion)&&(G=h.data.tileBoundingRegion.minimumHeight);let I=Math.min(G,-11500),v=m.multiplyByScalar(L,Math.abs(I)+1,vy);m.subtract(x.positionOnEllipsoidSurface,v,uL.origin)}}else he.clone(x.positionCartographic,Rj),Rj.height=-11500,c.project(Rj,vy),m.fromElements(vy.z,vy.x,vy.y,vy),m.clone(vy,uL.origin),m.clone(m.UNIT_X,uL.direction);let V=h.data.pick(uL,a,c,!1,vy);l(V)&&(l(x.callback)&&x.callback(V),x.level=h.level)}if(Si()>=s){f=!0;break}}if(f){e._lastTileIndex=u;break}else e._lastTileIndex=0,i.shift()}for(u=0;u<n.length;u++)i.push(n[u])}function slt(e,t){let n=e._tileProvider,i=e._tilesToRender;for(let o=0,r=i.length;o<r;++o){let s=i[o];n.showTileThisFrame(s,t)}}var lF=pm;function Dh(e){e=y(e,ne.default);let t=new YT({ellipsoid:e}),n=new nF;this._ellipsoid=e,this._imageryLayerCollection=n,this._surfaceShaderSet=new Mw,this._material=void 0,this._surface=new lF({tileProvider:new eF({terrainProvider:t,imageryLayers:n,surfaceShaderSet:this._surfaceShaderSet})}),this._terrainProvider=t,this._terrainProviderChanged=new be,this._undergroundColor=B.clone(B.BLACK),this._undergroundColorAlphaByDistance=new Ut(e.maximumRadius/1e3,0,e.maximumRadius/5,1),this._translucency=new tF,Ej(this),this.show=!0,this._oceanNormalMapResourceDirty=!0,this._oceanNormalMapResource=new Re({url:on("Assets/Textures/waterNormalsSmall.jpg")}),this.maximumScreenSpaceError=2,this.tileCacheSize=100,this.loadingDescendantLimit=20,this.preloadAncestors=!0,this.preloadSiblings=!1,this.fillHighlightColor=void 0,this.enableLighting=!1,this.lambertDiffuseMultiplier=.9,this.dynamicAtmosphereLighting=!0,this.dynamicAtmosphereLightingFromSun=!1,this.showGroundAtmosphere=ne.WGS84.equals(e),this.atmosphereLightIntensity=10,this.atmosphereRayleighCoefficient=new m(55e-7,13e-6,284e-7),this.atmosphereMieCoefficient=new m(21e-6,21e-6,21e-6),this.atmosphereRayleighScaleHeight=1e4,this.atmosphereMieScaleHeight=3200,this.atmosphereMieAnisotropy=.9,this.lightingFadeOutDistance=W.PI_OVER_TWO*e.minimumRadius,this.lightingFadeInDistance=W.PI*e.minimumRadius,this.nightFadeOutDistance=W.PI_OVER_TWO*e.minimumRadius,this.nightFadeInDistance=5*W.PI_OVER_TWO*e.minimumRadius,this.showWaterEffect=!0,this.depthTestAgainstTerrain=!1,this.shadows=_n.RECEIVE_ONLY,this.atmosphereHueShift=0,this.atmosphereSaturationShift=0,this.atmosphereBrightnessShift=0,this.showSkirts=!0,this.backFaceCulling=!0,this._oceanNormalMap=void 0,this._zoomedOutOceanSpecularIntensity=void 0,this.vertexShadowDarkness=.3}Object.defineProperties(Dh.prototype,{ellipsoid:{get:function(){return this._ellipsoid}},imageryLayers:{get:function(){return this._imageryLayerCollection}},imageryLayersUpdatedEvent:{get:function(){return this._surface.tileProvider.imageryLayersUpdatedEvent}},tilesLoaded:{get:function(){return l(this._surface)?this._surface._tileLoadQueueHigh.length===0&&this._surface._tileLoadQueueMedium.length===0&&this._surface._tileLoadQueueLow.length===0:!0}},baseColor:{get:function(){return this._surface.tileProvider.baseColor},set:function(e){this._surface.tileProvider.baseColor=e}},clippingPlanes:{get:function(){return this._surface.tileProvider.clippingPlanes},set:function(e){this._surface.tileProvider.clippingPlanes=e}},clippingPolygons:{get:function(){return this._surface.tileProvider.clippingPolygons},set:function(e){this._surface.tileProvider.clippingPolygons=e}},cartographicLimitRectangle:{get:function(){return this._surface.tileProvider.cartographicLimitRectangle},set:function(e){l(e)||(e=le.clone(le.MAX_VALUE)),this._surface.tileProvider.cartographicLimitRectangle=e}},oceanNormalMapUrl:{get:function(){return this._oceanNormalMapResource.url},set:function(e){this._oceanNormalMapResource.url=e,this._oceanNormalMapResourceDirty=!0}},terrainProvider:{get:function(){return this._terrainProvider},set:function(e){e!==this._terrainProvider&&(this._terrainProvider=e,this._terrainProviderChanged.raiseEvent(e),l(this._material)&&Ej(this))}},terrainProviderChanged:{get:function(){return this._terrainProviderChanged}},tileLoadProgressEvent:{get:function(){return this._surface.tileLoadProgressEvent}},material:{get:function(){return this._material},set:function(e){this._material!==e&&(this._material=e,Ej(this))}},undergroundColor:{get:function(){return this._undergroundColor},set:function(e){this._undergroundColor=B.clone(e,this._undergroundColor)}},undergroundColorAlphaByDistance:{get:function(){return this._undergroundColorAlphaByDistance},set:function(e){this._undergroundColorAlphaByDistance=Ut.clone(e,this._undergroundColorAlphaByDistance)}},translucency:{get:function(){return this._translucency}}});function Ej(e){let t=[],n=l(e._material)&&(l(e._material.shaderSource.match(/slope/))||l(e._material.shaderSource.match("normalEC"))),i=[th,QV];l(e._material)&&(!n||e._terrainProvider.requestVertexNormals)?(i.push(e._material.shaderSource),t.push("APPLY_MATERIAL"),e._surface._tileProvider.materialUniformMap=e._material._uniforms):e._surface._tileProvider.materialUniformMap=void 0,i.push(Fw),e._surfaceShaderSet.baseVertexShaderSource=new De({sources:[th,QV,Aw],defines:t}),e._surfaceShaderSet.baseFragmentShaderSource=new De({sources:i,defines:t}),e._surfaceShaderSet.material=e._material}function alt(e){return function(t,n){let i=de.distanceSquaredTo(t.pickBoundingSphere,e),o=de.distanceSquaredTo(n.pickBoundingSphere,e);return i-o}}var clt=[],llt={start:0,stop:0};Dh.prototype.pickWorldCoordinates=function(e,t,n,i){n=y(n,!0);let o=t.mode,r=t.mapProjection,s=clt;s.length=0;let a=this._surface._tilesToRender,c=a.length,d,u;for(u=0;u<c;++u){d=a[u];let p=d.data;if(!l(p))continue;let g=p.pickBoundingSphere;if(o!==oe.SCENE3D)p.pickBoundingSphere=g=de.fromRectangleWithHeights2D(d.rectangle,r,p.tileBoundingRegion.minimumHeight,p.tileBoundingRegion.maximumHeight,g),m.fromElements(g.center.z,g.center.x,g.center.y,g.center);else if(l(p.renderedMesh))de.clone(p.tileBoundingRegion.boundingSphere,g);else continue;let f=ti.raySphere(e,g,llt);l(f)&&s.push(p)}s.sort(alt(e.origin));let h;for(c=s.length,u=0;u<c&&(h=s[u].pick(e,t.mode,t.mapProjection,n,i),!l(h));++u);return h};var dlt=new he;Dh.prototype.pick=function(e,t,n){if(n=this.pickWorldCoordinates(e,t,!0,n),l(n)&&t.mode!==oe.SCENE3D){n=m.fromElements(n.y,n.z,n.x,n);let i=t.mapProjection.unproject(n,dlt);n=this._ellipsoid.cartographicToCartesian(i,n)}return n};var ult=new m,Cye=new m,mlt=new he,hlt=new gn;function Gj(e,t){return l(e)&&le.contains(e.rectangle,t)?e:void 0}Dh.prototype.getHeight=function(e){let t=this._surface._levelZeroTiles;if(!l(t))return;let n,i,o=t.length;for(i=0;i<o&&(n=t[i],!le.contains(n.rectangle,e));++i);if(i>=o)return;let r=n;for(;l(n);)n=Gj(n._southwestChild,e)||Gj(n._southeastChild,e)||Gj(n._northwestChild,e)||n._northeastChild,l(n)&&l(n.data)&&l(n.data.renderedMesh)&&(r=n);if(n=r,!l(n)||!l(n.data)||!l(n.data.renderedMesh))return;let s=this._surface._tileProvider.tilingScheme.projection,a=this._surface._tileProvider.tilingScheme.ellipsoid,c=m.fromRadians(e.longitude,e.latitude,0,a,ult),d=hlt,u=a.geodeticSurfaceNormal(c,d.direction),h=a.getSurfaceNormalIntersectionWithZAxis(c,11500,d.origin);if(!l(h)){let g;l(n.data.tileBoundingRegion)&&(g=n.data.tileBoundingRegion.minimumHeight);let f=Math.min(y(g,0),-11500),x=m.multiplyByScalar(u,Math.abs(f)+1,Cye);m.subtract(c,x,d.origin)}let p=n.data.pick(d,void 0,s,!1,Cye);if(l(p))return a.cartesianToCartographic(p,mlt).height};Dh.prototype.update=function(e){this.show&&e.passes.render&&this._surface.update(e)};Dh.prototype.beginFrame=function(e){let t=this._surface,n=t.tileProvider,i=this.terrainProvider,o=l(i)&&i.hasWaterMask&&i.hasWaterMask;if(o&&this._oceanNormalMapResourceDirty){this._oceanNormalMapResourceDirty=!1;let a=this._oceanNormalMapResource,c=a.url;if(l(c)){let d=this;a.fetchImage().then(function(u){c===d._oceanNormalMapResource.url&&(d._oceanNormalMap=d._oceanNormalMap&&d._oceanNormalMap.destroy(),d._oceanNormalMap=new Wt({context:e.context,source:u}))})}else this._oceanNormalMap=this._oceanNormalMap&&this._oceanNormalMap.destroy()}let r=e.passes,s=e.mode;r.render&&(this.showGroundAtmosphere?this._zoomedOutOceanSpecularIntensity=.4:this._zoomedOutOceanSpecularIntensity=.5,t.maximumScreenSpaceError=this.maximumScreenSpaceError,t.tileCacheSize=this.tileCacheSize,t.loadingDescendantLimit=this.loadingDescendantLimit,t.preloadAncestors=this.preloadAncestors,t.preloadSiblings=this.preloadSiblings,n.terrainProvider=this.terrainProvider,n.lightingFadeOutDistance=this.lightingFadeOutDistance,n.lightingFadeInDistance=this.lightingFadeInDistance,n.nightFadeOutDistance=this.nightFadeOutDistance,n.nightFadeInDistance=this.nightFadeInDistance,n.zoomedOutOceanSpecularIntensity=s===oe.SCENE3D?this._zoomedOutOceanSpecularIntensity:0,n.hasWaterMask=o,n.showWaterEffect=this.showWaterEffect,n.oceanNormalMap=this._oceanNormalMap,n.enableLighting=this.enableLighting,n.dynamicAtmosphereLighting=this.dynamicAtmosphereLighting,n.dynamicAtmosphereLightingFromSun=this.dynamicAtmosphereLightingFromSun,n.showGroundAtmosphere=this.showGroundAtmosphere,n.atmosphereLightIntensity=this.atmosphereLightIntensity,n.atmosphereRayleighCoefficient=this.atmosphereRayleighCoefficient,n.atmosphereMieCoefficient=this.atmosphereMieCoefficient,n.atmosphereRayleighScaleHeight=this.atmosphereRayleighScaleHeight,n.atmosphereMieScaleHeight=this.atmosphereMieScaleHeight,n.atmosphereMieAnisotropy=this.atmosphereMieAnisotropy,n.shadows=this.shadows,n.hueShift=this.atmosphereHueShift,n.saturationShift=this.atmosphereSaturationShift,n.brightnessShift=this.atmosphereBrightnessShift,n.fillHighlightColor=this.fillHighlightColor,n.showSkirts=this.showSkirts,n.backFaceCulling=this.backFaceCulling,n.vertexShadowDarkness=this.vertexShadowDarkness,n.undergroundColor=this._undergroundColor,n.undergroundColorAlphaByDistance=this._undergroundColorAlphaByDistance,n.lambertDiffuseMultiplier=this.lambertDiffuseMultiplier,t.beginFrame(e))};Dh.prototype.render=function(e){this.show&&(l(this._material)&&this._material.update(e.context),this._surface.render(e))};Dh.prototype.endFrame=function(e){this.show&&e.passes.render&&this._surface.endFrame(e)};Dh.prototype.isDestroyed=function(){return!1};Dh.prototype.destroy=function(){return this._surfaceShaderSet=this._surfaceShaderSet&&this._surfaceShaderSet.destroy(),this._surface=this._surface&&this._surface.destroy(),this._oceanNormalMap=this._oceanNormalMap&&this._oceanNormalMap.destroy(),me(this)};var dF=Dh;var eWi=T(S(),1);var uXi=T(S(),1);var nXi=T(S(),1);var JIi=T(S(),1);function flt(e,t,n,i){this.rightAscension=e,this.declination=t,this.rotation=n,this.rotationRate=i}var uF=flt;var Aye={},plt=32.184,blt=2451545,Vye=-.0529921,Lye=-.1059842,Rye=13.0120009,Zye=13.3407154,Gye=.9856003,Eye=26.4057084,Iye=13.064993,Xye=.3287146,Wye=1.7484877,Pye=-.1589763,vye=.0036096,wye=.1643573,Fye=12.9590088,Ij=new q;Aye.ComputeMoon=function(e,t){l(e)||(e=q.now()),Ij=q.addSeconds(e,plt,Ij);let n=q.totalDays(Ij)-blt,i=n/Qn.DAYS_PER_JULIAN_CENTURY,o=(125.045+Vye*n)*W.RADIANS_PER_DEGREE,r=(250.089+Lye*n)*W.RADIANS_PER_DEGREE,s=(260.008+Rye*n)*W.RADIANS_PER_DEGREE,a=(176.625+Zye*n)*W.RADIANS_PER_DEGREE,c=(357.529+Gye*n)*W.RADIANS_PER_DEGREE,d=(311.589+Eye*n)*W.RADIANS_PER_DEGREE,u=(134.963+Iye*n)*W.RADIANS_PER_DEGREE,h=(276.617+Xye*n)*W.RADIANS_PER_DEGREE,p=(34.226+Wye*n)*W.RADIANS_PER_DEGREE,g=(15.134+Pye*n)*W.RADIANS_PER_DEGREE,f=(119.743+vye*n)*W.RADIANS_PER_DEGREE,x=(239.961+wye*n)*W.RADIANS_PER_DEGREE,_=(25.053+Fye*n)*W.RADIANS_PER_DEGREE,C=Math.sin(o),V=Math.sin(r),L=Math.sin(s),R=Math.sin(a),G=Math.sin(c),I=Math.sin(d),v=Math.sin(u),P=Math.sin(h),w=Math.sin(p),A=Math.sin(g),b=Math.sin(f),Z=Math.sin(x),E=Math.sin(_),X=Math.cos(o),F=Math.cos(r),N=Math.cos(s),O=Math.cos(a),U=Math.cos(c),Y=Math.cos(d),k=Math.cos(u),H=Math.cos(h),K=Math.cos(p),te=Math.cos(g),z=Math.cos(f),j=Math.cos(x),ee=Math.cos(_),pe=(269.9949+.0031*i-3.8787*C-.1204*V+.07*L-.0172*R+.0072*I-.0052*A+.0043*E)*W.RADIANS_PER_DEGREE,_e=(66.5392+.013*i+1.5419*X+.0239*F-.0278*N+.0068*O-.0029*Y+9e-4*k+8e-4*te-9e-4*ee)*W.RADIANS_PER_DEGREE,ae=(38.3213+13.17635815*n-14e-13*n*n+3.561*C+.1208*V-.0642*L+.0158*R+.0252*G-.0066*I-.0047*v-.0046*P+.0028*w+.0052*A+.004*b+.0019*Z-.0044*E)*W.RADIANS_PER_DEGREE,ye=(13.17635815-14e-13*(2*n)+3.561*X*Vye+.1208*F*Lye-.0642*N*Rye+.0158*O*Zye+.0252*U*Gye-.0066*Y*Eye-.0047*k*Iye-.0046*H*Xye+.0028*K*Wye+.0052*te*Pye+.004*z*vye+.0019*j*wye-.0044*ee*Fye)/86400*W.RADIANS_PER_DEGREE;return l(t)||(t=new uF),t.rightAscension=pe,t.declination=_e,t.rotation=ae,t.rotationRate=ye,t};var mF=Aye;function Mye(e){(!l(e)||typeof e!="function")&&(e=mF.ComputeMoon),this._computeFunction=e}var glt=new m,ylt=new m,xlt=new m;function _lt(e,t,n){let i=glt;i.x=Math.cos(e+W.PI_OVER_TWO),i.y=Math.sin(e+W.PI_OVER_TWO),i.z=0;let o=Math.cos(t),r=xlt;r.x=o*Math.cos(e),r.y=o*Math.sin(e),r.z=Math.sin(t);let s=m.cross(r,i,ylt);return l(n)||(n=new $),n[0]=i.x,n[1]=s.x,n[2]=r.x,n[3]=i.y,n[4]=s.y,n[5]=r.y,n[6]=i.z,n[7]=s.z,n[8]=r.z,n}var Tlt=new $,Slt=new Fe;Mye.prototype.evaluate=function(e,t){l(e)||(e=q.now());let n=this._computeFunction(e),i=_lt(n.rightAscension,n.declination,t),o=W.zeroToTwoPi(n.rotation),r=Fe.fromAxisAngle(m.UNIT_Z,o,Slt),s=$.fromQuaternion(Fe.conjugate(r,r),Tlt);return $.multiply(s,i,i)};var hF=Mye;var NXi=T(S(),1);var hXi=T(S(),1),mL=`uniform vec3 u_radii; uniform vec3 u_oneOverEllipsoidRadiiSquared; in vec3 v_positionEC; vec4 computeEllipsoidColor(czm_ray ray, float intersection, float side) { vec3 positionEC = czm_pointAlongRay(ray, intersection); vec3 positionMC = (czm_inverseModelView * vec4(positionEC, 1.0)).xyz; vec3 geodeticNormal = normalize(czm_geodeticSurfaceNormal(positionMC, vec3(0.0), u_oneOverEllipsoidRadiiSquared)); vec3 sphericalNormal = normalize(positionMC / u_radii); vec3 normalMC = geodeticNormal * side; // normalized surface normal (always facing the viewer) in model coordinates vec3 normalEC = normalize(czm_normal * normalMC); // normalized surface normal in eye coordinates vec2 st = czm_ellipsoidTextureCoordinates(sphericalNormal); vec3 positionToEyeEC = -positionEC; czm_materialInput materialInput; materialInput.s = st.s; materialInput.st = st; materialInput.str = (positionMC + u_radii) / u_radii; materialInput.normalEC = normalEC; materialInput.tangentToEyeMatrix = czm_eastNorthUpToEyeCoordinates(positionMC, normalEC); materialInput.positionToEyeEC = positionToEyeEC; czm_material material = czm_getMaterial(materialInput); #ifdef ONLY_SUN_LIGHTING return czm_private_phong(normalize(positionToEyeEC), material, czm_sunDirectionEC); #else return czm_phong(normalize(positionToEyeEC), material, czm_lightDirectionEC); #endif } void main() { // PERFORMANCE_TODO: When dynamic branching is available, compute ratio of maximum and minimum radii // in the vertex shader. Only when it is larger than some constant, march along the ray. // Otherwise perform one intersection test which will be the common case. // Test if the ray intersects a sphere with the ellipsoid's maximum radius. // For very oblate ellipsoids, using the ellipsoid's radii for an intersection test // may cause false negatives. This will discard fragments before marching the ray forward. float maxRadius = max(u_radii.x, max(u_radii.y, u_radii.z)) * 1.5; vec3 direction = normalize(v_positionEC); vec3 ellipsoidCenter = czm_modelView[3].xyz; float t1 = -1.0; float t2 = -1.0; float b = -2.0 * dot(direction, ellipsoidCenter); float c = dot(ellipsoidCenter, ellipsoidCenter) - maxRadius * maxRadius; float discriminant = b * b - 4.0 * c; if (discriminant >= 0.0) { t1 = (-b - sqrt(discriminant)) * 0.5; t2 = (-b + sqrt(discriminant)) * 0.5; } if (t1 < 0.0 && t2 < 0.0) { discard; } float t = min(t1, t2); if (t < 0.0) { t = 0.0; } // March ray forward to intersection with larger sphere and find czm_ray ray = czm_ray(t * direction, direction); vec3 ellipsoid_inverseRadii = vec3(1.0 / u_radii.x, 1.0 / u_radii.y, 1.0 / u_radii.z); czm_raySegment intersection = czm_rayEllipsoidIntersectionInterval(ray, ellipsoidCenter, ellipsoid_inverseRadii); if (czm_isEmpty(intersection)) { discard; } // If the viewer is outside, compute outsideFaceColor, with normals facing outward. vec4 outsideFaceColor = (intersection.start != 0.0) ? computeEllipsoidColor(ray, intersection.start, 1.0) : vec4(0.0); // If the viewer either is inside or can see inside, compute insideFaceColor, with normals facing inward. vec4 insideFaceColor = (outsideFaceColor.a < 1.0) ? computeEllipsoidColor(ray, intersection.stop, -1.0) : vec4(0.0); out_FragColor = mix(insideFaceColor, outsideFaceColor, outsideFaceColor.a); out_FragColor.a = 1.0 - (1.0 - insideFaceColor.a) * (1.0 - outsideFaceColor.a); #if (defined(WRITE_DEPTH) && (__VERSION__ == 300 || defined(GL_EXT_frag_depth))) t = (intersection.start != 0.0) ? intersection.start : intersection.stop; vec3 positionEC = czm_pointAlongRay(ray, t); vec4 positionCC = czm_projection * vec4(positionEC, 1.0); #ifdef LOG_DEPTH czm_writeLogDepth(1.0 + positionCC.w); #else float z = positionCC.z / positionCC.w; float n = czm_depthRange.near; float f = czm_depthRange.far; gl_FragDepth = (z * (f - n) + f + n) * 0.5; #endif #endif } `;var pXi=T(S(),1),hL=`in vec3 position; uniform vec3 u_radii; out vec3 v_positionEC; void main() { // In the vertex data, the cube goes from (-1.0, -1.0, -1.0) to (1.0, 1.0, 1.0) in model coordinates. // Scale to consider the radii. We could also do this once on the CPU when using the BoxGeometry, // but doing it here allows us to change the radii without rewriting the vertex data, and // allows all ellipsoids to reuse the same vertex data. vec4 p = vec4(u_radii * position, 1.0); v_positionEC = (czm_modelView * p).xyz; // position in eye coordinates gl_Position = czm_modelViewProjection * p; // position in clip coordinates // With multi-frustum, when the ellipsoid primitive is positioned on the intersection of two frustums // and close to terrain, the terrain (writes depth) in the closest frustum can overwrite part of the // ellipsoid (does not write depth) that was rendered in the farther frustum. // // Here, we clamp the depth in the vertex shader to avoid being overwritten; however, this creates // artifacts since some fragments can be alpha blended twice. This is solved by only rendering // the ellipsoid in the closest frustum to the viewer. gl_Position.z = clamp(gl_Position.z, czm_depthRange.near, czm_depthRange.far); czm_vertexLogDepth(); } `;var Xj={position:0};function u3(e){e=y(e,y.EMPTY_OBJECT),this.center=m.clone(y(e.center,m.ZERO)),this._center=new m,this.radii=m.clone(e.radii),this._radii=new m,this._oneOverEllipsoidRadiiSquared=new m,this._boundingSphere=new de,this.modelMatrix=M.clone(y(e.modelMatrix,M.IDENTITY)),this._modelMatrix=new M,this._computedModelMatrix=new M,this.show=y(e.show,!0),this.material=y(e.material,Ji.fromType(Ji.ColorType)),this._material=void 0,this._translucent=void 0,this.id=e.id,this._id=void 0,this.debugShowBoundingVolume=y(e.debugShowBoundingVolume,!1),this.onlySunLighting=y(e.onlySunLighting,!1),this._onlySunLighting=!1,this._depthTestEnabled=y(e.depthTestEnabled,!0),this._useLogDepth=!1,this._sp=void 0,this._rs=void 0,this._va=void 0,this._pickSP=void 0,this._pickId=void 0,this._colorCommand=new $e({owner:y(e._owner,this)}),this._pickCommand=new $e({owner:y(e._owner,this),pickOnly:!0});let t=this;this._uniforms={u_radii:function(){return t.radii},u_oneOverEllipsoidRadiiSquared:function(){return t._oneOverEllipsoidRadiiSquared}},this._pickUniforms={czm_pickColor:function(){return t._pickId.color}}}function Clt(e){let t=e.cache.ellipsoidPrimitive_vertexArray;if(l(t))return t;let n=va.createGeometry(va.fromDimensions({dimensions:new m(2,2,2),vertexFormat:Xe.POSITION_ONLY}));return t=oi.fromGeometry({context:e,geometry:n,attributeLocations:Xj,bufferUsage:ke.STATIC_DRAW,interleave:!0}),e.cache.ellipsoidPrimitive_vertexArray=t,t}u3.prototype.update=function(e){if(!this.show||e.mode!==oe.SCENE3D||!l(this.center)||!l(this.radii))return;let t=e.context,n=this.material.isTranslucent(),i=this._translucent!==n;(!l(this._rs)||i)&&(this._translucent=n,this._rs=Ue.fromCache({cull:{enabled:!0,face:_i.FRONT},depthTest:{enabled:this._depthTestEnabled},depthMask:!n&&t.fragmentDepth,blending:n?hn.ALPHA_BLEND:void 0})),l(this._va)||(this._va=Clt(t));let o=!1,r=this.radii;if(!m.equals(this._radii,r)){m.clone(r,this._radii);let x=this._oneOverEllipsoidRadiiSquared;x.x=1/(r.x*r.x),x.y=1/(r.y*r.y),x.z=1/(r.z*r.z),o=!0}(!M.equals(this.modelMatrix,this._modelMatrix)||!m.equals(this.center,this._center))&&(M.clone(this.modelMatrix,this._modelMatrix),m.clone(this.center,this._center),M.multiplyByTranslation(this.modelMatrix,this.center,this._computedModelMatrix),o=!0),o&&(m.clone(m.ZERO,this._boundingSphere.center),this._boundingSphere.radius=m.maximumComponent(r),de.transform(this._boundingSphere,this._computedModelMatrix,this._boundingSphere));let s=this._material!==this.material;this._material=this.material,this._material.update(t);let a=this.onlySunLighting!==this._onlySunLighting;this._onlySunLighting=this.onlySunLighting;let c=e.useLogDepth,d=this._useLogDepth!==c;this._useLogDepth=c;let u=this._colorCommand,h,p;(s||a||i||d)&&(h=new De({sources:[hL]}),p=new De({sources:[this.material.shaderSource,mL]}),this.onlySunLighting&&p.defines.push("ONLY_SUN_LIGHTING"),!n&&t.fragmentDepth&&p.defines.push("WRITE_DEPTH"),this._useLogDepth&&(h.defines.push("LOG_DEPTH"),p.defines.push("LOG_DEPTH")),this._sp=en.replaceCache({context:t,shaderProgram:this._sp,vertexShaderSource:h,fragmentShaderSource:p,attributeLocations:Xj}),u.vertexArray=this._va,u.renderState=this._rs,u.shaderProgram=this._sp,u.uniformMap=Lt(this._uniforms,this.material._uniforms),u.executeInClosestFrustum=n);let g=e.commandList,f=e.passes;if(f.render&&(u.boundingVolume=this._boundingSphere,u.debugShowBoundingVolume=this.debugShowBoundingVolume,u.modelMatrix=this._computedModelMatrix,u.pass=n?Ge.TRANSLUCENT:Ge.OPAQUE,g.push(u)),f.pick){let x=this._pickCommand;(!l(this._pickId)||this._id!==this.id)&&(this._id=this.id,this._pickId=this._pickId&&this._pickId.destroy(),this._pickId=t.createPickId({primitive:this,id:this.id})),(s||a||!l(this._pickSP)||d)&&(h=new De({sources:[hL]}),p=new De({sources:[this.material.shaderSource,mL],pickColorQualifier:"uniform"}),this.onlySunLighting&&p.defines.push("ONLY_SUN_LIGHTING"),!n&&t.fragmentDepth&&p.defines.push("WRITE_DEPTH"),this._useLogDepth&&(h.defines.push("LOG_DEPTH"),p.defines.push("LOG_DEPTH")),this._pickSP=en.replaceCache({context:t,shaderProgram:this._pickSP,vertexShaderSource:h,fragmentShaderSource:p,attributeLocations:Xj}),x.vertexArray=this._va,x.renderState=this._rs,x.shaderProgram=this._pickSP,x.uniformMap=Lt(Lt(this._uniforms,this._pickUniforms),this.material._uniforms),x.executeInClosestFrustum=n),x.boundingVolume=this._boundingSphere,x.modelMatrix=this._computedModelMatrix,x.pass=n?Ge.TRANSLUCENT:Ge.OPAQUE,g.push(x)}};u3.prototype.isDestroyed=function(){return!1};u3.prototype.destroy=function(){return this._sp=this._sp&&this._sp.destroy(),this._pickSP=this._pickSP&&this._pickSP.destroy(),this._pickId=this._pickId&&this._pickId.destroy(),me(this)};var fF=u3;function pF(e){e=y(e,y.EMPTY_OBJECT);let t=e.textureUrl;l(t)||(t=on("Assets/Textures/moonSmall.jpg")),this.show=y(e.show,!0),this.textureUrl=t,this._ellipsoid=y(e.ellipsoid,ne.MOON),this.onlySunLighting=y(e.onlySunLighting,!0),this._ellipsoidPrimitive=new fF({radii:this.ellipsoid.radii,material:Ji.fromType(Ji.ImageType),depthTestEnabled:!1,_owner:this}),this._ellipsoidPrimitive.material.translucent=!1,this._axes=new hF}Object.defineProperties(pF.prototype,{ellipsoid:{get:function(){return this._ellipsoid}}});var m3=new $,Vlt=new $,Llt=new m,h3=[];pF.prototype.update=function(e){if(!this.show)return;let t=this._ellipsoidPrimitive;t.material.uniforms.image=this.textureUrl,t.onlySunLighting=this.onlySunLighting;let n=e.time;l(wt.computeIcrfToFixedMatrix(n,m3))||wt.computeTemeToPseudoFixedMatrix(n,m3);let i=this._axes.evaluate(n,Vlt);$.transpose(i,i),$.multiply(m3,i,i);let o=Iy.computeMoonPositionInEarthInertialFrame(n,Llt);$.multiplyByVector(m3,o,o),M.fromRotationTranslation(i,o,t.modelMatrix);let r=e.commandList;return e.commandList=h3,h3.length=0,t.update(e),e.commandList=r,h3.length===1?h3[0]:void 0};pF.prototype.isDestroyed=function(){return!1};pF.prototype.destroy=function(){return this._ellipsoidPrimitive=this._ellipsoidPrimitive&&this._ellipsoidPrimitive.destroy(),me(this)};var bF=pF;var Szi=T(S(),1);var nWi=T(S(),1);var Wj=[],Pj=[];function Rlt(e,t,n,i,o,r){let s=o-i+1,a=r-o,c=Wj,d=Pj,u,h;for(u=0;u<s;++u)c[u]=e[i+u];for(h=0;h<a;++h)d[h]=e[o+h+1];u=0,h=0;for(let p=i;p<=r;++p){let g=c[u],f=d[h];u<s&&(h>=a||t(g,f,n)<=0)?(e[p]=g,++u):h<a&&(e[p]=f,++h)}}function vj(e,t,n,i,o){if(i>=o)return;let r=Math.floor((i+o)*.5);vj(e,t,n,i,r),vj(e,t,n,r+1,o),Rlt(e,t,n,i,r,o)}function Zlt(e,t,n){let i=e.length,o=Math.ceil(i*.5);Wj.length=o,Pj.length=o,vj(e,t,n,0,i-1),Wj.length=0,Pj.length=0}var T0=Zlt;var mWi=T(S(),1);function Zc(e,t){this._occluderPosition=m.clone(e.center),this._occluderRadius=e.radius,this._horizonDistance=0,this._horizonPlaneNormal=void 0,this._horizonPlanePosition=void 0,this._cameraPosition=void 0,this.cameraPosition=t}var f3=new m;Object.defineProperties(Zc.prototype,{position:{get:function(){return this._occluderPosition}},radius:{get:function(){return this._occluderRadius}},cameraPosition:{set:function(e){e=m.clone(e,this._cameraPosition);let t=m.subtract(this._occluderPosition,e,f3),n=m.magnitudeSquared(t),i=this._occluderRadius*this._occluderRadius,o,r,s;if(n>i){o=Math.sqrt(n-i),n=1/Math.sqrt(n),r=m.multiplyByScalar(t,n,f3);let a=o*o*n;s=m.add(e,m.multiplyByScalar(r,a,f3),f3)}else o=Number.MAX_VALUE;this._horizonDistance=o,this._horizonPlaneNormal=r,this._horizonPlanePosition=s,this._cameraPosition=e}}});Zc.fromBoundingSphere=function(e,t,n){return l(n)?(m.clone(e.center,n._occluderPosition),n._occluderRadius=e.radius,n.cameraPosition=t,n):new Zc(e,t)};var kye=new m;Zc.prototype.isPointVisible=function(e){if(this._horizonDistance!==Number.MAX_VALUE){let t=m.subtract(e,this._occluderPosition,kye),n=this._occluderRadius;if(n=m.magnitudeSquared(t)-n*n,n>0)return n=Math.sqrt(n)+this._horizonDistance,t=m.subtract(e,this._cameraPosition,t),n*n>m.magnitudeSquared(t)}return!1};var Glt=new m;Zc.prototype.isBoundingSphereVisible=function(e){let t=m.clone(e.center,Glt),n=e.radius;if(this._horizonDistance!==Number.MAX_VALUE){let i=m.subtract(t,this._occluderPosition,kye),o=this._occluderRadius-n;if(o=m.magnitudeSquared(i)-o*o,n<this._occluderRadius)return o>0?(o=Math.sqrt(o)+this._horizonDistance,i=m.subtract(t,this._cameraPosition,i),o*o+n*n>m.magnitudeSquared(i)):!1;if(o>0){i=m.subtract(t,this._cameraPosition,i);let r=m.magnitudeSquared(i),s=this._occluderRadius*this._occluderRadius,a=n*n;return(this._horizonDistance*this._horizonDistance+s)*a>r*s?!0:(o=Math.sqrt(o)+this._horizonDistance,o*o+a>r)}return!0}return!1};var Elt=new m;Zc.prototype.computeVisibility=function(e){let t=m.clone(e.center),n=e.radius;if(n>this._occluderRadius)return gr.FULL;if(this._horizonDistance!==Number.MAX_VALUE){let i=m.subtract(t,this._occluderPosition,Elt),o=this._occluderRadius-n,r=m.magnitudeSquared(i);if(o=r-o*o,o>0){o=Math.sqrt(o)+this._horizonDistance,i=m.subtract(t,this._cameraPosition,i);let s=m.magnitudeSquared(i);return o*o+n*n<s?gr.NONE:(o=this._occluderRadius+n,o=r-o*o,o>0?(o=Math.sqrt(o)+this._horizonDistance,s<o*o+n*n?gr.FULL:gr.PARTIAL):(i=m.subtract(t,this._horizonPlanePosition,i),m.dot(i,this._horizonPlaneNormal)>-n?gr.PARTIAL:gr.FULL))}}return gr.NONE};var p3=new m;Zc.computeOccludeePoint=function(e,t,n){let i=m.clone(t),o=m.clone(e.center),r=e.radius,s=n.length,a=m.normalize(m.subtract(i,o,p3),p3),c=-m.dot(a,o),d=Zc._anyRotationVector(o,a,c),u=Zc._horizonToPlaneNormalDotProduct(e,a,c,d,n[0]);if(!u)return;let h;for(let g=1;g<s;++g){if(h=Zc._horizonToPlaneNormalDotProduct(e,a,c,d,n[g]),!h)return;h<u&&(u=h)}if(u<.0017453283658983088)return;let p=r/u;return m.add(o,m.multiplyByScalar(a,p,p3),p3)};var Ilt=[];Zc.computeOccludeePointFromRectangle=function(e,t){t=y(t,ne.default);let n=le.subsample(e,t,0,Ilt),i=de.fromPoints(n),o=m.ZERO;if(!m.equals(o,i.center))return Zc.computeOccludeePoint(new de(o,t.minimumRadius),i.center,n)};var Xlt=new m;Zc._anyRotationVector=function(e,t,n){let i=m.abs(t,Xlt),o=i.x>i.y?0:1;(o===0&&i.z>i.x||o===1&&i.z>i.y)&&(o=2);let r=new m,s;o===0?(i.x=e.x,i.y=e.y+1,i.z=e.z+1,s=m.UNIT_X):o===1?(i.x=e.x+1,i.y=e.y,i.z=e.z+1,s=m.UNIT_Y):(i.x=e.x+1,i.y=e.y+1,i.z=e.z,s=m.UNIT_Z);let a=(m.dot(t,i)+n)/-m.dot(t,s);return m.normalize(m.subtract(m.add(i,m.multiplyByScalar(s,a,r),i),e,i),i)};var Wlt=new m;Zc._rotationVector=function(e,t,n,i,o){let r=m.subtract(i,e,Wlt);if(r=m.normalize(r,r),m.dot(t,r)<.9999999847691291){let s=m.cross(t,r,r);if(m.magnitude(s)>W.EPSILON13)return m.normalize(s,new m)}return o};var wj=new m,Plt=new m,b3=new m,Nye=new m;Zc._horizonToPlaneNormalDotProduct=function(e,t,n,i,o){let r=m.clone(o,wj),s=m.clone(e.center,Plt),a=e.radius,c=m.subtract(s,r,b3),d=m.magnitudeSquared(c),u=a*a;if(d<u)return!1;let h=d-u,p=Math.sqrt(h),f=1/Math.sqrt(d),_=p*f*p;c=m.normalize(c,c);let C=m.add(r,m.multiplyByScalar(c,_,Nye),Nye),V=Math.sqrt(h-_*_),L=this._rotationVector(s,t,n,r,i),R=m.fromElements(L.x*L.x*c.x+(L.x*L.y-L.z)*c.y+(L.x*L.z+L.y)*c.z,(L.x*L.y+L.z)*c.x+L.y*L.y*c.y+(L.y*L.z-L.x)*c.z,(L.x*L.z-L.y)*c.x+(L.y*L.z+L.x)*c.y+L.z*L.z*c.z,wj);R=m.normalize(R,R);let G=m.multiplyByScalar(R,V,wj);L=m.normalize(m.subtract(m.add(C,G,b3),s,b3),b3);let I=m.dot(t,L);L=m.normalize(m.subtract(m.subtract(C,G,L),s,L),L);let v=m.dot(t,L);return I<v?I:v};var gF=Zc;var ZWi=T(S(),1);var TWi=T(S(),1);function sp(e){e=y(e,y.EMPTY_OBJECT),this.left=e.left,this._left=void 0,this.right=e.right,this._right=void 0,this.top=e.top,this._top=void 0,this.bottom=e.bottom,this._bottom=void 0,this.near=y(e.near,1),this._near=this.near,this.far=y(e.far,5e8),this._far=this.far,this._cullingVolume=new ps,this._perspectiveMatrix=new M,this._infinitePerspective=new M}function Fj(e){let{top:t,bottom:n,right:i,left:o,near:r,far:s}=e;(t!==e._top||n!==e._bottom||o!==e._left||i!==e._right||r!==e._near||s!==e._far)&&(e._left=o,e._right=i,e._top=t,e._bottom=n,e._near=r,e._far=s,e._perspectiveMatrix=M.computePerspectiveOffCenter(o,i,n,t,r,s,e._perspectiveMatrix),e._infinitePerspective=M.computeInfinitePerspectiveOffCenter(o,i,n,t,r,e._infinitePerspective))}Object.defineProperties(sp.prototype,{projectionMatrix:{get:function(){return Fj(this),this._perspectiveMatrix}},infiniteProjectionMatrix:{get:function(){return Fj(this),this._infinitePerspective}}});var vlt=new m,wlt=new m,Flt=new m,Alt=new m;sp.prototype.computeCullingVolume=function(e,t,n){let i=this._cullingVolume.planes,o=this.top,r=this.bottom,s=this.right,a=this.left,c=this.near,d=this.far,u=m.cross(t,n,vlt),h=wlt;m.multiplyByScalar(t,c,h),m.add(e,h,h);let p=Flt;m.multiplyByScalar(t,d,p),m.add(e,p,p);let g=Alt;m.multiplyByScalar(u,a,g),m.add(h,g,g),m.subtract(g,e,g),m.normalize(g,g),m.cross(g,n,g),m.normalize(g,g);let f=i[0];return l(f)||(f=i[0]=new re),f.x=g.x,f.y=g.y,f.z=g.z,f.w=-m.dot(g,e),m.multiplyByScalar(u,s,g),m.add(h,g,g),m.subtract(g,e,g),m.cross(n,g,g),m.normalize(g,g),f=i[1],l(f)||(f=i[1]=new re),f.x=g.x,f.y=g.y,f.z=g.z,f.w=-m.dot(g,e),m.multiplyByScalar(n,r,g),m.add(h,g,g),m.subtract(g,e,g),m.cross(u,g,g),m.normalize(g,g),f=i[2],l(f)||(f=i[2]=new re),f.x=g.x,f.y=g.y,f.z=g.z,f.w=-m.dot(g,e),m.multiplyByScalar(n,o,g),m.add(h,g,g),m.subtract(g,e,g),m.cross(g,u,g),m.normalize(g,g),f=i[3],l(f)||(f=i[3]=new re),f.x=g.x,f.y=g.y,f.z=g.z,f.w=-m.dot(g,e),f=i[4],l(f)||(f=i[4]=new re),f.x=t.x,f.y=t.y,f.z=t.z,f.w=-m.dot(t,h),m.negate(t,g),f=i[5],l(f)||(f=i[5]=new re),f.x=g.x,f.y=g.y,f.z=g.z,f.w=-m.dot(g,p),this._cullingVolume};sp.prototype.getPixelDimensions=function(e,t,n,i,o){Fj(this);let r=1/this.near,s=this.top*r,a=2*i*n*s/t;s=this.right*r;let c=2*i*n*s/e;return o.x=c,o.y=a,o};sp.prototype.clone=function(e){return l(e)||(e=new sp),e.right=this.right,e.left=this.left,e.top=this.top,e.bottom=this.bottom,e.near=this.near,e.far=this.far,e._left=void 0,e._right=void 0,e._top=void 0,e._bottom=void 0,e._near=void 0,e._far=void 0,e};sp.prototype.equals=function(e){return l(e)&&e instanceof sp&&this.right===e.right&&this.left===e.left&&this.top===e.top&&this.bottom===e.bottom&&this.near===e.near&&this.far===e.far};sp.prototype.equalsEpsilon=function(e,t,n){return e===this||l(e)&&e instanceof sp&&W.equalsEpsilon(this.right,e.right,t,n)&&W.equalsEpsilon(this.left,e.left,t,n)&&W.equalsEpsilon(this.top,e.top,t,n)&&W.equalsEpsilon(this.bottom,e.bottom,t,n)&&W.equalsEpsilon(this.near,e.near,t,n)&&W.equalsEpsilon(this.far,e.far,t,n)};var yl=sp;function nd(e){e=y(e,y.EMPTY_OBJECT),this._offCenterFrustum=new yl,this.fov=e.fov,this._fov=void 0,this._fovy=void 0,this._sseDenominator=void 0,this.aspectRatio=e.aspectRatio,this._aspectRatio=void 0,this.near=y(e.near,1),this._near=this.near,this.far=y(e.far,5e8),this._far=this.far,this.xOffset=y(e.xOffset,0),this._xOffset=this.xOffset,this.yOffset=y(e.yOffset,0),this._yOffset=this.yOffset}nd.packedLength=6;nd.pack=function(e,t,n){return n=y(n,0),t[n++]=e.fov,t[n++]=e.aspectRatio,t[n++]=e.near,t[n++]=e.far,t[n++]=e.xOffset,t[n]=e.yOffset,t};nd.unpack=function(e,t,n){return t=y(t,0),l(n)||(n=new nd),n.fov=e[t++],n.aspectRatio=e[t++],n.near=e[t++],n.far=e[t++],n.xOffset=e[t++],n.yOffset=e[t],n};function Bh(e){if(!(e.fov!==e._fov||e.aspectRatio!==e._aspectRatio||e.near!==e._near||e.far!==e._far||e.xOffset!==e._xOffset||e.yOffset!==e._yOffset))return;e._aspectRatio=e.aspectRatio,e._fov=e.fov,e._fovy=e.aspectRatio<=1?e.fov:Math.atan(Math.tan(e.fov*.5)/e.aspectRatio)*2,e._near=e.near,e._far=e.far,e._sseDenominator=2*Math.tan(.5*e._fovy),e._xOffset=e.xOffset,e._yOffset=e.yOffset;let n=e._offCenterFrustum;n.top=e.near*Math.tan(.5*e._fovy),n.bottom=-n.top,n.right=e.aspectRatio*n.top,n.left=-n.right,n.near=e.near,n.far=e.far,n.right+=e.xOffset,n.left+=e.xOffset,n.top+=e.yOffset,n.bottom+=e.yOffset}Object.defineProperties(nd.prototype,{projectionMatrix:{get:function(){return Bh(this),this._offCenterFrustum.projectionMatrix}},infiniteProjectionMatrix:{get:function(){return Bh(this),this._offCenterFrustum.infiniteProjectionMatrix}},fovy:{get:function(){return Bh(this),this._fovy}},sseDenominator:{get:function(){return Bh(this),this._sseDenominator}},offCenterFrustum:{get:function(){return Bh(this),this._offCenterFrustum}}});nd.prototype.computeCullingVolume=function(e,t,n){return Bh(this),this._offCenterFrustum.computeCullingVolume(e,t,n)};nd.prototype.getPixelDimensions=function(e,t,n,i,o){return Bh(this),this._offCenterFrustum.getPixelDimensions(e,t,n,i,o)};nd.prototype.clone=function(e){return l(e)||(e=new nd),e.aspectRatio=this.aspectRatio,e.fov=this.fov,e.near=this.near,e.far=this.far,e._aspectRatio=void 0,e._fov=void 0,e._near=void 0,e._far=void 0,this._offCenterFrustum.clone(e._offCenterFrustum),e};nd.prototype.equals=function(e){return!l(e)||!(e instanceof nd)?!1:(Bh(this),Bh(e),this.fov===e.fov&&this.aspectRatio===e.aspectRatio&&this._offCenterFrustum.equals(e._offCenterFrustum))};nd.prototype.equalsEpsilon=function(e,t,n){return!l(e)||!(e instanceof nd)?!1:(Bh(this),Bh(e),W.equalsEpsilon(this.fov,e.fov,t,n)&&W.equalsEpsilon(this.aspectRatio,e.aspectRatio,t,n)&&this._offCenterFrustum.equalsEpsilon(e._offCenterFrustum,t,n))};var Gi=nd;var UWi=T(S(),1);var EWi=T(S(),1),yF=`in vec2 v_textureCoordinates; const float M_PI = 3.141592653589793; float vdcRadicalInverse(int i) { float r; float base = 2.0; float value = 0.0; float invBase = 1.0 / base; float invBi = invBase; for (int x = 0; x < 100; x++) { if (i <= 0) { break; } r = mod(float(i), base); value += r * invBi; invBi *= invBase; i = int(float(i) * invBase); } return value; } vec2 hammersley2D(int i, int N) { return vec2(float(i) / float(N), vdcRadicalInverse(i)); } vec3 importanceSampleGGX(vec2 xi, float alphaRoughness, vec3 N) { float alphaRoughnessSquared = alphaRoughness * alphaRoughness; float phi = 2.0 * M_PI * xi.x; float cosTheta = sqrt((1.0 - xi.y) / (1.0 + (alphaRoughnessSquared - 1.0) * xi.y)); float sinTheta = sqrt(1.0 - cosTheta * cosTheta); vec3 H = vec3(sinTheta * cos(phi), sinTheta * sin(phi), cosTheta); vec3 upVector = abs(N.z) < 0.999 ? vec3(0.0, 0.0, 1.0) : vec3(1.0, 0.0, 0.0); vec3 tangentX = normalize(cross(upVector, N)); vec3 tangentY = cross(N, tangentX); return tangentX * H.x + tangentY * H.y + N * H.z; } /** * Estimate the geometric self-shadowing of the microfacets in a surface, * using the Smith Joint GGX visibility function. * Note: Vis = G / (4 * NdotL * NdotV) * see Eric Heitz. 2014. Understanding the Masking-Shadowing Function in Microfacet-Based BRDFs. Journal of Computer Graphics Techniques, 3 * see Real-Time Rendering. Page 331 to 336. * see https://google.github.io/filament/Filament.md.html#materialsystem/specularbrdf/geometricshadowing(specularg) * * @param {float} alphaRoughness The roughness of the material, expressed as the square of perceptual roughness. * @param {float} NdotL The cosine of the angle between the surface normal and the direction to the light source. * @param {float} NdotV The cosine of the angle between the surface normal and the direction to the camera. */ float smithVisibilityGGX(float alphaRoughness, float NdotL, float NdotV) { float alphaRoughnessSq = alphaRoughness * alphaRoughness; float GGXV = NdotL * sqrt(NdotV * NdotV * (1.0 - alphaRoughnessSq) + alphaRoughnessSq); float GGXL = NdotV * sqrt(NdotL * NdotL * (1.0 - alphaRoughnessSq) + alphaRoughnessSq); float GGX = GGXV + GGXL; // 2.0 if NdotL = NdotV = 1.0 if (GGX > 0.0) { return 0.5 / GGX; // 1/4 if NdotL = NdotV = 1.0 } return 0.0; } vec2 integrateBrdf(float roughness, float NdotV) { vec3 V = vec3(sqrt(1.0 - NdotV * NdotV), 0.0, NdotV); float A = 0.0; float B = 0.0; const int NumSamples = 1024; float alphaRoughness = roughness * roughness; for (int i = 0; i < NumSamples; i++) { vec2 xi = hammersley2D(i, NumSamples); vec3 H = importanceSampleGGX(xi, alphaRoughness, vec3(0.0, 0.0, 1.0)); vec3 L = 2.0 * dot(V, H) * H - V; float NdotL = clamp(L.z, 0.0, 1.0); float NdotH = clamp(H.z, 0.0, 1.0); float VdotH = clamp(dot(V, H), 0.0, 1.0); if (NdotL > 0.0) { float G = smithVisibilityGGX(alphaRoughness, NdotL, NdotV); float G_Vis = 4.0 * G * VdotH * NdotL / NdotH; float Fc = pow(1.0 - VdotH, 5.0); A += (1.0 - Fc) * G_Vis; B += Fc * G_Vis; } } return vec2(A, B) / float(NumSamples); } void main() { out_FragColor = vec4(integrateBrdf(v_textureCoordinates.y, v_textureCoordinates.x), 0.0, 1.0); } `;function xF(){this._colorTexture=void 0,this._drawCommand=void 0}Object.defineProperties(xF.prototype,{colorTexture:{get:function(){return this._colorTexture}}});function Mlt(e,t,n){let i=t.createViewportQuadCommand(yF,{framebuffer:n,renderState:Ue.fromCache({viewport:new He(0,0,256,256)})});e._drawCommand=i}xF.prototype.update=function(e){if(!l(this._colorTexture)){let t=e.context,n=new Wt({context:t,width:256,height:256,pixelFormat:ot.RGBA,pixelDatatype:je.UNSIGNED_BYTE,sampler:$t.NEAREST});this._colorTexture=n;let i=new Ar({context:t,colorTextures:[n],destroyAttachments:!1});Mlt(this,t,i),this._drawCommand.execute(t),i.destroy(),this._drawCommand.shaderProgram=this._drawCommand.shaderProgram&&this._drawCommand.shaderProgram.destroy()}};xF.prototype.isDestroyed=function(){return!1};xF.prototype.destroy=function(){return this._colorTexture=this._colorTexture&&this._colorTexture.destroy(),me(this)};var _F=xF;var X2i=T(S(),1);var $Wi=T(S(),1);var Oye={};function Nlt(e,t,n){let i,o,r;if(e instanceof Gi){let s=Math.tan(.5*e.fovy);return i=e.near,o=e.near*s,r=e.aspectRatio*o,Math.max(t*i/r,n*i/o)}else if(e instanceof yl)return i=e.near,o=e.top,r=e.right,Math.max(t*i/r,n*i/o);return Math.max(t,n)}var klt=new m,Uye=new m;function Yye(e,t,n,i){if(l(i)&&n(.5)>i){let o=n(0),r=n(1),s=n(.5),a=s-o,c=s-r;return function(d){let u=n(d);if(d<=.5){let p=(u-o)/a;return W.lerp(e,-W.PI_OVER_TWO,p)}let h=(u-r)/c;return W.lerp(-W.PI_OVER_TWO,t,1-h)}}return function(o){return W.lerp(e,t,o)}}function Mj(e,t,n,i,o){let r=o,s=Math.max(n,i);if(!l(r)){let a=e.position,c=t,d=e.up,u=e.right,h=e.frustum,p=m.subtract(a,c,klt),g=m.magnitude(m.multiplyByScalar(d,m.dot(p,d),Uye)),f=m.magnitude(m.multiplyByScalar(u,m.dot(p,u),Uye));r=Math.min(Nlt(h,g,f)*.2,1e9)}if(s<r){let d=-Math.pow((r-n)*1e6,.125),u=Math.pow((r-i)*1e6,1/8);return function(h){let p=h*(u-d)+d;return-Math.pow(p,8)/1e6+r}}return function(a){return W.lerp(n,i,a)}}function TF(e,t){return W.equalsEpsilon(e,W.TWO_PI,W.EPSILON11)&&(e=0),t>e+Math.PI?e+=W.TWO_PI:t<e-Math.PI&&(e-=W.TWO_PI),e}var Hye=new m;function Ult(e,t,n,i,o,r,s,a){let c=e.camera,d=m.clone(c.position,Hye),u=c.pitch,h=TF(c.heading,i),p=TF(c.roll,r),g=Mj(c,n,d.z,n.z,s),f=Yye(u,o,g,a);function x(_){let C=_.time/t;c.setView({orientation:{heading:W.lerp(h,i,C),pitch:f(C),roll:W.lerp(p,r,C)}}),D.lerp(d,n,C,c.position),c.position.z=g(C)}return x}function Dlt(e,t){e.longitude<t.longitude?e.longitude+=W.TWO_PI:t.longitude+=W.TWO_PI}function Blt(e,t){let n=e.longitude-t.longitude;n<-W.PI?e.longitude+=W.TWO_PI:n>W.PI&&(t.longitude+=W.TWO_PI)}var Olt=new he,Ylt=new he;function Hlt(e,t,n,i,o,r,s,a,c,d){let u=e.camera,p=e.mapProjection.ellipsoid,g=he.clone(u.positionCartographic,Olt),f=u.pitch,x=TF(u.heading,i),_=TF(u.roll,r),C=p.cartesianToCartographic(n,Ylt);g.longitude=W.zeroToTwoPi(g.longitude),C.longitude=W.zeroToTwoPi(C.longitude);let V=!1;if(l(a)){let I=W.zeroToTwoPi(a),v=Math.min(g.longitude,C.longitude),P=Math.max(g.longitude,C.longitude),w=I>=v&&I<=P;if(l(c)){let A=Math.abs(g.longitude-C.longitude),b=W.TWO_PI-A;(w?A:b)<(w?b:A)*c&&!w&&(V=!0)}else w||(V=!0)}V?Dlt(g,C):Blt(g,C);let L=Mj(u,n,g.height,C.height,s),R=Yye(f,o,L,d);function G(){let I=g.longitude,v=C.longitude,P=g.latitude,w=C.latitude;return function(b){let Z=b.time/t,E=m.fromRadians(W.lerp(I,v,Z),W.lerp(P,w,Z),L(Z),p);u.setView({destination:E,orientation:{heading:W.lerp(x,i,Z),pitch:R(Z),roll:W.lerp(_,r,Z)}})}}return G()}function zlt(e,t,n,i,o,r,s){let a=e.camera,c=m.clone(a.position,Hye),d=TF(a.heading,i),u=a.frustum.right-a.frustum.left,h=Mj(a,n,u,n.z,s);function p(g){let f=g.time/t;a.setView({orientation:{heading:W.lerp(d,i,f)}}),D.lerp(c,n,f,a.position);let x=h(f),_=a.frustum,C=_.top/_.right,V=(x-(_.right-_.left))*.5;_.right+=V,_.left-=V,_.top=C*_.right,_.bottom=-_.top}return p}var Dye=new he,Klt=new m;function Aj(e,t){return{startObject:{},stopObject:{},duration:0,complete:e,cancel:t}}function Bye(e,t){function n(){typeof t=="function"&&t(),e.enableInputs=!0}return n}Oye.createTween=function(e,t){t=y(t,y.EMPTY_OBJECT);let n=t.destination,i=e.mode;if(i===oe.MORPHING)return Aj();let o=y(t.convert,!0),r=e.mapProjection,s=r.ellipsoid,a=t.maximumHeight,c=t.flyOverLongitude,d=t.flyOverLongitudeWeight,u=t.pitchAdjustHeight,h=t.easingFunction;o&&i!==oe.SCENE3D&&(s.cartesianToCartographic(n,Dye),n=r.project(Dye,Klt));let p=e.camera,g=t.endTransform;l(g)&&p._setTransform(g);let f=t.duration;l(f)||(f=Math.ceil(m.distance(p.position,n)/1e6)+2,f=Math.min(f,3));let x=y(t.heading,0),_=y(t.pitch,-W.PI_OVER_TWO),C=y(t.roll,0),V=e.screenSpaceCameraController;V.enableInputs=!1;let L=Bye(V,t.complete),R=Bye(V,t.cancel),G=p.frustum,I=e.mode===oe.SCENE2D;if(I=I&&D.equalsEpsilon(p.position,n,W.EPSILON6),I=I&&W.equalsEpsilon(Math.max(G.right-G.left,G.top-G.bottom),n.z,W.EPSILON6),I=I||e.mode!==oe.SCENE2D&&m.equalsEpsilon(n,p.position,W.EPSILON10),I=I&&W.equalsEpsilon(W.negativePiToPi(x),W.negativePiToPi(p.heading),W.EPSILON10)&&W.equalsEpsilon(W.negativePiToPi(_),W.negativePiToPi(p.pitch),W.EPSILON10)&&W.equalsEpsilon(W.negativePiToPi(C),W.negativePiToPi(p.roll),W.EPSILON10),I)return Aj(L,R);let v=new Array(4);if(v[oe.SCENE2D]=zlt,v[oe.SCENE3D]=Hlt,v[oe.COLUMBUS_VIEW]=Ult,f<=0)return Aj(function(){v[i](e,1,n,x,_,C,a,c,d,u)({time:1}),typeof L=="function"&&L()},R);let P=v[i](e,f,n,x,_,C,a,c,d,u);if(!l(h)){let w=p.positionCartographic.height,A=i===oe.SCENE3D?s.cartesianToCartographic(n).height:n.z;w>A&&w>11500?h=Qr.CUBIC_OUT:h=Qr.QUINTIC_IN_OUT}return{duration:f,easingFunction:h,startObject:{time:0},stopObject:{time:f},update:P,complete:L,cancel:R}};var SF=Oye;var t2i=T(S(),1),Jlt={ROTATE:0,INFINITE_SCROLL:1},id=Object.freeze(Jlt);function nn(e){this._scene=e,this._transform=M.clone(M.IDENTITY),this._invTransform=M.clone(M.IDENTITY),this._actualTransform=M.clone(M.IDENTITY),this._actualInvTransform=M.clone(M.IDENTITY),this._transformChanged=!1,this.position=new m,this._position=new m,this._positionWC=new m,this._positionCartographic=new he,this._oldPositionWC=void 0,this.positionWCDeltaMagnitude=0,this.positionWCDeltaMagnitudeLastFrame=0,this.timeSinceMoved=0,this._lastMovedTimestamp=0,this.direction=new m,this._direction=new m,this._directionWC=new m,this.up=new m,this._up=new m,this._upWC=new m,this.right=new m,this._right=new m,this._rightWC=new m,this.frustum=new Gi,this.frustum.aspectRatio=e.drawingBufferWidth/e.drawingBufferHeight,this.frustum.fov=W.toRadians(60),this.defaultMoveAmount=1e5,this.defaultLookAmount=Math.PI/60,this.defaultRotateAmount=Math.PI/3600,this.defaultZoomAmount=1e5,this.constrainedAxis=void 0,this.maximumZoomFactor=1.5,this._moveStart=new be,this._moveEnd=new be,this._changed=new be,this._changedPosition=void 0,this._changedDirection=void 0,this._changedFrustum=void 0,this._changedHeading=void 0,this._changedRoll=void 0,this.percentageChanged=.5,this._viewMatrix=new M,this._invViewMatrix=new M,exe(this),this._mode=oe.SCENE3D,this._modeChanged=!0;let t=e.mapProjection;this._projection=t,this._maxCoord=t.project(new he(Math.PI,W.PI_OVER_TWO)),this._max2Dfrustum=void 0,mxe(this,nn.DEFAULT_VIEW_RECTANGLE,this.position,!0);let n=m.magnitude(this.position);n+=n*nn.DEFAULT_VIEW_FACTOR,m.normalize(this.position,this.position),m.multiplyByScalar(this.position,n,this.position)}nn.TRANSFORM_2D=new M(0,0,1,0,1,0,0,0,0,1,0,0,0,0,0,1);nn.TRANSFORM_2D_INVERSE=M.inverseTransformation(nn.TRANSFORM_2D,new M);nn.DEFAULT_VIEW_RECTANGLE=le.fromDegrees(-95,-20,-70,90);nn.DEFAULT_VIEW_FACTOR=.5;nn.DEFAULT_OFFSET=new rm(0,-W.PI_OVER_FOUR,0);function exe(e){M.computeView(e._position,e._direction,e._up,e._right,e._viewMatrix),M.multiply(e._viewMatrix,e._actualInvTransform,e._viewMatrix),M.inverseTransformation(e._viewMatrix,e._invViewMatrix)}function Qlt(e){if(!l(e._oldPositionWC))e._oldPositionWC=m.clone(e.positionWC,e._oldPositionWC);else{e.positionWCDeltaMagnitudeLastFrame=e.positionWCDeltaMagnitude;let t=m.subtract(e.positionWC,e._oldPositionWC,e._oldPositionWC);e.positionWCDeltaMagnitude=m.magnitude(t),e._oldPositionWC=m.clone(e.positionWC,e._oldPositionWC),e.positionWCDeltaMagnitude>0?(e.timeSinceMoved=0,e._lastMovedTimestamp=Si()):e.timeSinceMoved=Math.max(Si()-e._lastMovedTimestamp,0)/1e3}}nn.prototype.canPreloadFlight=function(){return l(this._currentFlight)&&this._mode!==oe.SCENE2D};nn.prototype._updateCameraChanged=function(){let e=this;if(Qlt(e),e._changed.numberOfListeners===0)return;let t=e.percentageChanged,n=e.heading;l(e._changedHeading)||(e._changedHeading=n);let i=Math.abs(e._changedHeading-n)%W.TWO_PI;i=i>W.PI?W.TWO_PI-i:i;let o=i/Math.PI;o>t&&(e._changedHeading=n);let r=e.roll;l(e._changedRoll)||(e._changedRoll=r);let s=Math.abs(e._changedRoll-r)%W.TWO_PI;s=s>W.PI?W.TWO_PI-s:s;let a=s/Math.PI;if(a>t&&(e._changedRoll=r),(a>t||o>t)&&e._changed.raiseEvent(Math.max(a,o)),e._mode===oe.SCENE2D){if(!l(e._changedFrustum)){e._changedPosition=m.clone(e.position,e._changedPosition),e._changedFrustum=e.frustum.clone();return}let p=e.position,g=e._changedPosition,f=e.frustum,x=e._changedFrustum,_=p.x+f.left,C=p.x+f.right,V=g.x+x.left,L=g.x+x.right,R=p.y+f.bottom,G=p.y+f.top,I=g.y+x.bottom,v=g.y+x.top,P=Math.max(_,V),w=Math.min(C,L),A=Math.max(R,I),b=Math.min(G,v),Z;if(P>=w||A>=G)Z=1;else{let E=x;_<V&&C>L&&R<I&&G>v&&(E=f),Z=1-(w-P)*(b-A)/((E.right-E.left)*(E.top-E.bottom))}Z>t&&(e._changed.raiseEvent(Z),e._changedPosition=m.clone(e.position,e._changedPosition),e._changedFrustum=e.frustum.clone(e._changedFrustum));return}if(!l(e._changedDirection)){e._changedPosition=m.clone(e.positionWC,e._changedPosition),e._changedDirection=m.clone(e.directionWC,e._changedDirection);return}let c=W.acosClamped(m.dot(e.directionWC,e._changedDirection)),d;l(e.frustum.fovy)?d=c/(e.frustum.fovy*.5):d=c;let h=m.distance(e.positionWC,e._changedPosition)/e.positionCartographic.height;(d>t||h>t)&&(e._changed.raiseEvent(Math.max(d,h)),e._changedPosition=m.clone(e.positionWC,e._changedPosition),e._changedDirection=m.clone(e.directionWC,e._changedDirection))};function jlt(e){wt.basisTo2D(e._projection,e._transform,e._actualTransform)}var qlt=new he,$lt=new m,g3=new m,edt=new re,tdt=new re,ndt=new re,idt=new re,odt=new re;function rdt(e){let t=e._projection,n=t.ellipsoid,i=M.getColumn(e._transform,3,edt),o=n.cartesianToCartographic(i,qlt),r=t.project(o,$lt),s=tdt;s.x=r.z,s.y=r.x,s.z=r.y,s.w=1;let a=re.clone(re.UNIT_X,odt),c=re.add(M.getColumn(e._transform,0,g3),i,g3);n.cartesianToCartographic(c,o),t.project(o,r);let d=ndt;d.x=r.z,d.y=r.x,d.z=r.y,d.w=0,m.subtract(d,s,d),d.x=0;let u=idt;if(m.magnitudeSquared(d)>W.EPSILON10)m.cross(a,d,u);else{let h=re.add(M.getColumn(e._transform,1,g3),i,g3);n.cartesianToCartographic(h,o),t.project(o,r),u.x=r.z,u.y=r.x,u.z=r.y,u.w=0,m.subtract(u,s,u),u.x=0,m.magnitudeSquared(u)<W.EPSILON10&&(re.clone(re.UNIT_Y,d),re.clone(re.UNIT_Z,u))}m.cross(u,a,d),m.normalize(d,d),m.cross(a,d,u),m.normalize(u,u),M.setColumn(e._actualTransform,0,d,e._actualTransform),M.setColumn(e._actualTransform,1,u,e._actualTransform),M.setColumn(e._actualTransform,2,a,e._actualTransform),M.setColumn(e._actualTransform,3,s,e._actualTransform)}var Nj=new m;function Ec(e){let t=e._mode,n=!1,i=0;t===oe.SCENE2D&&(i=e.frustum.right-e.frustum.left,n=i!==e._positionCartographic.height);let o=e._position,r=!m.equals(o,e.position)||n;r&&(o=m.clone(e.position,e._position));let s=e._direction,a=!m.equals(s,e.direction);a&&(m.normalize(e.direction,e.direction),s=m.clone(e.direction,e._direction));let c=e._up,d=!m.equals(c,e.up);d&&(m.normalize(e.up,e.up),c=m.clone(e.up,e._up));let u=e._right,h=!m.equals(u,e.right);h&&(m.normalize(e.right,e.right),u=m.clone(e.right,e._right));let p=e._transformChanged||e._modeChanged;e._transformChanged=!1,p&&(M.inverseTransformation(e._transform,e._invTransform),e._mode===oe.COLUMBUS_VIEW||e._mode===oe.SCENE2D?M.equals(M.IDENTITY,e._transform)?M.clone(nn.TRANSFORM_2D,e._actualTransform):e._mode===oe.COLUMBUS_VIEW?jlt(e):rdt(e):M.clone(e._transform,e._actualTransform),M.inverseTransformation(e._actualTransform,e._actualInvTransform),e._modeChanged=!1);let g=e._actualTransform;if(r||p)if(e._positionWC=M.multiplyByPoint(g,o,e._positionWC),t===oe.SCENE3D||t===oe.MORPHING)e._positionCartographic=e._projection.ellipsoid.cartesianToCartographic(e._positionWC,e._positionCartographic);else{let f=Nj;f.x=e._positionWC.y,f.y=e._positionWC.z,f.z=e._positionWC.x,t===oe.SCENE2D&&(f.z=i),e._projection.unproject(f,e._positionCartographic)}if(a||d||h){let f=m.dot(s,m.cross(c,u,Nj));if(Math.abs(1-f)>W.EPSILON2){let x=1/m.magnitudeSquared(c),_=m.dot(c,s)*x,C=m.multiplyByScalar(s,_,Nj);c=m.normalize(m.subtract(c,C,e._up),e._up),m.clone(c,e.up),u=m.cross(s,c,e._right),m.clone(u,e.right)}}(a||p)&&(e._directionWC=M.multiplyByPointAsVector(g,s,e._directionWC),m.normalize(e._directionWC,e._directionWC)),(d||p)&&(e._upWC=M.multiplyByPointAsVector(g,c,e._upWC),m.normalize(e._upWC,e._upWC)),(h||p)&&(e._rightWC=M.multiplyByPointAsVector(g,u,e._rightWC),m.normalize(e._rightWC,e._rightWC)),(r||a||d||h||p)&&exe(e)}function txe(e,t){let n;return W.equalsEpsilon(Math.abs(e.z),1,W.EPSILON3)?n=Math.atan2(t.y,t.x)-W.PI_OVER_TWO:n=Math.atan2(e.y,e.x)-W.PI_OVER_TWO,W.TWO_PI-W.zeroToTwoPi(n)}function nxe(e){return W.PI_OVER_TWO-W.acosClamped(e.z)}function ixe(e,t,n){let i=0;return W.equalsEpsilon(Math.abs(e.z),1,W.EPSILON3)||(i=Math.atan2(-n.z,t.z),i=W.zeroToTwoPi(i+W.TWO_PI)),i}var _3=new M,T3=new M;Object.defineProperties(nn.prototype,{transform:{get:function(){return this._transform}},inverseTransform:{get:function(){return Ec(this),this._invTransform}},viewMatrix:{get:function(){return Ec(this),this._viewMatrix}},inverseViewMatrix:{get:function(){return Ec(this),this._invViewMatrix}},positionCartographic:{get:function(){return Ec(this),this._positionCartographic}},positionWC:{get:function(){return Ec(this),this._positionWC}},directionWC:{get:function(){return Ec(this),this._directionWC}},upWC:{get:function(){return Ec(this),this._upWC}},rightWC:{get:function(){return Ec(this),this._rightWC}},heading:{get:function(){if(this._mode!==oe.MORPHING){let e=this._projection.ellipsoid,t=M.clone(this._transform,_3),n=wt.eastNorthUpToFixedFrame(this.positionWC,e,T3);this._setTransform(n);let i=txe(this.direction,this.up);return this._setTransform(t),i}}},pitch:{get:function(){if(this._mode!==oe.MORPHING){let e=this._projection.ellipsoid,t=M.clone(this._transform,_3),n=wt.eastNorthUpToFixedFrame(this.positionWC,e,T3);this._setTransform(n);let i=nxe(this.direction);return this._setTransform(t),i}}},roll:{get:function(){if(this._mode!==oe.MORPHING){let e=this._projection.ellipsoid,t=M.clone(this._transform,_3),n=wt.eastNorthUpToFixedFrame(this.positionWC,e,T3);this._setTransform(n);let i=ixe(this.direction,this.up,this.right);return this._setTransform(t),i}}},moveStart:{get:function(){return this._moveStart}},moveEnd:{get:function(){return this._moveEnd}},changed:{get:function(){return this._changed}}});nn.prototype.update=function(e){let t=!1;if(e!==this._mode&&(this._mode=e,this._modeChanged=e!==oe.MORPHING,t=this._mode===oe.SCENE2D),t){let n=this._max2Dfrustum=this.frustum.clone(),i=2,o=n.top/n.right;n.right=this._maxCoord.x*i,n.left=-n.right,n.top=o*n.right,n.bottom=-n.top}this._mode===oe.SCENE2D&&axe(this,this.position)};var sdt=new m,adt=new m,cdt=new m;nn.prototype._setTransform=function(e){let t=m.clone(this.positionWC,sdt),n=m.clone(this.upWC,adt),i=m.clone(this.directionWC,cdt);M.clone(e,this._transform),this._transformChanged=!0,Ec(this);let o=this._actualInvTransform;M.multiplyByPoint(o,t,this.position),M.multiplyByPointAsVector(o,i,this.direction),M.multiplyByPointAsVector(o,n,this.up),m.cross(this.direction,this.up,this.right),Ec(this)};var ldt=new D,ddt=new gn,udt=new m,mdt=new m;function oxe(e){if(!M.equals(M.IDENTITY,e.transform))return m.magnitude(e.position);let t=e._scene,n=t.globe,i=ldt;i.x=t.drawingBufferWidth/2,i.y=t.drawingBufferHeight/2;let o;if(l(n)){let a=e.getPickRay(i,ddt);o=n.pickWorldCoordinates(a,t,!0,udt)}let r;t.pickPositionSupported&&(r=t.pickPositionWorldCoordinates(i,mdt));let s;if(l(o)||l(r)){let a=l(r)?m.distance(r,e.positionWC):Number.POSITIVE_INFINITY,c=l(o)?m.distance(o,e.positionWC):Number.POSITIVE_INFINITY;s=Math.min(a,c)}else s=Math.max(e.positionCartographic.height,0);return s}nn.prototype._adjustOrthographicFrustum=function(e){this.frustum instanceof ln&&(!e&&this._positionCartographic.height<15e4||(this.frustum.width=oxe(this)))};var S3=new m,Oj=new M,hdt=new M,Yj=new Fe,Hj=new $,rxe=new he;function fdt(e,t,n){let i=M.clone(e.transform,Oj),o=wt.eastNorthUpToFixedFrame(t,e._projection.ellipsoid,hdt);e._setTransform(o),m.clone(m.ZERO,e.position),n.heading=n.heading-W.PI_OVER_TWO;let r=Fe.fromHeadingPitchRoll(n,Yj),s=$.fromQuaternion(r,Hj);$.getColumn(s,0,e.direction),$.getColumn(s,2,e.up),m.cross(e.direction,e.up,e.right),e._setTransform(i),e._adjustOrthographicFrustum(!0)}function pdt(e,t,n,i){let o=M.clone(e.transform,Oj);if(e._setTransform(M.IDENTITY),!m.equals(t,e.positionWC)){if(i){let a=e._projection,c=a.ellipsoid.cartesianToCartographic(t,rxe);t=a.project(c,S3)}m.clone(t,e.position)}n.heading=n.heading-W.PI_OVER_TWO;let r=Fe.fromHeadingPitchRoll(n,Yj),s=$.fromQuaternion(r,Hj);$.getColumn(s,0,e.direction),$.getColumn(s,2,e.up),m.cross(e.direction,e.up,e.right),e._setTransform(o),e._adjustOrthographicFrustum(!0)}function bdt(e,t,n,i){let o=M.clone(e.transform,Oj);if(e._setTransform(M.IDENTITY),!m.equals(t,e.positionWC)){if(i){let c=e._projection,d=c.ellipsoid.cartesianToCartographic(t,rxe);t=c.project(d,S3)}D.clone(t,e.position);let r=-t.z*.5,s=-r,a=e.frustum;if(s>r){let c=a.top/a.right;a.right=s,a.left=r,a.top=a.right*c,a.bottom=-a.top}}if(e._scene.mapMode2D===id.ROTATE){n.heading=n.heading-W.PI_OVER_TWO,n.pitch=-W.PI_OVER_TWO,n.roll=0;let r=Fe.fromHeadingPitchRoll(n,Yj),s=$.fromQuaternion(r,Hj);$.getColumn(s,2,e.up),m.cross(e.direction,e.up,e.right)}e._setTransform(o)}var gdt=new m,ydt=new m,xdt=new m;function sxe(e,t,n,i){let o=m.clone(n.direction,gdt),r=m.clone(n.up,ydt);if(e._scene.mode===oe.SCENE3D){let a=e._projection.ellipsoid,c=wt.eastNorthUpToFixedFrame(t,a,_3),d=M.inverseTransformation(c,T3);M.multiplyByPointAsVector(d,o,o),M.multiplyByPointAsVector(d,r,r)}let s=m.cross(o,r,xdt);return i.heading=txe(o,r),i.pitch=nxe(o),i.roll=ixe(o,r,s),i}var Bj={destination:void 0,orientation:{direction:void 0,up:void 0,heading:void 0,pitch:void 0,roll:void 0},convert:void 0,endTransform:void 0},fL=new Xa;nn.prototype.setView=function(e){e=y(e,y.EMPTY_OBJECT);let t=y(e.orientation,y.EMPTY_OBJECT),n=this._mode;if(n===oe.MORPHING)return;l(e.endTransform)&&this._setTransform(e.endTransform);let i=y(e.convert,!0),o=y(e.destination,m.clone(this.positionWC,S3));l(o)&&l(o.west)&&(o=this.getRectangleCameraCoordinates(o,S3),i=!1),l(t.direction)&&(t=sxe(this,o,t,Bj.orientation)),fL.heading=y(t.heading,0),fL.pitch=y(t.pitch,-W.PI_OVER_TWO),fL.roll=y(t.roll,0),n===oe.SCENE3D?fdt(this,o,fL):n===oe.SCENE2D?bdt(this,o,fL,i):pdt(this,o,fL,i)};var _dt=new m;nn.prototype.flyHome=function(e){let t=this._mode;if(t===oe.MORPHING&&this._scene.completeMorph(),t===oe.SCENE2D)this.flyTo({destination:nn.DEFAULT_VIEW_RECTANGLE,duration:e,endTransform:M.IDENTITY});else if(t===oe.SCENE3D){let n=this.getRectangleCameraCoordinates(nn.DEFAULT_VIEW_RECTANGLE),i=m.magnitude(n);i+=i*nn.DEFAULT_VIEW_FACTOR,m.normalize(n,n),m.multiplyByScalar(n,i,n),this.flyTo({destination:n,duration:e,endTransform:M.IDENTITY})}else if(t===oe.COLUMBUS_VIEW){let n=this._projection.ellipsoid.maximumRadius,i=new m(0,-1,1);i=m.multiplyByScalar(m.normalize(i,i),5*n,i),this.flyTo({destination:i,duration:e,orientation:{heading:0,pitch:-Math.acos(m.normalize(i,_dt).z),roll:0},endTransform:M.IDENTITY,convert:!1})}};nn.prototype.worldToCameraCoordinates=function(e,t){return l(t)||(t=new re),Ec(this),M.multiplyByVector(this._actualInvTransform,e,t)};nn.prototype.worldToCameraCoordinatesPoint=function(e,t){return l(t)||(t=new m),Ec(this),M.multiplyByPoint(this._actualInvTransform,e,t)};nn.prototype.worldToCameraCoordinatesVector=function(e,t){return l(t)||(t=new m),Ec(this),M.multiplyByPointAsVector(this._actualInvTransform,e,t)};nn.prototype.cameraToWorldCoordinates=function(e,t){return l(t)||(t=new re),Ec(this),M.multiplyByVector(this._actualTransform,e,t)};nn.prototype.cameraToWorldCoordinatesPoint=function(e,t){return l(t)||(t=new m),Ec(this),M.multiplyByPoint(this._actualTransform,e,t)};nn.prototype.cameraToWorldCoordinatesVector=function(e,t){return l(t)||(t=new m),Ec(this),M.multiplyByPointAsVector(this._actualTransform,e,t)};function axe(e,t){let n=e._scene.mapMode2D===id.ROTATE,i=e._maxCoord.x,o=e._maxCoord.y,r,s;n?(s=i,r=-s):(s=t.x-i*2,r=t.x+i*2),t.x>i&&(t.x=s),t.x<-i&&(t.x=r),t.y>o&&(t.y=o),t.y<-o&&(t.y=-o)}var zye=new m;nn.prototype.move=function(e,t){let n=this.position;m.multiplyByScalar(e,t,zye),m.add(n,zye,n),this._mode===oe.SCENE2D&&axe(this,n),this._adjustOrthographicFrustum(!0)};nn.prototype.moveForward=function(e){e=y(e,this.defaultMoveAmount),this._mode===oe.SCENE2D?C3(this,e):this.move(this.direction,e)};nn.prototype.moveBackward=function(e){e=y(e,this.defaultMoveAmount),this._mode===oe.SCENE2D?C3(this,-e):this.move(this.direction,-e)};nn.prototype.moveUp=function(e){e=y(e,this.defaultMoveAmount),this.move(this.up,e)};nn.prototype.moveDown=function(e){e=y(e,this.defaultMoveAmount),this.move(this.up,-e)};nn.prototype.moveRight=function(e){e=y(e,this.defaultMoveAmount),this.move(this.right,e)};nn.prototype.moveLeft=function(e){e=y(e,this.defaultMoveAmount),this.move(this.right,-e)};nn.prototype.lookLeft=function(e){e=y(e,this.defaultLookAmount),this._mode!==oe.SCENE2D&&this.look(this.up,-e)};nn.prototype.lookRight=function(e){e=y(e,this.defaultLookAmount),this._mode!==oe.SCENE2D&&this.look(this.up,e)};nn.prototype.lookUp=function(e){e=y(e,this.defaultLookAmount),this._mode!==oe.SCENE2D&&this.look(this.right,-e)};nn.prototype.lookDown=function(e){e=y(e,this.defaultLookAmount),this._mode!==oe.SCENE2D&&this.look(this.right,e)};var Tdt=new Fe,Sdt=new $;nn.prototype.look=function(e,t){let n=y(t,this.defaultLookAmount),i=Fe.fromAxisAngle(e,-n,Tdt),o=$.fromQuaternion(i,Sdt),r=this.direction,s=this.up,a=this.right;$.multiplyByVector(o,r,r),$.multiplyByVector(o,s,s),$.multiplyByVector(o,a,a)};nn.prototype.twistLeft=function(e){e=y(e,this.defaultLookAmount),this.look(this.direction,e)};nn.prototype.twistRight=function(e){e=y(e,this.defaultLookAmount),this.look(this.direction,-e)};var Cdt=new Fe,Vdt=new $;nn.prototype.rotate=function(e,t){let n=y(t,this.defaultRotateAmount),i=Fe.fromAxisAngle(e,-n,Cdt),o=$.fromQuaternion(i,Vdt);$.multiplyByVector(o,this.position,this.position),$.multiplyByVector(o,this.direction,this.direction),$.multiplyByVector(o,this.up,this.up),m.cross(this.direction,this.up,this.right),m.cross(this.right,this.direction,this.up),this._adjustOrthographicFrustum(!1)};nn.prototype.rotateDown=function(e){e=y(e,this.defaultRotateAmount),cxe(this,e)};nn.prototype.rotateUp=function(e){e=y(e,this.defaultRotateAmount),cxe(this,-e)};var Ldt=new m,Rdt=new m,Zdt=new m,Kye=new m;function cxe(e,t){let n=e.position;if(l(e.constrainedAxis)&&!m.equalsEpsilon(e.position,m.ZERO,W.EPSILON2)){let i=m.normalize(n,Ldt),o=m.equalsEpsilon(i,e.constrainedAxis,W.EPSILON2),r=m.equalsEpsilon(i,m.negate(e.constrainedAxis,Kye),W.EPSILON2);if(!o&&!r){let s=m.normalize(e.constrainedAxis,Rdt),a=m.dot(i,s),c=W.acosClamped(a);t>0&&t>c&&(t=c-W.EPSILON4),a=m.dot(i,m.negate(s,Kye)),c=W.acosClamped(a),t<0&&-t>c&&(t=-c+W.EPSILON4);let d=m.cross(s,i,Zdt);e.rotate(d,t)}else(o&&t<0||r&&t>0)&&e.rotate(e.right,t)}else e.rotate(e.right,t)}nn.prototype.rotateRight=function(e){e=y(e,this.defaultRotateAmount),lxe(this,-e)};nn.prototype.rotateLeft=function(e){e=y(e,this.defaultRotateAmount),lxe(this,e)};function lxe(e,t){l(e.constrainedAxis)?e.rotate(e.constrainedAxis,t):e.rotate(e.up,t)}function C3(e,t){let n=e.frustum,i;if(t=t*.5,Math.abs(n.top)+Math.abs(n.bottom)>Math.abs(n.left)+Math.abs(n.right)){let o=n.top-t,r=n.bottom+t,s=e._maxCoord.y;e._scene.mapMode2D===id.ROTATE&&(s*=e.maximumZoomFactor),r>s&&(r=s,o=-s),o<=r&&(o=1,r=-1),i=n.right/n.top,n.top=o,n.bottom=r,n.right=n.top*i,n.left=-n.right}else{let o=n.right-t,r=n.left+t,s=e._maxCoord.x;e._scene.mapMode2D===id.ROTATE&&(s*=e.maximumZoomFactor),o>s&&(o=s,r=-s),o<=r&&(o=1,r=-1),i=n.top/n.right,n.right=o,n.left=r,n.top=n.right*i,n.bottom=-n.top}}function dxe(e,t){e.move(e.direction,t)}nn.prototype.zoomIn=function(e){e=y(e,this.defaultZoomAmount),this._mode===oe.SCENE2D?C3(this,e):dxe(this,e)};nn.prototype.zoomOut=function(e){e=y(e,this.defaultZoomAmount),this._mode===oe.SCENE2D?C3(this,-e):dxe(this,-e)};nn.prototype.getMagnitude=function(){if(this._mode===oe.SCENE3D)return m.magnitude(this.position);if(this._mode===oe.COLUMBUS_VIEW)return Math.abs(this.position.z);if(this._mode===oe.SCENE2D)return Math.max(this.frustum.right-this.frustum.left,this.frustum.top-this.frustum.bottom)};var Gdt=new M;nn.prototype.lookAt=function(e,t){let n=this._scene,i=y(n.ellipsoid,ne.default),o=wt.eastNorthUpToFixedFrame(e,i,Gdt);this.lookAtTransform(o,t)};var Edt=new m,Idt=new Fe,Xdt=new Fe,Wdt=new $;function uxe(e,t,n){t=W.clamp(t,-W.PI_OVER_TWO,W.PI_OVER_TWO),e=W.zeroToTwoPi(e)-W.PI_OVER_TWO;let i=Fe.fromAxisAngle(m.UNIT_Y,-t,Idt),o=Fe.fromAxisAngle(m.UNIT_Z,-e,Xdt),r=Fe.multiply(o,i,o),s=$.fromQuaternion(r,Wdt),a=m.clone(m.UNIT_X,Edt);return $.multiplyByVector(s,a,a),m.negate(a,a),m.multiplyByScalar(a,n,a),a}nn.prototype.lookAtTransform=function(e,t){if(this._setTransform(e),!l(t))return;let n;if(l(t.heading)?n=uxe(t.heading,t.pitch,t.range):n=t,this._mode===oe.SCENE2D){D.clone(D.ZERO,this.position),m.negate(n,this.up),this.up.z=0,m.magnitudeSquared(this.up)<W.EPSILON10&&m.clone(m.UNIT_Y,this.up),m.normalize(this.up,this.up),this._setTransform(M.IDENTITY),m.negate(m.UNIT_Z,this.direction),m.cross(this.direction,this.up,this.right),m.normalize(this.right,this.right);let i=this.frustum,o=i.top/i.right;i.right=m.magnitude(n)*.5,i.left=-i.right,i.top=o*i.right,i.bottom=-i.top,this._setTransform(e);return}m.clone(n,this.position),m.negate(this.position,this.direction),m.normalize(this.direction,this.direction),m.cross(this.direction,m.UNIT_Z,this.right),m.magnitudeSquared(this.right)<W.EPSILON10&&m.clone(m.UNIT_X,this.right),m.normalize(this.right,this.right),m.cross(this.right,this.direction,this.up),m.normalize(this.up,this.up),this._adjustOrthographicFrustum(!0)};var CF=new he,Pdt=new he,vdt=new m,wdt=new m,Fdt=new m,Adt=new m,Mdt=new m,Ndt=new m,kdt=new m,kj=new m,Udt={direction:new m,right:new m,up:new m},Jye;function Gc(e,t,n,i){return Math.abs(m.dot(t,n))/i-m.dot(e,n)}function mxe(e,t,n,i){let o=e._projection.ellipsoid,r=i?e:Udt,{north:s,south:a,west:c}=t,{east:d}=t;c>d&&(d+=W.TWO_PI);let u=(c+d)*.5,h;if(a<-W.PI_OVER_TWO+W.RADIANS_PER_DEGREE&&s>W.PI_OVER_TWO-W.RADIANS_PER_DEGREE)h=0;else{let w=CF;w.longitude=u,w.latitude=s,w.height=0;let A=Pdt;A.longitude=u,A.latitude=a,A.height=0;let b=Jye;(!l(b)||b.ellipsoid!==o)&&(Jye=b=new kp(void 0,void 0,o)),b.setEndPoints(w,A),h=b.interpolateUsingFraction(.5,CF).latitude}let p=CF;p.longitude=u,p.latitude=h,p.height=0;let g=o.cartographicToCartesian(p,kdt),f=CF;f.longitude=d,f.latitude=s;let x=o.cartographicToCartesian(f,vdt);f.longitude=c;let _=o.cartographicToCartesian(f,Fdt);f.longitude=u;let C=o.cartographicToCartesian(f,Mdt);f.latitude=a;let V=o.cartographicToCartesian(f,Ndt);f.longitude=d;let L=o.cartographicToCartesian(f,Adt);f.longitude=c;let R=o.cartographicToCartesian(f,wdt);m.subtract(_,g,_),m.subtract(L,g,L),m.subtract(x,g,x),m.subtract(R,g,R),m.subtract(C,g,C),m.subtract(V,g,V);let G=o.geodeticSurfaceNormal(g,r.direction);m.negate(G,G);let I=m.cross(G,m.UNIT_Z,r.right);m.normalize(I,I);let v=m.cross(I,G,r.up),P;if(e.frustum instanceof ln){let w=Math.max(m.distance(x,_),m.distance(L,R)),A=Math.max(m.distance(x,L),m.distance(_,R)),b,Z,E=e.frustum._offCenterFrustum,X=E.right/E.top,F=A*X;w>F?(b=w,Z=b/X):(Z=A,b=F),P=Math.max(b,Z)}else{let w=Math.tan(e.frustum.fovy*.5),A=e.frustum.aspectRatio*w;if(P=Math.max(Gc(G,v,_,w),Gc(G,v,L,w),Gc(G,v,x,w),Gc(G,v,R,w),Gc(G,v,C,w),Gc(G,v,V,w),Gc(G,I,_,A),Gc(G,I,L,A),Gc(G,I,x,A),Gc(G,I,R,A),Gc(G,I,C,A),Gc(G,I,V,A)),a<0&&s>0){let b=CF;b.longitude=c,b.latitude=0,b.height=0;let Z=o.cartographicToCartesian(b,kj);m.subtract(Z,g,Z),P=Math.max(P,Gc(G,v,Z,w),Gc(G,I,Z,A)),b.longitude=d,Z=o.cartographicToCartesian(b,kj),m.subtract(Z,g,Z),P=Math.max(P,Gc(G,v,Z,w),Gc(G,I,Z,A))}}return m.add(g,m.multiplyByScalar(G,-P,kj),n)}var Ddt=new he,Bdt=new m,Odt=new m;function Ydt(e,t,n){let i=e._projection;t.west>t.east&&(t=le.MAX_VALUE);let o=e._actualTransform,r=e._actualInvTransform,s=Ddt;s.longitude=t.east,s.latitude=t.north;let a=i.project(s,Bdt);M.multiplyByPoint(o,a,a),M.multiplyByPoint(r,a,a),s.longitude=t.west,s.latitude=t.south;let c=i.project(s,Odt);if(M.multiplyByPoint(o,c,c),M.multiplyByPoint(r,c,c),n.x=(a.x-c.x)*.5+c.x,n.y=(a.y-c.y)*.5+c.y,l(e.frustum.fovy)){let d=Math.tan(e.frustum.fovy*.5),u=e.frustum.aspectRatio*d;n.z=Math.max((a.x-c.x)/u,(a.y-c.y)/d)*.5}else{let d=a.x-c.x,u=a.y-c.y;n.z=Math.max(d,u)}return n}var Hdt=new he,zdt=new m,Kdt=new m;function Jdt(e,t,n){let i=e._projection,o=t.east;t.west>t.east&&(e._scene.mapMode2D===id.INFINITE_SCROLL?o+=W.TWO_PI:(t=le.MAX_VALUE,o=t.east));let r=Hdt;r.longitude=o,r.latitude=t.north;let s=i.project(r,zdt);r.longitude=t.west,r.latitude=t.south;let a=i.project(r,Kdt),c=Math.abs(s.x-a.x)*.5,d=Math.abs(s.y-a.y)*.5,u,h,p=e.frustum.right/e.frustum.top,g=d*p;return c>g?(u=c,h=u/p):(h=d,u=g),d=Math.max(2*u,2*h),n.x=(s.x-a.x)*.5+a.x,n.y=(s.y-a.y)*.5+a.y,r=i.unproject(n,r),r.height=d,n=i.project(r,n),n}nn.prototype.getRectangleCameraCoordinates=function(e,t){let n=this._mode;if(l(t)||(t=new m),n===oe.SCENE3D)return mxe(this,e,t);if(n===oe.COLUMBUS_VIEW)return Ydt(this,e,t);if(n===oe.SCENE2D)return Jdt(this,e,t)};var Qdt=new gn;function jdt(e,t,n,i){n=y(n,ne.default);let o=e.getPickRay(t,Qdt),r=ti.rayEllipsoid(o,n);if(!r)return;let s=r.start>0?r.start:r.stop;return gn.getPoint(o,s,i)}var qdt=new gn;function $dt(e,t,n,i){let r=e.getPickRay(t,qdt).origin;r=m.fromElements(r.y,r.z,0,r);let s=n.unproject(r);if(!(s.latitude<-W.PI_OVER_TWO||s.latitude>W.PI_OVER_TWO))return n.ellipsoid.cartographicToCartesian(s,i)}var eut=new gn;function tut(e,t,n,i){let o=e.getPickRay(t,eut),r=-o.origin.x/o.direction.x;gn.getPoint(o,r,i);let s=n.unproject(new m(i.y,i.z,0));if(!(s.latitude<-W.PI_OVER_TWO||s.latitude>W.PI_OVER_TWO||s.longitude<-Math.PI||s.longitude>Math.PI))return n.ellipsoid.cartographicToCartesian(s,i)}nn.prototype.pickEllipsoid=function(e,t,n){let i=this._scene.canvas;if(!(i.clientWidth===0||i.clientHeight===0)){if(l(n)||(n=new m),t=y(t,ne.default),this._mode===oe.SCENE3D)n=jdt(this,e,t,n);else if(this._mode===oe.SCENE2D)n=$dt(this,e,this._projection,n);else if(this._mode===oe.COLUMBUS_VIEW)n=tut(this,e,this._projection,n);else return;return n}};var nut=new m,iut=new m,out=new m;function rut(e,t,n){let i=e._scene.canvas,o=i.clientWidth,r=i.clientHeight,s=Math.tan(e.frustum.fovy*.5),a=e.frustum.aspectRatio*s,c=e.frustum.near,d=2/o*t.x-1,u=2/r*(r-t.y)-1,h=e.positionWC;m.clone(h,n.origin);let p=m.multiplyByScalar(e.directionWC,c,nut);m.add(h,p,p);let g=m.multiplyByScalar(e.rightWC,d*c*a,iut),f=m.multiplyByScalar(e.upWC,u*c*s,out),x=m.add(p,g,n.direction);return m.add(x,f,x),m.subtract(x,h,x),m.normalize(x,x),n}var y3=new m;function sut(e,t,n){let i=e._scene.canvas,o=i.clientWidth,r=i.clientHeight,s=e.frustum,a=s.offCenterFrustum;l(a)&&(s=a);let c=2/o*t.x-1;c*=(s.right-s.left)*.5;let d=2/r*(r-t.y)-1;d*=(s.top-s.bottom)*.5;let u=n.origin;return m.clone(e.position,u),m.multiplyByScalar(e.right,c,y3),m.add(y3,u,u),m.multiplyByScalar(e.up,d,y3),m.add(y3,u,u),m.clone(e.directionWC,n.direction),(e._mode===oe.COLUMBUS_VIEW||e._mode===oe.SCENE2D)&&m.fromElements(n.origin.z,n.origin.x,n.origin.y,n.origin),n}nn.prototype.getPickRay=function(e,t){l(t)||(t=new gn);let n=this._scene.canvas;if(n.clientWidth<=0||n.clientHeight<=0)return;let i=this.frustum;return l(i.aspectRatio)&&l(i.fov)&&l(i.near)?rut(this,e,t):sut(this,e,t)};var aut=new m,cut=new m;nn.prototype.distanceToBoundingSphere=function(e){let t=m.subtract(this.positionWC,e.center,aut),n=m.multiplyByScalar(this.directionWC,m.dot(t,this.directionWC),cut);return Math.max(0,m.magnitude(n)-e.radius)};var lut=new D;nn.prototype.getPixelSize=function(e,t,n){let i=this.distanceToBoundingSphere(e),o=this.frustum.getPixelDimensions(t,n,i,this._scene.pixelRatio,lut);return Math.max(o.x,o.y)};function dut(e,t,n,i,o,r){let s=m.clone(t);n.y>i?s.y-=n.y-i:n.y<-i&&(s.y+=-i-n.y),n.z>o?s.z-=n.z-o:n.z<-o&&(s.z+=-o-n.z);function a(c){let d=m.lerp(t,s,c.time,new m);e.worldToCameraCoordinatesPoint(d,e.position)}return{easingFunction:Qr.EXPONENTIAL_OUT,startObject:{time:0},stopObject:{time:1},duration:r,update:a}}var uut=new m,Qye=new m,mut=new m,hut=new m;function fut(e,t){let n=e.position,i=e.direction,o=e.worldToCameraCoordinatesVector(m.UNIT_X,uut),r=-m.dot(o,n)/m.dot(o,i),s=m.add(n,m.multiplyByScalar(i,r,Qye),Qye);e.cameraToWorldCoordinatesPoint(s,s),n=e.cameraToWorldCoordinatesPoint(e.position,mut);let a=Math.tan(e.frustum.fovy*.5),c=e.frustum.aspectRatio*a,d=m.magnitude(m.subtract(n,s,hut)),u=c*d,h=a*d,p=e._maxCoord.x,g=e._maxCoord.y,f=Math.max(u-p,p),x=Math.max(h-g,g);if(n.z<-f||n.z>f||n.y<-x||n.y>x){let _=s.y<-f||s.y>f,C=s.z<-x||s.z>x;if(_||C)return dut(e,n,s,f,x,t)}}nn.prototype.createCorrectPositionTween=function(e){if(this._mode===oe.COLUMBUS_VIEW)return fut(this,e)};var put=new m,sa={destination:void 0,heading:void 0,pitch:void 0,roll:void 0,duration:void 0,complete:void 0,cancel:void 0,endTransform:void 0,maximumHeight:void 0,easingFunction:void 0};nn.prototype.cancelFlight=function(){l(this._currentFlight)&&(this._currentFlight.cancelTween(),this._currentFlight=void 0)};nn.prototype.completeFlight=function(){if(l(this._currentFlight)){this._currentFlight.cancelTween();let e={destination:void 0,orientation:{heading:void 0,pitch:void 0,roll:void 0}};e.destination=sa.destination,e.orientation.heading=sa.heading,e.orientation.pitch=sa.pitch,e.orientation.roll=sa.roll,this.setView(e),l(this._currentFlight.complete)&&this._currentFlight.complete(),this._currentFlight=void 0}};nn.prototype.flyTo=function(e){e=y(e,y.EMPTY_OBJECT);let t=e.destination;if(this._mode===oe.MORPHING)return;this.cancelFlight();let i=t instanceof le;i&&(t=this.getRectangleCameraCoordinates(t,put));let o=y(e.orientation,y.EMPTY_OBJECT);if(l(o.direction)&&(o=sxe(this,t,o,Bj.orientation)),l(e.duration)&&e.duration<=0){let u=Bj;u.destination=e.destination,u.orientation.heading=o.heading,u.orientation.pitch=o.pitch,u.orientation.roll=o.roll,u.convert=e.convert,u.endTransform=e.endTransform,this.setView(u),typeof e.complete=="function"&&e.complete();return}let r=this,s;sa.destination=t,sa.heading=o.heading,sa.pitch=o.pitch,sa.roll=o.roll,sa.duration=e.duration,sa.complete=function(){s===r._currentFlight&&(r._currentFlight=void 0),l(e.complete)&&e.complete()},sa.cancel=e.cancel,sa.endTransform=e.endTransform,sa.convert=i?!1:e.convert,sa.maximumHeight=e.maximumHeight,sa.pitchAdjustHeight=e.pitchAdjustHeight,sa.flyOverLongitude=e.flyOverLongitude,sa.flyOverLongitudeWeight=e.flyOverLongitudeWeight,sa.easingFunction=e.easingFunction;let a=this._scene,c=SF.createTween(a,sa);if(c.duration===0){typeof c.complete=="function"&&c.complete();return}s=a.tweens.add(c),this._currentFlight=s;let d=this._scene.preloadFlightCamera;this._mode!==oe.SCENE2D&&(l(d)||(d=nn.clone(this)),d.setView({destination:t,orientation:o}),this._scene.preloadFlightCullingVolume=d.frustum.computeCullingVolume(d.positionWC,d.directionWC,d.upWC))};function but(e,t){let n=e.frustum,i=Math.tan(n.fovy*.5),o=n.aspectRatio*i;return Math.max(t/o,t/i)}function gut(e,t){let n=e.frustum,i=n.offCenterFrustum;l(i)&&(n=i);let o,r,s=n.right/n.top,a=t*s;return t>a?(o=t,r=o/s):(r=t,o=a),Math.max(o,r)*1.5}var yut=100;function hxe(e,t,n){n=rm.clone(l(n)?n:nn.DEFAULT_OFFSET);let i=e._scene.screenSpaceCameraController.minimumZoomDistance,o=e._scene.screenSpaceCameraController.maximumZoomDistance,r=n.range;if(!l(r)||r===0){let s=t.radius;s===0?n.range=yut:e.frustum instanceof ln||e._mode===oe.SCENE2D?n.range=gut(e,s):n.range=but(e,s),n.range=W.clamp(n.range,i,o)}return n}nn.prototype.viewBoundingSphere=function(e,t){t=hxe(this,e,t),this.lookAt(e.center,t)};var xut=new M,_ut=new m,Tut=new m,Sut=new m,Cut=new m,Vut=new re,Lut=new Fe,Rut=new $;nn.prototype.flyToBoundingSphere=function(e,t){t=y(t,y.EMPTY_OBJECT);let n=this._mode===oe.SCENE2D||this._mode===oe.COLUMBUS_VIEW;this._setTransform(M.IDENTITY);let i=hxe(this,e,t.offset),o;n?o=m.multiplyByScalar(m.UNIT_Z,i.range,_ut):o=uxe(i.heading,i.pitch,i.range);let r=this._scene,s=y(r.ellipsoid,ne.default),a=wt.eastNorthUpToFixedFrame(e.center,s,xut);M.multiplyByPoint(a,o,o);let c,d;if(!n){if(c=m.subtract(e.center,o,Tut),m.normalize(c,c),d=M.multiplyByPointAsVector(a,m.UNIT_Z,Sut),1-Math.abs(m.dot(c,d))<W.EPSILON6){let h=Fe.fromAxisAngle(c,i.heading,Lut),p=$.fromQuaternion(h,Rut);m.fromCartesian4(M.getColumn(a,1,Vut),d),$.multiplyByVector(p,d,d)}let u=m.cross(c,d,Cut);m.cross(u,c,d),m.normalize(d,d)}this.flyTo({destination:o,orientation:{direction:c,up:d},duration:t.duration,complete:t.complete,cancel:t.cancel,endTransform:t.endTransform,maximumHeight:t.maximumHeight,easingFunction:t.easingFunction,flyOverLongitude:t.flyOverLongitude,flyOverLongitudeWeight:t.flyOverLongitudeWeight,pitchAdjustHeight:t.pitchAdjustHeight})};var jye=new m,qye=new m,Uj=new m,$ye=new m,VF=[new m,new m,new m,new m];function Zut(e,t){let n=t.radii,i=e.positionWC,o=m.multiplyComponents(t.oneOverRadii,i,jye),r=m.magnitude(o),s=m.normalize(o,qye),a,c;m.equalsEpsilon(s,m.UNIT_Z,W.EPSILON10)?(a=new m(0,1,0),c=new m(0,0,1)):(a=m.normalize(m.cross(m.UNIT_Z,s,Uj),Uj),c=m.normalize(m.cross(s,a,$ye),$ye));let d=Math.sqrt(m.magnitudeSquared(o)-1),u=m.multiplyByScalar(s,1/r,jye),h=d/r,p=m.multiplyByScalar(a,h,qye),g=m.multiplyByScalar(c,h,Uj),f=m.add(u,g,VF[0]);m.subtract(f,p,f),m.multiplyComponents(n,f,f);let x=m.subtract(u,g,VF[1]);m.subtract(x,p,x),m.multiplyComponents(n,x,x);let _=m.subtract(u,g,VF[2]);m.add(_,p,_),m.multiplyComponents(n,_,_);let C=m.add(u,g,VF[3]);return m.add(C,p,C),m.multiplyComponents(n,C,C),VF}var Dj=new D,Gut=new m,wy=[new he,new he,new he,new he];function x3(e,t,n,i,o,r){Dj.x=e,Dj.y=t;let s=i.pickEllipsoid(Dj,o,Gut);return l(s)?(wy[n]=o.cartesianToCartographic(s,wy[n]),1):(wy[n]=o.cartesianToCartographic(r[n],wy[n]),0)}nn.prototype.computeViewRectangle=function(e,t){e=y(e,ne.default);let n=this.frustum.computeCullingVolume(this.positionWC,this.directionWC,this.upWC),i=new de(m.ZERO,e.maximumRadius);if(n.computeVisibility(i)===zt.OUTSIDE)return;let r=this._scene.canvas,s=r.clientWidth,a=r.clientHeight,c=0,d=Zut(this,e);if(c+=x3(0,0,0,this,e,d),c+=x3(0,a,1,this,e,d),c+=x3(s,a,2,this,e,d),c+=x3(s,0,3,this,e,d),c<2)return le.MAX_VALUE;t=le.fromCartographicArray(wy,t);let u=0,h=wy[3].longitude;for(let p=0;p<4;++p){let g=wy[p].longitude,f=Math.abs(g-h);f>W.PI?u+=W.TWO_PI-f:u+=f,h=g}return W.equalsEpsilon(Math.abs(u),W.TWO_PI,W.EPSILON9)&&(t.west=-W.PI,t.east=W.PI,wy[0].latitude>=0?t.north=W.PI_OVER_TWO:t.south=-W.PI_OVER_TWO),t};nn.prototype.switchToPerspectiveFrustum=function(){if(this._mode===oe.SCENE2D||this.frustum instanceof Gi)return;let e=this._scene;this.frustum=new Gi,this.frustum.aspectRatio=e.drawingBufferWidth/e.drawingBufferHeight,this.frustum.fov=W.toRadians(60)};nn.prototype.switchToOrthographicFrustum=function(){if(this._mode===oe.SCENE2D||this.frustum instanceof ln)return;let e=oxe(this),t=this._scene;this.frustum=new ln,this.frustum.aspectRatio=t.drawingBufferWidth/t.drawingBufferHeight,this.frustum.width=e};nn.clone=function(e,t){return l(t)||(t=new nn(e._scene)),m.clone(e.position,t.position),m.clone(e.direction,t.direction),m.clone(e.up,t.up),m.clone(e.right,t.right),M.clone(e._transform,t.transform),t._transformChanged=!0,t.frustum=e.frustum.clone(),t};var co=nn;var P2i=T(S(),1);function Eut(e){this.pass=e.pass,this.commandList=e.commandList,this.camera=e.camera,this.cullingVolume=e.cullingVolume,this.ready=!1}var bm=Eut;var U2i=T(S(),1);var yxe=T(ud(),1),fxe=576,Iut=100,LF="#ffffff",V3="#48b";function xxe(e,t){this.credit=e,this.count=y(t,1)}function Xut(e,t){let n=e.length;for(let i=0;i<n;i++){let o=e[i];if(Rt.equals(o,t))return!0}return!1}function Wut(e){let t=e._previousCesiumCredit,n=e._currentCesiumCredit;Rt.equals(n,t)||(l(t)&&e._cesiumCreditContainer.removeChild(t.element),l(n)&&e._cesiumCreditContainer.appendChild(n.element),e._previousCesiumCredit=n)}var _xe="cesium-credit-delimiter";function pxe(e){let t=document.createElement("span");return t.textContent=e,t.className=_xe,t}function bxe(e,t){if(l(t)){let n=document.createElement(t);n._creditId=e._creditId,n.appendChild(e),e=n}return e}function gxe(e,t,n,i){let o=e.childNodes,r=-1;t.sort(function(s,a){return a.count-s.count});for(let s=0;s<t.length;++s){let a=t[s].credit;if(l(a)){if(r=s,l(n)&&(r*=2,s>0)){let d=r-1;if(o.length<=d)e.appendChild(pxe(n));else{let u=o[d];u.className!==_xe&&e.replaceChild(pxe(n),u)}}let c=a.element;if(o.length<=r)e.appendChild(bxe(c,i));else{let d=o[r];d._creditId!==a._id&&e.replaceChild(bxe(c,i),d)}}}for(++r;r<o.length;)e.removeChild(o[r])}function Put(e){let t=e._lightboxCredits,n=e.viewport.clientWidth,i=e.viewport.clientHeight;n!==e._lastViewportWidth&&(n<fxe?(t.className="cesium-credit-lightbox cesium-credit-lightbox-mobile",t.style.marginTop="0"):(t.className="cesium-credit-lightbox cesium-credit-lightbox-expanded",t.style.marginTop=`${Math.floor((i-t.clientHeight)*.5)}px`),e._lastViewportWidth=n),n>=fxe&&i!==e._lastViewportHeight&&(t.style.marginTop=`${Math.floor((i-t.clientHeight)*.5)}px`,e._lastViewportHeight=i)}function vut(e){let t=` .cesium-credit-lightbox-overlay { display: none; z-index: 1; position: absolute; top: 0; left: 0; width: 100%; height: 100%; background-color: rgba(80, 80, 80, 0.8); } .cesium-credit-lightbox { background-color: #303336; color: ${LF}; position: relative; min-height: ${Iut}px; margin: auto; } .cesium-credit-lightbox > ul > li a, .cesium-credit-lightbox > ul > li a:visited, .cesium-credit-wrapper a, .cesium-credit-wrapper a:visited { color: ${LF}; } .cesium-credit-lightbox > ul > li a:hover { color: ${V3}; } .cesium-credit-lightbox.cesium-credit-lightbox-expanded { border: 1px solid #444; border-radius: 5px; max-width: 370px; } .cesium-credit-lightbox.cesium-credit-lightbox-mobile { height: 100%; width: 100%; } .cesium-credit-lightbox-title { padding: 20px 20px 0 20px; } .cesium-credit-lightbox-close { font-size: 18pt; cursor: pointer; position: absolute; top: 0; right: 6px; color: ${LF}; } .cesium-credit-lightbox-close:hover { color: ${V3}; } .cesium-credit-lightbox > ul { margin: 0; padding: 12px 20px 12px 40px; font-size: 13px; } .cesium-credit-lightbox > ul > li { padding-bottom: 6px; } .cesium-credit-lightbox > ul > li * { padding: 0; margin: 0; } .cesium-credit-expand-link { padding-left: 5px; cursor: pointer; text-decoration: underline; color: ${LF}; } .cesium-credit-expand-link:hover { color: ${V3}; } .cesium-credit-text { color: ${LF}; } .cesium-credit-delimiter { padding: 0 5px; } .cesium-credit-textContainer *, .cesium-credit-logoContainer * { display: inline; } .cesium-credit-textContainer a:hover { color: ${V3} } .cesium-credit-textContainer .cesium-credit-wrapper:first-of-type { padding-left: 5px; } `;function n(r){if(r.shadowRoot)return r.shadowRoot;if(r.getRootNode){let s=r.getRootNode();if(s instanceof ShadowRoot)return s}}let i=y(n(e),document.head),o=document.createElement("style");o.innerHTML=t,i.appendChild(o)}function yr(e,t,n){let i=this;n=y(n,document.body);let o=document.createElement("div");o.className="cesium-credit-lightbox-overlay",n.appendChild(o);let r=document.createElement("div");r.className="cesium-credit-lightbox",o.appendChild(r);function s(f){r.contains(f.target)||i.hideLightbox()}o.addEventListener("click",s,!1);let a=document.createElement("div");a.className="cesium-credit-lightbox-title",a.textContent="Data provided by:",r.appendChild(a);let c=document.createElement("a");c.onclick=this.hideLightbox.bind(this),c.innerHTML="×",c.className="cesium-credit-lightbox-close",r.appendChild(c);let d=document.createElement("ul");r.appendChild(d);let u=document.createElement("div");u.className="cesium-credit-logoContainer",u.style.display="inline",e.appendChild(u);let h=document.createElement("div");h.className="cesium-credit-textContainer",h.style.display="inline",e.appendChild(h);let p=document.createElement("a");p.className="cesium-credit-expand-link",p.onclick=this.showLightbox.bind(this),p.textContent="Data attribution",e.appendChild(p),vut(e);let g=Rt.clone(yr.cesiumCredit);this._delimiter=y(t,"\u2022"),this._screenContainer=h,this._cesiumCreditContainer=u,this._lastViewportHeight=void 0,this._lastViewportWidth=void 0,this._lightboxCredits=r,this._creditList=d,this._lightbox=o,this._hideLightbox=s,this._expandLink=p,this._expanded=!1,this._staticCredits=[],this._cesiumCredit=g,this._previousCesiumCredit=void 0,this._currentCesiumCredit=g,this._creditDisplayElementPool=[],this._creditDisplayElementIndex=0,this._currentFrameCredits={screenCredits:new Et,lightboxCredits:new Et},this._defaultCredit=void 0,this.viewport=n,this.container=e}function Txe(e,t,n,i){i=y(i,1);let o=t.get(n.id);if(l(o))o.count<Number.MAX_VALUE&&(o.count+=i);else{let r=e._creditDisplayElementPool,s=e._creditDisplayElementPoolIndex;s<r.length?(o=r[s],o.credit=n,o.count=i):(o=new xxe(n,i),r.push(o)),++e._creditDisplayElementPoolIndex,t.set(n.id,o)}}yr.prototype.addCreditToNextFrame=function(e){if(e.isIon()){l(this._defaultCredit)||(this._defaultCredit=Rt.clone(Sxe())),this._currentCesiumCredit=this._defaultCredit;return}let t;e.showOnScreen?t=this._currentFrameCredits.screenCredits:t=this._currentFrameCredits.lightboxCredits,Txe(this,t,e)};yr.prototype.addStaticCredit=function(e){let t=this._staticCredits;Xut(t,e)||t.push(e)};yr.prototype.removeStaticCredit=function(e){let t=this._staticCredits,n=t.indexOf(e);n!==-1&&t.splice(n,1)};yr.prototype.showLightbox=function(){this._lightbox.style.display="block",this._expanded=!0};yr.prototype.hideLightbox=function(){this._lightbox.style.display="none",this._expanded=!1};yr.prototype.update=function(){this._expanded&&Put(this)};yr.prototype.beginFrame=function(){let e=this._currentFrameCredits;this._creditDisplayElementPoolIndex=0;let t=e.screenCredits,n=e.lightboxCredits;t.removeAll(),n.removeAll();let i=this._staticCredits;for(let o=0;o<i.length;++o){let r=i[o],s=r.showOnScreen?t:n;r.isIon()&&Rt.equals(yr.cesiumCredit,this._cesiumCredit)||Txe(this,s,r,Number.MAX_VALUE)}Rt.equals(yr.cesiumCredit,this._cesiumCredit)||(this._cesiumCredit=Rt.clone(yr.cesiumCredit)),this._currentCesiumCredit=this._cesiumCredit};yr.prototype.endFrame=function(){let e=this._currentFrameCredits.screenCredits.values;gxe(this._screenContainer,e,this._delimiter,void 0);let t=this._currentFrameCredits.lightboxCredits.values;this._expandLink.style.display=t.length>0?"inline":"none",gxe(this._creditList,t,void 0,"li"),Wut(this)};yr.prototype.destroy=function(){return this._lightbox.removeEventListener("click",this._hideLightbox,!1),this.container.removeChild(this._cesiumCreditContainer),this.container.removeChild(this._screenContainer),this.container.removeChild(this._expandLink),this.viewport.removeChild(this._lightbox),me(this)};yr.prototype.isDestroyed=function(){return!1};yr._cesiumCredit=void 0;yr._cesiumCreditInitialized=!1;var L3;function Sxe(){if(!l(L3)){let e=on("Assets/Images/ion-credit.png");e.indexOf("http://")!==0&&e.indexOf("https://")!==0&&e.indexOf("data:")!==0&&(e=new yxe.default(e).path()),L3=new Rt(`<a href="https://cesium.com/" target="_blank"><img src="${e}" style="vertical-align: -7px" title="Cesium ion"/></a>`,!0)}return yr._cesiumCreditInitialized||(yr._cesiumCredit=L3,yr._cesiumCreditInitialized=!0),L3}Object.defineProperties(yr,{cesiumCredit:{get:function(){return Sxe(),yr._cesiumCredit},set:function(e){yr._cesiumCredit=e,yr._cesiumCreditInitialized=!0}}});yr.CreditDisplayElement=xxe;var RF=yr;var NPi=T(S(),1);var rPi=T(S(),1);var R3=0,wut=1;function QT(e){let t=e.frustum,n=e.orientation,i=e.origin,o=y(e.vertexFormat,Xe.DEFAULT),r=y(e._drawNearPlane,!0),s,a;t instanceof Gi?(s=R3,a=Gi.packedLength):t instanceof ln&&(s=wut,a=ln.packedLength),this._frustumType=s,this._frustum=t.clone(),this._origin=m.clone(i),this._orientation=Fe.clone(n),this._drawNearPlane=r,this._vertexFormat=o,this._workerName="createFrustumGeometry",this.packedLength=2+a+m.packedLength+Fe.packedLength+Xe.packedLength}QT.pack=function(e,t,n){n=y(n,0);let i=e._frustumType,o=e._frustum;return t[n++]=i,i===R3?(Gi.pack(o,t,n),n+=Gi.packedLength):(ln.pack(o,t,n),n+=ln.packedLength),m.pack(e._origin,t,n),n+=m.packedLength,Fe.pack(e._orientation,t,n),n+=Fe.packedLength,Xe.pack(e._vertexFormat,t,n),n+=Xe.packedLength,t[n]=e._drawNearPlane?1:0,t};var Fut=new Gi,Aut=new ln,Mut=new Fe,Nut=new m,kut=new Xe;QT.unpack=function(e,t,n){t=y(t,0);let i=e[t++],o;i===R3?(o=Gi.unpack(e,t,Fut),t+=Gi.packedLength):(o=ln.unpack(e,t,Aut),t+=ln.packedLength);let r=m.unpack(e,t,Nut);t+=m.packedLength;let s=Fe.unpack(e,t,Mut);t+=Fe.packedLength;let a=Xe.unpack(e,t,kut);t+=Xe.packedLength;let c=e[t]===1;if(!l(n))return new QT({frustum:o,origin:r,orientation:s,vertexFormat:a,_drawNearPlane:c});let d=i===n._frustumType?n._frustum:void 0;return n._frustum=o.clone(d),n._frustumType=i,n._origin=m.clone(r,n._origin),n._orientation=Fe.clone(s,n._orientation),n._vertexFormat=Xe.clone(a,n._vertexFormat),n._drawNearPlane=c,n};function pL(e,t,n,i,o,r,s,a){let c=e/3*2;for(let d=0;d<4;++d)l(t)&&(t[e]=r.x,t[e+1]=r.y,t[e+2]=r.z),l(n)&&(n[e]=s.x,n[e+1]=s.y,n[e+2]=s.z),l(i)&&(i[e]=a.x,i[e+1]=a.y,i[e+2]=a.z),e+=3;o[c]=0,o[c+1]=0,o[c+2]=1,o[c+3]=0,o[c+4]=1,o[c+5]=1,o[c+6]=0,o[c+7]=1}var Uut=new $,Dut=new M,zj=new M,Cxe=new m,Vxe=new m,Lxe=new m,But=new m,Out=new m,Yut=new m,Fy=new Array(3),ZF=new Array(4);ZF[0]=new re(-1,-1,1,1);ZF[1]=new re(1,-1,1,1);ZF[2]=new re(1,1,1,1);ZF[3]=new re(-1,1,1,1);var Rxe=new Array(4);for(let e=0;e<4;++e)Rxe[e]=new re;QT._computeNearFarPlanes=function(e,t,n,i,o,r,s,a){let c=$.fromQuaternion(t,Uut),d=y(r,Cxe),u=y(s,Vxe),h=y(a,Lxe);d=$.getColumn(c,0,d),u=$.getColumn(c,1,u),h=$.getColumn(c,2,h),m.normalize(d,d),m.normalize(u,u),m.normalize(h,h),m.negate(d,d);let p=M.computeView(e,h,u,d,Dut),g,f,x=i.projectionMatrix;if(n===R3){let _=M.multiply(x,p,zj);f=M.inverse(_,zj)}else g=M.inverseTransformation(p,zj);l(f)?(Fy[0]=i.near,Fy[1]=i.far):(Fy[0]=0,Fy[1]=i.near,Fy[2]=i.far);for(let _=0;_<2;++_)for(let C=0;C<4;++C){let V=re.clone(ZF[C],Rxe[C]);if(l(f)){V=M.multiplyByVector(f,V,V);let L=1/V.w;m.multiplyByScalar(V,L,V),m.subtract(V,e,V),m.normalize(V,V);let R=m.dot(h,V);m.multiplyByScalar(V,Fy[_]/R,V),m.add(V,e,V)}else{let L=i.offCenterFrustum;l(L)&&(i=L);let R=Fy[_],G=Fy[_+1];V.x=(V.x*(i.right-i.left)+i.left+i.right)*.5,V.y=(V.y*(i.top-i.bottom)+i.bottom+i.top)*.5,V.z=(V.z*(R-G)-R-G)*.5,V.w=1,M.multiplyByVector(g,V,V)}o[12*_+C*3]=V.x,o[12*_+C*3+1]=V.y,o[12*_+C*3+2]=V.z}};QT.createGeometry=function(e){let t=e._frustumType,n=e._frustum,i=e._origin,o=e._orientation,r=e._drawNearPlane,s=e._vertexFormat,a=r?6:5,c=new Float64Array(3*4*6);QT._computeNearFarPlanes(i,o,t,n,c);let d=3*4*2;c[d]=c[3*4],c[d+1]=c[3*4+1],c[d+2]=c[3*4+2],c[d+3]=c[0],c[d+4]=c[1],c[d+5]=c[2],c[d+6]=c[3*3],c[d+7]=c[3*3+1],c[d+8]=c[3*3+2],c[d+9]=c[3*7],c[d+10]=c[3*7+1],c[d+11]=c[3*7+2],d+=3*4,c[d]=c[3*5],c[d+1]=c[3*5+1],c[d+2]=c[3*5+2],c[d+3]=c[3],c[d+4]=c[4],c[d+5]=c[5],c[d+6]=c[0],c[d+7]=c[1],c[d+8]=c[2],c[d+9]=c[3*4],c[d+10]=c[3*4+1],c[d+11]=c[3*4+2],d+=3*4,c[d]=c[3],c[d+1]=c[4],c[d+2]=c[5],c[d+3]=c[3*5],c[d+4]=c[3*5+1],c[d+5]=c[3*5+2],c[d+6]=c[3*6],c[d+7]=c[3*6+1],c[d+8]=c[3*6+2],c[d+9]=c[3*2],c[d+10]=c[3*2+1],c[d+11]=c[3*2+2],d+=3*4,c[d]=c[3*2],c[d+1]=c[3*2+1],c[d+2]=c[3*2+2],c[d+3]=c[3*6],c[d+4]=c[3*6+1],c[d+5]=c[3*6+2],c[d+6]=c[3*7],c[d+7]=c[3*7+1],c[d+8]=c[3*7+2],c[d+9]=c[3*3],c[d+10]=c[3*3+1],c[d+11]=c[3*3+2],r||(c=c.subarray(3*4));let u=new fn({position:new Ze({componentDatatype:Q.DOUBLE,componentsPerAttribute:3,values:c})});if(l(s.normal)||l(s.tangent)||l(s.bitangent)||l(s.st)){let p=l(s.normal)?new Float32Array(12*a):void 0,g=l(s.tangent)?new Float32Array(3*4*a):void 0,f=l(s.bitangent)?new Float32Array(3*4*a):void 0,x=l(s.st)?new Float32Array(2*4*a):void 0,_=Cxe,C=Vxe,V=Lxe,L=m.negate(_,But),R=m.negate(C,Out),G=m.negate(V,Yut);d=0,r&&(pL(d,p,g,f,x,G,_,C),d+=3*4),pL(d,p,g,f,x,V,L,C),d+=3*4,pL(d,p,g,f,x,L,G,C),d+=3*4,pL(d,p,g,f,x,R,G,L),d+=3*4,pL(d,p,g,f,x,_,V,C),d+=3*4,pL(d,p,g,f,x,C,V,L),l(p)&&(u.normal=new Ze({componentDatatype:Q.FLOAT,componentsPerAttribute:3,values:p})),l(g)&&(u.tangent=new Ze({componentDatatype:Q.FLOAT,componentsPerAttribute:3,values:g})),l(f)&&(u.bitangent=new Ze({componentDatatype:Q.FLOAT,componentsPerAttribute:3,values:f})),l(x)&&(u.st=new Ze({componentDatatype:Q.FLOAT,componentsPerAttribute:2,values:x}))}let h=new Uint16Array(6*a);for(let p=0;p<a;++p){let g=p*6,f=p*4;h[g]=f,h[g+1]=f+1,h[g+2]=f+2,h[g+3]=f,h[g+4]=f+2,h[g+5]=f+3}return new mt({attributes:u,indices:h,primitiveType:Ae.TRIANGLES,boundingSphere:de.fromVertices(c)})};var jT=QT;var _Pi=T(S(),1);var Kj=0,Hut=1;function GF(e){let t=e.frustum,n=e.orientation,i=e.origin,o=y(e._drawNearPlane,!0),r,s;t instanceof Gi?(r=Kj,s=Gi.packedLength):t instanceof ln&&(r=Hut,s=ln.packedLength),this._frustumType=r,this._frustum=t.clone(),this._origin=m.clone(i),this._orientation=Fe.clone(n),this._drawNearPlane=o,this._workerName="createFrustumOutlineGeometry",this.packedLength=2+s+m.packedLength+Fe.packedLength}GF.pack=function(e,t,n){n=y(n,0);let i=e._frustumType,o=e._frustum;return t[n++]=i,i===Kj?(Gi.pack(o,t,n),n+=Gi.packedLength):(ln.pack(o,t,n),n+=ln.packedLength),m.pack(e._origin,t,n),n+=m.packedLength,Fe.pack(e._orientation,t,n),n+=Fe.packedLength,t[n]=e._drawNearPlane?1:0,t};var zut=new Gi,Kut=new ln,Jut=new Fe,Qut=new m;GF.unpack=function(e,t,n){t=y(t,0);let i=e[t++],o;i===Kj?(o=Gi.unpack(e,t,zut),t+=Gi.packedLength):(o=ln.unpack(e,t,Kut),t+=ln.packedLength);let r=m.unpack(e,t,Qut);t+=m.packedLength;let s=Fe.unpack(e,t,Jut);t+=Fe.packedLength;let a=e[t]===1;if(!l(n))return new GF({frustum:o,origin:r,orientation:s,_drawNearPlane:a});let c=i===n._frustumType?n._frustum:void 0;return n._frustum=o.clone(c),n._frustumType=i,n._origin=m.clone(r,n._origin),n._orientation=Fe.clone(s,n._orientation),n._drawNearPlane=a,n};GF.createGeometry=function(e){let t=e._frustumType,n=e._frustum,i=e._origin,o=e._orientation,r=e._drawNearPlane,s=new Float64Array(3*4*2);jT._computeNearFarPlanes(i,o,t,n,s);let a=new fn({position:new Ze({componentDatatype:Q.DOUBLE,componentsPerAttribute:3,values:s})}),c,d,u=r?2:1,h=new Uint16Array(8*(u+1)),p=r?0:1;for(;p<2;++p)c=r?p*8:0,d=p*4,h[c]=d,h[c+1]=d+1,h[c+2]=d+1,h[c+3]=d+2,h[c+4]=d+2,h[c+5]=d+3,h[c+6]=d+3,h[c+7]=d;for(p=0;p<2;++p)c=(u+p)*8,d=p*4,h[c]=d,h[c+1]=d+4,h[c+2]=d+1,h[c+3]=d+5,h[c+4]=d+2,h[c+5]=d+6,h[c+6]=d+3,h[c+7]=d+7;return new mt({attributes:a,indices:h,primitiveType:Ae.LINES,boundingSphere:de.fromVertices(s)})};var EF=GF;function Z3(e){e=y(e,y.EMPTY_OBJECT),this._camera=e.camera,this._frustumSplits=e.frustumSplits,this._color=y(e.color,B.CYAN),this._updateOnChange=y(e.updateOnChange,!0),this.show=y(e.show,!0),this.id=e.id,this._id=void 0,this._outlinePrimitives=[],this._planesPrimitives=[]}var jut=new m,qut=new $,$ut=new Fe,emt=new Gi,tmt=new yl,nmt=new ln,imt=new Mr,omt=new B,rmt=[1,1e5];Z3.prototype.update=function(e){if(!this.show)return;let t=this._planesPrimitives,n=this._outlinePrimitives,i,o;if(this._updateOnChange){for(o=t.length,i=0;i<o;++i)n[i]=n[i]&&n[i].destroy(),t[i]=t[i]&&t[i].destroy();t.length=0,n.length=0}if(t.length===0){let r=this._camera,s=r.frustum,a;s instanceof Gi?a=emt:s instanceof yl?a=tmt:s instanceof ln?a=nmt:a=imt,a=s.clone(a);let c,d=this._frustumSplits;!l(d)||d.length<=1?(d=rmt,d[0]=this._camera.frustum.near,d[1]=this._camera.frustum.far,c=1):c=d.length-1;let u=r.positionWC,h=r.directionWC,p=r.upWC,g=r.rightWC;g=m.negate(g,jut);let f=qut;$.setColumn(f,0,g,f),$.setColumn(f,1,p,f),$.setColumn(f,2,h,f);let x=Fe.fromRotationMatrix(f,$ut);for(t.length=n.length=c,i=0;i<c;++i)a.near=d[i],a.far=d[i+1],t[i]=new Xn({geometryInstances:new It({geometry:new jT({origin:u,orientation:x,frustum:a,_drawNearPlane:i===0}),attributes:{color:Ht.fromColor(B.fromAlpha(this._color,.1,omt))},id:this.id,pickPrimitive:this}),appearance:new dn({translucent:!0,flat:!0}),asynchronous:!1}),n[i]=new Xn({geometryInstances:new It({geometry:new EF({origin:u,orientation:x,frustum:a,_drawNearPlane:i===0}),attributes:{color:Ht.fromColor(this._color)},id:this.id,pickPrimitive:this}),appearance:new dn({translucent:!1,flat:!0}),asynchronous:!1})}for(o=t.length,i=0;i<o;++i)n[i].update(e),t[i].update(e)};Z3.prototype.isDestroyed=function(){return!1};Z3.prototype.destroy=function(){let e=this._planesPrimitives.length;for(let t=0;t<e;++t)this._outlinePrimitives[t]=this._outlinePrimitives[t]&&this._outlinePrimitives[t].destroy(),this._planesPrimitives[t]=this._planesPrimitives[t]&&this._planesPrimitives[t].destroy();return me(this)};var ap=Z3;var mvi=T(S(),1);var UPi=T(S(),1),IF=`in vec4 positionEC; void main() { vec3 position; vec3 direction; if (czm_orthographicIn3D == 1.0) { vec2 uv = (gl_FragCoord.xy - czm_viewport.xy) / czm_viewport.zw; vec2 minPlane = vec2(czm_frustumPlanes.z, czm_frustumPlanes.y); // left, bottom vec2 maxPlane = vec2(czm_frustumPlanes.w, czm_frustumPlanes.x); // right, top position = vec3(mix(minPlane, maxPlane, uv), 0.0); direction = vec3(0.0, 0.0, -1.0); } else { position = vec3(0.0); direction = normalize(positionEC.xyz); } czm_ray ray = czm_ray(position, direction); vec3 ellipsoid_center = czm_view[3].xyz; czm_raySegment intersection = czm_rayEllipsoidIntersectionInterval(ray, ellipsoid_center, czm_ellipsoidInverseRadii); if (!czm_isEmpty(intersection)) { out_FragColor = vec4(1.0, 1.0, 0.0, 1.0); } else { discard; } czm_writeLogDepth(); } `;var BPi=T(S(),1),XF=`in vec4 position; out vec4 positionEC; void main() { positionEC = czm_modelView * position; gl_Position = czm_projection * positionEC; czm_vertexLogDepth(); } `;function PF(e){this._rs=void 0,this._sp=void 0,this._va=void 0,this._command=void 0,this._mode=void 0,this._useLogDepth=!1,this._ellipsoidOffset=y(e,0)}var WF=Ot.supportsTypedArrays()?new Float32Array(12):[],Zxe=new m,Gxe=new m,Jj=new m,Exe=new m,G3=new m;function smt(e,t){let n=e.radii,i=t.camera,o,r,s;if(i.frustum instanceof ln)o=m.ZERO,r=i.rightWC,s=i.upWC;else{let h=i.positionWC,p=m.multiplyComponents(e.oneOverRadii,h,Zxe),g=m.normalize(p,Gxe),f=m.normalize(m.cross(m.UNIT_Z,p,Jj),Jj),x=m.normalize(m.cross(g,f,Exe),Exe),_=m.magnitude(p),C=Math.sqrt(_*_-1);o=m.multiplyByScalar(g,1/_,Zxe);let V=C/_;r=m.multiplyByScalar(f,V,Gxe),s=m.multiplyByScalar(x,V,Jj)}let a=m.add(o,s,G3);m.subtract(a,r,a),m.multiplyComponents(n,a,a),m.pack(a,WF,0);let c=m.subtract(o,s,G3);m.subtract(c,r,c),m.multiplyComponents(n,c,c),m.pack(c,WF,3);let d=m.add(o,s,G3);m.add(d,r,d),m.multiplyComponents(n,d,d),m.pack(d,WF,6);let u=m.subtract(o,s,G3);return m.add(u,r,u),m.multiplyComponents(n,u,u),m.pack(u,WF,9),WF}PF.prototype.update=function(e){if(this._mode=e.mode,e.mode!==oe.SCENE3D)return;let t=e.context,n=e.mapProjection.ellipsoid.radii,i=new ne(n.x+this._ellipsoidOffset,n.y+this._ellipsoidOffset,n.z+this._ellipsoidOffset),o=e.useLogDepth;if(l(this._command)||(this._rs=Ue.fromCache({cull:{enabled:!0},depthTest:{enabled:!0},colorMask:{red:!1,green:!1,blue:!1,alpha:!1}}),this._command=new $e({renderState:this._rs,boundingVolume:new de(m.ZERO,i.maximumRadius),pass:Ge.OPAQUE,owner:this})),!l(this._sp)||this._useLogDepth!==o){this._useLogDepth=o;let s=new De({sources:[XF]}),a=new De({sources:[IF]});o&&(a.defines.push("LOG_DEPTH"),s.defines.push("LOG_DEPTH")),this._sp=en.replaceCache({shaderProgram:this._sp,context:t,vertexShaderSource:s,fragmentShaderSource:a,attributeLocations:{position:0}}),this._command.shaderProgram=this._sp}let r=smt(i,e);if(l(this._va))this._va.getAttribute(0).vertexBuffer.copyFromArrayView(r);else{let s=new mt({attributes:{position:new Ze({componentDatatype:Q.FLOAT,componentsPerAttribute:3,values:r})},indices:[0,1,2,2,1,3],primitiveType:Ae.TRIANGLES});this._va=oi.fromGeometry({context:t,geometry:s,attributeLocations:{position:0},bufferUsage:ke.DYNAMIC_DRAW}),this._command.vertexArray=this._va}};PF.prototype.execute=function(e,t){this._mode===oe.SCENE3D&&this._command.execute(e,t)};PF.prototype.isDestroyed=function(){return!1};PF.prototype.destroy=function(){this._sp=this._sp&&this._sp.destroy(),this._va=this._va&&this._va.destroy()};var vF=PF;var Svi=T(S(),1);function gL(){}var amt=/\bgl_FragDepth\b/,cmt=/\bdiscard\b/;function lmt(e,t){let n=e.shaderCache.getDerivedShaderProgram(t,"depthOnly");if(l(n))return n;let i=t.fragmentShaderSource,o=!1,r=i.sources;for(let a=0;a<r.length;++a)if(amt.test(r[a])||cmt.test(r[a])){o=!0;break}let s=i.defines.indexOf("LOG_DEPTH")>=0;if(!o&&!s){let a=`void main() { out_FragColor = vec4(1.0); } `;i=new De({sources:[a]})}else if(!o&&s){let a=`void main() { out_FragColor = vec4(1.0); czm_writeLogDepth(); } `;i=new De({defines:["LOG_DEPTH"],sources:[a]})}return e.shaderCache.createDerivedShaderProgram(t,"depthOnly",{vertexShaderSource:t.vertexShaderSource,fragmentShaderSource:i,attributeLocations:t._attributeLocations})}function dmt(e,t){let n=e._depthOnlyRenderStateCache,i=n[t.id];if(l(i))return i;let o=Ue.getState(t);o.depthMask=!0,o.colorMask={red:!1,green:!1,blue:!1,alpha:!1};let r=Ue.fromCache(o);return n[t.id]=r,r}gL.createDepthOnlyDerivedCommand=function(e,t,n,i){var s,a;l(i)||(i={});let o=(s=i.depthOnlyCommand)==null?void 0:s.shaderProgram,r=(a=i.depthOnlyCommand)==null?void 0:a.renderState;return i.depthOnlyCommand=$e.shallowClone(t,i.depthOnlyCommand),!l(o)||i.shaderProgramId!==t.shaderProgram.id?(i.depthOnlyCommand.shaderProgram=lmt(n,t.shaderProgram),i.depthOnlyCommand.renderState=dmt(e,t.renderState),i.shaderProgramId=t.shaderProgram.id):(i.depthOnlyCommand.shaderProgram=o,i.depthOnlyCommand.renderState=r),i};var umt=/\s+czm_writeLogDepth\(/,mmt=/\s+czm_vertexLogDepth\(/;function hmt(e,t){if(t.fragmentShaderSource.defines.indexOf("LOG_DEPTH_READ_ONLY")>=0)return t;let i=e.shaderCache.getDerivedShaderProgram(t,"logDepth");if(l(i))return i;let o=t._attributeLocations,r=t.vertexShaderSource.clone(),s=t.fragmentShaderSource.clone();r.defines=l(r.defines)?r.defines.slice(0):[],r.defines.push("LOG_DEPTH"),s.defines=l(s.defines)?s.defines.slice(0):[],s.defines.push("LOG_DEPTH");let a=!1,c=r.sources;for(let u=0;u<c.length;++u)if(mmt.test(c[u])){a=!0;break}if(!a){for(let h=0;h<c.length;++h)c[h]=De.replaceMain(c[h],"czm_log_depth_main");c.push(` void main() { czm_log_depth_main(); czm_vertexLogDepth(); } `)}c=s.sources,a=!1;for(let u=0;u<c.length;++u)umt.test(c[u])&&(a=!0);s.defines.indexOf("LOG_DEPTH_WRITE")!==-1&&(a=!0);let d="";if(!a){for(let u=0;u<c.length;u++)c[u]=De.replaceMain(c[u],"czm_log_depth_main");d=` void main() { czm_log_depth_main(); czm_writeLogDepth(); } `}return c.push(d),e.shaderCache.createDerivedShaderProgram(t,"logDepth",{vertexShaderSource:r,fragmentShaderSource:s,attributeLocations:o})}gL.createLogDepthCommand=function(e,t,n){var o;l(n)||(n={});let i=(o=n.command)==null?void 0:o.shaderProgram;return n.command=$e.shallowClone(e,n.command),!l(i)||n.shaderProgramId!==e.shaderProgram.id?(n.command.shaderProgram=hmt(t,e.shaderProgram),n.shaderProgramId=e.shaderProgram.id):n.command.shaderProgram=i,n};function fmt(e,t,n){let i=e.shaderCache.getDerivedShaderProgram(t,"pick");if(l(i))return i;Object.prototype.toString.call(n)==="[object Object]"&&(n.color?n=`vec4(${B.floatToByte(n.color.red)}, ${B.floatToByte(n.color.green)}, ${B.floatToByte(n.color.blue)}, ${B.floatToByte(n.color.alpha)})`:n="vec4(1.0)");let o=t._attributeLocations,{sources:r,defines:s}=t.fragmentShaderSource,c=r.some(g=>g.includes("out_FragData"))?"out_FragData_0":"out_FragColor",d=`void main () { czm_non_pick_main(); if (${c}.a == 0.0) { discard; } ${c} = ${n}; } `,u=r.length,h=new Array(u+1);for(let g=0;g<u;++g)h[g]=De.replaceMain(r[g],"czm_non_pick_main");h[u]=d;let p=new De({sources:h,defines:s});return e.shaderCache.createDerivedShaderProgram(t,"pick",{vertexShaderSource:t.vertexShaderSource,fragmentShaderSource:p,attributeLocations:o})}function Ixe(e,t){let n=e.picking.pickRenderStateCache,i=n[t.id];if(l(i))return i;let o=Ue.getState(t);o.blending.enabled=!1,o.depthMask=!0;let r=Ue.fromCache(o);return n[t.id]=r,r}gL.createPickDerivedCommand=function(e,t,n,i){var s,a;l(i)||(i={});let o=(s=i.pickCommand)==null?void 0:s.shaderProgram,r=(a=i.pickCommand)==null?void 0:a.renderState;return i.pickCommand=$e.shallowClone(t,i.pickCommand),!l(o)||i.shaderProgramId!==t.shaderProgram.id?(i.pickCommand.shaderProgram=fmt(n,t.shaderProgram,t.pickId),i.pickCommand.renderState=Ixe(e,t.renderState),i.shaderProgramId=t.shaderProgram.id):(i.pickCommand.shaderProgram=o,i.pickCommand.renderState=r),i};function bL(e,t,n){let i=e.length;for(let o=0;o<i;o++)e[o].trimStart().split(/\s+/)[0]===t&&(e[o]=`${t} ${n}`)}function Xxe(e){return e.isArray?e.arrayLength:ut.getComponentCount(e.type)}function pmt(e){let t=Xxe(e);return e.normalized?t===1?"float":`vec${t}`:t===1?"int":`ivec${t}`}function Wxe(e,t,n){return`((${e} - float(${t})) / float(${n}))`}function Pxe(e,t){let n=At.getMaximum(t);return`(${e}) / float(${n})`}function bmt(e,t){let n="float(value)";if(t.hasValueTransform){let i=t.offset,o=t.scale;n=Wxe(n,i,o)}return e.normalized||(n=Pxe(n,e.componentType)),n}function gmt(e,t,n){let o=`float(${`value.${n}`})`;if(t.hasValueTransform){let r=t.offset[n],s=t.scale[n];o=Wxe(o,r,s)}return e.normalized||(o=Pxe(o,e.componentType)),o}function ymt(e,t,n){let i=n.schemaId,o=n.className,r=n.propertyName,s=`pickMetadata-${i}-${o}-${r}`,a=e.shaderCache.getDerivedShaderProgram(t,s);if(l(a))return a;let c=n.metadataProperty,d=n.classProperty,u=pmt(d),h=["0.0","0.0","0.0","0.0"],p=Xxe(d);if(p===1)h[0]=bmt(d,c);else{let _=["x","y","z","w"];for(let C=0;C<p;C++)h[C]=gmt(d,c,_[C])}let g=t.fragmentShaderSource.defines.slice();g.push(Rd.METADATA_PICKING_ENABLED),bL(g,Rd.METADATA_PICKING_VALUE_TYPE,u),bL(g,Rd.METADATA_PICKING_VALUE_STRING,`metadata.${r}`),bL(g,Rd.METADATA_PICKING_VALUE_COMPONENT_X,h[0]),bL(g,Rd.METADATA_PICKING_VALUE_COMPONENT_Y,h[1]),bL(g,Rd.METADATA_PICKING_VALUE_COMPONENT_Z,h[2]),bL(g,Rd.METADATA_PICKING_VALUE_COMPONENT_W,h[3]);let f=new De({sources:t.fragmentShaderSource.sources,defines:g});return e.shaderCache.createDerivedShaderProgram(t,s,{vertexShaderSource:t.vertexShaderSource,fragmentShaderSource:f,attributeLocations:t._attributeLocations})}gL.createPickMetadataDerivedCommand=function(e,t,n,i){return l(i)||(i={}),i.pickMetadataCommand=$e.shallowClone(t,i.pickMetadataCommand),i.pickMetadataCommand.shaderProgram=ymt(n,t.shaderProgram,t.pickedMetadataInfo),i.pickMetadataCommand.renderState=Ixe(e,t.renderState),i.shaderProgramId=t.shaderProgram.id,i};function xmt(e,t){let n=e.shaderCache.getDerivedShaderProgram(t,"HDR");if(l(n))return n;let i=t._attributeLocations,o=t.vertexShaderSource.clone(),r=t.fragmentShaderSource.clone();return o.defines=l(o.defines)?o.defines.slice(0):[],o.defines.push("HDR"),r.defines=l(r.defines)?r.defines.slice(0):[],r.defines.push("HDR"),e.shaderCache.createDerivedShaderProgram(t,"HDR",{vertexShaderSource:o,fragmentShaderSource:r,attributeLocations:i})}gL.createHdrCommand=function(e,t,n){var o;l(n)||(n={});let i=(o=n.command)==null?void 0:o.shaderProgram;return n.command=$e.shallowClone(e,n.command),!l(i)||n.shaderProgramId!==e.shaderProgram.id?(n.command.shaderProgram=xmt(t,e.shaderProgram),n.shaderProgramId=e.shaderProgram.id):n.command.shaderProgram=i,n};var cp=gL;var Evi=T(S(),1);function E3(e){this._scene=e,this._lastAlpha=void 0,this._lastBeta=void 0,this._lastGamma=void 0,this._alpha=void 0,this._beta=void 0,this._gamma=void 0;let t=this;function n(i){let o=i.alpha;if(!l(o)){t._alpha=void 0,t._beta=void 0,t._gamma=void 0;return}t._alpha=W.toRadians(o),t._beta=W.toRadians(i.beta),t._gamma=W.toRadians(i.gamma)}window.addEventListener("deviceorientation",n,!1),this._removeListener=function(){window.removeEventListener("deviceorientation",n,!1)}}var _mt=new Fe,vxe=new Fe,Tmt=new $;function Smt(e,t,n,i){let o=e.direction,r=e.right,s=e.up,a=Fe.fromAxisAngle(o,n,vxe),c=Fe.fromAxisAngle(r,i,_mt),d=Fe.multiply(c,a,c),u=Fe.fromAxisAngle(s,t,vxe);Fe.multiply(u,d,d);let h=$.fromQuaternion(d,Tmt);$.multiplyByVector(h,r,r),$.multiplyByVector(h,s,s),$.multiplyByVector(h,o,o)}E3.prototype.update=function(){if(!l(this._alpha))return;l(this._lastAlpha)||(this._lastAlpha=this._alpha,this._lastBeta=this._beta,this._lastGamma=this._gamma);let e=this._lastAlpha-this._alpha,t=this._lastBeta-this._beta,n=this._lastGamma-this._gamma;Smt(this._scene.camera,-e,t,n),this._lastAlpha=this._alpha,this._lastBeta=this._beta,this._lastGamma=this._gamma};E3.prototype.isDestroyed=function(){return!1};E3.prototype.destroy=function(){return this._removeListener(),me(this)};var wF=E3;var wvi=T(S(),1);function Qj(){this.enabled=!0,this.renderable=!0,this.density=6e-4,this.heightScalar=.001,this._heightFalloff=.59,this.maxHeight=8e5,this.visualDensityScalar=.15,this.screenSpaceErrorFactor=2,this.minimumBrightness=.03}Object.defineProperties(Qj.prototype,{heightFalloff:{get:function(){return this._heightFalloff},set:function(e){this._heightFalloff=e}}});var Cmt=new m;Qj.prototype.update=function(e){if(!(e.fog.enabled=this.enabled))return;e.fog.renderable=this.renderable;let n=e.camera,i=n.positionCartographic;if(!l(i)||i.height>this.maxHeight||e.mode!==oe.SCENE3D){e.fog.enabled=!1,e.fog.density=0;return}let o=i.height,r=this.density*this.heightScalar*Math.pow(Math.max(o/this.maxHeight,W.EPSILON4),-Math.max(this._heightFalloff,0)),s=m.normalize(n.positionWC,Cmt),a=Math.abs(m.dot(n.directionWC,s));r*=1-a,e.fog.density=r,e.fog.visualDensityScalar=this.visualDensityScalar,e.fog.sse=this.screenSpaceErrorFactor,e.fog.minimumBrightness=this.minimumBrightness};var FF=Qj;var Mvi=T(S(),1);function Vmt(e,t,n){this.context=e,this.commandList=[],this.shadowMaps=[],this.brdfLutGenerator=void 0,this.environmentMap=void 0,this.sphericalHarmonicCoefficients=void 0,this.specularEnvironmentMaps=void 0,this.specularEnvironmentMapsMaximumLOD=void 0,this.mode=oe.SCENE3D,this.morphTime=oe.getMorphTime(oe.SCENE3D),this.frameNumber=0,this.newFrame=!1,this.time=void 0,this.jobScheduler=n,this.mapProjection=void 0,this.camera=void 0,this.cameraUnderground=!1,this.globeTranslucencyState=void 0,this.cullingVolume=void 0,this.occluder=void 0,this.maximumScreenSpaceError=void 0,this.pixelRatio=1,this.passes={render:!1,pick:!1,pickVoxel:!1,depth:!1,postProcess:!1,offscreen:!1},this.creditDisplay=t,this.afterRender=[],this.scene3DOnly=!1,this.fog={enabled:!1,renderable:!1,density:void 0,visualDensityScalar:void 0,sse:void 0,minimumBrightness:void 0},this.atmosphere=void 0,this.verticalExaggeration=1,this.verticalExaggerationRelativeHeight=0,this.shadowState={shadowsEnabled:!0,shadowMaps:[],lightShadowMaps:[],nearPlane:1,farPlane:5e3,closestObjectSize:1e3,lastDirtyTime:0,outOfView:!0},this.splitPosition=0,this.frustumSplits=[],this.backgroundColor=void 0,this.light=void 0,this.minimumDisableDepthTestDistance=void 0,this.invertClassification=!1,this.invertClassificationColor=void 0,this.useLogDepth=!1,this.tilesetPassState=void 0,this.minimumTerrainHeight=0,this.pickingMetadata=!1,this.pickedMetadataInfo=void 0}var AF=Vmt;var qvi=T(S(),1);var Ra={OPAQUE_FRONT_FACE:0,OPAQUE_BACK_FACE:1,DEPTH_ONLY_FRONT_FACE:2,DEPTH_ONLY_BACK_FACE:3,DEPTH_ONLY_FRONT_AND_BACK_FACE:4,TRANSLUCENT_FRONT_FACE:5,TRANSLUCENT_BACK_FACE:6,TRANSLUCENT_FRONT_FACE_MANUAL_DEPTH_TEST:7,TRANSLUCENT_BACK_FACE_MANUAL_DEPTH_TEST:8,PICK_FRONT_FACE:9,PICK_BACK_FACE:10,DERIVED_COMMANDS_MAXIMUM_LENGTH:11},qT=Ra.DERIVED_COMMANDS_MAXIMUM_LENGTH,Oxe=["opaqueFrontFaceCommand","opaqueBackFaceCommand","depthOnlyFrontFaceCommand","depthOnlyBackFaceCommand","depthOnlyFrontAndBackFaceCommand","translucentFrontFaceCommand","translucentBackFaceCommand","translucentFrontFaceManualDepthTestCommand","translucentBackFaceManualDepthTestCommand","pickFrontFaceCommand","pickBackFaceCommand"];function $T(){this._frontFaceAlphaByDistance=new Ut(0,1,0,1),this._backFaceAlphaByDistance=new Ut(0,1,0,1),this._frontFaceTranslucent=!1,this._backFaceTranslucent=!1,this._requiresManualDepthTest=!1,this._sunVisibleThroughGlobe=!1,this._environmentVisible=!1,this._useDepthPlane=!1,this._numberOfTextureUniforms=0,this._globeTranslucencyFramebuffer=void 0,this._rectangle=le.clone(le.MAX_VALUE),this._derivedCommandKey=0,this._derivedCommandsDirty=!1,this._derivedCommandPacks=void 0,this._derivedCommandTypes=new Array(qT),this._derivedBlendCommandTypes=new Array(qT),this._derivedPickCommandTypes=new Array(qT),this._derivedCommandTypesToUpdate=new Array(qT),this._derivedCommandsLength=0,this._derivedBlendCommandsLength=0,this._derivedPickCommandsLength=0,this._derivedCommandsToUpdateLength=0}Object.defineProperties($T.prototype,{frontFaceAlphaByDistance:{get:function(){return this._frontFaceAlphaByDistance}},backFaceAlphaByDistance:{get:function(){return this._backFaceAlphaByDistance}},translucent:{get:function(){return this._frontFaceTranslucent}},sunVisibleThroughGlobe:{get:function(){return this._sunVisibleThroughGlobe}},environmentVisible:{get:function(){return this._environmentVisible}},useDepthPlane:{get:function(){return this._useDepthPlane}},numberOfTextureUniforms:{get:function(){return this._numberOfTextureUniforms}},rectangle:{get:function(){return this._rectangle}}});$T.prototype.update=function(e){let t=e.globe;if(!l(t)||!t.show){this._frontFaceTranslucent=!1,this._backFaceTranslucent=!1,this._sunVisibleThroughGlobe=!0,this._environmentVisible=!0,this._useDepthPlane=!1;return}this._frontFaceAlphaByDistance=wxe(t.translucency.enabled,t.translucency.frontFaceAlpha,t.translucency.frontFaceAlphaByDistance,this._frontFaceAlphaByDistance),this._backFaceAlphaByDistance=wxe(t.translucency.enabled,t.translucency.backFaceAlpha,t.translucency.backFaceAlphaByDistance,this._backFaceAlphaByDistance),this._frontFaceTranslucent=Fxe(t.translucency.enabled,this._frontFaceAlphaByDistance,t),this._backFaceTranslucent=Fxe(t.translucency.enabled,this._backFaceAlphaByDistance,t),this._requiresManualDepthTest=Gmt(this,e,t),this._sunVisibleThroughGlobe=Lmt(this,e),this._environmentVisible=Rmt(this,e),this._useDepthPlane=Zmt(this,e),this._numberOfTextureUniforms=Emt(this),this._rectangle=le.clone(t.translucency.rectangle,this._rectangle),Imt(this,e)};function wxe(e,t,n,i){return e?l(n)?(Ut.clone(n,i),i.nearValue*=t,i.farValue*=t,i):(i.nearValue=t,i.farValue=t,i):(i.nearValue=1,i.farValue=1,i)}function Fxe(e,t,n){return e&&(n.baseColor.alpha<1||t.nearValue<1||t.farValue<1)}function Lmt(e,t){let n=e._frontFaceTranslucent,i=e._backFaceTranslucent;return n&&(t.cameraUnderground||i)}function Rmt(e,t){return!t.cameraUnderground||e._frontFaceTranslucent}function Zmt(e,t){return!t.cameraUnderground&&!e._frontFaceTranslucent}function Gmt(e,t,n){return e._frontFaceTranslucent&&!e._backFaceTranslucent&&!n.depthTestAgainstTerrain&&t.mode!==oe.SCENE2D&&t.context.depthTexture}function Emt(e){let t=0;return e._frontFaceTranslucent&&++t,e._requiresManualDepthTest&&++t,t}function Imt(e,t){e._derivedCommandsLength=jj(e,t,!1,!1,e._derivedCommandTypes),e._derivedBlendCommandsLength=jj(e,t,!0,!1,e._derivedBlendCommandTypes),e._derivedPickCommandsLength=jj(e,t,!1,!0,e._derivedPickCommandTypes);let n,i=0;for(n=0;n<e._derivedCommandsLength;++n)i|=1<<e._derivedCommandTypes[n];for(n=0;n<e._derivedBlendCommandsLength;++n)i|=1<<e._derivedBlendCommandTypes[n];for(n=0;n<e._derivedPickCommandsLength;++n)i|=1<<e._derivedPickCommandTypes[n];let o=0;for(n=0;n<qT;++n)(i&1<<n)>0&&(e._derivedCommandTypesToUpdate[o++]=n);e._derivedCommandsToUpdateLength=o;let r=i!==e._derivedCommandKey;e._derivedCommandKey=i,e._derivedCommandsDirty=r,!l(e._derivedCommandPacks)&&e._frontFaceTranslucent&&(e._derivedCommandPacks=Ymt())}function jj(e,t,n,i,o){let r=0,s=e._frontFaceTranslucent,a=e._backFaceTranslucent;if(!s)return r;let c=t.cameraUnderground,d=e._requiresManualDepthTest,u=i?Ra.PICK_FRONT_FACE:d?Ra.TRANSLUCENT_FRONT_FACE_MANUAL_DEPTH_TEST:Ra.TRANSLUCENT_FRONT_FACE,h=i?Ra.PICK_BACK_FACE:d?Ra.TRANSLUCENT_BACK_FACE_MANUAL_DEPTH_TEST:Ra.TRANSLUCENT_BACK_FACE;return t.mode===oe.SCENE2D?(o[r++]=Ra.DEPTH_ONLY_FRONT_FACE,o[r++]=u,r):(a?(n||(o[r++]=Ra.DEPTH_ONLY_FRONT_AND_BACK_FACE),c?(o[r++]=u,o[r++]=h):(o[r++]=h,o[r++]=u)):c?(n||(o[r++]=Ra.DEPTH_ONLY_BACK_FACE),o[r++]=Ra.OPAQUE_FRONT_FACE,o[r++]=h):(n||(o[r++]=Ra.DEPTH_ONLY_FRONT_FACE),o[r++]=Ra.OPAQUE_BACK_FACE,o[r++]=u),r)}function gm(e,t){let n=e.indexOf(t);n>-1&&e.splice(n,1)}function Axe(e,t){return e.indexOf(t)>-1}function Xmt(e,t){gm(e.defines,"TRANSLUCENT"),gm(t.defines,"TRANSLUCENT")}function Wmt(e,t){gm(e.defines,"GROUND_ATMOSPHERE"),gm(t.defines,"GROUND_ATMOSPHERE"),gm(e.defines,"FOG"),gm(t.defines,"FOG"),gm(e.defines,"TRANSLUCENT"),gm(t.defines,"TRANSLUCENT")}function qj(e,t){if(Axe(t.defines,"TILE_LIMIT_RECTANGLE")||Axe(t.defines,"ENABLE_CLIPPING_PLANES"))return;let n=`void main() { out_FragColor = vec4(1.0); } `;t.sources=[n]}function $j(e,t){let n=t.sources,i=n.length;for(let r=0;r<i;++r)n[r]=De.replaceMain(n[r],"czm_globe_translucency_main");n.push(` uniform sampler2D u_classificationTexture; void main() { vec2 st = gl_FragCoord.xy / czm_viewport.zw; #ifdef MANUAL_DEPTH_TEST float logDepthOrDepth = czm_unpackDepth(texture(czm_globeDepthTexture, st)); if (logDepthOrDepth != 0.0) { vec4 eyeCoordinate = czm_windowToEyeCoordinates(gl_FragCoord.xy, logDepthOrDepth); float depthEC = eyeCoordinate.z / eyeCoordinate.w; if (v_positionEC.z < depthEC) { discard; } } #endif czm_globe_translucency_main(); vec4 classificationColor = texture(u_classificationTexture, st); if (classificationColor.a > 0.0) { // Reverse premultiplication process to get the correct composited result of the classification primitives classificationColor.rgb /= classificationColor.a; } out_FragColor = classificationColor * vec4(classificationColor.aaa, 1.0) + out_FragColor * (1.0 - classificationColor.a); } `)}function Yxe(e,t){$j(e,t),gm(e.defines,"GROUND_ATMOSPHERE"),gm(t.defines,"GROUND_ATMOSPHERE"),gm(e.defines,"FOG"),gm(t.defines,"FOG")}function Pmt(e,t){$j(e,t),e.defines.push("GENERATE_POSITION"),t.defines.push("MANUAL_DEPTH_TEST")}function vmt(e,t){Yxe(e,t),e.defines.push("GENERATE_POSITION"),t.defines.push("MANUAL_DEPTH_TEST")}function Mxe(e,t){let n=`uniform sampler2D u_classificationTexture; void main() { vec2 st = gl_FragCoord.xy / czm_viewport.zw; vec4 pickColor = texture(u_classificationTexture, st); if (pickColor == vec4(0.0)) { discard; } out_FragColor = pickColor; } `;t.sources=[n]}function wmt(e,t,n,i,o,r){if(!l(o))return t;if(!i&&l(n))return n;let s=e.shaderCache.getDerivedShaderProgram(t,r);if(!l(s)){let a=t._attributeLocations,c=t.vertexShaderSource.clone(),d=t.fragmentShaderSource.clone();c.defines=l(c.defines)?c.defines.slice(0):[],d.defines=l(d.defines)?d.defines.slice(0):[],o(c,d),s=e.shaderCache.createDerivedShaderProgram(t,r,{vertexShaderSource:c,fragmentShaderSource:d,attributeLocations:a})}return s}function Fmt(e){e.cull.face=_i.BACK,e.cull.enabled=!0}function Amt(e){e.cull.face=_i.FRONT,e.cull.enabled=!0}function Mmt(e){e.cull.face=_i.BACK,e.cull.enabled=!0,e.colorMask={red:!1,green:!1,blue:!1,alpha:!1}}function Nmt(e){e.cull.face=_i.FRONT,e.cull.enabled=!0,e.colorMask={red:!1,green:!1,blue:!1,alpha:!1}}function kmt(e){e.cull.enabled=!1,e.colorMask={red:!1,green:!1,blue:!1,alpha:!1}}function Nxe(e){e.cull.face=_i.BACK,e.cull.enabled=!0,e.depthMask=!1,e.blending=hn.ALPHA_BLEND}function kxe(e){e.cull.face=_i.FRONT,e.cull.enabled=!0,e.depthMask=!1,e.blending=hn.ALPHA_BLEND}function Umt(e){e.cull.face=_i.BACK,e.cull.enabled=!0,e.blending.enabled=!1}function Dmt(e){e.cull.face=_i.FRONT,e.cull.enabled=!0,e.blending.enabled=!1}function Bmt(e,t,n,i,o){if(!l(i))return e;if(!n&&l(t))return t;let r=o[e.id];if(!l(r)){let s=Ue.getState(e);i(s),r=Ue.fromCache(s),o[e.id]=r}return r}function yL(e){return{u_classificationTexture:function(){return e._globeTranslucencyFramebuffer.classificationTexture}}}function Omt(e,t,n,i,o){return l(o)?!i&&l(n)?n:Lt(t,o(e),!1):t}function Oh(e){this.pass=e.pass,this.pickOnly=e.pickOnly,this.getShaderProgramFunction=e.getShaderProgramFunction,this.getRenderStateFunction=e.getRenderStateFunction,this.getUniformMapFunction=e.getUniformMapFunction,this.renderStateCache={}}function Ymt(){return[new Oh({pass:Ge.GLOBE,pickOnly:!1,getShaderProgramFunction:Xmt,getRenderStateFunction:Fmt,getUniformMapFunction:void 0}),new Oh({pass:Ge.GLOBE,pickOnly:!1,getShaderProgramFunction:Wmt,getRenderStateFunction:Amt,getUniformMapFunction:void 0}),new Oh({pass:Ge.GLOBE,pickOnly:!1,getShaderProgramFunction:qj,getRenderStateFunction:Mmt,getUniformMapFunction:void 0}),new Oh({pass:Ge.GLOBE,pickOnly:!1,getShaderProgramFunction:qj,getRenderStateFunction:Nmt,getUniformMapFunction:void 0}),new Oh({pass:Ge.GLOBE,pickOnly:!1,getShaderProgramFunction:qj,getRenderStateFunction:kmt,getUniformMapFunction:void 0}),new Oh({pass:Ge.TRANSLUCENT,pickOnly:!1,getShaderProgramFunction:$j,getRenderStateFunction:Nxe,getUniformMapFunction:yL}),new Oh({pass:Ge.TRANSLUCENT,pickOnly:!1,getShaderProgramFunction:Yxe,getRenderStateFunction:kxe,getUniformMapFunction:yL}),new Oh({pass:Ge.TRANSLUCENT,pickOnly:!1,getShaderProgramFunction:Pmt,getRenderStateFunction:Nxe,getUniformMapFunction:yL}),new Oh({pass:Ge.TRANSLUCENT,pickOnly:!1,getShaderProgramFunction:vmt,getRenderStateFunction:kxe,getUniformMapFunction:yL}),new Oh({pass:Ge.TRANSLUCENT,pickOnly:!0,getShaderProgramFunction:Mxe,getRenderStateFunction:Umt,getUniformMapFunction:yL}),new Oh({pass:Ge.TRANSLUCENT,pickOnly:!0,getShaderProgramFunction:Mxe,getRenderStateFunction:Dmt,getUniformMapFunction:yL})]}var Uxe=new Array(qT),Dxe=new Array(qT);$T.prototype.updateDerivedCommands=function(e,t){let n=this._derivedCommandTypesToUpdate,i=this._derivedCommandsToUpdateLength;if(i!==0){for(let o=0;o<i;++o)Dxe[o]=this._derivedCommandPacks[n[o]],Uxe[o]=Oxe[n[o]];Hmt(this,e,i,n,Uxe,Dxe,t)}};function Hmt(e,t,n,i,o,r,s){let a=t.derivedCommands.globeTranslucency,c=e._derivedCommandsDirty;if(t.dirty||!l(a)||c){t.dirty=!1,l(a)||(a={},t.derivedCommands.globeTranslucency=a);let d=s.frameNumber,u=y(a.uniformMapDirtyFrame,0),h=y(a.shaderProgramDirtyFrame,0),p=y(a.renderStateDirtyFrame,0),g=a.uniformMap!==t.uniformMap,f=a.shaderProgramId!==t.shaderProgram.id,x=a.renderStateId!==t.renderState.id;g&&(a.uniformMapDirtyFrame=d),f&&(a.shaderProgramDirtyFrame=d),x&&(a.renderStateDirtyFrame=d),a.uniformMap=t.uniformMap,a.shaderProgramId=t.shaderProgram.id,a.renderStateId=t.renderState.id;for(let _=0;_<n;++_){let C=r[_],V=i[_],L=o[_],R=a[L],G,I,v;l(R)?(G=R.uniformMap,I=R.shaderProgram,v=R.renderState):(G=void 0,I=void 0,v=void 0),R=$e.shallowClone(t,R),a[L]=R;let P=y(R.derivedCommands.uniformMapDirtyFrame,0),w=y(R.derivedCommands.shaderProgramDirtyFrame,0),A=y(R.derivedCommands.renderStateDirtyFrame,0),b=g||P<u,Z=f||w<h,E=x||A<p;b&&(R.derivedCommands.uniformMapDirtyFrame=d),Z&&(R.derivedCommands.shaderProgramDirtyFrame=d),E&&(R.derivedCommands.renderStateDirtyFrame=d),R.derivedCommands.type=V,R.pass=C.pass,R.pickOnly=C.pickOnly,R.uniformMap=Omt(e,t.uniformMap,G,b,C.getUniformMapFunction),R.shaderProgram=wmt(s.context,t.shaderProgram,I,Z,C.getShaderProgramFunction,L),R.renderState=Bmt(t.renderState,v,E,C.getRenderStateFunction,C.renderStateCache)}}}$T.prototype.pushDerivedCommands=function(e,t,n){let i=n.passes.pick||n.passes.pickVoxel;if(i&&t)return;let o=this._derivedCommandTypes,r=this._derivedCommandsLength;if(i?(o=this._derivedPickCommandTypes,r=this._derivedPickCommandsLength):t&&(o=this._derivedBlendCommandTypes,r=this._derivedBlendCommandsLength),r===0){n.commandList.push(e);return}let s=e.derivedCommands.globeTranslucency;for(let a=0;a<r;++a){let c=Oxe[o[a]];n.commandList.push(s[c])}};function Hxe(e,t,n,i,o,r){for(let s=0;s<t;++s){let a=e[s],c=a.derivedCommands.type;(!l(r)||r.indexOf(c)>-1)&&n(a,i,o)}}function Bxe(e,t,n,i,o){for(let r=0;r<t;++r)n(e[r],i,o)}var zmt=[Ra.OPAQUE_FRONT_FACE,Ra.OPAQUE_BACK_FACE],Kmt=[Ra.DEPTH_ONLY_FRONT_FACE,Ra.DEPTH_ONLY_BACK_FACE,Ra.DEPTH_ONLY_FRONT_AND_BACK_FACE];$T.prototype.executeGlobeCommands=function(e,t,n,i,o){let r=i.context,s=e.commands[Ge.GLOBE],a=e.indices[Ge.GLOBE];a!==0&&(this._globeTranslucencyFramebuffer=n,n.clearClassification(r,o),Hxe(s,a,t,i,o,zmt))};$T.prototype.executeGlobeClassificationCommands=function(e,t,n,i,o){let{context:r}=i,{uniformState:s}=r,a=e.commands[Ge.GLOBE],c=e.indices[Ge.GLOBE],d=e.commands[Ge.TERRAIN_CLASSIFICATION],u=e.indices[Ge.TERRAIN_CLASSIFICATION];if(c===0||u===0)return;let h=this._frontFaceTranslucent,p=this._backFaceTranslucent;if((!h||!p)&&Bxe(d,u,t,i,o),!h&&!p)return;this._globeTranslucencyFramebuffer=n;let g=s.globeDepthTexture,f=o.framebuffer;if(o.framebuffer=n.classificationFramebuffer,Hxe(a,c,t,i,o,Kmt),r.depthTexture){let x=n.packDepth(r,o);s.globeDepthTexture=x}Bxe(d,u,t,i,o),s.globeDepthTexture=g,o.framebuffer=f};var MF=$T;var xwi=T(S(),1);var ewi=T(S(),1),od=`uniform sampler2D colorTexture; in vec2 v_textureCoordinates; void main() { out_FragColor = texture(colorTexture, v_textureCoordinates); } `;function lp(){this._numSamples=1,this.previousFramebuffer=void 0,this._previousFramebuffer=void 0,this._depthStencilTexture=void 0,this._depthStencilRenderbuffer=void 0,this._fbo=new bi({depthStencil:!0,createDepthAttachments:!1}),this._fboClassified=new bi({depthStencil:!0,createDepthAttachments:!1}),this._rsUnclassified=void 0,this._rsClassified=void 0,this._unclassifiedCommand=void 0,this._classifiedCommand=void 0,this._translucentCommand=void 0,this._clearColorCommand=new ai({color:new B(0,0,0,0),owner:this}),this._clearCommand=new ai({color:new B(0,0,0,0),depth:1,stencil:0});let e=this;this._uniformMap={colorTexture:function(){return e._fbo.getColorTexture()},depthTexture:function(){return e._depthStencilTexture},classifiedTexture:function(){return e._fboClassified.getColorTexture()}}}Object.defineProperties(lp.prototype,{unclassifiedCommand:{get:function(){return this._unclassifiedCommand}}});lp.isTranslucencySupported=function(e){return e.depthTexture&&e.fragmentDepth};var Jmt={depthMask:!1,stencilTest:{enabled:!0,frontFunction:On.EQUAL,frontOperation:{fail:ft.KEEP,zFail:ft.KEEP,zPass:ft.KEEP},backFunction:On.NEVER,reference:0,mask:Dt.CLASSIFICATION_MASK},blending:hn.ALPHA_BLEND},Qmt={depthMask:!1,stencilTest:{enabled:!0,frontFunction:On.NOT_EQUAL,frontOperation:{fail:ft.KEEP,zFail:ft.KEEP,zPass:ft.KEEP},backFunction:On.NEVER,reference:0,mask:Dt.CLASSIFICATION_MASK},blending:hn.ALPHA_BLEND},jmt={depthMask:!0,depthTest:{enabled:!0},stencilTest:Dt.setCesium3DTileBit(),stencilMask:Dt.CESIUM_3D_TILE_MASK,blending:hn.ALPHA_BLEND},qmt=`uniform sampler2D colorTexture; uniform sampler2D depthTexture; uniform sampler2D classifiedTexture; in vec2 v_textureCoordinates; void main() { vec4 color = texture(colorTexture, v_textureCoordinates); if (color.a == 0.0) { discard; } bool isClassified = all(equal(texture(classifiedTexture, v_textureCoordinates), vec4(0.0))); #ifdef UNCLASSIFIED vec4 highlightColor = czm_invertClassificationColor; if (isClassified) { discard; } #else vec4 highlightColor = vec4(1.0); if (!isClassified) { discard; } #endif out_FragColor = color * highlightColor; gl_FragDepth = texture(depthTexture, v_textureCoordinates).r; } `,$mt=`uniform sampler2D colorTexture; in vec2 v_textureCoordinates; void main() { vec4 color = texture(colorTexture, v_textureCoordinates); if (color.a == 0.0) { discard; } #ifdef UNCLASSIFIED out_FragColor = color * czm_invertClassificationColor; #else out_FragColor = color; #endif } `;lp.prototype.update=function(e,t,n){let i=this._fbo.getColorTexture(),o=this.previousFramebuffer!==this._previousFramebuffer;this._previousFramebuffer=this.previousFramebuffer;let r=this._numSamples!==t,s=e.drawingBufferWidth,a=e.drawingBufferHeight,c=!l(i)||i.width!==s||i.height!==a;if((c||o||r)&&(this._numSamples=t,this._depthStencilTexture=this._depthStencilTexture&&this._depthStencilTexture.destroy(),this._depthStencilRenderbuffer=this._depthStencilRenderbuffer&&this._depthStencilRenderbuffer.destroy(),l(this._previousFramebuffer)||(this._depthStencilTexture=new Wt({context:e,width:s,height:a,pixelFormat:ot.DEPTH_STENCIL,pixelDatatype:je.UNSIGNED_INT_24_8}),t>1&&(this._depthStencilRenderbuffer=new Ld({context:e,width:s,height:a,format:nl.DEPTH24_STENCIL8,numSamples:t})))),!l(this._fbo.framebuffer)||c||o||r){this._fbo.destroy(),this._fboClassified.destroy();let d,u;l(this._previousFramebuffer)?(d=n.getDepthStencilTexture(),u=n.getDepthStencilRenderbuffer()):(d=this._depthStencilTexture,u=this._depthStencilRenderbuffer),this._fbo.setDepthStencilTexture(d),l(u)&&this._fbo.setDepthStencilRenderbuffer(u),this._fbo.update(e,s,a,t),l(this._previousFramebuffer)||(this._fboClassified.setDepthStencilTexture(d),this._fboClassified.update(e,s,a))}if(l(this._rsUnclassified)||(this._rsUnclassified=Ue.fromCache(Jmt),this._rsClassified=Ue.fromCache(Qmt),this._rsDefault=Ue.fromCache(jmt)),!l(this._unclassifiedCommand)||o||r){l(this._unclassifiedCommand)&&(this._unclassifiedCommand.shaderProgram=this._unclassifiedCommand.shaderProgram&&this._unclassifiedCommand.shaderProgram.destroy(),this._classifiedCommand.shaderProgram=this._classifiedCommand.shaderProgram&&this._classifiedCommand.shaderProgram.destroy());let d=l(this._previousFramebuffer)?$mt:qmt,u=new De({defines:["UNCLASSIFIED"],sources:[d]}),h=new De({sources:[d]});this._unclassifiedCommand=e.createViewportQuadCommand(u,{renderState:l(this._previousFramebuffer)?this._rsUnclassified:this._rsDefault,uniformMap:this._uniformMap,owner:this}),this._classifiedCommand=e.createViewportQuadCommand(h,{renderState:l(this._previousFramebuffer)?this._rsClassified:this._rsDefault,uniformMap:this._uniformMap,owner:this}),l(this._translucentCommand)&&(this._translucentCommand.shaderProgram=this._translucentCommand.shaderProgram&&this._translucentCommand.shaderProgram.destroy()),l(this._previousFramebuffer)||(this._translucentCommand=e.createViewportQuadCommand(od,{renderState:this._rsUnclassified,uniformMap:this._uniformMap,owner:this}))}};lp.prototype.prepareTextures=function(e,t){this._fbo._numSamples>1&&this._fbo.prepareTextures(e,t)};lp.prototype.clear=function(e,t){l(this._previousFramebuffer)?this._fbo.clear(e,this._clearColorCommand,t):(this._fbo.clear(e,this._clearCommand,t),this._fboClassified.clear(e,this._clearCommand,t))};lp.prototype.executeClassified=function(e,t){if(!l(this._previousFramebuffer)){let n=t.framebuffer;this.prepareTextures(e,!0),t.framebuffer=this._fboClassified.framebuffer,this._translucentCommand.execute(e,t),t.framebuffer=n}this._classifiedCommand.execute(e,t)};lp.prototype.executeUnclassified=function(e,t){this._unclassifiedCommand.execute(e,t)};lp.prototype.isDestroyed=function(){return!1};lp.prototype.destroy=function(){return this._fbo.destroy(),this._fboClassified.destroy(),this._depthStencilTexture=this._depthStencilTexture&&this._depthStencilTexture.destroy(),this._depthStencilRenderbuffer=this._depthStencilRenderbuffer&&this._depthStencilRenderbuffer.destroy(),l(this._unclassifiedCommand)&&(this._unclassifiedCommand.shaderProgram=this._unclassifiedCommand.shaderProgram&&this._unclassifiedCommand.shaderProgram.destroy(),this._classifiedCommand.shaderProgram=this._classifiedCommand.shaderProgram&&this._classifiedCommand.shaderProgram.destroy()),me(this)};var xL=lp;var Vwi=T(S(),1);function I3(e){this._total=e,this.usedThisFrame=0,this.stolenFromMeThisFrame=0,this.starvedThisFrame=!1,this.starvedLastFrame=!1}Object.defineProperties(I3.prototype,{total:{get:function(){return this._total}}});function Ay(e){let t=new Array(ka.NUMBER_OF_JOB_TYPES);t[ka.TEXTURE]=new I3(l(e)?e[ka.TEXTURE]:10),t[ka.PROGRAM]=new I3(l(e)?e[ka.PROGRAM]:10),t[ka.BUFFER]=new I3(l(e)?e[ka.BUFFER]:30);let n=t.length,i,o=0;for(i=0;i<n;++i)o+=t[i].total;let r=new Array(n);for(i=0;i<n;++i)r[i]=!1;this._totalBudget=o,this._totalUsedThisFrame=0,this._budgets=t,this._executedThisFrame=r}Ay.getTimestamp=Si;Object.defineProperties(Ay.prototype,{totalBudget:{get:function(){return this._totalBudget}}});Ay.prototype.disableThisFrame=function(){this._totalUsedThisFrame=this._totalBudget};Ay.prototype.resetBudgets=function(){let e=this._budgets,t=e.length;for(let n=0;n<t;++n){let i=e[n];i.starvedLastFrame=i.starvedThisFrame,i.starvedThisFrame=!1,i.usedThisFrame=0,i.stolenFromMeThisFrame=0}this._totalUsedThisFrame=0};Ay.prototype.execute=function(e,t){let n=this._budgets,i=n[t],o=this._executedThisFrame[t];if(this._totalUsedThisFrame>=this._totalBudget&&o)return i.starvedThisFrame=!0,!1;let r;if(i.usedThisFrame+i.stolenFromMeThisFrame>=i.total){let c=n.length,d;for(d=0;d<c&&(r=n[d],!(r.usedThisFrame+r.stolenFromMeThisFrame<r.total&&!r.starvedLastFrame));++d);if(d===c&&o)return!1;o&&(i.starvedThisFrame=!0)}let s=Ay.getTimestamp();e.execute();let a=Ay.getTimestamp()-s;return this._totalUsedThisFrame+=a,r?r.stolenFromMeThisFrame+=a:i.usedThisFrame+=a,this._executedThisFrame[t]=!0,!0};var NF=Ay;var Iwi=T(S(),1);function X3(e){e=y(e,y.EMPTY_OBJECT);let t=Wn(e.container);this._container=t;let n=document.createElement("div");n.className="cesium-performanceDisplay";let i=document.createElement("div");i.className="cesium-performanceDisplay-fps",this._fpsText=document.createTextNode(""),i.appendChild(this._fpsText);let o=document.createElement("div");o.className="cesium-performanceDisplay-ms",this._msText=document.createTextNode(""),o.appendChild(this._msText),n.appendChild(o),n.appendChild(i),this._container.appendChild(n),this._lastFpsSampleTime=Si(),this._lastMsSampleTime=Si(),this._fpsFrameCount=0,this._msFrameCount=0,this._throttled=!1;let r=document.createElement("div");r.className="cesium-performanceDisplay-throttled",this._throttledText=document.createTextNode(""),r.appendChild(this._throttledText),n.appendChild(r)}Object.defineProperties(X3.prototype,{throttled:{get:function(){return this._throttled},set:function(e){this._throttled!==e&&(e?this._throttledText.nodeValue="(throttled)":this._throttledText.nodeValue="",this._throttled=e)}}});X3.prototype.update=function(e){let t=Si(),n=y(e,!0);this._fpsFrameCount++;let i=t-this._lastFpsSampleTime;if(i>1e3){let r="N/A";n&&(r=this._fpsFrameCount*1e3/i|0),this._fpsText.nodeValue=`${r} FPS`,this._lastFpsSampleTime=t,this._fpsFrameCount=0}this._msFrameCount++;let o=t-this._lastMsSampleTime;if(o>200){let r="N/A";n&&(r=(o/this._msFrameCount).toFixed(2)),this._msText.nodeValue=`${r} MS`,this._lastMsSampleTime=t,this._msFrameCount=0}};X3.prototype.destroy=function(){return me(this)};var S0=X3;var N9i=T(S(),1);var Bwi=T(S(),1);var Za={};Za.decodeRawMetadataValue=function(e,t,n){switch(e){case At.INT8:return t.getInt8(n);case At.UINT8:return t.getUint8(n);case At.INT16:return t.getInt16(n,!0);case At.UINT16:return t.getUint16(n,!0);case At.INT32:return t.getInt32(n,!0);case At.UINT32:return t.getUint32(n,!0);case At.INT64:return t.getBigInt64(n,!0);case At.UINT64:return t.getBigUint64(n,!0);case At.FLOAT32:return t.getFloat32(n,!0);case At.FLOAT64:return t.getFloat64(n,!0)}throw new ce(`Invalid component type: ${e}`)};Za.decodeRawMetadataValueComponent=function(e,t,n){let i=e.componentType,o=Za.decodeRawMetadataValue(i,t,n);return e.normalized?At.normalize(o,i):o};Za.decodeRawMetadataValueElement=function(e,t,n){let i=e.componentType,o=At.getSizeInBytes(i),r=e.type,s=ut.getComponentCount(r),a=o*s;if(s>1){let u=Array(s);for(let h=0;h<s;h++){let p=n*a+h*o,g=Za.decodeRawMetadataValueComponent(e,t,p);u[h]=g}return u}let c=n*a;return Za.decodeRawMetadataValueComponent(e,t,c)};Za.decodeRawMetadataValues=function(e,t){let n=new DataView(t.buffer,t.byteOffset,t.byteLength);if(e.isArray){let o=e.arrayLength,r=Array(o);for(let s=0;s<o;s++){let a=Za.decodeRawMetadataValueElement(e,n,s);r[s]=a}return r}return Za.decodeRawMetadataValueElement(e,n,0)};Za.convertToObjectType=function(e,t){if(!l(t)||e===ut.SCALAR||e===ut.STRING||e===ut.BOOLEAN||e===ut.ENUM)return t;let n=t.map(i=>Number(i));switch(e){case ut.VEC2:return D.unpack(n,0,new D);case ut.VEC3:return m.unpack(n,0,new m);case ut.VEC4:return re.unpack(n,0,new re);case ut.MAT2:return Xi.unpack(n,0,new Xi);case ut.MAT3:return $.unpack(n,0,new $);case ut.MAT4:return M.unpack(n,0,new M)}throw new ce(`Invalid metadata object type: ${e}`)};Za.convertFromObjectType=function(e,t){if(!l(t)||e===ut.SCALAR||e===ut.STRING||e===ut.BOOLEAN||e===ut.ENUM)return t;switch(e){case ut.VEC2:return D.pack(t,Array(2));case ut.VEC3:return m.pack(t,Array(3));case ut.VEC4:return re.pack(t,Array(4));case ut.MAT2:return Xi.pack(t,Array(4));case ut.MAT3:return $.pack(t,Array(9));case ut.MAT4:return M.pack(t,Array(16))}throw new ce(`Invalid metadata object type: ${e}`)};Za.decodeMetadataValues=function(e,t,n){let i=Za.decodeRawMetadataValues(e,n);if(t.hasValueTransform){let r=Za.convertFromObjectType(e.type,t.offset),s=Za.convertFromObjectType(e.type,t.scale);i=Cf.valueTransformInPlace(i,r,s,At.applyValueTransform)}if(e.isArray){let r=e.arrayLength,s=Array(r);for(let a=0;a<r;a++){let c=i[a],d=Za.convertToObjectType(e.type,c);s[a]=d}return s}return Za.convertToObjectType(e.type,i)};var kF=Object.freeze(Za);var Qwi=T(S(),1);function eS(){this._framebuffer=new bi,this._textureToCopy=void 0,this._copyDepthCommand=void 0}Object.defineProperties(eS.prototype,{framebuffer:{get:function(){return this._framebuffer.framebuffer}}});function eht(e,t,n){let{width:i,height:o}=n;e._framebuffer.update(t,i,o)}function tht(e,t,n){l(e._copyDepthCommand)||(e._copyDepthCommand=t.createViewportQuadCommand(`uniform highp sampler2D colorTexture; in vec2 v_textureCoordinates; void main() { vec4 globeDepthPacked = texture(czm_globeDepthTexture, v_textureCoordinates); float globeDepth = czm_unpackDepth(globeDepthPacked); float depth = texture(colorTexture, v_textureCoordinates).r; out_FragColor = czm_branchFreeTernary(globeDepth <= 0.0 || globeDepth >= 1.0 || depth < globeDepth && depth > 0.0 && depth < 1.0, czm_packDepth(depth), globeDepthPacked); } `,{renderState:Ue.fromCache(),uniformMap:{colorTexture:function(){return e._textureToCopy}},owner:e})),e._textureToCopy=n,e._copyDepthCommand.framebuffer=e.framebuffer}eS.prototype.update=function(e,t){eht(this,e,t),tht(this,e,t)};var nht=new re,iht=new re(1,1/255,1/65025,1/16581375);eS.prototype.getDepth=function(e,t,n){if(!l(this.framebuffer))return;let i=e.readPixels({x:t,y:n,width:1,height:1,framebuffer:this.framebuffer}),o=re.unpack(i,0,nht);return re.divideByScalar(o,255,o),re.dot(o,iht)};eS.prototype.executeCopyDepth=function(e,t){this._copyDepthCommand.execute(e,t)};eS.prototype.isDestroyed=function(){return!1};eS.prototype.destroy=function(){return this._framebuffer.destroy(),l(this._copyDepthCommand)&&(this._copyDepthCommand.shaderProgram=l(this._copyDepthCommand.shaderProgram)&&this._copyDepthCommand.shaderProgram.destroy()),me(this)};var UF=eS;var m9i=T(S(),1);var eFi=T(S(),1);function oht(e,t){this.near=y(e,0),this.far=y(t,0);let n=Ge.NUMBER_OF_PASSES,i=new Array(n),o=new Array(n);for(let r=0;r<n;++r)i[r]=[],o[r]=0;this.commands=i,this.indices=o}var DF=oht;var yFi=T(S(),1);var nFi=T(S(),1),My=`uniform highp sampler2D u_depthTexture; in vec2 v_textureCoordinates; void main() { out_FragColor = czm_packDepth(texture(u_depthTexture, v_textureCoordinates).r); } `;function dp(){this._picking=!1,this._numSamples=1,this._tempCopyDepthTexture=void 0,this._pickColorFramebuffer=new bi({depthStencil:!0,supportsDepthTexture:!0}),this._outputFramebuffer=new bi({depthStencil:!0,supportsDepthTexture:!0}),this._copyDepthFramebuffer=new bi,this._tempCopyDepthFramebuffer=new bi,this._updateDepthFramebuffer=new bi({createColorAttachments:!1,createDepthAttachments:!1,depthStencil:!0}),this._clearGlobeColorCommand=void 0,this._copyColorCommand=void 0,this._copyDepthCommand=void 0,this._tempCopyDepthCommand=void 0,this._updateDepthCommand=void 0,this._viewport=new He,this._rs=void 0,this._rsBlend=void 0,this._rsUpdate=void 0,this._useScissorTest=!1,this._scissorRectangle=void 0,this._useHdr=void 0,this._clearGlobeDepth=void 0}Object.defineProperties(dp.prototype,{colorFramebufferManager:{get:function(){return this._picking?this._pickColorFramebuffer:this._outputFramebuffer}},framebuffer:{get:function(){return this.colorFramebufferManager.framebuffer}},depthStencilTexture:{get:function(){return this.colorFramebufferManager.getDepthStencilTexture()}},picking:{get:function(){return this._picking},set:function(e){this._picking=e}}});function zxe(e,t,n,i,o){let r=e._viewport;r.width=n,r.height=i;let s=!He.equals(r,o.viewport),a=s!==e._useScissorTest;e._useScissorTest=s,He.equals(e._scissorRectangle,o.viewport)||(e._scissorRectangle=He.clone(o.viewport,e._scissorRectangle),a=!0),(!l(e._rs)||!He.equals(r,e._rs.viewport)||a)&&(e._rs=Ue.fromCache({viewport:r,scissorTest:{enabled:e._useScissorTest,rectangle:e._scissorRectangle}}),e._rsBlend=Ue.fromCache({viewport:r,scissorTest:{enabled:e._useScissorTest,rectangle:e._scissorRectangle},blending:hn.ALPHA_BLEND}),e._rsUpdate=Ue.fromCache({viewport:r,scissorTest:{enabled:e._useScissorTest,rectangle:e._scissorRectangle},stencilTest:{enabled:!0,frontFunction:On.EQUAL,frontOperation:{fail:ft.KEEP,zFail:ft.KEEP,zPass:ft.KEEP},backFunction:On.NEVER,reference:Dt.CESIUM_3D_TILE_MASK,mask:Dt.CESIUM_3D_TILE_MASK}})),l(e._copyDepthCommand)||(e._copyDepthCommand=t.createViewportQuadCommand(My,{uniformMap:{u_depthTexture:function(){return e.colorFramebufferManager.getDepthStencilTexture()}},owner:e})),e._copyDepthCommand.framebuffer=e._copyDepthFramebuffer.framebuffer,e._copyDepthCommand.renderState=e._rs,l(e._copyColorCommand)||(e._copyColorCommand=t.createViewportQuadCommand(od,{uniformMap:{colorTexture:function(){return e.colorFramebufferManager.getColorTexture()}},owner:e})),e._copyColorCommand.renderState=e._rs,l(e._tempCopyDepthCommand)||(e._tempCopyDepthCommand=t.createViewportQuadCommand(My,{uniformMap:{u_depthTexture:function(){return e._tempCopyDepthTexture}},owner:e})),e._tempCopyDepthCommand.framebuffer=e._tempCopyDepthFramebuffer.framebuffer,e._tempCopyDepthCommand.renderState=e._rs,l(e._updateDepthCommand)||(e._updateDepthCommand=t.createViewportQuadCommand(od,{uniformMap:{colorTexture:function(){return e._tempCopyDepthFramebuffer.getColorTexture()}},owner:e})),e._updateDepthCommand.framebuffer=e._updateDepthFramebuffer.framebuffer,e._updateDepthCommand.renderState=e._rsUpdate,l(e._clearGlobeColorCommand)||(e._clearGlobeColorCommand=new ai({color:new B(0,0,0,0),stencil:0,owner:e})),e._clearGlobeColorCommand.framebuffer=e.framebuffer}dp.prototype.update=function(e,t,n,i,o,r){let{width:s,height:a}=n,c=o?e.halfFloatingPointTexture?je.HALF_FLOAT:je.FLOAT:je.UNSIGNED_BYTE;this._numSamples=i,this.picking?this._pickColorFramebuffer.update(e,s,a):this._outputFramebuffer.update(e,s,a,i,c),this._copyDepthFramebuffer.update(e,s,a),zxe(this,e,s,a,t),e.uniformState.globeDepthTexture=void 0,this._clearGlobeDepth=r};dp.prototype.prepareColorTextures=function(e,t){!this.picking&&this._numSamples>1&&this._outputFramebuffer.prepareTextures(e,t)};dp.prototype.executeCopyDepth=function(e,t){l(this._copyDepthCommand)&&(this.prepareColorTextures(e),this._copyDepthCommand.execute(e,t),e.uniformState.globeDepthTexture=this._copyDepthFramebuffer.getColorTexture())};dp.prototype.executeUpdateDepth=function(e,t,n){let i=l(n)?n:t.framebuffer.depthStencilTexture;if(!this._clearGlobeDepth&&i===this.colorFramebufferManager.getDepthStencilTexture()){l(this._copyDepthCommand)&&this._copyDepthCommand.execute(e,t);return}if(!l(this._updateDepthCommand))return;let o=this._updateDepthFramebuffer;if(!l(o.framebuffer)||o.getDepthStencilTexture()!==i||o.getColorTexture()!==this._copyDepthFramebuffer.getColorTexture()){let r=this._copyDepthFramebuffer.getColorTexture(),{width:s,height:a}=r;this._tempCopyDepthFramebuffer.destroy(),this._tempCopyDepthFramebuffer.update(e,s,a),o.setColorTexture(r,0),o.setDepthStencilTexture(i),o.update(e,s,a),zxe(this,e,s,a,t)}this._tempCopyDepthTexture=i,this._tempCopyDepthCommand.execute(e,t),this._updateDepthCommand.execute(e,t)};dp.prototype.executeCopyColor=function(e,t){l(this._copyColorCommand)&&this._copyColorCommand.execute(e,t)};dp.prototype.clear=function(e,t,n){let i=this._clearGlobeColorCommand;l(i)&&(B.clone(n,i.color),this.colorFramebufferManager.clear(e,i,t))};dp.prototype.isDestroyed=function(){return!1};dp.prototype.destroy=function(){return this._pickColorFramebuffer.destroy(),this._outputFramebuffer.destroy(),this._copyDepthFramebuffer.destroy(),this._tempCopyDepthFramebuffer.destroy(),this._updateDepthFramebuffer.destroy(),l(this._copyColorCommand)&&(this._copyColorCommand.shaderProgram=this._copyColorCommand.shaderProgram.destroy()),l(this._copyDepthCommand)&&(this._copyDepthCommand.shaderProgram=this._copyDepthCommand.shaderProgram.destroy()),l(this._tempCopyDepthCommand)&&(this._tempCopyDepthCommand.shaderProgram=this._tempCopyDepthCommand.shaderProgram.destroy()),l(this._updateDepthCommand)&&(this._updateDepthCommand.shaderProgram=this._updateDepthCommand.shaderProgram.destroy()),me(this)};var BF=dp;var EFi=T(S(),1);function tS(){this._framebuffer=new bi({depthStencil:!0,supportsDepthTexture:!0}),this._packedDepthFramebuffer=new bi,this._renderState=void 0,this._packedDepthCommand=void 0,this._clearCommand=void 0,this._viewport=new He,this._useScissorTest=!1,this._scissorRectangle=void 0,this._useHdr=void 0}Object.defineProperties(tS.prototype,{classificationTexture:{get:function(){return this._framebuffer.getColorTexture()}},classificationFramebuffer:{get:function(){return this._framebuffer.framebuffer}},packedDepthFramebuffer:{get:function(){return this._packedDepthFramebuffer.framebuffer}},depthStencilTexture:{get:function(){return this._framebuffer.getDepthStencilTexture()}},depthStencilRenderbuffer:{get:function(){return this._framebuffer.getDepthStencilRenderbuffer()}},packedDepthTexture:{get:function(){return this._packedDepthFramebuffer.getColorTexture()}}});function rht(e){e._framebuffer.destroy(),e._packedDepthFramebuffer.destroy()}function sht(e,t,n,i,o){let r=o?t.halfFloatingPointTexture?je.HALF_FLOAT:je.FLOAT:je.UNSIGNED_BYTE;e._framebuffer.update(t,n,i,1,r),e._packedDepthFramebuffer.update(t,n,i)}function aht(e,t,n,i,o){e._viewport.width=n,e._viewport.height=i;let r=!He.equals(e._viewport,o.viewport),s=r!==e._useScissorTest;e._useScissorTest=r,He.equals(e._scissorRectangle,o.viewport)||(e._scissorRectangle=He.clone(o.viewport,e._scissorRectangle),s=!0),(!l(e._renderState)||!He.equals(e._viewport,e._renderState.viewport)||s)&&(e._renderState=Ue.fromCache({viewport:e._viewport,scissorTest:{enabled:e._useScissorTest,rectangle:e._scissorRectangle}})),l(e._packedDepthCommand)||(e._packedDepthCommand=t.createViewportQuadCommand(My,{uniformMap:{u_depthTexture:function(){return e.depthStencilTexture}},owner:e})),l(e._clearCommand)||(e._clearCommand=new ai({color:new B(0,0,0,0),depth:1,stencil:0,owner:e})),e._packedDepthCommand.framebuffer=e._packedDepthFramebuffer.framebuffer,e._packedDepthCommand.renderState=e._renderState,e._clearCommand.framebuffer=e.classificationFramebuffer,e._clearCommand.renderState=e._renderState}tS.prototype.updateAndClear=function(e,t,n,i){let o=t.width,r=t.height;sht(this,n,o,r,e),aht(this,n,o,r,i),this._useHdr=e};tS.prototype.clearClassification=function(e,t){this._clearCommand.execute(e,t)};tS.prototype.packDepth=function(e,t){return this._packedDepthCommand.execute(e,t),this.packedDepthTexture};tS.prototype.isDestroyed=function(){return!1};tS.prototype.destroy=function(){return rht(this),me(this)};var OF=tS;var qFi=T(S(),1);var XFi=T(S(),1),_L=`#ifdef MRT layout (location = 0) out vec4 out_FragData_0; layout (location = 1) out vec4 out_FragData_1; #else layout (location = 0) out vec4 out_FragColor; #endif uniform vec4 u_bgColor; uniform sampler2D u_depthTexture; in vec2 v_textureCoordinates; void main() { if (texture(u_depthTexture, v_textureCoordinates).r < 1.0) { #ifdef MRT out_FragData_0 = u_bgColor; out_FragData_1 = vec4(u_bgColor.a); #else out_FragColor = u_bgColor; #endif return; } discard; } `;var PFi=T(S(),1),YF=`/** * Compositing for Weighted Blended Order-Independent Transparency. See: * - http://jcgt.org/published/0002/02/09/ * - http://casual-effects.blogspot.com/2014/03/weighted-blended-order-independent.html */ uniform sampler2D u_opaque; uniform sampler2D u_accumulation; uniform sampler2D u_revealage; in vec2 v_textureCoordinates; void main() { vec4 opaque = texture(u_opaque, v_textureCoordinates); vec4 accum = texture(u_accumulation, v_textureCoordinates); float r = texture(u_revealage, v_textureCoordinates).r; #ifdef MRT vec4 transparent = vec4(accum.rgb / clamp(r, 1e-4, 5e4), accum.a); #else vec4 transparent = vec4(accum.rgb / clamp(accum.a, 1e-4, 5e4), r); #endif out_FragColor = (1.0 - transparent.a) * transparent + transparent.a * opaque; if (opaque != czm_backgroundColor) { out_FragColor.a = 1.0; } } `;function C0(e){this._numSamples=1,this._translucentMultipassSupport=!1,this._translucentMRTSupport=!1;let t=e.colorBufferFloat&&e.depthTexture&&e.floatBlend;this._translucentMRTSupport=e.drawBuffers&&t,this._translucentMultipassSupport=!this._translucentMRTSupport&&t,this._opaqueFBO=void 0,this._opaqueTexture=void 0,this._depthStencilTexture=void 0,this._accumulationTexture=void 0,this._translucentFBO=new bi({colorAttachmentsLength:this._translucentMRTSupport?2:1,createColorAttachments:!1,createDepthAttachments:!1,depth:!0}),this._alphaFBO=new bi({createColorAttachments:!1,createDepthAttachments:!1,depth:!0}),this._adjustTranslucentFBO=new bi({colorAttachmentsLength:this._translucentMRTSupport?2:1,createColorAttachments:!1}),this._adjustAlphaFBO=new bi({createColorAttachments:!1}),this._opaqueClearCommand=new ai({color:new B(0,0,0,0),owner:this}),this._translucentMRTClearCommand=new ai({color:new B(0,0,0,1),owner:this}),this._translucentMultipassClearCommand=new ai({color:new B(0,0,0,0),owner:this}),this._alphaClearCommand=new ai({color:new B(1,1,1,1),owner:this}),this._translucentRenderStateCache={},this._alphaRenderStateCache={},this._compositeCommand=void 0,this._adjustTranslucentCommand=void 0,this._adjustAlphaCommand=void 0,this._viewport=new He,this._rs=void 0,this._useScissorTest=!1,this._scissorRectangle=void 0,this._useHDR=!1}function Kxe(e){e._accumulationTexture=e._accumulationTexture&&!e._accumulationTexture.isDestroyed()&&e._accumulationTexture.destroy(),e._revealageTexture=e._revealageTexture&&!e._revealageTexture.isDestroyed()&&e._revealageTexture.destroy()}function e8(e){e._translucentFBO.destroy(),e._alphaFBO.destroy(),e._adjustTranslucentFBO.destroy(),e._adjustAlphaFBO.destroy()}function Jxe(e){Kxe(e),e8(e)}function cht(e,t,n,i){Kxe(e),e._accumulationTexture=new Wt({context:t,width:n,height:i,pixelFormat:ot.RGBA,pixelDatatype:je.FLOAT}),e._revealageTexture=new Wt({context:t,pixelFormat:ot.RGBA,pixelDatatype:je.FLOAT,width:n,height:i,flipY:!1})}function lht(e,t){e8(e);let n=ie.FRAMEBUFFER_COMPLETE,i=!0,{width:o,height:r}=e._accumulationTexture;if(e._translucentMRTSupport&&(e._translucentFBO.setColorTexture(e._accumulationTexture,0),e._translucentFBO.setColorTexture(e._revealageTexture,1),e._translucentFBO.setDepthStencilTexture(e._depthStencilTexture),e._translucentFBO.update(t,o,r),e._adjustTranslucentFBO.setColorTexture(e._accumulationTexture,0),e._adjustTranslucentFBO.setColorTexture(e._revealageTexture,1),e._adjustTranslucentFBO.update(t,o,r),(e._translucentFBO.status!==n||e._adjustTranslucentFBO.status!==n)&&(e8(e),e._translucentMRTSupport=!1)),!e._translucentMRTSupport){e._translucentFBO.setColorTexture(e._accumulationTexture),e._translucentFBO.setDepthStencilTexture(e._depthStencilTexture),e._translucentFBO.update(t,o,r),e._alphaFBO.setColorTexture(e._revealageTexture),e._alphaFBO.setDepthStencilTexture(e._depthStencilTexture),e._alphaFBO.update(t,o,r),e._adjustTranslucentFBO.setColorTexture(e._accumulationTexture),e._adjustTranslucentFBO.update(t,o,r),e._adjustAlphaFBO.setColorTexture(e._revealageTexture),e._adjustAlphaFBO.update(t,o,r);let s=e._translucentFBO.status===n,a=e._alphaFBO.status===n,c=e._adjustTranslucentFBO.status===n,d=e._adjustAlphaFBO.status===n;(!s||!a||!c||!d)&&(Jxe(e),e._translucentMultipassSupport=!1,i=!1)}return i}C0.prototype.update=function(e,t,n,i,o){if(!this.isSupported())return;this._opaqueFBO=n,this._opaqueTexture=n.getColorTexture(0),this._depthStencilTexture=n.getDepthStencilTexture();let{width:r,height:s}=this._opaqueTexture,a=this._accumulationTexture,c=!l(a)||a.width!==r||a.height!==s||i!==this._useHDR,d=this._numSamples!==o;if((c||d)&&(this._numSamples=o,cht(this,e,r,s)),(!l(this._translucentFBO.framebuffer)||c||d)&&!lht(this,e))return;this._useHDR=i;let u=this,h,p;l(this._compositeCommand)||(h=new De({sources:[YF]}),this._translucentMRTSupport&&h.defines.push("MRT"),p={u_opaque:function(){return u._opaqueTexture},u_accumulation:function(){return u._accumulationTexture},u_revealage:function(){return u._revealageTexture}},this._compositeCommand=e.createViewportQuadCommand(h,{uniformMap:p,owner:this})),l(this._adjustTranslucentCommand)||(this._translucentMRTSupport?(h=new De({defines:["MRT"],sources:[_L]}),p={u_bgColor:function(){return u._translucentMRTClearCommand.color},u_depthTexture:function(){return u._depthStencilTexture}},this._adjustTranslucentCommand=e.createViewportQuadCommand(h,{uniformMap:p,owner:this})):this._translucentMultipassSupport&&(h=new De({sources:[_L]}),p={u_bgColor:function(){return u._translucentMultipassClearCommand.color},u_depthTexture:function(){return u._depthStencilTexture}},this._adjustTranslucentCommand=e.createViewportQuadCommand(h,{uniformMap:p,owner:this}),p={u_bgColor:function(){return u._alphaClearCommand.color},u_depthTexture:function(){return u._depthStencilTexture}},this._adjustAlphaCommand=e.createViewportQuadCommand(h,{uniformMap:p,owner:this}))),this._viewport.width=r,this._viewport.height=s;let g=!He.equals(this._viewport,t.viewport),f=g!==this._useScissorTest;this._useScissorTest=g,He.equals(this._scissorRectangle,t.viewport)||(this._scissorRectangle=He.clone(t.viewport,this._scissorRectangle),f=!0),(!l(this._rs)||!He.equals(this._viewport,this._rs.viewport)||f)&&(this._rs=Ue.fromCache({viewport:this._viewport,scissorTest:{enabled:this._useScissorTest,rectangle:this._scissorRectangle}})),l(this._compositeCommand)&&(this._compositeCommand.renderState=this._rs),this._adjustTranslucentCommand&&(this._adjustTranslucentCommand.renderState=this._rs),l(this._adjustAlphaCommand)&&(this._adjustAlphaCommand.renderState=this._rs)};var dht={enabled:!0,color:new B(0,0,0,0),equationRgb:wa.ADD,equationAlpha:wa.ADD,functionSourceRgb:Vo.ONE,functionDestinationRgb:Vo.ONE,functionSourceAlpha:Vo.ZERO,functionDestinationAlpha:Vo.ONE_MINUS_SOURCE_ALPHA},uht={enabled:!0,color:new B(0,0,0,0),equationRgb:wa.ADD,equationAlpha:wa.ADD,functionSourceRgb:Vo.ONE,functionDestinationRgb:Vo.ONE,functionSourceAlpha:Vo.ONE,functionDestinationAlpha:Vo.ONE},mht={enabled:!0,color:new B(0,0,0,0),equationRgb:wa.ADD,equationAlpha:wa.ADD,functionSourceRgb:Vo.ZERO,functionDestinationRgb:Vo.ONE_MINUS_SOURCE_ALPHA,functionSourceAlpha:Vo.ZERO,functionDestinationAlpha:Vo.ONE_MINUS_SOURCE_ALPHA};function t8(e,t,n,i){let o=n[i.id];if(!l(o)){let r=Ue.getState(i);r.depthMask=!1,r.blending=t,o=Ue.fromCache(r),n[i.id]=o}return o}function hht(e,t,n){return t8(t,dht,e._translucentRenderStateCache,n)}function fht(e,t,n){return t8(t,uht,e._translucentRenderStateCache,n)}function pht(e,t,n){return t8(t,mht,e._alphaRenderStateCache,n)}var bht=` vec3 Ci = czm_out_FragColor.rgb * czm_out_FragColor.a; float ai = czm_out_FragColor.a; float wzi = czm_alphaWeight(ai); out_FragData_0 = vec4(Ci * wzi, ai); out_FragData_1 = vec4(ai * wzi); `,ght=` vec3 Ci = czm_out_FragColor.rgb * czm_out_FragColor.a; float ai = czm_out_FragColor.a; float wzi = czm_alphaWeight(ai); out_FragColor = vec4(Ci, ai) * wzi; `,yht=` float ai = czm_out_FragColor.a; out_FragColor = vec4(ai); `;function n8(e,t,n,i){let{shaderCache:o}=e,r=o.getDerivedShaderProgram(t,n);if(l(r))return r;let s=t._attributeLocations,a=t.fragmentShaderSource.clone();a.sources=a.sources.map(function(u){return De.replaceMain(u,"czm_translucent_main").replace(/out_FragColor/g,"czm_out_FragColor").replace(/layout\s*\(location\s*=\s*0\)\s*out\s+vec4\s+out_FragColor;/g,"").replace(/\bdiscard\b/g,"czm_discard = true").replace(/czm_phong/g,"czm_translucentPhong")}),a.sources.splice(0,0,`vec4 czm_out_FragColor; bool czm_discard = false; `);let c=[...i.matchAll(/out_FragData_(\d+)/g)],d="";for(let u=0;u<c.length;u++){let h=c[u];d=`layout (location = ${h[1]}) out vec4 ${h[0]}; ${d}`}return a.sources.push(d),a.sources.push(`void main() { czm_translucent_main(); if (czm_discard) { discard; } ${i}} `),o.createDerivedShaderProgram(t,n,{vertexShaderSource:t.vertexShaderSource,fragmentShaderSource:a,attributeLocations:s})}function xht(e,t){return n8(e,t,"translucentMRT",bht)}function _ht(e,t){return n8(e,t,"translucentMultipass",ght)}function Tht(e,t){return n8(e,t,"alphaMultipass",yht)}C0.prototype.createDerivedCommands=function(e,t,n){if(l(n)||(n={}),this._translucentMRTSupport){let a,c;return l(n.translucentCommand)&&(a=n.translucentCommand.shaderProgram,c=n.translucentCommand.renderState),n.translucentCommand=$e.shallowClone(e,n.translucentCommand),!l(a)||n.shaderProgramId!==e.shaderProgram.id?(n.translucentCommand.shaderProgram=xht(t,e.shaderProgram),n.translucentCommand.renderState=hht(this,t,e.renderState),n.shaderProgramId=e.shaderProgram.id):(n.translucentCommand.shaderProgram=a,n.translucentCommand.renderState=c),n}let i,o,r,s;return l(n.translucentCommand)&&(i=n.translucentCommand.shaderProgram,o=n.translucentCommand.renderState,r=n.alphaCommand.shaderProgram,s=n.alphaCommand.renderState),n.translucentCommand=$e.shallowClone(e,n.translucentCommand),n.alphaCommand=$e.shallowClone(e,n.alphaCommand),!l(i)||n.shaderProgramId!==e.shaderProgram.id?(n.translucentCommand.shaderProgram=_ht(t,e.shaderProgram),n.translucentCommand.renderState=fht(this,t,e.renderState),n.alphaCommand.shaderProgram=Tht(t,e.shaderProgram),n.alphaCommand.renderState=pht(this,t,e.renderState),n.shaderProgramId=e.shaderProgram.id):(n.translucentCommand.shaderProgram=i,n.translucentCommand.renderState=o,n.alphaCommand.shaderProgram=r,n.alphaCommand.renderState=s),n};function Sht(e,t,n,i,o,r){let{context:s,frameState:a}=t,{useLogDepth:c,shadowState:d}=a,u=t._hdr,h=i.framebuffer,p=d.lightShadowsEnabled;i.framebuffer=e._adjustTranslucentFBO.framebuffer,e._adjustTranslucentCommand.execute(s,i),i.framebuffer=e._adjustAlphaFBO.framebuffer,e._adjustAlphaCommand.execute(s,i);let g=e._opaqueFBO.framebuffer;i.framebuffer=e._translucentFBO.framebuffer;for(let f=0;f<o.length;++f){let x=o[f];x=c?x.derivedCommands.logDepth.command:x,x=u?x.derivedCommands.hdr.command:x;let _=p&&x.receiveShadows?x.derivedCommands.oit.shadows.translucentCommand:x.derivedCommands.oit.translucentCommand;n(_,t,i,g)}if(l(r)){let f=r.unclassifiedCommand,x=p&&f.receiveShadows?f.derivedCommands.oit.shadows.translucentCommand:f.derivedCommands.oit.translucentCommand;n(x,t,i,g)}i.framebuffer=e._alphaFBO.framebuffer;for(let f=0;f<o.length;++f){let x=o[f];x=c?x.derivedCommands.logDepth.command:x,x=u?x.derivedCommands.hdr.command:x;let _=p&&x.receiveShadows?x.derivedCommands.oit.shadows.alphaCommand:x.derivedCommands.oit.alphaCommand;n(_,t,i,g)}if(l(r)){let f=r.unclassifiedCommand,x=p&&f.receiveShadows?f.derivedCommands.oit.shadows.alphaCommand:f.derivedCommands.oit.alphaCommand;n(x,t,i,g)}i.framebuffer=h}function Cht(e,t,n,i,o,r){let{context:s,frameState:a}=t,{useLogDepth:c,shadowState:d}=a,u=t._hdr,h=i.framebuffer,p=d.lightShadowsEnabled;i.framebuffer=e._adjustTranslucentFBO.framebuffer,e._adjustTranslucentCommand.execute(s,i);let g=e._opaqueFBO.framebuffer;i.framebuffer=e._translucentFBO.framebuffer;for(let f=0;f<o.length;++f){let x=o[f];x=c?x.derivedCommands.logDepth.command:x,x=u?x.derivedCommands.hdr.command:x;let _=p&&x.receiveShadows?x.derivedCommands.oit.shadows.translucentCommand:x.derivedCommands.oit.translucentCommand;n(_,t,i,g)}if(l(r)){let f=r.unclassifiedCommand,x=p&&f.receiveShadows?f.derivedCommands.oit.shadows.translucentCommand:f.derivedCommands.oit.translucentCommand;n(x,t,i,g)}i.framebuffer=h}C0.prototype.executeCommands=function(e,t,n,i,o){if(this._translucentMRTSupport){Cht(this,e,t,n,i,o);return}Sht(this,e,t,n,i,o)};C0.prototype.execute=function(e,t){this._compositeCommand.execute(e,t)};C0.prototype.clear=function(e,t,n){let i=t.framebuffer;t.framebuffer=this._opaqueFBO.framebuffer,B.clone(n,this._opaqueClearCommand.color),this._opaqueClearCommand.execute(e,t),t.framebuffer=this._translucentFBO.framebuffer,(this._translucentMRTSupport?this._translucentMRTClearCommand:this._translucentMultipassClearCommand).execute(e,t),this._translucentMultipassSupport&&(t.framebuffer=this._alphaFBO.framebuffer,this._alphaClearCommand.execute(e,t)),t.framebuffer=i};C0.prototype.isSupported=function(){return this._translucentMRTSupport||this._translucentMultipassSupport};C0.prototype.isDestroyed=function(){return!1};C0.prototype.destroy=function(){return Jxe(this),l(this._compositeCommand)&&(this._compositeCommand.shaderProgram=this._compositeCommand.shaderProgram&&this._compositeCommand.shaderProgram.destroy()),l(this._adjustTranslucentCommand)&&(this._adjustTranslucentCommand.shaderProgram=this._adjustTranslucentCommand.shaderProgram&&this._adjustTranslucentCommand.shaderProgram.destroy()),l(this._adjustAlphaCommand)&&(this._adjustAlphaCommand.shaderProgram=this._adjustAlphaCommand.shaderProgram&&this._adjustAlphaCommand.shaderProgram.destroy()),me(this)};var HF=C0;var oAi=T(S(),1);function zF(){this._framebuffer=new bi({color:!1,depthStencil:!0,supportsDepthTexture:!0}),this._passState=void 0}Object.defineProperties(zF.prototype,{framebuffer:{get:function(){return this._framebuffer.framebuffer}}});function Vht(e){e._framebuffer.destroy()}function Lht(e,t){let n=t.drawingBufferWidth,i=t.drawingBufferHeight;e._framebuffer.update(t,n,i);let o=new Vc(t);o.blendingEnabled=!1,o.scissorTest={enabled:!0,rectangle:new He},o.viewport=new He,e._passState=o}zF.prototype.update=function(e,t,n){let i=n.width,o=n.height;this._framebuffer.isDirty(i,o)&&Lht(this,e);let r=this.framebuffer,s=this._passState;return s.framebuffer=r,s.viewport.width=i,s.viewport.height=o,s.scissorTest.rectangle.x=t.x,s.scissorTest.rectangle.y=o-t.y,s.scissorTest.rectangle.width=1,s.scissorTest.rectangle.height=1,s};zF.prototype.isDestroyed=function(){return!1};zF.prototype.destroy=function(){return Vht(this),me(this)};var KF=zF;var hAi=T(S(),1);function TL(e){let t=new Vc(e);t.blendingEnabled=!1,t.scissorTest={enabled:!0,rectangle:new He},t.viewport=new He,this._context=e,this._fb=new bi({depthStencil:!0}),this._passState=t,this._width=0,this._height=0}TL.prototype.begin=function(e,t){let n=this._context,{width:i,height:o}=t;return He.clone(e,this._passState.scissorTest.rectangle),this._width=i,this._height=o,this._fb.update(n,i,o),this._passState.framebuffer=this._fb.framebuffer,this._passState.viewport.width=i,this._passState.viewport.height=o,this._passState};var JF=new B;TL.prototype.end=function(e){let t=y(e.width,1),n=y(e.height,1),i=this._context,o=i.readPixels({x:e.x,y:e.y,width:t,height:n,framebuffer:this._fb.framebuffer}),r=Math.max(t,n),s=r*r,a=Math.floor(t*.5),c=Math.floor(n*.5),d=0,u=0,h=0,p=-1;for(let g=0;g<s;++g){if(-a<=d&&d<=a&&-c<=u&&u<=c){let f=4*((c-u)*t+d+a);JF.red=B.byteToFloat(o[f]),JF.green=B.byteToFloat(o[f+1]),JF.blue=B.byteToFloat(o[f+2]),JF.alpha=B.byteToFloat(o[f+3]);let x=i.getObjectByPickColor(JF);if(l(x))return x}if(d===u||d<0&&-d===u||d>0&&d===1-u){let f=h;h=-p,p=f}d+=h,u+=p}};TL.prototype.readCenterPixel=function(e){let t=y(e.width,1),n=y(e.height,1),o=this._context.readPixels({x:e.x,y:e.y,width:t,height:n,framebuffer:this._fb.framebuffer}),r=Math.floor(t*.5),a=4*(Math.floor(n*.5)*t+r);return o.slice(a,a+4)};TL.prototype.isDestroyed=function(){return!1};TL.prototype.destroy=function(){return this._fb.destroy(),me(this)};var QF=TL;var _Ai=T(S(),1);function V0(){this._numSamples=1,this._colorFramebuffer=new bi({depthStencil:!0,supportsDepthTexture:!0}),this._idFramebuffer=new bi({depthStencil:!0,supportsDepthTexture:!0}),this._idClearColor=new B(0,0,0,0),this._clearCommand=new ai({color:new B(0,0,0,0),depth:1,owner:this})}function Rht(e){e._colorFramebuffer.destroy(),e._idFramebuffer.destroy()}Object.defineProperties(V0.prototype,{framebuffer:{get:function(){return this._colorFramebuffer.framebuffer}},idFramebuffer:{get:function(){return this._idFramebuffer.framebuffer}},depthStencilTexture:{get:function(){return this._colorFramebuffer.getDepthStencilTexture()}}});V0.prototype.update=function(e,t,n,i){let o=t.width,r=t.height,s=n?e.halfFloatingPointTexture?je.HALF_FLOAT:je.FLOAT:je.UNSIGNED_BYTE;this._numSamples=i,this._colorFramebuffer.update(e,o,r,i,s),this._idFramebuffer.update(e,o,r)};V0.prototype.clear=function(e,t,n){B.clone(n,this._clearCommand.color),B.clone(this._idClearColor,this._clearCommand.color),this._colorFramebuffer.clear(e,this._clearCommand,t),this._idFramebuffer.clear(e,this._clearCommand,t)};V0.prototype.getFramebuffer=function(){return this._colorFramebuffer.framebuffer};V0.prototype.getIdFramebuffer=function(){return this._idFramebuffer.framebuffer};V0.prototype.prepareColorTextures=function(e){this._numSamples>1&&this._colorFramebuffer.prepareTextures(e)};V0.prototype.isDestroyed=function(){return!1};V0.prototype.destroy=function(){return Rht(this),me(this)};var nS=V0;var gMi=T(S(),1);var VAi=T(S(),1);function iS(){}iS.getShadowCastShaderKeyword=function(e,t,n,i){return`castShadow ${e} ${t} ${n} ${i}`};iS.createShadowCastVertexShader=function(e,t,n){let i=e.defines.slice(0),o=e.sources.slice(0);i.push("SHADOW_MAP"),n&&i.push("GENERATE_POSITION");let r=De.findPositionVarying(e),s=l(r);if(t&&!s){let a=o.length;for(let d=0;d<a;++d)o[d]=De.replaceMain(o[d],"czm_shadow_cast_main");o.push(`out vec3 v_positionEC; void main() { czm_shadow_cast_main(); v_positionEC = (czm_inverseProjection * gl_Position).xyz; }`)}return new De({defines:i,sources:o})};iS.createShadowCastFragmentShader=function(e,t,n,i){let o=e.defines.slice(0),r=e.sources.slice(0);o.push("SHADOW_MAP");let s=De.findPositionVarying(e),a=l(s);a||(s="v_positionEC");let c=r.length;for(let u=0;u<c;++u)r[u]=De.replaceMain(r[u],"czm_shadow_cast_main");let d="";return t&&(a||(d+=`in vec3 v_positionEC; `),d+=`uniform vec4 shadowMap_lightPositionEC; `),i?d+=`void main() { `:d+=`void main() { czm_shadow_cast_main(); if (out_FragColor.a == 0.0) { discard; } `,t?d+=` float distance = length(${s}); if (distance >= shadowMap_lightPositionEC.w) { discard; } distance /= shadowMap_lightPositionEC.w; // radius out_FragColor = czm_packDepth(distance); `:n?d+=` out_FragColor = vec4(1.0); `:d+=` out_FragColor = czm_packDepth(gl_FragCoord.z); `,d+=`} `,r.push(d),new De({defines:o,sources:r})};iS.getShadowReceiveShaderKeyword=function(e,t,n,i){let o=e._usesDepthTexture,r=e._polygonOffsetSupported,s=e._isPointLight,a=e._isSpotLight,c=e._numberOfCascades>1,d=e.debugCascadeColors,u=e.softShadows;return`receiveShadow ${o}${r}${s}${a}${c}${d}${u}${t}${n}${i}`};iS.createShadowReceiveVertexShader=function(e,t,n){let i=e.defines.slice(0),o=e.sources.slice(0);return i.push("SHADOW_MAP"),t&&(n?i.push("GENERATE_POSITION_AND_NORMAL"):i.push("GENERATE_POSITION")),new De({defines:i,sources:o})};iS.createShadowReceiveFragmentShader=function(e,t,n,i,o){let r=De.findNormalVarying(e),s=!i&&l(r)||i&&o,a=De.findPositionVarying(e),c=l(a),d=t._usesDepthTexture,u=t._polygonOffsetSupported,h=t._isPointLight,p=t._isSpotLight,g=t._numberOfCascades>1,f=t.debugCascadeColors,x=t.softShadows,_=h?t._pointBias:i?t._terrainBias:t._primitiveBias,C=e.defines.slice(0),V=e.sources.slice(0),L=V.length;for(let I=0;I<L;++I)V[I]=De.replaceMain(V[I],"czm_shadow_receive_main");h?C.push("USE_CUBE_MAP_SHADOW"):d&&C.push("USE_SHADOW_DEPTH_TEXTURE"),x&&!h&&C.push("USE_SOFT_SHADOWS"),g&&n&&i&&(s?C.push("ENABLE_VERTEX_LIGHTING"):C.push("ENABLE_DAYNIGHT_SHADING")),n&&_.normalShading&&s&&(C.push("USE_NORMAL_SHADING"),_.normalShadingSmooth>0&&C.push("USE_NORMAL_SHADING_SMOOTH"));let R="";h?R+=`uniform samplerCube shadowMap_textureCube; `:R+=`uniform sampler2D shadowMap_texture; `;let G;return c?G=` return vec4(${a}, 1.0); `:G=`#ifndef LOG_DEPTH return czm_windowToEyeCoordinates(gl_FragCoord); #else return vec4(v_logPositionEC, 1.0); #endif `,R+=`uniform mat4 shadowMap_matrix; uniform vec3 shadowMap_lightDirectionEC; uniform vec4 shadowMap_lightPositionEC; uniform vec4 shadowMap_normalOffsetScaleDistanceMaxDistanceAndDarkness; uniform vec4 shadowMap_texelSizeDepthBiasAndNormalShadingSmooth; #ifdef LOG_DEPTH in vec3 v_logPositionEC; #endif vec4 getPositionEC() { ${G}} vec3 getNormalEC() { ${s?` return normalize(${r}); `:` return vec3(1.0); `}} void applyNormalOffset(inout vec4 positionEC, vec3 normalEC, float nDotL) { ${_.normalOffset&&s?` float normalOffset = shadowMap_normalOffsetScaleDistanceMaxDistanceAndDarkness.x; float normalOffsetScale = 1.0 - nDotL; vec3 offset = normalOffset * normalOffsetScale * normalEC; positionEC.xyz += offset; `:""}} `,R+=`void main() { czm_shadow_receive_main(); vec4 positionEC = getPositionEC(); vec3 normalEC = getNormalEC(); float depth = -positionEC.z; `,R+=` czm_shadowParameters shadowParameters; shadowParameters.texelStepSize = shadowMap_texelSizeDepthBiasAndNormalShadingSmooth.xy; shadowParameters.depthBias = shadowMap_texelSizeDepthBiasAndNormalShadingSmooth.z; shadowParameters.normalShadingSmooth = shadowMap_texelSizeDepthBiasAndNormalShadingSmooth.w; shadowParameters.darkness = shadowMap_normalOffsetScaleDistanceMaxDistanceAndDarkness.w; `,i?R+=` shadowParameters.depthBias *= max(depth * 0.01, 1.0); `:u||(R+=` shadowParameters.depthBias *= mix(1.0, 100.0, depth * 0.0015); `),h?R+=` vec3 directionEC = positionEC.xyz - shadowMap_lightPositionEC.xyz; float distance = length(directionEC); directionEC = normalize(directionEC); float radius = shadowMap_lightPositionEC.w; // Stop early if the fragment is beyond the point light radius if (distance > radius) { return; } vec3 directionWC = czm_inverseViewRotation * directionEC; shadowParameters.depth = distance / radius; shadowParameters.nDotL = clamp(dot(normalEC, -directionEC), 0.0, 1.0); shadowParameters.texCoords = directionWC; float visibility = czm_shadowVisibility(shadowMap_textureCube, shadowParameters); `:p?R+=` vec3 directionEC = normalize(positionEC.xyz - shadowMap_lightPositionEC.xyz); float nDotL = clamp(dot(normalEC, -directionEC), 0.0, 1.0); applyNormalOffset(positionEC, normalEC, nDotL); vec4 shadowPosition = shadowMap_matrix * positionEC; // Spot light uses a perspective projection, so perform the perspective divide shadowPosition /= shadowPosition.w; // Stop early if the fragment is not in the shadow bounds if (any(lessThan(shadowPosition.xyz, vec3(0.0))) || any(greaterThan(shadowPosition.xyz, vec3(1.0)))) { return; } shadowParameters.texCoords = shadowPosition.xy; shadowParameters.depth = shadowPosition.z; shadowParameters.nDotL = nDotL; float visibility = czm_shadowVisibility(shadowMap_texture, shadowParameters); `:g?R+=` float maxDepth = shadowMap_cascadeSplits[1].w; // Stop early if the eye depth exceeds the last cascade if (depth > maxDepth) { return; } // Get the cascade based on the eye-space depth vec4 weights = czm_cascadeWeights(depth); // Apply normal offset float nDotL = clamp(dot(normalEC, shadowMap_lightDirectionEC), 0.0, 1.0); applyNormalOffset(positionEC, normalEC, nDotL); // Transform position into the cascade vec4 shadowPosition = czm_cascadeMatrix(weights) * positionEC; // Get visibility shadowParameters.texCoords = shadowPosition.xy; shadowParameters.depth = shadowPosition.z; shadowParameters.nDotL = nDotL; float visibility = czm_shadowVisibility(shadowMap_texture, shadowParameters); // Fade out shadows that are far away float shadowMapMaximumDistance = shadowMap_normalOffsetScaleDistanceMaxDistanceAndDarkness.z; float fade = max((depth - shadowMapMaximumDistance * 0.8) / (shadowMapMaximumDistance * 0.2), 0.0); visibility = mix(visibility, 1.0, fade); ${f?` // Draw cascade colors for debugging out_FragColor *= czm_cascadeColor(weights); `:""}`:R+=` float nDotL = clamp(dot(normalEC, shadowMap_lightDirectionEC), 0.0, 1.0); applyNormalOffset(positionEC, normalEC, nDotL); vec4 shadowPosition = shadowMap_matrix * positionEC; // Stop early if the fragment is not in the shadow bounds if (any(lessThan(shadowPosition.xyz, vec3(0.0))) || any(greaterThan(shadowPosition.xyz, vec3(1.0)))) { return; } shadowParameters.texCoords = shadowPosition.xy; shadowParameters.depth = shadowPosition.z; shadowParameters.nDotL = nDotL; float visibility = czm_shadowVisibility(shadowMap_texture, shadowParameters); `,R+=` out_FragColor.rgb *= visibility; } `,V.push(R),new De({defines:C,sources:V})};var up=iS;function mp(e){e=y(e,y.EMPTY_OBJECT);let t=e.context;this._enabled=y(e.enabled,!0),this._softShadows=y(e.softShadows,!1),this._normalOffset=y(e.normalOffset,!0),this.dirty=!0,this.fromLightSource=y(e.fromLightSource,!0),this.darkness=y(e.darkness,.3),this._darkness=this.darkness,this.fadingEnabled=y(e.fadingEnabled,!0),this.maximumDistance=y(e.maximumDistance,5e3),this._outOfView=!1,this._outOfViewPrevious=!1,this._needsUpdate=!0;let n=!0;(Ot.isInternetExplorer()||Ot.isEdge()||(Ot.isChrome()||Ot.isFirefox())&&Ot.isWindows()&&!t.depthTexture)&&(n=!1),this._polygonOffsetSupported=n;let i=y(e.depthBiasStep,1);this._terrainBias={polygonOffset:n,polygonOffsetFactor:1.1,polygonOffsetUnits:4,normalOffset:this._normalOffset,normalOffsetScale:.5,normalShading:!0,normalShadingSmooth:.3,depthBias:1e-4*i},this._primitiveBias={polygonOffset:n,polygonOffsetFactor:1.1,polygonOffsetUnits:4,normalOffset:this._normalOffset,normalOffsetScale:.1,normalShading:!0,normalShadingSmooth:.05,depthBias:2e-5*i},this._pointBias={polygonOffset:!1,polygonOffsetFactor:1.1,polygonOffsetUnits:4,normalOffset:this._normalOffset,normalOffsetScale:0,normalShading:!0,normalShadingSmooth:.1,depthBias:5e-4*i},this._depthAttachment=void 0,this._colorAttachment=void 0,this._shadowMapMatrix=new M,this._shadowMapTexture=void 0,this._lightDirectionEC=new m,this._lightPositionEC=new re,this._distance=0,this._lightCamera=e.lightCamera,this._shadowMapCamera=new W3,this._shadowMapCullingVolume=void 0,this._sceneCamera=void 0,this._boundingSphere=new de,this._isPointLight=y(e.isPointLight,!1),this._pointLightRadius=y(e.pointLightRadius,100),this._cascadesEnabled=this._isPointLight?!1:y(e.cascadesEnabled,!0),this._numberOfCascades=this._cascadesEnabled?y(e.numberOfCascades,4):0,this._fitNearFar=!0,this._maximumCascadeDistances=[25,150,700,Number.MAX_VALUE],this._textureSize=new D,this._isSpotLight=!1,this._cascadesEnabled?this._shadowMapCamera.frustum=new Mr:l(this._lightCamera.frustum.fov)&&(this._isSpotLight=!0),this._cascadeSplits=[new re,new re],this._cascadeMatrices=[new M,new M,new M,new M],this._cascadeDistances=new re;let o;this._isPointLight?o=6:this._cascadesEnabled?o=this._numberOfCascades:o=1,this._passes=new Array(o);for(let r=0;r<o;++r)this._passes[r]=new Zht(t);this.debugShow=!1,this.debugFreezeFrame=!1,this._debugFreezeFrame=!1,this._debugCascadeColors=!1,this._debugLightFrustum=void 0,this._debugCameraFrustum=void 0,this._debugCascadeFrustums=new Array(this._numberOfCascades),this._debugShadowViewCommand=void 0,this._usesDepthTexture=t.depthTexture,this._isPointLight&&(this._usesDepthTexture=!1),this._primitiveRenderState=void 0,this._terrainRenderState=void 0,this._pointRenderState=void 0,o8(this),this._clearCommand=new ai({depth:1,color:new B}),this._clearPassState=new Vc(t),this._size=y(e.size,2048),this.size=this._size}mp.MAXIMUM_DISTANCE=2e4;function Zht(e){this.camera=new W3,this.passState=new Vc(e),this.framebuffer=void 0,this.textureOffsets=void 0,this.commandList=[],this.cullingVolume=void 0}function i8(e,t){return Ue.fromCache({cull:{enabled:!0,face:_i.BACK},depthTest:{enabled:!0},colorMask:{red:e,green:e,blue:e,alpha:e},depthMask:!0,polygonOffset:{enabled:t.polygonOffset,factor:t.polygonOffsetFactor,units:t.polygonOffsetUnits}})}function o8(e){let t=!e._usesDepthTexture;e._primitiveRenderState=i8(t,e._primitiveBias),e._terrainRenderState=i8(t,e._terrainBias),e._pointRenderState=i8(t,e._pointBias)}mp.prototype.debugCreateRenderStates=function(){o8(this)};Object.defineProperties(mp.prototype,{enabled:{get:function(){return this._enabled},set:function(e){this.dirty=this._enabled!==e,this._enabled=e}},normalOffset:{get:function(){return this._normalOffset},set:function(e){this.dirty=this._normalOffset!==e,this._normalOffset=e,this._terrainBias.normalOffset=e,this._primitiveBias.normalOffset=e,this._pointBias.normalOffset=e}},softShadows:{get:function(){return this._softShadows},set:function(e){this.dirty=this._softShadows!==e,this._softShadows=e}},size:{get:function(){return this._size},set:function(e){Pht(this,e)}},outOfView:{get:function(){return this._outOfView}},shadowMapCullingVolume:{get:function(){return this._shadowMapCullingVolume}},passes:{get:function(){return this._passes}},isPointLight:{get:function(){return this._isPointLight}},debugCascadeColors:{get:function(){return this._debugCascadeColors},set:function(e){this.dirty=this._debugCascadeColors!==e,this._debugCascadeColors=e}}});function r8(e){let t=e._passes.length;for(let n=0;n<t;++n){let i=e._passes[n],o=i.framebuffer;l(o)&&!o.isDestroyed()&&o.destroy(),i.framebuffer=void 0}e._depthAttachment=e._depthAttachment&&e._depthAttachment.destroy(),e._colorAttachment=e._colorAttachment&&e._colorAttachment.destroy()}function Ght(e,t){let n=new Ld({context:t,width:e._textureSize.x,height:e._textureSize.y,format:nl.DEPTH_COMPONENT16}),i=new Wt({context:t,width:e._textureSize.x,height:e._textureSize.y,pixelFormat:ot.RGBA,pixelDatatype:je.UNSIGNED_BYTE,sampler:$t.NEAREST}),o=new Ar({context:t,depthRenderbuffer:n,colorTextures:[i],destroyAttachments:!1}),r=e._passes.length;for(let s=0;s<r;++s){let a=e._passes[s];a.framebuffer=o,a.passState.framebuffer=o}e._shadowMapTexture=i,e._depthAttachment=n,e._colorAttachment=i}function Eht(e,t){let n=new Wt({context:t,width:e._textureSize.x,height:e._textureSize.y,pixelFormat:ot.DEPTH_STENCIL,pixelDatatype:je.UNSIGNED_INT_24_8,sampler:$t.NEAREST}),i=new Ar({context:t,depthStencilTexture:n,destroyAttachments:!1}),o=e._passes.length;for(let r=0;r<o;++r){let s=e._passes[r];s.framebuffer=i,s.passState.framebuffer=i}e._shadowMapTexture=n,e._depthAttachment=n}function Iht(e,t){let n=new Ld({context:t,width:e._textureSize.x,height:e._textureSize.y,format:nl.DEPTH_COMPONENT16}),i=new Tr({context:t,width:e._textureSize.x,height:e._textureSize.y,pixelFormat:ot.RGBA,pixelDatatype:je.UNSIGNED_BYTE,sampler:$t.NEAREST}),o=[i.negativeX,i.negativeY,i.negativeZ,i.positiveX,i.positiveY,i.positiveZ];for(let r=0;r<6;++r){let s=new Ar({context:t,depthRenderbuffer:n,colorTextures:[o[r]],destroyAttachments:!1}),a=e._passes[r];a.framebuffer=s,a.passState.framebuffer=s}e._shadowMapTexture=i,e._depthAttachment=n,e._colorAttachment=i}function qxe(e,t){e._isPointLight?Iht(e,t):e._usesDepthTexture?Eht(e,t):Ght(e,t)}function Xht(e,t){e._usesDepthTexture&&e._passes[0].framebuffer.status!==ie.FRAMEBUFFER_COMPLETE&&(e._usesDepthTexture=!1,o8(e),r8(e),qxe(e,t))}function Wht(e,t){(!l(e._passes[0].framebuffer)||e._shadowMapTexture.width!==e._textureSize.x)&&(r8(e),qxe(e,t),Xht(e,t),$xe(e,t))}function $xe(e,t,n){n=y(n,0),(e._isPointLight||n===0)&&(e._clearCommand.framebuffer=e._passes[n].framebuffer,e._clearCommand.execute(t,e._clearPassState))}function Pht(e,t){e._size=t;let n=e._passes,i=n.length,o=e._textureSize;if(e._isPointLight){t=Mt.maximumCubeMapSize>=t?t:Mt.maximumCubeMapSize,o.x=t,o.y=t;let r=new He(0,0,t,t);n[0].passState.viewport=r,n[1].passState.viewport=r,n[2].passState.viewport=r,n[3].passState.viewport=r,n[4].passState.viewport=r,n[5].passState.viewport=r}else i===1?(t=Mt.maximumTextureSize>=t?t:Mt.maximumTextureSize,o.x=t,o.y=t,n[0].passState.viewport=new He(0,0,t,t)):i===4&&(t=Mt.maximumTextureSize>=t*2?t:Mt.maximumTextureSize/2,o.x=t*2,o.y=t*2,n[0].passState.viewport=new He(0,0,t,t),n[1].passState.viewport=new He(t,0,t,t),n[2].passState.viewport=new He(0,t,t,t),n[3].passState.viewport=new He(t,t,t,t));e._clearPassState.viewport=new He(0,0,o.x,o.y);for(let r=0;r<i;++r){let s=n[r],a=s.passState.viewport,c=a.x/o.x,d=a.y/o.y,u=a.width/o.x,h=a.height/o.y;s.textureOffsets=new M(u,0,0,c,0,h,0,d,0,0,1,0,0,0,0,1)}}var vht=new He;function wht(e,t){let n;e._isPointLight?n=`uniform samplerCube shadowMap_textureCube; in vec2 v_textureCoordinates; void main() { vec2 uv = v_textureCoordinates; vec3 dir; if (uv.y < 0.5) { if (uv.x < 0.333) { dir.x = -1.0; dir.y = uv.x * 6.0 - 1.0; dir.z = uv.y * 4.0 - 1.0; } else if (uv.x < 0.666) { dir.y = -1.0; dir.x = uv.x * 6.0 - 3.0; dir.z = uv.y * 4.0 - 1.0; } else { dir.z = -1.0; dir.x = uv.x * 6.0 - 5.0; dir.y = uv.y * 4.0 - 1.0; } } else { if (uv.x < 0.333) { dir.x = 1.0; dir.y = uv.x * 6.0 - 1.0; dir.z = uv.y * 4.0 - 3.0; } else if (uv.x < 0.666) { dir.y = 1.0; dir.x = uv.x * 6.0 - 3.0; dir.z = uv.y * 4.0 - 3.0; } else { dir.z = 1.0; dir.x = uv.x * 6.0 - 5.0; dir.y = uv.y * 4.0 - 3.0; } } float shadow = czm_unpackDepth(czm_textureCube(shadowMap_textureCube, dir)); out_FragColor = vec4(vec3(shadow), 1.0); } `:n=`uniform sampler2D shadowMap_texture; in vec2 v_textureCoordinates; void main() { ${e._usesDepthTexture?` float shadow = texture(shadowMap_texture, v_textureCoordinates).r; `:` float shadow = czm_unpackDepth(texture(shadowMap_texture, v_textureCoordinates)); `} out_FragColor = vec4(vec3(shadow), 1.0); } `;let i=t.createViewportQuadCommand(n,{uniformMap:{shadowMap_texture:function(){return e._shadowMapTexture},shadowMap_textureCube:function(){return e._shadowMapTexture}}});return i.pass=Ge.OVERLAY,i}function Fht(e,t){let n=t.context,i=t.context.drawingBufferWidth,o=t.context.drawingBufferHeight,r=Math.min(i,o)*.3,s=vht;s.x=i-r,s.y=0,s.width=r,s.height=r;let a=e._debugShadowViewCommand;l(a)||(a=wht(e,n),e._debugShadowViewCommand=a),(!l(a.renderState)||!He.equals(a.renderState.viewport,s))&&(a.renderState=Ue.fromCache({viewport:He.clone(s)})),t.commandList.push(e._debugShadowViewCommand)}var hp=new Array(8);hp[0]=new re(-1,-1,-1,1);hp[1]=new re(1,-1,-1,1);hp[2]=new re(1,1,-1,1);hp[3]=new re(-1,1,-1,1);hp[4]=new re(-1,-1,1,1);hp[5]=new re(1,-1,1,1);hp[6]=new re(1,1,1,1);hp[7]=new re(-1,1,1,1);var Ny=new M,s8=new Array(8);for(let e=0;e<8;++e)s8[e]=new re;function Aht(e,t){let n=new It({geometry:new Pm({minimum:new m(-.5,-.5,-.5),maximum:new m(.5,.5,.5)}),attributes:{color:Ht.fromColor(t)}}),i=new It({geometry:new Ab({radius:.5}),attributes:{color:Ht.fromColor(t)}});return new Xn({geometryInstances:[n,i],appearance:new dn({translucent:!1,flat:!0}),asynchronous:!1,modelMatrix:e})}var Mht=[B.RED,B.GREEN,B.BLUE,B.MAGENTA],Nht=new m;function kht(e,t){Fht(e,t);let n=e.debugFreezeFrame&&!e._debugFreezeFrame;if(e._debugFreezeFrame=e.debugFreezeFrame,e.debugFreezeFrame&&(n&&(e._debugCameraFrustum=e._debugCameraFrustum&&e._debugCameraFrustum.destroy(),e._debugCameraFrustum=new ap({camera:e._sceneCamera,color:B.CYAN,updateOnChange:!1})),e._debugCameraFrustum.update(t)),e._cascadesEnabled){if(e.debugFreezeFrame){n&&(e._debugLightFrustum=e._debugLightFrustum&&e._debugLightFrustum.destroy(),e._debugLightFrustum=new ap({camera:e._shadowMapCamera,color:B.YELLOW,updateOnChange:!1})),e._debugLightFrustum.update(t);for(let i=0;i<e._numberOfCascades;++i)n&&(e._debugCascadeFrustums[i]=e._debugCascadeFrustums[i]&&e._debugCascadeFrustums[i].destroy(),e._debugCascadeFrustums[i]=new ap({camera:e._passes[i].camera,color:Mht[i],updateOnChange:!1})),e._debugCascadeFrustums[i].update(t)}}else if(e._isPointLight){if(!l(e._debugLightFrustum)||e._needsUpdate){let i=e._shadowMapCamera.positionWC,o=Fe.IDENTITY,r=e._pointLightRadius*2,s=m.fromElements(r,r,r,Nht),a=M.fromTranslationQuaternionRotationScale(i,o,s,Ny);e._debugLightFrustum=e._debugLightFrustum&&e._debugLightFrustum.destroy(),e._debugLightFrustum=Aht(a,B.YELLOW)}e._debugLightFrustum.update(t)}else(!l(e._debugLightFrustum)||e._needsUpdate)&&(e._debugLightFrustum=new ap({camera:e._shadowMapCamera,color:B.YELLOW,updateOnChange:!1})),e._debugLightFrustum.update(t)}function W3(){this.viewMatrix=new M,this.inverseViewMatrix=new M,this.frustum=void 0,this.positionCartographic=new he,this.positionWC=new m,this.directionWC=m.clone(m.UNIT_Z),this.upWC=m.clone(m.UNIT_Y),this.rightWC=m.clone(m.UNIT_X),this.viewProjectionMatrix=new M}W3.prototype.clone=function(e){M.clone(e.viewMatrix,this.viewMatrix),M.clone(e.inverseViewMatrix,this.inverseViewMatrix),this.frustum=e.frustum.clone(this.frustum),he.clone(e.positionCartographic,this.positionCartographic),m.clone(e.positionWC,this.positionWC),m.clone(e.directionWC,this.directionWC),m.clone(e.upWC,this.upWC),m.clone(e.rightWC,this.rightWC)};var Uht=new M(.5,0,0,.5,0,.5,0,.5,0,0,.5,.5,0,0,0,1);W3.prototype.getViewProjection=function(){let e=this.viewMatrix,t=this.frustum.projectionMatrix;return M.multiply(t,e,this.viewProjectionMatrix),M.multiply(Uht,this.viewProjectionMatrix,this.viewProjectionMatrix),this.viewProjectionMatrix};var Dht=new Array(5),Bht=new Gi,Oht=new Array(4),e_e=new m,t_e=new m;function Yht(e,t){let n=e._shadowMapCamera,i=e._sceneCamera,o=i.frustum.near,r=i.frustum.far,s=e._numberOfCascades,a,c=r-o,d=r/o,u=.9,h=!1;t.shadowState.closestObjectSize<200&&(h=!0,u=.9);let p=Oht,g=Dht;for(g[0]=o,g[s]=r,a=0;a<s;++a){let A=(a+1)/s,b=o*Math.pow(d,A),Z=o+c*A,E=W.lerp(Z,b,u);g[a+1]=E,p[a]=E-g[a]}if(h){for(a=0;a<s;++a)p[a]=Math.min(p[a],e._maximumCascadeDistances[a]);let A=g[0];for(a=0;a<s-1;++a)A+=p[a],g[a+1]=A}re.unpack(g,0,e._cascadeSplits[0]),re.unpack(g,1,e._cascadeSplits[1]),re.unpack(p,0,e._cascadeDistances);let f=n.frustum,x=f.left,_=f.right,C=f.bottom,V=f.top,L=f.near,R=f.far,G=n.positionWC,I=n.directionWC,v=n.upWC,P=i.frustum.clone(Bht),w=n.getViewProjection();for(a=0;a<s;++a){P.near=g[a],P.far=g[a+1];let A=M.multiply(P.projectionMatrix,i.viewMatrix,Ny),b=M.inverse(A,Ny),Z=M.multiply(w,b,Ny),E=m.fromElements(Number.MAX_VALUE,Number.MAX_VALUE,Number.MAX_VALUE,e_e),X=m.fromElements(-Number.MAX_VALUE,-Number.MAX_VALUE,-Number.MAX_VALUE,t_e);for(let Y=0;Y<8;++Y){let k=re.clone(hp[Y],s8[Y]);M.multiplyByVector(Z,k,k),m.divideByScalar(k,k.w,k),m.minimumByComponent(k,E,E),m.maximumByComponent(k,X,X)}E.x=Math.max(E.x,0),E.y=Math.max(E.y,0),E.z=0,X.x=Math.min(X.x,1),X.y=Math.min(X.y,1),X.z=Math.min(X.z,1);let F=e._passes[a],N=F.camera;N.clone(n);let O=N.frustum;O.left=x+E.x*(_-x),O.right=x+X.x*(_-x),O.bottom=C+E.y*(V-C),O.top=C+X.y*(V-C),O.near=L+E.z*(R-L),O.far=L+X.z*(R-L),F.cullingVolume=N.frustum.computeCullingVolume(G,I,v);let U=e._cascadeMatrices[a];M.multiply(N.getViewProjection(),i.inverseViewMatrix,U),M.multiply(F.textureOffsets,U,U)}}var Hht=new M,zht=new m,Kht=new m,Qxe=new m;function Jht(e,t){let n=e._shadowMapCamera,i=e._sceneCamera,o=M.multiply(i.frustum.projectionMatrix,i.viewMatrix,Ny),r=M.inverse(o,Ny),s=n.directionWC,a=i.directionWC;m.equalsEpsilon(s,a,W.EPSILON10)&&(a=i.upWC);let c=m.cross(s,a,zht);a=m.cross(c,s,Kht),m.normalize(a,a),m.normalize(c,c);let d=m.fromElements(0,0,0,Qxe),u=M.computeView(d,s,a,c,Hht),h=M.multiply(u,r,Ny),p=m.fromElements(Number.MAX_VALUE,Number.MAX_VALUE,Number.MAX_VALUE,e_e),g=m.fromElements(-Number.MAX_VALUE,-Number.MAX_VALUE,-Number.MAX_VALUE,t_e);for(let R=0;R<8;++R){let G=re.clone(hp[R],s8[R]);M.multiplyByVector(h,G,G),m.divideByScalar(G,G.w,G),m.minimumByComponent(G,p,p),m.maximumByComponent(G,g,g)}g.z+=1e3,p.z-=10;let f=Qxe;f.x=-(.5*(p.x+g.x)),f.y=-(.5*(p.y+g.y)),f.z=-g.z;let x=M.fromTranslation(f,Ny);u=M.multiply(x,u,u);let _=.5*(g.x-p.x),C=.5*(g.y-p.y),V=g.z-p.z,L=n.frustum;L.left=-_,L.right=_,L.bottom=-C,L.top=C,L.near=.01,L.far=V,M.clone(u,n.viewMatrix),M.inverse(u,n.inverseViewMatrix),M.getTranslation(n.inverseViewMatrix,n.positionWC),t.mapProjection.ellipsoid.cartesianToCartographic(n.positionWC,n.positionCartographic),m.clone(s,n.directionWC),m.clone(a,n.upWC),m.clone(c,n.rightWC)}var Qht=[new m(-1,0,0),new m(0,-1,0),new m(0,0,-1),new m(1,0,0),new m(0,1,0),new m(0,0,1)],jht=[new m(0,-1,0),new m(0,0,-1),new m(0,-1,0),new m(0,-1,0),new m(0,0,1),new m(0,-1,0)],qht=[new m(0,0,1),new m(1,0,0),new m(-1,0,0),new m(0,0,-1),new m(1,0,0),new m(1,0,0)];function $ht(e,t){let n=new Gi;n.fov=W.PI_OVER_TWO,n.near=1,n.far=e._pointLightRadius,n.aspectRatio=1;for(let i=0;i<6;++i){let o=e._passes[i].camera;o.positionWC=e._shadowMapCamera.positionWC,o.positionCartographic=t.mapProjection.ellipsoid.cartesianToCartographic(o.positionWC,o.positionCartographic),o.directionWC=Qht[i],o.upWC=jht[i],o.rightWC=qht[i],M.computeView(o.positionWC,o.directionWC,o.upWC,o.rightWC,o.viewMatrix),M.inverse(o.viewMatrix,o.inverseViewMatrix),o.frustum=n}}var eft=new m,tft=new m,n_e=new de,jxe=n_e.center;function nft(e,t){let n=e._sceneCamera,i=e._shadowMapCamera,o=n_e;if(e._cascadesEnabled){if(n.frustum.near>=e.maximumDistance){e._outOfView=!0,e._needsUpdate=!1;return}let r=t.mapProjection.ellipsoid.geodeticSurfaceNormal(n.positionWC,eft),s=m.negate(i.directionWC,tft),a=m.dot(r,s);if(e.fadingEnabled){let c=W.clamp(a/.1,0,1);e._darkness=W.lerp(1,e.darkness,c)}else e._darkness=e.darkness;if(a<0){e._outOfView=!0,e._needsUpdate=!1;return}e._needsUpdate=!0,e._outOfView=!1}else if(e._isPointLight)o.center=i.positionWC,o.radius=e._pointLightRadius,e._outOfView=t.cullingVolume.computeVisibility(o)===zt.OUTSIDE,e._needsUpdate=!e._outOfView&&!e._boundingSphere.equals(o),de.clone(o,e._boundingSphere);else{let r=i.frustum.far/2,s=m.add(i.positionWC,m.multiplyByScalar(i.directionWC,r,jxe),jxe);o.center=s,o.radius=r,e._outOfView=t.cullingVolume.computeVisibility(o)===zt.OUTSIDE,e._needsUpdate=!e._outOfView&&!e._boundingSphere.equals(o),de.clone(o,e._boundingSphere)}}function ift(e,t){let n=t.camera,i=e._lightCamera,o=e._sceneCamera,r=e._shadowMapCamera;e._cascadesEnabled?m.clone(i.directionWC,r.directionWC):e._isPointLight?m.clone(i.positionWC,r.positionWC):r.clone(i);let s=e._lightDirectionEC;M.multiplyByPointAsVector(n.viewMatrix,r.directionWC,s),m.normalize(s,s),m.negate(s,s),M.multiplyByPoint(n.viewMatrix,r.positionWC,e._lightPositionEC),e._lightPositionEC.w=e._pointLightRadius;let a,c;e._fitNearFar?(a=Math.min(t.shadowState.nearPlane,e.maximumDistance),c=Math.min(t.shadowState.farPlane,e.maximumDistance),c=Math.max(c,a+1)):(a=n.frustum.near,c=e.maximumDistance),e._sceneCamera=co.clone(n,o),n.frustum.clone(e._sceneCamera.frustum),e._sceneCamera.frustum.near=a,e._sceneCamera.frustum.far=c,e._distance=c-a,nft(e,t),!e._outOfViewPrevious&&e._outOfView&&(e._needsUpdate=!0),e._outOfViewPrevious=e._outOfView}mp.prototype.update=function(e){if(ift(this,e),this._needsUpdate)if(Wht(this,e.context),this._isPointLight&&$ht(this,e),this._cascadesEnabled&&(Jht(this,e),this._numberOfCascades>1&&Yht(this,e)),this._isPointLight)this._shadowMapCullingVolume=ps.fromBoundingSphere(this._boundingSphere);else{let t=this._shadowMapCamera,n=t.positionWC,i=t.directionWC,o=t.upWC;this._shadowMapCullingVolume=t.frustum.computeCullingVolume(n,i,o),this._passes.length===1&&this._passes[0].camera.clone(t)}if(this._passes.length===1){let t=this._sceneCamera.inverseViewMatrix;M.multiply(this._shadowMapCamera.getViewProjection(),t,this._shadowMapMatrix)}this.debugShow&&kht(this,e)};mp.prototype.updatePass=function(e,t){$xe(this,e,t)};var oft=new D;function i_e(e,t,n){let i=e._isPointLight?e._pointBias:n?e._terrainBias:e._primitiveBias,o={shadowMap_texture:function(){return e._shadowMapTexture},shadowMap_textureCube:function(){return e._shadowMapTexture},shadowMap_matrix:function(){return e._shadowMapMatrix},shadowMap_cascadeSplits:function(){return e._cascadeSplits},shadowMap_cascadeMatrices:function(){return e._cascadeMatrices},shadowMap_lightDirectionEC:function(){return e._lightDirectionEC},shadowMap_lightPositionEC:function(){return e._lightPositionEC},shadowMap_cascadeDistances:function(){return e._cascadeDistances},shadowMap_texelSizeDepthBiasAndNormalShadingSmooth:function(){let r=oft;return r.x=1/e._textureSize.x,r.y=1/e._textureSize.y,re.fromElements(r.x,r.y,i.depthBias,i.normalShadingSmooth,this.combinedUniforms1)},shadowMap_normalOffsetScaleDistanceMaxDistanceAndDarkness:function(){return re.fromElements(i.normalOffsetScale,e._distance,e.maximumDistance,e._darkness,this.combinedUniforms2)},combinedUniforms1:new re,combinedUniforms2:new re};return Lt(t,o,!1)}function rft(e,t,n,i,o,r){let s,a,c;if(l(r)&&(s=r.shaderProgram,a=r.renderState,c=r.uniformMap),r=$e.shallowClone(n,r),r.castShadows=!0,r.receiveShadows=!1,!l(s)||o!==n.shaderProgram.id||t){let d=n.shaderProgram,u=n.pass===Ge.GLOBE,h=n.pass!==Ge.TRANSLUCENT,p=e._isPointLight,g=e._usesDepthTexture,f=up.getShadowCastShaderKeyword(p,u,g,h);if(s=i.shaderCache.getDerivedShaderProgram(d,f),!l(s)){let _=d.vertexShaderSource,C=d.fragmentShaderSource,V=up.createShadowCastVertexShader(_,p,u),L=up.createShadowCastFragmentShader(C,p,g,h);s=i.shaderCache.createDerivedShaderProgram(d,f,{vertexShaderSource:V,fragmentShaderSource:L,attributeLocations:d._attributeLocations})}a=e._primitiveRenderState,p?a=e._pointRenderState:u&&(a=e._terrainRenderState),n.renderState.cull.enabled||(a=Oe(a,!1),a.cull=Oe(a.cull,!1),a.cull.enabled=!1,a=Ue.fromCache(a)),c=i_e(e,n.uniformMap,u)}return r.shaderProgram=s,r.renderState=a,r.uniformMap=c,r}mp.createReceiveDerivedCommand=function(e,t,n,i,o){l(o)||(o={});let r=e.length>0,s=t.shaderProgram,a=s.vertexShaderSource,c=s.fragmentShaderSource,d=t.pass===Ge.GLOBE,u=!1;if(d&&(u=t.owner.data.renderedMesh.encoding.hasVertexNormals),t.receiveShadows&&r){let h,p;l(o.receiveCommand)&&(h=o.receiveCommand.shaderProgram,p=o.receiveCommand.uniformMap),o.receiveCommand=$e.shallowClone(t,o.receiveCommand),o.castShadows=!1,o.receiveShadows=!0;let g=o.receiveShaderCastShadows!==t.castShadows,f=o.receiveShaderProgramId!==t.shaderProgram.id;if(!l(h)||f||n||g){let x=up.getShadowReceiveShaderKeyword(e[0],t.castShadows,d,u);if(h=i.shaderCache.getDerivedShaderProgram(s,x),!l(h)){let _=up.createShadowReceiveVertexShader(a,d,u),C=up.createShadowReceiveFragmentShader(c,e[0],t.castShadows,d,u);h=i.shaderCache.createDerivedShaderProgram(s,x,{vertexShaderSource:_,fragmentShaderSource:C,attributeLocations:s._attributeLocations})}p=i_e(e[0],t.uniformMap,d)}o.receiveCommand.shaderProgram=h,o.receiveCommand.uniformMap=p,o.receiveShaderProgramId=t.shaderProgram.id,o.receiveShaderCastShadows=t.castShadows}return o};mp.createCastDerivedCommand=function(e,t,n,i,o){if(l(o)||(o={}),t.castShadows){let r=o.castCommands;l(r)||(r=o.castCommands=[]);let s=o.castShaderProgramId,a=e.length;r.length=a;for(let c=0;c<a;++c)r[c]=rft(e[c],n,t,i,s,r[c]);o.castShaderProgramId=t.shaderProgram.id}return o};mp.prototype.isDestroyed=function(){return!1};mp.prototype.destroy=function(){r8(this),this._debugLightFrustum=this._debugLightFrustum&&this._debugLightFrustum.destroy(),this._debugCameraFrustum=this._debugCameraFrustum&&this._debugCameraFrustum.destroy(),this._debugShadowViewCommand=this._debugShadowViewCommand&&this._debugShadowViewCommand.shaderProgram&&this._debugShadowViewCommand.shaderProgram.destroy();for(let e=0;e<this._numberOfCascades;++e)this._debugCascadeFrustums[e]=this._debugCascadeFrustums[e]&&this._debugCascadeFrustums[e].destroy();return me(this)};var L0=mp;var DMi=T(S(),1);var xMi=T(S(),1),jF=`uniform sampler2D u_opaqueDepthTexture; uniform sampler2D u_translucentDepthTexture; in vec2 v_textureCoordinates; void main() { float opaqueDepth = texture(u_opaqueDepthTexture, v_textureCoordinates).r; float translucentDepth = texture(u_translucentDepthTexture, v_textureCoordinates).r; translucentDepth = czm_branchFreeTernary(translucentDepth > opaqueDepth, 1.0, translucentDepth); out_FragColor = czm_packDepth(translucentDepth); } `;var TMi=T(S(),1),oS=`uniform sampler2D colorTexture; #ifdef DEBUG_SHOW_DEPTH uniform sampler2D u_packedTranslucentDepth; #endif in vec2 v_textureCoordinates; void main() { #ifdef DEBUG_SHOW_DEPTH if (v_textureCoordinates.x < 0.5) { out_FragColor.rgb = vec3(czm_unpackDepth(texture(u_packedTranslucentDepth, v_textureCoordinates))); out_FragColor.a = 1.0; } #else vec4 color = texture(colorTexture, v_textureCoordinates); #ifdef PICK if (color == vec4(0.0)) { discard; } #else // Reverse premultiplication process to get the correct composited result of the classification primitives color.rgb /= color.a; #endif out_FragColor = color; #endif } `;var sft=!1;function ky(e){this._drawClassificationFBO=new bi({createDepthAttachments:!1}),this._accumulationFBO=new bi({createDepthAttachments:!1}),this._packFBO=new bi,this._opaqueDepthStencilTexture=void 0,this._textureToComposite=void 0,this._translucentDepthStencilTexture=void 0,this._packDepthCommand=void 0,this._accumulateCommand=void 0,this._compositeCommand=void 0,this._copyCommand=void 0,this._clearColorCommand=new ai({color:new B(0,0,0,0),owner:this}),this._clearDepthStencilCommand=new ai({depth:1,stencil:0,owner:this}),this._supported=e.depthTexture,this._viewport=new He,this._rsDepth=void 0,this._rsAccumulate=void 0,this._rsComp=void 0,this._useScissorTest=void 0,this._scissorRectangle=void 0,this._hasTranslucentDepth=!1,this._frustumsDrawn=0}Object.defineProperties(ky.prototype,{hasTranslucentDepth:{get:function(){return this._hasTranslucentDepth}}});function o_e(e){e._textureToComposite=void 0,e._translucentDepthStencilTexture=e._translucentDepthStencilTexture&&!e._translucentDepthStencilTexture.isDestroyed()&&e._translucentDepthStencilTexture.destroy()}function r_e(e){e._drawClassificationFBO.destroy(),e._accumulationFBO.destroy(),e._packFBO.destroy()}function aft(e,t,n,i){o_e(e),e._translucentDepthStencilTexture=new Wt({context:t,width:n,height:i,pixelFormat:ot.DEPTH_STENCIL,pixelDatatype:je.UNSIGNED_INT_24_8,sampler:$t.NEAREST})}function cft(e,t,n,i){r_e(e),e._drawClassificationFBO.setDepthStencilTexture(e._translucentDepthStencilTexture),e._drawClassificationFBO.update(t,n,i),e._accumulationFBO.setDepthStencilTexture(e._translucentDepthStencilTexture),e._accumulationFBO.update(t,n,i),e._packFBO.update(t,n,i)}function lft(e,t,n,i){if(!e.isSupported())return;e._opaqueDepthStencilTexture=i;let o=e._opaqueDepthStencilTexture.width,r=e._opaqueDepthStencilTexture.height;e._drawClassificationFBO.isDirty(o,r)&&(aft(e,t,o,r),cft(e,t,o,r));let s,a;if(l(e._packDepthCommand)||(s=new De({sources:[jF]}),a={u_opaqueDepthTexture:function(){return e._opaqueDepthStencilTexture},u_translucentDepthTexture:function(){return e._translucentDepthStencilTexture}},e._packDepthCommand=t.createViewportQuadCommand(s,{uniformMap:a,owner:e})),!l(e._compositeCommand)){s=new De({sources:[oS]}),a={colorTexture:function(){return e._textureToComposite}},sft&&(s.defines=["DEBUG_SHOW_DEPTH"],a.u_packedTranslucentDepth=function(){return e._packFBO.getColorTexture()}),e._compositeCommand=t.createViewportQuadCommand(s,{uniformMap:a,owner:e});let u=e._compositeCommand,h=u.shaderProgram,p=t.shaderCache.createDerivedShaderProgram(h,"pick",{vertexShaderSource:h.vertexShaderSource,fragmentShaderSource:new De({sources:s.sources,defines:["PICK"]}),attributeLocations:h._attributeLocations}),g=$e.shallowClone(u);g.shaderProgram=p,u.derivedCommands.pick=g}l(e._copyCommand)||(s=new De({sources:[oS]}),a={colorTexture:function(){return e._drawClassificationFBO.getColorTexture()}},e._copyCommand=t.createViewportQuadCommand(s,{uniformMap:a,owner:e})),l(e._accumulateCommand)||(s=new De({sources:[oS]}),a={colorTexture:function(){return e._drawClassificationFBO.getColorTexture()}},e._accumulateCommand=t.createViewportQuadCommand(s,{uniformMap:a,owner:e})),e._viewport.width=o,e._viewport.height=r;let c=!He.equals(e._viewport,n.viewport),d=c!==e._useScissorTest;e._useScissorTest=c,He.equals(e._scissorRectangle,n.viewport)||(e._scissorRectangle=He.clone(n.viewport,e._scissorRectangle),d=!0),(!l(e._rsDepth)||!He.equals(e._viewport,e._rsDepth.viewport)||d)&&(e._rsDepth=Ue.fromCache({viewport:e._viewport,scissorTest:{enabled:e._useScissorTest,rectangle:e._scissorRectangle}})),l(e._packDepthCommand)&&(e._packDepthCommand.renderState=e._rsDepth),(!l(e._rsAccumulate)||!He.equals(e._viewport,e._rsAccumulate.viewport)||d)&&(e._rsAccumulate=Ue.fromCache({viewport:e._viewport,scissorTest:{enabled:e._useScissorTest,rectangle:e._scissorRectangle},stencilTest:{enabled:!0,frontFunction:On.EQUAL,reference:Dt.CESIUM_3D_TILE_MASK}})),l(e._accumulateCommand)&&(e._accumulateCommand.renderState=e._rsAccumulate),(!l(e._rsComp)||!He.equals(e._viewport,e._rsComp.viewport)||d)&&(e._rsComp=Ue.fromCache({viewport:e._viewport,scissorTest:{enabled:e._useScissorTest,rectangle:e._scissorRectangle},blending:hn.ALPHA_BLEND})),l(e._compositeCommand)&&(e._compositeCommand.renderState=e._rsComp,e._compositeCommand.derivedCommands.pick.renderState=e._rsComp)}ky.prototype.executeTranslucentCommands=function(e,t,n,i,o){let r=e.frameState.useLogDepth,s=e.context,a=n.framebuffer;for(let c=0;c<i.length;++c){let d=i[c];if(d=r?d.derivedCommands.logDepth.command:d,d.depthForTranslucentClassification){this._hasTranslucentDepth=!0;break}}if(this._hasTranslucentDepth){lft(this,s,n,o),n.framebuffer=this._drawClassificationFBO.framebuffer,this._clearDepthStencilCommand.execute(s,n);for(let c=0;c<i.length;++c){let d=i[c];if(d=r?d.derivedCommands.logDepth.command:d,!d.depthForTranslucentClassification)continue;let u=d.derivedCommands.depth.depthOnlyCommand;t(u,e,n)}this._frustumsDrawn+=this._hasTranslucentDepth?1:0,this._hasTranslucentDepth&&(n.framebuffer=this._packFBO.framebuffer,this._packDepthCommand.execute(s,n)),n.framebuffer=a}};ky.prototype.executeClassificationCommands=function(e,t,n,i){if(!this._hasTranslucentDepth)return;let o=e.context,r=o.uniformState,s=n.framebuffer;n.framebuffer=this._accumulationFBO.framebuffer,this._accumulateCommand.execute(o,n),n.framebuffer=this._drawClassificationFBO.framebuffer,this._frustumsDrawn>1&&this._clearColorCommand.execute(o,n),r.updatePass(Ge.CESIUM_3D_TILE_CLASSIFICATION);let a=r.globeDepthTexture;r.globeDepthTexture=this._packFBO.getColorTexture();let c=i.commands[Ge.CESIUM_3D_TILE_CLASSIFICATION],d=i.indices[Ge.CESIUM_3D_TILE_CLASSIFICATION];for(let u=0;u<d;++u)t(c[u],e,n);r.globeDepthTexture=a,n.framebuffer=s,this._frustumsDrawn!==1&&(n.framebuffer=this._accumulationFBO.framebuffer,this._accumulateCommand.execute(o,n),n.framebuffer=s)};ky.prototype.execute=function(e,t){if(!this._hasTranslucentDepth)return;this._frustumsDrawn===1?this._textureToComposite=this._drawClassificationFBO.getColorTexture():this._textureToComposite=this._accumulationFBO.getColorTexture(),(e.frameState.passes.pick?this._compositeCommand.derivedCommands.pick:this._compositeCommand).execute(e.context,t),dft(this,e,t)};function dft(e,t,n){if(!e._hasTranslucentDepth)return;let i=n.framebuffer;n.framebuffer=e._drawClassificationFBO.framebuffer,e._clearColorCommand.execute(t._context,n),n.framebuffer=i,e._frustumsDrawn>1&&(n.framebuffer=e._accumulationFBO.framebuffer,e._clearColorCommand.execute(t._context,n)),e._hasTranslucentDepth=!1,e._frustumsDrawn=0}ky.prototype.isSupported=function(){return this._supported};ky.prototype.isDestroyed=function(){return!1};ky.prototype.destroy=function(){return o_e(this),r_e(this),l(this._compositeCommand)&&(this._compositeCommand.shaderProgram=this._compositeCommand.shaderProgram&&this._compositeCommand.shaderProgram.destroy()),l(this._packDepthCommand)&&(this._packDepthCommand.shaderProgram=this._packDepthCommand.shaderProgram&&this._packDepthCommand.shaderProgram.destroy()),me(this)};var qF=ky;function uft(){this.command=void 0,this.near=void 0,this.far=void 0}function P3(e,t,n){let i=e.context,o;i.depthTexture&&(o=new BF);let r;e._useOIT&&i.depthTexture&&(r=new HF(i));let s=new Vc(i);s.viewport=He.clone(n),this.camera=t,this._cameraClone=co.clone(t),this._cameraStartFired=!1,this._cameraMovedTime=void 0,this.viewport=n,this.passState=s,this.pickFramebuffer=new QF(i),this.pickDepthFramebuffer=new KF,this.sceneFramebuffer=new nS,this.globeDepth=o,this.globeTranslucencyFramebuffer=new OF,this.oit=r,this.translucentTileClassification=new qF(i),this.pickDepths=[],this.frustumCommandsList=[],this.debugFrustumStatistics=void 0,this._commandExtents=[]}var a8=new m,c8=new m;function mft(e,t,n){let i=Math.max(m.maximumComponent(m.abs(e.position,a8)),m.maximumComponent(m.abs(t.position,c8))),o=1/Math.max(1,i);return m.multiplyByScalar(e.position,o,a8),m.multiplyByScalar(t.position,o,c8),m.equalsEpsilon(a8,c8,n)&&m.equalsEpsilon(e.direction,t.direction,n)&&m.equalsEpsilon(e.up,t.up,n)&&m.equalsEpsilon(e.right,t.right,n)&&M.equalsEpsilon(e.transform,t.transform,n)&&e.frustum.equalsEpsilon(t.frustum,n)}P3.prototype.checkForCameraUpdates=function(e){let t=this.camera,n=this._cameraClone;return mft(t,n,W.EPSILON15)?(this._cameraStartFired&&Si()-this._cameraMovedTime>e.cameraEventWaitTime&&(t.moveEnd.raiseEvent(),this._cameraStartFired=!1),!1):(this._cameraStartFired||(t.moveStart.raiseEvent(),this._cameraStartFired=!0),this._cameraMovedTime=Si(),co.clone(t,n),!0)};function hft(e,t,n,i){let{frameState:o}=t,{camera:r,useLogDepth:s}=o,a=s?t.logarithmicDepthFarToNearRatio:t.farToNearRatio,c=t.mode===oe.SCENE2D,d=t.nearToFarDistance2D;i*=1+W.EPSILON2,n=Math.min(Math.max(n,r.frustum.near),r.frustum.far),i=Math.max(Math.min(i,r.frustum.far),n),isNaN(n)&&(n=r.frustum.near),isNaN(i)&&(i=r.frustum.far);let u;c?(i=Math.min(i,r.position.z+t.nearToFarDistance2D),n=Math.min(n,i),u=Math.ceil(Math.max(1,i-n)/t.nearToFarDistance2D)):u=Math.ceil(Math.log(i/n)/Math.log(a));let{frustumCommandsList:h}=e;h.length=u;for(let p=0;p<u;++p){let g,f;c?(g=Math.min(i-d,n+p*d),f=Math.min(i,g+d)):(g=Math.max(n,Math.pow(a,p)*n),f=Math.min(i,a*g));let x=h[p];l(x)?(x.near=g,x.far=f):x=h[p]=new DF(g,f)}}function fft(e,t,n){let{command:i,near:o,far:r}=n;t.debugShowFrustums&&(i.debugOverlappingFrustums=0);let{frustumCommandsList:s}=e;for(let a=0;a<s.length;++a){let c=s[a];if(o>c.far)continue;if(r<c.near)break;let d=i.pass,u=c.indices[d]++;if(c.commands[d][u]=i,t.debugShowFrustums&&(i.debugOverlappingFrustums|=1<<a),i.executeInClosestFrustum)break}if(t.debugShowFrustums){let{debugFrustumStatistics:a}=e,{debugOverlappingFrustums:c}=i,d=a.commandsInFrustums;d[c]=l(d[c])?d[c]+1:1,++a.totalCommands}t.updateDerivedCommands(i)}var s_e=new ps,pft=new Wa;P3.prototype.createPotentiallyVisibleSet=function(e){let{frameState:t}=e,{camera:n,commandList:i,shadowState:o}=t,{positionWC:r,directionWC:s,frustum:a}=n,c=e._computeCommandList,d=e._overlayCommandList;e.debugShowFrustums&&(this.debugFrustumStatistics={totalCommands:0,commandsInFrustums:{}});let u=this.frustumCommandsList;for(let w=0;w<u.length;++w)for(let A=0;A<Ge.NUMBER_OF_PASSES;++A)u[w].indices[A]=0;c.length=0,d.length=0;let h=this._commandExtents,p=h.length,g=0,f=+Number.MAX_VALUE,x=-Number.MAX_VALUE,{shadowsEnabled:_}=o,C=+Number.MAX_VALUE,V=-Number.MAX_VALUE,L=Number.MAX_VALUE,R=t.mode===oe.SCENE3D?t.occluder:void 0,{cullingVolume:G}=t,I=s_e.planes;for(let w=0;w<5;++w)I[w]=G.planes[w];G=s_e;for(let w=0;w<i.length;++w){let A=i[w],{pass:b,boundingVolume:Z}=A;if(b===Ge.COMPUTE)c.push(A);else if(b===Ge.OVERLAY)d.push(A);else{let E,X;if(l(Z)){if(!e.isVisible(G,A,R))continue;let N=Z.computePlaneDistances(r,s,pft);if(E=N.start,X=N.stop,f=Math.min(f,E),x=Math.max(x,X),_&&A.receiveShadows&&E<L0.MAXIMUM_DISTANCE&&!(b===Ge.GLOBE&&E<-100&&X>100)){let O=X-E;b!==Ge.GLOBE&&E<100&&(L=Math.min(L,O)),C=Math.min(C,E),V=Math.max(V,X)}}else A instanceof ai?(E=a.near,X=a.far):(E=a.near,X=a.far,f=Math.min(f,E),x=Math.max(x,X));let F=h[g];l(F)||(F=h[g]=new uft),F.command=A,F.near=E,F.far=X,g++}}_&&(C=Math.min(Math.max(C,a.near),a.far),V=Math.max(Math.min(V,a.far),C),o.nearPlane=C,o.farPlane=V,o.closestObjectSize=L),hft(this,e,f,x);for(let w=0;w<g;w++)fft(this,e,h[w]);if(g<p)for(let w=g;w<p;w++){let A=h[w];if(!l(A.command))break;A.command=void 0}let v=u.length,{frustumSplits:P}=t;P.length=v+1;for(let w=0;w<v;++w)P[w]=u[w].near,w===v-1&&(P[w+1]=u[w].far)};P3.prototype.destroy=function(){this.pickFramebuffer=this.pickFramebuffer&&this.pickFramebuffer.destroy(),this.pickDepthFramebuffer=this.pickDepthFramebuffer&&this.pickDepthFramebuffer.destroy(),this.sceneFramebuffer=this.sceneFramebuffer&&this.sceneFramebuffer.destroy(),this.globeDepth=this.globeDepth&&this.globeDepth.destroy(),this.oit=this.oit&&this.oit.destroy(),this.translucentTileClassification=this.translucentTileClassification&&this.translucentTileClassification.destroy(),this.globeTranslucencyFramebuffer=this.globeTranslucencyFramebuffer&&this.globeTranslucencyFramebuffer.destroy();let e=this.pickDepths;for(let t=0;t<e.length;++t)e[t].destroy()};var rS=P3;var c_e=.1,bft=new bm({pass:Ao.MOST_DETAILED_PRELOAD}),gft=new bm({pass:Ao.MOST_DETAILED_PICK}),$F=new bm({pass:Ao.PICK});function aa(e){this._mostDetailedRayPicks=[],this.pickRenderStateCache={},this._pickPositionCache={},this._pickPositionCacheDirty=!1;let t=new He(0,0,1,1),n=new co(e);n.frustum=new ln({width:c_e,aspectRatio:1,near:.1}),this._pickOffscreenView=new rS(e,n,t)}aa.prototype.update=function(){this._pickPositionCacheDirty=!0};aa.prototype.getPickDepth=function(e,t){let n=e.view.pickDepths,i=n[t];return l(i)||(i=new UF,n[t]=i),i};var yft=new Mr,xft=new m,v3=new m,_ft=new D,Tft=new M;function Sft(e,t,n,i,o){let r=e.camera,s=r.frustum,a=s.offCenterFrustum;l(a)&&(s=a);let c=2*(t.x-o.x)/o.width-1;c*=(s.right-s.left)*.5;let d=2*(o.height-t.y-o.y)/o.height-1;d*=(s.top-s.bottom)*.5;let u=M.clone(r.transform,Tft);r._setTransform(M.IDENTITY);let h=m.clone(r.position,xft);m.multiplyByScalar(r.right,c,v3),m.add(v3,h,h),m.multiplyByScalar(r.up,d,v3),m.add(v3,h,h),r._setTransform(u),e.mode===oe.SCENE2D&&m.fromElements(h.z,h.x,h.y,h);let p=s.getPixelDimensions(o.width,o.height,1,1,_ft),g=yft;return g.right=p.x*.5,g.left=-g.right,g.top=p.y*.5,g.bottom=-g.top,g.near=s.near,g.far=s.far,g.computeCullingVolume(h,r.directionWC,r.upWC)}var Cft=new yl,Vft=new D;function Lft(e,t,n,i,o){let r=e.camera,s=r.frustum,a=s.near,c=Math.tan(s.fovy*.5),d=s.aspectRatio*c,u=2*(t.x-o.x)/o.width-1,h=2*(o.height-t.y-o.y)/o.height-1,p=u*a*d,g=h*a*c,f=s.getPixelDimensions(o.width,o.height,1,1,Vft),x=f.x*n*.5,_=f.y*i*.5,C=Cft;return C.top=g+_,C.bottom=g-_,C.right=p+x,C.left=p-x,C.near=a,C.far=s.far,C.computeCullingVolume(r.positionWC,r.directionWC,r.upWC)}function w3(e,t,n,i,o){let r=e.camera.frustum;return r instanceof ln||r instanceof Mr?Sft(e,t,n,i,o):Lft(e,t,n,i,o)}var F3=new He(0,0,3,3),A3=new D,eA=new B(0,0,0,0);function l8(e,t,n,i,o){return o.width=y(n,3),o.height=y(i,o.width),o.x=t.x-(o.width-1)*.5,o.y=e-t.y-(o.height-1)*.5,o}aa.prototype.pick=function(e,t,n,i){let{context:o,frameState:r,defaultView:s}=e,{viewport:a,pickFramebuffer:c}=s;e.view=s,a.x=0,a.y=0,a.width=o.drawingBufferWidth,a.height=o.drawingBufferHeight;let d=s.passState;d.viewport=He.clone(a,d.viewport);let u=Bi.transformWindowToDrawingBuffer(e,t,A3),h=l8(o.drawingBufferHeight,u,n,i,F3);e.jobScheduler.disableThisFrame(),e.updateFrameState(),r.cullingVolume=w3(e,u,h.width,h.height,a),r.invertClassification=!1,r.passes.pick=!0,r.tilesetPassState=$F,o.uniformState.update(r),e.updateEnvironment(),d=c.begin(h,a),e.updateAndExecuteCommands(d,eA),e.resolveFramebuffers(d);let p=c.end(h);return o.endFrame(),p};aa.prototype.pickVoxelCoordinate=function(e,t,n,i){let{context:o,frameState:r,defaultView:s}=e,{viewport:a,pickFramebuffer:c}=s;e.view=s,a.x=0,a.y=0,a.width=o.drawingBufferWidth,a.height=o.drawingBufferHeight;let d=s.passState;d.viewport=He.clone(a,d.viewport);let u=Bi.transformWindowToDrawingBuffer(e,t,A3),h=l8(o.drawingBufferHeight,u,n,i,F3);e.jobScheduler.disableThisFrame(),e.updateFrameState(),r.cullingVolume=w3(e,u,h.width,h.height,a),r.invertClassification=!1,r.passes.pickVoxel=!0,r.tilesetPassState=$F,o.uniformState.update(r),e.updateEnvironment(),d=c.begin(h,a),e.updateAndExecuteCommands(d,eA),e.resolveFramebuffers(d);let p=c.readCenterPixel(h);return o.endFrame(),p};aa.prototype.pickMetadata=function(e,t,n){let{context:i,frameState:o,defaultView:r}=e,{viewport:s,pickFramebuffer:a}=r;e.view=r,s.x=0,s.y=0,s.width=i.drawingBufferWidth,s.height=i.drawingBufferHeight;let c=r.passState;c.viewport=He.clone(s,c.viewport);let d=Bi.transformWindowToDrawingBuffer(e,t,A3),u=l8(i.drawingBufferHeight,d,1,1,F3);e.jobScheduler.disableThisFrame(),e.updateFrameState(),o.cullingVolume=w3(e,d,u.width,u.height,s),o.invertClassification=!1,o.passes.pick=!0,o.tilesetPassState=$F,o.pickingMetadata=!0,o.pickedMetadataInfo=n,i.uniformState.update(o),e.updateEnvironment(),c=a.begin(u,s),e.updateAndExecuteCommands(c,eA);let h=e._environmentState.useOIT;e._environmentState.useOIT=!1,e.resolveFramebuffers(c),e._environmentState.useOIT=h;let p=a.readCenterPixel(u);return i.endFrame(),o.pickingMetadata=!1,kF.decodeMetadataValues(n.classProperty,n.metadataProperty,p)};function Rft(e,t){let{defaultView:n,context:i,frameState:o,environmentState:r}=e,{viewport:s,pickDepthFramebuffer:a}=n;e.view=n,s.x=0,s.y=0,s.width=i.drawingBufferWidth,s.height=i.drawingBufferHeight;let c=n.passState;c.viewport=He.clone(s,c.viewport),e.clearPasses(o.passes),o.passes.pick=!0,o.passes.depth=!0,o.cullingVolume=w3(e,t,1,1,s),o.tilesetPassState=$F,e.updateEnvironment(),r.renderTranslucentDepthForPick=!0,c=a.update(i,t,s),e.updateAndExecuteCommands(c,eA),e.resolveFramebuffers(c),i.endFrame()}var Zft=new Gi,Gft=new yl,Eft=new ln,Ift=new Mr;aa.prototype.pickPositionWorldCoordinates=function(e,t,n){if(!e.useDepthPicking)return;let i=t.toString();if(this._pickPositionCacheDirty)this._pickPositionCache={},this._pickPositionCacheDirty=!1;else if(this._pickPositionCache.hasOwnProperty(i))return m.clone(this._pickPositionCache[i],n);let{context:o,frameState:r,camera:s,defaultView:a}=e,{uniformState:c}=o;e.view=a;let d=Bi.transformWindowToDrawingBuffer(e,t,A3);e.pickTranslucentDepth?Rft(e,d):(e.updateFrameState(),c.update(r),e.updateEnvironment()),d.y=e.drawingBufferHeight-d.y;let u;l(s.frustum.fov)?u=s.frustum.clone(Zft):l(s.frustum.infiniteProjectionMatrix)?u=s.frustum.clone(Gft):l(s.frustum.width)?u=s.frustum.clone(Eft):u=s.frustum.clone(Ift);let{frustumCommandsList:h}=a,p=h.length;for(let g=0;g<p;++g){let x=this.getPickDepth(e,g).getDepth(o,d.x,d.y);if(l(x)&&x>0&&x<1){let _=h[g],C;return e.mode===oe.SCENE2D?(C=s.position.z,s.position.z=C-_.near+1,u.far=Math.max(1,_.far-_.near),u.near=1,c.update(r),c.updateFrustum(u)):(u.near=_.near*(g!==0?e.opaqueFrustumNearOffset:1),u.far=_.far,c.updateFrustum(u)),n=Bi.drawingBufferToWorldCoordinates(e,d,x,n),e.mode===oe.SCENE2D&&(s.position.z=C,c.update(r)),this._pickPositionCache[i]=m.clone(n),n}}this._pickPositionCache[i]=void 0};var Xft=new he;aa.prototype.pickPosition=function(e,t,n){if(n=this.pickPositionWorldCoordinates(e,t,n),l(n)&&e.mode!==oe.SCENE3D){m.fromElements(n.y,n.z,n.x,n);let i=e.mapProjection,o=i.ellipsoid,r=i.unproject(n,Xft);o.cartographicToCartesian(r,n)}return n};function l_e(e,t){let n,i,o=[],r=[],s=[],a=[];l(e)||(e=Number.MAX_VALUE);let c=t();for(;l(c);){let d=c.object,u=c.position,h=c.exclude;if(l(u)&&!l(d)){o.push(c);break}if(!l(d)||!l(d.primitive)||!h&&(o.push(c),0>=--e))break;let p=d.primitive,g=!1;typeof p.getGeometryInstanceAttributes=="function"&&l(d.id)&&(i=p.getGeometryInstanceAttributes(d.id),l(i)&&l(i.show)&&(g=!0,i.show=xn.toValue(!1,i.show),s.push(i))),d instanceof Hs&&(g=!0,d.show=!1,a.push(d)),g||(p.show=!1,r.push(p)),c=t()}for(n=0;n<r.length;++n)r[n].show=!0;for(n=0;n<s.length;++n)i=s[n],i.show=xn.toValue(!0,i.show);for(n=0;n<a.length;++n)a[n].show=!0;return o}aa.prototype.drillPick=function(e,t,n,i,o){let r=this;return l_e(n,function(){let c=r.pick(e,t,i,o);if(l(c))return{object:c,position:void 0,exclude:!1}}).map(function(c){return c.object})};var a_e=new m,Wft=new m;function Pft(e,t,n){this.ray=e,this.width=t,this.tilesets=n,this.ready=!1;let i=this;this.promise=new Promise(o=>{i._completePick=()=>{o()}})}function d_e(e,t,n,i){let o=t.direction,r=m.mostOrthogonalAxis(o,a_e),s=m.cross(o,r,a_e),a=m.cross(o,s,Wft);return i.position=t.origin,i.direction=o,i.up=a,i.right=s,i.frustum.width=y(n,c_e),i.frustum.computeCullingVolume(i.positionWC,i.directionWC,i.upWC)}function vft(e,t,n){let i=t.frameState,{ray:o,width:r,tilesets:s}=n,a=e._pickOffscreenView.camera,c=d_e(e,o,r,a),d=bft;d.camera=a,d.cullingVolume=c;let u=!0,h=s.length;for(let p=0;p<h;++p){let g=s[p];g.show&&t.primitives.contains(g)&&(g.updateForPass(i,d),u=u&&d.ready)}return u&&n._completePick(),u}aa.prototype.updateMostDetailedRayPicks=function(e){let t=this._mostDetailedRayPicks;for(let n=0;n<t.length;++n)vft(this,e,t[n])&&t.splice(n--,1)};function u_e(e,t,n){for(let i=0;i<e.length;++i){let o=e.get(i);o.show&&(l(o.isCesium3DTileset)?(!l(t)||t.indexOf(o)===-1)&&n.push(o):o instanceof dl&&u_e(o,t,n))}}function M3(e,t,n,i,o,r){let s=[];if(u_e(t.primitives,i,s),s.length===0)return Promise.resolve(r());let a=new Pft(n,o,s);return e._mostDetailedRayPicks.push(a),a.promise.then(function(){return r()})}function wft(e,t){return!l(e)||!l(t)||t.length===0?!1:t.indexOf(e)>-1||t.indexOf(e.primitive)>-1||t.indexOf(e.id)>-1}function Fft(e,t,n,i,o,r,s){let{context:a,frameState:c}=t,d=a.uniformState,u=e._pickOffscreenView;t.view=u,d_e(e,n,o,u.camera);let h=He.clone(u.viewport,F3),p=u.pickFramebuffer.begin(h,u.viewport);t.jobScheduler.disableThisFrame(),t.updateFrameState(),c.invertClassification=!1,c.passes.pick=!0,c.passes.offscreen=!0,s?c.tilesetPassState=gft:c.tilesetPassState=$F,d.update(c),t.updateEnvironment(),t.updateAndExecuteCommands(p,eA),t.resolveFramebuffers(p);let g,f=u.pickFramebuffer.end(h);if(t.context.depthTexture){let{frustumCommandsList:x}=u,_=x.length;for(let C=0;C<_;++C){let L=e.getPickDepth(t,C).getDepth(a,0,0);if(l(L)&&L>0&&L<1){let R=x[C],G=R.near*(C!==0?t.opaqueFrustumNearOffset:1),I=R.far,v=G+L*(I-G);g=gn.getPoint(n,v);break}}}if(t.view=t.defaultView,a.endFrame(),l(f)||l(g))return{object:f,position:g,exclude:!l(g)&&r||wft(f,i)}}function m_e(e,t,n,i,o,r,s,a){return l_e(i,function(){return Fft(e,t,n,o,r,s,a)})}function SL(e,t,n,i,o,r,s){let a=m_e(e,t,n,1,i,o,r,s);if(a.length>0)return a[0]}function h_e(e,t,n,i,o,r,s,a){return m_e(e,t,n,i,o,r,s,a)}function N3(e,t){return new Promise((n,i)=>{t.then(function(o){let r=e.postRender.addEventListener(function(){r(),n(o)});e.requestRender()}).catch(function(o){i(o)})})}aa.prototype.pickFromRay=function(e,t,n,i){return SL(this,e,t,n,i,!1,!1)};aa.prototype.drillPickFromRay=function(e,t,n,i,o){return h_e(this,e,t,n,i,o,!1,!1)};aa.prototype.pickFromRayMostDetailed=function(e,t,n,i){let o=this;return t=gn.clone(t),n=l(n)?n.slice():n,N3(e,M3(o,e,t,n,i,function(){return SL(o,e,t,n,i,!1,!0)}))};aa.prototype.drillPickFromRayMostDetailed=function(e,t,n,i,o){let r=this;return t=gn.clone(t),i=l(i)?i.slice():i,N3(e,M3(r,e,t,i,o,function(){return h_e(r,e,t,n,i,o,!1,!0)}))};var Aft=new m,Mft=new m,Nft=new gn,f_e=new he;function d8(e,t){let n=e.ellipsoid,i=mi._defaultMaxTerrainHeight,o=n.geodeticSurfaceNormalCartographic(t,Mft),r=he.toCartesian(t,n,Aft),s=Nft;s.origin=r,s.direction=o;let a=new gn;return gn.getPoint(s,i,a.origin),m.negate(o,a.direction),a}function p_e(e,t){let n=e.ellipsoid,i=he.fromCartesian(t,n,f_e);return d8(e,i)}function b_e(e,t){let n=e.ellipsoid;return he.fromCartesian(t,n,f_e).height}function kft(e,t,n,i,o){let r=d8(t,n);return M3(e,t,r,i,o,function(){let s=SL(e,t,r,i,o,!0,!0);if(l(s))return b_e(t,s.position)})}function Uft(e,t,n,i,o,r){let s=p_e(t,n);return M3(e,t,s,i,o,function(){let a=SL(e,t,s,i,o,!0,!0);if(l(a))return m.clone(a.position,r)})}aa.prototype.sampleHeight=function(e,t,n,i){let o=d8(e,t),r=SL(this,e,o,n,i,!0,!1);if(l(r))return b_e(e,r.position)};aa.prototype.clampToHeight=function(e,t,n,i,o){let r=p_e(e,t),s=SL(this,e,r,n,i,!0,!1);if(l(s))return m.clone(s.position,o)};aa.prototype.sampleHeightMostDetailed=function(e,t,n,i){n=l(n)?n.slice():n;let o=t.length,r=new Array(o);for(let s=0;s<o;++s)r[s]=kft(this,e,t[s],n,i);return N3(e,Promise.all(r).then(function(s){let a=s.length;for(let c=0;c<a;++c)t[c].height=s[c];return t}))};aa.prototype.clampToHeightMostDetailed=function(e,t,n,i){n=l(n)?n.slice():n;let o=t.length,r=new Array(o);for(let s=0;s<o;++s)r[s]=Uft(this,e,t[s],n,i,t[s]);return N3(e,Promise.all(r).then(function(s){let a=s.length;for(let c=0;c<a;++c)t[c]=s[c];return t}))};aa.prototype.destroy=function(){this._pickOffscreenView=this._pickOffscreenView&&this._pickOffscreenView.destroy()};var tA=aa;var mki=T(S(),1);var k5i=T(S(),1);var U9i=T(S(),1),nA=`uniform sampler2D colorTexture; in vec2 v_textureCoordinates; #ifdef AUTO_EXPOSURE uniform sampler2D autoExposure; #else uniform float exposure; #endif void main() { vec4 fragmentColor = texture(colorTexture, v_textureCoordinates); vec3 color = fragmentColor.rgb; #ifdef AUTO_EXPOSURE color /= texture(autoExposure, vec2(0.5)).r; #else color *= vec3(exposure); #endif color = czm_acesTonemapping(color); color = czm_inverseGamma(color); out_FragColor = vec4(color, fragmentColor.a); } `;var B9i=T(S(),1),iA=`precision highp float; uniform sampler2D randomTexture; uniform sampler2D depthTexture; uniform float intensity; uniform float bias; uniform float lengthCap; uniform int stepCount; uniform int directionCount; vec4 pixelToEye(vec2 screenCoordinate) { vec2 uv = screenCoordinate / czm_viewport.zw; float depth = czm_readDepth(depthTexture, uv); vec2 xy = 2.0 * uv - vec2(1.0); vec4 posEC = czm_inverseProjection * vec4(xy, depth, 1.0); posEC = posEC / posEC.w; // Avoid numerical error at far plane if (depth >= 1.0) { posEC.z = czm_currentFrustum.y; } return posEC; } // Reconstruct surface normal in eye coordinates, avoiding edges vec3 getNormalXEdge(vec3 positionEC) { // Find the 3D surface positions at adjacent screen pixels vec2 centerCoord = gl_FragCoord.xy; vec3 positionLeft = pixelToEye(centerCoord + vec2(-1.0, 0.0)).xyz; vec3 positionRight = pixelToEye(centerCoord + vec2(1.0, 0.0)).xyz; vec3 positionUp = pixelToEye(centerCoord + vec2(0.0, 1.0)).xyz; vec3 positionDown = pixelToEye(centerCoord + vec2(0.0, -1.0)).xyz; // Compute potential tangent vectors vec3 dx0 = positionEC - positionLeft; vec3 dx1 = positionRight - positionEC; vec3 dy0 = positionEC - positionDown; vec3 dy1 = positionUp - positionEC; // The shorter tangent is more likely to be on the same surface vec3 dx = length(dx0) < length(dx1) ? dx0 : dx1; vec3 dy = length(dy0) < length(dy1) ? dy0 : dy1; return normalize(cross(dx, dy)); } const float sqrtTwoPi = sqrt(czm_twoPi); float gaussian(float x, float standardDeviation) { float argument = x / standardDeviation; return exp(-0.5 * argument * argument) / (sqrtTwoPi * standardDeviation); } void main(void) { vec4 positionEC = pixelToEye(gl_FragCoord.xy); // Exit if we are too close to the back of the frustum, where the depth value is invalid. float maxValidDepth = czm_currentFrustum.y - lengthCap; if (-positionEC.z > maxValidDepth) { out_FragColor = vec4(1.0); return; } vec3 normalEC = getNormalXEdge(positionEC.xyz); float gaussianVariance = lengthCap * sqrt(-positionEC.z); // Choose a step length such that the marching stops just before 3 * variance. float stepLength = 3.0 * gaussianVariance / (float(stepCount) + 1.0); float metersPerPixel = czm_metersPerPixel(positionEC, 1.0); // Minimum step is 1 pixel to avoid double sampling float pixelsPerStep = max(stepLength / metersPerPixel, 1.0); stepLength = pixelsPerStep * metersPerPixel; float angleStepScale = 1.0 / float(directionCount); float angleStep = angleStepScale * czm_twoPi; float cosStep = cos(angleStep); float sinStep = sin(angleStep); mat2 rotateStep = mat2(cosStep, sinStep, -sinStep, cosStep); // Initial sampling direction (different for each pixel) const float randomTextureSize = 255.0; vec2 randomTexCoord = fract(gl_FragCoord.xy / randomTextureSize); float randomVal = texture(randomTexture, randomTexCoord).x; vec2 sampleDirection = vec2(cos(angleStep * randomVal), sin(angleStep * randomVal)); float ao = 0.0; // Loop over sampling directions #if __VERSION__ == 300 for (int i = 0; i < directionCount; i++) { #else for (int i = 0; i < 16; i++) { if (i >= directionCount) { break; } #endif sampleDirection = rotateStep * sampleDirection; float localAO = 0.0; vec2 radialStep = pixelsPerStep * sampleDirection; #if __VERSION__ == 300 for (int j = 0; j < stepCount; j++) { #else for (int j = 0; j < 64; j++) { if (j >= stepCount) { break; } #endif // Step along sampling direction, away from output pixel vec2 samplePixel = floor(gl_FragCoord.xy + float(j + 1) * radialStep) + vec2(0.5); // Exit if we stepped off the screen if (clamp(samplePixel, vec2(0.0), czm_viewport.zw) != samplePixel) { break; } // Compute step vector from output point to sampled point vec4 samplePositionEC = pixelToEye(samplePixel); vec3 stepVector = samplePositionEC.xyz - positionEC.xyz; // Estimate the angle from the surface normal. float dotVal = clamp(dot(normalEC, normalize(stepVector)), 0.0, 1.0); dotVal = czm_branchFreeTernary(dotVal > bias, dotVal, 0.0); dotVal = czm_branchFreeTernary(-samplePositionEC.z <= maxValidDepth, dotVal, 0.0); // Weight contribution based on the distance from the output point float sampleDistance = length(stepVector); float weight = gaussian(sampleDistance, gaussianVariance); localAO += weight * dotVal; } ao += localAO; } ao *= angleStepScale * stepLength; ao = 1.0 - clamp(ao, 0.0, 1.0); ao = pow(ao, intensity); out_FragColor = vec4(vec3(ao), 1.0); } `;var Y9i=T(S(),1),oA=`uniform sampler2D colorTexture; uniform sampler2D ambientOcclusionTexture; uniform bool ambientOcclusionOnly; in vec2 v_textureCoordinates; void main(void) { vec4 color = texture(colorTexture, v_textureCoordinates); vec4 ao = texture(ambientOcclusionTexture, v_textureCoordinates); out_FragColor = ambientOcclusionOnly ? ao : ao * color; } `;var z9i=T(S(),1),rA=`uniform sampler2D colorTexture; uniform float gradations; in vec2 v_textureCoordinates; void main(void) { vec3 rgb = texture(colorTexture, v_textureCoordinates).rgb; #ifdef CZM_SELECTED_FEATURE if (czm_selected()) { out_FragColor = vec4(rgb, 1.0); return; } #endif float luminance = czm_luminance(rgb); float darkness = luminance * gradations; darkness = (darkness - fract(darkness)) / gradations; out_FragColor = vec4(vec3(darkness), 1.0); } `;var J9i=T(S(),1),sA=`uniform sampler2D colorTexture; uniform sampler2D bloomTexture; uniform bool glowOnly; in vec2 v_textureCoordinates; void main(void) { vec4 color = texture(colorTexture, v_textureCoordinates); #ifdef CZM_SELECTED_FEATURE if (czm_selected()) { out_FragColor = color; return; } #endif vec4 bloom = texture(bloomTexture, v_textureCoordinates); out_FragColor = glowOnly ? bloom : bloom + color; } `;var j9i=T(S(),1),aA=`uniform sampler2D colorTexture; uniform float brightness; in vec2 v_textureCoordinates; void main(void) { vec3 rgb = texture(colorTexture, v_textureCoordinates).rgb; vec3 target = vec3(0.0); out_FragColor = vec4(mix(target, rgb, brightness), 1.0); } `;var $9i=T(S(),1),cA=`uniform sampler2D colorTexture; uniform float contrast; uniform float brightness; in vec2 v_textureCoordinates; void main(void) { vec3 sceneColor = texture(colorTexture, v_textureCoordinates).xyz; sceneColor = czm_RGBToHSB(sceneColor); sceneColor.z += brightness; sceneColor = czm_HSBToRGB(sceneColor); float factor = (259.0 * (contrast + 255.0)) / (255.0 * (259.0 - contrast)); sceneColor = factor * (sceneColor - vec3(0.5)) + vec3(0.5); out_FragColor = vec4(sceneColor, 1.0); } `;var tNi=T(S(),1),lA=`uniform sampler2D colorTexture; uniform sampler2D blurTexture; uniform sampler2D depthTexture; uniform float focalDistance; in vec2 v_textureCoordinates; vec4 toEye(vec2 uv, float depth) { vec2 xy = vec2((uv.x * 2.0 - 1.0), ((1.0 - uv.y) * 2.0 - 1.0)); vec4 posInCamera = czm_inverseProjection * vec4(xy, depth, 1.0); posInCamera = posInCamera / posInCamera.w; return posInCamera; } float computeDepthBlur(float depth) { float f; if (depth < focalDistance) { f = (focalDistance - depth) / (focalDistance - czm_currentFrustum.x); } else { f = (depth - focalDistance) / (czm_currentFrustum.y - focalDistance); f = pow(f, 0.1); } f *= f; f = clamp(f, 0.0, 1.0); return pow(f, 0.5); } void main(void) { float depth = czm_readDepth(depthTexture, v_textureCoordinates); vec4 posInCamera = toEye(v_textureCoordinates, depth); float d = computeDepthBlur(-posInCamera.z); out_FragColor = mix(texture(colorTexture, v_textureCoordinates), texture(blurTexture, v_textureCoordinates), d); } `;var iNi=T(S(),1),dA=`uniform sampler2D depthTexture; in vec2 v_textureCoordinates; void main(void) { float depth = czm_readDepth(depthTexture, v_textureCoordinates); out_FragColor = vec4(vec3(depth), 1.0); } `;var rNi=T(S(),1),uA=`uniform sampler2D depthTexture; uniform float length; uniform vec4 color; in vec2 v_textureCoordinates; void main(void) { float directions[3]; directions[0] = -1.0; directions[1] = 0.0; directions[2] = 1.0; float scalars[3]; scalars[0] = 3.0; scalars[1] = 10.0; scalars[2] = 3.0; float padx = czm_pixelRatio / czm_viewport.z; float pady = czm_pixelRatio / czm_viewport.w; #ifdef CZM_SELECTED_FEATURE bool selected = false; for (int i = 0; i < 3; ++i) { float dir = directions[i]; selected = selected || czm_selected(vec2(-padx, dir * pady)); selected = selected || czm_selected(vec2(padx, dir * pady)); selected = selected || czm_selected(vec2(dir * padx, -pady)); selected = selected || czm_selected(vec2(dir * padx, pady)); if (selected) { break; } } if (!selected) { out_FragColor = vec4(color.rgb, 0.0); return; } #endif float horizEdge = 0.0; float vertEdge = 0.0; for (int i = 0; i < 3; ++i) { float dir = directions[i]; float scale = scalars[i]; horizEdge -= texture(depthTexture, v_textureCoordinates + vec2(-padx, dir * pady)).x * scale; horizEdge += texture(depthTexture, v_textureCoordinates + vec2(padx, dir * pady)).x * scale; vertEdge -= texture(depthTexture, v_textureCoordinates + vec2(dir * padx, -pady)).x * scale; vertEdge += texture(depthTexture, v_textureCoordinates + vec2(dir * padx, pady)).x * scale; } float len = sqrt(horizEdge * horizEdge + vertEdge * vertEdge); out_FragColor = vec4(color.rgb, len > length ? color.a : 0.0); } `;var aNi=T(S(),1),mA=`uniform sampler2D colorTexture; in vec2 v_textureCoordinates; #ifdef AUTO_EXPOSURE uniform sampler2D autoExposure; #else uniform float exposure; #endif // See slides 142 and 143: // http://www.gdcvault.com/play/1012459/Uncharted_2__HDR_Lighting void main() { vec4 fragmentColor = texture(colorTexture, v_textureCoordinates); vec3 color = fragmentColor.rgb; #ifdef AUTO_EXPOSURE float exposure = texture(autoExposure, vec2(0.5)).r; color /= exposure; #else color *= vec3(exposure); #endif const float A = 0.22; // shoulder strength const float B = 0.30; // linear strength const float C = 0.10; // linear angle const float D = 0.20; // toe strength const float E = 0.01; // toe numerator const float F = 0.30; // toe denominator const float white = 11.2; // linear white point value vec3 c = ((color * (A * color + C * B) + D * E) / (color * ( A * color + B) + D * F)) - E / F; float w = ((white * (A * white + C * B) + D * E) / (white * ( A * white + B) + D * F)) - E / F; c = czm_inverseGamma(c / w); out_FragColor = vec4(c, fragmentColor.a); } `;var lNi=T(S(),1),hA=`uniform sampler2D colorTexture; in vec2 v_textureCoordinates; #ifdef AUTO_EXPOSURE uniform sampler2D autoExposure; #else uniform float exposure; #endif void main() { vec4 fragmentColor = texture(colorTexture, v_textureCoordinates); vec3 color = fragmentColor.rgb; #ifdef AUTO_EXPOSURE color /= texture(autoExposure, vec2(0.5)).r; #else color *= vec3(exposure); #endif color = czm_pbrNeutralTonemapping(color); color = czm_inverseGamma(color); out_FragColor = vec4(color, fragmentColor.a); } `;var uNi=T(S(),1),fA=`in vec2 v_textureCoordinates; uniform sampler2D colorTexture; const float fxaaQualitySubpix = 0.5; const float fxaaQualityEdgeThreshold = 0.125; const float fxaaQualityEdgeThresholdMin = 0.0833; void main() { vec2 fxaaQualityRcpFrame = vec2(1.0) / czm_viewport.zw; vec4 color = FxaaPixelShader( v_textureCoordinates, colorTexture, fxaaQualityRcpFrame, fxaaQualitySubpix, fxaaQualityEdgeThreshold, fxaaQualityEdgeThresholdMin); float alpha = texture(colorTexture, v_textureCoordinates).a; out_FragColor = vec4(color.rgb, alpha); } `;var hNi=T(S(),1),Uy=`#define SAMPLES 8 uniform float delta; uniform float sigma; uniform float direction; // 0.0 for x direction, 1.0 for y direction uniform sampler2D colorTexture; #ifdef USE_STEP_SIZE uniform float stepSize; #else uniform vec2 step; #endif in vec2 v_textureCoordinates; // Incremental Computation of the Gaussian: // https://developer.nvidia.com/gpugems/GPUGems3/gpugems3_ch40.html void main() { vec2 st = v_textureCoordinates; vec2 dir = vec2(1.0 - direction, direction); #ifdef USE_STEP_SIZE vec2 step = vec2(stepSize * (czm_pixelRatio / czm_viewport.zw)); #else vec2 step = step; #endif vec3 g; g.x = 1.0 / (sqrt(czm_twoPi) * sigma); g.y = exp((-0.5 * delta * delta) / (sigma * sigma)); g.z = g.y * g.y; vec4 result = texture(colorTexture, st) * g.x; for (int i = 1; i < SAMPLES; ++i) { g.xy *= g.yz; vec2 offset = float(i) * dir * step; result += texture(colorTexture, st - offset) * g.x; result += texture(colorTexture, st + offset) * g.x; } out_FragColor = result; } `;var pNi=T(S(),1),pA=`uniform sampler2D colorTexture; uniform sampler2D dirtTexture; uniform sampler2D starTexture; uniform vec2 dirtTextureDimensions; uniform float distortion; uniform float ghostDispersal; uniform float haloWidth; uniform float dirtAmount; uniform float earthRadius; uniform float intensity; in vec2 v_textureCoordinates; // whether it is in space or not // 6500000.0 is empirical value #define DISTANCE_TO_SPACE 6500000.0 // return ndc from world coordinate biased earthRadius vec4 getNDCFromWC(vec3 WC, float earthRadius) { vec4 positionEC = czm_view * vec4(WC, 1.0); positionEC = vec4(positionEC.x + earthRadius, positionEC.y, positionEC.z, 1.0); vec4 positionWC = czm_eyeToWindowCoordinates(positionEC); return czm_viewportOrthographic * vec4(positionWC.xy, -positionWC.z, 1.0); } // Check if current pixel is included Earth // if then mask it gradually float isInEarth(vec2 texcoord, vec2 sceneSize) { vec2 NDC = texcoord * 2.0 - 1.0; vec4 earthPosSC = getNDCFromWC(vec3(0.0), 0.0); vec4 earthPosSCEdge = getNDCFromWC(vec3(0.0), earthRadius * 1.5); NDC.xy -= earthPosSC.xy; float X = abs(NDC.x) * sceneSize.x; float Y = abs(NDC.y) * sceneSize.y; return clamp(0.0, 1.0, max(sqrt(X * X + Y * Y) / max(abs(earthPosSCEdge.x * sceneSize.x), 1.0) - 0.8 , 0.0)); } // For Chromatic effect vec4 textureDistorted(sampler2D tex, vec2 texcoord, vec2 direction, vec3 distortion, bool isSpace) { vec2 sceneSize = czm_viewport.zw; vec3 color; if(isSpace) { color.r = isInEarth(texcoord + direction * distortion.r, sceneSize) * texture(tex, texcoord + direction * distortion.r).r; color.g = isInEarth(texcoord + direction * distortion.g, sceneSize) * texture(tex, texcoord + direction * distortion.g).g; color.b = isInEarth(texcoord + direction * distortion.b, sceneSize) * texture(tex, texcoord + direction * distortion.b).b; } else { color.r = texture(tex, texcoord + direction * distortion.r).r; color.g = texture(tex, texcoord + direction * distortion.g).g; color.b = texture(tex, texcoord + direction * distortion.b).b; } return vec4(clamp(color, 0.0, 1.0), 0.0); } void main(void) { vec4 originalColor = texture(colorTexture, v_textureCoordinates); vec3 rgb = originalColor.rgb; bool isSpace = length(czm_viewerPositionWC.xyz) > DISTANCE_TO_SPACE; // Sun position vec4 sunPos = czm_morphTime == 1.0 ? vec4(czm_sunPositionWC, 1.0) : vec4(czm_sunPositionColumbusView.zxy, 1.0); vec4 sunPositionEC = czm_view * sunPos; vec4 sunPositionWC = czm_eyeToWindowCoordinates(sunPositionEC); sunPos = czm_viewportOrthographic * vec4(sunPositionWC.xy, -sunPositionWC.z, 1.0); // If sun is not in the screen space, use original color. if(!isSpace || !((sunPos.x >= -1.1 && sunPos.x <= 1.1) && (sunPos.y >= -1.1 && sunPos.y <= 1.1))) { // Lens flare is disabled when not in space until #5932 is fixed. // https://github.com/CesiumGS/cesium/issues/5932 out_FragColor = originalColor; return; } vec2 texcoord = vec2(1.0) - v_textureCoordinates; vec2 pixelSize = czm_pixelRatio / czm_viewport.zw; vec2 invPixelSize = 1.0 / pixelSize; vec3 distortionVec = pixelSize.x * vec3(-distortion, 0.0, distortion); // ghost vector to image centre: vec2 ghostVec = (vec2(0.5) - texcoord) * ghostDispersal; vec3 direction = normalize(vec3(ghostVec, 0.0)); // sample ghosts: vec4 result = vec4(0.0); vec4 ghost = vec4(0.0); for (int i = 0; i < 4; ++i) { vec2 offset = fract(texcoord + ghostVec * float(i)); // Only bright spots from the centre of the source image ghost += textureDistorted(colorTexture, offset, direction.xy, distortionVec, isSpace); } result += ghost; // sample halo vec2 haloVec = normalize(ghostVec) * haloWidth; float weightForHalo = length(vec2(0.5) - fract(texcoord + haloVec)) / length(vec2(0.5)); weightForHalo = pow(1.0 - weightForHalo, 5.0); result += textureDistorted(colorTexture, texcoord + haloVec, direction.xy, distortionVec, isSpace) * weightForHalo * 1.5; // dirt on lens vec2 dirtTexCoords = (v_textureCoordinates * invPixelSize) / dirtTextureDimensions; if (dirtTexCoords.x > 1.0) { dirtTexCoords.x = mod(floor(dirtTexCoords.x), 2.0) == 1.0 ? 1.0 - fract(dirtTexCoords.x) : fract(dirtTexCoords.x); } if (dirtTexCoords.y > 1.0) { dirtTexCoords.y = mod(floor(dirtTexCoords.y), 2.0) == 1.0 ? 1.0 - fract(dirtTexCoords.y) : fract(dirtTexCoords.y); } result += dirtAmount * texture(dirtTexture, dirtTexCoords); // Rotating starburst texture's coordinate // dot(czm_view[0].xyz, vec3(0.0, 0.0, 1.0)) + dot(czm_view[1].xyz, vec3(0.0, 1.0, 0.0)) float camrot = czm_view[0].z + czm_view[1].y; float cosValue = cos(camrot); float sinValue = sin(camrot); mat3 rotation = mat3( cosValue, -sinValue, 0.0, sinValue, cosValue, 0.0, 0.0, 0.0, 1.0 ); vec3 st1 = vec3(v_textureCoordinates * 2.0 - vec2(1.0), 1.0); vec3 st2 = vec3((rotation * st1).xy, 1.0); vec3 st3 = st2 * 0.5 + vec3(0.5); vec2 lensStarTexcoord = st3.xy; float weightForLensFlare = length(vec3(sunPos.xy, 0.0)); float oneMinusWeightForLensFlare = max(1.0 - weightForLensFlare, 0.0); if (!isSpace) { result *= oneMinusWeightForLensFlare * intensity * 0.2; } else { result *= oneMinusWeightForLensFlare * intensity; result *= texture(starTexture, lensStarTexcoord) * pow(weightForLensFlare, 1.0) * max((1.0 - length(vec3(st1.xy, 0.0))), 0.0) * 2.0; } result += texture(colorTexture, v_textureCoordinates); out_FragColor = result; } `;var gNi=T(S(),1),bA=`uniform sampler2D colorTexture; uniform vec3 white; in vec2 v_textureCoordinates; #ifdef AUTO_EXPOSURE uniform sampler2D autoExposure; #else uniform float exposure; #endif // See equation 4: // http://www.cs.utah.edu/~reinhard/cdrom/tonemap.pdf void main() { vec4 fragmentColor = texture(colorTexture, v_textureCoordinates); vec3 color = fragmentColor.rgb; #ifdef AUTO_EXPOSURE float exposure = texture(autoExposure, vec2(0.5)).r; color /= exposure; #else color *= vec3(exposure); #endif color = (color * (1.0 + color / white)) / (1.0 + color); color = czm_inverseGamma(color); out_FragColor = vec4(color, fragmentColor.a); } `;var xNi=T(S(),1),gA=`uniform sampler2D colorTexture; in vec2 v_textureCoordinates; float rand(vec2 co) { return fract(sin(dot(co.xy ,vec2(12.9898, 78.233))) * 43758.5453); } void main(void) { float noiseValue = rand(v_textureCoordinates + sin(czm_frameNumber)) * 0.1; vec3 rgb = texture(colorTexture, v_textureCoordinates).rgb; vec3 green = vec3(0.0, 1.0, 0.0); out_FragColor = vec4((noiseValue + rgb) * green, 1.0); } `;var TNi=T(S(),1),yA=`uniform sampler2D colorTexture; in vec2 v_textureCoordinates; #ifdef AUTO_EXPOSURE uniform sampler2D autoExposure; #else uniform float exposure; #endif // See equation 3: // http://www.cs.utah.edu/~reinhard/cdrom/tonemap.pdf void main() { vec4 fragmentColor = texture(colorTexture, v_textureCoordinates); vec3 color = fragmentColor.rgb; #ifdef AUTO_EXPOSURE float exposure = texture(autoExposure, vec2(0.5)).r; color /= exposure; #else color *= vec3(exposure); #endif color = color / (1.0 + color); color = czm_inverseGamma(color); out_FragColor = vec4(color, fragmentColor.a); } `;var CNi=T(S(),1),xA=`uniform sampler2D colorTexture; uniform sampler2D silhouetteTexture; in vec2 v_textureCoordinates; void main(void) { vec4 silhouetteColor = texture(silhouetteTexture, v_textureCoordinates); vec4 color = texture(colorTexture, v_textureCoordinates); out_FragColor = mix(color, silhouetteColor, silhouetteColor.a); } `;var LNi=T(S(),1);/** * @license * Copyright (c) 2014-2015, NVIDIA CORPORATION. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of NVIDIA CORPORATION nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */var _A=`/** * @license * Copyright (c) 2014-2015, NVIDIA CORPORATION. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of NVIDIA CORPORATION nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS \`\`AS IS'' AND ANY * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ // NVIDIA GameWorks Graphics Samples GitHub link: https://github.com/NVIDIAGameWorks/GraphicsSamples // Original FXAA 3.11 shader link: https://github.com/NVIDIAGameWorks/GraphicsSamples/blob/master/samples/es3-kepler/FXAA/FXAA3_11.h // Steps used to integrate into Cesium: // * The following defines are set: // #define FXAA_PC 1 // #define FXAA_WEBGL_1 1 // #define FXAA_GREEN_AS_LUMA 1 // #define FXAA_EARLY_EXIT 1 // #define FXAA_GLSL_120 1 // * All other preprocessor directives besides the FXAA_QUALITY__P* directives were removed. // * Double underscores are invalid for preprocessor directives so replace them with a single underscore. Replace // /FXAA_QUALITY__P(.*)/g with /FXAA_QUALITY__P$1/. // * There are no implicit conversions from ivec* to vec* so replace: // #define FxaaInt2 ivec2 // with // #define FxaaInt2 vec2 // * The texture2DLod function is only available in vertex shaders so replace: // #define FxaaTexTop(t, p) texture2DLod(t, p, 0.0) // #define FxaaTexOff(t, p, o, r) texture2DLod(t, p + (o * r), 0.0) // with // #define FxaaTexTop(t, p) texture(t, p) // #define FxaaTexOff(t, p, o, r) texture(t, p + (o * r)) // * FXAA_QUALITY_PRESET is prepended in the javascript code. We may want to expose that setting in the future. // * The following parameters to FxaaPixelShader are unused and can be removed: // fxaaConsolePosPos // fxaaConsoleRcpFrameOpt // fxaaConsoleRcpFrameOpt2 // fxaaConsole360RcpFrameOpt2 // fxaaConsoleEdgeSharpness // fxaaConsoleEdgeThreshold // fxaaConsoleEdgeThresholdMi // fxaaConsole360ConstDir // // Choose the quality preset. // This needs to be compiled into the shader as it effects code. // Best option to include multiple presets is to // in each shader define the preset, then include this file. // // OPTIONS // ----------------------------------------------------------------------- // 10 to 15 - default medium dither (10=fastest, 15=highest quality) // 20 to 29 - less dither, more expensive (20=fastest, 29=highest quality) // 39 - no dither, very expensive // // NOTES // ----------------------------------------------------------------------- // 12 = slightly faster then FXAA 3.9 and higher edge quality (default) // 13 = about same speed as FXAA 3.9 and better than 12 // 23 = closest to FXAA 3.9 visually and performance wise // _ = the lowest digit is directly related to performance // _ = the highest digit is directly related to style // //#define FXAA_QUALITY_PRESET 12 #if (FXAA_QUALITY_PRESET == 10) #define FXAA_QUALITY_PS 3 #define FXAA_QUALITY_P0 1.5 #define FXAA_QUALITY_P1 3.0 #define FXAA_QUALITY_P2 12.0 #endif #if (FXAA_QUALITY_PRESET == 11) #define FXAA_QUALITY_PS 4 #define FXAA_QUALITY_P0 1.0 #define FXAA_QUALITY_P1 1.5 #define FXAA_QUALITY_P2 3.0 #define FXAA_QUALITY_P3 12.0 #endif #if (FXAA_QUALITY_PRESET == 12) #define FXAA_QUALITY_PS 5 #define FXAA_QUALITY_P0 1.0 #define FXAA_QUALITY_P1 1.5 #define FXAA_QUALITY_P2 2.0 #define FXAA_QUALITY_P3 4.0 #define FXAA_QUALITY_P4 12.0 #endif #if (FXAA_QUALITY_PRESET == 13) #define FXAA_QUALITY_PS 6 #define FXAA_QUALITY_P0 1.0 #define FXAA_QUALITY_P1 1.5 #define FXAA_QUALITY_P2 2.0 #define FXAA_QUALITY_P3 2.0 #define FXAA_QUALITY_P4 4.0 #define FXAA_QUALITY_P5 12.0 #endif #if (FXAA_QUALITY_PRESET == 14) #define FXAA_QUALITY_PS 7 #define FXAA_QUALITY_P0 1.0 #define FXAA_QUALITY_P1 1.5 #define FXAA_QUALITY_P2 2.0 #define FXAA_QUALITY_P3 2.0 #define FXAA_QUALITY_P4 2.0 #define FXAA_QUALITY_P5 4.0 #define FXAA_QUALITY_P6 12.0 #endif #if (FXAA_QUALITY_PRESET == 15) #define FXAA_QUALITY_PS 8 #define FXAA_QUALITY_P0 1.0 #define FXAA_QUALITY_P1 1.5 #define FXAA_QUALITY_P2 2.0 #define FXAA_QUALITY_P3 2.0 #define FXAA_QUALITY_P4 2.0 #define FXAA_QUALITY_P5 2.0 #define FXAA_QUALITY_P6 4.0 #define FXAA_QUALITY_P7 12.0 #endif #if (FXAA_QUALITY_PRESET == 20) #define FXAA_QUALITY_PS 3 #define FXAA_QUALITY_P0 1.5 #define FXAA_QUALITY_P1 2.0 #define FXAA_QUALITY_P2 8.0 #endif #if (FXAA_QUALITY_PRESET == 21) #define FXAA_QUALITY_PS 4 #define FXAA_QUALITY_P0 1.0 #define FXAA_QUALITY_P1 1.5 #define FXAA_QUALITY_P2 2.0 #define FXAA_QUALITY_P3 8.0 #endif #if (FXAA_QUALITY_PRESET == 22) #define FXAA_QUALITY_PS 5 #define FXAA_QUALITY_P0 1.0 #define FXAA_QUALITY_P1 1.5 #define FXAA_QUALITY_P2 2.0 #define FXAA_QUALITY_P3 2.0 #define FXAA_QUALITY_P4 8.0 #endif #if (FXAA_QUALITY_PRESET == 23) #define FXAA_QUALITY_PS 6 #define FXAA_QUALITY_P0 1.0 #define FXAA_QUALITY_P1 1.5 #define FXAA_QUALITY_P2 2.0 #define FXAA_QUALITY_P3 2.0 #define FXAA_QUALITY_P4 2.0 #define FXAA_QUALITY_P5 8.0 #endif #if (FXAA_QUALITY_PRESET == 24) #define FXAA_QUALITY_PS 7 #define FXAA_QUALITY_P0 1.0 #define FXAA_QUALITY_P1 1.5 #define FXAA_QUALITY_P2 2.0 #define FXAA_QUALITY_P3 2.0 #define FXAA_QUALITY_P4 2.0 #define FXAA_QUALITY_P5 3.0 #define FXAA_QUALITY_P6 8.0 #endif #if (FXAA_QUALITY_PRESET == 25) #define FXAA_QUALITY_PS 8 #define FXAA_QUALITY_P0 1.0 #define FXAA_QUALITY_P1 1.5 #define FXAA_QUALITY_P2 2.0 #define FXAA_QUALITY_P3 2.0 #define FXAA_QUALITY_P4 2.0 #define FXAA_QUALITY_P5 2.0 #define FXAA_QUALITY_P6 4.0 #define FXAA_QUALITY_P7 8.0 #endif #if (FXAA_QUALITY_PRESET == 26) #define FXAA_QUALITY_PS 9 #define FXAA_QUALITY_P0 1.0 #define FXAA_QUALITY_P1 1.5 #define FXAA_QUALITY_P2 2.0 #define FXAA_QUALITY_P3 2.0 #define FXAA_QUALITY_P4 2.0 #define FXAA_QUALITY_P5 2.0 #define FXAA_QUALITY_P6 2.0 #define FXAA_QUALITY_P7 4.0 #define FXAA_QUALITY_P8 8.0 #endif #if (FXAA_QUALITY_PRESET == 27) #define FXAA_QUALITY_PS 10 #define FXAA_QUALITY_P0 1.0 #define FXAA_QUALITY_P1 1.5 #define FXAA_QUALITY_P2 2.0 #define FXAA_QUALITY_P3 2.0 #define FXAA_QUALITY_P4 2.0 #define FXAA_QUALITY_P5 2.0 #define FXAA_QUALITY_P6 2.0 #define FXAA_QUALITY_P7 2.0 #define FXAA_QUALITY_P8 4.0 #define FXAA_QUALITY_P9 8.0 #endif #if (FXAA_QUALITY_PRESET == 28) #define FXAA_QUALITY_PS 11 #define FXAA_QUALITY_P0 1.0 #define FXAA_QUALITY_P1 1.5 #define FXAA_QUALITY_P2 2.0 #define FXAA_QUALITY_P3 2.0 #define FXAA_QUALITY_P4 2.0 #define FXAA_QUALITY_P5 2.0 #define FXAA_QUALITY_P6 2.0 #define FXAA_QUALITY_P7 2.0 #define FXAA_QUALITY_P8 2.0 #define FXAA_QUALITY_P9 4.0 #define FXAA_QUALITY_P10 8.0 #endif #if (FXAA_QUALITY_PRESET == 29) #define FXAA_QUALITY_PS 12 #define FXAA_QUALITY_P0 1.0 #define FXAA_QUALITY_P1 1.5 #define FXAA_QUALITY_P2 2.0 #define FXAA_QUALITY_P3 2.0 #define FXAA_QUALITY_P4 2.0 #define FXAA_QUALITY_P5 2.0 #define FXAA_QUALITY_P6 2.0 #define FXAA_QUALITY_P7 2.0 #define FXAA_QUALITY_P8 2.0 #define FXAA_QUALITY_P9 2.0 #define FXAA_QUALITY_P10 4.0 #define FXAA_QUALITY_P11 8.0 #endif #if (FXAA_QUALITY_PRESET == 39) #define FXAA_QUALITY_PS 12 #define FXAA_QUALITY_P0 1.0 #define FXAA_QUALITY_P1 1.0 #define FXAA_QUALITY_P2 1.0 #define FXAA_QUALITY_P3 1.0 #define FXAA_QUALITY_P4 1.0 #define FXAA_QUALITY_P5 1.5 #define FXAA_QUALITY_P6 2.0 #define FXAA_QUALITY_P7 2.0 #define FXAA_QUALITY_P8 2.0 #define FXAA_QUALITY_P9 2.0 #define FXAA_QUALITY_P10 4.0 #define FXAA_QUALITY_P11 8.0 #endif #define FxaaBool bool #define FxaaFloat float #define FxaaFloat2 vec2 #define FxaaFloat3 vec3 #define FxaaFloat4 vec4 #define FxaaHalf float #define FxaaHalf2 vec2 #define FxaaHalf3 vec3 #define FxaaHalf4 vec4 #define FxaaInt2 vec2 #define FxaaTex sampler2D #define FxaaSat(x) clamp(x, 0.0, 1.0) #define FxaaTexTop(t, p) texture(t, p) #define FxaaTexOff(t, p, o, r) texture(t, p + (o * r)) FxaaFloat FxaaLuma(FxaaFloat4 rgba) { return rgba.y; } FxaaFloat4 FxaaPixelShader( // // Use noperspective interpolation here (turn off perspective interpolation). // {xy} = center of pixel FxaaFloat2 pos, // // Input color texture. // {rgb_} = color in linear or perceptual color space // if (FXAA_GREEN_AS_LUMA == 0) // {___a} = luma in perceptual color space (not linear) FxaaTex tex, // // Only used on FXAA Quality. // This must be from a constant/uniform. // {x_} = 1.0/screenWidthInPixels // {_y} = 1.0/screenHeightInPixels FxaaFloat2 fxaaQualityRcpFrame, // // Only used on FXAA Quality. // This used to be the FXAA_QUALITY_SUBPIX define. // It is here now to allow easier tuning. // Choose the amount of sub-pixel aliasing removal. // This can effect sharpness. // 1.00 - upper limit (softer) // 0.75 - default amount of filtering // 0.50 - lower limit (sharper, less sub-pixel aliasing removal) // 0.25 - almost off // 0.00 - completely off FxaaFloat fxaaQualitySubpix, // // Only used on FXAA Quality. // This used to be the FXAA_QUALITY_EDGE_THRESHOLD define. // It is here now to allow easier tuning. // The minimum amount of local contrast required to apply algorithm. // 0.333 - too little (faster) // 0.250 - low quality // 0.166 - default // 0.125 - high quality // 0.063 - overkill (slower) FxaaFloat fxaaQualityEdgeThreshold, // // Only used on FXAA Quality. // This used to be the FXAA_QUALITY_EDGE_THRESHOLD_MIN define. // It is here now to allow easier tuning. // Trims the algorithm from processing darks. // 0.0833 - upper limit (default, the start of visible unfiltered edges) // 0.0625 - high quality (faster) // 0.0312 - visible limit (slower) // Special notes when using FXAA_GREEN_AS_LUMA, // Likely want to set this to zero. // As colors that are mostly not-green // will appear very dark in the green channel! // Tune by looking at mostly non-green content, // then start at zero and increase until aliasing is a problem. FxaaFloat fxaaQualityEdgeThresholdMin ) { /*--------------------------------------------------------------------------*/ FxaaFloat2 posM; posM.x = pos.x; posM.y = pos.y; FxaaFloat4 rgbyM = FxaaTexTop(tex, posM); #define lumaM rgbyM.y FxaaFloat lumaS = FxaaLuma(FxaaTexOff(tex, posM, FxaaInt2( 0, 1), fxaaQualityRcpFrame.xy)); FxaaFloat lumaE = FxaaLuma(FxaaTexOff(tex, posM, FxaaInt2( 1, 0), fxaaQualityRcpFrame.xy)); FxaaFloat lumaN = FxaaLuma(FxaaTexOff(tex, posM, FxaaInt2( 0,-1), fxaaQualityRcpFrame.xy)); FxaaFloat lumaW = FxaaLuma(FxaaTexOff(tex, posM, FxaaInt2(-1, 0), fxaaQualityRcpFrame.xy)); /*--------------------------------------------------------------------------*/ FxaaFloat maxSM = max(lumaS, lumaM); FxaaFloat minSM = min(lumaS, lumaM); FxaaFloat maxESM = max(lumaE, maxSM); FxaaFloat minESM = min(lumaE, minSM); FxaaFloat maxWN = max(lumaN, lumaW); FxaaFloat minWN = min(lumaN, lumaW); FxaaFloat rangeMax = max(maxWN, maxESM); FxaaFloat rangeMin = min(minWN, minESM); FxaaFloat rangeMaxScaled = rangeMax * fxaaQualityEdgeThreshold; FxaaFloat range = rangeMax - rangeMin; FxaaFloat rangeMaxClamped = max(fxaaQualityEdgeThresholdMin, rangeMaxScaled); FxaaBool earlyExit = range < rangeMaxClamped; /*--------------------------------------------------------------------------*/ if(earlyExit) return rgbyM; /*--------------------------------------------------------------------------*/ FxaaFloat lumaNW = FxaaLuma(FxaaTexOff(tex, posM, FxaaInt2(-1,-1), fxaaQualityRcpFrame.xy)); FxaaFloat lumaSE = FxaaLuma(FxaaTexOff(tex, posM, FxaaInt2( 1, 1), fxaaQualityRcpFrame.xy)); FxaaFloat lumaNE = FxaaLuma(FxaaTexOff(tex, posM, FxaaInt2( 1,-1), fxaaQualityRcpFrame.xy)); FxaaFloat lumaSW = FxaaLuma(FxaaTexOff(tex, posM, FxaaInt2(-1, 1), fxaaQualityRcpFrame.xy)); /*--------------------------------------------------------------------------*/ FxaaFloat lumaNS = lumaN + lumaS; FxaaFloat lumaWE = lumaW + lumaE; FxaaFloat subpixRcpRange = 1.0/range; FxaaFloat subpixNSWE = lumaNS + lumaWE; FxaaFloat edgeHorz1 = (-2.0 * lumaM) + lumaNS; FxaaFloat edgeVert1 = (-2.0 * lumaM) + lumaWE; /*--------------------------------------------------------------------------*/ FxaaFloat lumaNESE = lumaNE + lumaSE; FxaaFloat lumaNWNE = lumaNW + lumaNE; FxaaFloat edgeHorz2 = (-2.0 * lumaE) + lumaNESE; FxaaFloat edgeVert2 = (-2.0 * lumaN) + lumaNWNE; /*--------------------------------------------------------------------------*/ FxaaFloat lumaNWSW = lumaNW + lumaSW; FxaaFloat lumaSWSE = lumaSW + lumaSE; FxaaFloat edgeHorz4 = (abs(edgeHorz1) * 2.0) + abs(edgeHorz2); FxaaFloat edgeVert4 = (abs(edgeVert1) * 2.0) + abs(edgeVert2); FxaaFloat edgeHorz3 = (-2.0 * lumaW) + lumaNWSW; FxaaFloat edgeVert3 = (-2.0 * lumaS) + lumaSWSE; FxaaFloat edgeHorz = abs(edgeHorz3) + edgeHorz4; FxaaFloat edgeVert = abs(edgeVert3) + edgeVert4; /*--------------------------------------------------------------------------*/ FxaaFloat subpixNWSWNESE = lumaNWSW + lumaNESE; FxaaFloat lengthSign = fxaaQualityRcpFrame.x; FxaaBool horzSpan = edgeHorz >= edgeVert; FxaaFloat subpixA = subpixNSWE * 2.0 + subpixNWSWNESE; /*--------------------------------------------------------------------------*/ if(!horzSpan) lumaN = lumaW; if(!horzSpan) lumaS = lumaE; if(horzSpan) lengthSign = fxaaQualityRcpFrame.y; FxaaFloat subpixB = (subpixA * (1.0/12.0)) - lumaM; /*--------------------------------------------------------------------------*/ FxaaFloat gradientN = lumaN - lumaM; FxaaFloat gradientS = lumaS - lumaM; FxaaFloat lumaNN = lumaN + lumaM; FxaaFloat lumaSS = lumaS + lumaM; FxaaBool pairN = abs(gradientN) >= abs(gradientS); FxaaFloat gradient = max(abs(gradientN), abs(gradientS)); if(pairN) lengthSign = -lengthSign; FxaaFloat subpixC = FxaaSat(abs(subpixB) * subpixRcpRange); /*--------------------------------------------------------------------------*/ FxaaFloat2 posB; posB.x = posM.x; posB.y = posM.y; FxaaFloat2 offNP; offNP.x = (!horzSpan) ? 0.0 : fxaaQualityRcpFrame.x; offNP.y = ( horzSpan) ? 0.0 : fxaaQualityRcpFrame.y; if(!horzSpan) posB.x += lengthSign * 0.5; if( horzSpan) posB.y += lengthSign * 0.5; /*--------------------------------------------------------------------------*/ FxaaFloat2 posN; posN.x = posB.x - offNP.x * FXAA_QUALITY_P0; posN.y = posB.y - offNP.y * FXAA_QUALITY_P0; FxaaFloat2 posP; posP.x = posB.x + offNP.x * FXAA_QUALITY_P0; posP.y = posB.y + offNP.y * FXAA_QUALITY_P0; FxaaFloat subpixD = ((-2.0)*subpixC) + 3.0; FxaaFloat lumaEndN = FxaaLuma(FxaaTexTop(tex, posN)); FxaaFloat subpixE = subpixC * subpixC; FxaaFloat lumaEndP = FxaaLuma(FxaaTexTop(tex, posP)); /*--------------------------------------------------------------------------*/ if(!pairN) lumaNN = lumaSS; FxaaFloat gradientScaled = gradient * 1.0/4.0; FxaaFloat lumaMM = lumaM - lumaNN * 0.5; FxaaFloat subpixF = subpixD * subpixE; FxaaBool lumaMLTZero = lumaMM < 0.0; /*--------------------------------------------------------------------------*/ lumaEndN -= lumaNN * 0.5; lumaEndP -= lumaNN * 0.5; FxaaBool doneN = abs(lumaEndN) >= gradientScaled; FxaaBool doneP = abs(lumaEndP) >= gradientScaled; if(!doneN) posN.x -= offNP.x * FXAA_QUALITY_P1; if(!doneN) posN.y -= offNP.y * FXAA_QUALITY_P1; FxaaBool doneNP = (!doneN) || (!doneP); if(!doneP) posP.x += offNP.x * FXAA_QUALITY_P1; if(!doneP) posP.y += offNP.y * FXAA_QUALITY_P1; /*--------------------------------------------------------------------------*/ if(doneNP) { if(!doneN) lumaEndN = FxaaLuma(FxaaTexTop(tex, posN.xy)); if(!doneP) lumaEndP = FxaaLuma(FxaaTexTop(tex, posP.xy)); if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5; if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5; doneN = abs(lumaEndN) >= gradientScaled; doneP = abs(lumaEndP) >= gradientScaled; if(!doneN) posN.x -= offNP.x * FXAA_QUALITY_P2; if(!doneN) posN.y -= offNP.y * FXAA_QUALITY_P2; doneNP = (!doneN) || (!doneP); if(!doneP) posP.x += offNP.x * FXAA_QUALITY_P2; if(!doneP) posP.y += offNP.y * FXAA_QUALITY_P2; /*--------------------------------------------------------------------------*/ #if (FXAA_QUALITY_PS > 3) if(doneNP) { if(!doneN) lumaEndN = FxaaLuma(FxaaTexTop(tex, posN.xy)); if(!doneP) lumaEndP = FxaaLuma(FxaaTexTop(tex, posP.xy)); if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5; if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5; doneN = abs(lumaEndN) >= gradientScaled; doneP = abs(lumaEndP) >= gradientScaled; if(!doneN) posN.x -= offNP.x * FXAA_QUALITY_P3; if(!doneN) posN.y -= offNP.y * FXAA_QUALITY_P3; doneNP = (!doneN) || (!doneP); if(!doneP) posP.x += offNP.x * FXAA_QUALITY_P3; if(!doneP) posP.y += offNP.y * FXAA_QUALITY_P3; /*--------------------------------------------------------------------------*/ #if (FXAA_QUALITY_PS > 4) if(doneNP) { if(!doneN) lumaEndN = FxaaLuma(FxaaTexTop(tex, posN.xy)); if(!doneP) lumaEndP = FxaaLuma(FxaaTexTop(tex, posP.xy)); if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5; if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5; doneN = abs(lumaEndN) >= gradientScaled; doneP = abs(lumaEndP) >= gradientScaled; if(!doneN) posN.x -= offNP.x * FXAA_QUALITY_P4; if(!doneN) posN.y -= offNP.y * FXAA_QUALITY_P4; doneNP = (!doneN) || (!doneP); if(!doneP) posP.x += offNP.x * FXAA_QUALITY_P4; if(!doneP) posP.y += offNP.y * FXAA_QUALITY_P4; /*--------------------------------------------------------------------------*/ #if (FXAA_QUALITY_PS > 5) if(doneNP) { if(!doneN) lumaEndN = FxaaLuma(FxaaTexTop(tex, posN.xy)); if(!doneP) lumaEndP = FxaaLuma(FxaaTexTop(tex, posP.xy)); if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5; if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5; doneN = abs(lumaEndN) >= gradientScaled; doneP = abs(lumaEndP) >= gradientScaled; if(!doneN) posN.x -= offNP.x * FXAA_QUALITY_P5; if(!doneN) posN.y -= offNP.y * FXAA_QUALITY_P5; doneNP = (!doneN) || (!doneP); if(!doneP) posP.x += offNP.x * FXAA_QUALITY_P5; if(!doneP) posP.y += offNP.y * FXAA_QUALITY_P5; /*--------------------------------------------------------------------------*/ #if (FXAA_QUALITY_PS > 6) if(doneNP) { if(!doneN) lumaEndN = FxaaLuma(FxaaTexTop(tex, posN.xy)); if(!doneP) lumaEndP = FxaaLuma(FxaaTexTop(tex, posP.xy)); if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5; if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5; doneN = abs(lumaEndN) >= gradientScaled; doneP = abs(lumaEndP) >= gradientScaled; if(!doneN) posN.x -= offNP.x * FXAA_QUALITY_P6; if(!doneN) posN.y -= offNP.y * FXAA_QUALITY_P6; doneNP = (!doneN) || (!doneP); if(!doneP) posP.x += offNP.x * FXAA_QUALITY_P6; if(!doneP) posP.y += offNP.y * FXAA_QUALITY_P6; /*--------------------------------------------------------------------------*/ #if (FXAA_QUALITY_PS > 7) if(doneNP) { if(!doneN) lumaEndN = FxaaLuma(FxaaTexTop(tex, posN.xy)); if(!doneP) lumaEndP = FxaaLuma(FxaaTexTop(tex, posP.xy)); if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5; if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5; doneN = abs(lumaEndN) >= gradientScaled; doneP = abs(lumaEndP) >= gradientScaled; if(!doneN) posN.x -= offNP.x * FXAA_QUALITY_P7; if(!doneN) posN.y -= offNP.y * FXAA_QUALITY_P7; doneNP = (!doneN) || (!doneP); if(!doneP) posP.x += offNP.x * FXAA_QUALITY_P7; if(!doneP) posP.y += offNP.y * FXAA_QUALITY_P7; /*--------------------------------------------------------------------------*/ #if (FXAA_QUALITY_PS > 8) if(doneNP) { if(!doneN) lumaEndN = FxaaLuma(FxaaTexTop(tex, posN.xy)); if(!doneP) lumaEndP = FxaaLuma(FxaaTexTop(tex, posP.xy)); if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5; if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5; doneN = abs(lumaEndN) >= gradientScaled; doneP = abs(lumaEndP) >= gradientScaled; if(!doneN) posN.x -= offNP.x * FXAA_QUALITY_P8; if(!doneN) posN.y -= offNP.y * FXAA_QUALITY_P8; doneNP = (!doneN) || (!doneP); if(!doneP) posP.x += offNP.x * FXAA_QUALITY_P8; if(!doneP) posP.y += offNP.y * FXAA_QUALITY_P8; /*--------------------------------------------------------------------------*/ #if (FXAA_QUALITY_PS > 9) if(doneNP) { if(!doneN) lumaEndN = FxaaLuma(FxaaTexTop(tex, posN.xy)); if(!doneP) lumaEndP = FxaaLuma(FxaaTexTop(tex, posP.xy)); if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5; if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5; doneN = abs(lumaEndN) >= gradientScaled; doneP = abs(lumaEndP) >= gradientScaled; if(!doneN) posN.x -= offNP.x * FXAA_QUALITY_P9; if(!doneN) posN.y -= offNP.y * FXAA_QUALITY_P9; doneNP = (!doneN) || (!doneP); if(!doneP) posP.x += offNP.x * FXAA_QUALITY_P9; if(!doneP) posP.y += offNP.y * FXAA_QUALITY_P9; /*--------------------------------------------------------------------------*/ #if (FXAA_QUALITY_PS > 10) if(doneNP) { if(!doneN) lumaEndN = FxaaLuma(FxaaTexTop(tex, posN.xy)); if(!doneP) lumaEndP = FxaaLuma(FxaaTexTop(tex, posP.xy)); if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5; if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5; doneN = abs(lumaEndN) >= gradientScaled; doneP = abs(lumaEndP) >= gradientScaled; if(!doneN) posN.x -= offNP.x * FXAA_QUALITY_P10; if(!doneN) posN.y -= offNP.y * FXAA_QUALITY_P10; doneNP = (!doneN) || (!doneP); if(!doneP) posP.x += offNP.x * FXAA_QUALITY_P10; if(!doneP) posP.y += offNP.y * FXAA_QUALITY_P10; /*--------------------------------------------------------------------------*/ #if (FXAA_QUALITY_PS > 11) if(doneNP) { if(!doneN) lumaEndN = FxaaLuma(FxaaTexTop(tex, posN.xy)); if(!doneP) lumaEndP = FxaaLuma(FxaaTexTop(tex, posP.xy)); if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5; if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5; doneN = abs(lumaEndN) >= gradientScaled; doneP = abs(lumaEndP) >= gradientScaled; if(!doneN) posN.x -= offNP.x * FXAA_QUALITY_P11; if(!doneN) posN.y -= offNP.y * FXAA_QUALITY_P11; doneNP = (!doneN) || (!doneP); if(!doneP) posP.x += offNP.x * FXAA_QUALITY_P11; if(!doneP) posP.y += offNP.y * FXAA_QUALITY_P11; /*--------------------------------------------------------------------------*/ #if (FXAA_QUALITY_PS > 12) if(doneNP) { if(!doneN) lumaEndN = FxaaLuma(FxaaTexTop(tex, posN.xy)); if(!doneP) lumaEndP = FxaaLuma(FxaaTexTop(tex, posP.xy)); if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5; if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5; doneN = abs(lumaEndN) >= gradientScaled; doneP = abs(lumaEndP) >= gradientScaled; if(!doneN) posN.x -= offNP.x * FXAA_QUALITY_P12; if(!doneN) posN.y -= offNP.y * FXAA_QUALITY_P12; doneNP = (!doneN) || (!doneP); if(!doneP) posP.x += offNP.x * FXAA_QUALITY_P12; if(!doneP) posP.y += offNP.y * FXAA_QUALITY_P12; /*--------------------------------------------------------------------------*/ } #endif /*--------------------------------------------------------------------------*/ } #endif /*--------------------------------------------------------------------------*/ } #endif /*--------------------------------------------------------------------------*/ } #endif /*--------------------------------------------------------------------------*/ } #endif /*--------------------------------------------------------------------------*/ } #endif /*--------------------------------------------------------------------------*/ } #endif /*--------------------------------------------------------------------------*/ } #endif /*--------------------------------------------------------------------------*/ } #endif /*--------------------------------------------------------------------------*/ } #endif /*--------------------------------------------------------------------------*/ } /*--------------------------------------------------------------------------*/ FxaaFloat dstN = posM.x - posN.x; FxaaFloat dstP = posP.x - posM.x; if(!horzSpan) dstN = posM.y - posN.y; if(!horzSpan) dstP = posP.y - posM.y; /*--------------------------------------------------------------------------*/ FxaaBool goodSpanN = (lumaEndN < 0.0) != lumaMLTZero; FxaaFloat spanLength = (dstP + dstN); FxaaBool goodSpanP = (lumaEndP < 0.0) != lumaMLTZero; FxaaFloat spanLengthRcp = 1.0/spanLength; /*--------------------------------------------------------------------------*/ FxaaBool directionN = dstN < dstP; FxaaFloat dst = min(dstN, dstP); FxaaBool goodSpan = directionN ? goodSpanN : goodSpanP; FxaaFloat subpixG = subpixF * subpixF; FxaaFloat pixelOffset = (dst * (-spanLengthRcp)) + 0.5; FxaaFloat subpixH = subpixG * fxaaQualitySubpix; /*--------------------------------------------------------------------------*/ FxaaFloat pixelOffsetGood = goodSpan ? pixelOffset : 0.0; FxaaFloat pixelOffsetSubpix = max(pixelOffsetGood, subpixH); if(!horzSpan) posM.x += pixelOffsetSubpix * lengthSign; if( horzSpan) posM.y += pixelOffsetSubpix * lengthSign; return FxaaFloat4(FxaaTexTop(tex, posM).xyz, lumaM); } `;var vNi=T(S(),1);function sS(){this._uniformMap=void 0,this._command=void 0,this._colorTexture=void 0,this._depthTexture=void 0,this._ready=!1,this._name="czm_autoexposure",this._logDepthChanged=void 0,this._useLogDepth=void 0,this._framebuffers=void 0,this._previousLuminance=new bi,this._commands=void 0,this._clearCommand=void 0,this._minMaxLuminance=new D,this.enabled=!0,this._enabled=!0,this.minimumLuminance=.1,this.maximumLuminance=10}Object.defineProperties(sS.prototype,{ready:{get:function(){return this._ready}},name:{get:function(){return this._name}},outputTexture:{get:function(){let e=this._framebuffers;if(l(e))return e[e.length-1].getColorTexture(0)}}});function g_e(e){let t=e._framebuffers;if(!l(t))return;let n=t.length;for(let i=0;i<n;++i)t[i].destroy();e._framebuffers=void 0,e._previousLuminance.destroy(),e._previousLuminance=void 0}function Dft(e,t){g_e(e);let n=e._width,i=e._height,o=t.halfFloatingPointTexture?je.HALF_FLOAT:je.FLOAT,r=Math.ceil(Math.log(Math.max(n,i))/Math.log(3)),s=new Array(r);for(let c=0;c<r;++c)n=Math.max(Math.ceil(n/3),1),i=Math.max(Math.ceil(i/3),1),s[c]=new bi,s[c].update(t,n,i,1,o);let a=s[r-1].getColorTexture(0);e._previousLuminance.update(t,a.width,a.height,1,o),e._framebuffers=s}function y_e(e){let t=e._commands;if(!l(t))return;let n=t.length;for(let i=0;i<n;++i)t[i].shaderProgram.destroy();e._commands=void 0}function Bft(e,t){let n;if(t===0)n={colorTexture:function(){return e._colorTexture},colorTextureDimensions:function(){return e._colorTexture.dimensions}};else{let i=e._framebuffers[t-1].getColorTexture(0);n={colorTexture:function(){return i},colorTextureDimensions:function(){return i.dimensions}}}return n.minMaxLuminance=function(){return e._minMaxLuminance},n.previousLuminance=function(){return e._previousLuminance.getColorTexture(0)},n}function Oft(e,t){let n=`uniform sampler2D colorTexture; in vec2 v_textureCoordinates; float sampleTexture(vec2 offset) { `;return e===0?n+=` vec4 color = texture(colorTexture, v_textureCoordinates + offset); return czm_luminance(color.rgb); `:n+=` return texture(colorTexture, v_textureCoordinates + offset).r; `,n+=`} `,n+=`uniform vec2 colorTextureDimensions; uniform vec2 minMaxLuminance; uniform sampler2D previousLuminance; void main() { float color = 0.0; float xStep = 1.0 / colorTextureDimensions.x; float yStep = 1.0 / colorTextureDimensions.y; int count = 0; for (int i = 0; i < 3; ++i) { for (int j = 0; j < 3; ++j) { vec2 offset; offset.x = -xStep + float(i) * xStep; offset.y = -yStep + float(j) * yStep; if (offset.x < 0.0 || offset.x > 1.0 || offset.y < 0.0 || offset.y > 1.0) { continue; } color += sampleTexture(offset); ++count; } } if (count > 0) { color /= float(count); } `,e===t-1&&(n+=` float previous = texture(previousLuminance, vec2(0.5)).r; color = clamp(color, minMaxLuminance.x, minMaxLuminance.y); color = previous + (color - previous) / (60.0 * 1.5); color = clamp(color, minMaxLuminance.x, minMaxLuminance.y); `),n+=` out_FragColor = vec4(color); } `,n}function Yft(e,t){y_e(e);let n=e._framebuffers,i=n.length,o=new Array(i);for(let r=0;r<i;++r)o[r]=t.createViewportQuadCommand(Oft(r,i),{framebuffer:n[r].framebuffer,uniformMap:Bft(e,r)});e._commands=o}sS.prototype.clear=function(e){let t=this._framebuffers;if(!l(t))return;let n=this._clearCommand;l(n)||(n=this._clearCommand=new ai({color:new B(0,0,0,0),framebuffer:void 0}));let i=t.length;for(let o=0;o<i;++o)t[o].clear(e,n)};sS.prototype.update=function(e){let t=e.drawingBufferWidth,n=e.drawingBufferHeight;(t!==this._width||n!==this._height)&&(this._width=t,this._height=n,Dft(this,e),Yft(this,e),this._ready||(this._ready=!0)),this._minMaxLuminance.x=this.minimumLuminance,this._minMaxLuminance.y=this.maximumLuminance;let i=this._framebuffers,o=i[i.length-1];i[i.length-1]=this._previousLuminance,this._commands[this._commands.length-1].framebuffer=this._previousLuminance.framebuffer,this._previousLuminance=o};sS.prototype.execute=function(e,t){this._colorTexture=t;let n=this._commands;if(!l(n))return;let i=n.length;for(let o=0;o<i;++o)n[o].execute(e)};sS.prototype.isDestroyed=function(){return!1};sS.prototype.destroy=function(){return g_e(this),y_e(this),me(this)};var TA=sS;var i5i=T(S(),1);var FNi=T(S(),1),Hft={NEAREST:0,LINEAR:1},tu=Hft;function aS(e){e=y(e,y.EMPTY_OBJECT);let{name:t=Jn(),fragmentShader:n,uniforms:i,textureScale:o=1,forcePowerOfTwo:r=!1,sampleMode:s=tu.NEAREST,pixelFormat:a=ot.RGBA,pixelDatatype:c=je.UNSIGNED_BYTE,clearColor:d=B.BLACK,scissorRectangle:u}=e;this._fragmentShader=n,this._uniforms=i,this._textureScale=o,this._forcePowerOfTwo=r,this._sampleMode=s,this._pixelFormat=a,this._pixelDatatype=c,this._clearColor=d,this._uniformMap=void 0,this._command=void 0,this._colorTexture=void 0,this._depthTexture=void 0,this._idTexture=void 0,this._actualUniforms={},this._dirtyUniforms=[],this._texturesToRelease=[],this._texturesToCreate=[],this._texturePromise=void 0;let h=new Vc;h.scissorTest={enabled:!0,rectangle:l(u)?He.clone(u):new He},this._passState=h,this._ready=!1,this._name=t,this._logDepthChanged=void 0,this._useLogDepth=void 0,this._selectedIdTexture=void 0,this._selected=void 0,this._selectedShadow=void 0,this._parentSelected=void 0,this._parentSelectedShadow=void 0,this._combinedSelected=void 0,this._combinedSelectedShadow=void 0,this._selectedLength=0,this._parentSelectedLength=0,this._selectedDirty=!0,this._textureCache=void 0,this._index=void 0,this.enabled=!0,this._enabled=!0}Object.defineProperties(aS.prototype,{ready:{get:function(){return this._ready}},name:{get:function(){return this._name}},fragmentShader:{get:function(){return this._fragmentShader}},uniforms:{get:function(){return this._uniforms}},textureScale:{get:function(){return this._textureScale}},forcePowerOfTwo:{get:function(){return this._forcePowerOfTwo}},sampleMode:{get:function(){return this._sampleMode}},pixelFormat:{get:function(){return this._pixelFormat}},pixelDatatype:{get:function(){return this._pixelDatatype}},clearColor:{get:function(){return this._clearColor}},scissorRectangle:{get:function(){return this._passState.scissorTest.rectangle}},outputTexture:{get:function(){if(l(this._textureCache)){let e=this._textureCache.getFramebuffer(this._name);if(l(e))return e.getColorTexture(0)}}},selected:{get:function(){return this._selected},set:function(e){this._selected=e}},parentSelected:{get:function(){return this._parentSelected},set:function(e){this._parentSelected=e}}});var zft=/uniform\s+sampler2D\s+depthTexture/g;aS.prototype._isSupported=function(e){return!zft.test(this._fragmentShader)||e.depthTexture};function Kft(e,t,n){let i=t[n];return(typeof i=="string"||i instanceof HTMLCanvasElement||i instanceof HTMLImageElement||i instanceof HTMLVideoElement||i instanceof ImageData)&&e._dirtyUniforms.push(n),{get:function(){return t[n]},set:function(o){let r=t[n];t[n]=o;let s=e._actualUniforms,a=s[n];l(a)&&a!==r&&a instanceof Wt&&!l(e._textureCache.getStageByName(n))&&(e._texturesToRelease.push(a),delete s[n],delete s[`${n}Dimensions`]),r instanceof Wt&&e._texturesToRelease.push(r),typeof o=="string"||o instanceof HTMLCanvasElement||o instanceof HTMLImageElement||o instanceof HTMLVideoElement||o instanceof ImageData?e._dirtyUniforms.push(n):s[n]=o}}}function Jft(e,t){return function(){let n=e._actualUniforms[t];return typeof n=="function"?n():n}}function Qft(e,t){return function(){let n=e[t]();if(l(n))return n.dimensions}}function jft(e){if(l(e._uniformMap))return;let t={},n={},i=e._uniforms,o=e._actualUniforms;for(let r in i){if(!i.hasOwnProperty(r))continue;typeof i[r]!="function"?(t[r]=Jft(e,r),n[r]=Kft(e,i,r)):(t[r]=i[r],n[r]=i[r]),o[r]=i[r];let s=t[r]();(typeof s=="string"||s instanceof Wt||s instanceof HTMLImageElement||s instanceof HTMLCanvasElement||s instanceof HTMLVideoElement)&&(t[`${r}Dimensions`]=Qft(t,r))}e._uniforms={},Object.defineProperties(e._uniforms,n),e._uniformMap=Lt(t,{colorTexture:function(){return e._colorTexture},colorTextureDimensions:function(){return e._colorTexture.dimensions},depthTexture:function(){return e._depthTexture},depthTextureDimensions:function(){return e._depthTexture.dimensions},czm_idTexture:function(){return e._idTexture},czm_selectedIdTexture:function(){return e._selectedIdTexture},czm_selectedIdTextureStep:function(){return 1/e._selectedIdTexture.width}})}function qft(e,t){return e=e.replace(/in\s+vec2\s+v_textureCoordinates;/g,""),`#define CZM_SELECTED_FEATURE uniform sampler2D czm_idTexture; uniform sampler2D czm_selectedIdTexture; uniform float czm_selectedIdTextureStep; in vec2 v_textureCoordinates; bool czm_selected(vec2 offset) { bool selected = false; vec4 id = texture(czm_idTexture, v_textureCoordinates + offset); for (int i = 0; i < ${t}; ++i) { vec4 selectedId = texture(czm_selectedIdTexture, vec2((float(i) + 0.5) * czm_selectedIdTextureStep, 0.5)); if (all(equal(id, selectedId))) { return true; } } return false; } bool czm_selected() { return czm_selected(vec2(0.0)); } ${e}`}function $ft(e,t){if(l(e._command)&&!e._logDepthChanged&&!e._selectedDirty)return;let n=e._fragmentShader;if(l(e._selectedIdTexture)){let o=e._selectedIdTexture.width;n=qft(n,o)}let i=new De({defines:[e._useLogDepth?"LOG_DEPTH":""],sources:[n]});e._command=t.createViewportQuadCommand(i,{uniformMap:e._uniformMap,owner:e})}function ept(e){let t=e._sampleMode,n,i;t===tu.LINEAR?(n=qt.LINEAR,i=pi.LINEAR):(n=qt.NEAREST,i=pi.NEAREST);let o=e._sampler;(!l(o)||o.minificationFilter!==n||o.magnificationFilter!==i)&&(e._sampler=new $t({wrapS:Vn.CLAMP_TO_EDGE,wrapT:Vn.CLAMP_TO_EDGE,minificationFilter:n,magnificationFilter:i}))}function tpt(e,t){return function(n){e._texturesToCreate.push({name:t,source:n})}}function npt(e,t){return function(){return e._textureCache.getOutputTexture(t)}}function ipt(e,t){let n=e._texturesToRelease;for(let a=0;a<n.length;++a){let c=n[a];c=c&&c.destroy()}n.length=0;let i=e._texturesToCreate;for(let a=0;a<i.length;++a){let{name:c,source:d}=i[a];e._actualUniforms[c]=new Wt({context:t,source:d})}i.length=0;let o=e._dirtyUniforms;if(o.length===0&&!l(e._texturePromise)){e._ready=!0;return}if(o.length===0||l(e._texturePromise))return;let r=e._uniforms,s=[];for(let a=0;a<o.length;++a){let c=o[a],d=r[c],u=e._textureCache.getStageByName(d);if(l(u))e._actualUniforms[c]=npt(e,d);else if(typeof d=="string"){let h=new Re({url:d});s.push(h.fetchImage().then(tpt(e,c)))}else e._texturesToCreate.push({name:c,source:d})}o.length=0,s.length>0?(e._ready=!1,e._texturePromise=Promise.all(s).then(function(){e._ready=!0,e._texturePromise=void 0})):e._ready=!0}function x_e(e){l(e._command)&&(e._command.shaderProgram=e._command.shaderProgram&&e._command.shaderProgram.destroy(),e._command=void 0),e._selectedIdTexture=e._selectedIdTexture&&e._selectedIdTexture.destroy();let t=e._textureCache;if(!l(t))return;let n=e._uniforms,i=e._actualUniforms;for(let o in i){if(!i.hasOwnProperty(o))continue;let r=i[o];r instanceof Wt&&(l(t.getStageByName(n[o]))||r.destroy(),e._dirtyUniforms.push(o))}}function opt(e){let t=l(e._selected)?e._selected.length:0,n=l(e._parentSelected)?e._parentSelected:0,i=e._selected!==e._selectedShadow||t!==e._selectedLength||e._parentSelected!==e._parentSelectedShadow||n!==e._parentSelectedLength;if(l(e._selected)&&l(e._parentSelected)?e._combinedSelected=e._selected.concat(e._parentSelected):l(e._parentSelected)?e._combinedSelected=e._parentSelected:e._combinedSelected=e._selected,!i&&l(e._combinedSelected)){if(!l(e._combinedSelectedShadow))return!0;for(let o=0;o<e._combinedSelected.length;++o)if(e._combinedSelected[o]!==e._combinedSelectedShadow[o])return!0}return i}function rpt(e,t){if(!e._selectedDirty)return;e._selectedIdTexture=e._selectedIdTexture&&e._selectedIdTexture.destroy(),e._selectedIdTexture=void 0;let n=e._combinedSelected;if(!l(n))return;let i=0;for(let s=0;s<n.length;++s){let a=n[s];l(a.pickIds)?i+=a.pickIds.length:l(a.pickId)&&++i}if(n.length===0||i===0){let s=new Uint8Array([255,255,255,255]);e._selectedIdTexture=new Wt({context:t,pixelFormat:ot.RGBA,pixelDatatype:je.UNSIGNED_BYTE,source:{arrayBufferView:s,width:1,height:1},sampler:$t.NEAREST});return}let o=0,r=new Uint8Array(i*4);for(let s=0;s<n.length;++s){let a=n[s];if(l(a.pickIds)){let c=a.pickIds,d=c.length;for(let u=0;u<d;++u){let h=c[u].color;r[o]=B.floatToByte(h.red),r[o+1]=B.floatToByte(h.green),r[o+2]=B.floatToByte(h.blue),r[o+3]=B.floatToByte(h.alpha),o+=4}}else if(l(a.pickId)){let c=a.pickId.color;r[o]=B.floatToByte(c.red),r[o+1]=B.floatToByte(c.green),r[o+2]=B.floatToByte(c.blue),r[o+3]=B.floatToByte(c.alpha),o+=4}}e._selectedIdTexture=new Wt({context:t,pixelFormat:ot.RGBA,pixelDatatype:je.UNSIGNED_BYTE,source:{arrayBufferView:r,width:i,height:1},sampler:$t.NEAREST})}aS.prototype.update=function(e,t){if(this.enabled!==this._enabled&&!this.enabled&&x_e(this),this._enabled=this.enabled,!this._enabled||(this._logDepthChanged=t!==this._useLogDepth,this._useLogDepth=t,this._selectedDirty=opt(this),this._selectedShadow=this._selected,this._parentSelectedShadow=this._parentSelected,this._combinedSelectedShadow=this._combinedSelected,this._selectedLength=l(this._selected)?this._selected.length:0,this._parentSelectedLength=l(this._parentSelected)?this._parentSelected.length:0,rpt(this,e),jft(this),ipt(this,e),$ft(this,e),ept(this),this._selectedDirty=!1,!this._ready))return;let n=this._textureCache.getFramebuffer(this._name);if(this._command.framebuffer=n,!l(n))return;let i=n.getColorTexture(0),o;(i.width!==e.drawingBufferWidth||i.height!==e.drawingBufferHeight)&&(o=this._renderState,(!l(o)||i.width!==o.viewport.width||i.height!==o.viewport.height)&&(this._renderState=Ue.fromCache({viewport:new He(0,0,i.width,i.height)}))),this._command.renderState=o};aS.prototype.execute=function(e,t,n,i){if(!l(this._command)||!l(this._command.framebuffer)||!this._ready||!this._enabled)return;this._colorTexture=t,this._depthTexture=n,this._idTexture=i,$t.equals(this._colorTexture.sampler,this._sampler)||(this._colorTexture.sampler=this._sampler);let o=this.scissorRectangle.width>0&&this.scissorRectangle.height>0?this._passState:void 0;l(o)&&(o.context=e),this._command.execute(e,o)};aS.prototype.isDestroyed=function(){return!1};aS.prototype.destroy=function(){return x_e(this),me(this)};var bo=aS;var l5i=T(S(),1);function cS(e){e=y(e,y.EMPTY_OBJECT),this._stages=e.stages,this._inputPreviousStageTexture=y(e.inputPreviousStageTexture,!0);let t=e.name;l(t)||(t=Jn()),this._name=t,this._uniforms=e.uniforms,this._textureCache=void 0,this._index=void 0,this._selected=void 0,this._selectedShadow=void 0,this._parentSelected=void 0,this._parentSelectedShadow=void 0,this._combinedSelected=void 0,this._combinedSelectedShadow=void 0,this._selectedLength=0,this._parentSelectedLength=0,this._selectedDirty=!0}Object.defineProperties(cS.prototype,{ready:{get:function(){let e=this._stages,t=e.length;for(let n=0;n<t;++n)if(!e[n].ready)return!1;return!0}},name:{get:function(){return this._name}},enabled:{get:function(){return this._stages[0].enabled},set:function(e){let t=this._stages,n=t.length;for(let i=0;i<n;++i)t[i].enabled=e}},uniforms:{get:function(){return this._uniforms}},inputPreviousStageTexture:{get:function(){return this._inputPreviousStageTexture}},length:{get:function(){return this._stages.length}},selected:{get:function(){return this._selected},set:function(e){this._selected=e}},parentSelected:{get:function(){return this._parentSelected},set:function(e){this._parentSelected=e}}});cS.prototype._isSupported=function(e){let t=this._stages,n=t.length;for(let i=0;i<n;++i)if(!t[i]._isSupported(e))return!1;return!0};cS.prototype.get=function(e){return this._stages[e]};function spt(e){let t=l(e._selected)?e._selected.length:0,n=l(e._parentSelected)?e._parentSelected:0,i=e._selected!==e._selectedShadow||t!==e._selectedLength;if(i=i||e._parentSelected!==e._parentSelectedShadow||n!==e._parentSelectedLength,l(e._selected)&&l(e._parentSelected)?e._combinedSelected=e._selected.concat(e._parentSelected):l(e._parentSelected)?e._combinedSelected=e._parentSelected:e._combinedSelected=e._selected,!i&&l(e._combinedSelected)){if(!l(e._combinedSelectedShadow))return!0;t=e._combinedSelected.length;for(let o=0;o<t;++o)if(e._combinedSelected[o]!==e._combinedSelectedShadow[o])return!0}return i}cS.prototype.update=function(e,t){this._selectedDirty=spt(this),this._selectedShadow=this._selected,this._parentSelectedShadow=this._parentSelected,this._combinedSelectedShadow=this._combinedSelected,this._selectedLength=l(this._selected)?this._selected.length:0,this._parentSelectedLength=l(this._parentSelected)?this._parentSelected.length:0;let n=this._stages,i=n.length;for(let o=0;o<i;++o){let r=n[o];this._selectedDirty&&(r.parentSelected=this._combinedSelected),r.update(e,t)}};cS.prototype.isDestroyed=function(){return!1};cS.prototype.destroy=function(){let e=this._stages,t=e.length;for(let n=0;n<t;++n)e[n].destroy();return me(this)};var rd=cS;var Ir={};function u8(e){let o=`#define USE_STEP_SIZE ${Uy}`,r=new bo({name:`${e}_x_direction`,fragmentShader:o,uniforms:{delta:1,sigma:2,stepSize:1,direction:0},sampleMode:tu.LINEAR}),s=new bo({name:`${e}_y_direction`,fragmentShader:o,uniforms:{delta:1,sigma:2,stepSize:1,direction:1},sampleMode:tu.LINEAR}),a={};return Object.defineProperties(a,{delta:{get:function(){return r.uniforms.delta},set:function(c){let d=r.uniforms,u=s.uniforms;d.delta=u.delta=c}},sigma:{get:function(){return r.uniforms.sigma},set:function(c){let d=r.uniforms,u=s.uniforms;d.sigma=u.sigma=c}},stepSize:{get:function(){return r.uniforms.stepSize},set:function(c){let d=r.uniforms,u=s.uniforms;d.stepSize=u.stepSize=c}}}),new rd({name:e,stages:[r,s],uniforms:a})}Ir.createBlurStage=function(){return u8("czm_blur")};Ir.createDepthOfFieldStage=function(){let e=u8("czm_depth_of_field_blur"),t=new bo({name:"czm_depth_of_field_composite",fragmentShader:lA,uniforms:{focalDistance:5,blurTexture:e.name}}),n={};return Object.defineProperties(n,{focalDistance:{get:function(){return t.uniforms.focalDistance},set:function(i){t.uniforms.focalDistance=i}},delta:{get:function(){return e.uniforms.delta},set:function(i){e.uniforms.delta=i}},sigma:{get:function(){return e.uniforms.sigma},set:function(i){e.uniforms.sigma=i}},stepSize:{get:function(){return e.uniforms.stepSize},set:function(i){e.uniforms.stepSize=i}}}),new rd({name:"czm_depth_of_field",stages:[e,t],inputPreviousStageTexture:!1,uniforms:n})};Ir.isDepthOfFieldSupported=function(e){return e.context.depthTexture};Ir.createEdgeDetectionStage=function(){let e=Jn();return new bo({name:`czm_edge_detection_${e}`,fragmentShader:uA,uniforms:{length:.25,color:B.clone(B.BLACK)}})};Ir.isEdgeDetectionSupported=function(e){return e.context.depthTexture};function apt(e){if(!l(e))return Ir.createEdgeDetectionStage();let t=new rd({name:"czm_edge_detection_multiple",stages:e,inputPreviousStageTexture:!1}),n={},i="",o="";for(let a=0;a<e.length;++a)i+=`uniform sampler2D edgeTexture${a}; `,o+=` vec4 edge${a} = texture(edgeTexture${a}, v_textureCoordinates); if (edge${a}.a > 0.0) { color = edge${a}; break; } `,n[`edgeTexture${a}`]=e[a].name;let r=`${i}in vec2 v_textureCoordinates; void main() { vec4 color = vec4(0.0); for (int i = 0; i < ${e.length}; i++) { ${o} } out_FragColor = color; } `,s=new bo({name:"czm_edge_detection_combine",fragmentShader:r,uniforms:n});return new rd({name:"czm_edge_detection_composite",stages:[t,s]})}Ir.createSilhouetteStage=function(e){let t=apt(e),n=new bo({name:"czm_silhouette_color_edges",fragmentShader:xA,uniforms:{silhouetteTexture:t.name}});return new rd({name:"czm_silhouette",stages:[t,n],inputPreviousStageTexture:!1,uniforms:t.uniforms})};Ir.isSilhouetteSupported=function(e){return e.context.depthTexture};Ir.createBloomStage=function(){let e=new bo({name:"czm_bloom_contrast_bias",fragmentShader:cA,uniforms:{contrast:128,brightness:-.3}}),t=u8("czm_bloom_blur"),n=new rd({name:"czm_bloom_contrast_bias_blur",stages:[e,t]}),i=new bo({name:"czm_bloom_generate_composite",fragmentShader:sA,uniforms:{glowOnly:!1,bloomTexture:n.name}}),o={};return Object.defineProperties(o,{glowOnly:{get:function(){return i.uniforms.glowOnly},set:function(r){i.uniforms.glowOnly=r}},contrast:{get:function(){return e.uniforms.contrast},set:function(r){e.uniforms.contrast=r}},brightness:{get:function(){return e.uniforms.brightness},set:function(r){e.uniforms.brightness=r}},delta:{get:function(){return t.uniforms.delta},set:function(r){t.uniforms.delta=r}},sigma:{get:function(){return t.uniforms.sigma},set:function(r){t.uniforms.sigma=r}},stepSize:{get:function(){return t.uniforms.stepSize},set:function(r){t.uniforms.stepSize=r}}}),new rd({name:"czm_bloom",stages:[n,i],inputPreviousStageTexture:!1,uniforms:o})};Ir.createAmbientOcclusionStage=function(){let e=new bo({name:"czm_ambient_occlusion_generate",fragmentShader:iA,uniforms:{intensity:3,bias:.1,lengthCap:.26,directionCount:8,stepCount:32,randomTexture:void 0}}),t=new bo({name:"czm_ambient_occlusion_composite",fragmentShader:oA,uniforms:{ambientOcclusionOnly:!1,ambientOcclusionTexture:e.name}}),n={};return Object.defineProperties(n,{intensity:{get:function(){return e.uniforms.intensity},set:function(i){e.uniforms.intensity=i}},bias:{get:function(){return e.uniforms.bias},set:function(i){e.uniforms.bias=i}},lengthCap:{get:function(){return e.uniforms.lengthCap},set:function(i){e.uniforms.lengthCap=i}},directionCount:{get:function(){return e.uniforms.directionCount},set:function(i){e.uniforms.directionCount=i}},stepCount:{get:function(){return e.uniforms.stepCount},set:function(i){e.uniforms.stepCount=i}},randomTexture:{get:function(){return e.uniforms.randomTexture},set:function(i){e.uniforms.randomTexture=i}},ambientOcclusionOnly:{get:function(){return t.uniforms.ambientOcclusionOnly},set:function(i){t.uniforms.ambientOcclusionOnly=i}}}),new rd({name:"czm_ambient_occlusion",stages:[e,t],inputPreviousStageTexture:!1,uniforms:n})};Ir.isAmbientOcclusionSupported=function(e){return e.context.depthTexture};var cpt=`#define FXAA_QUALITY_PRESET 39 ${_A} ${fA}`;Ir.createFXAAStage=function(){return new bo({name:"czm_FXAA",fragmentShader:cpt,sampleMode:tu.LINEAR})};Ir.createAcesTonemappingStage=function(e){let t=e?`#define AUTO_EXPOSURE `:"";return t+=nA,new bo({name:"czm_aces",fragmentShader:t,uniforms:{autoExposure:void 0,exposure:1}})};Ir.createFilmicTonemappingStage=function(e){let t=e?`#define AUTO_EXPOSURE `:"";return t+=mA,new bo({name:"czm_filmic",fragmentShader:t,uniforms:{autoExposure:void 0,exposure:1}})};Ir.createPbrNeutralTonemappingStage=function(e){let t=e?`#define AUTO_EXPOSURE `:"";return t+=hA,new bo({name:"czm_pbr_neutral",fragmentShader:t,uniforms:{autoExposure:void 0,exposure:1}})};Ir.createReinhardTonemappingStage=function(e){let t=e?`#define AUTO_EXPOSURE `:"";return t+=yA,new bo({name:"czm_reinhard",fragmentShader:t,uniforms:{autoExposure:void 0,exposure:1}})};Ir.createModifiedReinhardTonemappingStage=function(e){let t=e?`#define AUTO_EXPOSURE `:"";return t+=bA,new bo({name:"czm_modified_reinhard",fragmentShader:t,uniforms:{white:B.WHITE,autoExposure:void 0,exposure:1}})};Ir.createAutoExposureStage=function(){return new TA};Ir.createBlackAndWhiteStage=function(){return new bo({name:"czm_black_and_white",fragmentShader:rA,uniforms:{gradations:5}})};Ir.createBrightnessStage=function(){return new bo({name:"czm_brightness",fragmentShader:aA,uniforms:{brightness:.5}})};Ir.createNightVisionStage=function(){return new bo({name:"czm_night_vision",fragmentShader:gA})};Ir.createDepthViewStage=function(){return new bo({name:"czm_depth_view",fragmentShader:dA})};Ir.createLensFlareStage=function(){return new bo({name:"czm_lens_flare",fragmentShader:pA,uniforms:{dirtTexture:on("Assets/Textures/LensFlare/DirtMask.jpg"),starTexture:on("Assets/Textures/LensFlare/StarBurst.jpg"),intensity:2,distortion:10,ghostDispersal:.4,haloWidth:.4,dirtAmount:.4,earthRadius:ne.WGS84.maximumRadius}})};var nu=Ir;var K5i=T(S(),1);function R0(e){this._collection=e,this._framebuffers=[],this._stageNameToFramebuffer={},this._width=void 0,this._height=void 0,this._updateDependencies=!1}function CA(e){for(;l(e.length);)e=e.get(e.length-1);return e.name}function m8(e,t,n,i,o){if(!i.enabled||!i._isSupported(t))return o;let r=n[i.name]={};if(l(o)){let a=e.getStageByName(o);r[CA(a)]=!0}let s=i.uniforms;if(l(s)){let a=Object.getOwnPropertyNames(s),c=a.length;for(let d=0;d<c;++d){let u=s[a[d]];if(typeof u=="string"){let h=e.getStageByName(u);l(h)&&(r[CA(h)]=!0)}}}return i.name}function SA(e,t,n,i,o){if(l(i.enabled)&&!i.enabled||l(i._isSupported)&&!i._isSupported(t))return o;let r=o,s=!l(i.inputPreviousStageTexture)||i.inputPreviousStageTexture,a=o,c=i.length;for(let h=0;h<c;++h){let p=i.get(h);l(p.length)?a=SA(e,t,n,p,o):a=m8(e,t,n,p,o),s&&(o=a)}let d,u;if(s)for(d=1;d<c;++d)u=CA(i.get(d)),l(n[u])||(n[u]={}),n[u][r]=!0;else for(d=1;d<c;++d){u=CA(i.get(d));let h=n[u];for(let p=0;p<d;++p)h[CA(i.get(p))]=!0}return a}function lpt(e,t){let n={};if(l(e.ambientOcclusion)){let i=e.ambientOcclusion,o=e.bloom,r=e._tonemapping,s=e.fxaa,a=SA(e,t,n,i,void 0);a=SA(e,t,n,o,a),a=m8(e,t,n,r,a),a=SA(e,t,n,e,a),m8(e,t,n,s,a)}else SA(e,t,n,e,void 0);return n}function dpt(e,t,n){let o=e._collection.getStageByName(t),r=o._textureScale,s=o._forcePowerOfTwo,a=o._pixelFormat,c=o._pixelDatatype,d=o._clearColor,u,h,p=e._framebuffers,g=p.length;for(u=0;u<g;++u){if(h=p[u],r!==h.textureScale||s!==h.forcePowerOfTwo||a!==h.pixelFormat||c!==h.pixelDatatype||!B.equals(d,h.clearColor))continue;let f=h.stages,x=f.length,_=!1;for(let C=0;C<x;++C)if(n[f[C]]){_=!0;break}if(!_)break}return l(h)&&u<g?(h.stages.push(t),h):(h={textureScale:r,forcePowerOfTwo:s,pixelFormat:a,pixelDatatype:c,clearColor:d,stages:[t],buffer:new bi({pixelFormat:a,pixelDatatype:c}),clear:void 0},p.push(h),h)}function upt(e,t){let n=lpt(e._collection,t);for(let i in n)n.hasOwnProperty(i)&&(e._stageNameToFramebuffer[i]=dpt(e,i,n[i]))}function h8(e){let t=e._framebuffers,n=t.length;for(let i=0;i<n;++i)t[i].buffer.destroy()}function mpt(e,t){let n=e._width,i=e._height,o=e._framebuffers,r=o.length;for(let s=0;s<r;++s){let a=o[s],c=a.textureScale,d=Math.ceil(n*c),u=Math.ceil(i*c),h=Math.min(d,u);a.forcePowerOfTwo&&(W.isPowerOfTwo(h)||(h=W.nextPowerOfTwo(h)),d=h,u=h),a.buffer.update(t,d,u),a.clear=new ai({color:a.clearColor,framebuffer:a.buffer.framebuffer})}}R0.prototype.updateDependencies=function(){this._updateDependencies=!0};R0.prototype.update=function(e){let t=this._collection,n=this._updateDependencies,i=l(t.ambientOcclusion)&&t.ambientOcclusion.enabled&&t.ambientOcclusion._isSupported(e),o=l(t.bloom)&&t.bloom.enabled&&t.bloom._isSupported(e),r=l(t._tonemapping)&&t._tonemapping.enabled&&t._tonemapping._isSupported(e),s=l(t.fxaa)&&t.fxaa.enabled&&t.fxaa._isSupported(e),a=!l(t._activeStages)||t._activeStages.length>0||i||o||r||s;if((n||!a&&this._framebuffers.length>0)&&(h8(this),this._framebuffers.length=0,this._stageNameToFramebuffer={},this._width=void 0,this._height=void 0),!n&&!a)return;this._framebuffers.length===0&&upt(this,e);let c=e.drawingBufferWidth,d=e.drawingBufferHeight,u=this._width!==c||this._height!==d;!n&&!u||(this._width=c,this._height=d,this._updateDependencies=!1,h8(this),mpt(this,e))};R0.prototype.clear=function(e){let t=this._framebuffers;for(let n=0;n<t.length;++n)t[n].clear.execute(e)};R0.prototype.getStageByName=function(e){return this._collection.getStageByName(e)};R0.prototype.getOutputTexture=function(e){return this._collection.getOutputTexture(e)};R0.prototype.getFramebuffer=function(e){let t=this._stageNameToFramebuffer[e];if(l(t))return t.buffer.framebuffer};R0.prototype.isDestroyed=function(){return!1};R0.prototype.destroy=function(){return h8(this),me(this)};var lS=R0;var Q5i=T(S(),1),hpt={REINHARD:"REINHARD",MODIFIED_REINHARD:"MODIFIED_REINHARD",FILMIC:"FILMIC",ACES:"ACES",PBR_NEUTRAL:"PBR_NEUTRAL"};var Z0=Object.freeze(hpt);var f8=[];function xl(){let e=nu.createFXAAStage(),t=nu.createAmbientOcclusionStage(),n=nu.createBloomStage();this._autoExposureEnabled=!1,this._autoExposure=nu.createAutoExposureStage(),this._exposure=1,this._tonemapping=void 0,this._tonemapper=void 0,this.tonemapper=Z0.PBR_NEUTRAL;let i=this._tonemapping;e.enabled=!1,t.enabled=!1,n.enabled=!1,i.enabled=!1;let o=new lS(this),r={},s=f8;for(s.push(e,t,n,i);s.length>0;){let c=s.pop();r[c.name]=c,c._textureCache=o;let d=c.length;if(l(d))for(let u=0;u<d;++u)s.push(c.get(u))}this._stages=[],this._activeStages=[],this._previousActiveStages=[],this._randomTexture=void 0;let a=this;t.uniforms.randomTexture=function(){return a._randomTexture},this._ao=t,this._bloom=n,this._fxaa=e,this._aoEnabled=void 0,this._bloomEnabled=void 0,this._tonemappingEnabled=void 0,this._fxaaEnabled=void 0,this._activeStagesChanged=!1,this._stagesRemoved=!1,this._textureCacheDirty=!1,this._stageNames=r,this._textureCache=o}Object.defineProperties(xl.prototype,{ready:{get:function(){let e=!1,t=this._stages,n=t.length;for(let a=n-1;a>=0;--a){let c=t[a];e=e||c.ready&&c.enabled}let i=this._fxaa,o=this._ao,r=this._bloom,s=this._tonemapping;return e=e||i.ready&&i.enabled,e=e||o.ready&&o.enabled,e=e||r.ready&&r.enabled,e=e||s.ready&&s.enabled,e}},fxaa:{get:function(){return this._fxaa}},ambientOcclusion:{get:function(){return this._ao}},bloom:{get:function(){return this._bloom}},length:{get:function(){return p8(this),this._stages.length}},outputTexture:{get:function(){let e=this._fxaa;if(e.enabled&&e.ready)return this.getOutputTexture(e.name);let t=this._stages,n=t.length;for(let s=n-1;s>=0;--s){let a=t[s];if(l(a)&&a.ready&&a.enabled)return this.getOutputTexture(a.name)}let i=this._tonemapping;if(i.enabled&&i.ready)return this.getOutputTexture(i.name);let o=this._bloom;if(o.enabled&&o.ready)return this.getOutputTexture(o.name);let r=this._ao;if(r.enabled&&r.ready)return this.getOutputTexture(r.name)}},hasSelected:{get:function(){let e=this._stages.slice();for(;e.length>0;){let t=e.pop();if(!l(t))continue;if(l(t.selected))return!0;let n=t.length;if(l(n))for(let i=0;i<n;++i)e.push(t.get(i))}return!1}},tonemapper:{get:function(){return this._tonemapper},set:function(e){if(this._tonemapper===e)return;l(this._tonemapping)&&(delete this._stageNames[this._tonemapping.name],this._tonemapping.destroy());let t=this._autoExposureEnabled,n;switch(e){case Z0.REINHARD:n=nu.createReinhardTonemappingStage(t);break;case Z0.MODIFIED_REINHARD:n=nu.createModifiedReinhardTonemappingStage(t);break;case Z0.FILMIC:n=nu.createFilmicTonemappingStage(t);break;case Z0.PBR_NEUTRAL:n=nu.createPbrNeutralTonemappingStage(t);break;default:n=nu.createAcesTonemappingStage(t);break}if(t){let i=this._autoExposure;n.uniforms.autoExposure=function(){return i.outputTexture}}else n.uniforms.exposure=this._exposure;this._tonemapper=e,this._tonemapping=n,l(this._stageNames)&&(this._stageNames[n.name]=n,n._textureCache=this._textureCache),this._textureCacheDirty=!0}},exposure:{get:function(){return this._exposure},set:function(e){this._tonemapping.uniforms.exposure=e,this._exposure=e}}});function p8(e){if(!e._stagesRemoved)return;e._stagesRemoved=!1;let t=[],n=e._stages;for(let i=0,o=0;i<n.length;++i){let r=n[i];r&&(r._index=o++,t.push(r))}e._stages=t}xl.prototype.add=function(e){let t=this._stageNames,n=f8;for(n.push(e);n.length>0;){let o=n.pop();t[o.name]=o,o._textureCache=this._textureCache;let r=o.length;if(l(r))for(let s=0;s<r;++s)n.push(o.get(s))}let i=this._stages;return e._index=i.length,i.push(e),this._textureCacheDirty=!0,e};xl.prototype.remove=function(e){if(!this.contains(e))return!1;let t=this._stageNames,n=f8;for(n.push(e);n.length>0;){let i=n.pop();delete t[i.name];let o=i.length;if(l(o))for(let r=0;r<o;++r)n.push(i.get(r))}return this._stages[e._index]=void 0,this._stagesRemoved=!0,this._textureCacheDirty=!0,e._index=void 0,e._textureCache=void 0,e.destroy(),!0};xl.prototype.contains=function(e){return l(e)&&l(e._index)&&e._textureCache===this._textureCache};xl.prototype.get=function(e){return p8(this),this._stages[e]};xl.prototype.removeAll=function(){let e=this._stages,t=e.length;for(let n=0;n<t;++n)this.remove(e[n]);e.length=0};xl.prototype.getStageByName=function(e){return this._stageNames[e]};xl.prototype.update=function(e,t,n){p8(this);let i=this._activeStages,o=this._activeStages=this._previousActiveStages;this._previousActiveStages=i;let r=this._stages;o.length=r.length;let s=0;for(let C=0;C<r.length;++C){let V=r[C];V.ready&&V.enabled&&V._isSupported(e)&&(o[s++]=V)}o.length=s;let a=s!==i.length;if(!a){for(let C=0;C<s;++C)if(o[C]!==i[C]){a=!0;break}}let c=this._ao,d=this._bloom,u=this._autoExposure,h=this._tonemapping,p=this._fxaa;h.enabled=n;let g=c.enabled&&c._isSupported(e),f=d.enabled&&d._isSupported(e),x=h.enabled&&h._isSupported(e),_=p.enabled&&p._isSupported(e);if((a||this._textureCacheDirty||g!==this._aoEnabled||f!==this._bloomEnabled||x!==this._tonemappingEnabled||_!==this._fxaaEnabled)&&(this._textureCache.updateDependencies(),this._aoEnabled=g,this._bloomEnabled=f,this._tonemappingEnabled=x,this._fxaaEnabled=_,this._textureCacheDirty=!1),l(this._randomTexture)&&!g&&(this._randomTexture.destroy(),this._randomTexture=void 0),!l(this._randomTexture)&&g){let V=new Uint8Array(196608);for(let L=0;L<196608;L+=3)V[L]=Math.floor(Math.random()*255);this._randomTexture=new Wt({context:e,pixelFormat:ot.RGB,pixelDatatype:je.UNSIGNED_BYTE,source:{arrayBufferView:V,width:256,height:256},sampler:new $t({wrapS:Vn.REPEAT,wrapT:Vn.REPEAT,minificationFilter:qt.NEAREST,magnificationFilter:pi.NEAREST})})}this._textureCache.update(e),p.update(e,t),c.update(e,t),d.update(e,t),h.update(e,t),this._autoExposureEnabled&&u.update(e,t);for(let C=0;C<r.length;++C)r[C].update(e,t);s=0;for(let C=0;C<r.length;++C){let V=r[C];V.ready&&V.enabled&&V._isSupported(e)&&s++}a=s!==o.length,a&&this.update(e,t,n)};xl.prototype.clear=function(e){this._textureCache.clear(e),this._autoExposureEnabled&&this._autoExposure.clear(e)};function dS(e){for(;l(e.length);)e=e.get(e.length-1);return e.outputTexture}xl.prototype.getOutputTexture=function(e){let t=this.getStageByName(e);if(l(t))return dS(t)};function fp(e,t,n,i,o){if(l(e.execute)){e.execute(t,n,i,o);return}if(e.inputPreviousStageTexture){fp(e.get(0),t,n,i,o);for(let r=1;r<e.length;++r)fp(e.get(r),t,dS(e.get(r-1)),i,o)}else for(let r=0;r<e.length;++r)fp(e.get(r),t,n,i,o)}xl.prototype.execute=function(e,t,n,i){let o=this._activeStages,r=o.length,s=this._fxaa,a=this._ao,c=this._bloom,d=this._autoExposure,u=this._tonemapping,h=a.enabled&&a._isSupported(e),p=c.enabled&&c._isSupported(e),g=this._autoExposureEnabled,f=u.enabled&&u._isSupported(e),x=s.enabled&&s._isSupported(e);if(!x&&!h&&!p&&!f&&r===0)return;let _=t;h&&a.ready&&(fp(a,e,_,n,i),_=dS(a)),p&&c.ready&&(fp(c,e,_,n,i),_=dS(c)),g&&d.ready&&fp(d,e,_,n,i),f&&u.ready&&(fp(u,e,_,n,i),_=dS(u));let C=_;if(r>0){fp(o[0],e,_,n,i);for(let V=1;V<r;++V)fp(o[V],e,dS(o[V-1]),n,i);C=dS(o[r-1])}x&&s.ready&&fp(s,e,C,n,i)};xl.prototype.copy=function(e,t){if(!l(this._copyColorCommand)){let n=this;this._copyColorCommand=e.createViewportQuadCommand(od,{uniformMap:{colorTexture:function(){return n.outputTexture}},owner:this})}this._copyColorCommand.framebuffer=t,this._copyColorCommand.execute(e)};xl.prototype.isDestroyed=function(){return!1};xl.prototype.destroy=function(){return this._fxaa.destroy(),this._ao.destroy(),this._bloom.destroy(),this._autoExposure.destroy(),this._tonemapping.destroy(),this.removeAll(),this._textureCache=this._textureCache&&this._textureCache.destroy(),me(this)};var VA=xl;var Yki=T(S(),1);var Zki=T(S(),1);var fki=T(S(),1),fpt={SHIFT:0,CTRL:1,ALT:2},ca=Object.freeze(fpt);var bki=T(S(),1),ppt={LEFT_DOWN:0,LEFT_UP:1,LEFT_CLICK:2,LEFT_DOUBLE_CLICK:3,RIGHT_DOWN:5,RIGHT_UP:6,RIGHT_CLICK:7,MIDDLE_DOWN:10,MIDDLE_UP:11,MIDDLE_CLICK:12,MOUSE_MOVE:15,WHEEL:16,PINCH_START:17,PINCH_END:18,PINCH_MOVE:19},Sn=Object.freeze(ppt);function Dy(e,t,n){let i=e._element;if(i===document)return n.x=t.clientX,n.y=t.clientY,n;let o=i.getBoundingClientRect();return n.x=(t.clientX-o.left)*(i.offsetWidth/o.width),n.y=(t.clientY-o.top)*(i.offsetHeight/o.height),n}function T8(e,t){let n=e;return l(t)&&(n+=`+${t}`),n}function uS(e){if(e.shiftKey)return ca.SHIFT;if(e.ctrlKey)return ca.CTRL;if(e.altKey)return ca.ALT}var Ms={LEFT:0,MIDDLE:1,RIGHT:2};function iu(e,t,n,i){function o(r){i(e,r)}Ot.isInternetExplorer()?n.addEventListener(t,o,!1):n.addEventListener(t,o,{capture:!1,passive:!1}),e._removalFunctions.push(function(){n.removeEventListener(t,o,!1)})}function bpt(e){let t=e._element,n=l(t.disableRootEvents)?t:document;Ot.supportsPointerEvents()?(iu(e,"pointerdown",t,Spt),iu(e,"pointerup",t,E_e),iu(e,"pointermove",t,Cpt),iu(e,"pointercancel",t,E_e)):(iu(e,"mousedown",t,I_e),iu(e,"mouseup",n,X_e),iu(e,"mousemove",n,W_e),iu(e,"touchstart",t,_pt),iu(e,"touchend",n,V_e),iu(e,"touchmove",n,Tpt),iu(e,"touchcancel",n,V_e)),iu(e,"dblclick",t,ypt);let i;"onwheel"in t?i="wheel":document.onmousewheel!==void 0?i="mousewheel":i="DOMMouseScroll",iu(e,i,t,xpt)}function gpt(e){let t=e._removalFunctions;for(let n=0;n<t.length;++n)t[n]()}var __e={position:new D};function S8(e){e._lastSeenTouchEvent=Si()}function C8(e){return Si()-e._lastSeenTouchEvent>Yh.mouseEmulationIgnoreMilliseconds}function _8(e,t,n){let i=e.x-t.x,o=e.y-t.y;return Math.sqrt(i*i+o*o)<n}function I_e(e,t){if(!C8(e))return;let n=t.button;e._buttonDown[n]=!0;let i;if(n===Ms.LEFT)i=Sn.LEFT_DOWN;else if(n===Ms.MIDDLE)i=Sn.MIDDLE_DOWN;else if(n===Ms.RIGHT)i=Sn.RIGHT_DOWN;else return;let o=Dy(e,t,e._primaryPosition);D.clone(o,e._primaryStartPosition),D.clone(o,e._primaryPreviousPosition);let r=uS(t),s=e.getInputAction(i,r);l(s)&&(D.clone(o,__e.position),s(__e),t.preventDefault())}var T_e={position:new D},S_e={position:new D};function b8(e,t,n,i){let o=uS(i),r=e.getInputAction(t,o),s=e.getInputAction(n,o);if(l(r)||l(s)){let a=Dy(e,i,e._primaryPosition);if(l(r)&&(D.clone(a,T_e.position),r(T_e)),l(s)){let c=e._primaryStartPosition;_8(c,a,e._clickPixelTolerance)&&(D.clone(a,S_e.position),s(S_e))}}}function X_e(e,t){if(!C8(e))return;let n=t.button;n!==Ms.LEFT&&n!==Ms.MIDDLE&&n!==Ms.RIGHT||(e._buttonDown[Ms.LEFT]&&(b8(e,Sn.LEFT_UP,Sn.LEFT_CLICK,t),e._buttonDown[Ms.LEFT]=!1),e._buttonDown[Ms.MIDDLE]&&(b8(e,Sn.MIDDLE_UP,Sn.MIDDLE_CLICK,t),e._buttonDown[Ms.MIDDLE]=!1),e._buttonDown[Ms.RIGHT]&&(b8(e,Sn.RIGHT_UP,Sn.RIGHT_CLICK,t),e._buttonDown[Ms.RIGHT]=!1))}var g8={startPosition:new D,endPosition:new D};function W_e(e,t){if(!C8(e))return;let n=uS(t),i=Dy(e,t,e._primaryPosition),o=e._primaryPreviousPosition,r=e.getInputAction(Sn.MOUSE_MOVE,n);l(r)&&(D.clone(o,g8.startPosition),D.clone(i,g8.endPosition),r(g8)),D.clone(i,o),(e._buttonDown[Ms.LEFT]||e._buttonDown[Ms.MIDDLE]||e._buttonDown[Ms.RIGHT])&&t.preventDefault()}var C_e={position:new D};function ypt(e,t){let n=t.button,i;if(n===Ms.LEFT)i=Sn.LEFT_DOUBLE_CLICK;else return;let o=uS(t),r=e.getInputAction(i,o);l(r)&&(Dy(e,t,C_e.position),r(C_e))}function xpt(e,t){let n;if(l(t.deltaY)){let r=t.deltaMode;r===t.DOM_DELTA_PIXEL?n=-t.deltaY:r===t.DOM_DELTA_LINE?n=-t.deltaY*40:n=-t.deltaY*120}else t.detail>0?n=t.detail*-120:n=t.wheelDelta;if(!l(n))return;let i=uS(t),o=e.getInputAction(Sn.WHEEL,i);l(o)&&(o(n),t.preventDefault())}function _pt(e,t){S8(e);let n=t.changedTouches,i,o=n.length,r,s,a=e._positions;for(i=0;i<o;++i)r=n[i],s=r.identifier,a.set(s,Dy(e,r,new D));k3(e,t);let c=e._previousPositions;for(i=0;i<o;++i)r=n[i],s=r.identifier,c.set(s,D.clone(a.get(s)))}function V_e(e,t){S8(e);let n=t.changedTouches,i,o=n.length,r,s,a=e._positions;for(i=0;i<o;++i)r=n[i],s=r.identifier,a.remove(s);k3(e,t);let c=e._previousPositions;for(i=0;i<o;++i)r=n[i],s=r.identifier,c.remove(s)}var L_e={position:new D},y8={position1:new D,position2:new D},R_e={position:new D},Z_e={position:new D},G_e={position:new D};function k3(e,t){let n=uS(t),i=e._positions,o=i.length,r,s,a=e._isPinching;if(o!==1&&e._buttonDown[Ms.LEFT]){if(e._buttonDown[Ms.LEFT]=!1,l(e._touchHoldTimer)&&(clearTimeout(e._touchHoldTimer),e._touchHoldTimer=void 0),r=e.getInputAction(Sn.LEFT_UP,n),l(r)&&(D.clone(e._primaryPosition,R_e.position),r(R_e)),o===0&&!e._isTouchHolding&&(s=e.getInputAction(Sn.LEFT_CLICK,n),l(s))){let c=e._primaryStartPosition,d=e._previousPositions.values[0];_8(c,d,e._clickPixelTolerance)&&(D.clone(e._primaryPosition,Z_e.position),s(Z_e))}e._isTouchHolding=!1}if(o===0&&a&&(e._isPinching=!1,r=e.getInputAction(Sn.PINCH_END,n),l(r)&&r()),o===1&&!a){let c=i.values[0];D.clone(c,e._primaryPosition),D.clone(c,e._primaryStartPosition),D.clone(c,e._primaryPreviousPosition),e._buttonDown[Ms.LEFT]=!0,r=e.getInputAction(Sn.LEFT_DOWN,n),l(r)&&(D.clone(c,L_e.position),r(L_e)),e._touchHoldTimer=setTimeout(function(){if(!e.isDestroyed()&&(e._touchHoldTimer=void 0,e._isTouchHolding=!0,s=e.getInputAction(Sn.RIGHT_CLICK,n),l(s))){let d=e._primaryStartPosition,u=e._previousPositions.values[0];_8(d,u,e._holdPixelTolerance)&&(D.clone(e._primaryPosition,G_e.position),s(G_e))}},Yh.touchHoldDelayMilliseconds),t.preventDefault()}o===2&&!a&&(e._isPinching=!0,r=e.getInputAction(Sn.PINCH_START,n),l(r)&&(D.clone(i.values[0],y8.position1),D.clone(i.values[1],y8.position2),r(y8),t.preventDefault()))}function Tpt(e,t){S8(e);let n=t.changedTouches,i,o=n.length,r,s,a=e._positions;for(i=0;i<o;++i){r=n[i],s=r.identifier;let d=a.get(s);l(d)&&Dy(e,r,d)}P_e(e,t);let c=e._previousPositions;for(i=0;i<o;++i)r=n[i],s=r.identifier,D.clone(a.get(s),c.get(s))}var x8={startPosition:new D,endPosition:new D},LA={distance:{startPosition:new D,endPosition:new D},angleAndHeight:{startPosition:new D,endPosition:new D}};function P_e(e,t){let n=uS(t),i=e._positions,o=e._previousPositions,r=i.length,s;if(r===1&&e._buttonDown[Ms.LEFT]){let a=i.values[0];D.clone(a,e._primaryPosition);let c=e._primaryPreviousPosition;s=e.getInputAction(Sn.MOUSE_MOVE,n),l(s)&&(D.clone(c,x8.startPosition),D.clone(a,x8.endPosition),s(x8)),D.clone(a,c),t.preventDefault()}else if(r===2&&e._isPinching&&(s=e.getInputAction(Sn.PINCH_MOVE,n),l(s))){let a=i.values[0],c=i.values[1],d=o.values[0],u=o.values[1],h=c.x-a.x,p=c.y-a.y,g=Math.sqrt(h*h+p*p)*.25,f=u.x-d.x,x=u.y-d.y,_=Math.sqrt(f*f+x*x)*.25,C=(c.y+a.y)*.125,V=(u.y+d.y)*.125,L=Math.atan2(p,h),R=Math.atan2(x,f);D.fromElements(0,_,LA.distance.startPosition),D.fromElements(0,g,LA.distance.endPosition),D.fromElements(R,V,LA.angleAndHeight.startPosition),D.fromElements(L,C,LA.angleAndHeight.endPosition),s(LA)}}function Spt(e,t){if(t.target.setPointerCapture(t.pointerId),t.pointerType==="touch"){let n=e._positions,i=t.pointerId;n.set(i,Dy(e,t,new D)),k3(e,t),e._previousPositions.set(i,D.clone(n.get(i)))}else I_e(e,t)}function E_e(e,t){if(t.pointerType==="touch"){let n=e._positions,i=t.pointerId;n.remove(i),k3(e,t),e._previousPositions.remove(i)}else X_e(e,t)}function Cpt(e,t){if(t.pointerType==="touch"){let n=e._positions,i=t.pointerId,o=n.get(i);if(!l(o))return;Dy(e,t,o),P_e(e,t);let r=e._previousPositions;D.clone(n.get(i),r.get(i))}else W_e(e,t)}function Yh(e){this._inputEvents={},this._buttonDown={LEFT:!1,MIDDLE:!1,RIGHT:!1},this._isPinching=!1,this._isTouchHolding=!1,this._lastSeenTouchEvent=-Yh.mouseEmulationIgnoreMilliseconds,this._primaryStartPosition=new D,this._primaryPosition=new D,this._primaryPreviousPosition=new D,this._positions=new Et,this._previousPositions=new Et,this._removalFunctions=[],this._touchHoldTimer=void 0,this._clickPixelTolerance=5,this._holdPixelTolerance=25,this._element=y(e,document),bpt(this)}Yh.prototype.setInputAction=function(e,t,n){let i=T8(t,n);this._inputEvents[i]=e};Yh.prototype.getInputAction=function(e,t){let n=T8(e,t);return this._inputEvents[n]};Yh.prototype.removeInputAction=function(e,t){let n=T8(e,t);delete this._inputEvents[n]};Yh.prototype.isDestroyed=function(){return!1};Yh.prototype.destroy=function(){return gpt(this),me(this)};Yh.mouseEmulationIgnoreMilliseconds=800;Yh.touchHoldDelayMilliseconds=1500;var ou=Yh;function mS(e){this._scene=e,this._currentTweens=[],this._morphHandler=void 0,this._morphCancelled=!1,this._completeMorph=void 0,this._morphToOrthographic=!1}mS.prototype.completeMorph=function(){l(this._completeMorph)&&this._completeMorph()};mS.prototype.morphTo2D=function(e,t){l(this._completeMorph)&&this._completeMorph();let n=this._scene;this._previousMode=n.mode,this._morphToOrthographic=n.camera.frustum instanceof ln,!(this._previousMode===oe.SCENE2D||this._previousMode===oe.MORPHING)&&(this._scene.morphStart.raiseEvent(this,this._previousMode,oe.SCENE2D,!0),n._mode=oe.MORPHING,n.camera._setTransform(M.IDENTITY),this._previousMode===oe.COLUMBUS_VIEW?nbt(this,e):lbt(this,e,t),e===0&&l(this._completeMorph)&&this._completeMorph())};var Vpt=new m,Lpt=new m,Rpt=new m,Zpt=new m,Gpt=new m,Ept=new m,Ipt=new m,Xpt=new he,Wpt=new M,Ppt=new Gi,vpt=new ln,wpt={position:void 0,direction:void 0,up:void 0,position2D:void 0,direction2D:void 0,up2D:void 0,frustum:void 0};mS.prototype.morphToColumbusView=function(e,t){l(this._completeMorph)&&this._completeMorph();let n=this._scene;if(this._previousMode=n.mode,this._previousMode===oe.COLUMBUS_VIEW||this._previousMode===oe.MORPHING)return;this._scene.morphStart.raiseEvent(this,this._previousMode,oe.COLUMBUS_VIEW,!0),n.camera._setTransform(M.IDENTITY);let i=Vpt,o=Lpt,r=Rpt;if(e>0)i.x=0,i.y=-1,i.z=1,i=m.multiplyByScalar(m.normalize(i,i),5*t.maximumRadius,i),m.negate(m.normalize(i,o),o),m.cross(m.UNIT_X,o,r);else{let d=n.camera;if(this._previousMode===oe.SCENE2D)m.clone(d.position,i),i.z=d.frustum.right-d.frustum.left,m.negate(m.UNIT_Z,o),m.clone(m.UNIT_Y,r);else{m.clone(d.positionWC,i),m.clone(d.directionWC,o),m.clone(d.upWC,r);let u=t.scaleToGeodeticSurface(i,Ipt),h=wt.eastNorthUpToFixedFrame(u,t,Wpt);M.inverseTransformation(h,h),n.mapProjection.project(t.cartesianToCartographic(i,Xpt),i),M.multiplyByPointAsVector(h,o,o),M.multiplyByPointAsVector(h,r,r)}}let s;this._morphToOrthographic?(s=vpt,s.width=n.camera.frustum.right-n.camera.frustum.left,s.aspectRatio=n.drawingBufferWidth/n.drawingBufferHeight):(s=Ppt,s.aspectRatio=n.drawingBufferWidth/n.drawingBufferHeight,s.fov=W.toRadians(60));let a=wpt;a.position=i,a.direction=o,a.up=r,a.frustum=s;let c=ubt(a);RA(this,c),this._previousMode===oe.SCENE2D?dbt(this,e,a,c):(a.position2D=M.multiplyByPoint(co.TRANSFORM_2D,i,Zpt),a.direction2D=M.multiplyByPointAsVector(co.TRANSFORM_2D,o,Gpt),a.up2D=M.multiplyByPointAsVector(co.TRANSFORM_2D,r,Ept),n._mode=oe.MORPHING,O_e(this,e,a,c)),e===0&&l(this._completeMorph)&&this._completeMorph()};var R8={position:new m,direction:new m,up:new m,frustum:void 0},w_e=new Gi;mS.prototype.morphTo3D=function(e,t){l(this._completeMorph)&&this._completeMorph();let n=this._scene;if(this._previousMode=n.mode,!(this._previousMode===oe.SCENE3D||this._previousMode===oe.MORPHING)){if(this._scene.morphStart.raiseEvent(this,this._previousMode,oe.SCENE3D,!0),n._mode=oe.MORPHING,n.camera._setTransform(M.IDENTITY),this._previousMode===oe.SCENE2D)Hpt(this,e,t);else{let i;e>0?(i=R8,m.fromDegrees(0,0,5*t.maximumRadius,t,i.position),m.negate(i.position,i.direction),m.normalize(i.direction,i.direction),m.clone(m.UNIT_Z,i.up)):i=F_e(this,t);let o,r=n.camera;r.frustum instanceof ln?o=r.frustum.clone():(o=w_e,o.aspectRatio=n.drawingBufferWidth/n.drawingBufferHeight,o.fov=W.toRadians(60)),i.frustum=o;let s=H_e(i);RA(this,s),L8(this,e,i,s)}e===0&&l(this._completeMorph)&&this._completeMorph()}};mS.prototype.isDestroyed=function(){return!1};mS.prototype.destroy=function(){return U3(this),me(this)};function RA(e,t){if(e._scene.completeMorphOnUserInput){e._morphHandler=new ou(e._scene.canvas);let n=function(){e._morphCancelled=!0,e._scene.camera.cancelFlight(),t(e)};e._completeMorph=n,e._morphHandler.setInputAction(n,Sn.LEFT_DOWN),e._morphHandler.setInputAction(n,Sn.MIDDLE_DOWN),e._morphHandler.setInputAction(n,Sn.RIGHT_DOWN),e._morphHandler.setInputAction(n,Sn.WHEEL)}}function U3(e){let t=e._currentTweens;for(let n=0;n<t.length;++n)t[n].cancelTween();e._currentTweens.length=0,e._morphHandler=e._morphHandler&&e._morphHandler.destroy()}var Fpt=new he,Apt=new m,Mpt=new M;function F_e(e,t){let n=e._scene,i=n.camera,o=R8,r=o.position,s=o.direction,a=o.up,c=n.mapProjection.unproject(i.position,Fpt);t.cartographicToCartesian(c,r);let d=t.scaleToGeodeticSurface(r,Apt),u=wt.eastNorthUpToFixedFrame(d,t,Mpt);return M.multiplyByPointAsVector(u,i.direction,s),M.multiplyByPointAsVector(u,i.up,a),o}var Npt=new m,kpt=new m,Upt=new m,Dpt=new m,Bpt=new m,Opt=new m;function L8(e,t,n,i){t*=.5;let o=e._scene,r=o.camera,s=m.clone(r.position,Npt),a=m.clone(r.direction,kpt),c=m.clone(r.up,Upt),d=M.multiplyByPoint(co.TRANSFORM_2D_INVERSE,n.position,Dpt),u=M.multiplyByPointAsVector(co.TRANSFORM_2D_INVERSE,n.direction,Bpt),h=M.multiplyByPointAsVector(co.TRANSFORM_2D_INVERSE,n.up,Opt);function p(f){ym(s,d,f.time,r.position),ym(a,u,f.time,r.direction),ym(c,h,f.time,r.up),m.cross(r.direction,r.up,r.right),m.normalize(r.right,r.right)}let g=o.tweens.add({duration:t,easingFunction:Qr.QUARTIC_OUT,startObject:{time:0},stopObject:{time:1},update:p,complete:function(){Y_e(e,o,0,1,t,i)}});e._currentTweens.push(g)}var Ypt=new ln,A_e=new m,M_e=new m,N_e=new m,Z8=new m,k_e=new m,U_e=new m;function Hpt(e,t,n){t/=3;let i=e._scene,o=i.camera,r;t>0?(r=R8,m.fromDegrees(0,0,5*n.maximumRadius,n,r.position),m.negate(r.position,r.direction),m.normalize(r.direction,r.direction),m.clone(m.UNIT_Z,r.up)):(o.position.z=o.frustum.right-o.frustum.left,r=F_e(e,n));let s;e._morphToOrthographic?(s=Ypt,s.aspectRatio=i.drawingBufferWidth/i.drawingBufferHeight,s.width=o.frustum.right-o.frustum.left):(s=w_e,s.aspectRatio=i.drawingBufferWidth/i.drawingBufferHeight,s.fov=W.toRadians(60)),r.frustum=s;let a=H_e(r);RA(e,a);let c;e._morphToOrthographic?c=function(){L8(e,t,r,a)}:c=function(){B_e(e,t,r,function(){L8(e,t,r,a)})},t>0?(i._mode=oe.SCENE2D,o.flyTo({duration:t,destination:m.fromDegrees(0,0,5*n.maximumRadius,n,Z8),complete:function(){i._mode=oe.MORPHING,c()}})):c()}function ym(e,t,n,i){return m.lerp(e,t,n,i)}function D_e(e,t,n,i,o){let r=e._scene,s=r.camera;if(s.frustum instanceof ln)return;let a=s.frustum.fov,c=W.RADIANS_PER_DEGREE*.5,d=n.position.z*Math.tan(a*.5);s.frustum.far=d/Math.tan(c*.5)+1e7;function u(p){s.frustum.fov=W.lerp(a,c,p.time);let g=d/Math.tan(s.frustum.fov*.5);i(s,g)}let h=r.tweens.add({duration:t,easingFunction:Qr.QUARTIC_OUT,startObject:{time:0},stopObject:{time:1},update:u,complete:function(){s.frustum=n.frustum.clone(),o(e)}});e._currentTweens.push(h)}var zpt=new m,Kpt=new m,Jpt=new m,V8=new m,Qpt=new m,jpt=new m,qpt=new Mr,$pt=new gn,ebt=new m,tbt={position:void 0,direction:void 0,up:void 0,frustum:void 0};function nbt(e,t){t*=.5;let n=e._scene,i=n.camera,o=m.clone(i.position,zpt),r=m.clone(i.direction,Kpt),s=m.clone(i.up,Jpt),a=m.negate(m.UNIT_Z,Qpt),c=m.clone(m.UNIT_Y,jpt),d=V8;if(t>0)m.clone(m.ZERO,V8),d.z=5*n.ellipsoid.maximumRadius;else{m.clone(o,V8);let _=$pt;M.multiplyByPoint(co.TRANSFORM_2D,o,_.origin),M.multiplyByPointAsVector(co.TRANSFORM_2D,r,_.direction);let C=n.globe;if(l(C)){let V=C.pickWorldCoordinates(_,n,!0,ebt);l(V)&&(M.multiplyByPoint(co.TRANSFORM_2D_INVERSE,V,d),d.z+=m.distance(o,d))}}let u=qpt;u.right=d.z*.5,u.left=-u.right,u.top=u.right*(n.drawingBufferHeight/n.drawingBufferWidth),u.bottom=-u.top;let h=tbt;h.position=d,h.direction=a,h.up=c,h.frustum=u;let p=z_e(h);RA(e,p);function g(_){ym(o,d,_.time,i.position),ym(r,a,_.time,i.direction),ym(s,c,_.time,i.up),m.cross(i.direction,i.up,i.right),m.normalize(i.right,i.right),i._adjustOrthographicFrustum(!0)}function f(_,C){_.position.z=C}let x=n.tweens.add({duration:t,easingFunction:Qr.QUARTIC_OUT,startObject:{time:0},stopObject:{time:1},update:g,complete:function(){D_e(e,t,h,f,p)}});e._currentTweens.push(x)}var v_e=new he,ibt={position:new m,direction:new m,up:new m,position2D:new m,direction2D:new m,up2D:new m,frustum:new Mr},obt={position:new m,direction:new m,up:new m,frustum:void 0},rbt=new m,sbt=new gn,abt=new M,cbt=new m;function lbt(e,t,n){t*=.5;let i=e._scene,o=i.camera,r=ibt;if(t>0)m.clone(m.ZERO,r.position),r.position.z=5*n.maximumRadius,m.negate(m.UNIT_Z,r.direction),m.clone(m.UNIT_Y,r.up);else{n.cartesianToCartographic(o.positionWC,v_e),i.mapProjection.project(v_e,r.position),m.negate(m.UNIT_Z,r.direction),m.clone(m.UNIT_Y,r.up);let h=sbt;m.clone(r.position2D,h.origin);let p=m.clone(o.directionWC,h.direction),g=n.scaleToGeodeticSurface(o.positionWC,cbt),f=wt.eastNorthUpToFixedFrame(g,n,abt);M.inverseTransformation(f,f),M.multiplyByPointAsVector(f,p,p),M.multiplyByPointAsVector(co.TRANSFORM_2D,p,p);let x=i.globe;if(l(x)){let _=x.pickWorldCoordinates(h,i,!0,rbt);if(l(_)){let C=m.distance(r.position2D,_);_.x+=C,m.clone(_,r.position2D)}}}function s(h,p){h.position.x=p}M.multiplyByPoint(co.TRANSFORM_2D,r.position,r.position2D),M.multiplyByPointAsVector(co.TRANSFORM_2D,r.direction,r.direction2D),M.multiplyByPointAsVector(co.TRANSFORM_2D,r.up,r.up2D);let a=r.frustum;a.right=r.position.z*.5,a.left=-a.right,a.top=a.right*(i.drawingBufferHeight/i.drawingBufferWidth),a.bottom=-a.top;let c=obt;M.multiplyByPoint(co.TRANSFORM_2D_INVERSE,r.position2D,c.position),m.clone(r.direction,c.direction),m.clone(r.up,c.up),c.frustum=a;let d=z_e(c);RA(e,d);function u(){D_e(e,t,r,s,d)}O_e(e,t,r,u)}function B_e(e,t,n,i){let o=e._scene,r=o.camera,s=r.frustum.right-r.frustum.left;r.frustum=n.frustum.clone();let a=r.frustum.fov,c=W.RADIANS_PER_DEGREE*.5,d=s*Math.tan(a*.5);r.frustum.far=d/Math.tan(c*.5)+1e7,r.frustum.fov=c;function u(p){r.frustum.fov=W.lerp(c,a,p.time),r.position.z=d/Math.tan(r.frustum.fov*.5)}let h=o.tweens.add({duration:t,easingFunction:Qr.QUARTIC_OUT,startObject:{time:0},stopObject:{time:1},update:u,complete:function(){i(e)}});e._currentTweens.push(h)}function dbt(e,t,n,i){t*=.5;let o=e._scene,r=o.camera,s=m.clone(n.position,Z8),a=m.clone(n.direction,k_e),c=m.clone(n.up,U_e);o._mode=oe.MORPHING;function d(){r.frustum=n.frustum.clone();let u=m.clone(r.position,A_e),h=m.clone(r.direction,M_e),p=m.clone(r.up,N_e);u.z=s.z;function g(x){ym(u,s,x.time,r.position),ym(h,a,x.time,r.direction),ym(p,c,x.time,r.up),m.cross(r.direction,r.up,r.right),m.normalize(r.right,r.right)}let f=o.tweens.add({duration:t,easingFunction:Qr.QUARTIC_OUT,startObject:{time:0},stopObject:{time:1},update:g,complete:function(){i(e)}});e._currentTweens.push(f)}e._morphToOrthographic?d():B_e(e,0,n,d)}function O_e(e,t,n,i){let o=e._scene,r=o.camera,s=m.clone(r.position,A_e),a=m.clone(r.direction,M_e),c=m.clone(r.up,N_e),d=m.clone(n.position2D,Z8),u=m.clone(n.direction2D,k_e),h=m.clone(n.up2D,U_e);function p(f){ym(s,d,f.time,r.position),ym(a,u,f.time,r.direction),ym(c,h,f.time,r.up),m.cross(r.direction,r.up,r.right),m.normalize(r.right,r.right),r._adjustOrthographicFrustum(!0)}let g=o.tweens.add({duration:t,easingFunction:Qr.QUARTIC_OUT,startObject:{time:0},stopObject:{time:1},update:p,complete:function(){Y_e(e,o,1,0,t,i)}});e._currentTweens.push(g)}function Y_e(e,t,n,i,o,r){let s={object:t,property:"morphTime",startValue:n,stopValue:i,duration:o,easingFunction:Qr.QUARTIC_OUT};l(r)&&(s.complete=function(){r(e)});let a=t.tweens.addProperty(s);e._currentTweens.push(a)}function H_e(e){return function(t){let n=t._scene;n._mode=oe.SCENE3D,n.morphTime=oe.getMorphTime(oe.SCENE3D),U3(t);let i=n.camera;(t._previousMode!==oe.MORPHING||t._morphCancelled)&&(t._morphCancelled=!1,m.clone(e.position,i.position),m.clone(e.direction,i.direction),m.clone(e.up,i.up),m.cross(i.direction,i.up,i.right),m.normalize(i.right,i.right),i.frustum=e.frustum.clone());let o=i.frustum;n.frameState.useLogDepth&&(o.near=.1,o.far=1e10);let r=l(t._completeMorph);t._completeMorph=void 0,n.camera.update(n.mode),t._scene.morphComplete.raiseEvent(t,t._previousMode,oe.SCENE3D,r)}}function z_e(e){return function(t){let n=t._scene;n._mode=oe.SCENE2D,n.morphTime=oe.getMorphTime(oe.SCENE2D),U3(t);let i=n.camera;m.clone(e.position,i.position),i.position.z=n.ellipsoid.maximumRadius*2,m.clone(e.direction,i.direction),m.clone(e.up,i.up),m.cross(i.direction,i.up,i.right),m.normalize(i.right,i.right),i.frustum=e.frustum.clone();let o=l(t._completeMorph);t._completeMorph=void 0,n.camera.update(n.mode),t._scene.morphComplete.raiseEvent(t,t._previousMode,oe.SCENE2D,o)}}function ubt(e){return function(t){let n=t._scene;n._mode=oe.COLUMBUS_VIEW,n.morphTime=oe.getMorphTime(oe.COLUMBUS_VIEW),U3(t);let i=n.camera;(t._previousModeMode!==oe.MORPHING||t._morphCancelled)&&(t._morphCancelled=!1,m.clone(e.position,i.position),m.clone(e.direction,i.direction),m.clone(e.up,i.up),m.cross(i.direction,i.up,i.right),m.normalize(i.right,i.right));let o=i.frustum;n.frameState.useLogDepth&&(o.near=.1,o.far=1e10);let r=l(t._completeMorph);t._completeMorph=void 0,n.camera.update(n.mode),t._scene.morphComplete.raiseEvent(t,t._previousMode,oe.COLUMBUS_VIEW,r)}}var ZA=mS;var kUi=T(S(),1);var iUi=T(S(),1);var zki=T(S(),1),mbt={LEFT_DRAG:0,RIGHT_DRAG:1,MIDDLE_DRAG:2,WHEEL:3,PINCH:4},Mi=Object.freeze(mbt);function la(e,t){let n=`${e}`;return l(t)&&(n+=`+${t}`),n}function hbt(e,t){D.clone(e.distance.startPosition,t.distance.startPosition),D.clone(e.distance.endPosition,t.distance.endPosition),D.clone(e.angleAndHeight.startPosition,t.angleAndHeight.startPosition),D.clone(e.angleAndHeight.endPosition,t.angleAndHeight.endPosition)}function K_e(e,t,n){let i=la(Mi.PINCH,t),o=e._update,r=e._isDown,s=e._eventStartPosition,a=e._pressTime,c=e._releaseTime;o[i]=!0,r[i]=!1,s[i]=new D;let d=e._movement[i];l(d)||(d=e._movement[i]={}),d.distance={startPosition:new D,endPosition:new D},d.angleAndHeight={startPosition:new D,endPosition:new D},d.prevAngle=0,e._eventHandler.setInputAction(function(u){e._buttonsDown++,r[i]=!0,a[i]=new Date,D.lerp(u.position1,u.position2,.5,s[i])},Sn.PINCH_START,t),e._eventHandler.setInputAction(function(){e._buttonsDown=Math.max(e._buttonsDown-1,0),r[i]=!1,c[i]=new Date},Sn.PINCH_END,t),e._eventHandler.setInputAction(function(u){if(r[i]){o[i]?(hbt(u,d),o[i]=!1,d.prevAngle=d.angleAndHeight.startPosition.x):(D.clone(u.distance.endPosition,d.distance.endPosition),D.clone(u.angleAndHeight.endPosition,d.angleAndHeight.endPosition));let h=d.angleAndHeight.endPosition.x,p=d.prevAngle,g=Math.PI*2;for(;h>=p+Math.PI;)h-=g;for(;h<p-Math.PI;)h+=g;d.angleAndHeight.endPosition.x=-h*n.clientWidth/12,d.angleAndHeight.startPosition.x=-p*n.clientWidth/12}},Sn.PINCH_MOVE,t)}function J_e(e,t){let n=la(Mi.WHEEL,t),i=e._pressTime,o=e._releaseTime,r=e._update;r[n]=!0;let s=e._movement[n];l(s)||(s=e._movement[n]={});let a=e._lastMovement[n];l(a)||(a=e._lastMovement[n]={startPosition:new D,endPosition:new D,valid:!1}),s.startPosition=new D,D.clone(D.ZERO,s.startPosition),s.endPosition=new D,e._eventHandler.setInputAction(function(c){let d=7.5*W.toRadians(c);i[n]=o[n]=new Date,s.endPosition.x=0,s.endPosition.y=d,D.clone(s.endPosition,a.endPosition),a.valid=!0,r[n]=!1},Sn.WHEEL,t)}function CL(e,t,n){let i=la(n,t),o=e._isDown,r=e._eventStartPosition,s=e._pressTime;o[i]=!1,r[i]=new D;let a=e._lastMovement[i];l(a)||(a=e._lastMovement[i]={startPosition:new D,endPosition:new D,valid:!1});let c,d;n===Mi.LEFT_DRAG?(c=Sn.LEFT_DOWN,d=Sn.LEFT_UP):n===Mi.RIGHT_DRAG?(c=Sn.RIGHT_DOWN,d=Sn.RIGHT_UP):n===Mi.MIDDLE_DRAG&&(c=Sn.MIDDLE_DOWN,d=Sn.MIDDLE_UP),e._eventHandler.setInputAction(function(u){e._buttonsDown++,a.valid=!1,o[i]=!0,s[i]=new Date,D.clone(u.position,r[i])},c,t),e._eventHandler.setInputAction(function(){G8(la(n,void 0),e);for(let u of Object.values(ca)){let h=la(n,u);G8(h,e)}},d,t)}function G8(e,t){let n=t._releaseTime,i=t._isDown;i[e]&&(t._buttonsDown=Math.max(t._buttonsDown-1,0)),i[e]=!1,n[e]=new Date}function Q_e(e,t){D.clone(e.startPosition,t.startPosition),D.clone(e.endPosition,t.endPosition)}function fbt(e,t,n){let i=n._isDown,o=!1,r=la(e,t);for(let[c,d]of Object.entries(i))c.startsWith(e)&&d&&c!==r&&(o=!0,G8(c,n));if(!o)return;let s=n._pressTime,a=n._lastMovement[r];l(a)||(a=n._lastMovement[r]={startPosition:new D,endPosition:new D,valid:!1}),n._buttonsDown++,a.valid=!1,i[r]=!0,s[r]=new Date}function j_e(e,t){let n=e._update,i=e._movement,o=e._lastMovement,r=e._isDown;for(let s in Mi)if(Mi.hasOwnProperty(s)){let a=Mi[s];if(l(a)){let c=la(a,t);n[c]=!0,l(e._lastMovement[c])||(e._lastMovement[c]={startPosition:new D,endPosition:new D,valid:!1}),l(e._movement[c])||(e._movement[c]={startPosition:new D,endPosition:new D})}}e._eventHandler.setInputAction(function(s){for(let a in Mi)if(Mi.hasOwnProperty(a)){let c=Mi[a];if(l(c)){let d=la(c,t);fbt(c,t,e),r[d]&&(n[d]?(Q_e(i[d],o[d]),o[d].valid=!0,Q_e(s,i[d]),n[d]=!1):D.clone(s.endPosition,i[d].endPosition))}}D.clone(s.endPosition,e._currentMousePosition)},Sn.MOUSE_MOVE,t)}function xm(e){this._eventHandler=new ou(e),this._update={},this._movement={},this._lastMovement={},this._isDown={},this._eventStartPosition={},this._pressTime={},this._releaseTime={},this._buttonsDown=0,this._currentMousePosition=new D,J_e(this,void 0),K_e(this,void 0,e),CL(this,void 0,Mi.LEFT_DRAG),CL(this,void 0,Mi.RIGHT_DRAG),CL(this,void 0,Mi.MIDDLE_DRAG),j_e(this,void 0);for(let t in ca)if(ca.hasOwnProperty(t)){let n=ca[t];l(n)&&(J_e(this,n),K_e(this,n,e),CL(this,n,Mi.LEFT_DRAG),CL(this,n,Mi.RIGHT_DRAG),CL(this,n,Mi.MIDDLE_DRAG),j_e(this,n))}}Object.defineProperties(xm.prototype,{currentMousePosition:{get:function(){return this._currentMousePosition}},anyButtonDown:{get:function(){let e=!this._update[la(Mi.WHEEL)]||!this._update[la(Mi.WHEEL,ca.SHIFT)]||!this._update[la(Mi.WHEEL,ca.CTRL)]||!this._update[la(Mi.WHEEL,ca.ALT)];return this._buttonsDown>0||e}}});xm.prototype.isMoving=function(e,t){let n=la(e,t);return!this._update[n]};xm.prototype.getMovement=function(e,t){let n=la(e,t);return this._movement[n]};xm.prototype.getLastMovement=function(e,t){let n=la(e,t),i=this._lastMovement[n];if(i.valid)return i};xm.prototype.isButtonDown=function(e,t){let n=la(e,t);return this._isDown[n]};xm.prototype.getStartMousePosition=function(e,t){if(e===Mi.WHEEL)return this._currentMousePosition;let n=la(e,t);return this._eventStartPosition[n]};xm.prototype.getButtonPressTime=function(e,t){let n=la(e,t);return this._pressTime[n]};xm.prototype.getButtonReleaseTime=function(e,t){let n=la(e,t);return this._releaseTime[n]};xm.prototype.reset=function(){for(let e in this._update)this._update.hasOwnProperty(e)&&(this._update[e]=!0)};xm.prototype.isDestroyed=function(){return!1};xm.prototype.destroy=function(){return this._eventHandler=this._eventHandler&&this._eventHandler.destroy(),me(this)};var GA=xm;var mUi=T(S(),1);function D3(e,t,n,i,o,r,s,a,c,d){this._tweens=e,this._tweenjs=t,this._startObject=Oe(n),this._stopObject=Oe(i),this._duration=o,this._delay=r,this._easingFunction=s,this._update=a,this._complete=c,this.cancel=d,this.needsStart=!0}Object.defineProperties(D3.prototype,{startObject:{get:function(){return this._startObject}},stopObject:{get:function(){return this._stopObject}},duration:{get:function(){return this._duration}},delay:{get:function(){return this._delay}},easingFunction:{get:function(){return this._easingFunction}},update:{get:function(){return this._update}},complete:{get:function(){return this._complete}},tweenjs:{get:function(){return this._tweenjs}}});D3.prototype.cancelTween=function(){this._tweens.remove(this)};function Hh(){this._tweens=[]}Object.defineProperties(Hh.prototype,{length:{get:function(){return this._tweens.length}}});Hh.prototype.add=function(e){if(e=y(e,y.EMPTY_OBJECT),e.duration===0)return l(e.complete)&&e.complete(),new D3(this);let t=e.duration/Qn.SECONDS_PER_MILLISECOND,n=y(e.delay,0),i=n/Qn.SECONDS_PER_MILLISECOND,o=y(e.easingFunction,Qr.LINEAR_NONE),r=e.startObject,s=new g0e(r);s.to(Oe(e.stopObject),t),s.delay(i),s.easing(o),l(e.update)&&s.onUpdate(function(){e.update(r)}),s.onComplete(y(e.complete,null)),s.repeat(y(e._repeat,0));let a=new D3(this,s,e.startObject,e.stopObject,e.duration,n,o,e.update,e.complete,e.cancel);return this._tweens.push(a),a};Hh.prototype.addProperty=function(e){e=y(e,y.EMPTY_OBJECT);let t=e.object,n=e.property,i=e.startValue,o=e.stopValue;function r(s){t[n]=s.value}return this.add({startObject:{value:i},stopObject:{value:o},duration:y(e.duration,3),delay:e.delay,easingFunction:e.easingFunction,update:r,complete:e.complete,cancel:e.cancel,_repeat:e._repeat})};Hh.prototype.addAlpha=function(e){e=y(e,y.EMPTY_OBJECT);let t=e.material,n=[];for(let o in t.uniforms)t.uniforms.hasOwnProperty(o)&&l(t.uniforms[o])&&l(t.uniforms[o].alpha)&&n.push(o);function i(o){let r=n.length;for(let s=0;s<r;++s)t.uniforms[n[s]].alpha=o.alpha}return this.add({startObject:{alpha:y(e.startValue,0)},stopObject:{alpha:y(e.stopValue,1)},duration:y(e.duration,3),delay:e.delay,easingFunction:e.easingFunction,update:i,complete:e.complete,cancel:e.cancel})};Hh.prototype.addOffsetIncrement=function(e){e=y(e,y.EMPTY_OBJECT);let n=e.material.uniforms;return this.addProperty({object:n,property:"offset",startValue:n.offset,stopValue:n.offset+1,duration:e.duration,delay:e.delay,easingFunction:e.easingFunction,update:e.update,cancel:e.cancel,_repeat:1/0})};Hh.prototype.remove=function(e){if(!l(e))return!1;let t=this._tweens.indexOf(e);return t!==-1?(e.tweenjs.stop(),l(e.cancel)&&e.cancel(),this._tweens.splice(t,1),!0):!1};Hh.prototype.removeAll=function(){let e=this._tweens;for(let t=0;t<e.length;++t){let n=e[t];n.tweenjs.stop(),l(n.cancel)&&n.cancel()}e.length=0};Hh.prototype.contains=function(e){return l(e)&&this._tweens.indexOf(e)!==-1};Hh.prototype.get=function(e){return this._tweens[e]};Hh.prototype.update=function(e){let t=this._tweens,n=0;for(e=l(e)?e/Qn.SECONDS_PER_MILLISECOND:Si();n<t.length;){let i=t[n],o=i.tweenjs;i.needsStart?(i.needsStart=!1,o.start(e)):o.update(e)?n++:(o.stop(),t.splice(n,1))}};var hS=Hh;function IA(e){this.enableInputs=!0,this.enableTranslate=!0,this.enableZoom=!0,this.enableRotate=!0,this.enableTilt=!0,this.enableLook=!0,this.inertiaSpin=.9,this.inertiaTranslate=.9,this.inertiaZoom=.8,this.maximumMovementRatio=.1,this.bounceAnimationTime=3,this.minimumZoomDistance=1,this.maximumZoomDistance=Number.POSITIVE_INFINITY,this.zoomFactor=5,this.translateEventTypes=Mi.LEFT_DRAG,this.zoomEventTypes=[Mi.RIGHT_DRAG,Mi.WHEEL,Mi.PINCH],this.rotateEventTypes=Mi.LEFT_DRAG,this.tiltEventTypes=[Mi.MIDDLE_DRAG,Mi.PINCH,{eventType:Mi.LEFT_DRAG,modifier:ca.CTRL},{eventType:Mi.RIGHT_DRAG,modifier:ca.CTRL}],this.lookEventTypes={eventType:Mi.LEFT_DRAG,modifier:ca.SHIFT};let t=y(e.ellipsoid,ne.default);this.minimumPickingTerrainHeight=ne.WGS84.equals(t)?15e4:t.minimumRadius*.025,this._minimumPickingTerrainHeight=this.minimumPickingTerrainHeight,this.minimumPickingTerrainDistanceWithInertia=ne.WGS84.equals(t)?4e3:t.minimumRadius*63e-5,this.minimumCollisionTerrainHeight=ne.WGS84.equals(t)?15e3:t.minimumRadius*.0025,this._minimumCollisionTerrainHeight=this.minimumCollisionTerrainHeight,this.minimumTrackBallHeight=ne.WGS84.equals(t)?75e5:t.minimumRadius*1.175,this._minimumTrackBallHeight=this.minimumTrackBallHeight,this.enableCollisionDetection=!0,this.maximumTiltAngle=void 0,this._scene=e,this._globe=void 0,this._ellipsoid=t,this._lastGlobeHeight=0,this._aggregator=new GA(e.canvas),this._lastInertiaSpinMovement=void 0,this._lastInertiaZoomMovement=void 0,this._lastInertiaTranslateMovement=void 0,this._lastInertiaTiltMovement=void 0,this._inertiaDisablers={_lastInertiaZoomMovement:["_lastInertiaSpinMovement","_lastInertiaTranslateMovement","_lastInertiaTiltMovement"],_lastInertiaTiltMovement:["_lastInertiaSpinMovement","_lastInertiaTranslateMovement"]},this._tweens=new hS,this._tween=void 0,this._horizontalRotationAxis=void 0,this._tiltCenterMousePosition=new D(-1,-1),this._tiltCenter=new m,this._rotateMousePosition=new D(-1,-1),this._rotateStartPosition=new m,this._strafeStartPosition=new m,this._strafeMousePosition=new D,this._strafeEndMousePosition=new D,this._zoomMouseStart=new D(-1,-1),this._zoomWorldPosition=new m,this._useZoomWorldPosition=!1,this._panLastMousePosition=new D,this._panLastWorldPosition=new m,this._tiltCVOffMap=!1,this._looking=!1,this._rotating=!1,this._strafing=!1,this._zoomingOnVector=!1,this._zoomingUnderground=!1,this._rotatingZoom=!1,this._adjustedHeightForTerrain=!1,this._cameraUnderground=!1;let n=e.mapProjection;this._maxCoord=n.project(new he(Math.PI,W.PI_OVER_TWO)),this._rotateFactor=void 0,this._rotateRateRangeAdjustment=void 0,this._maximumRotateRate=1.77,this._minimumRotateRate=1/5e3,this._minimumZoomRate=20,this._maximumZoomRate=5906376272e3,this._minimumUndergroundPickDistance=2e3,this._maximumUndergroundPickDistance=1e4}function pbt(e,t){if(e<0)return 0;let n=(1-t)*25;return Math.exp(-n*e)}function bbt(e){return D.equalsEpsilon(e.startPosition,e.endPosition,W.EPSILON14)}var gbt=.4;function ybt(e,t,n,i,o,r,s){let a=r[s];l(a)||(a=r[s]={startPosition:new D,endPosition:new D,motion:new D,inertiaEnabled:!0});let c=e.getButtonPressTime(t,n),d=e.getButtonReleaseTime(t,n),u=c&&d&&(d.getTime()-c.getTime())/1e3,p=d&&(new Date().getTime()-d.getTime())/1e3;if(c&&d&&u<gbt){let g=pbt(p,i),f=e.getLastMovement(t,n);if(!l(f)||bbt(f)||!a.inertiaEnabled||(a.motion.x=(f.endPosition.x-f.startPosition.x)*.5,a.motion.y=(f.endPosition.y-f.startPosition.y)*.5,a.startPosition=D.clone(f.startPosition,a.startPosition),a.endPosition=D.multiplyByScalar(a.motion,g,a.endPosition),a.endPosition=D.add(a.startPosition,a.endPosition,a.endPosition),isNaN(a.endPosition.x)||isNaN(a.endPosition.y)||D.distance(a.startPosition,a.endPosition)<.5))return;if(!e.isButtonDown(t,n)){let x=e.getStartMousePosition(t,n);o(r,x,a)}}}function xbt(e,t){if(l(t)){let n=e[t];l(n)&&(n.inertiaEnabled=!0);let i=e._inertiaDisablers[t];if(l(i)){let o=i.length;for(let r=0;r<o;++r)n=e[i[r]],l(n)&&(n.inertiaEnabled=!1)}}}var q_e=[];function _l(e,t,n,i,o,r){if(!l(n))return;let s=e._aggregator;Array.isArray(n)||(q_e[0]=n,n=q_e);let a=n.length;for(let c=0;c<a;++c){let d=n[c],u=l(d.eventType)?d.eventType:d,h=d.modifier,p=s.isMoving(u,h)&&s.getMovement(u,h),g=s.getStartMousePosition(u,h);e.enableInputs&&t&&(p?(i(e,g,p),xbt(e,r)):o<1&&ybt(s,u,h,o,i,e,r))}}var B3=new gn,_bt=new m,Tbt=new D,Sbt=new m,Cbt=new D,Vbt=new m,Lbt=new m,Rbt=new m,Zbt=new m,dTe=new m,Gbt=new m,Ebt=new m,Ibt=new m,Xbt=new m,Wbt=new m,Pbt=new m,vbt=new m,wbt=new m,Fbt=new m,Abt=new m,fS=new m,$_e=new m,eTe=new m,E8={orientation:new Xa};function A8(e,t,n,i,o,r){let s=1;l(r)&&(s=W.clamp(Math.abs(r),.25,1));let a=n.endPosition.y-n.startPosition.y,d=a>0?e.minimumZoomDistance*s:0,u=e.maximumZoomDistance,h=o-d,p=i*h;p=W.clamp(p,e._minimumZoomRate,e._maximumZoomRate);let g=a/e._scene.canvas.clientHeight;g=Math.min(g,e.maximumMovementRatio);let f=p*g;if(e.enableCollisionDetection||e.minimumZoomDistance===0||!l(e._globe)){if(f>0&&Math.abs(o-d)<1||f<0&&Math.abs(o-u)<1)return;o-f<d?f=o-d-1:o-f>u&&(f=o-u)}let x=e._scene,_=x.camera,C=x.mode,V=E8.orientation;V.heading=_.heading,V.pitch=_.pitch,V.roll=_.roll;let L=y(n.inertiaEnabled,D.equals(t,e._zoomMouseStart)),R=e._zoomingOnVector,G=e._rotatingZoom,I;if(L||(e._zoomMouseStart=D.clone(t,e._zoomMouseStart),l(e._globe)&&C===oe.SCENE2D?(I=_.getPickRay(t,B3).origin,I=m.fromElements(I.y,I.z,I.x)):l(e._globe)&&(I=G0(e,t,_bt)),l(I)?(e._useZoomWorldPosition=!0,e._zoomWorldPosition=m.clone(I,e._zoomWorldPosition)):e._useZoomWorldPosition=!1,R=e._zoomingOnVector=!1,G=e._rotatingZoom=!1,e._zoomingUnderground=e._cameraUnderground),!e._useZoomWorldPosition){_.zoomIn(f);return}let v=C===oe.COLUMBUS_VIEW;if(_.positionCartographic.height<2e6&&(G=!0),!L||G){if(C===oe.SCENE2D){let P=e._zoomWorldPosition,w=_.position;if(!m.equals(P,w)&&_.positionCartographic.height<e._maxCoord.x*2){let A=_.position.x,b=m.subtract(P,w,Sbt);m.normalize(b,b);let Z=m.distance(P,w)*f/(_.getMagnitude()*.5);_.move(b,Z*.5),(_.position.x<0&&A>0||_.position.x>0&&A<0)&&(I=_.getPickRay(t,B3).origin,I=m.fromElements(I.y,I.z,I.x),e._zoomWorldPosition=m.clone(I,e._zoomWorldPosition))}}else if(C===oe.SCENE3D){let P=m.normalize(_.position,dTe);if(e._cameraUnderground||e._zoomingUnderground||_.positionCartographic.height<3e3&&Math.abs(m.dot(_.direction,P))<.6)v=!0;else{let w=x.canvas,A=Cbt;A.x=w.clientWidth/2,A.y=w.clientHeight/2;let b=G0(e,A,Vbt);if(!l(b))v=!0;else if(_.positionCartographic.height<1e6)if(m.dot(_.direction,P)>=-.5)v=!0;else{let Z=Ebt;m.clone(_.position,Z);let E=e._zoomWorldPosition,X=Gbt;if(X=m.normalize(E,X),m.dot(X,P)<0)return;let F=Abt,N=Wbt;m.clone(_.direction,N),m.add(Z,m.multiplyByScalar(N,1e3,fS),F);let O=Pbt,U=vbt;m.subtract(E,Z,O),m.normalize(O,U);let Y=m.dot(P,U);if(Y>=0){e._zoomMouseStart.x=-1;return}let k=Math.acos(-Y),H=m.magnitude(Z),K=m.magnitude(E),te=H-f,z=m.magnitude(O),j=Math.asin(W.clamp(z/K*Math.sin(k),-1,1)),ee=Math.asin(W.clamp(te/K*Math.sin(k),-1,1)),pe=j-ee+k,_e=Ibt;m.normalize(Z,_e);let ae=Xbt;ae=m.cross(U,_e,ae),ae=m.normalize(ae,ae),m.normalize(m.cross(_e,ae,fS),N),m.multiplyByScalar(m.normalize(F,fS),m.magnitude(F)-f,F),m.normalize(Z,Z),m.multiplyByScalar(Z,te,Z);let ye=wbt;m.multiplyByScalar(m.add(m.multiplyByScalar(_e,Math.cos(pe)-1,$_e),m.multiplyByScalar(N,Math.sin(pe),eTe),fS),te,ye),m.add(Z,ye,Z),m.normalize(F,_e),m.normalize(m.cross(_e,ae,fS),N);let Se=Fbt;m.multiplyByScalar(m.add(m.multiplyByScalar(_e,Math.cos(pe)-1,$_e),m.multiplyByScalar(N,Math.sin(pe),eTe),fS),m.magnitude(F),Se),m.add(F,Se,F),m.clone(Z,_.position),m.normalize(m.subtract(F,Z,fS),_.direction),m.clone(_.direction,_.direction),m.cross(_.direction,_.up,_.right),m.cross(_.right,_.direction,_.up),_.setView(E8);return}else{let Z=m.normalize(b,Lbt),E=m.normalize(e._zoomWorldPosition,Rbt),X=m.dot(E,Z);if(X>0&&X<1){let F=W.acosClamped(X),N=m.cross(E,Z,Zbt),O=Math.abs(F)>W.toRadians(20)?_.positionCartographic.height*.75:_.positionCartographic.height-f,U=f/O;_.rotate(N,F*U)}}}}e._rotatingZoom=!v}if(!L&&v||R){let P,w=Bi.worldToWindowCoordinates(x,e._zoomWorldPosition,Tbt);C!==oe.COLUMBUS_VIEW&&D.equals(t,e._zoomMouseStart)&&l(w)?P=_.getPickRay(w,B3):P=_.getPickRay(t,B3);let A=P.direction;(C===oe.COLUMBUS_VIEW||C===oe.SCENE2D)&&m.fromElements(A.y,A.z,A.x,A),_.move(A,f),e._zoomingOnVector=!0}else _.zoomIn(f);e._cameraUnderground||_.setView(E8)}var Mbt=new gn,Nbt=new gn,kbt=new m;function Ubt(e,t,n){let o=e._scene.camera,r=o.getPickRay(n.startPosition,Mbt).origin,s=o.getPickRay(n.endPosition,Nbt).origin;r=m.fromElements(r.y,r.z,r.x,r),s=m.fromElements(s.y,s.z,s.x,s);let a=m.subtract(r,s,kbt),c=m.magnitude(a);c>0&&(m.normalize(a,a),o.move(a,c))}function tTe(e,t,n){l(n.distance)&&(n=n.distance);let o=e._scene.camera;A8(e,t,n,e.zoomFactor,o.getMagnitude())}var Dbt=new D,Bbt=new D;function nTe(e,t,n){if(l(n.angleAndHeight)){Obt(e,t,n.angleAndHeight);return}let i=e._scene,o=i.camera,r=i.canvas,s=r.clientWidth,a=r.clientHeight,c=Dbt;c.x=2/s*n.startPosition.x-1,c.y=2/a*(a-n.startPosition.y)-1,c=D.normalize(c,c);let d=Bbt;d.x=2/s*n.endPosition.x-1,d.y=2/a*(a-n.endPosition.y)-1,d=D.normalize(d,d);let u=W.acosClamped(c.x);c.y<0&&(u=W.TWO_PI-u);let h=W.acosClamped(d.x);d.y<0&&(h=W.TWO_PI-h);let p=h-u;o.twistRight(p)}function Obt(e,t,n){let i=e._rotateFactor*e._rotateRateRangeAdjustment;i>e._maximumRotateRate&&(i=e._maximumRotateRate),i<e._minimumRotateRate&&(i=e._minimumRotateRate);let o=e._scene,r=o.camera,s=o.canvas,a=(n.endPosition.x-n.startPosition.x)/s.clientWidth;a=Math.min(a,e.maximumMovementRatio);let c=i*a*Math.PI*4;r.twistRight(c)}function Ybt(e){let t=e._scene.mapMode2D===id.ROTATE;M.equals(M.IDENTITY,e._scene.camera.transform)?(_l(e,e.enableTranslate,e.translateEventTypes,Ubt,e.inertiaTranslate,"_lastInertiaTranslateMovement"),_l(e,e.enableZoom,e.zoomEventTypes,tTe,e.inertiaZoom,"_lastInertiaZoomMovement"),t&&_l(e,e.enableRotate,e.tiltEventTypes,nTe,e.inertiaSpin,"_lastInertiaTiltMovement")):(_l(e,e.enableZoom,e.zoomEventTypes,tTe,e.inertiaZoom,"_lastInertiaZoomMovement"),t&&_l(e,e.enableRotate,e.translateEventTypes,nTe,e.inertiaSpin,"_lastInertiaSpinMovement"))}var uTe=new gn,Hbt=new m,zbt=new m;function G0(e,t,n){let i=e._scene,o=e._globe,r=i.camera,s;if(i.pickPositionSupported&&(s=i.pickPositionWorldCoordinates(t,Hbt)),!l(o))return m.clone(s,n);let a=!e._cameraUnderground,c=r.getPickRay(t,uTe),d=o.pickWorldCoordinates(c,i,a,zbt),u=l(s)?m.distance(s,r.positionWC):Number.POSITIVE_INFINITY,h=l(d)?m.distance(d,r.positionWC):Number.POSITIVE_INFINITY;return u<h?m.clone(s,n):m.clone(d,n)}var Kbt=new he;function Q3(e){let t=e._ellipsoid,n=e._scene,i=n.camera,o=n.mode,r=0;if(o===oe.SCENE3D){let c=t.cartesianToCartographic(i.position,Kbt);l(c)&&(r=c.height)}else r=i.position.z;let s=y(e._scene.globeHeight,0);return Math.abs(s-r)}var Jbt=new m;function mTe(e,t){let n=t.origin,i=t.direction,o=Q3(e),r=m.normalize(n,Jbt),s=Math.abs(m.dot(r,i));return s=Math.max(s,.5)*2,o*s}function hTe(e,t,n,i){let o=m.distance(t.origin,n),r=Q3(e),s=W.clamp(r*5,e._minimumUndergroundPickDistance,e._maximumUndergroundPickDistance);return o>s&&(o=Math.min(o,r/5),o=Math.max(o,100)),gn.getPoint(t,o,i)}function fTe(e,t,n,i){let o;return l(n)?(o=m.distance(t.origin,n),o>e._maximumUndergroundPickDistance&&(o=Q3(e))):o=Q3(e),gn.getPoint(t,o,i)}var Qbt=new D;function pTe(e,t){let n=t.endPosition,i=D.subtract(t.endPosition,t.startPosition,Qbt),o=e._strafeEndMousePosition;D.add(o,i,o),t.endPosition=o,M8(e,t,e._strafeStartPosition),t.endPosition=n}var iTe=new gn,jbt=new gn,I8=new m,qbt=new m,$bt=new m,e0t=new m,t0t=new cn(m.UNIT_X,0),n0t=new D,i0t=new D;function o0t(e,t,n){if(m.equals(t,e._translateMousePosition)||(e._looking=!1),m.equals(t,e._strafeMousePosition)||(e._strafing=!1),e._looking){su(e,t,n);return}if(e._strafing){pTe(e,n);return}let o=e._scene.camera,r=e._cameraUnderground,s=D.clone(n.startPosition,n0t),a=D.clone(n.endPosition,i0t),c=o.getPickRay(s,iTe),d=m.clone(m.ZERO,e0t),u=m.UNIT_X,h;if(o.position.z<e._minimumPickingTerrainHeight&&(h=G0(e,s,I8),l(h)&&(d.x=h.x)),r||d.x>o.position.z&&l(h)){let L=h;r&&(L=fTe(e,c,h,I8)),D.clone(t,e._strafeMousePosition),D.clone(t,e._strafeEndMousePosition),m.clone(L,e._strafeStartPosition),e._strafing=!0,M8(e,n,e._strafeStartPosition);return}let p=cn.fromPointNormal(d,u,t0t);c=o.getPickRay(s,iTe);let g=ti.rayPlane(c,p,I8),f=o.getPickRay(a,jbt),x=ti.rayPlane(f,p,qbt);if(!l(g)||!l(x)){e._looking=!0,su(e,t,n),D.clone(t,e._translateMousePosition);return}let _=m.subtract(g,x,$bt),C=_.x;_.x=_.y,_.y=_.z,_.z=C;let V=m.magnitude(_);V>W.EPSILON6&&(m.normalize(_,_),o.move(_,V))}var bTe=new D,H3=new gn,z3=new m,r0t=new m,gTe=new M,s0t=new M,a0t=new m,c0t=new cn(m.UNIT_X,0),X8=new m,v8=new he,yTe=new M,l0t=new Fe,d0t=new $,K3=new m;function u0t(e,t,n){if(l(n.angleAndHeight)&&(n=n.angleAndHeight),D.equals(t,e._tiltCenterMousePosition)||(e._tiltCVOffMap=!1,e._looking=!1),e._looking){su(e,t,n);return}let o=e._scene.camera;e._tiltCVOffMap||!e.onMap()||Math.abs(o.position.z)>e._minimumPickingTerrainHeight?(e._tiltCVOffMap=!0,m0t(e,t,n)):h0t(e,t,n)}function m0t(e,t,n){let i=e._scene,o=i.camera,r=i.canvas,s=bTe;s.x=r.clientWidth/2,s.y=r.clientHeight/2;let a=o.getPickRay(s,H3),c=m.UNIT_X,d=a.origin,u=a.direction,h,p=m.dot(c,u);if(Math.abs(p)>W.EPSILON6&&(h=-m.dot(c,d)/p),!l(h)||h<=0){e._looking=!0,su(e,t,n),D.clone(t,e._tiltCenterMousePosition);return}let g=m.multiplyByScalar(u,h,z3);m.add(d,g,g);let f=i.mapProjection,x=f.ellipsoid;m.fromElements(g.y,g.z,g.x,g);let _=f.unproject(g,v8);x.cartographicToCartesian(_,g);let C=wt.eastNorthUpToFixedFrame(g,x,gTe),V=e._globe,L=e._ellipsoid;e._globe=void 0,e._ellipsoid=ne.UNIT_SPHERE,e._rotateFactor=1,e._rotateRateRangeAdjustment=1;let R=M.clone(o.transform,yTe);o._setTransform(C),ru(e,t,n,m.UNIT_Z),o._setTransform(R),e._globe=V,e._ellipsoid=L;let G=L.maximumRadius;e._rotateFactor=1/G,e._rotateRateRangeAdjustment=G}function h0t(e,t,n){let i=e._scene,o=i.camera,r=e._cameraUnderground,s,a,c=m.UNIT_X;if(D.equals(t,e._tiltCenterMousePosition))s=m.clone(e._tiltCenter,z3);else{if(o.position.z<e._minimumPickingTerrainHeight&&(s=G0(e,t,z3)),!l(s)){a=o.getPickRay(t,H3);let b=a.origin,Z=a.direction,E,X=m.dot(c,Z);if(Math.abs(X)>W.EPSILON6&&(E=-m.dot(c,b)/X),!l(E)||E<=0){e._looking=!0,su(e,t,n),D.clone(t,e._tiltCenterMousePosition);return}s=m.multiplyByScalar(Z,E,z3),m.add(b,s,s)}r&&(l(a)||(a=o.getPickRay(t,H3)),hTe(e,a,s,s)),D.clone(t,e._tiltCenterMousePosition),m.clone(s,e._tiltCenter)}let d=i.canvas,u=bTe;u.x=d.clientWidth/2,u.y=e._tiltCenterMousePosition.y,a=o.getPickRay(u,H3);let h=m.clone(m.ZERO,a0t);h.x=s.x;let p=cn.fromPointNormal(h,c,c0t),g=ti.rayPlane(a,p,r0t),f=o._projection,x=f.ellipsoid;m.fromElements(s.y,s.z,s.x,s);let _=f.unproject(s,v8);x.cartographicToCartesian(_,s);let C=wt.eastNorthUpToFixedFrame(s,x,gTe),V;l(g)?(m.fromElements(g.y,g.z,g.x,g),_=f.unproject(g,v8),x.cartographicToCartesian(_,g),V=wt.eastNorthUpToFixedFrame(g,x,s0t)):V=C;let L=e._globe,R=e._ellipsoid;e._globe=void 0,e._ellipsoid=ne.UNIT_SPHERE,e._rotateFactor=1,e._rotateRateRangeAdjustment=1;let G=m.UNIT_Z,I=M.clone(o.transform,yTe);o._setTransform(C);let v=m.cross(m.UNIT_Z,m.normalize(o.position,X8),X8),P=m.dot(o.right,v);if(ru(e,t,n,G,!1,!0),o._setTransform(V),P<0){let b=n.startPosition.y-n.endPosition.y;(r&&b<0||!r&&b>0)&&(G=void 0);let Z=o.constrainedAxis;o.constrainedAxis=void 0,ru(e,t,n,G,!0,!1),o.constrainedAxis=Z}else ru(e,t,n,G,!0,!1);if(l(o.constrainedAxis)){let b=m.cross(o.direction,o.constrainedAxis,K3);m.equalsEpsilon(b,m.ZERO,W.EPSILON6)||(m.dot(b,o.right)<0&&m.negate(b,b),m.cross(b,o.direction,o.up),m.cross(o.direction,o.up,o.right),m.normalize(o.up,o.up),m.normalize(o.right,o.right))}o._setTransform(I),e._globe=L,e._ellipsoid=R;let w=R.maximumRadius;e._rotateFactor=1/w,e._rotateRateRangeAdjustment=w;let A=m.clone(o.positionWC,X8);if(e.enableCollisionDetection&&U8(e,!0),!m.equals(o.positionWC,A)){o._setTransform(V),o.worldToCameraCoordinatesPoint(A,A);let b=m.magnitudeSquared(A);m.magnitudeSquared(o.position)>b&&(m.normalize(o.position,o.position),m.multiplyByScalar(o.position,Math.sqrt(b),o.position));let Z=m.angleBetween(A,o.position),E=m.cross(A,o.position,A);m.normalize(E,E);let X=Fe.fromAxisAngle(E,Z,l0t),F=$.fromQuaternion(X,d0t);$.multiplyByVector(F,o.direction,o.direction),$.multiplyByVector(F,o.up,o.up),m.cross(o.direction,o.up,o.right),m.cross(o.right,o.direction,o.up),o._setTransform(I)}}var xTe=new D,_Te=new gn,TTe=new m;function f0t(e,t,n){l(n.distance)&&(n=n.distance);let i=e._scene,o=i.camera,r=i.canvas,s=e._cameraUnderground,a;s?a=t:(a=xTe,a.x=r.clientWidth/2,a.y=r.clientHeight/2);let c=o.getPickRay(a,_Te),d=c.origin,u=c.direction,h=o.position.z,p;h<e._minimumPickingTerrainHeight&&(p=G0(e,a,TTe));let g;if(l(p)&&(g=m.distance(d,p)),s){let f=mTe(e,c,h);l(g)?g=Math.min(g,f):g=f}if(!l(g)){let f=m.UNIT_X;g=-m.dot(f,d)/m.dot(f,u)}A8(e,t,n,e.zoomFactor,g)}function p0t(e){let n=e._scene.camera;if(!M.equals(M.IDENTITY,n.transform))_l(e,e.enableRotate,e.rotateEventTypes,ru,e.inertiaSpin,"_lastInertiaSpinMovement"),_l(e,e.enableZoom,e.zoomEventTypes,CTe,e.inertiaZoom,"_lastInertiaZoomMovement");else{let i=e._tweens;if(e._aggregator.anyButtonDown&&i.removeAll(),_l(e,e.enableTilt,e.tiltEventTypes,u0t,e.inertiaSpin,"_lastInertiaTiltMovement"),_l(e,e.enableTranslate,e.translateEventTypes,o0t,e.inertiaTranslate,"_lastInertiaTranslateMovement"),_l(e,e.enableZoom,e.zoomEventTypes,f0t,e.inertiaZoom,"_lastInertiaZoomMovement"),_l(e,e.enableLook,e.lookEventTypes,su),!e._aggregator.anyButtonDown&&!i.contains(e._tween)){let o=n.createCorrectPositionTween(e.bounceAnimationTime);l(o)&&(e._tween=i.add(o))}i.update()}}var b0t=new gn,g0t=new cn(m.UNIT_X,0),y0t=new m,x0t=new m;function M8(e,t,n){let i=e._scene,o=i.camera,r=o.getPickRay(t.endPosition,b0t),s=m.clone(o.direction,x0t);i.mode===oe.COLUMBUS_VIEW&&m.fromElements(s.z,s.x,s.y,s);let a=cn.fromPointNormal(n,s,g0t),c=ti.rayPlane(r,a,y0t);l(c)&&(s=m.subtract(n,c,s),i.mode===oe.COLUMBUS_VIEW&&m.fromElements(s.y,s.z,s.x,s),m.add(o.position,s,o.position))}var oTe=new m,STe=new he,w8=new m,F8=new ne,_0t=new m,T0t=new m,S0t=new m;function C0t(e,t,n){let o=e._scene.camera,r=e._cameraUnderground,s=e._ellipsoid;if(!M.equals(o.transform,M.IDENTITY)){ru(e,t,n);return}let a,c,d=s.geodeticSurfaceNormal(o.position,_0t);if(D.equals(t,e._rotateMousePosition)){if(e._looking)su(e,t,n,d);else if(e._rotating)ru(e,t,n);else if(e._strafing)pTe(e,n);else{if(m.magnitude(o.position)<m.magnitude(e._rotateStartPosition))return;a=m.magnitude(e._rotateStartPosition),c=w8,c.x=c.y=c.z=a,s=ne.fromCartesian3(c,F8),P8(e,t,n,s)}return}e._looking=!1,e._rotating=!1,e._strafing=!1;let u=s.cartesianToCartographic(o.positionWC,STe).height,h=e._globe;if(l(h)&&u<e._minimumPickingTerrainHeight){let p=G0(e,n.startPosition,S0t);if(l(p)){let g=!1,f=o.getPickRay(n.startPosition,uTe);if(r)g=!0,fTe(e,f,p,p);else{let x=s.geodeticSurfaceNormal(p,T0t);Math.abs(m.dot(f.direction,x))<.05?g=!0:g=m.magnitude(o.position)<m.magnitude(p)}g?(D.clone(t,e._strafeEndMousePosition),m.clone(p,e._strafeStartPosition),e._strafing=!0,M8(e,n,e._strafeStartPosition)):(a=m.magnitude(p),c=w8,c.x=c.y=c.z=a,s=ne.fromCartesian3(c,F8),P8(e,t,n,s),m.clone(p,e._rotateStartPosition))}else e._looking=!0,su(e,t,n,d)}else l(o.pickEllipsoid(n.startPosition,e._ellipsoid,oTe))?(P8(e,t,n,e._ellipsoid),m.clone(oTe,e._rotateStartPosition)):u>e._minimumTrackBallHeight?(e._rotating=!0,ru(e,t,n)):(e._looking=!0,su(e,t,n,d));D.clone(t,e._rotateMousePosition)}function ru(e,t,n,i,o,r){o=y(o,!1),r=y(r,!1);let s=e._scene,a=s.camera,c=s.canvas,d=a.constrainedAxis;l(i)&&(a.constrainedAxis=i);let u=m.magnitude(a.position),h=e._rotateFactor*(u-e._rotateRateRangeAdjustment);h>e._maximumRotateRate&&(h=e._maximumRotateRate),h<e._minimumRotateRate&&(h=e._minimumRotateRate);let p=(n.startPosition.x-n.endPosition.x)/c.clientWidth,g=(n.startPosition.y-n.endPosition.y)/c.clientHeight;p=Math.min(p,e.maximumMovementRatio),g=Math.min(g,e.maximumMovementRatio);let f=h*p*Math.PI*2,x=h*g*Math.PI;if(l(i)&&l(e.maximumTiltAngle)){let _=e.maximumTiltAngle,C=m.dot(a.direction,i),V=Math.PI-Math.acos(C)+x;V>_&&(x-=V-_)}o||a.rotateRight(f),r||a.rotateUp(x),a.constrainedAxis=d}var W8=re.clone(re.UNIT_W),rTe=re.clone(re.UNIT_W),O3=new m,VL=new m,Y3=new m,sTe=new m,V0t=new D,L0t=new D,R0t=new D,Z0t=new D,G0t=new gn;function P8(e,t,n,i){let o=e._scene,r=o.camera,s=D.clone(n.startPosition,V0t),a=D.clone(n.endPosition,L0t),c=i.cartesianToCartographic(r.positionWC,STe).height,d,u;if(!n.inertiaEnabled&&c<e._minimumPickingTerrainHeight&&(d=m.clone(e._panLastWorldPosition,W8),!l(e._globe)&&!D.equalsEpsilon(s,e._panLastMousePosition)&&(d=G0(e,s,W8)),!l(e._globe)&&l(d))){let h=m.subtract(d,r.positionWC,VL),p=m.multiplyByScalar(r.directionWC,m.dot(r.directionWC,h),VL),g=m.magnitude(p),f=r.frustum.getPixelDimensions(o.drawingBufferWidth,o.drawingBufferHeight,g,o.pixelRatio,Z0t),x=D.subtract(a,s,R0t),_=m.multiplyByScalar(r.rightWC,x.x*f.x,VL),C=m.normalize(r.positionWC,dTe),V=r.getPickRay(a,G0t).direction,L=m.subtract(V,m.projectVector(V,r.rightWC,Y3),Y3),R=m.angleBetween(L,r.directionWC),G=1;l(r.frustum.fov)&&(G=Math.max(Math.tan(R),.1));let I=Math.abs(m.dot(r.directionWC,C)),v=-x.y*f.y*2/Math.sqrt(G)*(1-I),P=m.multiplyByScalar(V,v,Y3);I=Math.abs(m.dot(r.upWC,C));let w=m.multiplyByScalar(r.upWC,-x.y*(1-I)*f.y,sTe);u=m.add(d,_,rTe),u=m.add(u,P,u),u=m.add(u,w,u),m.clone(u,e._panLastWorldPosition),D.clone(a,e._panLastMousePosition)}if((!l(d)||!l(u))&&(d=r.pickEllipsoid(s,i,W8),u=r.pickEllipsoid(a,i,rTe)),!l(d)||!l(u)){e._rotating=!0,ru(e,t,n);return}if(d=r.worldToCameraCoordinates(d,d),u=r.worldToCameraCoordinates(u,u),l(r.constrainedAxis)){let h=r.constrainedAxis,p=m.mostOrthogonalAxis(h,O3);m.cross(p,h,p),m.normalize(p,p);let g=m.cross(h,p,VL),f=m.magnitude(d),x=m.dot(h,d),_=Math.acos(x/f),C=m.multiplyByScalar(h,x,Y3);m.subtract(d,C,C),m.normalize(C,C);let V=m.magnitude(u),L=m.dot(h,u),R=Math.acos(L/V),G=m.multiplyByScalar(h,L,sTe);m.subtract(u,G,G),m.normalize(G,G);let I=Math.acos(m.dot(C,p));m.dot(C,g)<0&&(I=W.TWO_PI-I);let v=Math.acos(m.dot(G,p));m.dot(G,g)<0&&(v=W.TWO_PI-v);let P=I-v,w;m.equalsEpsilon(h,r.position,W.EPSILON2)?w=r.right:w=m.cross(h,r.position,O3);let A=m.cross(h,w,O3),b=m.dot(A,m.subtract(d,h,VL)),Z=m.dot(A,m.subtract(u,h,VL)),E;b>0&&Z>0?E=R-_:b>0&&Z<=0?m.dot(r.position,h)>0?E=-_-R:E=_+R:E=_-R,r.rotateRight(P),r.rotateUp(E)}else{m.normalize(d,d),m.normalize(u,u);let h=m.dot(d,u),p=m.cross(d,u,O3);if(h<1&&!m.equalsEpsilon(p,m.ZERO,W.EPSILON14)){let g=Math.acos(h);r.rotate(p,g)}}}var E0t=new m,I0t=new he,aTe=0;function CTe(e,t,n){l(n.distance)&&(n=n.distance);let i=n.inertiaEnabled,o=e._ellipsoid,r=e._scene,s=r.camera,a=r.canvas,c=e._cameraUnderground,d;c?d=t:(d=xTe,d.x=a.clientWidth/2,d.y=a.clientHeight/2);let u=s.getPickRay(d,_Te),h,p=o.cartesianToCartographic(s.position,I0t).height,g=Math.abs(aTe)<e.minimumPickingTerrainDistanceWithInertia;(i?g:p<e._minimumPickingTerrainHeight)&&(h=G0(e,d,TTe));let x;if(l(h)&&(x=m.distance(u.origin,h),aTe=x),c){let C=mTe(e,u,p);l(x)?x=Math.min(x,C):x=C}l(x)||(x=p);let _=m.normalize(s.position,E0t);A8(e,t,n,e.zoomFactor,x,m.dot(_,s.direction))}var VTe=new D,J3=new gn,EA=new m,X0t=new m,LTe=new M,W0t=new M,RTe=new M,P0t=new Fe,v0t=new $,N8=new he,k8=new m;function w0t(e,t,n){let o=e._scene.camera;if(!M.equals(o.transform,M.IDENTITY))return;if(l(n.angleAndHeight)&&(n=n.angleAndHeight),D.equals(t,e._tiltCenterMousePosition)||(e._tiltOnEllipsoid=!1,e._looking=!1),e._looking){let a=e._ellipsoid.geodeticSurfaceNormal(o.position,k8);su(e,t,n,a);return}let s=e._ellipsoid.cartesianToCartographic(o.position,N8);e._tiltOnEllipsoid||s.height>e._minimumCollisionTerrainHeight?(e._tiltOnEllipsoid=!0,A0t(e,t,n)):M0t(e,t,n)}var F0t=new he;function A0t(e,t,n){let i=e._ellipsoid,o=e._scene,r=o.camera,s=e.minimumZoomDistance*.25,a=i.cartesianToCartographic(r.positionWC,F0t).height;if(a-s-1<W.EPSILON3&&n.endPosition.y-n.startPosition.y<0)return;let c=o.canvas,d=VTe;d.x=c.clientWidth/2,d.y=c.clientHeight/2;let u=r.getPickRay(d,J3),h,p=ti.rayEllipsoid(u,i);if(l(p))h=gn.getPoint(u,p.start,EA);else if(a>e._minimumTrackBallHeight){let V=ti.grazingAltitudeLocation(u,i);if(!l(V))return;let L=i.cartesianToCartographic(V,N8);L.height=0,h=i.cartographicToCartesian(L,EA)}else{e._looking=!0;let V=e._ellipsoid.geodeticSurfaceNormal(r.position,k8);su(e,t,n,V),D.clone(t,e._tiltCenterMousePosition);return}let g=wt.eastNorthUpToFixedFrame(h,i,LTe),f=e._globe,x=e._ellipsoid;e._globe=void 0,e._ellipsoid=ne.UNIT_SPHERE,e._rotateFactor=1,e._rotateRateRangeAdjustment=1;let _=M.clone(r.transform,RTe);r._setTransform(g),ru(e,t,n,m.UNIT_Z),r._setTransform(_),e._globe=f,e._ellipsoid=x;let C=x.maximumRadius;e._rotateFactor=1/C,e._rotateRateRangeAdjustment=C}function M0t(e,t,n){let i=e._ellipsoid,o=e._scene,r=o.camera,s=e._cameraUnderground,a,c,d;if(D.equals(t,e._tiltCenterMousePosition))a=m.clone(e._tiltCenter,EA);else{if(a=G0(e,t,EA),!l(a)){if(c=r.getPickRay(t,J3),d=ti.rayEllipsoid(c,i),!l(d)){if(i.cartesianToCartographic(r.position,N8).height<=e._minimumTrackBallHeight){e._looking=!0;let Z=e._ellipsoid.geodeticSurfaceNormal(r.position,k8);su(e,t,n,Z),D.clone(t,e._tiltCenterMousePosition)}return}a=gn.getPoint(c,d.start,EA)}s&&(l(c)||(c=r.getPickRay(t,J3)),hTe(e,c,a,a)),D.clone(t,e._tiltCenterMousePosition),m.clone(a,e._tiltCenter)}let u=o.canvas,h=VTe;h.x=u.clientWidth/2,h.y=e._tiltCenterMousePosition.y,c=r.getPickRay(h,J3);let p=m.magnitude(a),g=m.fromElements(p,p,p,w8),f=ne.fromCartesian3(g,F8);if(d=ti.rayEllipsoid(c,f),!l(d))return;let x=m.magnitude(c.origin)>p?d.start:d.stop,_=gn.getPoint(c,x,X0t),C=wt.eastNorthUpToFixedFrame(a,i,LTe),V=wt.eastNorthUpToFixedFrame(_,f,W0t),L=e._globe,R=e._ellipsoid;e._globe=void 0,e._ellipsoid=ne.UNIT_SPHERE,e._rotateFactor=1,e._rotateRateRangeAdjustment=1;let G=m.UNIT_Z,I=M.clone(r.transform,RTe);r._setTransform(V);let v=m.cross(_,r.positionWC,K3);if(m.dot(r.rightWC,v)<0){let b=n.startPosition.y-n.endPosition.y;(s&&b<0||!s&&b>0)&&(G=void 0);let Z=r.constrainedAxis;r.constrainedAxis=void 0,ru(e,t,n,G,!0,!1),r.constrainedAxis=Z}else ru(e,t,n,G,!0,!1);if(r._setTransform(C),ru(e,t,n,G,!1,!0),l(r.constrainedAxis)){let b=m.cross(r.direction,r.constrainedAxis,K3);m.equalsEpsilon(b,m.ZERO,W.EPSILON6)||(m.dot(b,r.right)<0&&m.negate(b,b),m.cross(b,r.direction,r.up),m.cross(r.direction,r.up,r.right),m.normalize(r.up,r.up),m.normalize(r.right,r.right))}r._setTransform(I),e._globe=L,e._ellipsoid=R;let w=R.maximumRadius;e._rotateFactor=1/w,e._rotateRateRangeAdjustment=w;let A=m.clone(r.positionWC,K3);if(e.enableCollisionDetection&&U8(e,!0),!m.equals(r.positionWC,A)){r._setTransform(V),r.worldToCameraCoordinatesPoint(A,A);let b=m.magnitudeSquared(A);m.magnitudeSquared(r.position)>b&&(m.normalize(r.position,r.position),m.multiplyByScalar(r.position,Math.sqrt(b),r.position));let Z=m.angleBetween(A,r.position),E=m.cross(A,r.position,A);m.normalize(E,E);let X=Fe.fromAxisAngle(E,Z,P0t),F=$.fromQuaternion(X,v0t);$.multiplyByVector(F,r.direction,r.direction),$.multiplyByVector(F,r.up,r.up),m.cross(r.direction,r.up,r.right),m.cross(r.right,r.direction,r.up),r._setTransform(I)}}var N0t=new D,k0t=new D,cTe=new gn,lTe=new gn,U0t=new m,D0t=new m;function su(e,t,n,i){let r=e._scene.camera,s=N0t;s.x=n.startPosition.x,s.y=0;let a=k0t;a.x=n.endPosition.x,a.y=0;let c=r.getPickRay(s,cTe),d=r.getPickRay(a,lTe),u=0,h,p;r.frustum instanceof ln?(h=c.origin,p=d.origin,m.add(r.direction,h,h),m.add(r.direction,p,p),m.subtract(h,r.position,h),m.subtract(p,r.position,p),m.normalize(h,h),m.normalize(p,p)):(h=c.direction,p=d.direction);let g=m.dot(h,p);g<1&&(u=Math.acos(g)),u=n.startPosition.x>n.endPosition.x?-u:u;let f=e._horizontalRotationAxis;if(l(i)?r.look(i,-u):l(f)?r.look(f,-u):r.lookLeft(u),s.x=0,s.y=n.startPosition.y,a.x=0,a.y=n.endPosition.y,c=r.getPickRay(s,cTe),d=r.getPickRay(a,lTe),u=0,r.frustum instanceof ln?(h=c.origin,p=d.origin,m.add(r.direction,h,h),m.add(r.direction,p,p),m.subtract(h,r.position,h),m.subtract(p,r.position,p),m.normalize(h,h),m.normalize(p,p)):(h=c.direction,p=d.direction),g=m.dot(h,p),g<1&&(u=Math.acos(g)),u=n.startPosition.y>n.endPosition.y?-u:u,i=y(i,f),l(i)){let x=r.direction,_=m.negate(i,U0t),C=m.equalsEpsilon(x,i,W.EPSILON2),V=m.equalsEpsilon(x,_,W.EPSILON2);if(!C&&!V){g=m.dot(x,i);let L=W.acosClamped(g);u>0&&u>L&&(u=L-W.EPSILON4),g=m.dot(x,_),L=W.acosClamped(g),u<0&&-u>L&&(u=-L+W.EPSILON4);let R=m.cross(i,x,D0t);r.look(R,u)}else(C&&u<0||V&&u>0)&&r.look(r.right,-u)}else r.lookUp(u)}function B0t(e){_l(e,e.enableRotate,e.rotateEventTypes,C0t,e.inertiaSpin,"_lastInertiaSpinMovement"),_l(e,e.enableZoom,e.zoomEventTypes,CTe,e.inertiaZoom,"_lastInertiaZoomMovement"),_l(e,e.enableTilt,e.tiltEventTypes,w0t,e.inertiaSpin,"_lastInertiaTiltMovement"),_l(e,e.enableLook,e.lookEventTypes,su)}var O0t=new M,Y0t=new he;function U8(e,t){e._adjustedHeightForTerrain=!0;let n=e._scene,i=n.mode;if(i===oe.SCENE2D||i===oe.MORPHING)return;let o=n.camera,r=y(n.ellipsoid,ne.WGS84),s=n.mapProjection,a,c;M.equals(o.transform,M.IDENTITY)||(a=M.clone(o.transform,O0t),c=m.magnitude(o.position),o._setTransform(M.IDENTITY));let d=Y0t;i===oe.SCENE3D?r.cartesianToCartographic(o.position,d):s.unproject(o.position,d);let u=!1;if(d.height<e._minimumCollisionTerrainHeight){let h=e._scene.globeHeight;if(l(h)){let p=h+e.minimumZoomDistance,g=h-e._lastGlobeHeight,f=g/e._lastGlobeHeight;d.height<p&&(t||Math.abs(f)<=.1)&&(d.height=p,i===oe.SCENE3D?r.cartographicToCartesian(d,o.position):s.project(d,o.position),u=!0),t||Math.abs(f)<=.1?e._lastGlobeHeight=h:e._lastGlobeHeight+=g*.1}}l(a)&&(o._setTransform(a),u&&(m.normalize(o.position,o.position),m.negate(o.position,o.direction),m.multiplyByScalar(o.position,Math.max(c,e.minimumZoomDistance),o.position),m.normalize(o.direction,o.direction),m.cross(o.direction,o.up,o.right),m.cross(o.right,o.direction,o.up)))}IA.prototype.onMap=function(){let e=this._scene,t=e.mode,n=e.camera;return t===oe.COLUMBUS_VIEW?Math.abs(n.position.x)-this._maxCoord.x<0&&Math.abs(n.position.y)-this._maxCoord.y<0:!0};var H0t=new m,z0t=new m;IA.prototype.update=function(){let e=this._scene,{camera:t,globe:n,mode:i}=e;M.equals(t.transform,M.IDENTITY)?(this._globe=n,this._ellipsoid=y(e.ellipsoid,ne.default)):(this._globe=void 0,this._ellipsoid=ne.UNIT_SPHERE);let{verticalExaggeration:o,verticalExaggerationRelativeHeight:r}=e;this._minimumCollisionTerrainHeight=Sr.getHeight(this.minimumCollisionTerrainHeight,o,r),this._minimumPickingTerrainHeight=Sr.getHeight(this.minimumPickingTerrainHeight,o,r),this._minimumTrackBallHeight=Sr.getHeight(this.minimumTrackBallHeight,o,r),this._cameraUnderground=e.cameraUnderground&&l(this._globe);let s=this._ellipsoid.maximumRadius;this._rotateFactor=1/s,this._rotateRateRangeAdjustment=s,this._adjustedHeightForTerrain=!1;let a=m.clone(t.positionWC,H0t),c=m.clone(t.directionWC,z0t);if(i===oe.SCENE2D?Ybt(this):i===oe.COLUMBUS_VIEW?(this._horizontalRotationAxis=m.UNIT_Z,p0t(this)):i===oe.SCENE3D&&(this._horizontalRotationAxis=void 0,B0t(this)),this.enableCollisionDetection&&!this._adjustedHeightForTerrain){let d=!m.equals(a,t.positionWC)||!m.equals(c,t.directionWC);U8(this,d)}this._aggregator.reset()};IA.prototype.isDestroyed=function(){return!1};IA.prototype.destroy=function(){return this._tweens.removeAll(),this._aggregator=this._aggregator&&this._aggregator.destroy(),me(this)};var XA=IA;var lDi=T(S(),1);var DUi=T(S(),1),WA=`uniform sampler2D colorTexture; uniform sampler2D colorTexture2; uniform vec2 center; uniform float radius; in vec2 v_textureCoordinates; void main() { vec4 color0 = texture(colorTexture, v_textureCoordinates); vec4 color1 = texture(colorTexture2, v_textureCoordinates); float x = length(gl_FragCoord.xy - center) / radius; float t = smoothstep(0.5, 0.8, x); out_FragColor = mix(color0 + color1, color1, t); } `;var OUi=T(S(),1),PA=`uniform sampler2D colorTexture; uniform float avgLuminance; uniform float threshold; uniform float offset; in vec2 v_textureCoordinates; float key(float avg) { float guess = 1.5 - (1.5 / (avg * 0.1 + 1.0)); return max(0.0, guess) + 0.1; } // See section 9. "The bright-pass filter" of Realtime HDR Rendering // http://www.cg.tuwien.ac.at/research/publications/2007/Luksch_2007_RHR/Luksch_2007_RHR-RealtimeHDR%20.pdf void main() { vec4 color = texture(colorTexture, v_textureCoordinates); vec3 xyz = czm_RGBToXYZ(color.rgb); float luminance = xyz.r; float scaledLum = key(avgLuminance) * luminance / avgLuminance; float brightLum = max(scaledLum - threshold, 0.0); float brightness = brightLum / (offset + brightLum); xyz.r = brightness; out_FragColor = vec4(czm_XYZToRGB(xyz), 1.0); } `;function E0(){this._sceneFramebuffer=new nS;let e=.125,t=new Array(6);t[0]=new bo({fragmentShader:od,textureScale:e,forcePowerOfTwo:!0,sampleMode:tu.LINEAR});let n=t[1]=new bo({fragmentShader:PA,uniforms:{avgLuminance:.5,threshold:.25,offset:.1},textureScale:e,forcePowerOfTwo:!0}),i=this;this._delta=1,this._sigma=2,this._blurStep=new D,t[2]=new bo({fragmentShader:Uy,uniforms:{step:function(){return i._blurStep.x=i._blurStep.y=1/n.outputTexture.width,i._blurStep},delta:function(){return i._delta},sigma:function(){return i._sigma},direction:0},textureScale:e,forcePowerOfTwo:!0}),t[3]=new bo({fragmentShader:Uy,uniforms:{step:function(){return i._blurStep.x=i._blurStep.y=1/n.outputTexture.width,i._blurStep},delta:function(){return i._delta},sigma:function(){return i._sigma},direction:1},textureScale:e,forcePowerOfTwo:!0}),t[4]=new bo({fragmentShader:od,sampleMode:tu.LINEAR}),this._uCenter=new D,this._uRadius=void 0,t[5]=new bo({fragmentShader:WA,uniforms:{center:function(){return i._uCenter},radius:function(){return i._uRadius},colorTexture2:function(){return i._sceneFramebuffer.framebuffer.getColorTexture(0)}}}),this._stages=new rd({stages:t});let o=new lS(this),r=t.length;for(let s=0;s<r;++s)t[s]._textureCache=o;this._textureCache=o,this.length=t.length}E0.prototype.get=function(e){return this._stages.get(e)};E0.prototype.getStageByName=function(e){let t=this._stages.length;for(let n=0;n<t;++n){let i=this._stages.get(n);if(i.name===e)return i}};var K0t=new re,ZTe=new D,J0t=new D,GTe=new M;function Q0t(e,t,n){let i=t.uniformState,o=i.sunPositionWC,r=i.view,s=i.viewProjection,a=i.projection,c=M.computeViewportTransformation(n,0,1,GTe),d=M.multiplyByPoint(r,o,K0t),u=wt.pointToGLWindowCoordinates(s,c,o,ZTe);d.x+=W.SOLAR_RADIUS;let h=wt.pointToGLWindowCoordinates(a,c,d,d),p=D.magnitude(D.subtract(h,u,h))*30*2,g=J0t;g.x=p,g.y=p,e._uCenter=D.clone(u,e._uCenter),e._uRadius=Math.max(g.x,g.y)*.15;let f=t.drawingBufferWidth,x=t.drawingBufferHeight,_=e._stages,C=_.get(0),V=C.outputTexture.width,L=C.outputTexture.height,R=new He;R.width=V,R.height=L,c=M.computeViewportTransformation(R,0,1,GTe),u=wt.pointToGLWindowCoordinates(s,c,o,ZTe),g.x*=V/f,g.y*=L/x;let G=C.scissorRectangle;G.x=Math.max(u.x-g.x*.5,0),G.y=Math.max(u.y-g.y*.5,0),G.width=Math.min(g.x,f),G.height=Math.min(g.y,x);for(let I=1;I<4;++I)He.clone(G,_.get(I).scissorRectangle)}E0.prototype.clear=function(e,t,n){this._sceneFramebuffer.clear(e,t,n),this._textureCache.clear(e)};E0.prototype.update=function(e){let t=e.context,n=e.viewport,i=this._sceneFramebuffer;i.update(t,n);let o=i.framebuffer;return this._textureCache.update(t),this._stages.update(t,!1),Q0t(this,t,n),o};E0.prototype.execute=function(e){let t=this._sceneFramebuffer.framebuffer.getColorTexture(0),n=this._stages,i=n.length;n.get(0).execute(e,t);for(let o=1;o<i;++o)n.get(o).execute(e,n.get(o-1).outputTexture)};E0.prototype.copy=function(e,t){if(!l(this._copyColorCommand)){let n=this;this._copyColorCommand=e.createViewportQuadCommand(od,{uniformMap:{colorTexture:function(){return n._stages.get(n._stages.length-1).outputTexture}},owner:this})}this._copyColorCommand.framebuffer=t,this._copyColorCommand.execute(e)};E0.prototype.isDestroyed=function(){return!1};E0.prototype.destroy=function(){return this._textureCache.destroy(),this._stages.destroy(),me(this)};var vA=E0;var bDi=T(S(),1);function ETe(){this._cachedShowFrustumsShaders={}}function j0t(e){let t={},n=e.vertexAttributes;for(let i in n)n.hasOwnProperty(i)&&(t[i]=n[i].index);return t}function q0t(e,t){let n=e.context,i=t,o=i.fragmentShaderSource.clone(),r=[];o.sources=o.sources.map(function(u){u=De.replaceMain(u,"czm_Debug_main");let h=/out_FragData_(\d+)/g,p;for(;(p=h.exec(u))!==null;)r.indexOf(p[1])===-1&&r.push(p[1]);return u});let s=r.length,a="";a+=`uniform vec3 debugShowCommandsColor; `,a+=`uniform vec3 debugShowFrustumsColor; `,a+=`void main() { czm_Debug_main(); `;let c;if(s>0)for(c=0;c<s;++c)a+=` out_FragData_${r[c]}.rgb *= debugShowCommandsColor; `,a+=` out_FragData_${r[c]}.rgb *= debugShowFrustumsColor; `;else a+=` out_FragColor.rgb *= debugShowCommandsColor; `,a+=` out_FragColor.rgb *= debugShowFrustumsColor; `;a+="}",o.sources.push(a);let d=j0t(i);return en.fromCache({context:n,vertexShaderSource:i.vertexShaderSource,fragmentShaderSource:o,attributeLocations:d})}var wA=new B;function $0t(e,t){let n;return l(t.uniformMap)?n=t.uniformMap:n={},l(n.debugShowCommandsColor)||l(n.debugShowFrustumsColor)||(n.debugShowCommandsColor=function(){return e.debugShowCommands?(l(t._debugColor)||(t._debugColor=B.fromRandom()),t._debugColor):B.WHITE},n.debugShowFrustumsColor=function(){return e.debugShowFrustums?(wA.red=t.debugOverlappingFrustums&1?1:0,wA.green=t.debugOverlappingFrustums&2?1:0,wA.blue=t.debugOverlappingFrustums&4?1:0,wA.alpha=1,wA):B.WHITE}),n}var egt=new $e;ETe.prototype.executeDebugShowFrustumsCommand=function(e,t,n){let i=t.shaderProgram.id,o=this._cachedShowFrustumsShaders[i];l(o)||(o=q0t(e,t.shaderProgram),this._cachedShowFrustumsShaders[i]=o);let r=$e.shallowClone(t,egt);r.shaderProgram=o,r.uniformMap=$0t(e,t),r.execute(e.context,n)};var FA=ETe;var SDi=T(S(),1);function pS(e,t,n){this._primitive=e,this._tileIndex=t,this._sampleIndex=n,this._metadata={},this._orientedBoundingBox=new Gn}pS.fromKeyframeNode=function(e,t,n,i){let o=new pS(e,t,n),{spatialNode:r,content:s}=i;return o._metadata=tgt(e,s,n),o._orientedBoundingBox=igt(e,r,n,o._orientedBoundingBox),o};function tgt(e,t,n){if(!l(t)||!l(t.metadata))return;let{names:i,types:o}=e.provider,{metadata:r}=t,s={};for(let a=0;a<i.length;a++){let c=i[a],d=ut.getComponentCount(o[a]),u=r[a].slice(n*d,(n+1)*d);s[c]=u}return s}var ITe=new m,ngt=new m;function igt(e,t,n,i){let o=t.dimensions,r=o.x*o.y,s=Math.floor(n/r),a=n-s*r,c=Math.floor(a/o.x),d=a-c*o.x,u=m.fromElements(d,c,s,ITe),h=m.divideComponents(m.subtract(u,e._paddingBefore,ITe),e.dimensions,ngt);return e._shape.computeOrientedBoundingBoxForSample(t,e.dimensions,h,i)}Object.defineProperties(pS.prototype,{metadata:{get:function(){return this._metadata}},primitive:{get:function(){return this._primitive}},sampleIndex:{get:function(){return this._sampleIndex}},tileIndex:{get:function(){return this._tileIndex}},orientedBoundingBox:{get:function(){return this._orientedBoundingBox.clone()}}});pS.prototype.hasProperty=function(e){return l(this._metadata[e])};pS.prototype.getNames=function(){return Object.keys(this._metadata)};pS.prototype.getProperty=function(e){return this._metadata[e]};var AA=pS;var kYi=T(S(),1);var O3i=T(S(),1);var R3i=T(S(),1);var VDi=T(S(),1),MA=`struct Ray { vec3 pos; vec3 dir; vec3 rawDir; }; #if defined(JITTER) /** * Generate a pseudo-random value for a given 2D screen coordinate. * Similar to https://www.shadertoy.com/view/4djSRW with a modified hashscale. */ float hash(vec2 p) { vec3 p3 = fract(vec3(p.xyx) * 50.0); p3 += dot(p3, p3.yzx + 19.19); return fract((p3.x + p3.y) * p3.z); } #endif float minComponent(in vec3 v) { return min(min(v.x, v.y), v.z); } float maxComponent(in vec3 v) { return max(max(v.x, v.y), v.z); } struct PointJacobianT { vec3 point; mat3 jacobianT; }; `;var RDi=T(S(),1),NA=`// See Intersection.glsl for the definition of intersectScene // See IntersectionUtils.glsl for the definition of nextIntersection // See convertUvToBox.glsl, convertUvToCylinder.glsl, or convertUvToEllipsoid.glsl // for the definition of convertUvToShapeUvSpace. The appropriate function is // selected based on the VoxelPrimitive shape type, and added to the shader in // Scene/VoxelRenderResources.js. // See Octree.glsl for the definitions of TraversalData, SampleData, // traverseOctreeFromBeginning, and traverseOctreeFromExisting // See Megatexture.glsl for the definition of accumulatePropertiesFromMegatexture #define STEP_COUNT_MAX 1000 // Harcoded value because GLSL doesn't like variable length loops #if defined(PICKING_VOXEL) #define ALPHA_ACCUM_MAX 0.1 #else #define ALPHA_ACCUM_MAX 0.98 // Must be > 0.0 and <= 1.0 #endif uniform mat3 u_transformDirectionViewToLocal; uniform vec3 u_cameraPositionUv; uniform float u_stepSize; #if defined(PICKING) uniform vec4 u_pickColor; #endif vec3 getSampleSize(in int level) { vec3 sampleCount = exp2(float(level)) * vec3(u_dimensions); vec3 sampleSizeUv = 1.0 / sampleCount; return scaleShapeUvToShapeSpace(sampleSizeUv); } #define MINIMUM_STEP_SCALAR (0.02) #define SHIFT_FRACTION (0.001) /** * Given a coordinate within a tile, and sample spacings along a ray through * the coordinate, find the distance to the points where the ray entered and * exited the voxel cell, along with the surface normals at those points. * The surface normals are returned in shape space coordinates. */ RayShapeIntersection getVoxelIntersection(in vec3 tileUv, in vec3 sampleSizeAlongRay) { vec3 voxelCoord = tileUv * vec3(u_dimensions); vec3 directions = sign(sampleSizeAlongRay); vec3 positiveDirections = max(directions, 0.0); vec3 entryCoord = mix(ceil(voxelCoord), floor(voxelCoord), positiveDirections); vec3 exitCoord = entryCoord + directions; vec3 distanceFromEntry = -abs((entryCoord - voxelCoord) * sampleSizeAlongRay); float lastEntry = maxComponent(distanceFromEntry); bvec3 isLastEntry = equal(distanceFromEntry, vec3(lastEntry)); vec3 entryNormal = -1.0 * vec3(isLastEntry) * directions; vec4 entry = vec4(entryNormal, lastEntry); vec3 distanceToExit = abs((exitCoord - voxelCoord) * sampleSizeAlongRay); float firstExit = minComponent(distanceToExit); bvec3 isFirstExit = equal(distanceToExit, vec3(firstExit)); vec3 exitNormal = vec3(isFirstExit) * directions; vec4 exit = vec4(exitNormal, firstExit); return RayShapeIntersection(entry, exit); } vec4 getStepSize(in SampleData sampleData, in Ray viewRay, in RayShapeIntersection shapeIntersection, in mat3 jacobianT, in float currentT) { // The Jacobian is computed in a space where the shape spans [-1, 1]. // But the ray is marched in a space where the shape fills [0, 1]. // So we need to scale the Jacobian by 2. vec3 gradient = 2.0 * viewRay.rawDir * jacobianT; vec3 sampleSizeAlongRay = getSampleSize(sampleData.tileCoords.w) / gradient; RayShapeIntersection voxelIntersection = getVoxelIntersection(sampleData.tileUv, sampleSizeAlongRay); // Transform normal from shape space to Cartesian space vec3 voxelNormal = normalize(jacobianT * voxelIntersection.entry.xyz); // Compare with the shape intersection, to choose the appropriate normal vec4 voxelEntry = vec4(voxelNormal, currentT + voxelIntersection.entry.w); vec4 entry = intersectionMax(shapeIntersection.entry, voxelEntry); float fixedStep = minComponent(abs(sampleSizeAlongRay)) * u_stepSize; float shift = fixedStep * SHIFT_FRACTION; float dt = voxelIntersection.exit.w + shift; if ((currentT + dt) > shapeIntersection.exit.w) { // Stop at end of shape dt = shapeIntersection.exit.w - currentT + shift; } float stepSize = clamp(dt, fixedStep * MINIMUM_STEP_SCALAR, fixedStep + shift); return vec4(entry.xyz, stepSize); } vec2 packIntToVec2(int value) { float shifted = float(value) / 255.0; float lowBits = fract(shifted); float highBits = floor(shifted) / 255.0; return vec2(highBits, lowBits); } vec2 packFloatToVec2(float value) { float lowBits = fract(value); float highBits = floor(value) / 255.0; return vec2(highBits, lowBits); } int getSampleIndex(in SampleData sampleData) { // tileUv = 1.0 is a valid coordinate but sampleIndex = u_inputDimensions is not. // (tileUv = 1.0 corresponds to the far edge of the last sample, at index = u_inputDimensions - 1). // Clamp to [0, voxelDimensions - 0.5) to avoid numerical error before flooring vec3 maxCoordinate = vec3(u_inputDimensions) - vec3(0.5); vec3 inputCoordinate = clamp(sampleData.inputCoordinate, vec3(0.0), maxCoordinate); ivec3 sampleIndex = ivec3(floor(inputCoordinate)); // Convert to a 1D index for lookup in a 1D data array return sampleIndex.x + u_inputDimensions.x * (sampleIndex.y + u_inputDimensions.y * sampleIndex.z); } void main() { vec4 fragCoord = gl_FragCoord; vec2 screenCoord = (fragCoord.xy - czm_viewport.xy) / czm_viewport.zw; // [0,1] vec3 eyeDirection = normalize(czm_windowToEyeCoordinates(fragCoord).xyz); vec3 viewDirWorld = normalize(czm_inverseViewRotation * eyeDirection); // normalize again just in case vec3 viewDirUv = normalize(u_transformDirectionViewToLocal * eyeDirection); // normalize again just in case vec3 viewPosUv = u_cameraPositionUv; #if defined(SHAPE_ELLIPSOID) // viewDirUv has been scaled to a space where the ellipsoid is a sphere. // Undo this scaling to get the raw direction. vec3 rawDir = viewDirUv * u_ellipsoidRadiiUv; Ray viewRayUv = Ray(viewPosUv, viewDirUv, rawDir); #else Ray viewRayUv = Ray(viewPosUv, viewDirUv, viewDirUv); #endif Intersections ix; RayShapeIntersection shapeIntersection = intersectScene(screenCoord, viewRayUv, ix); // Exit early if the scene was completely missed. if (shapeIntersection.entry.w == NO_HIT) { discard; } float currentT = shapeIntersection.entry.w; float endT = shapeIntersection.exit.w; vec3 positionUv = viewPosUv + currentT * viewDirUv; PointJacobianT pointJacobian = convertUvToShapeUvSpaceDerivative(positionUv); // Traverse the tree from the start position TraversalData traversalData; SampleData sampleDatas[SAMPLE_COUNT]; traverseOctreeFromBeginning(pointJacobian.point, traversalData, sampleDatas); vec4 step = getStepSize(sampleDatas[0], viewRayUv, shapeIntersection, pointJacobian.jacobianT, currentT); #if defined(JITTER) float noise = hash(screenCoord); // [0,1] currentT += noise * step.w; positionUv += noise * step.w * viewDirUv; #endif FragmentInput fragmentInput; #if defined(STATISTICS) setStatistics(fragmentInput.metadata.statistics); #endif vec4 colorAccum = vec4(0.0); for (int stepCount = 0; stepCount < STEP_COUNT_MAX; ++stepCount) { // Read properties from the megatexture based on the traversal state Properties properties = accumulatePropertiesFromMegatexture(sampleDatas); // Prepare the custom shader inputs copyPropertiesToMetadata(properties, fragmentInput.metadata); fragmentInput.voxel.positionUv = positionUv; fragmentInput.voxel.positionShapeUv = pointJacobian.point; fragmentInput.voxel.positionUvLocal = sampleDatas[0].tileUv; fragmentInput.voxel.viewDirUv = viewDirUv; fragmentInput.voxel.viewDirWorld = viewDirWorld; fragmentInput.voxel.surfaceNormal = step.xyz; fragmentInput.voxel.travelDistance = step.w; fragmentInput.voxel.stepCount = stepCount; fragmentInput.voxel.tileIndex = sampleDatas[0].megatextureIndex; fragmentInput.voxel.sampleIndex = getSampleIndex(sampleDatas[0]); // Run the custom shader czm_modelMaterial materialOutput; fragmentMain(fragmentInput, materialOutput); // Sanitize the custom shader output vec4 color = vec4(materialOutput.diffuse, materialOutput.alpha); color.rgb = max(color.rgb, vec3(0.0)); color.a = clamp(color.a, 0.0, 1.0); // Pre-multiplied alpha blend colorAccum += (1.0 - colorAccum.a) * vec4(color.rgb * color.a, color.a); // Stop traversing if the alpha has been fully saturated if (colorAccum.a > ALPHA_ACCUM_MAX) { colorAccum.a = ALPHA_ACCUM_MAX; break; } if (step.w == 0.0) { // Shape is infinitely thin. The ray may have hit the edge of a // foreground voxel. Step ahead slightly to check for more voxels step.w == 0.00001; } // Keep raymarching currentT += step.w; positionUv = viewPosUv + currentT * viewDirUv; // Check if there's more intersections. if (currentT > endT) { #if (INTERSECTION_COUNT == 1) break; #else shapeIntersection = nextIntersection(ix); if (shapeIntersection.entry.w == NO_HIT) { break; } else { // Found another intersection. Resume raymarching there currentT = shapeIntersection.entry.w; endT = shapeIntersection.exit.w; positionUv = viewPosUv + currentT * viewDirUv; } #endif } // Traverse the tree from the current ray position. // This is similar to traverseOctreeFromBeginning but is faster when the ray is in the same tile as the previous step. pointJacobian = convertUvToShapeUvSpaceDerivative(positionUv); traverseOctreeFromExisting(pointJacobian.point, traversalData, sampleDatas); step = getStepSize(sampleDatas[0], viewRayUv, shapeIntersection, pointJacobian.jacobianT, currentT); } // Convert the alpha from [0,ALPHA_ACCUM_MAX] to [0,1] colorAccum.a /= ALPHA_ACCUM_MAX; #if defined(PICKING) // If alpha is 0.0 there is nothing to pick if (colorAccum.a == 0.0) { discard; } out_FragColor = u_pickColor; #elif defined(PICKING_VOXEL) // If alpha is 0.0 there is nothing to pick if (colorAccum.a == 0.0) { discard; } vec2 megatextureId = packIntToVec2(sampleDatas[0].megatextureIndex); vec2 sampleIndex = packIntToVec2(getSampleIndex(sampleDatas[0])); out_FragColor = vec4(megatextureId, sampleIndex); #else out_FragColor = colorAccum; #endif } `;var GDi=T(S(),1),kA=`in vec2 position; uniform vec4 u_ndcSpaceAxisAlignedBoundingBox; void main() { vec2 aabbMin = u_ndcSpaceAxisAlignedBoundingBox.xy; vec2 aabbMax = u_ndcSpaceAxisAlignedBoundingBox.zw; vec2 translation = 0.5 * (aabbMax + aabbMin); vec2 scale = 0.5 * (aabbMax - aabbMin); gl_Position = vec4(position * scale + translation, 0.0, 1.0); } `;var IDi=T(S(),1),UA=`/* Intersection defines #define INTERSECTION_COUNT ### */ #define NO_HIT (-czm_infinity) #define INF_HIT (czm_infinity * 0.5) struct RayShapeIntersection { vec4 entry; vec4 exit; }; vec4 intersectionMin(in vec4 intersect0, in vec4 intersect1) { if (intersect0.w == NO_HIT) { return intersect1; } else if (intersect1.w == NO_HIT) { return intersect0; } return (intersect0.w <= intersect1.w) ? intersect0 : intersect1; } vec4 intersectionMax(in vec4 intersect0, in vec4 intersect1) { return (intersect0.w >= intersect1.w) ? intersect0 : intersect1; } RayShapeIntersection intersectIntersections(in Ray ray, in RayShapeIntersection intersect0, in RayShapeIntersection intersect1) { bool missed = (intersect0.entry.w == NO_HIT) || (intersect1.entry.w == NO_HIT) || (intersect0.exit.w < intersect1.entry.w) || (intersect0.entry.w > intersect1.exit.w); if (missed) { vec4 miss = vec4(normalize(ray.dir), NO_HIT); return RayShapeIntersection(miss, miss); } vec4 entry = intersectionMax(intersect0.entry, intersect1.entry); vec4 exit = intersectionMin(intersect0.exit, intersect1.exit); return RayShapeIntersection(entry, exit); } struct Intersections { // Don't access these member variables directly - call the functions instead. // Store an array of ray-surface intersections. Each intersection is composed of: // .xyz for the surface normal at the intersection point // .w for the T value // The scale of the normal encodes the shape intersection type: // length(intersection.xyz) = 1: positive shape entry // length(intersection.xyz) = 2: positive shape exit // length(intersection.xyz) = 3: negative shape entry // length(intersection.xyz) = 4: negative shape exit // INTERSECTION_COUNT is the number of ray-*shape* (volume) intersections, // so we need twice as many to track ray-*surface* intersections vec4 intersections[INTERSECTION_COUNT * 2]; #if (INTERSECTION_COUNT > 1) // Maintain state for future nextIntersection calls int index; int surroundCount; bool surroundIsPositive; #endif }; RayShapeIntersection getFirstIntersection(in Intersections ix) { return RayShapeIntersection(ix.intersections[0], ix.intersections[1]); } vec4 encodeIntersectionType(vec4 intersection, int index, bool entry) { float scale = float(index > 0) * 2.0 + float(!entry) + 1.0; return vec4(intersection.xyz * scale, intersection.w); } // Use defines instead of real functions because WebGL1 cannot access array with non-constant index. #define setIntersection(/*inout Intersections*/ ix, /*int*/ index, /*float*/ t, /*bool*/ positive, /*bool*/ enter) (ix).intersections[(index)] = vec4(0.0, float(!positive) * 2.0 + float(!enter) + 1.0, 0.0, (t)) #define setIntersectionPair(/*inout Intersections*/ ix, /*int*/ index, /*vec2*/ entryExit) (ix).intersections[(index) * 2 + 0] = vec4(0.0, float((index) > 0) * 2.0 + 1.0, 0.0, (entryExit).x); (ix).intersections[(index) * 2 + 1] = vec4(0.0, float((index) > 0) * 2.0 + 2.0, 0.0, (entryExit).y) #define setSurfaceIntersection(/*inout Intersections*/ ix, /*int*/ index, /*vec4*/ intersection, /*bool*/ positive, /*bool*/ enter) (ix).intersections[(index)] = encodeIntersectionType((intersection), int(!positive), (enter)) #define setShapeIntersection(/*inout Intersections*/ ix, /*int*/ index, /*RayShapeIntersection*/ intersection) (ix).intersections[(index) * 2 + 0] = encodeIntersectionType((intersection).entry, (index), true); (ix).intersections[(index) * 2 + 1] = encodeIntersectionType((intersection).exit, (index), false) #if (INTERSECTION_COUNT > 1) void initializeIntersections(inout Intersections ix) { // Sort the intersections from min T to max T with bubble sort. // Note: If this sorting function changes, some of the intersection test may // need to be updated. Search for "bubble sort" to find those areas. const int sortPasses = INTERSECTION_COUNT * 2 - 1; for (int n = sortPasses; n > 0; --n) { for (int i = 0; i < sortPasses; ++i) { // The loop should be: for (i = 0; i < n; ++i) {...} but WebGL1 cannot // loop with non-constant condition, so it has to break early instead if (i >= n) { break; } vec4 intersect0 = ix.intersections[i + 0]; vec4 intersect1 = ix.intersections[i + 1]; bool inOrder = intersect0.w <= intersect1.w; ix.intersections[i + 0] = inOrder ? intersect0 : intersect1; ix.intersections[i + 1] = inOrder ? intersect1 : intersect0; } } // Prepare initial state for nextIntersection ix.index = 0; ix.surroundCount = 0; ix.surroundIsPositive = false; } #endif #if (INTERSECTION_COUNT > 1) RayShapeIntersection nextIntersection(inout Intersections ix) { vec4 surfaceIntersection = vec4(0.0, 0.0, 0.0, NO_HIT); RayShapeIntersection shapeIntersection = RayShapeIntersection(surfaceIntersection, surfaceIntersection); const int passCount = INTERSECTION_COUNT * 2; if (ix.index == passCount) { return shapeIntersection; } for (int i = 0; i < passCount; ++i) { // The loop should be: for (i = ix.index; i < passCount; ++i) {...} but WebGL1 cannot // loop with non-constant condition, so it has to continue instead. if (i < ix.index) { continue; } ix.index = i + 1; surfaceIntersection = ix.intersections[i]; int intersectionType = int(length(surfaceIntersection.xyz) - 0.5); bool currShapeIsPositive = intersectionType < 2; bool enter = intMod(intersectionType, 2) == 0; ix.surroundCount += enter ? +1 : -1; ix.surroundIsPositive = currShapeIsPositive ? enter : ix.surroundIsPositive; // entering positive or exiting negative if (ix.surroundCount == 1 && ix.surroundIsPositive && enter == currShapeIsPositive) { shapeIntersection.entry = surfaceIntersection; } // exiting positive or entering negative after being inside positive bool exitPositive = !enter && currShapeIsPositive && ix.surroundCount == 0; bool enterNegativeFromPositive = enter && !currShapeIsPositive && ix.surroundCount == 2 && ix.surroundIsPositive; if (exitPositive || enterNegativeFromPositive) { shapeIntersection.exit = surfaceIntersection; // entry and exit have been found, so the loop can stop if (exitPositive) { // After exiting positive shape there is nothing left to intersect, so jump to the end index. ix.index = passCount; } break; } } return shapeIntersection; } #endif // NOTE: initializeIntersections, nextIntersection aren't even declared unless INTERSECTION_COUNT > 1 `;var WDi=T(S(),1),DA=`// See IntersectionUtils.glsl for the definitions of Ray, Intersections, // setIntersectionPair, INF_HIT, NO_HIT /* intersectDepth defines (set in Scene/VoxelRenderResources.js) #define DEPTH_INTERSECTION_INDEX ### */ uniform mat4 u_transformPositionViewToUv; void intersectDepth(in vec2 screenCoord, in Ray ray, inout Intersections ix) { float logDepthOrDepth = czm_unpackDepth(texture(czm_globeDepthTexture, screenCoord)); if (logDepthOrDepth != 0.0) { // Calculate how far the ray must travel before it hits the depth buffer. vec4 eyeCoordinateDepth = czm_screenToEyeCoordinates(screenCoord, logDepthOrDepth); eyeCoordinateDepth /= eyeCoordinateDepth.w; vec3 depthPositionUv = vec3(u_transformPositionViewToUv * eyeCoordinateDepth); float t = dot(depthPositionUv - ray.pos, ray.dir); setIntersectionPair(ix, DEPTH_INTERSECTION_INDEX, vec2(t, +INF_HIT)); } else { // There's no depth at this location. setIntersectionPair(ix, DEPTH_INTERSECTION_INDEX, vec2(NO_HIT)); } } `;var vDi=T(S(),1),BA=`// See IntersectionUtils.glsl for the definitions of Ray, Intersections, INF_HIT, // NO_HIT, setShapeIntersection /* Clipping plane defines (set in Scene/VoxelRenderResources.js) #define CLIPPING_PLANES_UNION #define CLIPPING_PLANES_COUNT #define CLIPPING_PLANES_INTERSECTION_INDEX */ uniform sampler2D u_clippingPlanesTexture; uniform mat4 u_clippingPlanesMatrix; // Plane is in Hessian Normal Form vec4 intersectPlane(in Ray ray, in vec4 plane) { vec3 n = plane.xyz; // normal float w = plane.w; // -dot(pointOnPlane, normal) float a = dot(ray.pos, n); float b = dot(ray.dir, n); float t = -(w + a) / b; return vec4(n, t); } void intersectClippingPlanes(in Ray ray, inout Intersections ix) { vec4 backSide = vec4(-ray.dir, -INF_HIT); vec4 farSide = vec4(ray.dir, +INF_HIT); RayShapeIntersection clippingVolume; #if (CLIPPING_PLANES_COUNT == 1) // Union and intersection are the same when there's one clipping plane, and the code // is more simplified. vec4 planeUv = getClippingPlane(u_clippingPlanesTexture, 0, u_clippingPlanesMatrix); vec4 intersection = intersectPlane(ray, planeUv); bool reflects = dot(ray.dir, intersection.xyz) < 0.0; clippingVolume.entry = reflects ? backSide : intersection; clippingVolume.exit = reflects ? intersection : farSide; setShapeIntersection(ix, CLIPPING_PLANES_INTERSECTION_INDEX, clippingVolume); #elif defined(CLIPPING_PLANES_UNION) vec4 firstTransmission = vec4(ray.dir, +INF_HIT); vec4 lastReflection = vec4(-ray.dir, -INF_HIT); for (int i = 0; i < CLIPPING_PLANES_COUNT; i++) { vec4 planeUv = getClippingPlane(u_clippingPlanesTexture, i, u_clippingPlanesMatrix); vec4 intersection = intersectPlane(ray, planeUv); if (dot(ray.dir, planeUv.xyz) > 0.0) { firstTransmission = intersection.w <= firstTransmission.w ? intersection : firstTransmission; } else { lastReflection = intersection.w >= lastReflection.w ? intersection : lastReflection; } } clippingVolume.entry = backSide; clippingVolume.exit = lastReflection; setShapeIntersection(ix, CLIPPING_PLANES_INTERSECTION_INDEX + 0, clippingVolume); clippingVolume.entry = firstTransmission; clippingVolume.exit = farSide; setShapeIntersection(ix, CLIPPING_PLANES_INTERSECTION_INDEX + 1, clippingVolume); #else // intersection vec4 lastTransmission = vec4(ray.dir, -INF_HIT); vec4 firstReflection = vec4(-ray.dir, +INF_HIT); for (int i = 0; i < CLIPPING_PLANES_COUNT; i++) { vec4 planeUv = getClippingPlane(u_clippingPlanesTexture, i, u_clippingPlanesMatrix); vec4 intersection = intersectPlane(ray, planeUv); if (dot(ray.dir, planeUv.xyz) > 0.0) { lastTransmission = intersection.w > lastTransmission.w ? intersection : lastTransmission; } else { firstReflection = intersection.w < firstReflection.w ? intersection: firstReflection; } } if (lastTransmission.w < firstReflection.w) { clippingVolume.entry = lastTransmission; clippingVolume.exit = firstReflection; } else { clippingVolume.entry = vec4(-ray.dir, NO_HIT); clippingVolume.exit = vec4(ray.dir, NO_HIT); } setShapeIntersection(ix, CLIPPING_PLANES_INTERSECTION_INDEX, clippingVolume); #endif } `;var FDi=T(S(),1),LL=`// See IntersectionUtils.glsl for the definitions of Ray, NO_HIT, INF_HIT, // RayShapeIntersection vec4 intersectLongitude(in Ray ray, in float angle, in bool positiveNormal) { float normalSign = positiveNormal ? 1.0 : -1.0; vec2 planeNormal = vec2(-sin(angle), cos(angle)) * normalSign; vec2 position = ray.pos.xy; vec2 direction = ray.dir.xy; float approachRate = dot(direction, planeNormal); float distance = -dot(position, planeNormal); float t = (approachRate == 0.0) ? NO_HIT : distance / approachRate; return vec4(planeNormal, 0.0, t); } RayShapeIntersection intersectHalfSpace(in Ray ray, in float angle, in bool positiveNormal) { vec4 intersection = intersectLongitude(ray, angle, positiveNormal); vec4 farSide = vec4(normalize(ray.dir), INF_HIT); bool hitFront = (intersection.w > 0.0) == (dot(ray.pos.xy, intersection.xy) > 0.0); if (!hitFront) { return RayShapeIntersection(intersection, farSide); } else { return RayShapeIntersection(-1.0 * farSide, intersection); } } void intersectFlippedWedge(in Ray ray, in vec2 minMaxAngle, out RayShapeIntersection intersections[2]) { intersections[0] = intersectHalfSpace(ray, minMaxAngle.x, false); intersections[1] = intersectHalfSpace(ray, minMaxAngle.y, true); } bool hitPositiveHalfPlane(in Ray ray, in vec4 intersection, in bool positiveNormal) { float normalSign = positiveNormal ? 1.0 : -1.0; vec2 planeDirection = vec2(intersection.y, -intersection.x) * normalSign; vec2 hit = ray.pos.xy + intersection.w * ray.dir.xy; return dot(hit, planeDirection) > 0.0; } void intersectHalfPlane(in Ray ray, in float angle, out RayShapeIntersection intersections[2]) { vec4 intersection = intersectLongitude(ray, angle, true); vec4 farSide = vec4(normalize(ray.dir), INF_HIT); if (hitPositiveHalfPlane(ray, intersection, true)) { intersections[0].entry = -1.0 * farSide; intersections[0].exit = vec4(-1.0 * intersection.xy, 0.0, intersection.w); intersections[1].entry = intersection; intersections[1].exit = farSide; } else { vec4 miss = vec4(normalize(ray.dir), NO_HIT); intersections[0].entry = -1.0 * farSide; intersections[0].exit = farSide; intersections[1].entry = miss; intersections[1].exit = miss; } } RayShapeIntersection intersectRegularWedge(in Ray ray, in vec2 minMaxAngle) { // Note: works for maxAngle > minAngle + pi, where the "regular wedge" // is actually a negative volume. // Compute intersections with the two planes. // Normals will point toward the "outside" (negative space) vec4 intersect1 = intersectLongitude(ray, minMaxAngle.x, false); vec4 intersect2 = intersectLongitude(ray, minMaxAngle.y, true); // Choose intersection with smallest T as the "first", the other as "last" // Note: first or last could be in the "shadow" wedge, beyond the tip bool inOrder = intersect1.w <= intersect2.w; vec4 first = inOrder ? intersect1 : intersect2; vec4 last = inOrder ? intersect2 : intersect1; bool firstIsAhead = first.w >= 0.0; bool startedInsideFirst = dot(ray.pos.xy, first.xy) < 0.0; bool exitFromInside = firstIsAhead == startedInsideFirst; bool lastIsAhead = last.w > 0.0; bool startedOutsideLast = dot(ray.pos.xy, last.xy) >= 0.0; bool enterFromOutside = lastIsAhead == startedOutsideLast; vec4 farSide = vec4(normalize(ray.dir), INF_HIT); vec4 miss = vec4(normalize(ray.dir), NO_HIT); if (exitFromInside && enterFromOutside) { // Ray crosses both faces of negative wedge, exiting then entering the positive shape return RayShapeIntersection(first, last); } else if (!exitFromInside && enterFromOutside) { // Ray starts inside wedge. last is in shadow wedge, and first is actually the entry return RayShapeIntersection(-1.0 * farSide, first); } else if (exitFromInside && !enterFromOutside) { // First intersection was in the shadow wedge, so last is actually the exit return RayShapeIntersection(last, farSide); } else { // !exitFromInside && !enterFromOutside // Both intersections were in the shadow wedge return RayShapeIntersection(miss, miss); } } `;var MDi=T(S(),1),OA=`// See IntersectionUtils.glsl for the definitions of Ray, RayShapeIntersection, // NO_HIT, Intersections /* Box defines (set in Scene/VoxelBoxShape.js) #define BOX_INTERSECTION_INDEX ### // always 0 */ uniform vec3 u_renderMinBounds; uniform vec3 u_renderMaxBounds; RayShapeIntersection intersectBox(in Ray ray, in vec3 minBound, in vec3 maxBound) { // Consider the box as the intersection of the space between 3 pairs of parallel planes // Compute the distance along the ray to each plane vec3 t0 = (minBound - ray.pos) / ray.dir; vec3 t1 = (maxBound - ray.pos) / ray.dir; // Identify candidate entries/exits based on distance from ray.pos vec3 entries = min(t0, t1); vec3 exits = max(t0, t1); vec3 directions = sign(ray.dir); // The actual intersection points are the furthest entry and the closest exit float lastEntry = maxComponent(entries); bvec3 isLastEntry = equal(entries, vec3(lastEntry)); vec3 entryNormal = -1.0 * vec3(isLastEntry) * directions; vec4 entry = vec4(entryNormal, lastEntry); float firstExit = minComponent(exits); bvec3 isFirstExit = equal(exits, vec3(firstExit)); vec3 exitNormal = vec3(isLastEntry) * directions; vec4 exit = vec4(exitNormal, firstExit); if (entry.w > exit.w) { entry.w = NO_HIT; exit.w = NO_HIT; } return RayShapeIntersection(entry, exit); } void intersectShape(in Ray ray, inout Intersections ix) { RayShapeIntersection intersection = intersectBox(ray, u_renderMinBounds, u_renderMaxBounds); setShapeIntersection(ix, BOX_INTERSECTION_INDEX, intersection); } `;var kDi=T(S(),1),YA=`// See IntersectionUtils.glsl for the definitions of Ray, NO_HIT, Intersections, // RayShapeIntersection, setSurfaceIntersection, setShapeIntersection, // intersectIntersections // See IntersectLongitude.glsl for the definitions of intersectHalfPlane, // intersectFlippedWedge, intersectRegularWedge /* Cylinder defines (set in Scene/VoxelCylinderShape.js) #define CYLINDER_HAS_RENDER_BOUNDS_RADIUS_MIN #define CYLINDER_HAS_RENDER_BOUNDS_RADIUS_FLAT #define CYLINDER_HAS_RENDER_BOUNDS_ANGLE #define CYLINDER_HAS_RENDER_BOUNDS_ANGLE_RANGE_UNDER_HALF #define CYLINDER_HAS_RENDER_BOUNDS_ANGLE_RANGE_OVER_HALF #define CYLINDER_HAS_RENDER_BOUNDS_ANGLE_RANGE_EQUAL_ZERO #define CYLINDER_INTERSECTION_INDEX_RADIUS_MAX #define CYLINDER_INTERSECTION_INDEX_RADIUS_MIN #define CYLINDER_INTERSECTION_INDEX_ANGLE */ // Cylinder uniforms uniform vec2 u_cylinderRenderRadiusMinMax; uniform vec2 u_cylinderRenderHeightMinMax; #if defined(CYLINDER_HAS_RENDER_BOUNDS_ANGLE) uniform vec2 u_cylinderRenderAngleMinMax; #endif /** * Find the intersection of a ray with the volume defined by two planes of constant z */ RayShapeIntersection intersectHeightBounds(in Ray ray, in vec2 minMaxHeight, in bool convex) { float zPosition = ray.pos.z; float zDirection = ray.dir.z; float tmin = (minMaxHeight.x - zPosition) / zDirection; float tmax = (minMaxHeight.y - zPosition) / zDirection; // Normals point outside the volume float signFlip = convex ? 1.0 : -1.0; vec4 intersectMin = vec4(0.0, 0.0, -1.0 * signFlip, tmin); vec4 intersectMax = vec4(0.0, 0.0, 1.0 * signFlip, tmax); bool topEntry = zDirection < 0.0; vec4 entry = topEntry ? intersectMax : intersectMin; vec4 exit = topEntry ? intersectMin : intersectMax; return RayShapeIntersection(entry, exit); } /** * Find the intersection of a ray with a right cylindrical surface of a given radius * about the z-axis. */ RayShapeIntersection intersectCylinder(in Ray ray, in float radius, in bool convex) { vec2 position = ray.pos.xy; vec2 direction = ray.dir.xy; float a = dot(direction, direction); float b = dot(position, direction); float c = dot(position, position) - radius * radius; float determinant = b * b - a * c; if (determinant < 0.0) { vec4 miss = vec4(normalize(ray.dir), NO_HIT); return RayShapeIntersection(miss, miss); } determinant = sqrt(determinant); float t1 = (-b - determinant) / a; float t2 = (-b + determinant) / a; float signFlip = convex ? 1.0 : -1.0; vec4 intersect1 = vec4(normalize(position + t1 * direction) * signFlip, 0.0, t1); vec4 intersect2 = vec4(normalize(position + t2 * direction) * signFlip, 0.0, t2); return RayShapeIntersection(intersect1, intersect2); } /** * Find the intersection of a ray with a right cylindrical solid of given * radius and height bounds. NOTE: The shape is assumed to be convex. */ RayShapeIntersection intersectBoundedCylinder(in Ray ray, in float radius, in vec2 minMaxHeight) { RayShapeIntersection cylinderIntersection = intersectCylinder(ray, radius, true); RayShapeIntersection heightBoundsIntersection = intersectHeightBounds(ray, minMaxHeight, true); return intersectIntersections(ray, cylinderIntersection, heightBoundsIntersection); } void intersectShape(Ray ray, inout Intersections ix) { // Position is converted from [0,1] to [-1,+1] because shape intersections assume unit space is [-1,+1]. // Direction is scaled as well to be in sync with position. ray.pos = ray.pos * 2.0 - 1.0; ray.dir *= 2.0; RayShapeIntersection outerIntersect = intersectBoundedCylinder(ray, u_cylinderRenderRadiusMinMax.y, u_cylinderRenderHeightMinMax); setShapeIntersection(ix, CYLINDER_INTERSECTION_INDEX_RADIUS_MAX, outerIntersect); if (outerIntersect.entry.w == NO_HIT) { return; } #if defined(CYLINDER_HAS_RENDER_BOUNDS_RADIUS_FLAT) // When the cylinder is perfectly thin it's necessary to sandwich the // inner cylinder intersection inside the outer cylinder intersection. // Without this special case, // [outerMin, outerMax, innerMin, innerMax] will bubble sort to // [outerMin, innerMin, outerMax, innerMax] which will cause the back // side of the cylinder to be invisible because it will think the ray // is still inside the inner (negative) cylinder after exiting the // outer (positive) cylinder. // With this special case, // [outerMin, innerMin, innerMax, outerMax] will bubble sort to // [outerMin, innerMin, innerMax, outerMax] which will work correctly. // Note: If initializeIntersections() changes its sorting function // from bubble sort to something else, this code may need to change. RayShapeIntersection innerIntersect = intersectCylinder(ray, 1.0, false); setSurfaceIntersection(ix, 0, outerIntersect.entry, true, true); // positive, enter setSurfaceIntersection(ix, 1, innerIntersect.entry, false, true); // negative, enter setSurfaceIntersection(ix, 2, innerIntersect.exit, false, false); // negative, exit setSurfaceIntersection(ix, 3, outerIntersect.exit, true, false); // positive, exit #elif defined(CYLINDER_HAS_RENDER_BOUNDS_RADIUS_MIN) RayShapeIntersection innerIntersect = intersectCylinder(ray, u_cylinderRenderRadiusMinMax.x, false); setShapeIntersection(ix, CYLINDER_INTERSECTION_INDEX_RADIUS_MIN, innerIntersect); #endif #if defined(CYLINDER_HAS_RENDER_BOUNDS_ANGLE_RANGE_UNDER_HALF) RayShapeIntersection wedgeIntersect = intersectRegularWedge(ray, u_cylinderRenderAngleMinMax); setShapeIntersection(ix, CYLINDER_INTERSECTION_INDEX_ANGLE, wedgeIntersect); #elif defined(CYLINDER_HAS_RENDER_BOUNDS_ANGLE_RANGE_OVER_HALF) RayShapeIntersection wedgeIntersects[2]; intersectFlippedWedge(ray, u_cylinderRenderAngleMinMax, wedgeIntersects); setShapeIntersection(ix, CYLINDER_INTERSECTION_INDEX_ANGLE + 0, wedgeIntersects[0]); setShapeIntersection(ix, CYLINDER_INTERSECTION_INDEX_ANGLE + 1, wedgeIntersects[1]); #elif defined(CYLINDER_HAS_RENDER_BOUNDS_ANGLE_RANGE_EQUAL_ZERO) RayShapeIntersection wedgeIntersects[2]; intersectHalfPlane(ray, u_cylinderRenderAngleMinMax.x, wedgeIntersects); setShapeIntersection(ix, CYLINDER_INTERSECTION_INDEX_ANGLE + 0, wedgeIntersects[0]); setShapeIntersection(ix, CYLINDER_INTERSECTION_INDEX_ANGLE + 1, wedgeIntersects[1]); #endif } `;var DDi=T(S(),1),HA=`// See IntersectionUtils.glsl for the definitions of Ray, NO_HIT, INF_HIT, Intersections, // RayShapeIntersection, setSurfaceIntersection, setShapeIntersection // See IntersectLongitude.glsl for the definitions of intersectHalfPlane, // intersectFlippedWedge, intersectRegularWedge /* Ellipsoid defines (set in Scene/VoxelEllipsoidShape.js) #define ELLIPSOID_HAS_RENDER_BOUNDS_LONGITUDE #define ELLIPSOID_HAS_RENDER_BOUNDS_LONGITUDE_RANGE_EQUAL_ZERO #define ELLIPSOID_HAS_RENDER_BOUNDS_LONGITUDE_RANGE_UNDER_HALF #define ELLIPSOID_HAS_RENDER_BOUNDS_LONGITUDE_RANGE_OVER_HALF #define ELLIPSOID_HAS_RENDER_BOUNDS_LATITUDE_MAX_UNDER_HALF #define ELLIPSOID_HAS_RENDER_BOUNDS_LATITUDE_MAX_EQUAL_HALF #define ELLIPSOID_HAS_RENDER_BOUNDS_LATITUDE_MAX_OVER_HALF #define ELLIPSOID_HAS_RENDER_BOUNDS_LATITUDE_MIN_UNDER_HALF #define ELLIPSOID_HAS_RENDER_BOUNDS_LATITUDE_MIN_EQUAL_HALF #define ELLIPSOID_HAS_RENDER_BOUNDS_LATITUDE_MIN_OVER_HALF #define ELLIPSOID_INTERSECTION_INDEX_LONGITUDE #define ELLIPSOID_INTERSECTION_INDEX_LATITUDE_MAX #define ELLIPSOID_INTERSECTION_INDEX_LATITUDE_MIN #define ELLIPSOID_INTERSECTION_INDEX_HEIGHT_MAX #define ELLIPSOID_INTERSECTION_INDEX_HEIGHT_MIN */ #if defined(ELLIPSOID_HAS_RENDER_BOUNDS_LONGITUDE) uniform vec2 u_ellipsoidRenderLongitudeMinMax; #endif uniform float u_eccentricitySquared; uniform vec2 u_ellipsoidRenderLatitudeSinMinMax; uniform vec2 u_clipMinMaxHeight; RayShapeIntersection intersectZPlane(in Ray ray, in float z) { float t = -ray.pos.z / ray.dir.z; bool startsOutside = sign(ray.pos.z) == sign(z); bool entry = (t >= 0.0) != startsOutside; vec4 intersect = vec4(0.0, 0.0, z, t); vec4 farSide = vec4(normalize(ray.dir), INF_HIT); if (entry) { return RayShapeIntersection(intersect, farSide); } else { return RayShapeIntersection(-1.0 * farSide, intersect); } } RayShapeIntersection intersectHeight(in Ray ray, in float relativeHeight, in bool convex) { // Scale the ray by the ellipsoid axes to make it a unit sphere // Note: approximating ellipsoid + height as an ellipsoid vec3 radiiCorrection = u_ellipsoidRadiiUv / (u_ellipsoidRadiiUv + relativeHeight); vec3 position = ray.pos * radiiCorrection; vec3 direction = ray.dir * radiiCorrection; float a = dot(direction, direction); // ~ 1.0 (or maybe 4.0 if ray is scaled) float b = dot(direction, position); // roughly inside [-1.0, 1.0] when zoomed in float c = dot(position, position) - 1.0; // ~ 0.0 when zoomed in. float determinant = b * b - a * c; // ~ b * b when zoomed in if (determinant < 0.0) { vec4 miss = vec4(normalize(direction), NO_HIT); return RayShapeIntersection(miss, miss); } determinant = sqrt(determinant); // Compute larger root using standard formula float signB = b < 0.0 ? -1.0 : 1.0; // The other root may suffer from subtractive cancellation in the standard formula. // Compute it from the first root instead. float t1 = (-b - signB * determinant) / a; float t2 = c / (a * t1); float tmin = min(t1, t2); float tmax = max(t1, t2); float directionScale = convex ? 1.0 : -1.0; vec3 d1 = directionScale * normalize(position + tmin * direction); vec3 d2 = directionScale * normalize(position + tmax * direction); return RayShapeIntersection(vec4(d1, tmin), vec4(d2, tmax)); } /** * Given a circular cone around the z-axis, with apex at the origin, * find the parametric distance(s) along a ray where that ray intersects * the cone. * The cone opening angle is described by the squared cosine of * its half-angle (the angle between the Z-axis and the surface) */ vec2 intersectDoubleEndedCone(in Ray ray, in float cosSqrHalfAngle) { vec3 o = ray.pos; vec3 d = ray.dir; float sinSqrHalfAngle = 1.0 - cosSqrHalfAngle; float aSin = d.z * d.z * sinSqrHalfAngle; float aCos = -dot(d.xy, d.xy) * cosSqrHalfAngle; float a = aSin + aCos; float bSin = d.z * o.z * sinSqrHalfAngle; float bCos = -dot(o.xy, d.xy) * cosSqrHalfAngle; float b = bSin + bCos; float cSin = o.z * o.z * sinSqrHalfAngle; float cCos = -dot(o.xy, o.xy) * cosSqrHalfAngle; float c = cSin + cCos; // determinant = b * b - a * c. But bSin * bSin = aSin * cSin. // Avoid subtractive cancellation by expanding to eliminate these terms float determinant = 2.0 * bSin * bCos + bCos * bCos - aSin * cCos - aCos * cSin - aCos * cCos; if (determinant < 0.0) { return vec2(NO_HIT); } else if (a == 0.0) { // Ray is parallel to cone surface return (b == 0.0) ? vec2(NO_HIT) // Ray is on cone surface : vec2(-0.5 * c / b, NO_HIT); } determinant = sqrt(determinant); // Compute larger root using standard formula float signB = b < 0.0 ? -1.0 : 1.0; float t1 = (-b - signB * determinant) / a; // The other root may suffer from subtractive cancellation in the standard formula. // Compute it from the first root instead. float t2 = c / (a * t1); float tmin = min(t1, t2); float tmax = max(t1, t2); return vec2(tmin, tmax); } /** * Given a point on a conical surface, find the surface normal at that point. */ vec3 getConeNormal(in vec3 p, in bool convex) { // Start with radial component pointing toward z-axis vec2 radial = -abs(p.z) * normalize(p.xy); // Z component points toward opening of cone float zSign = (p.z < 0.0) ? -1.0 : 1.0; float z = length(p.xy) * zSign; // Flip normal if shape is convex float flip = (convex) ? -1.0 : 1.0; return normalize(vec3(radial, z) * flip); } /** * Compute the shift between the ellipsoid origin and the apex of a cone of latitude */ float getLatitudeConeShift(in float sinLatitude) { // Find prime vertical radius of curvature: // the distance along the ellipsoid normal to the intersection with the z-axis float x2 = u_eccentricitySquared * sinLatitude * sinLatitude; float primeVerticalRadius = inversesqrt(1.0 - x2); // Compute a shift from the origin to the intersection of the cone with the z-axis return primeVerticalRadius * u_eccentricitySquared * sinLatitude; } void intersectFlippedCone(in Ray ray, in float cosHalfAngle, out RayShapeIntersection intersections[2]) { // Undo the scaling from ellipsoid to sphere ray.pos = ray.pos * u_ellipsoidRadiiUv; ray.dir = ray.dir * u_ellipsoidRadiiUv; // Shift the ray to account for the latitude cone not being centered at the Earth center ray.pos.z += getLatitudeConeShift(cosHalfAngle); float cosSqrHalfAngle = cosHalfAngle * cosHalfAngle; vec2 intersect = intersectDoubleEndedCone(ray, cosSqrHalfAngle); vec4 miss = vec4(normalize(ray.dir), NO_HIT); vec4 farSide = vec4(normalize(ray.dir), INF_HIT); // Initialize output with no intersections intersections[0].entry = -1.0 * farSide; intersections[0].exit = farSide; intersections[1].entry = miss; intersections[1].exit = miss; if (intersect.x == NO_HIT) { return; } // Find the points of intersection float tmin = intersect.x; float tmax = intersect.y; vec3 p0 = ray.pos + tmin * ray.dir; vec3 p1 = ray.pos + tmax * ray.dir; vec4 intersect0 = vec4(getConeNormal(p0, true), tmin); vec4 intersect1 = vec4(getConeNormal(p1, true), tmax); bool p0InShadowCone = sign(p0.z) != sign(cosHalfAngle); bool p1InShadowCone = sign(p1.z) != sign(cosHalfAngle); if (p0InShadowCone && p1InShadowCone) { // no valid intersections } else if (p0InShadowCone) { intersections[0].exit = intersect1; } else if (p1InShadowCone) { intersections[0].entry = intersect0; } else { intersections[0].exit = intersect0; intersections[1].entry = intersect1; intersections[1].exit = farSide; } } RayShapeIntersection intersectRegularCone(in Ray ray, in float cosHalfAngle, in bool convex) { // Undo the scaling from ellipsoid to sphere ray.pos = ray.pos * u_ellipsoidRadiiUv; ray.dir = ray.dir * u_ellipsoidRadiiUv; // Shift the ray to account for the latitude cone not being centered at the Earth center ray.pos.z += getLatitudeConeShift(cosHalfAngle); float cosSqrHalfAngle = cosHalfAngle * cosHalfAngle; vec2 intersect = intersectDoubleEndedCone(ray, cosSqrHalfAngle); vec4 miss = vec4(normalize(ray.dir), NO_HIT); vec4 farSide = vec4(normalize(ray.dir), INF_HIT); if (intersect.x == NO_HIT) { return RayShapeIntersection(miss, miss); } // Find the points of intersection float tmin = intersect.x; float tmax = intersect.y; vec3 p0 = ray.pos + tmin * ray.dir; vec3 p1 = ray.pos + tmax * ray.dir; vec4 intersect0 = vec4(getConeNormal(p0, convex), tmin); vec4 intersect1 = vec4(getConeNormal(p1, convex), tmax); bool p0InShadowCone = sign(p0.z) != sign(cosHalfAngle); bool p1InShadowCone = sign(p1.z) != sign(cosHalfAngle); if (p0InShadowCone && p1InShadowCone) { return RayShapeIntersection(miss, miss); } else if (p0InShadowCone) { return RayShapeIntersection(intersect1, farSide); } else if (p1InShadowCone) { return RayShapeIntersection(-1.0 * farSide, intersect0); } else { return RayShapeIntersection(intersect0, intersect1); } } void intersectShape(in Ray ray, inout Intersections ix) { // Position is converted from [0,1] to [-1,+1] because shape intersections assume unit space is [-1,+1]. // Direction is scaled as well to be in sync with position. ray.pos = ray.pos * 2.0 - 1.0; ray.dir *= 2.0; // Outer ellipsoid RayShapeIntersection outerIntersect = intersectHeight(ray, u_clipMinMaxHeight.y, true); setShapeIntersection(ix, ELLIPSOID_INTERSECTION_INDEX_HEIGHT_MAX, outerIntersect); // Exit early if the outer ellipsoid was missed. if (outerIntersect.entry.w == NO_HIT) { return; } // Inner ellipsoid RayShapeIntersection innerIntersect = intersectHeight(ray, u_clipMinMaxHeight.x, false); if (innerIntersect.entry.w == NO_HIT) { setShapeIntersection(ix, ELLIPSOID_INTERSECTION_INDEX_HEIGHT_MIN, innerIntersect); } else { // When the ellipsoid is large and thin it's possible for floating point math // to cause the ray to intersect the inner ellipsoid before the outer ellipsoid. // To prevent this from happening, clamp innerIntersect to outerIntersect and // sandwich the inner ellipsoid intersection inside the outer ellipsoid intersection. // Without this special case, // [outerMin, outerMax, innerMin, innerMax] will bubble sort to // [outerMin, innerMin, outerMax, innerMax] which will cause the back // side of the ellipsoid to be invisible because it will think the ray // is still inside the inner (negative) ellipsoid after exiting the // outer (positive) ellipsoid. // With this special case, // [outerMin, innerMin, innerMax, outerMax] will bubble sort to // [outerMin, innerMin, innerMax, outerMax] which will work correctly. // Note: If initializeIntersections() changes its sorting function // from bubble sort to something else, this code may need to change. innerIntersect.entry.w = max(innerIntersect.entry.w, outerIntersect.entry.w); innerIntersect.exit.w = min(innerIntersect.exit.w, outerIntersect.exit.w); setSurfaceIntersection(ix, 0, outerIntersect.entry, true, true); // positive, enter setSurfaceIntersection(ix, 1, innerIntersect.entry, false, true); // negative, enter setSurfaceIntersection(ix, 2, innerIntersect.exit, false, false); // negative, exit setSurfaceIntersection(ix, 3, outerIntersect.exit, true, false); // positive, exit } // Bottom cone #if defined(ELLIPSOID_HAS_RENDER_BOUNDS_LATITUDE_MIN_UNDER_HALF) RayShapeIntersection bottomConeIntersection = intersectRegularCone(ray, u_ellipsoidRenderLatitudeSinMinMax.x, false); setShapeIntersection(ix, ELLIPSOID_INTERSECTION_INDEX_LATITUDE_MIN, bottomConeIntersection); #elif defined(ELLIPSOID_HAS_RENDER_BOUNDS_LATITUDE_MIN_EQUAL_HALF) RayShapeIntersection bottomConeIntersection = intersectZPlane(ray, -1.0); setShapeIntersection(ix, ELLIPSOID_INTERSECTION_INDEX_LATITUDE_MIN, bottomConeIntersection); #elif defined(ELLIPSOID_HAS_RENDER_BOUNDS_LATITUDE_MIN_OVER_HALF) RayShapeIntersection bottomConeIntersections[2]; intersectFlippedCone(ray, u_ellipsoidRenderLatitudeSinMinMax.x, bottomConeIntersections); setShapeIntersection(ix, ELLIPSOID_INTERSECTION_INDEX_LATITUDE_MIN + 0, bottomConeIntersections[0]); setShapeIntersection(ix, ELLIPSOID_INTERSECTION_INDEX_LATITUDE_MIN + 1, bottomConeIntersections[1]); #endif // Top cone #if defined(ELLIPSOID_HAS_RENDER_BOUNDS_LATITUDE_MAX_UNDER_HALF) RayShapeIntersection topConeIntersections[2]; intersectFlippedCone(ray, u_ellipsoidRenderLatitudeSinMinMax.y, topConeIntersections); setShapeIntersection(ix, ELLIPSOID_INTERSECTION_INDEX_LATITUDE_MAX + 0, topConeIntersections[0]); setShapeIntersection(ix, ELLIPSOID_INTERSECTION_INDEX_LATITUDE_MAX + 1, topConeIntersections[1]); #elif defined(ELLIPSOID_HAS_RENDER_BOUNDS_LATITUDE_MAX_EQUAL_HALF) RayShapeIntersection topConeIntersection = intersectZPlane(ray, 1.0); setShapeIntersection(ix, ELLIPSOID_INTERSECTION_INDEX_LATITUDE_MAX, topConeIntersection); #elif defined(ELLIPSOID_HAS_RENDER_BOUNDS_LATITUDE_MAX_OVER_HALF) RayShapeIntersection topConeIntersection = intersectRegularCone(ray, u_ellipsoidRenderLatitudeSinMinMax.y, false); setShapeIntersection(ix, ELLIPSOID_INTERSECTION_INDEX_LATITUDE_MAX, topConeIntersection); #endif // Wedge #if defined(ELLIPSOID_HAS_RENDER_BOUNDS_LONGITUDE_RANGE_EQUAL_ZERO) RayShapeIntersection wedgeIntersects[2]; intersectHalfPlane(ray, u_ellipsoidRenderLongitudeMinMax.x, wedgeIntersects); setShapeIntersection(ix, ELLIPSOID_INTERSECTION_INDEX_LONGITUDE + 0, wedgeIntersects[0]); setShapeIntersection(ix, ELLIPSOID_INTERSECTION_INDEX_LONGITUDE + 1, wedgeIntersects[1]); #elif defined(ELLIPSOID_HAS_RENDER_BOUNDS_LONGITUDE_RANGE_UNDER_HALF) RayShapeIntersection wedgeIntersect = intersectRegularWedge(ray, u_ellipsoidRenderLongitudeMinMax); setShapeIntersection(ix, ELLIPSOID_INTERSECTION_INDEX_LONGITUDE, wedgeIntersect); #elif defined(ELLIPSOID_HAS_RENDER_BOUNDS_LONGITUDE_RANGE_OVER_HALF) RayShapeIntersection wedgeIntersects[2]; intersectFlippedWedge(ray, u_ellipsoidRenderLongitudeMinMax, wedgeIntersects); setShapeIntersection(ix, ELLIPSOID_INTERSECTION_INDEX_LONGITUDE + 0, wedgeIntersects[0]); setShapeIntersection(ix, ELLIPSOID_INTERSECTION_INDEX_LONGITUDE + 1, wedgeIntersects[1]); #endif } `;var ODi=T(S(),1),bS=`// Main intersection function for Voxel scenes. // See IntersectBox.glsl, IntersectCylinder.glsl, or IntersectEllipsoid.glsl // for the definition of intersectShape. The appropriate function is selected // based on the VoxelPrimitive shape type, and added to the shader in // Scene/VoxelRenderResources.js. // See also IntersectClippingPlane.glsl and IntersectDepth.glsl. // See IntersectionUtils.glsl for the definitions of Ray, NO_HIT, // getFirstIntersection, initializeIntersections, nextIntersection. /* Intersection defines (set in Scene/VoxelRenderResources.js) #define INTERSECTION_COUNT ### */ RayShapeIntersection intersectScene(in vec2 screenCoord, in Ray ray, out Intersections ix) { // Do a ray-shape intersection to find the exact starting and ending points. intersectShape(ray, ix); // Exit early if the positive shape was completely missed or behind the ray. RayShapeIntersection intersection = getFirstIntersection(ix); if (intersection.entry.w == NO_HIT) { // Positive shape was completely missed - so exit early. return intersection; } // Clipping planes #if defined(CLIPPING_PLANES) intersectClippingPlanes(ray, ix); #endif // Depth #if defined(DEPTH_TEST) intersectDepth(screenCoord, ray, ix); #endif // Find the first intersection that's in front of the ray #if (INTERSECTION_COUNT > 1) initializeIntersections(ix); for (int i = 0; i < INTERSECTION_COUNT; ++i) { intersection = nextIntersection(ix); if (intersection.exit.w > 0.0) { // Set start to 0.0 when ray is inside the shape. intersection.entry.w = max(intersection.entry.w, 0.0); break; } } #else // Set start to 0.0 when ray is inside the shape. intersection.entry.w = max(intersection.entry.w, 0.0); #endif return intersection; } `;var HDi=T(S(),1),zA=`/* Box defines (set in Scene/VoxelBoxShape.js) #define BOX_HAS_SHAPE_BOUNDS */ #if defined(BOX_HAS_SHAPE_BOUNDS) uniform vec3 u_boxUvToShapeUvScale; uniform vec3 u_boxUvToShapeUvTranslate; #endif PointJacobianT convertUvToShapeSpaceDerivative(in vec3 positionUv) { // For BOX, UV space = shape space, so we can use positionUv as-is, // and the Jacobian is the identity matrix, except that a step of 1 // only spans half the shape space [-1, 1], so the identity is scaled. return PointJacobianT(positionUv, mat3(0.5)); } vec3 convertShapeToShapeUvSpace(in vec3 positionShape) { #if defined(BOX_HAS_SHAPE_BOUNDS) return positionShape * u_boxUvToShapeUvScale + u_boxUvToShapeUvTranslate; #else return positionShape; #endif } PointJacobianT convertUvToShapeUvSpaceDerivative(in vec3 positionUv) { PointJacobianT pointJacobian = convertUvToShapeSpaceDerivative(positionUv); pointJacobian.point = convertShapeToShapeUvSpace(pointJacobian.point); return pointJacobian; } vec3 convertShapeUvToUvSpace(in vec3 shapeUv) { #if defined(BOX_HAS_SHAPE_BOUNDS) return (shapeUv - u_boxUvToShapeUvTranslate) / u_boxUvToShapeUvScale; #else return shapeUv; #endif } vec3 scaleShapeUvToShapeSpace(in vec3 shapeUv) { #if defined(BOX_HAS_SHAPE_BOUNDS) return shapeUv / u_boxUvToShapeUvScale; #else return shapeUv; #endif }`;var KDi=T(S(),1),KA=`/* Cylinder defines (set in Scene/VoxelCylinderShape.js) #define CYLINDER_HAS_SHAPE_BOUNDS_RADIUS #define CYLINDER_HAS_SHAPE_BOUNDS_HEIGHT #define CYLINDER_HAS_SHAPE_BOUNDS_ANGLE #define CYLINDER_HAS_SHAPE_BOUNDS_ANGLE_MIN_DISCONTINUITY #define CYLINDER_HAS_SHAPE_BOUNDS_ANGLE_MAX_DISCONTINUITY #define CYLINDER_HAS_SHAPE_BOUNDS_ANGLE_MIN_MAX_REVERSED */ #if defined(CYLINDER_HAS_SHAPE_BOUNDS_RADIUS) uniform vec2 u_cylinderUvToShapeUvRadius; // x = scale, y = offset #endif #if defined(CYLINDER_HAS_SHAPE_BOUNDS_HEIGHT) uniform vec2 u_cylinderUvToShapeUvHeight; // x = scale, y = offset #endif #if defined(CYLINDER_HAS_SHAPE_BOUNDS_ANGLE) uniform vec2 u_cylinderUvToShapeUvAngle; // x = scale, y = offset #endif #if defined(CYLINDER_HAS_SHAPE_BOUNDS_ANGLE_MIN_DISCONTINUITY) || defined(CYLINDER_HAS_SHAPE_BOUNDS_ANGLE_MAX_DISCONTINUITY) uniform vec2 u_cylinderShapeUvAngleMinMax; #endif #if defined(CYLINDER_HAS_SHAPE_BOUNDS_ANGLE_MIN_DISCONTINUITY) || defined(CYLINDER_HAS_SHAPE_BOUNDS_ANGLE_MAX_DISCONTINUITY) || defined(CYLINDER_HAS_SHAPE_BOUNDS_ANGLE_MIN_MAX_REVERSED) uniform float u_cylinderShapeUvAngleRangeZeroMid; #endif PointJacobianT convertUvToShapeSpaceDerivative(in vec3 positionUv) { // Convert from Cartesian UV space [0, 1] to Cartesian local space [-1, 1] vec3 position = positionUv * 2.0 - 1.0; float radius = length(position.xy); // [0, 1] vec3 radial = normalize(vec3(position.xy, 0.0)); // Shape space height is defined within [0, 1] float height = positionUv.z; // [0, 1] vec3 z = vec3(0.0, 0.0, 1.0); float angle = atan(position.y, position.x); vec3 east = normalize(vec3(-position.y, position.x, 0.0)); vec3 point = vec3(radius, angle, height); mat3 jacobianT = mat3(radial, z, east / length(position.xy)); return PointJacobianT(point, jacobianT); } vec3 convertShapeToShapeUvSpace(in vec3 positionShape) { float radius = positionShape.x; #if defined(CYLINDER_HAS_SHAPE_BOUNDS_RADIUS) radius = radius * u_cylinderUvToShapeUvRadius.x + u_cylinderUvToShapeUvRadius.y; #endif float angle = (positionShape.y + czm_pi) / czm_twoPi; #if defined(CYLINDER_HAS_SHAPE_BOUNDS_ANGLE) #if defined(CYLINDER_HAS_SHAPE_BOUNDS_ANGLE_MIN_MAX_REVERSED) // Comparing against u_cylinderShapeUvAngleMinMax has precision problems. u_cylinderShapeUvAngleRangeZeroMid is more conservative. angle += float(angle < u_cylinderShapeUvAngleRangeZeroMid); #endif // Avoid flickering from reading voxels from both sides of the -pi/+pi discontinuity. #if defined(CYLINDER_HAS_SHAPE_BOUNDS_ANGLE_MIN_DISCONTINUITY) angle = angle > u_cylinderShapeUvAngleRangeZeroMid ? u_cylinderShapeUvAngleMinMax.x : angle; #elif defined(CYLINDER_HAS_SHAPE_BOUNDS_ANGLE_MAX_DISCONTINUITY) angle = angle < u_cylinderShapeUvAngleRangeZeroMid ? u_cylinderShapeUvAngleMinMax.y : angle; #endif angle = angle * u_cylinderUvToShapeUvAngle.x + u_cylinderUvToShapeUvAngle.y; #endif float height = positionShape.z; #if defined(CYLINDER_HAS_SHAPE_BOUNDS_HEIGHT) height = height * u_cylinderUvToShapeUvHeight.x + u_cylinderUvToShapeUvHeight.y; #endif return vec3(radius, angle, height); } PointJacobianT convertUvToShapeUvSpaceDerivative(in vec3 positionUv) { PointJacobianT pointJacobian = convertUvToShapeSpaceDerivative(positionUv); pointJacobian.point = convertShapeToShapeUvSpace(pointJacobian.point); return pointJacobian; } vec3 scaleShapeUvToShapeSpace(in vec3 shapeUv) { float radius = shapeUv.x; #if defined(CYLINDER_HAS_SHAPE_BOUNDS_RADIUS) radius /= u_cylinderUvToShapeUvRadius.x; #endif float angle = shapeUv.y * czm_twoPi; #if defined(CYLINDER_HAS_SHAPE_BOUNDS_ANGLE) angle /= u_cylinderUvToShapeUvAngle.x; #endif float height = shapeUv.z; #if defined(CYLINDER_HAS_SHAPE_BOUNDS_HEIGHT) height /= u_cylinderUvToShapeUvHeight.x; #endif return vec3(radius, angle, height); } `;var QDi=T(S(),1),JA=`/* Ellipsoid defines (set in Scene/VoxelEllipsoidShape.js) #define ELLIPSOID_HAS_RENDER_BOUNDS_LONGITUDE_MIN_DISCONTINUITY #define ELLIPSOID_HAS_RENDER_BOUNDS_LONGITUDE_MAX_DISCONTINUITY #define ELLIPSOID_HAS_SHAPE_BOUNDS_LONGITUDE #define ELLIPSOID_HAS_SHAPE_BOUNDS_LONGITUDE_MIN_MAX_REVERSED #define ELLIPSOID_HAS_SHAPE_BOUNDS_LATITUDE */ uniform vec3 u_ellipsoidRadiiUv; // [0,1] uniform vec2 u_evoluteScale; // (radiiUv.x ^ 2 - radiiUv.z ^ 2) * vec2(1.0, -1.0) / radiiUv; uniform vec3 u_ellipsoidInverseRadiiSquaredUv; #if defined(ELLIPSOID_HAS_RENDER_BOUNDS_LONGITUDE_MIN_DISCONTINUITY) || defined(ELLIPSOID_HAS_RENDER_BOUNDS_LONGITUDE_MAX_DISCONTINUITY) || defined(ELLIPSOID_HAS_SHAPE_BOUNDS_LONGITUDE_MIN_MAX_REVERSED) uniform vec3 u_ellipsoidShapeUvLongitudeMinMaxMid; #endif #if defined(ELLIPSOID_HAS_SHAPE_BOUNDS_LONGITUDE) uniform vec2 u_ellipsoidUvToShapeUvLongitude; // x = scale, y = offset #endif #if defined(ELLIPSOID_HAS_SHAPE_BOUNDS_LATITUDE) uniform vec2 u_ellipsoidUvToShapeUvLatitude; // x = scale, y = offset #endif uniform float u_ellipsoidInverseHeightDifferenceUv; // robust iterative solution without trig functions // https://github.com/0xfaded/ellipse_demo/issues/1 // https://stackoverflow.com/questions/22959698/distance-from-given-point-to-given-ellipse // Extended to return radius of curvature along with the point vec3 nearestPointAndRadiusOnEllipse(vec2 pos, vec2 radii) { vec2 p = abs(pos); vec2 inverseRadii = 1.0 / radii; // We describe the ellipse parametrically: v = radii * vec2(cos(t), sin(t)) // but store the cos and sin of t in a vec2 for efficiency. // Initial guess: t = pi/4 vec2 tTrigs = vec2(0.7071067811865476); // Initial guess of point on ellipsoid vec2 v = radii * tTrigs; // Center of curvature of the ellipse at v vec2 evolute = u_evoluteScale * tTrigs * tTrigs * tTrigs; const int iterations = 3; for (int i = 0; i < iterations; ++i) { // Find the (approximate) intersection of p - evolute with the ellipsoid. vec2 q = normalize(p - evolute) * length(v - evolute); // Update the estimate of t. tTrigs = (q + evolute) * inverseRadii; tTrigs = normalize(clamp(tTrigs, 0.0, 1.0)); v = radii * tTrigs; evolute = u_evoluteScale * tTrigs * tTrigs * tTrigs; } return vec3(v * sign(pos), length(v - evolute)); } PointJacobianT convertUvToShapeSpaceDerivative(in vec3 positionUv) { // Convert from UV space [0, 1] to local space [-1, 1] vec3 position = positionUv * 2.0 - 1.0; // Undo the scaling from ellipsoid to sphere position = position * u_ellipsoidRadiiUv; float longitude = atan(position.y, position.x); vec3 east = normalize(vec3(-position.y, position.x, 0.0)); // Convert the 3D position to a 2D position relative to the ellipse (radii.x, radii.z) // (assume radii.y == radii.x) and find the nearest point on the ellipse and its normal float distanceFromZAxis = length(position.xy); vec2 posEllipse = vec2(distanceFromZAxis, position.z); vec3 surfacePointAndRadius = nearestPointAndRadiusOnEllipse(posEllipse, u_ellipsoidRadiiUv.xz); vec2 surfacePoint = surfacePointAndRadius.xy; vec2 normal2d = normalize(surfacePoint * u_ellipsoidInverseRadiiSquaredUv.xz); float latitude = atan(normal2d.y, normal2d.x); vec3 north = vec3(-normal2d.y * normalize(position.xy), abs(normal2d.x)); float heightSign = length(posEllipse) < length(surfacePoint) ? -1.0 : 1.0; float height = heightSign * length(posEllipse - surfacePoint); vec3 up = normalize(cross(east, north)); vec3 point = vec3(longitude, latitude, height); mat3 jacobianT = mat3(east / distanceFromZAxis, north / (surfacePointAndRadius.z + height), up); return PointJacobianT(point, jacobianT); } vec3 convertShapeToShapeUvSpace(in vec3 positionShape) { // Longitude: shift & scale to [0, 1] float longitude = (positionShape.x + czm_pi) / czm_twoPi; // Correct the angle when max < min // Technically this should compare against min longitude - but it has precision problems so compare against the middle of empty space. #if defined(ELLIPSOID_HAS_SHAPE_BOUNDS_LONGITUDE_MIN_MAX_REVERSED) longitude += float(longitude < u_ellipsoidShapeUvLongitudeMinMaxMid.z); #endif // Avoid flickering from reading voxels from both sides of the -pi/+pi discontinuity. #if defined(ELLIPSOID_HAS_RENDER_BOUNDS_LONGITUDE_MIN_DISCONTINUITY) longitude = longitude > u_ellipsoidShapeUvLongitudeMinMaxMid.z ? u_ellipsoidShapeUvLongitudeMinMaxMid.x : longitude; #endif #if defined(ELLIPSOID_HAS_RENDER_BOUNDS_LONGITUDE_MAX_DISCONTINUITY) longitude = longitude < u_ellipsoidShapeUvLongitudeMinMaxMid.z ? u_ellipsoidShapeUvLongitudeMinMaxMid.y : longitude; #endif #if defined(ELLIPSOID_HAS_SHAPE_BOUNDS_LONGITUDE) longitude = longitude * u_ellipsoidUvToShapeUvLongitude.x + u_ellipsoidUvToShapeUvLongitude.y; #endif // Latitude: shift and scale to [0, 1] float latitude = (positionShape.y + czm_piOverTwo) / czm_pi; #if defined(ELLIPSOID_HAS_SHAPE_BOUNDS_LATITUDE) latitude = latitude * u_ellipsoidUvToShapeUvLatitude.x + u_ellipsoidUvToShapeUvLatitude.y; #endif // Height: scale to the range [0, 1] float height = 1.0 + positionShape.z * u_ellipsoidInverseHeightDifferenceUv; return vec3(longitude, latitude, height); } PointJacobianT convertUvToShapeUvSpaceDerivative(in vec3 positionUv) { PointJacobianT pointJacobian = convertUvToShapeSpaceDerivative(positionUv); pointJacobian.point = convertShapeToShapeUvSpace(pointJacobian.point); return pointJacobian; } vec3 scaleShapeUvToShapeSpace(in vec3 shapeUv) { // Convert from [0, 1] to radians [-pi, pi] float longitude = shapeUv.x * czm_twoPi; #if defined (ELLIPSOID_HAS_SHAPE_BOUNDS_LONGITUDE) longitude /= u_ellipsoidUvToShapeUvLongitude.x; #endif // Convert from [0, 1] to radians [-pi/2, pi/2] float latitude = shapeUv.y * czm_pi; #if defined(ELLIPSOID_HAS_SHAPE_BOUNDS_LATITUDE) latitude /= u_ellipsoidUvToShapeUvLatitude.x; #endif float height = shapeUv.z / u_ellipsoidInverseHeightDifferenceUv; return vec3(longitude, latitude, height); } `;var qDi=T(S(),1),QA=`// These octree flags must be in sync with GpuOctreeFlag in VoxelTraversal.js #define OCTREE_FLAG_INTERNAL 0 #define OCTREE_FLAG_LEAF 1 #define OCTREE_FLAG_PACKED_LEAF_FROM_PARENT 2 #define OCTREE_MAX_LEVELS 32 // Harcoded value because GLSL doesn't like variable length loops uniform sampler2D u_octreeInternalNodeTexture; uniform vec2 u_octreeInternalNodeTexelSizeUv; uniform int u_octreeInternalNodeTilesPerRow; #if (SAMPLE_COUNT > 1) uniform sampler2D u_octreeLeafNodeTexture; uniform vec2 u_octreeLeafNodeTexelSizeUv; uniform int u_octreeLeafNodeTilesPerRow; #endif uniform ivec3 u_dimensions; // does not include padding, and is in the z-up orientation uniform ivec3 u_inputDimensions; // includes padding, and is in the orientation of the input data #if defined(PADDING) uniform ivec3 u_paddingBefore; #endif struct OctreeNodeData { int data; int flag; }; struct TraversalData { ivec4 octreeCoords; int parentOctreeIndex; }; struct SampleData { int megatextureIndex; ivec4 tileCoords; vec3 tileUv; vec3 inputCoordinate; #if (SAMPLE_COUNT > 1) float weight; #endif }; // Integer mod: For WebGL1 only int intMod(in int a, in int b) { return a - (b * (a / b)); } int normU8_toInt(in float value) { return int(value * 255.0); } int normU8x2_toInt(in vec2 value) { return int(value.x * 255.0) + 256 * int(value.y * 255.0); } float normU8x2_toFloat(in vec2 value) { return float(normU8x2_toInt(value)) / 65535.0; } OctreeNodeData getOctreeNodeData(in vec2 octreeUv) { vec4 texData = texture(u_octreeInternalNodeTexture, octreeUv); OctreeNodeData data; data.data = normU8x2_toInt(texData.xy); data.flag = normU8x2_toInt(texData.zw); return data; } OctreeNodeData getOctreeChildData(in int parentOctreeIndex, in ivec3 childCoord) { int childIndex = childCoord.z * 4 + childCoord.y * 2 + childCoord.x; int octreeCoordX = intMod(parentOctreeIndex, u_octreeInternalNodeTilesPerRow) * 9 + 1 + childIndex; int octreeCoordY = parentOctreeIndex / u_octreeInternalNodeTilesPerRow; vec2 octreeUv = u_octreeInternalNodeTexelSizeUv * vec2(float(octreeCoordX) + 0.5, float(octreeCoordY) + 0.5); return getOctreeNodeData(octreeUv); } int getOctreeParentIndex(in int octreeIndex) { int octreeCoordX = intMod(octreeIndex, u_octreeInternalNodeTilesPerRow) * 9; int octreeCoordY = octreeIndex / u_octreeInternalNodeTilesPerRow; vec2 octreeUv = u_octreeInternalNodeTexelSizeUv * vec2(float(octreeCoordX) + 0.5, float(octreeCoordY) + 0.5); vec4 parentData = texture(u_octreeInternalNodeTexture, octreeUv); int parentOctreeIndex = normU8x2_toInt(parentData.xy); return parentOctreeIndex; } /** * Convert a position in the uv-space of the tileset bounding shape * into the uv-space of a tile within the tileset */ vec3 getTileUv(in vec3 shapePosition, in ivec4 octreeCoords) { // PERFORMANCE_IDEA: use bit-shifting (only in WebGL2) float dimAtLevel = exp2(float(octreeCoords.w)); return shapePosition * dimAtLevel - vec3(octreeCoords.xyz); } vec3 getClampedTileUv(in vec3 shapePosition, in ivec4 octreeCoords) { vec3 tileUv = getTileUv(shapePosition, octreeCoords); return clamp(tileUv, vec3(0.0), vec3(1.0)); } void addSampleCoordinates(in vec3 shapePosition, inout SampleData sampleData) { vec3 tileUv = getClampedTileUv(shapePosition, sampleData.tileCoords); vec3 inputCoordinate = tileUv * vec3(u_dimensions); #if defined(PADDING) inputCoordinate += vec3(u_paddingBefore); #endif #if defined(GLTF_METADATA_ORDER) #if defined(SHAPE_BOX) float inputY = inputCoordinate.y; inputCoordinate.y = float(u_inputDimensions.y) - inputCoordinate.z; inputCoordinate.z = inputY; #elif defined(SHAPE_CYLINDER) float angle = inputCoordinate.y; float height = inputCoordinate.z; #if (!defined(CYLINDER_HAS_SHAPE_BOUNDS_ANGLE)) // Account for the different 0-angle convention in glTF vs 3DTiles if (sampleData.tileCoords.w == 0) { float angleCount = float(u_inputDimensions.z); angle = mod(angle + angleCount / 2.0, angleCount); } #endif inputCoordinate.y = height; inputCoordinate.z = angle; #endif #endif sampleData.tileUv = tileUv; sampleData.inputCoordinate = inputCoordinate; } void getOctreeLeafSampleData(in OctreeNodeData data, in ivec4 octreeCoords, out SampleData sampleData) { sampleData.megatextureIndex = data.data; sampleData.tileCoords = (data.flag == OCTREE_FLAG_PACKED_LEAF_FROM_PARENT) ? ivec4(octreeCoords.xyz / 2, octreeCoords.w - 1) : octreeCoords; } #if (SAMPLE_COUNT > 1) void getOctreeLeafSampleDatas(in OctreeNodeData data, in ivec4 octreeCoords, out SampleData sampleDatas[SAMPLE_COUNT]) { int leafIndex = data.data; int leafNodeTexelCount = 2; // Adding 0.5 moves to the center of the texel float leafCoordXStart = float(intMod(leafIndex, u_octreeLeafNodeTilesPerRow) * leafNodeTexelCount) + 0.5; float leafCoordY = float(leafIndex / u_octreeLeafNodeTilesPerRow) + 0.5; // Get an interpolation weight and a flag to determine whether to read the parent texture vec2 leafUv0 = u_octreeLeafNodeTexelSizeUv * vec2(leafCoordXStart + 0.0, leafCoordY); vec4 leafData0 = texture(u_octreeLeafNodeTexture, leafUv0); float lerp = normU8x2_toFloat(leafData0.xy); sampleDatas[0].weight = 1.0 - lerp; sampleDatas[1].weight = lerp; // TODO: this looks wrong? Should be comparing to OCTREE_FLAG_PACKED_LEAF_FROM_PARENT sampleDatas[0].tileCoords = (normU8_toInt(leafData0.z) == 1) ? ivec4(octreeCoords.xyz / 2, octreeCoords.w - 1) : octreeCoords; sampleDatas[1].tileCoords = (normU8_toInt(leafData0.w) == 1) ? ivec4(octreeCoords.xyz / 2, octreeCoords.w - 1) : octreeCoords; // Get megatexture indices for both samples vec2 leafUv1 = u_octreeLeafNodeTexelSizeUv * vec2(leafCoordXStart + 1.0, leafCoordY); vec4 leafData1 = texture(u_octreeLeafNodeTexture, leafUv1); sampleDatas[0].megatextureIndex = normU8x2_toInt(leafData1.xy); sampleDatas[1].megatextureIndex = normU8x2_toInt(leafData1.zw); } #endif OctreeNodeData traverseOctreeDownwards(in vec3 shapePosition, inout TraversalData traversalData) { float sizeAtLevel = exp2(-1.0 * float(traversalData.octreeCoords.w)); vec3 start = vec3(traversalData.octreeCoords.xyz) * sizeAtLevel; vec3 end = start + vec3(sizeAtLevel); OctreeNodeData childData; for (int i = 0; i < OCTREE_MAX_LEVELS; ++i) { // Find out which octree child contains the position // 0 if before center, 1 if after vec3 center = 0.5 * (start + end); vec3 childCoord = step(center, shapePosition); // Get octree coords for the next level down ivec4 octreeCoords = traversalData.octreeCoords; traversalData.octreeCoords = ivec4(octreeCoords.xyz * 2 + ivec3(childCoord), octreeCoords.w + 1); childData = getOctreeChildData(traversalData.parentOctreeIndex, ivec3(childCoord)); if (childData.flag != OCTREE_FLAG_INTERNAL) { // leaf tile - stop traversing break; } // interior tile - keep going deeper start = mix(start, center, childCoord); end = mix(center, end, childCoord); traversalData.parentOctreeIndex = childData.data; } return childData; } /** * Transform a given position to an octree tile coordinate and a position within that tile, * and find the corresponding megatexture index and texture coordinates */ void traverseOctreeFromBeginning(in vec3 shapePosition, out TraversalData traversalData, out SampleData sampleDatas[SAMPLE_COUNT]) { traversalData.octreeCoords = ivec4(0); traversalData.parentOctreeIndex = 0; OctreeNodeData nodeData = getOctreeNodeData(vec2(0.0)); if (nodeData.flag != OCTREE_FLAG_LEAF) { nodeData = traverseOctreeDownwards(shapePosition, traversalData); } #if (SAMPLE_COUNT == 1) getOctreeLeafSampleData(nodeData, traversalData.octreeCoords, sampleDatas[0]); addSampleCoordinates(shapePosition, sampleDatas[0]); #else getOctreeLeafSampleDatas(nodeData, traversalData.octreeCoords, sampleDatas); addSampleCoordinates(shapePosition, sampleDatas[0]); addSampleCoordinates(shapePosition, sampleDatas[1]); #endif } bool inRange(in vec3 v, in vec3 minVal, in vec3 maxVal) { return clamp(v, minVal, maxVal) == v; } bool insideTile(in vec3 shapePosition, in ivec4 octreeCoords) { vec3 tileUv = getTileUv(shapePosition, octreeCoords); bool inside = inRange(tileUv, vec3(0.0), vec3(1.0)); // Assume (!) the position is always inside the root tile. return inside || octreeCoords.w == 0; } void traverseOctreeFromExisting(in vec3 shapePosition, inout TraversalData traversalData, inout SampleData sampleDatas[SAMPLE_COUNT]) { if (insideTile(shapePosition, traversalData.octreeCoords)) { for (int i = 0; i < SAMPLE_COUNT; i++) { addSampleCoordinates(shapePosition, sampleDatas[i]); } return; } // Go up tree until we find a parent tile containing shapePosition for (int i = 0; i < OCTREE_MAX_LEVELS; ++i) { traversalData.octreeCoords.xyz /= 2; traversalData.octreeCoords.w -= 1; if (insideTile(shapePosition, traversalData.octreeCoords)) { break; } traversalData.parentOctreeIndex = getOctreeParentIndex(traversalData.parentOctreeIndex); } // Go down tree OctreeNodeData nodeData = traverseOctreeDownwards(shapePosition, traversalData); #if (SAMPLE_COUNT == 1) getOctreeLeafSampleData(nodeData, traversalData.octreeCoords, sampleDatas[0]); addSampleCoordinates(shapePosition, sampleDatas[0]); #else getOctreeLeafSampleDatas(nodeData, traversalData.octreeCoords, sampleDatas); addSampleCoordinates(shapePosition, sampleDatas[0]); addSampleCoordinates(shapePosition, sampleDatas[1]); #endif } `;var e3i=T(S(),1),jA=`// See Octree.glsl for the definitions of SampleData and intMod /* Megatexture defines (set in Scene/VoxelRenderResources.js) #define SAMPLE_COUNT ### #define NEAREST_SAMPLING #define PADDING */ uniform ivec2 u_megatextureSliceDimensions; // number of slices per tile, in two dimensions uniform ivec2 u_megatextureTileDimensions; // number of tiles per megatexture, in two dimensions uniform vec2 u_megatextureVoxelSizeUv; uniform vec2 u_megatextureSliceSizeUv; uniform vec2 u_megatextureTileSizeUv; // Integer min, max, clamp: For WebGL1 only int intMin(int a, int b) { return a <= b ? a : b; } int intMax(int a, int b) { return a >= b ? a : b; } int intClamp(int v, int minVal, int maxVal) { return intMin(intMax(v, minVal), maxVal); } vec2 index1DTo2DTexcoord(int index, ivec2 dimensions, vec2 uvScale) { int indexX = intMod(index, dimensions.x); int indexY = index / dimensions.x; return vec2(indexX, indexY) * uvScale; } /* How is 3D data stored in a 2D megatexture? In this example there is only one loaded tile and it has 2x2x2 voxels (8 voxels total). The data is sliced by Z. The data at Z = 0 is placed in texels (0,0), (0,1), (1,0), (1,1) and the data at Z = 1 is placed in texels (2,0), (2,1), (3,0), (3,1). Note that there could be empty space in the megatexture because it's a power of two. 0 1 2 3 +---+---+---+---+ | | | | | 3 +---+---+---+---+ | | | | | 2 +-------+-------+ |010|110|011|111| 1 |--- ---|--- ---| |000|100|001|101| 0 +-------+-------+ When doing linear interpolation the megatexture needs to be sampled twice: once for the Z slice above the voxel coordinate and once for the slice below. The two slices are interpolated with fract(coord.z - 0.5). For example, a Z coordinate of 1.0 is halfway between two Z slices so the interpolation factor is 0.5. Below is a side view of the 3D voxel grid with voxel coordinates on the left side. 2 +---+ |001| 1 +-z-+ |000| 0 +---+ When doing nearest neighbor the megatexture only needs to be sampled once at the closest Z slice. */ Properties getPropertiesFromMegatexture(in SampleData sampleData) { int tileIndex = sampleData.megatextureIndex; vec3 voxelCoord = sampleData.inputCoordinate; #if defined(NEAREST_SAMPLING) // Round to the center of the nearest voxel voxelCoord = floor(voxelCoord) + vec3(0.5); #endif // Tile location vec2 tileUvOffset = index1DTo2DTexcoord(tileIndex, u_megatextureTileDimensions, u_megatextureTileSizeUv); // Slice location float slice = voxelCoord.z - 0.5; int sliceIndex = int(floor(slice)); int sliceIndex0 = intClamp(sliceIndex, 0, u_inputDimensions.z - 1); vec2 sliceUvOffset0 = index1DTo2DTexcoord(sliceIndex0, u_megatextureSliceDimensions, u_megatextureSliceSizeUv); // Voxel location vec2 voxelUvOffset = clamp(voxelCoord.xy, vec2(0.5), vec2(u_inputDimensions.xy) - vec2(0.5)) * u_megatextureVoxelSizeUv; // Final location in the megatexture vec2 uv0 = tileUvOffset + sliceUvOffset0 + voxelUvOffset; #if defined(NEAREST_SAMPLING) return getPropertiesFromMegatextureAtUv(uv0); #else float sliceLerp = fract(slice); int sliceIndex1 = intMin(sliceIndex + 1, u_inputDimensions.z - 1); vec2 sliceUvOffset1 = index1DTo2DTexcoord(sliceIndex1, u_megatextureSliceDimensions, u_megatextureSliceSizeUv); vec2 uv1 = tileUvOffset + sliceUvOffset1 + voxelUvOffset; Properties properties0 = getPropertiesFromMegatextureAtUv(uv0); Properties properties1 = getPropertiesFromMegatextureAtUv(uv1); return mixProperties(properties0, properties1, sliceLerp); #endif } // Convert an array of sample datas to a final weighted properties. Properties accumulatePropertiesFromMegatexture(in SampleData sampleDatas[SAMPLE_COUNT]) { #if (SAMPLE_COUNT == 1) return getPropertiesFromMegatexture(sampleDatas[0]); #else // When more than one sample is taken the accumulator needs to start at 0 Properties properties = clearProperties(); for (int i = 0; i < SAMPLE_COUNT; ++i) { float weight = sampleDatas[i].weight; // Avoid reading the megatexture when the weight is 0 as it can be costly. if (weight > 0.0) { Properties tempProperties = getPropertiesFromMegatexture(sampleDatas[i]); tempProperties = scaleProperties(tempProperties, weight); properties = sumProperties(properties, tempProperties); } } return properties; #endif } `;var n3i=T(S(),1),ogt={XYZ:0,GLTF:1},zh=Object.freeze(ogt);function rgt(e){let t=new w_;this.shaderBuilder=t;let n=e._customShader,i=Lt(e._uniformMap,n.uniformMap);e._uniformMap=i;let o=n.uniforms;for(let p in o)if(o.hasOwnProperty(p)){let g=o[p];t.addUniform(g.type,p,ge.FRAGMENT)}t.addUniform("sampler2D","u_megatextureTextures[METADATA_COUNT]",ge.FRAGMENT),this.uniformMap=i;let r=e._clippingPlanes,s=l(r)&&r.enabled?r.length:0;this.clippingPlanes=r,this.clippingPlanesLength=s,t.addVertexLines([kA]);let a=e._provider.shape;e.provider.metadataOrder===zh.GLTF&&(t.addDefine("GLTF_METADATA_ORDER",void 0,ge.FRAGMENT),a==="BOX"?t.addDefine("SHAPE_BOX",void 0,ge.FRAGMENT):a==="CYLINDER"?t.addDefine("SHAPE_CYLINDER",void 0,ge.FRAGMENT):a==="ELLIPSOID"&&t.addDefine("SHAPE_ELLIPSOID",void 0,ge.FRAGMENT)),t.addFragmentLines([n.fragmentShaderText,"#line 0",QA,MA,UA,jA]),s>0&&(t.addDefine("CLIPPING_PLANES",void 0,ge.FRAGMENT),t.addDefine("CLIPPING_PLANES_COUNT",s,ge.FRAGMENT),r.unionClippingRegions&&t.addDefine("CLIPPING_PLANES_UNION",void 0,ge.FRAGMENT),t.addFragmentLines([BA])),e._depthTest&&(t.addDefine("DEPTH_TEST",void 0,ge.FRAGMENT),t.addFragmentLines([DA])),a==="BOX"?t.addFragmentLines([zA,OA,bS]):a==="CYLINDER"?t.addFragmentLines([KA,LL,YA,bS]):a==="ELLIPSOID"&&t.addFragmentLines([JA,LL,HA,bS]),t.addFragmentLines([NA]);let c=e._shape,d=c.shaderDefines;for(let p in d)if(d.hasOwnProperty(p)){let g=d[p];l(g)&&(g=g===!0?void 0:g,t.addDefine(p,g,ge.FRAGMENT))}let u=c.shaderMaximumIntersectionsLength;s>0&&(t.addDefine("CLIPPING_PLANES_INTERSECTION_INDEX",u,ge.FRAGMENT),s===1?u+=1:r.unionClippingRegions?u+=2:u+=1),e._depthTest&&(t.addDefine("DEPTH_INTERSECTION_INDEX",u,ge.FRAGMENT),u+=1),t.addDefine("INTERSECTION_COUNT",u,ge.FRAGMENT),(!m.equals(e.paddingBefore,m.ZERO)||!m.equals(e.paddingAfter,m.ZERO))&&t.addDefine("PADDING",void 0,ge.FRAGMENT),e._useLogDepth&&t.addDefine("LOG_DEPTH_READ_ONLY",void 0,ge.FRAGMENT),e._nearestSampling&&t.addDefine("NEAREST_SAMPLING",void 0,ge.FRAGMENT);let h=e._traversal;t.addDefine("SAMPLE_COUNT",`${h._sampleCount}`,ge.FRAGMENT)}var qA=rgt;var X3i=T(S(),1);function sgt(e,t){let{shaderBuilder:n}=e,{names:i,types:o,componentTypes:r,minimumValues:s,maximumValues:a}=t._provider,c=o.length,d=l(s)&&l(a);n.addDefine("METADATA_COUNT",c,ge.FRAGMENT),d&&n.addDefine("STATISTICS",void 0,ge.FRAGMENT);for(let P=0;P<c;P++){let w=i[P],A=o[P],b=`PropertyStatistics_${w}`,Z=`PropertyStatistics_${w}`;n.addStruct(b,Z,ge.FRAGMENT);let E=j3(A);n.addStructField(b,E,"min"),n.addStructField(b,E,"max")}let u="Statistics",h="Statistics",p="statistics";n.addStruct(u,h,ge.FRAGMENT);for(let P=0;P<c;P++){let w=i[P],A=`PropertyStatistics_${w}`,b=w;n.addStructField(u,A,b)}let g="Metadata",f="Metadata",x="metadata";n.addStruct(g,f,ge.FRAGMENT),n.addStructField(g,h,p);for(let P=0;P<c;P++){let w=i[P],A=o[P],b=j3(A);n.addStructField(g,b,w)}for(let P=0;P<c;P++){let w=i[P],A=o[P],b=cgt(A),Z=`VoxelProperty_${w}`,E=`VoxelProperty_${w}`;n.addStruct(Z,E,ge.FRAGMENT),n.addStructField(Z,b,"partialDerivativeLocal"),n.addStructField(Z,b,"partialDerivativeWorld"),n.addStructField(Z,b,"partialDerivativeView"),n.addStructField(Z,b,"partialDerivativeValid")}let _="Voxel",C="Voxel",V="voxel";n.addStruct(_,C,ge.FRAGMENT);for(let P=0;P<c;P++){let w=i[P],A=`VoxelProperty_${w}`;n.addStructField(_,A,w)}n.addStructField(_,"vec3","positionEC"),n.addStructField(_,"vec3","positionUv"),n.addStructField(_,"vec3","positionShapeUv"),n.addStructField(_,"vec3","positionUvLocal"),n.addStructField(_,"vec3","viewDirUv"),n.addStructField(_,"vec3","viewDirWorld"),n.addStructField(_,"vec3","surfaceNormal"),n.addStructField(_,"float","travelDistance"),n.addStructField(_,"int","stepCount"),n.addStructField(_,"int","tileIndex"),n.addStructField(_,"int","sampleIndex");let L="FragmentInput";n.addStruct(L,"FragmentInput",ge.FRAGMENT),n.addStructField(L,f,x),n.addStructField(L,C,V);let G="Properties",I="Properties",v="properties";n.addStruct(G,I,ge.FRAGMENT);for(let P=0;P<c;P++){let w=i[P],A=o[P],b=j3(A);n.addStructField(G,b,w)}{let P="clearProperties";n.addFunction(P,`${I} clearProperties()`,ge.FRAGMENT),n.addFunctionLines(P,[`${I} ${v};`]);for(let w=0;w<c;w++){let A=i[w],b=o[w],Z=r[w],E=j3(b,Z);n.addFunctionLines(P,[`${v}.${A} = ${E}(0.0);`])}n.addFunctionLines(P,[`return ${v};`])}{let P="sumProperties";n.addFunction(P,`${I} sumProperties(${I} propertiesA, ${I} propertiesB)`,ge.FRAGMENT),n.addFunctionLines(P,[`${I} ${v};`]);for(let w=0;w<c;w++){let A=i[w];n.addFunctionLines(P,[`${v}.${A} = propertiesA.${A} + propertiesB.${A};`])}n.addFunctionLines(P,[`return ${v};`])}{let P="scaleProperties";n.addFunction(P,`${I} scaleProperties(${I} ${v}, float scale)`,ge.FRAGMENT),n.addFunctionLines(P,[`${I} scaledProperties = ${v};`]);for(let w=0;w<c;w++){let A=i[w];n.addFunctionLines(P,[`scaledProperties.${A} *= scale;`])}n.addFunctionLines(P,["return scaledProperties;"])}{let P="mixProperties";n.addFunction(P,`${I} mixProperties(${I} propertiesA, ${I} propertiesB, float mixFactor)`,ge.FRAGMENT),n.addFunctionLines(P,[`${I} ${v};`]);for(let w=0;w<c;w++){let A=i[w];n.addFunctionLines(P,[`${v}.${A} = mix(propertiesA.${A}, propertiesB.${A}, mixFactor);`])}n.addFunctionLines(P,[`return ${v};`])}{let P="copyPropertiesToMetadata";n.addFunction(P,`void copyPropertiesToMetadata(in ${I} ${v}, inout ${f} ${x})`,ge.FRAGMENT);for(let w=0;w<c;w++){let A=i[w];n.addFunctionLines(P,[`${x}.${A} = ${v}.${A};`])}}if(d){let P="setStatistics";n.addFunction(P,`void setStatistics(inout ${h} ${p})`,ge.FRAGMENT);for(let w=0;w<c;w++){let A=i[w],b=o[w],Z=ut.getComponentCount(b);for(let E=0;E<Z;E++){let X=lgt(b,E),F=s[w][E],N=a[w][E];!l(F)||!l(N)||n.addFunctionLines(P,[`${p}.${A}.min${X} = ${XTe(F)};`,`${p}.${A}.max${X} = ${XTe(N)};`])}}}{let P="getPropertiesFromMegatextureAtUv";n.addFunction(P,`${I} getPropertiesFromMegatextureAtUv(vec2 texcoord)`,ge.FRAGMENT),n.addFunctionLines(P,[`${I} ${v};`]);for(let w=0;w<c;w++){let A=i[w],b=o[w],Z=r[w],E=agt(b,Z);n.addFunctionLines(P,[`properties.${A} = texture(u_megatextureTextures[${w}], texcoord)${E};`])}n.addFunctionLines(P,[`return ${v};`])}}function j3(e){if(e===ut.SCALAR)return"float";if(e===ut.VEC2)return"vec2";if(e===ut.VEC3)return"vec3";if(e===ut.VEC4)return"vec4"}function agt(e){if(e===ut.SCALAR)return".r";if(e===ut.VEC2)return".ra";if(e===ut.VEC3)return".rgb";if(e===ut.VEC4)return""}function cgt(e){if(e===ut.SCALAR)return"vec3";if(e===ut.VEC2)return"mat2";if(e===ut.VEC3)return"mat3";if(e===ut.VEC4)return"mat4"}function XTe(e){let t=e.toString();return t.indexOf(".")===-1&&(t=`${e}.0`),t}function lgt(e,t){return e===ut.SCALAR?"":`[${t}]`}var $A=sgt;function dgt(e,t){let n=new qA(e);$A(n,e);let{shaderBuilder:i,clippingPlanes:o,clippingPlanesLength:r}=n;if(r>0){let C="getClippingPlane",V=p0(o,t),L=0,R=V.indexOf(")")+1,G=V.indexOf("{",R)+1,I=V.indexOf("}",G),v=V.slice(L,R),P=V.slice(G,I);i.addFunction(C,v,ge.FRAGMENT),i.addFunctionLines(C,[P])}let s=i.clone();s.addDefine("PICKING",void 0,ge.FRAGMENT);let a=i.clone();a.addDefine("PICKING_VOXEL",void 0,ge.FRAGMENT);let c=i.buildShaderProgram(t),d=s.buildShaderProgram(t),u=a.buildShaderProgram(t),h=Ue.fromCache({cull:{enabled:!0,face:_i.BACK},depthTest:{enabled:!1},depthMask:!1,blending:hn.PRE_MULTIPLIED_ALPHA_BLEND}),p=t.getViewportQuadVertexArray(),g=e._depthTest,f=new $e({vertexArray:p,primitiveType:Ae.TRIANGLES,renderState:h,shaderProgram:c,uniformMap:n.uniformMap,modelMatrix:e._compoundModelMatrix,pass:Ge.VOXELS,executeInClosestFrustum:!0,owner:this,cull:g,occlude:g}),x=$e.shallowClone(f,new $e);x.shaderProgram=d,x.pickOnly=!0;let _=$e.shallowClone(f,new $e);if(_.shaderProgram=u,_.pickOnly=!0,l(e._drawCommand)){let C=e._drawCommand;C.shaderProgram=C.shaderProgram&&C.shaderProgram.destroy()}if(l(e._drawCommandPick)){let C=e._drawCommandPick;C.shaderProgram=C.shaderProgram&&C.shaderProgram.destroy()}if(l(e._drawCommandPickVoxel)){let C=e._drawCommandPickVoxel;C.shaderProgram=C.shaderProgram&&C.shaderProgram.destroy()}e._drawCommand=f,e._drawCommandPick=x,e._drawCommandPickVoxel=_}var eM=dgt;var pBi=T(S(),1);var H3i=T(S(),1),ugt={FLOAT:"float",VEC2:"vec2",VEC3:"vec3",VEC4:"vec4",INT:"int",INT_VEC2:"ivec2",INT_VEC3:"ivec3",INT_VEC4:"ivec4",BOOL:"bool",BOOL_VEC2:"bvec2",BOOL_VEC3:"bvec3",BOOL_VEC4:"bvec4",MAT2:"mat2",MAT3:"mat3",MAT4:"mat4",SAMPLER_2D:"sampler2D",SAMPLER_CUBE:"samplerCube"},RL=Object.freeze(ugt);var rBi=T(S(),1);var K3i=T(S(),1);function mgt(e,t,n){let i=new Uint8ClampedArray(e.buffer),o=new ImageData(i,t,n),r=document.createElement("canvas");return r.width=t,r.height=n,r.getContext("2d").putImageData(o,0,0),r}var tM=mgt;function ZL(){this._defaultTexture=void 0,this._textures={},this._loadedImages=[],this._lastUpdatedFrame=-1}ZL.prototype.getTexture=function(e){return this._textures[e]};function hgt(e,t,n){n.resource.fetchImage().then(function(i){e._loadedImages.push({id:t,image:i,textureUniform:n})}).catch(function(){let i=e._textures[t];l(i)&&i!==e._defaultTexture&&i.destroy(),e._textures[t]=e._defaultTexture})}ZL.prototype.loadTexture2D=function(e,t){l(t.typedArray)?this._loadedImages.push({id:e,textureUniform:t}):hgt(this,e,t)};function fgt(e,t,n){let{id:i,textureUniform:o,image:r}=t,s=n.webgl2?q3(o,r,n):pgt(o,r,n),a=e._textures[i];l(a)&&a!==n.defaultTexture&&a.destroy(),e._textures[i]=s}function q3(e,t,n){let{typedArray:i,sampler:o}=e,r=l(i)?PTe(e,n):new Wt({context:n,source:t,sampler:o});return WTe(o)&&r.generateMipmap(),r}function pgt(e,t,n){let{typedArray:i,sampler:o}=e,r=WTe(o),s=o.wrapS===Vn.REPEAT||o.wrapS===Vn.MIRRORED_REPEAT||o.wrapT===Vn.REPEAT||o.wrapT===Vn.MIRRORED_REPEAT,{width:a,height:c}=l(i)?e:t,d=[a,c].every(W.isPowerOfTwo);if((r||s)&&!d)if(l(i)){if(e.pixelDatatype===je.UNSIGNED_BYTE){let h=tM(i,a,c),p=_g(h);return q3({sampler:o},p,n)}}else{let h=_g(t);return q3(e,h,n)}else return q3(e,t,n);return r?console.warn("Texture requires resizing for mipmaps but pixelDataType cannot be resized. The texture may be rendered incorrectly."):s&&console.warn("Texture requires resizing for wrapping but pixelDataType cannot be resized. The texture may be rendered incorrectly."),PTe(e,n)}function WTe(e){return[qt.NEAREST_MIPMAP_NEAREST,qt.NEAREST_MIPMAP_LINEAR,qt.LINEAR_MIPMAP_NEAREST,qt.LINEAR_MIPMAP_LINEAR].includes(e.minificationFilter)}function PTe(e,t){let{pixelFormat:n,pixelDatatype:i,width:o,height:r,typedArray:s,sampler:a}=e;return new Wt({context:t,pixelFormat:n,pixelDatatype:i,source:{arrayBufferView:s,width:o,height:r},sampler:a,flipY:!1})}ZL.prototype.update=function(e){if(e.frameNumber===this._lastUpdatedFrame)return;this._lastUpdatedFrame=e.frameNumber;let t=e.context;this._defaultTexture=t.defaultTexture;let n=this._loadedImages;for(let i=0;i<n.length;i++){let o=n[i];fgt(this,o,t)}n.length=0};ZL.prototype.isDestroyed=function(){return!1};ZL.prototype.destroy=function(){let e=this._textures;for(let t in e)if(e.hasOwnProperty(t)){let n=e[t];n!==this._defaultTexture&&n.destroy()}return me(this)};var nM=ZL;function iM(e){e=y(e,y.EMPTY_OBJECT),this.mode=y(e.mode,_b.MODIFY_MATERIAL),this.lightingModel=e.lightingModel,this.uniforms=y(e.uniforms,y.EMPTY_OBJECT),this.varyings=y(e.varyings,y.EMPTY_OBJECT),this.vertexShaderText=e.vertexShaderText,this.fragmentShaderText=e.fragmentShaderText,this.translucencyMode=y(e.translucencyMode,Ag.INHERIT),this._textureManager=new nM,this._defaultTexture=void 0,this.uniformMap=bgt(this),this.usedVariablesVertex={attributeSet:{},featureIdSet:{},metadataSet:{}},this.usedVariablesFragment={attributeSet:{},featureIdSet:{},metadataSet:{},materialSet:{}},xgt(this),_gt(this)}function bgt(e){let t=e.uniforms,n={};for(let i in t)if(t.hasOwnProperty(i)){let o=t[i];o.type===RL.SAMPLER_2D?(e._textureManager.loadTexture2D(i,o.value),n[i]=ggt(e,i)):n[i]=ygt(e,i)}return n}function ggt(e,t){return function(){return y(e._textureManager.getTexture(t),e._defaultTexture)}}function ygt(e,t){return function(){return e.uniforms[t].value}}function gS(e,t,n){let i;for(;(i=t.exec(e))!==null;){let o=i[1];n[o]=!0}}function xgt(e){let t=/[vf]sInput\.attributes\.(\w+)/g,n=/[vf]sInput\.featureIds\.(\w+)/g,i=/[vf]sInput\.metadata.(\w+)/g,o,r=e.vertexShaderText;l(r)&&(o=e.usedVariablesVertex.attributeSet,gS(r,t,o),o=e.usedVariablesVertex.featureIdSet,gS(r,n,o),o=e.usedVariablesVertex.metadataSet,gS(r,i,o));let s=e.fragmentShaderText;if(l(s)){o=e.usedVariablesFragment.attributeSet,gS(s,t,o),o=e.usedVariablesFragment.featureIdSet,gS(s,n,o),o=e.usedVariablesFragment.metadataSet,gS(s,i,o);let a=/material\.(\w+)/g,c=e.usedVariablesFragment.materialSet;gS(s,a,c)}}function vTe(e){let t=/^.*MC$/,n=/^.*WC$/,i=/^.*EC$/;return t.test(e)?`${e} (model coordinates)`:n.test(e)?`${e} (Cartesian world coordinates)`:i.test(e)?`${e} (eye coordinates)`:e}function Ic(e,t,n,i){if(e.hasOwnProperty(t)){let o=`${vTe(t)} is not available in the ${i} shader. Did you mean ${vTe(n)} instead?`;throw new fe(o)}}function _gt(e){let t=e.usedVariablesVertex.attributeSet;Ic(t,"position","positionMC","vertex"),Ic(t,"normal","normalMC","vertex"),Ic(t,"tangent","tangentMC","vertex"),Ic(t,"bitangent","bitangentMC","vertex"),Ic(t,"positionWC","positionMC","vertex"),Ic(t,"positionEC","positionMC","vertex"),Ic(t,"normalEC","normalMC","vertex"),Ic(t,"tangentEC","tangentMC","vertex"),Ic(t,"bitangentEC","bitangentMC","vertex");let n=e.usedVariablesFragment.attributeSet;Ic(n,"position","positionEC","fragment"),Ic(n,"normal","normalEC","fragment"),Ic(n,"tangent","tangentEC","fragment"),Ic(n,"bitangent","bitangentEC","fragment"),Ic(n,"normalMC","normalEC","fragment"),Ic(n,"tangentMC","tangentEC","fragment"),Ic(n,"bitangentMC","bitangentEC","fragment")}iM.prototype.setUniform=function(e,t){let n=this.uniforms[e];n.type===RL.SAMPLER_2D?this._textureManager.loadTexture2D(e,t):l(t.clone)?n.value=t.clone(n.value):n.value=t};iM.prototype.update=function(e){this._defaultTexture=e.context.defaultTexture,this._textureManager.update(e)};iM.prototype.isDestroyed=function(){return!1};iM.prototype.destroy=function(){this._textureManager=this._textureManager&&this._textureManager.destroy(),me(this)};var yS=iM;var CBi=T(S(),1);function I0(e){let{loader:t,metadata:n}=e;this._loader=t,this._metadata=n,this._resourcesLoaded=!1,this._ready=!1}Object.defineProperties(I0.prototype,{ready:{get:function(){return this._ready}},metadata:{get:function(){return this._metadata}}});I0.fromMetadataArray=function(e){return new I0({metadata:e})};I0.fromGltf=async function(e){let t=new oh({gltfResource:e,releaseGltfJson:!1,loadAttributesAsTypedArray:!0});try{await t.load()}catch(n){throw t.destroy(),n}return new I0({loader:t})};I0.prototype.update=function(e,t){let n=this._loader;if(!this._ready){if(t.afterRender.push(()=>!0),!l(n)){this._ready=!0;return}if(this._resourcesLoaded){let{structuralMetadata:i,scene:o}=n.components,{attributes:r}=o.nodes[0].primitives[0];this._metadata=Tgt(r,i,e),this._ready=!0;return}this._resourcesLoaded=n.process(t)}};function Tgt(e,t,n){let{className:i,names:o,types:r,componentTypes:s}=n.provider,a=t.propertyAttributes.find(u=>u.class.id===i),{properties:c}=a,d=new Array(o.length);for(let u=0;u<e.length;u++){let h=c[o[u]].attribute,p=e.find(_=>_.name===h);if(!l(p))continue;let g=At.toComponentDatatype(s[u]),f=ut.getComponentCount(r[u]),x=p.count*f;d[u]=Q.createArrayBufferView(g,p.typedArray.buffer,p.typedArray.byteOffset+p.byteOffset,x)}return d}I0.prototype.isDestroyed=function(){return!1};I0.prototype.destroy=function(){return this._loader=this._loader&&this._loader.destroy(),me(this)};var xS=I0;var sOi=T(S(),1);var WBi=T(S(),1);function sd(){this.orientedBoundingBox=new Gn,this.boundingSphere=new de,this.boundTransform=new M,this.shapeTransform=new M,this._minBounds=m.clone(sd.DefaultMinBounds,new m),this._maxBounds=m.clone(sd.DefaultMaxBounds,new m),this.shaderUniforms={renderMinBounds:new m,renderMaxBounds:new m,boxUvToShapeUvScale:new m,boxUvToShapeUvTranslate:new m},this.shaderDefines={BOX_INTERSECTION_INDEX:void 0,BOX_HAS_SHAPE_BOUNDS:void 0},this.shaderMaximumIntersectionsLength=0}var Sgt=new m,D8=new m,Cgt=new $,Vgt=new m,Lgt=new m,Rgt=new m,Zgt=new m,wTe=M.fromRotationTranslation($.fromUniformScale(.5,new $),new m(.5,.5,.5),new M);sd.prototype.update=function(e,t,n,i,o){i=y(i,sd.DefaultMinBounds),o=y(o,sd.DefaultMaxBounds);let r=sd.DefaultMinBounds,s=sd.DefaultMaxBounds;t=this._minBounds=m.clamp(t,r,s,this._minBounds),n=this._maxBounds=m.clamp(n,r,s,this._maxBounds),i=m.clamp(i,r,s,Vgt),o=m.clamp(o,r,s,Lgt);let a=m.clamp(t,i,o,Rgt),c=m.clamp(n,i,o,Zgt),d=M.getScale(e,D8);if(a.x>c.x||a.y>c.y||a.z>c.z||(a.x===c.x)+(a.y===c.y)+(a.z===c.z)>=2||i.x>o.x||i.y>o.y||i.z>o.z||d.x===0||d.y===0||d.z===0)return!1;this.shapeTransform=M.clone(e,this.shapeTransform),this.orientedBoundingBox=O8(a,c,this.shapeTransform,this.orientedBoundingBox),this.boundTransform=M.fromRotationTranslation(this.orientedBoundingBox.halfAxes,this.orientedBoundingBox.center,this.boundTransform),this.boundingSphere=de.fromOrientedBoundingBox(this.orientedBoundingBox,this.boundingSphere);let{shaderUniforms:u,shaderDefines:h}=this;for(let f in h)h.hasOwnProperty(f)&&(h[f]=void 0);let p=!m.equals(t,r)||!m.equals(n,s),g=0;if(h.BOX_INTERSECTION_INDEX=g,g+=1,u.renderMinBounds=M.multiplyByPoint(wTe,a,u.renderMinBounds),u.renderMaxBounds=M.multiplyByPoint(wTe,c,u.renderMaxBounds),p){h.BOX_HAS_SHAPE_BOUNDS=!0;let f=t,x=n;u.boxUvToShapeUvScale=m.fromElements(2/(f.x===x.x?1:x.x-f.x),2/(f.y===x.y?1:x.y-f.y),2/(f.z===x.z?1:x.z-f.z),u.boxUvToShapeUvScale),u.boxUvToShapeUvTranslate=m.fromElements(-u.boxUvToShapeUvScale.x*(f.x*.5+.5),-u.boxUvToShapeUvScale.y*(f.y*.5+.5),-u.boxUvToShapeUvScale.z*(f.z*.5+.5),u.boxUvToShapeUvTranslate)}return this.shaderMaximumIntersectionsLength=g,!0};var $3=new m,B8=new m;sd.prototype.computeOrientedBoundingBoxForTile=function(e,t,n,i,o){let r=this._minBounds,s=this._maxBounds,a=1/Math.pow(2,e),c=m.fromElements(W.lerp(r.x,s.x,a*t),W.lerp(r.y,s.y,a*n),W.lerp(r.z,s.z,a*i),$3),d=m.fromElements(W.lerp(r.x,s.x,a*(t+1)),W.lerp(r.y,s.y,a*(n+1)),W.lerp(r.z,s.z,a*(i+1)),B8);return O8(c,d,this.shapeTransform,o)};var FTe=new m;sd.prototype.computeOrientedBoundingBoxForSample=function(e,t,n,i){let o=1/Math.pow(2,e.level),r=m.divideComponents(m.ONE,t,FTe),s=m.multiplyByScalar(r,o,FTe),a=m.multiplyByScalar(m.fromElements(e.x+n.x,e.y+n.y,e.z+n.z,$3),o,$3),c=m.add(a,s,B8),d=this._minBounds,u=this._maxBounds,h=m.fromElements(W.lerp(d.x,u.x,a.x),W.lerp(d.y,u.y,a.y),W.lerp(d.z,u.z,a.z),$3),p=m.fromElements(W.lerp(d.x,u.x,c.x),W.lerp(d.y,u.y,c.y),W.lerp(d.z,u.z,c.z),B8);return O8(h,p,this.shapeTransform,i)};sd.DefaultMinBounds=Object.freeze(new m(-1,-1,-1));sd.DefaultMaxBounds=Object.freeze(new m(1,1,1));function O8(e,t,n,i){let o=sd.DefaultMinBounds,r=sd.DefaultMaxBounds;if(m.equals(e,o)&&m.equals(t,r))i.center=M.getTranslation(n,i.center),i.halfAxes=M.getMatrix3(n,i.halfAxes);else{let a=M.getScale(n,D8),c=m.midpoint(e,t,Sgt);i.center=M.multiplyByPoint(n,c,i.center),a=m.fromElements(a.x*.5*(t.x-e.x),a.y*.5*(t.y-e.y),a.z*.5*(t.z-e.z),D8);let d=M.getRotation(n,Cgt);i.halfAxes=$.setScale(d,a,i.halfAxes)}return i}var pp=sd;var BBi=T(S(),1);function cs(){this.orientedBoundingBox=new Gn,this.boundingSphere=new de,this.boundTransform=new M,this.shapeTransform=new M,this._minimumRadius=cs.DefaultMinBounds.x,this._maximumRadius=cs.DefaultMaxBounds.x,this._minimumAngle=cs.DefaultMinBounds.y,this._maximumAngle=cs.DefaultMaxBounds.y,this._minimumHeight=cs.DefaultMinBounds.z,this._maximumHeight=cs.DefaultMaxBounds.z,this.shaderUniforms={cylinderRenderRadiusMinMax:new D,cylinderRenderAngleMinMax:new D,cylinderRenderHeightMinMax:new D,cylinderUvToShapeUvRadius:new D,cylinderUvToShapeUvAngle:new D,cylinderUvToShapeUvHeight:new D,cylinderShapeUvAngleMinMax:new D,cylinderShapeUvAngleRangeZeroMid:0},this.shaderDefines={CYLINDER_HAS_RENDER_BOUNDS_RADIUS_MIN:void 0,CYLINDER_HAS_RENDER_BOUNDS_RADIUS_FLAT:void 0,CYLINDER_HAS_RENDER_BOUNDS_ANGLE:void 0,CYLINDER_HAS_RENDER_BOUNDS_ANGLE_RANGE_EQUAL_ZERO:void 0,CYLINDER_HAS_RENDER_BOUNDS_ANGLE_RANGE_UNDER_HALF:void 0,CYLINDER_HAS_RENDER_BOUNDS_ANGLE_RANGE_OVER_HALF:void 0,CYLINDER_HAS_SHAPE_BOUNDS_RADIUS:void 0,CYLINDER_HAS_SHAPE_BOUNDS_HEIGHT:void 0,CYLINDER_HAS_SHAPE_BOUNDS_ANGLE:void 0,CYLINDER_HAS_SHAPE_BOUNDS_ANGLE_MIN_DISCONTINUITY:void 0,CYLINDER_HAS_SHAPE_BOUNDS_ANGLE_MAX_DISCONTINUITY:void 0,CYLINDER_HAS_SHAPE_BOUNDS_ANGLE_MIN_MAX_REVERSED:void 0,CYLINDER_INTERSECTION_INDEX_RADIUS_MAX:void 0,CYLINDER_INTERSECTION_INDEX_RADIUS_MIN:void 0,CYLINDER_INTERSECTION_INDEX_ANGLE:void 0},this.shaderMaximumIntersectionsLength=0}var kTe=new m;cs.prototype.update=function(e,t,n,i,o){i=y(i,cs.DefaultMinBounds),o=y(o,cs.DefaultMaxBounds);let r=cs.DefaultMinBounds.x,s=cs.DefaultMaxBounds.x,a=cs.DefaultMinBounds.y,c=cs.DefaultMaxBounds.y,d=cs.DefaultMinBounds.z,u=cs.DefaultMaxBounds.z,h=c-a,p=.5*h,g=W.EPSILON10,f=W.EPSILON3,x=W.EPSILON10,_=W.clamp(t.x,r,s),C=W.clamp(n.x,r,s),V=W.clamp(i.x,r,s),L=W.clamp(o.x,r,s),R=Math.max(_,V),G=Math.min(C,L),I=W.negativePiToPi(t.y),v=W.negativePiToPi(n.y),P=W.negativePiToPi(i.y),w=W.negativePiToPi(o.y),A=Math.max(I,P),b=Math.min(v,w),Z=W.clamp(t.z,d,u),E=W.clamp(n.z,d,u),X=W.clamp(i.z,d,u),F=W.clamp(o.z,d,u),N=Math.max(Z,X),O=Math.min(E,F),U=M.getScale(e,kTe);if(G===0||R>G||N>O||W.equalsEpsilon(U.x,0,void 0,g)||W.equalsEpsilon(U.y,0,void 0,g)||W.equalsEpsilon(U.z,0,void 0,g))return!1;this._minimumRadius=_,this._maximumRadius=C,this._minimumAngle=I,this._maximumAngle=v,this._minimumHeight=Z,this._maximumHeight=E,this.shapeTransform=M.clone(e,this.shapeTransform),this.orientedBoundingBox=H8(R,G,A,b,N,O,this.shapeTransform,this.orientedBoundingBox),this.boundTransform=M.fromRotationTranslation(this.orientedBoundingBox.halfAxes,this.orientedBoundingBox.center,this.boundTransform),this.boundingSphere=de.fromOrientedBoundingBox(this.orientedBoundingBox,this.boundingSphere);let H=_===r&&C===s,K=v<I,te=v-I+K*h,z=te>p+x&&te<h-x,j=te<p-x,ee=te>=p-x&&te<=p+x,pe=z||j||ee,_e=W.equalsEpsilon(I,a,void 0,f),ae=W.equalsEpsilon(v,c,void 0,f),ye=Z===d&&E===u,Se=R===r,Ee=b<A,Ie=b-A+Ee*h,we=Ie>=p-x&&Ie<h-x,ve=Ie>x&&Ie<p-x,at=Ie<=x,Je=we||ve||at,{shaderUniforms:pt,shaderDefines:Qe}=this;for(let ht in Qe)Qe.hasOwnProperty(ht)&&(Qe[ht]=void 0);let _t=0;if(Qe.CYLINDER_INTERSECTION_INDEX_RADIUS_MAX=_t,_t+=1,Se||(Qe.CYLINDER_HAS_RENDER_BOUNDS_RADIUS_MIN=!0,Qe.CYLINDER_INTERSECTION_INDEX_RADIUS_MIN=_t,_t+=1),pt.cylinderRenderRadiusMinMax=D.fromElements(R,G,pt.cylinderRenderRadiusMinMax),R===G&&(Qe.CYLINDER_HAS_RENDER_BOUNDS_RADIUS_FLAT=!0),!H){Qe.CYLINDER_HAS_SHAPE_BOUNDS_RADIUS=!0;let ht=C-_,bt=0,En=1;ht!==0&&(bt=1/ht,En=-_/ht),pt.cylinderUvToShapeUvRadius=D.fromElements(bt,En,pt.cylinderUvToShapeUvRadius)}if(!ye){Qe.CYLINDER_HAS_SHAPE_BOUNDS_HEIGHT=!0;let ht=E-Z,bt=0,En=1;ht!==0&&(bt=2/ht,En=-(Z+1)/ht),pt.cylinderUvToShapeUvHeight=D.fromElements(bt,En,pt.cylinderUvToShapeUvHeight)}if(pt.cylinderRenderHeightMinMax=D.fromElements(N,O,pt.cylinderRenderHeightMinMax),K&&(Qe.CYLINDER_HAS_SHAPE_BOUNDS_ANGLE_MIN_MAX_REVERSED=!0),Je&&(Qe.CYLINDER_HAS_RENDER_BOUNDS_ANGLE=!0,Qe.CYLINDER_INTERSECTION_INDEX_ANGLE=_t,we?(Qe.CYLINDER_HAS_RENDER_BOUNDS_ANGLE_RANGE_UNDER_HALF=!0,_t+=1):ve?(Qe.CYLINDER_HAS_RENDER_BOUNDS_ANGLE_RANGE_OVER_HALF=!0,_t+=2):at&&(Qe.CYLINDER_HAS_RENDER_BOUNDS_ANGLE_RANGE_EQUAL_ZERO=!0,_t+=2),pt.cylinderRenderAngleMinMax=D.fromElements(A,b,pt.cylinderRenderAngleMinMax)),pe){Qe.CYLINDER_HAS_SHAPE_BOUNDS_ANGLE=!0,_e&&(Qe.CYLINDER_HAS_SHAPE_BOUNDS_ANGLE_MIN_DISCONTINUITY=!0),ae&&(Qe.CYLINDER_HAS_SHAPE_BOUNDS_ANGLE_MAX_DISCONTINUITY=!0);let ht=(I-a)/h,bt=(v-a)/h,En=1-te/h;if(pt.cylinderShapeUvAngleMinMax=D.fromElements(ht,bt,pt.cylinderShapeUvAngleMinMax),pt.cylinderShapeUvAngleRangeZeroMid=(bt+.5*En)%1,te<=x)pt.cylinderUvToShapeUvAngle=D.fromElements(0,1,pt.cylinderUvToShapeUvAngle);else{let sn=h/te,Ce=-(I-a)/te;pt.cylinderUvToShapeUvAngle=D.fromElements(sn,Ce,pt.cylinderUvToShapeUvAngle)}}return this.shaderMaximumIntersectionsLength=_t,!0};cs.prototype.computeOrientedBoundingBoxForTile=function(e,t,n,i,o){let r=this._minimumRadius,s=this._maximumRadius,a=this._minimumAngle,c=this._maximumAngle,d=this._minimumHeight,u=this._maximumHeight,h=1/Math.pow(2,e),p=W.lerp(r,s,t*h),g=W.lerp(r,s,(t+1)*h),f=W.lerp(a,c,n*h),x=W.lerp(a,c,(n+1)*h),_=W.lerp(d,u,i*h),C=W.lerp(d,u,(i+1)*h);return H8(p,g,f,x,_,C,this.shapeTransform,o)};var ATe=new m,MTe=new m,Ggt=new m;cs.prototype.computeOrientedBoundingBoxForSample=function(e,t,n,i){let o=1/Math.pow(2,e.level),r=m.divideComponents(m.ONE,t,ATe),s=m.multiplyByScalar(r,o,ATe),a=m.multiplyByScalar(m.fromElements(e.x+n.x,e.y+n.y,e.z+n.z,MTe),o,MTe),c=m.add(a,s,Ggt),d=this._minimumRadius,u=this._maximumRadius,h=this._minimumHeight,p=this._maximumHeight,g=this._minimumAngle,f=this._maximumAngle,x=W.lerp(d,u,a.x),_=W.lerp(d,u,c.x),C=W.lerp(h,p,a.y),V=W.lerp(h,p,c.y),L=W.lerp(g,f,a.z),R=W.lerp(g,f,c.z);return H8(x,_,L,R,C,V,this.shapeTransform,i)};cs.DefaultMinBounds=Object.freeze(new m(0,-W.PI,-1));cs.DefaultMaxBounds=Object.freeze(new m(1,+W.PI,1));var Egt=5,Igt=new Array(Egt),Xgt=new m,Wgt=new $,Pgt=new M,vgt=new M,wgt=new M,Y8=new M,Fgt=new m,Agt=new m,Mgt=new m,UTe=new Array(8);for(let e=0;e<8;e++)UTe[e]=new m;function NTe(e,t,n){return Math.abs(re.dot(e,t))<n}function Ngt(e){let t=M.getColumn(e,0,Fgt),n=M.getColumn(e,1,Agt),i=M.getColumn(e,2,Mgt),o=W.EPSILON4;return NTe(t,n,o)&&NTe(n,i,o)}function kgt(e,t){let n=UTe;m.fromElements(-.5,-.5,-.5,n[0]),m.fromElements(-.5,-.5,.5,n[1]),m.fromElements(-.5,.5,-.5,n[2]),m.fromElements(-.5,.5,.5,n[3]),m.fromElements(.5,-.5,-.5,n[4]),m.fromElements(.5,-.5,.5,n[5]),m.fromElements(.5,.5,-.5,n[6]),m.fromElements(.5,.5,.5,n[7]);for(let i=0;i<8;++i)M.multiplyByPoint(e,n[i],n[i]);return Gn.fromPoints(n,t)}function H8(e,t,n,i,o,r,s,a){let c=cs.DefaultMinBounds,d=cs.DefaultMaxBounds,u=c.x,h=d.x,p=c.y,g=d.y,f=c.z,x=d.z;if(e===u&&t===h&&o===f&&r===x&&n===p&&i===g)return a.center=M.getTranslation(s,a.center),a.halfAxes=M.getMatrix3(s,a.halfAxes),a;i<n&&(i+=W.TWO_PI);let C=i-n,V=n+C*.5,L=Igt,R=0;L[R++]=n,L[R++]=i,L[R++]=V,C>W.PI&&(L[R++]=V-W.PI_OVER_TWO,L[R++]=V+W.PI_OVER_TWO);let G=1,I=1,v=-1,P=-1;for(let te=0;te<R;++te){let z=L[te]-V,j=Math.cos(z),ee=Math.sin(z),pe=j*e,_e=ee*e,ae=j*t,ye=ee*t;G=Math.min(G,pe),I=Math.min(I,_e),G=Math.min(G,ae),I=Math.min(I,ye),v=Math.max(v,pe),P=Math.max(P,_e),v=Math.max(v,ae),P=Math.max(P,ye)}let w=v-G,A=P-I,b=r-o,Z=(G+v)*.5,E=(I+P)*.5,X=(o+r)*.5,F=m.fromElements(Z,E,X,Xgt),N=$.fromRotationZ(V,Wgt),O=m.fromElements(w,A,b,kTe),U=M.fromScale(O,wgt),Y=M.fromRotation(N,vgt),k=M.fromTranslation(F,Pgt),H=M.multiplyTransformation(Y,M.multiplyTransformation(k,U,Y8),Y8),K=M.multiplyTransformation(s,H,Y8);return Ngt(K)?Gn.fromTransformation(K,a):kgt(K,a)}var bp=cs;var tOi=T(S(),1);function X0(){this.orientedBoundingBox=new Gn,this.boundingSphere=new de,this.boundTransform=new M,this.shapeTransform=new M,this._rectangle=new le,this._minimumHeight=X0.DefaultMinBounds.z,this._maximumHeight=X0.DefaultMaxBounds.z,this._ellipsoid=new ne,this._translation=new m,this._rotation=new $,this.shaderUniforms={ellipsoidRadiiUv:new m,eccentricitySquared:0,evoluteScale:new D,ellipsoidInverseRadiiSquaredUv:new m,ellipsoidRenderLongitudeMinMax:new D,ellipsoidShapeUvLongitudeMinMaxMid:new m,ellipsoidUvToShapeUvLongitude:new D,ellipsoidUvToShapeUvLatitude:new D,ellipsoidRenderLatitudeSinMinMax:new D,ellipsoidInverseHeightDifferenceUv:0,clipMinMaxHeight:new D},this.shaderDefines={ELLIPSOID_HAS_RENDER_BOUNDS_LONGITUDE:void 0,ELLIPSOID_HAS_RENDER_BOUNDS_LONGITUDE_RANGE_EQUAL_ZERO:void 0,ELLIPSOID_HAS_RENDER_BOUNDS_LONGITUDE_RANGE_UNDER_HALF:void 0,ELLIPSOID_HAS_RENDER_BOUNDS_LONGITUDE_RANGE_OVER_HALF:void 0,ELLIPSOID_HAS_RENDER_BOUNDS_LONGITUDE_MIN_DISCONTINUITY:void 0,ELLIPSOID_HAS_RENDER_BOUNDS_LONGITUDE_MAX_DISCONTINUITY:void 0,ELLIPSOID_HAS_SHAPE_BOUNDS_LONGITUDE:void 0,ELLIPSOID_HAS_SHAPE_BOUNDS_LONGITUDE_MIN_MAX_REVERSED:void 0,ELLIPSOID_HAS_RENDER_BOUNDS_LATITUDE_MAX_UNDER_HALF:void 0,ELLIPSOID_HAS_RENDER_BOUNDS_LATITUDE_MAX_EQUAL_HALF:void 0,ELLIPSOID_HAS_RENDER_BOUNDS_LATITUDE_MAX_OVER_HALF:void 0,ELLIPSOID_HAS_RENDER_BOUNDS_LATITUDE_MIN_UNDER_HALF:void 0,ELLIPSOID_HAS_RENDER_BOUNDS_LATITUDE_MIN_EQUAL_HALF:void 0,ELLIPSOID_HAS_RENDER_BOUNDS_LATITUDE_MIN_OVER_HALF:void 0,ELLIPSOID_HAS_SHAPE_BOUNDS_LATITUDE:void 0,ELLIPSOID_INTERSECTION_INDEX_LONGITUDE:void 0,ELLIPSOID_INTERSECTION_INDEX_LATITUDE_MAX:void 0,ELLIPSOID_INTERSECTION_INDEX_LATITUDE_MIN:void 0,ELLIPSOID_INTERSECTION_INDEX_HEIGHT_MAX:void 0,ELLIPSOID_INTERSECTION_INDEX_HEIGHT_MIN:void 0},this.shaderMaximumIntersectionsLength=0}var Ugt=new m,Dgt=new m,Bgt=new m,Ogt=new m,Ygt=new m,Hgt=new m,zgt=new m,Kgt=new m,Jgt=new $,DTe=new m,BTe=new m,Qgt=new le;X0.prototype.update=function(e,t,n,i,o){let{DefaultMinBounds:r,DefaultMaxBounds:s}=X0;i=y(i,r),o=y(o,s);let a=W.EPSILON10,c=W.EPSILON3,d=W.EPSILON10,u=W.EPSILON10,h=W.EPSILON3,p=M.getScale(e,Kgt),g=m.clone(r,Ugt);g.z=-m.minimumComponent(p);let f=m.clamp(t,g,s,Dgt),x=m.clamp(n,g,s,Bgt),_=m.clamp(i,g,s,Ogt),C=m.clamp(o,g,s,Ygt),V=m.maximumByComponent(f,_,Hgt),L=m.minimumByComponent(x,C,zgt),R=m.add(p,m.fromElements(x.z,x.z,x.z,DTe),DTe),G=m.maximumComponent(R),I=m.add(p,m.fromElements(L.z,L.z,L.z,BTe),BTe);if(V.y>L.y||V.y===s.y||L.y===r.y||V.z>L.z||W.equalsEpsilon(I,m.ZERO,void 0,a))return!1;this._rectangle=le.fromRadians(f.x,f.y,x.x,x.y),this._translation=M.getTranslation(e,this._translation),this._rotation=M.getRotation(e,this._rotation),this._ellipsoid=ne.fromCartesian3(p,this._ellipsoid),this._minimumHeight=f.z,this._maximumHeight=x.z;let v=le.fromRadians(V.x,V.y,L.x,L.y,Qgt);this.orientedBoundingBox=z8(v,V.z,L.z,this._ellipsoid,this._translation,this._rotation,this.orientedBoundingBox),this.shapeTransform=M.fromRotationTranslation($.setScale(this._rotation,R,Jgt),this._translation,this.shapeTransform),this.boundTransform=M.fromRotationTranslation(this.orientedBoundingBox.halfAxes,this.orientedBoundingBox.center,this.boundTransform),this.boundingSphere=de.fromOrientedBoundingBox(this.orientedBoundingBox,this.boundingSphere);let P=s.x-r.x,w=.5*P,A=L.x<V.x,b=L.x-V.x+A*P,Z=b<=d,E=b>=w-d&&b<P-d,X=b>d&&b<w-d,F=Z||E||X,N=x.x<f.x,O=x.x-f.x+N*P,U=O>w+d&&O<P-d,Y=O>=w-d&&O<=w+d,k=O<w-d,H=U||Y||k,K=L.y<-h,te=L.y>=-h&&L.y<=+h,z=L.y>+h&&L.y<s.y-u,j=K||te||z,ee=V.y>r.y+u&&V.y<-h,pe=V.y>=-h&&V.y<=+h,_e=V.y>+h,ae=ee||pe||_e,ye=j||ae,Se=x.y-f.y,Ee=x.y<-h,Ie=x.y>=-h&&x.y<=+h,we=x.y>+h&&x.y<s.y-u,ve=Ee||Ie||we,at=f.y>r.y+u&&f.y<-h,Je=f.y>=-h&&f.y<=+h,pt=f.y>+h,_t=ve||(at||Je||pt),{shaderUniforms:ht,shaderDefines:bt}=this;for(let Mo in bt)bt.hasOwnProperty(Mo)&&(bt[Mo]=void 0);ht.ellipsoidRadiiUv=m.divideByScalar(R,G,ht.ellipsoidRadiiUv);let{x:En,z:sn}=ht.ellipsoidRadiiUv,Ce=sn/En;ht.eccentricitySquared=1-Ce*Ce,ht.evoluteScale=D.fromElements((En*En-sn*sn)/En,(sn*sn-En*En)/sn,ht.evoluteScale),ht.ellipsoidInverseRadiiSquaredUv=m.divideComponents(m.ONE,m.multiplyComponents(ht.ellipsoidRadiiUv,ht.ellipsoidRadiiUv,ht.ellipsoidInverseRadiiSquaredUv),ht.ellipsoidInverseRadiiSquaredUv);let Le=0;bt.ELLIPSOID_INTERSECTION_INDEX_HEIGHT_MAX=Le,Le+=1,bt.ELLIPSOID_INTERSECTION_INDEX_HEIGHT_MIN=Le,Le+=1,ht.clipMinMaxHeight=D.fromElements((V.z-x.z)/G,(L.z-x.z)/G,ht.clipMinMaxHeight);let wn=(x.z-f.z)/G;if(ht.ellipsoidInverseHeightDifferenceUv=1/wn,f.z===x.z&&(ht.ellipsoidInverseHeightDifferenceUv=0),F&&(bt.ELLIPSOID_HAS_RENDER_BOUNDS_LONGITUDE=!0,bt.ELLIPSOID_INTERSECTION_INDEX_LONGITUDE=Le,E?(bt.ELLIPSOID_HAS_RENDER_BOUNDS_LONGITUDE_RANGE_UNDER_HALF=!0,Le+=1):X?(bt.ELLIPSOID_HAS_RENDER_BOUNDS_LONGITUDE_RANGE_OVER_HALF=!0,Le+=2):Z&&(bt.ELLIPSOID_HAS_RENDER_BOUNDS_LONGITUDE_RANGE_EQUAL_ZERO=!0,Le+=2),ht.ellipsoidRenderLongitudeMinMax=D.fromElements(V.x,L.x,ht.ellipsoidRenderLongitudeMinMax)),H)if(bt.ELLIPSOID_HAS_SHAPE_BOUNDS_LONGITUDE=!0,x.x<f.x&&(bt.ELLIPSOID_HAS_SHAPE_BOUNDS_LONGITUDE_MIN_MAX_REVERSED=!0),O<=d)ht.ellipsoidUvToShapeUvLongitude=D.fromElements(0,1,ht.ellipsoidUvToShapeUvLongitude);else{let Jo=P/O,Xr=-(f.x-r.x)/O;ht.ellipsoidUvToShapeUvLongitude=D.fromElements(Jo,Xr,ht.ellipsoidUvToShapeUvLongitude)}if(F){let Mo=W.equalsEpsilon(V.x,r.x,void 0,c),Jo=W.equalsEpsilon(L.x,s.x,void 0,c);Mo&&(bt.ELLIPSOID_HAS_RENDER_BOUNDS_LONGITUDE_MIN_DISCONTINUITY=!0),Jo&&(bt.ELLIPSOID_HAS_RENDER_BOUNDS_LONGITUDE_MAX_DISCONTINUITY=!0);let Xr=(f.x-r.x)/P,da=(x.x-r.x)/P,Vs=(L.x-r.x)/P,ua=1-b/P,Ne=(Vs+.5*ua)%1;ht.ellipsoidShapeUvLongitudeMinMaxMid=m.fromElements(Xr,da,Ne,ht.ellipsoidShapeUvLongitudeMinMaxMid)}if(ye&&(ae&&(bt.ELLIPSOID_HAS_RENDER_BOUNDS_LATITUDE_MIN=!0,bt.ELLIPSOID_INTERSECTION_INDEX_LATITUDE_MIN=Le,ee?(bt.ELLIPSOID_HAS_RENDER_BOUNDS_LATITUDE_MIN_UNDER_HALF=!0,Le+=1):pe?(bt.ELLIPSOID_HAS_RENDER_BOUNDS_LATITUDE_MIN_EQUAL_HALF=!0,Le+=1):_e&&(bt.ELLIPSOID_HAS_RENDER_BOUNDS_LATITUDE_MIN_OVER_HALF=!0,Le+=2)),j&&(bt.ELLIPSOID_HAS_RENDER_BOUNDS_LATITUDE_MAX=!0,bt.ELLIPSOID_INTERSECTION_INDEX_LATITUDE_MAX=Le,K?(bt.ELLIPSOID_HAS_RENDER_BOUNDS_LATITUDE_MAX_UNDER_HALF=!0,Le+=2):te?(bt.ELLIPSOID_HAS_RENDER_BOUNDS_LATITUDE_MAX_EQUAL_HALF=!0,Le+=1):z&&(bt.ELLIPSOID_HAS_RENDER_BOUNDS_LATITUDE_MAX_OVER_HALF=!0,Le+=1)),ht.ellipsoidRenderLatitudeSinMinMax=D.fromElements(Math.sin(V.y),Math.sin(L.y),ht.ellipsoidRenderLatitudeSinMinMax)),_t)if(bt.ELLIPSOID_HAS_SHAPE_BOUNDS_LATITUDE=!0,Se<u)ht.ellipsoidUvToShapeUvLatitude=D.fromElements(0,1,ht.ellipsoidUvToShapeUvLatitude);else{let Jo=(s.y-r.y)/Se,Xr=(r.y-f.y)/Se;ht.ellipsoidUvToShapeUvLatitude=D.fromElements(Jo,Xr,ht.ellipsoidUvToShapeUvLatitude)}return this.shaderMaximumIntersectionsLength=Le,!0};var HTe=new le;X0.prototype.computeOrientedBoundingBoxForTile=function(e,t,n,i,o){let r=1/Math.pow(2,e),s=t*r,a=(t+1)*r,c=n*r,d=(n+1)*r,u=i*r,h=(i+1)*r,p=le.subsection(this._rectangle,s,c,a,d,HTe),g=W.lerp(this._minimumHeight,this._maximumHeight,u),f=W.lerp(this._minimumHeight,this._maximumHeight,h);return z8(p,g,f,this._ellipsoid,this._translation,this._rotation,o)};var OTe=new m,YTe=new m,jgt=new m;X0.prototype.computeOrientedBoundingBoxForSample=function(e,t,n,i){let o=1/Math.pow(2,e.level),r=m.divideComponents(m.ONE,t,OTe),s=m.multiplyByScalar(r,o,OTe),a=m.multiplyByScalar(m.fromElements(e.x+n.x,e.y+n.y,e.z+n.z,YTe),o,YTe),c=m.add(a,s,jgt),d=le.subsection(this._rectangle,a.x,a.y,c.x,c.y,HTe),u=W.lerp(this._minimumHeight,this._maximumHeight,a.z),h=W.lerp(this._minimumHeight,this._maximumHeight,c.z);return z8(d,u,h,this._ellipsoid,this._translation,this._rotation,i)};function z8(e,t,n,i,o,r,s){return s=Gn.fromRectangle(e,t,n,i,s),s.center=m.add(s.center,o,s.center),s.halfAxes=$.multiply(s.halfAxes,r,s.halfAxes),s}X0.DefaultMinBounds=Object.freeze(new m(-W.PI,-W.PI_OVER_TWO,-ne.WGS84.minimumRadius));X0.DefaultMaxBounds=Object.freeze(new m(W.PI,W.PI_OVER_TWO,10*ne.WGS84.maximumRadius));var _S=X0;var au={BOX:"BOX",ELLIPSOID:"ELLIPSOID",CYLINDER:"CYLINDER"};au.getMinBounds=function(e){switch(e){case au.BOX:return pp.DefaultMinBounds;case au.ELLIPSOID:return _S.DefaultMinBounds;case au.CYLINDER:return bp.DefaultMinBounds}};au.getMaxBounds=function(e){switch(e){case au.BOX:return pp.DefaultMaxBounds;case au.ELLIPSOID:return _S.DefaultMaxBounds;case au.CYLINDER:return bp.DefaultMaxBounds}};au.getShapeConstructor=function(e){switch(e){case au.BOX:return pp;case au.ELLIPSOID:return _S;case au.CYLINDER:return bp}};var Ni=Object.freeze(au);var dYi=T(S(),1);var dOi=T(S(),1);function Kh(e){this._comparator=e.comparator,this._maximumLength=e.maximumLength,this._array=l(e.maximumLength)?new Array(e.maximumLength):[],this._length=0}Object.defineProperties(Kh.prototype,{length:{get:function(){return this._length}},maximumLength:{get:function(){return this._maximumLength},set:function(e){if(l(e)){for(;this._length>e;)this.removeMinimum();this._array.length=e}this._maximumLength=e}},internalArray:{get:function(){return this._array}},comparator:{get:function(){return this._comparator}}});Kh.prototype.clone=function(){let e=this._maximumLength,t=this._comparator,n=this._array,i=this._length,o=new Kh({comparator:t,maximumLength:e});o._length=i;for(let r=0;r<i;r++)o._array[r]=n[r];return o};Kh.prototype.reset=function(){this._length=0;let e=this._maximumLength;if(l(e))for(let t=0;t<e;t++)this._array[t]=void 0;else this._array.length=0};Kh.prototype.resort=function(){let e=this._length;for(let t=0;t<e;t++)zTe(this,t)};Kh.prototype.insert=function(e){let t,n=this._maximumLength;if(l(n)){if(n===0)return;if(this._length===n){let o=this._array[0];if(this._comparator(e,o)<=0)return e;t=this.removeMinimum()}}let i=this._length;return this._array[i]=e,this._length++,zTe(this,i),t};Kh.prototype.removeMinimum=function(){let e=this._length;if(e===0)return;this._length--;let t=this._array[0];return e>=2&&(this._array[0]=this._array[e-1],KTe(this,0)),this._array[e-1]=void 0,t};Kh.prototype.removeMaximum=function(){let e=this._length;if(e===0)return;this._length--;let t;if(e<=2)t=this._array[e-1];else{let n=K8(this,1,2)?1:2;t=this._array[n],this._array[n]=this._array[e-1],e>=4&&KTe(this,n)}return this._array[e-1]=void 0,t};Kh.prototype.getMinimum=function(){if(this._length!==0)return this._array[0]};Kh.prototype.getMaximum=function(){let e=this._length;if(e!==0)return e<=2?this._array[e-1]:this._array[K8(this,1,2)?1:2]};function eB(e,t,n){let i=e._array,o=i[t];i[t]=i[n],i[n]=o}function oM(e,t,n){return e._comparator(e._array[t],e._array[n])<0}function K8(e,t,n){return e._comparator(e._array[t],e._array[n])>0}function zTe(e,t){if(t===0)return;let n=Math.floor(W.log2(t+1))%2===0,i=Math.floor((t-1)/2),o=oM(e,t,i);for(o!==n&&(eB(e,t,i),t=i);t>=3;){let r=Math.floor((t-3)/4);if(oM(e,t,r)!==o)break;eB(e,t,r),t=r}}function KTe(e,t){let n=e._length,i=Math.floor(W.log2(t+1))%2===0,o;for(;(o=2*t+1)<n;){let r=o,s=o+1;if(s<n){oM(e,s,r)===i&&(r=s);let a=2*o+1,c=Math.max(Math.min(n-a,4),0);for(let d=0;d<c;d++){let u=a+d;oM(e,u,r)===i&&(r=u)}}if(oM(e,r,t)===i&&(eB(e,r,t),r!==o&&r!==s)){let a=Math.floor((r-1)/2);K8(e,r,a)===i&&eB(e,r,a)}t=r}}var TS=Kh;var mOi=T(S(),1),J8=Object.freeze({UNLOADED:0,RECEIVING:1,PROCESSING:2,LOADED:3,FAILED:4,UNAVAILABLE:5});function rM(e,t){this.spatialNode=e,this.keyframe=t,this.state=J8.UNLOADED,this.content=void 0,this.megatextureIndex=-1,this.priority=-Number.MAX_VALUE,this.highPriorityFrameNumber=-1}rM.prototype.unload=function(){this.content=this.content&&this.content.destroy(),this.spatialNode=void 0,this.state=J8.UNLOADED,this.megatextureIndex=-1,this.priority=-Number.MAX_VALUE,this.highPriorityFrameNumber=-1};rM.priorityComparator=function(e,t){return e.priority-t.priority};rM.searchComparator=function(e,t){return e.keyframe-t.keyframe};rM.LoadState=J8;var _o=rM;var WOi=T(S(),1);function By(e,t,n,i,o){if(o=Math.min(y(o,128*1024*1024),536870912),i===At.UNSIGNED_SHORT&&(i=At.FLOAT32),i===At.FLOAT32&&!e.floatingPointTexture)throw new ce("Floating point texture not supported");let s=qgt(i),a=$gt(n,e.webgl2),c=At.getSizeInBytes(i),d=eyt(o,n,c),u=Math.ceil(Math.sqrt(t.x)),h=Math.ceil(t.z/u),p=u*t.x,g=h*t.y,f=Math.floor(d/p),x=Math.floor(d/g);if(f===0||x===0)throw new ce("Tileset is too large to fit into megatexture");this.channelCount=n,this.componentType=i,this.textureMemoryByteLength=c*n*d**2,this.voxelCountPerTile=m.clone(t,new m),this.maximumTileCount=f*x,this.regionCountPerMegatexture=new D(f,x),this.voxelCountPerRegion=new D(p,g),this.sliceCountPerRegion=new D(u,h),this.voxelSizeUv=new D(1/d,1/d),this.sliceSizeUv=new D(t.x/d,t.y/d),this.regionSizeUv=new D(p/d,g/d),this.texture=new Wt({context:e,pixelFormat:a,pixelDatatype:s,flipY:!1,width:d,height:d,sampler:new $t({wrapS:Vn.CLAMP_TO_EDGE,wrapT:Vn.CLAMP_TO_EDGE,minificationFilter:qt.LINEAR,magnificationFilter:pi.LINEAR})});let _=At.toComponentDatatype(i);this.tileVoxelDataTemp=Q.createTypedArray(_,p*g*n),this.nodes=new Array(this.maximumTileCount);for(let C=0;C<this.maximumTileCount;C++)this.nodes[C]=new tyt(C);for(let C=0;C<this.maximumTileCount;C++){let V=this.nodes[C];V.previousNode=C>0?this.nodes[C-1]:void 0,V.nextNode=C<this.maximumTileCount-1?this.nodes[C+1]:void 0}this.occupiedList=void 0,this.emptyList=this.nodes[0],this.occupiedCount=0}function qgt(e){if(e===At.FLOAT32||e===At.FLOAT64)return je.FLOAT;if(e===At.UINT8)return je.UNSIGNED_BYTE}function $gt(e,t){if(e===1)return t?ot.RED:ot.LUMINANCE;if(e===2)return t?ot.RG:ot.LUMINANCE_ALPHA;if(e===3)return ot.RGB;if(e===4)return ot.RGBA}function eyt(e,t,n){let i=Math.floor(e/(t*n));return Math.min(Mt.maximumTextureSize,W.previousPowerOfTwo(Math.floor(Math.sqrt(i))))}function tyt(e){this.index=e,this.nextNode=void 0,this.previousNode=void 0}By.prototype.add=function(e){if(this.isFull())throw new fe("Trying to add when there are no empty spots");let t=this.emptyList;this.emptyList=this.emptyList.nextNode,l(this.emptyList)&&(this.emptyList.previousNode=void 0),t.nextNode=this.occupiedList,l(t.nextNode)&&(t.nextNode.previousNode=t),this.occupiedList=t;let n=t.index;return this.writeDataToTexture(n,e),this.occupiedCount++,n};By.prototype.remove=function(e){if(e<0||e>=this.maximumTileCount)throw new fe("Megatexture index out of bounds");let t=this.nodes[e];l(t.previousNode)&&(t.previousNode.nextNode=t.nextNode),l(t.nextNode)&&(t.nextNode.previousNode=t.previousNode),t.nextNode=this.emptyList,l(t.nextNode)&&(t.nextNode.previousNode=t),t.previousNode=void 0,this.emptyList=t,this.occupiedCount--};By.prototype.isFull=function(){return this.emptyList===void 0};By.getApproximateTextureMemoryByteLength=function(e,t,n,i){i===At.UNSIGNED_SHORT&&(i=At.FLOAT32);let o=At.getSizeInBytes(i),r=e*t.x*t.y*t.z,s=Math.ceil(Math.sqrt(t.x)),a=Math.ceil(t.z/s),c=s*t.x,d=a*t.y,u=W.previousPowerOfTwo(Math.floor(Math.sqrt(r)));for(;;){let p=Math.floor(u/c),g=Math.floor(u/d);if(p*g>=e)break;u*=2}return u*u*n*o};By.prototype.writeDataToTexture=function(e,t){let n=t.constructor===Uint16Array?new Float32Array(t):t,{tileVoxelDataTemp:i,voxelCountPerTile:o,sliceCountPerRegion:r,voxelCountPerRegion:s,channelCount:a,regionCountPerMegatexture:c}=this;for(let g=0;g<o.z;g++){let f=g%r.x*o.x,x=Math.floor(g/r.x)*o.y;for(let _=0;_<o.y;_++){let C=nyt(o,_,g),V=(x+_)*s.x+f;for(let L=0;L<o.x;L++){let R=C+L,G=V+L;for(let I=0;I<a;I++)i[G*a+I]=n[R*a+I]}}}let d=e%c.x*s.x,u=Math.floor(e/c.x)*s.y,p={source:{arrayBufferView:i,width:s.x,height:s.y},xOffset:d,yOffset:u};this.texture.copyFrom(p)};function nyt(e,t,n){let i=e.y*e.x,o=n,r=t;return o*i+r*e.x}By.prototype.isDestroyed=function(){return!1};By.prototype.destroy=function(){return this.texture=this.texture&&this.texture.destroy(),me(this)};var GL=By;var DOi=T(S(),1);function _m(e,t,n,i,o,r,s){this.children=void 0,this.parent=o,this.level=e,this.x=t,this.y=n,this.z=i,this.dimensions=m.clone(s),this.keyframeNodes=[],this.renderableKeyframeNodes=[],this.renderableKeyframeNodeLerp=0,this.renderableKeyframeNodePrevious=void 0,this.renderableKeyframeNodeNext=void 0,this.orientedBoundingBox=new Gn,this.approximateVoxelSize=0,this.screenSpaceError=0,this.visitedFrameNumber=-1,this.computeBoundingVolumes(r)}var iyt=new m;_m.prototype.computeBoundingVolumes=function(e){this.orientedBoundingBox=e.computeOrientedBoundingBoxForTile(this.level,this.x,this.y,this.z,this.orientedBoundingBox);let t=$.getScale(this.orientedBoundingBox.halfAxes,iyt),n=2*m.maximumComponent(t);this.approximateVoxelSize=n/m.minimumComponent(this.dimensions)};_m.prototype.constructChildNodes=function(e){let{level:t,x:n,y:i,z:o}=this,r=n*2,s=i*2,a=o*2,c=s+1,d=r+1,u=a+1,h=t+1,p=[[h,r,s,a],[h,d,s,a],[h,r,c,a],[h,d,c,a],[h,r,s,u],[h,d,s,u],[h,r,c,u],[h,d,c,u]];this.children=p.map(([g,f,x,_])=>new _m(g,f,x,_,this,e,this.dimensions))};_m.prototype.visibility=function(e,t){let n=this.orientedBoundingBox;return e.cullingVolume.computeVisibilityWithPlaneMask(n,t)};_m.prototype.computeScreenSpaceError=function(e,t){let n=this.orientedBoundingBox,i=Math.sqrt(n.distanceSquaredTo(e));i=Math.max(i,W.EPSILON7);let o=this.approximateVoxelSize,r=t*(o/i);this.screenSpaceError=r};var JTe={keyframe:0};function sM(e,t){return JTe.keyframe=e,Po(t,JTe,_o.searchComparator)}_m.prototype.computeSurroundingRenderableKeyframeNodes=function(e){let t=this,n=t.level,i=Math.floor(e),o=Math.ceil(e),r,s,a=+Number.MAX_VALUE,c=+Number.MAX_VALUE;for(;l(t);){let{renderableKeyframeNodes:h}=t;if(h.length>=1){let p=oyt(i,h),g=h[p],f=o===i||i<g.keyframe?p:Math.min(p+1,h.length-1),x=h[f],_=i-g.keyframe,C=QTe(n-t.level,_);C<a&&(a=C,r=g);let V=x.keyframe-o,L=QTe(n-t.level,V);if(L<c&&(c=L,s=x),_===0&&V===0)break}t=t.parent}if(this.renderableKeyframeNodePrevious=r,this.renderableKeyframeNodeNext=s,!l(r)||!l(s))return;let d=r.keyframe,u=s.keyframe;this.renderableKeyframeNodeLerp=d===u?0:W.clamp((e-d)/(u-d),0,1)};function oyt(e,t){let n=sM(e,t);return n<0?W.clamp(~n-1,0,t.length-1):n}function QTe(e,t){let n=Math.exp(e*4),i=t>=0?1:-200;return e*n+t*i}_m.prototype.isVisited=function(e){return this.visitedFrameNumber===e};_m.prototype.createKeyframeNode=function(e){let t=sM(e,this.keyframeNodes);if(t<0){t=~t;let n=new _o(this,e);this.keyframeNodes.splice(t,0,n)}};_m.prototype.destroyKeyframeNode=function(e,t){let n=e.keyframe,i=sM(n,this.keyframeNodes);if(i<0)throw new fe("Keyframe node does not exist.");if(this.keyframeNodes.splice(i,1),e.megatextureIndex!==-1){for(let r=0;r<t.length;r++)t[r].remove(e.megatextureIndex);let o=sM(n,this.renderableKeyframeNodes);if(o<0)throw new fe("Renderable keyframe node does not exist.");this.renderableKeyframeNodes.splice(o,1)}e.unload()};_m.prototype.addKeyframeNodeToMegatextures=function(e,t){if(e.megatextureIndex!==-1||e.content.metadata.length!==t.length)throw new fe("Keyframe node cannot be added to megatexture");let{metadata:n}=e.content;for(let r=0;r<t.length;r++){let s=t[r];e.megatextureIndex=s.add(n[r])}let i=this.renderableKeyframeNodes,o=sM(e.keyframe,i);if(o>=0)throw new fe("Keyframe already renderable");o=~o,i.splice(o,0,e)};_m.prototype.isRenderable=function(e){let t=this.renderableKeyframeNodePrevious,n=this.renderableKeyframeNodeNext,i=this.level;return l(t)&&l(n)&&(t.spatialNode.level===i||n.spatialNode.level===i)&&this.visitedFrameNumber===e};var aM=_m;function Oy(e,t,n,i){let{provider:o,dimensions:r,paddingBefore:s,paddingAfter:a}=e,{types:c,componentTypes:d,metadataOrder:u}=o,h=m.add(r,s,new m);if(m.add(h,a,h),u===zh.GLTF){let L=h.y;h.y=h.z,h.z=L}!l(i)&&l(o.maximumTileCount)&&(i=gyt(o.maximumTileCount,h,c,d)),this._primitive=e,this.textureMemoryByteLength=0,this.megatextures=new Array(c.length);for(let L=0;L<c.length;L++){let R=c[L],G=ut.getComponentCount(R),I=d[L];this.megatextures[L]=new GL(t,h,G,I,i),this.textureMemoryByteLength+=this.megatextures[L].textureMemoryByteLength}let p=this.megatextures[0].maximumTileCount;this._simultaneousRequestCount=0,this._debugPrint=!1,this._calculateStatistics=y(this._primitive._calculateStatistics,!1),this._frameNumber=0;let g=e._shape;this.rootNode=new aM(0,0,0,0,void 0,g,r),this._priorityQueue=new TS({maximumLength:p,comparator:_o.priorityComparator}),this._highPriorityKeyframeNodes=new Array(p),this._highPriorityKeyframeNodeCount=0,this._keyframeNodesInMegatexture=new Array(p),this._keyframeCount=n,this._sampleCount=void 0,this._keyframeLocation=0,this._binaryTreeKeyframeWeighting=new Array(n),this._initialTilesLoaded=!1;let f=this._binaryTreeKeyframeWeighting;f[0]=0,f[n-1]=0,Q8(f,1,n-2,0);let x=9,_=2048,C=Math.floor(_/x),V=Math.ceil(p/C);this.internalNodeTexture=new Wt({context:t,pixelFormat:ot.RGBA,pixelDatatype:je.UNSIGNED_BYTE,flipY:!1,width:_,height:V,sampler:new $t({minificationFilter:qt.NEAREST,magnificationFilter:pi.NEAREST})}),this.internalNodeTilesPerRow=C,this.internalNodeTexelSizeUv=new D(1/_,1/V),this.leafNodeTexture=void 0,this.leafNodeTilesPerRow=void 0,this.leafNodeTexelSizeUv=new D}Oy.prototype.findKeyframeNode=function(e){return this._keyframeNodesInMegatexture.find(function(t){return t.megatextureIndex===e})};function Q8(e,t,n,i){if(t>n)return;let o=Math.floor((t+n)/2);e[o]=i,Q8(e,t,o-1,i+1),Q8(e,o+1,n,i+1)}Oy.simultaneousRequestCountMaximum=50;Oy.prototype.update=function(e,t,n,i){let o=this._primitive,r=e.context,s=this.megatextures[0].maximumTileCount,a=this._keyframeCount,c=o._levelBlendFactor,d=c>0,u=a>1,h=(d?2:1)*(u?2:1);this._sampleCount=h;let p=h>=2;if(p&&!l(this.leafNodeTexture)){let L=Math.floor(512),R=Math.ceil(s/L);this.leafNodeTexture=new Wt({context:r,pixelFormat:ot.RGBA,pixelDatatype:je.UNSIGNED_BYTE,flipY:!1,width:1024,height:R,sampler:new $t({minificationFilter:qt.NEAREST,magnificationFilter:pi.NEAREST})}),this.leafNodeTexelSizeUv=D.fromElements(1/1024,1/R,this.leafNodeTexelSizeUv),this.leafNodeTilesPerRow=L}else!p&&l(this.leafNodeTexture)&&(this.leafNodeTexture=this.leafNodeTexture.destroy());if(this._keyframeLocation=W.clamp(t,0,a-1),n&&jTe(this,this.rootNode),i)return;this._frameNumber=e.frameNumber;let g=Si();ayt(this,e),cyt(this,e);let f=Si();hyt(this,h,c);let x=Si(),_=o.loadProgress.numberOfListeners>0||o.allTilesLoaded.numberOfListeners>0||o.initialTilesLoaded.numberOfListeners>0;if(this._debugPrint||this._calculateStatistics||_){let C=f-g,V=x-f,L=x-g;myt(this,e,C,V,L)}};Oy.prototype.isRenderable=function(e){return e.isRenderable(this._frameNumber)};Oy.prototype.isDestroyed=function(){return!1};Oy.prototype.destroy=function(){let e=this.megatextures,t=e.length;for(let n=0;n<t;n++)e[n]=e[n]&&e[n].destroy();return this.textureMemoryByteLength=0,this.internalNodeTexture=this.internalNodeTexture&&this.internalNodeTexture.destroy(),this.leafNodeTexture=this.leafNodeTexture&&this.leafNodeTexture.destroy(),me(this)};function jTe(e,t){if(t.computeBoundingVolumes(e._primitive._shape),l(t.children))for(let n=0;n<8;n++){let i=t.children[n];jTe(e,i)}}function ryt(e,t){if(e._simultaneousRequestCount>=Oy.simultaneousRequestCountMaximum)return;let i=e._primitive.provider,{keyframe:o,spatialNode:r}=t;if(l(i.availableLevels)&&r.level>=i.availableLevels)return;function s(u){e._simultaneousRequestCount--,t.content=u,t.state=l(u)?_o.LoadState.PROCESSING:_o.LoadState.UNAVAILABLE}function a(u){e._simultaneousRequestCount--,t.state=_o.LoadState.FAILED,e._primitive.tileFailed.raiseEvent()}let c={tileLevel:r.level,tileX:r.x,tileY:r.y,tileZ:r.z,keyframe:o},d=i.requestData(c);l(d)&&(e._simultaneousRequestCount++,t.state=_o.LoadState.RECEIVING,d.then(s).catch(a))}function syt(e){return e/(1+e)}function ayt(e,t){let n=e._frameNumber,i=e._priorityQueue;i.reset(),qTe(e.rootNode,ps.MASK_INDETERMINATE,e,t);let o=e._highPriorityKeyframeNodes,r=0,s;for(;i.length>0;)s=i.removeMaximum(),s.highPriorityFrameNumber=n,o[r]=s,r++;e._highPriorityKeyframeNodeCount=r}function cyt(e,t){let n=e.megatextures[0],i=n.occupiedCount,o=e._keyframeNodesInMegatexture;o.length=i,o.sort(lyt);let r=e._highPriorityKeyframeNodes,s=e._highPriorityKeyframeNodeCount,a=0,c=0;for(let d=0;d<s;d++){let u=r[d];if(!(u.state===_o.LoadState.LOADED||u.spatialNode===void 0)&&(u.state===_o.LoadState.UNLOADED&&ryt(e,u),u.state===_o.LoadState.PROCESSING)){let{content:h}=u;if(h.update(e._primitive,t),!h.ready)continue;if(!dyt(h.metadata,e)){u.content=void 0,u.state=_o.LoadState.FAILED,e._primitive.tileFailed.raiseEvent();continue}let p=0;if(n.isFull()){p=i-1-a,a++;let g=o[p];e._primitive.tileUnload.raiseEvent(),g.spatialNode.destroyKeyframeNode(g,e.megatextures)}else p=i+c,c++;u.spatialNode.addKeyframeNodeToMegatextures(u,e.megatextures),u.state=_o.LoadState.LOADED,o[p]=u,e._primitive.tileLoad.raiseEvent()}}}function lyt(e,t){return e.highPriorityFrameNumber===t.highPriorityFrameNumber?t.priority-e.priority:t.highPriorityFrameNumber-e.highPriorityFrameNumber}function dyt(e,t){let n=t._primitive.provider.types.length;if(!Array.isArray(e)||e.length!==n)return!1;let{megatextures:i}=t;for(let o=0;o<n;o++){let{voxelCountPerTile:r,channelCount:s}=i[o],{x:a,y:c,z:d}=r,u=a*c*d,h=e[o],p=u*s;if(h.length!==p)return!1}return!0}function qTe(e,t,n,i){let{camera:o,context:r,pixelRatio:s,frameNumber:a}=i,{positionWC:c,frustum:d}=o,h=r.drawingBufferHeight/s/d.sseDenominator;if(e.computeScreenSpaceError(c,h),t=e.visibility(i,t),t===ps.MASK_OUTSIDE)return;e.visitedFrameNumber=a;let p=n._primitive,g=p._shape,f=p.screenSpaceError,x=n._priorityQueue,_=n._keyframeCount,C=W.clamp(Math.floor(n._keyframeLocation),0,_-2),V=C+1;if(_===1)e.createKeyframeNode(0);else if(e.keyframeNodes.length!==_)for(let v=0;v<_;v++)e.createKeyframeNode(v);let{screenSpaceError:L,keyframeNodes:R}=e,G=syt(L),I=!1;for(let v=0;v<R.length;v++){let P=R[v];P.priority=10*G+uyt(C,P.keyframe,V,n),P.state!==_o.LoadState.UNAVAILABLE&&P.state!==_o.LoadState.FAILED&&P.priority!==-Number.MAX_VALUE&&x.insert(P),P.state===_o.LoadState.LOADED&&(I=!0)}if(L<f||!I){e.children=void 0;return}l(e.children)||e.constructChildNodes(g);for(let v=0;v<8;v++){let P=e.children[v];qTe(P,t,n,i)}}function uyt(e,t,n,i){let o=Math.min(Math.abs(t-e),Math.abs(t-n)),r=Math.max(e,i._keyframeCount-n-1,1),s=Math.pow(1-o/r,4),a=Math.exp(-i._binaryTreeKeyframeWeighting[t]);return W.lerp(a,s,.15+.85*s)}function myt(e,t,n,i,o){let r=e._keyframeCount,s=e.rootNode,a=Object.keys(_o.LoadState).length,c=new Array(a),d=new Array(a),u=0;for(let I=0;I<a;I++){let v=new Array(r).fill(0);c[I]=v,d[I]=0}function h(I){let v=I.keyframeNodes;for(let P=0;P<v.length;P++){let w=v[P],A=w.keyframe,b=w.state;c[b][A]+=1,d[b]+=1,u++}if(l(I.children))for(let P=0;P<8;P++){let w=I.children[P];h(w)}}h(s),e._primitive.statistics.numberOfTilesWithContentReady=d[_o.LoadState.LOADED],e._primitive.statistics.visited=u;let p=d[_o.LoadState.RECEIVING],g=d[_o.LoadState.PROCESSING],f=p!==e._primitive.statistics.numberOfPendingRequests||g!==e._primitive.statistics.numberOfTilesProcessing;if(f&&t.afterRender.push(function(){return e._primitive.loadProgress.raiseEvent(p,g),!0}),e._primitive.statistics.numberOfPendingRequests=p,e._primitive.statistics.numberOfTilesProcessing=g,f&&(p===0&&g===0)&&(t.afterRender.push(function(){return e._primitive.allTilesLoaded.raiseEvent(),!0}),e._initialTilesLoaded||(e._initialTilesLoaded=!0,t.afterRender.push(function(){return e._primitive.initialTilesLoaded.raiseEvent(),!0}))),!e._debugPrint)return;let _=`KEYFRAMES: ${c[_o.LoadState.LOADED]}`,C=`UNLOADED: ${d[_o.LoadState.UNLOADED]} | RECEIVING: ${d[_o.LoadState.RECEIVING]} | PROCESSING: ${d[_o.LoadState.PROCESSING]} | LOADED: ${d[_o.LoadState.LOADED]} | FAILED: ${d[_o.LoadState.FAILED]} | UNAVAILABLE: ${d[_o.LoadState.UNAVAILABLE]} | TOTAL: ${u}`,V=Math.round(n*100)/100,L=Math.round(i*100)/100,R=Math.round(o*100)/100,G=`LOAD: ${V} | OCT: ${L} | ALL: ${R}`;console.log(`${_} || ${C} || ${G}`)}var tB={INTERNAL:0,LEAF:1,PACKED_LEAF_FROM_PARENT:2};function hyt(e,t,n){let i=e._primitive._screenSpaceError,o=e._keyframeLocation,r=e._frameNumber,s=t>=2,a=0,c=0,d=[],u=[];function h(g,f,x,_,C){let V=!1;if(l(g.children))for(let L=0;L<8;L++){let R=g.children[L];R.computeSurroundingRenderableKeyframeNodes(o),R.isRenderable(r)&&(V=!0)}if(V){d[C]=tB.INTERNAL<<16|f,d[x]=_,a++,_=f,C=_*9+1;for(let L=0;L<8;L++){let R=g.children[L];f=a,x=f*9+0,h(R,f,x,_,C+L)}}else{if(e._primitive.tileVisible.raiseEvent(),s){let L=c*5,R=g.renderableKeyframeNodePrevious,G=g.level-R.spatialNode.level,I=R.spatialNode.parent,v=l(I)?I.renderableKeyframeNodePrevious:R,P=fyt(g,i,n),w=G,A=1,b=R.megatextureIndex,Z=v.megatextureIndex;u[L+0]=P,u[L+1]=w,u[L+2]=A,u[L+3]=b,u[L+4]=Z,d[C]=tB.LEAF<<16|c}else{let L=g.renderableKeyframeNodePrevious,G=g.level-L.spatialNode.level===0?tB.LEAF:tB.PACKED_LEAF_FROM_PARENT;d[C]=G<<16|L.megatextureIndex}c++}}let p=e.rootNode;p.computeSurroundingRenderableKeyframeNodes(o),p.isRenderable(r)&&h(p,0,0,0,0),pyt(d,9,e.internalNodeTilesPerRow,e.internalNodeTexture),s&&byt(u,2,e.leafNodeTilesPerRow,e.leafNodeTexture)}function fyt(e,t,n){if(e.parent===void 0)return 0;let i=e.screenSpaceError,o=e.parent.screenSpaceError,s=((t-i)/(o-i)+n-1)/n;return W.clamp(s,0,1)}function pyt(e,t,n,i){let o=ot.componentsLength(i.pixelFormat),r=Math.ceil(e.length/t),s=Math.max(1,t*Math.min(r,n)),a=Math.max(1,Math.ceil(r/n)),c=new Uint8Array(s*a*o);for(let h=0;h<e.length;h++){let p=e[h],g=h*o;for(let f=0;f<o;f++)c[g+f]=p>>>f*8&255}let u={source:{arrayBufferView:c,width:s,height:a},xOffset:0,yOffset:0};i.copyFrom(u)}function byt(e,t,n,i){let o=ot.componentsLength(i.pixelFormat),r=5,s=Math.ceil(e.length/r),a=Math.max(1,t*Math.min(s,n)),c=Math.max(1,Math.ceil(s/n)),d=new Uint8Array(a*c*o);for(let p=0;p<s;p++){let g=e[p*r+0],f=e[p*r+1],x=e[p*r+2],_=e[p*r+3],C=e[p*r+4],V=W.clamp(Math.floor(65536*g),0,65535);d[p*8+0]=V>>>0&255,d[p*8+1]=V>>>8&255,d[p*8+2]=f&255,d[p*8+3]=x&255,d[p*8+4]=_>>>0&255,d[p*8+5]=_>>>8&255,d[p*8+6]=C>>>0&255,d[p*8+7]=C>>>8&255}let h={source:{arrayBufferView:d,width:a,height:c},xOffset:0,yOffset:0};i.copyFrom(h)}function gyt(e,t,n,i){let o=0,r=n.length;for(let s=0;s<r;s++){let a=n[s],c=i[s],d=ut.getComponentCount(a);o+=GL.getApproximateTextureMemoryByteLength(e,t,d,c)}return o}var cM=Oy;function gp(e){e=y(e,y.EMPTY_OBJECT),this._ready=!1,this._provider=y(e.provider,gp.DefaultProvider),this._traversal=void 0,this._statistics=new bh,this._calculateStatistics=y(e.calculateStatistics,!1),this._shape=void 0,this._shapeVisible=!1,this._dimensions=new m,this._inputDimensions=new m,this._paddingBefore=new m,this._paddingAfter=new m,this._minBounds=new m,this._minBoundsOld=new m,this._maxBounds=new m,this._maxBoundsOld=new m,this._exaggeratedMinBounds=new m,this._exaggeratedMinBoundsOld=new m,this._exaggeratedMaxBounds=new m,this._exaggeratedMaxBoundsOld=new m,this._minClippingBounds=new m,this._minClippingBoundsOld=new m,this._maxClippingBounds=new m,this._maxClippingBoundsOld=new m,this._clippingPlanes=void 0,this._clippingPlanesState=0,this._clippingPlanesEnabled=!1,this._modelMatrix=M.clone(y(e.modelMatrix,M.IDENTITY)),this._exaggeratedModelMatrix=M.clone(this._modelMatrix),this._compoundModelMatrix=new M,this._compoundModelMatrixOld=new M,this._customShader=y(e.customShader,gp.DefaultCustomShader),this._customShaderCompilationEvent=new be,this._shaderDirty=!0,this._drawCommand=void 0,this._drawCommandPick=void 0,this._pickId=void 0,this._clock=e.clock,this._transformPositionWorldToUv=new M,this._transformPositionUvToWorld=new M,this._transformDirectionWorldToLocal=new $,this._transformNormalLocalToWorld=new $,this._nearestSampling=!1,this._levelBlendFactor=0,this._stepSizeMultiplier=1,this._depthTest=!0,this._useLogDepth=void 0,this._screenSpaceError=4,this._debugPolylines=new uh,this._debugDraw=!1,this._disableRender=!1,this._disableUpdate=!1,this._uniforms={octreeInternalNodeTexture:void 0,octreeInternalNodeTilesPerRow:0,octreeInternalNodeTexelSizeUv:new D,octreeLeafNodeTexture:void 0,octreeLeafNodeTilesPerRow:0,octreeLeafNodeTexelSizeUv:new D,megatextureTextures:[],megatextureSliceDimensions:new D,megatextureTileDimensions:new D,megatextureVoxelSizeUv:new D,megatextureSliceSizeUv:new D,megatextureTileSizeUv:new D,dimensions:new m,inputDimensions:new m,paddingBefore:new m,paddingAfter:new m,transformPositionViewToUv:new M,transformPositionUvToView:new M,transformDirectionViewToLocal:new $,transformNormalLocalToWorld:new $,cameraPositionUv:new m,ndcSpaceAxisAlignedBoundingBox:new re,clippingPlanesTexture:void 0,clippingPlanesMatrix:new M,stepSize:0,pickColor:new B},this._shapeDefinesOld={},this._uniformMap={};let t=this._uniforms,n=this._uniformMap;for(let o in t)if(t.hasOwnProperty(o)){let r=`u_${o}`;n[r]=function(){return t[o]}}this.tileLoad=new be,this.tileVisible=new be,this.tileFailed=new be,this.tileUnload=new be,this.loadProgress=new be,this.allTilesLoaded=new be,this.initialTilesLoaded=new be;let i=this._provider;yyt(this,i)}function yyt(e,t){let{shape:n,minBounds:i=Ni.getMinBounds(n),maxBounds:o=Ni.getMaxBounds(n)}=t;e.minBounds=i,e.maxBounds=o,e.minClippingBounds=Ni.getMinBounds(n),e.maxClippingBounds=Ni.getMaxBounds(n),e._exaggeratedMinBounds=m.clone(e._minBounds,e._exaggeratedMinBounds),e._exaggeratedMaxBounds=m.clone(e._maxBounds,e._exaggeratedMaxBounds),e._exaggeratedModelMatrix=M.clone(e._modelMatrix,e._exaggeratedModelMatrix),eSe(e,t);let r=Ni.getShapeConstructor(n);e._shape=new r,e._shapeVisible=tSe(e,e._shape,t)}Object.defineProperties(gp.prototype,{ready:{get:function(){return this._ready}},provider:{get:function(){return this._provider}},boundingSphere:{get:function(){return this._shape.boundingSphere}},orientedBoundingBox:{get:function(){return this._shape.orientedBoundingBox}},modelMatrix:{get:function(){return this._modelMatrix},set:function(e){this._modelMatrix=M.clone(e,this._modelMatrix)}},shape:{get:function(){return this._provider.shape}},dimensions:{get:function(){return this._dimensions}},inputDimensions:{get:function(){return this._inputDimensions}},paddingBefore:{get:function(){return this._paddingBefore}},paddingAfter:{get:function(){return this._paddingAfter}},minimumValues:{get:function(){return this._provider.minimumValues}},maximumValues:{get:function(){return this._provider.maximumValues}},show:{get:function(){return!this._disableRender},set:function(e){this._disableRender=!e}},disableUpdate:{get:function(){return this._disableUpdate},set:function(e){this._disableUpdate=e}},debugDraw:{get:function(){return this._debugDraw},set:function(e){this._debugDraw=e}},depthTest:{get:function(){return this._depthTest},set:function(e){this._depthTest!==e&&(this._depthTest=e,this._shaderDirty=!0)}},nearestSampling:{get:function(){return this._nearestSampling},set:function(e){this._nearestSampling!==e&&(this._nearestSampling=e,this._shaderDirty=!0)}},levelBlendFactor:{get:function(){return this._levelBlendFactor},set:function(e){this._levelBlendFactor=W.clamp(e,0,1)}},screenSpaceError:{get:function(){return this._screenSpaceError},set:function(e){this._screenSpaceError=e}},stepSize:{get:function(){return this._stepSizeMultiplier},set:function(e){this._stepSizeMultiplier=e}},minBounds:{get:function(){return this._minBounds},set:function(e){this._minBounds=m.clone(e,this._minBounds)}},maxBounds:{get:function(){return this._maxBounds},set:function(e){this._maxBounds=m.clone(e,this._maxBounds)}},minClippingBounds:{get:function(){return this._minClippingBounds},set:function(e){this._minClippingBounds=m.clone(e,this._minClippingBounds)}},maxClippingBounds:{get:function(){return this._maxClippingBounds},set:function(e){this._maxClippingBounds=m.clone(e,this._maxClippingBounds)}},clippingPlanes:{get:function(){return this._clippingPlanes},set:function(e){bs.setOwner(e,this,"_clippingPlanes")}},customShader:{get:function(){return this._customShader},set:function(e){if(this._customShader!==e){let t=this._uniformMap,i=this._customShader.uniformMap;for(let o in i)i.hasOwnProperty(o)&&delete t[o];l(e)?this._customShader=e:this._customShader=gp.DefaultCustomShader,this._shaderDirty=!0}}},customShaderCompilationEvent:{get:function(){return this._customShaderCompilationEvent}},statistics:{get:function(){return this._statistics}}});var xyt=new re,_yt=new re,Tyt=new m,Syt=new m,Cyt=new $,Vyt=new $,Lyt=new M,Ryt=new M,Zyt=new M,Gyt=M.fromRotationTranslation($.fromUniformScale(.5,new $),new m(.5,.5,.5),new M),Eyt=M.fromRotationTranslation($.fromUniformScale(2,new $),new m(-1,-1,-1),new M);gp.prototype.update=function(e){let t=this._provider;this._customShader.update(e);let n=e.context;if(!this._ready){wyt(this,t,n),e.afterRender.push(()=>(this._ready=!0,!0));return}Pyt(this,e);let i=eSe(this,t),o=this._shape;if(i&&(this._shapeVisible=tSe(this,o,t),Ayt(this,o)&&(this._shaderDirty=!0)),!this._shapeVisible)return;let r=Myt(t.timeIntervalCollection,this._clock),s=this._traversal,a=s._sampleCount;if(s.update(e,r,i,this._disableUpdate),a!==s._sampleCount&&(this._shaderDirty=!0),!s.isRenderable(s.rootNode)||(this._debugDraw&&Hyt(this,e),this._disableRender))return;this._useLogDepth!==e.useLogDepth&&(this._useLogDepth=e.useLogDepth,this._shaderDirty=!0),Nyt(this,e)&&(this._shaderDirty=!0);let d=s.leafNodeTexture,u=this._uniforms;l(d)&&(u.octreeLeafNodeTexture=s.leafNodeTexture,u.octreeLeafNodeTexelSizeUv=D.clone(s.leafNodeTexelSizeUv,u.octreeLeafNodeTexelSizeUv),u.octreeLeafNodeTilesPerRow=s.leafNodeTilesPerRow),this._shaderDirty&&(eM(this,n),this._shaderDirty=!1);let h=n.uniformState.viewProjection,p=o.orientedBoundingBox,g=Dyt(p,h,_yt);if(g.x===1||g.y===1||g.z===-1||g.w===-1)return;u.ndcSpaceAxisAlignedBoundingBox=re.clone(g,u.ndcSpaceAxisAlignedBoundingBox);let x=n.uniformState.inverseView;u.transformPositionViewToUv=M.multiplyTransformation(this._transformPositionWorldToUv,x,u.transformPositionViewToUv);let _=n.uniformState.view;u.transformPositionUvToView=M.multiplyTransformation(_,this._transformPositionUvToWorld,u.transformPositionUvToView);let C=n.uniformState.inverseViewRotation;u.transformDirectionViewToLocal=$.multiply(this._transformDirectionWorldToLocal,C,u.transformDirectionViewToLocal),u.transformNormalLocalToWorld=$.clone(this._transformNormalLocalToWorld,u.transformNormalLocalToWorld);let V=e.camera.positionWC;u.cameraPositionUv=M.multiplyByPoint(this._transformPositionWorldToUv,V,u.cameraPositionUv),u.stepSize=this._stepSizeMultiplier;let L=e.passes.pick?this._drawCommandPick:e.passes.pickVoxel?this._drawCommandPickVoxel:this._drawCommand;L.boundingVolume=o.boundingSphere,e.commandList.push(L)};var Iyt=new m,j8=new m,Xyt=new he,Wyt=new m;function Pyt(e,t){if(e._exaggeratedMinBounds=m.clone(e._minBounds,e._exaggeratedMinBounds),e._exaggeratedMaxBounds=m.clone(e._maxBounds,e._exaggeratedMaxBounds),e.shape===Ni.ELLIPSOID){let n=t.verticalExaggerationRelativeHeight,i=t.verticalExaggeration;e._exaggeratedMinBounds.z=(e._minBounds.z-n)*i+n,e._exaggeratedMaxBounds.z=(e._maxBounds.z-n)*i+n}else if(e.shape===Ni.BOX){let n=m.fromElements(1,1,t.verticalExaggeration,Iyt);e._exaggeratedModelMatrix=M.multiplyByScale(e._modelMatrix,n,e._exaggeratedModelMatrix),e._exaggeratedModelMatrix=M.multiplyByTranslation(e._exaggeratedModelMatrix,vyt(e,t),e._exaggeratedModelMatrix)}}function vyt(e,t){let{shapeTransform:n=M.IDENTITY,globalTransform:i=M.IDENTITY}=e._provider,o=M.getTranslation(n,j8),r=M.multiplyByPoint(e._modelMatrix,o,j8),s=M.multiplyByPoint(i,r,j8),c=ne.WGS84.cartesianToCartographic(s,Xyt),d=0;l(c)&&(d=c.height);let u=Sr.getHeight(d,t.verticalExaggeration,t.verticalExaggerationRelativeHeight);return m.fromElements(0,0,(u-d)/t.verticalExaggeration,Wyt)}function wyt(e,t,n){let i=e._uniforms;e._pickId=n.createPickId({primitive:e}),i.pickColor=B.clone(e._pickId.color,i.pickColor);let{shaderDefines:o,shaderUniforms:r}=e._shape;e._shapeDefinesOld=Oe(o,!0);let s=e._uniformMap;for(let c in r)if(r.hasOwnProperty(c)){let d=`u_${c}`;s[d]=function(){return r[c]}}if(e._dimensions=m.clone(t.dimensions,e._dimensions),i.dimensions=m.clone(e._dimensions,i.dimensions),e._paddingBefore=m.clone(y(t.paddingBefore,m.ZERO),e._paddingBefore),i.paddingBefore=m.clone(e._paddingBefore,i.paddingBefore),e._paddingAfter=m.clone(y(t.paddingAfter,m.ZERO),e._paddingAfter),i.paddingAfter=m.clone(e._paddingAfter,i.paddingAfter),e._inputDimensions=m.add(e._dimensions,e._paddingBefore,e._inputDimensions),e._inputDimensions=m.add(e._inputDimensions,e._paddingAfter,e._inputDimensions),t.metadataOrder===zh.GLTF){let c=e._inputDimensions.y;e._inputDimensions.y=e._inputDimensions.z,e._inputDimensions.z=c}i.inputDimensions=m.clone(e._inputDimensions,i.inputDimensions);let a=y(t.keyframeCount,1);e._traversal=new cM(e,n,a),e.statistics.texturesByteLength=e._traversal.textureMemoryByteLength,Fyt(e._traversal,i)}function eSe(e,t){let n=y(t.shapeTransform,M.IDENTITY),i=y(t.globalTransform,M.IDENTITY);return M.multiplyTransformation(i,e._exaggeratedModelMatrix,e._compoundModelMatrix),M.multiplyTransformation(e._compoundModelMatrix,n,e._compoundModelMatrix),SS(e,"_compoundModelMatrix","_compoundModelMatrixOld")+SS(e,"_minBounds","_minBoundsOld")+SS(e,"_maxBounds","_maxBoundsOld")+SS(e,"_exaggeratedMinBounds","_exaggeratedMinBoundsOld")+SS(e,"_exaggeratedMaxBounds","_exaggeratedMaxBoundsOld")+SS(e,"_minClippingBounds","_minClippingBoundsOld")+SS(e,"_maxClippingBounds","_maxClippingBoundsOld")>0}function SS(e,t,n){let i=e[t],o=e[n],r=!i.equals(o);return r&&i.clone(o),r?1:0}function tSe(e,t,n){if(!t.update(e._compoundModelMatrix,e._exaggeratedMinBounds,e._exaggeratedMaxBounds,e.minClippingBounds,e.maxClippingBounds))return!1;let o=t.shapeTransform,r=M.inverse(o,Lyt),s=M.getRotation(o,Cyt),a=M.getScale(o,Tyt),c=m.maximumComponent(a),d=m.divideByScalar(a,c,Syt),u=$.multiplyByScale(s,d,Vyt);return e._transformPositionWorldToUv=M.multiplyTransformation(Gyt,r,e._transformPositionWorldToUv),e._transformPositionUvToWorld=M.multiplyTransformation(o,Eyt,e._transformPositionUvToWorld),e._transformDirectionWorldToLocal=M.getMatrix3(r,e._transformDirectionWorldToLocal),e._transformNormalLocalToWorld=$.inverseTranspose(u,e._transformNormalLocalToWorld),!0}function Fyt(e,t){t.octreeInternalNodeTexture=e.internalNodeTexture,t.octreeInternalNodeTexelSizeUv=D.clone(e.internalNodeTexelSizeUv,t.octreeInternalNodeTexelSizeUv),t.octreeInternalNodeTilesPerRow=e.internalNodeTilesPerRow;let n=e.megatextures,i=n[0],o=n.length;t.megatextureTextures=new Array(o);for(let r=0;r<o;r++)t.megatextureTextures[r]=n[r].texture;t.megatextureSliceDimensions=D.clone(i.sliceCountPerRegion,t.megatextureSliceDimensions),t.megatextureTileDimensions=D.clone(i.regionCountPerMegatexture,t.megatextureTileDimensions),t.megatextureVoxelSizeUv=D.clone(i.voxelSizeUv,t.megatextureVoxelSizeUv),t.megatextureSliceSizeUv=D.clone(i.sliceSizeUv,t.megatextureSliceSizeUv),t.megatextureTileSizeUv=D.clone(i.regionSizeUv,t.megatextureTileSizeUv)}function Ayt(e,t){let n=t.shaderDefines,i=Object.keys(n).some(o=>n[o]!==e._shapeDefinesOld[o]);return i&&(e._shapeDefinesOld=Oe(n,!0)),i}function Myt(e,t){if(!l(e)||!l(t))return 0;let n=t.currentTime,i,o=e.indexOf(n);o>=0?i=e.get(o):(o=~o,o===e.length?(o=e.length-1,i=e.get(o),n=i.stop):(i=e.get(o),n=i.start));let r=q.secondsDifference(i.stop,i.start),a=q.secondsDifference(n,i.start)/r;return o+a}function Nyt(e,t){let n=e.clippingPlanes;if(!l(n))return!1;n.update(t);let{clippingPlanesState:i,enabled:o}=n;if(o){let r=e._uniforms;r.clippingPlanesTexture=n.texture,r.clippingPlanesMatrix=M.transpose(M.multiplyTransformation(M.inverse(n.modelMatrix,r.clippingPlanesMatrix),e._transformPositionUvToWorld,r.clippingPlanesMatrix),r.clippingPlanesMatrix)}return e._clippingPlanesState===i&&e._clippingPlanesEnabled===o?!1:(e._clippingPlanesState=i,e._clippingPlanesEnabled=o,!0)}gp.prototype.isDestroyed=function(){return!1};gp.prototype.destroy=function(){let e=this._drawCommand;l(e)&&(e.shaderProgram=e.shaderProgram&&e.shaderProgram.destroy());let t=this._drawCommandPick;return l(t)&&(t.shaderProgram=t.shaderProgram&&t.shaderProgram.destroy()),this._pickId=this._pickId&&this._pickId.destroy(),this._traversal=this._traversal&&this._traversal.destroy(),this.statistics.texturesByteLength=0,this._clippingPlanes=this._clippingPlanes&&this._clippingPlanes.destroy(),me(this)};var $Te=new Array(new re(-1,-1,-1,1),new re(1,-1,-1,1),new re(-1,1,-1,1),new re(1,1,-1,1),new re(-1,-1,1,1),new re(1,-1,1,1),new re(-1,1,1,1),new re(1,1,1,1)),kyt=new Array(1,2,4,0,3,5,0,3,6,1,2,7,0,5,6,1,4,7,2,4,7,3,5,6),Uyt=new Array(new re,new re,new re,new re,new re,new re,new re,new re);function Dyt(e,t,n){let i=M.fromRotationTranslation(e.halfAxes,e.center,Ryt),o=M.multiply(t,i,Zyt),r=+Number.MAX_VALUE,s=-Number.MAX_VALUE,a=+Number.MAX_VALUE,c=-Number.MAX_VALUE,d,u=Uyt,h=$Te.length;for(d=0;d<h;d++)M.multiplyByVector(o,$Te[d],u[d]);for(d=0;d<h;d++){let p=u[d];if(p.z>=-p.w){let g=p.x/p.w,f=p.y/p.w;r=Math.min(r,g),s=Math.max(s,g),a=Math.min(a,f),c=Math.max(c,f)}else for(let g=0;g<3;g++){let f=kyt[d*3+g],x=u[f];if(x.z>=-x.w){let _=p.z+p.w,C=x.z+x.w,V=_/(_-C),L=re.lerp(p,x,V,xyt),R=L.x/L.w,G=L.y/L.w;r=Math.min(r,R),s=Math.max(s,R),a=Math.min(a,G),c=Math.max(c,G)}}}return r=W.clamp(r,-1,1),a=W.clamp(a,-1,1),s=W.clamp(s,-1,1),c=W.clamp(c,-1,1),n=re.fromElements(r,a,s,c,n),n}var q8=3e7,Byt=new m(q8,0,0),Oyt=new m(0,q8,0),Yyt=new m(0,0,q8);function Hyt(e,t){let n=e._traversal,i=e._debugPolylines;i.removeAll();function o(c,d,u,h){i.add({positions:[c,d],width:h,material:Ji.fromType("Color",{color:u})})}function r(c,d,u){let h=c.computeCorners();o(h[0],h[1],d,u),o(h[2],h[3],d,u),o(h[4],h[5],d,u),o(h[6],h[7],d,u),o(h[0],h[2],d,u),o(h[4],h[6],d,u),o(h[1],h[3],d,u),o(h[5],h[7],d,u),o(h[0],h[4],d,u),o(h[2],h[6],d,u),o(h[1],h[5],d,u),o(h[3],h[7],d,u)}function s(c){if(!n.isRenderable(c))return;let d=c.level,h=Math.max(1,5/Math.pow(2,d)),g=[B.RED,B.LIME,B.BLUE][d%3];if(r(c.orientedBoundingBox,g,h),l(c.children))for(let f=0;f<8;f++)s(c.children[f])}r(e._shape.orientedBoundingBox,B.WHITE,5),s(n.rootNode);let a=10;o(m.ZERO,Byt,B.RED,a),o(m.ZERO,Oyt,B.LIME,a),o(m.ZERO,Yyt,B.BLUE,a),i.update(t)}gp.DefaultCustomShader=new yS({fragmentShaderText:`void fragmentMain(FragmentInput fsInput, inout czm_modelMaterial material) { material.diffuse = vec3(1.0); material.alpha = 1.0; }`});function nSe(){this.ready=!0,this.shape=Ni.BOX,this.dimensions=new m(1,1,1),this.names=["data"],this.types=[ut.SCALAR],this.componentTypes=[At.FLOAT32],this.maximumTileCount=1}nSe.prototype.requestData=function(e){if((l(e)?y(e.tileLevel,0):0)>=1)return;let n=new xS({metadata:[new Float32Array(1)]});return Promise.resolve(n)};gp.DefaultProvider=new nSe;var Yy=gp;var BYi=T(S(),1);function zyt(e,t,n,i){if(!l(e)||l(t)&&e.id!==t)return;let r=(e.classes||{})[n];if(!l(r))return;let a=(r.properties||{})[i];if(l(a))return a}var lM=zyt;var YYi=T(S(),1);function Kyt(e,t,n,i,o){this.schemaId=e,this.className=t,this.propertyName=n,this.classProperty=i,this.metadataProperty=o}var dM=Kyt;var KYi=T(S(),1);function Jyt(e,t,n){if(!l(e))return;let i=e.propertyTextures;for(let o of i)if(o.class.id===t){let a=o.properties[n];if(l(a))return a}}var uM=Jyt;var iB=function(e){return function(){e.frameState.afterRender.push(function(){e.requestRender()})}};function ui(e){e=y(e,y.EMPTY_OBJECT);let t=e.canvas,n=e.creditContainer,i=e.creditViewport,o=Oe(e.contextOptions),r=l(n),s=new Pw(t,o);r||(n=document.createElement("div"),n.style.position="absolute",n.style.bottom="0",n.style["text-shadow"]="0 0 2px #000000",n.style.color="#ffffff",n.style["font-size"]="10px",n.style["padding-right"]="5px",t.parentNode.appendChild(n)),l(i)||(i=t.parentNode),this._id=Jn(),this._jobScheduler=new NF,this._frameState=new AF(s,new RF(n,"\u2022",i),this._jobScheduler),this._frameState.scene3DOnly=y(e.scene3DOnly,!1),this._removeCreditContainer=!r,this._creditContainer=n,this._canvas=t,this._context=s,this._computeEngine=new Gw(s),this._ellipsoid=y(e.ellipsoid,ne.default),this._globe=void 0,this._globeTranslucencyState=new MF,this._primitives=new dl,this._groundPrimitives=new dl,this._globeHeight=void 0,this._globeHeightDirty=!0,this._cameraUnderground=!1,this._removeUpdateHeightCallback=void 0,this._logDepthBuffer=ui.defaultLogDepthBuffer&&s.fragmentDepth,this._logDepthBufferDirty=!0,this._tweens=new hS,this._shaderFrameCount=0,this._sunPostProcess=void 0,this._computeCommandList=[],this._overlayCommandList=[],this._useOIT=y(e.orderIndependentTranslucency,!0),this._executeOITFunction=void 0,this._depthPlane=new vF(e.depthPlaneEllipsoidOffset),this._clearColorCommand=new ai({color:new B,stencil:0,owner:this}),this._depthClearCommand=new ai({depth:1,owner:this}),this._stencilClearCommand=new ai({stencil:0}),this._classificationStencilClearCommand=new ai({stencil:0,renderState:Ue.fromCache({stencilMask:Dt.CLASSIFICATION_MASK})}),this._depthOnlyRenderStateCache={},this._transitioner=new ZA(this),this._preUpdate=new be,this._postUpdate=new be,this._renderError=new be,this._preRender=new be,this._postRender=new be,this._minimumDisableDepthTestDistance=0,this._debugInspector=new FA,this._msaaSamples=y(e.msaaSamples,4),this.rethrowRenderErrors=!1,this.completeMorphOnUserInput=!0,this.morphStart=new be,this.morphComplete=new be,this.skyBox=void 0,this.skyAtmosphere=void 0,this.sun=void 0,this.sunBloom=!0,this._sunBloom=void 0,this.moon=void 0,this.backgroundColor=B.clone(B.BLACK),this._mode=oe.SCENE3D,this._mapProjection=l(e.mapProjection)?e.mapProjection:new Ii(this._ellipsoid),this.morphTime=1,this.farToNearRatio=1e3,this.logarithmicDepthFarToNearRatio=1e9,this.nearToFarDistance2D=175e4,this.verticalExaggeration=1,this.verticalExaggerationRelativeHeight=0,this.debugCommandFilter=void 0,this.debugShowCommands=!1,this.debugShowFrustums=!1,this.debugShowFramesPerSecond=!1,this.debugShowDepthFrustum=1,this.debugShowFrustumPlanes=!1,this._debugShowFrustumPlanes=!1,this._debugFrustumPlanes=void 0,this.useDepthPicking=!0,this.pickTranslucentDepth=!1,this.cameraEventWaitTime=500,this.atmosphere=new R_,this.fog=new FF,this.fog.enabled=ne.WGS84.equals(this._ellipsoid),ne.WGS84.equals(this._ellipsoid)||(co.DEFAULT_VIEW_RECTANGLE=le.fromDegrees(-45,-45,45,45)),this._shadowMapCamera=new co(this),this.shadowMap=new L0({context:s,lightCamera:this._shadowMapCamera,enabled:y(e.shadows,!1)}),this.invertClassification=!1,this.invertClassificationColor=B.clone(B.WHITE),this._actualInvertClassificationColor=B.clone(this._invertClassificationColor),this._invertClassification=new xL,this.focalLength=void 0,this.eyeSeparation=void 0,this.postProcessStages=new VA,this._brdfLutGenerator=new _F,this._performanceDisplay=void 0,this._debugVolume=void 0,this._screenSpaceCameraController=new XA(this),this._cameraUnderground=!1,this._mapMode2D=y(e.mapMode2D,id.INFINITE_SCROLL),this._environmentState={skyBoxCommand:void 0,skyAtmosphereCommand:void 0,sunDrawCommand:void 0,sunComputeCommand:void 0,moonCommand:void 0,isSunVisible:!1,isMoonVisible:!1,isReadyForAtmosphere:!1,isSkyAtmosphereVisible:!1,clearGlobeDepth:!1,useDepthPlane:!1,renderTranslucentDepthForPick:!1,originalFramebuffer:void 0,useGlobeDepthFramebuffer:!1,useOIT:!1,useInvertClassification:!1,usePostProcess:!1,usePostProcessSelected:!1,useWebVR:!1},this._useWebVR=!1,this._cameraVR=void 0,this._aspectRatioVR=void 0,this.requestRenderMode=y(e.requestRenderMode,!1),this._renderRequested=!0,this.maximumRenderTimeChange=y(e.maximumRenderTimeChange,0),this._lastRenderTime=void 0,this._frameRateMonitor=void 0,this._removeRequestListenerCallback=ic.requestCompletedEvent.addEventListener(iB(this)),this._removeTaskProcessorListenerCallback=Ti.taskCompletedEvent.addEventListener(iB(this)),this._removeGlobeCallbacks=[],this._removeTerrainProviderReadyListener=void 0;let a=new He(0,0,s.drawingBufferWidth,s.drawingBufferHeight),c=new co(this);this._logDepthBuffer&&(c.frustum.near=.1,c.frustum.far=1e10),this.preloadFlightCamera=new co(this),this.preloadFlightCullingVolume=void 0,this._picking=new tA(this),this._defaultView=new rS(this,c,a),this._view=this._defaultView,this._hdr=void 0,this._hdrDirty=void 0,this.highDynamicRange=!1,this.gamma=2.2,this.sphericalHarmonicCoefficients=void 0,this.specularEnvironmentMaps=void 0,this._specularEnvironmentCubeMap=void 0,this.light=new h0,aSe(this,0,q.now()),this.updateFrameState(),this.initializeFrame()}ui.defaultLogDepthBuffer=!0;function Qyt(e,t){for(let i=0;i<e._removeGlobeCallbacks.length;++i)e._removeGlobeCallbacks[i]();e._removeGlobeCallbacks.length=0;let n=[];l(t)&&(n.push(t.imageryLayersUpdatedEvent.addEventListener(iB(e))),n.push(t.terrainProviderChanged.addEventListener(iB(e)))),e._removeGlobeCallbacks=n}Object.defineProperties(ui.prototype,{canvas:{get:function(){return this._canvas}},drawingBufferHeight:{get:function(){return this._context.drawingBufferHeight}},drawingBufferWidth:{get:function(){return this._context.drawingBufferWidth}},maximumAliasedLineWidth:{get:function(){return Mt.maximumAliasedLineWidth}},maximumCubeMapSize:{get:function(){return Mt.maximumCubeMapSize}},pickPositionSupported:{get:function(){return this._context.depthTexture}},sampleHeightSupported:{get:function(){return this._context.depthTexture}},clampToHeightSupported:{get:function(){return this._context.depthTexture}},invertClassificationSupported:{get:function(){return this._context.depthTexture}},specularEnvironmentMapsSupported:{get:function(){return Hm.isSupported(this._context)}},ellipsoid:{get:function(){return this._ellipsoid}},globe:{get:function(){return this._globe},set:function(e){this._globe=this._globe&&this._globe.destroy(),this._globe=e,Qyt(this,e)}},primitives:{get:function(){return this._primitives}},groundPrimitives:{get:function(){return this._groundPrimitives}},camera:{get:function(){return this._view.camera},set:function(e){this._view.camera=e}},view:{get:function(){return this._view},set:function(e){this._view=e}},defaultView:{get:function(){return this._defaultView}},picking:{get:function(){return this._picking}},screenSpaceCameraController:{get:function(){return this._screenSpaceCameraController}},mapProjection:{get:function(){return this._mapProjection}},jobScheduler:{get:function(){return this._jobScheduler}},frameState:{get:function(){return this._frameState}},environmentState:{get:function(){return this._environmentState}},tweens:{get:function(){return this._tweens}},imageryLayers:{get:function(){if(l(this.globe))return this.globe.imageryLayers}},terrainProvider:{get:function(){if(l(this.globe))return this.globe.terrainProvider},set:function(e){this._removeTerrainProviderReadyListener=this._removeTerrainProviderReadyListener&&this._removeTerrainProviderReadyListener(),l(this.globe)&&(this.globe.terrainProvider=e)}},terrainProviderChanged:{get:function(){if(l(this.globe))return this.globe.terrainProviderChanged}},preUpdate:{get:function(){return this._preUpdate}},postUpdate:{get:function(){return this._postUpdate}},renderError:{get:function(){return this._renderError}},preRender:{get:function(){return this._preRender}},postRender:{get:function(){return this._postRender}},lastRenderTime:{get:function(){return this._lastRenderTime}},context:{get:function(){return this._context}},debugFrustumStatistics:{get:function(){return this._view.debugFrustumStatistics}},scene3DOnly:{get:function(){return this._frameState.scene3DOnly}},orderIndependentTranslucency:{get:function(){return this._useOIT}},id:{get:function(){return this._id}},mode:{get:function(){return this._mode},set:function(e){e===oe.SCENE2D?this.morphTo2D(0):e===oe.SCENE3D?this.morphTo3D(0):e===oe.COLUMBUS_VIEW&&this.morphToColumbusView(0),this._mode=e}},frustumCommandsList:{get:function(){return this._view.frustumCommandsList}},numberOfFrustums:{get:function(){return this._view.frustumCommandsList.length}},useWebVR:{get:function(){return this._useWebVR},set:function(e){this._useWebVR=e,this._useWebVR?(this._frameState.creditDisplay.container.style.visibility="hidden",this._cameraVR=new co(this),l(this._deviceOrientationCameraController)||(this._deviceOrientationCameraController=new wF(this)),this._aspectRatioVR=this.camera.frustum.aspectRatio):(this._frameState.creditDisplay.container.style.visibility="visible",this._cameraVR=void 0,this._deviceOrientationCameraController=this._deviceOrientationCameraController&&!this._deviceOrientationCameraController.isDestroyed()&&this._deviceOrientationCameraController.destroy(),this.camera.frustum.aspectRatio=this._aspectRatioVR,this.camera.frustum.xOffset=0)}},mapMode2D:{get:function(){return this._mapMode2D}},splitPosition:{get:function(){return this._frameState.splitPosition},set:function(e){this._frameState.splitPosition=e}},minimumDisableDepthTestDistance:{get:function(){return this._minimumDisableDepthTestDistance},set:function(e){this._minimumDisableDepthTestDistance=e}},logarithmicDepthBuffer:{get:function(){return this._logDepthBuffer},set:function(e){e=this._context.fragmentDepth&&e,this._logDepthBuffer!==e&&(this._logDepthBuffer=e,this._logDepthBufferDirty=!0)}},gamma:{get:function(){return this._context.uniformState.gamma},set:function(e){this._context.uniformState.gamma=e}},highDynamicRange:{get:function(){return this._hdr},set:function(e){let t=this._context,n=e&&t.depthTexture&&(t.colorBufferFloat||t.colorBufferHalfFloat);this._hdrDirty=n!==this._hdr,this._hdr=n}},highDynamicRangeSupported:{get:function(){let e=this._context;return e.depthTexture&&(e.colorBufferFloat||e.colorBufferHalfFloat)}},cameraUnderground:{get:function(){return this._cameraUnderground}},msaaSamples:{get:function(){return this._msaaSamples},set:function(e){e=Math.min(e,Mt.maximumSamples),this._msaaSamples=e}},msaaSupported:{get:function(){return this._context.msaa}},pixelRatio:{get:function(){return this._frameState.pixelRatio},set:function(e){this._frameState.pixelRatio=e}},opaqueFrustumNearOffset:{get:function(){return .9999}},globeHeight:{get:function(){return this._globeHeight}}});ui.prototype.getCompressedTextureFormatSupported=function(e){let t=this.context;return(e==="WEBGL_compressed_texture_s3tc"||e==="s3tc")&&t.s3tc||(e==="WEBGL_compressed_texture_pvrtc"||e==="pvrtc")&&t.pvrtc||(e==="WEBGL_compressed_texture_etc"||e==="etc")&&t.etc||(e==="WEBGL_compressed_texture_etc1"||e==="etc1")&&t.etc1||(e==="WEBGL_compressed_texture_astc"||e==="astc")&&t.astc||(e==="EXT_texture_compression_bptc"||e==="bc7")&&t.bc7};function jyt(e,t){let n=e.pickedMetadataInfo,i=t.pickedMetadataInfo;return(n==null?void 0:n.schemaId)!==(i==null?void 0:i.schemaId)||(n==null?void 0:n.className)!==(i==null?void 0:i.className)||(n==null?void 0:n.propertyName)!==(i==null?void 0:i.propertyName)}function iSe(e,t,n){let i=e._frameState,o=e._context,r=e._view.oit,{lightShadowMaps:s,lightShadowsEnabled:a}=i.shadowState,c=t.derivedCommands;l(t.pickId)&&(c.picking=cp.createPickDerivedCommand(e,t,o,c.picking)),i.pickingMetadata&&t.pickMetadataAllowed&&(t.pickedMetadataInfo=i.pickedMetadataInfo,l(t.pickedMetadataInfo)&&(c.pickingMetadata=cp.createPickMetadataDerivedCommand(e,t,o,c.pickingMetadata))),t.pickOnly||(c.depth=cp.createDepthOnlyDerivedCommand(e,t,o,c.depth)),c.originalCommand=t,e._hdr&&(c.hdr=cp.createHdrCommand(t,o,c.hdr),t=c.hdr.command,c=t.derivedCommands),a&&t.receiveShadows&&(c.shadows=L0.createReceiveDerivedCommand(s,t,n,o,c.shadows)),t.pass===Ge.TRANSLUCENT&&l(r)&&r.isSupported()&&(a&&t.receiveShadows?(c.oit=l(c.oit)?c.oit:{},c.oit.shadows=r.createDerivedCommands(c.shadows.receiveCommand,o,c.oit.shadows)):c.oit=r.createDerivedCommands(t,o,c.oit))}ui.prototype.updateDerivedCommands=function(e){let{derivedCommands:t}=e;if(!l(t))return;let n=this._frameState,{shadowState:i,useLogDepth:o}=this._frameState,r=this._context,s=!1,a=i.lastDirtyTime;e.lastDirtyTime!==a&&(e.lastDirtyTime=a,e.dirty=!0,s=!0);let c=this._hdr,d=l(t.logDepth),u=l(t.hdr),h=l(t.originalCommand),p=o&&!d,g=c&&!u,f=(!o||!c)&&!h,x=n.pickingMetadata&&jyt(e,n);if(e.dirty=e.dirty||p||g||f||x,!e.dirty)return;e.dirty=!1;let{shadowsEnabled:_,shadowMaps:C}=i;_&&e.castShadows&&(t.shadows=L0.createCastDerivedCommand(C,e,s,r,t.shadows)),(d||p)&&(t.logDepth=cp.createLogDepthCommand(e,r,t.logDepth),iSe(this,t.logDepth.command,s)),(h||f)&&iSe(this,e,s)};var qyt=new bm({pass:Ao.RENDER}),$8=new bm({pass:Ao.PRELOAD}),e7=new bm({pass:Ao.PRELOAD_FLIGHT}),$yt=new bm({pass:Ao.REQUEST_RENDER_MODE_DEFER_CHECK}),oSe=new de,t7;function ext(e){var t;if(!(e._mode!==oe.SCENE3D||!((t=e.globe)!=null&&t.show)||e._cameraUnderground||e._globeTranslucencyState.translucent))return oSe.radius=e.ellipsoid.minimumRadius+e.frameState.minimumTerrainHeight,t7=gF.fromBoundingSphere(oSe,e.camera.positionWC,t7),t7}ui.prototype.clearPasses=function(e){e.render=!1,e.pick=!1,e.pickVoxel=!1,e.depth=!1,e.postProcess=!1,e.offscreen=!1};function aSe(e,t,n){let i=e._frameState;i.frameNumber=t,i.time=q.clone(n,i.time)}ui.prototype.updateFrameState=function(){let e=this.camera,t=this._frameState;t.commandList.length=0,t.shadowMaps.length=0,t.brdfLutGenerator=this._brdfLutGenerator,t.environmentMap=this.skyBox&&this.skyBox._cubeMap,t.mode=this._mode,t.morphTime=this.morphTime,t.mapProjection=this.mapProjection,t.camera=e,t.cullingVolume=e.frustum.computeCullingVolume(e.positionWC,e.directionWC,e.upWC),t.occluder=ext(this),t.minimumTerrainHeight=0,t.minimumDisableDepthTestDistance=this._minimumDisableDepthTestDistance,t.invertClassification=this.invertClassification,t.useLogDepth=this._logDepthBuffer&&!(this.camera.frustum instanceof ln||this.camera.frustum instanceof Mr),t.light=this.light,t.cameraUnderground=this._cameraUnderground,t.globeTranslucencyState=this._globeTranslucencyState;let{globe:n}=this;l(n)&&n._terrainExaggerationChanged&&(this.verticalExaggeration=n._terrainExaggeration,this.verticalExaggerationRelativeHeight=n._terrainExaggerationRelativeHeight,n._terrainExaggerationChanged=!1),t.verticalExaggeration=this.verticalExaggeration,t.verticalExaggerationRelativeHeight=this.verticalExaggerationRelativeHeight,l(this._specularEnvironmentCubeMap)&&this._specularEnvironmentCubeMap.ready?(t.specularEnvironmentMaps=this._specularEnvironmentCubeMap.texture,t.specularEnvironmentMapsMaximumLOD=this._specularEnvironmentCubeMap.maximumMipmapLevel):(t.specularEnvironmentMaps=void 0,t.specularEnvironmentMapsMaximumLOD=void 0),t.sphericalHarmonicCoefficients=this.sphericalHarmonicCoefficients,this._actualInvertClassificationColor=B.clone(this.invertClassificationColor,this._actualInvertClassificationColor),xL.isTranslucencySupported(this._context)||(this._actualInvertClassificationColor.alpha=1),t.invertClassificationColor=this._actualInvertClassificationColor,l(this.globe)?t.maximumScreenSpaceError=this.globe.maximumScreenSpaceError:t.maximumScreenSpaceError=2,this.clearPasses(t.passes),t.tilesetPassState=void 0};ui.prototype.isVisible=function(e,t,n){if(!l(t))return!1;let{boundingVolume:i}=t;return!l(i)||!t.cull?!0:e.computeVisibility(i)===zt.OUTSIDE?!1:!l(n)||!t.occlude||!i.isOccluded(n)};var nB=new M(0,0,1,0,1,0,0,0,0,1,0,0,0,0,0,1);nB=M.inverseTransformation(nB,nB);function txt(e,t,n,i){let o=t._frameState,r=o.context,s=e.boundingVolume;l(t._debugVolume)&&t._debugVolume.destroy();let a=m.clone(s.center);if(o.mode!==oe.SCENE3D){a=M.multiplyByPoint(nB,a,a);let f=o.mapProjection,x=f.unproject(a);a=f.ellipsoid.cartographicToCartesian(x)}let c,d,{radius:u}=s;l(u)?(c=ta.createGeometry(new ta({radii:new m(u,u,u),vertexFormat:dn.FLAT_VERTEX_FORMAT})),d=M.fromTranslation(a)):(c=va.createGeometry(va.fromDimensions({dimensions:new m(2,2,2),vertexFormat:dn.FLAT_VERTEX_FORMAT})),d=M.fromRotationTranslation(s.halfAxes,a,new M)),t._debugVolume=new Xn({geometryInstances:new It({geometry:Nn.toWireframe(c),modelMatrix:d,attributes:{color:new Ht(1,0,0,1)}}),appearance:new dn({flat:!0,translucent:!1}),asynchronous:!1});let h=o.commandList,p=o.commandList=[];t._debugVolume.update(o),e=p[0],o.useLogDepth&&(e=cp.createLogDepthCommand(e,r).command);let g;l(i)&&(g=n.framebuffer,n.framebuffer=i),e.execute(r,n),l(g)&&(n.framebuffer=g),o.commandList=h}function yp(e,t,n,i){let o=t._frameState,r=t._context;if(l(t.debugCommandFilter)&&!t.debugCommandFilter(e))return;if(e instanceof ai){e.execute(r,n);return}e.debugShowBoundingVolume&&l(e.boundingVolume)&&txt(e,t,n,i),o.useLogDepth&&l(e.derivedCommands.logDepth)&&(e=e.derivedCommands.logDepth.command);let s=o.passes;if(!s.pick&&!s.pickVoxel&&!s.depth&&t._hdr&&l(e.derivedCommands)&&l(e.derivedCommands.hdr)&&(e=e.derivedCommands.hdr.command),s.pick||s.depth){if(s.pick&&!s.depth){if(o.pickingMetadata&&l(e.derivedCommands.pickingMetadata)){e=e.derivedCommands.pickingMetadata.pickMetadataCommand,e.execute(r,n);return}if(!o.pickingMetadata&&l(e.derivedCommands.picking)){e=e.derivedCommands.picking.pickCommand,e.execute(r,n);return}}else if(l(e.derivedCommands.depth)){e=e.derivedCommands.depth.depthOnlyCommand,e.execute(r,n);return}}if(t.debugShowCommands||t.debugShowFrustums){t._debugInspector.executeDebugShowFrustumsCommand(t,e,n);return}o.shadowState.lightShadowsEnabled&&e.receiveShadows&&l(e.derivedCommands.shadows)?e.derivedCommands.shadows.receiveCommand.execute(r,n):e.execute(r,n)}function rSe(e,t,n){let{derivedCommands:i}=e;if(!l(i))return;let o=t._frameState,r=t._context;o.useLogDepth&&l(i.logDepth)&&(e=i.logDepth.command);let{picking:s,pickingMetadata:a,depth:c}=e.derivedCommands;l(a)&&(e=i.pickingMetadata.pickMetadataCommand,e.execute(r,n)),l(s)?(e=s.pickCommand,e.execute(r,n)):l(c)&&(e=c.depthOnlyCommand,e.execute(r,n))}function cSe(e,t,n){var i,o;return((i=t.boundingVolume)==null?void 0:i.distanceSquaredTo(n))-((o=e.boundingVolume)==null?void 0:o.distanceSquaredTo(n))}function nxt(e,t,n){var i,o;return((i=e.boundingVolume)==null?void 0:i.distanceSquaredTo(n))-((o=t.boundingVolume)==null?void 0:o.distanceSquaredTo(n))+W.EPSILON12}function ixt(e,t,n,i,o){T0(i,cSe,e.camera.positionWC),l(o)&&t(o.unclassifiedCommand,e,n);for(let r=0;r<i.length;++r)t(i[r],e,n)}function oxt(e,t,n,i,o){T0(i,nxt,e.camera.positionWC),l(o)&&t(o.unclassifiedCommand,e,n);for(let r=0;r<i.length;++r)t(i[r],e,n)}function rxt(e,t,n){e.context.uniformState.updatePass(Ge.VOXELS);let i=n.commands[Ge.VOXELS];i.length=n.indices[Ge.VOXELS],T0(i,cSe,e.camera.positionWC);for(let o=0;o<i.length;++o)yp(i[o],e,t)}var sxt=new Gi,axt=new yl,cxt=new ln,lxt=new Mr;function dxt(e){let{frustum:t}=e;return l(t.fov)?t.clone(sxt):l(t.infiniteProjectionMatrix)?t.clone(axt):l(t.width)?t.clone(cxt):t.clone(lxt)}function uxt(e){if(e._environmentState.useOIT){if(!l(e._executeOITFunction)){let{view:t,context:n}=e;e._executeOITFunction=function(i,o,r,s,a){t.globeDepth.prepareColorTextures(n),t.oit.executeCommands(i,o,r,s,a)}}return e._executeOITFunction}return e.frameState.passes.render?ixt:oxt}function mxt(e,t,n){let{frameState:i,context:o}=e,{pick:r,pickVoxel:s}=i.passes,a=r||s,c;!a&&e._environmentState.useInvertClassification&&i.invertClassificationColor.alpha<1&&(c=e._invertClassification);let d=uxt(e);o.uniformState.updatePass(Ge.TRANSLUCENT);let u=n.commands[Ge.TRANSLUCENT];u.length=n.indices[Ge.TRANSLUCENT],d(e,yp,t,u,c)}function hxt(e,t,n){let{translucentTileClassification:i,globeDepth:o}=e._view;if(!(n.indices[Ge.CESIUM_3D_TILE_CLASSIFICATION]>0)||!i.isSupported())return;let s=n.commands[Ge.TRANSLUCENT];i.executeTranslucentCommands(e,yp,t,s,o.depthStencilTexture),i.executeClassificationCommands(e,yp,t,n)}function i7(e,t){let{camera:n,context:i,frameState:o}=e,{uniformState:r}=i;r.updateCamera(n);let s=dxt(n);s.near=n.frustum.near,s.far=n.frustum.far;let a=o.passes,c=a.pick||a.pickVoxel;c||fxt(e,t);let{clearGlobeDepth:d,renderTranslucentDepthForPick:u,useDepthPlane:h,useGlobeDepthFramebuffer:p,useInvertClassification:g,usePostProcessSelected:f}=e._environmentState,{globeDepth:x,globeTranslucencyFramebuffer:_,sceneFramebuffer:C,frustumCommandsList:V}=e._view,L=V.length,R=e._globeTranslucencyState,G=e._depthClearCommand,I=e._stencilClearCommand,v=e._classificationStencilClearCommand,P=e._depthPlane,w=n.position.z;function A(Z,E){r.updatePass(E);let X=Z.commands[E],F=Z.indices[E];for(let N=0;N<F;++N)yp(X[N],e,t);return F}function b(Z,E){r.updatePass(E);let X=Z.commands[E],F=Z.indices[E];for(let N=0;N<F;++N)rSe(X[N],e,t)}for(let Z=0;Z<L;++Z){let E=L-Z-1,X=V[E];e.mode===oe.SCENE2D?(n.position.z=w-X.near+1,s.far=Math.max(1,X.far-X.near),s.near=1,r.update(o),r.updateFrustum(s)):(s.near=E!==0?X.near*e.opaqueFrustumNearOffset:X.near,s.far=X.far,r.updateFrustum(s)),G.execute(i,t),i.stencilBuffer&&I.execute(i,t),R.translucent?(r.updatePass(Ge.GLOBE),R.executeGlobeCommands(X,yp,_,e,t)):A(X,Ge.GLOBE),p&&x.executeCopyDepth(i,t),u||(R.translucent?(r.updatePass(Ge.TERRAIN_CLASSIFICATION),R.executeGlobeClassificationCommands(X,yp,_,e,t)):A(X,Ge.TERRAIN_CLASSIFICATION)),d&&(G.execute(i,t),h&&P.execute(i,t));let F;if(!g||c||u)F=A(X,Ge.CESIUM_3D_TILE),F>0&&(p&&(x.prepareColorTextures(i,d),x.executeUpdateDepth(i,t,x.depthStencilTexture)),u||(F=A(X,Ge.CESIUM_3D_TILE_CLASSIFICATION)));else{e._invertClassification.clear(i,t);let O=t.framebuffer;t.framebuffer=e._invertClassification._fbo.framebuffer,F=A(X,Ge.CESIUM_3D_TILE),p&&(e._invertClassification.prepareTextures(i),x.executeUpdateDepth(i,t,e._invertClassification._fbo.getDepthStencilTexture())),F=A(X,Ge.CESIUM_3D_TILE_CLASSIFICATION_IGNORE_SHOW),t.framebuffer=O,e._invertClassification.executeClassified(i,t),o.invertClassificationColor.alpha===1&&e._invertClassification.executeUnclassified(i,t),F>0&&i.stencilBuffer&&v.execute(i,t),F=A(X,Ge.CESIUM_3D_TILE_CLASSIFICATION)}if(F>0&&i.stencilBuffer&&I.execute(i,t),rxt(e,t,X),A(X,Ge.OPAQUE),E!==0&&e.mode!==oe.SCENE2D&&(s.near=X.near,r.updateFrustum(s)),mxt(e,t,X),hxt(e,t,X),i.depthTexture&&e.useDepthPicking&&(p||u)){let O=e._picking.getPickDepth(e,E);O.update(i,x.depthStencilTexture),O.executeCopyDepth(i,t)}if(c||!f)continue;let N=t.framebuffer;t.framebuffer=C.getIdFramebuffer(),s.near=E!==0?X.near*e.opaqueFrustumNearOffset:X.near,s.far=X.far,r.updateFrustum(s),R.translucent?(r.updatePass(Ge.GLOBE),R.executeGlobeCommands(X,rSe,_,e,t)):b(X,Ge.GLOBE),d&&(G.framebuffer=t.framebuffer,G.execute(i,t),G.framebuffer=void 0),d&&h&&P.execute(i,t),b(X,Ge.CESIUM_3D_TILE),b(X,Ge.OPAQUE),b(X,Ge.TRANSLUCENT),t.framebuffer=N}}function fxt(e,t){let{context:n,environmentState:i,view:o}=e;if(n.uniformState.updatePass(Ge.ENVIRONMENT),l(i.skyBoxCommand)&&yp(i.skyBoxCommand,e,t),i.isSkyAtmosphereVisible&&yp(i.skyAtmosphereCommand,e,t),i.isSunVisible&&(i.sunDrawCommand.execute(n,t),e.sunBloom&&!i.useWebVR)){let r;i.useGlobeDepthFramebuffer?r=o.globeDepth.framebuffer:i.usePostProcess?r=o.sceneFramebuffer.framebuffer:r=i.originalFramebuffer,e._sunPostProcess.execute(n),e._sunPostProcess.copy(n,r),t.framebuffer=r}i.isMoonVisible&&i.moonCommand.execute(n,t)}function lSe(e){e.context.uniformState.updatePass(Ge.COMPUTE);let t=e._environmentState.sunComputeCommand;l(t)&&t.execute(e._computeEngine);let n=e._computeCommandList;for(let i=0;i<n.length;++i)n[i].execute(e._computeEngine)}function pxt(e,t){e.context.uniformState.updatePass(Ge.OVERLAY);let n=e.context,i=e._overlayCommandList;for(let o=0;o<i.length;++o)i[o].execute(n,t)}function bxt(e,t,n){let{shadowMapCullingVolume:i,isPointLight:o,passes:r}=n,s=r.length,a=[Ge.GLOBE,Ge.CESIUM_3D_TILE,Ge.OPAQUE,Ge.TRANSLUCENT];for(let c=0;c<t.length;++c){let d=t[c];if(e.updateDerivedCommands(d),!(!d.castShadows||a.indexOf(d.pass)<0||!e.isVisible(i,d)))if(o)for(let u=0;u<s;++u)r[u].commandList.push(d);else if(s===1)r[0].commandList.push(d);else{let u=!1;for(let h=s-1;h>=0;--h){let p=r[h].cullingVolume;if(e.isVisible(p,d))r[h].commandList.push(d),u=!0;else if(u)break}}}}function dSe(e){let{shadowState:t,commandList:n}=e.frameState,{shadowsEnabled:i,shadowMaps:o}=t;if(!i)return;let{context:r}=e,{uniformState:s}=r;for(let a=0;a<o.length;++a){let c=o[a];if(c.outOfView)continue;let{passes:d}=c;for(let u=0;u<d.length;++u)d[u].commandList.length=0;bxt(e,n,c);for(let u=0;u<d.length;++u){let h=c.passes[u],{camera:p,commandList:g}=h;s.updateCamera(p),c.updatePass(r,u);for(let f=0;f<g.length;++f){let x=g[f];s.updatePass(x.pass);let _=x.derivedCommands.shadows.castCommands[a];yp(_,e,h.passState)}}}}var gxt=new m;ui.prototype.updateAndExecuteCommands=function(e,t){Ixt(this,e,t),this._environmentState.useWebVR?yxt(this,e,t):this._frameState.mode!==oe.SCENE2D||this._mapMode2D===id.ROTATE?Hy(!0,this,e):Zxt(this,e)};function yxt(e,t){let n=e._view,i=n.camera,r=e._environmentState.renderTranslucentDepthForPick;uSe(e),n.createPotentiallyVisibleSet(e),lSe(e),r||dSe(e);let s=t.viewport;s.x=0,s.y=0,s.width=s.width*.5;let a=co.clone(i,e._cameraVR);a.frustum=i.frustum;let c=i.frustum.near,d=c*y(e.focalLength,5),u=y(e.eyeSeparation,d/30),h=m.multiplyByScalar(a.right,u*.5,gxt);i.frustum.aspectRatio=s.width/s.height;let p=.5*u*c/d;m.add(a.position,h,i.position),i.frustum.xOffset=p,i7(e,t),s.x=s.width,m.subtract(a.position,h,i.position),i.frustum.xOffset=-p,i7(e,t),co.clone(a,i)}var xxt=new he(Math.PI,W.PI_OVER_TWO),_xt=new m,Txt=new m,Sxt=new M,Cxt=new M,Vxt=new m,Lxt=new m,Rxt=new He;function Zxt(e,t){let{frameState:n,camera:i}=e,{uniformState:o}=e.context,r=t.viewport,s=He.clone(r,Rxt);t.viewport=s;let a=xxt,c=_xt;e.mapProjection.project(a,c);let u=m.clone(i.position,Txt),h=M.clone(i.transform,Cxt),p=i.frustum.clone();i._setTransform(M.IDENTITY);let g=M.computeViewportTransformation(s,0,1,Sxt),f=i.frustum.projectionMatrix,x=i.positionWC.y,_=m.fromElements(W.sign(x)*c.x-x,0,-i.positionWC.x,Vxt),C=wt.pointToGLWindowCoordinates(f,g,_,Lxt);C.x=Math.floor(C.x);let V=s.x,L=s.width;if(x===0||C.x<=V||C.x>=V+L)Hy(!0,e,t);else if(Math.abs(V+L*.5-C.x)<1)s.width=C.x-s.x,i.position.x*=W.sign(i.position.x),i.frustum.right=0,n.cullingVolume=i.frustum.computeCullingVolume(i.positionWC,i.directionWC,i.upWC),o.update(n),Hy(!0,e,t),s.x=C.x,i.position.x=-i.position.x,i.frustum.right=-i.frustum.left,i.frustum.left=0,n.cullingVolume=i.frustum.computeCullingVolume(i.positionWC,i.directionWC,i.upWC),o.update(n),Hy(!1,e,t);else if(C.x>V+L*.5){s.width=C.x-V;let R=i.frustum.right;i.frustum.right=c.x-x,n.cullingVolume=i.frustum.computeCullingVolume(i.positionWC,i.directionWC,i.upWC),o.update(n),Hy(!0,e,t),s.x=C.x,s.width=V+L-C.x,i.position.x=-i.position.x,i.frustum.left=-i.frustum.right,i.frustum.right=R-i.frustum.right*2,n.cullingVolume=i.frustum.computeCullingVolume(i.positionWC,i.directionWC,i.upWC),o.update(n),Hy(!1,e,t)}else{s.x=C.x,s.width=V+L-C.x;let R=i.frustum.left;i.frustum.left=-c.x-x,n.cullingVolume=i.frustum.computeCullingVolume(i.positionWC,i.directionWC,i.upWC),o.update(n),Hy(!0,e,t),s.x=V,s.width=C.x-V,i.position.x=-i.position.x,i.frustum.right=-i.frustum.left,i.frustum.left=R-i.frustum.left*2,n.cullingVolume=i.frustum.computeCullingVolume(i.positionWC,i.directionWC,i.upWC),o.update(n),Hy(!1,e,t)}i._setTransform(h),m.clone(u,i.position),i.frustum=p.clone(),t.viewport=r}function Hy(e,t,n){let i=t._view,{renderTranslucentDepthForPick:o}=t._environmentState;e||(t.frameState.commandList.length=0),uSe(t),i.createPotentiallyVisibleSet(t),e&&(lSe(t),o||dSe(t)),i7(t,n)}var sSe=new ps;ui.prototype.updateEnvironment=function(){let e=this._frameState,t=this._view,n=this._environmentState,i=e.passes.render,o=e.passes.offscreen,r=this.atmosphere,s=this.skyAtmosphere,a=this.globe,c=this._globeTranslucencyState;if(!i||this._mode!==oe.SCENE2D&&t.camera.frustum instanceof ln||!c.environmentVisible)n.skyAtmosphereCommand=void 0,n.skyBoxCommand=void 0,n.sunDrawCommand=void 0,n.sunComputeCommand=void 0,n.moonCommand=void 0;else{if(l(s)){if(l(a))s.setDynamicLighting(lb.fromGlobeFlags(a)),n.isReadyForAtmosphere=n.isReadyForAtmosphere||!a.show||a._surface._tilesToRender.length>0;else{let C=r.dynamicLighting;s.setDynamicLighting(C),n.isReadyForAtmosphere=!0}n.skyAtmosphereCommand=s.update(e,a),l(n.skyAtmosphereCommand)&&this.updateDerivedCommands(n.skyAtmosphereCommand)}else n.skyAtmosphereCommand=void 0;n.skyBoxCommand=l(this.skyBox)?this.skyBox.update(e,this._hdr):void 0;let _=l(this.sun)?this.sun.update(e,t.passState,this._hdr):void 0;n.sunDrawCommand=l(_)?_.drawCommand:void 0,n.sunComputeCommand=l(_)?_.computeCommand:void 0,n.moonCommand=l(this.moon)?this.moon.update(e):void 0}let d=n.clearGlobeDepth=l(a)&&a.show&&(!a.depthTestAgainstTerrain||this.mode===oe.SCENE2D);(n.useDepthPlane=d&&this.mode===oe.SCENE3D&&c.useDepthPlane)&&this._depthPlane.update(e),n.renderTranslucentDepthForPick=!1,n.useWebVR=this._useWebVR&&this.mode!==oe.SCENE2D&&!o;let h=e.mode===oe.SCENE3D&&!c.sunVisibleThroughGlobe?e.occluder:void 0,p=e.cullingVolume,g=sSe.planes;for(let _=0;_<5;++_)g[_]=p.planes[_];p=sSe,n.isSkyAtmosphereVisible=l(n.skyAtmosphereCommand)&&n.isReadyForAtmosphere,n.isSunVisible=this.isVisible(p,n.sunDrawCommand,h),n.isMoonVisible=this.isVisible(p,n.moonCommand,h);let f=this.specularEnvironmentMaps,x=this._specularEnvironmentCubeMap;l(f)&&(x==null?void 0:x.url)!==f?(x=x&&x.destroy(),this._specularEnvironmentCubeMap=new Hm(f)):!l(f)&&l(x)&&(x.destroy(),this._specularEnvironmentCubeMap=void 0),l(this._specularEnvironmentCubeMap)&&this._specularEnvironmentCubeMap.update(e)};function Gxt(e){let t=e._frameState;e.debugShowFrustumPlanes!==e._debugShowFrustumPlanes&&(e.debugShowFrustumPlanes?e._debugFrustumPlanes=new ap({camera:e.camera,updateOnChange:!1,frustumSplits:t.frustumSplits}):e._debugFrustumPlanes=e._debugFrustumPlanes&&e._debugFrustumPlanes.destroy(),e._debugShowFrustumPlanes=e.debugShowFrustumPlanes),l(e._debugFrustumPlanes)&&e._debugFrustumPlanes.update(t)}function Ext(e){let t=e._frameState,{passes:n,shadowState:i,shadowMaps:o}=t,r=o.length,s=r>0&&!n.pick&&!n.pickVoxel&&e.mode===oe.SCENE3D;if(s!==i.shadowsEnabled&&(++i.lastDirtyTime,i.shadowsEnabled=s),i.lightShadowsEnabled=!1,!!s){for(let a=0;a<r;++a)if(o[a]!==i.shadowMaps[a]){++i.lastDirtyTime;break}i.shadowMaps.length=0,i.lightShadowMaps.length=0;for(let a=0;a<r;++a){let c=o[a];c.update(t),i.shadowMaps.push(c),c.fromLightSource&&(i.lightShadowMaps.push(c),i.lightShadowsEnabled=!0),c.dirty&&(++i.lastDirtyTime,c.dirty=!1)}}}function uSe(e){let t=e._frameState;e._groundPrimitives.update(t),e._primitives.update(t),Gxt(e),Ext(e),e._globe&&e._globe.render(t)}function Ixt(e,t,n){let i=e._context,o=e._frameState,r=e._environmentState,s=e._view,a=o.passes,c=a.pick||a.pickVoxel;l(s.globeDepth)&&(s.globeDepth.picking=c);let d=r.useWebVR;r.originalFramebuffer=t.framebuffer,l(e.sun)&&e.sunBloom!==e._sunBloom?(e.sunBloom&&!d?e._sunPostProcess=new vA:l(e._sunPostProcess)&&(e._sunPostProcess=e._sunPostProcess.destroy()),e._sunBloom=e.sunBloom):!l(e.sun)&&l(e._sunPostProcess)&&(e._sunPostProcess=e._sunPostProcess.destroy(),e._sunBloom=!1);let u=e._clearColorCommand;B.clone(n,u.color),u.execute(i,t);let h=r.useGlobeDepthFramebuffer=l(s.globeDepth);h&&(s.globeDepth.update(i,t,s.viewport,e.msaaSamples,e._hdr,r.clearGlobeDepth),s.globeDepth.clear(i,t,n));let p=s.oit,g=r.useOIT=!c&&l(p)&&p.isSupported();g&&(p.update(i,t,s.globeDepth.colorFramebufferManager,e._hdr,e.msaaSamples),p.clear(i,t,n),r.useOIT=p.isSupported());let f=e.postProcessStages,x=r.usePostProcess=!c&&(e._hdr||f.length>0||f.ambientOcclusion.enabled||f.fxaa.enabled||f.bloom.enabled);if(r.usePostProcessSelected=!1,x&&(s.sceneFramebuffer.update(i,s.viewport,e._hdr,e.msaaSamples),s.sceneFramebuffer.clear(i,t,n),f.update(i,o.useLogDepth,e._hdr),f.clear(i),x=r.usePostProcess=f.ready,r.usePostProcessSelected=x&&f.hasSelected),r.isSunVisible&&e.sunBloom&&!d?(t.framebuffer=e._sunPostProcess.update(t),e._sunPostProcess.clear(i,t,n)):h?t.framebuffer=s.globeDepth.framebuffer:x&&(t.framebuffer=s.sceneFramebuffer.framebuffer),l(t.framebuffer)&&u.execute(i,t),r.useInvertClassification=!c&&l(t.framebuffer)&&e.invertClassification){let C;if(o.invertClassificationColor.alpha===1&&h&&(C=s.globeDepth.framebuffer),l(C)||i.depthTexture){if(e._invertClassification.previousFramebuffer=C,e._invertClassification.update(i,e.msaaSamples,s.globeDepth.colorFramebufferManager),e._invertClassification.clear(i,t),o.invertClassificationColor.alpha<1&&g){let V=e._invertClassification.unclassifiedCommand,L=V.derivedCommands;L.oit=p.createDerivedCommands(V,i,L.oit)}}else r.useInvertClassification=!1}e._globeTranslucencyState.translucent&&s.globeTranslucencyFramebuffer.updateAndClear(e._hdr,s.viewport,i,t)}ui.prototype.resolveFramebuffers=function(e){let t=this._context,n=this._environmentState,i=this._view,{globeDepth:o,translucentTileClassification:r}=i;l(o)&&o.prepareColorTextures(t);let{useOIT:s,useGlobeDepthFramebuffer:a,usePostProcess:c,originalFramebuffer:d}=n,u=a?o.colorFramebufferManager:void 0,h=i.sceneFramebuffer._colorFramebuffer,p=i.sceneFramebuffer.idFramebuffer;if(s&&(e.framebuffer=c?h.framebuffer:d,i.oit.execute(t,e)),r.hasTranslucentDepth&&r.isSupported()&&r.execute(this,e),c){i.sceneFramebuffer.prepareColorTextures(t);let g=h;a&&!s&&(g=u);let f=this.postProcessStages,x=g.getColorTexture(0),_=p.getColorTexture(0),C=y(u,h).getDepthStencilTexture();f.execute(t,x,C,_),f.copy(t,d)}!s&&!c&&a&&(e.framebuffer=d,o.executeCopyColor(t,e))};function Xxt(e){let t=e._frameState.afterRender;for(let n=0;n<t.length;++n)t[n]()&&e.requestRender();t.length=0}function Wxt(e){if(e.mode===oe.MORPHING)return;let t=e.camera.positionCartographic;return e.getHeight(t)}function mSe(e,t,n){let i=Number.NEGATIVE_INFINITY;if(e instanceof dl){let o=e.length;for(let r=0;r<o;++r){let s=e.get(r),a=mSe(s,t,n);l(a)&&a>i&&(i=a)}}else if(e.isCesium3DTileset&&e.show&&e.enableCollision){let o=e.getHeight(t,n);if(l(o)&&o>i)return o}return i}ui.prototype.getHeight=function(e,t){if(!l(e))return;let n=t===Ke.CLAMP_TO_TERRAIN||t===Ke.RELATIVE_TO_TERRAIN,i=t===Ke.CLAMP_TO_3D_TILE||t===Ke.RELATIVE_TO_3D_TILE;if(!l(e))return;let o=Number.NEGATIVE_INFINITY;if(!n){let s=mSe(this.primitives,e,this);l(s)&&s>o&&(o=s)}let r=this._globe;if(!i&&l(r)&&r.show){let s=r.getHeight(e);s>o&&(o=s)}if(o>Number.NEGATIVE_INFINITY)return o};var n7=new he;ui.prototype.updateHeight=function(e,t,n){let i=()=>{he.clone(e,n7);let g=this.getHeight(e,n);l(g)&&(n7.height=g,t(n7))},o=n===Ke.CLAMP_TO_TERRAIN||n===Ke.RELATIVE_TO_TERRAIN,r=n===Ke.CLAMP_TO_3D_TILE||n===Ke.RELATIVE_TO_3D_TILE,s;!r&&l(this.globe)&&(s=this.globe._surface.updateHeight(e,i));let a={},c=this._ellipsoid,d=g=>{if(o||g.isDestroyed()||!g.isCesium3DTileset)return;let f=g.updateHeight(e,i,c);a[g.id]=f};if(!o){let g=this.primitives.length;for(let f=0;f<g;++f){let x=this.primitives.get(f);d(x)}}let u=this.primitives.primitiveAdded.addEventListener(d),h=this.primitives.primitiveRemoved.addEventListener(g=>{g.isDestroyed()||!g.isCesium3DTileset||(l(a[g.id])&&a[g.id](),delete a[g.id])});return()=>{s=s&&s(),Object.values(a).forEach(g=>g()),a={},u(),h()}};function Pxt(e){let t=e.camera,n=e._mode,i=e._screenSpaceCameraController,o=t.positionCartographic;if(!l(o))return!1;if(!i.onMap()&&o.height<0)return!0;if(n===oe.SCENE2D||n===oe.MORPHING)return!1;let r=e._globeHeight;return l(r)&&o.height<r}ui.prototype.initializeFrame=function(){if(this._shaderFrameCount++===120&&(this._shaderFrameCount=0,this._context.shaderCache.destroyReleasedShaderPrograms(),this._context.textureCache.destroyReleasedTextures()),this._tweens.update(),this._globeHeightDirty){l(this._removeUpdateHeightCallback)&&(this._removeUpdateHeightCallback(),this._removeUpdateHeightCallback=void 0),this._globeHeight=Wxt(this),this._globeHeightDirty=!1;let e=this.camera.positionCartographic;this._removeUpdateHeightCallback=this.updateHeight(e,t=>{this.isDestroyed()||(this._globeHeight=t.height)})}this._cameraUnderground=Pxt(this),this._globeTranslucencyState.update(this),this._screenSpaceCameraController.update(),l(this._deviceOrientationCameraController)&&this._deviceOrientationCameraController.update(),this.camera.update(this._mode),this.camera._updateCameraChanged()};function vxt(e,t){if(e.debugShowFramesPerSecond){if(!l(e._performanceDisplay)){let n=document.createElement("div");n.className="cesium-performanceDisplay-defaultContainer",e._canvas.parentNode.appendChild(n);let o=new S0({container:n});e._performanceDisplay=o,e._performanceContainer=n}e._performanceDisplay.throttled=e.requestRenderMode,e._performanceDisplay.update(t)}else l(e._performanceDisplay)&&(e._performanceDisplay=e._performanceDisplay&&e._performanceDisplay.destroy(),e._performanceContainer.parentNode.removeChild(e._performanceContainer))}function wxt(e){e._jobScheduler.resetBudgets();let t=e._frameState;e.primitives.prePassesUpdate(t),l(e.globe)&&e.globe.update(t),e._picking.update(),t.creditDisplay.update()}function Fxt(e){e.primitives.postPassesUpdate(e._frameState),ic.update()}var Axt=new B;function Mxt(e){let t=e._frameState,n=e.context,{uniformState:i}=n,o=e._defaultView;e._view=o,e.updateFrameState(),t.passes.render=!0,t.passes.postProcess=e.postProcessStages.hasSelected,t.tilesetPassState=qyt;let r=y(e.backgroundColor,B.BLACK);e._hdr&&(r=B.clone(r,Axt),r.red=Math.pow(r.red,e.gamma),r.green=Math.pow(r.green,e.gamma),r.blue=Math.pow(r.blue,e.gamma)),t.backgroundColor=r,t.atmosphere=e.atmosphere,e.fog.update(t),i.update(t);let s=e.shadowMap;l(s)&&s.enabled&&(!l(e.light)||e.light instanceof h0?m.negate(i.sunDirectionWC,e._shadowMapCamera.direction):m.clone(e.light.direction,e._shadowMapCamera.direction),t.shadowMaps.push(s)),e._computeCommandList.length=0,e._overlayCommandList.length=0;let a=o.viewport;a.x=0,a.y=0,a.width=n.drawingBufferWidth,a.height=n.drawingBufferHeight;let c=o.passState;c.framebuffer=void 0,c.blendingEnabled=void 0,c.scissorTest=void 0,c.viewport=He.clone(a,c.viewport),l(e.globe)&&e.globe.beginFrame(t),e.updateEnvironment(),e.updateAndExecuteCommands(c,r),e.resolveFramebuffers(c),c.framebuffer=void 0,pxt(e,c),l(e.globe)&&(e.globe.endFrame(t),e.globe.tilesLoaded||(e._renderRequested=!0)),n.endFrame()}function CS(e,t){try{t(e)}catch(n){if(e._renderError.raiseEvent(e,n),e.rethrowRenderErrors)throw n}}function Nxt(e){return e._picking.updateMostDetailedRayPicks(e)}ui.prototype.render=function(e){this._preUpdate.raiseEvent(this,e);let t=this._frameState;t.newFrame=!1,l(e)||(e=q.now());let n=this._view.checkForCameraUpdates(this);n&&(this._globeHeightDirty=!0);let i=!this.requestRenderMode||this._renderRequested||n||this._logDepthBufferDirty||this._hdrDirty||this.mode===oe.MORPHING;if(!i&&l(this.maximumRenderTimeChange)&&l(this._lastRenderTime)){let o=Math.abs(q.secondsDifference(this._lastRenderTime,e));i=i||o>this.maximumRenderTimeChange}if(i){this._lastRenderTime=q.clone(e,this._lastRenderTime),this._renderRequested=!1,this._logDepthBufferDirty=!1,this._hdrDirty=!1;let o=W.incrementWrap(t.frameNumber,15e6,1);aSe(this,o,e),t.newFrame=!0}CS(this,wxt),this.primitives.show&&(CS(this,Nxt),CS(this,kxt),CS(this,Uxt),i||CS(this,Dxt)),this._postUpdate.raiseEvent(this,e),i&&(this._preRender.raiseEvent(this,e),t.creditDisplay.beginFrame(),CS(this,Mxt)),vxt(this,i),CS(this,Fxt),Xxt(this),i&&(this._postRender.raiseEvent(this,e),t.creditDisplay.endFrame())};ui.prototype.forceRender=function(e){this._renderRequested=!0,this.render(e)};ui.prototype.requestRender=function(){this._renderRequested=!0};ui.prototype.clampLineWidth=function(e){return Math.max(Mt.minimumAliasedLineWidth,Math.min(e,Mt.maximumAliasedLineWidth))};ui.prototype.pick=function(e,t,n){return this._picking.pick(this,e,t,n)};ui.prototype.pickVoxel=function(e,t,n){let i=this.pick(e,t,n);if(!l(i))return;let o=i.primitive;if(!(o instanceof Yy))return;let r=this._picking.pickVoxelCoordinate(this,e,t,n),s=255*r[0]+r[1],a=o._traversal.findKeyframeNode(s);if(!l(a))return;let c=255*r[2]+r[3];return AA.fromKeyframeNode(o,s,c,a)};ui.prototype.pickMetadata=function(e,t,n,i){var h,p;let o=this.pick(e);if(!l(o))return;let r=(p=(h=o.detail)==null?void 0:h.model)==null?void 0:p.structuralMetadata;if(!l(r))return;let s=r.schema,a=lM(s,t,n,i);if(!l(a))return;let c=uM(r,n,i);if(!l(c))return;let d=new dM(t,n,i,a,c);return this._picking.pickMetadata(this,e,d)};ui.prototype.pickMetadataSchema=function(e){var i,o,r;let t=this.pick(e);return l(t)?(r=(o=(i=t.detail)==null?void 0:i.model)==null?void 0:o.structuralMetadata)==null?void 0:r.schema:void 0};ui.prototype.pickPositionWorldCoordinates=function(e,t){return this._picking.pickPositionWorldCoordinates(this,e,t)};ui.prototype.pickPosition=function(e,t){return this._picking.pickPosition(this,e,t)};ui.prototype.drillPick=function(e,t,n,i){return this._picking.drillPick(this,e,t,n,i)};function kxt(e){let t=e._frameState;$8.camera=t.camera,$8.cullingVolume=t.cullingVolume,e.primitives.updateForPass(t,$8)}function Uxt(e){let t=e._frameState;if(!t.camera.canPreloadFlight())return;e7.camera=e.preloadFlightCamera,e7.cullingVolume=e.preloadFlightCullingVolume,e.primitives.updateForPass(t,e7)}function Dxt(e){e.primitives.updateForPass(e._frameState,$yt)}ui.prototype.pickFromRay=function(e,t,n){return this._picking.pickFromRay(this,e,t,n)};ui.prototype.drillPickFromRay=function(e,t,n,i){return this._picking.drillPickFromRay(this,e,t,n,i)};ui.prototype.pickFromRayMostDetailed=function(e,t,n){return this._picking.pickFromRayMostDetailed(this,e,t,n)};ui.prototype.drillPickFromRayMostDetailed=function(e,t,n,i){return this._picking.drillPickFromRayMostDetailed(this,e,t,n,i)};ui.prototype.sampleHeight=function(e,t,n){return this._picking.sampleHeight(this,e,t,n)};ui.prototype.clampToHeight=function(e,t,n,i){return this._picking.clampToHeight(this,e,t,n,i)};ui.prototype.sampleHeightMostDetailed=function(e,t,n){return this._picking.sampleHeightMostDetailed(this,e,t,n)};ui.prototype.clampToHeightMostDetailed=function(e,t,n){return this._picking.clampToHeightMostDetailed(this,e,t,n)};ui.prototype.cartesianToCanvasCoordinates=function(e,t){return Bi.worldToWindowCoordinates(this,e,t)};ui.prototype.completeMorph=function(){this._transitioner.completeMorph()};ui.prototype.morphTo2D=function(e){e=y(e,2),this._transitioner.morphTo2D(e,this._ellipsoid)};ui.prototype.morphToColumbusView=function(e){e=y(e,2),this._transitioner.morphToColumbusView(e,this._ellipsoid)};ui.prototype.morphTo3D=function(e){e=y(e,2),this._transitioner.morphTo3D(e,this._ellipsoid)};function Bxt(e,t){if(e._removeTerrainProviderReadyListener=e._removeTerrainProviderReadyListener&&e._removeTerrainProviderReadyListener(),t.ready){l(e.globe)&&(e.globe.terrainProvider=t.provider);return}e.globe.terrainProvider=void 0,e._removeTerrainProviderReadyListener=t.readyEvent.addEventListener(n=>{l(e)&&l(e.globe)&&(e.globe.terrainProvider=n),e._removeTerrainProviderReadyListener()})}ui.prototype.setTerrain=function(e){return Bxt(this,e),e};ui.prototype.isDestroyed=function(){return!1};ui.prototype.destroy=function(){this._tweens.removeAll(),this._computeEngine=this._computeEngine&&this._computeEngine.destroy(),this._screenSpaceCameraController=this._screenSpaceCameraController&&this._screenSpaceCameraController.destroy(),this._deviceOrientationCameraController=this._deviceOrientationCameraController&&!this._deviceOrientationCameraController.isDestroyed()&&this._deviceOrientationCameraController.destroy(),this._primitives=this._primitives&&this._primitives.destroy(),this._groundPrimitives=this._groundPrimitives&&this._groundPrimitives.destroy(),this._globe=this._globe&&this._globe.destroy(),this._removeTerrainProviderReadyListener=this._removeTerrainProviderReadyListener&&this._removeTerrainProviderReadyListener(),this.skyBox=this.skyBox&&this.skyBox.destroy(),this.skyAtmosphere=this.skyAtmosphere&&this.skyAtmosphere.destroy(),this._debugSphere=this._debugSphere&&this._debugSphere.destroy(),this.sun=this.sun&&this.sun.destroy(),this._sunPostProcess=this._sunPostProcess&&this._sunPostProcess.destroy(),this._depthPlane=this._depthPlane&&this._depthPlane.destroy(),this._transitioner=this._transitioner&&this._transitioner.destroy(),this._debugFrustumPlanes=this._debugFrustumPlanes&&this._debugFrustumPlanes.destroy(),this._brdfLutGenerator=this._brdfLutGenerator&&this._brdfLutGenerator.destroy(),this._picking=this._picking&&this._picking.destroy(),this._defaultView=this._defaultView&&this._defaultView.destroy(),this._view=void 0,this._removeCreditContainer&&this._canvas.parentNode.removeChild(this._creditContainer),this.postProcessStages=this.postProcessStages&&this.postProcessStages.destroy(),this._context=this._context&&this._context.destroy(),this._frameState.creditDisplay=this._frameState.creditDisplay&&this._frameState.creditDisplay.destroy(),l(this._performanceDisplay)&&(this._performanceDisplay=this._performanceDisplay&&this._performanceDisplay.destroy(),this._performanceContainer.parentNode.removeChild(this._performanceContainer)),this._removeRequestListenerCallback(),this._removeTaskProcessorListenerCallback();for(let e=0;e<this._removeGlobeCallbacks.length;++e)this._removeGlobeCallbacks[e]();return this._removeGlobeCallbacks.length=0,l(this._removeUpdateHeightCallback)&&(this._removeUpdateHeightCallback(),this._removeUpdateHeightCallback=void 0),me(this)};var mM=ui;var eKi=T(S(),1);var Vzi=T(S(),1),EL=`float interpolateByDistance(vec4 nearFarScalar, float distance) { float startDistance = nearFarScalar.x; float startValue = nearFarScalar.y; float endDistance = nearFarScalar.z; float endValue = nearFarScalar.w; float t = clamp((distance - startDistance) / (endDistance - startDistance), 0.0, 1.0); return mix(startValue, endValue, t); } void computeAtmosphereScattering(vec3 positionWC, vec3 lightDirection, out vec3 rayleighColor, out vec3 mieColor, out float opacity, out float underTranslucentGlobe) { float ellipsoidRadiiDifference = czm_ellipsoidRadii.x - czm_ellipsoidRadii.z; // Adjustment to the atmosphere radius applied based on the camera height. float distanceAdjustMin = czm_ellipsoidRadii.x / 4.0; float distanceAdjustMax = czm_ellipsoidRadii.x; float distanceAdjustModifier = ellipsoidRadiiDifference / 2.0; float distanceAdjust = distanceAdjustModifier * clamp((czm_eyeHeight - distanceAdjustMin) / (distanceAdjustMax - distanceAdjustMin), 0.0, 1.0); // Since atmosphere scattering assumes the atmosphere is a spherical shell, we compute an inner radius of the atmosphere best fit // for the position on the ellipsoid. float radiusAdjust = (ellipsoidRadiiDifference / 4.0) + distanceAdjust; float atmosphereInnerRadius = (length(czm_viewerPositionWC) - czm_eyeHeight) - radiusAdjust; // Setup the primary ray: from the camera position to the vertex position. vec3 cameraToPositionWC = positionWC - czm_viewerPositionWC; vec3 cameraToPositionWCDirection = normalize(cameraToPositionWC); czm_ray primaryRay = czm_ray(czm_viewerPositionWC, cameraToPositionWCDirection); underTranslucentGlobe = 0.0; // Brighten the sky atmosphere under the Earth's atmosphere when translucency is enabled. #if defined(GLOBE_TRANSLUCENT) // Check for intersection with the inner radius of the atmopshere. czm_raySegment primaryRayEarthIntersect = czm_raySphereIntersectionInterval(primaryRay, vec3(0.0), atmosphereInnerRadius + radiusAdjust); if (primaryRayEarthIntersect.start > 0.0 && primaryRayEarthIntersect.stop > 0.0) { // Compute position on globe. vec3 direction = normalize(positionWC); czm_ray ellipsoidRay = czm_ray(positionWC, -direction); czm_raySegment ellipsoidIntersection = czm_rayEllipsoidIntersectionInterval(ellipsoidRay, vec3(0.0), czm_ellipsoidInverseRadii); vec3 onEarth = positionWC - (direction * ellipsoidIntersection.start); // Control the color using the camera angle. float angle = dot(normalize(czm_viewerPositionWC), normalize(onEarth)); // Control the opacity using the distance from Earth. opacity = interpolateByDistance(vec4(0.0, 1.0, czm_ellipsoidRadii.x, 0.0), length(czm_viewerPositionWC - onEarth)); vec3 horizonColor = vec3(0.1, 0.2, 0.3); vec3 nearColor = vec3(0.0); rayleighColor = mix(nearColor, horizonColor, exp(-angle) * opacity); // Set the traslucent flag to avoid alpha adjustment in computeFinalColor funciton. underTranslucentGlobe = 1.0; return; } #endif computeScattering( primaryRay, length(cameraToPositionWC), lightDirection, atmosphereInnerRadius, rayleighColor, mieColor, opacity ); // Alter the opacity based on how close the viewer is to the ground. // (0.0 = At edge of atmosphere, 1.0 = On ground) float cameraHeight = czm_eyeHeight + atmosphereInnerRadius; float atmosphereOuterRadius = atmosphereInnerRadius + ATMOSPHERE_THICKNESS; opacity = clamp((atmosphereOuterRadius - cameraHeight) / (atmosphereOuterRadius - atmosphereInnerRadius), 0.0, 1.0); // Alter alpha based on time of day (0.0 = night , 1.0 = day) float nightAlpha = (u_radiiAndDynamicAtmosphereColor.z != 0.0) ? clamp(dot(normalize(positionWC), lightDirection), 0.0, 1.0) : 1.0; opacity *= pow(nightAlpha, 0.5); } `;var Rzi=T(S(),1),hM=`in vec3 v_outerPositionWC; uniform vec3 u_hsbShift; #ifndef PER_FRAGMENT_ATMOSPHERE in vec3 v_mieColor; in vec3 v_rayleighColor; in float v_opacity; in float v_translucent; #endif void main (void) { float lightEnum = u_radiiAndDynamicAtmosphereColor.z; vec3 lightDirection = czm_getDynamicAtmosphereLightDirection(v_outerPositionWC, lightEnum); vec3 mieColor; vec3 rayleighColor; float opacity; float translucent; #ifdef PER_FRAGMENT_ATMOSPHERE computeAtmosphereScattering( v_outerPositionWC, lightDirection, rayleighColor, mieColor, opacity, translucent ); #else mieColor = v_mieColor; rayleighColor = v_rayleighColor; opacity = v_opacity; translucent = v_translucent; #endif vec4 color = computeAtmosphereColor(v_outerPositionWC, lightDirection, rayleighColor, mieColor, opacity); #ifndef HDR color.rgb = czm_pbrNeutralTonemapping(color.rgb); color.rgb = czm_inverseGamma(color.rgb); #endif #ifdef COLOR_CORRECT const bool ignoreBlackPixels = true; color.rgb = czm_applyHSBShift(color.rgb, u_hsbShift, ignoreBlackPixels); #endif // For the parts of the sky atmosphere that are not behind a translucent globe, // we mix in the default opacity so that the sky atmosphere still appears at distance. // This is needed because the opacity in the sky atmosphere is initially adjusted based // on the camera height. if (translucent == 0.0) { color.a = mix(color.b, 1.0, color.a) * smoothstep(0.0, 1.0, czm_morphTime); } out_FragColor = color; } `;var Gzi=T(S(),1),fM=`in vec4 position; out vec3 v_outerPositionWC; #ifndef PER_FRAGMENT_ATMOSPHERE out vec3 v_mieColor; out vec3 v_rayleighColor; out float v_opacity; out float v_translucent; #endif void main(void) { vec4 positionWC = czm_model * position; float lightEnum = u_radiiAndDynamicAtmosphereColor.z; vec3 lightDirection = czm_getDynamicAtmosphereLightDirection(positionWC.xyz, lightEnum); #ifndef PER_FRAGMENT_ATMOSPHERE computeAtmosphereScattering( positionWC.xyz, lightDirection, v_rayleighColor, v_mieColor, v_opacity, v_translucent ); #endif v_outerPositionWC = positionWC.xyz; gl_Position = czm_modelViewProjection * position; } `;function IL(e){e=y(e,ne.WGS84),this.show=!0,this.perFragmentAtmosphere=!1,this._ellipsoid=e;let t=1.025,n=m.multiplyByScalar(e.radii,t,new m);this._scaleMatrix=M.fromScale(n),this._modelMatrix=new M,this._command=new $e({owner:this,modelMatrix:this._modelMatrix}),this._spSkyFromSpace=void 0,this._spSkyFromAtmosphere=void 0,this._flags=void 0,this.atmosphereLightIntensity=50,this.atmosphereRayleighCoefficient=new m(55e-7,13e-6,284e-7),this.atmosphereMieCoefficient=new m(21e-6,21e-6,21e-6),this.atmosphereRayleighScaleHeight=1e4,this.atmosphereMieScaleHeight=3200,this.atmosphereMieAnisotropy=.9,this.hueShift=0,this.saturationShift=0,this.brightnessShift=0,this._hueSaturationBrightness=new m;let i=new m;i.x=e.maximumRadius*t,i.y=e.maximumRadius,i.z=0,this._radiiAndDynamicAtmosphereColor=i;let o=this;this._command.uniformMap={u_radiiAndDynamicAtmosphereColor:function(){return o._radiiAndDynamicAtmosphereColor},u_hsbShift:function(){return o._hueSaturationBrightness.x=o.hueShift,o._hueSaturationBrightness.y=o.saturationShift,o._hueSaturationBrightness.z=o.brightnessShift,o._hueSaturationBrightness},u_atmosphereLightIntensity:function(){return o.atmosphereLightIntensity},u_atmosphereRayleighCoefficient:function(){return o.atmosphereRayleighCoefficient},u_atmosphereMieCoefficient:function(){return o.atmosphereMieCoefficient},u_atmosphereRayleighScaleHeight:function(){return o.atmosphereRayleighScaleHeight},u_atmosphereMieScaleHeight:function(){return o.atmosphereMieScaleHeight},u_atmosphereMieAnisotropy:function(){return o.atmosphereMieAnisotropy}}}Object.defineProperties(IL.prototype,{ellipsoid:{get:function(){return this._ellipsoid}}});IL.prototype.setDynamicLighting=function(e){this._radiiAndDynamicAtmosphereColor.z=e};var o7=new M;IL.prototype.update=function(e,t){if(!this.show)return;let n=e.mode;if(n!==oe.SCENE3D&&n!==oe.MORPHING||!e.passes.render)return;let i=M.fromRotationTranslation(e.context.uniformState.inverseViewRotation,m.ZERO,o7),o=M.multiplyTransformation(i,wo.Y_UP_TO_Z_UP,o7),r=M.multiply(this._scaleMatrix,o,o7);M.clone(r,this._modelMatrix);let s=e.context,a=Oxt(this),c=e.globeTranslucencyState.translucent,d=this.perFragmentAtmosphere||c||!l(t)||!t.show,u=this._command;if(!l(u.vertexArray)){let p=ta.createGeometry(new ta({radii:new m(1,1,1),slicePartitions:256,stackPartitions:256,vertexFormat:Xe.POSITION_ONLY}));u.vertexArray=oi.fromGeometry({context:s,geometry:p,attributeLocations:Nn.createAttributeLocations(p),bufferUsage:ke.STATIC_DRAW}),u.renderState=Ue.fromCache({cull:{enabled:!0,face:_i.FRONT},blending:hn.ALPHA_BLEND,depthMask:!1})}let h=a|d<<2|c<<3;if(h!==this._flags){this._flags=h;let p=[];a&&p.push("COLOR_CORRECT"),d&&p.push("PER_FRAGMENT_ATMOSPHERE"),c&&p.push("GLOBE_TRANSLUCENT");let g=new De({defines:p,sources:[th,EL,fM]}),f=new De({defines:p,sources:[th,EL,hM]});this._spSkyAtmosphere=en.fromCache({context:s,vertexShaderSource:g,fragmentShaderSource:f}),u.shaderProgram=this._spSkyAtmosphere}return u};function Oxt(e){return!(W.equalsEpsilon(e.hueShift,0,W.EPSILON7)&&W.equalsEpsilon(e.saturationShift,0,W.EPSILON7)&&W.equalsEpsilon(e.brightnessShift,0,W.EPSILON7))}IL.prototype.isDestroyed=function(){return!1};IL.prototype.destroy=function(){let e=this._command;return e.vertexArray=e.vertexArray&&e.vertexArray.destroy(),this._spSkyAtmosphere=this._spSkyAtmosphere&&this._spSkyAtmosphere.destroy(),me(this)};var pM=IL;var ZKi=T(S(),1);var nKi=T(S(),1),bM=`uniform samplerCube u_cubeMap; in vec3 v_texCoord; void main() { vec4 color = czm_textureCube(u_cubeMap, normalize(v_texCoord)); out_FragColor = vec4(czm_gammaCorrect(color).rgb, czm_morphTime); } `;var oKi=T(S(),1),gM=`in vec3 position; out vec3 v_texCoord; void main() { vec3 p = czm_viewRotation * (czm_temeToPseudoFixed * (czm_entireFrustum.y * position)); gl_Position = czm_projection * vec4(p, 1.0); v_texCoord = position.xyz; } `;function WL(e){this.sources=e.sources,this._sources=void 0,this.show=y(e.show,!0),this._command=new $e({modelMatrix:M.clone(M.IDENTITY),owner:this}),this._cubeMap=void 0,this._attributeLocations=void 0,this._useHdr=void 0,this._hasError=!1,this._error=void 0}WL.prototype.update=function(e,t){let n=this,{mode:i,passes:o,context:r}=e;if(!this.show||i!==oe.SCENE3D&&i!==oe.MORPHING||!o.render)return;if(this._hasError){let a=this._error;throw this._hasError=!1,this._error=void 0,a}if(this._sources!==this.sources){this._sources=this.sources;let a=this.sources;typeof a.positiveX=="string"?vw(r,this._sources).then(function(c){n._cubeMap=n._cubeMap&&n._cubeMap.destroy(),n._cubeMap=c}).catch(c=>{this._hasError=!0,this._error=c}):(this._cubeMap=this._cubeMap&&this._cubeMap.destroy(),this._cubeMap=new Tr({context:r,source:a}))}let s=this._command;if(!l(s.vertexArray)){s.uniformMap={u_cubeMap:function(){return n._cubeMap}};let a=va.createGeometry(va.fromDimensions({dimensions:new m(2,2,2),vertexFormat:Xe.POSITION_ONLY})),c=this._attributeLocations=Nn.createAttributeLocations(a);s.vertexArray=oi.fromGeometry({context:r,geometry:a,attributeLocations:c,bufferUsage:ke.STATIC_DRAW}),s.renderState=Ue.fromCache({blending:hn.ALPHA_BLEND})}if(!l(s.shaderProgram)||this._useHdr!==t){let a=new De({defines:[t?"HDR":""],sources:[bM]});s.shaderProgram=en.fromCache({context:r,vertexShaderSource:gM,fragmentShaderSource:a,attributeLocations:this._attributeLocations}),this._useHdr=t}if(l(this._cubeMap))return s};WL.prototype.isDestroyed=function(){return!1};WL.prototype.destroy=function(){let e=this._command;return e.vertexArray=e.vertexArray&&e.vertexArray.destroy(),e.shaderProgram=e.shaderProgram&&e.shaderProgram.destroy(),this._cubeMap=this._cubeMap&&this._cubeMap.destroy(),me(this)};function XL(e){return on(`Assets/Textures/SkyBox/tycho2t3_80_${e}.jpg`)}WL.createEarthSkyBox=function(){return new WL({sources:{positiveX:XL("px"),negativeX:XL("mx"),positiveY:XL("py"),negativeY:XL("my"),positiveZ:XL("pz"),negativeZ:XL("mz")}})};var yM=WL;var cJi=T(S(),1);var EKi=T(S(),1),xM=`uniform sampler2D u_texture; in vec2 v_textureCoordinates; void main() { vec4 color = texture(u_texture, v_textureCoordinates); out_FragColor = czm_gammaCorrect(color); } `;var XKi=T(S(),1),_M=`uniform float u_radiusTS; in vec2 v_textureCoordinates; vec2 rotate(vec2 p, vec2 direction) { return vec2(p.x * direction.x - p.y * direction.y, p.x * direction.y + p.y * direction.x); } vec4 addBurst(vec2 position, vec2 direction, float lengthScalar) { vec2 rotatedPosition = rotate(position, direction) * vec2(25.0, 0.75); float radius = length(rotatedPosition) * lengthScalar; float burst = 1.0 - smoothstep(0.0, 0.55, radius); return vec4(burst); } void main() { float lengthScalar = 2.0 / sqrt(2.0); vec2 position = v_textureCoordinates - vec2(0.5); float radius = length(position) * lengthScalar; float surface = step(radius, u_radiusTS); vec4 color = vec4(vec2(1.0), surface + 0.2, surface); float glow = 1.0 - smoothstep(0.0, 0.55, radius); color.ba += mix(vec2(0.0), vec2(1.0), glow) * 0.75; vec4 burst = vec4(0.0); // The following loop has been manually unrolled for speed, to // avoid sin() and cos(). // //for (float i = 0.4; i < 3.2; i += 1.047) { // vec2 direction = vec2(sin(i), cos(i)); // burst += 0.4 * addBurst(position, direction, lengthScalar); // // direction = vec2(sin(i - 0.08), cos(i - 0.08)); // burst += 0.3 * addBurst(position, direction, lengthScalar); //} burst += 0.4 * addBurst(position, vec2(0.38942, 0.92106), lengthScalar); // angle == 0.4 burst += 0.4 * addBurst(position, vec2(0.99235, 0.12348), lengthScalar); // angle == 0.4 + 1.047 burst += 0.4 * addBurst(position, vec2(0.60327, -0.79754), lengthScalar); // angle == 0.4 + 1.047 * 2.0 burst += 0.3 * addBurst(position, vec2(0.31457, 0.94924), lengthScalar); // angle == 0.4 - 0.08 burst += 0.3 * addBurst(position, vec2(0.97931, 0.20239), lengthScalar); // angle == 0.4 + 1.047 - 0.08 burst += 0.3 * addBurst(position, vec2(0.66507, -0.74678), lengthScalar); // angle == 0.4 + 1.047 * 2.0 - 0.08 // End of manual loop unrolling. color += clamp(burst, vec4(0.0), vec4(1.0)) * 0.15; out_FragColor = clamp(color, vec4(0.0), vec4(1.0)); } `;var PKi=T(S(),1),TM=`in vec2 direction; uniform float u_size; out vec2 v_textureCoordinates; void main() { vec4 position; if (czm_morphTime == 1.0) { position = vec4(czm_sunPositionWC, 1.0); } else { position = vec4(czm_sunPositionColumbusView.zxy, 1.0); } vec4 positionEC = czm_view * position; vec4 positionWC = czm_eyeToWindowCoordinates(positionEC); vec2 halfSize = vec2(u_size * 0.5); halfSize *= ((direction * 2.0) - 1.0); gl_Position = czm_viewportOrthographic * vec4(positionWC.xy + halfSize, -positionWC.z, 1.0); v_textureCoordinates = direction; } `;function CM(){this.show=!0,this._drawCommand=new $e({primitiveType:Ae.TRIANGLES,boundingVolume:new de,owner:this}),this._commands={drawCommand:this._drawCommand,computeCommand:void 0},this._boundingVolume=new de,this._boundingVolume2D=new de,this._texture=void 0,this._drawingBufferWidth=void 0,this._drawingBufferHeight=void 0,this._radiusTS=void 0,this._size=void 0,this.glowFactor=1,this._glowFactorDirty=!1,this._useHdr=void 0;let e=this;this._uniformMap={u_texture:function(){return e._texture},u_size:function(){return e._size}}}Object.defineProperties(CM.prototype,{glowFactor:{get:function(){return this._glowFactor},set:function(e){e=Math.max(e,0),this._glowFactor=e,this._glowFactorDirty=!0}}});var Yxt=new D,Hxt=new D,zxt=new re,SM=new re;CM.prototype.update=function(e,t,n){if(!this.show)return;let i=e.mode;if(i===oe.SCENE2D||i===oe.MORPHING||!e.passes.render)return;let o=e.context,r=t.viewport.width,s=t.viewport.height;if(!l(this._texture)||r!==this._drawingBufferWidth||s!==this._drawingBufferHeight||this._glowFactorDirty||n!==this._useHdr){this._texture=this._texture&&this._texture.destroy(),this._drawingBufferWidth=r,this._drawingBufferHeight=s,this._glowFactorDirty=!1,this._useHdr=n;let R=Math.max(r,s);R=Math.pow(2,Math.ceil(Math.log(R)/Math.log(2))-2),R=Math.max(1,R);let G=n?o.halfFloatingPointTexture?je.HALF_FLOAT:je.FLOAT:je.UNSIGNED_BYTE;this._texture=new Wt({context:o,width:R,height:R,pixelFormat:ot.RGBA,pixelDatatype:G}),this._glowLengthTS=this._glowFactor*5,this._radiusTS=1/(1+2*this._glowLengthTS)*.5;let I=this,v={u_radiusTS:function(){return I._radiusTS}};this._commands.computeCommand=new $c({fragmentShaderSource:_M,outputTexture:this._texture,uniformMap:v,persists:!1,owner:this,postExecute:function(){I._commands.computeCommand=void 0}})}let a=this._drawCommand;if(!l(a.vertexArray)){let R={direction:0},G=new Uint8Array(4*2);G[0]=0,G[1]=0,G[2]=255,G[3]=0,G[4]=255,G[5]=255,G[6]=0,G[7]=255;let I=St.createVertexBuffer({context:o,typedArray:G,usage:ke.STATIC_DRAW}),v=[{index:R.direction,vertexBuffer:I,componentsPerAttribute:2,normalize:!0,componentDatatype:Q.UNSIGNED_BYTE}],P=St.createIndexBuffer({context:o,typedArray:new Uint16Array([0,1,2,0,2,3]),usage:ke.STATIC_DRAW,indexDatatype:Me.UNSIGNED_SHORT});a.vertexArray=new oi({context:o,attributes:v,indexBuffer:P}),a.shaderProgram=en.fromCache({context:o,vertexShaderSource:TM,fragmentShaderSource:xM,attributeLocations:R}),a.renderState=Ue.fromCache({blending:hn.ALPHA_BLEND}),a.uniformMap=this._uniformMap}let c=o.uniformState.sunPositionWC,d=o.uniformState.sunPositionColumbusView,u=this._boundingVolume,h=this._boundingVolume2D;m.clone(c,u.center),h.center.x=d.z,h.center.y=d.x,h.center.z=d.y,u.radius=W.SOLAR_RADIUS+W.SOLAR_RADIUS*this._glowLengthTS,h.radius=u.radius,i===oe.SCENE3D?de.clone(u,a.boundingVolume):i===oe.COLUMBUS_VIEW&&de.clone(h,a.boundingVolume);let p=Bi.computeActualEllipsoidPosition(e,c,SM),g=m.magnitude(m.subtract(p,e.camera.position,SM)),f=o.uniformState.projection,x=zxt;x.x=0,x.y=0,x.z=-g,x.w=1;let _=M.multiplyByVector(f,x,SM),C=Bi.clipToGLWindowCoordinates(t.viewport,_,Yxt);x.x=W.SOLAR_RADIUS;let V=M.multiplyByVector(f,x,SM),L=Bi.clipToGLWindowCoordinates(t.viewport,V,Hxt);return this._size=D.magnitude(D.subtract(L,C,SM)),this._size=2*this._size*(1+2*this._glowLengthTS),this._size=Math.ceil(this._size),this._commands};CM.prototype.isDestroyed=function(){return!1};CM.prototype.destroy=function(){let e=this._drawCommand;return e.vertexArray=e.vertexArray&&e.vertexArray.destroy(),e.shaderProgram=e.shaderProgram&&e.shaderProgram.destroy(),this._texture=this._texture&&this._texture.destroy(),me(this)};var VM=CM;var fQi=T(S(),1);var QJi=T(S(),1);var pSe=T(uN(),1);var dJi=T(S(),1);function Kxt(e,t,n){return` float clipDistance = clip(gl_FragCoord, ${e}, ${t}); vec4 clippingPlanesEdgeColor = vec4(1.0); clippingPlanesEdgeColor.rgb = ${n}.rgb; float clippingPlanesEdgeWidth = ${n}.a; if (clipDistance > 0.0 && clipDistance < clippingPlanesEdgeWidth) { out_FragColor = clippingPlanesEdgeColor; } `}var LM=Kxt;var hJi=T(S(),1);var Jxt={modifyFragmentShader:function(t){return t=De.replaceMain(t,"czm_splitter_main"),t+=`uniform float czm_splitDirection; void main() { #ifndef SHADOW_MAP if (czm_splitDirection < 0.0 && gl_FragCoord.x > czm_splitPosition) discard; if (czm_splitDirection > 0.0 && gl_FragCoord.x < czm_splitPosition) discard; #endif czm_splitter_main(); } `,t},addUniforms:function(t,n){n.czm_splitDirection=function(){return t.splitDirection}}},PL=Jxt;var VS={NEEDS_DECODE:0,DECODING:1,READY:2,FAILED:3};function RM(e){this._parsedContent=void 0,this._drawCommand=void 0,this._isTranslucent=!1,this._styleTranslucent=!1,this._constantColor=B.clone(B.DARKGRAY),this._highlightColor=B.clone(B.WHITE),this._pointSize=1,this._rtcCenter=void 0,this._quantizedVolumeScale=void 0,this._quantizedVolumeOffset=void 0,this._styleableShaderAttributes=void 0,this._isQuantized=!1,this._isOctEncoded16P=!1,this._isRGB565=!1,this._hasColors=!1,this._hasNormals=!1,this._hasBatchIds=!1,this._decodingState=VS.READY,this._dequantizeInShader=!0,this._isQuantizedDraco=!1,this._isOctEncodedDraco=!1,this._quantizedRange=0,this._octEncodedRange=0,this.backFaceCulling=!1,this._backFaceCulling=!1,this.normalShading=!0,this._normalShading=!0,this._opaqueRenderState=void 0,this._translucentRenderState=void 0,this._mode=void 0,this._ready=!1,this._pointsLength=0,this._geometryByteLength=0,this._vertexShaderLoaded=e.vertexShaderLoaded,this._fragmentShaderLoaded=e.fragmentShaderLoaded,this._uniformMapLoaded=e.uniformMapLoaded,this._batchTableLoaded=e.batchTableLoaded,this._pickIdLoaded=e.pickIdLoaded,this._opaquePass=y(e.opaquePass,Ge.OPAQUE),this._cull=y(e.cull,!0),this.style=void 0,this._style=void 0,this.styleDirty=!1,this.modelMatrix=M.clone(M.IDENTITY),this._modelMatrix=M.clone(M.IDENTITY),this.time=0,this.shadows=_n.ENABLED,this._boundingSphere=void 0,this.clippingPlanes=void 0,this.isClipped=!1,this.clippingPlanesDirty=!1,this.clippingPlanesOriginMatrix=void 0,this.attenuation=!1,this._attenuation=!1,this.geometricError=0,this.geometricErrorScale=1,this.maximumAttenuation=this._pointSize,this.splitDirection=y(e.splitDirection,Fr.NONE),this._splittingEnabled=!1,this._error=void 0,Qxt(this,e)}Object.defineProperties(RM.prototype,{pointsLength:{get:function(){return this._pointsLength}},geometryByteLength:{get:function(){return this._geometryByteLength}},ready:{get:function(){return this._ready}},color:{get:function(){return B.clone(this._highlightColor)},set:function(e){this._highlightColor=B.clone(e,this._highlightColor)}},boundingSphere:{get:function(){if(l(this._drawCommand))return this._drawCommand.boundingVolume},set:function(e){this._boundingSphere=de.clone(e,this._boundingSphere)}}});function Qxt(e,t){let n=A_.parse(t.arrayBuffer,t.byteOffset);if(e._parsedContent=n,e._rtcCenter=n.rtcCenter,e._hasNormals=n.hasNormals,e._hasColors=n.hasColors,e._hasBatchIds=n.hasBatchIds,e._isTranslucent=n.isTranslucent,!n.hasBatchIds&&l(n.batchTableBinary)&&(n.styleableProperties=jp.getBinaryProperties(n.pointsLength,n.batchTableJson,n.batchTableBinary)),l(n.draco)){let a=n.draco;e._decodingState=VS.NEEDS_DECODE,a.dequantizeInShader=e._dequantizeInShader}let i=n.positions;l(i)&&(e._isQuantized=i.isQuantized,e._quantizedVolumeScale=i.quantizedVolumeScale,e._quantizedVolumeOffset=i.quantizedVolumeOffset,e._quantizedRange=i.quantizedRange);let o=n.normals;l(o)&&(e._isOctEncoded16P=o.octEncoded);let r=n.colors;l(r)&&(l(r.constantColor)&&(e._constantColor=B.clone(r.constantColor,e._constantColor),e._hasColors=!1),e._isRGB565=r.isRGB565);let s=n.batchIds;l(n.batchIds)&&(s.name="BATCH_ID",s.semantic="BATCH_ID",s.setIndex=void 0),n.hasBatchIds&&e._batchTableLoaded(n.batchLength,n.batchTableJson,n.batchTableBinary),e._pointsLength=n.pointsLength}var jxt=new m,qxt=new m,$xt=new m,hSe,oB;function e_t(e){if(!l(oB)){hSe=new pSe.default(0),oB=new Array(e);for(let t=0;t<e;++t)oB[t]=hSe.random()}return oB}function t_t(e){let n=e.length/3,i=Math.min(n,20),o=e_t(20),r=Number.MAX_VALUE,s=-Number.MAX_VALUE,a=m.fromElements(r,r,r,jxt),c=m.fromElements(s,s,s,qxt);for(let u=0;u<i;++u){let h=Math.floor(o[u]*n),p=m.unpack(e,h*3,$xt);m.minimumByComponent(a,p,a),m.maximumByComponent(c,p,c)}let d=de.fromCornerPoints(a,c);return d.radius+=W.EPSILON2,d}function fSe(e,t){let n=Q.fromTypedArray(e);return n===Q.INT||n===Q.UNSIGNED_INT||n===Q.DOUBLE?(Ct("Cast pnts property to floats",`Point cloud property "${t}" will be cast to a float array because INT, UNSIGNED_INT, and DOUBLE are not valid WebGL vertex attribute types. Some precision may be lost.`),new Float32Array(e)):e}var n_t=new re,i_t=new re,o_t=new B,bSe=0,rB=1,l7=2,gSe=3,r_t=4,r7=new M,s_t=new M;function a_t(e,t){let n=t.context,i=e._parsedContent,o=e._pointsLength,r=i.positions,s=i.colors,a=i.normals,c=i.batchIds,d=i.styleableProperties,u=l(d),h=e._isQuantized,p=e._isQuantizedDraco,g=e._isOctEncoded16P,f=e._isOctEncodedDraco,x=e._quantizedRange,_=e._octEncodedRange,C=e._isRGB565,V=e._isTranslucent,L=e._hasColors,R=e._hasNormals,G=e._hasBatchIds,I,v,P=[],w={};if(e._styleableShaderAttributes=w,u){let U=r_t;for(let Y in d)if(d.hasOwnProperty(Y)){let k=d[Y],H=fSe(k.typedArray,Y);I=k.componentCount,v=Q.fromTypedArray(H);let K=St.createVertexBuffer({context:n,typedArray:H,usage:ke.STATIC_DRAW});e._geometryByteLength+=K.sizeInBytes;let te={index:U,vertexBuffer:K,componentsPerAttribute:I,componentDatatype:v,normalize:!1,offsetInBytes:0,strideInBytes:0};P.push(te),w[Y]={location:U,componentCount:I},++U}}let A=St.createVertexBuffer({context:n,typedArray:r.typedArray,usage:ke.STATIC_DRAW});e._geometryByteLength+=A.sizeInBytes;let b;L&&(b=St.createVertexBuffer({context:n,typedArray:s.typedArray,usage:ke.STATIC_DRAW}),e._geometryByteLength+=b.sizeInBytes);let Z;R&&(Z=St.createVertexBuffer({context:n,typedArray:a.typedArray,usage:ke.STATIC_DRAW}),e._geometryByteLength+=Z.sizeInBytes);let E;G&&(c.typedArray=fSe(c.typedArray,"batchIds"),E=St.createVertexBuffer({context:n,typedArray:c.typedArray,usage:ke.STATIC_DRAW}),e._geometryByteLength+=E.sizeInBytes);let X=[];if(h?v=Q.UNSIGNED_SHORT:p?v=x<=255?Q.UNSIGNED_BYTE:Q.UNSIGNED_SHORT:v=Q.FLOAT,X.push({index:bSe,vertexBuffer:A,componentsPerAttribute:3,componentDatatype:v,normalize:!1,offsetInBytes:0,strideInBytes:0}),e._cull&&(h||p?e._boundingSphere=de.fromCornerPoints(m.ZERO,e._quantizedVolumeScale):e._boundingSphere=t_t(r.typedArray)),L)if(C)X.push({index:rB,vertexBuffer:b,componentsPerAttribute:1,componentDatatype:Q.UNSIGNED_SHORT,normalize:!1,offsetInBytes:0,strideInBytes:0});else{let U=V?4:3;X.push({index:rB,vertexBuffer:b,componentsPerAttribute:U,componentDatatype:Q.UNSIGNED_BYTE,normalize:!0,offsetInBytes:0,strideInBytes:0})}R&&(g?(I=2,v=Q.UNSIGNED_BYTE):f?(I=2,v=_<=255?Q.UNSIGNED_BYTE:Q.UNSIGNED_SHORT):(I=3,v=Q.FLOAT),X.push({index:l7,vertexBuffer:Z,componentsPerAttribute:I,componentDatatype:v,normalize:!1,offsetInBytes:0,strideInBytes:0})),G&&X.push({index:gSe,vertexBuffer:E,componentsPerAttribute:1,componentDatatype:Q.fromTypedArray(c.typedArray),normalize:!1,offsetInBytes:0,strideInBytes:0}),u&&(X=X.concat(P));let F=new oi({context:n,attributes:X}),N={depthTest:{enabled:!0}},O={depthTest:{enabled:!0},depthMask:!1,blending:hn.ALPHA_BLEND};e._opaquePass===Ge.CESIUM_3D_TILE&&(N.stencilTest=Dt.setCesium3DTileBit(),N.stencilMask=Dt.CESIUM_3D_TILE_MASK,O.stencilTest=Dt.setCesium3DTileBit(),O.stencilMask=Dt.CESIUM_3D_TILE_MASK),e._opaqueRenderState=Ue.fromCache(N),e._translucentRenderState=Ue.fromCache(O),e._drawCommand=new $e({boundingVolume:new de,cull:e._cull,modelMatrix:new M,primitiveType:Ae.POINTS,vertexArray:F,count:o,shaderProgram:void 0,uniformMap:void 0,renderState:V?e._translucentRenderState:e._opaqueRenderState,pass:V?Ge.TRANSLUCENT:e._opaquePass,owner:e,castShadows:!1,receiveShadows:!1,pickId:e._pickIdLoaded()})}function c_t(e,t){let n=t.context,i=e._isQuantized,o=e._isQuantizedDraco,r=e._isOctEncodedDraco,s={u_pointSizeAndTimeAndGeometricErrorAndDepthMultiplier:function(){let a=n_t;if(a.x=e._attenuation?e.maximumAttenuation:e._pointSize,a.x*=t.pixelRatio,a.y=e.time,e._attenuation){let c=t.camera.frustum,d;t.mode===oe.SCENE2D||c instanceof ln?d=Number.POSITIVE_INFINITY:d=n.drawingBufferHeight/t.camera.frustum.sseDenominator,a.z=e.geometricError*e.geometricErrorScale,a.w=d}return a},u_highlightColor:function(){return e._highlightColor},u_constantColor:function(){return e._constantColor},u_clippingPlanes:function(){let a=e.clippingPlanes;return e.isClipped?a.texture:n.defaultTexture},u_clippingPlanesEdgeStyle:function(){let a=e.clippingPlanes;if(!l(a))return B.TRANSPARENT;let c=B.clone(a.edgeColor,o_t);return c.alpha=a.edgeWidth,c},u_clippingPlanesMatrix:function(){let a=e.clippingPlanes;if(!l(a))return M.IDENTITY;let c=y(e.clippingPlanesOriginMatrix,e._modelMatrix);M.multiply(n.uniformState.view3D,c,r7);let d=M.multiply(r7,a.modelMatrix,r7);return M.inverseTranspose(d,s_t)}};PL.addUniforms(e,s),(i||o||r)&&(s=Lt(s,{u_quantizedVolumeScaleAndOctEncodedRange:function(){let a=i_t;if(l(e._quantizedVolumeScale)){let c=m.clone(e._quantizedVolumeScale,a);m.divideByScalar(c,e._quantizedRange,a)}return a.w=e._octEncodedRange,a}})),l(e._uniformMapLoaded)&&(s=e._uniformMapLoaded(s)),e._drawCommand.uniformMap=s}function s7(e,t){let n=/czm_3dtiles_property_(\d+)/g,i=n.exec(e);for(;i!==null;){let o=parseInt(i[1]);t.indexOf(o)===-1&&t.push(o),i=n.exec(e)}}function a7(e,t){e=e.slice(e.indexOf(` `));let n=/czm_3dtiles_builtin_property_(\w+)/g,i=n.exec(e);for(;i!==null;){let o=i[1];t.indexOf(o)===-1&&t.push(o),i=n.exec(e)}}function c7(e,t){let n=e.numberOfAttributes;for(let i=0;i<n;++i){let o=e.getAttribute(i);if(o.index===t)return o}}var l_t={POSITION:"czm_3dtiles_builtin_property_POSITION",POSITION_ABSOLUTE:"czm_3dtiles_builtin_property_POSITION_ABSOLUTE",COLOR:"czm_3dtiles_builtin_property_COLOR",NORMAL:"czm_3dtiles_builtin_property_NORMAL"};function d_t(e,t,n){let i,o,r,s=t.context,a=l(n),c=e._isQuantized,d=e._isQuantizedDraco,u=e._isOctEncoded16P,h=e._isOctEncodedDraco,p=e._isRGB565,g=e._isTranslucent,f=e._hasColors,x=e._hasNormals,_=e._hasBatchIds,C=e._backFaceCulling,V=e._normalShading,L=e._drawCommand.vertexArray,R=e.clippingPlanes,G=e._attenuation,I,v,P,w=g,A=Oe(l_t),b={},Z=e._styleableShaderAttributes;for(o in Z)Z.hasOwnProperty(o)&&(r=Z[o],A[o]=`czm_3dtiles_property_${r.location}`,b[r.location]=r);if(a){let ae={translucent:!1},ye="(vec3 czm_3dtiles_builtin_property_POSITION, vec3 czm_3dtiles_builtin_property_POSITION_ABSOLUTE, vec4 czm_3dtiles_builtin_property_COLOR, vec3 czm_3dtiles_builtin_property_NORMAL)";I=n.getColorShaderFunction(`getColorFromStyle${ye}`,A,ae),v=n.getShowShaderFunction(`getShowFromStyle${ye}`,A,ae),P=n.getPointSizeShaderFunction(`getPointSizeFromStyle${ye}`,A,ae),l(I)&&ae.translucent&&(w=!0)}e._styleTranslucent=w;let E=l(I),X=l(v),F=l(P),N=e.isClipped,O=[],U=[];E&&(s7(I,O),a7(I,U)),X&&(s7(v,O),a7(v,U)),F&&(s7(P,O),a7(P,U));let Y=U.indexOf("COLOR")>=0,k=U.indexOf("NORMAL")>=0;if(k&&!x)throw new ce("Style references the NORMAL semantic but the point cloud does not have normals");for(o in Z)if(Z.hasOwnProperty(o)){r=Z[o];let ae=O.indexOf(r.location)>=0,ye=c7(L,r.location);ye.enabled=ae}let H=f&&(!E||Y);if(f){let ae=c7(L,rB);ae.enabled=H}let K=x&&(V||C||k);if(x){let ae=c7(L,l7);ae.enabled=K}let te={a_position:bSe};H&&(te.a_color=rB),K&&(te.a_normal=l7),_&&(te.a_batchId=gSe);let z="",j=O.length;for(i=0;i<j;++i){let ae=O[i];r=b[ae];let ye=r.componentCount,Se=`czm_3dtiles_property_${ae}`,Ee;ye===1?Ee="float":Ee=`vec${ye}`,z+=`in ${Ee} ${Se}; `,te[Se]=r.location}c_t(e,t);let ee=`in vec3 a_position; out vec4 v_color; uniform vec4 u_pointSizeAndTimeAndGeometricErrorAndDepthMultiplier; uniform vec4 u_constantColor; uniform vec4 u_highlightColor; `;ee+=`float u_pointSize; float tiles3d_tileset_time; `,G&&(ee+=`float u_geometricError; float u_depthMultiplier; `),ee+=z,H&&(g?ee+=`in vec4 a_color; `:p?ee+=`in float a_color; const float SHIFT_RIGHT_11 = 1.0 / 2048.0; const float SHIFT_RIGHT_5 = 1.0 / 32.0; const float SHIFT_LEFT_11 = 2048.0; const float SHIFT_LEFT_5 = 32.0; const float NORMALIZE_6 = 1.0 / 64.0; const float NORMALIZE_5 = 1.0 / 32.0; `:ee+=`in vec3 a_color; `),K&&(u||h?ee+=`in vec2 a_normal; `:ee+=`in vec3 a_normal; `),_&&(ee+=`in float a_batchId; `),(c||d||h)&&(ee+=`uniform vec4 u_quantizedVolumeScaleAndOctEncodedRange; `),E&&(ee+=I),X&&(ee+=v),F&&(ee+=P),ee+=`void main() { u_pointSize = u_pointSizeAndTimeAndGeometricErrorAndDepthMultiplier.x; tiles3d_tileset_time = u_pointSizeAndTimeAndGeometricErrorAndDepthMultiplier.y; `,G&&(ee+=` u_geometricError = u_pointSizeAndTimeAndGeometricErrorAndDepthMultiplier.z; u_depthMultiplier = u_pointSizeAndTimeAndGeometricErrorAndDepthMultiplier.w; `),H?g?ee+=` vec4 color = a_color; `:p?ee+=` float compressed = a_color; float r = floor(compressed * SHIFT_RIGHT_11); compressed -= r * SHIFT_LEFT_11; float g = floor(compressed * SHIFT_RIGHT_5); compressed -= g * SHIFT_LEFT_5; float b = compressed; vec3 rgb = vec3(r * NORMALIZE_5, g * NORMALIZE_6, b * NORMALIZE_5); vec4 color = vec4(rgb, 1.0); `:ee+=` vec4 color = vec4(a_color, 1.0); `:ee+=` vec4 color = u_constantColor; `,c||d?ee+=` vec3 position = a_position * u_quantizedVolumeScaleAndOctEncodedRange.xyz; `:ee+=` vec3 position = a_position; `,ee+=` vec3 position_absolute = vec3(czm_model * vec4(position, 1.0)); `,K?(u?ee+=` vec3 normal = czm_octDecode(a_normal); `:h?ee+=` vec3 normal = czm_octDecode(a_normal, u_quantizedVolumeScaleAndOctEncodedRange.w).zxy; `:ee+=` vec3 normal = a_normal; `,ee+=` vec3 normalEC = czm_normal * normal; `):ee+=` vec3 normal = vec3(1.0); `,E&&(ee+=` color = getColorFromStyle(position, position_absolute, color, normal); `),X&&(ee+=` float show = float(getShowFromStyle(position, position_absolute, color, normal)); `),F?ee+=` gl_PointSize = getPointSizeFromStyle(position, position_absolute, color, normal) * czm_pixelRatio; `:G?ee+=` vec4 positionEC = czm_modelView * vec4(position, 1.0); float depth = -positionEC.z; gl_PointSize = min((u_geometricError / depth) * u_depthMultiplier, u_pointSize); `:ee+=` gl_PointSize = u_pointSize; `,ee+=` color = color * u_highlightColor; `,K&&V&&(ee+=` float diffuseStrength = czm_getLambertDiffuse(czm_lightDirectionEC, normalEC); diffuseStrength = max(diffuseStrength, 0.4); color.xyz *= diffuseStrength * czm_lightColor; `),ee+=` v_color = color; gl_Position = czm_modelViewProjection * vec4(position, 1.0); `,K&&C&&(ee+=` float visible = step(-normalEC.z, 0.0); gl_Position *= visible; gl_PointSize *= visible; `),X&&(ee+=` gl_Position.w *= float(show); gl_PointSize *= float(show); `),ee+=`} `;let pe=`in vec4 v_color; `;N&&(pe+=`uniform highp sampler2D u_clippingPlanes; uniform mat4 u_clippingPlanesMatrix; uniform vec4 u_clippingPlanesEdgeStyle; `,pe+=` `,pe+=p0(R,s),pe+=` `),pe+=`void main() { out_FragColor = czm_gammaCorrect(v_color); `,N&&(pe+=LM("u_clippingPlanes","u_clippingPlanesMatrix","u_clippingPlanesEdgeStyle")),pe+=`} `,e.splitDirection!==Fr.NONE&&(pe=PL.modifyFragmentShader(pe)),l(e._vertexShaderLoaded)&&(ee=e._vertexShaderLoaded(ee)),l(e._fragmentShaderLoaded)&&(pe=e._fragmentShaderLoaded(pe));let _e=e._drawCommand;l(_e.shaderProgram)&&_e.shaderProgram.destroy(),_e.shaderProgram=en.fromCache({context:s,vertexShaderSource:ee,fragmentShaderSource:pe,attributeLocations:te});try{_e.shaderProgram._bind()}catch{throw new ce("Error generating style shader: this may be caused by a type mismatch, index out-of-bounds, or other syntax error.")}}function u_t(e,t){if(e._decodingState===VS.READY)return!1;if(e._decodingState===VS.NEEDS_DECODE){let n=e._parsedContent,i=n.draco,o=ob.decodePointCloud(i,t);l(o)&&(e._decodingState=VS.DECODING,o.then(function(r){e._decodingState=VS.READY;let s=l(r.POSITION)?r.POSITION.array:void 0,a=l(r.RGB)?r.RGB.array:void 0,c=l(r.RGBA)?r.RGBA.array:void 0,d=l(r.NORMAL)?r.NORMAL.array:void 0,u=l(r.BATCH_ID)?r.BATCH_ID.array:void 0,h=l(s)&&l(r.POSITION.data.quantization),p=l(d)&&l(r.NORMAL.data.quantization);if(h){let _=r.POSITION.data.quantization,C=_.range;e._quantizedVolumeScale=m.fromElements(C,C,C),e._quantizedVolumeOffset=m.unpack(_.minValues),e._quantizedRange=(1<<_.quantizationBits)-1,e._isQuantizedDraco=!0}p&&(e._octEncodedRange=(1<<r.NORMAL.data.quantization.quantizationBits)-1,e._isOctEncodedDraco=!0);let g=n.styleableProperties,f=i.batchTableProperties;for(let _ in f)if(f.hasOwnProperty(_)){let C=r[_];l(g)||(g={}),g[_]={typedArray:C.array,componentCount:C.data.componentsPerAttribute}}l(s)&&(n.positions={typedArray:s});let x=y(c,a);l(x)&&(n.colors={typedArray:x}),l(d)&&(n.normals={typedArray:d}),l(u)&&(n.batchIds={typedArray:u}),n.styleableProperties=g}).catch(function(r){e._decodingState=VS.FAILED,e._error=r}))}return!0}var m_t=new re,h_t=new m;RM.prototype.update=function(e){let t=e.context;if(l(this._error)){let d=this._error;throw this._error=void 0,d}if(u_t(this,t))return;let i=!1,o=!M.equals(this._modelMatrix,this.modelMatrix);if(this._mode!==e.mode&&(this._mode=e.mode,o=!0),l(this._drawCommand)||(a_t(this,e),o=!0,i=!0,this._ready=!0,this._parsedContent=void 0),o){M.clone(this.modelMatrix,this._modelMatrix);let d=this._drawCommand.modelMatrix;if(M.clone(this._modelMatrix,d),l(this._rtcCenter)&&M.multiplyByTranslation(d,this._rtcCenter,d),l(this._quantizedVolumeOffset)&&M.multiplyByTranslation(d,this._quantizedVolumeOffset,d),e.mode!==oe.SCENE3D){let h=e.mapProjection,p=M.getColumn(d,3,m_t);re.equals(p,re.UNIT_W)||wt.basisTo2D(h,d,d)}let u=this._drawCommand.boundingVolume;if(de.clone(this._boundingSphere,u),this._cull){let h=u.center;M.multiplyByPoint(d,h,h);let p=M.getScale(d,h_t);u.radius*=m.maximumComponent(p)}}this.clippingPlanesDirty&&(this.clippingPlanesDirty=!1,i=!0),this._attenuation!==this.attenuation&&(this._attenuation=this.attenuation,i=!0),this.backFaceCulling!==this._backFaceCulling&&(this._backFaceCulling=this.backFaceCulling,i=!0),this.normalShading!==this._normalShading&&(this._normalShading=this.normalShading,i=!0),(this._style!==this.style||this.styleDirty)&&(this._style=this.style,this.styleDirty=!1,i=!0);let r=this.splitDirection!==Fr.NONE;this._splittingEnabled!==r&&(this._splittingEnabled=r,i=!0),i&&d_t(this,e,this._style),this._drawCommand.castShadows=_n.castShadows(this.shadows),this._drawCommand.receiveShadows=_n.receiveShadows(this.shadows);let s=this._highlightColor.alpha<1||this._constantColor.alpha<1||this._styleTranslucent;this._drawCommand.renderState=s?this._translucentRenderState:this._opaqueRenderState,this._drawCommand.pass=s?Ge.TRANSLUCENT:this._opaquePass;let a=e.commandList,c=e.passes;(c.render||c.pick)&&a.push(this._drawCommand)};RM.prototype.isDestroyed=function(){return!1};RM.prototype.destroy=function(){let e=this._drawCommand;return l(e)&&(e.vertexArray=e.vertexArray&&e.vertexArray.destroy(),e.shaderProgram=e.shaderProgram&&e.shaderProgram.destroy()),me(this)};var ZM=RM;function RS(e){e=y(e,y.EMPTY_OBJECT),this.show=y(e.show,!0),this.modelMatrix=M.clone(y(e.modelMatrix,M.IDENTITY)),this.shadows=y(e.shadows,_n.ENABLED),this.maximumMemoryUsage=y(e.maximumMemoryUsage,256),this.shading=new Gf(e.shading),this.style=e.style,this.frameFailed=new be,this.frameChanged=new be,this._clock=e.clock,this._intervals=e.intervals,this._clippingPlanes=void 0,this.clippingPlanes=e.clippingPlanes,this._pointCloudEyeDomeLighting=new hb,this._loadTimestamp=void 0,this._clippingPlanesState=0,this._styleDirty=!1,this._pickId=void 0,this._totalMemoryUsageInBytes=0,this._frames=[],this._previousInterval=void 0,this._nextInterval=void 0,this._lastRenderedFrame=void 0,this._clockMultiplier=0,this._runningSum=0,this._runningLength=0,this._runningIndex=0,this._runningSamples=new Array(5).fill(0),this._runningAverage=0}Object.defineProperties(RS.prototype,{clippingPlanes:{get:function(){return this._clippingPlanes},set:function(e){bs.setOwner(e,this,"_clippingPlanes")}},totalMemoryUsageInBytes:{get:function(){return this._totalMemoryUsageInBytes}},boundingSphere:{get:function(){if(l(this._lastRenderedFrame))return this._lastRenderedFrame.pointCloud.boundingSphere}}});function f_t(e){return`uniform vec4 czm_pickColor; ${e}`}function p_t(e){return function(t){return Lt(t,{czm_pickColor:function(){return e._pickId.color}})}}function b_t(){return"czm_pickColor"}RS.prototype.makeStyleDirty=function(){this._styleDirty=!0};RS.prototype._getAverageLoadTime=function(){return this._runningLength===0?.05:this._runningAverage};var g_t=new q;function u7(e){let t=e._clock,n=t.canAnimate&&t.shouldAnimate,i=t.multiplier;return n?i:0}function LS(e,t){return e._intervals.indexOf(t.start)}function y_t(e,t){let n=e._intervals,i=e._clock,o=u7(e);if(o===0)return;let r=e._getAverageLoadTime(),s=q.addSeconds(i.currentTime,r*o,g_t),a=n.indexOf(s),c=LS(e,t);return a===c&&(o>=0?++a:--a),n.get(a)}function x_t(e){let t=e._intervals,i=e._clock.currentTime,o=t.indexOf(i);return t.get(o)}function __t(e,t,n){let i=u7(e),o=LS(e,t),r=LS(e,n);return i>=0?o>=r:o<=r}function xSe(e,t){return function(n){let i=l(n.message)?n.message:n.toString();e.frameFailed.numberOfListeners>0?e.frameFailed.raiseEvent({uri:t,message:i}):(console.log(`A frame failed to load: ${t}`),console.log(`Error: ${i}`))}}function T_t(e,t,n){let i=LS(e,t),o=e._frames,r=o[i];if(!l(r)){let s=t.data.transform,a=l(s)?M.fromArray(s):void 0,c=t.data.uri;r={pointCloud:void 0,transform:a,timestamp:Si(),sequential:!0,ready:!1,touchedFrameNumber:n.frameNumber,uri:c},o[i]=r,Re.fetchArrayBuffer({url:c}).then(function(d){r.pointCloud=new ZM({arrayBuffer:d,cull:!0,fragmentShaderLoaded:f_t,uniformMapLoaded:p_t(e),pickIdLoaded:b_t})}).catch(xSe(e,c))}return r}function S_t(e,t){e._runningSum+=t,e._runningSum-=e._runningSamples[e._runningIndex],e._runningSamples[e._runningIndex]=t,e._runningLength=Math.min(e._runningLength+1,e._runningSamples.length),e._runningIndex=(e._runningIndex+1)%e._runningSamples.length,e._runningAverage=e._runningSum/e._runningLength}function C_t(e,t,n,i){t.touchedFrameNumber<i.frameNumber-1&&(t.sequential=!1);let o=t.pointCloud;if(l(o)&&!t.ready){let r=i.commandList,s=r.length;if(_Se(e,t,n,i),o.ready&&(t.ready=!0,e._totalMemoryUsageInBytes+=o.geometryByteLength,r.length=s,t.sequential)){let a=(Si()-t.timestamp)/1e3;S_t(e,a)}}t.touchedFrameNumber=i.frameNumber}var V_t=new M;function L_t(e,t){let n=e.shading;return l(n)&&l(n.baseResolution)?n.baseResolution:l(t.boundingSphere)?W.cbrt(t.boundingSphere.volume()/t.pointsLength):0}function R_t(e){let t=e.shading;return l(t)&&l(t.maximumAttenuation)?t.maximumAttenuation:10}var Z_t=new Gf;function _Se(e,t,n,i){let o=y(e.shading,Z_t),r=t.pointCloud,s=y(t.transform,M.IDENTITY);r.modelMatrix=M.multiplyTransformation(e.modelMatrix,s,V_t),r.style=e.style,r.time=n.timeSinceLoad,r.shadows=e.shadows,r.clippingPlanes=e._clippingPlanes,r.isClipped=n.isClipped,r.attenuation=o.attenuation,r.backFaceCulling=o.backFaceCulling,r.normalShading=o.normalShading,r.geometricError=L_t(e,r),r.geometricErrorScale=o.geometricErrorScale,r.maximumAttenuation=R_t(e);try{r.update(i)}catch(a){xSe(e,t.uri)(a)}t.touchedFrameNumber=i.frameNumber}function d7(e,t,n,i){let o=T_t(e,t,i);C_t(e,o,n,i)}function G_t(e){return function(t){return t.touchedFrameNumber<e.frameNumber}}function TSe(e,t){let n=e._frames,i=n.length;for(let o=0;o<i;++o){let r=n[o];if(l(r)&&(!l(t)||t(r))){let s=r.pointCloud;r.ready&&(e._totalMemoryUsageInBytes-=s.geometryByteLength),l(s)&&s.destroy(),r===e._lastRenderedFrame&&(e._lastRenderedFrame=void 0),n[o]=void 0}}}function E_t(e,t){let n=LS(e,t),i=e._frames[n];if(l(i)&&i.ready)return i}function ySe(e,t,n,i,o){return l(n)?n.ready?!0:(d7(e,t,i,o),n.ready):!1}function I_t(e,t,n,i,o){let r,s,a,c=e._intervals,d=e._frames,u=LS(e,n),h=LS(e,t);if(u>=h){for(r=u;r>=h;--r)if(s=c.get(r),a=d[r],ySe(e,s,a,i,o))return s}else for(r=u;r<=h;++r)if(s=c.get(r),a=d[r],ySe(e,s,a,i,o))return s;return t}function X_t(e,t,n){let i=e._frames,o=i.length;for(let r=0;r<o;++r){let s=i[r];l(s)&&l(s.pointCloud)&&(s.pointCloud.clippingPlanesDirty=t,s.pointCloud.styleDirty=n)}}var vL={timeSinceLoad:0,isClipped:!1,clippingPlanesDirty:!1};RS.prototype.update=function(e){if(e.mode===oe.MORPHING||!this.show)return;l(this._pickId)||(this._pickId=e.context.createPickId({primitive:this})),l(this._loadTimestamp)||(this._loadTimestamp=q.clone(e.time));let t=Math.max(q.secondsDifference(e.time,this._loadTimestamp)*1e3,0),n=this._clippingPlanes,i=0,o=!1,r=l(n)&&n.enabled;r&&(n.update(e),i=n.clippingPlanesState),this._clippingPlanesState!==i&&(this._clippingPlanesState=i,o=!0);let s=this._styleDirty;this._styleDirty=!1,(o||s)&&X_t(this,o,s),vL.timeSinceLoad=t,vL.isClipped=r;let a=this.shading,c=this._pointCloudEyeDomeLighting,d=e.commandList,u=d.length,h=this._previousInterval,p=this._nextInterval,g=x_t(this);if(!l(g))return;let f=!1,x=u7(this),_=x===0;x!==this._clockMultiplier&&(f=!0,this._clockMultiplier=x),(!l(h)||_)&&(h=g),(!l(p)||f||__t(this,g,p))&&(p=y_t(this,g)),h=I_t(this,h,g,vL,e);let C=E_t(this,h);l(C)||(d7(this,h,vL,e),C=this._lastRenderedFrame),l(C)&&_Se(this,C,vL,e),l(p)&&d7(this,p,vL,e);let V=this;l(C)&&!l(this._lastRenderedFrame)&&e.afterRender.push(function(){return!0}),l(C)&&C!==this._lastRenderedFrame&&V.frameChanged.numberOfListeners>0&&e.afterRender.push(function(){return V.frameChanged.raiseEvent(V),!0}),this._previousInterval=h,this._nextInterval=p,this._lastRenderedFrame=C;let L=this._totalMemoryUsageInBytes,R=this.maximumMemoryUsage*1024*1024;L>R&&TSe(this,G_t(e));let I=d.length-u;l(a)&&a.attenuation&&a.eyeDomeLighting&&I>0&&c.update(e,u,a,this.boundingSphere)};RS.prototype.isDestroyed=function(){return!1};RS.prototype.destroy=function(){return TSe(this),this._clippingPlanes=this._clippingPlanes&&this._clippingPlanes.destroy(),this._pickId=this._pickId&&this._pickId.destroy(),me(this)};var wL=RS;function VSe(e,t){if(l(t)){let n=t.clock;l(n)&&n.getValue(e)}}function W_t(e){e._renderLoopRunning=!0;let t=0;function n(i){if(!e.isDestroyed())if(e._useDefaultRenderLoop)try{let o=e._targetFrameRate;if(!l(o))e.resize(),e.render(),requestAnimationFrame(n);else{let r=1e3/o,s=i-t;s>r&&(e.resize(),e.render(),t=i-s%r),requestAnimationFrame(n)}}catch(o){e._useDefaultRenderLoop=!1,e._renderLoopRunning=!1,e._showRenderLoopErrors&&e.showErrorPanel("An error occurred while rendering. Rendering has stopped.",void 0,o)}else e._renderLoopRunning=!1}requestAnimationFrame(n)}function LSe(e){let t=e._useBrowserRecommendedResolution?1:window.devicePixelRatio;return t*=e._resolutionScale,l(e._scene)&&(e._scene.pixelRatio=t),t}function RSe(e){let t=e._canvas,n=t.clientWidth,i=t.clientHeight,o=LSe(e);e._canvasClientWidth=n,e._canvasClientHeight=i,n*=o,i*=o,t.width=n,t.height=i,e._canRender=n!==0&&i!==0,e._lastDevicePixelRatio=window.devicePixelRatio}function ZSe(e){let t=e._canvas,n=t.width,i=t.height;if(n!==0&&i!==0){let o=e._scene.camera.frustum;l(o.aspectRatio)?o.aspectRatio=n/i:(o.top=o.right*(i/n),o.bottom=-o.top)}}function Eo(e,t){var p;e=Wn(e),t=y(t,y.EMPTY_OBJECT);let n=document.createElement("div");n.className="cesium-widget",e.appendChild(n);let i=document.createElement("canvas"),o=Ot.supportsImageRenderingPixelated();this._supportsImageRenderingPixelated=o,o&&(i.style.imageRendering=Ot.imageRenderingValue()),i.oncontextmenu=function(){return!1},i.onselectstart=function(){return!1};function r(){i!==i.ownerDocument.activeElement&&i.ownerDocument.activeElement.blur()}y(t.blurActiveElementOnCanvasFocus,!0)&&(i.addEventListener("mousedown",r),i.addEventListener("pointerdown",r)),n.appendChild(i);let a=document.createElement("div");a.className="cesium-widget-credits";let c=l(t.creditContainer)?Wn(t.creditContainer):n;c.appendChild(a);let d=l(t.creditViewport)?Wn(t.creditViewport):n,u=y(t.showRenderLoopErrors,!0),h=y(t.useBrowserRecommendedResolution,!0);this._element=n,this._container=e,this._canvas=i,this._canvasClientWidth=0,this._canvasClientHeight=0,this._lastDevicePixelRatio=0,this._creditViewport=d,this._creditContainer=c,this._innerCreditContainer=a,this._canRender=!1,this._renderLoopRunning=!1,this._showRenderLoopErrors=u,this._resolutionScale=1,this._useBrowserRecommendedResolution=h,this._forceResize=!1,this._entityView=void 0,this._clockTrackedDataSource=void 0,this._trackedEntity=void 0,this._needTrackedEntityUpdate=!1,this._zoomIsFlight=!1,this._zoomTarget=void 0,this._zoomPromise=void 0,this._zoomOptions=void 0,this._trackedEntityChanged=new be,this._allowDataSourcesToSuspendAnimation=!0,this._clock=l(t.clock)?t.clock:new Th,l(t.shouldAnimate)&&(this._clock.shouldAnimate=t.shouldAnimate),RSe(this);try{let g=y(t.ellipsoid,ne.default),f=new mM({canvas:i,contextOptions:t.contextOptions,creditContainer:a,creditViewport:d,ellipsoid:g,mapProjection:t.mapProjection,orderIndependentTranslucency:t.orderIndependentTranslucency,scene3DOnly:y(t.scene3DOnly,!1),shadows:t.shadows,mapMode2D:t.mapMode2D,requestRenderMode:t.requestRenderMode,maximumRenderTimeChange:t.maximumRenderTimeChange,depthPlaneEllipsoidOffset:t.depthPlaneEllipsoidOffset,msaaSamples:t.msaaSamples});this._scene=f,f.camera.constrainedAxis=m.UNIT_Z,LSe(this),ZSe(this);let x=t.globe;l(x)||(x=new dF(g)),x!==!1&&(f.globe=x,f.globe.shadows=y(t.terrainShadows,_n.RECEIVE_ONLY));let _=t.skyBox;!l(_)&&ne.WGS84.equals(g)&&(_=yM.createEarthSkyBox()),_!==!1&&(f.skyBox=_,f.sun=new VM,ne.WGS84.equals(g)&&(f.moon=new bF));let C=t.skyAtmosphere;!l(C)&&ne.WGS84.equals(g)&&(C=new pM(g),C.show=t.globe!==!1&&x.show),C!==!1&&(f.skyAtmosphere=C);let V=t.baseLayer;t.globe!==!1&&V!==!1&&(l(V)||(V=Ja.fromWorldImagery()),f.imageryLayers.add(V)),l(t.terrainProvider)&&t.globe!==!1&&(f.terrainProvider=t.terrainProvider),l(t.terrain)&&t.globe!==!1&&f.setTerrain(t.terrain),this._screenSpaceEventHandler=new ou(i),l(t.sceneMode)&&(t.sceneMode===oe.SCENE2D&&this._scene.morphTo2D(0),t.sceneMode===oe.COLUMBUS_VIEW&&this._scene.morphToColumbusView(0)),this._useDefaultRenderLoop=void 0,this.useDefaultRenderLoop=y(t.useDefaultRenderLoop,!0),this._targetFrameRate=void 0,this.targetFrameRate=t.targetFrameRate;let L=this;this._onRenderError=function(w,A){L._useDefaultRenderLoop=!1,L._renderLoopRunning=!1,L._showRenderLoopErrors&&L.showErrorPanel("An error occurred while rendering. Rendering has stopped.",void 0,A)},f.renderError.addEventListener(this._onRenderError);let R=t.dataSources,G=!1;l(R)||(R=new av,G=!0);let I=new Yv({scene:f,dataSourceCollection:R}),v=new fr;this._dataSourceChangedListeners={},this._automaticallyTrackDataSourceClocks=(p=t.automaticallyTrackDataSourceClocks)!=null?p:!0,this._dataSourceCollection=R,this._destroyDataSourceCollection=G,this._dataSourceDisplay=I,this._eventHelper=v,this._canAnimateUpdateCallback=this._updateCanAnimate,v.add(this._clock.onTick,Eo.prototype._onTick,this),v.add(f.morphStart,Eo.prototype._clearTrackedObject,this),v.add(R.dataSourceAdded,Eo.prototype._onDataSourceAdded,this),v.add(R.dataSourceRemoved,Eo.prototype._onDataSourceRemoved,this),v.add(f.postRender,Eo.prototype._postRender,this);let P=R.length;for(let w=0;w<P;w++)this._dataSourceAdded(R,R.get(w));this._dataSourceAdded(void 0,I.defaultDataSource),v.add(R.dataSourceAdded,Eo.prototype._dataSourceAdded,this),v.add(R.dataSourceRemoved,Eo.prototype._dataSourceRemoved,this)}catch(g){throw u&&this.showErrorPanel("Error constructing CesiumWidget.",'Visit <a href="http://get.webgl.org">http://get.webgl.org</a> to verify that your web browser and hardware support WebGL. Consider trying a different web browser or updating your video drivers. Detailed error information is below:',g),g}}Object.defineProperties(Eo.prototype,{container:{get:function(){return this._container}},canvas:{get:function(){return this._canvas}},creditContainer:{get:function(){return this._creditContainer}},creditViewport:{get:function(){return this._creditViewport}},scene:{get:function(){return this._scene}},imageryLayers:{get:function(){return this._scene.imageryLayers}},terrainProvider:{get:function(){return this._scene.terrainProvider},set:function(e){this._scene.terrainProvider=e}},creditDisplay:{get:function(){return this._scene.frameState.creditDisplay}},dataSourceDisplay:{get:function(){return this._dataSourceDisplay}},entities:{get:function(){return this._dataSourceDisplay.defaultDataSource.entities}},dataSources:{get:function(){return this._dataSourceCollection}},camera:{get:function(){return this._scene.camera}},ellipsoid:{get:function(){return this._scene.ellipsoid}},clock:{get:function(){return this._clock}},screenSpaceEventHandler:{get:function(){return this._screenSpaceEventHandler}},targetFrameRate:{get:function(){return this._targetFrameRate},set:function(e){this._targetFrameRate=e}},useDefaultRenderLoop:{get:function(){return this._useDefaultRenderLoop},set:function(e){this._useDefaultRenderLoop!==e&&(this._useDefaultRenderLoop=e,e&&!this._renderLoopRunning&&W_t(this))}},resolutionScale:{get:function(){return this._resolutionScale},set:function(e){this._resolutionScale!==e&&(this._resolutionScale=e,this._forceResize=!0)}},useBrowserRecommendedResolution:{get:function(){return this._useBrowserRecommendedResolution},set:function(e){this._useBrowserRecommendedResolution!==e&&(this._useBrowserRecommendedResolution=e,this._forceResize=!0)}},allowDataSourcesToSuspendAnimation:{get:function(){return this._allowDataSourcesToSuspendAnimation},set:function(e){this._allowDataSourcesToSuspendAnimation=e}},trackedEntity:{get:function(){return this._trackedEntity},set:function(e){if(this._trackedEntity!==e){this._trackedEntity=e,m7(this);let t=this.scene,n=t.mode;!l(e)||!l(e.position)?(this._needTrackedEntityUpdate=!1,(n===oe.COLUMBUS_VIEW||n===oe.SCENE2D)&&(t.screenSpaceCameraController.enableTranslate=!0),(n===oe.COLUMBUS_VIEW||n===oe.SCENE3D)&&(t.screenSpaceCameraController.enableTilt=!0),this._entityView=void 0,this.camera.lookAtTransform(M.IDENTITY)):this._needTrackedEntityUpdate=!0,this._trackedEntityChanged.raiseEvent(e),this.scene.requestRender()}}},trackedEntityChanged:{get:function(){return this._trackedEntityChanged}},clockTrackedDataSource:{get:function(){return this._clockTrackedDataSource},set:function(e){this._clockTrackedDataSource!==e&&(this._clockTrackedDataSource=e,VSe(this.clock,e))}}});Eo.prototype.showErrorPanel=function(e,t,n){let i=this._element,o=document.createElement("div");o.className="cesium-widget-errorPanel";let r=document.createElement("div");r.className="cesium-widget-errorPanel-content",o.appendChild(r);let s=document.createElement("div");s.className="cesium-widget-errorPanel-header",s.appendChild(document.createTextNode(e)),r.appendChild(s);let a=document.createElement("div");a.className="cesium-widget-errorPanel-scroll",r.appendChild(a);function c(){a.style.maxHeight=`${Math.max(Math.round(i.clientHeight*.9-100),30)}px`}c(),l(window.addEventListener)&&window.addEventListener("resize",c,!1);let d=l(t),u=l(n);if(d||u){let g=document.createElement("div");if(g.className="cesium-widget-errorPanel-message",a.appendChild(g),u){let f=np(n);d||(typeof n=="string"&&(n=new Error(n)),t=np({name:n.name,message:n.message}),f=n.stack),typeof console<"u"&&console.error(`${e} ${t} ${f}`);let x=document.createElement("div");x.className="cesium-widget-errorPanel-message-details collapsed";let _=document.createElement("span");_.className="cesium-widget-errorPanel-more-details",_.appendChild(document.createTextNode("See more...")),x.appendChild(_),x.onclick=function(C){x.removeChild(_),x.appendChild(document.createTextNode(f)),x.className="cesium-widget-errorPanel-message-details",r.className="cesium-widget-errorPanel-content expanded",x.onclick=void 0},a.appendChild(x)}g.innerHTML=`<p>${t}</p>`}let h=document.createElement("div");h.className="cesium-widget-errorPanel-buttonPanel",r.appendChild(h);let p=document.createElement("button");p.setAttribute("type","button"),p.className="cesium-button",p.appendChild(document.createTextNode("OK")),p.onclick=function(){l(c)&&l(window.removeEventListener)&&window.removeEventListener("resize",c,!1),i.removeChild(o)},h.appendChild(p),i.appendChild(o)};Eo.prototype.isDestroyed=function(){return!1};Eo.prototype.destroy=function(){let e=this.dataSources,t=e.length;for(let n=0;n<t;n++)this._dataSourceRemoved(e,e.get(n));this._dataSourceRemoved(void 0,this._dataSourceDisplay.defaultDataSource),this._dataSourceDisplay=this._dataSourceDisplay.destroy(),l(this._scene)&&(this._scene.renderError.removeEventListener(this._onRenderError),this._scene=this._scene.destroy()),this._container.removeChild(this._element),this._creditContainer.removeChild(this._innerCreditContainer),this._eventHelper.removeAll(),this._destroyDataSourceCollection&&(this._dataSourceCollection=this._dataSourceCollection.destroy()),me(this)};Eo.prototype.resize=function(){let e=this._canvas;!this._forceResize&&this._canvasClientWidth===e.clientWidth&&this._canvasClientHeight===e.clientHeight&&this._lastDevicePixelRatio===window.devicePixelRatio||(this._forceResize=!1,RSe(this),ZSe(this),this._scene.requestRender())};Eo.prototype.render=function(){if(this._canRender){this._scene.initializeFrame();let e=this._clock.tick();this._scene.render(e)}else this._clock.tick()};Eo.prototype._dataSourceAdded=function(e,t){t.entities.collectionChanged.addEventListener(Eo.prototype._onEntityCollectionChanged,this)};Eo.prototype._dataSourceRemoved=function(e,t){let n=t.entities;n.collectionChanged.removeEventListener(Eo.prototype._onEntityCollectionChanged,this),l(this.trackedEntity)&&n.getById(this.trackedEntity.id)===this.trackedEntity&&(this.trackedEntity=void 0)};Eo.prototype._updateCanAnimate=function(e){this._clock.canAnimate=e};Eo.prototype._onTick=function(e){let t=e.currentTime,n=this._dataSourceDisplay.update(t);this._allowDataSourcesToSuspendAnimation&&this._canAnimateUpdateCallback(n);let i=this._entityView;if(l(i)&&l(i.boundingSphere)){let o=this._trackedEntity;this._dataSourceDisplay.getBoundingSphere(o,!1,i.boundingSphere)===dt.DONE&&i.update(t,i.boundingSphere)}};Eo.prototype._onEntityCollectionChanged=function(e,t,n){let i=n.length;for(let o=0;o<i;o++){let r=n[o];this.trackedEntity===r&&(this.trackedEntity=void 0)}};Eo.prototype._clearTrackedObject=function(){this.trackedEntity=void 0};Eo.prototype._onDataSourceChanged=function(e){this.clockTrackedDataSource===e&&VSe(this.clock,e)};Eo.prototype._onDataSourceAdded=function(e,t){this._automaticallyTrackDataSourceClocks&&(this.clockTrackedDataSource=t);let n=t.entities.id,i=this._eventHelper.add(t.changedEvent,Eo.prototype._onDataSourceChanged,this);this._dataSourceChangedListeners[n]=i};Eo.prototype._onDataSourceRemoved=function(e,t){let n=this.clockTrackedDataSource===t,i=t.entities.id;if(this._dataSourceChangedListeners[i](),this._dataSourceChangedListeners[i]=void 0,n){let o=e.length;this._automaticallyTrackDataSourceClocks&&o>0?this.clockTrackedDataSource=e.get(o-1):this.clockTrackedDataSource=void 0}};Eo.prototype.zoomTo=function(e,t){return GSe(this,e,{offset:t},!1)};Eo.prototype.flyTo=function(e,t){return GSe(this,e,t,!0)};function GSe(e,t,n,i){m7(e);let o=new Promise(r=>{e._completeZoom=function(s){r(s)}});return e._zoomPromise=o,e._zoomIsFlight=i,e._zoomOptions=n,Promise.resolve(t).then(function(r){var s;if(e._zoomPromise===o){if(r instanceof Ja){let a;l(r.imageryProvider)?a=Promise.resolve(r.getImageryRectangle()):a=new Promise(c=>{let d=r.readyEvent.addEventListener(()=>{d(),c(r.getImageryRectangle())})}),a.then(function(c){return BT(c,e.scene)}).then(function(c){e._zoomPromise===o&&(e._zoomTarget=c)});return}if(r instanceof xs||r instanceof wL||r instanceof Yy){e._zoomTarget=r;return}if(r.isLoading&&l(r.loadingEvent)){let a=r.loadingEvent.addEventListener(function(){a(),e._zoomPromise===o&&(e._zoomTarget=r.entities.values.slice(0))});return}if(Array.isArray(r)){e._zoomTarget=r.slice(0);return}r=(s=r.values)!=null?s:r,l(r.entities)&&(r=r.entities.values),Array.isArray(r)?e._zoomTarget=r.slice(0):e._zoomTarget=[r]}}),e.scene.requestRender(),o}function GM(e){e._zoomPromise=void 0,e._zoomTarget=void 0,e._zoomOptions=void 0}function m7(e){let t=e._zoomPromise;l(t)&&(GM(e),e._completeZoom(!1))}Eo.prototype._postRender=function(){P_t(this),v_t(this)};var SSe=new de;function P_t(e){var u;let t=e._zoomTarget;if(!l(t)||e.scene.mode===oe.MORPHING)return;let n=e.scene,i=n.camera,o=(u=e._zoomOptions)!=null?u:{},r;function s(h){l(o.offset)||(o.offset=new rm(0,-.5,h.radius)),r={offset:o.offset,duration:o.duration,maximumHeight:o.maximumHeight,complete:function(){e._completeZoom(!0)},cancel:function(){e._completeZoom(!1)}},e._zoomIsFlight?i.flyToBoundingSphere(t.boundingSphere,r):(i.viewBoundingSphere(h,o.offset),i.lookAtTransform(M.IDENTITY),e._completeZoom(!0)),GM(e)}if(t instanceof wL){if(l(t.boundingSphere)){s(t.boundingSphere);return}let h=t.frameChanged.addEventListener(function(p){s(p.boundingSphere),h()});return}if(t instanceof xs||t instanceof Yy){s(t.boundingSphere);return}if(t instanceof he){r={destination:n.ellipsoid.cartographicToCartesian(t),duration:o.duration,maximumHeight:o.maximumHeight,complete:function(){e._completeZoom(!0)},cancel:function(){e._completeZoom(!1)}},e._zoomIsFlight?i.flyTo(r):(i.setView(r),e._completeZoom(!0)),GM(e);return}let a=t,c=[];for(let h=0,p=a.length;h<p;h++){let g=e._dataSourceDisplay.getBoundingSphere(a[h],!1,SSe);if(g===dt.PENDING)return;g!==dt.FAILED&&c.push(de.clone(SSe))}if(c.length===0){m7(e);return}e.trackedEntity=void 0;let d=de.fromBoundingSpheres(c);e._zoomIsFlight?(GM(e),i.flyToBoundingSphere(d,{duration:o.duration,maximumHeight:o.maximumHeight,complete:function(){e._completeZoom(!0)},cancel:function(){e._completeZoom(!1)},offset:o.offset})):(i.viewBoundingSphere(d,o.offset),i.lookAtTransform(M.IDENTITY),GM(e),e._completeZoom(!0))}var CSe=new de;function v_t(e){if(!e._needTrackedEntityUpdate)return;let t=e._trackedEntity,n=e.clock.currentTime,i=J.getValueOrUndefined(t.position,n);if(!l(i))return;let o=e.scene,r=e._dataSourceDisplay.getBoundingSphere(t,!1,CSe);if(r===dt.PENDING)return;let s=o.mode;(s===oe.COLUMBUS_VIEW||s===oe.SCENE2D)&&(o.screenSpaceCameraController.enableTranslate=!1),(s===oe.COLUMBUS_VIEW||s===oe.SCENE3D)&&(o.screenSpaceCameraController.enableTilt=!1);let a=r!==dt.FAILED?CSe:void 0;e._entityView=new zv(t,o,o.ellipsoid),e._entityView.update(n,a),e._needTrackedEntityUpdate=!1}var EM=Eo;var qQi=T(S(),1),IM=`uniform sampler2D u_noiseTexture; uniform vec3 u_noiseTextureDimensions; uniform float u_noiseDetail; in vec2 v_offset; in vec3 v_maximumSize; in vec4 v_color; in float v_slice; in float v_brightness; float wrap(float value, float rangeLength) { if(value < 0.0) { float absValue = abs(value); float modValue = mod(absValue, rangeLength); return mod(rangeLength - modValue, rangeLength); } return mod(value, rangeLength); } vec3 wrapVec(vec3 value, float rangeLength) { return vec3(wrap(value.x, rangeLength), wrap(value.y, rangeLength), wrap(value.z, rangeLength)); } vec2 voxelToUV(vec3 voxelIndex) { float textureSliceWidth = u_noiseTextureDimensions.x; float noiseTextureRows = u_noiseTextureDimensions.y; float inverseNoiseTextureRows = u_noiseTextureDimensions.z; float textureSliceWidthSquared = textureSliceWidth * textureSliceWidth; vec2 inverseNoiseTextureDimensions = vec2(noiseTextureRows / textureSliceWidthSquared, inverseNoiseTextureRows / textureSliceWidth); vec3 wrappedIndex = wrapVec(voxelIndex, textureSliceWidth); float column = mod(wrappedIndex.z, textureSliceWidth * inverseNoiseTextureRows); float row = floor(wrappedIndex.z / textureSliceWidth * noiseTextureRows); float xPixelCoord = wrappedIndex.x + column * textureSliceWidth; float yPixelCoord = wrappedIndex.y + row * textureSliceWidth; return vec2(xPixelCoord, yPixelCoord) * inverseNoiseTextureDimensions; } // Interpolate a voxel with its neighbor (along the positive X-axis) vec4 lerpSamplesX(vec3 voxelIndex, float x) { vec2 uv0 = voxelToUV(voxelIndex); vec2 uv1 = voxelToUV(voxelIndex + vec3(1.0, 0.0, 0.0)); vec4 sample0 = texture(u_noiseTexture, uv0); vec4 sample1 = texture(u_noiseTexture, uv1); return mix(sample0, sample1, x); } vec4 sampleNoiseTexture(vec3 position) { float textureSliceWidth = u_noiseTextureDimensions.x; vec3 recenteredPos = position + vec3(textureSliceWidth / 2.0); vec3 lerpValue = fract(recenteredPos); vec3 voxelIndex = floor(recenteredPos); vec4 xLerp00 = lerpSamplesX(voxelIndex, lerpValue.x); vec4 xLerp01 = lerpSamplesX(voxelIndex + vec3(0.0, 0.0, 1.0), lerpValue.x); vec4 xLerp10 = lerpSamplesX(voxelIndex + vec3(0.0, 1.0, 0.0), lerpValue.x); vec4 xLerp11 = lerpSamplesX(voxelIndex + vec3(0.0, 1.0, 1.0), lerpValue.x); vec4 yLerp0 = mix(xLerp00, xLerp10, lerpValue.y); vec4 yLerp1 = mix(xLerp01, xLerp11, lerpValue.y); return mix(yLerp0, yLerp1, lerpValue.z); } // Intersection with a unit sphere with radius 0.5 at center (0, 0, 0). bool intersectSphere(vec3 origin, vec3 dir, float slice, out vec3 point, out vec3 normal) { float A = dot(dir, dir); float B = dot(origin, dir); float C = dot(origin, origin) - 0.25; float discriminant = (B * B) - (A * C); if(discriminant < 0.0) { return false; } float root = sqrt(discriminant); float t = (-B - root) / A; if(t < 0.0) { t = (-B + root) / A; } point = origin + t * dir; if(slice >= 0.0) { point.z = (slice / 2.0) - 0.5; if(length(point) > 0.5) { return false; } } normal = normalize(point); point -= czm_epsilon2 * normal; return true; } // Transforms the ray origin and direction into unit sphere space, // then transforms the result back into the ellipsoid's space. bool intersectEllipsoid(vec3 origin, vec3 dir, vec3 center, vec3 scale, float slice, out vec3 point, out vec3 normal) { if(scale.x <= 0.01 || scale.y < 0.01 || scale.z < 0.01) { return false; } vec3 o = (origin - center) / scale; vec3 d = dir / scale; vec3 p, n; bool intersected = intersectSphere(o, d, slice, p, n); if(intersected) { point = (p * scale) + center; normal = n; } return intersected; } // Assume that if phase shift is being called for octave i, // the frequency is of i - 1. This saves us from doing extra // division / multiplication operations. vec2 phaseShift2D(vec2 p, vec2 freq) { return (czm_pi / 2.0) * sin(freq.yx * p.yx); } vec2 phaseShift3D(vec3 p, vec2 freq) { return phaseShift2D(p.xy, freq) + czm_pi * vec2(sin(freq.x * p.z)); } // The cloud texture function derived from Gardner's 1985 paper, // "Visual Simulation of Clouds." // https://www.cs.drexel.edu/~david/Classes/Papers/p297-gardner.pdf const float T0 = 0.6; // contrast of the texture pattern const float k = 0.1; // computed to produce a maximum value of 1 const float C0 = 0.8; // coefficient const float FX0 = 0.6; // frequency X const float FY0 = 0.6; // frequency Y const int octaves = 5; float T(vec3 point) { vec2 sum = vec2(0.0); float Ci = C0; vec2 FXY = vec2(FX0, FY0); vec2 PXY = vec2(0.0); for(int i = 1; i <= octaves; i++) { PXY = phaseShift3D(point, FXY); Ci *= 0.707; FXY *= 2.0; vec2 sinTerm = sin(FXY * point.xy + PXY); sum += Ci * sinTerm + vec2(T0); } return k * sum.x * sum.y; } const float a = 0.5; // fraction of surface reflection due to ambient or scattered light, const float t = 0.4; // fraction of texture shading const float s = 0.25; // fraction of specular reflection float I(float Id, float Is, float It) { return (1.0 - a) * ((1.0 - t) * ((1.0 - s) * Id + s * Is) + t * It) + a; } const vec3 lightDir = normalize(vec3(0.2, -1.0, 0.7)); vec4 drawCloud(vec3 rayOrigin, vec3 rayDir, vec3 cloudCenter, vec3 cloudScale, float cloudSlice, float brightness) { vec3 cloudPoint, cloudNormal; if(!intersectEllipsoid(rayOrigin, rayDir, cloudCenter, cloudScale, cloudSlice, cloudPoint, cloudNormal)) { return vec4(0.0); } float Id = clamp(dot(cloudNormal, -lightDir), 0.0, 1.0); // diffuse reflection float Is = max(pow(dot(-lightDir, -rayDir), 2.0), 0.0); // specular reflection float It = T(cloudPoint); // texture function float intensity = I(Id, Is, It); vec3 color = vec3(intensity * clamp(brightness, 0.1, 1.0)); vec4 noise = sampleNoiseTexture(u_noiseDetail * cloudPoint); float W = noise.x; float W2 = noise.y; float W3 = noise.z; // The dot product between the cloud's normal and the ray's direction is greatest // in the center of the ellipsoid's surface. It decreases towards the edge. // Thus, it is used to blur the areas leading to the edges of the ellipsoid, // so that no harsh lines appear. // The first (and biggest) layer of worley noise is then subtracted from this. // The final result is scaled up so that the base cloud is not too translucent. float ndDot = clamp(dot(cloudNormal, -rayDir), 0.0, 1.0); float TR = pow(ndDot, 3.0) - W; // translucency TR *= 1.3; // Subtracting the second and third layers of worley noise is more complicated. // If these layers of noise were simply subtracted from the current translucency, // the shape derived from the first layer of noise would be completely deleted. // The erosion of this noise should thus be constricted to the edges of the cloud. // However, because the edges of the ellipsoid were already blurred away, mapping // the noise to (1.0 - ndDot) will have no impact on most of the cloud's appearance. // The value of (0.5 - ndDot) provides the best compromise. float minusDot = 0.5 - ndDot; // Even with the previous calculation, subtracting the second layer of wnoise // erode too much of the cloud. The addition of it, however, will detailed // volume to the cloud. As long as the noise is only added and not subtracted, // the results are aesthetically pleasing. // The minusDot product is mapped in a way that it is larger at the edges of // the ellipsoid, so a subtraction and min operation are used instead of // an addition and max one. TR -= min(minusDot * W2, 0.0); // The third level of worley noise is subtracted from the result, with some // modifications. First, a scalar is added to minusDot so that the noise // starts affecting the shape farther away from the center of the ellipsoid's // surface. Then, it is scaled down so its impact is not too intense. TR -= 0.8 * (minusDot + 0.25) * W3; // The texture function's shading does not correlate with the shape of the cloud // produced by the layers of noise, so an extra shading scalar is calculated. // The darkest areas of the cloud are assigned to be where the noise erodes // the cloud the most. This is then interpolated based on the translucency // and the diffuse shading term of that point in the cloud. float shading = mix(1.0 - 0.8 * W * W, 1.0, Id * TR); // To avoid values that are too dark, this scalar is increased by a small amount // and clamped so it never goes to zero. shading = clamp(shading + 0.2, 0.3, 1.0); // Finally, the contrast of the cloud's color is increased. vec3 finalColor = mix(vec3(0.5), shading * color, 1.15); return vec4(finalColor, clamp(TR, 0.0, 1.0)) * v_color; } void main() { #ifdef DEBUG_BILLBOARDS out_FragColor = vec4(0.0, 0.5, 0.5, 1.0); #endif // To avoid calculations with high values, // we raycast from an arbitrarily smaller space. vec2 coordinate = v_maximumSize.xy * v_offset; vec3 ellipsoidScale = 0.82 * v_maximumSize; vec3 ellipsoidCenter = vec3(0.0); float zOffset = max(ellipsoidScale.z - 10.0, 0.0); vec3 eye = vec3(0, 0, -10.0 - zOffset); vec3 rayDir = normalize(vec3(coordinate, 1.0) - eye); vec3 rayOrigin = eye; #ifdef DEBUG_ELLIPSOIDS vec3 point, normal; if(intersectEllipsoid(rayOrigin, rayDir, ellipsoidCenter, ellipsoidScale, v_slice, point, normal)) { out_FragColor = v_brightness * v_color; } #else #ifndef DEBUG_BILLBOARDS vec4 cloud = drawCloud(rayOrigin, rayDir, ellipsoidCenter, ellipsoidScale, v_slice, v_brightness); if(cloud.w < 0.01) { discard; } out_FragColor = cloud; #endif #endif } `;var e4i=T(S(),1),XM=`#ifdef INSTANCED in vec2 direction; #endif in vec4 positionHighAndScaleX; in vec4 positionLowAndScaleY; in vec4 packedAttribute0; in vec4 packedAttribute1; in vec4 color; out vec2 v_offset; out vec3 v_maximumSize; out vec4 v_color; out float v_slice; out float v_brightness; void main() { // Unpack attributes. vec3 positionHigh = positionHighAndScaleX.xyz; vec3 positionLow = positionLowAndScaleY.xyz; vec2 scale = vec2(positionHighAndScaleX.w, positionLowAndScaleY.w); float show = packedAttribute0.x; float brightness = packedAttribute0.y; vec2 coordinates = packedAttribute0.wz; vec3 maximumSize = packedAttribute1.xyz; float slice = packedAttribute1.w; #ifdef INSTANCED vec2 dir = direction; #else vec2 dir = coordinates; #endif vec2 offset = dir - vec2(0.5, 0.5); vec2 scaledOffset = scale * offset; vec4 p = czm_translateRelativeToEye(positionHigh, positionLow); vec4 positionEC = czm_modelViewRelativeToEye * p; positionEC.xy += scaledOffset; positionEC.xyz *= show; gl_Position = czm_projection * positionEC; v_offset = offset; v_maximumSize = maximumSize; v_color = color; v_slice = slice; v_brightness = brightness; } `;var n4i=T(S(),1),WM=`uniform vec3 u_noiseTextureDimensions; uniform float u_noiseDetail; uniform vec3 u_noiseOffset; in vec2 v_position; float wrap(float value, float rangeLength) { if(value < 0.0) { float absValue = abs(value); float modValue = mod(absValue, rangeLength); return mod(rangeLength - modValue, rangeLength); } return mod(value, rangeLength); } vec3 wrapVec(vec3 value, float rangeLength) { return vec3(wrap(value.x, rangeLength), wrap(value.y, rangeLength), wrap(value.z, rangeLength)); } vec3 random3(vec3 p) { float dot1 = dot(p, vec3(127.1, 311.7, 932.8)); float dot2 = dot(p, vec3(269.5, 183.3, 421.4)); return fract(vec3(sin(dot1 - dot2), cos(dot1 * dot2), dot1 * dot2)); } // Frequency corresponds to cell size. // The higher the frequency, the smaller the cell size. vec3 getWorleyCellPoint(vec3 centerCell, vec3 offset, float freq) { float textureSliceWidth = u_noiseTextureDimensions.x; vec3 cell = centerCell + offset; cell = wrapVec(cell, textureSliceWidth / u_noiseDetail); cell += floor(u_noiseOffset / u_noiseDetail); vec3 p = offset + random3(cell); return p; } float worleyNoise(vec3 p, float freq) { vec3 centerCell = floor(p * freq); vec3 pointInCell = fract(p * freq); float shortestDistance = 1000.0; for(float z = -1.0; z <= 1.0; z++) { for(float y = -1.0; y <= 1.0; y++) { for(float x = -1.0; x <= 1.0; x++) { vec3 offset = vec3(x, y, z); vec3 point = getWorleyCellPoint(centerCell, offset, freq); float distance = length(pointInCell - point); if(distance < shortestDistance) { shortestDistance = distance; } } } } return shortestDistance; } const float MAX_FBM_ITERATIONS = 10.0; float worleyFBMNoise(vec3 p, float octaves, float scale) { float noise = 0.0; float freq = 1.0; float persistence = 0.625; for(float i = 0.0; i < MAX_FBM_ITERATIONS; i++) { if(i >= octaves) { break; } noise += worleyNoise(p * scale, freq * scale) * persistence; persistence *= 0.5; freq *= 2.0; } return noise; } void main() { float textureSliceWidth = u_noiseTextureDimensions.x; float inverseNoiseTextureRows = u_noiseTextureDimensions.z; float x = mod(v_position.x, textureSliceWidth); float y = mod(v_position.y, textureSliceWidth); float sliceRow = floor(v_position.y / textureSliceWidth); float z = floor(v_position.x / textureSliceWidth) + sliceRow * inverseNoiseTextureRows * textureSliceWidth; vec3 position = vec3(x, y, z); position /= u_noiseDetail; float worley0 = clamp(worleyFBMNoise(position, 3.0, 1.0), 0.0, 1.0); float worley1 = clamp(worleyFBMNoise(position, 3.0, 2.0), 0.0, 1.0); float worley2 = clamp(worleyFBMNoise(position, 3.0, 3.0), 0.0, 1.0); out_FragColor = vec4(worley0, worley1, worley2, 1.0); } `;var o4i=T(S(),1),PM=`uniform vec3 u_noiseTextureDimensions; in vec2 position; out vec2 v_position; void main() { gl_Position = vec4(position, 0.1, 1.0); float textureSliceWidth = u_noiseTextureDimensions.x; float noiseTextureRows = u_noiseTextureDimensions.y; float inverseNoiseTextureRows = u_noiseTextureDimensions.z; vec2 transformedPos = (position * 0.5) + vec2(0.5); transformedPos *= textureSliceWidth; transformedPos.x *= textureSliceWidth * inverseNoiseTextureRows; transformedPos.y *= noiseTextureRows; v_position = transformedPos; } `;var s4i=T(S(),1),vM=` in vec2 v_textureCoordinates; void main() { czm_materialInput materialInput; materialInput.s = v_textureCoordinates.s; materialInput.st = v_textureCoordinates; materialInput.str = vec3(v_textureCoordinates, 0.0); materialInput.normalEC = vec3(0.0, 0.0, -1.0); czm_material material = czm_getMaterial(materialInput); out_FragColor = vec4(material.diffuse + material.emission, material.alpha); } `;var P4i=T(S(),1);var m4i=T(S(),1);function ML(e,t){this._tilingScheme=e,this._maximumLevel=t,this._rootNodes=[]}var ZS=new le;function w_t(e,t,n,i){let o=i.length;for(let r=0;r<o;++r){let s=i[r];if(s.x===t&&s.y===n&&s.level===e)return!0}return!1}ML.prototype.addAvailableTileRange=function(e,t,n,i,o){let r=this._tilingScheme,s=this._rootNodes;if(e===0)for(let p=n;p<=o;++p)for(let g=t;g<=i;++g)w_t(e,g,p,s)||s.push(new FL(r,void 0,0,g,p));r.tileXYToRectangle(t,n,e,ZS);let a=ZS.west,c=ZS.north;r.tileXYToRectangle(i,o,e,ZS);let d=ZS.east,u=ZS.south,h=new k_t(e,a,u,d,c);for(let p=0;p<s.length;++p){let g=s[p];h7(g.extent,h)&&U_t(this._maximumLevel,g,h)}};ML.prototype.computeMaximumLevelAtPosition=function(e){let t;for(let n=0;n<this._rootNodes.length;++n){let i=this._rootNodes[n];if(AL(i.extent,e)){t=i;break}}return l(t)?wM(void 0,t,e):-1};var F_t=[],A_t=[],M_t=new le,N_t=new le;ML.prototype.computeBestAvailableLevelOverRectangle=function(e){let t=F_t;t.length=0,e.east<e.west?(t.push(le.fromRadians(-Math.PI,e.south,e.east,e.north,M_t)),t.push(le.fromRadians(e.west,e.south,Math.PI,e.north,N_t))):t.push(e);let n=A_t;n.length=0;let i;for(i=0;i<this._rootNodes.length;++i)FM(n,this._rootNodes[i],t);for(i=n.length-1;i>=0;--i)if(l(n[i])&&n[i].length===0)return i;return 0};var ESe=new he;ML.prototype.isTileAvailable=function(e,t,n){let i=this._tilingScheme.tileXYToRectangle(t,n,e,ZS);return le.center(i,ESe),this.computeMaximumLevelAtPosition(ESe)>=e};ML.prototype.computeChildMaskForTile=function(e,t,n){let i=e+1;if(i>=this._maximumLevel)return 0;let o=0;return o|=this.isTileAvailable(i,2*t,2*n+1)?1:0,o|=this.isTileAvailable(i,2*t+1,2*n+1)?2:0,o|=this.isTileAvailable(i,2*t,2*n)?4:0,o|=this.isTileAvailable(i,2*t+1,2*n)?8:0,o};function FL(e,t,n,i,o){this.tilingScheme=e,this.parent=t,this.level=n,this.x=i,this.y=o,this.extent=e.tileXYToRectangle(i,o,n),this.rectangles=[],this._sw=void 0,this._se=void 0,this._nw=void 0,this._ne=void 0}Object.defineProperties(FL.prototype,{nw:{get:function(){return this._nw||(this._nw=new FL(this.tilingScheme,this,this.level+1,this.x*2,this.y*2)),this._nw}},ne:{get:function(){return this._ne||(this._ne=new FL(this.tilingScheme,this,this.level+1,this.x*2+1,this.y*2)),this._ne}},sw:{get:function(){return this._sw||(this._sw=new FL(this.tilingScheme,this,this.level+1,this.x*2,this.y*2+1)),this._sw}},se:{get:function(){return this._se||(this._se=new FL(this.tilingScheme,this,this.level+1,this.x*2+1,this.y*2+1)),this._se}}});function k_t(e,t,n,i,o){this.level=e,this.west=t,this.south=n,this.east=i,this.north=o}function h7(e,t){let n=Math.max(e.west,t.west),i=Math.max(e.south,t.south),o=Math.min(e.east,t.east),r=Math.min(e.north,t.north);return i<r&&n<o}function U_t(e,t,n){for(;t.level<e;)if(sB(t.nw.extent,n))t=t.nw;else if(sB(t.ne.extent,n))t=t.ne;else if(sB(t.sw.extent,n))t=t.sw;else if(sB(t.se.extent,n))t=t.se;else break;if(t.rectangles.length===0||t.rectangles[t.rectangles.length-1].level<=n.level)t.rectangles.push(n);else{let i=Po(t.rectangles,n.level,D_t);i<0&&(i=~i),t.rectangles.splice(i,0,n)}}function D_t(e,t){return e.level-t}function sB(e,t){return t.west>=e.west&&t.east<=e.east&&t.south>=e.south&&t.north<=e.north}function AL(e,t){return t.longitude>=e.west&&t.longitude<=e.east&&t.latitude>=e.south&&t.latitude<=e.north}function wM(e,t,n){let i=0,o=!1;for(;!o;){let r=t._nw&&AL(t._nw.extent,n),s=t._ne&&AL(t._ne.extent,n),a=t._sw&&AL(t._sw.extent,n),c=t._se&&AL(t._se.extent,n);if(r+s+a+c>1){r&&(i=Math.max(i,wM(t,t._nw,n))),s&&(i=Math.max(i,wM(t,t._ne,n))),a&&(i=Math.max(i,wM(t,t._sw,n))),c&&(i=Math.max(i,wM(t,t._se,n)));break}else r?t=t._nw:s?t=t._ne:a?t=t._sw:c?t=t._se:o=!0}for(;t!==e;){let r=t.rectangles;for(let s=r.length-1;s>=0&&r[s].level>i;--s){let a=r[s];AL(a,n)&&(i=a.level)}t=t.parent}return i}function FM(e,t,n){if(!t)return;let i,o=!1;for(i=0;i<n.length;++i)o=o||h7(t.extent,n[i]);if(!o)return;let r=t.rectangles;for(i=0;i<r.length;++i){let s=r[i];e[s.level]||(e[s.level]=n),e[s.level]=B_t(e[s.level],s)}FM(e,t._nw,n),FM(e,t._ne,n),FM(e,t._sw,n),FM(e,t._se,n)}function B_t(e,t){let n=[];for(let i=0;i<e.length;++i){let o=e[i];h7(o,t)?(o.west<t.west&&n.push(new le(o.west,o.south,t.west,o.north)),o.east>t.east&&n.push(new le(t.east,o.south,o.east,o.north)),o.south<t.south&&n.push(new le(Math.max(t.west,o.west),o.south,Math.min(t.east,o.east),t.south)),o.north>t.north&&n.push(new le(Math.max(t.west,o.west),t.north,Math.min(t.east,o.east),o.north))):n.push(o)}return n}var Jh=ML;var O_t=15;function ISe(e){this.ellipsoid=y(e.ellipsoid,ne.default),this.credit=void 0,this.tilingScheme=void 0,this.height=void 0,this.width=void 0,this.encoding=void 0,this.lodCount=void 0,this.hasAvailability=!1,this.tilesAvailable=void 0,this.tilesAvailabilityLoaded=void 0,this.levelZeroMaximumGeometricError=void 0,this.terrainDataStructure=void 0}ISe.prototype.build=function(e){e._credit=this.credit,e._tilingScheme=this.tilingScheme,e._height=this.height,e._width=this.width,e._encoding=this.encoding,e._lodCount=this.lodCount,e._hasAvailability=this.hasAvailability,e._tilesAvailable=this.tilesAvailable,e._tilesAvailabilityLoaded=this.tilesAvailabilityLoaded,e._levelZeroMaximumGeometricError=this.levelZeroMaximumGeometricError,e._terrainDataStructure=this.terrainDataStructure};function Y_t(e,t){let n=t.copyrightText;l(n)&&(e.credit=new Rt(n));let i=t.spatialReference,o=y(i.latestWkid,i.wkid),r=t.extent,s={ellipsoid:e.ellipsoid};if(o===4326)s.rectangle=le.fromDegrees(r.xmin,r.ymin,r.xmax,r.ymax),e.tilingScheme=new Qi(s);else if(o===3857){let d=Math.PI*e.ellipsoid.maximumRadius;t.extent.xmax>d&&(t.extent.xmax=d),t.extent.ymax>d&&(t.extent.ymax=d),t.extent.xmin<-d&&(t.extent.xmin=-d),t.extent.ymin<-d&&(t.extent.ymin=-d),s.rectangleSouthwestInMeters=new D(r.xmin,r.ymin),s.rectangleNortheastInMeters=new D(r.xmax,r.ymax),e.tilingScheme=new as(s)}else throw new ce("Invalid spatial reference");let a=t.tileInfo;if(!l(a))throw new ce("tileInfo is required");e.width=a.rows+1,e.height=a.cols+1,e.encoding=a.format==="LERC"?dm.LERC:dm.NONE,e.lodCount=a.lods.length-1,(e.hasAvailability=t.capabilities.indexOf("Tilemap")!==-1)&&(e.tilesAvailable=new Jh(e.tilingScheme,e.lodCount),e.tilesAvailable.addAvailableTileRange(0,0,0,e.tilingScheme.getNumberOfXTilesAtLevel(0),e.tilingScheme.getNumberOfYTilesAtLevel(0)),e.tilesAvailabilityLoaded=new Jh(e.tilingScheme,e.lodCount)),e.levelZeroMaximumGeometricError=ss.getEstimatedLevelZeroGeometricErrorForAHeightmap(e.tilingScheme.ellipsoid,e.width,e.tilingScheme.getNumberOfXTilesAtLevel(0)),t.bandCount>1&&console.log("ArcGISTiledElevationTerrainProvider: Terrain data has more than 1 band. Using the first one."),l(t.minValues)&&l(t.maxValues)?e.terrainDataStructure={elementMultiplier:1,lowestEncodedHeight:t.minValues[0],highestEncodedHeight:t.maxValues[0]}:e.terrainDataStructure={elementMultiplier:1}}async function H_t(e,t,n){try{let i=await t.fetchJson();Y_t(e,i)}catch(i){let o=`An error occurred while accessing ${t}.`;throw Go.reportError(void 0,n,l(n)?n._errorEvent:void 0,o),i}}function zy(e){e=y(e,y.EMPTY_OBJECT),this._resource=void 0,this._credit=void 0,this._tilingScheme=void 0,this._levelZeroMaximumGeometricError=void 0,this._maxLevel=void 0,this._terrainDataStructure=void 0,this._width=void 0,this._height=void 0,this._encoding=void 0,this._lodCount=void 0,this._hasAvailability=!1,this._tilesAvailable=void 0,this._tilesAvailabilityLoaded=void 0,this._availableCache={},this._errorEvent=new be}Object.defineProperties(zy.prototype,{errorEvent:{get:function(){return this._errorEvent}},credit:{get:function(){return this._credit}},tilingScheme:{get:function(){return this._tilingScheme}},hasWaterMask:{get:function(){return!1}},hasVertexNormals:{get:function(){return!1}},availability:{get:function(){return this._tilesAvailable}}});zy.fromUrl=async function(e,t){t=y(t,y.EMPTY_OBJECT),e=await Promise.resolve(e);let n=Re.createIfNeeded(e);n.appendForwardSlash(),l(t.token)&&(n=n.getDerivedResource({queryParameters:{token:t.token}}));let i=n.getDerivedResource({queryParameters:{f:"pjson"}}),o=new ISe(t);await H_t(o,i);let r=new zy(t);return o.build(r),r._resource=n,r};zy.prototype.requestTileGeometry=function(e,t,n,i){let o=this._resource.getDerivedResource({url:`tile/${n}/${t}/${e}`,request:i}),r=this._hasAvailability,s=Promise.resolve(!0),a;if(r&&!l(f7(this,n+1,e*2,t*2))){let h=XSe(this,n+1,e*2,t*2);s=h.promise,a=h.request}let c=o.fetchArrayBuffer();if(!l(c)||!l(s))return;let d=this,u=this._tilesAvailable;return Promise.all([c,s]).then(function(h){return new za({buffer:h[0],width:d._width,height:d._height,childTileMask:r?u.computeChildMaskForTile(n,e,t):O_t,structure:d._terrainDataStructure,encoding:d._encoding})}).catch(async function(h){var p;if(l(a)&&a.state===ei.CANCELLED){i.cancel();try{await((p=i.deferred)==null?void 0:p.promise)}catch{}return i.state=ei.CANCELLED,Promise.reject(h)}return Promise.reject(h)})};function f7(e,t,n,i){if(!e._hasAvailability)return;let o=e._tilesAvailabilityLoaded,r=e._tilesAvailable;if(t>e._lodCount)return!1;if(r.isTileAvailable(t,n,i))return!0;if(o.isTileAvailable(t,n,i))return!1}zy.prototype.getLevelMaximumGeometricError=function(e){return this._levelZeroMaximumGeometricError/(1<<e)};zy.prototype.getTileDataAvailable=function(e,t,n){if(!this._hasAvailability)return;let i=f7(this,n,e,t);if(l(i))return i;XSe(this,n,e,t)};zy.prototype.loadTileDataAvailability=function(e,t,n){};function z_t(e,t,n,i){let o=t-1,r=n-1,s=i[e.y*t+e.x],a=[],c={startX:e.x,startY:e.y,endX:0,endY:0},d=new D(e.x+1,e.y+1),u=!1,h=!1;for(;!(u&&h);){let p=d.x,g=h?d.y+1:d.y;if(!u){for(let f=e.y;f<g;++f)if(i[f*t+d.x]!==s){u=!0;break}u?(a.push(new D(d.x,e.y)),--d.x,--p,c.endX=d.x):d.x===o?(c.endX=d.x,u=!0):++d.x}if(!h){let f=d.y*t;for(let x=e.x;x<=p;++x)if(i[f+x]!==s){h=!0;break}h?(a.push(new D(e.x,d.y)),--d.y,c.endY=d.y):d.y===r?(c.endY=d.y,h=!0):++d.y}}return{endingIndices:a,range:c,value:s}}function K_t(e,t,n,i,o){let r=[];if(o.every(function(c){return c===o[0]}))return o[0]===1&&r.push({startX:e,startY:t,endX:e+n-1,endY:t+i-1}),r;let a=[new D(0,0)];for(;a.length>0;){let c=a.pop(),d=z_t(c,n,i,o);if(d.value===1){let h=d.range;h.startX+=e,h.endX+=e,h.startY+=t,h.endY+=t,r.push(h)}let u=d.endingIndices;u.length>0&&(a=a.concat(u))}return r}function XSe(e,t,n,i){if(!e._hasAvailability)return{};let o=Math.floor(n/128)*128,r=Math.floor(i/128)*128,s=Math.min(1<<t,128),a=`tilemap/${t}/${r}/${o}/${s}/${s}`,c=e._availableCache;if(l(c[a]))return c[a];let d=new Qo({throttle:!1,throttleByServer:!0,type:ms.TERRAIN}),h=e._resource.getDerivedResource({url:a,request:d}).fetchJson();return l(h)?(h=h.then(function(p){let g=K_t(o,r,s,s,p.data);e._tilesAvailabilityLoaded.addAvailableTileRange(t,o,r,o+s,r+s);let f=e._tilesAvailable;for(let x=0;x<g.length;++x){let _=g[x];f.addAvailableTileRange(t,_.startX,_.startY,_.endX,_.endY)}return f7(e,t,n,i)}),c[a]={promise:h,request:d},h=h.finally(function(p){return delete c[a],p}),{promise:h,request:d}):{}}var p7=zy;var k4i=T(S(),1);var WSe="https://dev.virtualearth.net/REST/v1/Locations";function b7(e){e=y(e,y.EMPTY_OBJECT);let t=e.key;this._key=t;let n={key:t};l(e.culture)&&(n.culture=e.culture),this._resource=new Re({url:WSe,queryParameters:n}),this._credit=new Rt('<img src="http://dev.virtualearth.net/Branding/logo_powered_by.png"/>',!1)}Object.defineProperties(b7.prototype,{url:{get:function(){return WSe}},key:{get:function(){return this._key}},credit:{get:function(){return this._credit}}});b7.prototype.geocode=async function(e){return this._resource.getDerivedResource({queryParameters:{query:e}}).fetchJsonp("jsonp").then(function(n){return n.resourceSets.length===0?[]:n.resourceSets[0].resources.map(function(o){let r=o.bbox,s=r[0],a=r[1],c=r[2],d=r[3];return{displayName:o.name,destination:le.fromDegrees(a,s,d,c)}})})};var g7=b7;var B4i=T(S(),1);function y7(){}Object.defineProperties(y7.prototype,{credit:{get:function(){}}});y7.prototype.geocode=function(e){let t=e.match(/[^\s,\n]+/g);if(t.length===2||t.length===3){let n=+t[0],i=+t[1],o=t.length===3?+t[2]:300;if(isNaN(n)&&isNaN(i)){let r=/^(\d+.?\d*)([nsew])/i;for(let s=0;s<t.length;++s){let a=t[s].match(r);r.test(t[s])&&a.length===3&&(/^[ns]/i.test(a[2])?i=/^[n]/i.test(a[2])?+a[1]:-a[1]:/^[ew]/i.test(a[2])&&(n=/^[e]/i.test(a[2])?+a[1]:-a[1]))}}if(!isNaN(n)&&!isNaN(i)&&!isNaN(o)){let r={displayName:e,destination:m.fromDegrees(n,i,o)};return Promise.resolve([r])}}return Promise.resolve([])};var x7=y7;var q4i=T(S(),1);var J_t=new re,PSe=new m,NL=new m;function Q_t(e){let t=e.points,n=e.times;if(t.length<3){let i=n[0],o=1/(n[1]-i),r=t[0],s=t[1];return function(a,c){l(c)||(c=new m);let d=(a-i)*o;return m.lerp(r,s,d,c)}}return function(i,o){l(o)||(o=new m);let r=e._lastTimeIndex=e.findTimeInterval(i,e._lastTimeIndex),s=(i-n[r])/(n[r+1]-n[r]),a=J_t;a.z=s,a.y=s*s,a.x=a.y*s,a.w=1;let c,d,u,h,p;return r===0?(c=t[0],d=t[1],u=e.firstTangent,h=m.subtract(t[2],c,PSe),m.multiplyByScalar(h,.5,h),p=M.multiplyByVector(Pg.hermiteCoefficientMatrix,a,a)):r===t.length-2?(c=t[r],d=t[r+1],h=e.lastTangent,u=m.subtract(d,t[r-1],PSe),m.multiplyByScalar(u,.5,u),p=M.multiplyByVector(Pg.hermiteCoefficientMatrix,a,a)):(c=t[r-1],d=t[r],u=t[r+1],h=t[r+2],p=M.multiplyByVector(Ky.catmullRomCoefficientMatrix,a,a)),o=m.multiplyByScalar(c,p.x,o),m.multiplyByScalar(d,p.y,NL),m.add(o,NL,o),m.multiplyByScalar(u,p.z,NL),m.add(o,NL,o),m.multiplyByScalar(h,p.w,NL),m.add(o,NL,o)}}var j_t=new m,q_t=new m;function Ky(e){e=y(e,y.EMPTY_OBJECT);let t=e.points,n=e.times,i=e.firstTangent,o=e.lastTangent;if(t.length>2&&(l(i)||(i=j_t,m.multiplyByScalar(t[1],2,i),m.subtract(i,t[2],i),m.subtract(i,t[0],i),m.multiplyByScalar(i,.5,i)),!l(o))){let r=t.length-1;o=q_t,m.multiplyByScalar(t[r-1],2,o),m.subtract(t[r],o,o),m.add(o,t[r-2],o),m.multiplyByScalar(o,.5,o)}this._times=n,this._points=t,this._firstTangent=m.clone(i),this._lastTangent=m.clone(o),this._evaluateFunction=Q_t(this),this._lastTimeIndex=0}Object.defineProperties(Ky.prototype,{times:{get:function(){return this._times}},points:{get:function(){return this._points}},firstTangent:{get:function(){return this._firstTangent}},lastTangent:{get:function(){return this._lastTangent}}});Ky.catmullRomCoefficientMatrix=new M(-.5,1,-.5,0,1.5,-2.5,0,1,-1.5,2,.5,0,.5,-.5,0,0);Ky.prototype.findTimeInterval=so.prototype.findTimeInterval;Ky.prototype.wrapTime=so.prototype.wrapTime;Ky.prototype.clampTime=so.prototype.clampTime;Ky.prototype.evaluate=function(e,t){return this._evaluateFunction(e,t)};var _7=Ky;var Bji=T(S(),1);var yji=T(S(),1);var iji=T(S(),1);var aB={};aB.clipTriangleAtAxisAlignedThreshold=function(e,t,n,i,o,r){l(r)?r.length=0:r=[];let s,a,c;t?(s=n<e,a=i<e,c=o<e):(s=n>e,a=i>e,c=o>e);let d=s+a+c,u,h,p,g,f,x;return d===1?s?(u=(e-n)/(i-n),h=(e-n)/(o-n),r.push(1),r.push(2),h!==1&&(r.push(-1),r.push(0),r.push(2),r.push(h)),u!==1&&(r.push(-1),r.push(0),r.push(1),r.push(u))):a?(p=(e-i)/(o-i),g=(e-i)/(n-i),r.push(2),r.push(0),g!==1&&(r.push(-1),r.push(1),r.push(0),r.push(g)),p!==1&&(r.push(-1),r.push(1),r.push(2),r.push(p))):c&&(f=(e-o)/(n-o),x=(e-o)/(i-o),r.push(0),r.push(1),x!==1&&(r.push(-1),r.push(2),r.push(1),r.push(x)),f!==1&&(r.push(-1),r.push(2),r.push(0),r.push(f))):d===2?!s&&n!==e?(g=(e-i)/(n-i),f=(e-o)/(n-o),r.push(0),r.push(-1),r.push(1),r.push(0),r.push(g),r.push(-1),r.push(2),r.push(0),r.push(f)):!a&&i!==e?(x=(e-o)/(i-o),u=(e-n)/(i-n),r.push(1),r.push(-1),r.push(2),r.push(1),r.push(x),r.push(-1),r.push(0),r.push(1),r.push(u)):!c&&o!==e&&(h=(e-n)/(o-n),p=(e-i)/(o-i),r.push(2),r.push(-1),r.push(0),r.push(2),r.push(h),r.push(-1),r.push(1),r.push(2),r.push(p)):d!==3&&(r.push(0),r.push(1),r.push(2)),r};aB.computeBarycentricCoordinates=function(e,t,n,i,o,r,s,a,c){let d=n-s,u=s-o,h=r-a,p=i-a,g=1/(h*d+u*p),f=t-a,x=e-s,_=(h*x+u*f)*g,C=(-p*x+d*f)*g,V=1-_-C;return l(c)?(c.x=_,c.y=C,c.z=V,c):new m(_,C,V)};aB.computeLineSegmentLineSegmentIntersection=function(e,t,n,i,o,r,s,a,c){let d=(s-o)*(t-r)-(a-r)*(e-o),u=(n-e)*(t-r)-(i-t)*(e-o),h=(a-r)*(n-e)-(s-o)*(i-t);if(h===0)return;let p=d/h,g=u/h;if(p>=0&&p<=1&&g>=0&&g<=1)return l(c)||(c=new D),c.x=e+p*(n-e),c.y=t+p*(i-t),c};var W0=aB;function Jy(e){this._quantizedVertices=e.quantizedVertices,this._encodedNormals=e.encodedNormals,this._indices=e.indices,this._minimumHeight=e.minimumHeight,this._maximumHeight=e.maximumHeight,this._boundingSphere=e.boundingSphere,this._orientedBoundingBox=e.orientedBoundingBox,this._horizonOcclusionPoint=e.horizonOcclusionPoint,this._credits=e.credits;let t=this._quantizedVertices.length/3,n=this._uValues=this._quantizedVertices.subarray(0,t),i=this._vValues=this._quantizedVertices.subarray(t,2*t);this._heightValues=this._quantizedVertices.subarray(2*t,3*t);function o(s,a){return i[s]-i[a]}function r(s,a){return n[s]-n[a]}this._westIndices=lB(e.westIndices,o,t),this._southIndices=lB(e.southIndices,r,t),this._eastIndices=lB(e.eastIndices,o,t),this._northIndices=lB(e.northIndices,r,t),this._westSkirtHeight=e.westSkirtHeight,this._southSkirtHeight=e.southSkirtHeight,this._eastSkirtHeight=e.eastSkirtHeight,this._northSkirtHeight=e.northSkirtHeight,this._childTileMask=y(e.childTileMask,15),this._createdByUpsampling=y(e.createdByUpsampling,!1),this._waterMask=e.waterMask,this._mesh=void 0}Object.defineProperties(Jy.prototype,{credits:{get:function(){return this._credits}},waterMask:{get:function(){return this._waterMask}},childTileMask:{get:function(){return this._childTileMask}},canUpsample:{get:function(){return l(this._mesh)}}});var cB=[];function lB(e,t,n){cB.length=e.length;let i=!1;for(let o=0,r=e.length;o<r;++o)cB[o]=e[o],i=i||o>0&&t(e[o-1],e[o])>0;return i?(cB.sort(t),Me.createTypedArray(n,cB)):e}var vSe="createVerticesFromQuantizedTerrainMesh",$_t=new Ti(vSe),eTt=new Ti(vSe,Mh.maximumAsynchronousTasks);Jy.prototype.createMesh=function(e){e=y(e,y.EMPTY_OBJECT);let t=e.tilingScheme,n=e.x,i=e.y,o=e.level,r=y(e.exaggeration,1),s=y(e.exaggerationRelativeHeight,0),a=y(e.throttle,!0),c=t.ellipsoid,d=t.tileXYToRectangle(n,i,o),h=(a?eTt:$_t).scheduleTask({minimumHeight:this._minimumHeight,maximumHeight:this._maximumHeight,quantizedVertices:this._quantizedVertices,octEncodedNormals:this._encodedNormals,includeWebMercatorT:!0,indices:this._indices,westIndices:this._westIndices,southIndices:this._southIndices,eastIndices:this._eastIndices,northIndices:this._northIndices,westSkirtHeight:this._westSkirtHeight,southSkirtHeight:this._southSkirtHeight,eastSkirtHeight:this._eastSkirtHeight,northSkirtHeight:this._northSkirtHeight,rectangle:d,relativeToCenter:this._boundingSphere.center,ellipsoid:c,exaggeration:r,exaggerationRelativeHeight:s});if(!l(h))return;let p=this;return Promise.resolve(h).then(function(g){let f=p._quantizedVertices.length/3,x=f+p._westIndices.length+p._southIndices.length+p._eastIndices.length+p._northIndices.length,_=Me.createTypedArray(x,g.indices),C=new Float32Array(g.vertices),V=g.center,L=g.minimumHeight,R=g.maximumHeight,G=p._boundingSphere,I=p._orientedBoundingBox,v=y(m.clone(g.occludeePointInScaledSpace),p._horizonOcclusionPoint),P=g.vertexStride,w=Rc.clone(g.encoding);return p._mesh=new mm(V,C,_,g.indexCountWithoutSkirts,f,L,R,G,v,P,I,w,g.westIndicesSouthToNorth,g.southIndicesEastToWest,g.eastIndicesNorthToSouth,g.northIndicesWestToEast),p._quantizedVertices=void 0,p._encodedNormals=void 0,p._indices=void 0,p._uValues=void 0,p._vValues=void 0,p._heightValues=void 0,p._westIndices=void 0,p._southIndices=void 0,p._eastIndices=void 0,p._northIndices=void 0,p._mesh})};var tTt=new Ti("upsampleQuantizedTerrainMesh",Mh.maximumAsynchronousTasks);Jy.prototype.upsample=function(e,t,n,i,o,r,s){let a=this._mesh;if(!l(this._mesh))return;let c=t*2!==o,d=n*2===r,u=e.ellipsoid,h=e.tileXYToRectangle(o,r,s),p=tTt.scheduleTask({vertices:a.vertices,vertexCountWithoutSkirts:a.vertexCountWithoutSkirts,indices:a.indices,indexCountWithoutSkirts:a.indexCountWithoutSkirts,encoding:a.encoding,minimumHeight:this._minimumHeight,maximumHeight:this._maximumHeight,isEastChild:c,isNorthChild:d,childRectangle:h,ellipsoid:u});if(!l(p))return;let g=Math.min(this._westSkirtHeight,this._eastSkirtHeight);g=Math.min(g,this._southSkirtHeight),g=Math.min(g,this._northSkirtHeight);let f=c?g*.5:this._westSkirtHeight,x=d?g*.5:this._southSkirtHeight,_=c?this._eastSkirtHeight:g*.5,C=d?this._northSkirtHeight:g*.5,V=this._credits;return Promise.resolve(p).then(function(L){let R=new Uint16Array(L.vertices),G=Me.createTypedArray(R.length/3,L.indices),I;return l(L.encodedNormals)&&(I=new Uint8Array(L.encodedNormals)),new Jy({quantizedVertices:R,indices:G,encodedNormals:I,minimumHeight:L.minimumHeight,maximumHeight:L.maximumHeight,boundingSphere:de.clone(L.boundingSphere),orientedBoundingBox:Gn.clone(L.orientedBoundingBox),horizonOcclusionPoint:m.clone(L.horizonOcclusionPoint),westIndices:L.westIndices,southIndices:L.southIndices,eastIndices:L.eastIndices,northIndices:L.northIndices,westSkirtHeight:f,southSkirtHeight:x,eastSkirtHeight:_,northSkirtHeight:C,childTileMask:0,credits:V,createdByUpsampling:!0})})};var T7=32767,wSe=new m;Jy.prototype.interpolateHeight=function(e,t,n){let i=W.clamp((t-e.west)/e.width,0,1);i*=T7;let o=W.clamp((n-e.south)/e.height,0,1);return o*=T7,l(this._mesh)?rTt(this,i,o):sTt(this,i,o)};function FSe(e,t,n,i,o,r,s,a){let c=Math.min(n,o,s),d=Math.max(n,o,s),u=Math.min(i,r,a),h=Math.max(i,r,a);return e>=c&&e<=d&&t>=u&&t<=h}var nTt=new D,iTt=new D,oTt=new D;function rTt(e,t,n){let i=e._mesh,o=i.vertices,r=i.encoding,s=i.indices;for(let a=0,c=s.length;a<c;a+=3){let d=s[a],u=s[a+1],h=s[a+2],p=r.decodeTextureCoordinates(o,d,nTt),g=r.decodeTextureCoordinates(o,u,iTt),f=r.decodeTextureCoordinates(o,h,oTt);if(FSe(t,n,p.x,p.y,g.x,g.y,f.x,f.y)){let x=W0.computeBarycentricCoordinates(t,n,p.x,p.y,g.x,g.y,f.x,f.y,wSe);if(x.x>=-1e-15&&x.y>=-1e-15&&x.z>=-1e-15){let _=r.decodeHeight(o,d),C=r.decodeHeight(o,u),V=r.decodeHeight(o,h);return x.x*_+x.y*C+x.z*V}}}}function sTt(e,t,n){let i=e._uValues,o=e._vValues,r=e._heightValues,s=e._indices;for(let a=0,c=s.length;a<c;a+=3){let d=s[a],u=s[a+1],h=s[a+2],p=i[d],g=i[u],f=i[h],x=o[d],_=o[u],C=o[h];if(FSe(t,n,p,x,g,_,f,C)){let V=W0.computeBarycentricCoordinates(t,n,p,x,g,_,f,C,wSe);if(V.x>=-1e-15&&V.y>=-1e-15&&V.z>=-1e-15){let L=V.x*r[d]+V.y*r[u]+V.z*r[h];return W.lerp(e._minimumHeight,e._maximumHeight,L/T7)}}}}Jy.prototype.isChildAvailable=function(e,t,n,i){let o=2;return n!==e*2&&++o,i!==t*2&&(o-=2),(this._childTileMask&1<<o)!==0};Jy.prototype.wasCreatedByUpsampling=function(){return this._createdByUpsampling};var GS=Jy;function aTt(e){this.resource=e.resource,this.version=e.version,this.isHeightmap=e.isHeightmap,this.tileUrlTemplates=e.tileUrlTemplates,this.availability=e.availability,this.hasVertexNormals=e.hasVertexNormals,this.hasWaterMask=e.hasWaterMask,this.hasMetadata=e.hasMetadata,this.availabilityLevels=e.availabilityLevels,this.availabilityTilesLoaded=e.availabilityTilesLoaded,this.littleEndianExtensionSize=e.littleEndianExtensionSize,this.availabilityPromiseCache={}}function MSe(e){this.requestVertexNormals=y(e.requestVertexNormals,!1),this.requestWaterMask=y(e.requestWaterMask,!1),this.requestMetadata=y(e.requestMetadata,!0),this.ellipsoid=y(e.ellipsoid,ne.default),this.heightmapWidth=65,this.heightmapStructure=void 0,this.hasWaterMask=!1,this.hasMetadata=!1,this.hasVertexNormals=!1,this.scheme=void 0,this.lastResource=void 0,this.layerJsonResource=void 0,this.previousError=void 0,this.availability=void 0,this.tilingScheme=void 0,this.levelZeroMaximumGeometricError=void 0,this.heightmapStructure=void 0,this.layers=[],this.attribution="",this.overallAvailability=[],this.overallMaxZoom=0,this.tileCredits=[]}MSe.prototype.build=function(e){e._heightmapWidth=this.heightmapWidth,e._scheme=this.scheme;let t=l(this.lastResource.credits)?this.lastResource.credits:[];e._tileCredits=t.concat(this.tileCredits),e._availability=this.availability,e._tilingScheme=this.tilingScheme,e._requestWaterMask=this.requestWaterMask,e._levelZeroMaximumGeometricError=this.levelZeroMaximumGeometricError,e._heightmapStructure=this.heightmapStructure,e._layers=this.layers,e._hasWaterMask=this.hasWaterMask,e._hasVertexNormals=this.hasVertexNormals,e._hasMetadata=this.hasMetadata};async function NSe(e,t,n){if(!t.format){let x="The tile format is not specified in the layer.json file.";throw e.previousError=Go.reportError(e.previousError,n,l(n)?n._errorEvent:void 0,x),new ce(x)}if(!t.tiles||t.tiles.length===0){let x="The layer.json file does not specify any tile URL templates.";throw e.previousError=Go.reportError(e.previousError,n,l(n)?n._errorEvent:void 0,x),new ce(x)}let i=!1,o=!1,r=!1,s=!0,a=!1;if(t.format==="heightmap-1.0")a=!0,l(e.heightmapStructure)||(e.heightmapStructure={heightScale:1/5,heightOffset:-1e3,elementsPerHeight:1,stride:1,elementMultiplier:256,isBigEndian:!1,lowestEncodedHeight:0,highestEncodedHeight:256*256-1}),o=!0,e.requestWaterMask=!0;else if(t.format.indexOf("quantized-mesh-1.")!==0){let x=`The tile format "${t.format}" is invalid or not supported.`;throw e.previousError=Go.reportError(e.previousError,n,l(n)?n._errorEvent:void 0,x),new ce(x)}let c=t.tiles,d=t.maxzoom;if(e.overallMaxZoom=Math.max(e.overallMaxZoom,d),!t.projection||t.projection==="EPSG:4326")e.tilingScheme=new Qi({numberOfLevelZeroTilesX:2,numberOfLevelZeroTilesY:1,ellipsoid:e.ellipsoid});else if(t.projection==="EPSG:3857")e.tilingScheme=new as({numberOfLevelZeroTilesX:1,numberOfLevelZeroTilesY:1,ellipsoid:e.ellipsoid});else{let x=`The projection "${t.projection}" is invalid or not supported.`;throw e.previousError=Go.reportError(e.previousError,n,l(n)?n._errorEvent:void 0,x),new ce(x)}if(e.levelZeroMaximumGeometricError=ss.getEstimatedLevelZeroGeometricErrorForAHeightmap(e.tilingScheme.ellipsoid,e.heightmapWidth,e.tilingScheme.getNumberOfXTilesAtLevel(0)),!t.scheme||t.scheme==="tms"||t.scheme==="slippyMap")e.scheme=t.scheme;else{let x=`The scheme "${t.scheme}" is invalid or not supported.`;throw e.previousError=Go.reportError(e.previousError,n,l(n)?n._errorEvent:void 0,x),new ce(x)}let u;l(t.extensions)&&t.extensions.indexOf("octvertexnormals")!==-1?i=!0:l(t.extensions)&&t.extensions.indexOf("vertexnormals")!==-1&&(i=!0,s=!1),l(t.extensions)&&t.extensions.indexOf("watermask")!==-1&&(o=!0),l(t.extensions)&&t.extensions.indexOf("metadata")!==-1&&(r=!0);let h=t.metadataAvailability,p=t.available,g;if(l(p)&&!l(h)){g=new Jh(e.tilingScheme,p.length);for(let x=0;x<p.length;++x){let _=p[x],C=e.tilingScheme.getNumberOfYTilesAtLevel(x);l(e.overallAvailability[x])||(e.overallAvailability[x]=[]);for(let V=0;V<_.length;++V){let L=_[V],R=C-L.endY-1,G=C-L.startY-1;e.overallAvailability[x].push([L.startX,R,L.endX,G]),g.addAvailableTileRange(x,L.startX,R,L.endX,G)}}}else l(h)&&(u=new Jh(e.tilingScheme,d),g=new Jh(e.tilingScheme,d),e.overallAvailability[0]=[[0,0,1,0]],g.addAvailableTileRange(0,0,0,1,0));e.hasWaterMask=e.hasWaterMask||o,e.hasVertexNormals=e.hasVertexNormals||i,e.hasMetadata=e.hasMetadata||r,l(t.attribution)&&(e.attribution.length>0&&(e.attribution+=" "),e.attribution+=t.attribution),e.layers.push(new aTt({resource:e.lastResource,version:t.version,isHeightmap:a,tileUrlTemplates:c,availability:g,hasVertexNormals:i,hasWaterMask:o,hasMetadata:r,availabilityLevels:h,availabilityTilesLoaded:u,littleEndianExtensionSize:s}));let f=t.parentUrl;return l(f)?l(g)?(e.lastResource=e.lastResource.getDerivedResource({url:f}),e.lastResource.appendForwardSlash(),e.layerJsonResource=e.lastResource.getDerivedResource({url:"layer.json"}),await V7(e),!0):(console.log("A layer.json can't have a parentUrl if it does't have an available array."),!0):!0}function cTt(e,t,n){let i=`An error occurred while accessing ${e.layerJsonResource.url}.`;if(l(t)&&(i+=` ${t.message}`),e.previousError=Go.reportError(e.previousError,n,l(n)?n._errorEvent:void 0,i),e.previousError.retry)return V7(e,n);throw new ce(i)}async function lTt(e,t,n){await NSe(e,t,n);let i=e.overallAvailability.length;if(i>0){let o=e.availability=new Jh(e.tilingScheme,e.overallMaxZoom);for(let r=0;r<i;++r){let s=e.overallAvailability[r];for(let a=0;a<s.length;++a){let c=s[a];o.addAvailableTileRange(r,c[0],c[1],c[2],c[3])}}}if(e.attribution.length>0){let o=new Rt(e.attribution);e.tileCredits.push(o)}return!0}async function V7(e,t){try{let n=await e.layerJsonResource.fetchJson();return lTt(e,n,t)}catch(n){return l(n)&&n.statusCode===404?(await NSe(e,{tilejson:"2.1.0",format:"heightmap-1.0",version:"1.0.0",scheme:"tms",tiles:["{z}/{x}/{y}.terrain?v={version}"]},t),!0):cTt(e,n,t)}}function Qh(e){e=y(e,y.EMPTY_OBJECT),this._heightmapWidth=void 0,this._heightmapStructure=void 0,this._hasWaterMask=!1,this._hasVertexNormals=!1,this._hasMetadata=!1,this._scheme=void 0,this._ellipsoid=e.ellipsoid,this._requestVertexNormals=y(e.requestVertexNormals,!1),this._requestWaterMask=y(e.requestWaterMask,!1),this._requestMetadata=y(e.requestMetadata,!0),this._errorEvent=new be;let t=e.credit;typeof t=="string"&&(t=new Rt(t)),this._credit=t,this._availability=void 0,this._tilingScheme=void 0,this._levelZeroMaximumGeometricError=void 0,this._layers=void 0,this._tileCredits=void 0}var S7={OCT_VERTEX_NORMALS:1,WATER_MASK:2,METADATA:4};function ASe(e){return!l(e)||e.length===0?{Accept:"application/vnd.quantized-mesh,application/octet-stream;q=0.9,*/*;q=0.01"}:{Accept:`application/vnd.quantized-mesh;extensions=${e.join("-")},application/octet-stream;q=0.9,*/*;q=0.01`}}function dTt(e,t,n,i,o){let r=new Uint16Array(t,0,e._heightmapWidth*e._heightmapWidth);return new za({buffer:r,childTileMask:new Uint8Array(t,r.byteLength,1)[0],waterMask:new Uint8Array(t,r.byteLength+1,t.byteLength-r.byteLength-1),width:e._heightmapWidth,height:e._heightmapWidth,structure:e._heightmapStructure,credits:e._tileCredits})}function uTt(e,t,n,i,o,r){let s=r.littleEndianExtensionSize,a=0,c=3,d=c+1,u=Float64Array.BYTES_PER_ELEMENT*c,h=Float64Array.BYTES_PER_ELEMENT*d,g=Uint16Array.BYTES_PER_ELEMENT*3,f=3,x=Uint16Array.BYTES_PER_ELEMENT,_=x*f,C=new DataView(t),V=new m(C.getFloat64(a,!0),C.getFloat64(a+8,!0),C.getFloat64(a+16,!0));a+=u;let L=C.getFloat32(a,!0);a+=Float32Array.BYTES_PER_ELEMENT;let R=C.getFloat32(a,!0);a+=Float32Array.BYTES_PER_ELEMENT;let G=new de(new m(C.getFloat64(a,!0),C.getFloat64(a+8,!0),C.getFloat64(a+16,!0)),C.getFloat64(a+u,!0));a+=h;let I=new m(C.getFloat64(a,!0),C.getFloat64(a+8,!0),C.getFloat64(a+16,!0));a+=u;let v=C.getUint32(a,!0);a+=Uint32Array.BYTES_PER_ELEMENT;let P=new Uint16Array(t,a,v*3);a+=v*g,v>64*1024&&(x=Uint32Array.BYTES_PER_ELEMENT,_=x*f);let w=P.subarray(0,v),A=P.subarray(v,2*v),b=P.subarray(v*2,3*v);Mn.zigZagDeltaDecode(w,A,b),a%x!==0&&(a+=x-a%x);let Z=C.getUint32(a,!0);a+=Uint32Array.BYTES_PER_ELEMENT;let E=Me.createTypedArrayFromArrayBuffer(v,t,a,Z*f);a+=Z*_;let X=0,F=E.length;for(let ae=0;ae<F;++ae){let ye=E[ae];E[ae]=X-ye,ye===0&&++X}let N=C.getUint32(a,!0);a+=Uint32Array.BYTES_PER_ELEMENT;let O=Me.createTypedArrayFromArrayBuffer(v,t,a,N);a+=N*x;let U=C.getUint32(a,!0);a+=Uint32Array.BYTES_PER_ELEMENT;let Y=Me.createTypedArrayFromArrayBuffer(v,t,a,U);a+=U*x;let k=C.getUint32(a,!0);a+=Uint32Array.BYTES_PER_ELEMENT;let H=Me.createTypedArrayFromArrayBuffer(v,t,a,k);a+=k*x;let K=C.getUint32(a,!0);a+=Uint32Array.BYTES_PER_ELEMENT;let te=Me.createTypedArrayFromArrayBuffer(v,t,a,K);a+=K*x;let z,j;for(;a<C.byteLength;){let ae=C.getUint8(a,!0);a+=Uint8Array.BYTES_PER_ELEMENT;let ye=C.getUint32(a,s);if(a+=Uint32Array.BYTES_PER_ELEMENT,ae===S7.OCT_VERTEX_NORMALS&&e._requestVertexNormals)z=new Uint8Array(t,a,v*2);else if(ae===S7.WATER_MASK&&e._requestWaterMask)j=new Uint8Array(t,a,ye);else if(ae===S7.METADATA&&e._requestMetadata){let Se=C.getUint32(a,!0);if(Se>0){let Ie=nr(new Uint8Array(t),a+Uint32Array.BYTES_PER_ELEMENT,Se).available;if(l(Ie))for(let we=0;we<Ie.length;++we){let ve=n+we+1,at=Ie[we],Je=e._tilingScheme.getNumberOfYTilesAtLevel(ve);for(let pt=0;pt<at.length;++pt){let Qe=at[pt],_t=Je-Qe.endY-1,ht=Je-Qe.startY-1;e.availability.addAvailableTileRange(ve,Qe.startX,_t,Qe.endX,ht),r.availability.addAvailableTileRange(ve,Qe.startX,_t,Qe.endX,ht)}}}r.availabilityTilesLoaded.addAvailableTileRange(n,i,o,i,o)}a+=ye}let ee=e.getLevelMaximumGeometricError(n)*5,pe=e._tilingScheme.tileXYToRectangle(i,o,n),_e=Gn.fromRectangle(pe,L,R,e._tilingScheme.ellipsoid);return new GS({center:V,minimumHeight:L,maximumHeight:R,boundingSphere:G,orientedBoundingBox:_e,horizonOcclusionPoint:I,quantizedVertices:P,encodedNormals:z,indices:E,westIndices:O,southIndices:Y,eastIndices:H,northIndices:te,westSkirtHeight:ee,southSkirtHeight:ee,eastSkirtHeight:ee,northSkirtHeight:ee,childTileMask:e.availability.computeChildMaskForTile(n,i,o),waterMask:j,credits:e._tileCredits})}Qh.prototype.requestTileGeometry=function(e,t,n,i){let o=this._layers,r,s=o.length,a=!1,c=Promise.resolve();if(s===1)r=o[0];else for(let d=0;d<s;++d){let u=o[d];if(!l(u.availability)||u.availability.isTileAvailable(n,e,t)){r=u;break}let h=L7(this,e,t,n,u,d===0);h.result&&(a=!0,c=c.then(()=>h.promise))}return!l(r)&&a?c.then(()=>new Promise(d=>{setTimeout(()=>{let u=this.requestTileGeometry(e,t,n,i);d(u)},0)})):kSe(this,e,t,n,r,i)};function kSe(e,t,n,i,o,r){if(!l(o))return Promise.reject(new ce("Terrain tile doesn't exist"));let s=o.tileUrlTemplates;if(s.length===0)return;let a;!e._scheme||e._scheme==="tms"?a=e._tilingScheme.getNumberOfYTilesAtLevel(i)-n-1:a=n;let c=[];e._requestVertexNormals&&o.hasVertexNormals&&c.push(o.littleEndianExtensionSize?"octvertexnormals":"vertexnormals"),e._requestWaterMask&&o.hasWaterMask&&c.push("watermask"),e._requestMetadata&&o.hasMetadata&&c.push("metadata");let d,u,h=s[(t+a+i)%s.length],p=o.resource;l(p._ionEndpoint)&&!l(p._ionEndpoint.externalType)?(c.length!==0&&(u={extensions:c.join("-")}),d=ASe(void 0)):d=ASe(c);let g=p.getDerivedResource({url:h,templateValues:{version:o.version,z:i,x:t,y:a},queryParameters:u,headers:d,request:r}).fetchArrayBuffer();if(l(g))return g.then(function(f){return l(f)?l(e._heightmapStructure)?dTt(e,f,i,t,n):uTt(e,f,i,t,n,o):Promise.reject(new ce("Mesh buffer doesn't exist."))})}Object.defineProperties(Qh.prototype,{errorEvent:{get:function(){return this._errorEvent}},credit:{get:function(){return this._credit}},tilingScheme:{get:function(){return this._tilingScheme}},hasWaterMask:{get:function(){return this._hasWaterMask&&this._requestWaterMask}},hasVertexNormals:{get:function(){return this._hasVertexNormals&&this._requestVertexNormals}},hasMetadata:{get:function(){return this._hasMetadata&&this._requestMetadata}},requestVertexNormals:{get:function(){return this._requestVertexNormals}},requestWaterMask:{get:function(){return this._requestWaterMask}},requestMetadata:{get:function(){return this._requestMetadata}},availability:{get:function(){return this._availability}}});Qh.prototype.getLevelMaximumGeometricError=function(e){return this._levelZeroMaximumGeometricError/(1<<e)};Qh.fromIonAssetId=async function(e,t){let n=await xd.fromAssetId(e);return Qh.fromUrl(n,t)};Qh.fromUrl=async function(e,t){t=y(t,y.EMPTY_OBJECT),e=await Promise.resolve(e);let n=Re.createIfNeeded(e);n.appendForwardSlash();let i=new MSe(t);i.lastResource=n,i.layerJsonResource=i.lastResource.getDerivedResource({url:"layer.json"}),await V7(i);let o=new Qh(t);return i.build(o),o};Qh.prototype.getTileDataAvailable=function(e,t,n){if(!l(this._availability))return;if(n>this._availability._maximumLevel)return!1;if(this._availability.isTileAvailable(n,e,t))return!0;if(!this._hasMetadata)return!1;let i=this._layers,o=i.length;for(let r=0;r<o;++r)if(L7(this,e,t,n,i[r],r===0).result)return;return!1};Qh.prototype.loadTileDataAvailability=function(e,t,n){if(!l(this._availability)||n>this._availability._maximumLevel||this._availability.isTileAvailable(n,e,t)||!this._hasMetadata)return;let i=this._layers,o=i.length;for(let r=0;r<o;++r){let s=L7(this,e,t,n,i[r],r===0);if(l(s.promise))return s.promise}};function C7(e,t,n,i){if(i===0)return;let o=e.availabilityLevels,r=i%o===0?i-o:(i/o|0)*o,s=1<<i-r,a=t/s|0,c=n/s|0;return{level:r,x:a,y:c}}function L7(e,t,n,i,o,r){if(!l(o.availabilityLevels))return{result:!1};let s,a=function(){delete o.availabilityPromiseCache[s]},c=o.availabilityTilesLoaded,d=o.availability,u=C7(o,t,n,i);for(;l(u);){if(d.isTileAvailable(u.level,u.x,u.y)&&!c.isTileAvailable(u.level,u.x,u.y)){let h;if(!r&&(s=`${u.level}-${u.x}-${u.y}`,h=o.availabilityPromiseCache[s],!l(h))){let p=new Qo({throttle:!1,throttleByServer:!0,type:ms.TERRAIN});h=kSe(e,u.x,u.y,u.level,o,p),l(h)&&(o.availabilityPromiseCache[s]=h,h.then(a))}return{result:!0,promise:h}}u=C7(o,u.x,u.y,u.level)}return{result:!1}}Qh._getAvailabilityTile=C7;var ES=Qh;var jji=T(S(),1);function P0(e){e=y(e,y.EMPTY_OBJECT);let t=e.radius,n={center:e.center,semiMajorAxis:t,semiMinorAxis:t,ellipsoid:e.ellipsoid,height:e.height,extrudedHeight:e.extrudedHeight,granularity:e.granularity,vertexFormat:e.vertexFormat,stRotation:e.stRotation,shadowVolume:e.shadowVolume};this._ellipseGeometry=new ul(n),this._workerName="createCircleGeometry"}P0.packedLength=ul.packedLength;P0.pack=function(e,t,n){return ul.pack(e._ellipseGeometry,t,n)};var USe=new ul({center:new m,semiMajorAxis:1,semiMinorAxis:1}),ja={center:new m,radius:void 0,ellipsoid:ne.clone(ne.default),height:void 0,extrudedHeight:void 0,granularity:void 0,vertexFormat:new Xe,stRotation:void 0,semiMajorAxis:void 0,semiMinorAxis:void 0,shadowVolume:void 0};P0.unpack=function(e,t,n){let i=ul.unpack(e,t,USe);return ja.center=m.clone(i._center,ja.center),ja.ellipsoid=ne.clone(i._ellipsoid,ja.ellipsoid),ja.ellipsoid=ne.clone(i._ellipsoid,USe._ellipsoid),ja.height=i._height,ja.extrudedHeight=i._extrudedHeight,ja.granularity=i._granularity,ja.vertexFormat=Xe.clone(i._vertexFormat,ja.vertexFormat),ja.stRotation=i._stRotation,ja.shadowVolume=i._shadowVolume,l(n)?(ja.semiMajorAxis=i._semiMajorAxis,ja.semiMinorAxis=i._semiMinorAxis,n._ellipseGeometry=new ul(ja),n):(ja.radius=i._semiMajorAxis,new P0(ja))};P0.createGeometry=function(e){return ul.createGeometry(e._ellipseGeometry)};P0.createShadowVolume=function(e,t,n){let i=e._ellipseGeometry._granularity,o=e._ellipseGeometry._ellipsoid,r=t(i,o),s=n(i,o);return new P0({center:e._ellipseGeometry._center,radius:e._ellipseGeometry._semiMajorAxis,ellipsoid:o,stRotation:e._ellipseGeometry._stRotation,granularity:i,extrudedHeight:r,height:s,vertexFormat:Xe.POSITION_ONLY,shadowVolume:!0})};Object.defineProperties(P0.prototype,{rectangle:{get:function(){return this._ellipseGeometry.rectangle}},textureCoordinateRotationPoints:{get:function(){return this._ellipseGeometry.textureCoordinateRotationPoints}}});var R7=P0;var o8i=T(S(),1);function kL(e){e=y(e,y.EMPTY_OBJECT);let t=e.radius,n={center:e.center,semiMajorAxis:t,semiMinorAxis:t,ellipsoid:e.ellipsoid,height:e.height,extrudedHeight:e.extrudedHeight,granularity:e.granularity,numberOfVerticalLines:e.numberOfVerticalLines};this._ellipseGeometry=new kd(n),this._workerName="createCircleOutlineGeometry"}kL.packedLength=kd.packedLength;kL.pack=function(e,t,n){return kd.pack(e._ellipseGeometry,t,n)};var mTt=new kd({center:new m,semiMajorAxis:1,semiMinorAxis:1}),cu={center:new m,radius:void 0,ellipsoid:ne.clone(ne.UNIT_SPHERE),height:void 0,extrudedHeight:void 0,granularity:void 0,numberOfVerticalLines:void 0,semiMajorAxis:void 0,semiMinorAxis:void 0};kL.unpack=function(e,t,n){let i=kd.unpack(e,t,mTt);return cu.center=m.clone(i._center,cu.center),cu.ellipsoid=ne.clone(i._ellipsoid,cu.ellipsoid),cu.height=i._height,cu.extrudedHeight=i._extrudedHeight,cu.granularity=i._granularity,cu.numberOfVerticalLines=i._numberOfVerticalLines,l(n)?(cu.semiMajorAxis=i._semiMajorAxis,cu.semiMinorAxis=i._semiMinorAxis,n._ellipseGeometry=new kd(cu),n):(cu.radius=i._semiMajorAxis,new kL(cu))};kL.createGeometry=function(e){return kd.createGeometry(e._ellipseGeometry)};var Z7=kL;var c8i=T(S(),1);function hTt(e){return e=y(e,y.EMPTY_OBJECT),ES.fromIonAssetId(2426648,{requestVertexNormals:y(e.requestVertexNormals,!1)})}var AM=hTt;var h8i=T(S(),1);function fTt(e){return e=y(e,y.EMPTY_OBJECT),ES.fromIonAssetId(1,{requestVertexNormals:y(e.requestVertexNormals,!1),requestWaterMask:y(e.requestWaterMask,!1),ellipsoid:ne.WGS84})}var IS=fTt;var C8i=T(S(),1);function UL(e){e=y(e,y.EMPTY_OBJECT),this._callback=e.callback,this._tilingScheme=e.tilingScheme,l(this._tilingScheme)||(this._tilingScheme=new Qi({ellipsoid:y(e.ellipsoid,ne.default)})),this._width=e.width,this._height=e.height;let t=Math.max(this._width,this._height);this._levelZeroMaximumGeometricError=ss.getEstimatedLevelZeroGeometricErrorForAHeightmap(this._tilingScheme.ellipsoid,t,this._tilingScheme.getNumberOfXTilesAtLevel(0)),this._errorEvent=new be;let n=e.credit;typeof n=="string"&&(n=new Rt(n)),this._credit=n}Object.defineProperties(UL.prototype,{errorEvent:{get:function(){return this._errorEvent}},credit:{get:function(){return this._credit}},tilingScheme:{get:function(){return this._tilingScheme}},hasWaterMask:{get:function(){return!1}},hasVertexNormals:{get:function(){return!1}},availability:{get:function(){}},width:{get:function(){return this._width}},height:{get:function(){return this._height}}});UL.prototype.requestTileGeometry=function(e,t,n,i){let o=this._callback(e,t,n);if(!l(o))return;let r=this._width,s=this._height;return Promise.resolve(o).then(function(a){let c=a;return Array.isArray(c)&&(c=new Float64Array(c)),new za({buffer:c,width:r,height:s})})};UL.prototype.getLevelMaximumGeometricError=function(e){return this._levelZeroMaximumGeometricError/(1<<e)};UL.prototype.getTileDataAvailable=function(e,t,n){};UL.prototype.loadTileDataAvailability=function(e,t,n){};var G7=UL;var R8i=T(S(),1);var pTt=1953029805,bTt=2917034100;function E7(e,t){if(E7.passThroughDataForTesting)return t;let n=e.byteLength;if(n===0||n%4!==0)throw new ce("The length of key must be greater than 0 and a multiple of 4.");let i=new DataView(t),o=i.getUint32(0,!0);if(o===pTt||o===bTt)return t;let r=new DataView(e),s=0,a=t.byteLength,c=a-a%8,d=n,u,h=8;for(;s<c;)for(h=(h+8)%24,u=h;s<c&&u<d;)i.setUint32(s,i.getUint32(s,!0)^r.getUint32(u,!0),!0),i.setUint32(s+4,i.getUint32(s+4,!0)^r.getUint32(u+4,!0),!0),s+=8,u+=24;if(s<a)for(u>=d&&(h=(h+8)%24,u=h);s<a;)i.setUint8(s,i.getUint8(s)^r.getUint8(u)),s++,u++}E7.passThroughDataForTesting=!1;var MM=E7;var G8i=T(S(),1);function DSe(e){this.proxy=e}DSe.prototype.getURL=function(e){let t=this.proxy.indexOf("?")===-1?"?":"";return this.proxy+t+encodeURIComponent(e)};var I7=DSe;var P8i=T(S(),1);function dB(){fe.throwInstantiationError()}Object.defineProperties(dB.prototype,{credit:{get:fe.throwInstantiationError}});dB.getCreditsFromResult=function(e){if(l(e.attributions))return e.attributions.map(Rt.getIonCredit)};dB.prototype.geocode=fe.throwInstantiationError;var DL=dB;var w8i=T(S(),1),gTt={SEARCH:0,AUTOCOMPLETE:1},Qy=Object.freeze(gTt);var M8i=T(S(),1);function BSe(){fe.throwInstantiationError()}BSe.createGeometry=function(e){fe.throwInstantiationError()};var X7=BSe;var r7i=T(S(),1),CTt=T(W7(),1);var Y8i=T(S(),1);var U8i=T(S(),1);function yTt(e,t){return(e&t)!==0}var Xc=yTt;var xTt=[1,2,4,8],OSe=15,_Tt=16,TTt=64,STt=128;function xp(e,t,n,i,o,r){this._bits=e,this.cnodeVersion=t,this.imageryVersion=n,this.terrainVersion=i,this.imageryProvider=o,this.terrainProvider=r,this.ancestorHasTerrain=!1,this.terrainState=void 0}xp.clone=function(e,t){return l(t)?(t._bits=e._bits,t.cnodeVersion=e.cnodeVersion,t.imageryVersion=e.imageryVersion,t.terrainVersion=e.terrainVersion,t.imageryProvider=e.imageryProvider,t.terrainProvider=e.terrainProvider):t=new xp(e._bits,e.cnodeVersion,e.imageryVersion,e.terrainVersion,e.imageryProvider,e.terrainProvider),t.ancestorHasTerrain=e.ancestorHasTerrain,t.terrainState=e.terrainState,t};xp.prototype.setParent=function(e){this.ancestorHasTerrain=e.ancestorHasTerrain||this.hasTerrain()};xp.prototype.hasSubtree=function(){return Xc(this._bits,_Tt)};xp.prototype.hasImagery=function(){return Xc(this._bits,TTt)};xp.prototype.hasTerrain=function(){return Xc(this._bits,STt)};xp.prototype.hasChildren=function(){return Xc(this._bits,OSe)};xp.prototype.hasChild=function(e){return Xc(this._bits,xTt[e])};xp.prototype.getChildBitmask=function(){return this._bits&OSe};var NM=xp;function VTt(e){let t=e.length,n=new ArrayBuffer(t),i=new Uint8Array(n);for(let o=0;o<t;++o)i[o]=e.charCodeAt(o);return n}var LTt=VTt(`E\xF4\xBD\vy\xE2jE"\x92,\xCDq\xF8IFgQ\0B%\xC6\xE8a,f)\b\xC64\xDCjb%y wmi\xD6\xF0\x9Ck\x93\xA1\xBDNu\xE0A[\xDF@V\f\xD9\xBBr\x9B\x81|3S\xEEOl\xD4q\xB0{\xC0\x7FEVZ\xADwUe\v3\x92*\xACl5\xC50s\xF83>mF8J\xB4\xDD\xF0.\xDDu\xDA\x8CDt"\xFAa"\f3"So\xAF9D\v\x8C9\xD99L\xB9\xBF\x7F\xAB\\\x8CP_\x9F"ux\xE9\x07q\x91h;\xC1\xC4\x9B\x7F\xF0<VqH\x82'UfYNe\x98u\xA3aF}a?A\0\x9F\xD7\xB44M\xCE\x87F\xB0\xD5\xB8\x8A'{\x8B\xDC+\xBBMg0\xC8\xD1\xF6\\\x8FP\xFA[/F\x9Bn5/'C.\xEB \f^\xA5s\x1Be4\xE5l.jC'c#U\xA9?q{gC}:\xAF\xCD\xE2TU\x9C\xFDK\xC6\xE2\x9F/(\xED\xCB\\\xC6-f\x07\x88\xA7;/*"N\xB0k.\xDD\r\x95}}G\xBAC\xB2\xB2+>M\xAA>}\xE6\xCEI\x89\xC6\xE6x\fa1-\xA4O\xA5~q \x88\xEC\r1\xE8N\v\0nPh}=\b\r\x95\xA6n\xA3h\x97$[k\xF3#\xF3\xB6s\xB3\r\v@\xC0\x9F\xD8Q]\xFA".j\xDFI\0\xB9\xA0wU\xC6\xEFj\xBF{GL\x7F\x83\xEE\xDC\xDCF\x85\xA9\xADS\x07+S4\x07\xFF\x94Y\xE48\xE81\x83N\xB9XFk\xCB-#\x86\x92p\x005\x88"\xCF1\xB2&/\xE7\xC3u-6,rt\xB0#G\xB7\xD3\xD1&\x857r\xE2\0\x8CD\xCF\xDA3-\xDE\`\x86i#i*|\xCDKQ\r\x95T9w.)\xEA\x1B\xA6P\xA2j\x8FoP\x99\\>T\xFB\xEFP[\v\x07E\x89m(w7\xDB\x8EJfJo\x99 \xE5p\xE2\xB9q~\fmI-z\xFEr\xC7\xF2Y0\x8F\xBB]s\xE5\xC9 \xEAx\xEC \x90\xF0\x8A\x7FB|G\`\xB0\xBD&\xB7q\xB6\xC7\x9F\xD13\x82=\xD3\xAB\xEEc\x99\xC8+S\xA0D\\q\xC6\xCCD2O<\xCA\xC0)=R\xD3aX\xA9}e\xB4\xDC\xCF\r\xF4=\xF1\b\xA9B\xDA# \xD8\xBF^PI\xF8M\xC0\xCBGLO\xF7{+\xD8\xC51\x92;\xB5o\xDCl\r\x92\x88\xD1\x9E\xDB?\xE2\xE9\xDA_\xD4\x84\xE2FaZ\xDEU\xCF\xA4\0\xBE\xFD\xCEg\xF1Ji\x97\xE6 H\xD8]\x7F~\xAEq N\xAE\xC0V\xA9\x91<\x82r\xE7v\xEC)I\xD6]-\x83\xE3\xDB6\xA9;f\x97\x87j\xD5\xB6=P^R\xB9K\xC7sWx\xC9\xF4.Y\x07\x95\x93o\xD0KW>''\xC7\`\xDB;\xED\x9ASD>?\x8D\x92mw\xA2 \xEB?R\xA8\xC6U^1I7\x85\xF4\xC5&-\xA9\xBF\x8B'T\xDA\xC3j \xE5*x\xB0\xD6\x90pr\xAA\x8Bh\xBD\x88\xF7_H\xB1~\xC0XL?f\xF9>\xE1e\xC0p\xA7\xCF8i\xAF\xF0VldI\x9C'\xADxtO\xC2\x87\xDEV9\0\xDAw\v\xCB-\x1B\x89\xFB5O\xF5\bQ\`\xC1 ZGM&30x\xDA\xC0\x9CFG\xE2[y\`In7gS >\xE9\xECF9\xB2\xF14\r\xC6\x84Sun\xE1\fY\xD9\xDE)\x85{II\xA5wy\xBEIV.6\xE7\v:\xBBOb{\xD2M1\x95/\xBD8{\xA8O!\xE1\xECFpv\x95})"x\x88 \x90\xDD\x9D\\\xDA\xDEQ\xCF\xF0\xFCYRe|3\xDF\xF3H\xDA\xBB*u\xDB\`\xB2\xD4\xFC\xED\x1B\xEC\x7F5\xA8\xFF(1\x07-\xC8\xDC\x88F|\x8A["`);function lu(e){this.imageryPresent=!0,this.protoImagery=void 0,this.terrainPresent=!0,this.negativeAltitudeExponentBias=32,this.negativeAltitudeThreshold=W.EPSILON12,this.providers={},this.key=void 0,this._resource=void 0,this._quadPacketVersion=1,this._tileInfo={},this._subtreePromises={}}Object.defineProperties(lu.prototype,{url:{get:function(){return this._resource.url}},proxy:{get:function(){return this._resource.proxy}},resource:{get:function(){return this._resource}}});lu.fromUrl=async function(e){let t=e;typeof t!="string"&&!(t instanceof Re)&&(t=e.url);let n=Re.createIfNeeded(t);n.appendForwardSlash();let i=new lu;i._resource=n;try{await RTt(i),await i.getQuadTreePacket("",i._quadPacketVersion)}catch(o){let r=`An error occurred while accessing ${HSe(i,"",1).url}: ${o}`;throw new ce(r)}return i};lu.tileXYToQuadKey=function(e,t,n){let i="";for(let o=n;o>=0;--o){let r=1<<o,s=0;Xc(t,r)?Xc(e,r)&&(s|=1):(s|=2,Xc(e,r)||(s|=1)),i+=s}return i};lu.quadKeyToTileXY=function(e){let t=0,n=0,i=e.length-1;for(let o=i;o>=0;--o){let r=1<<o,s=+e[i-o];Xc(s,2)?Xc(s,1)||(t|=r):(n|=r,Xc(s,1)&&(t|=r))}return{x:t,y:n,level:i}};lu.prototype.isValid=function(e){let t=this.getTileInformationFromQuadKey(e);if(l(t))return t!==null;let n=!0,i=e,o;for(;i.length>1;)if(o=i.substring(i.length-1),i=i.substring(0,i.length-1),t=this.getTileInformationFromQuadKey(i),l(t)){!t.hasSubtree()&&!t.hasChild(parseInt(o))&&(n=!1);break}else if(t===null){n=!1;break}return n};var YSe=new Ti("decodeGoogleEarthEnterprisePacket");lu.prototype.getQuadTreePacket=function(e,t,n){t=y(t,1),e=y(e,"");let o=HSe(this,e,t,n).fetchArrayBuffer();if(!l(o))return;let r=this._tileInfo,s=this.key;return o.then(function(a){return YSe.scheduleTask({buffer:a,quadKey:e,type:"Metadata",key:s},[a]).then(function(d){let u,h=-1;if(e!==""){h=e.length+1;let f=d[e];u=r[e],u._bits|=f._bits,delete d[e]}let p=Object.keys(d);p.sort(function(f,x){return f.length-x.length});let g=p.length;for(let f=0;f<g;++f){let x=p[f];if(d[x]!==null){let C=NM.clone(d[x]),V=x.length;if(V===h)C.setParent(u);else if(V>1){let L=r[x.substring(0,x.length-1)];C.setParent(L)}r[x]=C}else r[x]=null}})})};lu.prototype.populateSubtree=function(e,t,n,i){let o=lu.tileXYToQuadKey(e,t,n);return w7(this,o,i)};function w7(e,t,n){let i=e._tileInfo,o=t,r=i[o];if(l(r)&&(!r.hasSubtree()||r.hasChildren()))return r;for(;r===void 0&&o.length>1;)o=o.substring(0,o.length-1),r=i[o];let s,a=e._subtreePromises,c=a[o];if(l(c))return c.then(function(){return s=new Qo({throttle:n.throttle,throttleByServer:n.throttleByServer,type:n.type,priorityFunction:n.priorityFunction}),w7(e,t,s)});if(!l(r)||!r.hasSubtree())return Promise.reject(new ce(`Couldn't load metadata for tile ${t}`));if(c=e.getQuadTreePacket(o,r.cnodeVersion,n),!!l(c))return a[o]=c,c.then(function(){return s=new Qo({throttle:n.throttle,throttleByServer:n.throttleByServer,type:n.type,priorityFunction:n.priorityFunction}),w7(e,t,s)}).finally(function(){delete a[o]})}lu.prototype.getTileInformation=function(e,t,n){let i=lu.tileXYToQuadKey(e,t,n);return this._tileInfo[i]};lu.prototype.getTileInformationFromQuadKey=function(e){return this._tileInfo[e]};function HSe(e,t,n,i){return e._resource.getDerivedResource({url:`flatfile?q2-0${t}-q.${n.toString()}`,request:i})}var P7,v7;function RTt(e){let t=e._resource.getDerivedResource({url:"dbRoot.v5",queryParameters:{output:"proto"}});if(!l(v7)){let n=on("ThirdParty/google-earth-dbroot-parser.js"),i=window.cesiumGoogleEarthDbRootParser;v7=hx(n).then(function(){P7=window.cesiumGoogleEarthDbRootParser(CTt),l(i)?window.cesiumGoogleEarthDbRootParser=i:delete window.cesiumGoogleEarthDbRootParser})}return v7.then(function(){return t.fetchArrayBuffer()}).then(function(n){let i=P7.EncryptedDbRootProto.decode(new Uint8Array(n)),o=i.encryptionData,r=o.byteOffset,s=r+o.byteLength,a=e.key=o.buffer.slice(r,s);o=i.dbrootData,r=o.byteOffset,s=r+o.byteLength;let c=o.buffer.slice(r,s);return YSe.scheduleTask({buffer:c,type:"DbRoot",key:a},[c])}).then(function(n){let i=P7.DbRootProto.decode(new Uint8Array(n.buffer));if(e.imageryPresent=y(i.imageryPresent,e.imageryPresent),e.protoImagery=i.protoImagery,e.terrainPresent=y(i.terrainPresent,e.terrainPresent),l(i.endSnippet)&&l(i.endSnippet.model)){let a=i.endSnippet.model;e.negativeAltitudeExponentBias=y(a.negativeAltitudeExponentBias,e.negativeAltitudeExponentBias),e.negativeAltitudeThreshold=y(a.compressedNegativeAltitudeThreshold,e.negativeAltitudeThreshold)}l(i.databaseVersion)&&(e._quadPacketVersion=y(i.databaseVersion.quadtreeVersion,e._quadPacketVersion));let o=e.providers,r=y(i.providerInfo,[]),s=r.length;for(let a=0;a<s;++a){let c=r[a],d=c.copyrightString;l(d)&&(o[c.providerId]=new Rt(d.value))}}).catch(function(){console.log(`Failed to retrieve ${t.url}. Using defaults.`),e.key=LTt})}var v0=lu;var S7i=T(S(),1);function XS(e){e=y(e,y.EMPTY_OBJECT),this._buffer=e.buffer,this._credits=e.credits,this._negativeAltitudeExponentBias=e.negativeAltitudeExponentBias,this._negativeElevationThreshold=e.negativeElevationThreshold;let t=y(e.childTileMask,15),n=t&3;n|=t&4?8:0,n|=t&8?4:0,this._childTileMask=n,this._createdByUpsampling=y(e.createdByUpsampling,!1),this._skirtHeight=void 0,this._bufferType=this._buffer.constructor,this._mesh=void 0,this._minimumHeight=void 0,this._maximumHeight=void 0}Object.defineProperties(XS.prototype,{credits:{get:function(){return this._credits}},waterMask:{get:function(){}}});var JSe="createVerticesFromGoogleEarthEnterpriseBuffer",ZTt=new Ti(JSe),GTt=new Ti(JSe,Mh.maximumAsynchronousTasks),zSe=new le,F7=new le;XS.prototype.createMesh=function(e){e=y(e,y.EMPTY_OBJECT);let t=e.tilingScheme,n=e.x,i=e.y,o=e.level,r=y(e.exaggeration,1),s=y(e.exaggerationRelativeHeight,0),a=y(e.throttle,!0),c=t.ellipsoid;t.tileXYToNativeRectangle(n,i,o,zSe),t.tileXYToRectangle(n,i,o,F7);let d=c.cartographicToCartesian(le.center(F7)),h=40075.16/(1<<o);this._skirtHeight=Math.min(h*8,1e3);let g=(a?GTt:ZTt).scheduleTask({buffer:this._buffer,nativeRectangle:zSe,rectangle:F7,relativeToCenter:d,ellipsoid:c,skirtHeight:this._skirtHeight,exaggeration:r,exaggerationRelativeHeight:s,includeWebMercatorT:!0,negativeAltitudeExponentBias:this._negativeAltitudeExponentBias,negativeElevationThreshold:this._negativeElevationThreshold});if(!l(g))return;let f=this;return g.then(function(x){return f._mesh=new mm(d,new Float32Array(x.vertices),new Uint16Array(x.indices),x.indexCountWithoutSkirts,x.vertexCountWithoutSkirts,x.minimumHeight,x.maximumHeight,de.clone(x.boundingSphere3D),m.clone(x.occludeePointInScaledSpace),x.numberOfAttributes,Gn.clone(x.orientedBoundingBox),Rc.clone(x.encoding),x.westIndicesSouthToNorth,x.southIndicesEastToWest,x.eastIndicesNorthToSouth,x.northIndicesWestToEast),f._minimumHeight=x.minimumHeight,f._maximumHeight=x.maximumHeight,f._buffer=void 0,f._mesh})};XS.prototype.interpolateHeight=function(e,t,n){let i=W.clamp((t-e.west)/e.width,0,1),o=W.clamp((n-e.south)/e.height,0,1);return l(this._mesh)?PTt(this,i,o):FTt(this,i,o,e)};var ETt=new Ti("upsampleQuantizedTerrainMesh",Mh.maximumAsynchronousTasks);XS.prototype.upsample=function(e,t,n,i,o,r,s){let a=this._mesh;if(!l(this._mesh))return;let c=t*2!==o,d=n*2===r,u=e.ellipsoid,h=e.tileXYToRectangle(o,r,s),p=ETt.scheduleTask({vertices:a.vertices,indices:a.indices,indexCountWithoutSkirts:a.indexCountWithoutSkirts,vertexCountWithoutSkirts:a.vertexCountWithoutSkirts,encoding:a.encoding,minimumHeight:this._minimumHeight,maximumHeight:this._maximumHeight,isEastChild:c,isNorthChild:d,childRectangle:h,ellipsoid:u});if(!l(p))return;let g=this;return p.then(function(f){let x=new Uint16Array(f.vertices),_=Me.createTypedArray(x.length/3,f.indices),C=g._skirtHeight;return new GS({quantizedVertices:x,indices:_,minimumHeight:f.minimumHeight,maximumHeight:f.maximumHeight,boundingSphere:de.clone(f.boundingSphere),orientedBoundingBox:Gn.clone(f.orientedBoundingBox),horizonOcclusionPoint:m.clone(f.horizonOcclusionPoint),westIndices:f.westIndices,southIndices:f.southIndices,eastIndices:f.eastIndices,northIndices:f.northIndices,westSkirtHeight:C,southSkirtHeight:C,eastSkirtHeight:C,northSkirtHeight:C,childTileMask:0,createdByUpsampling:!0,credits:g._credits})})};XS.prototype.isChildAvailable=function(e,t,n,i){let o=2;return n!==e*2&&++o,i!==t*2&&(o-=2),(this._childTileMask&1<<o)!==0};XS.prototype.wasCreatedByUpsampling=function(){return this._createdByUpsampling};var ITt=new D,XTt=new D,WTt=new D,QSe=new m;function PTt(e,t,n){let i=e._mesh,o=i.vertices,r=i.encoding,s=i.indices;for(let a=0,c=s.length;a<c;a+=3){let d=s[a],u=s[a+1],h=s[a+2],p=r.decodeTextureCoordinates(o,d,ITt),g=r.decodeTextureCoordinates(o,u,XTt),f=r.decodeTextureCoordinates(o,h,WTt),x=W0.computeBarycentricCoordinates(t,n,p.x,p.y,g.x,g.y,f.x,f.y,QSe);if(x.x>=-1e-15&&x.y>=-1e-15&&x.z>=-1e-15){let _=r.decodeHeight(o,d),C=r.decodeHeight(o,u),V=r.decodeHeight(o,h);return x.x*_+x.y*C+x.z*V}}}var vTt=Uint16Array.BYTES_PER_ELEMENT,KSe=Uint32Array.BYTES_PER_ELEMENT,A7=Int32Array.BYTES_PER_ELEMENT,wTt=Float32Array.BYTES_PER_ELEMENT,M7=Float64Array.BYTES_PER_ELEMENT;function FTt(e,t,n,i){let o=e._buffer,r=0,s=0,a=0;n>.5?(t>.5?(r=2,s=.5):r=3,a=.5):t>.5&&(r=1,s=.5);let c=new DataView(o),d=0;for(let G=0;G<r;++G)d+=c.getUint32(d,!0),d+=KSe;d+=KSe,d+=2*M7;let u=W.toRadians(c.getFloat64(d,!0)*180);d+=M7;let h=W.toRadians(c.getFloat64(d,!0)*180);d+=M7;let p=i.width/u/2,g=i.height/h/2,f=c.getInt32(d,!0);d+=A7;let x=c.getInt32(d,!0)*3;d+=A7,d+=A7;let _=new Array(f),C=new Array(f),V=new Array(f),L;for(L=0;L<f;++L)_[L]=s+c.getUint8(d++)*p,C[L]=a+c.getUint8(d++)*g,V[L]=c.getFloat32(d,!0)*6371010,d+=wTt;let R=new Array(x);for(L=0;L<x;++L)R[L]=c.getUint16(d,!0),d+=vTt;for(L=0;L<x;L+=3){let G=R[L],I=R[L+1],v=R[L+2],P=_[G],w=_[I],A=_[v],b=C[G],Z=C[I],E=C[v],X=W0.computeBarycentricCoordinates(t,n,P,b,w,Z,A,E,QSe);if(X.x>=-1e-15&&X.y>=-1e-15&&X.z>=-1e-15)return X.x*V[G]+X.y*V[I]+X.z*V[v]}}var BL=XS;var k7i=T(S(),1);var Tm={UNKNOWN:0,NONE:1,SELF:2,PARENT:3},uB=new q;function mB(){this._terrainCache={},this._lastTidy=q.now()}mB.prototype.add=function(e,t){this._terrainCache[e]={buffer:t,timestamp:q.now()}};mB.prototype.get=function(e){let n=this._terrainCache[e];if(l(n))return delete this._terrainCache[e],n.buffer};mB.prototype.tidy=function(){if(q.now(uB),q.secondsDifference(uB,this._lastTidy)>10){let e=this._terrainCache,t=Object.keys(e),n=t.length;for(let i=0;i<n;++i){let o=t[i],r=e[o];q.secondsDifference(uB,r.timestamp)>10&&delete e[o]}q.clone(uB,this._lastTidy)}};function jy(e){e=y(e,y.EMPTY_OBJECT),this._tilingScheme=new Qi({numberOfLevelZeroTilesX:2,numberOfLevelZeroTilesY:2,rectangle:new le(-W.PI,-W.PI,W.PI,W.PI),ellipsoid:e.ellipsoid});let t=e.credit;typeof t=="string"&&(t=new Rt(t)),this._credit=t,this._levelZeroMaximumGeometricError=40075.16,this._terrainCache=new mB,this._terrainPromises={},this._terrainRequests={},this._errorEvent=new be}Object.defineProperties(jy.prototype,{url:{get:function(){return this._metadata.url}},proxy:{get:function(){return this._metadata.proxy}},tilingScheme:{get:function(){return this._tilingScheme}},errorEvent:{get:function(){return this._errorEvent}},credit:{get:function(){return this._credit}},hasWaterMask:{get:function(){return!1}},hasVertexNormals:{get:function(){return!1}},availability:{get:function(){}}});jy.fromMetadata=function(e,t){if(!e.terrainPresent)throw new ce(`The server ${e.url} doesn't have terrain`);let n=new jy(t);return n._metadata=e,n};var ATt=new Ti("decodeGoogleEarthEnterprisePacket");function jSe(e,t,n){let i=t.getChildBitmask();if(t.terrainState===Tm.PARENT){i=0;for(let o=0;o<4;++o){let r=n.getTileInformationFromQuadKey(e+o.toString());l(r)&&r.hasTerrain()&&(i|=1<<o)}}return i}jy.prototype.requestTileGeometry=function(e,t,n,i){let o=v0.tileXYToQuadKey(e,t,n),r=this._terrainCache,s=this._metadata,a=s.getTileInformationFromQuadKey(o);if(!l(a))return Promise.reject(new ce("Terrain tile doesn't exist"));let c=a.terrainState;l(c)||(c=a.terrainState=Tm.UNKNOWN);let d=r.get(o);if(l(d)){let C=s.providers[a.terrainProvider];return Promise.resolve(new BL({buffer:d,childTileMask:jSe(o,a,s),credits:l(C)?[C]:void 0,negativeAltitudeExponentBias:s.negativeAltitudeExponentBias,negativeElevationThreshold:s.negativeAltitudeThreshold}))}if(r.tidy(),a.ancestorHasTerrain){if(c===Tm.NONE)return Promise.reject(new ce("Terrain tile doesn't exist"))}else return Promise.resolve(new za({buffer:new Uint8Array(16*16),width:16,height:16}));let u,h=o,p=-1;switch(c){case Tm.SELF:p=a.terrainVersion;break;case Tm.PARENT:h=h.substring(0,h.length-1),u=s.getTileInformationFromQuadKey(h),p=u.terrainVersion;break;case Tm.UNKNOWN:a.hasTerrain()?p=a.terrainVersion:(h=h.substring(0,h.length-1),u=s.getTileInformationFromQuadKey(h),l(u)&&u.hasTerrain()&&(p=u.terrainVersion));break}if(p<0)return Promise.reject(new ce("Terrain tile doesn't exist"));let g=this._terrainPromises,f=this._terrainRequests,x,_;if(l(g[h]))x=g[h],_=f[h];else{_=i;let C=MTt(this,h,p,_).fetchArrayBuffer();if(!l(C))return;x=C.then(function(V){return l(V)?ATt.scheduleTask({buffer:V,type:"Terrain",key:s.key},[V]).then(function(L){let R=s.getTileInformationFromQuadKey(h);R.terrainState=Tm.SELF,r.add(h,L[0]);let G=R.terrainProvider,I=L.length-1;for(let v=0;v<I;++v){let P=h+v.toString(),w=s.getTileInformationFromQuadKey(P);l(w)&&(r.add(P,L[v+1]),w.terrainState=Tm.PARENT,w.terrainProvider===0&&(w.terrainProvider=G))}}):Promise.reject(new ce("Failed to load terrain."))}),g[h]=x,f[h]=_,x=x.finally(function(){delete g[h],delete f[h]})}return x.then(function(){let C=r.get(o);if(l(C)){let V=s.providers[a.terrainProvider];return new BL({buffer:C,childTileMask:jSe(o,a,s),credits:l(V)?[V]:void 0,negativeAltitudeExponentBias:s.negativeAltitudeExponentBias,negativeElevationThreshold:s.negativeAltitudeThreshold})}return Promise.reject(new ce("Failed to load terrain."))}).catch(function(C){return _.state===ei.CANCELLED?(i.state=_.state,Promise.reject(C)):(a.terrainState=Tm.NONE,Promise.reject(C))})};jy.prototype.getLevelMaximumGeometricError=function(e){return this._levelZeroMaximumGeometricError/(1<<e)};jy.prototype.getTileDataAvailable=function(e,t,n){let i=this._metadata,o=v0.tileXYToQuadKey(e,t,n),r=i.getTileInformation(e,t,n);if(r===null)return!1;if(l(r)){if(!r.ancestorHasTerrain)return!0;let s=r.terrainState;if(s===Tm.NONE)return!1;if((!l(s)||s===Tm.UNKNOWN)&&(r.terrainState=Tm.UNKNOWN,!r.hasTerrain())){o=o.substring(0,o.length-1);let a=i.getTileInformationFromQuadKey(o);if(!l(a)||!a.hasTerrain())return!1}return!0}if(i.isValid(o)){let s=new Qo({throttle:!1,throttleByServer:!0,type:ms.TERRAIN});i.populateSubtree(e,t,n,s)}return!1};jy.prototype.loadTileDataAvailability=function(e,t,n){};function MTt(e,t,n,i){return n=l(n)&&n>0?n:1,e._metadata.resource.getDerivedResource({url:`flatfile?f1c-0${t}-t.${n.toString()}`,request:i})}var N7=jy;var z7i=T(S(),1);var NTt="https://maps.googleapis.com/maps/api/geocode/json",qSe='<img alt="Google" src="https://assets.ion.cesium.com/google-credit.png" style="vertical-align:-5px">';function k7(e){e=y(e,y.EMPTY_OBJECT);let t=e.key;this._resource=new Re({url:NTt,queryParameters:{key:t}}),this._credit=new Rt(qSe,!0)}Object.defineProperties(k7.prototype,{credit:{get:function(){return this._credit}}});k7.prototype.geocode=async function(e){let n=await this._resource.getDerivedResource({queryParameters:{address:e}}).fetchJson();if(n.status==="ZERO_RESULTS")return[];if(n.status!=="OK")throw new ce(`GoogleGeocoderService got a bad response ${n.status}: ${n.error_message}`);return n.results.map(o=>{let r=o.geometry.viewport.southwest,s=o.geometry.viewport.northeast;return{displayName:o.formatted_address,destination:le.fromDegrees(r.lng,r.lat,s.lng,s.lat),attribution:{html:qSe,collapsible:!1}}})};var U7=k7;var j7i=T(S(),1);var hB={};hB.defaultApiKey=void 0;hB.mapTilesApiEndpoint=new Re({url:"https://tile.googleapis.com/v1/"});hB.getDefaultCredit=function(){return new Rt('<img src="https://assets.ion.cesium.com/google-credit.png" style="vertical-align: -5px" alt="Google">',!0)};var WS=hB;var e6i=T(S(),1);var kM={};kM.type=void 0;kM.getRequiredDataPoints=fe.throwInstantiationError;kM.interpolateOrderZero=fe.throwInstantiationError;kM.interpolate=fe.throwInstantiationError;var D7=kM;var n6i=T(S(),1),kTt={GOOGLE:"GOOGLE",BING:"BING",DEFAULT:"DEFAULT"},w0=Object.freeze(kTt);var x6i=T(S(),1);var l6i=T(S(),1);function B7(e){this._url=Re.createIfNeeded(e),this._url.appendForwardSlash()}Object.defineProperties(B7.prototype,{url:{get:function(){return this._url}},credit:{get:function(){}}});B7.prototype.geocode=async function(e,t){return this._url.getDerivedResource({url:t===Qy.AUTOCOMPLETE?"autocomplete":"search",queryParameters:{text:e}}).fetchJson().then(function(i){return i.features.map(function(o){let r,s=o.bbox;if(l(s))r=le.fromDegrees(s[0],s[1],s[2],s[3]);else{let a=o.geometry.coordinates[0],c=o.geometry.coordinates[1];r=m.fromDegrees(a,c)}return{displayName:o.properties.label,destination:r,attributions:i.attributions}})})};var UM=B7;function UTt(e){if(!Object.values(w0).some(t=>t===e))throw new fe(`Invalid geocodeProviderType: "${e}"`)}var $Se=Object.freeze({[w0.GOOGLE]:"google",[w0.BING]:"bing",[w0.DEFAULT]:void 0});function DTt(e){return $Se[e]}function BTt(e){return Object.entries($Se).find(t=>t[1]===e)[0]}function O7(e){e=y(e,y.EMPTY_OBJECT);let t=y(e.geocodeProviderType,w0.DEFAULT),n=y(e.accessToken,zm.defaultAccessToken),i=Re.createIfNeeded(y(e.server,zm.defaultServer));i.appendForwardSlash();let o=zm.getDefaultTokenCredit(n);l(o)&&e.scene.frameState.creditDisplay.addStaticCredit(Rt.clone(o));let r=i.getDerivedResource({url:"v1/geocode"});l(n)&&r.appendQueryParameters({access_token:n}),this._accessToken=n,this._server=i,this._pelias=new UM(r),this.geocodeProviderType=t}Object.defineProperties(O7.prototype,{credit:{get:function(){}},geocodeProviderType:{get:function(){return BTt(this._pelias.url.queryParameters.geocoder)},set:function(e){UTt(e);let t={...this._pelias.url.queryParameters,geocoder:DTt(e)};l(t.geocoder)||delete t.geocoder,this._pelias.url.setQueryParameters(t)}}});O7.prototype.geocode=async function(e,t){return this._pelias.geocode(e,t)};var PS=O7;var C6i=T(S(),1);var Wc={};Wc.ExportStatus=Object.freeze({NotStarted:"NotStarted",InProgress:"InProgress",Complete:"Complete",Invalid:"Invalid"});Wc.ExportType=Object.freeze({IMODEL:"IMODEL",CESIUM:"CESIUM","3DTILES":"3DTILES"});Wc.RealityDataType=Object.freeze({Cesium3DTiles:"Cesium3DTiles",PNTS:"PNTS",RealityMesh3DTiles:"RealityMesh3DTiles",Terrain3DTiles:"Terrain3DTiles",KML:"KML",GeoJSON:"GeoJSON",Unstructured:"Unstructured"});Wc.defaultAccessToken=void 0;Wc.apiEndpoint=new Re({url:"https://api.bentley.com"});Wc.getExports=async function(e){let t=new Re({url:`${Wc.apiEndpoint}mesh-export`,headers:{Authorization:`Bearer ${Wc.defaultAccessToken}`,Accept:"application/vnd.bentley.itwin-platform.v1+json",Prefer:"return=representation"},queryParameters:{iModelId:e,exportType:Wc.ExportType["3DTILES"],$top:"5",client:"CesiumJS"}});typeof CESIUM_VERSION<"u"&&t.appendQueryParameters({clientVersion:CESIUM_VERSION});try{return await t.fetchJson()}catch(n){let i=JSON.parse(n.response);throw n.statusCode===401?new ce(`Unauthorized, bad token, wrong scopes or headers bad. ${i.error.details[0].code}`):n.statusCode===403?(console.error(i.error.code,i.error.message),new ce("Not allowed, forbidden")):n.statusCode===422?new ce(`Unprocessable Entity:${i.error.code} ${i.error.message}`):n.statusCode===429?new ce("Too many requests"):new ce(`Unknown request failure ${n.statusCode}`)}};Wc.getRealityDataMetadata=async function(e,t){let n=new Re({url:`${Wc.apiEndpoint}reality-management/reality-data/${t}`,headers:{Authorization:`Bearer ${Wc.defaultAccessToken}`,Accept:"application/vnd.bentley.itwin-platform.v1+json"},queryParameters:{iTwinId:e}});try{return(await n.fetchJson()).realityData}catch(i){let o=JSON.parse(i.response);throw i.statusCode===401?new ce(`Unauthorized, bad token, wrong scopes or headers bad. ${o.error.details[0].code}`):i.statusCode===403?(console.error(o.error.code,o.error.message),new ce("Not allowed, forbidden")):i.statusCode===404?new ce(`Reality data not found: ${e}, ${t}`):i.statusCode===422?new ce(`Unprocessable Entity:${o.error.code} ${o.error.message}`):i.statusCode===429?new ce("Too many requests"):new ce(`Unknown request failure ${i.statusCode}`)}};Wc.getRealityDataURL=async function(e,t,n){let i=new Re({url:`${Wc.apiEndpoint}reality-management/reality-data/${t}/readaccess`,headers:{Authorization:`Bearer ${Wc.defaultAccessToken}`,Accept:"application/vnd.bentley.itwin-platform.v1+json"},queryParameters:{iTwinId:e}});try{let r=(await i.fetchJson())._links.containerUrl.href,s=new URL(r);return s.pathname=`${s.pathname}/${n}`,s.toString()}catch(o){let r=JSON.parse(o.response);throw o.statusCode===401?new ce(`Unauthorized, bad token, wrong scopes or headers bad. ${r.error.details[0].code}`):o.statusCode===403?(console.error(r.error.code,r.error.message),new ce("Not allowed, forbidden")):o.statusCode===404?new ce(`Reality data not found: ${e}, ${t}`):o.statusCode===422?new ce(`Unprocessable Entity:${r.error.code} ${r.error.message}`):o.statusCode===429?new ce("Too many requests"):new ce(`Unknown request failure ${o.statusCode}`)}};var Ns=Wc;var R6i=T(S(),1);function fB(){fe.throwInstantiationError()}Object.defineProperties(fB.prototype,{ellipsoid:{get:fe.throwInstantiationError}});fB.prototype.project=fe.throwInstantiationError;fB.prototype.unproject=fe.throwInstantiationError;var Y7=fB;var X6i=T(S(),1);function OL(e){e=y(e,y.EMPTY_OBJECT);let t=e.weights,n=e.times;this._times=n,this._weights=t,this._count=t.length/n.length,this._lastTimeIndex=0}Object.defineProperties(OL.prototype,{times:{get:function(){return this._times}},weights:{get:function(){return this._weights}}});OL.prototype.findTimeInterval=so.prototype.findTimeInterval;OL.prototype.wrapTime=so.prototype.wrapTime;OL.prototype.clampTime=so.prototype.clampTime;OL.prototype.evaluate=function(e,t){let n=this.weights,i=this.times,o=this._lastTimeIndex=this.findTimeInterval(e,this._lastTimeIndex),r=(e-i[o])/(i[o+1]-i[o]);l(t)||(t=new Array(this._count));for(let s=0;s<this._count;s++){let a=o*this._count+s;t[s]=n[a]*(1-r)+n[a+this._count]*r}return t};var H7=OL;var k6i=T(S(),1);function z7(e,t,n){e=Re.createIfNeeded(e),e.appendForwardSlash(),e.setQueryParameters({key:t}),this._url=e,this._params=y(n,{}),this._credit=new Rt('Geodata copyright <a href="https://www.openstreetmap.org/">OpenStreetMap</a> contributors',!1)}Object.defineProperties(z7.prototype,{url:{get:function(){return this._url}},params:{get:function(){return this._params}},credit:{get:function(){return this._credit}}});z7.prototype.geocode=async function(e){return this._url.getDerivedResource({url:"json",queryParameters:Lt(this._params,{q:e})}).fetchJson().then(function(n){return n.results.map(function(i){let o,r=i.bounds;if(l(r))o=le.fromDegrees(r.southwest.lng,r.southwest.lat,r.northeast.lng,r.northeast.lat);else{let s=i.geometry.lat,a=i.geometry.lng;o=m.fromDegrees(s,a)}return{displayName:i.formatted,destination:o}})})};var K7=z7;var B6i=T(S(),1);var OTt={packedLength:void 0,pack:fe.throwInstantiationError,unpack:fe.throwInstantiationError},J7=OTt;var H6i=T(S(),1);var YTt={packedInterpolationLength:void 0,convertPackedArrayForInterpolation:fe.throwInstantiationError,unpackInterpolationResult:fe.throwInstantiationError},Q7=YTt;var j6i=T(S(),1);var HTt=new m;function zTt(e,t,n,i){let o=Sx(e,t,n,i,HTt);return l(o)?o.x>0&&o.y>0&&o.z>0:!1}var j7=zTt;var eqi=T(S(),1);function eCe(){fe.throwInstantiationError()}eCe.prototype.getURL=fe.throwInstantiationError;var q7=eCe;var gqi=T(S(),1);function KTt(e,t,n,i,o,r,s){let a=vi.numberOfPoints(e,t,o),c,d=n.red,u=n.green,h=n.blue,p=n.alpha,g=i.red,f=i.green,x=i.blue,_=i.alpha;if(B.equals(n,i)){for(c=0;c<a;c++)r[s++]=B.floatToByte(d),r[s++]=B.floatToByte(u),r[s++]=B.floatToByte(h),r[s++]=B.floatToByte(p);return s}let C=(g-d)/a,V=(f-u)/a,L=(x-h)/a,R=(_-p)/a,G=s;for(c=0;c<a;c++)r[G++]=B.floatToByte(d+c*C),r[G++]=B.floatToByte(u+c*V),r[G++]=B.floatToByte(h+c*L),r[G++]=B.floatToByte(p+c*R);return G}function DM(e){e=y(e,y.EMPTY_OBJECT);let t=e.positions,n=e.colors,i=y(e.colorsPerVertex,!1);this._positions=t,this._colors=n,this._colorsPerVertex=i,this._arcType=y(e.arcType,tn.GEODESIC),this._granularity=y(e.granularity,W.RADIANS_PER_DEGREE),this._ellipsoid=y(e.ellipsoid,ne.default),this._workerName="createSimplePolylineGeometry";let o=1+t.length*m.packedLength;o+=l(n)?1+n.length*B.packedLength:1,this.packedLength=o+ne.packedLength+3}DM.pack=function(e,t,n){n=y(n,0);let i,o=e._positions,r=o.length;for(t[n++]=r,i=0;i<r;++i,n+=m.packedLength)m.pack(o[i],t,n);let s=e._colors;for(r=l(s)?s.length:0,t[n++]=r,i=0;i<r;++i,n+=B.packedLength)B.pack(s[i],t,n);return ne.pack(e._ellipsoid,t,n),n+=ne.packedLength,t[n++]=e._colorsPerVertex?1:0,t[n++]=e._arcType,t[n]=e._granularity,t};DM.unpack=function(e,t,n){t=y(t,0);let i,o=e[t++],r=new Array(o);for(i=0;i<o;++i,t+=m.packedLength)r[i]=m.unpack(e,t);o=e[t++];let s=o>0?new Array(o):void 0;for(i=0;i<o;++i,t+=B.packedLength)s[i]=B.unpack(e,t);let a=ne.unpack(e,t);t+=ne.packedLength;let c=e[t++]===1,d=e[t++],u=e[t];return l(n)?(n._positions=r,n._colors=s,n._ellipsoid=a,n._colorsPerVertex=c,n._arcType=d,n._granularity=u,n):new DM({positions:r,colors:s,ellipsoid:a,colorsPerVertex:c,arcType:d,granularity:u})};var pB=new Array(2),bB=new Array(2),JTt={positions:pB,height:bB,ellipsoid:void 0,minDistance:void 0,granularity:void 0};DM.createGeometry=function(e){let t=e._positions,n=e._colors,i=e._colorsPerVertex,o=e._arcType,r=e._granularity,s=e._ellipsoid,a=W.chordLength(r,s.maximumRadius),c=l(n)&&!i,d,u=t.length,h,p,g,f,x=0;if(o===tn.GEODESIC||o===tn.RHUMB){let R,G,I;o===tn.GEODESIC?(R=W.chordLength(r,s.maximumRadius),G=vi.numberOfPoints,I=vi.generateArc):(R=r,G=vi.numberOfPointsRhumbLine,I=vi.generateRhumbArc);let v=vi.extractHeights(t,s),P=JTt;if(o===tn.GEODESIC?P.minDistance=a:P.granularity=r,P.ellipsoid=s,c){let w=0;for(d=0;d<u-1;d++)w+=G(t[d],t[d+1],R)+1;h=new Float64Array(w*3),g=new Uint8Array(w*4),P.positions=pB,P.height=bB;let A=0;for(d=0;d<u-1;++d){pB[0]=t[d],pB[1]=t[d+1],bB[0]=v[d],bB[1]=v[d+1];let b=I(P);if(l(n)){let Z=b.length/3;f=n[d];for(let E=0;E<Z;++E)g[A++]=B.floatToByte(f.red),g[A++]=B.floatToByte(f.green),g[A++]=B.floatToByte(f.blue),g[A++]=B.floatToByte(f.alpha)}h.set(b,x),x+=b.length}}else if(P.positions=t,P.height=v,h=new Float64Array(I(P)),l(n)){for(g=new Uint8Array(h.length/3*4),d=0;d<u-1;++d){let A=t[d],b=t[d+1],Z=n[d],E=n[d+1];x=KTt(A,b,Z,E,a,g,x)}let w=n[u-1];g[x++]=B.floatToByte(w.red),g[x++]=B.floatToByte(w.green),g[x++]=B.floatToByte(w.blue),g[x++]=B.floatToByte(w.alpha)}}else{p=c?u*2-2:u,h=new Float64Array(p*3),g=l(n)?new Uint8Array(p*4):void 0;let R=0,G=0;for(d=0;d<u;++d){let I=t[d];if(c&&d>0&&(m.pack(I,h,R),R+=3,f=n[d-1],g[G++]=B.floatToByte(f.red),g[G++]=B.floatToByte(f.green),g[G++]=B.floatToByte(f.blue),g[G++]=B.floatToByte(f.alpha)),c&&d===u-1)break;m.pack(I,h,R),R+=3,l(n)&&(f=n[d],g[G++]=B.floatToByte(f.red),g[G++]=B.floatToByte(f.green),g[G++]=B.floatToByte(f.blue),g[G++]=B.floatToByte(f.alpha))}}let _=new fn;_.position=new Ze({componentDatatype:Q.DOUBLE,componentsPerAttribute:3,values:h}),l(n)&&(_.color=new Ze({componentDatatype:Q.UNSIGNED_BYTE,componentsPerAttribute:4,values:g,normalize:!0})),p=h.length/3;let C=(p-1)*2,V=Me.createTypedArray(p,C),L=0;for(d=0;d<p-1;++d)V[L++]=d,V[L++]=d+1;return new mt({attributes:_,indices:V,primitiveType:Ae.LINES,boundingSphere:de.fromPoints(t)})};var $7=DM;var Vqi=T(S(),1);function YL(e){let t=y(e.radius,1),i={radii:new m(t,t,t),stackPartitions:e.stackPartitions,slicePartitions:e.slicePartitions,vertexFormat:e.vertexFormat};this._ellipsoidGeometry=new ta(i),this._workerName="createSphereGeometry"}YL.packedLength=ta.packedLength;YL.pack=function(e,t,n){return ta.pack(e._ellipsoidGeometry,t,n)};var QTt=new ta,qy={radius:void 0,radii:new m,vertexFormat:new Xe,stackPartitions:void 0,slicePartitions:void 0};YL.unpack=function(e,t,n){let i=ta.unpack(e,t,QTt);return qy.vertexFormat=Xe.clone(i._vertexFormat,qy.vertexFormat),qy.stackPartitions=i._stackPartitions,qy.slicePartitions=i._slicePartitions,l(n)?(m.clone(i._radii,qy.radii),n._ellipsoidGeometry=new ta(qy),n):(qy.radius=i._radii.x,new YL(qy))};YL.createGeometry=function(e){return ta.createGeometry(e._ellipsoidGeometry)};var e6=YL;var Rqi=T(S(),1);function jTt(e){return e<=.04045?e*.07739938080495357:Math.pow((e+.055)*.9478672985781991,2.4)}var vS=jTt;var Eqi=T(S(),1);function $y(e){}Object.defineProperties($y.prototype,{ellipsoid:{get:fe.throwInstantiationError},rectangle:{get:fe.throwInstantiationError},projection:{get:fe.throwInstantiationError}});$y.prototype.getNumberOfXTilesAtLevel=fe.throwInstantiationError;$y.prototype.getNumberOfYTilesAtLevel=fe.throwInstantiationError;$y.prototype.rectangleToNativeRectangle=fe.throwInstantiationError;$y.prototype.tileXYToNativeRectangle=fe.throwInstantiationError;$y.prototype.tileXYToRectangle=fe.throwInstantiationError;$y.prototype.positionToTileXY=fe.throwInstantiationError;var t6=$y;var Fqi=T(S(),1);function wS(e){e=y(e,y.EMPTY_OBJECT),this._clock=void 0,this._element=void 0,this._clockSubscription=void 0,this._seekFunction=void 0,this._lastPlaybackRate=void 0,this.clock=e.clock,this.element=e.element,this.epoch=y(e.epoch,Be.MINIMUM_VALUE),this.tolerance=y(e.tolerance,1),this._seeking=!1,this._seekFunction=void 0,this._firstTickAfterSeek=!1}Object.defineProperties(wS.prototype,{clock:{get:function(){return this._clock},set:function(e){let t=this._clock;t!==e&&(l(t)&&(this._clockSubscription(),this._clockSubscription=void 0),l(e)&&(this._clockSubscription=e.onTick.addEventListener(wS.prototype._onTick,this)),this._clock=e)}},element:{get:function(){return this._element},set:function(e){let t=this._element;t!==e&&(l(t)&&t.removeEventListener("seeked",this._seekFunction,!1),l(e)&&(this._seeking=!1,this._seekFunction=qTt(this),e.addEventListener("seeked",this._seekFunction,!1)),this._element=e,this._seeking=!1,this._firstTickAfterSeek=!1)}}});wS.prototype.destroy=function(){return this.element=void 0,this.clock=void 0,me(this)};wS.prototype.isDestroyed=function(){return!1};wS.prototype._trySetPlaybackRate=function(e){if(this._lastPlaybackRate===e.multiplier)return;let t=this._element;try{t.playbackRate=e.multiplier}catch{t.playbackRate=0}this._lastPlaybackRate=e.multiplier};wS.prototype._onTick=function(e){let t=this._element;if(!l(t)||t.readyState<2)return;let n=t.paused,i=e.shouldAnimate;if(i===n&&(i?t.play():t.pause()),this._seeking||this._firstTickAfterSeek){this._firstTickAfterSeek=!1;return}this._trySetPlaybackRate(e);let o=e.currentTime,r=y(this.epoch,Be.MINIMUM_VALUE),s=q.secondsDifference(o,r),a=t.duration,c,d=t.currentTime;t.loop?(s=s%a,s<0&&(s=a-s),c=s):s>a?c=a:s<0?c=0:c=s;let u=i?y(this.tolerance,1):.001;Math.abs(c-d)>u&&(this._seeking=!0,t.currentTime=c)};function qTt(e){return function(){e._seeking=!1,e._firstTickAfterSeek=!0}}var n6=wS;var qqi=T(S(),1);function $Tt(e,t){this.rectangle=e,this.maxLevel=t}function tCe(e){this.ellipsoid=y(e.ellipsoid,ne.default),this.tilingScheme=void 0,this.heightmapWidth=void 0,this.heightmapHeight=void 0,this.levelZeroMaximumGeometricError=void 0,this.rectangles=[]}tCe.prototype.build=function(e){e._tilingScheme=this.tilingScheme,e._heightmapWidth=this.heightmapWidth,e._heightmapHeight=this.heightmapHeight,e._levelZeroMaximumGeometricError=this.levelZeroMaximumGeometricError,e._rectangles=this.rectangles};function eSt(e,t){let n=t.getElementsByTagName("SRS")[0].textContent;if(n==="EPSG:4326")e.tilingScheme=new Qi({ellipsoid:e.ellipsoid});else throw new ce(`SRS ${n} is not supported`);let i=t.getElementsByTagName("TileFormat")[0];e.heightmapWidth=parseInt(i.getAttribute("width"),10),e.heightmapHeight=parseInt(i.getAttribute("height"),10),e.levelZeroMaximumGeometricError=ss.getEstimatedLevelZeroGeometricErrorForAHeightmap(e.ellipsoid,Math.min(e.heightmapWidth,e.heightmapHeight),e.tilingScheme.getNumberOfXTilesAtLevel(0));let o=t.getElementsByTagName("DataExtent");for(let r=0;r<o.length;++r){let s=o[r],a=W.toRadians(parseFloat(s.getAttribute("minx"))),c=W.toRadians(parseFloat(s.getAttribute("miny"))),d=W.toRadians(parseFloat(s.getAttribute("maxx"))),u=W.toRadians(parseFloat(s.getAttribute("maxy"))),h=parseInt(s.getAttribute("maxlevel"),10);e.rectangles.push(new $Tt(new le(a,c,d,u),h))}}function tSt(e,t,n){let i=`An error occurred while accessing ${e.url}`;throw l(t)&&l(t.message)&&(i=`${i}: ${t.message}`),Go.reportError(void 0,n,l(n)?n._errorEvent:void 0,i),new ce(i)}async function nSt(e,t,n){try{let i=await t.fetchXML();eSt(e,i)}catch(i){tSt(t,i,n)}}function ex(e){e=y(e,y.EMPTY_OBJECT),this._errorEvent=new be,this._terrainDataStructure={heightScale:1/1e3,heightOffset:-1e3,elementsPerHeight:3,stride:4,elementMultiplier:256,isBigEndian:!0,lowestEncodedHeight:0,highestEncodedHeight:256*256*256-1};let t=e.credit;typeof t=="string"&&(t=new Rt(t)),this._credit=t,this._tilingScheme=void 0,this._rectangles=[]}Object.defineProperties(ex.prototype,{errorEvent:{get:function(){return this._errorEvent}},credit:{get:function(){return this._credit}},tilingScheme:{get:function(){return this._tilingScheme}},hasWaterMask:{get:function(){return!1}},hasVertexNormals:{get:function(){return!1}},availability:{get:function(){}}});ex.fromUrl=async function(e,t){t=y(t,y.EMPTY_OBJECT);let n=new tCe(t),i=Re.createIfNeeded(e);await nSt(n,i);let o=new ex(t);return n.build(o),o._resource=i,o};ex.prototype.requestTileGeometry=function(e,t,n,i){let o=this._tilingScheme.getNumberOfYTilesAtLevel(n),s=this._resource.getDerivedResource({url:`${n}/${e}/${o-t-1}.tif`,queryParameters:{cesium:!0},request:i}).fetchImage({preferImageBitmap:!0});if(!l(s))return;let a=this;return Promise.resolve(s).then(function(c){return new za({buffer:Im(c),width:a._heightmapWidth,height:a._heightmapHeight,childTileMask:iSt(a,e,t,n),structure:a._terrainDataStructure})})};ex.prototype.getLevelMaximumGeometricError=function(e){return this._levelZeroMaximumGeometricError/(1<<e)};var nCe=new le;function iSt(e,t,n,i){let o=e._tilingScheme,r=e._rectangles,s=o.tileXYToRectangle(t,n,i),a=0;for(let c=0;c<r.length&&a!==15;++c){let d=r[c];if(d.maxLevel<=i)continue;let u=d.rectangle,h=le.intersection(u,s,nCe);l(h)&&(gB(o,u,t*2,n*2,i+1)&&(a|=4),gB(o,u,t*2+1,n*2,i+1)&&(a|=8),gB(o,u,t*2,n*2+1,i+1)&&(a|=1),gB(o,u,t*2+1,n*2+1,i+1)&&(a|=2))}return a}function gB(e,t,n,i,o){let r=e.tileXYToRectangle(n,i,o);return l(le.intersection(r,t,nCe))}ex.prototype.getTileDataAvailable=function(e,t,n){};ex.prototype.loadTileDataAvailability=function(e,t,n){};var i6=ex;var e$i=T(S(),1),oSt={VK_FORMAT_UNDEFINED:0,VK_FORMAT_R4G4_UNORM_PACK8:1,VK_FORMAT_R4G4B4A4_UNORM_PACK16:2,VK_FORMAT_B4G4R4A4_UNORM_PACK16:3,VK_FORMAT_R5G6B5_UNORM_PACK16:4,VK_FORMAT_B5G6R5_UNORM_PACK16:5,VK_FORMAT_R5G5B5A1_UNORM_PACK16:6,VK_FORMAT_B5G5R5A1_UNORM_PACK16:7,VK_FORMAT_A1R5G5B5_UNORM_PACK16:8,VK_FORMAT_R8_UNORM:9,VK_FORMAT_R8_SNORM:10,VK_FORMAT_R8_USCALED:11,VK_FORMAT_R8_SSCALED:12,VK_FORMAT_R8_UINT:13,VK_FORMAT_R8_SINT:14,VK_FORMAT_R8_SRGB:15,VK_FORMAT_R8G8_UNORM:16,VK_FORMAT_R8G8_SNORM:17,VK_FORMAT_R8G8_USCALED:18,VK_FORMAT_R8G8_SSCALED:19,VK_FORMAT_R8G8_UINT:20,VK_FORMAT_R8G8_SINT:21,VK_FORMAT_R8G8_SRGB:22,VK_FORMAT_R8G8B8_UNORM:23,VK_FORMAT_R8G8B8_SNORM:24,VK_FORMAT_R8G8B8_USCALED:25,VK_FORMAT_R8G8B8_SSCALED:26,VK_FORMAT_R8G8B8_UINT:27,VK_FORMAT_R8G8B8_SINT:28,VK_FORMAT_R8G8B8_SRGB:29,VK_FORMAT_B8G8R8_UNORM:30,VK_FORMAT_B8G8R8_SNORM:31,VK_FORMAT_B8G8R8_USCALED:32,VK_FORMAT_B8G8R8_SSCALED:33,VK_FORMAT_B8G8R8_UINT:34,VK_FORMAT_B8G8R8_SINT:35,VK_FORMAT_B8G8R8_SRGB:36,VK_FORMAT_R8G8B8A8_UNORM:37,VK_FORMAT_R8G8B8A8_SNORM:38,VK_FORMAT_R8G8B8A8_USCALED:39,VK_FORMAT_R8G8B8A8_SSCALED:40,VK_FORMAT_R8G8B8A8_UINT:41,VK_FORMAT_R8G8B8A8_SINT:42,VK_FORMAT_R8G8B8A8_SRGB:43,VK_FORMAT_B8G8R8A8_UNORM:44,VK_FORMAT_B8G8R8A8_SNORM:45,VK_FORMAT_B8G8R8A8_USCALED:46,VK_FORMAT_B8G8R8A8_SSCALED:47,VK_FORMAT_B8G8R8A8_UINT:48,VK_FORMAT_B8G8R8A8_SINT:49,VK_FORMAT_B8G8R8A8_SRGB:50,VK_FORMAT_A8B8G8R8_UNORM_PACK32:51,VK_FORMAT_A8B8G8R8_SNORM_PACK32:52,VK_FORMAT_A8B8G8R8_USCALED_PACK32:53,VK_FORMAT_A8B8G8R8_SSCALED_PACK32:54,VK_FORMAT_A8B8G8R8_UINT_PACK32:55,VK_FORMAT_A8B8G8R8_SINT_PACK32:56,VK_FORMAT_A8B8G8R8_SRGB_PACK32:57,VK_FORMAT_A2R10G10B10_UNORM_PACK32:58,VK_FORMAT_A2R10G10B10_SNORM_PACK32:59,VK_FORMAT_A2R10G10B10_USCALED_PACK32:60,VK_FORMAT_A2R10G10B10_SSCALED_PACK32:61,VK_FORMAT_A2R10G10B10_UINT_PACK32:62,VK_FORMAT_A2R10G10B10_SINT_PACK32:63,VK_FORMAT_A2B10G10R10_UNORM_PACK32:64,VK_FORMAT_A2B10G10R10_SNORM_PACK32:65,VK_FORMAT_A2B10G10R10_USCALED_PACK32:66,VK_FORMAT_A2B10G10R10_SSCALED_PACK32:67,VK_FORMAT_A2B10G10R10_UINT_PACK32:68,VK_FORMAT_A2B10G10R10_SINT_PACK32:69,VK_FORMAT_R16_UNORM:70,VK_FORMAT_R16_SNORM:71,VK_FORMAT_R16_USCALED:72,VK_FORMAT_R16_SSCALED:73,VK_FORMAT_R16_UINT:74,VK_FORMAT_R16_SINT:75,VK_FORMAT_R16_SFLOAT:76,VK_FORMAT_R16G16_UNORM:77,VK_FORMAT_R16G16_SNORM:78,VK_FORMAT_R16G16_USCALED:79,VK_FORMAT_R16G16_SSCALED:80,VK_FORMAT_R16G16_UINT:81,VK_FORMAT_R16G16_SINT:82,VK_FORMAT_R16G16_SFLOAT:83,VK_FORMAT_R16G16B16_UNORM:84,VK_FORMAT_R16G16B16_SNORM:85,VK_FORMAT_R16G16B16_USCALED:86,VK_FORMAT_R16G16B16_SSCALED:87,VK_FORMAT_R16G16B16_UINT:88,VK_FORMAT_R16G16B16_SINT:89,VK_FORMAT_R16G16B16_SFLOAT:90,VK_FORMAT_R16G16B16A16_UNORM:91,VK_FORMAT_R16G16B16A16_SNORM:92,VK_FORMAT_R16G16B16A16_USCALED:93,VK_FORMAT_R16G16B16A16_SSCALED:94,VK_FORMAT_R16G16B16A16_UINT:95,VK_FORMAT_R16G16B16A16_SINT:96,VK_FORMAT_R16G16B16A16_SFLOAT:97,VK_FORMAT_R32_UINT:98,VK_FORMAT_R32_SINT:99,VK_FORMAT_R32_SFLOAT:100,VK_FORMAT_R32G32_UINT:101,VK_FORMAT_R32G32_SINT:102,VK_FORMAT_R32G32_SFLOAT:103,VK_FORMAT_R32G32B32_UINT:104,VK_FORMAT_R32G32B32_SINT:105,VK_FORMAT_R32G32B32_SFLOAT:106,VK_FORMAT_R32G32B32A32_UINT:107,VK_FORMAT_R32G32B32A32_SINT:108,VK_FORMAT_R32G32B32A32_SFLOAT:109,VK_FORMAT_R64_UINT:110,VK_FORMAT_R64_SINT:111,VK_FORMAT_R64_SFLOAT:112,VK_FORMAT_R64G64_UINT:113,VK_FORMAT_R64G64_SINT:114,VK_FORMAT_R64G64_SFLOAT:115,VK_FORMAT_R64G64B64_UINT:116,VK_FORMAT_R64G64B64_SINT:117,VK_FORMAT_R64G64B64_SFLOAT:118,VK_FORMAT_R64G64B64A64_UINT:119,VK_FORMAT_R64G64B64A64_SINT:120,VK_FORMAT_R64G64B64A64_SFLOAT:121,VK_FORMAT_B10G11R11_UFLOAT_PACK32:122,VK_FORMAT_E5B9G9R9_UFLOAT_PACK32:123,VK_FORMAT_D16_UNORM:124,VK_FORMAT_X8_D24_UNORM_PACK32:125,VK_FORMAT_D32_SFLOAT:126,VK_FORMAT_S8_UINT:127,VK_FORMAT_D16_UNORM_S8_UINT:128,VK_FORMAT_D24_UNORM_S8_UINT:129,VK_FORMAT_D32_SFLOAT_S8_UINT:130,VK_FORMAT_BC1_RGB_UNORM_BLOCK:131,VK_FORMAT_BC1_RGB_SRGB_BLOCK:132,VK_FORMAT_BC1_RGBA_UNORM_BLOCK:133,VK_FORMAT_BC1_RGBA_SRGB_BLOCK:134,VK_FORMAT_BC2_UNORM_BLOCK:135,VK_FORMAT_BC2_SRGB_BLOCK:136,VK_FORMAT_BC3_UNORM_BLOCK:137,VK_FORMAT_BC3_SRGB_BLOCK:138,VK_FORMAT_BC4_UNORM_BLOCK:139,VK_FORMAT_BC4_SNORM_BLOCK:140,VK_FORMAT_BC5_UNORM_BLOCK:141,VK_FORMAT_BC5_SNORM_BLOCK:142,VK_FORMAT_BC6H_UFLOAT_BLOCK:143,VK_FORMAT_BC6H_SFLOAT_BLOCK:144,VK_FORMAT_BC7_UNORM_BLOCK:145,VK_FORMAT_BC7_SRGB_BLOCK:146,VK_FORMAT_ETC2_R8G8B8_UNORM_BLOCK:147,VK_FORMAT_ETC2_R8G8B8_SRGB_BLOCK:148,VK_FORMAT_ETC2_R8G8B8A1_UNORM_BLOCK:149,VK_FORMAT_ETC2_R8G8B8A1_SRGB_BLOCK:150,VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK:151,VK_FORMAT_ETC2_R8G8B8A8_SRGB_BLOCK:152,VK_FORMAT_EAC_R11_UNORM_BLOCK:153,VK_FORMAT_EAC_R11_SNORM_BLOCK:154,VK_FORMAT_EAC_R11G11_UNORM_BLOCK:155,VK_FORMAT_EAC_R11G11_SNORM_BLOCK:156,VK_FORMAT_ASTC_4x4_UNORM_BLOCK:157,VK_FORMAT_ASTC_4x4_SRGB_BLOCK:158,VK_FORMAT_ASTC_5x4_UNORM_BLOCK:159,VK_FORMAT_ASTC_5x4_SRGB_BLOCK:160,VK_FORMAT_ASTC_5x5_UNORM_BLOCK:161,VK_FORMAT_ASTC_5x5_SRGB_BLOCK:162,VK_FORMAT_ASTC_6x5_UNORM_BLOCK:163,VK_FORMAT_ASTC_6x5_SRGB_BLOCK:164,VK_FORMAT_ASTC_6x6_UNORM_BLOCK:165,VK_FORMAT_ASTC_6x6_SRGB_BLOCK:166,VK_FORMAT_ASTC_8x5_UNORM_BLOCK:167,VK_FORMAT_ASTC_8x5_SRGB_BLOCK:168,VK_FORMAT_ASTC_8x6_UNORM_BLOCK:169,VK_FORMAT_ASTC_8x6_SRGB_BLOCK:170,VK_FORMAT_ASTC_8x8_UNORM_BLOCK:171,VK_FORMAT_ASTC_8x8_SRGB_BLOCK:172,VK_FORMAT_ASTC_10x5_UNORM_BLOCK:173,VK_FORMAT_ASTC_10x5_SRGB_BLOCK:174,VK_FORMAT_ASTC_10x6_UNORM_BLOCK:175,VK_FORMAT_ASTC_10x6_SRGB_BLOCK:176,VK_FORMAT_ASTC_10x8_UNORM_BLOCK:177,VK_FORMAT_ASTC_10x8_SRGB_BLOCK:178,VK_FORMAT_ASTC_10x10_UNORM_BLOCK:179,VK_FORMAT_ASTC_10x10_SRGB_BLOCK:180,VK_FORMAT_ASTC_12x10_UNORM_BLOCK:181,VK_FORMAT_ASTC_12x10_SRGB_BLOCK:182,VK_FORMAT_ASTC_12x12_UNORM_BLOCK:183,VK_FORMAT_ASTC_12x12_SRGB_BLOCK:184,VK_FORMAT_G8B8G8R8_422_UNORM:1000156e3,VK_FORMAT_B8G8R8G8_422_UNORM:1000156001,VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM:1000156002,VK_FORMAT_G8_B8R8_2PLANE_420_UNORM:1000156003,VK_FORMAT_G8_B8_R8_3PLANE_422_UNORM:1000156004,VK_FORMAT_G8_B8R8_2PLANE_422_UNORM:1000156005,VK_FORMAT_G8_B8_R8_3PLANE_444_UNORM:1000156006,VK_FORMAT_R10X6_UNORM_PACK16:1000156007,VK_FORMAT_R10X6G10X6_UNORM_2PACK16:1000156008,VK_FORMAT_R10X6G10X6B10X6A10X6_UNORM_4PACK16:1000156009,VK_FORMAT_G10X6B10X6G10X6R10X6_422_UNORM_4PACK16:1000156010,VK_FORMAT_B10X6G10X6R10X6G10X6_422_UNORM_4PACK16:1000156011,VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_420_UNORM_3PACK16:1000156012,VK_FORMAT_G10X6_B10X6R10X6_2PLANE_420_UNORM_3PACK16:1000156013,VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_422_UNORM_3PACK16:1000156014,VK_FORMAT_G10X6_B10X6R10X6_2PLANE_422_UNORM_3PACK16:1000156015,VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_444_UNORM_3PACK16:1000156016,VK_FORMAT_R12X4_UNORM_PACK16:1000156017,VK_FORMAT_R12X4G12X4_UNORM_2PACK16:1000156018,VK_FORMAT_R12X4G12X4B12X4A12X4_UNORM_4PACK16:1000156019,VK_FORMAT_G12X4B12X4G12X4R12X4_422_UNORM_4PACK16:1000156020,VK_FORMAT_B12X4G12X4R12X4G12X4_422_UNORM_4PACK16:1000156021,VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_420_UNORM_3PACK16:1000156022,VK_FORMAT_G12X4_B12X4R12X4_2PLANE_420_UNORM_3PACK16:1000156023,VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_422_UNORM_3PACK16:1000156024,VK_FORMAT_G12X4_B12X4R12X4_2PLANE_422_UNORM_3PACK16:1000156025,VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_444_UNORM_3PACK16:1000156026,VK_FORMAT_G16B16G16R16_422_UNORM:1000156027,VK_FORMAT_B16G16R16G16_422_UNORM:1000156028,VK_FORMAT_G16_B16_R16_3PLANE_420_UNORM:1000156029,VK_FORMAT_G16_B16R16_2PLANE_420_UNORM:1000156030,VK_FORMAT_G16_B16_R16_3PLANE_422_UNORM:1000156031,VK_FORMAT_G16_B16R16_2PLANE_422_UNORM:1000156032,VK_FORMAT_G16_B16_R16_3PLANE_444_UNORM:1000156033,VK_FORMAT_PVRTC1_2BPP_UNORM_BLOCK_IMG:1000054e3,VK_FORMAT_PVRTC1_4BPP_UNORM_BLOCK_IMG:1000054001,VK_FORMAT_PVRTC2_2BPP_UNORM_BLOCK_IMG:1000054002,VK_FORMAT_PVRTC2_4BPP_UNORM_BLOCK_IMG:1000054003,VK_FORMAT_PVRTC1_2BPP_SRGB_BLOCK_IMG:1000054004,VK_FORMAT_PVRTC1_4BPP_SRGB_BLOCK_IMG:1000054005,VK_FORMAT_PVRTC2_2BPP_SRGB_BLOCK_IMG:1000054006,VK_FORMAT_PVRTC2_4BPP_SRGB_BLOCK_IMG:1000054007,VK_FORMAT_ASTC_4x4_SFLOAT_BLOCK_EXT:1000066e3,VK_FORMAT_ASTC_5x4_SFLOAT_BLOCK_EXT:1000066001,VK_FORMAT_ASTC_5x5_SFLOAT_BLOCK_EXT:1000066002,VK_FORMAT_ASTC_6x5_SFLOAT_BLOCK_EXT:1000066003,VK_FORMAT_ASTC_6x6_SFLOAT_BLOCK_EXT:1000066004,VK_FORMAT_ASTC_8x5_SFLOAT_BLOCK_EXT:1000066005,VK_FORMAT_ASTC_8x6_SFLOAT_BLOCK_EXT:1000066006,VK_FORMAT_ASTC_8x8_SFLOAT_BLOCK_EXT:1000066007,VK_FORMAT_ASTC_10x5_SFLOAT_BLOCK_EXT:1000066008,VK_FORMAT_ASTC_10x6_SFLOAT_BLOCK_EXT:1000066009,VK_FORMAT_ASTC_10x8_SFLOAT_BLOCK_EXT:1000066010,VK_FORMAT_ASTC_10x10_SFLOAT_BLOCK_EXT:1000066011,VK_FORMAT_ASTC_12x10_SFLOAT_BLOCK_EXT:1000066012,VK_FORMAT_ASTC_12x12_SFLOAT_BLOCK_EXT:1000066013,VK_FORMAT_G8B8G8R8_422_UNORM_KHR:1000156e3,VK_FORMAT_B8G8R8G8_422_UNORM_KHR:1000156001,VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM_KHR:1000156002,VK_FORMAT_G8_B8R8_2PLANE_420_UNORM_KHR:1000156003,VK_FORMAT_G8_B8_R8_3PLANE_422_UNORM_KHR:1000156004,VK_FORMAT_G8_B8R8_2PLANE_422_UNORM_KHR:1000156005,VK_FORMAT_G8_B8_R8_3PLANE_444_UNORM_KHR:1000156006,VK_FORMAT_R10X6_UNORM_PACK16_KHR:1000156007,VK_FORMAT_R10X6G10X6_UNORM_2PACK16_KHR:1000156008,VK_FORMAT_R10X6G10X6B10X6A10X6_UNORM_4PACK16_KHR:1000156009,VK_FORMAT_G10X6B10X6G10X6R10X6_422_UNORM_4PACK16_KHR:1000156010,VK_FORMAT_B10X6G10X6R10X6G10X6_422_UNORM_4PACK16_KHR:1000156011,VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_420_UNORM_3PACK16_KHR:1000156012,VK_FORMAT_G10X6_B10X6R10X6_2PLANE_420_UNORM_3PACK16_KHR:1000156013,VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_422_UNORM_3PACK16_KHR:1000156014,VK_FORMAT_G10X6_B10X6R10X6_2PLANE_422_UNORM_3PACK16_KHR:1000156015,VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_444_UNORM_3PACK16_KHR:1000156016,VK_FORMAT_R12X4_UNORM_PACK16_KHR:1000156017,VK_FORMAT_R12X4G12X4_UNORM_2PACK16_KHR:1000156018,VK_FORMAT_R12X4G12X4B12X4A12X4_UNORM_4PACK16_KHR:1000156019,VK_FORMAT_G12X4B12X4G12X4R12X4_422_UNORM_4PACK16_KHR:1000156020,VK_FORMAT_B12X4G12X4R12X4G12X4_422_UNORM_4PACK16_KHR:1000156021,VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_420_UNORM_3PACK16_KHR:1000156022,VK_FORMAT_G12X4_B12X4R12X4_2PLANE_420_UNORM_3PACK16_KHR:1000156023,VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_422_UNORM_3PACK16_KHR:1000156024,VK_FORMAT_G12X4_B12X4R12X4_2PLANE_422_UNORM_3PACK16_KHR:1000156025,VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_444_UNORM_3PACK16_KHR:1000156026,VK_FORMAT_G16B16G16R16_422_UNORM_KHR:1000156027,VK_FORMAT_B16G16R16G16_422_UNORM_KHR:1000156028,VK_FORMAT_G16_B16_R16_3PLANE_420_UNORM_KHR:1000156029,VK_FORMAT_G16_B16R16_2PLANE_420_UNORM_KHR:1000156030,VK_FORMAT_G16_B16_R16_3PLANE_422_UNORM_KHR:1000156031,VK_FORMAT_G16_B16R16_2PLANE_422_UNORM_KHR:1000156032,VK_FORMAT_G16_B16_R16_3PLANE_444_UNORM_KHR:1000156033},o6=Object.freeze(oSt);var i$i=T(S(),1);function rSt(e){switch(e){case ie.FLOAT:return"float";case ie.FLOAT_VEC2:return"vec2";case ie.FLOAT_VEC3:return"vec3";case ie.FLOAT_VEC4:return"vec4";case ie.FLOAT_MAT2:return"mat2";case ie.FLOAT_MAT3:return"mat3";case ie.FLOAT_MAT4:return"mat4";case ie.SAMPLER_2D:return"sampler2D";case ie.BOOL:return"bool"}}var r6=rSt;var r$i=T(S(),1);function sSt(e,t,n){return function(){n.apply(e,arguments),t.apply(e,arguments)}}var BM=sSt;var d$i=T(S(),1);var aSt=new m(1,1,1);function s6(e){e=y(e,aSt),this._dimensions=m.clone(e)}Object.defineProperties(s6.prototype,{dimensions:{get:function(){return this._dimensions},set:function(e){m.clone(e,this._dimensions)}}});var cSt=new m;s6.prototype.emit=function(e){let t=this._dimensions,n=m.multiplyByScalar(t,.5,cSt),i=W.randomBetween(-n.x,n.x),o=W.randomBetween(-n.y,n.y),r=W.randomBetween(-n.z,n.z);e.position=m.fromElements(i,o,r,e.position),e.velocity=m.normalize(e.position,e.velocity)};var a6=s6;var h$i=T(S(),1);function _p(){this.featurePropertiesDirty=!1}Object.defineProperties(_p.prototype,{featuresLength:{get:function(){fe.throwInstantiationError()}},pointsLength:{get:function(){fe.throwInstantiationError()}},trianglesLength:{get:function(){fe.throwInstantiationError()}},geometryByteLength:{get:function(){fe.throwInstantiationError()}},texturesByteLength:{get:function(){fe.throwInstantiationError()}},batchTableByteLength:{get:function(){fe.throwInstantiationError()}},innerContents:{get:function(){fe.throwInstantiationError()}},ready:{get:function(){fe.throwInstantiationError()}},tileset:{get:function(){fe.throwInstantiationError()}},tile:{get:function(){fe.throwInstantiationError()}},url:{get:function(){fe.throwInstantiationError()}},batchTable:{get:function(){fe.throwInstantiationError()}},metadata:{get:function(){fe.throwInstantiationError()},set:function(e){fe.throwInstantiationError()}},group:{get:function(){fe.throwInstantiationError()},set:function(e){fe.throwInstantiationError()}}});_p.prototype.hasProperty=function(e,t){fe.throwInstantiationError()};_p.prototype.getFeature=function(e){fe.throwInstantiationError()};_p.prototype.applyDebugSettings=function(e,t){fe.throwInstantiationError()};_p.prototype.applyStyle=function(e){fe.throwInstantiationError()};_p.prototype.update=function(e,t){fe.throwInstantiationError()};_p.prototype.pick=function(e,t,n){fe.throwInstantiationError()};_p.prototype.isDestroyed=function(){fe.throwInstantiationError()};_p.prototype.destroy=function(){fe.throwInstantiationError()};var c6=_p;var R$i=T(S(),1);var y$i=T(S(),1);function HL(e,t){this._conditionsExpression=Oe(e,!0),this._conditions=e.conditions,this._runtimeConditions=void 0,dSt(this,t)}Object.defineProperties(HL.prototype,{conditionsExpression:{get:function(){return this._conditionsExpression}}});function lSt(e,t){this.condition=e,this.expression=t}function dSt(e,t){let n=[],i=e._conditions;if(!l(i))return;let o=i.length;for(let r=0;r<o;++r){let s=i[r],a=String(s[0]),c=String(s[1]);n.push(new lSt(new Xu(a,t),new Xu(c,t)))}e._runtimeConditions=n}HL.prototype.evaluate=function(e,t){let n=this._runtimeConditions;if(!l(n))return;let i=n.length;for(let o=0;o<i;++o){let r=n[o];if(r.condition.evaluate(e))return r.expression.evaluate(e,t)}};HL.prototype.evaluateColor=function(e,t){let n=this._runtimeConditions;if(!l(n))return;let i=n.length;for(let o=0;o<i;++o){let r=n[o];if(r.condition.evaluate(e))return r.expression.evaluateColor(e,t)}};HL.prototype.getShaderFunction=function(e,t,n,i){let o=this._runtimeConditions;if(!l(o)||o.length===0)return;let r="",s=o.length;for(let a=0;a<s;++a){let c=o[a],d=c.condition.getShaderExpression(t,n),u=c.expression.getShaderExpression(t,n);r+=` ${a===0?"if":"else if"} (${d}) { return ${u}; } `}return r=`${i} ${e} { ${r} return ${i}(1.0); } `,r};HL.prototype.getVariables=function(){let e=[],t=this._runtimeConditions;if(!l(t)||t.length===0)return e;let n=t.length;for(let i=0;i<n;++i){let o=t[i];e.push.apply(e,o.condition.getVariables()),e.push.apply(e,o.expression.getVariables())}return e=e.filter(function(i,o,r){return r.indexOf(i)===o}),e};var OM=HL;function tx(e){this._style={},this._ready=!1,this._show=void 0,this._color=void 0,this._pointSize=void 0,this._pointOutlineColor=void 0,this._pointOutlineWidth=void 0,this._labelColor=void 0,this._labelOutlineColor=void 0,this._labelOutlineWidth=void 0,this._font=void 0,this._labelStyle=void 0,this._labelText=void 0,this._backgroundColor=void 0,this._backgroundPadding=void 0,this._backgroundEnabled=void 0,this._scaleByDistance=void 0,this._translucencyByDistance=void 0,this._distanceDisplayCondition=void 0,this._heightOffset=void 0,this._anchorLineEnabled=void 0,this._anchorLineColor=void 0,this._image=void 0,this._disableDepthTestDistance=void 0,this._horizontalOrigin=void 0,this._verticalOrigin=void 0,this._labelHorizontalOrigin=void 0,this._labelVerticalOrigin=void 0,this._meta=void 0,this._colorShaderFunction=void 0,this._showShaderFunction=void 0,this._pointSizeShaderFunction=void 0,this._colorShaderFunctionReady=!1,this._showShaderFunctionReady=!1,this._pointSizeShaderFunctionReady=!1,this._colorShaderTranslucent=!1,uSt(this,e)}function uSt(e,t){t=y(Oe(t,!0),e._style),e._style=t,e.show=t.show,e.color=t.color,e.pointSize=t.pointSize,e.pointOutlineColor=t.pointOutlineColor,e.pointOutlineWidth=t.pointOutlineWidth,e.labelColor=t.labelColor,e.labelOutlineColor=t.labelOutlineColor,e.labelOutlineWidth=t.labelOutlineWidth,e.labelStyle=t.labelStyle,e.font=t.font,e.labelText=t.labelText,e.backgroundColor=t.backgroundColor,e.backgroundPadding=t.backgroundPadding,e.backgroundEnabled=t.backgroundEnabled,e.scaleByDistance=t.scaleByDistance,e.translucencyByDistance=t.translucencyByDistance,e.distanceDisplayCondition=t.distanceDisplayCondition,e.heightOffset=t.heightOffset,e.anchorLineEnabled=t.anchorLineEnabled,e.anchorLineColor=t.anchorLineColor,e.image=t.image,e.disableDepthTestDistance=t.disableDepthTestDistance,e.horizontalOrigin=t.horizontalOrigin,e.verticalOrigin=t.verticalOrigin,e.labelHorizontalOrigin=t.labelHorizontalOrigin,e.labelVerticalOrigin=t.labelVerticalOrigin;let n={};if(l(t.meta)){let i=t.defines,o=y(t.meta,y.EMPTY_OBJECT);for(let r in o)o.hasOwnProperty(r)&&(n[r]=new Xu(o[r],i))}e._meta=n,e._ready=!0}function lr(e,t){let n=y(e._style,y.EMPTY_OBJECT).defines;if(l(t)){if(typeof t=="boolean"||typeof t=="number")return new Xu(String(t));if(typeof t=="string")return new Xu(t,n);if(l(t.conditions))return new OM(t,n)}else return;return t}function dr(e){if(l(e)){if(l(e.expression))return e.expression;if(l(e.conditionsExpression))return Oe(e.conditionsExpression,!0)}else return;return e}Object.defineProperties(tx.prototype,{style:{get:function(){return this._style}},show:{get:function(){return this._show},set:function(e){this._show=lr(this,e),this._style.show=dr(this._show),this._showShaderFunctionReady=!1}},color:{get:function(){return this._color},set:function(e){this._color=lr(this,e),this._style.color=dr(this._color),this._colorShaderFunctionReady=!1}},pointSize:{get:function(){return this._pointSize},set:function(e){this._pointSize=lr(this,e),this._style.pointSize=dr(this._pointSize),this._pointSizeShaderFunctionReady=!1}},pointOutlineColor:{get:function(){return this._pointOutlineColor},set:function(e){this._pointOutlineColor=lr(this,e),this._style.pointOutlineColor=dr(this._pointOutlineColor)}},pointOutlineWidth:{get:function(){return this._pointOutlineWidth},set:function(e){this._pointOutlineWidth=lr(this,e),this._style.pointOutlineWidth=dr(this._pointOutlineWidth)}},labelColor:{get:function(){return this._labelColor},set:function(e){this._labelColor=lr(this,e),this._style.labelColor=dr(this._labelColor)}},labelOutlineColor:{get:function(){return this._labelOutlineColor},set:function(e){this._labelOutlineColor=lr(this,e),this._style.labelOutlineColor=dr(this._labelOutlineColor)}},labelOutlineWidth:{get:function(){return this._labelOutlineWidth},set:function(e){this._labelOutlineWidth=lr(this,e),this._style.labelOutlineWidth=dr(this._labelOutlineWidth)}},font:{get:function(){return this._font},set:function(e){this._font=lr(this,e),this._style.font=dr(this._font)}},labelStyle:{get:function(){return this._labelStyle},set:function(e){this._labelStyle=lr(this,e),this._style.labelStyle=dr(this._labelStyle)}},labelText:{get:function(){return this._labelText},set:function(e){this._labelText=lr(this,e),this._style.labelText=dr(this._labelText)}},backgroundColor:{get:function(){return this._backgroundColor},set:function(e){this._backgroundColor=lr(this,e),this._style.backgroundColor=dr(this._backgroundColor)}},backgroundPadding:{get:function(){return this._backgroundPadding},set:function(e){this._backgroundPadding=lr(this,e),this._style.backgroundPadding=dr(this._backgroundPadding)}},backgroundEnabled:{get:function(){return this._backgroundEnabled},set:function(e){this._backgroundEnabled=lr(this,e),this._style.backgroundEnabled=dr(this._backgroundEnabled)}},scaleByDistance:{get:function(){return this._scaleByDistance},set:function(e){this._scaleByDistance=lr(this,e),this._style.scaleByDistance=dr(this._scaleByDistance)}},translucencyByDistance:{get:function(){return this._translucencyByDistance},set:function(e){this._translucencyByDistance=lr(this,e),this._style.translucencyByDistance=dr(this._translucencyByDistance)}},distanceDisplayCondition:{get:function(){return this._distanceDisplayCondition},set:function(e){this._distanceDisplayCondition=lr(this,e),this._style.distanceDisplayCondition=dr(this._distanceDisplayCondition)}},heightOffset:{get:function(){return this._heightOffset},set:function(e){this._heightOffset=lr(this,e),this._style.heightOffset=dr(this._heightOffset)}},anchorLineEnabled:{get:function(){return this._anchorLineEnabled},set:function(e){this._anchorLineEnabled=lr(this,e),this._style.anchorLineEnabled=dr(this._anchorLineEnabled)}},anchorLineColor:{get:function(){return this._anchorLineColor},set:function(e){this._anchorLineColor=lr(this,e),this._style.anchorLineColor=dr(this._anchorLineColor)}},image:{get:function(){return this._image},set:function(e){this._image=lr(this,e),this._style.image=dr(this._image)}},disableDepthTestDistance:{get:function(){return this._disableDepthTestDistance},set:function(e){this._disableDepthTestDistance=lr(this,e),this._style.disableDepthTestDistance=dr(this._disableDepthTestDistance)}},horizontalOrigin:{get:function(){return this._horizontalOrigin},set:function(e){this._horizontalOrigin=lr(this,e),this._style.horizontalOrigin=dr(this._horizontalOrigin)}},verticalOrigin:{get:function(){return this._verticalOrigin},set:function(e){this._verticalOrigin=lr(this,e),this._style.verticalOrigin=dr(this._verticalOrigin)}},labelHorizontalOrigin:{get:function(){return this._labelHorizontalOrigin},set:function(e){this._labelHorizontalOrigin=lr(this,e),this._style.labelHorizontalOrigin=dr(this._labelHorizontalOrigin)}},labelVerticalOrigin:{get:function(){return this._labelVerticalOrigin},set:function(e){this._labelVerticalOrigin=lr(this,e),this._style.labelVerticalOrigin=dr(this._labelVerticalOrigin)}},meta:{get:function(){return this._meta},set:function(e){this._meta=e}}});tx.fromUrl=function(e){return Re.createIfNeeded(e).fetchJson(e).then(function(n){return new tx(n)})};tx.prototype.getColorShaderFunction=function(e,t,n){return this._colorShaderFunctionReady?(n.translucent=this._colorShaderTranslucent,this._colorShaderFunction):(this._colorShaderFunctionReady=!0,l(this.color)&&l(this.color.getShaderFunction)?this._colorShaderFunction=this.color.getShaderFunction(e,t,n,"vec4"):this._colorShaderFunction=void 0,this._colorShaderTranslucent=n.translucent,this._colorShaderFunction)};tx.prototype.getShowShaderFunction=function(e,t,n){return this._showShaderFunctionReady?this._showShaderFunction:(this._showShaderFunctionReady=!0,l(this.show)&&l(this.show.getShaderFunction)?this._showShaderFunction=this.show.getShaderFunction(e,t,n,"bool"):this._showShaderFunction=void 0,this._showShaderFunction)};tx.prototype.getPointSizeShaderFunction=function(e,t,n){return this._pointSizeShaderFunctionReady?this._pointSizeShaderFunction:(this._pointSizeShaderFunctionReady=!0,l(this.pointSize)&&l(this.pointSize.getShaderFunction)?this._pointSizeShaderFunction=this.pointSize.getShaderFunction(e,t,n,"float"):this._pointSizeShaderFunction=void 0,this._pointSizeShaderFunction)};tx.prototype.getVariables=function(){let e=[];return l(this.color)&&l(this.color.getVariables)&&e.push.apply(e,this.color.getVariables()),l(this.show)&&l(this.show.getVariables)&&e.push.apply(e,this.show.getVariables()),l(this.pointSize)&&l(this.pointSize.getVariables)&&e.push.apply(e,this.pointSize.getVariables()),e=e.filter(function(t,n,i){return i.indexOf(t)===n}),e};var FS=tx;var teo=T(S(),1);var I$i=T(S(),1);function YM(e){e=y(e,y.EMPTY_OBJECT),this._maximumSubtreeCount=y(e.maximumSubtreeCount,0),this._subtreeRequestCounter=0,this._queue=new TS({comparator:YM.comparator})}YM.prototype.addSubtree=function(e){let t=new mSt(e,this._subtreeRequestCounter);this._subtreeRequestCounter++,this._queue.insert(t);let n=e.implicitCoordinates;if(n.level>0){let i=n.getParentSubtreeCoordinates(),o=this.find(i)}if(this._maximumSubtreeCount>0)for(;this._queue.length>this._maximumSubtreeCount&&this._queue.getMinimum()!==t;)this._queue.removeMinimum()};YM.prototype.find=function(e){let t=this._queue,n=t.internalArray,i=t.length;for(let o=0;o<i;o++){let r=n[o],a=r.subtree.implicitCoordinates;if(e.isEqual(a))return r.subtree}};YM.comparator=function(e,t){let n=e.subtree.implicitCoordinates,i=t.subtree.implicitCoordinates;return n.isAncestor(i)?1:i.isAncestor(n)?-1:e.stamp-t.stamp};function mSt(e,t){this.subtree=e,this.stamp=t}var HM=YM;function zM(e){e=y(e,y.EMPTY_OBJECT);let{className:t,names:n,types:i,componentTypes:o,shape:r,dimensions:s,paddingBefore:a=m.ZERO.clone(),paddingAfter:c=m.ZERO.clone(),globalTransform:d=M.IDENTITY.clone(),shapeTransform:u=M.IDENTITY.clone(),minBounds:h,maxBounds:p,minimumValues:g,maximumValues:f,maximumTileCount:x}=e;this._shapeTransform=u,this._globalTransform=d,this._shape=r,this._minBounds=h,this._maxBounds=p,this._dimensions=s,this._paddingBefore=a,this._paddingAfter=c,this._className=t,this._names=n,this._types=i,this._componentTypes=o,this._metadataOrder=zh.GLTF,this._minimumValues=g,this._maximumValues=f,this._maximumTileCount=x,this._availableLevels=void 0,this._implicitTileset=void 0,this._subtreeCache=new HM}Object.defineProperties(zM.prototype,{globalTransform:{get:function(){return this._globalTransform}},shapeTransform:{get:function(){return this._shapeTransform}},shape:{get:function(){return this._shape}},minBounds:{get:function(){return this._minBounds}},maxBounds:{get:function(){return this._maxBounds}},dimensions:{get:function(){return this._dimensions}},paddingBefore:{get:function(){return this._paddingBefore}},paddingAfter:{get:function(){return this._paddingAfter}},className:{get:function(){return this._className}},names:{get:function(){return this._names}},types:{get:function(){return this._types}},componentTypes:{get:function(){return this._componentTypes}},metadataOrder:{get:function(){return this._metadataOrder}},minimumValues:{get:function(){return this._minimumValues}},maximumValues:{get:function(){return this._maximumValues}},maximumTileCount:{get:function(){return this._maximumTileCount}},availableLevels:{get:function(){return this._availableLevels}}});zM.fromUrl=async function(e){let t=Re.createIfNeeded(e),n=await t.fetchJson();fSt(n);let i=xSt(n,t);await i.load();let{root:o}=n,r=ci(n,"3DTILES_metadata")?n.extensions["3DTILES_metadata"]:n,s=new tT({metadataJson:r,schema:i.schema}),a=o.content.extensions["3DTILES_content_voxels"],c=a.class,d=_St(s,c);Object.assign(d,pSt(o)),d.dimensions=m.unpack(a.dimensions),d.maximumTileCount=hSt(s),l(a.padding)&&(d.paddingBefore=m.unpack(a.padding.before),d.paddingAfter=m.unpack(a.padding.after));let u=new zM(d),h=new iT(t,o,i.schema);return u._implicitTileset=h,u._availableLevels=h.availableLevels,Li.unload(i),u};function hSt(e){if(l(e.tileset))return e.tileset.getPropertyBySemantic(__.TILESET_TILE_COUNT)}function fSt(e){let t=e.root;if(!l(t.content))throw new ce("Root must have content");if(!ci(t.content,"3DTILES_content_voxels"))throw new ce("Root tile content must have 3DTILES_content_voxels extension");if(!ci(t,"3DTILES_implicit_tiling")&&!l(t.implicitTiling))throw new ce("Root tile must have implicit tiling");if(!l(e.schema)&&!l(e.schemaUri)&&!ci(e,"3DTILES_metadata"))throw new ce("Tileset must have a metadata schema")}function pSt(e){let t=e.boundingVolume,n;if(l(e.transform)?n=M.unpack(e.transform):n=M.clone(M.IDENTITY),l(t.box))return gSt(t.box,n);if(l(t.region))return bSt(t.region);if(ci(t,"3DTILES_bounding_volume_cylinder"))return ySt(t.extensions["3DTILES_bounding_volume_cylinder"].cylinder,n);throw new ce("Only box, region and 3DTILES_bounding_volume_cylinder are supported in Cesium3DTilesVoxelProvider")}function bSt(e){let t=e[0],n=e[1],i=e[2],o=e[3],r=e[4],s=e[5],a=M.fromScale(ne.WGS84.radii),c=new m(t,n,r),d=new m(i,o,s);return{shape:Ni.ELLIPSOID,minBounds:c,maxBounds:d,shapeTransform:a,globalTransform:M.clone(M.IDENTITY)}}function gSt(e,t){let n=Gn.unpack(e),i=M.fromRotationTranslation(n.halfAxes,n.center);return{shape:Ni.BOX,minBounds:m.clone(pp.DefaultMinBounds),maxBounds:m.clone(pp.DefaultMaxBounds),shapeTransform:i,globalTransform:t}}function ySt(e,t){let n=Gn.unpack(e),i=M.fromRotationTranslation(n.halfAxes,n.center);return{shape:Ni.CYLINDER,minBounds:m.clone(bp.DefaultMinBounds),maxBounds:m.clone(bp.DefaultMaxBounds),shapeTransform:i,globalTransform:t}}function xSt(e,t){let{schemaUri:n,schema:i}=e;return l(n)?Li.getSchemaLoader({resource:t.getDerivedResource({url:n})}):Li.getSchemaLoader({schema:i})}function _St(e,t){let{schema:n,statistics:i}=e,o=i==null?void 0:i.classes[t],r=n.classes[t].properties,s=Object.entries(r).map(([g,f])=>{let{type:x,componentType:_}=f,C=o==null?void 0:o.properties[g].min,V=o==null?void 0:o.properties[g].max,L=ut.getComponentCount(x),R=iCe(C,L),G=iCe(V,L);return{id:g,type:x,componentType:_,minValue:R,maxValue:G}}),a=s.map(g=>g.id),c=s.map(g=>g.type),d=s.map(g=>g.componentType),u=s.map(g=>g.minValue),h=s.map(g=>g.maxValue),p=u.some(l);return{className:t,names:a,types:c,componentTypes:d,minimumValues:p?u:void 0,maximumValues:p?h:void 0}}function iCe(e,t){if(!l(e))return;let n=Array.isArray(e)?e:[e];return Array.from({length:t},(i,o)=>n[o])}async function TSt(e,t){let n=e._implicitTileset,i=e._subtreeCache,o=i.find(t);if(l(o))return o;let r=n.subtreeUriTemplate.getDerivedResource({templateValues:t.getTemplateValues()}),s=n.baseResource.getDerivedResource({url:r.url}),a=await s.fetchArrayBuffer();if(o=i.find(t),l(o))return o;let c=vb(a);return o=await x_.fromSubtreeJson(s,c.jsonPayload,c.binaryPayload,n,t),i.addSubtree(o),o}zM.prototype.requestData=async function(e){e=y(e,y.EMPTY_OBJECT);let{tileLevel:t=0,tileX:n=0,tileY:i=0,tileZ:o=0,keyframe:r=0}=e;if(r!==0)return Promise.reject("3D Tiles currently doesn't support time-dynamic data.");let s=this._implicitTileset,a=new oT({subdivisionScheme:s.subdivisionScheme,subtreeLevels:s.subtreeLevels,level:t,x:n,y:i,z:o}),c=a.isSubtreeRoot()&&a.level>0,d=c?a.getParentSubtreeCoordinates():a.getSubtreeCoordinates(),h=await TSt(this,d);if(!(c?h.childSubtreeIsAvailableAtCoordinates:h.tileIsAvailableAtCoordinates).call(h,a))return Promise.reject(`Tile is not available at level ${t}, x ${n}, y ${i}, z ${o}.`);let{contentUriTemplates:f,baseResource:x}=s,_=f[0].getDerivedResource({templateValues:a.getTemplateValues()}),C=x.getDerivedResource({url:_.url});return xS.fromGltf(C)};var l6=zM;var seo=T(S(),1);function d6(e){e=y(e,1),this._radius=y(e,1)}Object.defineProperties(d6.prototype,{radius:{get:function(){return this._radius},set:function(e){this._radius=e}}});d6.prototype.emit=function(e){let t=W.randomBetween(0,W.TWO_PI),n=W.randomBetween(0,this._radius),i=n*Math.cos(t),o=n*Math.sin(t),r=0;e.position=m.fromElements(i,o,r,e.position),e.velocity=m.clone(m.UNIT_Z,e.velocity)};var KM=d6;var Qeo=T(S(),1);var ceo=T(S(),1),u6={CUMULUS:0};u6.validate=function(e){return e===u6.CUMULUS};var zL=Object.freeze(u6);var peo=T(S(),1);function jh(e,t){if(e=y(e,y.EMPTY_OBJECT),this._show=y(e.show,!0),this._position=m.clone(y(e.position,m.ZERO)),!l(e.scale)&&l(e.maximumSize))this._maximumSize=m.clone(e.maximumSize),this._scale=new D(this._maximumSize.x,this._maximumSize.y);else{this._scale=D.clone(y(e.scale,new D(20,12)));let n=new m(this._scale.x,this._scale.y,Math.min(this._scale.x,this._scale.y)/1.5);this._maximumSize=m.clone(y(e.maximumSize,n))}this._slice=y(e.slice,-1),this._color=B.clone(y(e.color,B.WHITE)),this._brightness=y(e.brightness,1),this._cloudCollection=t,this._index=-1}var SSt=jh.SHOW_INDEX=0,CSt=jh.POSITION_INDEX=1,VSt=jh.SCALE_INDEX=2,LSt=jh.MAXIMUM_SIZE_INDEX=3,RSt=jh.SLICE_INDEX=4,ZSt=jh.BRIGHTNESS_INDEX=5,GSt=jh.COLOR_INDEX=6;jh.NUMBER_OF_PROPERTIES=7;function AS(e,t){let n=e._cloudCollection;l(n)&&(n._updateCloud(e,t),e._dirty=!0)}Object.defineProperties(jh.prototype,{show:{get:function(){return this._show},set:function(e){this._show!==e&&(this._show=e,AS(this,SSt))}},position:{get:function(){return this._position},set:function(e){let t=this._position;m.equals(t,e)||(m.clone(e,t),AS(this,CSt))}},scale:{get:function(){return this._scale},set:function(e){let t=this._scale;D.equals(t,e)||(D.clone(e,t),AS(this,VSt))}},maximumSize:{get:function(){return this._maximumSize},set:function(e){let t=this._maximumSize;m.equals(t,e)||(m.clone(e,t),AS(this,LSt))}},color:{get:function(){return this._color},set:function(e){let t=this._color;B.equals(t,e)||(B.clone(e,t),AS(this,GSt))}},slice:{get:function(){return this._slice},set:function(e){this._slice!==e&&(this._slice=e,AS(this,RSt))}},brightness:{get:function(){return this._brightness},set:function(e){this._brightness!==e&&(this._brightness=e,AS(this,ZSt))}}});jh.prototype._destroy=function(){this._cloudCollection=void 0};var du=jh;var uu,yB=new m,ESt={positionHighAndScaleX:0,positionLowAndScaleY:1,packedAttribute0:2,packedAttribute1:3,color:4},ISt={direction:0,positionHighAndScaleX:1,positionLowAndScaleY:2,packedAttribute0:3,packedAttribute1:4,color:5},XSt=du.SHOW_INDEX,WSt=du.POSITION_INDEX,PSt=du.SCALE_INDEX,vSt=du.MAXIMUM_SIZE_INDEX,wSt=du.SLICE_INDEX,FSt=du.BRIGHTNESS_INDEX,ASt=du.NUMBER_OF_PROPERTIES,MSt=du.COLOR_INDEX;function qh(e){e=y(e,y.EMPTY_OBJECT),this._clouds=[],this._cloudsToUpdate=[],this._cloudsToUpdateIndex=0,this._cloudsRemoved=!1,this._createVertexArray=!1,this._propertiesChanged=new Uint32Array(ASt),this._noiseTexture=void 0,this._textureSliceWidth=128,this._noiseTextureRows=4,this.noiseDetail=y(e.noiseDetail,16),this.noiseOffset=m.clone(y(e.noiseOffset,m.ZERO)),this._loading=!1,this._ready=!1;let t=this;this._uniforms={u_noiseTexture:function(){return t._noiseTexture},u_noiseTextureDimensions:oCe(t),u_noiseDetail:function(){return t.noiseDetail}},this._vaNoise=void 0,this._spNoise=void 0,this._spCreated=!1,this._sp=void 0,this._rs=void 0,this.show=y(e.show,!0),this._colorCommands=[],this.debugBillboards=y(e.debugBillboards,!1),this._compiledDebugBillboards=!1,this.debugEllipsoids=y(e.debugEllipsoids,!1),this._compiledDebugEllipsoids=!1}function oCe(e){return function(){return yB.x=e._textureSliceWidth,yB.y=e._noiseTextureRows,yB.z=1/e._noiseTextureRows,yB}}Object.defineProperties(qh.prototype,{length:{get:function(){return h6(this),this._clouds.length}}});function rCe(e){let t=e.length;for(let n=0;n<t;++n)e[n]&&e[n]._destroy()}qh.prototype.add=function(e){e=y(e,y.EMPTY_OBJECT);let t=y(e.cloudType,zL.CUMULUS),n;return t===zL.CUMULUS&&(n=new du(e,this),n._index=this._clouds.length,this._clouds.push(n),this._createVertexArray=!0),n};qh.prototype.remove=function(e){return this.contains(e)?(this._clouds[e._index]=void 0,this._cloudsRemoved=!0,this._createVertexArray=!0,e._destroy(),!0):!1};qh.prototype.removeAll=function(){rCe(this._clouds),this._clouds=[],this._cloudsToUpdate=[],this._cloudsToUpdateIndex=0,this._cloudsRemoved=!1,this._createVertexArray=!0};function h6(e){if(e._cloudsRemoved){e._cloudsRemoved=!1;let t=[],n=e._clouds,i=n.length;for(let o=0,r=0;o<i;++o){let s=n[o];l(s)&&(n._index=r++,t.push(s))}e._clouds=t}}qh.prototype._updateCloud=function(e,t){e._dirty||(this._cloudsToUpdate[this._cloudsToUpdateIndex++]=e),++this._propertiesChanged[t]};qh.prototype.contains=function(e){return l(e)&&e._cloudCollection===this};qh.prototype.get=function(e){return h6(this),this._clouds[e]};var NSt=new Float32Array([-1,-1,1,-1,1,1,-1,1]),kSt=new Uint16Array([0,1,2,0,2,3]);function USt(e){let t=St.createVertexBuffer({context:e,typedArray:NSt,usage:ke.STATIC_DRAW}),n=St.createIndexBuffer({context:e,typedArray:kSt,usage:ke.STATIC_DRAW,indexDatatype:Me.UNSIGNED_SHORT}),i=[{index:0,vertexBuffer:t,componentsPerAttribute:2,componentDatatype:Q.FLOAT}];return new oi({context:e,attributes:i,indexBuffer:n})}var f6;function DSt(e){let n=e.cache.cloudCollection_indexBufferBatched;if(l(n))return n;let i=16384*6-6,o=new Uint16Array(i);for(let r=0,s=0;r<i;r+=6,s+=4)o[r]=s,o[r+1]=s+1,o[r+2]=s+2,o[r+3]=s,o[r+4]=s+2,o[r+5]=s+3;return n=St.createIndexBuffer({context:e,typedArray:o,usage:ke.STATIC_DRAW,indexDatatype:Me.UNSIGNED_SHORT}),n.vertexArrayDestroyable=!1,e.cache.cloudCollection_indexBufferBatched=n,n}function BSt(e){let t=e.cache.cloudCollection_indexBufferInstanced;return l(t)||(t=St.createIndexBuffer({context:e,typedArray:new Uint16Array([0,1,2,0,2,3]),usage:ke.STATIC_DRAW,indexDatatype:Me.UNSIGNED_SHORT}),t.vertexArrayDestroyable=!1,e.cache.cloudCollection_indexBufferInstanced=t),t}function OSt(e){let t=e.cache.cloudCollection_vertexBufferInstanced;return l(t)||(t=St.createVertexBuffer({context:e,typedArray:new Float32Array([0,0,1,0,1,1,0,1]),usage:ke.STATIC_DRAW}),t.vertexArrayDestroyable=!1,e.cache.cloudCollection_vertexBufferInstanced=t),t}function YSt(e,t,n){let i=[{index:uu.positionHighAndScaleX,componentsPerAttribute:4,componentDatatype:Q.FLOAT,usage:ke.STATIC_DRAW},{index:uu.positionLowAndScaleY,componentsPerAttribute:4,componentDatatype:Q.FLOAT,usage:ke.STATIC_DRAW},{index:uu.packedAttribute0,componentsPerAttribute:4,componentDatatype:Q.FLOAT,usage:ke.STATIC_DRAW},{index:uu.packedAttribute1,componentsPerAttribute:4,componentDatatype:Q.FLOAT,usage:ke.STATIC_DRAW},{index:uu.color,componentsPerAttribute:4,componentDatatype:Q.UNSIGNED_BYTE,normalize:!0,usage:ke.STATIC_DRAW}];n&&i.push({index:uu.direction,componentsPerAttribute:2,componentDatatype:Q.FLOAT,vertexBuffer:OSt(e)});let o=n?t:4*t;return new Cb(e,i,o,n)}var m6=new Hn;function sCe(e,t,n,i){let o,r=n[uu.positionHighAndScaleX],s=n[uu.positionLowAndScaleY],a=i.position;Hn.fromCartesian(a,m6);let c=i.scale,d=m6.high,u=m6.low;e._instanced?(o=i._index,r(o,d.x,d.y,d.z,c.x),s(o,u.x,u.y,u.z,c.y)):(o=i._index*4,r(o+0,d.x,d.y,d.z,c.x),r(o+1,d.x,d.y,d.z,c.x),r(o+2,d.x,d.y,d.z,c.x),r(o+3,d.x,d.y,d.z,c.x),s(o+0,u.x,u.y,u.z,c.y),s(o+1,u.x,u.y,u.z,c.y),s(o+2,u.x,u.y,u.z,c.y),s(o+3,u.x,u.y,u.z,c.y))}function aCe(e,t,n,i){let o,r=n[uu.packedAttribute0],s=i.show,a=i.brightness;e._instanced?(o=i._index,r(o,s,a,0,0)):(o=i._index*4,r(o+0,s,a,0,0),r(o+1,s,a,1,0),r(o+2,s,a,1,1),r(o+3,s,a,0,1))}function cCe(e,t,n,i){let o,r=n[uu.packedAttribute1],s=i.maximumSize,a=i.slice;e._instanced?(o=i._index,r(o,s.x,s.y,s.z,a)):(o=i._index*4,r(o+0,s.x,s.y,s.z,a),r(o+1,s.x,s.y,s.z,a),r(o+2,s.x,s.y,s.z,a),r(o+3,s.x,s.y,s.z,a))}function lCe(e,t,n,i){let o,r=n[uu.color],s=i.color,a=B.floatToByte(s.red),c=B.floatToByte(s.green),d=B.floatToByte(s.blue),u=B.floatToByte(s.alpha);e._instanced?(o=i._index,r(o,a,c,d,u)):(o=i._index*4,r(o+0,a,c,d,u),r(o+1,a,c,d,u),r(o+2,a,c,d,u),r(o+3,a,c,d,u))}function HSt(e,t,n,i){sCe(e,t,n,i),aCe(e,t,n,i),cCe(e,t,n,i),lCe(e,t,n,i)}function zSt(e,t,n,i){let o=e,r=o._textureSliceWidth,s=o._noiseTextureRows,a=t.context;o._vaNoise=USt(a),o._spNoise=en.fromCache({context:a,vertexShaderSource:n,fragmentShaderSource:i,attributeLocations:{position:0}});let c=o.noiseDetail,d=o.noiseOffset;o._noiseTexture=new Wt({context:a,width:r*r/s,height:r*s,pixelDatatype:je.UNSIGNED_BYTE,pixelFormat:ot.RGBA,sampler:new $t({wrapS:Vn.REPEAT,wrapT:Vn.REPEAT,minificationFilter:qt.NEAREST,magnificationFilter:pi.NEAREST})});let u=new $c({vertexArray:o._vaNoise,shaderProgram:o._spNoise,outputTexture:o._noiseTexture,uniformMap:{u_noiseTextureDimensions:oCe(o),u_noiseDetail:function(){return c},u_noiseOffset:function(){return d}},persists:!1,owner:e,postExecute:function(h){o._ready=!0,o._loading=!1}});t.commandList.push(u),o._loading=!0}function KSt(e,t){let n=e,i=t.context;n._createVertexArray=!1,n._vaf=n._vaf&&n._vaf.destroy();let o=e._clouds,r=o.length;if(r>0){n._vaf=YSt(i,r,n._instanced);let s=n._vaf.writers,a;for(a=0;a<r;++a){let c=o[a];HSt(e,t,s,c)}n._vaf.commit(f6(i))}}var JSt=[];function QSt(e,t){let n=t.context,i=e,r=i._clouds.length,s=i._cloudsToUpdate,a=i._cloudsToUpdateIndex,c=i._propertiesChanged,d=JSt;d.length=0,(c[WSt]||c[PSt])&&d.push(sCe),(c[XSt]||c[FSt])&&d.push(aCe),(c[vSt]||c[wSt])&&d.push(cCe),c[MSt]&&d.push(lCe);let u=d.length,h=i._vaf.writers,p,g,f;if(a/r>.1){for(p=0;p<a;++p)for(g=s[p],g._dirty=!1,f=0;f<u;++f)d[f](e,t,h,g);i._vaf.commit(f6(n))}else{for(p=0;p<a;++p){for(g=s[p],g._dirty=!1,f=0;f<u;++f)d[f](e,t,h,g);i._instanced?i._vaf.subCommit(g._index,1):i._vaf.subCommit(g._index*4,4)}i._vaf.endSubCommits()}i._cloudsToUpdateIndex=0}function jSt(e,t,n,i){let o=t.context,r=e,s=new De({defines:[],sources:[n]});r._instanced&&s.defines.push("INSTANCED");let a=new De({defines:[],sources:[i]});r.debugBillboards&&a.defines.push("DEBUG_BILLBOARDS"),r.debugEllipsoids&&a.defines.push("DEBUG_ELLIPSOIDS"),r._sp=en.replaceCache({context:o,shaderProgram:r._sp,vertexShaderSource:s,fragmentShaderSource:a,attributeLocations:uu}),r._rs=Ue.fromCache({depthTest:{enabled:!0,func:ie.LESS},depthMask:!1,blending:hn.ALPHA_BLEND}),r._spCreated=!0,r._compiledDebugBillboards=r.debugBillboards,r._compiledDebugEllipsoids=r.debugEllipsoids}function qSt(e,t){let n=e,i=t.passes,o=n._uniforms,r=t.commandList;if(i.render){let s=n._colorCommands,a=n._vaf.va,c=a.length;s.length=c;for(let d=0;d<c;d++){let u=s[d];l(u)||(u=s[d]=new $e),u.pass=Ge.TRANSLUCENT,u.owner=e,u.uniformMap=o,u.count=a[d].indicesCount,u.vertexArray=a[d].va,u.shaderProgram=n._sp,u.renderState=n._rs,n._instanced&&(u.count=6,u.instanceCount=n._clouds.length),r.push(u)}}}qh.prototype.update=function(e){if(h6(this),!this.show)return;let t=this.debugBillboards||this.debugEllipsoids;this._ready=t?!0:l(this._noiseTexture),!this._ready&&!this._loading&&!t&&zSt(this,e,PM,WM),this._instanced=e.context.instancedArrays,uu=this._instanced?ISt:ESt,f6=this._instanced?BSt:DSt;let i=this._clouds.length,o=this._cloudsToUpdate,r=this._cloudsToUpdateIndex;this._createVertexArray?KSt(this,e):r>0&&QSt(this,e),r>i*1.5&&(o.length=i),!(!l(this._vaf)||!l(this._vaf.va)||!this._ready&!t)&&((!this._spCreated||this.debugBillboards!==this._compiledDebugBillboards||this.debugEllipsoids!==this._compiledDebugEllipsoids)&&jSt(this,e,XM,IM),qSt(this,e))};qh.prototype.isDestroyed=function(){return!1};qh.prototype.destroy=function(){return this._noiseTexture=this._noiseTexture&&this._noiseTexture.destroy(),this._sp=this._sp&&this._sp.destroy(),this._vaf=this._vaf&&this._vaf.destroy(),rCe(this._clouds),me(this)};var p6=qh;var tto=T(S(),1);var $St=W.toRadians(30);function b6(e){this._angle=y(e,$St)}Object.defineProperties(b6.prototype,{angle:{get:function(){return this._angle},set:function(e){this._angle=e}}});b6.prototype.emit=function(e){let t=Math.tan(this._angle),n=W.randomBetween(0,W.TWO_PI),i=W.randomBetween(0,t),o=i*Math.cos(n),r=i*Math.sin(n),s=1;e.velocity=m.fromElements(o,r,s,e.velocity),m.normalize(e.velocity,e.velocity),e.position=m.clone(m.ZERO,e.position)};var g6=b6;var gto=T(S(),1);var eCt=new B,tCt=new B,nCt=new B,iCt=new B,dCe=new re,JM=new Uint8Array(4);function uCe(e,t,n,i){let o=t.height===n.height?0:(e-t.height)/(n.height-t.height);return B.lerp(t.color,n.color,o,i)}function xB(e,t){return{height:e,color:B.clone(t)}}function mCe(e){return e=e.filter(function(t,n,i){let o=n>0,r=n<i.length-1,s=o?t.height===i[n-1].height:!0,a=r?t.height===i[n+1].height:!0;return!s||!a}),e=e.filter(function(t,n,i){let o=n>0,r=n<i.length-1,s=o?B.equals(t.color,i[n-1].color):!1,a=r?B.equals(t.color,i[n+1].color):!1;return!s||!a}),e=e.filter(function(t,n,i){let o=n>0,r=o?B.equals(t.color,i[n-1].color):!1,s=o?t.height===i[n-1].height:!0;return!r||!s}),e}function oCt(e){let t,n,i=[],o=e.length;for(t=0;t<o;t++){let r=e[t],s=r.entries,a=s.length,c=[];for(n=0;n<a;n++){let g=s[n],f=W.clamp(g.height,ad._minimumHeight,ad._maximumHeight),x=B.clone(g.color,eCt);x.red*=x.alpha,x.green*=x.alpha,x.blue*=x.alpha,c.push(xB(f,x))}let d=!0,u=!0;for(n=0;n<a-1;n++){let g=c[n+0],f=c[n+1];d=d&&g.height<=f.height,u=u&&g.height>=f.height}u?c=c.reverse():d||T0(c,function(g,f){return W.sign(g.height-f.height)});let h=y(r.extendDownwards,!1),p=y(r.extendUpwards,!1);c.length===1&&!h&&!p&&(h=!0,p=!0),h&&c.splice(0,0,xB(ad._minimumHeight,c[0].color)),p&&c.splice(c.length,0,xB(ad._maximumHeight,c[c.length-1].color)),c=mCe(c),i.push(c)}return i}function rCt(e){let t=oCt(e),n=[],i=[],o;function r(d,u){n.push(xB(d,u))}function s(d,u,h){let p=B.multiplyByScalar(h,1-u.alpha,iCt);p=B.add(p,u,p),r(d,p)}let a=t.length;for(o=0;o<a;o++){let d=t[o],u=0,h=0;i=n,n=[];let p=d.length,g=i.length;for(;u<p||h<g;){let f=u<p?d[u]:void 0,x=u>0?d[u-1]:void 0,_=u<p-1?d[u+1]:void 0,C=h<g?i[h]:void 0,V=h>0?i[h-1]:void 0,L=h<g-1?i[h+1]:void 0;if(l(f)&&l(C)&&f.height===C.height){let R=l(L)&&C.height===L.height,G=!l(V),I=!l(L),v=l(_)&&f.height===_.height,P=!l(x),w=!l(_);R?v?(s(f.height,f.color,C.color),s(f.height,_.color,L.color)):P?(r(f.height,C.color),s(f.height,f.color,L.color)):w?(s(f.height,f.color,C.color),r(f.height,L.color)):(s(f.height,f.color,C.color),s(f.height,f.color,L.color)):G?v?(r(f.height,f.color),s(f.height,_.color,C.color)):w?(r(f.height,f.color),r(f.height,C.color)):(P||r(f.height,f.color),s(f.height,f.color,C.color)):I?v?(s(f.height,f.color,C.color),r(f.height,_.color)):P?(r(f.height,C.color),r(f.height,f.color)):w?s(f.height,f.color,C.color):(s(f.height,f.color,C.color),r(f.height,f.color)):v?(s(f.height,f.color,C.color),s(f.height,_.color,C.color)):P?(r(f.height,C.color),s(f.height,f.color,C.color)):w?(s(f.height,f.color,C.color),r(f.height,C.color)):s(f.height,f.color,C.color),u+=v?2:1,h+=R?2:1}else if(l(f)&&l(C)&&l(V)&&f.height<C.height){let R=uCe(f.height,V,C,nCt);l(x)?l(_)?s(f.height,f.color,R):(s(f.height,f.color,R),r(f.height,R)):(r(f.height,R),s(f.height,f.color,R)),u++}else if(l(C)&&l(f)&&l(x)&&C.height<f.height){let R=uCe(C.height,x,f,tCt);l(V)?l(L)?s(C.height,R,C.color):(s(C.height,R,C.color),r(C.height,R)):(r(C.height,R),s(C.height,R,C.color)),h++}else l(f)&&(!l(C)||f.height<C.height)?(l(C)&&!l(V)&&!l(_)?(r(f.height,f.color),r(f.height,ad._emptyColor),r(C.height,ad._emptyColor)):(!l(C)&&l(V)&&!l(x)&&(r(V.height,ad._emptyColor),r(f.height,ad._emptyColor)),r(f.height,f.color)),u++):l(C)&&(!l(f)||C.height<f.height)&&(r(C.height,C.color),h++)}}return mCe(n)}function ad(e){let{scene:t,layers:n}=y(e,y.EMPTY_OBJECT),{context:i}=t,o=rCt(n),r=o.length,s,a,c;if(!ad._useFloatTexture(i)){a=je.UNSIGNED_BYTE,c=ot.RGBA,s=new Uint8Array(r*4);for(let g=0;g<r;g++)re.packFloat(o[g].height,dCe),re.pack(dCe,s,g*4)}else{a=je.FLOAT,c=i.webgl2?ot.RED:ot.LUMINANCE,s=new Float32Array(r);for(let g=0;g<r;g++)s[g]=o[g].height}let u=Wt.create({context:i,pixelFormat:c,pixelDatatype:a,source:{arrayBufferView:s,width:r,height:1},sampler:new $t({wrapS:Vn.CLAMP_TO_EDGE,wrapT:Vn.CLAMP_TO_EDGE,minificationFilter:qt.NEAREST,magnificationFilter:pi.NEAREST})}),h=new Uint8Array(r*4);for(let g=0;g<r;g++)o[g].color.toBytes(JM),h[g*4+0]=JM[0],h[g*4+1]=JM[1],h[g*4+2]=JM[2],h[g*4+3]=JM[3];let p=Wt.create({context:i,pixelFormat:ot.RGBA,pixelDatatype:je.UNSIGNED_BYTE,source:{arrayBufferView:h,width:r,height:1},sampler:new $t({wrapS:Vn.CLAMP_TO_EDGE,wrapT:Vn.CLAMP_TO_EDGE,minificationFilter:qt.LINEAR,magnificationFilter:pi.LINEAR})});return Ji.fromType("ElevationBand",{heights:u,colors:p})}ad._useFloatTexture=function(e){return e.floatingPointTexture};ad._maximumHeight=5906376425472;ad._minimumHeight=-5906376425472;ad._emptyColor=new B(0,0,0,0);var y6=ad;var Rto=T(S(),1);async function sCt(e,t){t=y(t,{}),t.cacheBytes=y(t.cacheBytes,1536*1024*1024),t.maximumCacheOverflowBytes=y(t.maximumCacheOverflowBytes,1024*1024*1024),t.enableCollision=y(t.enableCollision,!0),e=y(e,y.EMPTY_OBJECT),e.onlyUsingWithGoogleGeocoder||Ct("google-tiles-with-google-geocoder","Only the Google geocoder can be used with Google Photorealistic 3D Tiles. Set the `geocode` property of Viewer constructor options. You can set additionalOptions.onlyUsingWithGoogleGeocoder to hide this warning once you have configured the geocoder.");let n=y(e.key,WS.defaultApiKey);if(!l(n))return aCt(t);let i,o=WS.getDefaultCredit();l(o)&&(i=[o]);let r=new Re({url:`${WS.mapTilesApiEndpoint}3dtiles/root.json`,queryParameters:{key:n},credits:i});return xs.fromUrl(r,t)}var hCe={};async function aCt(e){let i=hCe[2275207];l(i)||(i=xd.fromAssetId(2275207),hCe[2275207]=i);let o=await i;return xs.fromUrl(o,e)}var x6=sCt;var Pto=T(S(),1);async function cCt(e){let t=await xs.fromIonAssetId(96188,e);e=y(e,y.EMPTY_OBJECT);let n=e.style;if(!l(n)){let i=y(e.defaultColor,B.WHITE).toCssColorString();n=new FS({color:`Boolean(\${feature['cesium#color']}) ? color(\${feature['cesium#color']}) : ${i}`})}return t.style=n,t}var _6=cCt;var Bto=T(S(),1);function lCt(e){e=y(e,y.EMPTY_OBJECT);let t=[],n=e.geometry;(!l(n.attributes)||!l(n.primitiveType))&&(n=n.constructor.createGeometry(n));let i=n.attributes,o=M.clone(y(e.modelMatrix,M.IDENTITY)),r=y(e.length,1e4);if(l(i.normal)&&t.push(new It({geometry:Nn.createLineSegmentsForVectors(n,"normal",r),attributes:{color:new Ht(1,0,0,1)},modelMatrix:o})),l(i.tangent)&&t.push(new It({geometry:Nn.createLineSegmentsForVectors(n,"tangent",r),attributes:{color:new Ht(0,1,0,1)},modelMatrix:o})),l(i.bitangent)&&t.push(new It({geometry:Nn.createLineSegmentsForVectors(n,"bitangent",r),attributes:{color:new Ht(0,0,1,1)},modelMatrix:o})),t.length>0)return new Xn({asynchronous:!1,geometryInstances:t,appearance:new dn({flat:!0,translucent:!1})})}var T6=lCt;var Kto=T(S(),1);function QM(e){e=y(e,y.EMPTY_OBJECT);let t=e.attributeName,n=e.perInstanceAttribute;l(n)||(n=!1);let i=y(e.glslDatatype,"vec3"),o=`v_${t}`,r;if(t==="normal"||t==="tangent"||t==="bitangent")r=`vec4 getColor() { return vec4((${o} + vec3(1.0)) * 0.5, 1.0); } `;else switch(t==="st"&&(i="vec2"),i){case"float":r=`vec4 getColor() { return vec4(vec3(${o}), 1.0); } `;break;case"vec2":r=`vec4 getColor() { return vec4(${o}, 0.0, 1.0); } `;break;case"vec3":r=`vec4 getColor() { return vec4(${o}, 1.0); } `;break;case"vec4":r=`vec4 getColor() { return ${o}; } `;break}let s=`in vec3 position3DHigh; in vec3 position3DLow; in float batchId; ${n?"":`in ${i} ${t}; `}out ${i} ${o}; void main() { vec4 p = czm_translateRelativeToEye(position3DHigh, position3DLow); ${n?`${o} = czm_batchTable_${t}(batchId); `:`${o} = ${t}; `}gl_Position = czm_modelViewProjectionRelativeToEye * p; }`,a=`in ${i} ${o}; ${r} void main() { out_FragColor = getColor(); }`;this.material=void 0,this.translucent=y(e.translucent,!1),this._vertexShaderSource=y(e.vertexShaderSource,s),this._fragmentShaderSource=y(e.fragmentShaderSource,a),this._renderState=oo.getDefaultRenderState(!1,!1,e.renderState),this._closed=y(e.closed,!1),this._attributeName=t,this._glslDatatype=i}Object.defineProperties(QM.prototype,{vertexShaderSource:{get:function(){return this._vertexShaderSource}},fragmentShaderSource:{get:function(){return this._fragmentShaderSource}},renderState:{get:function(){return this._renderState}},closed:{get:function(){return this._closed}},attributeName:{get:function(){return this._attributeName}},glslDatatype:{get:function(){return this._glslDatatype}}});QM.prototype.getFragmentShaderSource=oo.prototype.getFragmentShaderSource;QM.prototype.isTranslucent=oo.prototype.isTranslucent;QM.prototype.getRenderState=oo.prototype.getRenderState;var S6=QM;var ano=T(S(),1);function _B(e){e=y(e,y.EMPTY_OBJECT),this.length=y(e.length,1e7),this._length=void 0,this.width=y(e.width,2),this._width=void 0,this.show=y(e.show,!0),this.modelMatrix=M.clone(y(e.modelMatrix,M.IDENTITY)),this._modelMatrix=new M,this.id=e.id,this._id=void 0,this._primitive=void 0}_B.prototype.update=function(e){if(this.show){if(!l(this._primitive)||!M.equals(this._modelMatrix,this.modelMatrix)||this._length!==this.length||this._width!==this.width||this._id!==this.id){this._modelMatrix=M.clone(this.modelMatrix,this._modelMatrix),this._length=this.length,this._width=this.width,this._id=this.id,l(this._primitive)&&this._primitive.destroy(),this.modelMatrix[12]===0&&this.modelMatrix[13]===0&&this.modelMatrix[14]===0&&(this.modelMatrix[14]=.01);let t=new It({geometry:new s0({positions:[m.ZERO,m.UNIT_X],width:this.width,vertexFormat:$r.VERTEX_FORMAT,colors:[B.RED,B.RED],arcType:tn.NONE}),modelMatrix:M.multiplyByUniformScale(this.modelMatrix,this.length,new M),id:this.id,pickPrimitive:this}),n=new It({geometry:new s0({positions:[m.ZERO,m.UNIT_Y],width:this.width,vertexFormat:$r.VERTEX_FORMAT,colors:[B.GREEN,B.GREEN],arcType:tn.NONE}),modelMatrix:M.multiplyByUniformScale(this.modelMatrix,this.length,new M),id:this.id,pickPrimitive:this}),i=new It({geometry:new s0({positions:[m.ZERO,m.UNIT_Z],width:this.width,vertexFormat:$r.VERTEX_FORMAT,colors:[B.BLUE,B.BLUE],arcType:tn.NONE}),modelMatrix:M.multiplyByUniformScale(this.modelMatrix,this.length,new M),id:this.id,pickPrimitive:this});this._primitive=new Xn({geometryInstances:[t,n,i],appearance:new $r,asynchronous:!1})}this._primitive.update(e)}};_B.prototype.isDestroyed=function(){return!1};_B.prototype.destroy=function(){return this._primitive=this._primitive&&this._primitive.destroy(),me(this)};var jM=_B;var mno=T(S(),1);function dCt(e){this.direction=m.clone(e.direction),this.color=B.clone(y(e.color,B.WHITE)),this.intensity=y(e.intensity,1)}var C6=dCt;var Lno=T(S(),1);var fno=T(S(),1),qM=`in vec3 v_positionMC; in vec3 v_positionEC; in vec2 v_st; void main() { czm_materialInput materialInput; vec3 normalEC = normalize(czm_normal3D * czm_geodeticSurfaceNormal(v_positionMC, vec3(0.0), vec3(1.0))); #ifdef FACE_FORWARD normalEC = faceforward(normalEC, vec3(0.0, 0.0, 1.0), -normalEC); #endif materialInput.s = v_st.s; materialInput.st = v_st; materialInput.str = vec3(v_st, 0.0); // Convert tangent space material normal to eye space materialInput.normalEC = normalEC; materialInput.tangentToEyeMatrix = czm_eastNorthUpToEyeCoordinates(v_positionMC, materialInput.normalEC); // Convert view vector to world space vec3 positionToEyeEC = -v_positionEC; materialInput.positionToEyeEC = positionToEyeEC; czm_material material = czm_getMaterial(materialInput); #ifdef FLAT out_FragColor = vec4(material.diffuse + material.emission, material.alpha); #else out_FragColor = czm_phong(normalize(positionToEyeEC), material, czm_lightDirectionEC); #endif } `;var bno=T(S(),1),$M=`in vec3 position3DHigh; in vec3 position3DLow; in vec2 st; in float batchId; out vec3 v_positionMC; out vec3 v_positionEC; out vec2 v_st; void main() { vec4 p = czm_computePosition(); v_positionMC = position3DHigh + position3DLow; // position in model coordinates v_positionEC = (czm_modelViewRelativeToEye * p).xyz; // position in eye coordinates v_st = st; gl_Position = czm_modelViewProjectionRelativeToEye * p; } `;function MS(e){e=y(e,y.EMPTY_OBJECT);let t=y(e.translucent,!0),n=y(e.aboveGround,!1);this.material=l(e.material)?e.material:Ji.fromType(Ji.ColorType),this.translucent=y(e.translucent,!0),this._vertexShaderSource=y(e.vertexShaderSource,$M),this._fragmentShaderSource=y(e.fragmentShaderSource,qM),this._renderState=oo.getDefaultRenderState(t,!n,e.renderState),this._closed=!1,this._flat=y(e.flat,!1),this._faceForward=y(e.faceForward,n),this._aboveGround=n}Object.defineProperties(MS.prototype,{vertexShaderSource:{get:function(){return this._vertexShaderSource}},fragmentShaderSource:{get:function(){return this._fragmentShaderSource}},renderState:{get:function(){return this._renderState}},closed:{get:function(){return this._closed}},vertexFormat:{get:function(){return MS.VERTEX_FORMAT}},flat:{get:function(){return this._flat}},faceForward:{get:function(){return this._faceForward}},aboveGround:{get:function(){return this._aboveGround}}});MS.VERTEX_FORMAT=Xe.POSITION_AND_ST;MS.prototype.getFragmentShaderSource=oo.prototype.getFragmentShaderSource;MS.prototype.isTranslucent=oo.prototype.isTranslucent;MS.prototype.getRenderState=oo.prototype.getRenderState;var V6=MS;var Pno=T(S(),1);function cd(e){this._scene=e.scene,this.samplingWindow=y(e.samplingWindow,cd.defaultSettings.samplingWindow),this.quietPeriod=y(e.quietPeriod,cd.defaultSettings.quietPeriod),this.warmupPeriod=y(e.warmupPeriod,cd.defaultSettings.warmupPeriod),this.minimumFrameRateDuringWarmup=y(e.minimumFrameRateDuringWarmup,cd.defaultSettings.minimumFrameRateDuringWarmup),this.minimumFrameRateAfterWarmup=y(e.minimumFrameRateAfterWarmup,cd.defaultSettings.minimumFrameRateAfterWarmup),this._lowFrameRate=new be,this._nominalFrameRate=new be,this._frameTimes=[],this._needsQuietPeriod=!0,this._quietPeriodEndTime=0,this._warmupPeriodEndTime=0,this._frameRateIsLow=!1,this._lastFramesPerSecond=void 0,this._pauseCount=0;let t=this;this._preUpdateRemoveListener=this._scene.preUpdate.addEventListener(function(o,r){uCt(t,r)}),this._hiddenPropertyName=document.hidden!==void 0?"hidden":document.mozHidden!==void 0?"mozHidden":document.msHidden!==void 0?"msHidden":document.webkitHidden!==void 0?"webkitHidden":void 0;let n=document.hidden!==void 0?"visibilitychange":document.mozHidden!==void 0?"mozvisibilitychange":document.msHidden!==void 0?"msvisibilitychange":document.webkitHidden!==void 0?"webkitvisibilitychange":void 0;function i(){mCt(t)}this._visibilityChangeRemoveListener=void 0,l(n)&&(document.addEventListener(n,i,!1),this._visibilityChangeRemoveListener=function(){document.removeEventListener(n,i,!1)})}cd.defaultSettings={samplingWindow:5,quietPeriod:2,warmupPeriod:5,minimumFrameRateDuringWarmup:4,minimumFrameRateAfterWarmup:8};cd.fromScene=function(e){return(!l(e._frameRateMonitor)||e._frameRateMonitor.isDestroyed())&&(e._frameRateMonitor=new cd({scene:e})),e._frameRateMonitor};Object.defineProperties(cd.prototype,{scene:{get:function(){return this._scene}},lowFrameRate:{get:function(){return this._lowFrameRate}},nominalFrameRate:{get:function(){return this._nominalFrameRate}},lastFramesPerSecond:{get:function(){return this._lastFramesPerSecond}}});cd.prototype.pause=function(){++this._pauseCount,this._pauseCount===1&&(this._frameTimes.length=0,this._lastFramesPerSecond=void 0)};cd.prototype.unpause=function(){--this._pauseCount,this._pauseCount<=0&&(this._pauseCount=0,this._needsQuietPeriod=!0)};cd.prototype.isDestroyed=function(){return!1};cd.prototype.destroy=function(){return this._preUpdateRemoveListener(),l(this._visibilityChangeRemoveListener)&&this._visibilityChangeRemoveListener(),me(this)};function uCt(e,t){if(e._pauseCount>0)return;let n=Si();if(e._needsQuietPeriod)e._needsQuietPeriod=!1,e._frameTimes.length=0,e._quietPeriodEndTime=n+e.quietPeriod/Qn.SECONDS_PER_MILLISECOND,e._warmupPeriodEndTime=e._quietPeriodEndTime+(e.warmupPeriod+e.samplingWindow)/Qn.SECONDS_PER_MILLISECOND;else if(n>=e._quietPeriodEndTime){e._frameTimes.push(n);let i=n-e.samplingWindow/Qn.SECONDS_PER_MILLISECOND;if(e._frameTimes.length>=2&&e._frameTimes[0]<=i){for(;e._frameTimes.length>=2&&e._frameTimes[1]<i;)e._frameTimes.shift();let o=(n-e._frameTimes[0])/(e._frameTimes.length-1);e._lastFramesPerSecond=1e3/o;let r=1e3/(n>e._warmupPeriodEndTime?e.minimumFrameRateAfterWarmup:e.minimumFrameRateDuringWarmup);o>r?e._frameRateIsLow||(e._frameRateIsLow=!0,e._needsQuietPeriod=!0,e.lowFrameRate.raiseEvent(e.scene,e._lastFramesPerSecond)):e._frameRateIsLow&&(e._frameRateIsLow=!1,e._needsQuietPeriod=!0,e.nominalFrameRate.raiseEvent(e.scene,e._lastFramesPerSecond))}}}function mCt(e){document[e._hiddenPropertyName]?e.pause():e.unpause()}var e9=cd;var zno=T(S(),1);var fCe=T(W7(),1);function L6(){this._image=new Image}L6.prototype.isReady=function(){return!0};L6.prototype.shouldDiscardImage=function(e){return e===this._image};function NS(e){e=y(e,y.EMPTY_OBJECT),this._defaultAlpha=void 0,this._defaultNightAlpha=void 0,this._defaultDayAlpha=void 0,this._defaultBrightness=void 0,this._defaultContrast=void 0,this._defaultHue=void 0,this._defaultSaturation=void 0,this._defaultGamma=void 0,this._defaultMinificationFilter=void 0,this._defaultMagnificationFilter=void 0,this._tileDiscardPolicy=e.tileDiscardPolicy,this._tilingScheme=new Qi({numberOfLevelZeroTilesX:2,numberOfLevelZeroTilesY:2,rectangle:new le(-W.PI,-W.PI,W.PI,W.PI),ellipsoid:e.ellipsoid});let t=e.credit;typeof t=="string"&&(t=new Rt(t)),this._credit=t,this._tileWidth=256,this._tileHeight=256,this._maximumLevel=23,l(this._tileDiscardPolicy)||(this._tileDiscardPolicy=new L6),this._errorEvent=new be}Object.defineProperties(NS.prototype,{url:{get:function(){return this._metadata.url}},proxy:{get:function(){return this._metadata.proxy}},tileWidth:{get:function(){return this._tileWidth}},tileHeight:{get:function(){return this._tileHeight}},maximumLevel:{get:function(){return this._maximumLevel}},minimumLevel:{get:function(){return 0}},tilingScheme:{get:function(){return this._tilingScheme}},rectangle:{get:function(){return this._tilingScheme.rectangle}},tileDiscardPolicy:{get:function(){return this._tileDiscardPolicy}},errorEvent:{get:function(){return this._errorEvent}},credit:{get:function(){return this._credit}},hasAlphaChannel:{get:function(){return!1}}});NS.fromMetadata=function(e,t){if(!e.imageryPresent)throw new ce(`The server ${e.url} doesn't have imagery`);let n=new NS(t);return n._metadata=e,n};NS.prototype.getTileCredits=function(e,t,n){let i=this._metadata,o=i.getTileInformation(e,t,n);if(l(o)){let r=i.providers[o.imageryProvider];if(l(r))return[r]}};NS.prototype.requestImage=function(e,t,n,i){let o=this._tileDiscardPolicy._image,r=this._metadata,s=v0.tileXYToQuadKey(e,t,n),a=r.getTileInformation(e,t,n);if(!l(a)){if(r.isValid(s)){let d=new Qo({throttle:i.throttle,throttleByServer:i.throttleByServer,type:i.type,priorityFunction:i.priorityFunction});r.populateSubtree(e,t,n,d);return}return Promise.resolve(o)}if(!a.hasImagery())return Promise.resolve(o);let c=hCt(this,a,e,t,n,i).fetchArrayBuffer();if(l(c))return c.then(function(d){MM(r.key,d);let u=new Uint8Array(d),h,p=r.protoImagery;if((!l(p)||!p)&&(h=fCt(u)),!l(h)&&(!l(p)||p)){let g=pCt(u);h=g.imageType,u=g.imageData}return!l(h)||!l(u)?o:m_({uint8Array:u,format:h,flipY:!0})})};NS.prototype.pickFeatures=function(e,t,n,i,o){};function hCt(e,t,n,i,o,r){let s=v0.tileXYToQuadKey(n,i,o),a=t.imageryVersion;return a=l(a)&&a>0?a:1,e._metadata.resource.getDerivedResource({url:`flatfile?f1-0${s}-i.${a.toString()}`,request:r})}function fCt(e){let t="JFIF";if(e[6]===t.charCodeAt(0)&&e[7]===t.charCodeAt(1)&&e[8]===t.charCodeAt(2)&&e[9]===t.charCodeAt(3))return"image/jpeg";let n="PNG";if(e[1]===n.charCodeAt(0)&&e[2]===n.charCodeAt(1)&&e[3]===n.charCodeAt(2))return"image/png"}function pCt(e){let t=fCe.Reader.create(e),n=t.len,i={};for(;t.pos<n;){let s=t.uint32(),a;switch(s>>>3){case 1:i.imageType=t.uint32();break;case 2:i.imageData=t.bytes();break;case 3:i.alphaType=t.uint32();break;case 4:i.imageAlpha=t.bytes();break;case 5:if(a=i.copyrightIds,l(a)||(a=i.copyrightIds=[]),(s&7)===2){let c=t.uint32()+t.pos;for(;t.pos<c;)a.push(t.uint32())}else a.push(t.uint32());break;default:t.skipType(s&7);break}}let o=i.imageType;if(l(o))switch(o){case 0:i.imageType="image/jpeg";break;case 4:i.imageType="image/png";break;default:throw new ce("GoogleEarthEnterpriseImageryProvider: Unsupported image type.")}let r=i.alphaType;return l(r)&&r!==0&&(console.log("GoogleEarthEnterpriseImageryProvider: External alpha not supported."),delete i.alphaType,delete i.imageAlpha),i}var R6=NS;var eio=T(S(),1);var bCt=new B(1,1,1,.4),gCt=new B(0,1,0,.05),yCt=new B(0,.5,0,.2);function kS(e){e=y(e,y.EMPTY_OBJECT),this._defaultAlpha=void 0,this._defaultNightAlpha=void 0,this._defaultDayAlpha=void 0,this._defaultBrightness=void 0,this._defaultContrast=void 0,this._defaultHue=void 0,this._defaultSaturation=void 0,this._defaultGamma=void 0,this._defaultMinificationFilter=void 0,this._defaultMagnificationFilter=void 0,this._tilingScheme=l(e.tilingScheme)?e.tilingScheme:new Qi({ellipsoid:e.ellipsoid}),this._cells=y(e.cells,8),this._color=y(e.color,bCt),this._glowColor=y(e.glowColor,gCt),this._glowWidth=y(e.glowWidth,6),this._backgroundColor=y(e.backgroundColor,yCt),this._errorEvent=new be,this._tileWidth=y(e.tileWidth,256),this._tileHeight=y(e.tileHeight,256),this._canvasSize=y(e.canvasSize,256),this._canvas=this._createGridCanvas()}Object.defineProperties(kS.prototype,{proxy:{get:function(){}},tileWidth:{get:function(){return this._tileWidth}},tileHeight:{get:function(){return this._tileHeight}},maximumLevel:{get:function(){}},minimumLevel:{get:function(){}},tilingScheme:{get:function(){return this._tilingScheme}},rectangle:{get:function(){return this._tilingScheme.rectangle}},tileDiscardPolicy:{get:function(){}},errorEvent:{get:function(){return this._errorEvent}},credit:{get:function(){}},hasAlphaChannel:{get:function(){return!0}}});kS.prototype._drawGrid=function(e){let n=this._canvasSize;for(let i=0;i<=this._cells;++i){let r=1+i/this._cells*(n-1);e.moveTo(r,0),e.lineTo(r,n),e.moveTo(0,r),e.lineTo(n,r)}e.stroke()};kS.prototype._createGridCanvas=function(){let e=document.createElement("canvas");e.width=this._canvasSize,e.height=this._canvasSize;let t=0,n=this._canvasSize,i=e.getContext("2d"),o=this._backgroundColor.toCssColorString();i.fillStyle=o,i.fillRect(t,t,n,n);let r=this._glowColor.toCssColorString();i.strokeStyle=r,i.lineWidth=this._glowWidth,i.strokeRect(t,t,n,n),this._drawGrid(i),i.lineWidth=this._glowWidth*.5,i.strokeRect(t,t,n,n),this._drawGrid(i);let s=this._color.toCssColorString();return i.strokeStyle=s,i.lineWidth=2,i.strokeRect(t,t,n,n),i.lineWidth=1,this._drawGrid(i),e};kS.prototype.getTileCredits=function(e,t,n){};kS.prototype.requestImage=function(e,t,n,i){return Promise.resolve(this._canvas)};kS.prototype.pickFeatures=function(e,t,n,i,o){};var Z6=kS;var Foo=T(S(),1);var aoo=T(S(),1);var Bio=T(S(),1);var dio=T(S(),1);function $h(){}$h._maxDecodingConcurrency=Math.max(Ot.hardwareConcurrency-1,1);$h._decodeTaskProcessor=new Ti("decodeI3S",$h._maxDecodingConcurrency);$h._promise=void 0;async function xCt(){if(await $h._decodeTaskProcessor.initWebAssemblyModule({wasmBinaryFile:"ThirdParty/draco_decoder.wasm"}))return $h._decodeTaskProcessor;throw new ce("I3S decoder could not be initialized.")}$h.decode=async function(e,t,n,i,o){return l($h._promise)||($h._promise=xCt()),$h._promise.then(function(r){let s=n._parent._data,a=n._parent._inverseRotationMatrix,c=0,d=0,u=0;l(s.obb)?(c=s.obb.center[0],d=s.obb.center[1],u=s.obb.center[2]):l(s.mbs)&&(c=s.mbs[0],d=s.mbs[1],u=s.mbs[2]);let h=$.fromRotationX(-W.PI_OVER_TWO),p=new $;$.multiply(h,a,p);let g=he.fromDegrees(c,d,u),f=ne.WGS84.cartographicToCartesian(g),x={binaryData:n._data,featureData:l(i)&&l(i[0])?i[0].data:void 0,schema:t,bufferInfo:n._geometryBufferInfo,ellipsoidRadiiSquare:ne.WGS84.radiiSquared,url:e,geoidDataList:n._dataProvider._geoidDataList,cartographicCenter:g,cartesianCenter:f,parentRotation:p,enableFeatures:n._dataProvider.showFeatures,splitGeometryByColorTransparency:n._dataProvider.adjustMaterialAlphaMode,symbologyData:o,calculateNormals:n._dataProvider.calculateNormals};return r.scheduleTask(x)})};var t9=$h;var fio=T(S(),1);function G6(e,t){this._parent=e,this._dataProvider=e._dataProvider,this._layer=e._layer,l(this._parent._nodeIndex)?this._resource=this._parent._layer.resource.getDerivedResource({url:`nodes/${this._parent._data.mesh.attribute.resource}/${t}`}):this._resource=this._parent.resource.getDerivedResource({url:t})}Object.defineProperties(G6.prototype,{resource:{get:function(){return this._resource}},data:{get:function(){return this._data}}});G6.prototype.load=async function(){return this._data=await ef.loadJson(this._resource),this._data};var n9=G6;var yio=T(S(),1);function F0(e,t){this._storageInfo=t,this._parent=e,this._dataProvider=e._dataProvider,this._loadPromise=void 0;let n=`attributes/${t.key}/0`;l(this._parent._nodeIndex)?this._resource=this._parent._layer.resource.getDerivedResource({url:`nodes/${this._parent._data.mesh.attribute.resource}/${n}`}):this._resource=this._parent.resource.getDerivedResource({url:n})}Object.defineProperties(F0.prototype,{resource:{get:function(){return this._resource}},header:{get:function(){return this._header}},values:{get:function(){if(l(this._values)){if(l(this._values.attributeValues))return this._values.attributeValues;if(l(this._values.objectIds))return this._values.objectIds}return[]}},name:{get:function(){return this._storageInfo.name}}});function TB(e){return e==="UInt8"||e==="Int8"?1:e==="UInt16"||e==="Int16"?2:e==="UInt32"||e==="Int32"||e==="Oid32"||e==="Float32"?4:e==="UInt64"||e==="Int64"||e==="Float64"?8:0}function _Ct(e){return e==="String"?1:TB(e)}async function TCt(e){let t=await e._dataProvider._loadBinary(e._resource),n=new DataView(t);e._data=t,e._validateHeader(n);let i=e._parseHeader(n),o=e._getBodyOffset(i);e._validateBody(n,o),e._parseBody(n,o)}F0.prototype.load=function(){return l(this._loadPromise)?this._loadPromise:(this._loadPromise=TCt(this).catch(function(e){console.error(e)}),this._loadPromise)};F0.prototype._parseValue=function(e,t,n){let i;if(t==="UInt8")i=e.getUint8(n),n+=1;else if(t==="Int8")i=e.getInt8(n),n+=1;else if(t==="UInt16")i=e.getUint16(n,!0),n+=2;else if(t==="Int16")i=e.getInt16(n,!0),n+=2;else if(t==="UInt32")i=e.getUint32(n,!0),n+=4;else if(t==="Oid32")i=e.getUint32(n,!0),n+=4;else if(t==="Int32")i=e.getInt32(n,!0),n+=4;else if(t==="UInt64"){let o=e.getUint32(n,!0),r=e.getUint32(n+4,!0);i=o+Math.pow(2,32)*r,n+=8}else if(t==="Int64"){let o=e.getUint32(n,!0),r=e.getUint32(n+4,!0);r<Math.pow(2,31)?i=o+Math.pow(2,32)*r:i=o+Math.pow(2,32)*(r-Math.pow(2,32)),n+=8}else t==="Float32"?(i=e.getFloat32(n,!0),n+=4):t==="Float64"?(i=e.getFloat64(n,!0),n+=8):t==="String"&&(i=String.fromCharCode(e.getUint8(n)),n+=1);return{value:i,offset:n}};F0.prototype._parseHeader=function(e){let t=0;this._header={};for(let n=0;n<this._storageInfo.header.length;n++){let i=this._storageInfo.header[n],o=this._parseValue(e,i.valueType,t);this._header[i.property]=o.value,t=o.offset}return t};F0.prototype._parseBody=function(e,t){this._values={};for(let n=0;n<this._storageInfo.ordering.length;n++){let i=this._storageInfo.ordering[n],o=i==="ObjectIds"?"objectIds":i,r=this._storageInfo[o];if(l(r)){this._values[o]=[];for(let s=0;s<this._header.count;++s)if(r.valueType!=="String"){let a=this._parseValue(e,r.valueType,t);this._values[o].push(a.value),t=a.offset}else{let a=this._values.attributeByteCounts[s],c="";for(let d=0;d<a;++d){let u=this._parseValue(e,r.valueType,t);u.value.charCodeAt(0)!==0&&(c+=u.value),t=u.offset}this._values[o].push(c)}}}};F0.prototype._getBodyOffset=function(e){let t=0;return l(this._storageInfo.attributeValues)?t=TB(this._storageInfo.attributeValues.valueType):l(this._storageInfo.objectIds)&&(t=TB(this._storageInfo.objectIds.valueType)),t>0?Math.ceil(e/t)*t:e};F0.prototype._validateHeader=function(e){let t=0;for(let n=0;n<this._storageInfo.header.length;n++){let i=this._storageInfo.header[n];t+=_Ct(i.valueType)}if(e.byteLength<t)throw new ce(`Invalid attribute buffer size (field: ${this.name}, header: ${t}, actual: ${e.byteLength})`)};F0.prototype._validateBody=function(e,t){if(!l(this._header.count))throw new ce(`Invalid attribute buffer (field: ${this.name}, count is missing)`);let n;for(let i=0;i<this._storageInfo.ordering.length&&t<e.byteLength;i++){let o=this._storageInfo.ordering[i],r=o==="ObjectIds"?"objectIds":o,s=this._storageInfo[r];if(l(s))if(s.valueType!=="String"){r==="attributeByteCounts"&&(n=t);let a=TB(s.valueType);t+=a*this._header.count}else{if(!l(n))throw new ce(`Invalid attribute buffer (field: ${this.name}, attributeByteCounts is missing)`);for(let a=0;a<this._header.count&&t<e.byteLength;++a){let c=this._parseValue(e,this._storageInfo.attributeByteCounts.valueType,n);t+=c.value,n=c.offset}}else throw new ce(`Invalid attribute buffer (field: ${this.name}, ${r} is missing)`)}if(e.byteLength<t)throw new ce(`Invalid attribute buffer size (field: ${this.name}, expected: ${t}, actual: ${e.byteLength})`)};var i9=F0;var Lio=T(S(),1);function o9(e,t){let n=e._dataProvider,i=e._layer,o;l(e._nodeIndex)?o=i.resource.getDerivedResource({url:`nodes/${e._data.mesh.geometry.resource}/${t}`}):o=e.resource.getDerivedResource({url:t}),this._parent=e,this._dataProvider=n,this._layer=i,this._resource=o,this._customAttributes=void 0}Object.defineProperties(o9.prototype,{resource:{get:function(){return this._resource}},data:{get:function(){return this._data}},customAttributes:{get:function(){return this._customAttributes}}});o9.prototype.load=function(){let e=this;return this._dataProvider._loadBinary(this._resource).then(function(t){return e._data=t,t})};var SCt=new m,CCt=new m,VCt=new m,LCt=new m,RCt=new m;function E6(e,t,n,i){let o=m.subtract(i,n,SCt),r=m.cross(o,m.subtract(e,n,CCt),LCt),s=m.cross(o,m.subtract(t,n,VCt),RCt);return m.dot(r,s)>=0}var ZCt=new m,GCt=new m,ECt=new m,ICt=new m,XCt=new m,WCt=new m,PCt=new m,vCt=new m,wCt=new m,FCt=new m;o9.prototype.getClosestPointIndexOnTriangle=function(e,t,n){if(l(this._customAttributes)&&l(this._customAttributes.positions)){let i=new m(e,t,n);i.x-=this._customAttributes.cartesianCenter.x,i.y-=this._customAttributes.cartesianCenter.y,i.z-=this._customAttributes.cartesianCenter.z,$.multiplyByVector(this._customAttributes.parentRotation,i,i);let o=Number.MAX_VALUE,r,s,a,c,d=this._customAttributes.positions,u=this._customAttributes.indices,h;l(u)?h=u.length:h=d.length/3;for(let p=0;p<h;p++){let g,f,x;l(u)?(g=u[p],f=u[p+1],x=u[p+2]):(g=p*3,f=p*3+1,x=p*3+2);let _=m.fromElements(d[g*3],d[g*3+1],d[g*3+2],ZCt),C=m.fromElements(d[f*3],d[f*3+1],d[f*3+2],GCt),V=new m(d[x*3],d[x*3+1],d[x*3+2],ECt);if(!E6(i,_,C,V)||!E6(i,C,_,V)||!E6(i,V,_,C))continue;let L=m.subtract(C,_,ICt),R=m.subtract(V,_,XCt),G=m.cross(L,R,WCt);if(m.magnitude(G)===0)continue;let I=m.normalize(G,PCt),v=m.subtract(i,_,vCt),P=Math.abs(m.dot(v,I));if(P<o){o=P,r=p;let w=m.magnitudeSquared(m.subtract(i,_,v)),A=m.magnitudeSquared(m.subtract(i,C,wCt)),b=m.magnitudeSquared(m.subtract(i,V,FCt));w<A&&w<b?(a=g,c=_,s=w):A<b?(a=f,c=C,s=A):(a=x,c=V,s=b)}}if(l(r))return{index:a,distanceSquared:s,distance:Math.sqrt(s),queriedPosition:i,closestPosition:m.clone(c)}}return{index:-1,distanceSquared:Number.Infinity,distance:Number.Infinity}};function pCe(e){let t=[],n=e.length;for(let i=0;i<n;i++)i<3?t.push(vS(e[i])):t.push(e[i]);return t}o9.prototype._generateGltf=function(e,t,n,i,o,r,s,a){let c={pbrMetallicRoughness:{metallicFactor:0},doubleSided:!0,name:"Material"},d=!1,u,h="";if(l(this._parent._data.mesh)&&l(this._layer._data.materialDefinitions)){let L=this._parent._data.mesh.material.definition;if(L>=0&&L<this._layer._data.materialDefinitions.length){if(u=this._layer._data.materialDefinitions[L],c=u,l(c.pbrMetallicRoughness)&&l(c.pbrMetallicRoughness.baseColorTexture)){d=!0,c.pbrMetallicRoughness.baseColorTexture.index=0;let R="0";if(l(this._layer._data.textureSetDefinitions))for(let G=0;G<this._layer._data.textureSetDefinitions.length;G++){let I=this._layer._data.textureSetDefinitions[G];for(let v=0;v<I.formats.length;v++){let P=I.formats[v];if(P.format==="jpg"){R=P.name;break}}}l(this._parent._data.mesh)&&this._parent._data.mesh.material.resource>=0&&(h=this._layer.resource.getDerivedResource({url:`nodes/${this._parent._data.mesh.material.resource}/textures/${R}`}).url)}l(c.pbrMetallicRoughness)&&l(c.pbrMetallicRoughness.baseColorFactor)&&(c.pbrMetallicRoughness.baseColorFactor=pCe(c.pbrMetallicRoughness.baseColorFactor)),l(c.emissiveFactor)&&(c.emissiveFactor=pCe(c.emissiveFactor))}}else l(this._parent._data.textureData)&&(d=!0,h=this._parent.resource.getDerivedResource({url:`${this._parent._data.textureData[0].href}`}).url,c.pbrMetallicRoughness.baseColorTexture={index:0});l(c.alphaMode)&&(c.alphaMode=c.alphaMode.toUpperCase());let p=[],g=[],f=[];d&&(p=[{sampler:0,source:0}],g=[{uri:h}],f=[{magFilter:9729,minFilter:9986,wrapS:10497,wrapT:10497}]);let x=[],_=n.length;for(let V=0;V<_;V++){let L=n[V].primitives,R=L.length;for(let G=0;G<R;G++){let I=L[G];if(l(I.material)){for(;I.material>=x.length;){let P=Oe(c,!0);x.push(P)}let v=x[I.material];l(I.extra)&&I.extra.isTransparent?l(v.alphaMode)||(v.alphaMode="BLEND"):v.alphaMode==="BLEND"&&(v.alphaMode="OPAQUE")}}}return{scene:0,scenes:[{nodes:e}],nodes:t,meshes:n,buffers:i,bufferViews:o,accessors:r,materials:x,textures:p,images:g,samplers:f,asset:{version:"2.0"},extensions:s,extensionsUsed:a}};var KL=o9;function Pc(e,t,n){let i,o,r,s;n?(i=0,o=e):(i=e._level+1,o=e._layer),typeof t=="number"?r=t:s=e.resource.getDerivedResource({url:`${t}/`}),this._parent=e,this._dataProvider=e._dataProvider,this._isRoot=n,this._level=i,this._layer=o,this._nodeIndex=r,this._resource=s,this._isLoading=!1,this._tile=void 0,this._data=void 0,this._geometryData=[],this._featureData=[],this._fields={},this._children=[],this._childrenReadyPromise=void 0,this._globalTransform=void 0,this._inverseGlobalTransform=void 0,this._inverseRotationMatrix=void 0,this._symbologyData=void 0}Object.defineProperties(Pc.prototype,{resource:{get:function(){return this._resource}},layer:{get:function(){return this._layer}},parent:{get:function(){return this._parent}},children:{get:function(){return this._children}},geometryData:{get:function(){return this._geometryData}},featureData:{get:function(){return this._featureData}},fields:{get:function(){return this._fields}},tile:{get:function(){return this._tile}},data:{get:function(){return this._data}}});Pc.prototype.load=async function(){let e=this;function t(){if(!e._isRoot){let o=e._create3DTileDefinition();e._tile=new Ku(e._layer._tileset,e._dataProvider.resource,o,e._parent._tile),e._tile._i3sNode=e}}if(!l(this._nodeIndex)){let o=await ef.loadJson(this._resource);e._data=o,t();return}let n=await this._layer._getNodeInNodePages(this._nodeIndex);e._data=n;let i;e._isRoot?i="nodes/root/":l(n.mesh)&&(i=`../${n.mesh.geometry.resource}/`),l(i)&&l(e._parent.resource)&&(e._resource=e._parent.resource.getDerivedResource({url:i})),t()};function bCe(e,t){let n=new i9(e,t);return e._fields[t.name]=n,n.load()}Pc.prototype.loadFields=function(){let e=this._layer._data.attributeStorageInfo,t=[];if(l(e))for(let n=0;n<e.length;n++){let i=e[n],o=this._fields[i.name];l(o)?t.push(o.load()):t.push(bCe(this,i))}return Promise.all(t)};Pc.prototype.loadField=function(e){let t=this._fields[e];if(l(t))return t.load();let n=this._layer._data.attributeStorageInfo;if(l(n))for(let i=0;i<n.length;i++){let o=n[i];if(o.name===e)return bCe(this,o)}return Promise.resolve()};Pc.prototype.getFieldsForPickedPosition=function(e){let t=this.geometryData[0];if(!l(t.customAttributes.featureIndex))return{};let n=t.getClosestPointIndexOnTriangle(e.x,e.y,e.z);if(n.index===-1||n.index>t.customAttributes.featureIndex.length)return{};let i=t.customAttributes.featureIndex[n.index];return this.getFieldsForFeature(i)};Pc.prototype.getFieldsForFeature=function(e){let t={};for(let n in this.fields)if(this.fields.hasOwnProperty(n)){let i=this.fields[n];e>=0&&e<i.values.length&&(t[i.name]=i.values[e])}return t};Pc.prototype._loadChildren=function(){let e=this;if(l(this._childrenReadyPromise))return this._childrenReadyPromise;let t=[];if(l(e._data.children))for(let n=0;n<e._data.children.length;n++){let i=e._data.children[n],o=new Pc(e,y(i.href,i),!1);e._children.push(o),t.push(o.load())}return this._childrenReadyPromise=Promise.all(t).then(function(){for(let n=0;n<e._children.length;n++)e._tile.children.push(e._children[n]._tile)}),this._childrenReadyPromise};Pc.prototype._loadGeometryData=function(){let e=[];if(l(this._data.geometryData))for(let t=0;t<this._data.geometryData.length;t++){let n=new KL(this,this._data.geometryData[t].href);this._geometryData.push(n),e.push(n.load())}else if(l(this._data.mesh)){let t=this._layer._findBestGeometryBuffers(this._data.mesh.geometry.definition,["position","uv0"]),n=`./geometries/${t.bufferIndex}/`,i=new KL(this,n);i._geometryDefinitions=t.definition,i._geometryBufferInfo=t.geometryBufferInfo,this._geometryData.push(i),e.push(i.load())}return Promise.all(e)};Pc.prototype._loadFeatureData=function(){let e=[];if(l(this._data.featureData))for(let t=0;t<this._data.featureData.length;t++){let n=new n9(this,this._data.featureData[t].href);this._featureData.push(n),e.push(n.load())}return Promise.all(e)};Pc.prototype._clearGeometryData=function(){this._geometryData=[]};Pc.prototype._create3DTileDefinition=function(){let e=this._data.obb,t=this._data.mbs;if(!l(e)&&!l(t)){console.error("Failed to load I3S node. Bounding volume is required.");return}let n;if(l(e)?n=he.fromDegrees(e.center[0],e.center[1],e.center[2]):n=he.fromDegrees(t[0],t[1],t[2]),l(this._dataProvider._geoidDataList)&&l(n))for(let C=0;C<this._dataProvider._geoidDataList.length;C++){let V=this._dataProvider._geoidDataList[C],L=V.projection.project(n);if(L.x>V.nativeExtent.west&&L.x<V.nativeExtent.east&&L.y>V.nativeExtent.south&&L.y<V.nativeExtent.north){n.height+=kCt(L.x,L.y,V);break}}let i={},o,r=0;l(e)?(i={box:[0,0,0,e.halfSize[0],0,0,0,e.halfSize[1],0,0,0,e.halfSize[2]]},r=Math.max(Math.max(this._data.obb.halfSize[0],this._data.obb.halfSize[1]),this._data.obb.halfSize[2]),o=ne.WGS84.cartographicToCartesian(n)):(i={sphere:[0,0,0,t[3]]},o=ne.WGS84.cartographicToCartesian(n),r=this._data.mbs[3]),r*=2;let s=1/0;if(l(this._data.lodThreshold))if(this._layer._data.nodePages.lodSelectionMetricType==="maxScreenThresholdSQ"){let C=Math.sqrt(this._data.lodThreshold/(Math.PI*.25));s=r/C}else if(this._layer._data.nodePages.lodSelectionMetricType==="maxScreenThreshold"){let C=this._data.lodThreshold;s=r/C}else console.error("Invalid lodSelectionMetricType in Layer");else if(l(this._data.lodSelection))for(let C=0;C<this._data.lodSelection.length;C++)this._data.lodSelection[C].metricType==="maxScreenThreshold"&&(s=r/this._data.lodSelection[C].maxError);s===1/0&&(s=1e5);let a=s*16,c=new Xa(0,0,0),d=wt.headingPitchRollQuaternion(o,c);l(this._data.obb)&&(d=new Fe(this._data.obb.quaternion[0],this._data.obb.quaternion[1],this._data.obb.quaternion[2],this._data.obb.quaternion[3]));let u=$.fromQuaternion(d),h=$.inverse(u,new $),p=new M(u[0],u[1],u[2],0,u[3],u[4],u[5],0,u[6],u[7],u[8],0,o.x,o.y,o.z,1),g=M.inverse(p,new M),f=M.clone(p);l(this._parent._globalTransform)&&M.multiply(p,this._parent._inverseGlobalTransform,f),this._globalTransform=p,this._inverseGlobalTransform=g,this._inverseRotationMatrix=h;let x=[];for(let C=0;C<this._children.length;C++)x.push(this._children[C]._create3DTileDefinition());return{children:x,refine:"REPLACE",boundingVolume:i,transform:[f[0],f[4],f[8],f[12],f[1],f[5],f[9],f[13],f[2],f[6],f[10],f[14],f[3],f[7],f[11],f[15]],content:{uri:l(this._resource)?this._resource.url:void 0},geometricError:a}};Pc.prototype._loadSymbology=async function(){!l(this._symbologyData)&&l(this._layer._symbology)&&(this._symbologyData=await this._layer._symbology._getSymbology(this))};Pc.prototype._createContentURL=async function(){let e={scene:0,scenes:[{nodes:[0]}],nodes:[{name:"singleNode"}],meshes:[],buffers:[],bufferViews:[],accessors:[],materials:[],textures:[],images:[],samplers:[],asset:{version:"2.0"}},t=[this._loadGeometryData()];if(this._dataProvider.legacyVersion16&&t.push(this._loadFeatureData()),await Promise.all(t),l(this._geometryData)&&this._geometryData.length>0){this._dataProvider._applySymbology&&await this._loadSymbology();let o=this._geometryData[0].resource.url,r=this._layer._data.store.defaultGeometrySchema,s=this._geometryData[0],a=await t9.decode(o,r,s,this._featureData[0],this._symbologyData);if(!l(a))return;e=s._generateGltf(a.meshData.nodesInScene,a.meshData.nodes,a.meshData.meshes,a.meshData.buffers,a.meshData.bufferViews,a.meshData.accessors,a.meshData.rootExtensions,a.meshData.extensionsUsed),this._geometryData[0]._customAttributes=a.meshData._customAttributes}let n=this._dataProvider._binarizeGltf(e),i=new Blob([n],{type:"application/binary"});return URL.createObjectURL(i)};async function ACt(e){let t=e._layer._filters,n=[];for(let i=0;i<t.length;i++){let o=e.loadField(t[i].name);n.push(o)}return await Promise.all(n),t}function MCt(e,t,n){if(!l(n.values)||n.values.length===0)return!1;let i=l(t)?t.values:[],o;e<i.length&&(o=i[e]);let r=!1;for(let s=0;s<n.values.length;s++)if(n.values[s]===o){r=!0;break}return r}async function gCe(e,t){let n=e._tile.content.batchTable;if(l(n)&&n.featuresLength>0){n.setAllShow(!0);let i=await ACt(e);if(i.length>0)for(let o=0;o<n.featuresLength;o++)for(let r=0;r<i.length;r++){let s=i[r];if(!MCt(o,e._fields[s.name],s)){n.setShow(o,!1);break}}}t.show=!0}Pc.prototype._filterFeatures=function(){var n,i;let e=[];for(let o=0;o<this._children.length;o++){let r=this._children[o]._filterFeatures();e.push(r)}let t=(i=(n=this._tile)==null?void 0:n.content)==null?void 0:i._model;if(l(this._geometryData)&&this._geometryData.length>0&&l(t)&&t.ready){t.show=!1;let o=gCe(this,t);e.push(o)}return Promise.all(e)};Ku.prototype._hookedRequestContent=Ku.prototype.requestContent;Ku.prototype.requestContent=function(){if(!this.tileset._isI3STileSet)return this._hookedRequestContent();if(!this._isLoading){this._isLoading=!0;let e=this;return this._i3sNode._createContentURL().then(t=>{if(!l(t)){e._isLoading=!1;return}return e._contentResource=new Re({url:t}),e._hookedRequestContent()}).then(t=>{let n=t==null?void 0:t._model;return l(e._i3sNode._geometryData)&&e._i3sNode._geometryData.length>0&&l(n)&&(n.show=!1,n.readyEvent.addEventListener(()=>{gCe(e._i3sNode,n)})),e._isLoading=!1,t})}};function NCt(e,t,n,i,o,r){let s=n*(1-e)+i*e,a=o*(1-e)+r*e;return s*(1-t)+a*t}function SB(e,t,n,i){let o=e+t*n;return i[o]}function kCt(e,t,n){let i=n.nativeExtent,o=(e-i.west)/(i.east-i.west)*(n.width-1),r=(t-i.south)/(i.north-i.south)*(n.height-1),s=Math.floor(o),a=Math.floor(r);o-=s,r-=a;let c=s<n.width?s+1:s,d=a<n.height?a+1:a;a=n.height-1-a,d=n.height-1-d;let u=SB(s,a,n.width,n.buffer),h=SB(c,a,n.width,n.buffer),p=SB(s,d,n.width,n.buffer),g=SB(c,d,n.width,n.buffer),f=NCt(o,r,u,h,p,g);return f=f*n.scale+n.offset,f}Object.defineProperties(Ku.prototype,{i3sNode:{get:function(){return this._i3sNode}}});var JL=Pc;var Jio=T(S(),1);function CB(e){this._layer=e,this._defaultSymbology=void 0,this._valueFields=[],this._uniqueValueHash=void 0,this._classBreaksHash=void 0,this._parseLayerSymbology()}Object.defineProperties(CB.prototype,{defaultSymbology:{get:function(){return this._defaultSymbology}}});function I6(e,t){let n=[];for(let i=0;i<e.length;i++){let o=B.byteToFloat(e[i]);i<3?n.push(vS(o)):n.push(o)}return n.length===3&&(l(t)?n.push(1-t/100):n.push(1)),n}function QL(e,t){let n={edges:void 0,material:void 0};if(l(e)&&l(e.symbolLayers))for(let i=0;i<e.symbolLayers.length;i++){let o=e.symbolLayers[i];if(o.type==="Fill"){let r=o.edges,s=o.outline;if(l(r)?(n.edges={},l(r.color)&&(n.edges.color=I6(r.color,r.transparency))):l(s)&&(n.edges={},l(s.color)&&(n.edges.color=I6(s.color,s.transparency))),!t){let a=o.material;l(a)&&(n.material={colorMixMode:a.colorMixMode},l(a.color)&&(n.material.color=I6(a.color,a.transparency)))}break}}return n}function UCt(e,t){if(l(e.uniqueValueGroups)){let n={};for(let i=0;i<e.uniqueValueGroups.length;i++){let o=e.uniqueValueGroups[i].classes;if(l(o))for(let r=0;r<o.length;r++){let s=QL(o[r].symbol,t),a=o[r].values;for(let c=0;c<a.length;c++){let d=a[c],u=n;for(let h=0;h<d.length;h++){let p=d[h];h===d.length-1?u[p]=s:(l(u[p])||(u[p]={}),u=u[p])}}}}return n}if(l(e.uniqueValueInfos)){let n={};for(let i=0;i<e.uniqueValueInfos.length;i++){let o=e.uniqueValueInfos[i];n[o.value]=QL(o.symbol,t)}return n}}function DCt(e,t){if(l(e.classBreakInfos)){let n=[...e.classBreakInfos];n.sort(function(o,r){let s=y(o.classMaxValue,o.classMinValue),a=y(r.classMaxValue,r.classMinValue);return s-a});let i={ranges:[],symbols:[]};l(e.minValue)&&(i.ranges.push(e.minValue),i.symbols.push(void 0));for(let o=0;o<n.length;o++){let r=n[o];l(r.classMinValue)&&(i.ranges.length===0||r.classMinValue>i.ranges[i.ranges.length-1])&&(i.ranges.push(r.classMinValue),i.symbols.push(void 0)),l(r.classMaxValue)&&(i.ranges.length===0||r.classMaxValue>i.ranges[i.ranges.length-1])&&(i.ranges.push(r.classMaxValue),i.symbols.push(QL(r.symbol,t)))}return i.symbols.push(void 0),i}}CB.prototype._parseLayerSymbology=function(){let e=this._layer.data.drawingInfo;if(l(e)&&l(e.renderer)){let t=this._layer.data.cachedDrawingInfo,n=l(t)&&t.color===!0,i=e.renderer;i.type==="simple"?this._defaultSymbology=QL(i.symbol,n):i.type==="uniqueValue"?(this._defaultSymbology=QL(i.defaultSymbol,n),this._valueFields.push(i.field1),l(i.field2)&&this._valueFields.push(i.field2),l(i.field3)&&this._valueFields.push(i.field3),this._uniqueValueHash=UCt(i,n)):i.type==="classBreaks"&&(this._defaultSymbology=QL(i.defaultSymbol,n),this._valueFields.push(i.field),this._classBreaksHash=DCt(i,n))}};function yCe(e,t,n,i){let o=t[n];if(i<o.length){let r=o[i],s=e[r];return l(s)&&++n<t.length?yCe(s,t,n,i):s}}function BCt(e,t){let n=0,i=e.length;if(n<i)do{let o=n+i>>>1;e[o]<t?n=o+1:i=o}while(n<i);return n}function OCt(e,t,n){let i=t[n],o=BCt(e.ranges,i);return e.symbols[o]}CB.prototype._getSymbology=async function(e){let t={default:this._defaultSymbology};if(this._valueFields.length>0){let n=[];for(let r=0;r<this._valueFields.length;r++)n.push(e.loadField(this._valueFields[r]));await Promise.all(n);let i=[];for(let r=0;r<this._valueFields.length;r++)i.push(e.fields[this._valueFields[r]].values);let o;if(l(this._uniqueValueHash)?o=r=>yCe(this._uniqueValueHash,i,0,r):l(this._classBreaksHash)&&(o=r=>OCt(this._classBreaksHash,i[0],r)),l(o)){let r=i[0];for(let s=0;s<r.length;s++){let a=o(s);l(a)&&(t[s]=a)}}}return t};var r9=CB;function ld(e,t,n){this._dataProvider=e,this._parent=n,!l(t.href)&&l(t.id)&&(t.href=`layers/${t.id}`);let i=this._parent.resource.getUrlComponent(),o="";i.match(/layers\/\d/)?o=`${i}`.replace(/\/+$/,""):o=`${i}`.replace(/\/?$/,"/").concat(`${t.href}`),this._version=t.store.version;let r=this._version.split(".");this._majorVersion=parseInt(r[0]),this._minorVersion=r.length>1?parseInt(r[1]):0,this._resource=new Re({url:o}),this._resource.setQueryParameters(this._dataProvider.resource.queryParameters),this._resource.appendForwardSlash(),this._data=t,this._rootNode=void 0,this._nodePages={},this._nodePageFetches={},this._extent=void 0,this._tileset=void 0,this._geometryDefinitions=void 0,this._filters=[],this._symbology=void 0,this._computeGeometryDefinitions(!0),this._computeExtent()}Object.defineProperties(ld.prototype,{resource:{get:function(){return this._resource}},rootNode:{get:function(){return this._rootNode}},tileset:{get:function(){return this._tileset}},data:{get:function(){return this._data}},version:{get:function(){return this._version}},majorVersion:{get:function(){return this._majorVersion}},minorVersion:{get:function(){return this._minorVersion}},legacyVersion16:{get:function(){if(l(this.version))return this.majorVersion<1||this.majorVersion===1&&this.minorVersion<=6}}});ld.prototype.load=async function(e){if(this._data.spatialReference.wkid!==4326)throw new ce(`Unsupported spatial reference: ${this._data.spatialReference.wkid}`);if(this._dataProvider.applySymbology&&(this._symbology=new r9(this)),await this._dataProvider.loadGeoidData(),await this._loadRootNode(e),await this._create3DTileset(e),this._rootNode._tile=this._tileset._root,this._tileset._root._i3sNode=this._rootNode,this.legacyVersion16)return this._rootNode._loadChildren()};ld.prototype._computeGeometryDefinitions=function(e){if(this._geometryDefinitions=[],l(this._data.geometryDefinitions))for(let t=0;t<this._data.geometryDefinitions.length;t++){let n=[],i=this._data.geometryDefinitions[t].geometryBuffers;for(let o=0;o<i.length;o++){let r=i[o],s=[],a=!1;if(l(r.compressedAttributes)&&e){a=!0;let c=r.compressedAttributes.attributes;for(let d=0;d<c.length;d++)s.push(c[d])}else for(let c in r)c!=="offset"&&s.push(c);n.push({compressed:a,attributes:s,index:i.indexOf(r)})}n.sort(function(o,r){return o.compressed&&!r.compressed?-1:!o.compressed&&r.compressed?1:o.attributes.length-r.attributes.length}),this._geometryDefinitions.push(n)}};ld.prototype._findBestGeometryBuffers=function(e,t){let n=this._geometryDefinitions[e];if(l(n)){for(let i=0;i<n.length;++i){let o=n[i],r=!1,s=o.attributes;for(let a=0;a<t.length;a++)if(!s.includes(t[a])){r=!0;break}if(!r)return{bufferIndex:o.index,definition:n,geometryBufferInfo:o}}if(l(n[0]))return{bufferIndex:0,definition:n,geometryBufferInfo:n[0]}}};ld.prototype._loadRootNode=function(e){if(l(this._data.nodePages)){let t=0;l(this._data.nodePages.rootIndex)&&(t=this._data.nodePages.rootIndex),this._rootNode=new JL(this,t,!0)}else this._rootNode=new JL(this,this._data.store.rootNode,!0);return this._rootNode.load(e)};ld.prototype._getNodeInNodePages=function(e){let t=Math.floor(e/this._data.nodePages.nodesPerPage),n=e%this._data.nodePages.nodesPerPage;return this._loadNodePage(t).then(function(i){return i.nodes[n]})};ld._fetchJson=function(e){return e.fetchJson()};ld.prototype._loadNodePage=function(e){let t=this;if(!l(this._nodePageFetches[e])){let n=this.resource.getDerivedResource({url:`nodepages/${e}/`}),i=ld._fetchJson(n).then(function(o){return l(o.error)&&o.error.code!==200?Promise.reject(o.error):(t._nodePages[e]=o.nodes,o)});this._nodePageFetches[e]=i}return this._nodePageFetches[e]};ld.prototype._computeExtent=function(){l(this._data.fullExtent)?this._extent=le.fromDegrees(this._data.fullExtent.xmin,this._data.fullExtent.ymin,this._data.fullExtent.xmax,this._data.fullExtent.ymax):l(this._data.store.extent)&&(this._extent=le.fromDegrees(this._data.store.extent[0],this._data.store.extent[1],this._data.store.extent[2],this._data.store.extent[3]))};ld.prototype._create3DTileset=async function(e){var r,s,a;let t={asset:{version:"1.0"},geometricError:Number.MAX_VALUE,root:this._rootNode._create3DTileDefinition()},n=new Blob([JSON.stringify(t)],{type:"application/json"}),i=URL.createObjectURL(n),o=(a=(s=(r=this._symbology)==null?void 0:r.defaultSymbology)==null?void 0:s.edges)==null?void 0:a.color;l(o)&&!l(e==null?void 0:e.outlineColor)&&(e=l(e)?Oe(e):{},e.outlineColor=B.fromCartesian4(re.fromArray(o))),this._tileset=await xs.fromUrl(i,e),this._tileset.show=this._parent.show,this._tileset._isI3STileSet=!0,this._tileset.tileUnload.addEventListener(function(c){c._i3sNode._clearGeometryData(),URL.revokeObjectURL(c._contentResource._url),c._contentResource=c._i3sNode.resource}),this._tileset.tileVisible.addEventListener(function(c){l(c._i3sNode)&&c._i3sNode._loadChildren()})};ld.prototype._updateVisibility=function(){l(this._tileset)&&(this._tileset.show=this._parent.show)};ld.prototype.filterByAttributes=function(e){this._filters=l(e)?Oe(e,!0):[];let t=this._rootNode;return l(t)?t._filterFeatures():Promise.resolve()};var US=ld;var moo=T(S(),1);function VB(e,t){this._dataProvider=e,this._resource=new Re({url:t}),this._resource.setQueryParameters(e.resource.queryParameters),this._resource.appendForwardSlash()}Object.defineProperties(VB.prototype,{resource:{get:function(){return this._resource}},data:{get:function(){return this._data}},names:{get:function(){let e=[],t=this._data.summary;if(l(t))for(let n=0;n<t.length;++n)e.push(t[n].fieldName);return e}}});VB.prototype.load=async function(){return this._data=await ef.loadJson(this._resource),this._data};VB.prototype._getValues=function(e){let t=this._data.summary;if(l(t))for(let n=0;n<t.length;++n){let i=t[n];if(i.fieldName===e)return l(i.mostFrequentValues)?[...i.mostFrequentValues]:[]}};var s9=VB;var xoo=T(S(),1);function a9(e,t,n){this._dataProvider=e,this._parent=t,this._data=n,this._name=n.name,this._modelName=n.modelName,this._visibility=y(n.visibility,!0),this._resource=void 0,this._sublayers=[],this._i3sLayers=[]}Object.defineProperties(a9.prototype,{resource:{get:function(){return this._resource}},data:{get:function(){return this._data}},name:{get:function(){return this._name}},modelName:{get:function(){return this._modelName}},sublayers:{get:function(){return this._sublayers}},visibility:{get:function(){return this._visibility},set:function(e){if(this._visibility!==e){this._visibility=e;for(let t=0;t<this._i3sLayers.length;t++)this._i3sLayers[t]._updateVisibility()}}},show:{get:function(){return this._visibility&&this._parent.show}}});a9._fromData=async function(e,t,n,i){let o=new a9(e,i,n);if(o._data.layerType==="group"){let r=o._data.sublayers;if(l(r)){let s=[];for(let c=0;c<r.length;c++){let d=a9._fromData(e,t,r[c],o);s.push(d)}let a=await Promise.all(s);for(let c=0;c<a.length;c++){let d=a[c];o._sublayers.push(d),o._i3sLayers.push(...d._i3sLayers)}}}else if(o._data.layerType==="3DObject"){let r=t.concat(`/sublayers/${o._data.id}`),s=new Re({url:r});s.setQueryParameters(e.resource.queryParameters),s.appendForwardSlash(),o._resource=s;let a=await ef.loadJson(o._resource),c=new US(e,a,o);o._i3sLayers.push(c)}else console.log(`${o._data.layerType} layer ${o._data.name} is skipped as not supported.`);return o};var c9=a9;var TCe=T(xCe(),1);function Cs(e){e=y(e,y.EMPTY_OBJECT),this._name=e.name,this._show=y(e.show,!0),this._geoidTiledTerrainProvider=e.geoidTiledTerrainProvider,this._showFeatures=y(e.showFeatures,!1),this._adjustMaterialAlphaMode=y(e.adjustMaterialAlphaMode,!1),this._applySymbology=y(e.applySymbology,!1),this._calculateNormals=y(e.calculateNormals,!1),this._cesium3dTilesetOptions=y(e.cesium3dTilesetOptions,y.EMPTY_OBJECT),this._layers=[],this._sublayers=[],this._data=void 0,this._extent=void 0,this._geoidDataPromise=void 0,this._geoidDataList=void 0,this._decoderTaskProcessor=void 0,this._taskProcessorReadyPromise=void 0,this._attributeStatistics=[],this._layersExtent=[]}Object.defineProperties(Cs.prototype,{name:{get:function(){return this._name}},show:{get:function(){return this._show},set:function(e){if(this._show!==e){this._show=e;for(let t=0;t<this._layers.length;t++)this._layers[t]._updateVisibility()}}},geoidTiledTerrainProvider:{get:function(){return this._geoidTiledTerrainProvider}},layers:{get:function(){return this._layers}},sublayers:{get:function(){return this._sublayers}},data:{get:function(){return this._data}},extent:{get:function(){return this._extent}},resource:{get:function(){return this._resource}},showFeatures:{get:function(){return this._showFeatures}},adjustMaterialAlphaMode:{get:function(){return this._adjustMaterialAlphaMode}},applySymbology:{get:function(){return this._applySymbology}},calculateNormals:{get:function(){return this._calculateNormals}}});Cs.prototype.destroy=function(){for(let e=0;e<this._layers.length;e++)l(this._layers[e]._tileset)&&this._layers[e]._tileset.destroy();return me(this)};Cs.prototype.isDestroyed=function(){return!1};Cs.prototype.update=function(e){for(let t=0;t<this._layers.length;t++)l(this._layers[t]._tileset)&&this._layers[t]._tileset.update(e)};Cs.prototype.prePassesUpdate=function(e){for(let t=0;t<this._layers.length;t++)l(this._layers[t]._tileset)&&this._layers[t]._tileset.prePassesUpdate(e)};Cs.prototype.postPassesUpdate=function(e){for(let t=0;t<this._layers.length;t++)l(this._layers[t]._tileset)&&this._layers[t]._tileset.postPassesUpdate(e)};Cs.prototype.updateForPass=function(e,t){for(let n=0;n<this._layers.length;n++)l(this._layers[n]._tileset)&&this._layers[n]._tileset.updateForPass(e,t)};function YCt(e,t){let n=e.resource.getUrlComponent(),i="";return n.match(/layers\/\d/)?i=`${n}`.replace(/\/+$/,""):i=`${n}`.replace(/\/?$/,"/").concat(`layers/${t}`),i}async function _Ce(e,t,n){if(t.layerType==="Building"){l(n.showFeatures)||(e._showFeatures=!0),l(n.adjustMaterialAlphaMode)||(e._adjustMaterialAlphaMode=!0),l(n.applySymbology)||(e._applySymbology=!0),l(n.calculateNormals)||(e._calculateNormals=!0);let i=YCt(e,t.id);if(l(t.sublayers)){let o=[];for(let s=0;s<t.sublayers.length;s++){let a=c9._fromData(e,i,t.sublayers[s],e);o.push(a)}let r=await Promise.all(o);for(let s=0;s<r.length;s++){let a=r[s];e._sublayers.push(a),e._layers.push(...a._i3sLayers)}}if(l(t.statisticsHRef)){let o=i.concat(`/${t.statisticsHRef}`),r=new s9(e,o);await r.load(),e._attributeStatistics.push(r)}if(l(t.fullExtent)){let o=le.fromDegrees(t.fullExtent.xmin,t.fullExtent.ymin,t.fullExtent.xmax,t.fullExtent.ymax);e._layersExtent.push(o)}}else if(t.layerType==="3DObject"||t.layerType==="IntegratedMesh"){!l(n.calculateNormals)&&!l(t.textureSetDefinitions)&&(e._calculateNormals=!0);let i=new US(e,t,e);e._layers.push(i),l(i._extent)&&e._layersExtent.push(i._extent)}else console.log(`${t.layerType} layer ${t.name} is skipped as not supported.`)}Cs.fromUrl=async function(e,t){t=y(t,y.EMPTY_OBJECT);let n=Re.createIfNeeded(e);n.setQueryParameters({f:"pjson"},!0);let i=await Cs.loadJson(n),o=new Cs(t);if(o._resource=n,o._data=i,l(i.layers)){let s=[];for(let a=0;a<i.layers.length;a++){let c=_Ce(o,i.layers[a],t);s.push(c)}await Promise.all(s)}else await _Ce(o,i,t);o._computeExtent();let r=[];for(let s=0;s<o._layers.length;s++)r.push(o._layers[s].load(t.cesium3dTilesetOptions));return await Promise.all(r),o};Cs._fetchJson=function(e){return e.fetchJson()};Cs.loadJson=async function(e){let t=await Cs._fetchJson(e);if(l(t.error)){if(console.error("Failed to fetch I3S ",e.url),l(t.error.message)&&console.error(t.error.message),l(t.error.details))for(let n=0;n<t.error.details.length;n++)console.log(t.error.details[n]);throw new ce(t.error)}return t};Cs.prototype._loadBinary=async function(e){let t=await e.fetchArrayBuffer();if(t.byteLength>0&&new Uint8Array(t)[0]===123&&new TextDecoder().decode(t).includes("404"))throw new ce(`Failed to load binary: ${e.url}`);return t};Cs.prototype._binarizeGltf=function(e){let n=new TextEncoder().encode(JSON.stringify(e)),i=new Uint8Array(n.byteLength+20),o={magic:new Uint8Array(i.buffer,0,4),version:new Uint32Array(i.buffer,4,1),length:new Uint32Array(i.buffer,8,1),chunkLength:new Uint32Array(i.buffer,12,1),chunkType:new Uint32Array(i.buffer,16,1),chunkData:new Uint8Array(i.buffer,20,n.byteLength)};return o.magic[0]=103,o.magic[1]=108,o.magic[2]=84,o.magic[3]=70,o.version[0]=2,o.length[0]=i.byteLength,o.chunkLength[0]=n.byteLength,o.chunkType[0]=1313821514,o.chunkData.set(n),i};var HCt=new D;function zCt(e,t){let n=e.tilingScheme,i=[],o={},r=e._lodCount,s=he.fromRadians(t.west,t.north),a=he.fromRadians(t.east,t.south),c=n.positionToTileXY(s,r),d=n.positionToTileXY(a,r);for(let h=c.x;h<=d.x;h++)for(let p=c.y;p<=d.y;p++){let g=D.fromElements(h,p,HCt),f=g.toString();if(!o.hasOwnProperty(f)){let x={x:g.x,y:g.y,level:r,tilingScheme:n,terrainProvider:e,positions:[]};o[f]=x,i.push(x)}}let u=[];for(let h=0;h<i.length;++h){let p=i[h],g=p.terrainProvider.requestTileGeometry(p.x,p.y,p.level);u.push(g)}return Promise.all(u).then(function(h){let p=[];for(let g=0;g<h.length;g++){let f={tilingScheme:n,x:i[g].x,y:i[g].y,level:i[g].level},x=h[g],_="Geographic";n._projection instanceof Wi&&(_="WebMercator");let C={projectionType:_,projection:n._projection,nativeExtent:n.tileXYToNativeRectangle(f.x,f.y,f.level),height:x._height,width:x._width,scale:x._structure.heightScale,offset:x._structure.heightOffset};if(x._encoding===dm.LERC){let V=TCe.default.decode(x._buffer);C.buffer=V.pixels[0]}else C.buffer=x._buffer;p.push(C)}return p})}async function KCt(e){let t=e._geoidTiledTerrainProvider;if(l(t))try{let n=await zCt(t,e._extent);e._geoidDataList=n}catch{console.log("Error retrieving Geoid Terrain tiles - no geoid conversion will be performed.")}}Cs.prototype.loadGeoidData=async function(){return l(this._geoidDataPromise)?this._geoidDataPromise:(this._geoidDataPromise=KCt(this),this._geoidDataPromise)};Cs.prototype._computeExtent=function(){let e;for(let t=0;t<this._layersExtent.length;t++){let n=this._layersExtent[t];l(e)?le.union(e,n,e):e=le.clone(n)}this._extent=e};Cs.prototype.getAttributeNames=function(){let e=[];for(let t=0;t<this._attributeStatistics.length;++t)e.push(...this._attributeStatistics[t].names);return e};Cs.prototype.getAttributeValues=function(e){for(let t=0;t<this._attributeStatistics.length;++t){let n=this._attributeStatistics[t]._getValues(e);if(l(n))return n}return[]};Cs.prototype.filterByAttributes=function(e){let t=[];for(let n=0;n<this._layers.length;n++){let i=this._layers[n].filterByAttributes(e);t.push(i)}return Promise.all(t)};var ef=Cs;var Yoo=T(S(),1);var l9={};l9.createTilesetFromIModelId=async function(e,t){let{exports:n}=await Ns.getExports(e);if(n.length>0&&n.every(a=>a.status===Ns.ExportStatus.Invalid))throw new ce(`All exports for this iModel are Invalid: ${e}`);let i=n.find(a=>a.status===Ns.ExportStatus.Complete);if(!l(i))return;let o=new URL(i._links.mesh.href);o.pathname=`${o.pathname}/tileset.json`;let r=o.toString(),s=new Re({url:r});return xs.fromUrl(s,t)};l9.createTilesetForRealityDataId=async function(e,t,n,i){if(!l(n)||!l(i)){let s=await Ns.getRealityDataMetadata(e,t);i=s.rootDocument,n=s.type}if(![Ns.RealityDataType.Cesium3DTiles,Ns.RealityDataType.PNTS,Ns.RealityDataType.RealityMesh3DTiles,Ns.RealityDataType.Terrain3DTiles].includes(n))throw new ce(`Reality data type is not a mesh type: ${n}`);let r=await Ns.getRealityDataURL(e,t,i);return xs.fromUrl(r,{maximumScreenSpaceError:4})};l9.createDataSourceForRealityDataId=async function(e,t,n,i){if(!l(n)||!l(i)){let s=await Ns.getRealityDataMetadata(e,t);i=s.rootDocument,n=s.type}if(![Ns.RealityDataType.KML,Ns.RealityDataType.GeoJSON].includes(n))throw new ce(`Reality data type is not a data source type: ${n}`);let r=await Ns.getRealityDataURL(e,t,i);return n===Ns.RealityDataType.GeoJSON?Cy.load(r):NT.load(r)};l9.loadGeospatialFeatures=async function(e,t,n){let i=n!=null?n:1e4,o=`${Ns.apiEndpoint}geospatial-features/itwins/${e}/ogc/collections/${t}/items`,r=new Re({url:o,headers:{Authorization:`Bearer ${Ns.defaultAccessToken}`,Accept:"application/vnd.bentley.itwin-platform.v1+json"},queryParameters:{limit:i,client:"CesiumJS"}});return Cy.load(r)};var X6=l9;var Koo=T(S(),1);function SCe(){}Object.defineProperties(SCe.prototype,{color:{get:fe.throwInstantiationError},intensity:{get:fe.throwInstantiationError}});var W6=SCe;var tro=T(S(),1);var JCt=/\/$/,CCe=new Rt('© <a href="https://www.mapbox.com/about/maps/">Mapbox</a> © <a href="http://www.openstreetmap.org/copyright">OpenStreetMap</a> <strong><a href="https://www.mapbox.com/map-feedback/">Improve this map</a></strong>');function jL(e){e=y(e,y.EMPTY_OBJECT);let t=e.styleId,n=e.accessToken;this._defaultAlpha=void 0,this._defaultNightAlpha=void 0,this._defaultDayAlpha=void 0,this._defaultBrightness=void 0,this._defaultContrast=void 0,this._defaultHue=void 0,this._defaultSaturation=void 0,this._defaultGamma=void 0,this._defaultMinificationFilter=void 0,this._defaultMagnificationFilter=void 0;let i=Re.createIfNeeded(y(e.url,"https://api.mapbox.com/styles/v1/"));this._styleId=t,this._accessToken=n;let o=y(e.tilesize,512);this._tilesize=o;let r=y(e.username,"mapbox");this._username=r;let s=l(e.scaleFactor)?"@2x":"",a=i.getUrlComponent();JCt.test(a)||(a+="/"),a+=`${this._username}/${t}/tiles/${this._tilesize}/{z}/{x}/{y}${s}`,i.url=a,i.setQueryParameters({access_token:n});let c;l(e.credit)?(c=e.credit,typeof c=="string"&&(c=new Rt(c))):c=CCe,this._resource=i,this._imageryProvider=new Ka({url:i,credit:c,ellipsoid:e.ellipsoid,minimumLevel:e.minimumLevel,maximumLevel:e.maximumLevel,rectangle:e.rectangle})}Object.defineProperties(jL.prototype,{url:{get:function(){return this._imageryProvider.url}},rectangle:{get:function(){return this._imageryProvider.rectangle}},tileWidth:{get:function(){return this._imageryProvider.tileWidth}},tileHeight:{get:function(){return this._imageryProvider.tileHeight}},maximumLevel:{get:function(){return this._imageryProvider.maximumLevel}},minimumLevel:{get:function(){return this._imageryProvider.minimumLevel}},tilingScheme:{get:function(){return this._imageryProvider.tilingScheme}},tileDiscardPolicy:{get:function(){return this._imageryProvider.tileDiscardPolicy}},errorEvent:{get:function(){return this._imageryProvider.errorEvent}},credit:{get:function(){return this._imageryProvider.credit}},proxy:{get:function(){return this._imageryProvider.proxy}},hasAlphaChannel:{get:function(){return this._imageryProvider.hasAlphaChannel}}});jL.prototype.getTileCredits=function(e,t,n){};jL.prototype.requestImage=function(e,t,n,i){return this._imageryProvider.requestImage(e,t,n,i)};jL.prototype.pickFeatures=function(e,t,n,i,o){return this._imageryProvider.pickFeatures(e,t,n,i,o)};jL._defaultCredit=CCe;var P6=jL;var iro=T(S(),1);function v6(e){}v6.prototype.isReady=function(){return!0};v6.prototype.shouldDiscardImage=function(e){return!1};var w6=v6;var mro=T(S(),1);var QCt=new Rt("MapQuest, Open Street Map and contributors, CC-BY-SA");function RB(e){e=y(e,y.EMPTY_OBJECT);let t=Re.createIfNeeded(y(e.url,"https://tile.openstreetmap.org/"));t.appendForwardSlash(),t.url+=`{z}/{x}/{y}${e.retinaTiles?"@2x":""}.${y(e.fileExtension,"png")}`;let n=new as({ellipsoid:e.ellipsoid}),i=256,o=256,r=y(e.minimumLevel,0),s=e.maximumLevel,a=y(e.rectangle,n.rectangle),c=n.positionToTileXY(le.southwest(a),r),d=n.positionToTileXY(le.northeast(a),r),u=(Math.abs(d.x-c.x)+1)*(Math.abs(d.y-c.y)+1),h=y(e.credit,QCt);typeof h=="string"&&(h=new Rt(h)),Ka.call(this,{url:t,credit:h,tilingScheme:n,tileWidth:i,tileHeight:o,minimumLevel:r,maximumLevel:s,rectangle:a})}l(Object.create)&&(RB.prototype=Object.create(Ka.prototype),RB.prototype.constructor=RB);var A0=RB;var xro=T(S(),1);var jCt=new D(1,1);function F6(e){e=y(e,y.EMPTY_OBJECT),this.mass=y(e.mass,1),this.position=m.clone(y(e.position,m.ZERO)),this.velocity=m.clone(y(e.velocity,m.ZERO)),this.life=y(e.life,Number.MAX_VALUE),this.image=e.image,this.startColor=B.clone(y(e.startColor,B.WHITE)),this.endColor=B.clone(y(e.endColor,B.WHITE)),this.startScale=y(e.startScale,1),this.endScale=y(e.endScale,1),this.imageSize=D.clone(y(e.imageSize,jCt)),this._age=0,this._normalizedAge=0,this._billboard=void 0}Object.defineProperties(F6.prototype,{age:{get:function(){return this._age}},normalizedAge:{get:function(){return this._normalizedAge}}});var VCe=new m;F6.prototype.update=function(e,t){return m.multiplyByScalar(this.velocity,e,VCe),m.add(this.position,VCe,this.position),l(t)&&t(this,e),this._age+=e,this.life===Number.MAX_VALUE?this._normalizedAge=0:this._normalizedAge=this._age/this.life,this._age<=this.life};var qL=F6;var Sro=T(S(),1);function LCe(e){e=y(e,y.EMPTY_OBJECT),this.time=y(e.time,0),this.minimum=y(e.minimum,0),this.maximum=y(e.maximum,50),this._complete=!1}Object.defineProperties(LCe.prototype,{complete:{get:function(){return this._complete}}});var A6=LCe;var Lro=T(S(),1);function RCe(e){}RCe.prototype.emit=function(e){fe.throwInstantiationError()};var M6=RCe;var kro=T(S(),1);var ZCe=new D(1,1);function d9(e){e=y(e,y.EMPTY_OBJECT),this.show=y(e.show,!0),this.updateCallback=e.updateCallback,this.loop=y(e.loop,!0),this.image=y(e.image,void 0);let t=e.emitter;l(t)||(t=new KM(.5)),this._emitter=t,this._bursts=e.bursts,this._modelMatrix=M.clone(y(e.modelMatrix,M.IDENTITY)),this._emitterModelMatrix=M.clone(y(e.emitterModelMatrix,M.IDENTITY)),this._matrixDirty=!0,this._combinedMatrix=new M,this._startColor=B.clone(y(e.color,y(e.startColor,B.WHITE))),this._endColor=B.clone(y(e.color,y(e.endColor,B.WHITE))),this._startScale=y(e.scale,y(e.startScale,1)),this._endScale=y(e.scale,y(e.endScale,1)),this._emissionRate=y(e.emissionRate,5),this._minimumSpeed=y(e.speed,y(e.minimumSpeed,1)),this._maximumSpeed=y(e.speed,y(e.maximumSpeed,1)),this._minimumParticleLife=y(e.particleLife,y(e.minimumParticleLife,5)),this._maximumParticleLife=y(e.particleLife,y(e.maximumParticleLife,5)),this._minimumMass=y(e.mass,y(e.minimumMass,1)),this._maximumMass=y(e.mass,y(e.maximumMass,1)),this._minimumImageSize=D.clone(y(e.imageSize,y(e.minimumImageSize,ZCe))),this._maximumImageSize=D.clone(y(e.imageSize,y(e.maximumImageSize,ZCe))),this._sizeInMeters=y(e.sizeInMeters,!1),this._lifetime=y(e.lifetime,Number.MAX_VALUE),this._billboardCollection=void 0,this._particles=[],this._particlePool=[],this._previousTime=void 0,this._currentTime=0,this._carryOver=0,this._complete=new be,this._isComplete=!1,this._updateParticlePool=!0,this._particleEstimate=0}Object.defineProperties(d9.prototype,{emitter:{get:function(){return this._emitter},set:function(e){this._emitter=e}},bursts:{get:function(){return this._bursts},set:function(e){this._bursts=e,this._updateParticlePool=!0}},modelMatrix:{get:function(){return this._modelMatrix},set:function(e){this._matrixDirty=this._matrixDirty||!M.equals(this._modelMatrix,e),M.clone(e,this._modelMatrix)}},emitterModelMatrix:{get:function(){return this._emitterModelMatrix},set:function(e){this._matrixDirty=this._matrixDirty||!M.equals(this._emitterModelMatrix,e),M.clone(e,this._emitterModelMatrix)}},startColor:{get:function(){return this._startColor},set:function(e){B.clone(e,this._startColor)}},endColor:{get:function(){return this._endColor},set:function(e){B.clone(e,this._endColor)}},startScale:{get:function(){return this._startScale},set:function(e){this._startScale=e}},endScale:{get:function(){return this._endScale},set:function(e){this._endScale=e}},emissionRate:{get:function(){return this._emissionRate},set:function(e){this._emissionRate=e,this._updateParticlePool=!0}},minimumSpeed:{get:function(){return this._minimumSpeed},set:function(e){this._minimumSpeed=e}},maximumSpeed:{get:function(){return this._maximumSpeed},set:function(e){this._maximumSpeed=e}},minimumParticleLife:{get:function(){return this._minimumParticleLife},set:function(e){this._minimumParticleLife=e}},maximumParticleLife:{get:function(){return this._maximumParticleLife},set:function(e){this._maximumParticleLife=e,this._updateParticlePool=!0}},minimumMass:{get:function(){return this._minimumMass},set:function(e){this._minimumMass=e}},maximumMass:{get:function(){return this._maximumMass},set:function(e){this._maximumMass=e}},minimumImageSize:{get:function(){return this._minimumImageSize},set:function(e){this._minimumImageSize=e}},maximumImageSize:{get:function(){return this._maximumImageSize},set:function(e){this._maximumImageSize=e}},sizeInMeters:{get:function(){return this._sizeInMeters},set:function(e){this._sizeInMeters=e}},lifetime:{get:function(){return this._lifetime},set:function(e){this._lifetime=e}},complete:{get:function(){return this._complete}},isComplete:{get:function(){return this._isComplete}}});function qCt(e){let t=e._emissionRate,n=e._maximumParticleLife,i=0,o=e._bursts;if(l(o)){let h=o.length;for(let p=0;p<h;++p)i+=o[p].maximum}let r=e._billboardCollection,s=e.image,a=Math.ceil(t*n+i),c=e._particles,d=e._particlePool,u=Math.max(a-c.length-d.length,0);for(let h=0;h<u;++h){let p=new qL;p._billboard=r.add({image:s,show:!1}),d.push(p)}e._particleEstimate=a}function $Ct(e){let t=e._particlePool.pop();return l(t)||(t=new qL),t}function e1t(e,t){e._particlePool.push(t)}function t1t(e){let t=e._particles,n=e._particlePool,i=e._billboardCollection,o=t.length,r=n.length,s=e._particleEstimate,a=r-Math.max(s-o-r,0);for(let c=a;c<r;++c){let d=n[c];i.remove(d._billboard)}n.length=a}function n1t(e){l(e._billboard)&&(e._billboard.show=!1)}function GCe(e,t){let n=t._billboard;l(n)||(n=t._billboard=e._billboardCollection.add({image:t.image})),n.width=t.imageSize.x,n.height=t.imageSize.y,n.position=t.position,n.sizeInMeters=e.sizeInMeters,n.show=!0;let i=W.lerp(t.startColor.red,t.endColor.red,t.normalizedAge),o=W.lerp(t.startColor.green,t.endColor.green,t.normalizedAge),r=W.lerp(t.startColor.blue,t.endColor.blue,t.normalizedAge),s=W.lerp(t.startColor.alpha,t.endColor.alpha,t.normalizedAge);n.color=new B(i,o,r,s),n.scale=W.lerp(t.startScale,t.endScale,t.normalizedAge)}function i1t(e,t){t.startColor=B.clone(e._startColor,t.startColor),t.endColor=B.clone(e._endColor,t.endColor),t.startScale=e._startScale,t.endScale=e._endScale,t.image=e.image,t.life=W.randomBetween(e._minimumParticleLife,e._maximumParticleLife),t.mass=W.randomBetween(e._minimumMass,e._maximumMass),t.imageSize.x=W.randomBetween(e._minimumImageSize.x,e._maximumImageSize.x),t.imageSize.y=W.randomBetween(e._minimumImageSize.y,e._maximumImageSize.y),t._normalizedAge=0,t._age=0;let n=W.randomBetween(e._minimumSpeed,e._maximumSpeed);m.multiplyByScalar(t.velocity,n,t.velocity),e._particles.push(t)}function o1t(e,t){if(e._isComplete)return 0;t=W.mod(t,e._lifetime);let n=t*e._emissionRate,i=Math.floor(n);if(e._carryOver+=n-i,e._carryOver>1&&(i++,e._carryOver-=1),l(e.bursts)){let o=e.bursts.length;for(let r=0;r<o;r++){let s=e.bursts[r],a=e._currentTime;l(s)&&!s._complete&&a>s.time&&(i+=W.randomBetween(s.minimum,s.maximum),s._complete=!0)}}return i}var ZB=new m;d9.prototype.update=function(e){if(!this.show)return;l(this._billboardCollection)||(this._billboardCollection=new Ed),this._updateParticlePool&&(qCt(this),this._updateParticlePool=!1);let t=0;this._previousTime&&(t=q.secondsDifference(e.time,this._previousTime)),t<0&&(t=0);let n=this._particles,i=this._emitter,o=this.updateCallback,r,s,a=n.length;for(r=0;r<a;++r)s=n[r],s.update(t,o)?GCe(this,s):(n1t(s),e1t(this,s),n[r]=n[a-1],--r,--a);n.length=a;let c=o1t(this,t);if(c>0&&l(i)){this._matrixDirty&&(this._combinedMatrix=M.multiply(this.modelMatrix,this.emitterModelMatrix,this._combinedMatrix),this._matrixDirty=!1);let d=this._combinedMatrix;for(r=0;r<c;r++)s=$Ct(this),this._emitter.emit(s),m.add(s.position,s.velocity,ZB),M.multiplyByPoint(d,ZB,ZB),s.position=M.multiplyByPoint(d,s.position,s.position),m.subtract(ZB,s.position,s.velocity),m.normalize(s.velocity,s.velocity),i1t(this,s),GCe(this,s)}if(this._billboardCollection.update(e),this._previousTime=q.clone(e.time,this._previousTime),this._currentTime+=t,this._lifetime!==Number.MAX_VALUE&&this._currentTime>this._lifetime)if(this.loop){if(this._currentTime=W.mod(this._currentTime,this._lifetime),this.bursts){let d=this.bursts.length;for(r=0;r<d;r++)this.bursts[r]._complete=!1}}else this._isComplete=!0,this._complete.raiseEvent(this);e.frameNumber%120===0&&t1t(this)};d9.prototype.isDestroyed=function(){return!1};d9.prototype.destroy=function(){return this._billboardCollection=this._billboardCollection&&this._billboardCollection.destroy(),me(this)};var N6=d9;var Bro=T(S(),1);function mu(){fe.throwInstantiationError()}mu.computeDefaultLevelZeroMaximumGeometricError=function(e){return e.ellipsoid.maximumRadius*2*Math.PI*.25/(65*e.getNumberOfXTilesAtLevel(0))};Object.defineProperties(mu.prototype,{quadtree:{get:fe.throwInstantiationError,set:fe.throwInstantiationError},tilingScheme:{get:fe.throwInstantiationError},errorEvent:{get:fe.throwInstantiationError}});mu.prototype.update=fe.throwInstantiationError;mu.prototype.beginUpdate=fe.throwInstantiationError;mu.prototype.endUpdate=fe.throwInstantiationError;mu.prototype.getLevelMaximumGeometricError=fe.throwInstantiationError;mu.prototype.loadTile=fe.throwInstantiationError;mu.prototype.computeTileVisibility=fe.throwInstantiationError;mu.prototype.showTileThisFrame=fe.throwInstantiationError;mu.prototype.computeDistanceToTile=fe.throwInstantiationError;mu.prototype.isDestroyed=fe.throwInstantiationError;mu.prototype.destroy=fe.throwInstantiationError;var k6=mu;var Kro=T(S(),1);function U6(e){e=y(e,1),this._radius=y(e,1)}Object.defineProperties(U6.prototype,{radius:{get:function(){return this._radius},set:function(e){this._radius=e}}});U6.prototype.emit=function(e){let t=W.randomBetween(0,W.TWO_PI),n=W.randomBetween(0,W.PI),i=W.randomBetween(0,this._radius),o=i*Math.cos(t)*Math.sin(n),r=i*Math.sin(t)*Math.sin(n),s=i*Math.cos(n);e.position=m.fromElements(o,r,s,e.position),e.velocity=m.normalize(e.position,e.velocity)};var D6=U6;var jro=T(S(),1);function u9(){}u9.prototype.evaluate=function(e,t){fe.throwInstantiationError()};u9.prototype.evaluateColor=function(e,t){fe.throwInstantiationError()};u9.prototype.getShaderFunction=function(e,t,n,i){fe.throwInstantiationError()};u9.prototype.getVariables=function(){fe.throwInstantiationError()};var B6=u9;var nso=T(S(),1);function $L(e){this._ready=!1,this._provider=void 0,this._errorEvent=new be,this._readyEvent=new be,s1t(this,e)}Object.defineProperties($L.prototype,{errorEvent:{get:function(){return this._errorEvent}},readyEvent:{get:function(){return this._readyEvent}},ready:{get:function(){return this._ready}},provider:{get:function(){return this._provider}}});$L.fromWorldTerrain=function(e){return new $L(IS(e))};$L.fromWorldBathymetry=function(e){return new $L(AM(e))};function r1t(e,t){e.numberOfListeners>0?e.raiseEvent(t):console.error(t)}async function s1t(e,t){let n;try{n=await Promise.resolve(t),e._provider=n,e._ready=!0,e._readyEvent.raiseEvent(n)}catch(i){r1t(e._errorEvent,i)}}var m9=$L;var rso=T(S(),1);function eR(){}eR.prototype.boundingVolume=void 0;eR.prototype.boundingSphere=void 0;eR.prototype.distanceToCamera=function(e){fe.throwInstantiationError()};eR.prototype.intersectPlane=function(e){fe.throwInstantiationError()};eR.prototype.createDebugVolume=function(e){fe.throwInstantiationError()};var O6=eR;var mso=T(S(),1);function h9(e){e=y(e,y.EMPTY_OBJECT),this._tilingScheme=l(e.tilingScheme)?e.tilingScheme:new Qi({ellipsoid:e.ellipsoid}),this._color=y(e.color,B.YELLOW),this._errorEvent=new be,this._tileWidth=y(e.tileWidth,256),this._tileHeight=y(e.tileHeight,256),this._defaultAlpha=void 0,this._defaultNightAlpha=void 0,this._defaultDayAlpha=void 0,this._defaultBrightness=void 0,this._defaultContrast=void 0,this._defaultHue=void 0,this._defaultSaturation=void 0,this._defaultGamma=void 0,this._defaultMinificationFilter=void 0,this._defaultMagnificationFilter=void 0}Object.defineProperties(h9.prototype,{proxy:{get:function(){}},tileWidth:{get:function(){return this._tileWidth}},tileHeight:{get:function(){return this._tileHeight}},maximumLevel:{get:function(){}},minimumLevel:{get:function(){}},tilingScheme:{get:function(){return this._tilingScheme}},rectangle:{get:function(){return this._tilingScheme.rectangle}},tileDiscardPolicy:{get:function(){}},errorEvent:{get:function(){return this._errorEvent}},credit:{get:function(){}},hasAlphaChannel:{get:function(){return!0}}});h9.prototype.getTileCredits=function(e,t,n){};h9.prototype.requestImage=function(e,t,n,i){let o=document.createElement("canvas");o.width=256,o.height=256;let r=o.getContext("2d"),s=this._color.toCssColorString();return r.strokeStyle=s,r.lineWidth=2,r.strokeRect(1,1,255,255),r.font="bold 25px Arial",r.textAlign="center",r.fillStyle=s,r.fillText(`L: ${n}`,124,86),r.fillText(`X: ${e}`,124,136),r.fillText(`Y: ${t}`,124,186),Promise.resolve(o)};h9.prototype.pickFeatures=function(e,t,n,i,o){};var f9=h9;var pso=T(S(),1);function Y6(e){fe.throwInstantiationError()}Y6.prototype.isReady=fe.throwInstantiationError;Y6.prototype.shouldDiscardImage=fe.throwInstantiationError;var H6=Y6;var gso=T(S(),1),a1t={START:0,LOADING:1,READY:2,UPSAMPLED_ONLY:3},z6=Object.freeze(a1t);var Eso=T(S(),1);function GB(e,t){this.show=!0,l(e)||(e=new He),this.rectangle=He.clone(e),l(t)||(t=Ji.fromType(Ji.ColorType,{color:new B(1,1,1,1)})),this.material=t,this._material=void 0,this._overlayCommand=void 0,this._rs=void 0}GB.prototype.update=function(e){if(!this.show)return;let t=this._rs;if((!l(t)||!He.equals(t.viewport,this.rectangle))&&(this._rs=Ue.fromCache({blending:hn.ALPHA_BLEND,viewport:this.rectangle})),e.passes.render){let i=e.context;if(this._material!==this.material||!l(this._overlayCommand)){this._material=this.material,l(this._overlayCommand)&&this._overlayCommand.shaderProgram.destroy();let o=new De({sources:[this._material.shaderSource,vM]});this._overlayCommand=i.createViewportQuadCommand(o,{renderState:this._rs,uniformMap:this._material._uniforms,owner:this}),this._overlayCommand.pass=Ge.OVERLAY}this._material.update(i),this._overlayCommand.renderState=this._rs,this._overlayCommand.uniformMap=this._material._uniforms,e.commandList.push(this._overlayCommand)}};GB.prototype.isDestroyed=function(){return!1};GB.prototype.destroy=function(){return l(this._overlayCommand)&&(this._overlayCommand.shaderProgram=this._overlayCommand.shaderProgram&&this._overlayCommand.shaderProgram.destroy()),me(this)};var K6=GB;var Wso=T(S(),1);function J6(){fe.throwInstantiationError()}Object.defineProperties(J6.prototype,{globalTransform:{get:fe.throwInstantiationError},shapeTransform:{get:fe.throwInstantiationError},shape:{get:fe.throwInstantiationError},minBounds:{get:fe.throwInstantiationError},maxBounds:{get:fe.throwInstantiationError},dimensions:{get:fe.throwInstantiationError},paddingBefore:{get:fe.throwInstantiationError},paddingAfter:{get:fe.throwInstantiationError},names:{get:fe.throwInstantiationError},types:{get:fe.throwInstantiationError},componentTypes:{get:fe.throwInstantiationError},metadataOrder:{get:fe.throwInstantiationError},minimumValues:{get:fe.throwInstantiationError},maximumValues:{get:fe.throwInstantiationError},maximumTileCount:{get:fe.throwInstantiationError},availableLevels:{get:fe.throwInstantiationError},keyframeCount:{get:fe.throwInstantiationError},timeIntervalCollection:{get:fe.throwInstantiationError}});J6.prototype.requestData=function(e){fe.throwInstantiationError()};var Q6=J6;var wso=T(S(),1);function DS(){fe.throwInstantiationError()}Object.defineProperties(DS.prototype,{orientedBoundingBox:{get:fe.throwInstantiationError},boundingSphere:{get:fe.throwInstantiationError},boundTransform:{get:fe.throwInstantiationError},shapeTransform:{get:fe.throwInstantiationError},shaderUniforms:{get:fe.throwInstantiationError},shaderDefines:{get:fe.throwInstantiationError},shaderMaximumIntersectionsLength:{get:fe.throwInstantiationError}});DS.prototype.update=fe.throwInstantiationError;DS.prototype.computeOrientedBoundingBoxForTile=fe.throwInstantiationError;DS.prototype.computeOrientedBoundingBoxForSample=fe.throwInstantiationError;DS.DefaultMinBounds=fe.throwInstantiationError;DS.DefaultMaxBounds=fe.throwInstantiationError;var j6=DS;var Aso=T(S(),1),q6=`uniform sampler2D u_depthTexture; in vec2 v_textureCoordinates; void main() { float z_window = czm_unpackDepth(texture(u_depthTexture, v_textureCoordinates)); z_window = czm_reverseLogDepth(z_window); float n_range = czm_depthRange.near; float f_range = czm_depthRange.far; float z_ndc = (2.0 * z_window - n_range - f_range) / (f_range - n_range); float scale = pow(z_ndc * 0.5 + 0.5, 8.0); out_FragColor = vec4(mix(vec3(0.0), vec3(1.0), scale), 1.0); } `;var Yso=T(S(),1);function c1t(e){e=y(e,y.EMPTY_OBJECT),this.typedArray=e.typedArray,this.width=e.width,this.height=e.height,this.pixelFormat=y(e.pixelFormat,ot.RGBA),this.pixelDatatype=y(e.pixelDatatype,je.UNSIGNED_BYTE);let t=e.url;typeof t=="string"&&(t=Re.createIfNeeded(t)),this.resource=t;let i=y(e.repeat,!0)?Vn.REPEAT:Vn.CLAMP_TO_EDGE;this.sampler=new $t({wrapS:i,wrapT:i,minificationFilter:e.minificationFilter,magnificationFilter:e.magnificationFilter,maximumAnisotropy:e.maximumAnisotropy})}var $6=c1t;var zso=T(S(),1),l1t={FLOAT:"float",VEC2:"vec2",VEC3:"vec3",VEC4:"vec4",MAT2:"mat2",MAT3:"mat2",MAT4:"mat4"},eq=Object.freeze(l1t);var Jso=T(S(),1),d1t={SIGX:"SIGX",SIGY:"SIGY",SIGZ:"SIGZ",VARX:"VARX",VARY:"VARY",VARZ:"VARZ",SIGR:"VARZ"},tq=Object.freeze(d1t);var qso=T(S(),1);function u1t(e){async function t({data:i}){let o=[],r={id:i.id,result:void 0,error:void 0};self.CESIUM_BASE_URL=i.baseUrl;try{let s=await e(i.parameters,o);r.result=s}catch(s){s instanceof Error?r.error={name:s.name,message:s.message,stack:s.stack}:r.error=s}i.canTransferArrayBuffer||(o.length=0);try{postMessage(r,o)}catch(s){r.result=void 0,r.error=`postMessage failed with error: ${np(s)} with responseMessage: ${JSON.stringify(r)}`,postMessage(r)}}function n(i){var o;postMessage({id:(o=i.data)==null?void 0:o.id,error:`postMessage failed with error: ${JSON.stringify(i)}`})}return self.onmessage=t,self.onmessageerror=n,self}var nq=u1t;globalThis.CESIUM_VERSION="1.127";var FWo=T(S(),1);var hZo=T(S(),1);var lZo=T(S(),1);var eZo=T(S(),1),p9;typeof ko<"u"&&(p9=ko);(function(){/*! * Knockout JavaScript library v3.5.1 * (c) The Knockout.js team - http://knockoutjs.com/ * License: MIT (http://www.opensource.org/licenses/mit-license.php) */(function(){(function(e){var t=this||(0,eval)("this"),n=t.document,i=t.navigator,o=t.jQuery,r=t.JSON;o||typeof jQuery>"u"||(o=jQuery),function(s){s(t.ko={})}(function(s,a){function c(b,Z){return b===null||typeof b in x?b===Z:!1}function d(b,Z){var E;return function(){E||(E=f.a.setTimeout(function(){E=e,b()},Z))}}function u(b,Z){var E;return function(){clearTimeout(E),E=f.a.setTimeout(b,Z)}}function h(b,Z){Z&&Z!=="change"?Z==="beforeChange"?this.pc(b):this.gb(b,Z):this.qc(b)}function p(b,Z){Z!==null&&Z.s&&Z.s()}function g(b,Z){var E=this.qd,X=E[R];X.ra||(this.Qb&&this.mb[Z]?(E.uc(Z,b,this.mb[Z]),this.mb[Z]=null,--this.Qb):X.I[Z]||E.uc(Z,b,X.J?{da:b}:E.$c(b)),b.Ja&&b.gd())}var f=typeof s<"u"?s:{};f.b=function(b,Z){for(var E=b.split("."),X=f,F=0;F<E.length-1;F++)X=X[E[F]];X[E[E.length-1]]=Z},f.L=function(b,Z,E){b[Z]=E},f.version="3.5.1",f.b("version",f.version),f.options={deferUpdates:!1,useOnlyNativeEvents:!1,foreachHidesDestroyed:!1},f.a=function(){function b(z,j){for(var ee in z)F.call(z,ee)&&j(ee,z[ee])}function Z(z,j){if(j)for(var ee in j)F.call(j,ee)&&(z[ee]=j[ee]);return z}function E(z,j){return z.__proto__=j,z}function X(z,j,ee,pe){var _e=z[j].match(K)||[];f.a.D(ee.match(K),function(ae){f.a.Na(_e,ae,pe)}),z[j]=_e.join(" ")}var F=Object.prototype.hasOwnProperty,N={__proto__:[]}instanceof Array,O=typeof Symbol=="function",U={},Y={};U[i&&/Firefox\/2/i.test(i.userAgent)?"KeyboardEvent":"UIEvents"]=["keyup","keydown","keypress"],U.MouseEvents="click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave".split(" "),b(U,function(z,j){if(j.length)for(var ee=0,pe=j.length;ee<pe;ee++)Y[j[ee]]=z});var k={propertychange:!0},H=n&&function(){for(var z=3,j=n.createElement("div"),ee=j.getElementsByTagName("i");j.innerHTML="<!--[if gt IE "+ ++z+"]><i></i><![endif]-->",ee[0];);return 4<z?z:e}(),K=/\S+/g,te;return{Jc:["authenticity_token",/^__RequestVerificationToken(_.*)?$/],D:function(z,j,ee){for(var pe=0,_e=z.length;pe<_e;pe++)j.call(ee,z[pe],pe,z)},A:typeof Array.prototype.indexOf=="function"?function(z,j){return Array.prototype.indexOf.call(z,j)}:function(z,j){for(var ee=0,pe=z.length;ee<pe;ee++)if(z[ee]===j)return ee;return-1},Lb:function(z,j,ee){for(var pe=0,_e=z.length;pe<_e;pe++)if(j.call(ee,z[pe],pe,z))return z[pe];return e},Pa:function(z,j){var ee=f.a.A(z,j);0<ee?z.splice(ee,1):ee===0&&z.shift()},wc:function(z){var j=[];return z&&f.a.D(z,function(ee){0>f.a.A(j,ee)&&j.push(ee)}),j},Mb:function(z,j,ee){var pe=[];if(z)for(var _e=0,ae=z.length;_e<ae;_e++)pe.push(j.call(ee,z[_e],_e));return pe},jb:function(z,j,ee){var pe=[];if(z)for(var _e=0,ae=z.length;_e<ae;_e++)j.call(ee,z[_e],_e)&&pe.push(z[_e]);return pe},Nb:function(z,j){if(j instanceof Array)z.push.apply(z,j);else for(var ee=0,pe=j.length;ee<pe;ee++)z.push(j[ee]);return z},Na:function(z,j,ee){var pe=f.a.A(f.a.bc(z),j);0>pe?ee&&z.push(j):ee||z.splice(pe,1)},Ba:N,extend:Z,setPrototypeOf:E,Ab:N?E:Z,P:b,Ga:function(z,j,ee){if(!z)return z;var pe={},_e;for(_e in z)F.call(z,_e)&&(pe[_e]=j.call(ee,z[_e],_e,z));return pe},Tb:function(z){for(;z.firstChild;)f.removeNode(z.firstChild)},Yb:function(z){z=f.a.la(z);for(var j=(z[0]&&z[0].ownerDocument||n).createElement("div"),ee=0,pe=z.length;ee<pe;ee++)j.appendChild(f.oa(z[ee]));return j},Ca:function(z,j){for(var ee=0,pe=z.length,_e=[];ee<pe;ee++){var ae=z[ee].cloneNode(!0);_e.push(j?f.oa(ae):ae)}return _e},va:function(z,j){if(f.a.Tb(z),j)for(var ee=0,pe=j.length;ee<pe;ee++)z.appendChild(j[ee])},Xc:function(z,j){var ee=z.nodeType?[z]:z;if(0<ee.length){for(var pe=ee[0],_e=pe.parentNode,ae=0,ye=j.length;ae<ye;ae++)_e.insertBefore(j[ae],pe);for(ae=0,ye=ee.length;ae<ye;ae++)f.removeNode(ee[ae])}},Ua:function(z,j){if(z.length){for(j=j.nodeType===8&&j.parentNode||j;z.length&&z[0].parentNode!==j;)z.splice(0,1);for(;1<z.length&&z[z.length-1].parentNode!==j;)z.length--;if(1<z.length){var ee=z[0],pe=z[z.length-1];for(z.length=0;ee!==pe;)z.push(ee),ee=ee.nextSibling;z.push(pe)}}return z},Zc:function(z,j){7>H?z.setAttribute("selected",j):z.selected=j},Db:function(z){return z===null||z===e?"":z.trim?z.trim():z.toString().replace(/^[\s\xa0]+|[\s\xa0]+$/g,"")},Ud:function(z,j){return z=z||"",j.length>z.length?!1:z.substring(0,j.length)===j},vd:function(z,j){if(z===j)return!0;if(z.nodeType===11)return!1;if(j.contains)return j.contains(z.nodeType!==1?z.parentNode:z);if(j.compareDocumentPosition)return(j.compareDocumentPosition(z)&16)==16;for(;z&&z!=j;)z=z.parentNode;return!!z},Sb:function(z){return f.a.vd(z,z.ownerDocument.documentElement)},kd:function(z){return!!f.a.Lb(z,f.a.Sb)},R:function(z){return z&&z.tagName&&z.tagName.toLowerCase()},Ac:function(z){return f.onError?function(){try{return z.apply(this,arguments)}catch(j){throw f.onError&&f.onError(j),j}}:z},setTimeout:function(z,j){return setTimeout(f.a.Ac(z),j)},Gc:function(z){setTimeout(function(){throw f.onError&&f.onError(z),z},0)},B:function(z,j,ee){var pe=f.a.Ac(ee);if(ee=k[j],f.options.useOnlyNativeEvents||ee||!o)if(ee||typeof z.addEventListener!="function")if(typeof z.attachEvent<"u"){var _e=function(ye){pe.call(z,ye)},ae="on"+j;z.attachEvent(ae,_e),f.a.K.za(z,function(){z.detachEvent(ae,_e)})}else throw Error("Browser doesn't support addEventListener or attachEvent");else z.addEventListener(j,pe,!1);else te||(te=typeof o(z).on=="function"?"on":"bind"),o(z)[te](j,pe)},Fb:function(z,j){if(!z||!z.nodeType)throw Error("element must be a DOM node when calling triggerEvent");var ee;if(f.a.R(z)==="input"&&z.type&&j.toLowerCase()=="click"?(ee=z.type,ee=ee=="checkbox"||ee=="radio"):ee=!1,f.options.useOnlyNativeEvents||!o||ee)if(typeof n.createEvent=="function")if(typeof z.dispatchEvent=="function")ee=n.createEvent(Y[j]||"HTMLEvents"),ee.initEvent(j,!0,!0,t,0,0,0,0,0,!1,!1,!1,!1,0,z),z.dispatchEvent(ee);else throw Error("The supplied element doesn't support dispatchEvent");else if(ee&&z.click)z.click();else if(typeof z.fireEvent<"u")z.fireEvent("on"+j);else throw Error("Browser doesn't support triggering events");else o(z).trigger(j)},f:function(z){return f.O(z)?z():z},bc:function(z){return f.O(z)?z.v():z},Eb:function(z,j,ee){var pe;j&&(typeof z.classList=="object"?(pe=z.classList[ee?"add":"remove"],f.a.D(j.match(K),function(_e){pe.call(z.classList,_e)})):typeof z.className.baseVal=="string"?X(z.className,"baseVal",j,ee):X(z,"className",j,ee))},Bb:function(z,j){var ee=f.a.f(j);(ee===null||ee===e)&&(ee="");var pe=f.h.firstChild(z);!pe||pe.nodeType!=3||f.h.nextSibling(pe)?f.h.va(z,[z.ownerDocument.createTextNode(ee)]):pe.data=ee,f.a.Ad(z)},Yc:function(z,j){if(z.name=j,7>=H)try{var ee=z.name.replace(/[&<>'"]/g,function(pe){return"&#"+pe.charCodeAt(0)+";"});z.mergeAttributes(n.createElement("<input name='"+ee+"'/>"),!1)}catch{}},Ad:function(z){9<=H&&(z=z.nodeType==1?z:z.parentNode,z.style&&(z.style.zoom=z.style.zoom))},wd:function(z){if(H){var j=z.style.width;z.style.width=0,z.style.width=j}},Pd:function(z,j){z=f.a.f(z),j=f.a.f(j);for(var ee=[],pe=z;pe<=j;pe++)ee.push(pe);return ee},la:function(z){for(var j=[],ee=0,pe=z.length;ee<pe;ee++)j.push(z[ee]);return j},Da:function(z){return O?Symbol(z):z},Zd:H===6,$d:H===7,W:H,Lc:function(z,j){for(var ee=f.a.la(z.getElementsByTagName("input")).concat(f.a.la(z.getElementsByTagName("textarea"))),pe=typeof j=="string"?function(ye){return ye.name===j}:function(ye){return j.test(ye.name)},_e=[],ae=ee.length-1;0<=ae;ae--)pe(ee[ae])&&_e.push(ee[ae]);return _e},Nd:function(z){return typeof z=="string"&&(z=f.a.Db(z))?r&&r.parse?r.parse(z):new Function("return "+z)():null},hc:function(z,j,ee){if(!r||!r.stringify)throw Error("Cannot find JSON.stringify(). Some browsers (e.g., IE < 8) don't support it natively, but you can overcome this by adding a script reference to json2.js, downloadable from http://www.json.org/json2.js");return r.stringify(f.a.f(z),j,ee)},Od:function(z,j,ee){ee=ee||{};var pe=ee.params||{},_e=ee.includeFields||this.Jc,ae=z;if(typeof z=="object"&&f.a.R(z)==="form")for(var ae=z.action,ye=_e.length-1;0<=ye;ye--)for(var Se=f.a.Lc(z,_e[ye]),Ee=Se.length-1;0<=Ee;Ee--)pe[Se[Ee].name]=Se[Ee].value;j=f.a.f(j);var Ie=n.createElement("form");Ie.style.display="none",Ie.action=ae,Ie.method="post";for(var we in j)z=n.createElement("input"),z.type="hidden",z.name=we,z.value=f.a.hc(f.a.f(j[we])),Ie.appendChild(z);b(pe,function(ve,at){var Je=n.createElement("input");Je.type="hidden",Je.name=ve,Je.value=at,Ie.appendChild(Je)}),n.body.appendChild(Ie),ee.submitter?ee.submitter(Ie):Ie.submit(),setTimeout(function(){Ie.parentNode.removeChild(Ie)},0)}}}(),f.b("utils",f.a),f.b("utils.arrayForEach",f.a.D),f.b("utils.arrayFirst",f.a.Lb),f.b("utils.arrayFilter",f.a.jb),f.b("utils.arrayGetDistinctValues",f.a.wc),f.b("utils.arrayIndexOf",f.a.A),f.b("utils.arrayMap",f.a.Mb),f.b("utils.arrayPushAll",f.a.Nb),f.b("utils.arrayRemoveItem",f.a.Pa),f.b("utils.cloneNodes",f.a.Ca),f.b("utils.createSymbolOrString",f.a.Da),f.b("utils.extend",f.a.extend),f.b("utils.fieldsIncludedWithJsonPost",f.a.Jc),f.b("utils.getFormFields",f.a.Lc),f.b("utils.objectMap",f.a.Ga),f.b("utils.peekObservable",f.a.bc),f.b("utils.postJson",f.a.Od),f.b("utils.parseJson",f.a.Nd),f.b("utils.registerEventHandler",f.a.B),f.b("utils.stringifyJson",f.a.hc),f.b("utils.range",f.a.Pd),f.b("utils.toggleDomNodeCssClass",f.a.Eb),f.b("utils.triggerEvent",f.a.Fb),f.b("utils.unwrapObservable",f.a.f),f.b("utils.objectForEach",f.a.P),f.b("utils.addOrRemoveItem",f.a.Na),f.b("utils.setTextContent",f.a.Bb),f.b("unwrap",f.a.f),Function.prototype.bind||(Function.prototype.bind=function(b){var Z=this;if(arguments.length===1)return function(){return Z.apply(b,arguments)};var E=Array.prototype.slice.call(arguments,1);return function(){var X=E.slice(0);return X.push.apply(X,arguments),Z.apply(b,X)}}),f.a.g=new function(){var b=0,Z="__ko__"+new Date().getTime(),E={},X,F;return f.a.W?(X=function(N,O){var U=N[Z];if(!U||U==="null"||!E[U]){if(!O)return e;U=N[Z]="ko"+b++,E[U]={}}return E[U]},F=function(N){var O=N[Z];return O?(delete E[O],N[Z]=null,!0):!1}):(X=function(N,O){var U=N[Z];return!U&&O&&(U=N[Z]={}),U},F=function(N){return N[Z]?(delete N[Z],!0):!1}),{get:function(N,O){var U=X(N,!1);return U&&U[O]},set:function(N,O,U){(N=X(N,U!==e))&&(N[O]=U)},Ub:function(N,O,U){return N=X(N,!0),N[O]||(N[O]=U)},clear:F,Z:function(){return b+++Z}}},f.b("utils.domData",f.a.g),f.b("utils.domData.clear",f.a.g.clear),f.a.K=new function(){function b(O,U){var Y=f.a.g.get(O,X);return Y===e&&U&&(Y=[],f.a.g.set(O,X,Y)),Y}function Z(O){var U=b(O,!1);if(U)for(var U=U.slice(0),Y=0;Y<U.length;Y++)U[Y](O);f.a.g.clear(O),f.a.K.cleanExternalData(O),N[O.nodeType]&&E(O.childNodes,!0)}function E(O,U){for(var Y=[],k,H=0;H<O.length;H++)if((!U||O[H].nodeType===8)&&(Z(Y[Y.length]=k=O[H]),O[H]!==k))for(;H--&&f.a.A(Y,O[H])==-1;);}var X=f.a.g.Z(),F={1:!0,8:!0,9:!0},N={1:!0,9:!0};return{za:function(O,U){if(typeof U!="function")throw Error("Callback must be a function");b(O,!0).push(U)},yb:function(O,U){var Y=b(O,!1);Y&&(f.a.Pa(Y,U),Y.length==0&&f.a.g.set(O,X,e))},oa:function(O){return f.u.G(function(){F[O.nodeType]&&(Z(O),N[O.nodeType]&&E(O.getElementsByTagName("*")))}),O},removeNode:function(O){f.oa(O),O.parentNode&&O.parentNode.removeChild(O)},cleanExternalData:function(O){o&&typeof o.cleanData=="function"&&o.cleanData([O])}}},f.oa=f.a.K.oa,f.removeNode=f.a.K.removeNode,f.b("cleanNode",f.oa),f.b("removeNode",f.removeNode),f.b("utils.domNodeDisposal",f.a.K),f.b("utils.domNodeDisposal.addDisposeCallback",f.a.K.za),f.b("utils.domNodeDisposal.removeDisposeCallback",f.a.K.yb),function(){var b=[0,"",""],Z=[1,"<table>","</table>"],E=[3,"<table><tbody><tr>","</tr></tbody></table>"],X=[1,"<select multiple='multiple'>","</select>"],F={thead:Z,tbody:Z,tfoot:Z,tr:[2,"<table><tbody>","</tbody></table>"],td:E,th:E,option:X,optgroup:X},N=8>=f.a.W;f.a.ua=function(O,U){var Y;if(o){if(o.parseHTML)Y=o.parseHTML(O,U)||[];else if((Y=o.clean([O],U))&&Y[0]){for(var k=Y[0];k.parentNode&&k.parentNode.nodeType!==11;)k=k.parentNode;k.parentNode&&k.parentNode.removeChild(k)}}else{(Y=U)||(Y=n);var k=Y.parentWindow||Y.defaultView||t,H=f.a.Db(O).toLowerCase(),K=Y.createElement("div"),te;for(te=(H=H.match(/^(?:\x3c!--.*?--\x3e\s*?)*?<([a-z]+)[\s>]/))&&F[H[1]]||b,H=te[0],te="ignored<div>"+te[1]+O+te[2]+"</div>",typeof k.innerShiv=="function"?K.appendChild(k.innerShiv(te)):(N&&Y.body.appendChild(K),K.innerHTML=te,N&&K.parentNode.removeChild(K));H--;)K=K.lastChild;Y=f.a.la(K.lastChild.childNodes)}return Y},f.a.Md=function(O,U){var Y=f.a.ua(O,U);return Y.length&&Y[0].parentElement||f.a.Yb(Y)},f.a.fc=function(O,U){if(f.a.Tb(O),U=f.a.f(U),U!==null&&U!==e)if(typeof U!="string"&&(U=U.toString()),o)o(O).html(U);else for(var Y=f.a.ua(U,O.ownerDocument),k=0;k<Y.length;k++)O.appendChild(Y[k])}}(),f.b("utils.parseHtmlFragment",f.a.ua),f.b("utils.setHtml",f.a.fc),f.aa=function(){function b(E,X){if(E){if(E.nodeType==8){var F=f.aa.Uc(E.nodeValue);F!=null&&X.push({ud:E,Kd:F})}else if(E.nodeType==1)for(var F=0,N=E.childNodes,O=N.length;F<O;F++)b(N[F],X)}}var Z={};return{Xb:function(E){if(typeof E!="function")throw Error("You can only pass a function to ko.memoization.memoize()");var X=(4294967296*(1+Math.random())|0).toString(16).substring(1)+(4294967296*(1+Math.random())|0).toString(16).substring(1);return Z[X]=E,"<!--[ko_memo:"+X+"]-->"},bd:function(E,X){var F=Z[E];if(F===e)throw Error("Couldn't find any memo with ID "+E+". Perhaps it's already been unmemoized.");try{return F.apply(null,X||[]),!0}finally{delete Z[E]}},cd:function(E,X){var F=[];b(E,F);for(var N=0,O=F.length;N<O;N++){var U=F[N].ud,Y=[U];X&&f.a.Nb(Y,X),f.aa.bd(F[N].Kd,Y),U.nodeValue="",U.parentNode&&U.parentNode.removeChild(U)}},Uc:function(E){return(E=E.match(/^\[ko_memo\:(.*?)\]$/))?E[1]:null}}}(),f.b("memoization",f.aa),f.b("memoization.memoize",f.aa.Xb),f.b("memoization.unmemoize",f.aa.bd),f.b("memoization.parseMemoText",f.aa.Uc),f.b("memoization.unmemoizeDomNodeAndDescendants",f.aa.cd),f.na=function(){function b(){if(F){for(var U=F,Y=0,k;O<F;)if(k=X[O++]){if(O>U){if(5e3<=++Y){O=F,f.a.Gc(Error("'Too much recursion' after processing "+Y+" task groups."));break}U=F}try{k()}catch(H){f.a.Gc(H)}}}}function Z(){b(),O=F=X.length=0}var E,X=[],F=0,N=1,O=0;return t.MutationObserver?E=function(U){var Y=n.createElement("div");return new MutationObserver(U).observe(Y,{attributes:!0}),function(){Y.classList.toggle("foo")}}(Z):E=n&&"onreadystatechange"in n.createElement("script")?function(U){var Y=n.createElement("script");Y.onreadystatechange=function(){Y.onreadystatechange=null,n.documentElement.removeChild(Y),Y=null,U()},n.documentElement.appendChild(Y)}:function(U){setTimeout(U,0)},{scheduler:E,zb:function(U){return F||f.na.scheduler(Z),X[F++]=U,N++},cancel:function(U){U=U-(N-F),U>=O&&U<F&&(X[U]=null)},resetForTesting:function(){var U=F-O;return O=F=X.length=0,U},Sd:b}}(),f.b("tasks",f.na),f.b("tasks.schedule",f.na.zb),f.b("tasks.runEarly",f.na.Sd),f.Ta={throttle:function(b,Z){b.throttleEvaluation=Z;var E=null;return f.$({read:b,write:function(X){clearTimeout(E),E=f.a.setTimeout(function(){b(X)},Z)}})},rateLimit:function(b,Z){var E,X,F;typeof Z=="number"?E=Z:(E=Z.timeout,X=Z.method),b.Hb=!1,F=typeof X=="function"?X:X=="notifyWhenChangesStop"?u:d,b.ub(function(N){return F(N,E,Z)})},deferred:function(b,Z){if(Z!==!0)throw Error("The 'deferred' extender only accepts the value 'true', because it is not supported to turn deferral off once enabled.");b.Hb||(b.Hb=!0,b.ub(function(E){var X,F=!1;return function(){if(!F){f.na.cancel(X),X=f.na.zb(E);try{F=!0,b.notifySubscribers(e,"dirty")}finally{F=!1}}}}))},notify:function(b,Z){b.equalityComparer=Z=="always"?null:c}};var x={undefined:1,boolean:1,number:1,string:1};f.b("extenders",f.Ta),f.ic=function(b,Z,E){this.da=b,this.lc=Z,this.mc=E,this.Ib=!1,this.fb=this.Jb=null,f.L(this,"dispose",this.s),f.L(this,"disposeWhenNodeIsRemoved",this.l)},f.ic.prototype.s=function(){this.Ib||(this.fb&&f.a.K.yb(this.Jb,this.fb),this.Ib=!0,this.mc(),this.da=this.lc=this.mc=this.Jb=this.fb=null)},f.ic.prototype.l=function(b){this.Jb=b,f.a.K.za(b,this.fb=this.s.bind(this))},f.T=function(){f.a.Ab(this,_),_.qb(this)};var _={qb:function(b){b.U={change:[]},b.sc=1},subscribe:function(b,Z,E){var X=this;E=E||"change";var F=new f.ic(X,Z?b.bind(Z):b,function(){f.a.Pa(X.U[E],F),X.hb&&X.hb(E)});return X.Qa&&X.Qa(E),X.U[E]||(X.U[E]=[]),X.U[E].push(F),F},notifySubscribers:function(b,Z){if(Z=Z||"change",Z==="change"&&this.Gb(),this.Wa(Z)){var E=Z==="change"&&this.ed||this.U[Z].slice(0);try{f.u.xc();for(var X=0,F;F=E[X];++X)F.Ib||F.lc(b)}finally{f.u.end()}}},ob:function(){return this.sc},Dd:function(b){return this.ob()!==b},Gb:function(){++this.sc},ub:function(b){var Z=this,E=f.O(Z),X,F,N,O,U;Z.gb||(Z.gb=Z.notifySubscribers,Z.notifySubscribers=h);var Y=b(function(){Z.Ja=!1,E&&O===Z&&(O=Z.nc?Z.nc():Z());var k=F||U&&Z.sb(N,O);U=F=X=!1,k&&Z.gb(N=O)});Z.qc=function(k,H){H&&Z.Ja||(U=!H),Z.ed=Z.U.change.slice(0),Z.Ja=X=!0,O=k,Y()},Z.pc=function(k){X||(N=k,Z.gb(k,"beforeChange"))},Z.rc=function(){U=!0},Z.gd=function(){Z.sb(N,Z.v(!0))&&(F=!0)}},Wa:function(b){return this.U[b]&&this.U[b].length},Bd:function(b){if(b)return this.U[b]&&this.U[b].length||0;var Z=0;return f.a.P(this.U,function(E,X){E!=="dirty"&&(Z+=X.length)}),Z},sb:function(b,Z){return!this.equalityComparer||!this.equalityComparer(b,Z)},toString:function(){return"[object Object]"},extend:function(b){var Z=this;return b&&f.a.P(b,function(E,X){var F=f.Ta[E];typeof F=="function"&&(Z=F(Z,X)||Z)}),Z}};f.L(_,"init",_.qb),f.L(_,"subscribe",_.subscribe),f.L(_,"extend",_.extend),f.L(_,"getSubscriptionsCount",_.Bd),f.a.Ba&&f.a.setPrototypeOf(_,Function.prototype),f.T.fn=_,f.Qc=function(b){return b!=null&&typeof b.subscribe=="function"&&typeof b.notifySubscribers=="function"},f.b("subscribable",f.T),f.b("isSubscribable",f.Qc),f.S=f.u=function(){function b(N){E.push(X),X=N}function Z(){X=E.pop()}var E=[],X,F=0;return{xc:b,end:Z,cc:function(N){if(X){if(!f.Qc(N))throw Error("Only subscribable things can act as dependencies");X.od.call(X.pd,N,N.fd||(N.fd=++F))}},G:function(N,O,U){try{return b(),N.apply(O,U||[])}finally{Z()}},qa:function(){if(X)return X.o.qa()},Va:function(){if(X)return X.o.Va()},Ya:function(){if(X)return X.Ya},o:function(){if(X)return X.o}}}(),f.b("computedContext",f.S),f.b("computedContext.getDependenciesCount",f.S.qa),f.b("computedContext.getDependencies",f.S.Va),f.b("computedContext.isInitial",f.S.Ya),f.b("computedContext.registerDependency",f.S.cc),f.b("ignoreDependencies",f.Yd=f.u.G);var C=f.a.Da("_latestValue");f.ta=function(b){function Z(){return 0<arguments.length?(Z.sb(Z[C],arguments[0])&&(Z.ya(),Z[C]=arguments[0],Z.xa()),this):(f.u.cc(Z),Z[C])}return Z[C]=b,f.a.Ba||f.a.extend(Z,f.T.fn),f.T.fn.qb(Z),f.a.Ab(Z,V),f.options.deferUpdates&&f.Ta.deferred(Z,!0),Z};var V={equalityComparer:c,v:function(){return this[C]},xa:function(){this.notifySubscribers(this[C],"spectate"),this.notifySubscribers(this[C])},ya:function(){this.notifySubscribers(this[C],"beforeChange")}};f.a.Ba&&f.a.setPrototypeOf(V,f.T.fn);var L=f.ta.Ma="__ko_proto__";V[L]=f.ta,f.O=function(b){if((b=typeof b=="function"&&b[L])&&b!==V[L]&&b!==f.o.fn[L])throw Error("Invalid object that looks like an observable; possibly from another Knockout instance");return!!b},f.Za=function(b){return typeof b=="function"&&(b[L]===V[L]||b[L]===f.o.fn[L]&&b.Nc)},f.b("observable",f.ta),f.b("isObservable",f.O),f.b("isWriteableObservable",f.Za),f.b("isWritableObservable",f.Za),f.b("observable.fn",V),f.L(V,"peek",V.v),f.L(V,"valueHasMutated",V.xa),f.L(V,"valueWillMutate",V.ya),f.Ha=function(b){if(b=b||[],typeof b!="object"||!("length"in b))throw Error("The argument passed when initializing an observable array must be an array, or null, or undefined.");return b=f.ta(b),f.a.Ab(b,f.Ha.fn),b.extend({trackArrayChanges:!0})},f.Ha.fn={remove:function(b){for(var Z=this.v(),E=[],X=typeof b!="function"||f.O(b)?function(O){return O===b}:b,F=0;F<Z.length;F++){var N=Z[F];if(X(N)){if(E.length===0&&this.ya(),Z[F]!==N)throw Error("Array modified during remove; cannot remove item");E.push(N),Z.splice(F,1),F--}}return E.length&&this.xa(),E},removeAll:function(b){if(b===e){var Z=this.v(),E=Z.slice(0);return this.ya(),Z.splice(0,Z.length),this.xa(),E}return b?this.remove(function(X){return 0<=f.a.A(b,X)}):[]},destroy:function(b){var Z=this.v(),E=typeof b!="function"||f.O(b)?function(N){return N===b}:b;this.ya();for(var X=Z.length-1;0<=X;X--){var F=Z[X];E(F)&&(F._destroy=!0)}this.xa()},destroyAll:function(b){return b===e?this.destroy(function(){return!0}):b?this.destroy(function(Z){return 0<=f.a.A(b,Z)}):[]},indexOf:function(b){var Z=this();return f.a.A(Z,b)},replace:function(b,Z){var E=this.indexOf(b);0<=E&&(this.ya(),this.v()[E]=Z,this.xa())},sorted:function(b){var Z=this().slice(0);return b?Z.sort(b):Z.sort()},reversed:function(){return this().slice(0).reverse()}},f.a.Ba&&f.a.setPrototypeOf(f.Ha.fn,f.ta.fn),f.a.D("pop push reverse shift sort splice unshift".split(" "),function(b){f.Ha.fn[b]=function(){var Z=this.v();this.ya(),this.zc(Z,b,arguments);var E=Z[b].apply(Z,arguments);return this.xa(),E===Z?this:E}}),f.a.D(["slice"],function(b){f.Ha.fn[b]=function(){var Z=this();return Z[b].apply(Z,arguments)}}),f.Pc=function(b){return f.O(b)&&typeof b.remove=="function"&&typeof b.push=="function"},f.b("observableArray",f.Ha),f.b("isObservableArray",f.Pc),f.Ta.trackArrayChanges=function(b,Z){function E(){function K(){if(U){var te=[].concat(b.v()||[]),z;b.Wa("arrayChange")&&((!F||1<U)&&(F=f.a.Pb(Y,te,b.Ob)),z=F),Y=te,F=null,U=0,z&&z.length&&b.notifySubscribers(z,"arrayChange")}}X?K():(X=!0,O=b.subscribe(function(){++U},null,"spectate"),Y=[].concat(b.v()||[]),F=null,N=b.subscribe(K))}if(b.Ob={},Z&&typeof Z=="object"&&f.a.extend(b.Ob,Z),b.Ob.sparse=!0,!b.zc){var X=!1,F=null,N,O,U=0,Y,k=b.Qa,H=b.hb;b.Qa=function(K){k&&k.call(b,K),K==="arrayChange"&&E()},b.hb=function(K){H&&H.call(b,K),K!=="arrayChange"||b.Wa("arrayChange")||(N&&N.s(),O&&O.s(),O=N=null,X=!1,Y=e)},b.zc=function(K,te,z){function j(Ie,we,ve){return ee[ee.length]={status:Ie,value:we,index:ve}}if(X&&!U){var ee=[],pe=K.length,_e=z.length,ae=0;switch(te){case"push":ae=pe;case"unshift":for(te=0;te<_e;te++)j("added",z[te],ae+te);break;case"pop":ae=pe-1;case"shift":pe&&j("deleted",K[ae],ae);break;case"splice":te=Math.min(Math.max(0,0>z[0]?pe+z[0]:z[0]),pe);for(var pe=_e===1?pe:Math.min(te+(z[1]||0),pe),_e=te+_e-2,ae=Math.max(pe,_e),ye=[],Se=[],Ee=2;te<ae;++te,++Ee)te<pe&&Se.push(j("deleted",K[te],te)),te<_e&&ye.push(j("added",z[Ee],te));f.a.Kc(Se,ye);break;default:return}F=ee}}}};var R=f.a.Da("_state");f.o=f.$=function(b,Z,E){function X(){if(0<arguments.length){if(typeof F=="function")F.apply(N.nb,arguments);else throw Error("Cannot write a value to a ko.computed unless you specify a 'write' option. If you wish to read the current value, don't pass any parameters.");return this}return N.ra||f.u.cc(X),(N.ka||N.J&&X.Xa())&&X.ha(),N.X}if(typeof b=="object"?E=b:(E=E||{},b&&(E.read=b)),typeof E.read!="function")throw Error("Pass a function that returns the value of the ko.computed");var F=E.write,N={X:e,sa:!0,ka:!0,rb:!1,jc:!1,ra:!1,wb:!1,J:!1,Wc:E.read,nb:Z||E.owner,l:E.disposeWhenNodeIsRemoved||E.l||null,Sa:E.disposeWhen||E.Sa,Rb:null,I:{},V:0,Ic:null};return X[R]=N,X.Nc=typeof F=="function",f.a.Ba||f.a.extend(X,f.T.fn),f.T.fn.qb(X),f.a.Ab(X,G),E.pure?(N.wb=!0,N.J=!0,f.a.extend(X,I)):E.deferEvaluation&&f.a.extend(X,v),f.options.deferUpdates&&f.Ta.deferred(X,!0),N.l&&(N.jc=!0,N.l.nodeType||(N.l=null)),N.J||E.deferEvaluation||X.ha(),N.l&&X.ja()&&f.a.K.za(N.l,N.Rb=function(){X.s()}),X};var G={equalityComparer:c,qa:function(){return this[R].V},Va:function(){var b=[];return f.a.P(this[R].I,function(Z,E){b[E.Ka]=E.da}),b},Vb:function(b){if(!this[R].V)return!1;var Z=this.Va();return f.a.A(Z,b)!==-1?!0:!!f.a.Lb(Z,function(E){return E.Vb&&E.Vb(b)})},uc:function(b,Z,E){if(this[R].wb&&Z===this)throw Error("A 'pure' computed must not be called recursively");this[R].I[b]=E,E.Ka=this[R].V++,E.La=Z.ob()},Xa:function(){var b,Z,E=this[R].I;for(b in E)if(Object.prototype.hasOwnProperty.call(E,b)&&(Z=E[b],this.Ia&&Z.da.Ja||Z.da.Dd(Z.La)))return!0},Jd:function(){this.Ia&&!this[R].rb&&this.Ia(!1)},ja:function(){var b=this[R];return b.ka||0<b.V},Rd:function(){this.Ja?this[R].ka&&(this[R].sa=!0):this.Hc()},$c:function(b){if(b.Hb){var Z=b.subscribe(this.Jd,this,"dirty"),E=b.subscribe(this.Rd,this);return{da:b,s:function(){Z.s(),E.s()}}}return b.subscribe(this.Hc,this)},Hc:function(){var b=this,Z=b.throttleEvaluation;Z&&0<=Z?(clearTimeout(this[R].Ic),this[R].Ic=f.a.setTimeout(function(){b.ha(!0)},Z)):b.Ia?b.Ia(!0):b.ha(!0)},ha:function(b){var Z=this[R],E=Z.Sa,X=!1;if(!Z.rb&&!Z.ra){if(Z.l&&!f.a.Sb(Z.l)||E&&E()){if(!Z.jc){this.s();return}}else Z.jc=!1;Z.rb=!0;try{X=this.zd(b)}finally{Z.rb=!1}return X}},zd:function(b){var Z=this[R],X=!1,E=Z.wb?e:!Z.V,X={qd:this,mb:Z.I,Qb:Z.V};f.u.xc({pd:X,od:g,o:this,Ya:E}),Z.I={},Z.V=0;var F=this.yd(Z,X);return Z.V?X=this.sb(Z.X,F):(this.s(),X=!0),X&&(Z.J?this.Gb():this.notifySubscribers(Z.X,"beforeChange"),Z.X=F,this.notifySubscribers(Z.X,"spectate"),!Z.J&&b&&this.notifySubscribers(Z.X),this.rc&&this.rc()),E&&this.notifySubscribers(Z.X,"awake"),X},yd:function(b,Z){try{var E=b.Wc;return b.nb?E.call(b.nb):E()}finally{f.u.end(),Z.Qb&&!b.J&&f.a.P(Z.mb,p),b.sa=b.ka=!1}},v:function(b){var Z=this[R];return(Z.ka&&(b||!Z.V)||Z.J&&this.Xa())&&this.ha(),Z.X},ub:function(b){f.T.fn.ub.call(this,b),this.nc=function(){return this[R].J||(this[R].sa?this.ha():this[R].ka=!1),this[R].X},this.Ia=function(Z){this.pc(this[R].X),this[R].ka=!0,Z&&(this[R].sa=!0),this.qc(this,!Z)}},s:function(){var b=this[R];!b.J&&b.I&&f.a.P(b.I,function(Z,E){E.s&&E.s()}),b.l&&b.Rb&&f.a.K.yb(b.l,b.Rb),b.I=e,b.V=0,b.ra=!0,b.sa=!1,b.ka=!1,b.J=!1,b.l=e,b.Sa=e,b.Wc=e,this.Nc||(b.nb=e)}},I={Qa:function(b){var Z=this,E=Z[R];if(!E.ra&&E.J&&b=="change"){if(E.J=!1,E.sa||Z.Xa())E.I=null,E.V=0,Z.ha()&&Z.Gb();else{var X=[];f.a.P(E.I,function(F,N){X[N.Ka]=F}),f.a.D(X,function(F,N){var O=E.I[F],U=Z.$c(O.da);U.Ka=N,U.La=O.La,E.I[F]=U}),Z.Xa()&&Z.ha()&&Z.Gb()}E.ra||Z.notifySubscribers(E.X,"awake")}},hb:function(b){var Z=this[R];Z.ra||b!="change"||this.Wa("change")||(f.a.P(Z.I,function(E,X){X.s&&(Z.I[E]={da:X.da,Ka:X.Ka,La:X.La},X.s())}),Z.J=!0,this.notifySubscribers(e,"asleep"))},ob:function(){var b=this[R];return b.J&&(b.sa||this.Xa())&&this.ha(),f.T.fn.ob.call(this)}},v={Qa:function(b){b!="change"&&b!="beforeChange"||this.v()}};f.a.Ba&&f.a.setPrototypeOf(G,f.T.fn);var P=f.ta.Ma;G[P]=f.o,f.Oc=function(b){return typeof b=="function"&&b[P]===G[P]},f.Fd=function(b){return f.Oc(b)&&b[R]&&b[R].wb},f.b("computed",f.o),f.b("dependentObservable",f.o),f.b("isComputed",f.Oc),f.b("isPureComputed",f.Fd),f.b("computed.fn",G),f.L(G,"peek",G.v),f.L(G,"dispose",G.s),f.L(G,"isActive",G.ja),f.L(G,"getDependenciesCount",G.qa),f.L(G,"getDependencies",G.Va),f.xb=function(b,Z){return typeof b=="function"?f.o(b,Z,{pure:!0}):(b=f.a.extend({},b),b.pure=!0,f.o(b,Z))},f.b("pureComputed",f.xb),function(){function b(X,F,N){if(N=N||new E,X=F(X),typeof X!="object"||X===null||X===e||X instanceof RegExp||X instanceof Date||X instanceof String||X instanceof Number||X instanceof Boolean)return X;var O=X instanceof Array?[]:{};return N.save(X,O),Z(X,function(U){var Y=F(X[U]);switch(typeof Y){case"boolean":case"number":case"string":case"function":O[U]=Y;break;case"object":case"undefined":var k=N.get(Y);O[U]=k!==e?k:b(Y,F,N)}}),O}function Z(X,F){if(X instanceof Array){for(var N=0;N<X.length;N++)F(N);typeof X.toJSON=="function"&&F("toJSON")}else for(N in X)F(N)}function E(){this.keys=[],this.values=[]}f.ad=function(X){if(arguments.length==0)throw Error("When calling ko.toJS, pass the object you want to convert.");return b(X,function(F){for(var N=0;f.O(F)&&10>N;N++)F=F();return F})},f.toJSON=function(X,F,N){return X=f.ad(X),f.a.hc(X,F,N)},E.prototype={constructor:E,save:function(X,F){var N=f.a.A(this.keys,X);0<=N?this.values[N]=F:(this.keys.push(X),this.values.push(F))},get:function(X){return X=f.a.A(this.keys,X),0<=X?this.values[X]:e}}}(),f.b("toJS",f.ad),f.b("toJSON",f.toJSON),f.Wd=function(b,Z,E){function X(F){var N=f.xb(b,E).extend({ma:"always"}),O=N.subscribe(function(U){U&&(O.s(),F(U))});return N.notifySubscribers(N.v()),O}return typeof Promise!="function"||Z?X(Z.bind(E)):new Promise(X)},f.b("when",f.Wd),function(){f.w={M:function(b){switch(f.a.R(b)){case"option":return b.__ko__hasDomDataOptionValue__===!0?f.a.g.get(b,f.c.options.$b):7>=f.a.W?b.getAttributeNode("value")&&b.getAttributeNode("value").specified?b.value:b.text:b.value;case"select":return 0<=b.selectedIndex?f.w.M(b.options[b.selectedIndex]):e;default:return b.value}},cb:function(b,Z,E){switch(f.a.R(b)){case"option":typeof Z=="string"?(f.a.g.set(b,f.c.options.$b,e),"__ko__hasDomDataOptionValue__"in b&&delete b.__ko__hasDomDataOptionValue__,b.value=Z):(f.a.g.set(b,f.c.options.$b,Z),b.__ko__hasDomDataOptionValue__=!0,b.value=typeof Z=="number"?Z:"");break;case"select":(Z===""||Z===null)&&(Z=e);for(var X=-1,F=0,N=b.options.length,O;F<N;++F)if(O=f.w.M(b.options[F]),O==Z||O===""&&Z===e){X=F;break}(E||0<=X||Z===e&&1<b.size)&&(b.selectedIndex=X,f.a.W===6&&f.a.setTimeout(function(){b.selectedIndex=X},0));break;default:(Z===null||Z===e)&&(Z=""),b.value=Z}}}}(),f.b("selectExtensions",f.w),f.b("selectExtensions.readValue",f.w.M),f.b("selectExtensions.writeValue",f.w.cb),f.m=function(){function b(U){U=f.a.Db(U),U.charCodeAt(0)===123&&(U=U.slice(1,-1)),U+=` ,`;var Y=[],k=U.match(X),H,K=[],te=0;if(1<k.length){for(var z=0,j;j=k[z];++z){var ee=j.charCodeAt(0);if(ee===44){if(0>=te){Y.push(H&&K.length?{key:H,value:K.join("")}:{unknown:H||K.join("")}),H=te=0,K=[];continue}}else if(ee===58){if(!te&&!H&&K.length===1){H=K.pop();continue}}else{if(ee===47&&1<j.length&&(j.charCodeAt(1)===47||j.charCodeAt(1)===42))continue;ee===47&&z&&1<j.length?(ee=k[z-1].match(F))&&!N[ee[0]]&&(U=U.substr(U.indexOf(j)+1),k=U.match(X),z=-1,j="/"):ee===40||ee===123||ee===91?++te:ee===41||ee===125||ee===93?--te:H||K.length||ee!==34&&ee!==39||(j=j.slice(1,-1))}K.push(j)}if(0<te)throw Error("Unbalanced parentheses, braces, or brackets")}return Y}var Z=["true","false","null","undefined"],E=/^(?:[$_a-z][$\w]*|(.+)(\.\s*[$_a-z][$\w]*|\[.+\]))$/i,X=RegExp(`"(?:\\\\.|[^"])*"|'(?:\\\\.|[^'])*'|\`(?:\\\\.|[^\`])*\`|/\\*(?:[^*]|\\*+[^*/])*\\*+/|//.* |/(?:\\\\.|[^/])+/w*|[^\\s:,/][^,"'\`{}()/:[\\]]*[^\\s,"'\`{}()/:[\\]]|[^\\s]`,"g"),F=/[\])"'A-Za-z0-9_$]+$/,N={in:1,return:1,typeof:1},O={};return{Ra:[],wa:O,ac:b,vb:function(U,Y){function k(ee,pe){var _e;if(!z){var ae=f.getBindingHandler(ee);if(ae&&ae.preprocess&&!(pe=ae.preprocess(pe,ee,k)))return;(ae=O[ee])&&(_e=pe,0<=f.a.A(Z,_e)?_e=!1:(ae=_e.match(E),_e=ae===null?!1:ae[1]?"Object("+ae[1]+")"+ae[2]:_e),ae=_e),ae&&K.push("'"+(typeof O[ee]=="string"?O[ee]:ee)+"':function(_z){"+_e+"=_z}")}te&&(pe="function(){return "+pe+" }"),H.push("'"+ee+"':"+pe)}Y=Y||{};var H=[],K=[],te=Y.valueAccessors,z=Y.bindingParams,j=typeof U=="string"?b(U):U;return f.a.D(j,function(ee){k(ee.key||ee.unknown,ee.value)}),K.length&&k("_ko_property_writers","{"+K.join(",")+" }"),H.join(",")},Id:function(U,Y){for(var k=0;k<U.length;k++)if(U[k].key==Y)return!0;return!1},eb:function(U,Y,k,H,K){U&&f.O(U)?!f.Za(U)||K&&U.v()===H||U(H):(U=Y.get("_ko_property_writers"))&&U[k]&&U[k](H)}}}(),f.b("expressionRewriting",f.m),f.b("expressionRewriting.bindingRewriteValidators",f.m.Ra),f.b("expressionRewriting.parseObjectLiteral",f.m.ac),f.b("expressionRewriting.preProcessBindings",f.m.vb),f.b("expressionRewriting._twoWayBindings",f.m.wa),f.b("jsonExpressionRewriting",f.m),f.b("jsonExpressionRewriting.insertPropertyAccessorsIntoJson",f.m.vb),function(){function b(k){return k.nodeType==8&&N.test(F?k.text:k.nodeValue)}function Z(k){return k.nodeType==8&&O.test(F?k.text:k.nodeValue)}function E(k,H){for(var K=k,te=1,z=[];K=K.nextSibling;){if(Z(K)&&(f.a.g.set(K,Y,!0),te--,te===0))return z;z.push(K),b(K)&&te++}if(!H)throw Error("Cannot find closing comment tag to match: "+k.nodeValue);return null}function X(k,H){var K=E(k,H);return K?0<K.length?K[K.length-1].nextSibling:k.nextSibling:null}var F=n&&n.createComment("test").text==="<!--test-->",N=F?/^\x3c!--\s*ko(?:\s+([\s\S]+))?\s*--\x3e$/:/^\s*ko(?:\s+([\s\S]+))?\s*$/,O=F?/^\x3c!--\s*\/ko\s*--\x3e$/:/^\s*\/ko\s*$/,U={ul:!0,ol:!0},Y="__ko_matchedEndComment__";f.h={ea:{},childNodes:function(k){return b(k)?E(k):k.childNodes},Ea:function(k){if(b(k)){k=f.h.childNodes(k);for(var H=0,K=k.length;H<K;H++)f.removeNode(k[H])}else f.a.Tb(k)},va:function(k,H){if(b(k)){f.h.Ea(k);for(var K=k.nextSibling,te=0,z=H.length;te<z;te++)K.parentNode.insertBefore(H[te],K)}else f.a.va(k,H)},Vc:function(k,H){var K;b(k)?(K=k.nextSibling,k=k.parentNode):K=k.firstChild,K?H!==K&&k.insertBefore(H,K):k.appendChild(H)},Wb:function(k,H,K){K?(K=K.nextSibling,b(k)&&(k=k.parentNode),K?H!==K&&k.insertBefore(H,K):k.appendChild(H)):f.h.Vc(k,H)},firstChild:function(k){if(b(k))return!k.nextSibling||Z(k.nextSibling)?null:k.nextSibling;if(k.firstChild&&Z(k.firstChild))throw Error("Found invalid end comment, as the first child of "+k);return k.firstChild},nextSibling:function(k){if(b(k)&&(k=X(k)),k.nextSibling&&Z(k.nextSibling)){var H=k.nextSibling;if(Z(H)&&!f.a.g.get(H,Y))throw Error("Found end comment without a matching opening comment, as child of "+k);return null}return k.nextSibling},Cd:b,Vd:function(k){return(k=(F?k.text:k.nodeValue).match(N))?k[1]:null},Sc:function(k){if(U[f.a.R(k)]){var H=k.firstChild;if(H)do if(H.nodeType===1){var K;K=H.firstChild;var te=null;if(K)do if(te)te.push(K);else if(b(K)){var z=X(K,!0);z?K=z:te=[K]}else Z(K)&&(te=[K]);while(K=K.nextSibling);if(K=te)for(te=H.nextSibling,z=0;z<K.length;z++)te?k.insertBefore(K[z],te):k.appendChild(K[z])}while(H=H.nextSibling)}}}}(),f.b("virtualElements",f.h),f.b("virtualElements.allowedBindings",f.h.ea),f.b("virtualElements.emptyNode",f.h.Ea),f.b("virtualElements.insertAfter",f.h.Wb),f.b("virtualElements.prepend",f.h.Vc),f.b("virtualElements.setDomNodeChildren",f.h.va),function(){f.ga=function(){this.nd={}},f.a.extend(f.ga.prototype,{nodeHasBindings:function(b){switch(b.nodeType){case 1:return b.getAttribute("data-bind")!=null||f.j.getComponentNameForNode(b);case 8:return f.h.Cd(b);default:return!1}},getBindings:function(b,Z){var E=this.getBindingsString(b,Z),E=E?this.parseBindingsString(E,Z,b):null;return f.j.tc(E,b,Z,!1)},getBindingAccessors:function(b,Z){var E=this.getBindingsString(b,Z),E=E?this.parseBindingsString(E,Z,b,{valueAccessors:!0}):null;return f.j.tc(E,b,Z,!0)},getBindingsString:function(b){switch(b.nodeType){case 1:return b.getAttribute("data-bind");case 8:return f.h.Vd(b);default:return null}},parseBindingsString:function(b,Z,E,X){try{var F=this.nd,N=b+(X&&X.valueAccessors||""),O;if(!(O=F[N])){var U,Y="with($context){with($data||{}){return{"+f.m.vb(b,X)+"}}}";U=new Function("$context","$element",Y),O=F[N]=U}return O(Z,E)}catch(k){throw k.message=`Unable to parse bindings. Bindings value: `+b+` Message: `+k.message,k}}}),f.ga.instance=new f.ga}(),f.b("bindingProvider",f.ga),function(){function b(ae){var ye=(ae=f.a.g.get(ae,_e))&&ae.N;ye&&(ae.N=null,ye.Tc())}function Z(ae,ye,Se){this.node=ae,this.yc=ye,this.kb=[],this.H=!1,ye.N||f.a.K.za(ae,b),Se&&Se.N&&(Se.N.kb.push(ae),this.Kb=Se)}function E(ae){return function(){return ae}}function X(ae){return ae()}function F(ae){return f.a.Ga(f.u.G(ae),function(ye,Se){return function(){return ae()[Se]}})}function N(ae,ye,Se){return typeof ae=="function"?F(ae.bind(null,ye,Se)):f.a.Ga(ae,E)}function O(ae,ye){return F(this.getBindings.bind(this,ae,ye))}function U(ae,ye){var Se=f.h.firstChild(ye);if(Se){var Ee,Ie=f.ga.instance,we=Ie.preprocessNode;if(we){for(;Ee=Se;)Se=f.h.nextSibling(Ee),we.call(Ie,Ee);Se=f.h.firstChild(ye)}for(;Ee=Se;)Se=f.h.nextSibling(Ee),Y(ae,Ee)}f.i.ma(ye,f.i.H)}function Y(ae,ye){var Se=ae,Ee=ye.nodeType===1;Ee&&f.h.Sc(ye),(Ee||f.ga.instance.nodeHasBindings(ye))&&(Se=H(ye,null,ae).bindingContextForDescendants),Se&&!ee[f.a.R(ye)]&&U(Se,ye)}function k(ae){var ye=[],Se={},Ee=[];return f.a.P(ae,function Ie(we){if(!Se[we]){var ve=f.getBindingHandler(we);ve&&(ve.after&&(Ee.push(we),f.a.D(ve.after,function(at){if(ae[at]){if(f.a.A(Ee,at)!==-1)throw Error("Cannot combine the following bindings, because they have a cyclic dependency: "+Ee.join(", "));Ie(at)}}),Ee.length--),ye.push({key:we,Mc:ve})),Se[we]=!0}}),ye}function H(ae,ye,Se){var Ee=f.a.g.Ub(ae,_e,{}),Ie=Ee.hd;if(!ye){if(Ie)throw Error("You cannot apply bindings multiple times to the same element.");Ee.hd=!0}Ie||(Ee.context=Se),Ee.Zb||(Ee.Zb={});var we;if(ye&&typeof ye!="function")we=ye;else{var ve=f.ga.instance,at=ve.getBindingAccessors||O,Je=f.$(function(){return(we=ye?ye(Se,ae):at.call(ve,ae,Se))&&(Se[te]&&Se[te](),Se[j]&&Se[j]()),we},null,{l:ae});we&&Je.ja()||(Je=null)}var pt=Se,Qe;if(we){var _t=function(){return f.a.Ga(Je?Je():we,X)},ht=Je?function(bt){return function(){return X(Je()[bt])}}:function(bt){return we[bt]};_t.get=function(bt){return we[bt]&&X(ht(bt))},_t.has=function(bt){return bt in we},f.i.H in we&&f.i.subscribe(ae,f.i.H,function(){var bt=(0,we[f.i.H])();if(bt){var En=f.h.childNodes(ae);En.length&&bt(En,f.Ec(En[0]))}}),f.i.pa in we&&(pt=f.i.Cb(ae,Se),f.i.subscribe(ae,f.i.pa,function(){var bt=(0,we[f.i.pa])();bt&&f.h.firstChild(ae)&&bt(ae)})),Ee=k(we),f.a.D(Ee,function(bt){var En=bt.Mc.init,sn=bt.Mc.update,Ce=bt.key;if(ae.nodeType===8&&!f.h.ea[Ce])throw Error("The binding '"+Ce+"' cannot be used with virtual elements");try{typeof En=="function"&&f.u.G(function(){var Le=En(ae,ht(Ce),_t,pt.$data,pt);if(Le&&Le.controlsDescendantBindings){if(Qe!==e)throw Error("Multiple bindings ("+Qe+" and "+Ce+") are trying to control descendant bindings of the same element. You cannot use these bindings together on the same element.");Qe=Ce}}),typeof sn=="function"&&f.$(function(){sn(ae,ht(Ce),_t,pt.$data,pt)},null,{l:ae})}catch(Le){throw Le.message='Unable to process binding "'+Ce+": "+we[Ce]+`" Message: `+Le.message,Le}})}return Ee=Qe===e,{shouldBindDescendants:Ee,bindingContextForDescendants:Ee&&pt}}function K(ae,ye){return ae&&ae instanceof f.fa?ae:new f.fa(ae,e,e,ye)}var te=f.a.Da("_subscribable"),z=f.a.Da("_ancestorBindingInfo"),j=f.a.Da("_dataDependency");f.c={};var ee={script:!0,textarea:!0,template:!0};f.getBindingHandler=function(ae){return f.c[ae]};var pe={};f.fa=function(ae,ye,Se,Ee,Ie){function we(){var ht=pt?Je():Je,bt=f.a.f(ht);return ye?(f.a.extend(ve,ye),z in ye&&(ve[z]=ye[z])):(ve.$parents=[],ve.$root=bt,ve.ko=f),ve[te]=Qe,at?bt=ve.$data:(ve.$rawData=ht,ve.$data=bt),Se&&(ve[Se]=bt),Ee&&Ee(ve,ye,bt),ye&&ye[te]&&!f.S.o().Vb(ye[te])&&ye[te](),_t&&(ve[j]=_t),ve.$data}var ve=this,at=ae===pe,Je=at?e:ae,pt=typeof Je=="function"&&!f.O(Je),Qe,_t=Ie&&Ie.dataDependency;Ie&&Ie.exportDependencies?we():(Qe=f.xb(we),Qe.v(),Qe.ja()?Qe.equalityComparer=null:ve[te]=e)},f.fa.prototype.createChildContext=function(ae,ye,Se,Ee){if(!Ee&&ye&&typeof ye=="object"&&(Ee=ye,ye=Ee.as,Se=Ee.extend),ye&&Ee&&Ee.noChildContext){var Ie=typeof ae=="function"&&!f.O(ae);return new f.fa(pe,this,null,function(we){Se&&Se(we),we[ye]=Ie?ae():ae},Ee)}return new f.fa(ae,this,ye,function(we,ve){we.$parentContext=ve,we.$parent=ve.$data,we.$parents=(ve.$parents||[]).slice(0),we.$parents.unshift(we.$parent),Se&&Se(we)},Ee)},f.fa.prototype.extend=function(ae,ye){return new f.fa(pe,this,null,function(Se){f.a.extend(Se,typeof ae=="function"?ae(Se):ae)},ye)};var _e=f.a.g.Z();Z.prototype.Tc=function(){this.Kb&&this.Kb.N&&this.Kb.N.sd(this.node)},Z.prototype.sd=function(ae){f.a.Pa(this.kb,ae),!this.kb.length&&this.H&&this.Cc()},Z.prototype.Cc=function(){this.H=!0,this.yc.N&&!this.kb.length&&(this.yc.N=null,f.a.K.yb(this.node,b),f.i.ma(this.node,f.i.pa),this.Tc())},f.i={H:"childrenComplete",pa:"descendantsComplete",subscribe:function(ae,ye,Se,Ee,Ie){var we=f.a.g.Ub(ae,_e,{});return we.Fa||(we.Fa=new f.T),Ie&&Ie.notifyImmediately&&we.Zb[ye]&&f.u.G(Se,Ee,[ae]),we.Fa.subscribe(Se,Ee,ye)},ma:function(ae,ye){var Se=f.a.g.get(ae,_e);if(Se&&(Se.Zb[ye]=!0,Se.Fa&&Se.Fa.notifySubscribers(ae,ye),ye==f.i.H)){if(Se.N)Se.N.Cc();else if(Se.N===e&&Se.Fa&&Se.Fa.Wa(f.i.pa))throw Error("descendantsComplete event not supported for bindings on this node")}},Cb:function(ae,ye){var Se=f.a.g.Ub(ae,_e,{});return Se.N||(Se.N=new Z(ae,Se,ye[z])),ye[z]==Se?ye:ye.extend(function(Ee){Ee[z]=Se})}},f.Td=function(ae){return(ae=f.a.g.get(ae,_e))&&ae.context},f.ib=function(ae,ye,Se){return ae.nodeType===1&&f.h.Sc(ae),H(ae,ye,K(Se))},f.ld=function(ae,ye,Se){return Se=K(Se),f.ib(ae,N(ye,Se,ae),Se)},f.Oa=function(ae,ye){ye.nodeType!==1&&ye.nodeType!==8||U(K(ae),ye)},f.vc=function(ae,ye,Se){if(!o&&t.jQuery&&(o=t.jQuery),2>arguments.length){if(ye=n.body,!ye)throw Error("ko.applyBindings: could not find document.body; has the document been loaded?")}else if(!ye||ye.nodeType!==1&&ye.nodeType!==8)throw Error("ko.applyBindings: first parameter should be your view model; second parameter should be a DOM node");Y(K(ae,Se),ye)},f.Dc=function(ae){return!ae||ae.nodeType!==1&&ae.nodeType!==8?e:f.Td(ae)},f.Ec=function(ae){return(ae=f.Dc(ae))?ae.$data:e},f.b("bindingHandlers",f.c),f.b("bindingEvent",f.i),f.b("bindingEvent.subscribe",f.i.subscribe),f.b("bindingEvent.startPossiblyAsyncContentBinding",f.i.Cb),f.b("applyBindings",f.vc),f.b("applyBindingsToDescendants",f.Oa),f.b("applyBindingAccessorsToNode",f.ib),f.b("applyBindingsToNode",f.ld),f.b("contextFor",f.Dc),f.b("dataFor",f.Ec)}(),function(b){function Z(O,U){var Y=Object.prototype.hasOwnProperty.call(F,O)?F[O]:b,k;Y?Y.subscribe(U):(Y=F[O]=new f.T,Y.subscribe(U),E(O,function(H,K){var te=!(!K||!K.synchronous);N[O]={definition:H,Gd:te},delete F[O],k||te?Y.notifySubscribers(H):f.na.zb(function(){Y.notifySubscribers(H)})}),k=!0)}function E(O,U){X("getConfig",[O],function(Y){Y?X("loadComponent",[O,Y],function(k){U(k,Y)}):U(null,null)})}function X(O,U,Y,k){k||(k=f.j.loaders.slice(0));var H=k.shift();if(H){var K=H[O];if(K){var te=!1;if(K.apply(H,U.concat(function(z){te?Y(null):z!==null?Y(z):X(O,U,Y,k)}))!==b&&(te=!0,!H.suppressLoaderExceptions))throw Error("Component loaders must supply values by invoking the callback, not by returning values synchronously.")}else X(O,U,Y,k)}else Y(null)}var F={},N={};f.j={get:function(O,U){var Y=Object.prototype.hasOwnProperty.call(N,O)?N[O]:b;Y?Y.Gd?f.u.G(function(){U(Y.definition)}):f.na.zb(function(){U(Y.definition)}):Z(O,U)},Bc:function(O){delete N[O]},oc:X},f.j.loaders=[],f.b("components",f.j),f.b("components.get",f.j.get),f.b("components.clearCachedDefinition",f.j.Bc)}(),function(){function b(Y,k,H,K){function te(){--j===0&&K(z)}var z={},j=2,ee=H.template;H=H.viewModel,ee?F(k,ee,function(pe){f.j.oc("loadTemplate",[Y,pe],function(_e){z.template=_e,te()})}):te(),H?F(k,H,function(pe){f.j.oc("loadViewModel",[Y,pe],function(_e){z[U]=_e,te()})}):te()}function Z(Y,k,H){if(typeof k=="function")H(function(te){return new k(te)});else if(typeof k[U]=="function")H(k[U]);else if("instance"in k){var K=k.instance;H(function(){return K})}else"viewModel"in k?Z(Y,k.viewModel,H):Y("Unknown viewModel value: "+k)}function E(Y){switch(f.a.R(Y)){case"script":return f.a.ua(Y.text);case"textarea":return f.a.ua(Y.value);case"template":if(X(Y.content))return f.a.Ca(Y.content.childNodes)}return f.a.Ca(Y.childNodes)}function X(Y){return t.DocumentFragment?Y instanceof DocumentFragment:Y&&Y.nodeType===11}function F(Y,k,H){typeof k.require=="string"?a||t.require?(a||t.require)([k.require],function(K){K&&typeof K=="object"&&K.Xd&&K.default&&(K=K.default),H(K)}):Y("Uses require, but no AMD loader is present"):H(k)}function N(Y){return function(k){throw Error("Component '"+Y+"': "+k)}}var O={};f.j.register=function(Y,k){if(!k)throw Error("Invalid configuration for "+Y);if(f.j.tb(Y))throw Error("Component "+Y+" is already registered");O[Y]=k},f.j.tb=function(Y){return Object.prototype.hasOwnProperty.call(O,Y)},f.j.unregister=function(Y){delete O[Y],f.j.Bc(Y)},f.j.Fc={getConfig:function(Y,k){k(f.j.tb(Y)?O[Y]:null)},loadComponent:function(Y,k,H){var K=N(Y);F(K,k,function(te){b(Y,K,te,H)})},loadTemplate:function(Y,k,H){if(Y=N(Y),typeof k=="string")H(f.a.ua(k));else if(k instanceof Array)H(k);else if(X(k))H(f.a.la(k.childNodes));else if(k.element)if(k=k.element,t.HTMLElement?k instanceof HTMLElement:k&&k.tagName&&k.nodeType===1)H(E(k));else if(typeof k=="string"){var K=n.getElementById(k);K?H(E(K)):Y("Cannot find element with ID "+k)}else Y("Unknown element type: "+k);else Y("Unknown template value: "+k)},loadViewModel:function(Y,k,H){Z(N(Y),k,H)}};var U="createViewModel";f.b("components.register",f.j.register),f.b("components.isRegistered",f.j.tb),f.b("components.unregister",f.j.unregister),f.b("components.defaultLoader",f.j.Fc),f.j.loaders.push(f.j.Fc),f.j.dd=O}(),function(){function b(E,X){var F=E.getAttribute("params");if(F){var F=Z.parseBindingsString(F,X,E,{valueAccessors:!0,bindingParams:!0}),F=f.a.Ga(F,function(U){return f.o(U,null,{l:E})}),N=f.a.Ga(F,function(U){var Y=U.v();return U.ja()?f.o({read:function(){return f.a.f(U())},write:f.Za(Y)&&function(k){U()(k)},l:E}):Y});return Object.prototype.hasOwnProperty.call(N,"$raw")||(N.$raw=F),N}return{$raw:{}}}f.j.getComponentNameForNode=function(E){var X=f.a.R(E);if(f.j.tb(X)&&(X.indexOf("-")!=-1||""+E=="[object HTMLUnknownElement]"||8>=f.a.W&&E.tagName===X))return X},f.j.tc=function(E,X,F,N){if(X.nodeType===1){var O=f.j.getComponentNameForNode(X);if(O){if(E=E||{},E.component)throw Error('Cannot use the "component" binding on a custom element matching a component');var U={name:O,params:b(X,F)};E.component=N?function(){return U}:U}}return E};var Z=new f.ga;9>f.a.W&&(f.j.register=function(E){return function(X){return E.apply(this,arguments)}}(f.j.register),n.createDocumentFragment=function(E){return function(){var X=E(),F=f.j.dd,N;for(N in F);return X}}(n.createDocumentFragment))}(),function(){function b(X,F,N){if(F=F.template,!F)throw Error("Component '"+X+"' has no template");X=f.a.Ca(F),f.h.va(N,X)}function Z(X,F,N){var O=X.createViewModel;return O?O.call(X,F,N):F}var E=0;f.c.component={init:function(X,F,N,O,U){function Y(){var z=k&&k.dispose;typeof z=="function"&&z.call(k),K&&K.s(),H=k=K=null}var k,H,K,te=f.a.la(f.h.childNodes(X));return f.h.Ea(X),f.a.K.za(X,Y),f.o(function(){var z=f.a.f(F()),j,ee;if(typeof z=="string"?j=z:(j=f.a.f(z.name),ee=f.a.f(z.params)),!j)throw Error("No component name specified");var pe=f.i.Cb(X,U),_e=H=++E;f.j.get(j,function(ae){if(H===_e){if(Y(),!ae)throw Error("Unknown component '"+j+"'");b(j,ae,X);var ye=Z(ae,ee,{element:X,templateNodes:te});ae=pe.createChildContext(ye,{extend:function(Se){Se.$component=ye,Se.$componentTemplateNodes=te}}),ye&&ye.koDescendantsComplete&&(K=f.i.subscribe(X,f.i.pa,ye.koDescendantsComplete,ye)),k=ye,f.Oa(ae,X)}})},null,{l:X}),{controlsDescendantBindings:!0}}},f.h.ea.component=!0}();var w={class:"className",for:"htmlFor"};f.c.attr={update:function(b,Z){var E=f.a.f(Z())||{};f.a.P(E,function(X,F){F=f.a.f(F);var N=X.indexOf(":"),N="lookupNamespaceURI"in b&&0<N&&b.lookupNamespaceURI(X.substr(0,N)),O=F===!1||F===null||F===e;O?N?b.removeAttributeNS(N,X):b.removeAttribute(X):F=F.toString(),8>=f.a.W&&X in w?(X=w[X],O?b.removeAttribute(X):b[X]=F):O||(N?b.setAttributeNS(N,X,F):b.setAttribute(X,F)),X==="name"&&f.a.Yc(b,O?"":F)})}},function(){f.c.checked={after:["value","attr"],init:function(b,Z,E){function X(){var z=b.checked,j=N();if(!f.S.Ya()&&(z||!U&&!f.S.qa())){var ee=f.u.G(Z);if(k){var pe=H?ee.v():ee,_e=te;te=j,_e!==j?z&&(f.a.Na(pe,j,!0),f.a.Na(pe,_e,!1)):f.a.Na(pe,j,z),H&&f.Za(ee)&&ee(pe)}else O&&(j===e?j=z:z||(j=e)),f.m.eb(ee,E,"checked",j,!0)}}function F(){var z=f.a.f(Z()),j=N();k?(b.checked=0<=f.a.A(z,j),te=j):b.checked=O&&j===e?!!z:N()===z}var N=f.xb(function(){if(E.has("checkedValue"))return f.a.f(E.get("checkedValue"));if(K)return E.has("value")?f.a.f(E.get("value")):b.value}),O=b.type=="checkbox",U=b.type=="radio";if(O||U){var Y=Z(),k=O&&f.a.f(Y)instanceof Array,H=!(k&&Y.push&&Y.splice),K=U||k,te=k?N():e;U&&!b.name&&f.c.uniqueName.init(b,function(){return!0}),f.o(X,null,{l:b}),f.a.B(b,"click",X),f.o(F,null,{l:b}),Y=e}}},f.m.wa.checked=!0,f.c.checkedValue={update:function(b,Z){b.value=f.a.f(Z())}}}(),f.c.class={update:function(b,Z){var E=f.a.Db(f.a.f(Z()));f.a.Eb(b,b.__ko__cssValue,!1),b.__ko__cssValue=E,f.a.Eb(b,E,!0)}},f.c.css={update:function(b,Z){var E=f.a.f(Z());E!==null&&typeof E=="object"?f.a.P(E,function(X,F){F=f.a.f(F),f.a.Eb(b,X,F)}):f.c.class.update(b,Z)}},f.c.enable={update:function(b,Z){var E=f.a.f(Z());E&&b.disabled?b.removeAttribute("disabled"):E||b.disabled||(b.disabled=!0)}},f.c.disable={update:function(b,Z){f.c.enable.update(b,function(){return!f.a.f(Z())})}},f.c.event={init:function(b,Z,E,X,F){var N=Z()||{};f.a.P(N,function(O){typeof O=="string"&&f.a.B(b,O,function(U){var Y,k=Z()[O];if(k){try{var H=f.a.la(arguments);X=F.$data,H.unshift(X),Y=k.apply(X,H)}finally{Y!==!0&&(U.preventDefault?U.preventDefault():U.returnValue=!1)}E.get(O+"Bubble")===!1&&(U.cancelBubble=!0,U.stopPropagation&&U.stopPropagation())}})})}},f.c.foreach={Rc:function(b){return function(){var Z=b(),E=f.a.bc(Z);return!E||typeof E.length=="number"?{foreach:Z,templateEngine:f.ba.Ma}:(f.a.f(Z),{foreach:E.data,as:E.as,noChildContext:E.noChildContext,includeDestroyed:E.includeDestroyed,afterAdd:E.afterAdd,beforeRemove:E.beforeRemove,afterRender:E.afterRender,beforeMove:E.beforeMove,afterMove:E.afterMove,templateEngine:f.ba.Ma})}},init:function(b,Z){return f.c.template.init(b,f.c.foreach.Rc(Z))},update:function(b,Z,E,X,F){return f.c.template.update(b,f.c.foreach.Rc(Z),E,X,F)}},f.m.Ra.foreach=!1,f.h.ea.foreach=!0,f.c.hasfocus={init:function(b,Z,E){function X(O){b.__ko_hasfocusUpdating=!0;var U=b.ownerDocument;if("activeElement"in U){var Y;try{Y=U.activeElement}catch{Y=U.body}O=Y===b}U=Z(),f.m.eb(U,E,"hasfocus",O,!0),b.__ko_hasfocusLastValue=O,b.__ko_hasfocusUpdating=!1}var F=X.bind(null,!0),N=X.bind(null,!1);f.a.B(b,"focus",F),f.a.B(b,"focusin",F),f.a.B(b,"blur",N),f.a.B(b,"focusout",N),b.__ko_hasfocusLastValue=!1},update:function(b,Z){var E=!!f.a.f(Z());b.__ko_hasfocusUpdating||b.__ko_hasfocusLastValue===E||(E?b.focus():b.blur(),!E&&b.__ko_hasfocusLastValue&&b.ownerDocument.body.focus(),f.u.G(f.a.Fb,null,[b,E?"focusin":"focusout"]))}},f.m.wa.hasfocus=!0,f.c.hasFocus=f.c.hasfocus,f.m.wa.hasFocus="hasfocus",f.c.html={init:function(){return{controlsDescendantBindings:!0}},update:function(b,Z){f.a.fc(b,Z())}},function(){function b(Z,E,X){f.c[Z]={init:function(F,N,O,U,Y){var k,H,K={},te,z,j;if(E){U=O.get("as");var ee=O.get("noChildContext");j=!(U&&ee),K={as:U,noChildContext:ee,exportDependencies:j}}return z=(te=O.get("completeOn")=="render")||O.has(f.i.pa),f.o(function(){var pe=f.a.f(N()),_e=!X!=!pe,ae=!H,ye;(j||_e!==k)&&(z&&(Y=f.i.Cb(F,Y)),_e&&((!E||j)&&(K.dataDependency=f.S.o()),ye=E?Y.createChildContext(typeof pe=="function"?pe:N,K):f.S.qa()?Y.extend(null,K):Y),ae&&f.S.qa()&&(H=f.a.Ca(f.h.childNodes(F),!0)),_e?(ae||f.h.va(F,f.a.Ca(H)),f.Oa(ye,F)):(f.h.Ea(F),te||f.i.ma(F,f.i.H)),k=_e)},null,{l:F}),{controlsDescendantBindings:!0}}},f.m.Ra[Z]=!1,f.h.ea[Z]=!0}b("if"),b("ifnot",!1,!0),b("with",!0)}(),f.c.let={init:function(b,Z,E,X,F){return Z=F.extend(Z),f.Oa(Z,b),{controlsDescendantBindings:!0}}},f.h.ea.let=!0;var A={};f.c.options={init:function(b){if(f.a.R(b)!=="select")throw Error("options binding applies only to SELECT elements");for(;0<b.length;)b.remove(0);return{controlsDescendantBindings:!0}},update:function(b,Z,E){function X(){return f.a.jb(b.options,function(ee){return ee.selected})}function F(ee,pe,_e){var ae=typeof pe;return ae=="function"?pe(ee):ae=="string"?ee[pe]:_e}function N(ee,pe){if(z&&k)f.i.ma(b,f.i.H);else if(te.length){var _e=0<=f.a.A(te,f.w.M(pe[0]));f.a.Zc(pe[0],_e),z&&!_e&&f.u.G(f.a.Fb,null,[b,"change"])}}var O=b.multiple,U=b.length!=0&&O?b.scrollTop:null,Y=f.a.f(Z()),k=E.get("valueAllowUnset")&&E.has("value"),H=E.get("optionsIncludeDestroyed");Z={};var K,te=[];k||(O?te=f.a.Mb(X(),f.w.M):0<=b.selectedIndex&&te.push(f.w.M(b.options[b.selectedIndex]))),Y&&(typeof Y.length>"u"&&(Y=[Y]),K=f.a.jb(Y,function(ee){return H||ee===e||ee===null||!f.a.f(ee._destroy)}),E.has("optionsCaption")&&(Y=f.a.f(E.get("optionsCaption")),Y!==null&&Y!==e&&K.unshift(A)));var z=!1;if(Z.beforeRemove=function(ee){b.removeChild(ee)},Y=N,E.has("optionsAfterRender")&&typeof E.get("optionsAfterRender")=="function"&&(Y=function(ee,pe){N(0,pe),f.u.G(E.get("optionsAfterRender"),null,[pe[0],ee!==A?ee:e])}),f.a.ec(b,K,function(ee,pe,_e){return _e.length&&(te=!k&&_e[0].selected?[f.w.M(_e[0])]:[],z=!0),pe=b.ownerDocument.createElement("option"),ee===A?(f.a.Bb(pe,E.get("optionsCaption")),f.w.cb(pe,e)):(_e=F(ee,E.get("optionsValue"),ee),f.w.cb(pe,f.a.f(_e)),ee=F(ee,E.get("optionsText"),_e),f.a.Bb(pe,ee)),[pe]},Z,Y),!k){var j;O?j=te.length&&X().length<te.length:j=te.length&&0<=b.selectedIndex?f.w.M(b.options[b.selectedIndex])!==te[0]:te.length||0<=b.selectedIndex,j&&f.u.G(f.a.Fb,null,[b,"change"])}(k||f.S.Ya())&&f.i.ma(b,f.i.H),f.a.wd(b),U&&20<Math.abs(U-b.scrollTop)&&(b.scrollTop=U)}},f.c.options.$b=f.a.g.Z(),f.c.selectedOptions={init:function(b,Z,E){function X(){var O=Z(),U=[];f.a.D(b.getElementsByTagName("option"),function(Y){Y.selected&&U.push(f.w.M(Y))}),f.m.eb(O,E,"selectedOptions",U)}function F(){var O=f.a.f(Z()),U=b.scrollTop;O&&typeof O.length=="number"&&f.a.D(b.getElementsByTagName("option"),function(Y){var k=0<=f.a.A(O,f.w.M(Y));Y.selected!=k&&f.a.Zc(Y,k)}),b.scrollTop=U}if(f.a.R(b)!="select")throw Error("selectedOptions binding applies only to SELECT elements");var N;f.i.subscribe(b,f.i.H,function(){N?X():(f.a.B(b,"change",X),N=f.o(F,null,{l:b}))},null,{notifyImmediately:!0})},update:function(){}},f.m.wa.selectedOptions=!0,f.c.style={update:function(b,Z){var E=f.a.f(Z()||{});f.a.P(E,function(X,F){if(F=f.a.f(F),(F===null||F===e||F===!1)&&(F=""),o)o(b).css(X,F);else if(/^--/.test(X))b.style.setProperty(X,F);else{X=X.replace(/-(\w)/g,function(O,U){return U.toUpperCase()});var N=b.style[X];b.style[X]=F,F===N||b.style[X]!=N||isNaN(F)||(b.style[X]=F+"px")}})}},f.c.submit={init:function(b,Z,E,X,F){if(typeof Z()!="function")throw Error("The value for a submit binding must be a function");f.a.B(b,"submit",function(N){var O,U=Z();try{O=U.call(F.$data,b)}finally{O!==!0&&(N.preventDefault?N.preventDefault():N.returnValue=!1)}})}},f.c.text={init:function(){return{controlsDescendantBindings:!0}},update:function(b,Z){f.a.Bb(b,Z())}},f.h.ea.text=!0,function(){if(t&&t.navigator){var b=function(K){if(K)return parseFloat(K[1])},Z=t.navigator.userAgent,E,X,F,N,O;(E=t.opera&&t.opera.version&&parseInt(t.opera.version()))||(O=b(Z.match(/Edge\/([^ ]+)$/)))||b(Z.match(/Chrome\/([^ ]+)/))||(X=b(Z.match(/Version\/([^ ]+) Safari/)))||(F=b(Z.match(/Firefox\/([^ ]+)/)))||(N=f.a.W||b(Z.match(/MSIE ([^ ]+)/)))||(N=b(Z.match(/rv:([^ )]+)/)))}if(8<=N&&10>N)var U=f.a.g.Z(),Y=f.a.g.Z(),k=function(K){var te=this.activeElement;(te=te&&f.a.g.get(te,Y))&&te(K)},H=function(K,te){var z=K.ownerDocument;f.a.g.get(z,U)||(f.a.g.set(z,U,!0),f.a.B(z,"selectionchange",k)),f.a.g.set(K,Y,te)};f.c.textInput={init:function(K,te,z){function j(we,ve){f.a.B(K,we,ve)}function ee(){var we=f.a.f(te());(we===null||we===e)&&(we=""),Se!==e&&we===Se?f.a.setTimeout(ee,4):K.value!==we&&(Ie=!0,K.value=we,Ie=!1,ae=K.value)}function pe(){ye||(Se=K.value,ye=f.a.setTimeout(_e,4))}function _e(){clearTimeout(ye),Se=ye=e;var we=K.value;ae!==we&&(ae=we,f.m.eb(te(),z,"textInput",we))}var ae=K.value,ye,Se,Ee=f.a.W==9?pe:_e,Ie=!1;N&&j("keypress",_e),11>N&&j("propertychange",function(we){Ie||we.propertyName!=="value"||Ee(we)}),N==8&&(j("keyup",_e),j("keydown",_e)),H&&(H(K,Ee),j("dragend",pe)),(!N||9<=N)&&j("input",Ee),5>X&&f.a.R(K)==="textarea"?(j("keydown",pe),j("paste",pe),j("cut",pe)):11>E?j("keydown",pe):4>F?(j("DOMAutoComplete",_e),j("dragdrop",_e),j("drop",_e)):O&&K.type==="number"&&j("keydown",pe),j("change",_e),j("blur",_e),f.o(ee,null,{l:K})}},f.m.wa.textInput=!0,f.c.textinput={preprocess:function(K,te,z){z("textInput",K)}}}(),f.c.uniqueName={init:function(b,Z){if(Z()){var E="ko_unique_"+ ++f.c.uniqueName.rd;f.a.Yc(b,E)}}},f.c.uniqueName.rd=0,f.c.using={init:function(b,Z,E,X,F){var N;return E.has("as")&&(N={as:E.get("as"),noChildContext:E.get("noChildContext")}),Z=F.createChildContext(Z,N),f.Oa(Z,b),{controlsDescendantBindings:!0}}},f.h.ea.using=!0,f.c.value={init:function(b,Z,E){var X=f.a.R(b),F=X=="input";if(!F||b.type!="checkbox"&&b.type!="radio"){var N=[],O=E.get("valueUpdate"),U=!1,Y=null;O&&(typeof O=="string"?N=[O]:N=f.a.wc(O),f.a.Pa(N,"change"));var k=function(){Y=null,U=!1;var te=Z(),z=f.w.M(b);f.m.eb(te,E,"value",z)};!f.a.W||!F||b.type!="text"||b.autocomplete=="off"||b.form&&b.form.autocomplete=="off"||f.a.A(N,"propertychange")!=-1||(f.a.B(b,"propertychange",function(){U=!0}),f.a.B(b,"focus",function(){U=!1}),f.a.B(b,"blur",function(){U&&k()})),f.a.D(N,function(te){var z=k;f.a.Ud(te,"after")&&(z=function(){Y=f.w.M(b),f.a.setTimeout(k,0)},te=te.substring(5)),f.a.B(b,te,z)});var H;if(H=F&&b.type=="file"?function(){var te=f.a.f(Z());te===null||te===e||te===""?b.value="":f.u.G(k)}:function(){var te=f.a.f(Z()),z=f.w.M(b);Y!==null&&te===Y?f.a.setTimeout(H,0):(te!==z||z===e)&&(X==="select"?(z=E.get("valueAllowUnset"),f.w.cb(b,te,z),z||te===f.w.M(b)||f.u.G(k)):f.w.cb(b,te))},X==="select"){var K;f.i.subscribe(b,f.i.H,function(){K?E.get("valueAllowUnset")?H():k():(f.a.B(b,"change",k),K=f.o(H,null,{l:b}))},null,{notifyImmediately:!0})}else f.a.B(b,"change",k),f.o(H,null,{l:b})}else f.ib(b,{checkedValue:Z})},update:function(){}},f.m.wa.value=!0,f.c.visible={update:function(b,Z){var E=f.a.f(Z()),X=b.style.display!="none";E&&!X?b.style.display="":!E&&X&&(b.style.display="none")}},f.c.hidden={update:function(b,Z){f.c.visible.update(b,function(){return!f.a.f(Z())})}},function(b){f.c[b]={init:function(Z,E,X,F,N){return f.c.event.init.call(this,Z,function(){var O={};return O[b]=E(),O},X,F,N)}}}("click"),f.ca=function(){},f.ca.prototype.renderTemplateSource=function(){throw Error("Override renderTemplateSource")},f.ca.prototype.createJavaScriptEvaluatorBlock=function(){throw Error("Override createJavaScriptEvaluatorBlock")},f.ca.prototype.makeTemplateSource=function(b,Z){if(typeof b=="string"){Z=Z||n;var E=Z.getElementById(b);if(!E)throw Error("Cannot find template with ID "+b);return new f.C.F(E)}if(b.nodeType==1||b.nodeType==8)return new f.C.ia(b);throw Error("Unknown template type: "+b)},f.ca.prototype.renderTemplate=function(b,Z,E,X){return b=this.makeTemplateSource(b,X),this.renderTemplateSource(b,Z,E,X)},f.ca.prototype.isTemplateRewritten=function(b,Z){return this.allowTemplateRewriting===!1?!0:this.makeTemplateSource(b,Z).data("isRewritten")},f.ca.prototype.rewriteTemplate=function(b,Z,E){b=this.makeTemplateSource(b,E),Z=Z(b.text()),b.text(Z),b.data("isRewritten",!0)},f.b("templateEngine",f.ca),f.kc=function(){function b(X,F,N,O){X=f.m.ac(X);for(var U=f.m.Ra,Y=0;Y<X.length;Y++){var k=X[Y].key;if(Object.prototype.hasOwnProperty.call(U,k)){var H=U[k];if(typeof H=="function"){if(k=H(X[Y].value))throw Error(k)}else if(!H)throw Error("This template engine does not support the '"+k+"' binding within its templates")}}return N="ko.__tr_ambtns(function($context,$element){return(function(){return{ "+f.m.vb(X,{valueAccessors:!0})+" } })()},'"+N.toLowerCase()+"')",O.createJavaScriptEvaluatorBlock(N)+F}var Z=/(<([a-z]+\d*)(?:\s+(?!data-bind\s*=\s*)[a-z0-9\-]+(?:=(?:\"[^\"]*\"|\'[^\']*\'|[^>]*))?)*\s+)data-bind\s*=\s*(["'])([\s\S]*?)\3/gi,E=/\x3c!--\s*ko\b\s*([\s\S]*?)\s*--\x3e/g;return{xd:function(X,F,N){F.isTemplateRewritten(X,N)||F.rewriteTemplate(X,function(O){return f.kc.Ld(O,F)},N)},Ld:function(X,F){return X.replace(Z,function(N,O,U,Y,k){return b(k,O,U,F)}).replace(E,function(N,O){return b(O,"<!-- ko -->","#comment",F)})},md:function(X,F){return f.aa.Xb(function(N,O){var U=N.nextSibling;U&&U.nodeName.toLowerCase()===F&&f.ib(U,X,O)})}}}(),f.b("__tr_ambtns",f.kc.md),function(){f.C={},f.C.F=function(E){if(this.F=E){var X=f.a.R(E);this.ab=X==="script"?1:X==="textarea"?2:X=="template"&&E.content&&E.content.nodeType===11?3:4}},f.C.F.prototype.text=function(){var E=this.ab===1?"text":this.ab===2?"value":"innerHTML";if(arguments.length==0)return this.F[E];var X=arguments[0];E==="innerHTML"?f.a.fc(this.F,X):this.F[E]=X};var b=f.a.g.Z()+"_";f.C.F.prototype.data=function(E){if(arguments.length===1)return f.a.g.get(this.F,b+E);f.a.g.set(this.F,b+E,arguments[1])};var Z=f.a.g.Z();f.C.F.prototype.nodes=function(){var E=this.F;if(arguments.length==0){var X=f.a.g.get(E,Z)||{},F=X.lb||(this.ab===3?E.content:this.ab===4?E:e);if(!F||X.jd){var N=this.text();N&&N!==X.bb&&(F=f.a.Md(N,E.ownerDocument),f.a.g.set(E,Z,{lb:F,bb:N,jd:!0}))}return F}X=arguments[0],this.ab!==e&&this.text(""),f.a.g.set(E,Z,{lb:X})},f.C.ia=function(E){this.F=E},f.C.ia.prototype=new f.C.F,f.C.ia.prototype.constructor=f.C.ia,f.C.ia.prototype.text=function(){if(arguments.length==0){var E=f.a.g.get(this.F,Z)||{};return E.bb===e&&E.lb&&(E.bb=E.lb.innerHTML),E.bb}f.a.g.set(this.F,Z,{bb:arguments[0]})},f.b("templateSources",f.C),f.b("templateSources.domElement",f.C.F),f.b("templateSources.anonymousTemplate",f.C.ia)}(),function(){function b(Y,k,H){var K;for(k=f.h.nextSibling(k);Y&&(K=Y)!==k;)Y=f.h.nextSibling(K),H(K,Y)}function Z(Y,k){if(Y.length){var H=Y[0],K=Y[Y.length-1],te=H.parentNode,z=f.ga.instance,j=z.preprocessNode;if(j){if(b(H,K,function(ee,pe){var _e=ee.previousSibling,ae=j.call(z,ee);ae&&(ee===H&&(H=ae[0]||pe),ee===K&&(K=ae[ae.length-1]||_e))}),Y.length=0,!H)return;H===K?Y.push(H):(Y.push(H,K),f.a.Ua(Y,te))}b(H,K,function(ee){ee.nodeType!==1&&ee.nodeType!==8||f.vc(k,ee)}),b(H,K,function(ee){ee.nodeType!==1&&ee.nodeType!==8||f.aa.cd(ee,[k])}),f.a.Ua(Y,te)}}function E(Y){return Y.nodeType?Y:0<Y.length?Y[0]:null}function X(Y,k,H,K,te){te=te||{};var z=(Y&&E(Y)||H||{}).ownerDocument,j=te.templateEngine||N;if(f.kc.xd(H,j,z),H=j.renderTemplate(H,K,te,z),typeof H.length!="number"||0<H.length&&typeof H[0].nodeType!="number")throw Error("Template engine must return an array of DOM nodes");switch(z=!1,k){case"replaceChildren":f.h.va(Y,H),z=!0;break;case"replaceNode":f.a.Xc(Y,H),z=!0;break;case"ignoreTargetNode":break;default:throw Error("Unknown renderMode: "+k)}return z&&(Z(H,K),te.afterRender&&f.u.G(te.afterRender,null,[H,K[te.as||"$data"]]),k=="replaceChildren"&&f.i.ma(Y,f.i.H)),H}function F(Y,k,H){return f.O(Y)?Y():typeof Y=="function"?Y(k,H):Y}var N;f.gc=function(Y){if(Y!=e&&!(Y instanceof f.ca))throw Error("templateEngine must inherit from ko.templateEngine");N=Y},f.dc=function(Y,k,H,K,te){if(H=H||{},(H.templateEngine||N)==e)throw Error("Set a template engine before calling renderTemplate");if(te=te||"replaceChildren",K){var z=E(K);return f.$(function(){var ee=k&&k instanceof f.fa?k:new f.fa(k,null,null,null,{exportDependencies:!0}),j=F(Y,ee.$data,ee),ee=X(K,te,j,ee,H);te=="replaceNode"&&(K=ee,z=E(K))},null,{Sa:function(){return!z||!f.a.Sb(z)},l:z&&te=="replaceNode"?z.parentNode:z})}return f.aa.Xb(function(j){f.dc(Y,k,H,j,"replaceNode")})},f.Qd=function(Y,k,H,K,te){function z(Se,Ee){f.u.G(f.a.ec,null,[K,Se,ee,H,j,Ee]),f.i.ma(K,f.i.H)}function j(Se,Ee){Z(Ee,pe),H.afterRender&&H.afterRender(Ee,Se),pe=null}function ee(Se,Ee){pe=te.createChildContext(Se,{as:_e,noChildContext:H.noChildContext,extend:function(we){we.$index=Ee,_e&&(we[_e+"Index"]=Ee)}});var Ie=F(Y,Se,pe);return X(K,"ignoreTargetNode",Ie,pe,H)}var pe,_e=H.as,ae=H.includeDestroyed===!1||f.options.foreachHidesDestroyed&&!H.includeDestroyed;if(ae||H.beforeRemove||!f.Pc(k))return f.$(function(){var Se=f.a.f(k)||[];typeof Se.length>"u"&&(Se=[Se]),ae&&(Se=f.a.jb(Se,function(Ee){return Ee===e||Ee===null||!f.a.f(Ee._destroy)})),z(Se)},null,{l:K});z(k.v());var ye=k.subscribe(function(Se){z(k(),Se)},null,"arrayChange");return ye.l(K),ye};var O=f.a.g.Z(),U=f.a.g.Z();f.c.template={init:function(Y,k){var H=f.a.f(k());if(typeof H=="string"||"name"in H)f.h.Ea(Y);else if("nodes"in H){if(H=H.nodes||[],f.O(H))throw Error('The "nodes" option must be a plain, non-observable array.');var K=H[0]&&H[0].parentNode;K&&f.a.g.get(K,U)||(K=f.a.Yb(H),f.a.g.set(K,U,!0)),new f.C.ia(Y).nodes(K)}else if(H=f.h.childNodes(Y),0<H.length)K=f.a.Yb(H),new f.C.ia(Y).nodes(K);else throw Error("Anonymous template defined, but no template content was provided");return{controlsDescendantBindings:!0}},update:function(Y,k,H,K,te){var z=k();k=f.a.f(z),H=!0,K=null,typeof k=="string"?k={}:(z="name"in k?k.name:Y,"if"in k&&(H=f.a.f(k.if)),H&&"ifnot"in k&&(H=!f.a.f(k.ifnot)),H&&!z&&(H=!1)),"foreach"in k?K=f.Qd(z,H&&k.foreach||[],k,Y,te):H?(H=te,"data"in k&&(H=te.createChildContext(k.data,{as:k.as,noChildContext:k.noChildContext,exportDependencies:!0})),K=f.dc(z,H,k,Y)):f.h.Ea(Y),te=K,(k=f.a.g.get(Y,O))&&typeof k.s=="function"&&k.s(),f.a.g.set(Y,O,!te||te.ja&&!te.ja()?e:te)}},f.m.Ra.template=function(Y){return Y=f.m.ac(Y),Y.length==1&&Y[0].unknown||f.m.Id(Y,"name")?null:"This template engine does not support anonymous templates nested within its templates"},f.h.ea.template=!0}(),f.b("setTemplateEngine",f.gc),f.b("renderTemplate",f.dc),f.a.Kc=function(b,Z,E){if(b.length&&Z.length){var X,F,N,O,U;for(X=F=0;(!E||X<E)&&(O=b[F]);++F){for(N=0;U=Z[N];++N)if(O.value===U.value){O.moved=U.index,U.moved=O.index,Z.splice(N,1),X=N=0;break}X+=N}}},f.a.Pb=function(){function b(Z,E,X,F,N){var O=Math.min,U=Math.max,Y=[],k,H=Z.length,K,te=E.length,z=te-H||1,j=H+te+1,ee,pe,_e;for(k=0;k<=H;k++)for(pe=ee,Y.push(ee=[]),_e=O(te,k+z),K=U(0,k-1);K<=_e;K++)ee[K]=K?k?Z[k-1]===E[K-1]?pe[K-1]:O(pe[K]||j,ee[K-1]||j)+1:K+1:k+1;for(O=[],U=[],z=[],k=H,K=te;k||K;)te=Y[k][K]-1,K&&te===Y[k][K-1]?U.push(O[O.length]={status:X,value:E[--K],index:K}):k&&te===Y[k-1][K]?z.push(O[O.length]={status:F,value:Z[--k],index:k}):(--K,--k,N.sparse||O.push({status:"retained",value:E[K]}));return f.a.Kc(z,U,!N.dontLimitMoves&&10*H),O.reverse()}return function(Z,E,X){return X=typeof X=="boolean"?{dontLimitMoves:X}:X||{},Z=Z||[],E=E||[],Z.length<E.length?b(Z,E,"added","deleted",X):b(E,Z,"deleted","added",X)}}(),f.b("utils.compareArrays",f.a.Pb),function(){function b(X,F,N,O,U){var Y=[],k=f.$(function(){var H=F(N,U,f.a.Ua(Y,X))||[];0<Y.length&&(f.a.Xc(Y,H),O&&f.u.G(O,null,[N,H,U])),Y.length=0,f.a.Nb(Y,H)},null,{l:X,Sa:function(){return!f.a.kd(Y)}});return{Y,$:k.ja()?k:e}}var Z=f.a.g.Z(),E=f.a.g.Z();f.a.ec=function(X,F,N,O,U,Y){function k(bt){Ie={Aa:bt,pb:f.ta(pe++)},j.push(Ie),z||Ee.push(Ie)}function H(bt){Ie=te[bt],pe!==Ie.pb.v()&&Se.push(Ie),Ie.pb(pe++),f.a.Ua(Ie.Y,X),j.push(Ie)}function K(bt,En){if(bt)for(var sn=0,Ce=En.length;sn<Ce;sn++)f.a.D(En[sn].Y,function(Le){bt(Le,sn,En[sn].Aa)})}F=F||[],typeof F.length>"u"&&(F=[F]),O=O||{};var te=f.a.g.get(X,Z),z=!te,j=[],ee=0,pe=0,_e=[],ae=[],ye=[],Se=[],Ee=[],Ie,we=0;if(z)f.a.D(F,k);else{if(!Y||te&&te._countWaitingForRemove){var ve=f.a.Mb(te,function(bt){return bt.Aa});Y=f.a.Pb(ve,F,{dontLimitMoves:O.dontLimitMoves,sparse:!0})}for(var ve=0,at,Je,pt;at=Y[ve];ve++)switch(Je=at.moved,pt=at.index,at.status){case"deleted":for(;ee<pt;)H(ee++);Je===e&&(Ie=te[ee],Ie.$&&(Ie.$.s(),Ie.$=e),f.a.Ua(Ie.Y,X).length&&(O.beforeRemove&&(j.push(Ie),we++,Ie.Aa===E?Ie=null:ye.push(Ie)),Ie&&_e.push.apply(_e,Ie.Y))),ee++;break;case"added":for(;pe<pt;)H(ee++);Je!==e?(ae.push(j.length),H(Je)):k(at.value)}for(;pe<F.length;)H(ee++);j._countWaitingForRemove=we}f.a.g.set(X,Z,j),K(O.beforeMove,Se),f.a.D(_e,O.beforeRemove?f.oa:f.removeNode);var Qe,_t,ht;try{ht=X.ownerDocument.activeElement}catch{}if(ae.length)for(;(ve=ae.shift())!=e;){for(Ie=j[ve],Qe=e;ve;)if((_t=j[--ve].Y)&&_t.length){Qe=_t[_t.length-1];break}for(F=0;ee=Ie.Y[F];Qe=ee,F++)f.h.Wb(X,ee,Qe)}for(ve=0;Ie=j[ve];ve++){for(Ie.Y||f.a.extend(Ie,b(X,N,Ie.Aa,U,Ie.pb)),F=0;ee=Ie.Y[F];Qe=ee,F++)f.h.Wb(X,ee,Qe);!Ie.Ed&&U&&(U(Ie.Aa,Ie.Y,Ie.pb),Ie.Ed=!0,Qe=Ie.Y[Ie.Y.length-1])}for(ht&&X.ownerDocument.activeElement!=ht&&ht.focus(),K(O.beforeRemove,ye),ve=0;ve<ye.length;++ve)ye[ve].Aa=E;K(O.afterMove,Se),K(O.afterAdd,Ee)}}(),f.b("utils.setDomNodeChildrenFromArrayMapping",f.a.ec),f.ba=function(){this.allowTemplateRewriting=!1},f.ba.prototype=new f.ca,f.ba.prototype.constructor=f.ba,f.ba.prototype.renderTemplateSource=function(b,Z,E,X){return(Z=!(9>f.a.W)&&b.nodes?b.nodes():null)?f.a.la(Z.cloneNode(!0).childNodes):(b=b.text(),f.a.ua(b,X))},f.ba.Ma=new f.ba,f.gc(f.ba.Ma),f.b("nativeTemplateEngine",f.ba),function(){f.$a=function(){var Z=this.Hd=function(){if(!o||!o.tmpl)return 0;try{if(0<=o.tmpl.tag.tmpl.open.toString().indexOf("__"))return 2}catch{}return 1}();this.renderTemplateSource=function(E,X,F,N){if(N=N||n,F=F||{},2>Z)throw Error("Your version of jQuery.tmpl is too old. Please upgrade to jQuery.tmpl 1.0.0pre or later.");var O=E.data("precompiled");return O||(O=E.text()||"",O=o.template(null,"{{ko_with $item.koBindingContext}}"+O+"{{/ko_with}}"),E.data("precompiled",O)),E=[X.$data],X=o.extend({koBindingContext:X},F.templateOptions),X=o.tmpl(O,E,X),X.appendTo(N.createElement("div")),o.fragments={},X},this.createJavaScriptEvaluatorBlock=function(E){return"{{ko_code ((function() { return "+E+" })()) }}"},this.addTemplate=function(E,X){n.write("<script type='text/html' id='"+E+"'>"+X+"<\/script>")},0<Z&&(o.tmpl.tag.ko_code={open:"__.push($1 || '');"},o.tmpl.tag.ko_with={open:"with($1) {",close:"} "})},f.$a.prototype=new f.ca,f.$a.prototype.constructor=f.$a;var b=new f.$a;0<b.Hd&&f.gc(b),f.b("jqueryTmplTemplateEngine",f.$a)}()})})()})()})();var m1t=ko;typeof window<"u"?(ko=window.ko,typeof p9<"u"?window.ko=p9:delete window.ko):(ko=global.ko,typeof p9<"u"?global.ko=p9:delete global.ko);var BS=m1t;var nZo=T(S(),1);/** * @license * Knockout ES5 plugin - https://github.com/SteveSanderson/knockout-es5 * Copyright (c) Steve Sanderson * MIT license */var iq="__knockoutObservables",oq="__knockoutSubscribable";function ECe(e,t){if(!e)throw new Error("When calling ko.track, you must pass an object as the first parameter.");var n=this,i=ICe(e,!0);return t=t||Object.getOwnPropertyNames(e),t.forEach(function(o){if(!(o===iq||o===oq)&&!(o in i)){var r=e[o],s=r instanceof Array,a=n.isObservable(r)?r:s?n.observableArray(r):n.observable(r);Object.defineProperty(e,o,{configurable:!0,enumerable:!0,get:a,set:n.isWriteableObservable(a)?a:void 0}),i[o]=a,s&&f1t(n,a)}}),e}function ICe(e,t){var n=e[iq];return!n&&t&&(n={},Object.defineProperty(e,iq,{value:n})),n}function h1t(e,t,n){var i=this,o={owner:e,deferEvaluation:!0};if(typeof n=="function")o.read=n;else{if("value"in n)throw new Error('For ko.defineProperty, you must not specify a "value" for the property. You must provide a "get" function.');if(typeof n.get!="function")throw new Error('For ko.defineProperty, the third parameter must be either an evaluator function, or an options object containing a function called "get".');o.read=n.get,o.write=n.set}return e[t]=i.computed(o),ECe.call(i,e,[t]),e}function f1t(e,t){var n=null;e.computed(function(){n&&(n.dispose(),n=null);var i=t();i instanceof Array&&(n=p1t(e,t,i))})}function p1t(e,t,n){var i=b1t(e,n);return i.subscribe(t)}function b1t(e,t){var n=t[oq];if(!n){n=new e.subscribable,Object.defineProperty(t,oq,{value:n});var i={};g1t(t,n,i),y1t(e,t,n,i)}return n}function g1t(e,t,n){["pop","push","reverse","shift","sort","splice","unshift"].forEach(function(i){var o=e[i];e[i]=function(){var r=o.apply(this,arguments);return n.pause!==!0&&t.notifySubscribers(this),r}})}function y1t(e,t,n,i){["remove","removeAll","destroy","destroyAll","replace"].forEach(function(o){Object.defineProperty(t,o,{enumerable:!1,value:function(){var r;i.pause=!0;try{r=e.observableArray.fn[o].apply(e.observableArray(t),arguments)}finally{i.pause=!1}return n.notifySubscribers(t),r}})})}function XCe(e,t){if(!e)return null;var n=ICe(e,!1);return n&&n[t]||null}function x1t(e,t){var n=XCe(e,t);n&&n.valueHasMutated()}function _1t(e){e.track=ECe,e.getObservable=XCe,e.valueHasMutated=x1t,e.defineProperty=h1t}var b9={attachToKo:_1t};var oZo=T(S(),1),WCe="http://www.w3.org/2000/svg",PCe="cesium-svgPath-svg",T1t={register:function(e){e.bindingHandlers.cesiumSvgPath={init:function(t,n){let i=document.createElementNS(WCe,"svg:svg");i.setAttribute("class",PCe);let o=document.createElementNS(WCe,"path");return i.appendChild(o),e.virtualElements.setDomNodeChildren(t,[i]),e.computed({read:function(){let r=e.unwrap(n());o.setAttribute("d",e.unwrap(r.path));let s=e.unwrap(r.width),a=e.unwrap(r.height);i.setAttribute("width",s),i.setAttribute("height",a),i.setAttribute("viewBox",`0 0 ${s} ${a}`),r.css&&i.setAttribute("class",`${PCe} ${e.unwrap(r.css)}`)},disposeWhenNodeIsRemoved:t}),{controlsDescendantBindings:!0}}},e.virtualElements.allowedBindings.cesiumSvgPath=!0}},g9=T1t;b9.attachToKo(BS);g9.register(BS);var Te=BS;function y9(e){l(e)||(e=new Th),this._clock=e,this._eventHelper=new fr,this._eventHelper.add(e.onTick,this.synchronize,this),this.systemTime=Te.observable(q.now()),this.systemTime.equalityComparer=q.equals,this.startTime=Te.observable(e.startTime),this.startTime.equalityComparer=q.equals,this.startTime.subscribe(function(t){e.startTime=t,this.synchronize()},this),this.stopTime=Te.observable(e.stopTime),this.stopTime.equalityComparer=q.equals,this.stopTime.subscribe(function(t){e.stopTime=t,this.synchronize()},this),this.currentTime=Te.observable(e.currentTime),this.currentTime.equalityComparer=q.equals,this.currentTime.subscribe(function(t){e.currentTime=t,this.synchronize()},this),this.multiplier=Te.observable(e.multiplier),this.multiplier.subscribe(function(t){e.multiplier=t,this.synchronize()},this),this.clockStep=Te.observable(e.clockStep),this.clockStep.subscribe(function(t){e.clockStep=t,this.synchronize()},this),this.clockRange=Te.observable(e.clockRange),this.clockRange.subscribe(function(t){e.clockRange=t,this.synchronize()},this),this.canAnimate=Te.observable(e.canAnimate),this.canAnimate.subscribe(function(t){e.canAnimate=t,this.synchronize()},this),this.shouldAnimate=Te.observable(e.shouldAnimate),this.shouldAnimate.subscribe(function(t){e.shouldAnimate=t,this.synchronize()},this),Te.track(this,["systemTime","startTime","stopTime","currentTime","multiplier","clockStep","clockRange","canAnimate","shouldAnimate"])}Object.defineProperties(y9.prototype,{clock:{get:function(){return this._clock}}});y9.prototype.synchronize=function(){let e=this._clock;this.systemTime=q.now(),this.startTime=e.startTime,this.stopTime=e.stopTime,this.currentTime=e.currentTime,this.multiplier=e.multiplier,this.clockStep=e.clockStep,this.clockRange=e.clockRange,this.canAnimate=e.canAnimate,this.shouldAnimate=e.shouldAnimate};y9.prototype.isDestroyed=function(){return!1};y9.prototype.destroy=function(){this._eventHelper.removeAll(),me(this)};var x9=y9;var bZo=T(S(),1);function S1t(){this.canExecute=void 0,this.beforeExecute=void 0,this.afterExecute=void 0,fe.throwInstantiationError()}var rq=S1t;var SZo=T(S(),1);function C1t(e,t){t=y(t,!0);let n=new be,i=new be;function o(){let r={args:arguments,cancel:!1},s;return n.raiseEvent(r),r.cancel||(s=e.apply(null,arguments),i.raiseEvent(s)),s}return o.canExecute=t,Te.track(o,["canExecute"]),Object.defineProperties(o,{beforeExecute:{value:n},afterExecute:{value:i}}),o}var Ln=C1t;var RZo=T(S(),1);var _9={};_9.createCheckbox=function(e,t,n){let i=document.createElement("div"),o=document.createElement("label"),r=document.createElement("input");r.type="checkbox";let s=`checked: ${t}`;return l(n)&&(s+=`, enable: ${n}`),r.setAttribute("data-bind",s),o.appendChild(r),o.appendChild(document.createTextNode(e)),i.appendChild(o),i};_9.createSection=function(e,t,n,i){let o=document.createElement("div");o.className="cesium-cesiumInspector-section",o.setAttribute("data-bind",`css: { "cesium-cesiumInspector-section-collapsed": !${n} }`),e.appendChild(o);let r=document.createElement("h3");r.className="cesium-cesiumInspector-sectionHeader",r.appendChild(document.createTextNode(t)),r.setAttribute("data-bind",`click: ${i}`),o.appendChild(r);let s=document.createElement("div");return s.className="cesium-cesiumInspector-sectionContent",o.appendChild(s),s};_9.createRangeInput=function(e,t,n,i,o,r){r=y(r,t);let s=document.createElement("input");s.setAttribute("data-bind",`value: ${r}`),s.type="number";let a=document.createElement("input");a.type="range",a.min=n,a.max=i,a.step=y(o,"any"),a.setAttribute("data-bind",`valueUpdate: "input", value: ${t}`);let c=document.createElement("div");c.appendChild(a);let d=document.createElement("div");return d.className="cesium-cesiumInspector-slider",d.appendChild(document.createTextNode(e)),d.appendChild(s),d.appendChild(c),d};_9.createButton=function(e,t,n){let i=document.createElement("button");i.type="button",i.textContent=e,i.className="cesium-cesiumInspector-pickButton";let o=`click: ${t}`;return l(n)&&(o+=`, css: {"cesium-cesiumInspector-pickButtonHighlight" : ${n}}`),i.setAttribute("data-bind",o),i};var qa=_9;var EZo=T(S(),1);function V1t(e,t,n,i,o){return n.call(i,e[t]),Te.getObservable(e,t).subscribe(n,i,o)}var Ga=V1t;var wZo=T(S(),1);function vCe(e,t){this._command=e,t=y(t,y.EMPTY_OBJECT),this.toggled=y(t.toggled,!1),this.tooltip=y(t.tooltip,""),Te.track(this,["toggled","tooltip"])}Object.defineProperties(vCe.prototype,{command:{get:function(){return this._command}}});var nx=vCe;var zZo=T(S(),1);var kZo=T(S(),1);function L1t(e){return function(t){let n=e._scene.pick(t.position);l(n)&&n.primitive instanceof xs&&(e.tileset=n.primitive),e.pickActive=!1}}function FCe(e,t){t?e._eventHandler.setInputAction(function(n){let i=e._scene.pick(n.endPosition);l(i)&&i.primitive instanceof xs&&(e.tileset=i.primitive)},Sn.MOUSE_MOVE):(e._eventHandler.removeInputAction(Sn.MOUSE_MOVE),e.picking=e.picking)}var R1t={maximumFractionDigits:3};function T9(e){let t=e/1048576;return t<1?t.toLocaleString(void 0,R1t):Math.round(t).toLocaleString()}function S9(e,t){if(!l(e))return"";let n=t?e._statisticsPerPass[Ao.PICK]:e._statisticsPerPass[Ao.RENDER],i='<ul class="cesium-cesiumInspector-statistics">';return i+=`<li><strong>Visited: </strong>${n.visited.toLocaleString()}</li><li><strong>Selected: </strong>${n.selected.toLocaleString()}</li><li><strong>Commands: </strong>${n.numberOfCommands.toLocaleString()}</li>`,i+="</ul>",t||(i+='<ul class="cesium-cesiumInspector-statistics">',i+=`<li><strong>Requests: </strong>${n.numberOfPendingRequests.toLocaleString()}</li><li><strong>Attempted: </strong>${n.numberOfAttemptedRequests.toLocaleString()}</li><li><strong>Processing: </strong>${n.numberOfTilesProcessing.toLocaleString()}</li><li><strong>Content Ready: </strong>${n.numberOfTilesWithContentReady.toLocaleString()}</li><li><strong>Total: </strong>${n.numberOfTilesTotal.toLocaleString()}</li>`,i+="</ul>",i+='<ul class="cesium-cesiumInspector-statistics">',i+=`<li><strong>Features Selected: </strong>${n.numberOfFeaturesSelected.toLocaleString()}</li><li><strong>Features Loaded: </strong>${n.numberOfFeaturesLoaded.toLocaleString()}</li><li><strong>Points Selected: </strong>${n.numberOfPointsSelected.toLocaleString()}</li><li><strong>Points Loaded: </strong>${n.numberOfPointsLoaded.toLocaleString()}</li><li><strong>Triangles Selected: </strong>${n.numberOfTrianglesSelected.toLocaleString()}</li>`,i+="</ul>",i+='<ul class="cesium-cesiumInspector-statistics">',i+=`<li><strong>Tiles styled: </strong>${n.numberOfTilesStyled.toLocaleString()}</li><li><strong>Features styled: </strong>${n.numberOfFeaturesStyled.toLocaleString()}</li>`,i+="</ul>",i+='<ul class="cesium-cesiumInspector-statistics">',i+=`<li><strong>Children Union Culled: </strong>${n.numberOfTilesCulledWithChildrenUnion.toLocaleString()}</li>`,i+="</ul>",i+='<ul class="cesium-cesiumInspector-statistics">',i+=`<li><strong>Geometry Memory (MB): </strong>${T9(n.geometryByteLength)}</li><li><strong>Texture Memory (MB): </strong>${T9(n.texturesByteLength)}</li><li><strong>Batch Table Memory (MB): </strong>${T9(n.batchTableByteLength)}</li>`,i+="</ul>"),i}function ACe(){let e=Li.statistics;return` <ul class="cesium-cesiumInspector-statistics"> <li><strong>Geometry Memory (MB): </strong>${T9(e.geometryByteLength)}</li> <li><strong>Texture Memory (MB): </strong>${T9(e.texturesByteLength)}</li> </ul> `}var Z1t=[{text:"Highlight",value:Pl.HIGHLIGHT},{text:"Replace",value:Pl.REPLACE},{text:"Mix",value:Pl.MIX}],wCe=new B(1,1,0,.4),G1t=new B,EB=new B;function Ea(e,t){let n=this,i=e.canvas;this._eventHandler=new ou(i),this._scene=e,this._performanceContainer=t,this._canvas=i,this._performanceDisplay=new S0({container:t}),this._statisticsText="",this._pickStatisticsText="",this._resourceCacheStatisticsText="",this._editorError="",this.performance=!1,this.showStatistics=!0,this.showPickStatistics=!0,this.showResourceCacheStatistics=!1,this.inspectorVisible=!0,this.tilesetVisible=!1,this.displayVisible=!1,this.updateVisible=!1,this.loggingVisible=!1,this.styleVisible=!1,this.tileDebugLabelsVisible=!1,this.optimizationVisible=!1,this.styleString="{}",this.hasEnabledWireframe=!1,this._tileset=void 0,this._feature=void 0,this._tile=void 0,Te.track(this,["performance","inspectorVisible","_statisticsText","_pickStatisticsText","_resourceCacheStatisticsText","_editorError","showPickStatistics","showStatistics","showResourceCacheStatistics","tilesetVisible","displayVisible","updateVisible","loggingVisible","styleVisible","optimizationVisible","tileDebugLabelsVisible","styleString","_feature","_tile","_tileset","hasEnabledWireframe"]),this._properties=Te.observable({}),this.properties=[],Te.defineProperty(this,"properties",function(){let k=[],H=n._properties();for(let K in H)H.hasOwnProperty(K)&&k.push(K);return k});let o=Te.observable();Te.defineProperty(this,"dynamicScreenSpaceError",{get:function(){return o()},set:function(k){o(k),l(n._tileset)&&(n._tileset.dynamicScreenSpaceError=k)}}),this.dynamicScreenSpaceError=!1;let r=Te.observable();Te.defineProperty(this,"colorBlendMode",{get:function(){return r()},set:function(k){r(k),l(n._tileset)&&(n._tileset.colorBlendMode=k,n._scene.requestRender())}}),this.colorBlendMode=Pl.HIGHLIGHT;let s=Te.observable(),a=Te.observable();Te.defineProperty(this,"picking",{get:function(){return a()},set:function(k){a(k),k?n._eventHandler.setInputAction(function(H){let K=e.pick(H.endPosition);if(K instanceof Hs?(n.feature=K,n.tile=K.content.tile):l(K)&&l(K.content)?(n.feature=void 0,n.tile=K.content.tile):(n.feature=void 0,n.tile=void 0),!!l(n._tileset)){if(s&&l(K)&&l(K.content)){let te;e.pickPositionSupported&&(te=e.pickPosition(H.endPosition),l(te)&&(n._tileset.debugPickPosition=te)),n._tileset.debugPickedTile=K.content.tile}else n._tileset.debugPickedTile=void 0;n._scene.requestRender()}},Sn.MOUSE_MOVE):(n.feature=void 0,n.tile=void 0,n._eventHandler.removeInputAction(Sn.MOUSE_MOVE))}}),this.picking=!0;let c=Te.observable();Te.defineProperty(this,"colorize",{get:function(){return c()},set:function(k){c(k),l(n._tileset)&&(n._tileset.debugColorizeTiles=k,n._scene.requestRender())}}),this.colorize=!1;let d=Te.observable();Te.defineProperty(this,"wireframe",{get:function(){return d()},set:function(k){d(k),l(n._tileset)&&(n._tileset.debugWireframe=k,n._scene.requestRender())}}),this.wireframe=!1;let u=Te.observable();Te.defineProperty(this,"showBoundingVolumes",{get:function(){return u()},set:function(k){u(k),l(n._tileset)&&(n._tileset.debugShowBoundingVolume=k,n._scene.requestRender())}}),this.showBoundingVolumes=!1;let h=Te.observable();Te.defineProperty(this,"showContentBoundingVolumes",{get:function(){return h()},set:function(k){h(k),l(n._tileset)&&(n._tileset.debugShowContentBoundingVolume=k,n._scene.requestRender())}}),this.showContentBoundingVolumes=!1;let p=Te.observable();Te.defineProperty(this,"showRequestVolumes",{get:function(){return p()},set:function(k){p(k),l(n._tileset)&&(n._tileset.debugShowViewerRequestVolume=k,n._scene.requestRender())}}),this.showRequestVolumes=!1;let g=Te.observable();Te.defineProperty(this,"freezeFrame",{get:function(){return g()},set:function(k){g(k),l(n._tileset)&&(n._tileset.debugFreezeFrame=k,n._scene.debugShowFrustumPlanes=k,n._scene.requestRender())}}),this.freezeFrame=!1,Te.defineProperty(this,"showOnlyPickedTileDebugLabel",{get:function(){return s()},set:function(k){s(k),l(n._tileset)&&(n._tileset.debugPickedTileLabelOnly=k,n._scene.requestRender())}}),this.showOnlyPickedTileDebugLabel=!1;let f=Te.observable();Te.defineProperty(this,"showGeometricError",{get:function(){return f()},set:function(k){f(k),l(n._tileset)&&(n._tileset.debugShowGeometricError=k,n._scene.requestRender())}}),this.showGeometricError=!1;let x=Te.observable();Te.defineProperty(this,"showRenderingStatistics",{get:function(){return x()},set:function(k){x(k),l(n._tileset)&&(n._tileset.debugShowRenderingStatistics=k,n._scene.requestRender())}}),this.showRenderingStatistics=!1;let _=Te.observable();Te.defineProperty(this,"showMemoryUsage",{get:function(){return _()},set:function(k){_(k),l(n._tileset)&&(n._tileset.debugShowMemoryUsage=k,n._scene.requestRender())}}),this.showMemoryUsage=!1;let C=Te.observable();Te.defineProperty(this,"showUrl",{get:function(){return C()},set:function(k){C(k),l(n._tileset)&&(n._tileset.debugShowUrl=k,n._scene.requestRender())}}),this.showUrl=!1;let V=Te.observable();Te.defineProperty(this,"maximumScreenSpaceError",{get:function(){return V()},set:function(k){k=Number(k),isNaN(k)||(V(k),l(n._tileset)&&(n._tileset.maximumScreenSpaceError=k))}}),this.maximumScreenSpaceError=16;let L=Te.observable();Te.defineProperty(this,"dynamicScreenSpaceErrorDensity",{get:function(){return L()},set:function(k){k=Number(k),isNaN(k)||(L(k),l(n._tileset)&&(n._tileset.dynamicScreenSpaceErrorDensity=k))}}),this.dynamicScreenSpaceErrorDensity=2e-4,this.dynamicScreenSpaceErrorDensitySliderValue=void 0,Te.defineProperty(this,"dynamicScreenSpaceErrorDensitySliderValue",{get:function(){return Math.pow(L(),1/6)},set:function(k){let H=Math.pow(k,6);L(H),l(n._tileset)&&(n._tileset.dynamicScreenSpaceErrorDensity=H)}});let R=Te.observable();Te.defineProperty(this,"dynamicScreenSpaceErrorFactor",{get:function(){return R()},set:function(k){k=Number(k),isNaN(k)||(R(k),l(n._tileset)&&(n._tileset.dynamicScreenSpaceErrorFactor=k))}}),this.dynamicScreenSpaceErrorFactor=24;let G=L1t(this),I=Te.observable();Te.defineProperty(this,"pickActive",{get:function(){return I()},set:function(k){I(k),k?n._eventHandler.setInputAction(G,Sn.LEFT_CLICK):n._eventHandler.removeInputAction(Sn.LEFT_CLICK)}});let v=Te.observable();Te.defineProperty(this,"pointCloudShading",{get:function(){return v()},set:function(k){v(k),l(n._tileset)&&(n._tileset.pointCloudShading.attenuation=k)}}),this.pointCloudShading=!1;let P=Te.observable();Te.defineProperty(this,"geometricErrorScale",{get:function(){return P()},set:function(k){k=Number(k),isNaN(k)||(P(k),l(n._tileset)&&(n._tileset.pointCloudShading.geometricErrorScale=k))}}),this.geometricErrorScale=1;let w=Te.observable();Te.defineProperty(this,"maximumAttenuation",{get:function(){return w()},set:function(k){k=Number(k),isNaN(k)||(w(k),l(n._tileset)&&(n._tileset.pointCloudShading.maximumAttenuation=k===0?void 0:k))}}),this.maximumAttenuation=0;let A=Te.observable();Te.defineProperty(this,"baseResolution",{get:function(){return A()},set:function(k){k=Number(k),isNaN(k)||(A(k),l(n._tileset)&&(n._tileset.pointCloudShading.baseResolution=k===0?void 0:k))}}),this.baseResolution=0;let b=Te.observable();Te.defineProperty(this,"eyeDomeLighting",{get:function(){return b()},set:function(k){b(k),l(n._tileset)&&(n._tileset.pointCloudShading.eyeDomeLighting=k)}}),this.eyeDomeLighting=!1;let Z=Te.observable();Te.defineProperty(this,"eyeDomeLightingStrength",{get:function(){return Z()},set:function(k){k=Number(k),isNaN(k)||(Z(k),l(n._tileset)&&(n._tileset.pointCloudShading.eyeDomeLightingStrength=k))}}),this.eyeDomeLightingStrength=1;let E=Te.observable();Te.defineProperty(this,"eyeDomeLightingRadius",{get:function(){return E()},set:function(k){k=Number(k),isNaN(k)||(E(k),l(n._tileset)&&(n._tileset.pointCloudShading.eyeDomeLightingRadius=k))}}),this.eyeDomeLightingRadius=1,this.pickActive=!1;let X=Te.observable();Te.defineProperty(this,"skipLevelOfDetail",{get:function(){return X()},set:function(k){X(k),l(n._tileset)&&(n._tileset.skipLevelOfDetail=k)}}),this.skipLevelOfDetail=!0;let F=Te.observable();Te.defineProperty(this,"skipScreenSpaceErrorFactor",{get:function(){return F()},set:function(k){k=Number(k),isNaN(k)||(F(k),l(n._tileset)&&(n._tileset.skipScreenSpaceErrorFactor=k))}}),this.skipScreenSpaceErrorFactor=16;let N=Te.observable();Te.defineProperty(this,"baseScreenSpaceError",{get:function(){return N()},set:function(k){k=Number(k),isNaN(k)||(N(k),l(n._tileset)&&(n._tileset.baseScreenSpaceError=k))}}),this.baseScreenSpaceError=1024;let O=Te.observable();Te.defineProperty(this,"skipLevels",{get:function(){return O()},set:function(k){k=Number(k),isNaN(k)||(O(k),l(n._tileset)&&(n._tileset.skipLevels=k))}}),this.skipLevels=1;let U=Te.observable();Te.defineProperty(this,"immediatelyLoadDesiredLevelOfDetail",{get:function(){return U()},set:function(k){U(k),l(n._tileset)&&(n._tileset.immediatelyLoadDesiredLevelOfDetail=k)}}),this.immediatelyLoadDesiredLevelOfDetail=!1;let Y=Te.observable();Te.defineProperty(this,"loadSiblings",{get:function(){return Y()},set:function(k){Y(k),l(n._tileset)&&(n._tileset.loadSiblings=k)}}),this.loadSiblings=!1,this._style=void 0,this._shouldStyle=!1,this._definedProperties=["properties","dynamicScreenSpaceError","colorBlendMode","picking","colorize","wireframe","showBoundingVolumes","showContentBoundingVolumes","showRequestVolumes","freezeFrame","maximumScreenSpaceError","dynamicScreenSpaceErrorDensity","baseScreenSpaceError","skipScreenSpaceErrorFactor","skipLevelOfDetail","skipLevels","immediatelyLoadDesiredLevelOfDetail","loadSiblings","dynamicScreenSpaceErrorDensitySliderValue","dynamicScreenSpaceErrorFactor","pickActive","showOnlyPickedTileDebugLabel","showGeometricError","showRenderingStatistics","showMemoryUsage","showUrl","pointCloudShading","geometricErrorScale","maximumAttenuation","baseResolution","eyeDomeLighting","eyeDomeLightingStrength","eyeDomeLightingRadius"],this._removePostRenderEvent=e.postRender.addEventListener(function(){n._update()}),l(this._tileset)||FCe(this,!0)}Object.defineProperties(Ea.prototype,{scene:{get:function(){return this._scene}},performanceContainer:{get:function(){return this._performanceContainer}},statisticsText:{get:function(){return this._statisticsText}},pickStatisticsText:{get:function(){return this._pickStatisticsText}},resourceCacheStatisticsText:{get:function(){return this._resourceCacheStatisticsText}},colorBlendModes:{get:function(){return Z1t}},editorError:{get:function(){return this._editorError}},tileset:{get:function(){return this._tileset},set:function(e){if(this._tileset=e,this._style=void 0,this.styleString="{}",this.feature=void 0,this.tile=void 0,l(e)){this._properties(e.properties);let t=["colorize","wireframe","showBoundingVolumes","showContentBoundingVolumes","showRequestVolumes","freezeFrame","showOnlyPickedTileDebugLabel","showGeometricError","showRenderingStatistics","showMemoryUsage","showUrl"],n=t.length;for(let o=0;o<n;++o){let r=t[o];this[r]=this[r]}this.maximumScreenSpaceError=e.maximumScreenSpaceError,this.dynamicScreenSpaceError=e.dynamicScreenSpaceError,this.dynamicScreenSpaceErrorDensity=e.dynamicScreenSpaceErrorDensity,this.dynamicScreenSpaceErrorFactor=e.dynamicScreenSpaceErrorFactor,this.colorBlendMode=e.colorBlendMode,this.skipLevelOfDetail=e.skipLevelOfDetail,this.skipScreenSpaceErrorFactor=e.skipScreenSpaceErrorFactor,this.baseScreenSpaceError=e.baseScreenSpaceError,this.skipLevels=e.skipLevels,this.immediatelyLoadDesiredLevelOfDetail=e.immediatelyLoadDesiredLevelOfDetail,this.loadSiblings=e.loadSiblings,this.hasEnabledWireframe=e._enableDebugWireframe;let i=e.pointCloudShading;this.pointCloudShading=i.attenuation,this.geometricErrorScale=i.geometricErrorScale,this.maximumAttenuation=i.maximumAttenuation?i.maximumAttenuation:0,this.baseResolution=i.baseResolution?i.baseResolution:0,this.eyeDomeLighting=i.eyeDomeLighting,this.eyeDomeLightingStrength=i.eyeDomeLightingStrength,this.eyeDomeLightingRadius=i.eyeDomeLightingRadius,this._scene.requestRender()}else this._properties({});this._statisticsText=S9(e,!1),this._pickStatisticsText=S9(e,!0),this._resourceCacheStatisticsText=ACe(),FCe(this,!1)}},feature:{get:function(){return this._feature},set:function(e){if(this._feature===e)return;let t=this._feature;l(t)&&!t.content.isDestroyed()&&(!this.colorize&&l(this._style)?t.color=l(this._style.color)?this._style.color.evaluateColor(t,G1t):B.WHITE:t.color=EB,this._scene.requestRender()),l(e)&&(B.clone(e.color,EB),e.color=wCe,this._scene.requestRender()),this._feature=e}},tile:{get:function(){return this._tile},set:function(e){if(this._tile===e)return;let t=this._tile;l(t)&&!t.isDestroyed()&&!sq(t.content)&&(t.color=EB,this._scene.requestRender()),l(e)&&!sq(e.content)&&(B.clone(e.color,EB),e.color=wCe,this._scene.requestRender()),this._tile=e}}});function sq(e){if(!l(e))return!1;if(e.featuresLength>0)return!0;let t=e.innerContents;if(l(t)){let n=t.length;for(let i=0;i<n;++i)if(!sq(t[i]))return!1;return!0}return!1}Ea.prototype.togglePickTileset=function(){this.pickActive=!this.pickActive};Ea.prototype.toggleInspector=function(){this.inspectorVisible=!this.inspectorVisible};Ea.prototype.toggleTileset=function(){this.tilesetVisible=!this.tilesetVisible};Ea.prototype.toggleDisplay=function(){this.displayVisible=!this.displayVisible};Ea.prototype.toggleUpdate=function(){this.updateVisible=!this.updateVisible};Ea.prototype.toggleLogging=function(){this.loggingVisible=!this.loggingVisible};Ea.prototype.toggleStyle=function(){this.styleVisible=!this.styleVisible};Ea.prototype.toggleTileDebugLabels=function(){this.tileDebugLabelsVisible=!this.tileDebugLabelsVisible};Ea.prototype.toggleOptimization=function(){this.optimizationVisible=!this.optimizationVisible};Ea.prototype.trimTilesCache=function(){l(this._tileset)&&this._tileset.trimLoadedTiles()};Ea.prototype.compileStyle=function(){let e=this._tileset;if(!(!l(e)||this.styleString===JSON.stringify(e.style))){this._editorError="";try{this.styleString.length===0&&(this.styleString="{}"),this._style=new FS(JSON.parse(this.styleString)),this._shouldStyle=!0,this._scene.requestRender()}catch(t){this._editorError=t.toString()}this.feature=this._feature,this.tile=this._tile}};Ea.prototype.styleEditorKeyPress=function(e,t){if(t.keyCode===9){t.preventDefault();let n=t.target,i=n.selectionStart,o=n.selectionEnd,r=o,a=n.value.slice(i,o).split(` `),c=a.length,d;if(t.shiftKey)for(d=0;d<c;++d)a[d][0]===" "&&(a[d][1]===" "?(a[d]=a[d].substr(2),r-=2):(a[d]=a[d].substr(1),r-=1));else for(d=0;d<c;++d)a[d]=` ${a[d]}`,r+=2;let u=a.join(` `);n.value=n.value.slice(0,i)+u+n.value.slice(o),n.selectionStart=i!==o?i:r,n.selectionEnd=r}else t.ctrlKey&&(t.keyCode===10||t.keyCode===13)&&this.compileStyle();return!0};Ea.prototype._update=function(){let e=this._tileset;if(this.performance&&this._performanceDisplay.update(),l(e)){if(e.isDestroyed()){this.tile=void 0,this.feature=void 0,this.tileset=void 0;return}let t=e.style;this._style!==e.style&&(this._shouldStyle?(e.style=this._style,this._shouldStyle=!1):(this._style=t,this.styleString=JSON.stringify(t.style,null," ")))}this.showStatistics&&(this._statisticsText=S9(e,!1),this._pickStatisticsText=S9(e,!0),this._resourceCacheStatisticsText=ACe())};Ea.prototype.isDestroyed=function(){return!1};Ea.prototype.destroy=function(){this._eventHandler.destroy(),this._removePostRenderEvent();let e=this;return this._definedProperties.forEach(function(t){Te.getObservable(e,t).dispose()}),me(this)};Ea.getStatistics=S9;var C9=Ea;function IB(e,t){e=Wn(e);let n=document.createElement("div"),i=document.createElement("div");i.setAttribute("data-bind","visible: performance");let o=new C9(t,i);this._viewModel=o,this._container=e,this._element=n;let r=document.createElement("div");r.textContent="3D Tiles Inspector",r.className="cesium-cesiumInspector-button",r.setAttribute("data-bind","click: toggleInspector"),n.appendChild(r),n.className="cesium-cesiumInspector cesium-3DTilesInspector",n.setAttribute("data-bind",'css: { "cesium-cesiumInspector-visible" : inspectorVisible, "cesium-cesiumInspector-hidden" : !inspectorVisible}'),e.appendChild(n);let s=document.createElement("div");s.className="cesium-cesiumInspector-dropDown",n.appendChild(s);let a=qa.createSection,c=qa.createCheckbox,d=qa.createRangeInput,u=qa.createButton,h=a(s,"Tileset","tilesetVisible","toggleTileset"),p=a(s,"Display","displayVisible","toggleDisplay"),g=a(s,"Update","updateVisible","toggleUpdate"),f=a(s,"Logging","loggingVisible","toggleLogging"),x=a(s,"Tile Debug Labels","tileDebugLabelsVisible","toggleTileDebugLabels"),_=a(s,"Style","styleVisible","toggleStyle"),C=a(s,"Optimization","optimizationVisible","toggleOptimization"),V=document.createElement("div");V.className="field-group";let L=document.createElement("label");L.className="field-label",L.appendChild(document.createTextNode("Properties: "));let R=document.createElement("div");R.setAttribute("data-bind","text: properties"),V.appendChild(L),V.appendChild(R),h.appendChild(V),h.appendChild(u("Pick Tileset","togglePickTileset","pickActive")),h.appendChild(u("Trim Tiles Cache","trimTilesCache")),h.appendChild(c("Enable Picking","picking")),p.appendChild(c("Colorize","colorize"));let G=p.appendChild(c("Wireframe","wireframe","_tileset === undefined || hasEnabledWireframe")),I=document.createElement("p");I.setAttribute("data-bind","visible: _tileset !== undefined && !hasEnabledWireframe"),I.setAttribute("class","cesium-3DTilesInspector-disabledElementsInfo"),I.innerText="Set enableDebugWireframe to true in the tileset constructor to enable this option.",G.appendChild(I),p.appendChild(c("Bounding Volumes","showBoundingVolumes")),p.appendChild(c("Content Volumes","showContentBoundingVolumes")),p.appendChild(c("Request Volumes","showRequestVolumes")),p.appendChild(c("Point Cloud Shading","pointCloudShading"));let v=document.createElement("div");v.setAttribute("data-bind","visible: pointCloudShading"),v.appendChild(d("Geometric Error Scale","geometricErrorScale",0,2,.01)),v.appendChild(d("Maximum Attenuation","maximumAttenuation",0,32,1)),v.appendChild(d("Base Resolution","baseResolution",0,1,.01)),v.appendChild(c("Eye Dome Lighting (EDL)","eyeDomeLighting")),p.appendChild(v);let P=document.createElement("div");P.setAttribute("data-bind","visible: eyeDomeLighting"),P.appendChild(d("EDL Strength","eyeDomeLightingStrength",0,2,.1)),P.appendChild(d("EDL Radius","eyeDomeLightingRadius",0,4,.1)),v.appendChild(P),g.appendChild(c("Freeze Frame","freezeFrame")),g.appendChild(c("Dynamic Screen Space Error","dynamicScreenSpaceError"));let w=document.createElement("div");w.appendChild(d("Maximum Screen Space Error","maximumScreenSpaceError",0,128,1)),g.appendChild(w);let A=document.createElement("div");A.setAttribute("data-bind","visible: dynamicScreenSpaceError"),A.appendChild(d("Screen Space Error Density","dynamicScreenSpaceErrorDensitySliderValue",0,1,.005,"dynamicScreenSpaceErrorDensity")),A.appendChild(d("Screen Space Error Factor","dynamicScreenSpaceErrorFactor",1,32,.1)),g.appendChild(A),f.appendChild(c("Performance","performance")),f.appendChild(i),f.appendChild(c("Statistics","showStatistics"));let b=document.createElement("div");b.className="cesium-3dTilesInspector-statistics",b.setAttribute("data-bind","html: statisticsText, visible: showStatistics"),f.appendChild(b),f.appendChild(c("Pick Statistics","showPickStatistics"));let Z=document.createElement("div");Z.className="cesium-3dTilesInspector-statistics",Z.setAttribute("data-bind","html: pickStatisticsText, visible: showPickStatistics"),f.appendChild(Z),f.appendChild(c("Resource Cache Statistics","showResourceCacheStatistics"));let E=document.createElement("div");E.className="cesium-3dTilesInspector-statistics",E.setAttribute("data-bind","html: resourceCacheStatisticsText, visible: showResourceCacheStatistics"),f.appendChild(E);let X=document.createElement("div");_.appendChild(X),X.appendChild(document.createTextNode("Color Blend Mode: "));let F=document.createElement("select");F.setAttribute("data-bind",'options: colorBlendModes, optionsText: "text", optionsValue: "value", value: colorBlendMode'),X.appendChild(F);let N=document.createElement("textarea");N.setAttribute("data-bind","textInput: styleString, event: { keydown: styleEditorKeyPress }"),X.className="cesium-cesiumInspector-styleEditor",X.appendChild(N);let O=u("Compile (Ctrl+Enter)","compileStyle");X.appendChild(O);let U=document.createElement("div");U.className="cesium-cesiumInspector-error",U.setAttribute("data-bind","text: editorError"),X.appendChild(U),x.appendChild(c("Show Picked Only","showOnlyPickedTileDebugLabel")),x.appendChild(c("Geometric Error","showGeometricError")),x.appendChild(c("Rendering Statistics","showRenderingStatistics")),x.appendChild(c("Memory Usage (MB)","showMemoryUsage")),x.appendChild(c("Url","showUrl")),C.appendChild(c("Skip Tile LODs","skipLevelOfDetail"));let Y=document.createElement("div");Y.appendChild(d("Skip SSE Factor","skipScreenSpaceErrorFactor",1,50,1)),C.appendChild(Y);let k=document.createElement("div");k.appendChild(d("SSE before skipping LOD","baseScreenSpaceError",0,4096,1)),C.appendChild(k);let H=document.createElement("div");H.appendChild(d("Min. levels to skip","skipLevels",0,10,1)),C.appendChild(H),C.appendChild(c("Load only tiles that meet the max SSE.","immediatelyLoadDesiredLevelOfDetail")),C.appendChild(c("Load siblings of visible tiles","loadSiblings")),Te.applyBindings(o,n)}Object.defineProperties(IB.prototype,{container:{get:function(){return this._container}},viewModel:{get:function(){return this._viewModel}}});IB.prototype.isDestroyed=function(){return!1};IB.prototype.destroy=function(){return Te.cleanNode(this._element),this._container.removeChild(this._element),this.viewModel.destroy(),me(this)};var V9=IB;var qZo=T(S(),1);var OS="http://www.w3.org/2000/svg",kCe="http://www.w3.org/1999/xlink",XB,L9=B.fromCssColorString("rgba(247,250,255,0.384)"),WB=B.fromCssColorString("rgba(143,191,255,0.216)"),aq=B.fromCssColorString("rgba(153,197,255,0.098)"),PB=B.fromCssColorString("rgba(255,255,255,0.086)"),E1t=B.fromCssColorString("rgba(255,255,255,0.267)"),I1t=B.fromCssColorString("rgba(255,255,255,0)"),MCe=B.fromCssColorString("rgba(66,67,68,0.3)"),NCe=B.fromCssColorString("rgba(0,0,0,0.5)");function ix(e){return B.fromCssColorString(window.getComputedStyle(e).getPropertyValue("color"))}var R9={animation_pathReset:{tagName:"path",transform:"translate(16,16) scale(0.85) translate(-16,-16)",d:"M24.316,5.318,9.833,13.682,9.833,5.5,5.5,5.5,5.5,25.5,9.833,25.5,9.833,17.318,24.316,25.682z"},animation_pathPause:{tagName:"path",transform:"translate(16,16) scale(0.85) translate(-16,-16)",d:"M13,5.5,7.5,5.5,7.5,25.5,13,25.5zM24.5,5.5,19,5.5,19,25.5,24.5,25.5z"},animation_pathPlay:{tagName:"path",transform:"translate(16,16) scale(0.85) translate(-16,-16)",d:"M6.684,25.682L24.316,15.5L6.684,5.318V25.682z"},animation_pathPlayReverse:{tagName:"path",transform:"translate(16,16) scale(-0.85,0.85) translate(-16,-16)",d:"M6.684,25.682L24.316,15.5L6.684,5.318V25.682z"},animation_pathLoop:{tagName:"path",transform:"translate(16,16) scale(0.85) translate(-16,-16)",d:"M24.249,15.499c-0.009,4.832-3.918,8.741-8.75,8.75c-2.515,0-4.768-1.064-6.365-2.763l2.068-1.442l-7.901-3.703l0.744,8.694l2.193-1.529c2.244,2.594,5.562,4.242,9.26,4.242c6.767,0,12.249-5.482,12.249-12.249H24.249zM15.499,6.75c2.516,0,4.769,1.065,6.367,2.764l-2.068,1.443l7.901,3.701l-0.746-8.693l-2.192,1.529c-2.245-2.594-5.562-4.245-9.262-4.245C8.734,3.25,3.25,8.734,3.249,15.499H6.75C6.758,10.668,10.668,6.758,15.499,6.75z"},animation_pathClock:{tagName:"path",transform:"translate(16,16) scale(0.85) translate(-16,-15.5)",d:"M15.5,2.374C8.251,2.375,2.376,8.251,2.374,15.5C2.376,22.748,8.251,28.623,15.5,28.627c7.249-0.004,13.124-5.879,13.125-13.127C28.624,8.251,22.749,2.375,15.5,2.374zM15.5,25.623C9.909,25.615,5.385,21.09,5.375,15.5C5.385,9.909,9.909,5.384,15.5,5.374c5.59,0.01,10.115,4.535,10.124,10.125C25.615,21.09,21.091,25.615,15.5,25.623zM8.625,15.5c-0.001-0.552-0.448-0.999-1.001-1c-0.553,0-1,0.448-1,1c0,0.553,0.449,1,1,1C8.176,16.5,8.624,16.053,8.625,15.5zM8.179,18.572c-0.478,0.277-0.642,0.889-0.365,1.367c0.275,0.479,0.889,0.641,1.365,0.365c0.479-0.275,0.643-0.887,0.367-1.367C9.27,18.461,8.658,18.297,8.179,18.572zM9.18,10.696c-0.479-0.276-1.09-0.112-1.366,0.366s-0.111,1.09,0.365,1.366c0.479,0.276,1.09,0.113,1.367-0.366C9.821,11.584,9.657,10.973,9.18,10.696zM22.822,12.428c0.478-0.275,0.643-0.888,0.366-1.366c-0.275-0.478-0.89-0.642-1.366-0.366c-0.479,0.278-0.642,0.89-0.366,1.367C21.732,12.54,22.344,12.705,22.822,12.428zM12.062,21.455c-0.478-0.275-1.089-0.111-1.366,0.367c-0.275,0.479-0.111,1.09,0.366,1.365c0.478,0.277,1.091,0.111,1.365-0.365C12.704,22.344,12.54,21.732,12.062,21.455zM12.062,9.545c0.479-0.276,0.642-0.888,0.366-1.366c-0.276-0.478-0.888-0.642-1.366-0.366s-0.642,0.888-0.366,1.366C10.973,9.658,11.584,9.822,12.062,9.545zM22.823,18.572c-0.48-0.275-1.092-0.111-1.367,0.365c-0.275,0.479-0.112,1.092,0.367,1.367c0.477,0.275,1.089,0.113,1.365-0.365C23.464,19.461,23.3,18.848,22.823,18.572zM19.938,7.813c-0.477-0.276-1.091-0.111-1.365,0.366c-0.275,0.48-0.111,1.091,0.366,1.367s1.089,0.112,1.366-0.366C20.581,8.702,20.418,8.089,19.938,7.813zM23.378,14.5c-0.554,0.002-1.001,0.45-1.001,1c0.001,0.552,0.448,1,1.001,1c0.551,0,1-0.447,1-1C24.378,14.949,23.929,14.5,23.378,14.5zM15.501,6.624c-0.552,0-1,0.448-1,1l-0.466,7.343l-3.004,1.96c-0.478,0.277-0.642,0.889-0.365,1.365c0.275,0.479,0.889,0.643,1.365,0.367l3.305-1.676C15.39,16.99,15.444,17,15.501,17c0.828,0,1.5-0.671,1.5-1.5l-0.5-7.876C16.501,7.072,16.053,6.624,15.501,6.624zM15.501,22.377c-0.552,0-1,0.447-1,1s0.448,1,1,1s1-0.447,1-1S16.053,22.377,15.501,22.377zM18.939,21.455c-0.479,0.277-0.643,0.889-0.366,1.367c0.275,0.477,0.888,0.643,1.366,0.365c0.478-0.275,0.642-0.889,0.366-1.365C20.028,21.344,19.417,21.18,18.939,21.455z"},animation_pathWingButton:{tagName:"path",d:"m 4.5,0.5 c -2.216,0 -4,1.784 -4,4 l 0,24 c 0,2.216 1.784,4 4,4 l 13.71875,0 C 22.478584,27.272785 27.273681,22.511272 32.5,18.25 l 0,-13.75 c 0,-2.216 -1.784,-4 -4,-4 l -24,0 z"},animation_pathPointer:{tagName:"path",d:"M-15,-65,-15,-55,15,-55,15,-65,0,-95z"},animation_pathSwooshFX:{tagName:"path",d:"m 85,0 c 0,16.617 -4.813944,35.356 -13.131081,48.4508 h 6.099803 c 8.317138,-13.0948 13.13322,-28.5955 13.13322,-45.2124 0,-46.94483 -38.402714,-85.00262 -85.7743869,-85.00262 -1.0218522,0 -2.0373001,0.0241 -3.0506131,0.0589 45.958443,1.59437 82.723058,35.77285 82.723058,81.70532 z"}};function tf(e){let t=document.createElementNS(OS,e.tagName);for(let n in e)if(e.hasOwnProperty(n)&&n!=="tagName")if(n==="children"){let i=e.children.length;for(let o=0;o<i;++o)t.appendChild(tf(e.children[o]))}else n.indexOf("xlink:")===0?t.setAttributeNS(kCe,n.substring(6),e[n]):n==="textContent"?t.textContent=e[n]:t.setAttribute(n,e[n]);return t}function cq(e,t,n){let i=document.createElementNS(OS,"text");i.setAttribute("x",e),i.setAttribute("y",t),i.setAttribute("class","cesium-animation-svgText");let o=document.createElementNS(OS,"tspan");return o.textContent=n,i.appendChild(o),i}function X1t(e,t,n){e.setAttribute("transform",`translate(100,100) rotate(${n})`),t.setAttribute("transform",`rotate(${n})`)}var vB=new B;function ls(e,t){let n=t.alpha,i=1-n;return vB.red=e.red*i+t.red*n,vB.green=e.green*i+t.green*n,vB.blue=e.blue*i+t.blue*n,vB.toCssColorString()}function lq(e,t,n){let i=R9[n],o={tagName:"g",class:"cesium-animation-rectButton",transform:`translate(${e},${t})`,children:[{tagName:"rect",class:"cesium-animation-buttonGlow",width:32,height:32,rx:2,ry:2},{tagName:"rect",class:"cesium-animation-buttonMain",width:32,height:32,rx:4,ry:4},{class:"cesium-animation-buttonPath",id:n,tagName:i.tagName,transform:i.transform,d:i.d},{tagName:"title",textContent:""}]};return tf(o)}function W1t(e,t,n){let i=R9[n],o=R9.animation_pathWingButton,r={tagName:"g",class:"cesium-animation-rectButton",transform:`translate(${e},${t})`,children:[{class:"cesium-animation-buttonGlow",id:"animation_pathWingButton",tagName:o.tagName,d:o.d},{class:"cesium-animation-buttonMain",id:"animation_pathWingButton",tagName:o.tagName,d:o.d},{class:"cesium-animation-buttonPath",id:n,tagName:i.tagName,transform:i.transform,d:i.d},{tagName:"title",textContent:""}]};return tf(r)}function P1t(e,t){let n=e._viewModel,i=n.shuttleRingDragging;if(!(i&&XB!==e))if(t.type==="mousedown"||i&&t.type==="mousemove"||t.type==="touchstart"&&t.touches.length===1||i&&t.type==="touchmove"&&t.touches.length===1){let o=e._centerX,r=e._centerY,a=e._svgNode.getBoundingClientRect(),c,d;if(t.type==="touchstart"||t.type==="touchmove"?(c=t.touches[0].clientX,d=t.touches[0].clientY):(c=t.clientX,d=t.clientY),!i&&(c>a.right||c<a.left||d<a.top||d>a.bottom))return;let u=e._shuttleRingPointer.getBoundingClientRect(),h=c-o-a.left,p=d-r-a.top,g=Math.atan2(p,h)*180/Math.PI+90;g>180&&(g-=360);let f=n.shuttleRingAngle;i||c<u.right&&c>u.left&&d>u.top&&d<u.bottom?(XB=e,n.shuttleRingDragging=!0,n.shuttleRingAngle=g):g<f?n.slower():g>f&&n.faster(),t.preventDefault()}else e===XB&&(XB=void 0),n.shuttleRingDragging=!1}function M0(e,t){this._viewModel=t,this.svgElement=e,this._enabled=void 0,this._toggled=void 0;let n=this;this._clickFunction=function(){let i=n._viewModel.command;i.canExecute&&i()},e.addEventListener("click",this._clickFunction,!0),this._subscriptions=[Ga(t,"toggled",this.setToggled,this),Ga(t,"tooltip",this.setTooltip,this),Ga(t.command,"canExecute",this.setEnabled,this)]}M0.prototype.destroy=function(){this.svgElement.removeEventListener("click",this._clickFunction,!0);let e=this._subscriptions;for(let t=0,n=e.length;t<n;t++)e[t].dispose();me(this)};M0.prototype.isDestroyed=function(){return!1};M0.prototype.setEnabled=function(e){if(this._enabled!==e){if(this._enabled=e,!e){this.svgElement.setAttribute("class","cesium-animation-buttonDisabled");return}if(this._toggled){this.svgElement.setAttribute("class","cesium-animation-rectButton cesium-animation-buttonToggled");return}this.svgElement.setAttribute("class","cesium-animation-rectButton")}};M0.prototype.setToggled=function(e){this._toggled!==e&&(this._toggled=e,this._enabled&&(e?this.svgElement.setAttribute("class","cesium-animation-rectButton cesium-animation-buttonToggled"):this.svgElement.setAttribute("class","cesium-animation-rectButton")))};M0.prototype.setTooltip=function(e){this.svgElement.getElementsByTagName("title")[0].textContent=e};function tR(e,t){e=Wn(e),this._viewModel=t,this._container=e,this._centerX=0,this._centerY=0,this._defsElement=void 0,this._svgNode=void 0,this._topG=void 0,this._lastHeight=void 0,this._lastWidth=void 0;let n=e.ownerDocument,i=document.createElement("style");i.textContent=".cesium-animation-rectButton .cesium-animation-buttonGlow { filter: url(#animation_blurred); }.cesium-animation-rectButton .cesium-animation-buttonMain { fill: url(#animation_buttonNormal); }.cesium-animation-buttonToggled .cesium-animation-buttonMain { fill: url(#animation_buttonToggled); }.cesium-animation-rectButton:hover .cesium-animation-buttonMain { fill: url(#animation_buttonHovered); }.cesium-animation-buttonDisabled .cesium-animation-buttonMain { fill: url(#animation_buttonDisabled); }.cesium-animation-shuttleRingG .cesium-animation-shuttleRingSwoosh { fill: url(#animation_shuttleRingSwooshGradient); }.cesium-animation-shuttleRingG:hover .cesium-animation-shuttleRingSwoosh { fill: url(#animation_shuttleRingSwooshHovered); }.cesium-animation-shuttleRingPointer { fill: url(#animation_shuttleRingPointerGradient); }.cesium-animation-shuttleRingPausePointer { fill: url(#animation_shuttleRingPointerPaused); }.cesium-animation-knobOuter { fill: url(#animation_knobOuter); }.cesium-animation-knobInner { fill: url(#animation_knobInner); }",n.head.insertBefore(i,n.head.childNodes[0]);let o=document.createElement("div");o.className="cesium-animation-theme",o.innerHTML='<div class="cesium-animation-themeNormal"></div><div class="cesium-animation-themeHover"></div><div class="cesium-animation-themeSelect"></div><div class="cesium-animation-themeDisabled"></div><div class="cesium-animation-themeKnob"></div><div class="cesium-animation-themePointer"></div><div class="cesium-animation-themeSwoosh"></div><div class="cesium-animation-themeSwooshHover"></div>',this._theme=o,this._themeNormal=o.childNodes[0],this._themeHover=o.childNodes[1],this._themeSelect=o.childNodes[2],this._themeDisabled=o.childNodes[3],this._themeKnob=o.childNodes[4],this._themePointer=o.childNodes[5],this._themeSwoosh=o.childNodes[6],this._themeSwooshHover=o.childNodes[7];let r=document.createElementNS(OS,"svg:svg");this._svgNode=r,r.setAttributeNS("http://www.w3.org/2000/xmlns/","xmlns:xlink",kCe);let s=document.createElementNS(OS,"g");this._topG=s,this._realtimeSVG=new M0(W1t(3,4,"animation_pathClock"),t.playRealtimeViewModel),this._playReverseSVG=new M0(lq(44,99,"animation_pathPlayReverse"),t.playReverseViewModel),this._playForwardSVG=new M0(lq(124,99,"animation_pathPlay"),t.playForwardViewModel),this._pauseSVG=new M0(lq(84,99,"animation_pathPause"),t.pauseViewModel);let a=document.createElementNS(OS,"g");a.appendChild(this._realtimeSVG.svgElement),a.appendChild(this._playReverseSVG.svgElement),a.appendChild(this._playForwardSVG.svgElement),a.appendChild(this._pauseSVG.svgElement);let c=tf({tagName:"circle",class:"cesium-animation-shuttleRingBack",cx:100,cy:100,r:99});this._shuttleRingBackPanel=c;let d=R9.animation_pathSwooshFX,u=R9.animation_pathPointer,h=tf({tagName:"g",class:"cesium-animation-shuttleRingSwoosh",children:[{tagName:d.tagName,transform:"translate(100,97) scale(-1,1)",id:"animation_pathSwooshFX",d:d.d},{tagName:d.tagName,transform:"translate(100,97)",id:"animation_pathSwooshFX",d:d.d},{tagName:"line",x1:100,y1:8,x2:100,y2:22}]});this._shuttleRingSwooshG=h,this._shuttleRingPointer=tf({class:"cesium-animation-shuttleRingPointer",id:"animation_pathPointer",tagName:u.tagName,d:u.d});let p=tf({tagName:"g",transform:"translate(100,100)"});this._knobOuter=tf({tagName:"circle",class:"cesium-animation-knobOuter",cx:0,cy:0,r:71});let g=61,f=tf({tagName:"circle",class:"cesium-animation-knobInner",cx:0,cy:0,r:g});this._knobDate=cq(0,-24,""),this._knobTime=cq(0,-7,""),this._knobStatus=cq(0,-41,"");let x=tf({tagName:"circle",class:"cesium-animation-blank",cx:0,cy:0,r:g}),_=document.createElementNS(OS,"g");_.setAttribute("class","cesium-animation-shuttleRingG"),e.appendChild(o),s.appendChild(_),s.appendChild(p),s.appendChild(a),_.appendChild(c),_.appendChild(h),_.appendChild(this._shuttleRingPointer),p.appendChild(this._knobOuter),p.appendChild(f),p.appendChild(this._knobDate),p.appendChild(this._knobTime),p.appendChild(this._knobStatus),p.appendChild(x),r.appendChild(s),e.appendChild(r);let C=this;function V(v){P1t(C,v)}this._mouseCallback=V,c.addEventListener("mousedown",V,!0),c.addEventListener("touchstart",V,!0),h.addEventListener("mousedown",V,!0),h.addEventListener("touchstart",V,!0),n.addEventListener("mousemove",V,!0),n.addEventListener("touchmove",V,!0),n.addEventListener("mouseup",V,!0),n.addEventListener("touchend",V,!0),n.addEventListener("touchcancel",V,!0),this._shuttleRingPointer.addEventListener("mousedown",V,!0),this._shuttleRingPointer.addEventListener("touchstart",V,!0),this._knobOuter.addEventListener("mousedown",V,!0),this._knobOuter.addEventListener("touchstart",V,!0);let L=this._knobTime.childNodes[0],R=this._knobDate.childNodes[0],G=this._knobStatus.childNodes[0],I;this._subscriptions=[Ga(t.pauseViewModel,"toggled",function(v){I!==v&&(I=v,I?C._shuttleRingPointer.setAttribute("class","cesium-animation-shuttleRingPausePointer"):C._shuttleRingPointer.setAttribute("class","cesium-animation-shuttleRingPointer"))}),Ga(t,"shuttleRingAngle",function(v){X1t(C._shuttleRingPointer,C._knobOuter,v)}),Ga(t,"dateLabel",function(v){R.textContent!==v&&(R.textContent=v)}),Ga(t,"timeLabel",function(v){L.textContent!==v&&(L.textContent=v)}),Ga(t,"multiplierLabel",function(v){G.textContent!==v&&(G.textContent=v)})],this.applyThemeChanges(),this.resize()}Object.defineProperties(tR.prototype,{container:{get:function(){return this._container}},viewModel:{get:function(){return this._viewModel}}});tR.prototype.isDestroyed=function(){return!1};tR.prototype.destroy=function(){l(this._observer)&&(this._observer.disconnect(),this._observer=void 0);let e=this._container.ownerDocument,t=this._mouseCallback;this._shuttleRingBackPanel.removeEventListener("mousedown",t,!0),this._shuttleRingBackPanel.removeEventListener("touchstart",t,!0),this._shuttleRingSwooshG.removeEventListener("mousedown",t,!0),this._shuttleRingSwooshG.removeEventListener("touchstart",t,!0),e.removeEventListener("mousemove",t,!0),e.removeEventListener("touchmove",t,!0),e.removeEventListener("mouseup",t,!0),e.removeEventListener("touchend",t,!0),e.removeEventListener("touchcancel",t,!0),this._shuttleRingPointer.removeEventListener("mousedown",t,!0),this._shuttleRingPointer.removeEventListener("touchstart",t,!0),this._knobOuter.removeEventListener("mousedown",t,!0),this._knobOuter.removeEventListener("touchstart",t,!0),this._container.removeChild(this._svgNode),this._container.removeChild(this._theme),this._realtimeSVG.destroy(),this._playReverseSVG.destroy(),this._playForwardSVG.destroy(),this._pauseSVG.destroy();let n=this._subscriptions;for(let i=0,o=n.length;i<o;i++)n[i].dispose();return me(this)};tR.prototype.resize=function(){let e=this._container.clientWidth,t=this._container.clientHeight;if(e===this._lastWidth&&t===this._lastHeight)return;let n=this._svgNode,i=200,o=132,r=e,s=t;e===0&&t===0?(r=i,s=o):e===0?(s=t,r=i*(t/o)):t===0&&(r=e,s=o*(e/i));let a=r/i,c=s/o;n.style.cssText=`width: ${r}px; height: ${s}px; position: absolute; bottom: 0; left: 0; overflow: hidden;`,n.setAttribute("width",r),n.setAttribute("height",s),n.setAttribute("viewBox",`0 0 ${r} ${s}`),this._topG.setAttribute("transform",`scale(${a},${c})`),this._centerX=Math.max(1,100*a),this._centerY=Math.max(1,100*c),this._lastHeight=e,this._lastWidth=t};tR.prototype.applyThemeChanges=function(){let e=this._container.ownerDocument;if(!e.body.contains(this._container)){if(l(this._observer))return;let u=this;u._observer=new MutationObserver(function(){e.body.contains(u._container)&&(u._observer.disconnect(),u._observer=void 0,u.applyThemeChanges())}),u._observer.observe(e,{childList:!0,subtree:!0});return}let t=ix(this._themeNormal),n=ix(this._themeHover),i=ix(this._themeSelect),o=ix(this._themeDisabled),r=ix(this._themeKnob),s=ix(this._themePointer),a=ix(this._themeSwoosh),c=ix(this._themeSwooshHover),d=tf({tagName:"defs",children:[{id:"animation_buttonNormal",tagName:"linearGradient",x1:"50%",y1:"0%",x2:"50%",y2:"100%",children:[{tagName:"stop",offset:"0%","stop-color":ls(t,L9)},{tagName:"stop",offset:"12%","stop-color":ls(t,WB)},{tagName:"stop",offset:"46%","stop-color":ls(t,aq)},{tagName:"stop",offset:"81%","stop-color":ls(t,PB)}]},{id:"animation_buttonHovered",tagName:"linearGradient",x1:"50%",y1:"0%",x2:"50%",y2:"100%",children:[{tagName:"stop",offset:"0%","stop-color":ls(n,L9)},{tagName:"stop",offset:"12%","stop-color":ls(n,WB)},{tagName:"stop",offset:"46%","stop-color":ls(n,aq)},{tagName:"stop",offset:"81%","stop-color":ls(n,PB)}]},{id:"animation_buttonToggled",tagName:"linearGradient",x1:"50%",y1:"0%",x2:"50%",y2:"100%",children:[{tagName:"stop",offset:"0%","stop-color":ls(i,L9)},{tagName:"stop",offset:"12%","stop-color":ls(i,WB)},{tagName:"stop",offset:"46%","stop-color":ls(i,aq)},{tagName:"stop",offset:"81%","stop-color":ls(i,PB)}]},{id:"animation_buttonDisabled",tagName:"linearGradient",x1:"50%",y1:"0%",x2:"50%",y2:"100%",children:[{tagName:"stop",offset:"0%","stop-color":ls(o,E1t)},{tagName:"stop",offset:"75%","stop-color":ls(o,I1t)}]},{id:"animation_blurred",tagName:"filter",width:"200%",height:"200%",x:"-50%",y:"-50%",children:[{tagName:"feGaussianBlur",stdDeviation:4,in:"SourceGraphic"}]},{id:"animation_shuttleRingSwooshGradient",tagName:"linearGradient",x1:"50%",y1:"0%",x2:"50%",y2:"100%",children:[{tagName:"stop",offset:"0%","stop-opacity":.2,"stop-color":a.toCssColorString()},{tagName:"stop",offset:"85%","stop-opacity":.85,"stop-color":a.toCssColorString()},{tagName:"stop",offset:"95%","stop-opacity":.05,"stop-color":a.toCssColorString()}]},{id:"animation_shuttleRingSwooshHovered",tagName:"linearGradient",x1:"50%",y1:"0%",x2:"50%",y2:"100%",children:[{tagName:"stop",offset:"0%","stop-opacity":.2,"stop-color":c.toCssColorString()},{tagName:"stop",offset:"85%","stop-opacity":.85,"stop-color":c.toCssColorString()},{tagName:"stop",offset:"95%","stop-opacity":.05,"stop-color":c.toCssColorString()}]},{id:"animation_shuttleRingPointerGradient",tagName:"linearGradient",x1:"0%",y1:"50%",x2:"100%",y2:"50%",children:[{tagName:"stop",offset:"0%","stop-color":s.toCssColorString()},{tagName:"stop",offset:"40%","stop-color":s.toCssColorString()},{tagName:"stop",offset:"60%","stop-color":ls(s,NCe)},{tagName:"stop",offset:"100%","stop-color":ls(s,NCe)}]},{id:"animation_shuttleRingPointerPaused",tagName:"linearGradient",x1:"0%",y1:"50%",x2:"100%",y2:"50%",children:[{tagName:"stop",offset:"0%","stop-color":"#CCC"},{tagName:"stop",offset:"40%","stop-color":"#CCC"},{tagName:"stop",offset:"60%","stop-color":"#555"},{tagName:"stop",offset:"100%","stop-color":"#555"}]},{id:"animation_knobOuter",tagName:"linearGradient",x1:"20%",y1:"0%",x2:"90%",y2:"100%",children:[{tagName:"stop",offset:"5%","stop-color":ls(r,L9)},{tagName:"stop",offset:"60%","stop-color":ls(r,MCe)},{tagName:"stop",offset:"85%","stop-color":ls(r,WB)}]},{id:"animation_knobInner",tagName:"linearGradient",x1:"20%",y1:"0%",x2:"90%",y2:"100%",children:[{tagName:"stop",offset:"5%","stop-color":ls(r,MCe)},{tagName:"stop",offset:"60%","stop-color":ls(r,L9)},{tagName:"stop",offset:"85%","stop-color":ls(r,PB)}]}]});l(this._defsElement)?this._svgNode.replaceChild(d,this._defsElement):this._svgNode.appendChild(d),this._defsElement=d};var Z9=tR;var sGo=T(S(),1);var v1t=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],ox=15,nR=105;function UCe(e,t){return e-t}function dq(e,t){let n=Po(t,e,UCe);return n<0?~n:n}function w1t(e,t){if(Math.abs(e)<=ox)return e/ox;let n=ox,i=nR,o,r=0,s;return e>0?(o=Math.log(t[t.length-1]),s=(o-r)/(i-n),Math.exp(r+s*(e-n))):(o=Math.log(-t[0]),s=(o-r)/(i-n),-Math.exp(r+s*(Math.abs(e)-n)))}function F1t(e,t,n){if(n.clockStep===yo.SYSTEM_CLOCK)return ox;if(Math.abs(e)<=1)return e*ox;let i=t[t.length-1];e>i?e=i:e<-i&&(e=-i);let o=ox,r=nR,s,a=0,c;return e>0?(s=Math.log(i),c=(s-a)/(r-o),(Math.log(e)-a)/c+o):(s=Math.log(-t[0]),c=(s-a)/(r-o),-((Math.log(Math.abs(e))-a)/c+o))}function Sm(e){let t=this;this._clockViewModel=e,this._allShuttleRingTicks=[],this._dateFormatter=Sm.defaultDateFormatter,this._timeFormatter=Sm.defaultTimeFormatter,this.shuttleRingDragging=!1,this.snapToTicks=!1,Te.track(this,["_allShuttleRingTicks","_dateFormatter","_timeFormatter","shuttleRingDragging","snapToTicks"]),this._sortedFilteredPositiveTicks=[],this.setShuttleRingTicks(Sm.defaultTicks),this.timeLabel=void 0,Te.defineProperty(this,"timeLabel",function(){return t._timeFormatter(t._clockViewModel.currentTime,t)}),this.dateLabel=void 0,Te.defineProperty(this,"dateLabel",function(){return t._dateFormatter(t._clockViewModel.currentTime,t)}),this.multiplierLabel=void 0,Te.defineProperty(this,"multiplierLabel",function(){let s=t._clockViewModel;if(s.clockStep===yo.SYSTEM_CLOCK)return"Today";let a=s.multiplier;return a%1===0?`${a.toFixed(0)}x`:`${a.toFixed(3).replace(/0{0,3}$/,"")}x`}),this.shuttleRingAngle=void 0,Te.defineProperty(this,"shuttleRingAngle",{get:function(){return F1t(e.multiplier,t._allShuttleRingTicks,e)},set:function(s){s=Math.max(Math.min(s,nR),-nR);let a=t._allShuttleRingTicks,c=t._clockViewModel;if(c.clockStep=yo.SYSTEM_CLOCK_MULTIPLIER,Math.abs(s)===nR){c.multiplier=s>0?a[a.length-1]:a[0];return}let d=w1t(s,a);if(t.snapToTicks)d=a[dq(d,a)];else if(d!==0){let u=Math.abs(d);if(u>100){let h=u.toFixed(0).length-2,p=Math.pow(10,h);d=Math.round(d/p)*p|0}else u>ox?d=Math.round(d):u>1?d=+d.toFixed(1):u>0&&(d=+d.toFixed(2))}c.multiplier=d}}),this._canAnimate=void 0,Te.defineProperty(this,"_canAnimate",function(){let s=t._clockViewModel,a=s.clockRange;if(t.shuttleRingDragging||a===Kr.UNBOUNDED)return!0;let c=s.multiplier,d=s.currentTime,u=s.startTime,h=!1;if(a===Kr.LOOP_STOP)h=q.greaterThan(d,u)||d.equals(u)&&c>0;else{let p=s.stopTime;h=q.greaterThan(d,u)&&q.lessThan(d,p)||d.equals(u)&&c>0||d.equals(p)&&c<0}return h||(s.shouldAnimate=!1),h}),this._isSystemTimeAvailable=void 0,Te.defineProperty(this,"_isSystemTimeAvailable",function(){let s=t._clockViewModel;if(s.clockRange===Kr.UNBOUNDED)return!0;let c=s.systemTime;return q.greaterThanOrEquals(c,s.startTime)&&q.lessThanOrEquals(c,s.stopTime)}),this._isAnimating=void 0,Te.defineProperty(this,"_isAnimating",function(){return t._clockViewModel.shouldAnimate&&(t._canAnimate||t.shuttleRingDragging)});let n=Ln(function(){let s=t._clockViewModel;s.shouldAnimate?s.shouldAnimate=!1:t._canAnimate&&(s.shouldAnimate=!0)});this._pauseViewModel=new nx(n,{toggled:Te.computed(function(){return!t._isAnimating}),tooltip:"Pause"});let i=Ln(function(){let s=t._clockViewModel,a=s.multiplier;a>0&&(s.multiplier=-a),s.shouldAnimate=!0});this._playReverseViewModel=new nx(i,{toggled:Te.computed(function(){return t._isAnimating&&e.multiplier<0}),tooltip:"Play Reverse"});let o=Ln(function(){let s=t._clockViewModel,a=s.multiplier;a<0&&(s.multiplier=-a),s.shouldAnimate=!0});this._playForwardViewModel=new nx(o,{toggled:Te.computed(function(){return t._isAnimating&&e.multiplier>0&&e.clockStep!==yo.SYSTEM_CLOCK}),tooltip:"Play Forward"});let r=Ln(function(){t._clockViewModel.clockStep=yo.SYSTEM_CLOCK},Te.getObservable(this,"_isSystemTimeAvailable"));this._playRealtimeViewModel=new nx(r,{toggled:Te.computed(function(){return e.clockStep===yo.SYSTEM_CLOCK}),tooltip:Te.computed(function(){return t._isSystemTimeAvailable?"Today (real-time)":"Current time not in range"})}),this._slower=Ln(function(){let s=t._clockViewModel,a=t._allShuttleRingTicks,c=s.multiplier,d=dq(c,a)-1;d>=0&&(s.multiplier=a[d])}),this._faster=Ln(function(){let s=t._clockViewModel,a=t._allShuttleRingTicks,c=s.multiplier,d=dq(c,a)+1;d<a.length&&(s.multiplier=a[d])})}Sm.defaultDateFormatter=function(e,t){let n=q.toGregorianDate(e);return`${v1t[n.month-1]} ${n.day} ${n.year}`};Sm.defaultTicks=[.001,.002,.005,.01,.02,.05,.1,.25,.5,1,2,5,10,15,30,60,120,300,600,900,1800,3600,7200,14400,21600,43200,86400,172800,345600,604800];Sm.defaultTimeFormatter=function(e,t){let n=q.toGregorianDate(e),i=Math.round(n.millisecond);return Math.abs(t._clockViewModel.multiplier)<1?`${n.hour.toString().padStart(2,"0")}:${n.minute.toString().padStart(2,"0")}:${n.second.toString().padStart(2,"0")}.${i.toString().padStart(3,"0")}`:`${n.hour.toString().padStart(2,"0")}:${n.minute.toString().padStart(2,"0")}:${n.second.toString().padStart(2,"0")} UTC`};Sm.prototype.getShuttleRingTicks=function(){return this._sortedFilteredPositiveTicks.slice(0)};Sm.prototype.setShuttleRingTicks=function(e){let t,n,i,o={},r=this._sortedFilteredPositiveTicks;for(r.length=0,t=0,n=e.length;t<n;++t)i=e[t],o.hasOwnProperty(i)||(o[i]=!0,r.push(i));r.sort(UCe);let s=[];for(n=r.length,t=n-1;t>=0;--t)i=r[t],i!==0&&s.push(-i);Array.prototype.push.apply(s,r),this._allShuttleRingTicks=s};Object.defineProperties(Sm.prototype,{slower:{get:function(){return this._slower}},faster:{get:function(){return this._faster}},clockViewModel:{get:function(){return this._clockViewModel}},pauseViewModel:{get:function(){return this._pauseViewModel}},playReverseViewModel:{get:function(){return this._playReverseViewModel}},playForwardViewModel:{get:function(){return this._playForwardViewModel}},playRealtimeViewModel:{get:function(){return this._playRealtimeViewModel}},dateFormatter:{get:function(){return this._dateFormatter},set:function(e){this._dateFormatter=e}},timeFormatter:{get:function(){return this._timeFormatter},set:function(e){this._timeFormatter=e}}});Sm._maxShuttleRingAngle=nR;Sm._realtimeShuttleRingAngle=ox;var G9=Sm;var _Go=T(S(),1);var mGo=T(S(),1);function A1t(e){let t;if(l(e)){t="Command Statistics";let n=e.commandsInFrustums;for(let i in n)if(n.hasOwnProperty(i)){let o=parseInt(i,10),r;if(o===7)r="1, 2 and 3";else{let s=[];for(let a=2;a>=0;a--){let c=Math.pow(2,a);o>=c&&(s.push(a+1),o-=c)}r=s.reverse().join(" and ")}t+=`<br>    ${n[i]} in frustum ${r}`}t+=`<br>Total: ${e.totalCommands}`}return t}function uq(e,t,n){let i=Math.min(n,t);return i=Math.max(i,e),i}var M1t=new gn,N1t=new m;function E9(e,t){let n=this,i=e.canvas,o=new ou(i);this._eventHandler=o,this._scene=e,this._canvas=i,this._primitive=void 0,this._tile=void 0,this._modelMatrixPrimitive=void 0,this._performanceDisplay=void 0,this._performanceContainer=t;let r=this._scene.globe;r.depthTestAgainstTerrain=!0,this.frustums=!1,this.frustumPlanes=!1,this.performance=!1,this.shaderCacheText="",this.primitiveBoundingSphere=!1,this.primitiveReferenceFrame=!1,this.filterPrimitive=!1,this.tileBoundingSphere=!1,this.filterTile=!1,this.wireframe=!1,this.depthFrustum=1,this._numberOfFrustums=1,this.suspendUpdates=!1,this.tileCoordinates=!1,this.frustumStatisticText=!1,this.tileText="",this.hasPickedPrimitive=!1,this.hasPickedTile=!1,this.pickPrimitiveActive=!1,this.pickTileActive=!1,this.dropDownVisible=!0,this.generalVisible=!0,this.primitivesVisible=!1,this.terrainVisible=!1,this.depthFrustumText="",Te.track(this,["frustums","frustumPlanes","performance","shaderCacheText","primitiveBoundingSphere","primitiveReferenceFrame","filterPrimitive","tileBoundingSphere","filterTile","wireframe","depthFrustum","suspendUpdates","tileCoordinates","frustumStatisticText","tileText","hasPickedPrimitive","hasPickedTile","pickPrimitiveActive","pickTileActive","dropDownVisible","generalVisible","primitivesVisible","terrainVisible","depthFrustumText"]),this._toggleDropDown=Ln(function(){n.dropDownVisible=!n.dropDownVisible}),this._toggleGeneral=Ln(function(){n.generalVisible=!n.generalVisible}),this._togglePrimitives=Ln(function(){n.primitivesVisible=!n.primitivesVisible}),this._toggleTerrain=Ln(function(){n.terrainVisible=!n.terrainVisible}),this._frustumsSubscription=Te.getObservable(this,"frustums").subscribe(function(d){n._scene.debugShowFrustums=d,n._scene.requestRender()}),this._frustumPlanesSubscription=Te.getObservable(this,"frustumPlanes").subscribe(function(d){n._scene.debugShowFrustumPlanes=d,n._scene.requestRender()}),this._performanceSubscription=Te.getObservable(this,"performance").subscribe(function(d){d?n._performanceDisplay=new S0({container:n._performanceContainer}):n._performanceContainer.innerHTML=""}),this._showPrimitiveBoundingSphere=Ln(function(){return n._primitive.debugShowBoundingVolume=n.primitiveBoundingSphere,n._scene.requestRender(),!0}),this._primitiveBoundingSphereSubscription=Te.getObservable(this,"primitiveBoundingSphere").subscribe(function(){n._showPrimitiveBoundingSphere()}),this._showPrimitiveReferenceFrame=Ln(function(){if(n.primitiveReferenceFrame){let d=n._primitive.modelMatrix;n._modelMatrixPrimitive=new jM({modelMatrix:d}),n._scene.primitives.add(n._modelMatrixPrimitive)}else l(n._modelMatrixPrimitive)&&(n._scene.primitives.remove(n._modelMatrixPrimitive),n._modelMatrixPrimitive=void 0);return n._scene.requestRender(),!0}),this._primitiveReferenceFrameSubscription=Te.getObservable(this,"primitiveReferenceFrame").subscribe(function(){n._showPrimitiveReferenceFrame()}),this._doFilterPrimitive=Ln(function(){return n.filterPrimitive?n._scene.debugCommandFilter=function(d){return l(n._modelMatrixPrimitive)&&d.owner===n._modelMatrixPrimitive._primitive?!0:l(n._primitive)?d.owner===n._primitive||d.owner===n._primitive._billboardCollection||d.owner.primitive===n._primitive:!1}:n._scene.debugCommandFilter=void 0,!0}),this._filterPrimitiveSubscription=Te.getObservable(this,"filterPrimitive").subscribe(function(){n._doFilterPrimitive(),n._scene.requestRender()}),this._wireframeSubscription=Te.getObservable(this,"wireframe").subscribe(function(d){r._surface.tileProvider._debug.wireframe=d,n._scene.requestRender()}),this._depthFrustumSubscription=Te.getObservable(this,"depthFrustum").subscribe(function(d){n._scene.debugShowDepthFrustum=d,n._scene.requestRender()}),this._incrementDepthFrustum=Ln(function(){let d=n.depthFrustum+1;return n.depthFrustum=uq(1,n._numberOfFrustums,d),n._scene.requestRender(),!0}),this._decrementDepthFrustum=Ln(function(){let d=n.depthFrustum-1;return n.depthFrustum=uq(1,n._numberOfFrustums,d),n._scene.requestRender(),!0}),this._suspendUpdatesSubscription=Te.getObservable(this,"suspendUpdates").subscribe(function(d){r._surface._debug.suspendLodUpdate=d,d||(n.filterTile=!1)});let s;this._showTileCoordinates=Ln(function(){return n.tileCoordinates&&!l(s)?s=e.imageryLayers.addImageryProvider(new f9({tilingScheme:e.terrainProvider.tilingScheme})):!n.tileCoordinates&&l(s)&&(e.imageryLayers.remove(s),s=void 0),!0}),this._tileCoordinatesSubscription=Te.getObservable(this,"tileCoordinates").subscribe(function(){n._showTileCoordinates(),n._scene.requestRender()}),this._tileBoundingSphereSubscription=Te.getObservable(this,"tileBoundingSphere").subscribe(function(){n._showTileBoundingSphere(),n._scene.requestRender()}),this._showTileBoundingSphere=Ln(function(){return n.tileBoundingSphere?r._surface.tileProvider._debug.boundingSphereTile=n._tile:r._surface.tileProvider._debug.boundingSphereTile=void 0,n._scene.requestRender(),!0}),this._doFilterTile=Ln(function(){return n.filterTile?(n.suspendUpdates=!0,r._surface._tilesToRender=[],l(n._tile)&&n._tile.renderable&&r._surface._tilesToRender.push(n._tile)):n.suspendUpdates=!1,!0}),this._filterTileSubscription=Te.getObservable(this,"filterTile").subscribe(function(){n.doFilterTile(),n._scene.requestRender()});function a(d){let u=n._scene.pick({x:d.position.x,y:d.position.y});l(u)&&(n.primitive=l(u.collection)?u.collection:u.primitive),n._scene.requestRender(),n.pickPrimitiveActive=!1}this._pickPrimitive=Ln(function(){n.pickPrimitiveActive=!n.pickPrimitiveActive}),this._pickPrimitiveActiveSubscription=Te.getObservable(this,"pickPrimitiveActive").subscribe(function(d){d?o.setInputAction(a,Sn.LEFT_CLICK):o.removeInputAction(Sn.LEFT_CLICK)});function c(d){let u,h=r.ellipsoid,p=n._scene.camera.getPickRay(d.position,M1t),g=r.pick(p,n._scene,N1t);if(l(g)){let f=h.cartesianToCartographic(g),x=r._surface.tileProvider._tilesToRenderByTextureCount;for(let _=0;!u&&_<x.length;++_){let C=x[_];if(l(C))for(let V=0;!u&&V<C.length;++V){let L=C[V];le.contains(L.rectangle,f)&&(u=L)}}}n.tile=u,n.pickTileActive=!1}this._pickTile=Ln(function(){n.pickTileActive=!n.pickTileActive}),this._pickTileActiveSubscription=Te.getObservable(this,"pickTileActive").subscribe(function(d){d?o.setInputAction(c,Sn.LEFT_CLICK):o.removeInputAction(Sn.LEFT_CLICK)}),this._removePostRenderEvent=e.postRender.addEventListener(function(){n._update()})}Object.defineProperties(E9.prototype,{scene:{get:function(){return this._scene}},performanceContainer:{get:function(){return this._performanceContainer}},toggleDropDown:{get:function(){return this._toggleDropDown}},showPrimitiveBoundingSphere:{get:function(){return this._showPrimitiveBoundingSphere}},showPrimitiveReferenceFrame:{get:function(){return this._showPrimitiveReferenceFrame}},doFilterPrimitive:{get:function(){return this._doFilterPrimitive}},incrementDepthFrustum:{get:function(){return this._incrementDepthFrustum}},decrementDepthFrustum:{get:function(){return this._decrementDepthFrustum}},showTileCoordinates:{get:function(){return this._showTileCoordinates}},showTileBoundingSphere:{get:function(){return this._showTileBoundingSphere}},doFilterTile:{get:function(){return this._doFilterTile}},toggleGeneral:{get:function(){return this._toggleGeneral}},togglePrimitives:{get:function(){return this._togglePrimitives}},toggleTerrain:{get:function(){return this._toggleTerrain}},pickPrimitive:{get:function(){return this._pickPrimitive}},pickTile:{get:function(){return this._pickTile}},selectParent:{get:function(){let e=this;return Ln(function(){e.tile=e.tile.parent})}},selectNW:{get:function(){let e=this;return Ln(function(){e.tile=e.tile.northwestChild})}},selectNE:{get:function(){let e=this;return Ln(function(){e.tile=e.tile.northeastChild})}},selectSW:{get:function(){let e=this;return Ln(function(){e.tile=e.tile.southwestChild})}},selectSE:{get:function(){let e=this;return Ln(function(){e.tile=e.tile.southeastChild})}},primitive:{get:function(){return this._primitive},set:function(e){let t=this._primitive;e!==t&&(this.hasPickedPrimitive=!0,l(t)&&(t.debugShowBoundingVolume=!1),this._scene.debugCommandFilter=void 0,l(this._modelMatrixPrimitive)&&(this._scene.primitives.remove(this._modelMatrixPrimitive),this._modelMatrixPrimitive=void 0),this._primitive=e,e.show=!1,setTimeout(function(){e.show=!0},50),this.showPrimitiveBoundingSphere(),this.showPrimitiveReferenceFrame(),this.doFilterPrimitive())}},tile:{get:function(){return this._tile},set:function(e){if(l(e)){this.hasPickedTile=!0;let t=this._tile;if(e!==t){this.tileText=`L: ${e.level} X: ${e.x} Y: ${e.y}`,this.tileText+=`<br>SW corner: ${e.rectangle.west}, ${e.rectangle.south}`,this.tileText+=`<br>NE corner: ${e.rectangle.east}, ${e.rectangle.north}`;let n=e.data;l(n)&&l(n.tileBoundingRegion)?this.tileText+=`<br>Min: ${n.tileBoundingRegion.minimumHeight} Max: ${n.tileBoundingRegion.maximumHeight}`:this.tileText+="<br>(Tile is not loaded)"}this._tile=e,this.showTileBoundingSphere(),this.doFilterTile()}else this.hasPickedTile=!1,this._tile=void 0}}});E9.prototype._update=function(){this.frustums&&(this.frustumStatisticText=A1t(this._scene.debugFrustumStatistics));let e=this._scene.numberOfFrustums;this._numberOfFrustums=e,this.depthFrustum=uq(1,e,this.depthFrustum),this.depthFrustumText=`${this.depthFrustum} of ${e}`,this.performance&&this._performanceDisplay.update(),this.primitiveReferenceFrame&&(this._modelMatrixPrimitive.modelMatrix=this._primitive.modelMatrix),this.shaderCacheText=`Cached shaders: ${this._scene.context.shaderCache.numberOfShaders}`};E9.prototype.isDestroyed=function(){return!1};E9.prototype.destroy=function(){return this._eventHandler.destroy(),this._removePostRenderEvent(),this._frustumsSubscription.dispose(),this._frustumPlanesSubscription.dispose(),this._performanceSubscription.dispose(),this._primitiveBoundingSphereSubscription.dispose(),this._primitiveReferenceFrameSubscription.dispose(),this._filterPrimitiveSubscription.dispose(),this._wireframeSubscription.dispose(),this._depthFrustumSubscription.dispose(),this._suspendUpdatesSubscription.dispose(),this._tileCoordinatesSubscription.dispose(),this._tileBoundingSphereSubscription.dispose(),this._filterTileSubscription.dispose(),this._pickPrimitiveActiveSubscription.dispose(),this._pickTileActiveSubscription.dispose(),me(this)};var I9=E9;function wB(e,t){e=Wn(e);let n=document.createElement("div"),i=new I9(t,n);this._viewModel=i,this._container=e;let o=document.createElement("div");this._element=o;let r=document.createElement("div");r.textContent="Cesium Inspector",r.className="cesium-cesiumInspector-button",r.setAttribute("data-bind","click: toggleDropDown"),o.appendChild(r),o.className="cesium-cesiumInspector",o.setAttribute("data-bind",'css: { "cesium-cesiumInspector-visible" : dropDownVisible, "cesium-cesiumInspector-hidden" : !dropDownVisible }'),e.appendChild(this._element);let s=document.createElement("div");s.className="cesium-cesiumInspector-dropDown",o.appendChild(s);let a=qa.createSection,c=qa.createCheckbox,d=a(s,"General","generalVisible","toggleGeneral"),u=c("Show Frustums","frustums"),h=document.createElement("div");h.className="cesium-cesiumInspector-frustumStatistics",h.setAttribute("data-bind","visible: frustums, html: frustumStatisticText"),u.appendChild(h),d.appendChild(u),d.appendChild(c("Show Frustum Planes","frustumPlanes")),d.appendChild(c("Performance Display","performance")),n.className="cesium-cesiumInspector-performanceDisplay",d.appendChild(n);let p=document.createElement("div");p.className="cesium-cesiumInspector-shaderCache",p.setAttribute("data-bind","html: shaderCacheText"),d.appendChild(p);let g=document.createElement("div");d.appendChild(g);let f=document.createElement("span");f.setAttribute("data-bind",'html: "     Frustum:"'),g.appendChild(f);let x=document.createElement("span");x.setAttribute("data-bind","text: depthFrustumText"),g.appendChild(x);let _=document.createElement("input");_.type="button",_.value="-",_.className="cesium-cesiumInspector-pickButton",_.setAttribute("data-bind","click: decrementDepthFrustum"),g.appendChild(_);let C=document.createElement("input");C.type="button",C.value="+",C.className="cesium-cesiumInspector-pickButton",C.setAttribute("data-bind","click: incrementDepthFrustum"),g.appendChild(C);let V=a(s,"Primitives","primitivesVisible","togglePrimitives"),L=document.createElement("div");L.className="cesium-cesiumInspector-pickSection",V.appendChild(L);let R=document.createElement("input");R.type="button",R.value="Pick a primitive",R.className="cesium-cesiumInspector-pickButton",R.setAttribute("data-bind",'css: {"cesium-cesiumInspector-pickButtonHighlight" : pickPrimitiveActive}, click: pickPrimitive');let G=document.createElement("div");G.className="cesium-cesiumInspector-center",G.appendChild(R),L.appendChild(G),L.appendChild(c("Show bounding sphere","primitiveBoundingSphere","hasPickedPrimitive")),L.appendChild(c("Show reference frame","primitiveReferenceFrame","hasPickedPrimitive")),this._primitiveOnly=c("Show only selected","filterPrimitive","hasPickedPrimitive"),L.appendChild(this._primitiveOnly);let I=a(s,"Terrain","terrainVisible","toggleTerrain"),v=document.createElement("div");v.className="cesium-cesiumInspector-pickSection",I.appendChild(v);let P=document.createElement("input");P.type="button",P.value="Pick a tile",P.className="cesium-cesiumInspector-pickButton",P.setAttribute("data-bind",'css: {"cesium-cesiumInspector-pickButtonHighlight" : pickTileActive}, click: pickTile'),G=document.createElement("div"),G.appendChild(P),G.className="cesium-cesiumInspector-center",v.appendChild(G);let w=document.createElement("div");v.appendChild(w);let A=document.createElement("input");A.type="button",A.value="Parent",A.className="cesium-cesiumInspector-pickButton",A.setAttribute("data-bind","click: selectParent");let b=document.createElement("input");b.type="button",b.value="NW",b.className="cesium-cesiumInspector-pickButton",b.setAttribute("data-bind","click: selectNW");let Z=document.createElement("input");Z.type="button",Z.value="NE",Z.className="cesium-cesiumInspector-pickButton",Z.setAttribute("data-bind","click: selectNE");let E=document.createElement("input");E.type="button",E.value="SW",E.className="cesium-cesiumInspector-pickButton",E.setAttribute("data-bind","click: selectSW");let X=document.createElement("input");X.type="button",X.value="SE",X.className="cesium-cesiumInspector-pickButton",X.setAttribute("data-bind","click: selectSE");let F=document.createElement("div");F.className="cesium-cesiumInspector-tileText",w.className="cesium-cesiumInspector-frustumStatistics",w.appendChild(F),w.setAttribute("data-bind","visible: hasPickedTile"),F.setAttribute("data-bind","html: tileText");let N=document.createElement("div");N.className="cesium-cesiumInspector-relativeText",N.textContent="Select relative:",w.appendChild(N);let O=document.createElement("table"),U=document.createElement("tr"),Y=document.createElement("tr"),k=document.createElement("td");k.appendChild(A);let H=document.createElement("td");H.appendChild(b);let K=document.createElement("td");K.appendChild(Z),U.appendChild(k),U.appendChild(H),U.appendChild(K);let te=document.createElement("td"),z=document.createElement("td");z.appendChild(E);let j=document.createElement("td");j.appendChild(X),Y.appendChild(te),Y.appendChild(z),Y.appendChild(j),O.appendChild(U),O.appendChild(Y),w.appendChild(O),v.appendChild(c("Show bounding volume","tileBoundingSphere","hasPickedTile")),v.appendChild(c("Show only selected","filterTile","hasPickedTile")),I.appendChild(c("Wireframe","wireframe")),I.appendChild(c("Suspend LOD update","suspendUpdates")),I.appendChild(c("Show tile coordinates","tileCoordinates")),Te.applyBindings(i,this._element)}Object.defineProperties(wB.prototype,{container:{get:function(){return this._container}},viewModel:{get:function(){return this._viewModel}}});wB.prototype.isDestroyed=function(){return!1};wB.prototype.destroy=function(){return Te.cleanNode(this._element),this._container.removeChild(this._element),this.viewModel.destroy(),me(this)};var X9=wB;var PGo=T(S(),1);var RGo=T(S(),1);function DCe(e){e=y(e,y.EMPTY_OBJECT);let t=e.globe,n=y(e.imageryProviderViewModels,[]),i=y(e.terrainProviderViewModels,[]);this._globe=t,this.imageryProviderViewModels=n.slice(0),this.terrainProviderViewModels=i.slice(0),this.dropDownVisible=!1,Te.track(this,["imageryProviderViewModels","terrainProviderViewModels","dropDownVisible"]);let o=Te.getObservable(this,"imageryProviderViewModels"),r=Te.pureComputed(function(){let h=o(),p={},g;for(g=0;g<h.length;g++){let _=h[g],C=_.category;l(p[C])?p[C].push(_):p[C]=[_]}let f=Object.keys(p),x=[];for(g=0;g<f.length;g++){let _=f[g];x.push({name:_,providers:p[_]})}return x});this._imageryProviders=r;let s=Te.getObservable(this,"terrainProviderViewModels"),a=Te.pureComputed(function(){let h=s(),p={},g;for(g=0;g<h.length;g++){let _=h[g],C=_.category;l(p[C])?p[C].push(_):p[C]=[_]}let f=Object.keys(p),x=[];for(g=0;g<f.length;g++){let _=f[g];x.push({name:_,providers:p[_]})}return x});this._terrainProviders=a,this.buttonTooltip=void 0,Te.defineProperty(this,"buttonTooltip",function(){let h=this.selectedImagery,p=this.selectedTerrain,g=l(h)?h.name:void 0,f=l(p)?p.name:void 0;return l(g)&&l(f)?`${g} ${f}`:l(g)?g:f}),this.buttonImageUrl=void 0,Te.defineProperty(this,"buttonImageUrl",function(){let h=this.selectedImagery;if(l(h))return h.iconUrl}),this.selectedImagery=void 0;let c=Te.observable();this.updateSelectedImageryViewModel=h=>{c(h),this.dropDownVisible=!1},this._currentImageryLayers=[],Te.defineProperty(this,"selectedImagery",{get:function(){return c()},set:function(h){if(c()===h){this.dropDownVisible=!1;return}let p=e.map,g,f=this._currentImageryLayers,x=f.length,_=this._globe.imageryLayers,C=!1;if(!p)for(g=0;g<x;g++){let V=_.length;for(let L=0;L<V;L++){let R=_.get(L);if(R===f[g]){_.remove(R),C=!0;break}}}if(l(h))if(p&&h.marsOptions)p.basemap=h.marsOptions.layerId;else if(p&&h.options&&h.isTile)p.basemap=h.options.id;else{let V=h.creationCommand();if(Array.isArray(V)){let L=V.length;for(this._currentImageryLayers=[],g=L-1;g>=0;g--){let R=Ja.fromProviderAsync(V[g]);_.add(R,0),this._currentImageryLayers.push(R)}}else{this._currentImageryLayers=[];let L=Ja.fromProviderAsync(V);if(L.name=h.name,C)_.add(L,0);else{let R=_.get(0);l(R)&&_.remove(R),_.add(L,0)}this._currentImageryLayers.push(L)}}else p&&(p.basemap=void 0);c(h),this.dropDownVisible=!1}}),this.selectedTerrain=void 0;let d=Te.observable();this.updateSelectedTerrainViewModel=h=>{d(h),this.dropDownVisible=!1},Te.defineProperty(this,"selectedTerrain",{get:function(){return d()},set:function(h){if(d()===h){this.dropDownVisible=!1;return}let p;if(l(h)&&(p=h.creationCommand()),l(p)&&!l(p.then)){if(e.map&&h.marsOptions){e.map.terrainProvider=p;return}this._globe.terrainProvider=p}else if(l(p)){let g=!1,f=this._globe.terrainProviderChanged.addEventListener(()=>{g=!0,f()}),_=new m9(p).readyEvent.addEventListener(C=>{if(!g){if(e.map&&h.marsOptions){e.map.terrainProvider=C;return}this._globe.terrainProvider=C,_()}})}d(h),this.dropDownVisible=!1}});let u=this;this._toggleDropDown=Ln(function(){u.dropDownVisible=!u.dropDownVisible}),this.selectedImagery=y(e.selectedImageryProviderViewModel),this.selectedTerrain=e.selectedTerrainProviderViewModel}Object.defineProperties(DCe.prototype,{toggleDropDown:{get:function(){return this._toggleDropDown}},globe:{get:function(){return this._globe}}});var W9=DCe;function FB(e,t){e=Wn(e);let n=new W9(t),i=document.createElement("button");i.type="button",i.className="cesium-button cesium-toolbar-button",i.setAttribute("data-bind","attr: { title: buttonTooltip },click: toggleDropDown"),e.appendChild(i);let o=document.createElement("img");o.setAttribute("draggable","false"),o.className="cesium-baseLayerPicker-selected",o.setAttribute("data-bind","attr: { src: buttonImageUrl }, visible: !!buttonImageUrl"),i.appendChild(o);let r=document.createElement("div");r.className="cesium-baseLayerPicker-dropDown",r.setAttribute("data-bind",'css: { "cesium-baseLayerPicker-dropDown-visible" : dropDownVisible }'),e.appendChild(r);let s=document.createElement("div");s.className="cesium-baseLayerPicker-sectionTitle",s.setAttribute("data-bind","visible: imageryProviderViewModels.length > 0"),s.innerHTML="Imagery",r.appendChild(s);let a=document.createElement("div");a.className="cesium-baseLayerPicker-section",a.setAttribute("data-bind","foreach: _imageryProviders"),r.appendChild(a);let c=document.createElement("div");c.className="cesium-baseLayerPicker-category",a.appendChild(c);let d=document.createElement("div");d.className="cesium-baseLayerPicker-categoryTitle",d.setAttribute("data-bind","text: name"),c.appendChild(d);let u=document.createElement("div");u.className="cesium-baseLayerPicker-choices",u.setAttribute("data-bind","foreach: providers"),c.appendChild(u);let h=document.createElement("div");h.className="cesium-baseLayerPicker-item",h.setAttribute("data-bind",'css: { "cesium-baseLayerPicker-selectedItem" : $data === $parents[1].selectedImagery },attr: { title: tooltip },visible: creationCommand.canExecute,click: function($data) { $parents[1].selectedImagery = $data; }'),u.appendChild(h);let p=document.createElement("img");p.className="cesium-baseLayerPicker-itemIcon",p.setAttribute("data-bind","attr: { src: iconUrl }"),p.setAttribute("draggable","false"),h.appendChild(p);let g=document.createElement("div");g.className="cesium-baseLayerPicker-itemLabel",g.setAttribute("data-bind","text: name"),h.appendChild(g);let f=document.createElement("div");f.className="cesium-baseLayerPicker-sectionTitle",f.setAttribute("data-bind","visible: terrainProviderViewModels.length > 0"),f.innerHTML="Terrain",r.appendChild(f);let x=document.createElement("div");x.className="cesium-baseLayerPicker-section",x.setAttribute("data-bind","foreach: _terrainProviders"),r.appendChild(x);let _=document.createElement("div");_.className="cesium-baseLayerPicker-category",x.appendChild(_);let C=document.createElement("div");C.className="cesium-baseLayerPicker-categoryTitle",C.setAttribute("data-bind","text: name"),_.appendChild(C);let V=document.createElement("div");V.className="cesium-baseLayerPicker-choices",V.setAttribute("data-bind","foreach: providers"),_.appendChild(V);let L=document.createElement("div");L.className="cesium-baseLayerPicker-item",L.setAttribute("data-bind",'css: { "cesium-baseLayerPicker-selectedItem" : $data === $parents[1].selectedTerrain },attr: { title: tooltip },visible: creationCommand.canExecute,click: function($data) { $parents[1].selectedTerrain = $data; }'),V.appendChild(L);let R=document.createElement("img");R.className="cesium-baseLayerPicker-itemIcon",R.setAttribute("data-bind","attr: { src: iconUrl }"),R.setAttribute("draggable","false"),L.appendChild(R);let G=document.createElement("div");G.className="cesium-baseLayerPicker-itemLabel",G.setAttribute("data-bind","text: name"),L.appendChild(G),Te.applyBindings(n,i),Te.applyBindings(n,r),this._viewModel=n,this._container=e,this._element=i,this._dropPanel=r,this._closeDropDown=function(I){i.contains(I.target)||r.contains(I.target)||(n.dropDownVisible=!1)},Ot.supportsPointerEvents()?document.addEventListener("pointerdown",this._closeDropDown,!0):(document.addEventListener("mousedown",this._closeDropDown,!0),document.addEventListener("touchstart",this._closeDropDown,!0))}Object.defineProperties(FB.prototype,{container:{get:function(){return this._container}},viewModel:{get:function(){return this._viewModel}}});FB.prototype.isDestroyed=function(){return!1};FB.prototype.destroy=function(){return Ot.supportsPointerEvents()?document.removeEventListener("pointerdown",this._closeDropDown,!0):(document.removeEventListener("mousedown",this._closeDropDown,!0),document.removeEventListener("touchstart",this._closeDropDown,!0)),Te.cleanNode(this._element),Te.cleanNode(this._dropPanel),this._container.removeChild(this._element),this._container.removeChild(this._dropPanel),me(this)};var P9=FB;var BGo=T(S(),1);var NGo=T(S(),1);function BCe(e){let t=e.creationFunction;l(t.canExecute)||(t=Ln(t)),this._creationCommand=t,this.name=e.name,this.tooltip=e.tooltip,this.iconUrl=e.iconUrl,this._category=y(e.category,""),this.marsOptions=e.marsOptions,Te.track(this,["name","tooltip","iconUrl"])}Object.defineProperties(BCe.prototype,{creationCommand:{get:function(){return this._creationCommand}},category:{get:function(){return this._category}}});var ds=BCe;function k1t(){let e=[],t=devicePixelRatio>=2;return e.push(new ds({name:"Bing Maps Aerial",iconUrl:on("Widgets/Images/ImageryProviders/bingAerial.png"),tooltip:"Bing Maps aerial imagery, provided by Cesium ion",category:"Cesium ion",creationFunction:function(){return x0({style:y0.AERIAL})}})),e.push(new ds({name:"Bing Maps Aerial with Labels",iconUrl:on("Widgets/Images/ImageryProviders/bingAerialLabels.png"),tooltip:"Bing Maps aerial imagery with labels, provided by Cesium ion",category:"Cesium ion",creationFunction:function(){return x0({style:y0.AERIAL_WITH_LABELS})}})),e.push(new ds({name:"Bing Maps Roads",iconUrl:on("Widgets/Images/ImageryProviders/bingRoads.png"),tooltip:"Bing Maps standard road maps, provided by Cesium ion",category:"Cesium ion",creationFunction:function(){return x0({style:y0.ROAD})}})),e.push(new ds({name:"ArcGIS World Imagery",iconUrl:on("Widgets/Images/ImageryProviders/ArcGisMapServiceWorldImagery.png"),tooltip:`ArcGIS World Imagery provides one meter or better satellite and aerial imagery in many parts of the world and lower resolution satellite imagery worldwide. The map includes 15m TerraColor imagery at small and mid-scales (~1:591M down to ~1:288k) for the world. The map features Maxar imagery at 0.3m resolution for select metropolitan areas around the world, 0.5m resolution across the United States and parts of Western Europe, and 1m resolution imagery across the rest of the world. In addition to commercial sources, the World Imagery map features high-resolution aerial photography contributed by the GIS User Community. This imagery ranges from 0.3m to 0.03m resolution (down to ~1:280 nin select communities). For more information on this map, including the terms of use, visit us online at https://www.arcgis.com/home/item.html?id=10df2279f9684e4a9f6a7f08febac2a9`,category:"Other",creationFunction:function(){return b0.fromBasemapType(kh.SATELLITE,{enablePickFeatures:!1})}})),e.push(new ds({name:"ArcGIS World Hillshade",iconUrl:on("Widgets/Images/ImageryProviders/ArcGisMapServiceWorldHillshade.png"),tooltip:`ArcGIS World Hillshade map portrays elevation as an artistic hillshade. This map is designed to be used as a backdrop for topographical, soil, hydro, landcover or other outdoor recreational maps. The map was compiled from a variety of sources from several data providers. The basemap has global coverage down to a scale of ~1:72k. In select areas of the United States and Europe, coverage is available down to ~1:9k. For more information on this map, including the terms of use, visit us online at https://www.arcgis.com/home/item.html?id=1b243539f4514b6ba35e7d995890db1d`,category:"Other",creationFunction:function(){return b0.fromBasemapType(kh.HILLSHADE,{enablePickFeatures:!1})}})),e.push(new ds({name:"Esri World Ocean",iconUrl:on("Widgets/Images/ImageryProviders/ArcGisMapServiceWorldOcean.png"),tooltip:`ArcGIS World Ocean map is designed to be used as a base map by marine GIS professionals and as a reference map by anyone interested in ocean data. The base map features marine bathymetry. Land features include inland waters and roads overlaid on land cover and shaded relief imagery. The map was compiled from a variety of best available sources from several data providers, including General Bathymetric Chart of the Oceans GEBCO_08 Grid, National Oceanic and Atmospheric Administration (NOAA), and National Geographic, Garmin, HERE, Geonames.org, and Esri, and various other contributors. The base map currently provides coverage for the world down to a scale of ~1:577k, and coverage down to 1:72k in US coastal areas, and various other areas. Coverage down to ~ 1:9k is available limited areas based on regional hydrographic survey data. The base map was designed and developed by Esri. For more information on this map, including our terms of use, visit us online at https://www.arcgis.com/home/item.html?id=1e126e7520f9466c9ca28b8f28b5e500`,category:"Other",creationFunction:function(){return b0.fromBasemapType(kh.OCEANS,{enablePickFeatures:!1})}})),e.push(new ds({name:"Open\xADStreet\xADMap",iconUrl:on("Widgets/Images/ImageryProviders/openStreetMap.png"),tooltip:`OpenStreetMap (OSM) is a collaborative project to create a free editable map of the world. http://www.openstreetmap.org`,category:"Other",creationFunction:function(){return new A0({url:"https://tile.openstreetmap.org/"})}})),e.push(new ds({name:"Stadia x Stamen Watercolor",iconUrl:on("Widgets/Images/ImageryProviders/stamenWatercolor.png"),tooltip:`Based on the original basemaps created for the Knight Foundation and reminiscent of hand drawn maps, the watercolor maps from Stamen Design apply raster effect area washes and organic edges over a paper texture to add warm pop to any map. https://docs.stadiamaps.com/map-styles/stamen-watercolor/`,category:"Other",creationFunction:function(){return new A0({url:"https://tiles.stadiamaps.com/tiles/stamen_watercolor/",fileExtension:"jpg",credit:`© <a href="https://stamen.com/" target="_blank">Stamen Design</a> © <a href="https://www.stadiamaps.com/" target="_blank">Stadia Maps</a> © <a href="https://openmaptiles.org/" target="_blank">OpenMapTiles</a> © <a href="https://www.openstreetmap.org/about/" target="_blank">OpenStreetMap contributors</a>`})}})),e.push(new ds({name:"Stadia x Stamen Toner",iconUrl:on("Widgets/Images/ImageryProviders/stamenToner.png"),tooltip:`Based on the original basemaps created for the Knight Foundation and the most popular of the excellent styles from Stamen Design, these high-contrast B+W (black and white) maps are the perfect backdrop for your colorful and eye-catching overlays. https://docs.stadiamaps.com/map-styles/stamen-toner/`,category:"Other",creationFunction:function(){return new A0({url:"https://tiles.stadiamaps.com/tiles/stamen_toner/",retinaTiles:t,credit:`© <a href="https://stamen.com/" target="_blank">Stamen Design</a> © <a href="https://www.stadiamaps.com/" target="_blank">Stadia Maps</a> © <a href="https://openmaptiles.org/" target="_blank">OpenMapTiles</a> © <a href="https://www.openstreetmap.org/about/" target="_blank">OpenStreetMap contributors</a>`})}})),e.push(new ds({name:"Stadia Alidade Smooth",iconUrl:on("Widgets/Images/ImageryProviders/stadiaAlidadeSmooth.png"),tooltip:`Stadia's custom Alidade Smooth style is designed for maps that use a lot of markers or overlays. It features a muted color scheme and fewer points of interest to allow your added data to shine. https://docs.stadiamaps.com/map-styles/alidade-smooth/`,category:"Other",creationFunction:function(){return new A0({url:"https://tiles.stadiamaps.com/tiles/alidade_smooth/",retinaTiles:t,credit:`© <a href="https://www.stadiamaps.com/" target="_blank">Stadia Maps</a> © <a href="https://openmaptiles.org/" target="_blank">OpenMapTiles</a> © <a href="https://www.openstreetmap.org/about/" target="_blank">OpenStreetMap contributors</a>`})}})),e.push(new ds({name:"Stadia Alidade Smooth Dark",iconUrl:on("Widgets/Images/ImageryProviders/stadiaAlidadeSmoothDark.png"),tooltip:`Stadia Alidade Smooth Dark, like its lighter cousin, is also designed to stay out of the way. It just flips the dark mode switch on the color scheme. With the lights out, your data can now literally shine. https://docs.stadiamaps.com/map-styles/alidade-smooth-dark/`,category:"Other",creationFunction:function(){return new A0({url:"https://tiles.stadiamaps.com/tiles/alidade_smooth_dark/",retinaTiles:t,credit:`© <a href="https://www.stadiamaps.com/" target="_blank">Stadia Maps</a> © <a href="https://openmaptiles.org/" target="_blank">OpenMapTiles</a> © <a href="https://www.openstreetmap.org/about/" target="_blank">OpenStreetMap contributors</a>`})}})),e.push(new ds({name:"Sentinel-2",iconUrl:on("Widgets/Images/ImageryProviders/sentinel-2.png"),tooltip:"Sentinel-2 cloudless by EOX IT Services GmbH (Contains modified Copernicus Sentinel data 2016 and 2017).",category:"Cesium ion",creationFunction:function(){return g0.fromAssetId(3954)}})),e.push(new ds({name:"Blue Marble",iconUrl:on("Widgets/Images/ImageryProviders/blueMarble.png"),tooltip:"Blue Marble Next Generation July, 2004 imagery from NASA.",category:"Cesium ion",creationFunction:function(){return g0.fromAssetId(3845)}})),e.push(new ds({name:"Earth at night",iconUrl:on("Widgets/Images/ImageryProviders/earthAtNight.png"),tooltip:"The Earth at night, also known as The Black Marble, is a 500 meter resolution global composite imagery layer released by NASA.",category:"Cesium ion",creationFunction:function(){return g0.fromAssetId(3812)}})),e.push(new ds({name:"Natural Earth\xA0II",iconUrl:on("Widgets/Images/ImageryProviders/naturalEarthII.png"),tooltip:`Natural Earth II, darkened for contrast. http://www.naturalearthdata.com/`,category:"Cesium ion",creationFunction:function(){return Py.fromUrl(on("Assets/Textures/NaturalEarthII"))}})),e}var v9=k1t;var zGo=T(S(),1);function U1t(){let e=[];return e.push(new ds({name:"WGS84 Ellipsoid",iconUrl:on("Widgets/Images/TerrainProviders/Ellipsoid.png"),tooltip:"WGS84 standard ellipsoid, also known as EPSG:4326",category:"Cesium ion",creationFunction:function(){return new YT({ellipsoid:ne.WGS84})}})),e.push(new ds({name:"Cesium World Terrain",iconUrl:on("Widgets/Images/TerrainProviders/CesiumWorldTerrain.png"),tooltip:"High-resolution global terrain tileset curated from several datasources and hosted by Cesium ion",category:"Cesium ion",creationFunction:function(){return IS({requestWaterMask:!0,requestVertexNormals:!0})}})),e}var w9=U1t;var sEo=T(S(),1);var $Go=T(S(),1);function AB(e,t){l(t)||(t=document.body),t=Wn(t);let n=this,i=Te.observable(xr.fullscreen),o=Te.observable(xr.enabled),r=t.ownerDocument;this.isFullscreen=void 0,Te.defineProperty(this,"isFullscreen",{get:function(){return i()}}),this.isFullscreenEnabled=void 0,Te.defineProperty(this,"isFullscreenEnabled",{get:function(){return o()},set:function(s){o(s&&xr.enabled)}}),this.tooltip=void 0,Te.defineProperty(this,"tooltip",function(){return this.isFullscreenEnabled?i()?"Exit full screen":"Full screen":"Full screen unavailable"}),this._command=Ln(function(){xr.fullscreen?xr.exitFullscreen():xr.requestFullscreen(n._fullscreenElement)},Te.getObservable(this,"isFullscreenEnabled")),this._fullscreenElement=y(Wn(e),r.body),this._callback=function(){i(xr.fullscreen)},r.addEventListener(xr.changeEventName,this._callback)}Object.defineProperties(AB.prototype,{fullscreenElement:{get:function(){return this._fullscreenElement},set:function(e){this._fullscreenElement=e}},command:{get:function(){return this._command}}});AB.prototype.isDestroyed=function(){return!1};AB.prototype.destroy=function(){document.removeEventListener(xr.changeEventName,this._callback),me(this)};var F9=AB;var D1t="M 83.96875 17.5625 L 83.96875 17.59375 L 76.65625 24.875 L 97.09375 24.96875 L 76.09375 45.96875 L 81.9375 51.8125 L 102.78125 30.9375 L 102.875 51.15625 L 110.15625 43.875 L 110.1875 17.59375 L 83.96875 17.5625 z M 44.125 17.59375 L 17.90625 17.625 L 17.9375 43.90625 L 25.21875 51.1875 L 25.3125 30.96875 L 46.15625 51.8125 L 52 45.96875 L 31 25 L 51.4375 24.90625 L 44.125 17.59375 z M 46.0625 76.03125 L 25.1875 96.875 L 25.09375 76.65625 L 17.8125 83.9375 L 17.8125 110.21875 L 44 110.25 L 51.3125 102.9375 L 30.90625 102.84375 L 51.875 81.875 L 46.0625 76.03125 z M 82 76.15625 L 76.15625 82 L 97.15625 103 L 76.71875 103.0625 L 84.03125 110.375 L 110.25 110.34375 L 110.21875 84.0625 L 102.9375 76.8125 L 102.84375 97 L 82 76.15625 z",B1t="M 104.34375 17.5625 L 83.5 38.4375 L 83.40625 18.21875 L 76.125 25.5 L 76.09375 51.78125 L 102.3125 51.8125 L 102.3125 51.78125 L 109.625 44.5 L 89.1875 44.40625 L 110.1875 23.40625 L 104.34375 17.5625 z M 23.75 17.59375 L 17.90625 23.4375 L 38.90625 44.4375 L 18.5 44.53125 L 25.78125 51.8125 L 52 51.78125 L 51.96875 25.53125 L 44.6875 18.25 L 44.625 38.46875 L 23.75 17.59375 z M 25.6875 76.03125 L 18.375 83.3125 L 38.78125 83.40625 L 17.8125 104.40625 L 23.625 110.25 L 44.5 89.375 L 44.59375 109.59375 L 51.875 102.3125 L 51.875 76.0625 L 25.6875 76.03125 z M 102.375 76.15625 L 76.15625 76.1875 L 76.1875 102.4375 L 83.46875 109.71875 L 83.5625 89.53125 L 104.40625 110.375 L 110.25 104.53125 L 89.25 83.53125 L 109.6875 83.46875 L 102.375 76.15625 z";function MB(e,t){e=Wn(e);let n=new F9(t,e);n._exitFullScreenPath=B1t,n._enterFullScreenPath=D1t;let i=document.createElement("button");i.type="button",i.className="cesium-button cesium-fullscreenButton",i.setAttribute("data-bind","attr: { title: tooltip },click: command,enable: isFullscreenEnabled,cesiumSvgPath: { path: isFullscreen ? _exitFullScreenPath : _enterFullScreenPath, width: 128, height: 128 }"),e.appendChild(i),Te.applyBindings(n,i),this._container=e,this._viewModel=n,this._element=i}Object.defineProperties(MB.prototype,{container:{get:function(){return this._container}},viewModel:{get:function(){return this._viewModel}}});MB.prototype.isDestroyed=function(){return!1};MB.prototype.destroy=function(){return this._viewModel.destroy(),Te.cleanNode(this._element),this._container.removeChild(this._element),me(this)};var A9=MB;var xEo=T(S(),1);var mEo=T(S(),1);var OCe=1e3;function Cm(e){l(e.geocoderServices)?this._geocoderServices=e.geocoderServices:this._geocoderServices=[new PS({scene:e.scene})],this._viewContainer=e.container,this._scene=e.scene,this._flightDuration=e.flightDuration,this._searchText="",this._isSearchInProgress=!1,this._wasGeocodeCancelled=!1,this._previousCredits=[],this._complete=new be,this._suggestions=[],this._selectedSuggestion=void 0,this._showSuggestions=!0,this._handleArrowDown=HCe,this._handleArrowUp=YCe;let t=this;this._suggestionsVisible=Te.pureComputed(function(){let o=Te.getObservable(t,"_suggestions")().length>0,r=Te.getObservable(t,"_showSuggestions")();return o&&r}),this._searchCommand=Ln(function(i){if(i=y(i,Qy.SEARCH),t._focusTextbox=!1,l(t._selectedSuggestion))return t.activateSuggestion(t._selectedSuggestion),!1;if(t.hideSuggestions(),t.isSearchInProgress)J1t(t);else return z1t(t,t._geocoderServices,i)}),this.deselectSuggestion=function(){t._selectedSuggestion=void 0},this.handleKeyDown=function(i,o){let r=o.key==="ArrowDown"||o.key==="Down"||o.keyCode===40,s=o.key==="ArrowUp"||o.key==="Up"||o.keyCode===38;return(r||s)&&o.preventDefault(),!0},this.handleKeyUp=function(i,o){let r=o.key==="ArrowDown"||o.key==="Down"||o.keyCode===40,s=o.key==="ArrowUp"||o.key==="Up"||o.keyCode===38,a=o.key==="Enter"||o.keyCode===13;return s?YCe(t):r?HCe(t):a&&t._searchCommand(),!0},this.activateSuggestion=function(i){t.hideSuggestions(),t._searchText=i.displayName;let o=i.destination;JCe(t),t.destinationFound(t,o)},this.hideSuggestions=function(){t._showSuggestions=!1,t._selectedSuggestion=void 0},this.showSuggestions=function(){t._showSuggestions=!0},this.handleMouseover=function(i,o){i!==t._selectedSuggestion&&(t._selectedSuggestion=i)},this.keepExpanded=!1,this.autoComplete=y(e.autocomplete,!0),this.destinationFound=y(e.destinationFound,Cm.flyToDestination),this._focusTextbox=!1,Te.track(this,["_searchText","_isSearchInProgress","keepExpanded","_suggestions","_selectedSuggestion","_showSuggestions","_focusTextbox"]);let n=Te.getObservable(this,"_searchText");n.extend({rateLimit:{timeout:500}}),this._suggestionSubscription=n.subscribe(function(){Cm._updateSearchSuggestions(t)}),this.isSearchInProgress=void 0,Te.defineProperty(this,"isSearchInProgress",{get:function(){return this._isSearchInProgress}}),this.searchText=void 0,Te.defineProperty(this,"searchText",{get:function(){return this.isSearchInProgress?"Searching...":this._searchText},set:function(i){this._searchText=i}}),this.flightDuration=void 0,Te.defineProperty(this,"flightDuration",{get:function(){return this._flightDuration},set:function(i){this._flightDuration=i}})}Object.defineProperties(Cm.prototype,{complete:{get:function(){return this._complete}},scene:{get:function(){return this._scene}},search:{get:function(){return this._searchCommand}},selectedSuggestion:{get:function(){return this._selectedSuggestion}},suggestions:{get:function(){return this._suggestions}}});Cm.prototype.destroy=function(){this._suggestionSubscription.dispose()};function YCe(e){if(e._suggestions.length===0)return;let t=e._suggestions.indexOf(e._selectedSuggestion);if(t===-1||t===0){e._selectedSuggestion=void 0;return}let n=t-1;e._selectedSuggestion=e._suggestions[n],Cm._adjustSuggestionsScroll(e,n)}function HCe(e){if(e._suggestions.length===0)return;let t=e._suggestions.length,i=(e._suggestions.indexOf(e._selectedSuggestion)+1)%t;e._selectedSuggestion=e._suggestions[i],Cm._adjustSuggestionsScroll(e,i)}function O1t(e,t){let n=l(t)?t.availability:void 0;return l(n)?DT(t,[e]).then(function(i){return e=i[0],e.height+=OCe,e}):(e.height+=OCe,Promise.resolve(e))}function Y1t(e,t){let n=e._scene,i=n.ellipsoid,o=n.camera,r=n.terrainProvider,s=t,a;return t instanceof le?W.equalsEpsilon(t.south,t.north,W.EPSILON7)&&W.equalsEpsilon(t.east,t.west,W.EPSILON7)?t=le.center(t):a=BT(t,n):t=i.cartesianToCartographic(t),l(a)||(a=O1t(t,r)),a.then(function(c){s=i.cartographicToCartesian(c)}).finally(function(){o.flyTo({destination:s,complete:function(){e._complete.raiseEvent()},duration:e._flightDuration,endTransform:M.IDENTITY})})}async function H1t(e,t,n){try{return{state:"fulfilled",value:await e.geocode(t,n),credits:e.credit}}catch(i){return{state:"rejected",reason:i}}}async function z1t(e,t,n){let i=e._searchText;if(KCe(i)){e.showSuggestions();return}e._isSearchInProgress=!0,e._wasGeocodeCancelled=!1;let o,r;for(o=0;o<t.length;o++){if(e._wasGeocodeCancelled)return;if(r=await H1t(t[o],i,n),l(r)&&r.state==="fulfilled"&&r.value.length>0)break}if(e._wasGeocodeCancelled)return;e._isSearchInProgress=!1,hq(e);let s=r.value;if(r.state==="fulfilled"&&l(s)&&s.length>0){e._searchText=s[0].displayName,e.destinationFound(e,s[0].destination);let a=zCe(e,DL.getCreditsFromResult(s[0]));l(a)||mq(e,t[o].credit);return}e._searchText=`${i} (not found)`}function mq(e,t){l(t)&&!e._scene.isDestroyed()&&!e._scene.frameState.creditDisplay.isDestroyed()&&(e._scene.frameState.creditDisplay.addStaticCredit(t),e._previousCredits.push(t))}function zCe(e,t){return l(t)&&t.forEach(n=>mq(e,n)),t}function hq(e){!e._scene.isDestroyed()&&!e._scene.frameState.creditDisplay.isDestroyed()&&e._previousCredits.forEach(t=>{e._scene.frameState.creditDisplay.removeStaticCredit(t)}),e._previousCredits.length=0}function K1t(e,t){let n=Wn(e._viewContainer),i=n.getElementsByClassName("search-results")[0],r=n.getElementsByTagName("li")[t];if(t===0){i.scrollTop=0;return}let s=r.offsetTop;s+r.clientHeight>i.clientHeight?i.scrollTop=s+r.clientHeight:s<i.scrollTop&&(i.scrollTop=s)}function J1t(e){e._isSearchInProgress&&(e._isSearchInProgress=!1,e._wasGeocodeCancelled=!0)}function KCe(e){return/^\s*$/.test(e)}function JCe(e){Te.getObservable(e,"_suggestions").removeAll()}async function Q1t(e){if(!e.autoComplete)return;let t=e._searchText;if(JCe(e),hq(e),!KCe(t))for(let n of e._geocoderServices){let i=await n.geocode(t,Qy.AUTOCOMPLETE);if(e._suggestions=e._suggestions.concat(i),i.length>0){let o=!0;i.forEach(r=>{let s=DL.getCreditsFromResult(r);o=o&&!l(s),zCe(e,s)}),o&&mq(e,n.credit)}if(e._suggestions.length>=5)return}}Cm.flyToDestination=Y1t;Cm._updateSearchSuggestions=Q1t;Cm._adjustSuggestionsScroll=K1t;Cm.prototype.isDestroyed=function(){return!1};Cm.prototype.destroy=function(){return hq(this),me(this)};var M9=Cm;var j1t="M29.772,26.433l-7.126-7.126c0.96-1.583,1.523-3.435,1.524-5.421C24.169,8.093,19.478,3.401,13.688,3.399C7.897,3.401,3.204,8.093,3.204,13.885c0,5.789,4.693,10.481,10.484,10.481c1.987,0,3.839-0.563,5.422-1.523l7.128,7.127L29.772,26.433zM7.203,13.885c0.006-3.582,2.903-6.478,6.484-6.486c3.579,0.008,6.478,2.904,6.484,6.486c-0.007,3.58-2.905,6.476-6.484,6.484C10.106,20.361,7.209,17.465,7.203,13.885z",q1t="M24.778,21.419 19.276,15.917 24.777,10.415 21.949,7.585 16.447,13.087 10.945,7.585 8.117,10.415 13.618,15.917 8.116,21.419 10.946,24.248 16.447,18.746 21.948,24.248z";function NB(e){let t=Wn(e.container),n=new M9(e);n._startSearchPath=j1t,n._stopSearchPath=q1t;let i=document.createElement("form");i.setAttribute("data-bind","submit: search");let o=document.createElement("input");o.type="search",o.className="cesium-geocoder-input",o.setAttribute("placeholder","Enter an address or landmark..."),o.setAttribute("data-bind",'textInput: searchText,disable: isSearchInProgress,event: { keyup: handleKeyUp, keydown: handleKeyDown, mouseover: deselectSuggestion },css: { "cesium-geocoder-input-wide" : keepExpanded || searchText.length > 0 },hasFocus: _focusTextbox'),this._onTextBoxFocus=function(){setTimeout(function(){o.select()},0)},o.addEventListener("focus",this._onTextBoxFocus,!1),i.appendChild(o),this._textBox=o;let r=document.createElement("span");r.className="cesium-geocoder-searchButton",r.setAttribute("data-bind","click: search,cesiumSvgPath: { path: isSearchInProgress ? _stopSearchPath : _startSearchPath, width: 32, height: 32 }"),i.appendChild(r),t.appendChild(i);let s=document.createElement("div");s.className="search-results",s.setAttribute("data-bind","visible: _suggestionsVisible");let a=document.createElement("ul");a.setAttribute("data-bind","foreach: _suggestions");let c=document.createElement("li");a.appendChild(c),c.setAttribute("data-bind","text: $data.displayName, click: $parent.activateSuggestion, event: { mouseover: $parent.handleMouseover}, css: { active: $data === $parent._selectedSuggestion }"),s.appendChild(a),t.appendChild(s),Te.applyBindings(n,i),Te.applyBindings(n,s),this._container=t,this._searchSuggestionsContainer=s,this._viewModel=n,this._form=i,this._onInputBegin=function(d){let u=d.target;typeof d.composedPath=="function"&&(u=d.composedPath()[0]),t.contains(u)||(n._focusTextbox=!1,n.hideSuggestions())},this._onInputEnd=function(d){n._focusTextbox=!0,n.showSuggestions()},Ot.supportsPointerEvents()?(document.addEventListener("pointerdown",this._onInputBegin,!0),t.addEventListener("pointerup",this._onInputEnd,!0),t.addEventListener("pointercancel",this._onInputEnd,!0)):(document.addEventListener("mousedown",this._onInputBegin,!0),t.addEventListener("mouseup",this._onInputEnd,!0),document.addEventListener("touchstart",this._onInputBegin,!0),t.addEventListener("touchend",this._onInputEnd,!0),t.addEventListener("touchcancel",this._onInputEnd,!0))}Object.defineProperties(NB.prototype,{container:{get:function(){return this._container}},searchSuggestionsContainer:{get:function(){return this._searchSuggestionsContainer}},viewModel:{get:function(){return this._viewModel}}});NB.prototype.isDestroyed=function(){return!1};NB.prototype.destroy=function(){let e=this._container;return Ot.supportsPointerEvents()?(document.removeEventListener("pointerdown",this._onInputBegin,!0),e.removeEventListener("pointerup",this._onInputEnd,!0)):(document.removeEventListener("mousedown",this._onInputBegin,!0),e.removeEventListener("mouseup",this._onInputEnd,!0),document.removeEventListener("touchstart",this._onInputBegin,!0),e.removeEventListener("touchend",this._onInputEnd,!0)),this._viewModel.destroy(),Te.cleanNode(this._form),Te.cleanNode(this._searchSuggestionsContainer),e.removeChild(this._form),e.removeChild(this._searchSuggestionsContainer),this._textBox.removeEventListener("focus",this._onTextBoxFocus,!1),me(this)};var N9=NB;var IEo=T(S(),1);var CEo=T(S(),1);function QCe(e,t){this._scene=e,this._duration=t;let n=this;this._command=Ln(function(){n._scene.camera.flyHome(n._duration)}),this.tooltip="View Home",Te.track(this,["tooltip"])}Object.defineProperties(QCe.prototype,{scene:{get:function(){return this._scene}},command:{get:function(){return this._command}},duration:{get:function(){return this._duration},set:function(e){this._duration=e}}});var k9=QCe;function kB(e,t,n){e=Wn(e);let i=new k9(t,n);i._svgPath="M14,4l-10,8.75h20l-4.25-3.7188v-4.6562h-2.812v2.1875l-2.938-2.5625zm-7.0938,9.906v10.094h14.094v-10.094h-14.094zm2.1876,2.313h3.3122v4.25h-3.3122v-4.25zm5.8442,1.281h3.406v6.438h-3.406v-6.438z";let o=document.createElement("button");o.type="button",o.className="cesium-button cesium-toolbar-button cesium-home-button",o.setAttribute("data-bind","attr: { title: tooltip },click: command,cesiumSvgPath: { path: _svgPath, width: 28, height: 28 }"),e.appendChild(o),Te.applyBindings(i,o),this._container=e,this._viewModel=i,this._element=o}Object.defineProperties(kB.prototype,{container:{get:function(){return this._container}},viewModel:{get:function(){return this._viewModel}}});kB.prototype.isDestroyed=function(){return!1};kB.prototype.destroy=function(){return Te.cleanNode(this._element),this._container.removeChild(this._element),me(this)};var U9=kB;var kEo=T(S(),1);var vEo=T(S(),1);function $1t(e,t){t.currentTarget.parentElement.parentElement.querySelector(`#${e.name}-expander`).classList.toggle("active"),t.currentTarget.textContent=t.currentTarget.textContent==="+"?"-":"+"}function qCe(e,t){Te.track(e);for(let n=0;n<e.sublayers.length;n++)qCe(e.sublayers[n],t)}function UB(e){return e.modelName==="FullModel"}function $Ce(e){return e.modelName==="Overview"}function e1e(e){return $Ce(e)||UB(e)}function jCe(e,t){if(e1e(e)){e.visibility=!1;for(let i=0;i<e.sublayers.length;i++)e.sublayers[i].visibility=!0;let n={name:e.name,modelName:e.modelName,disable:Te.observable(!1),index:t.sublayers.length};return t.topLayers.push(n),t.sublayers.push(e),n}}function eVt(e,t){if(e1e(e)){t.sublayers.forEach(i=>i.visibility=!1),t.sublayers[e.index].visibility=!0;let n=document.getElementById("bsl-wrapper");UB(e)?(t.currentLevel=t.selectedLevel,n.style.display="block"):(t.selectedLevel=t.currentLevel,t.currentLevel="All",n.style.display="none")}}async function tVt(e,t){try{let n=e.getAttributeNames();for(let i=0;i<n.length;i++)if(n[i]==="BldgLevel"){let o=e.getAttributeValues(n[i]);for(let r=0;r<o.length;r++)t.push(o[r])}t.sort((i,o)=>i-o),t.unshift("All")}catch(n){console.log(`There was an error getting attributes: ${n}`)}}function nVt(e){let t=this;this.levels=[],this.viewModel={sublayers:[],levels:this.levels,currentLevel:Te.observable(),selectedLevel:"All",topLayers:[{name:"Select a layer to explore...",disable:Te.observable(!0),index:-1}],currentLayer:Te.observable(),expandClickHandler:$1t,setOptionDisable:function(i,o){Te.applyBindingsToNode(i,{disable:o.disable},o)},defaultLayer:void 0},this.viewModel.currentLayer.subscribe(function(i){eVt(i,t.viewModel)});let n=e.sublayers;for(let i=0;i<n.length;i++){qCe(n[i],this.viewModel);let o=jCe(n[i],this.viewModel);l(o)&&($Ce(o)||!l(this.viewModel.defaultLayer)&&UB(o))&&(this.viewModel.defaultLayer=o)}if(this.viewModel.topLayers.length===1&&n.length>0){e.show=!1;let i={name:"Full Model",modelName:"FullModel",visibility:e.show,sublayers:e.sublayers};this.viewModel.defaultLayer=jCe(i,this.viewModel),this.viewModel.currentLayer.subscribe(function(o){e.show=UB(o)})}else this.viewModel.topLayers.length===1&&(this.viewModel.topLayers[0].name="Building layers not found");return tVt(e,this.levels),this.viewModel.currentLevel.subscribe(function(i){i!=="All"?e.filterByAttributes([{name:"BldgLevel",values:[i]}]):e.filterByAttributes()}),this.viewModel}var D9=nVt;function iVt(e,t){let n=document.getElementById(e),i=document.createElement("div");i.classList.add("cesium-viewer-i3s-explorer"),i.innerHTML=` <h3>Building explorer</h3> <select data-bind="options: topLayers, optionsText: 'name', optionsAfterRender: setOptionDisable, value: currentLayer" ></select> <div id="bsl-wrapper"> <h3>Select Level</h3> <select data-bind="options: levels, value: currentLevel"></select> <h3>Disciplines & Categories</h3> <ul class="layersList" data-bind="foreach: sublayers"> <ul class="layersList" data-bind="foreach: sublayers.sort(function (l, r) { return l.name.localeCompare(r.name) })"> <li> <div class="li-wrapper"> <span class="expandItem" data-bind="click: $root.expandClickHandler" >+</span > <input type="checkbox" data-bind="checked: visibility, valueUpdate: 'input', attr: { id: name}" /> <label data-bind="attr: { for: name}"> <span data-bind="text: name"></span> </label> </div> <ul class="nested" data-bind="attr: { id: name + '-expander'}"> <li data-bind="foreach: sublayers.sort(function (l, r) { return l.name.localeCompare(r.name) })"> <div class="li-wrapper"> <input type="checkbox" data-bind="checked: visibility, valueUpdate: 'input', attr: { id: name}" /> <label data-bind="attr: { for: name}"> <span data-bind="text: name"></span> </label> </div> </li> </ul> </li> </ul> </ul> </div>`,n.appendChild(i);let o=new D9(t);Te.track(o),Te.applyBindings(o,n),l(o.defaultLayer)&&(o.currentLayer=o.defaultLayer)}var fq=iVt;var jEo=T(S(),1);var OEo=T(S(),1);var oVt="M 13.84375 7.03125 C 11.412798 7.03125 9.46875 8.975298 9.46875 11.40625 L 9.46875 11.59375 L 2.53125 7.21875 L 2.53125 24.0625 L 9.46875 19.6875 C 9.4853444 22.104033 11.423165 24.0625 13.84375 24.0625 L 25.875 24.0625 C 28.305952 24.0625 30.28125 22.087202 30.28125 19.65625 L 30.28125 11.40625 C 30.28125 8.975298 28.305952 7.03125 25.875 7.03125 L 13.84375 7.03125 z",rVt="M 27.34375 1.65625 L 5.28125 27.9375 L 8.09375 30.3125 L 30.15625 4.03125 L 27.34375 1.65625 z M 13.84375 7.03125 C 11.412798 7.03125 9.46875 8.975298 9.46875 11.40625 L 9.46875 11.59375 L 2.53125 7.21875 L 2.53125 24.0625 L 9.46875 19.6875 C 9.4724893 20.232036 9.5676108 20.7379 9.75 21.21875 L 21.65625 7.03125 L 13.84375 7.03125 z M 28.21875 7.71875 L 14.53125 24.0625 L 25.875 24.0625 C 28.305952 24.0625 30.28125 22.087202 30.28125 19.65625 L 30.28125 11.40625 C 30.28125 9.8371439 29.456025 8.4902779 28.21875 7.71875 z";function pq(){this._cameraClicked=new be,this._closeClicked=new be,this.maxHeight=500,this.enableCamera=!1,this.isCameraTracking=!1,this.showInfo=!1,this.titleText="",this.description="",Te.track(this,["showInfo","titleText","description","maxHeight","enableCamera","isCameraTracking"]),this._loadingIndicatorHtml='<div class="cesium-infoBox-loadingContainer"><span class="cesium-infoBox-loading"></span></div>',this.cameraIconPath=void 0,Te.defineProperty(this,"cameraIconPath",{get:function(){return!this.enableCamera||this.isCameraTracking?rVt:oVt}}),Te.defineProperty(this,"_bodyless",{get:function(){return!l(this.description)||this.description.length===0}})}pq.prototype.maxHeightOffset=function(e){return`${this.maxHeight-e}px`};Object.defineProperties(pq.prototype,{cameraClicked:{get:function(){return this._cameraClicked}},closeClicked:{get:function(){return this._closeClicked}}});var B9=pq;function DB(e){e=Wn(e);let t=document.createElement("div");t.className="cesium-infoBox",t.setAttribute("data-bind",'css: { "cesium-infoBox-visible" : showInfo, "cesium-infoBox-bodyless" : _bodyless }'),e.appendChild(t);let n=document.createElement("div");n.className="cesium-infoBox-title",n.setAttribute("data-bind","text: titleText"),t.appendChild(n);let i=document.createElement("button");i.type="button",i.className="cesium-button cesium-infoBox-camera",i.setAttribute("data-bind",'attr: { title: "Focus camera on object" },click: function () { cameraClicked.raiseEvent(this); },enable: enableCamera,cesiumSvgPath: { path: cameraIconPath, width: 32, height: 32 }'),t.appendChild(i);let o=document.createElement("button");o.type="button",o.className="cesium-infoBox-close",o.setAttribute("data-bind","click: function () { closeClicked.raiseEvent(this); }"),o.innerHTML="×",t.appendChild(o);let r=document.createElement("iframe");r.className="cesium-infoBox-iframe",r.setAttribute("sandbox","allow-same-origin allow-popups allow-forms"),r.setAttribute("data-bind","style : { maxHeight : maxHeightOffset(40) }"),r.setAttribute("allowfullscreen",!0),t.appendChild(r);let s=new B9;Te.applyBindings(s,t),this._container=e,this._element=t,this._frame=r,this._viewModel=s,this._descriptionSubscription=void 0;let a=this;r.addEventListener("load",function(){let c=r.contentDocument,d=c.createElement("link");d.href=on("Widgets/InfoBox/InfoBoxDescription.css"),d.rel="stylesheet",d.type="text/css";let u=c.createElement("div");u.className="cesium-infoBox-description",c.head.appendChild(d),c.body.appendChild(u),a._descriptionSubscription=Ga(s,"description",function(h){r.style.height="5px",u.innerHTML=h;let p=null,g=u.firstElementChild;if(g!==null&&u.childNodes.length===1){let x=window.getComputedStyle(g);if(x!==null){let _=x["background-color"],C=B.fromCssColorString(_);l(C)&&C.alpha!==0&&(p=x["background-color"])}}t.style["background-color"]=p;let f=u.getBoundingClientRect().height;r.style.height=`${f}px`})}),r.setAttribute("src","about:blank")}Object.defineProperties(DB.prototype,{container:{get:function(){return this._container}},viewModel:{get:function(){return this._viewModel}},frame:{get:function(){return this._frame}}});DB.prototype.isDestroyed=function(){return!1};DB.prototype.destroy=function(){let e=this._container;return Te.cleanNode(this._element),e.removeChild(this._element),l(this._descriptionSubscription)&&this._descriptionSubscription.dispose(),me(this)};var O9=DB;var cIo=T(S(),1);var tIo=T(S(),1);function t1e(){this.showInstructions=!1;let e=this;this._command=Ln(function(){e.showInstructions=!e.showInstructions}),this._showClick=Ln(function(){e._touch=!1}),this._showTouch=Ln(function(){e._touch=!0}),this._touch=!1,this.tooltip="Navigation Instructions",Te.track(this,["tooltip","showInstructions","_touch"])}Object.defineProperties(t1e.prototype,{command:{get:function(){return this._command}},showClick:{get:function(){return this._showClick}},showTouch:{get:function(){return this._showTouch}}});var Y9=t1e;function BB(e){let t=Wn(e.container),n=new Y9,i=y(e.instructionsInitiallyVisible,!1);n.showInstructions=i,n._svgPath="M16,1.466C7.973,1.466,1.466,7.973,1.466,16c0,8.027,6.507,14.534,14.534,14.534c8.027,0,14.534-6.507,14.534-14.534C30.534,7.973,24.027,1.466,16,1.466z M17.328,24.371h-2.707v-2.596h2.707V24.371zM17.328,19.003v0.858h-2.707v-1.057c0-3.19,3.63-3.696,3.63-5.963c0-1.034-0.924-1.826-2.134-1.826c-1.254,0-2.354,0.924-2.354,0.924l-1.541-1.915c0,0,1.519-1.584,4.137-1.584c2.487,0,4.796,1.54,4.796,4.136C21.156,16.208,17.328,16.627,17.328,19.003z";let o=document.createElement("span");o.className="cesium-navigationHelpButton-wrapper",t.appendChild(o);let r=document.createElement("button");r.type="button",r.className="cesium-button cesium-toolbar-button cesium-navigation-help-button",r.setAttribute("data-bind","attr: { title: tooltip },click: command,cesiumSvgPath: { path: _svgPath, width: 32, height: 32 }"),o.appendChild(r);let s=document.createElement("div");s.className="cesium-navigation-help",s.setAttribute("data-bind",'css: { "cesium-navigation-help-visible" : showInstructions}'),o.appendChild(s);let a=document.createElement("button");a.type="button",a.className="cesium-navigation-button cesium-navigation-button-left",a.setAttribute("data-bind",'click: showClick, css: {"cesium-navigation-button-selected": !_touch, "cesium-navigation-button-unselected": _touch}');let c=document.createElement("img");c.src=on("Widgets/Images/NavigationHelp/Mouse.svg"),c.className="cesium-navigation-button-icon",c.style.width="25px",c.style.height="25px",a.appendChild(c),a.appendChild(document.createTextNode("Mouse"));let d=document.createElement("button");d.type="button",d.className="cesium-navigation-button cesium-navigation-button-right",d.setAttribute("data-bind",'click: showTouch, css: {"cesium-navigation-button-selected": _touch, "cesium-navigation-button-unselected": !_touch}');let u=document.createElement("img");u.src=on("Widgets/Images/NavigationHelp/Touch.svg"),u.className="cesium-navigation-button-icon",u.style.width="25px",u.style.height="25px",d.appendChild(u),d.appendChild(document.createTextNode("Touch")),s.appendChild(a),s.appendChild(d);let h=document.createElement("div");h.className="cesium-click-navigation-help cesium-navigation-help-instructions",h.setAttribute("data-bind",'css: { "cesium-click-navigation-help-visible" : !_touch}'),h.innerHTML=` <table> <tr> <td><img src="${on("Widgets/Images/NavigationHelp/MouseLeft.svg")}" width="48" height="48" /></td> <td> <div class="cesium-navigation-help-pan">Pan view</div> <div class="cesium-navigation-help-details">Left click + drag</div> </td> </tr> <tr> <td><img src="${on("Widgets/Images/NavigationHelp/MouseRight.svg")}" width="48" height="48" /></td> <td> <div class="cesium-navigation-help-zoom">Zoom view</div> <div class="cesium-navigation-help-details">Right click + drag, or</div> <div class="cesium-navigation-help-details">Mouse wheel scroll</div> </td> </tr> <tr> <td><img src="${on("Widgets/Images/NavigationHelp/MouseMiddle.svg")}" width="48" height="48" /></td> <td> <div class="cesium-navigation-help-rotate">Rotate view</div> <div class="cesium-navigation-help-details">Middle click + drag, or</div> <div class="cesium-navigation-help-details">CTRL + Left/Right click + drag</div> </td> </tr> </table>`,s.appendChild(h);let p=document.createElement("div");p.className="cesium-touch-navigation-help cesium-navigation-help-instructions",p.setAttribute("data-bind",'css: { "cesium-touch-navigation-help-visible" : _touch}'),p.innerHTML=` <table> <tr> <td><img src="${on("Widgets/Images/NavigationHelp/TouchDrag.svg")}" width="70" height="48" /></td> <td> <div class="cesium-navigation-help-pan">Pan view</div> <div class="cesium-navigation-help-details">One finger drag</div> </td> </tr> <tr> <td><img src="${on("Widgets/Images/NavigationHelp/TouchZoom.svg")}" width="70" height="48" /></td> <td> <div class="cesium-navigation-help-zoom">Zoom view</div> <div class="cesium-navigation-help-details">Two finger pinch</div> </td> </tr> <tr> <td><img src="${on("Widgets/Images/NavigationHelp/TouchTilt.svg")}" width="70" height="48" /></td> <td> <div class="cesium-navigation-help-rotate">Tilt view</div> <div class="cesium-navigation-help-details">Two finger drag, same direction</div> </td> </tr> <tr> <td><img src="${on("Widgets/Images/NavigationHelp/TouchRotate.svg")}" width="70" height="48" /></td> <td> <div class="cesium-navigation-help-tilt">Rotate view</div> <div class="cesium-navigation-help-details">Two finger drag, opposite direction</div> </td> </tr> </table>`,s.appendChild(p),Te.applyBindings(n,o),this._container=t,this._viewModel=n,this._wrapper=o,this._closeInstructions=function(g){o.contains(g.target)||(n.showInstructions=!1)},Ot.supportsPointerEvents()?document.addEventListener("pointerdown",this._closeInstructions,!0):(document.addEventListener("mousedown",this._closeInstructions,!0),document.addEventListener("touchstart",this._closeInstructions,!0))}Object.defineProperties(BB.prototype,{container:{get:function(){return this._container}},viewModel:{get:function(){return this._viewModel}}});BB.prototype.isDestroyed=function(){return!1};BB.prototype.destroy=function(){return Ot.supportsPointerEvents()?document.removeEventListener("pointerdown",this._closeInstructions,!0):(document.removeEventListener("mousedown",this._closeInstructions,!0),document.removeEventListener("touchstart",this._closeInstructions,!0)),Te.cleanNode(this._wrapper),this._container.removeChild(this._wrapper),me(this)};var H9=BB;var SIo=T(S(),1);var pIo=T(S(),1);function bq(e){this._scene=e.scene,this.lowFrameRateMessage=y(e.lowFrameRateMessage,"This application appears to be performing poorly on your system. Please try using a different web browser or updating your video drivers."),this.lowFrameRateMessageDismissed=!1,this.showingLowFrameRateMessage=!1,Te.track(this,["lowFrameRateMessage","lowFrameRateMessageDismissed","showingLowFrameRateMessage"]);let t=this;this._dismissMessage=Ln(function(){t.showingLowFrameRateMessage=!1,t.lowFrameRateMessageDismissed=!0});let n=e9.fromScene(e.scene);this._unsubscribeLowFrameRate=n.lowFrameRate.addEventListener(function(){t.lowFrameRateMessageDismissed||(t.showingLowFrameRateMessage=!0)}),this._unsubscribeNominalFrameRate=n.nominalFrameRate.addEventListener(function(){t.showingLowFrameRateMessage=!1})}Object.defineProperties(bq.prototype,{scene:{get:function(){return this._scene}},dismissMessage:{get:function(){return this._dismissMessage}}});bq.prototype.destroy=function(){return this._unsubscribeLowFrameRate(),this._unsubscribeNominalFrameRate(),me(this)};var z9=bq;function OB(e){let t=Wn(e.container),n=new z9(e),i=document.createElement("div");i.className="cesium-performance-watchdog-message-area",i.setAttribute("data-bind","visible: showingLowFrameRateMessage");let o=document.createElement("button");o.setAttribute("type","button"),o.className="cesium-performance-watchdog-message-dismiss",o.innerHTML="×",o.setAttribute("data-bind","click: dismissMessage"),i.appendChild(o);let r=document.createElement("div");r.className="cesium-performance-watchdog-message",r.setAttribute("data-bind","html: lowFrameRateMessage"),i.appendChild(r),t.appendChild(i),Te.applyBindings(n,i),this._container=t,this._viewModel=n,this._element=i}Object.defineProperties(OB.prototype,{container:{get:function(){return this._container}},viewModel:{get:function(){return this._viewModel}}});OB.prototype.isDestroyed=function(){return!1};OB.prototype.destroy=function(){return this._viewModel.destroy(),Te.cleanNode(this._element),this._container.removeChild(this._element),me(this)};var K9=OB;var wIo=T(S(),1);var GIo=T(S(),1);function YB(e){this._scene=e,this._orthographic=e.camera.frustum instanceof ln,this._flightInProgress=!1,this.dropDownVisible=!1,this.tooltipPerspective="Perspective Projection",this.tooltipOrthographic="Orthographic Projection",this.selectedTooltip=void 0,this.sceneMode=e.mode,Te.track(this,["_orthographic","_flightInProgress","sceneMode","dropDownVisible","tooltipPerspective","tooltipOrthographic"]);let t=this;Te.defineProperty(this,"selectedTooltip",function(){return t._orthographic?t.tooltipOrthographic:t.tooltipPerspective}),this._toggleDropDown=Ln(function(){t.sceneMode===oe.SCENE2D||t._flightInProgress||(t.dropDownVisible=!t.dropDownVisible)}),this._eventHelper=new fr,this._eventHelper.add(e.morphComplete,function(n,i,o,r){t.sceneMode=o,t._orthographic=o===oe.SCENE2D||t._scene.camera.frustum instanceof ln}),this._eventHelper.add(e.preRender,function(){t._flightInProgress=l(e.camera._currentFlight)}),this._switchToPerspective=Ln(function(){t.sceneMode!==oe.SCENE2D&&(t._scene.camera.switchToPerspectiveFrustum(),t._orthographic=!1,t.dropDownVisible=!1)}),this._switchToOrthographic=Ln(function(){t.sceneMode!==oe.SCENE2D&&(t._scene.camera.switchToOrthographicFrustum(),t._orthographic=!0,t.dropDownVisible=!1)}),this._sceneMode=oe}Object.defineProperties(YB.prototype,{scene:{get:function(){return this._scene}},toggleDropDown:{get:function(){return this._toggleDropDown}},switchToPerspective:{get:function(){return this._switchToPerspective}},switchToOrthographic:{get:function(){return this._switchToOrthographic}},isOrthographicProjection:{get:function(){return this._orthographic}}});YB.prototype.isDestroyed=function(){return!1};YB.prototype.destroy=function(){this._eventHelper.removeAll(),me(this)};var J9=YB;var sVt="M 28.15625,10.4375 9.125,13.21875 13.75,43.25 41.75,55.09375 50.8125,37 54.5,11.9375 z m 0.125,3 19.976451,0.394265 L 43.03125,16.875 22.6875,14.28125 z M 50.971746,15.705477 47.90625,36.03125 42.53125,46 44.84375,19.3125 z M 12.625,16.03125 l 29.15625,3.6875 -2.65625,31 L 16.4375,41.125 z",aVt="m 31.560594,6.5254438 -20.75,12.4687502 0.1875,24.5625 22.28125,11.8125 19.5,-12 0.65625,-0.375 0,-0.75 0.0312,-23.21875 z m 0.0625,3.125 16.65625,9.5000002 -16.125,10.28125 -17.34375,-9.71875 z m 18.96875,11.1875002 0.15625,20.65625 -17.46875,10.59375 0.15625,-20.28125 z m -37.0625,1.25 17.21875,9.625 -0.15625,19.21875 -16.9375,-9 z";function HB(e,t){e=Wn(e);let n=new J9(t);n._perspectivePath=sVt,n._orthographicPath=aVt;let i=document.createElement("span");i.className="cesium-projectionPicker-wrapper cesium-toolbar-button",e.appendChild(i);let o=document.createElement("button");o.type="button",o.className="cesium-button cesium-toolbar-button",o.setAttribute("data-bind",'css: { "cesium-projectionPicker-buttonPerspective": !_orthographic, "cesium-projectionPicker-buttonOrthographic": _orthographic, "cesium-button-disabled" : sceneMode === _sceneMode.SCENE2D || _flightInProgress, "cesium-projectionPicker-selected": dropDownVisible },attr: { title: selectedTooltip },click: toggleDropDown'),o.innerHTML='<!-- ko cesiumSvgPath: { path: _perspectivePath, width: 64, height: 64, css: "cesium-projectionPicker-iconPerspective" } --><!-- /ko --><!-- ko cesiumSvgPath: { path: _orthographicPath, width: 64, height: 64, css: "cesium-projectionPicker-iconOrthographic" } --><!-- /ko -->',i.appendChild(o);let r=document.createElement("button");r.type="button",r.className="cesium-button cesium-toolbar-button cesium-projectionPicker-dropDown-icon",r.setAttribute("data-bind",'css: { "cesium-projectionPicker-visible" : (dropDownVisible && _orthographic), "cesium-projectionPicker-none" : !_orthographic, "cesium-projectionPicker-hidden" : !dropDownVisible },attr: { title: tooltipPerspective },click: switchToPerspective,cesiumSvgPath: { path: _perspectivePath, width: 64, height: 64 }'),i.appendChild(r);let s=document.createElement("button");s.type="button",s.className="cesium-button cesium-toolbar-button cesium-projectionPicker-dropDown-icon",s.setAttribute("data-bind",'css: { "cesium-projectionPicker-visible" : (dropDownVisible && !_orthographic), "cesium-projectionPicker-none" : _orthographic, "cesium-projectionPicker-hidden" : !dropDownVisible},attr: { title: tooltipOrthographic },click: switchToOrthographic,cesiumSvgPath: { path: _orthographicPath, width: 64, height: 64 }'),i.appendChild(s),Te.applyBindings(n,i),this._viewModel=n,this._container=e,this._wrapper=i,this._closeDropDown=function(a){i.contains(a.target)||(n.dropDownVisible=!1)},Ot.supportsPointerEvents()?document.addEventListener("pointerdown",this._closeDropDown,!0):(document.addEventListener("mousedown",this._closeDropDown,!0),document.addEventListener("touchstart",this._closeDropDown,!0))}Object.defineProperties(HB.prototype,{container:{get:function(){return this._container}},viewModel:{get:function(){return this._viewModel}}});HB.prototype.isDestroyed=function(){return!1};HB.prototype.destroy=function(){return this._viewModel.destroy(),Ot.supportsPointerEvents()?document.removeEventListener("pointerdown",this._closeDropDown,!0):(document.removeEventListener("mousedown",this._closeDropDown,!0),document.removeEventListener("touchstart",this._closeDropDown,!0)),Te.cleanNode(this._wrapper),this._container.removeChild(this._wrapper),me(this)};var Q9=HB;var JIo=T(S(),1);var DIo=T(S(),1);function zB(e,t){this._scene=e;let n=this,i=function(o,r,s,a){n.sceneMode=s,n.dropDownVisible=!1};this._eventHelper=new fr,this._eventHelper.add(e.morphStart,i),this._duration=y(t,2),this.sceneMode=e.mode,this.dropDownVisible=!1,this.tooltip2D="2D",this.tooltip3D="3D",this.tooltipColumbusView="Columbus View",Te.track(this,["sceneMode","dropDownVisible","tooltip2D","tooltip3D","tooltipColumbusView"]),this.selectedTooltip=void 0,Te.defineProperty(this,"selectedTooltip",function(){let o=n.sceneMode;return o===oe.SCENE2D?n.tooltip2D:o===oe.SCENE3D?n.tooltip3D:n.tooltipColumbusView}),this._toggleDropDown=Ln(function(){n.dropDownVisible=!n.dropDownVisible}),this._morphTo2D=Ln(function(){e.morphTo2D(n._duration)}),this._morphTo3D=Ln(function(){e.morphTo3D(n._duration)}),this._morphToColumbusView=Ln(function(){e.morphToColumbusView(n._duration)}),this._sceneMode=oe}Object.defineProperties(zB.prototype,{scene:{get:function(){return this._scene}},duration:{get:function(){return this._duration},set:function(e){this._duration=e}},toggleDropDown:{get:function(){return this._toggleDropDown}},morphTo2D:{get:function(){return this._morphTo2D}},morphTo3D:{get:function(){return this._morphTo3D}},morphToColumbusView:{get:function(){return this._morphToColumbusView}}});zB.prototype.isDestroyed=function(){return!1};zB.prototype.destroy=function(){this._eventHelper.removeAll(),me(this)};var j9=zB;var cVt="m 32.401392,4.9330437 c -7.087603,0 -14.096095,2.884602 -19.10793,7.8946843 -5.0118352,5.010083 -7.9296167,11.987468 -7.9296167,19.072999 0,7.085531 2.9177815,14.097848 7.9296167,19.107931 4.837653,4.835961 11.541408,7.631372 18.374354,7.82482 0.05712,0.01231 0.454119,0.139729 0.454119,0.139729 l 0.03493,-0.104797 c 0.08246,7.84e-4 0.162033,0.03493 0.244525,0.03493 0.08304,0 0.161515,-0.03414 0.244526,-0.03493 l 0.03493,0.104797 c 0,0 0.309474,-0.129487 0.349323,-0.139729 6.867765,-0.168094 13.582903,-2.965206 18.444218,-7.82482 2.558195,-2.5573 4.551081,-5.638134 5.903547,-8.977584 1.297191,-3.202966 2.02607,-6.661489 2.02607,-10.130347 0,-6.237309 -2.366261,-12.31219 -6.322734,-17.116794 -0.0034,-0.02316 0.0049,-0.04488 0,-0.06986 -0.01733,-0.08745 -0.104529,-0.278855 -0.104797,-0.279458 -5.31e-4,-0.0012 -0.522988,-0.628147 -0.523984,-0.62878 -3.47e-4,-2.2e-4 -0.133444,-0.03532 -0.244525,-0.06987 C 51.944299,13.447603 51.751076,13.104317 51.474391,12.827728 46.462556,7.8176457 39.488996,4.9330437 32.401392,4.9330437 z m -2.130866,3.5281554 0.104797,9.6762289 c -4.111695,-0.08361 -7.109829,-0.423664 -9.257041,-0.943171 1.198093,-2.269271 2.524531,-4.124404 3.91241,-5.414496 2.167498,-2.0147811 3.950145,-2.8540169 5.239834,-3.3185619 z m 2.794579,0 c 1.280302,0.4754953 3.022186,1.3285948 5.065173,3.2486979 1.424667,1.338973 2.788862,3.303645 3.982275,5.728886 -2.29082,0.403367 -5.381258,0.621049 -8.942651,0.698645 L 33.065105,8.4611991 z m 5.728886,0.2445256 c 4.004072,1.1230822 7.793098,3.1481363 10.724195,6.0782083 0.03468,0.03466 0.07033,0.06991 0.104797,0.104797 -0.45375,0.313891 -0.923054,0.663002 -1.956205,1.082899 -0.647388,0.263114 -1.906242,0.477396 -2.829511,0.733577 -1.382296,-2.988132 -3.027146,-5.368585 -4.785716,-7.0213781 -0.422866,-0.397432 -0.835818,-0.6453247 -1.25756,-0.9781032 z m -15.33525,0.7685092 c -0.106753,0.09503 -0.207753,0.145402 -0.31439,0.244526 -1.684973,1.5662541 -3.298068,3.8232211 -4.680919,6.5672591 -0.343797,-0.14942 -1.035052,-0.273198 -1.292493,-0.419186 -0.956528,-0.542427 -1.362964,-1.022024 -1.537018,-1.292493 -0.0241,-0.03745 -0.01868,-0.0401 -0.03493,-0.06986 2.250095,-2.163342 4.948824,-3.869984 7.859752,-5.0302421 z m -9.641296,7.0912431 c 0.464973,0.571618 0.937729,1.169056 1.956205,1.746612 0.349907,0.198425 1.107143,0.335404 1.537018,0.523983 -1.20166,3.172984 -1.998037,7.051901 -2.165798,11.772162 C 14.256557,30.361384 12.934823,30.161483 12.280427,29.90959 10.644437,29.279855 9.6888882,28.674891 9.1714586,28.267775 8.6540289,27.860658 8.6474751,27.778724 8.6474751,27.778724 l -0.069864,0.03493 C 9.3100294,23.691285 11.163248,19.798527 13.817445,16.565477 z m 37.552149,0.523984 c 2.548924,3.289983 4.265057,7.202594 4.890513,11.318043 -0.650428,0.410896 -1.756876,1.001936 -3.563088,1.606882 -1.171552,0.392383 -3.163859,0.759153 -4.960377,1.117832 -0.04367,-4.752703 -0.784809,-8.591423 -1.88634,-11.807094 0.917574,-0.263678 2.170552,-0.486495 2.864443,-0.76851 1.274693,-0.518066 2.003942,-1.001558 2.654849,-1.467153 z m -31.439008,2.619917 c 2.487341,0.672766 5.775813,1.137775 10.479669,1.222628 l 0.104797,10.689263 0,0.03493 0,0.733577 c -5.435005,-0.09059 -9.512219,-0.519044 -12.610536,-1.117831 0.106127,-4.776683 0.879334,-8.55791 2.02607,-11.562569 z m 23.264866,0.31439 c 1.073459,3.067541 1.833795,6.821314 1.816476,11.702298 -3.054474,0.423245 -7.062018,0.648559 -11.702298,0.698644 l 0,-0.838373 -0.104796,-10.654331 c 4.082416,-0.0864 7.404468,-0.403886 9.990618,-0.908238 z M 8.2632205,30.922625 c 0.7558676,0.510548 1.5529563,1.013339 3.0041715,1.57195 0.937518,0.360875 2.612202,0.647642 3.91241,0.978102 0.112814,3.85566 0.703989,7.107756 1.606883,9.920754 -1.147172,-0.324262 -2.644553,-0.640648 -3.423359,-0.978102 -1.516688,-0.657177 -2.386627,-1.287332 -2.864443,-1.71168 -0.477816,-0.424347 -0.489051,-0.489051 -0.489051,-0.489051 L 9.8002387,40.319395 C 8.791691,37.621767 8.1584238,34.769583 8.1584238,31.900727 c 0,-0.330153 0.090589,-0.648169 0.1047967,-0.978102 z m 48.2763445,0.419186 c 0.0047,0.188973 0.06986,0.36991 0.06986,0.558916 0,2.938869 -0.620228,5.873558 -1.676747,8.628261 -0.07435,0.07583 -0.06552,0.07411 -0.454119,0.349323 -0.606965,0.429857 -1.631665,1.042044 -3.318562,1.676747 -1.208528,0.454713 -3.204964,0.850894 -5.135038,1.25756 0.84593,-2.765726 1.41808,-6.005357 1.606883,-9.815957 2.232369,-0.413371 4.483758,-0.840201 5.938479,-1.327425 1.410632,-0.472457 2.153108,-0.89469 2.96924,-1.327425 z m -38.530252,2.864443 c 3.208141,0.56697 7.372279,0.898588 12.575603,0.978103 l 0.174662,9.885821 c -4.392517,-0.06139 -8.106722,-0.320566 -10.863925,-0.803441 -1.051954,-2.664695 -1.692909,-6.043794 -1.88634,-10.060483 z m 26.793022,0.31439 c -0.246298,3.923551 -0.877762,7.263679 -1.816476,9.885822 -2.561957,0.361954 -5.766249,0.560708 -9.431703,0.62878 l -0.174661,-9.815957 c 4.491734,-0.04969 8.334769,-0.293032 11.42284,-0.698645 z M 12.035901,44.860585 c 0.09977,0.04523 0.105535,0.09465 0.209594,0.139729 1.337656,0.579602 3.441099,1.058072 5.589157,1.537018 1.545042,3.399208 3.548524,5.969402 5.589157,7.789888 -3.034411,-1.215537 -5.871615,-3.007978 -8.174142,-5.309699 -1.245911,-1.245475 -2.271794,-2.662961 -3.213766,-4.156936 z m 40.69605,0 c -0.941972,1.493975 -1.967855,2.911461 -3.213765,4.156936 -2.74253,2.741571 -6.244106,4.696717 -9.955686,5.868615 0.261347,-0.241079 0.507495,-0.394491 0.768509,-0.663713 1.674841,-1.727516 3.320792,-4.181056 4.645987,-7.265904 2.962447,-0.503021 5.408965,-1.122293 7.161107,-1.781544 0.284034,-0.106865 0.337297,-0.207323 0.593848,-0.31439 z m -31.404076,2.305527 c 2.645807,0.376448 5.701178,0.649995 9.466635,0.698645 l 0.139729,7.789888 c -1.38739,-0.480844 -3.316218,-1.29837 -5.659022,-3.388427 -1.388822,-1.238993 -2.743668,-3.0113 -3.947342,-5.100106 z m 20.365491,0.104797 c -1.04872,2.041937 -2.174337,3.779068 -3.353494,4.995309 -1.853177,1.911459 -3.425515,2.82679 -4.611055,3.353494 l -0.139729,-7.789887 c 3.13091,-0.05714 5.728238,-0.278725 8.104278,-0.558916 z",lVt="m 2.9825053,17.550598 0,1.368113 0,26.267766 0,1.368113 1.36811,0 54.9981397,0 1.36811,0 0,-1.368113 0,-26.267766 0,-1.368113 -1.36811,0 -54.9981397,0 -1.36811,0 z m 2.73623,2.736226 10.3292497,0 0,10.466063 -10.3292497,0 0,-10.466063 z m 13.0654697,0 11.69737,0 0,10.466063 -11.69737,0 0,-10.466063 z m 14.43359,0 11.69737,0 0,10.466063 -11.69737,0 0,-10.466063 z m 14.43359,0 10.32926,0 0,10.466063 -10.32926,0 0,-10.466063 z m -41.9326497,13.202288 10.3292497,0 0,10.329252 -10.3292497,0 0,-10.329252 z m 13.0654697,0 11.69737,0 0,10.329252 -11.69737,0 0,-10.329252 z m 14.43359,0 11.69737,0 0,10.329252 -11.69737,0 0,-10.329252 z m 14.43359,0 10.32926,0 0,10.329252 -10.32926,0 0,-10.329252 z",dVt="m 14.723969,17.675598 -0.340489,0.817175 -11.1680536,26.183638 -0.817175,1.872692 2.076986,0 54.7506996,0 2.07698,0 -0.81717,-1.872692 -11.16805,-26.183638 -0.34049,-0.817175 -0.91933,0 -32.414586,0 -0.919322,0 z m 1.838643,2.723916 6.196908,0 -2.928209,10.418977 -7.729111,0 4.460412,-10.418977 z m 9.02297,0 4.903049,0 0,10.418977 -7.831258,0 2.928209,-10.418977 z m 7.626964,0 5.584031,0 2.62176,10.418977 -8.205791,0 0,-10.418977 z m 8.410081,0 5.51593,0 4.46042,10.418977 -7.38863,0 -2.58772,-10.418977 z m -30.678091,13.142892 8.103649,0 -2.89416,10.282782 -9.6018026,0 4.3923136,-10.282782 z m 10.929711,0 8.614384,0 0,10.282782 -11.508544,0 2.89416,-10.282782 z m 11.338299,0 8.852721,0 2.58772,10.282782 -11.440441,0 0,-10.282782 z m 11.678781,0 7.86531,0 4.39231,10.282782 -9.6699,0 -2.58772,-10.282782 z";function KB(e,t,n){e=Wn(e);let i=new j9(t,n);i._globePath=cVt,i._flatMapPath=lVt,i._columbusViewPath=dVt;let o=document.createElement("span");o.className="cesium-sceneModePicker-wrapper cesium-toolbar-button",e.appendChild(o);let r=document.createElement("button");r.type="button",r.className="cesium-button cesium-toolbar-button",r.setAttribute("data-bind",'css: { "cesium-sceneModePicker-button2D": sceneMode === _sceneMode.SCENE2D, "cesium-sceneModePicker-button3D": sceneMode === _sceneMode.SCENE3D, "cesium-sceneModePicker-buttonColumbusView": sceneMode === _sceneMode.COLUMBUS_VIEW, "cesium-sceneModePicker-selected": dropDownVisible },attr: { title: selectedTooltip },click: toggleDropDown'),r.innerHTML='<!-- ko cesiumSvgPath: { path: _globePath, width: 64, height: 64, css: "cesium-sceneModePicker-slide-svg cesium-sceneModePicker-icon3D" } --><!-- /ko --><!-- ko cesiumSvgPath: { path: _flatMapPath, width: 64, height: 64, css: "cesium-sceneModePicker-slide-svg cesium-sceneModePicker-icon2D" } --><!-- /ko --><!-- ko cesiumSvgPath: { path: _columbusViewPath, width: 64, height: 64, css: "cesium-sceneModePicker-slide-svg cesium-sceneModePicker-iconColumbusView" } --><!-- /ko -->',o.appendChild(r);let s=document.createElement("button");s.type="button",s.className="cesium-button cesium-toolbar-button cesium-sceneModePicker-dropDown-icon",s.setAttribute("data-bind",'css: { "cesium-sceneModePicker-visible" : (dropDownVisible && (sceneMode !== _sceneMode.SCENE3D)) || (!dropDownVisible && (sceneMode === _sceneMode.SCENE3D)), "cesium-sceneModePicker-none" : sceneMode === _sceneMode.SCENE3D, "cesium-sceneModePicker-hidden" : !dropDownVisible },attr: { title: tooltip3D },click: morphTo3D,cesiumSvgPath: { path: _globePath, width: 64, height: 64 }'),o.appendChild(s);let a=document.createElement("button");a.type="button",a.className="cesium-button cesium-toolbar-button cesium-sceneModePicker-dropDown-icon",a.setAttribute("data-bind",'css: { "cesium-sceneModePicker-visible" : (dropDownVisible && (sceneMode !== _sceneMode.SCENE2D)), "cesium-sceneModePicker-none" : sceneMode === _sceneMode.SCENE2D, "cesium-sceneModePicker-hidden" : !dropDownVisible },attr: { title: tooltip2D },click: morphTo2D,cesiumSvgPath: { path: _flatMapPath, width: 64, height: 64 }'),o.appendChild(a);let c=document.createElement("button");c.type="button",c.className="cesium-button cesium-toolbar-button cesium-sceneModePicker-dropDown-icon",c.setAttribute("data-bind",'css: { "cesium-sceneModePicker-visible" : (dropDownVisible && (sceneMode !== _sceneMode.COLUMBUS_VIEW)) || (!dropDownVisible && (sceneMode === _sceneMode.COLUMBUS_VIEW)), "cesium-sceneModePicker-none" : sceneMode === _sceneMode.COLUMBUS_VIEW, "cesium-sceneModePicker-hidden" : !dropDownVisible},attr: { title: tooltipColumbusView },click: morphToColumbusView,cesiumSvgPath: { path: _columbusViewPath, width: 64, height: 64 }'),o.appendChild(c),Te.applyBindings(i,o),this._viewModel=i,this._container=e,this._wrapper=o,this._closeDropDown=function(d){o.contains(d.target)||(i.dropDownVisible=!1)},Ot.supportsPointerEvents()?document.addEventListener("pointerdown",this._closeDropDown,!0):(document.addEventListener("mousedown",this._closeDropDown,!0),document.addEventListener("touchstart",this._closeDropDown,!0))}Object.defineProperties(KB.prototype,{container:{get:function(){return this._container}},viewModel:{get:function(){return this._viewModel}}});KB.prototype.isDestroyed=function(){return!1};KB.prototype.destroy=function(){return this._viewModel.destroy(),Ot.supportsPointerEvents()?document.removeEventListener("pointerdown",this._closeDropDown,!0):(document.removeEventListener("mousedown",this._closeDropDown,!0),document.removeEventListener("touchstart",this._closeDropDown,!0)),Te.cleanNode(this._wrapper),this._container.removeChild(this._wrapper),me(this)};var q9=KB;var aXo=T(S(),1);var eXo=T(S(),1);var uVt=new D,JB="-1000px";function $9(e,t,n){this._scene=e,this._screenPositionX=JB,this._screenPositionY=JB,this._tweens=e.tweens,this._container=y(n,document.body),this._selectionIndicatorElement=t,this._scale=1,this.position=void 0,this.showSelection=!1,Te.track(this,["position","_screenPositionX","_screenPositionY","_scale","showSelection"]),this.isVisible=void 0,Te.defineProperty(this,"isVisible",{get:function(){return this.showSelection&&l(this.position)}}),Te.defineProperty(this,"_transform",{get:function(){return`scale(${this._scale})`}}),this.computeScreenSpacePosition=function(i,o){return Bi.worldToWindowCoordinates(e,i,o)}}$9.prototype.update=function(){if(this.showSelection&&l(this.position)){let e=this.computeScreenSpacePosition(this.position,uVt);if(!l(e))this._screenPositionX=JB,this._screenPositionY=JB;else{let t=this._container,n=t.parentNode.clientWidth,i=t.parentNode.clientHeight,o=this._selectionIndicatorElement.clientWidth,r=o*.5;e.x=Math.min(Math.max(e.x,-o),n+o)-r,e.y=Math.min(Math.max(e.y,-o),i+o)-r,this._screenPositionX=`${Math.floor(e.x+.25)}px`,this._screenPositionY=`${Math.floor(e.y+.25)}px`}}};$9.prototype.animateAppear=function(){this._tweens.addProperty({object:this,property:"_scale",startValue:2,stopValue:1,duration:.8,easingFunction:Qr.EXPONENTIAL_OUT})};$9.prototype.animateDepart=function(){this._tweens.addProperty({object:this,property:"_scale",startValue:this._scale,stopValue:1.5,duration:.8,easingFunction:Qr.EXPONENTIAL_OUT})};Object.defineProperties($9.prototype,{container:{get:function(){return this._container}},selectionIndicatorElement:{get:function(){return this._selectionIndicatorElement}},scene:{get:function(){return this._scene}}});var eN=$9;function QB(e,t){e=Wn(e),this._container=e;let n=document.createElement("div");n.className="cesium-selection-wrapper",n.setAttribute("data-bind",'style: { "top" : _screenPositionY, "left" : _screenPositionX },css: { "cesium-selection-wrapper-visible" : isVisible }'),e.appendChild(n),this._element=n;let i="http://www.w3.org/2000/svg",o="M -34 -34 L -34 -11.25 L -30 -15.25 L -30 -30 L -15.25 -30 L -11.25 -34 L -34 -34 z M 11.25 -34 L 15.25 -30 L 30 -30 L 30 -15.25 L 34 -11.25 L 34 -34 L 11.25 -34 z M -34 11.25 L -34 34 L -11.25 34 L -15.25 30 L -30 30 L -30 15.25 L -34 11.25 z M 34 11.25 L 30 15.25 L 30 30 L 15.25 30 L 11.25 34 L 34 34 L 34 11.25 z",r=document.createElementNS(i,"svg:svg");r.setAttribute("width",160),r.setAttribute("height",160),r.setAttribute("viewBox","0 0 160 160");let s=document.createElementNS(i,"g");s.setAttribute("transform","translate(80,80)"),r.appendChild(s);let a=document.createElementNS(i,"path");a.setAttribute("data-bind","attr: { transform: _transform }"),a.setAttribute("d",o),s.appendChild(a),n.appendChild(r);let c=new eN(t,this._element,this._container);this._viewModel=c,Te.applyBindings(this._viewModel,this._element)}Object.defineProperties(QB.prototype,{container:{get:function(){return this._container}},viewModel:{get:function(){return this._viewModel}}});QB.prototype.isDestroyed=function(){return!1};QB.prototype.destroy=function(){let e=this._container;return Te.cleanNode(this._element),e.removeChild(this._element),me(this)};var tN=QB;var xXo=T(S(),1);var dXo=T(S(),1);function YS(e,t,n){this._color=e,this._height=t,this._base=y(n,0)}YS.prototype.getHeight=function(){return this._height};YS.prototype.getBase=function(){return this._base};YS.prototype.getStartTime=function(){return this._start};YS.prototype.getStopTime=function(){return this._stop};YS.prototype.setRange=function(e,t){this._start=e,this._stop=t};YS.prototype.render=function(e){let t="";if(this._start&&this._stop&&this._color){let n=q.secondsDifference(this._start,e.epochJulian),i=Math.round(e.timeBarWidth*e.getAlpha(n)),o=q.secondsDifference(this._stop,e.epochJulian),r=Math.round(e.timeBarWidth*e.getAlpha(o))-i;i<0&&(r+=i,i=0),i+r>e.timeBarWidth&&(r=e.timeBarWidth-i),r>0&&(t=`<span class="cesium-timeline-highlight" style="left: ${i.toString()}px; width: ${r.toString()}px; bottom: ${this._base.toString()}px; height: ${this._height}px; background-color: ${this._color};"></span>`)}return t};var nN=YS;var hXo=T(S(),1);function n1e(e,t,n,i){this.interval=e,this.height=t,this.color=n||new B(.5,.5,.5,1),this.backgroundColor=i||new B(0,0,0,0)}n1e.prototype.render=function(e,t){let n=this.interval.start,i=this.interval.stop,o=t.startJulian,r=q.addSeconds(t.startJulian,t.duration,new q);if(q.lessThan(n,o)&&q.greaterThan(i,r))e.fillStyle=this.color.toCssColorString(),e.fillRect(0,t.y,t.timeBarWidth,this.height);else if(q.lessThanOrEquals(n,r)&&q.greaterThanOrEquals(i,o)){let s,a,c;for(s=0;s<t.timeBarWidth;++s){let d=q.addSeconds(t.startJulian,s/t.timeBarWidth*t.duration,new q);!l(a)&&q.greaterThanOrEquals(d,n)?a=s:!l(c)&&q.greaterThanOrEquals(d,i)&&(c=s)}e.fillStyle=this.backgroundColor.toCssColorString(),e.fillRect(0,t.y,t.timeBarWidth,this.height),l(a)&&(l(c)||(c=t.timeBarWidth),e.fillStyle=this.color.toCssColorString(),e.fillRect(a,t.y,Math.max(c-a,1),this.height))}};var iN=n1e;var gq=1e12,Vm={none:0,scrub:1,slide:2,zoom:3,touchOnly:4},Tl={none:0,scrub:1,slideZoom:2,singleTap:3,ignore:4},rx=[.001,.002,.005,.01,.02,.05,.1,.25,.5,1,2,5,10,15,30,60,120,300,600,900,1800,3600,7200,14400,21600,43200,86400,172800,345600,604800,1296e3,2592e3,5184e3,7776e3,15552e3,31536e3,63072e3,126144e3,15768e4,31536e4,63072e4,126144e4,15768e5,31536e5,63072e5,126144e5,15768e6,31536e6],mVt=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"];function Sl(e,t){e=Wn(e);let n=e.ownerDocument;this.container=e;let i=n.createElement("div");i.className="cesium-timeline-main",e.appendChild(i),this._topDiv=i,this._endJulian=void 0,this._epochJulian=void 0,this._lastXPos=void 0,this._scrubElement=void 0,this._startJulian=void 0,this._timeBarSecondsSpan=void 0,this._clock=t,this._scrubJulian=t.currentTime,this._mainTicSpan=-1,this._mouseMode=Vm.none,this._touchMode=Tl.none,this._touchState={centerX:0,spanX:0},this._mouseX=0,this._timelineDrag=0,this._timelineDragLocation=void 0,this._lastHeight=void 0,this._lastWidth=void 0,this._topDiv.innerHTML='<div class="cesium-timeline-bar"></div><div class="cesium-timeline-trackContainer"><canvas class="cesium-timeline-tracks" width="10" height="1"></canvas></div><div class="cesium-timeline-needle"></div><span class="cesium-timeline-ruler"></span>',this._timeBarEle=this._topDiv.childNodes[0],this._trackContainer=this._topDiv.childNodes[1],this._trackListEle=this._topDiv.childNodes[1].childNodes[0],this._needleEle=this._topDiv.childNodes[2],this._rulerEle=this._topDiv.childNodes[3],this._context=this._trackListEle.getContext("2d"),this._trackList=[],this._highlightRanges=[],this.zoomTo(t.startTime,t.stopTime),this._onMouseDown=hVt(this),this._onMouseUp=fVt(this),this._onMouseMove=pVt(this),this._onMouseWheel=bVt(this),this._onTouchStart=gVt(this),this._onTouchMove=xVt(this),this._onTouchEnd=yVt(this);let o=this._timeBarEle;n.addEventListener("mouseup",this._onMouseUp,!1),n.addEventListener("mousemove",this._onMouseMove,!1),o.addEventListener("mousedown",this._onMouseDown,!1),o.addEventListener("DOMMouseScroll",this._onMouseWheel,!1),o.addEventListener("mousewheel",this._onMouseWheel,!1),o.addEventListener("touchstart",this._onTouchStart,!1),o.addEventListener("touchmove",this._onTouchMove,!1),o.addEventListener("touchend",this._onTouchEnd,!1),o.addEventListener("touchcancel",this._onTouchEnd,!1),this._topDiv.oncontextmenu=function(){return!1},t.onTick.addEventListener(this.updateFromClock,this),this.updateFromClock()}Sl.prototype.addEventListener=function(e,t,n){this._topDiv.addEventListener(e,t,n)};Sl.prototype.removeEventListener=function(e,t,n){this._topDiv.removeEventListener(e,t,n)};Sl.prototype.isDestroyed=function(){return!1};Sl.prototype.destroy=function(){this._clock.onTick.removeEventListener(this.updateFromClock,this);let e=this.container.ownerDocument;e.removeEventListener("mouseup",this._onMouseUp,!1),e.removeEventListener("mousemove",this._onMouseMove,!1);let t=this._timeBarEle;t.removeEventListener("mousedown",this._onMouseDown,!1),t.removeEventListener("DOMMouseScroll",this._onMouseWheel,!1),t.removeEventListener("mousewheel",this._onMouseWheel,!1),t.removeEventListener("touchstart",this._onTouchStart,!1),t.removeEventListener("touchmove",this._onTouchMove,!1),t.removeEventListener("touchend",this._onTouchEnd,!1),t.removeEventListener("touchcancel",this._onTouchEnd,!1),this.container.removeChild(this._topDiv),me(this)};Sl.prototype.addHighlightRange=function(e,t,n){let i=new nN(e,t,n);return this._highlightRanges.push(i),this.resize(),i};Sl.prototype.addTrack=function(e,t,n,i){let o=new iN(e,t,n,i);return this._trackList.push(o),this._lastHeight=void 0,this.resize(),o};Sl.prototype.zoomTo=function(e,t){if(this._startJulian=e,this._endJulian=t,this._timeBarSecondsSpan=q.secondsDifference(t,e),this._clock&&this._clock.clockRange!==Kr.UNBOUNDED){let i=this._clock.startTime,o=this._clock.stopTime,r=q.secondsDifference(o,i),s=q.secondsDifference(i,this._startJulian),a=q.secondsDifference(o,this._endJulian);this._timeBarSecondsSpan>=r?(this._timeBarSecondsSpan=r,this._startJulian=this._clock.startTime,this._endJulian=this._clock.stopTime):s>0?(this._endJulian=q.addSeconds(this._endJulian,s,new q),this._startJulian=i,this._timeBarSecondsSpan=q.secondsDifference(this._endJulian,this._startJulian)):a<0&&(this._startJulian=q.addSeconds(this._startJulian,a,new q),this._endJulian=o,this._timeBarSecondsSpan=q.secondsDifference(this._endJulian,this._startJulian))}this._makeTics();let n=document.createEvent("Event");n.initEvent("setzoom",!0,!0),n.startJulian=this._startJulian,n.endJulian=this._endJulian,n.epochJulian=this._epochJulian,n.totalSpan=this._timeBarSecondsSpan,n.mainTicSpan=this._mainTicSpan,this._topDiv.dispatchEvent(n)};Sl.prototype.zoomFrom=function(e){let t=q.secondsDifference(this._scrubJulian,this._startJulian);e>1||t<0||t>this._timeBarSecondsSpan?t=this._timeBarSecondsSpan*.5:t+=t-this._timeBarSecondsSpan*.5;let n=this._timeBarSecondsSpan-t;this.zoomTo(q.addSeconds(this._startJulian,t-t*e,new q),q.addSeconds(this._endJulian,n*e-n,new q))};function yq(e){return e<10?`0${e.toString()}`:e.toString()}Sl.prototype.makeLabel=function(e){let t=q.toGregorianDate(e),n=t.millisecond,i=" UTC";if(n>0&&this._timeBarSecondsSpan<3600){for(i=Math.floor(n).toString();i.length<3;)i=`0${i}`;i=`.${i}`}return`${mVt[t.month-1]} ${t.day} ${t.year} ${yq(t.hour)}:${yq(t.minute)}:${yq(t.second)}${i}`};Sl.prototype.smallestTicInPixels=7;Sl.prototype._makeTics=function(){let e=this._timeBarEle,t=q.secondsDifference(this._scrubJulian,this._startJulian),n=Math.round(t*this._topDiv.clientWidth/this._timeBarSecondsSpan),i=n-8,o,r=this;this._needleEle.style.left=`${n.toString()}px`;let s="",a=.01,c=31536e6,d=1e-10,u=0,h=this._timeBarSecondsSpan;h<a?(h=a,this._timeBarSecondsSpan=a,this._endJulian=q.addSeconds(this._startJulian,a,new q)):h>c&&(h=c,this._timeBarSecondsSpan=c,this._endJulian=q.addSeconds(this._startJulian,c,new q));let p=this._timeBarEle.clientWidth;p<10&&(p=10);let g=this._startJulian,f=Math.min(h/p*1e-5,.4),x,_=q.toGregorianDate(g);h>31536e4?x=q.fromDate(new Date(Date.UTC(Math.floor(_.year/100)*100,0))):h>31536e3?x=q.fromDate(new Date(Date.UTC(Math.floor(_.year/10)*10,0))):h>86400?x=q.fromDate(new Date(Date.UTC(_.year,0))):x=q.fromDate(new Date(Date.UTC(_.year,_.month,_.day)));let C=q.secondsDifference(this._startJulian,q.addSeconds(x,f,new q)),V=C+h;this._epochJulian=x;function L(k){return Math.floor(C/k)*k}function R(k,H){return Math.ceil(k/H+.5)*H}function G(k){return(k-C)/h}function I(k,H){return k-H*Math.round(k/H)}this._rulerEle.innerHTML=this.makeLabel(q.addSeconds(this._endJulian,-a,new q));let v=this._rulerEle.offsetWidth+20;v<30&&(v=180);let P=u;u-=d;let w={startTime:C,startJulian:g,epochJulian:x,duration:h,timeBarWidth:p,getAlpha:G};this._highlightRanges.forEach(function(k){s+=k.render(w)});let A=0,b=0,Z=0,E=v/p;E>1&&(E=1),E*=this._timeBarSecondsSpan;let X=-1,F=-1,N=rx.length,O;for(O=0;O<N;++O){let k=rx[O];if(++X,A=k,k>E&&k>u)break;F<0&&p*(k/this._timeBarSecondsSpan)>=this.smallestTicInPixels&&(F=X)}if(X>0){for(;X>0;)if(--X,Math.abs(I(A,rx[X]))<1e-5){rx[X]>=u&&(b=rx[X]);break}if(F>=0)for(;F<X;){if(Math.abs(I(b,rx[F]))<1e-5&&rx[F]>=u){Z=rx[F];break}++F}}u=P,u>d&&Z<1e-5&&Math.abs(u-A)>d&&(Z=u,u<=A+d&&(b=0));let U=-999999,Y;if(p*(Z/this._timeBarSecondsSpan)>=3)for(o=L(Z);o<=V;o=R(o,Z))s+=`<span class="cesium-timeline-ticTiny" style="left: ${Math.round(p*G(o)).toString()}px;"></span>`;if(p*(b/this._timeBarSecondsSpan)>=3)for(o=L(b);o<=V;o=R(o,b))s+=`<span class="cesium-timeline-ticSub" style="left: ${Math.round(p*G(o)).toString()}px;"></span>`;if(p*(A/this._timeBarSecondsSpan)>=2){this._mainTicSpan=A,V+=A,o=L(A);let k=q.computeTaiMinusUtc(x);for(;o<=V;){let H=q.addSeconds(g,o-C,new q);if(A>2.1){let j=q.computeTaiMinusUtc(H);Math.abs(j-k)>.1&&(o+=j-k,H=q.addSeconds(g,o-C,new q))}let K=Math.round(p*G(o)),te=this.makeLabel(H);this._rulerEle.innerHTML=te,Y=this._rulerEle.offsetWidth,Y<10&&(Y=v);let z=K-(Y/2-1);z>U?(U=z+Y+5,s+=`<span class="cesium-timeline-ticMain" style="left: ${K.toString()}px;"></span><span class="cesium-timeline-ticLabel" style="left: ${z.toString()}px;">${te}</span>`):s+=`<span class="cesium-timeline-ticSub" style="left: ${K.toString()}px;"></span>`,o=R(o,A)}}else this._mainTicSpan=-1;s+=`<span class="cesium-timeline-icon16" style="left:${i}px;bottom:0;background-position: 0 0;"></span>`,e.innerHTML=s,this._scrubElement=e.lastChild,this._context.clearRect(0,0,this._trackListEle.width,this._trackListEle.height),w.y=0,this._trackList.forEach(function(k){k.render(r._context,w),w.y+=k.height})};Sl.prototype.updateFromClock=function(){this._scrubJulian=this._clock.currentTime;let e=this._scrubElement;if(l(this._scrubElement)){let t=q.secondsDifference(this._scrubJulian,this._startJulian),n=Math.round(t*this._topDiv.clientWidth/this._timeBarSecondsSpan);this._lastXPos!==n&&(this._lastXPos=n,e.style.left=`${n-8}px`,this._needleEle.style.left=`${n}px`)}l(this._timelineDragLocation)&&(this._setTimeBarTime(this._timelineDragLocation,this._timelineDragLocation*this._timeBarSecondsSpan/this._topDiv.clientWidth),this.zoomTo(q.addSeconds(this._startJulian,this._timelineDrag,new q),q.addSeconds(this._endJulian,this._timelineDrag,new q)))};Sl.prototype._setTimeBarTime=function(e,t){if(e=Math.round(e),this._scrubJulian=q.addSeconds(this._startJulian,t,new q),this._scrubElement){let i=e-8;this._scrubElement.style.left=`${i.toString()}px`,this._needleEle.style.left=`${e.toString()}px`}let n=document.createEvent("Event");n.initEvent("settime",!0,!0),n.clientX=e,n.timeSeconds=t,n.timeJulian=this._scrubJulian,n.clock=this._clock,this._topDiv.dispatchEvent(n)};function hVt(e){return function(t){e._mouseMode!==Vm.touchOnly&&(t.button===0?(e._mouseMode=Vm.scrub,e._scrubElement&&(e._scrubElement.style.backgroundPosition="-16px 0"),e._onMouseMove(t)):(e._mouseX=t.clientX,t.button===2?e._mouseMode=Vm.zoom:e._mouseMode=Vm.slide)),t.preventDefault()}}function fVt(e){return function(t){e._mouseMode=Vm.none,e._scrubElement&&(e._scrubElement.style.backgroundPosition="0 0"),e._timelineDrag=0,e._timelineDragLocation=void 0}}function pVt(e){return function(t){let n;if(e._mouseMode===Vm.scrub){t.preventDefault();let i=t.clientX-e._topDiv.getBoundingClientRect().left;i<0?(e._timelineDragLocation=0,e._timelineDrag=-.01*e._timeBarSecondsSpan):i>e._topDiv.clientWidth?(e._timelineDragLocation=e._topDiv.clientWidth,e._timelineDrag=.01*e._timeBarSecondsSpan):(e._timelineDragLocation=void 0,e._setTimeBarTime(i,i*e._timeBarSecondsSpan/e._topDiv.clientWidth))}else if(e._mouseMode===Vm.slide){if(n=e._mouseX-t.clientX,e._mouseX=t.clientX,n!==0){let i=n*e._timeBarSecondsSpan/e._topDiv.clientWidth;e.zoomTo(q.addSeconds(e._startJulian,i,new q),q.addSeconds(e._endJulian,i,new q))}}else e._mouseMode===Vm.zoom&&(n=e._mouseX-t.clientX,e._mouseX=t.clientX,n!==0&&e.zoomFrom(Math.pow(1.01,n)))}}function bVt(e){return function(t){let n=t.wheelDeltaY||t.wheelDelta||-t.detail;gq=Math.max(Math.min(Math.abs(n),gq),1),n/=gq,e.zoomFrom(Math.pow(1.05,-n))}}function gVt(e){return function(t){let n=t.touches.length,i,o,r=e._topDiv.getBoundingClientRect().left;t.preventDefault(),e._mouseMode=Vm.touchOnly,n===1?(i=q.secondsDifference(e._scrubJulian,e._startJulian),o=Math.round(i*e._topDiv.clientWidth/e._timeBarSecondsSpan+r),Math.abs(t.touches[0].clientX-o)<50?(e._touchMode=Tl.scrub,e._scrubElement&&(e._scrubElement.style.backgroundPosition=n===1?"-16px 0":"0 0")):(e._touchMode=Tl.singleTap,e._touchState.centerX=t.touches[0].clientX-r)):n===2?(e._touchMode=Tl.slideZoom,e._touchState.centerX=(t.touches[0].clientX+t.touches[1].clientX)*.5-r,e._touchState.spanX=Math.abs(t.touches[0].clientX-t.touches[1].clientX)):e._touchMode=Tl.ignore}}function yVt(e){return function(t){let n=t.touches.length,i=e._topDiv.getBoundingClientRect().left;e._touchMode===Tl.singleTap?(e._touchMode=Tl.scrub,e._onTouchMove(t)):e._touchMode===Tl.scrub&&e._onTouchMove(t),e._mouseMode=Vm.touchOnly,n!==1?e._touchMode=n>0?Tl.ignore:Tl.none:e._touchMode===Tl.slideZoom&&(e._touchState.centerX=t.touches[0].clientX-i),e._scrubElement&&(e._scrubElement.style.backgroundPosition="0 0")}}function xVt(e){return function(t){let n,i,o,r,s,a,c=1,d=e._topDiv.getBoundingClientRect().left;e._touchMode===Tl.singleTap&&(e._touchMode=Tl.slideZoom),e._mouseMode=Vm.touchOnly,e._touchMode===Tl.scrub?(t.preventDefault(),t.changedTouches.length===1&&(i=t.changedTouches[0].clientX-d,i>=0&&i<=e._topDiv.clientWidth&&e._setTimeBarTime(i,i*e._timeBarSecondsSpan/e._topDiv.clientWidth))):e._touchMode===Tl.slideZoom&&(o=t.touches.length,o===2?(r=(t.touches[0].clientX+t.touches[1].clientX)*.5-d,s=Math.abs(t.touches[0].clientX-t.touches[1].clientX)):o===1&&(r=t.touches[0].clientX-d,s=0),l(r)&&(s>0&&e._touchState.spanX>0?(c=e._touchState.spanX/s,a=q.addSeconds(e._startJulian,(e._touchState.centerX*e._timeBarSecondsSpan-r*e._timeBarSecondsSpan*c)/e._topDiv.clientWidth,new q)):(n=e._touchState.centerX-r,a=q.addSeconds(e._startJulian,n*e._timeBarSecondsSpan/e._topDiv.clientWidth,new q)),e.zoomTo(a,q.addSeconds(a,e._timeBarSecondsSpan*c,new q)),e._touchState.centerX=r,e._touchState.spanX=s))}}Sl.prototype.resize=function(){let e=this.container.clientWidth,t=this.container.clientHeight;if(e===this._lastWidth&&t===this._lastHeight)return;this._trackContainer.style.height=`${t}px`;let n=1;this._trackList.forEach(function(i){n+=i.height}),this._trackListEle.style.height=`${n.toString()}px`,this._trackListEle.width=this._trackListEle.clientWidth,this._trackListEle.height=n,this._makeTics(),this._lastXPos=void 0,this._lastWidth=e,this._lastHeight=t};var oN=Sl;var iWo=T(S(),1);var FXo=T(S(),1);var EXo=T(S(),1);var a1e=T(s1e(),1);function SVt(e){let t=!1,n=window.screen;return l(n)&&(l(n.lockOrientation)?t=n.lockOrientation(e):l(n.mozLockOrientation)?t=n.mozLockOrientation(e):l(n.msLockOrientation)?t=n.msLockOrientation(e):l(n.orientation&&n.orientation.lock)&&(t=n.orientation.lock(e))),t}function c1e(){let e=window.screen;l(e)&&(l(e.unlockOrientation)?e.unlockOrientation():l(e.mozUnlockOrientation)?e.mozUnlockOrientation():l(e.msUnlockOrientation)?e.msUnlockOrientation():l(e.orientation&&e.orientation.unlock)&&e.orientation.unlock())}function CVt(e,t,n,i){i()||(n()?(t.useWebVR=!1,e._locked&&(c1e(),e._locked=!1),e._noSleep.disable(),xr.exitFullscreen(),n(!1)):(xr.fullscreen||xr.requestFullscreen(e._vrElement),e._noSleep.enable(),e._locked||(e._locked=SVt("landscape")),t.useWebVR=!0,n(!0)))}function jB(e,t){let n=this,i=Te.observable(xr.enabled),o=Te.observable(!1);this.isVRMode=void 0,Te.defineProperty(this,"isVRMode",{get:function(){return o()}}),this.isVREnabled=void 0,Te.defineProperty(this,"isVREnabled",{get:function(){return i()},set:function(s){i(s&&xr.enabled)}}),this.tooltip=void 0,Te.defineProperty(this,"tooltip",function(){return i()?o()?"Exit VR mode":"Enter VR mode":"VR mode is unavailable"});let r=Te.observable(!1);this._isOrthographic=void 0,Te.defineProperty(this,"_isOrthographic",{get:function(){return r()}}),this._eventHelper=new fr,this._eventHelper.add(e.preRender,function(){r(e.camera.frustum instanceof ln)}),this._locked=!1,this._noSleep=new a1e.default,this._command=Ln(function(){CVt(n,e,o,r)},Te.getObservable(this,"isVREnabled")),this._vrElement=y(Wn(t),document.body),this._callback=function(){!xr.fullscreen&&o()&&(e.useWebVR=!1,n._locked&&(c1e(),n._locked=!1),n._noSleep.disable(),o(!1))},document.addEventListener(xr.changeEventName,this._callback)}Object.defineProperties(jB.prototype,{vrElement:{get:function(){return this._vrElement},set:function(e){this._vrElement=e}},command:{get:function(){return this._command}}});jB.prototype.isDestroyed=function(){return!1};jB.prototype.destroy=function(){this._eventHelper.removeAll(),document.removeEventListener(xr.changeEventName,this._callback),me(this)};var rN=jB;var VVt="M 5.3125 6.375 C 4.008126 6.375 2.96875 7.4141499 2.96875 8.71875 L 2.96875 19.5 C 2.96875 20.8043 4.008126 21.875 5.3125 21.875 L 13.65625 21.875 C 13.71832 20.0547 14.845166 18.59375 16.21875 18.59375 C 17.592088 18.59375 18.71881 20.0552 18.78125 21.875 L 27.09375 21.875 C 28.398125 21.875 29.4375 20.8043 29.4375 19.5 L 29.4375 8.71875 C 29.4375 7.4141499 28.398125 6.375 27.09375 6.375 L 5.3125 6.375 z M 9.625 10.4375 C 11.55989 10.4375 13.125 12.03385 13.125 13.96875 C 13.125 15.90365 11.55989 17.46875 9.625 17.46875 C 7.69011 17.46875 6.125 15.90365 6.125 13.96875 C 6.125 12.03385 7.69011 10.4375 9.625 10.4375 z M 22.46875 10.4375 C 24.40364 10.4375 25.96875 12.03385 25.96875 13.96875 C 25.96875 15.90365 24.40364 17.46875 22.46875 17.46875 C 20.53386 17.46875 18.96875 15.90365 18.96875 13.96875 C 18.96875 12.03385 20.53386 10.4375 22.46875 10.4375 z",LVt="M 25.770585,2.4552065 C 15.72282,13.962707 10.699956,19.704407 8.1768352,22.580207 c -1.261561,1.4379 -1.902282,2.1427 -2.21875,2.5 -0.141624,0.1599 -0.208984,0.2355 -0.25,0.2813 l 0.6875,0.75 c 10e-5,-10e-5 0.679191,0.727 0.6875,0.7187 0.01662,-0.016 0.02451,-0.024 0.03125,-0.031 0.01348,-0.014 0.04013,-0.038 0.0625,-0.062 0.04474,-0.05 0.120921,-0.1315 0.28125,-0.3126 0.320657,-0.3619 0.956139,-1.0921 2.2187499,-2.5312 2.5252219,-2.8781 7.5454589,-8.6169 17.5937499,-20.1250005 l -1.5,-1.3125 z m -20.5624998,3.9063 c -1.304375,0 -2.34375,1.0391 -2.34375,2.3437 l 0,10.8125005 c 0,1.3043 1.039375,2.375 2.34375,2.375 l 2.25,0 c 1.9518039,-2.2246 7.4710958,-8.5584 13.5624998,-15.5312005 l -15.8124998,0 z m 21.1249998,0 c -1.855467,2.1245 -2.114296,2.4005 -3.59375,4.0936995 1.767282,0.1815 3.15625,1.685301 3.15625,3.500001 0,1.9349 -1.56511,3.5 -3.5,3.5 -1.658043,0 -3.043426,-1.1411 -3.40625,-2.6875 -1.089617,1.2461 -2.647139,2.9988 -3.46875,3.9375 0.191501,-0.062 0.388502,-0.094 0.59375,-0.094 1.373338,0 2.50006,1.4614 2.5625,3.2812 l 8.3125,0 c 1.304375,0 2.34375,-1.0707 2.34375,-2.375 l 0,-10.8125005 c 0,-1.3046 -1.039375,-2.3437 -2.34375,-2.3437 l -0.65625,0 z M 9.5518351,10.423906 c 1.9348899,0 3.4999999,1.596401 3.4999999,3.531301 0,1.9349 -1.56511,3.5 -3.4999999,3.5 -1.9348899,0 -3.4999999,-1.5651 -3.4999999,-3.5 0,-1.9349 1.56511,-3.531301 3.4999999,-3.531301 z m 4.2187499,10.312601 c -0.206517,0.2356 -0.844218,0.9428 -1.03125,1.1562 l 0.8125,0 c 0.01392,-0.4081 0.107026,-0.7968 0.21875,-1.1562 z";function qB(e,t,n){e=Wn(e);let i=new rN(t,n);i._exitVRPath=LVt,i._enterVRPath=VVt;let o=document.createElement("button");o.type="button",o.className="cesium-button cesium-vrButton",o.setAttribute("data-bind",'css: { "cesium-button-disabled" : _isOrthographic }, attr: { title: tooltip },click: command,enable: isVREnabled,cesiumSvgPath: { path: isVRMode ? _exitVRPath : _enterVRPath, width: 32, height: 32 }'),e.appendChild(o),Te.applyBindings(i,o),this._container=e,this._viewModel=i,this._element=o}Object.defineProperties(qB.prototype,{container:{get:function(){return this._container}},viewModel:{get:function(){return this._viewModel}}});qB.prototype.isDestroyed=function(){return!1};qB.prototype.destroy=function(){return this._viewModel.destroy(),Te.cleanNode(this._element),this._container.removeChild(this._element),me(this)};var sN=qB;var l1e=new de;function m1e(e){let t=e.clock;t.currentTime=e.timeJulian,t.shouldAnimate=!1}function RVt(e){let t=e.getPropertyIds(),n="";return t.forEach(function(i){let o=e.getProperty(i);l(o)&&(n+=`<tr><th>${i}</th><td>${o}</td></tr>`)}),n.length>0&&(n=`<table class="cesium-infoBox-defaultTable"><tbody>${n}</tbody></table>`),n}function ZVt(e){let t,n=[],i=e.getPropertyIds();for(t=0;t<i.length;t++){let r=i[t];/^name$/i.test(r)?n[0]=e.getProperty(r):/name/i.test(r)?n[1]=e.getProperty(r):/^title$/i.test(r)?n[2]=e.getProperty(r):/^(id|identifier)$/i.test(r)?n[3]=e.getProperty(r):/element/i.test(r)?n[4]=e.getProperty(r):/(id|identifier)$/i.test(r)&&(n[5]=e.getProperty(r))}let o=n.length;for(t=0;t<o;t++){let r=n[t];if(l(r)&&r!=="")return r}return"Unnamed Feature"}function d1e(e,t){let n=e.scene.pick(t.position);if(l(n)){let i=y(n.id,n.primitive.id);if(i instanceof tr)return i;if(n instanceof Hs)return new tr({name:ZVt(n),description:RVt(n),feature:n})}if(l(e.scene.globe))return IVt(e,t.position)}var GVt=new q;function Sq(e,t){if(l(t)){let n=t.clock;if(l(n)&&l(e)){let i=n.startTime,o=n.stopTime;q.equals(i,o)&&(o=q.addSeconds(i,W.EPSILON2,GVt)),e.updateFromClock(),e.zoomTo(i,o)}}}var EVt=new m;function IVt(e,t){let n=e.scene,i=n.camera.getPickRay(t),o=n.imageryLayers.pickImageryLayerFeatures(i,n);if(!l(o))return;let r=new tr({id:"Loading...",description:"Loading feature information..."});return o.then(function(s){if(e.selectedEntity!==r)return;if(!l(s)||s.length===0){e.selectedEntity=u1e();return}let a=s[0],c=new tr({id:a.name,description:a.description});if(l(a.position)){let d=e.scene.ellipsoid.cartographicToCartesian(a.position,EVt);c.position=new Dc(d)}e.selectedEntity=c},function(){e.selectedEntity===r&&(e.selectedEntity=u1e())}),r}function u1e(){return new tr({id:"None",description:"No features found."})}function XVt(e,t){let n=e._geocoder,i=e._homeButton,o=e._sceneModePicker,r=e._projectionPicker,s=e._baseLayerPicker,a=e._animation,c=e._timeline,d=e._fullscreenButton,u=e._infoBox,h=e._selectionIndicator,p=t?"hidden":"visible";if(l(n)&&(n.container.style.visibility=p),l(i)&&(i.container.style.visibility=p),l(o)&&(o.container.style.visibility=p),l(r)&&(r.container.style.visibility=p),l(s)&&(s.container.style.visibility=p),l(a)&&(a.container.style.visibility=p),l(c)&&(c.container.style.visibility=p),l(d)&&d.viewModel.isFullscreenEnabled&&(d.container.style.visibility=p),l(u)&&(u.container.style.visibility=p),l(h)&&(h.container.style.visibility=p),e._container){let g=t||!l(d)?0:d.container.clientWidth;e._vrButton.container.style.right=`${g}px`,e.forceResize()}}function to(e,t){e=Wn(e),t=y(t,y.EMPTY_OBJECT);let n=(!l(t.globe)||t.globe!==!1)&&(!l(t.baseLayerPicker)||t.baseLayerPicker!==!1),i=this,o=document.createElement("div");o.className="cesium-viewer",e.appendChild(o);let r=document.createElement("div");r.className="cesium-viewer-cesiumWidgetContainer",o.appendChild(r);let s=document.createElement("div");s.className="cesium-viewer-bottom",o.appendChild(s);let a=y(t.scene3DOnly,!1),c,d,u=!1;l(t.clockViewModel)?(d=t.clockViewModel,c=d.clock):(c=new Th,d=new x9(c),u=!0);let h=new EM(r,{baseLayer:n&&l(t.selectedImageryProviderViewModel)||l(t.baseLayer)||l(t.imageryProvider)?!1:void 0,clock:c,shouldAnimate:t.shouldAnimate,skyBox:t.skyBox,skyAtmosphere:t.skyAtmosphere,sceneMode:t.sceneMode,ellipsoid:t.ellipsoid,mapProjection:t.mapProjection,globe:t.globe,orderIndependentTranslucency:t.orderIndependentTranslucency,automaticallyTrackDataSourceClocks:t.automaticallyTrackDataSourceClocks,contextOptions:t.contextOptions,useDefaultRenderLoop:t.useDefaultRenderLoop,targetFrameRate:t.targetFrameRate,showRenderLoopErrors:t.showRenderLoopErrors,useBrowserRecommendedResolution:t.useBrowserRecommendedResolution,creditContainer:l(t.creditContainer)?t.creditContainer:s,creditViewport:t.creditViewport,dataSources:t.dataSources,scene3DOnly:a,shadows:t.shadows,terrainShadows:t.terrainShadows,mapMode2D:t.mapMode2D,blurActiveElementOnCanvasFocus:t.blurActiveElementOnCanvasFocus,requestRenderMode:t.requestRenderMode,maximumRenderTimeChange:t.maximumRenderTimeChange,depthPlaneEllipsoidOffset:t.depthPlaneEllipsoidOffset,msaaSamples:t.msaaSamples}),p=h.scene,g=new fr;g.add(c.onTick,to.prototype._onTick,this);let f;if(!l(t.selectionIndicator)||t.selectionIndicator!==!1){let H=document.createElement("div");H.className="cesium-viewer-selectionIndicatorContainer",o.appendChild(H),f=new tN(H,p)}let x;if(!l(t.infoBox)||t.infoBox!==!1){let H=document.createElement("div");H.className="cesium-viewer-infoBoxContainer",o.appendChild(H),x=new O9(H);let K=x.viewModel;g.add(K.cameraClicked,to.prototype._onInfoBoxCameraClicked,this),g.add(K.closeClicked,to.prototype._onInfoBoxClockClicked,this)}let _=document.createElement("div");_.className="cesium-viewer-toolbar",o.appendChild(_);let C;if(!l(t.geocoder)||t.geocoder!==!1){let H=document.createElement("div");H.className="cesium-viewer-geocoderContainer",_.appendChild(H);let K;typeof t.geocoder=="string"?K=[new PS({scene:p,geocodeProviderType:t.geocoder})]:l(t.geocoder)&&typeof t.geocoder!="boolean"&&(K=Array.isArray(t.geocoder)?t.geocoder:[t.geocoder]),C=new N9({container:H,geocoderServices:K,scene:p}),g.add(C.viewModel.search.beforeExecute,to.prototype._clearObjects,this)}let V;(!l(t.homeButton)||t.homeButton!==!1)&&(V=new U9(_,p),l(C)&&g.add(V.viewModel.command.afterExecute,function(){let H=C.viewModel;H.searchText="",H.isSearchInProgress&&H.search()}),g.add(V.viewModel.command.beforeExecute,to.prototype._clearTrackedObject,this));let L;!a&&(!l(t.sceneModePicker)||t.sceneModePicker!==!1)&&(L=new q9(_,p));let R;t.projectionPicker&&(R=new Q9(_,p));let G,I;if(n){let H=y(t.imageryProviderViewModels,v9()),K=y(t.terrainProviderViewModels,w9());G=new P9(_,{globe:p.globe,imageryProviderViewModels:H,selectedImageryProviderViewModel:t.selectedImageryProviderViewModel,terrainProviderViewModels:K,selectedTerrainProviderViewModel:t.selectedTerrainProviderViewModel}),I=_.getElementsByClassName("cesium-baseLayerPicker-dropDown")[0]}l(t.baseLayer)&&t.baseLayer!==!1&&(n&&(G.viewModel.selectedImagery=void 0),p.imageryLayers.removeAll(),p.imageryLayers.add(t.baseLayer)),l(t.terrainProvider)&&(n&&(G.viewModel.selectedTerrain=void 0),p.terrainProvider=t.terrainProvider),l(t.terrain)&&(n&&(p.globe.depthTestAgainstTerrain=!0),p.setTerrain(t.terrain));let v;if(!l(t.navigationHelpButton)||t.navigationHelpButton!==!1){let H=!0;try{if(l(window.localStorage)){let K=window.localStorage.getItem("cesium-hasSeenNavHelp");l(K)&&K?H=!1:window.localStorage.setItem("cesium-hasSeenNavHelp","true")}}catch{}v=new H9({container:_,instructionsInitiallyVisible:y(t.navigationInstructionsInitiallyVisible,H)})}let P;if(!l(t.animation)||t.animation!==!1){let H=document.createElement("div");H.className="cesium-viewer-animationContainer",o.appendChild(H),P=new Z9(H,new G9(d))}let w;if(!l(t.timeline)||t.timeline!==!1){let H=document.createElement("div");H.className="cesium-viewer-timelineContainer",o.appendChild(H),w=new oN(H,c),w.addEventListener("settime",m1e,!1),w.zoomTo(c.startTime,c.stopTime)}let A,b,Z;(!l(t.fullscreenButton)||t.fullscreenButton!==!1)&&(Z=document.createElement("div"),Z.className="cesium-viewer-fullscreenContainer",o.appendChild(Z),A=new A9(Z,t.fullscreenElement),b=Ga(A.viewModel,"isFullscreenEnabled",function(H){Z.style.display=H?"block":"none",l(w)&&(w.container.style.right=`${Z.clientWidth}px`,w.resize())}));let E,X,F;if(t.vrButton){let H=document.createElement("div");H.className="cesium-viewer-vrContainer",o.appendChild(H),E=new sN(H,p,t.fullScreenElement),X=Ga(E.viewModel,"isVREnabled",function(K){H.style.display=K?"block":"none",l(A)&&(H.style.right=`${Z.clientWidth}px`),l(w)&&(w.container.style.right=`${H.clientWidth}px`,w.resize())}),F=Ga(E.viewModel,"isVRMode",function(K){XVt(i,K)})}this._baseLayerPickerDropDown=I,this._fullscreenSubscription=b,this._vrSubscription=X,this._vrModeSubscription=F,this._dataSourceChangedListeners={},this._container=e,this._bottomContainer=s,this._element=o,this._cesiumWidget=h,this._selectionIndicator=f,this._infoBox=x,this._clockViewModel=d,this._destroyClockViewModel=u,this._toolbar=_,this._homeButton=V,this._sceneModePicker=L,this._projectionPicker=R,this._baseLayerPicker=G,this._navigationHelpButton=v,this._animation=P,this._timeline=w,this._fullscreenButton=A,this._vrButton=E,this._geocoder=C,this._eventHelper=g,this._lastWidth=0,this._lastHeight=0,this._enableInfoOrSelection=l(x)||l(f),this._selectedEntity=void 0,this._selectedEntityChanged=new be;let N=this._cesiumWidget.dataSources,O=this._cesiumWidget.dataSourceDisplay;g.add(N.dataSourceAdded,to.prototype._onDataSourceAdded,this),g.add(N.dataSourceRemoved,to.prototype._onDataSourceRemoved,this),g.add(p.postUpdate,to.prototype.resize,this);let U=N.length;for(let H=0;H<U;H++)this._dataSourceAdded(N,N.get(H));this._dataSourceAdded(void 0,O.defaultDataSource),g.add(N.dataSourceAdded,to.prototype._dataSourceAdded,this),g.add(N.dataSourceRemoved,to.prototype._dataSourceRemoved,this);function Y(H){let K=d1e(i,H);l(K)?J.getValueOrUndefined(K.position,i.clock.currentTime)?i.trackedEntity=K:i.zoomTo(K):l(i.trackedEntity)&&(i.trackedEntity=void 0)}function k(H){i.selectedEntity=d1e(i,H)}h.screenSpaceEventHandler.setInputAction(k,Sn.LEFT_CLICK),h.screenSpaceEventHandler.setInputAction(Y,Sn.LEFT_DOUBLE_CLICK),h._canAnimateUpdateCallback=this._updateCanAnimate(this)}Object.defineProperties(to.prototype,{container:{get:function(){return this._container}},creditDisplay:{get:function(){return this._cesiumWidget.creditDisplay}},bottomContainer:{get:function(){return this._bottomContainer}},cesiumWidget:{get:function(){return this._cesiumWidget}},selectionIndicator:{get:function(){return this._selectionIndicator}},infoBox:{get:function(){return this._infoBox}},geocoder:{get:function(){return this._geocoder}},homeButton:{get:function(){return this._homeButton}},sceneModePicker:{get:function(){return this._sceneModePicker}},projectionPicker:{get:function(){return this._projectionPicker}},baseLayerPicker:{get:function(){return this._baseLayerPicker}},navigationHelpButton:{get:function(){return this._navigationHelpButton}},animation:{get:function(){return this._animation}},timeline:{get:function(){return this._timeline}},fullscreenButton:{get:function(){return this._fullscreenButton}},vrButton:{get:function(){return this._vrButton}},dataSourceDisplay:{get:function(){return this._cesiumWidget.dataSourceDisplay}},entities:{get:function(){return this._cesiumWidget.entities}},dataSources:{get:function(){return this._cesiumWidget.dataSources}},canvas:{get:function(){return this._cesiumWidget.canvas}},scene:{get:function(){return this._cesiumWidget.scene}},shadows:{get:function(){return this.scene.shadowMap.enabled},set:function(e){this.scene.shadowMap.enabled=e}},terrainShadows:{get:function(){return this.scene.globe.shadows},set:function(e){this.scene.globe.shadows=e}},shadowMap:{get:function(){return this.scene.shadowMap}},imageryLayers:{get:function(){return this.scene.imageryLayers}},terrainProvider:{get:function(){return this.scene.terrainProvider},set:function(e){this.scene.terrainProvider=e}},camera:{get:function(){return this.scene.camera}},ellipsoid:{get:function(){return this._scene.ellipsoid}},postProcessStages:{get:function(){return this.scene.postProcessStages}},clock:{get:function(){return this._clockViewModel.clock}},clockViewModel:{get:function(){return this._clockViewModel}},screenSpaceEventHandler:{get:function(){return this._cesiumWidget.screenSpaceEventHandler}},targetFrameRate:{get:function(){return this._cesiumWidget.targetFrameRate},set:function(e){this._cesiumWidget.targetFrameRate=e}},useDefaultRenderLoop:{get:function(){return this._cesiumWidget.useDefaultRenderLoop},set:function(e){this._cesiumWidget.useDefaultRenderLoop=e}},resolutionScale:{get:function(){return this._cesiumWidget.resolutionScale},set:function(e){this._cesiumWidget.resolutionScale=e}},useBrowserRecommendedResolution:{get:function(){return this._cesiumWidget.useBrowserRecommendedResolution},set:function(e){this._cesiumWidget.useBrowserRecommendedResolution=e}},allowDataSourcesToSuspendAnimation:{get:function(){return this._cesiumWidget.allowDataSourcesToSuspendAnimation},set:function(e){this._cesiumWidget.allowDataSourcesToSuspendAnimation=e}},trackedEntity:{get:function(){return this._cesiumWidget.trackedEntity},set:function(e){this._cesiumWidget.trackedEntity=e}},selectedEntity:{get:function(){return this._selectedEntity},set:function(e){if(this._selectedEntity!==e){this._selectedEntity=e;let t=l(this._selectionIndicator)?this._selectionIndicator.viewModel:void 0;l(e)?l(t)&&t.animateAppear():l(t)&&t.animateDepart(),this._selectedEntityChanged.raiseEvent(e)}}},selectedEntityChanged:{get:function(){return this._selectedEntityChanged}},trackedEntityChanged:{get:function(){return this._cesiumWidget.trackedEntityChanged}},clockTrackedDataSource:{get:function(){return this._cesiumWidget.clockTrackedDataSource},set:function(e){this._cesiumWidget.clockTrackedDataSource!==e&&(this._cesiumWidget.clockTrackedDataSource=e,Sq(this._timeline,e))}}});to.prototype.extend=function(e,t){e(this,t)};to.prototype.resize=function(){let e=this._cesiumWidget,t=this._container,n=t.clientWidth,i=t.clientHeight,o=l(this._animation),r=l(this._timeline);if(e.resize(),n===this._lastWidth&&i===this._lastHeight)return;let s=i-125,a=this._baseLayerPickerDropDown;if(l(a)&&(a.style.maxHeight=`${s}px`),l(this._geocoder)){let f=this._geocoder.searchSuggestionsContainer;f.style.maxHeight=`${s}px`}l(this._infoBox)&&(this._infoBox.viewModel.maxHeight=s);let c=this._timeline,d,u=0,h=5,p=3,g=0;if(o&&window.getComputedStyle(this._animation.container).visibility!=="hidden"){let f=this._lastWidth;d=this._animation.container,n>900?(u=169,f<=900&&(d.style.width="169px",d.style.height="112px",this._animation.resize())):n>=600?(u=136,(f<600||f>900)&&(d.style.width="136px",d.style.height="90px",this._animation.resize())):(u=106,(f>600||f===0)&&(d.style.width="106px",d.style.height="70px",this._animation.resize())),h=u+5}if(r&&window.getComputedStyle(this._timeline.container).visibility!=="hidden"){let f=this._fullscreenButton,x=this._vrButton,_=c.container,C=_.style;p=_.clientHeight+3,C.left=`${u}px`;let V=0;l(f)&&(V+=f.container.clientWidth),l(x)&&(V+=x.container.clientWidth),C.right=`${V}px`,c.resize()}!r&&l(this._fullscreenButton)&&(g=this._fullscreenButton.container.clientWidth),this._bottomContainer.style.left=`${h}px`,this._bottomContainer.style.bottom=`${p}px`,this._bottomContainer.style.right=`${g}px`,this._lastWidth=n,this._lastHeight=i};to.prototype.forceResize=function(){this._lastWidth=0,this.resize()};to.prototype.render=function(){this._cesiumWidget.render()};to.prototype.isDestroyed=function(){return!1};to.prototype.destroy=function(){return l(this.screenSpaceEventHandler)&&!this.screenSpaceEventHandler.isDestroyed()&&(this.screenSpaceEventHandler.removeInputAction(Sn.LEFT_CLICK),this.screenSpaceEventHandler.removeInputAction(Sn.LEFT_DOUBLE_CLICK)),this._container.removeChild(this._element),this._element.removeChild(this._toolbar),this._eventHelper.removeAll(),l(this._geocoder)&&(this._geocoder=this._geocoder.destroy()),l(this._homeButton)&&(this._homeButton=this._homeButton.destroy()),l(this._sceneModePicker)&&(this._sceneModePicker=this._sceneModePicker.destroy()),l(this._projectionPicker)&&(this._projectionPicker=this._projectionPicker.destroy()),l(this._baseLayerPicker)&&(this._baseLayerPicker=this._baseLayerPicker.destroy()),l(this._animation)&&(this._element.removeChild(this._animation.container),this._animation=this._animation.destroy()),l(this._timeline)&&(this._timeline.removeEventListener("settime",m1e,!1),this._element.removeChild(this._timeline.container),this._timeline=this._timeline.destroy()),l(this._fullscreenButton)&&(this._fullscreenSubscription.dispose(),this._element.removeChild(this._fullscreenButton.container),this._fullscreenButton=this._fullscreenButton.destroy()),l(this._vrButton)&&(this._vrSubscription.dispose(),this._vrModeSubscription.dispose(),this._element.removeChild(this._vrButton.container),this._vrButton=this._vrButton.destroy()),l(this._infoBox)&&(this._element.removeChild(this._infoBox.container),this._infoBox=this._infoBox.destroy()),l(this._selectionIndicator)&&(this._element.removeChild(this._selectionIndicator.container),this._selectionIndicator=this._selectionIndicator.destroy()),this._destroyClockViewModel&&(this._clockViewModel=this._clockViewModel.destroy()),this._cesiumWidget=this._cesiumWidget.destroy(),me(this)};to.prototype._dataSourceAdded=function(e,t){t.entities.collectionChanged.addEventListener(to.prototype._onEntityCollectionChanged,this)};to.prototype._dataSourceRemoved=function(e,t){let n=t.entities;n.collectionChanged.removeEventListener(to.prototype._onEntityCollectionChanged,this),l(this.selectedEntity)&&n.getById(this.selectedEntity.id)===this.selectedEntity&&(this.selectedEntity=void 0)};to.prototype._updateCanAnimate=function(e){return function(t){e._clockViewModel.canAnimate=t}};to.prototype._onTick=function(e){let t=e.currentTime,n,i=!1,o=this.selectedEntity,r=l(o)&&this._enableInfoOrSelection;r&&o.isShowing&&o.isAvailable(t)&&(this._cesiumWidget.dataSourceDisplay.getBoundingSphere(o,!0,l1e)!==dt.FAILED?n=l1e.center:l(o.position)&&(n=o.position.getValue(t,n)),i=l(n));let s=l(this._selectionIndicator)?this._selectionIndicator.viewModel:void 0;l(s)&&(s.position=m.clone(n,s.position),s.showSelection=r&&i,s.update());let a=l(this._infoBox)?this._infoBox.viewModel:void 0;l(a)&&(a.showInfo=r,a.enableCamera=i,a.isCameraTracking=this.trackedEntity===this.selectedEntity,r?(a.titleText=y(o.name,o.id),a.description=J.getValueOrDefault(o.description,t,"")):(a.titleText="",a.description=""))};to.prototype._onEntityCollectionChanged=function(e,t,n){let i=n.length;for(let o=0;o<i;o++){let r=n[o];this.selectedEntity===r&&(this.selectedEntity=void 0)}};to.prototype._onInfoBoxCameraClicked=function(e){if(e.isCameraTracking&&this.trackedEntity===this.selectedEntity)this.trackedEntity=void 0;else{let n=this.selectedEntity.position;l(n)?this.trackedEntity=this.selectedEntity:this.zoomTo(this.selectedEntity)}};to.prototype._clearTrackedObject=function(){this.trackedEntity=void 0};to.prototype._onInfoBoxClockClicked=function(e){this.selectedEntity=void 0};to.prototype._clearObjects=function(){this.trackedEntity=void 0,this.selectedEntity=void 0};to.prototype._onDataSourceChanged=function(e){this.clockTrackedDataSource===e&&Sq(this.timeline,e)};to.prototype._onDataSourceAdded=function(e,t){this._cesiumWidget._automaticallyTrackDataSourceClocks&&t===this.clockTrackedDataSource&&Sq(this._timeline,t);let n=t.entities.id,i=this._eventHelper.add(t.changedEvent,to.prototype._onDataSourceChanged,this);this._dataSourceChangedListeners[n]=i};to.prototype._onDataSourceRemoved=function(e,t){let n=t.entities.id;this._dataSourceChangedListeners[n](),this._dataSourceChangedListeners[n]=void 0};to.prototype.zoomTo=function(e,t){return this._cesiumWidget.zoomTo(e,t)};to.prototype.flyTo=function(e,t){return this._cesiumWidget.flyTo(e,t)};var Cq=to;var sWo=T(S(),1);function WVt(e){let t=document.createElement("div");t.className="cesium-viewer-cesium3DTilesInspectorContainer",e.container.appendChild(t);let n=new V9(t,e.scene);Object.defineProperties(e,{cesium3DTilesInspector:{get:function(){return n}}})}var Vq=WVt;var lWo=T(S(),1);function PVt(e){let t=document.createElement("div");t.className="cesium-viewer-cesiumInspectorContainer",e.container.appendChild(t);let n=new X9(t,e.scene);Object.defineProperties(e,{cesiumInspector:{get:function(){return n}}})}var Lq=PVt;var hWo=T(S(),1);function vVt(e,t){t=y(t,y.EMPTY_OBJECT);let n=!0,i=y(t.flyToOnDrop,!0),o=new be,r=y(t.clearOnDrop,!0),s=y(t.dropTarget,e.container),a=y(t.clampToGround,!0),c=t.proxy;s=Wn(s),Object.defineProperties(e,{dropTarget:{get:function(){return s},set:function(u){h1e(s,d),s=u,Rq(s,d)}},dropEnabled:{get:function(){return n},set:function(u){u!==n&&(u?Rq(s,d):h1e(s,d),n=u)}},dropError:{get:function(){return o}},clearOnDrop:{get:function(){return r},set:function(u){r=u}},flyToOnDrop:{get:function(){return i},set:function(u){i=u}},proxy:{get:function(){return c},set:function(u){c=u}},clampToGround:{get:function(){return a},set:function(u){a=u}}});function d(u){HS(u),r&&(e.entities.removeAll(),e.dataSources.removeAll());let h=u.dataTransfer.files,p=h.length;for(let g=0;g<p;g++){let f=h[g],x=new FileReader;x.onload=wVt(e,f,c,a),x.onerror=FVt(e,f),x.readAsText(f)}}Rq(s,d),e.destroy=BM(e,e.destroy,function(){e.dropEnabled=!1}),e._handleDrop=d}function HS(e){e.stopPropagation(),e.preventDefault()}function h1e(e,t){let n=e;l(n)&&(n.removeEventListener("drop",t,!1),n.removeEventListener("dragenter",HS,!1),n.removeEventListener("dragover",HS,!1),n.removeEventListener("dragexit",HS,!1))}function Rq(e,t){e.addEventListener("drop",t,!1),e.addEventListener("dragenter",HS,!1),e.addEventListener("dragover",HS,!1),e.addEventListener("dragexit",HS,!1)}function wVt(e,t,n,i){let o=e.scene;return function(r){let s=t.name;try{let a;if(/\.czml$/i.test(s))a=sv.load(JSON.parse(r.target.result),{sourceUri:s});else if(/\.geojson$/i.test(s)||/\.json$/i.test(s)||/\.topojson$/i.test(s))a=Cy.load(JSON.parse(r.target.result),{sourceUri:s,clampToGround:i});else if(/\.(kml|kmz)$/i.test(s))a=NT.load(t,{sourceUri:s,proxy:n,camera:o.camera,canvas:o.canvas,clampToGround:i,screenOverlayContainer:e.container});else if(/\.gpx$/i.test(s))a=gw.load(t,{sourceUri:s,proxy:n});else{e.dropError.raiseEvent(e,s,`Unrecognized file: ${s}`);return}l(a)&&e.dataSources.add(a).then(function(c){e.flyToOnDrop&&e.flyTo(c)}).catch(function(c){e.dropError.raiseEvent(e,s,c)})}catch(a){e.dropError.raiseEvent(e,s,a)}}}function FVt(e,t){return function(n){e.dropError.raiseEvent(e,t.name,n.target.error)}}var Zq=vVt;var xWo=T(S(),1);function AVt(e,t){t=y(t,y.EMPTY_OBJECT);let n=new K9({scene:e.scene,container:e.bottomContainer,lowFrameRateMessage:t.lowFrameRateMessage});Object.defineProperties(e,{performanceWatchdog:{get:function(){return n}}})}var Gq=AVt;var vWo=T(S(),1);var XWo=T(S(),1);var VWo=T(S(),1);function f1e(e){let t=e.split(` `),n;for(n=0;n<t.length&&!t[n].match(/\S/);n++);if(n===t.length)return"";let i="",o=/^\s*/,s=t[n].match(o)[0].length;for(let a=n;a<t.length;a++){let c=t[a];c.match(o)[0].length>=s&&(c=c.slice(s)),i+=`${c} `}return i}function Lm(e){this._scene=e,this._voxelPrimitive=void 0,this._customShaderCompilationRemoveCallback=void 0,this._definedProperties=[],this._getPrimitiveFunctions=[],this._modelMatrixReady=!1;let t=this;function n(o){let{name:r,initialValue:s}=o;t._definedProperties.push(r);let a=o.setPrimitiveFunction;a===!0&&(a=function(u){t._voxelPrimitive[r]=u});let c=o.getPrimitiveFunction;c===!0&&(c=function(){t[r]=t._voxelPrimitive[r]}),l(c)&&t._getPrimitiveFunctions.push(c);let d=Te.observable();return Te.defineProperty(t,r,{get:function(){return d()},set:function(u){typeof s=="number"&&typeof u=="string"&&(u=Number(u),isNaN(u)&&(u=s)),typeof s=="boolean"&&typeof u=="number"&&(u=u===1),d(u),l(a)&&l(t._voxelPrimitive)&&(a(u),e.requestRender())}}),t[r]=s,d}function i(o,r){return function(s){let a=t._voxelPrimitive[o].clone();a[r]=s,t._voxelPrimitive[o]=a}}n({name:"inspectorVisible",initialValue:!0}),n({name:"displayVisible",initialValue:!1}),n({name:"transformVisible",initialValue:!1}),n({name:"boundsVisible",initialValue:!1}),n({name:"clippingVisible",initialValue:!1}),n({name:"shaderVisible",initialValue:!1}),n({name:"shaderString",initialValue:"",getPrimitiveFunction:function(){let o=t._voxelPrimitive.customShader.fragmentShaderText;t.shaderString=f1e(o)}}),n({name:"shaderCompilationMessage",initialValue:""}),n({name:"shaderCompilationSuccess",initialValue:!0}),n({name:"depthTest",initialValue:!1,setPrimitiveFunction:!0,getPrimitiveFunction:!0}),n({name:"show",initialValue:!0,setPrimitiveFunction:!0,getPrimitiveFunction:!0}),n({name:"disableUpdate",initialValue:!1,setPrimitiveFunction:!0,getPrimitiveFunction:!0}),n({name:"debugDraw",initialValue:!1,setPrimitiveFunction:!0,getPrimitiveFunction:!0}),n({name:"jitter",initialValue:!0,setPrimitiveFunction:!0,getPrimitiveFunction:!0}),n({name:"nearestSampling",initialValue:!0,setPrimitiveFunction:!0,getPrimitiveFunction:!0}),n({name:"screenSpaceError",initialValue:4,setPrimitiveFunction:!0,getPrimitiveFunction:!0}),n({name:"stepSize",initialValue:1,setPrimitiveFunction:!0,getPrimitiveFunction:!0}),n({name:"shapeIsBox",getPrimitiveFunction:function(){let o=t._voxelPrimitive.shape;t.shapeIsBox=o===Ni.BOX}}),n({name:"shapeIsEllipsoid",getPrimitiveFunction:function(){let o=t._voxelPrimitive.shape;t.shapeIsEllipsoid=o===Ni.ELLIPSOID}}),n({name:"shapeIsCylinder",getPrimitiveFunction:function(){let o=t._voxelPrimitive.shape;t.shapeIsCylinder=o===Ni.CYLINDER}}),n({name:"boundsBoxMaxX",initialValue:0,setPrimitiveFunction:i("maxBounds","x"),getPrimitiveFunction:function(){t.boundsBoxMaxX=t._voxelPrimitive.maxBounds.x}}),n({name:"boundsBoxMinX",initialValue:0,setPrimitiveFunction:i("minBounds","x"),getPrimitiveFunction:function(){t.boundsBoxMinX=t._voxelPrimitive.minBounds.x}}),n({name:"boundsBoxMaxY",initialValue:0,setPrimitiveFunction:i("maxBounds","y"),getPrimitiveFunction:function(){t.boundsBoxMaxY=t._voxelPrimitive.maxBounds.y}}),n({name:"boundsBoxMinY",initialValue:0,setPrimitiveFunction:i("minBounds","y"),getPrimitiveFunction:function(){t.boundsBoxMinY=t._voxelPrimitive.minBounds.y}}),n({name:"boundsBoxMaxZ",initialValue:0,setPrimitiveFunction:i("maxBounds","z"),getPrimitiveFunction:function(){t.boundsBoxMaxZ=t._voxelPrimitive.maxBounds.z}}),n({name:"boundsBoxMinZ",initialValue:0,setPrimitiveFunction:i("minBounds","z"),getPrimitiveFunction:function(){t.boundsBoxMinZ=t._voxelPrimitive.minBounds.z}}),n({name:"boundsEllipsoidMaxLongitude",initialValue:0,setPrimitiveFunction:i("maxBounds","x"),getPrimitiveFunction:function(){t.boundsEllipsoidMaxLongitude=t._voxelPrimitive.maxBounds.x}}),n({name:"boundsEllipsoidMinLongitude",initialValue:0,setPrimitiveFunction:i("minBounds","x"),getPrimitiveFunction:function(){t.boundsEllipsoidMinLongitude=t._voxelPrimitive.minBounds.x}}),n({name:"boundsEllipsoidMaxLatitude",initialValue:0,setPrimitiveFunction:i("maxBounds","y"),getPrimitiveFunction:function(){t.boundsEllipsoidMaxLatitude=t._voxelPrimitive.maxBounds.y}}),n({name:"boundsEllipsoidMinLatitude",initialValue:0,setPrimitiveFunction:i("minBounds","y"),getPrimitiveFunction:function(){t.boundsEllipsoidMinLatitude=t._voxelPrimitive.minBounds.y}}),n({name:"boundsEllipsoidMaxHeight",initialValue:0,setPrimitiveFunction:i("maxBounds","z"),getPrimitiveFunction:function(){t.boundsEllipsoidMaxHeight=t._voxelPrimitive.maxBounds.z}}),n({name:"boundsEllipsoidMinHeight",initialValue:0,setPrimitiveFunction:i("minBounds","z"),getPrimitiveFunction:function(){t.boundsEllipsoidMinHeight=t._voxelPrimitive.minBounds.z}}),n({name:"boundsCylinderMaxRadius",initialValue:0,setPrimitiveFunction:i("maxBounds","x"),getPrimitiveFunction:function(){t.boundsCylinderMaxRadius=t._voxelPrimitive.maxBounds.x}}),n({name:"boundsCylinderMinRadius",initialValue:0,setPrimitiveFunction:i("minBounds","x"),getPrimitiveFunction:function(){t.boundsCylinderMinRadius=t._voxelPrimitive.minBounds.x}}),n({name:"boundsCylinderMaxHeight",initialValue:0,setPrimitiveFunction:i("maxBounds","y"),getPrimitiveFunction:function(){t.boundsCylinderMaxHeight=t._voxelPrimitive.maxBounds.y}}),n({name:"boundsCylinderMinHeight",initialValue:0,setPrimitiveFunction:i("minBounds","y"),getPrimitiveFunction:function(){t.boundsCylinderMinHeight=t._voxelPrimitive.minBounds.y}}),n({name:"boundsCylinderMaxAngle",initialValue:0,setPrimitiveFunction:i("maxBounds","z"),getPrimitiveFunction:function(){t.boundsCylinderMaxAngle=t._voxelPrimitive.maxBounds.z}}),n({name:"boundsCylinderMinAngle",initialValue:0,setPrimitiveFunction:i("minBounds","z"),getPrimitiveFunction:function(){t.boundsCylinderMinAngle=t._voxelPrimitive.minBounds.z}}),n({name:"clippingBoxMaxX",initialValue:0,setPrimitiveFunction:i("maxClippingBounds","x"),getPrimitiveFunction:function(){t.clippingBoxMaxX=t._voxelPrimitive.maxClippingBounds.x}}),n({name:"clippingBoxMinX",initialValue:0,setPrimitiveFunction:i("minClippingBounds","x"),getPrimitiveFunction:function(){t.clippingBoxMinX=t._voxelPrimitive.minClippingBounds.x}}),n({name:"clippingBoxMaxY",initialValue:0,setPrimitiveFunction:i("maxClippingBounds","y"),getPrimitiveFunction:function(){t.clippingBoxMaxY=t._voxelPrimitive.maxClippingBounds.y}}),n({name:"clippingBoxMinY",initialValue:0,setPrimitiveFunction:i("minClippingBounds","y"),getPrimitiveFunction:function(){t.clippingBoxMinY=t._voxelPrimitive.minClippingBounds.y}}),n({name:"clippingBoxMaxZ",initialValue:0,setPrimitiveFunction:i("maxClippingBounds","z"),getPrimitiveFunction:function(){t.clippingBoxMaxZ=t._voxelPrimitive.maxClippingBounds.z}}),n({name:"clippingBoxMinZ",initialValue:0,setPrimitiveFunction:i("minClippingBounds","z"),getPrimitiveFunction:function(){t.clippingBoxMinZ=t._voxelPrimitive.minClippingBounds.z}}),n({name:"clippingEllipsoidMaxLongitude",initialValue:0,setPrimitiveFunction:i("maxClippingBounds","x"),getPrimitiveFunction:function(){t.clippingEllipsoidMaxLongitude=t._voxelPrimitive.maxClippingBounds.x}}),n({name:"clippingEllipsoidMinLongitude",initialValue:0,setPrimitiveFunction:i("minClippingBounds","x"),getPrimitiveFunction:function(){t.clippingEllipsoidMinLongitude=t._voxelPrimitive.minClippingBounds.x}}),n({name:"clippingEllipsoidMaxLatitude",initialValue:0,setPrimitiveFunction:i("maxClippingBounds","y"),getPrimitiveFunction:function(){t.clippingEllipsoidMaxLatitude=t._voxelPrimitive.maxClippingBounds.y}}),n({name:"clippingEllipsoidMinLatitude",initialValue:0,setPrimitiveFunction:i("minClippingBounds","y"),getPrimitiveFunction:function(){t.clippingEllipsoidMinLatitude=t._voxelPrimitive.minClippingBounds.y}}),n({name:"clippingEllipsoidMaxHeight",initialValue:0,setPrimitiveFunction:i("maxClippingBounds","z"),getPrimitiveFunction:function(){t.clippingEllipsoidMaxHeight=t._voxelPrimitive.maxClippingBounds.z}}),n({name:"clippingEllipsoidMinHeight",initialValue:0,setPrimitiveFunction:i("minClippingBounds","z"),getPrimitiveFunction:function(){t.clippingEllipsoidMinHeight=t._voxelPrimitive.minClippingBounds.z}}),n({name:"clippingCylinderMaxRadius",initialValue:0,setPrimitiveFunction:i("maxClippingBounds","x"),getPrimitiveFunction:function(){t.clippingCylinderMaxRadius=t._voxelPrimitive.maxClippingBounds.x}}),n({name:"clippingCylinderMinRadius",initialValue:0,setPrimitiveFunction:i("minClippingBounds","x"),getPrimitiveFunction:function(){t.clippingCylinderMinRadius=t._voxelPrimitive.minClippingBounds.x}}),n({name:"clippingCylinderMaxHeight",initialValue:0,setPrimitiveFunction:i("maxClippingBounds","y"),getPrimitiveFunction:function(){t.clippingCylinderMaxHeight=t._voxelPrimitive.maxClippingBounds.y}}),n({name:"clippingCylinderMinHeight",initialValue:0,setPrimitiveFunction:i("minClippingBounds","y"),getPrimitiveFunction:function(){t.clippingCylinderMinHeight=t._voxelPrimitive.minClippingBounds.y}}),n({name:"clippingCylinderMaxAngle",initialValue:0,setPrimitiveFunction:i("maxClippingBounds","z"),getPrimitiveFunction:function(){t.clippingCylinderMaxAngle=t._voxelPrimitive.maxClippingBounds.z}}),n({name:"clippingCylinderMinAngle",initialValue:0,setPrimitiveFunction:i("minClippingBounds","z"),getPrimitiveFunction:function(){t.clippingCylinderMinAngle=t._voxelPrimitive.minClippingBounds.z}}),n({name:"translationX",initialValue:0,setPrimitiveFunction:function(){t._modelMatrixReady&&Tp(t)},getPrimitiveFunction:function(){t.translationX=M.getTranslation(t._voxelPrimitive.modelMatrix,new m).x}}),n({name:"translationY",initialValue:0,setPrimitiveFunction:function(){t._modelMatrixReady&&Tp(t)},getPrimitiveFunction:function(){t.translationY=M.getTranslation(t._voxelPrimitive.modelMatrix,new m).y}}),n({name:"translationZ",initialValue:0,setPrimitiveFunction:function(){t._modelMatrixReady&&Tp(t)},getPrimitiveFunction:function(){t.translationZ=M.getTranslation(t._voxelPrimitive.modelMatrix,new m).z}}),n({name:"scaleX",initialValue:1,setPrimitiveFunction:function(){t._modelMatrixReady&&Tp(t)},getPrimitiveFunction:function(){t.scaleX=M.getScale(t._voxelPrimitive.modelMatrix,new m).x}}),n({name:"scaleY",initialValue:1,setPrimitiveFunction:function(){t._modelMatrixReady&&Tp(t)},getPrimitiveFunction:function(){t.scaleY=M.getScale(t._voxelPrimitive.modelMatrix,new m).y}}),n({name:"scaleZ",initialValue:1,setPrimitiveFunction:function(){t._modelMatrixReady&&Tp(t)},getPrimitiveFunction:function(){t.scaleZ=M.getScale(t._voxelPrimitive.modelMatrix,new m).z}}),n({name:"angleX",initialValue:0,setPrimitiveFunction:function(){t._modelMatrixReady&&Tp(t)}}),n({name:"angleY",initialValue:0,setPrimitiveFunction:function(){t._modelMatrixReady&&Tp(t)}}),n({name:"angleZ",initialValue:0,setPrimitiveFunction:function(){t._modelMatrixReady&&Tp(t)}})}var MVt=new m,NVt=new m,kVt=new Xa,UVt=new $;function Tp(e){let t=m.fromElements(e.translationX,e.translationY,e.translationZ,MVt),n=m.fromElements(e.scaleX,e.scaleY,e.scaleZ,NVt),i=kVt;i.heading=e.angleX,i.pitch=e.angleY,i.roll=e.angleZ;let o=$.fromHeadingPitchRoll(i,UVt),r=$.multiplyByScale(o,n,o);e._voxelPrimitive.modelMatrix=M.fromRotationTranslation(r,t,e._voxelPrimitive.modelMatrix)}Object.defineProperties(Lm.prototype,{scene:{get:function(){return this._scene}},voxelPrimitive:{get:function(){return this._voxelPrimitive},set:function(e){if(l(this._customShaderCompilationRemoveCallback)&&this._customShaderCompilationRemoveCallback(),l(e)){this._voxelPrimitive=e;let t=this;t._customShaderCompilationRemoveCallback=t._voxelPrimitive.customShaderCompilationEvent.addEventListener(function(n){let i=t._voxelPrimitive.customShader.fragmentShaderText;t.shaderString=f1e(i),l(n)?(t.shaderCompilationMessage=n.message,t.shaderCompilationSuccess=!1):(t.shaderCompilationMessage="Shader compiled successfully!",t.shaderCompilationSuccess=!0)}),t._modelMatrixReady=!1;for(let n=0;n<t._getPrimitiveFunctions.length;n++)t._getPrimitiveFunctions[n]();t._modelMatrixReady=!0,Tp(t)}}}});Lm.prototype.toggleInspector=function(){this.inspectorVisible=!this.inspectorVisible};Lm.prototype.toggleDisplay=function(){this.displayVisible=!this.displayVisible};Lm.prototype.toggleTransform=function(){this.transformVisible=!this.transformVisible};Lm.prototype.toggleBounds=function(){this.boundsVisible=!this.boundsVisible};Lm.prototype.toggleClipping=function(){this.clippingVisible=!this.clippingVisible};Lm.prototype.toggleShader=function(){this.shaderVisible=!this.shaderVisible};Lm.prototype.compileShader=function(){l(this._voxelPrimitive)&&(this._voxelPrimitive.customShader=new yS({fragmentShaderText:this.shaderString,uniforms:this._voxelPrimitive.customShader.uniforms}))};Lm.prototype.shaderEditorKeyPress=function(e,t){if(t.keyCode===9){t.preventDefault();let n=t.target,i=n.selectionStart,o=n.selectionEnd,r=o,a=n.value.slice(i,o).split(` `),c=a.length,d;if(t.shiftKey)for(d=0;d<c;++d)a[d][0]===" "&&(a[d][1]===" "?(a[d]=a[d].substr(2),r-=2):(a[d]=a[d].substr(1),r-=1));else for(d=0;d<c;++d)a[d]=` ${a[d]}`,r+=2;let u=a.join(` `);n.value=n.value.slice(0,i)+u+n.value.slice(o),n.selectionStart=i!==o?i:r,n.selectionEnd=r}else t.ctrlKey&&(t.keyCode===10||t.keyCode===13)&&this.compileShader();return!0};Lm.prototype.isDestroyed=function(){return!1};Lm.prototype.destroy=function(){let e=this;return this._definedProperties.forEach(function(t){Te.getObservable(e,t).dispose()}),me(this)};var aN=Lm;function $B(e,t){e=Wn(e);let n=document.createElement("div"),i=new aN(t);this._viewModel=i,this._container=e,this._element=n;let o=document.createElement("div");o.textContent="Voxel Inspector",o.className="cesium-cesiumInspector-button",o.setAttribute("data-bind","click: toggleInspector"),n.appendChild(o),n.className="cesium-cesiumInspector cesium-VoxelInspector",n.setAttribute("data-bind",'css: { "cesium-cesiumInspector-visible" : inspectorVisible, "cesium-cesiumInspector-hidden" : !inspectorVisible}'),e.appendChild(n);let r=document.createElement("div");r.className="cesium-cesiumInspector-dropDown",n.appendChild(r);let s=qa.createSection,a=qa.createCheckbox,c=qa.createRangeInput,d=qa.createButton,u=s(r,"Display","displayVisible","toggleDisplay"),h=s(r,"Transform","transformVisible","toggleTransform"),p=s(r,"Bounds","boundsVisible","toggleBounds"),g=s(r,"Clipping","clippingVisible","toggleClipping"),f=s(r,"Shader","shaderVisible","toggleShader");u.appendChild(a("Depth Test","depthTest")),u.appendChild(a("Show","show")),u.appendChild(a("Disable Update","disableUpdate")),u.appendChild(a("Debug Draw","debugDraw")),u.appendChild(a("Jitter","jitter")),u.appendChild(a("Nearest Sampling","nearestSampling")),u.appendChild(c("Screen Space Error","screenSpaceError",0,128)),u.appendChild(c("Step Size","stepSize",0,2));let x=10,_=10,C=W.PI;h.appendChild(c("Translation X","translationX",-x,+x)),h.appendChild(c("Translation Y","translationY",-x,+x)),h.appendChild(c("Translation Z","translationZ",-x,+x)),h.appendChild(c("Scale X","scaleX",0,+_)),h.appendChild(c("Scale Y","scaleY",0,+_)),h.appendChild(c("Scale Z","scaleZ",0,+_)),h.appendChild(c("Heading","angleX",-C,+C)),h.appendChild(c("Pitch","angleY",-C,+C)),h.appendChild(c("Roll","angleZ",-C,+C));let V=Ni.getMinBounds(Ni.BOX),L=Ni.getMaxBounds(Ni.BOX),R=m.fromElements(Ni.getMinBounds(Ni.ELLIPSOID).x,Ni.getMinBounds(Ni.ELLIPSOID).y,-ne.WGS84.maximumRadius,new m),G=m.fromElements(Ni.getMaxBounds(Ni.ELLIPSOID).x,Ni.getMaxBounds(Ni.ELLIPSOID).y,1e7,new m),I=Ni.getMinBounds(Ni.CYLINDER),v=Ni.getMaxBounds(Ni.CYLINDER);iR("Max X","Min X","Max Y","Min Y","Max Z","Min Z","boundsBoxMaxX","boundsBoxMinX","boundsBoxMaxY","boundsBoxMinY","boundsBoxMaxZ","boundsBoxMinZ",V,L,"shapeIsBox",p),iR("Max Longitude","Min Longitude","Max Latitude","Min Latitude","Max Height","Min Height","boundsEllipsoidMaxLongitude","boundsEllipsoidMinLongitude","boundsEllipsoidMaxLatitude","boundsEllipsoidMinLatitude","boundsEllipsoidMaxHeight","boundsEllipsoidMinHeight",R,G,"shapeIsEllipsoid",p),iR("Max Radius","Min Radius","Max Height","Min Height","Max Angle","Min Angle","boundsCylinderMaxRadius","boundsCylinderMinRadius","boundsCylinderMaxHeight","boundsCylinderMinHeight","boundsCylinderMaxAngle","boundsCylinderMinAngle",I,v,"shapeIsCylinder",p),iR("Max X","Min X","Max Y","Min Y","Max Z","Min Z","clippingBoxMaxX","clippingBoxMinX","clippingBoxMaxY","clippingBoxMinY","clippingBoxMaxZ","clippingBoxMinZ",V,L,"shapeIsBox",g),iR("Max Longitude","Min Longitude","Max Latitude","Min Latitude","Max Height","Min Height","clippingEllipsoidMaxLongitude","clippingEllipsoidMinLongitude","clippingEllipsoidMaxLatitude","clippingEllipsoidMinLatitude","clippingEllipsoidMaxHeight","clippingEllipsoidMinHeight",R,G,"shapeIsEllipsoid",g),iR("Max Radius","Min Radius","Max Height","Min Height","Max Angle","Min Angle","clippingCylinderMaxRadius","clippingCylinderMinRadius","clippingCylinderMaxHeight","clippingCylinderMinHeight","clippingCylinderMaxAngle","clippingCylinderMinAngle",I,v,"shapeIsCylinder",g);let P=document.createElement("div");f.appendChild(P);let w=document.createElement("textarea");w.setAttribute("data-bind","textInput: shaderString, event: { keydown: shaderEditorKeyPress }"),P.className="cesium-cesiumInspector-styleEditor",P.appendChild(w);let A=d("Compile (Ctrl+Enter)","compileShader");P.appendChild(A);let b=document.createElement("label");b.style.display="block",b.setAttribute("data-bind","text: shaderCompilationMessage, style: {color: shaderCompilationSuccess ? 'green' : 'red'}"),P.appendChild(b),Te.applyBindings(i,n)}Object.defineProperties($B.prototype,{container:{get:function(){return this._container}},viewModel:{get:function(){return this._viewModel}}});$B.prototype.isDestroyed=function(){return!1};$B.prototype.destroy=function(){return Te.cleanNode(this._element),this._container.removeChild(this._element),this.viewModel.destroy(),me(this)};function iR(e,t,n,i,o,r,s,a,c,d,u,h,p,g,f,x){let _=qa.createRangeInput,C=p,V=g,L=x.appendChild(document.createElement("div"));L.setAttribute("data-bind",`if: ${f}`),L.appendChild(_(e,s,C.x,V.x)),L.appendChild(_(t,a,C.x,V.x)),L.appendChild(_(n,c,C.y,V.y)),L.appendChild(_(i,d,C.y,V.y)),L.appendChild(_(o,u,C.z,V.z)),L.appendChild(_(r,h,C.z,V.z))}var cN=$B;function DVt(e){let t=document.createElement("div");t.className="cesium-viewer-voxelInspectorContainer",e.container.appendChild(t);let n=new cN(t,e.scene);Object.defineProperties(e,{voxelInspector:{get:function(){return n}}})}var Eq=DVt;globalThis.CESIUM_VERSION="1.127";var BVt="1.127";return L1e(OVt);})();