{"version":3,"file":"RutubeCasePlayer.D-TO7AB9.mjs","names":["useRef","useState","startTransition"],"sources":["https:/framerusercontent.com/modules/rwr7Q6mfSROZEchqfBuE/iIJwJ39qv1Qa0cCPpTbE/RutubeCasePlayer.js"],"sourcesContent":["import{jsx as _jsx,jsxs as _jsxs}from\"react/jsx-runtime\";import{addPropertyControls,ControlType,useIsStaticRenderer}from\"framer\";import{startTransition,useEffect,useRef,useState}from\"react\";const SKIN_COLOR=\"5919C1\";const RUTUBE_ORIGIN=/^https:\\/\\/([a-z0-9-]+\\.)*rutube\\.ru$/i;// «In view»: плеер начинает грузиться примерно за полтора экрана до блока\nconst PRELOAD_SCREENS=1.5;// если Rutube не прислал «готов», считаем плеер готовым через это время после загрузки iframe\nconst READY_FALLBACK_MS=1500;// если после нажатия плеер не сообщил о воспроизведении, открываем его как есть\nconst REVEAL_FALLBACK_MS=1800;// сколько ждём готовности плеера после нажатия, прежде чем открыть его как есть\nconst WAIT_LIMIT_MS=1e4;// сенсорный экран: телефон или планшет без мыши\nconst TOUCH_QUERY=\"(hover: none) and (pointer: coarse)\";// касание ушло сквозь обложку в плеер, но Rutube не сообщил о старте: открываем плеер как есть\nconst TAP_REVEAL_MS=2500;// Касание в плеер Rutube запускает ролик только после canplay у его видео (Rutube шлёт player:canPlay).\n// iOS может не грузить видео до касания, поэтому там ждём canPlay не дольше этого после готовности.\nconst IOS_TAP_READY_MS=3e3;// касание ушло в плеер раньше canPlay и потерялось: через это время снова показываем play\nconst LOST_TAP_MS=1200;// на остальных сенсорных экранах canPlay приходит сам, это запас на медленную сеть\nconst TAP_READY_LIMIT_MS=6e3;// До готовности плеера на сенсорном экране вместо play крутилка. Через CSS, а не через\n// состояние: так она видна с первой отрисовки, без мигания play, пока не загрузился JS.\nconst PENDING_CSS=`[data-rcp-icon=\"spin\"]{display:none}\n@media ${TOUCH_QUERY}{[data-rcp-pending] [data-rcp-icon=\"play\"]{display:none}[data-rcp-pending] [data-rcp-icon=\"spin\"]{display:block}}`;// Ролики с качеством выше Full HD (4K, 1440p) Rutube в автокачестве гоняет между уровнями,\n// на старте это видно как дёрганье. Для них фиксируем 1080p, остальные не трогаем.\nconst TARGET_QUALITY=1080;const coverImageStyle={position:\"absolute\",inset:0,width:\"100%\",height:\"100%\",objectFit:\"cover\"};function buildSrc(url,autoplay){if(!url)return\"\";const params=[];if(!/[?&]skinColor=/.test(url))params.push(`skinColor=${SKIN_COLOR}`);if(autoplay&&!/[?&]autoplay=/.test(url))params.push(\"autoplay=1\");if(params.length===0)return url;return`${url}${url.includes(\"?\")?\"&\":\"?\"}${params.join(\"&\")}`;}function readMessage(raw){if(typeof raw===\"string\"){try{const parsed=JSON.parse(raw);return parsed&&typeof parsed===\"object\"?parsed:null;}catch(error){return null;}}return raw&&typeof raw===\"object\"?raw:null;}function thumbnailOf(message){const options=message.data?.playOptions;const url=options?.thumbnail_url;return typeof url===\"string\"&&url.startsWith(\"https://\")?url:null;}// strict: только смена состояния на «playing». Пока плеер готовится заранее,\n// Rutube присылает currentTime с длительностью ролика, это ещё не воспроизведение.\nfunction isPlaybackEvent(message,strict=false){if(message.type===\"player:changeState\"){return JSON.stringify(message.data??{}).includes(\"playing\");}if(strict)return false;if(message.type===\"player:currentTime\"){return Object.values(message.data??{}).some(value=>typeof value===\"number\"&&value>0);}return false;}/**\n * Rutube-плеер для страницы кейса.\n * «On click»: постер и кнопка, iframe грузится после нажатия.\n * «In view»: iframe заранее грузится под нашей заглушкой, на заглушке\n * появляется превью от Rutube, по нажатию сразу стартует воспроизведение.\n * Сенсорный экран: iOS включает звук только по касанию внутри самого плеера\n * Rutube, а команда play со страницы запускает ролик без звука и с затемнением.\n * Поэтому на телефоне и планшете play не шлём, а плеер грузим заранее в обоих режимах.\n * «In view»: как только плеер готов, убираем заглушку, касание попадает в родную кнопку Rutube.\n * «On click»: наша обложка остаётся, но пропускает касание в готовый плеер под ней,\n * ролик стартует со звуком с первого касания, обложка уходит по событию воспроизведения.\n * Пока плеер грузится, на кнопке крутилка (с первой отрисовки, через CSS), знак play\n * появляется, когда касание уже можно пропустить в плеер: по player:canPlay (до него\n * Rutube касание игнорирует), на iOS не позже IOS_TAP_READY_MS после готовности.\n * Касание во время загрузки ничего не открывает: ждём на той же обложке. Если касание\n * всё же ушло в плеер раньше canPlay и потерялось, снова показываем play на обложке.\n *\n * @framerIntrinsicWidth 1280\n * @framerIntrinsicHeight 720\n *\n * @framerSupportedLayoutWidth fixed\n * @framerSupportedLayoutHeight fixed\n */export default function RutubeCasePlayer(props){const{embedUrl=\"\",poster,loading=\"click\",accent=\"#5919C1\",radius=12,label=\"Смотреть видео\",style}=props;const isStatic=useIsStaticRenderer();const preload=loading===\"view\";const rootRef=useRef(null);const frameRef=useRef(null);const playRequestedRef=useRef(false);const revealedRef=useRef(false);const[active,setActive]=useState(false);const[autoplay,setAutoplay]=useState(false);const[hover,setHover]=useState(false);const[ready,setReady]=useState(false);const[playRequested,setPlayRequested]=useState(false);const[revealed,setRevealed]=useState(false);const[thumb,setThumb]=useState(null);const[thumbLoaded,setThumbLoaded]=useState(false);const[touch,setTouch]=useState(false);const[ios,setIos]=useState(false);const[tapped,setTapped]=useState(false);const[canPlay,setCanPlay]=useState(false);const[interactive,setInteractive]=useState(false);const canPlayRef=useRef(false);const tapBeforeCanPlayRef=useRef(false);// куда вернуть фокус со страницы, чтобы заметить следующее касание в плеер\nconst focusSinkRef=useRef(null);// плеер лежит под нашей заглушкой, пока Rutube не сообщит о готовности\nconst managed=preload||touch;// на сенсорном экране плеер грузим заранее и в режиме «On click»\nconst preloadFrame=preload||touch;// «On click» на сенсорном экране: плеер принимает касание, оно уходит в него сквозь обложку\nconst passThrough=touch&&!preload&&interactive&&!revealed;// «On click» до этого момента: на сенсорном экране кнопка показывает крутилку (CSS)\nconst pending=!preload&&!interactive&&!revealed;function reveal(){revealedRef.current=true;startTransition(()=>setRevealed(true));}function sendPlayCommand(){try{frameRef.current?.contentWindow?.postMessage(JSON.stringify({type:\"player:play\",data:{}}),\"*\");}catch(error){// плеер ещё не готов принимать команды\n}}// сенсорный экран определяем только в браузере, после первой отрисовки\nuseEffect(()=>{if(isStatic||typeof window===\"undefined\"||typeof window.matchMedia!==\"function\")return;if(window.matchMedia(TOUCH_QUERY).matches){const agent=window.navigator.userAgent;const isIos=/iPhone|iPad|iPod/i.test(agent)||/Macintosh/i.test(agent)&&window.navigator.maxTouchPoints>1;startTransition(()=>{setTouch(true);setIos(isIos);});}},[isStatic]);// «In view» и сенсорный экран: создаём iframe заранее, пока блок ещё ниже экрана\nuseEffect(()=>{if(isStatic||!preloadFrame||active||!embedUrl)return;const node=rootRef.current;if(!node||typeof window===\"undefined\"||typeof IntersectionObserver===\"undefined\"){startTransition(()=>setActive(true));return;}const margin=Math.round((window.innerHeight||800)*PRELOAD_SCREENS);const observer=new IntersectionObserver(entries=>{if(entries.some(entry=>entry.isIntersecting)){observer.disconnect();startTransition(()=>setActive(true));}},{rootMargin:`${margin}px 0px`});observer.observe(node);return()=>observer.disconnect();},[isStatic,preloadFrame,active,embedUrl]);// качество: как только плеер прислал список качеств, фиксируем 1080p, если есть выше\nuseEffect(()=>{if(isStatic||!active||typeof window===\"undefined\")return;let sent=false;function handleQualityList(event){const frame=frameRef.current;if(sent||!frame||event.source!==frame.contentWindow)return;if(!RUTUBE_ORIGIN.test(event.origin))return;const message=readMessage(event.data);if(message?.type!==\"player:qualityList\")return;const list=message.data?.list;const heights=Array.isArray(list)?list.filter(value=>typeof value===\"number\"):[];if(!heights.includes(TARGET_QUALITY)||!heights.some(height=>height>TARGET_QUALITY))return;sent=true;try{frame.contentWindow?.postMessage(JSON.stringify({type:\"player:changeQuality\",data:{quality:TARGET_QUALITY}}),\"*\");}catch(error){// плеер уже закрыт\n}}window.addEventListener(\"message\",handleQualityList);return()=>window.removeEventListener(\"message\",handleQualityList);},[isStatic,active]);// события плеера Rutube: готовность, превью, начало воспроизведения\nuseEffect(()=>{if(isStatic||!managed||!active||typeof window===\"undefined\")return;function handleMessage(event){const frame=frameRef.current;if(!frame||event.source!==frame.contentWindow)return;if(!RUTUBE_ORIGIN.test(event.origin))return;const message=readMessage(event.data);if(!message?.type)return;if(message.type===\"player:ready\"){startTransition(()=>setReady(true));return;}if(message.type===\"player:playOptionsLoaded\"){const url=thumbnailOf(message);startTransition(()=>{setReady(true);if(url)setThumb(url);});return;}if(message.type===\"player:canPlay\"){canPlayRef.current=true;startTransition(()=>{setReady(true);setCanPlay(true);});return;}if((playRequestedRef.current||touch)&&!revealedRef.current&&isPlaybackEvent(message,touch&&!playRequestedRef.current)){reveal();}}window.addEventListener(\"message\",handleMessage);return()=>window.removeEventListener(\"message\",handleMessage);},[isStatic,managed,active,touch]);// ПК, «In view»: нажали play, ждём готовности плеера, запускаем и убираем заглушку\nuseEffect(()=>{if(!preload||touch||!playRequested||revealed||typeof window===\"undefined\")return;if(!ready){const limit=window.setTimeout(reveal,WAIT_LIMIT_MS);return()=>window.clearTimeout(limit);}sendPlayCommand();const timers=[window.setTimeout(()=>{if(!revealedRef.current)sendPlayCommand();},500),window.setTimeout(()=>{if(!revealedRef.current)sendPlayCommand();},1200),window.setTimeout(reveal,REVEAL_FALLBACK_MS)];return()=>timers.forEach(timer=>window.clearTimeout(timer));},[preload,touch,playRequested,ready,revealed]);// Сенсорный экран: плеер готов, открываем родное превью Rutube.\n// «In view» открывается сам, «On click» после первого касания.\nuseEffect(()=>{if(!touch||!active||revealed||typeof window===\"undefined\")return;if(ready){if(preload||playRequested)reveal();return;}if(!playRequested)return;const limit=window.setTimeout(reveal,WAIT_LIMIT_MS);return()=>window.clearTimeout(limit);},[touch,preload,active,ready,playRequested,revealed]);// «On click» на сенсорном экране: знак play и пропуск касания, когда плеер его примет\nuseEffect(()=>{if(!touch||preload||interactive||!ready||typeof window===\"undefined\")return;const open=()=>startTransition(()=>setInteractive(true));if(canPlay){open();return;}const limit=window.setTimeout(open,ios?IOS_TAP_READY_MS:TAP_READY_LIMIT_MS);return()=>window.clearTimeout(limit);},[touch,ios,preload,interactive,ready,canPlay]);// Касание сквозь обложку: страница теряет фокус, фокус уходит в iframe плеера.\n// Показываем ожидание, а если Rutube не сообщит о старте, открываем плеер как есть.\nuseEffect(()=>{if(!passThrough||tapped||typeof window===\"undefined\")return;let check=0;function handleBlur(){check=window.setTimeout(()=>{if(document.activeElement===frameRef.current){tapBeforeCanPlayRef.current=!canPlayRef.current;startTransition(()=>setTapped(true));}},0);}window.addEventListener(\"blur\",handleBlur);return()=>{window.removeEventListener(\"blur\",handleBlur);window.clearTimeout(check);};},[passThrough,tapped]);useEffect(()=>{if(!tapped||revealed||typeof window===\"undefined\")return;// Касание пришло раньше, чем плеер научился запускаться, и Rutube его не принял:\n// возвращаем фокус странице и снова показываем play, следующее касание сработает.\nconst lost=window.setTimeout(()=>{if(revealedRef.current||!tapBeforeCanPlayRef.current)return;focusSinkRef.current?.focus({preventScroll:true});startTransition(()=>setTapped(false));},LOST_TAP_MS);const limit=window.setTimeout(reveal,TAP_REVEAL_MS);return()=>{window.clearTimeout(lost);window.clearTimeout(limit);};},[tapped,revealed]);// «On click» на сенсорном экране: если плеер так и не сообщил о готовности, открываем его как есть\nuseEffect(()=>{if(!touch||preload||!active||ready||revealed||typeof window===\"undefined\")return;const limit=window.setTimeout(reveal,WAIT_LIMIT_MS);return()=>window.clearTimeout(limit);},[touch,preload,active,ready,revealed]);function handleClick(){if(!embedUrl)return;const isTouch=touch||typeof window!==\"undefined\"&&typeof window.matchMedia===\"function\"&&window.matchMedia(TOUCH_QUERY).matches;// «On click» на сенсорном экране касание пальцем по готовому плееру проходит сквозь\n// обложку. Сюда попадаем, пока плеер грузится (ждём, на кнопке уже крутилка),\n// или из экранного диктора: тогда открываем плеер как есть.\nif(isTouch&&!preload){if(interactive)reveal();return;}if(managed){playRequestedRef.current=true;startTransition(()=>{setActive(true);setPlayRequested(true);});return;}startTransition(()=>{setAutoplay(true);setActive(true);});}function handleLoad(){if(typeof window===\"undefined\")return;if(managed){window.setTimeout(()=>startTransition(()=>setReady(true)),READY_FALLBACK_MS);return;}if(!autoplay)return;sendPlayCommand();window.setTimeout(sendPlayCommand,700);window.setTimeout(sendPlayCommand,1600);}const showFrame=active&&!isStatic&&Boolean(embedUrl);const showCover=!showFrame||managed&&!revealed;const waiting=managed&&(playRequested||tapped)&&!revealed;const busy=waiting||touch&&pending;return /*#__PURE__*/_jsxs(\"div\",{ref:rootRef,\"data-rcp-pending\":pending?\"\":undefined,style:{...style,position:\"relative\",width:\"100%\",height:\"100%\",overflow:\"hidden\",borderRadius:radius,background:\"#0F0F0F\",isolation:\"isolate\",// во вставке в текст кейса у контейнера нет высоты, поэтому держим 16:9\naspectRatio:\"16 / 9\"},children:[/*#__PURE__*/_jsx(\"style\",{children:PENDING_CSS}),/*#__PURE__*/_jsx(\"span\",{ref:focusSinkRef,tabIndex:-1,\"aria-hidden\":\"true\",style:{position:\"absolute\",width:1,height:1,overflow:\"hidden\",opacity:0,pointerEvents:\"none\",outline:\"none\"}}),showFrame?/*#__PURE__*/_jsx(\"iframe\",{ref:frameRef,src:buildSrc(embedUrl,autoplay),title:label,onLoad:handleLoad,allow:\"clipboard-write; autoplay; fullscreen; picture-in-picture\",allowFullScreen:true,tabIndex:showCover?-1:undefined,\"aria-hidden\":showCover?true:undefined,style:{position:\"absolute\",inset:0,width:\"100%\",height:\"100%\",border:0,display:\"block\"}}):null,showCover?/*#__PURE__*/_jsxs(\"button\",{type:\"button\",\"aria-label\":label,\"aria-busy\":busy?true:undefined,onClick:handleClick,onMouseEnter:()=>setHover(true),onMouseLeave:()=>setHover(false),style:{position:\"absolute\",inset:0,zIndex:1,width:\"100%\",height:\"100%\",margin:0,padding:0,border:0,background:poster?.src?\"transparent\":\"radial-gradient(120% 90% at 50% 100%, rgba(89, 25, 193, 0.35) 0%, rgba(15, 15, 15, 1) 60%)\",cursor:embedUrl?\"pointer\":\"default\",// готовый плеер под обложкой сам принимает касание\npointerEvents:passThrough?\"none\":undefined,display:\"flex\",alignItems:\"center\",justifyContent:\"center\"},children:[poster?.src?/*#__PURE__*/_jsx(\"img\",{src:poster.src,srcSet:poster.srcSet,alt:poster.alt??\"\",style:{...coverImageStyle,transform:hover?\"scale(1.02)\":\"scale(1)\",transition:\"transform 0.8s cubic-bezier(0.22, 1, 0.36, 1)\"}}):thumb?/*#__PURE__*/_jsx(\"img\",{src:thumb,alt:\"\",onLoad:()=>startTransition(()=>setThumbLoaded(true)),style:{...coverImageStyle,opacity:thumbLoaded?1:0,transform:hover?\"scale(1.02)\":\"scale(1)\",transition:\"opacity 0.45s ease, transform 0.8s cubic-bezier(0.22, 1, 0.36, 1)\"}}):null,/*#__PURE__*/_jsx(\"span\",{\"aria-hidden\":\"true\",style:{position:\"absolute\",inset:0,background:\"linear-gradient(180deg, rgba(8, 8, 7, 0.05) 40%, rgba(8, 8, 7, 0.45) 100%)\"}}),/*#__PURE__*/_jsxs(\"span\",{\"aria-hidden\":\"true\",style:{position:\"relative\",width:\"clamp(52px, 12%, 72px)\",aspectRatio:\"1 / 1\",borderRadius:\"16.667%\",background:accent,display:\"flex\",alignItems:\"center\",justifyContent:\"center\",filter:hover?\"brightness(1.15)\":\"none\",transform:hover?\"scale(1.04)\":\"scale(1)\",transition:\"transform 0.25s ease, filter 0.25s ease\"},children:[/*#__PURE__*/_jsxs(\"svg\",{\"data-rcp-icon\":\"spin\",width:\"40%\",height:\"40%\",viewBox:\"0 0 24 24\",style:waiting?{display:\"block\"}:undefined,children:[/*#__PURE__*/_jsx(\"circle\",{cx:\"12\",cy:\"12\",r:\"9\",fill:\"none\",stroke:\"rgba(255, 255, 255, 0.3)\",strokeWidth:\"2.5\"}),/*#__PURE__*/_jsx(\"path\",{d:\"M12 3a9 9 0 0 1 9 9\",fill:\"none\",stroke:\"#FFFFFF\",strokeWidth:\"2.5\",strokeLinecap:\"round\",children:/*#__PURE__*/_jsx(\"animateTransform\",{attributeName:\"transform\",type:\"rotate\",from:\"0 12 12\",to:\"360 12 12\",dur:\"0.8s\",repeatCount:\"indefinite\"})})]}),/*#__PURE__*/_jsx(\"svg\",{\"data-rcp-icon\":\"play\",width:\"33.333%\",height:\"33.333%\",viewBox:\"0 0 24 24\",style:waiting?{display:\"none\"}:undefined,children:/*#__PURE__*/_jsx(\"path\",{d:\"M7 4.5v15l13-7.5z\",fill:\"#FFFFFF\"})})]})]}):null]});}addPropertyControls(RutubeCasePlayer,{embedUrl:{type:ControlType.String,title:\"Rutube URL\",defaultValue:\"\",placeholder:\"https://rutube.ru/play/embed/…\"},poster:{type:ControlType.ResponsiveImage,title:\"Poster\"},loading:{type:ControlType.Enum,title:\"Loading\",options:[\"click\",\"view\"],optionTitles:[\"On click\",\"In view\"],defaultValue:\"click\",displaySegmentedControl:true},accent:{type:ControlType.Color,title:\"Accent\",defaultValue:\"#5919C1\"},radius:{type:ControlType.Number,title:\"Radius\",defaultValue:12,min:0,max:40,step:1,unit:\"px\"},label:{type:ControlType.String,title:\"Label\",defaultValue:\"Смотреть видео\"}});\nexport const __FramerMetadata__ = {\"exports\":{\"default\":{\"type\":\"reactComponent\",\"name\":\"RutubeCasePlayer\",\"slots\":[],\"annotations\":{\"framerIntrinsicWidth\":\"1280\",\"framerSupportedLayoutHeight\":\"fixed\",\"framerContractVersion\":\"1\",\"framerSupportedLayoutWidth\":\"fixed\",\"framerIntrinsicHeight\":\"720\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}\n//# sourceMappingURL=./RutubeCasePlayer.map"],"mappings":"6QAe2H,SAAS,GAAS,EAAI,EAAS,CAAC,GAAG,CAAC,EAAI,MAAM,GAAG,IAAM,EAAO,CAAC,EAA0K,MAApK,iBAAiB,KAAK,CAAG,GAAE,EAAO,KAAK,aAAa,GAAY,EAAK,GAAU,CAAC,gBAAgB,KAAK,CAAG,GAAE,EAAO,KAAK,YAAY,EAAK,EAAO,SAAS,EAAS,EAAU,GAAG,IAAM,EAAI,SAAS,GAAG,EAAE,IAAI,MAAM,EAAO,KAAK,GAAG,GAAI,CAAC,SAAS,EAAY,EAAI,CAAC,GAAG,OAAO,GAAM,SAAU,GAAG,CAAC,IAAM,EAAO,KAAK,MAAM,CAAG,EAAE,OAAO,GAAQ,OAAO,GAAS,SAAS,EAAO,IAAK,MAAa,CAAC,OAAO,IAAK,CAAE,OAAO,GAAK,OAAO,GAAM,SAAS,EAAI,IAAK,CAAC,SAAS,GAAY,EAAQ,CAAyC,IAAM,EAAhC,EAAQ,MAAM,aAA+B,cAAc,OAAO,OAAO,GAAM,UAAU,EAAI,WAAW,UAAU,EAAE,EAAI,IAAK,CAE7xB,SAAS,GAAgB,EAAQ,EAAO,GAAM,CAA2P,OAAvP,EAAQ,OAAO,qBAA6B,KAAK,UAAU,EAAQ,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,SAAS,EAAG,CAAG,GAAuB,EAAQ,OAAO,sBAA6B,OAAO,OAAO,EAAQ,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,GAAO,OAAO,GAAQ,UAAU,EAAM,CAAC,CAAgB,CAsBnT,SAAwB,EAAiB,EAAM,CAAC,GAAK,CAAC,WAAS,GAAG,SAAO,UAAQ,QAAQ,SAAO,UAAU,UAAO,GAAG,QAAM,iBAAiB,SAAO,EAAY,EAAS,GAAoB,EAAQ,EAAQ,IAAU,OAAa,EAAQA,EAAO,IAAI,EAAQ,EAASA,EAAO,IAAI,EAAQ,EAAiBA,EAAO,EAAK,EAAQ,EAAYA,EAAO,EAAK,EAAO,CAAC,EAAO,GAAWC,EAAS,EAAK,EAAO,CAAC,EAAS,IAAaA,EAAS,EAAK,EAAO,CAAC,EAAM,GAAUA,EAAS,EAAK,EAAO,CAAC,EAAM,GAAUA,EAAS,EAAK,EAAO,CAAC,EAAc,IAAkBA,EAAS,EAAK,EAAO,CAAC,EAAS,IAAaA,EAAS,EAAK,EAAO,CAAC,EAAM,IAAUA,EAAS,IAAI,EAAO,CAAC,GAAY,IAAgBA,EAAS,EAAK,EAAO,CAAC,EAAM,IAAUA,EAAS,EAAK,EAAO,CAAC,EAAI,IAAQA,EAAS,EAAK,EAAO,CAAC,EAAO,GAAWA,EAAS,EAAK,EAAO,CAAC,EAAQ,IAAYA,EAAS,EAAK,EAAO,CAAC,EAAY,IAAgBA,EAAS,EAAK,EAAQ,EAAWD,EAAO,EAAK,EAAQ,EAAoBA,EAAO,EAAK,EAC/7B,EAAaA,EAAO,IAAI,EACxB,EAAQ,GAAS,EACjB,GAAa,GAAS,EACtB,EAAY,GAAO,CAAC,GAAS,GAAa,CAAC,EAC3C,GAAQ,CAAC,GAAS,CAAC,GAAa,CAAC,EAAS,SAAS,GAAQ,CAAC,EAAY,QAAQ,GAAK,MAAoB,GAAY,EAAI,CAAC,CAAE,CAAC,SAAS,GAAiB,CAAC,GAAG,CAAC,EAAS,SAAS,eAAe,YAAY,KAAK,UAAU,CAAC,KAAK,cAAc,KAAK,CAAC,CAAC,CAAC,EAAE,GAAG,CAAE,MAAa,CAC9Q,CAAC,CACD,MAAc,CAAI,QAAiB,IAAS,QAAa,OAAO,EAAO,YAAa,aAAqB,EAAO,WAAW,CAAW,CAAC,CAAC,QAAQ,CAAC,IAAM,EAAM,EAAO,UAAU,UAAgB,EAAM,oBAAoB,KAAK,CAAK,GAAG,aAAa,KAAK,CAAK,GAAG,EAAO,UAAU,eAAe,EAAE,MAAoB,CAAC,GAAS,EAAI,EAAE,GAAO,CAAK,CAAE,CAAC,CAAE,CAAC,EAAE,CAAC,CAAQ,CAAC,EACnW,MAAc,CAAC,GAAG,GAAU,CAAC,IAAc,GAAQ,CAAC,EAAS,OAAO,IAAM,EAAK,EAAQ,QAAQ,GAAG,CAAC,GAAa,IAAS,QAAa,OAAO,qBAAuB,IAAY,CAAC,MAAoB,EAAU,EAAI,CAAC,EAAE,MAAO,CAAC,IAAM,EAAO,KAAK,OAAO,EAAO,aAAa,KAAK,EAAe,EAAQ,EAAS,IAAI,qBAAqB,GAAS,CAAI,EAAQ,KAAK,GAAO,EAAM,cAAc,IAAG,EAAS,WAAW,EAAE,MAAoB,EAAU,EAAI,CAAC,EAAG,EAAE,CAAC,WAAW,GAAG,EAAO,OAAO,CAAC,EAAyB,OAAvB,EAAS,QAAQ,CAAI,MAAY,EAAS,WAAW,CAAE,EAAE,CAAC,EAAS,GAAa,EAAO,CAAQ,CAAC,EAC/jB,MAAc,CAAC,GAAG,GAAU,CAAC,GAAe,IAAS,OAAY,OAAO,IAAI,EAAK,GAAM,SAAS,EAAkB,EAAM,CAAC,IAAM,EAAM,EAAS,QAAmE,GAAxD,GAAM,CAAC,GAAO,EAAM,SAAS,EAAM,eAAwB,CAAC,EAAc,KAAK,EAAM,MAAM,EAAE,OAAO,IAAM,EAAQ,EAAY,EAAM,IAAI,EAAE,GAAG,GAAS,OAAO,qBAAqB,OAAO,IAAM,EAAK,EAAQ,MAAM,KAAW,EAAQ,MAAM,QAAQ,CAAI,EAAE,EAAK,OAAO,GAAO,OAAO,GAAQ,QAAQ,EAAE,CAAC,EAAK,MAAC,EAAQ,SAAS,CAAc,GAAG,CAAC,EAAQ,KAAK,GAAQ,EAAO,CAAc,GAAS,GAAK,GAAK,GAAG,CAAC,EAAM,eAAe,YAAY,KAAK,UAAU,CAAC,KAAK,uBAAuB,KAAK,CAAC,QAAQ,CAAc,CAAC,CAAC,EAAE,GAAG,CAAE,MAAa,CACxqB,CADgiB,CAC/hB,CAAsD,OAArD,EAAO,iBAAiB,UAAU,CAAiB,MAAY,EAAO,oBAAoB,UAAU,CAAiB,CAAE,EAAE,CAAC,EAAS,CAAM,CAAC,EAC5I,MAAc,CAAC,GAAG,GAAU,CAAC,GAAS,CAAC,GAAe,IAAS,OAAY,OAAO,SAAS,EAAc,EAAM,CAAC,IAAM,EAAM,EAAS,QAA6D,GAAlD,CAAC,GAAO,EAAM,SAAS,EAAM,eAAwB,CAAC,EAAc,KAAK,EAAM,MAAM,EAAE,OAAO,IAAM,EAAQ,EAAY,EAAM,IAAI,EAAM,MAAS,KAAY,IAAG,EAAQ,OAAO,eAAe,CAAC,MAAoB,EAAS,EAAI,CAAC,EAAE,MAAO,CAAC,GAAG,EAAQ,OAAO,2BAA2B,CAAC,IAAM,EAAI,GAAY,CAAO,EAAE,MAAoB,CAAC,EAAS,EAAI,EAAK,GAAI,GAAS,CAAG,CAAE,CAAC,EAAE,MAAO,CAAC,GAAG,EAAQ,OAAO,iBAAiB,CAAC,EAAW,QAAQ,GAAK,MAAoB,CAAC,EAAS,EAAI,EAAE,GAAW,EAAI,CAAE,CAAC,EAAE,MAAO,EAAK,EAAiB,SAAS,IAAQ,CAAC,EAAY,SAAS,GAAgB,EAAQ,GAAO,CAAC,EAAiB,OAAO,GAAG,EAAO,CAA5Y,CAA+Y,CAAkD,OAAjD,EAAO,iBAAiB,UAAU,CAAa,MAAY,EAAO,oBAAoB,UAAU,CAAa,CAAE,EAAE,CAAC,EAAS,EAAQ,EAAO,CAAK,CAAC,EAC15B,MAAc,CAAC,GAAG,CAAC,GAAS,GAAO,CAAC,GAAe,GAAiB,IAAS,OAAY,OAAO,GAAG,CAAC,EAAM,CAAC,IAAM,EAAM,EAAO,WAAW,EAAO,CAAa,EAAE,UAAU,EAAO,aAAa,CAAK,CAAE,CAAC,EAAgB,EAAE,IAAM,EAAO,CAAC,EAAO,eAAe,CAAK,EAAY,SAAQ,EAAgB,CAAE,EAAE,GAAG,EAAE,EAAO,eAAe,CAAK,EAAY,SAAQ,EAAgB,CAAE,EAAE,IAAI,EAAE,EAAO,WAAW,EAAO,EAAkB,CAAC,EAAE,UAAU,EAAO,QAAQ,GAAO,EAAO,aAAa,CAAK,CAAC,CAAE,EAAE,CAAC,EAAQ,EAAM,EAAc,EAAM,CAAQ,CAAC,EAE9gB,MAAc,CAAC,GAAG,CAAC,GAAO,CAAC,GAAQ,GAAiB,IAAS,OAAY,OAAO,GAAG,EAAM,EAAI,GAAS,IAAc,EAAO,EAAE,MAAO,CAAC,GAAG,CAAC,EAAc,OAAO,IAAM,EAAM,EAAO,WAAW,EAAO,CAAa,EAAE,UAAU,EAAO,aAAa,CAAK,CAAE,EAAE,CAAC,EAAM,EAAQ,EAAO,EAAM,EAAc,CAAQ,CAAC,EAC5S,MAAc,CAAC,GAAG,CAAC,GAAO,GAAS,GAAa,CAAC,GAAc,IAAS,OAAY,OAAO,IAAM,MAASE,MAAoB,GAAe,EAAI,CAAC,EAAE,GAAG,EAAQ,CAAC,EAAK,EAAE,MAAO,CAAC,IAAM,EAAM,EAAO,WAAW,EAAK,EAAI,EAAiB,EAAkB,EAAE,UAAU,EAAO,aAAa,CAAK,CAAE,EAAE,CAAC,EAAM,EAAI,EAAQ,EAAY,EAAM,CAAO,CAAC,EAE/U,MAAc,CAAC,GAAG,CAAC,GAAa,GAAe,IAAS,OAAY,OAAO,IAAI,EAAM,EAAE,SAAS,GAAY,CAAC,EAAM,EAAO,eAAe,CAAI,SAAS,gBAAgB,EAAS,UAAS,EAAoB,QAAQ,CAAC,EAAW,QAAQ,MAAoB,EAAU,EAAI,CAAC,EAAG,EAAE,CAAC,CAAE,CAA4C,OAA3C,EAAO,iBAAiB,OAAO,CAAU,MAAY,CAAC,EAAO,oBAAoB,OAAO,CAAU,EAAE,EAAO,aAAa,CAAK,CAAE,CAAE,EAAE,CAAC,EAAY,CAAM,CAAC,EAAE,MAAc,CAAC,GAAG,CAAC,GAAQ,GAAiB,IAAS,OAAY,OAE9e,IAAM,EAAK,EAAO,eAAe,CAAI,EAAY,SAAS,CAAC,EAAoB,UAAe,EAAa,SAAS,MAAM,CAAC,cAAc,EAAI,CAAC,EAAE,MAAoB,EAAU,EAAK,CAAC,EAAE,EAAE,EAAW,EAAQ,EAAM,EAAO,WAAW,EAAO,CAAa,EAAE,UAAU,CAAC,EAAO,aAAa,CAAI,EAAE,EAAO,aAAa,CAAK,CAAE,CAAE,EAAE,CAAC,EAAO,CAAQ,CAAC,EAC9U,MAAc,CAAC,GAAG,CAAC,GAAO,GAAS,CAAC,GAAQ,GAAO,GAAiB,IAAS,OAAY,OAAO,IAAM,EAAM,EAAO,WAAW,EAAO,CAAa,EAAE,UAAU,EAAO,aAAa,CAAK,CAAE,EAAE,CAAC,EAAM,EAAQ,EAAO,EAAM,CAAQ,CAAC,EAAE,SAAS,IAAa,CAAK,KAG7P,KAH2R,GAAc,IAAS,QAAa,OAAO,EAAO,YAAa,YAAY,EAAO,WAAW,CAAW,CAAC,CAAC,UAGzX,CAAC,EAAQ,CAAI,GAAY,EAAO,EAAE,MAAO,CAAC,GAAG,EAAQ,CAAC,EAAiB,QAAQ,GAAK,MAAoB,CAAC,EAAU,EAAI,EAAE,GAAiB,EAAI,CAAE,CAAC,EAAE,MAAO,CAAC,MAAoB,CAAC,GAAY,EAAI,EAAE,EAAU,EAAI,CAAE,CAAC,CAA1K,CAA4K,CAAC,SAAS,IAAY,CAAI,GAAO,IAAS,OAAmB,IAAG,EAAQ,CAAC,EAAO,eAAeA,MAAoB,EAAS,EAAI,CAAC,EAAE,CAAiB,EAAE,MAAO,CAAK,IAAgB,EAAgB,EAAE,EAAO,WAAW,EAAgB,GAAG,EAAE,EAAO,WAAW,EAAgB,IAAI,EAApH,CAAsH,CAAC,IAAM,GAAU,GAAQ,CAAC,GAAU,EAAQ,EAAgB,EAAU,CAAC,IAAW,GAAS,CAAC,EAAe,EAAQ,IAAU,GAAe,IAAS,CAAC,EAAe,GAAK,GAAS,GAAO,GAAQ,OAAoB,EAAM,MAAM,CAAC,IAAI,EAAQ,mBAAmB,GAAQ,GAAG,IAAA,GAAU,MAAM,CAAC,GAAG,EAAM,SAAS,WAAW,MAAM,OAAO,OAAO,OAAO,SAAS,SAAS,aAAa,GAAO,WAAW,UAAU,UAAU,UAC/4B,YAAY,QAAQ,EAAE,SAAS,CAAc,EAAK,QAAQ,CAAC,SAAS,EAAW,CAAC,EAAe,EAAK,OAAO,CAAC,IAAI,EAAa,SAAS,GAAG,cAAc,OAAO,MAAM,CAAC,SAAS,WAAW,MAAM,EAAE,OAAO,EAAE,SAAS,SAAS,QAAQ,EAAE,cAAc,OAAO,QAAQ,MAAM,CAAC,CAAC,EAAE,GAAuB,EAAK,SAAS,CAAC,IAAI,EAAS,IAAI,GAAS,EAAS,CAAQ,EAAE,MAAM,EAAM,OAAO,GAAW,MAAM,4DAA4D,gBAAgB,GAAK,SAAS,EAAU,GAAG,IAAA,GAAU,cAAc,EAAU,GAAK,IAAA,GAAU,MAAM,CAAC,SAAS,WAAW,MAAM,EAAE,MAAM,OAAO,OAAO,OAAO,OAAO,EAAE,QAAQ,OAAO,CAAC,CAAC,EAAE,KAAK,EAAuB,EAAM,SAAS,CAAC,KAAK,SAAS,aAAa,EAAM,YAAY,GAAK,GAAK,IAAA,GAAU,QAAQ,GAAY,iBAAiB,EAAS,EAAI,EAAE,iBAAiB,EAAS,EAAK,EAAE,MAAM,CAAC,SAAS,WAAW,MAAM,EAAE,OAAO,EAAE,MAAM,OAAO,OAAO,OAAO,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,WAAW,GAAQ,IAAI,cAAc,6FAA6F,OAAO,EAAS,UAAU,UACvjC,cAAc,EAAY,OAAO,IAAA,GAAU,QAAQ,OAAO,WAAW,SAAS,eAAe,QAAQ,EAAE,SAAS,CAAC,GAAQ,IAAiB,EAAK,MAAM,CAAC,IAAI,EAAO,IAAI,OAAO,EAAO,OAAO,IAAI,EAAO,KAAK,GAAG,MAAM,CAAC,GAAG,EAAgB,UAAU,EAAM,cAAc,WAAW,WAAW,+CAA+C,CAAC,CAAC,EAAE,EAAmB,EAAK,MAAM,CAAC,IAAI,EAAM,IAAI,GAAG,WAAWA,MAAoB,GAAe,EAAI,CAAC,EAAE,MAAM,CAAC,GAAG,EAAgB,QAAQ,MAAgB,UAAU,EAAM,cAAc,WAAW,WAAW,mEAAmE,CAAC,CAAC,EAAE,KAAkB,EAAK,OAAO,CAAC,cAAc,OAAO,MAAM,CAAC,SAAS,WAAW,MAAM,EAAE,WAAW,4EAA4E,CAAC,CAAC,EAAe,EAAM,OAAO,CAAC,cAAc,OAAO,MAAM,CAAC,SAAS,WAAW,MAAM,yBAAyB,YAAY,QAAQ,aAAa,UAAU,WAAW,EAAO,QAAQ,OAAO,WAAW,SAAS,eAAe,SAAS,OAAO,EAAM,mBAAmB,OAAO,UAAU,EAAM,cAAc,WAAW,WAAW,yCAAyC,EAAE,SAAS,CAAc,EAAM,MAAM,CAAC,gBAAgB,OAAO,MAAM,MAAM,OAAO,MAAM,QAAQ,YAAY,MAAM,EAAQ,CAAC,QAAQ,OAAO,EAAE,IAAA,GAAU,SAAS,CAAc,EAAK,SAAS,CAAC,GAAG,KAAK,GAAG,KAAK,EAAE,IAAI,KAAK,OAAO,OAAO,2BAA2B,YAAY,KAAK,CAAC,EAAe,EAAK,OAAO,CAAC,EAAE,sBAAsB,KAAK,OAAO,OAAO,UAAU,YAAY,MAAM,cAAc,QAAQ,SAAsB,EAAK,mBAAmB,CAAC,cAAc,YAAY,KAAK,SAAS,KAAK,UAAU,GAAG,YAAY,IAAI,OAAO,YAAY,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAe,EAAK,MAAM,CAAC,gBAAgB,OAAO,MAAM,UAAU,OAAO,UAAU,QAAQ,YAAY,MAAM,EAAQ,CAAC,QAAQ,MAAM,EAAE,IAAA,GAAU,SAAsB,EAAK,OAAO,CAAC,EAAE,oBAAoB,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAE,wDAhEj1D,IAAwE,IAA6D,EAAO,EAAW,SAAe,EAAc,yCACtO,GAAgB,IAChB,EAAkB,KAClB,GAAmB,KACnB,EAAc,IACd,EAAY,sCACZ,EAAc,KAEd,EAAiB,IACjB,GAAY,KACZ,GAAmB,IAEnB,GAAY;SACT,EAAY,mHAEf,EAAe,KAAW,EAAgB,CAAC,SAAS,WAAW,MAAM,EAAE,MAAM,OAAO,OAAO,OAAO,UAAU,OAAO,EAiDixD,GAAoB,EAAiB,CAAC,SAAS,CAAC,KAAK,EAAY,OAAO,MAAM,aAAa,aAAa,GAAG,YAAY,gCAAgC,EAAE,OAAO,CAAC,KAAK,EAAY,gBAAgB,MAAM,QAAQ,EAAE,QAAQ,CAAC,KAAK,EAAY,KAAK,MAAM,UAAU,QAAQ,CAAC,QAAQ,MAAM,EAAE,aAAa,CAAC,WAAW,SAAS,EAAE,aAAa,QAAQ,wBAAwB,EAAI,EAAE,OAAO,CAAC,KAAK,EAAY,MAAM,MAAM,SAAS,aAAa,SAAS,EAAE,OAAO,CAAC,KAAK,EAAY,OAAO,MAAM,SAAS,aAAa,GAAG,IAAI,EAAE,IAAI,GAAG,KAAK,EAAE,KAAK,IAAI,EAAE,MAAM,CAAC,KAAK,EAAY,OAAO,MAAM,QAAQ,aAAa,gBAAgB,CAAC,CAAC,EAC99E,EAAqB,CAAC,QAAU,CAAC,QAAU,CAAC,KAAO,iBAAiB,KAAO,mBAAmB,MAAQ,CAAC,EAAE,YAAc,CAAC,qBAAuB,OAAO,4BAA8B,QAAQ,sBAAwB,IAAI,2BAA6B,QAAQ,sBAAwB,KAAK,CAAC,EAAE,mBAAqB,CAAC,KAAO,UAAU,CAAC,CAAC"}