@welldot/core 0.4.0-next.20261015.d7c7365 → 0.5.0

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.
Files changed (36) hide show
  1. package/README.md +59 -19
  2. package/dist/index.cjs +344 -178
  3. package/dist/index.cjs.map +1 -1
  4. package/dist/index.d.cts +9203 -5704
  5. package/dist/index.d.ts +9203 -5704
  6. package/dist/index.js +334 -178
  7. package/dist/index.js.map +1 -1
  8. package/docs/reference/fgdc-textures.md +15 -0
  9. package/docs/schema/v2/well.schema.json +128 -11
  10. package/docs/spec/v1/well-format.md +26 -0
  11. package/docs/spec/v2/format-reference.md +170 -45
  12. package/docs/spec/v2/interoperability.md +25 -4
  13. package/docs/spec/v2/object-schemas.md +243 -96
  14. package/docs/spec/v2/overview.md +92 -9
  15. package/docs/spec/v2/water-quality.md +26 -3
  16. package/examples/README.md +12 -0
  17. package/examples/belem-pa-condominio-outorga.well +2 -1
  18. package/examples/belem-pa-monitoramento-posto.well +2 -1
  19. package/examples/belem-pa-pirabas-abastecimento.well +2 -2
  20. package/examples/belem-pa-poco-colmatado.well +2 -1
  21. package/examples/belem-pa-poco-raso-abandonado.well +2 -1
  22. package/examples/belem-pa-qualidade-agua-acida.well +2 -1
  23. package/examples/colatina-es-gnaisse-rural.well +2 -2
  24. package/examples/coluna-mg-cristalino-abastecimento.well +2 -2
  25. package/examples/estrela-doeste-sp-bauru-serra-geral.well +2 -1
  26. package/examples/extremoz-rn-barreiras-raso.well +2 -1
  27. package/examples/gastao-vidigal-sp-dados-inconsistentes.well +2 -1
  28. package/examples/irece-ba-carste-bambui.well +2 -1
  29. package/examples/lagoa-santa-mg-carste-abastecimento.well +2 -2
  30. package/examples/minas-novas-mg-cadastro-incompleto.well +2 -1
  31. package/examples/quixeramobim-ce-cristalino-salobro.well +2 -2
  32. package/examples/rinopolis-sp-estratigrafico-guarani.well +2 -1
  33. package/examples/santarem-pa-jorrante-alter-do-chao.well +2 -1
  34. package/examples/sao-gabriel-rs-cacimba.well +2 -1
  35. package/examples/sete-lagoas-mg-carste-industrial.well +2 -1
  36. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/validators/well.validators.ts","../src/utils/well.utils.ts","../src/utils/fgdc.textures.ts","../src/vocab/waterQuality.limits.ts","../src/utils/language.utils.ts","../src/vocab/waterQuality.vocab.ts","../src/vocab/attachment.vocab.ts","../src/vocab/construction.vocab.ts","../src/vocab/general.vocab.ts","../src/vocab/history.vocab.ts","../src/vocab/hydrodynamic.vocab.ts","../src/vocab/operation.vocab.ts","../src/vocab/permit.vocab.ts","../src/vocab/vocab.ts","../src/vocab/closed.vocab.ts","../src/vocab/waterSample.vocab.ts","../src/utils/units.ts"],"sourcesContent":["// Types\nexport type {\n AirliftEvent,\n AquiferAnalysis,\n Attachment,\n BoreHole,\n Cave,\n CementPad,\n Centralizer,\n ConditionFulfillment,\n ConstantRateEvent,\n Constructive,\n EstimatedVolume,\n Filtration,\n Fracture,\n Geologic,\n HistoryLogEntry,\n HoleFill,\n HydrodynamicEvent,\n HydrodynamicEventBase,\n Laboratory,\n LevelReading,\n Lithology,\n Location,\n LocationProperties,\n Meter,\n MeterReading,\n MonthlyGrant,\n OperatingRegime,\n Parameter,\n Permit,\n PermitAdministrativeStatus,\n PermitCondition,\n PermitHistoryEntry,\n ProductionEntry,\n ProductionEntryBase,\n PumpElectrical,\n PumpInstallation,\n PumpingStep,\n Purge,\n PurgeReading,\n RecoveryOnlyEvent,\n RecoveryPhase,\n Reduction,\n ResultQualifier,\n ResultValidation,\n SamplingPoint,\n SectionKey,\n SectionVisibility,\n SpotMeasurementEvent,\n StepDrawdownEvent,\n SurfaceCase,\n Texture,\n TimeResolution,\n VisibilityFieldKey,\n VisibilityKey,\n VolumeLimit,\n WaterQualityResult,\n WaterSample,\n Well,\n WellCase,\n WellId,\n WellScreen,\n WellStatus,\n WellVisibility,\n} from './types/well.types';\n\nexport type {\n DiameterUnits,\n FlowUnits,\n LengthUnits,\n PowerUnits,\n Units,\n UnitsTypes,\n VolumeUnits,\n} from './types/units.types';\n\n// Validators\nexport {\n AirliftEventSchema,\n AquiferAnalysisSchema,\n AttachmentSchema,\n BoreHoleSchema,\n CaveSchema,\n CementPadSchema,\n CentralizerSchema,\n ConditionFulfillmentSchema,\n ConstantRateEventSchema,\n EstimatedVolumeSchema,\n FiltrationSchema,\n FractureSchema,\n HistoryLogEntrySchema,\n HoleFillSchema,\n HydrodynamicEventBaseSchema,\n HydrodynamicEventSchema,\n LaboratorySchema,\n LevelReadingSchema,\n LithologySchema,\n LocationPropertiesSchema,\n LocationSchema,\n MeterReadingSchema,\n MeterSchema,\n MonthlyGrantSchema,\n OperatingRegimeSchema,\n ParameterSchema,\n PermitAdministrativeStatusSchema,\n PermitConditionSchema,\n PermitHistoryEntrySchema,\n PermitSchema,\n ProductionEntryBaseSchema,\n ProductionEntrySchema,\n PumpElectricalSchema,\n PumpInstallationSchema,\n PumpingStepSchema,\n PurgeReadingSchema,\n PurgeSchema,\n RecoveryOnlyEventSchema,\n RecoveryPhaseSchema,\n ReductionSchema,\n ResultQualifierSchema,\n ResultValidationSchema,\n SamplingPointSchema,\n SpotMeasurementEventSchema,\n StepDrawdownEventSchema,\n SurfaceCaseSchema,\n TextureSchema,\n TimeResolutionSchema,\n VolumeLimitSchema,\n WaterQualityResultSchema,\n WaterSampleSchema,\n WellCaseSchema,\n WellIdSchema,\n WellSchema,\n WellScreenSchema,\n WellStatusSchema,\n parseWell,\n} from './validators/well.validators';\n\n// Format utilities (serialise/deserialise .well format only)\nexport {\n SECTION_KEYS,\n VISIBILITY_LEAF_KEYS,\n VISIBILITY_TREE,\n calculatedWellDepth,\n checkIfProfileIsEmpty,\n convertProfileFromJSON,\n deserializeWell,\n hasWellData,\n isWellEmpty,\n profileToWell,\n redactWell,\n serializeWell,\n} from './utils/well.utils';\n\nexport type { TextureCode, TextureOption } from './types/textures';\nexport { FGDC_TEXTURES_OPTIONS } from './utils/fgdc.textures';\n\n// Water quality vocabulary and limit sets (since v2.3)\nexport {\n BR_GM_MS_888_2021,\n EU_2020_2184,\n NEPHELOMETRIC_TURBIDITY_CODES,\n WATER_QUALITY_LIMIT_SETS,\n WHO_GDWQ_2022,\n getLimitSet,\n} from './vocab/waterQuality.limits';\nexport type { Limit, LimitBasis, LimitSet } from './vocab/waterQuality.limits';\nexport {\n WATER_QUALITY_PARAMETERS,\n WATER_QUALITY_UNITS,\n WATER_QUALITY_VOCABULARY_VERSION,\n getParameterDefinition,\n getParameterLabel,\n isKnownParameter,\n parameterKey,\n} from './vocab/waterQuality.vocab';\nexport type {\n ParameterDefinition,\n ParameterForm,\n ParameterGroup,\n ParameterUnit,\n} from './vocab/waterQuality.vocab';\n\n// Localized text (BCP 47-keyed labels)\nexport type { LanguageText, LanguageTextInput } from './types/language.types';\nexport { resolveLanguageText } from './utils/language.utils';\n\n// Recommended vocabularies of open (free-text) fields, with en/pt labels\nexport {\n DOCUMENT_TYPES,\n DOCUMENT_TYPE_SUGGESTIONS,\n} from './vocab/attachment.vocab';\nexport type {\n AttachmentDocumentType,\n DocumentTypeContext,\n} from './vocab/attachment.vocab';\nexport {\n CEMENT_PAD_TYPES,\n CENTRALIZER_TYPES,\n CONSTRUCTION_MATERIALS,\n DRILLING_METHODS,\n SCREEN_SLOT_TYPES,\n} from './vocab/construction.vocab';\nexport type {\n CementPadType,\n CentralizerType,\n ConstructionMaterial,\n DrillingMethod,\n ScreenSlotType,\n} from './vocab/construction.vocab';\nexport { WELL_PURPOSES, WELL_TYPES } from './vocab/general.vocab';\nexport type { WellPurpose, WellType } from './vocab/general.vocab';\nexport {\n HISTORY_LOG_CATEGORIES,\n HISTORY_LOG_SEVERITIES,\n} from './vocab/history.vocab';\nexport type {\n HistoryLogCategory,\n HistoryLogSeverity,\n} from './vocab/history.vocab';\nexport {\n AQUIFER_ANALYSIS_METHODS,\n HYDRODYNAMIC_EVENT_TYPES,\n MEASUREMENT_METHODS,\n} from './vocab/hydrodynamic.vocab';\nexport type {\n AquiferAnalysisMethod,\n MeasurementMethod,\n} from './vocab/hydrodynamic.vocab';\nexport {\n ESTIMATION_METHODS,\n MAINTENANCE_TYPES,\n METER_TYPES,\n POWER_SOURCES,\n PUMP_TYPES,\n READING_SOURCES,\n} from './vocab/operation.vocab';\nexport type {\n EstimationMethod,\n MaintenanceType,\n MeterType,\n PowerSource,\n PumpType,\n ReadingSource,\n} from './vocab/operation.vocab';\nexport {\n CONDITION_CATEGORIES,\n PERMIT_HISTORY_TYPES,\n PERMIT_TYPES,\n WATER_USES,\n} from './vocab/permit.vocab';\nexport type {\n ConditionCategory,\n PermitHistoryType,\n PermitType,\n WaterUse,\n} from './vocab/permit.vocab';\nexport {\n formatVocabList,\n getVocabEntry,\n getVocabLabel,\n isVocabValue,\n vocabValues,\n} from './vocab/vocab';\nexport type { OpenVocab, VocabEntry } from './vocab/vocab';\n\n// Closed vocabularies: schema-fixed values with en/pt labels (since v2.3)\nexport {\n BLANK_SAMPLE_TYPES,\n FILTRATION_LOCATION_VALUES,\n FRACTION_VALUES,\n MEASURED_IN_VALUES,\n MEASUREMENT_LOCATIONS,\n NUMERIC_QUALIFIERS,\n PARAMETER_GROUPS,\n PARAMETER_GROUP_VALUES,\n PARENT_SAMPLE_TYPES,\n PERMIT_ADMINISTRATIVE_STATUSES,\n PERMIT_ADMINISTRATIVE_STATUS_VALUES,\n PRODUCTION_ENTRY_TYPES,\n QUALIFIER_VALUES,\n RESULT_FRACTIONS,\n RESULT_QUALIFIERS,\n VALIDATION_STATUSES,\n VALIDATION_STATUS_VALUES,\n VOLUME_LIMIT_PERIODS,\n WELL_STATUSES,\n WELL_STATUS_VALUES,\n} from './vocab/closed.vocab';\nexport {\n SAMPLE_TYPES,\n SAMPLING_DEVICES,\n SAMPLING_METHODS,\n SAMPLING_POINT_TYPES,\n} from './vocab/waterSample.vocab';\nexport type {\n SampleType,\n SamplingDevice,\n SamplingMethod,\n SamplingPointType,\n} from './vocab/waterSample.vocab';\n\n// Backward-compat alias for app migration\nexport type { Well as Profile } from './types/well.types';\n\n// Units conversion utilities\nexport {\n concentrationFromCanonical,\n concentrationToCanonical,\n cubicFeetToCubicMeters,\n cubicMeterPerHourToLitersPerSecond,\n cubicMeterPerHourToUsGallonsPerMinute,\n cubicMetersToCubicFeet,\n cubicMetersToLiters,\n cubicMetersToUsGallons,\n cvToKilowatts,\n decimalDegreesToDms,\n dmsToDecimalDegrees,\n expandedToStandardUncertainty,\n feetToMeters,\n flowFromCanonical,\n flowToCanonical,\n hoursToMinutes,\n hpToKilowatts,\n inchesToMm,\n kilopascalToPsi,\n kilowattsToCv,\n kilowattsToHp,\n litersPerSecondToCubicMeterPerHour,\n litersToCubicMeters,\n metersToFeet,\n milliSiemensPerCmToMicroSiemensPerCm,\n milliSiemensPerMeterToMicroSiemensPerCm,\n minutesToHours,\n mmToInches,\n mmToSlotNumber,\n normalizeColorUnit,\n powerFromCanonical,\n powerToCanonical,\n psiToKilopascal,\n slotNumberToMm,\n squareMeterPerDayToSquareMeterPerSecond,\n squareMeterPerSecondToSquareMeterPerDay,\n turbidityCodeForUnit,\n usGallonsPerMinuteToCubicMeterPerHour,\n usGallonsToCubicMeters,\n volumeFromCanonical,\n volumeToCanonical,\n} from './utils/units';\nexport type { ConcentrationUnits, DmsCoordinate } from './utils/units';\n","import { createDefu } from 'defu';\nimport { z } from 'zod';\nimport type { Well } from '../types/well.types';\n\n// ─── defu custom merger ───────────────────────────────────────────────────────\n// In createDefu callbacks: obj = defaults object, key = key, value = source value.\n// When source has an array, assign it back to obj[key] so defu uses it as-is\n// (prevents defu's default array-concatenation behavior).\nexport const mergeWell = createDefu((obj, key, value) => {\n if (Array.isArray(value)) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (obj as any)[key] = value;\n return true;\n }\n});\n\nconst isPlainObject = (v: unknown): v is Record<string, unknown> =>\n typeof v === 'object' && v !== null && !Array.isArray(v);\n\n// parseWell: Zod strips unknown members (`x-` fields) from nested objects.\n// This merger puts them back from the raw document. The schema never reorders\n// or drops array items, so items are merged by index; an array whose length\n// differs from the raw one is taken as parsed.\nconst mergeParsed = createDefu((obj, key, value) => {\n if (Array.isArray(value)) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const raw = (obj as any)[key];\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (obj as any)[key] =\n Array.isArray(raw) && raw.length === value.length\n ? value.map((item: unknown, i: number) =>\n isPlainObject(item) && isPlainObject(raw[i])\n ? mergeParsed(item, raw[i])\n : item,\n )\n : value;\n return true;\n }\n});\n\n// ─── Datetime helper ──────────────────────────────────────────────────────────\nconst RFC3339_WITH_OFFSET =\n /^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?(Z|[+-]\\d{2}:\\d{2})$/;\nconst rfc3339 = () =>\n z\n .string()\n .regex(RFC3339_WITH_OFFSET, 'datetime must be RFC 3339 with UTC offset');\n\n// Calendar date (YYYY-MM-DD): the local civil date at the well site.\nconst CALENDAR_DATE = /^\\d{4}-\\d{2}-\\d{2}$/;\nconst calendarDate = () =>\n z.string().regex(CALENDAR_DATE, 'date must be YYYY-MM-DD');\n\n// ISO 8601 duration restricted to date components (`PnYnMnWnD`); time\n// components (`T…`) are malformed.\nconst DATE_DURATION = /^P(?=\\d)(\\d+Y)?(\\d+M)?(\\d+W)?(\\d+D)?$/;\nconst dateDuration = () =>\n z.string().regex(DATE_DURATION, 'duration must be an ISO 8601 date duration');\n\n// ─── Common schemas ───────────────────────────────────────────────────────────\n\nexport const AttachmentSchema = z.object({\n id: z.string(),\n uri: z.string().url(),\n media_type: z.string(),\n document_type: z.string().optional(),\n filename: z.string().optional(),\n description: z.string().optional(),\n sha256: z.string().optional(),\n});\n\n// ─── Location schemas ─────────────────────────────────────────────────────────\n\nexport const WellIdSchema = z.object({\n authority: z.string(),\n id: z.string(),\n primary: z.boolean().optional(),\n});\n\nexport const LocationPropertiesSchema = z.object({\n elevation_datum: z.string().optional(),\n crs: z.string().optional(),\n lat_precision: z.number().optional(),\n lng_precision: z.number().optional(),\n elevation_precision: z.number().optional(),\n original_crs: z.string().optional(),\n});\n\nexport const LocationSchema = z.object({\n lat: z.number(),\n lng: z.number(),\n elevation: z.number().optional(),\n properties: LocationPropertiesSchema.optional(),\n});\n\n// ─── Constructive schemas ─────────────────────────────────────────────────────\n\nexport const BoreHoleSchema = z.object({\n from: z.number(),\n to: z.number(),\n diameter: z.number(),\n drilling_method: z.string().optional(),\n});\n\nexport const WellCaseSchema = z.object({\n from: z.number(),\n to: z.number(),\n type: z.string(),\n diameter: z.number(),\n});\n\nexport const ReductionSchema = z.object({\n from: z.number(),\n to: z.number(),\n diam_from: z.number(),\n diam_to: z.number(),\n type: z.string(),\n});\n\nexport const WellScreenSchema = z.object({\n from: z.number(),\n to: z.number(),\n type: z.string(),\n diameter: z.number(),\n screen_slot: z.number(),\n slot_type: z.string().optional(),\n});\n\nexport const HoleFillSchema = z.object({\n from: z.number(),\n to: z.number(),\n type: z.enum(['gravel_pack', 'seal']),\n diameter: z.number(),\n description: z.string(),\n});\n\nexport const SurfaceCaseSchema = z.object({\n from: z.number(),\n to: z.number(),\n diameter: z.number(),\n});\n\nexport const CentralizerSchema = z.object({\n from: z.number(),\n to: z.number(),\n spacing: z.number().positive().optional(),\n type: z.string(),\n diameter: z.number().optional(),\n description: z.string().optional(),\n});\n\nexport const CementPadSchema = z.object({\n type: z.string(),\n width: z.number(),\n thickness: z.number(),\n length: z.number(),\n});\n\n// ─── Geologic schemas ─────────────────────────────────────────────────────────\n\nexport const TextureSchema = z.object({\n code: z.union([z.string(), z.number()]),\n vocabulary: z.string().optional(),\n});\n\nexport const LithologySchema = z.object({\n from: z.number(),\n to: z.number(),\n description: z.string(),\n color: z.string(),\n texture: TextureSchema,\n geologic_unit: z.string(),\n aquifer_unit: z.string(),\n});\n\nexport const FractureSchema = z.object({\n depth: z.number(),\n water_intake: z.boolean(),\n description: z.string(),\n swarm: z.boolean(),\n azimuth: z.number(),\n dip: z.number(),\n depth_precision: z.number().optional(),\n});\n\nexport const CaveSchema = z.object({\n from: z.number(),\n to: z.number(),\n water_intake: z.boolean(),\n description: z.string(),\n});\n\n// ─── Hydrodynamic event schemas ───────────────────────────────────────────────\n\nexport const LevelReadingSchema = z.object({\n elapsed: z.number(),\n depth: z.number(),\n depth_precision: z.number().optional(),\n pressure: z.number().optional(),\n});\n\nexport const RecoveryPhaseSchema = z.object({\n readings: z.array(LevelReadingSchema),\n});\n\nexport const PumpingStepSchema = z.object({\n rate: z.number(),\n rate_precision: z.number().optional(),\n duration: z.number().optional(),\n readings: z.array(LevelReadingSchema).optional(),\n});\n\nexport const HydrodynamicEventBaseSchema = z.object({\n id: z.string(),\n type: z.string(),\n datetime: rfc3339(),\n sequence: z.number().int().optional(),\n operator: z.string().optional(),\n equipment: z.string().optional(),\n notes: z.string().optional(),\n corrects: z.string().optional(),\n attachments: z.array(AttachmentSchema).optional(),\n});\n\nexport const SpotMeasurementEventSchema = HydrodynamicEventBaseSchema.extend({\n type: z.literal('spot_measurement'),\n static_level: z.number(),\n static_level_precision: z.number().optional(),\n measurement_method: z.string().optional(),\n steps: z.array(PumpingStepSchema).max(1).optional(),\n recovery: RecoveryPhaseSchema.optional(),\n});\n\nexport const ConstantRateEventSchema = HydrodynamicEventBaseSchema.extend({\n type: z.literal('constant_rate'),\n static_level: z.number().optional(),\n static_level_precision: z.number().optional(),\n steps: z.tuple([PumpingStepSchema]).optional(),\n recovery: RecoveryPhaseSchema.optional(),\n});\n\nexport const StepDrawdownEventSchema = HydrodynamicEventBaseSchema.extend({\n type: z.literal('step_drawdown'),\n static_level: z.number().optional(),\n static_level_precision: z.number().optional(),\n steps: z.array(PumpingStepSchema),\n recovery: RecoveryPhaseSchema.optional(),\n});\n\nexport const AirliftEventSchema = HydrodynamicEventBaseSchema.extend({\n type: z.literal('airlift'),\n steps: z.array(PumpingStepSchema),\n recovery: RecoveryPhaseSchema.optional(),\n});\n\nexport const RecoveryOnlyEventSchema = HydrodynamicEventBaseSchema.extend({\n type: z.literal('recovery_only'),\n pumping_rate: z.number().optional(),\n pumping_duration: z.number().optional(),\n recovery: RecoveryPhaseSchema,\n});\n\nexport const HydrodynamicEventSchema = z\n .discriminatedUnion('type', [\n SpotMeasurementEventSchema,\n ConstantRateEventSchema,\n StepDrawdownEventSchema,\n AirliftEventSchema,\n RecoveryOnlyEventSchema,\n ])\n .or(HydrodynamicEventBaseSchema.passthrough());\n\n// ─── Aquifer analysis + history log schemas ───────────────────────────────────\n\nexport const WellStatusSchema = z.enum([\n 'active',\n 'maintenance',\n 'inactive',\n 'decommissioned',\n 'abandoned',\n]);\n\nexport const HistoryLogEntrySchema = z.object({\n id: z.string(),\n datetime: rfc3339(),\n updated_at: rfc3339().optional(),\n category: z.string(),\n description: z.string(),\n author: z.string().optional(),\n severity: z.string().optional(),\n attachments: z.array(AttachmentSchema).optional(),\n hydrodynamic_event_ids: z.array(z.string()).optional(),\n sample_ids: z.array(z.string()).optional(),\n maintenance_type: z.string().optional(),\n pump_installation_id: z.string().optional(),\n meter_id: z.string().optional(),\n status: WellStatusSchema.optional(),\n});\n\nexport const AquiferAnalysisSchema = z.object({\n id: z.string(),\n datetime: rfc3339(),\n analyst: z.string().optional(),\n source_event_ids: z.array(z.string()),\n method: z.string().optional(),\n static_level: z.number().optional(),\n static_level_precision: z.number().optional(),\n static_level_source_id: z.string().optional(),\n dynamic_level: z.number().optional(),\n dynamic_level_precision: z.number().optional(),\n flow_rate: z.number().optional(),\n flow_rate_precision: z.number().optional(),\n max_flow_rate: z.number().optional(),\n max_flow_rate_precision: z.number().optional(),\n max_flow_rate_basis: z.string().optional(),\n specific_capacity: z.number().optional(),\n transmissivity: z.number().optional(),\n storativity: z.number().nullable().optional(),\n hydraulic_conductivity: z.number().optional(),\n aquifer_thickness: z.number().optional(),\n jacob_b: z.number().optional(),\n jacob_c: z.number().optional(),\n well_efficiency_pct: z.number().optional(),\n notes: z.string().optional(),\n attachments: z.array(AttachmentSchema).optional(),\n});\n\n// ─── Operational schemas ──────────────────────────────────────────────────────\n\nexport const PumpElectricalSchema = z.object({\n voltage: z.number().nonnegative().optional(),\n phases: z.union([z.literal(1), z.literal(3)]).optional(),\n cable_section: z.number().nonnegative().optional(),\n cable_length: z.number().nonnegative().optional(),\n});\n\nexport const PumpInstallationSchema = z.object({\n id: z.string(),\n installed_at: rfc3339(),\n removed_at: rfc3339().optional(),\n installed_by: z.string().optional(),\n removed_by: z.string().optional(),\n type: z.string(),\n power_source: z.string().optional(),\n manufacturer: z.string().optional(),\n model: z.string().optional(),\n serial: z.string().optional(),\n intake_depth: z.number().nonnegative().optional(),\n rated_flow_rate: z.number().nonnegative().optional(),\n rated_head: z.number().nonnegative().optional(),\n rated_power: z.number().nonnegative().optional(),\n stages: z.number().int().positive().optional(),\n riser_diameter: z.number().nonnegative().optional(),\n riser_material: z.string().optional(),\n check_valve: z.boolean().optional(),\n electrical: PumpElectricalSchema.optional(),\n notes: z.string().optional(),\n updated_at: rfc3339().optional(),\n attachments: z.array(AttachmentSchema).optional(),\n});\n\nexport const VolumeLimitSchema = z.object({\n period: z.enum(['daily', 'monthly', 'annual']),\n volume: z.number().nonnegative(),\n});\n\nexport const MonthlyGrantSchema = z.object({\n month: z.number().int().min(1).max(12),\n flow_rate: z.number().nonnegative().optional(),\n daily_operating_time: z.number().nonnegative().optional(),\n days: z.number().int().min(0).max(31).optional(),\n});\n\nexport const ConditionFulfillmentSchema = z.object({\n id: z.string(),\n datetime: rfc3339(),\n due_date: calendarDate().optional(),\n description: z.string().optional(),\n author: z.string().optional(),\n event_id: z.string().optional(),\n sample_id: z.string().optional(),\n updated_at: rfc3339().optional(),\n attachments: z.array(AttachmentSchema).optional(),\n});\n\nexport const PermitConditionSchema = z.object({\n id: z.string(),\n description: z.string(),\n category: z.string().optional(),\n first_due: calendarDate().optional(),\n due_after: dateDuration().optional(),\n recurrence: dateDuration().optional(),\n last_due: calendarDate().optional(),\n occurrences: z.number().int().positive().optional(),\n responsible: z.string().optional(),\n fulfillments: z.array(ConditionFulfillmentSchema).optional(),\n});\n\nexport const PermitAdministrativeStatusSchema = z.enum([\n 'requested',\n 'granted',\n 'suspended',\n 'revoked',\n 'denied',\n 'withdrawn',\n]);\n\nexport const PermitHistoryEntrySchema = z.object({\n id: z.string(),\n date: calendarDate(),\n type: z.string().optional(),\n description: z.string(),\n done: z.boolean().optional(),\n due_date: calendarDate().optional(),\n updated_at: rfc3339().optional(),\n attachments: z.array(AttachmentSchema).optional(),\n});\n\nexport const PermitSchema = z.object({\n id: z.string(),\n type: z.string(),\n authority: z.string(),\n identifier: z.string().optional(),\n request_identifier: z.string().optional(),\n status: PermitAdministrativeStatusSchema.optional(),\n issued_at: calendarDate().optional(),\n valid_from: calendarDate().optional(),\n valid_until: calendarDate().optional(),\n renewal_requested_at: calendarDate().optional(),\n water_use: z.array(z.string()).optional(),\n flow_rate: z.number().nonnegative().optional(),\n daily_operating_time: z.number().nonnegative().optional(),\n volume_limits: z.array(VolumeLimitSchema).optional(),\n monthly_schedule: z.array(MonthlyGrantSchema).optional(),\n conditions: z.array(PermitConditionSchema).optional(),\n history: z.array(PermitHistoryEntrySchema).optional(),\n supersedes: z.string().optional(),\n notes: z.string().optional(),\n updated_at: rfc3339().optional(),\n attachments: z.array(AttachmentSchema).optional(),\n});\n\nexport const MeterSchema = z.object({\n id: z.string(),\n installed_at: rfc3339(),\n removed_at: rfc3339().optional(),\n installed_by: z.string().optional(),\n removed_by: z.string().optional(),\n type: z.string().optional(),\n manufacturer: z.string().optional(),\n model: z.string().optional(),\n serial: z.string().optional(),\n nominal_diameter: z.number().nonnegative().optional(),\n max_reading: z.number().positive().optional(),\n notes: z.string().optional(),\n updated_at: rfc3339().optional(),\n attachments: z.array(AttachmentSchema).optional(),\n});\n\nexport const ProductionEntryBaseSchema = z.object({\n id: z.string(),\n type: z.string(),\n corrects: z.string().optional(),\n sequence: z.number().int().optional(),\n notes: z.string().optional(),\n});\n\nexport const MeterReadingSchema = ProductionEntryBaseSchema.extend({\n type: z.literal('meter_reading'),\n datetime: rfc3339(),\n meter_id: z.string(),\n reading: z.number().nonnegative(),\n source: z.string().optional(),\n});\n\nexport const EstimatedVolumeSchema = ProductionEntryBaseSchema.extend({\n type: z.literal('estimated_volume'),\n period_start: rfc3339(),\n period_end: rfc3339(),\n volume: z.number().nonnegative(),\n method: z.string().optional(),\n});\n\nconst PRODUCTION_TYPES = ['meter_reading', 'estimated_volume'];\n\n// Unknown (`x-`) entry types fall back to the base schema with passthrough;\n// known types must satisfy their own schema.\nexport const ProductionEntrySchema = z\n .discriminatedUnion('type', [MeterReadingSchema, EstimatedVolumeSchema])\n .or(\n ProductionEntryBaseSchema.passthrough().refine(\n e => !PRODUCTION_TYPES.includes(e.type),\n { message: 'malformed production entry' },\n ),\n );\n\nexport const OperatingRegimeSchema = z.object({\n id: z.string(),\n effective_from: rfc3339(),\n flow_rate: z.number().nonnegative().optional(),\n daily_operating_time: z.number().min(0).max(24).optional(),\n days_per_week: z.number().int().min(1).max(7).optional(),\n notes: z.string().optional(),\n updated_at: rfc3339().optional(),\n});\n\n// ─── Water quality schemas (since v2.3) ───────────────────────────────────────\n\n// `welldot`, `cas` or a custom `x-…` vocabulary.\nconst PARAMETER_VOCABULARY = /^(welldot|cas|x-.+)$/;\n\nexport const ParameterSchema = z.object({\n code: z.string().min(1),\n vocabulary: z\n .string()\n .regex(PARAMETER_VOCABULARY, 'vocabulary must be welldot, cas or x-…'),\n});\n\nexport const TimeResolutionSchema = z.literal('day');\n\nexport const SamplingPointSchema = z\n .object({\n type: z.string(),\n depth: z.number().nonnegative().optional(),\n depth_precision: z.number().nonnegative().optional(),\n from: z.number().nonnegative().optional(),\n to: z.number().nonnegative().optional(),\n device: z.string().optional(),\n pump_installation_id: z.string().optional(),\n })\n .refine(\n p =>\n !(p.depth !== undefined && (p.from !== undefined || p.to !== undefined)),\n { message: 'depth and from/to are mutually exclusive' },\n );\n\nexport const PurgeReadingSchema = z.object({\n elapsed: z.number().nonnegative(),\n parameter: ParameterSchema,\n value: z.number(),\n});\n\nexport const PurgeSchema = z.object({\n duration: z.number().nonnegative().optional(),\n volume: z.number().nonnegative().optional(),\n flow_rate: z.number().nonnegative().optional(),\n stabilized: z.boolean().optional(),\n readings: z.array(PurgeReadingSchema).optional(),\n});\n\nexport const LaboratorySchema = z.object({\n name: z.string(),\n accreditation: z.string().optional(),\n report_number: z.string().optional(),\n batch_id: z.string().optional(),\n sample_id: z.string().optional(),\n received_at: rfc3339().optional(),\n received_at_resolution: TimeResolutionSchema.optional(),\n received_temperature: z.number().optional(),\n});\n\nexport const FiltrationSchema = z.object({\n pore_size: z.number().positive().optional(),\n location: z.enum(['field', 'lab']).optional(),\n});\n\nexport const ResultValidationSchema = z.object({\n status: z.enum(['unvalidated', 'validated', 'qualified', 'rejected']),\n qualifier: z.string().optional(),\n guideline: z.string().optional(),\n validated_by: z.string().optional(),\n validated_at: rfc3339().optional(),\n});\n\nexport const ResultQualifierSchema = z.enum([\n '<',\n '>',\n 'not_detected',\n 'estimated',\n]);\n\nexport const WaterQualityResultSchema = z\n .object({\n parameter: ParameterSchema,\n value: z.number().optional(),\n presence: z.boolean().optional(),\n text: z.string().optional(),\n qualifier: ResultQualifierSchema.optional(),\n unit: z.string().min(1).optional(),\n detection_limit: z.number().nonnegative().optional(),\n quantification_limit: z.number().nonnegative().optional(),\n value_precision: z.number().nonnegative().optional(),\n fraction: z.enum(['total', 'dissolved', 'suspended']).optional(),\n filtration: FiltrationSchema.optional(),\n measured_in: z.enum(['field', 'lab']).optional(),\n method: z.string().optional(),\n analyzed_at: rfc3339().optional(),\n analyzed_at_resolution: TimeResolutionSchema.optional(),\n lab_flags: z.array(z.string()).optional(),\n validation: ResultValidationSchema.optional(),\n notes: z.string().optional(),\n })\n .superRefine((r, ctx) => {\n const forms = [r.value, r.presence, r.text].filter(\n v => v !== undefined,\n ).length;\n if (r.qualifier === 'not_detected') {\n if (forms !== 0)\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: 'not_detected results carry no value form',\n });\n } else if (forms !== 1) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: 'result must have exactly one of value, presence or text',\n });\n } else if (r.qualifier !== undefined && r.value === undefined) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: `qualifier ${r.qualifier} requires a numeric value`,\n });\n }\n const custom = r.parameter.vocabulary.startsWith('x-');\n if (custom && r.unit === undefined)\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n path: ['unit'],\n message: 'unit is required for x- vocabularies',\n });\n if (!custom && r.unit !== undefined)\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n path: ['unit'],\n message: 'unit is forbidden for welldot and cas parameters',\n });\n });\n\nexport const WaterSampleSchema = z.object({\n id: z.string(),\n datetime: rfc3339(),\n sample_type: z.string(),\n parent_sample_id: z.string().optional(),\n sequence: z.number().int().optional(),\n campaign: z.string().optional(),\n sampling_method: z.string().optional(),\n sampling_point: SamplingPointSchema.optional(),\n purge: PurgeSchema.optional(),\n static_level_event_id: z.string().optional(),\n collected_by: z.string().optional(),\n preservation: z.string().optional(),\n chain_of_custody: z.string().optional(),\n laboratory: LaboratorySchema.optional(),\n corrects: z.string().optional(),\n notes: z.string().optional(),\n attachments: z.array(AttachmentSchema).optional(),\n results: z.array(WaterQualityResultSchema).min(1),\n});\n\n// ─── Well schema ──────────────────────────────────────────────────────────────\n\nexport const WellSchema = z\n .object({\n version: z.number().int(),\n '@context': z\n .union([z.string(), z.array(z.unknown()), z.record(z.unknown())])\n .optional(),\n well_id: z.array(WellIdSchema).optional(),\n location: LocationSchema.optional(),\n profiles: z\n .array(\n z\n .string()\n .url()\n .refine(u => u.startsWith('https://'), {\n message: 'profiles must be HTTPS URLs',\n }),\n )\n .optional(),\n well_type: z.string().optional(),\n well_purpose: z.array(z.string()).optional(),\n name: z.string().optional(),\n well_driller: z.string().optional(),\n construction_date: z\n .string()\n .regex(CALENDAR_DATE, 'construction_date must be YYYY-MM-DD')\n .optional(),\n obs: z.string().optional(),\n lat: z.number().optional(),\n lng: z.number().optional(),\n elevation: z.number().optional(),\n well_depth: z.number().optional(),\n bore_hole: z.array(BoreHoleSchema),\n well_case: z.array(WellCaseSchema),\n reduction: z.array(ReductionSchema),\n well_screen: z.array(WellScreenSchema),\n surface_case: z.array(SurfaceCaseSchema),\n hole_fill: z.array(HoleFillSchema),\n centralizers: z.array(CentralizerSchema).optional(),\n cement_pad: CementPadSchema.optional(),\n lithology: z.array(LithologySchema),\n fractures: z.array(FractureSchema),\n caves: z.array(CaveSchema),\n hydrodynamic_events: z.array(HydrodynamicEventSchema).optional(),\n aquifer_analysis: z.array(AquiferAnalysisSchema).optional(),\n history_logs: z.array(HistoryLogEntrySchema).optional(),\n attachments: z.array(AttachmentSchema).optional(),\n pump_installations: z.array(PumpInstallationSchema).optional(),\n permits: z.array(PermitSchema).optional(),\n meters: z.array(MeterSchema).optional(),\n production: z.array(ProductionEntrySchema).optional(),\n operating_regime: z.array(OperatingRegimeSchema).optional(),\n water_samples: z.array(WaterSampleSchema).optional(),\n })\n .passthrough();\n\n// ─── parseWell ────────────────────────────────────────────────────────────────\n\nfunction normalizeV1Fields(\n raw: Record<string, unknown>,\n): Record<string, unknown> {\n const out = { ...raw };\n\n // v1 is treated as v2-equivalent after normalization\n out.version = 2;\n\n // bole_hole → bore_hole (v1 typo compatibility)\n if ('bole_hole' in out && !('bore_hole' in out)) {\n out.bore_hole = out.bole_hole;\n delete out.bole_hole;\n }\n\n // lat/lng/elevation → location object\n if (!('location' in out)) {\n const lat = out.lat as number | undefined;\n const lng = out.lng as number | undefined;\n const elevation = out.elevation as number | undefined;\n if (lat !== undefined && lng !== undefined) {\n out.location = {\n lat,\n lng,\n ...(elevation !== undefined && { elevation }),\n };\n }\n }\n\n // diam_pol (inches) → diameter (mm) on constructive arrays\n for (const key of [\n 'bore_hole',\n 'well_case',\n 'well_screen',\n 'surface_case',\n 'hole_fill',\n ]) {\n const items = out[key];\n if (Array.isArray(items)) {\n const hasDiamPol = (items as Record<string, unknown>[]).some(\n item => 'diam_pol' in item,\n );\n if (hasDiamPol) {\n out[key] = (items as Record<string, unknown>[]).map(item => {\n const { diam_pol, ...rest } = item;\n return { ...rest, diameter: ((diam_pol as number) || 0) * 25.4 };\n });\n }\n }\n }\n\n // fgdc_texture → texture on each lithology entry\n if (Array.isArray(out.lithology)) {\n out.lithology = (out.lithology as Record<string, unknown>[]).map(item => {\n if ('fgdc_texture' in item && !('texture' in item)) {\n const { fgdc_texture, ...rest } = item;\n return { ...rest, texture: { code: fgdc_texture, vocabulary: 'fgdc' } };\n }\n return item;\n });\n }\n\n // screen_slot_mm → screen_slot on each well_screen entry\n if (Array.isArray(out.well_screen)) {\n out.well_screen = (out.well_screen as Record<string, unknown>[]).map(\n item => {\n if ('screen_slot_mm' in item && !('screen_slot' in item)) {\n const { screen_slot_mm, ...rest } = item;\n return { ...rest, screen_slot: screen_slot_mm };\n }\n return item;\n },\n );\n }\n\n return out;\n}\n\nexport function parseWell(json: string): Well {\n const raw = JSON.parse(json) as Record<string, unknown>;\n const version = raw.version;\n\n if (version !== undefined && typeof version === 'number') {\n if (version !== 1 && version !== 2) {\n throw new Error(`Unsupported .well format version: ${version}`);\n }\n if (version === 1) {\n const normalized = normalizeV1Fields(raw);\n return mergeParsed(\n WellSchema.parse(normalized) as Well,\n normalized,\n ) as Well;\n }\n } else if (version !== undefined) {\n throw new Error(`Unsupported .well format version: ${String(version)}`);\n } else {\n // version absent — normalize to v2\n raw.version = 2;\n }\n\n // version === 2 (explicit or normalized from absent)\n return mergeParsed(WellSchema.parse(raw) as Well, raw) as Well;\n}\n","import {\n Constructive,\n Geologic,\n Lithology,\n Location,\n SectionKey,\n SectionVisibility,\n VisibilityFieldKey,\n VisibilityKey,\n Well,\n WellVisibility,\n} from '../types/well.types';\nimport { WellSchema, mergeWell } from '../validators/well.validators';\n\n// ─── Types ───────────────────────────────────────────────────────────────────\n\ntype RawJSON = Record<string, unknown>;\n\n// ─── Constants ───────────────────────────────────────────────────────────────\n\nconst WELL_FORMAT_VERSION = 2;\nconst INCHES_TO_MM = 25.4;\n\n// Root members that a v1 or legacy file leaves on the object after it is\n// migrated. They are never written back.\nconst LEGACY_ROOT_KEYS = new Set([\n 'lat',\n 'lng',\n 'elevation',\n 'bole_hole',\n 'constructive',\n 'geologic',\n]);\n\n/** Fixed display order for the 7 redactable sections of a well. */\nexport const SECTION_KEYS: readonly SectionKey[] = [\n 'general',\n 'constructive',\n 'geology',\n 'hydrodynamic',\n 'history',\n 'operation',\n 'water_quality',\n];\n\n/**\n * Fields of each section that can be hidden one by one, in display order.\n * Sections with no entries (`history`, `water_quality`) toggle as a whole.\n */\nexport const VISIBILITY_TREE: Readonly<\n Record<SectionKey, readonly VisibilityFieldKey[]>\n> = {\n general: ['identification', 'location', 'obs', 'attachments'],\n constructive: [\n 'bore_hole',\n 'surface_case',\n 'well_case',\n 'reduction',\n 'well_screen',\n 'hole_fill',\n 'centralizers',\n 'cement_pad',\n ],\n geology: ['lithology', 'fractures', 'caves'],\n hydrodynamic: ['hydrodynamic_events', 'aquifer_analysis'],\n history: [],\n operation: [\n 'pump_installations',\n 'meters',\n 'operating_regime',\n 'production',\n 'permits',\n ],\n water_quality: [],\n};\n\n/**\n * The finest toggles of {@link VISIBILITY_TREE}, in display order: every\n * field, plus each section that has no fields.\n */\nexport const VISIBILITY_LEAF_KEYS: readonly VisibilityKey[] =\n SECTION_KEYS.flatMap<VisibilityKey>(section =>\n VISIBILITY_TREE[section].length ? VISIBILITY_TREE[section] : [section],\n );\n\nconst EMPTY_WELL: Well = {\n version: 2,\n bore_hole: [],\n well_case: [],\n reduction: [],\n well_screen: [],\n surface_case: [],\n hole_fill: [],\n cement_pad: { type: '', width: 0, thickness: 0, length: 0 },\n lithology: [],\n fractures: [],\n caves: [],\n};\n\n// ─── Internal helpers ────────────────────────────────────────────────────────\n\nfunction createEmptyWell(): Well {\n return JSON.parse(JSON.stringify(EMPTY_WELL)) as Well;\n}\n\n/**\n * Calculated well depth: the deepest recorded point across a well's\n * constructive arrays only (not\n * geologic — lithology/fractures/caves may extend past the actual\n * constructed well and would overstate it). Same \"last item's `to`\" logic\n * as `@welldot/utils`'s `getProfileLastItemsDepths`, duplicated here because\n * `packages/core` may not depend on `@welldot/utils` (dependency chain runs\n * the other way).\n */\nexport function calculatedWellDepth(well: Well): number {\n const lastTo = (items: { to: number }[]): number =>\n items.length ? items[items.length - 1]!.to : 0;\n\n return Math.max(\n 0,\n lastTo(well.bore_hole),\n lastTo(well.hole_fill),\n lastTo(well.reduction),\n lastTo(well.surface_case),\n lastTo(well.well_case),\n lastTo(well.well_screen),\n );\n}\n\n/** Fills in `well_depth` from the constructive data when the source didn't provide one. */\nfunction withCalculatedWellDepth(well: Well): Well {\n if (well.well_depth != null) return well;\n const calculated = calculatedWellDepth(well);\n return calculated > 0 ? { ...well, well_depth: calculated } : well;\n}\n\nfunction normalizeLithology(items: RawJSON[]): Lithology[] {\n return items.map(item => {\n const base = { aquifer_unit: '', ...item };\n // v1 fgdc_texture → texture object\n if ('fgdc_texture' in base && !('texture' in base)) {\n const { fgdc_texture, ...rest } = base as Record<string, unknown>;\n return {\n ...rest,\n texture: { code: fgdc_texture, vocabulary: 'fgdc' },\n } as Lithology;\n }\n return base as Lithology;\n });\n}\n\nfunction normalizeWellScreens(items: RawJSON[]): Well['well_screen'] {\n return items.map(item => {\n if ('screen_slot_mm' in item && !('screen_slot' in item)) {\n const { screen_slot_mm, ...rest } = item;\n return {\n ...rest,\n screen_slot: screen_slot_mm,\n } as Well['well_screen'][number];\n }\n return item as Well['well_screen'][number];\n });\n}\n\nfunction decodeV1Well(raw: RawJSON): Well {\n // v1→v2 normalizations for deserialize path\n const lat = raw.lat as number | undefined;\n const lng = raw.lng as number | undefined;\n const elevation = raw.elevation as number | undefined;\n const hasCoords =\n lat !== undefined || lng !== undefined || elevation !== undefined;\n\n const location: Location | undefined =\n hasCoords && lat !== undefined && lng !== undefined\n ? { lat, lng, ...(elevation !== undefined && { elevation }) }\n : undefined;\n\n const rawScreens = (raw.well_screen as RawJSON[] | undefined) ?? [];\n\n const decoded: Well = {\n ...createEmptyWell(),\n ...(raw.well_type !== undefined && { well_type: raw.well_type as string }),\n ...(raw.name !== undefined && { name: raw.name as string }),\n ...(raw.well_driller !== undefined && {\n well_driller: raw.well_driller as string,\n }),\n ...(raw.construction_date !== undefined && {\n construction_date: raw.construction_date as string,\n }),\n ...(lat !== undefined && { lat }),\n ...(lng !== undefined && { lng }),\n ...(elevation !== undefined && { elevation }),\n ...(location !== undefined && { location }),\n ...(raw.obs !== undefined && { obs: raw.obs as string }),\n bore_hole: (raw.bore_hole as Well['bore_hole']) ?? [],\n well_case: (raw.well_case as Well['well_case']) ?? [],\n reduction: (raw.reduction as Well['reduction']) ?? [],\n well_screen: normalizeWellScreens(rawScreens),\n surface_case: (raw.surface_case as Well['surface_case']) ?? [],\n hole_fill: (raw.hole_fill as Well['hole_fill']) ?? [],\n ...(raw.cement_pad\n ? { cement_pad: raw.cement_pad as Well['cement_pad'] }\n : {}),\n lithology: normalizeLithology((raw.lithology as RawJSON[]) ?? []),\n fractures: (raw.fractures as Well['fractures']) ?? [],\n caves: (raw.caves as Well['caves']) ?? [],\n };\n return mergeWell(decoded, raw) as Well;\n}\n\nfunction decodeV2Well(raw: RawJSON): Well {\n const rawScreens = (raw.well_screen as RawJSON[] | undefined) ?? [];\n\n const decoded: Well = {\n ...createEmptyWell(),\n ...(raw.version !== undefined && { version: raw.version as number }),\n ...(raw['@context'] !== undefined && {\n '@context': raw['@context'] as Well['@context'],\n }),\n ...(raw.well_id !== undefined && {\n well_id: raw.well_id as Well['well_id'],\n }),\n ...(raw.location !== undefined && {\n location: raw.location as Well['location'],\n }),\n ...(raw.profiles !== undefined && {\n profiles: raw.profiles as Well['profiles'],\n }),\n ...(raw.well_type !== undefined && { well_type: raw.well_type as string }),\n ...(raw.well_purpose !== undefined && {\n well_purpose: raw.well_purpose as Well['well_purpose'],\n }),\n ...(raw.name !== undefined && { name: raw.name as string }),\n ...(raw.well_driller !== undefined && {\n well_driller: raw.well_driller as string,\n }),\n ...(raw.construction_date !== undefined && {\n construction_date: raw.construction_date as string,\n }),\n ...(raw.obs !== undefined && { obs: raw.obs as string }),\n ...(raw.well_depth !== undefined && {\n well_depth: raw.well_depth as number,\n }),\n bore_hole: (raw.bore_hole as Well['bore_hole']) ?? [],\n well_case: (raw.well_case as Well['well_case']) ?? [],\n reduction: (raw.reduction as Well['reduction']) ?? [],\n well_screen: normalizeWellScreens(rawScreens),\n surface_case: (raw.surface_case as Well['surface_case']) ?? [],\n hole_fill: (raw.hole_fill as Well['hole_fill']) ?? [],\n ...(raw.centralizers !== undefined && {\n centralizers: raw.centralizers as Well['centralizers'],\n }),\n ...(raw.cement_pad\n ? { cement_pad: raw.cement_pad as Well['cement_pad'] }\n : {}),\n lithology: normalizeLithology((raw.lithology as RawJSON[]) ?? []),\n fractures: (raw.fractures as Well['fractures']) ?? [],\n caves: (raw.caves as Well['caves']) ?? [],\n ...(raw.hydrodynamic_events !== undefined && {\n hydrodynamic_events:\n raw.hydrodynamic_events as Well['hydrodynamic_events'],\n }),\n ...(raw.aquifer_analysis !== undefined && {\n aquifer_analysis: raw.aquifer_analysis as Well['aquifer_analysis'],\n }),\n ...(raw.history_logs !== undefined && {\n history_logs: raw.history_logs as Well['history_logs'],\n }),\n ...(raw.attachments !== undefined && {\n attachments: raw.attachments as Well['attachments'],\n }),\n ...(raw.pump_installations !== undefined && {\n pump_installations: raw.pump_installations as Well['pump_installations'],\n }),\n ...(raw.permits !== undefined && {\n permits: raw.permits as Well['permits'],\n }),\n ...(raw.meters !== undefined && {\n meters: raw.meters as Well['meters'],\n }),\n ...(raw.production !== undefined && {\n production: raw.production as Well['production'],\n }),\n ...(raw.operating_regime !== undefined && {\n operating_regime: raw.operating_regime as Well['operating_regime'],\n }),\n ...(raw.water_samples !== undefined && {\n water_samples: raw.water_samples as Well['water_samples'],\n }),\n };\n return mergeWell(decoded, raw) as Well;\n}\n\nfunction convertLegacyDiameters(\n items: (RawJSON & { diam_pol?: number })[],\n): RawJSON[] {\n if (!items?.length) return items ?? [];\n if (!items.some(item => item.diam_pol !== undefined)) return items;\n\n return items.map(({ diam_pol, ...rest }) => ({\n ...rest,\n diameter: (diam_pol || 0) * INCHES_TO_MM,\n }));\n}\n\n// \"bole_hole\" is a typo present in older saved profiles; kept for compatibility\nfunction normalizeConstructive(src: RawJSON): Partial<Constructive> {\n const boreHoleData = (src.bole_hole ?? src.bore_hole ?? []) as (RawJSON & {\n diam_pol?: number;\n })[];\n\n const rawScreens = convertLegacyDiameters(\n (src.well_screen ?? []) as (RawJSON & { diam_pol?: number })[],\n ) as RawJSON[];\n\n return {\n bore_hole: convertLegacyDiameters(boreHoleData) as Well['bore_hole'],\n hole_fill: convertLegacyDiameters(\n (src.hole_fill ?? []) as (RawJSON & { diam_pol?: number })[],\n ) as Well['hole_fill'],\n surface_case: convertLegacyDiameters(\n (src.surface_case ?? []) as (RawJSON & { diam_pol?: number })[],\n ) as Well['surface_case'],\n well_case: convertLegacyDiameters(\n (src.well_case ?? []) as (RawJSON & { diam_pol?: number })[],\n ) as Well['well_case'],\n well_screen: normalizeWellScreens(rawScreens),\n reduction: (src.reduction ?? []) as Well['reduction'],\n ...(src.cement_pad\n ? { cement_pad: src.cement_pad as Well['cement_pad'] }\n : {}),\n };\n}\n\nfunction normalizeGeologic(raw: RawJSON): Geologic {\n const lithologySource = (raw.lithology ?? raw.geologic ?? []) as RawJSON[];\n\n return {\n lithology: normalizeLithology(lithologySource),\n fractures: (raw.fractures ?? []) as Well['fractures'],\n caves: (raw.caves ?? []) as Well['caves'],\n };\n}\n\n// Root members the spec does not define: `x-` fields and blocks, and foreign\n// members written by other tools. Legacy v1 keys are left out.\nfunction unknownRootKeys(well: Well): string[] {\n return Object.keys(well).filter(\n key => !(key in WellSchema.shape) && !LEGACY_ROOT_KEYS.has(key),\n );\n}\n\n// ─── Public API ──────────────────────────────────────────────────────────────\n\n/**\n * Serializes a {@link Well} object into a versioned JSON string suitable for\n * storage or transmission.\n *\n * Root members the spec does not define (`x-` fields and blocks, foreign\n * members) are written after the spec blocks, unchanged. Nested unknown\n * members travel inside their objects. Legacy v1 keys (`lat`, `lng`,\n * `elevation`, …) are never written.\n *\n * @param well - The well profile to serialize.\n * @returns A JSON string containing the versioned well payload.\n */\nexport function serializeWell(well: Well): string {\n const payload: Record<string, unknown> = {\n version: WELL_FORMAT_VERSION,\n ...(well['@context'] !== undefined && { '@context': well['@context'] }),\n ...(well.well_id !== undefined && { well_id: well.well_id }),\n ...(well.location !== undefined && { location: well.location }),\n ...(well.profiles !== undefined && { profiles: well.profiles }),\n ...(well.well_type !== undefined && { well_type: well.well_type }),\n ...(well.well_purpose !== undefined && {\n well_purpose: well.well_purpose,\n }),\n ...(well.name !== undefined && { name: well.name }),\n ...(well.well_driller !== undefined && { well_driller: well.well_driller }),\n ...(well.construction_date !== undefined && {\n construction_date: well.construction_date,\n }),\n ...(well.obs !== undefined && { obs: well.obs }),\n ...(well.well_depth !== undefined && { well_depth: well.well_depth }),\n bore_hole: well.bore_hole,\n well_case: well.well_case,\n reduction: well.reduction,\n well_screen: well.well_screen,\n surface_case: well.surface_case,\n hole_fill: well.hole_fill,\n ...(well.centralizers !== undefined && {\n centralizers: well.centralizers,\n }),\n ...(well.cement_pad && { cement_pad: well.cement_pad }),\n lithology: well.lithology,\n fractures: well.fractures,\n caves: well.caves,\n ...(well.hydrodynamic_events !== undefined && {\n hydrodynamic_events: well.hydrodynamic_events,\n }),\n ...(well.aquifer_analysis !== undefined && {\n aquifer_analysis: well.aquifer_analysis,\n }),\n ...(well.history_logs !== undefined && { history_logs: well.history_logs }),\n ...(well.attachments !== undefined && { attachments: well.attachments }),\n ...(well.pump_installations !== undefined && {\n pump_installations: well.pump_installations,\n }),\n ...(well.permits !== undefined && { permits: well.permits }),\n ...(well.meters !== undefined && { meters: well.meters }),\n ...(well.production !== undefined && { production: well.production }),\n ...(well.operating_regime !== undefined && {\n operating_regime: well.operating_regime,\n }),\n ...(well.water_samples !== undefined && {\n water_samples: well.water_samples,\n }),\n };\n\n for (const key of unknownRootKeys(well)) {\n const value = (well as unknown as RawJSON)[key];\n if (value !== undefined) payload[key] = value;\n }\n\n return JSON.stringify(payload);\n}\n\n/**\n * Returns `true` when the well has no meaningful data — all constructive and\n * geologic arrays are empty and no legacy nested structure is present.\n *\n * @param well - The well profile to check. Accepts `null` / `undefined`\n * (both treated as empty).\n * @returns `true` if the well is considered empty, `false` otherwise.\n */\nexport function isWellEmpty(well: Well | null | undefined): boolean {\n if (!well) return true;\n\n const raw = well as RawJSON;\n if (raw.constructive || raw.geologic) return false;\n\n return (\n well.lithology?.length === 0 &&\n well.fractures?.length === 0 &&\n well.caves?.length === 0 &&\n well.bore_hole?.length === 0 &&\n well.hole_fill?.length === 0 &&\n well.well_case?.length === 0 &&\n well.well_screen?.length === 0\n );\n}\n\n/** A value that carries something: not blank, not 0, not all-blank inside\n * (an editor's placeholder `cement_pad` of zeros holds nothing). */\nfunction isFilled(value: unknown): boolean {\n if (value === undefined || value === null) return false;\n if (typeof value === 'string') return value.trim() !== '';\n if (typeof value === 'number') return value !== 0;\n if (Array.isArray(value)) return value.length > 0;\n if (typeof value === 'object') return Object.values(value).some(isFilled);\n return true;\n}\n\n/** Root members that say nothing about the well itself. */\nconst NON_DATA_ROOT_KEYS = new Set(['version', '$schema', '@context']);\n\n/**\n * Returns `true` when the well holds any data at all: a profile (see\n * {@link isWellEmpty}) or any other filled root member — identification,\n * location, events, samples, permits, `x-` members, … A registry record\n * with no construction or geology is not empty by this measure, while\n * {@link isWellEmpty} (nothing to draw) still says it is.\n *\n * @param well - The well to check. `null` / `undefined` hold no data.\n */\nexport function hasWellData(well: Well | null | undefined): boolean {\n if (!well) return false;\n if (!isWellEmpty(well)) return true;\n return Object.entries(well as RawJSON).some(\n ([key, value]) => !NON_DATA_ROOT_KEYS.has(key) && isFilled(value),\n );\n}\n\n/**\n * Returns a copy of `well` with hidden sections and fields cleared: array\n * fields become `[]` and optional fields become `undefined`, so the result\n * stays a schema-valid {@link Well}. Never mutates `well`.\n *\n * A field is hidden when its key or its section's key is `false` in\n * `visibility` (see {@link VISIBILITY_TREE}); missing keys are visible.\n * `well_depth` is dropped only when the whole `constructive` section is\n * hidden. Hiding a record type does not rewrite references to it held by\n * visible records (e.g. a production entry's `meter_id`).\n *\n * Root members the spec does not define (`x-` fields and blocks) can hold\n * anything, so they are kept only when nothing is hidden. Unknown members\n * nested in a record follow that record.\n *\n * @param well - The well profile to redact.\n * @param visibility - Section and/or field visibility. A {@link SectionVisibility} works as-is.\n * @returns A new {@link Well} with hidden parts emptied.\n *\n * @example\n * redactWell(well, { operation: false }); // whole section\n * redactWell(well, { meters: false, permits: false }); // single fields\n */\nexport function redactWell(\n well: Well,\n visibility: WellVisibility | SectionVisibility,\n): Well {\n const v = visibility as WellVisibility;\n const redacted: Well = { ...well };\n\n const sectionOf = (field: VisibilityFieldKey): SectionKey =>\n SECTION_KEYS.find(s => VISIBILITY_TREE[s].includes(field))!;\n const hidden = (key: VisibilityKey): boolean =>\n v[key] === false ||\n (!SECTION_KEYS.includes(key as SectionKey) &&\n v[sectionOf(key as VisibilityFieldKey)] === false);\n const sectionHidden = (section: SectionKey): boolean =>\n v[section] === false ||\n (VISIBILITY_TREE[section].length > 0 &&\n VISIBILITY_TREE[section].every(f => v[f] === false));\n\n // general\n if (hidden('identification')) {\n delete redacted.well_id;\n delete redacted.well_type;\n delete redacted.well_purpose;\n delete redacted.name;\n delete redacted.well_driller;\n delete redacted.construction_date;\n }\n if (hidden('location')) {\n delete redacted.location;\n delete redacted.lat;\n delete redacted.lng;\n delete redacted.elevation;\n }\n if (hidden('obs')) delete redacted.obs;\n if (hidden('attachments')) delete redacted.attachments;\n\n // constructive\n if (hidden('bore_hole')) redacted.bore_hole = [];\n if (hidden('surface_case')) redacted.surface_case = [];\n if (hidden('well_case')) redacted.well_case = [];\n if (hidden('reduction')) redacted.reduction = [];\n if (hidden('well_screen')) redacted.well_screen = [];\n if (hidden('hole_fill')) redacted.hole_fill = [];\n if (hidden('centralizers')) delete redacted.centralizers;\n if (hidden('cement_pad')) delete redacted.cement_pad;\n if (sectionHidden('constructive')) delete redacted.well_depth;\n\n // geology\n if (hidden('lithology')) redacted.lithology = [];\n if (hidden('fractures')) redacted.fractures = [];\n if (hidden('caves')) redacted.caves = [];\n\n // hydrodynamic\n if (hidden('hydrodynamic_events')) redacted.hydrodynamic_events = [];\n if (hidden('aquifer_analysis')) redacted.aquifer_analysis = [];\n\n // history\n if (hidden('history')) redacted.history_logs = [];\n\n // operation\n if (hidden('pump_installations')) delete redacted.pump_installations;\n if (hidden('meters')) delete redacted.meters;\n if (hidden('operating_regime')) delete redacted.operating_regime;\n if (hidden('production')) delete redacted.production;\n if (hidden('permits')) delete redacted.permits;\n\n // water quality\n if (hidden('water_quality')) delete redacted.water_samples;\n\n // unknown root members\n if (Object.values(v).some(shown => shown === false)) {\n for (const key of unknownRootKeys(redacted))\n delete (redacted as unknown as RawJSON)[key];\n }\n\n return redacted;\n}\n\n/**\n * Parses a JSON string produced by {@link serializeWell} (or older legacy\n * formats) and returns a normalized {@link Well} object.\n *\n * Handles:\n * - Versioned format v1 and v2\n * - Legacy format with `constructive` / `geologic` sub-objects\n * - Legacy `diam_pol` inch diameters → `diameter` mm conversion\n * - Typo `bole_hole` → `bore_hole` compatibility\n * - v1→v2 normalizations: `fgdc_texture`, `screen_slot_mm`, `lat/lng/elevation → location`\n *\n * @param jsonString - Raw JSON string to parse.\n * @returns A normalized {@link Well}, or `null` if the parsed data is empty.\n * @throws {Error} If `jsonString` is not valid JSON.\n * @throws {Error} If the `version` field is present but not supported.\n */\nexport function deserializeWell(jsonString: string): Well | null {\n let raw: RawJSON;\n try {\n raw = JSON.parse(jsonString) as RawJSON;\n } catch {\n throw new Error('Invalid profile format');\n }\n\n if (typeof raw !== 'object' || raw === null || Array.isArray(raw)) {\n throw new Error('Invalid profile format');\n }\n\n if (typeof raw.version === 'number') {\n if (raw.version === 2) return withCalculatedWellDepth(decodeV2Well(raw));\n if (raw.version === 1) return withCalculatedWellDepth(decodeV1Well(raw));\n throw new Error(`Unsupported .well format version: ${raw.version}`);\n }\n\n if (isWellEmpty(raw as unknown as Well)) return null;\n\n const constructiveSource = (raw.constructive ?? raw) as RawJSON;\n\n const metadata: Partial<Well> = {\n ...(raw.well_type !== undefined && { well_type: raw.well_type as string }),\n ...(raw.name !== undefined && { name: raw.name as string }),\n ...(raw.well_driller !== undefined && {\n well_driller: raw.well_driller as string,\n }),\n ...(raw.construction_date !== undefined && {\n construction_date: raw.construction_date as string,\n }),\n ...(raw.lat !== undefined && { lat: raw.lat as number }),\n ...(raw.lng !== undefined && { lng: raw.lng as number }),\n ...(raw.elevation !== undefined && { elevation: raw.elevation as number }),\n ...(raw.obs !== undefined && { obs: raw.obs as string }),\n };\n\n return withCalculatedWellDepth({\n ...createEmptyWell(),\n ...metadata,\n ...normalizeConstructive(constructiveSource),\n ...normalizeGeologic(raw),\n });\n}\n\n// ─── Backward-compat aliases ─────────────────────────────────────────────────\n\n/** @deprecated Use {@link serializeWell} */\nexport const profileToWell = serializeWell;\n/** @deprecated Use {@link isWellEmpty} */\nexport const checkIfProfileIsEmpty = isWellEmpty;\n/** @deprecated Use {@link deserializeWell} */\nexport const convertProfileFromJSON = deserializeWell;\n","import { TextureOption } from '../types/textures';\n\nexport const FGDC_TEXTURES_OPTIONS: TextureOption[] = [\n // --- Surficial Patterns (Series 100) ---\n { code: 101, label: 'Unconsolidated material', pending: true },\n { code: 102, label: 'Alluvium', pending: true },\n { code: 103, label: 'Terrace deposit', pending: true },\n { code: 104, label: 'Floodplain deposit', pending: true },\n { code: 105, label: 'Fan or pediment deposit', pending: true },\n { code: 106, label: 'Eolian sand', pending: true },\n { code: 107, label: 'Silt or loess', pending: true },\n { code: 108, label: 'Clay deposit', pending: true },\n { code: 109, label: 'Colluvium', pending: true },\n { code: 110, label: 'Gravel deposit', pending: true },\n { code: 111, label: 'Residual deposit', pending: true },\n { code: 112, label: 'Playa deposit', pending: true },\n { code: 113, label: 'Lacustrine deposit', pending: true },\n { code: 114, label: 'Marine deposit', pending: true },\n { code: 115, label: 'Beach or bar deposit', pending: true },\n { code: 116, label: 'Organic deposit or peat', pending: true },\n { code: 117, label: 'Swamp or marsh deposit', pending: true },\n { code: 118, label: 'Soil', pending: true },\n { code: 119, label: 'Fill or artificial deposit', pending: true },\n { code: 120, label: 'Surficial pattern 120' },\n { code: 121, label: 'Surficial pattern 121', pending: true },\n { code: 122, label: 'Surficial pattern 122', pending: true },\n { code: 123, label: 'Surficial pattern 123' },\n { code: 124, label: 'Surficial pattern 124', pending: true },\n { code: 125, label: 'Surficial pattern 125', pending: true },\n { code: 126, label: 'Surficial pattern 126', pending: true },\n { code: 127, label: 'Surficial pattern 127', pending: true },\n { code: 128, label: 'Surficial pattern 128', pending: true },\n { code: 129, label: 'Surficial pattern 129', pending: true },\n { code: 130, label: 'Surficial pattern 130', pending: true },\n { code: 131, label: 'Surficial pattern 131', pending: true },\n { code: 132, label: 'Surficial pattern 132' },\n { code: 133, label: 'Surficial pattern 133', pending: true },\n { code: 134, label: 'Surficial pattern 134', pending: true },\n { code: 135, label: 'Surficial pattern 135', pending: true },\n { code: 136, label: 'Surficial pattern 136', pending: true },\n { code: 137, label: 'Surficial pattern 137', pending: true },\n // --- Sedimentary Patterns (Series 200) ---\n { code: 201, label: 'Sedimentary pattern 201', pending: true },\n { code: 202, label: 'Sedimentary pattern 202', pending: true },\n { code: 203, label: 'Sedimentary pattern 203', pending: true },\n { code: 204, label: 'Sedimentary pattern 204', pending: true },\n { code: 205, label: 'Sedimentary pattern 205', pending: true },\n { code: 206, label: 'Sedimentary pattern 206', pending: true },\n { code: 207, label: 'Sedimentary pattern 207', pending: true },\n { code: 208, label: 'Sedimentary pattern 208', pending: true },\n { code: 209, label: 'Sedimentary pattern 209', pending: true },\n { code: 210, label: 'Sedimentary pattern 210', pending: true },\n { code: 211, label: 'Sedimentary pattern 211', pending: true },\n { code: 212, label: 'Sedimentary pattern 212', pending: true },\n { code: 213, label: 'Sedimentary pattern 213', pending: true },\n { code: 214, label: 'Sedimentary pattern 214', pending: true },\n { code: 215, label: 'Sedimentary pattern 215', pending: true },\n { code: 216, label: 'Sedimentary pattern 216', pending: true },\n { code: 217, label: 'Sedimentary pattern 217', pending: true },\n { code: 218, label: 'Sedimentary pattern 218', pending: true },\n { code: 219, label: 'Sedimentary pattern 219', pending: true },\n { code: 220, label: 'Sedimentary pattern 220', pending: true },\n { code: 221, label: 'Sedimentary pattern 221', pending: true },\n { code: 222, label: 'Sedimentary pattern 222', pending: true },\n { code: 223, label: 'Sedimentary pattern 223', pending: true },\n { code: 224, label: 'Sedimentary pattern 224', pending: true },\n { code: 225, label: 'Sedimentary pattern 225', pending: true },\n { code: 226, label: 'Sedimentary pattern 226', pending: true },\n { code: 227, label: 'Sedimentary pattern 227', pending: true },\n { code: 228, label: 'Sedimentary pattern 228', pending: true },\n { code: 229, label: 'Sedimentary pattern 229', pending: true },\n { code: 230, label: 'Sedimentary pattern 230', pending: true },\n { code: 231, label: 'Sedimentary pattern 231', pending: true },\n { code: 232, label: 'Sedimentary pattern 232', pending: true },\n { code: 233, label: 'Sedimentary pattern 233', pending: true },\n // --- Igneous Patterns (Series 300) ---\n { code: 301, label: 'Igneous pattern 301', pending: true },\n { code: 302, label: 'Igneous pattern 302', pending: true },\n { code: 303, label: 'Igneous pattern 303', pending: true },\n { code: 304, label: 'Igneous pattern 304', pending: true },\n { code: 305, label: 'Igneous pattern 305', pending: true },\n { code: 306, label: 'Igneous pattern 306', pending: true },\n { code: 307, label: 'Igneous pattern 307', pending: true },\n { code: 308, label: 'Igneous pattern 308', pending: true },\n { code: 309, label: 'Igneous pattern 309', pending: true },\n { code: 310, label: 'Igneous pattern 310', pending: true },\n { code: 311, label: 'Igneous pattern 311', pending: true },\n { code: 312, label: 'Igneous pattern 312', pending: true },\n { code: 313, label: 'Igneous pattern 313', pending: true },\n { code: 314, label: 'Igneous pattern 314', pending: true },\n { code: 315, label: 'Igneous pattern 315', pending: true },\n { code: 316, label: 'Igneous pattern 316', pending: true },\n { code: 317, label: 'Igneous pattern 317', pending: true },\n { code: 318, label: 'Igneous pattern 318', pending: true },\n { code: 319, label: 'Igneous pattern 319', pending: true },\n { code: 320, label: 'Igneous pattern 320', pending: true },\n { code: 321, label: 'Igneous pattern 321', pending: true },\n { code: 322, label: 'Igneous pattern 322', pending: true },\n { code: 323, label: 'Igneous pattern 323', pending: true },\n { code: 324, label: 'Igneous pattern 324', pending: true },\n { code: 325, label: 'Igneous pattern 325', pending: true },\n { code: 326, label: 'Igneous pattern 326', pending: true },\n { code: 327, label: 'Igneous pattern 327', pending: true },\n { code: 328, label: 'Igneous pattern 328', pending: true },\n { code: 329, label: 'Igneous pattern 329', pending: true },\n { code: 330, label: 'Igneous pattern 330', pending: true },\n { code: 331, label: 'Igneous pattern 331', pending: true },\n // --- Miscellaneous and Metamorphic Patterns (Series 400) ---\n { code: 401, label: 'Miscellaneous pattern 401', pending: true },\n { code: 402, label: 'Miscellaneous pattern 402', pending: true },\n { code: 403, label: 'Miscellaneous pattern 403', pending: true },\n { code: 404, label: 'Miscellaneous pattern 404', pending: true },\n { code: 405, label: 'Miscellaneous pattern 405', pending: true },\n { code: 406, label: 'Miscellaneous pattern 406', pending: true },\n { code: 407, label: 'Miscellaneous pattern 407', pending: true },\n { code: 408, label: 'Miscellaneous pattern 408', pending: true },\n { code: 409, label: 'Miscellaneous pattern 409', pending: true },\n { code: 410, label: 'Miscellaneous pattern 410', pending: true },\n { code: 411, label: 'Miscellaneous pattern 411', pending: true },\n { code: 412, label: 'Miscellaneous pattern 412', pending: true },\n { code: 413, label: 'Miscellaneous pattern 413', pending: true },\n { code: 414, label: 'Miscellaneous pattern 414', pending: true },\n { code: 415, label: 'Miscellaneous pattern 415', pending: true },\n { code: 416, label: 'Miscellaneous pattern 416', pending: true },\n { code: 417, label: 'Miscellaneous pattern 417', pending: true },\n { code: 418, label: 'Miscellaneous pattern 418', pending: true },\n { code: 419, label: 'Miscellaneous pattern 419', pending: true },\n { code: 420, label: 'Miscellaneous pattern 420', pending: true },\n { code: 421, label: 'Miscellaneous pattern 421', pending: true },\n { code: 422, label: 'Miscellaneous pattern 422', pending: true },\n { code: 423, label: 'Miscellaneous pattern 423', pending: true },\n { code: 424, label: 'Miscellaneous pattern 424', pending: true },\n { code: 425, label: 'Miscellaneous pattern 425', pending: true },\n { code: 426, label: 'Miscellaneous pattern 426', pending: true },\n { code: 427, label: 'Miscellaneous pattern 427', pending: true },\n { code: 428, label: 'Miscellaneous pattern 428', pending: true },\n { code: 429, label: 'Miscellaneous pattern 429', pending: true },\n { code: 430, label: 'Miscellaneous pattern 430', pending: true },\n { code: 431, label: 'Miscellaneous pattern 431', pending: true },\n { code: 432, label: 'Miscellaneous pattern 432', pending: true },\n { code: 433, label: 'Miscellaneous pattern 433', pending: true },\n { code: 434, label: 'Miscellaneous pattern 434', pending: true },\n { code: 435, label: 'Miscellaneous pattern 435', pending: true },\n { code: 436, label: 'Miscellaneous pattern 436', pending: true },\n // --- Glacial Patterns (Series 500) ---\n { code: 521, label: 'Glacial pattern 521', pending: true },\n { code: 522, label: 'Glacial pattern 522', pending: true },\n { code: 523, label: 'Glacial pattern 523', pending: true },\n { code: 524, label: 'Glacial pattern 524', pending: true },\n { code: 530, label: 'Glacial pattern 530', pending: true },\n { code: 531, label: 'Glacial pattern 531', pending: true },\n { code: 532, label: 'Glacial pattern 532', pending: true },\n { code: 533, label: 'Glacial pattern 533', pending: true },\n { code: 534, label: 'Glacial pattern 534', pending: true },\n { code: 535, label: 'Glacial pattern 535', pending: true },\n { code: 536, label: 'Glacial pattern 536', pending: true },\n { code: 537, label: 'Glacial pattern 537', pending: true },\n { code: 538, label: 'Glacial pattern 538', pending: true },\n { code: 580, label: 'Glacial pattern 580', pending: true },\n { code: 581, label: 'Glacial pattern 581', pending: true },\n { code: 582, label: 'Glacial pattern 582', pending: true },\n { code: 583, label: 'Glacial pattern 583', pending: true },\n { code: 584, label: 'Glacial pattern 584', pending: true },\n { code: 585, label: 'Glacial pattern 585', pending: true },\n { code: 586, label: 'Glacial pattern 586', pending: true },\n { code: 587, label: 'Glacial pattern 587', pending: true },\n { code: 588, label: 'Glacial pattern 588', pending: true },\n { code: 589, label: 'Glacial pattern 589', pending: true },\n { code: 591, label: 'Periglacial pattern 591', pending: true },\n { code: 592, label: 'Periglacial pattern 592', pending: true },\n { code: 593, label: 'Periglacial pattern 593', pending: true },\n { code: 594, label: 'Periglacial pattern 594', pending: true },\n { code: 595, label: 'Periglacial pattern 595', pending: true },\n // --- Sedimentary Lithology Patterns (Series 600) ---\n { code: 601, label: 'Gravel or conglomerate (1st option)' },\n { code: 602, label: 'Gravel or conglomerate (2nd option)' },\n { code: 603, label: 'Crossbedded gravel or conglomerate' },\n { code: 605, label: 'Breccia (1st option)' },\n { code: 606, label: 'Breccia (2nd option)' },\n { code: 607, label: 'Massive sand or sandstone' },\n { code: 608, label: 'Bedded sand or sandstone' },\n { code: 609, label: 'Crossbedded sand or sandstone (1st option)' },\n { code: 610, label: 'Crossbedded sand or sandstone (2nd option)' },\n { code: 611, label: 'Ripple-bedded sand or sandstone' },\n { code: 612, label: 'Argillaceous or shaly sandstone' },\n { code: 613, label: 'Calcareous sandstone' },\n { code: 614, label: 'Dolomitic sandstone' },\n { code: 616, label: 'Silt, siltstone, or shaly silt' },\n { code: 617, label: 'Calcareous siltstone' },\n { code: 618, label: 'Dolomitic siltstone' },\n { code: 619, label: 'Sandy or silty shale' },\n { code: 620, label: 'Clay or clay shale' },\n { code: 621, label: 'Cherty shale' },\n { code: 622, label: 'Dolomitic shale' },\n { code: 623, label: 'Calcareous shale or marl' },\n { code: 624, label: 'Carbonaceous shale' },\n { code: 625, label: 'Oil shale' },\n { code: 626, label: 'Chalk' },\n { code: 627, label: 'Limestone' },\n { code: 628, label: 'Clastic limestone' },\n { code: 629, label: 'Fossiliferous clastic limestone' },\n { code: 630, label: 'Nodular or irregularly bedded limestone' },\n {\n code: 631,\n label: 'Limestone, irregular (burrow?) fillings of saccharoidal dolomite',\n },\n { code: 632, label: 'Crossbedded limestone' },\n { code: 633, label: 'Cherty crossbedded limestone' },\n { code: 634, label: 'Cherty and sandy crossbedded clastic limestone' },\n { code: 635, label: 'Oolitic limestone' },\n { code: 636, label: 'Sandy limestone' },\n { code: 637, label: 'Silty limestone' },\n { code: 638, label: 'Argillaceous or shaly limestone' },\n { code: 639, label: 'Cherty limestone (1st option)' },\n { code: 640, label: 'Cherty limestone (2nd option)' },\n { code: 641, label: 'Dolomitic limestone, limy dolostone, or limy dolomite' },\n { code: 642, label: 'Dolostone or dolomite' },\n { code: 643, label: 'Crossbedded dolostone or dolomite' },\n { code: 644, label: 'Oolitic dolostone or dolomite' },\n { code: 645, label: 'Sandy dolostone or dolomite' },\n { code: 646, label: 'Silty dolostone or dolomite' },\n { code: 647, label: 'Argillaceous or shaly dolostone or dolomite' },\n { code: 648, label: 'Cherty dolostone or dolomite' },\n { code: 649, label: 'Bedded chert (1st option)' },\n { code: 650, label: 'Bedded chert (2nd option)' },\n { code: 651, label: 'Fossiliferous bedded chert' },\n { code: 652, label: 'Fossiliferous rock' },\n { code: 653, label: 'Diatomaceous rock' },\n { code: 654, label: 'Subgraywacke' },\n { code: 655, label: 'Crossbedded subgraywacke' },\n { code: 656, label: 'Ripple-bedded subgraywacke' },\n { code: 657, label: 'Peat' },\n { code: 658, label: 'Coal' },\n { code: 659, label: 'Bony coal or impure coal' },\n { code: 660, label: 'Underclay' },\n { code: 661, label: 'Flint clay' },\n { code: 662, label: 'Bentonite' },\n { code: 663, label: 'Glauconite' },\n { code: 664, label: 'Limonite' },\n { code: 665, label: 'Siderite' },\n { code: 666, label: 'Phosphatic-nodular rock' },\n { code: 667, label: 'Gypsum' },\n { code: 668, label: 'Salt' },\n { code: 669, label: 'Interbedded sandstone and siltstone' },\n { code: 670, label: 'Interbedded sandstone and shale' },\n { code: 671, label: 'Interbedded ripple-bedded sandstone and shale' },\n {\n code: 672,\n label: 'Interbedded shale and silty limestone (shale dominant)',\n },\n {\n code: 673,\n label: 'Interbedded shale and limestone, shale dominant (1st option)',\n },\n {\n code: 674,\n label: 'Interbedded shale and limestone, shale dominant (2nd option)',\n },\n {\n code: 675,\n label: 'Interbedded calcareous shale and limestone (shale dominant)',\n },\n { code: 676, label: 'Interbedded silty limestone and shale' },\n { code: 677, label: 'Interbedded limestone and shale (1st option)' },\n { code: 678, label: 'Interbedded limestone and shale (2nd option)' },\n { code: 679, label: 'Interbedded limestone and shale (limestone dominant)' },\n { code: 680, label: 'Interbedded limestone and calcareous shale' },\n { code: 681, label: 'Till or diamicton (1st option)' },\n { code: 682, label: 'Till or diamicton (2nd option)' },\n { code: 683, label: 'Till or diamicton (3rd option)' },\n { code: 684, label: 'Loess (1st option)' },\n { code: 685, label: 'Loess (2nd option)' },\n { code: 686, label: 'Loess (3rd option)' },\n // --- Metamorphic Lithology Patterns (Series 700) ---\n { code: 701, label: 'Metamorphism' },\n { code: 702, label: 'Quartzite' },\n { code: 703, label: 'Slate' },\n { code: 704, label: 'Schistose or gneissoid granite' },\n { code: 705, label: 'Schist' },\n { code: 706, label: 'Contorted schist' },\n { code: 707, label: 'Schist and gneiss' },\n { code: 708, label: 'Gneiss' },\n { code: 709, label: 'Contorted gneiss' },\n { code: 710, label: 'Soapstone, talc, or serpentinite' },\n // --- Igneous and Vein-Matter Lithology Patterns (Series 700 continued) ---\n { code: 711, label: 'Tuffaceous rock' },\n { code: 712, label: 'Crystal tuff' },\n { code: 713, label: 'Devitrified tuff' },\n { code: 714, label: 'Volcanic breccia and tuff' },\n { code: 715, label: 'Volcanic breccia or agglomerate' },\n { code: 716, label: 'Zeolitic rock' },\n { code: 717, label: 'Basaltic flows' },\n { code: 718, label: 'Granite (1st option)' },\n { code: 719, label: 'Granite (2nd option)' },\n { code: 720, label: 'Banded igneous rock' },\n { code: 721, label: 'Igneous rock (1st option)' },\n { code: 722, label: 'Igneous rock (2nd option)' },\n { code: 723, label: 'Igneous rock (3rd option)' },\n { code: 724, label: 'Igneous rock (4th option)' },\n { code: 725, label: 'Igneous rock (5th option)' },\n { code: 726, label: 'Igneous rock (6th option)' },\n { code: 727, label: 'Igneous rock (7th option)' },\n { code: 728, label: 'Igneous rock (8th option)' },\n { code: 729, label: 'Porphyritic rock (1st option)' },\n { code: 730, label: 'Porphyritic rock (2nd option)' },\n { code: 731, label: 'Vitrophyre' },\n { code: 732, label: 'Quartz' },\n { code: 733, label: 'Ore' },\n];\n","/**\n * Jurisdiction limit sets for water quality results.\n *\n * Limits are never written to `.well` files (jurisdiction neutrality): a\n * consumer picks a set at display time and compares results with the\n * `getExceedances` helper of `@welldot/utils`.\n *\n * IMPORTANT: values below are transcribed from the cited sources and MUST be\n * verified against the official documents before regulatory use. Only\n * parameters of the core `welldot` vocabulary are included; values are in\n * the parameter's canonical unit (mg/L for substances).\n */\n\n/** Why a limit exists. */\nexport type LimitBasis = 'health' | 'aesthetic' | 'indicator' | 'operational';\n\n/** One limit for one parameter code. */\nexport type Limit = {\n /** `welldot` parameter code. */\n code: string;\n /** Maximum allowed value (inclusive), in the code's canonical unit. */\n max?: number;\n /** Minimum allowed value (inclusive), in the code's canonical unit. */\n min?: number;\n /** `false` for presence/absence parameters that must be absent. */\n presence_allowed?: false;\n /** Restricts the limit to one analytical fraction. */\n fraction?: 'total' | 'dissolved' | 'suspended';\n basis?: LimitBasis;\n /** Provisional values, alternative bases, transition dates, etc. */\n note?: string;\n};\n\n/** A selectable set of limits from one jurisdiction or guideline. */\nexport type LimitSet = {\n id: string;\n name: string;\n /** ISO 3166 code, `EU`, or `INT` for international guidelines. */\n jurisdiction: string;\n /** Citation of the source document. */\n source: string;\n limits: readonly Limit[];\n};\n\n/**\n * Turbidity codes that compare against nephelometric turbidity limits.\n * `turbidity_fau` (attenuation) is never compared.\n */\nexport const NEPHELOMETRIC_TURBIDITY_CODES: readonly string[] = [\n 'turbidity',\n 'turbidity_ntu',\n 'turbidity_fnu',\n];\n\n/** WHO Guidelines for Drinking-water Quality, 4th ed. + 1st/2nd addenda (2022). */\nexport const WHO_GDWQ_2022: LimitSet = {\n id: 'who_gdwq_2022',\n name: 'WHO Guidelines for Drinking-water Quality (2022)',\n jurisdiction: 'INT',\n source:\n 'WHO, Guidelines for drinking-water quality: 4th edition incorporating the first and second addenda, 2022',\n limits: [\n { code: 'antimony', max: 0.02, basis: 'health' },\n { code: 'arsenic', max: 0.01, basis: 'health', note: 'provisional' },\n { code: 'barium', max: 1.3, basis: 'health' },\n { code: 'boron', max: 2.4, basis: 'health' },\n { code: 'cadmium', max: 0.003, basis: 'health' },\n { code: 'chromium', max: 0.05, basis: 'health', note: 'provisional' },\n { code: 'copper', max: 2, basis: 'health' },\n { code: 'fluoride', max: 1.5, basis: 'health' },\n { code: 'lead', max: 0.01, basis: 'health', note: 'provisional' },\n { code: 'manganese', max: 0.08, basis: 'health', note: 'provisional' },\n { code: 'mercury', max: 0.006, basis: 'health', note: 'inorganic mercury' },\n { code: 'nickel', max: 0.07, basis: 'health' },\n { code: 'nitrate_as_no3', max: 50, basis: 'health' },\n { code: 'nitrite_as_no2', max: 3, basis: 'health' },\n { code: 'selenium', max: 0.04, basis: 'health', note: 'provisional' },\n { code: 'uranium', max: 0.03, basis: 'health', note: 'provisional' },\n { code: 'e_coli', presence_allowed: false, basis: 'health' },\n {\n code: 'thermotolerant_coliforms',\n presence_allowed: false,\n basis: 'health',\n },\n { code: 'gross_alpha', max: 0.5, basis: 'health', note: 'screening level' },\n { code: 'gross_beta', max: 1, basis: 'health', note: 'screening level' },\n ],\n};\n\n/** Brazil — Portaria GM/MS nº 888/2021 (drinking water potability standard). */\nexport const BR_GM_MS_888_2021: LimitSet = {\n id: 'br_gm_ms_888_2021',\n name: 'Brasil — Portaria GM/MS 888/2021',\n jurisdiction: 'BR',\n source: 'Ministério da Saúde, Portaria GM/MS nº 888, de 4 de maio de 2021',\n limits: [\n // Inorganic substances (health)\n { code: 'antimony', max: 0.006, basis: 'health' },\n { code: 'arsenic', max: 0.01, basis: 'health' },\n { code: 'barium', max: 0.7, basis: 'health' },\n { code: 'cadmium', max: 0.003, basis: 'health' },\n { code: 'lead', max: 0.01, basis: 'health' },\n { code: 'cyanide_total_as_cn', max: 0.07, basis: 'health' },\n { code: 'copper', max: 2, basis: 'health' },\n { code: 'chromium', max: 0.05, basis: 'health' },\n { code: 'fluoride', max: 1.5, basis: 'health' },\n { code: 'mercury', max: 0.001, basis: 'health' },\n { code: 'nickel', max: 0.07, basis: 'health' },\n { code: 'nitrate_as_n', max: 10, basis: 'health' },\n { code: 'nitrite_as_n', max: 1, basis: 'health' },\n { code: 'selenium', max: 0.04, basis: 'health' },\n { code: 'uranium', max: 0.03, basis: 'health' },\n // Organoleptic standard\n { code: 'aluminum', max: 0.2, basis: 'aesthetic' },\n { code: 'ammonia_as_nh3', max: 1.2, basis: 'aesthetic' },\n { code: 'chloride', max: 250, basis: 'aesthetic' },\n { code: 'apparent_color', max: 15, basis: 'aesthetic' },\n { code: 'hardness_total_as_caco3', max: 300, basis: 'aesthetic' },\n { code: 'iron', max: 0.3, basis: 'aesthetic' },\n { code: 'manganese', max: 0.1, basis: 'aesthetic' },\n { code: 'sodium', max: 200, basis: 'aesthetic' },\n { code: 'total_dissolved_solids', max: 500, basis: 'aesthetic' },\n { code: 'sulfate', max: 250, basis: 'aesthetic' },\n {\n code: 'turbidity',\n max: 5,\n basis: 'aesthetic',\n note: 'organoleptic standard (uT)',\n },\n // Operational\n {\n code: 'ph',\n min: 6,\n max: 9,\n basis: 'operational',\n note: 'recommended range',\n },\n {\n code: 'free_chlorine',\n min: 0.2,\n max: 5,\n basis: 'operational',\n note: 'residual in the distribution system',\n },\n // Microbiological\n { code: 'e_coli', presence_allowed: false, basis: 'health' },\n {\n code: 'total_coliforms',\n presence_allowed: false,\n basis: 'indicator',\n note: 'tolerances apply by system size and sampling point',\n },\n // Radioactivity\n { code: 'gross_alpha', max: 0.5, basis: 'health', note: 'screening level' },\n { code: 'gross_beta', max: 1, basis: 'health', note: 'screening level' },\n { code: 'radium_226', max: 1, basis: 'health' },\n { code: 'radium_228', max: 0.1, basis: 'health' },\n ],\n};\n\n/** EU — Directive (EU) 2020/2184 on the quality of water intended for human consumption. */\nexport const EU_2020_2184: LimitSet = {\n id: 'eu_2020_2184',\n name: 'EU Drinking Water Directive 2020/2184',\n jurisdiction: 'EU',\n source:\n 'Directive (EU) 2020/2184 of the European Parliament and of the Council, Annex I',\n limits: [\n // Part A — microbiological\n { code: 'e_coli', presence_allowed: false, basis: 'health' },\n // Part B — chemical\n { code: 'antimony', max: 0.01, basis: 'health' },\n { code: 'arsenic', max: 0.01, basis: 'health' },\n {\n code: 'boron',\n max: 1.5,\n basis: 'health',\n note: '2.4 mg/L where desalinated water is the predominant source',\n },\n { code: 'cadmium', max: 0.005, basis: 'health' },\n {\n code: 'chromium',\n max: 0.05,\n basis: 'health',\n note: '0.025 mg/L from 12 January 2036',\n },\n { code: 'copper', max: 2, basis: 'health' },\n { code: 'cyanide_total_as_cn', max: 0.05, basis: 'health' },\n { code: 'fluoride', max: 1.5, basis: 'health' },\n {\n code: 'lead',\n max: 0.01,\n basis: 'health',\n note: '0.005 mg/L from 12 January 2036',\n },\n { code: 'mercury', max: 0.001, basis: 'health' },\n { code: 'nickel', max: 0.02, basis: 'health' },\n { code: 'nitrate_as_no3', max: 50, basis: 'health' },\n { code: 'nitrite_as_no2', max: 0.5, basis: 'health', note: 'at the tap' },\n { code: 'selenium', max: 0.02, basis: 'health' },\n { code: 'uranium', max: 0.03, basis: 'health' },\n // Part C — indicator parameters\n { code: 'aluminum', max: 0.2, basis: 'indicator' },\n { code: 'chloride', max: 250, basis: 'indicator' },\n {\n code: 'specific_conductance',\n max: 2500,\n basis: 'indicator',\n note: 'directive value is at 20 °C',\n },\n { code: 'ph', min: 6.5, max: 9.5, basis: 'indicator' },\n { code: 'iron', max: 0.2, basis: 'indicator' },\n { code: 'manganese', max: 0.05, basis: 'indicator' },\n { code: 'sodium', max: 200, basis: 'indicator' },\n { code: 'sulfate', max: 250, basis: 'indicator' },\n { code: 'total_coliforms', presence_allowed: false, basis: 'indicator' },\n ],\n};\n\n/** All bundled limit sets, in display order. */\nexport const WATER_QUALITY_LIMIT_SETS: readonly LimitSet[] = [\n WHO_GDWQ_2022,\n BR_GM_MS_888_2021,\n EU_2020_2184,\n];\n\n/** Finds a bundled limit set by `id`. */\nexport function getLimitSet(id: string): LimitSet | undefined {\n return WATER_QUALITY_LIMIT_SETS.find(s => s.id === id);\n}\n","import type { LanguageText, LanguageTextInput } from '../types/language.types';\n\n/**\n * The {@link LanguageText} encoded in a JSON object string, keeping only its\n * non-empty string entries (possibly none). `undefined` when `value` is not a\n * JSON object.\n */\nfunction parseLanguageTextJson(value: string): LanguageText | undefined {\n const trimmed = value.trim();\n if (!trimmed.startsWith('{') || !trimmed.endsWith('}')) return undefined;\n let parsed: unknown;\n try {\n parsed = JSON.parse(trimmed);\n } catch {\n return undefined;\n }\n if (typeof parsed !== 'object' || parsed === null || Array.isArray(parsed)) {\n return undefined;\n }\n const entries = Object.entries(parsed).filter(\n (entry): entry is [string, string] =>\n typeof entry[1] === 'string' && entry[1].trim() !== '',\n );\n return Object.fromEntries(entries);\n}\n\n/**\n * Resolves `text` to a single string for `locale`: exact tag, then its base\n * language (`pt-BR` → `pt`), then `fallback`, then the first available value.\n * Empty labels count as missing.\n *\n * - A plain string is locale-invariant and returned as-is.\n * - A JSON object string (`'{\"en\":\"Pump\",\"pt\":\"Bomba\"}'`) is parsed and\n * resolved like the object; malformed JSON is treated as a plain string.\n * - `null` / `undefined`, and objects (or JSON objects) with no usable label,\n * resolve to `''`.\n */\nexport function resolveLanguageText(\n text: LanguageTextInput,\n locale: string,\n fallback = 'en',\n): string {\n if (text == null) return '';\n const labels = typeof text === 'string' ? parseLanguageTextJson(text) : text;\n if (labels === undefined) return text as string;\n\n const base = locale.split('-')[0]!;\n const usable = (key: string) => {\n const value = labels[key];\n return typeof value === 'string' && value.trim() !== '' ? value : undefined;\n };\n return (\n usable(locale) ??\n usable(base) ??\n usable(fallback) ??\n Object.keys(labels)\n .map(usable)\n .find(v => v !== undefined) ??\n ''\n );\n}\n","import type { Parameter } from '../types/well.types';\nimport { resolveLanguageText } from '../utils/language.utils';\n\n/**\n * Version of the published `welldot` water quality parameter vocabulary.\n * Bumped whenever a code is added or a definition changes.\n */\nexport const WATER_QUALITY_VOCABULARY_VERSION = '1.0.0';\n\n/** Grouping used to organize the vocabulary (display only). */\nexport type ParameterGroup =\n | 'physical'\n | 'aggregate'\n | 'major_ion'\n | 'nutrient'\n | 'organic'\n | 'disinfection'\n | 'mining_redox'\n | 'metal'\n | 'microbiology'\n | 'radioactivity';\n\n/** Which value form a parameter's results use. */\nexport type ParameterForm = 'value' | 'presence' | 'text';\n\n/** Canonical unit of a parameter. `ucum` is absent where UCUM has no code. */\nexport type ParameterUnit = {\n /** Display symbol (e.g. `mg/L`, `µS/cm`, `NTU`). Empty for dimensionless. */\n symbol: string;\n /** UCUM code, when one exists. */\n ucum?: string;\n};\n\n/** One entry of the `welldot` parameter vocabulary. */\nexport type ParameterDefinition = {\n code: string;\n group: ParameterGroup;\n /** Canonical English label. */\n label: string;\n /** Translations of `label`, keyed by BCP 47 language tag. */\n labels: Record<string, string>;\n unit: ParameterUnit;\n form: ParameterForm;\n /** Published CAS equivalence: a `cas` result with this code is this parameter. */\n cas?: string;\n /**\n * Molar mass (g/mol) of the species the code is expressed as (e.g. N for\n * `nitrate_as_n`, CaCO₃ for alkalinities). Present for ions used in\n * ion-balance and hydrochemical derivations.\n */\n molar_mass?: number;\n /** Ionic charge of that species (signed). */\n charge?: number;\n};\n\nexport const WATER_QUALITY_UNITS = {\n mg_l: { symbol: 'mg/L', ucum: 'mg/L' },\n us_cm: { symbol: 'µS/cm', ucum: 'uS/cm' },\n celsius: { symbol: '°C', ucum: 'Cel' },\n mv: { symbol: 'mV', ucum: 'mV' },\n ph: { symbol: '', ucum: '[pH]' },\n ftu: { symbol: 'FTU' },\n ntu: { symbol: 'NTU' },\n fnu: { symbol: 'FNU' },\n fau: { symbol: 'FAU' },\n hazen: { symbol: 'uH' },\n mpn_100ml: { symbol: 'MPN/100 mL', ucum: '{MPN}/(100.mL)' },\n cfu_100ml: { symbol: 'CFU/100 mL', ucum: '{CFU}/(100.mL)' },\n cfu_ml: { symbol: 'CFU/mL', ucum: '{CFU}/mL' },\n bq_l: { symbol: 'Bq/L', ucum: 'Bq/L' },\n none: { symbol: '' },\n} as const satisfies Record<string, ParameterUnit>;\n\nconst U = WATER_QUALITY_UNITS;\n\ntype OptionalParameterFields = Partial<\n Pick<ParameterDefinition, 'cas' | 'molar_mass' | 'charge' | 'form'>\n>;\n\n/** Builds one vocabulary entry; `form` defaults to `value`. */\nfunction defineParameter(\n code: string,\n group: ParameterGroup,\n label: string,\n pt: string,\n unit: ParameterUnit,\n extra: OptionalParameterFields = {},\n): ParameterDefinition {\n return {\n code,\n group,\n label,\n labels: { pt },\n unit,\n form: extra.form ?? 'value',\n ...(extra.cas !== undefined && { cas: extra.cas }),\n ...(extra.molar_mass !== undefined && { molar_mass: extra.molar_mass }),\n ...(extra.charge !== undefined && { charge: extra.charge }),\n };\n}\n\n/** The core `welldot` parameter vocabulary (98 codes). */\nexport const WATER_QUALITY_PARAMETERS: readonly ParameterDefinition[] = [\n // Physical / field\n defineParameter(\n 'temperature',\n 'physical',\n 'Temperature',\n 'Temperatura',\n U.celsius,\n ),\n defineParameter('ph', 'physical', 'pH', 'pH', U.ph),\n defineParameter(\n 'specific_conductance',\n 'physical',\n 'Specific conductance at 25 °C',\n 'Condutividade elétrica a 25 °C',\n U.us_cm,\n ),\n defineParameter(\n 'conductivity_uncompensated',\n 'physical',\n 'Electrical conductivity, uncompensated',\n 'Condutividade sem compensação',\n U.us_cm,\n ),\n defineParameter(\n 'dissolved_oxygen',\n 'physical',\n 'Dissolved oxygen',\n 'Oxigênio dissolvido',\n U.mg_l,\n ),\n defineParameter(\n 'orp',\n 'physical',\n 'Oxidation-reduction potential vs. reference electrode',\n 'Potencial redox vs. eletrodo de referência',\n U.mv,\n ),\n defineParameter(\n 'eh',\n 'physical',\n 'Redox potential vs. SHE',\n 'Potencial redox corrigido vs. EPH',\n U.mv,\n ),\n defineParameter(\n 'turbidity',\n 'physical',\n 'Turbidity, formazin, method unspecified',\n 'Turbidez, formazina sem método identificado',\n U.ftu,\n ),\n defineParameter(\n 'turbidity_ntu',\n 'physical',\n 'Turbidity, nephelometric white light',\n 'Turbidez nefelométrica, luz branca',\n U.ntu,\n ),\n defineParameter(\n 'turbidity_fnu',\n 'physical',\n 'Turbidity, nephelometric infrared (ISO 7027)',\n 'Turbidez nefelométrica, infravermelho',\n U.fnu,\n ),\n defineParameter(\n 'turbidity_fau',\n 'physical',\n 'Turbidity, attenuation (ISO 7027)',\n 'Turbidez por atenuação',\n U.fau,\n ),\n defineParameter(\n 'apparent_color',\n 'physical',\n 'Apparent color',\n 'Cor aparente',\n U.hazen,\n ),\n defineParameter(\n 'true_color',\n 'physical',\n 'True color',\n 'Cor verdadeira',\n U.hazen,\n ),\n defineParameter('odor', 'physical', 'Odor', 'Odor', U.none, { form: 'text' }),\n defineParameter('taste', 'physical', 'Taste', 'Gosto', U.none, {\n form: 'text',\n }),\n defineParameter(\n 'total_dissolved_solids',\n 'physical',\n 'Total dissolved solids',\n 'Sólidos totais dissolvidos',\n U.mg_l,\n ),\n defineParameter(\n 'total_suspended_solids',\n 'physical',\n 'Total suspended solids',\n 'Sólidos suspensos totais',\n U.mg_l,\n ),\n defineParameter(\n 'total_solids',\n 'physical',\n 'Total solids',\n 'Sólidos totais',\n U.mg_l,\n ),\n defineParameter(\n 'free_co2',\n 'physical',\n 'Free carbon dioxide',\n 'Gás carbônico livre',\n U.mg_l,\n ),\n\n // Aggregate (expressed as CaCO₃: 100.087 g/mol, divalent → 50.04 mg/meq)\n defineParameter(\n 'alkalinity_total_as_caco3',\n 'aggregate',\n 'Total alkalinity as CaCO₃',\n 'Alcalinidade total como CaCO₃',\n U.mg_l,\n { molar_mass: 100.087, charge: -2 },\n ),\n defineParameter(\n 'alkalinity_bicarbonate_as_caco3',\n 'aggregate',\n 'Bicarbonate alkalinity as CaCO₃',\n 'Alcalinidade de bicarbonatos como CaCO₃',\n U.mg_l,\n { molar_mass: 100.087, charge: -2 },\n ),\n defineParameter(\n 'alkalinity_carbonate_as_caco3',\n 'aggregate',\n 'Carbonate alkalinity as CaCO₃',\n 'Alcalinidade de carbonatos como CaCO₃',\n U.mg_l,\n { molar_mass: 100.087, charge: -2 },\n ),\n defineParameter(\n 'alkalinity_hydroxide_as_caco3',\n 'aggregate',\n 'Hydroxide alkalinity as CaCO₃',\n 'Alcalinidade de hidróxidos como CaCO₃',\n U.mg_l,\n { molar_mass: 100.087, charge: -2 },\n ),\n defineParameter(\n 'acidity_total_as_caco3',\n 'aggregate',\n 'Total acidity as CaCO₃',\n 'Acidez total como CaCO₃',\n U.mg_l,\n { molar_mass: 100.087, charge: 2 },\n ),\n defineParameter(\n 'hardness_total_as_caco3',\n 'aggregate',\n 'Total hardness as CaCO₃',\n 'Dureza total como CaCO₃',\n U.mg_l,\n { molar_mass: 100.087, charge: 2 },\n ),\n defineParameter(\n 'hardness_calcium_as_caco3',\n 'aggregate',\n 'Calcium hardness as CaCO₃',\n 'Dureza de cálcio como CaCO₃',\n U.mg_l,\n { molar_mass: 100.087, charge: 2 },\n ),\n\n // Major ions\n defineParameter('calcium', 'major_ion', 'Calcium', 'Cálcio', U.mg_l, {\n cas: '7440-70-2',\n molar_mass: 40.078,\n charge: 2,\n }),\n defineParameter('magnesium', 'major_ion', 'Magnesium', 'Magnésio', U.mg_l, {\n cas: '7439-95-4',\n molar_mass: 24.305,\n charge: 2,\n }),\n defineParameter('sodium', 'major_ion', 'Sodium', 'Sódio', U.mg_l, {\n cas: '7440-23-5',\n molar_mass: 22.99,\n charge: 1,\n }),\n defineParameter('potassium', 'major_ion', 'Potassium', 'Potássio', U.mg_l, {\n cas: '7440-09-7',\n molar_mass: 39.098,\n charge: 1,\n }),\n defineParameter(\n 'bicarbonate',\n 'major_ion',\n 'Bicarbonate as HCO₃⁻',\n 'Bicarbonato como HCO₃⁻',\n U.mg_l,\n { cas: '71-52-3', molar_mass: 61.017, charge: -1 },\n ),\n defineParameter(\n 'carbonate',\n 'major_ion',\n 'Carbonate as CO₃²⁻',\n 'Carbonato como CO₃²⁻',\n U.mg_l,\n { cas: '3812-32-6', molar_mass: 60.009, charge: -2 },\n ),\n defineParameter('chloride', 'major_ion', 'Chloride', 'Cloreto', U.mg_l, {\n cas: '16887-00-6',\n molar_mass: 35.453,\n charge: -1,\n }),\n defineParameter('sulfate', 'major_ion', 'Sulfate', 'Sulfato', U.mg_l, {\n cas: '14808-79-8',\n molar_mass: 96.06,\n charge: -2,\n }),\n defineParameter('fluoride', 'major_ion', 'Fluoride', 'Fluoreto', U.mg_l, {\n cas: '16984-48-8',\n molar_mass: 18.998,\n charge: -1,\n }),\n defineParameter(\n 'silica_as_sio2',\n 'major_ion',\n 'Silica as SiO₂',\n 'Sílica como SiO₂',\n U.mg_l,\n { cas: '7631-86-9' },\n ),\n\n // Nutrients\n defineParameter(\n 'nitrate_as_n',\n 'nutrient',\n 'Nitrate as N',\n 'Nitrato como N',\n U.mg_l,\n {\n molar_mass: 14.007,\n charge: -1,\n },\n ),\n defineParameter(\n 'nitrate_as_no3',\n 'nutrient',\n 'Nitrate as NO₃⁻',\n 'Nitrato como NO₃⁻',\n U.mg_l,\n { cas: '14797-55-8', molar_mass: 62.004, charge: -1 },\n ),\n defineParameter(\n 'nitrite_as_n',\n 'nutrient',\n 'Nitrite as N',\n 'Nitrito como N',\n U.mg_l,\n {\n molar_mass: 14.007,\n charge: -1,\n },\n ),\n defineParameter(\n 'nitrite_as_no2',\n 'nutrient',\n 'Nitrite as NO₂⁻',\n 'Nitrito como NO₂⁻',\n U.mg_l,\n { cas: '14797-65-0', molar_mass: 46.005, charge: -1 },\n ),\n defineParameter(\n 'ammonia_as_n',\n 'nutrient',\n 'Ammonia nitrogen as N',\n 'Nitrogênio amoniacal como N',\n U.mg_l,\n { molar_mass: 14.007, charge: 1 },\n ),\n defineParameter(\n 'ammonia_as_nh3',\n 'nutrient',\n 'Ammonia as NH₃',\n 'Amônia como NH₃',\n U.mg_l,\n {\n cas: '7664-41-7',\n },\n ),\n defineParameter(\n 'kjeldahl_nitrogen_as_n',\n 'nutrient',\n 'Total Kjeldahl nitrogen as N',\n 'Nitrogênio Kjeldahl total como N',\n U.mg_l,\n ),\n defineParameter(\n 'phosphorus_total_as_p',\n 'nutrient',\n 'Total phosphorus as P',\n 'Fósforo total como P',\n U.mg_l,\n ),\n defineParameter(\n 'orthophosphate_as_po4',\n 'nutrient',\n 'Orthophosphate as PO₄³⁻',\n 'Ortofosfato como PO₄³⁻',\n U.mg_l,\n { molar_mass: 94.971, charge: -3 },\n ),\n\n // Organic\n defineParameter(\n 'total_organic_carbon',\n 'organic',\n 'Total organic carbon',\n 'Carbono orgânico total',\n U.mg_l,\n ),\n defineParameter(\n 'cod',\n 'organic',\n 'Chemical oxygen demand',\n 'Demanda química de oxigênio (DQO)',\n U.mg_l,\n ),\n defineParameter(\n 'bod5',\n 'organic',\n 'Biochemical oxygen demand, 5-day',\n 'Demanda bioquímica de oxigênio (DBO₅)',\n U.mg_l,\n ),\n defineParameter(\n 'total_petroleum_hydrocarbons',\n 'organic',\n 'Total petroleum hydrocarbons (range per method)',\n 'Hidrocarbonetos totais de petróleo',\n U.mg_l,\n ),\n defineParameter(\n 'oil_and_grease',\n 'organic',\n 'Oil and grease',\n 'Óleos e graxas',\n U.mg_l,\n ),\n\n // Disinfection\n defineParameter(\n 'free_chlorine',\n 'disinfection',\n 'Free chlorine residual',\n 'Cloro residual livre',\n U.mg_l,\n ),\n defineParameter(\n 'total_chlorine',\n 'disinfection',\n 'Total chlorine residual',\n 'Cloro residual total',\n U.mg_l,\n ),\n\n // Mining and redox\n defineParameter(\n 'ferrous_iron',\n 'mining_redox',\n 'Ferrous iron (Fe²⁺)',\n 'Ferro ferroso (Fe²⁺)',\n U.mg_l,\n ),\n defineParameter(\n 'chromium_hexavalent',\n 'mining_redox',\n 'Hexavalent chromium',\n 'Cromo hexavalente',\n U.mg_l,\n { cas: '18540-29-9' },\n ),\n defineParameter(\n 'cyanide_total_as_cn',\n 'mining_redox',\n 'Total cyanide as CN⁻',\n 'Cianeto total como CN⁻',\n U.mg_l,\n ),\n defineParameter(\n 'cyanide_wad_as_cn',\n 'mining_redox',\n 'Weak acid dissociable cyanide as CN⁻',\n 'Cianeto WAD como CN⁻',\n U.mg_l,\n ),\n defineParameter(\n 'cyanide_free_as_cn',\n 'mining_redox',\n 'Free cyanide as CN⁻',\n 'Cianeto livre como CN⁻',\n U.mg_l,\n ),\n defineParameter(\n 'thiocyanate',\n 'mining_redox',\n 'Thiocyanate',\n 'Tiocianato',\n U.mg_l,\n {\n cas: '302-04-5',\n },\n ),\n defineParameter(\n 'sulfide_total_as_s',\n 'mining_redox',\n 'Total sulfide as S',\n 'Sulfeto total como S',\n U.mg_l,\n ),\n\n // Metals / trace\n defineParameter('iron', 'metal', 'Iron', 'Ferro', U.mg_l, {\n cas: '7439-89-6',\n molar_mass: 55.845,\n charge: 2,\n }),\n defineParameter('manganese', 'metal', 'Manganese', 'Manganês', U.mg_l, {\n cas: '7439-96-5',\n molar_mass: 54.938,\n charge: 2,\n }),\n defineParameter('aluminum', 'metal', 'Aluminium', 'Alumínio', U.mg_l, {\n cas: '7429-90-5',\n }),\n defineParameter('antimony', 'metal', 'Antimony', 'Antimônio', U.mg_l, {\n cas: '7440-36-0',\n }),\n defineParameter('arsenic', 'metal', 'Arsenic', 'Arsênio', U.mg_l, {\n cas: '7440-38-2',\n }),\n defineParameter('barium', 'metal', 'Barium', 'Bário', U.mg_l, {\n cas: '7440-39-3',\n }),\n defineParameter('beryllium', 'metal', 'Beryllium', 'Berílio', U.mg_l, {\n cas: '7440-41-7',\n }),\n defineParameter('boron', 'metal', 'Boron', 'Boro', U.mg_l, {\n cas: '7440-42-8',\n }),\n defineParameter('cadmium', 'metal', 'Cadmium', 'Cádmio', U.mg_l, {\n cas: '7440-43-9',\n }),\n defineParameter(\n 'chromium',\n 'metal',\n 'Chromium, total',\n 'Cromo total',\n U.mg_l,\n {\n cas: '7440-47-3',\n },\n ),\n defineParameter('cobalt', 'metal', 'Cobalt', 'Cobalto', U.mg_l, {\n cas: '7440-48-4',\n }),\n defineParameter('copper', 'metal', 'Copper', 'Cobre', U.mg_l, {\n cas: '7440-50-8',\n }),\n defineParameter('lead', 'metal', 'Lead', 'Chumbo', U.mg_l, {\n cas: '7439-92-1',\n }),\n defineParameter('lithium', 'metal', 'Lithium', 'Lítio', U.mg_l, {\n cas: '7439-93-2',\n molar_mass: 6.94,\n charge: 1,\n }),\n defineParameter('mercury', 'metal', 'Mercury', 'Mercúrio', U.mg_l, {\n cas: '7439-97-6',\n }),\n defineParameter('molybdenum', 'metal', 'Molybdenum', 'Molibdênio', U.mg_l, {\n cas: '7439-98-7',\n }),\n defineParameter('nickel', 'metal', 'Nickel', 'Níquel', U.mg_l, {\n cas: '7440-02-0',\n }),\n defineParameter('selenium', 'metal', 'Selenium', 'Selênio', U.mg_l, {\n cas: '7782-49-2',\n }),\n defineParameter('silver', 'metal', 'Silver', 'Prata', U.mg_l, {\n cas: '7440-22-4',\n }),\n defineParameter('strontium', 'metal', 'Strontium', 'Estrôncio', U.mg_l, {\n cas: '7440-24-6',\n molar_mass: 87.62,\n charge: 2,\n }),\n defineParameter('thallium', 'metal', 'Thallium', 'Tálio', U.mg_l, {\n cas: '7440-28-0',\n }),\n defineParameter('uranium', 'metal', 'Uranium', 'Urânio', U.mg_l, {\n cas: '7440-61-1',\n }),\n defineParameter('vanadium', 'metal', 'Vanadium', 'Vanádio', U.mg_l, {\n cas: '7440-62-2',\n }),\n defineParameter('zinc', 'metal', 'Zinc', 'Zinco', U.mg_l, {\n cas: '7440-66-6',\n }),\n\n // Microbiology\n defineParameter(\n 'total_coliforms',\n 'microbiology',\n 'Total coliforms in 100 mL',\n 'Coliformes totais em 100 mL',\n U.none,\n { form: 'presence' },\n ),\n defineParameter(\n 'total_coliforms_mpn',\n 'microbiology',\n 'Total coliforms, count',\n 'Coliformes totais, contagem',\n U.mpn_100ml,\n ),\n defineParameter(\n 'total_coliforms_cfu',\n 'microbiology',\n 'Total coliforms, count',\n 'Coliformes totais, contagem',\n U.cfu_100ml,\n ),\n defineParameter(\n 'e_coli',\n 'microbiology',\n 'E. coli in 100 mL',\n 'E. coli em 100 mL',\n U.none,\n { form: 'presence' },\n ),\n defineParameter(\n 'e_coli_mpn',\n 'microbiology',\n 'E. coli, count',\n 'E. coli, contagem',\n U.mpn_100ml,\n ),\n defineParameter(\n 'e_coli_cfu',\n 'microbiology',\n 'E. coli, count',\n 'E. coli, contagem',\n U.cfu_100ml,\n ),\n defineParameter(\n 'thermotolerant_coliforms',\n 'microbiology',\n 'Thermotolerant coliforms in 100 mL',\n 'Coliformes termotolerantes em 100 mL',\n U.none,\n { form: 'presence' },\n ),\n defineParameter(\n 'thermotolerant_coliforms_mpn',\n 'microbiology',\n 'Thermotolerant coliforms, count',\n 'Coliformes termotolerantes, contagem',\n U.mpn_100ml,\n ),\n defineParameter(\n 'thermotolerant_coliforms_cfu',\n 'microbiology',\n 'Thermotolerant coliforms, count',\n 'Coliformes termotolerantes, contagem',\n U.cfu_100ml,\n ),\n defineParameter(\n 'heterotrophic_plate_count',\n 'microbiology',\n 'Heterotrophic plate count',\n 'Bactérias heterotróficas',\n U.cfu_ml,\n ),\n\n // Radioactivity (Bq/L even where a CAS exists)\n defineParameter(\n 'gross_alpha',\n 'radioactivity',\n 'Gross alpha activity',\n 'Atividade alfa total',\n U.bq_l,\n ),\n defineParameter(\n 'gross_beta',\n 'radioactivity',\n 'Gross beta activity',\n 'Atividade beta total',\n U.bq_l,\n ),\n defineParameter(\n 'radium_226',\n 'radioactivity',\n 'Radium-226',\n 'Rádio-226',\n U.bq_l,\n {\n cas: '13982-63-3',\n },\n ),\n defineParameter(\n 'radium_228',\n 'radioactivity',\n 'Radium-228',\n 'Rádio-228',\n U.bq_l,\n {\n cas: '15262-20-1',\n },\n ),\n defineParameter(\n 'radon_222',\n 'radioactivity',\n 'Radon-222',\n 'Radônio-222',\n U.bq_l,\n {\n cas: '14859-67-7',\n },\n ),\n];\n\nconst BY_CODE = new Map(WATER_QUALITY_PARAMETERS.map(d => [d.code, d]));\nconst BY_CAS = new Map(\n WATER_QUALITY_PARAMETERS.filter(d => d.cas).map(d => [d.cas!, d]),\n);\n\n/**\n * Looks up the vocabulary entry for a parameter. A `cas` parameter resolves\n * through the published equivalences to its `welldot` entry. Returns\n * `undefined` for unknown codes, CAS numbers without an equivalent, and\n * `x-` vocabularies.\n */\nexport function getParameterDefinition(\n parameter: Parameter,\n): ParameterDefinition | undefined {\n if (parameter.vocabulary === 'welldot') return BY_CODE.get(parameter.code);\n if (parameter.vocabulary === 'cas') return BY_CAS.get(parameter.code);\n return undefined;\n}\n\n/**\n * Display label of a parameter in `locale` (`pt-BR` → `pt` → English): its\n * vocabulary entry's translation (a CAS number resolves through the\n * published equivalences first), else the raw code (`x-` and unknown codes).\n */\nexport function getParameterLabel(\n parameter: Parameter,\n locale: string,\n): string {\n const def = getParameterDefinition(parameter);\n if (!def) return parameter.code;\n return resolveLanguageText({ ...def.labels, en: def.label }, locale, 'en');\n}\n\n/**\n * Canonical identity of a parameter: the `welldot` code when the parameter\n * is (or resolves to) a vocabulary entry, otherwise `vocabulary:code`.\n * A `welldot` code and its CAS equivalent produce the same key.\n */\nexport function parameterKey(parameter: Parameter): string {\n const def = getParameterDefinition(parameter);\n if (def) return def.code;\n return `${parameter.vocabulary}:${parameter.code}`;\n}\n\n/**\n * Whether a parameter's code is defined by its vocabulary version. `cas`\n * codes and `x-` vocabularies are always accepted (CAS numbers outside the\n * equivalence table are substances in mg/L).\n */\nexport function isKnownParameter(parameter: Parameter): boolean {\n if (parameter.vocabulary !== 'welldot') return true;\n return BY_CODE.has(parameter.code);\n}\n","import type { VocabEntry } from './vocab';\n\n/** Recommended `attachments[].document_type` values (since v2.3). */\nexport const DOCUMENT_TYPES = [\n {\n value: 'drilling_report',\n label: { en: 'Drilling report', pt: 'Relatório de perfuração' },\n },\n {\n value: 'as_built_drawing',\n label: { en: 'As-built drawing', pt: 'Perfil construtivo as-built' },\n },\n {\n value: 'registry_record',\n label: { en: 'Registry record', pt: 'Ficha cadastral' },\n },\n { value: 'photo', label: { en: 'Photo', pt: 'Fotografia' } },\n {\n value: 'permit_document',\n label: { en: 'Permit document', pt: 'Portaria / outorga' },\n },\n {\n value: 'condition_evidence',\n label: { en: 'Condition evidence', pt: 'Comprovante de condicionante' },\n },\n { value: 'pump_curve', label: { en: 'Pump curve', pt: 'Curva da bomba' } },\n {\n value: 'field_sheet',\n label: { en: 'Field sheet', pt: 'Planilha de campo' },\n },\n {\n value: 'test_report',\n label: {\n en: 'Pumping test report',\n pt: 'Relatório de teste de bombeamento',\n },\n },\n {\n value: 'lab_report',\n label: { en: 'Lab report', pt: 'Laudo laboratorial' },\n },\n { value: 'invoice', label: { en: 'Invoice', pt: 'Nota fiscal' } },\n] as const satisfies readonly VocabEntry[];\n\nexport type AttachmentDocumentType = (typeof DOCUMENT_TYPES)[number]['value'];\n\n/** Document types suggested first for each place an attachment can live. */\nexport const DOCUMENT_TYPE_SUGGESTIONS = {\n root: ['drilling_report', 'as_built_drawing', 'registry_record', 'photo'],\n pump: ['pump_curve', 'invoice', 'photo'],\n meter: ['photo', 'invoice', 'condition_evidence'],\n permit: ['permit_document', 'photo'],\n condition: ['condition_evidence', 'photo'],\n permit_history: ['permit_document', 'invoice', 'photo'],\n event: ['field_sheet', 'photo'],\n history: ['condition_evidence', 'photo', 'invoice'],\n sample: ['lab_report', 'field_sheet', 'photo', 'condition_evidence'],\n} as const satisfies Record<string, readonly AttachmentDocumentType[]>;\n\nexport type DocumentTypeContext = keyof typeof DOCUMENT_TYPE_SUGGESTIONS;\n","import type { VocabEntry } from './vocab';\n\n/** Recommended `bore_hole[].drilling_method` values. */\nexport const DRILLING_METHODS = [\n { value: 'rotary', label: { en: 'Rotary', pt: 'Rotativo' } },\n { value: 'percussion', label: { en: 'Percussion', pt: 'Percussão' } },\n { value: 'cable_tool', label: { en: 'Cable tool', pt: 'Percussão a cabo' } },\n { value: 'auger', label: { en: 'Auger', pt: 'Trado' } },\n {\n value: 'air_hammer',\n label: { en: 'Air hammer', pt: 'Martelo pneumático' },\n },\n] as const satisfies readonly VocabEntry[];\n\nexport type DrillingMethod = (typeof DRILLING_METHODS)[number]['value'];\n\n/**\n * Recommended construction materials, shared by `well_case[].type`,\n * `well_screen[].type`, `reduction[].type` and\n * `pump_installations[].riser_material`.\n */\nexport const CONSTRUCTION_MATERIALS = [\n { value: 'pvc', label: { en: 'PVC', pt: 'PVC' } },\n {\n value: 'geomechanical_pvc',\n label: { en: 'Geomechanical PVC', pt: 'PVC geomecânico' },\n },\n { value: 'carbon_steel', label: { en: 'Carbon steel', pt: 'Aço carbono' } },\n {\n value: 'galvanized_steel',\n label: { en: 'Galvanized steel', pt: 'Aço galvanizado' },\n },\n {\n value: 'stainless_steel',\n label: { en: 'Stainless steel', pt: 'Aço inox' },\n },\n { value: 'fiberglass', label: { en: 'Fiberglass', pt: 'Fibra de vidro' } },\n] as const satisfies readonly VocabEntry[];\n\nexport type ConstructionMaterial =\n (typeof CONSTRUCTION_MATERIALS)[number]['value'];\n\n/**\n * Recommended `well_screen[].slot_type` values (since v2.3): the screen\n * design, independent of its material (`well_screen[].type`).\n */\nexport const SCREEN_SLOT_TYPES = [\n {\n value: 'continuous_slot',\n label: { en: 'Continuous slot', pt: 'Espiralado (tipo Johnson)' },\n },\n { value: 'slotted', label: { en: 'Slotted', pt: 'Ranhurado' } },\n { value: 'bridge_slot', label: { en: 'Bridge slot', pt: 'Tipo ponte' } },\n { value: 'louver', label: { en: 'Louver', pt: 'Veneziana' } },\n { value: 'perforated', label: { en: 'Perforated', pt: 'Perfurado' } },\n { value: 'nold', label: { en: 'Nold type', pt: 'Tipo Nold' } },\n] as const satisfies readonly VocabEntry[];\n\nexport type ScreenSlotType = (typeof SCREEN_SLOT_TYPES)[number]['value'];\n\n/**\n * Recommended `centralizers[].type` values (since v2.1): the centralizer\n * design, plus the steel materials commonly used to name rigid ones.\n */\nexport const CENTRALIZER_TYPES = [\n { value: 'spring_bow', label: { en: 'Spring bow', pt: 'Mola (spring bow)' } },\n { value: 'rigid', label: { en: 'Rigid', pt: 'Rígido' } },\n { value: 'semi_rigid', label: { en: 'Semi-rigid', pt: 'Semirrígido' } },\n { value: 'polymer', label: { en: 'Polymer', pt: 'Polimérico' } },\n { value: 'carbon_steel', label: { en: 'Carbon steel', pt: 'Aço carbono' } },\n {\n value: 'galvanized_steel',\n label: { en: 'Galvanized steel', pt: 'Aço galvanizado' },\n },\n {\n value: 'stainless_steel',\n label: { en: 'Stainless steel', pt: 'Aço inox' },\n },\n] as const satisfies readonly VocabEntry[];\n\nexport type CentralizerType = (typeof CENTRALIZER_TYPES)[number]['value'];\n\n/** Recommended `cement_pad.type` values. */\nexport const CEMENT_PAD_TYPES = [\n { value: 'concrete', label: { en: 'Concrete', pt: 'Concreto' } },\n {\n value: 'reinforced_concrete',\n label: { en: 'Reinforced concrete', pt: 'Concreto armado' },\n },\n { value: 'cement', label: { en: 'Cement', pt: 'Cimento' } },\n { value: 'mortar', label: { en: 'Mortar', pt: 'Argamassa' } },\n] as const satisfies readonly VocabEntry[];\n\nexport type CementPadType = (typeof CEMENT_PAD_TYPES)[number]['value'];\n","import type { VocabEntry } from './vocab';\n\n/** Recommended `well_type` values — construction method (since v2.1). */\nexport const WELL_TYPES = [\n { value: 'tubular', label: { en: 'Tubular', pt: 'Tubular' } },\n {\n value: 'hand_dug',\n label: { en: 'Hand dug', pt: 'Cacimba / poço escavado' },\n },\n { value: 'horizontal', label: { en: 'Horizontal', pt: 'Horizontal' } },\n {\n value: 'infiltration_gallery',\n label: { en: 'Infiltration gallery', pt: 'Galeria de infiltração' },\n },\n {\n value: 'artesian',\n label: { en: 'Artesian (deprecated)', pt: 'Artesiano (obsoleto)' },\n deprecated: true,\n },\n] as const satisfies readonly VocabEntry[];\n\nexport type WellType = (typeof WELL_TYPES)[number]['value'];\n\n/** Recommended `well_purpose[]` values (since v2.1). */\nexport const WELL_PURPOSES = [\n {\n value: 'production',\n label: { en: 'Production', pt: 'Produção / captação' },\n },\n {\n value: 'monitoring',\n label: { en: 'Monitoring well', pt: 'Poço de monitoramento' },\n },\n { value: 'piezometer', label: { en: 'Piezometer', pt: 'Piezômetro' } },\n {\n value: 'water_level_indicator',\n label: {\n en: 'Water level indicator',\n pt: \"INA — indicador de nível d'água\",\n },\n },\n {\n value: 'observation',\n label: { en: 'Observation well', pt: 'Poço de observação' },\n },\n {\n value: 'exploration',\n label: { en: 'Exploration', pt: 'Pesquisa / exploratório' },\n },\n {\n value: 'injection',\n label: { en: 'Injection / recharge', pt: 'Injeção / recarga' },\n },\n { value: 'dewatering', label: { en: 'Dewatering', pt: 'Rebaixamento' } },\n] as const satisfies readonly VocabEntry[];\n\nexport type WellPurpose = (typeof WELL_PURPOSES)[number]['value'];\n","import type { VocabEntry } from './vocab';\n\n/** Recommended `history_logs[].category` values. */\nexport const HISTORY_LOG_CATEGORIES = [\n { value: 'maintenance', label: { en: 'Maintenance', pt: 'Manutenção' } },\n { value: 'inspection', label: { en: 'Inspection', pt: 'Inspeção' } },\n { value: 'incident', label: { en: 'Incident', pt: 'Incidente' } },\n { value: 'event', label: { en: 'Event', pt: 'Evento' } },\n {\n value: 'status_change',\n label: { en: 'Status change', pt: 'Mudança de situação' },\n },\n] as const satisfies readonly VocabEntry[];\n\nexport type HistoryLogCategory =\n (typeof HISTORY_LOG_CATEGORIES)[number]['value'];\n\n/** Recommended `history_logs[].severity` values. */\nexport const HISTORY_LOG_SEVERITIES = [\n { value: 'low', label: { en: 'Low', pt: 'Baixa' } },\n { value: 'medium', label: { en: 'Medium', pt: 'Média' } },\n { value: 'high', label: { en: 'High', pt: 'Alta' } },\n { value: 'critical', label: { en: 'Critical', pt: 'Crítica' } },\n] as const satisfies readonly VocabEntry[];\n\nexport type HistoryLogSeverity =\n (typeof HISTORY_LOG_SEVERITIES)[number]['value'];\n","import type { VocabEntry } from './vocab';\n\n/** Canonical `hydrodynamic_events[].type` values; `x-` types pass through. */\nexport const HYDRODYNAMIC_EVENT_TYPES = [\n {\n value: 'spot_measurement',\n label: { en: 'Spot measurement', pt: 'Medição pontual' },\n },\n {\n value: 'constant_rate',\n label: { en: 'Constant rate', pt: 'Vazão constante' },\n },\n { value: 'step_drawdown', label: { en: 'Step drawdown', pt: 'Escalonada' } },\n { value: 'airlift', label: { en: 'Air-lift', pt: 'Air-lift' } },\n {\n value: 'recovery_only',\n label: { en: 'Recovery only', pt: 'Recuperação' },\n },\n] as const satisfies readonly VocabEntry[];\n\n/** Recommended `spot_measurement.measurement_method` values. */\nexport const MEASUREMENT_METHODS = [\n {\n value: 'electric_probe',\n label: { en: 'Electric probe', pt: 'Sonda elétrica' },\n },\n {\n value: 'pressure_transducer',\n label: { en: 'Pressure transducer', pt: 'Transdutor de pressão' },\n },\n { value: 'air_line', label: { en: 'Air line', pt: 'Linha de ar' } },\n { value: 'tape', label: { en: 'Tape', pt: 'Trena' } },\n] as const satisfies readonly VocabEntry[];\n\nexport type MeasurementMethod = (typeof MEASUREMENT_METHODS)[number]['value'];\n\n/** Recommended `aquifer_analysis[].method` values. */\nexport const AQUIFER_ANALYSIS_METHODS = [\n { value: 'cooper_jacob', label: { en: 'Cooper-Jacob', pt: 'Cooper-Jacob' } },\n { value: 'theis', label: { en: 'Theis', pt: 'Theis' } },\n { value: 'neuman', label: { en: 'Neuman', pt: 'Neuman' } },\n { value: 'hantush', label: { en: 'Hantush', pt: 'Hantush' } },\n {\n value: 'birsoy_summers',\n label: { en: 'Birsoy-Summers', pt: 'Birsoy-Summers' },\n },\n { value: 'eden_hazel', label: { en: 'Eden-Hazel', pt: 'Eden-Hazel' } },\n {\n value: 'visual_inspection',\n label: { en: 'Visual inspection', pt: 'Inspeção visual' },\n },\n] as const satisfies readonly VocabEntry[];\n\nexport type AquiferAnalysisMethod =\n (typeof AQUIFER_ANALYSIS_METHODS)[number]['value'];\n","import type { VocabEntry } from './vocab';\n\n/** Recommended `pump_installations[].type` values (since v2.3). */\nexport const PUMP_TYPES = [\n {\n value: 'submersible',\n label: { en: 'Submersible pump', pt: 'Bomba submersa' },\n },\n {\n value: 'vertical_turbine',\n label: { en: 'Vertical turbine pump', pt: 'Bomba de eixo vertical' },\n },\n { value: 'jet', label: { en: 'Jet pump', pt: 'Bomba injetora' } },\n {\n value: 'progressive_cavity',\n label: { en: 'Progressive cavity pump', pt: 'Bomba helicoidal' },\n },\n { value: 'hand_pump', label: { en: 'Hand pump', pt: 'Bomba manual' } },\n {\n value: 'compressor_airlift',\n label: { en: 'Compressor (air-lift)', pt: 'Compressor (air-lift)' },\n },\n] as const satisfies readonly VocabEntry[];\n\nexport type PumpType = (typeof PUMP_TYPES)[number]['value'];\n\n/** Recommended `pump_installations[].power_source` values (since v2.3). */\nexport const POWER_SOURCES = [\n { value: 'grid', label: { en: 'Grid', pt: 'Rede elétrica' } },\n { value: 'solar', label: { en: 'Solar', pt: 'Solar' } },\n { value: 'diesel', label: { en: 'Diesel', pt: 'Diesel' } },\n { value: 'hybrid', label: { en: 'Hybrid', pt: 'Híbrido' } },\n] as const satisfies readonly VocabEntry[];\n\nexport type PowerSource = (typeof POWER_SOURCES)[number]['value'];\n\n/** Recommended `meters[].type` values (since v2.3). */\nexport const METER_TYPES = [\n { value: 'mechanical', label: { en: 'Mechanical', pt: 'Mecânico' } },\n {\n value: 'electromagnetic',\n label: { en: 'Electromagnetic', pt: 'Eletromagnético' },\n },\n { value: 'ultrasonic', label: { en: 'Ultrasonic', pt: 'Ultrassônico' } },\n] as const satisfies readonly VocabEntry[];\n\nexport type MeterType = (typeof METER_TYPES)[number]['value'];\n\n/** Recommended `production[].source` values of a `meter_reading` (since v2.3). */\nexport const READING_SOURCES = [\n { value: 'manual', label: { en: 'Manual', pt: 'Manual' } },\n { value: 'telemetry', label: { en: 'Telemetry', pt: 'Telemetria' } },\n] as const satisfies readonly VocabEntry[];\n\nexport type ReadingSource = (typeof READING_SOURCES)[number]['value'];\n\n/** Recommended `production[].method` values of an `estimated_volume` (since v2.3). */\nexport const ESTIMATION_METHODS = [\n {\n value: 'flow_time',\n label: { en: 'Flow × operating time', pt: 'Vazão × tempo de operação' },\n },\n {\n value: 'energy',\n label: { en: 'Energy consumption', pt: 'Consumo de energia' },\n },\n {\n value: 'user_statement',\n label: { en: 'User statement', pt: 'Informado pelo usuário' },\n },\n] as const satisfies readonly VocabEntry[];\n\nexport type EstimationMethod = (typeof ESTIMATION_METHODS)[number]['value'];\n\n/** Recommended `history_logs[].maintenance_type` values (since v2.3). */\nexport const MAINTENANCE_TYPES = [\n { value: 'inspection', label: { en: 'Inspection', pt: 'Inspeção' } },\n { value: 'cleaning', label: { en: 'Cleaning', pt: 'Limpeza' } },\n {\n value: 'redevelopment',\n label: { en: 'Redevelopment', pt: 'Redesenvolvimento' },\n },\n { value: 'disinfection', label: { en: 'Disinfection', pt: 'Desinfecção' } },\n {\n value: 'pump_service',\n label: { en: 'Pump service', pt: 'Manutenção da bomba' },\n },\n {\n value: 'meter_calibration',\n label: { en: 'Meter calibration', pt: 'Aferição do hidrômetro' },\n },\n {\n value: 'video_inspection',\n label: {\n en: 'Video inspection / optical logging',\n pt: 'Filmagem / perfilagem ótica',\n },\n },\n {\n value: 'level_measurement',\n label: { en: 'Level measurement', pt: 'Medição de nível' },\n },\n {\n value: 'pump_test',\n label: { en: 'Pumping test', pt: 'Teste de bombeamento' },\n },\n {\n value: 'water_sampling',\n label: { en: 'Water sampling', pt: 'Coleta de água' },\n },\n] as const satisfies readonly VocabEntry[];\n\nexport type MaintenanceType = (typeof MAINTENANCE_TYPES)[number]['value'];\n","import type { VocabEntry } from './vocab';\n\n/** Recommended `permits[].type` values (since v2.3). */\nexport const PERMIT_TYPES = [\n {\n value: 'abstraction_permit',\n label: { en: 'Abstraction permit', pt: 'Outorga de direito de uso' },\n },\n {\n value: 'preliminary_permit',\n label: { en: 'Preliminary permit', pt: 'Outorga prévia' },\n },\n {\n value: 'exemption',\n label: { en: 'Exemption', pt: 'Dispensa / uso insignificante' },\n },\n { value: 'registration', label: { en: 'Registration', pt: 'Cadastro' } },\n {\n value: 'dewatering_permit',\n label: { en: 'Dewatering permit', pt: 'Outorga para rebaixamento' },\n },\n {\n value: 'drilling_permit',\n label: { en: 'Drilling permit', pt: 'Autorização de perfuração' },\n },\n] as const satisfies readonly VocabEntry[];\n\nexport type PermitType = (typeof PERMIT_TYPES)[number]['value'];\n\n/** Recommended `permits[].water_use[]` values (since v2.3). */\nexport const WATER_USES = [\n {\n value: 'human_supply',\n label: { en: 'Human supply', pt: 'Abastecimento humano' },\n },\n { value: 'industrial', label: { en: 'Industrial', pt: 'Industrial' } },\n { value: 'mining', label: { en: 'Mining', pt: 'Mineração' } },\n { value: 'irrigation', label: { en: 'Irrigation', pt: 'Irrigação' } },\n {\n value: 'livestock',\n label: { en: 'Livestock', pt: 'Dessedentação animal' },\n },\n {\n value: 'commercial',\n label: { en: 'Commercial', pt: 'Comercial / serviços' },\n },\n] as const satisfies readonly VocabEntry[];\n\nexport type WaterUse = (typeof WATER_USES)[number]['value'];\n\n/** Recommended `permits[].conditions[].category` values (since v2.3). */\nexport const CONDITION_CATEGORIES = [\n {\n value: 'monitoring',\n label: { en: 'Monitoring', pt: 'Monitoramento' },\n description: {\n en: 'Water level, flow, abstracted volume and water quality monitoring/sampling',\n pt: 'Monitoramento/amostragem de nível, vazão, volume captado e qualidade da água',\n },\n },\n {\n value: 'reporting',\n label: { en: 'Reporting', pt: 'Relatórios e declarações' },\n description: {\n en: 'Periodic reports and volume/flow declarations submitted to the authority',\n pt: 'Relatórios periódicos e declarações de volume/vazão entregues ao órgão',\n },\n },\n {\n value: 'equipment_installation',\n label: { en: 'Equipment installation', pt: 'Instalação de equipamentos' },\n description: {\n en: 'Meters (hidrômetro), level gauges, sampling taps, telemetry',\n pt: 'Hidrômetro, medidor de nível, torneira de amostragem, telemetria',\n },\n },\n {\n value: 'well_protection',\n label: { en: 'Well protection', pt: 'Proteção do poço' },\n description: {\n en: 'Sanitary slab, seal, protection perimeter, wellhead closure',\n pt: 'Laje de proteção, selo sanitário, perímetro de proteção, tampa do poço',\n },\n },\n {\n value: 'environmental',\n label: { en: 'Environmental', pt: 'Ambiental' },\n description: {\n en: 'Environmental measures, compensation, licensing of the activity',\n pt: 'Medidas ambientais, compensação, licenciamento da atividade',\n },\n },\n {\n value: 'legal',\n label: { en: 'Legal / administrative', pt: 'Legal / administrativo' },\n description: {\n en: 'Renewal request, fees, registrations, document submissions',\n pt: 'Pedido de renovação, taxas, cadastros, entrega de documentos',\n },\n },\n] as const satisfies readonly VocabEntry[];\n\nexport type ConditionCategory = (typeof CONDITION_CATEGORIES)[number]['value'];\n\n/** Recommended `permits[].history[].type` values (since v2.3). */\nexport const PERMIT_HISTORY_TYPES = [\n { value: 'filing', label: { en: 'Filing', pt: 'Protocolo' } },\n { value: 'process', label: { en: 'Process', pt: 'Andamento' } },\n { value: 'notification', label: { en: 'Notification', pt: 'Notificação' } },\n { value: 'fee', label: { en: 'Fee', pt: 'Taxa' } },\n { value: 'inspection', label: { en: 'Inspection', pt: 'Vistoria' } },\n { value: 'decision', label: { en: 'Decision', pt: 'Decisão' } },\n { value: 'renewal', label: { en: 'Renewal', pt: 'Renovação' } },\n] as const satisfies readonly VocabEntry[];\n\nexport type PermitHistoryType = (typeof PERMIT_HISTORY_TYPES)[number]['value'];\n","import type { LanguageText } from '../types/language.types';\nimport { resolveLanguageText } from '../utils/language.utils';\n\n/** One recommended value of an open (free-text) `.well` vocabulary. */\nexport type VocabEntry<V extends string = string> = {\n value: V;\n /** Display label; welldot vocabularies always provide `en` and `pt`. */\n label: LanguageText<'en' | 'pt'>;\n description?: LanguageText<'en' | 'pt'>;\n /** Still valid and resolvable, but never offered for new input. */\n deprecated?: true;\n};\n\n/**\n * A field that recommends the values `V` but accepts any string (free text or\n * an `x-` prefixed extension). The `string & {}` arm keeps editor\n * autocomplete for `V` — a plain `V | string` collapses to `string`.\n */\nexport type OpenVocab<V extends string> = V | (string & {});\n\n/** The entry of `vocab` whose `value` is exactly `value`, if any. */\nexport function getVocabEntry<V extends string>(\n vocab: readonly VocabEntry<V>[],\n value: string | undefined,\n): VocabEntry<V> | undefined {\n if (value === undefined) return undefined;\n return vocab.find(entry => entry.value === value);\n}\n\n/** Whether `value` is one of the recommended values of `vocab`. */\nexport function isVocabValue<V extends string>(\n vocab: readonly VocabEntry<V>[],\n value: string | undefined,\n): value is V {\n return getVocabEntry(vocab, value) !== undefined;\n}\n\n/**\n * Display label of `value` in `locale`. Free-text and `x-` values have no\n * entry and are returned as-is.\n */\nexport function getVocabLabel(\n vocab: readonly VocabEntry[],\n value: string,\n locale: string,\n): string {\n const entry = getVocabEntry(vocab, value);\n return entry ? resolveLanguageText(entry.label, locale) : value;\n}\n\n/**\n * Comma-separated labels of a multi-valued field (e.g. `well_purpose`) in\n * `locale`. Values with no entry are kept as-is.\n */\nexport function formatVocabList(\n vocab: readonly VocabEntry[],\n values: readonly string[] | undefined,\n locale: string,\n): string {\n return (values ?? []).map(v => getVocabLabel(vocab, v, locale)).join(', ');\n}\n\n/** The recommended values of `vocab`, deprecated ones left out by default. */\nexport function vocabValues<V extends string>(\n vocab: readonly VocabEntry<V>[],\n { includeDeprecated = false }: { includeDeprecated?: boolean } = {},\n): V[] {\n return vocab\n .filter(entry => includeDeprecated || !entry.deprecated)\n .map(entry => entry.value);\n}\n","// Closed vocabularies: fields whose values the .well schema fixes (no free\n// text, no `x-` extensions). Same shape as the open vocabularies — each entry\n// carries en/pt labels — so `getVocabLabel` works for both. The `*_VALUES`\n// lists are the bare values, derived from the entries.\nimport type {\n PermitAdministrativeStatus,\n ProductionEntry,\n ResultQualifier,\n ResultValidation,\n VolumeLimit,\n WaterQualityResult,\n WellStatus,\n} from '../types/well.types';\nimport type { VocabEntry } from './vocab';\nimport type { ParameterGroup } from './waterQuality.vocab';\n\n/**\n * Builds a closed vocabulary that must list every member of `T`: a missing\n * value is a compile error, so the list can never drift from the type.\n */\nfunction closedVocab<T extends string>() {\n return <const L extends readonly VocabEntry<T>[]>(\n entries: L &\n ([Exclude<T, L[number]['value']>] extends [never] ? unknown : never),\n ): readonly VocabEntry<T>[] => entries;\n}\n\nconst valuesOf = <T extends string>(vocab: readonly VocabEntry<T>[]) =>\n vocab.map(entry => entry.value) as readonly T[];\n\n/** `history_logs[].status` of `status_change` entries (since v2.3). */\nexport const WELL_STATUSES = closedVocab<WellStatus>()([\n { value: 'active', label: { en: 'Active', pt: 'Ativo' } },\n {\n value: 'maintenance',\n label: { en: 'Under maintenance', pt: 'Em manutenção' },\n },\n { value: 'inactive', label: { en: 'Inactive', pt: 'Paralisado' } },\n {\n value: 'decommissioned',\n label: { en: 'Decommissioned', pt: 'Desativado' },\n },\n { value: 'abandoned', label: { en: 'Abandoned', pt: 'Abandonado' } },\n]);\n\n/** Stored administrative `permits[].status` (since v2.3). */\nexport const PERMIT_ADMINISTRATIVE_STATUSES =\n closedVocab<PermitAdministrativeStatus>()([\n { value: 'requested', label: { en: 'Requested', pt: 'Requerida' } },\n { value: 'granted', label: { en: 'Granted', pt: 'Concedida' } },\n { value: 'suspended', label: { en: 'Suspended', pt: 'Suspensa' } },\n { value: 'revoked', label: { en: 'Revoked', pt: 'Revogada' } },\n { value: 'denied', label: { en: 'Denied', pt: 'Indeferida' } },\n { value: 'withdrawn', label: { en: 'Withdrawn', pt: 'Cancelada' } },\n ]);\n\n/** `permits[].volume_limits[].period` (since v2.3). */\nexport const VOLUME_LIMIT_PERIODS = closedVocab<VolumeLimit['period']>()([\n { value: 'daily', label: { en: 'Daily', pt: 'Diário' } },\n { value: 'monthly', label: { en: 'Monthly', pt: 'Mensal' } },\n { value: 'annual', label: { en: 'Annual', pt: 'Anual' } },\n]);\n\n/** `production[].type` (since v2.3). */\nexport const PRODUCTION_ENTRY_TYPES = closedVocab<ProductionEntry['type']>()([\n {\n value: 'meter_reading',\n label: { en: 'Meter reading', pt: 'Leitura de hidrômetro' },\n },\n {\n value: 'estimated_volume',\n label: { en: 'Estimated volume', pt: 'Volume estimado' },\n },\n]);\n\n/** Result `qualifier` (since v2.3). */\nexport const RESULT_QUALIFIERS = closedVocab<ResultQualifier>()([\n { value: '<', label: { en: '< less than', pt: '< menor que' } },\n { value: '>', label: { en: '> greater than', pt: '> maior que' } },\n { value: 'not_detected', label: { en: 'Not detected', pt: 'Não detectado' } },\n { value: 'estimated', label: { en: 'Estimated', pt: 'Estimado' } },\n]);\n\n/** Result `fraction` (since v2.3). */\nexport const RESULT_FRACTIONS = closedVocab<\n NonNullable<WaterQualityResult['fraction']>\n>()([\n { value: 'total', label: { en: 'Total', pt: 'Total' } },\n { value: 'dissolved', label: { en: 'Dissolved', pt: 'Dissolvida' } },\n { value: 'suspended', label: { en: 'Suspended', pt: 'Suspensa' } },\n]);\n\n/** Where a result was measured: `measured_in` and `filtration.location` (since v2.3). */\nexport const MEASUREMENT_LOCATIONS = closedVocab<\n NonNullable<WaterQualityResult['measured_in']>\n>()([\n { value: 'field', label: { en: 'Field', pt: 'Campo' } },\n { value: 'lab', label: { en: 'Lab', pt: 'Laboratório' } },\n]);\n\n/** Result `validation.status` (since v2.3). */\nexport const VALIDATION_STATUSES = closedVocab<ResultValidation['status']>()([\n { value: 'unvalidated', label: { en: 'Unvalidated', pt: 'Não validado' } },\n { value: 'validated', label: { en: 'Validated', pt: 'Validado' } },\n { value: 'qualified', label: { en: 'Qualified', pt: 'Qualificado' } },\n { value: 'rejected', label: { en: 'Rejected', pt: 'Rejeitado' } },\n]);\n\n/** Parameter vocabulary groups, in display order (since v2.3). */\nexport const PARAMETER_GROUPS = closedVocab<ParameterGroup>()([\n {\n value: 'physical',\n label: { en: 'Physical / field', pt: 'Físico / campo' },\n },\n { value: 'aggregate', label: { en: 'Aggregate', pt: 'Agregados' } },\n { value: 'major_ion', label: { en: 'Major ions', pt: 'Íons maiores' } },\n { value: 'nutrient', label: { en: 'Nutrients', pt: 'Nutrientes' } },\n { value: 'organic', label: { en: 'Organic', pt: 'Orgânicos' } },\n { value: 'disinfection', label: { en: 'Disinfection', pt: 'Desinfecção' } },\n {\n value: 'mining_redox',\n label: { en: 'Mining and redox', pt: 'Mineração e redox' },\n },\n { value: 'metal', label: { en: 'Metals / trace', pt: 'Metais / traço' } },\n { value: 'microbiology', label: { en: 'Microbiology', pt: 'Microbiologia' } },\n {\n value: 'radioactivity',\n label: { en: 'Radioactivity', pt: 'Radioatividade' },\n },\n]);\n\n// ─── Bare value lists ────────────────────────────────────────────────────────\n\nexport const WELL_STATUS_VALUES = valuesOf(WELL_STATUSES);\nexport const PERMIT_ADMINISTRATIVE_STATUS_VALUES = valuesOf(\n PERMIT_ADMINISTRATIVE_STATUSES,\n);\nexport const QUALIFIER_VALUES = valuesOf(RESULT_QUALIFIERS);\nexport const FRACTION_VALUES = valuesOf(RESULT_FRACTIONS);\nexport const MEASURED_IN_VALUES = valuesOf(MEASUREMENT_LOCATIONS);\nexport const FILTRATION_LOCATION_VALUES = valuesOf(MEASUREMENT_LOCATIONS);\nexport const VALIDATION_STATUS_VALUES = valuesOf(VALIDATION_STATUSES);\nexport const PARAMETER_GROUP_VALUES = valuesOf(PARAMETER_GROUPS);\n\n// ─── Value rules ─────────────────────────────────────────────────────────────\n\n/** Qualifiers that only go with a numeric `value`. */\nexport const NUMERIC_QUALIFIERS: readonly ResultQualifier[] = [\n '<',\n '>',\n 'estimated',\n];\n\n/** Sample types that point to an original sample with `parent_sample_id`. */\nexport const PARENT_SAMPLE_TYPES: readonly string[] = [\n 'field_duplicate',\n 'split_sample',\n];\n\n/** Blank (QA/QC) sample types. */\nexport const BLANK_SAMPLE_TYPES: readonly string[] = [\n 'field_blank',\n 'trip_blank',\n 'equipment_blank',\n];\n","import type { VocabEntry } from './vocab';\n\n/** Recommended `water_samples[].sample_type` values (since v2.3). */\nexport const SAMPLE_TYPES = [\n { value: 'routine', label: { en: 'Routine', pt: 'Rotina' } },\n {\n value: 'field_duplicate',\n label: { en: 'Field duplicate', pt: 'Duplicata de campo' },\n },\n {\n value: 'split_sample',\n label: { en: 'Split sample', pt: 'Amostra dividida (split)' },\n },\n { value: 'field_blank', label: { en: 'Field blank', pt: 'Branco de campo' } },\n {\n value: 'trip_blank',\n label: { en: 'Trip blank', pt: 'Branco de transporte' },\n },\n {\n value: 'equipment_blank',\n label: { en: 'Equipment blank', pt: 'Branco de equipamento' },\n },\n] as const satisfies readonly VocabEntry[];\n\nexport type SampleType = (typeof SAMPLE_TYPES)[number]['value'];\n\n/** Recommended `water_samples[].sampling_method` values (since v2.3). */\nexport const SAMPLING_METHODS = [\n {\n value: 'low_flow',\n label: { en: 'Low flow', pt: 'Purga de baixa vazão (micropurga)' },\n },\n {\n value: 'volumetric_purge',\n label: { en: 'Volumetric purge', pt: 'Purga de volume determinado' },\n },\n { value: 'no_purge', label: { en: 'No purge', pt: 'Amostragem sem purga' } },\n {\n value: 'pump_discharge',\n label: { en: 'Pump discharge', pt: 'Bomba de produção em operação' },\n },\n] as const satisfies readonly VocabEntry[];\n\nexport type SamplingMethod = (typeof SAMPLING_METHODS)[number]['value'];\n\n/** Recommended `water_samples[].sampling_point.type` values (since v2.3). */\nexport const SAMPLING_POINT_TYPES = [\n {\n value: 'pump_discharge',\n label: { en: 'Pump discharge', pt: 'Saída da bomba de produção' },\n },\n {\n value: 'wellhead_tap',\n label: { en: 'Wellhead tap', pt: 'Torneira do cavalete' },\n },\n { value: 'in_well', label: { en: 'In well', pt: 'Dentro do poço' } },\n] as const satisfies readonly VocabEntry[];\n\nexport type SamplingPointType = (typeof SAMPLING_POINT_TYPES)[number]['value'];\n\n/** Recommended `water_samples[].sampling_point.device` values (since v2.3). */\nexport const SAMPLING_DEVICES = [\n {\n value: 'bailer',\n label: { en: 'Bailer', pt: 'Bailer (amostrador de retenção)' },\n },\n {\n value: 'discrete_depth_sampler',\n label: {\n en: 'Discrete depth sampler',\n pt: 'Amostrador pontual de profundidade',\n },\n },\n {\n value: 'passive_diffusion_bag',\n label: { en: 'Passive diffusion bag', pt: 'Bolsa de difusão passiva' },\n },\n {\n value: 'grab_sleeve',\n label: {\n en: 'Grab sleeve (HydraSleeve)',\n pt: 'Amostrador passivo tipo luva (HydraSleeve)',\n },\n },\n {\n value: 'low_flow_pump',\n label: { en: 'Low-flow pump', pt: 'Bomba de baixa vazão' },\n },\n {\n value: 'packer_pump',\n label: { en: 'Packer pump', pt: 'Bomba com obturador (packer)' },\n },\n] as const satisfies readonly VocabEntry[];\n\nexport type SamplingDevice = (typeof SAMPLING_DEVICES)[number]['value'];\n","import type { FlowUnits, PowerUnits, VolumeUnits } from '../types/units.types';\n\n// ─── Constants ────────────────────────────────────────────────────────────────\n\nconst FEET_PER_METER = 3.280_839_895;\nconst METERS_PER_FOOT = 0.304_8; // exact (international foot)\nconst MM_PER_INCH = 25.4; // exact\nconst M3H_TO_LS = 1 / 3.6;\nconst M3H_TO_USGPM = 4.402_867_361;\nconst M2S_TO_M2D = 86_400;\nconst PSI_PER_KPA = 0.145_037_738;\nconst SLOT_MM = 0.025_4; // 1 slot = 0.001 in = 0.0254 mm\nconst KW_PER_CV = 0.735_498_75; // exact (metric horsepower, cavalo-vapor)\nconst KW_PER_HP = 0.745_699_872; // mechanical horsepower\nconst LITERS_PER_M3 = 1_000;\nconst FT3_PER_M3 = 35.314_666_721; // 1 ft = 0.3048 m exact\nconst USGAL_PER_M3 = 264.172_052_358; // 1 US gal = 3.785411784 L exact\n\n// ─── Types ────────────────────────────────────────────────────────────────────\n\nexport type DmsCoordinate = {\n degrees: number;\n minutes: number;\n seconds: number;\n /** 'N' | 'S' for latitude axes; 'E' | 'W' for longitude axes */\n direction: 'N' | 'S' | 'E' | 'W';\n};\n\n// ─── Length ───────────────────────────────────────────────────────────────────\n\nexport function metersToFeet(m: number): number {\n return m * FEET_PER_METER;\n}\n\nexport function feetToMeters(ft: number): number {\n return ft * METERS_PER_FOOT;\n}\n\n// ─── Diameter ─────────────────────────────────────────────────────────────────\n\nexport function mmToInches(mm: number): number {\n return mm / MM_PER_INCH;\n}\n\nexport function inchesToMm(inches: number): number {\n return inches * MM_PER_INCH;\n}\n\n// ─── Flow Rate ────────────────────────────────────────────────────────────────\n\nexport function cubicMeterPerHourToLitersPerSecond(q: number): number {\n return q * M3H_TO_LS;\n}\n\nexport function litersPerSecondToCubicMeterPerHour(q: number): number {\n return q / M3H_TO_LS;\n}\n\nexport function cubicMeterPerHourToUsGallonsPerMinute(q: number): number {\n return q * M3H_TO_USGPM;\n}\n\nexport function usGallonsPerMinuteToCubicMeterPerHour(q: number): number {\n return q / M3H_TO_USGPM;\n}\n\n// ─── Volume ───────────────────────────────────────────────────────────────────\n\nexport function litersToCubicMeters(l: number): number {\n return l / LITERS_PER_M3;\n}\n\nexport function cubicMetersToLiters(m3: number): number {\n return m3 * LITERS_PER_M3;\n}\n\nexport function cubicMetersToCubicFeet(m3: number): number {\n return m3 * FT3_PER_M3;\n}\n\nexport function cubicFeetToCubicMeters(ft3: number): number {\n return ft3 / FT3_PER_M3;\n}\n\nexport function cubicMetersToUsGallons(m3: number): number {\n return m3 * USGAL_PER_M3;\n}\n\nexport function usGallonsToCubicMeters(gal: number): number {\n return gal / USGAL_PER_M3;\n}\n\n// ─── Power ────────────────────────────────────────────────────────────────────\n\n/** Metric horsepower (cv, cavalo-vapor) to kilowatts. */\nexport function cvToKilowatts(cv: number): number {\n return cv * KW_PER_CV;\n}\n\nexport function kilowattsToCv(kw: number): number {\n return kw / KW_PER_CV;\n}\n\n/** Mechanical horsepower (hp) to kilowatts. */\nexport function hpToKilowatts(hp: number): number {\n return hp * KW_PER_HP;\n}\n\nexport function kilowattsToHp(kw: number): number {\n return kw / KW_PER_HP;\n}\n\n// ─── Display-unit dispatch ────────────────────────────────────────────────────\n\n/** Converts a canonical flow (m³/h) to `unit`. */\nexport function flowFromCanonical(m3h: number, unit: FlowUnits): number {\n if (unit === 'L/s') return cubicMeterPerHourToLitersPerSecond(m3h);\n if (unit === 'gpm') return cubicMeterPerHourToUsGallonsPerMinute(m3h);\n return m3h;\n}\n\n/** Converts a flow expressed in `unit` back to canonical m³/h. */\nexport function flowToCanonical(value: number, unit: FlowUnits): number {\n if (unit === 'L/s') return litersPerSecondToCubicMeterPerHour(value);\n if (unit === 'gpm') return usGallonsPerMinuteToCubicMeterPerHour(value);\n return value;\n}\n\n/** Converts a canonical power (kW) to `unit`. */\nexport function powerFromCanonical(kw: number, unit: PowerUnits): number {\n if (unit === 'cv') return kilowattsToCv(kw);\n if (unit === 'hp') return kilowattsToHp(kw);\n return kw;\n}\n\n/** Converts a power expressed in `unit` back to canonical kW. */\nexport function powerToCanonical(value: number, unit: PowerUnits): number {\n if (unit === 'cv') return cvToKilowatts(value);\n if (unit === 'hp') return hpToKilowatts(value);\n return value;\n}\n\n/** Converts a canonical volume (m³) to `unit`. */\nexport function volumeFromCanonical(m3: number, unit: VolumeUnits): number {\n if (unit === 'L') return cubicMetersToLiters(m3);\n if (unit === 'ft3') return cubicMetersToCubicFeet(m3);\n if (unit === 'gal') return cubicMetersToUsGallons(m3);\n return m3;\n}\n\n/** Converts a volume expressed in `unit` back to canonical m³. */\nexport function volumeToCanonical(value: number, unit: VolumeUnits): number {\n if (unit === 'L') return litersToCubicMeters(value);\n if (unit === 'ft3') return cubicFeetToCubicMeters(value);\n if (unit === 'gal') return usGallonsToCubicMeters(value);\n return value;\n}\n\n// ─── Transmissivity ───────────────────────────────────────────────────────────\n\nexport function squareMeterPerSecondToSquareMeterPerDay(t: number): number {\n return t * M2S_TO_M2D;\n}\n\nexport function squareMeterPerDayToSquareMeterPerSecond(t: number): number {\n return t / M2S_TO_M2D;\n}\n\n// ─── Coordinates ──────────────────────────────────────────────────────────────\n\n/**\n * Converts decimal degrees to DMS.\n * @param degrees - Signed decimal degrees (negative = S for lat, W for lng).\n * @param axis - 'lat' produces N/S; 'lng' produces E/W. Defaults to 'lat'.\n */\nexport function decimalDegreesToDms(\n degrees: number,\n axis: 'lat' | 'lng' = 'lat',\n): DmsCoordinate {\n const abs = Math.abs(degrees);\n const d = Math.floor(abs);\n const minFloat = (abs - d) * 60;\n const m = Math.floor(minFloat);\n const s = (minFloat - m) * 60;\n const direction =\n axis === 'lat' ? (degrees >= 0 ? 'N' : 'S') : degrees >= 0 ? 'E' : 'W';\n return { degrees: d, minutes: m, seconds: s, direction };\n}\n\n/** Converts DMS back to signed decimal degrees. */\nexport function dmsToDecimalDegrees(dms: DmsCoordinate): number {\n const abs = dms.degrees + dms.minutes / 60 + dms.seconds / 3600;\n return dms.direction === 'S' || dms.direction === 'W' ? -abs : abs;\n}\n\n// ─── Screen Slot ──────────────────────────────────────────────────────────────\n\n/** Converts a US slot number to millimeters (1 slot = 0.001 in = 0.0254 mm). */\nexport function slotNumberToMm(slotNumber: number): number {\n return slotNumber * SLOT_MM;\n}\n\n/** Converts millimeters to the nearest US slot number. */\nexport function mmToSlotNumber(mm: number): number {\n return Math.round(mm / SLOT_MM);\n}\n\n// ─── Pressure ─────────────────────────────────────────────────────────────────\n\nexport function kilopascalToPsi(kPa: number): number {\n return kPa * PSI_PER_KPA;\n}\n\nexport function psiToKilopascal(psi: number): number {\n return psi / PSI_PER_KPA;\n}\n\n// ─── Time ─────────────────────────────────────────────────────────────────────\n\nexport function minutesToHours(min: number): number {\n return min / 60;\n}\n\nexport function hoursToMinutes(h: number): number {\n return h * 60;\n}\n\n// ─── Water quality (since v2.3) ───────────────────────────────────────────────\n\n/** Concentration units accepted by {@link concentrationToCanonical}. */\nexport type ConcentrationUnits = 'mg/L' | 'ug/L' | 'ng/L' | 'g/L';\n\nconst MG_L_PER_UNIT: Record<ConcentrationUnits, number> = {\n 'g/L': 1_000,\n 'mg/L': 1,\n 'ug/L': 0.001,\n 'ng/L': 0.000_001,\n};\n\n/** Converts a mass concentration to the canonical mg/L. */\nexport function concentrationToCanonical(\n value: number,\n unit: ConcentrationUnits,\n): number {\n return value * MG_L_PER_UNIT[unit];\n}\n\n/** Converts a canonical mg/L concentration to `unit`. */\nexport function concentrationFromCanonical(\n mgL: number,\n unit: ConcentrationUnits,\n): number {\n return mgL / MG_L_PER_UNIT[unit];\n}\n\n/** Converts conductivity in mS/m to the canonical µS/cm (×10). */\nexport function milliSiemensPerMeterToMicroSiemensPerCm(mSm: number): number {\n return mSm * 10;\n}\n\n/** Converts conductivity in mS/cm to the canonical µS/cm (×1000). */\nexport function milliSiemensPerCmToMicroSiemensPerCm(mScm: number): number {\n return mScm * 1_000;\n}\n\n/**\n * Normalizes a regional color unit name to the canonical Hazen unit (`uH`).\n * mg Pt-Co/L, PCU, TCU and Hazen are numerically equal. Returns `undefined`\n * for unrecognized names.\n */\nexport function normalizeColorUnit(unit: string): 'uH' | undefined {\n const u = unit.trim().toLowerCase().replace(/\\s+/g, '');\n return ['uh', 'hazen', 'mgpt-co/l', 'mgpt/l', 'pt-co', 'pcu', 'tcu'].includes(\n u,\n )\n ? 'uH'\n : undefined;\n}\n\n/**\n * Maps a reported turbidity unit name to the `welldot` turbidity code.\n * uT and FTU (formazin, method unidentified) map to the generic `turbidity`.\n * Returns `undefined` for unrecognized names.\n */\nexport function turbidityCodeForUnit(\n unit: string,\n):\n | 'turbidity'\n | 'turbidity_ntu'\n | 'turbidity_fnu'\n | 'turbidity_fau'\n | undefined {\n switch (unit.trim().toUpperCase()) {\n case 'NTU':\n return 'turbidity_ntu';\n case 'FNU':\n return 'turbidity_fnu';\n case 'FAU':\n return 'turbidity_fau';\n case 'FTU':\n case 'UT':\n return 'turbidity';\n default:\n return undefined;\n }\n}\n\n/**\n * Converts an expanded uncertainty (as reported by labs, usually k = 2) to\n * the one-sigma `value_precision` stored in `.well` files.\n */\nexport function expandedToStandardUncertainty(\n expanded: number,\n coverageFactor = 2,\n): number {\n return expanded / coverageFactor;\n}\n"],"mappings":"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AO,2BAA2B,SAAS,KAAK;AAAA,EAC7D,EAAE,MAAM,KAAK,OAAO,2BAA2B,SAAS,KAAK;AAAA,EAC7D,EAAE,MAAM,KAAK,OAAO,2BAA2B,SAAS,KAAK;AAAA,EAC7D,EAAE,MAAM,KAAK,OAAO,2BAA2B,SAAS,KAAK;AAAA,EAC7D,EAAE,MAAM,KAAK,OAAO,2BAA2B,SAAS,KAAK;AAAA,EAC7D,EAAE,MAAM,KAAK,OAAO,2BAA2B,SAAS,KAAK;AAAA,EAC7D,EAAE,MAAM,KAAK,OAAO,2BAA2B,SAAS,KAAK;AAAA,EAC7D,EAAE,MAAM,KAAK,OAAO,2BAA2B,SAAS,KAAK;AAAA,EAC7D,EAAE,MAAM,KAAK,OAAO,2BAA2B,SAAS,KAAK;AAAA,EAC7D,EAAE,MAAM,KAAK,OAAO,2BAA2B,SAAS,KAAK;AAAA,EAC7D,EAAE,MAAM,KAAK,OAAO,2BAA2B,SAAS,KAAK;AAAA,EAC7D,EAAE,MAAM,KAAK,OAAO,2BAA2B,SAAS,KAAK;AAAA,EAC7D,EAAE,MAAM,KAAK,OAAO,2BAA2B,SAAS,KAAK;AAAA,EAC7D,EAAE,MAAM,KAAK,OAAO,2BAA2B,SAAS,KAAK;AAAA,EAC7D,EAAE,MAAM,KAAK,OAAO,2BAA2B,SAAS,KAAK;AAAA,EAC7D,EAAE,MAAM,KAAK,OAAO,2BAA2B,SAAS,KAAK;AAAA,EAC7D,EAAE,MAAM,KAAK,OAAO,2BAA2B,SAAS,KAAK;AAAA,EAC7D,EAAE,MAAM,KAAK,OAAO,2BAA2B,SAAS,KAAK;AAAA,EAC7D,EAAE,MAAM,KAAK,OAAO,2BAA2B,SAAS,KAAK;AAAA,EAC7D,EAAE,MAAM,KAAK,OAAO,2BAA2B,SAAS,KAAK;AAAA,EAC7D,EAAE,MAAM,KAAK,OAAO,2BAA2B,SAAS,KAAK;AAAA,EAC7D,EAAE,MAAM,KAAK,OAAO,2BAA2B,SAAS,KAAK;AAAA,EAC7D,EAAE,MAAM,KAAK,OAAO,2BAA2B,SAAS,KAAK;AAAA,EAC7D,EAAE,MAAM,KAAK,OAAO,2BAA2B,SAAS,KAAK;AAAA,EAC7D,EAAE,MAAM,KAAK,OAAO,2BAA2B,SAAS,KAAK;AAAA,EAC7D,EAAE,MAAM,KAAK,OA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","names":[]}
1
+ {"version":3,"sources":["../src/index.ts","../src/validators/well.validators.ts","../src/utils/timezone.utils.ts","../src/utils/version.utils.ts","../src/vocab/closed.vocab.ts","../src/vocab/hydrodynamic.vocab.ts","../src/utils/well.utils.ts","../src/utils/fgdc.textures.ts","../src/vocab/waterQuality.limits.ts","../src/utils/language.utils.ts","../src/vocab/waterQuality.vocab.ts","../src/vocab/attachment.vocab.ts","../src/vocab/construction.vocab.ts","../src/vocab/general.vocab.ts","../src/vocab/history.vocab.ts","../src/vocab/operation.vocab.ts","../src/vocab/permit.vocab.ts","../src/vocab/vocab.ts","../src/vocab/waterSample.vocab.ts","../src/utils/units.ts"],"sourcesContent":["// Types\nexport type {\n AirliftEvent,\n AquiferAnalysis,\n Attachment,\n BarometricCompensation,\n BoreHole,\n Cave,\n CementPad,\n Centralizer,\n ConditionFulfillment,\n ConstantRateEvent,\n Constructive,\n EstimatedVolume,\n Filtration,\n Fracture,\n Geologic,\n HistoryLogEntry,\n HoleFill,\n HydrodynamicEvent,\n HydrodynamicEventBase,\n Laboratory,\n LevelReading,\n Lithology,\n Location,\n LocationProperties,\n LoggerReading,\n LoggerSeriesEvent,\n Meter,\n MeterReading,\n MonthlyGrant,\n OperatingRegime,\n Parameter,\n Permit,\n PermitAdministrativeStatus,\n PermitCondition,\n PermitHistoryEntry,\n ProductionEntry,\n ProductionEntryBase,\n PumpElectrical,\n PumpInstallation,\n PumpingStep,\n Purge,\n PurgeReading,\n ReadingAggregation,\n RecoveryOnlyEvent,\n RecoveryPhase,\n Reduction,\n ResultQualifier,\n ResultValidation,\n SamplingPoint,\n SectionKey,\n SectionVisibility,\n SpotMeasurementEvent,\n StepDrawdownEvent,\n SurfaceCase,\n Texture,\n TimeResolution,\n VisibilityFieldKey,\n VisibilityKey,\n VolumeLimit,\n WaterQualityResult,\n WaterSample,\n Well,\n WellCase,\n WellId,\n WellScreen,\n WellStatus,\n WellVisibility,\n} from './types/well.types';\n\nexport type {\n DiameterUnits,\n FlowUnits,\n LengthUnits,\n PowerUnits,\n Units,\n UnitsTypes,\n VolumeUnits,\n} from './types/units.types';\n\n// Validators\nexport {\n AirliftEventSchema,\n AquiferAnalysisSchema,\n AttachmentSchema,\n BoreHoleSchema,\n CaveSchema,\n CementPadSchema,\n CentralizerSchema,\n ConditionFulfillmentSchema,\n ConstantRateEventSchema,\n EstimatedVolumeSchema,\n FiltrationSchema,\n FractureSchema,\n HistoryLogEntrySchema,\n HoleFillSchema,\n HydrodynamicEventBaseSchema,\n HydrodynamicEventSchema,\n LaboratorySchema,\n LevelReadingSchema,\n LithologySchema,\n LocationPropertiesSchema,\n LocationSchema,\n LoggerReadingSchema,\n LoggerSeriesEventSchema,\n MeterReadingSchema,\n MeterSchema,\n MonthlyGrantSchema,\n OperatingRegimeSchema,\n ParameterSchema,\n PermitAdministrativeStatusSchema,\n PermitConditionSchema,\n PermitHistoryEntrySchema,\n PermitSchema,\n ProductionEntryBaseSchema,\n ProductionEntrySchema,\n PumpElectricalSchema,\n PumpInstallationSchema,\n PumpingStepSchema,\n PurgeReadingSchema,\n PurgeSchema,\n RecoveryOnlyEventSchema,\n RecoveryPhaseSchema,\n ReductionSchema,\n ResultQualifierSchema,\n ResultValidationSchema,\n SamplingPointSchema,\n SpotMeasurementEventSchema,\n StepDrawdownEventSchema,\n SurfaceCaseSchema,\n TextureSchema,\n TimeResolutionSchema,\n VolumeLimitSchema,\n WaterQualityResultSchema,\n WaterSampleSchema,\n WellCaseSchema,\n WellIdSchema,\n WellSchema,\n WellScreenSchema,\n WellStatusSchema,\n parseWell,\n} from './validators/well.validators';\n\n// Format utilities (serialise/deserialise .well format only)\nexport { isIanaTimeZone } from './utils/timezone.utils';\nexport {\n WELL_FORMAT_VERSION,\n compareFormatVersions,\n parseFormatVersion,\n} from './utils/version.utils';\nexport type { FormatVersion } from './utils/version.utils';\nexport {\n SECTION_KEYS,\n VISIBILITY_LEAF_KEYS,\n VISIBILITY_TREE,\n calculatedWellDepth,\n checkIfProfileIsEmpty,\n convertProfileFromJSON,\n deserializeWell,\n hasWellData,\n isWellEmpty,\n profileToWell,\n redactWell,\n serializeWell,\n} from './utils/well.utils';\n\nexport type { TextureCode, TextureOption } from './types/textures';\nexport { FGDC_TEXTURES_OPTIONS } from './utils/fgdc.textures';\n\n// Water quality vocabulary and limit sets (since v2.3)\nexport {\n BR_GM_MS_888_2021,\n EU_2020_2184,\n NEPHELOMETRIC_TURBIDITY_CODES,\n WATER_QUALITY_LIMIT_SETS,\n WHO_GDWQ_2022,\n getLimitSet,\n} from './vocab/waterQuality.limits';\nexport type { Limit, LimitBasis, LimitSet } from './vocab/waterQuality.limits';\nexport {\n WATER_QUALITY_PARAMETERS,\n WATER_QUALITY_UNITS,\n WATER_QUALITY_VOCABULARY_VERSION,\n getParameterDefinition,\n getParameterLabel,\n isKnownParameter,\n parameterKey,\n} from './vocab/waterQuality.vocab';\nexport type {\n ParameterDefinition,\n ParameterForm,\n ParameterGroup,\n ParameterUnit,\n} from './vocab/waterQuality.vocab';\n\n// Localized text (BCP 47-keyed labels)\nexport type { LanguageText, LanguageTextInput } from './types/language.types';\nexport { resolveLanguageText } from './utils/language.utils';\n\n// Recommended vocabularies of open (free-text) fields, with en/pt labels\nexport {\n DOCUMENT_TYPES,\n DOCUMENT_TYPE_SUGGESTIONS,\n} from './vocab/attachment.vocab';\nexport type {\n AttachmentDocumentType,\n DocumentTypeContext,\n} from './vocab/attachment.vocab';\nexport {\n CEMENT_PAD_TYPES,\n CENTRALIZER_TYPES,\n CONSTRUCTION_MATERIALS,\n DRILLING_METHODS,\n SCREEN_SLOT_TYPES,\n} from './vocab/construction.vocab';\nexport type {\n CementPadType,\n CentralizerType,\n ConstructionMaterial,\n DrillingMethod,\n ScreenSlotType,\n} from './vocab/construction.vocab';\nexport { WELL_PURPOSES, WELL_TYPES } from './vocab/general.vocab';\nexport type { WellPurpose, WellType } from './vocab/general.vocab';\nexport {\n HISTORY_LOG_CATEGORIES,\n HISTORY_LOG_SEVERITIES,\n} from './vocab/history.vocab';\nexport type {\n HistoryLogCategory,\n HistoryLogSeverity,\n} from './vocab/history.vocab';\nexport {\n AQUIFER_ANALYSIS_METHODS,\n HYDRODYNAMIC_EVENT_TYPES,\n MEASUREMENT_METHODS,\n} from './vocab/hydrodynamic.vocab';\nexport type {\n AquiferAnalysisMethod,\n MeasurementMethod,\n} from './vocab/hydrodynamic.vocab';\nexport {\n ESTIMATION_METHODS,\n MAINTENANCE_TYPES,\n METER_TYPES,\n POWER_SOURCES,\n PUMP_TYPES,\n READING_SOURCES,\n} from './vocab/operation.vocab';\nexport type {\n EstimationMethod,\n MaintenanceType,\n MeterType,\n PowerSource,\n PumpType,\n ReadingSource,\n} from './vocab/operation.vocab';\nexport {\n CONDITION_CATEGORIES,\n PERMIT_HISTORY_TYPES,\n PERMIT_TYPES,\n WATER_USES,\n} from './vocab/permit.vocab';\nexport type {\n ConditionCategory,\n PermitHistoryType,\n PermitType,\n WaterUse,\n} from './vocab/permit.vocab';\nexport {\n formatVocabList,\n getVocabEntry,\n getVocabLabel,\n isVocabValue,\n vocabValues,\n} from './vocab/vocab';\nexport type { OpenVocab, VocabEntry } from './vocab/vocab';\n\n// Closed vocabularies: schema-fixed values with en/pt labels (since v2.3)\nexport {\n BAROMETRIC_COMPENSATIONS,\n BAROMETRIC_COMPENSATION_VALUES,\n BLANK_SAMPLE_TYPES,\n FILTRATION_LOCATION_VALUES,\n FRACTION_VALUES,\n MEASURED_IN_VALUES,\n MEASUREMENT_LOCATIONS,\n NUMERIC_QUALIFIERS,\n PARAMETER_GROUPS,\n PARAMETER_GROUP_VALUES,\n PARENT_SAMPLE_TYPES,\n PERMIT_ADMINISTRATIVE_STATUSES,\n PERMIT_ADMINISTRATIVE_STATUS_VALUES,\n PRODUCTION_ENTRY_TYPES,\n QUALIFIER_VALUES,\n READING_AGGREGATIONS,\n READING_AGGREGATION_VALUES,\n RESULT_FRACTIONS,\n RESULT_QUALIFIERS,\n VALIDATION_STATUSES,\n VALIDATION_STATUS_VALUES,\n VOLUME_LIMIT_PERIODS,\n WELL_STATUSES,\n WELL_STATUS_VALUES,\n} from './vocab/closed.vocab';\nexport {\n SAMPLE_TYPES,\n SAMPLING_DEVICES,\n SAMPLING_METHODS,\n SAMPLING_POINT_TYPES,\n} from './vocab/waterSample.vocab';\nexport type {\n SampleType,\n SamplingDevice,\n SamplingMethod,\n SamplingPointType,\n} from './vocab/waterSample.vocab';\n\n// Backward-compat alias for app migration\nexport type { Well as Profile } from './types/well.types';\n\n// Units conversion utilities\nexport {\n concentrationFromCanonical,\n concentrationToCanonical,\n cubicFeetToCubicMeters,\n cubicMeterPerHourToLitersPerSecond,\n cubicMeterPerHourToUsGallonsPerMinute,\n cubicMetersToCubicFeet,\n cubicMetersToLiters,\n cubicMetersToUsGallons,\n cvToKilowatts,\n decimalDegreesToDms,\n dmsToDecimalDegrees,\n expandedToStandardUncertainty,\n feetToMeters,\n flowFromCanonical,\n flowToCanonical,\n hoursToMinutes,\n hpToKilowatts,\n inchesToMm,\n kilopascalToPsi,\n kilowattsToCv,\n kilowattsToHp,\n litersPerSecondToCubicMeterPerHour,\n litersToCubicMeters,\n metersToFeet,\n milliSiemensPerCmToMicroSiemensPerCm,\n milliSiemensPerMeterToMicroSiemensPerCm,\n minutesToHours,\n mmToInches,\n mmToSlotNumber,\n normalizeColorUnit,\n powerFromCanonical,\n powerToCanonical,\n psiToKilopascal,\n slotNumberToMm,\n squareMeterPerDayToSquareMeterPerSecond,\n squareMeterPerSecondToSquareMeterPerDay,\n turbidityCodeForUnit,\n usGallonsPerMinuteToCubicMeterPerHour,\n usGallonsToCubicMeters,\n volumeFromCanonical,\n volumeToCanonical,\n} from './utils/units';\nexport type { ConcentrationUnits, DmsCoordinate } from './utils/units';\n","import { createDefu } from 'defu';\nimport { z } from 'zod';\nimport type { Well } from '../types/well.types';\nimport { isIanaTimeZone } from '../utils/timezone.utils';\nimport { parseFormatVersion } from '../utils/version.utils';\nimport {\n BAROMETRIC_COMPENSATION_VALUES,\n READING_AGGREGATION_VALUES,\n} from '../vocab/closed.vocab';\nimport { HYDRODYNAMIC_EVENT_TYPES } from '../vocab/hydrodynamic.vocab';\n\n// ─── defu custom merger ───────────────────────────────────────────────────────\n// In createDefu callbacks: obj = defaults object, key = key, value = source value.\n// When source has an array, assign it back to obj[key] so defu uses it as-is\n// (prevents defu's default array-concatenation behavior).\nexport const mergeWell = createDefu((obj, key, value) => {\n if (Array.isArray(value)) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (obj as any)[key] = value;\n return true;\n }\n});\n\nconst isPlainObject = (v: unknown): v is Record<string, unknown> =>\n typeof v === 'object' && v !== null && !Array.isArray(v);\n\n// parseWell: Zod strips unknown members (`x-` fields) from nested objects.\n// This merger puts them back from the raw document. The schema never reorders\n// or drops array items, so items are merged by index; an array whose length\n// differs from the raw one is taken as parsed.\nconst mergeParsed = createDefu((obj, key, value) => {\n if (Array.isArray(value)) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const raw = (obj as any)[key];\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (obj as any)[key] =\n Array.isArray(raw) && raw.length === value.length\n ? value.map((item: unknown, i: number) =>\n isPlainObject(item) && isPlainObject(raw[i])\n ? mergeParsed(item, raw[i])\n : item,\n )\n : value;\n return true;\n }\n});\n\n// ─── Datetime helper ──────────────────────────────────────────────────────────\nconst RFC3339_WITH_OFFSET =\n /^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?(Z|[+-]\\d{2}:\\d{2})$/;\nconst rfc3339 = () =>\n z\n .string()\n .regex(RFC3339_WITH_OFFSET, 'datetime must be RFC 3339 with UTC offset');\n\n// Calendar date (YYYY-MM-DD): the local civil date at the well site.\nconst CALENDAR_DATE = /^\\d{4}-\\d{2}-\\d{2}$/;\nconst calendarDate = () =>\n z.string().regex(CALENDAR_DATE, 'date must be YYYY-MM-DD');\n\n// ISO 8601 duration restricted to date components (`PnYnMnWnD`); time\n// components (`T…`) are malformed.\nconst DATE_DURATION = /^P(?=\\d)(\\d+Y)?(\\d+M)?(\\d+W)?(\\d+D)?$/;\nconst dateDuration = () =>\n z.string().regex(DATE_DURATION, 'duration must be an ISO 8601 date duration');\n\n// ─── Common schemas ───────────────────────────────────────────────────────────\n\nexport const AttachmentSchema = z.object({\n id: z.string(),\n uri: z.string().url(),\n media_type: z.string(),\n document_type: z.string().optional(),\n filename: z.string().optional(),\n description: z.string().optional(),\n sha256: z.string().optional(),\n});\n\n// ─── Location schemas ─────────────────────────────────────────────────────────\n\nexport const WellIdSchema = z.object({\n authority: z.string(),\n id: z.string(),\n primary: z.boolean().optional(),\n});\n\nexport const LocationPropertiesSchema = z.object({\n elevation_datum: z.string().optional(),\n crs: z.string().optional(),\n lat_precision: z.number().optional(),\n lng_precision: z.number().optional(),\n elevation_precision: z.number().optional(),\n original_crs: z.string().optional(),\n timezone: z\n .string()\n .refine(isIanaTimeZone, 'timezone must be an IANA time zone name')\n .optional(),\n});\n\nexport const LocationSchema = z.object({\n lat: z.number(),\n lng: z.number(),\n elevation: z.number().optional(),\n properties: LocationPropertiesSchema.optional(),\n});\n\n// ─── Constructive schemas ─────────────────────────────────────────────────────\n\nexport const BoreHoleSchema = z.object({\n from: z.number(),\n to: z.number(),\n diameter: z.number(),\n drilling_method: z.string().optional(),\n});\n\nexport const WellCaseSchema = z.object({\n from: z.number(),\n to: z.number(),\n type: z.string(),\n diameter: z.number(),\n});\n\nexport const ReductionSchema = z.object({\n from: z.number(),\n to: z.number(),\n diam_from: z.number(),\n diam_to: z.number(),\n type: z.string(),\n});\n\nexport const WellScreenSchema = z.object({\n from: z.number(),\n to: z.number(),\n type: z.string(),\n diameter: z.number(),\n screen_slot: z.number(),\n slot_type: z.string().optional(),\n});\n\nexport const HoleFillSchema = z.object({\n from: z.number(),\n to: z.number(),\n type: z.enum(['gravel_pack', 'seal']),\n diameter: z.number(),\n description: z.string(),\n});\n\nexport const SurfaceCaseSchema = z.object({\n from: z.number(),\n to: z.number(),\n diameter: z.number(),\n});\n\nexport const CentralizerSchema = z.object({\n from: z.number(),\n to: z.number(),\n spacing: z.number().positive().optional(),\n type: z.string(),\n diameter: z.number().optional(),\n description: z.string().optional(),\n});\n\nexport const CementPadSchema = z.object({\n type: z.string(),\n width: z.number(),\n thickness: z.number(),\n length: z.number(),\n});\n\n// ─── Geologic schemas ─────────────────────────────────────────────────────────\n\nexport const TextureSchema = z.object({\n code: z.union([z.string(), z.number()]),\n vocabulary: z.string().optional(),\n});\n\nexport const LithologySchema = z.object({\n from: z.number(),\n to: z.number(),\n description: z.string(),\n color: z.string(),\n texture: TextureSchema,\n geologic_unit: z.string(),\n aquifer_unit: z.string(),\n});\n\nexport const FractureSchema = z.object({\n depth: z.number(),\n water_intake: z.boolean(),\n description: z.string(),\n swarm: z.boolean(),\n azimuth: z.number(),\n dip: z.number(),\n depth_precision: z.number().optional(),\n});\n\nexport const CaveSchema = z.object({\n from: z.number(),\n to: z.number(),\n water_intake: z.boolean(),\n description: z.string(),\n});\n\n// ─── Hydrodynamic event schemas ───────────────────────────────────────────────\n\nexport const LevelReadingSchema = z.object({\n elapsed: z.number(),\n datetime: rfc3339().optional(),\n depth: z.number(),\n depth_precision: z.number().optional(),\n pressure: z.number().optional(),\n});\n\nexport const RecoveryPhaseSchema = z.object({\n readings: z.array(LevelReadingSchema),\n});\n\nexport const PumpingStepSchema = z.object({\n rate: z.number(),\n rate_precision: z.number().optional(),\n duration: z.number().optional(),\n readings: z.array(LevelReadingSchema).optional(),\n});\n\nexport const HydrodynamicEventBaseSchema = z.object({\n id: z.string(),\n type: z.string(),\n datetime: rfc3339(),\n sequence: z.number().int().optional(),\n operator: z.string().optional(),\n equipment: z.string().optional(),\n notes: z.string().optional(),\n corrects: z.string().optional(),\n attachments: z.array(AttachmentSchema).optional(),\n});\n\nexport const SpotMeasurementEventSchema = HydrodynamicEventBaseSchema.extend({\n type: z.literal('spot_measurement'),\n static_level: z.number(),\n static_level_precision: z.number().optional(),\n measurement_method: z.string().optional(),\n // SHOULD carry at most one step; another count is valid (v2.4).\n steps: z.array(PumpingStepSchema).optional(),\n recovery: RecoveryPhaseSchema.optional(),\n});\n\nexport const ConstantRateEventSchema = HydrodynamicEventBaseSchema.extend({\n type: z.literal('constant_rate'),\n static_level: z.number().optional(),\n static_level_precision: z.number().optional(),\n // SHOULD carry exactly one step; another count is valid (v2.4).\n steps: z.array(PumpingStepSchema).optional(),\n recovery: RecoveryPhaseSchema.optional(),\n});\n\nexport const StepDrawdownEventSchema = HydrodynamicEventBaseSchema.extend({\n type: z.literal('step_drawdown'),\n static_level: z.number().optional(),\n static_level_precision: z.number().optional(),\n steps: z.array(PumpingStepSchema),\n recovery: RecoveryPhaseSchema.optional(),\n});\n\nexport const AirliftEventSchema = HydrodynamicEventBaseSchema.extend({\n type: z.literal('airlift'),\n steps: z.array(PumpingStepSchema),\n recovery: RecoveryPhaseSchema.optional(),\n});\n\nexport const RecoveryOnlyEventSchema = HydrodynamicEventBaseSchema.extend({\n type: z.literal('recovery_only'),\n pumping_rate: z.number().optional(),\n pumping_duration: z.number().optional(),\n recovery: RecoveryPhaseSchema,\n});\n\n// A logger reading is located by its instant, never by `elapsed` (v2.4).\nexport const LoggerReadingSchema = z.object({\n datetime: rfc3339(),\n elapsed: z\n .undefined({ message: 'logger_series readings use datetime, not elapsed' })\n .optional(),\n depth: z.number(),\n depth_precision: z.number().optional(),\n pressure: z.number().optional(),\n depth_min: z.number().optional(),\n depth_max: z.number().optional(),\n});\n\nconst closedEnum = <T extends string>(values: readonly T[]) =>\n z.enum(values as [T, ...T[]]);\n\nexport const LoggerSeriesEventSchema = HydrodynamicEventBaseSchema.extend({\n type: z.literal('logger_series'),\n measurement_method: z.string().optional(),\n sensor_depth: z.number().optional(),\n interval: z.number().positive().optional(),\n barometric_compensation: closedEnum(\n BAROMETRIC_COMPENSATION_VALUES,\n ).optional(),\n aggregation: closedEnum(READING_AGGREGATION_VALUES).optional(),\n readings: z.array(LoggerReadingSchema).min(1),\n steps: z.undefined({ message: 'logger_series carries no steps' }).optional(),\n recovery: z\n .undefined({ message: 'logger_series carries no recovery' })\n .optional(),\n});\n\nconst HYDRODYNAMIC_TYPES: readonly string[] = HYDRODYNAMIC_EVENT_TYPES.map(\n t => t.value,\n);\n\n// Unknown (`x-`) event types fall back to the base schema with passthrough;\n// known types must satisfy their own schema (v2.4).\nexport const HydrodynamicEventSchema = z\n .discriminatedUnion('type', [\n SpotMeasurementEventSchema,\n ConstantRateEventSchema,\n StepDrawdownEventSchema,\n AirliftEventSchema,\n RecoveryOnlyEventSchema,\n LoggerSeriesEventSchema,\n ])\n .or(\n HydrodynamicEventBaseSchema.passthrough().refine(\n e => !HYDRODYNAMIC_TYPES.includes(e.type),\n { message: 'malformed hydrodynamic event' },\n ),\n )\n .superRefine((e, ctx) => {\n // Aggregated logger readings carry the interval's range.\n if (e.type !== 'logger_series') return;\n const series = e as z.infer<typeof LoggerSeriesEventSchema>;\n if (series.aggregation !== 'hourly' && series.aggregation !== 'daily') {\n return;\n }\n series.readings.forEach((r, i) => {\n for (const key of ['depth_min', 'depth_max'] as const) {\n if (r[key] === undefined) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n path: ['readings', i, key],\n message: `${key} is required in an aggregated logger_series`,\n });\n }\n }\n });\n });\n\n// ─── Aquifer analysis + history log schemas ───────────────────────────────────\n\nexport const WellStatusSchema = z.enum([\n 'active',\n 'maintenance',\n 'inactive',\n 'decommissioned',\n 'abandoned',\n]);\n\nexport const HistoryLogEntrySchema = z.object({\n id: z.string(),\n datetime: rfc3339(),\n updated_at: rfc3339().optional(),\n category: z.string(),\n description: z.string(),\n author: z.string().optional(),\n severity: z.string().optional(),\n attachments: z.array(AttachmentSchema).optional(),\n hydrodynamic_event_ids: z.array(z.string()).optional(),\n sample_ids: z.array(z.string()).optional(),\n maintenance_type: z.string().optional(),\n pump_installation_id: z.string().optional(),\n meter_id: z.string().optional(),\n status: WellStatusSchema.optional(),\n});\n\nexport const AquiferAnalysisSchema = z.object({\n id: z.string(),\n datetime: rfc3339(),\n analyst: z.string().optional(),\n source_event_ids: z.array(z.string()),\n method: z.string().optional(),\n static_level: z.number().optional(),\n static_level_precision: z.number().optional(),\n static_level_source_id: z.string().optional(),\n dynamic_level: z.number().optional(),\n dynamic_level_precision: z.number().optional(),\n flow_rate: z.number().optional(),\n flow_rate_precision: z.number().optional(),\n max_flow_rate: z.number().optional(),\n max_flow_rate_precision: z.number().optional(),\n max_flow_rate_basis: z.string().optional(),\n specific_capacity: z.number().optional(),\n transmissivity: z.number().optional(),\n storativity: z.number().optional(),\n hydraulic_conductivity: z.number().optional(),\n aquifer_thickness: z.number().optional(),\n jacob_b: z.number().optional(),\n jacob_c: z.number().optional(),\n well_efficiency_pct: z.number().optional(),\n notes: z.string().optional(),\n attachments: z.array(AttachmentSchema).optional(),\n});\n\n// ─── Operational schemas ──────────────────────────────────────────────────────\n\nexport const PumpElectricalSchema = z.object({\n voltage: z.number().nonnegative().optional(),\n phases: z.union([z.literal(1), z.literal(3)]).optional(),\n cable_section: z.number().nonnegative().optional(),\n cable_length: z.number().nonnegative().optional(),\n});\n\nexport const PumpInstallationSchema = z.object({\n id: z.string(),\n installed_at: rfc3339(),\n removed_at: rfc3339().optional(),\n installed_by: z.string().optional(),\n removed_by: z.string().optional(),\n type: z.string(),\n power_source: z.string().optional(),\n manufacturer: z.string().optional(),\n model: z.string().optional(),\n serial: z.string().optional(),\n intake_depth: z.number().nonnegative().optional(),\n rated_flow_rate: z.number().nonnegative().optional(),\n rated_head: z.number().nonnegative().optional(),\n rated_power: z.number().nonnegative().optional(),\n stages: z.number().int().positive().optional(),\n riser_diameter: z.number().nonnegative().optional(),\n riser_material: z.string().optional(),\n check_valve: z.boolean().optional(),\n electrical: PumpElectricalSchema.optional(),\n notes: z.string().optional(),\n updated_at: rfc3339().optional(),\n attachments: z.array(AttachmentSchema).optional(),\n});\n\nexport const VolumeLimitSchema = z.object({\n period: z.enum(['daily', 'monthly', 'annual']),\n volume: z.number().nonnegative(),\n});\n\nexport const MonthlyGrantSchema = z.object({\n month: z.number().int().min(1).max(12),\n flow_rate: z.number().nonnegative().optional(),\n daily_operating_time: z.number().nonnegative().optional(),\n days: z.number().int().min(0).max(31).optional(),\n});\n\nexport const ConditionFulfillmentSchema = z.object({\n id: z.string(),\n datetime: rfc3339(),\n due_date: calendarDate().optional(),\n description: z.string().optional(),\n author: z.string().optional(),\n event_id: z.string().optional(),\n sample_id: z.string().optional(),\n updated_at: rfc3339().optional(),\n attachments: z.array(AttachmentSchema).optional(),\n});\n\nexport const PermitConditionSchema = z.object({\n id: z.string(),\n description: z.string(),\n category: z.string().optional(),\n first_due: calendarDate().optional(),\n due_after: dateDuration().optional(),\n recurrence: dateDuration().optional(),\n last_due: calendarDate().optional(),\n occurrences: z.number().int().positive().optional(),\n responsible: z.string().optional(),\n fulfillments: z.array(ConditionFulfillmentSchema).optional(),\n});\n\nexport const PermitAdministrativeStatusSchema = z.enum([\n 'requested',\n 'granted',\n 'suspended',\n 'revoked',\n 'denied',\n 'withdrawn',\n]);\n\nexport const PermitHistoryEntrySchema = z.object({\n id: z.string(),\n date: calendarDate(),\n type: z.string().optional(),\n description: z.string(),\n done: z.boolean().optional(),\n due_date: calendarDate().optional(),\n updated_at: rfc3339().optional(),\n attachments: z.array(AttachmentSchema).optional(),\n});\n\nexport const PermitSchema = z.object({\n id: z.string(),\n type: z.string(),\n authority: z.string(),\n identifier: z.string().optional(),\n request_identifier: z.string().optional(),\n status: PermitAdministrativeStatusSchema.optional(),\n issued_at: calendarDate().optional(),\n valid_from: calendarDate().optional(),\n valid_until: calendarDate().optional(),\n renewal_requested_at: calendarDate().optional(),\n water_use: z.array(z.string()).optional(),\n flow_rate: z.number().nonnegative().optional(),\n daily_operating_time: z.number().nonnegative().optional(),\n volume_limits: z.array(VolumeLimitSchema).optional(),\n monthly_schedule: z.array(MonthlyGrantSchema).optional(),\n conditions: z.array(PermitConditionSchema).optional(),\n history: z.array(PermitHistoryEntrySchema).optional(),\n supersedes: z.string().optional(),\n notes: z.string().optional(),\n updated_at: rfc3339().optional(),\n attachments: z.array(AttachmentSchema).optional(),\n});\n\nexport const MeterSchema = z.object({\n id: z.string(),\n installed_at: rfc3339(),\n removed_at: rfc3339().optional(),\n installed_by: z.string().optional(),\n removed_by: z.string().optional(),\n type: z.string().optional(),\n manufacturer: z.string().optional(),\n model: z.string().optional(),\n serial: z.string().optional(),\n nominal_diameter: z.number().nonnegative().optional(),\n max_reading: z.number().positive().optional(),\n notes: z.string().optional(),\n updated_at: rfc3339().optional(),\n attachments: z.array(AttachmentSchema).optional(),\n});\n\nexport const ProductionEntryBaseSchema = z.object({\n id: z.string(),\n type: z.string(),\n corrects: z.string().optional(),\n sequence: z.number().int().optional(),\n notes: z.string().optional(),\n});\n\nexport const MeterReadingSchema = ProductionEntryBaseSchema.extend({\n type: z.literal('meter_reading'),\n datetime: rfc3339(),\n meter_id: z.string(),\n reading: z.number().nonnegative(),\n source: z.string().optional(),\n});\n\nexport const EstimatedVolumeSchema = ProductionEntryBaseSchema.extend({\n type: z.literal('estimated_volume'),\n period_start: rfc3339(),\n period_end: rfc3339(),\n volume: z.number().nonnegative(),\n method: z.string().optional(),\n});\n\nconst PRODUCTION_TYPES = ['meter_reading', 'estimated_volume'];\n\n// Unknown (`x-`) entry types fall back to the base schema with passthrough;\n// known types must satisfy their own schema.\nexport const ProductionEntrySchema = z\n .discriminatedUnion('type', [MeterReadingSchema, EstimatedVolumeSchema])\n .or(\n ProductionEntryBaseSchema.passthrough().refine(\n e => !PRODUCTION_TYPES.includes(e.type),\n { message: 'malformed production entry' },\n ),\n );\n\nexport const OperatingRegimeSchema = z.object({\n id: z.string(),\n effective_from: rfc3339(),\n flow_rate: z.number().nonnegative().optional(),\n daily_operating_time: z.number().nonnegative().optional(),\n days_per_week: z.number().int().min(1).max(7).optional(),\n notes: z.string().optional(),\n updated_at: rfc3339().optional(),\n});\n\n// ─── Water quality schemas (since v2.3) ───────────────────────────────────────\n\n// `welldot`, `cas` or a custom `x-…` vocabulary.\nconst PARAMETER_VOCABULARY = /^(welldot|cas|x-.+)$/;\n\nexport const ParameterSchema = z.object({\n code: z.string().min(1),\n vocabulary: z\n .string()\n .regex(PARAMETER_VOCABULARY, 'vocabulary must be welldot, cas or x-…'),\n});\n\nexport const TimeResolutionSchema = z.literal('day');\n\nexport const SamplingPointSchema = z\n .object({\n type: z.string(),\n depth: z.number().nonnegative().optional(),\n depth_precision: z.number().nonnegative().optional(),\n from: z.number().nonnegative().optional(),\n to: z.number().nonnegative().optional(),\n device: z.string().optional(),\n pump_installation_id: z.string().optional(),\n })\n .refine(\n p =>\n !(p.depth !== undefined && (p.from !== undefined || p.to !== undefined)),\n { message: 'depth and from/to are mutually exclusive' },\n );\n\nexport const PurgeReadingSchema = z.object({\n elapsed: z.number().nonnegative(),\n parameter: ParameterSchema,\n value: z.number(),\n});\n\nexport const PurgeSchema = z.object({\n duration: z.number().nonnegative().optional(),\n volume: z.number().nonnegative().optional(),\n flow_rate: z.number().nonnegative().optional(),\n stabilized: z.boolean().optional(),\n readings: z.array(PurgeReadingSchema).optional(),\n});\n\nexport const LaboratorySchema = z.object({\n name: z.string(),\n accreditation: z.string().optional(),\n report_number: z.string().optional(),\n batch_id: z.string().optional(),\n sample_id: z.string().optional(),\n received_at: rfc3339().optional(),\n received_at_resolution: TimeResolutionSchema.optional(),\n received_temperature: z.number().optional(),\n});\n\nexport const FiltrationSchema = z.object({\n pore_size: z.number().positive().optional(),\n location: z.enum(['field', 'lab']).optional(),\n});\n\nexport const ResultValidationSchema = z.object({\n status: z.enum(['unvalidated', 'validated', 'qualified', 'rejected']),\n qualifier: z.string().optional(),\n guideline: z.string().optional(),\n validated_by: z.string().optional(),\n validated_at: rfc3339().optional(),\n});\n\nexport const ResultQualifierSchema = z.enum([\n '<',\n '>',\n 'not_detected',\n 'estimated',\n]);\n\nexport const WaterQualityResultSchema = z\n .object({\n parameter: ParameterSchema,\n value: z.number().optional(),\n presence: z.boolean().optional(),\n text: z.string().optional(),\n qualifier: ResultQualifierSchema.optional(),\n unit: z.string().min(1).optional(),\n detection_limit: z.number().nonnegative().optional(),\n quantification_limit: z.number().nonnegative().optional(),\n value_precision: z.number().nonnegative().optional(),\n fraction: z.enum(['total', 'dissolved', 'suspended']).optional(),\n filtration: FiltrationSchema.optional(),\n measured_in: z.enum(['field', 'lab']).optional(),\n method: z.string().optional(),\n analyzed_at: rfc3339().optional(),\n analyzed_at_resolution: TimeResolutionSchema.optional(),\n lab_flags: z.array(z.string()).optional(),\n validation: ResultValidationSchema.optional(),\n notes: z.string().optional(),\n })\n .superRefine((r, ctx) => {\n const forms = [r.value, r.presence, r.text].filter(\n v => v !== undefined,\n ).length;\n if (r.qualifier === 'not_detected') {\n if (forms !== 0)\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: 'not_detected results carry no value form',\n });\n } else if (forms !== 1) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: 'result must have exactly one of value, presence or text',\n });\n } else if (r.qualifier !== undefined && r.value === undefined) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: `qualifier ${r.qualifier} requires a numeric value`,\n });\n }\n const custom = r.parameter.vocabulary.startsWith('x-');\n if (custom && r.unit === undefined)\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n path: ['unit'],\n message: 'unit is required for x- vocabularies',\n });\n if (!custom && r.unit !== undefined)\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n path: ['unit'],\n message: 'unit is forbidden for welldot and cas parameters',\n });\n });\n\nexport const WaterSampleSchema = z.object({\n id: z.string(),\n datetime: rfc3339(),\n sample_type: z.string(),\n parent_sample_id: z.string().optional(),\n sequence: z.number().int().optional(),\n campaign: z.string().optional(),\n sampling_method: z.string().optional(),\n sampling_point: SamplingPointSchema.optional(),\n purge: PurgeSchema.optional(),\n static_level_event_id: z.string().optional(),\n collected_by: z.string().optional(),\n preservation: z.string().optional(),\n chain_of_custody: z.string().optional(),\n laboratory: LaboratorySchema.optional(),\n corrects: z.string().optional(),\n notes: z.string().optional(),\n attachments: z.array(AttachmentSchema).optional(),\n results: z.array(WaterQualityResultSchema).min(1),\n});\n\n// ─── Well schema ──────────────────────────────────────────────────────────────\n\nexport const WellSchema = z\n .object({\n version: z.union([\n z.number().int().nonnegative(),\n z.string().regex(/^\\d+\\.\\d+$/, 'version must be \"M.m\"'),\n ]),\n '@context': z\n .union([z.string(), z.array(z.unknown()), z.record(z.unknown())])\n .optional(),\n well_id: z.array(WellIdSchema).optional(),\n location: LocationSchema.optional(),\n profiles: z\n .array(\n z\n .string()\n .url()\n .refine(u => u.startsWith('https://'), {\n message: 'profiles must be HTTPS URLs',\n }),\n )\n .optional(),\n well_type: z.string().optional(),\n well_purpose: z.array(z.string()).optional(),\n name: z.string().optional(),\n well_driller: z.string().optional(),\n construction_date: z\n .string()\n .regex(CALENDAR_DATE, 'construction_date must be YYYY-MM-DD')\n .optional(),\n obs: z.string().optional(),\n lat: z.number().optional(),\n lng: z.number().optional(),\n elevation: z.number().optional(),\n well_depth: z.number().optional(),\n bore_hole: z.array(BoreHoleSchema),\n well_case: z.array(WellCaseSchema),\n reduction: z.array(ReductionSchema),\n well_screen: z.array(WellScreenSchema),\n surface_case: z.array(SurfaceCaseSchema),\n hole_fill: z.array(HoleFillSchema),\n centralizers: z.array(CentralizerSchema).optional(),\n cement_pad: CementPadSchema.optional(),\n lithology: z.array(LithologySchema),\n fractures: z.array(FractureSchema),\n caves: z.array(CaveSchema),\n hydrodynamic_events: z.array(HydrodynamicEventSchema).optional(),\n aquifer_analysis: z.array(AquiferAnalysisSchema).optional(),\n history_logs: z.array(HistoryLogEntrySchema).optional(),\n attachments: z.array(AttachmentSchema).optional(),\n pump_installations: z.array(PumpInstallationSchema).optional(),\n permits: z.array(PermitSchema).optional(),\n meters: z.array(MeterSchema).optional(),\n production: z.array(ProductionEntrySchema).optional(),\n operating_regime: z.array(OperatingRegimeSchema).optional(),\n water_samples: z.array(WaterSampleSchema).optional(),\n })\n .passthrough();\n\n// ─── parseWell ────────────────────────────────────────────────────────────────\n\nfunction normalizeV1Fields(\n raw: Record<string, unknown>,\n): Record<string, unknown> {\n const out = { ...raw };\n\n // v1 is treated as v2-equivalent after normalization\n out.version = 2;\n\n // bole_hole → bore_hole (v1 typo compatibility)\n if ('bole_hole' in out && !('bore_hole' in out)) {\n out.bore_hole = out.bole_hole;\n delete out.bole_hole;\n }\n\n // lat/lng/elevation → location object\n if (!('location' in out)) {\n const lat = out.lat as number | undefined;\n const lng = out.lng as number | undefined;\n const elevation = out.elevation as number | undefined;\n if (lat !== undefined && lng !== undefined) {\n out.location = {\n lat,\n lng,\n ...(elevation !== undefined && { elevation }),\n };\n }\n }\n\n // diam_pol (inches) → diameter (mm) on constructive arrays\n for (const key of [\n 'bore_hole',\n 'well_case',\n 'well_screen',\n 'surface_case',\n 'hole_fill',\n ]) {\n const items = out[key];\n if (Array.isArray(items)) {\n const hasDiamPol = (items as Record<string, unknown>[]).some(\n item => 'diam_pol' in item,\n );\n if (hasDiamPol) {\n out[key] = (items as Record<string, unknown>[]).map(item => {\n const { diam_pol, ...rest } = item;\n return { ...rest, diameter: ((diam_pol as number) || 0) * 25.4 };\n });\n }\n }\n }\n\n // fgdc_texture → texture on each lithology entry\n if (Array.isArray(out.lithology)) {\n out.lithology = (out.lithology as Record<string, unknown>[]).map(item => {\n if ('fgdc_texture' in item && !('texture' in item)) {\n const { fgdc_texture, ...rest } = item;\n return { ...rest, texture: { code: fgdc_texture, vocabulary: 'fgdc' } };\n }\n return item;\n });\n }\n\n // screen_slot_mm → screen_slot on each well_screen entry\n if (Array.isArray(out.well_screen)) {\n out.well_screen = (out.well_screen as Record<string, unknown>[]).map(\n item => {\n if ('screen_slot_mm' in item && !('screen_slot' in item)) {\n const { screen_slot_mm, ...rest } = item;\n return { ...rest, screen_slot: screen_slot_mm };\n }\n return item;\n },\n );\n }\n\n return out;\n}\n\nexport function parseWell(json: string): Well {\n const raw = JSON.parse(json) as Record<string, unknown>;\n\n if (raw.version === undefined) {\n // version absent — normalize to v2\n raw.version = 2;\n } else {\n const parsed = parseFormatVersion(raw.version);\n if (!parsed) {\n throw new Error(\n `Malformed .well format version: ${JSON.stringify(raw.version)}`,\n );\n }\n if (parsed.major === 1) {\n const normalized = normalizeV1Fields(raw);\n return mergeParsed(\n WellSchema.parse(normalized) as Well,\n normalized,\n ) as Well;\n }\n if (parsed.major !== 2) {\n throw new Error(\n `Unsupported .well format version: ${JSON.stringify(raw.version)}`,\n );\n }\n }\n\n // v2.0–v2.3 files (integer `version: 2`, or absent) may carry\n // `storativity: null`; read it as absent. \"2.4\" files must omit it.\n if (raw.version === 2 && Array.isArray(raw.aquifer_analysis)) {\n for (const item of raw.aquifer_analysis) {\n if (isPlainObject(item) && item.storativity === null) {\n delete item.storativity;\n }\n }\n }\n\n // major 2, any minor (explicit or normalized from absent)\n return mergeParsed(WellSchema.parse(raw) as Well, raw) as Well;\n}\n","const IANA_SHAPE = /^[A-Za-z][A-Za-z0-9_+\\-/]*$/;\n\n/**\n * Whether `value` is an IANA time zone name (e.g. `America/Belem`, `UTC`).\n * UTC offsets (`-03:00`) and unknown names are not valid. Uses the built-in\n * `Intl`, so no time zone database is bundled.\n */\nexport function isIanaTimeZone(value: string): boolean {\n if (!IANA_SHAPE.test(value)) return false;\n try {\n new Intl.DateTimeFormat('en-US', { timeZone: value });\n return true;\n } catch {\n return false;\n }\n}\n","/** The `.well` format version written by this library (`\"M.m\"`). */\nexport const WELL_FORMAT_VERSION = '2.4' as const;\n\n/** A parsed `.well` format version. `minor` is `undefined` for the integer forms (`1`, `2`). */\nexport type FormatVersion = { major: number; minor: number | undefined };\n\nconst VERSION_PATTERN = /^(\\d+)\\.(\\d+)$/;\n\n/**\n * Parses a `.well` `version` value: a non-negative integer (`2`) or an `\"M.m\"`\n * string (`\"2.4\"`). Returns `undefined` for anything else (`2.4`, `\"2.4.1\"`,\n * `\"v2.4\"`, `\"2\"`, negatives, non-numbers).\n */\nexport function parseFormatVersion(value: unknown): FormatVersion | undefined {\n if (typeof value === 'number') {\n return Number.isInteger(value) && value >= 0\n ? { major: value, minor: undefined }\n : undefined;\n }\n if (typeof value === 'string') {\n const match = VERSION_PATTERN.exec(value);\n if (match) return { major: Number(match[1]), minor: Number(match[2]) };\n }\n return undefined;\n}\n\n/**\n * Compares two `\"M.m\"` versions as two integers (`\"2.10\"` > `\"2.9\"`).\n * Returns a negative, zero or positive number.\n * @throws {Error} If either value is not a valid `\"M.m\"` string.\n */\nexport function compareFormatVersions(a: string, b: string): number {\n const pa = parseFormatVersion(a);\n const pb = parseFormatVersion(b);\n if (\n !pa ||\n pb === undefined ||\n pa.minor === undefined ||\n pb.minor === undefined\n ) {\n throw new Error(\n `Malformed .well format version: ${JSON.stringify(pa?.minor === undefined ? a : b)}`,\n );\n }\n return pa.major - pb.major || pa.minor - pb.minor;\n}\n","// Closed vocabularies: fields whose values the .well schema fixes (no free\n// text, no `x-` extensions). Same shape as the open vocabularies — each entry\n// carries en/pt labels — so `getVocabLabel` works for both. The `*_VALUES`\n// lists are the bare values, derived from the entries.\nimport type {\n BarometricCompensation,\n PermitAdministrativeStatus,\n ProductionEntry,\n ReadingAggregation,\n ResultQualifier,\n ResultValidation,\n VolumeLimit,\n WaterQualityResult,\n WellStatus,\n} from '../types/well.types';\nimport type { VocabEntry } from './vocab';\nimport type { ParameterGroup } from './waterQuality.vocab';\n\n/**\n * Builds a closed vocabulary that must list every member of `T`: a missing\n * value is a compile error, so the list can never drift from the type.\n */\nfunction closedVocab<T extends string>() {\n return <const L extends readonly VocabEntry<T>[]>(\n entries: L &\n ([Exclude<T, L[number]['value']>] extends [never] ? unknown : never),\n ): readonly VocabEntry<T>[] => entries;\n}\n\nconst valuesOf = <T extends string>(vocab: readonly VocabEntry<T>[]) =>\n vocab.map(entry => entry.value) as readonly T[];\n\n/** `history_logs[].status` of `status_change` entries (since v2.3). */\nexport const WELL_STATUSES = closedVocab<WellStatus>()([\n { value: 'active', label: { en: 'Active', pt: 'Ativo' } },\n {\n value: 'maintenance',\n label: { en: 'Under maintenance', pt: 'Em manutenção' },\n },\n { value: 'inactive', label: { en: 'Inactive', pt: 'Paralisado' } },\n {\n value: 'decommissioned',\n label: { en: 'Decommissioned', pt: 'Desativado' },\n },\n { value: 'abandoned', label: { en: 'Abandoned', pt: 'Abandonado' } },\n]);\n\n/** Stored administrative `permits[].status` (since v2.3). */\nexport const PERMIT_ADMINISTRATIVE_STATUSES =\n closedVocab<PermitAdministrativeStatus>()([\n { value: 'requested', label: { en: 'Requested', pt: 'Requerida' } },\n { value: 'granted', label: { en: 'Granted', pt: 'Concedida' } },\n { value: 'suspended', label: { en: 'Suspended', pt: 'Suspensa' } },\n { value: 'revoked', label: { en: 'Revoked', pt: 'Revogada' } },\n { value: 'denied', label: { en: 'Denied', pt: 'Indeferida' } },\n { value: 'withdrawn', label: { en: 'Withdrawn', pt: 'Cancelada' } },\n ]);\n\n/** `permits[].volume_limits[].period` (since v2.3). */\nexport const VOLUME_LIMIT_PERIODS = closedVocab<VolumeLimit['period']>()([\n { value: 'daily', label: { en: 'Daily', pt: 'Diário' } },\n { value: 'monthly', label: { en: 'Monthly', pt: 'Mensal' } },\n { value: 'annual', label: { en: 'Annual', pt: 'Anual' } },\n]);\n\n/** `production[].type` (since v2.3). */\nexport const PRODUCTION_ENTRY_TYPES = closedVocab<ProductionEntry['type']>()([\n {\n value: 'meter_reading',\n label: { en: 'Meter reading', pt: 'Leitura de hidrômetro' },\n },\n {\n value: 'estimated_volume',\n label: { en: 'Estimated volume', pt: 'Volume estimado' },\n },\n]);\n\n/** Result `qualifier` (since v2.3). */\nexport const RESULT_QUALIFIERS = closedVocab<ResultQualifier>()([\n { value: '<', label: { en: '< less than', pt: '< menor que' } },\n { value: '>', label: { en: '> greater than', pt: '> maior que' } },\n { value: 'not_detected', label: { en: 'Not detected', pt: 'Não detectado' } },\n { value: 'estimated', label: { en: 'Estimated', pt: 'Estimado' } },\n]);\n\n/** Result `fraction` (since v2.3). */\nexport const RESULT_FRACTIONS = closedVocab<\n NonNullable<WaterQualityResult['fraction']>\n>()([\n { value: 'total', label: { en: 'Total', pt: 'Total' } },\n { value: 'dissolved', label: { en: 'Dissolved', pt: 'Dissolvida' } },\n { value: 'suspended', label: { en: 'Suspended', pt: 'Suspensa' } },\n]);\n\n/** Where a result was measured: `measured_in` and `filtration.location` (since v2.3). */\nexport const MEASUREMENT_LOCATIONS = closedVocab<\n NonNullable<WaterQualityResult['measured_in']>\n>()([\n { value: 'field', label: { en: 'Field', pt: 'Campo' } },\n { value: 'lab', label: { en: 'Lab', pt: 'Laboratório' } },\n]);\n\n/** Result `validation.status` (since v2.3). */\nexport const VALIDATION_STATUSES = closedVocab<ResultValidation['status']>()([\n { value: 'unvalidated', label: { en: 'Unvalidated', pt: 'Não validado' } },\n { value: 'validated', label: { en: 'Validated', pt: 'Validado' } },\n { value: 'qualified', label: { en: 'Qualified', pt: 'Qualificado' } },\n { value: 'rejected', label: { en: 'Rejected', pt: 'Rejeitado' } },\n]);\n\n/** Parameter vocabulary groups, in display order (since v2.3). */\nexport const PARAMETER_GROUPS = closedVocab<ParameterGroup>()([\n {\n value: 'physical',\n label: { en: 'Physical / field', pt: 'Físico / campo' },\n },\n { value: 'aggregate', label: { en: 'Aggregate', pt: 'Agregados' } },\n { value: 'major_ion', label: { en: 'Major ions', pt: 'Íons maiores' } },\n { value: 'nutrient', label: { en: 'Nutrients', pt: 'Nutrientes' } },\n { value: 'organic', label: { en: 'Organic', pt: 'Orgânicos' } },\n { value: 'disinfection', label: { en: 'Disinfection', pt: 'Desinfecção' } },\n {\n value: 'mining_redox',\n label: { en: 'Mining and redox', pt: 'Mineração e redox' },\n },\n { value: 'metal', label: { en: 'Metals / trace', pt: 'Metais / traço' } },\n { value: 'microbiology', label: { en: 'Microbiology', pt: 'Microbiologia' } },\n {\n value: 'radioactivity',\n label: { en: 'Radioactivity', pt: 'Radioatividade' },\n },\n]);\n\n/** `logger_series.barometric_compensation` (since v2.4). */\nexport const BAROMETRIC_COMPENSATIONS = closedVocab<BarometricCompensation>()([\n { value: 'barologger', label: { en: 'Barologger', pt: 'Barologger' } },\n { value: 'vented', label: { en: 'Vented cable', pt: 'Cabo ventilado' } },\n { value: 'none', label: { en: 'None', pt: 'Nenhuma' } },\n]);\n\n/** `logger_series.aggregation` (since v2.4). */\nexport const READING_AGGREGATIONS = closedVocab<ReadingAggregation>()([\n { value: 'none', label: { en: 'Raw readings', pt: 'Leituras brutas' } },\n { value: 'hourly', label: { en: 'Hourly', pt: 'Horária' } },\n { value: 'daily', label: { en: 'Daily', pt: 'Diária' } },\n]);\n\n// ─── Bare value lists ────────────────────────────────────────────────────────\n\nexport const WELL_STATUS_VALUES = valuesOf(WELL_STATUSES);\nexport const PERMIT_ADMINISTRATIVE_STATUS_VALUES = valuesOf(\n PERMIT_ADMINISTRATIVE_STATUSES,\n);\nexport const QUALIFIER_VALUES = valuesOf(RESULT_QUALIFIERS);\nexport const FRACTION_VALUES = valuesOf(RESULT_FRACTIONS);\nexport const MEASURED_IN_VALUES = valuesOf(MEASUREMENT_LOCATIONS);\nexport const FILTRATION_LOCATION_VALUES = valuesOf(MEASUREMENT_LOCATIONS);\nexport const VALIDATION_STATUS_VALUES = valuesOf(VALIDATION_STATUSES);\nexport const PARAMETER_GROUP_VALUES = valuesOf(PARAMETER_GROUPS);\nexport const BAROMETRIC_COMPENSATION_VALUES = valuesOf(\n BAROMETRIC_COMPENSATIONS,\n);\nexport const READING_AGGREGATION_VALUES = valuesOf(READING_AGGREGATIONS);\n\n// ─── Value rules ─────────────────────────────────────────────────────────────\n\n/** Qualifiers that only go with a numeric `value`. */\nexport const NUMERIC_QUALIFIERS: readonly ResultQualifier[] = [\n '<',\n '>',\n 'estimated',\n];\n\n/** Sample types that point to an original sample with `parent_sample_id`. */\nexport const PARENT_SAMPLE_TYPES: readonly string[] = [\n 'field_duplicate',\n 'split_sample',\n];\n\n/** Blank (QA/QC) sample types. */\nexport const BLANK_SAMPLE_TYPES: readonly string[] = [\n 'field_blank',\n 'trip_blank',\n 'equipment_blank',\n];\n","import type { VocabEntry } from './vocab';\n\n/** Canonical `hydrodynamic_events[].type` values; `x-` types pass through. */\nexport const HYDRODYNAMIC_EVENT_TYPES = [\n {\n value: 'spot_measurement',\n label: { en: 'Spot measurement', pt: 'Medição pontual' },\n },\n {\n value: 'constant_rate',\n label: { en: 'Constant rate', pt: 'Vazão constante' },\n },\n { value: 'step_drawdown', label: { en: 'Step drawdown', pt: 'Escalonada' } },\n { value: 'airlift', label: { en: 'Air-lift', pt: 'Air-lift' } },\n {\n value: 'recovery_only',\n label: { en: 'Recovery only', pt: 'Recuperação' },\n },\n {\n value: 'logger_series',\n label: { en: 'Logger series', pt: 'Série de datalogger' },\n },\n] as const satisfies readonly VocabEntry[];\n\n/** Recommended `measurement_method` values (`spot_measurement`, `logger_series`). */\nexport const MEASUREMENT_METHODS = [\n {\n value: 'electric_probe',\n label: { en: 'Electric probe', pt: 'Sonda elétrica' },\n },\n {\n value: 'pressure_transducer',\n label: { en: 'Pressure transducer', pt: 'Transdutor de pressão' },\n },\n { value: 'air_line', label: { en: 'Air line', pt: 'Linha de ar' } },\n { value: 'tape', label: { en: 'Tape', pt: 'Trena' } },\n] as const satisfies readonly VocabEntry[];\n\nexport type MeasurementMethod = (typeof MEASUREMENT_METHODS)[number]['value'];\n\n/** Recommended `aquifer_analysis[].method` values. */\nexport const AQUIFER_ANALYSIS_METHODS = [\n { value: 'cooper_jacob', label: { en: 'Cooper-Jacob', pt: 'Cooper-Jacob' } },\n { value: 'theis', label: { en: 'Theis', pt: 'Theis' } },\n { value: 'neuman', label: { en: 'Neuman', pt: 'Neuman' } },\n { value: 'hantush', label: { en: 'Hantush', pt: 'Hantush' } },\n {\n value: 'birsoy_summers',\n label: { en: 'Birsoy-Summers', pt: 'Birsoy-Summers' },\n },\n { value: 'eden_hazel', label: { en: 'Eden-Hazel', pt: 'Eden-Hazel' } },\n {\n value: 'visual_inspection',\n label: { en: 'Visual inspection', pt: 'Inspeção visual' },\n },\n] as const satisfies readonly VocabEntry[];\n\nexport type AquiferAnalysisMethod =\n (typeof AQUIFER_ANALYSIS_METHODS)[number]['value'];\n","import {\n Constructive,\n Geologic,\n Lithology,\n Location,\n SectionKey,\n SectionVisibility,\n VisibilityFieldKey,\n VisibilityKey,\n Well,\n WellVisibility,\n} from '../types/well.types';\nimport { WellSchema, mergeWell } from '../validators/well.validators';\nimport { WELL_FORMAT_VERSION, parseFormatVersion } from './version.utils';\n\n// ─── Types ───────────────────────────────────────────────────────────────────\n\ntype RawJSON = Record<string, unknown>;\n\n// ─── Constants ───────────────────────────────────────────────────────────────\n\nconst INCHES_TO_MM = 25.4;\n\n// Root members that a v1 or legacy file leaves on the object after it is\n// migrated. They are never written back.\nconst LEGACY_ROOT_KEYS = new Set([\n 'lat',\n 'lng',\n 'elevation',\n 'bole_hole',\n 'constructive',\n 'geologic',\n]);\n\n/** Fixed display order for the 7 redactable sections of a well. */\nexport const SECTION_KEYS: readonly SectionKey[] = [\n 'general',\n 'constructive',\n 'geology',\n 'hydrodynamic',\n 'history',\n 'operation',\n 'water_quality',\n];\n\n/**\n * Fields of each section that can be hidden one by one, in display order.\n * Sections with no entries (`history`, `water_quality`) toggle as a whole.\n */\nexport const VISIBILITY_TREE: Readonly<\n Record<SectionKey, readonly VisibilityFieldKey[]>\n> = {\n general: ['identification', 'location', 'obs', 'attachments'],\n constructive: [\n 'bore_hole',\n 'surface_case',\n 'well_case',\n 'reduction',\n 'well_screen',\n 'hole_fill',\n 'centralizers',\n 'cement_pad',\n ],\n geology: ['lithology', 'fractures', 'caves'],\n hydrodynamic: ['hydrodynamic_events', 'aquifer_analysis'],\n history: [],\n operation: [\n 'pump_installations',\n 'meters',\n 'operating_regime',\n 'production',\n 'permits',\n ],\n water_quality: [],\n};\n\n/**\n * The finest toggles of {@link VISIBILITY_TREE}, in display order: every\n * field, plus each section that has no fields.\n */\nexport const VISIBILITY_LEAF_KEYS: readonly VisibilityKey[] =\n SECTION_KEYS.flatMap<VisibilityKey>(section =>\n VISIBILITY_TREE[section].length ? VISIBILITY_TREE[section] : [section],\n );\n\nconst EMPTY_WELL: Well = {\n version: WELL_FORMAT_VERSION,\n bore_hole: [],\n well_case: [],\n reduction: [],\n well_screen: [],\n surface_case: [],\n hole_fill: [],\n cement_pad: { type: '', width: 0, thickness: 0, length: 0 },\n lithology: [],\n fractures: [],\n caves: [],\n};\n\n// ─── Internal helpers ────────────────────────────────────────────────────────\n\nfunction createEmptyWell(): Well {\n return JSON.parse(JSON.stringify(EMPTY_WELL)) as Well;\n}\n\n/**\n * Calculated well depth: the deepest recorded point across a well's\n * constructive arrays only (not\n * geologic — lithology/fractures/caves may extend past the actual\n * constructed well and would overstate it). Same \"last item's `to`\" logic\n * as `@welldot/utils`'s `getProfileLastItemsDepths`, duplicated here because\n * `packages/core` may not depend on `@welldot/utils` (dependency chain runs\n * the other way).\n */\nexport function calculatedWellDepth(well: Well): number {\n const lastTo = (items: { to: number }[]): number =>\n items.length ? items[items.length - 1]!.to : 0;\n\n return Math.max(\n 0,\n lastTo(well.bore_hole),\n lastTo(well.hole_fill),\n lastTo(well.reduction),\n lastTo(well.surface_case),\n lastTo(well.well_case),\n lastTo(well.well_screen),\n );\n}\n\n/** Fills in `well_depth` from the constructive data when the source didn't provide one. */\nfunction withCalculatedWellDepth(well: Well): Well {\n if (well.well_depth != null) return well;\n const calculated = calculatedWellDepth(well);\n return calculated > 0 ? { ...well, well_depth: calculated } : well;\n}\n\nfunction normalizeLithology(items: RawJSON[]): Lithology[] {\n return items.map(item => {\n const base = { aquifer_unit: '', ...item };\n // v1 fgdc_texture → texture object\n if ('fgdc_texture' in base && !('texture' in base)) {\n const { fgdc_texture, ...rest } = base as Record<string, unknown>;\n return {\n ...rest,\n texture: { code: fgdc_texture, vocabulary: 'fgdc' },\n } as Lithology;\n }\n return base as Lithology;\n });\n}\n\nfunction normalizeWellScreens(items: RawJSON[]): Well['well_screen'] {\n return items.map(item => {\n if ('screen_slot_mm' in item && !('screen_slot' in item)) {\n const { screen_slot_mm, ...rest } = item;\n return {\n ...rest,\n screen_slot: screen_slot_mm,\n } as Well['well_screen'][number];\n }\n return item as Well['well_screen'][number];\n });\n}\n\nfunction decodeV1Well(raw: RawJSON): Well {\n // v1→v2 normalizations for deserialize path\n const lat = raw.lat as number | undefined;\n const lng = raw.lng as number | undefined;\n const elevation = raw.elevation as number | undefined;\n const hasCoords =\n lat !== undefined || lng !== undefined || elevation !== undefined;\n\n const location: Location | undefined =\n hasCoords && lat !== undefined && lng !== undefined\n ? { lat, lng, ...(elevation !== undefined && { elevation }) }\n : undefined;\n\n const rawScreens = (raw.well_screen as RawJSON[] | undefined) ?? [];\n\n const decoded: Well = {\n ...createEmptyWell(),\n ...(raw.well_type !== undefined && { well_type: raw.well_type as string }),\n ...(raw.name !== undefined && { name: raw.name as string }),\n ...(raw.well_driller !== undefined && {\n well_driller: raw.well_driller as string,\n }),\n ...(raw.construction_date !== undefined && {\n construction_date: raw.construction_date as string,\n }),\n ...(lat !== undefined && { lat }),\n ...(lng !== undefined && { lng }),\n ...(elevation !== undefined && { elevation }),\n ...(location !== undefined && { location }),\n ...(raw.obs !== undefined && { obs: raw.obs as string }),\n bore_hole: (raw.bore_hole as Well['bore_hole']) ?? [],\n well_case: (raw.well_case as Well['well_case']) ?? [],\n reduction: (raw.reduction as Well['reduction']) ?? [],\n well_screen: normalizeWellScreens(rawScreens),\n surface_case: (raw.surface_case as Well['surface_case']) ?? [],\n hole_fill: (raw.hole_fill as Well['hole_fill']) ?? [],\n ...(raw.cement_pad\n ? { cement_pad: raw.cement_pad as Well['cement_pad'] }\n : {}),\n lithology: normalizeLithology((raw.lithology as RawJSON[]) ?? []),\n fractures: (raw.fractures as Well['fractures']) ?? [],\n caves: (raw.caves as Well['caves']) ?? [],\n };\n return mergeWell(decoded, raw) as Well;\n}\n\nfunction decodeV2Well(raw: RawJSON): Well {\n const rawScreens = (raw.well_screen as RawJSON[] | undefined) ?? [];\n\n const decoded: Well = {\n ...createEmptyWell(),\n ...(raw.version !== undefined && {\n version: raw.version as Well['version'],\n }),\n ...(raw['@context'] !== undefined && {\n '@context': raw['@context'] as Well['@context'],\n }),\n ...(raw.well_id !== undefined && {\n well_id: raw.well_id as Well['well_id'],\n }),\n ...(raw.location !== undefined && {\n location: raw.location as Well['location'],\n }),\n ...(raw.profiles !== undefined && {\n profiles: raw.profiles as Well['profiles'],\n }),\n ...(raw.well_type !== undefined && { well_type: raw.well_type as string }),\n ...(raw.well_purpose !== undefined && {\n well_purpose: raw.well_purpose as Well['well_purpose'],\n }),\n ...(raw.name !== undefined && { name: raw.name as string }),\n ...(raw.well_driller !== undefined && {\n well_driller: raw.well_driller as string,\n }),\n ...(raw.construction_date !== undefined && {\n construction_date: raw.construction_date as string,\n }),\n ...(raw.obs !== undefined && { obs: raw.obs as string }),\n ...(raw.well_depth !== undefined && {\n well_depth: raw.well_depth as number,\n }),\n bore_hole: (raw.bore_hole as Well['bore_hole']) ?? [],\n well_case: (raw.well_case as Well['well_case']) ?? [],\n reduction: (raw.reduction as Well['reduction']) ?? [],\n well_screen: normalizeWellScreens(rawScreens),\n surface_case: (raw.surface_case as Well['surface_case']) ?? [],\n hole_fill: (raw.hole_fill as Well['hole_fill']) ?? [],\n ...(raw.centralizers !== undefined && {\n centralizers: raw.centralizers as Well['centralizers'],\n }),\n ...(raw.cement_pad\n ? { cement_pad: raw.cement_pad as Well['cement_pad'] }\n : {}),\n lithology: normalizeLithology((raw.lithology as RawJSON[]) ?? []),\n fractures: (raw.fractures as Well['fractures']) ?? [],\n caves: (raw.caves as Well['caves']) ?? [],\n ...(raw.hydrodynamic_events !== undefined && {\n hydrodynamic_events:\n raw.hydrodynamic_events as Well['hydrodynamic_events'],\n }),\n ...(raw.aquifer_analysis !== undefined && {\n aquifer_analysis: raw.aquifer_analysis as Well['aquifer_analysis'],\n }),\n ...(raw.history_logs !== undefined && {\n history_logs: raw.history_logs as Well['history_logs'],\n }),\n ...(raw.attachments !== undefined && {\n attachments: raw.attachments as Well['attachments'],\n }),\n ...(raw.pump_installations !== undefined && {\n pump_installations: raw.pump_installations as Well['pump_installations'],\n }),\n ...(raw.permits !== undefined && {\n permits: raw.permits as Well['permits'],\n }),\n ...(raw.meters !== undefined && {\n meters: raw.meters as Well['meters'],\n }),\n ...(raw.production !== undefined && {\n production: raw.production as Well['production'],\n }),\n ...(raw.operating_regime !== undefined && {\n operating_regime: raw.operating_regime as Well['operating_regime'],\n }),\n ...(raw.water_samples !== undefined && {\n water_samples: raw.water_samples as Well['water_samples'],\n }),\n };\n return mergeWell(decoded, raw) as Well;\n}\n\nfunction convertLegacyDiameters(\n items: (RawJSON & { diam_pol?: number })[],\n): RawJSON[] {\n if (!items?.length) return items ?? [];\n if (!items.some(item => item.diam_pol !== undefined)) return items;\n\n return items.map(({ diam_pol, ...rest }) => ({\n ...rest,\n diameter: (diam_pol || 0) * INCHES_TO_MM,\n }));\n}\n\n// \"bole_hole\" is a typo present in older saved profiles; kept for compatibility\nfunction normalizeConstructive(src: RawJSON): Partial<Constructive> {\n const boreHoleData = (src.bole_hole ?? src.bore_hole ?? []) as (RawJSON & {\n diam_pol?: number;\n })[];\n\n const rawScreens = convertLegacyDiameters(\n (src.well_screen ?? []) as (RawJSON & { diam_pol?: number })[],\n ) as RawJSON[];\n\n return {\n bore_hole: convertLegacyDiameters(boreHoleData) as Well['bore_hole'],\n hole_fill: convertLegacyDiameters(\n (src.hole_fill ?? []) as (RawJSON & { diam_pol?: number })[],\n ) as Well['hole_fill'],\n surface_case: convertLegacyDiameters(\n (src.surface_case ?? []) as (RawJSON & { diam_pol?: number })[],\n ) as Well['surface_case'],\n well_case: convertLegacyDiameters(\n (src.well_case ?? []) as (RawJSON & { diam_pol?: number })[],\n ) as Well['well_case'],\n well_screen: normalizeWellScreens(rawScreens),\n reduction: (src.reduction ?? []) as Well['reduction'],\n ...(src.cement_pad\n ? { cement_pad: src.cement_pad as Well['cement_pad'] }\n : {}),\n };\n}\n\nfunction normalizeGeologic(raw: RawJSON): Geologic {\n const lithologySource = (raw.lithology ?? raw.geologic ?? []) as RawJSON[];\n\n return {\n lithology: normalizeLithology(lithologySource),\n fractures: (raw.fractures ?? []) as Well['fractures'],\n caves: (raw.caves ?? []) as Well['caves'],\n };\n}\n\n// Root members the spec does not define: `x-` fields and blocks, and foreign\n// members written by other tools. Legacy v1 keys are left out.\nfunction unknownRootKeys(well: Well): string[] {\n return Object.keys(well).filter(\n key => !(key in WellSchema.shape) && !LEGACY_ROOT_KEYS.has(key),\n );\n}\n\n// ─── Public API ──────────────────────────────────────────────────────────────\n\n/**\n * Drops object members whose value is `null` (an optional field without a\n * value is omitted, never written as `null`). Members under `x-` keys and\n * `@context` are returned unchanged.\n */\nfunction omitNulls(value: unknown): unknown {\n if (Array.isArray(value)) return value.map(omitNulls);\n if (typeof value !== 'object' || value === null) return value;\n const out: Record<string, unknown> = {};\n for (const [key, member] of Object.entries(value)) {\n if (key.startsWith('x-') || key === '@context') {\n out[key] = member;\n } else if (member !== null) {\n out[key] = omitNulls(member);\n }\n }\n return out;\n}\n\n/**\n * Serializes a {@link Well} object into a versioned JSON string suitable for\n * storage or transmission.\n *\n * Root members the spec does not define (`x-` fields and blocks, foreign\n * members) are written after the spec blocks, unchanged. Nested unknown\n * members travel inside their objects. Legacy v1 keys (`lat`, `lng`,\n * `elevation`, …) are never written.\n *\n * @param well - The well profile to serialize.\n * @returns A JSON string containing the versioned well payload.\n */\nexport function serializeWell(well: Well): string {\n const payload: Record<string, unknown> = {\n version: WELL_FORMAT_VERSION,\n ...(well['@context'] !== undefined && { '@context': well['@context'] }),\n ...(well.well_id !== undefined && { well_id: well.well_id }),\n ...(well.location !== undefined && { location: well.location }),\n ...(well.profiles !== undefined && { profiles: well.profiles }),\n ...(well.well_type !== undefined && { well_type: well.well_type }),\n ...(well.well_purpose !== undefined && {\n well_purpose: well.well_purpose,\n }),\n ...(well.name !== undefined && { name: well.name }),\n ...(well.well_driller !== undefined && { well_driller: well.well_driller }),\n ...(well.construction_date !== undefined && {\n construction_date: well.construction_date,\n }),\n ...(well.obs !== undefined && { obs: well.obs }),\n ...(well.well_depth !== undefined && { well_depth: well.well_depth }),\n bore_hole: well.bore_hole,\n well_case: well.well_case,\n reduction: well.reduction,\n well_screen: well.well_screen,\n surface_case: well.surface_case,\n hole_fill: well.hole_fill,\n ...(well.centralizers !== undefined && {\n centralizers: well.centralizers,\n }),\n ...(well.cement_pad && { cement_pad: well.cement_pad }),\n lithology: well.lithology,\n fractures: well.fractures,\n caves: well.caves,\n ...(well.hydrodynamic_events !== undefined && {\n hydrodynamic_events: well.hydrodynamic_events,\n }),\n ...(well.aquifer_analysis !== undefined && {\n aquifer_analysis: well.aquifer_analysis,\n }),\n ...(well.history_logs !== undefined && { history_logs: well.history_logs }),\n ...(well.attachments !== undefined && { attachments: well.attachments }),\n ...(well.pump_installations !== undefined && {\n pump_installations: well.pump_installations,\n }),\n ...(well.permits !== undefined && { permits: well.permits }),\n ...(well.meters !== undefined && { meters: well.meters }),\n ...(well.production !== undefined && { production: well.production }),\n ...(well.operating_regime !== undefined && {\n operating_regime: well.operating_regime,\n }),\n ...(well.water_samples !== undefined && {\n water_samples: well.water_samples,\n }),\n };\n\n for (const key of unknownRootKeys(well)) {\n const value = (well as unknown as RawJSON)[key];\n if (value !== undefined) payload[key] = value;\n }\n\n return JSON.stringify(omitNulls(payload));\n}\n\n/**\n * Returns `true` when the well has no meaningful data — all constructive and\n * geologic arrays are empty and no legacy nested structure is present.\n *\n * @param well - The well profile to check. Accepts `null` / `undefined`\n * (both treated as empty).\n * @returns `true` if the well is considered empty, `false` otherwise.\n */\nexport function isWellEmpty(well: Well | null | undefined): boolean {\n if (!well) return true;\n\n const raw = well as RawJSON;\n if (raw.constructive || raw.geologic) return false;\n\n return (\n well.lithology?.length === 0 &&\n well.fractures?.length === 0 &&\n well.caves?.length === 0 &&\n well.bore_hole?.length === 0 &&\n well.hole_fill?.length === 0 &&\n well.well_case?.length === 0 &&\n well.well_screen?.length === 0\n );\n}\n\n/** A value that carries something: not blank, not 0, not all-blank inside\n * (an editor's placeholder `cement_pad` of zeros holds nothing). */\nfunction isFilled(value: unknown): boolean {\n if (value === undefined || value === null) return false;\n if (typeof value === 'string') return value.trim() !== '';\n if (typeof value === 'number') return value !== 0;\n if (Array.isArray(value)) return value.length > 0;\n if (typeof value === 'object') return Object.values(value).some(isFilled);\n return true;\n}\n\n/** Root members that say nothing about the well itself. */\nconst NON_DATA_ROOT_KEYS = new Set(['version', '$schema', '@context']);\n\n/**\n * Returns `true` when the well holds any data at all: a profile (see\n * {@link isWellEmpty}) or any other filled root member — identification,\n * location, events, samples, permits, `x-` members, … A registry record\n * with no construction or geology is not empty by this measure, while\n * {@link isWellEmpty} (nothing to draw) still says it is.\n *\n * @param well - The well to check. `null` / `undefined` hold no data.\n */\nexport function hasWellData(well: Well | null | undefined): boolean {\n if (!well) return false;\n if (!isWellEmpty(well)) return true;\n return Object.entries(well as RawJSON).some(\n ([key, value]) => !NON_DATA_ROOT_KEYS.has(key) && isFilled(value),\n );\n}\n\n/**\n * Returns a copy of `well` with hidden sections and fields cleared: array\n * fields become `[]` and optional fields become `undefined`, so the result\n * stays a schema-valid {@link Well}. Never mutates `well`.\n *\n * A field is hidden when its key or its section's key is `false` in\n * `visibility` (see {@link VISIBILITY_TREE}); missing keys are visible.\n * `well_depth` is dropped only when the whole `constructive` section is\n * hidden. Hiding a record type does not rewrite references to it held by\n * visible records (e.g. a production entry's `meter_id`).\n *\n * Root members the spec does not define (`x-` fields and blocks) can hold\n * anything, so they are kept only when nothing is hidden. Unknown members\n * nested in a record follow that record.\n *\n * @param well - The well profile to redact.\n * @param visibility - Section and/or field visibility. A {@link SectionVisibility} works as-is.\n * @returns A new {@link Well} with hidden parts emptied.\n *\n * @example\n * redactWell(well, { operation: false }); // whole section\n * redactWell(well, { meters: false, permits: false }); // single fields\n */\nexport function redactWell(\n well: Well,\n visibility: WellVisibility | SectionVisibility,\n): Well {\n const v = visibility as WellVisibility;\n const redacted: Well = { ...well };\n\n const sectionOf = (field: VisibilityFieldKey): SectionKey =>\n SECTION_KEYS.find(s => VISIBILITY_TREE[s].includes(field))!;\n const hidden = (key: VisibilityKey): boolean =>\n v[key] === false ||\n (!SECTION_KEYS.includes(key as SectionKey) &&\n v[sectionOf(key as VisibilityFieldKey)] === false);\n const sectionHidden = (section: SectionKey): boolean =>\n v[section] === false ||\n (VISIBILITY_TREE[section].length > 0 &&\n VISIBILITY_TREE[section].every(f => v[f] === false));\n\n // general\n if (hidden('identification')) {\n delete redacted.well_id;\n delete redacted.well_type;\n delete redacted.well_purpose;\n delete redacted.name;\n delete redacted.well_driller;\n delete redacted.construction_date;\n }\n if (hidden('location')) {\n delete redacted.location;\n delete redacted.lat;\n delete redacted.lng;\n delete redacted.elevation;\n }\n if (hidden('obs')) delete redacted.obs;\n if (hidden('attachments')) delete redacted.attachments;\n\n // constructive\n if (hidden('bore_hole')) redacted.bore_hole = [];\n if (hidden('surface_case')) redacted.surface_case = [];\n if (hidden('well_case')) redacted.well_case = [];\n if (hidden('reduction')) redacted.reduction = [];\n if (hidden('well_screen')) redacted.well_screen = [];\n if (hidden('hole_fill')) redacted.hole_fill = [];\n if (hidden('centralizers')) delete redacted.centralizers;\n if (hidden('cement_pad')) delete redacted.cement_pad;\n if (sectionHidden('constructive')) delete redacted.well_depth;\n\n // geology\n if (hidden('lithology')) redacted.lithology = [];\n if (hidden('fractures')) redacted.fractures = [];\n if (hidden('caves')) redacted.caves = [];\n\n // hydrodynamic\n if (hidden('hydrodynamic_events')) redacted.hydrodynamic_events = [];\n if (hidden('aquifer_analysis')) redacted.aquifer_analysis = [];\n\n // history\n if (hidden('history')) redacted.history_logs = [];\n\n // operation\n if (hidden('pump_installations')) delete redacted.pump_installations;\n if (hidden('meters')) delete redacted.meters;\n if (hidden('operating_regime')) delete redacted.operating_regime;\n if (hidden('production')) delete redacted.production;\n if (hidden('permits')) delete redacted.permits;\n\n // water quality\n if (hidden('water_quality')) delete redacted.water_samples;\n\n // unknown root members\n if (Object.values(v).some(shown => shown === false)) {\n for (const key of unknownRootKeys(redacted))\n delete (redacted as unknown as RawJSON)[key];\n }\n\n return redacted;\n}\n\n/**\n * Parses a JSON string produced by {@link serializeWell} (or older legacy\n * formats) and returns a normalized {@link Well} object.\n *\n * Handles:\n * - Versioned format v1 and v2\n * - Legacy format with `constructive` / `geologic` sub-objects\n * - Legacy `diam_pol` inch diameters → `diameter` mm conversion\n * - Typo `bole_hole` → `bore_hole` compatibility\n * - v1→v2 normalizations: `fgdc_texture`, `screen_slot_mm`, `lat/lng/elevation → location`\n *\n * @param jsonString - Raw JSON string to parse.\n * @returns A normalized {@link Well}, or `null` if the parsed data is empty.\n * @throws {Error} If `jsonString` is not valid JSON.\n * @throws {Error} If the `version` field is present but not supported.\n */\nexport function deserializeWell(jsonString: string): Well | null {\n let raw: RawJSON;\n try {\n raw = JSON.parse(jsonString) as RawJSON;\n } catch {\n throw new Error('Invalid profile format');\n }\n\n if (typeof raw !== 'object' || raw === null || Array.isArray(raw)) {\n throw new Error('Invalid profile format');\n }\n\n if (raw.version !== undefined) {\n const parsed = parseFormatVersion(raw.version);\n if (!parsed) {\n throw new Error(\n `Malformed .well format version: ${JSON.stringify(raw.version)}`,\n );\n }\n if (parsed.major === 2) return withCalculatedWellDepth(decodeV2Well(raw));\n if (parsed.major === 1) return withCalculatedWellDepth(decodeV1Well(raw));\n throw new Error(\n `Unsupported .well format version: ${JSON.stringify(raw.version)}`,\n );\n }\n\n if (isWellEmpty(raw as unknown as Well)) return null;\n\n const constructiveSource = (raw.constructive ?? raw) as RawJSON;\n\n const metadata: Partial<Well> = {\n ...(raw.well_type !== undefined && { well_type: raw.well_type as string }),\n ...(raw.name !== undefined && { name: raw.name as string }),\n ...(raw.well_driller !== undefined && {\n well_driller: raw.well_driller as string,\n }),\n ...(raw.construction_date !== undefined && {\n construction_date: raw.construction_date as string,\n }),\n ...(raw.lat !== undefined && { lat: raw.lat as number }),\n ...(raw.lng !== undefined && { lng: raw.lng as number }),\n ...(raw.elevation !== undefined && { elevation: raw.elevation as number }),\n ...(raw.obs !== undefined && { obs: raw.obs as string }),\n };\n\n return withCalculatedWellDepth({\n ...createEmptyWell(),\n ...metadata,\n ...normalizeConstructive(constructiveSource),\n ...normalizeGeologic(raw),\n });\n}\n\n// ─── Backward-compat aliases ─────────────────────────────────────────────────\n\n/** @deprecated Use {@link serializeWell} */\nexport const profileToWell = serializeWell;\n/** @deprecated Use {@link isWellEmpty} */\nexport const checkIfProfileIsEmpty = isWellEmpty;\n/** @deprecated Use {@link deserializeWell} */\nexport const convertProfileFromJSON = deserializeWell;\n","import { TextureOption } from '../types/textures';\n\nexport const FGDC_TEXTURES_OPTIONS: TextureOption[] = [\n // --- Surficial Patterns (Series 100) ---\n { code: 101, label: 'Unconsolidated material', pending: true },\n { code: 102, label: 'Alluvium', pending: true },\n { code: 103, label: 'Terrace deposit', pending: true },\n { code: 104, label: 'Floodplain deposit', pending: true },\n { code: 105, label: 'Fan or pediment deposit', pending: true },\n { code: 106, label: 'Eolian sand', pending: true },\n { code: 107, label: 'Silt or loess', pending: true },\n { code: 108, label: 'Clay deposit', pending: true },\n { code: 109, label: 'Colluvium', pending: true },\n { code: 110, label: 'Gravel deposit', pending: true },\n { code: 111, label: 'Residual deposit', pending: true },\n { code: 112, label: 'Playa deposit', pending: true },\n { code: 113, label: 'Lacustrine deposit', pending: true },\n { code: 114, label: 'Marine deposit', pending: true },\n { code: 115, label: 'Beach or bar deposit', pending: true },\n { code: 116, label: 'Organic deposit or peat', pending: true },\n { code: 117, label: 'Swamp or marsh deposit', pending: true },\n { code: 118, label: 'Soil', pending: true },\n { code: 119, label: 'Fill or artificial deposit', pending: true },\n { code: 120, label: 'Surficial pattern 120' },\n { code: 121, label: 'Surficial pattern 121', pending: true },\n { code: 122, label: 'Surficial pattern 122', pending: true },\n { code: 123, label: 'Surficial pattern 123' },\n { code: 124, label: 'Surficial pattern 124', pending: true },\n { code: 125, label: 'Surficial pattern 125', pending: true },\n { code: 126, label: 'Surficial pattern 126', pending: true },\n { code: 127, label: 'Surficial pattern 127', pending: true },\n { code: 128, label: 'Surficial pattern 128', pending: true },\n { code: 129, label: 'Surficial pattern 129', pending: true },\n { code: 130, label: 'Surficial pattern 130', pending: true },\n { code: 131, label: 'Surficial pattern 131', pending: true },\n { code: 132, label: 'Surficial pattern 132' },\n { code: 133, label: 'Surficial pattern 133', pending: true },\n { code: 134, label: 'Surficial pattern 134', pending: true },\n { code: 135, label: 'Surficial pattern 135', pending: true },\n { code: 136, label: 'Surficial pattern 136', pending: true },\n { code: 137, label: 'Surficial pattern 137', pending: true },\n // --- Sedimentary Patterns (Series 200) ---\n { code: 201, label: 'Sedimentary pattern 201', pending: true },\n { code: 202, label: 'Sedimentary pattern 202', pending: true },\n { code: 203, label: 'Sedimentary pattern 203', pending: true },\n { code: 204, label: 'Sedimentary pattern 204', pending: true },\n { code: 205, label: 'Sedimentary pattern 205', pending: true },\n { code: 206, label: 'Sedimentary pattern 206', pending: true },\n { code: 207, label: 'Sedimentary pattern 207', pending: true },\n { code: 208, label: 'Sedimentary pattern 208', pending: true },\n { code: 209, label: 'Sedimentary pattern 209', pending: true },\n { code: 210, label: 'Sedimentary pattern 210', pending: true },\n { code: 211, label: 'Sedimentary pattern 211', pending: true },\n { code: 212, label: 'Sedimentary pattern 212', pending: true },\n { code: 213, label: 'Sedimentary pattern 213', pending: true },\n { code: 214, label: 'Sedimentary pattern 214', pending: true },\n { code: 215, label: 'Sedimentary pattern 215', pending: true },\n { code: 216, label: 'Sedimentary pattern 216', pending: true },\n { code: 217, label: 'Sedimentary pattern 217', pending: true },\n { code: 218, label: 'Sedimentary pattern 218', pending: true },\n { code: 219, label: 'Sedimentary pattern 219', pending: true },\n { code: 220, label: 'Sedimentary pattern 220', pending: true },\n { code: 221, label: 'Sedimentary pattern 221', pending: true },\n { code: 222, label: 'Sedimentary pattern 222', pending: true },\n { code: 223, label: 'Sedimentary pattern 223', pending: true },\n { code: 224, label: 'Sedimentary pattern 224', pending: true },\n { code: 225, label: 'Sedimentary pattern 225', pending: true },\n { code: 226, label: 'Sedimentary pattern 226', pending: true },\n { code: 227, label: 'Sedimentary pattern 227', pending: true },\n { code: 228, label: 'Sedimentary pattern 228', pending: true },\n { code: 229, label: 'Sedimentary pattern 229', pending: true },\n { code: 230, label: 'Sedimentary pattern 230', pending: true },\n { code: 231, label: 'Sedimentary pattern 231', pending: true },\n { code: 232, label: 'Sedimentary pattern 232', pending: true },\n { code: 233, label: 'Sedimentary pattern 233', pending: true },\n // --- Igneous Patterns (Series 300) ---\n { code: 301, label: 'Igneous pattern 301', pending: true },\n { code: 302, label: 'Igneous pattern 302', pending: true },\n { code: 303, label: 'Igneous pattern 303', pending: true },\n { code: 304, label: 'Igneous pattern 304', pending: true },\n { code: 305, label: 'Igneous pattern 305', pending: true },\n { code: 306, label: 'Igneous pattern 306', pending: true },\n { code: 307, label: 'Igneous pattern 307', pending: true },\n { code: 308, label: 'Igneous pattern 308', pending: true },\n { code: 309, label: 'Igneous pattern 309', pending: true },\n { code: 310, label: 'Igneous pattern 310', pending: true },\n { code: 311, label: 'Igneous pattern 311', pending: true },\n { code: 312, label: 'Igneous pattern 312', pending: true },\n { code: 313, label: 'Igneous pattern 313', pending: true },\n { code: 314, label: 'Igneous pattern 314', pending: true },\n { code: 315, label: 'Igneous pattern 315', pending: true },\n { code: 316, label: 'Igneous pattern 316', pending: true },\n { code: 317, label: 'Igneous pattern 317', pending: true },\n { code: 318, label: 'Igneous pattern 318', pending: true },\n { code: 319, label: 'Igneous pattern 319', pending: true },\n { code: 320, label: 'Igneous pattern 320', pending: true },\n { code: 321, label: 'Igneous pattern 321', pending: true },\n { code: 322, label: 'Igneous pattern 322', pending: true },\n { code: 323, label: 'Igneous pattern 323', pending: true },\n { code: 324, label: 'Igneous pattern 324', pending: true },\n { code: 325, label: 'Igneous pattern 325', pending: true },\n { code: 326, label: 'Igneous pattern 326', pending: true },\n { code: 327, label: 'Igneous pattern 327', pending: true },\n { code: 328, label: 'Igneous pattern 328', pending: true },\n { code: 329, label: 'Igneous pattern 329', pending: true },\n { code: 330, label: 'Igneous pattern 330', pending: true },\n { code: 331, label: 'Igneous pattern 331', pending: true },\n // --- Miscellaneous and Metamorphic Patterns (Series 400) ---\n { code: 401, label: 'Miscellaneous pattern 401', pending: true },\n { code: 402, label: 'Miscellaneous pattern 402', pending: true },\n { code: 403, label: 'Miscellaneous pattern 403', pending: true },\n { code: 404, label: 'Miscellaneous pattern 404', pending: true },\n { code: 405, label: 'Miscellaneous pattern 405', pending: true },\n { code: 406, label: 'Miscellaneous pattern 406', pending: true },\n { code: 407, label: 'Miscellaneous pattern 407', pending: true },\n { code: 408, label: 'Miscellaneous pattern 408', pending: true },\n { code: 409, label: 'Miscellaneous pattern 409', pending: true },\n { code: 410, label: 'Miscellaneous pattern 410', pending: true },\n { code: 411, label: 'Miscellaneous pattern 411', pending: true },\n { code: 412, label: 'Miscellaneous pattern 412', pending: true },\n { code: 413, label: 'Miscellaneous pattern 413', pending: true },\n { code: 414, label: 'Miscellaneous pattern 414', pending: true },\n { code: 415, label: 'Miscellaneous pattern 415', pending: true },\n { code: 416, label: 'Miscellaneous pattern 416', pending: true },\n { code: 417, label: 'Miscellaneous pattern 417', pending: true },\n { code: 418, label: 'Miscellaneous pattern 418', pending: true },\n { code: 419, label: 'Miscellaneous pattern 419', pending: true },\n { code: 420, label: 'Miscellaneous pattern 420', pending: true },\n { code: 421, label: 'Miscellaneous pattern 421', pending: true },\n { code: 422, label: 'Miscellaneous pattern 422', pending: true },\n { code: 423, label: 'Miscellaneous pattern 423', pending: true },\n { code: 424, label: 'Miscellaneous pattern 424', pending: true },\n { code: 425, label: 'Miscellaneous pattern 425', pending: true },\n { code: 426, label: 'Miscellaneous pattern 426', pending: true },\n { code: 427, label: 'Miscellaneous pattern 427', pending: true },\n { code: 428, label: 'Miscellaneous pattern 428', pending: true },\n { code: 429, label: 'Miscellaneous pattern 429', pending: true },\n { code: 430, label: 'Miscellaneous pattern 430', pending: true },\n { code: 431, label: 'Miscellaneous pattern 431', pending: true },\n { code: 432, label: 'Miscellaneous pattern 432', pending: true },\n { code: 433, label: 'Miscellaneous pattern 433', pending: true },\n { code: 434, label: 'Miscellaneous pattern 434', pending: true },\n { code: 435, label: 'Miscellaneous pattern 435', pending: true },\n { code: 436, label: 'Miscellaneous pattern 436', pending: true },\n // --- Glacial Patterns (Series 500) ---\n { code: 521, label: 'Glacial pattern 521', pending: true },\n { code: 522, label: 'Glacial pattern 522', pending: true },\n { code: 523, label: 'Glacial pattern 523', pending: true },\n { code: 524, label: 'Glacial pattern 524', pending: true },\n { code: 530, label: 'Glacial pattern 530', pending: true },\n { code: 531, label: 'Glacial pattern 531', pending: true },\n { code: 532, label: 'Glacial pattern 532', pending: true },\n { code: 533, label: 'Glacial pattern 533', pending: true },\n { code: 534, label: 'Glacial pattern 534', pending: true },\n { code: 535, label: 'Glacial pattern 535', pending: true },\n { code: 536, label: 'Glacial pattern 536', pending: true },\n { code: 537, label: 'Glacial pattern 537', pending: true },\n { code: 538, label: 'Glacial pattern 538', pending: true },\n { code: 580, label: 'Glacial pattern 580', pending: true },\n { code: 581, label: 'Glacial pattern 581', pending: true },\n { code: 582, label: 'Glacial pattern 582', pending: true },\n { code: 583, label: 'Glacial pattern 583', pending: true },\n { code: 584, label: 'Glacial pattern 584', pending: true },\n { code: 585, label: 'Glacial pattern 585', pending: true },\n { code: 586, label: 'Glacial pattern 586', pending: true },\n { code: 587, label: 'Glacial pattern 587', pending: true },\n { code: 588, label: 'Glacial pattern 588', pending: true },\n { code: 589, label: 'Glacial pattern 589', pending: true },\n { code: 591, label: 'Periglacial pattern 591', pending: true },\n { code: 592, label: 'Periglacial pattern 592', pending: true },\n { code: 593, label: 'Periglacial pattern 593', pending: true },\n { code: 594, label: 'Periglacial pattern 594', pending: true },\n { code: 595, label: 'Periglacial pattern 595', pending: true },\n // --- Sedimentary Lithology Patterns (Series 600) ---\n { code: 601, label: 'Gravel or conglomerate (1st option)' },\n { code: 602, label: 'Gravel or conglomerate (2nd option)' },\n { code: 603, label: 'Crossbedded gravel or conglomerate' },\n { code: 605, label: 'Breccia (1st option)' },\n { code: 606, label: 'Breccia (2nd option)' },\n { code: 607, label: 'Massive sand or sandstone' },\n { code: 608, label: 'Bedded sand or sandstone' },\n { code: 609, label: 'Crossbedded sand or sandstone (1st option)' },\n { code: 610, label: 'Crossbedded sand or sandstone (2nd option)' },\n { code: 611, label: 'Ripple-bedded sand or sandstone' },\n { code: 612, label: 'Argillaceous or shaly sandstone' },\n { code: 613, label: 'Calcareous sandstone' },\n { code: 614, label: 'Dolomitic sandstone' },\n { code: 616, label: 'Silt, siltstone, or shaly silt' },\n { code: 617, label: 'Calcareous siltstone' },\n { code: 618, label: 'Dolomitic siltstone' },\n { code: 619, label: 'Sandy or silty shale' },\n { code: 620, label: 'Clay or clay shale' },\n { code: 621, label: 'Cherty shale' },\n { code: 622, label: 'Dolomitic shale' },\n { code: 623, label: 'Calcareous shale or marl' },\n { code: 624, label: 'Carbonaceous shale' },\n { code: 625, label: 'Oil shale' },\n { code: 626, label: 'Chalk' },\n { code: 627, label: 'Limestone' },\n { code: 628, label: 'Clastic limestone' },\n { code: 629, label: 'Fossiliferous clastic limestone' },\n { code: 630, label: 'Nodular or irregularly bedded limestone' },\n {\n code: 631,\n label: 'Limestone, irregular (burrow?) fillings of saccharoidal dolomite',\n },\n { code: 632, label: 'Crossbedded limestone' },\n { code: 633, label: 'Cherty crossbedded limestone' },\n { code: 634, label: 'Cherty and sandy crossbedded clastic limestone' },\n { code: 635, label: 'Oolitic limestone' },\n { code: 636, label: 'Sandy limestone' },\n { code: 637, label: 'Silty limestone' },\n { code: 638, label: 'Argillaceous or shaly limestone' },\n { code: 639, label: 'Cherty limestone (1st option)' },\n { code: 640, label: 'Cherty limestone (2nd option)' },\n { code: 641, label: 'Dolomitic limestone, limy dolostone, or limy dolomite' },\n { code: 642, label: 'Dolostone or dolomite' },\n { code: 643, label: 'Crossbedded dolostone or dolomite' },\n { code: 644, label: 'Oolitic dolostone or dolomite' },\n { code: 645, label: 'Sandy dolostone or dolomite' },\n { code: 646, label: 'Silty dolostone or dolomite' },\n { code: 647, label: 'Argillaceous or shaly dolostone or dolomite' },\n { code: 648, label: 'Cherty dolostone or dolomite' },\n { code: 649, label: 'Bedded chert (1st option)' },\n { code: 650, label: 'Bedded chert (2nd option)' },\n { code: 651, label: 'Fossiliferous bedded chert' },\n { code: 652, label: 'Fossiliferous rock' },\n { code: 653, label: 'Diatomaceous rock' },\n { code: 654, label: 'Subgraywacke' },\n { code: 655, label: 'Crossbedded subgraywacke' },\n { code: 656, label: 'Ripple-bedded subgraywacke' },\n { code: 657, label: 'Peat' },\n { code: 658, label: 'Coal' },\n { code: 659, label: 'Bony coal or impure coal' },\n { code: 660, label: 'Underclay' },\n { code: 661, label: 'Flint clay' },\n { code: 662, label: 'Bentonite' },\n { code: 663, label: 'Glauconite' },\n { code: 664, label: 'Limonite' },\n { code: 665, label: 'Siderite' },\n { code: 666, label: 'Phosphatic-nodular rock' },\n { code: 667, label: 'Gypsum' },\n { code: 668, label: 'Salt' },\n { code: 669, label: 'Interbedded sandstone and siltstone' },\n { code: 670, label: 'Interbedded sandstone and shale' },\n { code: 671, label: 'Interbedded ripple-bedded sandstone and shale' },\n {\n code: 672,\n label: 'Interbedded shale and silty limestone (shale dominant)',\n },\n {\n code: 673,\n label: 'Interbedded shale and limestone, shale dominant (1st option)',\n },\n {\n code: 674,\n label: 'Interbedded shale and limestone, shale dominant (2nd option)',\n },\n {\n code: 675,\n label: 'Interbedded calcareous shale and limestone (shale dominant)',\n },\n { code: 676, label: 'Interbedded silty limestone and shale' },\n { code: 677, label: 'Interbedded limestone and shale (1st option)' },\n { code: 678, label: 'Interbedded limestone and shale (2nd option)' },\n { code: 679, label: 'Interbedded limestone and shale (limestone dominant)' },\n { code: 680, label: 'Interbedded limestone and calcareous shale' },\n { code: 681, label: 'Till or diamicton (1st option)' },\n { code: 682, label: 'Till or diamicton (2nd option)' },\n { code: 683, label: 'Till or diamicton (3rd option)' },\n { code: 684, label: 'Loess (1st option)' },\n { code: 685, label: 'Loess (2nd option)' },\n { code: 686, label: 'Loess (3rd option)' },\n // --- Metamorphic Lithology Patterns (Series 700) ---\n { code: 701, label: 'Metamorphism' },\n { code: 702, label: 'Quartzite' },\n { code: 703, label: 'Slate' },\n { code: 704, label: 'Schistose or gneissoid granite' },\n { code: 705, label: 'Schist' },\n { code: 706, label: 'Contorted schist' },\n { code: 707, label: 'Schist and gneiss' },\n { code: 708, label: 'Gneiss' },\n { code: 709, label: 'Contorted gneiss' },\n { code: 710, label: 'Soapstone, talc, or serpentinite' },\n // --- Igneous and Vein-Matter Lithology Patterns (Series 700 continued) ---\n { code: 711, label: 'Tuffaceous rock' },\n { code: 712, label: 'Crystal tuff' },\n { code: 713, label: 'Devitrified tuff' },\n { code: 714, label: 'Volcanic breccia and tuff' },\n { code: 715, label: 'Volcanic breccia or agglomerate' },\n { code: 716, label: 'Zeolitic rock' },\n { code: 717, label: 'Basaltic flows' },\n { code: 718, label: 'Granite (1st option)' },\n { code: 719, label: 'Granite (2nd option)' },\n { code: 720, label: 'Banded igneous rock' },\n { code: 721, label: 'Igneous rock (1st option)' },\n { code: 722, label: 'Igneous rock (2nd option)' },\n { code: 723, label: 'Igneous rock (3rd option)' },\n { code: 724, label: 'Igneous rock (4th option)' },\n { code: 725, label: 'Igneous rock (5th option)' },\n { code: 726, label: 'Igneous rock (6th option)' },\n { code: 727, label: 'Igneous rock (7th option)' },\n { code: 728, label: 'Igneous rock (8th option)' },\n { code: 729, label: 'Porphyritic rock (1st option)' },\n { code: 730, label: 'Porphyritic rock (2nd option)' },\n { code: 731, label: 'Vitrophyre' },\n { code: 732, label: 'Quartz' },\n { code: 733, label: 'Ore' },\n];\n","/**\n * Jurisdiction limit sets for water quality results.\n *\n * Limits are never written to `.well` files (jurisdiction neutrality): a\n * consumer picks a set at display time and compares results with the\n * `getExceedances` helper of `@welldot/utils`.\n *\n * IMPORTANT: values below are transcribed from the cited sources and MUST be\n * verified against the official documents before regulatory use. Only\n * parameters of the core `welldot` vocabulary are included; values are in\n * the parameter's canonical unit (mg/L for substances).\n */\n\n/** Why a limit exists. */\nexport type LimitBasis = 'health' | 'aesthetic' | 'indicator' | 'operational';\n\n/** One limit for one parameter code. */\nexport type Limit = {\n /** `welldot` parameter code. */\n code: string;\n /** Maximum allowed value (inclusive), in the code's canonical unit. */\n max?: number;\n /** Minimum allowed value (inclusive), in the code's canonical unit. */\n min?: number;\n /** `false` for presence/absence parameters that must be absent. */\n presence_allowed?: false;\n /** Restricts the limit to one analytical fraction. */\n fraction?: 'total' | 'dissolved' | 'suspended';\n basis?: LimitBasis;\n /** Provisional values, alternative bases, transition dates, etc. */\n note?: string;\n};\n\n/** A selectable set of limits from one jurisdiction or guideline. */\nexport type LimitSet = {\n id: string;\n name: string;\n /** ISO 3166 code, `EU`, or `INT` for international guidelines. */\n jurisdiction: string;\n /** Citation of the source document. */\n source: string;\n limits: readonly Limit[];\n};\n\n/**\n * Turbidity codes that compare against nephelometric turbidity limits.\n * `turbidity_fau` (attenuation) is never compared.\n */\nexport const NEPHELOMETRIC_TURBIDITY_CODES: readonly string[] = [\n 'turbidity',\n 'turbidity_ntu',\n 'turbidity_fnu',\n];\n\n/** WHO Guidelines for Drinking-water Quality, 4th ed. + 1st/2nd addenda (2022). */\nexport const WHO_GDWQ_2022: LimitSet = {\n id: 'who_gdwq_2022',\n name: 'WHO Guidelines for Drinking-water Quality (2022)',\n jurisdiction: 'INT',\n source:\n 'WHO, Guidelines for drinking-water quality: 4th edition incorporating the first and second addenda, 2022',\n limits: [\n { code: 'antimony', max: 0.02, basis: 'health' },\n { code: 'arsenic', max: 0.01, basis: 'health', note: 'provisional' },\n { code: 'barium', max: 1.3, basis: 'health' },\n { code: 'boron', max: 2.4, basis: 'health' },\n { code: 'cadmium', max: 0.003, basis: 'health' },\n { code: 'chromium', max: 0.05, basis: 'health', note: 'provisional' },\n { code: 'copper', max: 2, basis: 'health' },\n { code: 'fluoride', max: 1.5, basis: 'health' },\n { code: 'lead', max: 0.01, basis: 'health', note: 'provisional' },\n { code: 'manganese', max: 0.08, basis: 'health', note: 'provisional' },\n { code: 'mercury', max: 0.006, basis: 'health', note: 'inorganic mercury' },\n { code: 'nickel', max: 0.07, basis: 'health' },\n { code: 'nitrate_as_no3', max: 50, basis: 'health' },\n { code: 'nitrite_as_no2', max: 3, basis: 'health' },\n { code: 'selenium', max: 0.04, basis: 'health', note: 'provisional' },\n { code: 'uranium', max: 0.03, basis: 'health', note: 'provisional' },\n { code: 'e_coli', presence_allowed: false, basis: 'health' },\n {\n code: 'thermotolerant_coliforms',\n presence_allowed: false,\n basis: 'health',\n },\n { code: 'gross_alpha', max: 0.5, basis: 'health', note: 'screening level' },\n { code: 'gross_beta', max: 1, basis: 'health', note: 'screening level' },\n ],\n};\n\n/** Brazil — Portaria GM/MS nº 888/2021 (drinking water potability standard). */\nexport const BR_GM_MS_888_2021: LimitSet = {\n id: 'br_gm_ms_888_2021',\n name: 'Brasil — Portaria GM/MS 888/2021',\n jurisdiction: 'BR',\n source: 'Ministério da Saúde, Portaria GM/MS nº 888, de 4 de maio de 2021',\n limits: [\n // Inorganic substances (health)\n { code: 'antimony', max: 0.006, basis: 'health' },\n { code: 'arsenic', max: 0.01, basis: 'health' },\n { code: 'barium', max: 0.7, basis: 'health' },\n { code: 'cadmium', max: 0.003, basis: 'health' },\n { code: 'lead', max: 0.01, basis: 'health' },\n { code: 'cyanide_total_as_cn', max: 0.07, basis: 'health' },\n { code: 'copper', max: 2, basis: 'health' },\n { code: 'chromium', max: 0.05, basis: 'health' },\n { code: 'fluoride', max: 1.5, basis: 'health' },\n { code: 'mercury', max: 0.001, basis: 'health' },\n { code: 'nickel', max: 0.07, basis: 'health' },\n { code: 'nitrate_as_n', max: 10, basis: 'health' },\n { code: 'nitrite_as_n', max: 1, basis: 'health' },\n { code: 'selenium', max: 0.04, basis: 'health' },\n { code: 'uranium', max: 0.03, basis: 'health' },\n // Organoleptic standard\n { code: 'aluminum', max: 0.2, basis: 'aesthetic' },\n { code: 'ammonia_as_nh3', max: 1.2, basis: 'aesthetic' },\n { code: 'chloride', max: 250, basis: 'aesthetic' },\n { code: 'apparent_color', max: 15, basis: 'aesthetic' },\n { code: 'hardness_total_as_caco3', max: 300, basis: 'aesthetic' },\n { code: 'iron', max: 0.3, basis: 'aesthetic' },\n { code: 'manganese', max: 0.1, basis: 'aesthetic' },\n { code: 'sodium', max: 200, basis: 'aesthetic' },\n { code: 'total_dissolved_solids', max: 500, basis: 'aesthetic' },\n { code: 'sulfate', max: 250, basis: 'aesthetic' },\n {\n code: 'turbidity',\n max: 5,\n basis: 'aesthetic',\n note: 'organoleptic standard (uT)',\n },\n // Operational\n {\n code: 'ph',\n min: 6,\n max: 9,\n basis: 'operational',\n note: 'recommended range',\n },\n {\n code: 'free_chlorine',\n min: 0.2,\n max: 5,\n basis: 'operational',\n note: 'residual in the distribution system',\n },\n // Microbiological\n { code: 'e_coli', presence_allowed: false, basis: 'health' },\n {\n code: 'total_coliforms',\n presence_allowed: false,\n basis: 'indicator',\n note: 'tolerances apply by system size and sampling point',\n },\n // Radioactivity\n { code: 'gross_alpha', max: 0.5, basis: 'health', note: 'screening level' },\n { code: 'gross_beta', max: 1, basis: 'health', note: 'screening level' },\n { code: 'radium_226', max: 1, basis: 'health' },\n { code: 'radium_228', max: 0.1, basis: 'health' },\n ],\n};\n\n/** EU — Directive (EU) 2020/2184 on the quality of water intended for human consumption. */\nexport const EU_2020_2184: LimitSet = {\n id: 'eu_2020_2184',\n name: 'EU Drinking Water Directive 2020/2184',\n jurisdiction: 'EU',\n source:\n 'Directive (EU) 2020/2184 of the European Parliament and of the Council, Annex I',\n limits: [\n // Part A — microbiological\n { code: 'e_coli', presence_allowed: false, basis: 'health' },\n // Part B — chemical\n { code: 'antimony', max: 0.01, basis: 'health' },\n { code: 'arsenic', max: 0.01, basis: 'health' },\n {\n code: 'boron',\n max: 1.5,\n basis: 'health',\n note: '2.4 mg/L where desalinated water is the predominant source',\n },\n { code: 'cadmium', max: 0.005, basis: 'health' },\n {\n code: 'chromium',\n max: 0.05,\n basis: 'health',\n note: '0.025 mg/L from 12 January 2036',\n },\n { code: 'copper', max: 2, basis: 'health' },\n { code: 'cyanide_total_as_cn', max: 0.05, basis: 'health' },\n { code: 'fluoride', max: 1.5, basis: 'health' },\n {\n code: 'lead',\n max: 0.01,\n basis: 'health',\n note: '0.005 mg/L from 12 January 2036',\n },\n { code: 'mercury', max: 0.001, basis: 'health' },\n { code: 'nickel', max: 0.02, basis: 'health' },\n { code: 'nitrate_as_no3', max: 50, basis: 'health' },\n { code: 'nitrite_as_no2', max: 0.5, basis: 'health', note: 'at the tap' },\n { code: 'selenium', max: 0.02, basis: 'health' },\n { code: 'uranium', max: 0.03, basis: 'health' },\n // Part C — indicator parameters\n { code: 'aluminum', max: 0.2, basis: 'indicator' },\n { code: 'chloride', max: 250, basis: 'indicator' },\n {\n code: 'specific_conductance',\n max: 2500,\n basis: 'indicator',\n note: 'directive value is at 20 °C',\n },\n { code: 'ph', min: 6.5, max: 9.5, basis: 'indicator' },\n { code: 'iron', max: 0.2, basis: 'indicator' },\n { code: 'manganese', max: 0.05, basis: 'indicator' },\n { code: 'sodium', max: 200, basis: 'indicator' },\n { code: 'sulfate', max: 250, basis: 'indicator' },\n { code: 'total_coliforms', presence_allowed: false, basis: 'indicator' },\n ],\n};\n\n/** All bundled limit sets, in display order. */\nexport const WATER_QUALITY_LIMIT_SETS: readonly LimitSet[] = [\n WHO_GDWQ_2022,\n BR_GM_MS_888_2021,\n EU_2020_2184,\n];\n\n/** Finds a bundled limit set by `id`. */\nexport function getLimitSet(id: string): LimitSet | undefined {\n return WATER_QUALITY_LIMIT_SETS.find(s => s.id === id);\n}\n","import type { LanguageText, LanguageTextInput } from '../types/language.types';\n\n/**\n * The {@link LanguageText} encoded in a JSON object string, keeping only its\n * non-empty string entries (possibly none). `undefined` when `value` is not a\n * JSON object.\n */\nfunction parseLanguageTextJson(value: string): LanguageText | undefined {\n const trimmed = value.trim();\n if (!trimmed.startsWith('{') || !trimmed.endsWith('}')) return undefined;\n let parsed: unknown;\n try {\n parsed = JSON.parse(trimmed);\n } catch {\n return undefined;\n }\n if (typeof parsed !== 'object' || parsed === null || Array.isArray(parsed)) {\n return undefined;\n }\n const entries = Object.entries(parsed).filter(\n (entry): entry is [string, string] =>\n typeof entry[1] === 'string' && entry[1].trim() !== '',\n );\n return Object.fromEntries(entries);\n}\n\n/**\n * Resolves `text` to a single string for `locale`: exact tag, then its base\n * language (`pt-BR` → `pt`), then `fallback`, then the first available value.\n * Empty labels count as missing.\n *\n * - A plain string is locale-invariant and returned as-is.\n * - A JSON object string (`'{\"en\":\"Pump\",\"pt\":\"Bomba\"}'`) is parsed and\n * resolved like the object; malformed JSON is treated as a plain string.\n * - `null` / `undefined`, and objects (or JSON objects) with no usable label,\n * resolve to `''`.\n */\nexport function resolveLanguageText(\n text: LanguageTextInput,\n locale: string,\n fallback = 'en',\n): string {\n if (text == null) return '';\n const labels = typeof text === 'string' ? parseLanguageTextJson(text) : text;\n if (labels === undefined) return text as string;\n\n const base = locale.split('-')[0]!;\n const usable = (key: string) => {\n const value = labels[key];\n return typeof value === 'string' && value.trim() !== '' ? value : undefined;\n };\n return (\n usable(locale) ??\n usable(base) ??\n usable(fallback) ??\n Object.keys(labels)\n .map(usable)\n .find(v => v !== undefined) ??\n ''\n );\n}\n","import type { Parameter } from '../types/well.types';\nimport { resolveLanguageText } from '../utils/language.utils';\n\n/**\n * Version of the published `welldot` water quality parameter vocabulary.\n * Bumped whenever a code is added or a definition changes.\n */\nexport const WATER_QUALITY_VOCABULARY_VERSION = '1.0.0';\n\n/** Grouping used to organize the vocabulary (display only). */\nexport type ParameterGroup =\n | 'physical'\n | 'aggregate'\n | 'major_ion'\n | 'nutrient'\n | 'organic'\n | 'disinfection'\n | 'mining_redox'\n | 'metal'\n | 'microbiology'\n | 'radioactivity';\n\n/** Which value form a parameter's results use. */\nexport type ParameterForm = 'value' | 'presence' | 'text';\n\n/** Canonical unit of a parameter. `ucum` is absent where UCUM has no code. */\nexport type ParameterUnit = {\n /** Display symbol (e.g. `mg/L`, `µS/cm`, `NTU`). Empty for dimensionless. */\n symbol: string;\n /** UCUM code, when one exists. */\n ucum?: string;\n};\n\n/** One entry of the `welldot` parameter vocabulary. */\nexport type ParameterDefinition = {\n code: string;\n group: ParameterGroup;\n /** Canonical English label. */\n label: string;\n /** Translations of `label`, keyed by BCP 47 language tag. */\n labels: Record<string, string>;\n unit: ParameterUnit;\n form: ParameterForm;\n /** Published CAS equivalence: a `cas` result with this code is this parameter. */\n cas?: string;\n /**\n * Molar mass (g/mol) of the species the code is expressed as (e.g. N for\n * `nitrate_as_n`, CaCO₃ for alkalinities). Present for ions used in\n * ion-balance and hydrochemical derivations.\n */\n molar_mass?: number;\n /** Ionic charge of that species (signed). */\n charge?: number;\n};\n\nexport const WATER_QUALITY_UNITS = {\n mg_l: { symbol: 'mg/L', ucum: 'mg/L' },\n us_cm: { symbol: 'µS/cm', ucum: 'uS/cm' },\n celsius: { symbol: '°C', ucum: 'Cel' },\n mv: { symbol: 'mV', ucum: 'mV' },\n ph: { symbol: '', ucum: '[pH]' },\n ftu: { symbol: 'FTU' },\n ntu: { symbol: 'NTU' },\n fnu: { symbol: 'FNU' },\n fau: { symbol: 'FAU' },\n hazen: { symbol: 'uH' },\n mpn_100ml: { symbol: 'MPN/100 mL', ucum: '{MPN}/(100.mL)' },\n cfu_100ml: { symbol: 'CFU/100 mL', ucum: '{CFU}/(100.mL)' },\n cfu_ml: { symbol: 'CFU/mL', ucum: '{CFU}/mL' },\n bq_l: { symbol: 'Bq/L', ucum: 'Bq/L' },\n none: { symbol: '' },\n} as const satisfies Record<string, ParameterUnit>;\n\nconst U = WATER_QUALITY_UNITS;\n\ntype OptionalParameterFields = Partial<\n Pick<ParameterDefinition, 'cas' | 'molar_mass' | 'charge' | 'form'>\n>;\n\n/** Builds one vocabulary entry; `form` defaults to `value`. */\nfunction defineParameter(\n code: string,\n group: ParameterGroup,\n label: string,\n pt: string,\n unit: ParameterUnit,\n extra: OptionalParameterFields = {},\n): ParameterDefinition {\n return {\n code,\n group,\n label,\n labels: { pt },\n unit,\n form: extra.form ?? 'value',\n ...(extra.cas !== undefined && { cas: extra.cas }),\n ...(extra.molar_mass !== undefined && { molar_mass: extra.molar_mass }),\n ...(extra.charge !== undefined && { charge: extra.charge }),\n };\n}\n\n/** The core `welldot` parameter vocabulary (98 codes). */\nexport const WATER_QUALITY_PARAMETERS: readonly ParameterDefinition[] = [\n // Physical / field\n defineParameter(\n 'temperature',\n 'physical',\n 'Temperature',\n 'Temperatura',\n U.celsius,\n ),\n defineParameter('ph', 'physical', 'pH', 'pH', U.ph),\n defineParameter(\n 'specific_conductance',\n 'physical',\n 'Specific conductance at 25 °C',\n 'Condutividade elétrica a 25 °C',\n U.us_cm,\n ),\n defineParameter(\n 'conductivity_uncompensated',\n 'physical',\n 'Electrical conductivity, uncompensated',\n 'Condutividade sem compensação',\n U.us_cm,\n ),\n defineParameter(\n 'dissolved_oxygen',\n 'physical',\n 'Dissolved oxygen',\n 'Oxigênio dissolvido',\n U.mg_l,\n ),\n defineParameter(\n 'orp',\n 'physical',\n 'Oxidation-reduction potential vs. reference electrode',\n 'Potencial redox vs. eletrodo de referência',\n U.mv,\n ),\n defineParameter(\n 'eh',\n 'physical',\n 'Redox potential vs. SHE',\n 'Potencial redox corrigido vs. EPH',\n U.mv,\n ),\n defineParameter(\n 'turbidity',\n 'physical',\n 'Turbidity, formazin, method unspecified',\n 'Turbidez, formazina sem método identificado',\n U.ftu,\n ),\n defineParameter(\n 'turbidity_ntu',\n 'physical',\n 'Turbidity, nephelometric white light',\n 'Turbidez nefelométrica, luz branca',\n U.ntu,\n ),\n defineParameter(\n 'turbidity_fnu',\n 'physical',\n 'Turbidity, nephelometric infrared (ISO 7027)',\n 'Turbidez nefelométrica, infravermelho',\n U.fnu,\n ),\n defineParameter(\n 'turbidity_fau',\n 'physical',\n 'Turbidity, attenuation (ISO 7027)',\n 'Turbidez por atenuação',\n U.fau,\n ),\n defineParameter(\n 'apparent_color',\n 'physical',\n 'Apparent color',\n 'Cor aparente',\n U.hazen,\n ),\n defineParameter(\n 'true_color',\n 'physical',\n 'True color',\n 'Cor verdadeira',\n U.hazen,\n ),\n defineParameter('odor', 'physical', 'Odor', 'Odor', U.none, { form: 'text' }),\n defineParameter('taste', 'physical', 'Taste', 'Gosto', U.none, {\n form: 'text',\n }),\n defineParameter(\n 'total_dissolved_solids',\n 'physical',\n 'Total dissolved solids',\n 'Sólidos totais dissolvidos',\n U.mg_l,\n ),\n defineParameter(\n 'total_suspended_solids',\n 'physical',\n 'Total suspended solids',\n 'Sólidos suspensos totais',\n U.mg_l,\n ),\n defineParameter(\n 'total_solids',\n 'physical',\n 'Total solids',\n 'Sólidos totais',\n U.mg_l,\n ),\n defineParameter(\n 'free_co2',\n 'physical',\n 'Free carbon dioxide',\n 'Gás carbônico livre',\n U.mg_l,\n ),\n\n // Aggregate (expressed as CaCO₃: 100.087 g/mol, divalent → 50.04 mg/meq)\n defineParameter(\n 'alkalinity_total_as_caco3',\n 'aggregate',\n 'Total alkalinity as CaCO₃',\n 'Alcalinidade total como CaCO₃',\n U.mg_l,\n { molar_mass: 100.087, charge: -2 },\n ),\n defineParameter(\n 'alkalinity_bicarbonate_as_caco3',\n 'aggregate',\n 'Bicarbonate alkalinity as CaCO₃',\n 'Alcalinidade de bicarbonatos como CaCO₃',\n U.mg_l,\n { molar_mass: 100.087, charge: -2 },\n ),\n defineParameter(\n 'alkalinity_carbonate_as_caco3',\n 'aggregate',\n 'Carbonate alkalinity as CaCO₃',\n 'Alcalinidade de carbonatos como CaCO₃',\n U.mg_l,\n { molar_mass: 100.087, charge: -2 },\n ),\n defineParameter(\n 'alkalinity_hydroxide_as_caco3',\n 'aggregate',\n 'Hydroxide alkalinity as CaCO₃',\n 'Alcalinidade de hidróxidos como CaCO₃',\n U.mg_l,\n { molar_mass: 100.087, charge: -2 },\n ),\n defineParameter(\n 'acidity_total_as_caco3',\n 'aggregate',\n 'Total acidity as CaCO₃',\n 'Acidez total como CaCO₃',\n U.mg_l,\n { molar_mass: 100.087, charge: 2 },\n ),\n defineParameter(\n 'hardness_total_as_caco3',\n 'aggregate',\n 'Total hardness as CaCO₃',\n 'Dureza total como CaCO₃',\n U.mg_l,\n { molar_mass: 100.087, charge: 2 },\n ),\n defineParameter(\n 'hardness_calcium_as_caco3',\n 'aggregate',\n 'Calcium hardness as CaCO₃',\n 'Dureza de cálcio como CaCO₃',\n U.mg_l,\n { molar_mass: 100.087, charge: 2 },\n ),\n\n // Major ions\n defineParameter('calcium', 'major_ion', 'Calcium', 'Cálcio', U.mg_l, {\n cas: '7440-70-2',\n molar_mass: 40.078,\n charge: 2,\n }),\n defineParameter('magnesium', 'major_ion', 'Magnesium', 'Magnésio', U.mg_l, {\n cas: '7439-95-4',\n molar_mass: 24.305,\n charge: 2,\n }),\n defineParameter('sodium', 'major_ion', 'Sodium', 'Sódio', U.mg_l, {\n cas: '7440-23-5',\n molar_mass: 22.99,\n charge: 1,\n }),\n defineParameter('potassium', 'major_ion', 'Potassium', 'Potássio', U.mg_l, {\n cas: '7440-09-7',\n molar_mass: 39.098,\n charge: 1,\n }),\n defineParameter(\n 'bicarbonate',\n 'major_ion',\n 'Bicarbonate as HCO₃⁻',\n 'Bicarbonato como HCO₃⁻',\n U.mg_l,\n { cas: '71-52-3', molar_mass: 61.017, charge: -1 },\n ),\n defineParameter(\n 'carbonate',\n 'major_ion',\n 'Carbonate as CO₃²⁻',\n 'Carbonato como CO₃²⁻',\n U.mg_l,\n { cas: '3812-32-6', molar_mass: 60.009, charge: -2 },\n ),\n defineParameter('chloride', 'major_ion', 'Chloride', 'Cloreto', U.mg_l, {\n cas: '16887-00-6',\n molar_mass: 35.453,\n charge: -1,\n }),\n defineParameter('sulfate', 'major_ion', 'Sulfate', 'Sulfato', U.mg_l, {\n cas: '14808-79-8',\n molar_mass: 96.06,\n charge: -2,\n }),\n defineParameter('fluoride', 'major_ion', 'Fluoride', 'Fluoreto', U.mg_l, {\n cas: '16984-48-8',\n molar_mass: 18.998,\n charge: -1,\n }),\n defineParameter(\n 'silica_as_sio2',\n 'major_ion',\n 'Silica as SiO₂',\n 'Sílica como SiO₂',\n U.mg_l,\n { cas: '7631-86-9' },\n ),\n\n // Nutrients\n defineParameter(\n 'nitrate_as_n',\n 'nutrient',\n 'Nitrate as N',\n 'Nitrato como N',\n U.mg_l,\n {\n molar_mass: 14.007,\n charge: -1,\n },\n ),\n defineParameter(\n 'nitrate_as_no3',\n 'nutrient',\n 'Nitrate as NO₃⁻',\n 'Nitrato como NO₃⁻',\n U.mg_l,\n { cas: '14797-55-8', molar_mass: 62.004, charge: -1 },\n ),\n defineParameter(\n 'nitrite_as_n',\n 'nutrient',\n 'Nitrite as N',\n 'Nitrito como N',\n U.mg_l,\n {\n molar_mass: 14.007,\n charge: -1,\n },\n ),\n defineParameter(\n 'nitrite_as_no2',\n 'nutrient',\n 'Nitrite as NO₂⁻',\n 'Nitrito como NO₂⁻',\n U.mg_l,\n { cas: '14797-65-0', molar_mass: 46.005, charge: -1 },\n ),\n defineParameter(\n 'ammonia_as_n',\n 'nutrient',\n 'Ammonia nitrogen as N',\n 'Nitrogênio amoniacal como N',\n U.mg_l,\n { molar_mass: 14.007, charge: 1 },\n ),\n defineParameter(\n 'ammonia_as_nh3',\n 'nutrient',\n 'Ammonia as NH₃',\n 'Amônia como NH₃',\n U.mg_l,\n {\n cas: '7664-41-7',\n },\n ),\n defineParameter(\n 'kjeldahl_nitrogen_as_n',\n 'nutrient',\n 'Total Kjeldahl nitrogen as N',\n 'Nitrogênio Kjeldahl total como N',\n U.mg_l,\n ),\n defineParameter(\n 'phosphorus_total_as_p',\n 'nutrient',\n 'Total phosphorus as P',\n 'Fósforo total como P',\n U.mg_l,\n ),\n defineParameter(\n 'orthophosphate_as_po4',\n 'nutrient',\n 'Orthophosphate as PO₄³⁻',\n 'Ortofosfato como PO₄³⁻',\n U.mg_l,\n { molar_mass: 94.971, charge: -3 },\n ),\n\n // Organic\n defineParameter(\n 'total_organic_carbon',\n 'organic',\n 'Total organic carbon',\n 'Carbono orgânico total',\n U.mg_l,\n ),\n defineParameter(\n 'cod',\n 'organic',\n 'Chemical oxygen demand',\n 'Demanda química de oxigênio (DQO)',\n U.mg_l,\n ),\n defineParameter(\n 'bod5',\n 'organic',\n 'Biochemical oxygen demand, 5-day',\n 'Demanda bioquímica de oxigênio (DBO₅)',\n U.mg_l,\n ),\n defineParameter(\n 'total_petroleum_hydrocarbons',\n 'organic',\n 'Total petroleum hydrocarbons (range per method)',\n 'Hidrocarbonetos totais de petróleo',\n U.mg_l,\n ),\n defineParameter(\n 'oil_and_grease',\n 'organic',\n 'Oil and grease',\n 'Óleos e graxas',\n U.mg_l,\n ),\n\n // Disinfection\n defineParameter(\n 'free_chlorine',\n 'disinfection',\n 'Free chlorine residual',\n 'Cloro residual livre',\n U.mg_l,\n ),\n defineParameter(\n 'total_chlorine',\n 'disinfection',\n 'Total chlorine residual',\n 'Cloro residual total',\n U.mg_l,\n ),\n\n // Mining and redox\n defineParameter(\n 'ferrous_iron',\n 'mining_redox',\n 'Ferrous iron (Fe²⁺)',\n 'Ferro ferroso (Fe²⁺)',\n U.mg_l,\n ),\n defineParameter(\n 'chromium_hexavalent',\n 'mining_redox',\n 'Hexavalent chromium',\n 'Cromo hexavalente',\n U.mg_l,\n { cas: '18540-29-9' },\n ),\n defineParameter(\n 'cyanide_total_as_cn',\n 'mining_redox',\n 'Total cyanide as CN⁻',\n 'Cianeto total como CN⁻',\n U.mg_l,\n ),\n defineParameter(\n 'cyanide_wad_as_cn',\n 'mining_redox',\n 'Weak acid dissociable cyanide as CN⁻',\n 'Cianeto WAD como CN⁻',\n U.mg_l,\n ),\n defineParameter(\n 'cyanide_free_as_cn',\n 'mining_redox',\n 'Free cyanide as CN⁻',\n 'Cianeto livre como CN⁻',\n U.mg_l,\n ),\n defineParameter(\n 'thiocyanate',\n 'mining_redox',\n 'Thiocyanate',\n 'Tiocianato',\n U.mg_l,\n {\n cas: '302-04-5',\n },\n ),\n defineParameter(\n 'sulfide_total_as_s',\n 'mining_redox',\n 'Total sulfide as S',\n 'Sulfeto total como S',\n U.mg_l,\n ),\n\n // Metals / trace\n defineParameter('iron', 'metal', 'Iron', 'Ferro', U.mg_l, {\n cas: '7439-89-6',\n molar_mass: 55.845,\n charge: 2,\n }),\n defineParameter('manganese', 'metal', 'Manganese', 'Manganês', U.mg_l, {\n cas: '7439-96-5',\n molar_mass: 54.938,\n charge: 2,\n }),\n defineParameter('aluminum', 'metal', 'Aluminium', 'Alumínio', U.mg_l, {\n cas: '7429-90-5',\n }),\n defineParameter('antimony', 'metal', 'Antimony', 'Antimônio', U.mg_l, {\n cas: '7440-36-0',\n }),\n defineParameter('arsenic', 'metal', 'Arsenic', 'Arsênio', U.mg_l, {\n cas: '7440-38-2',\n }),\n defineParameter('barium', 'metal', 'Barium', 'Bário', U.mg_l, {\n cas: '7440-39-3',\n }),\n defineParameter('beryllium', 'metal', 'Beryllium', 'Berílio', U.mg_l, {\n cas: '7440-41-7',\n }),\n defineParameter('boron', 'metal', 'Boron', 'Boro', U.mg_l, {\n cas: '7440-42-8',\n }),\n defineParameter('cadmium', 'metal', 'Cadmium', 'Cádmio', U.mg_l, {\n cas: '7440-43-9',\n }),\n defineParameter(\n 'chromium',\n 'metal',\n 'Chromium, total',\n 'Cromo total',\n U.mg_l,\n {\n cas: '7440-47-3',\n },\n ),\n defineParameter('cobalt', 'metal', 'Cobalt', 'Cobalto', U.mg_l, {\n cas: '7440-48-4',\n }),\n defineParameter('copper', 'metal', 'Copper', 'Cobre', U.mg_l, {\n cas: '7440-50-8',\n }),\n defineParameter('lead', 'metal', 'Lead', 'Chumbo', U.mg_l, {\n cas: '7439-92-1',\n }),\n defineParameter('lithium', 'metal', 'Lithium', 'Lítio', U.mg_l, {\n cas: '7439-93-2',\n molar_mass: 6.94,\n charge: 1,\n }),\n defineParameter('mercury', 'metal', 'Mercury', 'Mercúrio', U.mg_l, {\n cas: '7439-97-6',\n }),\n defineParameter('molybdenum', 'metal', 'Molybdenum', 'Molibdênio', U.mg_l, {\n cas: '7439-98-7',\n }),\n defineParameter('nickel', 'metal', 'Nickel', 'Níquel', U.mg_l, {\n cas: '7440-02-0',\n }),\n defineParameter('selenium', 'metal', 'Selenium', 'Selênio', U.mg_l, {\n cas: '7782-49-2',\n }),\n defineParameter('silver', 'metal', 'Silver', 'Prata', U.mg_l, {\n cas: '7440-22-4',\n }),\n defineParameter('strontium', 'metal', 'Strontium', 'Estrôncio', U.mg_l, {\n cas: '7440-24-6',\n molar_mass: 87.62,\n charge: 2,\n }),\n defineParameter('thallium', 'metal', 'Thallium', 'Tálio', U.mg_l, {\n cas: '7440-28-0',\n }),\n defineParameter('uranium', 'metal', 'Uranium', 'Urânio', U.mg_l, {\n cas: '7440-61-1',\n }),\n defineParameter('vanadium', 'metal', 'Vanadium', 'Vanádio', U.mg_l, {\n cas: '7440-62-2',\n }),\n defineParameter('zinc', 'metal', 'Zinc', 'Zinco', U.mg_l, {\n cas: '7440-66-6',\n }),\n\n // Microbiology\n defineParameter(\n 'total_coliforms',\n 'microbiology',\n 'Total coliforms in 100 mL',\n 'Coliformes totais em 100 mL',\n U.none,\n { form: 'presence' },\n ),\n defineParameter(\n 'total_coliforms_mpn',\n 'microbiology',\n 'Total coliforms, count',\n 'Coliformes totais, contagem',\n U.mpn_100ml,\n ),\n defineParameter(\n 'total_coliforms_cfu',\n 'microbiology',\n 'Total coliforms, count',\n 'Coliformes totais, contagem',\n U.cfu_100ml,\n ),\n defineParameter(\n 'e_coli',\n 'microbiology',\n 'E. coli in 100 mL',\n 'E. coli em 100 mL',\n U.none,\n { form: 'presence' },\n ),\n defineParameter(\n 'e_coli_mpn',\n 'microbiology',\n 'E. coli, count',\n 'E. coli, contagem',\n U.mpn_100ml,\n ),\n defineParameter(\n 'e_coli_cfu',\n 'microbiology',\n 'E. coli, count',\n 'E. coli, contagem',\n U.cfu_100ml,\n ),\n defineParameter(\n 'thermotolerant_coliforms',\n 'microbiology',\n 'Thermotolerant coliforms in 100 mL',\n 'Coliformes termotolerantes em 100 mL',\n U.none,\n { form: 'presence' },\n ),\n defineParameter(\n 'thermotolerant_coliforms_mpn',\n 'microbiology',\n 'Thermotolerant coliforms, count',\n 'Coliformes termotolerantes, contagem',\n U.mpn_100ml,\n ),\n defineParameter(\n 'thermotolerant_coliforms_cfu',\n 'microbiology',\n 'Thermotolerant coliforms, count',\n 'Coliformes termotolerantes, contagem',\n U.cfu_100ml,\n ),\n defineParameter(\n 'heterotrophic_plate_count',\n 'microbiology',\n 'Heterotrophic plate count',\n 'Bactérias heterotróficas',\n U.cfu_ml,\n ),\n\n // Radioactivity (Bq/L even where a CAS exists)\n defineParameter(\n 'gross_alpha',\n 'radioactivity',\n 'Gross alpha activity',\n 'Atividade alfa total',\n U.bq_l,\n ),\n defineParameter(\n 'gross_beta',\n 'radioactivity',\n 'Gross beta activity',\n 'Atividade beta total',\n U.bq_l,\n ),\n defineParameter(\n 'radium_226',\n 'radioactivity',\n 'Radium-226',\n 'Rádio-226',\n U.bq_l,\n {\n cas: '13982-63-3',\n },\n ),\n defineParameter(\n 'radium_228',\n 'radioactivity',\n 'Radium-228',\n 'Rádio-228',\n U.bq_l,\n {\n cas: '15262-20-1',\n },\n ),\n defineParameter(\n 'radon_222',\n 'radioactivity',\n 'Radon-222',\n 'Radônio-222',\n U.bq_l,\n {\n cas: '14859-67-7',\n },\n ),\n];\n\nconst BY_CODE = new Map(WATER_QUALITY_PARAMETERS.map(d => [d.code, d]));\nconst BY_CAS = new Map(\n WATER_QUALITY_PARAMETERS.filter(d => d.cas).map(d => [d.cas!, d]),\n);\n\n/**\n * Looks up the vocabulary entry for a parameter. A `cas` parameter resolves\n * through the published equivalences to its `welldot` entry. Returns\n * `undefined` for unknown codes, CAS numbers without an equivalent, and\n * `x-` vocabularies.\n */\nexport function getParameterDefinition(\n parameter: Parameter,\n): ParameterDefinition | undefined {\n if (parameter.vocabulary === 'welldot') return BY_CODE.get(parameter.code);\n if (parameter.vocabulary === 'cas') return BY_CAS.get(parameter.code);\n return undefined;\n}\n\n/**\n * Display label of a parameter in `locale` (`pt-BR` → `pt` → English): its\n * vocabulary entry's translation (a CAS number resolves through the\n * published equivalences first), else the raw code (`x-` and unknown codes).\n */\nexport function getParameterLabel(\n parameter: Parameter,\n locale: string,\n): string {\n const def = getParameterDefinition(parameter);\n if (!def) return parameter.code;\n return resolveLanguageText({ ...def.labels, en: def.label }, locale, 'en');\n}\n\n/**\n * Canonical identity of a parameter: the `welldot` code when the parameter\n * is (or resolves to) a vocabulary entry, otherwise `vocabulary:code`.\n * A `welldot` code and its CAS equivalent produce the same key.\n */\nexport function parameterKey(parameter: Parameter): string {\n const def = getParameterDefinition(parameter);\n if (def) return def.code;\n return `${parameter.vocabulary}:${parameter.code}`;\n}\n\n/**\n * Whether a parameter's code is defined by its vocabulary version. `cas`\n * codes and `x-` vocabularies are always accepted (CAS numbers outside the\n * equivalence table are substances in mg/L).\n */\nexport function isKnownParameter(parameter: Parameter): boolean {\n if (parameter.vocabulary !== 'welldot') return true;\n return BY_CODE.has(parameter.code);\n}\n","import type { VocabEntry } from './vocab';\n\n/** Recommended `attachments[].document_type` values (since v2.3). */\nexport const DOCUMENT_TYPES = [\n {\n value: 'drilling_report',\n label: { en: 'Drilling report', pt: 'Relatório de perfuração' },\n },\n {\n value: 'as_built_drawing',\n label: { en: 'As-built drawing', pt: 'Perfil construtivo as-built' },\n },\n {\n value: 'registry_record',\n label: { en: 'Registry record', pt: 'Ficha cadastral' },\n },\n { value: 'photo', label: { en: 'Photo', pt: 'Fotografia' } },\n {\n value: 'permit_document',\n label: { en: 'Permit document', pt: 'Portaria / outorga' },\n },\n {\n value: 'condition_evidence',\n label: { en: 'Condition evidence', pt: 'Comprovante de condicionante' },\n },\n { value: 'pump_curve', label: { en: 'Pump curve', pt: 'Curva da bomba' } },\n {\n value: 'field_sheet',\n label: { en: 'Field sheet', pt: 'Planilha de campo' },\n },\n {\n value: 'test_report',\n label: {\n en: 'Pumping test report',\n pt: 'Relatório de teste de bombeamento',\n },\n },\n {\n value: 'lab_report',\n label: { en: 'Lab report', pt: 'Laudo laboratorial' },\n },\n { value: 'invoice', label: { en: 'Invoice', pt: 'Nota fiscal' } },\n] as const satisfies readonly VocabEntry[];\n\nexport type AttachmentDocumentType = (typeof DOCUMENT_TYPES)[number]['value'];\n\n/** Document types suggested first for each place an attachment can live. */\nexport const DOCUMENT_TYPE_SUGGESTIONS = {\n root: ['drilling_report', 'as_built_drawing', 'registry_record', 'photo'],\n pump: ['pump_curve', 'invoice', 'photo'],\n meter: ['photo', 'invoice', 'condition_evidence'],\n permit: ['permit_document', 'photo'],\n condition: ['condition_evidence', 'photo'],\n permit_history: ['permit_document', 'invoice', 'photo'],\n event: ['field_sheet', 'photo'],\n history: ['condition_evidence', 'photo', 'invoice'],\n sample: ['lab_report', 'field_sheet', 'photo', 'condition_evidence'],\n} as const satisfies Record<string, readonly AttachmentDocumentType[]>;\n\nexport type DocumentTypeContext = keyof typeof DOCUMENT_TYPE_SUGGESTIONS;\n","import type { VocabEntry } from './vocab';\n\n/** Recommended `bore_hole[].drilling_method` values. */\nexport const DRILLING_METHODS = [\n { value: 'rotary', label: { en: 'Rotary', pt: 'Rotativo' } },\n { value: 'percussion', label: { en: 'Percussion', pt: 'Percussão' } },\n { value: 'cable_tool', label: { en: 'Cable tool', pt: 'Percussão a cabo' } },\n { value: 'auger', label: { en: 'Auger', pt: 'Trado' } },\n {\n value: 'air_hammer',\n label: { en: 'Air hammer', pt: 'Martelo pneumático' },\n },\n] as const satisfies readonly VocabEntry[];\n\nexport type DrillingMethod = (typeof DRILLING_METHODS)[number]['value'];\n\n/**\n * Recommended construction materials, shared by `well_case[].type`,\n * `well_screen[].type`, `reduction[].type` and\n * `pump_installations[].riser_material`.\n */\nexport const CONSTRUCTION_MATERIALS = [\n { value: 'pvc', label: { en: 'PVC', pt: 'PVC' } },\n {\n value: 'geomechanical_pvc',\n label: { en: 'Geomechanical PVC', pt: 'PVC geomecânico' },\n },\n { value: 'carbon_steel', label: { en: 'Carbon steel', pt: 'Aço carbono' } },\n {\n value: 'galvanized_steel',\n label: { en: 'Galvanized steel', pt: 'Aço galvanizado' },\n },\n {\n value: 'stainless_steel',\n label: { en: 'Stainless steel', pt: 'Aço inox' },\n },\n { value: 'fiberglass', label: { en: 'Fiberglass', pt: 'Fibra de vidro' } },\n] as const satisfies readonly VocabEntry[];\n\nexport type ConstructionMaterial =\n (typeof CONSTRUCTION_MATERIALS)[number]['value'];\n\n/**\n * Recommended `well_screen[].slot_type` values (since v2.3): the screen\n * design, independent of its material (`well_screen[].type`).\n */\nexport const SCREEN_SLOT_TYPES = [\n {\n value: 'continuous_slot',\n label: { en: 'Continuous slot', pt: 'Espiralado (tipo Johnson)' },\n },\n { value: 'slotted', label: { en: 'Slotted', pt: 'Ranhurado' } },\n { value: 'bridge_slot', label: { en: 'Bridge slot', pt: 'Tipo ponte' } },\n { value: 'louver', label: { en: 'Louver', pt: 'Veneziana' } },\n { value: 'perforated', label: { en: 'Perforated', pt: 'Perfurado' } },\n { value: 'nold', label: { en: 'Nold type', pt: 'Tipo Nold' } },\n] as const satisfies readonly VocabEntry[];\n\nexport type ScreenSlotType = (typeof SCREEN_SLOT_TYPES)[number]['value'];\n\n/**\n * Recommended `centralizers[].type` values (since v2.1): the centralizer\n * design, plus the steel materials commonly used to name rigid ones.\n */\nexport const CENTRALIZER_TYPES = [\n { value: 'spring_bow', label: { en: 'Spring bow', pt: 'Mola (spring bow)' } },\n { value: 'rigid', label: { en: 'Rigid', pt: 'Rígido' } },\n { value: 'semi_rigid', label: { en: 'Semi-rigid', pt: 'Semirrígido' } },\n { value: 'polymer', label: { en: 'Polymer', pt: 'Polimérico' } },\n { value: 'carbon_steel', label: { en: 'Carbon steel', pt: 'Aço carbono' } },\n {\n value: 'galvanized_steel',\n label: { en: 'Galvanized steel', pt: 'Aço galvanizado' },\n },\n {\n value: 'stainless_steel',\n label: { en: 'Stainless steel', pt: 'Aço inox' },\n },\n] as const satisfies readonly VocabEntry[];\n\nexport type CentralizerType = (typeof CENTRALIZER_TYPES)[number]['value'];\n\n/** Recommended `cement_pad.type` values. */\nexport const CEMENT_PAD_TYPES = [\n { value: 'concrete', label: { en: 'Concrete', pt: 'Concreto' } },\n {\n value: 'reinforced_concrete',\n label: { en: 'Reinforced concrete', pt: 'Concreto armado' },\n },\n { value: 'cement', label: { en: 'Cement', pt: 'Cimento' } },\n { value: 'mortar', label: { en: 'Mortar', pt: 'Argamassa' } },\n] as const satisfies readonly VocabEntry[];\n\nexport type CementPadType = (typeof CEMENT_PAD_TYPES)[number]['value'];\n","import type { VocabEntry } from './vocab';\n\n/** Recommended `well_type` values — construction method (since v2.1). */\nexport const WELL_TYPES = [\n { value: 'tubular', label: { en: 'Tubular', pt: 'Tubular' } },\n {\n value: 'hand_dug',\n label: { en: 'Hand dug', pt: 'Cacimba / poço escavado' },\n },\n { value: 'horizontal', label: { en: 'Horizontal', pt: 'Horizontal' } },\n {\n value: 'infiltration_gallery',\n label: { en: 'Infiltration gallery', pt: 'Galeria de infiltração' },\n },\n {\n value: 'artesian',\n label: { en: 'Artesian (deprecated)', pt: 'Artesiano (obsoleto)' },\n deprecated: true,\n },\n] as const satisfies readonly VocabEntry[];\n\nexport type WellType = (typeof WELL_TYPES)[number]['value'];\n\n/** Recommended `well_purpose[]` values (since v2.1). */\nexport const WELL_PURPOSES = [\n {\n value: 'production',\n label: { en: 'Production', pt: 'Produção / captação' },\n },\n {\n value: 'monitoring',\n label: { en: 'Monitoring well', pt: 'Poço de monitoramento' },\n },\n { value: 'piezometer', label: { en: 'Piezometer', pt: 'Piezômetro' } },\n {\n value: 'water_level_indicator',\n label: {\n en: 'Water level indicator',\n pt: \"INA — indicador de nível d'água\",\n },\n },\n {\n value: 'observation',\n label: { en: 'Observation well', pt: 'Poço de observação' },\n },\n {\n value: 'exploration',\n label: { en: 'Exploration', pt: 'Pesquisa / exploratório' },\n },\n {\n value: 'injection',\n label: { en: 'Injection / recharge', pt: 'Injeção / recarga' },\n },\n { value: 'dewatering', label: { en: 'Dewatering', pt: 'Rebaixamento' } },\n] as const satisfies readonly VocabEntry[];\n\nexport type WellPurpose = (typeof WELL_PURPOSES)[number]['value'];\n","import type { VocabEntry } from './vocab';\n\n/** Recommended `history_logs[].category` values. */\nexport const HISTORY_LOG_CATEGORIES = [\n { value: 'maintenance', label: { en: 'Maintenance', pt: 'Manutenção' } },\n { value: 'inspection', label: { en: 'Inspection', pt: 'Inspeção' } },\n { value: 'incident', label: { en: 'Incident', pt: 'Incidente' } },\n { value: 'event', label: { en: 'Event', pt: 'Evento' } },\n {\n value: 'status_change',\n label: { en: 'Status change', pt: 'Mudança de situação' },\n },\n] as const satisfies readonly VocabEntry[];\n\nexport type HistoryLogCategory =\n (typeof HISTORY_LOG_CATEGORIES)[number]['value'];\n\n/** Recommended `history_logs[].severity` values. */\nexport const HISTORY_LOG_SEVERITIES = [\n { value: 'low', label: { en: 'Low', pt: 'Baixa' } },\n { value: 'medium', label: { en: 'Medium', pt: 'Média' } },\n { value: 'high', label: { en: 'High', pt: 'Alta' } },\n { value: 'critical', label: { en: 'Critical', pt: 'Crítica' } },\n] as const satisfies readonly VocabEntry[];\n\nexport type HistoryLogSeverity =\n (typeof HISTORY_LOG_SEVERITIES)[number]['value'];\n","import type { VocabEntry } from './vocab';\n\n/** Recommended `pump_installations[].type` values (since v2.3). */\nexport const PUMP_TYPES = [\n {\n value: 'submersible',\n label: { en: 'Submersible pump', pt: 'Bomba submersa' },\n },\n {\n value: 'vertical_turbine',\n label: { en: 'Vertical turbine pump', pt: 'Bomba de eixo vertical' },\n },\n { value: 'jet', label: { en: 'Jet pump', pt: 'Bomba injetora' } },\n {\n value: 'progressive_cavity',\n label: { en: 'Progressive cavity pump', pt: 'Bomba helicoidal' },\n },\n { value: 'hand_pump', label: { en: 'Hand pump', pt: 'Bomba manual' } },\n {\n value: 'compressor_airlift',\n label: { en: 'Compressor (air-lift)', pt: 'Compressor (air-lift)' },\n },\n] as const satisfies readonly VocabEntry[];\n\nexport type PumpType = (typeof PUMP_TYPES)[number]['value'];\n\n/** Recommended `pump_installations[].power_source` values (since v2.3). */\nexport const POWER_SOURCES = [\n { value: 'grid', label: { en: 'Grid', pt: 'Rede elétrica' } },\n { value: 'solar', label: { en: 'Solar', pt: 'Solar' } },\n { value: 'diesel', label: { en: 'Diesel', pt: 'Diesel' } },\n { value: 'hybrid', label: { en: 'Hybrid', pt: 'Híbrido' } },\n] as const satisfies readonly VocabEntry[];\n\nexport type PowerSource = (typeof POWER_SOURCES)[number]['value'];\n\n/** Recommended `meters[].type` values (since v2.3). */\nexport const METER_TYPES = [\n { value: 'mechanical', label: { en: 'Mechanical', pt: 'Mecânico' } },\n {\n value: 'electromagnetic',\n label: { en: 'Electromagnetic', pt: 'Eletromagnético' },\n },\n { value: 'ultrasonic', label: { en: 'Ultrasonic', pt: 'Ultrassônico' } },\n] as const satisfies readonly VocabEntry[];\n\nexport type MeterType = (typeof METER_TYPES)[number]['value'];\n\n/** Recommended `production[].source` values of a `meter_reading` (since v2.3). */\nexport const READING_SOURCES = [\n { value: 'manual', label: { en: 'Manual', pt: 'Manual' } },\n { value: 'telemetry', label: { en: 'Telemetry', pt: 'Telemetria' } },\n] as const satisfies readonly VocabEntry[];\n\nexport type ReadingSource = (typeof READING_SOURCES)[number]['value'];\n\n/** Recommended `production[].method` values of an `estimated_volume` (since v2.3). */\nexport const ESTIMATION_METHODS = [\n {\n value: 'flow_time',\n label: { en: 'Flow × operating time', pt: 'Vazão × tempo de operação' },\n },\n {\n value: 'energy',\n label: { en: 'Energy consumption', pt: 'Consumo de energia' },\n },\n {\n value: 'user_statement',\n label: { en: 'User statement', pt: 'Informado pelo usuário' },\n },\n] as const satisfies readonly VocabEntry[];\n\nexport type EstimationMethod = (typeof ESTIMATION_METHODS)[number]['value'];\n\n/** Recommended `history_logs[].maintenance_type` values (since v2.3). */\nexport const MAINTENANCE_TYPES = [\n { value: 'inspection', label: { en: 'Inspection', pt: 'Inspeção' } },\n { value: 'cleaning', label: { en: 'Cleaning', pt: 'Limpeza' } },\n {\n value: 'redevelopment',\n label: { en: 'Redevelopment', pt: 'Redesenvolvimento' },\n },\n { value: 'disinfection', label: { en: 'Disinfection', pt: 'Desinfecção' } },\n {\n value: 'pump_service',\n label: { en: 'Pump service', pt: 'Manutenção da bomba' },\n },\n {\n value: 'meter_calibration',\n label: { en: 'Meter calibration', pt: 'Aferição do hidrômetro' },\n },\n {\n value: 'video_inspection',\n label: {\n en: 'Video inspection / optical logging',\n pt: 'Filmagem / perfilagem ótica',\n },\n },\n {\n value: 'level_measurement',\n label: { en: 'Level measurement', pt: 'Medição de nível' },\n },\n {\n value: 'pump_test',\n label: { en: 'Pumping test', pt: 'Teste de bombeamento' },\n },\n {\n value: 'water_sampling',\n label: { en: 'Water sampling', pt: 'Coleta de água' },\n },\n] as const satisfies readonly VocabEntry[];\n\nexport type MaintenanceType = (typeof MAINTENANCE_TYPES)[number]['value'];\n","import type { VocabEntry } from './vocab';\n\n/** Recommended `permits[].type` values (since v2.3). */\nexport const PERMIT_TYPES = [\n {\n value: 'abstraction_permit',\n label: { en: 'Abstraction permit', pt: 'Outorga de direito de uso' },\n },\n {\n value: 'preliminary_permit',\n label: { en: 'Preliminary permit', pt: 'Outorga prévia' },\n },\n {\n value: 'exemption',\n label: { en: 'Exemption', pt: 'Dispensa / uso insignificante' },\n },\n { value: 'registration', label: { en: 'Registration', pt: 'Cadastro' } },\n {\n value: 'dewatering_permit',\n label: { en: 'Dewatering permit', pt: 'Outorga para rebaixamento' },\n },\n {\n value: 'drilling_permit',\n label: { en: 'Drilling permit', pt: 'Autorização de perfuração' },\n },\n] as const satisfies readonly VocabEntry[];\n\nexport type PermitType = (typeof PERMIT_TYPES)[number]['value'];\n\n/** Recommended `permits[].water_use[]` values (since v2.3). */\nexport const WATER_USES = [\n {\n value: 'human_supply',\n label: { en: 'Human supply', pt: 'Abastecimento humano' },\n },\n { value: 'industrial', label: { en: 'Industrial', pt: 'Industrial' } },\n { value: 'mining', label: { en: 'Mining', pt: 'Mineração' } },\n { value: 'irrigation', label: { en: 'Irrigation', pt: 'Irrigação' } },\n {\n value: 'livestock',\n label: { en: 'Livestock', pt: 'Dessedentação animal' },\n },\n {\n value: 'commercial',\n label: { en: 'Commercial', pt: 'Comercial / serviços' },\n },\n] as const satisfies readonly VocabEntry[];\n\nexport type WaterUse = (typeof WATER_USES)[number]['value'];\n\n/** Recommended `permits[].conditions[].category` values (since v2.3). */\nexport const CONDITION_CATEGORIES = [\n {\n value: 'monitoring',\n label: { en: 'Monitoring', pt: 'Monitoramento' },\n description: {\n en: 'Water level, flow, abstracted volume and water quality monitoring/sampling',\n pt: 'Monitoramento/amostragem de nível, vazão, volume captado e qualidade da água',\n },\n },\n {\n value: 'reporting',\n label: { en: 'Reporting', pt: 'Relatórios e declarações' },\n description: {\n en: 'Periodic reports and volume/flow declarations submitted to the authority',\n pt: 'Relatórios periódicos e declarações de volume/vazão entregues ao órgão',\n },\n },\n {\n value: 'equipment_installation',\n label: { en: 'Equipment installation', pt: 'Instalação de equipamentos' },\n description: {\n en: 'Meters (hidrômetro), level gauges, sampling taps, telemetry',\n pt: 'Hidrômetro, medidor de nível, torneira de amostragem, telemetria',\n },\n },\n {\n value: 'well_protection',\n label: { en: 'Well protection', pt: 'Proteção do poço' },\n description: {\n en: 'Sanitary slab, seal, protection perimeter, wellhead closure',\n pt: 'Laje de proteção, selo sanitário, perímetro de proteção, tampa do poço',\n },\n },\n {\n value: 'environmental',\n label: { en: 'Environmental', pt: 'Ambiental' },\n description: {\n en: 'Environmental measures, compensation, licensing of the activity',\n pt: 'Medidas ambientais, compensação, licenciamento da atividade',\n },\n },\n {\n value: 'legal',\n label: { en: 'Legal / administrative', pt: 'Legal / administrativo' },\n description: {\n en: 'Renewal request, fees, registrations, document submissions',\n pt: 'Pedido de renovação, taxas, cadastros, entrega de documentos',\n },\n },\n] as const satisfies readonly VocabEntry[];\n\nexport type ConditionCategory = (typeof CONDITION_CATEGORIES)[number]['value'];\n\n/** Recommended `permits[].history[].type` values (since v2.3). */\nexport const PERMIT_HISTORY_TYPES = [\n { value: 'filing', label: { en: 'Filing', pt: 'Protocolo' } },\n { value: 'process', label: { en: 'Process', pt: 'Andamento' } },\n { value: 'notification', label: { en: 'Notification', pt: 'Notificação' } },\n { value: 'fee', label: { en: 'Fee', pt: 'Taxa' } },\n { value: 'inspection', label: { en: 'Inspection', pt: 'Vistoria' } },\n { value: 'decision', label: { en: 'Decision', pt: 'Decisão' } },\n { value: 'renewal', label: { en: 'Renewal', pt: 'Renovação' } },\n] as const satisfies readonly VocabEntry[];\n\nexport type PermitHistoryType = (typeof PERMIT_HISTORY_TYPES)[number]['value'];\n","import type { LanguageText } from '../types/language.types';\nimport { resolveLanguageText } from '../utils/language.utils';\n\n/** One recommended value of an open (free-text) `.well` vocabulary. */\nexport type VocabEntry<V extends string = string> = {\n value: V;\n /** Display label; welldot vocabularies always provide `en` and `pt`. */\n label: LanguageText<'en' | 'pt'>;\n description?: LanguageText<'en' | 'pt'>;\n /** Still valid and resolvable, but never offered for new input. */\n deprecated?: true;\n};\n\n/**\n * A field that recommends the values `V` but accepts any string (free text or\n * an `x-` prefixed extension). The `string & {}` arm keeps editor\n * autocomplete for `V` — a plain `V | string` collapses to `string`.\n */\nexport type OpenVocab<V extends string> = V | (string & {});\n\n/** The entry of `vocab` whose `value` is exactly `value`, if any. */\nexport function getVocabEntry<V extends string>(\n vocab: readonly VocabEntry<V>[],\n value: string | undefined,\n): VocabEntry<V> | undefined {\n if (value === undefined) return undefined;\n return vocab.find(entry => entry.value === value);\n}\n\n/** Whether `value` is one of the recommended values of `vocab`. */\nexport function isVocabValue<V extends string>(\n vocab: readonly VocabEntry<V>[],\n value: string | undefined,\n): value is V {\n return getVocabEntry(vocab, value) !== undefined;\n}\n\n/**\n * Display label of `value` in `locale`. Free-text and `x-` values have no\n * entry and are returned as-is.\n */\nexport function getVocabLabel(\n vocab: readonly VocabEntry[],\n value: string,\n locale: string,\n): string {\n const entry = getVocabEntry(vocab, value);\n return entry ? resolveLanguageText(entry.label, locale) : value;\n}\n\n/**\n * Comma-separated labels of a multi-valued field (e.g. `well_purpose`) in\n * `locale`. Values with no entry are kept as-is.\n */\nexport function formatVocabList(\n vocab: readonly VocabEntry[],\n values: readonly string[] | undefined,\n locale: string,\n): string {\n return (values ?? []).map(v => getVocabLabel(vocab, v, locale)).join(', ');\n}\n\n/** The recommended values of `vocab`, deprecated ones left out by default. */\nexport function vocabValues<V extends string>(\n vocab: readonly VocabEntry<V>[],\n { includeDeprecated = false }: { includeDeprecated?: boolean } = {},\n): V[] {\n return vocab\n .filter(entry => includeDeprecated || !entry.deprecated)\n .map(entry => entry.value);\n}\n","import type { VocabEntry } from './vocab';\n\n/** Recommended `water_samples[].sample_type` values (since v2.3). */\nexport const SAMPLE_TYPES = [\n { value: 'routine', label: { en: 'Routine', pt: 'Rotina' } },\n {\n value: 'field_duplicate',\n label: { en: 'Field duplicate', pt: 'Duplicata de campo' },\n },\n {\n value: 'split_sample',\n label: { en: 'Split sample', pt: 'Amostra dividida (split)' },\n },\n { value: 'field_blank', label: { en: 'Field blank', pt: 'Branco de campo' } },\n {\n value: 'trip_blank',\n label: { en: 'Trip blank', pt: 'Branco de transporte' },\n },\n {\n value: 'equipment_blank',\n label: { en: 'Equipment blank', pt: 'Branco de equipamento' },\n },\n] as const satisfies readonly VocabEntry[];\n\nexport type SampleType = (typeof SAMPLE_TYPES)[number]['value'];\n\n/** Recommended `water_samples[].sampling_method` values (since v2.3). */\nexport const SAMPLING_METHODS = [\n {\n value: 'low_flow',\n label: { en: 'Low flow', pt: 'Purga de baixa vazão (micropurga)' },\n },\n {\n value: 'volumetric_purge',\n label: { en: 'Volumetric purge', pt: 'Purga de volume determinado' },\n },\n { value: 'no_purge', label: { en: 'No purge', pt: 'Amostragem sem purga' } },\n {\n value: 'pump_discharge',\n label: { en: 'Pump discharge', pt: 'Bomba de produção em operação' },\n },\n] as const satisfies readonly VocabEntry[];\n\nexport type SamplingMethod = (typeof SAMPLING_METHODS)[number]['value'];\n\n/** Recommended `water_samples[].sampling_point.type` values (since v2.3). */\nexport const SAMPLING_POINT_TYPES = [\n {\n value: 'pump_discharge',\n label: { en: 'Pump discharge', pt: 'Saída da bomba de produção' },\n },\n {\n value: 'wellhead_tap',\n label: { en: 'Wellhead tap', pt: 'Torneira do cavalete' },\n },\n { value: 'in_well', label: { en: 'In well', pt: 'Dentro do poço' } },\n] as const satisfies readonly VocabEntry[];\n\nexport type SamplingPointType = (typeof SAMPLING_POINT_TYPES)[number]['value'];\n\n/** Recommended `water_samples[].sampling_point.device` values (since v2.3). */\nexport const SAMPLING_DEVICES = [\n {\n value: 'bailer',\n label: { en: 'Bailer', pt: 'Bailer (amostrador de retenção)' },\n },\n {\n value: 'discrete_depth_sampler',\n label: {\n en: 'Discrete depth sampler',\n pt: 'Amostrador pontual de profundidade',\n },\n },\n {\n value: 'passive_diffusion_bag',\n label: { en: 'Passive diffusion bag', pt: 'Bolsa de difusão passiva' },\n },\n {\n value: 'grab_sleeve',\n label: {\n en: 'Grab sleeve (HydraSleeve)',\n pt: 'Amostrador passivo tipo luva (HydraSleeve)',\n },\n },\n {\n value: 'low_flow_pump',\n label: { en: 'Low-flow pump', pt: 'Bomba de baixa vazão' },\n },\n {\n value: 'packer_pump',\n label: { en: 'Packer pump', pt: 'Bomba com obturador (packer)' },\n },\n] as const satisfies readonly VocabEntry[];\n\nexport type SamplingDevice = (typeof SAMPLING_DEVICES)[number]['value'];\n","import type { FlowUnits, PowerUnits, VolumeUnits } from '../types/units.types';\n\n// ─── Constants ────────────────────────────────────────────────────────────────\n\nconst FEET_PER_METER = 3.280_839_895;\nconst METERS_PER_FOOT = 0.304_8; // exact (international foot)\nconst MM_PER_INCH = 25.4; // exact\nconst M3H_TO_LS = 1 / 3.6;\nconst M3H_TO_USGPM = 4.402_867_361;\nconst M2S_TO_M2D = 86_400;\nconst PSI_PER_KPA = 0.145_037_738;\nconst SLOT_MM = 0.025_4; // 1 slot = 0.001 in = 0.0254 mm\nconst KW_PER_CV = 0.735_498_75; // exact (metric horsepower, cavalo-vapor)\nconst KW_PER_HP = 0.745_699_872; // mechanical horsepower\nconst LITERS_PER_M3 = 1_000;\nconst FT3_PER_M3 = 35.314_666_721; // 1 ft = 0.3048 m exact\nconst USGAL_PER_M3 = 264.172_052_358; // 1 US gal = 3.785411784 L exact\n\n// ─── Types ────────────────────────────────────────────────────────────────────\n\nexport type DmsCoordinate = {\n degrees: number;\n minutes: number;\n seconds: number;\n /** 'N' | 'S' for latitude axes; 'E' | 'W' for longitude axes */\n direction: 'N' | 'S' | 'E' | 'W';\n};\n\n// ─── Length ───────────────────────────────────────────────────────────────────\n\nexport function metersToFeet(m: number): number {\n return m * FEET_PER_METER;\n}\n\nexport function feetToMeters(ft: number): number {\n return ft * METERS_PER_FOOT;\n}\n\n// ─── Diameter ─────────────────────────────────────────────────────────────────\n\nexport function mmToInches(mm: number): number {\n return mm / MM_PER_INCH;\n}\n\nexport function inchesToMm(inches: number): number {\n return inches * MM_PER_INCH;\n}\n\n// ─── Flow Rate ────────────────────────────────────────────────────────────────\n\nexport function cubicMeterPerHourToLitersPerSecond(q: number): number {\n return q * M3H_TO_LS;\n}\n\nexport function litersPerSecondToCubicMeterPerHour(q: number): number {\n return q / M3H_TO_LS;\n}\n\nexport function cubicMeterPerHourToUsGallonsPerMinute(q: number): number {\n return q * M3H_TO_USGPM;\n}\n\nexport function usGallonsPerMinuteToCubicMeterPerHour(q: number): number {\n return q / M3H_TO_USGPM;\n}\n\n// ─── Volume ───────────────────────────────────────────────────────────────────\n\nexport function litersToCubicMeters(l: number): number {\n return l / LITERS_PER_M3;\n}\n\nexport function cubicMetersToLiters(m3: number): number {\n return m3 * LITERS_PER_M3;\n}\n\nexport function cubicMetersToCubicFeet(m3: number): number {\n return m3 * FT3_PER_M3;\n}\n\nexport function cubicFeetToCubicMeters(ft3: number): number {\n return ft3 / FT3_PER_M3;\n}\n\nexport function cubicMetersToUsGallons(m3: number): number {\n return m3 * USGAL_PER_M3;\n}\n\nexport function usGallonsToCubicMeters(gal: number): number {\n return gal / USGAL_PER_M3;\n}\n\n// ─── Power ────────────────────────────────────────────────────────────────────\n\n/** Metric horsepower (cv, cavalo-vapor) to kilowatts. */\nexport function cvToKilowatts(cv: number): number {\n return cv * KW_PER_CV;\n}\n\nexport function kilowattsToCv(kw: number): number {\n return kw / KW_PER_CV;\n}\n\n/** Mechanical horsepower (hp) to kilowatts. */\nexport function hpToKilowatts(hp: number): number {\n return hp * KW_PER_HP;\n}\n\nexport function kilowattsToHp(kw: number): number {\n return kw / KW_PER_HP;\n}\n\n// ─── Display-unit dispatch ────────────────────────────────────────────────────\n\n/** Converts a canonical flow (m³/h) to `unit`. */\nexport function flowFromCanonical(m3h: number, unit: FlowUnits): number {\n if (unit === 'L/s') return cubicMeterPerHourToLitersPerSecond(m3h);\n if (unit === 'gpm') return cubicMeterPerHourToUsGallonsPerMinute(m3h);\n return m3h;\n}\n\n/** Converts a flow expressed in `unit` back to canonical m³/h. */\nexport function flowToCanonical(value: number, unit: FlowUnits): number {\n if (unit === 'L/s') return litersPerSecondToCubicMeterPerHour(value);\n if (unit === 'gpm') return usGallonsPerMinuteToCubicMeterPerHour(value);\n return value;\n}\n\n/** Converts a canonical power (kW) to `unit`. */\nexport function powerFromCanonical(kw: number, unit: PowerUnits): number {\n if (unit === 'cv') return kilowattsToCv(kw);\n if (unit === 'hp') return kilowattsToHp(kw);\n return kw;\n}\n\n/** Converts a power expressed in `unit` back to canonical kW. */\nexport function powerToCanonical(value: number, unit: PowerUnits): number {\n if (unit === 'cv') return cvToKilowatts(value);\n if (unit === 'hp') return hpToKilowatts(value);\n return value;\n}\n\n/** Converts a canonical volume (m³) to `unit`. */\nexport function volumeFromCanonical(m3: number, unit: VolumeUnits): number {\n if (unit === 'L') return cubicMetersToLiters(m3);\n if (unit === 'ft3') return cubicMetersToCubicFeet(m3);\n if (unit === 'gal') return cubicMetersToUsGallons(m3);\n return m3;\n}\n\n/** Converts a volume expressed in `unit` back to canonical m³. */\nexport function volumeToCanonical(value: number, unit: VolumeUnits): number {\n if (unit === 'L') return litersToCubicMeters(value);\n if (unit === 'ft3') return cubicFeetToCubicMeters(value);\n if (unit === 'gal') return usGallonsToCubicMeters(value);\n return value;\n}\n\n// ─── Transmissivity ───────────────────────────────────────────────────────────\n\nexport function squareMeterPerSecondToSquareMeterPerDay(t: number): number {\n return t * M2S_TO_M2D;\n}\n\nexport function squareMeterPerDayToSquareMeterPerSecond(t: number): number {\n return t / M2S_TO_M2D;\n}\n\n// ─── Coordinates ──────────────────────────────────────────────────────────────\n\n/**\n * Converts decimal degrees to DMS.\n * @param degrees - Signed decimal degrees (negative = S for lat, W for lng).\n * @param axis - 'lat' produces N/S; 'lng' produces E/W. Defaults to 'lat'.\n */\nexport function decimalDegreesToDms(\n degrees: number,\n axis: 'lat' | 'lng' = 'lat',\n): DmsCoordinate {\n const abs = Math.abs(degrees);\n const d = Math.floor(abs);\n const minFloat = (abs - d) * 60;\n const m = Math.floor(minFloat);\n const s = (minFloat - m) * 60;\n const direction =\n axis === 'lat' ? (degrees >= 0 ? 'N' : 'S') : degrees >= 0 ? 'E' : 'W';\n return { degrees: d, minutes: m, seconds: s, direction };\n}\n\n/** Converts DMS back to signed decimal degrees. */\nexport function dmsToDecimalDegrees(dms: DmsCoordinate): number {\n const abs = dms.degrees + dms.minutes / 60 + dms.seconds / 3600;\n return dms.direction === 'S' || dms.direction === 'W' ? -abs : abs;\n}\n\n// ─── Screen Slot ──────────────────────────────────────────────────────────────\n\n/** Converts a US slot number to millimeters (1 slot = 0.001 in = 0.0254 mm). */\nexport function slotNumberToMm(slotNumber: number): number {\n return slotNumber * SLOT_MM;\n}\n\n/** Converts millimeters to the nearest US slot number. */\nexport function mmToSlotNumber(mm: number): number {\n return Math.round(mm / SLOT_MM);\n}\n\n// ─── Pressure ─────────────────────────────────────────────────────────────────\n\nexport function kilopascalToPsi(kPa: number): number {\n return kPa * PSI_PER_KPA;\n}\n\nexport function psiToKilopascal(psi: number): number {\n return psi / PSI_PER_KPA;\n}\n\n// ─── Time ─────────────────────────────────────────────────────────────────────\n\nexport function minutesToHours(min: number): number {\n return min / 60;\n}\n\nexport function hoursToMinutes(h: number): number {\n return h * 60;\n}\n\n// ─── Water quality (since v2.3) ───────────────────────────────────────────────\n\n/** Concentration units accepted by {@link concentrationToCanonical}. */\nexport type ConcentrationUnits = 'mg/L' | 'ug/L' | 'ng/L' | 'g/L';\n\nconst MG_L_PER_UNIT: Record<ConcentrationUnits, number> = {\n 'g/L': 1_000,\n 'mg/L': 1,\n 'ug/L': 0.001,\n 'ng/L': 0.000_001,\n};\n\n/** Converts a mass concentration to the canonical mg/L. */\nexport function concentrationToCanonical(\n value: number,\n unit: ConcentrationUnits,\n): number {\n return value * MG_L_PER_UNIT[unit];\n}\n\n/** Converts a canonical mg/L concentration to `unit`. */\nexport function concentrationFromCanonical(\n mgL: number,\n unit: ConcentrationUnits,\n): number {\n return mgL / MG_L_PER_UNIT[unit];\n}\n\n/** Converts conductivity in mS/m to the canonical µS/cm (×10). */\nexport function milliSiemensPerMeterToMicroSiemensPerCm(mSm: number): number {\n return mSm * 10;\n}\n\n/** Converts conductivity in mS/cm to the canonical µS/cm (×1000). */\nexport function milliSiemensPerCmToMicroSiemensPerCm(mScm: number): number {\n return mScm * 1_000;\n}\n\n/**\n * Normalizes a regional color unit name to the canonical Hazen unit (`uH`).\n * mg Pt-Co/L, PCU, TCU and Hazen are numerically equal. Returns `undefined`\n * for unrecognized names.\n */\nexport function normalizeColorUnit(unit: string): 'uH' | undefined {\n const u = unit.trim().toLowerCase().replace(/\\s+/g, '');\n return ['uh', 'hazen', 'mgpt-co/l', 'mgpt/l', 'pt-co', 'pcu', 'tcu'].includes(\n u,\n )\n ? 'uH'\n : undefined;\n}\n\n/**\n * Maps a reported turbidity unit name to the `welldot` turbidity code.\n * uT and FTU (formazin, method unidentified) map to the generic `turbidity`.\n * Returns `undefined` for unrecognized names.\n */\nexport function turbidityCodeForUnit(\n unit: string,\n):\n | 'turbidity'\n | 'turbidity_ntu'\n | 'turbidity_fnu'\n | 'turbidity_fau'\n | undefined {\n switch (unit.trim().toUpperCase()) {\n case 'NTU':\n return 'turbidity_ntu';\n case 'FNU':\n return 'turbidity_fnu';\n case 'FAU':\n return 'turbidity_fau';\n case 'FTU':\n case 'UT':\n return 'turbidity';\n default:\n return undefined;\n }\n}\n\n/**\n * Converts an expanded uncertainty (as reported by labs, usually k = 2) to\n * the one-sigma `value_precision` stored in `.well` files.\n */\nexport function expandedToStandardUncertainty(\n expanded: number,\n coverageFactor = 2,\n): number {\n return expanded / coverageFactor;\n}\n"],"mappings":"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uB,SAAS,KAAK;AAAA,EACzD,EAAE,MAAM,KAAK,OAAO,uBAAuB,SAAS,KAAK;AAAA,EACzD,EAAE,MAAM,KAAK,OAAO,uBAAuB,SAAS,KAAK;AAAA,EACzD,EAAE,MAAM,KAAK,OAAO,uBAAuB,SAAS,KAAK;AAAA,EACzD,EAAE,MAAM,KAAK,OAAO,uBAAuB,SAAS,KAAK;AAAA,EACzD,EAAE,MAAM,KAAK,OAAO,uBAAuB,SAAS,KAAK;AAAA,EACzD,EAAE,MAAM,KAAK,OAAO,uBAAuB,SAAS,KAAK;AAAA,EACzD,EAAE,MAAM,KAAK,OAAO,uBAAuB,SAAS,KAAK;AAAA,EACzD,EAAE,MAAM,KAAK,OAAO,uBAAuB,SAAS,KAAK;AAAA,EACzD,EAAE,MAAM,KAAK,OAAO,uBAAuB,SAAS,KAAK;AAAA,EACzD,EAAE,MAAM,KAAK,OAAO,uBAAuB,SAAS,KAAK;AAAA,EACzD,EAAE,MAAM,KAAK,OAAO,uBAAuB,SAAS,KAAK;AAAA,EACzD,EAAE,MAAM,KAAK,OAAO,uBAAuB,SAAS,KAAK;AAAA,EACzD,EAAE,MAAM,KAAK,OAAO,uBAAuB,SAAS,KAAK;AAAA,EACzD,EAAE,MAAM,KAAK,OAAO,uBAAuB,SAAS,KAAK;AAAA,EACzD,EAAE,MAAM,KAAK,OAAO,uBAAuB,SAAS,KAAK;AAAA,EACzD,EAAE,MAAM,KAAK,OAAO,uBAAuB,SAAS,KAAK;AAAA,EACzD,EAAE,MAAM,KAAK,OAAO,uBAAuB,SAAS,KAAK;AAAA,EACzD,EAAE,MAAM,KAAK,OAAO,uBAAuB,SAAS,KAAK;AAAA,EACzD,EAAE,MAAM,KAAK,OAAO,uBAAuB,SAAS,KAAK;AAAA,EACzD,EAAE,MAAM,KAAK,OAAO,uBAAuB,SAAS,KAAK;AAAA,EACzD,EAAE,MAAM,KAAK,OAAO,uBAAuB,SAAS,KAAK;AAAA,EACzD,EAAE,MAAM,KAAK,OAAO,uBAAuB,SAAS,KAAK;AAAA,EACzD,EAAE,MAAM,KAAK,OAAO,uBAAuB,SAAS,KAAK;AAAA,EACzD,EAAE,MAAM,KAAK,OAAO,uBAAuB,SAAS,KAAK;AAAA,EACzD,EAAE,MAAM,KAAK,OAAO,uBAA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","names":[]}