diff --git a/agent/src/index.ts b/agent/src/index.ts index 088a8985..8a5c6e93 100644 --- a/agent/src/index.ts +++ b/agent/src/index.ts @@ -7,6 +7,7 @@ import { LensAgentClient } from "@ai16z/client-lens"; import { SlackClientInterface } from "@ai16z/client-slack"; import { TelegramClientInterface } from "@ai16z/client-telegram"; import { TwitterClientInterface } from "@ai16z/client-twitter"; +import { unrealPlugin } from "@ai16z/plugin-unreal"; import { AgentRuntime, CacheManager, @@ -563,6 +564,7 @@ export async function createAgent( getSecret(character, "TON_PRIVATE_KEY") ? tonPlugin : null, getSecret(character, "SUI_PRIVATE_KEY") ? suiPlugin : null, getSecret(character, "STORY_PRIVATE_KEY") ? storyPlugin : null, + unrealPlugin, saveThisPlugin ].filter(Boolean), providers: [], diff --git a/package.json b/package.json index e2cad9d0..780d97c0 100644 --- a/package.json +++ b/package.json @@ -55,6 +55,7 @@ "@coinbase/coinbase-sdk": "0.10.0", "@deepgram/sdk": "^3.9.0", "@vitest/eslint-plugin": "1.0.1", + "@ai16z/plugin-unreal": "workspace:*", "amqplib": "0.10.5", "csv-parse": "5.6.0", "ollama-ai-provider": "0.16.1", diff --git a/packages/plugin-save-this/README.md b/packages/plugin-save-this/README.md new file mode 100644 index 00000000..c0c02702 --- /dev/null +++ b/packages/plugin-save-this/README.md @@ -0,0 +1,47 @@ +# @ai16z/plugin-save-this +# saveThisPlugin + +A plugin for Eliza that enables saving information from conversations as knowledge records. + +## Description + +The save-this plugin allows users to save important information from their conversations with Eliza for later reference. When a user starts a message with "save this", the plugin will process and store that information in the knowledge base, using the knowledge.set() method. + +This will create a document record in the memories table, with associated fragments for each message. The plugin will then provide a confirmation message to the user, such as "I've stored the information for you." + +In order to decide what to save, the action handler makes a generateText request to the llm with the last 7 messages. The prompt is carefully designed to extract the most relevant information from the conversation. + +## Installation + +```bash +pnpm add @ai16z/plugin-save-this +``` + +## Usage + +1. Import and register the plugin: + +```typescript +import { saveThisPlugin } from '@ai16z/plugin-save-this'; + + +2. Use in conversation: + +``` +User: "save this: The meeting with John is scheduled for tomorrow at 2 PM" +Eliza: "I've stored the information for you" +``` + +## Configuration + +No additional configuration is required. The plugin uses Eliza's built-in knowledge storage system. + +### Triggering and use of State. + +Instead of an ACTION based trigger, the plugin uses the Provider to monitor for an explicit "save this" keyphrase at the beginning of a message. A typical action based trigger is not used, because I found that when multiple SAVE_MEMORY requests are done, eventually the LLM decides to start saving all messages to memory, and that is probably not what we want to do. + +If the "save this" keyphrase is found, the Provider will set a state variable to allow the action to proceed. So if the SAVE_THIS action is somehow triggered in another way, the handler aborts. + +## License + +MIT diff --git a/packages/plugin-unreal/.npmignore b/packages/plugin-unreal/.npmignore new file mode 100644 index 00000000..078562ec --- /dev/null +++ b/packages/plugin-unreal/.npmignore @@ -0,0 +1,6 @@ +* + +!dist/** +!package.json +!readme.md +!tsup.config.ts \ No newline at end of file diff --git a/packages/plugin-unreal/eslint.config.mjs b/packages/plugin-unreal/eslint.config.mjs new file mode 100644 index 00000000..92fe5bbe --- /dev/null +++ b/packages/plugin-unreal/eslint.config.mjs @@ -0,0 +1,3 @@ +import eslintGlobalConfig from "../../eslint.config.mjs"; + +export default [...eslintGlobalConfig]; diff --git a/packages/plugin-unreal/package.json b/packages/plugin-unreal/package.json new file mode 100644 index 00000000..259c1466 --- /dev/null +++ b/packages/plugin-unreal/package.json @@ -0,0 +1,20 @@ +{ + "name": "@ai16z/plugin-unreal", + "version": "0.1.6", + "main": "dist/index.js", + "type": "module", + "types": "dist/index.d.ts", + "dependencies": { + "@ai16z/eliza": "workspace:*", + "@ai16z/adapter-postgres": "workspace:*", + "tsup": "8.3.5" + }, + "scripts": { + "build": "tsup --format esm --dts", + "dev": "tsup --format esm --dts --watch", + "lint": "eslint --fix --cache ." + }, + "peerDependencies": { + "whatwg-url": "7.1.0" + } +} diff --git a/packages/plugin-unreal/plugin-spreadsheet/INITIALIZATION.md b/packages/plugin-unreal/plugin-spreadsheet/INITIALIZATION.md new file mode 100644 index 00000000..12fd8203 --- /dev/null +++ b/packages/plugin-unreal/plugin-spreadsheet/INITIALIZATION.md @@ -0,0 +1,80 @@ +# Plugin Spreadsheet Initialization Flow + +## Overview +This document describes the proper initialization flow for the Plugin Spreadsheet package, specifically focusing on the PropertyStorage system. + +## Initialization Chain + +1. **Plugin Creation** (`index.ts`) + ```typescript + const storage = new MemoryPropertyStorage(); + const service = new PropertyStorageService(storage); + ``` + - MemoryPropertyStorage constructor is called + - PropertyStorageService is created with the storage instance + +2. **Plugin Registration** + - Plugin is registered with the Eliza runtime + - Runtime calls initialize on the plugin + - Plugin should initialize its services + +3. **Service Initialization** (`services.ts`) + ```typescript + class PropertyStorageService { + async initialize(runtime: IAgentRuntime) { + // Should initialize the underlying storage + await this.storage.initialize(runtime); + } + } + ``` + - Service receives runtime during initialization + - Service should pass runtime to storage layer + +4. **Storage Initialization** (`memory-storage.ts`) + ```typescript + class MemoryPropertyStorage { + initialize(runtime: AgentRuntime) { + this.runtime = runtime; + elizaLogger.info('MemoryPropertyStorage: Initializing with runtime', { + hasRuntime: !!runtime, + runtimeType: runtime?.constructor?.name, + agentId: runtime?.agentId + }); + } + } + ``` + - Storage receives and stores runtime reference + - Ready for operations like search + +## Common Issues + +1. **Missing Runtime** + - Symptom: `StorageError: Runtime not initialized` + - Cause: Operations attempted before proper initialization chain completion + - Fix: Ensure service.initialize() is called and propagates to storage layer + +2. **Initialization Order** + - The plugin must be fully initialized before any actions are handled + - All search operations should check this.runtime exists before proceeding + +## Best Practices + +1. **Logging** + - Use INFO level for initialization steps + - Log runtime details during initialization for debugging + - Log errors when runtime is missing + +2. **Error Handling** + - Use StorageErrorCode.INTERNAL_ERROR for initialization issues + - Provide clear error messages indicating initialization state + +3. **Runtime Validation** + - Always check runtime exists before operations + - Log detailed diagnostics when runtime is missing + +## Verification +To verify proper initialization: +1. Check logs for "MemoryPropertyStorage: Constructor called" +2. Check logs for "MemoryPropertyStorage: Initializing with runtime" +3. Verify runtime details are logged (hasRuntime, runtimeType, agentId) +4. Test a simple search operation to confirm runtime is available diff --git a/packages/plugin-unreal/plugin-spreadsheet/Property b/packages/plugin-unreal/plugin-spreadsheet/Property new file mode 100644 index 00000000..e69de29b diff --git a/packages/plugin-unreal/plugin-spreadsheet/design/1-system-overview.md b/packages/plugin-unreal/plugin-spreadsheet/design/1-system-overview.md new file mode 100644 index 00000000..587a6ebe --- /dev/null +++ b/packages/plugin-unreal/plugin-spreadsheet/design/1-system-overview.md @@ -0,0 +1,93 @@ +# 1. System Overview + +## Architecture Overview + +```mermaid +graph TD + A[Eliza Plugin] --> B[Property Search Service] + B --> C[Storage Interface] + C --> D[Local Storage] + C --> E[Cloud Storage] + B --> F[Query Parser] + F --> G[LLM Service] + B --> H[NFT Market Service] + H --> I[OpenSea API] +``` + +## Core Components + +### 1. Property Search Service +Central coordinator that manages: +- Query processing +- Storage selection +- Result ranking +- Market data integration + +### 2. Storage Interface +Abstract interface supporting: +- Vector similarity search +- Structured filters +- Batch operations + +### 3. Query Processing +Multi-phase system: +1. Query understanding (Eliza) +2. Property search (Storage) +3. Market enrichment (OpenSea) + +### 4. NFT Integration +Provides: +- Real-time pricing +- Market analysis +- Listing status + +## System Flow + +```mermaid +sequenceDiagram + participant U as User + participant E as Eliza + participant S as Storage + participant M as Market + + U->>E: Natural language query + E->>E: Parse query + E->>S: Search properties + E->>M: Get market data + E->>E: Rank results + E->>U: Return results +``` + +## Key Features + +1. **Semantic Search** + - Natural language queries + - Vector similarity + - Metadata filtering + +2. **Market Integration** + - Real-time prices + - Listing status + - Price history + +3. **Flexible Storage** + - Local development + - Cloud scaling + - Hybrid options + +## Next Steps + +1. **Implementation** + - Start with storage abstraction + - Add basic search + - Integrate market data + +2. **Enhancement** + - Improve query parsing + - Add advanced filters + - Optimize performance + +3. **Scale** + - Deploy cloud service + - Add caching + - Monitor performance diff --git a/packages/plugin-unreal/plugin-spreadsheet/design/2-storage-abstraction.md b/packages/plugin-unreal/plugin-spreadsheet/design/2-storage-abstraction.md new file mode 100644 index 00000000..237ac3ea --- /dev/null +++ b/packages/plugin-unreal/plugin-spreadsheet/design/2-storage-abstraction.md @@ -0,0 +1,136 @@ +# 2. Storage Abstraction + +## Interface Design + +```typescript +interface PropertyStorage { + // Core operations + addProperty(property: PropertyData): Promise; + getProperty(id: string): Promise; + updateProperty(id: string, property: PropertyData): Promise; + deleteProperty(id: string): Promise; + + // Search operations + searchByVector(vector: number[], options: SearchOptions): Promise; + searchByFilters(filters: FilterGroup): Promise; + + // Batch operations + bulkLoad(properties: PropertyData[]): Promise; +} +``` + +## Implementations + +### 1. Local Storage +```typescript +class ElizaMemoryStorage implements PropertyStorage { + private properties: Map; + + async searchByVector(vector: number[], options: SearchOptions) { + return Array.from(this.properties.values()) + .map(prop => ({ + property: prop, + similarity: cosineSimilarity(vector, prop.vector) + })) + .sort((a, b) => b.similarity - a.similarity) + .slice(0, options.limit); + } +} +``` + +### 2. Cloud Storage +```typescript +class CloudPropertyStorage implements PropertyStorage { + constructor(private apiClient: RealEstateAPI) {} + + async searchByVector(vector: number[], options: SearchOptions) { + return this.apiClient.searchSimilar({ + vector, + limit: options.limit, + threshold: options.threshold + }); + } +} +``` + +### 3. Hybrid Storage +```typescript +class HybridStorage implements PropertyStorage { + constructor( + private local: ElizaMemoryStorage, + private cloud: CloudPropertyStorage, + private options: { + writeToCloud: boolean, + readPreference: 'local' | 'cloud' | 'both' + } + ) {} +} +``` + +## Data Models + +```typescript +interface PropertyData { + id: string; + name: string; + neighborhood: string; + zoningType: string; + plotSize: string; + buildingSize: string; + maxFloors: number; + minFloors: number; + plotArea: number; + maxBuildingHeight: number; + minBuildingHeight: number; + oceanDistanceMeters: number; + bayDistanceMeters: number; + description: string; + nft?: NFTMetadata; + market?: MarketStatus; +} + +interface SearchOptions { + limit: number; + threshold: number; + includeMetadata: boolean; +} + +interface FilterGroup { + operator: 'AND' | 'OR'; + filters: (MetadataFilter | FilterGroup)[]; +} +``` + +## Implementation Strategy + +### Phase 1: Basic Storage +1. Define interfaces +2. Implement local storage +3. Add basic search + +### Phase 2: Enhanced Search +1. Add vector search +2. Implement filters +3. Add batch operations + +### Phase 3: Cloud Integration +1. Implement cloud storage +2. Add hybrid options +3. Add caching + +## Performance Considerations + +1. **Local Storage** + - In-memory operations + - Vector calculations + - Result caching + +2. **Cloud Storage** + - Connection pooling + - Request batching + - Response caching + +3. **Hybrid Storage** + - Cache synchronization + - Write strategies + - Read preferences diff --git a/packages/plugin-unreal/plugin-spreadsheet/design/3-query-processing.md b/packages/plugin-unreal/plugin-spreadsheet/design/3-query-processing.md new file mode 100644 index 00000000..1cabe111 --- /dev/null +++ b/packages/plugin-unreal/plugin-spreadsheet/design/3-query-processing.md @@ -0,0 +1,225 @@ +# 3. Query Processing + +## Multi-Phase Query System + +### Phase 1: Query Understanding +```typescript +interface QueryIntent { + propertyFeatures: { + location?: string[]; + amenities?: string[]; + proximity?: Array<{ + to: string; + distance: number; + }>; + }; + marketConstraints: { + maxPrice?: number; + currency?: string; + mustBeListed?: boolean; + priceComparison?: 'below_floor' | 'below_average'; + }; + ranking: { + primarySort: 'price' | 'similarity' | 'distance'; + order: 'asc' | 'desc'; + }; +} +``` + +### Phase 2: Property Search +```typescript +interface PropertyQuery { + vectorSearch?: { + embedding: number[]; + minSimilarity: number; + }; + filters: FilterGroup; + limit: number; + offset: number; +} +``` + +### Phase 3: Market Integration +```typescript +interface MarketQuery { + properties: Array<{ + tokenId: string; + contractAddress: string; + }>; + constraints: { + maxPrice?: number; + listedOnly: boolean; + }; +} +``` + +## Query Flow + +```mermaid +sequenceDiagram + participant U as User + participant E as Eliza + participant C as Cloud DB + participant O as OpenSea + + U->>E: Natural language query + + %% Phase 1 + E->>E: Parse query intent + Note over E: Extract features,
constraints, ranking + + %% Phase 2 + E->>C: Vector search + filters + C-->>E: Candidate properties + + %% Phase 3 + E->>O: Check listings + O-->>E: Market data + + E->>E: Rank results + E-->>U: Final results +``` + +## Implementation Details + +### 1. Query Parser +```typescript +class QueryParser { + async parseQuery(query: string): Promise<{ + intent: QueryIntent; + vector?: number[]; + filters: FilterGroup; + }> { + // Use LLM to understand query + const intent = await this.llm.parseIntent(query); + + // Generate search vector if needed + const vector = needsVectorSearch(intent) + ? await this.getEmbedding(query) + : undefined; + + // Convert intent to filters + const filters = this.intentToFilters(intent); + + return { intent, vector, filters }; + } +} +``` + +### 2. Search Coordinator +```typescript +class SearchCoordinator { + async search( + query: string, + options: SearchOptions + ): Promise { + // Phase 1: Parse query + const { intent, vector, filters } = + await this.parser.parseQuery(query); + + // Phase 2: Property search + const properties = await this.storage.searchProperties({ + vectorSearch: vector ? { vector, minSimilarity: 0.7 } : undefined, + filters, + limit: options.limit + }); + + // Phase 3: Market enrichment + const enriched = await this.market.enrichWithMarketData( + properties, + intent.marketConstraints + ); + + // Final ranking + return this.rankResults(enriched, intent.ranking); + } +} +``` + +## Optimizations + +### 1. Caching +```typescript +class QueryCache { + // Cache parsed intents + intentCache: Map; + + // Cache property results + resultCache: Map; + + // Cache market data + marketCache: Map; +} +``` + +### 2. Parallel Processing +```typescript +async function parallelEnrichment(properties: PropertyData[]) { + const [ + marketData, + priceHistory, + neighborhoodStats + ] = await Promise.all([ + getMarketData(properties), + getPriceHistory(properties), + getNeighborhoodStats(properties) + ]); + + return mergeResults( + properties, + marketData, + priceHistory, + neighborhoodStats + ); +} +``` + +### 3. Smart Batching +```typescript +class MarketDataBatcher { + private queue: PropertyData[] = []; + private batchSize = 50; + private batchDelay = 100; // ms + + async addToBatch(property: PropertyData) { + this.queue.push(property); + if (this.queue.length >= this.batchSize) { + await this.processBatch(); + } + } +} +``` + +## Example Queries + +1. **Location + Market** + ``` + "find cheap beachfront properties in Nexus listed under 5 ETH" + ``` + +2. **Investment Focus** + ``` + "show properties listed below floor price with good location" + ``` + +3. **Analysis** + ``` + "compare property prices between Nexus and Flashing Lights" + ``` + +## Performance Considerations + +1. **Query Understanding** + - Cache common queries + - Batch LLM requests + - Pre-compute embeddings + +2. **Property Search** + - Efficient indexes + - Result pagination + - Early filtering + +3. **Market Data** + - Rate limiting + - Data caching + - Batch requests diff --git a/packages/plugin-unreal/plugin-spreadsheet/design/README.md b/packages/plugin-unreal/plugin-spreadsheet/design/README.md new file mode 100644 index 00000000..2062b0d5 --- /dev/null +++ b/packages/plugin-unreal/plugin-spreadsheet/design/README.md @@ -0,0 +1,39 @@ +# Real Estate Semantic Search Design Documents + +## Overview +This directory contains the design documentation for the Real Estate Semantic Search system. The system combines property search, NFT marketplace integration, and natural language processing to create a powerful property search engine. + +## Document Structure + +### 1. System Architecture +- [`1-system-overview.md`](./1-system-overview.md): High-level system design and components +- [`2-storage-abstraction.md`](./2-storage-abstraction.md): Storage layer design and abstractions +- [`3-query-processing.md`](./3-query-processing.md): Multi-phase query processing system + +### 2. Features +- [`4-nft-integration.md`](./4-nft-integration.md): NFT and marketplace integration +- [`5-cloud-service.md`](./5-cloud-service.md): Cloud database service design + +### 3. Implementation +- [`6-implementation-plan.md`](./6-implementation-plan.md): Phased implementation strategy +- [`7-testing-strategy.md`](./7-testing-strategy.md): Testing and validation approach + +## Key Features + +1. **Semantic Search** + - Natural language understanding + - Vector similarity search + - Metadata filtering + +2. **NFT Integration** + - OpenSea marketplace data + - Price tracking + - Market analysis + +3. **Multi-Phase Query** + - Query understanding + - Property search + - Market data enrichment + +## Getting Started +Start with [`1-system-overview.md`](./1-system-overview.md) for a high-level understanding of the system. diff --git a/packages/plugin-unreal/plugin-spreadsheet/design/cloud_service_design.md b/packages/plugin-unreal/plugin-spreadsheet/design/cloud_service_design.md new file mode 100644 index 00000000..1e8179f9 --- /dev/null +++ b/packages/plugin-unreal/plugin-spreadsheet/design/cloud_service_design.md @@ -0,0 +1,293 @@ +# Real Estate Semantic Search Cloud Service Design + +## System Architecture + +```mermaid +graph TD + A[Eliza Plugin] --> B[API Gateway] + B --> C[Real Estate Service] + C --> D[(Vector DB)] + C --> E[(SQL DB)] + C --> F[LLM Service] +``` + +## 1. Cloud Service Components + +### 1.1 API Gateway +```typescript +// api-gateway.ts +interface RealEstateAPI { + // Semantic Search Endpoints + POST /api/v1/properties/search + body: { + query: string; // Natural language query + filters?: FilterGroup; // Optional structured filters + limit?: number; // Max results + offset?: number; // For pagination + } + response: { + results: Property[]; + totalCount: number; + appliedFilters: FilterGroup; + } + + // Direct Field Query Endpoints + GET /api/v1/properties + params: { + neighborhood?: string[]; + minHeight?: number; + maxHeight?: number; + nearOcean?: boolean; // Within 500m + nearBay?: boolean; // Within 500m + minFloors?: number; + maxFloors?: number; + sortBy?: string; // field name + sortOrder?: 'asc'|'desc'; + } + + // Vector Operations + POST /api/v1/vectors/compute + body: { + text: string; // Property description or query + } + response: { + vector: number[]; // Embedding vector + } +} +``` + +### 1.2 Database Schema +```sql +-- PostgreSQL with pgvector extension + +-- Properties table +CREATE TABLE properties ( + id UUID PRIMARY KEY, + name VARCHAR(255), + neighborhood VARCHAR(100), + zoning_type VARCHAR(50), + plot_size VARCHAR(50), + building_size VARCHAR(50), + max_floors INTEGER, + min_floors INTEGER, + plot_area DECIMAL, + max_building_height DECIMAL, + min_building_height DECIMAL, + ocean_distance_meters DECIMAL, + bay_distance_meters DECIMAL, + description TEXT, + embedding vector(1536), -- For semantic search + created_at TIMESTAMP, + updated_at TIMESTAMP +); + +-- Spatial index for distance queries +CREATE INDEX idx_properties_location +ON properties USING gist ( + point(ocean_distance_meters, bay_distance_meters) +); + +-- Vector index for semantic search +CREATE INDEX idx_properties_embedding +ON properties USING ivfflat (embedding vector_cosine_ops) +WITH (lists = 100); +``` + +### 1.3 Vector Search Implementation +```typescript +// vector-search.ts +class VectorSearchService { + async searchProperties(query: string, filters?: FilterGroup) { + // 1. Get query embedding from LLM service + const queryVector = await this.llmService.getEmbedding(query); + + // 2. Find similar vectors with PostgreSQL + const sql = ` + WITH vector_matches AS ( + SELECT + id, + 1 - (embedding <=> $1) as similarity + FROM properties + WHERE 1 - (embedding <=> $1) > 0.7 -- Similarity threshold + ORDER BY similarity DESC + LIMIT 100 + ) + SELECT p.*, vm.similarity + FROM properties p + JOIN vector_matches vm ON p.id = vm.id + WHERE ${this.buildFilterSQL(filters)} + ORDER BY vm.similarity DESC + LIMIT $2; + `; + + return await this.db.query(sql, [queryVector, 10]); + } + + private buildFilterSQL(filters?: FilterGroup): string { + if (!filters) return "TRUE"; + return this.translateFilters(filters); + } + + private translateFilters(group: FilterGroup): string { + const conditions = group.filters.map(filter => { + if ('operator' in filter) { + return this.translateFilters(filter); + } + return this.translateFilter(filter); + }); + + return `(${conditions.join( + group.operator === 'AND' ? ' AND ' : ' OR ' + )})`; + } +} +``` + +## 2. Eliza Plugin Integration + +### 2.1 Plugin Structure +```typescript +// real-estate-plugin.ts +export const realEstatePlugin: Plugin = { + name: "real-estate", + description: "Search and analyze real estate properties", + actions: [ + { + name: "search-properties", + description: "Search properties using natural language", + parameters: { + query: { type: "string" }, + limit: { type: "number", optional: true } + }, + handler: async (runtime: AgentRuntime, params) => { + const api = new RealEstateAPI(runtime.config.apiKey); + + // Call cloud service + const results = await api.searchProperties({ + query: params.query, + limit: params.limit || 10 + }); + + // Format results for Eliza + return results.map(property => ({ + content: { + text: property.description, + metadata: property + }, + score: property.similarity + })); + } + }, + { + name: "filter-properties", + description: "Find properties by specific criteria", + parameters: { + criteria: { + type: "object", + properties: { + neighborhood: { type: "string", optional: true }, + minHeight: { type: "number", optional: true }, + maxHeight: { type: "number", optional: true }, + // ... other filters + } + } + }, + handler: async (runtime: AgentRuntime, params) => { + const api = new RealEstateAPI(runtime.config.apiKey); + return await api.getProperties(params.criteria); + } + } + ] +}; +``` + +### 2.2 API Client +```typescript +// api-client.ts +class RealEstateAPI { + constructor(private apiKey: string) {} + + async searchProperties(params: SearchParams) { + const response = await fetch( + `${this.baseUrl}/properties/search`, + { + method: 'POST', + headers: { + 'Authorization': `Bearer ${this.apiKey}`, + 'Content-Type': 'application/json' + }, + body: JSON.stringify(params) + } + ); + return await response.json(); + } + + async getProperties(filters: PropertyFilters) { + const queryString = new URLSearchParams( + this.flattenFilters(filters) + ).toString(); + + const response = await fetch( + `${this.baseUrl}/properties?${queryString}`, + { + headers: { + 'Authorization': `Bearer ${this.apiKey}` + } + } + ); + return await response.json(); + } +} +``` + +## 3. Key Features + +### 3.1 Hybrid Search +The system combines: +- Vector similarity (for semantic understanding) +- SQL filters (for precise criteria) +- Spatial queries (for location-based search) + +### 3.2 Performance Optimizations +1. Vector indexing using IVF-Flat +2. Spatial indexing for distance queries +3. Caching common queries +4. Pagination support +5. Parallel query execution + +### 3.3 Scalability Features +1. Read replicas for high query load +2. Vector computation service auto-scaling +3. API rate limiting and quotas +4. Result caching with Redis + +## 4. Example Usage + +```typescript +// Using the Eliza plugin +const results = await runtime.executeAction("real-estate", "search-properties", { + query: "Find tall buildings near the ocean in Nexus", + limit: 5 +}); + +// Direct API usage +const api = new RealEstateAPI(apiKey); +const properties = await api.searchProperties({ + query: "oceanfront property with lots of floors", + filters: { + operator: "AND", + filters: [ + { field: "neighborhood", operator: "$eq", value: "Nexus" }, + { field: "maxFloors", operator: "$gte", value: 100 } + ] + } +}); +``` + +This design provides: +1. ✨ Semantic search via vector embeddings +2. 🎯 Precise filtering via SQL +3. 📍 Location-based queries +4. ⚡ High performance through indexing +5. 🔄 Easy integration with Eliza +6. 📈 Scalability for large datasets diff --git a/packages/plugin-unreal/plugin-spreadsheet/design/dec27/README.md b/packages/plugin-unreal/plugin-spreadsheet/design/dec27/README.md new file mode 100644 index 00000000..5ce5f653 --- /dev/null +++ b/packages/plugin-unreal/plugin-spreadsheet/design/dec27/README.md @@ -0,0 +1,28 @@ +# December 27, 2023 Development Session + +## Overview +Today we're focusing on implementing Phase 1 of the storage abstraction layer, which will serve as the foundation for our NFT real estate search system. + +## Files in this Directory + +- [`plan.md`](./plan.md): Detailed plan for today's development +- [`progress.md`](./progress.md): Real-time progress updates +- [`decisions.md`](./decisions.md): Key technical decisions made today +- [`notes.md`](./notes.md): Development notes and observations + +## Today's Focus Areas + +1. **Storage Interface** + - Core data models + - Operation definitions + - Type safety + +2. **Local Implementation** + - In-memory storage + - Vector operations + - Basic search + +## Getting Started +1. Review [`plan.md`](./plan.md) for today's tasks +2. Check [`decisions.md`](./decisions.md) for design decisions +3. See [`progress.md`](./progress.md) for current status diff --git a/packages/plugin-unreal/plugin-spreadsheet/design/dec27/decisions.md b/packages/plugin-unreal/plugin-spreadsheet/design/dec27/decisions.md new file mode 100644 index 00000000..78be21da --- /dev/null +++ b/packages/plugin-unreal/plugin-spreadsheet/design/dec27/decisions.md @@ -0,0 +1,118 @@ +# Technical Decisions - December 27, 2023 + +## Storage Interface Design + +### 1. Async Operations +**Decision**: All storage operations will be async +```typescript +interface PropertyStorage { + addProperty(property: PropertyData): Promise; +} +``` +**Rationale**: +- Consistent API for local and cloud storage +- Future-proof for network operations +- Better error handling + +### 2. Immutable Data +**Decision**: Properties are immutable; updates create new versions +```typescript +interface PropertyData { + readonly id: string; + readonly version: number; + // ... other fields +} +``` +**Rationale**: +- Easier to track changes +- Better for caching +- Simpler debugging + +### 3. Vector Storage +**Decision**: Store vectors with properties +```typescript +interface StoredProperty extends PropertyData { + vector: number[]; + vectorUpdatedAt: Date; +} +``` +**Rationale**: +- Faster vector operations +- Reduced API calls +- Better data locality + +### 4. Search Options +**Decision**: Flexible search configuration +```typescript +interface SearchOptions { + limit: number; + threshold?: number; + includeMetadata?: boolean; + sortBy?: 'similarity' | 'price' | 'date'; +} +``` +**Rationale**: +- Supports various use cases +- Easy to extend +- Clear defaults + +## Implementation Approach + +### 1. Memory Storage +**Decision**: Use Map for primary storage +```typescript +class ElizaMemoryStorage { + private properties: Map; +} +``` +**Rationale**: +- O(1) lookups +- Built-in key uniqueness +- Easy iteration + +### 2. Vector Operations +**Decision**: Implement basic vector ops in TypeScript +```typescript +function cosineSimilarity(a: number[], b: number[]): number { + // Implementation +} +``` +**Rationale**: +- No external dependencies +- Good enough performance +- Easy to understand + +### 3. Error Handling +**Decision**: Custom error types +```typescript +class StorageError extends Error { + constructor( + message: string, + public code: StorageErrorCode, + public details?: any + ) { + super(message); + } +} +``` +**Rationale**: +- Better error handling +- Clear error messages +- Type safety + +## Open Questions + +1. **Caching Strategy** + - How to handle cache invalidation? + - What's the optimal cache size? + - Should we cache vectors separately? + +2. **Performance Tuning** + - Best batch size for operations? + - When to use indexes? + - How to optimize vector operations? + +3. **Cloud Migration** + - How to handle data migration? + - What's the sync strategy? + - How to maintain consistency? diff --git a/packages/plugin-unreal/plugin-spreadsheet/design/dec27/notes.md b/packages/plugin-unreal/plugin-spreadsheet/design/dec27/notes.md new file mode 100644 index 00000000..9a30595f --- /dev/null +++ b/packages/plugin-unreal/plugin-spreadsheet/design/dec27/notes.md @@ -0,0 +1,126 @@ +# Development Notes - December 27, 2023 + +## Design Considerations + +### Storage Interface +1. **Async Operations** + ```typescript + // Good: Consistent async API + async addProperty(property: PropertyData): Promise + + // Bad: Mixed sync/async + addProperty(property: PropertyData): string + ``` + +2. **Error Handling** + ```typescript + // Good: Specific errors + throw new StorageError('Property not found', 'NOT_FOUND') + + // Bad: Generic errors + throw new Error('Failed') + ``` + +### Vector Operations +1. **Performance** + ```typescript + // Good: Pre-computed norms + class VectorOps { + private norms: Map; + + similarity(a: number[], b: number[]): number { + return dot(a, b) / (this.getNorm(a) * this.getNorm(b)); + } + } + ``` + +2. **Memory Usage** + ```typescript + // Good: Efficient storage + interface StoredProperty { + vector: Float32Array; // More memory efficient + } + + // Bad: Wasteful storage + interface StoredProperty { + vector: number[]; // Less efficient + } + ``` + +## Implementation Ideas + +### 1. Efficient Filtering +```typescript +// Use bitsets for fast filtering +class FilterIndex { + private indexes: Map; + + addProperty(property: PropertyData) { + // Update relevant bitsets + } + + filter(criteria: FilterGroup): BitSet { + // Combine bitsets using AND/OR + } +} +``` + +### 2. Caching Strategy +```typescript +class CacheManager { + private vectorCache: LRUCache; + private resultCache: TTLCache; + + invalidate(propertyId: string) { + // Smart invalidation + this.vectorCache.delete(propertyId); + this.resultCache.clear(); // Could be more selective + } +} +``` + +## Questions & Ideas + +### Performance +1. How to optimize vector operations? + - Use SIMD? + - Batch processing? + - Pre-compute similarities? + +### Scalability +1. How to handle large datasets? + - Pagination strategies + - Incremental updates + - Partial results + +### Testing +1. What to test? + - Vector accuracy + - Search relevance + - Performance benchmarks + +## TODOs + +### High Priority +- [ ] Implement basic vector ops +- [ ] Add property indexing +- [ ] Write core tests + +### Nice to Have +- [ ] Add performance metrics +- [ ] Implement caching +- [ ] Add batch operations + +## Random Thoughts +- Could use LSH for approximate search +- Might need spatial indexing later +- Consider adding property versions + +## References +1. Vector Search Papers: + - "Efficient Similarity Search in High Dimensions" + - "Optimizing In-Memory Vector Operations" + +2. Relevant Libraries: + - `hnswlib-node` for approximate search + - `ndarray` for efficient vector ops diff --git a/packages/plugin-unreal/plugin-spreadsheet/design/dec27/plan.md b/packages/plugin-unreal/plugin-spreadsheet/design/dec27/plan.md new file mode 100644 index 00000000..2e5be352 --- /dev/null +++ b/packages/plugin-unreal/plugin-spreadsheet/design/dec27/plan.md @@ -0,0 +1,102 @@ +# Development Plan - December 27, 2023 + +## Today's Goal +Implement Phase 1 of the storage abstraction layer, focusing on the core interface and local storage implementation. + +## Timeline (Today) + +```mermaid +gantt + title Today's Development Plan + dateFormat HH:mm + axisFormat %H:%M + section Morning + Design Storage Interface :10:00, 1h + Implement Local Storage :11:00, 1h + section Afternoon + Basic Vector Search :13:00, 2h + Testing & Documentation :15:00, 2h +``` + +## Tasks + +### 1. Storage Interface Design (10:00 - 11:00) +- [ ] Define `PropertyStorage` interface +- [ ] Design data models +- [ ] Document interface methods +- [ ] Create type definitions + +### 2. Local Storage Implementation (11:00 - 12:00) +- [ ] Implement `ElizaMemoryStorage` +- [ ] Add basic CRUD operations +- [ ] Implement in-memory indexing +- [ ] Add error handling + +### 3. Vector Search Implementation (13:00 - 15:00) +- [ ] Implement cosine similarity +- [ ] Add vector search method +- [ ] Optimize for performance +- [ ] Add search options + +### 4. Testing & Documentation (15:00 - 17:00) +- [ ] Write unit tests +- [ ] Add usage examples +- [ ] Document performance characteristics +- [ ] Create integration guide + +## Code Milestones + +### 1. Storage Interface +```typescript +interface PropertyStorage { + // Core operations + addProperty(property: PropertyData): Promise; + getProperty(id: string): Promise; + updateProperty(id: string, property: PropertyData): Promise; + deleteProperty(id: string): Promise; + + // Search operations + searchByVector(vector: number[], options: SearchOptions): Promise; + searchByFilters(filters: FilterGroup): Promise; +} +``` + +### 2. Local Implementation +```typescript +class ElizaMemoryStorage implements PropertyStorage { + private properties: Map; + + async searchByVector(vector: number[], options: SearchOptions) { + // Implement vector search + } +} +``` + +## Expected Outcomes + +1. **Working Code** + - Storage interface + - Local implementation + - Basic search functionality + +2. **Documentation** + - Interface documentation + - Usage examples + - Performance notes + +3. **Tests** + - Unit tests + - Integration tests + - Performance benchmarks + +## Next Steps (Tomorrow) +1. Enhance vector search +2. Add metadata filtering +3. Implement batch operations +4. Start cloud storage design + +## Questions to Address +1. How to handle vector similarity threshold? +2. Best approach for in-memory indexing? +3. Optimal batch size for operations? +4. Caching strategy? diff --git a/packages/plugin-unreal/plugin-spreadsheet/design/dec27/progress.md b/packages/plugin-unreal/plugin-spreadsheet/design/dec27/progress.md new file mode 100644 index 00000000..a7831640 --- /dev/null +++ b/packages/plugin-unreal/plugin-spreadsheet/design/dec27/progress.md @@ -0,0 +1,57 @@ +# Progress Tracking - December 27, 2023 + +## Morning Session (10:00 - 12:00) + +### 10:00 - Storage Interface Design +🟡 In Progress +- Defining core interfaces +- Planning data models +- Documenting API + +### 11:00 - Local Implementation +⚪ Not Started +- Basic CRUD operations +- Memory storage implementation +- Error handling + +## Afternoon Session (13:00 - 17:00) + +### 13:00 - Vector Search +⚪ Not Started +- Similarity calculations +- Search implementation +- Performance optimization + +### 15:00 - Testing & Documentation +⚪ Not Started +- Unit tests +- Usage examples +- Performance docs + +## Completed Items ✅ + +### Interfaces +None yet + +### Implementation +None yet + +### Documentation +None yet + +### Tests +None yet + +## Blockers 🚫 +None currently identified + +## Notes 📝 +- Starting with interface design +- Focusing on clean, extensible API +- Planning for future cloud integration + +## Next Steps 👉 +1. Complete interface definitions +2. Start local implementation +3. Add basic vector operations +4. Begin testing framework diff --git a/packages/plugin-unreal/plugin-spreadsheet/design/dec27/temp_memory-integration.md b/packages/plugin-unreal/plugin-spreadsheet/design/dec27/temp_memory-integration.md new file mode 100644 index 00000000..bacbf433 --- /dev/null +++ b/packages/plugin-unreal/plugin-spreadsheet/design/dec27/temp_memory-integration.md @@ -0,0 +1,74 @@ +# Property Memory Integration Implementation + +## Overview +This document outlines the implementation of memory integration for property data in the spreadsheet plugin. The goal is to store property information in Eliza's memory system, enabling semantic search and retrieval of property data. + +## Implementation Details + +### 1. Knowledge Item Structure +Property data is converted into a `KnowledgeItem` with the following structure: + +```typescript +interface KnowledgeItem { + id: string; // UUID generated from property text + content: { + text: string; // Formatted property description + source: string; // "property-data" + metadata: { + propertyId: string; + propertyType: string; + createdAt: string; + } + } +} +``` + +### 2. Text Format +Properties are converted to a standardized text format for embedding: +``` +Property: [name] +Location: [neighborhood] +Type: [zoningType] +Size: [plotSize] ([buildingSize]) +Floors: [minFloors]-[maxFloors] +Height: [minBuildingHeight]-[maxBuildingHeight] feet +Distance to Ocean: [oceanDistanceMeters]m +Distance to Bay: [bayDistanceMeters]m +Description: [description] +Price: [currentPrice] [currency] +``` + +### 3. Memory Storage Process +1. Convert `PropertyData` to formatted text +2. Generate document ID using `stringToUuid` +3. Create `KnowledgeItem` with property metadata +4. Store using `knowledge.set()` + +### 4. Memory Retrieval Process +1. Create a query message with property-related text +2. Use `knowledge.get()` to retrieve relevant memories +3. Process and filter results based on metadata + +## Testing +The implementation includes integration tests that: +1. Create a test property +2. Store it in the memory system +3. Retrieve it using a natural language query +4. Verify the retrieved data matches the original property + +## Dependencies +- OpenAI API for text embeddings +- PostgreSQL database for memory storage +- Eliza core knowledge system + +## Configuration +Required environment variables: +- `POSTGRES_URL`: Database connection string +- `OPENAI_API_KEY`: API key for embeddings +- `EMBEDDING_OPENAI_MODEL`: Set to 'text-embedding-3-small' + +## Future Enhancements +1. Batch processing for multiple properties +2. Enhanced metadata for better filtering +3. Caching layer for frequently accessed properties +4. Custom embedding templates for different property types diff --git a/packages/plugin-unreal/plugin-spreadsheet/design/high_level_design.md b/packages/plugin-unreal/plugin-spreadsheet/design/high_level_design.md new file mode 100644 index 00000000..50f7b895 --- /dev/null +++ b/packages/plugin-unreal/plugin-spreadsheet/design/high_level_design.md @@ -0,0 +1,302 @@ +# Real Estate Semantic Search: High-Level Design + +## Overview + +A flexible and scalable system for semantic property search that supports both local and cloud-based storage while maintaining high performance and extensibility. + +```mermaid +graph TD + A[Eliza Plugin] --> B[Property Search Service] + B --> C[Storage Interface] + C --> D[Local Storage] + C --> E[Cloud Storage] + B --> F[Query Parser] + F --> G[LLM Service] +``` + +## 1. Core Components + +### 1.1 Property Search Service +- Central coordinator for search operations +- Handles query parsing and result ranking +- Manages storage backend selection + +### 1.2 Storage Interface +- Abstract interface for property storage +- Supports vector similarity search +- Handles structured filters + +### 1.3 Query Parser +- Converts natural language to structured queries +- Uses LLM for semantic understanding +- Generates filter groups + +## 2. Data Models + +### 2.1 Property Data +```typescript +interface PropertyData { + id: string; + name: string; + neighborhood: string; + zoningType: string; + plotSize: string; + buildingSize: string; + maxFloors: number; + minFloors: number; + plotArea: number; + maxBuildingHeight: number; + minBuildingHeight: number; + oceanDistanceMeters: number; + bayDistanceMeters: number; + description: string; +} +``` + +### 2.2 Search Models +```typescript +interface SearchOptions { + limit: number; + threshold: number; + includeMetadata: boolean; +} + +interface SearchResult { + property: PropertyData; + similarity: number; + matchedFilters?: string[]; +} + +interface FilterGroup { + operator: 'AND' | 'OR'; + filters: (MetadataFilter | FilterGroup)[]; +} +``` + +## 3. Component Details + +### 3.1 Storage Layer +```typescript +interface PropertyStorage { + // Core operations + addProperty(property: PropertyData): Promise; + getProperty(id: string): Promise; + updateProperty(id: string, property: PropertyData): Promise; + deleteProperty(id: string): Promise; + + // Search operations + searchByVector(vector: number[], options: SearchOptions): Promise; + searchByFilters(filters: FilterGroup): Promise; + + // Batch operations + bulkLoad(properties: PropertyData[]): Promise; +} +``` + +### 3.2 Query Processing +```typescript +interface QueryProcessor { + // Convert natural language to structured query + parseQuery(query: string): Promise<{ + filters: FilterGroup; + vector?: number[]; + metadata?: Record; + }>; + + // Rank and combine results + rankResults( + vectorResults: SearchResult[], + filterResults: SearchResult[] + ): SearchResult[]; +} +``` + +## 4. Implementation Phases + +### Phase 1: Core Infrastructure +- ✅ Define interfaces and data models +- ✅ Implement local storage +- ✅ Basic query parsing +- ✅ Simple ranking system + +### Phase 2: Enhanced Search +- 🔄 Advanced query parsing with LLM +- 🔄 Improved vector similarity +- 🔄 Better result ranking +- 🔄 Performance optimizations + +### Phase 3: Cloud Integration +- ⏳ Cloud storage implementation +- ⏳ API design and implementation +- ⏳ Authentication and security +- ⏳ Scaling considerations + +### Phase 4: Advanced Features +- 📋 Hybrid storage support +- 📋 Real-time updates +- 📋 Caching layer +- 📋 Advanced spatial queries + +## 5. Storage Implementations + +### 5.1 Local Storage (ElizaMemoryStorage) +- In-memory vector storage +- Fast local operations +- Good for development and small datasets + +```typescript +class ElizaMemoryStorage implements PropertyStorage { + private properties: Map; + + async searchByVector(vector: number[], options: SearchOptions) { + return Array.from(this.properties.values()) + .map(prop => ({ + property: prop, + similarity: cosineSimilarity(vector, prop.vector) + })) + .sort((a, b) => b.similarity - a.similarity) + .slice(0, options.limit); + } +} +``` + +### 5.2 Cloud Storage (Future) +- PostgreSQL with pgvector +- REST API interface +- Scalable and distributed + +```typescript +class CloudPropertyStorage implements PropertyStorage { + constructor(private apiClient: RealEstateAPI) {} + + async searchByVector(vector: number[], options: SearchOptions) { + return this.apiClient.searchSimilar({ + vector, + limit: options.limit, + threshold: options.threshold + }); + } +} +``` + +## 6. Query Processing Pipeline + +```mermaid +sequenceDiagram + participant U as User + participant P as Plugin + participant Q as Query Parser + participant S as Storage + participant L as LLM + + U->>P: Natural language query + P->>Q: Parse query + Q->>L: Get semantic understanding + L-->>Q: Structured query + Q->>S: Vector search + Q->>S: Filter search + S-->>P: Combined results + P-->>U: Ranked properties +``` + +## 7. Performance Considerations + +### 7.1 Local Storage +- Vector calculations in memory +- Efficient data structures +- Result caching + +### 7.2 Cloud Storage +- Connection pooling +- Request batching +- Response caching +- Parallel queries + +## 8. Extension Points + +### 8.1 New Storage Backends +- Different vector databases +- Other cloud providers +- Custom implementations + +### 8.2 Enhanced Search Features +- Geographical search +- Time-based queries +- Custom ranking algorithms + +### 8.3 Advanced Functionality +- Real-time updates +- Subscription features +- Analytics and reporting + +## 9. Security Considerations + +### 9.1 Data Protection +- Encryption at rest +- Secure transmission +- Access control + +### 9.2 API Security +- Authentication +- Rate limiting +- Request validation + +## 10. Future Enhancements + +### 10.1 Immediate Term +- Improved query parsing +- Better result ranking +- Performance optimization + +### 10.2 Medium Term +- Cloud storage support +- Advanced filters +- Caching layer + +### 10.3 Long Term +- Real-time updates +- Advanced analytics +- Machine learning features + +## 11. Development Guidelines + +### 11.1 Code Organization +``` +src/ + ├── storage/ + │ ├── interface.ts + │ ├── local.ts + │ └── cloud.ts + ├── query/ + │ ├── parser.ts + │ └── ranking.ts + ├── models/ + │ └── property.ts + └── index.ts +``` + +### 11.2 Testing Strategy +- Unit tests for each component +- Integration tests for storage +- End-to-end search tests +- Performance benchmarks + +### 11.3 Documentation +- Interface documentation +- Implementation guides +- Example usage +- Performance tips + +## 12. Conclusion + +This design provides a flexible foundation that: +- Works well for current needs +- Scales for future growth +- Maintains clean abstractions +- Enables easy extensions + +The phased implementation approach allows for: +- Early value delivery +- Incremental improvements +- Risk management +- Feature prioritization diff --git a/packages/plugin-unreal/plugin-spreadsheet/design/multi_phase_query.md b/packages/plugin-unreal/plugin-spreadsheet/design/multi_phase_query.md new file mode 100644 index 00000000..38aa403b --- /dev/null +++ b/packages/plugin-unreal/plugin-spreadsheet/design/multi_phase_query.md @@ -0,0 +1,251 @@ +# Multi-Phase Property Search Design + +## Query Flow + +```mermaid +sequenceDiagram + participant U as User + participant E as Eliza + participant C as Cloud DB + participant O as OpenSea + + U->>E: "find cheap beachfront properties in Nexus listed under 5 ETH" + + %% Phase 1: Local Understanding + E->>E: Parse query intent + Note over E: Identifies:
- Location (Nexus)
- Feature (beachfront)
- Price constraint (<5 ETH)
- Market status (listed) + + %% Phase 2: Property Search + E->>C: Vector search + filters + C->>C: Search properties + C-->>E: Candidate properties + + %% Phase 3: Market Check + E->>O: Check listings + O-->>E: Market data + + E->>E: Rank results + E-->>U: Final results +``` + +## Phase Details + +### Phase 1: Query Understanding 🧠 +```typescript +interface QueryIntent { + propertyFeatures: { + location?: string[]; + amenities?: string[]; + proximity?: Array<{ + to: string; + distance: number; + }>; + }; + marketConstraints: { + maxPrice?: number; + currency?: string; + mustBeListed?: boolean; + priceComparison?: 'below_floor' | 'below_average'; + }; + ranking: { + primarySort: 'price' | 'similarity' | 'distance'; + order: 'asc' | 'desc'; + }; +} + +// Example parsed query +const intent: QueryIntent = { + propertyFeatures: { + location: ['Nexus'], + proximity: [{ to: 'beach', distance: 500 }] + }, + marketConstraints: { + maxPrice: 5, + currency: 'ETH', + mustBeListed: true + }, + ranking: { + primarySort: 'price', + order: 'asc' + } +}; +``` + +### Phase 2: Property Search 🏠 +```typescript +interface PropertyQuery { + // Vector similarity + vectorSearch?: { + embedding: number[]; + minSimilarity: number; + }; + + // Metadata filters + filters: FilterGroup; + + // Result size + limit: number; + offset: number; +} + +// Cloud DB API +class CloudPropertyService { + async searchProperties(query: PropertyQuery): Promise<{ + properties: PropertyData[]; + total: number; + neighborhoods: string[]; // For faceted search + priceRange: {min: number; max: number}; + }> { + // Efficient DB query using indexes + // Returns enriched property data + } +} +``` + +### Phase 3: Market Integration 💰 +```typescript +interface MarketQuery { + properties: Array<{ + tokenId: string; + contractAddress: string; + }>; + constraints: { + maxPrice?: number; + listedOnly: boolean; + }; +} + +class MarketService { + async enrichWithMarketData( + properties: PropertyData[], + constraints: MarketQuery['constraints'] + ): Promise> { + // Parallel OpenSea API calls + // Enrich with market data + } +} +``` + +## Example Flow + +```typescript +async function searchProperties( + query: string, + options: SearchOptions +): Promise { + // Phase 1: Parse Query + const intent = await elizaLLM.parseIntent(query); + + // Phase 2: Property Search + const propertyResults = await cloudDB.searchProperties({ + vectorSearch: { + embedding: await getEmbedding(query), + minSimilarity: 0.7 + }, + filters: translateIntentToFilters(intent) + }); + + // Phase 3: Market Check + const enrichedResults = await marketService.enrichWithMarketData( + propertyResults.properties, + intent.marketConstraints + ); + + // Final Ranking + return rankResults(enrichedResults, intent.ranking); +} +``` + +## Benefits + +1. **Efficient Processing** ⚡ + - Each phase optimized for its task + - Parallel processing where possible + - Early filtering reduces load + +2. **Rich Context** 🎯 + - Property features + - Market status + - Price analysis + +3. **Flexible Architecture** 🔄 + - Easy to add new data sources + - Can cache at each phase + - Fallback options + +## Example Queries + +```typescript +// Complex market + property query +"find properties listed below floor price within 500m of the beach" + +// Price trend analysis +"show me properties in Nexus where prices are trending up" + +// Investment opportunities +"find undervalued beachfront properties with good price history" +``` + +## Performance Optimizations + +1. **Caching Strategy** 📦 +```typescript +class QueryCache { + // Cache property results (short TTL) + propertyCache: Map; + + // Cache market data (very short TTL) + marketCache: Map; + + // Cache neighborhood stats (longer TTL) + statsCache: Map; +} +``` + +2. **Parallel Processing** ⚡ +```typescript +async function parallelEnrichment(properties: PropertyData[]) { + const [ + marketData, + priceHistory, + neighborhoodStats + ] = await Promise.all([ + getMarketData(properties), + getPriceHistory(properties), + getNeighborhoodStats(properties) + ]); + + return mergeResults( + properties, + marketData, + priceHistory, + neighborhoodStats + ); +} +``` + +3. **Smart Batching** 🔄 +```typescript +class MarketDataBatcher { + private queue: PropertyData[] = []; + private batchSize = 50; + private batchDelay = 100; // ms + + async addToBatch(property: PropertyData) { + this.queue.push(property); + if (this.queue.length >= this.batchSize) { + await this.processBatch(); + } + } +} +``` + +This multi-phase approach gives us: +1. 🎯 More accurate results +2. 💰 Real-time market data +3. 📊 Rich analysis +4. ⚡ Better performance +5. 🔄 Flexible architecture diff --git a/packages/plugin-unreal/plugin-spreadsheet/design/nft_integration.md b/packages/plugin-unreal/plugin-spreadsheet/design/nft_integration.md new file mode 100644 index 00000000..10d882e5 --- /dev/null +++ b/packages/plugin-unreal/plugin-spreadsheet/design/nft_integration.md @@ -0,0 +1,241 @@ +# NFT Property Integration Design + +## Overview + +Enhance the real estate semantic search with NFT marketplace integration, allowing users to find properties and view their market status. + +```mermaid +graph TD + A[Eliza Plugin] --> B[Property Search Service] + B --> C[Storage Interface] + B --> D[NFT Market Service] + D --> E[OpenSea API] + D --> F[Other Markets] +``` + +## 1. Enhanced Data Model + +```typescript +interface NFTMetadata { + tokenId: string; + contractAddress: string; + blockchain: 'ethereum' | 'polygon'; + lastSalePrice?: number; + lastSaleDate?: Date; +} + +interface MarketStatus { + isListed: boolean; + currentPrice?: number; + currency?: string; + marketplace: 'opensea' | 'other'; + listingUrl?: string; + lastUpdated: Date; +} + +interface PropertyData { + // ... existing fields ... + nft: NFTMetadata; + market?: MarketStatus; +} +``` + +## 2. OpenSea Integration + +### 2.1 Market Data Fetching +```typescript +class OpenSeaService { + async getListingStatus(nft: NFTMetadata): Promise { + const asset = await this.api.getAsset({ + tokenAddress: nft.contractAddress, + tokenId: nft.tokenId + }); + + return { + isListed: asset.sellOrders?.length > 0, + currentPrice: asset.sellOrders?.[0]?.currentPrice, + currency: asset.sellOrders?.[0]?.paymentToken, + marketplace: 'opensea', + listingUrl: asset.permalink, + lastUpdated: new Date() + }; + } + + async getFloorPrice(contractAddress: string): Promise { + const collection = await this.api.getCollection(contractAddress); + return collection.stats.floorPrice; + } +} +``` + +### 2.2 Enhanced Search Features +```typescript +interface NFTSearchOptions extends SearchOptions { + onlyListed?: boolean; + maxPrice?: number; + minPrice?: number; + sortByPrice?: 'asc' | 'desc'; +} + +interface PropertyStorage { + // ... existing methods ... + searchByMarketStatus( + options: NFTSearchOptions + ): Promise; +} +``` + +## 3. Example Queries + +```typescript +// Find listed properties near the ocean +const results = await propertySearch.search({ + query: "oceanfront property", + marketOptions: { + onlyListed: true, + sortByPrice: 'asc' + } +}); + +// Get floor price history +const trends = await marketService.getPriceHistory({ + neighborhood: "Nexus", + timeRange: "30d" +}); +``` + +## 4. Natural Language Integration + +```typescript +// Enhanced query parsing +const query = "find cheap listed properties in Nexus under 5 ETH"; + +const parsed = { + filters: { + operator: "AND", + filters: [ + { field: "neighborhood", operator: "$eq", value: "Nexus" }, + { field: "market.isListed", operator: "$eq", value: true }, + { field: "market.currentPrice", operator: "$lt", value: 5 } + ] + } +}; +``` + +## 5. Example Response + +```typescript +{ + property: { + name: "NX-1", + neighborhood: "Nexus", + // ... other property data ... + nft: { + tokenId: "1234", + contractAddress: "0x..." + }, + market: { + isListed: true, + currentPrice: 3.5, + currency: "ETH", + listingUrl: "https://opensea.io/assets/...", + lastUpdated: "2024-12-27T10:27:26Z" + } + }, + similarity: 0.92, + marketAnalysis: { + comparedToFloor: "+10%", + priceHistory: [ + { date: "2024-11-27", price: 3.2 }, + { date: "2024-12-27", price: 3.5 } + ] + } +} +``` + +## 6. New Search Capabilities + +Users can now search by: +- Current listing status +- Price range +- Recent sales +- Price trends +- Floor price comparison + +Example queries: +```typescript +"find properties listed below floor price" +"show me the cheapest oceanfront properties for sale" +"what's for sale in Nexus with good price history?" +``` + +## 7. Market Analysis Features + +```typescript +interface MarketAnalysis { + // Price trends + getPriceHistory(options: { + neighborhood?: string; + propertyType?: string; + timeRange: string; + }): Promise; + + // Market activity + getMarketActivity(options: { + timeRange: string; + metric: 'sales' | 'listings' | 'volume'; + }): Promise; + + // Neighborhood comparison + compareNeighborhoods(options: { + neighborhoods: string[]; + metrics: ('price' | 'volume' | 'activity')[]; + }): Promise; +} +``` + +## 8. Implementation Strategy + +### Phase 1: Basic Integration +- ✅ Add NFT metadata to properties +- ✅ Basic OpenSea API integration +- ✅ Simple listing status checks + +### Phase 2: Enhanced Search +- 🔄 Price-based filtering +- 🔄 Market status in search results +- 🔄 Natural language understanding for market terms + +### Phase 3: Market Analysis +- ⏳ Historical price tracking +- ⏳ Market trends analysis +- ⏳ Neighborhood comparisons + +### Phase 4: Advanced Features +- 📋 Price predictions +- 📋 Investment recommendations +- 📋 Market alerts + +## 9. Example Use Cases + +1. **Value Hunters** + ```typescript + "find properties listed below neighborhood average" + ``` + +2. **Market Watchers** + ```typescript + "show me properties with increasing price trend" + ``` + +3. **Location Focused** + ```typescript + "oceanfront properties in Nexus listed under 10 ETH" + ``` + +4. **Investment Analysis** + ```typescript + "compare property prices between Nexus and Flashing Lights" + ``` + +This integration would make the search system much more powerful for NFT property trading, allowing users to combine location and property features with market data for better decision-making. diff --git a/packages/plugin-unreal/plugin-spreadsheet/design/storage_abstraction.md b/packages/plugin-unreal/plugin-spreadsheet/design/storage_abstraction.md new file mode 100644 index 00000000..f164ba6c --- /dev/null +++ b/packages/plugin-unreal/plugin-spreadsheet/design/storage_abstraction.md @@ -0,0 +1,199 @@ +# Storage Abstraction Design + +## Core Interfaces + +```typescript +// Base interface for all property operations +interface PropertyStorage { + // Basic CRUD + addProperty(property: PropertyData): Promise; // Returns ID + getProperty(id: string): Promise; + updateProperty(id: string, property: PropertyData): Promise; + deleteProperty(id: string): Promise; + + // Search operations + searchByVector(vector: number[], options: SearchOptions): Promise; + searchByFilters(filters: FilterGroup): Promise; + + // Batch operations + bulkLoad(properties: PropertyData[]): Promise; +} + +// Current in-memory implementation +class ElizaMemoryStorage implements PropertyStorage { + private properties: Map; + + async searchByVector(vector: number[], options: SearchOptions): Promise { + // Current Eliza implementation + return Array.from(this.properties.values()) + .map(prop => ({ + property: prop, + similarity: cosineSimilarity(vector, prop.vector) + })) + .sort((a, b) => b.similarity - a.similarity) + .slice(0, options.limit); + } + + async searchByFilters(filters: FilterGroup): Promise { + // Current filter implementation + return Array.from(this.properties.values()) + .filter(prop => applyFilterGroup(prop, filters)); + } +} + +// Future cloud implementation +class CloudPropertyStorage implements PropertyStorage { + constructor(private apiClient: RealEstateAPI) {} + + async searchByVector(vector: number[], options: SearchOptions): Promise { + return this.apiClient.searchSimilar({ + vector, + limit: options.limit, + threshold: options.threshold + }); + } + + async searchByFilters(filters: FilterGroup): Promise { + return this.apiClient.queryProperties(filters); + } +} +``` + +## Plugin Using Abstraction + +```typescript +export const spreadsheetPlugin: Plugin = { + name: "spreadsheet", + description: "Load and query spreadsheet data using semantic search", + actions: [ + { + name: "load-spreadsheet", + handler: async (runtime: AgentRuntime, params) => { + // Get storage implementation from runtime + const storage = runtime.getPropertyStorage(); + + // Parse and load data + const properties = parseCSV(params.content); + await storage.bulkLoad(properties); + } + }, + { + name: "query-spreadsheet", + handler: async (runtime: AgentRuntime, params) => { + const storage = runtime.getPropertyStorage(); + + // 1. Get query vector + const queryVector = await runtime.getEmbedding(params.query); + + // 2. Get filter structure + const filters = await parseQueryToFilters(runtime, params.query); + + // 3. Search in two stages + const vectorMatches = await storage.searchByVector(queryVector, { + limit: params.limit * 3, + threshold: 0.6 + }); + + const filteredResults = await storage.searchByFilters(filters); + + // 4. Combine and rank results + return rankResults(vectorMatches, filteredResults); + } + } + ] +}; +``` + +## Runtime Configuration + +```typescript +// In Eliza's runtime configuration +interface AgentRuntime { + // Add storage factory method + getPropertyStorage(): PropertyStorage; +} + +// Configure storage implementation +const runtime = new AgentRuntime({ + propertyStorage: process.env.STORAGE_TYPE === 'cloud' + ? new CloudPropertyStorage(new RealEstateAPI(apiKey)) + : new ElizaMemoryStorage() +}); +``` + +## Benefits of This Design + +1. **Separation of Concerns** 🎯 + - Storage logic separate from search logic + - Easy to test different implementations + - Clean interface boundaries + +2. **Future Flexibility** 🔄 + - Can add new storage backends + - Switch implementations without changing plugin + - Support multiple storage types + +3. **Gradual Migration Path** 📈 + ```typescript + // Could even do hybrid storage + class HybridStorage implements PropertyStorage { + constructor( + private local: ElizaMemoryStorage, + private cloud: CloudPropertyStorage, + private options: { + writeToCloud: boolean, + readPreference: 'local' | 'cloud' | 'both' + } + ) {} + + async searchByVector(vector: number[], options: SearchOptions) { + if (this.options.readPreference === 'both') { + // Merge results from both sources + const [localResults, cloudResults] = await Promise.all([ + this.local.searchByVector(vector, options), + this.cloud.searchByVector(vector, options) + ]); + return mergeResults(localResults, cloudResults); + } + // Use preferred storage + return this.options.readPreference === 'local' + ? this.local.searchByVector(vector, options) + : this.cloud.searchByVector(vector, options); + } + } + ``` + +4. **Easy Testing** 🧪 + ```typescript + // Can create mock storage for tests + class MockPropertyStorage implements PropertyStorage { + async searchByVector() { + return TEST_RESULTS; + } + // ... other methods + } + ``` + +## Implementation Strategy + +1. **Phase 1: Interface Definition** + - Define core interfaces + - Document expected behaviors + - Create basic tests + +2. **Phase 2: Current Implementation** + - Wrap current code in ElizaMemoryStorage + - Ensure all tests pass + - No functionality changes + +3. **Phase 3: New Features** + - Add cloud implementation + - Add configuration options + - Maintain backward compatibility + +4. **Phase 4: Optimization** + - Add caching layer + - Implement hybrid storage + - Performance tuning + +This design maintains all current functionality while making it easy to add cloud storage or other implementations in the future. diff --git a/packages/plugin-unreal/plugin-spreadsheet/design/unrealAgent2/1-current-state.md b/packages/plugin-unreal/plugin-spreadsheet/design/unrealAgent2/1-current-state.md new file mode 100644 index 00000000..cab657fe --- /dev/null +++ b/packages/plugin-unreal/plugin-spreadsheet/design/unrealAgent2/1-current-state.md @@ -0,0 +1,90 @@ +# UnrealAgent2 - Current Implementation State + +## Existing Components + +### 1. Memory Integration Tests +Located in: `src/tests/memory-integration.test.ts` + +Key Features: +- Tests knowledge retrieval functionality +- Tests embedding generation +- Validates vector search capabilities +- Includes debug logging for query results + +### 2. Memory Manager Integration +Core functionality: +- Uses `@ai16z/adapter-postgres` for database operations +- Implements knowledge.get() and knowledge.set() +- Handles vector embeddings via OpenAI +- Manages table-specific operations + +### 3. Core Interfaces + +```typescript +// Current knowledge management interface +interface IMemoryManager { + get(id: string): Promise; + set(memory: Memory): Promise; + searchMemoriesByEmbedding(query: string, options: SearchOptions): Promise; +} + +// Memory data structure +interface Memory { + id: string; + content: string; + metadata?: Record; + embedding?: number[]; +} +``` + +## Integration Points + +1. **Database Layer** + - PostgreSQL with vector extension + - Connection pooling + - Table-specific operations + +2. **Embedding Generation** + - OpenAI API integration + - Model: text-embedding-3-small + - 1536-dimensional vectors + +3. **Search Capabilities** + - Vector similarity search + - Metadata filtering + - Hybrid search options + +## Current Limitations + +1. **Storage Abstraction** + - Limited to PostgreSQL + - No clear separation between storage and business logic + - Missing interface for different storage backends + +2. **Query Processing** + - Basic text-to-vector conversion + - No structured query parsing + - Limited filter options + +3. **Testing Coverage** + - Focused on memory operations + - Missing high-level service tests + - Limited error case coverage + +## Next Steps + +1. **Interface Definition** + - Define clear storage abstraction + - Separate business logic from storage + - Create proper type hierarchy + +2. **Testing Strategy** + - Define test hierarchy + - Create mock storage implementation + - Add comprehensive test cases + +3. **Implementation Plan** + - Start with storage interface + - Add local implementation + - Implement test suite + - Migrate existing functionality diff --git a/packages/plugin-unreal/plugin-spreadsheet/design/unrealAgent2/2-storage-design.md b/packages/plugin-unreal/plugin-spreadsheet/design/unrealAgent2/2-storage-design.md new file mode 100644 index 00000000..989cfa19 --- /dev/null +++ b/packages/plugin-unreal/plugin-spreadsheet/design/unrealAgent2/2-storage-design.md @@ -0,0 +1,133 @@ +# UnrealAgent2 - Storage Design + +## Storage Interface + +### Core Interface +```typescript +interface PropertyStorage { + // Core operations + get(id: string): Promise; + set(property: PropertyData): Promise; + delete(id: string): Promise; + + // Search operations + searchByEmbedding(query: string, options: SearchOptions): Promise; + searchByFilter(filter: FilterCriteria): Promise; + + // Batch operations + bulkSet(properties: PropertyData[]): Promise; + bulkGet(ids: string[]): Promise>; +} +``` + +### Data Models + +```typescript +interface PropertyData { + id: string; + content: string; + metadata: PropertyMetadata; + embedding?: number[]; +} + +interface PropertyMetadata { + type: 'property' | 'listing' | 'sale'; + createdAt: Date; + updatedAt: Date; + version: number; + tags: string[]; + custom: Record; +} + +interface SearchOptions { + limit?: number; + offset?: number; + includeEmbeddings?: boolean; + minSimilarity?: number; + orderBy?: 'similarity' | 'createdAt' | 'updatedAt'; + orderDirection?: 'asc' | 'desc'; +} + +interface SearchResult { + property: PropertyData; + similarity?: number; + score?: number; +} + +interface FilterCriteria { + metadata?: Partial; + tags?: string[]; + custom?: Record; + dateRange?: { + start?: Date; + end?: Date; + field: 'createdAt' | 'updatedAt'; + }; +} +``` + +## Implementation Strategy + +### 1. PostgreSQL Implementation +```typescript +class PostgresPropertyStorage implements PropertyStorage { + constructor(private db: PostgresDatabaseAdapter) {} + + async searchByEmbedding(query: string, options: SearchOptions): Promise { + const embedding = await embed(query); + return this.db.queryVectorSimilarity(embedding, options); + } +} +``` + +### 2. In-Memory Implementation (for Testing) +```typescript +class InMemoryPropertyStorage implements PropertyStorage { + private store: Map = new Map(); + + async searchByEmbedding(query: string, options: SearchOptions): Promise { + const embedding = await embed(query); + return Array.from(this.store.values()) + .map(property => ({ + property, + similarity: cosineSimilarity(embedding, property.embedding!) + })) + .sort((a, b) => b.similarity! - a.similarity!) + .slice(0, options.limit); + } +} +``` + +## Migration Plan + +1. **Phase 1: Basic Interface** + - Implement core CRUD operations + - Add basic search functionality + - Create in-memory implementation + +2. **Phase 2: Advanced Features** + - Add batch operations + - Implement filtering + - Add sorting options + +3. **Phase 3: Optimization** + - Add caching layer + - Implement connection pooling + - Add query optimization + +## Testing Strategy + +1. **Unit Tests** + - Test each operation independently + - Verify error handling + - Test edge cases + +2. **Integration Tests** + - Test with real database + - Verify search accuracy + - Test performance + +3. **Performance Tests** + - Measure operation latency + - Test with large datasets + - Verify memory usage diff --git a/packages/plugin-unreal/plugin-spreadsheet/design/unrealAgent2/3-implementation-plan.md b/packages/plugin-unreal/plugin-spreadsheet/design/unrealAgent2/3-implementation-plan.md new file mode 100644 index 00000000..036c92c9 --- /dev/null +++ b/packages/plugin-unreal/plugin-spreadsheet/design/unrealAgent2/3-implementation-plan.md @@ -0,0 +1,156 @@ +# UnrealAgent2 - Implementation Plan + +## Phase 1: Core Infrastructure + +### Week 1: Storage Layer +1. **Day 1-2: Interface Implementation** + - Create PropertyStorage interface + - Implement in-memory storage + - Add basic tests + +2. **Day 3-4: PostgreSQL Integration** + - Implement PostgreSQL storage + - Add vector search + - Test database operations + +3. **Day 5: Testing & Documentation** + - Complete test coverage + - Document interfaces + - Add usage examples + +### Week 2: Search Features +1. **Day 1-2: Vector Search** + - Implement embedding generation + - Add similarity search + - Test search accuracy + +2. **Day 3-4: Filter Implementation** + - Add metadata filters + - Implement tag search + - Add date range filtering + +3. **Day 5: Performance Testing** + - Benchmark operations + - Optimize queries + - Document performance + +## Detailed Task Breakdown + +### 1. Storage Interface Implementation +```typescript +// Day 1 +- [ ] Create PropertyStorage interface +- [ ] Define data models +- [ ] Add type definitions + +// Day 2 +- [ ] Implement InMemoryStorage +- [ ] Add basic CRUD tests +- [ ] Implement error handling +``` + +### 2. PostgreSQL Implementation +```typescript +// Day 3 +- [ ] Set up PostgreSQL tables +- [ ] Implement CRUD operations +- [ ] Add connection pooling + +// Day 4 +- [ ] Add vector operations +- [ ] Implement search +- [ ] Test database functions +``` + +### 3. Search Implementation +```typescript +// Week 2, Day 1 +- [ ] Add embedding generation +- [ ] Implement vector search +- [ ] Test similarity functions + +// Week 2, Day 2 +- [ ] Add filter parsing +- [ ] Implement combined search +- [ ] Test search accuracy +``` + +## Testing Strategy + +### 1. Unit Tests +```typescript +describe('PropertyStorage', () => { + describe('Core Operations', () => { + it('should store and retrieve property'); + it('should handle updates correctly'); + it('should delete properties'); + }); + + describe('Search Operations', () => { + it('should find similar properties'); + it('should filter by metadata'); + it('should handle empty results'); + }); +}); +``` + +### 2. Integration Tests +```typescript +describe('PostgresPropertyStorage', () => { + describe('Database Operations', () => { + it('should handle concurrent operations'); + it('should maintain ACID properties'); + it('should recover from errors'); + }); +}); +``` + +## Success Criteria + +1. **Functionality** + - All interface methods implemented + - Error handling in place + - Type safety maintained + +2. **Performance** + - Sub-100ms for basic operations + - Sub-500ms for search operations + - Efficient memory usage + +3. **Quality** + - 90%+ test coverage + - No type errors + - Clear documentation + +## Dependencies + +1. **Required Packages** + ```json + { + "@ai16z/eliza": "latest", + "@ai16z/adapter-postgres": "latest", + "openai": "^4.0.0" + } + ``` + +2. **Development Tools** + - TypeScript 5.x + - Vitest + - PostgreSQL 15+ + +## Next Steps + +1. **Begin Implementation** + - Start with interface definition + - Create test framework + - Implement storage layer + +2. **Review Points** + - Interface design review + - Test coverage review + - Performance review + +3. **Documentation** + - API documentation + - Usage examples + - Performance guidelines diff --git a/packages/plugin-unreal/plugin-spreadsheet/design/unrealAgent2/implementation-plan.md b/packages/plugin-unreal/plugin-spreadsheet/design/unrealAgent2/implementation-plan.md new file mode 100644 index 00000000..e609c2e0 --- /dev/null +++ b/packages/plugin-unreal/plugin-spreadsheet/design/unrealAgent2/implementation-plan.md @@ -0,0 +1,171 @@ +# UnrealAgent2 Implementation Plan + +## Current Foundation + +We have a solid foundation with well-defined interfaces and types: + +1. **Core Interfaces** + - `PropertyStorage`: Core storage operations interface + - `BasePropertyStorage`: Abstract base class for implementations + - `PropertyStorageService`: Service layer implementation + +2. **Data Models** + - `PropertyData`: Core property data structure + - `NFTMetadata`: NFT-specific information + - `MarketStatus`: Real-time market data + - `SearchOptions` & `SearchResult`: Search functionality + - `FilterGroup` & `MetadataFilter`: Filtering system + +## Implementation Strategy + +### Phase 1: Test Infrastructure (Week 1) + +1. **Memory Integration Tests** +```typescript +describe('Memory Integration', () => { + // Test existing memory manager integration + it('should store and retrieve knowledge'); + it('should handle vector embeddings'); + it('should perform similarity search'); +}); +``` + +2. **Storage Interface Tests** +```typescript +describe('PropertyStorage Interface', () => { + // Test against BasePropertyStorage implementation + it('should implement all required methods'); + it('should handle property validation'); + it('should manage vector operations'); +}); +``` + +3. **Service Layer Tests** +```typescript +describe('PropertyStorageService', () => { + // Test service functionality + it('should initialize with storage backend'); + it('should proxy storage operations'); + it('should handle errors properly'); +}); +``` + +### Phase 2: UnrealAgent2 Integration (Week 2) + +1. **Core Agent Tests** +```typescript +describe('UnrealAgent2', () => { + // Test agent initialization + it('should initialize with proper configuration'); + it('should connect to storage service'); + it('should handle embedding generation'); +}); +``` + +2. **Query Processing Tests** +```typescript +describe('Query Processing', () => { + // Test natural language handling + it('should parse property queries'); + it('should extract search parameters'); + it('should generate embeddings'); +}); +``` + +3. **Market Integration Tests** +```typescript +describe('Market Integration', () => { + // Test NFT market features + it('should fetch market status'); + it('should update property listings'); + it('should track price changes'); +}); +``` + +## Implementation Steps + +### Week 1: Core Infrastructure + +#### Day 1-2: Memory Integration +1. Create `memory-integration.test2.ts` +2. Test knowledge storage operations +3. Validate embedding functionality +4. Test search capabilities + +#### Day 3-4: Storage Interface +1. Create `property-storage.test.ts` +2. Test CRUD operations +3. Test search operations +4. Test bulk operations + +#### Day 5: Service Layer +1. Create `property-service.test.ts` +2. Test service initialization +3. Test operation proxying +4. Test error handling + +### Week 2: UnrealAgent2 Features + +#### Day 1-2: Agent Core +1. Create `unreal-agent2.test.ts` +2. Test configuration management +3. Test service integration +4. Test embedding operations + +#### Day 3-4: Query Features +1. Create `query-processing.test.ts` +2. Test natural language parsing +3. Test parameter extraction +4. Test search execution + +#### Day 5: Market Features +1. Create `market-integration.test.ts` +2. Test NFT data fetching +3. Test market updates +4. Test price tracking + +## Test Structure + +``` +tests/ +├── memory-integration.test2.ts # Enhanced memory tests +├── property-storage.test.ts # Storage interface tests +├── property-service.test.ts # Service layer tests +├── unreal-agent2.test.ts # Agent core tests +├── query-processing.test.ts # Query handling tests +└── market-integration.test.ts # Market feature tests +``` + +## Success Criteria + +1. **Test Coverage** + - All interfaces fully tested + - Edge cases covered + - Error scenarios handled + +2. **Integration Points** + - Memory manager integration verified + - Storage service properly tested + - Market integration validated + +3. **Performance Metrics** + - Search response times + - Embedding generation speed + - Market data latency + +## Next Steps + +1. Begin with `memory-integration.test2.ts` + - Build on existing test patterns + - Add new test cases + - Improve error coverage + +2. Proceed with storage interface tests + - Validate interface compliance + - Test edge cases + - Verify error handling + +3. Move to service layer tests + - Test initialization + - Verify operations + - Check error propagation diff --git a/packages/plugin-unreal/plugin-spreadsheet/design/unrealAgent2/implementation-plan.pdf b/packages/plugin-unreal/plugin-spreadsheet/design/unrealAgent2/implementation-plan.pdf new file mode 100644 index 00000000..a8e6a443 Binary files /dev/null and b/packages/plugin-unreal/plugin-spreadsheet/design/unrealAgent2/implementation-plan.pdf differ diff --git a/packages/plugin-unreal/plugin-spreadsheet/design/whitepaper.html b/packages/plugin-unreal/plugin-spreadsheet/design/whitepaper.html new file mode 100644 index 00000000..1a8599b8 --- /dev/null +++ b/packages/plugin-unreal/plugin-spreadsheet/design/whitepaper.html @@ -0,0 +1,642 @@ + + + +whitepaper.md + + + + + + + + + + + + +

NFT Real Estate Semantic Search: A Multi-Phase Query System

+

Abstract

+

We present a novel approach to NFT real estate search that combines semantic understanding, vector similarity, and real-time market data. Our system integrates natural language processing with blockchain market data to provide an intuitive yet powerful property search experience. The architecture supports both local and cloud-based deployments, enabling scalability while maintaining development flexibility.

+

1. Introduction

+

The intersection of real estate and blockchain technology has created new opportunities and challenges in property search and valuation. Traditional search methods often fail to capture the nuanced requirements of users or incorporate real-time market dynamics. Our system addresses these limitations through a multi-phase query approach that combines semantic understanding with market intelligence.

+

1.1 Key Innovations

+
    +
  • Multi-phase query processing
  • +
  • Real-time NFT market integration
  • +
  • Flexible storage architecture
  • +
  • Natural language understanding
  • +
  • Hybrid search capabilities
  • +
+

2. Implementation Strategy

+

Our development approach emphasizes iterative progress and continuous validation:

+

2.1 Phase 1: Core Search Infrastructure (Weeks 1-4)

+
gantt + title Phase 1: Core Infrastructure + dateFormat YYYY-MM-DD + section Storage + Interface Design :a1, 2024-01-01, 1w + Local Implementation :a2, after a1, 1w + section Search + Basic Vector Search :a3, after a2, 1w + Filter Implementation :a4, after a3, 1w +
+
    +
  1. +

    Week 1: Storage Interface

    +
    interface PropertyStorage { + addProperty(property: PropertyData): Promise<string>; + searchByVector(vector: number[], options: SearchOptions): Promise<SearchResult[]>; + searchByFilters(filters: FilterGroup): Promise<SearchResult[]>; +} +
    +
  2. +
  3. +

    Week 2: Local Storage

    +
      +
    • In-memory implementation
    • +
    • Basic vector operations
    • +
    • Simple filtering
    • +
    +
  4. +
  5. +

    Week 3: Vector Search

    +
      +
    • Embedding generation
    • +
    • Similarity calculations
    • +
    • Result ranking
    • +
    +
  6. +
  7. +

    Week 4: Filtering

    +
      +
    • Metadata filters
    • +
    • Combined search
    • +
    • Result pagination
    • +
    +
  8. +
+

2.2 Phase 2: Natural Language Processing (Weeks 5-8)

+
gantt + title Phase 2: NLP Integration + dateFormat YYYY-MM-DD + section Query + Intent Parsing :b1, 2024-02-01, 1w + Filter Generation :b2, after b1, 1w + section Integration + Multi-phase Query :b3, after b2, 1w + Result Ranking :b4, after b3, 1w +
+
    +
  1. +

    Week 5: Query Understanding

    +
    interface QueryIntent { + propertyFeatures: { + location?: string[]; + amenities?: string[]; + proximity?: Array<{to: string; distance: number}>; + }; + marketConstraints?: { + maxPrice?: number; + mustBeListed?: boolean; + }; +} +
    +
  2. +
  3. +

    Week 6: Filter Generation

    +
      +
    • Convert intents to filters
    • +
    • Handle complex queries
    • +
    • Validation rules
    • +
    +
  4. +
  5. +

    Week 7: Multi-phase Integration

    +
      +
    • Query pipeline
    • +
    • Result merging
    • +
    • Performance optimization
    • +
    +
  6. +
  7. +

    Week 8: Result Ranking

    +
      +
    • Scoring algorithms
    • +
    • Relevance tuning
    • +
    • User feedback integration
    • +
    +
  8. +
+

2.3 Phase 3: Market Integration (Weeks 9-12)

+
gantt + title Phase 3: NFT Integration + dateFormat YYYY-MM-DD + section Market + OpenSea Integration :c1, 2024-03-01, 1w + Price Analysis :c2, after c1, 1w + section Enhancement + Market Intelligence :c3, after c2, 1w + Performance Tuning :c4, after c3, 1w +
+

3. System Architecture

+

3.1 Core Components

+
graph TD + A[Eliza Plugin] --> B[Query Processor] + B --> C[Storage Interface] + C --> D[Local Storage] + C --> E[Cloud Storage] + B --> F[Market Service] + F --> G[OpenSea API] +
+

3.2 Query Flow

+
sequenceDiagram + participant U as User + participant E as Eliza + participant S as Storage + participant M as Market + + U->>E: Natural query + E->>E: Parse intent + E->>S: Property search + E->>M: Market check + E->>E: Rank results + E-->>U: Final results +
+

4. Technical Implementation

+

4.1 Storage Layer

+
class CloudPropertyStorage implements PropertyStorage { + async searchByVector(vector: number[], options: SearchOptions) { + return this.db.query(` + WITH vector_matches AS ( + SELECT id, 1 - (embedding <=> $1) as similarity + FROM properties + WHERE 1 - (embedding <=> $1) > $2 + ORDER BY similarity DESC + LIMIT $3 + ) + SELECT p.*, vm.similarity + FROM properties p + JOIN vector_matches vm ON p.id = vm.id + WHERE ${this.buildFilterSQL(options.filters)} + ORDER BY vm.similarity DESC + `, [vector, options.threshold, options.limit]); + } +} +
+

4.2 Query Processing

+
class QueryProcessor { + async process(query: string): Promise<SearchResult[]> { + // Phase 1: Understanding + const intent = await this.parseIntent(query); + + // Phase 2: Property Search + const properties = await this.storage.searchProperties({ + vector: await this.getEmbedding(query), + filters: this.intentToFilters(intent) + }); + + // Phase 3: Market Enrichment + return this.enrichWithMarketData(properties); + } +} +
+

4.3 Market Integration

+
class MarketService { + async enrichWithMarketData( + properties: PropertyData[] + ): Promise<EnrichedProperty[]> { + const marketData = await Promise.all( + properties.map(p => this.getMarketStatus(p.nft)) + ); + + return properties.map((prop, i) => ({ + ...prop, + market: marketData[i], + analysis: this.analyzeMarketData(marketData[i]) + })); + } +} +
+

5. Performance Optimizations

+

5.1 Caching Strategy

+
class QueryCache { + // Short TTL for market data + private marketCache = new TTLCache<string, MarketStatus>(5 * 60); + + // Longer TTL for property data + private propertyCache = new TTLCache<string, PropertyData>(60 * 60); + + // Very short TTL for search results + private searchCache = new TTLCache<string, SearchResult[]>(60); +} +
+

5.2 Batch Processing

+
class BatchProcessor { + private queue: Array<{ + property: PropertyData; + resolve: (data: MarketStatus) => void; + }> = []; + + async add(property: PropertyData): Promise<MarketStatus> { + return new Promise(resolve => { + this.queue.push({ property, resolve }); + this.processBatchIfReady(); + }); + } +} +
+

6. Future Enhancements

+

6.1 Advanced Features

+
    +
  1. Price prediction
  2. +
  3. Investment recommendations
  4. +
  5. Market trend analysis
  6. +
  7. Automated alerts
  8. +
+

6.2 Technical Improvements

+
    +
  1. GraphQL API
  2. +
  3. Real-time updates
  4. +
  5. Machine learning integration
  6. +
  7. Advanced caching
  8. +
+

7. Conclusion

+

Our system demonstrates how combining semantic search, blockchain data, and natural language processing can create a powerful property search experience. The multi-phase approach provides flexibility and extensibility while maintaining high performance.

+

8. References

+
    +
  1. +

    Vector Similarity Search

    +
      +
    • "Efficient Vector Similarity Search in PostgreSQL"
    • +
    • "Approximate Nearest Neighbor Search in High Dimensions"
    • +
    +
  2. +
  3. +

    NFT Market Analysis

    +
      +
    • "Real-time NFT Market Analysis"
    • +
    • "Blockchain Data Indexing Strategies"
    • +
    +
  4. +
  5. +

    Natural Language Processing

    +
      +
    • "LLM-based Query Understanding"
    • +
    • "Semantic Search in Practice"
    • +
    +
  6. +
+ + + diff --git a/packages/plugin-unreal/plugin-spreadsheet/design/whitepaper.md b/packages/plugin-unreal/plugin-spreadsheet/design/whitepaper.md new file mode 100644 index 00000000..38ae4d97 --- /dev/null +++ b/packages/plugin-unreal/plugin-spreadsheet/design/whitepaper.md @@ -0,0 +1,269 @@ +# NFT Real Estate Semantic Search: A Multi-Phase Query System + +## Abstract + +We present a novel approach to NFT real estate search that combines semantic understanding, vector similarity, and real-time market data. Our system integrates natural language processing with blockchain market data to provide an intuitive yet powerful property search experience. The architecture supports both local and cloud-based deployments, enabling scalability while maintaining development flexibility. + +## 1. Introduction + +The intersection of real estate and blockchain technology has created new opportunities and challenges in property search and valuation. Traditional search methods often fail to capture the nuanced requirements of users or incorporate real-time market dynamics. Our system addresses these limitations through a multi-phase query approach that combines semantic understanding with market intelligence. + +### 1.1 Key Innovations +- Multi-phase query processing +- Real-time NFT market integration +- Flexible storage architecture +- Natural language understanding +- Hybrid search capabilities + +## 2. Implementation Strategy + +Our development approach emphasizes iterative progress and continuous validation: + +### 2.1 Phase 1: Core Search Infrastructure (Weeks 1-4) +```mermaid +gantt + title Phase 1: Core Infrastructure + dateFormat YYYY-MM-DD + section Storage + Interface Design :a1, 2024-01-01, 1w + Local Implementation :a2, after a1, 1w + section Search + Basic Vector Search :a3, after a2, 1w + Filter Implementation :a4, after a3, 1w +``` + +1. **Week 1: Storage Interface** + ```typescript + interface PropertyStorage { + addProperty(property: PropertyData): Promise; + searchByVector(vector: number[], options: SearchOptions): Promise; + searchByFilters(filters: FilterGroup): Promise; + } + ``` + +2. **Week 2: Local Storage** + - In-memory implementation + - Basic vector operations + - Simple filtering + +3. **Week 3: Vector Search** + - Embedding generation + - Similarity calculations + - Result ranking + +4. **Week 4: Filtering** + - Metadata filters + - Combined search + - Result pagination + +### 2.2 Phase 2: Natural Language Processing (Weeks 5-8) +```mermaid +gantt + title Phase 2: NLP Integration + dateFormat YYYY-MM-DD + section Query + Intent Parsing :b1, 2024-02-01, 1w + Filter Generation :b2, after b1, 1w + section Integration + Multi-phase Query :b3, after b2, 1w + Result Ranking :b4, after b3, 1w +``` + +1. **Week 5: Query Understanding** + ```typescript + interface QueryIntent { + propertyFeatures: { + location?: string[]; + amenities?: string[]; + proximity?: Array<{to: string; distance: number}>; + }; + marketConstraints?: { + maxPrice?: number; + mustBeListed?: boolean; + }; + } + ``` + +2. **Week 6: Filter Generation** + - Convert intents to filters + - Handle complex queries + - Validation rules + +3. **Week 7: Multi-phase Integration** + - Query pipeline + - Result merging + - Performance optimization + +4. **Week 8: Result Ranking** + - Scoring algorithms + - Relevance tuning + - User feedback integration + +### 2.3 Phase 3: Market Integration (Weeks 9-12) +```mermaid +gantt + title Phase 3: NFT Integration + dateFormat YYYY-MM-DD + section Market + OpenSea Integration :c1, 2024-03-01, 1w + Price Analysis :c2, after c1, 1w + section Enhancement + Market Intelligence :c3, after c2, 1w + Performance Tuning :c4, after c3, 1w +``` + +## 3. System Architecture + +### 3.1 Core Components +```mermaid +graph TD + A[Eliza Plugin] --> B[Query Processor] + B --> C[Storage Interface] + C --> D[Local Storage] + C --> E[Cloud Storage] + B --> F[Market Service] + F --> G[OpenSea API] +``` + +### 3.2 Query Flow +```mermaid +sequenceDiagram + participant U as User + participant E as Eliza + participant S as Storage + participant M as Market + + U->>E: Natural query + E->>E: Parse intent + E->>S: Property search + E->>M: Market check + E->>E: Rank results + E-->>U: Final results +``` + +## 4. Technical Implementation + +### 4.1 Storage Layer +```typescript +class CloudPropertyStorage implements PropertyStorage { + async searchByVector(vector: number[], options: SearchOptions) { + return this.db.query(` + WITH vector_matches AS ( + SELECT id, 1 - (embedding <=> $1) as similarity + FROM properties + WHERE 1 - (embedding <=> $1) > $2 + ORDER BY similarity DESC + LIMIT $3 + ) + SELECT p.*, vm.similarity + FROM properties p + JOIN vector_matches vm ON p.id = vm.id + WHERE ${this.buildFilterSQL(options.filters)} + ORDER BY vm.similarity DESC + `, [vector, options.threshold, options.limit]); + } +} +``` + +### 4.2 Query Processing +```typescript +class QueryProcessor { + async process(query: string): Promise { + // Phase 1: Understanding + const intent = await this.parseIntent(query); + + // Phase 2: Property Search + const properties = await this.storage.searchProperties({ + vector: await this.getEmbedding(query), + filters: this.intentToFilters(intent) + }); + + // Phase 3: Market Enrichment + return this.enrichWithMarketData(properties); + } +} +``` + +### 4.3 Market Integration +```typescript +class MarketService { + async enrichWithMarketData( + properties: PropertyData[] + ): Promise { + const marketData = await Promise.all( + properties.map(p => this.getMarketStatus(p.nft)) + ); + + return properties.map((prop, i) => ({ + ...prop, + market: marketData[i], + analysis: this.analyzeMarketData(marketData[i]) + })); + } +} +``` + +## 5. Performance Optimizations + +### 5.1 Caching Strategy +```typescript +class QueryCache { + // Short TTL for market data + private marketCache = new TTLCache(5 * 60); + + // Longer TTL for property data + private propertyCache = new TTLCache(60 * 60); + + // Very short TTL for search results + private searchCache = new TTLCache(60); +} +``` + +### 5.2 Batch Processing +```typescript +class BatchProcessor { + private queue: Array<{ + property: PropertyData; + resolve: (data: MarketStatus) => void; + }> = []; + + async add(property: PropertyData): Promise { + return new Promise(resolve => { + this.queue.push({ property, resolve }); + this.processBatchIfReady(); + }); + } +} +``` + +## 6. Future Enhancements + +### 6.1 Advanced Features +1. Price prediction +2. Investment recommendations +3. Market trend analysis +4. Automated alerts + +### 6.2 Technical Improvements +1. GraphQL API +2. Real-time updates +3. Machine learning integration +4. Advanced caching + +## 7. Conclusion + +Our system demonstrates how combining semantic search, blockchain data, and natural language processing can create a powerful property search experience. The multi-phase approach provides flexibility and extensibility while maintaining high performance. + +## 8. References + +1. Vector Similarity Search + - "Efficient Vector Similarity Search in PostgreSQL" + - "Approximate Nearest Neighbor Search in High Dimensions" + +2. NFT Market Analysis + - "Real-time NFT Market Analysis" + - "Blockchain Data Indexing Strategies" + +3. Natural Language Processing + - "LLM-based Query Understanding" + - "Semantic Search in Practice" diff --git a/packages/plugin-unreal/plugin-spreadsheet/docs/databaseGetterArchitecture.md b/packages/plugin-unreal/plugin-spreadsheet/docs/databaseGetterArchitecture.md new file mode 100644 index 00000000..eebc2990 --- /dev/null +++ b/packages/plugin-unreal/plugin-spreadsheet/docs/databaseGetterArchitecture.md @@ -0,0 +1,230 @@ +# Property Search Plugin Architecture + +## Overview + +The Property Search Plugin is designed with a three-layer architecture that integrates with Eliza's knowledge system while maintaining clean separation of concerns. This document explains the architecture, data flow, and integration points. + +## Architectural Layers + +### 1. Plugin Layer (`index.ts`) +The topmost layer that handles user interaction and plugin initialization. + +```typescript +export const plugin: Plugin = { + name: 'property-search', + description: 'Search and manage property data', + services: [], // Services created in handler with runtime + actions: [searchPropertiesAction] +}; +``` + +Key responsibilities: +- Plugin registration and configuration +- Action definition and handling +- Natural language query processing +- Response formatting + +### 2. Service Layer (`services/index.ts`) +The business logic layer that coordinates operations. + +```typescript +export class PropertyStorageService implements Service { + private storage: PropertyStorage; + private runtime: IAgentRuntime; + + constructor(storage: PropertyStorage, runtime: IAgentRuntime) { + this.storage = storage; + this.runtime = runtime; + } + + async searchByFilters(filters: FilterGroup): Promise { + return this.storage.searchByFilters(filters); + } +} +``` + +Key responsibilities: +- Business logic coordination +- Service interface definition +- Runtime and storage management +- Future transaction handling + +### 3. Storage Layer (`storage/memory-storage.ts`) +The data access layer that integrates direct property access with Eliza's knowledge system. + +```typescript +export class MemoryPropertyStorage extends BasePropertyStorage { + private properties: Map = new Map(); + private runtime: IAgentRuntime; + + async searchByFilters(filters: FilterGroup): Promise { + // Create memory object for knowledge search + const memory: Memory = { + agentId: this.runtime.agentId, + userId: this.runtime.agentId, + roomId: this.runtime.agentId, + content: { + text: this.filtersToQuery(filters) + } + }; + + // Get results from both systems + const knowledgeItems = await knowledge.get(this.runtime, memory); + const directResults = // ... direct property search + + return [...knowledgeResults, ...directResults]; + } +} +``` + +Key responsibilities: +- Direct property storage and retrieval +- Knowledge system integration +- Query transformation +- Result aggregation + +## Data Flow + +### 1. Search Request Flow +``` +User Query + ↓ +Plugin Handler + ↓ +Create Storage & Service (with runtime) + ↓ +Service.searchByFilters() + ↓ +Storage Layer Processing + ├→ Convert Filters to Query + ├→ knowledge.get() Search + └→ Direct Property Search + ↓ +Aggregate Results + ↓ +Format Response + ↓ +Return to User +``` + +### 2. Filter Processing +``` +FilterGroup + ↓ +Convert to Text Query + ├→ Field:Value pairs + └→ AND/OR operators + ↓ +Create Memory Object + ↓ +knowledge.get() +``` + +## Integration Points + +### 1. Eliza Knowledge System +- Integration happens at the storage layer +- Filters converted to natural language queries +- Results merged with direct property search +- Metadata preserved through conversion + +### 2. Runtime Integration +```typescript +// Creation in handler +const storage = new MemoryPropertyStorage(runtime); +const service = new PropertyStorageService(storage, runtime); +``` + +- Runtime passed through all layers +- Enables access to Eliza's core systems +- Maintains plugin context + +## Type System + +### 1. Core Types +```typescript +interface FilterGroup { + operator: 'AND' | 'OR'; + filters: (MetadataFilter | FilterGroup)[]; +} + +interface MetadataFilter { + field: string; + operator: FilterOperator; + value: any; +} + +type FilterOperator = + | '$eq' | '$ne' + | '$gt' | '$gte' + | '$lt' | '$lte' + | '$in' | '$nin' + | '$exists' + | '$near'; +``` + +### 2. Result Types +```typescript +interface SearchResult { + id: string; + property: PropertyData; + similarity: number; + matchedFilters: string[]; +} +``` + +## Future Enhancements + +### 1. Query Enhancement +- Improved filter to query conversion +- Natural language understanding +- Context awareness + +### 2. Result Merging +- Smarter result deduplication +- Relevance scoring +- Result ranking + +### 3. Caching +- Query result caching +- Knowledge cache integration +- Cache invalidation + +## Best Practices + +1. **Layer Separation** + - Keep layers loosely coupled + - Use interfaces for communication + - Maintain single responsibility + +2. **Error Handling** + - Use custom error types + - Proper error propagation + - Meaningful error messages + +3. **Runtime Management** + - Pass runtime through constructors + - Initialize services with runtime + - Maintain runtime context + +4. **Query Processing** + - Clean input data + - Handle edge cases + - Validate filters + +## Testing Strategy + +1. **Unit Tests** + - Test each layer independently + - Mock dependencies + - Test error cases + +2. **Integration Tests** + - Test layer interactions + - Test knowledge integration + - Test full query flow + +3. **E2E Tests** + - Test user scenarios + - Test with real runtime + - Test full plugin flow diff --git a/packages/plugin-unreal/plugin-spreadsheet/docs/databaseGetterArchitecture.pdf b/packages/plugin-unreal/plugin-spreadsheet/docs/databaseGetterArchitecture.pdf new file mode 100644 index 00000000..ee2c5f4b Binary files /dev/null and b/packages/plugin-unreal/plugin-spreadsheet/docs/databaseGetterArchitecture.pdf differ diff --git a/packages/plugin-unreal/plugin-spreadsheet/docs/dec27_pm/ai16z tokenomics.md b/packages/plugin-unreal/plugin-spreadsheet/docs/dec27_pm/ai16z tokenomics.md new file mode 100644 index 00000000..14db7681 --- /dev/null +++ b/packages/plugin-unreal/plugin-spreadsheet/docs/dec27_pm/ai16z tokenomics.md @@ -0,0 +1,71 @@ +### **Summary of the Tokenomics Discussion** + +The recent ai16z tokenomics discussions revolved around enhancing the value capture mechanisms and ecosystem development of the $ai16z token, leveraging the Eliza framework for AI agents. The conversation explored a phased approach to implement sustainable and scalable tokenomics, focusing on short-term launches and long-term growth strategies. + +--- + +### **Key Discussion Points:** + +#### **Phase 1 - Launchpad Proposal (Q1 2025):** +- **Objective:** Establish a decentralized launchpad to support Eliza-based projects. +- **Mechanisms:** + - $ai16z staking for allocations, liquidity pool pairings, and fees from new project launches. + - Buyback and burn strategies or reinvestment in ecosystem growth. + - Open-source components and curation by DAO members to maintain quality and decentralization. + +#### **Phase 2 - Ecosystem Expansion:** +- **Goal:** Incentivize developers and tie token utility to platform growth, mimicking $ETH or $SOL ecosystems. +- **Incentives:** + - Revenue sharing, ecosystem funds, and liquidity incentives for projects. + - AI agent-to-agent transactions denominated in $ai16z. + - Treasury diversification across stablecoins and major Layer 1 assets. + +#### **Phase 3 - Long-Term Vision as AI Infrastructure (L1 for AI):** +- **Outcome:** Position ai16z as a foundational AI blockchain protocol to underpin decentralized AI services. +- **Scaling Strategies:** + - Node incentives and staking models. + - Potential integration with other Layer 1 solutions for interoperability. + +--- + +### **Sentiment and Concerns:** +- **Positive Sentiment:** + - Strong confidence in Eliza’s technological adoption and long-term AI x Crypto growth potential. + - Recognition of ai16z's competitive positioning if tokenomics are implemented correctly. + +- **Challenges Identified:** + - Need for urgent implementation to maintain competitive advantage in AI crypto ecosystems. + - Regulatory concerns around security classification and avoiding unsustainable tokenomic structures. + - Balancing open-source ethos with centralized efforts to guide development. + +--- + +### **Growth Potential Evaluation:** + +#### **Strengths:** +- **Technological Innovation:** Eliza framework offers plugin-based scalability and robust AI capabilities. +- **Community Engagement:** Active participation and suggestions for improving tokenomics signal strong interest. +- **Clear Value Path:** Structured approach to launchpads, incentives, and long-term utility for $ai16z. + +#### **Opportunities:** +- **AI-Crypto Narrative:** Increasing interest in decentralized AI systems aligns with market trends. +- **Network Effects:** Incentivized liquidity pools and staking can drive adoption and utility. +- **Flexible Tokenomics:** Iterative testing and feedback loops enable adaptability. + +#### **Risks:** +- **Execution Complexity:** Launchpad setup and DAO curation require resources and governance coordination. +- **Competition:** Rival platforms like Virtuals already exhibit successful tokenomic flywheels. +- **Market Volatility:** Dependence on speculative interest and regulatory shifts. + +#### **Recommendations:** +1. **Prioritize Phase 1 Launchpad:** Rapid deployment to establish presence and attract projects. +2. **Simplify Initial Tokenomics:** Focus on sustainability and easy adoption before expanding complexity. +3. **Iterate Based on Feedback:** Continuously monitor market performance and optimize strategies. +4. **Develop Legal Compliance Frameworks:** Address regulatory challenges early. + +--- + +### **Conclusion:** + +The ai16z ecosystem has significant growth potential as a decentralized AI hub, provided it successfully implements a scalable and sustainable tokenomics model. Phase 1’s launchpad approach can create immediate value capture and attract stakeholders, while Phase 2 and Phase 3 can position ai16z as a long-term infrastructure layer for AI innovation. With strong fundamentals and proactive ecosystem building, ai16z can emerge as a leading player in the AI-Crypto space. + diff --git a/packages/plugin-unreal/plugin-spreadsheet/docs/dec27_pm/ai16z tokenomics.pdf b/packages/plugin-unreal/plugin-spreadsheet/docs/dec27_pm/ai16z tokenomics.pdf new file mode 100644 index 00000000..7ec7afce Binary files /dev/null and b/packages/plugin-unreal/plugin-spreadsheet/docs/dec27_pm/ai16z tokenomics.pdf differ diff --git a/packages/plugin-unreal/plugin-spreadsheet/docs/dec27_pm/memory-integration.md b/packages/plugin-unreal/plugin-spreadsheet/docs/dec27_pm/memory-integration.md new file mode 100644 index 00000000..bacbf433 --- /dev/null +++ b/packages/plugin-unreal/plugin-spreadsheet/docs/dec27_pm/memory-integration.md @@ -0,0 +1,74 @@ +# Property Memory Integration Implementation + +## Overview +This document outlines the implementation of memory integration for property data in the spreadsheet plugin. The goal is to store property information in Eliza's memory system, enabling semantic search and retrieval of property data. + +## Implementation Details + +### 1. Knowledge Item Structure +Property data is converted into a `KnowledgeItem` with the following structure: + +```typescript +interface KnowledgeItem { + id: string; // UUID generated from property text + content: { + text: string; // Formatted property description + source: string; // "property-data" + metadata: { + propertyId: string; + propertyType: string; + createdAt: string; + } + } +} +``` + +### 2. Text Format +Properties are converted to a standardized text format for embedding: +``` +Property: [name] +Location: [neighborhood] +Type: [zoningType] +Size: [plotSize] ([buildingSize]) +Floors: [minFloors]-[maxFloors] +Height: [minBuildingHeight]-[maxBuildingHeight] feet +Distance to Ocean: [oceanDistanceMeters]m +Distance to Bay: [bayDistanceMeters]m +Description: [description] +Price: [currentPrice] [currency] +``` + +### 3. Memory Storage Process +1. Convert `PropertyData` to formatted text +2. Generate document ID using `stringToUuid` +3. Create `KnowledgeItem` with property metadata +4. Store using `knowledge.set()` + +### 4. Memory Retrieval Process +1. Create a query message with property-related text +2. Use `knowledge.get()` to retrieve relevant memories +3. Process and filter results based on metadata + +## Testing +The implementation includes integration tests that: +1. Create a test property +2. Store it in the memory system +3. Retrieve it using a natural language query +4. Verify the retrieved data matches the original property + +## Dependencies +- OpenAI API for text embeddings +- PostgreSQL database for memory storage +- Eliza core knowledge system + +## Configuration +Required environment variables: +- `POSTGRES_URL`: Database connection string +- `OPENAI_API_KEY`: API key for embeddings +- `EMBEDDING_OPENAI_MODEL`: Set to 'text-embedding-3-small' + +## Future Enhancements +1. Batch processing for multiple properties +2. Enhanced metadata for better filtering +3. Caching layer for frequently accessed properties +4. Custom embedding templates for different property types diff --git a/packages/plugin-unreal/plugin-spreadsheet/docs/dec28/PropertyStorageService.md b/packages/plugin-unreal/plugin-spreadsheet/docs/dec28/PropertyStorageService.md new file mode 100644 index 00000000..41de259e --- /dev/null +++ b/packages/plugin-unreal/plugin-spreadsheet/docs/dec28/PropertyStorageService.md @@ -0,0 +1,123 @@ +# PropertyStorageService Documentation + +## Overview + +Hi! I'm the PropertyStorageService. I'm a service class that manages property storage in the spreadsheet plugin. I act as a middleman between the Eliza runtime and the actual storage implementation. Think of me as a manager - I don't do the actual storage work myself, but I make sure everything runs smoothly. + +## My Family Tree + +I come from a distinguished lineage: +- I extend the `Service` class from Eliza +- I implement the `PropertyStorage` interface +- I work closely with my friend `BasePropertyStorage` who does the actual storage work + +## My Components + +### State +I maintain two important pieces of state: +```typescript +private storage: BasePropertyStorage; // My storage implementation +private runtime: AgentRuntime | null = null; // My connection to the Eliza runtime +``` + +### Identity +I identify myself to the Eliza system using: +```typescript +readonly type = ServiceType.PROPERTY_STORAGE; +static override get serviceType(): ServiceType { + return ServiceType.PROPERTY_STORAGE; +} +``` + +## My Life Cycle + +### Birth (Construction) +When I'm created, I need a storage implementation: +```typescript +constructor(storage: BasePropertyStorage) { + super(); // First, I initialize my Service parent + this.storage = storage; // Then I store my storage helper +} +``` + +### Initialization +Before I can do real work, I need to be initialized with a runtime: +```typescript +async initialize(runtime: AgentRuntime): Promise { + await this.storage.initialize(runtime); +} +``` + +## My Main Responsibilities + +### Searching Properties +I handle two types of searches: + +1. Filter-based Search: +```typescript +async searchByFilters(filters: FilterGroup): Promise { + // I do extensive logging to help with debugging + // I check that I'm properly initialized + // I delegate the actual search to my storage implementation + // I format and return the results +} +``` + +2. Vector-based Search: +```typescript +async searchByVector(vector: number[], options: SearchOptions): Promise { + // Similar pattern to filter search + // But using vector similarity instead +} +``` + +### Error Handling +I take error handling seriously: +- I check for initialization before operations +- I wrap storage errors with detailed logging +- I maintain proper error context for debugging + +## How I Help Debug Issues + +I use extensive logging to help developers understand what's happening: +```typescript +elizaLogger.debug('PropertyStorageService.searchByFilters called', { + hasRuntime: !!this.runtime, + hasStorage: !!this.storage, + operator: filters.operator, + filterCount: filters.filters?.length +}); +``` + +## Best Practices When Working With Me + +1. **Initialization**: Always initialize me before using my methods + ```typescript + const service = new PropertyStorageService(storage); + await service.initialize(runtime); + ``` + +2. **Error Handling**: Watch for my error messages - they're designed to help you understand what went wrong + +3. **Logging**: I provide detailed logs at different levels: + - DEBUG: For detailed operation tracking + - INFO: For normal operation status + - ERROR: For issues that need attention + +## Common Issues + +1. "Runtime not initialized" + - Make sure you've called `initialize()` before using my methods + - Check that the runtime was properly passed to me + +2. "Storage not initialized" + - Verify that the storage implementation was properly created + - Make sure the storage was initialized with the runtime + +## Future Improvements + +1. Add more detailed error context +2. Implement caching for frequent searches +3. Add metrics for performance monitoring + +Remember: I'm here to make property storage easy and reliable. Let me handle the complexity of storage management while you focus on your application logic! diff --git a/packages/plugin-unreal/plugin-spreadsheet/docs/dec28/PropertyStorageService.pdf b/packages/plugin-unreal/plugin-spreadsheet/docs/dec28/PropertyStorageService.pdf new file mode 100644 index 00000000..a8645bd4 Binary files /dev/null and b/packages/plugin-unreal/plugin-spreadsheet/docs/dec28/PropertyStorageService.pdf differ diff --git a/packages/plugin-unreal/plugin-spreadsheet/docs/dec28/architecture-diagrams.md b/packages/plugin-unreal/plugin-spreadsheet/docs/dec28/architecture-diagrams.md new file mode 100644 index 00000000..26aa5084 --- /dev/null +++ b/packages/plugin-unreal/plugin-spreadsheet/docs/dec28/architecture-diagrams.md @@ -0,0 +1,766 @@ +# Property Storage Architecture Diagrams + +## Class Hierarchy +```mermaid +classDiagram + Service <|-- PropertyStorageService + PropertyStorage <|.. PropertyStorageService + PropertyStorage <|.. BasePropertyStorage + BasePropertyStorage <|-- MemoryPropertyStorage + + class Service { + +ServiceType serviceType + +initialize(runtime: AgentRuntime) + } + + class PropertyStorage { + <> + +addProperty(property: PropertyData) + +getProperty(id: string) + +updateProperty(id: string, property: PropertyData) + +deleteProperty(id: string) + +searchByFilters(filters: FilterGroup) + +searchByVector(vector: number[], options: SearchOptions) + } + + class PropertyStorageService { + -storage: BasePropertyStorage + -runtime: AgentRuntime + +initialize(runtime: AgentRuntime) + +searchByFilters(filters: FilterGroup) + +searchByVector(vector: number[], options: SearchOptions) + } + + class BasePropertyStorage { + <> + #runtime: AgentRuntime + +initialize(runtime: AgentRuntime) + +abstract searchByFilters(filters: FilterGroup) + +abstract searchByVector(vector: number[], options: SearchOptions) + } + + class MemoryPropertyStorage { + -properties: Map + -nextId: number + +addProperty(property: PropertyData) + +getProperty(id: string) + +searchByFilters(filters: FilterGroup) + } +``` + +## Component Interaction +```mermaid +sequenceDiagram + participant Client + participant PropertyStorageService + participant MemoryPropertyStorage + participant AgentRuntime + participant Knowledge + + Client->>PropertyStorageService: new(storage) + PropertyStorageService->>MemoryPropertyStorage: new() + Client->>PropertyStorageService: initialize(runtime) + PropertyStorageService->>MemoryPropertyStorage: initialize(runtime) + + Client->>PropertyStorageService: searchByFilters(filters) + PropertyStorageService->>MemoryPropertyStorage: searchByFilters(filters) + MemoryPropertyStorage->>AgentRuntime: get knowledge + AgentRuntime->>Knowledge: search + Knowledge-->>MemoryPropertyStorage: results + MemoryPropertyStorage-->>PropertyStorageService: filtered results + PropertyStorageService-->>Client: search results +``` + +## Runtime State Flow +```mermaid +stateDiagram-v2 + [*] --> Constructed: new PropertyStorageService(storage) + Constructed --> Initialized: initialize(runtime) + Initialized --> Ready: runtime available + Ready --> Searching: searchByFilters/Vector + Searching --> Ready: results returned + Ready --> Error: runtime missing + Error --> Ready: reinitialize + Ready --> [*]: shutdown +``` + +## Data Flow +```mermaid +flowchart TD + Client[Client] --> |1. search request| PSS[PropertyStorageService] + PSS --> |2. validate| Check{Check State} + Check --> |3a. error| Error[Return Error] + Check --> |3b. ok| MPS[MemoryPropertyStorage] + MPS --> |4. query| RT[Runtime] + RT --> |5. search| K[Knowledge System] + K --> |6. results| MPS + MPS --> |7. filter| Results[Filter Results] + Results --> |8. format| PSS + PSS --> |9. response| Client +``` + +## Component Architecture +```mermaid +graph TB + subgraph Eliza Framework + Service + AgentRuntime + Knowledge + end + + subgraph Plugin Spreadsheet + subgraph Services + PropertyStorageService --> Service + PropertyStorageService --> PropertyStorage + end + + subgraph Storage + BasePropertyStorage --> PropertyStorage + MemoryPropertyStorage --> BasePropertyStorage + end + + subgraph Types + PropertyData + SearchResult + FilterGroup + end + end + + PropertyStorageService --> MemoryPropertyStorage + MemoryPropertyStorage --> Knowledge + PropertyStorageService --> AgentRuntime +``` + +## Initialization Flow +```mermaid +sequenceDiagram + participant Eliza + participant PSS as PropertyStorageService + participant MPS as MemoryPropertyStorage + + Note over Eliza: Framework startup + + Eliza->>PSS: new PropertyStorageService(storage) + PSS->>MPS: new MemoryPropertyStorage() + Note over MPS: Constructs empty Map
Sets nextId = 1 + + Eliza->>PSS: initialize(runtime) + Note over PSS: Logs initialization start + PSS->>PSS: Store runtime + PSS->>MPS: initialize(runtime) + Note over MPS: Stores runtime
Ready for operations + Note over PSS: Logs initialization complete + + Note over PSS,MPS: System ready for operations +``` + +## Abstract Class Structure +```mermaid +classDiagram + class PropertyStorage { + <> + +initialize(runtime) + +addProperty(property) + +getProperty(id) + +updateProperty(id, property) + +deleteProperty(id) + +searchByVector(vector, options) + +searchByFilters(filters) + } + + class BasePropertyStorage { + <> + #runtime: AgentRuntime + +initialize(runtime) + +abstract addProperty(property)* + +abstract getProperty(id)* + +abstract updateProperty(id, property)* + +abstract deleteProperty(id)* + #validateProperty(property) + } + + class MemoryPropertyStorage { + -properties: Map + -nextId: number + +addProperty(property) + +getProperty(id) + +updateProperty(id, property) + +deleteProperty(id) + } + + PropertyStorage <|.. BasePropertyStorage : implements + BasePropertyStorage <|-- MemoryPropertyStorage : extends + + note for BasePropertyStorage "Provides common functionality\nand enforces contract" + note for MemoryPropertyStorage "Concrete implementation\nusing in-memory Map" +``` + +## Error Handling Flow +```mermaid +flowchart TD + Start[Operation Start] --> Check{Check Runtime} + Check --> |Missing| E1[Throw INTERNAL_ERROR] + Check --> |Present| Next{Check Storage} + Next --> |Missing| E2[Throw INTERNAL_ERROR] + Next --> |Present| Op[Perform Operation] + Op --> |Success| Return[Return Results] + Op --> |Failure| E3[Log & Throw Error] + E1 --> Log[Log Error] + E2 --> Log + E3 --> Log + Log --> End[End Operation] +``` + +## Map Operations +```mermaid +graph TD + subgraph Map Operations + direction LR + M[Map] + + subgraph Add Property + A1[Generate ID] --> A2[properties.set] + A2 --> A3[Store Property] + end + + subgraph Get Property + G1[properties.get] --> G2{Found?} + G2 -->|Yes| G3[Return Copy] + G2 -->|No| G4[Throw Error] + end + + subgraph Update Property + U1[properties.has] --> U2{Exists?} + U2 -->|Yes| U3[Validate] --> U4[properties.set] + U2 -->|No| U5[Throw Error] + end + + subgraph Delete Property + D1[properties.delete] --> D2{Success?} + D2 -->|Yes| D3[Done] + D2 -->|No| D4[Throw Error] + end + end + + style M fill:#f9f,stroke:#333,stroke-width:4px +``` + +## MemoryPropertyStorage Deep Dive + +### State Management +```mermaid +classDiagram + class MemoryPropertyStorage { + -properties: Map + -nextId: number + -runtime: AgentRuntime + +initialize(runtime) + +addProperty(property) + +getProperty(id) + +updateProperty(id, property) + +deleteProperty(id) + +searchByFilters(filters) + +searchByVector(vector, options) + -validateProperty(property) + } + + class PropertyData { + +id: string + +name: string + +description: string + +metadata: object + } + + MemoryPropertyStorage --> "0..*" PropertyData : stores +``` + +### Search Flow +```mermaid +sequenceDiagram + participant Client + participant MPS as MemoryPropertyStorage + participant Map as Properties Map + participant Knowledge as Knowledge System + participant Runtime as Agent Runtime + + Client->>MPS: searchByFilters(filters) + MPS->>MPS: Check runtime initialized + MPS->>MPS: Convert filters to query + MPS->>Runtime: Get knowledge context + Runtime->>Knowledge: Search + Knowledge-->>MPS: Return matches + MPS->>Map: Get matching properties + Map-->>MPS: Return properties + MPS->>MPS: Apply filters + MPS-->>Client: Return filtered results +``` + +### Property Lifecycle +```mermaid +stateDiagram-v2 + [*] --> Validated: addProperty() + Validated --> Stored: properties.set() + Stored --> Retrieved: getProperty() + Retrieved --> Updated: updateProperty() + Updated --> Stored: properties.set() + Stored --> Deleted: deleteProperty() + Deleted --> [*] + + Stored --> Searched: searchByFilters() + Searched --> Stored + + state Validated { + [*] --> ValidateFields + ValidateFields --> CheckRequired + CheckRequired --> [*] + } +``` + +### Implementation Details + +#### 1. Core Data Structure +```typescript +class MemoryPropertyStorage { + private properties: Map = new Map(); + private nextId: number = 1; + private runtime: AgentRuntime | null = null; +} +``` +- Uses JavaScript Map for O(1) access +- Maintains auto-incrementing ID +- Stores runtime for knowledge operations + +#### 2. Key Operations + +##### Add Property +```mermaid +flowchart TD + A[Start] --> B[Validate Property] + B --> C{Valid?} + C -->|Yes| D[Generate ID] + D --> E[Store in Map] + E --> F[Return ID] + C -->|No| G[Throw Error] +``` + +##### Search By Filters +```mermaid +flowchart TD + A[Start] --> B[Check Runtime] + B --> C[Convert Filters to Query] + C --> D[Get Knowledge Results] + D --> E[Match Properties] + E --> F[Apply Filters] + F --> G[Return Results] +``` + +#### 3. Error Handling +```mermaid +flowchart TD + subgraph Error Types + E1[NOT_FOUND] + E2[INVALID_INPUT] + E3[INTERNAL_ERROR] + end + + subgraph Scenarios + S1[Missing Property] --> E1 + S2[Invalid Data] --> E2 + S3[Runtime Missing] --> E3 + end +``` + +### Key Features + +1. **In-Memory Storage** + - Fast access and operations + - No persistence between restarts + - Thread-safe operations + +2. **ID Management** + - Auto-incrementing IDs + - Guaranteed uniqueness + - Simple string format + +3. **Property Validation** + - Required field checking + - Type validation + - Format validation + +4. **Search Capabilities** + - Filter-based search + - Vector similarity search + - Knowledge system integration + +5. **Runtime Integration** + - Connects to Eliza runtime + - Accesses knowledge system + - Handles runtime state + +### Best Practices + +1. **Data Management** + - Always validate before storing + - Return copies of objects + - Handle missing data gracefully + +2. **Error Handling** + - Use specific error codes + - Include detailed messages + - Log important operations + +3. **Search Operations** + - Check runtime before search + - Convert filters properly + - Handle empty results + +4. **Performance** + - Keep properties small + - Use efficient iterations + - Cache when possible + +### Limitations + +1. **Memory Constraints** + - Limited by available RAM + - No persistence + - No transaction support + +2. **Search Limitations** + - Basic filter matching + - No complex indexing + - Limited sorting options + +3. **Scalability** + - Single instance only + - No distributed support + - No replication + +### Usage Examples + +```typescript +// Initialize +const storage = new MemoryPropertyStorage(); +await storage.initialize(runtime); + +// Add property +const id = await storage.addProperty({ + name: "Test Property", + description: "A test property" +}); + +// Search +const results = await storage.searchByFilters({ + operator: 'AND', + filters: [ + { field: 'location', operator: '$in', value: 'beach' }, + { field: 'price', operator: '$lt', value: 1000000 } + ] +}); +``` + +## Knowledge System Integration + +### Knowledge Flow +```mermaid +sequenceDiagram + participant Client + participant Storage as MemoryPropertyStorage + participant Runtime as AgentRuntime + participant Knowledge as Knowledge System + participant Memory as Memory Store + + Client->>Storage: searchByFilters(filters) + Storage->>Storage: filtersToQuery() + + Note over Storage: Convert filters to natural language + + Storage->>Storage: Create Memory object + Storage->>Knowledge: knowledge.get(runtime, memory) + + activate Knowledge + Knowledge->>Memory: Search memory store + Memory-->>Knowledge: Return matches + Knowledge-->>Storage: Return knowledge items + deactivate Knowledge + + Storage->>Storage: Convert to PropertyData + Storage->>Storage: Apply additional filters + Storage-->>Client: Return results +``` + +### Filter to Query Conversion +```mermaid +flowchart TD + subgraph Filter Structure + F1[FilterGroup] --> F2[Operator: AND/OR] + F1 --> F3[Filters Array] + F3 --> F4[MetadataFilter] + F3 --> F5[Nested FilterGroup] + end + + subgraph Query Generation + Q1[filtersToQuery] --> Q2[Process Operator] + Q2 --> Q3[Process Filters] + Q3 --> Q4[Generate Text] + end + + F1 -.->|Input| Q1 + Q4 -.->|Output| T1[Natural Language Query] +``` + +### Memory Object Structure +```typescript +const memory: Memory = { + agentId: runtime.agentId, + userId: runtime.agentId, + roomId: runtime.agentId, + content: { + text: queryText // Converted from filters + } +}; +``` + +### Knowledge Integration Details + +1. **Filter Translation** + ```mermaid + flowchart LR + subgraph Input + F1[FilterGroup] --> F2[field: name] + F1 --> F3[operator: contains] + F1 --> F4[value: beach] + end + + subgraph Output + Q1[Natural language query] + end + + Input --> Translation --> Output + ``` + +2. **Knowledge Response Processing** + ```mermaid + flowchart TD + K1[Knowledge Items] --> P1[Extract Metadata] + P1 --> P2[Convert to PropertyData] + P2 --> P3[Apply Filters] + P3 --> P4[Create SearchResult] + + subgraph Results + R1[ID] + R2[Property] + R3[Similarity] + R4[Matched Filters] + end + + P4 --> Results + ``` + ```mermaid + flowchart TD + K1[Knowledge Items] --> P1[Extract Metadata] + P1 --> P2[Convert to PropertyData] + P2 --> P3[Apply Filters] + P3 --> P4[Create SearchResult] + + subgraph Results + R1[ID] + R2[Property] + R3[Similarity] + R4[Matched Filters] + end + + P4 --> Results + ``` + +### Example Knowledge Flow + +```typescript +// 1. Input Filter +const filters = { + operator: 'AND', + filters: [ + { field: 'location', operator: '$in', value: 'beach' }, + { field: 'price', operator: '$lt', value: 1000000 } + ] +}; + +// 2. Generated Query +const query = "Find properties located near the beach with price less than 1 million"; + +// 3. Memory Object +const memory = { + agentId: runtime.agentId, + content: { text: query } +}; + +// 4. Knowledge Response +const knowledgeItems = await knowledge.get(runtime, memory); + +// 5. Converted Results +const results = knowledgeItems.map(item => ({ + id: item.id, + property: item.content.metadata, + similarity: 1.0, + matchedFilters: [] +})); +``` + +### Key Points + +1. **Query Generation** + - Filters are converted to natural language + - Complex filters are handled recursively + - Query is optimized for knowledge search + +2. **Knowledge Integration** + - Uses Eliza's knowledge system + - Maintains runtime context + - Handles async operations + +3. **Result Processing** + - Converts knowledge items to properties + - Applies additional filtering + - Maintains metadata and context + +4. **Error Handling** + - Validates runtime availability + - Handles knowledge system errors + - Provides detailed error context + +### Best Practices + +1. **Query Construction** + - Keep queries focused and specific + - Use natural language patterns + - Include relevant context + +2. **Result Handling** + - Process results in batches + - Validate metadata conversion + - Apply post-processing filters + +3. **Error Management** + - Check runtime before queries + - Handle knowledge system timeouts + - Provide fallback behavior + +## Filter to Query Conversion + +### Filter Structure +```typescript +interface FilterGroup { + operator: 'AND' | 'OR'; + filters: (MetadataFilter | FilterGroup)[]; +} + +interface MetadataFilter { + field: string; + operator: string; + value: any; +} +``` + +### Conversion Process +```mermaid +flowchart TD + subgraph Input[Input Filter Group] + F1[FilterGroup] --> O1[operator: AND] + F1 --> FA[filters array] + FA --> MF1[MetadataFilter 1] + FA --> MF2[MetadataFilter 2] + FA --> NFG[Nested FilterGroup] + end + + subgraph Process[Conversion Process] + GT[groupToText] --> FT[filterToText] + GT --> RGT[Recursive groupToText] + FT --> Join[Join with operator] + RGT --> Join + end + + subgraph Example[Example Conversion] + E1["location:beach AND price:1000000 AND (type:house OR type:apartment)"] + end + + Input --> Process + Process --> Example +``` + +### How It Works + +1. **Base Case - Single Filter** + ```typescript + filterToText(filter: MetadataFilter): string { + return `${filter.field}:${filter.value}`; + } + ``` + - Converts a single filter to "field:value" + - Example: `{ field: 'price', value: 1000000 }` → `"price:1000000"` + +2. **Recursive Case - Filter Group** + ```typescript + groupToText(group: FilterGroup): string { + const filterTexts = group.filters.map(f => + 'operator' in f ? groupToText(f) : filterToText(f) + ); + return filterTexts.join(group.operator === 'AND' ? ' AND ' : ' OR '); + } + ``` + - Maps each filter through either `filterToText` or recursive `groupToText` + - Joins results with AND/OR based on group operator + +### Example Walkthrough + +```typescript +const filters = { + operator: 'AND', + filters: [ + { field: 'location', value: 'beach' }, + { field: 'price', value: 1000000 }, + { + operator: 'OR', + filters: [ + { field: 'type', value: 'house' }, + { field: 'type', value: 'apartment' } + ] + } + ] +}; + +// Step 1: Process top-level AND group +// → Map each filter: +// 1. "location:beach" +// 2. "price:1000000" +// 3. Process nested OR group: +// → Map nested filters: +// - "type:house" +// - "type:apartment" +// → Join with OR: "(type:house OR type:apartment)" +// → Join all with AND + +// Final Result: +// "location:beach AND price:1000000 AND (type:house OR type:apartment)" +``` + +### Key Points + +1. **Recursion** + - Handles nested filter groups of any depth + - Each group is processed independently + - Results are combined based on operators + +2. **Type Checking** + - Uses `'operator' in f` to distinguish between: + - MetadataFilter (single filter) + - FilterGroup (nested group) + +3. **String Building** + - Builds query from bottom up + - Maintains operator precedence + - Creates human-readable format + +4. **Use Cases** + - Complex property searches + - Multi-criteria filtering + - Nested condition groups diff --git a/packages/plugin-unreal/plugin-spreadsheet/docs/dec28/devlog1.md b/packages/plugin-unreal/plugin-spreadsheet/docs/dec28/devlog1.md new file mode 100644 index 00000000..9708f419 --- /dev/null +++ b/packages/plugin-unreal/plugin-spreadsheet/docs/dec28/devlog1.md @@ -0,0 +1,111 @@ +# Development Log - December 28, 2024 + +## Session Timeline + +### Initial Setup and Character Migration +1. Started with transitioning from the whimsical Dobby character to a more professional real estate assistant +2. Created new character file `unrealagent.character.json` with ATLAS identity +3. Implemented professional bio and lore sections focusing on real estate expertise + +### Property Knowledge Base Development +1. Added structured property records to knowledge section: + ```json + "Property: Oceanview Tower | Location: Miami Beach | Type: Mixed-Use | Size: 0.8 acres | Features: Beachfront access, retail spaces on ground floor, luxury residential units above, completed in 2022 | Market Value: $45M" + ``` +2. Created multiple property entries covering different types: + - Mixed-use developments + - Residential complexes + - Commercial properties + - Retail spaces + +### Agent ID Updates +1. Changed agent ID from `aa0d6f50-b80b-0dfa-811b-1f8750ee6278` to `1459b245-2171-02f6-b436-c3c2641848e5` +2. Updated ID across multiple files: + - `.env`: Updated USER_ID + - Test files: + - `unreal-agent2.test.md` + - `memory-integration.test.ts` + - `memory-integration.test2.ts` + - Database scripts: + - `clear_memories.ts` + - `embed_test6.ts` + +### File Management +1. Cleaned up deprecated files: + - Removed `save-memory-test.ts` + - Removed `runtime-test.ts` +2. Updated `.gitignore` to track character files by removing `characters/` entry + +### Testing Phase +1. Tested property search functionality: + ``` + User: search-properties sunset plaza miami beach commercial + ATLAS: Sunset Plaza is a commercial property located in Miami Beach. It spans 0.6 acres and features a prime retail location with a modern design and a parking structure. The property was renovated in 2021 and has a market value of $28 million. + ``` +2. Verified agent ID consistency across system +3. Confirmed character maintains professional tone + +### Character File Structure Investigation +1. Explored possibility of adding metadata to character file +2. Found current schema limitations: + - No dedicated metadata field + - Limited to standard fields (name, agentId, clients, etc.) +3. Discussed future solutions: + - Property management feature + - External data storage + - Structured property database + +## Challenges Encountered +1. Character file schema limitations for metadata +2. Multiple locations requiring agent ID updates +3. Balancing professional tone with informative responses + +## Solutions Implemented +1. Used knowledge section for property data storage +2. Systematic update of agent ID across codebase +3. Structured property information format for consistency + +## Future Development Plans +1. Property Management Feature: + - External data storage (JSON/CSV) + - Rich property records + - Market analysis capabilities +2. Enhanced Search Functionality: + - Custom filters + - Detailed property comparisons + - Market trend analysis + +## Code Snippets and Examples + +### Character Bio Example +```json +"bio": [ + "ATLAS is a professional real estate intelligence system designed to provide comprehensive property information and insights.", + "Specializes in detailed property analysis and data-driven recommendations.", + "Combines technical expertise with clear, concise communication.", + "Prioritizes accuracy and completeness in property information delivery.", + "Maintains a professional yet approachable demeanor while assisting clients." +] +``` + +### Property Record Format +``` +Property: [Name] | Location: [Area] | Type: [Usage] | Size: [Acreage] | Features: [Key Amenities] | Market Value: [Current Valuation] +``` + +## Session Notes +- Character responds well to property queries +- Professional tone maintained throughout interactions +- Property data structure provides good balance of information +- System successfully processes and returns relevant property details +- Future enhancement possibilities identified for property management + +## Next Steps +1. Develop property management feature +2. Expand property database +3. Implement advanced search capabilities +4. Add market analysis functionality + +--- +*Log recorded: December 28, 2024 at 21:08 MST* +*Author: Cascade AI Assistant* diff --git a/packages/plugin-unreal/plugin-spreadsheet/docs/dec28/devsummary.md b/packages/plugin-unreal/plugin-spreadsheet/docs/dec28/devsummary.md new file mode 100644 index 00000000..914f5709 --- /dev/null +++ b/packages/plugin-unreal/plugin-spreadsheet/docs/dec28/devsummary.md @@ -0,0 +1,88 @@ +# Development Summary - December 28, 2024 + +## Overview +Today's development focused on upgrading the real estate assistant character and implementing system-wide agent ID updates. The work transformed the previous whimsical character into a professional real estate intelligence system named ATLAS. + +## Major Changes + +### 1. Character Transformation +- **New Identity**: Created ATLAS (Advanced Technical Listing Analysis System) + - Replaced previous character with professional real estate focus + - Implemented comprehensive property knowledge base + - Enhanced bio and lore to reflect technical expertise + +### 2. Agent ID Updates +- **New Agent ID**: `1459b245-2171-02f6-b436-c3c2641848e5` +- **Files Updated**: + - `.env`: Updated USER_ID + - `unreal-agent2.test.md`: Updated test configurations + - `memory-integration.test.ts` and `test2.ts`: Updated test agent IDs + - `clear_memories.ts`: Updated room ID + - `embed_test6.ts`: Updated room, user, and agent IDs + +### 3. Property Data Implementation +- **Knowledge Base Structure**: + ```json + { + "Property": "Name", + "Location": "Area", + "Type": "Usage", + "Size": "Acreage", + "Features": "Key Amenities", + "Market Value": "Current Valuation" + } + ``` +- **Sample Properties Added**: + - Oceanview Tower (Mixed-Use) + - Palm Gardens Complex (Residential) + - Sunset Plaza (Commercial) + - Marina Heights (Mixed-Use) + - Beach Walk Commons (Retail) + +### 4. File Management +- Moved character file to proper `characters/` directory +- Updated `.gitignore` to track character files +- Removed deprecated test files +- Consolidated property records in character knowledge base + +## Testing & Validation +- Successfully tested property search functionality + - Example: "search-properties sunset plaza miami beach commercial" + - System correctly returned property details including size, features, and market value +- Verified agent ID consistency across all system components +- Confirmed character responses maintain professional tone and accurate property information + +## Future Enhancements Identified +1. **Property Management Feature**: + - Implement structured data storage (JSON/CSV) + - Create property record loader + - Add market trend analysis + - Enable detailed property metadata + - Develop custom search filters + +2. **Knowledge Base Expansion**: + - Add more property records + - Include market analysis data + - Implement property categorization + - Add historical price trends + +## Technical Debt Addressed +- Removed outdated character configurations +- Updated all agent ID references +- Cleaned up deprecated test files +- Standardized property data format + +## Next Steps +1. Develop property management feature +2. Expand property database +3. Implement advanced search capabilities +4. Add market analysis functionality + +## Notes +- Character file schema currently doesn't support dedicated metadata +- Future consideration: Extend schema for structured property data +- Current implementation uses knowledge array for property records +- System demonstrates good performance with basic property queries + +--- +*Generated: December 28, 2024 at 21:04 MST* diff --git a/packages/plugin-unreal/plugin-spreadsheet/docs/direct-search-flow.md b/packages/plugin-unreal/plugin-spreadsheet/docs/direct-search-flow.md new file mode 100644 index 00000000..6239cb5d --- /dev/null +++ b/packages/plugin-unreal/plugin-spreadsheet/docs/direct-search-flow.md @@ -0,0 +1,164 @@ +# Direct Search System Analysis + +## Search Flow Overview + +The search system follows a three-layer architecture: + +1. **Plugin Layer** (Entry Point) +2. **Service Layer** (Business Logic) +3. **Storage Layer** (Data Access) + +## Detailed Flow Analysis + +### 1. Plugin Layer (`index.ts`) +```typescript +// User input starts here in the handler function +async handler(runtime: IAgentRuntime, message: Memory): Promise { + // 1. Get service instance + const service = runtime.getService(ServiceType.PROPERTY_STORAGE); + + // 2. Extract query from text + const text = message.content?.text || ''; + let query = ''; + + // 3. Query text processing + if (text.includes('listings for')) { + query = text.split('listings for')[1].trim(); + } else if (text.includes('properties')) { + query = text.split('properties')[1]?.trim() || text; + } else { + query = text; + } + + // 4. Construct search filters + const results = await service.searchByFilters({ + operator: 'OR', + filters: [ + { + field: 'description', + value: query.toLowerCase(), + operator: '$in' + }, + { + field: 'name', + value: query.toLowerCase(), + operator: '$in' + }, + { + field: 'neighborhood', + value: query.toLowerCase(), + operator: '$in' + } + ] + }); +} +``` + +### 2. Storage Layer (`memory-storage.ts`) +```typescript +class MemoryPropertyStorage extends BasePropertyStorage { + private properties: Map = new Map(); + + async searchByFilters(filters: FilterGroup): Promise { + return Array.from(this.properties.entries()).map(([id, property]) => ({ + id, + property, + similarity: 1.0, + matchedFilters: [] + })); + } +} +``` + +## Data Flow Steps + +1. **Input Processing** + - User sends natural language query + - Handler extracts meaningful search terms + - Query is normalized (converted to lowercase) + +2. **Filter Construction** + - Creates an OR filter group + - Searches across multiple fields: + - description + - name + - neighborhood + - Uses `$in` operator for partial matches + +3. **Storage Query** + - Filters passed to MemoryPropertyStorage + - Currently returns all properties (placeholder implementation) + - Designed for future enhancement with real filtering + +4. **Result Processing** + - Results mapped to SearchResult interface + - Each result includes: + - property data + - similarity score (currently 1.0) + - matched filters (currently empty) + +5. **Response Formatting** + - Results formatted into user-friendly message + - Includes property names and descriptions + - Returns "No matching properties found" if empty + +## Filter System Design + +### Filter Types +```typescript +type FilterOperator = + | '$eq' | '$ne' // Equality + | '$gt' | '$gte' // Greater than + | '$lt' | '$lte' // Less than + | '$in' | '$nin' // Inclusion + | '$exists' // Existence + | '$near'; // Proximity +``` + +### Filter Groups +```typescript +interface FilterGroup { + operator: 'AND' | 'OR'; + filters: (MetadataFilter | FilterGroup)[]; +} +``` + +## Current Limitations + +1. **Basic Implementation** + - No actual filtering in memory storage + - Returns all properties regardless of query + - Placeholder similarity scores + +2. **Search Capabilities** + - No fuzzy matching + - No relevance scoring + - No field weighting + +3. **Performance** + - No indexing + - Full scan of all properties + - No result caching + +## Future Enhancement Opportunities + +1. **Improved Filtering** + - Implement actual filter logic in MemoryPropertyStorage + - Add support for all filter operators + - Add fuzzy text matching + +2. **Performance Optimizations** + - Add indexing for common search fields + - Implement result caching + - Add pagination support + +3. **Search Features** + - Add relevance scoring + - Support field weighting + - Add aggregation support + - Implement geospatial search + +4. **Query Processing** + - Enhanced natural language parsing + - Query expansion + - Synonym matching diff --git a/packages/plugin-unreal/plugin-spreadsheet/docs/direct-search-flow.pdf b/packages/plugin-unreal/plugin-spreadsheet/docs/direct-search-flow.pdf new file mode 100644 index 00000000..d65d7946 Binary files /dev/null and b/packages/plugin-unreal/plugin-spreadsheet/docs/direct-search-flow.pdf differ diff --git a/packages/plugin-unreal/plugin-spreadsheet/docs/search-by-filters-analysis.md b/packages/plugin-unreal/plugin-spreadsheet/docs/search-by-filters-analysis.md new file mode 100644 index 00000000..9ab3be86 --- /dev/null +++ b/packages/plugin-unreal/plugin-spreadsheet/docs/search-by-filters-analysis.md @@ -0,0 +1,152 @@ +# SearchByFilters Service Analysis + +## Overview + +The `searchByFilters` service is a flexible and extensible search system designed for querying property data using a combination of filters and logical operators. It implements a MongoDB-like query language that allows for complex search criteria across multiple fields of property data. + +## Architecture + +### Core Components + +1. **FilterGroup Interface** + ```typescript + interface FilterGroup { + operator: 'AND' | 'OR'; + filters: (MetadataFilter | FilterGroup)[]; + } + ``` + - Represents a group of filters combined with a logical operator + - Supports nested filter groups for complex queries + - Uses AND/OR operators for logical combinations + +2. **MetadataFilter Interface** + ```typescript + interface MetadataFilter { + field: string; + operator: FilterOperator; + value: any; + } + ``` + - Defines individual search criteria + - Specifies which field to search + - Uses operators for comparison + +3. **FilterOperator Type** + ```typescript + type FilterOperator = + | '$eq' | '$ne' // Equality operators + | '$gt' | '$gte' // Greater than operators + | '$lt' | '$lte' // Less than operators + | '$in' | '$nin' // Array inclusion operators + | '$exists' // Existence check + | '$near'; // Proximity search + ``` + - MongoDB-style operators for flexible comparisons + - Supports range queries, equality checks, and more + +## Data Flow + +1. **Input Processing** + - Client constructs a FilterGroup object + - Filters can be combined using AND/OR operators + - Multiple filters can target different fields + +2. **Query Execution** + ```typescript + async searchByFilters(filters: FilterGroup): Promise + ``` + - Receives a FilterGroup object + - Processes nested filter groups recursively + - Applies filters to the property database + +3. **Result Generation** + ```typescript + interface SearchResult { + property: PropertyData; + similarity: number; + matchedFilters?: string[]; + } + ``` + - Returns matching properties + - Includes similarity scores + - Tracks which filters matched + +## Example Usage + +```typescript +// Example search query +const searchQuery = { + operator: 'OR', + filters: [ + { + field: 'description', + value: 'oceanfront', + operator: '$in' + }, + { + field: 'neighborhood', + value: 'Miami Beach', + operator: '$eq' + } + ] +}; + +const results = await storage.searchByFilters(searchQuery); +``` + +## Implementation Details + +### Current Implementation (Memory Storage) +- Basic implementation returns all properties +- Placeholder for more sophisticated filtering +- Ready for extension with real search logic + +### Future Enhancements +1. **Vector Search Integration** + - Support for semantic similarity search + - Integration with vector databases + - Hybrid search combining filters and vectors + +2. **Performance Optimizations** + - Index creation for frequently searched fields + - Query optimization for complex filter groups + - Caching frequently accessed results + +3. **Advanced Features** + - Fuzzy matching for text fields + - Geospatial queries using $near operator + - Aggregation pipeline support + +## Error Handling + +The service includes comprehensive error handling: +- Type validation for filter operators +- Field existence checks +- Value type verification +- Custom StorageError class with detailed error codes + +## Best Practices + +1. **Query Construction** + - Use appropriate operators for data types + - Combine filters logically + - Consider query performance + +2. **Error Handling** + - Handle StorageError exceptions + - Validate input before querying + - Check result validity + +3. **Performance** + - Limit result sets when possible + - Use appropriate indexes + - Monitor query execution time + +## Integration Points + +The service integrates with: +1. Property Storage System +2. Search Interface +3. Error Handling System +4. Type System +5. Validation Layer diff --git a/packages/plugin-unreal/plugin-spreadsheet/docs/search-by-filters-analysis.pdf b/packages/plugin-unreal/plugin-spreadsheet/docs/search-by-filters-analysis.pdf new file mode 100644 index 00000000..51ef9482 Binary files /dev/null and b/packages/plugin-unreal/plugin-spreadsheet/docs/search-by-filters-analysis.pdf differ diff --git a/packages/plugin-unreal/plugin-spreadsheet/docs/search-implementation.md b/packages/plugin-unreal/plugin-spreadsheet/docs/search-implementation.md new file mode 100644 index 00000000..642acb65 --- /dev/null +++ b/packages/plugin-unreal/plugin-spreadsheet/docs/search-implementation.md @@ -0,0 +1,213 @@ +# Property Search Implementation Plan + +## Overview +The property search system will consist of two main components: +1. **Filter-Based Search**: Exact matching and range queries on property attributes +2. **Semantic Search**: Finding properties based on natural language descriptions + +## 1. Filter-Based Search + +### Data Structure +```typescript +interface FilterOperator { + eq?: any; // Exact match + gt?: number; // Greater than + gte?: number; // Greater than or equal + lt?: number; // Less than + lte?: number; // Less than or equal + contains?: string; // String contains + in?: any[]; // Value in array +} + +interface PropertyFilter { + field: keyof PropertyData; + operator: FilterOperator; +} + +interface FilterGroup { + operator: 'AND' | 'OR'; + filters: (PropertyFilter | FilterGroup)[]; +} +``` + +### Implementation Steps + +1. **Create Filter Evaluator** + ```typescript + class FilterEvaluator { + evaluateFilter(property: PropertyData, filter: PropertyFilter): boolean; + evaluateFilterGroup(property: PropertyData, group: FilterGroup): boolean; + } + ``` + - Implement each operator type (eq, gt, lt, etc.) + - Support nested filter groups + - Add type checking for numeric vs string operations + +2. **Add Index Support** + ```typescript + interface PropertyIndex { + field: keyof PropertyData; + type: 'numeric' | 'string' | 'boolean'; + values: Map>; // value -> Set of property IDs + } + ``` + - Create indexes for commonly filtered fields + - Update indexes during CRUD operations + - Use indexes to optimize filter evaluation + +3. **Implement Filter Optimization** + - Reorder filters to use indexed fields first + - Combine overlapping range conditions + - Short-circuit evaluation for AND/OR groups + +## 2. Semantic Search + +### Components + +1. **Text Embedding** + ```typescript + interface TextEmbedding { + vector: number[]; + dimension: number; + } + + interface PropertyEmbeddings { + description: TextEmbedding; + combinedText: TextEmbedding; // name + neighborhood + description + } + ``` + +2. **Vector Storage** + ```typescript + interface VectorIndex { + vectors: Map; // propertyId -> embeddings + dimension: number; + } + ``` + +### Implementation Steps + +1. **Text Processing** + - Create text preprocessing pipeline + - Remove stop words + - Normalize text + - Extract key terms + - Generate combined text for each property + - Cache processed text + +2. **Vector Generation** + ```typescript + interface VectorGenerator { + generateVector(text: string): Promise; + batchGenerateVectors(texts: string[]): Promise; + } + ``` + - Use OpenAI embeddings API + - Implement batching for efficiency + - Add caching for common queries + +3. **Similarity Search** + ```typescript + interface SimilaritySearch { + findSimilar(query: number[], count: number): Promise; + findSimilarByText(text: string, count: number): Promise; + } + ``` + - Implement cosine similarity + - Add approximate nearest neighbor search for large datasets + - Support weighted combination of multiple embeddings + +## Integration Plan + +1. **Update MemoryPropertyStorage** +```typescript +class MemoryPropertyStorage { + private properties: Map; + private filterEvaluator: FilterEvaluator; + private vectorIndex: VectorIndex; + private propertyIndexes: Map; + + async searchProperties(options: SearchOptions): Promise { + const filterResults = await this.filterProperties(options.filters); + const vectorResults = await this.vectorSearch(options.query); + return this.combineResults(filterResults, vectorResults, options); + } +} +``` + +2. **Update PropertyStorageService** +```typescript +class PropertyStorageService { + async searchProperties(query: string, filters?: FilterGroup): Promise { + const searchOptions = await this.buildSearchOptions(query, filters); + return this.storage.searchProperties(searchOptions); + } +} +``` + +## Performance Considerations + +1. **Memory Usage** + - Implement vector quantization for embeddings + - Use sparse indexes for low-cardinality fields + - Add LRU cache for search results + +2. **Search Speed** + - Use approximate nearest neighbor search for vectors + - Optimize filter evaluation order + - Cache common query results + +3. **Update Performance** + - Batch index updates + - Lazy vector generation + - Background index maintenance + +## Testing Strategy + +1. **Unit Tests** + - Filter evaluation + - Vector similarity calculation + - Index maintenance + +2. **Integration Tests** + - Combined filter and vector search + - Large dataset performance + - Memory usage patterns + +3. **Performance Tests** + - Search latency benchmarks + - Memory usage monitoring + - Index update performance + +## Implementation Order + +1. Basic Filter Search (1-2 days) + - Implement FilterEvaluator + - Add basic property indexes + - Create filter optimization + +2. Vector Search (2-3 days) + - Add vector generation + - Implement similarity search + - Create vector indexes + +3. Integration (1-2 days) + - Combine filter and vector search + - Add result ranking + - Implement caching + +4. Optimization (2-3 days) + - Add performance monitoring + - Optimize memory usage + - Implement advanced indexing + +## Dependencies Required + +```json +{ + "@ai16z/eliza": "workspace:*", + "cosine-similarity": "^1.0.0", + "vector-quantize": "^1.0.0", + "lru-cache": "^7.0.0" +} +``` diff --git a/packages/plugin-unreal/plugin-spreadsheet/docs/semantic_search_explained.md b/packages/plugin-unreal/plugin-spreadsheet/docs/semantic_search_explained.md new file mode 100644 index 00000000..1cb99477 --- /dev/null +++ b/packages/plugin-unreal/plugin-spreadsheet/docs/semantic_search_explained.md @@ -0,0 +1,267 @@ +# Understanding Semantic Search in Real Estate 🏢 + +This guide explains how our semantic search plugin helps find properties using natural language queries. We'll break down the process using real examples and visualizations. + +## Table of Contents +- [Basic Concepts](#basic-concepts) +- [How It Works](#how-it-works) +- [Real-World Examples](#real-world-examples) +- [Advanced Features](#advanced-features) +- [Technical Deep Dive](#technical-deep-dive) + +## Basic Concepts + +### What is Semantic Search? 🔍 +Unlike traditional search that looks for exact matches, semantic search understands the meaning of your query. For example: + +``` +Traditional: "height > 300 AND ocean_distance < 500" +Semantic: "tall buildings near the ocean" +``` + +Both searches find the same properties, but semantic search lets you ask naturally! + +### Property Data Structure 📊 +Each property in our database has these key attributes: + +```typescript +interface PropertyData { + name: string; // Building name + neighborhood: string; // Location + zoningType: string; // Residential, Commercial, etc. + plotSize: string; // Giga, Mega, etc. + buildingSize: string; // Megatall, Supertall, etc. + maxFloors: number; // Number of floors + minFloors: number; // For buildings with varying heights + plotArea: number; // Land size in square meters + maxBuildingHeight: number; // Height in meters + minBuildingHeight: number; // For buildings with varying heights + oceanDistanceMeters: number; // Distance to ocean + bayDistanceMeters: number; // Distance to bay +} +``` + +## How It Works + +### 1. Query Understanding 🧠 +When you search, the AI first breaks down your query into structured filters: + +```javascript +Query: "Find tall buildings near the ocean in Nexus or Flashing Lights" + +// Gets converted to: +{ + "operator": "AND", + "filters": [ + { + "field": "maxBuildingHeight", + "operator": "$gte", + "value": 300 + }, + { + "field": "oceanDistanceMeters", + "operator": "$lte", + "value": 500 + }, + { + "operator": "OR", + "filters": [ + { + "field": "neighborhood", + "operator": "$eq", + "value": "Nexus" + }, + { + "field": "neighborhood", + "operator": "$eq", + "value": "Flashing Lights" + } + ] + } + ] +} +``` + +### 2. Vector Search 🎯 +The system converts text descriptions into number vectors that capture meaning: + +```javascript +// Your query: "oceanfront property with lots of floors" +// Gets converted to vector (simplified): +[0.2, -0.5, 0.8, 0.1, -0.3] + +// Property descriptions are also vectors: +{ + "NX-1": { + description: "Skyline Tower is a megatall building right by the ocean...", + vector: [0.21, -0.48, 0.79, 0.15, -0.28] // Similar = Good match! + }, + "FL-7": { + description: "Mountain View Plaza is far from water...", + vector: [-0.6, 0.3, -0.2, -0.4, 0.5] // Different = Bad match + } +} +``` + +## Real-World Examples + +### Example 1: Simple Search 🏗️ +```javascript +Query: "Find tall buildings near the ocean" + +Results: +1. NX-1 (Skyline Tower) + - Height: 455m ✓ + - Ocean Distance: 294m ✓ + - Match Score: 0.92 + +2. FL-192 (Ocean Heights) + - Height: 464m ✓ + - Ocean Distance: 317m ✓ + - Match Score: 0.89 + +3. FL-163 (Coastal Plaza) + - Height: 421m ✓ + - Ocean Distance: 462m ✓ + - Match Score: 0.85 +``` + +### Example 2: Complex Query 🌇 +```javascript +Query: "residential buildings in Nexus with at least 100 floors that are either near the ocean or near the bay" + +Parsed Filters: +{ + "operator": "AND", + "filters": [ + { + "field": "zoningType", + "operator": "$eq", + "value": "Residential" + }, + { + "field": "neighborhood", + "operator": "$eq", + "value": "Nexus" + }, + { + "field": "maxFloors", + "operator": "$gte", + "value": 100 + }, + { + "operator": "OR", + "filters": [ + { + "field": "oceanDistanceMeters", + "operator": "$lte", + "value": 500 + }, + { + "field": "bayDistanceMeters", + "operator": "$lte", + "value": 500 + } + ] + } + ] +} + +Results: +1. NX-1 (Skyline Tower) + - Zoning: Residential ✓ + - Neighborhood: Nexus ✓ + - Floors: 113 ✓ + - Ocean Distance: 294m ✓ + - Bay Distance: 850m + - Match Score: 0.94 + +2. NX-7 (Bay View Residences) + - Zoning: Residential ✓ + - Neighborhood: Nexus ✓ + - Floors: 105 ✓ + - Ocean Distance: 712m + - Bay Distance: 382m ✓ + - Match Score: 0.88 +``` + +### Example 3: Fuzzy Matching 🔮 +The system understands various ways to ask for the same thing: + +```javascript +// All these queries find the same properties: +"tall buildings by the water" +"skyscrapers near ocean" +"high-rise properties close to the sea" +"buildings over 300m height near coast" +``` + +## Advanced Features + +### 1. Complex Logic 🧮 +You can combine multiple conditions with AND/OR logic: + +```javascript +Query: "Find properties that are either: + - In Nexus with more than 100 floors + - OR in Flashing Lights near the ocean" + +// System understands this complex logic! +``` + +### 2. Smart Defaults 📏 +The system uses sensible defaults for common terms: +- "tall" → height ≥ 300m +- "near water" → distance ≤ 500m +- "large plot" → area ≥ 5000m² + +### 3. Ranking 📊 +Results are ranked by: +1. Vector similarity (how well they match the query) +2. How many filters they match +3. How close they are to ideal values + +## Technical Deep Dive + +### Vector Search Implementation 🔬 +```typescript +async function findSimilarProperties(query: string, properties: Property[]) { + // 1. Convert query to vector + const queryVector = await embedText(query); + + // 2. Calculate similarity with each property + const scored = properties.map(property => ({ + property, + similarity: cosineSimilarity( + queryVector, + property.vector + ) + })); + + // 3. Sort by similarity + return scored.sort((a, b) => + b.similarity - a.similarity + ); +} +``` + +### Filter Application Logic 🔧 +```typescript +function applyFilters(property: Property, filters: FilterGroup): boolean { + return filters.operator === "AND" + ? filters.filters.every(f => checkFilter(property, f)) + : filters.filters.some(f => checkFilter(property, f)); +} + +function checkFilter(property: Property, filter: Filter): boolean { + const value = property[filter.field]; + switch (filter.operator) { + case "$gte": return value >= filter.value; + case "$lte": return value <= filter.value; + case "$eq": return value === filter.value; + // ... other operators + } +} +``` + +This is just the beginning! The semantic search system continues to learn and improve, understanding more complex queries and providing better matches over time. 🚀 diff --git a/packages/plugin-unreal/plugin-spreadsheet/docs/unreal2/architecture_analysis.md b/packages/plugin-unreal/plugin-spreadsheet/docs/unreal2/architecture_analysis.md new file mode 100644 index 00000000..ebb370f3 --- /dev/null +++ b/packages/plugin-unreal/plugin-spreadsheet/docs/unreal2/architecture_analysis.md @@ -0,0 +1,92 @@ +# Unreal Agent 2 Architecture Analysis + +## Current Design + +Our current implementation in `plugin-spreadsheet` is correctly positioned as a plugin because: + +1. It extends Eliza's functionality beyond basic database operations +2. It provides specialized property search and management features +3. It handles business logic specific to real estate data +4. It integrates with the vector search capabilities provided by the PostgreSQL adapter + +## Design Validation + +### What We Got Right +1. **Plugin Architecture** + - We're building on top of the database adapter rather than replacing it + - We're adding domain-specific functionality (property search, metadata management) + - We're using the adapter's vector search capabilities rather than reimplementing them + +2. **Service Layer** + - Our `PropertyStorageService` acts as a high-level interface + - It abstracts away the database implementation details + - It provides business-logic specific to property management + +### Proceeding with Current Plan + +We can proceed with the Unreal Agent 2 feature development as planned because: + +1. **Correct Abstraction Level** + ```typescript + // We're building on top of the adapter, not replacing it + class PropertyStorageService extends Service { + private storage: BasePropertyStorage; + // High-level property operations + } + ``` + +2. **Clear Separation of Concerns** + - Adapter (PostgreSQL): Handles raw database operations and vector search + - Plugin (Unreal Agent 2): Handles property-specific logic and features + +3. **Extensible Architecture** + ```typescript + // Our plugin can easily add new features without modifying the adapter + interface PropertyStorage { + searchByFilters(filters: FilterGroup): Promise; + searchByVector(vector: number[], options: SearchOptions): Promise; + // Future: Add more property-specific operations + } + ``` + +## Moving Forward + +### Phase 1: Implement Current Plan +1. Continue with test implementation as outlined +2. Build property management features +3. Implement vector search integration + +### Phase 2: Future Enhancements +1. Add more plugin-specific features: + - Custom property analyzers + - Domain-specific search algorithms + - Real estate market analytics + +### Phase 3: Potential Refactoring +If needed, we could: +1. Extract common vector search patterns into a shared library +2. Create specialized property-vector interfaces +3. Add more real estate specific functionality + +## Conclusion + +Our current design aligns well with Eliza's plugin architecture. We're building on top of the database adapter rather than trying to replace it, which is exactly what a plugin should do. We can proceed with the current plan and make any necessary adjustments later without major architectural changes. + +## Recommendations + +1. **Continue Development** + - Proceed with current test plan + - Implement planned features + - Build on existing adapter capabilities + +2. **Document Boundaries** + - Clearly document where adapter functionality ends and plugin features begin + - Maintain clean separation of concerns + - Keep plugin-specific logic isolated + +3. **Future-Proofing** + - Design for potential adapter changes + - Keep business logic independent of database implementation + - Plan for extensibility + +The current architecture is solid and aligns with Eliza's design principles. We can proceed with confidence and adjust course later if needed. diff --git a/packages/plugin-unreal/plugin-spreadsheet/docs/unreal2/architecture_analysis.pdf b/packages/plugin-unreal/plugin-spreadsheet/docs/unreal2/architecture_analysis.pdf new file mode 100644 index 00000000..087a8f9b Binary files /dev/null and b/packages/plugin-unreal/plugin-spreadsheet/docs/unreal2/architecture_analysis.pdf differ diff --git a/packages/plugin-unreal/plugin-spreadsheet/docs/unreal2/memory-integration-tests.md b/packages/plugin-unreal/plugin-spreadsheet/docs/unreal2/memory-integration-tests.md new file mode 100644 index 00000000..74af0fae --- /dev/null +++ b/packages/plugin-unreal/plugin-spreadsheet/docs/unreal2/memory-integration-tests.md @@ -0,0 +1,187 @@ +# Memory Integration Tests Documentation + +## Current Implementation (memory-integration.test.ts) + +### Overview +The current test suite focuses on testing the low-level memory and knowledge management functionality, particularly around storing and retrieving property data using vector embeddings. + +### Key Components + +1. **Test Setup** + - Uses PostgresDatabaseAdapter for database operations + - Configures OpenAI embeddings + - Sets up a runtime with memory managers for: + - General memories + - Documents + - Knowledge fragments + +2. **Test Cases** + - `should store and retrieve property data as memories` + - Creates a test property with detailed real estate information + - Converts property to text format + - Stores it using knowledge.set() + - Retrieves using knowledge.get() + - Verifies basic property information + + - `should retrieve property data with different query types` + - Tests exact name matching + - Tests location-based queries + - Tests feature-based queries + +### Limitations +1. Tests only low-level functionality +2. Direct dependency on knowledge.get/set APIs +3. Limited validation of property metadata +4. No error case handling +5. No cleanup between tests + +## Next Generation (memory-integration.test2.ts) + +### Design Goals +1. Test higher-level service APIs +2. Better isolation between tests +3. More comprehensive test coverage +4. Better error handling +5. Cleaner test organization + +### Proposed Structure + +```typescript +describe('PropertyStorageService Integration', () => { + let propertyService: PropertyStorageService; + let runtime: IAgentRuntime; + + beforeAll(async () => { + // Setup database and runtime + }); + + beforeEach(async () => { + // Clear test data + await propertyService.clear(); + }); + + describe('Property Storage Operations', () => { + it('should store and retrieve a single property'); + it('should handle bulk property loading'); + it('should update existing properties'); + it('should delete properties'); + }); + + describe('Property Search Operations', () => { + beforeEach(async () => { + // Load test dataset + }); + + it('should search by exact property name'); + it('should search by location'); + it('should search by price range'); + it('should search by multiple filters'); + it('should handle fuzzy matching'); + }); + + describe('Vector Search Operations', () => { + it('should find similar properties by description'); + it('should find properties by amenities'); + it('should rank results by relevance'); + }); + + describe('Error Handling', () => { + it('should handle invalid property data'); + it('should handle missing required fields'); + it('should handle duplicate properties'); + it('should handle invalid search criteria'); + }); +}); +``` + +### Key Improvements + +1. **Service Layer Testing** + - Focus on PropertyStorageService instead of direct knowledge API calls + - Test business logic and data transformations + - Validate service-level error handling + +2. **Test Organization** + - Grouped by functionality + - Clear setup and teardown + - Isolated test cases + +3. **Data Validation** + - Comprehensive property validation + - Metadata verification + - Search result ranking validation + +4. **Error Cases** + - Invalid data handling + - Missing field handling + - Duplicate handling + - Search edge cases + +5. **Performance Testing** + - Bulk operation testing + - Search performance with large datasets + - Vector search optimization + +### Implementation Steps + +1. **Setup Phase** + - Create test utilities for property data generation + - Setup database cleanup routines + - Configure test environment + +2. **Basic Operations** + - Implement CRUD operation tests + - Add data validation + - Test error handling + +3. **Search Operations** + - Implement filter-based search tests + - Add vector search tests + - Test result ranking + +4. **Edge Cases** + - Add error condition tests + - Test boundary conditions + - Validate error messages + +5. **Performance** + - Add bulk operation tests + - Measure search performance + - Test optimization strategies + +### Best Practices + +1. **Test Independence** + - Each test should be self-contained + - Clear setup and teardown + - No shared state between tests + +2. **Clear Assertions** + - Specific, meaningful assertions + - Clear error messages + - Comprehensive validation + +3. **Test Data** + - Use realistic test data + - Cover edge cases + - Include invalid data tests + +4. **Documentation** + - Clear test descriptions + - Document test data requirements + - Document expected behavior + +5. **Maintenance** + - Keep tests focused + - Avoid test duplication + - Regular cleanup of test data + +## Migration Strategy + +1. Create new test file alongside existing tests +2. Implement new tests incrementally +3. Validate both test suites pass +4. Gradually migrate functionality +5. Remove deprecated tests + +This approach ensures we maintain test coverage while improving our testing infrastructure. diff --git a/packages/plugin-unreal/plugin-spreadsheet/docs/unreal2/opensea_adapter_concept.md b/packages/plugin-unreal/plugin-spreadsheet/docs/unreal2/opensea_adapter_concept.md new file mode 100644 index 00000000..3b0f3fba --- /dev/null +++ b/packages/plugin-unreal/plugin-spreadsheet/docs/unreal2/opensea_adapter_concept.md @@ -0,0 +1,122 @@ +# OpenSea Adapter Concept + +## Overview +An adapter to integrate OpenSea's NFT marketplace with Eliza's vector search capabilities, enabling semantic NFT search and analysis. + +## Key Features + +### Vector Search Integration +```typescript +interface NFTVectorData { + imageEmbedding: number[]; // CLIP or similar embedding for NFT image + descriptionEmbedding: number[]; // Text embedding for description + metadataEmbedding: number[]; // Combined metadata embedding +} + +interface NFTMetadata { + collection: string; + traits: Record; + rarity: number; + lastSalePrice?: number; + currentListingPrice?: number; +} +``` + +### Hybrid Search Capabilities +```typescript +interface OpenSeaSearchParams { + // Vector search + similarImage?: string; // Base64 or URL + description?: string; // Natural language description + + // Traditional filters + collections?: string[]; + priceRange?: [number, number]; + traits?: Record; + + // Ranking options + rankBy?: 'price' | 'rarity' | 'similarity' | 'trending'; +} +``` + +### Real-time Market Integration +```typescript +interface MarketActivity { + type: 'LISTING' | 'SALE' | 'BID' | 'TRANSFER'; + timestamp: Date; + price?: number; + from: string; + to: string; + token: { + id: string; + collection: string; + }; +} + +// Real-time event subscription +interface MarketStream { + subscribeToCollection(collection: string): AsyncIterator; + subscribeToToken(tokenId: string): AsyncIterator; +} +``` + +## Unique Capabilities + +1. **Semantic NFT Search** + - Find visually similar NFTs + - Search by description or concept + - Combine with traditional filters + +2. **Market Intelligence** + - Track price trends + - Monitor collection activity + - Analyze rarity patterns + +3. **AI-Enhanced Features** + - Generate NFT descriptions + - Predict price trends + - Identify similar collections + +## Example Usage + +```typescript +// Find anime-style NFTs with similar art style +const results = await openSeaAdapter.search({ + similarImage: "base64_image_data", + collections: ["azuki", "clonex"], + priceRange: [1, 10] // in ETH +}); + +// Monitor high-value sales +const salesStream = openSeaAdapter.subscribeToMarket({ + minPrice: 100, // ETH + collections: ["cryptopunks", "bayc"] +}); + +// Find thematically similar NFTs +const similar = await openSeaAdapter.findSimilar({ + tokenId: "123", + collection: "doodles", + byStyle: true, + byTheme: true +}); +``` + +## Future Potential + +1. **Cross-Chain Integration** + - Support multiple blockchains + - Bridge different NFT standards + - Unified search across chains + +2. **AI-Powered Analysis** + - Style transfer between collections + - Trend prediction + - Rarity analysis + +3. **Community Features** + - Collaborative filtering + - Social signals integration + - Community-driven tagging + +This adapter would bridge the gap between traditional NFT marketplaces and AI-powered semantic search, enabling entirely new ways to discover and analyze digital assets. diff --git a/packages/plugin-unreal/plugin-spreadsheet/docs/unreal2/opensea_adapter_concept.pdf b/packages/plugin-unreal/plugin-spreadsheet/docs/unreal2/opensea_adapter_concept.pdf new file mode 100644 index 00000000..d85530d5 Binary files /dev/null and b/packages/plugin-unreal/plugin-spreadsheet/docs/unreal2/opensea_adapter_concept.pdf differ diff --git a/packages/plugin-unreal/plugin-spreadsheet/docs/unreal2/unreal_agent2_test_plan.md b/packages/plugin-unreal/plugin-spreadsheet/docs/unreal2/unreal_agent2_test_plan.md new file mode 100644 index 00000000..30c0245b --- /dev/null +++ b/packages/plugin-unreal/plugin-spreadsheet/docs/unreal2/unreal_agent2_test_plan.md @@ -0,0 +1,283 @@ +# Unreal Agent 2 Test Implementation Plan + +## Overview + +Unreal Agent 2 represents our next-generation property data management system, focusing on enhanced vector search capabilities and improved data organization. This document outlines our test-driven development approach. + +## Core Components to Test + +### 1. Property Data Management +- Property storage and retrieval +- Vector embedding generation +- Metadata management +- Data versioning + +### 2. Vector Search Engine +- Semantic similarity search +- Multi-modal property matching +- Context-aware ranking +- Hybrid search (combining vector and traditional search) + +### 3. Query Processing +- Natural language query parsing +- Query vector generation +- Query context management +- Result filtering and ranking + +## Test Implementation Strategy + +### Phase 1: Basic Infrastructure Tests + +```typescript +describe('UnrealAgent2 Infrastructure', () => { + describe('Runtime Setup', () => { + it('should initialize with correct embedding model'); + it('should connect to vector database'); + it('should handle configuration changes'); + }); + + describe('Data Storage', () => { + it('should store property with vector embeddings'); + it('should maintain property metadata'); + it('should handle data versioning'); + }); +}); +``` + +### Phase 2: Vector Search Core + +```typescript +describe('UnrealAgent2 Vector Search', () => { + describe('Embedding Generation', () => { + it('should generate consistent embeddings'); + it('should handle multi-modal inputs'); + it('should normalize vectors correctly'); + }); + + describe('Similarity Search', () => { + it('should find semantically similar properties'); + it('should rank by relevance score'); + it('should handle hybrid search queries'); + }); +}); +``` + +### Phase 3: Query Processing + +```typescript +describe('UnrealAgent2 Query Processing', () => { + describe('Natural Language Processing', () => { + it('should extract key property attributes'); + it('should understand location context'); + it('should handle price ranges'); + }); + + describe('Query Transformation', () => { + it('should convert queries to vector space'); + it('should maintain query context'); + it('should handle multi-part queries'); + }); +}); +``` + +## Detailed Test Cases + +### 1. Property Storage Tests + +```typescript +interface TestProperty { + id: string; + name: string; + location: { + address: string; + coordinates: [number, number]; + }; + features: string[]; + description: string; + metadata: { + lastUpdated: Date; + version: number; + }; +} + +describe('Property Storage', () => { + let agent: UnrealAgent2; + let testProperty: TestProperty; + + beforeEach(async () => { + testProperty = { + id: 'test-1', + name: 'Luxury Oceanfront Villa', + location: { + address: '123 Ocean Drive, Miami Beach', + coordinates: [25.7617, -80.1918] + }, + features: ['oceanfront', 'luxury', 'villa'], + description: 'Stunning oceanfront property with...', + metadata: { + lastUpdated: new Date(), + version: 1 + } + }; + }); + + it('should store property with vector embedding', async () => { + const result = await agent.storeProperty(testProperty); + expect(result.embedding).toBeDefined(); + expect(result.embedding.length).toBe(1536); // OpenAI embedding size + }); + + it('should retrieve property with context', async () => { + const context = { + userLocation: [25.7617, -80.1918], + preferences: ['luxury', 'oceanfront'] + }; + const result = await agent.getProperty(testProperty.id, context); + expect(result.relevanceScore).toBeGreaterThan(0.8); + }); +}); +``` + +### 2. Vector Search Tests + +```typescript +describe('Vector Search', () => { + describe('Semantic Search', () => { + it('should find properties by description', async () => { + const query = 'modern beachfront property with ocean views'; + const results = await agent.semanticSearch(query); + expect(results[0].similarity).toBeGreaterThan(0.7); + }); + + it('should handle location-aware search', async () => { + const query = 'properties near the beach'; + const context = { + location: 'Miami Beach', + radius: '5km' + }; + const results = await agent.contextualSearch(query, context); + expect(results).toSatisfyAll(result => + result.location.distance <= 5000 + ); + }); + }); + + describe('Hybrid Search', () => { + it('should combine vector and metadata search', async () => { + const query = { + description: 'luxury waterfront property', + filters: { + priceRange: [1000000, 5000000], + location: 'Miami Beach' + } + }; + const results = await agent.hybridSearch(query); + expect(results).toMatchSearchCriteria(query); + }); + }); +}); +``` + +### 3. Query Processing Tests + +```typescript +describe('Query Processing', () => { + describe('Natural Language Understanding', () => { + it('should extract property attributes', async () => { + const query = 'find me a modern 3-bedroom house near the beach under 2M'; + const parsed = await agent.parseQuery(query); + expect(parsed).toEqual({ + propertyType: 'house', + bedrooms: 3, + style: 'modern', + location: 'near beach', + maxPrice: 2000000 + }); + }); + + it('should handle complex queries', async () => { + const query = 'luxury condos in Miami Beach with ocean views and a pool, between 1-3M'; + const parsed = await agent.parseQuery(query); + expect(parsed).toMatchObject({ + propertyType: 'condo', + features: ['ocean views', 'pool'], + location: 'Miami Beach', + priceRange: [1000000, 3000000], + style: 'luxury' + }); + }); + }); +}); +``` + +## Implementation Phases + +### Phase 1: Foundation (Week 1) +1. Set up test infrastructure +2. Implement basic property storage tests +3. Add vector embedding generation tests +4. Create test data generators + +### Phase 2: Core Features (Week 2) +1. Implement vector search tests +2. Add similarity scoring tests +3. Create hybrid search tests +4. Add basic query processing tests + +### Phase 3: Advanced Features (Week 3) +1. Implement context-aware search tests +2. Add multi-modal search tests +3. Create complex query processing tests +4. Add performance benchmarks + +### Phase 4: Integration (Week 4) +1. Implement end-to-end tests +2. Add error handling tests +3. Create load tests +4. Add integration tests with other services + +## Test Data Strategy + +### 1. Property Dataset +- Create a diverse set of test properties +- Include various property types +- Cover different price ranges +- Include multiple locations + +### 2. Query Dataset +- Create realistic user queries +- Include edge cases +- Cover multiple search intents +- Include location-specific queries + +### 3. Context Dataset +- Create user context scenarios +- Include location contexts +- Add preference profiles +- Include search history + +## Success Criteria + +1. **Coverage** + - 90%+ test coverage + - All core features tested + - Edge cases covered + +2. **Performance** + - Search results < 200ms + - Embedding generation < 500ms + - Query parsing < 100ms + +3. **Quality** + - Relevant search results + - Accurate query parsing + - Proper error handling + +## Next Steps + +1. Create test data generators +2. Set up test infrastructure +3. Implement Phase 1 tests +4. Review and iterate on test cases + +This test plan will evolve as we implement and learn more about the system's requirements and behavior. diff --git a/packages/plugin-unreal/plugin-spreadsheet/docs/unreal2/unreal_agent2_test_plan.pdf b/packages/plugin-unreal/plugin-spreadsheet/docs/unreal2/unreal_agent2_test_plan.pdf new file mode 100644 index 00000000..0ccfa01c Binary files /dev/null and b/packages/plugin-unreal/plugin-spreadsheet/docs/unreal2/unreal_agent2_test_plan.pdf differ diff --git a/packages/plugin-unreal/plugin-spreadsheet/examples/detailed_properties.csv b/packages/plugin-unreal/plugin-spreadsheet/examples/detailed_properties.csv new file mode 100644 index 00000000..2d17d100 --- /dev/null +++ b/packages/plugin-unreal/plugin-spreadsheet/examples/detailed_properties.csv @@ -0,0 +1,11 @@ +Rank,Name,Neighborhood,Zoning Type,Plot Size,Building Size,Distance to Ocean,Distance to Bay,Max # of Floors,Min # of Floors,Plot Area (m²),Min Building Height (m),Max Building Height (m),Distance to Ocean (m),Distance to Bay (m) +1,NX-1,Nexus,Residential,Giga,Megatall,Very Close,Far,113,95,12500,380,455,294,850 +2,FL-163,Flashing Lights,Mixed Use,Mega,Megatall,Close,Medium,105,88,8900,350,421,462,623 +3,FL-192,Flashing Lights,Commercial,Mega,Megatall,Very Close,Far,116,98,9200,385,464,317,912 +4,NX-7,Nexus,Residential,Mega,Supertall,Far,Close,105,90,7800,320,380,712,382 +5,FL-141,Flashing Lights,Mixed Use,Ultra,Megatall,Far,Very Close,105,87,15000,345,418,823,284 +6,NX-12,Nexus,Commercial,Mega,Supertall,Medium,Medium,98,82,8100,310,365,545,578 +7,FL-227,Flashing Lights,Residential,Giga,Megatall,Close,Far,108,91,11800,360,432,488,867 +8,NX-3,Nexus,Mixed Use,Ultra,Megatall,Very Close,Medium,110,93,14200,370,445,276,634 +9,FL-156,Flashing Lights,Commercial,Mega,Supertall,Medium,Close,95,80,8500,300,358,567,412 +10,NX-9,Nexus,Residential,Mega,Supertall,Far,Very Close,102,85,7900,315,375,789,298 diff --git a/packages/plugin-unreal/plugin-spreadsheet/examples/properties.csv b/packages/plugin-unreal/plugin-spreadsheet/examples/properties.csv new file mode 100644 index 00000000..c4796693 --- /dev/null +++ b/packages/plugin-unreal/plugin-spreadsheet/examples/properties.csv @@ -0,0 +1,9 @@ +Rank,Name,Neighborhood,Zoning Type,Plot Size,Building Size,Distance to Ocean,Distance to Bay,Max # of Floors,Min # of Floors,Plot Area (m²),Min Building Height (m),Max Building Height (m),Distance to Ocean (m),Distance to Bay (m) +1,NX-1,Nexus,Legendary,Giga,Megatall,Close,Far,113,91,8696,455,568,294,1052 +2,FL-163,Flashing Lights,Legendary,Giga,Megatall,Medium,Far,105,84,12473,421,526,462,1191 +2,FL-192,Flashing Lights,Legendary,Giga,Megatall,Medium,Far,116,92,8696,464,580,317,1215 +4,FL-141,Flashing Lights,Legendary,Giga,Megatall,Far,Medium,105,84,13252,421,526,2413,577 +4,FL-162,Flashing Lights,Legendary,Giga,Megatall,Far,Medium,111,89,13901,446,557,1966,548 +6,FL-68,Flashing Lights,Legendary,Giga,Megatall,Far,Far,118,94,13901,474,592,761,1019 +6,FL-112,Flashing Lights,Legendary,Giga,Megatall,Far,Far,107,85,28145,429,536,818,1091 +6,FL-142,Flashing Lights,Legendary,Giga,Megatall,Far,Far,105,84,18064,421,526,1184,731 diff --git a/packages/plugin-unreal/plugin-spreadsheet/examples/simple_demo.js b/packages/plugin-unreal/plugin-spreadsheet/examples/simple_demo.js new file mode 100644 index 00000000..9dcb3ced --- /dev/null +++ b/packages/plugin-unreal/plugin-spreadsheet/examples/simple_demo.js @@ -0,0 +1,114 @@ +// This is a simplified demo to show how the semantic search works +const fs = require('fs'); +const path = require('path'); + +// Simulate vector similarity search +function findSimilarProperties(query, properties) { + // In reality, we would: + // 1. Convert query to a vector using AI + // 2. Find properties with similar vectors + // This is a simplified version: + return properties.filter(property => { + let matches = 0; + let conditions = 0; + + // Check height condition + if (query.includes('tall')) { + conditions++; + if (property.maxBuildingHeight >= 300) matches++; + } + + // Check ocean proximity + if (query.includes('ocean')) { + conditions++; + if (property.oceanDistanceMeters <= 500) matches++; + } + + // Check neighborhood + if (query.includes('Nexus')) { + conditions++; + if (property.neighborhood === 'Nexus') matches++; + } + if (query.includes('Flashing Lights')) { + conditions++; + if (property.neighborhood === 'Flashing Lights') matches++; + } + + // Check floors + if (query.includes('floors')) { + conditions++; + if (property.maxFloors >= 100) matches++; + } + + // Calculate match score (0 to 1) + property.score = conditions > 0 ? matches / conditions : 0; + + // Return true if at least half of conditions match + return property.score >= 0.5; + }).sort((a, b) => b.score - a.score); +} + +// Load and parse CSV +function loadProperties() { + const csvPath = path.join(__dirname, 'detailed_properties.csv'); + const csvContent = fs.readFileSync(csvPath, 'utf-8'); + const lines = csvContent.split('\n'); + const headers = lines[0].split(','); + + return lines.slice(1) // Skip header + .filter(line => line.trim()) // Skip empty lines + .map(line => { + const values = line.split(','); + return { + name: values[1], + neighborhood: values[2], + zoningType: values[3], + plotSize: values[4], + buildingSize: values[5], + maxFloors: parseInt(values[8] || '0'), + minFloors: parseInt(values[9] || '0'), + plotArea: parseFloat(values[10] || '0'), + maxBuildingHeight: parseFloat(values[12] || '0'), + oceanDistanceMeters: parseFloat(values[13] || '0'), + bayDistanceMeters: parseFloat(values[14] || '0') + }; + }); +} + +async function runDemo() { + // 1. Load properties + console.log('1️⃣ Loading properties...'); + const properties = loadProperties(); + console.log(` Loaded ${properties.length} properties\n`); + + // 2. Example queries + const queries = [ + 'Find tall buildings near the ocean', + 'Show me properties in Nexus with at least 100 floors', + 'Find buildings in Flashing Lights near the ocean', + 'Show me the tallest buildings in either Nexus or Flashing Lights' + ]; + + // 3. Run each query + for (const query of queries) { + console.log('\n' + '='.repeat(80)); + console.log(`2️⃣ Searching: "${query}"`); + + const matches = findSimilarProperties(query, properties); + + console.log('\n3️⃣ Top matches:'); + matches.slice(0, 3).forEach((property, i) => { + console.log(`\n🏢 Building ${i + 1} (Match Score: ${property.score.toFixed(2)}):`); + console.log(` Name: ${property.name}`); + console.log(` Location: ${property.neighborhood}`); + console.log(` Type: ${property.zoningType}`); + console.log(` Building: ${property.buildingSize}, ${property.maxBuildingHeight}m tall`); + console.log(` Floors: ${property.minFloors}-${property.maxFloors} floors`); + console.log(` Plot: ${property.plotSize}, ${property.plotArea}m²`); + console.log(` Distances: ${property.oceanDistanceMeters}m to ocean, ${property.bayDistanceMeters}m to bay`); + }); + } +} + +// Run demo +runDemo().catch(console.error); diff --git a/packages/plugin-unreal/plugin-spreadsheet/examples/test.md b/packages/plugin-unreal/plugin-spreadsheet/examples/test.md new file mode 100644 index 00000000..5ca720b2 --- /dev/null +++ b/packages/plugin-unreal/plugin-spreadsheet/examples/test.md @@ -0,0 +1,65 @@ +import { AgentRuntime } from "@ai16z/eliza"; +import { spreadsheetPlugin } from "../src"; +import * as fs from "fs"; +import * as path from "path"; + +async function runDemo() { + // Create runtime instance + const runtime = new AgentRuntime({ + agentId: "test-agent", + settings: {} + }); + + // Load the properties CSV + const csvPath = path.join(__dirname, "properties.csv"); + const csvContent = fs.readFileSync(csvPath, "utf-8"); + + // Load data into vector store + const loadResult = await spreadsheetPlugin.actions[0].handler(runtime, { + content: csvContent, + namespace: "properties" + }); + console.log("Load result:", loadResult); + + // Example queries demonstrating complex filtering + const queries = [ + // Simple queries + "Find tall buildings near the ocean", + "Show me large plots in the Nexus neighborhood", + + // Complex AND/OR queries + "Find properties in Nexus or Flashing Lights with at least 100 floors", + "Show buildings that are either close to the ocean (within 300m) or have more than 110 floors", + + // Multi-criteria queries + "Find residential properties with large plots (>5000m²) that are either near the ocean (<500m) or near the bay (<800m)", + "Show me megatall buildings in Nexus that have either more than 100 floors or are within 400m of the ocean" + ]; + + // Run each query and analyze results + for (const query of queries) { + console.log("\n" + "=".repeat(80)); + console.log("Query:", query); + const results = await spreadsheetPlugin.actions[1].handler(runtime, { + query, + namespace: "properties", + limit: 3 + }); + + // Display results with applied filters + console.log("\nApplied Filters:", JSON.stringify(results[0]?.appliedFilters, null, 2)); + + results.forEach((result, i) => { + const prop = result.property; + console.log(`\nResult ${i + 1} (similarity: ${result.similarity?.toFixed(3)})`); + console.log(`Name: ${prop.name}`); + console.log(`Location: ${prop.neighborhood}`); + console.log(`Building: ${prop.maxFloors} floors, ${prop.maxBuildingHeight}m tall`); + console.log(`Plot: ${prop.plotArea}m², ${prop.plotSize}`); + console.log(`Distances: ${prop.oceanDistanceMeters}m to ocean, ${prop.bayDistanceMeters}m to bay`); + console.log(`Description: ${result.description}`); + }); + } +} + +runDemo().catch(console.error); diff --git a/packages/plugin-unreal/plugin-spreadsheet/jest.config.js b/packages/plugin-unreal/plugin-spreadsheet/jest.config.js new file mode 100644 index 00000000..ab2f9044 --- /dev/null +++ b/packages/plugin-unreal/plugin-spreadsheet/jest.config.js @@ -0,0 +1,17 @@ +/** @type {import('ts-jest').JestConfigWithTsJest} */ +module.exports = { + preset: 'ts-jest', + testEnvironment: 'node', + testMatch: ['**/*.test.ts'], + transform: { + '^.+\\.tsx?$': ['ts-jest', { + tsconfig: 'tsconfig.json' + }] + }, + transformIgnorePatterns: [ + 'node_modules/(?!(@ai16z)/)' + ], + moduleNameMapper: { + '^(\\.{1,2}/.*)\\.js$': '$1', + } +}; diff --git a/packages/plugin-unreal/plugin-spreadsheet/package.json b/packages/plugin-unreal/plugin-spreadsheet/package.json new file mode 100644 index 00000000..b68a1dd5 --- /dev/null +++ b/packages/plugin-unreal/plugin-spreadsheet/package.json @@ -0,0 +1,26 @@ +{ + "name": "@ai16z/plugin-spreadsheet", + "version": "0.0.1", + "description": "Spreadsheet data lookup and interpretation plugin for Eliza", + "type": "module", + "main": "dist/index.js", + "types": "dist/index.d.ts", + "scripts": { + "build": "tsc -b", + "clean": "rimraf dist", + "test": "vitest run", + "test:watch": "vitest" + }, + "dependencies": { + "@ai16z/eliza": "workspace:*", + "@ai16z/adapter-postgres": "workspace:*", + "csv-parse": "^5.5.3", + "papaparse": "^5.4.1" + }, + "devDependencies": { + "@types/papaparse": "^5.3.14", + "rimraf": "^5.0.5", + "typescript": "^5.3.3", + "vitest": "^1.1.3" + } +} diff --git a/packages/plugin-unreal/plugin-spreadsheet/src/dec26/DEVELOPMENT.md b/packages/plugin-unreal/plugin-spreadsheet/src/dec26/DEVELOPMENT.md new file mode 100644 index 00000000..27ce005c --- /dev/null +++ b/packages/plugin-unreal/plugin-spreadsheet/src/dec26/DEVELOPMENT.md @@ -0,0 +1,135 @@ +# Property Search Plugin Development Status + +## Accomplished So Far + +### 1. Storage Interface Design +- Defined comprehensive `PropertyData` interface with: + - Core property fields (name, location, dimensions) + - Market status tracking + - NFT metadata support +- Created supporting interfaces: + - `NFTMetadata` for blockchain-related data + - `MarketStatus` for real-time market information + - `SearchOptions` and `SearchResult` for search operations +- Implemented error handling: + - `StorageError` class + - Detailed `StorageErrorCode` enum + +### 2. Local Storage Implementation +- Implemented `MemoryPropertyStorage` class with: + - Basic CRUD operations (Create, Read, Update, Delete) + - In-memory Map-based storage + - Comprehensive property validation: + - Required field validation + - Numeric range validation + - Min/max relationship checks + - Market data validation + - NFT data validation +- Created `PropertyStorageService` as a service layer wrapper + +### 3. Testing +- Implemented test suite covering: + - Valid property creation + - Invalid numeric value handling + - Min/max relationship validation + - Market data validation + +## Current Implementation Details + +### Core Interfaces + +#### PropertyData +```typescript +interface PropertyData { + id: string; + name: string; + neighborhood: string; + zoningType: string; + plotSize: string; + buildingSize: string; + maxFloors: number; + minFloors: number; + plotArea: number; + maxBuildingHeight: number; + minBuildingHeight: number; + oceanDistanceMeters: number; + bayDistanceMeters: number; + description: string; + nft?: NFTMetadata; + market?: MarketStatus; +} +``` + +#### Storage Implementation +- `BasePropertyStorage`: Abstract base class defining storage operations +- `MemoryPropertyStorage`: In-memory implementation with Map-based storage +- `PropertyStorageService`: Service layer implementing the Eliza Service interface + +## Next Steps + +### 1. Search Implementation (Priority: High) +- [ ] Implement vector-based search in `MemoryPropertyStorage` + - Add vector embedding for property descriptions + - Implement similarity scoring + - Add vector search indexing +- [ ] Implement filter-based search + - Add support for complex filter groups + - Implement filter operators (equals, range, contains) + - Add filter optimization + +### 2. Indexing (Priority: High) +- [ ] Add in-memory indexes for: + - Neighborhood + - Price ranges + - Property dimensions + - Distance metrics +- [ ] Implement index maintenance during CRUD operations +- [ ] Add index statistics for query optimization + +### 3. Bulk Operations (Priority: Medium) +- [ ] Enhance bulk loading functionality + - Add batch size control + - Add progress tracking + - Implement error collection +- [ ] Add bulk update operations +- [ ] Add bulk delete operations + +### 4. Performance Optimization (Priority: Medium) +- [ ] Add caching layer +- [ ] Implement query result caching +- [ ] Add performance metrics collection +- [ ] Optimize memory usage + +### 5. Integration Features (Priority: Low) +- [ ] Prepare for database integration + - Design database schema + - Plan migration strategy + - Define backup procedures +- [ ] Add export/import functionality + - CSV format support + - JSON format support + - Incremental update support + +## Technical Decisions Needed + +1. **Search Implementation** + - Choose vector embedding approach + - Decide on similarity metrics + - Define index structure + +2. **Performance Targets** + - Set maximum memory usage limits + - Define response time goals + - Set concurrent operation limits + +3. **Integration Strategy** + - Choose database technology + - Define data migration approach + - Plan backup strategy + +## Notes + +- Keep the property data structure separate from KnowledgeItem +- Maintain compatibility with future database implementation +- Focus on search performance and accuracy +- Consider memory usage in large datasets diff --git a/packages/plugin-unreal/plugin-spreadsheet/src/dec26/index.md b/packages/plugin-unreal/plugin-spreadsheet/src/dec26/index.md new file mode 100644 index 00000000..104bb9b6 --- /dev/null +++ b/packages/plugin-unreal/plugin-spreadsheet/src/dec26/index.md @@ -0,0 +1,259 @@ +import { Plugin, Memory, Content, AgentRuntime, generateText } from "@ai16z/eliza"; +import Papa from "papaparse"; + +interface PropertyData { + rank: number; + name: string; + neighborhood: string; + zoningType: string; + plotSize: string; + buildingSize: string; + distanceToOcean: string; + distanceToBay: string; + maxFloors: number; + minFloors: number; + plotArea: number; + minBuildingHeight: number; + maxBuildingHeight: number; + oceanDistanceMeters: number; + bayDistanceMeters: number; +} + +interface MetadataFilter { + field: keyof PropertyData; + operator: '$lt' | '$lte' | '$gt' | '$gte' | '$eq'; + value: number | string; +} + +interface FilterGroup { + operator: 'AND' | 'OR'; + filters: (MetadataFilter | FilterGroup)[]; +} + +// Helper to apply metadata filters with AND/OR logic +function applyFilterGroup(property: PropertyData, group: FilterGroup): boolean { + return group.operator === 'AND' + ? group.filters.every(filter => { + if ('operator' in filter && ('AND' === filter.operator || 'OR' === filter.operator)) { + return applyFilterGroup(property, filter); + } else { + return applyMetadataFilter(property, filter as MetadataFilter); + } + }) + : group.filters.some(filter => { + if ('operator' in filter && ('AND' === filter.operator || 'OR' === filter.operator)) { + return applyFilterGroup(property, filter); + } else { + return applyMetadataFilter(property, filter as MetadataFilter); + } + }); +} + +function applyMetadataFilter(property: PropertyData, filter: MetadataFilter): boolean { + const value = property[filter.field]; + const compareValue = filter.value; + + switch (filter.operator) { + case '$lt': return value < compareValue; + case '$lte': return value <= compareValue; + case '$gt': return value > compareValue; + case '$gte': return value >= compareValue; + case '$eq': return value === compareValue; + default: return false; + } +} + +// Use LLM to parse natural language query into structured filters +async function parseQueryWithLLM(runtime: AgentRuntime, query: string): Promise { + const prompt = `Parse the following real estate query into a structured filter format. The available fields are: +- maxFloors, minFloors (number of floors) +- maxBuildingHeight, minBuildingHeight (in meters) +- plotArea (in square meters) +- oceanDistanceMeters, bayDistanceMeters (distance in meters) +- neighborhood (string) +- zoningType (string) +- buildingSize (string: "Megatall", "Supertall", etc.) +- plotSize (string: "Giga", "Mega", etc.) + +Query: "${query}" + +Return the filter in this JSON format: +{ + "operator": "AND" or "OR", + "filters": [ + { + "field": "fieldName", + "operator": "$lt", "$lte", "$gt", "$gte", or "$eq", + "value": number or string + }, + // Can nest with AND/OR groups + { + "operator": "OR", + "filters": [...] + } + ] +} + +Example 1: "Find tall buildings near the ocean" +{ + "operator": "AND", + "filters": [ + { "field": "maxBuildingHeight", "operator": "$gte", "value": 300 }, + { "field": "oceanDistanceMeters", "operator": "$lte", "value": 500 } + ] +} + +Example 2: "Show properties in Nexus or Flashing Lights with at least 100 floors" +{ + "operator": "AND", + "filters": [ + { + "operator": "OR", + "filters": [ + { "field": "neighborhood", "operator": "$eq", "value": "Nexus" }, + { "field": "neighborhood", "operator": "$eq", "value": "Flashing Lights" } + ] + }, + { "field": "maxFloors", "operator": "$gte", "value": 100 } + ] +} + +Parse this query into a filter:`; + + try { + const response = await generateText({ + runtime, + context: prompt, + modelClass: "large" + }); + + // Extract JSON from response + const jsonMatch = response.match(/\{[\s\S]*\}/); + if (!jsonMatch) { + throw new Error("No JSON found in LLM response"); + } + + const parsed = JSON.parse(jsonMatch[0]); + return parsed as FilterGroup; + } catch (error) { + console.error("Failed to parse query with LLM:", error); + // Fallback to simple parsing + return { + operator: 'AND', + filters: [ + ...query.includes('tall') ? [{ field: 'maxBuildingHeight' as keyof PropertyData, operator: '$gte', value: 300 }] : [], + ...query.includes('ocean') ? [{ field: 'oceanDistanceMeters' as keyof PropertyData, operator: '$lte', value: 500 }] : [], + ...query.includes('large plot') ? [{ field: 'plotArea' as keyof PropertyData, operator: '$gte', value: 5000 }] : [] + ] + }; + } +} + +export const spreadsheetPlugin: Plugin = { + name: "spreadsheet", + description: "Load and query spreadsheet data using semantic search", + actions: [ + { + name: "load-spreadsheet", + description: "Load a CSV file into memory for semantic search", + parameters: { + content: { type: "string", description: "CSV content to load" }, + namespace: { type: "string", description: "Namespace to store data under" } + }, + handler: async (runtime: AgentRuntime, params: { content: string, namespace: string }) => { + const parsed = Papa.parse(params.content, { header: true }); + + // Process each row into a Memory object + for (const row of parsed.data) { + const propertyData: PropertyData = { + rank: parseInt(row.Rank) || 0, + name: row.Name || "", + neighborhood: row.Neighborhood || "", + zoningType: row["Zoning Type"] || "", + plotSize: row["Plot Size"] || "", + buildingSize: row["Building Size"] || "", + distanceToOcean: row["Distance to Ocean"] || "", + distanceToBay: row["Distance to Bay"] || "", + maxFloors: parseInt(row["Max # of Floors"]) || 0, + minFloors: parseInt(row["Min # of Floors"]) || 0, + plotArea: parseFloat(row["Plot Area (m²)"]) || 0, + minBuildingHeight: parseFloat(row["Min Building Height (m)"]) || 0, + maxBuildingHeight: parseFloat(row["Max Building Height (m)"]) || 0, + oceanDistanceMeters: parseFloat(row["Distance to Ocean (m)"]) || 0, + bayDistanceMeters: parseFloat(row["Distance to Bay (m)"]) || 0 + }; + + // Create natural language description for vector search + const description = [ + `${propertyData.name} is a ${propertyData.buildingSize} building in ${propertyData.neighborhood}.`, + `It has ${propertyData.maxFloors} floors and is ${propertyData.maxBuildingHeight}m tall.`, + `Located ${propertyData.oceanDistanceMeters}m from the ocean and ${propertyData.bayDistanceMeters}m from the bay.`, + `It has a ${propertyData.plotSize} plot of ${propertyData.plotArea}m².`, + `The building is zoned for ${propertyData.zoningType} use.` + ].join(" "); + + const memory: Memory = { + content: { + text: description, + metadata: propertyData + }, + roomId: params.namespace, + userId: runtime.agentId, + agentId: runtime.agentId + }; + + await runtime.memory.createMemory(memory); + } + + return { success: true, message: `Loaded ${parsed.data.length} properties` }; + } + }, + { + name: "query-spreadsheet", + description: "Search loaded spreadsheet data using natural language", + parameters: { + query: { type: "string", description: "Natural language query" }, + namespace: { type: "string", description: "Namespace to search in" }, + limit: { type: "number", description: "Maximum number of results to return" } + }, + handler: async (runtime: AgentRuntime, params: { query: string, namespace: string, limit: number }) => { + // Stage 1: Vector similarity search + const queryMemory: Memory = { + content: { text: params.query }, + roomId: params.namespace, + userId: runtime.agentId, + agentId: runtime.agentId + }; + await runtime.memory.addEmbeddingToMemory(queryMemory); + + // Get more candidates than needed since we'll filter them + const candidateLimit = (params.limit || 10) * 3; + const candidates = await runtime.memory.searchMemoriesByEmbedding( + queryMemory.embedding!, + { + count: candidateLimit, + roomId: params.namespace, + match_threshold: 0.6 // Lower threshold to get more candidates + } + ); + + // Stage 2: LLM-based metadata filtering + const filterGroup = await parseQueryWithLLM(runtime, params.query); + const filteredResults = candidates + .filter(match => { + const propertyData = match.content.metadata as PropertyData; + return applyFilterGroup(propertyData, filterGroup); + }) + .slice(0, params.limit || 10); + + // Return results with both semantic similarity and metadata match info + return filteredResults.map(match => ({ + description: match.content.text, + property: match.content.metadata as PropertyData, + similarity: match.score, + appliedFilters: filterGroup // Include the parsed filters + })); + } + } + ] +}; diff --git a/packages/plugin-unreal/plugin-spreadsheet/src/errors.ts b/packages/plugin-unreal/plugin-spreadsheet/src/errors.ts new file mode 100644 index 00000000..b7d618d8 --- /dev/null +++ b/packages/plugin-unreal/plugin-spreadsheet/src/errors.ts @@ -0,0 +1,16 @@ +export enum StorageErrorCode { + NOT_FOUND = 'NOT_FOUND', + ALREADY_EXISTS = 'ALREADY_EXISTS', + INVALID_INPUT = 'INVALID_INPUT', + INTERNAL_ERROR = 'INTERNAL_ERROR' +} + +export class StorageError extends Error { + constructor( + public code: StorageErrorCode, + message: string + ) { + super(message); + this.name = 'StorageError'; + } +} diff --git a/packages/plugin-unreal/plugin-spreadsheet/src/index.ts b/packages/plugin-unreal/plugin-spreadsheet/src/index.ts new file mode 100644 index 00000000..6c484abc --- /dev/null +++ b/packages/plugin-unreal/plugin-spreadsheet/src/index.ts @@ -0,0 +1,123 @@ +import { Plugin, IAgentRuntime, Memory, State, ServiceType, elizaLogger } from '@ai16z/eliza'; +import { PropertyStorage } from './storage'; +import { MemoryPropertyStorage } from './storage/memory-storage'; +import { PropertyStorageService } from './services'; +import { Action } from '@ai16z/eliza'; + +const searchPropertiesAction: Action = { + name: 'search-properties', + description: 'Search for properties using natural language', + similes: [ + 'find properties', + 'search properties', + 'lookup properties', + 'list properties', + 'search properties for matches' + ], + examples: [[ + { + user: "user", + content: { + text: "Search properties for sale", + action: "search-properties" + } + } + ]], + handler: async ( + runtime: IAgentRuntime, + message: Memory, + state?: State, + options?: { [key: string]: unknown } + ): Promise => { + elizaLogger.info('search-properties handler starting', { + messageText: message?.content?.text, + hasState: !!state, + hasOptions: !!options, + runtimeType: runtime?.constructor?.name + }); + + if (!runtime) { + elizaLogger.error('Runtime not initialized'); + throw new Error('Runtime not initialized'); + } + + // Initialize the service with runtime + try { + await service.initialize(runtime); + } catch (error) { + elizaLogger.error('Failed to initialize service:', error); + throw error; + } + + // Extract the search query from the message text + const text = message.content?.text || ''; + elizaLogger.info('Processing search query:', { originalText: text }); + + let query = text; + if (text.includes('listings for')) { + query = text.split('listings for')[1].trim(); + } else if (text.includes('properties')) { + query = text.split('properties')[1]?.trim() || text; + } + + elizaLogger.info('Extracted search query:', { query }); + + // Use the storage's search interface with the query + const results = await service.searchByFilters({ + operator: 'OR', + filters: [ + { + field: 'description', + value: query.toLowerCase(), + operator: '$in' + }, + { + field: 'name', + value: query.toLowerCase(), + operator: '$in' + }, + { + field: 'neighborhood', + value: query.toLowerCase(), + operator: '$in' + } + ] + }); + + elizaLogger.info('Search results:', results); + + return { + userId: runtime.agentId, + agentId: runtime.agentId, + roomId: message.roomId, + content: { + text: `Here are the properties matching "${query}":\n\n${ + results.length > 0 + ? results.map(r => r.property + ? `- ${r.property.name}: ${r.property.description}` + : `- Unknown property` + ).join('\n') + : 'No matching properties found.' + }`, + action: 'search-properties' + } + }; + }, + validate: async (runtime: IAgentRuntime, message: Memory): Promise => { + return !!runtime && !!message; + } +} as Action; + +// Create the plugin instance +const storage = new MemoryPropertyStorage(); +const service = new PropertyStorageService(storage); + +// Export the plugin +export const spreadsheetPlugin: Plugin = { + name: "spreadsheet", + description: "Plugin for managing property data in a spreadsheet format", + actions: [searchPropertiesAction], + services: [service], + evaluators: [], + providers: [] +}; \ No newline at end of file diff --git a/packages/plugin-unreal/plugin-spreadsheet/src/services.ts b/packages/plugin-unreal/plugin-spreadsheet/src/services.ts new file mode 100644 index 00000000..ac36e531 --- /dev/null +++ b/packages/plugin-unreal/plugin-spreadsheet/src/services.ts @@ -0,0 +1,57 @@ +import { Service, ServiceType, IAgentRuntime } from '@ai16z/eliza'; +import { PropertyStorage } from './storage'; +import { BasePropertyStorage } from './storage'; +import { FilterGroup, SearchResult, SearchOptions } from './types'; + +export class PropertyStorageService extends Service implements PropertyStorage { + private storage: BasePropertyStorage; + + constructor(storage: BasePropertyStorage) { + super(); + this.storage = storage; + } + + static override get serviceType(): ServiceType { + return ServiceType.PROPERTY_STORAGE; + } + + async initialize(runtime: IAgentRuntime): Promise { + await this.storage.initialize(runtime); + } + + async addProperty(property: any) { + return this.storage.addProperty(property); + } + + async getProperty(id: string) { + return this.storage.getProperty(id); + } + + async updateProperty(id: string, property: any) { + return this.storage.updateProperty(id, property); + } + + async deleteProperty(id: string) { + return this.storage.deleteProperty(id); + } + + async searchByFilters(filters: FilterGroup): Promise { + return this.storage.searchByFilters(filters); + } + + async searchByVector(vector: number[], options: SearchOptions): Promise { + return this.storage.searchByVector(vector, options); + } + + async getCount() { + return this.storage.getCount(); + } + + async clear() { + return this.storage.clear(); + } + + async bulkLoad(properties: any[]) { + return this.storage.bulkLoad(properties); + } +} diff --git a/packages/plugin-unreal/plugin-spreadsheet/src/services/index.ts b/packages/plugin-unreal/plugin-spreadsheet/src/services/index.ts new file mode 100644 index 00000000..5cb57af5 --- /dev/null +++ b/packages/plugin-unreal/plugin-spreadsheet/src/services/index.ts @@ -0,0 +1,81 @@ +import { Service, ServiceType, AgentRuntime, elizaLogger } from '@ai16z/eliza'; +import { PropertyStorage } from '../storage'; +import { MemoryPropertyStorage } from '../storage/memory-storage'; +import { FilterGroup, SearchOptions, SearchResult } from '../types'; +import { StorageError, StorageErrorCode } from '../errors'; + +export class PropertyStorageService implements Service { + readonly type = ServiceType.PROPERTY_STORAGE; + private runtime: AgentRuntime | null = null; + + constructor( + private storage: PropertyStorage + ) { + elizaLogger.debug('PropertyStorageService: Constructor called'); + } + + get serviceType(): ServiceType { + return ServiceType.PROPERTY_STORAGE; + } + + async initialize(runtime: AgentRuntime): Promise { + elizaLogger.debug('PropertyStorageService: Initializing with runtime', { + hasRuntime: !!runtime, + runtimeType: runtime?.constructor?.name, + agentId: runtime?.agentId + }); + this.runtime = runtime; + await this.storage.initialize(runtime); + elizaLogger.debug('PropertyStorageService: Initialization complete'); + } + + async searchByFilters(filters: FilterGroup): Promise { + elizaLogger.debug('PropertyStorageService.searchByFilters called', { + hasRuntime: !!this.runtime, + hasStorage: !!this.storage, + operator: filters.operator, + filterCount: filters.filters?.length, + filterFields: filters.filters?.map(f => typeof f === 'object' && 'field' in f ? f.field : 'group') + }); + + if (!this.runtime) { + elizaLogger.error('PropertyStorageService: Runtime not initialized'); + throw new StorageError(StorageErrorCode.INTERNAL_ERROR, 'Runtime not initialized'); + } + + elizaLogger.info('PropertyStorageService.searchByFilters called with:', { + operator: filters.operator, + filterCount: filters.filters?.length, + filterFields: filters.filters?.map(f => typeof f === 'object' && 'field' in f ? f.field : 'group') + }); + + if (!this.storage) { + throw new StorageError(StorageErrorCode.INTERNAL_ERROR, 'Storage not initialized'); + } + + try { + const results = await this.storage.searchByFilters(filters); + elizaLogger.info('PropertyStorageService search results:', { + hasResults: !!results, + resultsType: results ? typeof results : 'undefined', + isArray: Array.isArray(results), + count: results?.length || 0, + results: results ? results.map(r => ({ id: r?.property?.id, name: r?.property?.name })) : [] + }); + if (!results) { + throw new StorageError(StorageErrorCode.INTERNAL_ERROR, 'Search returned no results'); + } + return results; + } catch (error) { + elizaLogger.error('Error in PropertyStorageService.searchByFilters:', error); + throw error; + } + } + + async searchByVector(vector: number[], options: SearchOptions): Promise { + if (!this.storage) { + throw new Error('PropertyStorageService not initialized'); + } + return this.storage.searchByVector(vector, options); + } +} diff --git a/packages/plugin-unreal/plugin-spreadsheet/src/services/unreal-agent2.md b/packages/plugin-unreal/plugin-spreadsheet/src/services/unreal-agent2.md new file mode 100644 index 00000000..285dc52d --- /dev/null +++ b/packages/plugin-unreal/plugin-spreadsheet/src/services/unreal-agent2.md @@ -0,0 +1,193 @@ +import { AgentRuntime, embed, getEmbeddingConfig } from "@ai16z/eliza"; +import { PropertyData } from "../types"; + +interface PropertyMetadata { + createdAt: Date; + version: number; + previousVersion?: string; +} + +interface StoredProperty extends PropertyData { + id: string; + embedding: number[]; + metadata: PropertyMetadata; +} + +interface AgentConfig { + embeddingModel: string; + dimensions: number; + similarityThreshold: number; +} + +export class UnrealAgent2 { + private runtime: AgentRuntime; + private config: AgentConfig; + + constructor(runtime: AgentRuntime) { + this.runtime = runtime; + } + + async initialize(): Promise { + const embeddingConfig = getEmbeddingConfig(); + this.config = { + embeddingModel: process.env.EMBEDDING_OPENAI_MODEL || 'text-embedding-3-small', + dimensions: embeddingConfig.dimensions, + similarityThreshold: 0.8 + }; + + // Ensure tables exist + await this.runtime.databaseAdapter.query(` + CREATE TABLE IF NOT EXISTS property_store ( + id UUID PRIMARY KEY, + data JSONB NOT NULL, + embedding vector(${this.config.dimensions}), + metadata JSONB NOT NULL, + created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP + ); + `); + + await this.runtime.databaseAdapter.query(` + CREATE TABLE IF NOT EXISTS property_versions ( + id UUID PRIMARY KEY, + property_id UUID NOT NULL REFERENCES property_store(id), + version INTEGER NOT NULL, + previous_version UUID REFERENCES property_versions(id), + data JSONB NOT NULL, + created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP + ); + `); + } + + async getConfig(): Promise { + return { ...this.config }; + } + + async storeProperty(property: PropertyData): Promise { + // Generate embedding for the property + const propertyText = this.propertyToText(property); + const embedding = await embed(this.runtime, propertyText); + + // Get current version if exists + const currentVersion = await this.getCurrentVersion(property.id); + const version = currentVersion ? currentVersion.metadata.version + 1 : 1; + const previousVersion = currentVersion?.id; + + // Create stored property object + const storedProperty: StoredProperty = { + ...property, + embedding, + metadata: { + createdAt: new Date(), + version, + previousVersion + } + }; + + // Store in database + await this.runtime.databaseAdapter.query( + `INSERT INTO property_store (id, data, embedding, metadata) + VALUES ($1, $2, $3, $4)`, + [ + property.id, + JSON.stringify(property), + embedding, + JSON.stringify(storedProperty.metadata) + ] + ); + + // Store version history + await this.runtime.databaseAdapter.query( + `INSERT INTO property_versions (id, property_id, version, previous_version, data) + VALUES ($1, $2, $3, $4, $5)`, + [ + property.id, + property.id, + version, + previousVersion, + JSON.stringify(property) + ] + ); + + return storedProperty; + } + + async getProperty(id: string): Promise { + const result = await this.runtime.databaseAdapter.query( + `SELECT * FROM property_store WHERE id = $1`, + [id] + ); + + if (result.rows.length === 0) { + return null; + } + + const row = result.rows[0]; + return { + ...row.data, + id: row.id, + embedding: row.embedding, + metadata: row.metadata + }; + } + + async getPropertyHistory(id: string): Promise { + const result = await this.runtime.databaseAdapter.query( + `SELECT * FROM property_versions + WHERE property_id = $1 + ORDER BY version DESC`, + [id] + ); + + return result.rows.map(row => ({ + ...row.data, + id: row.id, + embedding: row.embedding, + metadata: { + createdAt: row.created_at, + version: row.version, + previousVersion: row.previous_version + } + })); + } + + private async getCurrentVersion(id: string): Promise { + const result = await this.runtime.databaseAdapter.query( + `SELECT * FROM property_versions + WHERE property_id = $1 + ORDER BY version DESC + LIMIT 1`, + [id] + ); + + if (result.rows.length === 0) { + return null; + } + + const row = result.rows[0]; + return { + ...row.data, + id: row.id, + embedding: row.embedding, + metadata: { + createdAt: row.created_at, + version: row.version, + previousVersion: row.previous_version + } + }; + } + + private propertyToText(property: PropertyData): string { + return ` + Property: ${property.name} + Location: ${property.neighborhood} + Type: ${property.zoningType} + Size: ${property.plotSize} (${property.buildingSize}) + Floors: ${property.minFloors}-${property.maxFloors} + Height: ${property.minBuildingHeight}-${property.maxBuildingHeight} feet + Distance to Ocean: ${property.oceanDistanceMeters}m + Distance to Bay: ${property.bayDistanceMeters}m + Description: ${property.description} + Price: ${property.market?.currentPrice} ${property.market?.currency} + `.trim().replace(/\s+/g, ' '); + } +} diff --git a/packages/plugin-unreal/plugin-spreadsheet/src/storage.ts b/packages/plugin-unreal/plugin-spreadsheet/src/storage.ts new file mode 100644 index 00000000..417cdce3 --- /dev/null +++ b/packages/plugin-unreal/plugin-spreadsheet/src/storage.ts @@ -0,0 +1,122 @@ +import { IAgentRuntime } from '@ai16z/eliza'; +import { PropertyData, SearchOptions, SearchResult, FilterGroup } from './types'; +import { StorageError, StorageErrorCode } from './errors'; + +/** + * Core interface for property storage operations + */ +export interface PropertyStorage { + /** + * Initialize the storage with runtime + */ + initialize(runtime: IAgentRuntime): void; + + /** + * Add a single property to storage + * @throws {StorageError} If property is invalid or operation fails + */ + addProperty(property: PropertyData): Promise; + + /** + * Retrieve a property by ID + * @throws {StorageError} If property not found + */ + getProperty(id: string): Promise; + + /** + * Update an existing property + * @throws {StorageError} If property not found or update fails + */ + updateProperty(id: string, property: PropertyData): Promise; + + /** + * Delete a property + * @throws {StorageError} If property not found or delete fails + */ + deleteProperty(id: string): Promise; + + /** + * Search properties by vector similarity + */ + searchByVector(vector: number[], options: SearchOptions): Promise; + + /** + * Search properties by metadata filters + */ + searchByFilters(filters: FilterGroup): Promise; + + /** + * Bulk load properties + * @throws {StorageError} If any property is invalid or operation fails + */ + bulkLoad(properties: PropertyData[]): Promise; + + /** + * Get total count of stored properties + */ + getCount(): Promise; + + /** + * Clear all stored properties + */ + clear(): Promise; +} + +/** + * Abstract base class for property storage implementations + */ +export abstract class BasePropertyStorage implements PropertyStorage { + abstract addProperty(property: PropertyData): Promise; + abstract getProperty(id: string): Promise; + abstract updateProperty(id: string, property: PropertyData): Promise; + abstract deleteProperty(id: string): Promise; + abstract searchByVector(vector: number[], options: SearchOptions): Promise; + abstract searchByFilters(filters: FilterGroup): Promise; + abstract getCount(): Promise; + abstract clear(): Promise; + + /** + * Default bulk load implementation + * Override for more efficient implementation + */ + async bulkLoad(properties: PropertyData[]): Promise { + try { + await Promise.all(properties.map(p => this.addProperty(p))); + } catch (error) { + throw new StorageError( + StorageErrorCode.INTERNAL_ERROR, + `Bulk load failed: ${error}` + ); + } + } + + /** + * Validate property data + * @throws {StorageError} If property is invalid + */ + protected validateProperty(property: PropertyData): void { + if (!property.id || !property.name) { + throw new StorageError( + StorageErrorCode.INVALID_INPUT, + 'Property must have id and name' + ); + } + } + + /** + * Validate vector dimensions + * @throws {StorageError} If vector dimensions don't match + */ + protected validateVector(vector: number[]): void { + if (!Array.isArray(vector) || vector.length === 0) { + throw new StorageError( + StorageErrorCode.INVALID_INPUT, // KAI wilder got rid of a stupid enum here + 'Invalid vector' + ); + } + } + + initialize(runtime: IAgentRuntime): void { + // To be implemented by subclasses + } +} diff --git a/packages/plugin-unreal/plugin-spreadsheet/src/storage/memory-storage.ts b/packages/plugin-unreal/plugin-spreadsheet/src/storage/memory-storage.ts new file mode 100644 index 00000000..2253a247 --- /dev/null +++ b/packages/plugin-unreal/plugin-spreadsheet/src/storage/memory-storage.ts @@ -0,0 +1,195 @@ +import { PropertyData, SearchOptions, SearchResult, FilterGroup, MetadataFilter } from '../types'; +import { StorageError, StorageErrorCode } from '../errors'; +import { BasePropertyStorage } from '../storage'; +import { knowledge, elizaLogger, AgentRuntime, Memory, KnowledgeItem, stringToUuid } from '@ai16z/eliza'; + +/** + * In-memory implementation of PropertyStorage + */ +export class MemoryPropertyStorage extends BasePropertyStorage { + private properties: Map = new Map(); + private nextId: number = 1; + private runtime: AgentRuntime | null = null; + + constructor() { + super(); + elizaLogger.info('MemoryPropertyStorage: Constructor called'); + } + + initialize(runtime: AgentRuntime) { + elizaLogger.info('MemoryPropertyStorage: Initializing with runtime', { + hasRuntime: !!runtime, + runtimeType: runtime?.constructor?.name, + agentId: runtime?.agentId + }); + this.runtime = runtime; + } + + async addProperty(property: PropertyData): Promise { + this.validateProperty(property); + const id = String(this.nextId++); + this.properties.set(id, { ...property, id }); + return id; + } + + async getProperty(id: string): Promise { + const property = this.properties.get(id); + if (!property) { + throw new StorageError(StorageErrorCode.NOT_FOUND, `Property with ID ${id} not found`); + } + return { ...property }; + } + + async updateProperty(id: string, property: PropertyData): Promise { + if (!this.properties.has(id)) { + throw new StorageError(StorageErrorCode.NOT_FOUND, `Property with ID ${id} not found`); + } + this.validateProperty(property); + this.properties.set(id, { ...property, id }); + } + + async deleteProperty(id: string): Promise { + if (!this.properties.delete(id)) { + throw new StorageError(StorageErrorCode.NOT_FOUND,`Property with ID ${id} not found` ); + } + } + + async searchByVector(vector: number[], options: SearchOptions): Promise { + return Array.from(this.properties.entries()).map(([id, property]) => ({ + id, + property, + similarity: 1.0, + matchedFilters: [] + })); + } + + async searchByFilters(filters: FilterGroup): Promise { + elizaLogger.debug('MemoryPropertyStorage: Searching by filters', { + hasRuntime: !!this.runtime, + filtersLength: filters?.filters?.length || 0 + }); + + if (!this.runtime) { + elizaLogger.error('MemoryPropertyStorage: Runtime not initialized for searchByFilters'); + throw new StorageError(StorageErrorCode.INTERNAL_ERROR, 'Runtime not initialized'); + } + + elizaLogger.info('Searching properties with filters:', filters); + + /* Test property creation - commented out for now + // Test item 1 - with metadata + const testItem1: KnowledgeItem = { + id: stringToUuid("test-property-1-" + Date.now()), + content: { + text: "Property: Test Tower Location: Miami Beach Type: Mixed-Use Size: 0.5 acres", + source: "property-data", + metadata: { + name: "Test Tower", + location: "Miami Beach", + type: "Mixed-Use", + size: "0.5 acres" + } + } + }; + + // Test item 2 - without metadata + const testItem2: KnowledgeItem = { + id: stringToUuid("test-property-2-" + Date.now()), + content: { + text: "Property: Another Tower Location: Miami Beach Type: Mixed-Use Size: 0.8 acres", + source: "property-data" + } + }; + + elizaLogger.info('Creating test item 1:', testItem1); + await knowledge.set(this.runtime, testItem1); + elizaLogger.info('Test item 1 created'); + + elizaLogger.info('Creating test item 2:', testItem2); + await knowledge.set(this.runtime, testItem2); + elizaLogger.info('Test item 2 created'); + */ + + // Create a memory object for knowledge search + const memory: Memory = { + agentId: this.runtime.agentId, + userId: this.runtime.agentId, + roomId: this.runtime.agentId, + content: { + // Use the first filter's value as the semantic search query + text: (filters.filters[0] as MetadataFilter).value + } + }; + + elizaLogger.info('Memory object for knowledge search:', memory); + + // Get results from knowledge system + const knowledgeItems = await knowledge.get(this.runtime, memory); + elizaLogger.info('Retrieved knowledge items:', knowledgeItems); + + // Convert knowledge items to property results + const knowledgeResults = knowledgeItems.map(item => ({ + id: item.id, + ...(item.content.metadata ? { property: item.content.metadata as PropertyData } : {}), + similarity: 1.0, + matchedFilters: [] + })); + + // Apply existing filter logic to in-memory properties + const applyFilter = (property: PropertyData, filter: MetadataFilter): boolean => { + const value = property[filter.field as keyof PropertyData]; + const searchValue = filter.value; + + switch (filter.operator) { + case '$eq': + return value === searchValue; + case '$in': + if (typeof value === 'string' && typeof searchValue === 'string') { + return value.toLowerCase().includes(searchValue.toLowerCase()); + } + return false; + default: + return false; + } + }; + + const applyFilterGroup = (property: PropertyData, group: FilterGroup): boolean => { + const results = group.filters.map(filter => { + if ('operator' in filter && ('filters' in filter)) { + // Nested filter group + return applyFilterGroup(property, filter as FilterGroup); + } else { + // Single filter + return applyFilter(property, filter as MetadataFilter); + } + }); + + return group.operator === 'AND' + ? results.every(r => r) + : results.some(r => r); + }; + + const directResults = Array.from(this.properties.values()) + .filter(property => applyFilterGroup(property, filters)) + .map(property => ({ + id: property.id, + property, + similarity: 1.0, + matchedFilters: [] + })); + + elizaLogger.info('Direct search results:', directResults); + + // Combine and return all results + return [...knowledgeResults, ...directResults]; + } + + async getCount(): Promise { + return this.properties.size; + } + + async clear(): Promise { + this.properties.clear(); + this.nextId = 1; + } +} diff --git a/packages/plugin-unreal/plugin-spreadsheet/src/test.md b/packages/plugin-unreal/plugin-spreadsheet/src/test.md new file mode 100644 index 00000000..661dbb11 --- /dev/null +++ b/packages/plugin-unreal/plugin-spreadsheet/src/test.md @@ -0,0 +1,104 @@ +import { MemoryPropertyStorage } from './storage/memory-storage'; +import { PropertyStorageService } from './services'; +import { PropertyData, StorageError, StorageErrorCode } from './types'; + +async function main() { + console.log('Starting validation tests...'); + + const storage = new MemoryPropertyStorage(); + const service = new PropertyStorageService(storage); + + // Test 1: Valid property + console.log('\nTest 1: Adding valid property'); + const validProperty: PropertyData = { + id: '', + name: 'Oceanfront Tower', + neighborhood: 'Miami Beach', + zoningType: 'Mixed-Use', + plotSize: '0.5 acres', + buildingSize: '50000 sqft', + maxFloors: 40, + minFloors: 1, + plotArea: 21780, + maxBuildingHeight: 400, + minBuildingHeight: 15, + oceanDistanceMeters: 100, + bayDistanceMeters: 1000, + description: 'Luxury oceanfront development opportunity', + market: { + isListed: true, + currentPrice: 25000000, + currency: 'USD', + marketplace: 'other', + lastUpdated: new Date() + } + }; + + try { + const id = await service.addProperty(validProperty); + console.log('✅ Successfully added valid property with ID:', id); + } catch (error) { + console.error('❌ Failed to add valid property:', error); + } + + // Test 2: Invalid numeric values + console.log('\nTest 2: Testing invalid numeric values'); + const invalidNumericProperty: PropertyData = { + ...validProperty, + maxFloors: 0 // Should fail as maxFloors must be >= 1 + }; + + try { + await service.addProperty(invalidNumericProperty); + console.error('❌ Should have failed with invalid maxFloors'); + } catch (error) { + if (error instanceof StorageError && error.code === StorageErrorCode.INVALID_NUMERIC_VALUE) { + console.log('✅ Correctly rejected invalid maxFloors'); + } else { + console.error('❌ Unexpected error:', error); + } + } + + // Test 3: Invalid min/max relationship + console.log('\nTest 3: Testing invalid min/max relationship'); + const invalidMinMaxProperty: PropertyData = { + ...validProperty, + minFloors: 50, // Higher than maxFloors (40) + }; + + try { + await service.addProperty(invalidMinMaxProperty); + console.error('❌ Should have failed with invalid min/max floors'); + } catch (error) { + if (error instanceof StorageError && error.code === StorageErrorCode.INVALID_NUMERIC_VALUE) { + console.log('✅ Correctly rejected invalid min/max relationship'); + } else { + console.error('❌ Unexpected error:', error); + } + } + + // Test 4: Invalid market data + console.log('\nTest 4: Testing invalid market data'); + const invalidMarketProperty: PropertyData = { + ...validProperty, + market: { + ...validProperty.market!, + currentPrice: -1000 // Invalid negative price + } + }; + + try { + await service.addProperty(invalidMarketProperty); + console.error('❌ Should have failed with invalid market price'); + } catch (error) { + if (error instanceof StorageError && error.code === StorageErrorCode.INVALID_MARKET_DATA) { + console.log('✅ Correctly rejected invalid market data'); + } else { + console.error('❌ Unexpected error:', error); + } + } + + console.log('\nValidation tests completed!'); +} + +main().catch(console.error); diff --git a/packages/plugin-unreal/plugin-spreadsheet/src/types.ts b/packages/plugin-unreal/plugin-spreadsheet/src/types.ts new file mode 100644 index 00000000..5761fc5a --- /dev/null +++ b/packages/plugin-unreal/plugin-spreadsheet/src/types.ts @@ -0,0 +1,92 @@ +/** + * Core property data interface + */ +export interface PropertyData { + id: string; + name: string; + neighborhood: string; + zoningType: string; + plotSize: string; + buildingSize: string; + maxFloors: number; + minFloors: number; + plotArea: number; + maxBuildingHeight: number; + minBuildingHeight: number; + oceanDistanceMeters: number; + bayDistanceMeters: number; + description: string; + nft?: NFTMetadata; + market?: MarketStatus; +} + +/** + * NFT-specific metadata + */ +export interface NFTMetadata { + tokenId: string; + contractAddress: string; + blockchain: 'ethereum' | 'polygon'; + lastSalePrice?: number; + lastSaleDate?: Date; +} + +/** + * Real-time market status + */ +export interface MarketStatus { + isListed: boolean; + currentPrice?: number; + currency?: string; + marketplace: 'opensea' | 'other'; + listingUrl?: string; + lastUpdated: Date; +} + +/** + * Options for search operations + */ +export interface SearchOptions { + limit: number; + threshold?: number; + includeMetadata?: boolean; + sortBy?: 'similarity' | 'price' | 'date'; +} + +/** + * Search result with similarity score + */ +export interface SearchResult { + id: string; + property?: PropertyData; + similarity: number; + matchedFilters?: string[]; +} + +/** + * Filter types and operators + */ +export type FilterOperator = + | '$eq' | '$ne' + | '$gt' | '$gte' + | '$lt' | '$lte' + | '$in' | '$nin' + | '$exists' + | '$near'; + +/** + * Single metadata filter + */ +export interface MetadataFilter { + field: string; + operator: FilterOperator; + value: any; +} + +/** + * Group of filters with logical operator + */ +export interface FilterGroup { + operator: 'AND' | 'OR'; + filters: (MetadataFilter | FilterGroup)[]; +} diff --git a/packages/plugin-unreal/plugin-spreadsheet/src/utils.ts b/packages/plugin-unreal/plugin-spreadsheet/src/utils.ts new file mode 100644 index 00000000..ceb84ce7 --- /dev/null +++ b/packages/plugin-unreal/plugin-spreadsheet/src/utils.ts @@ -0,0 +1,99 @@ +import { PropertyData } from './types'; + +interface CSVOptions { + hasHeaders?: boolean; + delimiter?: string; +} + +/** + * Parse CSV content into PropertyData objects + */ +export function parseCSV(content: string, options: CSVOptions = {}): PropertyData[] { + const { + hasHeaders = true, + delimiter = ',' + } = options; + + // Split into lines + const lines = content.trim().split('\n'); + if (lines.length === 0) return []; + + // Handle headers + let startIndex = 0; + let headers: string[] = []; + if (hasHeaders) { + headers = lines[0].split(delimiter).map(h => h.trim()); + startIndex = 1; + } + + // Parse data lines + return lines.slice(startIndex).map((line, index) => { + const values = line.split(delimiter).map(v => v.trim()); + + // Create property object + const property: Partial = { + id: values[0] || String(index), + name: values[1] || `Property ${index}`, + }; + + // Map remaining values to fields + if (hasHeaders) { + headers.forEach((header, i) => { + if (i > 1) { // Skip id and name which we already handled + const value = values[i]; + if (value !== undefined && value !== '') { + (property as any)[header] = parseValue(value); + } + } + }); + } + + return property as PropertyData; + }); +} + +/** + * Parse string value into appropriate type + */ +function parseValue(value: string): any { + // Try parsing as number + if (!isNaN(Number(value))) { + return Number(value); + } + + // Try parsing as boolean + if (value.toLowerCase() === 'true') return true; + if (value.toLowerCase() === 'false') return false; + + // Try parsing as date + const date = new Date(value); + if (!isNaN(date.getTime())) return date; + + // Return as string + return value; +} + +/** + * Calculate cosine similarity between two vectors + */ +export function cosineSimilarity(a: number[], b: number[]): number { + if (a.length !== b.length) { + throw new Error('Vector dimensions must match'); + } + + let dotProduct = 0; + let normA = 0; + let normB = 0; + + for (let i = 0; i < a.length; i++) { + dotProduct += a[i] * b[i]; + normA += a[i] * a[i]; + normB += b[i] * b[i]; + } + + normA = Math.sqrt(normA); + normB = Math.sqrt(normB); + + if (normA === 0 || normB === 0) return 0; + return dotProduct / (normA * normB); +} diff --git a/packages/plugin-unreal/plugin-spreadsheet/tsconfig.json b/packages/plugin-unreal/plugin-spreadsheet/tsconfig.json new file mode 100644 index 00000000..099dce25 --- /dev/null +++ b/packages/plugin-unreal/plugin-spreadsheet/tsconfig.json @@ -0,0 +1,23 @@ +{ + "compilerOptions": { + "target": "ES2020", + "module": "ES2020", + "moduleResolution": "node", + "lib": [ + "ES2020" + ], + "declaration": true, + "outDir": "./dist", + "strict": true, + "esModuleInterop": true, + "skipLibCheck": true, + "forceConsistentCasingInFileNames": true + }, + "include": [ + "src/**/*" + ], + "exclude": [ + "node_modules", + "dist" + ] +} \ No newline at end of file diff --git a/packages/plugin-unreal/plugin-spreadsheet/vitest.config.ts b/packages/plugin-unreal/plugin-spreadsheet/vitest.config.ts new file mode 100644 index 00000000..f2db5e9a --- /dev/null +++ b/packages/plugin-unreal/plugin-spreadsheet/vitest.config.ts @@ -0,0 +1,9 @@ +import { defineConfig } from 'vitest/config' + +export default defineConfig({ + test: { + globals: true, + environment: 'node', + setupFiles: ['dotenv/config'], + }, +}) diff --git a/packages/plugin-unreal/schema.sql b/packages/plugin-unreal/schema.sql new file mode 100644 index 00000000..715d8aa8 --- /dev/null +++ b/packages/plugin-unreal/schema.sql @@ -0,0 +1,129 @@ +-- Enable pgvector extension + +-- -- Drop existing tables and extensions +-- DROP EXTENSION IF EXISTS vector CASCADE; +-- DROP TABLE IF EXISTS relationships CASCADE; +-- DROP TABLE IF EXISTS participants CASCADE; +-- DROP TABLE IF EXISTS logs CASCADE; +-- DROP TABLE IF EXISTS goals CASCADE; +-- DROP TABLE IF EXISTS memories CASCADE; +-- DROP TABLE IF EXISTS rooms CASCADE; +-- DROP TABLE IF EXISTS accounts CASCADE; + + +CREATE EXTENSION IF NOT EXISTS vector; +CREATE EXTENSION IF NOT EXISTS fuzzystrmatch; + +-- -- Create a function to determine vector dimension +-- CREATE OR REPLACE FUNCTION get_embedding_dimension() +-- RETURNS INTEGER AS $$ +-- BEGIN +-- -- Check for OpenAI first +-- IF current_setting('app.use_openai_embedding', TRUE) = 'true' THEN +-- RETURN 1536; -- OpenAI dimension +-- -- Then check for Ollama +-- ELSIF current_setting('app.use_ollama_embedding', TRUE) = 'true' THEN +-- RETURN 1024; -- Ollama mxbai-embed-large dimension +-- ELSE +-- RETURN 384; -- BGE/Other embedding dimension +-- END IF; +-- END; +-- $$ LANGUAGE plpgsql; + +BEGIN; + +CREATE TABLE IF NOT EXISTS accounts ( + "id" UUID PRIMARY KEY, + "createdAt" TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP, + "name" TEXT, + "username" TEXT, + "email" TEXT NOT NULL, + "avatarUrl" TEXT, + "details" JSONB DEFAULT '{}'::jsonb +); + +CREATE TABLE IF NOT EXISTS rooms ( + "id" UUID PRIMARY KEY, + "createdAt" TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP +); + +CREATE TABLE IF NOT EXISTS memories ( + "id" UUID PRIMARY KEY, + "type" TEXT NOT NULL, + "createdAt" TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP, + "content" JSONB NOT NULL, + "embedding" vector(1536), -- Dynamic vector size + "userId" UUID REFERENCES accounts("id"), + "agentId" UUID REFERENCES accounts("id"), + "roomId" UUID REFERENCES rooms("id"), + "unique" BOOLEAN DEFAULT true NOT NULL, + CONSTRAINT fk_room FOREIGN KEY ("roomId") REFERENCES rooms("id") ON DELETE CASCADE, + CONSTRAINT fk_user FOREIGN KEY ("userId") REFERENCES accounts("id") ON DELETE CASCADE, + CONSTRAINT fk_agent FOREIGN KEY ("agentId") REFERENCES accounts("id") ON DELETE CASCADE +); + +CREATE TABLE IF NOT EXISTS goals ( + "id" UUID PRIMARY KEY, + "createdAt" TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP, + "userId" UUID REFERENCES accounts("id"), + "name" TEXT, + "status" TEXT, + "description" TEXT, + "roomId" UUID REFERENCES rooms("id"), + "objectives" JSONB DEFAULT '[]'::jsonb NOT NULL, + CONSTRAINT fk_room FOREIGN KEY ("roomId") REFERENCES rooms("id") ON DELETE CASCADE, + CONSTRAINT fk_user FOREIGN KEY ("userId") REFERENCES accounts("id") ON DELETE CASCADE +); + +CREATE TABLE IF NOT EXISTS logs ( + "id" UUID PRIMARY KEY DEFAULT gen_random_uuid(), + "createdAt" TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP, + "userId" UUID NOT NULL REFERENCES accounts("id"), + "body" JSONB NOT NULL, + "type" TEXT NOT NULL, + "roomId" UUID NOT NULL REFERENCES rooms("id"), + CONSTRAINT fk_room FOREIGN KEY ("roomId") REFERENCES rooms("id") ON DELETE CASCADE, + CONSTRAINT fk_user FOREIGN KEY ("userId") REFERENCES accounts("id") ON DELETE CASCADE +); + +CREATE TABLE IF NOT EXISTS participants ( + "id" UUID PRIMARY KEY, + "createdAt" TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP, + "userId" UUID REFERENCES accounts("id"), + "roomId" UUID REFERENCES rooms("id"), + "userState" TEXT, + "last_message_read" TEXT, + UNIQUE("userId", "roomId"), + CONSTRAINT fk_room FOREIGN KEY ("roomId") REFERENCES rooms("id") ON DELETE CASCADE, + CONSTRAINT fk_user FOREIGN KEY ("userId") REFERENCES accounts("id") ON DELETE CASCADE +); + +CREATE TABLE IF NOT EXISTS relationships ( + "id" UUID PRIMARY KEY, + "createdAt" TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP, + "userA" UUID NOT NULL REFERENCES accounts("id"), + "userB" UUID NOT NULL REFERENCES accounts("id"), + "status" TEXT, + "userId" UUID NOT NULL REFERENCES accounts("id"), + CONSTRAINT fk_user_a FOREIGN KEY ("userA") REFERENCES accounts("id") ON DELETE CASCADE, + CONSTRAINT fk_user_b FOREIGN KEY ("userB") REFERENCES accounts("id") ON DELETE CASCADE, + CONSTRAINT fk_user FOREIGN KEY ("userId") REFERENCES accounts("id") ON DELETE CASCADE +); + +CREATE TABLE IF NOT EXISTS cache ( + "key" TEXT NOT NULL, + "agentId" TEXT NOT NULL, + "value" JSONB DEFAULT '{}'::jsonb, + "createdAt" TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + "expiresAt" TIMESTAMP, + PRIMARY KEY ("key", "agentId") +); + +-- Indexes +CREATE INDEX IF NOT EXISTS idx_memories_embedding ON memories USING hnsw ("embedding" vector_cosine_ops); +CREATE INDEX IF NOT EXISTS idx_memories_type_room ON memories("type", "roomId"); +CREATE INDEX IF NOT EXISTS idx_participants_user ON participants("userId"); +CREATE INDEX IF NOT EXISTS idx_participants_room ON participants("roomId"); +CREATE INDEX IF NOT EXISTS idx_relationships_users ON relationships("userA", "userB"); + +COMMIT; \ No newline at end of file diff --git a/packages/plugin-unreal/src/actions.ts b/packages/plugin-unreal/src/actions.ts new file mode 100644 index 00000000..7ac6821e --- /dev/null +++ b/packages/plugin-unreal/src/actions.ts @@ -0,0 +1,202 @@ +import { composeContext, elizaLogger } from "@ai16z/eliza"; +import { generateMessageResponse, generateTrueOrFalse } from "@ai16z/eliza"; +import { booleanFooter, messageCompletionFooter } from "@ai16z/eliza"; +import { + Action, + ActionExample, + Content, + HandlerCallback, + IAgentRuntime, + Memory, + ModelClass, + State, +} from "@ai16z/eliza"; + +const maxContinuesInARow = 3; + +export const messageHandlerTemplate = + // {{goals}} + `# Action Examples +{{actionExamples}} +(Action examples are for reference only. Do not use the information from them in your response.) + +# Task: Generate dialog and actions for the character {{agentName}}. +About {{agentName}}: +{{bio}} +{{lore}} +{{knowledge}} + +{{providers}} + +{{attachments}} + +# Capabilities +Note that {{agentName}} is capable of reading/seeing/hearing various forms of media, including images, videos, audio, plaintext and PDFs. Recent attachments have been included above under the "Attachments" section. + +{{messageDirections}} + +{{recentMessages}} + +{{actions}} + +# Instructions: Write the next message for {{agentName}}. +` + messageCompletionFooter; + +export const shouldContinueTemplate = + `# Task: Decide if {{agentName}} should continue, or wait for others in the conversation so speak. + +{{agentName}} is brief, and doesn't want to be annoying. {{agentName}} will only continue if the message requires a continuation to finish the thought. + +Based on the following conversation, should {{agentName}} continue? YES or NO + +{{recentMessages}} + +Should {{agentName}} continue? ` + booleanFooter; + +export const continueAction: Action = { + name: "CONTINUE", + similes: ["ELABORATE", "KEEP_TALKING"], + description: + "ONLY use this action when the message necessitates a follow up. Do not use this action when the conversation is finished or the user does not wish to speak (use IGNORE instead). If the last message action was CONTINUE, and the user has not responded. Use sparingly.", + validate: async (runtime: IAgentRuntime, message: Memory) => { + const recentMessagesData = await runtime.messageManager.getMemories({ + roomId: message.roomId, + count: 10, + unique: false, + }); + const agentMessages = recentMessagesData.filter( + (m: { userId: any }) => m.userId === runtime.agentId + ); + + // check if the last messages were all continues= + if (agentMessages) { + const lastMessages = agentMessages.slice(0, maxContinuesInARow); + if (lastMessages.length >= maxContinuesInARow) { + const allContinues = lastMessages.every( + (m: { content: any }) => + (m.content as Content).action === "CONTINUE" + ); + if (allContinues) { + return false; + } + } + } + + return true; + }, + handler: async ( + runtime: IAgentRuntime, + message: Memory, + state: State, + options: any, + callback: HandlerCallback + ) => { + if ( + message.content.text.endsWith("?") || + message.content.text.endsWith("!") + ) { + return; + } + + if (!state) { + state = (await runtime.composeState(message)) as State; + } + + state = await runtime.updateRecentMessageState(state); + + async function _shouldContinue(state: State): Promise { + // If none of the above conditions are met, use the generateText to decide + const shouldRespondContext = composeContext({ + state, + template: shouldContinueTemplate, + }); + + const response = await generateTrueOrFalse({ + context: shouldRespondContext, + modelClass: ModelClass.SMALL, + runtime, + }); + + return response; + } + + const shouldContinue = await _shouldContinue(state); + if (!shouldContinue) { + elizaLogger.log("Not elaborating, returning"); + return; + } + + const context = composeContext({ + state, + template: + runtime.character.templates?.continueMessageHandlerTemplate || + runtime.character.templates?.messageHandlerTemplate || + messageHandlerTemplate, + }); + const { userId, roomId } = message; + + const response = await generateMessageResponse({ + runtime, + context, + modelClass: ModelClass.LARGE, + }); + + response.inReplyTo = message.id; + + runtime.databaseAdapter.log({ + body: { message, context, response }, + userId, + roomId, + type: "continue", + }); + + // prevent repetition + const messageExists = state.recentMessagesData + .filter((m: { userId: any }) => m.userId === runtime.agentId) + .slice(0, maxContinuesInARow + 1) + .some((m: { content: any }) => m.content === message.content); + + if (messageExists) { + return; + } + + await callback(response); + + // if the action is CONTINUE, check if we are over maxContinuesInARow + if (response.action === "CONTINUE") { + const agentMessages = state.recentMessagesData + .filter((m: { userId: any }) => m.userId === runtime.agentId) + .map((m: { content: any }) => (m.content as Content).action); + + const lastMessages = agentMessages.slice(0, maxContinuesInARow); + if (lastMessages.length >= maxContinuesInARow) { + const allContinues = lastMessages.every( + (m: string | undefined) => m === "CONTINUE" + ); + if (allContinues) { + response.action = null; + } + } + } + + return response; + }, + examples: [ + [ + { + user: "{{user1}}", + content: { + text: "we're planning a solo backpacking trip soon", + }, + }, + { + user: "{{user2}}", + content: { text: "oh sick", action: "CONTINUE" }, + }, + { + user: "{{user2}}", + content: { text: "where are you going" }, + }, + ], + ] as ActionExample[][], +} as Action; diff --git a/packages/plugin-unreal/src/evaluators.ts b/packages/plugin-unreal/src/evaluators.ts new file mode 100644 index 00000000..a36a3800 --- /dev/null +++ b/packages/plugin-unreal/src/evaluators.ts @@ -0,0 +1,208 @@ +import { composeContext } from "@ai16z/eliza"; +import { generateObjectArray } from "@ai16z/eliza"; +import { MemoryManager } from "@ai16z/eliza"; +import { + ActionExample, + IAgentRuntime, + Memory, + ModelClass, + Evaluator, +} from "@ai16z/eliza"; + +export const formatFacts = (facts: Memory[]) => { + const messageStrings = facts + .reverse() + .map((fact: Memory) => fact.content.text); + const finalMessageStrings = messageStrings.join("\n"); + return finalMessageStrings; +}; + +const factsTemplate = + // {{actors}} + `TASK: Extract Claims from the conversation as an array of claims in JSON format. + +# START OF EXAMPLES +These are an examples of the expected output of this task: +{{evaluationExamples}} +# END OF EXAMPLES + +# INSTRUCTIONS + +Extract any claims from the conversation that are not already present in the list of known facts above: +- Try not to include already-known facts. If you think a fact is already known, but you're not sure, respond with already_known: true. +- If the fact is already in the user's description, set in_bio to true + +Recent Messages: +{{recentMessages}} + +Response should be a JSON object array inside a JSON markdown block. Correct response format: +\`\`\`json +[ + {"claim": string, "type": enum, in_bio: boolean, already_known: boolean }, + {"claim": string, "type": enum, in_bio: boolean, already_known: boolean }, + ... +] +\`\`\``; + +async function handler(runtime: IAgentRuntime, message: Memory) { + const state = await runtime.composeState(message); + + const { agentId, roomId } = state; + + const context = composeContext({ + state, + template: runtime.character.templates?.factsTemplate || factsTemplate, + }); + + const facts = await generateObjectArray({ + runtime, + context, + modelClass: ModelClass.LARGE, + }); + + const factsManager = new MemoryManager({ + runtime, + tableName: "facts", + }); + + if (!facts) { + return []; + } + + // If the fact is known or corrupted, remove it + const filteredFacts = facts + .filter((fact) => { + return ( + !fact.already_known && + fact.type === "fact" && + !fact.in_bio && + fact.claim && + fact.claim.trim() !== "" + ); + }) + .map((fact) => fact.claim); + + for (const fact of filteredFacts) { + const factMemory = await factsManager.addEmbeddingToMemory({ + userId: agentId!, + agentId, + content: { text: fact }, + roomId, + createdAt: Date.now(), + }); + + await factsManager.createMemory(factMemory, true); + + await new Promise((resolve) => setTimeout(resolve, 250)); + } + return filteredFacts; +} + +export const factEvaluator: Evaluator = { + name: "GET_FACTS", + similes: [ + "GET_CLAIMS", + "EXTRACT_CLAIMS", + "EXTRACT_FACTS", + "EXTRACT_CLAIM", + "EXTRACT_INFORMATION", + ], + validate: async ( + runtime: IAgentRuntime, + + message: Memory + ): Promise => { + const messageCount = (await runtime.messageManager.countMemories( + message.roomId + )) as number; + + const reflectionCount = Math.ceil(runtime.getConversationLength() / 2); + + return messageCount % reflectionCount === 0; + }, + description: + "Extract factual information about the people in the conversation, the current events in the world, and anything else that might be important to remember.", + handler, + examples: [ + { + context: `Actors in the scene: +{{user1}}: Programmer and moderator of the local story club. +{{user2}}: New member of the club. Likes to write and read. + +Facts about the actors: +None`, + messages: [ + { + user: "{{user1}}", + content: { text: "So where are you from" }, + }, + { + user: "{{user2}}", + content: { text: "I'm from the city" }, + }, + ] as ActionExample[], + outcome: `{ "claim": "{{user1}} is from Oakland", "type": "fact", "in_bio": false, "already_known": false },`, + }, + { + context: `Actors in the scene: +{{user1}}: Athelete and cyclist. Worked out every day for a year to prepare for a marathon. +{{user2}}: Likes to go to the beach and shop. + +Facts about the actors: +{{user1}} and {{user2}} are talking about the marathon +{{user1}} and {{user2}} have just started dating`, + messages: [ + { + user: "{{user1}}", + content: { + text: "I finally completed the marathon this year!", + }, + }, + ] as ActionExample[], + outcome: `Claims: +json\`\`\` +[ + { "claim": "Alex just completed a marathon in just under 4 hours.", "type": "fact", "in_bio": false, "already_known": false }, +] +\`\`\` +`, + }, + { + context: `Actors in the scene: +{{user1}}: Likes to play poker and go to the park. Friends with Eva. +{{user2}}: Also likes to play poker. Likes to write and read. + +Facts about the actors: +Mike and Eva won a regional poker tournament about six months ago +Mike is married to Alex +Eva studied Philosophy before switching to Computer Science`, + messages: [ + { + user: "{{user1}}", + content: { + text: "Remember when we won the regional poker tournament last spring", + }, + }, + { + user: "{{user2}}", + content: { + text: "That was one of the best days of my life", + }, + }, + { + user: "{{user1}}", + content: { + text: "It really put our poker club on the map", + }, + }, + ] as ActionExample[], + outcome: `Claims: +json\`\`\` +[ + { "claim": "Mike and Eva won the regional poker tournament last spring", "type": "fact", "in_bio": false, "already_known": true }, + { "claim": "Winning the regional poker tournament put the poker club on the map", "type": "opinion", "in_bio": false, "already_known": false } +] +\`\`\``, + }, + ], +}; diff --git a/packages/plugin-unreal/src/index.ts b/packages/plugin-unreal/src/index.ts new file mode 100644 index 00000000..6b848128 --- /dev/null +++ b/packages/plugin-unreal/src/index.ts @@ -0,0 +1,172 @@ +import { Plugin } from "@ai16z/eliza"; +import { continueAction } from "./actions.ts"; +import { factEvaluator } from "./evaluators.ts"; +import { factsProvider } from "./providers.ts"; + +export * as actions from "./actions.ts"; +export * as evaluators from "./evaluators.ts"; +export * as providers from "./providers.ts"; + +import { AgentRuntime, knowledge, stringToUuid, generateText, settings, Action, elizaLogger, MemoryManager, EvaluationExample, Content } from "@ai16z/eliza"; +import type { KnowledgeItem } from "@ai16z/eliza"; + +import { + Evaluator, + IAgentRuntime, + Memory, + State, + Provider, + HandlerCallback, +} from "@ai16z/eliza"; + +const saveThisAction: Action = { + name: "SAVE_THIS", + description: "Stores important information from the conversation in the agent's long-term knowledge base", + similes: [], + validate: async (runtime: IAgentRuntime, message: Memory) => { + return Promise.resolve(!!message?.content?.text); + }, + + handler: async ( + runtime: IAgentRuntime, + message: Memory, + state: State, + _options: { [key: string]: unknown }, + callback?: HandlerCallback + ) => { + try { + + if (!state) { + elizaLogger.error("[SaveThisAction] handler.start - no state"); + return state; + } + + // Only proceed if explicitly requested via state + if (!state?.shouldSave) { + elizaLogger.info('[SaveThisAction] handler.abort - Save not requested in state'); + return state; // Important: Return the unchanged state + } + // Get recent messages + const recentMessages = await runtime.messageManager.getMemories({ + roomId: message.roomId, + count: 7, + unique: false + }); + + // combine the text from recent messages into a string + const recentMessagesText = recentMessages + .sort((a, b) => (a.createdAt || 0) - (b.createdAt || 0)) + .map(msg => msg.content.text) + .join("\n\n"); + + elizaLogger.info("Recent messages:", recentMessagesText); + + const saveKnowledge = await generateText({ + runtime, + context: `\ +The following messages are from a conversation between an ai agent and a user. +responses by the agent, retaining style and tone. Save the memory as a paragraph of text, not in point +or bullet form. Here are the messages: +${recentMessagesText}`, + modelClass: "medium" + }); + + // Save the message content to the knowledge base + const memoryToSave = { + id: stringToUuid(`memory_${Date.now()}`), + content: { + text: saveKnowledge, + source: "agentdata" + } + }; + + //elizaLogger.info("Memory to save:", memoryToSave); + + await knowledge.set(runtime as AgentRuntime, memoryToSave); + + // TODO: callback is undefined. Need to receive callback from Provider. + if (callback) { + await callback({ + text: `I've stored the information for you`, + type: "text" + }, []); + } + + } catch (error) { + elizaLogger.error('[Action] handler.error:', error); + if (callback) { + await callback({ + text: "Sorry, I encountered an error while saving.", + content: { + success: false, + text: "Sorry, I encountered an error while saving." + } + }, []); + } + return false; + } + }, + examples: [] +}; + +export const saveThisProvider: Provider = { + get: async (runtime: IAgentRuntime, message: Memory, + state?: State, callback?: HandlerCallback ) => { + const text = message.content?.text?.toLowerCase() || ''; + + // Trigger if message starts with "save this" + if (text.trim().startsWith('save this')) { + // Modify state in place first + if (state) { + state.shouldSave = true; + } + + if(!state.shouldSave) { + elizaLogger.error('saveThisProvider: state.shouldSave is faised'); + } + + //elizaLogger.info(state.recentMessages); + elizaLogger.info("saveThisProvider: state.shouldSave", state.shouldSave); + + // need to figure out how to pass a callback into runtime.processActions + //const mycallback = async (response: Content, files?: Memory[]): Promise => { + // to be implemented + //}; + + // Then trigger the SAVE_THIS action + await runtime.processActions(message, [{ + id: stringToUuid(`save_this_response_${Date.now()}`), + userId: message.userId, + agentId: message.agentId, + roomId: message.roomId, + content: { + action: 'SAVE_THIS', + text: 'Saving previous message...' + }, + + }], state=state, + //callback=mycallback figure out what this should be + ); + } + + return; + } +}; + + +export const saveThisPlugin: Plugin = { + name: "save-this", + description: "Plugin for saving important information from conversations using a save this keyphrase", + actions: [saveThisAction], + evaluators: [], + providers: [saveThisProvider] +}; + + +export const unrealPlugin: Plugin = { + name: "unreal", + description: "Unreal Agent with basic actions and evaluators", + actions: [continueAction], + evaluators: [factEvaluator], + providers: [factsProvider], +}; diff --git a/packages/plugin-unreal/src/providers.ts b/packages/plugin-unreal/src/providers.ts new file mode 100644 index 00000000..9c1137de --- /dev/null +++ b/packages/plugin-unreal/src/providers.ts @@ -0,0 +1,61 @@ +import { + embed, + MemoryManager, + formatMessages, + AgentRuntime as IAgentRuntime, +} from "@ai16z/eliza"; +import type { Memory, Provider, State } from "@ai16z/eliza"; +import { formatFacts } from "./evaluators.ts"; + +const factsProvider: Provider = { + get: async (runtime: IAgentRuntime, message: Memory, state?: State) => { + const recentMessagesData = state?.recentMessagesData?.slice(-10); + + const recentMessages = formatMessages({ + messages: recentMessagesData, + actors: state?.actorsData, + }); + + const _embedding = await embed(runtime, recentMessages); + + const memoryManager = new MemoryManager({ + runtime, + tableName: "facts", + }); + + const relevantFacts = []; + // await memoryManager.searchMemoriesByEmbedding( + // embedding, + // { + // roomId: message.roomId, + // count: 10, + // agentId: runtime.agentId, + // } + // ); + + const recentFactsData = await memoryManager.getMemories({ + roomId: message.roomId, + count: 10, + start: 0, + end: Date.now(), + }); + + // join the two and deduplicate + const allFacts = [...relevantFacts, ...recentFactsData].filter( + (fact, index, self) => + index === self.findIndex((t) => t.id === fact.id) + ); + + if (allFacts.length === 0) { + return ""; + } + + const formattedFacts = formatFacts(allFacts); + + return "Key facts that {{agentName}} knows:\n{{formattedFacts}}" + .replace("{{agentName}}", runtime.character.name) + .replace("{{formattedFacts}}", formattedFacts); + }, +}; + +export { factsProvider }; diff --git a/packages/plugin-unreal/tsconfig.json b/packages/plugin-unreal/tsconfig.json new file mode 100644 index 00000000..834c4dce --- /dev/null +++ b/packages/plugin-unreal/tsconfig.json @@ -0,0 +1,13 @@ +{ + "extends": "../core/tsconfig.json", + "compilerOptions": { + "outDir": "dist", + "rootDir": "src", + "types": [ + "node" + ] + }, + "include": [ + "src/**/*.ts" + ] +} \ No newline at end of file diff --git a/packages/plugin-unreal/tsup.config.ts b/packages/plugin-unreal/tsup.config.ts new file mode 100644 index 00000000..e42bf4ef --- /dev/null +++ b/packages/plugin-unreal/tsup.config.ts @@ -0,0 +1,20 @@ +import { defineConfig } from "tsup"; + +export default defineConfig({ + entry: ["src/index.ts"], + outDir: "dist", + sourcemap: true, + clean: true, + format: ["esm"], // Ensure you're targeting CommonJS + external: [ + "dotenv", // Externalize dotenv to prevent bundling + "fs", // Externalize fs to use Node.js built-in module + "path", // Externalize other built-ins if necessary + "@reflink/reflink", + "@node-llama-cpp", + "https", + "http", + "agentkeepalive", + // Add other modules you want to externalize + ], +}); diff --git a/packages/plugin-unreal/unreal/LICENSE b/packages/plugin-unreal/unreal/LICENSE new file mode 100644 index 00000000..8b5ed50c --- /dev/null +++ b/packages/plugin-unreal/unreal/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2024 metakai1 + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/packages/plugin-unreal/unreal/design/code/dd_land_database_adapter.md b/packages/plugin-unreal/unreal/design/code/dd_land_database_adapter.md new file mode 100644 index 00000000..f5ad7903 --- /dev/null +++ b/packages/plugin-unreal/unreal/design/code/dd_land_database_adapter.md @@ -0,0 +1,227 @@ +# Land Database Adapter Documentation + +## Overview +The Land Database Adapter extends the PostgreSQL Database Adapter to provide specialized functionality for managing and querying virtual real estate data. It combines vector-based semantic search with structured metadata queries to enable powerful and flexible property searches. + +## Key Components + +### LandSearchParams Interface +```typescript +interface LandSearchParams { + neighborhoods?: string[]; + zoningTypes?: ZoningType[]; + plotSizes?: PlotSize[]; + buildingTypes?: BuildingType[]; + distances?: { + ocean?: { maxMeters?: number; category?: DistanceCategory }; + bay?: { maxMeters?: number; category?: DistanceCategory }; + }; + building?: { + floors?: { min?: number; max?: number }; + height?: { min?: number; max?: number }; + }; + rarity?: { + rankRange?: { min?: number; max?: number }; + }; + coordinates?: { + center: { x: number; y: number }; + radius: number; + }; +} +``` + +This interface defines all possible search parameters for property queries. All fields are optional, allowing for flexible search combinations. + +## Core Methods + +### createLandMemory +```typescript +async createLandMemory(memory: LandPlotMemory): Promise +``` +Creates a new land property record in the database. + +**Parameters:** +- `memory`: A LandPlotMemory object containing property details and metadata + +**Example:** +```typescript +await landDB.createLandMemory({ + id: "uuid", + content: { + text: "Luxury oceanfront property...", + metadata: { + neighborhood: "North Star", + zoning: ZoningType.Residential, + // ... other metadata + } + } +}); +``` + +### searchLandByMetadata +```typescript +async searchLandByMetadata(params: LandSearchParams): Promise +``` +Searches for properties using metadata filters. + +**Parameters:** +- `params`: Search criteria following the LandSearchParams interface + +**Example:** +```typescript +const luxuryProperties = await landDB.searchLandByMetadata({ + neighborhoods: ["North Star"], + rarity: { + rankRange: { max: 500 } // Premium properties + }, + distances: { + ocean: { category: DistanceCategory.Close } + } +}); +``` + +### searchLandByCombinedCriteria +```typescript +async searchLandByCombinedCriteria( + embedding: number[], + metadata: Partial, + similarity_threshold: number = 0.7 +): Promise +``` +Combines semantic search with metadata filtering. + +**Parameters:** +- `embedding`: Vector representation of search query +- `metadata`: Metadata filters +- `similarity_threshold`: Minimum similarity score (0-1) + +**Example:** +```typescript +const results = await landDB.searchLandByCombinedCriteria( + queryEmbedding, + { + plotSizes: [PlotSize.Mega], + buildingTypes: [BuildingType.Highrise] + }, + 0.8 +); +``` + +### getNearbyProperties +```typescript +async getNearbyProperties( + coordinates: { x: number; y: number }, + radiusMeters: number, + limit: number = 10 +): Promise +``` +Finds properties within a specified radius. + +**Parameters:** +- `coordinates`: Center point coordinates +- `radiusMeters`: Search radius in meters +- `limit`: Maximum number of results + +**Example:** +```typescript +const nearbyProps = await landDB.getNearbyProperties( + { x: 500, y: 300 }, + 1000, // 1km radius + 5 // Top 5 results +); +``` + +### updateLandMetadata +```typescript +async updateLandMetadata( + memoryId: UUID, + metadata: Partial +): Promise +``` +Updates specific metadata fields for a property. + +**Parameters:** +- `memoryId`: Property identifier +- `metadata`: Partial metadata object with fields to update + +**Example:** +```typescript +await landDB.updateLandMetadata(propertyId, { + rarity: { + rank: 250, + category: "Premium" + } +}); +``` + +## Advanced Features + +### Spatial Search +The adapter supports spatial queries using PostgreSQL's geometric operations: +- Point-based distance calculations +- Radius-based proximity search +- Coordinate-based filtering + +### Combined Search Capabilities +- Semantic similarity using vector embeddings +- Metadata filtering with multiple criteria +- Spatial constraints +- Rarity and ranking filters + +### Query Optimization +- Efficient JSON field querying +- Index utilization for common search patterns +- Type casting for performance +- Array operations for bulk comparisons + +## Error Handling + +The adapter includes comprehensive error handling: +- Input validation +- Type checking +- Query error recovery +- Logging through elizaLogger + +## Usage Best Practices + +1. **Metadata Queries** + - Use the most specific filters possible + - Combine multiple criteria for precise results + - Consider using ranges for numerical values + +2. **Semantic Search** + - Provide quality embeddings for better results + - Adjust similarity threshold based on needs + - Combine with metadata for better precision + +3. **Spatial Queries** + - Use appropriate radius values + - Consider performance with large radius searches + - Combine with other filters when possible + +4. **Updates** + - Use partial updates when possible + - Validate metadata before updates + - Consider embedding updates if text changes + +## Dependencies +- @ai16z/adapter-postgres +- @ai16z/eliza +- PostgreSQL with vector extension + +## Performance Considerations + +1. **Index Usage** + - JSON field indices for metadata queries + - Vector indices for semantic search + - Spatial indices for location queries + +2. **Query Optimization** + - Combined queries are executed efficiently + - Metadata filtering happens at database level + - Spatial calculations use native PostgreSQL functions + +3. **Memory Management** + - Large result sets are handled in chunks + - Connection pooling for better resource usage + - Proper cleanup of database resources diff --git a/packages/plugin-unreal/unreal/design/code/dd_land_database_adapter.pdf b/packages/plugin-unreal/unreal/design/code/dd_land_database_adapter.pdf new file mode 100644 index 00000000..61e6e5d0 Binary files /dev/null and b/packages/plugin-unreal/unreal/design/code/dd_land_database_adapter.pdf differ diff --git a/packages/plugin-unreal/unreal/design/code/land_database_adapter.ts b/packages/plugin-unreal/unreal/design/code/land_database_adapter.ts new file mode 100644 index 00000000..af5c84ca --- /dev/null +++ b/packages/plugin-unreal/unreal/design/code/land_database_adapter.ts @@ -0,0 +1,308 @@ +/* + * Land Database Adapter Design Document + * =================================== + * + * Overview + * -------- + * The Land Database Adapter extends Eliza's PostgreSQL adapter to provide specialized + * functionality for managing virtual real estate data. It combines vector-based semantic + * search with structured metadata queries. + * + * Integration with Eliza Memory System + * ---------------------------------- + * 1. Memory Structure + * - Uses single table: 'land_memories' + * - Uses single room: 'global_land' + * - Uses single agent: 'land_system' + * + * 2. Memory Format + * LandPlotMemory extends Eliza's base Memory type: + * { + * id: UUID, + * roomId: 'global_land', + * agentId: 'land_system', + * content: { + * text: string, // Semantic description + * metadata: { // Structured data + * neighborhood: string, + * zoning: ZoningType, + * plotSize: PlotSize, + * // ... other metadata + * } + * } + * } + * + * Key Components + * ------------- + * 1. Metadata Search + * - Structured queries using PostgreSQL JSON operators + * - Filters: neighborhood, zoning, plot size, distances, building specs, rarity + * + * 2. Semantic Search + * - Leverages Eliza's vector search capabilities + * - Uses text embeddings for similarity matching + * + * 3. Combined Search + * - Intersects results from metadata and semantic searches + * - Allows natural language queries with structured filters + * + * Usage Patterns + * ------------- + * 1. Creating Land Records + * ```typescript + * await landDB.createLandMemory({ + * content: { + * text: "Beachfront property with ocean views...", + * metadata: { + * neighborhood: "North Shore", + * zoning: ZoningType.Residential + * } + * } + * }); + * ``` + * + * 2. Searching Properties + * ```typescript + * // Metadata search + * const beachProperties = await landDB.searchLandByMetadata({ + * neighborhoods: ["North Shore"], + * distances: { ocean: { category: DistanceCategory.Close } } + * }); + * + * // Combined search + * const results = await landDB.searchLandByCombinedCriteria( + * queryEmbedding, + * { plotSizes: [PlotSize.Large] } + * ); + * ``` + * + * Integration Steps + * --------------- + * 1. Initialize Database + * ```typescript + * const landDB = new LandDatabaseAdapter({ + * host: 'localhost', + * database: 'land_db', + * // ... other pg config + * }); + * await landDB.init(); + * ``` + * + * 2. Connect with Memory System + * ```typescript + * import { MemorySystem } from './memories'; + * + * const memorySystem = new MemorySystem({ + * database: landDB, + * // ... other memory config + * }); + * ``` + * + * 3. Use in Land System + * ```typescript + * class LandSystem { + * constructor( + * private readonly memorySystem: MemorySystem, + * private readonly landDB: LandDatabaseAdapter + * ) {} + * + * async searchProperties(query: string, filters: LandSearchParams) { + * const embedding = await this.memorySystem.embedText(query); + * return this.landDB.searchLandByCombinedCriteria(embedding, filters); + * } + * } + * ``` + * + * Performance Considerations + * ------------------------ + * 1. Indexing + * - Create GiST index for vector similarity search + * - Create indexes on frequently queried JSON paths + * + * 2. Query Optimization + * - Metadata filters applied before expensive vector operations + * - Use appropriate match thresholds for semantic search + * + * Future Enhancements + * ------------------ + * 1. Multiple Worlds Support + * - Add world/realm separation using roomId + * - Implement cross-world search capabilities + * + * 2. Property Updates + * - Add metadata update functionality + * - Implement version tracking + * + * 3. Spatial Search + * - Add coordinate-based search + * - Implement proximity queries + */ + + +import { PostgresDatabaseAdapter } from "@ai16z/adapter-postgres"; +import { UUID, Memory, elizaLogger } from "@ai16z/eliza"; +import { LandPlotMemory, LandPlotMetadata, DistanceCategory, PlotSize, ZoningType, BuildingType } from "./v2_land_memorysystem"; + +export interface LandSearchParams { + neighborhoods?: string[]; + zoningTypes?: ZoningType[]; + plotSizes?: PlotSize[]; + buildingTypes?: BuildingType[]; + distances?: { + ocean?: { + maxMeters?: number; + category?: DistanceCategory; + }; + bay?: { + maxMeters?: number; + category?: DistanceCategory; + }; + }; + building?: { + floors?: { + min?: number; + max?: number; + }; + height?: { + min?: number; + max?: number; + }; + }; + rarity?: { + rankRange?: { + min?: number; + max?: number; + }; + }; +} + +export class LandDatabaseAdapter extends PostgresDatabaseAdapter { + private readonly LAND_TABLE = 'land_memories'; + + constructor(connectionConfig: any) { + super(connectionConfig); + } + + async createLandMemory(memory: LandPlotMemory): Promise { + await this.createMemory(memory, this.LAND_TABLE); + } + + async searchLandByMetadata(params: LandSearchParams): Promise { + let sql = ` + SELECT * FROM memories + WHERE type = $1 + AND content IS NOT NULL + `; + const values: any[] = [this.LAND_TABLE]; + let paramCount = 1; + + if (params.neighborhoods?.length) { + paramCount++; + sql += ` AND content->'metadata'->>'neighborhood' = ANY($${paramCount}::text[])`; + values.push(params.neighborhoods); + } + + if (params.zoningTypes?.length) { + paramCount++; + sql += ` AND content->'metadata'->>'zoning' = ANY($${paramCount}::text[])`; + values.push(params.zoningTypes); + } + + if (params.plotSizes?.length) { + paramCount++; + sql += ` AND content->'metadata'->>'plotSize' = ANY($${paramCount}::text[])`; + values.push(params.plotSizes); + } + + if (params.distances?.ocean) { + if (params.distances.ocean.maxMeters) { + paramCount++; + sql += ` AND (content->'metadata'->'distances'->'ocean'->>'meters')::int <= $${paramCount}`; + values.push(params.distances.ocean.maxMeters); + } + if (params.distances.ocean.category) { + paramCount++; + sql += ` AND content->'metadata'->'distances'->'ocean'->>'category' = $${paramCount}`; + values.push(params.distances.ocean.category); + } + } + + if (params.building?.floors) { + if (params.building.floors.min) { + paramCount++; + sql += ` AND (content->'metadata'->'building'->'floors'->>'min')::int >= $${paramCount}`; + values.push(params.building.floors.min); + } + if (params.building.floors.max) { + paramCount++; + sql += ` AND (content->'metadata'->'building'->'floors'->>'max')::int <= $${paramCount}`; + values.push(params.building.floors.max); + } + } + + if (params.rarity?.rankRange) { + if (params.rarity.rankRange.min) { + paramCount++; + sql += ` AND (content->'metadata'->'rarity'->>'rank')::int >= $${paramCount}`; + values.push(params.rarity.rankRange.min); + } + if (params.rarity.rankRange.max) { + paramCount++; + sql += ` AND (content->'metadata'->'rarity'->>'rank')::int <= $${paramCount}`; + values.push(params.rarity.rankRange.max); + } + } + + try { + const { rows } = await this.query(sql, values); + return rows.map(row => ({ + ...row, + content: typeof row.content === 'string' ? JSON.parse(row.content) : row.content + })); + } catch (error) { + elizaLogger.error('Error in searchLandByMetadata:', { + error: error instanceof Error ? error.message : String(error), + params + }); + throw error; + } + } + + async searchLandByCombinedCriteria( + embedding: number[], + metadata: Partial, + similarity_threshold: number = 0.7 + ): Promise { + // First get semantic search results + const semanticResults = await this.searchMemoriesByEmbedding(embedding, { + tableName: this.LAND_TABLE, + match_threshold: similarity_threshold + }); + + // If no metadata filters, return semantic results + if (Object.keys(metadata).length === 0) { + return semanticResults as LandPlotMemory[]; + } + + // Get metadata search results + const metadataResults = await this.searchLandByMetadata(metadata); + + // Find intersection of results based on memory IDs + const semanticIds = new Set(semanticResults.map(r => r.id)); + return metadataResults.filter(r => semanticIds.has(r.id)); + } + + async getPropertiesByRarityRange( + minRank: number, + maxRank: number + ): Promise { + return this.searchLandByMetadata({ + rarity: { + rankRange: { + min: minRank, + max: maxRank + } + } + }); + } +} \ No newline at end of file diff --git a/packages/plugin-unreal/unreal/design/code/land_memorysystem.ts b/packages/plugin-unreal/unreal/design/code/land_memorysystem.ts new file mode 100644 index 00000000..1896f28a --- /dev/null +++ b/packages/plugin-unreal/unreal/design/code/land_memorysystem.ts @@ -0,0 +1,114 @@ +/** + * Land Plot Memory System Design + * + * This system converts land plot data into searchable memories and provides + * a natural language interface for querying the data. + */ + +interface LandPlotContent { + text: string; // Searchable description of the plot + metadata: { + rank: number; + name: string; + neighborhood: string; + zoningType: string; + plotSize: string; + buildingSize: string; + oceanProximity: string; + bayProximity: string; + floorRange: [number, number]; + plotArea: number; + buildingHeightRange: [number, number]; + distances: { + ocean: number; + bay: number; + }; + }; +} + +interface LandPlotMemory extends Memory { + content: LandPlotContent; +} + +/** + * Converts a CSV row into a natural language description for embedding + */ +function generatePlotDescription(plot: any): string { + return `${plot.Name} is a ${plot['Plot Size']} ${plot['Zoning Type']} plot in ${plot.Neighborhood}. ` + + `It is a ${plot['Building Size']} building with ${plot['Min # of Floors']} to ${plot['Max # of Floors']} floors. ` + + `The plot area is ${plot['Plot Area (m²)']}m² with building heights from ${plot['Min Building Height (m)']}m to ${plot['Max Building Height (m)']}m. ` + + `Located ${plot['Distance to Ocean']} from ocean (${plot['Distance to Ocean (m)']}m) and ${plot['Distance to Bay']} from bay (${plot['Distance to Bay (m)']}m).`; +} + +/** + * System Prompt for Query Processing + */ +const LAND_QUERY_SYSTEM_PROMPT = ` +You are a real estate search assistant for a futuristic city. Convert natural language queries into structured search parameters. + +Given a user query, respond with a JSON object containing: +1. A natural language description for embedding matching +2. Search metadata parameters + +Example Response Format: +{ + "searchText": "Large plot in Nexus neighborhood close to ocean with tall building potential", + "metadata": { + "neighborhood": "Nexus", + "minPlotArea": 5000, + "maxOceanDistance": 500, + "minFloors": 50 + } +} + +Keep the searchText natural and descriptive while being specific about requirements. +`; + +/** + * Implementation Strategy: + * + * 1. Data Ingestion: + * - Parse CSV rows + * - Generate natural language descriptions + * - Create Memory objects with embeddings + * - Store in memory database + * + * 2. Query Processing: + * - Use system prompt to convert user query to search parameters + * - Generate embedding for search text + * - Use searchMemoriesByEmbedding() with metadata filtering + * + * 3. Memory Structure: + * - Table name: "land_plots" + * - Each record is a LandPlotMemory + * - Embedding generated from description + * - Metadata stored in content.metadata + * + * 4. Search Flow: + * a. User submits natural language query + * b. Query processor converts to search parameters + * c. Generate embedding for search text + * d. Perform embedding search with metadata filters + * e. Rank and return results + */ + +// Usage example: +interface SearchQuery { + searchText: string; + metadata: { + neighborhood?: string; + minPlotArea?: number; + maxPlotArea?: number; + minFloors?: number; + maxFloors?: number; + maxOceanDistance?: number; + maxBayDistance?: number; + zoningType?: string; + buildingSize?: string; + }; +} + +// Memory table configuration +const LAND_PLOTS_TABLE = "land_plots"; +const MATCH_THRESHOLD = 0.75; +const DEFAULT_MATCH_COUNT = 20; \ No newline at end of file diff --git a/packages/plugin-unreal/unreal/design/code/v2 land_memorysystem.ts b/packages/plugin-unreal/unreal/design/code/v2 land_memorysystem.ts new file mode 100644 index 00000000..5bb0f9ae --- /dev/null +++ b/packages/plugin-unreal/unreal/design/code/v2 land_memorysystem.ts @@ -0,0 +1,159 @@ +import { Memory, UUID } from "@ai16z/eliza"; + +// Enums for our categorical data +export enum PlotSize { + Nano = "Nano", + Micro = "Micro", + Mid = "Mid", + Mega = "Mega", + Mammoth = "Mammoth", + Giga = "Giga" +} + +export enum ZoningType { + Legendary = "Legendary", + MixedUse = "Mixed Use", + Industrial = "Industrial", + Residential = "Residential", + Commercial = "Commercial" +} + +export enum BuildingType { + Lowrise = "Lowrise", + Highrise = "Highrise", + Tall = "Tall", + Megatall = "Megatall" +} + +export enum DistanceCategory { + Close = "Close", + Medium = "Medium", + Far = "Far" +} + +// Interface for our property metadata +export interface LandPlotMetadata { + neighborhood: string; + zoning: ZoningType; + plotSize: PlotSize; + buildingType: BuildingType; + distances: { + ocean: { + meters: number; + category: DistanceCategory; + }; + bay: { + meters: number; + category: DistanceCategory; + }; + }; + building: { + floors: { + min: number; + max: number; + }; + height: { + min: number; + max: number; + }; + }; + plot: { + area: number; + coordinates: { + x: number; + y: number; + }; + }; + rarity: { + rank: number; + category: string; + }; +} + +// Interface that extends Memory with our metadata +export interface LandPlotMemory extends Memory { + id: UUID; + content: { + text: string; + metadata: LandPlotMetadata; + }; +} + +// Helper function to generate description from metadata +export function generateDescription(plot: LandPlotMetadata): string { + return `${plot.plotSize} ${plot.zoning} plot in ${plot.neighborhood}. ` + + `It is a ${plot.buildingType} building. ` + + `Located ${plot.distances.ocean.category} from ocean and ${plot.distances.bay.category} from bay.`; +} + +// Helper function to create a LandPlotMemory +export function createLandPlotMemory( + id: UUID, + metadata: LandPlotMetadata, + agentId: UUID, + roomId: UUID +): LandPlotMemory { + return { + id, + agentId, + roomId, + userId: agentId, // Using agentId as userId for consistency + content: { + text: generateDescription(metadata), + metadata + } + }; +} + +// Helper function to categorize distance +export function categorizeDistance(meters: number): DistanceCategory { + if (meters <= 300) return DistanceCategory.Close; + if (meters <= 700) return DistanceCategory.Medium; + return DistanceCategory.Far; +} + +// Helper function to categorize rarity +export function categorizeRarity(rank: number): string { + if (rank <= 100) return "Ultra Premium"; + if (rank <= 500) return "Premium"; + if (rank <= 2000) return "Standard"; + if (rank <= 3000) return "Value"; + return "Entry Level"; +} + +// Example usage: +const plotMetadata: LandPlotMetadata = { + neighborhood: "North Star", + zoning: ZoningType.Residential, + plotSize: PlotSize.Nano, + buildingType: BuildingType.Lowrise, + distances: { + ocean: { + meters: 250, + category: DistanceCategory.Close + }, + bay: { + meters: 500, + category: DistanceCategory.Medium + } + }, + building: { + floors: { min: 1, max: 20 }, + height: { min: 4, max: 80 } + }, + plot: { + area: 1000, + coordinates: { x: 250, y: 500 } + }, + rarity: { + rank: 299, + category: "Premium" + } +}; + +const landPlotMemory = createLandPlotMemory( + "some-uuid", + plotMetadata, + "agent-uuid", + "room-uuid" +); \ No newline at end of file diff --git a/packages/plugin-unreal/unreal/design/csv/landsheet.csv b/packages/plugin-unreal/unreal/design/csv/landsheet.csv new file mode 100644 index 00000000..34cfdb10 --- /dev/null +++ b/packages/plugin-unreal/unreal/design/csv/landsheet.csv @@ -0,0 +1,4445 @@ +Rank,Name,Neighborhood,Zoning Type,Plot Size,Building Size,Distance to Ocean,Distance to Bay,Max # of Floors,Min # of Floors,Plot Area (m²),Min Building Height (m),Max Building Height (m),Distance to Ocean (m),Distance to Bay (m) +1,NX-1,Nexus,Legendary,Giga,Megatall,Close,Far,113,91,8696,455,568,294,1052 +2,FL-163,Flashing Lights,Legendary,Giga,Megatall,Medium,Far,105,84,12473,421,526,462,1191 +2,FL-192,Flashing Lights,Legendary,Giga,Megatall,Medium,Far,116,92,8696,464,580,317,1215 +4,FL-141,Flashing Lights,Legendary,Giga,Megatall,Far,Medium,105,84,13252,421,526,2413,577 +4,FL-162,Flashing Lights,Legendary,Giga,Megatall,Far,Medium,111,89,13901,446,557,1966,548 +6,FL-68,Flashing Lights,Legendary,Giga,Megatall,Far,Far,118,94,13901,474,592,761,1019 +6,FL-112,Flashing Lights,Legendary,Giga,Megatall,Far,Far,107,85,28145,429,536,818,1091 +6,FL-142,Flashing Lights,Legendary,Giga,Megatall,Far,Far,105,84,18064,421,526,1184,731 +9,SM-263,Space Mind,Legendary,Giga,Megatall,Far,Close,109,87,17192,438,547,1574,136 +10,SM-107,Space Mind,Legendary,Giga,Megatall,Far,Medium,111,89,14874,446,557,2049,415 +11,FL-113,Flashing Lights,Legendary,Mammoth,Megatall,Medium,Far,116,92,8239,464,580,314,1467 +12,FL-64,Flashing Lights,Legendary,Mega,Supertall,Far,Medium,94,75,6491,376,470,1947,507 +13,FL-34,Flashing Lights,Legendary,Macro,Supertall,Far,Medium,89,71,5129,359,448,1227,352 +14,NS-930,North Star,Legendary,Macro,Supertall,Medium,Far,86,68,5174,344,430,544,677 +15,FL-81,Flashing Lights,Legendary,Mid,Supertall,Far,Medium,86,68,4038,344,430,2142,392 +16,NS-800,North Star,Legendary,Mid,Supertall,Far,Medium,98,78,4300,392,490,2215,323 +16,NS-882,North Star,Legendary,Mid,Supertall,Far,Medium,94,75,4270,376,470,848,468 +18,FL-110,Flashing Lights,Legendary,Mini,Supertall,Medium,Far,86,68,3495,344,430,471,1363 +19,FL-80,Flashing Lights,Legendary,Mini,Supertall,Far,Medium,82,66,3024,332,414,2251,305 +20,FL-53,Flashing Lights,Legendary,Mini,Supertall,Far,Far,89,71,3279,359,448,794,824 +21,DZ-61,District ZERO,Legendary,Mini,Supertall,Far,Far,84,67,3301,338,422,869,883 +22,NS-736,North Star,Legendary,Mini,Supertall,Far,Medium,82,66,2813,332,414,1566,536 +22,NS-804,North Star,Legendary,Mini,Supertall,Far,Medium,80,64,3040,320,400,1049,530 +24,NS-799,North Star,Legendary,Mid,Tall,Far,Close,77,62,4182,311,388,2318,256 +25,FL-58,Flashing Lights,Legendary,Mini,Tall,Medium,Far,77,62,2998,311,388,591,1049 +26,FL-70,Flashing Lights,Mixed Use,Mega,Tall,Far,Far,71,57,6191,286,357,1794,667 +27,LM-8,Little Meow,Mixed Use,Giga,Highrise,Medium,Far,43,34,8782,172,215,359,1069 +28,DZ-33,District ZERO,Mixed Use,Macro,Tall,Far,Far,66,53,4939,265,331,831,873 +29,FL-30,Flashing Lights,Mixed Use,Mid,Tall,Far,Close,67,53,4235,269,336,1859,143 +30,NS-682,North Star,Mixed Use,Mid,Tall,Medium,Far,60,48,4135,243,303,417,1317 +31,NS-729,North Star,Mixed Use,Mid,Tall,Far,Medium,63,50,3924,254,317,2026,550 +32,NS-915,North Star,Mixed Use,Mid,Tall,Far,Far,73,58,3821,293,366,611,611 +33,FL-117,Flashing Lights,Mixed Use,Mini,Tall,Far,Medium,67,54,2419,272,339,2760,308 +34,FL-57,Flashing Lights,Mixed Use,Mini,Tall,Far,Far,64,52,3433,260,324,739,924 +35,NS-939,North Star,Mixed Use,Mini,Tall,Medium,Far,64,52,3270,260,324,538,730 +36,DZ-74,District ZERO,Mixed Use,Micro,Tall,Far,Far,62,49,2104,248,310,969,861 +37,FL-19,Flashing Lights,Residential,Micro,Tall,Medium,Far,63,50,1577,254,317,353,1048 +38,SM-504,Space Mind,Mixed Use,Mammoth,Highrise,Far,Close,46,36,7624,184,230,1649,232 +39,NS-846,North Star,Mixed Use,Mammoth,Highrise,Far,Close,40,32,7423,162,202,1590,198 +40,NX-22,Nexus,Industrial,Giga,Lowrise,Far,Far,8,6,13093,32,40,713,934 +41,SM-601,Space Mind,Mixed Use,Mammoth,Midrise,Close,Far,35,28,7522,144,179,129,1507 +42,DZ-141,District ZERO,Industrial,Giga,Lowrise,Medium,Far,9,7,21430,37,46,438,1388 +43,TG-17,Tranquility Gardens,Industrial,Giga,Lowrise,Far,Close,9,7,13483,36,45,3734,139 +44,SM-577,Space Mind,Mixed Use,Mega,Highrise,Far,Far,55,44,7169,222,277,830,742 +45,HH-878,Haven Heights,Industrial,Giga,Lowrise,Medium,Far,9,7,9363,36,45,383,673 +46,DZ-52,District ZERO,Industrial,Giga,Lowrise,Far,Medium,8,6,9097,32,40,1922,359 +47,DZ-45,District ZERO,Industrial,Giga,Lowrise,Far,Far,8,6,8800,33,41,958,772 +47,DZ-225,District ZERO,Industrial,Giga,Lowrise,Far,Far,8,6,10095,32,40,1006,1090 +49,DZ-46,District ZERO,Mixed Use,Mammoth,Midrise,Far,Far,21,17,7778,87,108,760,961 +50,HH-963,Haven Heights,Mixed Use,Mammoth,Midrise,Far,Medium,38,31,7914,155,193,782,551 +51,NS-903,North Star,Mixed Use,Macro,Highrise,Medium,Far,45,36,5190,181,226,462,790 +51,NS-931,North Star,Mixed Use,Macro,Highrise,Medium,Far,46,37,5323,188,234,453,766 +53,FL-39,Flashing Lights,Mixed Use,Mid,Highrise,Far,Close,58,46,4363,233,291,2004,210 +54,FL-63,Flashing Lights,Mixed Use,Mid,Highrise,Far,Medium,41,32,3866,164,205,2082,373 +54,FL-90,Flashing Lights,Mixed Use,Mid,Highrise,Far,Medium,52,42,4603,212,264,2536,302 +56,FL-56,Flashing Lights,Mixed Use,Mid,Highrise,Far,Far,48,38,4371,194,242,897,801 +56,FL-99,Flashing Lights,Mixed Use,Mid,Highrise,Far,Far,45,36,4081,181,226,889,1077 +56,FL-138,Flashing Lights,Mixed Use,Mid,Highrise,Far,Far,57,45,3800,228,285,1840,647 +59,FL-133,Flashing Lights,Mixed Use,Mammoth,Lowrise,Far,Medium,19,16,7393,80,99,2709,361 +60,SM-600,Space Mind,Mixed Use,Mega,Midrise,Close,Far,23,18,6846,92,115,185,1445 +61,FL-161,Flashing Lights,Mixed Use,Mammoth,Lowrise,Far,Far,17,13,8021,69,86,616,1070 +62,NS-924,North Star,Mixed Use,Mid,Highrise,Medium,Far,46,37,3851,188,234,434,768 +63,NS-913,North Star,Mixed Use,Mid,Highrise,Far,Close,41,33,3684,168,209,1061,197 +64,FL-66,Flashing Lights,Mixed Use,Mini,Highrise,Medium,Far,50,40,2551,200,250,344,1335 +65,TG-2,Tranquility Gardens,Mixed Use,Mammoth,Lowrise,Far,Close,14,12,8031,60,74,2893,100 +66,FL-158,Flashing Lights,Mixed Use,Mini,Highrise,Far,Medium,49,39,2557,197,246,1788,502 +67,FL-47,Flashing Lights,Mixed Use,Mini,Highrise,Far,Far,49,39,3219,197,246,795,795 +68,DZ-31,District ZERO,Mixed Use,Mammoth,Lowrise,Far,Far,14,11,8364,58,72,633,989 +69,FL-14,Flashing Lights,Mixed Use,Micro,Highrise,Medium,Far,49,39,2398,197,246,438,931 +70,NS-782,North Star,Mixed Use,Mammoth,Lowrise,Far,Medium,9,7,7228,36,45,2210,363 +71,DZ-32,District ZERO,Mixed Use,Mini,Highrise,Medium,Far,51,40,3050,204,255,400,1133 +72,SM-503,Space Mind,Mixed Use,Mini,Highrise,Far,Close,41,32,3004,164,205,1736,179 +73,NS-925,North Star,Mixed Use,Mini,Highrise,Medium,Far,49,39,2659,197,246,339,865 +73,NS-942,North Star,Mixed Use,Mini,Highrise,Medium,Far,48,38,2535,194,242,349,947 +73,NS-943,North Star,Mixed Use,Mini,Highrise,Medium,Far,41,33,2535,168,209,312,981 +76,SM-485,Space Mind,Industrial,Mammoth,Lowrise,Far,Close,9,7,7815,39,48,1676,278 +77,DZ-40,District ZERO,Industrial,Mammoth,Lowrise,Far,Close,8,6,7266,32,40,2269,234 +78,TG-10,Tranquility Gardens,Industrial,Mammoth,Lowrise,Far,Close,7,6,7202,30,37,2787,298 +79,DZ-140,District ZERO,Mixed Use,Mini,Highrise,Far,Medium,46,37,2915,186,232,1319,474 +80,TG-113,Tranquility Gardens,Mixed Use,Mini,Highrise,Far,Medium,50,40,3094,200,250,4484,463 +81,DZ-101,District ZERO,Mixed Use,Mini,Highrise,Far,Far,41,33,3427,168,209,849,1022 +81,DZ-115,District ZERO,Mixed Use,Mini,Highrise,Far,Far,57,45,2413,228,285,1319,670 +83,SM-596,Space Mind,Industrial,Mammoth,Lowrise,Far,Medium,3,3,7499,15,18,1035,410 +84,DZ-19,District ZERO,Industrial,Mammoth,Lowrise,Far,Medium,3,3,7443,15,18,1312,385 +84,DZ-413,District ZERO,Industrial,Mammoth,Lowrise,Far,Medium,8,6,7323,32,40,1029,582 +86,NS-896,North Star,Industrial,Mammoth,Lowrise,Far,Close,8,7,7929,35,43,1184,184 +87,NS-759,North Star,Mixed Use,Mini,Highrise,Far,Medium,45,36,3020,181,226,1732,537 +88,SM-546,Space Mind,Industrial,Mammoth,Lowrise,Far,Far,3,3,7401,15,18,955,719 +88,SM-576,Space Mind,Industrial,Mammoth,Lowrise,Far,Far,9,7,7355,39,48,876,686 +90,DZ-30,District ZERO,Industrial,Mammoth,Lowrise,Far,Far,8,6,8113,32,40,697,938 +90,DZ-143,District ZERO,Industrial,Mammoth,Lowrise,Far,Far,8,6,8189,32,40,717,1066 +90,DZ-155,District ZERO,Industrial,Mammoth,Lowrise,Far,Far,8,6,7960,32,40,1055,778 +90,DZ-234,District ZERO,Industrial,Mammoth,Lowrise,Far,Far,8,6,7215,32,40,1398,809 +94,NS-737,North Star,Industrial,Mammoth,Lowrise,Far,Medium,9,7,7801,36,45,1442,536 +95,NS-709,North Star,Industrial,Mammoth,Lowrise,Far,Far,14,11,7303,59,73,1769,654 +95,NS-907,North Star,Industrial,Mammoth,Lowrise,Far,Far,10,8,7372,40,50,615,635 +97,NS-889,North Star,Mixed Use,Micro,Highrise,Far,Far,44,35,2382,178,222,602,674 +98,NX-23,Nexus,Industrial,Mega,Lowrise,Medium,Far,4,3,6950,16,20,364,1261 +99,FL-21,Flashing Lights,Residential,Micro,Highrise,Far,Close,48,39,1594,195,243,2456,129 +100,FL-259,Flashing Lights,Mixed Use,Mega,Midrise,Far,Close,22,18,6059,91,113,3000,221 +101,NX-2,Nexus,Commercial,Macro,Lowrise,Close,Far,4,3,5894,16,20,286,1094 +102,FL-86,Flashing Lights,Mixed Use,Mega,Midrise,Far,Far,25,20,6233,100,125,993,973 +103,NS-836,North Star,Mixed Use,Mega,Lowrise,Close,Far,4,4,6944,20,24,291,1029 +104,SM-281,Space Mind,Mixed Use,Mega,Midrise,Far,Close,24,19,6792,98,122,1522,185 +105,NS-923,North Star,Mixed Use,Mega,Midrise,Medium,Far,39,31,6571,157,196,531,671 +106,NS-833,North Star,Mixed Use,Mega,Midrise,Far,Close,30,24,7032,124,154,1491,219 +106,NS-877,North Star,Mixed Use,Mega,Midrise,Far,Close,31,25,6375,125,156,1963,238 +106,NS-900,North Star,Mixed Use,Mega,Midrise,Far,Close,22,17,6365,89,111,1057,240 +109,SM-571,Space Mind,Industrial,Mega,Lowrise,Close,Far,9,7,6400,36,45,288,1373 +110,NS-788,North Star,Mixed Use,Mega,Midrise,Far,Medium,29,23,6068,119,148,1478,374 +111,NX-3,Nexus,Commercial,Mid,Lowrise,Close,Far,6,4,4301,24,30,292,1144 +112,FL-46,Flashing Lights,Mixed Use,Mega,Lowrise,Far,Medium,12,9,6612,48,60,1351,360 +113,NX-11,Nexus,Commercial,Micro,Lowrise,Close,Far,4,3,1482,18,22,294,1063 +113,NX-12,Nexus,Commercial,Micro,Lowrise,Close,Far,4,4,1482,20,24,267,1090 +115,FL-9,Flashing Lights,Mixed Use,Macro,Midrise,Far,Medium,20,16,4976,82,102,923,468 +115,FL-10,Flashing Lights,Mixed Use,Macro,Midrise,Far,Medium,39,32,5954,160,199,917,515 +115,FL-45,Flashing Lights,Mixed Use,Macro,Midrise,Far,Medium,39,32,5202,160,199,1140,457 +115,FL-92,Flashing Lights,Mixed Use,Macro,Midrise,Far,Medium,22,17,5040,89,111,2246,352 +115,FL-135,Flashing Lights,Mixed Use,Macro,Midrise,Far,Medium,30,24,4899,124,154,2285,576 +120,FL-166,Flashing Lights,Mixed Use,Macro,Midrise,Far,Far,27,21,5395,108,135,626,1023 +121,FL-3,Flashing Lights,Industrial,Mega,Lowrise,Far,Close,15,12,6894,62,77,1238,116 +122,NX-17,Nexus,Residential,Micro,Lowrise,Close,Far,4,3,1519,17,21,296,1070 +122,NX-18,Nexus,Residential,Micro,Lowrise,Close,Far,7,6,1649,30,37,268,1099 +124,NX-13,Nexus,Residential,Nano,Lowrise,Close,Far,4,3,999,16,20,242,1115 +125,FL-62,Flashing Lights,Industrial,Mega,Lowrise,Far,Medium,12,10,6348,52,64,2138,319 +126,FL-126,Flashing Lights,Industrial,Mega,Lowrise,Far,Far,12,9,6193,48,60,1352,761 +127,NX-4,Nexus,Residential,Micro,Midrise,Medium,Far,24,19,1779,96,120,370,1050 +127,NX-5,Nexus,Residential,Micro,Midrise,Medium,Far,22,18,2043,91,113,336,1082 +129,NS-916,North Star,Mixed Use,Macro,Midrise,Medium,Far,24,19,5093,96,120,418,797 +130,DZ-643,District ZERO,Industrial,Mega,Lowrise,Medium,Medium,5,4,6153,21,26,342,342 +131,NS-866,North Star,Mixed Use,Macro,Midrise,Far,Close,27,22,5453,111,138,2222,229 +131,NS-893,North Star,Mixed Use,Macro,Midrise,Far,Close,39,32,5757,160,199,1966,146 +133,DZ-57,District ZERO,Industrial,Mega,Lowrise,Medium,Far,8,7,6033,35,43,451,1275 +133,DZ-169,District ZERO,Industrial,Mega,Lowrise,Medium,Far,8,6,6777,32,40,363,1429 +133,DZ-180,District ZERO,Industrial,Mega,Lowrise,Medium,Far,8,6,6316,32,40,366,1440 +133,DZ-265,District ZERO,Industrial,Mega,Lowrise,Medium,Far,8,6,6556,32,40,541,1436 +133,DZ-385,District ZERO,Industrial,Mega,Lowrise,Medium,Far,3,3,6167,15,18,445,1134 +138,SM-161,Space Mind,Industrial,Mega,Lowrise,Far,Close,9,7,6353,38,47,2224,131 +139,DZ-100,District ZERO,Mixed Use,Macro,Midrise,Far,Far,21,17,5198,85,106,937,962 +140,NS-844,North Star,Mixed Use,Macro,Midrise,Far,Medium,23,18,4900,94,117,1801,311 +140,NS-868,North Star,Mixed Use,Macro,Midrise,Far,Medium,37,30,5129,150,187,1006,393 +140,NS-873,North Star,Mixed Use,Macro,Midrise,Far,Medium,22,18,4914,91,113,752,571 +140,NS-897,North Star,Mixed Use,Macro,Midrise,Far,Medium,30,24,5014,124,154,906,366 +140,NS-929,North Star,Mixed Use,Macro,Midrise,Far,Medium,24,19,4985,99,123,841,388 +145,HH-942,Haven Heights,Mixed Use,Macro,Midrise,Far,Medium,20,16,5403,81,101,846,440 +146,NS-937,North Star,Industrial,Mega,Lowrise,Medium,Far,14,11,6036,58,72,541,708 +147,NS-761,North Star,Mixed Use,Macro,Midrise,Far,Far,25,20,5293,101,126,940,705 +148,DZ-79,District ZERO,Industrial,Mega,Lowrise,Far,Medium,3,3,6661,15,18,1554,565 +148,DZ-256,District ZERO,Industrial,Mega,Lowrise,Far,Medium,3,3,6953,15,18,1738,577 +150,NS-781,North Star,Industrial,Mega,Lowrise,Far,Close,9,7,6398,37,46,2308,296 +150,NS-872,North Star,Industrial,Mega,Lowrise,Far,Close,8,7,6808,36,44,1166,290 +152,TG-520,Tranquility Gardens,Industrial,Mega,Lowrise,Far,Medium,8,7,6184,35,43,2635,550 +153,DZ-65,District ZERO,Industrial,Mega,Lowrise,Far,Far,8,6,7035,32,40,1166,651 +153,DZ-219,District ZERO,Industrial,Mega,Lowrise,Far,Far,10,8,6709,43,53,816,1210 +153,DZ-254,District ZERO,Industrial,Mega,Lowrise,Far,Far,8,6,6644,32,40,1447,797 +153,DZ-274,District ZERO,Industrial,Mega,Lowrise,Far,Far,8,6,6727,32,40,857,1121 +157,FL-132,Flashing Lights,Residential,Micro,Midrise,Close,Far,26,21,2010,105,131,300,1411 +157,FL-174,Flashing Lights,Residential,Micro,Midrise,Close,Far,21,17,1464,86,107,295,1288 +159,SM-608,Space Mind,Commercial,Macro,Lowrise,Close,Far,4,3,5188,19,23,118,1785 +160,SM-162,Space Mind,Commercial,Mega,Lowrise,Far,Close,4,3,6352,17,21,2133,138 +161,TG-4,Tranquility Gardens,Commercial,Mega,Lowrise,Far,Close,5,4,6292,21,26,2796,205 +161,TG-648,Tranquility Gardens,Commercial,Mega,Lowrise,Far,Close,4,3,7063,17,21,1896,124 +163,NS-795,North Star,Commercial,Macro,Lowrise,Close,Far,4,3,5494,16,20,292,1099 +164,DZ-126,District ZERO,Commercial,Mega,Lowrise,Far,Medium,4,3,7006,18,22,1580,334 +165,FL-144,Flashing Lights,Mixed Use,Mid,Midrise,Medium,Far,32,25,3680,128,160,431,1278 +166,NS-899,North Star,Commercial,Mega,Lowrise,Far,Close,6,5,7049,26,32,2227,110 +167,TG-51,Tranquility Gardens,Commercial,Mega,Lowrise,Far,Medium,6,5,6727,28,34,2888,400 +167,TG-68,Tranquility Gardens,Commercial,Mega,Lowrise,Far,Medium,4,3,6931,19,23,3200,404 +167,TG-569,Tranquility Gardens,Commercial,Mega,Lowrise,Far,Medium,4,3,6889,16,20,2324,404 +170,HH-231,Haven Heights,Commercial,Mega,Lowrise,Far,Close,4,3,6666,16,20,2176,114 +171,SM-177,Space Mind,Commercial,Mega,Lowrise,Far,Far,4,3,6433,17,21,688,1303 +171,SM-226,Space Mind,Commercial,Mega,Lowrise,Far,Far,8,6,6425,32,40,793,1133 +171,SM-578,Space Mind,Commercial,Mega,Lowrise,Far,Far,5,4,6395,22,27,751,838 +171,SM-591,Space Mind,Commercial,Mega,Lowrise,Far,Far,9,7,7026,39,48,625,889 +175,FL-29,Flashing Lights,Mixed Use,Mid,Midrise,Far,Close,27,21,4338,109,136,2005,132 +176,NX-19,Nexus,Mixed Use,Mini,Lowrise,Medium,Far,18,14,2758,73,91,301,1124 +176,NX-20,Nexus,Mixed Use,Mini,Lowrise,Medium,Far,19,15,2747,76,95,342,1096 +178,LM-5,Little Meow,Mixed Use,Mid,Midrise,Far,Close,23,18,4517,94,117,1222,210 +179,FL-76,Flashing Lights,Mixed Use,Mid,Midrise,Far,Medium,35,28,3812,142,177,2138,344 +179,FL-89,Flashing Lights,Mixed Use,Mid,Midrise,Far,Medium,22,18,4619,91,113,2596,324 +179,FL-116,Flashing Lights,Mixed Use,Mid,Midrise,Far,Medium,29,23,3659,117,146,2076,569 +179,FL-119,Flashing Lights,Mixed Use,Mid,Midrise,Far,Medium,20,16,3845,82,102,2537,457 +179,FL-145,Flashing Lights,Mixed Use,Mid,Midrise,Far,Medium,34,27,4404,138,172,2710,337 +184,FL-123,Flashing Lights,Mixed Use,Mid,Midrise,Far,Far,29,23,4051,119,148,1784,735 +184,FL-129,Flashing Lights,Mixed Use,Mid,Midrise,Far,Far,23,18,3883,93,116,730,1065 +184,FL-136,Flashing Lights,Mixed Use,Mid,Midrise,Far,Far,27,21,4060,109,136,1989,710 +187,DZ-17,District ZERO,Mixed Use,Mid,Midrise,Medium,Far,26,21,4788,107,133,492,930 +188,SM-484,Space Mind,Mixed Use,Mid,Midrise,Far,Close,28,22,4101,112,140,1769,218 +189,NS-856,North Star,Mixed Use,Mid,Midrise,Medium,Far,20,16,4120,80,100,444,881 +190,SM-609,Space Mind,Mixed Use,Mid,Midrise,Far,Medium,20,16,4201,84,104,1116,311 +191,DZ-137,District ZERO,Mixed Use,Mid,Midrise,Far,Medium,37,29,4270,148,185,1381,458 +192,NS-936,North Star,Mixed Use,Mid,Midrise,Far,Close,39,31,3883,157,196,1040,279 +193,TG-415,Tranquility Gardens,Mixed Use,Mid,Midrise,Far,Medium,38,31,3603,155,193,4075,449 +193,TG-539,Tranquility Gardens,Mixed Use,Mid,Midrise,Far,Medium,25,20,3846,101,126,2952,540 +195,SM-590,Space Mind,Mixed Use,Mid,Midrise,Far,Far,23,18,4639,93,116,799,684 +196,SM-592,Space Mind,Industrial,Mid,Lowrise,Close,Far,9,7,4052,36,45,212,1439 +196,SM-595,Space Mind,Industrial,Mid,Lowrise,Close,Far,7,6,4529,32,39,291,1345 +198,DZ-64,District ZERO,Mixed Use,Mid,Midrise,Far,Far,32,25,4786,128,160,1222,609 +198,DZ-154,District ZERO,Mixed Use,Mid,Midrise,Far,Far,23,19,3993,96,119,1196,645 +198,DZ-171,District ZERO,Mixed Use,Mid,Midrise,Far,Far,20,16,3902,80,100,631,1188 +198,DZ-212,District ZERO,Mixed Use,Mid,Midrise,Far,Far,22,17,4067,89,111,1271,827 +198,DZ-218,District ZERO,Mixed Use,Mid,Midrise,Far,Far,21,17,4698,86,107,870,1172 +203,NS-684,North Star,Mixed Use,Mid,Midrise,Far,Medium,22,17,4371,89,111,1859,474 +203,NS-738,North Star,Mixed Use,Mid,Midrise,Far,Medium,25,20,4175,100,125,1334,554 +203,NS-881,North Star,Mixed Use,Mid,Midrise,Far,Medium,26,21,4284,105,131,907,422 +203,NS-938,North Star,Mixed Use,Mid,Midrise,Far,Medium,28,22,3883,112,140,939,381 +207,NX-24,Nexus,Industrial,Mini,Lowrise,Far,Far,9,7,2414,39,48,826,884 +207,NX-25,Nexus,Industrial,Mini,Lowrise,Far,Far,8,6,3433,33,41,789,928 +209,FL-28,Flashing Lights,Mixed Use,Macro,Lowrise,Far,Close,18,15,5659,76,94,2094,137 +209,FL-202,Flashing Lights,Mixed Use,Macro,Lowrise,Far,Close,18,14,4874,74,92,2589,139 +211,FL-15,Flashing Lights,Mixed Use,Mini,Midrise,Medium,Far,31,25,2688,125,156,348,1016 +211,FL-16,Flashing Lights,Mixed Use,Mini,Midrise,Medium,Far,30,24,2680,122,152,311,1047 +211,FL-67,Flashing Lights,Mixed Use,Mini,Midrise,Medium,Far,22,18,2543,91,113,307,1367 +214,FL-5,Flashing Lights,Mixed Use,Mini,Midrise,Far,Close,28,22,3456,112,140,1178,231 +214,FL-33,Flashing Lights,Mixed Use,Mini,Midrise,Far,Close,33,27,2962,136,169,1409,254 +214,FL-204,Flashing Lights,Mixed Use,Mini,Midrise,Far,Close,21,17,2687,87,108,2135,131 +214,FL-216,Flashing Lights,Mixed Use,Mini,Midrise,Far,Close,27,21,3473,108,135,3464,122 +218,FL-44,Flashing Lights,Mixed Use,Macro,Lowrise,Far,Medium,11,9,5108,48,59,1228,394 +219,FL-83,Flashing Lights,Mixed Use,Mini,Midrise,Far,Medium,20,16,3427,82,102,1997,510 +219,FL-96,Flashing Lights,Mixed Use,Mini,Midrise,Far,Medium,37,29,3394,148,185,1933,590 +219,FL-101,Flashing Lights,Mixed Use,Mini,Midrise,Far,Medium,38,30,2455,152,190,2441,384 +219,FL-103,Flashing Lights,Mixed Use,Mini,Midrise,Far,Medium,39,31,3216,157,196,2751,311 +219,FL-170,Flashing Lights,Mixed Use,Mini,Midrise,Far,Medium,20,16,2559,84,104,2379,469 +224,FL-73,Flashing Lights,Mixed Use,Macro,Lowrise,Far,Far,15,12,4949,63,78,1517,714 +224,FL-160,Flashing Lights,Mixed Use,Macro,Lowrise,Far,Far,19,15,5356,78,97,707,994 +226,SM-589,Space Mind,Mixed Use,Mini,Lowrise,Close,Far,19,16,3142,80,99,187,1481 +227,FL-49,Flashing Lights,Mixed Use,Mini,Midrise,Far,Far,28,22,2889,112,140,647,927 +227,FL-61,Flashing Lights,Mixed Use,Mini,Midrise,Far,Far,25,20,3458,101,126,1795,619 +227,FL-69,Flashing Lights,Mixed Use,Mini,Midrise,Far,Far,21,17,3543,85,106,1857,605 +227,FL-100,Flashing Lights,Mixed Use,Mini,Midrise,Far,Far,26,20,3177,104,130,730,1173 +227,FL-108,Flashing Lights,Mixed Use,Mini,Midrise,Far,Far,33,26,2456,134,167,1844,710 +227,FL-147,Flashing Lights,Mixed Use,Mini,Midrise,Far,Far,36,29,2938,146,182,2287,630 +233,NX-21,Nexus,Commercial,Mini,Lowrise,Far,Medium,3,2,2716,13,16,1624,302 +234,NX-41,Nexus,Commercial,Mini,Lowrise,Far,Far,5,4,3127,21,26,720,1043 +235,FL-60,Flashing Lights,Mixed Use,Micro,Midrise,Medium,Far,34,28,2256,140,174,429,1214 +235,FL-111,Flashing Lights,Mixed Use,Micro,Midrise,Medium,Far,23,18,2045,94,117,418,1404 +235,FL-156,Flashing Lights,Mixed Use,Micro,Midrise,Medium,Far,26,21,2026,105,131,308,1383 +238,NX-8,Nexus,Commercial,Micro,Lowrise,Medium,Far,4,3,1375,19,23,376,982 +238,NX-16,Nexus,Commercial,Micro,Lowrise,Medium,Far,4,3,1516,16,20,323,1043 +240,NX-59,Nexus,Commercial,Nano,Lowrise,Medium,Far,4,3,969,18,22,331,1418 +240,NX-60,Nexus,Commercial,Nano,Lowrise,Medium,Far,5,4,765,20,25,423,1378 +240,NX-64,Nexus,Commercial,Nano,Lowrise,Medium,Far,8,6,1059,34,42,346,1439 +243,FL-150,Flashing Lights,Mixed Use,Micro,Midrise,Far,Medium,23,19,2263,96,119,1780,575 +244,FL-55,Flashing Lights,Mixed Use,Micro,Midrise,Far,Far,23,18,2044,94,117,952,761 +245,NX-6,Nexus,Residential,Micro,Lowrise,Medium,Far,8,6,1963,33,41,372,1034 +245,NX-7,Nexus,Residential,Micro,Lowrise,Medium,Far,17,14,2057,72,89,338,1068 +245,NX-9,Nexus,Residential,Micro,Lowrise,Medium,Far,7,6,1482,31,38,349,1009 +245,NX-10,Nexus,Residential,Micro,Lowrise,Medium,Far,5,4,1482,21,26,322,1036 +245,NX-14,Nexus,Residential,Micro,Lowrise,Medium,Far,4,3,1402,16,20,377,989 +245,NX-15,Nexus,Residential,Micro,Lowrise,Medium,Far,4,3,1514,19,23,350,1015 +245,NX-56,Nexus,Residential,Micro,Lowrise,Medium,Far,4,3,1361,17,21,415,1350 +252,FL-203,Flashing Lights,Industrial,Macro,Lowrise,Far,Close,8,6,4878,33,41,2082,186 +252,FL-260,Flashing Lights,Industrial,Macro,Lowrise,Far,Close,15,12,5891,64,79,2897,140 +254,TG-29,Tranquility Gardens,Mixed Use,Macro,Lowrise,Far,Close,18,14,5215,72,90,4695,153 +255,DZ-51,District ZERO,Mixed Use,Mini,Midrise,Medium,Far,20,16,3042,83,103,452,1241 +256,LM-2,Little Meow,Industrial,Macro,Lowrise,Medium,Far,9,7,5627,36,45,498,927 +257,NX-33,Nexus,Commercial,Micro,Lowrise,Far,Medium,5,4,1212,21,26,1419,590 +258,SM-305,Space Mind,Mixed Use,Mini,Midrise,Far,Close,38,31,3071,155,193,1841,137 +259,NX-57,Nexus,Residential,Nano,Lowrise,Medium,Far,4,3,1077,18,22,390,1369 +259,NX-58,Nexus,Residential,Nano,Lowrise,Medium,Far,4,4,1076,20,24,350,1402 +259,NX-61,Nexus,Residential,Nano,Lowrise,Medium,Far,4,3,1070,16,20,406,1392 +259,NX-62,Nexus,Residential,Nano,Lowrise,Medium,Far,4,3,1066,18,22,386,1407 +259,NX-63,Nexus,Residential,Nano,Lowrise,Medium,Far,7,6,1062,31,38,366,1423 +259,NX-65,Nexus,Residential,Nano,Lowrise,Medium,Far,4,3,951,18,22,327,1454 +265,TG-15,Tranquility Gardens,Mixed Use,Mini,Midrise,Far,Close,22,18,3458,91,113,4716,133 +266,DZ-648,District ZERO,Industrial,Mini,Lowrise,Close,Close,8,6,2614,32,40,227,174 +267,NX-26,Nexus,Commercial,Nano,Lowrise,Far,Medium,4,3,1056,16,20,1766,511 +267,NX-30,Nexus,Commercial,Nano,Lowrise,Far,Medium,4,3,1175,17,21,1482,567 +267,NX-35,Nexus,Commercial,Nano,Lowrise,Far,Medium,3,3,1065,15,18,1710,547 +267,NX-40,Nexus,Commercial,Nano,Lowrise,Far,Medium,4,3,1023,18,22,1553,586 +271,NX-47,Nexus,Commercial,Micro,Lowrise,Far,Far,5,4,1208,20,25,1463,629 +271,NX-48,Nexus,Commercial,Micro,Lowrise,Far,Far,4,3,1205,16,20,1442,636 +271,NX-49,Nexus,Commercial,Micro,Lowrise,Far,Far,5,4,1203,20,25,1421,644 +271,NX-50,Nexus,Commercial,Micro,Lowrise,Far,Far,5,4,1201,22,27,1399,652 +275,SM-298,Space Mind,Mixed Use,Macro,Lowrise,Far,Medium,19,16,5059,80,99,1324,394 +276,DZ-197,District ZERO,Mixed Use,Macro,Lowrise,Far,Medium,18,15,4834,76,94,1593,534 +277,SM-1,Space Mind,Mixed Use,Mini,Midrise,Far,Medium,23,19,2559,96,119,2000,419 +277,SM-237,Space Mind,Mixed Use,Mini,Midrise,Far,Medium,38,31,3409,155,193,1509,366 +277,SM-464,Space Mind,Mixed Use,Mini,Midrise,Far,Medium,39,32,2996,160,199,1601,435 +277,SM-614,Space Mind,Mixed Use,Mini,Midrise,Far,Medium,39,32,2544,160,199,949,476 +281,NX-31,Nexus,Residential,Micro,Lowrise,Far,Medium,4,4,1212,20,24,1461,574 +281,NX-32,Nexus,Residential,Micro,Lowrise,Far,Medium,4,3,1212,16,20,1440,582 +281,NX-34,Nexus,Residential,Micro,Lowrise,Far,Medium,4,3,1614,18,22,1394,600 +284,DZ-47,District ZERO,Mixed Use,Macro,Lowrise,Far,Far,19,15,5183,76,95,893,835 +285,NS-880,North Star,Mixed Use,Mini,Midrise,Far,Close,21,17,3265,86,107,1159,274 +286,TG-114,Tranquility Gardens,Mixed Use,Mini,Midrise,Far,Medium,27,22,3174,111,138,4428,507 +287,FL-71,Flashing Lights,Industrial,Macro,Lowrise,Far,Far,3,3,4847,15,18,1690,700 +288,TG-498,Tranquility Gardens,Mixed Use,Macro,Lowrise,Far,Far,16,13,5533,66,82,2708,650 +289,LM-1,Little Meow,Industrial,Macro,Lowrise,Far,Medium,3,3,5522,15,18,991,440 +289,LM-244,Little Meow,Industrial,Macro,Lowrise,Far,Medium,4,3,5683,16,20,685,502 +291,NX-27,Nexus,Residential,Nano,Lowrise,Far,Medium,3,3,1031,15,18,1709,507 +291,NX-28,Nexus,Residential,Nano,Lowrise,Far,Medium,4,3,961,17,21,1611,515 +291,NX-29,Nexus,Residential,Nano,Lowrise,Far,Medium,7,6,993,30,37,1612,534 +291,NX-36,Nexus,Residential,Nano,Lowrise,Far,Medium,5,4,993,24,29,1612,554 +291,NX-37,Nexus,Residential,Nano,Lowrise,Far,Medium,4,4,1091,20,24,1767,570 +291,NX-38,Nexus,Residential,Nano,Lowrise,Far,Medium,3,3,1065,15,18,1711,566 +291,NX-39,Nexus,Residential,Nano,Lowrise,Far,Medium,5,4,993,23,28,1613,574 +291,NX-42,Nexus,Residential,Nano,Lowrise,Far,Medium,4,3,1091,16,20,1766,590 +291,NX-43,Nexus,Residential,Nano,Lowrise,Far,Medium,3,3,1065,15,18,1710,586 +291,NX-44,Nexus,Residential,Nano,Lowrise,Far,Medium,6,5,993,28,34,1613,593 +301,SM-599,Space Mind,Industrial,Mini,Lowrise,Close,Far,13,10,2752,54,67,134,1753 +302,DZ-67,District ZERO,Mixed Use,Mini,Midrise,Far,Far,28,22,3217,112,140,914,862 +302,DZ-130,District ZERO,Mixed Use,Mini,Midrise,Far,Far,34,27,3263,138,172,1133,772 +304,NX-45,Nexus,Residential,Nano,Lowrise,Far,Far,4,3,1024,16,20,1553,605 +304,NX-46,Nexus,Residential,Nano,Lowrise,Far,Far,5,4,1173,24,29,1484,623 +304,NX-51,Nexus,Residential,Nano,Lowrise,Far,Far,6,5,849,26,32,1381,660 +304,NX-52,Nexus,Residential,Nano,Lowrise,Far,Far,5,4,1040,24,29,1765,609 +304,NX-53,Nexus,Residential,Nano,Lowrise,Far,Far,3,3,985,15,18,1709,606 +304,NX-54,Nexus,Residential,Nano,Lowrise,Far,Far,8,7,947,35,43,1611,612 +304,NX-55,Nexus,Residential,Nano,Lowrise,Far,Far,4,3,947,19,23,1551,624 +311,NS-713,North Star,Mixed Use,Mini,Midrise,Far,Medium,23,18,2518,94,117,2019,541 +311,NS-786,North Star,Mixed Use,Mini,Midrise,Far,Medium,21,17,2816,85,106,1649,402 +311,NS-810,North Star,Mixed Use,Mini,Midrise,Far,Medium,32,25,2646,128,160,2093,418 +311,NS-870,North Star,Mixed Use,Mini,Midrise,Far,Medium,33,26,2557,132,165,848,505 +315,NS-740,North Star,Mixed Use,Macro,Lowrise,Far,Far,17,13,4897,68,85,681,928 +316,FL-239,Flashing Lights,Commercial,Macro,Lowrise,Far,Close,7,5,5727,28,35,2881,101 +317,FL-181,Flashing Lights,Residential,Micro,Lowrise,Close,Far,8,6,1443,33,41,299,1268 +317,FL-234,Flashing Lights,Residential,Micro,Lowrise,Close,Far,17,14,2135,71,88,291,1098 +319,NS-922,North Star,Mixed Use,Micro,Midrise,Medium,Far,24,19,1590,96,120,337,868 +320,HH-518,Haven Heights,Mixed Use,Micro,Midrise,Medium,Far,20,16,2233,83,103,447,1490 +321,TG-561,Tranquility Gardens,Mixed Use,Micro,Midrise,Far,Medium,37,30,2248,150,187,2401,434 +322,SM-291,Space Mind,Industrial,Macro,Lowrise,Medium,Far,8,6,4994,33,41,325,1589 +322,SM-536,Space Mind,Industrial,Macro,Lowrise,Medium,Far,15,12,5693,62,77,386,1358 +322,SM-610,Space Mind,Industrial,Macro,Lowrise,Medium,Far,10,8,5068,40,50,575,863 +325,DZ-91,District ZERO,Industrial,Macro,Lowrise,Medium,Far,8,6,5666,32,40,515,1285 +325,DZ-204,District ZERO,Industrial,Macro,Lowrise,Medium,Far,8,6,5181,32,40,427,1453 +325,DZ-263,District ZERO,Industrial,Macro,Lowrise,Medium,Far,12,9,5555,48,60,341,1600 +328,SM-528,Space Mind,Mixed Use,Micro,Midrise,Far,Far,29,23,1354,117,146,1066,629 +328,SM-529,Space Mind,Mixed Use,Micro,Midrise,Far,Far,25,20,2355,101,126,1041,658 +330,SM-593,Space Mind,Industrial,Micro,Lowrise,Close,Far,9,7,2303,36,45,158,1714 +331,DZ-36,District ZERO,Mixed Use,Micro,Midrise,Far,Far,23,18,2397,92,115,909,804 +332,SM-304,Space Mind,Industrial,Macro,Lowrise,Far,Close,10,8,5325,44,54,1886,149 +332,SM-565,Space Mind,Industrial,Macro,Lowrise,Far,Close,8,6,4955,32,40,1432,183 +334,LM-97,Little Meow,Commercial,Macro,Lowrise,Far,Far,4,3,5159,16,20,1577,750 +335,DZ-440,District ZERO,Commercial,Mini,Lowrise,Close,Far,4,3,3184,17,21,300,989 +336,DZ-43,District ZERO,Industrial,Macro,Lowrise,Far,Close,8,6,5927,34,42,2349,286 +336,DZ-537,District ZERO,Industrial,Macro,Lowrise,Far,Close,8,6,5352,32,40,933,247 +338,NS-822,North Star,Mixed Use,Micro,Midrise,Far,Medium,23,18,2334,92,115,2115,366 +339,NS-705,North Star,Industrial,Macro,Lowrise,Medium,Far,10,8,4833,44,54,371,1238 +339,NS-876,North Star,Industrial,Macro,Lowrise,Medium,Far,10,8,5092,44,54,407,876 +341,FL-32,Flashing Lights,Mixed Use,Mid,Lowrise,Far,Close,15,12,3909,62,77,1549,213 +341,FL-41,Flashing Lights,Mixed Use,Mid,Lowrise,Far,Close,11,9,4138,46,57,1800,220 +341,FL-205,Flashing Lights,Mixed Use,Mid,Lowrise,Far,Close,16,13,4425,66,82,2079,121 +344,NS-135,North Star,Industrial,Micro,Lowrise,Close,Far,12,9,1306,48,60,293,759 +345,DZ-56,District ZERO,Industrial,Macro,Lowrise,Far,Medium,10,8,5631,40,50,2296,341 +345,DZ-170,District ZERO,Industrial,Macro,Lowrise,Far,Medium,8,6,4882,32,40,1623,397 +345,DZ-194,District ZERO,Industrial,Macro,Lowrise,Far,Medium,8,6,4959,32,40,1797,351 +345,DZ-444,District ZERO,Industrial,Macro,Lowrise,Far,Medium,8,6,4817,32,40,851,495 +349,DZ-649,District ZERO,Commercial,Micro,Lowrise,Close,Close,4,3,1712,17,21,202,202 +350,SM-87,Space Mind,Industrial,Macro,Lowrise,Far,Far,3,3,4801,15,18,1626,777 +350,SM-324,Space Mind,Industrial,Macro,Lowrise,Far,Far,8,6,4828,33,41,916,922 +352,DZ-48,District ZERO,Industrial,Macro,Lowrise,Far,Far,14,11,4873,58,72,647,1074 +352,DZ-136,District ZERO,Industrial,Macro,Lowrise,Far,Far,9,7,4881,38,47,964,915 +352,DZ-160,District ZERO,Industrial,Macro,Lowrise,Far,Far,8,6,4805,32,40,611,1178 +352,DZ-220,District ZERO,Industrial,Macro,Lowrise,Far,Far,8,6,5008,32,40,948,1126 +352,DZ-251,District ZERO,Industrial,Macro,Lowrise,Far,Far,8,6,5665,32,40,1388,847 +352,DZ-275,District ZERO,Industrial,Macro,Lowrise,Far,Far,8,6,5236,32,40,1107,941 +352,DZ-343,District ZERO,Industrial,Macro,Lowrise,Far,Far,8,6,5092,32,40,887,904 +352,DZ-375,District ZERO,Industrial,Macro,Lowrise,Far,Far,9,7,5473,36,45,611,1036 +352,DZ-402,District ZERO,Industrial,Macro,Lowrise,Far,Far,8,6,5324,32,40,913,718 +361,TG-248,Tranquility Gardens,Industrial,Macro,Lowrise,Far,Far,8,6,5019,33,41,3524,1239 +361,TG-285,Tranquility Gardens,Industrial,Macro,Lowrise,Far,Far,9,7,4980,37,46,3163,1441 +363,FL-82,Flashing Lights,Mixed Use,Mid,Lowrise,Far,Medium,18,14,4144,74,92,2086,437 +363,FL-106,Flashing Lights,Mixed Use,Mid,Lowrise,Far,Medium,12,9,3916,48,60,1988,599 +363,FL-134,Flashing Lights,Mixed Use,Mid,Lowrise,Far,Medium,17,13,4068,69,86,2534,498 +366,FL-165,Flashing Lights,Residential,Micro,Midrise,Medium,Far,21,17,1557,87,108,348,1278 +367,NS-207,North Star,Residential,Mini,Lowrise,Close,Far,9,7,2778,39,48,291,842 +368,NS-699,North Star,Industrial,Macro,Lowrise,Far,Medium,9,7,5396,36,45,1917,538 +368,NS-783,North Star,Industrial,Macro,Lowrise,Far,Medium,8,6,5503,34,42,2088,450 +368,NS-787,North Star,Industrial,Macro,Lowrise,Far,Medium,9,8,4908,40,49,1593,385 +371,HH-956,Haven Heights,Industrial,Macro,Lowrise,Far,Medium,8,6,5428,32,40,741,555 +372,FL-74,Flashing Lights,Residential,Micro,Midrise,Far,Close,31,25,2105,127,158,2309,208 +373,NS-24,North Star,Commercial,Micro,Lowrise,Close,Close,4,3,1374,16,20,295,262 +374,FL-65,Flashing Lights,Mixed Use,Mid,Lowrise,Far,Far,16,13,4130,66,82,991,847 +374,FL-107,Flashing Lights,Mixed Use,Mid,Lowrise,Far,Far,13,11,3924,55,68,1929,645 +374,FL-137,Flashing Lights,Mixed Use,Mid,Lowrise,Far,Far,19,15,4068,77,96,1930,683 +374,FL-153,Flashing Lights,Mixed Use,Mid,Lowrise,Far,Far,18,14,3942,73,91,735,1028 +378,NS-678,North Star,Industrial,Macro,Lowrise,Far,Far,15,12,5532,64,79,760,1094 +378,NS-707,North Star,Industrial,Macro,Lowrise,Far,Far,13,11,5426,56,69,1712,683 +380,SM-594,Space Mind,Commercial,Micro,Lowrise,Close,Far,8,6,1335,32,40,191,1748 +381,SM-160,Space Mind,Commercial,Macro,Lowrise,Far,Close,4,3,5822,19,23,2318,123 +382,TG-36,Tranquility Gardens,Commercial,Macro,Lowrise,Far,Close,6,5,5831,26,32,3790,218 +382,TG-617,Tranquility Gardens,Commercial,Macro,Lowrise,Far,Close,4,3,5975,16,20,2472,226 +384,SM-201,Space Mind,Commercial,Nano,Lowrise,Close,Far,7,5,1060,29,36,270,1680 +384,SM-217,Space Mind,Commercial,Nano,Lowrise,Close,Far,6,5,676,25,31,266,1671 +384,SM-234,Space Mind,Commercial,Nano,Lowrise,Close,Far,5,4,902,20,25,295,1630 +384,SM-257,Space Mind,Commercial,Nano,Lowrise,Close,Far,10,8,896,41,51,300,1620 +384,SM-574,Space Mind,Commercial,Nano,Lowrise,Close,Far,6,5,958,27,33,295,1670 +384,SM-575,Space Mind,Commercial,Nano,Lowrise,Close,Far,5,4,953,23,28,297,1685 +384,SM-585,Space Mind,Commercial,Nano,Lowrise,Close,Far,5,4,947,23,28,229,1671 +391,FL-51,Flashing Lights,Residential,Micro,Midrise,Far,Medium,31,25,1662,125,156,1179,521 +391,FL-102,Flashing Lights,Residential,Micro,Midrise,Far,Medium,22,17,2206,89,111,2077,527 +393,NS-3,North Star,Residential,Micro,Lowrise,Close,Close,4,4,1258,20,24,209,174 +393,NS-4,North Star,Residential,Micro,Lowrise,Close,Close,4,3,1258,16,20,191,184 +393,NS-9,North Star,Residential,Micro,Lowrise,Close,Close,4,3,1374,19,23,229,196 +393,NS-10,North Star,Residential,Micro,Lowrise,Close,Close,4,3,1374,16,20,213,206 +393,NS-15,North Star,Residential,Micro,Lowrise,Close,Close,4,3,1374,19,23,251,218 +393,NS-20,North Star,Residential,Micro,Lowrise,Close,Close,4,3,1374,19,23,259,252 +393,NS-25,North Star,Residential,Micro,Lowrise,Close,Close,9,7,1374,39,48,282,275 +400,HH-624,Haven Heights,Commercial,Macro,Lowrise,Medium,Far,4,3,5436,16,20,395,1556 +401,SM-200,Space Mind,Residential,Micro,Lowrise,Close,Far,4,3,1358,18,22,291,1659 +401,SM-216,Space Mind,Residential,Micro,Lowrise,Close,Far,4,3,1348,19,23,284,1653 +403,NS-33,North Star,Commercial,Nano,Lowrise,Close,Medium,4,3,1134,18,22,300,350 +403,NS-67,North Star,Commercial,Nano,Lowrise,Close,Medium,4,3,1120,19,23,286,498 +405,NS-108,North Star,Commercial,Micro,Lowrise,Close,Far,4,3,1215,19,23,296,697 +405,NS-117,North Star,Commercial,Micro,Lowrise,Close,Far,4,3,1233,16,20,299,716 +405,NS-248,North Star,Commercial,Micro,Lowrise,Close,Far,4,3,1611,16,20,284,901 +408,NS-2,North Star,Residential,Nano,Lowrise,Close,Close,4,4,993,20,24,269,144 +408,NS-8,North Star,Residential,Nano,Lowrise,Close,Close,4,3,1110,19,23,285,165 +410,TG-552,Tranquility Gardens,Commercial,Macro,Lowrise,Far,Medium,6,5,5993,28,34,3123,328 +411,HH-326,Haven Heights,Commercial,Macro,Lowrise,Far,Close,4,4,5229,20,24,2753,135 +411,HH-574,Haven Heights,Commercial,Macro,Lowrise,Far,Close,4,3,5124,16,20,2160,250 +411,HH-575,Haven Heights,Commercial,Macro,Lowrise,Far,Close,4,3,5361,16,20,1527,88 +414,SM-174,Space Mind,Residential,Nano,Lowrise,Close,Far,7,6,1186,31,38,294,1707 +414,SM-188,Space Mind,Residential,Nano,Lowrise,Close,Far,4,4,1200,20,24,280,1697 +414,SM-221,Space Mind,Residential,Nano,Lowrise,Close,Far,4,3,975,16,20,297,1635 +414,SM-223,Space Mind,Residential,Nano,Lowrise,Close,Far,4,4,1012,20,24,297,1633 +414,SM-228,Space Mind,Residential,Nano,Lowrise,Close,Far,4,3,957,16,20,295,1631 +414,SM-240,Space Mind,Residential,Nano,Lowrise,Close,Far,6,5,848,28,34,295,1628 +414,SM-246,Space Mind,Residential,Nano,Lowrise,Close,Far,6,5,770,25,31,296,1627 +414,SM-258,Space Mind,Residential,Nano,Lowrise,Close,Far,5,4,553,22,27,286,1634 +414,SM-272,Space Mind,Residential,Nano,Lowrise,Close,Far,4,3,960,17,21,293,1626 +414,SM-572,Space Mind,Residential,Nano,Lowrise,Close,Far,4,3,1165,16,20,272,1638 +414,SM-573,Space Mind,Residential,Nano,Lowrise,Close,Far,4,3,963,16,20,284,1655 +414,SM-584,Space Mind,Residential,Nano,Lowrise,Close,Far,4,3,615,16,20,220,1659 +414,SM-586,Space Mind,Residential,Nano,Lowrise,Close,Far,8,6,947,32,40,242,1685 +414,SM-587,Space Mind,Residential,Nano,Lowrise,Close,Far,5,4,947,20,25,254,1700 +414,SM-588,Space Mind,Residential,Nano,Lowrise,Close,Far,6,4,848,24,30,267,1714 +429,SM-262,Space Mind,Commercial,Macro,Lowrise,Far,Far,4,3,5547,17,21,1199,668 +429,SM-384,Space Mind,Commercial,Macro,Lowrise,Far,Far,4,3,5008,16,20,832,1014 +431,NS-106,North Star,Commercial,Nano,Lowrise,Close,Far,5,4,1196,22,27,295,679 +431,NS-136,North Star,Commercial,Nano,Lowrise,Close,Far,5,4,824,21,26,274,779 +431,NS-231,North Star,Commercial,Nano,Lowrise,Close,Far,4,3,1193,19,23,261,883 +431,NS-865,North Star,Commercial,Nano,Lowrise,Close,Far,7,5,515,28,35,276,1009 +435,TG-247,Tranquility Gardens,Commercial,Macro,Lowrise,Far,Far,4,4,5811,20,24,3672,1238 +435,TG-344,Tranquility Gardens,Commercial,Macro,Lowrise,Far,Far,4,3,5181,17,21,3965,820 +435,TG-367,Tranquility Gardens,Commercial,Macro,Lowrise,Far,Far,4,3,5175,16,20,3807,814 +435,TG-378,Tranquility Gardens,Commercial,Macro,Lowrise,Far,Far,6,4,5057,24,30,3781,779 +439,NS-48,North Star,Residential,Nano,Lowrise,Close,Medium,5,4,1171,21,26,296,389 +439,NS-63,North Star,Residential,Nano,Lowrise,Close,Medium,5,4,1083,20,25,286,447 +439,NS-76,North Star,Residential,Nano,Lowrise,Close,Medium,4,3,1164,17,21,288,517 +439,NS-80,North Star,Residential,Nano,Lowrise,Close,Medium,4,3,1171,17,21,292,536 +439,NS-84,North Star,Residential,Nano,Lowrise,Close,Medium,5,4,1178,21,26,293,555 +439,NS-92,North Star,Residential,Nano,Lowrise,Close,Medium,2,2,1185,10,12,291,574 +439,NS-94,North Star,Residential,Nano,Lowrise,Close,Medium,2,2,1119,10,12,291,592 +446,NS-165,North Star,Residential,Micro,Lowrise,Close,Far,4,3,1293,17,21,299,779 +446,NS-274,North Star,Residential,Micro,Lowrise,Close,Far,5,4,1667,21,26,281,912 +446,NS-285,North Star,Residential,Micro,Lowrise,Close,Far,4,3,1678,17,21,279,924 +446,NS-295,North Star,Residential,Micro,Lowrise,Close,Far,6,5,1689,28,34,279,935 +446,NS-367,North Star,Residential,Micro,Lowrise,Close,Far,6,5,1410,27,33,251,1028 +446,NS-414,North Star,Residential,Micro,Lowrise,Close,Far,6,5,1470,28,34,246,1074 +446,NS-912,North Star,Residential,Micro,Lowrise,Close,Far,9,7,1343,38,47,289,945 +446,NS-917,North Star,Residential,Micro,Lowrise,Close,Far,10,8,1658,44,54,283,929 +454,HH-581,Haven Heights,Commercial,Macro,Lowrise,Far,Medium,5,4,5216,24,29,2233,310 +455,NS-96,North Star,Residential,Nano,Lowrise,Close,Far,4,3,1121,17,21,294,642 +455,NS-104,North Star,Residential,Nano,Lowrise,Close,Far,8,6,1178,32,40,294,660 +455,NS-166,North Star,Residential,Nano,Lowrise,Close,Far,4,4,1073,20,24,277,800 +455,NS-891,North Star,Residential,Nano,Lowrise,Close,Far,10,8,557,44,54,275,980 +455,NS-921,North Star,Residential,Nano,Lowrise,Close,Far,4,3,1075,19,23,291,918 +460,FL-17,Flashing Lights,Industrial,Mid,Lowrise,Medium,Far,14,11,4119,56,70,497,921 +460,FL-143,Flashing Lights,Industrial,Mid,Lowrise,Medium,Far,13,11,3709,55,68,484,1233 +462,LM-3,Little Meow,Industrial,Mid,Lowrise,Medium,Far,10,8,4306,41,51,302,1129 +463,NS-681,North Star,Mixed Use,Mid,Lowrise,Medium,Far,16,13,4144,68,84,506,1253 +464,HH-527,Haven Heights,Residential,Macro,Lowrise,Far,Far,6,4,4809,24,30,601,1429 +465,SM-3,Space Mind,Mixed Use,Mid,Lowrise,Far,Medium,18,15,4274,75,93,2059,404 +466,DZ-10,District ZERO,Mixed Use,Mid,Lowrise,Far,Medium,17,14,4753,70,87,1111,427 +466,DZ-16,District ZERO,Mixed Use,Mid,Lowrise,Far,Medium,3,3,4625,15,18,1204,429 +466,DZ-20,District ZERO,Mixed Use,Mid,Lowrise,Far,Medium,17,14,4130,70,87,1182,486 +469,FL-78,Flashing Lights,Industrial,Mid,Lowrise,Far,Medium,10,8,4031,41,51,1947,523 +469,FL-114,Flashing Lights,Industrial,Mid,Lowrise,Far,Medium,11,9,4057,48,59,2440,440 +469,FL-164,Flashing Lights,Industrial,Mid,Lowrise,Far,Medium,10,8,4284,42,52,1844,471 +469,FL-169,Flashing Lights,Industrial,Mid,Lowrise,Far,Medium,14,11,4300,58,72,2438,445 +469,FL-171,Flashing Lights,Industrial,Mid,Lowrise,Far,Medium,11,9,4300,45,56,1985,438 +469,FL-172,Flashing Lights,Industrial,Mid,Lowrise,Far,Medium,8,6,4081,32,40,1381,399 +469,FL-179,Flashing Lights,Industrial,Mid,Lowrise,Far,Medium,15,12,4275,62,77,1986,384 +476,TG-476,Tranquility Gardens,Mixed Use,Mid,Lowrise,Far,Medium,17,13,3839,69,86,3283,599 +477,DZ-63,District ZERO,Mixed Use,Mid,Lowrise,Far,Far,19,15,4058,76,95,623,1110 +477,DZ-135,District ZERO,Mixed Use,Mid,Lowrise,Far,Far,18,14,3945,74,92,1109,762 +479,FL-59,Flashing Lights,Industrial,Mid,Lowrise,Far,Far,15,12,4318,62,77,893,841 +479,FL-98,Flashing Lights,Industrial,Mid,Lowrise,Far,Far,3,3,3640,15,18,1640,856 +479,FL-109,Flashing Lights,Industrial,Mid,Lowrise,Far,Far,3,3,3691,15,18,1636,771 +479,FL-125,Flashing Lights,Industrial,Mid,Lowrise,Far,Far,3,3,3603,15,18,1636,715 +479,FL-128,Flashing Lights,Industrial,Mid,Lowrise,Far,Far,14,11,3606,56,70,2131,629 +479,FL-139,Flashing Lights,Industrial,Mid,Lowrise,Far,Far,4,3,3904,18,22,1689,612 +479,FL-140,Flashing Lights,Industrial,Mid,Lowrise,Far,Far,3,3,3812,15,18,1633,608 +479,FL-154,Flashing Lights,Industrial,Mid,Lowrise,Far,Far,13,10,3952,52,65,631,1108 +487,LM-4,Little Meow,Industrial,Mid,Lowrise,Far,Medium,3,3,4639,15,18,1080,352 +488,NS-926,North Star,Residential,Micro,Midrise,Medium,Far,38,30,2006,152,190,340,867 +489,NS-906,North Star,Residential,Micro,Midrise,Far,Close,35,28,1904,144,179,2068,100 +490,NS-716,North Star,Mixed Use,Mid,Lowrise,Far,Far,13,10,4059,54,67,1459,619 +491,FL-42,Flashing Lights,Mixed Use,Mini,Lowrise,Far,Close,17,13,3094,69,86,2093,222 +492,DZ-39,District ZERO,Residential,Micro,Midrise,Far,Far,21,17,1706,86,107,601,1100 +493,LM-264,Little Meow,Commercial,Mid,Lowrise,Medium,Far,3,2,3968,13,16,523,688 +494,NS-760,North Star,Residential,Micro,Midrise,Far,Medium,22,18,1556,91,113,1569,477 +494,NS-811,North Star,Residential,Micro,Midrise,Far,Medium,33,26,1442,134,167,1807,435 +494,NS-888,North Star,Residential,Micro,Midrise,Far,Medium,22,17,1730,89,111,1066,309 +497,FL-105,Flashing Lights,Mixed Use,Mini,Lowrise,Far,Medium,19,15,2962,78,97,2298,423 +497,FL-118,Flashing Lights,Mixed Use,Mini,Lowrise,Far,Medium,19,16,2687,80,99,2690,378 +499,FL-88,Flashing Lights,Commercial,Mid,Lowrise,Far,Medium,4,4,3936,20,24,2682,341 +500,FL-157,Flashing Lights,Residential,Mid,Lowrise,Far,Close,10,8,3727,44,54,2704,287 +501,FL-48,Flashing Lights,Mixed Use,Mini,Lowrise,Far,Far,17,13,3225,69,86,736,847 +501,FL-87,Flashing Lights,Mixed Use,Mini,Lowrise,Far,Far,19,15,3213,76,95,739,1129 +501,FL-97,Flashing Lights,Mixed Use,Mini,Lowrise,Far,Far,15,12,2807,62,77,1696,804 +501,FL-127,Flashing Lights,Mixed Use,Mini,Lowrise,Far,Far,19,15,3092,78,97,630,1204 +501,FL-149,Flashing Lights,Mixed Use,Mini,Lowrise,Far,Far,17,14,2418,70,87,1933,633 +501,FL-152,Flashing Lights,Mixed Use,Mini,Lowrise,Far,Far,18,15,3157,75,93,798,980 +507,SM-535,Space Mind,Industrial,Mid,Lowrise,Medium,Far,8,6,4214,33,41,413,1287 +508,DZ-147,District ZERO,Industrial,Mid,Lowrise,Medium,Far,8,6,4792,32,40,421,1371 +508,DZ-172,District ZERO,Industrial,Mid,Lowrise,Medium,Far,8,6,4199,32,40,472,1331 +508,DZ-179,District ZERO,Industrial,Mid,Lowrise,Medium,Far,8,6,4288,32,40,458,1357 +508,DZ-266,District ZERO,Industrial,Mid,Lowrise,Medium,Far,8,6,3746,32,40,486,1476 +508,DZ-279,District ZERO,Industrial,Mid,Lowrise,Medium,Far,3,2,4429,13,16,361,1461 +513,SM-296,Space Mind,Industrial,Mid,Lowrise,Far,Close,13,10,4315,54,67,1410,295 +514,LM-100,Little Meow,Commercial,Mid,Lowrise,Far,Far,5,4,3745,21,26,1676,642 +515,DZ-340,District ZERO,Industrial,Mid,Lowrise,Far,Close,4,3,3619,18,22,2002,180 +515,DZ-341,District ZERO,Industrial,Mid,Lowrise,Far,Close,6,5,3619,28,34,1916,232 +517,TG-5,Tranquility Gardens,Industrial,Mid,Lowrise,Far,Close,8,7,3790,36,44,3204,137 +517,TG-8,Tranquility Gardens,Industrial,Mid,Lowrise,Far,Close,9,7,3928,39,48,3157,192 +517,TG-45,Tranquility Gardens,Industrial,Mid,Lowrise,Far,Close,9,7,3819,39,48,3219,244 +520,HH-840,Haven Heights,Industrial,Mid,Lowrise,Medium,Medium,4,3,4657,16,20,485,512 +521,NS-680,North Star,Industrial,Mid,Lowrise,Medium,Far,8,6,4038,33,41,562,1214 +521,NS-702,North Star,Industrial,Mid,Lowrise,Medium,Far,9,7,3832,37,46,564,1109 +521,NS-703,North Star,Industrial,Mid,Lowrise,Medium,Far,9,7,3932,38,47,508,1151 +521,NS-746,North Star,Industrial,Mid,Lowrise,Medium,Far,9,8,3883,40,49,373,1133 +525,SM-359,Space Mind,Industrial,Mid,Lowrise,Far,Medium,8,6,3812,32,40,1721,389 +525,SM-440,Space Mind,Industrial,Mid,Lowrise,Far,Medium,8,6,3859,32,40,1763,387 +525,SM-441,Space Mind,Industrial,Mid,Lowrise,Far,Medium,8,6,3762,32,40,1713,421 +525,SM-569,Space Mind,Industrial,Mid,Lowrise,Far,Medium,3,3,3865,15,18,967,596 +525,SM-613,Space Mind,Industrial,Mid,Lowrise,Far,Medium,3,3,4284,15,18,1006,420 +530,DZ-15,District ZERO,Industrial,Mid,Lowrise,Far,Medium,3,3,4511,15,18,1304,356 +530,DZ-53,District ZERO,Industrial,Mid,Lowrise,Far,Medium,10,8,3875,42,52,2362,310 +530,DZ-69,District ZERO,Industrial,Mid,Lowrise,Far,Medium,8,6,3860,33,41,1320,570 +530,DZ-173,District ZERO,Industrial,Mid,Lowrise,Far,Medium,9,7,4708,38,47,1455,525 +530,DZ-191,District ZERO,Industrial,Mid,Lowrise,Far,Medium,8,6,4136,32,40,1501,576 +530,DZ-236,District ZERO,Industrial,Mid,Lowrise,Far,Medium,3,3,4543,15,18,1851,394 +530,DZ-252,District ZERO,Industrial,Mid,Lowrise,Far,Medium,12,10,4478,50,62,1740,531 +530,DZ-259,District ZERO,Industrial,Mid,Lowrise,Far,Medium,8,6,4276,32,40,1904,441 +530,DZ-383,District ZERO,Industrial,Mid,Lowrise,Far,Medium,8,6,3901,32,40,1505,367 +539,NS-644,North Star,Industrial,Mid,Lowrise,Far,Close,8,7,3865,35,43,2025,245 +539,NS-859,North Star,Industrial,Mid,Lowrise,Far,Close,9,7,3819,39,48,1493,154 +539,NS-871,North Star,Industrial,Mid,Lowrise,Far,Close,11,9,3774,45,56,1608,114 +539,NS-892,North Star,Industrial,Mid,Lowrise,Far,Close,9,7,4007,36,45,1765,132 +539,NS-928,North Star,Industrial,Mid,Lowrise,Far,Close,10,8,3801,44,54,1032,188 +539,NS-935,North Star,Industrial,Mid,Lowrise,Far,Close,12,10,3977,51,63,1096,242 +545,TG-416,Tranquility Gardens,Industrial,Mid,Lowrise,Far,Medium,14,11,3704,56,70,4029,475 +545,TG-491,Tranquility Gardens,Industrial,Mid,Lowrise,Far,Medium,13,11,3788,56,69,3247,549 +547,DZ-29,District ZERO,Industrial,Mid,Lowrise,Far,Far,9,7,3792,36,45,657,906 +547,DZ-70,District ZERO,Industrial,Mid,Lowrise,Far,Far,9,8,4033,40,49,608,1135 +547,DZ-82,District ZERO,Industrial,Mid,Lowrise,Far,Far,8,6,3961,32,40,733,1070 +547,DZ-87,District ZERO,Industrial,Mid,Lowrise,Far,Far,8,6,3669,32,40,1015,859 +547,DZ-98,District ZERO,Industrial,Mid,Lowrise,Far,Far,14,11,3766,57,71,1125,841 +547,DZ-114,District ZERO,Industrial,Mid,Lowrise,Far,Far,8,6,4037,32,40,1374,614 +547,DZ-134,District ZERO,Industrial,Mid,Lowrise,Far,Far,8,6,3907,32,40,1165,703 +547,DZ-174,District ZERO,Industrial,Mid,Lowrise,Far,Far,8,6,4050,32,40,1160,761 +547,DZ-175,District ZERO,Industrial,Mid,Lowrise,Far,Far,8,6,3908,32,40,1070,832 +547,DZ-176,District ZERO,Industrial,Mid,Lowrise,Far,Far,8,6,3868,32,40,916,959 +547,DZ-177,District ZERO,Industrial,Mid,Lowrise,Far,Far,9,7,3948,39,48,860,1007 +547,DZ-178,District ZERO,Industrial,Mid,Lowrise,Far,Far,8,6,4105,32,40,712,1134 +547,DZ-192,District ZERO,Industrial,Mid,Lowrise,Far,Far,15,12,4144,62,77,1442,611 +547,DZ-198,District ZERO,Industrial,Mid,Lowrise,Far,Far,8,6,4058,32,40,1345,702 +547,DZ-201,District ZERO,Industrial,Mid,Lowrise,Far,Far,8,6,4011,32,40,751,1163 +547,DZ-202,District ZERO,Industrial,Mid,Lowrise,Far,Far,8,6,3997,32,40,689,1215 +547,DZ-211,District ZERO,Industrial,Mid,Lowrise,Far,Far,8,6,4059,32,40,1329,790 +547,DZ-239,District ZERO,Industrial,Mid,Lowrise,Far,Far,8,6,4260,33,41,1553,669 +547,DZ-286,District ZERO,Industrial,Mid,Lowrise,Far,Far,8,6,4299,32,40,1018,924 +547,DZ-287,District ZERO,Industrial,Mid,Lowrise,Far,Far,8,6,4034,32,40,807,1072 +567,TG-497,Tranquility Gardens,Industrial,Mid,Lowrise,Far,Far,9,7,4053,36,45,2803,667 +568,FL-85,Flashing Lights,Mixed Use,Micro,Lowrise,Far,Far,17,14,2334,70,87,1856,638 +568,FL-121,Flashing Lights,Mixed Use,Micro,Lowrise,Far,Far,12,10,2156,50,62,1987,641 +568,FL-122,Flashing Lights,Mixed Use,Micro,Lowrise,Far,Far,12,9,2168,48,60,1928,684 +571,NS-549,North Star,Industrial,Mid,Lowrise,Far,Medium,10,8,3644,40,50,1601,454 +571,NS-697,North Star,Industrial,Mid,Lowrise,Far,Medium,11,9,4300,47,58,2076,470 +571,NS-698,North Star,Industrial,Mid,Lowrise,Far,Medium,10,8,4309,44,54,2016,491 +571,NS-901,North Star,Industrial,Mid,Lowrise,Far,Medium,8,6,3907,34,42,765,495 +571,NS-908,North Star,Industrial,Mid,Lowrise,Far,Medium,12,9,4717,48,60,911,339 +576,FL-13,Flashing Lights,Industrial,Mini,Lowrise,Medium,Far,11,9,2456,46,57,494,885 +576,FL-18,Flashing Lights,Industrial,Mini,Lowrise,Medium,Far,10,8,3355,42,52,598,852 +576,FL-159,Flashing Lights,Industrial,Mini,Lowrise,Medium,Far,13,11,2706,55,68,318,1337 +576,FL-180,Flashing Lights,Industrial,Mini,Lowrise,Medium,Far,15,12,2512,64,79,336,1233 +576,FL-210,Flashing Lights,Industrial,Mini,Lowrise,Medium,Far,13,11,2494,55,68,323,1105 +581,SM-121,Space Mind,Mixed Use,Mini,Lowrise,Far,Close,18,15,3430,75,93,2298,277 +582,DZ-435,District ZERO,Commercial,Mid,Lowrise,Medium,Far,4,3,4019,16,20,315,1028 +583,NS-679,North Star,Industrial,Mid,Lowrise,Far,Far,9,7,4717,36,45,673,1147 +583,NS-700,North Star,Industrial,Mid,Lowrise,Far,Far,10,8,4554,41,51,819,940 +583,NS-701,North Star,Industrial,Mid,Lowrise,Far,Far,14,11,3860,58,72,721,996 +583,NS-715,North Star,Industrial,Mid,Lowrise,Far,Far,12,10,3612,50,62,1573,630 +583,NS-719,North Star,Industrial,Mid,Lowrise,Far,Far,8,7,4473,36,44,824,894 +583,NS-791,North Star,Industrial,Mid,Lowrise,Far,Far,8,7,3904,36,44,742,778 +583,NS-792,North Star,Industrial,Mid,Lowrise,Far,Far,14,11,3812,58,72,686,813 +583,NS-874,North Star,Industrial,Mid,Lowrise,Far,Far,10,8,4038,43,53,601,699 +591,FL-11,Flashing Lights,Industrial,Mini,Lowrise,Far,Close,9,7,2496,39,48,1332,152 +591,FL-40,Flashing Lights,Industrial,Mini,Lowrise,Far,Close,15,12,2531,62,77,1859,221 +591,FL-75,Flashing Lights,Industrial,Mini,Lowrise,Far,Close,13,11,3440,55,68,2252,249 +591,FL-167,Flashing Lights,Industrial,Mini,Lowrise,Far,Close,10,8,3427,40,50,2596,297 +591,FL-177,Flashing Lights,Industrial,Mini,Lowrise,Far,Close,13,10,3411,52,65,2597,276 +591,FL-211,Flashing Lights,Industrial,Mini,Lowrise,Far,Close,13,10,3135,52,65,3465,126 +591,FL-256,Flashing Lights,Industrial,Mini,Lowrise,Far,Close,8,6,3207,33,41,3326,255 +591,FL-257,Flashing Lights,Industrial,Mini,Lowrise,Far,Close,11,9,3212,46,57,3266,276 +591,FL-258,Flashing Lights,Industrial,Mini,Lowrise,Far,Close,9,7,3174,38,47,3266,213 +600,TG-37,Tranquility Gardens,Mixed Use,Mini,Lowrise,Far,Close,16,13,2969,67,83,3666,228 +601,SM-612,Space Mind,Commercial,Mid,Lowrise,Far,Close,4,3,4546,16,20,1268,172 +602,TG-1,Tranquility Gardens,Commercial,Mid,Lowrise,Far,Close,5,4,4239,24,29,2813,138 +602,TG-6,Tranquility Gardens,Commercial,Mid,Lowrise,Far,Close,9,7,3964,39,48,2874,209 +604,NS-704,North Star,Mixed Use,Mini,Lowrise,Medium,Far,16,12,2923,64,80,426,1202 +604,NS-722,North Star,Mixed Use,Mini,Lowrise,Medium,Far,19,16,2731,80,99,381,1192 +606,SM-297,Space Mind,Mixed Use,Mini,Lowrise,Far,Medium,9,7,3075,39,48,1358,352 +607,NS-895,North Star,Mixed Use,Mini,Lowrise,Far,Close,18,15,3477,75,93,2066,137 +608,FL-50,Flashing Lights,Industrial,Mini,Lowrise,Far,Medium,13,11,2810,56,69,1236,488 +608,FL-84,Flashing Lights,Industrial,Mini,Lowrise,Far,Medium,10,8,3433,44,54,1938,563 +608,FL-91,Flashing Lights,Industrial,Mini,Lowrise,Far,Medium,13,10,3072,52,65,2302,325 +608,FL-115,Flashing Lights,Industrial,Mini,Lowrise,Far,Medium,15,12,3549,62,77,2136,534 +608,FL-120,Flashing Lights,Industrial,Mini,Lowrise,Far,Medium,12,9,2813,49,61,2241,495 +608,FL-146,Flashing Lights,Industrial,Mini,Lowrise,Far,Medium,15,12,2438,63,78,2595,416 +608,FL-168,Flashing Lights,Industrial,Mini,Lowrise,Far,Medium,8,6,3432,33,41,2537,352 +608,FL-173,Flashing Lights,Industrial,Mini,Lowrise,Far,Medium,11,9,2429,47,58,1322,437 +608,FL-175,Flashing Lights,Industrial,Mini,Lowrise,Far,Medium,12,10,3435,52,64,1382,359 +608,FL-178,Flashing Lights,Industrial,Mini,Lowrise,Far,Medium,13,10,2530,54,67,2379,415 +618,SM-29,Space Mind,Commercial,Mid,Lowrise,Far,Medium,5,4,3635,23,28,1931,550 +618,SM-39,Space Mind,Commercial,Mid,Lowrise,Far,Medium,4,3,4256,16,20,1886,595 +620,SM-10,Space Mind,Mixed Use,Mini,Lowrise,Far,Far,19,15,2657,76,95,1604,684 +620,SM-165,Space Mind,Mixed Use,Mini,Lowrise,Far,Far,16,13,2755,68,84,989,1026 +622,NS-537,North Star,Commercial,Mid,Lowrise,Far,Close,4,3,4711,17,21,1835,219 +623,TG-437,Tranquility Gardens,Commercial,Mid,Lowrise,Far,Medium,4,3,3643,16,20,3959,382 +623,TG-442,Tranquility Gardens,Commercial,Mid,Lowrise,Far,Medium,4,3,3643,16,20,3948,365 +625,HH-469,Haven Heights,Commercial,Mid,Lowrise,Far,Close,4,3,4523,16,20,2363,137 +626,FL-54,Flashing Lights,Industrial,Mini,Lowrise,Far,Far,12,9,2944,49,61,647,952 +626,FL-72,Flashing Lights,Industrial,Mini,Lowrise,Far,Far,3,3,2773,15,18,1634,706 +628,LM-6,Little Meow,Industrial,Mini,Lowrise,Far,Medium,8,6,3276,33,41,920,511 +628,LM-155,Little Meow,Industrial,Mini,Lowrise,Far,Medium,8,6,2451,32,40,1046,387 +628,LM-166,Little Meow,Industrial,Mini,Lowrise,Far,Medium,8,6,2419,32,40,984,404 +631,SM-40,Space Mind,Commercial,Mid,Lowrise,Far,Far,4,3,4682,17,21,1840,640 +631,SM-66,Space Mind,Commercial,Mid,Lowrise,Far,Far,4,3,4240,17,21,1176,1089 +631,SM-496,Space Mind,Commercial,Mid,Lowrise,Far,Far,4,3,4526,19,23,789,869 +634,TG-341,Tranquility Gardens,Commercial,Mid,Lowrise,Far,Far,4,3,4186,16,20,3988,853 +634,TG-349,Tranquility Gardens,Commercial,Mid,Lowrise,Far,Far,6,5,4695,26,32,3946,784 +634,TG-350,Tranquility Gardens,Commercial,Mid,Lowrise,Far,Far,7,5,4428,28,35,3831,849 +634,TG-486,Tranquility Gardens,Commercial,Mid,Lowrise,Far,Far,4,3,4179,16,20,2828,701 +638,LM-11,Little Meow,Industrial,Mini,Lowrise,Far,Far,10,8,2924,42,52,2293,1337 +639,NS-758,North Star,Mixed Use,Mini,Lowrise,Far,Medium,19,15,3092,78,97,1788,564 +639,NS-803,North Star,Mixed Use,Mini,Lowrise,Far,Medium,18,14,2921,72,90,1595,331 +639,NS-843,North Star,Mixed Use,Mini,Lowrise,Far,Medium,16,13,2537,66,82,1958,339 +639,NS-898,North Star,Mixed Use,Mini,Lowrise,Far,Medium,16,13,2983,66,82,848,419 +639,NS-909,North Star,Mixed Use,Mini,Lowrise,Far,Medium,15,12,3592,62,77,712,529 +644,SM-264,Space Mind,Residential,Mid,Lowrise,Far,Medium,5,4,4323,21,26,1281,572 +645,NS-762,North Star,Mixed Use,Mini,Lowrise,Far,Far,18,15,2813,76,94,687,888 +645,NS-861,North Star,Mixed Use,Mini,Lowrise,Far,Far,18,15,2711,75,93,704,660 +647,FL-130,Flashing Lights,Industrial,Micro,Lowrise,Medium,Far,11,9,2233,45,56,570,1187 +648,FL-1,Flashing Lights,Commercial,Mini,Lowrise,Far,Close,4,3,2692,16,20,1403,106 +648,FL-2,Flashing Lights,Commercial,Mini,Lowrise,Far,Close,4,3,2762,16,20,1338,92 +648,FL-4,Flashing Lights,Commercial,Mini,Lowrise,Far,Close,4,3,2867,17,21,1341,147 +648,FL-6,Flashing Lights,Commercial,Mini,Lowrise,Far,Close,4,3,2867,19,23,1342,176 +648,FL-7,Flashing Lights,Commercial,Mini,Lowrise,Far,Close,6,4,2587,24,30,1349,152 +648,FL-8,Flashing Lights,Commercial,Mini,Lowrise,Far,Close,4,3,2525,17,21,1340,146 +654,FL-196,Flashing Lights,Industrial,Micro,Lowrise,Far,Close,13,10,2381,53,66,1997,252 +654,FL-208,Flashing Lights,Industrial,Micro,Lowrise,Far,Close,8,6,2066,32,40,3416,149 +656,TG-3,Tranquility Gardens,Mixed Use,Micro,Lowrise,Far,Close,19,15,2244,77,96,3194,133 +657,HH-461,Haven Heights,Commercial,Mid,Lowrise,Far,Far,4,4,3658,20,24,1133,866 +658,LM-7,Little Meow,Commercial,Mini,Lowrise,Medium,Far,16,12,3175,64,80,539,890 +658,LM-177,Little Meow,Commercial,Mini,Lowrise,Medium,Far,4,3,2843,16,20,499,1018 +658,LM-182,Little Meow,Commercial,Mini,Lowrise,Medium,Far,4,3,3246,16,20,490,1019 +658,LM-203,Little Meow,Commercial,Mini,Lowrise,Medium,Far,4,3,3219,16,20,487,1013 +658,LM-204,Little Meow,Commercial,Mini,Lowrise,Medium,Far,6,5,2712,26,32,377,1123 +658,LM-224,Little Meow,Commercial,Mini,Lowrise,Medium,Far,4,3,2988,16,20,476,1011 +658,LM-261,Little Meow,Commercial,Mini,Lowrise,Medium,Far,5,4,2605,22,27,567,624 +658,LM-265,Little Meow,Commercial,Mini,Lowrise,Medium,Far,4,3,3079,17,21,387,968 +658,LM-266,Little Meow,Commercial,Mini,Lowrise,Medium,Far,4,4,3288,20,24,334,1022 +658,LM-268,Little Meow,Commercial,Mini,Lowrise,Medium,Far,2,2,2923,11,13,480,655 +658,LM-269,Little Meow,Commercial,Mini,Lowrise,Medium,Far,3,3,2509,15,18,436,731 +658,LM-273,Little Meow,Commercial,Mini,Lowrise,Medium,Far,3,3,2406,15,18,393,748 +658,LM-274,Little Meow,Commercial,Mini,Lowrise,Medium,Far,4,4,3205,20,24,318,1007 +671,LM-271,Little Meow,Industrial,Micro,Lowrise,Medium,Far,7,6,2187,30,37,398,687 +672,LM-131,Little Meow,Commercial,Mini,Lowrise,Far,Close,3,2,3527,14,17,1711,199 +672,LM-164,Little Meow,Commercial,Mini,Lowrise,Far,Close,4,3,3255,16,20,1040,286 +672,LM-230,Little Meow,Commercial,Mini,Lowrise,Far,Close,7,6,2598,30,37,816,217 +675,NS-721,North Star,Mixed Use,Micro,Lowrise,Medium,Far,18,14,2209,72,90,518,1102 +675,NS-769,North Star,Mixed Use,Micro,Lowrise,Medium,Far,15,12,2231,62,77,382,1095 +675,NS-919,North Star,Mixed Use,Micro,Lowrise,Medium,Far,16,13,1823,68,84,480,729 +678,SM-224,Space Mind,Mixed Use,Micro,Lowrise,Far,Medium,15,12,1701,64,79,1530,368 +678,SM-410,Space Mind,Mixed Use,Micro,Lowrise,Far,Medium,18,14,2289,74,92,1686,445 +680,DZ-123,District ZERO,Mixed Use,Micro,Lowrise,Far,Medium,17,14,2158,70,87,1353,579 +681,FL-77,Flashing Lights,Industrial,Micro,Lowrise,Far,Medium,13,11,2400,55,68,2006,467 +681,FL-93,Flashing Lights,Industrial,Micro,Lowrise,Far,Medium,12,10,2297,52,64,2384,315 +681,FL-94,Flashing Lights,Industrial,Micro,Lowrise,Far,Medium,14,11,2382,58,72,2138,432 +681,FL-151,Flashing Lights,Industrial,Micro,Lowrise,Far,Medium,3,3,2259,15,18,1635,552 +685,TG-584,Tranquility Gardens,Mixed Use,Micro,Lowrise,Far,Medium,19,15,2205,76,95,2360,378 +686,FL-31,Flashing Lights,Residential,Mini,Lowrise,Far,Close,11,8,3260,44,55,2455,125 +687,FL-242,Flashing Lights,Industrial,Nano,Lowrise,Far,Medium,8,7,1066,36,44,3116,303 +688,DZ-200,District ZERO,Mixed Use,Micro,Lowrise,Far,Far,17,14,2232,70,87,984,978 +689,FL-52,Flashing Lights,Commercial,Mini,Lowrise,Far,Far,4,3,2420,19,23,877,755 +690,FL-124,Flashing Lights,Industrial,Micro,Lowrise,Far,Far,3,2,2098,13,16,1695,719 +691,LM-258,Little Meow,Commercial,Mini,Lowrise,Far,Medium,4,3,3123,16,20,623,520 +692,LM-165,Little Meow,Industrial,Micro,Lowrise,Far,Medium,12,10,1486,52,64,1001,357 +693,SM-276,Space Mind,Industrial,Mini,Lowrise,Medium,Far,12,10,2800,51,63,491,1427 +693,SM-611,Space Mind,Industrial,Mini,Lowrise,Medium,Far,8,6,3061,32,40,525,918 +695,DZ-34,District ZERO,Industrial,Mini,Lowrise,Medium,Far,9,7,3217,36,45,535,1082 +695,DZ-35,District ZERO,Industrial,Mini,Lowrise,Medium,Far,9,7,3233,38,47,478,1120 +695,DZ-41,District ZERO,Industrial,Mini,Lowrise,Medium,Far,10,8,3307,44,54,365,1256 +695,DZ-50,District ZERO,Industrial,Mini,Lowrise,Medium,Far,8,6,3059,34,42,509,1203 +695,DZ-142,District ZERO,Industrial,Mini,Lowrise,Medium,Far,8,6,2849,32,40,447,1357 +695,DZ-146,District ZERO,Industrial,Mini,Lowrise,Medium,Far,8,6,3061,32,40,500,1287 +695,DZ-151,District ZERO,Industrial,Mini,Lowrise,Medium,Far,8,6,2647,32,40,521,1261 +695,DZ-162,District ZERO,Industrial,Mini,Lowrise,Medium,Far,8,6,2767,32,40,448,1335 +695,DZ-258,District ZERO,Industrial,Mini,Lowrise,Medium,Far,8,6,3349,33,41,335,1660 +695,DZ-270,District ZERO,Industrial,Mini,Lowrise,Medium,Far,14,11,3082,59,73,547,1365 +695,DZ-272,District ZERO,Industrial,Mini,Lowrise,Medium,Far,3,2,2679,13,16,358,1500 +695,DZ-386,District ZERO,Industrial,Mini,Lowrise,Medium,Far,8,6,3251,32,40,379,1185 +707,SM-120,Space Mind,Industrial,Mini,Lowrise,Far,Close,8,6,3396,34,42,2356,272 +708,LM-13,Little Meow,Commercial,Mini,Lowrise,Far,Far,5,4,2924,22,27,2309,1374 +708,LM-15,Little Meow,Commercial,Mini,Lowrise,Far,Far,4,3,2924,16,20,2326,1410 +708,LM-16,Little Meow,Commercial,Mini,Lowrise,Far,Far,6,5,2436,28,34,2391,1455 +708,LM-17,Little Meow,Commercial,Mini,Lowrise,Far,Far,4,3,2924,16,20,2318,1447 +708,LM-19,Little Meow,Commercial,Mini,Lowrise,Far,Far,4,3,2680,16,20,2388,1419 +708,LM-20,Little Meow,Commercial,Mini,Lowrise,Far,Far,6,5,2800,27,33,2310,1423 +708,LM-87,Little Meow,Commercial,Mini,Lowrise,Far,Far,4,3,2877,16,20,1725,739 +708,LM-90,Little Meow,Commercial,Mini,Lowrise,Far,Far,4,3,3083,18,22,1713,706 +708,LM-96,Little Meow,Commercial,Mini,Lowrise,Far,Far,7,5,3429,29,36,1700,674 +717,NS-752,North Star,Mixed Use,Micro,Lowrise,Far,Medium,19,16,2156,80,99,2089,502 +717,NS-801,North Star,Mixed Use,Micro,Lowrise,Far,Medium,19,16,1742,80,99,1883,464 +719,DZ-314,District ZERO,Industrial,Mini,Lowrise,Far,Close,4,3,3045,16,20,1906,292 +719,DZ-317,District ZERO,Industrial,Mini,Lowrise,Far,Close,4,3,2653,16,20,1950,265 +719,DZ-342,District ZERO,Industrial,Mini,Lowrise,Far,Close,4,3,3581,16,20,1873,256 +719,DZ-361,District ZERO,Industrial,Mini,Lowrise,Far,Close,8,6,3100,32,40,1901,161 +719,DZ-382,District ZERO,Industrial,Mini,Lowrise,Far,Close,8,6,3179,32,40,1899,125 +724,FL-95,Flashing Lights,Residential,Mini,Lowrise,Far,Medium,9,7,2421,38,47,2082,473 +725,TG-7,Tranquility Gardens,Industrial,Mini,Lowrise,Far,Close,11,9,3594,45,56,3218,134 +725,TG-9,Tranquility Gardens,Industrial,Mini,Lowrise,Far,Close,8,6,2440,32,40,2413,276 +725,TG-16,Tranquility Gardens,Industrial,Mini,Lowrise,Far,Close,9,7,3458,36,45,4585,136 +725,TG-30,Tranquility Gardens,Industrial,Mini,Lowrise,Far,Close,11,9,3237,47,58,4571,213 +725,TG-181,Tranquility Gardens,Industrial,Mini,Lowrise,Far,Close,8,6,2420,34,42,4700,177 +730,HH-860,Haven Heights,Industrial,Mini,Lowrise,Medium,Medium,8,6,2559,33,41,590,464 +730,HH-892,Haven Heights,Industrial,Mini,Lowrise,Medium,Medium,4,3,2837,17,21,590,492 +730,HH-909,Haven Heights,Industrial,Mini,Lowrise,Medium,Medium,4,3,2948,17,21,578,542 +733,NS-693,North Star,Industrial,Mini,Lowrise,Medium,Far,9,7,2440,36,45,415,1277 +733,NS-875,North Star,Industrial,Mini,Lowrise,Medium,Far,12,10,3080,52,64,463,824 +733,NS-884,North Star,Industrial,Mini,Lowrise,Medium,Far,4,3,2421,16,20,546,726 +733,NS-904,North Star,Industrial,Mini,Lowrise,Medium,Far,15,12,2984,62,77,407,845 +733,NS-905,North Star,Industrial,Mini,Lowrise,Medium,Far,12,10,2555,51,63,327,926 +733,NS-910,North Star,Industrial,Mini,Lowrise,Medium,Far,8,7,3066,36,44,460,777 +733,NS-920,North Star,Industrial,Mini,Lowrise,Medium,Far,12,10,2990,50,62,425,783 +733,NS-940,North Star,Industrial,Mini,Lowrise,Medium,Far,11,8,3595,44,55,453,809 +741,FL-22,Flashing Lights,Commercial,Micro,Lowrise,Far,Close,4,3,1456,16,20,2325,135 +741,FL-24,Flashing Lights,Commercial,Micro,Lowrise,Far,Close,4,3,1531,16,20,2287,138 +743,SM-2,Space Mind,Industrial,Mini,Lowrise,Far,Medium,11,9,3432,46,57,1857,542 +743,SM-4,Space Mind,Industrial,Mini,Lowrise,Far,Medium,12,10,2530,51,63,2000,452 +743,SM-317,Space Mind,Industrial,Mini,Lowrise,Far,Medium,8,6,2671,32,40,1269,436 +743,SM-428,Space Mind,Industrial,Mini,Lowrise,Far,Medium,14,11,3089,59,73,1592,493 +743,SM-465,Space Mind,Industrial,Mini,Lowrise,Far,Medium,11,9,3053,45,56,1555,474 +743,SM-579,Space Mind,Industrial,Mini,Lowrise,Far,Medium,3,3,3022,15,18,998,518 +749,LM-183,Little Meow,Commercial,Micro,Lowrise,Medium,Far,4,4,1935,20,24,389,1121 +749,LM-199,Little Meow,Commercial,Micro,Lowrise,Medium,Far,4,3,2339,16,20,384,1119 +749,LM-225,Little Meow,Commercial,Micro,Lowrise,Medium,Far,5,4,1748,21,26,354,1111 +749,LM-252,Little Meow,Commercial,Micro,Lowrise,Medium,Far,6,5,2062,26,32,399,1006 +749,LM-255,Little Meow,Commercial,Micro,Lowrise,Medium,Far,4,3,2006,17,21,389,1007 +749,LM-263,Little Meow,Commercial,Micro,Lowrise,Medium,Far,5,4,1664,21,26,524,626 +749,LM-272,Little Meow,Commercial,Micro,Lowrise,Medium,Far,4,3,1932,16,20,341,984 +749,LM-276,Little Meow,Commercial,Micro,Lowrise,Medium,Far,3,3,2158,15,18,348,766 +757,DZ-18,District ZERO,Industrial,Mini,Lowrise,Far,Medium,8,6,2667,32,40,1396,319 +757,DZ-92,District ZERO,Industrial,Mini,Lowrise,Far,Medium,9,7,3008,38,47,1627,415 +757,DZ-108,District ZERO,Industrial,Mini,Lowrise,Far,Medium,8,6,2947,32,40,1609,388 +757,DZ-128,District ZERO,Industrial,Mini,Lowrise,Far,Medium,8,6,2446,32,40,1489,410 +757,DZ-132,District ZERO,Industrial,Mini,Lowrise,Far,Medium,8,6,2554,32,40,1457,405 +757,DZ-133,District ZERO,Industrial,Mini,Lowrise,Far,Medium,8,6,2557,32,40,1401,464 +757,DZ-138,District ZERO,Industrial,Mini,Lowrise,Far,Medium,8,6,2969,32,40,1400,398 +757,DZ-139,District ZERO,Industrial,Mini,Lowrise,Far,Medium,8,6,2620,32,40,1373,413 +757,DZ-164,District ZERO,Industrial,Mini,Lowrise,Far,Medium,8,6,2756,32,40,1523,432 +757,DZ-181,District ZERO,Industrial,Mini,Lowrise,Far,Medium,8,6,3384,32,40,1614,442 +757,DZ-183,District ZERO,Industrial,Mini,Lowrise,Far,Medium,8,6,2807,32,40,1601,492 +757,DZ-195,District ZERO,Industrial,Mini,Lowrise,Far,Medium,8,6,3518,34,42,1733,408 +757,DZ-196,District ZERO,Industrial,Mini,Lowrise,Far,Medium,8,6,2860,32,40,1652,482 +757,DZ-209,District ZERO,Industrial,Mini,Lowrise,Far,Medium,8,6,3218,32,40,1628,537 +757,DZ-214,District ZERO,Industrial,Mini,Lowrise,Far,Medium,8,6,3279,32,40,1621,568 +757,DZ-221,District ZERO,Industrial,Mini,Lowrise,Far,Medium,8,6,2622,32,40,1856,371 +757,DZ-222,District ZERO,Industrial,Mini,Lowrise,Far,Medium,8,6,3207,34,42,1710,504 +757,DZ-226,District ZERO,Industrial,Mini,Lowrise,Far,Medium,8,6,2554,32,40,1618,592 +757,DZ-237,District ZERO,Industrial,Mini,Lowrise,Far,Medium,8,6,3195,32,40,1763,475 +757,DZ-253,District ZERO,Industrial,Mini,Lowrise,Far,Medium,8,6,2668,32,40,1681,583 +757,DZ-315,District ZERO,Industrial,Mini,Lowrise,Far,Medium,6,5,3366,28,34,1862,322 +757,DZ-364,District ZERO,Industrial,Mini,Lowrise,Far,Medium,8,6,2983,32,40,1647,324 +757,DZ-379,District ZERO,Industrial,Mini,Lowrise,Far,Medium,8,6,2860,32,40,1213,568 +757,DZ-398,District ZERO,Industrial,Mini,Lowrise,Far,Medium,8,6,3218,32,40,1314,433 +757,DZ-410,District ZERO,Industrial,Mini,Lowrise,Far,Medium,8,6,3280,32,40,1375,352 +782,DZ-641,District ZERO,Commercial,Mini,Lowrise,Medium,Close,4,3,2405,17,21,311,282 +783,NS-845,North Star,Industrial,Mini,Lowrise,Far,Close,14,11,2794,59,73,1745,290 +783,NS-879,North Star,Industrial,Mini,Lowrise,Far,Close,12,10,2509,52,64,1227,210 +783,NS-887,North Star,Industrial,Mini,Lowrise,Far,Close,14,11,2999,58,72,2061,215 +783,NS-927,North Star,Industrial,Mini,Lowrise,Far,Close,9,7,2975,38,47,1089,144 +783,NS-933,North Star,Industrial,Mini,Lowrise,Far,Close,9,7,2617,39,48,1093,175 +788,TG-128,Tranquility Gardens,Industrial,Mini,Lowrise,Far,Medium,9,8,3020,40,49,4491,429 +788,TG-474,Tranquility Gardens,Industrial,Mini,Lowrise,Far,Medium,9,7,2499,38,47,3435,506 +788,TG-475,Tranquility Gardens,Industrial,Mini,Lowrise,Far,Medium,8,6,3455,33,41,3395,532 +791,HH-22,Haven Heights,Industrial,Mini,Lowrise,Far,Close,4,3,2866,16,20,1051,186 +791,HH-26,Haven Heights,Industrial,Mini,Lowrise,Far,Close,6,4,2732,24,30,1047,206 +791,HH-38,Haven Heights,Industrial,Mini,Lowrise,Far,Close,4,3,2496,16,20,1156,167 +791,HH-39,Haven Heights,Industrial,Mini,Lowrise,Far,Close,6,5,2494,26,32,1110,198 +791,HH-40,Haven Heights,Industrial,Mini,Lowrise,Far,Close,4,3,2492,19,23,1065,230 +791,HH-54,Haven Heights,Industrial,Mini,Lowrise,Far,Close,4,3,2434,16,20,1150,212 +791,HH-55,Haven Heights,Industrial,Mini,Lowrise,Far,Close,4,3,2432,18,22,1059,275 +798,FL-190,Flashing Lights,Commercial,Nano,Lowrise,Far,Close,4,3,1062,19,23,2445,286 +798,FL-197,Flashing Lights,Commercial,Nano,Lowrise,Far,Close,6,5,1013,28,34,2442,231 +798,FL-219,Flashing Lights,Commercial,Nano,Lowrise,Far,Close,5,4,1088,21,26,3273,201 +798,FL-225,Flashing Lights,Commercial,Nano,Lowrise,Far,Close,4,3,982,16,20,3417,154 +798,FL-236,Flashing Lights,Commercial,Nano,Lowrise,Far,Close,5,4,983,21,26,3416,151 +798,FL-247,Flashing Lights,Commercial,Nano,Lowrise,Far,Close,4,3,1096,16,20,3046,268 +798,FL-250,Flashing Lights,Commercial,Nano,Lowrise,Far,Close,4,3,1122,16,20,2987,209 +805,LM-226,Little Meow,Commercial,Micro,Lowrise,Far,Close,6,5,1468,28,34,794,297 +805,LM-238,Little Meow,Commercial,Micro,Lowrise,Far,Close,9,7,1579,38,47,769,300 +807,LM-178,Little Meow,Commercial,Nano,Lowrise,Medium,Far,5,4,599,21,26,412,1104 +807,LM-275,Little Meow,Commercial,Nano,Lowrise,Medium,Far,4,3,387,16,20,360,730 +809,SM-11,Space Mind,Industrial,Mini,Lowrise,Far,Far,8,6,3081,32,40,1547,694 +809,SM-30,Space Mind,Industrial,Mini,Lowrise,Far,Far,4,3,2571,16,20,1802,676 +809,SM-56,Space Mind,Industrial,Mini,Lowrise,Far,Far,9,7,2756,39,48,1834,675 +809,SM-59,Space Mind,Industrial,Mini,Lowrise,Far,Far,9,7,2810,39,48,1682,813 +809,SM-70,Space Mind,Industrial,Mini,Lowrise,Far,Far,10,8,2738,43,53,1724,791 +809,SM-103,Space Mind,Industrial,Mini,Lowrise,Far,Far,8,6,2447,33,41,710,1462 +809,SM-110,Space Mind,Industrial,Mini,Lowrise,Far,Far,8,7,2599,35,43,759,1389 +809,SM-166,Space Mind,Industrial,Mini,Lowrise,Far,Far,8,6,2757,32,40,933,1080 +809,SM-597,Space Mind,Industrial,Mini,Lowrise,Far,Far,9,7,2783,39,48,776,689 +809,SM-603,Space Mind,Industrial,Mini,Lowrise,Far,Far,10,8,3024,40,50,601,855 +819,DZ-60,District ZERO,Industrial,Mini,Lowrise,Far,Far,8,6,3294,32,40,927,832 +819,DZ-62,District ZERO,Industrial,Mini,Lowrise,Far,Far,10,8,3169,41,51,781,963 +819,DZ-68,District ZERO,Industrial,Mini,Lowrise,Far,Far,8,6,3094,32,40,769,989 +819,DZ-75,District ZERO,Industrial,Mini,Lowrise,Far,Far,10,8,3003,44,54,834,967 +819,DZ-85,District ZERO,Industrial,Mini,Lowrise,Far,Far,8,7,3153,35,43,1164,762 +819,DZ-86,District ZERO,Industrial,Mini,Lowrise,Far,Far,9,7,3048,36,45,1112,793 +819,DZ-88,District ZERO,Industrial,Mini,Lowrise,Far,Far,8,6,3059,32,40,877,960 +819,DZ-99,District ZERO,Industrial,Mini,Lowrise,Far,Far,8,6,2983,32,40,990,927 +819,DZ-117,District ZERO,Industrial,Mini,Lowrise,Far,Far,8,6,3041,32,40,914,1008 +819,DZ-118,District ZERO,Industrial,Mini,Lowrise,Far,Far,9,8,3395,40,49,772,1105 +819,DZ-124,District ZERO,Industrial,Mini,Lowrise,Far,Far,8,6,3218,32,40,1206,724 +819,DZ-125,District ZERO,Industrial,Mini,Lowrise,Far,Far,8,6,3223,32,40,1150,781 +819,DZ-127,District ZERO,Industrial,Mini,Lowrise,Far,Far,12,10,2571,52,64,777,1158 +819,DZ-129,District ZERO,Industrial,Mini,Lowrise,Far,Far,8,6,3279,33,41,1190,713 +819,DZ-150,District ZERO,Industrial,Mini,Lowrise,Far,Far,8,6,2907,32,40,628,1156 +819,DZ-153,District ZERO,Industrial,Mini,Lowrise,Far,Far,8,6,2727,33,41,1251,601 +819,DZ-161,District ZERO,Industrial,Mini,Lowrise,Far,Far,8,6,2859,32,40,810,995 +819,DZ-163,District ZERO,Industrial,Mini,Lowrise,Far,Far,8,6,2771,32,40,1241,629 +819,DZ-184,District ZERO,Industrial,Mini,Lowrise,Far,Far,14,11,2455,56,70,1354,661 +819,DZ-185,District ZERO,Industrial,Mini,Lowrise,Far,Far,8,6,2458,32,40,1295,704 +819,DZ-187,District ZERO,Industrial,Mini,Lowrise,Far,Far,8,7,3085,36,44,855,1051 +819,DZ-199,District ZERO,Industrial,Mini,Lowrise,Far,Far,10,8,3233,44,54,1136,861 +819,DZ-213,District ZERO,Industrial,Mini,Lowrise,Far,Far,8,6,3028,32,40,886,1111 +819,DZ-215,District ZERO,Industrial,Mini,Lowrise,Far,Far,13,10,3262,53,66,1562,617 +819,DZ-217,District ZERO,Industrial,Mini,Lowrise,Far,Far,8,6,2418,32,40,1262,870 +819,DZ-238,District ZERO,Industrial,Mini,Lowrise,Far,Far,10,8,2544,43,53,1612,615 +819,DZ-267,District ZERO,Industrial,Mini,Lowrise,Far,Far,12,9,3354,48,60,792,1224 +819,DZ-280,District ZERO,Industrial,Mini,Lowrise,Far,Far,8,6,3203,32,40,1259,820 +819,DZ-302,District ZERO,Industrial,Mini,Lowrise,Far,Far,8,6,2537,32,40,1026,882 +819,DZ-303,District ZERO,Industrial,Mini,Lowrise,Far,Far,8,6,2518,32,40,967,925 +819,DZ-344,District ZERO,Industrial,Mini,Lowrise,Far,Far,8,7,3042,35,43,829,943 +819,DZ-351,District ZERO,Industrial,Mini,Lowrise,Far,Far,8,6,2413,32,40,979,830 +819,DZ-369,District ZERO,Industrial,Mini,Lowrise,Far,Far,8,6,2872,32,40,1151,647 +852,FL-20,Flashing Lights,Residential,Micro,Lowrise,Medium,Far,10,8,1562,41,51,316,1078 +852,FL-79,Flashing Lights,Residential,Micro,Lowrise,Medium,Far,17,13,1440,69,86,345,1369 +852,FL-131,Flashing Lights,Residential,Micro,Lowrise,Medium,Far,17,13,2010,69,86,336,1380 +852,FL-155,Flashing Lights,Residential,Micro,Lowrise,Medium,Far,13,11,2044,56,69,344,1351 +856,LM-260,Little Meow,Residential,Micro,Lowrise,Medium,Medium,5,4,2053,20,25,572,544 +856,LM-267,Little Meow,Residential,Micro,Lowrise,Medium,Medium,2,2,2260,10,12,504,577 +858,TG-235,Tranquility Gardens,Industrial,Mini,Lowrise,Far,Far,9,7,3152,38,47,2821,1305 +858,TG-238,Tranquility Gardens,Industrial,Mini,Lowrise,Far,Far,11,9,3135,47,58,3717,1124 +858,TG-244,Tranquility Gardens,Industrial,Mini,Lowrise,Far,Far,8,6,2433,33,41,2837,1355 +858,TG-245,Tranquility Gardens,Industrial,Mini,Lowrise,Far,Far,9,7,3428,39,48,2790,1381 +858,TG-441,Tranquility Gardens,Industrial,Mini,Lowrise,Far,Far,9,7,2816,36,45,3384,734 +858,TG-455,Tranquility Gardens,Industrial,Mini,Lowrise,Far,Far,11,9,2953,48,59,3390,657 +864,LM-109,Little Meow,Commercial,Nano,Lowrise,Far,Close,4,3,1031,16,20,1956,275 +864,LM-118,Little Meow,Commercial,Nano,Lowrise,Far,Close,2,2,1024,12,14,1837,292 +864,LM-120,Little Meow,Commercial,Nano,Lowrise,Far,Close,4,3,1054,16,20,1910,220 +864,LM-123,Little Meow,Commercial,Nano,Lowrise,Far,Close,5,4,1075,23,28,1866,224 +864,LM-128,Little Meow,Commercial,Nano,Lowrise,Far,Close,4,3,1037,16,20,1798,236 +864,LM-132,Little Meow,Commercial,Nano,Lowrise,Far,Close,7,5,742,29,36,1834,145 +864,LM-137,Little Meow,Commercial,Nano,Lowrise,Far,Close,5,4,773,23,28,1747,146 +864,LM-139,Little Meow,Commercial,Nano,Lowrise,Far,Close,6,5,740,25,31,1811,118 +864,LM-140,Little Meow,Commercial,Nano,Lowrise,Far,Close,4,3,744,17,21,1774,116 +864,LM-145,Little Meow,Commercial,Nano,Lowrise,Far,Close,4,4,484,20,24,1753,91 +864,LM-147,Little Meow,Commercial,Nano,Lowrise,Far,Close,5,4,772,20,25,1709,101 +864,LM-205,Little Meow,Commercial,Nano,Lowrise,Far,Close,4,4,1003,20,24,957,137 +864,LM-206,Little Meow,Commercial,Nano,Lowrise,Far,Close,4,3,1192,16,20,946,155 +877,FL-12,Flashing Lights,Commercial,Micro,Lowrise,Far,Medium,5,4,2104,20,25,951,541 +878,FL-23,Flashing Lights,Residential,Micro,Lowrise,Far,Close,5,4,1525,22,27,2306,137 +878,FL-25,Flashing Lights,Residential,Micro,Lowrise,Far,Close,5,4,1538,20,25,2268,142 +878,FL-26,Flashing Lights,Residential,Micro,Lowrise,Far,Close,6,5,1544,26,32,2249,144 +878,FL-27,Flashing Lights,Residential,Micro,Lowrise,Far,Close,4,3,1387,16,20,2231,145 +878,FL-35,Flashing Lights,Residential,Micro,Lowrise,Far,Close,7,6,1508,31,38,2306,175 +878,FL-36,Flashing Lights,Residential,Micro,Lowrise,Far,Close,4,3,1518,17,21,2286,190 +878,FL-37,Flashing Lights,Residential,Micro,Lowrise,Far,Close,4,3,1537,17,21,2248,222 +878,FL-38,Flashing Lights,Residential,Micro,Lowrise,Far,Close,5,4,1385,21,26,2230,228 +878,FL-43,Flashing Lights,Residential,Micro,Lowrise,Far,Close,15,12,2079,62,77,1491,277 +878,FL-186,Flashing Lights,Residential,Micro,Lowrise,Far,Close,4,3,1470,17,21,2716,121 +878,FL-187,Flashing Lights,Residential,Micro,Lowrise,Far,Close,6,5,1469,25,31,2699,136 +878,FL-188,Flashing Lights,Residential,Micro,Lowrise,Far,Close,4,3,1468,17,21,2682,152 +878,FL-189,Flashing Lights,Residential,Micro,Lowrise,Far,Close,4,3,1432,16,20,2665,168 +878,FL-199,Flashing Lights,Residential,Micro,Lowrise,Far,Close,5,4,1581,23,28,2697,114 +878,FL-200,Flashing Lights,Residential,Micro,Lowrise,Far,Close,5,4,1317,23,28,2677,133 +878,FL-201,Flashing Lights,Residential,Micro,Lowrise,Far,Close,4,3,1383,17,21,2659,147 +894,LM-236,Little Meow,Residential,Micro,Lowrise,Medium,Far,6,5,1992,28,34,431,1005 +894,LM-237,Little Meow,Residential,Micro,Lowrise,Medium,Far,4,3,1666,16,20,350,1104 +894,LM-240,Little Meow,Residential,Micro,Lowrise,Medium,Far,8,6,2016,32,40,420,1005 +894,LM-241,Little Meow,Residential,Micro,Lowrise,Medium,Far,4,4,1367,20,24,347,1096 +894,LM-245,Little Meow,Residential,Micro,Lowrise,Medium,Far,11,9,2039,46,57,409,1005 +894,LM-262,Little Meow,Residential,Micro,Lowrise,Medium,Far,4,3,2187,16,20,326,1040 +894,LM-270,Little Meow,Residential,Micro,Lowrise,Medium,Far,4,3,1952,16,20,317,1020 +901,DZ-642,District ZERO,Commercial,Mini,Lowrise,Medium,Medium,4,3,2505,16,20,311,309 +902,NS-712,North Star,Industrial,Mini,Lowrise,Far,Medium,12,9,2537,49,61,2078,482 +902,NS-735,North Star,Industrial,Mini,Lowrise,Far,Medium,12,10,3094,52,64,1729,588 +902,NS-784,North Star,Industrial,Mini,Lowrise,Far,Medium,8,6,3034,32,40,2029,499 +902,NS-785,North Star,Industrial,Mini,Lowrise,Far,Medium,6,5,3091,27,33,1879,519 +902,NS-812,North Star,Industrial,Mini,Lowrise,Far,Medium,12,9,3530,49,61,1481,314 +902,NS-819,North Star,Industrial,Mini,Lowrise,Far,Medium,13,10,2817,52,65,1798,369 +902,NS-853,North Star,Industrial,Mini,Lowrise,Far,Medium,11,8,2537,44,55,902,524 +902,NS-867,North Star,Industrial,Mini,Lowrise,Far,Medium,8,6,3041,32,40,1065,365 +902,NS-869,North Star,Industrial,Mini,Lowrise,Far,Medium,11,9,2554,45,56,907,464 +911,HH-385,Haven Heights,Industrial,Mini,Lowrise,Far,Medium,6,5,2535,26,32,1743,305 +911,HH-386,Haven Heights,Industrial,Mini,Lowrise,Far,Medium,4,3,2533,19,23,1704,348 +911,HH-387,Haven Heights,Industrial,Mini,Lowrise,Far,Medium,4,3,2531,16,20,1665,388 +911,HH-388,Haven Heights,Industrial,Mini,Lowrise,Far,Medium,5,4,2507,22,27,1627,427 +911,HH-771,Haven Heights,Industrial,Mini,Lowrise,Far,Medium,4,3,2963,16,20,998,585 +911,HH-891,Haven Heights,Industrial,Mini,Lowrise,Far,Medium,7,6,2815,30,37,653,435 +911,HH-914,Haven Heights,Industrial,Mini,Lowrise,Far,Medium,4,3,2938,16,20,624,517 +918,FL-191,Flashing Lights,Commercial,Nano,Lowrise,Far,Medium,4,3,1065,19,23,2382,305 +918,FL-245,Flashing Lights,Commercial,Nano,Lowrise,Far,Medium,4,3,1062,17,21,3179,331 +920,LM-228,Little Meow,Commercial,Micro,Lowrise,Far,Medium,10,8,1303,43,53,743,453 +920,LM-229,Little Meow,Commercial,Micro,Lowrise,Far,Medium,4,3,1341,16,20,731,509 +920,LM-239,Little Meow,Commercial,Micro,Lowrise,Far,Medium,4,4,1541,20,24,746,355 +920,LM-243,Little Meow,Commercial,Micro,Lowrise,Far,Medium,4,3,1541,16,20,720,360 +924,FL-193,Flashing Lights,Residential,Nano,Lowrise,Far,Close,4,3,1066,17,21,2381,285 +924,FL-194,Flashing Lights,Residential,Nano,Lowrise,Far,Close,4,4,1062,20,24,2443,249 +924,FL-195,Flashing Lights,Residential,Nano,Lowrise,Far,Close,4,3,1068,16,20,2380,266 +924,FL-198,Flashing Lights,Residential,Nano,Lowrise,Far,Close,4,4,987,20,24,2379,247 +924,FL-206,Flashing Lights,Residential,Nano,Lowrise,Far,Close,5,4,870,20,25,3336,116 +924,FL-207,Flashing Lights,Residential,Nano,Lowrise,Far,Close,5,4,995,23,28,3277,102 +924,FL-209,Flashing Lights,Residential,Nano,Lowrise,Far,Close,4,3,1167,17,21,3335,133 +924,FL-212,Flashing Lights,Residential,Nano,Lowrise,Far,Close,6,5,1167,25,31,3335,152 +924,FL-213,Flashing Lights,Residential,Nano,Lowrise,Far,Close,4,3,1170,18,22,3276,141 +924,FL-214,Flashing Lights,Residential,Nano,Lowrise,Far,Close,9,7,1167,38,47,3335,172 +924,FL-215,Flashing Lights,Residential,Nano,Lowrise,Far,Close,6,5,1172,27,33,3275,161 +924,FL-217,Flashing Lights,Residential,Nano,Lowrise,Far,Close,4,3,1173,19,23,3275,182 +924,FL-218,Flashing Lights,Residential,Nano,Lowrise,Far,Close,4,3,1114,17,21,3333,212 +924,FL-220,Flashing Lights,Residential,Nano,Lowrise,Far,Close,9,7,920,36,45,3468,109 +924,FL-221,Flashing Lights,Residential,Nano,Lowrise,Far,Close,4,3,946,18,22,3418,157 +924,FL-222,Flashing Lights,Residential,Nano,Lowrise,Far,Close,6,5,1028,27,33,3181,252 +924,FL-223,Flashing Lights,Residential,Nano,Lowrise,Far,Close,4,3,1028,16,20,3118,245 +924,FL-224,Flashing Lights,Residential,Nano,Lowrise,Far,Close,4,3,950,16,20,3467,104 +924,FL-226,Flashing Lights,Residential,Nano,Lowrise,Far,Close,5,4,1062,23,28,3180,272 +924,FL-227,Flashing Lights,Residential,Nano,Lowrise,Far,Close,4,4,1064,20,24,3118,264 +924,FL-228,Flashing Lights,Residential,Nano,Lowrise,Far,Close,4,4,1098,20,24,3048,259 +924,FL-229,Flashing Lights,Residential,Nano,Lowrise,Far,Close,4,3,1135,17,21,3028,246 +924,FL-230,Flashing Lights,Residential,Nano,Lowrise,Far,Close,6,5,1135,27,33,3008,227 +924,FL-231,Flashing Lights,Residential,Nano,Lowrise,Far,Close,4,3,1135,18,22,2988,207 +924,FL-232,Flashing Lights,Residential,Nano,Lowrise,Far,Close,4,3,1135,16,20,2968,187 +924,FL-233,Flashing Lights,Residential,Nano,Lowrise,Far,Close,5,4,1103,22,27,2949,168 +924,FL-235,Flashing Lights,Residential,Nano,Lowrise,Far,Close,7,5,950,28,35,3467,102 +924,FL-237,Flashing Lights,Residential,Nano,Lowrise,Far,Close,4,3,1062,18,22,3180,292 +924,FL-238,Flashing Lights,Residential,Nano,Lowrise,Far,Close,4,3,1065,16,20,3117,284 +924,FL-240,Flashing Lights,Residential,Nano,Lowrise,Far,Close,4,3,951,17,21,3466,101 +924,FL-241,Flashing Lights,Residential,Nano,Lowrise,Far,Close,4,4,984,20,24,3416,151 +924,FL-243,Flashing Lights,Residential,Nano,Lowrise,Far,Close,4,3,952,16,20,3466,102 +924,FL-244,Flashing Lights,Residential,Nano,Lowrise,Far,Close,6,5,985,28,34,3416,152 +924,FL-248,Flashing Lights,Residential,Nano,Lowrise,Far,Close,6,5,1129,28,34,3026,249 +924,FL-249,Flashing Lights,Residential,Nano,Lowrise,Far,Close,4,3,1126,16,20,3006,229 +924,FL-251,Flashing Lights,Residential,Nano,Lowrise,Far,Close,7,6,1118,31,38,2967,190 +924,FL-252,Flashing Lights,Residential,Nano,Lowrise,Far,Close,4,3,1095,16,20,2947,170 +924,FL-253,Flashing Lights,Residential,Nano,Lowrise,Far,Close,4,3,909,17,21,3415,154 +962,SM-549,Space Mind,Commercial,Mini,Lowrise,Medium,Far,8,6,3037,32,40,341,1381 +962,SM-598,Space Mind,Commercial,Mini,Lowrise,Medium,Far,9,7,2827,38,47,540,956 +964,SM-259,Space Mind,Industrial,Micro,Lowrise,Medium,Far,8,6,2008,34,42,479,1440 +965,LM-185,Little Meow,Residential,Micro,Lowrise,Far,Close,5,4,1220,20,25,994,188 +965,LM-186,Little Meow,Residential,Micro,Lowrise,Far,Close,8,6,1221,32,40,983,205 +965,LM-187,Little Meow,Residential,Micro,Lowrise,Far,Close,5,4,1221,22,27,973,222 +965,LM-188,Little Meow,Residential,Micro,Lowrise,Far,Close,5,4,1222,23,28,963,241 +969,LM-246,Little Meow,Residential,Nano,Lowrise,Medium,Far,4,3,1068,16,20,343,1089 +969,LM-253,Little Meow,Residential,Nano,Lowrise,Medium,Far,8,7,768,35,43,337,1082 +969,LM-256,Little Meow,Residential,Nano,Lowrise,Medium,Far,4,3,461,16,20,330,1078 +972,DZ-441,District ZERO,Commercial,Mini,Lowrise,Medium,Far,4,3,3005,16,20,411,890 +972,DZ-442,District ZERO,Commercial,Mini,Lowrise,Medium,Far,8,6,3237,32,40,384,913 +972,DZ-443,District ZERO,Commercial,Mini,Lowrise,Medium,Far,4,3,3235,16,20,357,936 +975,DZ-152,District ZERO,Industrial,Micro,Lowrise,Medium,Far,8,6,2267,32,40,347,1434 +975,DZ-257,District ZERO,Industrial,Micro,Lowrise,Medium,Far,3,3,2247,15,18,385,1616 +975,DZ-260,District ZERO,Industrial,Micro,Lowrise,Medium,Far,9,7,1852,39,48,477,1525 +978,NS-717,North Star,Industrial,Mini,Lowrise,Far,Far,14,11,2598,57,71,1384,629 +978,NS-718,North Star,Industrial,Mini,Lowrise,Far,Far,8,7,3433,36,44,893,851 +978,NS-739,North Star,Industrial,Mini,Lowrise,Far,Far,11,9,2963,45,56,737,886 +978,NS-827,North Star,Industrial,Mini,Lowrise,Far,Far,12,10,2923,50,62,758,662 +982,HH-569,Haven Heights,Industrial,Mini,Lowrise,Far,Far,4,3,2545,16,20,796,1037 +982,HH-745,Haven Heights,Industrial,Mini,Lowrise,Far,Far,4,3,2933,17,21,1001,686 +982,HH-763,Haven Heights,Industrial,Mini,Lowrise,Far,Far,4,3,2963,16,20,999,635 +985,LM-104,Little Meow,Commercial,Nano,Lowrise,Far,Medium,4,3,677,16,20,2044,408 +985,LM-150,Little Meow,Commercial,Nano,Lowrise,Far,Medium,4,3,683,16,20,1014,507 +985,LM-156,Little Meow,Commercial,Nano,Lowrise,Far,Medium,3,2,666,13,16,1001,555 +985,LM-157,Little Meow,Commercial,Nano,Lowrise,Far,Medium,3,2,633,13,16,998,571 +985,LM-167,Little Meow,Commercial,Nano,Lowrise,Far,Medium,4,3,719,16,20,965,483 +985,LM-189,Little Meow,Commercial,Nano,Lowrise,Far,Medium,4,3,946,16,20,933,307 +985,LM-190,Little Meow,Commercial,Nano,Lowrise,Far,Medium,4,3,979,16,20,926,324 +985,LM-191,Little Meow,Commercial,Nano,Lowrise,Far,Medium,4,3,979,16,20,919,342 +985,LM-192,Little Meow,Commercial,Nano,Lowrise,Far,Medium,4,3,979,17,21,913,360 +985,LM-193,Little Meow,Commercial,Nano,Lowrise,Far,Medium,5,4,979,21,26,907,378 +985,LM-195,Little Meow,Commercial,Nano,Lowrise,Far,Medium,2,2,1024,10,12,880,471 +985,LM-217,Little Meow,Commercial,Nano,Lowrise,Far,Medium,4,3,1024,16,20,824,459 +997,SM-142,Space Mind,Commercial,Mini,Lowrise,Far,Close,4,3,3082,16,20,2367,190 +997,SM-156,Space Mind,Commercial,Mini,Lowrise,Far,Close,4,3,3097,19,23,1896,269 +997,SM-163,Space Mind,Commercial,Mini,Lowrise,Far,Close,4,3,3104,19,23,1888,225 +997,SM-164,Space Mind,Commercial,Mini,Lowrise,Far,Close,4,3,3022,16,20,1833,262 +997,SM-179,Space Mind,Commercial,Mini,Lowrise,Far,Close,6,5,2611,25,31,1827,229 +997,SM-312,Space Mind,Commercial,Mini,Lowrise,Far,Close,4,4,2421,20,24,1376,300 +997,SM-329,Space Mind,Commercial,Mini,Lowrise,Far,Close,4,3,3403,17,21,1714,227 +1004,SM-178,Space Mind,Industrial,Micro,Lowrise,Far,Close,11,8,2063,44,55,1883,190 +1005,LM-26,Little Meow,Commercial,Micro,Lowrise,Far,Far,4,3,1469,16,20,2349,1342 +1005,LM-37,Little Meow,Commercial,Micro,Lowrise,Far,Far,4,3,1433,16,20,2307,1284 +1005,LM-38,Little Meow,Commercial,Micro,Lowrise,Far,Far,4,3,1432,16,20,2280,1286 +1005,LM-40,Little Meow,Commercial,Micro,Lowrise,Far,Far,6,5,1271,27,33,2176,1287 +1005,LM-70,Little Meow,Commercial,Micro,Lowrise,Far,Far,5,4,1282,21,26,2267,1004 +1005,LM-77,Little Meow,Commercial,Micro,Lowrise,Far,Far,4,3,1730,16,20,2202,983 +1005,LM-79,Little Meow,Commercial,Micro,Lowrise,Far,Far,4,3,1730,16,20,2202,955 +1005,LM-82,Little Meow,Commercial,Micro,Lowrise,Far,Far,4,3,2119,16,20,1736,770 +1005,LM-91,Little Meow,Commercial,Micro,Lowrise,Far,Far,4,3,1916,16,20,1929,609 +1005,LM-95,Little Meow,Commercial,Micro,Lowrise,Far,Far,4,3,1407,16,20,1798,608 +1005,LM-98,Little Meow,Commercial,Micro,Lowrise,Far,Far,5,4,1551,22,27,1776,605 +1005,LM-102,Little Meow,Commercial,Micro,Lowrise,Far,Far,4,3,1902,16,20,1621,639 +1005,LM-181,Little Meow,Commercial,Micro,Lowrise,Far,Far,3,2,1334,13,16,804,686 +1005,LM-198,Little Meow,Commercial,Micro,Lowrise,Far,Far,3,2,1239,13,16,791,686 +1005,LM-200,Little Meow,Commercial,Micro,Lowrise,Far,Far,3,2,2142,13,16,800,659 +1005,LM-202,Little Meow,Commercial,Micro,Lowrise,Far,Far,3,2,1682,13,16,779,669 +1005,LM-232,Little Meow,Commercial,Micro,Lowrise,Far,Far,4,3,1262,16,20,705,606 +1005,LM-233,Little Meow,Commercial,Micro,Lowrise,Far,Far,5,4,1262,21,26,704,629 +1005,LM-248,Little Meow,Commercial,Micro,Lowrise,Far,Far,4,4,1287,20,24,649,611 +1024,LM-110,Little Meow,Residential,Nano,Lowrise,Far,Close,4,4,1066,20,24,1945,278 +1024,LM-111,Little Meow,Residential,Nano,Lowrise,Far,Close,5,4,1066,24,29,1923,282 +1024,LM-112,Little Meow,Residential,Nano,Lowrise,Far,Close,4,3,1066,18,22,1912,279 +1024,LM-113,Little Meow,Residential,Nano,Lowrise,Far,Close,6,4,1037,24,30,1902,278 +1024,LM-114,Little Meow,Residential,Nano,Lowrise,Far,Close,4,3,990,16,20,1875,280 +1024,LM-115,Little Meow,Residential,Nano,Lowrise,Far,Close,5,4,1025,24,29,1865,283 +1024,LM-116,Little Meow,Residential,Nano,Lowrise,Far,Close,2,2,1024,10,12,1856,286 +1024,LM-117,Little Meow,Residential,Nano,Lowrise,Far,Close,2,2,1024,10,12,1846,290 +1024,LM-119,Little Meow,Residential,Nano,Lowrise,Far,Close,2,2,917,12,14,1828,291 +1024,LM-121,Little Meow,Residential,Nano,Lowrise,Far,Close,4,3,1086,16,20,1899,223 +1024,LM-122,Little Meow,Residential,Nano,Lowrise,Far,Close,4,3,1078,19,23,1877,227 +1024,LM-124,Little Meow,Residential,Nano,Lowrise,Far,Close,4,3,1052,16,20,1855,222 +1024,LM-125,Little Meow,Residential,Nano,Lowrise,Far,Close,5,4,1012,24,29,1827,225 +1024,LM-126,Little Meow,Residential,Nano,Lowrise,Far,Close,4,4,1044,20,24,1817,227 +1024,LM-127,Little Meow,Residential,Nano,Lowrise,Far,Close,4,3,1040,16,20,1807,232 +1024,LM-129,Little Meow,Residential,Nano,Lowrise,Far,Close,4,3,1033,17,21,1788,237 +1024,LM-130,Little Meow,Residential,Nano,Lowrise,Far,Close,4,3,922,16,20,1779,236 +1024,LM-133,Little Meow,Residential,Nano,Lowrise,Far,Close,4,3,704,17,21,1845,158 +1024,LM-134,Little Meow,Residential,Nano,Lowrise,Far,Close,5,4,741,20,25,1797,143 +1024,LM-135,Little Meow,Residential,Nano,Lowrise,Far,Close,4,4,737,20,24,1760,160 +1024,LM-136,Little Meow,Residential,Nano,Lowrise,Far,Close,5,4,724,23,28,1728,168 +1024,LM-138,Little Meow,Residential,Nano,Lowrise,Far,Close,4,3,753,16,20,1715,153 +1024,LM-141,Little Meow,Residential,Nano,Lowrise,Far,Close,9,7,773,36,45,1734,131 +1024,LM-142,Little Meow,Residential,Nano,Lowrise,Far,Close,4,3,753,18,22,1702,138 +1024,LM-143,Little Meow,Residential,Nano,Lowrise,Far,Close,4,4,886,20,24,1799,104 +1024,LM-144,Little Meow,Residential,Nano,Lowrise,Far,Close,6,5,745,28,34,1763,102 +1024,LM-146,Little Meow,Residential,Nano,Lowrise,Far,Close,4,3,491,16,20,1698,89 +1024,LM-148,Little Meow,Residential,Nano,Lowrise,Far,Close,4,3,753,18,22,1677,108 +1024,LM-149,Little Meow,Residential,Nano,Lowrise,Far,Close,4,3,600,16,20,1665,94 +1024,LM-184,Little Meow,Residential,Nano,Lowrise,Far,Close,4,3,1082,16,20,1005,172 +1024,LM-207,Little Meow,Residential,Nano,Lowrise,Far,Close,4,3,1192,16,20,935,175 +1024,LM-208,Little Meow,Residential,Nano,Lowrise,Far,Close,4,3,1192,16,20,924,195 +1024,LM-209,Little Meow,Residential,Nano,Lowrise,Far,Close,4,3,1192,16,20,913,216 +1024,LM-210,Little Meow,Residential,Nano,Lowrise,Far,Close,4,3,1172,18,22,903,237 +1024,LM-211,Little Meow,Residential,Nano,Lowrise,Far,Close,4,3,922,16,20,878,287 +1059,DZ-44,District ZERO,Commercial,Mini,Lowrise,Far,Close,4,3,2540,16,20,2133,240 +1059,DZ-49,District ZERO,Commercial,Mini,Lowrise,Far,Close,4,3,2543,16,20,2113,286 +1059,DZ-339,District ZERO,Commercial,Mini,Lowrise,Far,Close,4,3,3003,16,20,2043,156 +1059,DZ-376,District ZERO,Commercial,Mini,Lowrise,Far,Close,4,4,2492,20,24,1808,196 +1059,DZ-387,District ZERO,Commercial,Mini,Lowrise,Far,Close,5,4,2499,21,26,1813,163 +1059,DZ-393,District ZERO,Commercial,Mini,Lowrise,Far,Close,4,3,2401,16,20,1821,126 +1059,DZ-394,District ZERO,Commercial,Mini,Lowrise,Far,Close,4,3,2513,18,22,1759,162 +1059,DZ-399,District ZERO,Commercial,Mini,Lowrise,Far,Close,4,3,2483,16,20,1767,124 +1067,FL-104,Flashing Lights,Residential,Micro,Lowrise,Far,Medium,16,13,2244,65,81,2601,421 +1067,FL-176,Flashing Lights,Residential,Micro,Lowrise,Far,Medium,13,11,1520,55,68,1323,405 +1069,TG-306,Tranquility Gardens,Commercial,Mini,Lowrise,Far,Close,4,3,3199,16,20,4713,228 +1070,TG-18,Tranquility Gardens,Industrial,Micro,Lowrise,Far,Close,9,7,2223,36,45,3220,164 +1070,TG-50,Tranquility Gardens,Industrial,Micro,Lowrise,Far,Close,9,7,2084,39,48,3219,295 +1070,TG-77,Tranquility Gardens,Industrial,Micro,Lowrise,Far,Close,10,8,1227,43,53,4623,254 +1070,TG-82,Tranquility Gardens,Industrial,Micro,Lowrise,Far,Close,10,8,1227,41,51,4625,264 +1070,TG-246,Tranquility Gardens,Industrial,Micro,Lowrise,Far,Close,14,11,2286,57,71,4829,133 +1070,TG-602,Tranquility Gardens,Industrial,Micro,Lowrise,Far,Close,8,6,1205,33,41,2047,281 +1076,HH-895,Haven Heights,Commercial,Mini,Lowrise,Medium,Medium,4,3,2632,19,23,514,569 +1076,HH-896,Haven Heights,Commercial,Mini,Lowrise,Medium,Medium,4,3,2690,16,20,485,596 +1076,HH-915,Haven Heights,Commercial,Mini,Lowrise,Medium,Medium,4,3,2951,16,20,564,570 +1079,LM-41,Little Meow,Commercial,Nano,Lowrise,Far,Far,6,5,761,27,33,2147,1288 +1079,LM-46,Little Meow,Commercial,Nano,Lowrise,Far,Far,4,3,597,16,20,2168,1196 +1079,LM-47,Little Meow,Commercial,Nano,Lowrise,Far,Far,5,4,704,22,27,2156,1197 +1079,LM-61,Little Meow,Commercial,Nano,Lowrise,Far,Far,5,4,475,23,28,2093,1144 +1079,LM-62,Little Meow,Commercial,Nano,Lowrise,Far,Far,5,4,1162,24,29,2311,1108 +1079,LM-75,Little Meow,Commercial,Nano,Lowrise,Far,Far,4,3,505,17,21,2079,996 +1079,LM-81,Little Meow,Commercial,Nano,Lowrise,Far,Far,4,3,759,16,20,2176,937 +1079,LM-101,Little Meow,Commercial,Nano,Lowrise,Far,Far,4,3,1200,16,20,1672,607 +1079,LM-159,Little Meow,Commercial,Nano,Lowrise,Far,Far,3,2,860,12,15,909,653 +1079,LM-219,Little Meow,Commercial,Nano,Lowrise,Far,Far,3,3,835,15,18,749,689 +1089,FL-182,Flashing Lights,Residential,Nano,Lowrise,Far,Medium,4,3,1028,16,20,2446,322 +1089,FL-183,Flashing Lights,Residential,Nano,Lowrise,Far,Medium,5,4,1028,21,26,2383,343 +1089,FL-184,Flashing Lights,Residential,Nano,Lowrise,Far,Medium,6,5,1062,26,32,2445,304 +1089,FL-185,Flashing Lights,Residential,Nano,Lowrise,Far,Medium,4,3,1064,16,20,2383,324 +1089,FL-246,Flashing Lights,Residential,Nano,Lowrise,Far,Medium,4,3,1068,16,20,3116,323 +1089,FL-254,Flashing Lights,Residential,Nano,Lowrise,Far,Medium,4,3,1013,19,23,3178,351 +1089,FL-255,Flashing Lights,Residential,Nano,Lowrise,Far,Medium,10,8,987,41,51,3115,340 +1096,FL-148,Flashing Lights,Residential,Micro,Lowrise,Far,Far,12,10,1666,51,63,2231,646 +1097,LM-105,Little Meow,Residential,Micro,Lowrise,Far,Medium,4,3,1328,16,20,2032,370 +1097,LM-106,Little Meow,Residential,Micro,Lowrise,Far,Medium,4,3,1362,16,20,2016,374 +1097,LM-107,Little Meow,Residential,Micro,Lowrise,Far,Medium,4,4,1583,20,24,2002,378 +1097,LM-201,Little Meow,Residential,Micro,Lowrise,Far,Medium,4,3,1553,16,20,839,476 +1097,LM-227,Little Meow,Residential,Micro,Lowrise,Far,Medium,4,3,1435,16,20,772,353 +1097,LM-231,Little Meow,Residential,Micro,Lowrise,Far,Medium,4,3,1230,16,20,706,582 +1097,LM-242,Little Meow,Residential,Micro,Lowrise,Far,Medium,4,3,1582,16,20,744,305 +1097,LM-247,Little Meow,Residential,Micro,Lowrise,Far,Medium,4,3,1253,16,20,650,588 +1097,LM-254,Little Meow,Residential,Micro,Lowrise,Far,Medium,4,3,1541,16,20,694,366 +1097,LM-257,Little Meow,Residential,Micro,Lowrise,Far,Medium,4,3,1437,18,22,668,373 +1107,NS-200,North Star,Commercial,Mini,Lowrise,Medium,Far,4,3,2607,16,20,320,815 +1108,NS-768,North Star,Industrial,Micro,Lowrise,Medium,Far,13,10,2284,52,65,438,1054 +1108,NS-830,North Star,Industrial,Micro,Lowrise,Medium,Far,11,8,2377,44,55,385,959 +1108,NS-902,North Star,Industrial,Micro,Lowrise,Medium,Far,15,12,2059,62,77,541,711 +1108,NS-911,North Star,Industrial,Micro,Lowrise,Medium,Far,9,8,1748,40,49,404,832 +1112,HH-287,Haven Heights,Commercial,Mini,Lowrise,Medium,Far,4,3,3001,16,20,585,1115 +1112,HH-672,Haven Heights,Commercial,Mini,Lowrise,Medium,Far,4,3,2797,16,20,390,1316 +1114,SM-27,Space Mind,Commercial,Mini,Lowrise,Far,Medium,6,5,2424,25,31,2024,460 +1114,SM-28,Space Mind,Commercial,Mini,Lowrise,Far,Medium,4,3,2623,19,23,1978,504 +1114,SM-111,Space Mind,Commercial,Mini,Lowrise,Far,Medium,4,3,2450,16,20,2311,351 +1114,SM-115,Space Mind,Commercial,Mini,Lowrise,Far,Medium,4,3,3080,19,23,1907,367 +1114,SM-135,Space Mind,Commercial,Mini,Lowrise,Far,Medium,4,3,3090,17,21,1904,313 +1114,SM-136,Space Mind,Commercial,Mini,Lowrise,Far,Medium,4,3,3014,16,20,1843,355 +1114,SM-157,Space Mind,Commercial,Mini,Lowrise,Far,Medium,4,3,3022,17,21,1840,303 +1114,SM-253,Space Mind,Commercial,Mini,Lowrise,Far,Medium,4,3,2545,17,21,1296,572 +1114,SM-313,Space Mind,Commercial,Mini,Lowrise,Far,Medium,4,4,2596,20,24,1284,422 +1114,SM-331,Space Mind,Commercial,Mini,Lowrise,Far,Medium,5,4,2671,22,27,1254,443 +1114,SM-341,Space Mind,Commercial,Mini,Lowrise,Far,Medium,4,3,2671,16,20,1225,459 +1125,SM-265,Space Mind,Industrial,Micro,Lowrise,Far,Medium,8,6,2341,34,42,1436,312 +1125,SM-282,Space Mind,Industrial,Micro,Lowrise,Far,Medium,9,7,1829,37,46,1405,313 +1125,SM-351,Space Mind,Industrial,Micro,Lowrise,Far,Medium,8,7,2388,36,44,1211,468 +1125,SM-411,Space Mind,Industrial,Micro,Lowrise,Far,Medium,10,8,2326,44,54,1642,423 +1125,SM-602,Space Mind,Industrial,Micro,Lowrise,Far,Medium,8,7,1804,36,44,1117,309 +1130,LM-92,Little Meow,Residential,Nano,Lowrise,Far,Medium,3,3,878,15,18,1849,594 +1130,LM-103,Little Meow,Residential,Nano,Lowrise,Far,Medium,4,3,1124,16,20,2067,411 +1130,LM-108,Little Meow,Residential,Nano,Lowrise,Far,Medium,4,3,1110,16,20,1980,369 +1130,LM-151,Little Meow,Residential,Nano,Lowrise,Far,Medium,3,2,732,13,16,1009,522 +1130,LM-152,Little Meow,Residential,Nano,Lowrise,Far,Medium,3,2,699,13,16,1005,538 +1130,LM-158,Little Meow,Residential,Nano,Lowrise,Far,Medium,3,2,581,13,16,982,588 +1130,LM-168,Little Meow,Residential,Nano,Lowrise,Far,Medium,3,2,796,13,16,961,499 +1130,LM-169,Little Meow,Residential,Nano,Lowrise,Far,Medium,3,2,796,13,16,958,517 +1130,LM-170,Little Meow,Residential,Nano,Lowrise,Far,Medium,3,2,796,13,16,955,534 +1130,LM-171,Little Meow,Residential,Nano,Lowrise,Far,Medium,4,3,793,16,20,952,552 +1130,LM-172,Little Meow,Residential,Nano,Lowrise,Far,Medium,5,4,775,23,28,950,570 +1130,LM-179,Little Meow,Residential,Nano,Lowrise,Far,Medium,2,2,990,12,14,898,477 +1130,LM-180,Little Meow,Residential,Nano,Lowrise,Far,Medium,2,2,1015,12,14,889,530 +1130,LM-194,Little Meow,Residential,Nano,Lowrise,Far,Medium,4,3,876,19,23,901,395 +1130,LM-196,Little Meow,Residential,Nano,Lowrise,Far,Medium,2,2,1051,10,10,870,525 +1130,LM-212,Little Meow,Residential,Nano,Lowrise,Far,Medium,4,3,954,18,22,871,305 +1130,LM-213,Little Meow,Residential,Nano,Lowrise,Far,Medium,4,3,954,18,22,864,324 +1130,LM-214,Little Meow,Residential,Nano,Lowrise,Far,Medium,4,3,954,16,20,857,342 +1130,LM-215,Little Meow,Residential,Nano,Lowrise,Far,Medium,6,5,954,27,33,850,361 +1130,LM-216,Little Meow,Residential,Nano,Lowrise,Far,Medium,8,7,854,35,43,844,379 +1130,LM-218,Little Meow,Residential,Nano,Lowrise,Far,Medium,4,3,1053,16,20,813,514 +1130,LM-220,Little Meow,Residential,Nano,Lowrise,Far,Medium,8,6,916,34,42,806,456 +1130,LM-221,Little Meow,Residential,Nano,Lowrise,Far,Medium,4,3,945,19,23,795,512 +1130,LM-222,Little Meow,Residential,Nano,Lowrise,Far,Medium,3,3,399,15,18,788,585 +1130,LM-259,Little Meow,Residential,Nano,Lowrise,Far,Medium,4,3,406,16,20,640,398 +1155,LM-10,Little Meow,Residential,Micro,Lowrise,Far,Far,4,3,1431,16,20,2347,1345 +1155,LM-12,Little Meow,Residential,Micro,Lowrise,Far,Far,7,6,1766,31,38,2368,1382 +1155,LM-14,Little Meow,Residential,Micro,Lowrise,Far,Far,4,3,2101,16,20,2388,1418 +1155,LM-18,Little Meow,Residential,Micro,Lowrise,Far,Far,6,5,1280,28,34,2217,1441 +1155,LM-21,Little Meow,Residential,Micro,Lowrise,Far,Far,10,8,1467,42,52,2207,1432 +1155,LM-22,Little Meow,Residential,Micro,Lowrise,Far,Far,5,4,1314,22,27,2202,1396 +1155,LM-24,Little Meow,Residential,Micro,Lowrise,Far,Far,4,3,1293,16,20,2402,1341 +1155,LM-25,Little Meow,Residential,Micro,Lowrise,Far,Far,4,3,1468,16,20,2376,1341 +1155,LM-27,Little Meow,Residential,Micro,Lowrise,Far,Far,11,9,1470,47,58,2321,1343 +1155,LM-28,Little Meow,Residential,Micro,Lowrise,Far,Far,8,7,1471,36,44,2293,1345 +1155,LM-29,Little Meow,Residential,Micro,Lowrise,Far,Far,5,4,1370,21,26,2266,1348 +1155,LM-30,Little Meow,Residential,Micro,Lowrise,Far,Far,4,3,1321,16,20,2193,1359 +1155,LM-32,Little Meow,Residential,Micro,Lowrise,Far,Far,4,3,1323,16,20,2185,1322 +1155,LM-35,Little Meow,Residential,Micro,Lowrise,Far,Far,4,3,1433,16,20,2362,1282 +1155,LM-36,Little Meow,Residential,Micro,Lowrise,Far,Far,4,3,1433,16,20,2335,1282 +1155,LM-39,Little Meow,Residential,Micro,Lowrise,Far,Far,4,4,1333,20,24,2253,1288 +1155,LM-42,Little Meow,Residential,Micro,Lowrise,Far,Far,4,3,1233,16,20,2338,1203 +1155,LM-43,Little Meow,Residential,Micro,Lowrise,Far,Far,5,4,1247,21,26,2257,1207 +1155,LM-44,Little Meow,Residential,Micro,Lowrise,Far,Far,4,3,1345,19,23,2333,1185 +1155,LM-45,Little Meow,Residential,Micro,Lowrise,Far,Far,5,4,1391,24,29,2253,1189 +1155,LM-50,Little Meow,Residential,Micro,Lowrise,Far,Far,4,3,1311,16,20,2327,1165 +1155,LM-51,Little Meow,Residential,Micro,Lowrise,Far,Far,4,3,1391,16,20,2249,1170 +1155,LM-52,Little Meow,Residential,Micro,Lowrise,Far,Far,4,3,1278,16,20,2322,1146 +1155,LM-53,Little Meow,Residential,Micro,Lowrise,Far,Far,5,4,1391,21,26,2245,1151 +1155,LM-54,Little Meow,Residential,Micro,Lowrise,Far,Far,4,4,1245,20,24,2316,1127 +1155,LM-55,Little Meow,Residential,Micro,Lowrise,Far,Far,5,4,1391,22,27,2240,1132 +1155,LM-63,Little Meow,Residential,Micro,Lowrise,Far,Far,4,3,1285,16,20,2235,1114 +1155,LM-64,Little Meow,Residential,Micro,Lowrise,Far,Far,4,3,1687,16,20,2220,1059 +1155,LM-67,Little Meow,Residential,Micro,Lowrise,Far,Far,8,6,1465,34,42,2277,1029 +1155,LM-68,Little Meow,Residential,Micro,Lowrise,Far,Far,5,4,1730,21,26,2215,1034 +1155,LM-71,Little Meow,Residential,Micro,Lowrise,Far,Far,4,3,1730,16,20,2208,1009 +1155,LM-83,Little Meow,Residential,Micro,Lowrise,Far,Far,3,2,1582,14,17,1802,707 +1155,LM-85,Little Meow,Residential,Micro,Lowrise,Far,Far,3,2,1359,14,17,1837,684 +1155,LM-86,Little Meow,Residential,Micro,Lowrise,Far,Far,3,2,1524,14,17,1819,696 +1155,LM-94,Little Meow,Residential,Micro,Lowrise,Far,Far,4,3,1262,16,20,1816,605 +1155,LM-99,Little Meow,Residential,Micro,Lowrise,Far,Far,5,4,1642,23,28,1763,618 +1155,LM-197,Little Meow,Residential,Micro,Lowrise,Far,Far,3,2,1291,13,16,848,619 +1155,LM-234,Little Meow,Residential,Micro,Lowrise,Far,Far,4,4,1262,20,24,705,652 +1155,LM-235,Little Meow,Residential,Micro,Lowrise,Far,Far,4,3,1262,16,20,706,676 +1155,LM-249,Little Meow,Residential,Micro,Lowrise,Far,Far,6,5,1283,26,32,649,634 +1155,LM-250,Little Meow,Residential,Micro,Lowrise,Far,Far,6,4,1278,24,30,649,657 +1196,DZ-54,District ZERO,Commercial,Mini,Lowrise,Far,Medium,4,3,2547,16,20,2094,331 +1196,DZ-55,District ZERO,Commercial,Mini,Lowrise,Far,Medium,5,4,2487,21,26,2043,337 +1196,DZ-58,District ZERO,Commercial,Mini,Lowrise,Far,Medium,4,3,2551,16,20,2075,377 +1199,DZ-235,District ZERO,Industrial,Micro,Lowrise,Far,Medium,3,3,2151,15,18,1899,351 +1199,DZ-261,District ZERO,Industrial,Micro,Lowrise,Far,Medium,9,8,2369,40,49,2042,307 +1199,DZ-366,District ZERO,Industrial,Micro,Lowrise,Far,Medium,8,6,2197,32,40,1436,450 +1202,DZ-623,District ZERO,Commercial,Micro,Lowrise,Medium,Close,4,3,2070,16,20,512,257 +1202,DZ-632,District ZERO,Commercial,Micro,Lowrise,Medium,Close,5,4,2074,22,27,475,236 +1204,NS-201,North Star,Commercial,Mini,Lowrise,Far,Close,5,4,2438,22,27,1449,159 +1204,NS-666,North Star,Commercial,Mini,Lowrise,Far,Close,4,3,3509,16,20,2018,287 +1206,NS-202,North Star,Industrial,Micro,Lowrise,Far,Close,10,8,1369,44,54,1289,250 +1207,TG-364,Tranquility Gardens,Commercial,Mini,Lowrise,Far,Medium,4,3,3040,16,20,4183,590 +1207,TG-388,Tranquility Gardens,Commercial,Mini,Lowrise,Far,Medium,4,3,3199,16,20,4294,355 +1207,TG-438,Tranquility Gardens,Commercial,Mini,Lowrise,Far,Medium,6,5,2665,25,31,3813,464 +1207,TG-443,Tranquility Gardens,Commercial,Mini,Lowrise,Far,Medium,4,3,2886,16,20,3797,451 +1207,TG-446,Tranquility Gardens,Commercial,Mini,Lowrise,Far,Medium,4,3,3355,17,21,3949,343 +1207,TG-452,Tranquility Gardens,Commercial,Mini,Lowrise,Far,Medium,4,3,3107,16,20,3781,438 +1207,TG-457,Tranquility Gardens,Commercial,Mini,Lowrise,Far,Medium,7,6,2757,32,39,3907,342 +1207,TG-458,Tranquility Gardens,Commercial,Mini,Lowrise,Far,Medium,6,5,3328,25,31,3765,424 +1207,TG-462,Tranquility Gardens,Commercial,Mini,Lowrise,Far,Medium,4,3,3353,16,20,3750,409 +1207,TG-470,Tranquility Gardens,Commercial,Mini,Lowrise,Far,Medium,4,3,3017,16,20,3761,319 +1207,TG-524,Tranquility Gardens,Commercial,Mini,Lowrise,Far,Medium,4,3,2496,16,20,2512,538 +1207,TG-525,Tranquility Gardens,Commercial,Mini,Lowrise,Far,Medium,7,6,2495,30,37,2491,538 +1207,TG-526,Tranquility Gardens,Commercial,Mini,Lowrise,Far,Medium,4,3,2496,16,20,2470,535 +1207,TG-553,Tranquility Gardens,Commercial,Mini,Lowrise,Far,Medium,4,3,2892,16,20,3018,384 +1207,TG-554,Tranquility Gardens,Commercial,Mini,Lowrise,Far,Medium,4,3,3008,16,20,2975,410 +1207,TG-555,Tranquility Gardens,Commercial,Mini,Lowrise,Far,Medium,4,3,3014,16,20,2932,440 +1207,TG-556,Tranquility Gardens,Commercial,Mini,Lowrise,Far,Medium,4,3,3020,18,22,2889,464 +1207,TG-570,Tranquility Gardens,Commercial,Mini,Lowrise,Far,Medium,4,3,2644,16,20,2152,391 +1207,TG-571,Tranquility Gardens,Commercial,Mini,Lowrise,Far,Medium,4,3,2648,16,20,2138,394 +1207,TG-572,Tranquility Gardens,Commercial,Mini,Lowrise,Far,Medium,4,3,2648,16,20,2120,390 +1207,TG-573,Tranquility Gardens,Commercial,Mini,Lowrise,Far,Medium,4,3,2649,16,20,2102,388 +1207,TG-574,Tranquility Gardens,Commercial,Mini,Lowrise,Far,Medium,4,3,2599,17,21,2085,387 +1207,TG-575,Tranquility Gardens,Commercial,Mini,Lowrise,Far,Medium,4,3,2948,16,20,2942,363 +1207,TG-576,Tranquility Gardens,Commercial,Mini,Lowrise,Far,Medium,4,3,2948,18,22,2898,391 +1207,TG-577,Tranquility Gardens,Commercial,Mini,Lowrise,Far,Medium,4,3,2948,16,20,2855,414 +1207,TG-578,Tranquility Gardens,Commercial,Mini,Lowrise,Far,Medium,4,3,2948,16,20,2812,410 +1233,NS-247,North Star,Industrial,Nano,Lowrise,Medium,Far,8,7,919,36,44,483,741 +1233,NS-361,North Star,Industrial,Nano,Lowrise,Medium,Far,10,8,1007,44,54,540,828 +1233,NS-495,North Star,Industrial,Nano,Lowrise,Medium,Far,10,8,963,43,53,484,1037 +1233,NS-639,North Star,Industrial,Nano,Lowrise,Medium,Far,9,7,1091,38,47,517,1359 +1233,NS-742,North Star,Industrial,Nano,Lowrise,Medium,Far,10,8,1049,44,54,556,1014 +1233,NS-779,North Star,Industrial,Nano,Lowrise,Medium,Far,11,9,1049,47,58,440,993 +1239,DZ-388,District ZERO,Residential,Mini,Lowrise,Far,Close,4,3,2512,16,20,1754,197 +1240,HH-7,Haven Heights,Commercial,Mini,Lowrise,Far,Close,4,4,2420,20,24,824,254 +1240,HH-53,Haven Heights,Commercial,Mini,Lowrise,Far,Close,4,3,2435,16,20,1195,186 +1240,HH-256,Haven Heights,Commercial,Mini,Lowrise,Far,Close,4,4,2620,20,24,2199,154 +1240,HH-257,Haven Heights,Commercial,Mini,Lowrise,Far,Close,4,3,2647,16,20,2075,135 +1240,HH-262,Haven Heights,Commercial,Mini,Lowrise,Far,Close,4,3,2620,16,20,2183,149 +1240,HH-263,Haven Heights,Commercial,Mini,Lowrise,Far,Close,8,6,2728,33,41,2067,153 +1240,HH-279,Haven Heights,Commercial,Mini,Lowrise,Far,Close,6,5,2544,28,34,2059,172 +1240,HH-384,Haven Heights,Commercial,Mini,Lowrise,Far,Close,4,3,2537,16,20,1783,265 +1240,HH-468,Haven Heights,Commercial,Mini,Lowrise,Far,Close,4,3,2665,16,20,2473,205 +1240,HH-498,Haven Heights,Commercial,Mini,Lowrise,Far,Close,4,3,2737,16,20,2444,279 +1240,HH-660,Haven Heights,Commercial,Mini,Lowrise,Far,Close,4,3,3108,16,20,1593,186 +1240,HH-815,Haven Heights,Commercial,Mini,Lowrise,Far,Close,4,3,2426,16,20,1737,269 +1240,HH-817,Haven Heights,Commercial,Mini,Lowrise,Far,Close,4,3,2621,16,20,1748,249 +1240,HH-818,Haven Heights,Commercial,Mini,Lowrise,Far,Close,4,3,2835,16,20,1593,252 +1240,HH-856,Haven Heights,Commercial,Mini,Lowrise,Far,Close,4,4,2626,20,24,766,293 +1240,HH-953,Haven Heights,Commercial,Mini,Lowrise,Far,Close,3,3,2665,15,18,1167,255 +1256,HH-41,Haven Heights,Industrial,Micro,Lowrise,Far,Close,8,7,2383,35,43,1020,264 +1257,SM-544,Space Mind,Industrial,Nano,Lowrise,Far,Medium,7,6,1039,32,39,1338,320 +1258,SM-57,Space Mind,Commercial,Mini,Lowrise,Far,Far,4,4,2798,20,24,1781,721 +1258,SM-58,Space Mind,Commercial,Mini,Lowrise,Far,Far,4,3,2804,18,22,1732,767 +1258,SM-60,Space Mind,Commercial,Mini,Lowrise,Far,Far,3,3,2705,15,18,1633,859 +1258,SM-71,Space Mind,Commercial,Mini,Lowrise,Far,Far,4,3,2738,18,22,1675,836 +1258,SM-72,Space Mind,Commercial,Mini,Lowrise,Far,Far,3,3,2631,15,18,1625,878 +1258,SM-73,Space Mind,Commercial,Mini,Lowrise,Far,Far,4,3,2630,17,21,1775,745 +1258,SM-225,Space Mind,Commercial,Mini,Lowrise,Far,Far,5,4,3344,24,29,903,1023 +1258,SM-491,Space Mind,Commercial,Mini,Lowrise,Far,Far,4,3,2419,19,23,738,921 +1258,SM-516,Space Mind,Commercial,Mini,Lowrise,Far,Far,7,6,3110,30,37,671,985 +1258,SM-519,Space Mind,Commercial,Mini,Lowrise,Far,Far,4,3,3108,16,20,644,1015 +1258,SM-540,Space Mind,Commercial,Mini,Lowrise,Far,Far,4,3,3019,19,23,609,1055 +1269,SM-41,Space Mind,Industrial,Micro,Lowrise,Far,Far,7,5,1865,28,35,1791,691 +1269,SM-81,Space Mind,Industrial,Micro,Lowrise,Far,Far,9,7,2324,37,46,1679,760 +1269,SM-193,Space Mind,Industrial,Micro,Lowrise,Far,Far,8,7,1729,36,44,966,987 +1269,SM-325,Space Mind,Industrial,Micro,Lowrise,Far,Far,10,8,1403,42,52,865,972 +1269,SM-379,Space Mind,Industrial,Micro,Lowrise,Far,Far,6,5,2375,27,33,791,1051 +1274,LM-9,Little Meow,Residential,Nano,Lowrise,Far,Far,4,3,1046,17,21,2328,1309 +1274,LM-23,Little Meow,Residential,Nano,Lowrise,Far,Far,2,2,302,12,14,2179,1397 +1274,LM-31,Little Meow,Residential,Nano,Lowrise,Far,Far,4,3,466,16,20,2169,1360 +1274,LM-33,Little Meow,Residential,Nano,Lowrise,Far,Far,4,3,630,16,20,2158,1324 +1274,LM-34,Little Meow,Residential,Nano,Lowrise,Far,Far,4,3,1101,16,20,2387,1281 +1274,LM-48,Little Meow,Residential,Nano,Lowrise,Far,Far,5,4,704,21,26,2130,1198 +1274,LM-49,Little Meow,Residential,Nano,Lowrise,Far,Far,4,3,941,16,20,2114,1203 +1274,LM-56,Little Meow,Residential,Nano,Lowrise,Far,Far,4,3,609,16,20,2155,1140 +1274,LM-57,Little Meow,Residential,Nano,Lowrise,Far,Far,4,3,718,16,20,2143,1141 +1274,LM-58,Little Meow,Residential,Nano,Lowrise,Far,Far,5,4,717,23,28,2130,1141 +1274,LM-59,Little Meow,Residential,Nano,Lowrise,Far,Far,4,3,716,16,20,2117,1142 +1274,LM-60,Little Meow,Residential,Nano,Lowrise,Far,Far,7,6,714,32,39,2104,1143 +1274,LM-65,Little Meow,Residential,Nano,Lowrise,Far,Far,5,4,831,22,27,2125,1067 +1274,LM-66,Little Meow,Residential,Nano,Lowrise,Far,Far,4,3,765,16,20,2090,1069 +1274,LM-69,Little Meow,Residential,Nano,Lowrise,Far,Far,4,3,874,17,21,2120,1043 +1274,LM-72,Little Meow,Residential,Nano,Lowrise,Far,Far,4,3,874,18,22,2114,1019 +1274,LM-73,Little Meow,Residential,Nano,Lowrise,Far,Far,4,3,613,17,21,2084,1021 +1274,LM-74,Little Meow,Residential,Nano,Lowrise,Far,Far,6,5,874,28,34,2108,994 +1274,LM-76,Little Meow,Residential,Nano,Lowrise,Far,Far,6,5,1098,28,34,2257,979 +1274,LM-78,Little Meow,Residential,Nano,Lowrise,Far,Far,6,5,701,27,33,2249,957 +1274,LM-80,Little Meow,Residential,Nano,Lowrise,Far,Far,4,3,874,16,20,2102,970 +1274,LM-84,Little Meow,Residential,Nano,Lowrise,Far,Far,3,2,1195,14,17,1855,674 +1274,LM-88,Little Meow,Residential,Nano,Lowrise,Far,Far,3,3,782,15,18,1888,658 +1274,LM-89,Little Meow,Residential,Nano,Lowrise,Far,Far,3,3,1030,15,18,1872,663 +1274,LM-93,Little Meow,Residential,Nano,Lowrise,Far,Far,3,3,1118,15,18,1834,601 +1274,LM-153,Little Meow,Residential,Nano,Lowrise,Far,Far,3,2,671,12,15,911,658 +1274,LM-154,Little Meow,Residential,Nano,Lowrise,Far,Far,3,3,510,15,18,851,715 +1274,LM-160,Little Meow,Residential,Nano,Lowrise,Far,Far,3,3,649,15,18,847,711 +1274,LM-161,Little Meow,Residential,Nano,Lowrise,Far,Far,3,2,859,12,15,906,648 +1274,LM-162,Little Meow,Residential,Nano,Lowrise,Far,Far,3,3,692,15,18,843,708 +1274,LM-163,Little Meow,Residential,Nano,Lowrise,Far,Far,3,3,736,15,18,839,704 +1274,LM-173,Little Meow,Residential,Nano,Lowrise,Far,Far,3,2,857,14,17,896,638 +1274,LM-174,Little Meow,Residential,Nano,Lowrise,Far,Far,3,2,780,12,15,835,702 +1274,LM-175,Little Meow,Residential,Nano,Lowrise,Far,Far,3,2,815,14,17,888,633 +1274,LM-176,Little Meow,Residential,Nano,Lowrise,Far,Far,3,2,752,14,17,832,699 +1274,LM-223,Little Meow,Residential,Nano,Lowrise,Far,Far,3,3,354,15,18,730,700 +1274,LM-251,Little Meow,Residential,Nano,Lowrise,Far,Far,3,3,1097,15,18,652,702 +1311,NS-256,North Star,Industrial,Nano,Lowrise,Far,Close,8,7,1091,36,44,1573,292 +1311,NS-464,North Star,Industrial,Nano,Lowrise,Far,Close,9,7,1049,38,47,1749,269 +1313,DZ-73,District ZERO,Commercial,Mini,Lowrise,Far,Far,3,3,2499,15,18,1429,603 +1313,DZ-77,District ZERO,Commercial,Mini,Lowrise,Far,Far,4,3,2498,16,20,1422,622 +1313,DZ-78,District ZERO,Commercial,Mini,Lowrise,Far,Far,4,3,2496,17,21,1298,666 +1313,DZ-80,District ZERO,Commercial,Mini,Lowrise,Far,Far,7,6,2495,30,37,1413,641 +1313,DZ-81,District ZERO,Commercial,Mini,Lowrise,Far,Far,4,3,2499,16,20,1291,684 +1313,DZ-83,District ZERO,Commercial,Mini,Lowrise,Far,Far,4,3,2493,17,21,1404,659 +1313,DZ-84,District ZERO,Commercial,Mini,Lowrise,Far,Far,4,3,2501,16,20,1283,701 +1313,DZ-131,District ZERO,Commercial,Mini,Lowrise,Far,Far,8,6,3054,33,41,880,1011 +1321,TG-61,Tranquility Gardens,Industrial,Nano,Lowrise,Far,Medium,9,7,1143,39,48,2399,527 +1321,TG-311,Tranquility Gardens,Industrial,Nano,Lowrise,Far,Medium,9,7,1103,37,46,4465,476 +1323,DZ-76,District ZERO,Industrial,Micro,Lowrise,Far,Far,8,6,2286,34,42,747,1038 +1323,DZ-116,District ZERO,Industrial,Micro,Lowrise,Far,Far,8,6,1763,32,40,966,975 +1323,DZ-165,District ZERO,Industrial,Micro,Lowrise,Far,Far,11,9,2334,48,59,1227,676 +1323,DZ-166,District ZERO,Industrial,Micro,Lowrise,Far,Far,8,6,2232,32,40,925,929 +1323,DZ-167,District ZERO,Industrial,Micro,Lowrise,Far,Far,8,6,2289,32,40,870,978 +1323,DZ-168,District ZERO,Industrial,Micro,Lowrise,Far,Far,8,6,2378,32,40,781,1054 +1323,DZ-188,District ZERO,Industrial,Micro,Lowrise,Far,Far,8,6,2390,32,40,760,1130 +1323,DZ-189,District ZERO,Industrial,Micro,Lowrise,Far,Far,15,12,2393,62,77,698,1183 +1323,DZ-210,District ZERO,Industrial,Micro,Lowrise,Far,Far,8,6,2398,32,40,1486,663 +1323,DZ-216,District ZERO,Industrial,Micro,Lowrise,Far,Far,15,12,2013,60,75,662,1308 +1323,DZ-231,District ZERO,Industrial,Micro,Lowrise,Far,Far,9,7,1461,36,45,1083,1050 +1323,DZ-370,District ZERO,Industrial,Micro,Lowrise,Far,Far,8,6,2158,32,40,1053,720 +1323,DZ-438,District ZERO,Industrial,Micro,Lowrise,Far,Far,8,6,2264,32,40,641,721 +1336,TG-223,Tranquility Gardens,Commercial,Mini,Lowrise,Far,Far,4,3,2769,16,20,3698,1057 +1336,TG-228,Tranquility Gardens,Commercial,Mini,Lowrise,Far,Far,4,3,3135,16,20,3706,1079 +1336,TG-232,Tranquility Gardens,Commercial,Mini,Lowrise,Far,Far,4,3,3135,18,22,3712,1101 +1336,TG-242,Tranquility Gardens,Commercial,Mini,Lowrise,Far,Far,6,5,2855,27,33,3722,1145 +1336,TG-243,Tranquility Gardens,Commercial,Mini,Lowrise,Far,Far,5,4,2606,23,28,3590,1137 +1336,TG-342,Tranquility Gardens,Commercial,Mini,Lowrise,Far,Far,4,3,2484,16,20,4243,638 +1336,TG-361,Tranquility Gardens,Commercial,Mini,Lowrise,Far,Far,4,3,3252,16,20,4140,630 +1336,TG-365,Tranquility Gardens,Commercial,Mini,Lowrise,Far,Far,4,3,3253,16,20,4160,606 +1336,TG-366,Tranquility Gardens,Commercial,Mini,Lowrise,Far,Far,4,3,3449,16,20,3896,759 +1336,TG-368,Tranquility Gardens,Commercial,Mini,Lowrise,Far,Far,4,4,2641,20,24,4105,623 +1336,TG-448,Tranquility Gardens,Commercial,Mini,Lowrise,Far,Far,5,4,2480,20,25,3268,754 +1336,TG-449,Tranquility Gardens,Commercial,Mini,Lowrise,Far,Far,4,3,2478,16,20,3248,769 +1336,TG-450,Tranquility Gardens,Commercial,Mini,Lowrise,Far,Far,6,5,2476,25,31,3229,780 +1336,TG-465,Tranquility Gardens,Commercial,Mini,Lowrise,Far,Far,5,4,2535,22,27,2981,801 +1336,TG-468,Tranquility Gardens,Commercial,Mini,Lowrise,Far,Far,5,4,3187,24,29,2953,769 +1336,TG-479,Tranquility Gardens,Commercial,Mini,Lowrise,Far,Far,4,3,2803,16,20,2924,733 +1336,TG-480,Tranquility Gardens,Commercial,Mini,Lowrise,Far,Far,4,3,3285,16,20,2851,734 +1336,TG-485,Tranquility Gardens,Commercial,Mini,Lowrise,Far,Far,6,5,2419,26,32,2896,698 +1354,TG-259,Tranquility Gardens,Industrial,Micro,Lowrise,Far,Far,8,6,2139,33,41,3313,1358 +1354,TG-516,Tranquility Gardens,Industrial,Micro,Lowrise,Far,Far,8,6,1888,32,40,2952,611 +1356,HH-897,Haven Heights,Residential,Mini,Lowrise,Medium,Far,4,3,2690,17,21,452,630 +1357,DZ-618,District ZERO,Commercial,Micro,Lowrise,Medium,Medium,4,3,1954,17,21,492,533 +1357,DZ-627,District ZERO,Commercial,Micro,Lowrise,Medium,Medium,5,4,1644,20,25,423,517 +1357,DZ-635,District ZERO,Commercial,Micro,Lowrise,Medium,Medium,10,8,1574,42,52,341,490 +1360,NS-353,North Star,Commercial,Mini,Lowrise,Far,Medium,4,3,2616,17,21,1130,564 +1360,NS-672,North Star,Commercial,Mini,Lowrise,Far,Medium,4,3,3511,17,21,2020,324 +1360,NS-683,North Star,Commercial,Mini,Lowrise,Far,Medium,3,2,2714,12,15,2013,368 +1360,NS-691,North Star,Commercial,Mini,Lowrise,Far,Medium,2,2,2644,10,12,2074,382 +1360,NS-692,North Star,Commercial,Mini,Lowrise,Far,Medium,3,2,2641,12,15,2015,407 +1365,NS-86,North Star,Industrial,Micro,Lowrise,Far,Medium,11,9,1722,46,57,652,343 +1365,NS-392,North Star,Industrial,Micro,Lowrise,Far,Medium,3,2,2336,12,15,1217,560 +1365,NS-776,North Star,Industrial,Micro,Lowrise,Far,Medium,9,8,2012,40,49,1040,579 +1368,NS-6,North Star,Commercial,Micro,Lowrise,Medium,Close,3,3,2203,15,18,427,122 +1368,NS-12,North Star,Commercial,Micro,Lowrise,Medium,Close,3,3,2203,15,18,439,144 +1368,NS-17,North Star,Commercial,Micro,Lowrise,Medium,Close,3,3,2203,15,18,451,166 +1368,NS-21,North Star,Commercial,Micro,Lowrise,Medium,Close,6,5,1634,28,34,538,154 +1368,NS-36,North Star,Commercial,Micro,Lowrise,Medium,Close,4,3,2036,18,22,584,210 +1368,NS-37,North Star,Commercial,Micro,Lowrise,Medium,Close,5,4,2039,20,25,555,240 +1368,NS-38,North Star,Commercial,Micro,Lowrise,Medium,Close,4,3,2042,17,21,528,272 +1375,DZ-59,District ZERO,Residential,Mini,Lowrise,Far,Medium,4,3,2484,19,23,2018,387 +1376,HH-297,Haven Heights,Commercial,Mini,Lowrise,Far,Medium,4,3,2559,18,22,1671,367 +1376,HH-298,Haven Heights,Commercial,Mini,Lowrise,Far,Medium,4,3,2538,16,20,1626,396 +1376,HH-340,Haven Heights,Commercial,Mini,Lowrise,Far,Medium,4,3,2518,18,22,1741,334 +1376,HH-341,Haven Heights,Commercial,Mini,Lowrise,Far,Medium,4,3,2518,16,20,1703,361 +1376,HH-342,Haven Heights,Commercial,Mini,Lowrise,Far,Medium,4,3,2475,17,21,1666,392 +1376,HH-709,Haven Heights,Commercial,Mini,Lowrise,Far,Medium,4,3,3125,16,20,1633,318 +1376,HH-712,Haven Heights,Commercial,Mini,Lowrise,Far,Medium,6,5,3122,28,34,1638,337 +1376,HH-713,Haven Heights,Commercial,Mini,Lowrise,Far,Medium,4,3,2533,16,20,1159,502 +1376,HH-720,Haven Heights,Commercial,Mini,Lowrise,Far,Medium,4,3,2461,18,22,1153,517 +1376,HH-723,Haven Heights,Commercial,Mini,Lowrise,Far,Medium,4,3,2701,18,22,1797,382 +1376,HH-724,Haven Heights,Commercial,Mini,Lowrise,Far,Medium,4,3,2473,16,20,1651,378 +1376,HH-728,Haven Heights,Commercial,Mini,Lowrise,Far,Medium,4,3,2442,16,20,1789,382 +1376,HH-750,Haven Heights,Commercial,Mini,Lowrise,Far,Medium,4,3,2505,16,20,1340,528 +1376,HH-751,Haven Heights,Commercial,Mini,Lowrise,Far,Medium,4,3,2505,16,20,1291,546 +1376,HH-752,Haven Heights,Commercial,Mini,Lowrise,Far,Medium,4,3,2468,18,22,1242,567 +1376,HH-759,Haven Heights,Commercial,Mini,Lowrise,Far,Medium,7,6,2522,30,37,1442,551 +1376,HH-765,Haven Heights,Commercial,Mini,Lowrise,Far,Medium,4,3,2522,16,20,1388,568 +1376,HH-766,Haven Heights,Commercial,Mini,Lowrise,Far,Medium,4,3,2495,16,20,1240,580 +1376,HH-774,Haven Heights,Commercial,Mini,Lowrise,Far,Medium,3,3,2836,15,18,1441,524 +1376,HH-775,Haven Heights,Commercial,Mini,Lowrise,Far,Medium,3,3,2891,15,18,1441,504 +1376,HH-783,Haven Heights,Commercial,Mini,Lowrise,Far,Medium,3,3,2893,15,18,1440,484 +1376,HH-784,Haven Heights,Commercial,Mini,Lowrise,Far,Medium,4,3,3047,16,20,936,561 +1376,HH-787,Haven Heights,Commercial,Mini,Lowrise,Far,Medium,4,3,2500,17,21,1153,460 +1376,HH-788,Haven Heights,Commercial,Mini,Lowrise,Far,Medium,4,3,2491,16,20,1096,473 +1376,HH-796,Haven Heights,Commercial,Mini,Lowrise,Far,Medium,4,3,2959,16,20,991,486 +1376,HH-797,Haven Heights,Commercial,Mini,Lowrise,Far,Medium,3,3,2647,15,18,1439,425 +1376,HH-799,Haven Heights,Commercial,Mini,Lowrise,Far,Medium,4,3,3040,16,20,1595,348 +1376,HH-803,Haven Heights,Commercial,Mini,Lowrise,Far,Medium,6,4,3099,24,30,1595,328 +1376,HH-810,Haven Heights,Commercial,Mini,Lowrise,Far,Medium,4,3,2439,16,20,1170,324 +1376,HH-811,Haven Heights,Commercial,Mini,Lowrise,Far,Medium,4,3,2502,16,20,1132,333 +1376,HH-855,Haven Heights,Commercial,Mini,Lowrise,Far,Medium,4,4,3118,20,24,728,333 +1376,HH-876,Haven Heights,Commercial,Mini,Lowrise,Far,Medium,4,3,3495,16,20,752,303 +1376,HH-925,Haven Heights,Commercial,Mini,Lowrise,Far,Medium,4,3,2944,16,20,607,549 +1409,HH-56,Haven Heights,Industrial,Micro,Lowrise,Far,Medium,4,3,2326,18,22,1014,305 +1410,DZ-629,District ZERO,Residential,Micro,Lowrise,Medium,Close,4,3,1757,16,20,530,157 +1410,DZ-630,District ZERO,Residential,Micro,Lowrise,Medium,Close,4,3,2072,16,20,493,246 +1410,DZ-638,District ZERO,Residential,Micro,Lowrise,Medium,Close,4,3,1669,16,20,403,125 +1410,DZ-639,District ZERO,Residential,Micro,Lowrise,Medium,Close,4,3,1673,17,21,367,208 +1410,DZ-640,District ZERO,Residential,Micro,Lowrise,Medium,Close,4,3,1638,19,23,359,235 +1410,DZ-644,District ZERO,Residential,Micro,Lowrise,Medium,Close,4,3,1326,18,22,351,113 +1410,DZ-645,District ZERO,Residential,Micro,Lowrise,Medium,Close,4,3,1668,16,20,337,139 +1410,DZ-646,District ZERO,Residential,Micro,Lowrise,Medium,Close,4,3,1660,18,22,323,168 +1410,DZ-647,District ZERO,Residential,Micro,Lowrise,Medium,Close,5,4,1623,23,28,302,222 +1419,HH-631,Haven Heights,Residential,Mini,Lowrise,Far,Close,4,3,2456,18,22,1523,114 +1419,HH-676,Haven Heights,Residential,Mini,Lowrise,Far,Close,3,3,2486,16,19,1605,205 +1419,HH-830,Haven Heights,Residential,Mini,Lowrise,Far,Close,3,3,2426,15,18,716,278 +1422,SM-141,Space Mind,Commercial,Micro,Lowrise,Medium,Far,4,3,1633,18,22,398,1652 +1422,SM-172,Space Mind,Commercial,Micro,Lowrise,Medium,Far,7,6,1293,30,37,339,1661 +1422,SM-183,Space Mind,Commercial,Micro,Lowrise,Medium,Far,6,5,1215,26,32,396,1581 +1422,SM-186,Space Mind,Commercial,Micro,Lowrise,Medium,Far,4,3,1315,16,20,326,1650 +1422,SM-197,Space Mind,Commercial,Micro,Lowrise,Medium,Far,4,3,1357,17,21,361,1589 +1422,SM-215,Space Mind,Commercial,Micro,Lowrise,Medium,Far,4,3,1350,16,20,307,1629 +1422,SM-295,Space Mind,Commercial,Micro,Lowrise,Medium,Far,4,3,1743,17,21,430,1479 +1422,SM-314,Space Mind,Commercial,Micro,Lowrise,Medium,Far,6,4,1622,24,30,458,1433 +1422,SM-315,Space Mind,Commercial,Micro,Lowrise,Medium,Far,4,3,1646,18,22,372,1537 +1422,SM-326,Space Mind,Commercial,Micro,Lowrise,Medium,Far,4,3,1631,19,23,444,1443 +1422,SM-347,Space Mind,Commercial,Micro,Lowrise,Medium,Far,5,4,1350,20,25,342,1542 +1422,SM-515,Space Mind,Commercial,Micro,Lowrise,Medium,Far,7,6,1255,31,38,348,1544 +1422,SM-560,Space Mind,Commercial,Micro,Lowrise,Medium,Far,4,4,1265,20,24,544,1122 +1422,SM-566,Space Mind,Commercial,Micro,Lowrise,Medium,Far,4,4,1528,20,24,444,1223 +1422,SM-568,Space Mind,Commercial,Micro,Lowrise,Medium,Far,4,3,1432,17,21,372,1285 +1422,SM-570,Space Mind,Commercial,Micro,Lowrise,Medium,Far,5,4,1499,22,27,469,1204 +1438,DZ-600,District ZERO,Commercial,Nano,Lowrise,Medium,Medium,4,3,877,17,21,567,477 +1438,DZ-614,District ZERO,Commercial,Nano,Lowrise,Medium,Medium,4,3,954,16,20,593,408 +1438,DZ-622,District ZERO,Commercial,Nano,Lowrise,Medium,Medium,4,3,854,16,20,516,417 +1438,DZ-633,District ZERO,Commercial,Nano,Lowrise,Medium,Medium,4,4,979,20,24,438,334 +1438,DZ-636,District ZERO,Commercial,Nano,Lowrise,Medium,Medium,5,4,932,21,26,420,327 +1438,DZ-637,District ZERO,Commercial,Nano,Lowrise,Medium,Medium,4,3,879,17,21,422,384 +1444,NS-276,North Star,Industrial,Nano,Lowrise,Far,Medium,11,9,1091,47,58,1747,368 +1444,NS-289,North Star,Industrial,Nano,Lowrise,Far,Medium,11,9,1066,46,57,1383,338 +1444,NS-416,North Star,Industrial,Nano,Lowrise,Far,Medium,9,7,919,37,46,1692,323 +1447,NS-7,North Star,Commercial,Nano,Lowrise,Medium,Close,5,4,1110,22,27,326,145 +1447,NS-28,North Star,Commercial,Nano,Lowrise,Medium,Close,4,3,1062,16,20,391,231 +1449,DZ-21,District ZERO,Commercial,Micro,Lowrise,Medium,Far,7,6,1485,30,37,555,923 +1449,DZ-206,District ZERO,Commercial,Micro,Lowrise,Medium,Far,4,3,2137,16,20,536,1367 +1449,DZ-356,District ZERO,Commercial,Micro,Lowrise,Medium,Far,3,3,1226,15,18,436,1224 +1449,DZ-436,District ZERO,Commercial,Micro,Lowrise,Medium,Far,4,3,2177,16,20,401,955 +1449,DZ-445,District ZERO,Commercial,Micro,Lowrise,Medium,Far,4,3,1665,16,20,556,749 +1449,DZ-465,District ZERO,Commercial,Micro,Lowrise,Medium,Far,4,4,1525,20,24,312,928 +1449,DZ-604,District ZERO,Commercial,Micro,Lowrise,Medium,Far,6,4,2115,24,30,346,693 +1456,NS-522,North Star,Commercial,Mini,Lowrise,Far,Far,4,3,2622,18,22,1366,667 +1456,NS-523,North Star,Commercial,Mini,Lowrise,Far,Far,4,4,2621,20,24,1321,711 +1456,NS-524,North Star,Commercial,Mini,Lowrise,Far,Far,4,4,2571,20,24,1231,780 +1456,NS-547,North Star,Commercial,Mini,Lowrise,Far,Far,5,4,2540,24,29,1233,810 +1456,NS-550,North Star,Commercial,Mini,Lowrise,Far,Far,5,4,2587,24,29,1371,675 +1456,NS-551,North Star,Commercial,Mini,Lowrise,Far,Far,4,3,2597,17,21,1323,722 +1456,NS-552,North Star,Commercial,Mini,Lowrise,Far,Far,6,5,2581,28,34,1278,766 +1463,NS-486,North Star,Industrial,Micro,Lowrise,Far,Far,9,8,1226,40,49,1068,772 +1463,NS-609,North Star,Industrial,Micro,Lowrise,Far,Far,8,7,1581,35,43,1231,856 +1463,NS-632,North Star,Industrial,Micro,Lowrise,Far,Far,8,7,1251,35,43,1254,876 +1463,NS-720,North Star,Industrial,Micro,Lowrise,Far,Far,11,9,2278,48,59,728,953 +1463,NS-807,North Star,Industrial,Micro,Lowrise,Far,Far,15,12,2345,60,75,747,734 +1468,HH-521,Haven Heights,Commercial,Mini,Lowrise,Far,Far,4,3,3592,16,20,700,1371 +1468,HH-577,Haven Heights,Commercial,Mini,Lowrise,Far,Far,8,6,2612,33,41,818,963 +1468,HH-711,Haven Heights,Commercial,Mini,Lowrise,Far,Far,4,3,2478,16,20,846,754 +1468,HH-717,Haven Heights,Commercial,Mini,Lowrise,Far,Far,6,5,2575,25,31,841,764 +1468,HH-721,Haven Heights,Commercial,Mini,Lowrise,Far,Far,4,3,2577,18,22,836,774 +1468,HH-726,Haven Heights,Commercial,Mini,Lowrise,Far,Far,6,4,2579,24,30,832,784 +1468,HH-740,Haven Heights,Commercial,Mini,Lowrise,Far,Far,4,3,2479,16,20,825,805 +1468,HH-746,Haven Heights,Commercial,Mini,Lowrise,Far,Far,4,3,3003,16,20,945,707 +1468,HH-772,Haven Heights,Commercial,Mini,Lowrise,Far,Far,4,3,3051,16,20,942,610 +1477,SM-335,Space Mind,Commercial,Micro,Lowrise,Far,Close,4,4,1901,20,24,1875,254 +1477,SM-339,Space Mind,Commercial,Micro,Lowrise,Far,Close,4,3,1303,17,21,1967,238 +1477,SM-348,Space Mind,Commercial,Micro,Lowrise,Far,Close,4,4,1794,20,24,1901,270 +1477,SM-527,Space Mind,Commercial,Micro,Lowrise,Far,Close,4,3,1817,16,20,1572,180 +1477,SM-543,Space Mind,Commercial,Micro,Lowrise,Far,Close,5,4,2112,24,29,1567,157 +1477,SM-550,Space Mind,Commercial,Micro,Lowrise,Far,Close,4,3,1476,16,20,1545,148 +1483,SM-169,Space Mind,Commercial,Nano,Lowrise,Medium,Far,4,3,1186,16,20,407,1592 +1483,SM-222,Space Mind,Commercial,Nano,Lowrise,Medium,Far,4,3,1090,17,21,359,1571 +1483,SM-268,Space Mind,Commercial,Nano,Lowrise,Medium,Far,4,3,807,18,22,360,1558 +1483,SM-352,Space Mind,Commercial,Nano,Lowrise,Medium,Far,4,3,717,16,20,387,1486 +1483,SM-492,Space Mind,Commercial,Nano,Lowrise,Medium,Far,6,5,883,27,33,532,1281 +1483,SM-525,Space Mind,Commercial,Nano,Lowrise,Medium,Far,6,5,1142,27,33,444,1240 +1483,SM-537,Space Mind,Commercial,Nano,Lowrise,Medium,Far,5,4,921,20,25,325,1603 +1483,SM-541,Space Mind,Commercial,Nano,Lowrise,Medium,Far,4,3,819,16,20,367,1580 +1483,SM-553,Space Mind,Commercial,Nano,Lowrise,Medium,Far,9,7,1052,38,47,497,1159 +1483,SM-556,Space Mind,Commercial,Nano,Lowrise,Medium,Far,4,3,1079,16,20,455,1201 +1483,SM-561,Space Mind,Commercial,Nano,Lowrise,Medium,Far,8,6,839,33,41,371,1295 +1483,SM-562,Space Mind,Commercial,Nano,Lowrise,Medium,Far,5,4,943,21,26,346,1617 +1495,DZ-37,District ZERO,Commercial,Micro,Lowrise,Far,Close,4,3,2396,16,20,2143,196 +1495,DZ-38,District ZERO,Commercial,Micro,Lowrise,Far,Close,4,3,2288,16,20,2089,204 +1495,DZ-362,District ZERO,Commercial,Micro,Lowrise,Far,Close,4,3,2372,16,20,1805,231 +1495,DZ-363,District ZERO,Commercial,Micro,Lowrise,Far,Close,4,3,2396,16,20,1746,265 +1495,DZ-422,District ZERO,Commercial,Micro,Lowrise,Far,Close,4,3,1290,16,20,1497,206 +1495,DZ-424,District ZERO,Commercial,Micro,Lowrise,Far,Close,4,3,1248,16,20,1388,290 +1495,DZ-507,District ZERO,Commercial,Micro,Lowrise,Far,Close,6,5,1483,25,31,1029,205 +1495,DZ-516,District ZERO,Commercial,Micro,Lowrise,Far,Close,4,3,1483,16,20,1033,198 +1495,DZ-579,District ZERO,Commercial,Micro,Lowrise,Far,Close,7,6,1595,31,38,788,180 +1504,DZ-284,District ZERO,Commercial,Nano,Lowrise,Medium,Far,3,3,907,15,18,413,1370 +1504,DZ-312,District ZERO,Commercial,Nano,Lowrise,Medium,Far,3,3,970,15,18,428,1309 +1504,DZ-313,District ZERO,Commercial,Nano,Lowrise,Medium,Far,4,3,935,16,20,366,1358 +1504,DZ-459,District ZERO,Commercial,Nano,Lowrise,Medium,Far,4,3,1091,16,20,550,722 +1504,DZ-475,District ZERO,Commercial,Nano,Lowrise,Medium,Far,4,3,1075,16,20,521,728 +1504,DZ-497,District ZERO,Commercial,Nano,Lowrise,Medium,Far,4,3,1082,17,21,593,626 +1504,DZ-520,District ZERO,Commercial,Nano,Lowrise,Medium,Far,9,8,1024,40,49,575,610 +1504,DZ-536,District ZERO,Commercial,Nano,Lowrise,Medium,Far,4,3,709,16,20,355,769 +1504,DZ-544,District ZERO,Commercial,Nano,Lowrise,Medium,Far,4,3,792,16,20,357,763 +1504,DZ-547,District ZERO,Commercial,Nano,Lowrise,Medium,Far,6,5,695,28,34,314,796 +1504,DZ-549,District ZERO,Commercial,Nano,Lowrise,Medium,Far,4,3,954,17,21,494,617 +1504,DZ-552,District ZERO,Commercial,Nano,Lowrise,Medium,Far,4,3,717,18,22,312,792 +1504,DZ-562,District ZERO,Commercial,Nano,Lowrise,Medium,Far,4,3,709,16,20,312,785 +1504,DZ-564,District ZERO,Commercial,Nano,Lowrise,Medium,Far,5,4,806,22,27,353,734 +1504,DZ-569,District ZERO,Commercial,Nano,Lowrise,Medium,Far,8,7,1091,36,44,475,612 +1504,DZ-576,District ZERO,Commercial,Nano,Lowrise,Medium,Far,4,3,832,18,22,358,724 +1504,DZ-584,District ZERO,Commercial,Nano,Lowrise,Medium,Far,8,6,1079,32,40,462,616 +1504,DZ-587,District ZERO,Commercial,Nano,Lowrise,Medium,Far,5,4,710,23,28,317,748 +1522,TG-75,Tranquility Gardens,Commercial,Micro,Lowrise,Far,Close,6,5,1664,27,33,4800,120 +1522,TG-76,Tranquility Gardens,Commercial,Micro,Lowrise,Far,Close,5,4,1735,21,26,4724,168 +1522,TG-81,Tranquility Gardens,Commercial,Micro,Lowrise,Far,Close,4,3,1737,19,23,4725,183 +1522,TG-105,Tranquility Gardens,Commercial,Micro,Lowrise,Far,Close,4,4,1378,20,24,4811,271 +1522,TG-121,Tranquility Gardens,Commercial,Micro,Lowrise,Far,Close,4,3,1348,19,23,4793,240 +1522,TG-155,Tranquility Gardens,Commercial,Micro,Lowrise,Far,Close,6,5,2131,26,32,4639,247 +1522,TG-159,Tranquility Gardens,Commercial,Micro,Lowrise,Far,Close,7,5,1432,28,35,4737,154 +1522,TG-160,Tranquility Gardens,Commercial,Micro,Lowrise,Far,Close,4,3,2131,16,20,4642,239 +1522,TG-171,Tranquility Gardens,Commercial,Micro,Lowrise,Far,Close,4,3,1979,16,20,4645,232 +1522,TG-255,Tranquility Gardens,Commercial,Micro,Lowrise,Far,Close,5,4,1875,22,27,4858,119 +1522,TG-262,Tranquility Gardens,Commercial,Micro,Lowrise,Far,Close,6,5,1873,26,32,4634,288 +1522,TG-611,Tranquility Gardens,Commercial,Micro,Lowrise,Far,Close,4,4,2150,20,24,2695,270 +1522,TG-616,Tranquility Gardens,Commercial,Micro,Lowrise,Far,Close,4,3,2031,16,20,2689,257 +1522,TG-627,Tranquility Gardens,Commercial,Micro,Lowrise,Far,Close,7,6,1229,31,38,1985,218 +1522,TG-652,Tranquility Gardens,Commercial,Micro,Lowrise,Far,Close,4,3,1920,16,20,2294,109 +1537,NS-469,North Star,Industrial,Nano,Lowrise,Far,Far,9,8,1021,40,49,1297,654 +1538,DZ-601,District ZERO,Residential,Micro,Lowrise,Medium,Medium,4,3,1993,16,20,496,545 +1538,DZ-626,District ZERO,Residential,Micro,Lowrise,Medium,Medium,5,4,1537,21,26,449,489 +1538,DZ-628,District ZERO,Residential,Micro,Lowrise,Medium,Medium,4,3,1644,16,20,372,542 +1541,HH-825,Haven Heights,Commercial,Micro,Lowrise,Medium,Medium,4,3,2270,16,20,570,435 +1541,HH-852,Haven Heights,Commercial,Micro,Lowrise,Medium,Medium,5,4,2027,22,27,517,550 +1543,SM-414,Space Mind,Commercial,Nano,Lowrise,Far,Close,4,3,811,17,21,1919,296 +1543,SM-449,Space Mind,Commercial,Nano,Lowrise,Far,Close,5,4,784,20,25,1860,288 +1543,SM-473,Space Mind,Commercial,Nano,Lowrise,Far,Close,4,3,952,16,20,1800,281 +1546,NS-16,North Star,Residential,Micro,Lowrise,Medium,Close,9,7,1239,36,45,519,155 +1546,NS-22,North Star,Residential,Micro,Lowrise,Medium,Close,3,3,2203,15,18,464,188 +1546,NS-26,North Star,Residential,Micro,Lowrise,Medium,Close,9,7,1885,37,46,557,155 +1546,NS-27,North Star,Residential,Micro,Lowrise,Medium,Close,3,3,2063,15,18,477,209 +1546,NS-30,North Star,Residential,Micro,Lowrise,Medium,Close,4,3,1325,18,22,316,284 +1546,NS-31,North Star,Residential,Micro,Lowrise,Medium,Close,4,3,1304,16,20,301,297 +1546,NS-39,North Star,Residential,Micro,Lowrise,Medium,Close,7,6,1937,31,38,503,283 +1546,NS-53,North Star,Residential,Micro,Lowrise,Medium,Close,4,3,2019,16,20,599,273 +1554,HH-744,Haven Heights,Residential,Mini,Lowrise,Far,Medium,4,3,2465,16,20,1393,507 +1554,HH-826,Haven Heights,Residential,Mini,Lowrise,Far,Medium,3,3,2934,15,18,677,348 +1556,DZ-396,District ZERO,Commercial,Nano,Lowrise,Far,Close,4,3,1135,18,22,1519,291 +1556,DZ-431,District ZERO,Commercial,Nano,Lowrise,Far,Close,6,5,760,27,33,1546,140 +1556,DZ-517,District ZERO,Commercial,Nano,Lowrise,Far,Close,4,3,1024,16,20,922,294 +1556,DZ-590,District ZERO,Commercial,Nano,Lowrise,Far,Close,4,3,856,17,21,717,129 +1556,DZ-594,District ZERO,Commercial,Nano,Lowrise,Far,Close,6,5,1018,25,31,664,300 +1556,DZ-609,District ZERO,Commercial,Nano,Lowrise,Far,Close,4,3,981,18,22,644,161 +1562,TG-11,Tranquility Gardens,Commercial,Nano,Lowrise,Far,Close,4,3,1092,16,20,4374,106 +1562,TG-32,Tranquility Gardens,Commercial,Nano,Lowrise,Far,Close,4,3,755,17,21,4418,218 +1562,TG-73,Tranquility Gardens,Commercial,Nano,Lowrise,Far,Close,4,4,930,20,24,4622,246 +1562,TG-266,Tranquility Gardens,Commercial,Nano,Lowrise,Far,Close,4,3,1137,16,20,4692,281 +1562,TG-276,Tranquility Gardens,Commercial,Nano,Lowrise,Far,Close,4,3,1138,16,20,4680,292 +1562,TG-288,Tranquility Gardens,Commercial,Nano,Lowrise,Far,Close,4,3,1082,16,20,4693,273 +1562,TG-590,Tranquility Gardens,Commercial,Nano,Lowrise,Far,Close,4,3,571,17,21,2217,291 +1562,TG-620,Tranquility Gardens,Commercial,Nano,Lowrise,Far,Close,4,3,984,16,20,2313,228 +1562,TG-622,Tranquility Gardens,Commercial,Nano,Lowrise,Far,Close,4,4,1006,20,24,2270,223 +1562,TG-625,Tranquility Gardens,Commercial,Nano,Lowrise,Far,Close,4,3,871,16,20,2157,215 +1562,TG-630,Tranquility Gardens,Commercial,Nano,Lowrise,Far,Close,6,5,1193,25,31,1941,213 +1562,TG-636,Tranquility Gardens,Commercial,Nano,Lowrise,Far,Close,5,4,670,22,27,2255,160 +1562,TG-639,Tranquility Gardens,Commercial,Nano,Lowrise,Far,Close,6,5,614,26,32,2106,148 +1562,TG-643,Tranquility Gardens,Commercial,Nano,Lowrise,Far,Close,4,3,644,16,20,2098,136 +1562,TG-645,Tranquility Gardens,Commercial,Nano,Lowrise,Far,Close,4,3,714,16,20,2194,133 +1562,TG-649,Tranquility Gardens,Commercial,Nano,Lowrise,Far,Close,6,4,713,24,30,2230,123 +1562,TG-654,Tranquility Gardens,Commercial,Nano,Lowrise,Far,Close,4,3,660,16,20,2110,107 +1562,TG-655,Tranquility Gardens,Commercial,Nano,Lowrise,Far,Close,6,5,596,28,34,2214,100 +1562,TG-656,Tranquility Gardens,Commercial,Nano,Lowrise,Far,Close,4,3,602,17,21,2169,96 +1581,SM-151,Space Mind,Residential,Micro,Lowrise,Medium,Far,5,4,1420,22,27,448,1601 +1581,SM-152,Space Mind,Residential,Micro,Lowrise,Medium,Far,4,3,1420,16,20,423,1626 +1581,SM-170,Space Mind,Residential,Micro,Lowrise,Medium,Far,4,3,1293,16,20,385,1614 +1581,SM-171,Space Mind,Residential,Micro,Lowrise,Medium,Far,5,4,1293,23,28,362,1638 +1581,SM-173,Space Mind,Residential,Micro,Lowrise,Medium,Far,4,3,1293,16,20,316,1685 +1581,SM-184,Space Mind,Residential,Micro,Lowrise,Medium,Far,5,4,1321,23,28,374,1603 +1581,SM-185,Space Mind,Residential,Micro,Lowrise,Medium,Far,4,4,1318,20,24,350,1627 +1581,SM-187,Space Mind,Residential,Micro,Lowrise,Medium,Far,4,3,1312,17,21,303,1674 +1581,SM-196,Space Mind,Residential,Micro,Lowrise,Medium,Far,4,3,1242,19,23,384,1566 +1581,SM-198,Space Mind,Residential,Micro,Lowrise,Medium,Far,4,3,1357,17,21,338,1612 +1581,SM-199,Space Mind,Residential,Micro,Lowrise,Medium,Far,4,4,1357,20,24,314,1636 +1581,SM-212,Space Mind,Residential,Micro,Lowrise,Medium,Far,4,3,1241,18,22,377,1560 +1581,SM-213,Space Mind,Residential,Micro,Lowrise,Medium,Far,4,3,1353,19,23,355,1582 +1581,SM-214,Space Mind,Residential,Micro,Lowrise,Medium,Far,6,5,1351,26,32,331,1606 +1581,SM-280,Space Mind,Residential,Micro,Lowrise,Medium,Far,5,4,1714,20,25,448,1469 +1581,SM-286,Space Mind,Residential,Micro,Lowrise,Medium,Far,4,4,1743,20,24,441,1472 +1581,SM-287,Space Mind,Residential,Micro,Lowrise,Medium,Far,8,7,1315,35,43,515,1394 +1581,SM-288,Space Mind,Residential,Micro,Lowrise,Medium,Far,4,3,1743,18,22,435,1475 +1581,SM-294,Space Mind,Residential,Micro,Lowrise,Medium,Far,5,4,1440,22,27,513,1394 +1581,SM-302,Space Mind,Residential,Micro,Lowrise,Medium,Far,5,4,1565,21,26,513,1395 +1581,SM-303,Space Mind,Residential,Micro,Lowrise,Medium,Far,7,5,1743,29,36,425,1482 +1581,SM-306,Space Mind,Residential,Micro,Lowrise,Medium,Far,5,4,1506,21,26,511,1396 +1581,SM-307,Space Mind,Residential,Micro,Lowrise,Medium,Far,4,3,1559,19,23,422,1486 +1581,SM-327,Space Mind,Residential,Micro,Lowrise,Medium,Far,4,3,1733,16,20,364,1538 +1581,SM-332,Space Mind,Residential,Micro,Lowrise,Medium,Far,4,3,1423,19,23,430,1454 +1581,SM-333,Space Mind,Residential,Micro,Lowrise,Medium,Far,8,7,1605,36,44,356,1539 +1581,SM-337,Space Mind,Residential,Micro,Lowrise,Medium,Far,4,3,1214,17,21,415,1465 +1581,SM-338,Space Mind,Residential,Micro,Lowrise,Medium,Far,6,5,1478,27,33,348,1540 +1581,SM-471,Space Mind,Residential,Micro,Lowrise,Medium,Far,7,6,1298,30,37,599,1275 +1581,SM-567,Space Mind,Residential,Micro,Lowrise,Medium,Far,5,4,1533,22,27,395,1265 +1581,SM-580,Space Mind,Residential,Micro,Lowrise,Medium,Far,5,4,1604,21,26,416,1264 +1581,SM-581,Space Mind,Residential,Micro,Lowrise,Medium,Far,4,3,1491,18,22,389,1287 +1581,SM-582,Space Mind,Residential,Micro,Lowrise,Medium,Far,7,6,1491,31,38,363,1307 +1581,SM-583,Space Mind,Residential,Micro,Lowrise,Medium,Far,5,4,1391,22,27,338,1327 +1581,SM-604,Space Mind,Residential,Micro,Lowrise,Medium,Far,15,12,1832,62,77,549,911 +1581,SM-619,Space Mind,Residential,Micro,Lowrise,Medium,Far,4,3,1451,16,20,379,1073 +1617,NS-45,North Star,Commercial,Nano,Lowrise,Medium,Medium,4,3,1172,17,21,360,355 +1617,NS-64,North Star,Commercial,Nano,Lowrise,Medium,Medium,3,3,989,15,18,502,428 +1617,NS-65,North Star,Commercial,Nano,Lowrise,Medium,Medium,5,4,989,22,27,449,442 +1617,NS-78,North Star,Commercial,Nano,Lowrise,Medium,Medium,3,2,1022,12,15,453,480 +1617,NS-82,North Star,Commercial,Nano,Lowrise,Medium,Medium,3,2,1022,12,15,456,499 +1617,NS-114,North Star,Commercial,Nano,Lowrise,Medium,Medium,5,4,965,22,27,464,566 +1617,NS-159,North Star,Commercial,Nano,Lowrise,Medium,Medium,3,3,1022,15,18,530,567 +1624,NS-105,North Star,Commercial,Micro,Lowrise,Medium,Far,4,3,1259,17,21,358,656 +1624,NS-133,North Star,Commercial,Micro,Lowrise,Medium,Far,4,4,1302,20,24,366,690 +1624,NS-162,North Star,Commercial,Micro,Lowrise,Medium,Far,4,3,1302,18,22,372,711 +1624,NS-197,North Star,Commercial,Micro,Lowrise,Medium,Far,4,3,1816,17,21,405,734 +1624,NS-364,North Star,Commercial,Micro,Lowrise,Medium,Far,4,3,1492,16,20,401,917 +1624,NS-365,North Star,Commercial,Micro,Lowrise,Medium,Far,4,3,1590,18,22,341,960 +1624,NS-918,North Star,Commercial,Micro,Lowrise,Medium,Far,10,8,1459,40,50,567,642 +1631,DZ-525,District ZERO,Residential,Nano,Lowrise,Medium,Medium,4,3,1024,16,20,580,599 +1631,DZ-542,District ZERO,Residential,Nano,Lowrise,Medium,Medium,4,3,1024,16,20,593,540 +1631,DZ-555,District ZERO,Residential,Nano,Lowrise,Medium,Medium,4,3,922,17,21,573,536 +1631,DZ-568,District ZERO,Residential,Nano,Lowrise,Medium,Medium,4,3,977,16,20,513,575 +1631,DZ-582,District ZERO,Residential,Nano,Lowrise,Medium,Medium,4,3,1086,17,21,500,579 +1631,DZ-583,District ZERO,Residential,Nano,Lowrise,Medium,Medium,4,4,1082,20,24,481,597 +1631,DZ-599,District ZERO,Residential,Nano,Lowrise,Medium,Medium,4,3,979,16,20,585,460 +1631,DZ-612,District ZERO,Residential,Nano,Lowrise,Medium,Medium,4,3,975,18,22,598,321 +1631,DZ-613,District ZERO,Residential,Nano,Lowrise,Medium,Medium,4,4,954,20,24,593,390 +1631,DZ-615,District ZERO,Residential,Nano,Lowrise,Medium,Medium,4,3,954,17,21,589,427 +1631,DZ-616,District ZERO,Residential,Nano,Lowrise,Medium,Medium,4,3,954,16,20,573,446 +1631,DZ-617,District ZERO,Residential,Nano,Lowrise,Medium,Medium,4,3,854,18,22,558,464 +1631,DZ-621,District ZERO,Residential,Nano,Lowrise,Medium,Medium,4,4,876,20,24,514,364 +1631,DZ-624,District ZERO,Residential,Nano,Lowrise,Medium,Medium,4,3,979,17,21,496,356 +1631,DZ-625,District ZERO,Residential,Nano,Lowrise,Medium,Medium,4,3,954,16,20,498,410 +1631,DZ-631,District ZERO,Residential,Nano,Lowrise,Medium,Medium,4,3,954,16,20,479,403 +1631,DZ-634,District ZERO,Residential,Nano,Lowrise,Medium,Medium,6,5,954,27,33,441,390 +1648,HH-883,Haven Heights,Commercial,Nano,Lowrise,Medium,Medium,5,4,1025,21,26,596,459 +1649,NS-1,North Star,Residential,Nano,Lowrise,Medium,Close,4,3,940,16,20,312,125 +1649,NS-5,North Star,Residential,Nano,Lowrise,Medium,Close,3,3,450,15,18,482,125 +1649,NS-11,North Star,Residential,Nano,Lowrise,Medium,Close,3,3,844,15,18,500,146 +1649,NS-13,North Star,Residential,Nano,Lowrise,Medium,Close,4,3,1110,17,21,341,167 +1649,NS-14,North Star,Residential,Nano,Lowrise,Medium,Close,6,5,1110,28,34,302,187 +1649,NS-18,North Star,Residential,Nano,Lowrise,Medium,Close,4,4,1110,20,24,357,188 +1649,NS-19,North Star,Residential,Nano,Lowrise,Medium,Close,5,4,1110,21,26,320,208 +1649,NS-23,North Star,Residential,Nano,Lowrise,Medium,Close,6,5,1110,28,34,339,229 +1649,NS-29,North Star,Residential,Nano,Lowrise,Medium,Close,5,4,1036,22,27,358,250 +1649,NS-40,North Star,Residential,Nano,Lowrise,Medium,Close,3,3,933,15,18,460,296 +1659,DZ-22,District ZERO,Residential,Micro,Lowrise,Medium,Far,8,6,1635,33,41,538,929 +1659,DZ-24,District ZERO,Residential,Micro,Lowrise,Medium,Far,4,3,1214,16,20,572,916 +1659,DZ-26,District ZERO,Residential,Micro,Lowrise,Medium,Far,4,3,1897,16,20,575,954 +1659,DZ-27,District ZERO,Residential,Micro,Lowrise,Medium,Far,4,3,1892,16,20,557,966 +1659,DZ-28,District ZERO,Residential,Micro,Lowrise,Medium,Far,4,3,1882,17,21,520,991 +1659,DZ-42,District ZERO,Residential,Micro,Lowrise,Medium,Far,13,11,1592,55,68,314,1285 +1659,DZ-190,District ZERO,Residential,Micro,Lowrise,Medium,Far,4,3,2095,16,20,554,1305 +1659,DZ-203,District ZERO,Residential,Micro,Lowrise,Medium,Far,4,3,2186,16,20,599,1299 +1659,DZ-205,District ZERO,Residential,Micro,Lowrise,Medium,Far,4,3,2189,17,21,591,1320 +1659,DZ-208,District ZERO,Residential,Micro,Lowrise,Medium,Far,9,7,2192,39,48,585,1342 +1659,DZ-271,District ZERO,Residential,Micro,Lowrise,Medium,Far,8,6,1771,32,40,491,1407 +1659,DZ-320,District ZERO,Residential,Micro,Lowrise,Medium,Far,3,3,1227,15,18,427,1281 +1659,DZ-331,District ZERO,Residential,Micro,Lowrise,Medium,Far,3,3,1273,15,18,431,1270 +1659,DZ-338,District ZERO,Residential,Micro,Lowrise,Medium,Far,3,3,1273,15,18,434,1247 +1659,DZ-437,District ZERO,Residential,Micro,Lowrise,Medium,Far,4,3,1712,16,20,489,870 +1659,DZ-439,District ZERO,Residential,Micro,Lowrise,Medium,Far,4,3,1712,16,20,495,832 +1659,DZ-446,District ZERO,Residential,Micro,Lowrise,Medium,Far,4,3,1616,16,20,500,795 +1659,DZ-451,District ZERO,Residential,Micro,Lowrise,Medium,Far,4,4,1618,20,24,396,866 +1659,DZ-452,District ZERO,Residential,Micro,Lowrise,Medium,Far,4,3,1389,19,23,308,945 +1659,DZ-462,District ZERO,Residential,Micro,Lowrise,Medium,Far,4,3,1685,16,20,399,858 +1659,DZ-463,District ZERO,Residential,Micro,Lowrise,Medium,Far,5,4,1478,22,27,310,936 +1659,DZ-464,District ZERO,Residential,Micro,Lowrise,Medium,Far,7,5,1686,29,36,402,848 +1659,DZ-468,District ZERO,Residential,Micro,Lowrise,Medium,Far,4,3,1685,16,20,404,839 +1659,DZ-477,District ZERO,Residential,Micro,Lowrise,Medium,Far,4,3,1630,16,20,412,820 +1659,DZ-478,District ZERO,Residential,Micro,Lowrise,Medium,Far,4,3,1571,16,20,320,906 +1659,DZ-602,District ZERO,Residential,Micro,Lowrise,Medium,Far,4,4,2109,20,24,422,618 +1659,DZ-603,District ZERO,Residential,Micro,Lowrise,Medium,Far,11,9,2112,46,57,384,656 +1659,DZ-605,District ZERO,Residential,Micro,Lowrise,Medium,Far,4,3,1687,18,22,312,723 +1659,DZ-619,District ZERO,Residential,Micro,Lowrise,Medium,Far,4,3,2061,16,20,380,634 +1659,DZ-620,District ZERO,Residential,Micro,Lowrise,Medium,Far,4,4,2061,20,24,343,660 +1689,HH-171,Haven Heights,Commercial,Micro,Lowrise,Medium,Far,5,4,1350,24,29,422,1010 +1689,HH-185,Haven Heights,Commercial,Micro,Lowrise,Medium,Far,4,3,1729,17,21,573,910 +1689,HH-190,Haven Heights,Commercial,Micro,Lowrise,Medium,Far,4,3,1231,16,20,420,1024 +1689,HH-208,Haven Heights,Commercial,Micro,Lowrise,Medium,Far,4,3,1487,16,20,417,1087 +1689,HH-211,Haven Heights,Commercial,Micro,Lowrise,Medium,Far,4,3,1305,16,20,311,1167 +1689,HH-243,Haven Heights,Commercial,Micro,Lowrise,Medium,Far,4,4,1426,20,24,546,1044 +1689,HH-276,Haven Heights,Commercial,Micro,Lowrise,Medium,Far,6,4,1301,24,30,541,1113 +1689,HH-313,Haven Heights,Commercial,Micro,Lowrise,Medium,Far,4,3,1896,17,21,554,1148 +1689,HH-321,Haven Heights,Commercial,Micro,Lowrise,Medium,Far,4,3,1697,16,20,551,1162 +1689,HH-425,Haven Heights,Commercial,Micro,Lowrise,Medium,Far,4,3,1278,16,20,394,1404 +1689,HH-560,Haven Heights,Commercial,Micro,Lowrise,Medium,Far,4,3,2276,18,22,522,1530 +1689,HH-572,Haven Heights,Commercial,Micro,Lowrise,Medium,Far,6,5,2364,27,33,508,1548 +1689,HH-580,Haven Heights,Commercial,Micro,Lowrise,Medium,Far,4,3,2366,16,20,493,1560 +1689,HH-585,Haven Heights,Commercial,Micro,Lowrise,Medium,Far,8,6,2368,32,40,477,1560 +1689,HH-620,Haven Heights,Commercial,Micro,Lowrise,Medium,Far,4,3,2152,16,20,538,1283 +1689,HH-621,Haven Heights,Commercial,Micro,Lowrise,Medium,Far,6,5,2166,28,34,521,1324 +1689,HH-622,Haven Heights,Commercial,Micro,Lowrise,Medium,Far,5,4,2164,21,26,504,1366 +1689,HH-671,Haven Heights,Commercial,Micro,Lowrise,Medium,Far,4,3,2383,17,21,444,1227 +1689,HH-673,Haven Heights,Commercial,Micro,Lowrise,Medium,Far,4,3,2288,17,21,368,1360 +1689,HH-706,Haven Heights,Commercial,Micro,Lowrise,Medium,Far,4,3,1322,16,20,432,1199 +1689,HH-847,Haven Heights,Commercial,Micro,Lowrise,Medium,Far,4,3,2063,16,20,438,635 +1689,HH-893,Haven Heights,Commercial,Micro,Lowrise,Medium,Far,4,3,2200,17,21,426,650 +1711,HH-460,Haven Heights,Residential,Mini,Lowrise,Far,Far,4,3,2683,17,21,1154,825 +1711,HH-522,Haven Heights,Residential,Mini,Lowrise,Far,Far,4,3,3070,16,20,669,1387 +1711,HH-523,Haven Heights,Residential,Mini,Lowrise,Far,Far,5,4,3070,21,26,641,1403 +1714,SM-106,Space Mind,Commercial,Micro,Lowrise,Far,Medium,4,3,1714,19,23,2169,410 +1714,SM-108,Space Mind,Commercial,Micro,Lowrise,Far,Medium,4,3,1728,17,21,2225,392 +1714,SM-114,Space Mind,Commercial,Micro,Lowrise,Far,Medium,4,3,1424,16,20,1929,395 +1714,SM-116,Space Mind,Commercial,Micro,Lowrise,Far,Medium,5,4,1405,23,28,1864,377 +1714,SM-244,Space Mind,Commercial,Micro,Lowrise,Far,Medium,4,3,1710,17,21,1334,570 +1714,SM-275,Space Mind,Commercial,Micro,Lowrise,Far,Medium,4,3,1310,17,21,1300,542 +1714,SM-316,Space Mind,Commercial,Micro,Lowrise,Far,Medium,4,3,2240,17,21,1357,315 +1714,SM-336,Space Mind,Commercial,Micro,Lowrise,Far,Medium,5,4,1640,22,27,1318,349 +1714,SM-367,Space Mind,Commercial,Micro,Lowrise,Far,Medium,4,3,1501,16,20,1146,517 +1723,SM-310,Space Mind,Residential,Micro,Lowrise,Far,Close,7,5,1906,29,36,1963,174 +1723,SM-311,Space Mind,Residential,Micro,Lowrise,Far,Close,4,3,1888,18,22,1919,191 +1723,SM-328,Space Mind,Residential,Micro,Lowrise,Far,Close,4,4,1894,20,24,1897,222 +1723,SM-334,Space Mind,Residential,Micro,Lowrise,Far,Close,4,3,1909,16,20,1921,239 +1723,SM-349,Space Mind,Residential,Micro,Lowrise,Far,Close,6,5,1792,26,32,1855,284 +1723,SM-522,Space Mind,Residential,Micro,Lowrise,Far,Close,5,4,1393,21,26,1644,148 +1723,SM-523,Space Mind,Residential,Micro,Lowrise,Far,Close,5,4,1676,21,26,1582,197 +1723,SM-564,Space Mind,Residential,Micro,Lowrise,Far,Close,5,4,1353,20,25,1312,280 +1731,SM-129,Space Mind,Residential,Nano,Lowrise,Medium,Far,4,4,906,20,24,457,1617 +1731,SM-134,Space Mind,Residential,Nano,Lowrise,Medium,Far,7,5,887,29,36,432,1639 +1731,SM-220,Space Mind,Residential,Nano,Lowrise,Medium,Far,4,3,1037,17,21,361,1572 +1731,SM-227,Space Mind,Residential,Nano,Lowrise,Medium,Far,7,5,1090,29,36,356,1571 +1731,SM-233,Space Mind,Residential,Nano,Lowrise,Medium,Far,5,4,1090,22,27,354,1570 +1731,SM-239,Space Mind,Residential,Nano,Lowrise,Medium,Far,4,3,1090,16,20,353,1570 +1731,SM-245,Space Mind,Residential,Nano,Lowrise,Medium,Far,10,8,1055,43,53,352,1571 +1731,SM-254,Space Mind,Residential,Nano,Lowrise,Medium,Far,4,3,906,16,20,351,1569 +1731,SM-255,Space Mind,Residential,Nano,Lowrise,Medium,Far,4,3,902,16,20,334,1586 +1731,SM-256,Space Mind,Residential,Nano,Lowrise,Medium,Far,9,7,899,36,45,317,1603 +1731,SM-269,Space Mind,Residential,Nano,Lowrise,Medium,Far,6,5,914,27,33,344,1574 +1731,SM-270,Space Mind,Residential,Nano,Lowrise,Medium,Far,4,3,914,16,20,328,1591 +1731,SM-271,Space Mind,Residential,Nano,Lowrise,Medium,Far,4,3,913,18,22,311,1608 +1731,SM-279,Space Mind,Residential,Nano,Lowrise,Medium,Far,4,3,1044,17,21,519,1394 +1731,SM-285,Space Mind,Residential,Nano,Lowrise,Medium,Far,6,5,1190,27,33,517,1394 +1731,SM-346,Space Mind,Residential,Nano,Lowrise,Medium,Far,4,3,1006,17,21,401,1476 +1731,SM-353,Space Mind,Residential,Nano,Lowrise,Medium,Far,4,3,1089,16,20,337,1543 +1731,SM-482,Space Mind,Residential,Nano,Lowrise,Medium,Far,8,6,840,34,42,551,1268 +1731,SM-483,Space Mind,Residential,Nano,Lowrise,Medium,Far,4,3,758,16,20,547,1302 +1731,SM-493,Space Mind,Residential,Nano,Lowrise,Medium,Far,9,7,730,38,47,528,1313 +1731,SM-497,Space Mind,Residential,Nano,Lowrise,Medium,Far,4,3,882,16,20,512,1294 +1731,SM-498,Space Mind,Residential,Nano,Lowrise,Medium,Far,6,5,640,27,33,508,1324 +1731,SM-501,Space Mind,Residential,Nano,Lowrise,Medium,Far,4,3,882,17,21,492,1308 +1731,SM-502,Space Mind,Residential,Nano,Lowrise,Medium,Far,5,4,551,23,28,488,1336 +1731,SM-513,Space Mind,Residential,Nano,Lowrise,Medium,Far,4,3,881,17,21,472,1322 +1731,SM-514,Space Mind,Residential,Nano,Lowrise,Medium,Far,4,3,462,16,20,469,1347 +1731,SM-517,Space Mind,Residential,Nano,Lowrise,Medium,Far,6,5,853,28,34,453,1335 +1731,SM-518,Space Mind,Residential,Nano,Lowrise,Medium,Far,4,3,373,16,20,449,1359 +1731,SM-520,Space Mind,Residential,Nano,Lowrise,Medium,Far,4,3,682,16,20,368,1557 +1731,SM-521,Space Mind,Residential,Nano,Lowrise,Medium,Far,6,5,893,25,31,324,1592 +1731,SM-530,Space Mind,Residential,Nano,Lowrise,Medium,Far,5,4,1054,23,28,537,1120 +1731,SM-531,Space Mind,Residential,Nano,Lowrise,Medium,Far,4,3,1091,16,20,523,1134 +1731,SM-532,Space Mind,Residential,Nano,Lowrise,Medium,Far,4,3,1091,17,21,510,1148 +1731,SM-533,Space Mind,Residential,Nano,Lowrise,Medium,Far,2,2,1091,11,13,498,1163 +1731,SM-534,Space Mind,Residential,Nano,Lowrise,Medium,Far,2,2,1091,11,13,485,1178 +1731,SM-542,Space Mind,Residential,Nano,Lowrise,Medium,Far,5,4,868,21,26,324,1614 +1731,SM-547,Space Mind,Residential,Nano,Lowrise,Medium,Far,4,3,871,17,21,363,1592 +1731,SM-548,Space Mind,Residential,Nano,Lowrise,Medium,Far,10,8,815,43,53,322,1626 +1731,SM-554,Space Mind,Residential,Nano,Lowrise,Medium,Far,4,3,1086,16,20,483,1173 +1731,SM-555,Space Mind,Residential,Nano,Lowrise,Medium,Far,4,3,1082,19,23,469,1187 +1731,SM-557,Space Mind,Residential,Nano,Lowrise,Medium,Far,5,4,1075,20,25,441,1216 +1731,SM-558,Space Mind,Residential,Nano,Lowrise,Medium,Far,5,4,922,22,27,356,1605 +1731,SM-559,Space Mind,Residential,Nano,Lowrise,Medium,Far,5,4,763,21,26,316,1638 +1731,SM-563,Space Mind,Residential,Nano,Lowrise,Medium,Far,4,4,687,20,24,309,1649 +1731,SM-605,Space Mind,Residential,Nano,Lowrise,Medium,Far,6,5,1185,26,32,450,1021 +1731,SM-606,Space Mind,Residential,Nano,Lowrise,Medium,Far,7,6,1149,30,37,488,976 +1731,SM-607,Space Mind,Residential,Nano,Lowrise,Medium,Far,4,3,1184,17,21,469,997 +1731,SM-615,Space Mind,Residential,Nano,Lowrise,Medium,Far,4,3,1148,16,20,463,984 +1731,SM-616,Space Mind,Residential,Nano,Lowrise,Medium,Far,5,4,1180,23,28,443,1005 +1731,SM-617,Space Mind,Residential,Nano,Lowrise,Medium,Far,5,4,1178,21,26,423,1027 +1731,SM-618,Space Mind,Residential,Nano,Lowrise,Medium,Far,4,4,1175,20,24,402,1049 +1782,DZ-3,District ZERO,Commercial,Micro,Lowrise,Far,Medium,4,3,1614,16,20,974,512 +1782,DZ-14,District ZERO,Commercial,Micro,Lowrise,Far,Medium,5,4,1249,22,27,945,571 +1782,DZ-66,District ZERO,Commercial,Micro,Lowrise,Far,Medium,4,3,1812,16,20,2060,357 +1782,DZ-71,District ZERO,Commercial,Micro,Lowrise,Far,Medium,3,3,2241,15,18,1437,586 +1782,DZ-298,District ZERO,Commercial,Micro,Lowrise,Far,Medium,8,6,2194,32,40,1621,526 +1782,DZ-407,District ZERO,Commercial,Micro,Lowrise,Far,Medium,4,3,2259,16,20,1199,501 +1782,DZ-419,District ZERO,Commercial,Micro,Lowrise,Far,Medium,9,8,1781,40,49,1177,445 +1782,DZ-426,District ZERO,Commercial,Micro,Lowrise,Far,Medium,4,3,1957,18,22,1253,385 +1782,DZ-428,District ZERO,Commercial,Micro,Lowrise,Far,Medium,4,3,2088,17,21,1236,391 +1782,DZ-467,District ZERO,Commercial,Micro,Lowrise,Far,Medium,4,3,1686,16,20,985,339 +1792,NS-52,North Star,Commercial,Micro,Lowrise,Far,Close,4,3,2028,16,20,626,240 +1792,NS-173,North Star,Commercial,Micro,Lowrise,Far,Close,4,3,1504,16,20,1681,152 +1792,NS-175,North Star,Commercial,Micro,Lowrise,Far,Close,4,3,1824,18,22,1584,125 +1792,NS-179,North Star,Commercial,Micro,Lowrise,Far,Close,4,3,1674,16,20,1587,148 +1792,NS-180,North Star,Commercial,Micro,Lowrise,Far,Close,6,5,2357,25,31,1389,150 +1792,NS-195,North Star,Commercial,Micro,Lowrise,Far,Close,5,4,1674,20,25,1590,172 +1792,NS-196,North Star,Commercial,Micro,Lowrise,Far,Close,4,3,1621,17,21,1532,147 +1792,NS-210,North Star,Commercial,Micro,Lowrise,Far,Close,4,4,1807,20,24,1729,237 +1792,NS-221,North Star,Commercial,Micro,Lowrise,Far,Close,4,4,1368,20,24,1289,278 +1792,NS-234,North Star,Commercial,Micro,Lowrise,Far,Close,4,4,2382,20,24,1446,203 +1792,NS-235,North Star,Commercial,Micro,Lowrise,Far,Close,4,4,2372,20,24,1387,225 +1792,NS-626,North Star,Commercial,Micro,Lowrise,Far,Close,4,4,1598,20,24,2155,136 +1792,NS-694,North Star,Commercial,Micro,Lowrise,Far,Close,4,3,1220,16,20,2255,294 +1792,NS-727,North Star,Commercial,Micro,Lowrise,Far,Close,4,3,1457,17,21,2283,294 +1792,NS-748,North Star,Commercial,Micro,Lowrise,Far,Close,4,3,1544,16,20,2289,298 +1792,NS-831,North Star,Commercial,Micro,Lowrise,Far,Close,4,3,1867,16,20,2322,179 +1792,NS-837,North Star,Commercial,Micro,Lowrise,Far,Close,4,3,1814,17,21,2322,167 +1792,NS-841,North Star,Commercial,Micro,Lowrise,Far,Close,4,3,1761,17,21,2322,157 +1810,TG-103,Tranquility Gardens,Commercial,Micro,Lowrise,Far,Medium,6,5,2221,27,33,4327,567 +1810,TG-131,Tranquility Gardens,Commercial,Micro,Lowrise,Far,Medium,4,3,1267,16,20,4313,584 +1810,TG-152,Tranquility Gardens,Commercial,Micro,Lowrise,Far,Medium,4,4,1656,20,24,4348,528 +1810,TG-156,Tranquility Gardens,Commercial,Micro,Lowrise,Far,Medium,5,4,1655,22,27,4351,524 +1810,TG-172,Tranquility Gardens,Commercial,Micro,Lowrise,Far,Medium,4,3,1593,17,21,4357,518 +1810,TG-178,Tranquility Gardens,Commercial,Micro,Lowrise,Far,Medium,6,4,1562,24,30,4529,349 +1810,TG-201,Tranquility Gardens,Commercial,Micro,Lowrise,Far,Medium,5,4,1639,21,26,4481,404 +1810,TG-207,Tranquility Gardens,Commercial,Micro,Lowrise,Far,Medium,5,4,1640,20,25,4487,402 +1810,TG-208,Tranquility Gardens,Commercial,Micro,Lowrise,Far,Medium,5,4,1781,23,28,4382,509 +1810,TG-230,Tranquility Gardens,Commercial,Micro,Lowrise,Far,Medium,4,3,2139,16,20,4404,506 +1810,TG-282,Tranquility Gardens,Commercial,Micro,Lowrise,Far,Medium,5,4,1886,23,28,4548,364 +1810,TG-286,Tranquility Gardens,Commercial,Micro,Lowrise,Far,Medium,4,3,1815,16,20,4528,395 +1810,TG-319,Tranquility Gardens,Commercial,Micro,Lowrise,Far,Medium,7,5,2114,29,36,4585,371 +1810,TG-401,Tranquility Gardens,Commercial,Micro,Lowrise,Far,Medium,4,3,1726,16,20,4175,431 +1810,TG-434,Tranquility Gardens,Commercial,Micro,Lowrise,Far,Medium,4,3,2201,17,21,3828,478 +1810,TG-461,Tranquility Gardens,Commercial,Micro,Lowrise,Far,Medium,4,3,2107,16,20,3883,334 +1810,TG-504,Tranquility Gardens,Commercial,Micro,Lowrise,Far,Medium,4,3,2192,17,21,3480,304 +1810,TG-505,Tranquility Gardens,Commercial,Micro,Lowrise,Far,Medium,4,3,1710,16,20,3278,416 +1810,TG-517,Tranquility Gardens,Commercial,Micro,Lowrise,Far,Medium,4,4,1568,20,24,2733,590 +1810,TG-523,Tranquility Gardens,Commercial,Micro,Lowrise,Far,Medium,5,4,2359,23,28,2532,540 +1810,TG-527,Tranquility Gardens,Commercial,Micro,Lowrise,Far,Medium,4,3,2340,16,20,2454,541 +1810,TG-542,Tranquility Gardens,Commercial,Micro,Lowrise,Far,Medium,5,4,2340,24,29,2229,488 +1810,TG-543,Tranquility Gardens,Commercial,Micro,Lowrise,Far,Medium,6,5,2290,27,33,2204,475 +1810,TG-544,Tranquility Gardens,Commercial,Micro,Lowrise,Far,Medium,4,4,1205,20,24,2227,463 +1810,TG-545,Tranquility Gardens,Commercial,Micro,Lowrise,Far,Medium,5,4,1796,24,29,2180,464 +1810,TG-579,Tranquility Gardens,Commercial,Micro,Lowrise,Far,Medium,4,4,2392,20,24,2773,396 +1810,TG-588,Tranquility Gardens,Commercial,Micro,Lowrise,Far,Medium,6,5,1830,25,31,2832,330 +1837,NS-121,North Star,Commercial,Nano,Lowrise,Medium,Far,4,3,1174,17,21,302,733 +1837,NS-160,North Star,Commercial,Nano,Lowrise,Medium,Far,4,3,1022,16,20,477,614 +1837,NS-272,North Star,Commercial,Nano,Lowrise,Medium,Far,5,4,949,20,25,482,754 +1837,NS-326,North Star,Commercial,Nano,Lowrise,Medium,Far,3,3,905,15,18,538,772 +1837,NS-360,North Star,Commercial,Nano,Lowrise,Medium,Far,5,4,897,21,26,557,817 +1837,NS-425,North Star,Commercial,Nano,Lowrise,Medium,Far,4,4,927,20,24,460,994 +1837,NS-446,North Star,Commercial,Nano,Lowrise,Medium,Far,4,3,855,16,20,555,947 +1837,NS-447,North Star,Commercial,Nano,Lowrise,Medium,Far,5,4,955,20,25,537,956 +1837,NS-500,North Star,Commercial,Nano,Lowrise,Medium,Far,4,3,1041,19,23,357,1109 +1837,NS-530,North Star,Commercial,Nano,Lowrise,Medium,Far,5,4,1093,23,28,484,1113 +1837,NS-535,North Star,Commercial,Nano,Lowrise,Medium,Far,4,3,1091,18,22,338,1193 +1837,NS-543,North Star,Commercial,Nano,Lowrise,Medium,Far,5,4,1094,21,26,486,1130 +1837,NS-545,North Star,Commercial,Nano,Lowrise,Medium,Far,6,5,1065,27,33,541,1121 +1837,NS-590,North Star,Commercial,Nano,Lowrise,Medium,Far,4,3,1093,16,20,489,1246 +1837,NS-592,North Star,Commercial,Nano,Lowrise,Medium,Far,4,3,1021,17,21,400,1287 +1837,NS-598,North Star,Commercial,Nano,Lowrise,Medium,Far,5,4,1094,23,28,490,1264 +1837,NS-602,North Star,Commercial,Nano,Lowrise,Medium,Far,5,4,1065,22,27,548,1258 +1837,NS-603,North Star,Commercial,Nano,Lowrise,Medium,Far,7,5,1095,29,36,492,1282 +1837,NS-614,North Star,Commercial,Nano,Lowrise,Medium,Far,4,3,985,17,21,425,1333 +1837,NS-625,North Star,Commercial,Nano,Lowrise,Medium,Far,4,3,961,19,23,350,1431 +1837,NS-637,North Star,Commercial,Nano,Lowrise,Medium,Far,4,3,1091,19,23,555,1335 +1837,NS-641,North Star,Commercial,Nano,Lowrise,Medium,Far,4,4,1018,20,24,411,1420 +1837,NS-642,North Star,Commercial,Nano,Lowrise,Medium,Far,6,4,993,24,30,351,1448 +1837,NS-659,North Star,Commercial,Nano,Lowrise,Medium,Far,6,5,1079,26,32,518,1314 +1837,NS-663,North Star,Commercial,Nano,Lowrise,Medium,Far,4,3,993,16,20,352,1427 +1837,NS-668,North Star,Commercial,Nano,Lowrise,Medium,Far,7,6,972,30,37,413,1371 +1837,NS-669,North Star,Commercial,Nano,Lowrise,Medium,Far,6,5,917,27,33,353,1414 +1837,NS-741,North Star,Commercial,Nano,Lowrise,Medium,Far,5,4,939,21,26,593,991 +1837,NS-745,North Star,Commercial,Nano,Lowrise,Medium,Far,4,3,1019,16,20,499,1051 +1837,NS-764,North Star,Commercial,Nano,Lowrise,Medium,Far,4,3,1024,16,20,581,959 +1837,NS-766,North Star,Commercial,Nano,Lowrise,Medium,Far,4,3,1024,18,22,525,996 +1837,NS-780,North Star,Commercial,Nano,Lowrise,Medium,Far,4,3,1024,17,21,384,1037 +1837,NS-808,North Star,Commercial,Nano,Lowrise,Medium,Far,5,4,1049,20,25,448,957 +1837,NS-809,North Star,Commercial,Nano,Lowrise,Medium,Far,5,4,1024,24,29,393,1002 +1837,NS-835,North Star,Commercial,Nano,Lowrise,Medium,Far,5,4,1094,20,25,539,820 +1837,NS-890,North Star,Commercial,Nano,Lowrise,Medium,Far,4,3,570,16,20,313,943 +1873,DZ-316,District ZERO,Residential,Micro,Lowrise,Far,Close,5,4,1868,22,27,2037,192 +1873,DZ-318,District ZERO,Residential,Micro,Lowrise,Far,Close,9,7,1418,37,46,2080,151 +1873,DZ-403,District ZERO,Residential,Micro,Lowrise,Far,Close,5,4,2117,22,27,1692,171 +1873,DZ-404,District ZERO,Residential,Micro,Lowrise,Far,Close,4,3,2195,16,20,1672,179 +1873,DZ-405,District ZERO,Residential,Micro,Lowrise,Far,Close,5,4,2192,22,27,1632,201 +1873,DZ-406,District ZERO,Residential,Micro,Lowrise,Far,Close,6,4,2190,24,30,1613,214 +1873,DZ-417,District ZERO,Residential,Micro,Lowrise,Far,Close,4,3,1465,16,20,1642,127 +1873,DZ-421,District ZERO,Residential,Micro,Lowrise,Far,Close,6,4,2009,24,30,1605,135 +1873,DZ-423,District ZERO,Residential,Micro,Lowrise,Far,Close,4,4,1255,20,24,1458,234 +1873,DZ-429,District ZERO,Residential,Micro,Lowrise,Far,Close,5,4,1248,22,27,1396,259 +1873,DZ-430,District ZERO,Residential,Micro,Lowrise,Far,Close,4,3,1218,16,20,1341,296 +1873,DZ-434,District ZERO,Residential,Micro,Lowrise,Far,Close,8,6,1248,34,42,1400,245 +1873,DZ-450,District ZERO,Residential,Micro,Lowrise,Far,Close,4,3,1437,17,21,1105,259 +1873,DZ-466,District ZERO,Residential,Micro,Lowrise,Far,Close,4,3,1639,17,21,1041,287 +1873,DZ-476,District ZERO,Residential,Micro,Lowrise,Far,Close,4,3,1345,16,20,1120,206 +1873,DZ-502,District ZERO,Residential,Micro,Lowrise,Far,Close,4,3,1434,18,22,1025,212 +1873,DZ-533,District ZERO,Residential,Micro,Lowrise,Far,Close,7,5,1327,29,36,1049,161 +1873,DZ-565,District ZERO,Residential,Micro,Lowrise,Far,Close,4,3,1611,18,22,862,148 +1873,DZ-566,District ZERO,Residential,Micro,Lowrise,Far,Close,6,5,1613,27,33,852,172 +1873,DZ-574,District ZERO,Residential,Micro,Lowrise,Far,Close,4,3,1610,17,21,869,120 +1873,DZ-578,District ZERO,Residential,Micro,Lowrise,Far,Close,11,9,1613,47,58,808,125 +1873,DZ-580,District ZERO,Residential,Micro,Lowrise,Far,Close,4,3,1565,16,20,779,208 +1895,HH-25,Haven Heights,Commercial,Micro,Lowrise,Far,Close,5,4,2292,23,28,1121,143 +1895,HH-68,Haven Heights,Commercial,Micro,Lowrise,Far,Close,4,3,2296,16,20,1610,184 +1895,HH-284,Haven Heights,Commercial,Micro,Lowrise,Far,Close,4,3,2360,16,20,2052,191 +1895,HH-293,Haven Heights,Commercial,Micro,Lowrise,Far,Close,4,3,1842,17,21,2133,130 +1895,HH-295,Haven Heights,Commercial,Micro,Lowrise,Far,Close,4,3,1349,17,21,1820,243 +1895,HH-316,Haven Heights,Commercial,Micro,Lowrise,Far,Close,4,3,1693,17,21,2918,127 +1895,HH-338,Haven Heights,Commercial,Micro,Lowrise,Far,Close,4,3,1504,16,20,2849,185 +1895,HH-339,Haven Heights,Commercial,Micro,Lowrise,Far,Close,4,3,2364,17,21,1818,293 +1895,HH-366,Haven Heights,Commercial,Micro,Lowrise,Far,Close,4,3,1691,16,20,2828,182 +1895,HH-367,Haven Heights,Commercial,Micro,Lowrise,Far,Close,4,4,1739,20,24,2803,192 +1895,HH-446,Haven Heights,Commercial,Micro,Lowrise,Far,Close,4,3,1406,16,20,1760,169 +1895,HH-458,Haven Heights,Commercial,Micro,Lowrise,Far,Close,4,3,1479,16,20,1685,218 +1895,HH-499,Haven Heights,Commercial,Micro,Lowrise,Far,Close,7,5,2350,29,36,2318,188 +1895,HH-519,Haven Heights,Commercial,Micro,Lowrise,Far,Close,4,3,2350,16,20,2312,198 +1895,HH-520,Haven Heights,Commercial,Micro,Lowrise,Far,Close,4,3,1833,16,20,2206,121 +1895,HH-528,Haven Heights,Commercial,Micro,Lowrise,Far,Close,4,3,2296,16,20,2177,126 +1895,HH-530,Haven Heights,Commercial,Micro,Lowrise,Far,Close,4,3,2371,16,20,1486,252 +1895,HH-531,Haven Heights,Commercial,Micro,Lowrise,Far,Close,4,3,1354,17,21,1592,131 +1895,HH-532,Haven Heights,Commercial,Micro,Lowrise,Far,Close,11,9,2373,45,56,1476,244 +1895,HH-552,Haven Heights,Commercial,Micro,Lowrise,Far,Close,4,3,2273,16,20,1467,235 +1895,HH-607,Haven Heights,Commercial,Micro,Lowrise,Far,Close,5,4,1393,20,25,1496,103 +1895,HH-648,Haven Heights,Commercial,Micro,Lowrise,Far,Close,4,3,2227,18,22,1619,108 +1895,HH-649,Haven Heights,Commercial,Micro,Lowrise,Far,Close,4,3,2240,17,21,1486,149 +1895,HH-651,Haven Heights,Commercial,Micro,Lowrise,Far,Close,9,7,1967,37,46,1618,166 +1895,HH-829,Haven Heights,Commercial,Micro,Lowrise,Far,Close,6,5,1226,26,32,761,250 +1895,HH-833,Haven Heights,Commercial,Micro,Lowrise,Far,Close,3,3,2013,15,18,762,227 +1895,HH-857,Haven Heights,Commercial,Micro,Lowrise,Far,Close,4,3,2269,16,20,785,273 +1895,HH-879,Haven Heights,Commercial,Micro,Lowrise,Far,Close,4,3,2397,16,20,936,130 +1895,HH-881,Haven Heights,Commercial,Micro,Lowrise,Far,Close,4,3,2397,16,20,910,158 +1895,HH-894,Haven Heights,Commercial,Micro,Lowrise,Far,Close,4,3,2290,17,21,925,209 +1895,HH-902,Haven Heights,Commercial,Micro,Lowrise,Far,Close,8,6,2290,33,41,919,235 +1926,DZ-23,District ZERO,Residential,Nano,Lowrise,Medium,Far,4,3,944,16,20,586,909 +1926,DZ-282,District ZERO,Residential,Nano,Lowrise,Medium,Far,4,3,1056,16,20,566,1262 +1926,DZ-283,District ZERO,Residential,Nano,Lowrise,Medium,Far,4,3,1031,16,20,511,1301 +1926,DZ-285,District ZERO,Residential,Nano,Lowrise,Medium,Far,4,3,712,16,20,358,1413 +1926,DZ-290,District ZERO,Residential,Nano,Lowrise,Medium,Far,6,5,1091,28,34,569,1248 +1926,DZ-291,District ZERO,Residential,Nano,Lowrise,Medium,Far,8,6,1065,32,40,514,1287 +1926,DZ-294,District ZERO,Residential,Nano,Lowrise,Medium,Far,4,3,1091,16,20,573,1234 +1926,DZ-295,District ZERO,Residential,Nano,Lowrise,Medium,Far,4,3,1065,16,20,518,1274 +1926,DZ-296,District ZERO,Residential,Nano,Lowrise,Medium,Far,3,3,1013,15,18,421,1346 +1926,DZ-297,District ZERO,Residential,Nano,Lowrise,Medium,Far,4,3,875,16,20,364,1390 +1926,DZ-300,District ZERO,Residential,Nano,Lowrise,Medium,Far,10,8,1091,40,50,577,1220 +1926,DZ-306,District ZERO,Residential,Nano,Lowrise,Medium,Far,4,3,1091,16,20,581,1206 +1926,DZ-307,District ZERO,Residential,Nano,Lowrise,Medium,Far,4,3,1065,16,20,526,1246 +1926,DZ-308,District ZERO,Residential,Nano,Lowrise,Medium,Far,3,3,1013,15,18,426,1321 +1926,DZ-311,District ZERO,Residential,Nano,Lowrise,Medium,Far,6,4,1040,24,30,583,1192 +1926,DZ-330,District ZERO,Residential,Nano,Lowrise,Medium,Far,9,7,1024,36,45,534,1187 +1926,DZ-332,District ZERO,Residential,Nano,Lowrise,Medium,Far,4,3,1008,16,20,366,1324 +1926,DZ-334,District ZERO,Residential,Nano,Lowrise,Medium,Far,4,3,1049,16,20,593,1132 +1926,DZ-335,District ZERO,Residential,Nano,Lowrise,Medium,Far,4,3,1068,16,20,365,1314 +1926,DZ-337,District ZERO,Residential,Nano,Lowrise,Medium,Far,4,3,1049,16,20,595,1120 +1926,DZ-353,District ZERO,Residential,Nano,Lowrise,Medium,Far,4,3,1188,16,20,363,1291 +1926,DZ-355,District ZERO,Residential,Nano,Lowrise,Medium,Far,6,5,939,28,34,597,1096 +1926,DZ-357,District ZERO,Residential,Nano,Lowrise,Medium,Far,4,3,1173,16,20,364,1280 +1926,DZ-458,District ZERO,Residential,Nano,Lowrise,Medium,Far,4,3,1091,16,20,569,705 +1926,DZ-460,District ZERO,Residential,Nano,Lowrise,Medium,Far,4,3,1091,17,21,512,755 +1926,DZ-461,District ZERO,Residential,Nano,Lowrise,Medium,Far,4,3,977,17,21,494,771 +1926,DZ-472,District ZERO,Residential,Nano,Lowrise,Medium,Far,4,3,1052,16,20,597,660 +1926,DZ-473,District ZERO,Residential,Nano,Lowrise,Medium,Far,4,3,1086,16,20,578,677 +1926,DZ-474,District ZERO,Residential,Nano,Lowrise,Medium,Far,4,3,1082,16,20,559,694 +1926,DZ-485,District ZERO,Residential,Nano,Lowrise,Medium,Far,8,6,1091,33,41,597,634 +1926,DZ-486,District ZERO,Residential,Nano,Lowrise,Medium,Far,6,5,1091,27,33,578,651 +1926,DZ-487,District ZERO,Residential,Nano,Lowrise,Medium,Far,4,3,1091,19,23,542,685 +1926,DZ-498,District ZERO,Residential,Nano,Lowrise,Medium,Far,5,4,1079,21,26,574,643 +1926,DZ-499,District ZERO,Residential,Nano,Lowrise,Medium,Far,4,3,1075,19,23,556,661 +1926,DZ-513,District ZERO,Residential,Nano,Lowrise,Medium,Far,9,7,1024,36,45,571,618 +1926,DZ-514,District ZERO,Residential,Nano,Lowrise,Medium,Far,4,3,954,16,20,475,702 +1926,DZ-515,District ZERO,Residential,Nano,Lowrise,Medium,Far,4,3,981,16,20,418,753 +1926,DZ-521,District ZERO,Residential,Nano,Lowrise,Medium,Far,4,3,954,17,21,480,691 +1926,DZ-526,District ZERO,Residential,Nano,Lowrise,Medium,Far,5,4,983,23,28,427,734 +1926,DZ-534,District ZERO,Residential,Nano,Lowrise,Medium,Far,4,3,882,17,21,430,717 +1926,DZ-535,District ZERO,Residential,Nano,Lowrise,Medium,Far,7,5,877,29,36,435,692 +1926,DZ-543,District ZERO,Residential,Nano,Lowrise,Medium,Far,5,4,954,21,26,496,630 +1926,DZ-546,District ZERO,Residential,Nano,Lowrise,Medium,Far,4,3,793,16,20,354,757 +1926,DZ-550,District ZERO,Residential,Nano,Lowrise,Medium,Far,4,3,983,16,20,434,674 +1926,DZ-551,District ZERO,Residential,Nano,Lowrise,Medium,Far,4,4,794,20,24,353,752 +1926,DZ-556,District ZERO,Residential,Nano,Lowrise,Medium,Far,4,3,954,16,20,494,611 +1926,DZ-557,District ZERO,Residential,Nano,Lowrise,Medium,Far,4,3,984,16,20,434,669 +1926,DZ-558,District ZERO,Residential,Nano,Lowrise,Medium,Far,4,4,738,20,24,312,788 +1926,DZ-560,District ZERO,Residential,Nano,Lowrise,Medium,Far,7,6,907,32,39,435,665 +1926,DZ-561,District ZERO,Residential,Nano,Lowrise,Medium,Far,6,5,756,25,31,354,743 +1926,DZ-570,District ZERO,Residential,Nano,Lowrise,Medium,Far,4,3,1091,18,22,456,631 +1926,DZ-571,District ZERO,Residential,Nano,Lowrise,Medium,Far,9,7,1060,36,45,418,668 +1926,DZ-572,District ZERO,Residential,Nano,Lowrise,Medium,Far,4,3,832,18,22,355,730 +1926,DZ-573,District ZERO,Residential,Nano,Lowrise,Medium,Far,5,4,797,23,28,313,771 +1926,DZ-577,District ZERO,Residential,Nano,Lowrise,Medium,Far,10,8,783,40,50,320,760 +1926,DZ-585,District ZERO,Residential,Nano,Lowrise,Medium,Far,4,3,834,18,22,362,714 +1982,HH-289,Haven Heights,Commercial,Nano,Lowrise,Medium,Far,4,3,1193,16,20,348,1270 +1982,HH-335,Haven Heights,Commercial,Nano,Lowrise,Medium,Far,4,3,855,16,20,515,1227 +1982,HH-362,Haven Heights,Commercial,Nano,Lowrise,Medium,Far,4,3,979,16,20,570,1208 +1982,HH-363,Haven Heights,Commercial,Nano,Lowrise,Medium,Far,4,3,954,18,22,511,1241 +1982,HH-382,Haven Heights,Commercial,Nano,Lowrise,Medium,Far,5,4,954,23,28,503,1273 +1982,HH-383,Haven Heights,Commercial,Nano,Lowrise,Medium,Far,4,3,745,16,20,352,1366 +1982,HH-444,Haven Heights,Commercial,Nano,Lowrise,Medium,Far,5,4,1049,21,26,537,1333 +1982,HH-453,Haven Heights,Commercial,Nano,Lowrise,Medium,Far,4,3,1049,16,20,531,1349 +1982,HH-466,Haven Heights,Commercial,Nano,Lowrise,Medium,Far,4,3,1049,16,20,526,1366 +1982,HH-601,Haven Heights,Commercial,Nano,Lowrise,Medium,Far,4,3,1043,18,22,390,1649 +1982,HH-652,Haven Heights,Commercial,Nano,Lowrise,Medium,Far,4,3,629,16,20,370,1398 +1982,HH-874,Haven Heights,Commercial,Nano,Lowrise,Medium,Far,4,3,776,16,20,354,699 +1994,TG-80,Tranquility Gardens,Residential,Micro,Lowrise,Far,Close,4,3,1673,17,21,4802,140 +1994,TG-85,Tranquility Gardens,Residential,Micro,Lowrise,Far,Close,5,4,1683,22,27,4805,161 +1994,TG-86,Tranquility Gardens,Residential,Micro,Lowrise,Far,Close,6,5,1739,26,32,4727,200 +1994,TG-87,Tranquility Gardens,Residential,Micro,Lowrise,Far,Close,5,4,1228,22,27,4627,276 +1994,TG-92,Tranquility Gardens,Residential,Micro,Lowrise,Far,Close,6,5,1692,28,34,4807,183 +1994,TG-93,Tranquility Gardens,Residential,Micro,Lowrise,Far,Close,4,3,1741,16,20,4729,218 +1994,TG-94,Tranquility Gardens,Residential,Micro,Lowrise,Far,Close,4,3,1228,16,20,4629,289 +1994,TG-98,Tranquility Gardens,Residential,Micro,Lowrise,Far,Close,6,5,1638,27,33,4809,204 +1994,TG-99,Tranquility Gardens,Residential,Micro,Lowrise,Far,Close,4,3,1630,19,23,4731,236 +1994,TG-106,Tranquility Gardens,Residential,Micro,Lowrise,Far,Close,4,4,1380,20,24,4761,290 +1994,TG-107,Tranquility Gardens,Residential,Micro,Lowrise,Far,Close,6,5,1381,27,33,4737,300 +1994,TG-122,Tranquility Gardens,Residential,Micro,Lowrise,Far,Close,4,4,1348,20,24,4768,253 +1994,TG-123,Tranquility Gardens,Residential,Micro,Lowrise,Far,Close,7,5,1327,28,35,4719,275 +1994,TG-134,Tranquility Gardens,Residential,Micro,Lowrise,Far,Close,5,4,1910,21,26,4631,276 +1994,TG-137,Tranquility Gardens,Residential,Micro,Lowrise,Far,Close,10,8,1906,43,53,4741,185 +1994,TG-138,Tranquility Gardens,Residential,Micro,Lowrise,Far,Close,5,4,2131,21,26,4633,266 +1994,TG-150,Tranquility Gardens,Residential,Micro,Lowrise,Far,Close,4,3,1748,16,20,4739,173 +1994,TG-151,Tranquility Gardens,Residential,Micro,Lowrise,Far,Close,4,3,2131,16,20,4636,256 +1994,TG-154,Tranquility Gardens,Residential,Micro,Lowrise,Far,Close,6,5,1590,26,32,4738,163 +1994,TG-170,Tranquility Gardens,Residential,Micro,Lowrise,Far,Close,4,3,1228,16,20,4735,148 +1994,TG-258,Tranquility Gardens,Residential,Micro,Lowrise,Far,Close,4,3,1751,19,23,4653,256 +1994,TG-298,Tranquility Gardens,Residential,Micro,Lowrise,Far,Close,4,3,2068,16,20,4659,300 +1994,TG-592,Tranquility Gardens,Residential,Micro,Lowrise,Far,Close,4,3,2010,18,22,2456,290 +1994,TG-593,Tranquility Gardens,Residential,Micro,Lowrise,Far,Close,4,3,2025,16,20,2412,289 +1994,TG-603,Tranquility Gardens,Residential,Micro,Lowrise,Far,Close,4,3,1205,16,20,2032,277 +1994,TG-604,Tranquility Gardens,Residential,Micro,Lowrise,Far,Close,4,4,1205,20,24,2017,275 +1994,TG-605,Tranquility Gardens,Residential,Micro,Lowrise,Far,Close,4,4,1205,20,24,2003,273 +1994,TG-608,Tranquility Gardens,Residential,Micro,Lowrise,Far,Close,4,3,2062,16,20,2708,288 +1994,TG-612,Tranquility Gardens,Residential,Micro,Lowrise,Far,Close,4,3,2126,19,23,2433,254 +1994,TG-613,Tranquility Gardens,Residential,Micro,Lowrise,Far,Close,4,3,2139,16,20,2388,253 +1994,TG-618,Tranquility Gardens,Residential,Micro,Lowrise,Far,Close,4,3,2129,16,20,2409,217 +1994,TG-619,Tranquility Gardens,Residential,Micro,Lowrise,Far,Close,4,3,2141,16,20,2364,216 +1994,TG-626,Tranquility Gardens,Residential,Micro,Lowrise,Far,Close,4,4,1438,20,24,2001,223 +1994,TG-628,Tranquility Gardens,Residential,Micro,Lowrise,Far,Close,4,3,1223,16,20,1970,216 +1994,TG-629,Tranquility Gardens,Residential,Micro,Lowrise,Far,Close,4,3,1218,17,21,1955,214 +1994,TG-631,Tranquility Gardens,Residential,Micro,Lowrise,Far,Close,4,3,1371,16,20,2653,229 +1994,TG-634,Tranquility Gardens,Residential,Micro,Lowrise,Far,Close,4,3,2132,17,21,2385,181 +1994,TG-635,Tranquility Gardens,Residential,Micro,Lowrise,Far,Close,4,3,2142,16,20,2340,180 +1994,TG-640,Tranquility Gardens,Residential,Micro,Lowrise,Far,Close,7,6,2143,30,37,2316,143 +2033,SM-16,Space Mind,Commercial,Nano,Lowrise,Far,Medium,10,8,1122,41,51,2054,425 +2033,SM-19,Space Mind,Commercial,Nano,Lowrise,Far,Medium,6,5,1142,26,32,1996,484 +2033,SM-250,Space Mind,Commercial,Nano,Lowrise,Far,Medium,3,3,918,15,18,1431,424 +2033,SM-358,Space Mind,Commercial,Nano,Lowrise,Far,Medium,4,3,947,19,23,1920,316 +2033,SM-360,Space Mind,Commercial,Nano,Lowrise,Far,Medium,5,4,866,22,27,1630,333 +2033,SM-380,Space Mind,Commercial,Nano,Lowrise,Far,Medium,4,3,510,16,20,1941,302 +2033,SM-385,Space Mind,Commercial,Nano,Lowrise,Far,Medium,6,5,629,26,32,1934,302 +2033,SM-392,Space Mind,Commercial,Nano,Lowrise,Far,Medium,4,3,924,16,20,1580,375 +2033,SM-419,Space Mind,Commercial,Nano,Lowrise,Far,Medium,4,3,988,18,22,1850,345 +2033,SM-444,Space Mind,Commercial,Nano,Lowrise,Far,Medium,7,5,657,28,35,1477,466 +2033,SM-479,Space Mind,Commercial,Nano,Lowrise,Far,Medium,4,3,990,16,20,1564,385 +2033,SM-480,Space Mind,Commercial,Nano,Lowrise,Far,Medium,6,5,1014,28,34,1516,426 +2033,SM-507,Space Mind,Commercial,Nano,Lowrise,Far,Medium,4,3,733,16,20,1407,432 +2033,SM-512,Space Mind,Commercial,Nano,Lowrise,Far,Medium,4,3,944,17,21,1467,360 +2033,SM-524,Space Mind,Commercial,Nano,Lowrise,Far,Medium,4,4,968,20,24,1364,361 +2033,SM-545,Space Mind,Commercial,Nano,Lowrise,Far,Medium,5,4,588,21,26,1310,342 +2049,NS-54,North Star,Residential,Micro,Lowrise,Medium,Medium,4,3,2010,16,20,574,306 +2049,NS-55,North Star,Residential,Micro,Lowrise,Medium,Medium,4,3,1897,18,22,551,337 +2049,NS-72,North Star,Residential,Micro,Lowrise,Medium,Medium,8,6,1621,34,42,588,386 +2049,NS-88,North Star,Residential,Micro,Lowrise,Medium,Medium,4,3,1590,17,21,593,402 +2053,SM-38,Space Mind,Commercial,Micro,Lowrise,Far,Far,4,3,2130,16,20,1084,1007 +2053,SM-50,Space Mind,Commercial,Micro,Lowrise,Far,Far,5,4,2073,23,28,981,1106 +2053,SM-53,Space Mind,Commercial,Micro,Lowrise,Far,Far,4,4,2232,20,24,1099,1091 +2053,SM-64,Space Mind,Commercial,Micro,Lowrise,Far,Far,9,7,1495,38,47,1466,991 +2053,SM-65,Space Mind,Commercial,Micro,Lowrise,Far,Far,4,3,1488,17,21,1437,996 +2053,SM-67,Space Mind,Commercial,Micro,Lowrise,Far,Far,4,3,2232,16,20,1090,1129 +2053,SM-74,Space Mind,Commercial,Micro,Lowrise,Far,Far,4,4,1373,20,24,1544,927 +2053,SM-76,Space Mind,Commercial,Micro,Lowrise,Far,Far,4,3,1473,16,20,1486,964 +2053,SM-79,Space Mind,Commercial,Micro,Lowrise,Far,Far,7,6,2128,31,38,1082,1167 +2053,SM-130,Space Mind,Commercial,Micro,Lowrise,Far,Far,4,3,1272,16,20,1193,907 +2053,SM-137,Space Mind,Commercial,Micro,Lowrise,Far,Far,4,3,1320,16,20,1190,898 +2053,SM-202,Space Mind,Commercial,Micro,Lowrise,Far,Far,4,3,1663,17,21,1030,923 +2053,SM-206,Space Mind,Commercial,Micro,Lowrise,Far,Far,4,3,1892,16,20,996,945 +2053,SM-218,Space Mind,Commercial,Micro,Lowrise,Far,Far,4,3,1783,17,21,793,1144 +2053,SM-301,Space Mind,Commercial,Micro,Lowrise,Far,Far,5,4,2016,21,26,978,863 +2053,SM-357,Space Mind,Commercial,Micro,Lowrise,Far,Far,4,3,1359,17,21,758,1081 +2053,SM-409,Space Mind,Commercial,Micro,Lowrise,Far,Far,6,5,1547,25,31,659,1183 +2053,SM-413,Space Mind,Commercial,Micro,Lowrise,Far,Far,4,3,1599,17,21,688,1157 +2053,SM-431,Space Mind,Commercial,Micro,Lowrise,Far,Far,3,3,1449,15,18,986,670 +2072,HH-843,Haven Heights,Residential,Micro,Lowrise,Medium,Medium,4,4,1975,20,24,448,599 +2073,SM-229,Space Mind,Residential,Nano,Lowrise,Far,Close,4,3,1095,19,23,1599,264 +2073,SM-230,Space Mind,Residential,Nano,Lowrise,Far,Close,4,3,715,17,21,1612,207 +2073,SM-231,Space Mind,Residential,Nano,Lowrise,Far,Close,4,3,697,16,20,1584,263 +2073,SM-235,Space Mind,Residential,Nano,Lowrise,Far,Close,4,3,713,16,20,1600,206 +2073,SM-236,Space Mind,Residential,Nano,Lowrise,Far,Close,4,4,697,20,24,1572,263 +2073,SM-241,Space Mind,Residential,Nano,Lowrise,Far,Close,4,3,712,19,23,1589,207 +2073,SM-242,Space Mind,Residential,Nano,Lowrise,Far,Close,4,3,697,17,21,1561,263 +2073,SM-247,Space Mind,Residential,Nano,Lowrise,Far,Close,4,3,668,19,23,1578,209 +2073,SM-248,Space Mind,Residential,Nano,Lowrise,Far,Close,4,3,619,17,21,1550,264 +2073,SM-389,Space Mind,Residential,Nano,Lowrise,Far,Close,5,4,749,21,26,1926,299 +2073,SM-418,Space Mind,Residential,Nano,Lowrise,Far,Close,4,4,938,20,24,1894,293 +2073,SM-426,Space Mind,Residential,Nano,Lowrise,Far,Close,6,4,907,24,30,1883,296 +2073,SM-442,Space Mind,Residential,Nano,Lowrise,Far,Close,5,4,846,23,28,1871,295 +2073,SM-457,Space Mind,Residential,Nano,Lowrise,Far,Close,4,3,723,18,22,1849,272 +2073,SM-458,Space Mind,Residential,Nano,Lowrise,Far,Close,4,3,1026,16,20,1809,298 +2073,SM-472,Space Mind,Residential,Nano,Lowrise,Far,Close,4,4,632,20,24,1838,257 +2073,SM-526,Space Mind,Residential,Nano,Lowrise,Far,Close,4,4,908,20,24,1623,141 +2090,DZ-9,District ZERO,Commercial,Nano,Lowrise,Far,Medium,4,3,1094,17,21,1200,361 +2090,DZ-11,District ZERO,Commercial,Nano,Lowrise,Far,Medium,4,3,1091,16,20,1240,352 +2090,DZ-93,District ZERO,Commercial,Nano,Lowrise,Far,Medium,3,3,1056,15,18,1561,475 +2090,DZ-345,District ZERO,Commercial,Nano,Lowrise,Far,Medium,4,3,954,16,20,1308,600 +2090,DZ-373,District ZERO,Commercial,Nano,Lowrise,Far,Medium,4,3,1049,16,20,1357,486 +2090,DZ-389,District ZERO,Commercial,Nano,Lowrise,Far,Medium,4,3,998,16,20,1364,446 +2090,DZ-454,District ZERO,Commercial,Nano,Lowrise,Far,Medium,4,3,1062,18,22,717,584 +2090,DZ-455,District ZERO,Commercial,Nano,Lowrise,Far,Medium,5,4,1062,24,29,698,599 +2090,DZ-470,District ZERO,Commercial,Nano,Lowrise,Far,Medium,5,4,1026,22,27,746,530 +2090,DZ-489,District ZERO,Commercial,Nano,Lowrise,Far,Medium,11,9,1094,47,58,834,412 +2090,DZ-494,District ZERO,Commercial,Nano,Lowrise,Far,Medium,4,3,1097,16,20,844,395 +2090,DZ-509,District ZERO,Commercial,Nano,Lowrise,Far,Medium,4,3,1056,18,22,794,416 +2090,DZ-512,District ZERO,Commercial,Nano,Lowrise,Far,Medium,4,3,1061,16,20,696,506 +2090,DZ-519,District ZERO,Commercial,Nano,Lowrise,Far,Medium,4,3,1049,19,23,630,559 +2090,DZ-524,District ZERO,Commercial,Nano,Lowrise,Far,Medium,5,4,1053,22,27,870,336 +2090,DZ-529,District ZERO,Commercial,Nano,Lowrise,Far,Medium,4,3,1065,19,23,746,444 +2090,DZ-541,District ZERO,Commercial,Nano,Lowrise,Far,Medium,4,3,1024,16,20,631,506 +2090,DZ-575,District ZERO,Commercial,Nano,Lowrise,Far,Medium,4,3,1138,16,20,741,347 +2090,DZ-595,District ZERO,Commercial,Nano,Lowrise,Far,Medium,4,3,990,16,20,658,338 +2109,NS-137,North Star,Commercial,Nano,Lowrise,Far,Close,4,3,991,18,22,1356,97 +2109,NS-140,North Star,Commercial,Nano,Lowrise,Far,Close,5,4,943,24,29,1263,172 +2109,NS-154,North Star,Commercial,Nano,Lowrise,Far,Close,5,4,964,21,26,1266,202 +2109,NS-155,North Star,Commercial,Nano,Lowrise,Far,Close,4,3,1168,18,22,1224,211 +2109,NS-298,North Star,Commercial,Nano,Lowrise,Far,Close,4,3,1052,19,23,1855,262 +2109,NS-299,North Star,Commercial,Nano,Lowrise,Far,Close,4,3,1028,19,23,1817,290 +2109,NS-335,North Star,Commercial,Nano,Lowrise,Far,Close,4,3,1106,17,21,1885,183 +2109,NS-337,North Star,Commercial,Nano,Lowrise,Far,Close,4,3,1106,16,20,1842,220 +2109,NS-426,North Star,Commercial,Nano,Lowrise,Far,Close,5,4,826,22,27,1923,92 +2109,NS-428,North Star,Commercial,Nano,Lowrise,Far,Close,4,3,1147,18,22,1884,131 +2109,NS-432,North Star,Commercial,Nano,Lowrise,Far,Close,6,5,1049,26,32,1748,267 +2109,NS-476,North Star,Commercial,Nano,Lowrise,Far,Close,5,4,1158,22,27,1842,182 +2109,NS-503,North Star,Commercial,Nano,Lowrise,Far,Close,4,3,998,16,20,1751,276 +2122,TG-40,Tranquility Gardens,Commercial,Nano,Lowrise,Far,Medium,4,3,756,16,20,2430,425 +2122,TG-41,Tranquility Gardens,Commercial,Nano,Lowrise,Far,Medium,5,4,863,21,26,2415,419 +2122,TG-44,Tranquility Gardens,Commercial,Nano,Lowrise,Far,Medium,4,3,863,16,20,2366,398 +2122,TG-54,Tranquility Gardens,Commercial,Nano,Lowrise,Far,Medium,4,3,878,16,20,2417,469 +2122,TG-58,Tranquility Gardens,Commercial,Nano,Lowrise,Far,Medium,6,4,760,24,30,2354,441 +2122,TG-60,Tranquility Gardens,Commercial,Nano,Lowrise,Far,Medium,4,3,496,16,20,2771,473 +2122,TG-62,Tranquility Gardens,Commercial,Nano,Lowrise,Far,Medium,4,3,765,16,20,2825,521 +2122,TG-64,Tranquility Gardens,Commercial,Nano,Lowrise,Far,Medium,4,3,922,16,20,2803,531 +2122,TG-91,Tranquility Gardens,Commercial,Nano,Lowrise,Far,Medium,4,3,955,16,20,4415,472 +2122,TG-96,Tranquility Gardens,Commercial,Nano,Lowrise,Far,Medium,7,5,928,29,36,4476,424 +2122,TG-143,Tranquility Gardens,Commercial,Nano,Lowrise,Far,Medium,4,3,1025,16,20,4506,379 +2122,TG-147,Tranquility Gardens,Commercial,Nano,Lowrise,Far,Medium,5,4,995,21,26,4431,450 +2122,TG-163,Tranquility Gardens,Commercial,Nano,Lowrise,Far,Medium,7,5,1033,28,35,4458,417 +2122,TG-214,Tranquility Gardens,Commercial,Nano,Lowrise,Far,Medium,4,3,767,16,20,4551,341 +2122,TG-289,Tranquility Gardens,Commercial,Nano,Lowrise,Far,Medium,4,3,1055,16,20,4645,322 +2122,TG-351,Tranquility Gardens,Commercial,Nano,Lowrise,Far,Medium,4,3,1098,17,21,4458,433 +2122,TG-355,Tranquility Gardens,Commercial,Nano,Lowrise,Far,Medium,5,4,1135,20,25,4392,484 +2122,TG-363,Tranquility Gardens,Commercial,Nano,Lowrise,Far,Medium,4,3,1065,19,23,4250,533 +2122,TG-370,Tranquility Gardens,Commercial,Nano,Lowrise,Far,Medium,4,3,1129,16,20,4408,401 +2122,TG-372,Tranquility Gardens,Commercial,Nano,Lowrise,Far,Medium,4,3,1122,16,20,4375,426 +2122,TG-453,Tranquility Gardens,Commercial,Nano,Lowrise,Far,Medium,4,3,1135,16,20,3543,577 +2122,TG-459,Tranquility Gardens,Commercial,Nano,Lowrise,Far,Medium,4,3,922,19,23,3527,564 +2122,TG-463,Tranquility Gardens,Commercial,Nano,Lowrise,Far,Medium,4,3,689,16,20,3511,551 +2122,TG-511,Tranquility Gardens,Commercial,Nano,Lowrise,Far,Medium,4,3,1021,16,20,3109,518 +2122,TG-513,Tranquility Gardens,Commercial,Nano,Lowrise,Far,Medium,4,3,1021,16,20,3079,536 +2122,TG-518,Tranquility Gardens,Commercial,Nano,Lowrise,Far,Medium,4,3,1153,16,20,2770,564 +2122,TG-521,Tranquility Gardens,Commercial,Nano,Lowrise,Far,Medium,4,3,992,17,21,2754,545 +2122,TG-535,Tranquility Gardens,Commercial,Nano,Lowrise,Far,Medium,4,4,1012,20,24,3055,472 +2122,TG-548,Tranquility Gardens,Commercial,Nano,Lowrise,Far,Medium,4,4,925,20,24,2632,461 +2122,TG-551,Tranquility Gardens,Commercial,Nano,Lowrise,Far,Medium,4,3,792,16,20,2133,445 +2122,TG-560,Tranquility Gardens,Commercial,Nano,Lowrise,Far,Medium,4,3,1093,16,20,2513,435 +2122,TG-563,Tranquility Gardens,Commercial,Nano,Lowrise,Far,Medium,4,3,960,16,20,2607,423 +2122,TG-568,Tranquility Gardens,Commercial,Nano,Lowrise,Far,Medium,7,5,1095,29,36,2486,397 +2122,TG-581,Tranquility Gardens,Commercial,Nano,Lowrise,Far,Medium,5,4,962,24,29,2581,385 +2122,TG-582,Tranquility Gardens,Commercial,Nano,Lowrise,Far,Medium,4,3,1091,16,20,2516,378 +2122,TG-607,Tranquility Gardens,Commercial,Nano,Lowrise,Far,Medium,4,3,1117,16,20,2784,317 +2158,DZ-72,District ZERO,Commercial,Micro,Lowrise,Far,Far,4,3,2232,16,20,1311,633 +2158,DZ-89,District ZERO,Commercial,Micro,Lowrise,Far,Far,4,3,2397,18,22,1396,678 +2158,DZ-156,District ZERO,Commercial,Micro,Lowrise,Far,Far,4,3,2038,16,20,971,845 +2158,DZ-157,District ZERO,Commercial,Micro,Lowrise,Far,Far,4,3,2276,16,20,916,893 +2158,DZ-158,District ZERO,Commercial,Micro,Lowrise,Far,Far,4,3,2276,19,23,897,909 +2158,DZ-223,District ZERO,Commercial,Micro,Lowrise,Far,Far,4,3,1800,16,20,1315,864 +2158,DZ-230,District ZERO,Commercial,Micro,Lowrise,Far,Far,4,3,1480,16,20,1103,1037 +2158,DZ-233,District ZERO,Commercial,Micro,Lowrise,Far,Far,4,3,1841,16,20,1248,935 +2158,DZ-240,District ZERO,Commercial,Micro,Lowrise,Far,Far,7,6,1834,31,38,1306,899 +2158,DZ-242,District ZERO,Commercial,Micro,Lowrise,Far,Far,4,3,1836,16,20,1303,912 +2158,DZ-243,District ZERO,Commercial,Micro,Lowrise,Far,Far,4,3,1845,16,20,1241,970 +2169,TG-118,Tranquility Gardens,Commercial,Micro,Lowrise,Far,Far,4,3,1301,16,20,4280,618 +2169,TG-148,Tranquility Gardens,Commercial,Micro,Lowrise,Far,Far,4,3,1483,16,20,3316,803 +2169,TG-166,Tranquility Gardens,Commercial,Micro,Lowrise,Far,Far,5,4,1545,23,28,4269,606 +2169,TG-174,Tranquility Gardens,Commercial,Micro,Lowrise,Far,Far,5,4,1638,21,26,3186,916 +2169,TG-179,Tranquility Gardens,Commercial,Micro,Lowrise,Far,Far,4,3,1512,16,20,4269,611 +2169,TG-185,Tranquility Gardens,Commercial,Micro,Lowrise,Far,Far,4,3,1684,16,20,3147,994 +2169,TG-191,Tranquility Gardens,Commercial,Micro,Lowrise,Far,Far,5,4,1370,20,25,3208,999 +2169,TG-194,Tranquility Gardens,Commercial,Micro,Lowrise,Far,Far,5,4,1258,22,27,3048,1064 +2169,TG-216,Tranquility Gardens,Commercial,Micro,Lowrise,Far,Far,4,3,1643,17,21,3009,1157 +2169,TG-239,Tranquility Gardens,Commercial,Micro,Lowrise,Far,Far,4,3,2326,16,20,3596,1116 +2169,TG-241,Tranquility Gardens,Commercial,Micro,Lowrise,Far,Far,4,3,2211,16,20,4307,620 +2169,TG-250,Tranquility Gardens,Commercial,Micro,Lowrise,Far,Far,5,4,2029,24,29,3461,1265 +2169,TG-253,Tranquility Gardens,Commercial,Micro,Lowrise,Far,Far,4,3,2123,16,20,3406,1273 +2169,TG-256,Tranquility Gardens,Commercial,Micro,Lowrise,Far,Far,4,4,2138,20,24,3294,1317 +2169,TG-268,Tranquility Gardens,Commercial,Micro,Lowrise,Far,Far,5,4,1562,21,26,3458,1376 +2169,TG-287,Tranquility Gardens,Commercial,Micro,Lowrise,Far,Far,6,5,2092,28,34,3301,1429 +2169,TG-321,Tranquility Gardens,Commercial,Micro,Lowrise,Far,Far,7,5,1266,29,36,4040,803 +2169,TG-332,Tranquility Gardens,Commercial,Micro,Lowrise,Far,Far,4,3,1238,16,20,4080,762 +2169,TG-334,Tranquility Gardens,Commercial,Micro,Lowrise,Far,Far,4,4,1435,20,24,3030,1294 +2169,TG-335,Tranquility Gardens,Commercial,Micro,Lowrise,Far,Far,4,3,1533,16,20,2992,1291 +2169,TG-345,Tranquility Gardens,Commercial,Micro,Lowrise,Far,Far,4,3,1635,16,20,3894,863 +2169,TG-377,Tranquility Gardens,Commercial,Micro,Lowrise,Far,Far,4,3,2168,17,21,3859,731 +2169,TG-390,Tranquility Gardens,Commercial,Micro,Lowrise,Far,Far,5,4,1752,23,28,3772,681 +2169,TG-394,Tranquility Gardens,Commercial,Micro,Lowrise,Far,Far,4,3,1422,16,20,3689,736 +2169,TG-419,Tranquility Gardens,Commercial,Micro,Lowrise,Far,Far,4,3,1420,16,20,3694,661 +2169,TG-439,Tranquility Gardens,Commercial,Micro,Lowrise,Far,Far,4,3,1562,16,20,3576,605 +2169,TG-447,Tranquility Gardens,Commercial,Micro,Lowrise,Far,Far,4,3,2294,16,20,3287,740 +2169,TG-451,Tranquility Gardens,Commercial,Micro,Lowrise,Far,Far,5,4,1968,22,27,3218,797 +2169,TG-499,Tranquility Gardens,Commercial,Micro,Lowrise,Far,Far,4,3,2213,17,21,2591,619 +2198,DZ-1,District ZERO,Residential,Nano,Lowrise,Far,Close,4,3,977,16,20,1268,294 +2198,DZ-400,District ZERO,Residential,Nano,Lowrise,Far,Close,4,3,1135,16,20,1521,276 +2198,DZ-409,District ZERO,Residential,Nano,Lowrise,Far,Close,4,4,1135,20,24,1524,247 +2198,DZ-411,District ZERO,Residential,Nano,Lowrise,Far,Close,5,4,1082,20,25,1526,234 +2198,DZ-414,District ZERO,Residential,Nano,Lowrise,Far,Close,4,3,587,16,20,1698,108 +2198,DZ-415,District ZERO,Residential,Nano,Lowrise,Far,Close,4,3,887,16,20,1680,115 +2198,DZ-416,District ZERO,Residential,Nano,Lowrise,Far,Close,4,3,1176,16,20,1661,122 +2198,DZ-432,District ZERO,Residential,Nano,Lowrise,Far,Close,4,3,874,16,20,1526,153 +2198,DZ-433,District ZERO,Residential,Nano,Lowrise,Far,Close,4,3,1192,19,23,1471,189 +2198,DZ-469,District ZERO,Residential,Nano,Lowrise,Far,Close,4,4,1105,20,24,1171,171 +2198,DZ-506,District ZERO,Residential,Nano,Lowrise,Far,Close,4,3,1190,18,22,1099,139 +2198,DZ-522,District ZERO,Residential,Nano,Lowrise,Far,Close,6,5,782,28,34,1097,135 +2198,DZ-523,District ZERO,Residential,Nano,Lowrise,Far,Close,4,3,1024,16,20,925,286 +2198,DZ-527,District ZERO,Residential,Nano,Lowrise,Far,Close,4,3,1024,16,20,928,277 +2198,DZ-563,District ZERO,Residential,Nano,Lowrise,Far,Close,11,9,1098,47,58,798,300 +2198,DZ-567,District ZERO,Residential,Nano,Lowrise,Far,Close,4,3,1135,18,22,799,294 +2198,DZ-586,District ZERO,Residential,Nano,Lowrise,Far,Close,4,3,1082,16,20,739,280 +2198,DZ-588,District ZERO,Residential,Nano,Lowrise,Far,Close,4,3,892,16,20,735,136 +2198,DZ-589,District ZERO,Residential,Nano,Lowrise,Far,Close,8,6,943,34,42,715,182 +2198,DZ-591,District ZERO,Residential,Nano,Lowrise,Far,Close,8,6,977,32,40,697,176 +2198,DZ-592,District ZERO,Residential,Nano,Lowrise,Far,Close,5,4,1018,23,28,672,261 +2198,DZ-593,District ZERO,Residential,Nano,Lowrise,Far,Close,5,4,1018,22,27,668,280 +2198,DZ-606,District ZERO,Residential,Nano,Lowrise,Far,Close,4,3,789,19,23,699,125 +2198,DZ-607,District ZERO,Residential,Nano,Lowrise,Far,Close,4,3,979,16,20,662,166 +2198,DZ-608,District ZERO,Residential,Nano,Lowrise,Far,Close,4,3,656,16,20,663,119 +2198,DZ-610,District ZERO,Residential,Nano,Lowrise,Far,Close,4,3,993,16,20,609,263 +2198,DZ-611,District ZERO,Residential,Nano,Lowrise,Far,Close,4,3,993,16,20,605,282 +2225,HH-4,Haven Heights,Commercial,Nano,Lowrise,Far,Close,4,3,986,16,20,964,153 +2225,HH-16,Haven Heights,Commercial,Nano,Lowrise,Far,Close,9,7,1091,36,45,924,259 +2225,HH-27,Haven Heights,Commercial,Nano,Lowrise,Far,Close,4,4,975,20,24,955,275 +2225,HH-48,Haven Heights,Commercial,Nano,Lowrise,Far,Close,4,3,1017,16,20,1765,163 +2225,HH-49,Haven Heights,Commercial,Nano,Lowrise,Far,Close,4,3,987,16,20,1749,172 +2225,HH-63,Haven Heights,Commercial,Nano,Lowrise,Far,Close,4,3,760,19,23,1759,115 +2225,HH-70,Haven Heights,Commercial,Nano,Lowrise,Far,Close,4,3,836,16,20,1514,146 +2225,HH-72,Haven Heights,Commercial,Nano,Lowrise,Far,Close,6,5,871,25,31,1480,158 +2225,HH-94,Haven Heights,Commercial,Nano,Lowrise,Far,Close,4,3,1184,16,20,1279,278 +2225,HH-230,Haven Heights,Commercial,Nano,Lowrise,Far,Close,4,4,774,20,24,2288,146 +2225,HH-502,Haven Heights,Commercial,Nano,Lowrise,Far,Close,4,3,881,16,20,1540,241 +2225,HH-551,Haven Heights,Commercial,Nano,Lowrise,Far,Close,8,6,1047,33,41,1585,123 +2225,HH-606,Haven Heights,Commercial,Nano,Lowrise,Far,Close,4,3,906,16,20,1833,117 +2225,HH-675,Haven Heights,Commercial,Nano,Lowrise,Far,Close,4,3,1024,17,21,1730,237 +2225,HH-685,Haven Heights,Commercial,Nano,Lowrise,Far,Close,4,3,1026,16,20,1723,273 +2225,HH-819,Haven Heights,Commercial,Nano,Lowrise,Far,Close,4,3,1082,16,20,1451,276 +2225,HH-828,Haven Heights,Commercial,Nano,Lowrise,Far,Close,3,3,872,15,18,891,162 +2225,HH-887,Haven Heights,Commercial,Nano,Lowrise,Far,Close,4,3,938,16,20,1014,120 +2225,HH-958,Haven Heights,Commercial,Nano,Lowrise,Far,Close,3,3,979,15,18,1187,283 +2244,TG-12,Tranquility Gardens,Residential,Nano,Lowrise,Far,Close,4,3,1074,16,20,4331,112 +2244,TG-13,Tranquility Gardens,Residential,Nano,Lowrise,Far,Close,4,3,1056,16,20,4289,114 +2244,TG-14,Tranquility Gardens,Residential,Nano,Lowrise,Far,Close,4,3,991,19,23,4247,108 +2244,TG-19,Tranquility Gardens,Residential,Nano,Lowrise,Far,Close,4,3,1135,17,21,4374,132 +2244,TG-20,Tranquility Gardens,Residential,Nano,Lowrise,Far,Close,6,5,1135,26,32,4331,138 +2244,TG-21,Tranquility Gardens,Residential,Nano,Lowrise,Far,Close,4,3,1135,16,20,4289,139 +2244,TG-22,Tranquility Gardens,Residential,Nano,Lowrise,Far,Close,4,3,1082,16,20,4247,134 +2244,TG-23,Tranquility Gardens,Residential,Nano,Lowrise,Far,Close,5,4,723,20,25,4460,207 +2244,TG-24,Tranquility Gardens,Residential,Nano,Lowrise,Far,Close,4,3,760,16,20,4418,200 +2244,TG-25,Tranquility Gardens,Residential,Nano,Lowrise,Far,Close,4,3,766,16,20,4375,199 +2244,TG-26,Tranquility Gardens,Residential,Nano,Lowrise,Far,Close,4,3,772,16,20,4332,205 +2244,TG-27,Tranquility Gardens,Residential,Nano,Lowrise,Far,Close,4,3,743,19,23,4247,201 +2244,TG-31,Tranquility Gardens,Residential,Nano,Lowrise,Far,Close,4,3,715,16,20,4460,225 +2244,TG-33,Tranquility Gardens,Residential,Nano,Lowrise,Far,Close,6,5,771,26,32,4333,223 +2244,TG-34,Tranquility Gardens,Residential,Nano,Lowrise,Far,Close,4,3,779,16,20,4290,224 +2244,TG-35,Tranquility Gardens,Residential,Nano,Lowrise,Far,Close,4,3,750,16,20,4248,220 +2244,TG-74,Tranquility Gardens,Residential,Nano,Lowrise,Far,Close,7,6,533,32,39,4566,300 +2244,TG-104,Tranquility Gardens,Residential,Nano,Lowrise,Far,Close,6,5,652,28,34,4830,263 +2244,TG-120,Tranquility Gardens,Residential,Nano,Lowrise,Far,Close,5,4,795,22,27,4815,233 +2244,TG-260,Tranquility Gardens,Residential,Nano,Lowrise,Far,Close,4,3,1098,16,20,4751,221 +2244,TG-261,Tranquility Gardens,Residential,Nano,Lowrise,Far,Close,4,3,1099,19,23,4704,268 +2244,TG-265,Tranquility Gardens,Residential,Nano,Lowrise,Far,Close,4,3,1135,16,20,4740,231 +2244,TG-275,Tranquility Gardens,Residential,Nano,Lowrise,Far,Close,4,3,1135,16,20,4728,242 +2244,TG-279,Tranquility Gardens,Residential,Nano,Lowrise,Far,Close,7,5,1135,29,36,4716,252 +2244,TG-283,Tranquility Gardens,Residential,Nano,Lowrise,Far,Close,5,4,1135,22,27,4705,262 +2244,TG-594,Tranquility Gardens,Residential,Nano,Lowrise,Far,Close,6,5,961,27,33,2354,286 +2244,TG-595,Tranquility Gardens,Residential,Nano,Lowrise,Far,Close,4,3,993,16,20,2325,282 +2244,TG-596,Tranquility Gardens,Residential,Nano,Lowrise,Far,Close,4,3,993,16,20,2311,282 +2244,TG-597,Tranquility Gardens,Residential,Nano,Lowrise,Far,Close,4,3,993,16,20,2296,282 +2244,TG-598,Tranquility Gardens,Residential,Nano,Lowrise,Far,Close,5,4,965,23,28,2283,280 +2244,TG-599,Tranquility Gardens,Residential,Nano,Lowrise,Far,Close,4,3,980,17,21,2234,279 +2244,TG-600,Tranquility Gardens,Residential,Nano,Lowrise,Far,Close,6,5,694,26,32,2202,273 +2244,TG-601,Tranquility Gardens,Residential,Nano,Lowrise,Far,Close,4,3,820,16,20,2059,286 +2244,TG-606,Tranquility Gardens,Residential,Nano,Lowrise,Far,Close,4,3,1173,16,20,1989,273 +2244,TG-609,Tranquility Gardens,Residential,Nano,Lowrise,Far,Close,4,3,979,16,20,2220,261 +2244,TG-610,Tranquility Gardens,Residential,Nano,Lowrise,Far,Close,4,3,753,16,20,2187,254 +2244,TG-614,Tranquility Gardens,Residential,Nano,Lowrise,Far,Close,4,3,980,16,20,2206,242 +2244,TG-615,Tranquility Gardens,Residential,Nano,Lowrise,Far,Close,4,3,812,19,23,2172,234 +2244,TG-621,Tranquility Gardens,Residential,Nano,Lowrise,Far,Close,4,3,1013,16,20,2299,224 +2244,TG-623,Tranquility Gardens,Residential,Nano,Lowrise,Far,Close,4,3,981,16,20,2241,221 +2244,TG-624,Tranquility Gardens,Residential,Nano,Lowrise,Far,Close,5,4,980,22,27,2193,223 +2244,TG-632,Tranquility Gardens,Residential,Nano,Lowrise,Far,Close,4,3,937,16,20,2179,204 +2244,TG-633,Tranquility Gardens,Residential,Nano,Lowrise,Far,Close,8,6,871,32,40,2143,197 +2244,TG-637,Tranquility Gardens,Residential,Nano,Lowrise,Far,Close,6,5,679,26,32,2211,158 +2244,TG-638,Tranquility Gardens,Residential,Nano,Lowrise,Far,Close,4,3,624,17,21,2145,156 +2244,TG-641,Tranquility Gardens,Residential,Nano,Lowrise,Far,Close,4,3,714,16,20,2246,148 +2244,TG-642,Tranquility Gardens,Residential,Nano,Lowrise,Far,Close,5,4,661,21,26,2136,144 +2244,TG-644,Tranquility Gardens,Residential,Nano,Lowrise,Far,Close,4,3,713,19,23,2238,135 +2244,TG-646,Tranquility Gardens,Residential,Nano,Lowrise,Far,Close,4,4,661,20,24,2128,132 +2244,TG-647,Tranquility Gardens,Residential,Nano,Lowrise,Far,Close,6,5,644,25,31,2089,123 +2244,TG-650,Tranquility Gardens,Residential,Nano,Lowrise,Far,Close,5,4,715,23,28,2185,120 +2244,TG-651,Tranquility Gardens,Residential,Nano,Lowrise,Far,Close,4,3,660,16,20,2119,119 +2244,TG-653,Tranquility Gardens,Residential,Nano,Lowrise,Far,Close,4,3,712,16,20,2222,111 +2244,TG-657,Tranquility Gardens,Residential,Nano,Lowrise,Far,Close,4,3,553,17,21,2102,95 +2244,TG-658,Tranquility Gardens,Residential,Nano,Lowrise,Far,Close,4,3,540,18,22,2063,87 +2299,NS-32,North Star,Residential,Nano,Lowrise,Medium,Medium,4,3,1134,19,23,361,336 +2299,NS-41,North Star,Residential,Nano,Lowrise,Medium,Medium,3,3,1047,15,18,450,301 +2299,NS-42,North Star,Residential,Nano,Lowrise,Medium,Medium,6,5,1047,26,32,441,307 +2299,NS-43,North Star,Residential,Nano,Lowrise,Medium,Medium,4,3,1047,18,22,431,313 +2299,NS-44,North Star,Residential,Nano,Lowrise,Medium,Medium,4,3,1047,16,20,423,320 +2299,NS-46,North Star,Residential,Nano,Lowrise,Medium,Medium,4,3,1172,16,20,301,370 +2299,NS-47,North Star,Residential,Nano,Lowrise,Medium,Medium,4,3,1171,16,20,356,373 +2299,NS-49,North Star,Residential,Nano,Lowrise,Medium,Medium,4,3,1171,16,20,352,392 +2299,NS-56,North Star,Residential,Nano,Lowrise,Medium,Medium,3,3,931,15,18,510,354 +2299,NS-57,North Star,Residential,Nano,Lowrise,Medium,Medium,3,3,1042,15,18,501,358 +2299,NS-58,North Star,Residential,Nano,Lowrise,Medium,Medium,10,8,1039,41,51,486,363 +2299,NS-59,North Star,Residential,Nano,Lowrise,Medium,Medium,9,7,1035,38,47,467,368 +2299,NS-60,North Star,Residential,Nano,Lowrise,Medium,Medium,4,3,1032,19,23,449,374 +2299,NS-61,North Star,Residential,Nano,Lowrise,Medium,Medium,9,7,917,39,48,432,380 +2299,NS-62,North Star,Residential,Nano,Lowrise,Medium,Medium,4,3,1116,18,22,347,429 +2299,NS-66,North Star,Residential,Nano,Lowrise,Medium,Medium,10,8,1156,40,50,347,478 +2299,NS-73,North Star,Residential,Nano,Lowrise,Medium,Medium,3,3,1022,15,18,503,447 +2299,NS-74,North Star,Residential,Nano,Lowrise,Medium,Medium,3,2,1022,12,15,450,461 +2299,NS-75,North Star,Residential,Nano,Lowrise,Medium,Medium,2,2,1194,12,14,349,496 +2299,NS-77,North Star,Residential,Nano,Lowrise,Medium,Medium,3,3,1022,15,18,506,467 +2299,NS-79,North Star,Residential,Nano,Lowrise,Medium,Medium,2,2,1194,12,14,352,514 +2299,NS-81,North Star,Residential,Nano,Lowrise,Medium,Medium,3,2,1022,13,16,509,479 +2299,NS-83,North Star,Residential,Nano,Lowrise,Medium,Medium,2,2,1194,11,13,354,533 +2299,NS-89,North Star,Residential,Nano,Lowrise,Medium,Medium,3,2,1022,13,16,508,487 +2299,NS-90,North Star,Residential,Nano,Lowrise,Medium,Medium,3,2,1022,13,16,455,518 +2299,NS-91,North Star,Residential,Nano,Lowrise,Medium,Medium,2,2,1194,12,14,353,551 +2299,NS-93,North Star,Residential,Nano,Lowrise,Medium,Medium,3,2,974,13,16,508,488 +2299,NS-97,North Star,Residential,Nano,Lowrise,Medium,Medium,3,3,873,15,18,532,480 +2299,NS-98,North Star,Residential,Nano,Lowrise,Medium,Medium,3,3,980,15,18,515,497 +2299,NS-99,North Star,Residential,Nano,Lowrise,Medium,Medium,5,4,980,22,27,497,515 +2299,NS-100,North Star,Residential,Nano,Lowrise,Medium,Medium,4,3,980,16,20,478,533 +2299,NS-101,North Star,Residential,Nano,Lowrise,Medium,Medium,4,3,980,16,20,460,551 +2299,NS-102,North Star,Residential,Nano,Lowrise,Medium,Medium,5,4,873,22,27,443,569 +2299,NS-110,North Star,Residential,Nano,Lowrise,Medium,Medium,3,3,871,15,18,536,495 +2299,NS-111,North Star,Residential,Nano,Lowrise,Medium,Medium,3,3,975,15,18,519,512 +2299,NS-112,North Star,Residential,Nano,Lowrise,Medium,Medium,4,3,971,17,21,501,530 +2299,NS-113,North Star,Residential,Nano,Lowrise,Medium,Medium,4,3,968,17,21,483,548 +2299,NS-115,North Star,Residential,Nano,Lowrise,Medium,Medium,4,3,857,16,20,447,582 +2299,NS-126,North Star,Residential,Nano,Lowrise,Medium,Medium,3,3,989,15,18,524,534 +2299,NS-127,North Star,Residential,Nano,Lowrise,Medium,Medium,4,3,989,19,23,470,584 +2299,NS-132,North Star,Residential,Nano,Lowrise,Medium,Medium,5,4,1022,23,28,471,590 +2299,NS-145,North Star,Residential,Nano,Lowrise,Medium,Medium,3,3,1022,15,18,526,549 +2299,NS-146,North Star,Residential,Nano,Lowrise,Medium,Medium,10,8,1022,41,51,473,598 +2299,NS-150,North Star,Residential,Nano,Lowrise,Medium,Medium,3,3,1022,15,18,528,558 +2299,NS-170,North Star,Residential,Nano,Lowrise,Medium,Medium,3,3,974,15,18,532,576 +2344,SM-24,Space Mind,Commercial,Nano,Lowrise,Far,Far,5,4,1188,24,29,1432,779 +2344,SM-26,Space Mind,Commercial,Nano,Lowrise,Far,Far,4,3,1016,17,21,1394,792 +2344,SM-33,Space Mind,Commercial,Nano,Lowrise,Far,Far,3,2,1091,14,17,1702,776 +2344,SM-35,Space Mind,Commercial,Nano,Lowrise,Far,Far,3,3,1091,15,18,1665,814 +2344,SM-36,Space Mind,Commercial,Nano,Lowrise,Far,Far,3,3,977,15,18,1647,829 +2344,SM-44,Space Mind,Commercial,Nano,Lowrise,Far,Far,3,2,1052,13,16,1726,754 +2344,SM-55,Space Mind,Commercial,Nano,Lowrise,Far,Far,4,3,1124,17,21,1874,634 +2344,SM-69,Space Mind,Commercial,Nano,Lowrise,Far,Far,5,4,812,21,26,1815,706 +2344,SM-124,Space Mind,Commercial,Nano,Lowrise,Far,Far,5,4,1021,22,27,871,1225 +2344,SM-149,Space Mind,Commercial,Nano,Lowrise,Far,Far,6,4,783,24,30,720,1331 +2344,SM-150,Space Mind,Commercial,Nano,Lowrise,Far,Far,4,3,525,16,20,687,1364 +2344,SM-180,Space Mind,Commercial,Nano,Lowrise,Far,Far,6,5,1065,27,33,831,1160 +2344,SM-300,Space Mind,Commercial,Nano,Lowrise,Far,Far,4,4,1065,20,24,1059,779 +2344,SM-318,Space Mind,Commercial,Nano,Lowrise,Far,Far,4,3,946,17,21,1055,753 +2344,SM-320,Space Mind,Commercial,Nano,Lowrise,Far,Far,7,6,979,30,37,1042,786 +2344,SM-342,Space Mind,Commercial,Nano,Lowrise,Far,Far,6,5,954,26,32,992,802 +2344,SM-344,Space Mind,Commercial,Nano,Lowrise,Far,Far,4,3,954,18,22,972,850 +2344,SM-377,Space Mind,Commercial,Nano,Lowrise,Far,Far,5,4,917,20,25,874,921 +2344,SM-378,Space Mind,Commercial,Nano,Lowrise,Far,Far,4,4,1156,20,24,855,973 +2344,SM-382,Space Mind,Commercial,Nano,Lowrise,Far,Far,7,5,954,29,36,955,766 +2344,SM-383,Space Mind,Commercial,Nano,Lowrise,Far,Far,5,4,982,21,26,924,810 +2344,SM-387,Space Mind,Commercial,Nano,Lowrise,Far,Far,4,3,954,19,23,939,779 +2344,SM-404,Space Mind,Commercial,Nano,Lowrise,Far,Far,4,3,1040,18,22,843,913 +2344,SM-408,Space Mind,Commercial,Nano,Lowrise,Far,Far,4,3,1188,19,23,801,1006 +2344,SM-416,Space Mind,Commercial,Nano,Lowrise,Far,Far,4,3,907,16,20,875,849 +2344,SM-417,Space Mind,Commercial,Nano,Lowrise,Far,Far,4,3,587,16,20,724,1129 +2344,SM-425,Space Mind,Commercial,Nano,Lowrise,Far,Far,4,3,986,16,20,831,877 +2344,SM-432,Space Mind,Commercial,Nano,Lowrise,Far,Far,4,3,993,17,21,849,836 +2344,SM-434,Space Mind,Commercial,Nano,Lowrise,Far,Far,6,4,999,24,30,685,1174 +2344,SM-438,Space Mind,Commercial,Nano,Lowrise,Far,Far,4,3,1035,16,20,623,1237 +2344,SM-469,Space Mind,Commercial,Nano,Lowrise,Far,Far,4,3,1031,16,20,618,1243 +2344,SM-478,Space Mind,Commercial,Nano,Lowrise,Far,Far,6,5,947,25,31,750,929 +2344,SM-481,Space Mind,Commercial,Nano,Lowrise,Far,Far,4,3,1105,16,20,710,958 +2377,NS-95,North Star,Residential,Micro,Lowrise,Medium,Far,6,5,1213,26,32,356,619 +2377,NS-103,North Star,Residential,Micro,Lowrise,Medium,Far,5,4,1259,22,27,358,638 +2377,NS-107,North Star,Residential,Micro,Lowrise,Medium,Far,7,6,1259,31,38,360,660 +2377,NS-116,North Star,Residential,Micro,Lowrise,Medium,Far,4,4,1259,20,24,362,665 +2377,NS-120,North Star,Residential,Micro,Lowrise,Medium,Far,6,5,1206,26,32,366,670 +2377,NS-134,North Star,Residential,Micro,Lowrise,Medium,Far,4,3,1304,18,22,342,713 +2377,NS-163,North Star,Residential,Micro,Lowrise,Medium,Far,4,3,1299,17,21,348,734 +2377,NS-164,North Star,Residential,Micro,Lowrise,Medium,Far,5,4,1296,22,27,324,756 +2377,NS-198,North Star,Residential,Micro,Lowrise,Medium,Far,10,8,2199,43,53,378,761 +2377,NS-199,North Star,Residential,Micro,Lowrise,Medium,Far,9,7,2379,39,48,349,788 +2377,NS-273,North Star,Residential,Micro,Lowrise,Medium,Far,6,5,1714,25,31,368,841 +2377,NS-284,North Star,Residential,Micro,Lowrise,Medium,Far,4,3,1714,18,22,367,853 +2377,NS-294,North Star,Residential,Micro,Lowrise,Medium,Far,4,4,1714,20,24,367,866 +2377,NS-321,North Star,Residential,Micro,Lowrise,Medium,Far,4,3,1714,16,20,367,878 +2377,NS-328,North Star,Residential,Micro,Lowrise,Medium,Far,4,3,1655,18,22,367,891 +2377,NS-366,North Star,Residential,Micro,Lowrise,Medium,Far,5,4,1588,23,28,310,983 +2377,NS-407,North Star,Residential,Micro,Lowrise,Medium,Far,4,3,1444,18,22,399,961 +2377,NS-408,North Star,Residential,Micro,Lowrise,Medium,Far,4,3,1543,16,20,369,981 +2377,NS-409,North Star,Residential,Micro,Lowrise,Medium,Far,10,8,1543,42,52,339,1002 +2377,NS-932,North Star,Residential,Micro,Lowrise,Medium,Far,10,8,1970,44,54,307,911 +2377,NS-941,North Star,Residential,Micro,Lowrise,Medium,Far,15,12,1483,63,78,309,946 +2377,NS-944,North Star,Residential,Micro,Lowrise,Medium,Far,12,10,1501,52,64,311,1004 +2399,HH-845,Haven Heights,Residential,Nano,Lowrise,Medium,Medium,4,3,1135,16,20,574,481 +2399,HH-846,Haven Heights,Residential,Nano,Lowrise,Medium,Medium,4,3,1103,16,20,557,500 +2399,HH-850,Haven Heights,Residential,Nano,Lowrise,Medium,Medium,4,3,1118,16,20,598,470 +2399,HH-851,Haven Heights,Residential,Nano,Lowrise,Medium,Medium,4,4,1095,20,24,578,489 +2399,HH-861,Haven Heights,Residential,Nano,Lowrise,Medium,Medium,4,3,1135,18,22,486,567 +2399,HH-868,Haven Heights,Residential,Nano,Lowrise,Medium,Medium,5,4,1096,22,27,529,522 +2399,HH-869,Haven Heights,Residential,Nano,Lowrise,Medium,Medium,4,3,1129,16,20,510,542 +2399,HH-870,Haven Heights,Residential,Nano,Lowrise,Medium,Medium,5,4,1126,21,26,490,562 +2399,HH-877,Haven Heights,Residential,Nano,Lowrise,Medium,Medium,4,3,1023,16,20,600,454 +2399,HH-886,Haven Heights,Residential,Nano,Lowrise,Medium,Medium,4,3,919,16,20,594,467 +2409,HH-140,Haven Heights,Residential,Micro,Lowrise,Medium,Far,3,3,2011,15,18,533,867 +2409,HH-146,Haven Heights,Residential,Micro,Lowrise,Medium,Far,6,5,2011,27,33,529,893 +2409,HH-168,Haven Heights,Residential,Micro,Lowrise,Medium,Far,4,4,2011,20,24,525,919 +2409,HH-186,Haven Heights,Residential,Micro,Lowrise,Medium,Far,4,3,1908,18,22,523,945 +2409,HH-206,Haven Heights,Residential,Micro,Lowrise,Medium,Far,4,3,1426,16,20,538,1002 +2409,HH-207,Haven Heights,Residential,Micro,Lowrise,Medium,Far,4,3,1380,16,20,443,1068 +2409,HH-209,Haven Heights,Residential,Micro,Lowrise,Medium,Far,6,5,1487,25,31,390,1107 +2409,HH-210,Haven Heights,Residential,Micro,Lowrise,Medium,Far,5,4,1487,23,28,336,1148 +2409,HH-220,Haven Heights,Residential,Micro,Lowrise,Medium,Far,4,3,1426,16,20,541,1016 +2409,HH-229,Haven Heights,Residential,Micro,Lowrise,Medium,Far,5,4,1426,23,28,544,1030 +2409,HH-244,Haven Heights,Residential,Micro,Lowrise,Medium,Far,4,3,1414,16,20,450,1109 +2409,HH-245,Haven Heights,Residential,Micro,Lowrise,Medium,Far,4,3,1521,19,23,423,1127 +2409,HH-246,Haven Heights,Residential,Micro,Lowrise,Medium,Far,5,4,1518,23,28,396,1146 +2409,HH-247,Haven Heights,Residential,Micro,Lowrise,Medium,Far,5,4,1512,21,26,341,1186 +2409,HH-261,Haven Heights,Residential,Micro,Lowrise,Medium,Far,4,3,1212,18,22,346,1231 +2409,HH-277,Haven Heights,Residential,Micro,Lowrise,Medium,Far,4,3,1345,16,20,425,1190 +2409,HH-278,Haven Heights,Residential,Micro,Lowrise,Medium,Far,6,5,1282,27,33,347,1244 +2409,HH-283,Haven Heights,Residential,Micro,Lowrise,Medium,Far,4,3,2120,17,21,563,1114 +2409,HH-288,Haven Heights,Residential,Micro,Lowrise,Medium,Far,7,6,1345,31,38,424,1218 +2409,HH-314,Haven Heights,Residential,Micro,Lowrise,Medium,Far,4,3,1345,16,20,422,1232 +2409,HH-455,Haven Heights,Residential,Micro,Lowrise,Medium,Far,4,3,1329,16,20,387,1432 +2409,HH-487,Haven Heights,Residential,Micro,Lowrise,Medium,Far,4,3,1328,16,20,378,1461 +2409,HH-497,Haven Heights,Residential,Micro,Lowrise,Medium,Far,4,3,1392,16,20,361,1519 +2409,HH-517,Haven Heights,Residential,Micro,Lowrise,Medium,Far,4,3,1455,16,20,574,1433 +2409,HH-548,Haven Heights,Residential,Micro,Lowrise,Medium,Far,4,3,1478,17,21,543,1483 +2409,HH-571,Haven Heights,Residential,Micro,Lowrise,Medium,Far,4,3,1716,16,20,592,1422 +2409,HH-573,Haven Heights,Residential,Micro,Lowrise,Medium,Far,4,3,2006,18,22,430,1596 +2409,HH-579,Haven Heights,Residential,Micro,Lowrise,Medium,Far,4,3,1718,19,23,577,1422 +2409,HH-584,Haven Heights,Residential,Micro,Lowrise,Medium,Far,4,3,1719,16,20,562,1421 +2409,HH-595,Haven Heights,Residential,Micro,Lowrise,Medium,Far,4,3,1391,19,23,594,1340 +2409,HH-596,Haven Heights,Residential,Micro,Lowrise,Medium,Far,4,3,1720,16,20,547,1421 +2409,HH-598,Haven Heights,Residential,Micro,Lowrise,Medium,Far,4,3,1465,16,20,578,1336 +2409,HH-600,Haven Heights,Residential,Micro,Lowrise,Medium,Far,6,5,2275,28,34,446,1560 +2409,HH-623,Haven Heights,Residential,Micro,Lowrise,Medium,Far,8,6,2123,32,40,464,1448 +2409,HH-644,Haven Heights,Residential,Micro,Lowrise,Medium,Far,4,3,1376,16,20,500,1255 +2409,HH-645,Haven Heights,Residential,Micro,Lowrise,Medium,Far,4,3,2098,16,20,483,1289 +2409,HH-646,Haven Heights,Residential,Micro,Lowrise,Medium,Far,4,3,2098,16,20,467,1330 +2409,HH-647,Haven Heights,Residential,Micro,Lowrise,Medium,Far,4,3,2078,16,20,418,1454 +2409,HH-702,Haven Heights,Residential,Micro,Lowrise,Medium,Far,7,5,1851,29,36,409,1234 +2409,HH-703,Haven Heights,Residential,Micro,Lowrise,Medium,Far,4,3,1208,17,21,382,1278 +2409,HH-831,Haven Heights,Residential,Micro,Lowrise,Medium,Far,4,3,1637,16,20,357,630 +2409,HH-832,Haven Heights,Residential,Micro,Lowrise,Medium,Far,5,4,2182,20,25,371,629 +2409,HH-838,Haven Heights,Residential,Micro,Lowrise,Medium,Far,4,3,2041,16,20,414,610 +2409,HH-841,Haven Heights,Residential,Micro,Lowrise,Medium,Far,4,3,2041,17,21,432,604 +2409,HH-842,Haven Heights,Residential,Micro,Lowrise,Medium,Far,4,3,1397,16,20,374,672 +2409,HH-848,Haven Heights,Residential,Micro,Lowrise,Medium,Far,5,4,2066,21,26,400,672 +2409,HH-853,Haven Heights,Residential,Micro,Lowrise,Medium,Far,4,3,2047,16,20,365,700 +2409,HH-854,Haven Heights,Residential,Micro,Lowrise,Medium,Far,4,3,1421,16,20,332,732 +2457,DZ-120,District ZERO,Commercial,Nano,Lowrise,Far,Far,5,4,982,21,26,1179,801 +2457,DZ-241,District ZERO,Commercial,Nano,Lowrise,Far,Far,5,4,744,21,26,1076,1095 +2457,DZ-246,District ZERO,Commercial,Nano,Lowrise,Far,Far,4,3,1137,16,20,1133,1058 +2457,DZ-247,District ZERO,Commercial,Nano,Lowrise,Far,Far,4,3,1009,19,23,1114,1073 +2457,DZ-321,District ZERO,Commercial,Nano,Lowrise,Far,Far,4,3,946,16,20,1357,612 +2457,DZ-327,District ZERO,Commercial,Nano,Lowrise,Far,Far,4,3,939,16,20,1204,707 +2457,DZ-333,District ZERO,Commercial,Nano,Lowrise,Far,Far,4,3,1024,17,21,680,1066 +2457,DZ-350,District ZERO,Commercial,Nano,Lowrise,Far,Far,7,6,1005,31,38,1116,733 +2457,DZ-374,District ZERO,Commercial,Nano,Lowrise,Far,Far,4,3,1091,19,23,907,806 +2457,DZ-380,District ZERO,Commercial,Nano,Lowrise,Far,Far,4,3,1091,16,20,910,792 +2467,TG-175,Tranquility Gardens,Commercial,Nano,Lowrise,Far,Far,4,3,875,16,20,3134,944 +2467,TG-205,Tranquility Gardens,Commercial,Nano,Lowrise,Far,Far,5,4,673,21,26,2941,1155 +2467,TG-297,Tranquility Gardens,Commercial,Nano,Lowrise,Far,Far,7,6,1159,31,38,3182,1356 +2467,TG-302,Tranquility Gardens,Commercial,Nano,Lowrise,Far,Far,5,4,675,23,28,4132,709 +2467,TG-317,Tranquility Gardens,Commercial,Nano,Lowrise,Far,Far,7,6,899,30,37,2900,1331 +2467,TG-456,Tranquility Gardens,Commercial,Nano,Lowrise,Far,Far,4,3,618,16,20,3033,835 +2473,SM-98,Space Mind,Residential,Micro,Lowrise,Far,Medium,4,3,1618,19,23,2185,366 +2473,SM-99,Space Mind,Residential,Micro,Lowrise,Far,Medium,8,6,1706,34,42,2175,388 +2473,SM-101,Space Mind,Residential,Micro,Lowrise,Far,Medium,5,4,1393,24,29,2236,345 +2473,SM-105,Space Mind,Residential,Micro,Lowrise,Far,Medium,5,4,1726,21,26,2231,367 +2473,SM-109,Space Mind,Residential,Micro,Lowrise,Far,Medium,5,4,1721,21,26,2163,389 +2473,SM-112,Space Mind,Residential,Micro,Lowrise,Far,Medium,4,3,1634,19,23,2220,362 +2473,SM-113,Space Mind,Residential,Micro,Lowrise,Far,Medium,6,5,1632,28,34,2158,358 +2473,SM-232,Space Mind,Residential,Micro,Lowrise,Far,Medium,4,4,1250,20,24,1397,513 +2473,SM-238,Space Mind,Residential,Micro,Lowrise,Far,Medium,3,3,1888,15,18,1460,423 +2473,SM-243,Space Mind,Residential,Micro,Lowrise,Far,Medium,4,3,2067,18,22,1380,514 +2473,SM-330,Space Mind,Residential,Micro,Lowrise,Far,Medium,4,3,1940,16,20,1337,332 +2473,SM-340,Space Mind,Residential,Micro,Lowrise,Far,Medium,4,3,1340,16,20,1299,365 +2473,SM-365,Space Mind,Residential,Micro,Lowrise,Far,Medium,5,4,1672,20,25,1186,471 +2473,SM-366,Space Mind,Residential,Micro,Lowrise,Far,Medium,6,4,1501,24,30,1166,495 +2473,SM-368,Space Mind,Residential,Micro,Lowrise,Far,Medium,6,5,1501,27,33,1127,540 +2473,SM-369,Space Mind,Residential,Micro,Lowrise,Far,Medium,9,7,1466,37,46,1108,564 +2473,SM-398,Space Mind,Residential,Micro,Lowrise,Far,Medium,8,6,1525,32,40,1087,573 +2473,SM-399,Space Mind,Residential,Micro,Lowrise,Far,Medium,3,3,1491,15,18,1068,595 +2473,SM-412,Space Mind,Residential,Micro,Lowrise,Far,Medium,4,3,1487,16,20,1105,552 +2492,NS-69,North Star,Commercial,Micro,Lowrise,Far,Medium,4,3,1729,16,20,675,311 +2492,NS-70,North Star,Commercial,Micro,Lowrise,Far,Medium,6,4,1731,24,30,647,338 +2492,NS-71,North Star,Commercial,Micro,Lowrise,Far,Medium,4,3,1733,18,22,617,362 +2492,NS-223,North Star,Commercial,Micro,Lowrise,Far,Medium,4,3,1761,17,21,799,482 +2492,NS-349,North Star,Commercial,Micro,Lowrise,Far,Medium,5,4,2351,23,28,1304,471 +2492,NS-350,North Star,Commercial,Micro,Lowrise,Far,Medium,5,4,2386,20,25,1261,490 +2492,NS-351,North Star,Commercial,Micro,Lowrise,Far,Medium,4,3,2392,16,20,1218,512 +2492,NS-352,North Star,Commercial,Micro,Lowrise,Far,Medium,4,3,2398,16,20,1175,536 +2492,NS-390,North Star,Commercial,Micro,Lowrise,Far,Medium,3,3,2289,15,18,1303,523 +2492,NS-391,North Star,Commercial,Micro,Lowrise,Far,Medium,3,3,2337,15,18,1261,540 +2492,NS-393,North Star,Commercial,Micro,Lowrise,Far,Medium,3,3,2337,15,18,1174,582 +2492,NS-570,North Star,Commercial,Micro,Lowrise,Far,Medium,4,3,1227,16,20,1754,325 +2492,NS-688,North Star,Commercial,Micro,Lowrise,Far,Medium,5,4,1287,20,25,2196,343 +2492,NS-726,North Star,Commercial,Micro,Lowrise,Far,Medium,4,4,1624,20,24,2190,382 +2492,NS-728,North Star,Commercial,Micro,Lowrise,Far,Medium,4,3,1673,16,20,2191,384 +2492,NS-751,North Star,Commercial,Micro,Lowrise,Far,Medium,6,5,1679,25,31,2196,395 +2492,NS-770,North Star,Commercial,Micro,Lowrise,Far,Medium,4,3,1456,16,20,2293,303 +2492,NS-823,North Star,Commercial,Micro,Lowrise,Far,Medium,7,5,1948,29,36,1079,449 +2492,NS-825,North Star,Commercial,Micro,Lowrise,Far,Medium,5,4,1944,22,27,1012,501 +2492,NS-826,North Star,Commercial,Micro,Lowrise,Far,Medium,6,5,1906,26,32,979,528 +2492,NS-848,North Star,Commercial,Micro,Lowrise,Far,Medium,5,4,1908,20,25,1115,385 +2513,DZ-4,District ZERO,Residential,Micro,Lowrise,Far,Medium,4,3,1615,16,20,956,524 +2513,DZ-5,District ZERO,Residential,Micro,Lowrise,Far,Medium,8,7,1616,36,44,939,536 +2513,DZ-6,District ZERO,Residential,Micro,Lowrise,Far,Medium,4,3,1617,16,20,922,548 +2513,DZ-7,District ZERO,Residential,Micro,Lowrise,Far,Medium,4,3,1571,16,20,905,560 +2513,DZ-182,District ZERO,Residential,Micro,Lowrise,Far,Medium,8,6,2042,32,40,1741,383 +2513,DZ-262,District ZERO,Residential,Micro,Lowrise,Far,Medium,8,6,1475,32,40,1982,366 +2513,DZ-264,District ZERO,Residential,Micro,Lowrise,Far,Medium,8,6,1606,32,40,1983,372 +2513,DZ-301,District ZERO,Residential,Micro,Lowrise,Far,Medium,8,6,2091,32,40,1566,538 +2513,DZ-365,District ZERO,Residential,Micro,Lowrise,Far,Medium,8,6,1775,34,42,1588,362 +2513,DZ-408,District ZERO,Residential,Micro,Lowrise,Far,Medium,4,3,2258,16,20,1180,513 +2513,DZ-418,District ZERO,Residential,Micro,Lowrise,Far,Medium,8,6,1212,33,41,1385,304 +2513,DZ-420,District ZERO,Residential,Micro,Lowrise,Far,Medium,4,4,1654,20,24,1157,461 +2513,DZ-425,District ZERO,Residential,Micro,Lowrise,Far,Medium,4,3,1218,19,23,1333,331 +2513,DZ-427,District ZERO,Residential,Micro,Lowrise,Far,Medium,7,6,1986,30,37,1215,414 +2513,DZ-447,District ZERO,Residential,Micro,Lowrise,Far,Medium,4,3,1452,18,22,934,413 +2528,HH-43,Haven Heights,Commercial,Micro,Lowrise,Far,Medium,4,3,1922,16,20,903,363 +2528,HH-97,Haven Heights,Commercial,Micro,Lowrise,Far,Medium,4,3,1695,16,20,1195,308 +2528,HH-110,Haven Heights,Commercial,Micro,Lowrise,Far,Medium,4,3,2003,16,20,1240,373 +2528,HH-111,Haven Heights,Commercial,Micro,Lowrise,Far,Medium,4,3,2002,16,20,1203,385 +2528,HH-123,Haven Heights,Commercial,Micro,Lowrise,Far,Medium,5,4,1885,24,29,1522,303 +2528,HH-125,Haven Heights,Commercial,Micro,Lowrise,Far,Medium,5,4,1431,22,27,1302,415 +2528,HH-129,Haven Heights,Commercial,Micro,Lowrise,Far,Medium,4,3,1931,16,20,1124,469 +2528,HH-169,Haven Heights,Commercial,Micro,Lowrise,Far,Medium,4,3,1873,16,20,1563,379 +2528,HH-199,Haven Heights,Commercial,Micro,Lowrise,Far,Medium,5,4,1534,20,25,1349,596 +2528,HH-264,Haven Heights,Commercial,Micro,Lowrise,Far,Medium,4,3,1673,16,20,1621,383 +2528,HH-265,Haven Heights,Commercial,Micro,Lowrise,Far,Medium,4,3,1711,16,20,1602,402 +2528,HH-266,Haven Heights,Commercial,Micro,Lowrise,Far,Medium,7,6,1705,30,37,1582,423 +2528,HH-267,Haven Heights,Commercial,Micro,Lowrise,Far,Medium,9,7,1693,36,45,1545,465 +2528,HH-290,Haven Heights,Commercial,Micro,Lowrise,Far,Medium,4,3,1222,17,21,1504,502 +2528,HH-296,Haven Heights,Commercial,Micro,Lowrise,Far,Medium,4,3,2171,16,20,1704,355 +2528,HH-391,Haven Heights,Commercial,Micro,Lowrise,Far,Medium,4,3,1319,16,20,1449,574 +2528,HH-420,Haven Heights,Commercial,Micro,Lowrise,Far,Medium,9,7,1539,38,47,1433,559 +2528,HH-434,Haven Heights,Commercial,Micro,Lowrise,Far,Medium,4,3,1472,16,20,1424,544 +2528,HH-447,Haven Heights,Commercial,Micro,Lowrise,Far,Medium,4,3,1774,17,21,1478,461 +2528,HH-448,Haven Heights,Commercial,Micro,Lowrise,Far,Medium,4,3,1277,16,20,1415,529 +2528,HH-563,Haven Heights,Commercial,Micro,Lowrise,Far,Medium,4,3,1454,19,23,1162,524 +2528,HH-564,Haven Heights,Commercial,Micro,Lowrise,Far,Medium,5,4,2353,22,27,1133,559 +2528,HH-589,Haven Heights,Commercial,Micro,Lowrise,Far,Medium,5,4,2298,21,26,1134,513 +2528,HH-590,Haven Heights,Commercial,Micro,Lowrise,Far,Medium,4,3,2295,18,22,1062,599 +2528,HH-634,Haven Heights,Commercial,Micro,Lowrise,Far,Medium,4,3,1931,16,20,1101,493 +2528,HH-635,Haven Heights,Commercial,Micro,Lowrise,Far,Medium,4,3,1911,18,22,1037,562 +2528,HH-710,Haven Heights,Commercial,Micro,Lowrise,Far,Medium,4,3,2323,16,20,1158,491 +2528,HH-719,Haven Heights,Commercial,Micro,Lowrise,Far,Medium,6,5,1342,28,34,1288,433 +2528,HH-725,Haven Heights,Commercial,Micro,Lowrise,Far,Medium,4,3,2081,16,20,1140,538 +2528,HH-729,Haven Heights,Commercial,Micro,Lowrise,Far,Medium,5,4,2148,21,26,1645,394 +2528,HH-730,Haven Heights,Commercial,Micro,Lowrise,Far,Medium,4,3,2185,16,20,1293,461 +2528,HH-737,Haven Heights,Commercial,Micro,Lowrise,Far,Medium,4,3,1966,16,20,1781,383 +2528,HH-738,Haven Heights,Commercial,Micro,Lowrise,Far,Medium,7,6,1647,31,38,1665,418 +2528,HH-742,Haven Heights,Commercial,Micro,Lowrise,Far,Medium,4,3,1353,17,21,1776,371 +2528,HH-785,Haven Heights,Commercial,Micro,Lowrise,Far,Medium,4,3,1878,16,20,1563,444 +2528,HH-786,Haven Heights,Commercial,Micro,Lowrise,Far,Medium,4,3,2375,17,21,1172,457 +2528,HH-789,Haven Heights,Commercial,Micro,Lowrise,Far,Medium,4,4,2228,20,24,1078,478 +2528,HH-795,Haven Heights,Commercial,Micro,Lowrise,Far,Medium,4,3,2284,16,20,1574,422 +2528,HH-824,Haven Heights,Commercial,Micro,Lowrise,Far,Medium,3,3,1752,15,18,658,381 +2567,NS-34,North Star,Residential,Micro,Lowrise,Far,Close,4,4,1569,20,24,640,147 +2567,NS-35,North Star,Residential,Micro,Lowrise,Far,Close,9,8,2033,40,49,613,177 +2567,NS-51,North Star,Residential,Micro,Lowrise,Far,Close,4,3,2036,16,20,653,208 +2567,NS-68,North Star,Residential,Micro,Lowrise,Far,Close,4,3,1696,16,20,698,279 +2567,NS-152,North Star,Residential,Micro,Lowrise,Far,Close,6,5,1430,26,32,1363,108 +2567,NS-167,North Star,Residential,Micro,Lowrise,Far,Close,4,3,1830,17,21,1371,131 +2567,NS-172,North Star,Residential,Micro,Lowrise,Far,Close,4,3,1295,16,20,1700,155 +2567,NS-174,North Star,Residential,Micro,Lowrise,Far,Close,4,3,1525,16,20,1663,151 +2567,NS-181,North Star,Residential,Micro,Lowrise,Far,Close,6,5,1321,25,31,1285,225 +2567,NS-185,North Star,Residential,Micro,Lowrise,Far,Close,4,3,1370,16,20,1287,237 +2567,NS-208,North Star,Residential,Micro,Lowrise,Far,Close,5,4,1776,22,27,1767,239 +2567,NS-209,North Star,Residential,Micro,Lowrise,Far,Close,4,3,1807,17,21,1749,237 +2567,NS-211,North Star,Residential,Micro,Lowrise,Far,Close,5,4,1807,21,26,1710,238 +2567,NS-212,North Star,Residential,Micro,Lowrise,Far,Close,4,3,1807,19,23,1691,240 +2567,NS-213,North Star,Residential,Micro,Lowrise,Far,Close,4,3,1618,16,20,1673,243 +2567,NS-214,North Star,Residential,Micro,Lowrise,Far,Close,5,4,1674,22,27,1593,198 +2567,NS-215,North Star,Residential,Micro,Lowrise,Far,Close,5,4,1721,21,26,1537,178 +2567,NS-216,North Star,Residential,Micro,Lowrise,Far,Close,8,7,1369,36,44,1290,264 +2567,NS-232,North Star,Residential,Micro,Lowrise,Far,Close,4,3,1619,19,23,1593,225 +2567,NS-233,North Star,Residential,Micro,Lowrise,Far,Close,6,5,1654,26,32,1537,207 +2567,NS-236,North Star,Residential,Micro,Lowrise,Far,Close,4,3,1317,19,23,1289,293 +2567,NS-473,North Star,Residential,Micro,Lowrise,Far,Close,4,3,1610,16,20,1910,119 +2567,NS-538,North Star,Residential,Micro,Lowrise,Far,Close,6,5,1604,25,31,1771,275 +2567,NS-539,North Star,Residential,Micro,Lowrise,Far,Close,8,7,1670,35,43,1752,293 +2567,NS-643,North Star,Residential,Micro,Lowrise,Far,Close,4,3,1201,16,20,2157,160 +2567,NS-652,North Star,Residential,Micro,Lowrise,Far,Close,4,3,1209,18,22,2159,202 +2567,NS-673,North Star,Residential,Micro,Lowrise,Far,Close,4,4,1643,20,24,2245,284 +2567,NS-674,North Star,Residential,Micro,Lowrise,Far,Close,5,4,1302,20,25,2218,290 +2567,NS-675,North Star,Residential,Micro,Lowrise,Far,Close,4,3,1302,18,22,2194,290 +2567,NS-676,North Star,Residential,Micro,Lowrise,Far,Close,7,5,1302,29,36,2170,292 +2567,NS-677,North Star,Residential,Micro,Lowrise,Far,Close,4,3,1273,18,22,2146,296 +2567,NS-686,North Star,Residential,Micro,Lowrise,Far,Close,4,3,1297,19,23,2245,295 +2567,NS-696,North Star,Residential,Micro,Lowrise,Far,Close,5,4,1328,21,26,2257,293 +2567,NS-706,North Star,Residential,Micro,Lowrise,Far,Close,4,3,1391,18,22,2259,294 +2567,NS-710,North Star,Residential,Micro,Lowrise,Far,Close,4,3,1517,16,20,2264,297 +2567,NS-723,North Star,Residential,Micro,Lowrise,Far,Close,7,6,1508,30,37,2266,297 +2567,NS-725,North Star,Residential,Micro,Lowrise,Far,Close,5,4,1359,20,25,2280,292 +2567,NS-817,North Star,Residential,Micro,Lowrise,Far,Close,6,5,1898,28,34,2322,205 +2567,NS-818,North Star,Residential,Micro,Lowrise,Far,Close,4,3,1962,16,20,2219,282 +2567,NS-821,North Star,Residential,Micro,Lowrise,Far,Close,4,3,1920,19,23,2322,191 +2567,NS-832,North Star,Residential,Micro,Lowrise,Far,Close,4,3,2022,17,21,2222,262 +2567,NS-838,North Star,Residential,Micro,Lowrise,Far,Close,4,3,2024,17,21,2223,253 +2567,NS-842,North Star,Residential,Micro,Lowrise,Far,Close,4,3,2026,18,22,2223,246 +2567,NS-857,North Star,Residential,Micro,Lowrise,Far,Close,4,4,1646,20,24,2321,149 +2567,NS-858,North Star,Residential,Micro,Lowrise,Far,Close,4,4,1884,20,24,2224,239 +2567,NS-886,North Star,Residential,Micro,Lowrise,Far,Close,9,7,1732,37,46,2124,214 +2567,NS-894,North Star,Residential,Micro,Lowrise,Far,Close,9,7,2059,36,45,2125,136 +2567,NS-914,North Star,Residential,Micro,Lowrise,Far,Close,12,9,2196,49,61,1002,249 +2615,TG-108,Tranquility Gardens,Residential,Micro,Lowrise,Far,Medium,7,6,1348,30,37,4712,312 +2615,TG-115,Tranquility Gardens,Residential,Micro,Lowrise,Far,Medium,5,4,1267,21,26,4355,569 +2615,TG-116,Tranquility Gardens,Residential,Micro,Lowrise,Far,Medium,4,3,1298,16,20,4330,590 +2615,TG-129,Tranquility Gardens,Residential,Micro,Lowrise,Far,Medium,4,3,1231,18,22,4363,539 +2615,TG-130,Tranquility Gardens,Residential,Micro,Lowrise,Far,Medium,4,4,1267,20,24,4338,561 +2615,TG-135,Tranquility Gardens,Residential,Micro,Lowrise,Far,Medium,4,4,1487,20,24,4342,539 +2615,TG-139,Tranquility Gardens,Residential,Micro,Lowrise,Far,Medium,5,4,1657,24,29,4345,533 +2615,TG-165,Tranquility Gardens,Residential,Micro,Lowrise,Far,Medium,5,4,1653,24,29,4354,521 +2615,TG-182,Tranquility Gardens,Residential,Micro,Lowrise,Far,Medium,5,4,1847,22,27,4367,515 +2615,TG-186,Tranquility Gardens,Residential,Micro,Lowrise,Far,Medium,5,4,1589,21,26,4534,347 +2615,TG-187,Tranquility Gardens,Residential,Micro,Lowrise,Far,Medium,5,4,1638,23,28,4475,407 +2615,TG-189,Tranquility Gardens,Residential,Micro,Lowrise,Far,Medium,4,4,1846,20,24,4370,513 +2615,TG-196,Tranquility Gardens,Residential,Micro,Lowrise,Far,Medium,5,4,1844,22,27,4374,512 +2615,TG-200,Tranquility Gardens,Residential,Micro,Lowrise,Far,Medium,4,3,1589,16,20,4540,344 +2615,TG-206,Tranquility Gardens,Residential,Micro,Lowrise,Far,Medium,5,4,1589,21,26,4546,342 +2615,TG-218,Tranquility Gardens,Residential,Micro,Lowrise,Far,Medium,4,3,1641,16,20,4494,400 +2615,TG-221,Tranquility Gardens,Residential,Micro,Lowrise,Far,Medium,6,5,2188,25,31,4389,511 +2615,TG-226,Tranquility Gardens,Residential,Micro,Lowrise,Far,Medium,4,3,2266,16,20,4393,511 +2615,TG-237,Tranquility Gardens,Residential,Micro,Lowrise,Far,Medium,5,4,1362,23,28,4383,535 +2615,TG-263,Tranquility Gardens,Residential,Micro,Lowrise,Far,Medium,10,8,1674,41,51,4587,303 +2615,TG-271,Tranquility Gardens,Residential,Micro,Lowrise,Far,Medium,5,4,1876,21,26,4614,321 +2615,TG-272,Tranquility Gardens,Residential,Micro,Lowrise,Far,Medium,5,4,1885,20,25,4568,332 +2615,TG-281,Tranquility Gardens,Residential,Micro,Lowrise,Far,Medium,7,5,1879,28,35,4595,353 +2615,TG-291,Tranquility Gardens,Residential,Micro,Lowrise,Far,Medium,4,3,2085,16,20,4434,458 +2615,TG-292,Tranquility Gardens,Residential,Micro,Lowrise,Far,Medium,5,4,1766,22,27,4389,486 +2615,TG-299,Tranquility Gardens,Residential,Micro,Lowrise,Far,Medium,7,6,2070,31,38,4607,359 +2615,TG-300,Tranquility Gardens,Residential,Micro,Lowrise,Far,Medium,6,5,2089,27,33,4411,493 +2615,TG-301,Tranquility Gardens,Residential,Micro,Lowrise,Far,Medium,4,3,2041,16,20,4367,516 +2615,TG-318,Tranquility Gardens,Residential,Micro,Lowrise,Far,Medium,5,4,2104,23,28,4637,310 +2615,TG-324,Tranquility Gardens,Residential,Micro,Lowrise,Far,Medium,4,3,2092,18,22,4389,528 +2615,TG-325,Tranquility Gardens,Residential,Micro,Lowrise,Far,Medium,4,3,2041,16,20,4344,550 +2615,TG-338,Tranquility Gardens,Residential,Micro,Lowrise,Far,Medium,5,4,2098,21,26,4618,311 +2615,TG-339,Tranquility Gardens,Residential,Micro,Lowrise,Far,Medium,4,3,2115,16,20,4563,380 +2615,TG-340,Tranquility Gardens,Residential,Micro,Lowrise,Far,Medium,7,6,2040,32,39,4367,563 +2615,TG-346,Tranquility Gardens,Residential,Micro,Lowrise,Far,Medium,9,7,2116,36,45,4541,384 +2615,TG-348,Tranquility Gardens,Residential,Micro,Lowrise,Far,Medium,6,5,1964,26,32,4520,380 +2615,TG-386,Tranquility Gardens,Residential,Micro,Lowrise,Far,Medium,4,3,1210,16,20,3994,574 +2615,TG-389,Tranquility Gardens,Residential,Micro,Lowrise,Far,Medium,2,2,1514,10,10,3977,560 +2615,TG-397,Tranquility Gardens,Residential,Micro,Lowrise,Far,Medium,4,3,1665,16,20,4239,385 +2615,TG-398,Tranquility Gardens,Residential,Micro,Lowrise,Far,Medium,5,4,1730,21,26,4223,396 +2615,TG-399,Tranquility Gardens,Residential,Micro,Lowrise,Far,Medium,8,6,1729,32,40,4207,408 +2615,TG-400,Tranquility Gardens,Residential,Micro,Lowrise,Far,Medium,9,7,1727,36,45,4191,421 +2615,TG-402,Tranquility Gardens,Residential,Micro,Lowrise,Far,Medium,4,3,1544,16,20,4160,441 +2615,TG-403,Tranquility Gardens,Residential,Micro,Lowrise,Far,Medium,5,4,1411,22,27,3968,541 +2615,TG-405,Tranquility Gardens,Residential,Micro,Lowrise,Far,Medium,4,3,1409,17,21,3956,524 +2615,TG-417,Tranquility Gardens,Residential,Micro,Lowrise,Far,Medium,7,6,1408,30,37,3945,507 +2615,TG-424,Tranquility Gardens,Residential,Micro,Lowrise,Far,Medium,4,4,1258,20,24,3934,491 +2615,TG-429,Tranquility Gardens,Residential,Micro,Lowrise,Far,Medium,4,3,1380,16,20,4129,362 +2615,TG-431,Tranquility Gardens,Residential,Micro,Lowrise,Far,Medium,4,3,1428,16,20,4111,364 +2615,TG-444,Tranquility Gardens,Residential,Micro,Lowrise,Far,Medium,4,3,1349,18,22,3559,591 +2615,TG-460,Tranquility Gardens,Residential,Micro,Lowrise,Far,Medium,5,4,1896,21,26,3467,600 +2615,TG-464,Tranquility Gardens,Residential,Micro,Lowrise,Far,Medium,4,3,1771,16,20,3455,584 +2615,TG-469,Tranquility Gardens,Residential,Micro,Lowrise,Far,Medium,7,5,1817,28,35,3622,406 +2615,TG-471,Tranquility Gardens,Residential,Micro,Lowrise,Far,Medium,4,3,1778,18,22,3699,352 +2615,TG-472,Tranquility Gardens,Residential,Micro,Lowrise,Far,Medium,4,3,1817,16,20,3673,369 +2615,TG-487,Tranquility Gardens,Residential,Micro,Lowrise,Far,Medium,4,3,1311,16,20,3645,329 +2615,TG-488,Tranquility Gardens,Residential,Micro,Lowrise,Far,Medium,4,3,1811,16,20,3562,365 +2615,TG-489,Tranquility Gardens,Residential,Micro,Lowrise,Far,Medium,5,4,1775,20,25,3612,330 +2615,TG-490,Tranquility Gardens,Residential,Micro,Lowrise,Far,Medium,5,4,1821,21,26,3588,346 +2615,TG-494,Tranquility Gardens,Residential,Micro,Lowrise,Far,Medium,4,3,2043,16,20,3131,593 +2615,TG-506,Tranquility Gardens,Residential,Micro,Lowrise,Far,Medium,4,3,1712,16,20,3253,432 +2615,TG-507,Tranquility Gardens,Residential,Micro,Lowrise,Far,Medium,4,3,1714,16,20,3227,449 +2615,TG-508,Tranquility Gardens,Residential,Micro,Lowrise,Far,Medium,4,3,1716,16,20,3202,468 +2615,TG-509,Tranquility Gardens,Residential,Micro,Lowrise,Far,Medium,4,3,1611,16,20,3177,484 +2615,TG-519,Tranquility Gardens,Residential,Micro,Lowrise,Far,Medium,4,3,1570,16,20,2719,570 +2615,TG-522,Tranquility Gardens,Residential,Micro,Lowrise,Far,Medium,4,3,1572,16,20,2705,551 +2615,TG-529,Tranquility Gardens,Residential,Micro,Lowrise,Far,Medium,4,4,1711,20,24,3216,380 +2615,TG-530,Tranquility Gardens,Residential,Micro,Lowrise,Far,Medium,5,4,1702,22,27,3190,399 +2615,TG-531,Tranquility Gardens,Residential,Micro,Lowrise,Far,Medium,5,4,1692,20,25,3165,415 +2615,TG-532,Tranquility Gardens,Residential,Micro,Lowrise,Far,Medium,4,3,1578,16,20,3140,425 +2615,TG-541,Tranquility Gardens,Residential,Micro,Lowrise,Far,Medium,4,3,1470,19,23,2678,512 +2615,TG-546,Tranquility Gardens,Residential,Micro,Lowrise,Far,Medium,5,4,1302,20,25,2156,454 +2615,TG-557,Tranquility Gardens,Residential,Micro,Lowrise,Far,Medium,4,3,1541,16,20,2814,452 +2615,TG-589,Tranquility Gardens,Residential,Micro,Lowrise,Far,Medium,4,3,1678,19,23,2732,322 +2615,TG-591,Tranquility Gardens,Residential,Micro,Lowrise,Far,Medium,4,3,1487,16,20,2809,325 +2690,NS-151,North Star,Residential,Nano,Lowrise,Medium,Far,5,4,1022,22,27,475,606 +2690,NS-161,North Star,Residential,Nano,Lowrise,Medium,Far,4,3,1198,16,20,395,690 +2690,NS-171,North Star,Residential,Nano,Lowrise,Medium,Far,3,2,945,14,17,479,623 +2690,NS-183,North Star,Residential,Nano,Lowrise,Medium,Far,3,3,918,15,18,541,603 +2690,NS-184,North Star,Residential,Nano,Lowrise,Medium,Far,3,2,918,12,15,485,650 +2690,NS-193,North Star,Residential,Nano,Lowrise,Medium,Far,3,3,949,15,18,545,614 +2690,NS-194,North Star,Residential,Nano,Lowrise,Medium,Far,2,2,949,10,12,488,661 +2690,NS-205,North Star,Residential,Nano,Lowrise,Medium,Far,3,3,949,15,18,543,626 +2690,NS-206,North Star,Residential,Nano,Lowrise,Medium,Far,2,2,949,10,12,486,672 +2690,NS-219,North Star,Residential,Nano,Lowrise,Medium,Far,3,3,949,15,18,541,638 +2690,NS-220,North Star,Residential,Nano,Lowrise,Medium,Far,2,2,949,10,12,484,683 +2690,NS-229,North Star,Residential,Nano,Lowrise,Medium,Far,3,3,949,15,18,540,651 +2690,NS-230,North Star,Residential,Nano,Lowrise,Medium,Far,4,3,949,16,20,483,695 +2690,NS-240,North Star,Residential,Nano,Lowrise,Medium,Far,3,3,905,15,18,539,663 +2690,NS-241,North Star,Residential,Nano,Lowrise,Medium,Far,4,3,877,16,20,482,707 +2690,NS-246,North Star,Residential,Nano,Lowrise,Medium,Far,3,3,919,15,18,540,699 +2690,NS-271,North Star,Residential,Nano,Lowrise,Medium,Far,3,3,949,15,18,539,713 +2690,NS-282,North Star,Residential,Nano,Lowrise,Medium,Far,3,3,949,15,18,538,727 +2690,NS-283,North Star,Residential,Nano,Lowrise,Medium,Far,4,3,949,16,20,481,767 +2690,NS-292,North Star,Residential,Nano,Lowrise,Medium,Far,3,3,949,15,18,538,742 +2690,NS-293,North Star,Residential,Nano,Lowrise,Medium,Far,4,4,949,20,24,481,781 +2690,NS-320,North Star,Residential,Nano,Lowrise,Medium,Far,3,3,949,15,18,538,757 +2690,NS-327,North Star,Residential,Nano,Lowrise,Medium,Far,6,5,877,28,34,481,809 +2690,NS-362,North Star,Residential,Nano,Lowrise,Medium,Far,4,3,1007,16,20,485,862 +2690,NS-363,North Star,Residential,Nano,Lowrise,Medium,Far,4,3,897,17,21,467,873 +2690,NS-401,North Star,Residential,Nano,Lowrise,Medium,Far,5,4,875,23,28,556,863 +2690,NS-402,North Star,Residential,Nano,Lowrise,Medium,Far,4,3,982,17,21,539,873 +2690,NS-403,North Star,Residential,Nano,Lowrise,Medium,Far,5,4,982,21,26,520,884 +2690,NS-404,North Star,Residential,Nano,Lowrise,Medium,Far,5,4,982,22,27,502,895 +2690,NS-405,North Star,Residential,Nano,Lowrise,Medium,Far,7,6,982,31,38,483,906 +2690,NS-406,North Star,Residential,Nano,Lowrise,Medium,Far,4,3,875,16,20,466,917 +2690,NS-448,North Star,Residential,Nano,Lowrise,Medium,Far,5,4,955,20,25,498,977 +2690,NS-449,North Star,Residential,Nano,Lowrise,Medium,Far,6,4,955,24,30,479,987 +2690,NS-450,North Star,Residential,Nano,Lowrise,Medium,Far,5,4,990,21,26,409,1030 +2690,NS-451,North Star,Residential,Nano,Lowrise,Medium,Far,4,3,1025,18,22,390,1041 +2690,NS-452,North Star,Residential,Nano,Lowrise,Medium,Far,4,4,1025,20,24,371,1053 +2690,NS-453,North Star,Residential,Nano,Lowrise,Medium,Far,4,3,1025,17,21,352,1066 +2690,NS-454,North Star,Residential,Nano,Lowrise,Medium,Far,8,7,918,36,44,315,1090 +2690,NS-492,North Star,Residential,Nano,Lowrise,Medium,Far,10,8,875,40,50,559,999 +2690,NS-493,North Star,Residential,Nano,Lowrise,Medium,Far,4,3,974,18,22,541,1007 +2690,NS-494,North Star,Residential,Nano,Lowrise,Medium,Far,4,3,970,18,22,522,1017 +2690,NS-496,North Star,Residential,Nano,Lowrise,Medium,Far,5,4,942,20,25,465,1047 +2690,NS-497,North Star,Residential,Nano,Lowrise,Medium,Far,11,9,1012,48,59,414,1075 +2690,NS-498,North Star,Residential,Nano,Lowrise,Medium,Far,4,3,1046,17,21,395,1086 +2690,NS-499,North Star,Residential,Nano,Lowrise,Medium,Far,4,3,1043,16,20,376,1097 +2690,NS-501,North Star,Residential,Nano,Lowrise,Medium,Far,10,8,1039,41,51,338,1121 +2690,NS-502,North Star,Residential,Nano,Lowrise,Medium,Far,5,4,928,23,28,320,1132 +2690,NS-513,North Star,Residential,Nano,Lowrise,Medium,Far,5,4,1031,22,27,538,1069 +2690,NS-514,North Star,Residential,Nano,Lowrise,Medium,Far,4,3,1056,17,21,482,1096 +2690,NS-529,North Star,Residential,Nano,Lowrise,Medium,Far,4,4,1065,20,24,540,1086 +2690,NS-531,North Star,Residential,Nano,Lowrise,Medium,Far,4,3,1054,16,20,414,1150 +2690,NS-532,North Star,Residential,Nano,Lowrise,Medium,Far,6,5,1091,28,34,395,1160 +2690,NS-533,North Star,Residential,Nano,Lowrise,Medium,Far,5,4,1091,23,28,376,1171 +2690,NS-534,North Star,Residential,Nano,Lowrise,Medium,Far,4,4,1091,20,24,357,1182 +2690,NS-536,North Star,Residential,Nano,Lowrise,Medium,Far,4,3,977,17,21,320,1204 +2690,NS-542,North Star,Residential,Nano,Lowrise,Medium,Far,4,3,1065,16,20,542,1104 +2690,NS-546,North Star,Residential,Nano,Lowrise,Medium,Far,4,3,1095,17,21,485,1148 +2690,NS-560,North Star,Residential,Nano,Lowrise,Medium,Far,6,4,1065,24,30,541,1139 +2690,NS-561,North Star,Residential,Nano,Lowrise,Medium,Far,8,6,1097,34,42,484,1165 +2690,NS-562,North Star,Residential,Nano,Lowrise,Medium,Far,4,3,1088,17,21,395,1210 +2690,NS-563,North Star,Residential,Nano,Lowrise,Medium,Far,4,4,1085,20,24,376,1220 +2690,NS-564,North Star,Residential,Nano,Lowrise,Medium,Far,5,4,1083,22,27,357,1231 +2690,NS-565,North Star,Residential,Nano,Lowrise,Medium,Far,4,3,1081,18,22,338,1241 +2690,NS-566,North Star,Residential,Nano,Lowrise,Medium,Far,4,3,966,18,22,320,1252 +2690,NS-567,North Star,Residential,Nano,Lowrise,Medium,Far,5,4,1015,24,29,541,1157 +2690,NS-568,North Star,Residential,Nano,Lowrise,Medium,Far,8,6,1015,34,42,485,1182 +2690,NS-579,North Star,Residential,Nano,Lowrise,Medium,Far,5,4,1031,22,27,545,1204 +2690,NS-580,North Star,Residential,Nano,Lowrise,Medium,Far,5,4,1056,23,28,489,1228 +2690,NS-589,North Star,Residential,Nano,Lowrise,Medium,Far,8,7,1065,36,44,546,1222 +2690,NS-591,North Star,Residential,Nano,Lowrise,Medium,Far,9,7,987,36,45,419,1278 +2690,NS-593,North Star,Residential,Nano,Lowrise,Medium,Far,4,4,1021,20,24,381,1297 +2690,NS-594,North Star,Residential,Nano,Lowrise,Medium,Far,5,4,914,20,25,325,1326 +2690,NS-597,North Star,Residential,Nano,Lowrise,Medium,Far,4,3,1065,16,20,546,1240 +2690,NS-612,North Star,Residential,Nano,Lowrise,Medium,Far,5,4,1065,22,27,550,1277 +2690,NS-613,North Star,Residential,Nano,Lowrise,Medium,Far,10,8,1097,42,52,495,1300 +2690,NS-615,North Star,Residential,Nano,Lowrise,Medium,Far,4,3,1016,16,20,407,1341 +2690,NS-616,North Star,Residential,Nano,Lowrise,Medium,Far,5,4,1009,23,28,369,1360 +2690,NS-617,North Star,Residential,Nano,Lowrise,Medium,Far,4,3,1005,19,23,350,1370 +2690,NS-618,North Star,Residential,Nano,Lowrise,Medium,Far,5,4,897,20,25,332,1379 +2690,NS-622,North Star,Residential,Nano,Lowrise,Medium,Far,8,7,1015,35,43,552,1294 +2690,NS-623,North Star,Residential,Nano,Lowrise,Medium,Far,4,3,1015,17,21,496,1317 +2690,NS-624,North Star,Residential,Nano,Lowrise,Medium,Far,5,4,985,20,25,409,1403 +2690,NS-636,North Star,Residential,Nano,Lowrise,Medium,Far,4,3,977,18,22,573,1324 +2690,NS-638,North Star,Residential,Nano,Lowrise,Medium,Far,5,4,1091,23,28,536,1347 +2690,NS-640,North Star,Residential,Nano,Lowrise,Medium,Far,4,3,1060,17,21,479,1383 +2690,NS-645,North Star,Residential,Nano,Lowrise,Medium,Far,6,5,993,27,33,351,1455 +2690,NS-649,North Star,Residential,Nano,Lowrise,Medium,Far,4,3,1018,19,23,411,1399 +2690,NS-650,North Star,Residential,Nano,Lowrise,Medium,Far,5,4,993,20,25,351,1441 +2690,NS-657,North Star,Residential,Nano,Lowrise,Medium,Far,4,3,975,16,20,575,1277 +2690,NS-658,North Star,Residential,Nano,Lowrise,Medium,Far,5,4,1082,20,25,537,1301 +2690,NS-660,North Star,Residential,Nano,Lowrise,Medium,Far,4,3,1075,16,20,499,1326 +2690,NS-661,North Star,Residential,Nano,Lowrise,Medium,Far,5,4,1052,23,28,480,1339 +2690,NS-662,North Star,Residential,Nano,Lowrise,Medium,Far,4,3,1018,17,21,412,1385 +2690,NS-743,North Star,Residential,Nano,Lowrise,Medium,Far,4,3,1049,16,20,537,1026 +2690,NS-744,North Star,Residential,Nano,Lowrise,Medium,Far,4,4,1049,20,24,518,1039 +2690,NS-763,North Star,Residential,Nano,Lowrise,Medium,Far,4,3,916,16,20,599,947 +2690,NS-765,North Star,Residential,Nano,Lowrise,Medium,Far,4,3,1024,16,20,543,984 +2690,NS-767,North Star,Residential,Nano,Lowrise,Medium,Far,4,3,1005,16,20,506,1009 +2690,NS-774,North Star,Residential,Nano,Lowrise,Medium,Far,7,6,941,30,37,439,1005 +2690,NS-775,North Star,Residential,Nano,Lowrise,Medium,Far,7,5,919,29,36,383,1048 +2690,NS-793,North Star,Residential,Nano,Lowrise,Medium,Far,5,4,1049,21,26,442,981 +2690,NS-794,North Star,Residential,Nano,Lowrise,Medium,Far,4,3,1024,19,23,386,1025 +2690,NS-798,North Star,Residential,Nano,Lowrise,Medium,Far,5,4,1024,21,26,389,1014 +2690,NS-815,North Star,Residential,Nano,Lowrise,Medium,Far,9,7,998,36,45,451,946 +2690,NS-816,North Star,Residential,Nano,Lowrise,Medium,Far,4,4,944,20,24,396,992 +2690,NS-820,North Star,Residential,Nano,Lowrise,Medium,Far,7,6,1056,30,37,538,843 +2690,NS-828,North Star,Residential,Nano,Lowrise,Medium,Far,4,4,1065,20,24,594,787 +2690,NS-829,North Star,Residential,Nano,Lowrise,Medium,Far,4,3,1093,17,21,538,831 +2690,NS-834,North Star,Residential,Nano,Lowrise,Medium,Far,4,3,1065,16,20,595,774 +2690,NS-839,North Star,Residential,Nano,Lowrise,Medium,Far,4,3,1065,18,22,595,763 +2690,NS-840,North Star,Residential,Nano,Lowrise,Medium,Far,5,4,1095,20,25,539,809 +2690,NS-854,North Star,Residential,Nano,Lowrise,Medium,Far,5,4,1065,20,25,596,751 +2690,NS-855,North Star,Residential,Nano,Lowrise,Medium,Far,4,3,1097,19,23,540,798 +2690,NS-862,North Star,Residential,Nano,Lowrise,Medium,Far,4,3,1015,16,20,598,740 +2690,NS-863,North Star,Residential,Nano,Lowrise,Medium,Far,6,5,1015,27,33,542,788 +2690,NS-864,North Star,Residential,Nano,Lowrise,Medium,Far,4,3,585,16,20,313,975 +2690,NS-878,North Star,Residential,Nano,Lowrise,Medium,Far,4,3,601,18,22,311,954 +2690,NS-885,North Star,Residential,Nano,Lowrise,Medium,Far,4,3,601,16,20,312,948 +2808,HH-8,Haven Heights,Residential,Micro,Lowrise,Far,Close,11,9,1717,46,57,1041,125 +2808,HH-11,Haven Heights,Residential,Micro,Lowrise,Far,Close,4,3,2355,16,20,1051,146 +2808,HH-37,Haven Heights,Residential,Micro,Lowrise,Far,Close,4,3,2042,16,20,1679,124 +2808,HH-50,Haven Heights,Residential,Micro,Lowrise,Far,Close,7,5,2282,28,35,1677,162 +2808,HH-51,Haven Heights,Residential,Micro,Lowrise,Far,Close,4,3,2379,16,20,1619,123 +2808,HH-65,Haven Heights,Residential,Micro,Lowrise,Far,Close,5,4,2286,22,27,1673,174 +2808,HH-66,Haven Heights,Residential,Micro,Lowrise,Far,Close,4,3,2295,17,21,1614,153 +2808,HH-67,Haven Heights,Residential,Micro,Lowrise,Far,Close,7,6,2290,30,37,1669,156 +2808,HH-74,Haven Heights,Residential,Micro,Lowrise,Far,Close,4,3,1265,16,20,1660,148 +2808,HH-75,Haven Heights,Residential,Micro,Lowrise,Far,Close,6,5,2297,25,31,1606,200 +2808,HH-76,Haven Heights,Residential,Micro,Lowrise,Far,Close,4,3,2063,16,20,1263,229 +2808,HH-77,Haven Heights,Residential,Micro,Lowrise,Far,Close,9,7,1708,37,46,1230,242 +2808,HH-78,Haven Heights,Residential,Micro,Lowrise,Far,Close,4,3,1710,16,20,1201,256 +2808,HH-79,Haven Heights,Residential,Micro,Lowrise,Far,Close,4,3,1712,16,20,1171,271 +2808,HH-95,Haven Heights,Residential,Micro,Lowrise,Far,Close,4,3,1708,16,20,1254,287 +2808,HH-96,Haven Heights,Residential,Micro,Lowrise,Far,Close,4,3,1701,16,20,1224,296 +2808,HH-294,Haven Heights,Residential,Micro,Lowrise,Far,Close,4,3,2175,16,20,2044,210 +2808,HH-317,Haven Heights,Residential,Micro,Lowrise,Far,Close,4,4,1518,20,24,2898,123 +2808,HH-318,Haven Heights,Residential,Micro,Lowrise,Far,Close,4,3,1428,16,20,2117,122 +2808,HH-418,Haven Heights,Residential,Micro,Lowrise,Far,Close,8,7,1387,36,44,1782,187 +2808,HH-427,Haven Heights,Residential,Micro,Lowrise,Far,Close,4,3,1425,16,20,1771,178 +2808,HH-428,Haven Heights,Residential,Micro,Lowrise,Far,Close,7,6,1475,30,37,1706,242 +2808,HH-457,Haven Heights,Residential,Micro,Lowrise,Far,Close,4,3,1388,16,20,1750,159 +2808,HH-470,Haven Heights,Residential,Micro,Lowrise,Far,Close,4,3,1369,16,20,1739,147 +2808,HH-488,Haven Heights,Residential,Micro,Lowrise,Far,Close,4,3,1326,16,20,1664,197 +2808,HH-496,Haven Heights,Residential,Micro,Lowrise,Far,Close,4,3,2255,17,21,2325,178 +2808,HH-500,Haven Heights,Residential,Micro,Lowrise,Far,Close,4,3,1290,16,20,2227,114 +2808,HH-525,Haven Heights,Residential,Micro,Lowrise,Far,Close,4,3,1223,16,20,1608,156 +2808,HH-526,Haven Heights,Residential,Micro,Lowrise,Far,Close,4,3,2369,16,20,1496,262 +2808,HH-529,Haven Heights,Residential,Micro,Lowrise,Far,Close,4,4,1596,20,24,1607,136 +2808,HH-549,Haven Heights,Residential,Micro,Lowrise,Far,Close,4,3,2103,16,20,2293,235 +2808,HH-550,Haven Heights,Residential,Micro,Lowrise,Far,Close,7,6,2103,31,38,2174,165 +2808,HH-561,Haven Heights,Residential,Micro,Lowrise,Far,Close,4,3,1584,16,20,1453,189 +2808,HH-562,Haven Heights,Residential,Micro,Lowrise,Far,Close,4,3,1572,16,20,1404,242 +2808,HH-586,Haven Heights,Residential,Micro,Lowrise,Far,Close,4,3,1587,16,20,1427,181 +2808,HH-587,Haven Heights,Residential,Micro,Lowrise,Far,Close,4,3,1588,16,20,1402,209 +2808,HH-625,Haven Heights,Residential,Micro,Lowrise,Far,Close,5,4,2048,23,28,1500,117 +2808,HH-627,Haven Heights,Residential,Micro,Lowrise,Far,Close,4,3,1259,16,20,1836,175 +2808,HH-628,Haven Heights,Residential,Micro,Lowrise,Far,Close,4,3,1297,17,21,1818,162 +2808,HH-629,Haven Heights,Residential,Micro,Lowrise,Far,Close,5,4,1297,20,25,1798,150 +2808,HH-678,Haven Heights,Residential,Micro,Lowrise,Far,Close,4,3,1835,16,20,1618,225 +2808,HH-812,Haven Heights,Residential,Micro,Lowrise,Far,Close,4,3,1974,16,20,1725,289 +2808,HH-827,Haven Heights,Residential,Micro,Lowrise,Far,Close,9,7,1383,37,46,746,283 +2808,HH-836,Haven Heights,Residential,Micro,Lowrise,Far,Close,3,3,1502,15,18,885,144 +2808,HH-837,Haven Heights,Residential,Micro,Lowrise,Far,Close,7,6,1656,30,37,854,159 +2808,HH-858,Haven Heights,Residential,Micro,Lowrise,Far,Close,7,6,1409,31,38,822,234 +2808,HH-859,Haven Heights,Residential,Micro,Lowrise,Far,Close,4,3,1913,16,20,804,253 +2808,HH-880,Haven Heights,Residential,Micro,Lowrise,Far,Close,4,3,1949,16,20,957,121 +2808,HH-898,Haven Heights,Residential,Micro,Lowrise,Far,Close,5,4,1691,22,27,1023,151 +2808,HH-899,Haven Heights,Residential,Micro,Lowrise,Far,Close,9,7,2290,36,45,923,222 +2808,HH-905,Haven Heights,Residential,Micro,Lowrise,Far,Close,4,3,1995,16,20,1023,178 +2808,HH-906,Haven Heights,Residential,Micro,Lowrise,Far,Close,4,3,2090,16,20,913,248 +2860,HH-139,Haven Heights,Residential,Nano,Lowrise,Medium,Far,3,3,671,15,18,569,840 +2860,HH-145,Haven Heights,Residential,Nano,Lowrise,Medium,Far,3,3,1059,15,18,570,863 +2860,HH-159,Haven Heights,Residential,Nano,Lowrise,Medium,Far,9,7,1164,39,48,424,984 +2860,HH-172,Haven Heights,Residential,Nano,Lowrise,Medium,Far,10,8,793,42,52,371,1048 +2860,HH-191,Haven Heights,Residential,Nano,Lowrise,Medium,Far,9,7,1010,37,46,357,1073 +2860,HH-196,Haven Heights,Residential,Nano,Lowrise,Medium,Far,4,3,741,16,20,597,947 +2860,HH-248,Haven Heights,Residential,Nano,Lowrise,Medium,Far,6,5,1174,26,32,316,1203 +2860,HH-260,Haven Heights,Residential,Nano,Lowrise,Medium,Far,4,3,533,16,20,522,1112 +2860,HH-315,Haven Heights,Residential,Nano,Lowrise,Medium,Far,9,7,1149,36,45,348,1283 +2860,HH-322,Haven Heights,Residential,Nano,Lowrise,Medium,Far,4,3,990,16,20,348,1296 +2860,HH-334,Haven Heights,Residential,Nano,Lowrise,Medium,Far,11,9,877,47,58,573,1192 +2860,HH-336,Haven Heights,Residential,Nano,Lowrise,Medium,Far,4,3,1053,16,20,416,1290 +2860,HH-364,Haven Heights,Residential,Nano,Lowrise,Medium,Far,4,3,1175,16,20,411,1304 +2860,HH-365,Haven Heights,Residential,Nano,Lowrise,Medium,Far,4,3,996,18,22,355,1342 +2860,HH-374,Haven Heights,Residential,Nano,Lowrise,Medium,Far,9,7,979,39,48,565,1224 +2860,HH-375,Haven Heights,Residential,Nano,Lowrise,Medium,Far,4,3,954,16,20,507,1257 +2860,HH-376,Haven Heights,Residential,Nano,Lowrise,Medium,Far,4,3,1175,16,20,407,1318 +2860,HH-407,Haven Heights,Residential,Nano,Lowrise,Medium,Far,4,3,979,16,20,557,1256 +2860,HH-408,Haven Heights,Residential,Nano,Lowrise,Medium,Far,4,3,954,16,20,499,1289 +2860,HH-409,Haven Heights,Residential,Nano,Lowrise,Medium,Far,7,6,1175,31,38,399,1349 +2860,HH-410,Haven Heights,Residential,Nano,Lowrise,Medium,Far,4,3,619,17,21,352,1379 +2860,HH-415,Haven Heights,Residential,Nano,Lowrise,Medium,Far,4,3,879,16,20,494,1304 +2860,HH-416,Haven Heights,Residential,Nano,Lowrise,Medium,Far,10,8,1133,40,50,395,1363 +2860,HH-417,Haven Heights,Residential,Nano,Lowrise,Medium,Far,4,3,479,16,20,351,1391 +2860,HH-424,Haven Heights,Residential,Nano,Lowrise,Medium,Far,4,3,1013,16,20,541,1317 +2860,HH-426,Haven Heights,Residential,Nano,Lowrise,Medium,Far,4,3,1145,16,20,357,1427 +2860,HH-445,Haven Heights,Residential,Nano,Lowrise,Medium,Far,4,3,1024,16,20,482,1362 +2860,HH-454,Haven Heights,Residential,Nano,Lowrise,Medium,Far,4,3,1024,16,20,477,1379 +2860,HH-456,Haven Heights,Residential,Nano,Lowrise,Medium,Far,5,4,965,23,28,354,1452 +2860,HH-467,Haven Heights,Residential,Nano,Lowrise,Medium,Far,4,3,1024,19,23,472,1395 +2860,HH-485,Haven Heights,Residential,Nano,Lowrise,Medium,Far,7,6,1049,31,38,521,1383 +2860,HH-486,Haven Heights,Residential,Nano,Lowrise,Medium,Far,4,3,1024,18,22,467,1411 +2860,HH-494,Haven Heights,Residential,Nano,Lowrise,Medium,Far,4,3,939,17,21,517,1398 +2860,HH-495,Haven Heights,Residential,Nano,Lowrise,Medium,Far,4,3,916,16,20,463,1427 +2860,HH-834,Haven Heights,Residential,Nano,Lowrise,Medium,Far,4,4,551,20,24,360,668 +2860,HH-839,Haven Heights,Residential,Nano,Lowrise,Medium,Far,4,3,974,16,20,369,670 +2860,HH-862,Haven Heights,Residential,Nano,Lowrise,Medium,Far,4,3,1135,18,22,446,607 +2860,HH-863,Haven Heights,Residential,Nano,Lowrise,Medium,Far,4,3,1103,16,20,426,626 +2860,HH-864,Haven Heights,Residential,Nano,Lowrise,Medium,Far,4,3,745,16,20,377,676 +2860,HH-865,Haven Heights,Residential,Nano,Lowrise,Medium,Far,4,3,782,16,20,362,690 +2860,HH-866,Haven Heights,Residential,Nano,Lowrise,Medium,Far,4,3,782,18,22,348,705 +2860,HH-867,Haven Heights,Residential,Nano,Lowrise,Medium,Far,4,3,781,16,20,333,719 +2860,HH-871,Haven Heights,Residential,Nano,Lowrise,Medium,Far,4,3,1118,18,22,451,601 +2860,HH-872,Haven Heights,Residential,Nano,Lowrise,Medium,Far,5,4,748,23,28,383,670 +2860,HH-873,Haven Heights,Residential,Nano,Lowrise,Medium,Far,4,3,777,17,21,369,685 +2860,HH-875,Haven Heights,Residential,Nano,Lowrise,Medium,Far,4,3,636,17,21,312,742 +2906,SM-5,Space Mind,Residential,Nano,Lowrise,Far,Medium,4,3,1104,18,22,2068,418 +2906,SM-6,Space Mind,Residential,Nano,Lowrise,Far,Medium,4,3,1135,19,23,2050,437 +2906,SM-7,Space Mind,Residential,Nano,Lowrise,Far,Medium,4,3,1135,18,22,2030,457 +2906,SM-8,Space Mind,Residential,Nano,Lowrise,Far,Medium,10,8,1135,43,53,2011,477 +2906,SM-9,Space Mind,Residential,Nano,Lowrise,Far,Medium,4,3,1102,16,20,1973,515 +2906,SM-17,Space Mind,Residential,Nano,Lowrise,Far,Medium,4,3,1142,16,20,2035,445 +2906,SM-18,Space Mind,Residential,Nano,Lowrise,Far,Medium,4,3,1142,16,20,2015,464 +2906,SM-20,Space Mind,Residential,Nano,Lowrise,Far,Medium,5,4,1142,21,26,1977,503 +2906,SM-21,Space Mind,Residential,Nano,Lowrise,Far,Medium,4,3,1121,16,20,1958,523 +2906,SM-249,Space Mind,Residential,Nano,Lowrise,Far,Medium,6,5,918,28,34,1461,368 +2906,SM-251,Space Mind,Residential,Nano,Lowrise,Far,Medium,4,3,949,19,23,1443,373 +2906,SM-252,Space Mind,Residential,Nano,Lowrise,Far,Medium,3,3,949,15,18,1418,428 +2906,SM-260,Space Mind,Residential,Nano,Lowrise,Far,Medium,4,3,949,16,20,1426,378 +2906,SM-261,Space Mind,Residential,Nano,Lowrise,Far,Medium,3,3,949,15,18,1400,433 +2906,SM-266,Space Mind,Residential,Nano,Lowrise,Far,Medium,4,4,949,20,24,1391,393 +2906,SM-267,Space Mind,Residential,Nano,Lowrise,Far,Medium,3,3,949,15,18,1364,445 +2906,SM-273,Space Mind,Residential,Nano,Lowrise,Far,Medium,4,4,905,20,24,1374,401 +2906,SM-274,Space Mind,Residential,Nano,Lowrise,Far,Medium,3,3,877,15,18,1347,453 +2906,SM-350,Space Mind,Residential,Nano,Lowrise,Far,Medium,4,3,943,19,23,1280,382 +2906,SM-354,Space Mind,Residential,Nano,Lowrise,Far,Medium,4,4,848,20,24,1930,301 +2906,SM-361,Space Mind,Residential,Nano,Lowrise,Far,Medium,4,3,905,17,21,1618,325 +2906,SM-362,Space Mind,Residential,Nano,Lowrise,Far,Medium,7,5,905,28,35,1605,317 +2906,SM-363,Space Mind,Residential,Nano,Lowrise,Far,Medium,8,7,905,36,44,1593,310 +2906,SM-364,Space Mind,Residential,Nano,Lowrise,Far,Medium,5,4,594,22,27,1580,305 +2906,SM-381,Space Mind,Residential,Nano,Lowrise,Far,Medium,5,4,948,24,29,1909,331 +2906,SM-386,Space Mind,Residential,Nano,Lowrise,Far,Medium,6,5,948,28,34,1898,344 +2906,SM-390,Space Mind,Residential,Nano,Lowrise,Far,Medium,4,3,949,17,21,1887,345 +2906,SM-391,Space Mind,Residential,Nano,Lowrise,Far,Medium,4,3,889,16,20,1593,382 +2906,SM-393,Space Mind,Residential,Nano,Lowrise,Far,Medium,4,3,923,16,20,1568,368 +2906,SM-394,Space Mind,Residential,Nano,Lowrise,Far,Medium,5,4,921,23,28,1555,362 +2906,SM-395,Space Mind,Residential,Nano,Lowrise,Far,Medium,8,6,919,32,40,1542,357 +2906,SM-396,Space Mind,Residential,Nano,Lowrise,Far,Medium,6,5,427,26,32,1533,354 +2906,SM-397,Space Mind,Residential,Nano,Lowrise,Far,Medium,4,3,729,16,20,1133,523 +2906,SM-420,Space Mind,Residential,Nano,Lowrise,Far,Medium,7,5,908,28,35,1535,441 +2906,SM-421,Space Mind,Residential,Nano,Lowrise,Far,Medium,4,3,813,18,22,1498,427 +2906,SM-427,Space Mind,Residential,Nano,Lowrise,Far,Medium,4,3,1022,16,20,1840,346 +2906,SM-429,Space Mind,Residential,Nano,Lowrise,Far,Medium,5,4,956,20,25,1522,459 +2906,SM-430,Space Mind,Residential,Nano,Lowrise,Far,Medium,5,4,769,23,28,1487,446 +2906,SM-443,Space Mind,Residential,Nano,Lowrise,Far,Medium,4,3,1023,16,20,1830,331 +2906,SM-450,Space Mind,Residential,Nano,Lowrise,Far,Medium,4,4,1025,20,24,1819,314 +2906,SM-451,Space Mind,Residential,Nano,Lowrise,Far,Medium,7,6,954,31,38,1498,497 +2906,SM-452,Space Mind,Residential,Nano,Lowrise,Far,Medium,4,3,545,17,21,1467,486 +2906,SM-459,Space Mind,Residential,Nano,Lowrise,Far,Medium,4,3,953,16,20,1486,516 +2906,SM-460,Space Mind,Residential,Nano,Lowrise,Far,Medium,4,3,432,17,21,1457,506 +2906,SM-474,Space Mind,Residential,Nano,Lowrise,Far,Medium,5,4,920,21,26,1474,523 +2906,SM-475,Space Mind,Residential,Nano,Lowrise,Far,Medium,4,3,309,17,21,1447,526 +2906,SM-486,Space Mind,Residential,Nano,Lowrise,Far,Medium,5,4,1051,21,26,1506,413 +2906,SM-487,Space Mind,Residential,Nano,Lowrise,Far,Medium,6,5,752,28,34,1438,470 +2906,SM-488,Space Mind,Residential,Nano,Lowrise,Far,Medium,4,4,751,20,24,1426,480 +2906,SM-489,Space Mind,Residential,Nano,Lowrise,Far,Medium,4,3,750,17,21,1415,491 +2906,SM-490,Space Mind,Residential,Nano,Lowrise,Far,Medium,4,3,669,17,21,1404,501 +2906,SM-494,Space Mind,Residential,Nano,Lowrise,Far,Medium,4,3,1024,16,20,1544,360 +2906,SM-495,Space Mind,Residential,Nano,Lowrise,Far,Medium,5,4,1052,21,26,1496,399 +2906,SM-499,Space Mind,Residential,Nano,Lowrise,Far,Medium,4,3,1024,16,20,1534,346 +2906,SM-500,Space Mind,Residential,Nano,Lowrise,Far,Medium,4,3,1053,16,20,1486,385 +2906,SM-505,Space Mind,Residential,Nano,Lowrise,Far,Medium,4,3,1024,18,22,1524,333 +2906,SM-506,Space Mind,Residential,Nano,Lowrise,Far,Medium,6,5,702,26,32,1419,424 +2906,SM-508,Space Mind,Residential,Nano,Lowrise,Far,Medium,4,3,733,16,20,1395,439 +2906,SM-509,Space Mind,Residential,Nano,Lowrise,Far,Medium,4,3,733,16,20,1384,447 +2906,SM-510,Space Mind,Residential,Nano,Lowrise,Far,Medium,4,3,1143,19,23,1369,456 +2906,SM-511,Space Mind,Residential,Nano,Lowrise,Far,Medium,5,4,916,21,26,1515,319 +2906,SM-538,Space Mind,Residential,Nano,Lowrise,Far,Medium,4,4,1042,20,24,1351,341 +2906,SM-539,Space Mind,Residential,Nano,Lowrise,Far,Medium,4,3,759,18,22,1321,364 +2906,SM-551,Space Mind,Residential,Nano,Lowrise,Far,Medium,4,3,1037,16,20,1326,301 +2970,SM-37,Space Mind,Residential,Micro,Lowrise,Far,Far,6,5,2130,27,33,1135,980 +2970,SM-42,Space Mind,Residential,Micro,Lowrise,Far,Far,4,3,2232,16,20,1123,1016 +2970,SM-43,Space Mind,Residential,Micro,Lowrise,Far,Far,4,3,2232,16,20,1072,1043 +2970,SM-51,Space Mind,Residential,Micro,Lowrise,Far,Far,6,5,2232,26,32,1111,1053 +2970,SM-52,Space Mind,Residential,Micro,Lowrise,Far,Far,5,4,2232,23,28,1060,1080 +2970,SM-54,Space Mind,Residential,Micro,Lowrise,Far,Far,4,3,2232,19,23,1048,1117 +2970,SM-61,Space Mind,Residential,Micro,Lowrise,Far,Far,4,3,1411,16,20,1552,935 +2970,SM-62,Space Mind,Residential,Micro,Lowrise,Far,Far,10,8,1507,41,51,1524,962 +2970,SM-63,Space Mind,Residential,Micro,Lowrise,Far,Far,4,3,1501,16,20,1495,986 +2970,SM-68,Space Mind,Residential,Micro,Lowrise,Far,Far,4,3,2232,18,22,1038,1154 +2970,SM-75,Space Mind,Residential,Micro,Lowrise,Far,Far,4,3,1473,16,20,1515,945 +2970,SM-77,Space Mind,Residential,Micro,Lowrise,Far,Far,4,4,1473,20,24,1457,983 +2970,SM-80,Space Mind,Residential,Micro,Lowrise,Far,Far,4,3,2128,17,21,1029,1191 +2970,SM-88,Space Mind,Residential,Micro,Lowrise,Far,Far,7,6,1915,30,37,1530,827 +2970,SM-89,Space Mind,Residential,Micro,Lowrise,Far,Far,4,3,2137,17,21,1512,840 +2970,SM-90,Space Mind,Residential,Micro,Lowrise,Far,Far,4,3,2138,18,22,1473,867 +2970,SM-91,Space Mind,Residential,Micro,Lowrise,Far,Far,4,3,1670,17,21,1456,880 +2970,SM-100,Space Mind,Residential,Micro,Lowrise,Far,Far,5,4,1288,21,26,1514,761 +2970,SM-102,Space Mind,Residential,Micro,Lowrise,Far,Far,4,3,1796,17,21,1494,768 +2970,SM-104,Space Mind,Residential,Micro,Lowrise,Far,Far,4,3,1865,17,21,1474,776 +2970,SM-118,Space Mind,Residential,Micro,Lowrise,Far,Far,7,5,1396,28,35,1126,995 +2970,SM-122,Space Mind,Residential,Micro,Lowrise,Far,Far,6,5,1223,26,32,1196,916 +2970,SM-131,Space Mind,Residential,Micro,Lowrise,Far,Far,4,3,1438,17,21,1117,979 +2970,SM-138,Space Mind,Residential,Micro,Lowrise,Far,Far,4,3,1438,16,20,1112,971 +2970,SM-143,Space Mind,Residential,Micro,Lowrise,Far,Far,4,3,1369,16,20,1188,889 +2970,SM-144,Space Mind,Residential,Micro,Lowrise,Far,Far,5,4,1438,22,27,1109,963 +2970,SM-153,Space Mind,Residential,Micro,Lowrise,Far,Far,4,3,1355,16,20,1186,880 +2970,SM-154,Space Mind,Residential,Micro,Lowrise,Far,Far,4,3,1330,16,20,1105,955 +2970,SM-191,Space Mind,Residential,Micro,Lowrise,Far,Far,5,4,1779,20,25,798,1159 +2970,SM-192,Space Mind,Residential,Micro,Lowrise,Far,Far,4,3,1727,16,20,997,956 +2970,SM-194,Space Mind,Residential,Micro,Lowrise,Far,Far,6,5,1733,26,32,934,1018 +2970,SM-195,Space Mind,Residential,Micro,Lowrise,Far,Far,4,3,1628,17,21,900,1053 +2970,SM-203,Space Mind,Residential,Micro,Lowrise,Far,Far,5,4,1855,24,29,794,1152 +2970,SM-204,Space Mind,Residential,Micro,Lowrise,Far,Far,4,4,1766,20,24,701,1245 +2970,SM-205,Space Mind,Residential,Micro,Lowrise,Far,Far,4,3,1729,19,23,701,1241 +2970,SM-207,Space Mind,Residential,Micro,Lowrise,Far,Far,4,3,1761,16,20,963,977 +2970,SM-208,Space Mind,Residential,Micro,Lowrise,Far,Far,4,3,1750,16,20,931,1009 +2970,SM-209,Space Mind,Residential,Micro,Lowrise,Far,Far,7,6,1631,31,38,900,1040 +2970,SM-210,Space Mind,Residential,Micro,Lowrise,Far,Far,5,4,1855,21,26,793,1146 +2970,SM-211,Space Mind,Residential,Micro,Lowrise,Far,Far,7,6,1692,31,38,701,1238 +2970,SM-219,Space Mind,Residential,Micro,Lowrise,Far,Far,4,3,1611,16,20,702,1235 +2970,SM-422,Space Mind,Residential,Micro,Lowrise,Far,Far,3,3,1661,15,18,1005,652 +2970,SM-423,Space Mind,Residential,Micro,Lowrise,Far,Far,5,4,1813,23,28,940,726 +2970,SM-446,Space Mind,Residential,Micro,Lowrise,Far,Far,4,3,1867,16,20,911,749 +2970,SM-454,Space Mind,Residential,Micro,Lowrise,Far,Far,4,3,1867,16,20,897,761 +2970,SM-461,Space Mind,Residential,Micro,Lowrise,Far,Far,9,7,1867,39,48,883,774 +2970,SM-476,Space Mind,Residential,Micro,Lowrise,Far,Far,8,7,1776,36,44,870,787 +2970,SM-552,Space Mind,Residential,Micro,Lowrise,Far,Far,3,3,2326,15,18,1005,635 +3018,NS-124,North Star,Commercial,Nano,Lowrise,Far,Medium,4,3,985,18,22,680,391 +3018,NS-131,North Star,Commercial,Nano,Lowrise,Far,Medium,4,3,993,19,23,621,453 +3018,NS-143,North Star,Commercial,Nano,Lowrise,Far,Medium,4,3,1018,17,21,682,412 +3018,NS-157,North Star,Commercial,Nano,Lowrise,Far,Medium,6,5,1018,26,32,686,435 +3018,NS-191,North Star,Commercial,Nano,Lowrise,Far,Medium,7,6,1091,31,38,639,539 +3018,NS-226,North Star,Commercial,Nano,Lowrise,Far,Medium,6,5,1079,27,33,655,567 +3018,NS-239,North Star,Commercial,Nano,Lowrise,Far,Medium,4,3,1053,18,22,783,507 +3018,NS-255,North Star,Commercial,Nano,Lowrise,Far,Medium,4,3,977,18,22,1611,304 +3018,NS-278,North Star,Commercial,Nano,Lowrise,Far,Medium,4,3,1062,17,21,1446,304 +3018,NS-287,North Star,Commercial,Nano,Lowrise,Far,Medium,5,4,1066,20,25,1691,376 +3018,NS-323,North Star,Commercial,Nano,Lowrise,Far,Medium,5,4,985,22,27,1691,384 +3018,NS-329,North Star,Commercial,Nano,Lowrise,Far,Medium,5,4,990,23,28,1592,423 +3018,NS-330,North Star,Commercial,Nano,Lowrise,Far,Medium,7,6,1014,30,37,1536,413 +3018,NS-340,North Star,Commercial,Nano,Lowrise,Far,Medium,4,3,979,19,23,1749,303 +3018,NS-342,North Star,Commercial,Nano,Lowrise,Far,Medium,4,3,979,16,20,1711,337 +3018,NS-344,North Star,Commercial,Nano,Lowrise,Far,Medium,4,3,877,18,22,1674,372 +3018,NS-348,North Star,Commercial,Nano,Lowrise,Far,Medium,4,3,1093,17,21,1387,443 +3018,NS-372,North Star,Commercial,Nano,Lowrise,Far,Medium,3,3,1053,15,18,1536,470 +3018,NS-386,North Star,Commercial,Nano,Lowrise,Far,Medium,3,3,1024,15,18,1593,432 +3018,NS-411,North Star,Commercial,Nano,Lowrise,Far,Medium,3,3,943,15,18,1537,485 +3018,NS-412,North Star,Commercial,Nano,Lowrise,Far,Medium,3,3,975,15,18,1446,508 +3018,NS-413,North Star,Commercial,Nano,Lowrise,Far,Medium,3,3,981,15,18,1387,517 +3018,NS-420,North Star,Commercial,Nano,Lowrise,Far,Medium,5,4,979,21,26,1386,577 +3018,NS-467,North Star,Commercial,Nano,Lowrise,Far,Medium,4,3,1091,16,20,1446,570 +3018,NS-480,North Star,Commercial,Nano,Lowrise,Far,Medium,6,4,954,24,30,1596,424 +3018,NS-481,North Star,Commercial,Nano,Lowrise,Far,Medium,5,4,1091,22,27,1447,572 +3018,NS-569,North Star,Commercial,Nano,Lowrise,Far,Medium,5,4,1101,21,26,1773,308 +3018,NS-847,North Star,Commercial,Nano,Lowrise,Far,Medium,5,4,960,21,26,1140,366 +3046,NS-356,North Star,Commercial,Micro,Lowrise,Far,Far,3,3,1902,15,18,728,730 +3046,NS-394,North Star,Commercial,Micro,Lowrise,Far,Far,3,3,2337,15,18,1131,607 +3046,NS-395,North Star,Commercial,Micro,Lowrise,Far,Far,3,3,1544,15,18,1096,629 +3046,NS-398,North Star,Commercial,Micro,Lowrise,Far,Far,3,3,1859,15,18,692,796 +3046,NS-423,North Star,Commercial,Micro,Lowrise,Far,Far,7,5,1225,28,35,1136,671 +3046,NS-443,North Star,Commercial,Micro,Lowrise,Far,Far,4,3,1475,16,20,708,879 +3046,NS-485,North Star,Commercial,Micro,Lowrise,Far,Far,4,3,1363,16,20,1138,736 +3046,NS-488,North Star,Commercial,Micro,Lowrise,Far,Far,5,4,1509,20,25,741,925 +3046,NS-489,North Star,Commercial,Micro,Lowrise,Far,Far,5,4,1496,21,26,683,945 +3046,NS-515,North Star,Commercial,Micro,Lowrise,Far,Far,4,3,1979,16,20,1414,619 +3046,NS-519,North Star,Commercial,Micro,Lowrise,Far,Far,6,5,1468,28,34,1081,841 +3046,NS-548,North Star,Commercial,Micro,Lowrise,Far,Far,4,3,1428,18,22,625,1104 +3046,NS-556,North Star,Commercial,Micro,Lowrise,Far,Far,4,3,1455,16,20,1056,909 +3046,NS-575,North Star,Commercial,Micro,Lowrise,Far,Far,7,5,1565,28,35,1138,919 +3046,NS-588,North Star,Commercial,Micro,Lowrise,Far,Far,5,4,2356,22,27,679,1173 +3046,NS-619,North Star,Commercial,Micro,Lowrise,Far,Far,4,3,1557,18,22,1144,946 +3046,NS-629,North Star,Commercial,Micro,Lowrise,Far,Far,4,3,1862,18,22,1151,962 +3046,NS-634,North Star,Commercial,Micro,Lowrise,Far,Far,5,4,1930,24,29,1152,972 +3064,DZ-2,District ZERO,Residential,Nano,Lowrise,Far,Medium,4,3,1091,16,20,1262,308 +3064,DZ-8,District ZERO,Residential,Nano,Lowrise,Far,Medium,4,3,1091,17,21,1255,322 +3064,DZ-12,District ZERO,Residential,Nano,Lowrise,Far,Medium,4,3,1012,16,20,1178,404 +3064,DZ-13,District ZERO,Residential,Nano,Lowrise,Far,Medium,6,5,1010,26,32,930,578 +3064,DZ-94,District ZERO,Residential,Nano,Lowrise,Far,Medium,3,3,1091,15,18,1543,492 +3064,DZ-95,District ZERO,Residential,Nano,Lowrise,Far,Medium,4,3,1061,16,20,1469,564 +3064,DZ-109,District ZERO,Residential,Nano,Lowrise,Far,Medium,3,3,1031,15,18,1543,450 +3064,DZ-110,District ZERO,Residential,Nano,Lowrise,Far,Medium,3,3,1065,15,18,1505,486 +3064,DZ-111,District ZERO,Residential,Nano,Lowrise,Far,Medium,9,7,1065,38,47,1486,504 +3064,DZ-112,District ZERO,Residential,Nano,Lowrise,Far,Medium,4,3,1065,16,20,1468,522 +3064,DZ-113,District ZERO,Residential,Nano,Lowrise,Far,Medium,4,3,1046,16,20,1449,540 +3064,DZ-358,District ZERO,Residential,Nano,Lowrise,Far,Medium,5,4,939,23,28,1354,514 +3064,DZ-367,District ZERO,Residential,Nano,Lowrise,Far,Medium,4,3,1049,16,20,1355,501 +3064,DZ-368,District ZERO,Residential,Nano,Lowrise,Far,Medium,5,4,1024,21,26,1299,539 +3064,DZ-377,District ZERO,Residential,Nano,Lowrise,Far,Medium,4,3,1049,16,20,1359,472 +3064,DZ-378,District ZERO,Residential,Nano,Lowrise,Far,Medium,4,3,1024,16,20,1304,513 +3064,DZ-384,District ZERO,Residential,Nano,Lowrise,Far,Medium,4,3,1049,19,23,1362,459 +3064,DZ-390,District ZERO,Residential,Nano,Lowrise,Far,Medium,7,6,944,30,37,1309,486 +3064,DZ-395,District ZERO,Residential,Nano,Lowrise,Far,Medium,4,3,1099,16,20,1459,345 +3064,DZ-397,District ZERO,Residential,Nano,Lowrise,Far,Medium,4,3,1137,16,20,1460,331 +3064,DZ-401,District ZERO,Residential,Nano,Lowrise,Far,Medium,4,3,1138,16,20,1462,317 +3064,DZ-448,District ZERO,Residential,Nano,Lowrise,Far,Medium,4,3,1028,16,20,1030,326 +3064,DZ-449,District ZERO,Residential,Nano,Lowrise,Far,Medium,4,3,1183,16,20,1011,343 +3064,DZ-453,District ZERO,Residential,Nano,Lowrise,Far,Medium,4,3,1028,17,21,736,568 +3064,DZ-471,District ZERO,Residential,Nano,Lowrise,Far,Medium,4,4,1049,20,24,687,580 +3064,DZ-479,District ZERO,Residential,Nano,Lowrise,Far,Medium,4,3,1031,16,20,882,386 +3064,DZ-480,District ZERO,Residential,Nano,Lowrise,Far,Medium,5,4,1056,21,26,826,432 +3064,DZ-481,District ZERO,Residential,Nano,Lowrise,Far,Medium,5,4,1065,22,27,885,375 +3064,DZ-482,District ZERO,Residential,Nano,Lowrise,Far,Medium,4,3,1093,18,22,830,422 +3064,DZ-483,District ZERO,Residential,Nano,Lowrise,Far,Medium,4,3,1062,16,20,743,500 +3064,DZ-488,District ZERO,Residential,Nano,Lowrise,Far,Medium,4,3,1065,16,20,889,364 +3064,DZ-490,District ZERO,Residential,Nano,Lowrise,Far,Medium,4,3,1062,16,20,748,492 +3064,DZ-491,District ZERO,Residential,Nano,Lowrise,Far,Medium,8,6,1065,32,40,893,353 +3064,DZ-492,District ZERO,Residential,Nano,Lowrise,Far,Medium,4,3,1095,16,20,839,403 +3064,DZ-493,District ZERO,Residential,Nano,Lowrise,Far,Medium,4,4,1062,20,24,753,483 +3064,DZ-495,District ZERO,Residential,Nano,Lowrise,Far,Medium,9,7,1062,39,48,758,473 +3064,DZ-496,District ZERO,Residential,Nano,Lowrise,Far,Medium,4,3,1068,16,20,697,528 +3064,DZ-500,District ZERO,Residential,Nano,Lowrise,Far,Medium,4,3,1015,16,20,903,336 +3064,DZ-501,District ZERO,Residential,Nano,Lowrise,Far,Medium,8,6,987,32,40,702,520 +3064,DZ-503,District ZERO,Residential,Nano,Lowrise,Far,Medium,4,3,990,18,22,916,312 +3064,DZ-504,District ZERO,Residential,Nano,Lowrise,Far,Medium,4,3,1014,16,20,861,361 +3064,DZ-505,District ZERO,Residential,Nano,Lowrise,Far,Medium,5,4,1014,21,26,623,577 +3064,DZ-508,District ZERO,Residential,Nano,Lowrise,Far,Medium,4,4,1024,20,24,919,302 +3064,DZ-510,District ZERO,Residential,Nano,Lowrise,Far,Medium,4,3,1091,16,20,774,434 +3064,DZ-511,District ZERO,Residential,Nano,Lowrise,Far,Medium,4,3,1091,18,22,715,490 +3064,DZ-518,District ZERO,Residential,Nano,Lowrise,Far,Medium,4,3,1052,19,23,866,344 +3064,DZ-528,District ZERO,Residential,Nano,Lowrise,Far,Medium,4,3,1054,16,20,873,329 +3064,DZ-530,District ZERO,Residential,Nano,Lowrise,Far,Medium,4,3,1065,17,21,727,462 +3064,DZ-531,District ZERO,Residential,Nano,Lowrise,Far,Medium,5,4,1046,20,25,707,480 +3064,DZ-532,District ZERO,Residential,Nano,Lowrise,Far,Medium,4,3,1049,16,20,639,543 +3064,DZ-538,District ZERO,Residential,Nano,Lowrise,Far,Medium,5,4,1021,22,27,801,362 +3064,DZ-539,District ZERO,Residential,Nano,Lowrise,Far,Medium,4,3,990,16,20,669,472 +3064,DZ-540,District ZERO,Residential,Nano,Lowrise,Far,Medium,4,3,1024,17,21,650,489 +3064,DZ-545,District ZERO,Residential,Nano,Lowrise,Far,Medium,4,3,1024,17,21,737,403 +3064,DZ-548,District ZERO,Residential,Nano,Lowrise,Far,Medium,5,4,1025,23,28,737,393 +3064,DZ-553,District ZERO,Residential,Nano,Lowrise,Far,Medium,4,3,1021,16,20,800,329 +3064,DZ-554,District ZERO,Residential,Nano,Lowrise,Far,Medium,6,4,1012,24,30,667,448 +3064,DZ-559,District ZERO,Residential,Nano,Lowrise,Far,Medium,4,3,946,16,20,737,377 +3064,DZ-581,District ZERO,Residential,Nano,Lowrise,Far,Medium,4,3,1140,16,20,742,341 +3064,DZ-596,District ZERO,Residential,Nano,Lowrise,Far,Medium,4,3,979,17,21,642,405 +3064,DZ-597,District ZERO,Residential,Nano,Lowrise,Far,Medium,4,3,979,16,20,623,423 +3064,DZ-598,District ZERO,Residential,Nano,Lowrise,Far,Medium,11,8,979,44,55,604,442 +3126,HH-34,Haven Heights,Commercial,Nano,Lowrise,Far,Medium,4,3,580,18,22,759,409 +3126,HH-73,Haven Heights,Commercial,Nano,Lowrise,Far,Medium,7,6,1031,32,39,1013,353 +3126,HH-80,Haven Heights,Commercial,Nano,Lowrise,Far,Medium,4,3,1091,16,20,1066,329 +3126,HH-99,Haven Heights,Commercial,Nano,Lowrise,Far,Medium,4,3,1091,18,22,1060,376 +3126,HH-117,Haven Heights,Commercial,Nano,Lowrise,Far,Medium,5,4,1091,22,27,994,484 +3126,HH-132,Haven Heights,Commercial,Nano,Lowrise,Far,Medium,4,3,1082,16,20,1026,515 +3126,HH-143,Haven Heights,Commercial,Nano,Lowrise,Far,Medium,4,3,1014,16,20,1038,568 +3126,HH-161,Haven Heights,Commercial,Nano,Lowrise,Far,Medium,8,7,982,35,43,1122,567 +3126,HH-164,Haven Heights,Commercial,Nano,Lowrise,Far,Medium,4,3,1063,19,23,1184,566 +3126,HH-175,Haven Heights,Commercial,Nano,Lowrise,Far,Medium,4,3,1051,16,20,1273,560 +3126,HH-222,Haven Heights,Commercial,Nano,Lowrise,Far,Medium,4,3,993,16,20,1649,374 +3126,HH-329,Haven Heights,Commercial,Nano,Lowrise,Far,Medium,4,3,849,16,20,1473,534 +3126,HH-370,Haven Heights,Commercial,Nano,Lowrise,Far,Medium,4,3,605,16,20,1451,560 +3126,HH-378,Haven Heights,Commercial,Nano,Lowrise,Far,Medium,4,4,1025,20,24,1531,517 +3126,HH-432,Haven Heights,Commercial,Nano,Lowrise,Far,Medium,4,3,1061,16,20,1560,390 +3126,HH-473,Haven Heights,Commercial,Nano,Lowrise,Far,Medium,6,5,1046,25,31,1526,366 +3126,HH-490,Haven Heights,Commercial,Nano,Lowrise,Far,Medium,4,4,628,20,24,1390,486 +3126,HH-681,Haven Heights,Commercial,Nano,Lowrise,Far,Medium,4,3,998,16,20,1889,355 +3126,HH-731,Haven Heights,Commercial,Nano,Lowrise,Far,Medium,4,3,1191,16,20,1114,568 +3126,HH-761,Haven Heights,Commercial,Nano,Lowrise,Far,Medium,4,4,1033,20,24,1098,598 +3126,HH-768,Haven Heights,Commercial,Nano,Lowrise,Far,Medium,4,3,1044,16,20,1155,587 +3126,HH-780,Haven Heights,Commercial,Nano,Lowrise,Far,Medium,4,3,1135,16,20,1244,491 +3126,HH-792,Haven Heights,Commercial,Nano,Lowrise,Far,Medium,10,8,1122,41,51,1263,433 +3126,HH-805,Haven Heights,Commercial,Nano,Lowrise,Far,Medium,3,3,1135,15,18,1301,348 +3126,HH-809,Haven Heights,Commercial,Nano,Lowrise,Far,Medium,4,3,1135,17,21,1452,334 +3126,HH-814,Haven Heights,Commercial,Nano,Lowrise,Far,Medium,3,3,1142,15,18,1241,301 +3126,HH-823,Haven Heights,Commercial,Nano,Lowrise,Far,Medium,3,3,1161,15,18,716,322 +3126,HH-849,Haven Heights,Commercial,Nano,Lowrise,Far,Medium,4,3,1122,17,21,618,450 +3126,HH-904,Haven Heights,Commercial,Nano,Lowrise,Far,Medium,4,3,1054,17,21,734,388 +3126,HH-920,Haven Heights,Commercial,Nano,Lowrise,Far,Medium,4,3,1024,16,20,882,343 +3126,HH-926,Haven Heights,Commercial,Nano,Lowrise,Far,Medium,7,6,961,30,37,1000,342 +3126,HH-944,Haven Heights,Commercial,Nano,Lowrise,Far,Medium,4,3,1044,16,20,1082,312 +3126,HH-951,Haven Heights,Commercial,Nano,Lowrise,Far,Medium,4,3,1003,16,20,902,436 +3126,HH-971,Haven Heights,Commercial,Nano,Lowrise,Far,Medium,4,4,1082,20,24,1004,441 +3160,NS-50,North Star,Residential,Nano,Lowrise,Far,Close,5,4,747,22,27,673,188 +3160,NS-118,North Star,Residential,Nano,Lowrise,Far,Close,5,4,464,20,25,780,274 +3160,NS-122,North Star,Residential,Nano,Lowrise,Far,Close,4,4,669,20,24,816,280 +3160,NS-128,North Star,Residential,Nano,Lowrise,Far,Close,4,4,765,20,24,819,293 +3160,NS-138,North Star,Residential,Nano,Lowrise,Far,Close,4,3,915,17,21,1302,150 +3160,NS-139,North Star,Residential,Nano,Lowrise,Far,Close,5,4,943,23,28,1283,169 +3160,NS-153,North Star,Residential,Nano,Lowrise,Far,Close,4,3,934,17,21,1304,166 +3160,NS-176,North Star,Residential,Nano,Lowrise,Far,Close,5,4,655,22,27,1757,173 +3160,NS-177,North Star,Residential,Nano,Lowrise,Far,Close,4,3,876,16,20,1738,165 +3160,NS-178,North Star,Residential,Nano,Lowrise,Far,Close,4,3,1086,16,20,1719,159 +3160,NS-182,North Star,Residential,Nano,Lowrise,Far,Close,9,7,1106,39,48,1220,279 +3160,NS-186,North Star,Residential,Nano,Lowrise,Far,Close,4,3,1179,16,20,1221,290 +3160,NS-243,North Star,Residential,Nano,Lowrise,Far,Close,9,7,1028,39,48,1447,265 +3160,NS-244,North Star,Residential,Nano,Lowrise,Far,Close,4,3,1028,16,20,1384,283 +3160,NS-249,North Star,Residential,Nano,Lowrise,Far,Close,4,4,1065,20,24,1874,283 +3160,NS-250,North Star,Residential,Nano,Lowrise,Far,Close,5,4,1064,23,28,1855,300 +3160,NS-257,North Star,Residential,Nano,Lowrise,Far,Close,4,4,1091,20,24,1554,287 +3160,NS-258,North Star,Residential,Nano,Lowrise,Far,Close,4,3,1091,16,20,1535,284 +3160,NS-259,North Star,Residential,Nano,Lowrise,Far,Close,4,4,1062,20,24,1447,284 +3160,NS-275,North Star,Residential,Nano,Lowrise,Far,Close,10,8,650,40,50,1891,265 +3160,NS-296,North Star,Residential,Nano,Lowrise,Far,Close,4,3,1058,16,20,1892,234 +3160,NS-297,North Star,Residential,Nano,Lowrise,Far,Close,4,3,1055,19,23,1873,248 +3160,NS-333,North Star,Residential,Nano,Lowrise,Far,Close,4,3,595,16,20,1923,153 +3160,NS-334,North Star,Residential,Nano,Lowrise,Far,Close,4,3,1105,16,20,1906,165 +3160,NS-336,North Star,Residential,Nano,Lowrise,Far,Close,4,3,1106,16,20,1863,201 +3160,NS-338,North Star,Residential,Nano,Lowrise,Far,Close,4,3,1078,16,20,1821,239 +3160,NS-339,North Star,Residential,Nano,Lowrise,Far,Close,4,3,946,19,23,1768,287 +3160,NS-375,North Star,Residential,Nano,Lowrise,Far,Close,3,3,857,15,18,1926,119 +3160,NS-376,North Star,Residential,Nano,Lowrise,Far,Close,3,3,1078,15,18,1907,137 +3160,NS-377,North Star,Residential,Nano,Lowrise,Far,Close,3,3,1078,15,18,1885,156 +3160,NS-378,North Star,Residential,Nano,Lowrise,Far,Close,3,3,1078,15,18,1863,174 +3160,NS-379,North Star,Residential,Nano,Lowrise,Far,Close,3,3,1078,15,18,1842,194 +3160,NS-380,North Star,Residential,Nano,Lowrise,Far,Close,3,3,1061,15,18,1820,213 +3160,NS-381,North Star,Residential,Nano,Lowrise,Far,Close,3,3,922,15,18,1768,262 +3160,NS-382,North Star,Residential,Nano,Lowrise,Far,Close,3,3,954,15,18,1749,280 +3160,NS-383,North Star,Residential,Nano,Lowrise,Far,Close,3,3,954,15,18,1730,299 +3160,NS-415,North Star,Residential,Nano,Lowrise,Far,Close,4,3,941,19,23,1748,267 +3160,NS-427,North Star,Residential,Nano,Lowrise,Far,Close,5,4,1147,22,27,1905,110 +3160,NS-429,North Star,Residential,Nano,Lowrise,Far,Close,7,5,1147,28,35,1862,153 +3160,NS-430,North Star,Residential,Nano,Lowrise,Far,Close,4,3,1147,17,21,1841,174 +3160,NS-431,North Star,Residential,Nano,Lowrise,Far,Close,4,3,1118,18,22,1820,195 +3160,NS-455,North Star,Residential,Nano,Lowrise,Far,Close,4,4,1049,20,24,1748,267 +3160,NS-474,North Star,Residential,Nano,Lowrise,Far,Close,4,4,1167,20,24,1885,142 +3160,NS-475,North Star,Residential,Nano,Lowrise,Far,Close,6,5,1163,28,34,1864,161 +3160,NS-477,North Star,Residential,Nano,Lowrise,Far,Close,4,3,1134,17,21,1821,202 +3160,NS-478,North Star,Residential,Nano,Lowrise,Far,Close,4,3,1049,18,22,1750,272 +3160,NS-646,North Star,Residential,Nano,Lowrise,Far,Close,4,3,776,16,20,2204,175 +3160,NS-651,North Star,Residential,Nano,Lowrise,Far,Close,5,4,941,23,28,2209,197 +3160,NS-664,North Star,Residential,Nano,Lowrise,Far,Close,4,3,1020,16,20,2214,218 +3160,NS-665,North Star,Residential,Nano,Lowrise,Far,Close,10,8,1118,42,52,2159,223 +3160,NS-685,North Star,Residential,Nano,Lowrise,Far,Close,5,4,931,21,26,2266,274 +3211,TG-28,Tranquility Gardens,Residential,Nano,Lowrise,Far,Medium,4,3,513,19,23,2763,398 +3211,TG-38,Tranquility Gardens,Residential,Nano,Lowrise,Far,Medium,5,4,575,20,25,2805,390 +3211,TG-39,Tranquility Gardens,Residential,Nano,Lowrise,Far,Medium,7,5,566,28,35,2767,412 +3211,TG-42,Tranquility Gardens,Residential,Nano,Lowrise,Far,Medium,4,3,863,16,20,2399,412 +3211,TG-43,Tranquility Gardens,Residential,Nano,Lowrise,Far,Medium,4,3,863,16,20,2382,405 +3211,TG-46,Tranquility Gardens,Residential,Nano,Lowrise,Far,Medium,6,5,575,27,33,2806,405 +3211,TG-47,Tranquility Gardens,Residential,Nano,Lowrise,Far,Medium,5,4,560,20,25,2768,428 +3211,TG-48,Tranquility Gardens,Residential,Nano,Lowrise,Far,Medium,6,5,575,27,33,2807,421 +3211,TG-49,Tranquility Gardens,Residential,Nano,Lowrise,Far,Medium,7,5,553,28,35,2768,443 +3211,TG-52,Tranquility Gardens,Residential,Nano,Lowrise,Far,Medium,4,3,575,18,22,2808,437 +3211,TG-53,Tranquility Gardens,Residential,Nano,Lowrise,Far,Medium,4,3,547,16,20,2770,458 +3211,TG-55,Tranquility Gardens,Residential,Nano,Lowrise,Far,Medium,4,3,875,17,21,2401,462 +3211,TG-56,Tranquility Gardens,Residential,Nano,Lowrise,Far,Medium,5,4,873,20,25,2385,455 +3211,TG-57,Tranquility Gardens,Residential,Nano,Lowrise,Far,Medium,4,3,870,16,20,2369,448 +3211,TG-59,Tranquility Gardens,Residential,Nano,Lowrise,Far,Medium,7,6,542,30,37,2809,453 +3211,TG-63,Tranquility Gardens,Residential,Nano,Lowrise,Far,Medium,4,3,923,18,22,2814,526 +3211,TG-65,Tranquility Gardens,Residential,Nano,Lowrise,Far,Medium,4,3,920,16,20,2791,537 +3211,TG-66,Tranquility Gardens,Residential,Nano,Lowrise,Far,Medium,8,6,919,32,40,2779,543 +3211,TG-67,Tranquility Gardens,Residential,Nano,Lowrise,Far,Medium,5,4,603,22,27,2769,548 +3211,TG-69,Tranquility Gardens,Residential,Nano,Lowrise,Far,Medium,4,3,751,18,22,2833,596 +3211,TG-70,Tranquility Gardens,Residential,Nano,Lowrise,Far,Medium,4,3,907,16,20,2823,600 +3211,TG-78,Tranquility Gardens,Residential,Nano,Lowrise,Far,Medium,4,3,1198,16,20,4567,305 +3211,TG-79,Tranquility Gardens,Residential,Nano,Lowrise,Far,Medium,4,4,928,20,24,4471,403 +3211,TG-83,Tranquility Gardens,Residential,Nano,Lowrise,Far,Medium,5,4,1198,21,26,4569,314 +3211,TG-84,Tranquility Gardens,Residential,Nano,Lowrise,Far,Medium,4,3,749,16,20,4412,461 +3211,TG-88,Tranquility Gardens,Residential,Nano,Lowrise,Far,Medium,4,3,1198,19,23,4571,324 +3211,TG-89,Tranquility Gardens,Residential,Nano,Lowrise,Far,Medium,7,6,928,30,37,4473,409 +3211,TG-90,Tranquility Gardens,Residential,Nano,Lowrise,Far,Medium,4,3,929,17,21,4474,416 +3211,TG-95,Tranquility Gardens,Residential,Nano,Lowrise,Far,Medium,5,4,1198,23,28,4573,335 +3211,TG-97,Tranquility Gardens,Residential,Nano,Lowrise,Far,Medium,9,7,957,36,45,4417,479 +3211,TG-100,Tranquility Gardens,Residential,Nano,Lowrise,Far,Medium,4,3,1178,16,20,4631,303 +3211,TG-101,Tranquility Gardens,Residential,Nano,Lowrise,Far,Medium,5,4,888,24,29,4478,432 +3211,TG-102,Tranquility Gardens,Residential,Nano,Lowrise,Far,Medium,4,3,896,17,21,4418,486 +3211,TG-109,Tranquility Gardens,Residential,Nano,Lowrise,Far,Medium,4,3,946,16,20,4658,341 +3211,TG-110,Tranquility Gardens,Residential,Nano,Lowrise,Far,Medium,4,3,979,16,20,4639,352 +3211,TG-111,Tranquility Gardens,Residential,Nano,Lowrise,Far,Medium,6,5,979,25,31,4620,365 +3211,TG-112,Tranquility Gardens,Residential,Nano,Lowrise,Far,Medium,5,4,979,24,29,4601,378 +3211,TG-124,Tranquility Gardens,Residential,Nano,Lowrise,Far,Medium,6,5,922,25,31,4665,301 +3211,TG-125,Tranquility Gardens,Residential,Nano,Lowrise,Far,Medium,4,3,954,16,20,4646,312 +3211,TG-126,Tranquility Gardens,Residential,Nano,Lowrise,Far,Medium,10,8,954,42,52,4627,325 +3211,TG-127,Tranquility Gardens,Residential,Nano,Lowrise,Far,Medium,4,3,954,16,20,4608,337 +3211,TG-142,Tranquility Gardens,Residential,Nano,Lowrise,Far,Medium,4,3,917,16,20,4524,362 +3211,TG-144,Tranquility Gardens,Residential,Nano,Lowrise,Far,Medium,4,3,1024,16,20,4487,397 +3211,TG-145,Tranquility Gardens,Residential,Nano,Lowrise,Far,Medium,5,4,1025,23,28,4468,415 +3211,TG-146,Tranquility Gardens,Residential,Nano,Lowrise,Far,Medium,4,3,1025,16,20,4449,433 +3211,TG-161,Tranquility Gardens,Residential,Nano,Lowrise,Far,Medium,6,4,1044,24,30,4515,361 +3211,TG-162,Tranquility Gardens,Residential,Nano,Lowrise,Far,Medium,4,3,1037,16,20,4477,398 +3211,TG-164,Tranquility Gardens,Residential,Nano,Lowrise,Far,Medium,4,3,1011,19,23,4439,436 +3211,TG-225,Tranquility Gardens,Residential,Nano,Lowrise,Far,Medium,4,3,817,18,22,4494,404 +3211,TG-280,Tranquility Gardens,Residential,Nano,Lowrise,Far,Medium,5,4,1139,23,28,4669,302 +3211,TG-284,Tranquility Gardens,Residential,Nano,Lowrise,Far,Medium,4,4,1140,20,24,4657,313 +3211,TG-307,Tranquility Gardens,Residential,Nano,Lowrise,Far,Medium,4,3,1098,17,21,4545,422 +3211,TG-308,Tranquility Gardens,Residential,Nano,Lowrise,Far,Medium,4,3,1135,16,20,4529,438 +3211,TG-309,Tranquility Gardens,Residential,Nano,Lowrise,Far,Medium,4,3,1135,17,21,4497,468 +3211,TG-310,Tranquility Gardens,Residential,Nano,Lowrise,Far,Medium,5,4,1135,24,29,4481,471 +3211,TG-327,Tranquility Gardens,Residential,Nano,Lowrise,Far,Medium,4,3,1096,17,21,4510,446 +3211,TG-328,Tranquility Gardens,Residential,Nano,Lowrise,Far,Medium,4,3,1129,17,21,4494,465 +3211,TG-329,Tranquility Gardens,Residential,Nano,Lowrise,Far,Medium,5,4,1126,24,29,4478,485 +3211,TG-330,Tranquility Gardens,Residential,Nano,Lowrise,Far,Medium,4,3,1118,16,20,4446,520 +3211,TG-331,Tranquility Gardens,Residential,Nano,Lowrise,Far,Medium,4,3,1095,17,21,4430,533 +3211,TG-347,Tranquility Gardens,Residential,Nano,Lowrise,Far,Medium,4,3,1031,18,22,4285,582 +3211,TG-352,Tranquility Gardens,Residential,Nano,Lowrise,Far,Medium,10,8,1135,41,51,4441,446 +3211,TG-353,Tranquility Gardens,Residential,Nano,Lowrise,Far,Medium,5,4,1135,21,26,4425,459 +3211,TG-354,Tranquility Gardens,Residential,Nano,Lowrise,Far,Medium,4,3,1135,18,22,4409,472 +3211,TG-356,Tranquility Gardens,Residential,Nano,Lowrise,Far,Medium,4,3,1104,16,20,4376,496 +3211,TG-357,Tranquility Gardens,Residential,Nano,Lowrise,Far,Medium,9,7,1091,37,46,4319,535 +3211,TG-358,Tranquility Gardens,Residential,Nano,Lowrise,Far,Medium,6,5,1065,26,32,4273,566 +3211,TG-359,Tranquility Gardens,Residential,Nano,Lowrise,Far,Medium,4,3,1091,16,20,4307,518 +3211,TG-360,Tranquility Gardens,Residential,Nano,Lowrise,Far,Medium,5,4,1065,24,29,4262,550 +3211,TG-362,Tranquility Gardens,Residential,Nano,Lowrise,Far,Medium,4,3,1091,17,21,4296,502 +3211,TG-369,Tranquility Gardens,Residential,Nano,Lowrise,Far,Medium,4,4,1096,20,24,4425,389 +3211,TG-371,Tranquility Gardens,Residential,Nano,Lowrise,Far,Medium,5,4,1126,22,27,4392,414 +3211,TG-373,Tranquility Gardens,Residential,Nano,Lowrise,Far,Medium,5,4,1118,21,26,4359,437 +3211,TG-374,Tranquility Gardens,Residential,Nano,Lowrise,Far,Medium,9,7,1091,36,45,4284,485 +3211,TG-375,Tranquility Gardens,Residential,Nano,Lowrise,Far,Medium,7,6,1065,30,37,4238,517 +3211,TG-379,Tranquility Gardens,Residential,Nano,Lowrise,Far,Medium,4,3,985,16,20,4227,501 +3211,TG-404,Tranquility Gardens,Residential,Nano,Lowrise,Far,Medium,7,5,383,28,35,3929,564 +3211,TG-406,Tranquility Gardens,Residential,Nano,Lowrise,Far,Medium,7,5,675,28,35,3911,552 +3211,TG-418,Tranquility Gardens,Residential,Nano,Lowrise,Far,Medium,4,3,966,16,20,3893,539 +3211,TG-427,Tranquility Gardens,Residential,Nano,Lowrise,Far,Medium,4,3,927,16,20,4168,350 +3211,TG-428,Tranquility Gardens,Residential,Nano,Lowrise,Far,Medium,4,3,1154,16,20,4148,355 +3211,TG-473,Tranquility Gardens,Residential,Nano,Lowrise,Far,Medium,4,3,743,16,20,3595,401 +3211,TG-510,Tranquility Gardens,Residential,Nano,Lowrise,Far,Medium,4,3,914,18,22,3123,510 +3211,TG-512,Tranquility Gardens,Residential,Nano,Lowrise,Far,Medium,4,3,1021,16,20,3094,527 +3211,TG-514,Tranquility Gardens,Residential,Nano,Lowrise,Far,Medium,4,4,1021,20,24,3064,545 +3211,TG-515,Tranquility Gardens,Residential,Nano,Lowrise,Far,Medium,4,3,991,19,23,3049,554 +3211,TG-528,Tranquility Gardens,Residential,Nano,Lowrise,Far,Medium,6,5,1164,27,33,3244,366 +3211,TG-533,Tranquility Gardens,Residential,Nano,Lowrise,Far,Medium,4,3,912,17,21,3085,454 +3211,TG-534,Tranquility Gardens,Residential,Nano,Lowrise,Far,Medium,4,3,1016,16,20,3070,462 +3211,TG-536,Tranquility Gardens,Residential,Nano,Lowrise,Far,Medium,4,3,1009,16,20,3040,482 +3211,TG-537,Tranquility Gardens,Residential,Nano,Lowrise,Far,Medium,4,3,1005,18,22,3025,490 +3211,TG-538,Tranquility Gardens,Residential,Nano,Lowrise,Far,Medium,6,5,984,25,31,3010,499 +3211,TG-540,Tranquility Gardens,Residential,Nano,Lowrise,Far,Medium,4,3,832,16,20,2737,525 +3211,TG-547,Tranquility Gardens,Residential,Nano,Lowrise,Far,Medium,6,5,860,27,33,2669,456 +3211,TG-549,Tranquility Gardens,Residential,Nano,Lowrise,Far,Medium,5,4,1054,23,28,2568,455 +3211,TG-550,Tranquility Gardens,Residential,Nano,Lowrise,Far,Medium,4,3,1055,16,20,2526,454 +3211,TG-558,Tranquility Gardens,Residential,Nano,Lowrise,Far,Medium,6,5,958,28,34,2619,442 +3211,TG-559,Tranquility Gardens,Residential,Nano,Lowrise,Far,Medium,4,3,1091,16,20,2555,436 +3211,TG-562,Tranquility Gardens,Residential,Nano,Lowrise,Far,Medium,4,3,696,16,20,2640,419 +3211,TG-564,Tranquility Gardens,Residential,Nano,Lowrise,Far,Medium,4,3,1091,16,20,2542,417 +3211,TG-565,Tranquility Gardens,Residential,Nano,Lowrise,Far,Medium,4,3,1094,16,20,2499,416 +3211,TG-566,Tranquility Gardens,Residential,Nano,Lowrise,Far,Medium,9,7,599,36,45,2625,400 +3211,TG-567,Tranquility Gardens,Residential,Nano,Lowrise,Far,Medium,4,3,961,16,20,2594,404 +3211,TG-580,Tranquility Gardens,Residential,Nano,Lowrise,Far,Medium,7,5,880,29,36,2604,373 +3211,TG-583,Tranquility Gardens,Residential,Nano,Lowrise,Far,Medium,4,4,1096,20,24,2473,377 +3211,TG-585,Tranquility Gardens,Residential,Nano,Lowrise,Far,Medium,8,6,862,34,42,2569,367 +3211,TG-586,Tranquility Gardens,Residential,Nano,Lowrise,Far,Medium,4,3,976,16,20,2503,360 +3211,TG-587,Tranquility Gardens,Residential,Nano,Lowrise,Far,Medium,4,3,982,16,20,2460,359 +3319,DZ-90,District ZERO,Residential,Micro,Lowrise,Far,Far,4,3,1621,16,20,661,1166 +3319,DZ-106,District ZERO,Residential,Micro,Lowrise,Far,Far,10,8,1700,40,50,693,1162 +3319,DZ-107,District ZERO,Residential,Micro,Lowrise,Far,Far,4,3,1655,18,22,643,1204 +3319,DZ-121,District ZERO,Residential,Micro,Lowrise,Far,Far,5,4,1702,23,28,681,1183 +3319,DZ-122,District ZERO,Residential,Micro,Lowrise,Far,Far,4,3,1633,16,20,625,1228 +3319,DZ-144,District ZERO,Residential,Micro,Lowrise,Far,Far,4,3,1733,16,20,963,824 +3319,DZ-145,District ZERO,Residential,Micro,Lowrise,Far,Far,9,8,2165,40,49,913,871 +3319,DZ-148,District ZERO,Residential,Micro,Lowrise,Far,Far,4,3,1579,17,21,980,809 +3319,DZ-149,District ZERO,Residential,Micro,Lowrise,Far,Far,8,6,1665,32,40,825,967 +3319,DZ-159,District ZERO,Residential,Micro,Lowrise,Far,Far,4,3,2246,16,20,879,926 +3319,DZ-186,District ZERO,Residential,Micro,Lowrise,Far,Far,8,6,1771,32,40,910,1005 +3319,DZ-193,District ZERO,Residential,Micro,Lowrise,Far,Far,4,3,2183,16,20,605,1278 +3319,DZ-207,District ZERO,Residential,Micro,Lowrise,Far,Far,8,7,1775,35,43,1117,926 +3319,DZ-224,District ZERO,Residential,Micro,Lowrise,Far,Far,4,4,1801,20,24,1252,919 +3319,DZ-227,District ZERO,Residential,Micro,Lowrise,Far,Far,4,3,1426,16,20,1180,988 +3319,DZ-228,District ZERO,Residential,Micro,Lowrise,Far,Far,4,4,1476,20,24,1161,1000 +3319,DZ-229,District ZERO,Residential,Micro,Lowrise,Far,Far,4,3,1478,16,20,1122,1025 +3319,DZ-232,District ZERO,Residential,Micro,Lowrise,Far,Far,4,3,1833,16,20,1310,881 +3319,DZ-244,District ZERO,Residential,Micro,Lowrise,Far,Far,5,4,1346,23,28,1171,1027 +3319,DZ-245,District ZERO,Residential,Micro,Lowrise,Far,Far,5,4,1266,21,26,1152,1042 +3319,DZ-248,District ZERO,Residential,Micro,Lowrise,Far,Far,4,3,1837,16,20,1300,923 +3319,DZ-249,District ZERO,Residential,Micro,Lowrise,Far,Far,4,3,2082,17,21,1237,983 +3319,DZ-250,District ZERO,Residential,Micro,Lowrise,Far,Far,8,6,2210,32,40,1531,719 +3319,DZ-255,District ZERO,Residential,Micro,Lowrise,Far,Far,4,3,1277,18,22,1298,934 +3319,DZ-276,District ZERO,Residential,Micro,Lowrise,Far,Far,4,3,1261,16,20,991,1015 +3319,DZ-277,District ZERO,Residential,Micro,Lowrise,Far,Far,4,3,1256,17,21,971,1027 +3319,DZ-278,District ZERO,Residential,Micro,Lowrise,Far,Far,4,3,1222,16,20,931,1054 +3319,DZ-319,District ZERO,Residential,Micro,Lowrise,Far,Far,8,6,1832,32,40,821,985 +3319,DZ-412,District ZERO,Residential,Micro,Lowrise,Far,Far,8,6,1674,32,40,859,736 +3348,HH-194,Haven Heights,Commercial,Micro,Lowrise,Far,Far,4,3,1842,16,20,1006,720 +3348,HH-195,Haven Heights,Commercial,Micro,Lowrise,Far,Far,4,3,1774,18,22,897,771 +3348,HH-200,Haven Heights,Commercial,Micro,Lowrise,Far,Far,4,3,1534,16,20,1321,616 +3348,HH-201,Haven Heights,Commercial,Micro,Lowrise,Far,Far,4,3,1534,16,20,1292,637 +3348,HH-202,Haven Heights,Commercial,Micro,Lowrise,Far,Far,4,3,1427,17,21,1265,658 +3348,HH-219,Haven Heights,Commercial,Micro,Lowrise,Far,Far,4,3,2059,16,20,1009,754 +3348,HH-242,Haven Heights,Commercial,Micro,Lowrise,Far,Far,9,7,1521,37,46,917,830 +3348,HH-255,Haven Heights,Commercial,Micro,Lowrise,Far,Far,4,3,1309,16,20,622,1008 +3348,HH-269,Haven Heights,Commercial,Micro,Lowrise,Far,Far,4,3,2199,16,20,1410,663 +3348,HH-331,Haven Heights,Commercial,Micro,Lowrise,Far,Far,4,3,1289,16,20,1296,738 +3348,HH-345,Haven Heights,Commercial,Micro,Lowrise,Far,Far,4,3,1440,16,20,1281,749 +3348,HH-372,Haven Heights,Commercial,Micro,Lowrise,Far,Far,4,3,1441,16,20,1264,762 +3348,HH-421,Haven Heights,Commercial,Micro,Lowrise,Far,Far,7,6,1772,31,38,1039,1047 +3348,HH-423,Haven Heights,Commercial,Micro,Lowrise,Far,Far,4,3,1643,19,23,644,1263 +3348,HH-450,Haven Heights,Commercial,Micro,Lowrise,Far,Far,4,3,1458,16,20,958,1131 +3348,HH-465,Haven Heights,Commercial,Micro,Lowrise,Far,Far,4,3,1687,16,20,629,1314 +3348,HH-557,Haven Heights,Commercial,Micro,Lowrise,Far,Far,4,3,1973,16,20,857,951 +3348,HH-559,Haven Heights,Commercial,Micro,Lowrise,Far,Far,4,3,1672,17,21,608,1423 +3348,HH-565,Haven Heights,Commercial,Micro,Lowrise,Far,Far,4,3,2350,16,20,1064,645 +3348,HH-566,Haven Heights,Commercial,Micro,Lowrise,Far,Far,4,3,2241,17,21,1032,687 +3348,HH-591,Haven Heights,Commercial,Micro,Lowrise,Far,Far,4,3,2294,16,20,1027,642 +3348,HH-618,Haven Heights,Commercial,Micro,Lowrise,Far,Far,4,3,1204,16,20,749,932 +3348,HH-669,Haven Heights,Commercial,Micro,Lowrise,Far,Far,4,3,1758,19,23,770,828 +3348,HH-670,Haven Heights,Commercial,Micro,Lowrise,Far,Far,4,3,1758,16,20,713,891 +3348,HH-700,Haven Heights,Commercial,Micro,Lowrise,Far,Far,4,3,1802,19,23,686,907 +3348,HH-718,Haven Heights,Commercial,Micro,Lowrise,Far,Far,4,3,2171,16,20,723,873 +3348,HH-757,Haven Heights,Commercial,Micro,Lowrise,Far,Far,8,6,2284,33,41,844,739 +3375,TG-117,Tranquility Gardens,Residential,Micro,Lowrise,Far,Far,4,3,1300,16,20,4305,612 +3375,TG-119,Tranquility Gardens,Residential,Micro,Lowrise,Far,Far,4,4,1417,20,24,4254,611 +3375,TG-132,Tranquility Gardens,Residential,Micro,Lowrise,Far,Far,8,6,1267,34,42,4288,607 +3375,TG-133,Tranquility Gardens,Residential,Micro,Lowrise,Far,Far,5,4,1267,21,26,4263,630 +3375,TG-140,Tranquility Gardens,Residential,Micro,Lowrise,Far,Far,5,4,1363,24,29,4264,612 +3375,TG-153,Tranquility Gardens,Residential,Micro,Lowrise,Far,Far,4,4,1424,20,24,4266,609 +3375,TG-157,Tranquility Gardens,Residential,Micro,Lowrise,Far,Far,4,3,1482,19,23,3323,832 +3375,TG-158,Tranquility Gardens,Residential,Micro,Lowrise,Far,Far,4,3,1482,16,20,3273,846 +3375,TG-168,Tranquility Gardens,Residential,Micro,Lowrise,Far,Far,5,4,1666,22,27,3329,863 +3375,TG-169,Tranquility Gardens,Residential,Micro,Lowrise,Far,Far,4,4,1482,20,24,3279,874 +3375,TG-173,Tranquility Gardens,Residential,Micro,Lowrise,Far,Far,4,3,1508,16,20,4270,605 +3375,TG-176,Tranquility Gardens,Residential,Micro,Lowrise,Far,Far,4,3,1435,16,20,3289,903 +3375,TG-177,Tranquility Gardens,Residential,Micro,Lowrise,Far,Far,5,4,1682,23,28,3139,966 +3375,TG-183,Tranquility Gardens,Residential,Micro,Lowrise,Far,Far,10,8,1602,42,52,4272,611 +3375,TG-184,Tranquility Gardens,Residential,Micro,Lowrise,Far,Far,4,3,1638,16,20,3201,973 +3375,TG-188,Tranquility Gardens,Residential,Micro,Lowrise,Far,Far,4,3,1615,18,22,3083,1039 +3375,TG-190,Tranquility Gardens,Residential,Micro,Lowrise,Far,Far,4,3,1651,19,23,4274,611 +3375,TG-192,Tranquility Gardens,Residential,Micro,Lowrise,Far,Far,4,4,1685,20,24,3155,1022 +3375,TG-193,Tranquility Gardens,Residential,Micro,Lowrise,Far,Far,7,6,1470,30,37,3066,1051 +3375,TG-197,Tranquility Gardens,Residential,Micro,Lowrise,Far,Far,4,4,1701,20,24,4277,611 +3375,TG-202,Tranquility Gardens,Residential,Micro,Lowrise,Far,Far,4,4,1750,20,24,4280,611 +3375,TG-209,Tranquility Gardens,Residential,Micro,Lowrise,Far,Far,4,3,1697,17,21,4282,611 +3375,TG-212,Tranquility Gardens,Residential,Micro,Lowrise,Far,Far,4,3,1237,16,20,3044,1131 +3375,TG-213,Tranquility Gardens,Residential,Micro,Lowrise,Far,Far,10,8,1647,42,52,2934,1180 +3375,TG-215,Tranquility Gardens,Residential,Micro,Lowrise,Far,Far,4,4,1457,20,24,3027,1144 +3375,TG-220,Tranquility Gardens,Residential,Micro,Lowrise,Far,Far,6,5,1630,28,34,2884,1225 +3375,TG-222,Tranquility Gardens,Residential,Micro,Lowrise,Far,Far,4,3,2016,16,20,4290,612 +3375,TG-224,Tranquility Gardens,Residential,Micro,Lowrise,Far,Far,4,3,1651,16,20,2948,1208 +3375,TG-227,Tranquility Gardens,Residential,Micro,Lowrise,Far,Far,4,3,2102,19,23,4294,613 +3375,TG-229,Tranquility Gardens,Residential,Micro,Lowrise,Far,Far,8,6,1387,33,41,3609,1069 +3375,TG-231,Tranquility Gardens,Residential,Micro,Lowrise,Far,Far,5,4,2139,21,26,4298,614 +3375,TG-233,Tranquility Gardens,Residential,Micro,Lowrise,Far,Far,5,4,1766,24,29,3603,1093 +3375,TG-236,Tranquility Gardens,Residential,Micro,Lowrise,Far,Far,6,5,1657,25,31,2905,1286 +3375,TG-251,Tranquility Gardens,Residential,Micro,Lowrise,Far,Far,4,3,2123,16,20,3443,1267 +3375,TG-252,Tranquility Gardens,Residential,Micro,Lowrise,Far,Far,4,3,2123,16,20,3425,1270 +3375,TG-254,Tranquility Gardens,Residential,Micro,Lowrise,Far,Far,4,3,2123,17,21,3388,1277 +3375,TG-264,Tranquility Gardens,Residential,Micro,Lowrise,Far,Far,6,5,1202,28,34,3492,1362 +3375,TG-267,Tranquility Gardens,Residential,Micro,Lowrise,Far,Far,4,3,1398,16,20,3475,1369 +3375,TG-269,Tranquility Gardens,Residential,Micro,Lowrise,Far,Far,5,4,2139,20,25,3327,1396 +3375,TG-270,Tranquility Gardens,Residential,Micro,Lowrise,Far,Far,4,3,2200,16,20,3274,1411 +3375,TG-273,Tranquility Gardens,Residential,Micro,Lowrise,Far,Far,4,3,1889,16,20,3425,1391 +3375,TG-274,Tranquility Gardens,Residential,Micro,Lowrise,Far,Far,5,4,1831,23,28,3410,1398 +3375,TG-277,Tranquility Gardens,Residential,Micro,Lowrise,Far,Far,4,3,2139,16,20,3340,1434 +3375,TG-278,Tranquility Gardens,Residential,Micro,Lowrise,Far,Far,4,3,2202,18,22,3288,1449 +3375,TG-305,Tranquility Gardens,Residential,Micro,Lowrise,Far,Far,4,3,1358,19,23,3179,1343 +3375,TG-312,Tranquility Gardens,Residential,Micro,Lowrise,Far,Far,6,5,1360,25,31,3175,1330 +3375,TG-313,Tranquility Gardens,Residential,Micro,Lowrise,Far,Far,4,3,1872,16,20,3040,1338 +3375,TG-314,Tranquility Gardens,Residential,Micro,Lowrise,Far,Far,6,5,1872,27,33,3003,1336 +3375,TG-315,Tranquility Gardens,Residential,Micro,Lowrise,Far,Far,6,5,1872,26,32,2966,1335 +3375,TG-316,Tranquility Gardens,Residential,Micro,Lowrise,Far,Far,4,3,1872,16,20,2928,1332 +3375,TG-323,Tranquility Gardens,Residential,Micro,Lowrise,Far,Far,4,3,1361,19,23,3172,1316 +3375,TG-333,Tranquility Gardens,Residential,Micro,Lowrise,Far,Far,9,8,1309,40,49,3067,1297 +3375,TG-336,Tranquility Gardens,Residential,Micro,Lowrise,Far,Far,4,3,1631,18,22,2955,1288 +3375,TG-337,Tranquility Gardens,Residential,Micro,Lowrise,Far,Far,6,5,1729,28,34,2917,1284 +3375,TG-343,Tranquility Gardens,Residential,Micro,Lowrise,Far,Far,5,4,1588,22,27,4209,668 +3375,TG-376,Tranquility Gardens,Residential,Micro,Lowrise,Far,Far,4,3,1540,16,20,4070,624 +3375,TG-380,Tranquility Gardens,Residential,Micro,Lowrise,Far,Far,5,4,1914,21,26,3697,828 +3375,TG-381,Tranquility Gardens,Residential,Micro,Lowrise,Far,Far,4,3,1774,16,20,3678,831 +3375,TG-382,Tranquility Gardens,Residential,Micro,Lowrise,Far,Far,4,3,1550,16,20,3660,835 +3375,TG-383,Tranquility Gardens,Residential,Micro,Lowrise,Far,Far,6,5,1327,27,33,3641,839 +3375,TG-387,Tranquility Gardens,Residential,Micro,Lowrise,Far,Far,5,4,1530,23,28,3534,856 +3375,TG-391,Tranquility Gardens,Residential,Micro,Lowrise,Far,Far,6,5,1454,28,34,3750,695 +3375,TG-392,Tranquility Gardens,Residential,Micro,Lowrise,Far,Far,5,4,1455,21,26,3729,709 +3375,TG-393,Tranquility Gardens,Residential,Micro,Lowrise,Far,Far,5,4,1456,23,28,3709,723 +3375,TG-407,Tranquility Gardens,Residential,Micro,Lowrise,Far,Far,4,3,2034,16,20,3627,733 +3375,TG-408,Tranquility Gardens,Residential,Micro,Lowrise,Far,Far,4,3,2093,17,21,3612,742 +3375,TG-409,Tranquility Gardens,Residential,Micro,Lowrise,Far,Far,5,4,2093,20,25,3597,751 +3375,TG-410,Tranquility Gardens,Residential,Micro,Lowrise,Far,Far,4,3,2093,16,20,3582,761 +3375,TG-411,Tranquility Gardens,Residential,Micro,Lowrise,Far,Far,4,3,2093,16,20,3567,771 +3375,TG-412,Tranquility Gardens,Residential,Micro,Lowrise,Far,Far,5,4,2056,22,27,3552,781 +3375,TG-420,Tranquility Gardens,Residential,Micro,Lowrise,Far,Far,4,3,1420,16,20,3673,674 +3375,TG-421,Tranquility Gardens,Residential,Micro,Lowrise,Far,Far,8,7,1400,35,43,3653,685 +3375,TG-430,Tranquility Gardens,Residential,Micro,Lowrise,Far,Far,5,4,1995,21,26,3347,819 +3375,TG-432,Tranquility Gardens,Residential,Micro,Lowrise,Far,Far,8,7,1578,36,44,3321,822 +3375,TG-433,Tranquility Gardens,Residential,Micro,Lowrise,Far,Far,4,3,1291,16,20,3285,826 +3375,TG-435,Tranquility Gardens,Residential,Micro,Lowrise,Far,Far,8,6,1582,34,42,3591,618 +3375,TG-436,Tranquility Gardens,Residential,Micro,Lowrise,Far,Far,5,4,1692,20,25,3515,668 +3375,TG-440,Tranquility Gardens,Residential,Micro,Lowrise,Far,Far,4,4,1890,20,24,3503,651 +3375,TG-445,Tranquility Gardens,Residential,Micro,Lowrise,Far,Far,4,3,1892,16,20,3491,634 +3375,TG-454,Tranquility Gardens,Residential,Micro,Lowrise,Far,Far,5,4,1894,23,28,3479,617 +3375,TG-466,Tranquility Gardens,Residential,Micro,Lowrise,Far,Far,4,3,2035,16,20,3194,683 +3375,TG-477,Tranquility Gardens,Residential,Micro,Lowrise,Far,Far,4,3,2117,16,20,3182,665 +3375,TG-478,Tranquility Gardens,Residential,Micro,Lowrise,Far,Far,4,3,1387,16,20,3113,706 +3375,TG-481,Tranquility Gardens,Residential,Micro,Lowrise,Far,Far,4,3,2117,16,20,3169,647 +3375,TG-482,Tranquility Gardens,Residential,Micro,Lowrise,Far,Far,4,3,1552,16,20,3097,690 +3375,TG-483,Tranquility Gardens,Residential,Micro,Lowrise,Far,Far,4,3,2117,16,20,3156,629 +3375,TG-484,Tranquility Gardens,Residential,Micro,Lowrise,Far,Far,7,6,1717,30,37,3080,675 +3375,TG-492,Tranquility Gardens,Residential,Micro,Lowrise,Far,Far,5,4,2117,21,26,3143,611 +3375,TG-493,Tranquility Gardens,Residential,Micro,Lowrise,Far,Far,5,4,1882,21,26,3064,659 +3375,TG-495,Tranquility Gardens,Residential,Micro,Lowrise,Far,Far,4,3,1921,16,20,3048,644 +3375,TG-496,Tranquility Gardens,Residential,Micro,Lowrise,Far,Far,4,3,1994,16,20,2867,663 +3375,TG-500,Tranquility Gardens,Residential,Micro,Lowrise,Far,Far,4,3,2092,16,20,2568,614 +3375,TG-501,Tranquility Gardens,Residential,Micro,Lowrise,Far,Far,4,3,1414,16,20,2804,603 +3375,TG-502,Tranquility Gardens,Residential,Micro,Lowrise,Far,Far,4,3,1518,16,20,2747,609 +3375,TG-503,Tranquility Gardens,Residential,Micro,Lowrise,Far,Far,4,4,1894,20,24,2521,603 +3470,HH-1,Haven Heights,Residential,Nano,Lowrise,Far,Close,4,3,879,16,20,973,129 +3470,HH-2,Haven Heights,Residential,Nano,Lowrise,Far,Close,4,3,986,16,20,969,140 +3470,HH-3,Haven Heights,Residential,Nano,Lowrise,Far,Close,4,3,1011,16,20,915,174 +3470,HH-5,Haven Heights,Residential,Nano,Lowrise,Far,Close,7,5,986,28,35,960,167 +3470,HH-6,Haven Heights,Residential,Nano,Lowrise,Far,Close,4,3,1013,17,21,905,207 +3470,HH-9,Haven Heights,Residential,Nano,Lowrise,Far,Close,4,3,1015,16,20,901,219 +3470,HH-10,Haven Heights,Residential,Nano,Lowrise,Far,Close,6,5,933,26,32,897,231 +3470,HH-14,Haven Heights,Residential,Nano,Lowrise,Far,Close,6,5,977,27,33,961,231 +3470,HH-15,Haven Heights,Residential,Nano,Lowrise,Far,Close,4,3,1091,16,20,943,245 +3470,HH-17,Haven Heights,Residential,Nano,Lowrise,Far,Close,4,3,1091,16,20,886,286 +3470,HH-18,Haven Heights,Residential,Nano,Lowrise,Far,Close,4,3,1060,18,22,867,298 +3470,HH-28,Haven Heights,Residential,Nano,Lowrise,Far,Close,4,3,1086,16,20,937,286 +3470,HH-29,Haven Heights,Residential,Nano,Lowrise,Far,Close,4,3,1082,16,20,918,299 +3470,HH-36,Haven Heights,Residential,Nano,Lowrise,Far,Close,4,3,755,16,20,1814,128 +3470,HH-46,Haven Heights,Residential,Nano,Lowrise,Far,Close,4,3,995,16,20,1796,133 +3470,HH-47,Haven Heights,Residential,Nano,Lowrise,Far,Close,4,3,1017,17,21,1780,149 +3470,HH-52,Haven Heights,Residential,Nano,Lowrise,Far,Close,6,5,641,27,33,1775,110 +3470,HH-64,Haven Heights,Residential,Nano,Lowrise,Far,Close,4,3,920,16,20,1740,115 +3470,HH-69,Haven Heights,Residential,Nano,Lowrise,Far,Close,8,6,967,32,40,1529,143 +3470,HH-71,Haven Heights,Residential,Nano,Lowrise,Far,Close,4,4,706,20,24,1499,150 +3470,HH-87,Haven Heights,Residential,Nano,Lowrise,Far,Close,8,6,1127,33,41,1603,197 +3470,HH-90,Haven Heights,Residential,Nano,Lowrise,Far,Close,4,3,1111,16,20,1534,230 +3470,HH-91,Haven Heights,Residential,Nano,Lowrise,Far,Close,5,4,1168,22,27,1520,228 +3470,HH-92,Haven Heights,Residential,Nano,Lowrise,Far,Close,4,3,1167,16,20,1506,227 +3470,HH-93,Haven Heights,Residential,Nano,Lowrise,Far,Close,4,3,1115,17,21,1491,231 +3470,HH-212,Haven Heights,Residential,Nano,Lowrise,Far,Close,4,3,762,16,20,2358,134 +3470,HH-213,Haven Heights,Residential,Nano,Lowrise,Far,Close,4,3,762,16,20,2328,143 +3470,HH-214,Haven Heights,Residential,Nano,Lowrise,Far,Close,8,7,762,35,43,2314,136 +3470,HH-215,Haven Heights,Residential,Nano,Lowrise,Far,Close,4,3,736,16,20,2299,128 +3470,HH-221,Haven Heights,Residential,Nano,Lowrise,Far,Close,4,3,667,16,20,2371,118 +3470,HH-249,Haven Heights,Residential,Nano,Lowrise,Far,Close,4,3,785,16,20,2316,113 +3470,HH-323,Haven Heights,Residential,Nano,Lowrise,Far,Close,7,5,1167,28,35,2858,113 +3470,HH-324,Haven Heights,Residential,Nano,Lowrise,Far,Close,9,7,958,37,46,2839,110 +3470,HH-325,Haven Heights,Residential,Nano,Lowrise,Far,Close,4,3,920,16,20,2909,198 +3470,HH-337,Haven Heights,Residential,Nano,Lowrise,Far,Close,4,3,1131,16,20,2889,193 +3470,HH-501,Haven Heights,Residential,Nano,Lowrise,Far,Close,11,9,848,45,56,1666,115 +3470,HH-524,Haven Heights,Residential,Nano,Lowrise,Far,Close,4,3,605,17,21,1651,113 +3470,HH-554,Haven Heights,Residential,Nano,Lowrise,Far,Close,4,3,395,16,20,1368,295 +3470,HH-588,Haven Heights,Residential,Nano,Lowrise,Far,Close,4,3,1112,16,20,1380,234 +3470,HH-602,Haven Heights,Residential,Nano,Lowrise,Far,Close,4,3,1133,18,22,1854,122 +3470,HH-603,Haven Heights,Residential,Nano,Lowrise,Far,Close,7,5,1040,28,35,1494,100 +3470,HH-630,Haven Heights,Residential,Nano,Lowrise,Far,Close,4,3,1098,16,20,1740,120 +3470,HH-657,Haven Heights,Residential,Nano,Lowrise,Far,Close,4,3,986,16,20,1881,300 +3470,HH-658,Haven Heights,Residential,Nano,Lowrise,Far,Close,4,3,1021,19,23,1795,248 +3470,HH-659,Haven Heights,Residential,Nano,Lowrise,Far,Close,4,3,1023,16,20,1734,219 +3470,HH-674,Haven Heights,Residential,Nano,Lowrise,Far,Close,4,3,1021,16,20,1792,264 +3470,HH-677,Haven Heights,Residential,Nano,Lowrise,Far,Close,4,3,1021,17,21,1788,280 +3470,HH-684,Haven Heights,Residential,Nano,Lowrise,Far,Close,4,3,1021,16,20,1785,297 +3470,HH-686,Haven Heights,Residential,Nano,Lowrise,Far,Close,4,3,971,18,22,1638,247 +3470,HH-707,Haven Heights,Residential,Nano,Lowrise,Far,Close,6,4,946,24,30,1720,290 +3470,HH-708,Haven Heights,Residential,Nano,Lowrise,Far,Close,4,3,483,16,20,1647,268 +3470,HH-816,Haven Heights,Residential,Nano,Lowrise,Far,Close,9,7,1135,37,46,1451,295 +3470,HH-820,Haven Heights,Residential,Nano,Lowrise,Far,Close,4,4,1055,20,24,1392,276 +3470,HH-821,Haven Heights,Residential,Nano,Lowrise,Far,Close,3,3,1104,15,18,1300,271 +3470,HH-822,Haven Heights,Residential,Nano,Lowrise,Far,Close,3,3,1122,15,18,1241,261 +3470,HH-835,Haven Heights,Residential,Nano,Lowrise,Far,Close,3,3,1199,15,18,915,128 +3470,HH-888,Haven Heights,Residential,Nano,Lowrise,Far,Close,4,3,917,16,20,799,299 +3470,HH-932,Haven Heights,Residential,Nano,Lowrise,Far,Close,4,3,917,16,20,1125,257 +3470,HH-933,Haven Heights,Residential,Nano,Lowrise,Far,Close,5,4,1024,23,28,1109,268 +3470,HH-934,Haven Heights,Residential,Nano,Lowrise,Far,Close,4,3,1024,16,20,1092,279 +3470,HH-935,Haven Heights,Residential,Nano,Lowrise,Far,Close,4,3,1024,16,20,1076,291 +3470,HH-957,Haven Heights,Residential,Nano,Lowrise,Far,Close,3,3,946,15,18,1204,271 +3532,SM-12,Space Mind,Residential,Nano,Lowrise,Far,Far,4,3,1150,16,20,1478,712 +3532,SM-13,Space Mind,Residential,Nano,Lowrise,Far,Far,9,7,1183,37,46,1457,717 +3532,SM-14,Space Mind,Residential,Nano,Lowrise,Far,Far,4,3,1176,18,22,1415,730 +3532,SM-15,Space Mind,Residential,Nano,Lowrise,Far,Far,4,3,640,17,21,1378,743 +3532,SM-22,Space Mind,Residential,Nano,Lowrise,Far,Far,7,5,1151,28,35,1472,769 +3532,SM-23,Space Mind,Residential,Nano,Lowrise,Far,Far,6,5,1188,25,31,1452,774 +3532,SM-25,Space Mind,Residential,Nano,Lowrise,Far,Far,6,5,1189,26,32,1412,786 +3532,SM-31,Space Mind,Residential,Nano,Lowrise,Far,Far,8,6,1054,32,40,1739,739 +3532,SM-32,Space Mind,Residential,Nano,Lowrise,Far,Far,3,2,1091,14,17,1721,757 +3532,SM-34,Space Mind,Residential,Nano,Lowrise,Far,Far,3,2,1091,14,17,1683,795 +3532,SM-45,Space Mind,Residential,Nano,Lowrise,Far,Far,3,2,1086,13,16,1708,772 +3532,SM-46,Space Mind,Residential,Nano,Lowrise,Far,Far,3,2,1082,14,17,1689,791 +3532,SM-47,Space Mind,Residential,Nano,Lowrise,Far,Far,4,3,1079,19,23,1671,809 +3532,SM-48,Space Mind,Residential,Nano,Lowrise,Far,Far,3,3,1075,15,18,1652,827 +3532,SM-49,Space Mind,Residential,Nano,Lowrise,Far,Far,3,3,960,15,18,1634,845 +3532,SM-78,Space Mind,Residential,Nano,Lowrise,Far,Far,10,8,1081,40,50,1430,1001 +3532,SM-82,Space Mind,Residential,Nano,Lowrise,Far,Far,4,3,538,17,21,1216,1093 +3532,SM-83,Space Mind,Residential,Nano,Lowrise,Far,Far,4,4,995,20,24,1201,1103 +3532,SM-84,Space Mind,Residential,Nano,Lowrise,Far,Far,10,8,995,41,51,1183,1118 +3532,SM-85,Space Mind,Residential,Nano,Lowrise,Far,Far,5,4,995,24,29,1165,1134 +3532,SM-86,Space Mind,Residential,Nano,Lowrise,Far,Far,4,4,888,20,24,1147,1149 +3532,SM-92,Space Mind,Residential,Nano,Lowrise,Far,Far,4,3,399,17,21,1225,1039 +3532,SM-93,Space Mind,Residential,Nano,Lowrise,Far,Far,5,4,1012,20,25,1211,1056 +3532,SM-94,Space Mind,Residential,Nano,Lowrise,Far,Far,4,3,1009,17,21,1193,1072 +3532,SM-95,Space Mind,Residential,Nano,Lowrise,Far,Far,6,5,1006,25,31,1174,1088 +3532,SM-96,Space Mind,Residential,Nano,Lowrise,Far,Far,4,3,1003,17,21,1156,1104 +3532,SM-97,Space Mind,Residential,Nano,Lowrise,Far,Far,4,3,892,16,20,1138,1119 +3532,SM-117,Space Mind,Residential,Nano,Lowrise,Far,Far,7,6,1137,31,38,1199,925 +3532,SM-119,Space Mind,Residential,Nano,Lowrise,Far,Far,4,3,706,17,21,699,1397 +3532,SM-123,Space Mind,Residential,Nano,Lowrise,Far,Far,4,3,914,16,20,888,1209 +3532,SM-125,Space Mind,Residential,Nano,Lowrise,Far,Far,4,3,1021,16,20,852,1243 +3532,SM-126,Space Mind,Residential,Nano,Lowrise,Far,Far,4,4,1021,20,24,834,1260 +3532,SM-127,Space Mind,Residential,Nano,Lowrise,Far,Far,5,4,1021,23,28,816,1278 +3532,SM-128,Space Mind,Residential,Nano,Lowrise,Far,Far,4,4,779,20,24,735,1353 +3532,SM-132,Space Mind,Residential,Nano,Lowrise,Far,Far,4,3,780,18,22,731,1345 +3532,SM-133,Space Mind,Residential,Nano,Lowrise,Far,Far,4,3,629,16,20,696,1380 +3532,SM-139,Space Mind,Residential,Nano,Lowrise,Far,Far,6,5,782,26,32,726,1338 +3532,SM-140,Space Mind,Residential,Nano,Lowrise,Far,Far,4,3,577,18,22,692,1372 +3532,SM-145,Space Mind,Residential,Nano,Lowrise,Far,Far,6,5,912,27,33,872,1184 +3532,SM-146,Space Mind,Residential,Nano,Lowrise,Far,Far,7,5,1016,28,35,854,1201 +3532,SM-147,Space Mind,Residential,Nano,Lowrise,Far,Far,5,4,1012,22,27,836,1219 +3532,SM-148,Space Mind,Residential,Nano,Lowrise,Far,Far,4,3,1009,17,21,817,1237 +3532,SM-155,Space Mind,Residential,Nano,Lowrise,Far,Far,4,3,747,18,22,715,1325 +3532,SM-158,Space Mind,Residential,Nano,Lowrise,Far,Far,4,3,1031,16,20,840,1178 +3532,SM-159,Space Mind,Residential,Nano,Lowrise,Far,Far,5,4,1056,22,27,784,1231 +3532,SM-167,Space Mind,Residential,Nano,Lowrise,Far,Far,4,4,1065,20,24,836,1172 +3532,SM-168,Space Mind,Residential,Nano,Lowrise,Far,Far,4,3,1093,19,23,781,1225 +3532,SM-175,Space Mind,Residential,Nano,Lowrise,Far,Far,4,4,1065,20,24,834,1166 +3532,SM-176,Space Mind,Residential,Nano,Lowrise,Far,Far,4,3,1094,17,21,778,1220 +3532,SM-181,Space Mind,Residential,Nano,Lowrise,Far,Far,8,7,1065,36,44,828,1155 +3532,SM-182,Space Mind,Residential,Nano,Lowrise,Far,Far,4,3,1097,17,21,773,1210 +3532,SM-189,Space Mind,Residential,Nano,Lowrise,Far,Far,5,4,1015,20,25,825,1150 +3532,SM-190,Space Mind,Residential,Nano,Lowrise,Far,Far,6,4,1015,24,30,770,1205 +3532,SM-277,Space Mind,Residential,Nano,Lowrise,Far,Far,4,3,1056,18,22,1145,698 +3532,SM-278,Space Mind,Residential,Nano,Lowrise,Far,Far,5,4,1031,21,26,1096,751 +3532,SM-283,Space Mind,Residential,Nano,Lowrise,Far,Far,4,4,1091,20,24,1136,705 +3532,SM-284,Space Mind,Residential,Nano,Lowrise,Far,Far,6,4,1065,24,30,1087,757 +3532,SM-289,Space Mind,Residential,Nano,Lowrise,Far,Far,4,3,1091,16,20,1127,712 +3532,SM-290,Space Mind,Residential,Nano,Lowrise,Far,Far,4,3,1065,17,21,1077,764 +3532,SM-292,Space Mind,Residential,Nano,Lowrise,Far,Far,5,4,1091,24,29,1118,720 +3532,SM-293,Space Mind,Residential,Nano,Lowrise,Far,Far,4,3,1065,18,22,1068,771 +3532,SM-299,Space Mind,Residential,Nano,Lowrise,Far,Far,4,3,1091,18,22,1109,728 +3532,SM-308,Space Mind,Residential,Nano,Lowrise,Far,Far,4,3,1040,17,21,1101,736 +3532,SM-309,Space Mind,Residential,Nano,Lowrise,Far,Far,4,4,985,20,24,1050,787 +3532,SM-319,Space Mind,Residential,Nano,Lowrise,Far,Far,5,4,979,24,29,1048,770 +3532,SM-321,Space Mind,Residential,Nano,Lowrise,Far,Far,9,7,979,37,46,1035,803 +3532,SM-322,Space Mind,Residential,Nano,Lowrise,Far,Far,4,3,979,17,21,1018,819 +3532,SM-323,Space Mind,Residential,Nano,Lowrise,Far,Far,4,3,877,19,23,1002,835 +3532,SM-343,Space Mind,Residential,Nano,Lowrise,Far,Far,4,3,954,18,22,979,834 +3532,SM-345,Space Mind,Residential,Nano,Lowrise,Far,Far,4,3,854,17,21,967,865 +3532,SM-355,Space Mind,Residential,Nano,Lowrise,Far,Far,6,5,855,28,34,987,741 +3532,SM-356,Space Mind,Residential,Nano,Lowrise,Far,Far,7,6,878,31,38,957,784 +3532,SM-370,Space Mind,Residential,Nano,Lowrise,Far,Far,5,4,954,20,25,971,753 +3532,SM-371,Space Mind,Residential,Nano,Lowrise,Far,Far,6,5,981,25,31,941,796 +3532,SM-372,Space Mind,Residential,Nano,Lowrise,Far,Far,4,3,990,16,20,909,848 +3532,SM-373,Space Mind,Residential,Nano,Lowrise,Far,Far,5,4,1025,20,25,902,862 +3532,SM-374,Space Mind,Residential,Nano,Lowrise,Far,Far,4,3,1025,16,20,894,877 +3532,SM-375,Space Mind,Residential,Nano,Lowrise,Far,Far,4,3,1025,16,20,887,891 +3532,SM-376,Space Mind,Residential,Nano,Lowrise,Far,Far,5,4,1025,20,25,880,906 +3532,SM-388,Space Mind,Residential,Nano,Lowrise,Far,Far,5,4,983,24,29,908,824 +3532,SM-400,Space Mind,Residential,Nano,Lowrise,Far,Far,9,7,954,38,47,923,791 +3532,SM-401,Space Mind,Residential,Nano,Lowrise,Far,Far,4,3,984,16,20,891,836 +3532,SM-402,Space Mind,Residential,Nano,Lowrise,Far,Far,4,3,1012,16,20,859,885 +3532,SM-403,Space Mind,Residential,Nano,Lowrise,Far,Far,5,4,1044,21,26,851,899 +3532,SM-405,Space Mind,Residential,Nano,Lowrise,Far,Far,4,3,1037,18,22,835,927 +3532,SM-406,Space Mind,Residential,Nano,Lowrise,Far,Far,6,5,1033,26,32,828,942 +3532,SM-407,Space Mind,Residential,Nano,Lowrise,Far,Far,4,3,922,18,22,821,955 +3532,SM-415,Space Mind,Residential,Nano,Lowrise,Far,Far,5,4,908,21,26,908,800 +3532,SM-424,Space Mind,Residential,Nano,Lowrise,Far,Far,5,4,960,23,28,865,826 +3532,SM-433,Space Mind,Residential,Nano,Lowrise,Far,Far,6,5,1020,28,34,815,887 +3532,SM-435,Space Mind,Residential,Nano,Lowrise,Far,Far,4,3,1037,17,21,677,1189 +3532,SM-436,Space Mind,Residential,Nano,Lowrise,Far,Far,4,3,1036,16,20,659,1205 +3532,SM-437,Space Mind,Residential,Nano,Lowrise,Far,Far,4,3,1036,17,21,641,1221 +3532,SM-439,Space Mind,Residential,Nano,Lowrise,Far,Far,10,8,723,42,52,607,1251 +3532,SM-445,Space Mind,Residential,Nano,Lowrise,Far,Far,3,3,1159,15,18,967,689 +3532,SM-447,Space Mind,Residential,Nano,Lowrise,Far,Far,4,3,993,18,22,834,846 +3532,SM-448,Space Mind,Residential,Nano,Lowrise,Far,Far,6,5,1021,25,31,798,897 +3532,SM-453,Space Mind,Residential,Nano,Lowrise,Far,Far,7,6,868,31,38,948,707 +3532,SM-455,Space Mind,Residential,Nano,Lowrise,Far,Far,4,3,993,17,21,818,857 +3532,SM-456,Space Mind,Residential,Nano,Lowrise,Far,Far,4,4,1023,20,24,782,908 +3532,SM-462,Space Mind,Residential,Nano,Lowrise,Far,Far,7,6,993,30,37,803,868 +3532,SM-463,Space Mind,Residential,Nano,Lowrise,Far,Far,4,3,1024,16,20,766,918 +3532,SM-466,Space Mind,Residential,Nano,Lowrise,Far,Far,5,4,868,22,27,920,736 +3532,SM-467,Space Mind,Residential,Nano,Lowrise,Far,Far,7,6,1002,30,37,622,1212 +3532,SM-468,Space Mind,Residential,Nano,Lowrise,Far,Far,4,3,1032,16,20,620,1227 +3532,SM-470,Space Mind,Residential,Nano,Lowrise,Far,Far,5,4,1030,20,25,617,1258 +3532,SM-477,Space Mind,Residential,Nano,Lowrise,Far,Far,4,3,947,16,20,788,880 +3639,NS-291,North Star,Commercial,Nano,Lowrise,Far,Far,8,7,871,36,44,774,609 +3639,NS-314,North Star,Commercial,Nano,Lowrise,Far,Far,4,3,1053,16,20,710,656 +3639,NS-421,North Star,Commercial,Nano,Lowrise,Far,Far,4,3,916,17,21,1296,601 +3639,NS-460,North Star,Commercial,Nano,Lowrise,Far,Far,5,4,1021,21,26,1297,636 +3639,NS-461,North Star,Commercial,Nano,Lowrise,Far,Far,6,5,1024,25,31,1234,658 +3639,NS-508,North Star,Commercial,Nano,Lowrise,Far,Far,4,3,1011,19,23,1389,633 +3639,NS-544,North Star,Commercial,Nano,Lowrise,Far,Far,3,2,481,12,15,757,1044 +3639,NS-627,North Star,Commercial,Nano,Lowrise,Far,Far,6,5,784,26,32,1319,810 +3639,NS-732,North Star,Commercial,Nano,Lowrise,Far,Far,4,4,1091,20,24,1914,660 +3639,NS-733,North Star,Commercial,Nano,Lowrise,Far,Far,5,4,1091,23,28,1875,661 +3639,NS-734,North Star,Commercial,Nano,Lowrise,Far,Far,4,3,1061,16,20,1855,650 +3639,NS-754,North Star,Commercial,Nano,Lowrise,Far,Far,4,3,1065,16,20,1938,630 +3639,NS-755,North Star,Commercial,Nano,Lowrise,Far,Far,4,3,1065,19,23,1918,633 +3639,NS-773,North Star,Commercial,Nano,Lowrise,Far,Far,4,3,916,18,22,830,739 +3653,DZ-25,District ZERO,Residential,Nano,Lowrise,Far,Far,4,3,674,16,20,601,902 +3653,DZ-96,District ZERO,Residential,Nano,Lowrise,Far,Far,4,3,1091,16,20,1264,768 +3653,DZ-97,District ZERO,Residential,Nano,Lowrise,Far,Far,4,3,1093,18,22,1210,798 +3653,DZ-102,District ZERO,Residential,Nano,Lowrise,Far,Far,4,3,1091,16,20,1256,762 +3653,DZ-103,District ZERO,Residential,Nano,Lowrise,Far,Far,4,3,1094,17,21,1202,816 +3653,DZ-104,District ZERO,Residential,Nano,Lowrise,Far,Far,4,3,1091,19,23,1248,756 +3653,DZ-105,District ZERO,Residential,Nano,Lowrise,Far,Far,4,3,1095,16,20,1194,812 +3653,DZ-119,District ZERO,Residential,Nano,Lowrise,Far,Far,4,4,976,20,24,1234,744 +3653,DZ-268,District ZERO,Residential,Nano,Lowrise,Far,Far,4,3,1060,16,20,945,1086 +3653,DZ-269,District ZERO,Residential,Nano,Lowrise,Far,Far,4,3,1145,16,20,925,1101 +3653,DZ-273,District ZERO,Residential,Nano,Lowrise,Far,Far,4,3,933,17,21,965,1071 +3653,DZ-281,District ZERO,Residential,Nano,Lowrise,Far,Far,4,3,1098,17,21,715,1156 +3653,DZ-288,District ZERO,Residential,Nano,Lowrise,Far,Far,4,3,1135,16,20,717,1143 +3653,DZ-289,District ZERO,Residential,Nano,Lowrise,Far,Far,6,5,1136,28,34,659,1187 +3653,DZ-292,District ZERO,Residential,Nano,Lowrise,Far,Far,4,3,1135,16,20,720,1130 +3653,DZ-293,District ZERO,Residential,Nano,Lowrise,Far,Far,4,3,1138,19,23,662,1172 +3653,DZ-299,District ZERO,Residential,Nano,Lowrise,Far,Far,4,3,1135,16,20,724,1117 +3653,DZ-304,District ZERO,Residential,Nano,Lowrise,Far,Far,4,3,1135,16,20,727,1103 +3653,DZ-305,District ZERO,Residential,Nano,Lowrise,Far,Far,4,3,1140,16,20,669,1142 +3653,DZ-309,District ZERO,Residential,Nano,Lowrise,Far,Far,4,3,1082,16,20,731,1088 +3653,DZ-310,District ZERO,Residential,Nano,Lowrise,Far,Far,4,3,1055,16,20,673,1128 +3653,DZ-322,District ZERO,Residential,Nano,Lowrise,Far,Far,4,3,979,17,21,1338,623 +3653,DZ-323,District ZERO,Residential,Nano,Lowrise,Far,Far,4,3,979,18,22,1320,636 +3653,DZ-324,District ZERO,Residential,Nano,Lowrise,Far,Far,4,3,979,16,20,1301,648 +3653,DZ-325,District ZERO,Residential,Nano,Lowrise,Far,Far,4,3,979,18,22,1282,659 +3653,DZ-326,District ZERO,Residential,Nano,Lowrise,Far,Far,4,3,877,16,20,1264,670 +3653,DZ-328,District ZERO,Residential,Nano,Lowrise,Far,Far,4,3,1049,16,20,1167,732 +3653,DZ-329,District ZERO,Residential,Nano,Lowrise,Far,Far,4,3,1019,16,20,1110,773 +3653,DZ-336,District ZERO,Residential,Nano,Lowrise,Far,Far,4,3,1021,16,20,745,1007 +3653,DZ-346,District ZERO,Residential,Nano,Lowrise,Far,Far,4,3,854,16,20,1271,623 +3653,DZ-347,District ZERO,Residential,Nano,Lowrise,Far,Far,4,3,1024,16,20,1172,693 +3653,DZ-348,District ZERO,Residential,Nano,Lowrise,Far,Far,7,6,1024,31,38,1153,707 +3653,DZ-349,District ZERO,Residential,Nano,Lowrise,Far,Far,11,9,1024,46,57,1134,721 +3653,DZ-352,District ZERO,Residential,Nano,Lowrise,Far,Far,4,3,1021,16,20,747,994 +3653,DZ-354,District ZERO,Residential,Nano,Lowrise,Far,Far,4,3,920,17,21,685,1028 +3653,DZ-359,District ZERO,Residential,Nano,Lowrise,Far,Far,9,7,977,38,47,902,833 +3653,DZ-360,District ZERO,Residential,Nano,Lowrise,Far,Far,4,3,977,16,20,843,874 +3653,DZ-371,District ZERO,Residential,Nano,Lowrise,Far,Far,4,3,1091,16,20,904,820 +3653,DZ-372,District ZERO,Residential,Nano,Lowrise,Far,Far,4,3,1093,18,22,846,861 +3653,DZ-381,District ZERO,Residential,Nano,Lowrise,Far,Far,4,3,1095,16,20,851,835 +3653,DZ-391,District ZERO,Residential,Nano,Lowrise,Far,Far,4,3,1038,16,20,913,766 +3653,DZ-392,District ZERO,Residential,Nano,Lowrise,Far,Far,4,3,1011,18,22,853,811 +3653,DZ-456,District ZERO,Residential,Nano,Lowrise,Far,Far,6,5,1062,25,31,658,631 +3653,DZ-457,District ZERO,Residential,Nano,Lowrise,Far,Far,4,3,1032,16,20,639,647 +3653,DZ-484,District ZERO,Residential,Nano,Lowrise,Far,Far,4,3,1054,16,20,615,617 +3698,HH-136,Haven Heights,Commercial,Nano,Lowrise,Far,Far,6,5,1004,27,33,817,638 +3698,HH-153,Haven Heights,Commercial,Nano,Lowrise,Far,Far,9,7,867,36,45,900,652 +3698,HH-157,Haven Heights,Commercial,Nano,Lowrise,Far,Far,5,4,956,23,28,825,695 +3698,HH-180,Haven Heights,Commercial,Nano,Lowrise,Far,Far,8,7,1024,35,43,976,662 +3698,HH-183,Haven Heights,Commercial,Nano,Lowrise,Far,Far,4,3,946,16,20,859,722 +3698,HH-203,Haven Heights,Commercial,Nano,Lowrise,Far,Far,4,3,954,16,20,1182,680 +3698,HH-228,Haven Heights,Commercial,Nano,Lowrise,Far,Far,4,3,1156,16,20,613,983 +3698,HH-252,Haven Heights,Commercial,Nano,Lowrise,Far,Far,4,3,909,16,20,1188,754 +3698,HH-258,Haven Heights,Commercial,Nano,Lowrise,Far,Far,4,4,990,20,24,1189,804 +3698,HH-285,Haven Heights,Commercial,Nano,Lowrise,Far,Far,4,3,1024,19,23,1177,846 +3698,HH-319,Haven Heights,Commercial,Nano,Lowrise,Far,Far,4,3,916,16,20,1169,873 +3698,HH-353,Haven Heights,Commercial,Nano,Lowrise,Far,Far,4,3,1024,18,22,1116,958 +3698,HH-356,Haven Heights,Commercial,Nano,Lowrise,Far,Far,4,3,1067,18,22,1009,1011 +3698,HH-401,Haven Heights,Commercial,Nano,Lowrise,Far,Far,4,3,1037,17,21,1089,1000 +3698,HH-481,Haven Heights,Commercial,Nano,Lowrise,Far,Far,6,4,917,24,30,1017,1015 +3698,HH-508,Haven Heights,Commercial,Nano,Lowrise,Far,Far,4,4,1024,20,24,1028,857 +3698,HH-510,Haven Heights,Commercial,Nano,Lowrise,Far,Far,9,7,1066,38,47,950,984 +3698,HH-513,Haven Heights,Commercial,Nano,Lowrise,Far,Far,4,3,1104,17,21,903,1076 +3698,HH-514,Haven Heights,Commercial,Nano,Lowrise,Far,Far,4,3,1140,16,20,892,1098 +3698,HH-515,Haven Heights,Commercial,Nano,Lowrise,Far,Far,7,6,1140,31,38,882,1120 +3698,HH-558,Haven Heights,Commercial,Nano,Lowrise,Far,Far,4,3,552,17,21,646,1364 +3698,HH-576,Haven Heights,Commercial,Nano,Lowrise,Far,Far,4,3,1065,16,20,947,778 +3698,HH-593,Haven Heights,Commercial,Nano,Lowrise,Far,Far,4,3,1097,17,21,879,834 +3698,HH-639,Haven Heights,Commercial,Nano,Lowrise,Far,Far,4,3,954,16,20,817,810 +3698,HH-705,Haven Heights,Commercial,Nano,Lowrise,Far,Far,4,3,1009,16,20,884,708 +3698,HH-715,Haven Heights,Commercial,Nano,Lowrise,Far,Far,4,3,1021,17,21,1022,607 +3698,HH-716,Haven Heights,Commercial,Nano,Lowrise,Far,Far,4,3,1021,17,21,1003,623 +3698,HH-739,Haven Heights,Commercial,Nano,Lowrise,Far,Far,4,3,912,16,20,1029,632 +3698,HH-756,Haven Heights,Commercial,Nano,Lowrise,Far,Far,4,3,917,17,21,1081,656 +3727,TG-71,Tranquility Gardens,Residential,Nano,Lowrise,Far,Far,8,6,907,33,41,2811,605 +3727,TG-72,Tranquility Gardens,Residential,Nano,Lowrise,Far,Far,4,3,907,16,20,2799,609 +3727,TG-136,Tranquility Gardens,Residential,Nano,Lowrise,Far,Far,4,4,1170,20,24,4263,615 +3727,TG-141,Tranquility Gardens,Residential,Nano,Lowrise,Far,Far,4,3,777,19,23,3312,781 +3727,TG-149,Tranquility Gardens,Residential,Nano,Lowrise,Far,Far,5,4,1079,24,29,3270,817 +3727,TG-167,Tranquility Gardens,Residential,Nano,Lowrise,Far,Far,4,3,696,16,20,3188,891 +3727,TG-180,Tranquility Gardens,Residential,Nano,Lowrise,Far,Far,4,3,511,16,20,3278,934 +3727,TG-195,Tranquility Gardens,Residential,Nano,Lowrise,Far,Far,7,6,1046,30,37,3030,1077 +3727,TG-198,Tranquility Gardens,Residential,Nano,Lowrise,Far,Far,4,4,834,20,24,3012,1090 +3727,TG-199,Tranquility Gardens,Residential,Nano,Lowrise,Far,Far,4,3,609,16,20,2994,1103 +3727,TG-203,Tranquility Gardens,Residential,Nano,Lowrise,Far,Far,5,4,959,22,27,3160,1044 +3727,TG-204,Tranquility Gardens,Residential,Nano,Lowrise,Far,Far,4,3,563,16,20,3098,1093 +3727,TG-210,Tranquility Gardens,Residential,Nano,Lowrise,Far,Far,8,6,796,32,40,3080,1106 +3727,TG-211,Tranquility Gardens,Residential,Nano,Lowrise,Far,Far,5,4,1017,21,26,3062,1118 +3727,TG-217,Tranquility Gardens,Residential,Nano,Lowrise,Far,Far,4,3,483,16,20,2893,1200 +3727,TG-219,Tranquility Gardens,Residential,Nano,Lowrise,Far,Far,4,3,817,17,21,3731,1045 +3727,TG-234,Tranquility Gardens,Residential,Nano,Lowrise,Far,Far,7,6,645,31,38,2955,1260 +3727,TG-240,Tranquility Gardens,Residential,Nano,Lowrise,Far,Far,5,4,796,23,28,2912,1308 +3727,TG-249,Tranquility Gardens,Residential,Nano,Lowrise,Far,Far,5,4,897,22,27,3298,1287 +3727,TG-257,Tranquility Gardens,Residential,Nano,Lowrise,Far,Far,5,4,953,22,27,3257,1340 +3727,TG-290,Tranquility Gardens,Residential,Nano,Lowrise,Far,Far,4,3,693,16,20,4211,631 +3727,TG-293,Tranquility Gardens,Residential,Nano,Lowrise,Far,Far,5,4,970,21,26,4188,654 +3727,TG-294,Tranquility Gardens,Residential,Nano,Lowrise,Far,Far,4,3,1174,16,20,4164,678 +3727,TG-295,Tranquility Gardens,Residential,Nano,Lowrise,Far,Far,4,3,847,19,23,4150,692 +3727,TG-296,Tranquility Gardens,Residential,Nano,Lowrise,Far,Far,4,3,1031,17,21,3276,1360 +3727,TG-303,Tranquility Gardens,Residential,Nano,Lowrise,Far,Far,6,5,492,27,33,4116,727 +3727,TG-304,Tranquility Gardens,Residential,Nano,Lowrise,Far,Far,7,5,943,29,36,3263,1346 +3727,TG-320,Tranquility Gardens,Residential,Nano,Lowrise,Far,Far,6,5,521,28,34,4125,718 +3727,TG-322,Tranquility Gardens,Residential,Nano,Lowrise,Far,Far,7,5,1076,28,35,3243,1324 +3727,TG-326,Tranquility Gardens,Residential,Nano,Lowrise,Far,Far,6,5,897,27,33,4104,738 +3727,TG-384,Tranquility Gardens,Residential,Nano,Lowrise,Far,Far,4,3,1103,18,22,3622,843 +3727,TG-385,Tranquility Gardens,Residential,Nano,Lowrise,Far,Far,5,4,861,24,29,3604,848 +3727,TG-395,Tranquility Gardens,Residential,Nano,Lowrise,Far,Far,4,4,1156,20,24,3516,833 +3727,TG-396,Tranquility Gardens,Residential,Nano,Lowrise,Far,Far,4,3,1044,19,23,3471,862 +3727,TG-413,Tranquility Gardens,Residential,Nano,Lowrise,Far,Far,4,3,1157,19,23,3501,813 +3727,TG-414,Tranquility Gardens,Residential,Nano,Lowrise,Far,Far,4,3,1127,16,20,3457,843 +3727,TG-422,Tranquility Gardens,Residential,Nano,Lowrise,Far,Far,5,4,1158,21,26,3486,794 +3727,TG-423,Tranquility Gardens,Residential,Nano,Lowrise,Far,Far,5,4,1127,24,29,3441,823 +3727,TG-425,Tranquility Gardens,Residential,Nano,Lowrise,Far,Far,4,4,1055,20,24,3472,775 +3727,TG-426,Tranquility Gardens,Residential,Nano,Lowrise,Far,Far,4,3,1027,16,20,3427,804 +3727,TG-467,Tranquility Gardens,Residential,Nano,Lowrise,Far,Far,4,3,1191,19,23,3129,721 +3768,NS-85,North Star,Residential,Micro,Lowrise,Far,Medium,4,3,1635,16,20,683,312 +3768,NS-87,North Star,Residential,Micro,Lowrise,Far,Medium,4,3,1712,16,20,622,373 +3768,NS-109,North Star,Residential,Micro,Lowrise,Far,Medium,4,3,1919,17,21,606,427 +3768,NS-203,North Star,Residential,Micro,Lowrise,Far,Medium,9,7,1217,36,45,1222,302 +3768,NS-204,North Star,Residential,Micro,Lowrise,Far,Medium,4,3,1764,16,20,801,448 +3768,NS-217,North Star,Residential,Micro,Lowrise,Far,Medium,4,3,1254,16,20,1221,315 +3768,NS-218,North Star,Residential,Micro,Lowrise,Far,Medium,4,3,1821,17,21,802,464 +3768,NS-222,North Star,Residential,Micro,Lowrise,Far,Medium,6,5,1291,25,31,1220,328 +3768,NS-237,North Star,Residential,Micro,Lowrise,Far,Medium,4,3,1253,16,20,1219,341 +3768,NS-261,North Star,Residential,Micro,Lowrise,Far,Medium,6,5,1872,27,33,1243,376 +3768,NS-262,North Star,Residential,Micro,Lowrise,Far,Medium,4,3,1875,16,20,1210,398 +3768,NS-263,North Star,Residential,Micro,Lowrise,Far,Medium,4,3,1681,19,23,1179,419 +3768,NS-309,North Star,Residential,Micro,Lowrise,Far,Medium,9,7,1867,38,47,1242,422 +3768,NS-310,North Star,Residential,Micro,Lowrise,Far,Medium,6,5,1862,27,33,1210,442 +3768,NS-311,North Star,Residential,Micro,Lowrise,Far,Medium,4,3,1857,16,20,1177,463 +3768,NS-540,North Star,Residential,Micro,Lowrise,Far,Medium,4,3,1669,17,21,1733,311 +3768,NS-541,North Star,Residential,Micro,Lowrise,Far,Medium,4,3,1667,19,23,1714,329 +3768,NS-571,North Star,Residential,Micro,Lowrise,Far,Medium,5,4,1321,23,28,1735,343 +3768,NS-572,North Star,Residential,Micro,Lowrise,Far,Medium,5,4,1415,23,28,1716,361 +3768,NS-573,North Star,Residential,Micro,Lowrise,Far,Medium,4,3,1510,19,23,1697,379 +3768,NS-574,North Star,Residential,Micro,Lowrise,Far,Medium,4,3,1431,17,21,1679,400 +3768,NS-687,North Star,Residential,Micro,Lowrise,Far,Medium,5,4,1292,22,27,2221,319 +3768,NS-689,North Star,Residential,Micro,Lowrise,Far,Medium,6,4,1283,24,30,2172,354 +3768,NS-690,North Star,Residential,Micro,Lowrise,Far,Medium,5,4,1260,21,26,2148,357 +3768,NS-695,North Star,Residential,Micro,Lowrise,Far,Medium,5,4,1581,23,28,2180,369 +3768,NS-708,North Star,Residential,Micro,Lowrise,Far,Medium,4,4,1635,20,24,2181,375 +3768,NS-711,North Star,Residential,Micro,Lowrise,Far,Medium,6,5,1637,25,31,2182,378 +3768,NS-724,North Star,Residential,Micro,Lowrise,Far,Medium,4,3,1516,18,22,2183,380 +3768,NS-747,North Star,Residential,Micro,Lowrise,Far,Medium,5,4,1675,20,25,2193,387 +3768,NS-749,North Star,Residential,Micro,Lowrise,Far,Medium,5,4,1677,22,27,2195,392 +3768,NS-750,North Star,Residential,Micro,Lowrise,Far,Medium,5,4,1588,20,25,2291,301 +3768,NS-771,North Star,Residential,Micro,Lowrise,Far,Medium,4,3,1502,17,21,2196,399 +3768,NS-802,North Star,Residential,Micro,Lowrise,Far,Medium,5,4,1694,20,25,1651,350 +3768,NS-824,North Star,Residential,Micro,Lowrise,Far,Medium,4,3,1946,17,21,1046,474 +3768,NS-849,North Star,Residential,Micro,Lowrise,Far,Medium,4,3,1907,17,21,1081,412 +3768,NS-850,North Star,Residential,Micro,Lowrise,Far,Medium,4,3,1905,16,20,1047,439 +3768,NS-851,North Star,Residential,Micro,Lowrise,Far,Medium,5,4,1903,20,25,1014,468 +3768,NS-852,North Star,Residential,Micro,Lowrise,Far,Medium,8,6,1880,32,40,981,488 +3768,NS-883,North Star,Residential,Micro,Lowrise,Far,Medium,11,9,1574,48,59,693,592 +3768,NS-934,North Star,Residential,Micro,Lowrise,Far,Medium,8,7,2346,35,43,939,346 +3808,HH-42,Haven Heights,Residential,Micro,Lowrise,Far,Medium,4,3,1824,19,23,937,333 +3808,HH-44,Haven Heights,Residential,Micro,Lowrise,Far,Medium,5,4,1894,23,28,796,443 +3808,HH-45,Haven Heights,Residential,Micro,Lowrise,Far,Medium,4,3,1514,16,20,764,467 +3808,HH-57,Haven Heights,Residential,Micro,Lowrise,Far,Medium,4,3,1815,16,20,931,368 +3808,HH-58,Haven Heights,Residential,Micro,Lowrise,Far,Medium,4,3,1924,16,20,897,396 +3808,HH-59,Haven Heights,Residential,Micro,Lowrise,Far,Medium,4,3,1928,16,20,861,425 +3808,HH-60,Haven Heights,Residential,Micro,Lowrise,Far,Medium,6,5,1931,25,31,825,456 +3808,HH-61,Haven Heights,Residential,Micro,Lowrise,Far,Medium,4,3,1934,16,20,790,487 +3808,HH-81,Haven Heights,Residential,Micro,Lowrise,Far,Medium,9,7,1784,37,46,894,448 +3808,HH-82,Haven Heights,Residential,Micro,Lowrise,Far,Medium,6,4,1785,24,30,863,471 +3808,HH-83,Haven Heights,Residential,Micro,Lowrise,Far,Medium,4,3,1787,16,20,833,495 +3808,HH-84,Haven Heights,Residential,Micro,Lowrise,Far,Medium,7,6,1788,31,38,802,519 +3808,HH-85,Haven Heights,Residential,Micro,Lowrise,Far,Medium,7,5,1314,29,36,775,540 +3808,HH-98,Haven Heights,Residential,Micro,Lowrise,Far,Medium,4,3,1662,16,20,1136,337 +3808,HH-101,Haven Heights,Residential,Micro,Lowrise,Far,Medium,4,3,1673,16,20,918,470 +3808,HH-102,Haven Heights,Residential,Micro,Lowrise,Far,Medium,4,3,1784,19,23,888,490 +3808,HH-103,Haven Heights,Residential,Micro,Lowrise,Far,Medium,9,7,1780,37,46,857,511 +3808,HH-104,Haven Heights,Residential,Micro,Lowrise,Far,Medium,4,3,1777,16,20,827,534 +3808,HH-105,Haven Heights,Residential,Micro,Lowrise,Far,Medium,4,3,1774,16,20,796,556 +3808,HH-108,Haven Heights,Residential,Micro,Lowrise,Far,Medium,5,4,1373,22,27,888,537 +3808,HH-109,Haven Heights,Residential,Micro,Lowrise,Far,Medium,4,3,1292,16,20,815,588 +3808,HH-112,Haven Heights,Residential,Micro,Lowrise,Far,Medium,7,6,2001,31,38,1166,398 +3808,HH-113,Haven Heights,Residential,Micro,Lowrise,Far,Medium,6,5,1959,27,33,1130,413 +3808,HH-119,Haven Heights,Residential,Micro,Lowrise,Far,Medium,4,3,1432,16,20,886,552 +3808,HH-120,Haven Heights,Residential,Micro,Lowrise,Far,Medium,6,5,1294,25,31,816,600 +3808,HH-121,Haven Heights,Residential,Micro,Lowrise,Far,Medium,4,3,1432,17,21,884,566 +3808,HH-126,Haven Heights,Residential,Micro,Lowrise,Far,Medium,4,3,1959,16,20,1270,424 +3808,HH-127,Haven Heights,Residential,Micro,Lowrise,Far,Medium,4,3,1957,16,20,1233,433 +3808,HH-128,Haven Heights,Residential,Micro,Lowrise,Far,Medium,4,3,1954,16,20,1160,456 +3808,HH-135,Haven Heights,Residential,Micro,Lowrise,Far,Medium,4,3,1432,17,21,880,597 +3808,HH-173,Haven Heights,Residential,Micro,Lowrise,Far,Medium,4,3,1413,16,20,1592,369 +3808,HH-192,Haven Heights,Residential,Micro,Lowrise,Far,Medium,4,3,1552,16,20,1636,401 +3808,HH-197,Haven Heights,Residential,Micro,Lowrise,Far,Medium,4,3,1675,16,20,1633,413 +3808,HH-198,Haven Heights,Residential,Micro,Lowrise,Far,Medium,4,3,1255,16,20,1375,578 +3808,HH-216,Haven Heights,Residential,Micro,Lowrise,Far,Medium,4,3,1544,16,20,1627,420 +3808,HH-223,Haven Heights,Residential,Micro,Lowrise,Far,Medium,4,3,1413,16,20,1613,427 +3808,HH-232,Haven Heights,Residential,Micro,Lowrise,Far,Medium,4,3,1350,16,20,1639,378 +3808,HH-233,Haven Heights,Residential,Micro,Lowrise,Far,Medium,4,4,1281,20,24,1599,435 +3808,HH-250,Haven Heights,Residential,Micro,Lowrise,Far,Medium,7,6,1637,30,37,1629,384 +3808,HH-280,Haven Heights,Residential,Micro,Lowrise,Far,Medium,4,3,1854,16,20,1656,360 +3808,HH-299,Haven Heights,Residential,Micro,Lowrise,Far,Medium,4,3,1643,16,20,1578,429 +3808,HH-300,Haven Heights,Residential,Micro,Lowrise,Far,Medium,4,3,1673,17,21,1558,446 +3808,HH-301,Haven Heights,Residential,Micro,Lowrise,Far,Medium,4,3,1673,16,20,1539,465 +3808,HH-419,Haven Heights,Residential,Micro,Lowrise,Far,Medium,8,6,1701,34,42,1502,479 +3808,HH-433,Haven Heights,Residential,Micro,Lowrise,Far,Medium,5,4,1773,20,25,1490,471 +3808,HH-489,Haven Heights,Residential,Micro,Lowrise,Far,Medium,7,6,1591,30,37,1442,429 +3808,HH-533,Haven Heights,Residential,Micro,Lowrise,Far,Medium,4,3,1389,17,21,1390,336 +3808,HH-608,Haven Heights,Residential,Micro,Lowrise,Far,Medium,11,9,1916,47,58,1160,444 +3808,HH-609,Haven Heights,Residential,Micro,Lowrise,Far,Medium,4,3,1985,16,20,1094,516 +3808,HH-610,Haven Heights,Residential,Micro,Lowrise,Far,Medium,4,3,1948,18,22,1063,551 +3808,HH-632,Haven Heights,Residential,Micro,Lowrise,Far,Medium,4,4,1909,20,24,1170,421 +3808,HH-633,Haven Heights,Residential,Micro,Lowrise,Far,Medium,4,3,1931,19,23,1134,459 +3808,HH-653,Haven Heights,Residential,Micro,Lowrise,Far,Medium,4,3,1588,19,23,1201,402 +3808,HH-661,Haven Heights,Residential,Micro,Lowrise,Far,Medium,7,6,1589,30,37,1169,432 +3808,HH-687,Haven Heights,Residential,Micro,Lowrise,Far,Medium,2,2,1439,10,11,1238,394 +3808,HH-688,Haven Heights,Residential,Micro,Lowrise,Far,Medium,5,4,1598,23,28,1181,439 +3808,HH-689,Haven Heights,Residential,Micro,Lowrise,Far,Medium,4,3,1597,17,21,1153,463 +3808,HH-690,Haven Heights,Residential,Micro,Lowrise,Far,Medium,4,3,1488,16,20,1126,486 +3808,HH-758,Haven Heights,Residential,Micro,Lowrise,Far,Medium,2,2,1257,10,10,1767,375 +3808,HH-782,Haven Heights,Residential,Micro,Lowrise,Far,Medium,4,3,1472,19,23,1553,466 +3808,HH-801,Haven Heights,Residential,Micro,Lowrise,Far,Medium,4,3,1476,16,20,1074,381 +3808,HH-807,Haven Heights,Residential,Micro,Lowrise,Far,Medium,4,3,1978,16,20,1094,359 +3808,HH-808,Haven Heights,Residential,Micro,Lowrise,Far,Medium,4,3,1523,18,22,1714,306 +3808,HH-938,Haven Heights,Residential,Micro,Lowrise,Far,Medium,4,3,1216,16,20,739,495 +3808,HH-939,Haven Heights,Residential,Micro,Lowrise,Far,Medium,4,3,1359,16,20,723,506 +3808,HH-940,Haven Heights,Residential,Micro,Lowrise,Far,Medium,4,3,1361,16,20,687,531 +3808,HH-941,Haven Heights,Residential,Micro,Lowrise,Far,Medium,4,3,1332,18,22,667,548 +3875,NS-119,North Star,Residential,Nano,Lowrise,Far,Medium,4,3,673,17,21,749,301 +3875,NS-123,North Star,Residential,Nano,Lowrise,Far,Medium,4,3,1088,18,22,769,317 +3875,NS-125,North Star,Residential,Nano,Lowrise,Far,Medium,5,4,960,20,25,621,444 +3875,NS-129,North Star,Residential,Nano,Lowrise,Far,Medium,4,3,1128,19,23,770,329 +3875,NS-130,North Star,Residential,Nano,Lowrise,Far,Medium,4,3,1018,19,23,681,401 +3875,NS-141,North Star,Residential,Nano,Lowrise,Far,Medium,4,3,840,16,20,822,306 +3875,NS-142,North Star,Residential,Nano,Lowrise,Far,Medium,4,3,1129,16,20,771,342 +3875,NS-144,North Star,Residential,Nano,Lowrise,Far,Medium,5,4,993,22,27,622,463 +3875,NS-147,North Star,Residential,Nano,Lowrise,Far,Medium,6,5,916,28,34,825,320 +3875,NS-148,North Star,Residential,Nano,Lowrise,Far,Medium,4,4,1018,20,24,684,423 +3875,NS-149,North Star,Residential,Nano,Lowrise,Far,Medium,4,3,993,17,21,624,473 +3875,NS-156,North Star,Residential,Nano,Lowrise,Far,Medium,6,5,992,25,31,829,334 +3875,NS-158,North Star,Residential,Nano,Lowrise,Far,Medium,5,4,993,22,27,627,484 +3875,NS-168,North Star,Residential,Nano,Lowrise,Far,Medium,4,3,1012,19,23,833,349 +3875,NS-169,North Star,Residential,Nano,Lowrise,Far,Medium,5,4,972,22,27,688,447 +3875,NS-187,North Star,Residential,Nano,Lowrise,Far,Medium,4,4,1054,20,24,714,485 +3875,NS-188,North Star,Residential,Nano,Lowrise,Far,Medium,4,3,1091,16,20,695,498 +3875,NS-189,North Star,Residential,Nano,Lowrise,Far,Medium,4,3,1091,16,20,676,511 +3875,NS-190,North Star,Residential,Nano,Lowrise,Far,Medium,4,3,1091,16,20,658,525 +3875,NS-192,North Star,Residential,Nano,Lowrise,Far,Medium,4,3,977,17,21,621,553 +3875,NS-224,North Star,Residential,Nano,Lowrise,Far,Medium,5,4,1053,21,26,712,531 +3875,NS-225,North Star,Residential,Nano,Lowrise,Far,Medium,4,3,1082,17,21,674,554 +3875,NS-227,North Star,Residential,Nano,Lowrise,Far,Medium,3,2,1075,12,15,636,580 +3875,NS-228,North Star,Residential,Nano,Lowrise,Far,Medium,3,2,960,14,17,618,593 +3875,NS-238,North Star,Residential,Nano,Lowrise,Far,Medium,4,3,488,19,23,826,487 +3875,NS-242,North Star,Residential,Nano,Lowrise,Far,Medium,5,4,1056,22,27,1748,329 +3875,NS-245,North Star,Residential,Nano,Lowrise,Far,Medium,2,2,838,10,12,776,556 +3875,NS-251,North Star,Residential,Nano,Lowrise,Far,Medium,4,4,1064,20,24,1836,315 +3875,NS-252,North Star,Residential,Nano,Lowrise,Far,Medium,10,8,1037,42,52,1818,329 +3875,NS-253,North Star,Residential,Nano,Lowrise,Far,Medium,4,3,1091,18,22,1748,349 +3875,NS-254,North Star,Residential,Nano,Lowrise,Far,Medium,4,3,1066,16,20,1692,343 +3875,NS-260,North Star,Residential,Nano,Lowrise,Far,Medium,4,3,1064,18,22,1384,301 +3875,NS-264,North Star,Residential,Nano,Lowrise,Far,Medium,2,2,724,10,12,817,556 +3875,NS-277,North Star,Residential,Nano,Lowrise,Far,Medium,6,5,1065,26,32,1691,359 +3875,NS-279,North Star,Residential,Nano,Lowrise,Far,Medium,7,6,1065,30,37,1383,320 +3875,NS-280,North Star,Residential,Nano,Lowrise,Far,Medium,4,3,643,16,20,814,575 +3875,NS-281,North Star,Residential,Nano,Lowrise,Far,Medium,4,3,870,18,22,775,591 +3875,NS-286,North Star,Residential,Nano,Lowrise,Far,Medium,7,6,1091,31,38,1747,356 +3875,NS-288,North Star,Residential,Nano,Lowrise,Far,Medium,4,3,1062,16,20,1446,323 +3875,NS-290,North Star,Residential,Nano,Lowrise,Far,Medium,4,3,561,19,23,812,594 +3875,NS-300,North Star,Residential,Nano,Lowrise,Far,Medium,7,5,1091,29,36,1747,345 +3875,NS-301,North Star,Residential,Nano,Lowrise,Far,Medium,4,3,1065,17,21,1691,393 +3875,NS-302,North Star,Residential,Nano,Lowrise,Far,Medium,4,3,1086,16,20,1592,354 +3875,NS-303,North Star,Residential,Nano,Lowrise,Far,Medium,7,6,1082,32,39,1573,349 +3875,NS-304,North Star,Residential,Nano,Lowrise,Far,Medium,7,5,1079,28,35,1554,345 +3875,NS-305,North Star,Residential,Nano,Lowrise,Far,Medium,6,5,1075,28,34,1535,342 +3875,NS-306,North Star,Residential,Nano,Lowrise,Far,Medium,4,3,1052,17,21,1516,340 +3875,NS-307,North Star,Residential,Nano,Lowrise,Far,Medium,10,8,1062,42,52,1446,343 +3875,NS-308,North Star,Residential,Nano,Lowrise,Far,Medium,7,5,1068,28,35,1383,357 +3875,NS-312,North Star,Residential,Nano,Lowrise,Far,Medium,5,4,1091,21,26,1151,481 +3875,NS-322,North Star,Residential,Nano,Lowrise,Far,Medium,4,3,1040,16,20,1747,335 +3875,NS-324,North Star,Residential,Nano,Lowrise,Far,Medium,6,4,1013,24,30,1446,362 +3875,NS-331,North Star,Residential,Nano,Lowrise,Far,Medium,5,4,1054,22,27,1445,414 +3875,NS-332,North Star,Residential,Nano,Lowrise,Far,Medium,4,3,1055,17,21,1386,425 +3875,NS-341,North Star,Residential,Nano,Lowrise,Far,Medium,5,4,979,20,25,1730,320 +3875,NS-343,North Star,Residential,Nano,Lowrise,Far,Medium,9,7,979,36,45,1692,355 +3875,NS-345,North Star,Residential,Nano,Lowrise,Far,Medium,5,4,1024,21,26,1593,441 +3875,NS-346,North Star,Residential,Nano,Lowrise,Far,Medium,5,4,1051,21,26,1537,432 +3875,NS-347,North Star,Residential,Nano,Lowrise,Far,Medium,5,4,1091,22,27,1446,433 +3875,NS-368,North Star,Residential,Nano,Lowrise,Far,Medium,4,3,1024,17,21,1593,441 +3875,NS-369,North Star,Residential,Nano,Lowrise,Far,Medium,8,7,1052,35,43,1537,451 +3875,NS-370,North Star,Residential,Nano,Lowrise,Far,Medium,4,3,1091,17,21,1446,452 +3875,NS-371,North Star,Residential,Nano,Lowrise,Far,Medium,3,3,1024,15,18,1593,437 +3875,NS-373,North Star,Residential,Nano,Lowrise,Far,Medium,3,3,1091,15,18,1446,471 +3875,NS-374,North Star,Residential,Nano,Lowrise,Far,Medium,3,3,1095,15,18,1387,481 +3875,NS-384,North Star,Residential,Nano,Lowrise,Far,Medium,3,3,954,15,18,1711,317 +3875,NS-385,North Star,Residential,Nano,Lowrise,Far,Medium,3,3,954,15,18,1692,336 +3875,NS-387,North Star,Residential,Nano,Lowrise,Far,Medium,3,3,1054,15,18,1536,488 +3875,NS-388,North Star,Residential,Nano,Lowrise,Far,Medium,3,3,1091,15,18,1446,490 +3875,NS-389,North Star,Residential,Nano,Lowrise,Far,Medium,3,3,1096,15,18,1387,499 +3875,NS-410,North Star,Residential,Nano,Lowrise,Far,Medium,3,3,915,15,18,1593,429 +3875,NS-417,North Star,Residential,Nano,Lowrise,Far,Medium,9,7,856,37,46,1594,421 +3875,NS-418,North Star,Residential,Nano,Lowrise,Far,Medium,4,3,879,16,20,1534,481 +3875,NS-419,North Star,Residential,Nano,Lowrise,Far,Medium,5,4,978,20,25,1445,569 +3875,NS-433,North Star,Residential,Nano,Lowrise,Far,Medium,4,3,1024,17,21,1692,323 +3875,NS-434,North Star,Residential,Nano,Lowrise,Far,Medium,9,7,954,38,47,1594,421 +3875,NS-435,North Star,Residential,Nano,Lowrise,Far,Medium,7,6,981,30,37,1534,481 +3875,NS-436,North Star,Residential,Nano,Lowrise,Far,Medium,5,4,1091,23,28,1445,569 +3875,NS-437,North Star,Residential,Nano,Lowrise,Far,Medium,4,3,1093,19,23,1386,595 +3875,NS-456,North Star,Residential,Nano,Lowrise,Far,Medium,4,3,1024,18,22,1692,323 +3875,NS-457,North Star,Residential,Nano,Lowrise,Far,Medium,4,3,954,16,20,1594,421 +3875,NS-458,North Star,Residential,Nano,Lowrise,Far,Medium,5,4,982,20,25,1534,481 +3875,NS-465,North Star,Residential,Nano,Lowrise,Far,Medium,5,4,1024,21,26,1693,324 +3875,NS-466,North Star,Residential,Nano,Lowrise,Far,Medium,5,4,954,20,25,1595,422 +3875,NS-479,North Star,Residential,Nano,Lowrise,Far,Medium,4,3,1024,16,20,1694,327 +3875,NS-504,North Star,Residential,Nano,Lowrise,Far,Medium,10,8,944,42,52,1694,330 +3875,NS-505,North Star,Residential,Nano,Lowrise,Far,Medium,4,4,909,20,24,1597,427 +3875,NS-506,North Star,Residential,Nano,Lowrise,Far,Medium,4,3,907,18,22,1536,486 +3875,NS-507,North Star,Residential,Nano,Lowrise,Far,Medium,4,4,1038,20,24,1448,574 +3964,NS-354,North Star,Residential,Micro,Lowrise,Far,Far,4,3,1452,19,23,792,705 +3964,NS-355,North Star,Residential,Micro,Lowrise,Far,Far,3,3,1900,15,18,762,716 +3964,NS-357,North Star,Residential,Micro,Lowrise,Far,Far,3,3,1905,15,18,693,745 +3964,NS-358,North Star,Residential,Micro,Lowrise,Far,Far,3,3,1907,15,18,659,762 +3964,NS-359,North Star,Residential,Micro,Lowrise,Far,Far,3,3,1800,15,18,626,779 +3964,NS-396,North Star,Residential,Micro,Lowrise,Far,Far,3,3,1859,15,18,761,768 +3964,NS-397,North Star,Residential,Micro,Lowrise,Far,Far,3,3,1859,15,18,727,781 +3964,NS-399,North Star,Residential,Micro,Lowrise,Far,Far,3,3,1859,15,18,658,811 +3964,NS-400,North Star,Residential,Micro,Lowrise,Far,Far,5,4,1752,23,28,625,827 +3964,NS-439,North Star,Residential,Micro,Lowrise,Far,Far,5,4,1365,21,26,1136,686 +3964,NS-441,North Star,Residential,Micro,Lowrise,Far,Far,4,3,1264,19,23,765,859 +3964,NS-442,North Star,Residential,Micro,Lowrise,Far,Far,7,6,1475,31,38,738,868 +3964,NS-444,North Star,Residential,Micro,Lowrise,Far,Far,4,3,1475,18,22,679,890 +3964,NS-445,North Star,Residential,Micro,Lowrise,Far,Far,4,3,1375,18,22,622,915 +3964,NS-462,North Star,Residential,Micro,Lowrise,Far,Far,6,5,1365,26,32,1136,703 +3964,NS-471,North Star,Residential,Micro,Lowrise,Far,Far,4,4,1364,20,24,1137,719 +3964,NS-490,North Star,Residential,Micro,Lowrise,Far,Far,6,5,1490,25,31,654,956 +3964,NS-491,North Star,Residential,Micro,Lowrise,Far,Far,4,3,1383,17,21,625,968 +3964,NS-511,North Star,Residential,Micro,Lowrise,Far,Far,4,3,1308,16,20,1139,752 +3964,NS-512,North Star,Residential,Micro,Lowrise,Far,Far,7,5,1221,29,36,1067,789 +3964,NS-516,North Star,Residential,Micro,Lowrise,Far,Far,5,4,1432,24,29,1163,804 +3964,NS-517,North Star,Residential,Micro,Lowrise,Far,Far,4,3,1465,17,21,1136,816 +3964,NS-518,North Star,Residential,Micro,Lowrise,Far,Far,4,3,1466,17,21,1108,828 +3964,NS-520,North Star,Residential,Micro,Lowrise,Far,Far,4,4,1469,20,24,1054,855 +3964,NS-525,North Star,Residential,Micro,Lowrise,Far,Far,4,3,1314,17,21,757,1003 +3964,NS-526,North Star,Residential,Micro,Lowrise,Far,Far,6,5,1565,25,31,705,1021 +3964,NS-527,North Star,Residential,Micro,Lowrise,Far,Far,6,5,1567,25,31,651,1040 +3964,NS-528,North Star,Residential,Micro,Lowrise,Far,Far,5,4,1454,21,26,624,1050 +3964,NS-553,North Star,Residential,Micro,Lowrise,Far,Far,6,5,1430,25,31,1164,862 +3964,NS-554,North Star,Residential,Micro,Lowrise,Far,Far,5,4,1461,21,26,1110,884 +3964,NS-555,North Star,Residential,Micro,Lowrise,Far,Far,5,4,1458,21,26,1083,896 +3964,NS-557,North Star,Residential,Micro,Lowrise,Far,Far,4,4,1232,20,24,1030,922 +3964,NS-558,North Star,Residential,Micro,Lowrise,Far,Far,4,3,1563,16,20,733,1067 +3964,NS-559,North Star,Residential,Micro,Lowrise,Far,Far,6,5,1545,26,32,652,1094 +3964,NS-576,North Star,Residential,Micro,Lowrise,Far,Far,4,4,1482,20,24,1057,972 +3964,NS-578,North Star,Residential,Micro,Lowrise,Far,Far,4,3,1378,16,20,654,1163 +3964,NS-581,North Star,Residential,Micro,Lowrise,Far,Far,4,3,1288,18,22,1366,706 +3964,NS-582,North Star,Residential,Micro,Lowrise,Far,Far,4,3,1627,18,22,1341,730 +3964,NS-583,North Star,Residential,Micro,Lowrise,Far,Far,4,3,1629,16,20,1313,757 +3964,NS-584,North Star,Residential,Micro,Lowrise,Far,Far,5,4,1631,20,25,1256,811 +3964,NS-585,North Star,Residential,Micro,Lowrise,Far,Far,5,4,1597,20,25,1228,838 +3964,NS-586,North Star,Residential,Micro,Lowrise,Far,Far,5,4,1621,23,28,1140,924 +3964,NS-587,North Star,Residential,Micro,Lowrise,Far,Far,5,4,1539,24,29,1058,990 +3964,NS-595,North Star,Residential,Micro,Lowrise,Far,Far,5,4,1621,22,27,1141,929 +3964,NS-596,North Star,Residential,Micro,Lowrise,Far,Far,4,3,2181,18,22,675,1194 +3964,NS-599,North Star,Residential,Micro,Lowrise,Far,Far,5,4,1620,23,28,1142,934 +3964,NS-600,North Star,Residential,Micro,Lowrise,Far,Far,4,4,1564,20,24,1059,1014 +3964,NS-601,North Star,Residential,Micro,Lowrise,Far,Far,4,3,1601,17,21,661,1217 +3964,NS-605,North Star,Residential,Micro,Lowrise,Far,Far,10,8,1629,43,53,1344,750 +3964,NS-606,North Star,Residential,Micro,Lowrise,Far,Far,4,4,1622,20,24,1316,776 +3964,NS-607,North Star,Residential,Micro,Lowrise,Far,Far,5,4,1616,22,27,1288,803 +3964,NS-608,North Star,Residential,Micro,Lowrise,Far,Far,5,4,1609,22,27,1260,829 +3964,NS-610,North Star,Residential,Micro,Lowrise,Far,Far,5,4,1619,22,27,1143,940 +3964,NS-620,North Star,Residential,Micro,Lowrise,Far,Far,4,3,1495,17,21,1061,1025 +3964,NS-630,North Star,Residential,Micro,Lowrise,Far,Far,4,4,1700,20,24,1069,1039 +3964,NS-631,North Star,Residential,Micro,Lowrise,Far,Far,5,4,1449,23,28,1275,859 +3964,NS-633,North Star,Residential,Micro,Lowrise,Far,Far,4,3,1219,18,22,1233,895 +3964,NS-635,North Star,Residential,Micro,Lowrise,Far,Far,4,3,1608,16,20,1074,1044 +3964,NS-647,North Star,Residential,Micro,Lowrise,Far,Far,4,3,1930,17,21,1154,982 +3964,NS-648,North Star,Residential,Micro,Lowrise,Far,Far,4,3,1408,17,21,1079,1027 +3964,NS-655,North Star,Residential,Micro,Lowrise,Far,Far,5,4,1929,23,28,1154,977 +3964,NS-656,North Star,Residential,Micro,Lowrise,Far,Far,4,3,1208,16,20,1083,1002 +3964,NS-667,North Star,Residential,Micro,Lowrise,Far,Far,4,3,1930,16,20,1155,953 +3964,NS-670,North Star,Residential,Micro,Lowrise,Far,Far,5,4,1718,20,25,1156,930 +3964,NS-714,North Star,Residential,Micro,Lowrise,Far,Far,10,8,1876,41,51,1861,620 +3964,NS-860,North Star,Residential,Micro,Lowrise,Far,Far,9,8,1663,40,49,760,618 +4030,HH-12,Haven Heights,Residential,Nano,Lowrise,Far,Medium,4,3,814,16,20,806,321 +4030,HH-13,Haven Heights,Residential,Nano,Lowrise,Far,Medium,8,7,738,35,43,763,342 +4030,HH-19,Haven Heights,Residential,Nano,Lowrise,Far,Medium,7,6,860,30,37,803,339 +4030,HH-20,Haven Heights,Residential,Nano,Lowrise,Far,Medium,4,3,752,16,20,762,358 +4030,HH-21,Haven Heights,Residential,Nano,Lowrise,Far,Medium,4,3,859,19,23,801,355 +4030,HH-23,Haven Heights,Residential,Nano,Lowrise,Far,Medium,4,3,858,16,20,799,369 +4030,HH-24,Haven Heights,Residential,Nano,Lowrise,Far,Medium,6,5,638,26,32,760,391 +4030,HH-30,Haven Heights,Residential,Nano,Lowrise,Far,Medium,6,5,1079,26,32,899,312 +4030,HH-31,Haven Heights,Residential,Nano,Lowrise,Far,Medium,4,3,1075,16,20,880,326 +4030,HH-32,Haven Heights,Residential,Nano,Lowrise,Far,Medium,4,3,1052,16,20,861,341 +4030,HH-33,Haven Heights,Residential,Nano,Lowrise,Far,Medium,10,8,857,40,50,797,384 +4030,HH-35,Haven Heights,Residential,Nano,Lowrise,Far,Medium,6,4,830,24,30,795,399 +4030,HH-62,Haven Heights,Residential,Nano,Lowrise,Far,Medium,5,4,934,22,27,764,506 +4030,HH-86,Haven Heights,Residential,Nano,Lowrise,Far,Medium,4,3,1065,18,22,1009,381 +4030,HH-88,Haven Heights,Residential,Nano,Lowrise,Far,Medium,6,5,1091,27,33,1062,360 +4030,HH-89,Haven Heights,Residential,Nano,Lowrise,Far,Medium,4,3,1065,16,20,1006,396 +4030,HH-100,Haven Heights,Residential,Nano,Lowrise,Far,Medium,5,4,1065,23,28,1004,411 +4030,HH-106,Haven Heights,Residential,Nano,Lowrise,Far,Medium,8,6,1040,33,41,1058,393 +4030,HH-107,Haven Heights,Residential,Nano,Lowrise,Far,Medium,8,6,985,33,41,1002,425 +4030,HH-114,Haven Heights,Residential,Nano,Lowrise,Far,Medium,6,5,1054,28,34,1070,445 +4030,HH-115,Haven Heights,Residential,Nano,Lowrise,Far,Medium,4,3,1091,16,20,1051,454 +4030,HH-116,Haven Heights,Residential,Nano,Lowrise,Far,Medium,4,3,1091,16,20,1013,474 +4030,HH-118,Haven Heights,Residential,Nano,Lowrise,Far,Medium,4,3,977,17,21,976,495 +4030,HH-130,Haven Heights,Residential,Nano,Lowrise,Far,Medium,4,3,1052,18,22,1064,496 +4030,HH-131,Haven Heights,Residential,Nano,Lowrise,Far,Medium,7,6,1086,30,37,1045,505 +4030,HH-133,Haven Heights,Residential,Nano,Lowrise,Far,Medium,4,3,1075,17,21,988,534 +4030,HH-134,Haven Heights,Residential,Nano,Lowrise,Far,Medium,7,5,960,29,36,970,543 +4030,HH-141,Haven Heights,Residential,Nano,Lowrise,Far,Medium,4,3,1077,16,20,1317,491 +4030,HH-142,Haven Heights,Residential,Nano,Lowrise,Far,Medium,4,3,947,16,20,1125,531 +4030,HH-144,Haven Heights,Residential,Nano,Lowrise,Far,Medium,5,4,990,21,26,982,596 +4030,HH-147,Haven Heights,Residential,Nano,Lowrise,Far,Medium,4,3,1076,18,22,1296,501 +4030,HH-148,Haven Heights,Residential,Nano,Lowrise,Far,Medium,4,3,1075,16,20,1276,506 +4030,HH-149,Haven Heights,Residential,Nano,Lowrise,Far,Medium,11,9,1063,46,57,1186,529 +4030,HH-150,Haven Heights,Residential,Nano,Lowrise,Far,Medium,4,3,981,16,20,1123,549 +4030,HH-151,Haven Heights,Residential,Nano,Lowrise,Far,Medium,4,3,1049,16,20,1036,584 +4030,HH-160,Haven Heights,Residential,Nano,Lowrise,Far,Medium,5,4,1063,22,27,1185,547 +4030,HH-165,Haven Heights,Residential,Nano,Lowrise,Far,Medium,4,3,983,16,20,1121,585 +4030,HH-170,Haven Heights,Residential,Nano,Lowrise,Far,Medium,4,3,1050,17,21,1334,539 +4030,HH-174,Haven Heights,Residential,Nano,Lowrise,Far,Medium,4,3,1051,16,20,1293,556 +4030,HH-176,Haven Heights,Residential,Nano,Lowrise,Far,Medium,4,3,1033,16,20,1254,565 +4030,HH-177,Haven Heights,Residential,Nano,Lowrise,Far,Medium,7,6,1063,31,38,1183,584 +4030,HH-251,Haven Heights,Residential,Nano,Lowrise,Far,Medium,4,3,1121,16,20,1585,444 +4030,HH-268,Haven Heights,Residential,Nano,Lowrise,Far,Medium,4,3,895,16,20,1531,483 +4030,HH-327,Haven Heights,Residential,Nano,Lowrise,Far,Medium,4,3,915,16,20,1615,442 +4030,HH-328,Haven Heights,Residential,Nano,Lowrise,Far,Medium,7,5,946,28,35,1509,505 +4030,HH-343,Haven Heights,Residential,Nano,Lowrise,Far,Medium,4,3,780,16,20,1462,546 +4030,HH-368,Haven Heights,Residential,Nano,Lowrise,Far,Medium,4,3,1021,16,20,1590,467 +4030,HH-369,Haven Heights,Residential,Nano,Lowrise,Far,Medium,4,3,1024,16,20,1544,499 +4030,HH-377,Haven Heights,Residential,Nano,Lowrise,Far,Medium,6,4,1021,24,30,1577,480 +4030,HH-389,Haven Heights,Residential,Nano,Lowrise,Far,Medium,9,7,1021,36,45,1564,493 +4030,HH-390,Haven Heights,Residential,Nano,Lowrise,Far,Medium,5,4,1026,23,28,1518,535 +4030,HH-411,Haven Heights,Residential,Nano,Lowrise,Far,Medium,4,3,972,16,20,1551,487 +4030,HH-412,Haven Heights,Residential,Nano,Lowrise,Far,Medium,4,3,946,18,22,1505,541 +4030,HH-413,Haven Heights,Residential,Nano,Lowrise,Far,Medium,4,3,1104,17,21,1439,589 +4030,HH-429,Haven Heights,Residential,Nano,Lowrise,Far,Medium,6,4,1056,24,30,1639,307 +4030,HH-430,Haven Heights,Residential,Nano,Lowrise,Far,Medium,5,4,1091,23,28,1623,324 +4030,HH-431,Haven Heights,Residential,Nano,Lowrise,Far,Medium,4,3,1091,19,23,1607,340 +4030,HH-459,Haven Heights,Residential,Nano,Lowrise,Far,Medium,7,5,1082,29,36,1407,514 +4030,HH-471,Haven Heights,Residential,Nano,Lowrise,Far,Medium,4,3,1065,17,21,1574,312 +4030,HH-472,Haven Heights,Residential,Nano,Lowrise,Far,Medium,5,4,1065,22,27,1542,348 +4030,HH-474,Haven Heights,Residential,Nano,Lowrise,Far,Medium,4,3,886,18,22,1398,500 +4030,HH-553,Haven Heights,Residential,Nano,Lowrise,Far,Medium,4,3,1145,17,21,1385,324 +4030,HH-654,Haven Heights,Residential,Nano,Lowrise,Far,Medium,4,3,986,16,20,1935,333 +4030,HH-655,Haven Heights,Residential,Nano,Lowrise,Far,Medium,4,3,986,16,20,1917,322 +4030,HH-656,Haven Heights,Residential,Nano,Lowrise,Far,Medium,11,9,986,45,56,1899,312 +4030,HH-662,Haven Heights,Residential,Nano,Lowrise,Far,Medium,4,3,1024,17,21,1061,532 +4030,HH-663,Haven Heights,Residential,Nano,Lowrise,Far,Medium,4,3,1024,17,21,1043,549 +4030,HH-664,Haven Heights,Residential,Nano,Lowrise,Far,Medium,5,4,1024,20,25,1025,566 +4030,HH-665,Haven Heights,Residential,Nano,Lowrise,Far,Medium,4,3,1024,16,20,1007,584 +4030,HH-679,Haven Heights,Residential,Nano,Lowrise,Far,Medium,4,3,898,16,20,1943,328 +4030,HH-680,Haven Heights,Residential,Nano,Lowrise,Far,Medium,4,3,1001,16,20,1908,360 +4030,HH-682,Haven Heights,Residential,Nano,Lowrise,Far,Medium,4,4,994,20,24,1871,344 +4030,HH-683,Haven Heights,Residential,Nano,Lowrise,Far,Medium,7,6,972,32,39,1853,333 +4030,HH-691,Haven Heights,Residential,Nano,Lowrise,Far,Medium,4,3,1044,16,20,1044,558 +4030,HH-692,Haven Heights,Residential,Nano,Lowrise,Far,Medium,4,3,1040,16,20,1026,575 +4030,HH-714,Haven Heights,Residential,Nano,Lowrise,Far,Medium,4,3,914,16,20,1040,593 +4030,HH-743,Haven Heights,Residential,Nano,Lowrise,Far,Medium,4,3,1197,16,20,1707,440 +4030,HH-749,Haven Heights,Residential,Nano,Lowrise,Far,Medium,4,3,902,16,20,1716,428 +4030,HH-760,Haven Heights,Residential,Nano,Lowrise,Far,Medium,4,3,1037,16,20,1117,594 +4030,HH-767,Haven Heights,Residential,Nano,Lowrise,Far,Medium,4,3,1012,16,20,1174,585 +4030,HH-770,Haven Heights,Residential,Nano,Lowrise,Far,Medium,4,3,932,16,20,1778,365 +4030,HH-773,Haven Heights,Residential,Nano,Lowrise,Far,Medium,4,3,653,19,23,1533,509 +4030,HH-776,Haven Heights,Residential,Nano,Lowrise,Far,Medium,4,3,1098,18,22,1323,499 +4030,HH-777,Haven Heights,Residential,Nano,Lowrise,Far,Medium,4,3,1135,17,21,1304,496 +4030,HH-778,Haven Heights,Residential,Nano,Lowrise,Far,Medium,5,4,1135,22,27,1284,494 +4030,HH-779,Haven Heights,Residential,Nano,Lowrise,Far,Medium,4,3,1135,17,21,1264,492 +4030,HH-781,Haven Heights,Residential,Nano,Lowrise,Far,Medium,5,4,1103,23,28,1224,491 +4030,HH-790,Haven Heights,Residential,Nano,Lowrise,Far,Medium,8,6,1130,33,41,1303,438 +4030,HH-791,Haven Heights,Residential,Nano,Lowrise,Far,Medium,5,4,1126,20,25,1283,435 +4030,HH-793,Haven Heights,Residential,Nano,Lowrise,Far,Medium,4,3,1119,16,20,1243,433 +4030,HH-794,Haven Heights,Residential,Nano,Lowrise,Far,Medium,4,3,1095,17,21,1223,433 +4030,HH-798,Haven Heights,Residential,Nano,Lowrise,Far,Medium,4,3,614,17,21,1691,343 +4030,HH-800,Haven Heights,Residential,Nano,Lowrise,Far,Medium,3,3,1102,15,18,1301,367 +4030,HH-802,Haven Heights,Residential,Nano,Lowrise,Far,Medium,4,4,1071,20,24,1703,324 +4030,HH-804,Haven Heights,Residential,Nano,Lowrise,Far,Medium,3,3,1136,15,18,1393,354 +4030,HH-806,Haven Heights,Residential,Nano,Lowrise,Far,Medium,4,3,1142,16,20,1242,341 +4030,HH-813,Haven Heights,Residential,Nano,Lowrise,Far,Medium,4,3,1135,19,23,1451,315 +4030,HH-844,Haven Heights,Residential,Nano,Lowrise,Far,Medium,4,3,1098,19,23,624,405 +4030,HH-882,Haven Heights,Residential,Nano,Lowrise,Far,Medium,4,3,1021,16,20,659,397 +4030,HH-884,Haven Heights,Residential,Nano,Lowrise,Far,Medium,4,4,1021,20,24,658,401 +4030,HH-885,Haven Heights,Residential,Nano,Lowrise,Far,Medium,9,7,914,36,45,657,406 +4030,HH-889,Haven Heights,Residential,Nano,Lowrise,Far,Medium,4,3,940,16,20,743,348 +4030,HH-890,Haven Heights,Residential,Nano,Lowrise,Far,Medium,4,3,1051,16,20,742,357 +4030,HH-900,Haven Heights,Residential,Nano,Lowrise,Far,Medium,4,3,1024,16,20,792,329 +4030,HH-901,Haven Heights,Residential,Nano,Lowrise,Far,Medium,4,3,1053,17,21,736,377 +4030,HH-903,Haven Heights,Residential,Nano,Lowrise,Far,Medium,4,3,1024,16,20,790,340 +4030,HH-907,Haven Heights,Residential,Nano,Lowrise,Far,Medium,4,3,974,16,20,788,350 +4030,HH-908,Haven Heights,Residential,Nano,Lowrise,Far,Medium,4,3,972,16,20,732,397 +4030,HH-910,Haven Heights,Residential,Nano,Lowrise,Far,Medium,4,3,986,16,20,716,428 +4030,HH-911,Haven Heights,Residential,Nano,Lowrise,Far,Medium,4,3,1049,16,20,860,321 +4030,HH-912,Haven Heights,Residential,Nano,Lowrise,Far,Medium,4,3,993,16,20,767,392 +4030,HH-913,Haven Heights,Residential,Nano,Lowrise,Far,Medium,10,8,1020,41,51,710,439 +4030,HH-916,Haven Heights,Residential,Nano,Lowrise,Far,Medium,4,4,993,20,24,761,406 +4030,HH-917,Haven Heights,Residential,Nano,Lowrise,Far,Medium,5,4,1021,21,26,704,451 +4030,HH-918,Haven Heights,Residential,Nano,Lowrise,Far,Medium,4,3,990,16,20,919,324 +4030,HH-919,Haven Heights,Residential,Nano,Lowrise,Far,Medium,10,8,1024,42,52,901,334 +4030,HH-921,Haven Heights,Residential,Nano,Lowrise,Far,Medium,8,6,1024,32,40,864,354 +4030,HH-922,Haven Heights,Residential,Nano,Lowrise,Far,Medium,4,3,1024,16,20,845,365 +4030,HH-923,Haven Heights,Residential,Nano,Lowrise,Far,Medium,4,3,993,16,20,750,433 +4030,HH-924,Haven Heights,Residential,Nano,Lowrise,Far,Medium,4,3,948,16,20,688,490 +4030,HH-927,Haven Heights,Residential,Nano,Lowrise,Far,Medium,4,4,993,20,24,984,353 +4030,HH-928,Haven Heights,Residential,Nano,Lowrise,Far,Medium,4,3,993,16,20,951,375 +4030,HH-929,Haven Heights,Residential,Nano,Lowrise,Far,Medium,4,3,993,18,22,935,385 +4030,HH-930,Haven Heights,Residential,Nano,Lowrise,Far,Medium,4,3,965,16,20,918,394 +4030,HH-931,Haven Heights,Residential,Nano,Lowrise,Far,Medium,4,3,1066,16,20,653,551 +4030,HH-936,Haven Heights,Residential,Nano,Lowrise,Far,Medium,4,3,1024,18,22,1059,302 +4030,HH-937,Haven Heights,Residential,Nano,Lowrise,Far,Medium,4,3,995,16,20,1043,313 +4030,HH-943,Haven Heights,Residential,Nano,Lowrise,Far,Medium,4,3,937,16,20,1099,301 +4030,HH-945,Haven Heights,Residential,Nano,Lowrise,Far,Medium,4,3,1037,16,20,1048,335 +4030,HH-946,Haven Heights,Residential,Nano,Lowrise,Far,Medium,4,3,1011,16,20,1015,358 +4030,HH-947,Haven Heights,Residential,Nano,Lowrise,Far,Medium,4,3,984,16,20,969,391 +4030,HH-948,Haven Heights,Residential,Nano,Lowrise,Far,Medium,8,6,1013,32,40,952,402 +4030,HH-949,Haven Heights,Residential,Nano,Lowrise,Far,Medium,4,3,1010,16,20,935,413 +4030,HH-950,Haven Heights,Residential,Nano,Lowrise,Far,Medium,4,3,1006,16,20,918,425 +4030,HH-952,Haven Heights,Residential,Nano,Lowrise,Far,Medium,9,7,981,36,45,885,446 +4030,HH-954,Haven Heights,Residential,Nano,Lowrise,Far,Medium,4,3,1062,16,20,702,552 +4030,HH-955,Haven Heights,Residential,Nano,Lowrise,Far,Medium,4,3,903,16,20,690,555 +4030,HH-959,Haven Heights,Residential,Nano,Lowrise,Far,Medium,4,3,979,19,23,1154,307 +4030,HH-960,Haven Heights,Residential,Nano,Lowrise,Far,Medium,4,3,979,19,23,1137,320 +4030,HH-961,Haven Heights,Residential,Nano,Lowrise,Far,Medium,4,3,1091,16,20,1027,395 +4030,HH-962,Haven Heights,Residential,Nano,Lowrise,Far,Medium,4,3,1091,17,21,992,419 +4030,HH-964,Haven Heights,Residential,Nano,Lowrise,Far,Medium,3,3,922,15,18,1177,317 +4030,HH-965,Haven Heights,Residential,Nano,Lowrise,Far,Medium,4,3,954,16,20,1160,329 +4030,HH-966,Haven Heights,Residential,Nano,Lowrise,Far,Medium,4,3,954,16,20,1143,341 +4030,HH-967,Haven Heights,Residential,Nano,Lowrise,Far,Medium,4,3,954,16,20,1109,366 +4030,HH-968,Haven Heights,Residential,Nano,Lowrise,Far,Medium,6,5,854,27,33,1093,377 +4030,HH-969,Haven Heights,Residential,Nano,Lowrise,Far,Medium,9,7,975,36,45,1037,418 +4030,HH-970,Haven Heights,Residential,Nano,Lowrise,Far,Medium,4,3,1086,16,20,1021,429 +4030,HH-972,Haven Heights,Residential,Nano,Lowrise,Far,Medium,4,3,1075,16,20,970,465 +4030,HH-973,Haven Heights,Residential,Nano,Lowrise,Far,Medium,4,3,1052,18,22,952,477 +4180,HH-137,Haven Heights,Residential,Micro,Lowrise,Far,Far,4,3,1380,17,21,878,612 +4180,HH-205,Haven Heights,Residential,Micro,Lowrise,Far,Far,4,3,1870,16,20,901,785 +4180,HH-226,Haven Heights,Residential,Micro,Lowrise,Far,Far,4,3,2060,16,20,1010,771 +4180,HH-227,Haven Heights,Residential,Micro,Lowrise,Far,Far,8,6,1637,33,41,911,815 +4180,HH-235,Haven Heights,Residential,Micro,Lowrise,Far,Far,4,3,1544,16,20,1381,617 +4180,HH-236,Haven Heights,Residential,Micro,Lowrise,Far,Far,8,6,1543,34,42,1353,636 +4180,HH-237,Haven Heights,Residential,Micro,Lowrise,Far,Far,4,3,1542,17,21,1325,655 +4180,HH-238,Haven Heights,Residential,Micro,Lowrise,Far,Far,4,3,1541,19,23,1297,675 +4180,HH-239,Haven Heights,Residential,Micro,Lowrise,Far,Far,7,5,1433,29,36,1269,695 +4180,HH-253,Haven Heights,Residential,Micro,Lowrise,Far,Far,9,7,1980,37,46,1015,806 +4180,HH-254,Haven Heights,Residential,Micro,Lowrise,Far,Far,4,3,1367,16,20,923,846 +4180,HH-270,Haven Heights,Residential,Micro,Lowrise,Far,Far,6,5,2153,25,31,1386,685 +4180,HH-271,Haven Heights,Residential,Micro,Lowrise,Far,Far,4,3,2152,19,23,1348,707 +4180,HH-272,Haven Heights,Residential,Micro,Lowrise,Far,Far,4,3,2150,16,20,1311,731 +4180,HH-275,Haven Heights,Residential,Micro,Lowrise,Far,Far,5,4,1549,22,27,1056,859 +4180,HH-291,Haven Heights,Residential,Micro,Lowrise,Far,Far,4,3,2283,16,20,1019,909 +4180,HH-292,Haven Heights,Residential,Micro,Lowrise,Far,Far,4,3,1969,16,20,961,934 +4180,HH-302,Haven Heights,Residential,Micro,Lowrise,Far,Far,4,4,1326,20,24,1376,673 +4180,HH-303,Haven Heights,Residential,Micro,Lowrise,Far,Far,6,5,2090,26,32,1360,699 +4180,HH-304,Haven Heights,Residential,Micro,Lowrise,Far,Far,4,3,2090,16,20,1342,731 +4180,HH-305,Haven Heights,Residential,Micro,Lowrise,Far,Far,4,3,2090,16,20,1324,753 +4180,HH-306,Haven Heights,Residential,Micro,Lowrise,Far,Far,5,4,2090,21,26,1298,776 +4180,HH-307,Haven Heights,Residential,Micro,Lowrise,Far,Far,8,6,1983,33,41,1262,799 +4180,HH-310,Haven Heights,Residential,Micro,Lowrise,Far,Far,4,3,1542,17,21,1045,912 +4180,HH-311,Haven Heights,Residential,Micro,Lowrise,Far,Far,6,4,1327,24,30,930,953 +4180,HH-312,Haven Heights,Residential,Micro,Lowrise,Far,Far,4,3,1718,16,20,650,1091 +4180,HH-358,Haven Heights,Residential,Micro,Lowrise,Far,Far,5,4,1408,23,28,699,1140 +4180,HH-379,Haven Heights,Residential,Micro,Lowrise,Far,Far,4,3,1443,16,20,1248,774 +4180,HH-393,Haven Heights,Residential,Micro,Lowrise,Far,Far,4,3,1444,17,21,1232,787 +4180,HH-403,Haven Heights,Residential,Micro,Lowrise,Far,Far,7,6,1480,31,38,986,1069 +4180,HH-404,Haven Heights,Residential,Micro,Lowrise,Far,Far,5,4,1517,24,29,707,1178 +4180,HH-414,Haven Heights,Residential,Micro,Lowrise,Far,Far,4,3,1289,16,20,984,1086 +4180,HH-435,Haven Heights,Residential,Micro,Lowrise,Far,Far,8,6,1764,32,40,1145,866 +4180,HH-441,Haven Heights,Residential,Micro,Lowrise,Far,Far,4,3,1845,16,20,1023,1058 +4180,HH-442,Haven Heights,Residential,Micro,Lowrise,Far,Far,5,4,1617,23,28,970,1119 +4180,HH-443,Haven Heights,Residential,Micro,Lowrise,Far,Far,4,3,1684,19,23,639,1280 +4180,HH-449,Haven Heights,Residential,Micro,Lowrise,Far,Far,4,3,1844,16,20,1005,1070 +4180,HH-452,Haven Heights,Residential,Micro,Lowrise,Far,Far,4,3,1685,16,20,634,1297 +4180,HH-462,Haven Heights,Residential,Micro,Lowrise,Far,Far,5,4,1845,22,27,988,1082 +4180,HH-463,Haven Heights,Residential,Micro,Lowrise,Far,Far,6,5,1299,25,31,946,1144 +4180,HH-464,Haven Heights,Residential,Micro,Lowrise,Far,Far,4,3,1288,18,22,707,1278 +4180,HH-475,Haven Heights,Residential,Micro,Lowrise,Far,Far,7,6,1803,31,38,1170,784 +4180,HH-476,Haven Heights,Residential,Micro,Lowrise,Far,Far,4,3,1734,16,20,1099,897 +4180,HH-482,Haven Heights,Residential,Micro,Lowrise,Far,Far,4,3,1844,17,21,970,1094 +4180,HH-484,Haven Heights,Residential,Micro,Lowrise,Far,Far,4,3,1688,16,20,625,1331 +4180,HH-491,Haven Heights,Residential,Micro,Lowrise,Far,Far,4,3,1650,16,20,953,1105 +4180,HH-493,Haven Heights,Residential,Micro,Lowrise,Far,Far,4,3,1419,16,20,707,1309 +4180,HH-503,Haven Heights,Residential,Micro,Lowrise,Far,Far,4,3,1721,16,20,1184,641 +4180,HH-504,Haven Heights,Residential,Micro,Lowrise,Far,Far,4,3,1372,17,21,1124,720 +4180,HH-534,Haven Heights,Residential,Micro,Lowrise,Far,Far,8,6,1449,32,40,1169,601 +4180,HH-535,Haven Heights,Residential,Micro,Lowrise,Far,Far,4,3,1487,16,20,1125,654 +4180,HH-536,Haven Heights,Residential,Micro,Lowrise,Far,Far,4,3,1486,16,20,1104,681 +4180,HH-537,Haven Heights,Residential,Micro,Lowrise,Far,Far,8,6,1377,32,40,1085,707 +4180,HH-547,Haven Heights,Residential,Micro,Lowrise,Far,Far,5,4,1235,21,26,818,1134 +4180,HH-568,Haven Heights,Residential,Micro,Lowrise,Far,Far,4,3,2053,16,20,842,949 +4180,HH-582,Haven Heights,Residential,Micro,Lowrise,Far,Far,4,3,2056,16,20,813,948 +4180,HH-594,Haven Heights,Residential,Micro,Lowrise,Far,Far,4,3,1536,16,20,807,934 +4180,HH-697,Haven Heights,Residential,Micro,Lowrise,Far,Far,5,4,1763,23,28,775,816 +4180,HH-698,Haven Heights,Residential,Micro,Lowrise,Far,Far,5,4,1796,21,26,745,846 +4180,HH-699,Haven Heights,Residential,Micro,Lowrise,Far,Far,4,3,1799,18,22,716,877 +4180,HH-722,Haven Heights,Residential,Micro,Lowrise,Far,Far,5,4,1905,23,28,724,875 +4180,HH-727,Haven Heights,Residential,Micro,Lowrise,Far,Far,5,4,1638,22,27,726,879 +4180,HH-736,Haven Heights,Residential,Micro,Lowrise,Far,Far,4,3,1371,16,20,728,882 +4180,HH-747,Haven Heights,Residential,Micro,Lowrise,Far,Far,8,7,2215,36,44,846,764 +4180,HH-748,Haven Heights,Residential,Micro,Lowrise,Far,Far,4,3,1785,17,21,775,803 +4180,HH-764,Haven Heights,Residential,Micro,Lowrise,Far,Far,5,4,2284,21,26,835,716 +4180,HH-769,Haven Heights,Residential,Micro,Lowrise,Far,Far,4,3,1871,16,20,849,685 +4247,NS-265,North Star,Residential,Nano,Lowrise,Far,Far,2,2,1054,10,12,711,606 +4247,NS-266,North Star,Residential,Nano,Lowrise,Far,Far,2,2,1091,10,12,692,616 +4247,NS-267,North Star,Residential,Nano,Lowrise,Far,Far,2,2,1091,10,12,673,627 +4247,NS-268,North Star,Residential,Nano,Lowrise,Far,Far,2,2,1091,10,12,654,638 +4247,NS-269,North Star,Residential,Nano,Lowrise,Far,Far,3,2,1091,12,15,634,650 +4247,NS-270,North Star,Residential,Nano,Lowrise,Far,Far,6,5,977,27,33,616,661 +4247,NS-313,North Star,Residential,Nano,Lowrise,Far,Far,4,3,872,16,20,774,627 +4247,NS-315,North Star,Residential,Nano,Lowrise,Far,Far,4,3,1086,16,20,691,666 +4247,NS-316,North Star,Residential,Nano,Lowrise,Far,Far,8,7,1082,35,43,672,676 +4247,NS-317,North Star,Residential,Nano,Lowrise,Far,Far,5,4,1079,21,26,653,686 +4247,NS-318,North Star,Residential,Nano,Lowrise,Far,Far,4,3,1075,19,23,634,697 +4247,NS-319,North Star,Residential,Nano,Lowrise,Far,Far,3,3,960,15,18,615,708 +4247,NS-325,North Star,Residential,Nano,Lowrise,Far,Far,7,5,810,29,36,774,645 +4247,NS-422,North Star,Residential,Nano,Lowrise,Far,Far,4,3,916,19,23,1233,624 +4247,NS-424,North Star,Residential,Nano,Lowrise,Far,Far,7,5,816,28,35,1069,709 +4247,NS-438,North Star,Residential,Nano,Lowrise,Far,Far,5,4,1023,22,27,1233,641 +4247,NS-440,North Star,Residential,Nano,Lowrise,Far,Far,6,5,986,25,31,1072,721 +4247,NS-459,North Star,Residential,Nano,Lowrise,Far,Far,7,5,1094,29,36,1386,614 +4247,NS-463,North Star,Residential,Nano,Lowrise,Far,Far,7,6,1066,30,37,1071,738 +4247,NS-468,North Star,Residential,Nano,Lowrise,Far,Far,6,5,1095,27,33,1387,629 +4247,NS-470,North Star,Residential,Nano,Lowrise,Far,Far,5,4,1025,23,28,1234,676 +4247,NS-472,North Star,Residential,Nano,Lowrise,Far,Far,7,6,1146,32,39,1069,755 +4247,NS-482,North Star,Residential,Nano,Lowrise,Far,Far,4,3,1096,19,23,1388,631 +4247,NS-483,North Star,Residential,Nano,Lowrise,Far,Far,7,5,1021,29,36,1298,673 +4247,NS-484,North Star,Residential,Nano,Lowrise,Far,Far,6,5,1026,28,34,1235,694 +4247,NS-487,North Star,Residential,Nano,Lowrise,Far,Far,4,3,1035,19,23,766,916 +4247,NS-509,North Star,Residential,Nano,Lowrise,Far,Far,4,3,972,16,20,1299,690 +4247,NS-510,North Star,Residential,Nano,Lowrise,Far,Far,5,4,946,22,27,1236,711 +4247,NS-521,North Star,Residential,Nano,Lowrise,Far,Far,4,3,978,18,22,1031,867 +4247,NS-577,North Star,Residential,Nano,Lowrise,Far,Far,8,7,1010,35,43,718,1142 +4247,NS-604,North Star,Residential,Nano,Lowrise,Far,Far,5,4,830,22,27,1366,730 +4247,NS-611,North Star,Residential,Nano,Lowrise,Far,Far,4,3,834,16,20,644,1243 +4247,NS-621,North Star,Residential,Nano,Lowrise,Far,Far,10,8,461,41,51,637,1264 +4247,NS-628,North Star,Residential,Nano,Lowrise,Far,Far,4,3,1015,18,22,1295,836 +4247,NS-653,North Star,Residential,Nano,Lowrise,Far,Far,5,4,612,24,29,1256,897 +4247,NS-654,North Star,Residential,Nano,Lowrise,Far,Far,4,3,1016,18,22,1233,925 +4247,NS-671,North Star,Residential,Nano,Lowrise,Far,Far,5,4,693,22,27,1093,953 +4247,NS-730,North Star,Residential,Nano,Lowrise,Far,Far,4,3,1056,16,20,1954,621 +4247,NS-731,North Star,Residential,Nano,Lowrise,Far,Far,4,3,1091,16,20,1934,640 +4247,NS-753,North Star,Residential,Nano,Lowrise,Far,Far,4,3,1030,17,21,1957,615 +4247,NS-756,North Star,Residential,Nano,Lowrise,Far,Far,4,3,1065,17,21,1898,629 +4247,NS-757,North Star,Residential,Nano,Lowrise,Far,Far,5,4,1065,21,26,1878,616 +4247,NS-772,North Star,Residential,Nano,Lowrise,Far,Far,4,4,916,20,24,893,692 +4247,NS-777,North Star,Residential,Nano,Lowrise,Far,Far,4,3,1021,17,21,893,680 +4247,NS-778,North Star,Residential,Nano,Lowrise,Far,Far,4,3,1023,18,22,830,728 +4247,NS-789,North Star,Residential,Nano,Lowrise,Far,Far,8,7,1021,36,44,894,667 +4247,NS-790,North Star,Residential,Nano,Lowrise,Far,Far,4,3,1024,18,22,831,716 +4247,NS-796,North Star,Residential,Nano,Lowrise,Far,Far,6,5,1021,27,33,895,655 +4247,NS-797,North Star,Residential,Nano,Lowrise,Far,Far,4,4,1025,20,24,833,704 +4247,NS-805,North Star,Residential,Nano,Lowrise,Far,Far,4,3,1021,19,23,897,643 +4247,NS-806,North Star,Residential,Nano,Lowrise,Far,Far,4,3,1026,16,20,834,687 +4247,NS-813,North Star,Residential,Nano,Lowrise,Far,Far,5,4,972,22,27,899,632 +4247,NS-814,North Star,Residential,Nano,Lowrise,Far,Far,4,3,945,16,20,837,672 +4300,HH-122,Haven Heights,Residential,Nano,Lowrise,Far,Far,4,3,1198,16,20,816,613 +4300,HH-124,Haven Heights,Residential,Nano,Lowrise,Far,Far,6,5,1101,27,33,817,626 +4300,HH-138,Haven Heights,Residential,Nano,Lowrise,Far,Far,4,3,879,16,20,818,651 +4300,HH-152,Haven Heights,Residential,Nano,Lowrise,Far,Far,4,3,1024,16,20,980,612 +4300,HH-154,Haven Heights,Residential,Nano,Lowrise,Far,Far,4,3,966,17,21,882,662 +4300,HH-155,Haven Heights,Residential,Nano,Lowrise,Far,Far,7,6,963,32,39,863,672 +4300,HH-156,Haven Heights,Residential,Nano,Lowrise,Far,Far,4,3,960,16,20,844,684 +4300,HH-158,Haven Heights,Residential,Nano,Lowrise,Far,Far,4,3,463,16,20,811,704 +4300,HH-162,Haven Heights,Residential,Nano,Lowrise,Far,Far,4,3,1049,16,20,1034,601 +4300,HH-163,Haven Heights,Residential,Nano,Lowrise,Far,Far,4,3,1024,16,20,978,628 +4300,HH-166,Haven Heights,Residential,Nano,Lowrise,Far,Far,4,3,1049,17,21,1033,618 +4300,HH-167,Haven Heights,Residential,Nano,Lowrise,Far,Far,4,3,1024,16,20,977,645 +4300,HH-178,Haven Heights,Residential,Nano,Lowrise,Far,Far,4,4,984,20,24,1120,603 +4300,HH-179,Haven Heights,Residential,Nano,Lowrise,Far,Far,6,5,1049,28,34,1032,636 +4300,HH-181,Haven Heights,Residential,Nano,Lowrise,Far,Far,4,4,846,20,24,896,703 +4300,HH-182,Haven Heights,Residential,Nano,Lowrise,Far,Far,5,4,946,22,27,878,712 +4300,HH-184,Haven Heights,Residential,Nano,Lowrise,Far,Far,11,9,946,47,58,840,732 +4300,HH-187,Haven Heights,Residential,Nano,Lowrise,Far,Far,6,4,951,24,30,1183,602 +4300,HH-188,Haven Heights,Residential,Nano,Lowrise,Far,Far,6,4,882,24,30,1120,621 +4300,HH-189,Haven Heights,Residential,Nano,Lowrise,Far,Far,4,3,938,16,20,1032,652 +4300,HH-193,Haven Heights,Residential,Nano,Lowrise,Far,Far,4,3,878,16,20,1121,679 +4300,HH-204,Haven Heights,Residential,Nano,Lowrise,Far,Far,4,3,981,16,20,1122,696 +4300,HH-217,Haven Heights,Residential,Nano,Lowrise,Far,Far,4,3,954,16,20,1183,698 +4300,HH-218,Haven Heights,Residential,Nano,Lowrise,Far,Far,4,3,982,18,22,1123,715 +4300,HH-224,Haven Heights,Residential,Nano,Lowrise,Far,Far,7,6,954,30,37,1184,717 +4300,HH-225,Haven Heights,Residential,Nano,Lowrise,Far,Far,6,5,983,27,33,1125,733 +4300,HH-234,Haven Heights,Residential,Nano,Lowrise,Far,Far,4,4,852,20,24,1404,603 +4300,HH-240,Haven Heights,Residential,Nano,Lowrise,Far,Far,5,4,954,20,25,1186,735 +4300,HH-241,Haven Heights,Residential,Nano,Lowrise,Far,Far,4,3,984,19,23,1127,751 +4300,HH-259,Haven Heights,Residential,Nano,Lowrise,Far,Far,4,3,1014,18,22,1133,818 +4300,HH-273,Haven Heights,Residential,Nano,Lowrise,Far,Far,4,3,1024,16,20,1185,819 +4300,HH-274,Haven Heights,Residential,Nano,Lowrise,Far,Far,4,3,1051,16,20,1131,836 +4300,HH-281,Haven Heights,Residential,Nano,Lowrise,Far,Far,4,3,1024,16,20,1181,832 +4300,HH-282,Haven Heights,Residential,Nano,Lowrise,Far,Far,4,3,1052,16,20,1126,854 +4300,HH-286,Haven Heights,Residential,Nano,Lowrise,Far,Far,5,4,1053,21,26,1123,873 +4300,HH-308,Haven Heights,Residential,Nano,Lowrise,Far,Far,4,3,1024,18,22,1173,859 +4300,HH-309,Haven Heights,Residential,Nano,Lowrise,Far,Far,4,3,1054,17,21,1118,891 +4300,HH-320,Haven Heights,Residential,Nano,Lowrise,Far,Far,4,3,944,16,20,1114,909 +4300,HH-330,Haven Heights,Residential,Nano,Lowrise,Far,Far,7,6,455,31,38,1324,697 +4300,HH-332,Haven Heights,Residential,Nano,Lowrise,Far,Far,4,3,956,19,23,1013,993 +4300,HH-333,Haven Heights,Residential,Nano,Lowrise,Far,Far,4,3,872,16,20,959,1011 +4300,HH-344,Haven Heights,Residential,Nano,Lowrise,Far,Far,7,6,668,32,39,1312,706 +4300,HH-346,Haven Heights,Residential,Nano,Lowrise,Far,Far,4,3,922,17,21,1241,812 +4300,HH-347,Haven Heights,Residential,Nano,Lowrise,Far,Far,4,4,955,20,24,1232,827 +4300,HH-348,Haven Heights,Residential,Nano,Lowrise,Far,Far,7,6,955,30,37,1215,858 +4300,HH-349,Haven Heights,Residential,Nano,Lowrise,Far,Far,4,3,954,16,20,1207,872 +4300,HH-350,Haven Heights,Residential,Nano,Lowrise,Far,Far,4,3,855,17,21,1199,883 +4300,HH-351,Haven Heights,Residential,Nano,Lowrise,Far,Far,4,3,917,18,22,1168,921 +4300,HH-352,Haven Heights,Residential,Nano,Lowrise,Far,Far,4,3,1024,16,20,1135,945 +4300,HH-354,Haven Heights,Residential,Nano,Lowrise,Far,Far,4,3,1024,17,21,1097,970 +4300,HH-355,Haven Heights,Residential,Nano,Lowrise,Far,Far,4,3,995,17,21,1078,983 +4300,HH-357,Haven Heights,Residential,Nano,Lowrise,Far,Far,5,4,837,20,25,958,1027 +4300,HH-359,Haven Heights,Residential,Nano,Lowrise,Far,Far,4,3,1083,16,20,676,1151 +4300,HH-360,Haven Heights,Residential,Nano,Lowrise,Far,Far,4,3,1083,16,20,656,1162 +4300,HH-361,Haven Heights,Residential,Nano,Lowrise,Far,Far,4,4,1058,20,24,637,1172 +4300,HH-371,Haven Heights,Residential,Nano,Lowrise,Far,Far,4,3,836,16,20,1298,716 +4300,HH-373,Haven Heights,Residential,Nano,Lowrise,Far,Far,4,3,692,16,20,958,1044 +4300,HH-380,Haven Heights,Residential,Nano,Lowrise,Far,Far,6,5,1067,26,32,1001,1047 +4300,HH-381,Haven Heights,Residential,Nano,Lowrise,Far,Far,4,3,548,16,20,959,1061 +4300,HH-392,Haven Heights,Residential,Nano,Lowrise,Far,Far,4,3,1173,16,20,1272,737 +4300,HH-394,Haven Heights,Residential,Nano,Lowrise,Far,Far,4,4,944,20,24,1189,849 +4300,HH-395,Haven Heights,Residential,Nano,Lowrise,Far,Far,6,4,974,24,30,1180,864 +4300,HH-396,Haven Heights,Residential,Nano,Lowrise,Far,Far,4,3,967,16,20,1162,894 +4300,HH-397,Haven Heights,Residential,Nano,Lowrise,Far,Far,5,4,963,23,28,1153,909 +4300,HH-398,Haven Heights,Residential,Nano,Lowrise,Far,Far,4,3,860,16,20,1145,923 +4300,HH-399,Haven Heights,Residential,Nano,Lowrise,Far,Far,4,4,937,20,24,1121,966 +4300,HH-400,Haven Heights,Residential,Nano,Lowrise,Far,Far,4,3,1040,17,21,1101,988 +4300,HH-402,Haven Heights,Residential,Nano,Lowrise,Far,Far,5,4,1033,22,27,1077,1012 +4300,HH-405,Haven Heights,Residential,Nano,Lowrise,Far,Far,5,4,1095,23,28,663,1200 +4300,HH-406,Haven Heights,Residential,Nano,Lowrise,Far,Far,4,3,1071,16,20,624,1220 +4300,HH-422,Haven Heights,Residential,Nano,Lowrise,Far,Far,5,4,817,23,28,710,1232 +4300,HH-436,Haven Heights,Residential,Nano,Lowrise,Far,Far,4,3,1013,16,20,1113,907 +4300,HH-437,Haven Heights,Residential,Nano,Lowrise,Far,Far,6,5,1049,28,34,1103,921 +4300,HH-438,Haven Heights,Residential,Nano,Lowrise,Far,Far,4,3,1049,16,20,1094,935 +4300,HH-439,Haven Heights,Residential,Nano,Lowrise,Far,Far,8,7,1049,36,44,1075,964 +4300,HH-440,Haven Heights,Residential,Nano,Lowrise,Far,Far,4,3,939,16,20,1066,978 +4300,HH-451,Haven Heights,Residential,Nano,Lowrise,Far,Far,4,3,1135,16,20,708,1262 +4300,HH-477,Haven Heights,Residential,Nano,Lowrise,Far,Far,4,3,990,18,22,1066,947 +4300,HH-478,Haven Heights,Residential,Nano,Lowrise,Far,Far,4,3,1024,16,20,1056,960 +4300,HH-479,Haven Heights,Residential,Nano,Lowrise,Far,Far,4,3,1024,16,20,1046,974 +4300,HH-480,Haven Heights,Residential,Nano,Lowrise,Far,Far,4,3,1024,19,23,1026,1001 +4300,HH-483,Haven Heights,Residential,Nano,Lowrise,Far,Far,5,4,1140,23,28,934,1156 +4300,HH-492,Haven Heights,Residential,Nano,Lowrise,Far,Far,4,3,885,16,20,922,1165 +4300,HH-505,Haven Heights,Residential,Nano,Lowrise,Far,Far,4,3,917,17,21,1078,784 +4300,HH-506,Haven Heights,Residential,Nano,Lowrise,Far,Far,4,3,1024,16,20,1066,801 +4300,HH-507,Haven Heights,Residential,Nano,Lowrise,Far,Far,4,3,1024,18,22,1053,820 +4300,HH-509,Haven Heights,Residential,Nano,Lowrise,Far,Far,4,3,1031,16,20,984,926 +4300,HH-511,Haven Heights,Residential,Nano,Lowrise,Far,Far,4,3,1066,16,20,939,1004 +4300,HH-512,Haven Heights,Residential,Nano,Lowrise,Far,Far,4,3,1037,16,20,928,1023 +4300,HH-516,Haven Heights,Residential,Nano,Lowrise,Far,Far,4,3,1140,18,22,872,1142 +4300,HH-538,Haven Heights,Residential,Nano,Lowrise,Far,Far,4,3,1044,17,21,1025,789 +4300,HH-539,Haven Heights,Residential,Nano,Lowrise,Far,Far,4,3,1037,16,20,999,827 +4300,HH-540,Haven Heights,Residential,Nano,Lowrise,Far,Far,4,3,1033,16,20,986,846 +4300,HH-541,Haven Heights,Residential,Nano,Lowrise,Far,Far,4,3,1086,16,20,928,935 +4300,HH-542,Haven Heights,Residential,Nano,Lowrise,Far,Far,4,3,1082,17,21,916,955 +4300,HH-543,Haven Heights,Residential,Nano,Lowrise,Far,Far,4,3,1078,16,20,904,974 +4300,HH-544,Haven Heights,Residential,Nano,Lowrise,Far,Far,4,3,1075,18,22,893,994 +4300,HH-545,Haven Heights,Residential,Nano,Lowrise,Far,Far,4,3,1052,16,20,882,1013 +4300,HH-546,Haven Heights,Residential,Nano,Lowrise,Far,Far,6,5,1170,28,34,829,1111 +4300,HH-555,Haven Heights,Residential,Nano,Lowrise,Far,Far,4,3,1031,18,22,974,781 +4300,HH-556,Haven Heights,Residential,Nano,Lowrise,Far,Far,4,3,1056,17,21,934,837 +4300,HH-567,Haven Heights,Residential,Nano,Lowrise,Far,Far,4,3,1093,18,22,920,835 +4300,HH-570,Haven Heights,Residential,Nano,Lowrise,Far,Far,5,4,767,20,25,635,1358 +4300,HH-578,Haven Heights,Residential,Nano,Lowrise,Far,Far,6,5,975,26,32,623,1352 +4300,HH-583,Haven Heights,Residential,Nano,Lowrise,Far,Far,4,3,1183,18,22,611,1346 +4300,HH-592,Haven Heights,Residential,Nano,Lowrise,Far,Far,7,5,1065,28,35,921,777 +4300,HH-597,Haven Heights,Residential,Nano,Lowrise,Far,Far,5,4,1015,22,27,866,834 +4300,HH-599,Haven Heights,Residential,Nano,Lowrise,Far,Far,4,3,1015,16,20,909,778 +4300,HH-604,Haven Heights,Residential,Nano,Lowrise,Far,Far,4,3,946,16,20,1006,624 +4300,HH-605,Haven Heights,Residential,Nano,Lowrise,Far,Far,11,9,922,46,57,956,684 +4300,HH-611,Haven Heights,Residential,Nano,Lowrise,Far,Far,4,3,979,16,20,997,627 +4300,HH-612,Haven Heights,Residential,Nano,Lowrise,Far,Far,4,3,954,17,21,946,686 +4300,HH-613,Haven Heights,Residential,Nano,Lowrise,Far,Far,4,3,876,18,22,881,764 +4300,HH-614,Haven Heights,Residential,Nano,Lowrise,Far,Far,4,3,979,16,20,851,801 +4300,HH-615,Haven Heights,Residential,Nano,Lowrise,Far,Far,7,6,979,30,37,836,820 +4300,HH-616,Haven Heights,Residential,Nano,Lowrise,Far,Far,4,3,979,16,20,821,839 +4300,HH-617,Haven Heights,Residential,Nano,Lowrise,Far,Far,4,3,1169,19,23,765,911 +4300,HH-619,Haven Heights,Residential,Nano,Lowrise,Far,Far,4,3,1195,17,21,717,976 +4300,HH-626,Haven Heights,Residential,Nano,Lowrise,Far,Far,4,3,954,16,20,926,692 +4300,HH-636,Haven Heights,Residential,Nano,Lowrise,Far,Far,4,4,979,20,24,968,637 +4300,HH-637,Haven Heights,Residential,Nano,Lowrise,Far,Far,4,3,954,16,20,916,695 +4300,HH-638,Haven Heights,Residential,Nano,Lowrise,Far,Far,5,4,854,24,29,848,773 +4300,HH-640,Haven Heights,Residential,Nano,Lowrise,Far,Far,4,3,954,16,20,801,829 +4300,HH-641,Haven Heights,Residential,Nano,Lowrise,Far,Far,5,4,937,21,26,770,866 +4300,HH-642,Haven Heights,Residential,Nano,Lowrise,Far,Far,4,3,1179,16,20,712,940 +4300,HH-643,Haven Heights,Residential,Nano,Lowrise,Far,Far,4,3,1174,16,20,691,964 +4300,HH-650,Haven Heights,Residential,Nano,Lowrise,Far,Far,4,3,876,16,20,960,641 +4300,HH-666,Haven Heights,Residential,Nano,Lowrise,Far,Far,4,3,993,19,23,924,667 +4300,HH-667,Haven Heights,Residential,Nano,Lowrise,Far,Far,4,3,993,16,20,906,685 +4300,HH-668,Haven Heights,Residential,Nano,Lowrise,Far,Far,6,5,993,27,33,870,723 +4300,HH-693,Haven Heights,Residential,Nano,Lowrise,Far,Far,4,3,1033,16,20,989,608 +4300,HH-694,Haven Heights,Residential,Nano,Lowrise,Far,Far,4,3,1011,16,20,971,625 +4300,HH-695,Haven Heights,Residential,Nano,Lowrise,Far,Far,4,3,1002,16,20,847,744 +4300,HH-696,Haven Heights,Residential,Nano,Lowrise,Far,Far,4,3,981,16,20,828,762 +4300,HH-701,Haven Heights,Residential,Nano,Lowrise,Far,Far,5,4,1197,21,26,661,935 +4300,HH-704,Haven Heights,Residential,Nano,Lowrise,Far,Far,5,4,1013,21,26,903,690 +4300,HH-732,Haven Heights,Residential,Nano,Lowrise,Far,Far,4,3,1012,19,23,992,661 +4300,HH-733,Haven Heights,Residential,Nano,Lowrise,Far,Far,4,3,1009,18,22,973,675 +4300,HH-734,Haven Heights,Residential,Nano,Lowrise,Far,Far,4,3,1005,16,20,954,690 +4300,HH-735,Haven Heights,Residential,Nano,Lowrise,Far,Far,4,3,984,16,20,935,705 +4300,HH-741,Haven Heights,Residential,Nano,Lowrise,Far,Far,5,4,1081,21,26,731,880 +4300,HH-753,Haven Heights,Residential,Nano,Lowrise,Far,Far,4,3,990,16,20,1175,602 +4300,HH-754,Haven Heights,Residential,Nano,Lowrise,Far,Far,4,3,1024,16,20,1137,624 +4300,HH-755,Haven Heights,Residential,Nano,Lowrise,Far,Far,4,3,1024,17,21,1099,647 +4300,HH-762,Haven Heights,Residential,Nano,Lowrise,Far,Far,4,3,922,16,20,1080,602 \ No newline at end of file diff --git a/packages/plugin-unreal/unreal/design/database/description structure.txt b/packages/plugin-unreal/unreal/design/database/description structure.txt new file mode 100644 index 00000000..10baee6f --- /dev/null +++ b/packages/plugin-unreal/unreal/design/database/description structure.txt @@ -0,0 +1,44 @@ +Current: +"[ID] is a [Size] [Zoning] plot in [Neighborhood]. It is a [Building Type] building with [X] to [Y] floors. The plot area is [Z]m² with building heights from [A]m to [B]m. Located [Distance] from ocean ([C]m) and [Distance] from bay ([D]m)." + +Proposed: +"[ID] is a [Size] [Zoning] plot in [Neighborhood]. It is a [Building Type] building. Located [Distance] from ocean and [Distance] from bay." + +With enhanced metadata: +{ + "searchText": string, + "metadata": { + "id": string, + "neighborhood": string[], + "zoningTypes": string[], + "plotSizes": string[], + "buildingTypes": string[], + "distances": { + "ocean": { + "meters": number, + "category": "Close" | "Medium" | "Far" + }, + "bay": { + "meters": number, + "category": "Close" | "Medium" | "Far" + } + }, + "building": { + "floorRange": { + "min": number, + "max": number + }, + "heightRange": { + "min": number, + "max": number + } + }, + "plot": { + "area": number + }, + "rarity": { + "rank": number, + "category": "Ultra Premium" | "Premium" | "Standard" | "Value" | "Entry Level" + } + } +} \ No newline at end of file diff --git a/packages/plugin-unreal/unreal/design/database/sample land records.md b/packages/plugin-unreal/unreal/design/database/sample land records.md new file mode 100644 index 00000000..169a65e3 --- /dev/null +++ b/packages/plugin-unreal/unreal/design/database/sample land records.md @@ -0,0 +1,15 @@ + +2. ``` +FL-133 is a Mammoth Mixed Use plot in Flashing Lights. It is a Lowrise building with 16 to 19 floors. The plot area is 7393m² with building heights from 80m to 99m. Located Far from ocean (2709m) and Medium from bay (361m). + +4. ``` +NS-799 is a Mid Legendary plot in North Star. It is a Tall building with 62 to 77 floors. The plot area is 4182m² with building heights from 311m to 388m. Located Far from ocean (2318m) and Close from bay (256m). + +6. ``` +TG-17 is a Giga Industrial plot in Tranquility Gardens. It is a Lowrise building with 7 to 9 floors. The plot area is 13483m² with building heights from 36m to 45m. Located Far from ocean (3734m) and Close from bay (139m). + +8. ``` +NS-937 is a Mega Industrial plot in North Star. It is a Lowrise building with 11 to 14 floors. The plot area is 6036m² with building heights from 58m to 72m. Located Medium from ocean (541m) and Far from bay (708m). + +10. ``` +SM-504 is a Mammoth Mixed Use plot in Space Mind. It is a Highrise building with 36 to 46 floors. The plot area is 7624m² with building heights from 184m to 230m. Located Far from ocean (1649m) and Close from bay (232m). diff --git a/packages/plugin-unreal/unreal/design/gaio/doc example.md b/packages/plugin-unreal/unreal/design/gaio/doc example.md new file mode 100644 index 00000000..2a3e38e2 --- /dev/null +++ b/packages/plugin-unreal/unreal/design/gaio/doc example.md @@ -0,0 +1,96 @@ +# File Overview + +## `src/index.ts` + +The `index.ts` file serves as the entry point for the application. It establishes a WebSocket connection to listen for events on the Solana blockchain, specifically for new liquidity pools. The main functionalities include: + +- **WebSocket Connection**: It creates a WebSocket connection to the Helius API and subscribes to logs related to the liquidity pool program. +- **Message Handling**: It processes incoming messages from the WebSocket, checking for specific logs that indicate a new liquidity pool has been created. +- **Transaction Handling**: Upon detecting a new liquidity pool, it fetches transaction details, performs a rug check on the token, and initiates a swap transaction if the checks pass. +- **Error Handling**: It includes error handling for JSON parsing and WebSocket errors, ensuring the application can recover from issues gracefully. + +## `src/transactions.ts` + +The `transactions.ts` file contains functions that handle various transaction-related operations, primarily interacting with the Helius and Jupiter APIs. Key functionalities include: + +- **Fetching Transaction Details**: The `fetchTransactionDetails` function retrieves transaction details from the Helius API using a transaction signature. It processes the response to extract relevant token mint information. +- **Creating Swap Transactions**: The `createSwapTransaction` function generates a swap transaction using the Jupiter API, allowing users to swap SOL for a specified token. It handles retries for specific errors and serializes the transaction for submission. +- **Rug Check**: The `getRugCheckConfirmed` function checks if a token is a potential rug pull by querying the RugCheck API and evaluating various risk factors. +- **Saving Swap Details**: The `fetchAndSaveSwapDetails` function fetches additional details about a swap transaction and saves the relevant information to a database. +- **Creating Sell Transactions**: The `createSellTransaction` function allows users to sell a specified token for SOL, following a similar process to the swap transaction creation. + +## `src/types.ts` + +The `types.ts` file defines TypeScript interfaces and types used throughout the application to ensure type safety and clarity. Key components include: + +- **DisplayDataItem**: Represents the structure of data related to token mints. +- **QuoteResponse**: Defines the expected structure of the response from the Jupiter API when requesting a swap quote. +- **SerializedQuoteResponse**: Represents the structure of a serialized swap transaction response. +- **RugResponse**: Defines the structure of the response from the RugCheck API, detailing risks associated with a token. +- **TransactionDetailsResponse**: Describes the structure of transaction details returned from the Helius API, including information about fees, instructions, and events. +- **SwapEventDetailsResponse**: Represents the details of a swap event, including program information and token inputs/outputs. +- **HoldingRecord**: Defines the structure for holding records in the database, capturing details about token transactions. + +These interfaces and types help maintain consistency and reduce errors when working with data throughout the application. + + +## `src/tracker/index.ts` + +The `index.ts` file is responsible for tracking the holdings of a cryptocurrency wallet, specifically focusing on the performance of tokens held in the wallet. It periodically checks the current prices of these tokens, calculates unrealized profit and loss (PnL), and automatically sells tokens based on predefined take profit and stop loss percentages. + +## Key Functionalities + +1. **Environment Configuration**: + - Loads environment variables from a `.env` file using the `dotenv` package to access configuration parameters. + +2. **Database Connection**: + - Connects to a SQLite database to manage and store token holdings. + - Creates a table for holdings if it does not already exist. + +3. **Price Fetching**: + - Retrieves the current prices of tokens from the Jupiter API. + - Handles multiple tokens by constructing a query string from the token IDs stored in the database. + +4. **PnL Calculation**: + - For each token held, calculates the unrealized PnL in both USD and percentage terms. + - Displays a visual indicator (green or red) based on whether the PnL is positive or negative. + +5. **Automatic Selling**: + - Checks if the unrealized PnL exceeds the configured take profit percentage or falls below the stop loss percentage. + - If conditions are met, it triggers a sell transaction using the `createSellTransaction` function from the `transactions.ts` file. + +6. **Logging**: + - Logs the current status of each holding, including the amount held, the price paid, and the current unrealized PnL. + - Outputs the logs to the console for easy monitoring. + +7. **Periodic Execution**: + - The `main` function is set to run every 5 seconds, allowing for continuous tracking of holdings and price updates. + +## Usage Instructions + +1. **Setup Environment**: + - Ensure that the `.env` file is properly configured with the necessary API keys and database names. + +2. **Database Initialization**: + - The script will automatically create the necessary database and table for holdings if they do not exist. + +3. **Run the Tracker**: + - Execute the script using Node.js: + ```bash + node src/tracker/index.ts + ``` + +4. **Monitor Output**: + - The console will display the current status of your token holdings, including any actions taken (e.g., selling tokens). + +5. **Adjust Configuration**: + - Modify the `config` file to set your desired take profit and stop loss percentages, as well as any other parameters relevant to your trading strategy. + +6. **Stop the Tracker**: + - To stop the tracker, simply terminate the Node.js process (e.g., by pressing `Ctrl + C` in the terminal). + +## Important Notes + +- Ensure that the `createSellTransaction` function in `transactions.ts` is correctly implemented to handle sell transactions. +- The script assumes that the tokens are already present in the database. Ensure that the database is populated with holdings before running the tracker. +- The script will continuously run and check for updates every 5 seconds. Adjust the timing as necessary based on your requirements. diff --git a/packages/plugin-unreal/unreal/design/gaio/doc example.pdf b/packages/plugin-unreal/unreal/design/gaio/doc example.pdf new file mode 100644 index 00000000..f646310c Binary files /dev/null and b/packages/plugin-unreal/unreal/design/gaio/doc example.pdf differ diff --git a/packages/plugin-unreal/unreal/design/high level design/land_memory_system_design.md b/packages/plugin-unreal/unreal/design/high level design/land_memory_system_design.md new file mode 100644 index 00000000..146e9fac --- /dev/null +++ b/packages/plugin-unreal/unreal/design/high level design/land_memory_system_design.md @@ -0,0 +1,150 @@ +# Land Memory System Design + +## Overview +The Land Memory System is a specialized implementation of the Eliza Memory System designed to handle futuristic real estate data. It combines vector-based semantic search capabilities with structured metadata to enable natural language queries for property information. + +## Core Components + +### 1. Data Structure +#### Property Metadata +- **Categorical Data** + - Plot Sizes (Nano to Giga) + - Zoning Types (Residential to Legendary) + - Building Types (Lowrise to Megatall) + - Distance Categories (Close/Medium/Far) + +#### Memory Structure +- Extends base Memory interface +- Combines natural language description with structured metadata +- Includes spatial and numerical data (coordinates, distances, dimensions) + +### 2. Type System +```typescript +LandPlotMemory extends Memory { + content: { + text: string; // Natural language description + metadata: LandPlotMetadata; // Structured data + } +} +``` + +### 3. Key Features +1. **Semantic Search** + - Vector embeddings for natural language queries + - OpenAI's text-embedding-3-small model + - Configurable similarity thresholds + +2. **Dual Storage** + - Text descriptions for semantic search + - Structured metadata for precise filtering + - Combined query capabilities + +3. **Distance Management** + - Ocean and bay proximity tracking + - Automatic distance categorization + - Spatial coordinate system + +4. **Property Classification** + - Rarity ranking system (1-3000+) + - Building type classification + - Plot size categorization + +## Query System + +### Query Types +1. **Natural Language Queries** + ```typescript + "find me a luxury apartment with ocean views in North Star" + ``` + +2. **Metadata Filters** + ```typescript + { + neighborhood: ["North Star"], + zoningTypes: ["Residential"], + maxDistance: { ocean: 300 } + } + ``` + +3. **Combined Queries** + - Text similarity + metadata filtering + - Ranking-based sorting + - Distance-based filtering + +## Implementation Details + +### 1. Memory Management +- Uses PostgreSQL for persistent storage +- Vector similarity search capabilities +- Caching system for embeddings + +### 2. Helper Functions +```typescript +generateDescription(): string +createLandPlotMemory(): LandPlotMemory +categorizeDistance(): DistanceCategory +categorizeRarity(): string +``` + +### 3. Integration Points +- Eliza Memory System +- OpenAI Embeddings API +- PostgreSQL Database +- Agent Runtime System + +## Usage Patterns + +### 1. Property Creation +```typescript +const plotMemory = createLandPlotMemory( + id, + metadata, + agentId, + roomId +); +await memoryManager.createMemory(plotMemory); +``` + +### 2. Property Search +```typescript +const results = await memoryManager.searchMemoriesByEmbedding( + queryEmbedding, + { match_threshold: 0.1 } +); +``` + +### 3. Property Updates +- Atomic metadata updates +- Description regeneration +- Embedding recalculation + +## Performance Considerations + +### 1. Optimization Strategies +- Embedding caching +- Batch processing for bulk operations +- Indexed metadata fields + +### 2. Scaling Considerations +- Horizontal scaling of database +- Embedding model distribution +- Query optimization + +## Future Enhancements +1. Multi-modal search capabilities +2. Real-time property updates +3. Advanced spatial queries +4. Market dynamics integration +5. Historical data tracking + +## Security Considerations +1. Access control per property +2. Metadata validation +3. Query rate limiting +4. Secure embedding storage + +## Dependencies +- @ai16z/eliza +- @ai16z/adapter-postgres +- OpenAI API +- PostgreSQL diff --git a/packages/plugin-unreal/unreal/design/high level design/land_memory_system_design.pdf b/packages/plugin-unreal/unreal/design/high level design/land_memory_system_design.pdf new file mode 100644 index 00000000..d1f4add6 Binary files /dev/null and b/packages/plugin-unreal/unreal/design/high level design/land_memory_system_design.pdf differ diff --git a/packages/plugin-unreal/unreal/design/high level design/ua_design b/packages/plugin-unreal/unreal/design/high level design/ua_design new file mode 100644 index 00000000..40ba69e8 --- /dev/null +++ b/packages/plugin-unreal/unreal/design/high level design/ua_design @@ -0,0 +1,68 @@ +i want build a system for this: +1 convert this data into records that can be inserted into a database with embeddings +2 build a system prompt that can be used in an api, which then converts user queries into a search record that is combatible with the records from step 1 + + +I'll help you build this system. Let's break it down into steps: + +First, let's define the record structure that will include embeddings: + +class LandRecord: + id: str # Unique identifier (Name field) + rank: int + neighborhood: str + zoning_type: str + plot_size: str + building_size: str + ocean_proximity: str + bay_proximity: str + floor_range: tuple[int, int] + plot_area: float + building_height_range: tuple[float, float] + distances: tuple[float, float] # (ocean, bay) + embedding: list[float] # Vector embedding of combined features + +For embeddings, we should consider: +Text fields should be embedded using a text embedding model (like OpenAI's text-embedding-ada-002) +Numerical fields should be normalized +Categorical fields should be one-hot encoded +Distance metrics should be scaled +For the system prompt to handle queries, here's a proposed structure: + +----------------------------- + +You are a real estate search assistant for a futuristic city. Your role is to convert natural language queries into structured search parameters. + +INPUT FORMAT: +Users will provide natural language queries about properties they're looking for. + +OUTPUT FORMAT: +You must return a JSON object with these fields: +{ + "search_params": { + "neighborhood": string | null, + "zoning_type": string | null, + "plot_size_range": [min, max] | null, + "building_size_range": [min, max] | null, + "ocean_proximity": string | null, + "bay_proximity": string | null, + "floor_range": [min, max] | null, + "plot_area_range": [min, max] | null, + "building_height_range": [min, max] | null, + "max_distance_ocean": float | null, + "max_distance_bay": float | null + }, + "importance_weights": { + "location": float, + "size": float, + "height": float, + "proximity": float + } +} + +CONSTRAINTS: +- All fields are optional +- Weights should sum to 1.0 +- Use null for any unspecified parameters + +--------------------------------------------- \ No newline at end of file diff --git a/packages/plugin-unreal/unreal/design/system prompts/v1 prompt.txt b/packages/plugin-unreal/unreal/design/system prompts/v1 prompt.txt new file mode 100644 index 00000000..a42f3e33 --- /dev/null +++ b/packages/plugin-unreal/unreal/design/system prompts/v1 prompt.txt @@ -0,0 +1,153 @@ +You are a specialized real estate search assistant for a futuristic city. Your role is to convert natural language queries into search patterns that match our property database descriptions. + +IMPORTANT FORMATTING RULES: +1. Always structure property descriptions using the exact terminology from our database: + - Plot sizes: [Micro, Mid, Mega, Mammoth, Giga] + - Building types: [Lowrise, Highrise, Tall, Megatall] + - Distances: [Close, Medium, Far] + - Neighborhoods: [Nexus, Flashing Lights, Space Mind, North Star, District ZERO, Tranquility Gardens, Little Meow] + - Zoning: [Legendary, Mixed Use, Industrial, Residential, Commercial] + +2. Always maintain the structure: "[ID] is a [Size] [Zoning] plot in [Neighborhood]..." + +5. Rarity/Cost Understanding: + - Rarity rank 1-100: Ultra Premium properties + - Rank 101-500: Premium properties + - Rank 501-2000: Standard properties + - Rank 2001+: Value properties + + +QUERY TRANSLATION RULES: +1. For location queries: + - "near/close to" → "Close from" + - "far from" → "Far from" + - "medium distance" → "Medium from" + +2. For property types: + - "residential" → "Residential" + - "commercial" → "Mixed Use" or "Commercial" + - "industrial" → "Industrial" + +3. For rarity/size implications: + - "low rarity" → "Micro" or "Mid" + - "high rarity" → "Giga" or "Mammoth" + - "average" → "Mega" + +4. For cost/rarity implications: + - "luxury/expensive/high-end" → rank range 1-100 + - "premium/upscale" → rank range 101-500 + - "affordable/budget/low cost" → rank range 2001+ + - "mid range/standard" → rank range 501-2000 + +OUTPUT FORMAT: +{ + "searchText": string, // Natural language search pattern matching our database descriptions + "metadata": { + "neighborhood": string[], + "zoningTypes": string[], + "plotSizes": string[], + "maxDistance": { + "ocean": number | null, + "bay": number | null + }, + "buildingTypes": string[] + } +} + +EXAMPLE QUERIES AND RESPONSES: + +Query: "give me all the properties in space mind close to the bay that are residential" +{ + "searchText": "is a Residential plot in Space Mind. Located Close from bay", + "metadata": { + "neighborhood": ["Space Mind"], + "zoningTypes": ["Residential"], + "maxDistance": { + "bay": 300, + "ocean": null + } + } +} + +Query: "how many commercial properties are there in Tranquility Gardens?" +{ + "searchText": "is a Mixed Use plot in Tranquility Gardens", + "metadata": { + "neighborhood": ["Tranquility Gardens"], + "zoningTypes": ["Mixed Use", "Commercial"] + } +} + +Query: "show me properties in space mind that are low rarity" +{ + "searchText": "is a Micro plot in Space Mind", + "metadata": { + "neighborhood": ["Space Mind"], + "plotSizes": ["Micro", "Mid"] + } +} + +REMEMBER: +- Always maintain consistent terminology with the database descriptions +- Include relevant metadata filters to narrow down results +- Generate search patterns that would match the property description format +- When size/rarity isn't specified, don't include it in the search pattern + + + +IMPORTANT FORMATTING RULES: +[previous rules remain...] +5. Rarity/Cost Understanding: + - Rarity rank 1-100: Ultra Premium properties + - Rank 101-500: Premium properties + - Rank 501-2000: Standard properties + - Rank 2001+: Value properties + +QUERY TRANSLATION RULES: +[previous rules remain...] +4. For cost/rarity implications: + - "luxury/expensive/high-end" → rank range 1-100 + - "premium/upscale" → rank range 101-500 + - "affordable/budget/low cost" → rank range 2001+ + - "mid range/standard" → rank range 501-2000 + +OUTPUT FORMAT: +{ + "searchText": string, + "metadata": { + [previous fields remain...] + "rankRange": { + "min": number | null, + "max": number | null + } + } +} + +EXAMPLE QUERIES AND RESPONSES: + +Query: "show me affordable properties in District ZERO" +{ + "searchText": "is a plot in District ZERO", + "metadata": { + "neighborhood": ["District ZERO"], + "rankRange": { + "min": 2001, + "max": null + } + } +} + +Query: "what are the most exclusive properties near the ocean?" +{ + "searchText": "is a plot Located Close from ocean", + "metadata": { + "rankRange": { + "min": 1, + "max": 100 + }, + "maxDistance": { + "ocean": 300, + "bay": null + } + } +} \ No newline at end of file diff --git a/packages/plugin-unreal/unreal/design/system prompts/v2 prompt.txt b/packages/plugin-unreal/unreal/design/system prompts/v2 prompt.txt new file mode 100644 index 00000000..22a4d40d --- /dev/null +++ b/packages/plugin-unreal/unreal/design/system prompts/v2 prompt.txt @@ -0,0 +1,135 @@ +You are a specialized real estate search assistant for a futuristic city. Your role is to convert natural language queries into search patterns that match our property database descriptions. + +IMPORTANT FORMATTING RULES: +1. Property Attributes: + - Plot sizes: [Nano, Micro, Mid, Mega, Mammoth, Giga] + - Building types: [Lowrise, Highrise, Tall, Megatall] + - Distances: [Close (0-300m), Medium (301-700m), Far (701m+)] + - Neighborhoods: [Nexus, Flashing Lights, Space Mind, North Star, District ZERO, Tranquility Gardens, Little Meow, Haven Heights] + - Zoning: [Legendary, Mixed Use, Industrial, Residential, Commercial] + +2. Description Structure: + "[ID] is a [Size] [Zoning] plot in [Neighborhood]. It is a [Building Type] building with [X] to [Y] floors. The plot area is [Z]m² with building heights from [A]m to [B]m. Located [Distance] from ocean ([C]m) and [Distance] from bay ([D]m)." + +3. Rarity/Cost Understanding: + - Rank 1-100: Ultra Premium (Most Exclusive) + - Rank 101-500: Premium + - Rank 501-2000: Standard + - Rank 2001-3000: Value + - Rank 3001+: Entry Level + +QUERY TRANSLATION RULES: +1. Location-based queries: + - "waterfront/beachfront/oceanside" → "Close from ocean" + - "bay view/harbor side" → "Close from bay" + - "inland/away from water" → "Far from ocean AND Far from bay" + - "in/at/near [Neighborhood]" → "in [Neighborhood]" + +2. Property type queries: + - "home/house/apartment" → "Residential" + - "shop/retail/store/mall" → "Commercial" + - "factory/warehouse" → "Industrial" + - "mixed-use/multi-purpose" → "Mixed Use" + +3. Size/Scale queries: + - "tiny/small/compact" → "Nano OR Micro" + - "medium/average" → "Mid" + - "large/spacious" → "Mega" + - "huge/massive" → "Mammoth OR Giga" + +4. Price/Rarity queries: + - "luxury/premium/high-end" → rank range 1-500 + - "average/standard" → rank range 501-2000 + - "affordable/budget" → rank range 2001-3000 + - "cheapest/most affordable" → rank range 3001+ + - "most expensive/exclusive" → rank range 1-100 + +5. Building Height queries: + - "single floor/one story" → "Lowrise (1-3 floors)" + - "low-rise" → "Lowrise (4-20 floors)" + - "high-rise" → "Highrise (21-49 floors)" + - "skyscraper" → "Tall (50-99 floors)" + - "supertall" → "Megatall (100+ floors)" + +OUTPUT FORMAT: +{ + "searchText": string, + "metadata": { + "neighborhood": string[], + "zoningTypes": string[], + "plotSizes": string[], + "buildingTypes": string[], + "maxDistance": { + "ocean": number | null, + "bay": number | null + }, + "rankRange": { + "min": number | null, + "max": number | null + }, + "floorRange": { + "min": number | null, + "max": number | null + } + } +} + +EXAMPLE QUERIES AND RESPONSES: + +Query: "find me a luxury apartment with ocean views in North Star" +{ + "searchText": "is a Residential plot in North Star Located Close from ocean", + "metadata": { + "neighborhood": ["North Star"], + "zoningTypes": ["Residential"], + "maxDistance": { + "ocean": 300, + "bay": null + }, + "rankRange": { + "min": 1, + "max": 500 + } + } +} + +Query: "what's the cheapest commercial space in Haven Heights?" +{ + "searchText": "is a Commercial plot in Haven Heights", + "metadata": { + "neighborhood": ["Haven Heights"], + "zoningTypes": ["Commercial"], + "rankRange": { + "min": 3001, + "max": null + } + } +} + +Query: "show me all the high-rise buildings near the bay in Space Mind under rank 2000" +{ + "searchText": "is a plot in Space Mind Located Close from bay", + "metadata": { + "neighborhood": ["Space Mind"], + "buildingTypes": ["Highrise"], + "maxDistance": { + "bay": 300, + "ocean": null + }, + "rankRange": { + "min": null, + "max": 2000 + }, + "floorRange": { + "min": 21, + "max": 49 + } + } +} + +REMEMBER: +- Always maintain consistent terminology +- Include all relevant metadata filters +- Handle compound queries (multiple conditions) +- When a specific attribute isn't mentioned, leave it open +- Consider both explicit and implicit requirements \ No newline at end of file diff --git a/packages/plugin-unreal/unreal/design/system prompts/v3 prompt.txt b/packages/plugin-unreal/unreal/design/system prompts/v3 prompt.txt new file mode 100644 index 00000000..22a4d40d --- /dev/null +++ b/packages/plugin-unreal/unreal/design/system prompts/v3 prompt.txt @@ -0,0 +1,135 @@ +You are a specialized real estate search assistant for a futuristic city. Your role is to convert natural language queries into search patterns that match our property database descriptions. + +IMPORTANT FORMATTING RULES: +1. Property Attributes: + - Plot sizes: [Nano, Micro, Mid, Mega, Mammoth, Giga] + - Building types: [Lowrise, Highrise, Tall, Megatall] + - Distances: [Close (0-300m), Medium (301-700m), Far (701m+)] + - Neighborhoods: [Nexus, Flashing Lights, Space Mind, North Star, District ZERO, Tranquility Gardens, Little Meow, Haven Heights] + - Zoning: [Legendary, Mixed Use, Industrial, Residential, Commercial] + +2. Description Structure: + "[ID] is a [Size] [Zoning] plot in [Neighborhood]. It is a [Building Type] building with [X] to [Y] floors. The plot area is [Z]m² with building heights from [A]m to [B]m. Located [Distance] from ocean ([C]m) and [Distance] from bay ([D]m)." + +3. Rarity/Cost Understanding: + - Rank 1-100: Ultra Premium (Most Exclusive) + - Rank 101-500: Premium + - Rank 501-2000: Standard + - Rank 2001-3000: Value + - Rank 3001+: Entry Level + +QUERY TRANSLATION RULES: +1. Location-based queries: + - "waterfront/beachfront/oceanside" → "Close from ocean" + - "bay view/harbor side" → "Close from bay" + - "inland/away from water" → "Far from ocean AND Far from bay" + - "in/at/near [Neighborhood]" → "in [Neighborhood]" + +2. Property type queries: + - "home/house/apartment" → "Residential" + - "shop/retail/store/mall" → "Commercial" + - "factory/warehouse" → "Industrial" + - "mixed-use/multi-purpose" → "Mixed Use" + +3. Size/Scale queries: + - "tiny/small/compact" → "Nano OR Micro" + - "medium/average" → "Mid" + - "large/spacious" → "Mega" + - "huge/massive" → "Mammoth OR Giga" + +4. Price/Rarity queries: + - "luxury/premium/high-end" → rank range 1-500 + - "average/standard" → rank range 501-2000 + - "affordable/budget" → rank range 2001-3000 + - "cheapest/most affordable" → rank range 3001+ + - "most expensive/exclusive" → rank range 1-100 + +5. Building Height queries: + - "single floor/one story" → "Lowrise (1-3 floors)" + - "low-rise" → "Lowrise (4-20 floors)" + - "high-rise" → "Highrise (21-49 floors)" + - "skyscraper" → "Tall (50-99 floors)" + - "supertall" → "Megatall (100+ floors)" + +OUTPUT FORMAT: +{ + "searchText": string, + "metadata": { + "neighborhood": string[], + "zoningTypes": string[], + "plotSizes": string[], + "buildingTypes": string[], + "maxDistance": { + "ocean": number | null, + "bay": number | null + }, + "rankRange": { + "min": number | null, + "max": number | null + }, + "floorRange": { + "min": number | null, + "max": number | null + } + } +} + +EXAMPLE QUERIES AND RESPONSES: + +Query: "find me a luxury apartment with ocean views in North Star" +{ + "searchText": "is a Residential plot in North Star Located Close from ocean", + "metadata": { + "neighborhood": ["North Star"], + "zoningTypes": ["Residential"], + "maxDistance": { + "ocean": 300, + "bay": null + }, + "rankRange": { + "min": 1, + "max": 500 + } + } +} + +Query: "what's the cheapest commercial space in Haven Heights?" +{ + "searchText": "is a Commercial plot in Haven Heights", + "metadata": { + "neighborhood": ["Haven Heights"], + "zoningTypes": ["Commercial"], + "rankRange": { + "min": 3001, + "max": null + } + } +} + +Query: "show me all the high-rise buildings near the bay in Space Mind under rank 2000" +{ + "searchText": "is a plot in Space Mind Located Close from bay", + "metadata": { + "neighborhood": ["Space Mind"], + "buildingTypes": ["Highrise"], + "maxDistance": { + "bay": 300, + "ocean": null + }, + "rankRange": { + "min": null, + "max": 2000 + }, + "floorRange": { + "min": 21, + "max": 49 + } + } +} + +REMEMBER: +- Always maintain consistent terminology +- Include all relevant metadata filters +- Handle compound queries (multiple conditions) +- When a specific attribute isn't mentioned, leave it open +- Consider both explicit and implicit requirements \ No newline at end of file diff --git a/packages/plugin-unreal/unreal/version1/docs/detailed_implementation.md b/packages/plugin-unreal/unreal/version1/docs/detailed_implementation.md new file mode 100644 index 00000000..f11f58fe --- /dev/null +++ b/packages/plugin-unreal/unreal/version1/docs/detailed_implementation.md @@ -0,0 +1,214 @@ +# Land Memory System - Detailed Implementation + +## 1. Core Components Implementation + +### 1.1 Type System (`types.ts`) + +#### Enums +- Implement categorical data types using TypeScript enums +- Ensure exhaustive pattern matching +- Document valid value ranges + +```typescript +export enum PlotSize { + Nano = 'Nano', + // ... +} +``` + +#### Interfaces +- Define strict type boundaries +- Use nested structures for complex data +- Include JSDoc documentation + +```typescript +export interface LandPlotMetadata { + rank: number; + // ... +} +``` + +### 1.2 Database Adapter (`land_database_adapter.ts`) + +#### Query Building +```typescript +// Base query structure +let sql = `SELECT * FROM memories WHERE type = $1`; +const values: any[] = [LAND_TABLE]; + +// Dynamic parameter addition +if (params.neighborhoods?.length) { + sql += ` AND content->'metadata'->>'neighborhood' = ANY($${++paramCount}::text[])`; + values.push(params.neighborhoods); +} +``` + +#### Error Handling +```typescript +try { + const { rows } = await this.query(sql, values); + return rows.map(row => ({ + ...row, + content: typeof row.content === 'string' ? JSON.parse(row.content) : row.content + })); +} catch (error) { + elizaLogger.error('Error in searchLandByMetadata:', { + error: error instanceof Error ? error.message : String(error), + params + }); + throw error; +} +``` + +### 1.3 Memory System (`land_memory_system.ts`) + +#### CSV Processing +```typescript +private generatePlotDescription(plot: any): string { + return `${plot.Name} is a ${plot['Plot Size']} ...`; +} +``` + +#### Search Implementation +```typescript +async searchProperties( + query: string, + metadata: Partial = {}, + limit: number = DEFAULT_MATCH_COUNT +): Promise +``` + +## 2. Database Schema + +### 2.1 Memories Table +```sql +CREATE TABLE memories ( + id UUID PRIMARY KEY, + type TEXT NOT NULL, + room_id TEXT NOT NULL, + agent_id TEXT NOT NULL, + content JSONB, + embedding vector(1536) +); +``` + +### 2.2 Indexes +```sql +CREATE INDEX idx_memories_type ON memories(type); +CREATE INDEX idx_memories_content ON memories USING gin(content); +CREATE INDEX idx_memories_embedding ON memories USING ivfflat (embedding vector_cosine_ops); +``` + +## 3. Query Optimization + +### 3.1 Metadata Queries +- Use JSON containment operators +- Leverage GIN indexes +- Implement parameter sanitization + +### 3.2 Vector Search +- Use HNSW index for embeddings +- Implement similarity thresholds +- Optimize result count + +## 4. Error Handling Strategy + +### 4.1 Error Types +```typescript +enum ErrorType { + DATABASE_ERROR = 'DATABASE_ERROR', + VALIDATION_ERROR = 'VALIDATION_ERROR', + EMBEDDING_ERROR = 'EMBEDDING_ERROR' +} +``` + +### 4.2 Error Logging +```typescript +elizaLogger.error('Error Type:', { + type: ErrorType.DATABASE_ERROR, + details: error.message, + context: { + query, + params + } +}); +``` + +## 5. Performance Considerations + +### 5.1 Query Optimization +- Use prepared statements +- Implement connection pooling +- Optimize JSON operations + +### 5.2 Memory Management +- Implement result pagination +- Use streaming for large datasets +- Optimize embedding storage + +## 6. Security Measures + +### 6.1 Input Validation +- Sanitize SQL inputs +- Validate JSON structure +- Check parameter bounds + +### 6.2 Access Control +- Implement role-based access +- Validate agent permissions +- Log access attempts + +## 7. Monitoring and Logging + +### 7.1 Metrics +- Query performance +- Memory usage +- Error rates + +### 7.2 Logging +- Request/response cycles +- Error stacks +- Performance data + +## 8. Configuration Management + +### 8.1 Environment Variables +```typescript +const config = { + database: { + host: process.env.DB_HOST, + port: process.env.DB_PORT, + name: process.env.DB_NAME + }, + search: { + defaultThreshold: process.env.SEARCH_THRESHOLD, + maxResults: process.env.MAX_RESULTS + } +}; +``` + +### 8.2 Feature Flags +```typescript +const features = { + enableVectorSearch: true, + useCache: process.env.NODE_ENV === 'production', + debugMode: process.env.DEBUG === 'true' +}; +``` + +## 9. Testing Strategy + +### 9.1 Unit Tests +- Type validation +- Query building +- Error handling + +### 9.2 Integration Tests +- Database operations +- Search functionality +- CSV processing + +### 9.3 Performance Tests +- Query benchmarks +- Memory usage +- Concurrent operations diff --git a/packages/plugin-unreal/unreal/version1/docs/detailed_implementation.pdf b/packages/plugin-unreal/unreal/version1/docs/detailed_implementation.pdf new file mode 100644 index 00000000..58053d28 Binary files /dev/null and b/packages/plugin-unreal/unreal/version1/docs/detailed_implementation.pdf differ diff --git a/packages/plugin-unreal/unreal/version1/docs/high_level_design.md b/packages/plugin-unreal/unreal/version1/docs/high_level_design.md new file mode 100644 index 00000000..dbe0f837 --- /dev/null +++ b/packages/plugin-unreal/unreal/version1/docs/high_level_design.md @@ -0,0 +1,112 @@ +# Land Memory System - High Level Design + +## System Overview + +The Land Memory System is designed to store, manage, and search virtual real estate data using a combination of semantic search and structured metadata. It extends Eliza's memory system to provide specialized functionality for land plots. + +## Core Components + +### 1. Data Model +```mermaid +graph TD + A[Land Plot Memory] --> B[Content] + A --> C[Embedding] + B --> D[Text Description] + B --> E[Metadata] + E --> F[Basic Info] + E --> G[Building Specs] + E --> H[Distances] + F --> F1[Name] + F --> F2[Rank] + F --> F3[Neighborhood] + G --> G1[Floors] + G --> G2[Height] + H --> H1[Ocean] + H --> H2[Bay] +``` + +### 2. System Architecture +```mermaid +graph LR + A[CSV Data] --> B[Memory System] + B --> C[Database Adapter] + C --> D[PostgreSQL] + E[Natural Language Query] --> F[Query Processor] + F --> G[Semantic Search] + F --> H[Metadata Filter] + G --> I[Combined Results] + H --> I +``` + +## Key Features + +1. **Semantic Search** + - Vector embeddings for natural language understanding + - Similarity-based matching + - Flexible query processing + +2. **Structured Search** + - Type-safe metadata queries + - Complex filtering capabilities + - Performance-optimized database queries + +3. **Data Management** + - CSV data ingestion + - Automated description generation + - Structured data validation + +## Design Principles + +1. **Single Source of Truth** + - One table for all land data + - Unified type system + - Centralized constants + +2. **Type Safety** + - Extensive use of TypeScript enums + - Structured interfaces + - Strict type checking + +3. **Extensibility** + - Modular component design + - Clear interface boundaries + - Pluggable embedding system + +4. **Performance** + - Optimized database queries + - Efficient JSON operations + - Smart result limiting + +## System Boundaries + +1. **Inputs** + - CSV data files + - Natural language queries + - Structured search parameters + +2. **Outputs** + - Ranked search results + - Property metadata + - Error logs and diagnostics + +3. **Dependencies** + - Eliza Memory System + - PostgreSQL Database + - Text Embedding Service + +## Future Considerations + +1. **Scalability** + - Sharding strategies + - Caching layer + - Query optimization + +2. **Feature Expansion** + - Multiple world support + - Version tracking + - Real-time updates + +3. **Integration** + - External API support + - Event system + - Monitoring and analytics diff --git a/packages/plugin-unreal/unreal/version1/docs/integration_plan.md b/packages/plugin-unreal/unreal/version1/docs/integration_plan.md new file mode 100644 index 00000000..be9f3fe9 --- /dev/null +++ b/packages/plugin-unreal/unreal/version1/docs/integration_plan.md @@ -0,0 +1,239 @@ +# Land Memory System - Integration Plan + +## Phase 1: Database Setup + +### 1.1 Schema Migration +```sql +-- Create extensions +CREATE EXTENSION IF NOT EXISTS vector; + +-- Create memories table +CREATE TABLE memories ( + id UUID PRIMARY KEY, + type TEXT NOT NULL, + room_id TEXT NOT NULL, + agent_id TEXT NOT NULL, + content JSONB, + embedding vector(1536) +); + +-- Create indexes +CREATE INDEX idx_memories_type ON memories(type); +CREATE INDEX idx_memories_content ON memories USING gin(content); +CREATE INDEX idx_memories_embedding ON memories USING ivfflat (embedding vector_cosine_ops); +``` + +### 1.2 Configuration Setup +```typescript +// config.ts +export const dbConfig = { + host: process.env.DB_HOST || 'localhost', + database: process.env.DB_NAME || 'land_db', + user: process.env.DB_USER || 'postgres', + password: process.env.DB_PASSWORD +}; +``` + +## Phase 2: Core System Integration + +### 2.1 Initialize Components +```typescript +// Initialize database adapter +const landDB = new LandDatabaseAdapter(dbConfig); +await landDB.init(); + +// Initialize embedder +const embedder = new TextEmbedder(); + +// Initialize memory system +const landMemory = new LandMemorySystem(landDB, embedder); +``` + +### 2.2 Data Migration +```typescript +// CSV processor +import csv from 'csv-parser'; +import fs from 'fs'; + +async function importCSVData(filePath: string) { + const stream = fs.createReadStream(filePath).pipe(csv()); + + for await (const row of stream) { + await landMemory.createLandMemoryFromCSV(row); + } +} +``` + +## Phase 3: API Integration + +### 3.1 REST Endpoints +```typescript +// Search endpoint +app.post('/api/land/search', async (req, res) => { + const { query, metadata, limit } = req.body; + const results = await landMemory.searchProperties(query, metadata, limit); + res.json(results); +}); + +// Property details endpoint +app.get('/api/land/:id', async (req, res) => { + const property = await landDB.getMemoryById(req.params.id); + res.json(property); +}); +``` + +### 3.2 GraphQL Schema +```graphql +type LandPlot { + id: ID! + name: String! + neighborhood: String! + zoning: ZoningType! + plotSize: PlotSize! + # ...other fields +} + +type Query { + searchLandPlots(query: String!, metadata: LandSearchInput): [LandPlot!]! + getLandPlotById(id: ID!): LandPlot +} +``` + +## Phase 4: Testing Integration + +### 4.1 Test Database Setup +```typescript +// test/setup.ts +export async function setupTestDatabase() { + const testDB = new LandDatabaseAdapter({ + ...dbConfig, + database: 'land_test_db' + }); + await testDB.init(); + return testDB; +} +``` + +### 4.2 Integration Tests +```typescript +describe('Land Memory System Integration', () => { + let landDB: LandDatabaseAdapter; + let landMemory: LandMemorySystem; + + beforeAll(async () => { + landDB = await setupTestDatabase(); + landMemory = new LandMemorySystem(landDB, new MockEmbedder()); + }); + + test('End-to-end search flow', async () => { + // Create test data + await landMemory.createLandMemoryFromCSV(testData); + + // Perform search + const results = await landMemory.searchProperties( + 'beachfront property', + { neighborhoods: ['North Shore'] } + ); + + expect(results).toHaveLength(1); + expect(results[0].content.metadata.neighborhood).toBe('North Shore'); + }); +}); +``` + +## Phase 5: Monitoring Integration + +### 5.1 Metrics Setup +```typescript +// Prometheus metrics +const searchLatency = new prometheus.Histogram({ + name: 'land_search_duration_seconds', + help: 'Land search operation duration' +}); + +// Wrap search method +const originalSearch = landMemory.searchProperties; +landMemory.searchProperties = async (...args) => { + const timer = searchLatency.startTimer(); + try { + return await originalSearch.apply(landMemory, args); + } finally { + timer(); + } +}; +``` + +### 5.2 Logging Integration +```typescript +// Winston logger setup +const logger = winston.createLogger({ + level: 'info', + format: winston.format.json(), + defaultMeta: { service: 'land-memory' }, + transports: [ + new winston.transports.File({ filename: 'error.log', level: 'error' }), + new winston.transports.File({ filename: 'combined.log' }) + ] +}); +``` + +## Phase 6: Deployment Strategy + +### 6.1 Database Migration +1. Backup existing data +2. Apply schema changes +3. Verify indexes +4. Load initial data + +### 6.2 Application Deployment +1. Deploy database changes +2. Deploy application updates +3. Run smoke tests +4. Enable monitoring + +### 6.3 Rollback Plan +1. Database restore procedure +2. Application version rollback +3. Monitoring verification + +## Phase 7: Documentation + +### 7.1 API Documentation +```typescript +/** + * @api {post} /api/land/search Search Land Plots + * @apiName SearchLandPlots + * @apiGroup Land + * + * @apiParam {String} query Search query + * @apiParam {Object} [metadata] Search filters + * @apiParam {Number} [limit=20] Maximum results + * + * @apiSuccess {Array} results Matching land plots + */ +``` + +### 7.2 Integration Guide +1. Setup instructions +2. Configuration guide +3. API examples +4. Common issues + +## Phase 8: Maintenance Plan + +### 8.1 Monitoring Checklist +- [ ] Query performance +- [ ] Error rates +- [ ] Memory usage +- [ ] API latency + +### 8.2 Backup Strategy +- Daily database backups +- Weekly full system backups +- Monthly archive backups + +### 8.3 Update Procedure +1. Test in staging +2. Deploy to production +3. Monitor metrics +4. Verify functionality diff --git a/packages/plugin-unreal/unreal/version1/docs/test_driven_design.md b/packages/plugin-unreal/unreal/version1/docs/test_driven_design.md new file mode 100644 index 00000000..1c9cd1ca --- /dev/null +++ b/packages/plugin-unreal/unreal/version1/docs/test_driven_design.md @@ -0,0 +1,330 @@ +# Land Memory System - Test Driven Design Plan + +## 1. Unit Tests + +### 1.1 Types and Validation +```typescript +describe('Land Plot Types', () => { + describe('LandPlotMetadata', () => { + test('should validate all required fields', () => { + const validMetadata: LandPlotMetadata = { + rank: 1, + name: 'Test Plot', + neighborhood: 'Test Area', + zoning: ZoningType.Residential, + plotSize: PlotSize.Medium, + buildingType: BuildingType.LowRise, + distances: { + ocean: { + meters: 100, + category: DistanceCategory.Close + }, + bay: { + meters: 200, + category: DistanceCategory.Medium + } + }, + building: { + floors: { min: 1, max: 10 }, + height: { min: 3, max: 30 } + }, + plotArea: 1000 + }; + expect(validateMetadata(validMetadata)).toBeTruthy(); + }); + + test('should reject invalid enum values', () => { + const invalidMetadata = { + // ... invalid data + }; + expect(() => validateMetadata(invalidMetadata)).toThrow(); + }); + }); +}); +``` + +### 1.2 Database Adapter +```typescript +describe('LandDatabaseAdapter', () => { + describe('searchLandByMetadata', () => { + test('should build correct SQL for neighborhood search', () => { + const params: LandSearchParams = { + neighborhoods: ['North Shore'] + }; + const { sql, values } = buildSearchQuery(params); + expect(sql).toContain("content->'metadata'->>'neighborhood'"); + expect(values).toContain('North Shore'); + }); + + test('should handle multiple search criteria', () => { + const params: LandSearchParams = { + neighborhoods: ['North Shore'], + plotSizes: [PlotSize.Large], + distances: { + ocean: { maxMeters: 500 } + } + }; + const { sql, values } = buildSearchQuery(params); + expect(sql).toMatch(/neighborhood.*plotSize.*meters/); + }); + }); + + describe('searchLandByCombinedCriteria', () => { + test('should combine semantic and metadata results', async () => { + const embedding = [/* test embedding */]; + const metadata = { + neighborhoods: ['Test'] + }; + const results = await adapter.searchLandByCombinedCriteria( + embedding, + metadata + ); + expect(results).toSatisfyAll(r => + r.content.metadata.neighborhood === 'Test' + ); + }); + }); +}); +``` + +### 1.3 Memory System +```typescript +describe('LandMemorySystem', () => { + describe('generatePlotDescription', () => { + test('should generate consistent descriptions', () => { + const plot = { + Name: 'Test Plot', + 'Plot Size': 'Large', + // ... other fields + }; + const description = system.generatePlotDescription(plot); + expect(description).toContain('Test Plot'); + expect(description).toContain('Large'); + }); + }); + + describe('createLandMemoryFromCSV', () => { + test('should properly transform CSV data', async () => { + const csvRow = { + // ... test data + }; + await system.createLandMemoryFromCSV(csvRow); + const stored = await adapter.getMemoryById(/* id */); + expect(stored.content.metadata).toMatchObject({ + name: csvRow.Name, + // ... other fields + }); + }); + }); +}); +``` + +## 2. Integration Tests + +### 2.1 Database Integration +```typescript +describe('Database Integration', () => { + let db: LandDatabaseAdapter; + + beforeAll(async () => { + db = new LandDatabaseAdapter(testConfig); + await db.init(); + }); + + test('should handle concurrent operations', async () => { + const operations = Array(10).fill(null).map(() => + db.createLandMemory(testMemory) + ); + await expect(Promise.all(operations)).resolves.not.toThrow(); + }); + + test('should maintain ACID properties', async () => { + // Start transaction + const results1 = await db.searchLandByMetadata({ /* params */ }); + await db.createLandMemory(newMemory); + const results2 = await db.searchLandByMetadata({ /* same params */ }); + expect(results2.length).toBe(results1.length + 1); + }); +}); +``` + +### 2.2 Full System Integration +```typescript +describe('System Integration', () => { + let system: LandMemorySystem; + + beforeAll(async () => { + const db = await setupTestDatabase(); + const embedder = new TestEmbedder(); + system = new LandMemorySystem(db, embedder); + }); + + test('end-to-end search flow', async () => { + // Create test data + const testPlots = [/* test data */]; + for (const plot of testPlots) { + await system.createLandMemoryFromCSV(plot); + } + + // Perform search + const results = await system.searchProperties( + 'waterfront property', + { + distances: { + ocean: { category: DistanceCategory.Close } + } + } + ); + + expect(results).toHaveLength(1); + expect(results[0].content.metadata.distances.ocean.category) + .toBe(DistanceCategory.Close); + }); +}); +``` + +## 3. Performance Tests + +### 3.1 Load Testing +```typescript +describe('Performance', () => { + test('should handle large result sets', async () => { + const start = Date.now(); + const results = await system.searchProperties('common term'); + const duration = Date.now() - start; + expect(duration).toBeLessThan(1000); + expect(results).toHaveLength(DEFAULT_MATCH_COUNT); + }); + + test('should handle concurrent searches', async () => { + const searches = Array(100).fill(null).map(() => + system.searchProperties('test', {}) + ); + const start = Date.now(); + await Promise.all(searches); + const duration = Date.now() - start; + expect(duration).toBeLessThan(5000); + }); +}); +``` + +### 3.2 Memory Usage +```typescript +describe('Memory Usage', () => { + test('should not leak memory during searches', async () => { + const initialMemory = process.memoryUsage().heapUsed; + for (let i = 0; i < 1000; i++) { + await system.searchProperties('test'); + } + const finalMemory = process.memoryUsage().heapUsed; + expect(finalMemory - initialMemory).toBeLessThan(50 * 1024 * 1024); + }); +}); +``` + +## 4. Error Handling Tests + +### 4.1 Invalid Input +```typescript +describe('Error Handling', () => { + test('should handle invalid metadata', async () => { + await expect( + system.searchProperties('test', { + neighborhoods: [123] // invalid type + } as any) + ).rejects.toThrow(); + }); + + test('should handle database connection errors', async () => { + // Simulate DB connection loss + await expect( + system.searchProperties('test') + ).rejects.toThrow('Database connection error'); + }); +}); +``` + +### 4.2 Edge Cases +```typescript +describe('Edge Cases', () => { + test('should handle empty search results', async () => { + const results = await system.searchProperties( + 'non-existent property' + ); + expect(results).toHaveLength(0); + }); + + test('should handle maximum value bounds', async () => { + await expect( + system.createLandMemoryFromCSV({ + 'Plot Area (m²)': Number.MAX_SAFE_INTEGER + 1 + }) + ).rejects.toThrow(); + }); +}); +``` + +## 5. Test Data Management + +### 5.1 Fixtures +```typescript +// fixtures/testData.ts +export const testPlots = [ + { + Name: 'Oceanfront Villa', + 'Plot Size': PlotSize.Large, + 'Zoning Type': ZoningType.Residential, + // ... other fields + }, + // ... more test data +]; +``` + +### 5.2 Test Helpers +```typescript +// helpers/testUtils.ts +export async function createTestData(system: LandMemorySystem) { + for (const plot of testPlots) { + await system.createLandMemoryFromCSV(plot); + } +} + +export function cleanup(db: LandDatabaseAdapter) { + return db.query('DELETE FROM memories WHERE type = $1', [LAND_TABLE]); +} +``` + +## 6. Continuous Integration + +### 6.1 GitHub Actions Workflow +```yaml +name: Test Suite +on: [push, pull_request] +jobs: + test: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: Setup Node.js + uses: actions/setup-node@v2 + - name: Install dependencies + run: npm install + - name: Run tests + run: npm test +``` + +### 6.2 Test Coverage +```typescript +// jest.config.js +module.exports = { + collectCoverage: true, + coverageThreshold: { + global: { + branches: 80, + functions: 80, + lines: 80, + statements: 80 + } + } +}; +``` diff --git a/packages/plugin-unreal/unreal/version1/land_database_adapter.ts b/packages/plugin-unreal/unreal/version1/land_database_adapter.ts new file mode 100644 index 00000000..a63053ed --- /dev/null +++ b/packages/plugin-unreal/unreal/version1/land_database_adapter.ts @@ -0,0 +1,153 @@ +import { PostgresDatabaseAdapter } from "@ai16z/adapter-postgres"; +import { elizaLogger, UUID } from "@ai16z/eliza"; +import { + LandPlotMemory, + LandSearchParams, + LAND_TABLE, + LAND_ROOM_ID, + LAND_AGENT_ID, + DEFAULT_MATCH_THRESHOLD +} from "./types"; + +export class LandDatabaseAdapter extends PostgresDatabaseAdapter { + constructor(connectionConfig: any) { + super(connectionConfig); + } + + async init(): Promise { + await super.init(); + // Add any additional initialization specific to LandDatabaseAdapter if needed + } + + async createLandMemory(memory: LandPlotMemory): Promise { + await this.createMemory(memory, LAND_TABLE); + } + + async getLandMemoryById(id: UUID): Promise { + const memory = await super.getMemoryById(id); + if (!memory) return undefined; + return memory as LandPlotMemory; + } + + async searchLandByMetadata(params: LandSearchParams): Promise { + let sql = ` + SELECT * FROM memories + WHERE type = $1 + AND content IS NOT NULL + `; + const values: any[] = [LAND_TABLE]; + let paramCount = 1; + + if (params.neighborhoods?.length) { + paramCount++; + sql += ` AND content->'metadata'->>'neighborhood' = ANY($${paramCount}::text[])`; + values.push(params.neighborhoods); + } + + if (params.zoningTypes?.length) { + paramCount++; + sql += ` AND content->'metadata'->>'zoning' = ANY($${paramCount}::text[])`; + values.push(params.zoningTypes); + } + + if (params.plotSizes?.length) { + paramCount++; + sql += ` AND content->'metadata'->>'plotSize' = ANY($${paramCount}::text[])`; + values.push(params.plotSizes); + } + + if (params.buildingTypes?.length) { + paramCount++; + sql += ` AND content->'metadata'->>'buildingType' = ANY($${paramCount}::text[])`; + values.push(params.buildingTypes); + } + + if (params.distances?.ocean) { + if (params.distances.ocean.maxMeters) { + paramCount++; + sql += ` AND (content->'metadata'->'distances'->'ocean'->>'meters')::int <= $${paramCount}`; + values.push(params.distances.ocean.maxMeters); + } + if (params.distances.ocean.category) { + paramCount++; + sql += ` AND content->'metadata'->'distances'->'ocean'->>'category' = $${paramCount}`; + values.push(params.distances.ocean.category); + } + } + + if (params.building?.floors) { + if (params.building.floors.min) { + paramCount++; + sql += ` AND (content->'metadata'->'building'->'floors'->>'min')::int >= $${paramCount}`; + values.push(params.building.floors.min); + } + if (params.building.floors.max) { + paramCount++; + sql += ` AND (content->'metadata'->'building'->'floors'->>'max')::int <= $${paramCount}`; + values.push(params.building.floors.max); + } + } + + if (params.rarity?.rankRange) { + if (params.rarity.rankRange.min) { + paramCount++; + sql += ` AND (content->'metadata'->>'rank')::int >= $${paramCount}`; + values.push(params.rarity.rankRange.min); + } + if (params.rarity.rankRange.max) { + paramCount++; + sql += ` AND (content->'metadata'->>'rank')::int <= $${paramCount}`; + values.push(params.rarity.rankRange.max); + } + } + + try { + const { rows } = await this.query(sql, values); + return rows.map(row => ({ + ...row, + content: typeof row.content === 'string' ? JSON.parse(row.content) : row.content + })); + } catch (error) { + elizaLogger.error('Error in searchLandByMetadata:', { + error: error instanceof Error ? error.message : String(error), + params + }); + throw error; + } + } + + async searchLandByCombinedCriteria( + embedding: number[], + metadata: Partial, + similarity_threshold: number = DEFAULT_MATCH_THRESHOLD + ): Promise { + const semanticResults = await this.searchMemoriesByEmbedding(embedding, { + tableName: LAND_TABLE, + roomId: LAND_ROOM_ID, + agentId: LAND_AGENT_ID, + match_threshold: similarity_threshold + }); + + if (Object.keys(metadata).length === 0) { + return semanticResults as LandPlotMemory[]; + } + + const metadataResults = await this.searchLandByMetadata(metadata); + const semanticIds = new Set(semanticResults.map(r => r.id)); + return metadataResults.filter(r => semanticIds.has(r.id)); + } + + async getPropertiesByRarityRange( + minRank: number, + maxRank: number + ): Promise { + return this.searchLandByMetadata({ + rarity: { + rankRange: { + min: minRank, + max: maxRank + } + } + }); + } +} diff --git a/packages/plugin-unreal/unreal/version1/land_memory_system.ts b/packages/plugin-unreal/unreal/version1/land_memory_system.ts new file mode 100644 index 00000000..597e6d2d --- /dev/null +++ b/packages/plugin-unreal/unreal/version1/land_memory_system.ts @@ -0,0 +1,149 @@ +import { elizaLogger, UUID, stringToUuid } from "@ai16z/eliza"; +import { LandDatabaseAdapter } from "./land_database_adapter"; +import { LandPlotMemory, LandSearchParams, DEFAULT_MATCH_COUNT } from "./types"; +import { LAND_ROOM_ID, LAND_AGENT_ID, AGENT_ID } from "./types"; + +export const LAND_QUERY_SYSTEM_PROMPT = ` +You are a real estate search assistant for a futuristic city. Convert natural language queries into structured search parameters. + +Given a user query, respond with a JSON object containing: +1. A natural language description for embedding matching +2. Search metadata parameters + +Example Response Format: +{ + "searchText": "Large plot in Nexus neighborhood close to ocean with tall building potential", + "metadata": { + "neighborhood": "Nexus", + "minPlotArea": 5000, + "maxOceanDistance": 500, + "minFloors": 50 + } +} + +Keep the searchText natural and descriptive while being specific about requirements. +`; + +export class LandMemorySystem { + constructor( + private readonly database: LandDatabaseAdapter, + private readonly embedder: { + embedText: (text: string) => Promise; + } + ) {} + + /** + * Converts a CSV row into a natural language description for embedding + */ + private generatePlotDescription(plot: any): string { + return `${plot.Name} is a ${plot['Plot Size']} ${plot['Zoning Type']} plot in ${plot.Neighborhood}. ` + + `It is a ${plot['Building Size']} building with ${plot['Min # of Floors']} to ${plot['Max # of Floors']} floors. ` + + `The plot area is ${plot['Plot Area (m²)']}m² with building heights from ${plot['Min Building Height (m)']}m to ${plot['Max Building Height (m)']}m. ` + + `Located ${plot['Distance to Ocean']} from ocean (${plot['Distance to Ocean (m)']}m) and ${plot['Distance to Bay']} from bay (${plot['Distance to Bay (m)']}m).`; + } + + /** + * Create a new land memory from CSV data + */ + + async createLandMemoryFromCSV(csvRow: any): Promise { + try { + const description = this.generatePlotDescription(csvRow); + const embedding = await this.embedder.embedText(description); + + const memory: LandPlotMemory = { + id: stringToUuid(`description`), // TODO FIX THIS + userId: LAND_AGENT_ID, // Since this is a system-generated memory + agentId: LAND_AGENT_ID, + roomId: LAND_ROOM_ID, + content: { + text: description, + metadata: { + rank: parseInt(csvRow['Rank']), + name: csvRow['Name'], + neighborhood: csvRow['Neighborhood'], + zoning: csvRow['Zoning Type'], + plotSize: csvRow['Plot Size'], + buildingType: csvRow['Building Size'], + distances: { + ocean: { + meters: parseInt(csvRow['Distance to Ocean (m)']), + category: csvRow['Distance to Ocean'] + }, + bay: { + meters: parseInt(csvRow['Distance to Bay (m)']), + category: csvRow['Distance to Bay'] + } + }, + building: { + floors: { + min: parseInt(csvRow['Min # of Floors']), + max: parseInt(csvRow['Max # of Floors']) + }, + height: { + min: parseFloat(csvRow['Min Building Height (m)']), + max: parseFloat(csvRow['Max Building Height (m)']) + } + }, + plotArea: parseFloat(csvRow['Plot Area (m²)']) + } + }, + embedding + }; + + await this.database.createLandMemory(memory); + } catch (error) { + elizaLogger.error('Error creating land memory:', { + error: error instanceof Error ? error.message : String(error), + csvRow + }); + throw error; + } + } + + /** + * Search for properties using natural language query and metadata filters + */ + async searchProperties( + query: string, + metadata: Partial = {}, + limit: number = DEFAULT_MATCH_COUNT + ): Promise { + try { + const embedding = await this.embedder.embedText(query); + const results = await this.database.searchLandByCombinedCriteria( + embedding, + metadata + ); + return results.slice(0, limit); + } catch (error) { + elizaLogger.error('Error searching properties:', { + error: error instanceof Error ? error.message : String(error), + query, + metadata + }); + throw error; + } + } + + /** + * Get properties within a specific rarity range + */ + async getPropertiesByRarity( + minRank: number, + maxRank: number, + limit: number = DEFAULT_MATCH_COUNT + ): Promise { + try { + const results = await this.database.getPropertiesByRarityRange(minRank, maxRank); + return results.slice(0, limit); + } catch (error) { + elizaLogger.error('Error getting properties by rarity:', { + error: error instanceof Error ? error.message : String(error), + minRank, + maxRank + }); + throw error; + } + } +} diff --git a/packages/plugin-unreal/unreal/version1/logging.ts b/packages/plugin-unreal/unreal/version1/logging.ts new file mode 100644 index 00000000..0e6d3b03 --- /dev/null +++ b/packages/plugin-unreal/unreal/version1/logging.ts @@ -0,0 +1,33 @@ +import { LandPlotMemory, LandPlotMetadata } from "./types"; + +function printLandMemory(memory: LandPlotMemory) { + const metadata = memory.content.metadata; + console.log(` +🏗️ Land Plot Memory +━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +ID: ${memory.id} +Name: ${metadata.name} +Rank: ${metadata.rank} +Location: ${metadata.neighborhood} + +Properties: +• Plot Size: ${metadata.plotSize} +• Zoning: ${metadata.zoning} +• Building Type: ${metadata.buildingType} +• Plot Area: ${metadata.plotArea}m² + +Building Details: +• Floors: ${metadata.building.floors.min}-${metadata.building.floors.max} +• Height: ${metadata.building.height.min}-${metadata.building.height.max}m + +Distances: +• Ocean: ${metadata.distances.ocean.meters}m (${metadata.distances.ocean.category}) +• Bay: ${metadata.distances.bay.meters}m (${metadata.distances.bay.category}) + +Description: +${memory.content.text} +━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +`); +} + +export { printLandMemory }; \ No newline at end of file diff --git a/packages/plugin-unreal/unreal/version1/tests/memory-integration.test.ts b/packages/plugin-unreal/unreal/version1/tests/memory-integration.test.ts new file mode 100644 index 00000000..dcd7fa40 --- /dev/null +++ b/packages/plugin-unreal/unreal/version1/tests/memory-integration.test.ts @@ -0,0 +1,200 @@ +import { AgentRuntime, knowledge, stringToUuid, KnowledgeItem, Memory, IMemoryManager, ModelProviderName, MemoryManager, embed } from "@ai16z/eliza"; +import { PostgresDatabaseAdapter } from "@ai16z/adapter-postgres"; +import dotenv from "dotenv"; +import { PropertyData } from "../types"; + +dotenv.config(); + +// Ensure we're using OpenAI embeddings +process.env.USE_OPENAI_EMBEDDING = 'true'; +process.env.USE_OLLAMA_EMBEDDING = 'false'; +process.env.EMBEDDING_OPENAI_MODEL = 'text-embedding-3-small'; + +console.log('Environment settings:', { + USE_OPENAI_EMBEDDING: process.env.USE_OPENAI_EMBEDDING, + EMBEDDING_OPENAI_MODEL: process.env.EMBEDDING_OPENAI_MODEL, + OPENAI_API_KEY: process.env.OPENAI_API_KEY ? 'present' : 'missing' +}); + +describe('Property Memory Integration', () => { + let runtime: any; + let db: PostgresDatabaseAdapter; + const agentId = '1459b245-2171-02f6-b436-c3c2641848e5'; + + beforeAll(async () => { + // Initialize database + db = new PostgresDatabaseAdapter({ + connectionString: process.env.POSTGRES_URL || 'postgresql://postgres:postgres@localhost:5432/test', + max: 20, + idleTimeoutMillis: 30000, + connectionTimeoutMillis: 2000, + }); + + // Initialize the database + await db.init(); + + // Create runtime with real database adapter + runtime = { + agentId: agentId, + serverUrl: 'http://localhost:3000', + databaseAdapter: db, + token: process.env.OPENAI_API_KEY, + modelProvider: 'openai' as ModelProviderName, + character: { + modelProvider: 'openai', + modelEndpointOverride: process.env.OPENAI_API_ENDPOINT, + }, + messageManager: { + getCachedEmbeddings: async () => [], + }, + memoryManager: new MemoryManager({ tableName: 'memories', runtime }), + documentsManager: new MemoryManager({ tableName: 'documents', runtime }), + knowledgeManager: new MemoryManager({ tableName: 'knowledge', runtime }), + getCachedEmbeddings: async () => { + return new Float32Array(1536).fill(0); + }, + }; + + // Set the runtime reference for memory managers + (runtime.memoryManager as MemoryManager).runtime = runtime; + (runtime.documentsManager as MemoryManager).runtime = runtime; + (runtime.knowledgeManager as MemoryManager).runtime = runtime; + }); + + /* afterAll(async () => { + // Clean up database connections + // if (db.pool) { + // await db.pool.end(); + } + }); */ + + it('should store and retrieve property data as memories', async () => { + // Create a test property + const testProperty: PropertyData = { + id: '1', + name: 'Oceanfront Tower', + neighborhood: 'Miami Beach', + zoningType: 'Mixed-Use', + plotSize: '0.5 acres', + buildingSize: '50000 sqft', + maxFloors: 40, + minFloors: 1, + plotArea: 21780, + maxBuildingHeight: 400, + minBuildingHeight: 15, + oceanDistanceMeters: 100, + bayDistanceMeters: 1000, + description: 'Luxury oceanfront development opportunity with stunning views', + market: { + isListed: true, + currentPrice: 25000000, + currency: 'USD', + marketplace: 'other', + lastUpdated: new Date() + } + }; + + // Convert property to text format + const propertyText = `Property: ${testProperty.name} +Location: ${testProperty.neighborhood} +Type: ${testProperty.zoningType} +Size: ${testProperty.plotSize} (${testProperty.buildingSize}) +Floors: ${testProperty.minFloors}-${testProperty.maxFloors} +Height: ${testProperty.minBuildingHeight}-${testProperty.maxBuildingHeight} feet +Distance to Ocean: ${testProperty.oceanDistanceMeters}m +Distance to Bay: ${testProperty.bayDistanceMeters}m +Description: ${testProperty.description} +Price: ${testProperty.market?.currentPrice} ${testProperty.market?.currency}`; + + // Create knowledge item + const documentId = stringToUuid(propertyText); + const knowledgeItem: KnowledgeItem = { + id: documentId, + content: { + text: propertyText, + source: "property-data", + metadata: { + propertyId: testProperty.id, + propertyType: "real-estate", + createdAt: new Date().toISOString() + } + } + }; + + // Store in memory system + await knowledge.set(runtime, knowledgeItem); + + // Create a query message + const message: Memory = { + // id: 'test-query', + agentId: runtime.agentId, + userId: runtime.agentId, + roomId: runtime.agentId, + content: { + text: 'Tell me about the Oceanfront Tower property' + } + }; + + // Retrieve and verify + const retrievedItems = await knowledge.get(runtime, message); + + expect(retrievedItems).toBeDefined(); + expect(retrievedItems.length).toBeGreaterThan(0); + + const retrievedItem = retrievedItems[0]; + expect(retrievedItem.content.text).toContain('Oceanfront Tower'); + console.log('Retrieved Item:', retrievedItem); + //expect(retrievedItem.content.metadata?.propertyId).toBe(testProperty.id); + }); + + it('should retrieve property data with different query types', async () => { + // Test exact property name query + const nameQuery: Memory = { + agentId: runtime.agentId, + userId: runtime.agentId, + roomId: runtime.agentId, + content: { + text: 'Tell me about the Oceanfront Tower in Miami Beach' + } + }; + const nameResults = await knowledge.get(runtime, nameQuery); + console.log('Name Query Results:', nameResults); + console.log('Name Query Results Length:', nameResults.length); + console.log('Name Query Results Content:', nameResults[0].content.text); + + expect(nameResults.length).toBeGreaterThan(0); + expect(nameResults[0].content.text).toContain('Oceanfront Tower'); + + // Test location-based query + const locationQuery: Memory = { + agentId: runtime.agentId, + userId: runtime.agentId, + roomId: runtime.agentId, + content: { + text: 'show me oceanfront tower in miami beach' + } + }; + const locationResults = await knowledge.get(runtime, locationQuery); + + console.log('Location Query Results:', locationResults); + + expect(locationResults.length).toBeGreaterThan(0); + expect(locationResults[0].content.text).toContain('Miami Beach'); + + // Test property feature query + const featureQuery: Memory = { + agentId: runtime.agentId, + userId: runtime.agentId, + roomId: runtime.agentId, + content: { + text: 'Show me oceanfront tower in miami beach' + } + }; + console.log('Feature Query:', featureQuery); + const featureResults = await knowledge.get(runtime, featureQuery); + console.log('Feature Query Results:', featureResults); + expect(featureResults.length).toBeGreaterThan(0); + expect(featureResults[0].content.text).toContain('oceanfront'); + expect(featureResults[0].content.source).toBeDefined(); + }); +}); diff --git a/packages/plugin-unreal/unreal/version1/tests/memory-integration.test2.ts b/packages/plugin-unreal/unreal/version1/tests/memory-integration.test2.ts new file mode 100644 index 00000000..383a2a0e --- /dev/null +++ b/packages/plugin-unreal/unreal/version1/tests/memory-integration.test2.ts @@ -0,0 +1,200 @@ +import { AgentRuntime, knowledge, stringToUuid, KnowledgeItem, Memory, IMemoryManager, ModelProviderName, MemoryManager, embed } from "@ai16z/eliza"; +import { PostgresDatabaseAdapter } from "@ai16z/adapter-postgres"; +import dotenv from "dotenv"; +import { PropertyData } from "../../../plugin-spreadsheet/src/types"; + +dotenv.config(); + +// Ensure we're using OpenAI embeddings +process.env.USE_OPENAI_EMBEDDING = 'true'; +process.env.USE_OLLAMA_EMBEDDING = 'false'; +process.env.EMBEDDING_OPENAI_MODEL = 'text-embedding-3-small'; + +console.log('Environment settings:', { + USE_OPENAI_EMBEDDING: process.env.USE_OPENAI_EMBEDDING, + EMBEDDING_OPENAI_MODEL: process.env.EMBEDDING_OPENAI_MODEL, + OPENAI_API_KEY: process.env.OPENAI_API_KEY ? 'present' : 'missing' +}); + +describe('Property Memory Integration', () => { + let runtime: any; + let db: PostgresDatabaseAdapter; + const agentId = '1459b245-2171-02f6-b436-c3c2641848e5'; + + beforeAll(async () => { + // Initialize database + db = new PostgresDatabaseAdapter({ + connectionString: process.env.POSTGRES_URL || 'postgresql://postgres:postgres@localhost:5432/test', + max: 20, + idleTimeoutMillis: 30000, + connectionTimeoutMillis: 2000, + }); + + // Initialize the database + await db.init(); + + // Create runtime with real database adapter + runtime = { + agentId: agentId, + serverUrl: 'http://localhost:3000', + databaseAdapter: db, + token: process.env.OPENAI_API_KEY, + modelProvider: 'openai' as ModelProviderName, + character: { + modelProvider: 'openai', + modelEndpointOverride: process.env.OPENAI_API_ENDPOINT, + }, + messageManager: { + getCachedEmbeddings: async () => [], + }, + memoryManager: new MemoryManager({ tableName: 'memories', runtime }), + documentsManager: new MemoryManager({ tableName: 'documents', runtime }), + knowledgeManager: new MemoryManager({ tableName: 'knowledge', runtime }), + getCachedEmbeddings: async () => { + return new Float32Array(1536).fill(0); + }, + }; + + // Set the runtime reference for memory managers + (runtime.memoryManager as MemoryManager).runtime = runtime; + (runtime.documentsManager as MemoryManager).runtime = runtime; + (runtime.knowledgeManager as MemoryManager).runtime = runtime; + }); + + /* afterAll(async () => { + // Clean up database connections + // if (db.pool) { + // await db.pool.end(); + } + }); */ + + it('should store and retrieve property data as memories', async () => { + // Create a test property + const testProperty: PropertyData = { + id: '1', + name: 'Oceanfront Tower', + neighborhood: 'Miami Beach', + zoningType: 'Mixed-Use', + plotSize: '0.5 acres', + buildingSize: '50000 sqft', + maxFloors: 40, + minFloors: 1, + plotArea: 21780, + maxBuildingHeight: 400, + minBuildingHeight: 15, + oceanDistanceMeters: 100, + bayDistanceMeters: 1000, + description: 'Luxury oceanfront development opportunity with stunning views', + market: { + isListed: true, + currentPrice: 25000000, + currency: 'USD', + marketplace: 'other', + lastUpdated: new Date() + } + }; + + // Convert property to text format + const propertyText = `Property: ${testProperty.name} +Location: ${testProperty.neighborhood} +Type: ${testProperty.zoningType} +Size: ${testProperty.plotSize} (${testProperty.buildingSize}) +Floors: ${testProperty.minFloors}-${testProperty.maxFloors} +Height: ${testProperty.minBuildingHeight}-${testProperty.maxBuildingHeight} feet +Distance to Ocean: ${testProperty.oceanDistanceMeters}m +Distance to Bay: ${testProperty.bayDistanceMeters}m +Description: ${testProperty.description} +Price: ${testProperty.market?.currentPrice} ${testProperty.market?.currency}`; + + // Create knowledge item + const documentId = stringToUuid(propertyText); + const knowledgeItem: KnowledgeItem = { + id: documentId, + content: { + text: propertyText, + source: "property-data", + metadata: { + propertyId: testProperty.id, + propertyType: "real-estate", + createdAt: new Date().toISOString() + } + } + }; + + // Store in memory system + await knowledge.set(runtime, knowledgeItem); + + // Create a query message + const message: Memory = { + // id: 'test-query', + agentId: runtime.agentId, + userId: runtime.agentId, + roomId: runtime.agentId, + content: { + text: 'Tell me about the Oceanfront Tower property' + } + }; + + // Retrieve and verify + const retrievedItems = await knowledge.get(runtime, message); + + expect(retrievedItems).toBeDefined(); + expect(retrievedItems.length).toBeGreaterThan(0); + + const retrievedItem = retrievedItems[0]; + expect(retrievedItem.content.text).toContain('Oceanfront Tower'); + console.log('Retrieved Item:', retrievedItem); + //expect(retrievedItem.content.metadata?.propertyId).toBe(testProperty.id); + }); + + it('should retrieve property data with different query types', async () => { + // Test exact property name query + const nameQuery: Memory = { + agentId: runtime.agentId, + userId: runtime.agentId, + roomId: runtime.agentId, + content: { + text: 'Tell me about the Oceanfront Tower in Miami Beach' + } + }; + const nameResults = await knowledge.get(runtime, nameQuery); + console.log('Name Query Results:', nameResults); + console.log('Name Query Results Length:', nameResults.length); + console.log('Name Query Results Content:', nameResults[0].content.text); + + expect(nameResults.length).toBeGreaterThan(0); + expect(nameResults[0].content.text).toContain('Oceanfront Tower'); + + // Test location-based query + const locationQuery: Memory = { + agentId: runtime.agentId, + userId: runtime.agentId, + roomId: runtime.agentId, + content: { + text: 'show me oceanfront tower in miami beach' + } + }; + const locationResults = await knowledge.get(runtime, locationQuery); + + console.log('Location Query Results:', locationResults); + + expect(locationResults.length).toBeGreaterThan(0); + expect(locationResults[0].content.text).toContain('Miami Beach'); + + // Test property feature query + const featureQuery: Memory = { + agentId: runtime.agentId, + userId: runtime.agentId, + roomId: runtime.agentId, + content: { + text: 'Show me oceanfront tower in miami beach' + } + }; + console.log('Feature Query:', featureQuery); + const featureResults = await knowledge.get(runtime, featureQuery); + console.log('Feature Query Results:', featureResults); + expect(featureResults.length).toBeGreaterThan(0); + expect(featureResults[0].content.text).toContain('oceanfront'); + expect(featureResults[0].content.source).toBeDefined(); + }); +}); diff --git a/packages/plugin-unreal/unreal/version1/tests/property-database.test.ts b/packages/plugin-unreal/unreal/version1/tests/property-database.test.ts new file mode 100644 index 00000000..56730adb --- /dev/null +++ b/packages/plugin-unreal/unreal/version1/tests/property-database.test.ts @@ -0,0 +1,145 @@ +import { describe, test, expect, beforeAll, afterAll, beforeEach, afterEach } from 'vitest'; +import { LandDatabaseAdapter } from "../land_database_adapter"; +import { LandMemorySystem } from "../land_memory_system"; +import { + LandPlotMemory, + LandPlotMetadata, + ZoningType, + PlotSize, + BuildingType, + DistanceCategory, + LAND_TABLE, + LAND_ROOM_ID, + LAND_AGENT_ID +} from "../types"; +import { stringToUuid } from "@ai16z/eliza"; +import { printLandMemory } from "../logging"; + +describe('Land Plot Database Operations', () => { + let db: LandDatabaseAdapter; + let memorySystem: LandMemorySystem; + + // Mock embedder for testing + const mockEmbedder = { + embedText: async (text: string) => { + return new Array(1536).fill(0); // Mock embedding vector + } + }; + + beforeAll(async () => { + // Initialize database + db = new LandDatabaseAdapter({ + connectionString: process.env.POSTGRES_URL || 'postgresql://postgres:postgres@localhost:5432/test', + max: 20, + idleTimeoutMillis: 30000, + connectionTimeoutMillis: 2000, + }); + + await db.init(); + + // Initialize memory system + memorySystem = new LandMemorySystem(db, mockEmbedder); + }); + + afterAll(async () => { + await db.close(); + }); + + describe('Land Plot Creation', () => { + test('should create valid land plot memory', async () => { + const testMetadata: LandPlotMetadata = { + rank: 1, + name: 'Oceanview Residence', + neighborhood: 'Coastal District', + zoning: ZoningType.Residential, + plotSize: PlotSize.Large, + buildingType: BuildingType.MidRise, + distances: { + ocean: { + meters: 150, + category: DistanceCategory.Close + }, + bay: { + meters: 2000, + category: DistanceCategory.Far + } + }, + building: { + floors: { min: 5, max: 8 }, + height: { min: 15, max: 24 } + }, + plotArea: 2500 + }; + + const landMemory: LandPlotMemory = { + id: stringToUuid(`LAND_AGENT_ID-${Date.now()}`), //stringToUuid(Date.getTime()), //LAND_AGENT_ID, // TODO: stringToUuid(`LAND_AGENT_ID-${testMetadata.name}-${testMetadata.neighborhood}`), + userId: LAND_AGENT_ID, + roomId: LAND_ROOM_ID, + agentId: LAND_AGENT_ID, + content: { + text: `${testMetadata.name} is a ${testMetadata.plotSize} ${testMetadata.zoning} plot in ${testMetadata.neighborhood}`, + metadata: testMetadata + }, + embedding: await mockEmbedder.embedText(testMetadata.name), + }; + + await db.createLandMemory(landMemory); + + // Verify creation + const result = await db.getLandMemoryById(landMemory.id); + printLandMemory(result as LandPlotMemory); + + expect(result).toBeDefined(); + expect(result?.content.metadata.name).toBe('Oceanview Residence'); + expect(result?.content.metadata.plotSize).toBe(PlotSize.Large); + }); + }); + + describe('Land Plot Search', () => { + test('should find plots by neighborhood', async () => { + const searchParams = { + neighborhoods: ['Coastal District'] + }; + + const results = await db.searchLandByMetadata(searchParams); + + expect(results.length).toBeGreaterThan(0); + expect(results[0].content.metadata.neighborhood).toBe('Coastal District'); + }); + + test('should find plots by combined criteria', async () => { + const searchParams = { + neighborhoods: ['Coastal District'], + plotSizes: [PlotSize.Large], + distances: { + ocean: { + maxMeters: 200, + category: DistanceCategory.Close + } + } + }; + + const results = await db.searchLandByMetadata(searchParams); + + expect(results.length).toBeGreaterThan(0); + results.forEach(result => { + expect(result.content.metadata.neighborhood).toBe('Coastal District'); + expect(result.content.metadata.plotSize).toBe(PlotSize.Large); + expect(result.content.metadata.distances.ocean.meters).toBeLessThanOrEqual(200); + }); + }); + + test('should find plots by semantic search', async () => { + const query = "Large residential plot near the ocean"; + const results = await memorySystem.searchProperties(query); + + expect(results.length).toBeGreaterThan(0); + results.forEach(result => { + expect(result.content.metadata.plotSize).toBe(PlotSize.Large); + expect(result.content.metadata.zoning).toBe(ZoningType.Residential); + expect(result.content.metadata.distances.ocean.category).toBe(DistanceCategory.Close); + }); + }); + }); + +}); diff --git a/packages/plugin-unreal/unreal/version1/tests/unreal-agent2.test.ts b/packages/plugin-unreal/unreal/version1/tests/unreal-agent2.test.ts new file mode 100644 index 00000000..fe5acb87 --- /dev/null +++ b/packages/plugin-unreal/unreal/version1/tests/unreal-agent2.test.ts @@ -0,0 +1,174 @@ +import { AgentRuntime, knowledge, stringToUuid, KnowledgeItem, Memory, IMemoryManager, ModelProviderName, MemoryManager, embed } from "@ai16z/eliza"; +import { PostgresDatabaseAdapter } from "@ai16z/adapter-postgres"; +import dotenv from "dotenv"; +import { PropertyData } from "../types"; +import { UnrealAgent2 } from "../services/unreal-agent2"; +import { getEmbeddingConfig } from "@ai16z/eliza"; + +dotenv.config(); + +// Ensure we're using OpenAI embeddings +process.env.USE_OPENAI_EMBEDDING = 'true'; +process.env.USE_OLLAMA_EMBEDDING = 'false'; +process.env.EMBEDDING_OPENAI_MODEL = 'text-embedding-3-small'; + +describe('UnrealAgent2 Infrastructure', () => { + let runtime: AgentRuntime; + let db: PostgresDatabaseAdapter; + let agent: UnrealAgent2; + const agentId = '1459b245-2171-02f6-b436-c3c2641848e5'; + + beforeAll(async () => { + // Initialize database + db = new PostgresDatabaseAdapter({ + connectionString: process.env.POSTGRES_URL || 'postgresql://postgres:postgres@localhost:5432/test', + max: 20, + idleTimeoutMillis: 30000, + connectionTimeoutMillis: 2000, + }); + + // Initialize the database + await db.init(); + + // Create runtime with real database adapter + runtime = { + agentId: agentId, + serverUrl: 'http://localhost:3000', + databaseAdapter: db, + token: process.env.OPENAI_API_KEY, + modelProvider: 'openai' as ModelProviderName, + character: { + modelProvider: 'openai', + modelEndpointOverride: process.env.OPENAI_API_ENDPOINT, + }, + messageManager: { + getCachedEmbeddings: async () => [], + }, + memoryManager: new MemoryManager({ tableName: 'memories', runtime }), + documentsManager: new MemoryManager({ tableName: 'documents', runtime }), + knowledgeManager: new MemoryManager({ tableName: 'knowledge', runtime }), + getCachedEmbeddings: async () => { + return new Float32Array(1536).fill(0); + }, + }; + + // Set the runtime reference for memory managers + (runtime.memoryManager as MemoryManager).runtime = runtime; + (runtime.documentsManager as MemoryManager).runtime = runtime; + (runtime.knowledgeManager as MemoryManager).runtime = runtime; + + // Initialize UnrealAgent2 + agent = new UnrealAgent2(runtime); + await agent.initialize(); + }); + + afterAll(async () => { + await db.cleanup(); + }); + + describe('Runtime Setup', () => { + it('should initialize with correct embedding model', async () => { + const config = getEmbeddingConfig(); + expect(config.dimensions).toBe(1536); // OpenAI embedding size + expect(process.env.EMBEDDING_OPENAI_MODEL).toBe('text-embedding-3-small'); + }); + + it('should connect to vector database', async () => { + const testQuery = await db.query('SELECT NOW()'); + expect(testQuery.rows).toBeDefined(); + expect(testQuery.rows.length).toBe(1); + }); + + it('should handle configuration changes', async () => { + // Test changing embedding model + const originalModel = process.env.EMBEDDING_OPENAI_MODEL; + process.env.EMBEDDING_OPENAI_MODEL = 'text-embedding-3-large'; + + // Reinitialize agent + await agent.initialize(); + + // Verify agent adapted to new config + const newConfig = await agent.getConfig(); + expect(newConfig.embeddingModel).toBe('text-embedding-3-large'); + + // Reset for other tests + process.env.EMBEDDING_OPENAI_MODEL = originalModel; + await agent.initialize(); + }); + }); + + describe('Data Storage', () => { + let testProperty: PropertyData; + + beforeEach(() => { + testProperty = { + id: '1', + name: 'Oceanfront Tower', + neighborhood: 'Miami Beach', + zoningType: 'Mixed-Use', + plotSize: '0.5 acres', + buildingSize: '50000 sqft', + maxFloors: 40, + minFloors: 1, + plotArea: 21780, + maxBuildingHeight: 400, + minBuildingHeight: 15, + oceanDistanceMeters: 100, + bayDistanceMeters: 1000, + description: 'Luxury oceanfront development opportunity with stunning views', + market: { + isListed: true, + currentPrice: 25000000, + currency: 'USD', + marketplace: 'other', + lastUpdated: new Date() + } + }; + }); + + it('should store property with vector embeddings', async () => { + const result = await agent.storeProperty(testProperty); + expect(result.id).toBeDefined(); + expect(result.embedding).toBeDefined(); + expect(result.embedding.length).toBe(getEmbeddingConfig().dimensions); + }); + + it('should maintain property metadata', async () => { + const stored = await agent.storeProperty(testProperty); + const retrieved = await agent.getProperty(stored.id); + + expect(retrieved).toBeDefined(); + expect(retrieved.name).toBe(testProperty.name); + expect(retrieved.market.currentPrice).toBe(testProperty.market.currentPrice); + expect(retrieved.metadata).toBeDefined(); + expect(retrieved.metadata.createdAt).toBeDefined(); + expect(retrieved.metadata.version).toBe(1); + }); + + it('should handle data versioning', async () => { + // Store initial version + const v1 = await agent.storeProperty(testProperty); + + // Update property + const updatedProperty = { + ...testProperty, + market: { + ...testProperty.market, + currentPrice: 27000000 + } + }; + + const v2 = await agent.storeProperty(updatedProperty); + + // Verify versioning + expect(v2.metadata.version).toBe(2); + expect(v2.metadata.previousVersion).toBe(v1.id); + + // Get version history + const history = await agent.getPropertyHistory(v2.id); + expect(history.length).toBe(2); + expect(history[0].id).toBe(v2.id); + expect(history[1].id).toBe(v1.id); + }); + }); +}); diff --git a/packages/plugin-unreal/unreal/version1/types.ts b/packages/plugin-unreal/unreal/version1/types.ts new file mode 100644 index 00000000..73ba860d --- /dev/null +++ b/packages/plugin-unreal/unreal/version1/types.ts @@ -0,0 +1,113 @@ +import { Memory, UUID } from "@ai16z/eliza"; + +export enum PlotSize { + Nano = 'Nano', + Micro = 'Micro', + Small = 'Small', + Medium = 'Medium', + Large = 'Large', + Mega = 'Mega', + Giga = 'Giga' +} + +export enum ZoningType { + Residential = 'Residential', + Commercial = 'Commercial', + Industrial = 'Industrial', + Mixed = 'Mixed', + Special = 'Special', + Legendary = 'Legendary' +} + +export enum BuildingType { + LowRise = 'LowRise', + MidRise = 'MidRise', + HighRise = 'HighRise', + Skyscraper = 'Skyscraper', + Megascraper = 'Megascraper' +} + +export enum DistanceCategory { + Close = 'Close', + Medium = 'Medium', + Far = 'Far' +} + +export interface LandPlotMetadata { + rank: number; + name: string; + neighborhood: string; + zoning: ZoningType; + plotSize: PlotSize; + buildingType: BuildingType; + distances: { + ocean: { + meters: number; + category: DistanceCategory; + }; + bay: { + meters: number; + category: DistanceCategory; + }; + }; + building: { + floors: { + min: number; + max: number; + }; + height: { + min: number; + max: number; + }; + }; + plotArea: number; +} + +export interface LandPlotMemory extends Memory { + id: UUID; + content: { + text: string; + metadata: LandPlotMetadata; + }; +} + +export interface LandSearchParams { + neighborhoods?: string[]; + zoningTypes?: ZoningType[]; + plotSizes?: PlotSize[]; + buildingTypes?: BuildingType[]; + distances?: { + ocean?: { + maxMeters?: number; + category?: DistanceCategory; + }; + bay?: { + maxMeters?: number; + category?: DistanceCategory; + }; + }; + building?: { + floors?: { + min?: number; + max?: number; + }; + height?: { + min?: number; + max?: number; + }; + }; + rarity?: { + rankRange?: { + min?: number; + max?: number; + }; + }; +} + +// Constants +export const AGENT_ID: `${string}-${string}-${string}-${string}-${string}` = '1459b245-2171-02f6-b436-c3c2641848e5'; +export const LAND_TABLE = 'land_memories'; +export const LAND_ROOM_ID = AGENT_ID; +export const LAND_AGENT_ID = AGENT_ID; +export const DEFAULT_MATCH_THRESHOLD = 0.75; +export const DEFAULT_MATCH_COUNT = 20; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f7b6ec4e..b8fe8d89 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -14,6 +14,9 @@ importers: '@0glabs/0g-ts-sdk': specifier: 0.2.1 version: 0.2.1(bufferutil@4.0.8)(ethers@6.13.4(bufferutil@4.0.8)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) + '@ai16z/plugin-unreal': + specifier: workspace:* + version: link:packages/plugin-unreal '@coinbase/coinbase-sdk': specifier: 0.10.0 version: 0.10.0(bufferutil@4.0.8)(typescript@5.6.3)(utf-8-validate@5.0.10)(zod@3.23.8) @@ -1722,6 +1725,21 @@ importers: specifier: 3.2.0 version: 3.2.0 + packages/plugin-unreal: + dependencies: + '@ai16z/adapter-postgres': + specifier: workspace:* + version: link:../adapter-postgres + '@ai16z/eliza': + specifier: workspace:* + version: link:../core + tsup: + specifier: 8.3.5 + version: 8.3.5(@swc/core@1.10.1(@swc/helpers@0.5.15))(jiti@2.4.2)(postcss@8.4.49)(tsx@4.19.2)(typescript@5.6.3)(yaml@2.6.1) + whatwg-url: + specifier: 7.1.0 + version: 7.1.0 + packages/plugin-video-generation: dependencies: '@ai16z/eliza':