htag-sdk 0.7.1 → 0.8.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -28,6 +28,7 @@ __export(index_exports, {
28
28
  MarketsClient: () => MarketsClient,
29
29
  PropertyClient: () => PropertyClient,
30
30
  RateLimitError: () => RateLimitError,
31
+ ReferenceClient: () => ReferenceClient,
31
32
  ServerError: () => ServerError,
32
33
  TrendsClient: () => TrendsClient,
33
34
  ValidationError: () => ValidationError
@@ -326,12 +327,12 @@ var AddressClient = class {
326
327
  /**
327
328
  * Retrieve detailed insights for one or more addresses.
328
329
  *
329
- * `GET /v1/address/insights`
330
+ * `GET /internal-api/v1/address/insights`
330
331
  */
331
332
  async insights(params) {
332
333
  const { signal, ...query } = params;
333
334
  const qs = buildQueryString(query);
334
- return this.http.get(`/v1/address/insights${qs}`, { signal });
335
+ return this.http.internalGet(`/internal-api/v1/address/insights${qs}`, { signal });
335
336
  }
336
337
  /**
337
338
  * Standardise a batch of raw address strings into structured records.
@@ -346,6 +347,36 @@ var AddressClient = class {
346
347
  { signal }
347
348
  );
348
349
  }
350
+ /**
351
+ * Geocode an address string to structured location data.
352
+ *
353
+ * `GET /v1/address/geocode`
354
+ */
355
+ async geocode(params) {
356
+ const { signal, ...query } = params;
357
+ const qs = buildQueryString(query);
358
+ return this.http.get(`/v1/address/geocode${qs}`, { signal });
359
+ }
360
+ /**
361
+ * Retrieve environmental data (flood, bushfire, heritage, zoning) for addresses.
362
+ *
363
+ * `GET /v1/address/environment`
364
+ */
365
+ async environment(params) {
366
+ const { signal, ...query } = params;
367
+ const qs = buildQueryString(query);
368
+ return this.http.get(`/v1/address/environment${qs}`, { signal });
369
+ }
370
+ /**
371
+ * Retrieve demographic data (SEIFA indices, housing tenure) for addresses.
372
+ *
373
+ * `GET /v1/address/demographics`
374
+ */
375
+ async demographics(params) {
376
+ const { signal, ...query } = params;
377
+ const qs = buildQueryString(query);
378
+ return this.http.get(`/v1/address/demographics${qs}`, { signal });
379
+ }
349
380
  };
350
381
 
351
382
  // src/property/client.ts
@@ -444,6 +475,46 @@ var TrendsClient = class {
444
475
  async demandProfile(params) {
445
476
  return this.publicTrend("demand-profile", params);
446
477
  }
478
+ /**
479
+ * Stock on market trends.
480
+ *
481
+ * `GET /v1/markets/trends/stock-on-market`
482
+ */
483
+ async stockOnMarket(params) {
484
+ return this.publicTrend("stock-on-market", params);
485
+ }
486
+ /**
487
+ * Inventory trends.
488
+ *
489
+ * `GET /v1/markets/trends/inventory`
490
+ */
491
+ async inventory(params) {
492
+ return this.publicTrend("inventory", params);
493
+ }
494
+ /**
495
+ * Days on market trends.
496
+ *
497
+ * `GET /v1/markets/trends/days-on-market`
498
+ */
499
+ async daysOnMarket(params) {
500
+ return this.publicTrend("days-on-market", params);
501
+ }
502
+ /**
503
+ * Clearance rate trends.
504
+ *
505
+ * `GET /v1/markets/trends/clearance-rate`
506
+ */
507
+ async clearanceRate(params) {
508
+ return this.publicTrend("clearance-rate", params);
509
+ }
510
+ /**
511
+ * Vacancy rate trends.
512
+ *
513
+ * `GET /v1/markets/trends/vacancy`
514
+ */
515
+ async vacancy(params) {
516
+ return this.publicTrend("vacancy", params);
517
+ }
447
518
  // -----------------------------------------------------------------------
448
519
  // Shared implementation
449
520
  // -----------------------------------------------------------------------
@@ -499,6 +570,129 @@ var MarketsClient = class {
499
570
  options
500
571
  );
501
572
  }
573
+ // -------------------------------------------------------------------------
574
+ // Public market snapshot endpoints (/v1/markets/*)
575
+ // -------------------------------------------------------------------------
576
+ /**
577
+ * Cumulative growth metrics.
578
+ *
579
+ * `GET /v1/markets/growth/cumulative`
580
+ */
581
+ async growthCumulative(params) {
582
+ const { signal, ...query } = params;
583
+ const qs = buildQueryString(query);
584
+ return this.http.get(`/v1/markets/growth/cumulative${qs}`, { signal });
585
+ }
586
+ /**
587
+ * Annualised growth metrics.
588
+ *
589
+ * `GET /v1/markets/growth/annualised`
590
+ */
591
+ async growthAnnualised(params) {
592
+ const { signal, ...query } = params;
593
+ const qs = buildQueryString(query);
594
+ return this.http.get(`/v1/markets/growth/annualised${qs}`, { signal });
595
+ }
596
+ /**
597
+ * Supply metrics.
598
+ *
599
+ * `GET /v1/markets/supply`
600
+ */
601
+ async supply(params) {
602
+ const { signal, ...query } = params;
603
+ const qs = buildQueryString(query);
604
+ return this.http.get(`/v1/markets/supply${qs}`, { signal });
605
+ }
606
+ /**
607
+ * Supply long-term slope metrics.
608
+ *
609
+ * `GET /v1/markets/supply/ls`
610
+ */
611
+ async supplyLongSlope(params) {
612
+ const { signal, ...query } = params;
613
+ const qs = buildQueryString(query);
614
+ return this.http.get(`/v1/markets/supply/ls${qs}`, { signal });
615
+ }
616
+ /**
617
+ * Supply short-term slope metrics.
618
+ *
619
+ * `GET /v1/markets/supply/ss`
620
+ */
621
+ async supplyShortSlope(params) {
622
+ const { signal, ...query } = params;
623
+ const qs = buildQueryString(query);
624
+ return this.http.get(`/v1/markets/supply/ss${qs}`, { signal });
625
+ }
626
+ /**
627
+ * Demand metrics.
628
+ *
629
+ * `GET /v1/markets/demand`
630
+ */
631
+ async demand(params) {
632
+ const { signal, ...query } = params;
633
+ const qs = buildQueryString(query);
634
+ return this.http.get(`/v1/markets/demand${qs}`, { signal });
635
+ }
636
+ /**
637
+ * Demand long-term slope metrics.
638
+ *
639
+ * `GET /v1/markets/demand/ls`
640
+ */
641
+ async demandLongSlope(params) {
642
+ const { signal, ...query } = params;
643
+ const qs = buildQueryString(query);
644
+ return this.http.get(`/v1/markets/demand/ls${qs}`, { signal });
645
+ }
646
+ /**
647
+ * Demand short-term slope metrics.
648
+ *
649
+ * `GET /v1/markets/demand/ss`
650
+ */
651
+ async demandShortSlope(params) {
652
+ const { signal, ...query } = params;
653
+ const qs = buildQueryString(query);
654
+ return this.http.get(`/v1/markets/demand/ss${qs}`, { signal });
655
+ }
656
+ /**
657
+ * Market scores (RCS, HAPI, volatility).
658
+ *
659
+ * `GET /v1/markets/scores`
660
+ */
661
+ async scores(params) {
662
+ const { signal, ...query } = params;
663
+ const qs = buildQueryString(query);
664
+ return this.http.get(`/v1/markets/scores${qs}`, { signal });
665
+ }
666
+ /**
667
+ * Market fundamentals (IRSAD, ratios, years to own).
668
+ *
669
+ * `GET /v1/markets/fundamentals`
670
+ */
671
+ async fundamentals(params) {
672
+ const { signal, ...query } = params;
673
+ const qs = buildQueryString(query);
674
+ return this.http.get(`/v1/markets/fundamentals${qs}`, { signal });
675
+ }
676
+ /**
677
+ * Market cycle indicators.
678
+ *
679
+ * `GET /v1/markets/cycle`
680
+ */
681
+ async cycle(params) {
682
+ const { signal, ...query } = params;
683
+ const qs = buildQueryString(query);
684
+ return this.http.get(`/v1/markets/cycle${qs}`, { signal });
685
+ }
686
+ /**
687
+ * Market risk indicators (flood, fire, diversity, distance).
688
+ *
689
+ * `GET /v1/markets/risk`
690
+ */
691
+ async risk(params) {
692
+ const { signal, ...query } = params;
693
+ const qs = buildQueryString(query);
694
+ return this.http.get(`/v1/markets/risk${qs}`, { signal });
695
+ }
502
696
  };
503
697
 
504
698
  // src/intent-hub/client.ts
@@ -746,6 +940,23 @@ var IntentHubClient = class {
746
940
  }
747
941
  };
748
942
 
943
+ // src/reference/client.ts
944
+ var ReferenceClient = class {
945
+ constructor(http) {
946
+ this.http = http;
947
+ }
948
+ async locality(params) {
949
+ const { signal, ...query } = params;
950
+ const qs = buildQueryString(query);
951
+ return this.http.get(`/v1/reference/locality${qs}`, { signal });
952
+ }
953
+ async lga(params) {
954
+ const { signal, ...query } = params;
955
+ const qs = buildQueryString(query);
956
+ return this.http.get(`/v1/reference/lga${qs}`, { signal });
957
+ }
958
+ };
959
+
749
960
  // src/client.ts
750
961
  var DEFAULT_MAX_RETRIES = 3;
751
962
  var DEFAULT_RETRY_BASE_DELAY = 500;
