{"version":3,"file":"Collection_Plus.L2qKUT_-.mjs","names":["_Fragment","useState","useMemo","useRef","_Fragment","__esmMin","init_npm_react_18_3_1","pe","_e","de","init_jsx_runtime","p","ce","addPropertyControls","useQueryData","init_framer_BWFVvmND","ControlType","useIsOnFramerCanvas","init_store_js__1_0","createStore","useStore","useDevStore","init_Stores","CollectionIDControl","l","init_collectionID","Branding_Tag","productName","init_Branding_Tag","Header","align","text","init_Header","HelperFrame","rgb","error","containerProps","justify","children","init_Helper_Frame","init_Main_Frame_iHC5","init_Header_Nmng","init_Message","init_Message_9f6V","ListItem","isChecked","init_List_Item","ToDoList","items","item","index","init_To_Do_List","init_To_Do_List_rlLo","init_Helpers","init_Index_nylz","getProps","object","target","propMatch","typeMatch","returnParent","nestedProp","value","result","getAllCollections","queryFrom","type","referencedCollections","createBinaryOperationNode","createCaseNode","optionIds","optionId","controlId","createFunctionCallNode","binaryNode","createUnaryOperationNode","handleCondition_IsIncludedIn","negateValue","condition","node","handleCondition_IsSet","handleCondition_StartsWith_EndsWith_Contains","functionName","controlIdentifier","parseRangeCondition","startOperator","rangeString","endOperator","ranges","handleCondition_IsBetween","start","end","createFramerFilterTree","tree","nodes","init_Utilities","useConsoleLogWhenDebuggingCMSPlus","useDebouncer","useConstructFramerCollectionQueryWhere","useFramerCollectionList","useCollectionFromStore","useIsFilter_Valid","useInitializeFilter","useVariantSync","useFilter","init_Hooks","store","args","debouncedValue","setDebouncedValue","ID","delay","collection","collectionID","alias","fields","realTimeSearch","collectionReferences","branches","fieldName","control","name","props","id","filters","activeFilter","currentFilterIndex","activeFilterOptionIds","theseFilters","thisFilter","optionTitles","options","isActive","range","collectionIdentifier","argument","consoleLogWhenDebuggingCMSPlus","where","setStore","devStore","setDevStore","key","setKey","noSearchResults","setNoSearchResults","setCollection","collectionInitializedInStore","sortDirection","isOnFramerCanvas","constructFramerCollectionQueryWhere","fields_debounced","searchText_debounced","framerCollectionList_debounced","framerCollectionList","searchResults","isDebugging","sort","orderDirection","noResults","updatedKey","prev","query","storedCollection","collectionPlusID","defaultFilters","cmsFieldsByID","cmsFieldsByName","controlID","field","otherProps","title","allCollections","isFilter_Valid","setIsFilter_Valid","supportedControlTypes","isCollectionReady","collectionFromStore","cmsFieldName","isSupportedType","usingMatchingFilterType","controlType","valueIsRequired","errors","defaultValues_Ref","initializedFilter","f","isFilterActive_defaultRef","isFilterActive","isFilterActive_Ref","isFilter_Initialized_Ref","prevFilters","currentValues","hasOverrides","currentValue","defaultValue","prevCMSFieldName","prevCollectionID","prevCondition","prevValue","isPreserving","checkVariantSync","setCheckVariantSync","component_isReady","desynchronized","debuggingLog","transitionToVariant","remoteValue","isFilter_CurrentlyActive","isFilter_Initialized","interactionActiveFilter","interactionInactiveFilter","isFilterActive_Debounced","Collection_Plus","isDebuggingCMSPlus","linkedCollectionListFrame","linkedNoSearchResultsFrame","missingFrames","showCollectionList","showNoResultsFrame","init_Collection_Plus"],"sources":["https:/framerusercontent.com/modules/oaAH7umUjUOTeKmykfom/4GSr51yWhuxjuWu6QpOf/Stores.js","https:/framerusercontent.com/modules/Hxho9sUnioBkMjGbLBed/csoxszrftuhmv2NyuE1c/collectionID.js","https:/framerusercontent.com/modules/L7TdKQ7OCrUDcI7mEHAV/saJ1D5cYziXCHw3cuoS0/Branding_Tag.js","https:/framerusercontent.com/modules/tb6g3uFMaN9A8Y0Nh5te/NSmLj9GJ3YcGYE7rQwfM/Header.js","https:/framerusercontent.com/modules/yljxQhHHYCclO8DHlyxu/sRhbB6xnGvNiuDPDTHW5/Helper_Frame.js","https:/framer.com/m/Main-Frame-iHC5.js","https:/framer.com/m/Header-Nmng.js","https:/framerusercontent.com/modules/R62RuVCy6eOjzkRZ9wyj/FO0wrP9rWA5aAMot9UBS/Message.js","https:/framer.com/m/Message-9f6V.js","https:/framerusercontent.com/modules/bmCFSKUhALa4QmIOqr6i/BpmPTjkfVB4lOyz9EiXT/List_Item.js","https:/framerusercontent.com/modules/nls243VrfVJRb2K9we5T/bIwdZocajZouuNz8bgX1/To_Do_List.js","https:/framer.com/m/To-Do-List-rlLo.js","https:/framerusercontent.com/modules/9uKQIQp6F4gR5rw7OCHi/Jxw8eNxT3geRyTaspASR/Helpers.js","https:/framer.com/m/Index-nylz.js","https:/framerusercontent.com/modules/NktNXvnf4m4T7jKQcOHx/ld1Thy4iHs6v3180zPrJ/Utilities.js","https:/framerusercontent.com/modules/uaC9hWf3ec7HqMv3sXMc/j9s1CVhuypSVjmIz92rq/Hooks.js","https:/framerusercontent.com/modules/vJeS6Ad5hYI9zKL5FEp9/4Ag7jMRZcF07KU4mfWGV/Collection_Plus.js"],"sourcesContent":["import{createStore}from\"https://framer.com/m/framer/store.js@^1.0.0\";export const useStore=createStore({});export const useDevStore=createStore({isDebugging:null});\nexport const __FramerMetadata__ = {\"exports\":{\"useStore\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"useDevStore\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}\n//# sourceMappingURL=./Stores.map","import{jsx as _jsx,Fragment as _Fragment}from\"react/jsx-runtime\";import{addPropertyControls,ControlType}from\"framer\";/**\n * @framerSupportedLayoutWidth auto\n * @framerSupportedLayoutHeight auto\n *\n * @framerDisableUnlink\n */export default function CollectionIDControl(props){return /*#__PURE__*/_jsx(_Fragment,{});}addPropertyControls(CollectionIDControl,{collectionID:{type:ControlType.Number,title:\"Collection+ ID\",defaultValue:0,min:0,displayStepper:true,step:1}});\nexport const __FramerMetadata__ = {\"exports\":{\"default\":{\"type\":\"reactComponent\",\"name\":\"CollectionIDControl\",\"slots\":[],\"annotations\":{\"framerDisableUnlink\":\"\",\"framerContractVersion\":\"1\",\"framerSupportedLayoutWidth\":\"auto\",\"framerSupportedLayoutHeight\":\"auto\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}\n//# sourceMappingURL=./collectionID.map","/**\n * @framerSupportedLayoutWidth auto\n * @framerSupportedLayoutHeight auto\n *\n * @framerDisableUnlink\n */import{jsx as _jsx}from\"react/jsx-runtime\";export default function Branding_Tag({productName}){const styles={fontSize:\"10px\",position:\"absolute\",top:6,left:6};return /*#__PURE__*/_jsx(\"div\",{style:styles,children:productName||\"productName\"});}Branding_Tag.displayName=\"Branding Tag\";\nexport const __FramerMetadata__ = {\"exports\":{\"default\":{\"type\":\"reactComponent\",\"name\":\"Branding_Tag\",\"slots\":[],\"annotations\":{\"framerDisableUnlink\":\"\",\"framerContractVersion\":\"1\",\"framerSupportedLayoutHeight\":\"auto\",\"framerSupportedLayoutWidth\":\"auto\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}\n//# sourceMappingURL=./Branding_Tag.map","/**\n * @framerSupportedLayoutWidth auto\n * @framerSupportedLayoutHeight auto\n *\n * @framerDisableUnlink\n */import{jsx as _jsx}from\"react/jsx-runtime\";export default function Header({text,align=\"left\"}){const styles={fontWeight:\"bold\",textAlign:align,width:\"100%\"};// @ts-ignore\nreturn /*#__PURE__*/_jsx(\"div\",{style:styles,children:text||\"Header\"});}\nexport const __FramerMetadata__ = {\"exports\":{\"default\":{\"type\":\"reactComponent\",\"name\":\"Header\",\"slots\":[],\"annotations\":{\"framerDisableUnlink\":\"\",\"framerSupportedLayoutHeight\":\"auto\",\"framerSupportedLayoutWidth\":\"auto\",\"framerContractVersion\":\"1\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}\n//# sourceMappingURL=./Header.map","import{jsx as _jsx,jsxs as _jsxs}from\"react/jsx-runtime\";import Branding_Tag from\"https://framerusercontent.com/modules/L7TdKQ7OCrUDcI7mEHAV/saJ1D5cYziXCHw3cuoS0/Branding_Tag.js\";import Header from\"https://framerusercontent.com/modules/tb6g3uFMaN9A8Y0Nh5te/NSmLj9GJ3YcGYE7rQwfM/Header.js\";/**\n * @framerSupportedLayoutWidth any-prefer-fixed\n * @framerSupportedLayoutHeight any-prefer-fixed\n *\n * @framerIntrinsicHeight 400\n * @framerIntrinsicWidth 800\n *\n * @framerDisableUnlink\n */export default function HelperFrame({children,productName,align=\"center\",error=null,justify=\"center\"}){const colors={default:[67,198,135],error:[255,43,43]};const rgb=colors[error?\"error\":\"default\"].join(\",\");const containerProps={style:{alignItems:align,background:`rgba(${rgb}, 0.05)`,border:`1px solid rgb(${rgb})`,color:`rgb(${rgb})`,display:\"flex\",flexDirection:\"column\",fontSize:\"12px\",gap:\"12px\",height:\"fit-content\",justifyContent:justify,padding:\"32px 8px 8px 8px\",position:\"relative\",width:\"100%\"}};if(error){containerProps.style.cursor=\"pointer\";containerProps.onClick=()=>alert(error.message);}return /*#__PURE__*/_jsxs(\"div\",{...containerProps,className:\"cmsPlusError\",children:[/*#__PURE__*/_jsx(Branding_Tag,{productName:productName}),error&&/*#__PURE__*/_jsx(Header,{text:\"Error!\"}),children]});}HelperFrame.displayName=\"Helper Frame\";\nexport const __FramerMetadata__ = {\"exports\":{\"default\":{\"type\":\"reactComponent\",\"name\":\"HelperFrame\",\"slots\":[\"children\"],\"annotations\":{\"framerDisableUnlink\":\"\",\"framerSupportedLayoutHeight\":\"any-prefer-fixed\",\"framerSupportedLayoutWidth\":\"any-prefer-fixed\",\"framerIntrinsicHeight\":\"400\",\"framerIntrinsicWidth\":\"800\",\"framerContractVersion\":\"1\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}","/*\n * Helper_Frame\n *\n * Learn More: https://www.framer.com/asset-urls\n */\n\nexport * from \"https://framerusercontent.com/modules/yljxQhHHYCclO8DHlyxu/sRhbB6xnGvNiuDPDTHW5/Helper_Frame.js\"\nexport { default } from \"https://framerusercontent.com/modules/yljxQhHHYCclO8DHlyxu/sRhbB6xnGvNiuDPDTHW5/Helper_Frame.js\"\n","/*\n * Header\n *\n * Learn More: https://www.framer.com/asset-urls\n */\n\nexport * from \"https://framerusercontent.com/modules/tb6g3uFMaN9A8Y0Nh5te/NSmLj9GJ3YcGYE7rQwfM/Header.js\"\nexport { default } from \"https://framerusercontent.com/modules/tb6g3uFMaN9A8Y0Nh5te/NSmLj9GJ3YcGYE7rQwfM/Header.js\"\n","/**\n * @framerSupportedLayoutWidth auto\n * @framerSupportedLayoutHeight auto\n *\n * @framerDisableUnlink\n */import{jsx as _jsx}from\"react/jsx-runtime\";export default function Message({text}){const paragraphStyles={width:\"100%\",whiteSpace:\"pre-wrap\",margin:0,lineHeight:1.3};return /*#__PURE__*/_jsx(\"p\",{style:paragraphStyles,children:text||\"Message\"});}\nexport const __FramerMetadata__ = {\"exports\":{\"default\":{\"type\":\"reactComponent\",\"name\":\"Message\",\"slots\":[],\"annotations\":{\"framerSupportedLayoutHeight\":\"auto\",\"framerContractVersion\":\"1\",\"framerDisableUnlink\":\"\",\"framerSupportedLayoutWidth\":\"auto\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}\n//# sourceMappingURL=./Message.map","/*\n * Message\n *\n * Learn More: https://www.framer.com/asset-urls\n */\n\nexport * from \"https://framerusercontent.com/modules/R62RuVCy6eOjzkRZ9wyj/FO0wrP9rWA5aAMot9UBS/Message.js\"\nexport { default } from \"https://framerusercontent.com/modules/R62RuVCy6eOjzkRZ9wyj/FO0wrP9rWA5aAMot9UBS/Message.js\"\n","/**\n * @framerSupportedLayoutWidth auto\n * @framerSupportedLayoutHeight auto\n *\n * @framerDisableUnlink\n */import{jsx as _jsx,jsxs as _jsxs}from\"react/jsx-runtime\";export default function ListItem({text,isChecked}){const bulletUnicode=\"•\";const checkUnicode=\"✓\";const listStyles={alignItems:\"start\",display:\"flex\",gap:\"10px\",marginBottom:\"10px\",width:\"100%\"};const iconStyles={textAlign:\"center\",minWidth:\"20px\"};return /*#__PURE__*/_jsxs(\"li\",{style:listStyles,children:[/*#__PURE__*/_jsx(\"span\",{style:iconStyles,children:isChecked?checkUnicode:bulletUnicode}),/*#__PURE__*/_jsx(\"span\",{children:text})]});}ListItem.displayName=\"List Item\";\nexport const __FramerMetadata__ = {\"exports\":{\"default\":{\"type\":\"reactComponent\",\"name\":\"ListItem\",\"slots\":[],\"annotations\":{\"framerDisableUnlink\":\"\",\"framerSupportedLayoutWidth\":\"auto\",\"framerContractVersion\":\"1\",\"framerSupportedLayoutHeight\":\"auto\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}\n//# sourceMappingURL=./List_Item.map","import{jsx as _jsx}from\"react/jsx-runtime\";import ListItem from\"https://framerusercontent.com/modules/bmCFSKUhALa4QmIOqr6i/BpmPTjkfVB4lOyz9EiXT/List_Item.js\";/**\n * @framerSupportedLayoutWidth auto\n * @framerSupportedLayoutHeight auto\n *\n * @framerDisableUnlink\n */export default function ToDoList({items}){const listStyles={listStyle:\"none\",marginTop:0,paddingLeft:\"16px\",width:\"100%\"};return /*#__PURE__*/_jsx(\"ul\",{style:listStyles,children:items===null||items===void 0?void 0:items.map((item,index)=>/*#__PURE__*/_jsx(ListItem,{text:item.text,isChecked:item.isChecked},index))});}ToDoList.displayName=\"To Do List\";\nexport const __FramerMetadata__ = {\"exports\":{\"default\":{\"type\":\"reactComponent\",\"name\":\"ToDoList\",\"slots\":[],\"annotations\":{\"framerSupportedLayoutWidth\":\"auto\",\"framerContractVersion\":\"1\",\"framerSupportedLayoutHeight\":\"auto\",\"framerDisableUnlink\":\"\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}\n//# sourceMappingURL=./To_Do_List.map","/*\n * To_Do_List\n *\n * Learn More: https://www.framer.com/asset-urls\n */\n\nexport * from \"https://framerusercontent.com/modules/nls243VrfVJRb2K9we5T/bIwdZocajZouuNz8bgX1/To_Do_List.js\"\nexport { default } from \"https://framerusercontent.com/modules/nls243VrfVJRb2K9we5T/bIwdZocajZouuNz8bgX1/To_Do_List.js\"\n","import{jsx as _jsx}from\"react/jsx-runtime\";import HelperFrame from\"https://framer.com/m/Main-Frame-iHC5.js\";import Header from\"https://framer.com/m/Header-Nmng.js\";import Message from\"https://framer.com/m/Message-9f6V.js\";import ToDoList from\"https://framer.com/m/To-Do-List-rlLo.js\";// default needed to have it appear in Assest to copy Import URL\nexport default function Index(){return /*#__PURE__*/_jsx(\"div\",{});}export{Header,HelperFrame,Message,ToDoList};\nexport const __FramerMetadata__ = {\"exports\":{\"default\":{\"type\":\"reactComponent\",\"name\":\"Index\",\"slots\":[],\"annotations\":{\"framerContractVersion\":\"1\"}},\"Message\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"Header\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"ToDoList\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"HelperFrame\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}\n//# sourceMappingURL=./Helpers.map","/*\n * Helpers\n *\n * Learn More: https://www.framer.com/asset-urls\n */\n\nexport * from \"https://framerusercontent.com/modules/9uKQIQp6F4gR5rw7OCHi/Jxw8eNxT3geRyTaspASR/Helpers.js\"\nexport { default } from \"https://framerusercontent.com/modules/9uKQIQp6F4gR5rw7OCHi/Jxw8eNxT3geRyTaspASR/Helpers.js\"\n","/**\n * Accepts a string, and returns true/false if the string is in ISO 8601 format with the option of adding \"Z\" at the end.\n * @param {string} str - A string representing a date in ISO 8601 format.\n * @returns {boolean} - Returns true if str is in ISO 8601 format, otherwise returns false.\n */export function isISO8601(str){const isoDateRegex=/^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?(Z|([+-]\\d{2}:\\d{2}))?$/;return isoDateRegex.test(str);}/**\n * Accepts a text, checks to see if it's in ISO 8601 format, if yes, resets the time and returns ISO 8601 string, otherwise return empty string.\n * @param {string} text - Date as a string in ISO 8601 format.\n * @returns {string} - Returns the same string value with the time cleared or an empty string.\n */export function resetTimeOfISODateString(text){return isISO8601(text)?`${text.substring(0,10)}T00:00:00.000Z`:\"\";}export function getProps({object,target,returnParent=false}){if(!object||!target.name||!target.type)return undefined;const propMatch=object[target.name];const typeMatch=target.type.toLowerCase()===\"array\"?Array.isArray(propMatch):typeof propMatch===target.type.toLowerCase();if(propMatch&&typeMatch){// return the target or the target's parent (which will contain the target)\nreturn returnParent?object:propMatch;}for(let nestedProp in object){const value=object[nestedProp];// don't go down another level if the value is not of type object/array\nif(typeof value!==\"object\")continue;const result=getProps({returnParent,target,object:value});if(result!==undefined)return result;}}export function getAllCollections({queryFrom,referencedCollections={}}){if(!queryFrom)return false;const{constraint,left,right,type}=queryFrom;if(type===\"Collection\"){referencedCollections[queryFrom.alias]={...queryFrom};}getAllCollections({queryFrom:queryFrom.left,referencedCollections});getAllCollections({queryFrom:queryFrom.right,referencedCollections});return referencedCollections;}// the most basic of nodes, mostly used for literal value comparisons\nexport function createBinaryOperationNode({left,right,operator}){return{left,right,operator,type:\"BinaryOperation\"};}// used for enum/option CMS field types\nexport function createCaseNode({controlId,optionIds}){const createCondition=optionId=>{return{then:{type:\"LiteralValue\",value:true},type:\"Condition\",when:{type:\"LiteralValue\",value:optionId}};};return{type:\"Case\",conditions:optionIds.map(createCondition),else:{type:\"LiteralValue\",value:false},value:{name:controlId,type:\"Identifier\"}};}// used for string fields where the condition includes 'starts_with', 'ends_with', or 'contains'\nexport function createFunctionCallNode({binaryNode,functionName}){return{functionName,arguments:[binaryNode.left,binaryNode.right],type:\"FunctionCall\"};}// wraps a node to negate its value\nexport function createUnaryOperationNode({value}){return{operator:\"not\",type:\"UnaryOperation\",value};}export function handleCondition_IsIncludedIn({collection,condition,name,type,value}){// check if the filter condition is for the negated value\nconst negateValue=condition.charAt(0)===\"!\";const node=createBinaryOperationNode({left:{collection,name,type},right:{value,type:\"LiteralValue\"},operator:\"in\"});// if the value needs to be negated, wrap the node in a unary operation\nreturn negateValue?createUnaryOperationNode({value:node}):node;}/**\n * Handles filters with conditions as \"IS_SET\" or \"!IS_SET\".\n * @param {object} controlIdentifier - An object representing the control, composed of\n *   {collection, name, type} properties.\n * @param {string} condition - The string defining the type of filtering condition.\n * @returns {object} - Returns a binary operation node or unary operation node if the value is negated.\n */export function handleCondition_IsSet({collection,name,type,condition}){// check if the filter condition is for the negated value\nconst negateValue=condition.charAt(0)===\"!\";const left=createBinaryOperationNode({operator:\"!=\",left:{collection,name,type},right:{value:null,type:\"LiteralValue\"}});const right=createBinaryOperationNode({operator:\"!=\",left:{collection,name,type},right:{value:\"\",type:\"LiteralValue\"}});const node=createBinaryOperationNode({left,right,operator:\"and\"});// if the value needs to be negated, wrap the node in a unary operation\nreturn negateValue?createUnaryOperationNode({value:node}):node;}/**\n * Handles filters with conditions as \"STARTS_WITH\", \"!STARTS_WITH\", \"ENDS_WITH\", \"!ENDS_WITH\", \"CONTAINS\", \"!CONTAINS\".\n * @param {object} controlIdentifier - An object representing the control, composed of\n *   {collection, name, type} properties.\n * @param {string} condition - The string defining the type of filtering condition.\n * @returns {object} - Returns a binary operation node or unary operation node if the value is negated.\n */export function handleCondition_StartsWith_EndsWith_Contains({controlIdentifier,condition,value}){// check if the filter condition is for the negated value\nconst negateValue=condition.charAt(0)===\"!\";// Framer uses filter functions in their query tree for \"STARTS_WITH\", \"ENDS_WITH\", or \"CONTAINS\"\nconst functionName=negateValue?condition.substring(1):condition;const node=createFunctionCallNode({binaryNode:createBinaryOperationNode({left:controlIdentifier,right:{value,type:\"LiteralValue\"},operator:\"==\"}),functionName});// if the value needs to be negated, wrap the node in a unary operation\nreturn negateValue?createUnaryOperationNode({value:node}):node;}/**\n * Parses a string representing a range\n * @param {string} rangeString - String formatted to represent a range.\n * @returns {object} - Returns an object with the start and end values, and if they're inclusive or exclusive.\n */export function parseRangeCondition({rangeString}){// inclusive:\n// greater than or equal: [\n// lesser than or equal: ]\n//exclusive:\n// greater than: (\n// lesser than: )\n// check the first character to determine if the condition is \"greater than\", or \"greater than or equal\"\nconst startOperator=rangeString.charAt(0)===\"[\"?\">=\":\">\";// check the last character to determine if the condition is \"lesser than\", or \"lesser than or equal\"\nconst endOperator=rangeString.charAt(rangeString.length-1)===\"]\"?\"<=\":\"<\";// ommit the first and last charaters to split the values\nconst ranges=rangeString.substring(1,rangeString.length-1).split(\",\");return{start:{operator:startOperator,value:ranges[0]},end:{operator:endOperator,value:ranges[1]}};}/**\n * Handles filters with conditions that contains the substring \"IS_BETWEEN\".\n * @param {object} controlIdentifier - An object with properties of the control.\n * @param {object} start - The starting value and operator of the range.\n * @param {object} end - The ending value and operator of the range.\n * @returns {object} - Returns a binary operation node.\n */export function handleCondition_IsBetween({controlIdentifier,start,end}){const left=createBinaryOperationNode({left:controlIdentifier,right:{value:start.value,type:\"LiteralValue\"},operator:start.operator});// the results will be less than or equal to this end\nconst right=createBinaryOperationNode({left:controlIdentifier,right:{value:end.value,type:\"LiteralValue\"},operator:end.operator});return createBinaryOperationNode({left,right,operator:\"and\"});}// returns the tree structure used by Framer to apply filters to collection list\nexport function createFramerFilterTree({nodes=[],operator=\"and\"}){let tree={};nodes.forEach((node,index)=>{if(index===0){tree=node;}else{tree={operator,left:tree,right:node,type:\"BinaryOperation\"};}});return tree;}\nexport const __FramerMetadata__ = {\"exports\":{\"handleCondition_IsBetween\":{\"type\":\"function\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"resetTimeOfISODateString\":{\"type\":\"function\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"getProps\":{\"type\":\"function\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"handleCondition_StartsWith_EndsWith_Contains\":{\"type\":\"function\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"isISO8601\":{\"type\":\"function\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"createCaseNode\":{\"type\":\"function\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"createBinaryOperationNode\":{\"type\":\"function\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"createUnaryOperationNode\":{\"type\":\"function\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"createFramerFilterTree\":{\"type\":\"function\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"getAllCollections\":{\"type\":\"function\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"createFunctionCallNode\":{\"type\":\"function\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"parseRangeCondition\":{\"type\":\"function\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"handleCondition_IsIncludedIn\":{\"type\":\"function\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"handleCondition_IsSet\":{\"type\":\"function\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}\n//# sourceMappingURL=./Utilities.map","// @ts-ignore\nimport{useQueryData,useIsOnFramerCanvas}from\"framer\";import{useState,useEffect,useRef,useMemo}from\"react\";import{useStore,useDevStore}from\"https://framerusercontent.com/modules/oaAH7umUjUOTeKmykfom/4GSr51yWhuxjuWu6QpOf/Stores.js\";import{getProps,getAllCollections,createFramerFilterTree,createBinaryOperationNode,createCaseNode,createFunctionCallNode,createUnaryOperationNode,handleCondition_IsBetween,handleCondition_IsIncludedIn,handleCondition_IsSet,handleCondition_StartsWith_EndsWith_Contains,parseRangeCondition}from\"https://framerusercontent.com/modules/NktNXvnf4m4T7jKQcOHx/ld1Thy4iHs6v3180zPrJ/Utilities.js\";/**\n * Hook that prints to the console when debugging CMS Plus.\n * @param {boolean} debug - Is debugging CMS Plus or not.\n *\n * @returns {object} - An object with the following properties:\n * @param {function} consoleLogWhenDebuggingCMSPlus - Function that acts just like console.log, but only when debugging CMS Plus.\n */export const useConsoleLogWhenDebuggingCMSPlus=()=>{const[store]=useDevStore();const consoleLogWhenDebuggingCMSPlus=(...args)=>{if(store.isDebugging)console.log(...args);};return{consoleLogWhenDebuggingCMSPlus};};export const useGetFramerCMSItems=query=>{const[items,setItem]=useState([]);useEffect(()=>{if(!!query){const extractedItems=useQueryData(query);setItem(extractedItems);}},[query]);return items;};/**\n * Hook to debounce a value.\n * @param {number} delay - The delay in milliseconds before the debounced value is returned. Default is 2000.\n * @param {any} value - The value to debounce; the hook will return this value only after the specified delay without changes.\n * @returns {any} - Returns the debounced value after the delay.\n */export const useDebouncer=({delay,value})=>{const[debouncedValue,setDebouncedValue]=useState(value);useEffect(()=>{const ID=setTimeout(()=>{setDebouncedValue(value);},delay);return()=>clearTimeout(ID);},[value]);return debouncedValue;};/**\n * Hook to manage error alerts with a customizable delay.\n * @param {object} options - Configuration options for the hook.\n * @param {number} [options.delay=2000] - Optional delay in milliseconds before showing the alert. Defaults to 2000 if not provided.\n * @returns {object} - An object with the following properties:\n * @property {string[]} addMessage - An array of text messages representing the current error messages.\n * @property {boolean} hasMessages - A boolean indicating if there are any error messages.\n */export const useAlert=({delay=2e3}={})=>{const isOnFramerCanvas=useIsOnFramerCanvas();const[messages,setMessages]=useState([]);const debouncedMessages=useDebouncer({delay,value:messages});const addMessage=message=>{if(!isOnFramerCanvas)setMessages(prev=>[...prev,message]);};const clearMessages=()=>{if(!isOnFramerCanvas)setMessages([]);};useEffect(()=>{if(debouncedMessages.length>0)alert(`\nError!\n\n${debouncedMessages.join(\"\\n\")}`);},[debouncedMessages]);return{addMessage,clearMessages,hasMessages:messages.length>0};};/**\n * Custom hook that uses the cmsPlus collection's active filters to construct Framer's collection query where object.\n * @param {string} collectionID - The id of the collection stored in cmsPlus store.\n * @returns {function} Returns the where object structures as Framer's filtering tree to be used within the colleciton list query.\n */export const useConstructFramerCollectionQueryWhere=({collectionID})=>{const{consoleLogWhenDebuggingCMSPlus}=useConsoleLogWhenDebuggingCMSPlus();const[store]=useStore();const collection=store[collectionID];// get the current collection's props\nconst alias=collection?.alias||\"\";const fields=collection?.fields||{};const realTimeSearch=collection?.realTimeSearch||null;const collectionReferences=collection?.collectionReferences||null;// every element stores Framer's query filter structure made up of all the filters for that CMS field,\n// 'branches' will looped throught and formatted into the same Framer query filter structure\nconst branches=[];// if there is a search text, loop through the selected CMS fields and create a Framer query tree joined with \"or\" logic.\n// this is the only time were different CMS field are joined as \"match any\" logic\nif(!!realTimeSearch&&realTimeSearch.text!==\"\"){const nodes=[];// gather all the fields to search in and remove any duplicates\nconst realTimeSearchFields=Array.from(new Set(realTimeSearch.fields));realTimeSearchFields.forEach(fieldName=>{// if the field does not exist in the CMS, skip\nif(!fields.hasOwnProperty(fieldName))return;const control=fields[fieldName];const{type}=control;const controlIdentifier={collection:alias,name:control.id,type:\"Identifier\"};if(type===\"string\"){nodes.push(createFunctionCallNode({binaryNode:createBinaryOperationNode({left:controlIdentifier,right:{value:realTimeSearch.text,type:\"LiteralValue\"},operator:\"==\"}),functionName:\"CONTAINS\"}));}});if(nodes.length>0)branches.push(createFramerFilterTree({nodes,operator:\"or\"}));}// loop through each CMS field, for each active filter create a node, store in 'nodes', then format the 'nodes' into Framer's query filter structure with 'or' logic\nfor(const[name,props]of Object.entries(fields)){// @ts-ignore\nconst{id,type,options,optionTitles,filters}=props;// required for building the Framer query where object\n// collection alias is what collection this field is derived from\n// id is the Framer identification for this field control\nconst controlIdentifier={collection:alias,name:id,type:\"Identifier\"};const nodes=[];filters?.forEach((activeFilter,currentFilterIndex,theseFilters)=>{const{condition,value,isActive}=activeFilter;// handle the active filter based on CMS field type\nswitch(type){case\"enum\":// enum/option CMS field type is different. it does not need to loop through each active filter.\n// all possible options are gathered, and if theres one active filter, then a binary operation node is pushed into nodes, otherwise, more than 1 active filter uses a case note instead.\nif(currentFilterIndex>0)return;// cross reference the filter values to their corresponding Framer control IDs\nconst activeFilterOptionIds=theseFilters.filter(thisFilter=>thisFilter.isActive).map(thisFilter=>{const index=optionTitles.indexOf(thisFilter.value);return options[index];});if(activeFilterOptionIds.length<1)return;// use a binary operation node for 1 active filter, otherwise, for more active filters, use a case node\nnodes.push(theseFilters.length===1?createBinaryOperationNode({left:controlIdentifier,right:{value:activeFilterOptionIds[0],type:\"LiteralValue\"},operator:activeFilter.condition}):createCaseNode({controlId:id,optionIds:activeFilterOptionIds}));break;case\"slug\":case\"string\":// skip if the filter is inactive\nif(!isActive)return;// handles when the condition is \"Equals\" or \"Doesn't Equal\"\nif(condition==\"==\"||condition==\"!=\"){nodes.push(createBinaryOperationNode({left:controlIdentifier,right:{value,type:\"LiteralValue\"},operator:condition}));// handles when the condition is \"IS_SET\" or \"!IS_SET\"\n}else if(condition.includes(\"IS_SET\")){nodes.push(handleCondition_IsSet({...controlIdentifier,condition}));// handles filters with conditions as \"STARTS_WITH\", \"!STARTS_WITH\", \"ENDS_WITH\", \"!ENDS_WITH\", \"CONTAINS\", or \"!CONTAINS\"\n}else if(condition.includes(\"STARTS_WITH\")||condition.includes(\"ENDS_WITH\")||condition.includes(\"CONTAINS\")){nodes.push(handleCondition_StartsWith_EndsWith_Contains({controlIdentifier,condition,value}));}break;case\"number\":// skip if the filter is inactive\nif(!isActive)return;if(condition===\"IS_BETWEEN_NUMBERS\"){const range=parseRangeCondition({rangeString:value});const start={value:Number(range.start.value),operator:range.start.operator};const end={value:Number(range.end.value),operator:range.end.operator};nodes.push(handleCondition_IsBetween({controlIdentifier,start,end}));}else{// handles single values\nnodes.push(createBinaryOperationNode({left:controlIdentifier,right:{value,type:\"LiteralValue\"},operator:condition}));}break;case\"date\":// skip if the filter is inactive\nif(!isActive)return;if(condition===\"IS_BETWEEN_DATES\"){const range=parseRangeCondition({rangeString:value});const start={value:range.start.value,operator:range.start.operator};const end={value:range.end.value,operator:range.end.operator};nodes.push(handleCondition_IsBetween({controlIdentifier,start,end}));}else{// handles single dates\nnodes.push(createBinaryOperationNode({left:controlIdentifier,right:{value,type:\"LiteralValue\"},operator:condition}));}break;case\"file\":case\"richtext\":case\"responsiveimage\":case\"link\":// skip if the filter is inactive\nif(!isActive)return;nodes.push(handleCondition_IsSet({...controlIdentifier,condition}));break;case\"boolean\":// skip if the filter is inactive\nif(!isActive)return;nodes.push(activeFilter.value?controlIdentifier:createUnaryOperationNode({value:controlIdentifier}));break;case\"collectionreference\":// skip if the filter is inactive\nif(!isActive)return;// for references, the referenced collection alias is used as this field control's id, and the name is replaced with 'id'\nconst collectionIdentifier={...controlIdentifier,collection:id,name:\"id\"};if(condition.includes(\"IS_SET\")){nodes.push(handleCondition_IsSet({...collectionIdentifier,condition}));}if(condition==\"==\"||condition==\"!=\"){nodes.push(createBinaryOperationNode({left:collectionIdentifier,right:{value,type:\"LiteralValue\"},operator:condition}));}if(condition.includes(\"IS_INCLUDED\")){nodes.push(handleCondition_IsIncludedIn({...collectionIdentifier,condition,value}));}break;case\"multicollectionreference\":// skip of the filter is inactive\nif(!isActive)return;// get the multi referenced collection\nconst argument=collectionReferences[value];if(condition.includes(\"CONTAINS\")){// check if the filter condition is for the negated value\nconst negateValue=condition.charAt(0)===\"!\";const node=createBinaryOperationNode({left:{value,type:\"LiteralValue\"},right:{arguments:[argument],functionName:\"FLAT_ARRAY\",type:\"FunctionCall\"},operator:\"in\"});nodes.push(negateValue?createUnaryOperationNode({value:node}):node);}break;// do nothing if the control is not supported\ndefault:consoleLogWhenDebuggingCMSPlus(\"🆇:\",`CMS field ${type} type is not supported.`);break;}});// every node will be used to construct Framer's query tree joined with \"or\" logic.\n// this will allow filters from the same CMS fields applied as \"match any\" logic.\nif(nodes.length>0)branches.push(createFramerFilterTree({nodes,operator:\"or\"}));}// every branch will be used to construct Framer's query tree joined with \"and\" logic.\n// this will allow filters from different CMS fields applied as \"match all\" logic.\nconst where=createFramerFilterTree({nodes:branches,operator:\"and\"});return()=>Object.keys(where).length>0?where:null;};export const useFramerCollectionList=({collectionPlusID,framerCollectionList,isDebugging=false})=>{// stores\nconst[store,setStore]=useStore();const[devStore,setDevStore]=useDevStore();// states\n// key for updating the collection list on the page, a change will trigger a render\nconst[key,setKey]=useState(0);const[noSearchResults,setNoSearchResults]=useState(false);const[collection,setCollection]=useState({alias:null,id:null,name:null,query:null});// local variables\nconst collectionInitializedInStore=!!store[collection.id];const sortDirection=store?.[collection.id]?.sort?.activeItem&&store[collection.id]?.sort[store[collection.id]?.sort.activeItem];const debounced_delay=250;// hooks\nconst isOnFramerCanvas=useIsOnFramerCanvas();const constructFramerCollectionQueryWhere=useConstructFramerCollectionQueryWhere({collectionID:collection.id});// any dependencies that can trigger the render key should be debounced to prevent collection list flicker\nconst fields_debounced=useDebouncer({delay:debounced_delay,value:store[collection.id]?.fields});const searchText_debounced=useDebouncer({delay:debounced_delay,value:store[collection.id]?.realTimeSearch.text});const framerCollectionList_debounced=useDebouncer({delay:debounced_delay,value:framerCollectionList});// in order to extract cms query data, the cmsPlus filters will need to be formatted into Framer's query where tree structure and applied to query\nconst searchResults=useMemo(()=>{if(!!fields_debounced&&!!collection.query){const where=constructFramerCollectionQueryWhere();// by default, sort is ascending when orberBy is undefined, and is not neede\nif(!!sortDirection){if(isDebugging){console.log(\"↕️:\",`Setting ${sortDirection} order.`);}const{orderDirection,...sort}=store[collection.id]?.sort[store[collection.id]?.sort.activeItem];if(orderDirection===\"off\"){delete collection.query.orderBy;}else{collection.query.orderBy=[{...sort,...orderDirection===\"desc\"&&{direction:\"desc\"}}];}}if(!!where){if(isDebugging)console.log(\"🈸:\",where);collection.query.where=where;}else{delete collection.query.where;}if(isDebugging){console.log(\"🟠:\",\"Query:\",Object.assign({},collection.query));}return useQueryData(collection.query);}return null;},[fields_debounced,sortDirection,!!collection.query,searchText_debounced,framerCollectionList]);// updates the collection store with cms items, updates the render key for the collection list, and updates if the noSearchResults frame shoule be shown\nuseEffect(()=>{/**\n         * at this point:\n         * 1. framerCollectionList has been validated\n         * 2. the collection has been stored\n         * 3. its query has been altered by applying CMS+ filters\n         * 4. the cms items (query data) has been extracted using the altered query\n         * 5. finally the collection list on the page needs to be updated by changing the render key\n         */if(!!searchResults){if(isDebugging){console.log(\"🟢:\",`Updating CMS Items: id# ${collection.id} || name ${collection.name} || item count ${searchResults.length}`);}const noResults=searchResults.length<1;// key = 0 signifies the collection list is updating on Collection+\n// this avoids a split-second double render when switching from no results --> results until the collection list is updated with the latest filters\nconst updatedKey=noResults?0:Math.floor(Math.random()*1e5);setNoSearchResults(noResults);setKey(updatedKey);setStore(prev=>({...prev,[collection.id]:{...prev[collection.id],searchResults}}));}},[collectionInitializedInStore,sortDirection,fields_debounced,searchText_debounced,framerCollectionList_debounced]);// when on Preview/Live view only\n// if collection is not set in store, initialize a valid Framer collection list in store\n// otherwise, if it's the same list, sync the stored collection to Collection+\nuseEffect(()=>{if(!isOnFramerCanvas){if(isDebugging){console.log(\"🛠️:\",\"CMS Plus debugging enabled...\");console.log(\"\");}// get the query object from the Framer collection list\n// if a query object does not exist, then the linked frame is not a valid Framer collection list instance\nconst query=getProps({object:framerCollectionList,target:{name:\"query\",type:\"object\"}});// for Framer collection lists not using any references, this will return query.from\n// otherwise, list using references, it will return query.from.left\nconst props=getProps({object:query,target:{name:\"alias\",type:\"string\"},returnParent:true});// get the name of the collection\n// for collections that include references, multiple collections will be in the query object, but the first one is the target\nconst name=getProps({object:props,target:{name:\"displayName\",type:\"string\"}});// initialize in store\nif(!!name&&!!query){const storedCollection=store[collectionPlusID];if(!storedCollection){if(isDebugging){console.log(\"✅:\",`Initializing Collection+: \"${name}\" with id# ${collectionPlusID} in store.`);console.log(\"🟠:\",\"Query:\",Object.assign({},query));}// these are any native Framer filters applied on the list via the canvas\nconst defaultFilters=getProps({object:query,target:{name:\"where\",type:\"object\"}});// make the cms fields easier to manage by having the object props by readable titles, rather than its Framer ID\nconst cmsFieldsByID=getProps({object:props,target:{name:\"propertyControls\",type:\"object\"}});const cmsFieldsByName={};for(const[controlID,field]of Object.entries(cmsFieldsByID)){// @ts-ignore\nconst{title,...otherProps}=field;cmsFieldsByName[title]={...otherProps,id:controlID};}const from=getProps({object:query,target:{name:\"from\",type:\"object\"}});// if this collection list includes reference CMS fields, then gather all collections and remove the current one to be left the referenced collections only\nconst allCollections=getAllCollections({queryFrom:from});delete allCollections[props?.alias];const collectionReferences=Object.keys(allCollections).length>0?allCollections:null;if(isDebugging&&collectionReferences){console.log(\"🟠:\",\"References:\",collectionReferences);}// initiate the collection in store if valid\nsetStore(prev=>({...prev,[collectionPlusID]:{...defaultFilters&&{defaultFilters},...collectionReferences&&{collectionReferences},name,alias:props?.alias,fields:cmsFieldsByName,realTimeSearch:{fields:[],text:\"\"},searchResults:[]}}));}else{if(isDebugging){console.log(\"🟩:\",`Syncing Collection+ from store: id#${storedCollection.id} \"${storedCollection.name}\"`);}if(name===storedCollection.name){if(collection.query?.where){query.where=collection.query.where;}}}}// store query from a valid Framer collection list\nsetCollection({name,alias:props?.alias,id:collectionPlusID,...!!query&&{query}});// always start off with a 0 key, this notifies Collection+ the list is not ready and do not show\nsetKey(0);// cmsPlus collection+ must have props._cmsPlusDebugging = true via an override\nsetDevStore(prev=>({...prev,isDebugging}));}},[isOnFramerCanvas,framerCollectionList]);if(isDebugging)console.log(\"📀:\",Object.assign({},store));return{key,noSearchResults};};/**\n * Accesses a collection from the store using its ID.\n *\n * @param {string} collectionID - The collection's unique ID.\n * @returns {Object} -\n *   - `isCollectionReady`: True if the collection exists and the view is not on Framer Canvas.\n *   - `collectionFromStore`: The collection data or null if not found.\n */export const useCollectionFromStore=collectionID=>{const[store,setStore]=useStore();const collection=store[collectionID]||null;const isOnFramerCanvas=useIsOnFramerCanvas();return{isCollectionReady:!isOnFramerCanvas&&!!collection,collectionFromStore:collection};};/**\n * Validates the Filter+ component for CMS Plus.\n * Ensures the collection, field, and value are valid based on the given conditions.\n *\n * @param {string} collectionID - The ID of the CMS collection to validate.\n * @param {string} controlType - The expected control type of the field (e.g., 'string', 'number').\n * @param {string} cmsFieldName - The name of the CMS field to validate.\n * @param {*} value - The value being checked; must not be undefined if required.\n * @param {boolean} valueIsRequired - Whether a value is required (true) or not (false).\n *\n * @returns {boolean} - Returns true if the filter is valid; otherwise, false.\n */export const useIsFilter_Valid=({collectionID,controlType,cmsFieldName,value,valueIsRequired})=>{const{consoleLogWhenDebuggingCMSPlus}=useConsoleLogWhenDebuggingCMSPlus();const[isFilter_Valid,setIsFilter_Valid]=useState(false);const{isCollectionReady,collectionFromStore}=useCollectionFromStore(collectionID);const supportedControlTypes=[\"boolean\",\"collectionreference\",\"date\",\"enum\",\"file\",\"link\",\"multicollectionreference\",\"number\",\"responsiveimage\",\"richtext\",\"string\"];// Validate the filter when collection or related dependencies change\nuseEffect(()=>{setIsFilter_Valid(false)// Reset filter validity on dependency changes\n;if(isCollectionReady){const field=collectionFromStore.fields[cmsFieldName];const isSupportedType=supportedControlTypes.includes(field?.type);const usingMatchingFilterType=field?.type===controlType;const value_isValid=valueIsRequired?value!==undefined// Value must not be undefined if required\n:value===null// For optional values, null is acceptable\n;if(!!field&&isSupportedType&&usingMatchingFilterType&&value_isValid){setIsFilter_Valid(true)// Mark filter as valid\n;}else{const errors=[`❗️ Invalid Filter+ for ${cmsFieldName}:`];if(!field)errors.push(`${cmsFieldName} does not exist.`);if(!isSupportedType)errors.push(`${!!field?field.type:`Field`} type is not supported.`);if(!usingMatchingFilterType)errors.push(\"Using the wrong type of Filter+ for CMS field.\");if(value===undefined)errors.push(\"Value is required.\");consoleLogWhenDebuggingCMSPlus(errors.join(\"\\n\"));}}},[isCollectionReady,cmsFieldName,value,valueIsRequired]);return isFilter_Valid// Returns whether the filter is valid\n;};/**\n * Hook to initialize a filter in the collection store.\n *\n * Ensures that the specified filter is added to the store when valid and handles\n * clean-up or reset logic for non-preserved filters.\n *\n * Arguments:\n * @param {string} cmsFieldName - The CMS field to apply the filter to.\n * @param {string} collectionID - The ID of the collection this filter belongs to.\n * @param {string} condition - The filter's condition (e.g., \"equals\").\n * @param {string} controlType - The type of control (e.g., toggle, dropdown).\n * @param {boolean} isFilterActive - Whether the filter is currently active.\n * @param {boolean} isFilter_Valid - Indicates if the filter is valid for initialization.\n * @param {boolean} isPreserving - Whether the filter should be preserved on page reload.\n * @param {*} value - The value the filter applies.\n *\n * Returns:\n * - `isFilter_Initialized`: True if the filter is already initialized.\n * - `isFilter_CurrentlyActive`: The active status of the filter or null if uninitialized.\n */export const useInitializeFilter=({cmsFieldName,collectionID,condition,controlType,isFilterActive,isFilter_Valid,isPreserving,value})=>{const{consoleLogWhenDebuggingCMSPlus}=useConsoleLogWhenDebuggingCMSPlus();const setStore=useStore()[1];// Store default values for the filter to detect overrides.\nconst defaultValues_Ref=useRef({cmsFieldName,collectionID,condition,isPreserving,value});const{collectionFromStore}=useCollectionFromStore(collectionID);// Check if the filter is already initialized in the collection store.\nconst initializedFilter=collectionFromStore?.fields?.[cmsFieldName]?.filters?.find(f=>f.condition===condition&&(f.value===value||JSON.stringify(f.value)===JSON.stringify(value)))??null;const isFilterActive_defaultRef=useRef(isFilterActive);const isFilterActive_Ref=useRef(isFilterActive);const isFilter_Initialized_Ref=useRef(!!initializedFilter);// Keep track of filter active state.\nuseEffect(()=>{isFilterActive_Ref.current=isFilterActive;},[isFilterActive]);// Initialize the filter in the collection store if it is valid and not already initialized.\nuseEffect(()=>{if(isFilter_Valid&&!initializedFilter){consoleLogWhenDebuggingCMSPlus(`✅ Initializing Filter+: id# ${collectionID} | field ${cmsFieldName} | type ${controlType} | condition ${condition} | value ${value} | active? ${isFilterActive}`);isFilter_Initialized_Ref.current=true;setStore(prev=>{const prevFilters=prev[collectionID]?.fields[cmsFieldName]?.filters??[];return{...prev,[collectionID]:{...prev[collectionID],fields:{...prev[collectionID]?.fields,[cmsFieldName]:{...prev[collectionID]?.fields[cmsFieldName],filters:[...prevFilters,{condition,value,isActive:isFilterActive}]}}}};});}// Clean up: handle overrides if default values have changed.\nreturn()=>{const currentValues={cmsFieldName,collectionID,condition,isPreserving,value};const hasOverrides=Object.keys(currentValues).some(key=>{const currentValue=currentValues[key];const defaultValue=defaultValues_Ref.current[key];consoleLogWhenDebuggingCMSPlus(`Hooks > ${defaultValues_Ref.current.cmsFieldName}:`);consoleLogWhenDebuggingCMSPlus(`Hooks > Current Value:`,currentValue);consoleLogWhenDebuggingCMSPlus(`Hooks > Default Value:`,defaultValue);if(typeof defaultValue===\"object\"){return JSON.stringify(currentValue)!==JSON.stringify(defaultValue);}return currentValue!==defaultValue;});if(isFilter_Valid&&hasOverrides){const{cmsFieldName:prevCMSFieldName,collectionID:prevCollectionID,condition:prevCondition,value:prevValue}=defaultValues_Ref.current;consoleLogWhenDebuggingCMSPlus(`🆑 Clean Up Filter+: id# ${prevCollectionID} | field ${prevCMSFieldName} | type ${controlType} | condition ${prevCondition} | value ${prevValue}`);setStore(prev=>{const prevFilters=prev[prevCollectionID]?.fields[prevCMSFieldName]?.filters??[];return{...prev,[prevCollectionID]:{...prev[prevCollectionID],fields:{...prev[prevCollectionID]?.fields,[prevCMSFieldName]:{...prev[prevCollectionID]?.fields[prevCMSFieldName],filters:prevFilters.filter(f=>f.condition!==prevCondition||f.value!==prevValue)}}}};});}Object.assign(defaultValues_Ref.current,currentValues);};},[isFilter_Valid,cmsFieldName,collectionID,condition,isPreserving,value]);// Reset filters that are not preserved to their default state.\nuseEffect(()=>{return()=>{if(isFilter_Initialized_Ref.current&&!defaultValues_Ref.current.isPreserving){if(isFilterActive_Ref.current!==isFilterActive_defaultRef.current){const{cmsFieldName,collectionID,condition,value}=defaultValues_Ref.current;consoleLogWhenDebuggingCMSPlus(`🟨 Resetting Filter+: id# ${collectionID} | field ${cmsFieldName} | type ${controlType} | condition ${condition} | value ${value}`);setStore(prev=>{const prevFilters=prev[collectionID]?.fields[cmsFieldName]?.filters??[];return{...prev,[collectionID]:{...prev[collectionID],fields:{...prev[collectionID]?.fields,[cmsFieldName]:{...prev[collectionID]?.fields[cmsFieldName],filters:prevFilters.map(f=>f.condition===condition&&f.value===value?{...f,isActive:isFilterActive_defaultRef.current}:f)}}}};});}}};},[]);return{isFilter_Initialized:!!initializedFilter,isFilter_CurrentlyActive:initializedFilter?.isActive??null};};/**\n * Custom hook to sync a component's variant with its stored state.\n *\n * Arguments:\n * @param {boolean} component_isReady - Indicates if the component is ready for synchronization.\n * @param {function} debuggingLog - Logs debug information during synchronization.\n * @param {boolean} desynchronized - True if the component state differs from the stored state.\n * @param {boolean} isPreserving - Enables synchronization when state preservation is active.\n * @param {*} remoteValue - The value representing changes from an external source.\n * @param {function} transitionToVariant - Triggers a transition to the correct variant.\n *\n * Returns:\n * @returns {object} - `{ checkVariantSync }`, a flag indicating if the synchronization check is in progress.\n */export const useVariantSync=({component_isReady,debuggingLog,desynchronized,isPreserving,remoteValue,transitionToVariant})=>{const[checkVariantSync,setCheckVariantSync]=useState(isPreserving);// Sync to the correct variant when the component is ready and preserving state.\nuseEffect(()=>{if(component_isReady){if(isPreserving&&desynchronized){debuggingLog();transitionToVariant?.();}// Mark the synchronization check as completed.\nsetCheckVariantSync(false);}},[component_isReady]);// Handle changes from an external source.\nuseEffect(()=>{if(desynchronized&&!checkVariantSync){debuggingLog();transitionToVariant?.();}},[remoteValue]);return{checkVariantSync};};export const useFilter=({cmsPlusComponentName,collectionID,condition,value,cmsFieldName,isPreserving,isFilterActive,interactionActiveFilter,interactionInactiveFilter,controlType,valueIsRequired})=>{const{consoleLogWhenDebuggingCMSPlus}=useConsoleLogWhenDebuggingCMSPlus();const setStore=useStore()[1];const isFilterActive_defaultRef=useRef(isFilterActive);// Step 1: Validate the filter configuration.\nconst isFilter_Valid=useIsFilter_Valid({collectionID,controlType,cmsFieldName,valueIsRequired,value});// Step 2: Initialize the filter with its default state if not already done.\nconst{isFilter_Initialized,isFilter_CurrentlyActive}=useInitializeFilter({cmsFieldName,collectionID,condition,controlType,isFilterActive,isFilter_Valid,isPreserving,value});// compares the current active status with what is in the collection store\nconst desynchronized=isFilterActive!==isFilter_CurrentlyActive;// wait for the component to be ready, then check if the variant needs to be synced\nconst{checkVariantSync}=useVariantSync({desynchronized,isPreserving,component_isReady:isFilter_Initialized,remoteValue:isFilter_CurrentlyActive,debuggingLog:()=>consoleLogWhenDebuggingCMSPlus(`🔄 Syncing Filter+ to ${isFilter_CurrentlyActive?\"active\":\"inactive\"} variant: id# ${collectionID} | field ${cmsFieldName} | type ${controlType} | condition ${condition} | value ${value}`),transitionToVariant:isFilter_CurrentlyActive?interactionActiveFilter:interactionInactiveFilter});const isFilterActive_Debounced=useDebouncer({delay:200,value:isFilterActive});useEffect(()=>{if(isFilter_Initialized&&desynchronized&&!checkVariantSync){setStore(prev=>({...prev,[collectionID]:{...prev[collectionID],fields:{...prev[collectionID]?.fields,[cmsFieldName]:{...prev[collectionID]?.fields?.[cmsFieldName],filters:prev[collectionID]?.fields?.[cmsFieldName]?.filters?.map(f=>{if(f.condition===condition&&(f.value===value||JSON.stringify(f.value)===JSON.stringify(value))){return{...f,isActive:isFilterActive};}return f;})}}}}));consoleLogWhenDebuggingCMSPlus(`🟨 ${isFilterActive?\"Activating\":\"Deactivating\"} Filter+`,cmsFieldName,condition,value,`for id# ${collectionID}.`);}},[isFilter_Initialized,isFilterActive_Debounced,checkVariantSync]);};export const useReferencedCMSIds=()=>{const[store]=useStore();console.log(\"reference cms ids >\",store);};\nexport const __FramerMetadata__ = {\"exports\":{\"useReferencedCMSIds\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"useConstructFramerCollectionQueryWhere\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"useFilter\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"useVariantSync\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"useGetFramerCMSItems\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"useIsFilter_Valid\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"useConsoleLogWhenDebuggingCMSPlus\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"useAlert\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"useDebouncer\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"useInitializeFilter\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"useCollectionFromStore\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"useFramerCollectionList\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}\n//# sourceMappingURL=./Hooks.map","import{jsx as _jsx,jsxs as _jsxs,Fragment as _Fragment}from\"react/jsx-runtime\";import{addPropertyControls,ControlType,useIsOnFramerCanvas}from\"framer\";import{cloneElement}from\"react\";import{Header,HelperFrame,ToDoList}from\"https://framer.com/m/Index-nylz.js\";import{useFramerCollectionList}from\"https://framerusercontent.com/modules/uaC9hWf3ec7HqMv3sXMc/j9s1CVhuypSVjmIz92rq/Hooks.js\";/**\n * @framerSupportedLayoutWidth any-prefer-fixed\n * @framerSupportedLayoutHeight auto\n *\n * @framerIntrinsicWidth 500\n *\n * @framerDisableUnlink\n */export default function Collection_Plus(props){const cmsPlusComponentName=\"CMS+ Collection+\";const isOnFramerCanvas=useIsOnFramerCanvas();const isDebuggingCMSPlus=!!props._cmsPlusDebugging;const linkedCollectionListFrame=props._collectionListInstance?.[0];const linkedNoSearchResultsFrame=props._noSearchResultsInstance?.[0];// any missing linked frames will show helper frame\nconst missingFrames=!linkedCollectionListFrame||!linkedNoSearchResultsFrame;const{key,noSearchResults}=useFramerCollectionList({collectionPlusID:props.collectionID,framerCollectionList:linkedCollectionListFrame,isDebugging:isDebuggingCMSPlus});/**\n     * The collection list may undergo multiple updates during initial render and filter changes.\n     * To optimize performance and prevent unnecessary re-renders, a key is used to track the list's state:\n     * key = 0: The list is still being initialized or updated due to filter changes.\n     * key > 0: The list is stable and has finished updating.\n     */const isUpdating=isOnFramerCanvas?false:key===0;// show the list when not loading, no missing frames, and doesn't have any errors\nconst showCollectionList=!isUpdating&&!missingFrames&&!noSearchResults;const showNoResultsFrame=isOnFramerCanvas?false:!missingFrames&&noSearchResults;if(isDebuggingCMSPlus){console.log(\"🔑:\",key);console.log(\"\");}return /*#__PURE__*/_jsxs(_Fragment,{children:[missingFrames&&/*#__PURE__*/_jsxs(HelperFrame,{productName:cmsPlusComponentName,children:[/*#__PURE__*/_jsx(Header,{text:\"Connect Frames\"}),/*#__PURE__*/_jsx(ToDoList,{items:[{text:\"Connect to a Collection List.\",isChecked:!!linkedCollectionListFrame},{text:\"Connect a custom frame to display when there's no search results.\",isChecked:!!linkedNoSearchResultsFrame}]})]}),showCollectionList&&/*#__PURE__*/cloneElement(linkedCollectionListFrame,{key,id:\"cmsPlus\",style:{...linkedCollectionListFrame.props?.style,...props?.style}}),showNoResultsFrame&&/*#__PURE__*/cloneElement(linkedNoSearchResultsFrame,{style:{...linkedNoSearchResultsFrame.props?.style,...props?.style}})]});}// set the name that will be displayed in Assets menu\nCollection_Plus.displayName=\"Collection+\";// property controls for Collection_Plus\naddPropertyControls(Collection_Plus,{collectionID:{type:ControlType.Number,title:\"ID\",defaultValue:0,min:0,displayStepper:true,step:1,description:`Explore its [documentation](https://framercms.plus/documentation/component-collection-plus).`},_collectionListInstance:{type:ControlType.ComponentInstance,title:\"Collection List\",description:`Getting started [video](https://framercms.plus/documentation#quick-start) guide.`},_noSearchResultsInstance:{type:ControlType.ComponentInstance,title:\"No Search Results\"}});\nexport const __FramerMetadata__ = {\"exports\":{\"default\":{\"type\":\"reactComponent\",\"name\":\"Collection_Plus\",\"slots\":[],\"annotations\":{\"framerContractVersion\":\"1\",\"framerIntrinsicWidth\":\"500\",\"framerSupportedLayoutWidth\":\"any-prefer-fixed\",\"framerSupportedLayoutHeight\":\"auto\",\"framerDisableUnlink\":\"\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}"],"mappings":"A,iUAAkF,EAASmB,EAAY,CAAC,CAAC,EAAe,EAAYA,EAAY,CAAC,YAAY,IAAI,CAAC,C,OCK/J,SAAwBI,EAAoB,EAAM,CAAC,MAAoB,gBAAKvB,EAAU,CAAC,CAAC,CAAE,C,sCAACa,EAAoBU,EAAoB,CAAC,aAAa,CAAC,KAAKP,EAAY,OAAO,MAAM,iBAAiB,aAAa,EAAE,IAAI,EAAE,eAAe,GAAK,KAAK,CAAC,CAAC,CAAC,C,OCAvM,SAAwBU,EAAa,CAAC,eAAa,CAAiE,MAAoB,gBAAK,MAAM,CAAC,MAAM,CAAxF,SAAS,OAAO,SAAS,WAAW,IAAI,EAAE,KAAK,CAA8C,EAAE,SAASC,GAAa,aAAa,CAAC,CAAE,C,kCAAC,EAAa,YAAY,c,OCAjO,SAAwBE,EAAO,CAAC,OAAK,QAAM,QAAQ,CACjG,MAAoB,gBAAK,MAAM,CAAC,MAAM,CAD0E,WAAW,OAAO,UAAUC,EAAM,MAAM,MAC7G,EAAE,SAASC,GAAM,QAAQ,CAAC,CAAE,C,wCCEpE,SAAwBE,EAAY,CAAC,WAAS,cAAY,QAAM,SAAS,QAAM,KAAK,UAAQ,UAAU,CAAuD,IAAMC,EAAI,CAAlD,QAAQ,CAAC,GAAG,IAAI,GAAG,EAAE,MAAM,CAAC,IAAI,GAAG,EAAE,CAAkB,EAAEC,EAAM,QAAQ,UAAU,CAAC,KAAK,GAAG,EAAQC,EAAe,CAAC,MAAM,CAAC,WAAWN,EAAM,WAAW,QAAQI,EAAI,SAAS,OAAO,iBAAiBA,EAAI,GAAG,MAAM,OAAOA,EAAI,GAAG,QAAQ,OAAO,cAAc,SAAS,SAAS,OAAO,IAAI,OAAO,OAAO,cAAc,eAAeG,EAAQ,QAAQ,mBAAmB,SAAS,WAAW,MAAM,MAAM,CAAC,EAAmG,OAA9FF,IAAO,EAAe,MAAM,OAAO,UAAU,EAAe,YAAY,MAAMA,EAAM,OAAO,GAAuB,gBAAM,MAAM,CAAC,GAAGC,EAAe,UAAU,eAAe,SAAS,CAAc,gBAAKV,EAAa,CAAa,aAAW,CAAC,EAAES,GAAoB,gBAAKN,EAAO,CAAC,KAAK,QAAQ,CAAC,EAAES,CAAQ,CAAC,CAAC,CAAE,C,4CAAC,EAAY,YAAY,c,wKKH3wB,SAAwBM,EAAS,CAAC,OAAK,aAAW,CAAuM,MAAoB,gBAAM,KAAK,CAAC,MAAM,CAA3K,WAAW,QAAQ,QAAQ,OAAO,IAAI,OAAO,aAAa,OAAO,MAAM,MAA6G,EAAE,SAAS,CAAc,gBAAK,OAAO,CAAC,MAAM,CAA/H,UAAU,SAAS,SAAS,MAA4G,EAAE,SAASC,EAAU,IAAa,GAAa,CAAC,EAAe,gBAAK,OAAO,CAAC,SAASd,CAAI,CAAC,CAAC,CAAC,CAAC,CAAE,C,kCAAC,EAAS,YAAY,W,OCA3gB,SAAwBgB,EAAS,CAAC,SAAO,CAAiF,MAAoB,gBAAK,KAAK,CAAC,MAAM,CAAnG,UAAU,OAAO,UAAU,EAAE,YAAY,OAAO,MAAM,MAAsD,EAAE,SAASC,GAA0C,KAAK,EAAK,IAAqB,gBAAKJ,EAAS,CAAC,KAAKK,EAAK,KAAK,UAAUA,EAAK,SAAS,EAAEC,CAAK,CAAC,CAAC,CAAC,CAAE,C,sCAAC,EAAS,YAAY,Y,uJIGlO,SAAgBK,EAAS,CAAC,SAAO,SAAO,eAAa,IAAO,CAAC,GAAG,CAACC,GAAQ,CAACC,EAAO,MAAM,CAACA,EAAO,KAAK,OAAiB,IAAMC,EAAUF,EAAOC,EAAO,MAAYE,EAAUF,EAAO,KAAK,YAAY,IAAI,QAAQ,MAAM,QAAQC,CAAS,EAAE,OAAOA,IAAYD,EAAO,KAAK,YAAY,EAAE,GAAGC,GAAWC,EACtZ,OAAOC,EAAaJ,EAAOE,EAAW,IAAI,IAAIG,KAAcL,EAAO,CAAC,IAAMM,EAAMN,EAAOK,GACvF,GAAG,OAAOC,GAAQ,SAAS,SAAS,IAAMC,EAAOR,EAAS,CAAC,eAAa,SAAO,OAAOO,CAAK,CAAC,EAAE,GAAGC,IAAS,IAAA,GAAU,OAAOA,CAAO,CAAC,CAAC,SAAgBC,EAAkB,CAAC,YAAU,wBAAsB,CAAC,GAAG,CAAC,GAAG,CAACC,EAAU,MAAO,GAAM,GAAK,CAAC,aAAW,OAAK,QAAM,QAAMA,EAAkO,OAArNC,IAAO,eAAc,EAAsBD,EAAU,OAAO,CAAC,GAAGA,CAAS,GAAGD,EAAkB,CAAC,UAAUC,EAAU,KAAK,uBAAqB,CAAC,EAAED,EAAkB,CAAC,UAAUC,EAAU,MAAM,uBAAqB,CAAC,EAASE,CAAsB,CACxgB,SAAgBC,EAA0B,CAAC,OAAK,QAAM,YAAU,CAAC,MAAM,CAAC,OAAK,QAAM,WAAS,KAAK,iBAAiB,CAAE,CACpH,SAAgBC,GAAe,CAAC,YAAU,aAAW,CAA6I,MAAM,CAAC,KAAK,OAAO,WAAWC,EAAU,IAA9J,IAAiB,CAAC,KAAK,CAAC,KAAK,eAAe,MAAM,EAAI,EAAE,KAAK,YAAY,KAAK,CAAC,KAAK,eAAe,MAAMC,CAAQ,CAAC,EAA+D,EAAE,KAAK,CAAC,KAAK,eAAe,MAAM,EAAK,EAAE,MAAM,CAAC,KAAKC,EAAU,KAAK,YAAY,CAAC,CAAE,CAChV,SAAgBC,EAAuB,CAAC,aAAW,gBAAc,CAAC,MAAM,CAAC,eAAa,UAAU,CAACC,EAAW,KAAKA,EAAW,KAAK,EAAE,KAAK,cAAc,CAAE,CACxJ,SAAgBC,EAAyB,CAAC,SAAO,CAAC,MAAM,CAAC,SAAS,MAAM,KAAK,iBAAiB,OAAK,CAAE,CAAC,SAAgBC,GAA6B,CAAC,aAAW,YAAU,OAAK,OAAK,SAAO,CAC1L,IAAMC,EAAYC,EAAU,OAAO,CAAC,IAAI,IAAUC,EAAKX,EAA0B,CAAC,KAAK,CAAC,aAAW,OAAK,MAAI,EAAE,MAAM,CAAC,QAAM,KAAK,cAAc,EAAE,SAAS,IAAI,CAAC,EAC9J,OAAOS,EAAYF,EAAyB,CAAC,MAAMI,CAAI,CAAC,EAAEA,CAAK,CAM5D,SAAgBC,EAAsB,CAAC,aAAW,OAAK,OAAK,aAAW,CAC1E,IAAMH,EAAYC,EAAU,OAAO,CAAC,IAAI,IAA2PC,EAAKX,EAA0B,CAAC,KAA5QA,EAA0B,CAAC,SAAS,KAAK,KAAK,CAAC,aAAW,OAAK,MAAI,EAAE,MAAM,CAAC,MAAM,KAAK,KAAK,cAAc,CAAC,CAAoK,EAAE,MAAvJA,EAA0B,CAAC,SAAS,KAAK,KAAK,CAAC,aAAW,OAAK,MAAI,EAAE,MAAM,CAAC,MAAM,GAAG,KAAK,cAAc,CAAC,CAAkD,EAAE,SAAS,KAAK,CAAC,EAC7V,OAAOS,EAAYF,EAAyB,CAAC,MAAMI,CAAI,CAAC,EAAEA,CAAK,CAM5D,SAAgBE,GAA6C,CAAC,oBAAkB,YAAU,SAAO,CACpG,IAAMJ,EAAYC,EAAU,OAAO,CAAC,IAAI,IAClCI,EAAaL,EAAYC,EAAU,UAAU,CAAC,EAAEA,EAAgBC,EAAKN,EAAuB,CAAC,WAAWL,EAA0B,CAAC,KAAKe,EAAkB,MAAM,CAAC,QAAM,KAAK,cAAc,EAAE,SAAS,IAAI,CAAC,EAAE,cAAY,CAAC,EAC/N,OAAON,EAAYF,EAAyB,CAAC,MAAMI,CAAI,CAAC,EAAEA,CAAK,CAI5D,SAAgBK,EAAoB,CAAC,eAAa,CAOrD,IAAMC,EAAcC,EAAY,OAAO,CAAC,IAAI,IAAI,KAAK,IAC/CC,EAAYD,EAAY,OAAOA,EAAY,OAAO,CAAC,IAAI,IAAI,KAAK,IAChEE,EAAOF,EAAY,UAAU,EAAEA,EAAY,OAAO,CAAC,CAAC,CAAC,MAAM,GAAG,EAAE,MAAM,CAAC,MAAM,CAAC,SAASD,EAAc,MAAMG,EAAO,EAAE,EAAE,IAAI,CAAC,SAASD,EAAY,MAAMC,EAAO,EAAE,CAAC,CAAE,CAMrK,SAAgBC,EAA0B,CAAC,oBAAkB,QAAM,OAAK,CACuD,OAAOrB,EAA0B,CAAC,KAD7EA,EAA0B,CAAC,KAAKe,EAAkB,MAAM,CAAC,MAAMO,EAAM,MAAM,KAAK,cAAc,EAAE,SAASA,EAAM,QAAQ,CACvC,EAAE,MAA7JtB,EAA0B,CAAC,KAAKe,EAAkB,MAAM,CAAC,MAAMQ,EAAI,MAAM,KAAK,cAAc,EAAE,SAASA,EAAI,QAAQ,CAA8C,EAAE,SAAS,KAAK,CAAC,CAAE,CAChM,SAAgBC,EAAuB,CAAC,QAAM,CAAC,EAAE,WAAS,OAAO,CAAC,IAAIC,EAAK,CAAC,EAA6H,OAA3HC,EAAM,SAAS,EAAK,IAAQ,CAAC,AAA8BD,EAA3B3C,IAAQ,EAAQ6B,EAAgB,CAAC,WAAS,KAAKc,EAAK,MAAMd,EAAK,KAAK,iBAAiB,CAAG,CAAC,EAASc,CAAK,C,4GC/CrM,MAAsC,CAAC,GAAK,CAACa,GAAOrF,EAAY,EAA+F,MAAM,CAAC,gCAA9D,GAAGsF,IAAO,CAAID,EAAM,aAAY,QAAQ,IAAI,GAAGC,CAAI,CAAE,CAAuC,CAAE,EAKtM,GAAc,CAAC,QAAM,WAAS,CAAC,GAAK,CAACC,EAAeC,GAAmB5G,EAAS6D,CAAK,EAAkH,OAAhHlD,MAAc,CAAC,IAAMkG,EAAG,eAAe,CAACD,EAAkB/C,CAAK,CAAE,EAAEiD,CAAK,EAAE,UAAU,aAAaD,CAAE,CAAE,EAAE,CAAChD,CAAK,CAAC,EAAS8C,CAAe,EAc7N,GAAwC,CAAC,kBAAgB,CAAC,GAAK,CAAC,kCAAgCZ,EAAkC,EAAO,CAACU,GAAOtF,EAAS,EAAQ4F,EAAWN,EAAMO,GAC7LC,EAAMF,GAAY,OAAO,GAASG,EAAOH,GAAY,QAAQ,CAAC,EAAQI,EAAeJ,GAAY,gBAAgB,KAAWK,EAAqBL,GAAY,sBAAsB,KAEnLM,EAAS,CAAC,EAEhB,GAAKF,GAAgBA,EAAe,OAAO,GAAG,CAAC,IAAMtB,EAAM,CAAC,EACU,MAArC,KAAK,IAAI,IAAIsB,EAAe,MAAM,CAAsB,CAAC,CAAC,QAAQ,GAAW,CAC9G,GAAG,CAACD,EAAO,eAAeI,CAAS,EAAE,OAAO,IAAMC,EAAQL,EAAOI,GAAgB,CAAC,QAAMC,EAAcrC,EAAkB,CAAC,WAAW+B,EAAM,KAAKM,EAAQ,GAAG,KAAK,YAAY,EAAKtD,IAAO,UAAU4B,EAAM,KAAKrB,EAAuB,CAAC,WAAWL,EAA0B,CAAC,KAAKe,EAAkB,MAAM,CAAC,MAAMiC,EAAe,KAAK,KAAK,cAAc,EAAE,SAAS,IAAI,CAAC,EAAE,aAAa,UAAU,CAAC,CAAC,CAAG,CAAC,EAAKtB,EAAM,OAAO,GAAEwB,EAAS,KAAK1B,EAAuB,CAAC,QAAM,SAAS,IAAI,CAAC,CAAC,CAAE,CACrd,IAAI,GAAK,CAAC6B,EAAKC,KAAS,OAAO,QAAQP,CAAM,EAAE,CAC/C,GAAK,CAAC,KAAG,OAAK,UAAQ,eAAa,WAASO,EAGtCvC,EAAkB,CAAC,WAAW+B,EAAM,KAAKS,EAAG,KAAK,YAAY,EAAQ7B,EAAM,CAAC,EAAE8B,GAAS,SAAS,EAAa,EAAmB,IAAe,CAAC,GAAK,CAAC,YAAU,QAAM,YAAUC,EACtL,OAAO3D,EAAP,CAAa,IAAI,OAEjB,GAAG4D,EAAmB,EAAE,OACxB,IAAMC,EAAsBC,EAAa,OAAO,GAAYC,EAAW,QAAQ,CAAC,CAAC,IAAI,GAAY,CAAC,IAAM/E,EAAMgF,EAAa,QAAQD,EAAW,KAAK,EAAE,OAAOE,EAAQjF,EAAO,CAAC,EAAE,GAAG6E,EAAsB,OAAO,EAAE,OAChNjC,EAAM,KAAKkC,EAAa,SAAS,EAAE5D,EAA0B,CAAC,KAAKe,EAAkB,MAAM,CAAC,MAAM4C,EAAsB,GAAG,KAAK,cAAc,EAAE,SAASF,EAAa,SAAS,CAAC,EAAExD,GAAe,CAAC,UAAUsD,EAAG,UAAUI,CAAqB,CAAC,CAAC,EAAE,MAAM,IAAI,OAAO,IAAI,SACvQ,GAAG,CAACK,EAAS,OACVtD,GAAW,MAAMA,GAAW,KAAMgB,EAAM,KAAK1B,EAA0B,CAAC,KAAKe,EAAkB,MAAM,CAAC,QAAM,KAAK,cAAc,EAAE,SAASL,CAAS,CAAC,CAAC,EAC/IA,EAAU,SAAS,QAAQ,EAAGgB,EAAM,KAAKd,EAAsB,CAAC,GAAGG,EAAkB,WAAS,CAAC,CAAC,GAChGL,EAAU,SAAS,aAAa,GAAGA,EAAU,SAAS,WAAW,GAAGA,EAAU,SAAS,UAAU,IAAGgB,EAAM,KAAKb,GAA6C,CAAC,oBAAkB,YAAU,OAAK,CAAC,CAAC,EAAG,MAAM,IAAI,SACtN,GAAG,CAACmD,EAAS,OAAO,GAAGtD,IAAY,qBAAqB,CAAC,IAAMuD,EAAMjD,EAAoB,CAAC,YAAYtB,CAAK,CAAC,EAAQ4B,EAAM,CAAC,MAAM,OAAO2C,EAAM,MAAM,KAAK,EAAE,SAASA,EAAM,MAAM,QAAQ,EAAQ1C,EAAI,CAAC,MAAM,OAAO0C,EAAM,IAAI,KAAK,EAAE,SAASA,EAAM,IAAI,QAAQ,EAAEvC,EAAM,KAAKL,EAA0B,CAAC,oBAAkB,QAAM,KAAG,CAAC,CAAC,CAAE,MACrUK,EAAM,KAAK1B,EAA0B,CAAC,KAAKe,EAAkB,MAAM,CAAC,QAAM,KAAK,cAAc,EAAE,SAASL,CAAS,CAAC,CAAC,EAAG,MAAM,IAAI,OAChI,GAAG,CAACsD,EAAS,OAAO,GAAGtD,IAAY,mBAAmB,CAAC,IAAMuD,EAAMjD,EAAoB,CAAC,YAAYtB,CAAK,CAAC,EAAQ4B,EAAM,CAAC,MAAM2C,EAAM,MAAM,MAAM,SAASA,EAAM,MAAM,QAAQ,EAAQ1C,EAAI,CAAC,MAAM0C,EAAM,IAAI,MAAM,SAASA,EAAM,IAAI,QAAQ,EAAEvC,EAAM,KAAKL,EAA0B,CAAC,oBAAkB,QAAM,KAAG,CAAC,CAAC,CAAE,MACnTK,EAAM,KAAK1B,EAA0B,CAAC,KAAKe,EAAkB,MAAM,CAAC,QAAM,KAAK,cAAc,EAAE,SAASL,CAAS,CAAC,CAAC,EAAG,MAAM,IAAI,OAAO,IAAI,WAAW,IAAI,kBAAkB,IAAI,OAChL,GAAG,CAACsD,EAAS,OAAOtC,EAAM,KAAKd,EAAsB,CAAC,GAAGG,EAAkB,WAAS,CAAC,CAAC,EAAE,MAAM,IAAI,UAClG,GAAG,CAACiD,EAAS,OAAOtC,EAAM,KAAK+B,EAAa,MAAM1C,EAAkBR,EAAyB,CAAC,MAAMQ,CAAiB,CAAC,CAAC,EAAE,MAAM,IAAI,sBACnI,GAAG,CAACiD,EAAS,OACb,IAAME,EAAqB,CAAC,GAAGnD,EAAkB,WAAWwC,EAAG,KAAK,IAAI,EAAK7C,EAAU,SAAS,QAAQ,GAAGgB,EAAM,KAAKd,EAAsB,CAAC,GAAGsD,EAAqB,WAAS,CAAC,CAAC,GAAMxD,GAAW,MAAMA,GAAW,OAAMgB,EAAM,KAAK1B,EAA0B,CAAC,KAAKkE,EAAqB,MAAM,CAAC,QAAM,KAAK,cAAc,EAAE,SAASxD,CAAS,CAAC,CAAC,EAAMA,EAAU,SAAS,aAAa,GAAGgB,EAAM,KAAKlB,GAA6B,CAAC,GAAG0D,EAAqB,YAAU,OAAK,CAAC,CAAC,EAAG,MAAM,IAAI,2BACtd,GAAG,CAACF,EAAS,OACb,IAAMG,EAASlB,EAAqBvD,GAAO,GAAGgB,EAAU,SAAS,UAAU,EAAE,CAC7E,IAAMD,EAAYC,EAAU,OAAO,CAAC,IAAI,IAAUC,EAAKX,EAA0B,CAAC,KAAK,CAAC,QAAM,KAAK,cAAc,EAAE,MAAM,CAAC,UAAU,CAACmE,CAAQ,EAAE,aAAa,aAAa,KAAK,cAAc,EAAE,SAAS,IAAI,CAAC,EAAEzC,EAAM,KAAKjB,EAAYF,EAAyB,CAAC,MAAMI,CAAI,CAAC,EAAEA,CAAI,CAAE,CAAC,MACnR,QAAQyD,EAA+B,MAAM,aAAatE,EAAK,wBAAwB,CAAQ,CAAC,CAAC,EAE9F4B,EAAM,OAAO,GAAEwB,EAAS,KAAK1B,EAAuB,CAAC,QAAM,SAAS,IAAI,CAAC,CAAC,CAAE,CAE/E,IAAM6C,EAAM7C,EAAuB,CAAC,MAAM0B,EAAS,SAAS,KAAK,CAAC,EAAE,UAAU,OAAO,KAAKmB,CAAK,CAAC,CAAC,OAAO,EAAEA,EAAM,IAAK,EAAe,GAAyB,CAAC,mBAAiB,uBAAqB,cAAY,MAAS,CACzN,GAAK,CAAC/B,EAAMgC,GAAUtH,EAAS,EAAO,CAACuH,EAASC,GAAavH,EAAY,EAEpE,CAACwH,EAAIC,GAAQ7I,EAAS,CAAC,EAAO,CAAC8I,EAAgBC,GAAoB/I,EAAS,EAAK,EAAO,CAAC+G,EAAWiC,GAAehJ,EAAS,CAAC,MAAM,KAAK,GAAG,KAAK,KAAK,KAAK,MAAM,IAAI,CAAC,EACpKiJ,EAA6B,CAAC,CAACxC,EAAMM,EAAW,IAAUmC,EAAczC,IAAQM,EAAW,GAAG,EAAE,MAAM,YAAYN,EAAMM,EAAW,GAAG,EAAE,KAAKN,EAAMM,EAAW,GAAG,EAAE,KAAK,YACxKoC,EAAiBnI,EAAoB,EAAQoI,EAAoCnD,EAAuC,CAAC,aAAac,EAAW,EAAE,CAAC,EACpJsC,EAAiBrD,EAAa,CAAC,MAAM,IAAgB,MAAMS,EAAMM,EAAW,GAAG,EAAE,MAAM,CAAC,EAAQuC,EAAqBtD,EAAa,CAAC,MAAM,IAAgB,MAAMS,EAAMM,EAAW,GAAG,EAAE,eAAe,IAAI,CAAC,EAAQwC,EAA+BvD,EAAa,CAAC,MAAM,IAAgB,MAAMwD,CAAoB,CAAC,EAC/SC,EAAcxJ,MAAY,CAAC,GAAKoJ,GAAoBtC,EAAW,MAAM,CAAC,IAAMyB,EAAMY,EAAoC,EAC5H,GAAKF,EAAc,CAAIQ,GAAa,QAAQ,IAAI,MAAM,WAAWR,EAAc,QAAQ,EAAG,GAAK,CAAC,iBAAe,GAAGS,GAAMlD,EAAMM,EAAW,GAAG,EAAE,KAAKN,EAAMM,EAAW,GAAG,EAAE,KAAK,YAAe6C,IAAiB,MAAO,OAAO7C,EAAW,MAAM,QAAc,EAAW,MAAM,QAAQ,CAAC,CAAC,GAAG4C,EAAK,GAAGC,IAAiB,QAAQ,CAAC,UAAU,MAAM,CAAC,CAAC,CAAG,CAAuM,OAAjMpB,GAAUkB,GAAY,QAAQ,IAAI,MAAMlB,CAAK,EAAE,EAAW,MAAM,MAAMA,GAAY,OAAOzB,EAAW,MAAM,MAAU2C,GAAa,QAAQ,IAAI,MAAM,SAAS,OAAO,OAAO,CAAC,EAAE3C,EAAW,KAAK,CAAC,EAAUlG,EAAakG,EAAW,KAAK,CAAE,CAAC,OAAO,IAAK,EAAE,CAACsC,EAAiBH,EAAc,CAAC,CAACnC,EAAW,MAAMuC,EAAqBE,CAAoB,CAAC,EA4BxhB,OA3BjJ7I,MAAc,CAOH,GAAK8I,EAAc,CAAIC,GAAa,QAAQ,IAAI,MAAM,2BAA2B3C,EAAW,GAAG,WAAWA,EAAW,KAAK,iBAAiB0C,EAAc,QAAQ,EAAG,IAAMI,EAAUJ,EAAc,OAAO,EAE9MK,EAAWD,EAAU,EAAE,KAAK,MAAM,KAAK,OAAO,EAAE,GAAG,EAAEd,EAAmBc,CAAS,EAAEhB,EAAOiB,CAAU,EAAErB,EAAS,IAAO,CAAC,GAAGsB,GAAMhD,EAAW,IAAI,CAAC,GAAGgD,EAAKhD,EAAW,IAAI,eAAa,CAAC,EAAE,CAAE,CAAC,EAAE,CAACkC,EAA6BC,EAAcG,EAAiBC,EAAqBC,CAA8B,CAAC,EAGnT5I,MAAc,CAAC,GAAG,CAACwI,EAAiB,CAAIO,IAAa,QAAQ,IAAI,OAAO,+BAA+B,EAAE,QAAQ,IAAI,EAAE,GAEvH,IAAMM,EAAM1G,EAAS,CAAC,OAAOkG,EAAqB,OAAO,CAAC,KAAK,QAAQ,KAAK,QAAQ,CAAC,CAAC,EAEhF/B,EAAMnE,EAAS,CAAC,OAAO0G,EAAM,OAAO,CAAC,KAAK,QAAQ,KAAK,QAAQ,EAAE,aAAa,EAAI,CAAC,EAEnFxC,EAAKlE,EAAS,CAAC,OAAOmE,EAAM,OAAO,CAAC,KAAK,cAAc,KAAK,QAAQ,CAAC,CAAC,EAC5E,GAAKD,GAAQwC,EAAM,CAAC,IAAMC,EAAiBxD,EAAMyD,GAAkB,GAAID,EAK0KP,GAAa,QAAQ,IAAI,MAAM,sCAAsCO,EAAiB,GAAG,IAAIA,EAAiB,KAAK,EAAE,EAAMzC,IAAOyC,EAAiB,MAASlD,EAAW,OAAO,QAAO,EAAM,MAAMA,EAAW,MAAM,WAL3W,CAAI2C,IAAa,QAAQ,IAAI,KAAK,8BAA8BlC,EAAK,aAAa0C,EAAiB,WAAW,EAAE,QAAQ,IAAI,MAAM,SAAS,OAAO,OAAO,CAAC,EAAEF,CAAK,CAAC,GAC1P,IAAMG,EAAe7G,EAAS,CAAC,OAAO0G,EAAM,OAAO,CAAC,KAAK,QAAQ,KAAK,QAAQ,CAAC,CAAC,EAC1EI,EAAc9G,EAAS,CAAC,OAAOmE,EAAM,OAAO,CAAC,KAAK,mBAAmB,KAAK,QAAQ,CAAC,CAAC,EAAQ4C,EAAgB,CAAC,EAAE,IAAI,GAAK,CAACC,EAAUC,KAAS,OAAO,QAAQH,CAAa,EAAE,CAChL,GAAK,CAAC,QAAM,GAAGI,GAAYD,EAAM,EAAgBE,GAAO,CAAC,GAAGD,EAAW,GAAGF,CAAS,CAAE,CACrF,IAAMI,EAAe3G,EAAkB,CAAC,UADyDT,EAAS,CAAC,OAAO0G,EAAM,OAAO,CAAC,KAAK,OAAO,KAAK,QAAQ,CAAC,CACxG,CAAI,CAAC,EAAE,OAAOU,EAAejD,GAAO,OAAO,IAAML,EAAqB,OAAO,KAAKsD,CAAc,CAAC,CAAC,OAAO,EAAEA,EAAe,KAAQhB,GAAatC,GAAsB,QAAQ,IAAI,MAAM,cAAcA,CAAoB,EAC3QqB,EAAS,IAAO,CAAC,GAAGsB,GAAMG,GAAkB,CAAC,GAAGC,GAAgB,CAAC,gBAAc,EAAE,GAAG/C,GAAsB,CAAC,sBAAoB,EAAE,OAAK,MAAMK,GAAO,MAAM,OAAO4C,EAAgB,eAAe,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,EAAE,cAAc,CAAC,CAAC,CAAC,EAAE,CAAE,CAAoO,CAC5crB,EAAc,CAAC,OAAK,MAAMvB,GAAO,MAAM,GAAGyC,EAAiB,GAAG,CAAC,CAACF,GAAO,CAAC,OAAK,CAAC,CAAC,EAC/EnB,EAAO,CAAC,EACRF,EAAY,IAAO,CAAC,GAAGoB,EAAK,aAAW,EAAE,CAAE,CAAC,EAAE,CAACZ,EAAiBK,CAAoB,CAAC,EAAKE,GAAY,QAAQ,IAAI,MAAM,OAAO,OAAO,CAAC,EAAEjD,CAAK,CAAC,EAAQ,CAAC,MAAI,iBAAe,CAAE,EAO7J,EAAuB,GAAc,CAAC,GAAK,CAACA,EAAMgC,GAAUtH,EAAS,EAAQ4F,EAAWN,EAAMO,IAAe,KAAkD,MAAM,CAAC,kBAAkB,CAA/ChG,EAA+D,GAAG,CAAC,CAAC+F,EAAW,oBAAoBA,CAAU,CAAE,EAWxP,IAAmB,CAAC,eAAa,cAAY,eAAa,QAAM,qBAAmB,CAAC,GAAK,CAAC,kCAAgChB,EAAkC,EAAO,CAAC4E,EAAeC,GAAmB5K,EAAS,EAAK,EAAO,CAAC,oBAAkB,uBAAqBmG,EAAuBa,CAAY,EAAQ6D,EAAsB,CAAC,UAAU,sBAAsB,OAAO,OAAO,OAAO,OAAO,2BAA2B,SAAS,kBAAkB,WAAW,QAAQ,EAKV,OAJhdlK,MAAc,CACb,GADciK,EAAkB,EAAK,EAClCE,EAAkB,CAAC,IAAMP,EAAMQ,EAAoB,OAAOC,GAAoBC,EAAgBJ,EAAsB,SAASN,GAAO,IAAI,EAAQW,EAAwBX,GAAO,OAAOY,EAEzL,GAAKZ,GAAOU,GAAiBC,IAF4LE,EAAgBvH,IAAQ,IAAA,GACjPA,IAAQ,MAC6D+G,EAAkB,EAAI,MACtF,CAAC,IAAMS,EAAO,CAAC,0BAA0BL,EAAa,EAAE,EAAMT,GAAMc,EAAO,KAAK,GAAGL,EAAa,iBAAiB,EAAMC,GAAgBI,EAAO,KAAK,GAAKd,EAAMA,EAAM,KAAK,QAAQ,wBAAwB,EAAMW,GAAwBG,EAAO,KAAK,gDAAgD,EAAKxH,IAAQ,IAAA,IAAUwH,EAAO,KAAK,oBAAoB,EAAE9C,EAA+B8C,EAAO,KAAK;CAAI,CAAC,CAAE,CAAC,CAAC,EAAE,CAACP,EAAkBE,EAAanH,EAAMuH,CAAe,CAAC,EAAST,CACtd,EAmBe,IAAqB,CAAC,eAAa,eAAa,YAAU,cAAY,iBAAe,iBAAe,eAAa,WAAS,CAAC,GAAK,CAAC,kCAAgC5E,EAAkC,EAAQ0C,EAAStH,EAAS,CAAC,CAAC,GACzOmK,EAAkBpL,EAAO,CAAC,eAAa,eAAa,YAAU,eAAa,OAAK,CAAC,EAAO,CAAC,uBAAqBiG,EAAuBa,CAAY,EACjJuE,EAAkBR,GAAqB,SAASC,EAAa,EAAE,SAAS,KAAK,GAAGQ,EAAE,YAAY3G,IAAY2G,EAAE,QAAQ3H,GAAO,KAAK,UAAU2H,EAAE,KAAK,IAAI,KAAK,UAAU3H,CAAK,EAAE,GAAG,KAAW4H,EAA0BvL,EAAOwL,CAAc,EAAQC,EAAmBzL,EAAOwL,CAAc,EAAQE,EAAyB1L,EAAO,CAAC,CAACqL,CAAiB,EAI0b,OAHnxB5K,MAAc,CAAC,EAAmB,QAAQ+K,CAAe,EAAE,CAACA,CAAc,CAAC,EAC3E/K,OAAkBgK,GAAgB,CAACY,IAAmBhD,EAA+B,+BAA+BvB,EAAa,WAAWgE,EAAa,UAAUG,EAAY,eAAetG,EAAU,WAAWhB,EAAM,aAAa6H,GAAgB,EAAE,EAAyB,QAAQ,GAAKjD,EAAS,GAAM,CAAC,IAAMoD,EAAY9B,EAAK/C,EAAa,EAAE,OAAOgE,EAAa,EAAE,SAAS,CAAC,EAAE,MAAM,CAAC,GAAGjB,GAAM/C,GAAc,CAAC,GAAG+C,EAAK/C,GAAc,OAAO,CAAC,GAAG+C,EAAK/C,EAAa,EAAE,QAAQgE,GAAc,CAAC,GAAGjB,EAAK/C,EAAa,EAAE,OAAOgE,GAAc,QAAQ,CAAC,GAAGa,EAAY,CAAC,YAAU,QAAM,SAASH,CAAc,CAAC,CAAC,CAAC,CAAC,CAAC,CAAE,CAAC,OAC3kB,CAAC,IAAMI,EAAc,CAAC,eAAa,eAAa,YAAU,eAAa,OAAK,EAAQC,EAAa,OAAO,KAAKD,CAAa,CAAC,CAAC,KAAK,GAAK,CAAC,IAAME,EAAaF,EAAclD,GAAWqD,EAAaX,EAAkB,QAAQ1C,GAA6U,OAAxUL,EAA+B,WAAW+C,EAAkB,QAAQ,aAAa,EAAE,EAAE/C,EAA+B,yBAAyByD,CAAY,EAAEzD,EAA+B,yBAAyB0D,CAAY,EAAK,OAAOA,GAAe,SAAiB,KAAK,UAAUD,CAAY,IAAI,KAAK,UAAUC,CAAY,EAAUD,IAAeC,CAAa,CAAC,EAAE,GAAGtB,GAAgBoB,EAAa,CAAC,GAAK,CAAC,aAAaG,EAAiB,aAAaC,EAAiB,UAAUC,EAAc,MAAMC,GAAWf,EAAkB,QAAQ/C,EAA+B,4BAA4B4D,EAAiB,WAAWD,EAAiB,UAAUf,EAAY,eAAeiB,EAAc,WAAWC,GAAW,EAAE5D,EAAS,GAAM,CAAC,IAAMoD,EAAY9B,EAAKoC,EAAiB,EAAE,OAAOD,EAAiB,EAAE,SAAS,CAAC,EAAE,MAAM,CAAC,GAAGnC,GAAMoC,GAAkB,CAAC,GAAGpC,EAAKoC,GAAkB,OAAO,CAAC,GAAGpC,EAAKoC,EAAiB,EAAE,QAAQD,GAAkB,CAAC,GAAGnC,EAAKoC,EAAiB,EAAE,OAAOD,GAAkB,QAAQL,EAAY,OAAO,GAAGL,EAAE,YAAYY,GAAeZ,EAAE,QAAQa,CAAS,CAAC,CAAC,CAAC,CAAC,CAAE,CAAC,CAAE,CAAC,OAAO,OAAOf,EAAkB,QAAQQ,CAAa,CAAE,GAAI,CAACnB,EAAeK,EAAahE,EAAanC,EAAUyH,EAAazI,CAAK,CAAC,EACz5ClD,UAAyB,CAAC,GAAGiL,EAAyB,SAAS,CAACN,EAAkB,QAAQ,cAAiBK,EAAmB,UAAUF,EAA0B,QAAQ,CAAC,GAAK,CAAC,eAAa,eAAa,YAAU,SAAOH,EAAkB,QAAQ/C,EAA+B,6BAA6BvB,EAAa,WAAWgE,EAAa,UAAUG,EAAY,eAAetG,EAAU,WAAWhB,GAAO,EAAE4E,EAAS,GAAM,CAAC,IAAMoD,EAAY9B,EAAK/C,EAAa,EAAE,OAAOgE,EAAa,EAAE,SAAS,CAAC,EAAE,MAAM,CAAC,GAAGjB,GAAM/C,GAAc,CAAC,GAAG+C,EAAK/C,GAAc,OAAO,CAAC,GAAG+C,EAAK/C,EAAa,EAAE,QAAQgE,GAAc,CAAC,GAAGjB,EAAK/C,EAAa,EAAE,OAAOgE,GAAc,QAAQa,EAAY,IAAI,GAAGL,EAAE,YAAY3G,GAAW2G,EAAE,QAAQ3H,EAAM,CAAC,GAAG2H,EAAE,SAASC,EAA0B,OAAO,EAAED,CAAC,CAAC,CAAC,CAAC,CAAC,CAAE,CAAC,CAAE,CAAE,EAAI,CAAC,CAAC,EAAQ,CAAC,qBAAqB,CAAC,CAACD,EAAkB,yBAAyBA,GAAmB,UAAU,IAAI,CAAE,EAa/2B,GAAgB,CAAC,oBAAkB,eAAa,iBAAe,eAAa,cAAY,yBAAuB,CAAC,GAAK,CAACgB,EAAiBC,GAAqBxM,EAASsM,CAAY,EAGnF,OAF9G3L,MAAc,CAAI8L,IAAsBH,GAAcI,IAAgBC,EAAa,EAAEC,IAAsB,GAC3GJ,EAAoB,EAAK,EAAG,EAAE,CAACC,CAAiB,CAAC,EACjD9L,MAAc,CAAI+L,GAAgB,CAACH,IAAkBI,EAAa,EAAEC,IAAsB,EAAG,EAAE,CAACC,CAAW,CAAC,EAAQ,CAAC,kBAAgB,CAAE,EAAe,IAAW,CAAC,uBAAqB,eAAa,YAAU,QAAM,eAAa,eAAa,iBAAe,0BAAwB,4BAA0B,cAAY,qBAAmB,CAAC,GAAK,CAAC,kCAAgC9G,EAAkC,EAAQ0C,EAAStH,EAAS,CAAC,CAAC,GAAmCX,EAAOkL,CAAc,EAC3e,IAAMf,EAAevE,GAAkB,CAAC,eAAa,cAAY,eAAa,kBAAgB,OAAK,CAAC,EAC/F,CAAC,uBAAqB,4BAA0BC,GAAoB,CAAC,eAAa,eAAa,YAAU,cAAY,iBAAe,iBAAe,eAAa,OAAK,CAAC,EACrKqG,EAAehB,IAAiBoB,EACjC,CAAC,oBAAkBxG,EAAe,CAAC,iBAAe,eAAa,kBAAkByG,EAAqB,YAAYD,EAAyB,iBAAiBvE,EAA+B,yBAAyBuE,EAAyB,SAAS,WAAW,gBAAgB9F,EAAa,WAAWgE,EAAa,UAAUG,EAAY,eAAetG,EAAU,WAAWhB,GAAO,EAAE,oBAAoBiJ,EAAyBE,EAAwBC,CAAyB,CAAC,EAAQC,EAAyBlH,EAAa,CAAC,MAAM,IAAI,MAAM0F,CAAc,CAAC,EAAE/K,MAAc,CAAIoM,GAAsBL,GAAgB,CAACH,IAAkB9D,EAAS,IAAO,CAAC,GAAGsB,GAAM/C,GAAc,CAAC,GAAG+C,EAAK/C,GAAc,OAAO,CAAC,GAAG+C,EAAK/C,EAAa,EAAE,QAAQgE,GAAc,CAAC,GAAGjB,EAAK/C,EAAa,EAAE,SAASgE,GAAc,QAAQjB,EAAK/C,EAAa,EAAE,SAASgE,EAAa,EAAE,SAAS,IAAI,GAAOQ,EAAE,YAAY3G,IAAY2G,EAAE,QAAQ3H,GAAO,KAAK,UAAU2H,EAAE,KAAK,IAAI,KAAK,UAAU3H,CAAK,GAAU,CAAC,GAAG2H,EAAE,SAASE,CAAc,EAAUF,CAAG,CAAC,CAAC,CAAC,CAAC,EAAE,EAAEjD,EAA+B,MAAMmD,EAAe,aAAa,eAAe,UAAUV,EAAanG,EAAUhB,EAAM,WAAWmD,EAAa,EAAE,EAAG,EAAE,CAAC+F,EAAqBG,EAAyBX,CAAgB,CAAC,CAAE,C,OCjK7sC,SAAwBY,EAAgB,EAAM,CAAC,IAAoDhE,EAAiBnI,EAAoB,EAAQoM,EAAmB,CAAC,CAAC3F,EAAM,kBAAwB4F,EAA0B5F,EAAM,0BAA0B,GAAS6F,EAA2B7F,EAAM,2BAA2B,GAC/T8F,EAAc,CAACF,GAA2B,CAACC,EAAgC,CAAC,MAAI,mBAAiBpH,EAAwB,CAAC,iBAAiBuB,EAAM,aAAa,qBAAqB4F,EAA0B,YAAYD,CAAkB,CAAC,EAM5OI,EAAmB,EADD,IAAuB5E,IAAM,IACf,CAAC2E,GAAe,CAACzE,EAAsB2E,EAAmB,IAAuB,CAACF,GAAezE,EAA+E,OAA5DsE,IAAoB,QAAQ,IAAI,MAAMxE,CAAG,EAAE,QAAQ,IAAI,EAAE,GAAuB,gBAAMzI,EAAU,CAAC,SAAS,CAACoN,GAA4B,gBAAMvL,EAAY,CAAC,YAAY,mBAAqB,SAAS,CAAc,gBAAKJ,EAAO,CAAC,KAAK,gBAAgB,CAAC,EAAe,gBAAKkB,EAAS,CAAC,MAAM,CAAC,CAAC,KAAK,gCAAgC,UAAU,CAAC,CAACuK,CAAyB,EAAE,CAAC,KAAK,oEAAoE,UAAU,CAAC,CAACC,CAA0B,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAEE,GAAiC,gBAAaH,EAA0B,CAAC,MAAI,GAAG,UAAU,MAAM,CAAC,GAAGA,EAA0B,OAAO,MAAM,GAAG5F,GAAO,KAAK,CAAC,CAAC,EAAEgG,GAAiC,gBAAaH,EAA2B,CAAC,MAAM,CAAC,GAAGA,EAA2B,OAAO,MAAM,GAAG7F,GAAO,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAE,C,qDACz6B,EAAgB,YAAY,cAC5B7G,EAAoBuM,EAAgB,CAAC,aAAa,CAAC,KAAKpM,EAAY,OAAO,MAAM,KAAK,aAAa,EAAE,IAAI,EAAE,eAAe,GAAK,KAAK,EAAE,YAAY,8FAA8F,EAAE,wBAAwB,CAAC,KAAKA,EAAY,kBAAkB,MAAM,kBAAkB,YAAY,kFAAkF,EAAE,yBAAyB,CAAC,KAAKA,EAAY,kBAAkB,MAAM,mBAAmB,CAAC,CAAC,C"}