{"socketTokenTTLSeconds":1209600,"loadedAt":1752596322,"canCreateMapsSomewhere":false,"shareUrl":"https://felt.com/map/Compare-Neighborhoods-Yn2fUt8fQJKBp9A29ARlOvED","maxTileURLLength":2000,"folderTree":[],"authors":{"2d8f0d35-09e0-4bed-9323-bc2695c2272e":{"name":"Mamata Akella"}},"folderId":"8aa921f2-ff6d-44cc-bd08-0a89a6f2a790","kartaTeamId":"590e9efa-bc39-4e27-a660-3abc430cec22","workspaceBilling":{"plan_limits":{"processing_bytes":5000000000000,"storage_bytes":5000000000000,"api_calls":1000000000,"editor_limit":1000,"member_limit":1000,"map_views":1000000000},"limits_enforced":true,"next_monthly_cycle_start":1754006400000,"plan_data_usage":{"data_processing":10311306275,"data_storage":0},"featureGroups":{"enterprise_geocoding":false,"dashboards":true,"cloud_sources":true,"app_development":true,"raster_infrastructure":true},"inGracePeriod":false},"widgets":[],"mapBackgrounds":[],"sources":[],"isTrainingKarta":false,"referer":null,"defaultControlsMode":null,"pipeline":{"syncUploadMaxBytes":15360},"mapFolderId":"8aa921f2-ff6d-44cc-bd08-0a89a6f2a790","commonAnalyticsProperties":{"feature_flags":["ff_extensions","ff_growth_enterprise_trials","ff_server_side_filtering"],"workspace_id":"590e9efa-bc39-4e27-a660-3abc430cec22","workspace_plan":"enterprise_unlimited","workspace_name":"Felt","workspace_age_days":899},"mapProject":null,"mapColorPalette":[],"constraints":{"bounds":null,"maxZoom":null,"minZoom":null},"mapId":"627d9f52-df1f-4092-81a7-ddbd4653af13","urls":{"api":"/api","settings":"/users/settings","dashboard":"/maps","marketing":"/","newMap":"/map/new","newWorkspace":"/join","placeholderImage":"/images/placeholder-39c4259c68cef774b08a1a06e6626c95.png?vsn=d","canonicalPath":"/map/Compare-Neighborhoods-Yn2fUt8fQJKBp9A29ARlOvED","catchup":"/map/Compare-Neighborhoods-Yn2fUt8fQJKBp9A29ARlOvED/catchup","spritesBaseUrl":"https://app-assets.felt.com/sprites","spritesManifest":{"/sprites/msdf.json":"/sprites/msdf-0ed695ece9e09531d79ea4daa8255599.json","/sprites/msdf.png":"/sprites/msdf-235245f7cf195ff0eb39cf7a7b8fa6e9.png","/sprites/msdf@2x.json":"/sprites/msdf@2x-1e78f109cb6438c7e87da1f75344a7b7.json","/sprites/msdf@2x.png":"/sprites/msdf@2x-73817a584887afef4c1e0188642592ab.png","/sprites/sprite.json":"/sprites/sprite-964569eef729aa4773a354b47cee5d86.json","/sprites/sprite.png":"/sprites/sprite-819511448f6f2499deff86603ff78215.png","/sprites/sprite@2x.json":"/sprites/sprite@2x-24e211e07ce576bf48740474ed7d6547.json","/sprites/sprite@2x.png":"/sprites/sprite@2x-87cb20c28d14435142f4e32339e093dd.png"},"workspaceUsage":null},"customViewport":null,"individualPermissions":[],"mapImages":[],"mapTitle":"Compare Neighborhoods","amplitudeAnalyticsId":"d01926b917624c9f002b79f6016c7213","onboardingNeeded":[],"teams":[],"flashMessages":[],"currentTeamBannerAcknowledgement":{"plan":null,"plan_name":null,"acknowledged":true},"isAdminView":false,"showBasemapLabels":true,"maxImageFileSizeBytes":20000000,"mapUrls":{"export":"https://felt.com/map/export/627d9f52-df1f-4092-81a7-ddbd4653af13","embed":"https://felt.com/embed/map/Compare-Neighborhoods-Yn2fUt8fQJKBp9A29ARlOvED","appHomeForKarta":"/maps/contains/627d9f52-df1f-4092-81a7-ddbd4653af13","dataTroubleshooting":"https://help.felt.com/upload-anything/troubleshooting","exportComments":"https://felt.com/map/export/627d9f52-df1f-4092-81a7-ddbd4653af13/comments","login":"/login/map/627d9f52-df1f-4092-81a7-ddbd4653af13","signup":"/signup/map/627d9f52-df1f-4092-81a7-ddbd4653af13","supportedFormats":"https://help.felt.com/upload-anything/files"},"layerProcessingEmailSubscriptions":[],"sharing":{"publicAccess":"view_only"},"isOwner":false,"featureFlags":{"ff_extensions_use_next_sdk":false,"ff_new_source_inspection":false,"felt_is_up":true,"ff_copy_paste_styles":false,"ff_extensions":true,"ff_growth_enterprise_trials":true,"ff_isr":false,"ff_more_components":false,"ff_server_side_filtering":true,"ff_use_our_tiles":false},"kartaChannel":"anonymous_map:627d9f52-df1f-4092-81a7-ddbd4653af13","defaultZoom":14.0,"satelliteMode":false,"felt_version":"29","mapbox_api_token":"pk.eyJ1IjoiZmVsdG1hcHMiLCJhIjoiY20wZndoenl1MTFrYzJxb2czemdpNGFvZCJ9.y7NzVOMNQNTC487xOYTk7Q","editableByCurrentSession":false,"elements":[],"selectedBackgroundId":null,"teamAdminEmails":[],"mapTeamId":null,"comments":{"threads":[],"users":{}},"partnerBranding":null,"createMapParams":null,"updatedAtUnixMs":1752001346000,"current_user":{},"mapDescription":null,"allowedFeatures":{"filters":true,"sources":true,"extensions":true,"h3":true,"embeds":true,"sdk":true,"widgets":true,"transformations":true,"mapActions":true,"customIcons":true,"iframePopups":true,"bucketSources":true,"stacSource":true,"streamCogs":true,"liveLayers":true,"advancedExports":true,"basicExports":true,"basicPipelineExports":true,"commentsAttachedData":true,"embedActionCustomization":true,"embedTokens":true,"enterprisePipelineExports":true,"sameDomainJoin":true,"streamVectorTiles":true,"uploadLayer":true,"viewerExportData":true,"workspaceLibrary":true,"enterpriseExports":true},"settings":{"path":"/map/Compare-Neighborhoods-Yn2fUt8fQJKBp9A29ARlOvED","url":"https://felt.com/map/Compare-Neighborhoods-Yn2fUt8fQJKBp9A29ARlOvED","mapDescription":null,"mapTitle":"Compare Neighborhoods","viewers":{"allowExport":false,"dataTable":false,"defaultTableLayerId":null,"duplicateMap":false,"seeMapPresence":false}},"ghostPresences":[],"scripts":[{"id":"fa6919b4-a186-4d7e-9884-4f4b7ee40183","name":"Neighborhood analyzer","threads":[{"id":"cc8570f2-b670-4f95-8994-aed0fb02f2c5","insertedAt":"2025-07-08T18:30:32.391425","scriptId":"fa6919b4-a186-4d7e-9884-4f4b7ee40183"}],"content":"\n// Define constants for the application\nconst landUseIntersectedLayerId = \"qQ3URkIQTnyv9Bz8Z7zd2dC\"; // Updated to the correct layer ID from metadata\nconst actionTriggerId = \"neighborhood-analysis-action\";\nlet activePanelId = null; // Variable to store the active panel ID dynamically\n\n// Land use display names mapping\nconst landUseDisplayNames = {\n \"CIE\": \"Commercial/Industrial\",\n \"MIPS\": \"Medical/Institutional\",\n \"MIXED\": \"Mixed use\",\n \"MIXRES\": \"Mixed residential\",\n \"PDR\": \"Light industrial\",\n \"RESIDENT\": \"Residential\",\n \"RETAIL/ENT\": \"Retail/Entertainment\",\n \"VACANT\": \"Vacant\",\n \"OpenSpace\": \"Open Space\"\n};\n\n// Define custom year ranges for analysis\nconst yearRanges = [\n { start: 0, end: 1900, label: \"Pre-1900\" },\n { start: 1900, end: 1920, label: \"1900-1920\" },\n { start: 1920, end: 1940, label: \"1920-1940\" },\n { start: 1940, end: 1960, label: \"1940-1960\" },\n { start: 1960, end: 1980, label: \"1960-1980\" },\n { start: 1980, end: 2000, label: \"1980-2000\" },\n { start: 2000, end: 2020, label: \"2000-2020\" },\n { start: 2020, end: 2050, label: \"2020+\" }\n];\n\n// Create action trigger in the left sidebar\nfunction initializeActionTrigger() {\n try {\n felt.createActionTrigger({\n actionTrigger: {\n id: actionTriggerId,\n label: \"Compare Neighborhoods\",\n onTrigger: showNeighborhoodPanel\n }\n });\n } catch (error) {\n console.error(\"Error creating action trigger:\", error);\n }\n}\n\n// Show the neighborhood analysis panel when action is triggered\nasync function showNeighborhoodPanel() {\n try {\n // Create a panel ID first\n const newPanelId = await felt.createPanelId();\n activePanelId = newPanelId; // Store the panel ID in the module-level variable\n \n // Create a temporary loading panel\n await felt.createOrUpdatePanel({\n panel: {\n id: newPanelId,\n title: \"Neighborhood Comparison\",\n body: [\n {\n type: \"Text\",\n content: \"Loading neighborhoods... Please wait.\"\n }\n ],\n footer: [\n {\n type: \"Button\",\n label: \"Close\",\n variant: \"transparent\",\n onClick: closeAnalysisPanel\n }\n ]\n }\n });\n \n // Fetch unique neighborhoods from the layer\n const neighborhoods = await fetchUniqueNeighborhoods();\n \n // Sort neighborhoods alphabetically\n const sortedNeighborhoods = neighborhoods.sort();\n \n // Create dropdown options for neighborhoods\n const options = sortedNeighborhoods.map(neighborhood => ({\n label: neighborhood,\n value: neighborhood\n }));\n \n // Add \"All Neighborhoods\" option at the top\n options.unshift({ label: \"All Neighborhoods\", value: \"all\" });\n \n // Update the full panel with content\n await felt.createOrUpdatePanel({\n panel: {\n id: newPanelId,\n title: \"Neighborhood Comparison\",\n body: [\n {\n type: \"Text\",\n content: \"Select two neighborhoods to compare land use patterns and building age distributions.\"\n },\n {\n type: \"Divider\"\n },\n {\n id: \"neighborhood-dropdown-1\",\n type: \"Select\",\n label: \"Neighborhood 1\",\n options: options,\n placeholder: \"Select first neighborhood\",\n search: true,\n onChange: ({ value }) => updateNeighborhoodDropdowns(value, null)\n },\n {\n id: \"neighborhood-dropdown-2\",\n type: \"Select\",\n label: \"Neighborhood 2\",\n options: options,\n placeholder: \"Select second neighborhood\",\n search: true,\n onChange: ({ value }) => updateNeighborhoodDropdowns(null, value)\n },\n {\n id: \"results-container\",\n type: \"Grid\",\n items: [] // Initially empty\n }\n ],\n footer: [\n {\n type: \"ButtonRow\",\n items: [\n {\n type: \"Button\",\n label: \"Reset\",\n variant: \"outlined\",\n onClick: resetFilters\n },\n {\n type: \"Button\",\n label: \"Close\",\n variant: \"outlined\",\n onClick: closeAnalysisPanel\n }\n ],\n align: \"end\"\n }\n ],\n onClickClose: () => {\n resetFilters();\n felt.deletePanel(newPanelId);\n }\n }\n });\n } catch (error) {\n console.error(\"Error showing neighborhood panel:\", error);\n }\n}\n\n// Fetch unique neighborhood values from the layer\nasync function fetchUniqueNeighborhoods() {\n try {\n // Get category data for nhood attribute\n const categoryData = await felt.getCategoryData({\n layerId: landUseIntersectedLayerId,\n attribute: \"nhood\"\n });\n \n // Extract neighborhood names from category data\n const neighborhoods = categoryData\n .filter(item => item.key !== null && item.key !== undefined && item.key !== \"\")\n .map(item => String(item.key));\n \n return neighborhoods;\n } catch (error) {\n console.error(\"Error fetching neighborhoods:\", error);\n \n // Fallback to hardcoded list of neighborhoods\n return [\n \"Sunset/Parkside\", \n \"West of Twin Peaks\", \n \"Outer Richmond\", \n \"Bayview Hunters Point\", \n \"Excelsior\", \n \"Mission\", \n \"Bernal Heights\", \n \"Inner Sunset\", \n \"Oceanview/Merced/Ingleside\", \n \"Noe Valley\", \n \"Outer Mission\"\n ];\n }\n}\n\n// Close the analysis panel and reset filters\nfunction closeAnalysisPanel() {\n try {\n if (activePanelId) {\n felt.deletePanel(activePanelId);\n activePanelId = null; // Clear the reference\n }\n resetFilters();\n } catch (error) {\n console.error(\"Error closing panel:\", error);\n }\n}\n\n// State to track selected neighborhoods\nlet selectedNeighborhoods = {\n neighborhood1: null,\n neighborhood2: null\n};\n\n// Update the results container with loading state\nasync function showLoadingState() {\n if (!activePanelId) return;\n \n try {\n await felt.updatePanelElements({\n panelId: activePanelId,\n elements: [{\n element: {\n id: \"results-container\",\n type: \"Grid\",\n items: [{\n type: \"Text\",\n content: \"**Analyzing neighborhoods...**\\n\\nPlease wait while we process the data.\"\n }]\n }\n }]\n });\n } catch (e) {\n console.error(\"Error updating loading state:\", e);\n }\n}\n\n// Update the results container with results\nasync function showResults(resultsContent) {\n if (!activePanelId) return;\n \n try {\n await felt.updatePanelElements({\n panelId: activePanelId,\n elements: [{\n element: {\n id: \"results-container\",\n type: \"Grid\",\n items: [\n {\n type: \"Divider\"\n },\n {\n type: \"Text\",\n content: resultsContent\n }\n ]\n }\n }]\n });\n } catch (e) {\n console.error(\"Error updating results:\", e);\n }\n}\n\n// Clear the results container\nasync function clearResults() {\n if (!activePanelId) return;\n \n try {\n await felt.updatePanelElements({\n panelId: activePanelId,\n elements: [{\n element: {\n id: \"results-container\",\n type: \"Grid\",\n items: [] // Empty grid\n }\n }]\n });\n } catch (e) {\n console.error(\"Error clearing results:\", e);\n }\n}\n\n// Helper function to get the display name for a land use type\nfunction getLandUseDisplayName(landUseCode) {\n return landUseDisplayNames[landUseCode] || landUseCode;\n}\n\n// Update neighborhood dropdowns and filter options\nasync function updateNeighborhoodDropdowns(n1, n2) {\n // Update the stored values\n if (n1 !== null) selectedNeighborhoods.neighborhood1 = n1;\n if (n2 !== null) selectedNeighborhoods.neighborhood2 = n2;\n \n // Get current values\n const neighborhood1 = selectedNeighborhoods.neighborhood1;\n const neighborhood2 = selectedNeighborhoods.neighborhood2;\n\n // Update dropdown options to exclude already selected neighborhoods\n if (neighborhood1 && neighborhood1 !== \"all\") {\n // Get all neighborhoods\n const neighborhoods = await fetchUniqueNeighborhoods();\n \n // Sort neighborhoods alphabetically\n const sortedNeighborhoods = neighborhoods.sort();\n \n // Filter out the first selected neighborhood for the second dropdown\n const filteredOptions = sortedNeighborhoods\n .filter(n => n !== neighborhood1)\n .map(neighborhood => ({\n label: neighborhood,\n value: neighborhood\n }));\n \n // Add \"All Neighborhoods\" option at the top\n filteredOptions.unshift({ label: \"All Neighborhoods\", value: \"all\" });\n \n // Update the second dropdown options\n try {\n if (activePanelId) {\n await felt.updatePanelElements({\n panelId: activePanelId,\n elements: [\n { \n element: {\n id: \"neighborhood-dropdown-2\",\n type: \"Select\",\n label: \"Neighborhood 2\",\n options: filteredOptions,\n placeholder: \"Select second neighborhood\",\n search: true,\n onChange: ({ value }) => updateNeighborhoodDropdowns(null, value)\n }\n }\n ]\n });\n }\n } catch (e) {\n console.error(\"Error updating dropdown options:\", e);\n }\n }\n \n // Reset if both are \"all\" or null\n if ((!neighborhood1 || neighborhood1 === \"all\") && (!neighborhood2 || neighborhood2 === \"all\")) {\n resetFilters();\n clearResults();\n return;\n }\n \n // Only perform analysis when both neighborhoods are selected\n if (neighborhood1 && neighborhood2 && neighborhood1 !== \"all\" && neighborhood2 !== \"all\" && neighborhood1 !== neighborhood2) {\n // Show loading state\n await showLoadingState();\n \n // Set filter for both neighborhoods\n const filters = [\"nhood\", \"in\", [neighborhood1, neighborhood2]];\n \n try {\n // Analyze both neighborhoods\n const results = await compareNeighborhoodsReorganized(neighborhood1, neighborhood2);\n \n // Show results\n await showResults(results);\n \n // Apply filters with empty string for note\n await felt.setLayerFilters({\n layerId: landUseIntersectedLayerId,\n filters: filters,\n note: \"\" // Empty string to avoid showing note in the legend\n });\n } catch (error) {\n console.error(\"Error in neighborhood comparison:\", error);\n \n // Show error in results\n if (activePanelId) {\n await showResults(`## Error\\n\\nError comparing neighborhoods: ${error.message}\\n\\nPlease try selecting different neighborhoods or refreshing the page.`);\n }\n }\n } else {\n // Apply filter for a single neighborhood if selected\n if ((neighborhood1 && neighborhood1 !== \"all\") || (neighborhood2 && neighborhood2 !== \"all\")) {\n const singleNeighborhood = neighborhood1 !== \"all\" ? neighborhood1 : neighborhood2;\n const filters = [\"nhood\", \"eq\", singleNeighborhood];\n \n try {\n await felt.setLayerFilters({\n layerId: landUseIntersectedLayerId,\n filters: filters,\n note: \"\" // Empty string to avoid showing note in the legend\n });\n \n // Clear results since we need both neighborhoods for comparison\n await clearResults();\n } catch (error) {\n console.error(\"Error setting filters:\", error);\n }\n }\n }\n}\n\n// Helper function to format numbers with commas for thousands\nfunction formatNumber(num) {\n return num.toLocaleString();\n}\n\n// Format percentage with consistent decimal places\nfunction formatPercent(value, decimals = 1) {\n return value.toFixed(decimals) + \"%\";\n}\n\n// Helper function to create a section header with a visual separator\nfunction createSectionHeader(title) {\n return `\\n## ${title}\\n\\n`;\n}\n\n// Compare two neighborhoods with reorganized output\nasync function compareNeighborhoodsReorganized(neighborhood1, neighborhood2) {\n try {\n // Get land use data for both neighborhoods\n const filter1 = [\"nhood\", \"eq\", neighborhood1];\n const filter2 = [\"nhood\", \"eq\", neighborhood2];\n \n // Fetch all data in parallel for efficiency\n const [landUseData1, landUseData2, yearData1, yearData2] = await Promise.all([\n // Land use data\n felt.getCategoryData({\n layerId: landUseIntersectedLayerId,\n attribute: \"landuse\",\n filters: filter1\n }),\n felt.getCategoryData({\n layerId: landUseIntersectedLayerId,\n attribute: \"landuse\",\n filters: filter2\n }),\n // Year data\n getYearHistogram(filter1),\n getYearHistogram(filter2)\n ]);\n \n // Calculate total counts\n const totalCount1 = landUseData1.reduce((sum, item) => sum + (item.value || 0), 0);\n const totalCount2 = landUseData2.reduce((sum, item) => sum + (item.value || 0), 0);\n \n // Calculate year data counts\n const yearCount1 = yearData1.reduce((sum, bin) => sum + bin.value, 0);\n const yearCount2 = yearData2.reduce((sum, bin) => sum + bin.value, 0);\n \n // Create year data maps for quick lookup\n const yearMap1 = {};\n const yearMap2 = {};\n \n yearData1.forEach((bin, index) => {\n if (index < yearRanges.length) {\n yearMap1[yearRanges[index].label] = bin.value;\n }\n });\n \n yearData2.forEach((bin, index) => {\n if (index < yearRanges.length) {\n yearMap2[yearRanges[index].label] = bin.value;\n }\n });\n \n // Create lookup maps for land use data\n const landUseMap1 = Object.fromEntries(landUseData1.map(item => [item.key, item.value || 0]));\n const landUseMap2 = Object.fromEntries(landUseData2.map(item => [item.key, item.value || 0]));\n \n // Get top land uses across both neighborhoods\n const allLandUses = new Set();\n landUseData1.forEach(item => allLandUses.add(item.key));\n landUseData2.forEach(item => allLandUses.add(item.key));\n \n // Sort by combined percentage (more significant land uses first)\n const landUsesList = [...allLandUses]\n .filter(key => key !== null && key !== undefined && key !== \"\")\n .sort((a, b) => {\n const aTotal = (landUseMap1[a] || 0) + (landUseMap2[a] || 0);\n const bTotal = (landUseMap1[b] || 0) + (landUseMap2[b] || 0);\n return bTotal - aTotal;\n });\n \n // Calculate significant differences for land use\n const landUseDiffs = [];\n landUsesList.forEach(landUse => {\n const count1 = landUseMap1[landUse] || 0;\n const count2 = landUseMap2[landUse] || 0;\n const percent1 = totalCount1 ? ((count1 / totalCount1) * 100) : 0;\n const percent2 = totalCount2 ? ((count2 / totalCount2) * 100) : 0;\n const diff = Math.abs(percent1 - percent2);\n \n if (diff >= 5) { // Only show significant differences (>= 5%)\n const higherNeighborhood = percent1 > percent2 ? neighborhood1 : neighborhood2;\n const lowerNeighborhood = percent1 > percent2 ? neighborhood2 : neighborhood1;\n const higherPercent = percent1 > percent2 ? percent1 : percent2;\n const lowerPercent = percent1 > percent2 ? percent2 : percent1;\n \n landUseDiffs.push({\n landUse,\n diff: diff,\n higher: higherNeighborhood,\n lower: lowerNeighborhood,\n higherPercent: higherPercent,\n lowerPercent: lowerPercent\n });\n }\n });\n \n // Calculate building age differences\n const ageDiffs = [];\n if (yearCount1 > 0 && yearCount2 > 0) {\n yearRanges.forEach(range => {\n const label = range.label;\n const count1 = yearMap1[label] || 0;\n const count2 = yearMap2[label] || 0;\n const percent1 = yearCount1 ? ((count1 / yearCount1) * 100) : 0;\n const percent2 = yearCount2 ? ((count2 / yearCount2) * 100) : 0;\n const diff = Math.abs(percent1 - percent2);\n \n if (diff >= 10) { // Only show major differences (>= 10%)\n const higherNeighborhood = percent1 > percent2 ? neighborhood1 : neighborhood2;\n const lowerNeighborhood = percent1 > percent2 ? neighborhood2 : neighborhood1;\n const higherPercent = percent1 > percent2 ? percent1 : percent2;\n const lowerPercent = percent1 > percent2 ? percent2 : percent1;\n \n ageDiffs.push({\n period: label,\n diff: diff,\n higher: higherNeighborhood,\n lower: lowerNeighborhood,\n higherPercent: higherPercent,\n lowerPercent: lowerPercent\n });\n }\n });\n }\n \n // Calculate most common land use for each neighborhood\n const primaryLandUse1 = landUseData1.length > 0 ? \n landUseData1.reduce((a, b) => (a.value > b.value ? a : b)).key : \"Unknown\";\n \n const primaryLandUse2 = landUseData2.length > 0 ? \n landUseData2.reduce((a, b) => (a.value > b.value ? a : b)).key : \"Unknown\";\n \n // Get the display names for primary land uses\n const primaryLandUseDisplay1 = getLandUseDisplayName(primaryLandUse1).toLowerCase();\n const primaryLandUseDisplay2 = getLandUseDisplayName(primaryLandUse2).toLowerCase();\n \n // Calculate primary land use percentages\n const primaryUseCount1 = landUseMap1[primaryLandUse1] || 0;\n const primaryUsePercent1 = totalCount1 ? Math.round((primaryUseCount1 / totalCount1) * 100) : 0;\n \n const primaryUseCount2 = landUseMap2[primaryLandUse2] || 0;\n const primaryUsePercent2 = totalCount2 ? Math.round((primaryUseCount2 / totalCount2) * 100) : 0;\n \n // Get secondary land use for each neighborhood\n const sortedUses1 = [...landUseData1].sort((a, b) => (b.value || 0) - (a.value || 0));\n const sortedUses2 = [...landUseData2].sort((a, b) => (b.value || 0) - (a.value || 0));\n \n let secondaryDesc1 = \"\";\n if (sortedUses1.length > 1) {\n const secondaryUse = sortedUses1[1].key;\n const secondaryUseDisplay = getLandUseDisplayName(secondaryUse).toLowerCase();\n const secondaryCount = sortedUses1[1].value || 0;\n const secondaryPercent = Math.round((secondaryCount / totalCount1) * 100);\n \n if (secondaryPercent >= 15) {\n secondaryDesc1 = `, with notable ${secondaryUseDisplay} development (${secondaryPercent}%)`;\n }\n }\n \n let secondaryDesc2 = \"\";\n if (sortedUses2.length > 1) {\n const secondaryUse = sortedUses2[1].key;\n const secondaryUseDisplay = getLandUseDisplayName(secondaryUse).toLowerCase();\n const secondaryCount = sortedUses2[1].value || 0;\n const secondaryPercent = Math.round((secondaryCount / totalCount2) * 100);\n \n if (secondaryPercent >= 15) {\n secondaryDesc2 = `, with notable ${secondaryUseDisplay} development (${secondaryPercent}%)`;\n }\n }\n \n // Determine dominant era for each neighborhood\n const dominantEra1 = getDominantEra(yearData1);\n const dominantEra2 = getDominantEra(yearData2);\n \n // Generate the focused insights report\n let resultsContent = `## ${neighborhood1} vs. ${neighborhood2}\\n\\n`;\n \n // SUMMARY SECTION FIRST - Updated to reference when construction peaked\n resultsContent += `${neighborhood1} is characterized by predominantly ${primaryLandUseDisplay1} parcels (${primaryUsePercent1}%)`;\n if (dominantEra1) {\n resultsContent += ` with construction peaking during the ${dominantEra1} period`;\n }\n resultsContent += `${secondaryDesc1}.\\n\\n`;\n \n resultsContent += `${neighborhood2} is characterized by predominantly ${primaryLandUseDisplay2} parcels (${primaryUsePercent2}%)`;\n if (dominantEra2) {\n resultsContent += ` with construction peaking during the ${dominantEra2} period`;\n }\n resultsContent += `${secondaryDesc2}.\\n\\n`; \n \n // Land use differences\n if (landUseDiffs.length > 0) {\n resultsContent += `#### Land Use Comparison\\n\\n`;\n \n // Sort by largest difference first\n landUseDiffs.sort((a, b) => b.diff - a.diff);\n \n // Show top 3 differences at most\n const topLandUseDiffs = landUseDiffs.slice(0, 3);\n topLandUseDiffs.forEach(diff => {\n // Use display names for land use types\n const landUseDisplay = getLandUseDisplayName(diff.landUse);\n resultsContent += `- **${landUseDisplay}**: ${formatPercent(diff.higherPercent)} in ${diff.higher} vs ${formatPercent(diff.lowerPercent)} in ${diff.lower}\\n`;\n });\n \n resultsContent += `\\n`;\n } else {\n resultsContent += `Both neighborhoods have similar land use patterns.\\n\\n`;\n }\n \n // Building age differences\n if (ageDiffs.length > 0) {\n resultsContent += `### Building Age Comparison\\n\\n`;\n \n // Sort by largest difference first\n ageDiffs.sort((a, b) => b.diff - a.diff);\n \n // Show top 3 differences at most\n const topAgeDiffs = ageDiffs.slice(0, 2);\n topAgeDiffs.forEach(diff => {\n resultsContent += `- **${diff.period}**: ${formatPercent(diff.higherPercent)} of buildings in ${diff.higher} vs ${formatPercent(diff.lowerPercent)} in ${diff.lower}\\n`;\n });\n \n resultsContent += `\\n`;\n } \n \n return resultsContent;\n } catch (error) {\n console.error(\"Error comparing neighborhoods:\", error);\n return `## Error\\n\\nError comparing neighborhoods: ${error.message}\\n\\nPlease try selecting different neighborhoods or refreshing the page.`;\n }\n}\n\n// Get the most common construction era for a neighborhood\nfunction getDominantEra(yearData) {\n let maxCount = 0;\n let dominantEra = null;\n \n yearData.forEach((bin, index) => {\n if (bin.value > maxCount && index < yearRanges.length) {\n maxCount = bin.value;\n dominantEra = yearRanges[index].label;\n }\n });\n \n return dominantEra;\n}\n\n// Generate a descriptive sentence about a neighborhood\nfunction generateNeighborhoodDescription(name, primaryLandUse, dominantEra, landUseData, totalCount) {\n // Get the display name for the primary land use\n const primaryLandUseDisplay = getLandUseDisplayName(primaryLandUse).toLowerCase();\n \n // Calculate percentage of primary land use\n const primaryUseCount = landUseData.find(item => item.key === primaryLandUse)?.value || 0;\n const primaryUsePercent = Math.round((primaryUseCount / totalCount) * 100);\n \n let description = `predominantly ${primaryLandUseDisplay} parcels (${primaryUsePercent}%)`;\n \n // Add period information if available\n if (dominantEra) {\n description += ` with construction peaking during the ${dominantEra} period`;\n }\n \n // Get secondary land use if significantly different from primary\n const sortedUses = [...landUseData].sort((a, b) => (b.value || 0) - (a.value || 0));\n \n if (sortedUses.length > 1) {\n const secondaryUse = sortedUses[1].key;\n const secondaryUseDisplay = getLandUseDisplayName(secondaryUse).toLowerCase();\n const secondaryCount = sortedUses[1].value || 0;\n const secondaryPercent = Math.round((secondaryCount / totalCount) * 100);\n \n if (secondaryPercent >= 15) { // Only mention if secondary use is substantial\n description += `, with notable ${secondaryUseDisplay} development (${secondaryPercent}%)`;\n }\n }\n \n return description;\n}\n\n// Helper function to get year histogram data\nasync function getYearHistogram(filter) {\n try {\n const yearSteps = yearRanges.map(range => range.start);\n \n const yearHistogram = await felt.getHistogramData({\n layerId: landUseIntersectedLayerId,\n attribute: \"yrbuilt\",\n steps: yearSteps,\n filters: filter\n });\n \n return yearHistogram;\n } catch (error) {\n console.error(\"Error getting year histogram:\", error);\n return [];\n }\n}\n\n// Helper function to calculate median period from histogram data\nfunction calculateMedianPeriod(histogramData, totalCount) {\n if (!totalCount || totalCount === 0) return null;\n \n let cumulative = 0;\n const midpoint = totalCount / 2;\n \n for (let i = 0; i < histogramData.length; i++) {\n const bin = histogramData[i];\n cumulative += bin.value;\n \n if (cumulative >= midpoint && i < yearRanges.length) {\n return yearRanges[i].label;\n }\n }\n \n return null;\n}\n\n// Reset filters to show all neighborhoods\nasync function resetFilters() {\n try {\n await felt.setLayerFilters({\n layerId: landUseIntersectedLayerId,\n filters: null,\n note: \"\" // Empty string to avoid showing note in the legend\n });\n \n // Reset stored neighborhood values\n selectedNeighborhoods = {\n neighborhood1: null,\n neighborhood2: null\n };\n \n // Reset dropdowns and panel text\n try {\n // Get all neighborhoods again\n const neighborhoods = await fetchUniqueNeighborhoods();\n \n // Sort neighborhoods alphabetically\n const sortedNeighborhoods = neighborhoods.sort();\n \n // Create dropdown options for neighborhoods\n const options = sortedNeighborhoods.map(neighborhood => ({\n label: neighborhood,\n value: neighborhood\n }));\n \n // Add \"All Neighborhoods\" option at the top\n options.unshift({ label: \"All Neighborhoods\", value: \"all\" });\n \n // Update both dropdowns if the panel exists\n if (activePanelId) {\n await felt.updatePanelElements({\n panelId: activePanelId,\n elements: [\n { \n element: {\n id: \"neighborhood-dropdown-1\",\n type: \"Select\",\n label: \"Neighborhood 1\",\n options: options,\n value: \"all\",\n placeholder: \"Select first neighborhood\",\n search: true,\n onChange: ({ value }) => updateNeighborhoodDropdowns(value, null)\n }\n },\n { \n element: {\n id: \"neighborhood-dropdown-2\",\n type: \"Select\",\n label: \"Neighborhood 2\",\n options: options,\n value: \"all\",\n placeholder: \"Select second neighborhood\",\n search: true,\n onChange: ({ value }) => updateNeighborhoodDropdowns(null, value)\n }\n }\n ]\n });\n \n // Clear results container\n await clearResults();\n }\n } catch (e) {\n // Panel might not exist, which is fine\n console.log(\"Panel not available to update\");\n }\n } catch (error) {\n console.error(\"Error resetting filters:\", error);\n }\n}\n\n// Initialize the action trigger when the script loads\ninitializeActionTrigger();","insertedAt":"2025-07-08T18:25:27","zOrder":0}],"resyncTimeoutMs":5250,"accessControl2":{"view":{"canDownloadLayers":false,"canDuplicate":false,"showPublicEditingSetting":false,"showPublicSharingSetting":false},"edit":{"canChangePublicSharingSettings":false,"canEdit":false,"canEditDuplicateSetting":false,"canInviteUsers":false,"canMove":false},"comments":{"canCreateThread":false,"canDeleteAnyComment":false,"canDeleteOwnComment":false,"canEditOwnComment":false,"canExportComments":false,"canReplyToThread":false,"canResolveAnyComment":false,"canResolveOwnComment":false,"canTrackReadStatus":false,"canViewAllThreads":false},"teams":{"canAddSources":false,"canCreateFolders":false,"canDeletePublishedLayer":false,"canDeleteSource":false,"canDeleteTeam":false,"canEditFolders":false,"canEditTeamMetadata":false,"canInviteTeamMember":false,"canPublishLayer":false,"canRevokeTeamMemberInvitation":false},"kartaTeamMemberIds":[]},"selectedDefaultBackgroundMode":"light","validGeoDataExtensions":[".json",".geojson"],"mapLinks":[],"layerGroups":[{"id":"52fdcaad-3c11-4015-b09c-436e7be9c0fc","name":"Land use","visible":true,"description":"","created_at":"2025-07-08T18:25:27","layers":[{"raster_colors":null,"processing_time_seconds":425,"created_at":"2025-07-08T18:25:27","source_id":null,"min_zoom":0,"remote_data_url":null,"tile_url":"https://us1.data-pipeline.felt.com/vectortile/4fc4053e-9a03-4394-9775-bc67c76d48df/{z}/{x}/{y}.pbf{?attributes,layer,query}","hash_url":"https://us1.data-pipeline.felt.com/hash/{hash}","max_zoom":18,"initial_stroke_color":null,"has_download_url":true,"stac_url":null,"visible":true,"errorType":null,"pipeline_version":"0.44.12468","pipeline_dataset_id":"4fc4053e-9a03-4394-9775-bc67c76d48df","h3_levels":null,"is_convertible_to_elements":false,"parsed_size_bytes":123949056,"next_processing_state":null,"source_dataset_id":null,"excerpt_url":"https://us1.data-pipeline.felt.com/4fc4053e-9a03-4394-9775-bc67c76d48df/excerpt/excerpt.json","data_last_updated_by_user_at":"2025-06-07T03:28:21","z_order":1,"stats_url":"https://us1.data-pipeline.felt.com/4fc4053e-9a03-4394-9775-bc67c76d48df/stats/stats.json","status":"completed","geometry_type":"Polygon","external_refresh_frequency_ms":null,"is_spreadsheet":false,"source_has_custom_query":false,"progress":100,"column_selections":[],"runCause":"transform","style":{"config":{"categoricalAttribute":"landuse","categories":["RESIDENT","MIXRES","VACANT","RETAIL/ENT","PDR","MIXED","CIE","MIPS","OpenSpace"],"labelAttribute":["nhood"],"otherOrder":"above","showOther":true},"label":{"color":"auto","fontSize":13,"fontStyle":"Normal","fontWeight":500,"haloColor":"auto","haloWidth":1,"isClickable":false,"isHoverable":false,"justify":"auto","letterSpacing":0,"lineHeight":1.2,"maxLineChars":10,"maxZoom":23,"minZoom":23,"padding":0,"placement":"Center","textTransform":"none"},"legend":{"displayName":{"0":"RESIDENT","1":"MIXRES","2":"VACANT","3":"RETAIL/ENT","4":"PDR","5":"MIXED","6":"CIE","7":"MIPS","8":"OpenSpace","9":"Other","CIE":"Commercial/Industrial","MIPS":"Medical/Institutional","MIXED":"Mixed use","MIXRES":"Mixed residential","PDR":"Light industrial","RESIDENT":"Residential","RETAIL/ENT":"Retail/Entertainment","VACANT":"Vacant"}},"paint":{"color":["hsl(32, 38%, 52%)","hsl(240, 47%, 63%)","hsl(45, 82%, 48%)","hsl(4, 92%, 71%)","hsl(169, 49%, 46%)","hsl(203, 62%, 47%)","hsl(35, 94%, 46%)","rgb(195, 75, 143)","hsl(81, 55%, 53%)","hsl(78, 9%, 70%)"],"isClickable":false,"isHoverable":false,"isSandwiched":true,"opacity":0.8,"strokeColor":"auto","strokeWidth":0.5},"type":"categorical","version":"2.3.1"},"hideFromLegend":false,"feature_url":"https://us1.data-pipeline.felt.com/onefeature/4fc4053e-9a03-4394-9775-bc67c76d48df/{feature}.geojson{?skip_geometry,zoom_level}","raster_preview_url":null,"geocoder_metadata":null,"raster_details":null,"errorMessage":null,"last_processed_at":"2025-06-07T03:28:21","tile_max_zoom":13,"scheduled_refresh_frequency":null,"geomatch_metadata":null,"id":"a90dd446-4210-4e7c-affb-3f19ef377676","name":"Land use","stats":[{"aggregation":null,"binLevel":null,"count":154913,"count_distinct":13,"name":"landuse","type":"TEXT","values":{"CIE":1387,"MED":213,"MIPS":1354,"MISSING DATA":1904,"MIXED":1940,"MIXRES":22841,"OpenSpace":964,"PDR":2094,"RESIDENT":115219,"RETAIL/ENT":2727,"Right of Way":3,"VACANT":3994,"VISITOR":273}}],"index_json_url":"https://us1.data-pipeline.felt.com/upload/1ced59d4-d92d-50b4-91d7-b9f4a44c23a7.json","bounding_box":{"coordinates":[[[-122.514642,37.708132],[-122.356976,37.708132],[-122.356976,37.833297],[-122.514642,37.833297],[-122.514642,37.708132]]],"crs":{"properties":{"name":"EPSG:4326"},"type":"name"},"type":"Polygon"},"scheduled_refresh_status":null,"layer_name":"parsed","h3_geomatched_level":null,"created_by":"Mamata Akella","modified_at":"2025-07-08T18:25:27","subtitle":"","centroids_layer_name":"parsed-anchors","legend_items":[],"table":{"name":"parsed","columns":[{"autocomplete_url":"https://us1.data-pipeline.felt.com/autocomplete/4fc4053e-9a03-4394-9775-bc67c76d48df/0/1.json{?query}","count":154913,"count_distinct":11393,"max":3015837.0,"median":1649.0,"min":0.0,"name":"bldgsqft","stats_url":"https://us1.data-pipeline.felt.com/stats/4fc4053e-9a03-4394-9775-bc67c76d48df/0.json{?query}","type":"REAL","values":{"0.0":10276,"1000.0":1411,"1050.0":799,"1125.0":1056,"1150.0":1049,"1200.0":1310,"1250.0":1469,"1300.0":966,"1350.0":923,"1500.0":1058,"800.0":938}},{"autocomplete_url":"https://us1.data-pipeline.felt.com/autocomplete/4fc4053e-9a03-4394-9775-bc67c76d48df/1/1.json{?query}","count":154913,"count_distinct":154693,"name":"blklot","stats_url":"https://us1.data-pipeline.felt.com/stats/4fc4053e-9a03-4394-9775-bc67c76d48df/1.json{?query}","type":"TEXT","values":{"0057001":2,"0405007":2,"0900003":2,"0916002":2,"1300001":4,"1301001":2,"1313029":3,"1345001":3,"4279027":3,"5508001":3,"6220002":3}},{"autocomplete_url":"https://us1.data-pipeline.felt.com/autocomplete/4fc4053e-9a03-4394-9775-bc67c76d48df/2/1.json{?query}","count":154913,"count_distinct":5301,"name":"block_num","stats_url":"https://us1.data-pipeline.felt.com/stats/4fc4053e-9a03-4394-9775-bc67c76d48df/2.json{?query}","type":"TEXT","values":{"1269":170,"3211":109,"4283B":107,"4591C":230,"4591D":143,"4711":186,"4991":161,"5335A":165,"5517":107,"7331":213,"7381":121}},{"autocomplete_url":"https://us1.data-pipeline.felt.com/autocomplete/4fc4053e-9a03-4394-9775-bc67c76d48df/3/1.json{?query}","count":154913,"count_distinct":1253,"max":398149.0,"min":0.0,"name":"cie","stats_url":"https://us1.data-pipeline.felt.com/stats/4fc4053e-9a03-4394-9775-bc67c76d48df/3.json{?query}","type":"REAL","values":{"0.0":150882,"1824.0":83,"2128.0":265,"2160.0":45,"2770.0":755,"2941.0":31,"3232.0":469,"3606.0":37,"3829.0":35,"3926.0":130,"4468.0":35}},{"autocomplete_url":"https://us1.data-pipeline.felt.com/autocomplete/4fc4053e-9a03-4394-9775-bc67c76d48df/4/1.json{?query}","count":152837,"count_distinct":5525,"name":"from_st","stats_url":"https://us1.data-pipeline.felt.com/stats/4fc4053e-9a03-4394-9775-bc67c76d48df/4.json{?query}","type":"TEXT","values":{"0":1586,"1":464,"15":430,"2":419,"20":391,"25":409,"30":387,"45":388,"50":429,"55":355,"null":2076}},{"autocomplete_url":"https://us1.data-pipeline.felt.com/autocomplete/4fc4053e-9a03-4394-9775-bc67c76d48df/5/1.json{?query}","count":154913,"count_distinct":13,"name":"landuse","stats_url":"https://us1.data-pipeline.felt.com/stats/4fc4053e-9a03-4394-9775-bc67c76d48df/5.json{?query}","type":"TEXT","values":{"CIE":1387,"MIPS":1354,"MISSING DATA":1904,"MIXED":1940,"MIXRES":22841,"OpenSpace":964,"PDR":2094,"RESIDENT":115219,"RETAIL/ENT":2727,"VACANT":3994,"VISITOR":273}},{"autocomplete_url":"https://us1.data-pipeline.felt.com/autocomplete/4fc4053e-9a03-4394-9775-bc67c76d48df/6/1.json{?query}","count":154913,"count_distinct":1230,"name":"lot_num","stats_url":"https://us1.data-pipeline.felt.com/stats/4fc4053e-9a03-4394-9775-bc67c76d48df/6.json{?query}","type":"TEXT","values":{"001":3906,"002":3515,"003":3505,"004":3530,"005":3509,"006":3492,"007":3470,"008":3406,"009":3387,"010":3362,"011":3311}},{"autocomplete_url":"https://us1.data-pipeline.felt.com/autocomplete/4fc4053e-9a03-4394-9775-bc67c76d48df/7/1.json{?query}","count":154913,"count_distinct":154693,"name":"mapblklot","stats_url":"https://us1.data-pipeline.felt.com/stats/4fc4053e-9a03-4394-9775-bc67c76d48df/7.json{?query}","type":"TEXT","values":{"0057001":2,"0405007":2,"0900003":2,"0916002":2,"1300001":4,"1301001":2,"1313029":3,"1345001":3,"4279027":3,"5508001":3,"6220002":3}},{"autocomplete_url":"https://us1.data-pipeline.felt.com/autocomplete/4fc4053e-9a03-4394-9775-bc67c76d48df/8/1.json{?query}","count":154913,"count_distinct":724,"max":649787.0,"min":0.0,"name":"med","stats_url":"https://us1.data-pipeline.felt.com/stats/4fc4053e-9a03-4394-9775-bc67c76d48df/8.json{?query}","type":"REAL","values":{"0.0":152656,"1816.0":20,"1824.0":83,"2128.0":94,"2375.0":45,"2770.0":254,"2771.0":21,"3232.0":369,"3281.0":22,"3606.0":151,"3926.0":90}},{"autocomplete_url":"https://us1.data-pipeline.felt.com/autocomplete/4fc4053e-9a03-4394-9775-bc67c76d48df/9/1.json{?query}","count":154913,"count_distinct":3323,"max":932807.0,"min":0.0,"name":"mips","stats_url":"https://us1.data-pipeline.felt.com/stats/4fc4053e-9a03-4394-9775-bc67c76d48df/9.json{?query}","type":"REAL","values":{"0.0":138654,"1202.0":362,"1438.0":415,"1678.0":1747,"2128.0":381,"2184.0":3917,"2218.0":211,"2499.0":620,"2549.0":624,"3471.0":425,"4051.0":217}},{"autocomplete_url":"https://us1.data-pipeline.felt.com/autocomplete/4fc4053e-9a03-4394-9775-bc67c76d48df/10/1.json{?query}","count":154913,"count_distinct":154693,"max":155468.0,"median":77386.0,"min":1.0,"name":"objectid","stats_url":"https://us1.data-pipeline.felt.com/stats/4fc4053e-9a03-4394-9775-bc67c76d48df/10.json{?query}","type":"REAL","values":{"107436.0":3,"108844.0":3,"12925.0":2,"13083.0":2,"19144.0":2,"25707.0":3,"27054.0":3,"28120.0":4,"290.0":2,"6574.0":2,"94335.0":3}},{"autocomplete_url":"https://us1.data-pipeline.felt.com/autocomplete/4fc4053e-9a03-4394-9775-bc67c76d48df/11/1.json{?query}","count":154913,"count_distinct":1733,"max":373344.0,"min":0.0,"name":"pdr","stats_url":"https://us1.data-pipeline.felt.com/stats/4fc4053e-9a03-4394-9775-bc67c76d48df/11.json{?query}","type":"REAL","values":{"0.0":146631,"1194.0":119,"1666.0":581,"2128.0":326,"2153.0":119,"2169.0":1030,"2770.0":291,"2803.0":382,"3197.0":184,"3271.0":107,"3757.0":237}},{"autocomplete_url":"https://us1.data-pipeline.felt.com/autocomplete/4fc4053e-9a03-4394-9775-bc67c76d48df/12/1.json{?query}","count":154913,"count_distinct":239,"max":720.0,"median":2.0,"min":0.0,"name":"resunits","stats_url":"https://us1.data-pipeline.felt.com/stats/4fc4053e-9a03-4394-9775-bc67c76d48df/12.json{?query}","type":"REAL","values":{"0.0":17995,"1.0":96160,"12.0":1005,"2.0":18471,"3.0":7437,"4.0":4571,"5.0":1127,"6.0":2643,"7.0":536,"8.0":786,"9.0":485}},{"autocomplete_url":"https://us1.data-pipeline.felt.com/autocomplete/4fc4053e-9a03-4394-9775-bc67c76d48df/13/1.json{?query}","count":154913,"count_distinct":2465,"max":387013.0,"min":0.0,"name":"retail","stats_url":"https://us1.data-pipeline.felt.com/stats/4fc4053e-9a03-4394-9775-bc67c76d48df/13.json{?query}","type":"REAL","values":{"0.0":146139,"1479.0":176,"1725.0":433,"1824.0":134,"1925.0":105,"2128.0":604,"2246.0":812,"2620.0":281,"2770.0":491,"2924.0":194,"3232.0":134}},{"autocomplete_url":"https://us1.data-pipeline.felt.com/autocomplete/4fc4053e-9a03-4394-9775-bc67c76d48df/14/1.json{?query}","count":154913,"count_distinct":145449,"max":65582188.8936,"median":2789.60129754,"min":1.04707828341,"name":"shape_area","stats_url":"https://us1.data-pipeline.felt.com/stats/4fc4053e-9a03-4394-9775-bc67c76d48df/14.json{?query}","type":"REAL","values":{"2975.84180559":42,"2975.84180649":65,"2975.8432477":60,"2975.84330091":46,"2975.84330096":31,"2975.84330097":104,"2975.84330112":54,"2975.86253306":28,"2975.86253396":35,"2975.86280822":30,"2975.86280911":35}},{"autocomplete_url":"https://us1.data-pipeline.felt.com/autocomplete/4fc4053e-9a03-4394-9775-bc67c76d48df/15/1.json{?query}","count":154913,"count_distinct":143858,"max":46531.2467683,"median":258.713578166,"min":5.21509611789,"name":"shape_leng","stats_url":"https://us1.data-pipeline.felt.com/stats/4fc4053e-9a03-4394-9775-bc67c76d48df/15.json{?query}","type":"REAL","values":{"289.332507998":32,"289.332507999":31,"289.332819547":41,"289.332819563":75,"289.332847151":80,"289.332847152":112,"289.332847166":74,"289.332939563":38,"289.332939593":65,"289.333163791":49,"289.333709685":42}},{"autocomplete_url":"https://us1.data-pipeline.felt.com/autocomplete/4fc4053e-9a03-4394-9775-bc67c76d48df/16/1.json{?query}","count":150631,"count_distinct":20,"name":"st_type","stats_url":"https://us1.data-pipeline.felt.com/stats/4fc4053e-9a03-4394-9775-bc67c76d48df/16.json{?query}","type":"TEXT","values":{"AVE":59520,"BLVD":3108,"CIR":325,"CT":1112,"DR":5033,"LN":275,"PL":356,"ST":75200,"TER":1299,"WAY":3974,"null":4282}},{"autocomplete_url":"https://us1.data-pipeline.felt.com/autocomplete/4fc4053e-9a03-4394-9775-bc67c76d48df/17/1.json{?query}","count":152837,"count_distinct":1724,"name":"street","stats_url":"https://us1.data-pipeline.felt.com/stats/4fc4053e-9a03-4394-9775-bc67c76d48df/17.json{?query}","type":"TEXT","values":{"17TH":1331,"18TH":1288,"19TH":1223,"20TH":1292,"21ST":1320,"22ND":1308,"23RD":1247,"24TH":1258,"25TH":1322,"UNKNOWN":1588,"null":2076}},{"autocomplete_url":"https://us1.data-pipeline.felt.com/autocomplete/4fc4053e-9a03-4394-9775-bc67c76d48df/18/1.json{?query}","count":152837,"count_distinct":5629,"name":"to_st","stats_url":"https://us1.data-pipeline.felt.com/stats/4fc4053e-9a03-4394-9775-bc67c76d48df/18.json{?query}","type":"TEXT","values":{"0":1567,"1":397,"15":389,"2":363,"20":368,"25":399,"30":394,"45":390,"50":422,"55":355,"null":2076}},{"autocomplete_url":"https://us1.data-pipeline.felt.com/autocomplete/4fc4053e-9a03-4394-9775-bc67c76d48df/19/1.json{?query}","count":154913,"count_distinct":7683,"max":1576124.0,"median":2846.0,"min":0.0,"name":"total_uses","stats_url":"https://us1.data-pipeline.felt.com/stats/4fc4053e-9a03-4394-9775-bc67c76d48df/19.json{?query}","type":"REAL","values":{"0.0":123992,"1666.0":498,"1678.0":1444,"2128.0":1073,"2169.0":850,"2184.0":3250,"2246.0":504,"2499.0":492,"2549.0":514,"2770.0":1059,"3232.0":546}},{"autocomplete_url":"https://us1.data-pipeline.felt.com/autocomplete/4fc4053e-9a03-4394-9775-bc67c76d48df/20/1.json{?query}","count":154913,"count_distinct":284,"max":66063.0,"min":0.0,"name":"visitor","stats_url":"https://us1.data-pipeline.felt.com/stats/4fc4053e-9a03-4394-9775-bc67c76d48df/20.json{?query}","type":"REAL","values":{"0.0":154416,"1816.0":6,"1824.0":10,"2128.0":7,"2375.0":6,"2770.0":114,"3212.0":9,"3365.0":5,"4462.0":13,"5540.0":11,"7232.0":5}},{"autocomplete_url":"https://us1.data-pipeline.felt.com/autocomplete/4fc4053e-9a03-4394-9775-bc67c76d48df/21/1.json{?query}","count":154913,"count_distinct":192,"max":8687.0,"median":1926.0,"min":0.0,"name":"yrbuilt","stats_url":"https://us1.data-pipeline.felt.com/stats/4fc4053e-9a03-4394-9775-bc67c76d48df/21.json{?query}","type":"REAL","values":{"0.0":7298,"1900.0":13253,"1907.0":4315,"1908.0":4244,"1923.0":3937,"1924.0":4386,"1925.0":5045,"1926.0":3964,"1927.0":3742,"1940.0":3919,"1941.0":4183}},{"autocomplete_url":"https://us1.data-pipeline.felt.com/autocomplete/4fc4053e-9a03-4394-9775-bc67c76d48df/22/1.json{?query}","count":154913,"count_distinct":41,"name":"nhood","stats_url":"https://us1.data-pipeline.felt.com/stats/4fc4053e-9a03-4394-9775-bc67c76d48df/22.json{?query}","type":"TEXT","values":{"Bayview Hunters Point":9150,"Bernal Heights":6762,"Excelsior":8551,"Inner Sunset":6624,"Mission":7378,"Noe Valley":5807,"Oceanview/Merced/Ingleside":6367,"Outer Mission":5468,"Outer Richmond":9575,"Sunset/Parkside":22323,"West of Twin Peaks":13217}}],"row_count":154913,"content_url":"https://us1.data-pipeline.felt.com/table/4fc4053e-9a03-4394-9775-bc67c76d48df/{page}.json{?query}"},"html_popup_source":null,"initial_fill_color":null,"normalized":{"filename":"transformed.gpkg","feature_id_field":null,"filetype":"GeoPackage","layername":"parsed"}}],"created_by":"Mamata Akella","modified_at":"2025-07-08T18:25:27","user_id":"2d8f0d35-09e0-4bed-9323-bc2695c2272e","max_zoom":18,"subtitle":null,"z_order":4,"index_json_url":"https://us1.data-pipeline.felt.com/upload/1ced59d4-d92d-50b4-91d7-b9f4a44c23a7.json","hideFromLegend":false,"isCollapsed":false,"errorMessage":null,"thumbnailUrl":null,"progress_percent":100,"visibilityInteraction":"checkbox","created_at_unix_time_ms":1751999127000,"duplicatedFromId":null,"errorType":null,"published_to_project_ids":null,"renderAsLayer":true},{"id":"98caab62-f5c5-45f4-8926-9f1867a8e07a","name":"Analysis Neighborhoods","visible":true,"description":"","created_at":"2025-07-08T18:25:27","layers":[{"raster_colors":null,"processing_time_seconds":12,"created_at":"2025-07-08T18:25:27","source_id":null,"min_zoom":0,"remote_data_url":null,"tile_url":"https://us1.data-pipeline.felt.com/vectortile/f694bcc7-4ecf-4498-af54-23c900004453/{z}/{x}/{y}.pbf{?attributes,layer,query}","hash_url":"https://us1.data-pipeline.felt.com/hash/{hash}","max_zoom":18,"initial_stroke_color":null,"has_download_url":true,"stac_url":null,"visible":true,"errorType":null,"pipeline_version":"0.35.11062","pipeline_dataset_id":"f694bcc7-4ecf-4498-af54-23c900004453","h3_levels":null,"is_convertible_to_elements":true,"parsed_size_bytes":831488,"next_processing_state":null,"source_dataset_id":null,"excerpt_url":"https://us1.data-pipeline.felt.com/f694bcc7-4ecf-4498-af54-23c900004453/excerpt/excerpt.json","data_last_updated_by_user_at":null,"z_order":0,"stats_url":"https://us1.data-pipeline.felt.com/f694bcc7-4ecf-4498-af54-23c900004453/stats/stats.json","status":"completed","geometry_type":"Polygon","external_refresh_frequency_ms":null,"is_spreadsheet":false,"source_has_custom_query":false,"progress":100,"column_selections":[],"runCause":"reprocess","style":{"config":{"labelAttribute":["nhood"]},"label":{"color":"rgb(51, 51, 51)","fontSize":15,"fontStyle":"Normal","fontWeight":500,"haloColor":"rgb(255, 255, 255)","haloWidth":1,"isClickable":false,"isHoverable":false,"justify":"auto","letterSpacing":0,"lineHeight":1.3,"maxLineChars":10,"maxZoom":23,"minZoom":1,"padding":20,"placement":["Center"],"visible":true},"legend":{},"paint":{"color":"rgba(0, 0, 0, 0)","highlightColor":"hsla(329,81%,64%, 0.5)","highlightStrokeColor":"hsla(329,81%,64%, 0.8)","highlightStrokeWidth":{"linear":[[3,0.5],[20,2]]},"isClickable":false,"isHoverable":false,"isSandwiched":false,"opacity":0.8,"strokeColor":"rgb(51, 51, 51)","strokeWidth":2},"type":"simple","version":"2.3.1"},"hideFromLegend":true,"feature_url":"https://us1.data-pipeline.felt.com/onefeature/f694bcc7-4ecf-4498-af54-23c900004453/{feature}.geojson{?skip_geometry,zoom_level}","raster_preview_url":null,"geocoder_metadata":null,"raster_details":null,"errorMessage":null,"last_processed_at":"2024-12-13T23:02:38","tile_max_zoom":null,"scheduled_refresh_frequency":null,"geomatch_metadata":null,"id":"17a7da37-a891-4931-9fb2-f3f3eec915d4","name":"Analysis Neighborhoods","stats":[],"index_json_url":"https://us1.data-pipeline.felt.com/upload/3c3b91a3-4ee7-5b34-934e-506b0000554c.json","bounding_box":{"coordinates":[[[-122.514948,37.708132],[-122.356967,37.708132],[-122.356967,37.833298],[-122.514948,37.833298],[-122.514948,37.708132]]],"crs":{"properties":{"name":"EPSG:4326"},"type":"name"},"type":"Polygon"},"scheduled_refresh_status":null,"layer_name":"parsed","h3_geomatched_level":null,"created_by":"Can Duruk","modified_at":"2025-07-08T18:25:27","subtitle":"","centroids_layer_name":"parsed-anchors","legend_items":[{"id":"8371ed60-3ea1-49b6-a469-b7e53ea0c3ab--0-Bayview Hunters Point","visible":true},{"id":"8371ed60-3ea1-49b6-a469-b7e53ea0c3ab--0-Bernal Heights","visible":true},{"id":"8371ed60-3ea1-49b6-a469-b7e53ea0c3ab--0-Castro/Upper Market","visible":true},{"id":"8371ed60-3ea1-49b6-a469-b7e53ea0c3ab--0-Chinatown","visible":true},{"id":"8371ed60-3ea1-49b6-a469-b7e53ea0c3ab--0-Excelsior","visible":true},{"id":"8371ed60-3ea1-49b6-a469-b7e53ea0c3ab--0-Financial District/South Beach","visible":true},{"id":"8371ed60-3ea1-49b6-a469-b7e53ea0c3ab--0-Glen Park","visible":true},{"id":"8371ed60-3ea1-49b6-a469-b7e53ea0c3ab--0-Golden Gate Park","visible":true},{"id":"8371ed60-3ea1-49b6-a469-b7e53ea0c3ab--0-Haight Ashbury","visible":true},{"id":"8371ed60-3ea1-49b6-a469-b7e53ea0c3ab--0-Hayes Valley","visible":true},{"id":"8371ed60-3ea1-49b6-a469-b7e53ea0c3ab--0-Other","visible":true}],"table":{"name":"parsed","columns":[{"autocomplete_url":"https://us1.data-pipeline.felt.com/autocomplete/f694bcc7-4ecf-4498-af54-23c900004453/0/1.json{?query}","count":41,"count_distinct":41,"name":"nhood","stats_url":"https://us1.data-pipeline.felt.com/stats/f694bcc7-4ecf-4498-af54-23c900004453/0.json{?query}","type":"TEXT","values":{"Bayview Hunters Point":1,"Bernal Heights":1,"Castro/Upper Market":1,"Chinatown":1,"Excelsior":1,"Financial District/South Beach":1,"Glen Park":1,"Golden Gate Park":1,"Haight Ashbury":1,"Hayes Valley":1,"Inner Richmond":1}}],"row_count":41,"content_url":"https://us1.data-pipeline.felt.com/table/f694bcc7-4ecf-4498-af54-23c900004453/{page}.json{?query}"},"html_popup_source":null,"initial_fill_color":null,"normalized":{"filename":"Analysis_Neighborhoods.geojson","feature_id_field":null,"filetype":"GeoPackage","layername":"Analysis_Neighborhoods"}}],"created_by":"Mamata Akella","modified_at":"2025-07-08T18:25:27","user_id":"2d8f0d35-09e0-4bed-9323-bc2695c2272e","max_zoom":18,"subtitle":null,"z_order":3,"index_json_url":"https://us1.data-pipeline.felt.com/upload/3c3b91a3-4ee7-5b34-934e-506b0000554c.json","hideFromLegend":false,"isCollapsed":false,"errorMessage":null,"thumbnailUrl":null,"progress_percent":100,"visibilityInteraction":"checkbox","created_at_unix_time_ms":1751999127000,"duplicatedFromId":null,"errorType":null,"published_to_project_ids":null,"renderAsLayer":true}],"embedConfig":{"mimeType":null,"barHexColor":"#333333CC","barLogoUrl":null,"barText":null,"topBarEnabled":true,"barLogoAspectRatio":null,"barLogoStatus":"not_started"},"validMapImageMimeTypes":["image/jpeg","image/png","image/heic","image/webp","image/svg+xml","image/bmp","image/apng","image/vnd.microsoft.icon","image/x-icon","image/x-icns","image/pjpeg","image/jp2","image/jpx","image/jpm","image/jxr","image/pict","image/x-pict","application/pdf","image/vnd.adobe.photoshop","application/x-photoshop","application/postscript","image/avif"],"actions":[],"isVirtualKarta":false,"layerAttrConstraints":{"maxNameLength":300},"defaultCoordinates":{"lat":37.807,"lng":-122.271},"customIcons":[{"id":"0abb4b48-587b-42d4-b172-0e5fdd9dfd69","name":"Twelve Drummers Drumming","status":"uploaded","category":"Logos","insertedAt":"2024-12-23T21:01:35","assetId":"153785e0-0f3d-473e-89a1-a017711a426d","createdByUserName":"Chris Loer","workspaceScoped":true},{"id":"f59dbe42-96ff-4f7b-b1b9-dcc5377081a9","name":"untitled-1_168","status":"uploaded","category":"Logos","insertedAt":"2025-01-03T16:46:38","assetId":"712f7b12-49d1-4664-a005-cf2212f5f61b","createdByUserName":"Mamata Akella","workspaceScoped":true},{"id":"52ac4e66-259c-49f7-8654-0835571ca666","name":"tiny Arrow","status":"uploaded","category":"Arrows","insertedAt":"2025-01-03T17:46:39","assetId":"621af75d-d645-4d16-af23-f872a493f3cd","createdByUserName":"Mamata Akella","workspaceScoped":true},{"id":"fb5e0932-8bcb-42a1-a83c-395112ea7b46","name":"fgdc-25.046_arrowCoronaAnnulus","status":"uploaded","category":"Arrows","insertedAt":"2025-01-03T17:46:39","assetId":"313bb781-00b7-4098-bdea-9b15f0684222","createdByUserName":"Mamata Akella","workspaceScoped":true},{"id":"f2ab9ede-92b8-4bdb-abad-853e53baf416","name":"strike_slip_fault_arrows_l","status":"uploaded","category":"Arrows","insertedAt":"2025-01-03T17:46:39","assetId":"fc68c676-d46c-4d8b-84fb-d569e966e77b","createdByUserName":"Mamata Akella","workspaceScoped":true},{"id":"38278263-9593-4af1-a73c-2c65247b2ffc","name":"strike_slip_fault_arrows_r","status":"uploaded","category":"Arrows","insertedAt":"2025-01-03T17:46:39","assetId":"58f67ff6-5f7b-437a-9255-6cbbb60dc936","createdByUserName":"Mamata Akella","workspaceScoped":true},{"id":"f7a436f5-e73f-4c40-b52f-4220f2edc644","name":"fgdc-25.059_erosionalBoundary","status":"uploaded","category":"Arrows","insertedAt":"2025-01-03T17:46:39","assetId":"fb42cc85-69f8-4a7e-97f6-5117f778b20d","createdByUserName":"Mamata Akella","workspaceScoped":true},{"id":"c013a567-8028-4af0-8e89-1f7270a6ea63","name":"decor-decoration-fountain-ornament-svgrepo-com","status":"uploaded","category":"","insertedAt":"2025-01-03T21:37:57","assetId":"a9db1e26-492d-4ff0-80db-65bd799c271f","createdByUserName":"Mamata Akella","workspaceScoped":true},{"id":"9f14d9bc-bf50-476d-8d5f-006b7ec2e25e","name":"Team","status":"uploaded","category":"","insertedAt":"2025-03-31T16:03:49","assetId":"1537f09a-8b83-42a0-af5a-b2a5d91eed86","createdByUserName":"Rachel Zack","workspaceScoped":true},{"id":"7a5d9887-a230-4ad1-9a5a-42abed1dda58","name":"enterprise","status":"uploaded","category":"","insertedAt":"2025-03-31T16:06:55","assetId":"32d7dd3a-9666-410b-80fe-e490adcc0bf3","createdByUserName":"Rachel Zack","workspaceScoped":true},{"id":"88ccb8d8-ebed-4992-9de0-86642739ff40","name":"edit_location_24dp_E8EAED_FILL0_wght400_GRAD0_opsz24","status":"uploaded","category":"","insertedAt":"2025-01-13T01:52:30","assetId":"10306425-0222-4437-b271-8a34d5bb4ef2","createdByUserName":"Can Duruk","workspaceScoped":true},{"id":"81f9f970-2c5b-402a-8eca-a4de56d6c5e7","name":"connecting_airports_24dp_E8EAED_FILL0_wght400_GRAD0_opsz24","status":"uploaded","category":"","insertedAt":"2025-01-13T01:52:30","assetId":"7249ae9f-4136-4f47-8685-20e5d959a5ac","createdByUserName":"Can Duruk","workspaceScoped":true},{"id":"8e5933cd-93c1-48b0-aa25-192d98e97646","name":"location_off_24dp_E8EAED_FILL0_wght400_GRAD0_opsz24","status":"uploaded","category":"","insertedAt":"2025-01-13T01:52:30","assetId":"65b2db17-d7ab-46ee-8109-790b151b4a87","createdByUserName":"Can Duruk","workspaceScoped":true},{"id":"f6e5d7a5-b77c-403e-90ed-9af8b77a7e5c","name":"stadium_24dp_E8EAED_FILL0_wght400_GRAD0_opsz24","status":"uploaded","category":"","insertedAt":"2025-01-13T01:52:30","assetId":"f9c0d6c4-58d3-45fa-b020-20fd6ec99860","createdByUserName":"Can Duruk","workspaceScoped":true},{"id":"b0bd445b-57d7-4f48-b16f-884ce4ae2ae2","name":"zoom_in_map_24dp_E8EAED_FILL0_wght400_GRAD0_opsz24","status":"uploaded","category":"","insertedAt":"2025-01-13T01:52:30","assetId":"fe0912ef-b704-425e-8643-01b0c272b1c1","createdByUserName":"Can Duruk","workspaceScoped":true},{"id":"0e877747-2dd8-4572-96f7-d9b58dcf8fcb","name":"moving_24dp_E8EAED_FILL0_wght400_GRAD0_opsz24","status":"uploaded","category":"","insertedAt":"2025-01-13T01:52:30","assetId":"faad11d1-b45a-4e21-9fad-65739b5f6bfd","createdByUserName":"Can Duruk","workspaceScoped":true},{"id":"075cb547-6179-4943-895e-713b7ebe0b52","name":"ev_station_24dp_E8EAED_FILL0_wght400_GRAD0_opsz24","status":"uploaded","category":"","insertedAt":"2025-01-13T01:52:30","assetId":"2a08ddfc-aae3-4202-abf2-4dbbceaf743b","createdByUserName":"Can Duruk","workspaceScoped":true},{"id":"ee7d8465-0d1d-4031-8d99-b5f26c8b3a8e","name":"takeout_dining_24dp_E8EAED_FILL0_wght400_GRAD0_opsz24","status":"uploaded","category":"","insertedAt":"2025-01-13T01:52:30","assetId":"6666fb72-f9c2-49d0-a129-e6d5e608f511","createdByUserName":"Can Duruk","workspaceScoped":true},{"id":"605d530d-de6f-41f0-b4b4-7dabaa50995b","name":"safety_check_24dp_E8EAED_FILL0_wght400_GRAD0_opsz24","status":"uploaded","category":"","insertedAt":"2025-01-13T01:52:30","assetId":"3e10ae01-d0e9-4eb8-b385-205d695178ee","createdByUserName":"Can Duruk","workspaceScoped":true},{"id":"eb5284ff-f389-49db-bff3-148f0939c399","name":"trip_origin_24dp_E8EAED_FILL0_wght400_GRAD0_opsz24","status":"uploaded","category":"","insertedAt":"2025-01-13T01:52:30","assetId":"68873500-25dd-4093-bf29-f4f9c6f6f8e9","createdByUserName":"Can Duruk","workspaceScoped":true},{"id":"73e178a3-3a4a-49a2-a450-57e6abefdc38","name":"tour_24dp_E8EAED_FILL0_wght400_GRAD0_opsz24","status":"uploaded","category":"","insertedAt":"2025-01-13T01:52:30","assetId":"62ae9008-ba63-48f0-8ca1-c83b9629804b","createdByUserName":"Can Duruk","workspaceScoped":true},{"id":"35b2bb55-296d-4bc9-8dee-a7a2a6b3ded1","name":"traffic_24dp_E8EAED_FILL0_wght400_GRAD0_opsz24","status":"uploaded","category":"","insertedAt":"2025-01-13T01:52:30","assetId":"6e08662d-99c3-4cab-a7e6-dbf4f55a4938","createdByUserName":"Can Duruk","workspaceScoped":true},{"id":"4bb006e9-df74-49d2-94ee-672d0ef4a6ad","name":"local_convenience_store_24dp_E8EAED_FILL0_wght400_GRAD0_opsz24","status":"uploaded","category":"","insertedAt":"2025-01-13T01:52:30","assetId":"c0aaa22b-6ac9-45e0-b5b7-2a032f825444","createdByUserName":"Can Duruk","workspaceScoped":true},{"id":"d48f5d4c-c16f-47cb-8e2b-3387a67c734a","name":"signpost_24dp_E8EAED_FILL0_wght400_GRAD0_opsz24","status":"uploaded","category":"","insertedAt":"2025-01-13T01:52:30","assetId":"5577bfe6-399c-4ea4-b307-ef79f45d46c5","createdByUserName":"Can Duruk","workspaceScoped":true},{"id":"d8bc8b7b-6ff5-4eb9-91ad-3b827d5ea79e","name":"beenhere_24dp_E8EAED_FILL0_wght400_GRAD0_opsz24","status":"uploaded","category":"","insertedAt":"2025-01-13T01:52:30","assetId":"d4454afd-f041-40e7-85e0-592788e2ceb1","createdByUserName":"Can Duruk","workspaceScoped":true},{"id":"67ac644c-6da8-4882-80cf-a68da7e4b476","name":"not_listed_location_24dp_E8EAED_FILL0_wght400_GRAD0_opsz24","status":"uploaded","category":"","insertedAt":"2025-01-13T01:52:30","assetId":"69481263-5c72-4960-93fd-297f12714c07","createdByUserName":"Can Duruk","workspaceScoped":true},{"id":"d657d43c-caab-4eef-ac24-f0446ea96625","name":"alt_route_24dp_E8EAED_FILL0_wght400_GRAD0_opsz24","status":"uploaded","category":"","insertedAt":"2025-01-13T01:52:30","assetId":"c661b67f-c921-4c57-8faf-8f3f94fcbca5","createdByUserName":"Can Duruk","workspaceScoped":true},{"id":"8a3a5048-4335-43d6-86f2-ec5a82cb9774","name":"local_drink_24dp_E8EAED_FILL0_wght400_GRAD0_opsz24","status":"uploaded","category":"","insertedAt":"2025-01-13T01:52:30","assetId":"2d61d5db-39c3-4dd4-a937-f31506444d3d","createdByUserName":"Can Duruk","workspaceScoped":true},{"id":"d1eabbc4-0fea-4a33-9e20-f72d4f8ec1af","name":"local_pizza_24dp_E8EAED_FILL0_wght400_GRAD0_opsz24","status":"uploaded","category":"","insertedAt":"2025-01-13T01:52:30","assetId":"ef034d17-b929-4a33-8a29-5eed0da2dd36","createdByUserName":"Can Duruk","workspaceScoped":true},{"id":"ccf68778-1e9c-4335-8d08-2aa2734fdceb","name":"fmd_bad_24dp_E8EAED_FILL0_wght400_GRAD0_opsz24","status":"uploaded","category":"","insertedAt":"2025-01-13T01:52:30","assetId":"12b97e95-a884-4746-934b-f6a9c50e0609","createdByUserName":"Can Duruk","workspaceScoped":true},{"id":"ea9036d2-f42b-422c-abe8-0a23b6b9ae28","name":"directions_24dp_E8EAED_FILL0_wght400_GRAD0_opsz24","status":"uploaded","category":"","insertedAt":"2025-01-13T01:52:30","assetId":"9be9922f-03c2-4ccd-8ab2-092c47c003b2","createdByUserName":"Can Duruk","workspaceScoped":true},{"id":"7d12822b-aec3-4c60-ac83-e60e9e6b02cd","name":"add_location_alt_24dp_E8EAED_FILL0_wght400_GRAD0_opsz24","status":"uploaded","category":"","insertedAt":"2025-01-13T01:52:30","assetId":"d6e8374e-661d-422e-a0cc-f3b7b970dff0","createdByUserName":"Can Duruk","workspaceScoped":true},{"id":"1e0ac02b-d974-43f1-978f-c87ef23fa0b3","name":"north_24dp_E8EAED_FILL0_wght400_GRAD0_opsz24","status":"uploaded","category":"","insertedAt":"2025-01-13T01:52:30","assetId":"e13d2a0a-0222-4a16-9c82-c988fb076e95","createdByUserName":"Can Duruk","workspaceScoped":true},{"id":"2301f45c-cdc3-4c08-94b3-cfb2063233aa","name":"electrical_services_24dp_E8EAED_FILL0_wght400_GRAD0_opsz24","status":"uploaded","category":"","insertedAt":"2025-01-13T01:52:30","assetId":"ab9ce420-cf93-46a3-bde8-6e5ed2693e23","createdByUserName":"Can Duruk","workspaceScoped":true},{"id":"29bddbe0-c30c-4bbd-bd9a-d6afa5406c92","name":"maps_ugc_24dp_E8EAED_FILL0_wght400_GRAD0_opsz24","status":"uploaded","category":"","insertedAt":"2025-01-13T01:52:30","assetId":"854faf63-c417-47ce-aa58-4cff6d6e57c3","createdByUserName":"Can Duruk","workspaceScoped":true},{"id":"7aa54f6b-3096-45cc-a575-06fdc9036dd9","name":"local_gas_station_24dp_E8EAED_FILL0_wght400_GRAD0_opsz24","status":"uploaded","category":"","insertedAt":"2025-01-13T01:52:30","assetId":"5c8a76d8-a871-4650-84f1-bba2bdd50575","createdByUserName":"Can Duruk","workspaceScoped":true},{"id":"07eb5f4c-570c-4f1f-83af-7e9a8edbb484","name":"location_searching_24dp_E8EAED_FILL0_wght400_GRAD0_opsz24","status":"uploaded","category":"","insertedAt":"2025-01-13T01:52:30","assetId":"823b4a03-0f94-4b46-8e23-64a96a97f7d1","createdByUserName":"Can Duruk","workspaceScoped":true},{"id":"a529b000-3d0c-4e80-bf28-9e11ed4a2ab7","name":"zoom_out_map_24dp_E8EAED_FILL0_wght400_GRAD0_opsz24","status":"uploaded","category":"","insertedAt":"2025-01-13T01:52:30","assetId":"d38461dd-e34b-4550-bf60-cd0368c13ca7","createdByUserName":"Can Duruk","workspaceScoped":true},{"id":"bdab3dc6-5655-4347-9f3d-17d3e045188e","name":"home_repair_service_24dp_E8EAED_FILL0_wght400_GRAD0_opsz24","status":"uploaded","category":"","insertedAt":"2025-01-13T01:52:30","assetId":"81b5e0fa-34ad-4dbc-8247-09a8e566de79","createdByUserName":"Can Duruk","workspaceScoped":true},{"id":"484cefff-8da3-4303-ae7e-17ce48126518","name":"local_parking_24dp_E8EAED_FILL0_wght400_GRAD0_opsz24","status":"uploaded","category":"","insertedAt":"2025-01-13T01:52:30","assetId":"4922bef3-d38c-453d-9297-5b9fe3ecba68","createdByUserName":"Can Duruk","workspaceScoped":true},{"id":"c8719a46-f777-498a-9a58-43c64285a45b","name":"emergency_24dp_E8EAED_FILL0_wght400_GRAD0_opsz24","status":"uploaded","category":"","insertedAt":"2025-01-13T01:52:30","assetId":"565c6eea-4c8f-4017-98a1-6bb4f40c379e","createdByUserName":"Can Duruk","workspaceScoped":true},{"id":"11a958d1-4267-47e3-aa99-cc053585e51a","name":"share_location_24dp_E8EAED_FILL0_wght400_GRAD0_opsz24","status":"uploaded","category":"","insertedAt":"2025-01-13T01:52:31","assetId":"1ebb478c-95f6-475e-971a-2174398969cc","createdByUserName":"Can Duruk","workspaceScoped":true},{"id":"322cd1f8-588f-43cf-a5b1-88a8e9db9ca8","name":"north_east_24dp_E8EAED_FILL0_wght400_GRAD0_opsz24","status":"uploaded","category":"","insertedAt":"2025-01-13T01:52:31","assetId":"1cc0f210-c7ed-4bc0-8431-7bf9147670f0","createdByUserName":"Can Duruk","workspaceScoped":true},{"id":"2533d586-5621-46ee-b979-c8e376d7f572","name":"add_location_24dp_E8EAED_FILL0_wght400_GRAD0_opsz24","status":"uploaded","category":"","insertedAt":"2025-01-13T01:52:31","assetId":"e791db02-71c9-4310-bec1-a0f62f222f81","createdByUserName":"Can Duruk","workspaceScoped":true},{"id":"4b590102-06d8-494b-8bd2-712060e9ca00","name":"medical_services_24dp_E8EAED_FILL0_wght400_GRAD0_opsz24","status":"uploaded","category":"","insertedAt":"2025-01-13T01:52:31","assetId":"6436c8a3-523b-4d5d-a077-9b77ce095e20","createdByUserName":"Can Duruk","workspaceScoped":true},{"id":"6e84275f-94ae-4b6f-b391-54145e46919f","name":"handyman_24dp_E8EAED_FILL0_wght400_GRAD0_opsz24","status":"uploaded","category":"","insertedAt":"2025-01-13T01:52:31","assetId":"316c0a7d-e12a-4d46-926c-28f848ca8e77","createdByUserName":"Can Duruk","workspaceScoped":true},{"id":"67465788-6c5c-4712-a528-24bd6baf63bf","name":"near_me_24dp_E8EAED_FILL0_wght400_GRAD0_opsz24","status":"uploaded","category":"","insertedAt":"2025-01-13T01:52:31","assetId":"596d9d9a-aa74-454d-9f7b-ff666e45290d","createdByUserName":"Can Duruk","workspaceScoped":true},{"id":"5255af34-5787-4226-ad22-7630122a3bee","name":"explore_24dp_E8EAED_FILL0_wght400_GRAD0_opsz24","status":"uploaded","category":"","insertedAt":"2025-01-13T01:52:31","assetId":"9db301fd-23e1-44cc-bbc7-864f784aca67","createdByUserName":"Can Duruk","workspaceScoped":true},{"id":"febb5c0c-ebeb-4248-854c-4fad63b50851","name":"map_24dp_E8EAED_FILL0_wght400_GRAD0_opsz24","status":"uploaded","category":"","insertedAt":"2025-01-13T01:52:31","assetId":"7a99c5f1-8980-44a9-9087-1db92db5ea26","createdByUserName":"Can Duruk","workspaceScoped":true},{"id":"d5379c8d-9400-447e-bb7d-2037f48a6b4e","name":"location_on_24dp_E8EAED_FILL0_wght400_GRAD0_opsz24","status":"uploaded","category":"","insertedAt":"2025-01-13T01:52:31","assetId":"19eacd06-ee57-4da4-967f-531809b20e26","createdByUserName":"Can Duruk","workspaceScoped":true},{"id":"10b75115-0b68-455c-a328-5dabd786bff0","name":"pin_drop_24dp_E8EAED_FILL0_wght400_GRAD0_opsz24","status":"uploaded","category":"","insertedAt":"2025-01-13T01:52:31","assetId":"59adaa58-2240-4a9e-abf2-273844da46fe","createdByUserName":"Can Duruk","workspaceScoped":true},{"id":"734a2656-ade3-4992-a6db-43720e6d46eb","name":"bart","status":"uploaded","category":"transit","insertedAt":"2025-01-13T01:53:05","assetId":"fce9d3e3-9310-456e-9fca-570fac484ff0","createdByUserName":"Rachel Zack","workspaceScoped":true},{"id":"495c85a6-b5e3-45dd-bfaf-6fe9f7bebd2b","name":"local_atm_24dp_E8EAED_FILL0_wght400_GRAD0_opsz24","status":"uploaded","category":"","insertedAt":"2025-01-13T01:52:30","assetId":"c6978f7b-5564-4027-ab79-74b142dd7f83","createdByUserName":"Can Duruk","workspaceScoped":true},{"id":"d6c62ec3-5c79-41f8-ac23-707f0e0c5ef2","name":"360_24dp_E8EAED_FILL0_wght400_GRAD0_opsz24","status":"uploaded","category":"","insertedAt":"2025-01-13T01:52:30","assetId":"18b65ac8-3800-4c70-8b5b-add3a52a81b3","createdByUserName":"Can Duruk","workspaceScoped":true},{"id":"3919ae2b-a576-469f-a256-9cc41a9361f1","name":"cleaning_services_24dp_E8EAED_FILL0_wght400_GRAD0_opsz24","status":"uploaded","category":"","insertedAt":"2025-01-13T01:52:30","assetId":"ae066084-4552-4844-a0eb-cb15f1b4d88c","createdByUserName":"Can Duruk","workspaceScoped":true},{"id":"a5c7b34c-9923-459a-a180-8661b1fed98a","name":"location_away_24dp_E8EAED_FILL0_wght400_GRAD0_opsz24","status":"uploaded","category":"","insertedAt":"2025-01-13T01:52:30","assetId":"f650265c-6f32-499c-a131-7a9e9ed61c6f","createdByUserName":"Can Duruk","workspaceScoped":true},{"id":"12b1b691-6637-407c-bd58-69aa8a62c513","name":"crisis_alert_24dp_E8EAED_FILL0_wght400_GRAD0_opsz24","status":"uploaded","category":"","insertedAt":"2025-01-13T01:52:30","assetId":"f3e989c1-b10d-4d33-85c2-650c47070a66","createdByUserName":"Can Duruk","workspaceScoped":true},{"id":"30cfde62-e3ef-4b54-b9c3-7f5a728263c7","name":"local_florist_24dp_E8EAED_FILL0_wght400_GRAD0_opsz24","status":"uploaded","category":"","insertedAt":"2025-01-13T01:52:30","assetId":"7f4f2c2a-72aa-43e1-b9f2-4004f1332e21","createdByUserName":"Can Duruk","workspaceScoped":true},{"id":"0848e1b9-75da-48bf-9f99-0b74b6bd4356","name":"person_pin_24dp_E8EAED_FILL0_wght400_GRAD0_opsz24","status":"uploaded","category":"","insertedAt":"2025-01-13T01:52:30","assetId":"c4f8727f-5ffb-45ae-a985-2f97da7265c3","createdByUserName":"Can Duruk","workspaceScoped":true},{"id":"3f9e53a8-0372-425f-9139-d79beb80b907","name":"warehouse_24dp_E8EAED_FILL0_wght400_GRAD0_opsz24","status":"uploaded","category":"","insertedAt":"2025-01-13T01:52:30","assetId":"4794da8b-d4f8-4492-b3ec-787ceaf61064","createdByUserName":"Can Duruk","workspaceScoped":true},{"id":"e623a0a0-ad99-4c60-be46-20ee08514c20","name":"local_activity_24dp_E8EAED_FILL0_wght400_GRAD0_opsz24","status":"uploaded","category":"","insertedAt":"2025-01-13T01:52:30","assetId":"559b3b9a-a19d-4b33-965c-4c67923f4aab","createdByUserName":"Can Duruk","workspaceScoped":true},{"id":"d758e853-683d-4d4a-a531-78656b0a6745","name":"person_pin_circle_24dp_E8EAED_FILL0_wght400_GRAD0_opsz24","status":"uploaded","category":"","insertedAt":"2025-01-13T01:52:31","assetId":"b929c903-19ca-4c4b-939c-314a9aa4bf4f","createdByUserName":"Can Duruk","workspaceScoped":true},{"id":"dbf394c2-6c09-4c83-a3ab-dbf105850c0f","name":"local_police_24dp_E8EAED_FILL0_wght400_GRAD0_opsz24","status":"uploaded","category":"","insertedAt":"2025-01-13T01:52:30","assetId":"ab65de74-876a-464c-b37c-4308b0a975eb","createdByUserName":"Can Duruk","workspaceScoped":true},{"id":"ab5af5cc-bb5a-46f4-922b-a826ed37f3f7","name":"local_library_24dp_E8EAED_FILL0_wght400_GRAD0_opsz24","status":"uploaded","category":"","insertedAt":"2025-01-13T01:52:31","assetId":"12d25af8-67e1-4241-bff6-85952c3e8473","createdByUserName":"Can Duruk","workspaceScoped":true},{"id":"9f95e745-40ab-4837-8ad3-cce7828c6b3e","name":"my_location_24dp_E8EAED_FILL0_wght400_GRAD0_opsz24","status":"uploaded","category":"","insertedAt":"2025-01-13T01:52:31","assetId":"82cabb9e-3fa2-4769-a2f3-8f93c5ec70e1","createdByUserName":"Can Duruk","workspaceScoped":true},{"id":"b15bd69a-fd37-4f6a-b58d-7a25b5579720","name":"factory_24dp_E8EAED_FILL0_wght400_GRAD0_opsz24","status":"uploaded","category":"","insertedAt":"2025-01-13T01:52:31","assetId":"fd3ba175-c92a-4dff-82d7-842ba2bbd6ff","createdByUserName":"Can Duruk","workspaceScoped":true},{"id":"ec9b96eb-5fc0-49c4-b6c3-3a4e88c6789c","name":"east_24dp_E8EAED_FILL0_wght400_GRAD0_opsz24","status":"uploaded","category":"","insertedAt":"2025-01-13T01:52:31","assetId":"7f5d16a5-352a-46f9-906f-933d8e274af6","createdByUserName":"Can Duruk","workspaceScoped":true},{"id":"286c2f99-7ff4-4029-a285-7f8fd17551de","name":"local_mall_24dp_E8EAED_FILL0_wght400_GRAD0_opsz24","status":"uploaded","category":"","insertedAt":"2025-01-13T01:52:31","assetId":"71504918-726a-4b90-830a-7a4b0a539969","createdByUserName":"Can Duruk","workspaceScoped":true},{"id":"fe3b294a-b1f5-423e-8e9b-d654752e2430","name":"local_fire_department_24dp_E8EAED_FILL0_wght400_GRAD0_opsz24","status":"uploaded","category":"","insertedAt":"2025-01-13T01:52:31","assetId":"fcd932cf-986e-438d-8160-7cd94338c25c","createdByUserName":"Can Duruk","workspaceScoped":true},{"id":"aa0e3d4b-8988-4de1-ba87-c4b669f14331","name":"home_pin_24dp_E8EAED_FILL0_wght400_GRAD0_opsz24","status":"uploaded","category":"","insertedAt":"2025-01-13T01:52:31","assetId":"6292d5e2-35c3-4566-9b32-8b4cef371e02","createdByUserName":"Can Duruk","workspaceScoped":true},{"id":"255a63d1-2b05-4105-b87d-d4e10b0a5f1e","name":"transfer_within_a_station_24dp_E8EAED_FILL0_wght400_GRAD0_opsz24","status":"uploaded","category":"","insertedAt":"2025-01-13T01:52:30","assetId":"15d07be2-3b00-4b12-b0e7-9e13ab5c87a1","createdByUserName":"Can Duruk","workspaceScoped":true},{"id":"20ba2120-bc54-438c-a2cd-c96d4a563345","name":"felt-logo (2)","status":"uploaded","category":"Felt","insertedAt":"2025-01-27T16:55:20","assetId":"91980689-cb21-4996-a155-86b2b4557409","createdByUserName":"Rachel Zack","workspaceScoped":true}],"isAdmin":false,"checkerboardTiles":false}