@@ -772,6 +983,8 @@ var HtAgApiClient = class {
772
983
  markets;
773
984
  /** Intent Hub: event classification, integrations and subscriptions. */
774
985
  intentHub;
986
+ /** Reference data: localities and LGAs. */
987
+ reference;
775
988
  constructor(options) {
776
989
  if (!options.apiKey) {
777
990
  throw new Error(
@@ -793,6 +1006,7 @@ var HtAgApiClient = class {
793
1006
  this.property = new PropertyClient(http);
794
1007
  this.markets = new MarketsClient(http);
795
1008
  this.intentHub = new IntentHubClient(http);
1009
+ this.reference = new ReferenceClient(http);
796
1010
  }
797
1011
  };
798
1012
  // Annotate the CommonJS export names for ESM import in node:
@@ -805,6 +1019,7 @@ var HtAgApiClient = class {
805
1019
  MarketsClient,
806
1020
  PropertyClient,
807
1021
  RateLimitError,
1022
+ ReferenceClient,
808
1023
  ServerError,
809
1024
  TrendsClient,
810
1025
  ValidationError
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/errors.ts","../src/http.ts","../src/address/client.ts","../src/property/client.ts","../src/markets/trends.ts","../src/markets/client.ts","../src/intent-hub/client.ts","../src/client.ts"],"sourcesContent":["// ---------------------------------------------------------------------------\n// @htag/sdk — Official TypeScript SDK for HtAG Location Intelligence APIs\n// ---------------------------------------------------------------------------\n\n// Main client\nexport { HtAgApiClient } from './client.js';\n\n// Configuration types\nexport type {\n HtAgClientOptions,\n ResolvedConfig,\n BaseResponse,\n RequestOptions,\n LevelEnum,\n PropertyTypeEnum,\n} from './types.js';\n\n// Error classes\nexport {\n HtAgError,\n AuthenticationError,\n RateLimitError,\n ValidationError,\n ServerError,\n} from './errors.js';\n\n// Address domain\nexport { AddressClient } from './address/index.js';\nexport type {\n AddressRecord,\n AddressSearchResult,\n AddressSearchParams,\n AddressSearchResponse,\n AddressInsightsParams,\n AddressInsightsResponse,\n BatchStandardiseParams,\n BatchStandardiseResponse,\n StandardisedAddress,\n} from './address/index.js';\n\n// Property domain\nexport { PropertyClient } from './property/index.js';\nexport type {\n SoldPropertyRecord,\n SoldSearchParams,\n SoldPropertiesResponse,\n} from './property/index.js';\n\n// Markets domain\nexport { MarketsClient, TrendsClient } from './markets/index.js';\nexport type {\n MarketSnapshot,\n PriceHistoryOut,\n RentHistoryOut,\n YieldHistoryOut,\n FSDMonthlyOut,\n FSDQuarterlyOut,\n FSDYearlyOut,\n EssentialsOut,\n GRCOut,\n DemandProfileOut,\n LogicNode,\n AdvancedSearchBody,\n SnapshotsParams,\n MarketQueryParams,\n TrendsParams,\n TrendsWithBedroomsParams,\n SnapshotsResponse,\n MarketQueryResponse,\n PriceResponse,\n RentResponse,\n YieldResponse,\n SupplyDemandResponse,\n SearchIndexResponse,\n HoldPeriodResponse,\n PerformanceResponse,\n GrowthRatesResponse,\n DemandProfileResponse,\n} from './markets/index.js';\n\n// Intent Hub domain\nexport { IntentHubClient } from './intent-hub/index.js';\nexport type {\n SourceType,\n IntegrationType,\n IntegrationStatus,\n Sentiment,\n Urgency,\n SubmitEventParams,\n ClassifiedEvent,\n QueryEventsParams,\n PaginatedEvents,\n CreateIntegrationParams,\n UpdateIntegrationParams,\n Integration,\n TestResult,\n CreateSubscriptionParams,\n UpdateSubscriptionParams,\n Subscription,\n EventCategory,\n EventType,\n TagInfo,\n} from './intent-hub/index.js';\n","/**\n * Base error class for all HtAG SDK errors.\n */\nexport class HtAgError extends Error {\n /** HTTP status code, if available. */\n readonly status: number | undefined;\n\n /** Raw response body, if available. */\n readonly body: unknown;\n\n /** The request URL that caused the error. */\n readonly url: string | undefined;\n\n constructor(\n message: string,\n options?: {\n status?: number;\n body?: unknown;\n url?: string;\n cause?: unknown;\n },\n ) {\n super(message, { cause: options?.cause });\n this.name = 'HtAgError';\n this.status = options?.status;\n this.body = options?.body;\n this.url = options?.url;\n }\n}\n\n/**\n * Thrown when the server returns 401 or 403.\n */\nexport class AuthenticationError extends HtAgError {\n constructor(options: { status: number; body: unknown; url: string }) {\n super(\n `Authentication failed (HTTP ${options.status}). Check your API key.`,\n options,\n );\n this.name = 'AuthenticationError';\n }\n}\n\n/**\n * Thrown when the server returns 429 after exhausting all retries.\n */\nexport class RateLimitError extends HtAgError {\n constructor(options: { body: unknown; url: string }) {\n super('Rate limit exceeded. Please retry after a short delay.', {\n status: 429,\n ...options,\n });\n this.name = 'RateLimitError';\n }\n}\n\n/**\n * Thrown when the server returns 400 or 422.\n */\nexport class ValidationError extends HtAgError {\n constructor(options: { status: number; body: unknown; url: string }) {\n const detail = extractDetail(options.body);\n super(\n detail\n ? `Validation error (HTTP ${options.status}): ${detail}`\n : `Validation error (HTTP ${options.status})`,\n options,\n );\n this.name = 'ValidationError';\n }\n}\n\n/**\n * Thrown when the server returns a 5xx status after exhausting all retries.\n */\nexport class ServerError extends HtAgError {\n constructor(options: { status: number; body: unknown; url: string }) {\n super(`Server error (HTTP ${options.status})`, options);\n this.name = 'ServerError';\n }\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction extractDetail(body: unknown): string | undefined {\n if (body && typeof body === 'object' && 'detail' in body) {\n const detail = (body as Record<string, unknown>).detail;\n if (typeof detail === 'string') return detail;\n if (Array.isArray(detail)) {\n return detail\n .map((d) => {\n if (typeof d === 'string') return d;\n if (d && typeof d === 'object' && 'msg' in d) return String(d.msg);\n return JSON.stringify(d);\n })\n .join('; ');\n }\n return JSON.stringify(detail);\n }\n return undefined;\n}\n","import type { ResolvedConfig, RequestOptions } from './types.js';\nimport {\n HtAgError,\n AuthenticationError,\n RateLimitError,\n ValidationError,\n ServerError,\n} from './errors.js';\n\n// ---------------------------------------------------------------------------\n// camelCase -> snake_case conversion\n// ---------------------------------------------------------------------------\n\n/**\n * Convert a camelCase string to snake_case.\n *\n * Handles sequences of uppercase letters correctly:\n * - \"areaId\" -> \"area_id\"\n * - \"periodEndMin\" -> \"period_end_min\"\n * - \"IRSD\" -> \"irsd\" (all-caps treated as one token)\n */\nfunction toSnakeCase(str: string): string {\n return str\n .replace(/([A-Z]+)([A-Z][a-z])/g, '$1_$2')\n .replace(/([a-z0-9])([A-Z])/g, '$1_$2')\n .toLowerCase();\n}\n\n// ---------------------------------------------------------------------------\n// Query-string builder\n// ---------------------------------------------------------------------------\n\n/**\n * Build a URL query string from a params object, converting camelCase keys\n * to snake_case. Arrays are joined with commas. `undefined` and `null` values\n * are omitted.\n */\nexport function buildQueryString(\n params: Record<string, unknown>,\n): string {\n const parts: string[] = [];\n\n for (const [key, value] of Object.entries(params)) {\n // Skip internal SDK options that are not API params.\n if (key === 'signal') continue;\n if (value === undefined || value === null) continue;\n\n const snakeKey = toSnakeCase(key);\n\n if (Array.isArray(value)) {\n if (value.length > 0) {\n parts.push(\n `${encodeURIComponent(snakeKey)}=${encodeURIComponent(value.join(','))}`,\n );\n }\n } else {\n parts.push(\n `${encodeURIComponent(snakeKey)}=${encodeURIComponent(String(value))}`,\n );\n }\n }\n\n return parts.length > 0 ? `?${parts.join('&')}` : '';\n}\n\n// ---------------------------------------------------------------------------\n// Retryable HTTP client\n// ---------------------------------------------------------------------------\n\nfunction isRetryable(status: number): boolean {\n return status === 429 || status >= 500;\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\n/**\n * Parse the body of a response. Returns the parsed JSON on success or a string\n * representation when parsing fails.\n */\nasync function parseBody(response: Response): Promise<unknown> {\n const contentType = response.headers.get('content-type') ?? '';\n if (contentType.includes('application/json')) {\n try {\n return await response.json();\n } catch {\n return await response.text();\n }\n }\n return await response.text();\n}\n\n/**\n * Throw the appropriate typed error for the given HTTP status.\n */\nfunction throwForStatus(\n status: number,\n body: unknown,\n url: string,\n): never {\n if (status === 401 || status === 403) {\n throw new AuthenticationError({ status, body, url });\n }\n if (status === 429) {\n throw new RateLimitError({ body, url });\n }\n if (status === 400 || status === 422) {\n throw new ValidationError({ status, body, url });\n }\n if (status >= 500) {\n throw new ServerError({ status, body, url });\n }\n throw new HtAgError(`HTTP ${status}`, { status, body, url });\n}\n\n/**\n * Internal HTTP transport used by all domain clients.\n */\nexport class HttpClient {\n constructor(private readonly config: ResolvedConfig) {}\n\n /**\n * Execute a GET request against the public API base.\n */\n async get<T>(path: string, options?: RequestOptions): Promise<T> {\n return this.request<T>('GET', this.config.publicBaseUrl + path, undefined, options);\n }\n\n /**\n * Execute a POST request against the public API base.\n */\n async post<T>(\n path: string,\n body: unknown,\n options?: RequestOptions,\n ): Promise<T> {\n return this.request<T>('POST', this.config.publicBaseUrl + path, body, options);\n }\n\n /**\n * Execute a PATCH request against the public API base.\n */\n async patch<T>(\n path: string,\n body: unknown,\n options?: RequestOptions,\n ): Promise<T> {\n return this.request<T>('PATCH', this.config.publicBaseUrl + path, body, options);\n }\n\n /**\n * Execute a DELETE request against the public API base.\n */\n async delete<T>(path: string, options?: RequestOptions): Promise<T> {\n return this.request<T>('DELETE', this.config.publicBaseUrl + path, undefined, options);\n }\n\n /**\n * Execute a GET request against the internal API base.\n */\n async internalGet<T>(path: string, options?: RequestOptions): Promise<T> {\n return this.request<T>('GET', this.config.internalBaseUrl + path, undefined, options);\n }\n\n /**\n * Execute a POST request against the internal API base.\n */\n async internalPost<T>(\n path: string,\n body: unknown,\n options?: RequestOptions,\n ): Promise<T> {\n return this.request<T>('POST', this.config.internalBaseUrl + path, body, options);\n }\n\n /**\n * Execute a GET request against the Intent Hub API base.\n */\n async intentHubGet<T>(path: string, options?: RequestOptions): Promise<T> {\n return this.request<T>('GET', this.config.intentHubBaseUrl + path, undefined, options);\n }\n\n /**\n * Execute a POST request against the Intent Hub API base.\n */\n async intentHubPost<T>(\n path: string,\n body: unknown,\n options?: RequestOptions,\n ): Promise<T> {\n return this.request<T>('POST', this.config.intentHubBaseUrl + path, body, options);\n }\n\n /**\n * Execute a PATCH request against the Intent Hub API base.\n */\n async intentHubPatch<T>(\n path: string,\n body: unknown,\n options?: RequestOptions,\n ): Promise<T> {\n return this.request<T>('PATCH', this.config.intentHubBaseUrl + path, body, options);\n }\n\n /**\n * Execute a DELETE request against the Intent Hub API base.\n */\n async intentHubDelete<T>(path: string, options?: RequestOptions): Promise<T> {\n return this.request<T>('DELETE', this.config.intentHubBaseUrl + path, undefined, options);\n }\n\n // -----------------------------------------------------------------------\n // Core request implementation with retries and exponential backoff\n // -----------------------------------------------------------------------\n\n private async request<T>(\n method: string,\n url: string,\n body: unknown,\n options?: RequestOptions,\n ): Promise<T> {\n const headers: Record<string, string> = {\n 'x-api-key': this.config.apiKey,\n 'accept': 'application/json',\n };\n\n if (body !== undefined) {\n headers['content-type'] = 'application/json';\n }\n\n let lastError: Error | undefined;\n\n for (let attempt = 0; attempt <= this.config.maxRetries; attempt++) {\n // If this is a retry, wait with exponential backoff + jitter.\n if (attempt > 0) {\n const base = this.config.retryBaseDelay * Math.pow(2, attempt - 1);\n const jitter = Math.random() * base * 0.5;\n await sleep(base + jitter);\n }\n\n // Build an AbortController that combines the user signal with a timeout.\n const controller = new AbortController();\n let timeoutId: ReturnType<typeof setTimeout> | undefined;\n\n const cleanup = () => {\n if (timeoutId !== undefined) clearTimeout(timeoutId);\n };\n\n // Wire up caller's abort signal.\n if (options?.signal) {\n if (options.signal.aborted) {\n throw new HtAgError('Request aborted', {\n url,\n cause: options.signal.reason,\n });\n }\n options.signal.addEventListener('abort', () => controller.abort(options.signal!.reason), {\n once: true,\n });\n }\n\n timeoutId = setTimeout(\n () => controller.abort(new Error('Request timed out')),\n this.config.timeout,\n );\n\n try {\n const response = await fetch(url, {\n method,\n headers,\n body: body !== undefined ? JSON.stringify(body) : undefined,\n signal: controller.signal,\n });\n\n cleanup();\n\n if (response.ok) {\n // 204 No Content — nothing to parse.\n if (response.status === 204) {\n return undefined as T;\n }\n return (await parseBody(response)) as T;\n }\n\n const responseBody = await parseBody(response);\n\n // Retry on retryable statuses, unless we've exhausted retries.\n if (isRetryable(response.status) && attempt < this.config.maxRetries) {\n lastError = new HtAgError(`HTTP ${response.status}`, {\n status: response.status,\n body: responseBody,\n url,\n });\n continue;\n }\n\n // Non-retryable or exhausted retries — throw typed error.\n throwForStatus(response.status, responseBody, url);\n } catch (err) {\n cleanup();\n\n // Re-throw our own typed errors.\n if (err instanceof HtAgError) {\n throw err;\n }\n\n // Handle abort / timeout.\n if (err instanceof DOMException && err.name === 'AbortError') {\n if (options?.signal?.aborted) {\n throw new HtAgError('Request aborted', { url, cause: err });\n }\n throw new HtAgError('Request timed out', { url, cause: err });\n }\n\n // Network / fetch errors — retry if we have attempts left.\n if (attempt < this.config.maxRetries) {\n lastError = err instanceof Error ? err : new Error(String(err));\n continue;\n }\n\n throw new HtAgError(\n `Network error: ${err instanceof Error ? err.message : String(err)}`,\n { url, cause: err },\n );\n }\n }\n\n // Should not reach here, but just in case.\n throw lastError ?? new HtAgError('Request failed after retries', { url });\n }\n}\n","import type { HttpClient } from '../http.js';\nimport { buildQueryString } from '../http.js';\nimport type {\n AddressSearchParams,\n AddressSearchResponse,\n AddressInsightsParams,\n AddressInsightsResponse,\n BatchStandardiseParams,\n BatchStandardiseResponse,\n} from './types.js';\n\n/**\n * Client for the Address API domain.\n *\n * ```ts\n * const results = await client.address.search({ q: '100 George St Sydney' });\n * ```\n */\nexport class AddressClient {\n /** @internal */\n constructor(private readonly http: HttpClient) {}\n\n /**\n * Search for addresses matching a free-text query.\n *\n * `GET /v1/address/search`\n */\n async search(params: AddressSearchParams): Promise<AddressSearchResponse> {\n const { signal, ...query } = params;\n const qs = buildQueryString(query);\n return this.http.get<AddressSearchResponse>(`/v1/address/search${qs}`, { signal });\n }\n\n /**\n * Retrieve detailed insights for one or more addresses.\n *\n * `GET /v1/address/insights`\n */\n async insights(params: AddressInsightsParams): Promise<AddressInsightsResponse> {\n const { signal, ...query } = params;\n const qs = buildQueryString(query);\n return this.http.get<AddressInsightsResponse>(`/v1/address/insights${qs}`, { signal });\n }\n\n /**\n * Standardise a batch of raw address strings into structured records.\n *\n * `POST /v1/address/standardise`\n */\n async standardise(params: BatchStandardiseParams): Promise<BatchStandardiseResponse> {\n const { signal, addresses } = params;\n return this.http.post<BatchStandardiseResponse>(\n '/v1/address/standardise',\n { addresses },\n { signal },\n );\n }\n}\n","import type { HttpClient } from '../http.js';\nimport { buildQueryString } from '../http.js';\nimport type {\n SoldSearchParams,\n SoldPropertiesResponse,\n} from './types.js';\n\n/**\n * Client for the Property API domain.\n *\n * ```ts\n * const sold = await client.property.soldSearch({ address: '100 George St Sydney', radius: 2000 });\n * ```\n */\nexport class PropertyClient {\n /** @internal */\n constructor(private readonly http: HttpClient) {}\n\n /**\n * Search for recently sold properties near a location.\n *\n * `GET /v1/property/sold/search`\n */\n async soldSearch(params: SoldSearchParams): Promise<SoldPropertiesResponse> {\n const { signal, ...query } = params;\n const qs = buildQueryString(query);\n return this.http.get<SoldPropertiesResponse>(`/v1/property/sold/search${qs}`, { signal });\n }\n}\n","import type { HttpClient } from '../http.js';\nimport { buildQueryString } from '../http.js';\nimport type {\n TrendsParams,\n TrendsWithBedroomsParams,\n PriceResponse,\n RentResponse,\n YieldResponse,\n SupplyDemandResponse,\n SearchIndexResponse,\n HoldPeriodResponse,\n PerformanceResponse,\n GrowthRatesResponse,\n DemandProfileResponse,\n} from './types.js';\n\n/**\n * Client for the Markets Trends API domain.\n *\n * Each method queries a specific time-series metric:\n *\n * ```ts\n * const prices = await client.markets.trends.price({\n * level: 'suburb',\n * areaId: ['SAL10001'],\n * propertyType: ['house'],\n * });\n * ```\n */\nexport class TrendsClient {\n /** @internal */\n constructor(private readonly http: HttpClient) {}\n\n /**\n * Price history trends.\n *\n * `GET /internal-api/v1/markets/trends/price`\n */\n async price(params: TrendsWithBedroomsParams): Promise<PriceResponse> {\n return this.trend<PriceResponse>('price', params);\n }\n\n /**\n * Rent history trends.\n *\n * `GET /v1/markets/trends/rent`\n */\n async rent(params: TrendsWithBedroomsParams): Promise<RentResponse> {\n return this.publicTrend<RentResponse>('rent', params);\n }\n\n /**\n * Yield history trends.\n *\n * `GET /v1/markets/trends/yield`\n */\n async yieldHistory(params: TrendsWithBedroomsParams): Promise<YieldResponse> {\n return this.publicTrend<YieldResponse>('yield', params);\n }\n\n /**\n * Supply and demand (monthly frequency).\n *\n * `GET /internal-api/v1/markets/trends/supply-demand`\n */\n async supplyDemand(params: TrendsWithBedroomsParams): Promise<SupplyDemandResponse> {\n return this.trend<SupplyDemandResponse>('supply-demand', params);\n }\n\n /**\n * Search interest index (quarterly frequency).\n *\n * `GET /internal-api/v1/markets/trends/search-index`\n */\n async searchIndex(params: TrendsParams): Promise<SearchIndexResponse> {\n return this.trend<SearchIndexResponse>('search-index', params);\n }\n\n /**\n * Hold period (yearly frequency).\n *\n * `GET /internal-api/v1/markets/trends/hold-period`\n */\n async holdPeriod(params: TrendsParams): Promise<HoldPeriodResponse> {\n return this.trend<HoldPeriodResponse>('hold-period', params);\n }\n\n /**\n * Performance essentials.\n *\n * `GET /internal-api/v1/markets/trends/performance`\n */\n async performance(params: TrendsWithBedroomsParams): Promise<PerformanceResponse> {\n return this.trend<PerformanceResponse>('performance', params);\n }\n\n /**\n * Growth rate cycle.\n *\n * `GET /v1/markets/trends/growth-rates`\n */\n async growthRates(params: TrendsParams): Promise<GrowthRatesResponse> {\n return this.publicTrend<GrowthRatesResponse>('growth-rates', params);\n }\n\n /**\n * Demand profile breakdown.\n *\n * `GET /v1/markets/trends/demand-profile`\n */\n async demandProfile(params: TrendsParams): Promise<DemandProfileResponse> {\n return this.publicTrend<DemandProfileResponse>('demand-profile', params);\n }\n\n // -----------------------------------------------------------------------\n // Shared implementation\n // -----------------------------------------------------------------------\n\n private async trend<T>(metric: string, params: TrendsParams | TrendsWithBedroomsParams): Promise<T> {\n const { signal, ...query } = params;\n const qs = buildQueryString(query);\n return this.http.internalGet<T>(\n `/internal-api/v1/markets/trends/${metric}${qs}`,\n { signal },\n );\n }\n\n private async publicTrend<T>(metric: string, params: TrendsParams | TrendsWithBedroomsParams): Promise<T> {\n const { signal, ...query } = params;\n const qs = buildQueryString(query);\n return this.http.get<T>(\n `/v1/markets/trends/${metric}${qs}`,\n { signal },\n );\n }\n}\n","import type { HttpClient } from '../http.js';\nimport { buildQueryString } from '../http.js';\nimport { TrendsClient } from './trends.js';\nimport type {\n SnapshotsParams,\n SnapshotsResponse,\n AdvancedSearchBody,\n MarketQueryResponse,\n} from './types.js';\nimport type { RequestOptions } from '../types.js';\n\n/**\n * Client for the Markets API domain.\n *\n * ```ts\n * const snapshots = await client.markets.snapshots({\n * level: 'suburb',\n * propertyType: ['house'],\n * });\n *\n * const prices = await client.markets.trends.price({\n * level: 'suburb',\n * areaId: ['SAL10001'],\n * });\n * ```\n */\nexport class MarketsClient {\n /** Sub-client for time-series trend endpoints. */\n readonly trends: TrendsClient;\n\n /** @internal */\n constructor(private readonly http: HttpClient) {\n this.trends = new TrendsClient(http);\n }\n\n /**\n * Retrieve market snapshot data with optional filters.\n *\n * `GET /internal-api/v1/markets/snapshots`\n */\n async snapshots(params: SnapshotsParams): Promise<SnapshotsResponse> {\n const { signal, ...query } = params;\n const qs = buildQueryString(query);\n return this.http.internalGet<SnapshotsResponse>(\n `/internal-api/v1/markets/snapshots${qs}`,\n { signal },\n );\n }\n\n /**\n * Advanced market query with logical filter expressions.\n *\n * `POST /internal-api/v1/markets/query`\n */\n async query(\n body: AdvancedSearchBody,\n options?: RequestOptions,\n ): Promise<MarketQueryResponse> {\n return this.http.internalPost<MarketQueryResponse>(\n '/internal-api/v1/markets/query',\n body,\n options,\n );\n }\n}\n","import type { HttpClient } from '../http.js';\nimport { buildQueryString } from '../http.js';\nimport type { RequestOptions } from '../types.js';\nimport type {\n SubmitEventParams,\n ClassifiedEvent,\n QueryEventsParams,\n PaginatedEvents,\n CreateIntegrationParams,\n Integration,\n UpdateIntegrationParams,\n TestResult,\n CreateSubscriptionParams,\n Subscription,\n UpdateSubscriptionParams,\n EventCategory,\n EventType,\n TagInfo,\n} from './types.js';\n\n/**\n * Client for the Intent Hub API domain.\n *\n * ```ts\n * const event = await client.intentHub.submitEvent({\n * sourceType: 'AGENT',\n * sourceId: 'my-agent',\n * textContent: 'User wants to refinance their mortgage',\n * });\n * ```\n */\nexport class IntentHubClient {\n /** @internal */\n constructor(private readonly http: HttpClient) {}\n\n // -------------------------------------------------------------------------\n // Events\n // -------------------------------------------------------------------------\n\n /**\n * Submit a raw event for classification.\n *\n * `POST /intent-hub/v1/events`\n */\n async submitEvent(params: SubmitEventParams): Promise<ClassifiedEvent> {\n const { signal, ...rest } = params;\n return this.http.intentHubPost<ClassifiedEvent>(\n '/events',\n {\n source_type: rest.sourceType,\n source_id: rest.sourceId,\n text_content: rest.textContent,\n payload: rest.payload,\n user_id: rest.userId,\n session_id: rest.sessionId,\n suggested_category: rest.suggestedCategory,\n suggested_intent: rest.suggestedIntent,\n idempotency_key: rest.idempotencyKey,\n event_type: rest.eventType,\n },\n { signal },\n );\n }\n\n /**\n * Retrieve a single classified event by ID.\n *\n * `GET /intent-hub/v1/events/:eventId`\n */\n async getEvent(eventId: string, options?: RequestOptions): Promise<ClassifiedEvent> {\n return this.http.intentHubGet<ClassifiedEvent>(\n `/events/${encodeURIComponent(eventId)}`,\n options,\n );\n }\n\n /**\n * Query classified events with optional filters.\n *\n * `GET /intent-hub/v1/events`\n */\n async queryEvents(params?: QueryEventsParams): Promise<PaginatedEvents> {\n if (!params) {\n return this.http.intentHubGet<PaginatedEvents>('/events');\n }\n const { signal, ...query } = params;\n const qs = buildQueryString(query);\n return this.http.intentHubGet<PaginatedEvents>(`/events${qs}`, { signal });\n }\n\n // -------------------------------------------------------------------------\n // Integrations\n // -------------------------------------------------------------------------\n\n /**\n * Create a new integration endpoint.\n *\n * `POST /intent-hub/v1/integrations`\n */\n async createIntegration(params: CreateIntegrationParams): Promise<Integration> {\n const { signal, ...rest } = params;\n return this.http.intentHubPost<Integration>(\n '/integrations',\n {\n name: rest.name,\n type: rest.type,\n url: rest.url,\n secret: rest.secret,\n headers: rest.headers,\n config: rest.config,\n },\n { signal },\n );\n }\n\n /**\n * List all integrations for the current organisation.\n *\n * `GET /intent-hub/v1/integrations`\n */\n async listIntegrations(options?: RequestOptions): Promise<Integration[]> {\n return this.http.intentHubGet<Integration[]>('/integrations', options);\n }\n\n /**\n * Retrieve a single integration by ID.\n *\n * `GET /intent-hub/v1/integrations/:id`\n */\n async getIntegration(id: string, options?: RequestOptions): Promise<Integration> {\n return this.http.intentHubGet<Integration>(\n `/integrations/${encodeURIComponent(id)}`,\n options,\n );\n }\n\n /**\n * Update an existing integration.\n *\n * `PATCH /intent-hub/v1/integrations/:id`\n */\n async updateIntegration(\n id: string,\n params: UpdateIntegrationParams,\n ): Promise<Integration> {\n const { signal, ...rest } = params;\n return this.http.intentHubPatch<Integration>(\n `/integrations/${encodeURIComponent(id)}`,\n {\n name: rest.name,\n url: rest.url,\n secret: rest.secret,\n status: rest.status,\n },\n { signal },\n );\n }\n\n /**\n * Delete an integration by ID.\n *\n * `DELETE /intent-hub/v1/integrations/:id`\n */\n async deleteIntegration(id: string, options?: RequestOptions): Promise<void> {\n return this.http.intentHubDelete<void>(\n `/integrations/${encodeURIComponent(id)}`,\n options,\n );\n }\n\n /**\n * Send a test event to an integration endpoint.\n *\n * `POST /intent-hub/v1/integrations/:id/test`\n */\n async testIntegration(id: string, options?: RequestOptions): Promise<TestResult> {\n return this.http.intentHubPost<TestResult>(\n `/integrations/${encodeURIComponent(id)}/test`,\n {},\n options,\n );\n }\n\n // -------------------------------------------------------------------------\n // Subscriptions\n // -------------------------------------------------------------------------\n\n /**\n * Create a new subscription linking event patterns to an integration.\n *\n * `POST /intent-hub/v1/subscriptions`\n */\n async createSubscription(params: CreateSubscriptionParams): Promise<Subscription> {\n const { signal, ...rest } = params;\n return this.http.intentHubPost<Subscription>(\n '/subscriptions',\n {\n integration_id: rest.integrationId,\n event_type_slug: rest.eventTypeSlug,\n tag: rest.tag,\n intent_pattern: rest.intentPattern,\n filters: rest.filters,\n },\n { signal },\n );\n }\n\n /**\n * List all subscriptions for the current organisation.\n *\n * `GET /intent-hub/v1/subscriptions`\n */\n async listSubscriptions(options?: RequestOptions): Promise<Subscription[]> {\n return this.http.intentHubGet<Subscription[]>('/subscriptions', options);\n }\n\n /**\n * Retrieve a single subscription by ID.\n *\n * `GET /intent-hub/v1/subscriptions/:id`\n */\n async getSubscription(id: string, options?: RequestOptions): Promise<Subscription> {\n return this.http.intentHubGet<Subscription>(\n `/subscriptions/${encodeURIComponent(id)}`,\n options,\n );\n }\n\n /**\n * Update an existing subscription.\n *\n * `PATCH /intent-hub/v1/subscriptions/:id`\n */\n async updateSubscription(\n id: string,\n params: UpdateSubscriptionParams,\n ): Promise<Subscription> {\n const { signal, ...rest } = params;\n return this.http.intentHubPatch<Subscription>(\n `/subscriptions/${encodeURIComponent(id)}`,\n {\n event_type_slug: rest.eventTypeSlug,\n tag: rest.tag,\n intent_pattern: rest.intentPattern,\n integration_id: rest.integrationId,\n is_active: rest.isActive,\n },\n { signal },\n );\n }\n\n /**\n * Delete a subscription by ID.\n *\n * `DELETE /intent-hub/v1/subscriptions/:id`\n */\n async deleteSubscription(id: string, options?: RequestOptions): Promise<void> {\n return this.http.intentHubDelete<void>(\n `/subscriptions/${encodeURIComponent(id)}`,\n options,\n );\n }\n\n // -------------------------------------------------------------------------\n // Catalog\n // -------------------------------------------------------------------------\n\n /**\n * List all event categories in the taxonomy.\n *\n * `GET /intent-hub/v1/catalog/categories`\n */\n async listCategories(options?: RequestOptions): Promise<EventCategory[]> {\n return this.http.intentHubGet<EventCategory[]>('/catalog/categories', options);\n }\n\n /**\n * List event types, optionally filtered by category.\n *\n * `GET /intent-hub/v1/catalog/event-types`\n */\n async listEventTypes(\n params?: { category?: string } & RequestOptions,\n ): Promise<EventType[]> {\n if (!params) {\n return this.http.intentHubGet<EventType[]>('/catalog/event-types');\n }\n const { signal, ...query } = params;\n const qs = buildQueryString(query);\n return this.http.intentHubGet<EventType[]>(`/catalog/event-types${qs}`, { signal });\n }\n\n /**\n * List all tags with their usage counts.\n *\n * `GET /intent-hub/v1/catalog/tags`\n */\n async listTags(options?: RequestOptions): Promise<TagInfo[]> {\n return this.http.intentHubGet<TagInfo[]>('/catalog/tags', options);\n }\n}\n","import type { HtAgClientOptions, ResolvedConfig } from './types.js';\nimport { HttpClient } from './http.js';\nimport { AddressClient } from './address/client.js';\nimport { PropertyClient } from './property/client.js';\nimport { MarketsClient } from './markets/client.js';\nimport { IntentHubClient } from './intent-hub/client.js';\n\n// ---------------------------------------------------------------------------\n// Defaults\n// ---------------------------------------------------------------------------\n\nconst DEFAULT_MAX_RETRIES = 3;\nconst DEFAULT_RETRY_BASE_DELAY = 500; // ms\nconst DEFAULT_TIMEOUT = 30_000; // 30 seconds\n\n/**\n * Build the environment-derived base URLs.\n *\n * - `prod` -> `https://api.prod.htagai.com`\n * - `dev` -> `https://api.dev.htagai.com`\n */\nfunction resolveBaseUrls(options: HtAgClientOptions): {\n publicBaseUrl: string;\n internalBaseUrl: string;\n intentHubBaseUrl: string;\n} {\n if (options.baseUrl) {\n // Strip trailing slashes for consistency.\n const base = options.baseUrl.replace(/\\/+$/, '');\n return { publicBaseUrl: base, internalBaseUrl: base, intentHubBaseUrl: base };\n }\n\n const env = options.environment ?? 'prod';\n const base = `https://api.${env}.htagai.com`;\n return {\n publicBaseUrl: base,\n internalBaseUrl: base,\n intentHubBaseUrl: `${base}/intent-hub/v1`,\n };\n}\n\n// ---------------------------------------------------------------------------\n// HtAgApiClient\n// ---------------------------------------------------------------------------\n\n/**\n * Top-level client for the HtAG Location Intelligence APIs.\n *\n * ```ts\n * import { HtAgApiClient } from '@htag/sdk';\n *\n * const client = new HtAgApiClient({\n * apiKey: process.env.HTAG_API_KEY!,\n * environment: 'prod',\n * });\n *\n * const results = await client.address.search({ q: '100 George St Sydney' });\n * ```\n */\nexport class HtAgApiClient {\n /** Address search, insights and standardisation. */\n readonly address: AddressClient;\n\n /** Sold property search. */\n readonly property: PropertyClient;\n\n /** Market snapshots, advanced queries and time-series trends. */\n readonly markets: MarketsClient;\n\n /** Intent Hub: event classification, integrations and subscriptions. */\n readonly intentHub: IntentHubClient;\n\n constructor(options: HtAgClientOptions) {\n if (!options.apiKey) {\n throw new Error(\n 'HtAgApiClient requires an apiKey. Pass it in the constructor options.',\n );\n }\n\n const { publicBaseUrl, internalBaseUrl, intentHubBaseUrl } = resolveBaseUrls(options);\n\n const config: ResolvedConfig = {\n apiKey: options.apiKey,\n publicBaseUrl,\n internalBaseUrl,\n intentHubBaseUrl,\n maxRetries: options.maxRetries ?? DEFAULT_MAX_RETRIES,\n retryBaseDelay: options.retryBaseDelay ?? DEFAULT_RETRY_BASE_DELAY,\n timeout: options.timeout ?? DEFAULT_TIMEOUT,\n };\n\n const http = new HttpClient(config);\n\n this.address = new AddressClient(http);\n this.property = new PropertyClient(http);\n this.markets = new MarketsClient(http);\n this.intentHub = new IntentHubClient(http);\n }\n}\n"],"mappings":"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","names":["base"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/errors.ts","../src/http.ts","../src/address/client.ts","../src/property/client.ts","../src/markets/trends.ts","../src/markets/client.ts","../src/intent-hub/client.ts","../src/reference/client.ts","../src/client.ts"],"sourcesContent":["// ---------------------------------------------------------------------------\n// @htag/sdk — Official TypeScript SDK for HtAG Location Intelligence APIs\n// ---------------------------------------------------------------------------\n\n// Main client\nexport { HtAgApiClient } from './client.js';\n\n// Configuration types\nexport type {\n HtAgClientOptions,\n ResolvedConfig,\n BaseResponse,\n RequestOptions,\n LevelEnum,\n PropertyTypeEnum,\n} from './types.js';\n\n// Error classes\nexport {\n HtAgError,\n AuthenticationError,\n RateLimitError,\n ValidationError,\n ServerError,\n} from './errors.js';\n\n// Address domain\nexport { AddressClient } from './address/index.js';\nexport type {\n AddressRecord,\n AddressSearchResult,\n AddressSearchParams,\n AddressSearchResponse,\n AddressInsightsParams,\n AddressInsightsResponse,\n BatchStandardiseParams,\n BatchStandardiseResponse,\n StandardisedAddress,\n GeocodeParams,\n GeocodeRecord,\n GeocodeResponse,\n EnvironmentParams,\n EnvironmentRecord,\n EnvironmentResponse,\n DemographicsParams,\n DemographicsRecord,\n DemographicsResponse,\n} from './address/index.js';\n\n// Property domain\nexport { PropertyClient } from './property/index.js';\nexport type {\n SoldPropertyRecord,\n SoldSearchParams,\n SoldPropertiesResponse,\n} from './property/index.js';\n\n// Markets domain\nexport { MarketsClient, TrendsClient } from './markets/index.js';\nexport type {\n MarketSnapshot,\n PriceHistoryOut,\n RentHistoryOut,\n YieldHistoryOut,\n FSDMonthlyOut,\n FSDQuarterlyOut,\n FSDYearlyOut,\n EssentialsOut,\n GRCOut,\n DemandProfileOut,\n LogicNode,\n AdvancedSearchBody,\n SnapshotsParams,\n MarketQueryParams,\n TrendsParams,\n TrendsWithBedroomsParams,\n SnapshotsResponse,\n MarketQueryResponse,\n PriceResponse,\n RentResponse,\n YieldResponse,\n SupplyDemandResponse,\n SearchIndexResponse,\n HoldPeriodResponse,\n PerformanceResponse,\n GrowthRatesResponse,\n DemandProfileResponse,\n MarketSnapshotParams,\n MarketGrowthCumulativeRecord,\n MarketGrowthAnnualisedRecord,\n MarketSupplyRecord,\n MarketSupplyLongSlopeRecord,\n MarketSupplyShortSlopeRecord,\n MarketDemandRecord,\n MarketDemandLongSlopeRecord,\n MarketDemandShortSlopeRecord,\n MarketScoresRecord,\n MarketFundamentalsRecord,\n MarketCycleRecord,\n MarketRiskRecord,\n GrowthCumulativeResponse,\n GrowthAnnualisedResponse,\n MarketSupplyResponse,\n SupplyLongSlopeResponse,\n SupplyShortSlopeResponse,\n MarketDemandResponse,\n DemandLongSlopeResponse,\n DemandShortSlopeResponse,\n MarketScoresResponse,\n MarketFundamentalsResponse,\n MarketCycleResponse,\n MarketRiskResponse,\n StockOnMarketTrendRecord,\n InventoryTrendRecord,\n DaysOnMarketTrendRecord,\n ClearanceRateTrendRecord,\n VacancyTrendRecord,\n StockOnMarketResponse,\n InventoryTrendResponse,\n DaysOnMarketResponse,\n ClearanceRateResponse,\n VacancyResponse,\n} from './markets/index.js';\n\n// Intent Hub domain\nexport { IntentHubClient } from './intent-hub/index.js';\nexport type {\n SourceType,\n IntegrationType,\n IntegrationStatus,\n Sentiment,\n Urgency,\n SubmitEventParams,\n ClassifiedEvent,\n QueryEventsParams,\n PaginatedEvents,\n CreateIntegrationParams,\n UpdateIntegrationParams,\n Integration,\n TestResult,\n CreateSubscriptionParams,\n UpdateSubscriptionParams,\n Subscription,\n EventCategory,\n EventType,\n TagInfo,\n} from './intent-hub/index.js';\n\n// Reference domain\nexport { ReferenceClient } from './reference/index.js';\nexport type {\n LocalityParams,\n LocalityRecord,\n LocalityResponse,\n LgaParams,\n LgaRecord,\n LgaResponse,\n} from './reference/index.js';\n","/**\n * Base error class for all HtAG SDK errors.\n */\nexport class HtAgError extends Error {\n /** HTTP status code, if available. */\n readonly status: number | undefined;\n\n /** Raw response body, if available. */\n readonly body: unknown;\n\n /** The request URL that caused the error. */\n readonly url: string | undefined;\n\n constructor(\n message: string,\n options?: {\n status?: number;\n body?: unknown;\n url?: string;\n cause?: unknown;\n },\n ) {\n super(message, { cause: options?.cause });\n this.name = 'HtAgError';\n this.status = options?.status;\n this.body = options?.body;\n this.url = options?.url;\n }\n}\n\n/**\n * Thrown when the server returns 401 or 403.\n */\nexport class AuthenticationError extends HtAgError {\n constructor(options: { status: number; body: unknown; url: string }) {\n super(\n `Authentication failed (HTTP ${options.status}). Check your API key.`,\n options,\n );\n this.name = 'AuthenticationError';\n }\n}\n\n/**\n * Thrown when the server returns 429 after exhausting all retries.\n */\nexport class RateLimitError extends HtAgError {\n constructor(options: { body: unknown; url: string }) {\n super('Rate limit exceeded. Please retry after a short delay.', {\n status: 429,\n ...options,\n });\n this.name = 'RateLimitError';\n }\n}\n\n/**\n * Thrown when the server returns 400 or 422.\n */\nexport class ValidationError extends HtAgError {\n constructor(options: { status: number; body: unknown; url: string }) {\n const detail = extractDetail(options.body);\n super(\n detail\n ? `Validation error (HTTP ${options.status}): ${detail}`\n : `Validation error (HTTP ${options.status})`,\n options,\n );\n this.name = 'ValidationError';\n }\n}\n\n/**\n * Thrown when the server returns a 5xx status after exhausting all retries.\n */\nexport class ServerError extends HtAgError {\n constructor(options: { status: number; body: unknown; url: string }) {\n super(`Server error (HTTP ${options.status})`, options);\n this.name = 'ServerError';\n }\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction extractDetail(body: unknown): string | undefined {\n if (body && typeof body === 'object' && 'detail' in body) {\n const detail = (body as Record<string, unknown>).detail;\n if (typeof detail === 'string') return detail;\n if (Array.isArray(detail)) {\n return detail\n .map((d) => {\n if (typeof d === 'string') return d;\n if (d && typeof d === 'object' && 'msg' in d) return String(d.msg);\n return JSON.stringify(d);\n })\n .join('; ');\n }\n return JSON.stringify(detail);\n }\n return undefined;\n}\n","import type { ResolvedConfig, RequestOptions } from './types.js';\nimport {\n HtAgError,\n AuthenticationError,\n RateLimitError,\n ValidationError,\n ServerError,\n} from './errors.js';\n\n// ---------------------------------------------------------------------------\n// camelCase -> snake_case conversion\n// ---------------------------------------------------------------------------\n\n/**\n * Convert a camelCase string to snake_case.\n *\n * Handles sequences of uppercase letters correctly:\n * - \"areaId\" -> \"area_id\"\n * - \"periodEndMin\" -> \"period_end_min\"\n * - \"IRSD\" -> \"irsd\" (all-caps treated as one token)\n */\nfunction toSnakeCase(str: string): string {\n return str\n .replace(/([A-Z]+)([A-Z][a-z])/g, '$1_$2')\n .replace(/([a-z0-9])([A-Z])/g, '$1_$2')\n .toLowerCase();\n}\n\n// ---------------------------------------------------------------------------\n// Query-string builder\n// ---------------------------------------------------------------------------\n\n/**\n * Build a URL query string from a params object, converting camelCase keys\n * to snake_case. Arrays are joined with commas. `undefined` and `null` values\n * are omitted.\n */\nexport function buildQueryString(\n params: Record<string, unknown>,\n): string {\n const parts: string[] = [];\n\n for (const [key, value] of Object.entries(params)) {\n // Skip internal SDK options that are not API params.\n if (key === 'signal') continue;\n if (value === undefined || value === null) continue;\n\n const snakeKey = toSnakeCase(key);\n\n if (Array.isArray(value)) {\n if (value.length > 0) {\n parts.push(\n `${encodeURIComponent(snakeKey)}=${encodeURIComponent(value.join(','))}`,\n );\n }\n } else {\n parts.push(\n `${encodeURIComponent(snakeKey)}=${encodeURIComponent(String(value))}`,\n );\n }\n }\n\n return parts.length > 0 ? `?${parts.join('&')}` : '';\n}\n\n// ---------------------------------------------------------------------------\n// Retryable HTTP client\n// ---------------------------------------------------------------------------\n\nfunction isRetryable(status: number): boolean {\n return status === 429 || status >= 500;\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\n/**\n * Parse the body of a response. Returns the parsed JSON on success or a string\n * representation when parsing fails.\n */\nasync function parseBody(response: Response): Promise<unknown> {\n const contentType = response.headers.get('content-type') ?? '';\n if (contentType.includes('application/json')) {\n try {\n return await response.json();\n } catch {\n return await response.text();\n }\n }\n return await response.text();\n}\n\n/**\n * Throw the appropriate typed error for the given HTTP status.\n */\nfunction throwForStatus(\n status: number,\n body: unknown,\n url: string,\n): never {\n if (status === 401 || status === 403) {\n throw new AuthenticationError({ status, body, url });\n }\n if (status === 429) {\n throw new RateLimitError({ body, url });\n }\n if (status === 400 || status === 422) {\n throw new ValidationError({ status, body, url });\n }\n if (status >= 500) {\n throw new ServerError({ status, body, url });\n }\n throw new HtAgError(`HTTP ${status}`, { status, body, url });\n}\n\n/**\n * Internal HTTP transport used by all domain clients.\n */\nexport class HttpClient {\n constructor(private readonly config: ResolvedConfig) {}\n\n /**\n * Execute a GET request against the public API base.\n */\n async get<T>(path: string, options?: RequestOptions): Promise<T> {\n return this.request<T>('GET', this.config.publicBaseUrl + path, undefined, options);\n }\n\n /**\n * Execute a POST request against the public API base.\n */\n async post<T>(\n path: string,\n body: unknown,\n options?: RequestOptions,\n ): Promise<T> {\n return this.request<T>('POST', this.config.publicBaseUrl + path, body, options);\n }\n\n /**\n * Execute a PATCH request against the public API base.\n */\n async patch<T>(\n path: string,\n body: unknown,\n options?: RequestOptions,\n ): Promise<T> {\n return this.request<T>('PATCH', this.config.publicBaseUrl + path, body, options);\n }\n\n /**\n * Execute a DELETE request against the public API base.\n */\n async delete<T>(path: string, options?: RequestOptions): Promise<T> {\n return this.request<T>('DELETE', this.config.publicBaseUrl + path, undefined, options);\n }\n\n /**\n * Execute a GET request against the internal API base.\n */\n async internalGet<T>(path: string, options?: RequestOptions): Promise<T> {\n return this.request<T>('GET', this.config.internalBaseUrl + path, undefined, options);\n }\n\n /**\n * Execute a POST request against the internal API base.\n */\n async internalPost<T>(\n path: string,\n body: unknown,\n options?: RequestOptions,\n ): Promise<T> {\n return this.request<T>('POST', this.config.internalBaseUrl + path, body, options);\n }\n\n /**\n * Execute a GET request against the Intent Hub API base.\n */\n async intentHubGet<T>(path: string, options?: RequestOptions): Promise<T> {\n return this.request<T>('GET', this.config.intentHubBaseUrl + path, undefined, options);\n }\n\n /**\n * Execute a POST request against the Intent Hub API base.\n */\n async intentHubPost<T>(\n path: string,\n body: unknown,\n options?: RequestOptions,\n ): Promise<T> {\n return this.request<T>('POST', this.config.intentHubBaseUrl + path, body, options);\n }\n\n /**\n * Execute a PATCH request against the Intent Hub API base.\n */\n async intentHubPatch<T>(\n path: string,\n body: unknown,\n options?: RequestOptions,\n ): Promise<T> {\n return this.request<T>('PATCH', this.config.intentHubBaseUrl + path, body, options);\n }\n\n /**\n * Execute a DELETE request against the Intent Hub API base.\n */\n async intentHubDelete<T>(path: string, options?: RequestOptions): Promise<T> {\n return this.request<T>('DELETE', this.config.intentHubBaseUrl + path, undefined, options);\n }\n\n // -----------------------------------------------------------------------\n // Core request implementation with retries and exponential backoff\n // -----------------------------------------------------------------------\n\n private async request<T>(\n method: string,\n url: string,\n body: unknown,\n options?: RequestOptions,\n ): Promise<T> {\n const headers: Record<string, string> = {\n 'x-api-key': this.config.apiKey,\n 'accept': 'application/json',\n };\n\n if (body !== undefined) {\n headers['content-type'] = 'application/json';\n }\n\n let lastError: Error | undefined;\n\n for (let attempt = 0; attempt <= this.config.maxRetries; attempt++) {\n // If this is a retry, wait with exponential backoff + jitter.\n if (attempt > 0) {\n const base = this.config.retryBaseDelay * Math.pow(2, attempt - 1);\n const jitter = Math.random() * base * 0.5;\n await sleep(base + jitter);\n }\n\n // Build an AbortController that combines the user signal with a timeout.\n const controller = new AbortController();\n let timeoutId: ReturnType<typeof setTimeout> | undefined;\n\n const cleanup = () => {\n if (timeoutId !== undefined) clearTimeout(timeoutId);\n };\n\n // Wire up caller's abort signal.\n if (options?.signal) {\n if (options.signal.aborted) {\n throw new HtAgError('Request aborted', {\n url,\n cause: options.signal.reason,\n });\n }\n options.signal.addEventListener('abort', () => controller.abort(options.signal!.reason), {\n once: true,\n });\n }\n\n timeoutId = setTimeout(\n () => controller.abort(new Error('Request timed out')),\n this.config.timeout,\n );\n\n try {\n const response = await fetch(url, {\n method,\n headers,\n body: body !== undefined ? JSON.stringify(body) : undefined,\n signal: controller.signal,\n });\n\n cleanup();\n\n if (response.ok) {\n // 204 No Content — nothing to parse.\n if (response.status === 204) {\n return undefined as T;\n }\n return (await parseBody(response)) as T;\n }\n\n const responseBody = await parseBody(response);\n\n // Retry on retryable statuses, unless we've exhausted retries.\n if (isRetryable(response.status) && attempt < this.config.maxRetries) {\n lastError = new HtAgError(`HTTP ${response.status}`, {\n status: response.status,\n body: responseBody,\n url,\n });\n continue;\n }\n\n // Non-retryable or exhausted retries — throw typed error.\n throwForStatus(response.status, responseBody, url);\n } catch (err) {\n cleanup();\n\n // Re-throw our own typed errors.\n if (err instanceof HtAgError) {\n throw err;\n }\n\n // Handle abort / timeout.\n if (err instanceof DOMException && err.name === 'AbortError') {\n if (options?.signal?.aborted) {\n throw new HtAgError('Request aborted', { url, cause: err });\n }\n throw new HtAgError('Request timed out', { url, cause: err });\n }\n\n // Network / fetch errors — retry if we have attempts left.\n if (attempt < this.config.maxRetries) {\n lastError = err instanceof Error ? err : new Error(String(err));\n continue;\n }\n\n throw new HtAgError(\n `Network error: ${err instanceof Error ? err.message : String(err)}`,\n { url, cause: err },\n );\n }\n }\n\n // Should not reach here, but just in case.\n throw lastError ?? new HtAgError('Request failed after retries', { url });\n }\n}\n","import type { HttpClient } from '../http.js';\nimport { buildQueryString } from '../http.js';\nimport type {\n AddressSearchParams,\n AddressSearchResponse,\n AddressInsightsParams,\n AddressInsightsResponse,\n BatchStandardiseParams,\n BatchStandardiseResponse,\n GeocodeParams,\n GeocodeResponse,\n EnvironmentParams,\n EnvironmentResponse,\n DemographicsParams,\n DemographicsResponse,\n} from './types.js';\n\n/**\n * Client for the Address API domain.\n *\n * ```ts\n * const results = await client.address.search({ q: '100 George St Sydney' });\n * ```\n */\nexport class AddressClient {\n /** @internal */\n constructor(private readonly http: HttpClient) {}\n\n /**\n * Search for addresses matching a free-text query.\n *\n * `GET /v1/address/search`\n */\n async search(params: AddressSearchParams): Promise<AddressSearchResponse> {\n const { signal, ...query } = params;\n const qs = buildQueryString(query);\n return this.http.get<AddressSearchResponse>(`/v1/address/search${qs}`, { signal });\n }\n\n /**\n * Retrieve detailed insights for one or more addresses.\n *\n * `GET /internal-api/v1/address/insights`\n */\n async insights(params: AddressInsightsParams): Promise<AddressInsightsResponse> {\n const { signal, ...query } = params;\n const qs = buildQueryString(query);\n return this.http.internalGet<AddressInsightsResponse>(`/internal-api/v1/address/insights${qs}`, { signal });\n }\n\n /**\n * Standardise a batch of raw address strings into structured records.\n *\n * `POST /v1/address/standardise`\n */\n async standardise(params: BatchStandardiseParams): Promise<BatchStandardiseResponse> {\n const { signal, addresses } = params;\n return this.http.post<BatchStandardiseResponse>(\n '/v1/address/standardise',\n { addresses },\n { signal },\n );\n }\n\n /**\n * Geocode an address string to structured location data.\n *\n * `GET /v1/address/geocode`\n */\n async geocode(params: GeocodeParams): Promise<GeocodeResponse> {\n const { signal, ...query } = params;\n const qs = buildQueryString(query);\n return this.http.get<GeocodeResponse>(`/v1/address/geocode${qs}`, { signal });\n }\n\n /**\n * Retrieve environmental data (flood, bushfire, heritage, zoning) for addresses.\n *\n * `GET /v1/address/environment`\n */\n async environment(params: EnvironmentParams): Promise<EnvironmentResponse> {\n const { signal, ...query } = params;\n const qs = buildQueryString(query);\n return this.http.get<EnvironmentResponse>(`/v1/address/environment${qs}`, { signal });\n }\n\n /**\n * Retrieve demographic data (SEIFA indices, housing tenure) for addresses.\n *\n * `GET /v1/address/demographics`\n */\n async demographics(params: DemographicsParams): Promise<DemographicsResponse> {\n const { signal, ...query } = params;\n const qs = buildQueryString(query);\n return this.http.get<DemographicsResponse>(`/v1/address/demographics${qs}`, { signal });\n }\n}\n","import type { HttpClient } from '../http.js';\nimport { buildQueryString } from '../http.js';\nimport type {\n SoldSearchParams,\n SoldPropertiesResponse,\n} from './types.js';\n\n/**\n * Client for the Property API domain.\n *\n * ```ts\n * const sold = await client.property.soldSearch({ address: '100 George St Sydney', radius: 2000 });\n * ```\n */\nexport class PropertyClient {\n /** @internal */\n constructor(private readonly http: HttpClient) {}\n\n /**\n * Search for recently sold properties near a location.\n *\n * `GET /v1/property/sold/search`\n */\n async soldSearch(params: SoldSearchParams): Promise<SoldPropertiesResponse> {\n const { signal, ...query } = params;\n const qs = buildQueryString(query);\n return this.http.get<SoldPropertiesResponse>(`/v1/property/sold/search${qs}`, { signal });\n }\n}\n","import type { HttpClient } from '../http.js';\nimport { buildQueryString } from '../http.js';\nimport type {\n TrendsParams,\n TrendsWithBedroomsParams,\n PriceResponse,\n RentResponse,\n YieldResponse,\n SupplyDemandResponse,\n SearchIndexResponse,\n HoldPeriodResponse,\n PerformanceResponse,\n GrowthRatesResponse,\n DemandProfileResponse,\n StockOnMarketResponse,\n InventoryTrendResponse,\n DaysOnMarketResponse,\n ClearanceRateResponse,\n VacancyResponse,\n} from './types.js';\n\n/**\n * Client for the Markets Trends API domain.\n *\n * Each method queries a specific time-series metric:\n *\n * ```ts\n * const prices = await client.markets.trends.price({\n * level: 'suburb',\n * areaId: ['SAL10001'],\n * propertyType: ['house'],\n * });\n * ```\n */\nexport class TrendsClient {\n /** @internal */\n constructor(private readonly http: HttpClient) {}\n\n /**\n * Price history trends.\n *\n * `GET /internal-api/v1/markets/trends/price`\n */\n async price(params: TrendsWithBedroomsParams): Promise<PriceResponse> {\n return this.trend<PriceResponse>('price', params);\n }\n\n /**\n * Rent history trends.\n *\n * `GET /v1/markets/trends/rent`\n */\n async rent(params: TrendsWithBedroomsParams): Promise<RentResponse> {\n return this.publicTrend<RentResponse>('rent', params);\n }\n\n /**\n * Yield history trends.\n *\n * `GET /v1/markets/trends/yield`\n */\n async yieldHistory(params: TrendsWithBedroomsParams): Promise<YieldResponse> {\n return this.publicTrend<YieldResponse>('yield', params);\n }\n\n /**\n * Supply and demand (monthly frequency).\n *\n * `GET /internal-api/v1/markets/trends/supply-demand`\n */\n async supplyDemand(params: TrendsWithBedroomsParams): Promise<SupplyDemandResponse> {\n return this.trend<SupplyDemandResponse>('supply-demand', params);\n }\n\n /**\n * Search interest index (quarterly frequency).\n *\n * `GET /internal-api/v1/markets/trends/search-index`\n */\n async searchIndex(params: TrendsParams): Promise<SearchIndexResponse> {\n return this.trend<SearchIndexResponse>('search-index', params);\n }\n\n /**\n * Hold period (yearly frequency).\n *\n * `GET /internal-api/v1/markets/trends/hold-period`\n */\n async holdPeriod(params: TrendsParams): Promise<HoldPeriodResponse> {\n return this.trend<HoldPeriodResponse>('hold-period', params);\n }\n\n /**\n * Performance essentials.\n *\n * `GET /internal-api/v1/markets/trends/performance`\n */\n async performance(params: TrendsWithBedroomsParams): Promise<PerformanceResponse> {\n return this.trend<PerformanceResponse>('performance', params);\n }\n\n /**\n * Growth rate cycle.\n *\n * `GET /v1/markets/trends/growth-rates`\n */\n async growthRates(params: TrendsParams): Promise<GrowthRatesResponse> {\n return this.publicTrend<GrowthRatesResponse>('growth-rates', params);\n }\n\n /**\n * Demand profile breakdown.\n *\n * `GET /v1/markets/trends/demand-profile`\n */\n async demandProfile(params: TrendsParams): Promise<DemandProfileResponse> {\n return this.publicTrend<DemandProfileResponse>('demand-profile', params);\n }\n\n /**\n * Stock on market trends.\n *\n * `GET /v1/markets/trends/stock-on-market`\n */\n async stockOnMarket(params: TrendsParams): Promise<StockOnMarketResponse> {\n return this.publicTrend<StockOnMarketResponse>('stock-on-market', params);\n }\n\n /**\n * Inventory trends.\n *\n * `GET /v1/markets/trends/inventory`\n */\n async inventory(params: TrendsParams): Promise<InventoryTrendResponse> {\n return this.publicTrend<InventoryTrendResponse>('inventory', params);\n }\n\n /**\n * Days on market trends.\n *\n * `GET /v1/markets/trends/days-on-market`\n */\n async daysOnMarket(params: TrendsParams): Promise<DaysOnMarketResponse> {\n return this.publicTrend<DaysOnMarketResponse>('days-on-market', params);\n }\n\n /**\n * Clearance rate trends.\n *\n * `GET /v1/markets/trends/clearance-rate`\n */\n async clearanceRate(params: TrendsParams): Promise<ClearanceRateResponse> {\n return this.publicTrend<ClearanceRateResponse>('clearance-rate', params);\n }\n\n /**\n * Vacancy rate trends.\n *\n * `GET /v1/markets/trends/vacancy`\n */\n async vacancy(params: TrendsParams): Promise<VacancyResponse> {\n return this.publicTrend<VacancyResponse>('vacancy', params);\n }\n\n // -----------------------------------------------------------------------\n // Shared implementation\n // -----------------------------------------------------------------------\n\n private async trend<T>(metric: string, params: TrendsParams | TrendsWithBedroomsParams): Promise<T> {\n const { signal, ...query } = params;\n const qs = buildQueryString(query);\n return this.http.internalGet<T>(\n `/internal-api/v1/markets/trends/${metric}${qs}`,\n { signal },\n );\n }\n\n private async publicTrend<T>(metric: string, params: TrendsParams | TrendsWithBedroomsParams): Promise<T> {\n const { signal, ...query } = params;\n const qs = buildQueryString(query);\n return this.http.get<T>(\n `/v1/markets/trends/${metric}${qs}`,\n { signal },\n );\n }\n}\n","import type { HttpClient } from '../http.js';\nimport { buildQueryString } from '../http.js';\nimport { TrendsClient } from './trends.js';\nimport type {\n SnapshotsParams,\n SnapshotsResponse,\n AdvancedSearchBody,\n MarketQueryResponse,\n MarketSnapshotParams,\n GrowthCumulativeResponse,\n GrowthAnnualisedResponse,\n MarketSupplyResponse,\n SupplyLongSlopeResponse,\n SupplyShortSlopeResponse,\n MarketDemandResponse,\n DemandLongSlopeResponse,\n DemandShortSlopeResponse,\n MarketScoresResponse,\n MarketFundamentalsResponse,\n MarketCycleResponse,\n MarketRiskResponse,\n} from './types.js';\nimport type { RequestOptions } from '../types.js';\n\n/**\n * Client for the Markets API domain.\n *\n * ```ts\n * const snapshots = await client.markets.snapshots({\n * level: 'suburb',\n * propertyType: ['house'],\n * });\n *\n * const prices = await client.markets.trends.price({\n * level: 'suburb',\n * areaId: ['SAL10001'],\n * });\n * ```\n */\nexport class MarketsClient {\n /** Sub-client for time-series trend endpoints. */\n readonly trends: TrendsClient;\n\n /** @internal */\n constructor(private readonly http: HttpClient) {\n this.trends = new TrendsClient(http);\n }\n\n /**\n * Retrieve market snapshot data with optional filters.\n *\n * `GET /internal-api/v1/markets/snapshots`\n */\n async snapshots(params: SnapshotsParams): Promise<SnapshotsResponse> {\n const { signal, ...query } = params;\n const qs = buildQueryString(query);\n return this.http.internalGet<SnapshotsResponse>(\n `/internal-api/v1/markets/snapshots${qs}`,\n { signal },\n );\n }\n\n /**\n * Advanced market query with logical filter expressions.\n *\n * `POST /internal-api/v1/markets/query`\n */\n async query(\n body: AdvancedSearchBody,\n options?: RequestOptions,\n ): Promise<MarketQueryResponse> {\n return this.http.internalPost<MarketQueryResponse>(\n '/internal-api/v1/markets/query',\n body,\n options,\n );\n }\n\n // -------------------------------------------------------------------------\n // Public market snapshot endpoints (/v1/markets/*)\n // -------------------------------------------------------------------------\n\n /**\n * Cumulative growth metrics.\n *\n * `GET /v1/markets/growth/cumulative`\n */\n async growthCumulative(params: MarketSnapshotParams): Promise<GrowthCumulativeResponse> {\n const { signal, ...query } = params;\n const qs = buildQueryString(query);\n return this.http.get<GrowthCumulativeResponse>(`/v1/markets/growth/cumulative${qs}`, { signal });\n }\n\n /**\n * Annualised growth metrics.\n *\n * `GET /v1/markets/growth/annualised`\n */\n async growthAnnualised(params: MarketSnapshotParams): Promise<GrowthAnnualisedResponse> {\n const { signal, ...query } = params;\n const qs = buildQueryString(query);\n return this.http.get<GrowthAnnualisedResponse>(`/v1/markets/growth/annualised${qs}`, { signal });\n }\n\n /**\n * Supply metrics.\n *\n * `GET /v1/markets/supply`\n */\n async supply(params: MarketSnapshotParams): Promise<MarketSupplyResponse> {\n const { signal, ...query } = params;\n const qs = buildQueryString(query);\n return this.http.get<MarketSupplyResponse>(`/v1/markets/supply${qs}`, { signal });\n }\n\n /**\n * Supply long-term slope metrics.\n *\n * `GET /v1/markets/supply/ls`\n */\n async supplyLongSlope(params: MarketSnapshotParams): Promise<SupplyLongSlopeResponse> {\n const { signal, ...query } = params;\n const qs = buildQueryString(query);\n return this.http.get<SupplyLongSlopeResponse>(`/v1/markets/supply/ls${qs}`, { signal });\n }\n\n /**\n * Supply short-term slope metrics.\n *\n * `GET /v1/markets/supply/ss`\n */\n async supplyShortSlope(params: MarketSnapshotParams): Promise<SupplyShortSlopeResponse> {\n const { signal, ...query } = params;\n const qs = buildQueryString(query);\n return this.http.get<SupplyShortSlopeResponse>(`/v1/markets/supply/ss${qs}`, { signal });\n }\n\n /**\n * Demand metrics.\n *\n * `GET /v1/markets/demand`\n */\n async demand(params: MarketSnapshotParams): Promise<MarketDemandResponse> {\n const { signal, ...query } = params;\n const qs = buildQueryString(query);\n return this.http.get<MarketDemandResponse>(`/v1/markets/demand${qs}`, { signal });\n }\n\n /**\n * Demand long-term slope metrics.\n *\n * `GET /v1/markets/demand/ls`\n */\n async demandLongSlope(params: MarketSnapshotParams): Promise<DemandLongSlopeResponse> {\n const { signal, ...query } = params;\n const qs = buildQueryString(query);\n return this.http.get<DemandLongSlopeResponse>(`/v1/markets/demand/ls${qs}`, { signal });\n }\n\n /**\n * Demand short-term slope metrics.\n *\n * `GET /v1/markets/demand/ss`\n */\n async demandShortSlope(params: MarketSnapshotParams): Promise<DemandShortSlopeResponse> {\n const { signal, ...query } = params;\n const qs = buildQueryString(query);\n return this.http.get<DemandShortSlopeResponse>(`/v1/markets/demand/ss${qs}`, { signal });\n }\n\n /**\n * Market scores (RCS, HAPI, volatility).\n *\n * `GET /v1/markets/scores`\n */\n async scores(params: MarketSnapshotParams): Promise<MarketScoresResponse> {\n const { signal, ...query } = params;\n const qs = buildQueryString(query);\n return this.http.get<MarketScoresResponse>(`/v1/markets/scores${qs}`, { signal });\n }\n\n /**\n * Market fundamentals (IRSAD, ratios, years to own).\n *\n * `GET /v1/markets/fundamentals`\n */\n async fundamentals(params: MarketSnapshotParams): Promise<MarketFundamentalsResponse> {\n const { signal, ...query } = params;\n const qs = buildQueryString(query);\n return this.http.get<MarketFundamentalsResponse>(`/v1/markets/fundamentals${qs}`, { signal });\n }\n\n /**\n * Market cycle indicators.\n *\n * `GET /v1/markets/cycle`\n */\n async cycle(params: MarketSnapshotParams): Promise<MarketCycleResponse> {\n const { signal, ...query } = params;\n const qs = buildQueryString(query);\n return this.http.get<MarketCycleResponse>(`/v1/markets/cycle${qs}`, { signal });\n }\n\n /**\n * Market risk indicators (flood, fire, diversity, distance).\n *\n * `GET /v1/markets/risk`\n */\n async risk(params: MarketSnapshotParams): Promise<MarketRiskResponse> {\n const { signal, ...query } = params;\n const qs = buildQueryString(query);\n return this.http.get<MarketRiskResponse>(`/v1/markets/risk${qs}`, { signal });\n }\n}\n","import type { HttpClient } from '../http.js';\nimport { buildQueryString } from '../http.js';\nimport type { RequestOptions } from '../types.js';\nimport type {\n SubmitEventParams,\n ClassifiedEvent,\n QueryEventsParams,\n PaginatedEvents,\n CreateIntegrationParams,\n Integration,\n UpdateIntegrationParams,\n TestResult,\n CreateSubscriptionParams,\n Subscription,\n UpdateSubscriptionParams,\n EventCategory,\n EventType,\n TagInfo,\n} from './types.js';\n\n/**\n * Client for the Intent Hub API domain.\n *\n * ```ts\n * const event = await client.intentHub.submitEvent({\n * sourceType: 'AGENT',\n * sourceId: 'my-agent',\n * textContent: 'User wants to refinance their mortgage',\n * });\n * ```\n */\nexport class IntentHubClient {\n /** @internal */\n constructor(private readonly http: HttpClient) {}\n\n // -------------------------------------------------------------------------\n // Events\n // -------------------------------------------------------------------------\n\n /**\n * Submit a raw event for classification.\n *\n * `POST /intent-hub/v1/events`\n */\n async submitEvent(params: SubmitEventParams): Promise<ClassifiedEvent> {\n const { signal, ...rest } = params;\n return this.http.intentHubPost<ClassifiedEvent>(\n '/events',\n {\n source_type: rest.sourceType,\n source_id: rest.sourceId,\n text_content: rest.textContent,\n payload: rest.payload,\n user_id: rest.userId,\n session_id: rest.sessionId,\n suggested_category: rest.suggestedCategory,\n suggested_intent: rest.suggestedIntent,\n idempotency_key: rest.idempotencyKey,\n event_type: rest.eventType,\n },\n { signal },\n );\n }\n\n /**\n * Retrieve a single classified event by ID.\n *\n * `GET /intent-hub/v1/events/:eventId`\n */\n async getEvent(eventId: string, options?: RequestOptions): Promise<ClassifiedEvent> {\n return this.http.intentHubGet<ClassifiedEvent>(\n `/events/${encodeURIComponent(eventId)}`,\n options,\n );\n }\n\n /**\n * Query classified events with optional filters.\n *\n * `GET /intent-hub/v1/events`\n */\n async queryEvents(params?: QueryEventsParams): Promise<PaginatedEvents> {\n if (!params) {\n return this.http.intentHubGet<PaginatedEvents>('/events');\n }\n const { signal, ...query } = params;\n const qs = buildQueryString(query);\n return this.http.intentHubGet<PaginatedEvents>(`/events${qs}`, { signal });\n }\n\n // -------------------------------------------------------------------------\n // Integrations\n // -------------------------------------------------------------------------\n\n /**\n * Create a new integration endpoint.\n *\n * `POST /intent-hub/v1/integrations`\n */\n async createIntegration(params: CreateIntegrationParams): Promise<Integration> {\n const { signal, ...rest } = params;\n return this.http.intentHubPost<Integration>(\n '/integrations',\n {\n name: rest.name,\n type: rest.type,\n url: rest.url,\n secret: rest.secret,\n headers: rest.headers,\n config: rest.config,\n },\n { signal },\n );\n }\n\n /**\n * List all integrations for the current organisation.\n *\n * `GET /intent-hub/v1/integrations`\n */\n async listIntegrations(options?: RequestOptions): Promise<Integration[]> {\n return this.http.intentHubGet<Integration[]>('/integrations', options);\n }\n\n /**\n * Retrieve a single integration by ID.\n *\n * `GET /intent-hub/v1/integrations/:id`\n */\n async getIntegration(id: string, options?: RequestOptions): Promise<Integration> {\n return this.http.intentHubGet<Integration>(\n `/integrations/${encodeURIComponent(id)}`,\n options,\n );\n }\n\n /**\n * Update an existing integration.\n *\n * `PATCH /intent-hub/v1/integrations/:id`\n */\n async updateIntegration(\n id: string,\n params: UpdateIntegrationParams,\n ): Promise<Integration> {\n const { signal, ...rest } = params;\n return this.http.intentHubPatch<Integration>(\n `/integrations/${encodeURIComponent(id)}`,\n {\n name: rest.name,\n url: rest.url,\n secret: rest.secret,\n status: rest.status,\n },\n { signal },\n );\n }\n\n /**\n * Delete an integration by ID.\n *\n * `DELETE /intent-hub/v1/integrations/:id`\n */\n async deleteIntegration(id: string, options?: RequestOptions): Promise<void> {\n return this.http.intentHubDelete<void>(\n `/integrations/${encodeURIComponent(id)}`,\n options,\n );\n }\n\n /**\n * Send a test event to an integration endpoint.\n *\n * `POST /intent-hub/v1/integrations/:id/test`\n */\n async testIntegration(id: string, options?: RequestOptions): Promise<TestResult> {\n return this.http.intentHubPost<TestResult>(\n `/integrations/${encodeURIComponent(id)}/test`,\n {},\n options,\n );\n }\n\n // -------------------------------------------------------------------------\n // Subscriptions\n // -------------------------------------------------------------------------\n\n /**\n * Create a new subscription linking event patterns to an integration.\n *\n * `POST /intent-hub/v1/subscriptions`\n */\n async createSubscription(params: CreateSubscriptionParams): Promise<Subscription> {\n const { signal, ...rest } = params;\n return this.http.intentHubPost<Subscription>(\n '/subscriptions',\n {\n integration_id: rest.integrationId,\n event_type_slug: rest.eventTypeSlug,\n tag: rest.tag,\n intent_pattern: rest.intentPattern,\n filters: rest.filters,\n },\n { signal },\n );\n }\n\n /**\n * List all subscriptions for the current organisation.\n *\n * `GET /intent-hub/v1/subscriptions`\n */\n async listSubscriptions(options?: RequestOptions): Promise<Subscription[]> {\n return this.http.intentHubGet<Subscription[]>('/subscriptions', options);\n }\n\n /**\n * Retrieve a single subscription by ID.\n *\n * `GET /intent-hub/v1/subscriptions/:id`\n */\n async getSubscription(id: string, options?: RequestOptions): Promise<Subscription> {\n return this.http.intentHubGet<Subscription>(\n `/subscriptions/${encodeURIComponent(id)}`,\n options,\n );\n }\n\n /**\n * Update an existing subscription.\n *\n * `PATCH /intent-hub/v1/subscriptions/:id`\n */\n async updateSubscription(\n id: string,\n params: UpdateSubscriptionParams,\n ): Promise<Subscription> {\n const { signal, ...rest } = params;\n return this.http.intentHubPatch<Subscription>(\n `/subscriptions/${encodeURIComponent(id)}`,\n {\n event_type_slug: rest.eventTypeSlug,\n tag: rest.tag,\n intent_pattern: rest.intentPattern,\n integration_id: rest.integrationId,\n is_active: rest.isActive,\n },\n { signal },\n );\n }\n\n /**\n * Delete a subscription by ID.\n *\n * `DELETE /intent-hub/v1/subscriptions/:id`\n */\n async deleteSubscription(id: string, options?: RequestOptions): Promise<void> {\n return this.http.intentHubDelete<void>(\n `/subscriptions/${encodeURIComponent(id)}`,\n options,\n );\n }\n\n // -------------------------------------------------------------------------\n // Catalog\n // -------------------------------------------------------------------------\n\n /**\n * List all event categories in the taxonomy.\n *\n * `GET /intent-hub/v1/catalog/categories`\n */\n async listCategories(options?: RequestOptions): Promise<EventCategory[]> {\n return this.http.intentHubGet<EventCategory[]>('/catalog/categories', options);\n }\n\n /**\n * List event types, optionally filtered by category.\n *\n * `GET /intent-hub/v1/catalog/event-types`\n */\n async listEventTypes(\n params?: { category?: string } & RequestOptions,\n ): Promise<EventType[]> {\n if (!params) {\n return this.http.intentHubGet<EventType[]>('/catalog/event-types');\n }\n const { signal, ...query } = params;\n const qs = buildQueryString(query);\n return this.http.intentHubGet<EventType[]>(`/catalog/event-types${qs}`, { signal });\n }\n\n /**\n * List all tags with their usage counts.\n *\n * `GET /intent-hub/v1/catalog/tags`\n */\n async listTags(options?: RequestOptions): Promise<TagInfo[]> {\n return this.http.intentHubGet<TagInfo[]>('/catalog/tags', options);\n }\n}\n","import type { HttpClient } from '../http.js';\nimport { buildQueryString } from '../http.js';\nimport type {\n LocalityParams,\n LocalityResponse,\n LgaParams,\n LgaResponse,\n} from './types.js';\n\nexport class ReferenceClient {\n constructor(private readonly http: HttpClient) {}\n\n async locality(params: LocalityParams): Promise<LocalityResponse> {\n const { signal, ...query } = params;\n const qs = buildQueryString(query);\n return this.http.get<LocalityResponse>(`/v1/reference/locality${qs}`, { signal });\n }\n\n async lga(params: LgaParams): Promise<LgaResponse> {\n const { signal, ...query } = params;\n const qs = buildQueryString(query);\n return this.http.get<LgaResponse>(`/v1/reference/lga${qs}`, { signal });\n }\n}\n","import type { HtAgClientOptions, ResolvedConfig } from './types.js';\nimport { HttpClient } from './http.js';\nimport { AddressClient } from './address/client.js';\nimport { PropertyClient } from './property/client.js';\nimport { MarketsClient } from './markets/client.js';\nimport { IntentHubClient } from './intent-hub/client.js';\nimport { ReferenceClient } from './reference/client.js';\n\n// ---------------------------------------------------------------------------\n// Defaults\n// ---------------------------------------------------------------------------\n\nconst DEFAULT_MAX_RETRIES = 3;\nconst DEFAULT_RETRY_BASE_DELAY = 500; // ms\nconst DEFAULT_TIMEOUT = 30_000; // 30 seconds\n\n/**\n * Build the environment-derived base URLs.\n *\n * - `prod` -> `https://api.prod.htagai.com`\n * - `dev` -> `https://api.dev.htagai.com`\n */\nfunction resolveBaseUrls(options: HtAgClientOptions): {\n publicBaseUrl: string;\n internalBaseUrl: string;\n intentHubBaseUrl: string;\n} {\n if (options.baseUrl) {\n // Strip trailing slashes for consistency.\n const base = options.baseUrl.replace(/\\/+$/, '');\n return { publicBaseUrl: base, internalBaseUrl: base, intentHubBaseUrl: base };\n }\n\n const env = options.environment ?? 'prod';\n const base = `https://api.${env}.htagai.com`;\n return {\n publicBaseUrl: base,\n internalBaseUrl: base,\n intentHubBaseUrl: `${base}/intent-hub/v1`,\n };\n}\n\n// ---------------------------------------------------------------------------\n// HtAgApiClient\n// ---------------------------------------------------------------------------\n\n/**\n * Top-level client for the HtAG Location Intelligence APIs.\n *\n * ```ts\n * import { HtAgApiClient } from '@htag/sdk';\n *\n * const client = new HtAgApiClient({\n * apiKey: process.env.HTAG_API_KEY!,\n * environment: 'prod',\n * });\n *\n * const results = await client.address.search({ q: '100 George St Sydney' });\n * ```\n */\nexport class HtAgApiClient {\n /** Address search, insights and standardisation. */\n readonly address: AddressClient;\n\n /** Sold property search. */\n readonly property: PropertyClient;\n\n /** Market snapshots, advanced queries and time-series trends. */\n readonly markets: MarketsClient;\n\n /** Intent Hub: event classification, integrations and subscriptions. */\n readonly intentHub: IntentHubClient;\n\n /** Reference data: localities and LGAs. */\n readonly reference: ReferenceClient;\n\n constructor(options: HtAgClientOptions) {\n if (!options.apiKey) {\n throw new Error(\n 'HtAgApiClient requires an apiKey. Pass it in the constructor options.',\n );\n }\n\n const { publicBaseUrl, internalBaseUrl, intentHubBaseUrl } = resolveBaseUrls(options);\n\n const config: ResolvedConfig = {\n apiKey: options.apiKey,\n publicBaseUrl,\n internalBaseUrl,\n intentHubBaseUrl,\n maxRetries: options.maxRetries ?? DEFAULT_MAX_RETRIES,\n retryBaseDelay: options.retryBaseDelay ?? DEFAULT_RETRY_BASE_DELAY,\n timeout: options.timeout ?? DEFAULT_TIMEOUT,\n };\n\n const http = new HttpClient(config);\n\n this.address = new AddressClient(http);\n this.property = new PropertyClient(http);\n this.markets = new MarketsClient(http);\n this.intentHub = new IntentHubClient(http);\n this.reference = new ReferenceClient(http);\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACGO,IAAM,YAAN,cAAwB,MAAM;AAAA;AAAA,EAE1B;AAAA;AAAA,EAGA;AAAA;AAAA,EAGA;AAAA,EAET,YACE,SACA,SAMA;AACA,UAAM,SAAS,EAAE,OAAO,SAAS,MAAM,CAAC;AACxC,SAAK,OAAO;AACZ,SAAK,SAAS,SAAS;AACvB,SAAK,OAAO,SAAS;AACrB,SAAK,MAAM,SAAS;AAAA,EACtB;AACF;AAKO,IAAM,sBAAN,cAAkC,UAAU;AAAA,EACjD,YAAY,SAAyD;AACnE;AAAA,MACE,+BAA+B,QAAQ,MAAM;AAAA,MAC7C;AAAA,IACF;AACA,SAAK,OAAO;AAAA,EACd;AACF;AAKO,IAAM,iBAAN,cAA6B,UAAU;AAAA,EAC5C,YAAY,SAAyC;AACnD,UAAM,0DAA0D;AAAA,MAC9D,QAAQ;AAAA,MACR,GAAG;AAAA,IACL,CAAC;AACD,SAAK,OAAO;AAAA,EACd;AACF;AAKO,IAAM,kBAAN,cAA8B,UAAU;AAAA,EAC7C,YAAY,SAAyD;AACnE,UAAM,SAAS,cAAc,QAAQ,IAAI;AACzC;AAAA,MACE,SACI,0BAA0B,QAAQ,MAAM,MAAM,MAAM,KACpD,0BAA0B,QAAQ,MAAM;AAAA,MAC5C;AAAA,IACF;AACA,SAAK,OAAO;AAAA,EACd;AACF;AAKO,IAAM,cAAN,cAA0B,UAAU;AAAA,EACzC,YAAY,SAAyD;AACnE,UAAM,sBAAsB,QAAQ,MAAM,KAAK,OAAO;AACtD,SAAK,OAAO;AAAA,EACd;AACF;AAMA,SAAS,cAAc,MAAmC;AACxD,MAAI,QAAQ,OAAO,SAAS,YAAY,YAAY,MAAM;AACxD,UAAM,SAAU,KAAiC;AACjD,QAAI,OAAO,WAAW,SAAU,QAAO;AACvC,QAAI,MAAM,QAAQ,MAAM,GAAG;AACzB,aAAO,OACJ,IAAI,CAAC,MAAM;AACV,YAAI,OAAO,MAAM,SAAU,QAAO;AAClC,YAAI,KAAK,OAAO,MAAM,YAAY,SAAS,EAAG,QAAO,OAAO,EAAE,GAAG;AACjE,eAAO,KAAK,UAAU,CAAC;AAAA,MACzB,CAAC,EACA,KAAK,IAAI;AAAA,IACd;AACA,WAAO,KAAK,UAAU,MAAM;AAAA,EAC9B;AACA,SAAO;AACT;;;ACjFA,SAAS,YAAY,KAAqB;AACxC,SAAO,IACJ,QAAQ,yBAAyB,OAAO,EACxC,QAAQ,sBAAsB,OAAO,EACrC,YAAY;AACjB;AAWO,SAAS,iBACd,QACQ;AACR,QAAM,QAAkB,CAAC;AAEzB,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,MAAM,GAAG;AAEjD,QAAI,QAAQ,SAAU;AACtB,QAAI,UAAU,UAAa,UAAU,KAAM;AAE3C,UAAM,WAAW,YAAY,GAAG;AAEhC,QAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,UAAI,MAAM,SAAS,GAAG;AACpB,cAAM;AAAA,UACJ,GAAG,mBAAmB,QAAQ,CAAC,IAAI,mBAAmB,MAAM,KAAK,GAAG,CAAC,CAAC;AAAA,QACxE;AAAA,MACF;AAAA,IACF,OAAO;AACL,YAAM;AAAA,QACJ,GAAG,mBAAmB,QAAQ,CAAC,IAAI,mBAAmB,OAAO,KAAK,CAAC,CAAC;AAAA,MACtE;AAAA,IACF;AAAA,EACF;AAEA,SAAO,MAAM,SAAS,IAAI,IAAI,MAAM,KAAK,GAAG,CAAC,KAAK;AACpD;AAMA,SAAS,YAAY,QAAyB;AAC5C,SAAO,WAAW,OAAO,UAAU;AACrC;AAEA,SAAS,MAAM,IAA2B;AACxC,SAAO,IAAI,QAAQ,CAAC,YAAY,WAAW,SAAS,EAAE,CAAC;AACzD;AAMA,eAAe,UAAU,UAAsC;AAC7D,QAAM,cAAc,SAAS,QAAQ,IAAI,cAAc,KAAK;AAC5D,MAAI,YAAY,SAAS,kBAAkB,GAAG;AAC5C,QAAI;AACF,aAAO,MAAM,SAAS,KAAK;AAAA,IAC7B,QAAQ;AACN,aAAO,MAAM,SAAS,KAAK;AAAA,IAC7B;AAAA,EACF;AACA,SAAO,MAAM,SAAS,KAAK;AAC7B;AAKA,SAAS,eACP,QACA,MACA,KACO;AACP,MAAI,WAAW,OAAO,WAAW,KAAK;AACpC,UAAM,IAAI,oBAAoB,EAAE,QAAQ,MAAM,IAAI,CAAC;AAAA,EACrD;AACA,MAAI,WAAW,KAAK;AAClB,UAAM,IAAI,eAAe,EAAE,MAAM,IAAI,CAAC;AAAA,EACxC;AACA,MAAI,WAAW,OAAO,WAAW,KAAK;AACpC,UAAM,IAAI,gBAAgB,EAAE,QAAQ,MAAM,IAAI,CAAC;AAAA,EACjD;AACA,MAAI,UAAU,KAAK;AACjB,UAAM,IAAI,YAAY,EAAE,QAAQ,MAAM,IAAI,CAAC;AAAA,EAC7C;AACA,QAAM,IAAI,UAAU,QAAQ,MAAM,IAAI,EAAE,QAAQ,MAAM,IAAI,CAAC;AAC7D;AAKO,IAAM,aAAN,MAAiB;AAAA,EACtB,YAA6B,QAAwB;AAAxB;AAAA,EAAyB;AAAA;AAAA;AAAA;AAAA,EAKtD,MAAM,IAAO,MAAc,SAAsC;AAC/D,WAAO,KAAK,QAAW,OAAO,KAAK,OAAO,gBAAgB,MAAM,QAAW,OAAO;AAAA,EACpF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,KACJ,MACA,MACA,SACY;AACZ,WAAO,KAAK,QAAW,QAAQ,KAAK,OAAO,gBAAgB,MAAM,MAAM,OAAO;AAAA,EAChF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,MACJ,MACA,MACA,SACY;AACZ,WAAO,KAAK,QAAW,SAAS,KAAK,OAAO,gBAAgB,MAAM,MAAM,OAAO;AAAA,EACjF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OAAU,MAAc,SAAsC;AAClE,WAAO,KAAK,QAAW,UAAU,KAAK,OAAO,gBAAgB,MAAM,QAAW,OAAO;AAAA,EACvF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,YAAe,MAAc,SAAsC;AACvE,WAAO,KAAK,QAAW,OAAO,KAAK,OAAO,kBAAkB,MAAM,QAAW,OAAO;AAAA,EACtF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,aACJ,MACA,MACA,SACY;AACZ,WAAO,KAAK,QAAW,QAAQ,KAAK,OAAO,kBAAkB,MAAM,MAAM,OAAO;AAAA,EAClF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,aAAgB,MAAc,SAAsC;AACxE,WAAO,KAAK,QAAW,OAAO,KAAK,OAAO,mBAAmB,MAAM,QAAW,OAAO;AAAA,EACvF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,cACJ,MACA,MACA,SACY;AACZ,WAAO,KAAK,QAAW,QAAQ,KAAK,OAAO,mBAAmB,MAAM,MAAM,OAAO;AAAA,EACnF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,eACJ,MACA,MACA,SACY;AACZ,WAAO,KAAK,QAAW,SAAS,KAAK,OAAO,mBAAmB,MAAM,MAAM,OAAO;AAAA,EACpF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,gBAAmB,MAAc,SAAsC;AAC3E,WAAO,KAAK,QAAW,UAAU,KAAK,OAAO,mBAAmB,MAAM,QAAW,OAAO;AAAA,EAC1F;AAAA;AAAA;AAAA;AAAA,EAMA,MAAc,QACZ,QACA,KACA,MACA,SACY;AACZ,UAAM,UAAkC;AAAA,MACtC,aAAa,KAAK,OAAO;AAAA,MACzB,UAAU;AAAA,IACZ;AAEA,QAAI,SAAS,QAAW;AACtB,cAAQ,cAAc,IAAI;AAAA,IAC5B;AAEA,QAAI;AAEJ,aAAS,UAAU,GAAG,WAAW,KAAK,OAAO,YAAY,WAAW;AAElE,UAAI,UAAU,GAAG;AACf,cAAM,OAAO,KAAK,OAAO,iBAAiB,KAAK,IAAI,GAAG,UAAU,CAAC;AACjE,cAAM,SAAS,KAAK,OAAO,IAAI,OAAO;AACtC,cAAM,MAAM,OAAO,MAAM;AAAA,MAC3B;AAGA,YAAM,aAAa,IAAI,gBAAgB;AACvC,UAAI;AAEJ,YAAM,UAAU,MAAM;AACpB,YAAI,cAAc,OAAW,cAAa,SAAS;AAAA,MACrD;AAGA,UAAI,SAAS,QAAQ;AACnB,YAAI,QAAQ,OAAO,SAAS;AAC1B,gBAAM,IAAI,UAAU,mBAAmB;AAAA,YACrC;AAAA,YACA,OAAO,QAAQ,OAAO;AAAA,UACxB,CAAC;AAAA,QACH;AACA,gBAAQ,OAAO,iBAAiB,SAAS,MAAM,WAAW,MAAM,QAAQ,OAAQ,MAAM,GAAG;AAAA,UACvF,MAAM;AAAA,QACR,CAAC;AAAA,MACH;AAEA,kBAAY;AAAA,QACV,MAAM,WAAW,MAAM,IAAI,MAAM,mBAAmB,CAAC;AAAA,QACrD,KAAK,OAAO;AAAA,MACd;AAEA,UAAI;AACF,cAAM,WAAW,MAAM,MAAM,KAAK;AAAA,UAChC;AAAA,UACA;AAAA,UACA,MAAM,SAAS,SAAY,KAAK,UAAU,IAAI,IAAI;AAAA,UAClD,QAAQ,WAAW;AAAA,QACrB,CAAC;AAED,gBAAQ;AAER,YAAI,SAAS,IAAI;AAEf,cAAI,SAAS,WAAW,KAAK;AAC3B,mBAAO;AAAA,UACT;AACA,iBAAQ,MAAM,UAAU,QAAQ;AAAA,QAClC;AAEA,cAAM,eAAe,MAAM,UAAU,QAAQ;AAG7C,YAAI,YAAY,SAAS,MAAM,KAAK,UAAU,KAAK,OAAO,YAAY;AACpE,sBAAY,IAAI,UAAU,QAAQ,SAAS,MAAM,IAAI;AAAA,YACnD,QAAQ,SAAS;AAAA,YACjB,MAAM;AAAA,YACN;AAAA,UACF,CAAC;AACD;AAAA,QACF;AAGA,uBAAe,SAAS,QAAQ,cAAc,GAAG;AAAA,MACnD,SAAS,KAAK;AACZ,gBAAQ;AAGR,YAAI,eAAe,WAAW;AAC5B,gBAAM;AAAA,QACR;AAGA,YAAI,eAAe,gBAAgB,IAAI,SAAS,cAAc;AAC5D,cAAI,SAAS,QAAQ,SAAS;AAC5B,kBAAM,IAAI,UAAU,mBAAmB,EAAE,KAAK,OAAO,IAAI,CAAC;AAAA,UAC5D;AACA,gBAAM,IAAI,UAAU,qBAAqB,EAAE,KAAK,OAAO,IAAI,CAAC;AAAA,QAC9D;AAGA,YAAI,UAAU,KAAK,OAAO,YAAY;AACpC,sBAAY,eAAe,QAAQ,MAAM,IAAI,MAAM,OAAO,GAAG,CAAC;AAC9D;AAAA,QACF;AAEA,cAAM,IAAI;AAAA,UACR,kBAAkB,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AAAA,UAClE,EAAE,KAAK,OAAO,IAAI;AAAA,QACpB;AAAA,MACF;AAAA,IACF;AAGA,UAAM,aAAa,IAAI,UAAU,gCAAgC,EAAE,IAAI,CAAC;AAAA,EAC1E;AACF;;;ACnTO,IAAM,gBAAN,MAAoB;AAAA;AAAA,EAEzB,YAA6B,MAAkB;AAAlB;AAAA,EAAmB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOhD,MAAM,OAAO,QAA6D;AACxE,UAAM,EAAE,QAAQ,GAAG,MAAM,IAAI;AAC7B,UAAM,KAAK,iBAAiB,KAAK;AACjC,WAAO,KAAK,KAAK,IAA2B,qBAAqB,EAAE,IAAI,EAAE,OAAO,CAAC;AAAA,EACnF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,SAAS,QAAiE;AAC9E,UAAM,EAAE,QAAQ,GAAG,MAAM,IAAI;AAC7B,UAAM,KAAK,iBAAiB,KAAK;AACjC,WAAO,KAAK,KAAK,YAAqC,oCAAoC,EAAE,IAAI,EAAE,OAAO,CAAC;AAAA,EAC5G;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,YAAY,QAAmE;AACnF,UAAM,EAAE,QAAQ,UAAU,IAAI;AAC9B,WAAO,KAAK,KAAK;AAAA,MACf;AAAA,MACA,EAAE,UAAU;AAAA,MACZ,EAAE,OAAO;AAAA,IACX;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,QAAQ,QAAiD;AAC7D,UAAM,EAAE,QAAQ,GAAG,MAAM,IAAI;AAC7B,UAAM,KAAK,iBAAiB,KAAK;AACjC,WAAO,KAAK,KAAK,IAAqB,sBAAsB,EAAE,IAAI,EAAE,OAAO,CAAC;AAAA,EAC9E;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,YAAY,QAAyD;AACzE,UAAM,EAAE,QAAQ,GAAG,MAAM,IAAI;AAC7B,UAAM,KAAK,iBAAiB,KAAK;AACjC,WAAO,KAAK,KAAK,IAAyB,0BAA0B,EAAE,IAAI,EAAE,OAAO,CAAC;AAAA,EACtF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,aAAa,QAA2D;AAC5E,UAAM,EAAE,QAAQ,GAAG,MAAM,IAAI;AAC7B,UAAM,KAAK,iBAAiB,KAAK;AACjC,WAAO,KAAK,KAAK,IAA0B,2BAA2B,EAAE,IAAI,EAAE,OAAO,CAAC;AAAA,EACxF;AACF;;;AClFO,IAAM,iBAAN,MAAqB;AAAA;AAAA,EAE1B,YAA6B,MAAkB;AAAlB;AAAA,EAAmB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOhD,MAAM,WAAW,QAA2D;AAC1E,UAAM,EAAE,QAAQ,GAAG,MAAM,IAAI;AAC7B,UAAM,KAAK,iBAAiB,KAAK;AACjC,WAAO,KAAK,KAAK,IAA4B,2BAA2B,EAAE,IAAI,EAAE,OAAO,CAAC;AAAA,EAC1F;AACF;;;ACMO,IAAM,eAAN,MAAmB;AAAA;AAAA,EAExB,YAA6B,MAAkB;AAAlB;AAAA,EAAmB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOhD,MAAM,MAAM,QAA0D;AACpE,WAAO,KAAK,MAAqB,SAAS,MAAM;AAAA,EAClD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,KAAK,QAAyD;AAClE,WAAO,KAAK,YAA0B,QAAQ,MAAM;AAAA,EACtD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,aAAa,QAA0D;AAC3E,WAAO,KAAK,YAA2B,SAAS,MAAM;AAAA,EACxD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,aAAa,QAAiE;AAClF,WAAO,KAAK,MAA4B,iBAAiB,MAAM;AAAA,EACjE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,YAAY,QAAoD;AACpE,WAAO,KAAK,MAA2B,gBAAgB,MAAM;AAAA,EAC/D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,WAAW,QAAmD;AAClE,WAAO,KAAK,MAA0B,eAAe,MAAM;AAAA,EAC7D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,YAAY,QAAgE;AAChF,WAAO,KAAK,MAA2B,eAAe,MAAM;AAAA,EAC9D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,YAAY,QAAoD;AACpE,WAAO,KAAK,YAAiC,gBAAgB,MAAM;AAAA,EACrE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,cAAc,QAAsD;AACxE,WAAO,KAAK,YAAmC,kBAAkB,MAAM;AAAA,EACzE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,cAAc,QAAsD;AACxE,WAAO,KAAK,YAAmC,mBAAmB,MAAM;AAAA,EAC1E;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,UAAU,QAAuD;AACrE,WAAO,KAAK,YAAoC,aAAa,MAAM;AAAA,EACrE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,aAAa,QAAqD;AACtE,WAAO,KAAK,YAAkC,kBAAkB,MAAM;AAAA,EACxE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,cAAc,QAAsD;AACxE,WAAO,KAAK,YAAmC,kBAAkB,MAAM;AAAA,EACzE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,QAAQ,QAAgD;AAC5D,WAAO,KAAK,YAA6B,WAAW,MAAM;AAAA,EAC5D;AAAA;AAAA;AAAA;AAAA,EAMA,MAAc,MAAS,QAAgB,QAA6D;AAClG,UAAM,EAAE,QAAQ,GAAG,MAAM,IAAI;AAC7B,UAAM,KAAK,iBAAiB,KAAK;AACjC,WAAO,KAAK,KAAK;AAAA,MACf,mCAAmC,MAAM,GAAG,EAAE;AAAA,MAC9C,EAAE,OAAO;AAAA,IACX;AAAA,EACF;AAAA,EAEA,MAAc,YAAe,QAAgB,QAA6D;AACxG,UAAM,EAAE,QAAQ,GAAG,MAAM,IAAI;AAC7B,UAAM,KAAK,iBAAiB,KAAK;AACjC,WAAO,KAAK,KAAK;AAAA,MACf,sBAAsB,MAAM,GAAG,EAAE;AAAA,MACjC,EAAE,OAAO;AAAA,IACX;AAAA,EACF;AACF;;;AClJO,IAAM,gBAAN,MAAoB;AAAA;AAAA,EAKzB,YAA6B,MAAkB;AAAlB;AAC3B,SAAK,SAAS,IAAI,aAAa,IAAI;AAAA,EACrC;AAAA;AAAA,EALS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYT,MAAM,UAAU,QAAqD;AACnE,UAAM,EAAE,QAAQ,GAAG,MAAM,IAAI;AAC7B,UAAM,KAAK,iBAAiB,KAAK;AACjC,WAAO,KAAK,KAAK;AAAA,MACf,qCAAqC,EAAE;AAAA,MACvC,EAAE,OAAO;AAAA,IACX;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,MACJ,MACA,SAC8B;AAC9B,WAAO,KAAK,KAAK;AAAA,MACf;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,MAAM,iBAAiB,QAAiE;AACtF,UAAM,EAAE,QAAQ,GAAG,MAAM,IAAI;AAC7B,UAAM,KAAK,iBAAiB,KAAK;AACjC,WAAO,KAAK,KAAK,IAA8B,gCAAgC,EAAE,IAAI,EAAE,OAAO,CAAC;AAAA,EACjG;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,iBAAiB,QAAiE;AACtF,UAAM,EAAE,QAAQ,GAAG,MAAM,IAAI;AAC7B,UAAM,KAAK,iBAAiB,KAAK;AACjC,WAAO,KAAK,KAAK,IAA8B,gCAAgC,EAAE,IAAI,EAAE,OAAO,CAAC;AAAA,EACjG;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,OAAO,QAA6D;AACxE,UAAM,EAAE,QAAQ,GAAG,MAAM,IAAI;AAC7B,UAAM,KAAK,iBAAiB,KAAK;AACjC,WAAO,KAAK,KAAK,IAA0B,qBAAqB,EAAE,IAAI,EAAE,OAAO,CAAC;AAAA,EAClF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,gBAAgB,QAAgE;AACpF,UAAM,EAAE,QAAQ,GAAG,MAAM,IAAI;AAC7B,UAAM,KAAK,iBAAiB,KAAK;AACjC,WAAO,KAAK,KAAK,IAA6B,wBAAwB,EAAE,IAAI,EAAE,OAAO,CAAC;AAAA,EACxF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,iBAAiB,QAAiE;AACtF,UAAM,EAAE,QAAQ,GAAG,MAAM,IAAI;AAC7B,UAAM,KAAK,iBAAiB,KAAK;AACjC,WAAO,KAAK,KAAK,IAA8B,wBAAwB,EAAE,IAAI,EAAE,OAAO,CAAC;AAAA,EACzF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,OAAO,QAA6D;AACxE,UAAM,EAAE,QAAQ,GAAG,MAAM,IAAI;AAC7B,UAAM,KAAK,iBAAiB,KAAK;AACjC,WAAO,KAAK,KAAK,IAA0B,qBAAqB,EAAE,IAAI,EAAE,OAAO,CAAC;AAAA,EAClF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,gBAAgB,QAAgE;AACpF,UAAM,EAAE,QAAQ,GAAG,MAAM,IAAI;AAC7B,UAAM,KAAK,iBAAiB,KAAK;AACjC,WAAO,KAAK,KAAK,IAA6B,wBAAwB,EAAE,IAAI,EAAE,OAAO,CAAC;AAAA,EACxF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,iBAAiB,QAAiE;AACtF,UAAM,EAAE,QAAQ,GAAG,MAAM,IAAI;AAC7B,UAAM,KAAK,iBAAiB,KAAK;AACjC,WAAO,KAAK,KAAK,IAA8B,wBAAwB,EAAE,IAAI,EAAE,OAAO,CAAC;AAAA,EACzF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,OAAO,QAA6D;AACxE,UAAM,EAAE,QAAQ,GAAG,MAAM,IAAI;AAC7B,UAAM,KAAK,iBAAiB,KAAK;AACjC,WAAO,KAAK,KAAK,IAA0B,qBAAqB,EAAE,IAAI,EAAE,OAAO,CAAC;AAAA,EAClF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,aAAa,QAAmE;AACpF,UAAM,EAAE,QAAQ,GAAG,MAAM,IAAI;AAC7B,UAAM,KAAK,iBAAiB,KAAK;AACjC,WAAO,KAAK,KAAK,IAAgC,2BAA2B,EAAE,IAAI,EAAE,OAAO,CAAC;AAAA,EAC9F;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,MAAM,QAA4D;AACtE,UAAM,EAAE,QAAQ,GAAG,MAAM,IAAI;AAC7B,UAAM,KAAK,iBAAiB,KAAK;AACjC,WAAO,KAAK,KAAK,IAAyB,oBAAoB,EAAE,IAAI,EAAE,OAAO,CAAC;AAAA,EAChF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,KAAK,QAA2D;AACpE,UAAM,EAAE,QAAQ,GAAG,MAAM,IAAI;AAC7B,UAAM,KAAK,iBAAiB,KAAK;AACjC,WAAO,KAAK,KAAK,IAAwB,mBAAmB,EAAE,IAAI,EAAE,OAAO,CAAC;AAAA,EAC9E;AACF;;;ACtLO,IAAM,kBAAN,MAAsB;AAAA;AAAA,EAE3B,YAA6B,MAAkB;AAAlB;AAAA,EAAmB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWhD,MAAM,YAAY,QAAqD;AACrE,UAAM,EAAE,QAAQ,GAAG,KAAK,IAAI;AAC5B,WAAO,KAAK,KAAK;AAAA,MACf;AAAA,MACA;AAAA,QACE,aAAa,KAAK;AAAA,QAClB,WAAW,KAAK;AAAA,QAChB,cAAc,KAAK;AAAA,QACnB,SAAS,KAAK;AAAA,QACd,SAAS,KAAK;AAAA,QACd,YAAY,KAAK;AAAA,QACjB,oBAAoB,KAAK;AAAA,QACzB,kBAAkB,KAAK;AAAA,QACvB,iBAAiB,KAAK;AAAA,QACtB,YAAY,KAAK;AAAA,MACnB;AAAA,MACA,EAAE,OAAO;AAAA,IACX;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,SAAS,SAAiB,SAAoD;AAClF,WAAO,KAAK,KAAK;AAAA,MACf,WAAW,mBAAmB,OAAO,CAAC;AAAA,MACtC;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,YAAY,QAAsD;AACtE,QAAI,CAAC,QAAQ;AACX,aAAO,KAAK,KAAK,aAA8B,SAAS;AAAA,IAC1D;AACA,UAAM,EAAE,QAAQ,GAAG,MAAM,IAAI;AAC7B,UAAM,KAAK,iBAAiB,KAAK;AACjC,WAAO,KAAK,KAAK,aAA8B,UAAU,EAAE,IAAI,EAAE,OAAO,CAAC;AAAA,EAC3E;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,MAAM,kBAAkB,QAAuD;AAC7E,UAAM,EAAE,QAAQ,GAAG,KAAK,IAAI;AAC5B,WAAO,KAAK,KAAK;AAAA,MACf;AAAA,MACA;AAAA,QACE,MAAM,KAAK;AAAA,QACX,MAAM,KAAK;AAAA,QACX,KAAK,KAAK;AAAA,QACV,QAAQ,KAAK;AAAA,QACb,SAAS,KAAK;AAAA,QACd,QAAQ,KAAK;AAAA,MACf;AAAA,MACA,EAAE,OAAO;AAAA,IACX;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,iBAAiB,SAAkD;AACvE,WAAO,KAAK,KAAK,aAA4B,iBAAiB,OAAO;AAAA,EACvE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,eAAe,IAAY,SAAgD;AAC/E,WAAO,KAAK,KAAK;AAAA,MACf,iBAAiB,mBAAmB,EAAE,CAAC;AAAA,MACvC;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,kBACJ,IACA,QACsB;AACtB,UAAM,EAAE,QAAQ,GAAG,KAAK,IAAI;AAC5B,WAAO,KAAK,KAAK;AAAA,MACf,iBAAiB,mBAAmB,EAAE,CAAC;AAAA,MACvC;AAAA,QACE,MAAM,KAAK;AAAA,QACX,KAAK,KAAK;AAAA,QACV,QAAQ,KAAK;AAAA,QACb,QAAQ,KAAK;AAAA,MACf;AAAA,MACA,EAAE,OAAO;AAAA,IACX;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,kBAAkB,IAAY,SAAyC;AAC3E,WAAO,KAAK,KAAK;AAAA,MACf,iBAAiB,mBAAmB,EAAE,CAAC;AAAA,MACvC;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,gBAAgB,IAAY,SAA+C;AAC/E,WAAO,KAAK,KAAK;AAAA,MACf,iBAAiB,mBAAmB,EAAE,CAAC;AAAA,MACvC,CAAC;AAAA,MACD;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,MAAM,mBAAmB,QAAyD;AAChF,UAAM,EAAE,QAAQ,GAAG,KAAK,IAAI;AAC5B,WAAO,KAAK,KAAK;AAAA,MACf;AAAA,MACA;AAAA,QACE,gBAAgB,KAAK;AAAA,QACrB,iBAAiB,KAAK;AAAA,QACtB,KAAK,KAAK;AAAA,QACV,gBAAgB,KAAK;AAAA,QACrB,SAAS,KAAK;AAAA,MAChB;AAAA,MACA,EAAE,OAAO;AAAA,IACX;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,kBAAkB,SAAmD;AACzE,WAAO,KAAK,KAAK,aAA6B,kBAAkB,OAAO;AAAA,EACzE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,gBAAgB,IAAY,SAAiD;AACjF,WAAO,KAAK,KAAK;AAAA,MACf,kBAAkB,mBAAmB,EAAE,CAAC;AAAA,MACxC;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,mBACJ,IACA,QACuB;AACvB,UAAM,EAAE,QAAQ,GAAG,KAAK,IAAI;AAC5B,WAAO,KAAK,KAAK;AAAA,MACf,kBAAkB,mBAAmB,EAAE,CAAC;AAAA,MACxC;AAAA,QACE,iBAAiB,KAAK;AAAA,QACtB,KAAK,KAAK;AAAA,QACV,gBAAgB,KAAK;AAAA,QACrB,gBAAgB,KAAK;AAAA,QACrB,WAAW,KAAK;AAAA,MAClB;AAAA,MACA,EAAE,OAAO;AAAA,IACX;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,mBAAmB,IAAY,SAAyC;AAC5E,WAAO,KAAK,KAAK;AAAA,MACf,kBAAkB,mBAAmB,EAAE,CAAC;AAAA,MACxC;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,MAAM,eAAe,SAAoD;AACvE,WAAO,KAAK,KAAK,aAA8B,uBAAuB,OAAO;AAAA,EAC/E;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,eACJ,QACsB;AACtB,QAAI,CAAC,QAAQ;AACX,aAAO,KAAK,KAAK,aAA0B,sBAAsB;AAAA,IACnE;AACA,UAAM,EAAE,QAAQ,GAAG,MAAM,IAAI;AAC7B,UAAM,KAAK,iBAAiB,KAAK;AACjC,WAAO,KAAK,KAAK,aAA0B,uBAAuB,EAAE,IAAI,EAAE,OAAO,CAAC;AAAA,EACpF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,SAAS,SAA8C;AAC3D,WAAO,KAAK,KAAK,aAAwB,iBAAiB,OAAO;AAAA,EACnE;AACF;;;ACnSO,IAAM,kBAAN,MAAsB;AAAA,EAC3B,YAA6B,MAAkB;AAAlB;AAAA,EAAmB;AAAA,EAEhD,MAAM,SAAS,QAAmD;AAChE,UAAM,EAAE,QAAQ,GAAG,MAAM,IAAI;AAC7B,UAAM,KAAK,iBAAiB,KAAK;AACjC,WAAO,KAAK,KAAK,IAAsB,yBAAyB,EAAE,IAAI,EAAE,OAAO,CAAC;AAAA,EAClF;AAAA,EAEA,MAAM,IAAI,QAAyC;AACjD,UAAM,EAAE,QAAQ,GAAG,MAAM,IAAI;AAC7B,UAAM,KAAK,iBAAiB,KAAK;AACjC,WAAO,KAAK,KAAK,IAAiB,oBAAoB,EAAE,IAAI,EAAE,OAAO,CAAC;AAAA,EACxE;AACF;;;ACXA,IAAM,sBAAsB;AAC5B,IAAM,2BAA2B;AACjC,IAAM,kBAAkB;AAQxB,SAAS,gBAAgB,SAIvB;AACA,MAAI,QAAQ,SAAS;AAEnB,UAAMA,QAAO,QAAQ,QAAQ,QAAQ,QAAQ,EAAE;AAC/C,WAAO,EAAE,eAAeA,OAAM,iBAAiBA,OAAM,kBAAkBA,MAAK;AAAA,EAC9E;AAEA,QAAM,MAAM,QAAQ,eAAe;AACnC,QAAM,OAAO,eAAe,GAAG;AAC/B,SAAO;AAAA,IACL,eAAe;AAAA,IACf,iBAAiB;AAAA,IACjB,kBAAkB,GAAG,IAAI;AAAA,EAC3B;AACF;AAoBO,IAAM,gBAAN,MAAoB;AAAA;AAAA,EAEhB;AAAA;AAAA,EAGA;AAAA;AAAA,EAGA;AAAA;AAAA,EAGA;AAAA;AAAA,EAGA;AAAA,EAET,YAAY,SAA4B;AACtC,QAAI,CAAC,QAAQ,QAAQ;AACnB,YAAM,IAAI;AAAA,QACR;AAAA,MACF;AAAA,IACF;AAEA,UAAM,EAAE,eAAe,iBAAiB,iBAAiB,IAAI,gBAAgB,OAAO;AAEpF,UAAM,SAAyB;AAAA,MAC7B,QAAQ,QAAQ;AAAA,MAChB;AAAA,MACA;AAAA,MACA;AAAA,MACA,YAAY,QAAQ,cAAc;AAAA,MAClC,gBAAgB,QAAQ,kBAAkB;AAAA,MAC1C,SAAS,QAAQ,WAAW;AAAA,IAC9B;AAEA,UAAM,OAAO,IAAI,WAAW,MAAM;AAElC,SAAK,UAAU,IAAI,cAAc,IAAI;AACrC,SAAK,WAAW,IAAI,eAAe,IAAI;AACvC,SAAK,UAAU,IAAI,cAAc,IAAI;AACrC,SAAK,YAAY,IAAI,gBAAgB,IAAI;AACzC,SAAK,YAAY,IAAI,gBAAgB,IAAI;AAAA,EAC3C;AACF;","names":["base"]}